ZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGggYi8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzM4MGQKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0idGFyZ2V0L2NsYXNzZXMiIHBhdGg9InNyYy9tYWluL2phdmEiPgorCQk8YXR0cmlidXRlcz4KKwkJCTxhdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+CisJCQk8YXR0cmlidXRlIG5hbWU9Im1hdmVuLnBvbWRlcml2ZWQiIHZhbHVlPSJ0cnVlIi8+CisJCTwvYXR0cmlidXRlcz4KKwk8L2NsYXNzcGF0aGVudHJ5PgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy9nZW5lcmF0ZWQvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy90ZXN0L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvbWFpbi9yZXNvdXJjZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkgZXhjbHVkaW5nPSIqKiIga2luZD0ic3JjIiBvdXRwdXQ9InRhcmdldC90ZXN0LWNsYXNzZXMiIHBhdGg9InNyYy90ZXN0L3Jlc291cmNlcyI+CisJCTxhdHRyaWJ1dGVzPgorCQkJPGF0dHJpYnV0ZSBuYW1lPSJtYXZlbi5wb21kZXJpdmVkIiB2YWx1ZT0idHJ1ZSIvPgorCQk8L2F0dHJpYnV0ZXM+CisJPC9jbGFzc3BhdGhlbnRyeT4KKwk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UubTJlLk1BVkVOMl9DTEFTU1BBVEhfQ09OVEFJTkVSIj4KKwkJPGF0dHJpYnV0ZXM+CisJCQk8YXR0cmlidXRlIG5hbWU9Im1hdmVuLnBvbWRlcml2ZWQiIHZhbHVlPSJ0cnVlIi8+CisJCTwvYXR0cmlidXRlcz4KKwk8L2NsYXNzcGF0aGVudHJ5PgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuNyI+CisJCTxhdHRyaWJ1dGVzPgorCQkJPGF0dHJpYnV0ZSBuYW1lPSJtYXZlbi5wb21kZXJpdmVkIiB2YWx1ZT0idHJ1ZSIvPgorCQk8L2F0dHJpYnV0ZXM+CisJPC9jbGFzc3BhdGhlbnRyeT4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8uY2xhc3NwYXRoLWxpbnV4IGIvLmNsYXNzcGF0aC1saW51eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUwMjNjCi0tLSAvZGV2L251bGwKKysrIGIvLmNsYXNzcGF0aC1saW51eApAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL21haW4vamF2YSIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvdGVzdC9qYXZhIi8+CisgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwubGF1bmNoaW5nLm1hY29zeC5NYWNPU1hUeXBlL0pWTSAxLjYiLz4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2FudC0xLjYuNS5qYXIiLz4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2JzaC0yLjBiNC5qYXIiLz4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2d1aWNlLTIuMC5qYXIiLz4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliL2p1bml0LTMuOC4xLmphciIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ6X2J1aWxkIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLy5jbGFzc3BhdGgtbWFjIGIvLmNsYXNzcGF0aC1tYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1MDIzYwotLS0gL2Rldi9udWxsCisrKyBiLy5jbGFzc3BhdGgtbWFjCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvbWFpbi9qYXZhIi8+CisgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy90ZXN0L2phdmEiLz4KKyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5sYXVuY2hpbmcubWFjb3N4Lk1hY09TWFR5cGUvSlZNIDEuNiIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvYW50LTEuNi41LmphciIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvYnNoLTIuMGI0LmphciIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvZ3VpY2UtMi4wLmphciIvPgorICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvanVuaXQtMy44LjEuamFyIi8+CisgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InpfYnVpbGQiLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZGYwMgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyNyBAQAorLmFudC10YXJnZXRzKgorLmNsYXNzcGF0aAorLmdpdGlnbm9yZQorLmdyYWRsZQorLmlkZWEKKy5wcm9qZWN0Cisuc2V0dGluZ3MKKy9fZWNsaXBzZS8KKy9sb2NhbC5wcm9wZXJ0aWVzCitURVNUTkctKgorYnVpbGQKK2VjbGlwc2UtYnVpbGQKK2dyYWRsZS5wcm9wZXJ0aWVzCitpdnkqCitqYXZhZG9jcwora29iYWx0QnVpbGQKK2xpYgorbWF2ZW4tdGVzdG5nLXBsdWdpbi0xLjIuamFyCituYi1jb25maWd1cmF0aW9uLnhtbAorb3V0CitzcmMvZ2VuZXJhdGVkCitzcmMvdGVzdC9qYXZhL3Rlc3QvaWdub3JlCit0YXJnZXQKK3Rlc3Qtb3V0cHV0Cit0ZXN0LW91dHB1dC10ZXN0cwordGVzdG5nLmltbAorel9idWlsZApkaWZmIC0tZ2l0IGEvLm1haWxtYXAgYi8ubWFpbG1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU4ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvLm1haWxtYXAKQEAgLTAsMCArMSwxMyBAQAorQWJyYWhhbSBMaW4gPGdpdGh1Yi5hdG9taWNrbmlnaHRAeG94eS5uZXQ+IDxhYnJhaGFtLmxpbkBwb3N0LmhhcnZhcmQuZWR1PgorQ8OpZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4gPGNiZXVzdEAxYThiMGZjOC05NTE5LTA0MTAtYWVlYy1hZmQ4ZmQ3NzI5Y2Y+CitDw6lkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPiA8YmV1c3RAeWFob28taW5jLmNvbT4KK0PDqWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+IDxjYmV1c3RAbGlua2VkaW4uY29tPgorQ8OpZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4gPGNlZHJpY0BiZXVzdC5jb20+CitDw6lkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPiA8Y2VkcmljQGNvbG9yLmNvbT4KK0PDqWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+IDxjZWRyaWNAY29sb3IuY29tPgorQ8OpZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4gPGNlZHJpY0ByZWZyZXNoLmlvPgorSm9zZSBEaWxsZXQgPGpvc2UuZGlsbGV0QGdtYWlsLmNvbT4gPGpkaWxsZXRAYWRhPgorSnVsaWVuIEhlcnIgPGp1bGllbkBoZXJyLmZyPiA8anVsaWVuLmhlcnJAYWxjYXRlbC1sdWNlbnQuY29tPgorS29uc3RhbnRpbiBTYXZpbiA8a29uc3RhbnRpbi5hLnNhdmluQGdtYWlsLmNvbT4KK1RpbSB3dSA8d3V0aW5nYnVwdEBnbWFpbC5jb20+CitUb23DoXMgUG9sbGFrIDx0cG9sbGFrLmFyQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMTEwOAotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnRlc3RuZzwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8udHJhdmlzLnltbCBiLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODU4YTUKLS0tIC9kZXYvbnVsbAorKysgYi8udHJhdmlzLnltbApAQCAtMCwwICsxLDEyIEBACitsYW5ndWFnZTogamF2YQoramRrOgorICAtIG9yYWNsZWpkazgKKyAgLSBvcmFjbGVqZGs3CisgIC0gb3BlbmpkazcKKworI2JlZm9yZV9pbnN0YWxsOiBiYXNoICJncmFkbGUvdXBsb2FkU25hcHNob3Quc2giCitzY3JpcHQ6CisgIC0gLi9ncmFkbGV3IGNsZWFuIHRlc3QKKyAgLSAuL3RyYXZpcy5zaAorYWZ0ZXJfc3VjY2VzczogdGVzdCAiJHtUUkFWSVNfUFVMTF9SRVFVRVNUfSIgPT0gImZhbHNlIiAmJiB0ZXN0ICIke1RSQVZJU19KREtfVkVSU0lPTn0iID09ICJvcmFjbGVqZGs3IiAmJiAuL2dyYWRsZXcgdXBsb2FkQXJjaGl2ZXMKKwpkaWZmIC0tZ2l0IGEvQU5OT1VOQ0VNRU5ULnR4dCBiL0FOTk9VTkNFTUVOVC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiMjIyMgotLS0gL2Rldi9udWxsCisrKyBiL0FOTk9VTkNFTUVOVC50eHQKQEAgLTAsMCArMSwxMTAgQEAKK2phdmFsb2JieS5vcmcKK3Rlc3Rkcml2ZW4uY29tCitvcGVuc291cmNldGVzdGluZy5vcmcKK2h0dHA6Ly9zYWxvb24uamF2YXJhbmNoLmNvbS9jZ2ktYmluL3ViYi91bHRpbWF0ZWJiLmNnaT91YmI9Zm9ydW0mZj02OAoramF2YS5uZXQKK2NvbXAubGFuZy5qYXZhLnByb2dyYW1tZXIKKworPT09PT09PT09PQorCitUaGUgVGVzdE5HIHRlYW0gaXMgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGltbWVkaWF0ZSBhdmFpbGFiaWxpdHkgb2YgVGVzdE5HIDQuNS4gCisKK1RoaXMgcmVsZWFzZSBjb250YWlucyBhIGxvdCBvZiBidWcgZml4ZXMgYW5kIGEgZmV3IG5ldyBmZWF0dXJlcy4gIEl0IGFsc28gCitpbmNsdWRlcyB0aGUgZmlyc3QgcGhhc2Ugb2YgRGlzdHJpYnV0ZWQgVGVzdE5HLCBhIHdvcmsgaW4gcHJvZ3Jlc3MgZGVzaWduZWQgCit0byB0cmFuc3BhcmVudGx5IGRpc3RyaWJ1dGUgdGVzdHMgb24gbWFueSBtYWNoaW5lcyBhbmQgY29sbGVjdCB0aGVpciByZXN1bHRzLgorCitBbm5vdW5jZW1lbnQ6CisKK2h0dHA6Ly9iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDM2MS5odG1sCisKK0RldGFpbHMgb24gRGlzdHJpYnV0ZWQgVGVzdE5HOiAgCisKK2h0dHA6Ly9iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDM2Mi5odG1sCisKKworPT09PT09PT09PQorCitUaGUgVGVzdE5HIHRlYW0gaXMgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGltbWVkaWF0ZSBhdmFpbGFiaWxpdHkgb2YgVGVzdE5HIDQuMCwgd2l0aCBhIGxvdCBvZiBpbXByb3ZlbWVudHMgYW5kIG5ldyBmZWF0dXJlcy4KKworVGhlIGFubm91bmNlbWVudCwgYWxvbmcgd2l0aCBhIGZldyBleGFtcGxlcyBhbmQgc3VtbWFyeSBvZiB0aGUgbmV3IGZlYXR1cmVzLCBjYW4gYmUgZm91bmQgaGVyZToKKworICAgIGh0dHA6Ly90aW55dXJsLmNvbS9keGxiaAorCistLSAKK0PpZHJpYworaHR0cDovL3Rlc3RuZy5vcmcKKworPT09PT09PT09PT09PT09PQorCitBbm5vdW5jaW5nIFRlc3RORyAyLjMKKworVGhlIFRlc3RORyB0ZWFtIGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YgVGVzdE5HIDIuMy4KKworVGhlIHZlcnNpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nIGFzIHdlbGwgYXMgdGhlIG5ldyBkb2N1bWVudGF0aW9uLCB3aGljaCBoYXMgYmVlbiBjb25zaWRlcmFibHkgaW1wcm92ZWQgKGhpZ2hsaWdodGVkIGNvZGUgc25pcHBldHMsIGRldGFpbGVkIERURCwgYW50IHRhc2sgYW5kIGRlc2NyaXB0aW9uIG9mIGFsbCB0aGUgbmV3IGZlYXR1cmVzKS4KKworV2hhdCdzIG5ldzoKKworICAgICogYmVmb3JlU3VpdGUsIGFmdGVyU3VpdGUsIGJlZm9yZVRlc3QsIGFmdGVyVGVzdAorICAgICogUmV2YW1wZWQgYW50IHRhc2sgd2l0aCBoYWx0b25mYWlsdXJlIGFuZCBvdGhlciBoZWxwZnVsIGZsYWdzCisgICAgKiBCZXR0ZXIgc3RhY2sgdHJhY2VzIGFuZCBpbXByb3ZlZCBsZXZlbCBjb250cm9sIGZvciB2ZXJib3NpdHkKKyAgICAqIEJldHRlciBzeW50YXggZm9yIGluY2x1ZGluZyBhbmQgZXhjbHVkaW5nIG1ldGhvZHMgaW4gdGVzdG5nLnhtbAorICAgICogVGVzdCBjbGFzc2VzIGNhbiBiZSBpbnZva2VkIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAqIC4uLiBhbmQgbWFueSBidWcgZml4ZXMuCisKK0ZvciBFY2xpcHNlIHVzZXJzLCBhIG5ldyB2ZXJzaW9uICgxLjEuMSkgb2YgdGhlIEVjbGlwc2UgcGx1Zy1pbiB0aGF0IGluY2x1ZGVzIHRoaXMgbmV3IFRlc3RORyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgcmVtb3RlIHVwZGF0ZSBzaXRlIG9yIGZvciBkaXJlY3QgZG93bmxvYWQuCisKK0Fsc28sIFRlc3RORyBoYXMgam9pbmVkIE9wZW5TeW1waG9ueSAoYmlnIHRoYW5rcyB0byBQYXRyaWNrIGFuZCBIYW5pIGZvciBzZXR0aW5nIHRoaXMgdXApLiAgQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIG1vdmUsIHRoZXJlIGlzIG5vdyBhIFRlc3RORyB1c2VycyBmb3J1bSBhcyB3ZWxsIGFzIGEgV2lraSBhbmQgSklSQSBmb3IgaXNzdWUgdHJhY2tpbmcuCisKK1RoZSB1c2VycyBtYWlsaW5nLWxpc3QgaGFzIGJlZW4gbW92ZWQgdG8gR29vZ2xlIEdyb3VwcyBhbmQgaXMgY29ubmVjdGVkIHRvIHRoZSBmb3J1bSwgc28geW91IG9ubHkgbmVlZCB0byBzdWJzY3JpYmUgdG8gb25lLgorCitUcnkgaXQgYW5kIGxldCB1cyBrbm93IHdoYXQgeW91IHRoaW5rIQorCis9PT0KKworSSBhbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgYXZhaWxhYmlsaXR5IG9mIFRlc3RORyAyLjEgKGh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nKS4gIAorCitUZXN0TkcgaXMgYSB0ZXN0aW5nIGZyYW1ld29yayBpbnNwaXJlZCBmcm9tIEpVbml0IGFuZCBOVW5pdCBidXQgaW50cm9kdWNpbmcgc29tZSBuZXcgZnVuY3Rpb25hbGl0aWVzIHRoYXQgbWFrZSBpdCBtb3JlIHBvd2VyZnVsIGFuZCBlYXNpZXIgdG8gdXNlLCBzdWNoIGFzOgorCisgICAgKiBKU1IgMTc1IEFubm90YXRpb25zIChKREsgMS40IGlzIGFsc28gc3VwcG9ydGVkIHdpdGggSmF2YURvYyBhbm5vdGF0aW9ucykuCisgICAgKiBGbGV4aWJsZSB0ZXN0IGNvbmZpZ3VyYXRpb24uCisgICAgKiBEZWZhdWx0IEpESyBmdW5jdGlvbnMgZm9yIHJ1bnRpbWUgYW5kIGxvZ2dpbmcgKG5vIGRlcGVuZGVuY2llcykuCisgICAgKiBQb3dlcmZ1bCBleGVjdXRpb24gbW9kZWwgKG5vIG1vcmUgVGVzdFN1aXRlKS4KKyAgICAqIFN1cHBvcnRzIGRlcGVuZGVudCBtZXRob2RzLgorCitTb21lIG9mIHRoZSBuZXcgZmVhdHVyZXMgaW4gdGhpcyB2ZXJzaW9uIGluY2x1ZGU6CisKKyAgICAqIGludm9jYXRpb25Db3VudCBhbmQgc3VjY2Vzc1BlcmNlbnRhZ2UsIHdoaWNoIEkgZGVzY3JpYmVkIGluIGEgcHJldmlvdXMgZW50cnkgKGh0dHA6Ly9iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDIzNi5odG1sKSwgYW5kIHdoaWNoIGFsbG93IHlvdSB0byBpbnZva2UgYSB0ZXN0IG1ldGhvZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHRpbWVzIHdoaWxlIGFsbG93aW5nIHNvbWUgb2YgdGhlc2UgaW52b2NhdGlvbnMgdG8gZmFpbC4gIElmIHRoZSBudW1iZXIgb2YgZmFpbHVyZXMgaXMgdW5kZXIgYSBjZXJ0YWluIHRocmVzaG9sZCwgdGhlIHRlc3QgaXMgc3RpbGwgY29uc2lkZXJlZCBhIHN1Y2Nlc3MuCisgICAgICAgCisgICAgKiB0aW1lT3V0IGlzIG5vdyBhcHBsaWNhYmxlIHRvIGFsbCB0ZXN0IG1ldGhvZHMuICBXaGV0aGVyIHlvdSBhcmUgcnVubmluZyB5b3VyIHRlc3RzIGluIHBhcmFsbGVsIG9yIG5vdCwgeW91IGNhbiBzcGVjaWZ5IGEgdGltZS1vdXQgZm9yIHlvdXIgdGVzdCBtZXRob2QgYW5kIGlmIGl0IGZhaWxzIHRvIGNvbXBsZXRlIHdpdGhpbiB0aGUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUsIFRlc3RORyB3aWxsIG1hcmsgaXQgYXMgYSBmYWlsdXJlLgorICAgICAgIAorICAgICogZGVwZW5kc09uTWV0aG9kcyB3YXMgdGhlIG1vc3QgcmVxdWVzdGVkIGZlYXR1cmUuICBZb3UgY2FuIG5vdyBzcGVjaWZ5IGRlcGVuZGVuY2llcyBvbiBhIG1ldGhvZC1iYXNlZCBiYXNpcyAobm8gbmVlZCB0byBzcGVjaWZ5IGEgZ3JvdXAgaWYgeW91ciBkZXBlbmRlbmN5IGdyYXBoIGlzIHNpbXBsZSkuICBZb3UgY2FuIGV2ZW4gbWl4IGRlcGVuZHNPbk1ldGhvZHMgYW5kIGRlcGVuZHNPbkdyb3Vwcy4KKyAgICAgICAKKyAgICAqIC4uLiBhbmQgb2YgY291cnNlLCBudW1lcm91cyBidWcgZml4ZXMgYW5kIG90aGVyIGFkZGl0aW9ucy4KKworQSBzcGVjaWFsIHRoYW5rcyB0byBBbGV4YW5kcnUgUG9wZXNjdSB3aG8gaGFzIHB1bGxlZCBhbGwtbmlnaHRlcnMgdG8gbWFrZSB0aGlzIHJlbGVhc2UgaGFwcGVuIQorCitXZSBoYXZlIGFuIGV4Y2l0aW5nIGxpc3Qgb2YgbmV3IGZlYXR1cmVzIGxpbmVkIHVwIGZvciBvdXIgbmV4dCB2ZXJzaW9uLCBhbW9uZyB3aGljaCBhIHBsdWctaW4gQVBJLCBidXQgaW4gdGhlIG1lYW50aW1lLCBlbmpveSBUZXN0TkcgMi4xLgorCis9PT09PT0KKworQW5ub3VuY2luZyBUZXN0TkcgZm9yIEVjbGlwc2UKKworVGhlIFRlc3RORyB0ZWFtIGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIHRoZSBUZXN0TkcgcGx1Zy1pbiBmb3IgRWNsaXBzZS4KKworaHR0cDovL2JldXN0LmNvbS90ZXN0bmcKKworVGhpcyBmaXJzdCByZWxlYXNlIGNvdmVycyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIG9mIFRlc3RORywgYW1vbmcgd2hpY2g6CisKKyAgICAqIE11bHRpcGxlIHdheXMgdG8gbGF1bmNoIHRlc3RzIChmcm9tIGEgbWV0aG9kLCBmcm9tIGEgY2xhc3MsIGdyb3VwcyBvciBhbiBlbnRpcmUgc3VpdGUpLgorICAgICogQ29udmVuaWVudCByZXBvcnQgdmlldyB0aGF0IGxldHMgeW91IGRpcmVjdGx5IGp1bXAgdG8gZmFpbGVkIHRlc3RzLgorCitBIG1vcmUgZGV0YWlsZWQgb3ZlcnZpZXcgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly9iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDI2MS5odG1sCisKK2FuZCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgc25hcHNob3RzIGhlcmU6CisKK2h0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL21haW4uaHRtbCNlY2xpcHNlCisKKy0tIAorQ2VkcmljCmRpZmYgLS1naXQgYS9DSEFOR0VTLnR4dCBiL0NIQU5HRVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzU4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTLnR4dApAQCAtMCwwICsxLDEyNTkgQEAKK++7v0N1cnJlbnQKK0ZpeGVkOiBHSVRIVUItODQxOiB0ZXN0TmFtZSBmcm9tIEBUZXN0IGlzIG5vdyB1c2VkIGFuZCBhdmFpbGFibGUgZnJvbSBJVGVzdFJlc3VsdCNnZXROYW1lKCkgYW5kIElUZXN0UmVzdWx0I2dldFRlc3ROYW1lKCkgKEp1bGllbiBIZXJyKQorTmV3OiBHSVRIVUItNzc2OiBBZGQgQmVmb3JlQ2xhc3MvQWZ0ZXJDbGFzcyBsaWtlIG9uIElUZXN0TGlzdGVuZXIgKEB2Z3VuYSAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi04NzI6IEVuYWJsZSBlbmQtdXNlcnMgb2YgVGVzdE5HIHRvIGFsdGVyIFhtbFN1aXRlIGFuZCBYbWxUZXN0IChLcmlzaG5hbiBNYWhhZGV2YW4pCitOZXc6IEdJVEhVQi05MDA6IFN1cHBvcnQgQExpc3RlbmVycyBpbiBhbm5vdGF0aW9uIHRyYW5zZm9ybWVyIChKdWxpZW4gSGVycikKK05ldzogR0lUSFVCLTg5ODogQWN0aXZhdGUgWE1MIHZhbGlkYXRpb24gd2hlbiBwb3NzaWJsZSAoSnVsaWVuIEhlcnIpCitGaXhlZDogR0lUSFVCLTg4OTogWG1sU3VpdGUgaW4gbmVzdGVkIGRpcmVjdG9yaWVzIHJlc3VsdHMgaW4gRklsZU5vdEZvdW5kRXhjZXB0aW9uIChWaXJlbmRlciBTaW5naCkKK0ZpeGVkOiBHSVRIVUItODExOiBUaW1lb3V0IGlzIG5vdCB3b3JraW5nIHdpdGggcGFyYWxsZWw9dGVzdHMgKEBtaWNoYWVsLXl4ZiAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi04Mzk6IE1pc3NpbmcgZW5jb2RpbmcgbWV0YSBkYXRhIGZvciByZXBvcnQgZmlsZSAoQGJhbmJxICYgSnVsaWVuIEhlcnIpCitGaXhlZDogR0lUSFVCLTg3NjogTnVsbFBvaW50ZXJFeGNlcHRpb24gY3JlYXRpbmcgdGVzdHMgd2l0aCBwYXJhbWV0ZXJzIGJ5IGEgZmFjdG9yeSAoQHZpeGdlbyAmIEp1bGllbiBIZXJyKQorTmV3OiBHSVRIVUItODg2OiBBZGQgc29tZSBjaGVja3Mgb24gZmFjdG9yeSBtZXRob2RzIChKdWxpZW4gSGVycikKK05ldzogR0lUSFVCLTg3NCAvIEdJVEhVQi04NzUgLyBHSVRIVUItODgyIC8gR0lUSFVCLTg1MCA6IFNvbWUgY29kZSBjbGVhbnVwIChUZXN0byBOYWthZGEpCitGaXhlZDogR0lUSFVCLTg2NiAvIEdJVEhVQi04NjkgOiBTb21lIGF0dHJpYnV0ZXMgd2VyZSBub3QgY2xvbmVkIHdoZW4gWG1sU3VpdGUjY2xvbmUgd2FzIHVzZWQgKFZpcmVuZGVyIFNpbmdoKQorRml4ZWQ6IEdJVEhVQi04NDI6IEFkZCBUZXN0UmVzdWx0I2dldFRlc3ROYW1lKCkgc3VwcG9ydCBmb3IgQFRlc3QodGVzdE5hbWUpIChKdWxpZW4gSGVycikKKworNi45Ljk6CisyMDE1LzEwLzI3CisKK0ZpeGVkOiBHSVRIVUItODI5OiBBbGxvd2luZyBzdWl0ZXMgdG8gaGF2ZSBkdXBsaWNhdGUgbmFtZXMuIFlvdSBjYW4gbm93IGNvbmZpZ3VyZSB0aGUgc2FtZSBzdWl0ZS1maWxlIHRvIHJ1biBtdWx0aXBsZSB0aW1lcy4gKEVkdWFyZG8gQm9ybikKK0ZpeGVkOiBHSVRIVUItODM0OiBuZXN0ZWQgc3VpdGVzIG5vdCBzdXBwb3J0ZWQgYnkgJ3Rlc3RuYW1lcycgKFRpYm9yIERpZ2FuYSAmIEp1bGllbiBIZXJyKQorCis2LjkuODoKKzIwMTUvMTAvMTIKKworUmVwbGFjZSA2LjkuNyB0aGF0IHdhcyBidWlsZCB3aXRoIEphdmE4IGJ5IGVycm9yLgorCis2LjkuNzoKK05vIG9mZmljaWFsIHJlbGVhc2UKKworRml4ZWQ6IEdJVEhVQi03OTg6IFNldCBzdWl0ZXRocmVhZHBvb2xzaXplIGZvciBNYXZlbiBTdXJlZmlyZSAoSmFuIER1bmTDocSNZWspCitGaXhlZDogR0lUSFVCLTE3MTogSVN1aXRlTGlzdGVuZXIgbWV0aG9kcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaWYgbXVsdGlwbGUgdGVzdCBlbGVtZW50cyAoRGFuaWVsIFFpYW4gJiBKdWxpZW4gSGVycikKK0ZpeGVkOiBHSVRIVUItMTY5OiBJSW52b2tlZE1ldGhvZExpc3RlbmVyIG1ldGhvZHMgZXhlY3V0ZWQgc2V2ZXJhbCB0aW1lcyBiZWZvcmUvYWZ0ZXIgZWFjaCB0ZXN0IG1ldGhvZCAoTWFyaW8gRHVhcnRlICYgSnVsaWVuIEhlcnIpCitGaXhlZDogR0lUSFVCLTE1NDogTWV0aG9kSW50ZXJjZXB0b3Igd2lsbCBiZSBjYWxsZWQgdHdpY2UgKFRpbSB3dSAmIEp1bGllbiBIZXJyKQorCis2LjkuNjoKKzIwMTUvMDcvMTUKKworTmV3OiBHSVRIVUItNzE3OiBBZGQgYXNzZXJ0VGhyb3dzIGFuZCBleHBlY3RUaHJvd3MgKFJ5YW4gU2NobWl0dCkKK0ZpeGVkOiBHSVRIVUItNzU1OiBGaXhlZCByZXBvcnRpbmcgb2YgcmV0cmllZCB0ZXN0cyAoUnlhbiBTY2htaXR0KQorRml4ZWQ6IEdJVEhVQi03NzM6IFRlc3Qgc2hvdWxkIG5vdCBiZSBza2lwcGVkIHdoZW4gdGhlIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCAoQENhbmR5TGl1TSAmIEp1bGllbiBIZXJyKQorCis2LjkuNToKKzIwMTUvMDcvMTIKKworRml4ZWQ6IFRoZSBTZXJ2aWNlTG9hZGVyVGVzdCBvbiBXaW5kb3dzIChNYXRoaWV1IFNlYmlyZSkKK0ZpeGVkOiBHSVRIVUItNjkxOiBGaXggY2xhc3Nsb2FkaW5nIGlzc3VlIHdoZW4gdXNpbmcgVGVzdE5HIDYuOS40IGFuZCBKTW9ja2l0LiAoTWF0aGlldSBTZWJpcmUpCitGaXhlZDogR0lUSFVCLTY4NjogSUFubm90YXRpb25UcmFuc2Zvcm1lci50cmFuc2Zvcm0gaXMgY2FsbGVkIGZvciBtZXRob2RzIHdpdGggdGVzdENsYXNzIHBvcHVsYXRlZC4gKMWBdWthc3ogUmVrdWNraSAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi00MjA6IEJlZm9yZS9BZnRlclN1aXRlIG1ldGhvZHMgbWF5IG5vdCBydW4sIHdoZW4gdXNlIGluaGVyaXRhbmNlLCBhbmQgZW5hYmxlZD1mYWxzZSAoSmFrdWIgVG9rYWogJiBKdWxpZW4gSGVycikKK0ZpeGVkOiBHSVRIVUItNjk3OiBNYWtlIGFkZEZhaWxlZEludm9jYXRpb25OdW1iZXIgdGhyZWFkLXNhZmUgKFJ5YW4gU2NobWl0dCkKK0ZpeGVkOiBHSVRIVUItNjk4OiBGaXggZXhpdCBjb2RlIHJlcG9ydGluZyB3aGVuIElSZXRyeUFuYWx5emVyIGlzIHVzZWQgKFJ5YW4gU2NobWl0dCkKK0ZpeGVkOiBHSVRIVUItNDY1OiBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbiwgQ29sbGVjdGlvbikgcHJpbnRzICJudWxsIiB3aGVuIGNvbGxlY3Rpb25zIGFyZSBkaWZmZXJlbnQgc2l6ZXMgKE1pY2hhZWwgRGlhbW9uZCkKK05ldzogR0lUSFVCLTcxMDogQXBwVmV5b3IgaXMgdXNlZCBmb3IgY29udGludW91cyBpbnRlZ3JhdGlvbiBvbiBXaW5kb3dzIChKdWxpZW4gSGVycikKK0ZpeGVkOiBHSVRIVUItNTk5OiBJSG9va2FibGUgaWdub3JlZCB3aGVuIGEgdGltZW91dCBpcyBzZXQgKEByeWFubGV2ZWxsICYgSnVsaWVuIEhlcnIpCitOZXc6IEdJVEhVQi03MjM6IEFsbG93IHVzZXJzIHRvIGFkZCB0aGVpciBvd24gc3VpdGUgcGFyc2VyIChKdWxpZW4gSGVycikKK0ZpeGVkOiBBbGxvdyAnLXRlc3RuYW1lcycgb3B0aW9uIHRvIHdvcmsgd2l0aCAnLXhtbHBhdGhpbmphcicgKEBlYXJ0aGxpbmcpCitGaXhlZDogR0lUSFVCLTczOTogVGVzdE5HIHNraXBzIGFsbCB0ZXN0IGNsYXNzZXMgZnJvbSBzdWl0ZSB3aGVuIGEgQEJlZm9yZUNsYXNzIGZhaWxzIChQcml5YW5zaHUgU2hla2hhciAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi00NzE6IElmIEBiZWZvcmVNZXRob2Qgb3IgQGFmdGVyTWV0aG9kIGZhaWxzIHRoZW4gYWxsIGNoaWxkcmVuIG9mIHRoZSBzYW1lIGJhc2UgY2xhc3Mgd2lsbCBiZSBza2lwcGVkIChBbnRvbiBQYW5mZXJvdiAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi01OTU6IHRlc3RuZyBoYW5nIGF0IHN3aXRjaGluZyB0ZXN0IGNhc2VzIHdoZW4gcnVubmluZyB0ZXN0IGNhc2VzIHdpdGggaGlnaCB0aHJlYWQgY291bnQgKHZpdDByZykKKworRWNsaXBzZToKKworRml4ZWQ6IFRoZSA1NyUgZnJlZXplIGJ1ZyAoUGF0cmljayBIZW5zbGV5IGFuZCBAZGVueXNrYSkKKworNi45LjQ6CisyMDE1LzA1LzA5CisKK0FkZGVkOiBHSVRIVUItNjMxOiBBdm9pZCB0aGUgc3RhdGljIGxpbWl0YXRpb24gb2YgZXh0ZXJuYWwgRGF0YVByb3ZpZGVyLiAoSnVsaWVuIEhlcnIpCitBZGRlZDogR0lUSFVCLTYzMTogQWxsb3cgdG8gdXNlIEd1aWNlIGluamVjdGlvbiBpbiBEYXRhUHJvdmlkZXIuIChKdWxpZW4gSGVycikKK0FkZGVkOiBEcm9wIHN1cHBvcnQgb2YgSmF2YTYgYW5kIHByZXZpb3VzLgorQWRkZWQ6IEdJVEhVQi02MTc6IEFsbG93IGluamVjdGlvbiBvZiBvcmcudGVzdG5nLklUZXN0Q29udGV4dCBpbnRvIHRoZSBndWljZSBwYXJlbnQgbW9kdWxlLiAoSnVsaWVuIEhlcnIpCitGaXhlZDogR0lUSFVCLTYwNjogUmV0cnlBbmFseXplciBsb29wcyBlbmRsZXNzbHkuIChLcmlzaG5hbiBNYWhhZGV2YW4pCitGaXhlZDogR0lUSFVCLTYxODogU3RhcnQgVGVzdE5HIGZyb20gamFyIGNhdXNlIHJlY3Vyc2l2ZSBydW4gb2YgdGVzdHMgZnJvbSBwYWNrYWdlcyBpbiBTdWl0ZSBYTUwgd2l0aG91dCAiLioiIG9uIHRoZSBlbmQgKFN0YXMgR3JvbW92KQorRml4ZWQ6IEdJVEhVQi02Mzk6IFR5cG8gb24gcHJlc2VydmVPcmRlciAodGFiZWktayAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi02MzI6IFR5cG8gaW4gZG9jIChQw6l0dXIgSW5naSBFZ2lsc3NvbiAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi02Mjk6IEludm9rZWRNZXRob2QgZG9lc24ndCByZWNvZ25pemUgY29uZmlndXJhdGlvbiBtZXRob2QgKEphbiBNZXdlcyAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi02MTU6IFhtbFN1aXRlLCBYbWxUZXN0OiBUaW1lLW91dCB0YWcgbm90IHByZXNlcnZlZCAoanBob2xsaW5nd29ydGggJiBKdWxpZW4gSGVycikKK05ldzogR0lUSFVCLTYzODogVHJhdmlzIENJIGlzIHVzZWQgZm9yIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKEp1bGllbiBIZXJyKQorTmV3OiBHSVRIVUItNjQ3OiBTb25hclF1YmUgaXMgdXNlZCB0byBmb2xsb3cgdGVjaG5pY2FsIGRlYnQgKEp1bGllbiBIZXJyKQorQWRkZWQ6IEdJVEhVQi02MTY6IG9yZy50ZXN0bmcuaW50ZXJuYWwuVmVyc2lvbiB3aWxsIGJlIGFsd2F5cyB1cC10by1kYXRlIChKdWxpZW4gSGVycikKK0ZpeGVkOiBHSVRIVUItNjM0OiBSZXZpZXcgb2YgdGhlIGNvbGxlY3Rpb25zIHBhY2thZ2UgKEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi02MjQ6IEZpeGVkIGZhaWx1cmUvZXJyb3IgaW52ZXJzaW9uIGluIEpVbml0UmVwb3J0UmVwb3J0ZXIgKEplcm9tZSBKYWNvYikKK0ZpeGVkOiBHSVRIVUItNTQ1OiBUZXN0TkcgcnVubmluZyBKVW5pdCB0ZXN0cyBidXQgbm90IHJlcG9ydGluZyBhbGwgcmVzdWx0cyBmb3IgcGFyYW1ldGVyaXplZCB0ZXN0cyAoSm9uYXRoYW4gTGVpdHNjaHVoICYgamRpbGxldCkKK0ZpeGVkOiBHSVRIVUItNjEwOiBDdXN0b21pemVkU3VpdGVzIG11c3QgYmUgc2F2ZWQgdXNpbmcgdXRmLTggZW5jb2RpbmcgKEp1aGEgSGVsam9yYW50YSkKK0ZpeGVkOiBHSVRIVUItNjAyOiBOb0NsYXNzRGVmRm91bmRFcnJvciBpbiBUZXN0TkdDbGFzc0ZpbmRlci48aW5pdD4gKGFhbm5vKQorRml4ZWQ6IEdJVEhVQi01Mjk6IENsb3NlIElucHV0U3RyZWFtIGFuZCBPdXB1dFN0cmVhbSBhZnRlciB1c2UgKEFuZHJldyBHYXVsKQorRml4ZWQ6IEdJVEhVQi01MzI6IENyZWF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBpZiBpdCdzIG1pc3NpbmcgKElvbiBTYXZpbikKK0ZpeGVkOiBHSVRIVUItNTQxOiBTb21lIE9TR2kgbWFuaWZlc3QgZml4ZXMgKEV2Z2VueSBaaHVyYXZsZXYpCitGaXhlZDogR0lUSFVCLTY1NzogRml4IE9TR0kgSW1wb3J0LVBhY2thZ2UgdG8gbWFrZSBqVW5pdDQgZGVwZW5kZW5jeSBvcHRpb25hbCAoWGF2aWVyIEZvdXJuZXQpCitGaXhlZDogR0lUSFVCLTUyMzogZXh0ZXJuYWxseSBzeW5jaHJvbml6ZSBvdXIgdXNlIG9mIHRoZSBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCAobWNvc2J5KQorRml4ZWQ6IEdJVEhVQi00Nzc6IFR5cG8gaW4gRFREIGF0dHJpYnV0ZSBjb21tZW50IChLYW1pbCBTenltYcWEc2tpKQorRml4ZWQ6IEdJVEhVQi0zNTM6IFR5cG8gaW4gZG9jdW1lbnRhdGlvbiAoSmFuIMWad2nEmWNraSkKK0ZpeGVkOiBHSVRIVUItNjU2OiBVcGdyYWRlIHRvIEpDb21tYW5kZXIgMS40OCAoUnlhbiBTY2htaXR0KQorRml4ZWQ6IEdJVEhVQi01ODI6IFRlc3RORyB0ZXN0cyBkb24ndCBwYXNzIHJlbGlhYmx5IG9uIEpESzggKFJ5YW4gU2NobWl0dCkKK05ldzogR0lUSFVCLTY0NTogVGVzdE5HIHByb2plY3Qgb24gR29vZ2xlIENvZGUgcmVkaXJlY3QgdG8gR2l0SHViCitGaXhlZDogR0lUSFVCLTMxMDogVXBncmFkZSBHdWljZSAoa3JvbmFyICYgSnVsaWVuIEhlcnIpCitGaXhlZDogR0lUSFVCLTg3OiBAQmVmb3JlU3VpdGUvQEJlZm9yZVRlc3QgbWV0aG9kcyBoYXBwZW5zIHRvIGJlIGRpc2FibGVkIGJ5IG1pc3Rha2UgKHJvbWxvbSAmIEp1bGllbiBIZXJyKQorRml4ZWQ6IEdJVEhVQi00MjU6IFdyb25nIGludm9jYXRpb24gb3JkZXIgd2l0aCBsYXN0VGltZU9ubHkgKFJhZmFlbCBXaW50ZXJoYWx0ZXIgJiBKdWxpZW4gSGVycikKK0ZpeGVkOiBHSVRIVUItNDE3OiBFeHBlY3RlZCBFeGNlcHRpb25zIE1lc3NhZ2UgZmFpbHMgdG8gbWF0Y2ggbXVsdGktbGluZSBtZXNzYWdlcyAoTWljaGFlbCBEaWFtb25kKQorTmV3OiBHSVRIVUItNjYzOiBBZGQgR3VpY2UgU3RhZ2UgY29uZmlndXJhdGlvbiBmb3IgYSBzdWl0ZSAoQ2zDqW1lbnQgR3VpbGxhdW1lKQorCis2LjguMjE6CisyMDE1LzAyLzAyCisKKzYuOC4xNToKKzIwMTUvMDEvMTQKKworRml4ZWQ6IE91dE9mTWVtb3J5RXhjZXB0aW9uIHdoaWxlIGdlbmVyYXRpbmcgcmVwb3J0cy4KK0ZpeGVkOiBHSVRIVUItNTY2OiBCdWlsZCBkb2VzIG5vdCBmYWlsIHdoZW4gc3VjY2Vzc1BlcmNlbnRhZ2UgZm9yIEBUZXN0IGlzIG5vdCBtZXQKK0ZpeGVkOiBYbWxUZXN0I3NldEdyb3VwSW5zdGFuY2VzIHdhcyBub3QgYmVpbmcgc2hvd24gaW4gdG9YbWwoKS4KK0ZpeGVkOiBHSVRIVUItMzc2OiBTb21lIHJlc3VsdHMgY2FuIGJlIGxvc3QgKEtvbnN0YW50aW4gU2F2aW4pLgorRml4ZWQ6IEhhbmRsZSByZWxhdGl2ZSBwYXRocyBvZiBTdWl0ZSBYTUwgZmlsZXMgcHJvcGVybHkgKE5hbGluIE1ha2FyKQorCis2LjguNToKKzIwMTMvMDUvMTMKKworRml4ZWQ6IHRoZSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBpbiByZXBvcnRzCitGaXhlZDogU3VyZWZpcmUgKyBsaXN0ZW5lcnMgIkNhbid0IGxvYWQgY2xhc3MiIHByb2JsZW0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis2LjguMQorMjAxMy8wMy8zMAorCitBZGRlZDogRGVzY3JpcHRpb25zIGluIHRoZSBIVE1MIHJlcG9ydHMKK0FkZGVkOiBWYXJpb3VzIGltcHJvdmVtZW50cyB0byBFbWFpbGFibGVSZXBvcnRlciAoQWJyYWhhbSBMaW4pCitBZGRlZDogQWxsb3cgaW5qZWN0aW9uIG9mIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGFuZCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2QgaW50byBEYXRhUHJvdmlkZSAoVmxhZGlzbGF2IFJhc3Nva2hpbikKK0ZpeGVkOiBBc3NlcnRpb25zIGluIHRoZSBBc3NlcnRpb25zIGNsYXNzIHdlcmUgbm90IGZhaWxpbmcgcHJvcGVybHkuCitGaXhlZDogR0lUSFVCLTMzNzogQ29uZmlndXJhdGlvbk1ldGhvZCNtX2luc3RhbmNlIHNldCB0byBCb29sZWFuLkZBTFNFIGR1ZSB0byBpbmNvcnJlY3QgY29uc3RydWN0b3IgY2FsbCBpbiBjbG9uZSgpICsgYXV0by1ib3hpbmcgKGRhdmlkZWx5KQorRml4ZWQ6IEZpeCBOUEUgZm9yIGRlcGVuZGVuY3kgbWV0aG9kcy9ncm91cHMgKEtyaXNobmFuIE1haGFkZXZhbikKK0ZpeGVkOiBwcmVzZXJ2ZS1vcmRlciBidWcgKGZvdW5kIGJ5IFZsYWRTYXJyb2toaW4pLiAKK0ZpeGVkOiBHSVRIVUItMzAwOiBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBmcm9tIHJlcG9ydGVycyB3aGVuIHRoZXJlIGFyZSBhIGxvdCBvZiB0ZXN0cworRml4ZWQ6IEdJVEhVQi0xMzc6IE1haW4gcGFyYW1ldGVycyB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpZiBhIG1haW4gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCAKK0ZpeGVkOiBHSVRIVUItMTA3OiBBbGxvdyBlbnVtIHZhbHVlcyB3aXRob3V0IGNvbnZlcnRpbmcgdGhlbSB0byB1cHBlcmNhc2UuCitGaXhlZDogQEd1aWNlIHdpdGggbm8gbW9kdWxlcyBzcGVjaWZpZWQgaXMgbm93IHN1cHBvcnRlZAorRml4ZWQ6IFJlcG9ydGVyLmxvZygpIGludm9rZWQgZnJvbSBsaXN0ZW5lcnMgd2VyZSBiZWluZyBkaXNjYXJkZWQKKworRWNsaXBzZToKK0FkZGVkOiBQcmVkZWZpbmVkIGxpc3RlbmVycyAoVGltIFd1KQorRml4ZWQ6IENvbXBhcmUgZGlhbG9nCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNi43CisyMDEyLzA3LzE1CisKK0FkZGVkOiBCaWcgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2hlbiBnZW5lcmF0aW5nIHRoZSByZXBvcnRzIChGcmFuayBQYXZhZ2VhdSkKK0FkZGVkOiA8ZGVwZW5kZW5jaWVzPiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgZ3JvdXAgZGVwZW5kZW5jaWVzIGluIHRlc3RuZy54bWwKK0FkZGVkOiBCbG93IHVwIGVhcmx5IGlmIHRyeWluZyB0byBpbmNsdWRlL2V4Y2x1ZGUgYW4gdW5rbm93biBtZXRob2QKK0FkZGVkOiA8cGFyYW1ldGVycz4gY2FuIG5vdyBiZSBzcGVjaWZpZWQgdW5kZXIgPGluY2x1ZGU+IChTdG9ybSBRaSkKK0FkZGVkOiBHSVRIVUItMjQzOiBBZGQgUmVwb3J0ZXIgT3V0cHV0IHBlciBUZXN0IGluIFhNTFJlcG9ydGVyIChkdW5zZSkgCitGaXhlZDogQmV0dGVyIEhUTUwgZXNjYXBpbmcgb2YgdGhlIHN0YWNrIHRyYWNlcworRml4ZWQ6IFRoZSBmYWlsZWQgYXNzZXJ0aW9ucyBub3cgdXNlIFtdIGFzIGRlbGltaXRlcnMgaW5zdGVhZCBvZiA8PiAoYmV0dGVyIGZvciB0aGUgSFRNTCByZXBvcnRzKQorRml4ZWQ6IEdJVEhVQi0yMzc6IFdyb25nIHRpbWUgZm9ybWF0IGluIFhNTCByZXBvcnRlcgorRml4ZWQ6IFRocmVhZHMgd2VyZSBzdGFydGVkIHNlcXVlbnRpYWxseSBpbnN0ZWFkIG9mIGJlaW5nIGludGVybGVhdmVkCitGaXhlZDogZGF0YVByb3ZpZGVyKHBhcmFsbGVsID0gdHJ1ZSkgd2FzIG5vdCBraWxsaW5nIGl0cyB0aHJlYWRzIHByb3Blcmx5CitGaXhlZDogWG1sU3VpdGUjdG9YbWwgd2Fzbid0IG91dHB1dHRpbmcgdGhlIDxncm91cHM+IHRhZyBjb3JyZWN0bHkKK0ZpeGVkOiB0ZXN0bmctZmFpbGVkLnhtbCB3YXMgbm90IGNhcnJ5aW5nIG92ZXIgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgb3JpZ2luYWwgdGVzdG5nLnhtbAorRml4ZWQ6IEJlZm9yZUNsYXNzIGZhaWxpbmcgaW4gcGFyZW50IGZhaWxlZCB0byBza2lwIG1ldGhvZHMgaW4gc3ViIGNsYXNzZXMKK0ZpeGVkOiBCZXR0ZXIgZXJyb3IgbWVzc2FnZSBpZiA8c3VpdGUgbmFtZT0iIj4gaXMgbWlzc2luZworRml4ZWQ6IEdJVEhVQi0yMjE6IEhvbm9yIGV4Y2x1ZGVHcm91cHMgb24gdGVzdG5nIHRlc3RzIHdoZW4gcnVuIGluIG1peGVkIG1vZGUgKGNyaWNjaW8pCitGaXhlZDogZGVwZW5kc09uR3JvdXBzID0ge3JlZ2V4cH0gd2Fzbid0IHdvcmtpbmcgcHJvcGVybHkgKEFsaXN0YWlyIFdhcmQpCitGaXhlZDogR0lUSFVCLTIwNTogd2hpdGUtc3BhY2Ugd2FzIHNwZWxsZWQgd2hpdGVzcGFjZSBpbiB0ZXN0bmcuY3NzIChjYXJsaW4tc2NvdHQpCisKK0VjbGlwc2U6CitGaXhlZDogRW52aXJvbm1lbnQgaXMgbm90IHRyYW5zZmVycmVkIHdoZW4gcmVydW5uaW5nIGZhaWxlZCB0ZXN0cy4KK0ZpeGVkOiBSZXJ1bm5pbmcgZmFpbGVkIHRlc3RzIHdpbGwgcHJlc2VydmUgdGhlIGVudmlyb25tZW50IG9mIHRoZSBvcmlnaW5hbCBsYXVuY2gKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzYuNS4xCiswNC8xMC8yMDEyCisKK0FkZGVkOiA8c3VpdGUgYWxsb3ctcmV0dXJuLXZhbHVlcz0idHJ1ZSI+IChhbmQgaW4gPHRlc3Q+IGFzIHdlbGwpCitBZGRlZDogZGF0YS1wcm92aWRlciBhdHRyaWJ1dGUgdG8gdGVzdG5nLXJlc3VsdHMueG1sCitBZGRlZDogUmVwb3J0ZXIgZGlzcGxheSB0aGUgcmVzdWx0cyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0ZXN0IG1ldGhvZHMgKExpYm9yIFpvdWJlaykKK0FkZGVkOiBTdXBwb3J0IGZvciBydW5uaW5nIEpVbml0IDQgdGVzdHMgKEx1a2FzIEp1bmdtYW5uKQorQWRkZWQ6IEFiaWxpdHkgdG8gYXV0by1kZXRlY3QgSlVuaXQgdGVzdHMgKCctbWl4ZWQnIG1vZGUpIChMdWthcyBKdW5nbWFubikKK0FkZGVkOiBTdXBwb3J0IGZvciBSZXNvdXJjZUNvbGxlY3Rpb25zIGluIGFuIEFudCB0YXNrcyAocmVxdWlyZXMgQW50ID49IDEuNy4wKSAoTHVrYXMgSnVuZ21hbm4pCitGaXhlZDogR0lUSFVCLTE5ODogSlVuaXRSZXBvcnRzUmVwb3J0ZXIgdXNlIGNvbW1hcyBpbiBjZXJ0YWluIGxvY2FsZXMsIHdoaWNoIEpVbml0UmVwb3J0cyBkb2Vzbid0IGxpa2UKK0ZpeGVkOiBHSVRIVUItMTczOiBEZXBlbmRlbnQgbWV0aG9kcyBleGVjdXRlZCBvdXQtb2Ytb3JkZXIgaWYgbWV0aG9kIG5hbWVzIG1hdGNoIGFjcm9zcyBjbGFzc2VzIChqamVkTW9yaUFua3RhaCkKK0ZpeGVkOiBUaHJlYWRMb2NhbDxJVGVzdFJlc3VsdD4gbGVhayAoYXNsYWtrbnV0c2VuKQorRml4ZWQ6IEluIHRoZSBIVE1MIHJlcG9ydHMsIG9ubHkgc2hvdyB0aGUgZmlyc3QgMTAwIGNoYXJhY3RlcnMgb2YgdGhlIHBhcmFtZXRlcnMKK0ZpeGVkOiBTa2lwcGVkRXhjZXB0aW9uIGFyZSBjb25zaWRlcmVkIGFzIHJlYWwgZXhjZXB0aW9uIHdpdGggQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zKQorCitFY2xpcHNlOgorRml4ZWQ6IEphdmEgY29uc3RhbnRzIGFyZSBwcm9wZXJseSByZXNvbHZlZCBpZiB0aGV5IGFyZSB1c2VkIGFzIGdyb3VwIG5hbWVzIChzdXNhbmluKQorRml4ZWQ6IEBUZXN0KGdyb3VwcyA9IEZvby5DT05TVEFOVCkgKHN1c2FuaW4pCitGaXhlZDogRmFpbGVkIHRlc3RzIHdpdGggYWxsb3ctcmV0dXJuLXZhbHVlcz0idHJ1ZSIgd2VyZSBub3QgcmVydW4KK0FkZGVkOiA8c3VpdGUgYWxsb3ctcmV0dXJuLXZhbHVlcz0idHJ1ZSI+IChhbmQgaW4gPHRlc3Q+IGFzIHdlbGwpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis2LjQ6CiswMi8xNS8yMDEyCisKK0FkZGVkOiBARGF0YVByb3ZpZGVyKGluZGljZXMpIHRvIHJldHVybiBzcGVjaWZpYyBpbmRpY2VzIG9mIGEgZGF0YSBwcm92aWRlcgorQWRkZWQ6IE5ldyBIVE1MIHJlcG9ydHMKK0FkZGVkOiBjb25maWdmYWlsdXJlcG9saWN5PWNvbnRpbnVlIHdpdGggRGF0YVByb3ZpZGVycyAodG9kZHEpCitBZGRlZDogSVRlc3RSZXN1bHQjZ2V0VGVzdENvbnRleHQgKGJwZWRtYW4pCitGaXhlZDogaW52b2NhdGlvbkNvdW50ID4gMSArIHRpbWVPdXQgd2Fzbid0IHRpbWluZyBvdXQgcHJvcGVybHkKK0ZpeGVkOiBXaGVuIHJ1bm5pbmcgVGVzdE5HIHByb2dyYW1tYXRpY2FsbHksIGNoaWxkIHhtbCBzdWl0ZXMgYXJlIG5vdCBydW4gKHdoZW4gYWRkZWQgdXNpbmcgc2V0U3VpdGVGSWxlcygpKSAoR2F1cmF2IEd1cHRhKQorRml4ZWQ6IEdJVEhVQi0xNDU6IEV4Y2Vzc2l2ZSB0ZXN0IG1ldGhvZCBleGVjdXRpb24gKGdpdGh1YkNhc3QpCitGaXhlZDogR0lUSFVCLTE0OTogcmV2ZXJzZWQgYXJndW1lbnRzIGluIGZhaWxBc3NlcnRFcXVhbHNOb09yZGVyKCkuCitGaXhlZDogRW1haWxhYmxlUmVwb3J0ZXI6IG1ldGhvZHMgYXJlIG5vdyAqcmVhbGx5KiBzb3J0ZWQgY2hyb25vbG9naWNhbGx5LgorCitFY2xpcHNlOgorCitBZGRlZDogWW91IGNhbiBub3cgYWRkIHRoZSB0ZXN0bmcuamFyIHNvdXJjZXMgYXMgYSBsaWJyYXJ5IChOaWNrIFRhbikKK0FkZGVkOiBVcGdyYWRlZCB0aGUgcGx1Zy1pbiB0byAzLjQrIChOaWNrIFRhbikKK0FkZGVkOiBkZXBlbmRzT25Hcm91cHMgbm93IGZ1bGx5IHN1cHBvcnRlZAorRml4ZWQ6IEBQYXJhbWV0ZXJzIG5vdyB3b3JrcyB3aXRoIGJvdGggKCJmb28iKSBhbmQgKHsiZm9vIn0pIChkYXZla2VyYmVyKQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzYuMy4xCisxMC8yMi8yMDExCisKK0FkZGVkOiBOZXcgc3lzdGVtIHByb3BlcnR5OiBkYXRhcHJvdmlkZXJ0aHJlYWRjb3VudCAoQmlsbCBSb3NzKQorRml4ZWQ6IENvbmZpZ3VyYXRpb24gbWV0aG9kcyB3ZXJlIHJlcG9ydGVkIGluY29ycmVjdGx5IGluIGxpc3RlbmVycy4KK0ZpeGVkOiBXYXMgY3JlYXRpbmcgdG9vIG1hbnkgbGlzdGVuZXJzIChKYWNlayBQdWx1dCkKK0ZpeGVkOiBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMiBiZWZvcmVUZXN0L2FmdGVyVGVzdCBib29sZWFucyB3ZXJlIG5vdCBiZWluZyBzZXQKK0ZpeGVkOiBHSVRIVUItOTI6IEBCZWZvcmVUZXN0IG1ldGhvZCBpbiBhIHN1cGVyIGNsYXNzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWUgd2hlbiBhbHdheVJ1biA9IHRydWUgKEJ1YnVudHV4KQorRml4ZWQ6IEdJVEhVQi0xMTE6IEBBZnRlckNsYXNzIG9uIGJhc2UgY2xhc3NlcyBydW4gb25jZSB0b28gbWFueSAobHJpdmVyYSkKK0ZpeGVkOiBHSVRIVUItMTA3OiBEaXNwbGF5aW5nIDAgdGVzdHMgcnVuIGlmIGEgbGlzdGVuZXIgbW9kaWZpZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHN1aXRlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNi4zCisxMC8xNy8yMDExCisKK0FkZGVkOiAiZGVzY3JpcHRpb24iIGF0dHJpYnV0ZSBvbiA8aW5jbHVkZT4sIG1hZGUgYXZhaWxhYmxlIG9uIElUZXN0TkdNZXRob2QjZ2V0RGVzY3JpcHRpb24KK0FkZGVkOiBSZW1vdGVUZXN0Tkcgd2FpdHMgaW5maW5pdGVseSBmb3IgYSBjb25uZWN0aW9uIChBbGVrc2V5IEthYmFub3YpCitGaXhlZDogQSBtZXRob2QgdGhhdCdzIGJvdGggYSB0ZXN0IGFuZCBhIGZhY3Rvcnkgd291bGQgbm90IGludm9rZSBpdHMgZGF0YSBwcm92aWRlcgorRml4ZWQ6IEBBZnRlckNsYXNzIHdhcyBub3QgY2FsbGVkIGlmIG9uZSBvZiB0aGUgbWV0aG9kcyB3YXMgbm90IGVuYWJsZWQgKEFsZWtzZXkgS2FiYW5vdikKK0ZpeGVkOiBHcm9vdnkgYWNjZXNzIGJ1ZworRml4ZWQ6IFRoZSBYTUwgcGFyc2VyIGRvZXNuJ3QgcmVjb2duaXplIHBhcmFsbGVsPSJpbnN0YW5jZXMiCitGaXhlZDogTlBFIHdoZW4gdXNpbmcgaW5uZXIgY2xhc3NlcworRml4ZWQ6IEdJVEhVQi05MDogQEFmdGVyQ2xhc3Mgbm90IGJlaW5nIHJ1biB3aGVuIHRoZSBjbGFzcyBjb250YWlucyBpbmNsdWRlZCBhbmQgbm90IGluY2x1ZGVkIG1ldGhvZHMKK0ZpeGVkOiBAQWZ0ZXJDbGFzcyBub3QgYmVpbmcgcnVuIGluIHNvbWUgc3ViY2xhc3Npbmcgc2l0dWF0aW9ucworCitFY2xpcHNlOgorCitGaXhlZDogVmVyYm9zZSBsZXZlbHMgc3BlY2lmaWVkIGluIHN1aXRlcyBub3QgcmVzcGVjdGVkCitGaXhlZDogVmFyaWFibGUgc3Vic3RpdHV0aW9uIGluIFZNIGFyZ3VtZW50cyBpcyBub3Qgd29ya2luZyBwcm9wZXJseSAoc3ZlbmhvZmYpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis2LjIKKzA4LzE4LzIwMTEKKworQWRkZWQ6IHhtbHBhdGhpbmphciB0byB0aGUgVGVzdE5HIGFudCB0YXNrCitBZGRlZDogVGVzdE5HIGNhbiBub3cgaW52b2tlIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworQWRkZWQ6IEluamVjdG9ycyBjcmVhdGVkIGJ5IHRoZSBAR3VpY2UgYW5ub3RhdGlvbiBhcmUgbm93IHNoYXJlZCBhdCB0aGUgPHRlc3Q+IGxldmVsCitBZGRlZDogSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBpcyBub3cgYSBwdWJsaWMgbGlzdGVuZXIsIGFsb25nIHdpdGggYSBuZXcgb25lOiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyMgorQWRkZWQ6IFdoZW4gYSBtZXRob2QgZmFpbHMsIG9ubHkgZGVwZW5kZW50cyBvZiB0aGUgc2FtZSBpbnN0YW5jZSB3aWxsIGJlIHNraXBwZWQKK0FkZGVkOiBwYXJhbGxlbD1pbnN0YW5jZXMgZm9yIGZhY3RvcnkgaW5zdGFuY2UgcGFyYWxsZWwgcnVucworQWRkZWQ6IEBGYWN0b3J5KGVuYWJsZWQpCitGaXhlZDogSlVuaXRSZXBvcnRzIHJlcG9ydHMgbm93IHJlcG9ydCB0aGUgY3VtdWxhdGVkIHRpbWUgQHtCZWZvcmUsQWZ0ZXJ9TWV0aG9kK0BUZXN0IGZvciBlYWNoIHRlc3QgbWV0aG9kCitGaXhlZDogSlVuaXRSZXBvcnRzIHJlcG9ydHMgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgPHRlc3Q+IGluc3RlYWQgb2YgdGhhdCBvZiB0aGUgZmlyc3QgY2xhc3MKK0ZpeGVkOiBVc2luZyBwcmVzZXJ2ZS1vcmRlciB3aXRoIGEgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgaW5zdGFuY2VzIG9mIGEgZGlmZmVyZW50IGNsYXNzIGNhdXNlcyBOUEUKK0ZpeGVkOiBHSVRIVUItNzQ6IEJhZCBvcmRlcmluZyBvZiB0ZXN0IG1ldGhvZHMgd2hlbiB1c2luZyBhIEBGYWN0b3J5IGNvbnN0cnVjdG9yIHdpdGggZGF0YVByb3ZpZGVyCitGaXhlZDogQ2hhbmdpbmcgdGhlIHRlc3QgcmVzdWx0IGZyb20gc3VjY2VzcyB0byBmYWlsdXJlIGluIGEgbGlzdGVuZXIgd291bGQgc3RpbGwgY291bnQgdGhlIHRlc3QgYXMgYSBzdWNjZXNzCitGaXhlZDogU2VydmljZUxvYWRlciB3YXNuJ3QgcmVzb2x2aW5nIGNvcnJlY3RseSBpZiBubyBzZXJ2aWNlIGxvYWRlciBjbGFzc2xvYWRlciB3YXMgc3BlY2lmaWVkCitGaXhlZDogQmV0dGVyIG9yZGVyaW5nIHdpdGggbWl4ZWQgcHJpb3JpdGllcyBhbmQgZGVwZW5kZW5jaWVzCitGaXhlZDogSW1wcm92ZWQgZGV0ZWN0aW9uIG9mIGdyYXBoIGN5Y2xlcyBpbiBwYXJhbGxlbCBydW5zCitGaXhlZDogQEJlZm9yZVRlc3Qgd2FzIGludm9rZWQgbXVsdGlwbGUgdGltZXMgaWYgYSBmYWN0b3J5IGlzIHVzZWQKK0ZpeGVkOiBHSVRIVUItNTc6IEFsbG93IHVzYWdlIG9mIHBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIG9mIHRlc3QgY2xhc3NlcworRml4ZWQ6IEluamVjdGluZyBib3RoIE9iamVjdFtdIGFuZCBNZXRob2QgaW4gQEJlZm9yZU1ldGhvZCBkaWRuJ3QgYWx3YXlzIHdvcmsKK0ZpeGVkOiB0ZXN0bmctcmVzdWx0cy54bWwgbm93IGxpc3RzIHRoZSByZXN1bHRzIGNocm9ub2xvZ2ljYWxseQorRml4ZWQ6IEBMaXN0ZW5lcnMgc3BlY2lmaWVkIG9uIGEgYmFzZSBjbGFzcyB3aWxsIG9ubHkgYmUgcnVuIG9uY2UgcGVyIGxpc3RlbmVyIGNsYXNzIChkYnJpb25lcykKK0ZpeGVkOiAtZ3JvdXBzIGFuZCAtZXhjbHVkZWdyb3VwcyB3ZXJlIG5vIGxvbmdlciBvdmVycmlkaW5nIHRlc3RuZy54bWwKKworRWNsaXBzZToKKworQWRkZWQ6IEVhY2ggZGF0YSBwcm92aWRlciBtZXRob2Qgbm93IGhhcyBhIHNlcGFyYXRlIG5vZGUgZW50cnkgaW4gdGhlIFRlc3RORyB2aWV3CitGaXhlZDogTm9kZXMgaW4gZXJyb3Igd291bGQgc29tZXRpbWVzIHJlbWFpbiBncmVlbgorRml4ZWQ6IFRoZSBUZXN0TkcgY29udGV4dCBtZW51IG5vIGxvbmdlciBhcHBlYXJzIHdoZXJlIGl0IHNob3VsZG4ndAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNi4xLjEKKzcvNS8yMDExCisKK0ZpeGVkOiBodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvNTYgdGVzdG5nLXJlc3VsdHMueG1sIHdhcyByZXBvcnRpbmcgdGhlIGluc3RhbmNlIG5hbWUgaW5zdGVhZCBvZiB0aGUgbWV0aG9kIG5hbWUKK0ZpeGVkOiBOUEUgd2hlbiB1c2luZyBwcmVzZXJ2ZS1vcmRlciBhbmQgZmFjdG9yaWVzLgorRml4ZWQ6IERlcGVuZGluZyBvbiBhIHNraXBwZWQgbWV0aG9kIHdvdWxkIG5vdCBjYXVzZSBhIG1ldGhvZCB0byBiZSBza2lwcGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis2LjEKKzYvMzAvMjAxMQorCitQb3NzaWJsZSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlczoKKworLSBEb24ndCBtdXRhdGUgdGhlIHZhbHVlIHJldHVybmVkIGJ5IFhtbFRlc3QjZ2V0SW5jbHVkZWRHcm91cHMgYW5kIFhtbFRlc3QjZ2V0RXhjbHVkZWRHcm91cHMuCitJbnN0ZWFkLCB1c2UgYWRkSW5jbHVkZWRHcm91cC9hZGRFeGNsdWRlZEdyb3VwLgorLSBGYWlsaW5nIG1ldGhvZHMgdGhhdCBoYXZlIGRlcGVuZGVlcyB3aWxsIG9ubHkgY2F1c2Ugc2tpcHMgaW4gdGhlIHNhbWUgaW5zdGFuY2UuIERpZmZlcmVudAordGVzdCBpbnN0YW5jZXMgd2lsbCBub3QgYmUgYWZmZWN0ZWQKKworQWRkZWQ6IFN1cHBvcnQgZm9yIFNlcnZpY2VMb2FkZXIgZm9yIElUZXN0TkdMaXN0ZW5lcgorQWRkZWQ6IEBGYWN0b3J5KGRhdGFQcm92aWRlciAvIGRhdGFQcm92aWRlckNsYXNzKSBvbiBjb25zdHJ1Y3RvcnMKK0FkZGVkOiBhc3NlcnROb3RFcXVhbHMoKSB0byBBc3NlcnQKK0FkZGVkOiBhc3NlcnRBcnJheUVxdWFscygpIHRvIEFzc2VydEpVbml0CitBZGRlZDogTmVzdGVkIGNsYXNzZXMgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGFkZGVkIGZvciBjb25zaWRlcmF0aW9uIGZvciBpbmNsdXNpb24KK0FkZGVkOiA8c3VpdGUgcHJlc2VydmUtb3JkZXI9InRydWUiPiB3aWxsIGNhdXNlIHRoaXMgYXR0cmlidXRlIHRvIGJlIHByb3BhZ2F0ZWQgdG8gYWxsIDx0ZXN0PiB0YWdzCitBZGRlZDogPGdyb3Vwcz4gY2FuIG5vdyBiZSBzcGVjaWZpZWQgdW5kZXIgYSA8c3VpdGU+CitBZGRlZDogVHljaG8gY29tcGF0aWJpbGl0eSAoQWxla3NhbmRlciBQb2hsKQorQWRkZWQ6IE5ldyA8dGVzdD4gYW5kIDxzdWl0ZT4gZmxhZzogZ3JvdXAtYnktaW5zdGFuY2VzCitBZGRlZDogLXhtbHBhdGhpbmphciB0byBzcGVjaWZ5IHRoZSBwYXRoIG9mIHRlc3RuZy54bWwgaW5zaWRlIGEgdGVzdCBqYXIgZmlsZQorQWRkZWQ6IElTdWl0ZSNnZXRBbGxNZXRob2RzLCB0byByZXRyaWV2ZSBhbGwgdGhlIG1ldGhvZHMgYXQgdGhlIHN0YXJ0IG9mIGEgc3VpdGUuCitBZGRlZDogT3V0cHV0IElUZXN0UmVzdWx0IGF0dHJpYnV0ZXMgaW4geG1sIHJlcG9ydCAobmd1aWxsYXVtaW4pCitGaXhlZDogVGhyZWFkIHNhZmV0eSBwcm9ibGVtIGluIE1ldGhvZEludm9jYXRpb25IZWxwZXIgKEJhcm9uIFJvYmVydHMpCitGaXhlZDogR3JvdXAgZGVwZW5kZW5jaWVzIHdlcmUgbm90IGJlaW5nIHNraXBwZWQgcHJvcGVybHkuCitGaXhlZDogRGVwZW5kZW5jeSBmYWlsdXJlcyBvbmx5IGltcGFjdCB0aGUgc2FtZSBpbnN0YW5jZQorRml4ZWQ6IFN0YXRpYyBjbGFzc2VzIGNvdWxkIGNhdXNlIGEgU3RhY2tPdmVyRmxvd0Vycm9yCitGaXhlZDogSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciB3YXMgbm90IGV4dGVuZGluZyBJVGVzdE5HTGlzdGVuZXIKK0ZpeGVkOiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyI29uQ29uZmlndXJhdGlvbkZhaWx1cmUgd2FzIG5ldmVyIGNhbGxlZAorRml4ZWQ6IFRFU1RORy00NzY6IDx0ZXN0PiB0YWdzIGFyZSBub3cgcnVuIGluIHRoZSBvcmRlciBmb3VuZCBpbiB0ZXN0bmcueG1sCitGaXhlZDogTm93IHNob3dpbmcgZmFpbGVkL3NraXBwZWQgZXJyb3IgbWVzc2FnZXMgb24gdGhlIGNvbnNvbGUgZm9yIHZlcmJvc2UgPj0gMgorRml4ZWQ6IElUZXN0UmVzdWx0I2dldEVuZE1pbGxpcygpIHJldHVybiAwCitGaXhlZDogVEVTVE5HLTQxMDogQ2xlYXJlciBlcnJvciBtZXNzYWdlCitGaXhlZDogVEVTVE5HLTQ3NTogQERhdGFQcm92aWRlciBkb2Vzbid0IHN1cHBvcnQgdmFyYXJncworRml4ZWQ6IFBlcmZvcm1hbmNlIHByb2JsZW1zIGluIEVtYWlsYWJsZVJlcG9ydGVyCitGaXhlZDogVEVTVE5HLTQ3MjogQmV0dGVyIG91dHB1dCBmb3IgYXNzZXJ0TnVsbCgpCitGaXhlZDogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHVzaW5nIHBhcmFsbGVsIGRhdGEgcHJvdmlkZXJzLgorRml4ZWQ6IFRFU1RORy0yODI6IFByb2JsZW0gd2hlbiBpbmNsdWRpbmcrZXhjbHVkaW5nIHBhY2thZ2VzIChhZGRpY3RlZCkKK0ZpeGVkOiBURVNUTkctNDcxOiBhc3NlcnRFcXVhbHMoTWFwLCBNYXApIGZhaWxzIGlmIGEgbWFwIGlzIGEgc3Vic2V0IG9mIHRoZSBvdGhlcgorRml4ZWQ6IEpVbml0UmVwb3J0ZXIgZ2VuZXJhdGVzIGFuIDxlcnJvcj4gdGFnIGZvciBzdWNjZXNzZnVsIGV4cGVjdGVkRXhjZXB0aW9ucyB0ZXN0cworRml4ZWQ6IElTU1VFLTQ3OiBEb24ndCBhbGxvdyB0d28gPHRlc3Q+cyB3aXRoIHNhbWUgbmFtZSB3aXRoaW4gc2FtZSBzdWl0ZSAoTmFsaW4gTWFrYXIpCitGaXhlZDogSWYgYSBsaXN0ZW5lciBpbXBsZW1lbnRzIGJvdGggSVN1aXRlTGlzdGVuZXIgYW5kIElJbnZva2VkTWV0aG9kTGlzdGVuZXIsIG9ubHkgb25lIG9mIHRoZW0gZ2V0cyBpbnZva2VkCisKK0VjbGlwc2U6CisKK0FkZGVkOiBOZXcgcXVpY2sgZml4ICJBZGQgc3RhdGljIGltcG9ydCBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydFhYWCIKK0FkZGVkOiBOZXcgd29ya3NwYWNlIHdpZGUgc2V0dGluZzogZXhjbHVkZWQgc3RhY2sgdHJhY2VzLCB0byBwcm92aWRlIHNob3J0ZXIgc3RhY2sgdHJhY2VzIGluIHRoZSB2aWV3CitBZGRlZDogTmV3ICJDbGVhciByZXN1bHRzIiBpY29uIGluIHRoZSB0b29sIGJhcgorQWRkZWQ6IFdoZW4gdGhlIHNlYXJjaCBmaWx0ZXIgaXMgbW9kaWZpZWQsIGRvbid0IHVwZGF0ZSB0aGUgdHJlZSBsaXZlIGlmIGl0IGlzIHRvbyBiaWcgCitBZGRlZDogVHdvIG5ldyBAVGVzdCByZWZhY3RvcmluZ3MgKHB1bGwgdG8gY2xhc3MgbGV2ZWwsIHB1c2ggdG8gbWV0aG9kIGxldmVsKQorQWRkZWQ6IEpVbml0IGNvbnZlcnNpb246IEBJZ25vcmUKK0FkZGVkOiBKVW5pdCBjb252ZXJzaW9uOiBhc3NlcnRBcnJheUVxdWFscygpCitBZGRlZDogSlVuaXQgY29udmVyc2lvbjogQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK0FkZGVkOiBTdXBwb3J0IGZvciBIYW1jcmVzdCBmYWlsZWQgYXNzZXJ0aW9ucyBpbiB0aGUgY29tcGFyZSBkaWFsb2cKK0FkZGVkOiBKVW5pdCBjb252ZXJzaW9uOiBzdWl0ZSgpIG1ldGhvZHMgY2FuIG5vdyBlaXRoZXIgYmUgcmVtb3ZlZCwgY29tbWVudGVkIG91dCBvciBsZWZ0IHVudG91Y2hlZAorRml4ZWQ6IEpVbml0IGNvbnZlcnNpb246IHN1cGVyLnNldFVwKCkvdGVhckRvd24oKSB3ZXJlIGJlaW5nIHJlbW92ZWQgd2hlbiBleHRlbmRpbmcgYSBjbGFzcyBvdGhlciB0aGFuIFRlc3RDYXNlCitGaXhlZDogIlJ1biBhcyIgbWVudSBub3QgYXBwZWFyaW5nIGZvciBtZXRob2RzIHRoYXQgdGFrZSBhIGdlbmVyaWMgcGFyYW1ldGVyLgorRml4ZWQ6IFRoZSB0cmVlIHdhcyBpbmNvcnJlY3QgaWYgdGhlIHNhbWUgY2xhc3MgaXMgdXNlZCBpbiBkaWZmZXJlbnQgPHRlc3Q+IHRhZ3MKK0ZpeGVkOiBXaGVuIGNyZWF0aW5nIGEgbmV3IFJ1bi9EZWJ1ZyBjb25maWd1cmF0aW9uLCAiTGF1bmNoLmxhYmVsIiB3YXMgZGlzcGxheWVkCitGaXhlZDogVEVTVE5HLTQ1OTogVGVzdE5HIG1lbnUgc2hvdWxkIG5vdCBhbHdheXMgYmUgcHJlc2VudCBpbiBjb250ZXh0IG1lbnUgKE15a29sYSBOaWtpc2hvdikKK0ZpeGVkOiBQZXJmb3JtYW5jZSBwcm9ibGVtcyBpbiB0aGUgcGx1Zy1pbgorRml4ZWQ6IFdvcmtzcGFjZS13aWRlIFhNTCB0ZW1wbGF0ZSBmaWxlcyBhcmUgbm90IGJlaW5nIGhvbm9yZWQuCitGaXhlZDogQEJlZm9yZUNsYXNzL0BBZnRlckNsYXNzIGZyb20gSlVuaXQ0IGFyZSBub3QgYmVpbmcgcHJvcGVybHkgY29udmVydGVkCitGaXhlZDogQ29udmVyc2lvbnMgZ2VuZXJhdGUgQFRlc3QoKSBpbnN0ZWFkIG9mIEBUZXN0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis2LjAKKzIwMTEvMDMvMTYKKworQWRkZWQ6IEBHdWljZShtb2R1bGVGYWN0b3J5KSBhbmQgSU1vZHVsZUZhY3RvcnkKK0FkZGVkOiBAR3VpY2UobW9kdWxlKQorQWRkZWQ6IHRpbWVPdXQgZm9yIGNvbmZpZ3VyYXRpb24gbWV0aG9kcworQWRkZWQ6IC1yYW5kb21pemVzdWl0ZXMgKE5hbGluIE1ha2FyKQorQWRkZWQ6IElDb25maWd1cmFibGUKK0ZpeGVkOiBAVGVzdChwcmlvcml0eSkgd2FzIG5vdCBiZWluZyBob25vcmVkIGluIHBhcmFsbGVsIG1vZGUKK0ZpeGVkOiBAVGVzdCh0aW1lT3V0KSB3YXMgY2F1c2luZyB0aHJlYWRQb29sU2l6ZSB0byBiZSBpZ25vcmVkCitGaXhlZDogVEVTVE5HLTQ2ODogTGlzdGVuZXJzIGRlZmluZWQgaW4gc3VpdGUgWE1MIGZpbGUgYXJlIGlnbm9yZWQgKE1pY2hhZWwgQmVueikKK0ZpeGVkOiBURVNUTkctNDY1OiBHdWljZSBtb2R1bGVzIGFyZSBib3VuZCBpbmRpdmlkdWFsbHkgdG8gYW4gaW5qZWN0b3IgbWVhbmluZyB0aGF0IG11bHRpcGxlIG1vZHVsZXMgY2FuJ3QgYmUgZWZmZWN0aXZlbHkgdXNlZCAoRGFubnkgVGhvbWFzKQorRml4ZWQ6IE1ldGhvZCBzZWxlY3RvcnMgZnJvbSBzdWl0ZXMgd2VyZSBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKHRvZGRxKQorRml4ZWQ6IFRocm93IGFuIGVycm9yIHdoZW4gdHdvIGRhdGEgcHJvdmlkZXJzIGhhdmUgdGhlIHNhbWUgbmFtZQorRml4ZWQ6IEJldHRlciBoYW5kbGluZyBvZiBjbGFzc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgVGVzdE5HIGFubm90YXRpb25zCitGaXhlZDogWG1sVGVzdCN0b1htbCB3YXNuJ3QgZGlzcGxheWluZyB0aGUgdGhyZWFkLWNvdW50IGF0dHJpYnV0ZQorRml4ZWQ6IFRFU1RORy00Mzg6IFJlZ3Jlc3Npb24gaW4gNS4xNC4xOiBKVW5pdCBUZXN0IEV4ZWN1dGlvbiBubyBsb25nZXIgd29ya2luZworRml4ZWQ6IFRFU1RORy00MzY6IERlZXAgTWFwIGNvbXBhcmlzb24gZm9yIGFzc2VydEVxdWFscygpIChOaWtvbGF5IE1ldGNoZXYpCitGaXhlZDogU2tpcHBlZCB0ZXN0cyB3ZXJlIG5vdCBhbHdheXMgY291bnRlZC4KK0ZpeGVkOiB0ZXN0IGxpc3RlbmVycyB0aGF0IHRocm93IHdlcmUgbm90IHJlcG9ydGluZyBjb3JyZWN0bHkgKGFuc2dhcmtvbmVybWFubikKK0ZpeGVkOiA8c3VpdGUganVuaXQ9InRydWUiPiB3YXNuJ3Qgd29ya2luZy4KK0ZpeGVkOiBJbiBwYXJhbGxlbCAibWV0aG9kcyIgbW9kZSwgbWV0aG9kIGludGVyY2VwdG9ycyB0aGF0IHJlbW92ZSBtZXRob2RzIHdvdWxkIGNhdXNlIGEgbG9jayB1cAorRml4ZWQ6IEVtYWlsYWJsZVJlcG9ydGVyIG5vdyBzb3J0cyBtZXRob2RzIGNocm9ub2xvZ2ljYWxseQorRml4ZWQ6IFRFU1RORy00MTE6IFRocm93IGV4Y2VwdGlvbiBvbiBtaXNtYXRjaCBvZiBwYXJhbWV0ZXIgdmFsdWVzICh2aWEgRFAgYW5kL29yIEluamVjdCkgYW5kIHRlc3QgcGFyYW1ldGVycworRml4ZWQ6IElERUEtNTkwNzM6IGV4Y2VwdGlvbnMgdGhhdCBkb24ndCBtYXRjaCBkb24ndCBoYXZlIHN0YWNrIHRyYWNlIHByaW50ZWQgaW4gY29uc29sZSAoQW5uYSBLb3psb3ZhKQorRml4ZWQ6IElERUEncyBwbHVnLWluIHdhcyBub3QgaG9ub3JpbmcgSVRlc3QgKGZpeGVkIGluIFRlc3RSZXN1bHRNZXNzYWdlKQorRml4ZWQ6IE1ldGhvZHMgZGVwZW5kaW5nIG9uIGEgZ3JvdXAgdGhleSBiZWxvbmcgd2VyZSBza2lwcGVkIGluc3RlYWQgb2YgdGhyb3dpbmcgYSBjeWNsZSBleGNlcHRpb24KK0ZpeGVkOiBURVNUTkctNDAxOiBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiB1c2luZyBhIGxpc3RlbmVyIGZyb20gTWF2ZW4KK0ZpeGVkOiBURVNUTkctMTg2OiBSZW5hbWUgSVdvcmtlckFwYWR0ZXIgdG8gSVdvcmtlckFkYXB0ZXIgKFRvbWFzIFBvbGxhaykKK0ZpeGVkOiBURVNUTkctNDE1OiBBc3NlcnQuYXNzZXJ0RXF1YWxzKCkgZm9yIHNldHMgYW5kIG1hcHMgZmFpbHMgd2l0aCAnbnVsbCcgYXMgYXJndW1lbnRzCitGaXhlZDogdHlwbyAtdGVzdFJ1bkZhY3RvcnkKK0ZpeGVkOiBOUEUgd2hpbGUgcHJpbnRpbmcgcmVzdWx0cyBmb3IgYW4gZW1wdHkgc3VpdGUgKE5hbGluIE1ha2FyKQorRml4ZWQ6IEludm9rZSBJSW52b2tlZE1ldGhvZExpc3RlbmVyLmFmdGVySW52b2NhdGlvbiBhZnRlciBmaXhpbmcgcmVzdWx0cyBmb3IgdGVzdHMgZXhwZWN0aW5nIGV4Y2VwdGlvbnMgKE5hbGluIE1ha2FyKQorRml4ZWQ6IFRFU1RORy00NDE6IE5QRSBpbiBTdWl0ZUhUTUxSZXBvcnRlciNnZW5lcmF0ZU1ldGhvZHNDaHJvbm9sb2dpY2FsbHkgY2F1c2VkIGJ5IGEgcmFjZSBjb25kaXRpb24gKFNsYXdvbWlyIEdpbnRlcikKKworRWNsaXBzZToKK0FkZGVkOiBDb252ZXJ0IHRvIFlBTUwKK0FkZGVkOiBOZXcgZ2xvYmFsIHByZWZlcmVuY2U6IEpWTSBhcmdzCitBZGRlZDogRWNsaXBzZSBjYW4gbm93IG1vbml0b3IgYSB0ZXN0LW91dHB1dC8gZGlyZWN0b3J5IGFuZCB1cGRhdGUgdGhlIHZpZXcgd2hlbiBhIG5ldyByZXN1bHQgaXMgY3JlYXRlZAorQWRkZWQ6IFJpZ2h0IGNsaWNraW5nIG9uIGEgY2xhc3MvcGFja2FnZS9wcm9qZWN0IG5vdyBvZmZlcnMgYSBtZW51ICJUZXN0TkcvQ29udmVydCB0byBUZXN0TkciCitBZGRlZDogRXhjbHVkZWQgbWV0aG9kcyBhcmUgbm93IGxpc3RlZCBpbiB0aGUgU3VtbWFyeSB0YWIKK0FkZGVkOiAiRGVzY3JpcHRpb24iIGNvbHVtbiBpbiB0aGUgZXhjbHVkZWQgbWV0aG9kcyB0YWJsZQorQWRkZWQ6IERpYWxvZyBib3ggd2hlbiB0aGUgcGx1Zy1pbiBjYW4ndCBjb250YWN0IFJlbW90ZVRlc3RORworQWRkZWQ6IERvdWJsZSBjbGlja2luZyBvbiBhbiBleGNsdWRlZCBtZXRob2QgaW4gdGhlIFN1bW1hcnkgdGFiIHdpbGwgdGFrZSB5b3UgdG8gaXRzIGRlZmluaXRpb24KK0FkZGVkOiBJZiB5b3Ugc2VsZWN0IGEgcGFja2FnZSBiZWZvcmUgaW52b2tpbmcgdGhlICJOZXcgVGVzdE5HIGNsYXNzIiB3aXphcmQsIHRoZSBzb3VyY2UgYW5kIHBhY2thZ2UgdGV4dCBib3hlcyB3aWxsIGJlIGF1dG8tZmlsbGVkCitBZGRlZDogV2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIGEgdGFiLCB0aGUgc2FtZSBpdGVtIHdpbGwgYmUgc2VsZWN0ZWQgd2hlbiBzd2l0Y2hpbmcgdGFicworQWRkZWQ6IEEgbmV3ICJTdW1tYXJ5IiB0YWIgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIGEgc3VtbWFyeSBvZiB0aGUgdGVzdHMsIHNvcnQgdGhlbSBieSB0aW1lLCBuYW1lLCBldGMuLi4KK0FkZGVkOiBJdCdzIG5vdyBwb3NzaWJsZSAiUnVuL0RlYnVnIEFzIiB3aXRoIGEgcmlnaHQgY2xpY2sgZnJvbSBwcmV0dHkgbXVjaCBhbnkgZWxlbWVudCB0aGF0IG1ha2VzIHNlbnNlIGluIHRoZSB0cmVlLgorQWRkZWQ6IEpVbml0IGNvbnZlcnNpb246IGNvcnJlY3RseSByZXBsYWNlcyBhc3NlcnROdWxsIGFuZCBhc3NlcnROb3ROdWxsCitBZGRlZDogSlVuaXQgY29udmVyc2lvbjogcmVtb3ZlcyBzdXBlci5zZXRVcCgpIGFuZCBzdXBlci50ZWFyRG93bigpCitBZGRlZDogSlVuaXQgY29udmVyc2lvbjogcmVtb3ZlcyBAT3ZlcnJpZGUKK0FkZGVkOiBKVW5pdCBjb252ZXJzaW9uOiByZXBsYWNlcyBAVGVzdCh0aW1lb3V0KSB3aXRoIEBUZXN0KHRpbWVPdXQpICg1LjE0LjIuNCkKK0FkZGVkOiBKVW5pdCBjb252ZXJzaW9uOiByZXBsYWNlcyBAVGVzdChleHBlY3RlZCkgd2l0aCBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMpICg1LjE0LjIuNCkKK0FkZGVkOiBKVW5pdCBjb252ZXJzaW9uOiByZXBsYWNlcyBmYWlsKCkgd2l0aCBBc3NlcnRKVW5pdC5mYWlsKCkgKDUuMTQuMi4yKQorQWRkZWQ6IEpVbml0IGNvbnZlcnNpb246IHJlcGxhY2VzIEFzc2VydCB3aXRoIEFzc2VydEpVbml0ICg1LjE0LjIuMSkKK0FkZGVkOiBUaGUgcHJvZ3Jlc3MgYmFyIGlzIG5vdyBvcmFuZ2UgaWYgdGhlIHN1aXRlIGNvbnRhaW5lZCBza2lwcGVkIHRlc3RzIGFuZCBubyBmYWlsdXJlcworQWRkZWQ6IFNraXBwZWQgdGVzdCBhbmQgc3VpdGUgaWNvbnMgYXJlIG5vdyBvcmFuZ2UgKHByZXZpb3VzbHk6IGJsdWUpCitBZGRlZDogTmV3IG1ldGhvZCBzaG9ydGN1dHM6ICJBbHQrU2hpZnQrWCBOIiwgIkFsdCtTaGlmdCtEIE4iIChTdmVuIEpvaGFuc3NvbikKK0FkZGVkOiAiQ3JlYXRlIFRlc3RORyBjbGFzcyIgY29udGV4dCBtZW51CitBZGRlZDogV2hlbiBnZW5lcmF0aW5nIGEgbmV3IGNsYXNzLCBoYW5kbGUgb3ZlcnJpZGRlbiBtZXRob2RzIGJ5IGdlbmVyYXRpbmcgbWFuZ2xlZCB0ZXN0IG1ldGhvZCBuYW1lcworRml4ZWQ6IEdyZWVuIG5vZGVzIGNvdWxkIG92ZXJyaWRlIHJlZCBwYXJlbnQgbm9kZXMgYmFjayB0byBncmVlbgorRml4ZWQ6IFdhcyB0cnlpbmcgdG8gbG9hZCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgWE1MIHRlbXBsYXRlIGZpbGUKK0ZpeGVkOiBTdGFjayB0cmFjZXMgb2Ygc2tpcHBlZCB0ZXN0cyB3ZXJlIG5vdCBzaG93aW5nIGluIHRoZSBFeGNlcHRpb24gdmlldworRml4ZWQ6IFhNTCBmaWxlcyBzaG91bGQgYmUgcnVuIGluIHBsYWNlIGFuZCBub3QgY29waWVkLgorRml4ZWQ6IE5QRSB3aGVuIHlvdSBzZWxlY3QgYSBwYXNzZWQgdGVzdCBhbmQgY2xpY2sgb24gdGhlIENvbXBhcmUgUmVzdWx0IGljb24gKE1vaGFtZWQgTWFuc291cikKK0ZpeGVkOiBXaGVuIHRoZSBydW4gaXMgb3ZlciwgdGhlIHBsdWctaW4gd2lsbCBubyBsb25nZXIgZm9yY2UgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIENvbnNvbGUgdmlldworRml4ZWQ6IFRoZSBjb3VudGVyIGluIHRoZSBwcm9ncmVzcyBiYXIgc29tZXRpbWVzIHdlbnQgb3ZlciB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3QgbWV0aG9kcyAoNS4xNC4yLjkpCitGaXhlZDogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuRXJyb3JWaWV3UGFydCBjYW5ub3QgYmUgY2FzdCB0byBvcmcudGVzdG5nLmVjbGlwc2UudWkuVGVzdFJ1bm5lclZpZXdQYXJ0ICg1LjE0LjIuOSkKK0ZpeGVkOiBXb3Jrc3BhY2UgcHJlZmVyZW5jZXMgbm93IG9mZmVyIHRoZSAiWE1MIHRlbXBsYXRlIiBvcHRpb24gYXMgd2VsbCBhcyB0aGUgcHJvamVjdCBzcGVjaWZpYyBwcmVmZXJlbmNlcyAoQXNpZWwgQnJ1bWZpZWxkKQorRml4ZWQ6IFRFU1RORy00MTg6IE9ubHkgbGFzdCBzdWl0ZS1maWxlIGluIHRlc3RuZy54bWwgcnVuIGJ5IEVjbGlwc2UgcGx1Z2luCisKK0RvY3VtZW50YXRpb246CitBZGRlZDogU2VjdGlvbiBvbiBTZWxlbml1bSAoRmVsaXBlIEtub3JyIEt1aG4pCitBZGRlZDogTGluayB0byBhbiBhcnRpY2xlIG9uIFRlc3RORywgTW9ja2l0byBhbmQgRW1tYSBpbiB0aGUgTWlzYyBzZWN0aW9uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis1LjE0LjcKKzIwMTEvMDEvMjcKKworUmVsZWFzZSBmb3IgSURFQQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNS4xNC4xCisyMDEwLzEwLzIKKworRml4ZWQ6IFRFU1RORy00MDE6IENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIHVzaW5nIGEgbGlzdGVuZXIgZnJvbSBNYXZlbgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNS4xNAorMjAxMC8wOC8yOAorCitBZGRlZDogdGVzdCBzdWl0ZXMgY2FuIG5vdyBiZSBydW4gaW4gcGFyYWxsZWwgd2l0aCAtc3VpdGV0aHJlYWRwb29sc2l6ZQorRml4ZWQ6IEBMaXN0ZW5lcnMgbm93IGFnZ3JlZ2F0ZSB0aHJvdWdoIGJhc2UgY2xhc3NlcworRml4ZWQ6IElTdWl0ZSB3YXMgbm8gbG9uZ2VyIHNlcmlhbGl6YWJsZQorRml4ZWQ6IEluamVjdGlvbiB3YXMgc29tZXRpbWVzIG5vdCB3b3JraW5nIHByb3Blcmx5IHdoZW4gdXNlZCB3aXRoIEBQYXJhbWV0ZXJzCitGaXhlZDogVEVTVE5HLTQwMDogYWZ0ZXJNZXRob2Qgd2FzIGNhbGxlZCBhZnRlciBvblRlc3RGYWlsdXJlKCkKK0ZpeGVkOiAiZXhjbHVkZWRncm91cHMiIHdhcyBub3Qgd29ya2luZyBvbiB0aGUgYW50IHRhc2sgYmVjYXVzZSBvZiBhIHR5cG8KK0ZpeGVkOiBhbnQgdGFzayBlcnJvciBpZiA8Y2xhc3NmaWxlc2V0PiBpcyB1c2VkIHdpdGggbm8gY2xhc3NlcyAod2VsZXg5MSkKK0ZpeGVkOiBURVNUTkctNDA0OiB0aHJlYWRlZCB0ZXN0cyBmYWlsIGR1ZSB0byB1c2Ugb2Ygbm9uLXRocmVhZHNhZmUgY29sbGVjdGlvbnMgKE1hcmN1cyBCZXR0ZXIpCitGaXhlZDogcHJlc2VydmUtb3JkZXIgd2FzIG5vdCBwcmVzZXJ2aW5nIGNsYXNzIG9yZGVyIHdpdGggZGVwZW5kZW50IG1ldGhvZHMKK0ZpeGVkOiBSZXRyeUFuYWx5emVyIHdhc24ndCB3b3JraW5nIHByb3Blcmx5IHdpdGggZmFjdG9yaWVzCitGaXhlZDogVGhlIGFudCB0YXNrIHdhcyBubyBsb25nZXIgc3VwcG9ydGluZyAnLCcgZm9yIHRlc3RjbGFzcworCitFY2xpcHNlOgorCitGaXhlZDogVGhlIHBsdWctaW4gd2Fzbid0IHJ1bm5pbmcgR3Jvb3Z5IHRlc3RzIGNvcnJlY3RseSAoQW5kcmV3IEVpc2VuYmVyZykKK0ZpeGVkOiBURVNUTkctNDAyIFtFY2xpcHNlIFBsdWctSW5dIE5QRSBvY2N1cnJlZCB3aGVuIEkgcnVuIHR3aWNlIGEgY3VzdG9tICJSdW4gY29uZmlndXJhdGlvbiIgb24gYSBncm91cAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNS4xMy4xCisyMDEwLzA4LzA1CisKK0FkZGVkOiAtbWV0aG9kcworQWRkZWQ6IC1jb25maWdmYWlsdXJlcG9saWN5IChUb2RkIFF1ZXNzZW5iZXJyeSkKK0FkZGVkOiAtbWV0aG9kc2VsZWN0b3JzIChUb2RkIFF1ZXNzZW5iZXJyeSkKK0FkZGVkOiBATm9JbmplY3Rpb24KK0FkZGVkOiA8dGVzdCBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CitBZGRlZDogLXRlc3RuYW1lcyAoY29tbWFuZCBsaW5lKSBhbmQgdGVzdG5hbWVzIChhbnQpCitBZGRlZDogTmV3IGFudCB0YXNrIHRhZzogIHByb3BlcnR5c2V0IChUb2RkIFdlbGxzKQorQWRkZWQ6IElUZXN0TkdMaXN0ZW5lckZhY3RvcnkKK0FkZGVkOiBQYXNzaW5nIGNvbW1hbmQgbGluZSBwcm9wZXJ0aWVzIHZpYSB0aGUgYW50IHRhc2sgYW5kIGRvYyB1cGRhdGUgKFRvZGQgV2VsbHMpCitBZGRlZDogSGllcmFyY2hpY2FsIFhtbFN1aXRlcyAoTmFsaW4gTWFrYXIpIAorQWRkZWQ6IFJlcG9ydGVyI2NsZWFyKCkKK0ZpeGVkOiBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGEgc3VpdGUgcHJvZHVjZXMgbm8gcmVzdWx0cyAoQ2VmbiBIb2lsZSkKK0ZpeGVkOiBJZGVudGljYWwgY29uZmlndXJhdGlvbiBtZXRob2RzIHdlcmUgbm90IGFsd2F5cyBpbnZva2VkIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHN1cGVyY2xhc3NlcyAoTmFsaW4gTWFrYXIpIAorRml4ZWQ6IEBEYXRhUHJvdmlkZXIocGFyYWxsZWwgPSB0cnVlKSB3YXMgcGFzc2luZyBpbmNvcnJlY3QgcGFyYW1ldGVycyB3aXRoIGluamVjdGlvbgorRml4ZWQ6IFJlcGxhY2VkIEBUZXN0KHNlcXVlbnRpYWwpIHdpdGggQFRlc3Qoc2luZ2xlVGhyZWFkZWQpCitGaXhlZDogSWYgaW5oZXJpdGVkIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBoYWQgZGVmaW5lZCBkZXBzLCB0aGV5IGNvdWxkIGJlIGludm9rZWQgaW4gaW5jb3JyZWN0IG9yZGVyIChOYWxpbiBNYWthcikKK0ZpeGVkOiBJbml0aWFsaXplIGFsbCBTdWl0ZS9UZXN0IHJ1bm5lcnMgYXQgYmVnaW5uaW5nIHRvIGNhdGNoIGNvbmZpZ3VyYXRpb24gaXNzdWVzIHJpZ2h0IGF0IHN0YXJ0IChOYWxpbiBNYWthcikKK0ZpeGVkOiBJc3N1ZTc6IElzc3VlODYgSW5jb3JyZWN0IGRhdGVzIHJlcG9ydGVkIGZvciBjb25maWd1cmF0aW9uIG1ldGhvZHMKK0ZpeGVkOiBJc3N1ZTI0OiBPT00gZXJyb3JzIGluIFN1aXRlSFRNTFJlcG9ydGVyIChOYWxpbiBNYWthcikKK0ZpeGVkOiBUaW1lIG91dHMgc3BlY2lmaWVkIGluIFhNTCB3ZXJlIG5vdCBob25vcmVkIGZvciA8c3VpdGUgcGFyYWxsZWw9InRlc3RzIj4KK0ZpeGVkOiA8c3VpdGU+IGFuZCA8dGVzdD4gdGltZSBvdXRzIHdlcmUgaGFyZGNvZGVkLCB0aGV5IG5vdyBob25vciB0aGVpciB0aW1lLW91dCBhdHRyaWJ1dGUKK0ZpeGVkOiBUZXN0Tkcgd2FzIGhhbmdpbmcgaWYgbm8gdGVzdCBtZXRob2RzIHdlcmUgZm91bmQKK0ZpeGVkOiBvblRlc3RTdWNjZXNzKCkgd2FzIGNhbGxlZCBhZnRlciBAQWZ0ZXJNZXRob2QgaW5zdGVhZCBvZiBhZnRlciB0aGUgdGVzdCBtZXRob2QgKHRlc3Q6IHRlc3QubGlzdGVuZXIuTGlzdGVuZXJUZXN0KQorRml4ZWQ6IFhNTCB0ZXN0IHJlc3VsdHMgY29udGFpbmVkIHNraXBmYWlsZWRpbnZvY2F0aW9uQ291bnRzIGluc3RlYWQgb2Ygc2tpcGZhaWxlZGludm9jYXRpb25jb3VudHMKK0ZpeGVkOiBJc3N1ZTQgYXNzZXJ0RXF1YWxzIGZvciBwcmltaXRpdmUgYXJyYXlzLCBJc3N1ZTM0IGFzc2VydE51bGwgamF2YWRvYyB1cGRhdGVkCitGaXhlZDogSXNzdWU3OCBOUEUgd2l0aCBub24tcHVibGljIGNsYXNzLiBOb3cgdGhyb3dzIFRlc3RORyBleGNlcHRpb24KK0ZpeGVkOiBOUEUgd2l0aCBAT3B0aW9uYWwgbnVsbCBwYXJhbWV0ZXJzIChZdmVzIERlc3NlcnRpbmUpCitGaXhlZDogVEVTVE5HLTM4NyBUZXN0Tkcgbm90IHJlcnVubmluZyB0ZXN0IG1ldGhvZCB3aXRoIHRoZSByaWdodCBkYXRhIHNldCBmcm9tIERhdGEgUHJvdmlkZXIgKEZyYW5jb2lzIFJleW5hdWQpCitGaXhlZDogU2hvdyBjb3JyZWN0IG51bWJlciBvZiBwYXNzL2ZhaWxlZCBudW1iZXJzIGZvciB0ZXN0cyB1c2luZyBARGF0YVByb3ZpZGVyCitGaXhlZDogUmV0dXJuIGNvcnJlY3QgbWV0aG9kIHN0YXR1cyBhbmQgZXhjZXB0aW9uIChpZiBhbnkpIGluIEludm9rZWRNZXRob2RMaXN0ZW5lci5hZnRlckludm9jYXRpb24oKSAKK0ZpeGVkOiBUcml2aWFsIGZpeGVzOiBURVNUTkctMjQxIChsb2cgbWVzc2FnZSBhdCBJbmZvKSwgSXNzdWUyICh0aHJvdyBTQVhFeGNlcHRpb24gYW5kIG5vdCBOUEUgZm9yIGludmFsaWQgdGVzdG5nIHhtbCkgCitGaXhlZDogQ29uZmlndXJhdGlvbiBtZXRob2RzIGNvdWxkbid0IGRlcGVuZCBvbiBhbiBhYnN0cmFjdCBtZXRob2QgKE5hbGluIE1ha2FyKSAKK0ZpeGVkOiBUZXN0Tkcjc2V0VGVzdENsYXNzZXMgd2FzIG5vdCByZXNldHRpbmcgbV9zdWl0ZXMKK0ZpeGVkOiBFeGNlcHRpb25zIHRocm93biBieSBJSW52b2tlZE1ldGhvZExpc3RlbmVycyB3ZXJlIG5vdCBjYXVnaHQgKE5hbGluIE1ha2FyKQorRml4ZWQ6IEBMaXN0ZW5lcnMgbm93IHdvcmtzIG9uIGJhc2UgY2xhc3NlcyBhcyB3ZWxsCitGaXhlZDogVGVzdCBwcmlvcml0aWVzIHdlcmUgbm90IHdvcmtpbmcgcHJvcGVybHkgaW4gbm9uLXBhcmFsbGVsIG1vZGUKK0ZpeGVkOiBATGlzdGVuZXJzIHdhc24ndCB3b3JraW5nIHByb3Blcmx5IHdpdGggSVRlc3RMaXN0ZW5lcgorCitFY2xpcHNlCisKK0ZpeGVkOiBURVNUTkctMzk1IE5ldyB3aXphcmQgd2FzIGNyZWF0aW5nIGNsYXNzZXMgY2FsbGVkICJOZXdUZXN0IgorRml4ZWQ6IFRFU1RORy0zOTcgQ2xhc3MgbGV2ZWwgQFRlc3Qgd2FzIHByZXZlbnRpbmcgZ3JvdXBzIGZyb20gc2hvd2luZyB1cCBpbiB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KKworRG9jCitVcGRhdGVkIE1hdmVuIGRvY3VtZW50YXRpb24gKEJyZXR0IFBvcnRlcikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzUuMTIuMQorMjAxMC8wMy8yOQorCitNYXZlbiB1cGRhdGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjEyCisKK1JlbW92ZWQ6IEphdmFkb2MgYW5ub3RhdGlvbiBzdXBwb3J0CisKK0FkZGVkOiBATGlzdGVuZXJzCitBZGRlZDogSUF0dHJpYnV0ZXMjZ2V0QXR0cmlidXRlTmFtZXMgYW5kIElBdHRyaWJ1dGVzI3JlbW92ZUF0dHJpYnV0ZQorQWRkZWQ6IHRlc3RuZy1yZXN1bHRzLnhtbCBub3cgaW5jbHVkZXMgdGVzdCBkdXJhdGlvbiBpbiB0aGUgPHN1aXRlPiB0YWcgKENvc21pbiBNYXJnaW5lYW4pCitBZGRlZDogSW5qZWN0aW9uIG5vdyB3b3JrcyBmb3IgZGF0YSBwcm92aWRlcnMKK0FkZGVkOiBUZXN0Tkcjc2V0T2JqZWN0RmFjdG9yeShJT2JqZWN0RmFjdG9yeSkKK0FkZGVkOiBQcmlvcml0aWVzOiBAVGVzdChwcmlvcml0eSA9IC0xKQorQWRkZWQ6IE5ldyBhdHRyaWJ1dGUgaW52b2NhdGlvbi1udW1iZXJzIGluIDxpbmNsdWRlPgorQWRkZWQ6IHRlc3RuZy1mYWlsZWQueG1sIG9ubHkgY29udGFpbnMgdGhlIGRhdGEgcHJvdmlkZXIgaW52b2NhdGlvbnMgdGhhdCBmYWlsZWQKK0FkZGVkOiBJSW52b2tlZE1ldGhvZExpc3RlbmVyMiB0byBoYXZlIGFjY2VzcyB0byBJVGVzdENvbnRleHQgaW4gbGlzdGVuZXJzIChLYXJ0aGlrIEtyaXNobmFuKQorRml4ZWQ6IEBCZWZvcmUgbWV0aG9kcyBydW4gZnJvbSBmYWN0b3JpZXMgd2VyZSBub3QgcHJvcGVybHkgaW50ZXJsZWF2ZWQKK0ZpeGVkOiBUaGUgVGV4dFJlcG9ydGVyIHJlcG9ydHMgc2tpcHBlZCB0ZXN0cyBhcyBQQVNTRUQgKEFua3VyIEFncmF3YWwpCisKK0VjbGlwc2U6CisKK0FkZGVkOiBOZXcgZmlsZSB3aXphcmQ6IGNhbiBub3cgY3JlYXRlIGEgY2xhc3Mgd2l0aCBhbm5vdGF0aW9ucywgaW5jbHVkaW5nIEBEYXRhUHJvdmlkZXIKK0FkZGVkOiBZb3UgY2FuIG5vdyBzZWxlY3QgbXVsdGlwbGUgWE1MIHN1aXRlcyB0byBiZSBydW4gaW4gdGhlIGxhdW5jaCBkaWFsb2cKK0ZpeGVkOiBAVGVzdChncm91cHMgPSA8Y29uc3RhbnQ+KSB3YXMgdGFraW5nIG5hbWUgb2YgdGhlIGNvbnN0YW50IGluc3RlYWQgb2YgaXRzIHZhbHVlLgorRml4ZWQ6IGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvR1JFQ0xJUFNFLTQ3NiBOUEUgd2l0aCBHcm9vdnkgVGVzdHMgKEFuZHJldyBFaXNlbmJlcmcpCitGaXhlZDogVGhlIGN1c3RvbSBYTUwgZmlsZSBpcyBub3cgY3JlYXRlZCBpbiB0aGUgdGVtcCBkaXJlY3RvcnkgaW5zdGVhZCBvZiBpbnNpZGUgdGhlIHByb2plY3QKK0ZpeGVkOiBJbiB0aGUgbGF1bmNoIGRpYWxvZywgbm93IGRpc3BsYXkgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHBpY2sgZ3JvdXBzIHdoZW4gbm8gcHJvamVjdCBpcyBzZWxlY3RlZAorRml4ZWQ6IFdhcyBub3Qgc2V0dGluZyB0aGUgcGFyYWxsZWwgYXR0cmlidXRlIGNvcnJlY3RseSBvbiB0aGUgdGVtcG9yYXJ5IFhNTCBmaWxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS4xMQorMjAwOS8xMi8wOAorCitBZGRlZDogRGVwZW5kZW50IG1ldGhvZHMgY2FuIG5vdyBydW4gaW4gdGhlaXIgb3duIHRocmVhZAorQWRkZWQ6IGRhdGFQcm92aWRlclRocmVhZENvdW50IGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZCBmcm9tIGFudCAoQWRyaWFuIEdyZWFsaXNoKQorQWRkZWQ6IElUZXN0QW5ub3RhdGlvbiNzZXREYXRhUHJvdmlkZXIKK0FkZGVkOiBBc3NlcnQjYXNzZXJ0RXF1YWxzKCkgbWV0aG9kcyBmb3IgU2V0cyBhbmQgTWFwcworRml4ZWQ6IFRoZSB0ZXh0IHJlcG9ydGVyIHdhcyBubyBsb25nZXIgcmVwb3J0aW5nIHN0YWNrIHRyYWNlcyBmb3IgdmVyYm9zZSA+PSAyCitGaXhlZDogZGF0YVByb3ZpZGVyQ2xhc3Mgd2FzIG5vdCByZXNwZWN0aW5nIGluaGVyaXRhbmNlIChsaWtlIG1vc3QgYXR0cmlidXRlcyBzdGlsbCkKK0ZpeGVkOiBAQmVmb3JlU3VpdGUvQEFmdGVyU3VpdGUgd291bGQgcnVuIG11bHRpcGxlIHRpbWVzIHdoZW4gdXNlZCBpbiBhIEBGYWN0b3J5CitGaXhlZDogcGFja2FnZXM9Ii4qIiB3YXNuJ3Qgd29ya2luZyBwcm9wZXJseSAoc2FuZG9wb2x1cykKK0ZpeGVkOiBUZXN0UmVzdWx0I2dldE5hbWUgbm93IHJldHVybnMgdGhlIGRlc2NyaXB0aW9uIGluc3RlYWQgb2YgdGhlIG1ldGhvZAorRml4ZWQ6IEBEYXRhUHJvdmlkZXIgYW5kIGRlcGVuZGVudCBtZXRob2RzIHdlcmUgbm90IHNraXBwaW5nIGNvcnJlY3RseSAoRnJhbmNvaXMgUmV5bmF1ZCkKK0ZpeGVkOiBURVNUTkctMzQ3IHN1aXRlIHdpdGggcGFyYWxsZWw9InRlc3RzIiBhbmQgdGVzdCB3aXRoIHBhcmFsbGVsPSJjbGFzc2VzIiBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IChSb2IgQWxsZW4pCitGaXhlZDogVEVTVE5HLTY3OiBAQ29uZmlndXJhdGlvbi9ARmFjdG9yeSBtZXRob2RzIGluIGJhc2UgY2xhc3MgYmVpbmcgaWdub3JlZAorRml4ZWQ6IElubmVyIHRlc3QgY2xhc3NlcyB3ZXJlIG5vdCBleGNsdWRlZCBwcm9wZXJseSAoQ2Fyc3RlbiBHdWJlcm5hdG9yKQorRml4ZWQ6IHRocmVhZFBvb2xTaXplIHdpdGhvdXQgaW52b2NhdGlvbkNvdW50IHdhcyBjYXVzaW5nIHJlcG9ydGVycyBub3QgdG8gYmUgaW52b2tlZAorRml4ZWQ6IEEgQEZhY3RvcnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGRpZCBub3QgY2F1c2UgYW55IGVycm9yCitGaXhlZDogPGNsYXNzZmlsZXNldHJlZj4gd2FzIG5vdCB3b3JraW5nIHByb3Blcmx5IGluIHRoZSBhbnQgdGFzayAoRWQgUmFuZGFsbCkKK0ZpeGVkOiBAQmVmb3JlQ2xhc3MgbWV0aG9kcyB3ZXJlIG5vdCBydW5uaW5nIGluIHBhcmFsbGVsIChBaWRhbiBTaG9ydCkKK0ZpeGVkOiBUZXN0IGNsYXNzIHdpdGggQE9iamVjdEZhY3RvcnkgZG9lc24ndCBnZXQgaW5zdGFudGlhdGVkIHZpYSB0aGUgZmFjdG9yeQorRml4ZWQ6IEFsbG93IElPYmplY3RGYWN0b3J5IHRvIGxvYWQgZnJvbSBub24tc3RhbmRhcmQgY2xhc3Nsb2FkZXIgKGZvciBQb3dlck1vY2sgc3VwcG9ydCkKKworRWNsaXBzZSA1LjExLjAuMTk6CitBZGRlZDogTmV3ICJwYXJhbGxlbCIgcHJlZmVyZW5jZSBzZXR0aW5nIChXaW5kb3dzIC8gUHJlZmVyZW5jZXMgLyBUZXN0TkcpCitGaXhlZDogSUlpbnZva2VkTWV0aG9kTGlzdGVuZXJzIHdlcmUgbm90IGludm9rZWQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjEwCisKK0FkZGVkOiBUaGUgb3V0cHV0IGluIHRoZSB0ZXN0bmctcmVzdWx0cy54bWwgaXMgbm93IHNvcnRlZCBieSB0aGUgc3RhcnRpbmcgdGltZXN0YW1wIChEYW5pZWwgUnVkbWFuKQorQWRkZWQ6IEJldHRlciBkaXNwbGF5IG9mIHRoZSB0ZXN0IG5hbWUgYW5kIG1ldGhvZCBkZXNjcmlwdGlvbiBpbiB0aGUgZGVmYXVsdCBhbmQgRW1haWxhYmxlIHJlcG9ydAorQWRkZWQ6IElmIGJvdGggLXRlc3RqYXIgYW5kIGFuIFhNTCBmaWxlIGFyZSBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgbGF0dGVyIHdpbGwgYmUgdXNlZAorQWRkZWQ6IEBCZWZvcmUgYW5kIEBBZnRlciBtZXRob2RzIGNhbiBiZSBpbmplY3RlZCB3aXRoIHRoZSBjdXJyZW50IFhtbFRlc3QKK0FkZGVkOiBNZXRob2RzIHRoYXQgdGltZSBvdXQgbm93IGRpc3BsYXkgdGhlIHN0YWNrIHRyYWNlIHNob3dpbmcgd2hlcmUgdGhlIHRpbWUgb3V0IG9jY3VycmVkCitBZGRlZDogSVRlc3RSZXN1bHQjZ2V0QXR0cmlidXRlIGFuZCBJVGVzdFJlc3VsdCNzZXRBdHRyaWJ1dGUKK0FkZGVkOiBAQWZ0ZXIgbWV0aG9kcyBjYW4gbm93IGJlIGluamVjdGVkIHdpdGggYW4gSVRlc3RSZXN1bHQKK0FkZGVkOiBAQmVmb3JlTWV0aG9kIGFuZCBAQWZ0ZXJNZXRob2QgbWV0aG9kcyBjYW4gbm93IGJlIGluamVjdGVkIGFuIElUZXN0UmVzdWx0CitBZGRlZDogSVN1aXRlI2dldEF0dHJpYnV0ZSBhbmQgSVN1aXRlI3NldEF0dHJpYnV0ZSB0byBzaGFyZSBkYXRhIHdpdGhpbiBhIHN1aXRlCitBZGRlZDogQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cCA9ICIuKmZvby4qIikKK0FkZGVkOiBARGF0YVByb3ZpZGVyKHBhcmFsbGVsPXRydWUpCitGaXhlZDogQFRlc3QoZGF0YVByb3ZpZGVyKSB3YXMgbm90IHdvcmtpbmcgYXQgdGhlIGNsYXNzIGxldmVsCitGaXhlZDogRGlzcGxheSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmIHRoZSB3cm9uZyBleGNlcHRpb24gaXMgdGhyb3duIHdpdGggYW4gZXhwZWN0ZWRFeGNlcHRpb25zCitGaXhlZDogQ2xhc3NlcyBjcmVhdGVkIGJ5IGZhY3RvcmllcyB3ZXJlIG5vdCBydW4gaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBjcmVhdGVkCitGaXhlZDogRGVwZW5kZW50IG1ldGhvZHMgYXJlIG5vdyBydW4gY2xvc2VyIHRvIG1ldGhvZHMgd2l0aGluIHRoZWlyIGNsYXNzCitGaXhlZDogeG1sRmlsZVNldCBpbiBhbnQgd2FzIG5vdCB3b3JraW5nIGNvcnJlY3RseSAoU2VhbiBTaG91KQorRml4ZWQ6IFZhcmlvdXMgb3ZlcnNpZ2h0cyBpbiB0aGUgRFREIChXaWxsIE1jUXVlZW4pCitGaXhlZDogWE1MVXRpbHMgd2FzIG5vdCBlc2NhcGluZyBYTUwgYXR0cmlidXRlIHZhbHVlcworRml4ZWQ6IFRFU1RORy0zMTc6IFNlcXVlbmNlIG9yZGVyIG1pcy1jYWxjdWxhdGlvbjogdGVzdGluZyB1c2luZyBzdWl0ZSBpbiBzZXF1ZW5jZSBmb3IgY2xhc3NlcyBhbmQgc2FtZSBtZXRob2QgbmFtZXMgY3JlYXRlcyBub24tc2VxdWVudGlhbCBvcmRlcgorRml4ZWQ6IFRlc3QgbmFtZXMgKGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgb3JnLnRlc3RuZy5JVGVzdCkgbm93IGFwcGVhciBtb3JlIHByb21pbmVudGx5IGluIHRoZSBIVE1MIHJlcG9ydHMKK0ZpeGVkOiBleHBlY3RlZEV4Y2VwdGlvbnM9UnVudGltZUV4Y2VwdGlvbi5jbGFzcyB3YXMgbm90IGZhaWxpbmcgd2hlbiBubyBleGNlcHRpb24gd2FzIHRocm93CitGaXhlZDogVEVTVE5HLTI5MTogRXhjZXB0aW9ucyB0aHJvd24gYnkgSXRlcmFibGUgRGF0YVByb3ZpZGVycyBhcmUgbm90IGNhdWdodCwgbm8gZmFpbGVkIHRlc3QgcmVwb3J0ZWQgKFJvYmVydG8gVHlsZXkpCitGaXhlZDogVEVTVE5HLTMwMTogTmVlZCB0byBpbmNsdWRlIHBhcmFtZXRlcnMgaW4gdGVzdE5HIHJlcG9ydCBmb3IgdGVzdCBjcmVhdGVkIGJ5IEBGYWN0b3J5CitGaXhlZDogdGVzdG5nLWZhaWxlZC54bWwgbm93IGluY2x1ZGVzIHNraXBwZWQgdGVzdHMKK0ZpeGVkOiBUZXN0TkcgY291bGRuJ3QgZmluZCBHcm9vdnkgZmlsZXMgKEhhdy1CaW4pCisKK0VjbGlwc2UKKworRml4ZWQ6IFRFU1RORy0zMTM6IFByb3ZpZGUgZXh0ZW5zaW9uIHBvaW50IHRvIGNvbnRyaWJ1dGUgdGVzdCBhbmQgcmVwb3J0IGxpc3RlbmVycyAoRXJpayBQdXRyeWN6KQorRml4ZWQ6IFF1aWNrIGZpeGVzIG5vIGxvbmdlciBpbnRyb2R1Y2UgZGVwcmVjYXRlZCBhbm5vdGF0aW9ucyAoR3JlZyBUdXJucXVpc3QpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS45CisyMDA5LzA0LzA5CisKK0FkZGVkOiBOZXcgYW50IHRhc2sgYm9vbGVhbiBmbGFnOiBkZWxlZ2F0ZUNvbW1hbmRTeXN0ZW1Qcm9wZXJ0aWVzIChKdXN0aW4pIAorQWRkZWQ6IHNraXBmYWlsZWRpbnZvY2F0aW9ucyB1bmRlciA8c3VpdGU+IGluIHRlc3RuZy0xLjAuZHRkIChHYWVsIE1hcnppb3UgLyBTdGV2byBTbGF2aWMpIAorQWRkZWQ6IC10ZXN0cnVuZmFjdG9yeSBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCBpbiB0aGUgYW50IHRhc2sgKFZpdGFseWkgUGFtYWpvbmtvdikKK0FkZGVkOiBURVNUTkctMjk4OiBwYXJhbGxlbD0iY2xhc3NlcyIsIHdoaWNoIGFsbG93cyBlbnRpcmUgY2xhc3NlcyB0byBiZSBydW4gaW4gdGhlIHNhbWUgdGhyZWFkCitBZGRlZDogQEJlZm9yZU1ldGhvZCBjYW4gbm93IGRlY2xhcmUgT2JqZWN0W10gYXMgYSBwYXJhbWV0ZXIsIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0ZXN0IG1ldGhvZAorQWRkZWQ6IElBbm5vdGF0aW9uVHJhbnNmb3JtZXIyCitBZGRlZDogQFRlc3QoaW52b2NhdGlvblRpbWVPdXQpLCB3aGljaCBsZXRzIHlvdSBzZXQgYSB0aW1lIG91dCBmb3IgdGhlIHRvdGFsIHRpbWUgdGFrZW4gYnkgaW52b2NhdGlvbkNvdW50CitBZGRlZDogSUludm9rZWRNZXRob2RMaXN0ZW5lcgorQWRkZWQ6IC10ZXN0amFyIHN1cHBvcnRzIGphciBmaWxlIHdpdGggbm8gdGVzdG5nLnhtbCBmaWxlCitGaXhlZDogSUludm9rZWRNZXRob2RMaXN0ZW5lciB3YXNuJ3QgcHJvcGVybHkgcmVjb2duaXplZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKExlb25hcmRvIFJhZmFlbGkpCitGaXhlZDogVEVTVE5HLTMwOSBJbGxlZ2FsIGRlZmF1bHQgdmFsdWUgZm9yIGF0dHJpYnV0ZSBpbiBEVEQgZmlsZQorRml4ZWQ6IFRFU1RORy0xOTI6IEpVbml0IFhNTCBvdXRwdXQgaW5jbHVkZXMgd3JvbmcgdGVzdHMgKEFsZWtzYW5kYXIgQm9yb2pldmljKQorRml4ZWQ6IFNldCBhIGdlbmVyYXRlZCBzdWl0ZSB0byBkZWZhdWx0IHRvIG5vbi1wYXJhbGxlbCAoTWFyayBEZXJyaWN1dHQpCitGaXhlZDogLXRlc3RKYXIgY29tbWFuZCBsaW5lIHBhcnNpbmcgYnVnCitGaXhlZDogdGVzdG5nLWZhaWxlZC54bWwgZGlkbid0IGluY2x1ZGUgdGhlIGxpc3RlbmVycworRml4ZWQ6IGFubm90YXRpb24gdHJhbnNmb3JtZXJzIHdlcmUgbm90IHJ1biB3aGVuIHNwZWNpZmllZCBpbiB0ZXN0bmcueG1sCitGaXhlZDogVEVTVE5HLTE5MjogSlVuaXQgWE1MIG91dHB1dCBpbmNsdWRlcyB3cm9uZyB0ZXN0cyAoQm9yb2pldmljKQorRml4ZWQ6IEBQYXJhbWV0ZXJzIHdhcyBub3Qgd29ya2luZyBjb3JyZWN0bHkgb24gQEJlZm9yZU1ldGhvZHMgd2l0aCBARGF0YVByb3ZpZGVyIHVzZWQgb24gQFRlc3QgbWV0aG9kcworRml4ZWQ6IHRlc3RuZy1mYWlsZWQueG1sIHdhcyBzb21ldGltZXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIChCb3JvamV2aWMpCitGaXhlZDogVGVzdE5HLTIyODogQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIKK0ZpeGVkOiBUZXN0TkctMjI5OiBBc3NlcnQuYXNzZXJ0RXF1YWxzIGRvZXMgbm90IGJlaGF2ZSBwcm9wZXJseSB3aGVuIGFyZ3VtZW50cyBhcmUgc2V0cworRml4ZWQ6IFRFU1RORy0zNjogYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb24gYWN0dWFsLCBDb2xsZWN0aW9uIGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgbWF5IGhhdmUgYnVnCitGaXhlZDogVEVTVE5HLTI5NjogTWFsZm9ybWVkIGphciBVUkxzIGJyZWFraW5nIC10ZXN0SmFyCitGaXhlZDogVEVTVE5HLTI5NzogVGVzdE5HIHNlZW1pbmdseSBuZXZlciBzdG9wcyBydW5uaW5nIHdoaWxlIGJ1aWxkaW5nIGZhaWxlZCB0ZXN0IHN1aXRlIChHcmVnZyBZb3N0KQorRml4ZWQ6IFRFU1RORy0yODU6IEBUZXN0KHNlcXVlbnRpYWw9dHJ1ZSkgd29ya3MgaW5jb3JyZWN0bHkgZm9yIGNsYXNzZXMgd2l0aCBpbmhlcml0YW5jZQorRml4ZWQ6IFRFU1RORy0yNTQ6IFhNTFN1aXRlIHRvWE1MKCkgaWdub3JlcyBsaXN0ZW5lcnMKK0ZpeGVkOiBURVNUTkctMjc2OiBUaHJlYWQgc2FmZXR5IHByb2JsZW0gaW4gUmVwb3J0ZXIgY2xhc3MKK0ZpeGVkOiBURVNUTkctMjc3OiBNYWtlIFJlcG9ydGVyLmdldEN1cnJlbnRUZXN0UmVzdWx0KCkgcHVibGljCitGaXhlZDogUG90ZW50aWFsIE5QRSBpbiBYbWxUZXN0I2dldFZlcmJvc2UgKFJ5YW4gTW9yZ2FuKQorRml4ZWQ6IEVtYWlsYWJsZVJlcG9ydGVyIG9ubHkgZGlzcGxheWVkIHRoZSBmaXJzdCBncm91cCBmb3IgZWFjaCB0ZXN0IG1ldGhvZAorRml4ZWQ6IHRpbWUtb3V0cyB3ZXJlIG5vdCB3b3JraW5nIGluIDx0ZXN0PiBhbmQgPHN1aXRlPgorRml4ZWQ6IEBCZWZvcmVUZXN0IGZhaWxpbmcgaW4gYSBiYXNlIGNsYXNzIHdvdWxkIG5vdCBjYXVzZSBzdWJzZXF1ZW50IHRlc3QgbWV0aG9kcyB0byBiZSBza2lwcGVkCitGaXhlZDogVEVTVE5HLTE5NTogQEFmdGVyTWV0aG9kIGhhcyBubyB3YXkgb2Yga25vd2luZyBpZiB0aGUgY3VycmVudCB0ZXN0IGZhaWxlZAorRml4ZWQ6IFRFU1RORy0yNDk6IE92ZXJyaWRkZW4gdGVzdCBtZXRob2RzIHdlcmUgc2hhZG93aW5nIGVhY2ggb3RoZXIgaWYgc3BlY2lmaWVkIHdpdGggPGluY2x1ZGU+CitGaXhlZDogRGF0YVByb3ZpZGVycyBmcm9tIEBGYWN0b3J5LWNyZWF0ZWQgdGVzdHMgd2VyZSBhbGwgaW52b2tlZCBmcm9tIHRoZSBzYW1lIGluc3RhbmNlCitGaXhlZDogZW5hYmxlZCB3YXMgbm90IHdvcmtpbmcgb24gY29uZmlndXJhdGlvbiBtZXRob2RzCitGaXhlZDogSUlpbnZva2VkTWV0aG9kTGlzdGVuZXIgd2FzIG5vdCBjb3JyZWN0bHkgYWRkZWQgaW4gVGVzdE5HCitGaXhlZDogTlBFIGluIFhtbFN1aXRlI3RvWG1sCitGaXhlZDogVEVTVE5HLTIzMTogTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGNvbnZlcnRpbmcgYSBzdWl0ZSB0byBYTUwgKE1hcmspCisKK0RvYzoKK0FkZGVkOiA1LjIwOiBJSW52b2tlZE1ldGhvZExpc3RlbmVyCitBZGRlZDogLXRlc3RqYXIKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjgKKworRml4ZWQ6IFRlc3RORy0yMjA6IElnbm9yZSBjbGFzcyBkZWZpbml0aW9uL2xvYWRlciBpc3N1ZXMgd2hlbiBzY2FubmluZyBjbGFzc3BhdGggZm9yIGltcGxpY2l0IGNsYXNzZXMKK0ZpeGVkOiBUZXN0TkctMjI0OiBGaXggZm9yIHJlbGF0aXZlIHN1aXRlIGZpbGVuYW1lcyBpbiBYTUwgZmlsZQorQWRkZWQ6IFRlc3RORy0yMTM6IEBPcHRpb25hbCBvbiBhIG1ldGhvZCBwYXJhbWV0ZXIgdG8gYWxsb3cgb3B0aW9uYWwgQFBhcmFtZXRlcnMKK0ZpeGVkOiBUZXN0TkctMjE0OiBTa2lwRXhjZXB0aW9uIGFuZCBUaW1lQm9tYlNraXBFeGNlcHRpb24gc2hvdWxkIGFjY2VwdCBuZXN0ZWQgZXhjZXB0aW9ucworRml4ZWQ6IFRlc3RORy0yMTE6IG5ldyBQYXJzZXIoaW5wdXRTdHJlYW0pIGRvZXNuJ3Qgd29yaworQWRkZWQ6IE1ldGhvZHMgdGhhdCBmb3JtIGEgY3ljbGUgYXJlIG5vdyBzaG93biB3aGVuIHRoZSBjeWNsZSBpcyBkZXRlY3RlZAorQWRkZWQ6IFN1cHBvcnQgZm9yIDxsaXN0ZW5lcnM+IGluIHRlc3RuZy54bWwKK0FkZGVkOiBJTWV0aG9kSW50ZXJjZXB0b3IKK0FkZGVkOiBAVGVzdEluc3RhbmNlIG9uIGEgZGF0YSBwcm92aWRlciBtZXRob2QgcGFyYW1ldGVyCitGaXhlZDogQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSkgZGlkbid0IHdvcmsgcHJvcGVybHkgd2l0aCBkYXRhIHByb3ZpZGVycworQWRkZWQ6IGFudGxpYi54bWwgdG8gYWxsb3cgYXV0b2Rpc2NvdmVyeSBvZiBBbnQgdGFzayBkZWZpbml0aW9uCitGaXhlZDogbmFtZSBhdHRyaWJ1dGUgb24gPHRlc3Q+IGlzIHJlcXVpcmVkCisKK0RvYzoKK0FkZGVkOiBNZXRob2QgSW50ZXJjZXB0b3IKK0FkZGVkOiBAT3B0aW9uYWwKK0FkZGVkOiBEb2MgZm9yIElNZXRob2RJbnRlcmNlcHRvciAoNS4xNikgYW5kIFRlc3RORyBsaXN0ZW5lcnMgKDUuMTgpCitBZGRlZDogNS4xOTogRGVwZW5kZW5jeSBpbmplY3Rpb24KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjcKKworQWRkZWQ6IEBCZWZvcmVNZXRob2QoZmlyc3RUaW1lT25seSkgYW5kIEBBZnRlck1ldGhvZChsYXN0VGltZU9ubHkpCitBZGRlZDogQEJlZm9yZU1ldGhvZHMgY2FuIG5vdyB0YWtlIGEgTWV0aG9kIGFuZCBJVGVzdENvbnRleHQgcGFyYW1ldGVycyAobGlrZSBARGF0YVByb3ZpZGVyKQorRml4ZWQ6IGxvZ2dpbmcgYWJvdXQgYWJzdHJhY3QgY2xhc3NlcyBtb3ZlZCB0byBsZXZlbCA1CitBZGRlZDogaWYgQFBhcmFtZXRlciBpcyBtaXNzaW5nIGZyb20gdGVzdG5nLnhtbCB0aGVuIGl0IGlzIHJlYWQgZnJvbSB0aGUgU3lzdGVtIHByb3BlcnRpZXMKK0ZpeGVkOiBEb24ndCBydW4gYSBARGF0YVByb3ZpZGVyIG1ldGhvZCBhcyBhIHRlc3Qgd2hlbiBhIGNsYXNzLWxldmVsIEBUZXN0IGlzIHByZXNlbnQKK0FkZGVkOiBBdHRyaWJ1dGUgQFRlc3Qjc2tpcEZhaWxlZEludm9jYXRpb25zCitGaXhlZDogVEVTVE5HLTE2OSBFcnJvciBtZXNzYWdlOiA8bWV0aG9kPiBpcyBkZXBlbmRpbmcgb24gbm9uZXhpc3RlbnQgbWV0aG9kIG51bGwgKCJudWxsIiBpcyB1bmluZm9ybWF0aXZlKQorRml4ZWQ6IC1saXN0ZW5lciB0YWtlcyBjb21tYS1zZXBhcmF0ZWQgY2xhc3NlcworQWRkZWQ6IFJldHJ5QW5hbHl6ZXIgKGV4cGVyaW1lbnRhbCkgKEplcmVtaWUpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS42CisyMDA3LzA2LzE0CisKK0FkZGVkOiBTa2lwRXhjZXB0aW9uL1RpbWVCb21iZWRTa2lwRXhjZXB0aW9uIGZvciBtYW51YWwgc2tpcHBpbmcKK0FkZGVkOiA8dGVzdHM+IGNhbiBub3cgYmUgZGlzYWJsZWQgYXQgeG1sIGxldmVsIHVzaW5nIDx0ZXN0IGVuYWJsZWQ9ImZhbHNlIj4KK0FkZGVkOiBTdWl0ZSBmaWxlcyB0aGF0IG9ubHkgY29udGFpbiBvdGhlciBzdWl0ZXMgZG8gbm90IGdldCByZXBvcnRlZAorRml4ZWQ6IEBCZWZvcmVDbGFzcyBtZXRob2RzIHdvdWxkIGluY29ycmVjdGx5IHJlcG9ydCBjeWNsaWMgZ3JhcGhzCitBZGRlZDogZ2V0L3NldEF0dHJpYnV0ZSB0byBJVGVzdENvbnRleHQKK0FkZGVkOiBwbHVnZ2luZyBpbiBmYWN0b3J5IG9iamVjdHMgdG8gaGFuZGxlIHRoZSBhY3R1YWwgaW5zdGFudGlhdGlvbiBvZiB0ZXN0cworQWRkZWQ6IGRhdGFQcm92aWRlciB0byBARmFjdG9yeQorQWRkZWQ6IElTdWl0ZSBub3cgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBjdXJyZW50IFhtbFN1aXRlCitGaXhlZDogVEVTVE5HLTEzOSBkZXBlbmRzT25NZXRob2RzIGdldHMgY29uZnVzZWQgd2hlbiBkZXBlbmRlbmN5IGlzICJwcm90ZWN0ZWQiCitGaXhlZDogVEVTVE5HLTE0MSBqdW5pdCBhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlIGluIHRlc3RuZy1mYWlsZWQueG1sIHdoZW4gaXQgc2hvdWxkIGJlIHRydWUKK0ZpeGVkOiBURVNUTkctMTQyIEV4Y2VwdGlvbnMgaW4gRGF0YVByb3ZpZGVyIGFyZSBub3QgcmVwb3J0ZWQgYXMgZmFpbGVkIHRlc3QKK0FkZGVkOiBJbXByb3ZlZCBiZWhhdmlvciBmb3IgQEJlZm9yZS9AQWZ0ZXJDbGFzcyB3aGVuIHVzaW5nIEBGYWN0b3J5IAorKGh0dHA6Ly9mb3J1bXMub3BlbnN5bXBob255LmNvbS90aHJlYWQuanNwYT90aHJlYWRJRD02NTk0Jm1lc3NhZ2VJRD0xMjIyOTQjMTIyMjk0KQorQWRkZWQ6IFN1cHBvcnQgZm9yIGNvbmN1cnJlbnQgZXhlY3V0aW9uIGZvciBpbnZvY2F0aW9uQ291bnQ9MSB0aHJlYWRQb29sU2l6ZT4xIGFuZCBARGF0YVByb3ZpZGVyCisoaHR0cDovL2ZvcnVtcy5vcGVuc3ltcGhvbnkuY29tL3RocmVhZC5qc3BhP3RocmVhZElEPTY0NzM4JnRzdGFydD0wKQorQWRkZWQ6IE5ldyBUZXN0Tkcgc3BlY2lmaWMgWE1MIHJlcG9ydCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgaW4gJ3htbCcgc3ViZGlyZWN0b3J5IG9mIHRlc3Qtb3V0cHV0CitBZGRlZDogc3VwcG9ydCBpbiBzdHJwcm90b2NvbCBmb3IgcGFzc2luZyB0aGUgSVRlc3QuZ2V0VGVzdE5hbWUoKSBpbmZvcm1hdGlvbgorRml4ZWQ6IFRFU1RORy0xNTIgSWYgRGF0YVByb3ZpZGVyIGlzIG5vdCBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHNob3VsZCB0ZWxsIGV4YWN0bHkgd2hhdCBoYXBwZW5lZAorCitFY2xpcHNlIHBsdWctaW4KKworRml4ZWQ6IEJ1ZyB0aGF0IG1hZGUgZ3JvdXAgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIHVudXNhYmxlCitGaXhlZDogVGhlIHBsdWdpbiBkb2Vzbid0IGNyZWF0ZSB0aGUgY29ycmVjdCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgQEZhY3RvcnkKK0ZpeGVkOiBNZXRob2QgYmFzZWQgbGF1bmNoZXJzIGNhbm5vdCBiZSBlZGl0dGVkCitGaXhlZDogUGx1Z2luIGhhbmdzIHdoaWxlIGV4ZWN1dGluZyB0ZXN0IHdpdGggZGF0YXByb3ZpZGVyIHRoYXQgc2VuZHMgXG4sIFxyIG1lc3NhZ2VzCitBZGRlZDogZGlzcGxheSBJVGVzdC5nZXRUZXN0TmFtZSgpCisKK0lERUEgcGx1Zy1pbgorCitGaXhlZDogSURFQSA3LjAgY29tcGF0aWJpbGl0eQorRml4ZWQ6IG9jY2FzaW9uYWwgJ2lsbGVnYWwgYXJndW1lbnRzIGV4Y2VwdGlvbicKK0ZpeGVkOiBURVNUTkctMTUxIEZpbmFsIHBhc3NpbmcgdGVzdCByZXN1bHQgaXMgbm90IHByb3Blcmx5IGhpZGRlbgorQWRkZWQ6IEF1dG8tY29tcGxldGlvbiBmb3IgZGVwZW5kc09uTWV0aG9kcworQWRkZWQ6IEhpZ2hsaWdodGluZyBvZiBpbnZhbGlkIGdyb3Vwcy9tZXRob2RzIGluIGRlcGVuZHNPbioKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjUKKzIwMDcvMDEvMjUKKworRml4ZWQ6IEBCZWZvcmVHcm91cCBtZXRob2RzIHdlcmUgcnVuIHR3aWNlIHdoZW4gaW4gYSBiYXNlIGNsYXNzCitGaXhlZDogQEJlZm9yZUdyb3VwIG1ldGhvZHMgd2VyZSBydW4gdHdpY2Ugd2l0aCBhIEBUZXN0IGF0IGNsYXNzIGxldmVsCitGaXhlZDogcGFyYWxsZWw9InRlc3RzIiBkaWRuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCitBZGRlZDogU3VwcG9ydCBmb3IgdGhyZWFkLWNvdW50IGF0IHRlc3QgbGV2ZWwKK0FkZGVkOiBNZXRob2Qgc2VsZWN0b3JzIHJlY2VpdmUgYSBDb250ZXh0IGFuZCBjYW4gc3RvcCB0aGUgY2hhaW4gd2l0aCBzZXRTdG9wcGVkKCkKK0ZpeGVkOiBYbWxNZXRob2RTZWxlY3RvciB3YXMgYWx3YXlzIHJ1biBmaXJzdCByZWdhcmRsZXNzIG9mIGl0cyBwcmlvcml0eQorQWRkZWQ6IEBCZWZvcmVHcm91cHMvQEFmdGVyR3JvdXBzIGNhbiBsaXZlIGluIGNsYXNzZXMgd2l0aG91dCBAVGVzdCBtZXRob2RzCitBZGRlZDogRGF0YVByb3ZpZGVyIGNhbiBub3cgdGFrZSBhbiBJVGVzdENvbnRleHQgcGFyYW1ldGVyCitGaXhlZDogV2Fzbid0IHBhcnNpbmcgPHNlbGVjdG9yLWNsYXNzLW5hbWU+IGNvcnJlY3RseSAKK0ZpeGVkOiBBbm5vdGF0aW9uIFRyYW5zZm9ybWVycyBub3cgd29yayBvbiBjbGFzcy1sZXZlbCBhbm5vdGF0aW9ucworRml4ZWQ6IFNvbWUgY2xhc3MtbGV2ZWwgQFRlc3QgYXR0cmlidXRlcyB3ZXJlIG5vdCBhbHdheXMgaG9ub3JlZAorQWRkZWQ6IENsZWFuIHNlcGFyYXRpb24gYmV0d2VlbiBAVGVzdCBpbnZvY2F0aW9uIGV2ZW50cyBhbmQgQENvbmZpZ3VyYXRpb24gaW52b2NhdGlvbiBldmVudHMKKyAgICAgICAoc2VlIGFsc28gVEVTVE5HLTExMSkKK0FkZGVkOiBUZXN0IGluc3RhbmNlcyBjcmVhdGVkIGJ5IEBGYWN0b3J5IG5vdyBydW4gaW4gbXVsdGlwbGUgdGhyZWFkcyBpbiBwYXJhbGxlbCBtb2RlCitGaXhlZDogQEJlZm9yZS9AQWZ0ZXJHcm91cHMgaW52b2NhdGlvbiBvcmRlcgorRml4ZWQ6IFRFU1RORy0yNzogUGFyYW1ldGVycyBhcmUgbm90IHVzZWQgb24gPHRlc3Q+IGxldmVsIGFueW1vcmUKK0ZpeGVkOiBURVNUTkctMTA3IGRvbid0IGNyZWF0ZSBhbiBvdXRwdXQgZGlyZWN0b3J5IGlmICJvdXRwdXREaXJlY3RvcnkiIGlzIG51bGwKK0ZpeGVkOiBURVNUTkctMTI3IFVzZURlZmF1bHRMaXN0ZW5lcnMgaW4gQW50IFRhc2sgZG9lcyBub3Qgd29yaworRml4ZWQ6IFRFU1RORy0xMTkgUnVubmluZyBUZXN0TkcgcnVubmVyIHdpdGggaW52YWxpZCAnLXNvdXJjZWRpcicgb24gSkRLMTQgSmF2YURvYyBhbm5vdGF0ZWQgdGVzdCBjbGFzc2VzIHdvbid0IGZhaWwuCitGaXhlZDogVEVTVE5HLTExMyBEZXBlbmRlbnQgbWV0aG9kcyB3aXRoaW4gdGhlIHNhbWUgc3RhdGljIGlubmVyIGNsYXNzIGFyZSBub3QgZm91bmQKK0ZpeGVkOiBURVNUTkctMTI1IFRlc3RORyBmYWlsZWQgZm9yIHRlc3QgY2xhc3NlcyB1bmRlciAqLmphdmEqLiogcGFrYWdlcworCitFY2xpcHNlIHBsdWctaW4KK0ZpeGVkOiBpc3N1ZSB3aXRoIGxhdW5jaCBjb25maWd1cmF0aW9uCitGaXhlZDogVEVTVE5HLTEyNDogc2V0dGluZyBsb2NhdGlvbiBvZiB0ZXN0bmcgcmVwb3J0cyBvdXRwdXQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjQKKworRml4ZWQ6IEFudCB0YXNrIGlzc3VlIHdpdGggcGF0aHMgY29udGFpbmluZyBzcGFjZXMKK0FkZGVkOiBmb3IgQEJlZm9yZUdyb3VwcyBhbmQgQEFmdGVyR3JvdXBzIHNwZWNpZnlpbmcgdGhlIGdyb3VwcygpIGF0dHJpYnV0ZSB3aWxsIGF1dG8taW5jbHVkZSB0aGUgbWV0aG9kCisJCQkgaW50byB0aG9zZSBncm91cHMgYnkgZGVmYXVsdCAocHJldmlvdXNseSB5b3UgaGFkIHRvIGFsc28gcHJvdmlkZSB0aGUgdmFsdWUoKSBhdHRyaWJ1dGUpLgorQWRkZWQ6IHRoZSBsb2FkIEBUZXN0cyAoaW52b2NhdGlvbkNvdW50ICsgdGhyZWFkUG9vbFNpemUpIGFyZSB0cmlnZ2VyZWQgc2ltdWx0YW5lb3VzCitGaXhlZDogcmVwb3J0cyBhcmUgY29ycmVjdGx5IGRpc3BsYXlpbmcgdGhlIHRocmVhZCBpbmZvCitBZGRlZDogQERhdGFQcm92aWRlciBuYW1lIGRlZmF1bHRzIHRvIG1ldGhvZCBuYW1lCitBZGRlZDogc3VwcG9ydCBmb3IgcmVtb3RlIHByb3RvY29sIHRvIHBhc3MgcGFyYW1ldGVyIGluZm9ybWF0aW9uCitGaXhlZDogVGV4dFJlcG9ydGVyIGxvZ3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHRlc3QgbWV0aG9kcworRml4ZWQ6IGNvbmN1cnJlbmN5IGlzc3VlIGluIEpVbml0WE1MUmVwb3J0ZXIKK0ZpeGVkOiBvdXRwdXQgb2YgSlVuaXRYTUxSZXBvcnRlciBtdXN0IGJlIENEQVRBCitGaXhlZDogWE1MIHVuc3VwcG9ydGVkIGFubm90YXRpb25zL3BhcmFsbGVsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHJlcG9ydGVkCisKK0VjbGlwc2UgcGx1Zy1pbgorRml4ZWQ6IGdyb3VwcyB3aXRoIG11bHRpLWF0dHJpYnV0ZSBqYXZhZG9jIGFubm90YXRpb25zCitGaXhlZDogY29uc2lzdGVudCBiZWhhdmlvciBmb3IgZGVwZW5kc09uTWV0aG9kcworRml4ZWQ6IGNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIHRlc3RzIHdpdGggZGVwZW5kc09uR3JvdXBzIChhIHdhcm5pbmcgaXMgZW1pdHRlZCkKK0ZpeGVkOiBjb25zaXN0ZW50IG1lcmdlIG9mIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIHdoZW4gYW4gZXhpc3RpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZXhpc3RzIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis1LjMKKzIwMDYvMTAvMzAKKworRml4ZWQ6IHVzZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBic2guSW50ZXJwcmV0ZXIKK0FkZGVkOiBAQmVmb3JlL0BBZnRlck1ldGhvZCBjYW4gZGVjbGFyZSBhIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBwYXJhbWV0ZXIgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlIEBUZXN0IG1ldGhvZAorRml4ZWQ6IHN1cGVyIGNsYXNzZXMgbXVzdCBub3QgYmUgbGlzdGVkIGluIHRlc3RuZy1mYWlsdXJlcy54bWwKK0ZpeGVkOiBwYXJhbGxlbCBhdHRyaWJ1dGUgbXVzdCBub3QgYXBwZWFyIGlmIGVtcHR5IG9yIG51bGwgaW4gdGVzdG5nLWZhaWx1cmVzLnhtbAorRml4ZWQ6IHBhcnNpbmcgZm9yIGphdmFkb2MgYW5ub3RhdGlvbnMgaXMgZG9uZSBvbiByZXF1ZXN0IG9ubHkKK0FkZGVkOiBpbXByb3ZlZCBtdWx0aXBsZSBzdWl0ZSBzdW1tYXJ5IHBhZ2UgcmVwb3J0CitBZGRlZDogLXRhcmdldCBvcHRpb24gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAtYW5ub3RhdGlvbnMgamF2YWRvY3xqZGsKK0ZpeGVkOiBmaWxlc2V0cyBpbiB0aGUgYW50IHRhc2sgZGlkbid0IHdvcmsgaWYgdGhlIHBhdGhzIGhhdmUgc3BhY2VzIGluIHRoZW0KK0ZpeGVkOiBCZWZvcmUvQWZ0ZXIgU3VpdGUgd2VyZSBiZWhhdmluZyB3cm9uZyBpbiBwYXJhbGxlbCBleGVjdXRpb24KK0FkZGVkOiBBIGdlbmVyaWMvZXh0ZW5zaWJsZSBSZW1vdGVUZXN0Tkcgd2FzIGFkZGVkIHRvIHRoZSBjb3JlCitGaXhlZDogQmVmb3JlL0FmdGVyR3JvdXAtcyB3ZXJlIGJlaGF2aW5nIHdyb25nIHdoZW4gdXNpbmcgaW52b2NhdGlvbkNvdW50LCBkYXRhUHJvdmlkZXIgYW5kIHRocmVhZFBvb2xTaXplCitGaXhlZDogaW1wcm92ZWQgc3VwcG9ydCBmb3IgcnVubmluZyBkaWZmZXJlbnQgYW5ub3RhdGlvbiB0eXBlIHRlc3RzIGluIHRoZSBzYW1lIHN1aXRlCitGaXhlZDogdGVzdG5nLWZhaWxlZC54bWwgd2FzIGdlbmVyYXRlZCBldmVuIGlmIHRoZXJlIHdlcmUgbm8gZmFpbHVyZXMvc2tpcHBzCitGaXhlZDogLXVzZWRlZmF1bHRsaXN0ZW5lcnMgd2FzIHdyb25nbHkgcGFzc2VkIHRvIEpWTSBpbnN0ZWFkIG9mIFRlc3RORyBvcHRpb25zCitBZGRlZDogQXR0cmlidXRlIGRhdGFQcm92aWRlckNsYXNzIGZvciBAVGVzdCBhbmQgQHRlc3RuZy50ZXN0CitGaXhlZDogRm9yZ290IHRvIGFjY291bnQgZm9yIGNhc2VzIHdoZXJlIGJvdGggaW52b2NhdGlvbkNvdW50IGFuZCBEYXRhUHJvdmlkZXJzIGFyZSBwcmVzZW50CitGaXhlZDogQWZ0ZXJHcm91cHMgd2VyZSBpbnZva2VkIG91dCBvZiBvcmRlciB3aXRoIGludm9jYXRpb25Db3VudCBhbmQgRGF0YVByb3ZpZGVycworRml4ZWQ6IFJlcG9ydGVyLmdldE91dHB1dCgpIHJldHVybmVkIGFuIGVtcHR5IGFycmF5IGlmIGEgdGltZU91dCB3YXMgc3BlY2lmaWVkCitBZGRlZDogdGVzdG5nLnhtbCBub3cgc3VwcG9ydHMgPHN1aXRlLWZpbGVzPgorQWRkZWQ6IGFudCB0YXNrIGNhbiByZWNlaXZlIHNldmVyYWwgbGlzdGVuZXJzCitGaXhlZDogVEVTVE5HLTEwOSBTa2lwcGVkIHRlc3RzIHdpdGggZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcmVwb3J0ZWQgYXMgZmFpbHVyZXMKK0FkZGVkOiBhbnQgdGFzayBjYW4gbm93IHNlbGVjdCB0aGUgcGFyYWxsZWwgbW9kZSBmb3IgcnVubmluZyB0ZXN0cworRml4ZWQ6IGFudCB0YXNrIGNvcnJlY3RseSBkZWFscyB3aXRoIGVtcHR5IGdyb3VwcyBhbmQgZXhjbHVkZWRncm91cHMgcGFyYW1ldGVycworQWRkZWQ6IGFudCB0YXNrIGNhbiBvdmVycmlkZSBkZWZhdWx0IHN1aXRlIGFuZCB0ZXN0IG5hbWVzCitBZGRlZDogY29tYW5kIGxpbmUgc3VwcG9ydCBmb3Igc2V0dGluZyBwYXJhbGxlbCBtb2RlLCBzdWl0ZSBhbmQgdGVzdCBuYW1lcworCitFY2xpcHNlIHBsdWctaW4KK0FkZGVkOiBTdXBwb3J0IGZvciBjb25maWd1cmluZyBwZXIgcHJvamVjdCB1c2VkZWZhdWx0bGlzdGVuZXJzCitBZGRlZDogQ29udGV4dHVhbCBkcm9wLWRvd24gbWVudSBvbiBmYWlsdXJlcyB0YWIgb2YgdGhlIFRlc3RORyB2aWV3IHRvIGVuYWJsZSBydW5uaW5nL2RlYnVnZ2luZyBtZXRob2QgZmFpbHVyZSBvbmx5CitBZGRlZDogU3VwcHBvcnQgZm9yIGNvbmZpZ3VyaW5nIHBlciBwcm9qZWN0IFRlc3RORyBqYXIgdXNhZ2UgKHByb2plY3QgcHJvdmlkZWQgb25lIG9yIHBsdWdpbiBwcm92aWRlZCBvbmUpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS4yCisKK0FkZGVkOiAiLXVzZWRlZmF1bHRsaXN0ZW5lcnMgdHJ1ZS9mYWxzZSIgdG8gY29tbWFuZCBsaW5lIGFuZCBhbnQKK0FkZGVkOiBFbWFpbGFibGVSZXBvcnRlciAoZnJvbSBQYXVsIE1lbmRlbHNvbikKK0FkZGVkOiBwYXJhbGxlbCBjYW4gbm93IGJlICJtZXRob2RzIiBvciAidGVzdHMiLiBCb29sZWFuIHZlcnNpb24gZGVwcmVjYXRlZAorQWRkZWQ6IFRlc3ROR0FudFRhc2sgbm93IHVzZXMgdGhlIEAgc3ludGF4IHRvIGludm9rZSBUZXN0TkcKK0FkZGVkOiBDb21tYW5kIGxpbmUgdW5kZXJzdGFuZHMgQCBzeW50YXgKK0FkZGVkOiBKVW5pdENvbnZlcnRlciB1c2VzIHRoZSBuZXcgc3ludGF4CitBZGRlZDogLWdyb3VwcyB0byBKVW5pdENvbnZlcnRlcgorRml4ZWQ6IFRocm93IHByb3BlciBleGNlcHRpb24gd2hlbiBhIERhdGFQcm92aWRlciBkZWNsYXJlcyBwYXJhbWV0ZXJzCitBZGRlZDogY29tcGxldGVseSByZXZhbXBlZCBKVW5pdCBzdXBwb3J0IChzaG91bGQgcnVuIGFsbCBraW5kIG9mIEpVbml0IHRlc3RzKQorRml4ZWQ6IFRFU1RORy00MCAoQnVnIGluIHRlc3RuZy1mYWlsZWQueG1sIGdlbmVyYXRpb24pCitGaXhlZDogVEVTVE5HLTEwNiAoRmFpbGVkICJAQmVmb3JlU3VpdGUiIG1ldGhvZCBqdXN0IHNraXBwcyB0aGUgbGFzdCB0ZXN0IGluIHhtbC1maWxlKQorRml4ZWQ6IFN1Y2Nlc3Mgb24gMCB0ZXN0cyAoaHR0cDovL2ZvcnVtcy5vcGVuc3ltcGhvbnkuY29tL3RocmVhZC5qc3BhP3RocmVhZElEPTQxMjEzKQorCitFY2xpcHNlIHBsdWctaW4KK0FkZGVkOiBURVNUTkctMTA1IEF1dG9tYXRpY2FseSBkZWZpbmUgVEVTVE5HX0hPTUUgY2xhc3NwYXRoIHZhcmlhYmxlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS4xCisyMDA2LzA4LzE4CisKK0FkZGVkOiBAVGVzdChzZXF1ZW50aWFsID0gdHJ1ZSkKK0ZpeGVkOiBURVNUTkctMTAyIChJbmNvcnJlY3Qgb3JkZXJpbmcgb2YgQEJlZm9yZU1ldGhvZCBjYWxscyB3aGVuIGEgZGVwZW5kZW5jeSBpcyBzcGVjaWZpZWQpCitGaXhlZDogVEVTVE5HLTEwMSAoSFRNTCBvdXRwdXQgY29udGFpbnMgbmVzdGVkIDxQPiB0YWdzIGFuZCBhIG1pc3NpbmcgPHRyPiB0YWcpCitBZGRlZDogc3VwcG9ydCBmb3Igc3BlY2lmeWluZyB0ZXN0LW9ubHkgY2xhc3NwYXRoIChodHRwOi8vZm9ydW1zLm9wZW5zeW1waG9ueS5jb20vdGhyZWFkLmpzcGE/bWVzc2FnZUlEPTc4MDQ4JnRzdGFydD0wKQorRml4ZWQ6IFRFU1RORy05MyAobWV0aG9kIHNlbGVjdG9ycyBmaWx0ZXJpbmcgQEJlZm9yZU1ldGhvZCkKK0ZpeGVkOiBURVNUTkctODEgKEFzc2VydC5hc3NlcnRGYWxzZSgpIGRpc3BsYXlzIHdyb25nIGV4cGVjdGVkLCBhY3R1YWwgdmFsdWUpCitGaXhlZDogVEVTVE5HLTU5IChtdWx0aXBsZSBtZXRob2Qgc2VsZWN0b3JzIHVzYWdlIHJlc3VsdHMgaW4gbm8gdGVzdHMgcnVuKQorRml4ZWQ6IFRFU1RORy01NiAoaW52b2NhdGlvbiBvZiBAQmVmb3JlL0FmdGVyQ2xhc3MgbWV0aG9kcyBpbiBwYXJhbGxlbC9zZXF1ZW50aWFsIHNjZW5hcmlvcykKK0ZpeGVkOiBURVNUTkctNDAgKGZhaWx1cmVzIHN1aXRlIGRvZXMgbm90IGNvbnRhaW4gQEJlZm9yZS9BZnRlciBTdWl0ZS9UZXN0IG1ldGhvZHMpCitGaXhlZDogVEVTVE5HLTM3IChhbGxvdyBwYXNzaW5nIG51bGwgcGFyYW1ldGVyIHZhbHVlIGZyb20gdGVzdG5nLnhtbCkKK0ZpeGVkOiBURVNUTkctNyAoZGlzcGxheSBjbGFzc25hbWUgd2hlbiBob3ZlcmluZyBtZXRob2QpCisKKworRWNsaXBzZSBwbHVnLWluCisKK0FkZGVkOiBydW4gY29udGV4dHVhbCB0ZXN0IGNsYXNzZXMgd2l0aCBwYXJhbWV0ZXJzIGZyb20gc3VpdGUgZGVmaW5pdGlvbiBmaWxlcworQWRkZWQ6IFRFU1RORy0xMDAgKFNob3cgSFRNTCByZXBvcnRzIGFmdGVyIHJ1bm5pbmcgdGVzdHMpCitBZGRlZDogVEVTVE5HLTk3IChEb3VibGUgY2xpY2sgdG9wIHN0YWNrIHRvIHJhaXNlIGNvbXBhcmlzb24pCitBZGRlZDogVEVTVE5HLTg0IChwbHVnLWluIFVJIGZvciBzdWl0ZSBvcHRpb24gc2hvdWxkIHN1cHBvcnQgYWJzb2x1dGUgcGF0aCkKK0FkZGVkOiBURVNUTkctMjAgKGNvcHkgc3RhY2sgdHJhY2UpCisKK0ZpeGVkOiBURVNUTkctNzIgKGRpc3BsYXkgZ3JvdXBzIHdpdGggbm9uLWFycmF5IHZhbHVlcykKK0ZpeGVkOiBURVNUTkctNjQgKEVjbGlwc2UgcGx1Zy1pbiBhcHBsaWVzIGFkZGVkIGdyb3VwcyB0byBhbGwgbGF1bmNoIGNvbmZpZ3VyYXRpb25zKQorRml4ZWQ6IFRFU1RORy0yOCAoQ2Fubm90IHNlbGVjdCBncm91cHMgZnJvbSBkZXBlbmRlbnQgZWNsaXBzZSBwcm9qZWN0cykKK0ZpeGVkOiBURVNUTkctMjUgKGRvIG5vdCBkaXNwbGF5IGZ1bGx5IHF1YWxpZmllZCBtZXRob2QgbmFtZSB3aGVuIHJ1bm5pbmcgY29udGV4dHVhbCB0ZXN0IGNsYXNzKQorCitJbXByb3ZlZCBiZWhhdmlvcjoKKwlURVNUTkctOTggKHRlbXBvcmFyeSBmaWxlcyBoYXZlIGd1YXJhbnRlZWQgZml4ZWQgbmFtZXMpCisJVEVTVE5HLTk1IChBc3NlcnRpb24gZmFpbGVkIGNvbXBhcmlzb24gdHJpbXMgdHJhaWxpbmcgIj4iKQorCVRFU1RORy03MCAoVGVzdE5HIHByZXZlbnRzIGVjbGlwc2UgZnJvbSBvcGVuaW5nIGFuIG9sZGVyIENWUyB2ZXJzaW9uIG9mIGEgamF2YSBjbGFzcykKKwlkaXNwbGF5IG9mIHRlc3QgaGllcmFyY2h5IGluZm9ybWF0aW9uIChURVNUTkctMjkpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis1LjAuMQorCitFY2xpcHNlIHBsdWctaW4KKworQWRkZWQ6IE91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSB0ZXN0cworQWRkZWQ6IENhbiBub3cgc3BlY2lmeSBsaXN0ZW5lciBjbGFzc2VzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorNS4wLjEKKworRml4ZWQ6IHJlcG9ydHMgZ2VuZXJhdGVkIGJ5IFN1aXRlSFRNTFJlcG9ydGVyIGRvIG5vdCB3b3JrIHdpdGggSkRLMS40CisJCQkgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNS4wCisyMDA5LzA0LzAxCisKK0FkZGVkOiBBbnQgdGFzazogc3VwcG9ydCBmb3IgSlZNLCB3b3JraW5nRGlyLCB0aW1lb3V0CitBZGRlZDogU3RhY2sgdHJhY2VzIGNhbiBiZSBpbnRlcmFjdGl2ZWx5IHNob3duIGluIHRoZSBIVE1MIHJlcG9ydHMKK0FkZGVkOiBMaW5rIHRvIHRlc3RuZy54bWwgaW4gdGhlIHJlcG9ydHMKK0FkZGVkOiBOZXcgc3RydWN0dXJlIGZvciByZXBvcnRzLCBzdWl0ZXMgZ28gaW4gdGhlaXIgaW5kaXZpZHVhbCBkaXJlY3RvcnkKK0FkZGVkOiBAVGVzdChzdWl0ZU5hbWUpIGFuZCBAVGVzdCh0ZXN0TmFtZSkKK0FkZGVkOiBUaGUgc3RhY2sgdHJhY2VzIGluIHJlcG9ydHMgZG8gbm90IGluY2x1ZGUgVGVzdE5HIGZyYW1lcyAoc3lzdGVtIHByb3BlcnR5IHRlc3RuZy5leGNlcHRpb24pCisJCQkgKHNlZTogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3Rlc3RuZy1kZXYvYnJvd3NlX3RocmVhZC90aHJlYWQvOWY0ZDQ2YWRlMTBiMGZkYSkKK0ZpeGVkOiBFeGl0IHdpdGggZXJyb3Igd2hlbiBubyBtZXRob2RzIGFyZSBydW4KKwkJCSAoc2VlOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvdGVzdG5nLWRldi9icm93c2VfdGhyZWFkL3RocmVhZC8zYzI2ZThhNTY1OGYyMmFjKQorQWRkZWQ6IExpc3Qgb2YgbWV0aG9kcyBpbiBhbHBoYWJldGljYWwgb3JkZXIKK0ZpeGVkOiBDbGFzcy1zY29wZWQgYW5ub3RhdGlvbnMgd2VyZSBub3QgcmVjb2duaXplZCB3aGVuIGluaGVyaXRlZAorQWRkZWQ6IERlcHJlY2F0ZWQgQENvbmZpZ3VyYXRpb24gYW5kIGludHJvZHVjZWQgQEJlZm9yZVN1aXRlL1Rlc3QvQ2xhc3MvVGVzdE1ldGhvZAorQWRkZWQ6IERlcHJlY2F0ZWQgQEV4cGVjdGVkRXhjZXB0aW9ucyBhbmQgbW92ZWQgaXQgaW50byBAVGVzdAorQWRkZWQ6IGV4cGVjdGVkRXhjZXB0aW9ucyB0byBAVGVzdCwgZGVwcmVjYXRlZCBARXhwZWN0ZWRFeGNlcHRpb25zCitBZGRlZDogTmV3IGFubm90YXRpb25zOiAgQEJlZm9yZVN1aXRlLCBAQmVmb3JlVGVzdCwgZXRjLi4uCitGaXhlZDogV2FzIHJldHVybmluZyBhbiBleGl0IGNvZGUgb2YgMCBpZiBhIGN5Y2xpYyBncmFwaCB3YXMgZGV0ZWN0ZWQKK0FkZGVkOiBJbnRlcmZhY2Ugb3JnLnRlc3RuZy5JVGVzdCBzbyB0aGF0IHRlc3RzIGNhbiBkZWNsYXJlIGEgbmFtZQorRml4ZWQ6IFRoZSBUZXh0IHJlcG9ydGVyIHdhcyByZXBvcnRpbmcgdGhlIHNxdWFyZSBvZiB0aGUgYWN0dWFsIG51bWJlciBvZiBtZXRob2RzCitGaXhlZDogQnVnIHJlcG9ydGVkIGJ5IEVyYW4gYWJvdXQgZGVwZW5kZW5jaWVzIHdpdGggYW4gYWZ0ZXJDbGFzcyBtZXRob2QKK0FkZGVkOiBJSG9va0NhbGxCYWNrIG5vdyByZWNlaXZlcyB0aGUgSVRlc3RSZXN1bHQgaW4gaXRzIHJ1bigpIG1ldGhvZAorQWRkZWQ6IE5hbWUgb2Ygc3VpdGUgZm9yIGNvbW1hbmQgbGluZSBjYW4gYmUgc2V0IHdpdGggLUR0ZXN0bmcuc3VpdGUubmFtZT14eHgKK0ZpeGVkOiBUZXN0TkdBbnRUYXNrIHdhcyBoYXJkY29kaW5nIG1faGFsdE9uRlNQIHRvIHRydWUKK0ZpeGVkOiBQYXNzaW5nIGEgbnVsbCBwYXJhbWV0ZXIgY2F1c2VkIGFuIE5QRSBpbiB0aGUgcmVwb3J0cworQWRkZWQ6ICJsaXN0ZW5lciIgdG8gdGhlIGFudCB0YXNrIChhbmQgZG9jdW1lbnRhdGlvbikKK0FkZGVkOiBpZiBwYXRjaC10ZXN0bmctc291cmNlZGlyLnByb3BlcnRpZXMgaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aAorICAgICAgIHdpdGggYSBwcm9wZXJ0eSAic291cmNlZGlyIiBjb250YWluaW5nIGEgOyBzZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgIGRpcmVjdG9yaWVzLCB0aGlzIGxpc3Qgd2lsbCBvdmVycmlkZSAtc291cmNlZGlyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCis0LjcKKworQWRkZWQ6IE1hdmVuIDIgcGx1Zy1pbgorRml4ZWQ6IE1lc3NhZ2UgZm9ybWF0dGluZ3MgaW4gVGVzdE5HIGFzc2VydGlvbiB1dGlsaXR5IGNsYXNzCitGaXhlZDogQEZhY3RvcnkgbWV0aG9kcyB3ZXJlIGNvdW50ZWQgYXMgQFRlc3QgYXMgd2VsbAorICAgICAgIGh0dHA6Ly9qaXJhLm9wZW5zeW1waG9ueS5jb20vYnJvd3NlL1RFU1RORy01MQorRml4ZWQ6IEFsbCBEYXRhUHJvdmlkZXIgcGFyYW1ldGVycyB3ZXJlIHNob3duIGluIHRoZSBIVE1MIHJlcG9ydAorRml4ZWQ6IEJ1ZyBpbiB0ZXN0bmctZmFpbGVkLnhtbCBnZW5lcmF0aW9uCitGaXhlZDogPHBhY2thZ2VzPiBidWcgd2hlbiB1c2luZyBhIGphciBmaWxlIHRvIGxvYWQgdGhlIHRlc3QgY2xhc3NlcworQWRkZWQ6IGFsd2F5c1J1biBmb3IgYmVmb3JlIEBDb25maWd1cmF0aW9uIG1ldGhvZHMKKyAgICAgICBodHRwOi8vamlyYS5vcGVuc3ltcGhvbnkuY29tL2Jyb3dzZS9URVNUTkctMzUKK0ZpeGVkOiBncm91cGxlc3MgQENvbmZpZ3VyYXRpb25zIHdlcmUgbm90IGludm9rZWQgaWYgYSBtZXRob2QgZGVwZW5kcyBvbiBhIGdyb3VwCisgICAgICAgaHR0cDovL2ppcmEub3BlbnN5bXBob255LmNvbS9icm93c2UvVEVTVE5HLTQ1CitBZGRlZDogYmVmb3JlR3JvdXBzL2FmdGVyR3JvdXBzIHRvIEBDb25maWd1cmF0aW9uCisKK0VjbGlwc2UgcGx1Z2luOgorCitBZGRlZDogbGFzdCBjb250ZXh0dWFsIGxhdW5jaCBpcyBhdmFpbGFibGUgaW4gRWNsaXBzZSBsYXVuY2hlciBsaXN0cworRml4ZWQ6IDMuMk01IGludGVncmF0aW9uIChyZW1vdmVkIGRlcGVuZGVuY3kgb24gbm9uLWV4aXN0aW5nIGNsYXNzKQorRml4ZWQ6IHRlc3RuZy1mYWlsdXJlcy54bWwgZ2VuZXJhdGlvbgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNC42CisyMDA2LzI3LzAyCisKK0FkZGVkOiBEb2N1bWVudGF0aW9uIGNvbnRhaW5zIHRoZSBuZXcgcmVwb3J0cworQWRkZWQ6IFRlc3RORy5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGJvb2xlYW4pCitBZGRlZDogRGVzY3JpcHRpb25zIG5vdyBhcHBlYXIgaW4gVGV4dFJlcG9ydGVyICh2ZXJib3NlPj0yKSBhbmQgdGhlIEhUTUwgcmVwb3J0cworQWRkZWQ6IGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSB0byBAVGVzdCBhbmQgQENvbmZpZ3VyYXRpb24KK0FkZGVkOiBjb21iaW5lZCBSZXBvcnRlciBvdXRwdXQgaW4gdGhlIHJlcG9ydHMKK0FkZGVkOiBtZXRob2RzIG5vdCBydW4gaW4gdGhlIHJlcG9ydHMKK0FkZGVkOiBvcmcudGVzdG5nLklSZXBvcnRlcgorQWRkZWQ6IHRocmVhZFBvb2xTaXplIHRvIEBUZXN0CitBZGRlZDogUmVwb3J0cyBub3cgc2hvdyByZWxhdGl2ZSB0aW1pbmdzIChzdGFydCBhdCAwKQorQWRkZWQ6IFJlcG9ydHMgbm93IHNob3cgZGlmZmVyZW50IGNvbG9ycyBkZXBlbmRpbmcgb24gdGhlIG1ldGhvZHMnIGNsYXNzZXMKK0FkZGVkOiBSZXBvcnRzIG5vdyBzaG93IGFsbCBwYXJhbWV0ZXJzIHVzZWQgdG8gaW52b2tlIHRoZSB0ZXN0IG1ldGhvZAorQWRkZWQ6IG9yZy50ZXN0bmcuUmVwb3J0ZXIKK0FkZGVkOiBEYXRhUHJvdmlkZXJzIGNhbiBhY2NlcHQgYSBNZXRob2QgYXMgZmlyc3QgcGFyYW1ldGVyCitGaXhlZDogRXh0cmFuZW91cyBpbXBsaWNpdCBpbmNsdXNpb24gb2YgYSBtZXRob2QKKworRWNsaXBzZSBwbHVnaW46CisKK0FkZGVkOiBSdW4vRGVidWcgYXMgVGVzdE5HIHRlc3QgZnJvbSB0aGUgZWRpdG9yIGNvbnRleHR1YWwgbWVudQorRml4ZWQ6IFRFU1RORy0yNDogJ1J1biBhcyB0ZXN0bmcgdGVzdCcgZG9lcyBub3QgYXBwZWFyIG9mIHRoZSBUZXN0IGFubm90YXRpb24gZG9lcyBub3QgaGF2ZSBhIGdyb3VwCitGaXhlZDogVEVTVE5HLTE4OiBFY2xpcHNlIHBsdWdpbiBpZ25vcmVzIEZhY3RvcnkgYW5ub3RhdGlvbgorRml4ZWQ6IFRFU1RORy0yMTogU2hvdyBkaWZmZXJlbmNlcyB3aGVuIGRvdWJsZSBjbGlja2luZyBhc3NlcnRpb24gZXhjZXB0aW9ucworQWRkZWQ6IFVJIGFsbG93cyBzZXR0aW5nIG9yaWVudGF0aW9uIChldmVuIG1vcmUgc3BhY2UpCisJICAgaHR0cDovL2ZvcnVtcy5vcGVuc3ltcGhvbnkuY29tL3RocmVhZC5qc3BhP3RocmVhZElEPTE3MjI1Jm1lc3NhZ2VJRD0zMzgwNSMzMzgwNQorCSAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzQuNQorMjAwNy8wNy8wMgorCitDb3JlOgorCitGaXhlZDogTWV0aG9kcyB3ZXJlIG5vdCBpbXBsaWNpdGx5IGluY2x1ZGVkLCBvbmx5IGdyb3VwcworRml4ZWQ6IEJ1ZyB3aXRoIGZhaWxlZCBwYXJlbnQgQENvbmZpZ3VyYXRpb24gZG9uJ3Qgc2tpcCBjaGlsZCBAQ29uZmlndXJhdGlvbi9AVGVzdCBpbnZvY2F0aW9ucworRml4ZWQ6IEJ1ZyB3aXRoIG92ZXJyaWRkaW5nIEBDb25maWd1cmF0aW9uIG1ldGhvZHMgKGJvdGggcGFyZW50IGFuZCBjaGlsZCB3ZXJlIHJ1bikKK0ZpeGVkOiBCdWcgd2hlbiBvdmVycmlkaW5nIGJlZm9yZUNsYXNzIG1ldGhvZHMgaW4gYmFzZSBjbGFzcyAoY3ljbGljIGdyYXBoKQorQWRkZWQ6IFN1cHBvcnQgZm9yIEpBQVMgKHNlZSBvcmcudGVzdG5nLklIb29rYWJsZSkKK0ZpeGVkOiBQcm9ibGVtIHdpdGggbmVzdGVkIGNsYXNzZXMgaW5zaWRlIDxwYWNrYWdlIG5hbWU9ImZvby4qIgorRml4ZWQ6IElmIGEgZ3JvdXAgaXMgbm90IGZvdW5kLCBtYXJrIHRoZSBtZXRob2QgYXMgYSBza2lwIGluc3RlYWQgb2YgYWJvcnRpbmcKK0ZpeGVkOiB0ZXN0bmctZmFpbGVkLnhtbCB3YXMgbm90IHJlc3BlY3RpbmcgZGVwZW5kZW5jaWVzCitGaXhlZDogY2xhc3MvaW5jbHVkZSBtZXRob2QgaW4gdGVzdG5nLnhtbCBkaWRuJ3Qgd29yayBvbiBkZWZhdWx0IHBhY2thZ2UKK0ZpeGVkOiBEVEQgb25seSBhbGxvd2VkIG9uZSA8ZGVmaW5lPgorRml4ZWQ6IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBmb3Igak1vY2sKK0FkZGVkOiBkZXBlbmRzT25NZXRob2RzIGNhbiBjb250YWluIG1ldGhvZHMgZnJvbSBhbm90aGVyIGNsYXNzCitGaXhlZDogSlVuaXRDb252ZXJ0ZXIgcmVxdWlyZWQgLXJlc3RvcmUsIG5vdCBhbnkgbW9yZSAob3B0aW9uIGlzIG5vdyBhIG5vLW9wKQorRml4ZWQ6IEpVbml0IG1vZGUgd2Fzbid0IGludm9raW5nIHNldE5hbWUoKSBvbiB0ZXN0IGNsYXNzZXMKK0FkZGVkOiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBjbGFzc2VzIGluIDxwYWNrYWdlPgorQWRkZWQ6IERpc3RyaWJ1dGVkIFRlc3RORworRml4ZWQ6IENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFuZCB0ZXN0bmcueG1sIGFyZSBub3cgY3VtdWxhdGl2ZQorRml4ZWQ6IFJlcG9ydHMgbm93IHdvcmsgZm9yIG11bHRpcGxlIHN1aXRlcworRml4ZWQ6IFdhcyBpZ25vcmluZyBhYnN0cmFjdCBjbGFzc2VzIGV2ZW4gaWYgdGhleSBoYXZlIG5vbi1hYnN0cmFjdCBpbnN0YW5jZXMKK0ZpeGVkOiBJZiBzZXRVcCgpIGZhaWxlZCwgbWV0aG9kcyB3ZXJlIG5vdCBza2lwcGVkCitGaXhlZDogV2FzIG5vdCBjbGVhcmx5IGluZGljYXRpbmcgd2hlbiBiZWZvcmVTdWl0ZSBmYWlscworQWRkZWQ6IEBDb25maWd1cmF0aW9uLmluaGVyaXRHcm91cHMKK0ZpeGVkOiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gdGVzdG5nLnhtbCBhbmQgb2JqZWN0cyByZWdhcmRpbmcgbWV0aG9kIHNlbGVjdG9ycworCitFY2xpcHNlIHBsdWctaW46CisKK05ldyBsb29rIGZvciB0aGUgcHJvZ3Jlc3Mgdmlldy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzQuNAorCitDb3JlOgorCitGaXhlZDogdGVzdG5nLWZhaWx1cmVzLnhtbCB3YXMgbm90IGV4Y2x1ZGluZyBtZXRob2RzIGZyb20gYmFzZSBjbGFzc2VzCitGaXhlZDogQnVnIGluIHN1aXRlcyBvZiBzdWl0ZXMgZm9yIEpVbml0IG1vZGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzQuMworCitDb3JlOgorCitGaXhlZDogdGVzdG5nLWZhaWx1cmVzLnhtbCB3YXMgbm90IGV4Y2x1ZGluZyBtZXRob2RzIGZyb20gYmFzZSBjbGFzc2VzCitGaXhlZDogQnVnIGluIHN1aXRlcyBvZiBzdWl0ZXMgZm9yIEpVbml0IG1vZGUKK0FkZGVkOiBFeGNsdWRlZCBncm91cHMgb24gY29tbWFuZCBsaW5lIGFuZCBhbnQgdGFzaworRml4ZWQ6IFdoZW4gaW5jbHVkaW5nIGEgZ3JvdXAsIGltcGxpY2l0bHkgaW5jbHVkZSBncm91cHMgZGVwZW5kZWQgdXBvbgorRml4ZWQ6IFdoZW4gZGVwZW5kaW5nIG9uIHNldmVyYWwgZ3JvdXBzLCB3YXNuJ3Qgc2tpcHBlZCBpZiBvbmUgb2YgdGhlbSBmYWlsZWQKK0ZpeGVkOiBGYWlsdXJlcyB3ZXJlbid0IHJlcG9ydGVkIGFjY3VyYXRlbHkgaW4gdGhlIEpVbml0UmVwb3J0cyByZXBvcnQKK0ZpeGVkOiBXYXNuJ3QgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIGRlcGVuZGluZyBvbiBhIG5vbi1leGlzdGluZyBncm91cAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworNC4yCisKK0NvcmU6CisKK0ZpeGVkOiB3YXNuJ3QgZXhjbHVkaW5nIG1ldGhvZHMgaW4gYmFzZSBjbGFzc2VzCitBZGRlZDogYWx3YXlzUnVuIGZvciB0ZXN0cyAoc29mdCBkZXBlbmRlbmNpZXMpCitGaXhlZDogQ2xhc3MtbGV2ZWwgZW5hYmxlZD1mYWxzZSB3ZXJlIG5vdCBob25vcmVkCitGaXhlZDogQnVnIHdpdGggbXVsdGlwbGUgZGF0YXByb3ZpZGVycyBvbiBzYW1lIGNsYXNzCitGaXhlZDogQnVnIHdpdGggZGF0YXByb3ZpZGVyIGRlZmluZWQgaW4gdGhlIHBhcmVudCBjbGFzcworRml4ZWQ6IEJ1ZyB3aXRoIGRhdGFwcm92aWRlciBkZWZpbmVkIGluIGEgc3ViY2xhc3MKK0ZpeGVkOiBCdWcgd2l0aCBkYXRhcHJvdmlkZXIgZGVmaW5lZCBpbiBhbiBhYnN0cmFjdCBjbGFzcworRml4ZWQ6IHRlc3RuZy1mYWlsdXJlcyBnZW5lcmF0aW9uIHdhcyBleGNsdWRpbmcgdGhlIG1ldGhvZHMgZXZlbiBpZiBhIGZhaWxlZCB0ZXN0IGRlcGVuZGVkIG9uIGl0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis0LjEKKworQ29yZToKKworQWRkZWQ6IEBEYXRhUHJvdmlkZXJzIGNhbiByZXR1cm4gSXRlcmFibGU8T2JqZWN0W10+CitGaXhlZDogU3VwZXJjbGFzcyB0ZXN0IG1ldGhvZHMgd2VyZSBub3QgY2FsbGVkIGluIHRoZSBwcmVzZW5jZSBvZiBhIGNsYXNzIEBUZXN0CitBZGRlZDogUmVwb3J0ZXIgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIGluIHRoZSBIVE1MIHJlcG9ydHMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzQuMAorMjAwNS8xMS8xMAorCitDb3JlOgorCitGaXhlZDogc3VpdGUgbWV0aG9kcyBub3cgaW52b2tlZCBvbmx5IG9uY2UgaW4gYSBoaWVyYXJjaHkKK0FkZGVkOiBARGF0YVByb3ZpZGVyIGFuZCBAdGVzdG5nLmRhdGEtcHJvdmlkZXIKK0ZpeGVkOiBJbnRlcmxlYXZlIG9yZGVyIG5vdyByZXNwZWN0ZWQgZm9yIGJlZm9yZS9hZnRlckNsYXNzIG1ldGhvZHMKK0FkZGVkOiBDYW4gbm93IGludm9rZSBqYXZhIC1qYXIgdGVzdG5nLTIuNi5qYXIgPC4uLj4KK0FkZGVkOiBTdXBwb3J0IGZvciBCZWFuU2hlbGwKK0FkZGVkOiBNZXRob2QgU2VsZWN0b3JzIChJTWV0aG9kU2VsZWN0b3IpCitGaXhlZDogSW4gdGhlIGFic2VuY2Ugb2YgZGVwZW5kZW5jaWVzLCBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHJlc3BlY3QgaW5oZXJpdGFuY2UKK0ZpeGVkOiBCdWcgaW4gbXVsdGl0aHJlYWRlZCBkZXBlbmRlbmNpZXMgb24gbWV0aG9kcworRml4ZWQ6IGRlcGVuZHNPbkdyb3VwcyB3YXNuJ3Qgd29ya2luZyBvbiByZWd1bGFyIGV4cHJlc3Npb25zCitGaXhlZDogQnVnIGluIDxwYWNrYWdlPiB3aGVuIGRpcmVjdG9yaWVzIGNvbnRhaW4gc3BhY2VzIGluIHRoZWlyIG5hbWVzCitGaXhlZDogSW50cm9kdWNlZCBhIEpESzUgZGVwZW5kZW5jeSBpbiB0aGUgSkRLMS40IGJ1aWxkIChnZXRFbmNsb3NpbmdDbGFzcygpKQorRml4ZWQ6IE91dHB1dCBkaXJlY3RvcnkgaW4gYW50IHRhc2sgd2FzIG5vdCBob25vcmVkIGlmIGl0IGRpZG4ndCBleGlzdAorRml4ZWQ6IFByb2JsZW0gd2l0aCB0aW1lb3V0IGFjY29yZGluZyB0byAKKyAgICAgICBodHRwOi8vZm9ydW1zLm9wZW5zeW1waG9ueS5jb20vdGhyZWFkLmpzcGE/dGhyZWFkSUQ9NjcwNworCitFY2xpcHNlIHBsdWctaW46CisKK0ZpeGVkOiBXYXNuJ3QgaGFuZGxpbmcgbGlua2VkIGRpcmVjdG9yaWVzIGNvcnJlY3RseQorRml4ZWQ6IEJ1ZyBpbiBRdWlja0ZpeCBpbXBsZW1lbnRhdGlvbgorQWRkZWQ6IFF1aWNrIEZpeCBmb3IgSlVuaXQgY29udmVyc2lvbiAoQW5ub3RhdGlvbnMgYW5kIEphdmFEb2MpCitGaXhlZDogTWV0aG9kcyBSdW4gYXMgVGVzdE5HIHRlc3QKK0FkZGVkOiBQYWNrYWdlIGxldmVsIFJ1biBhcyBUZXN0TkcgdGVzdAorRml4ZWQ6IFJlc291cmNlcyBmcm9tIHRoZSBsaW5rZWQgZGlyZWN0b3JpZXMgYXJlIHVzaW5nIGEgd3JvbmcgcGF0aCB3aGVuIAorICAgICAgIHBhc3NlZCB0byBjb21tYW5kIGxpbmUgVGVzdE5HCisKK0lERUEgcGx1Zy1pbjoKKworQWRkZWQ6IFN1cHBvcnQgZm9yIEpESyAxLjQgKGJvdGggcHJvamVjdHMgYW5kIElERUEgaXRzZWxmKQorRml4ZWQ6IENsYXNzZXMgdGhhdCBjb250YWluZWQgb25seSBjb25maWd1cmF0aW9uIHdlcmUgaWdub3JlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMi41CisyMDA1LzA4LzA4CisKK0FkZGVkOiBJVGVzdExpc3RlbmVyLm9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0KQorQWRkZWQ6IFN1cHBvcnQgZm9yIDxwYWNrYWdlcz4KK0FkZGVkOiBSZXNvdXJjZSBmaWxlcyBmb3IgZWFzaWVyIGFudCB0YXNrZGVmcworRml4ZWQ6IEBDb25maWd1cmF0aW9uIG1ldGhvZHMgd2VyZSBub3QgaW52b2tlZCB3aXRoIGluZGl2aWR1YWwgdGVzdCBtZXRob2RzCitGaXhlZDogQnVnIHdpdGggRXhwZWN0ZWRFeGNlcHRpb25zCitGaXhlZDogRGlkbid0IHN1cHBvcnQgbmVzdGVkIGZhY3RvcnkgY2xhc3NlcworRml4ZWQ6IE5QRSBpZiAtdGFyZ2V0IGlzIG9taXR0ZWQgd2l0aCBKREsgMS40CitGaXhlZDogQENvbmZpZ3VyYXRpb24gZmFpbHVyZXMgaW4gYSBjbGFzcyB3b3VsZCBjYXVzZSBvdGhlciBjbGFzc2VzIHRvIGZhaWwKK0FkZGVkOiBhbHdheXNSdW4KK0ZpeGVkOiBiZWZvcmVUZXN0Q2xhc3MvYWZ0ZXJUZXN0Q2xhc3Mgd2VyZSBicm9rZW4gZm9yIGEgcGF0aG9sb2dpY2FsIGNhc2UKK0FkZGVkOiBAQ29uZmlndXJhdGlvbihhbHdheXNSdW4pCitBZGRlZDogSlVuaXRDb252ZXJ0ZXIgdGFzaworRml4ZWQ6IDwgYW5kID4gY2hhcmFjdGVycyBpbiByZXBvcnRzIHdlcmUgbm90IGVzY2FwZWQKKworRWNsaXBzZSBwbHVnLWluOgorCitGaXhlZDogQ2xhc3MgZGlhbG9nIHdhc24ndCBzaG93aW5nIEBGYWN0b3J5IGNsYXNzZXMKKworSURFQSBwbHVnLWluOgorCitGaXJzdCByZWxlYXNlIQorCitEb2N1bWVudGF0aW9uOgorCitBZGRlZDogQnJhbmQgbmV3IGxvb2shISEKK0FkZGVkOiBTZWN0aW9uIG9uIHRlc3RuZy54bWwKK0ZpeGVkOiBOdW1iZXJpbmcgb2Ygc2VjdGlvbnMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzIuNAorMjAwNS8wNy8wNQorCitDaGFuZ2VkOiBOZXcgcGFja2FnZTogIHRlc3RuZy5vcmcKK0ZpeGVkOiBCdWcgd2l0aCBARXhwZWN0ZWRFeGNlcHRpb24gb2NjdXJpbmcgdGhlIHBhcmFsbGVsIG1vZGUKK0ZpeGVkOiBCdWcgd2l0aCBwYXJhbWV0ZXJzIGFuZCBiZWZvcmVUZXN0CitBZGRlZDogSUluc3RhbmNlSW5mbyBzdXBwb3J0CitGaXhlZDogbWV0aG9kcyB3ZXJlIG5vdCBleGNsdWRlZCB3aGVuIGluY2x1ZGVkIGJ5IGdyb3VwcworRml4ZWQ6IHRlc3RuZy1mYWlsdXJlcy54bWwgaXMgbm93IGluY2x1ZGluZyBhbHNvIHRoZSBiZWZvcmVTdWl0ZS9hZnRlclN1aXRlIG1ldGhvZHMKK0ZpeGVkOiBnZW5lcmF0aW5nIHRoZSB0ZXN0bmctZmFpbHVyZXMueG1sIGlzIG5vdyB3b3JraW5nIGFzIGV4cGVjdGVkCitGaXhlZDogRmFjdG9yaWVzIGNhbGwgYWxsIHRoZSB0ZXN0cyBldmVuIGlmIHNvbWUgb2YgdGhlbSBmYWlsIGFsb25nIHRoZSB3YXkKK0ZpeGVkOiBCZXR0ZXIgSlVuaXQgc3VwcG9ydCAod2Fzbid0IGNyZWF0aW5nIGluZGl2aWR1YWwgaW5zdGFuY2VzKQorRml4ZWQ6IGRlcGVuZHNPbkdyb3VwcyBkaWRuJ3Qgd29yayBhY3Jvc3MgZGlmZmVyZW50IGNsYXNzZXMKK0FkZGVkOiBjb21tYW5kIGxpbmUgKGFuZCBBbnQpIC1ncm91cHMgb3B0aW9uCitBZGRlZDogQFBhcmFtZXRlcnMgKGFuZCBtYWRlIHBhcmFtZXRlcnMgYXR0cmlidXRlIGRlcHJlY2F0ZWQpCitBZGRlZDogUGFyYW1ldGVycyBmb3IgY29uc3RydWN0b3JzCitGaXhlZDogQmV0dGVyIGludGVybGVhdmluZyBvZiBiZWZvcmUvYWZ0ZXJUZXN0TWV0aG9kcworRml4ZWQ6IEFudCB0YXNrCitGaXhlZDogVGVzdE5HRXhjZXB0aW9uIHRocm93biB3aGVuIFRlc3RORyBjb25kaXRpb25zIGFyZSBub3QgZnVsZmlsbGVkCisKK0RvY3VtZW50YXRpb246CistIE5ldyBhc3NlcnQgY2xhc3NlcworLSBOZXcgd2F5cyB0byBsYXVuY2ggCistIEpVbml0Q29udmVydGVyIGRvY3VtZW50YXRpb24KKy0gbmV3IGJlZm9yZVN1aXRlL2FmdGVyU3VpdGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzIuMworMjAwNS8wNC8xMgorCitGaXhlZDogU3BhY2VzIGFyZSBub3cgbGVnYWwgaW4gSmF2YURvYyBjb21tZW50cworQWRkZWQ6IGRvY3VtZW50YXRpb24gZm9yIEBGYWN0b3J5CitGaXhlZDogZmFjdG9yaWVzIHdlcmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzCitBZGRlZDogYmVmb3JlU3VpdGUgYW5kIGFmdGVyU3VpdGUKK0ZpeGVkOiBpbmhlcml0YW5jZSBhbmQgc2NvcGUgbm93IHdvcmtpbmcgcHJvcGVybHkgZm9yIGFubm90YXRpb25zCitGaXhlZDogZGVwZW5kc09uTWV0aG9kcyB3YXNuJ3Qgd29ya2luZyBmb3IgMS40CitBZGRlZDogQmV0dGVyIHN0YWNrIHRyYWNlcworQWRkZWQ6IEJldHRlciBzeW50YXggZm9yIGluY2x1ZGVkL2V4Y2x1ZGVkIG1ldGhvZHMKK0ZpeGVkOiBCZXR0ZXIgdmVyYm9zZSBzdXBwb3J0CitGaXhlZDogVmFyaW91cyBmaXhlcyBmb3IgdGhlIEVjbGlwc2UgcGx1Zy1pbgorQWRkZWQ6IENhbiBzcGVjaWZ5IGEgY2xhc3MgbmFtZSBvbiB0aGUgY29tbWFuZCBsaW5lCitGaXhlZDogRGVmYXVsdCBwYWNrYWdlIGJ1ZyBpbiBKVW5pdENvbnZlcnRlcgorQWRkZWQ6IFJlZ3Jlc3Npb24gdGVzdHMgZm9yIEpVbml0Q29udmVydGVyCitBZGRlZDogLXF1aWV0IG9wdGlvbiB0byBKVW5pdENvbnZlcnRlcgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMi4yCisKK0ZpeGVkOiBXYXNuJ3QgaGFuZGxpbmcgc2V2ZXJhbCB0ZXN0bmcueG1sIGZpbGVzIGNvcnJlY3RseQorRml4ZWQ6IFJlbmFtZWQgLXNyYyB0byAtc291cmNlZGlyCitGaXhlZDogQ29tcGxhaW5zIGlmIG5vIHNvdXJjZWRpciBpcyBzcGVjaWZpZWQgaW4gMS40CitBZGRlZDogSW4gMS40LCBkb24ndCByZXF1aXJlIGFubm90YXRpb25zPSJqYXZhZG9jIgorRml4ZWQ6IElmIHNldFVwIGZhaWxzLCBjb21wbGFpbiBhbmQgbWFyayB0ZXN0IG1ldGhvZHMgYXMgc2tpcHMKK0ZpeGVkOiBEZXBlbmRlbnQgbWV0aG9kcyB3ZXJlbid0IHdvcmtpbmcgZm9yIDEuNAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMi4xCisyMDA1LzAyLzEyCisKK0FkZGVkOiBQYXJzZXIgY2FuIGFjY2VwdCBhbiBJbnB1dFN0cmVhbSBmb3IgdGVzdG5nLnhtbAorRml4ZWQ6IGV4cGVjdGVkLWV4Y2VwdGlvbnMgbm93IGZhaWxzIGlmIHRlc3QgcGFzc2VzCitGaXhlZDogcmVwb3J0cyBub3cgdXNlIHRoZSBzdWl0ZSBuYW1lIGluIEhUTUwKK0FkZGVkOiBpbnZvY2F0aW9uQ291bnQgYW5kIHN1Y2Nlc3NQZXJjZW50YWdlCitBZGRlZDogZGVwZW5kc09uTWV0aG9kcworQWRkZWQ6IHRpbWVPdXQgd29ya3MgaW4gbm9uLXBhcmFsbGVsIG1vZGUKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzIuMAorMjAwNC8xMi8wNgorCitBZGRlZDogcG9ydCBvbiBKREsgMS40CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLjMKKworQWRkZWQ6IG5ldyB2aWV3OiAgY2xhc3NlcyAoc3RpbGwgZXhwZXJpbWVudGFsKQorQWRkZWQ6IHRpbWVvdXQgb24gbWV0aG9kcworQWRkZWQ6IHRocmVhZC1jb3VudAorQWRkZWQ6IFRlc3RORyBpcyBub3cgbXVsdGl0aHJlYWQsIHNlZSAicGFyYWxsZWwiIGluIDxzdWl0ZT4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEuMgorCitBZGRlZDogSlVuaXRDb252ZXJ0ZXIKK0ZpeGVkOiBCdWcgd2l0aCBhZnRlckNsYXNzZXMgKHRlc3Q6IEFmdGVyQ2xhc3NDYWxsZWRBdFRoZUVuZCkKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEuMQorCitBZGRlZDogbmV3IGxpbmtzIGZvciBtZXRob2RzIGFuZCBncm91cHMgaW4gdGhlIEhUTUwgcmVwb3J0CitBZGRlZDogPG1ldGhvZHM+CitBZGRlZDogPGZpbGVzZXQ+IHRvIDx0ZXN0bmc+CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLjAKKzIwMDQvMDQvMjgKK2h0dHA6Ly9iZXVzdC5jb20vd2VibG9nLzIwMDQvMDQvMjgvCisKK0ZpeGVkOiBVcGRhdGVkIHRvIHRoZSBuZXcgRFRECitGaXhlZDogU3VpdGUgdGFibGUgb2YgY29udGVudHMgZGlzcGxheXMgZmFpbHVyZXMgZmlyc3QKK0ZpeGVkOiBCdWcgaW4gYWZ0ZXJUZXN0Q2xhc3MKK0FkZGVkOiBWYWxpZGF0aW5nIHRlc3RuZy54bWwKK0FkZGVkOiBTY29wZWQgcGFyYW1ldGVycworQWRkZWQ6ICB0ZXN0bmcueG1sCitSZW1vdmVkOiBQcm9wZXJ0eSBxdWlldAorQ2hhbmdlZDogVmVyYm9zZSBpcyBub3cgYW4gaW50ZWdlcgorQWRkZWQ6ICBEZXBlbmRlbnQgbWV0aG9kcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMC45CisKK0FkZGVkOiAgR3JvdXBzIG9mIGdyb3VwcworQWRkZWQ6ICBHcm91cHMgZm9yIENvbmZpZ3VyYXRpb24gbWV0aG9kcworQWRkZWQ6ICBQYXJhbWV0ZXJzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiswLjIKKworRml4ZWQ6ICBNZXJnZWQgVGVzdE1ldGhvZCBhbmQgVGVzdENsYXNzIGludG8gVGVzdAorQWRkZWQ6IEhUTUwgcmVwb3J0CitBZGRlZDogUmVnZXhwcyBmb3IgZ3JvdXBzCitGaXhlZDogIEluaGVyaXRhbmNlIG9mIG1ldGhvZHMKK0ZpeGVkOiAgRXhwZWN0ZWRFeGNlcHRpb24gaXMgbm93IGNhbGxlZCBFeHBlY3RlZEV4Y2VwdGlvbnMKZGlmZiAtLWdpdCBhL0NIRUNLTElTVCBiL0NIRUNLTElTVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ4OGYxCi0tLSAvZGV2L251bGwKKysrIGIvQ0hFQ0tMSVNUCkBAIC0wLDAgKzEsMTAgQEAKK0NoZWNrIGxpc3QgZm9yIHJlbGVhc2VzOgorCitwb20ueG1sCitwb20tdGVzdC54bWwKK1ZlcnNpb24uamF2YQorYnVpbGQucHJvcGVydGllcworCitkb2MvaW5kZXguaHRtbAorZG9jL2RvY3VtZW50YXRpb24tbWFpbi5odG1sCitkb2MvbWF2ZW4uaHRtbApkaWZmIC0tZ2l0IGEvRklMRVMgYi9GSUxFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJhZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvRklMRVMKQEAgLTAsMCArMSwxMSBAQAorYnVpbGQucHJvcGVydGllcw0KK2J1aWxkLnhtbA0KK2xpYi9EVEREb2MuamFyDQorZXhhbXBsZXMvYnVpbGQueG1sDQorZXhhbXBsZXMvdGVzdG5nLnByb3BlcnRpZXMNCitleGFtcGxlcy90ZXN0bmcueG1sDQorZXhhbXBsZXMvc3JjLw0KK21hdmVuLXRlc3RuZy1wbHVnaW4tMS4xLmphcg0KK0NIQU5HRVMudHh0DQorTElDRU5TRS50eHQNCitSRUFETUUNCmRpZmYgLS1naXQgYS9MSUNFTlNFLnR4dCBiL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWVlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIwMSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9OT1RFUyBiL05PVEVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzJhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RFUwpAQCAtMCwwICsxLDM4IEBACis9PT09PQorTWF2ZW4KKz09PT09CisKK0lmIHlvdSByYW4gdGhlIGZ1bGwgZGlzdCBidWlsZCwgaXQgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIGEgZmlsZSBvbiB5b3VyIGhhcmQgZHJpdmUgY2FsbGVkCisidGVzdG5nLTUuMTItYnVuZGxlLmphciIuCisKK1Rlc3Rpbmc6CisKKy0+IFVwZGF0ZSA8dmVyc2lvbj41LjEyPC92ZXJzaW9uPiBpbiBidW5kbGUtcG9tLnhtbCB0byB0aGUgY29ycmVjdCB2ZXJzaW9uCisgIG12biBpbnN0YWxsOmluc3RhbGwtZmlsZSAtRHBvbUZpbGU9YnVuZGxlLXBvbS54bWwgLURmaWxlPXRlc3RuZy01LjEyLjEuamFyCisgIGNkIC90bXAKKyAgc3ZuIGNvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbWF2ZW4vc3VyZWZpcmUvdHJ1bmsvc3VyZWZpcmUtaW50ZWdyYXRpb24tdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW1wbGUvCisgIGNkIHRlc3RuZy1zaW1wbGUKKy0+IFVwZGF0ZSA8dGVzdE5nVmVyc2lvbj4gaW4gcG9tLnhtbCB0byB0aGUgY29ycmVjdCB2ZXJzaW9uCistPiBSZW1vdmUgPGNsYXNzaWZpZXI+IGluIHBvbS54bWwgaWYgaXQncyBzdGlsbCB0aGVyZQorICBtdm4gLUR0ZXN0TmdWZXJzaW9uPTUuMTIuMSAtRHN1cmVmaXJlLnZlcnNpb249Mi41IGNsZWFuIHRlc3QKKy0+IFNlbmQgYnVuZGxlIHRvIEJyZXR0IFBvcnRlciA8YnJldHQucG9ydGVyQGdtYWlsLmNvbT4KKworPT09PT09PQorRWNsaXBzZQorPT09PT09PQorCitJIGVuZGVkIHVwIGRvaW5nIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwgYW5kIGp1c3QgZm9yIGluZm9ybWF0aW9uLCBoZXJlIGFyZSB0aGUgcGFyYW1ldGVyczoKKworUnVuIENvbmZpZ3VyYXRpb24gLyBFY2xpcHNlIGFwcGxpY2F0aW9uLgorCitDaGVjayAiUnVuIGFuIGFwcGxpY2F0aW9uIiBpbiAiUHJvZ3JhbSB0byBydW4iLCBhbmQgc2VsZWN0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VHZW5lcmF0b3IKKworVGhlIHByb2dyYW0gYXJndW1lbnRzIGFyZSAocmVwbGFjZSB0aGUgdXBkYXRlIHNpdGUgZGlyZWN0b3J5IGFwcHJvcHJpYXRlbHkpOgorCitMaW51eDoKKy1vcyAke3RhcmdldC5vc30gLXdzICR7dGFyZ2V0LndzfSAtYXJjaCAke3RhcmdldC5hcmNofSAtbmwgJHt0YXJnZXQubmx9ICAgIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yIC11cGRhdGVTaXRlIC91c3IvbG9jYWwvY2JldXN0L2phdmEvdGVzdG5nLWVjbGlwc2UtdXBkYXRlLXNpdGUgLXNpdGUgZmlsZTovdXNyL2xvY2FsL2NiZXVzdC9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlL3NpdGUueG1sICAtbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6L3Vzci9sb2NhbC9jYmV1c3QvamF2YS90ZXN0bmctZWNsaXBzZS11cGRhdGUtc2l0ZS8gIC1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTovdXNyL2xvY2FsL2NiZXVzdC9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlIC1hcnRpZmFjdFJlcG9zaXRvcnlOYW1lICJHYW55bWVkZSBBcnRpZmFjdHMiIC1jb21wcmVzcyAgLWFwcGVuZCAgLXJldXNlUGFjazIwMEZpbGVzICAtbm9EZWZhdWx0SVVzICAtdm1hcmdzIC1YbXgyNTZtCisKK01hYworLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0gICAgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VHZW5lcmF0b3IgLXVwZGF0ZVNpdGUgL1VzZXJzL2NiZXVzdC9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlIC1zaXRlIGZpbGU6L1VzZXJzL2NiZXVzdC9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlL3NpdGUueG1sICAtbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6L1VzZXJzL2NiZXVzdC9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlLyAgLWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOi9Vc2Vycy9jYmV1c3QvamF2YS90ZXN0bmctZWNsaXBzZS11cGRhdGUtc2l0ZSAtYXJ0aWZhY3RSZXBvc2l0b3J5TmFtZSAiR2FueW1lZGUgQXJ0aWZhY3RzIiAtY29tcHJlc3MgIC1hcHBlbmQgIC1yZXVzZVBhY2syMDBGaWxlcyAgLW5vRGVmYXVsdElVcyAgLXZtYXJncyAtWG14MjU2bQorCitUaGlzIHdpbGwgZ2VuZXJhdGUgdGhlIHNpdGUgaW4gfi9qYXZhL3Rlc3RuZy1lY2xpcHNlLXVwZGF0ZS1zaXRlCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzNGNhMgotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDEyIEBACitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9jYmV1c3QvdGVzdG5nLnN2ZyldKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9jYmV1c3QvdGVzdG5nKQorCitXZWxjb21lIHRvIFRlc3RORyA2LjhiZXRhCisKK1BsZWFzZSBub3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIC56aXAgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIHRoZSBUZXN0Tkcgc291cmNlcywKK3lvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBzb2Z0d2FyZSB3aXRoIHRoZW0gYmVjYXVzZSB3ZSBkZWNpZGVkCitub3QgdG8gaW5jbHVkZSB0aGUgZXh0ZXJuYWwgamFyIGZpbGVzIGluIG9yZGVyIHRvIGtlZXAgdGhlIHNpemUgZG93bi4KKworSWYgeW91IHdhbnQgdG8gYnVpbGQgVGVzdE5HLCBwbGVhc2Ugc3luYyB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnkgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmcuCisKKy0tCitUaGUgVGVzdE5HIHRlYW0KZGlmZiAtLWdpdCBhL1JFQURNRS1wdWJsaXNoIGIvUkVBRE1FLXB1Ymxpc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxZWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS1wdWJsaXNoCkBAIC0wLDAgKzEsOSBAQAorVG8gcHVibGlzaDoKKworLSAuL2dyYWRsZXcgYmludHJheVVwbG9hZCB3aWxsIHVwbG9hZCB0aGUgcmVsZWFzZSB0byBKQ2VudGVyLiBJdCB3aWxsIGZhaWwgaWYgdGhlIHZlcnNpb24gaXMgYSBTTkFQU0hPVAorLSAuL2dyYWRsZXcgdXBsb2FkQXJjaGl2ZXMgd2lsbCB1cGxvYWQKKyAgLSB0aGUgc25hcHNob3QgdG8gaHR0cHM6Ly9vc3Muc29uYXR5cGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3NuYXBzaG90cworICAtIHRoZSByZWxlYXNlIHRvIGh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorRm9yIGEgcmVsZWFzZSwgeW91IHRoZW4gbmVlZCB0byBnbyB0byBodHRwczovL29zcy5zb25hdHlwZS5vcmcvaW5kZXguaHRtbCNzdGFnaW5nUmVwb3NpdG9yaWVzIHRvIG1hbnVhbGx5IGNsb3NlIGFuZCByZWxlYXNlIHRoZSBkaXN0cmlidXRpb24uCisKK05vdGUgdGhhdCBgLi9ncmFkbGV3IHVwbG9hZEFyY2hpdmVzYCBpcyBydW4gYnkgVHJhdmlzIGFmdGVyIGVhY2ggbmV3IHB1c2ggdG8gZGVwbG95IHRoZSBsYXRlc3QgSEVBRCB0byB0aGUgc25hcHNob3QgZGlyZWN0b3J5LiBBcyBzdWNoLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYGJ1aWxkLmdyYWRsZWAgaW4gdGhlIGdpdCByZXBvIHNob3VsZCBhbHdheXMgYmUgLVNOQVBTSE9ULgpkaWZmIC0tZ2l0IGEvUkVBRE1FLmJ1aWxkIGIvUkVBRE1FLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTBlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuYnVpbGQKQEAgLTAsMCArMSw3IEBACitZb3UgbmVlZCB0byBpbnN0YWxsIGl2eSBpbiBvcmRlciB0byBidWlsZC4KKworWW91IGNhbiBlaXRoZXIgZG93bmxvYWQgaXQgZnJvbSB0aGUgaXZ5IHNpdGUgb3IgbW9yZSBzaW1wbHksCitjb3B5IGl2eS0yLjEuMC5qYXIgaW5jbHVkZWQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIH4vLmFudC9saWIuCisKK0FmdGVyIHRoaXMsICJhbnQiIHdpbGwgYnVpbGQgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgcnVuIHRoZSB0ZXN0cy4KKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLmRldiBiL1JFQURNRS5kZXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0ZjdlNQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5kZXYKQEAgLTAsMCArMSwzNiBAQAorTmV3IGluc3RhbGxhdGlvbjoKKworSW5zdGFsbCBHUEcgYXQgaHR0cDovL3d3dy5ncGd0b29scy5vcmcvZ3BnbWFpbC9pbmRleC5odG1sCitHZW5lcmF0ZSBuZXcga2V5IHdpdGggZ3BnIC0tZ2VuLWtleQorYnVpbGQtd2l0aC1tYXZlbgorZ3BnIC0tbGlzdC1rZXlzCitTZW5kIHRoZSBwdWJsaWMga2V5OgorICBncGcgLS1rZXlzZXJ2ZXIgaGtwOi8vcG9vbC5za3Mta2V5c2VydmVycy5uZXQgLS1zZW5kLWtleXMgPHB1YmxpY19rZXk+CisgIG9yIHd3d2tleXMuYXQucGdwLm5ldAorCisKKyAgaW5zdHJ1Y3Rpb25zIGF0IGh0dHBzOi8vZG9jcy5zb25hdHlwZS5vcmcvZGlzcGxheS9SZXBvc2l0b3J5L0hvdytUbytHZW5lcmF0ZStQR1ArU2lnbmF0dXJlcytXaXRoK01hdmVuCisKKworQ29uZmlndXJlIH4vLm0yL3NldHRpbmdzLnhtbCB3aXRoIE5leHVzIHVzZXIvcGFzc3dvcmQ6CisKKyAgPHNldHRpbmdzPgorICAgIDxzZXJ2ZXJzPgorICAgICAgPHNlcnZlcj4KKyAgICAgICAgPGlkPnNvbmF0eXBlLW5leHVzLXNuYXBzaG90czwvaWQ+CisgICAgICAgIDx1c2VybmFtZT4qKio8L3VzZXJuYW1lPgorICAgICAgICA8cGFzc3dvcmQ+KioqPC9wYXNzd29yZD4KKyAgICAgIDwvc2VydmVyPgorICAgICAgPHNlcnZlcj4KKyAgICAgICAgPGlkPnNvbmF0eXBlLW5leHVzLXN0YWdpbmc8L2lkPgorICAgICAgICA8dXNlcm5hbWU+KioqPC91c2VybmFtZT4KKyAgICAgICAgPHBhc3N3b3JkPioqKjwvcGFzc3dvcmQ+CisgICAgICA8L3NlcnZlcj4KKyAgICA8L3NlcnZlcnM+CisgIDwvc2V0dGluZ3M+CisKK1NuYXBob3QgZGVwbG95OgorbXZuIC1EZ3BnLnBhc3NwaHJhc2U9IC1EZ3BnLmtleW5hbWU9PHB1YmxpY19rZXk+IGRlcGxveQorCitTdGFnaW5nIGRlcGxveToKK212biAtRGdwZy5wYXNzcGhyYXNlPSAtRGdwZy5rZXluYW1lPTxwdWJsaWNfa2V5PiByZWxlYXNlOmNsZWFuIHJlbGVhc2U6cHJlcGFyZSByZWxlYXNlOnBlcmZvcm0KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTEgQEAKK1shW0J1aWxkIFN0YXR1c10oaHR0cDovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9jYmV1c3QvdGVzdG5nLnN2ZyldKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9jYmV1c3QvdGVzdG5nKQorWyFbSmF2YTkgRUEgQnVpbGQgU3RhdHVzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2plbmtpbnMvcy9odHRwcy9hZG9wdC1vcGVuamRrLmNpLmNsb3VkYmVlcy5jb20vVGVzdE5HLnN2Zz9sYWJlbD0iSmF2YTkgRUEiKV0oaHR0cHM6Ly9hZG9wdC1vcGVuamRrLmNpLmNsb3VkYmVlcy5jb20vam9iL1Rlc3RORykKK1shW0phdmE5IEppZ3NhdyBFQSBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vamVua2lucy9zL2h0dHBzL2Fkb3B0LW9wZW5qZGsuY2kuY2xvdWRiZWVzLmNvbS9UZXN0TkctSmlnc2F3LnN2Zz9sYWJlbD0iSmF2YTkgSmlnc2F3IildKGh0dHBzOi8vYWRvcHQtb3Blbmpkay5jaS5jbG91ZGJlZXMuY29tL2pvYi9UZXN0TkctSmlnc2F3KQorWyFbQXBwVmV5b3JdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2NiZXVzdC90ZXN0bmc/c3ZnPXRydWUpXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2NiZXVzdC90ZXN0bmcpCitbIVtEZXBlbmRlbmN5IFN0YXR1c10oaHR0cHM6Ly93d3cudmVyc2lvbmV5ZS5jb20vdXNlci9wcm9qZWN0cy81NTNhMDMxYzRlNWQyZTk0MDgwMDAwNTkvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly93d3cudmVyc2lvbmV5ZS5jb20vdXNlci9wcm9qZWN0cy81NTNhMDMxYzRlNWQyZTk0MDgwMDAwNTkpCitbIVtSZWZlcmVuY2UgU3RhdHVzXShodHRwczovL3d3dy52ZXJzaW9uZXllLmNvbS9qYXZhL29yZy50ZXN0bmc6dGVzdG5nL3JlZmVyZW5jZV9iYWRnZS5zdmcpXShodHRwczovL3d3dy52ZXJzaW9uZXllLmNvbS9qYXZhL29yZy50ZXN0bmc6dGVzdG5nL3JlZmVyZW5jZXMpCitbIVtNYXZlbiBDZW50cmFsXShodHRwczovL2ltZy5zaGllbGRzLmlvL21hdmVuLWNlbnRyYWwvdi9vcmcudGVzdG5nL3Rlc3RuZy5zdmcpXShodHRwczovL21hdmVuLWJhZGdlcy5oZXJva3VhcHAuY29tL21hdmVuLWNlbnRyYWwvb3JnLnRlc3RuZy90ZXN0bmcpCitbIVtMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL2NiZXVzdC90ZXN0bmcuc3ZnKV0oaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sKQorWyFbU29uYXJxdWJlIHRlY2ggZGVidF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9zb25hci9odHRwL25lbW8uc29uYXJxdWJlLm9yZy9vcmcudGVzdG5nOnRlc3RuZy90ZWNoX2RlYnQuc3ZnP2xhYmVsPVNvbmFycXViZSUyMHRlY2glMjBkZWJ0KV0oaHR0cDovL25lbW8uc29uYXJxdWJlLm9yZy9kYXNoYm9hcmQvaW5kZXg/aWQ9b3JnLnRlc3RuZzp0ZXN0bmcpCisKK0RvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0IFtUZXN0TkcncyBtYWluIHdlYiBzaXRlXShodHRwOi8vdGVzdG5nLm9yZykuCmRpZmYgLS1naXQgYS9URVNUTkctNS4xMWJldGEgYi9URVNUTkctNS4xMWJldGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL1RFU1RORy01LjExYmV0YQpkaWZmIC0tZ2l0IGEvVE9ETy50eHQgYi9UT0RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEzY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvVE9ETy50eHQKQEAgLTAsMCArMSwxNjAgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPRE8gZm9yIFRlc3RORworCisqIFBhc3MgdGhlIFhtbFRlc3QgaW4gQEJlZm9yZS9AQWZ0ZXIgbWV0aG9kcworKiBBbGxvdyBhIHRlc3RuZy54bWwgZmlsZSB0byBiZSBwYXNzZWQgd2hlbiAtdGVzdGphciBpcyB1c2VkCisqIEFkZCBvblN0YXJ0IHRvIElDb25maWd1cmF0aW9uTGlzdGVuZXIgKGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UsIGFjdHVhbGx5KQorKiBBZGQgdGltZW91dCB0byBAQmVmb3JlL0BBZnRlcgorKiBQYXNzIHBhcmFtZXRlcnMgZnJvbSBhbnQKKyogTWFrZSBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGdyb3VwcyBvbiBjb21tYW5kIGxpbmUgYW5kIGNsYXNzZXMgaW4gdGVzdG5nLnhtbAorKGFuZCBhbnkgY29tYmluYXRpb25zIHRoZXJlb2Y6ICBjb21tYW5kIGxpbmUsIGFudCwgdGVzdG5nLnhtbCkKKyogRGF0YVByb3ZpZGVyIGluZGV4IGluIHRlc3RuZy54bWwKKyogQ3JlYXRlIGEgc2VydmxldCBmb3IgcmVtb3RlIGRyaXZpbmcKKyogQWRkIHRpbWUtb3V0cyBhdCB0aGUgdGVzdG5nLnhtbC4gIEFsc286ICB0ZXN0IGFuZCBzdWl0ZSB0aW1lLW91dHM/IGh0dHA6Ly90aW55dXJsLmNvbS9rYnd4cQorKiBBZGQgd29ya2luZyBkaXIgdG8gdGhlIGFudCB0YXNrCisqIEFkZCBhIHNlcnZsZXQgc28gVGVzdE5HIGNhbiBiZSBpbnZva2VkIGZyb20gYSB3ZWIgYnJvd3NlcgorKiBNYWtlIGl0IHBvc3NpYmxlIHRvIGFkZCBsaXN0ZW5lcnMgZnJvbSB0aGUgRWNsaXBzZSBwbHVnLWluCisKK0RvYzoKKworKiBEb2N1bWVudCB0aGUgZmFjdCB0aGF0IEBUZXN0IG1ldGhvZHMgd2l0aCByZXR1cm4gdmFsdWVzIGFyZSBpZ25vcmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK09sZGVyIFRPRE8nczoKKworKiBTaG93IGVuYWJsZWQ9ZmFsc2UgbWV0aG9kcyBpbiB0aGUgcmVwb3J0cywgYXMgd2VsbCBhcyBtZXRob2RzCitpbiBncm91cHMgdGhhdCB3ZXJlIG5vdCBydW4KKyogTXVsdGktdGhyZWFkaW5nIGZvciBpbnZvY2F0aW9uQ291bnQgYW5kIG1heWJlIGZvciA8dGVzdD4gdG9vCisqIEFubm90YXRpb24gdG8gc3BlY2lmeSB0aGF0IGEgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgY29uY3VycmVudGx5IGJ5IG4gdGhyZWFkcyAKKyhvbiBzZWNvbmQgdGhvdWdodCwgd2Ugc2hvdWxkIGRvIHRoYXQgZm9yIGFuIGVudGlyZSBncm91cCkKKyogbW9yZSB0aHJlYWQgaWRlYXM6IGh0dHA6Ly93d3cudGhlc2VydmVyc2lkZS5jb20vbmV3cy90aHJlYWQudHNzP3RocmVhZF9pZD0zODkyMgorKiBwYWNrYWdlIHN1cHBvcnQgZm9yIGNvbW1hbmQgbGluZSBhbmQgYW50CisqIFBhcmFtZXRlcnMgZm9yIGNsYXNzZXMgKHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvIGNvbnN0cnVjdG9ycykKKyogdGVzdG5nLWRpc3QuemlwIHNob3VsZCBjb250YWluIGEgdG9wLWxldmVsIGRpcmVjdG9yeQorKiBGb3IgZGVwZW5kZW50IG1ldGhvZHMsIGlmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBydW4gYW4gaW5jb21wbGV0ZSBncmFwaAorKEEgZGVwZW5kcyBvbiBCIGJ1dCBCIGlzIGJlaW5nIGV4Y2x1ZGVkIGZyb20gdGhlIHJ1biksIHdoYXQgdG8gZG8/ICBJZ25vcmUKK3RoZSBleGNsdXNpb24gb24gQiBhbmQgcnVuIGl0IGFueXdheSwgb3IgYWJvcnQgd2l0aCBhbiBleGNlcHRpb24gZXhwbGFpbmluZword2hhdCdzIGhhcHBlbmluZz8pCisqIE1ha2UgdGltZU91dCgpIHdvcmsgd2l0aCBtaWxsaXNlY29uZHMgKGJ1dCBrZWVwIHNlY29uZHMgZm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5KQorKiBJbXByb3ZlIHRoZSBwbHVnLWluIEFQSSBzbyBwZW9wbGUgY2FuIGFkZCBsaXN0ZW5lcnMgd2l0aG91dCBoYXZpbmcgdG8KK21vZGlmeSBUZXN0UnVubmVyCisqIFVzZSBmYWN0b3JpZXMgZm9yIHRoZSBwcm9ncmFtbWF0aWMgQVBJLgorKiBBZGQgZHluYW1pYyBnZW5lcmF0aW9uIG9mIHRlc3RzCisqIE1ha2UgSmF2YWRvYyBjb21tZW50cyBvdmVyIG1ldGhvZHMgYXBwZWFyIGluIHRoZSBmaW5hbCByZXBvcnQKKworRG9jdW1lbnRhdGlvbjoKKyogSUhvb2thYmxlCisqIExpc3Q8SVJlcG9ydGVyPgorCisKK0RPTkUKKworKiBSZXRyeSBwYXRjaAorKiBJZiBhIG1ldGhvZCB3aXRoIGludm9jYXRpb25Db3VudCBmYWlscywgZG9uJ3QgcnVuIHRoZSBvdGhlcnMKKyogQWxsb3cgbXVsdGlwbGUgbGlzdGVuZXJzIGluIGFudCB0YXNrCisqIEFkZCB3b3JraW5nIGRpciB0byB0aGUgYW50IHRhc2sKKyogSW50cm9kdWNlICJ0ZXN0IiBhbmQgInN1aXRlIiBwYXJhbWV0ZXJzIHRvIEBUZXN0IGF0IHRoZSBjbGFzcyBsZXZlbCB0bworYXZvaWQgaGF2aW5nIHRvIHVzZSB0ZXN0bmcueG1sCisqIFJlbW92ZSBUZXN0Tkcgc3RhY2sgdHJhY2VzIGZyb20gdGhlIHJlcG9ydAorKiBXaGVuIDAgdGVzdHMgd2VyZSBydW4sIGV4aXQgd2l0aCBhbiBlcnJvciBodHRwOi8vdGlueXVybC5jb20vZnRuZzYKKyogU2hvdyBhbGwgdGhlIGV4dHJhIG91dHB1dCBmb3IgYWxsIG1ldGhvZHMgaW4gYSBzaW5nbGUgCitkZWRpY2F0ZWQgcGFnZQorKiByZXBvcnQgQVBJCisqIFNob3cgcGFyYW1ldGVycyB1c2VkIHRvIGludm9rZSBhIHNwZWNpZmljIHRlc3QKKyogc2hvdyBza2lwcGVkIGdyb3Vwcy9tZXRob2RzIGluIEhUTUwgcmVwb3J0CisqIGJlZm9yZVRlc3RHcm91cHMKKyogPHRlc3RuZyBjbGFzc2ZpbGVzZXQ+IGRvZXNuJ3QgYWRkIHRvIGNsYXNzcGF0aAorKiB0aHJlYWRQb29sU2l6ZQorKiBQYXJhbWV0ZXIgbG9nZ2luZworKiBKYXZhRG9jIGZvciBvcmcudGVzdG5nLlRlc3RORworKiBvcmcudGVzdG5nLlJlcG9ydGVyIGluIHRoZSBIVE1MIHJlcG9ydCAoc2NyZWVuc2hvdCByZWFkeSkKKyogRG9jdW1lbnQgQFBhcmFtZXRlcnMgb25seSB3b3JrcyBmb3IgQFRlc3QgKHNob3VsZCBtZW50aW9uIEBGYWN0b3J5IGFuZCBAQ29uZmlndXJhdGlvbikKKyogRG9jdW1lbnQ6IDx0ZXN0bmcgY2xhc3NmaWxlc2V0PiBkb2Vzbid0IGFkZCB0byBjbGFzc3BhdGgKKyogRG9jdW1lbnQgb3JnLnRlc3RuZy5SZXBvcnRlciBpbiB0aGUgSFRNTCByZXBvcnQgKHNjcmVlbnNob3QgcmVhZHkpCisqIERvY3VtZW50IHBhcmFtZXRlciBsb2dnaW5nCisqIEphdmFEb2MgZm9yIG9yZy50ZXN0bmcuVGVzdE5HCisqIERvY3VtZW50IHRocmVhZFBvb2xTaXplCisqIE1ha2Ugc3VyZSBpdCBjYW4gcnVuIHNldmVyYWwgdGltZXMgaW4gdGhlIHNhbWUgSlZNCisqIEltcGxlbWVudCBpbnZvY2F0aW9uQ291bnQgYW5kIHN1Y2Nlc3NQZXJjZW50YWdlCisqIFN1cHBvcnQgbXVsdGlwbGUgdGVzdG5nLnhtbCAoVGVzdE5HIGFsbG93cyBpdCBidXQgbm90IHRoZSByZXBvcnRlcnMKK3lldCkKKyogVGhlIEhUTUwgcmVwb3J0ZXIgY29sbGFwc2VzIGFsbCB0aGUgc3VpdGVzIGludG8gb25lIHJlcG9ydCwgd2Ugc2hvdWxkCitjcmVhdGUgb25lIEhUTUwgcmVwb3J0IHBlciBzdWl0ZQorKiB0ZXN0bmctZmFpbGVkLnhtbCBzaG91bGQgY29udGFpbiB0aGUgcGFyYW1ldGVycyBvZiB0ZXN0bmcueG1sIChpZiBhbnkpCisqIENyZWF0ZSBhIHRlc3RuZy1mYWlsZWQueG1sIHRoYXQgaW5jbHVkZXMgZGVwZW5kZW50IG1ldGhvZHMKKyogR2VuZXJpYyByZXBvcnRlZCB3aXRoIGNvbXBhcmUoSVRlc3RSZXN1bHQsIElUZXN0UmVzdWx0KSBmb3IKK2Vhc2llciByZXBvcnRlciBmb3IgInNsb3dlc3QgbWV0aG9kIGZpcnN0IiBvciBnZW5lcmF0ZSB0ZXN0bmctZmFpbGVkLnhtbAorKiBJdGVyYXRvciBmYWN0b3JpZXMKKyogY29uZmlndXJhdGlvbiBtZXRob2RzIGRvbid0IHJlc3BlY3QgaW5oZXJpdGFuY2UKKy0gYnVpbGQueG1sIHNob3VsZCBpc3N1ZSBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaWYgdHJ5aW5nIHRvIGJ1aWxkIHdpdGggSkRLMS40CistIEltcGxlbWVudCA8dGFzZGtkZWYgcmVzb3VyY2U9InRlc3RuZ2FudHRhc2tzIj4gc28gd2UgY2FuIGRlZmluZQorYW50IHRhc2tzIGZvciBUZXN0TkcgYW5kIEpVbml0Q29udmVydGVyIGF1dG9tYXRpY2FsbHkKKy0gV3JpdGUgZG9jdW1lbnRhdGlvbiB0byBkZWNsYXJlIGFudCB0YXNrIGluIHNlY3Rpb24gMy4yLjgKKy0gRG9jdW1lbnRhdGlvbiBmb3IgYWx3YXlzUnVuCistIEFsbG93IHRvIHNwZWNpZnkgcGFja2FnZXMgb3IgcHJlZml4IGluIHRoZSA8Y2xhc3Nlcz4gdGFnOgorICAgPGNsYXNzZXMgcHJlZml4PSJjb20uYmV1c3QudGVzdG5nIj48Y2xhc3MgbmFtZT0iQSI+PGNsYXNzIG5hbWU9IkIiPiAvPgorLSBOZXcgYXNzZXJ0IGNsYXNzZXMKKy0gTmV3IHdheXMgdG8gbGF1bmNoIAorLSBKVW5pdENvbnZlcnRlciBkb2N1bWVudGF0aW9uCistIG5ldyBiZWZvcmVTdWl0ZS9hZnRlclN1aXRlCisKKyogaW4gdGVzdG5nLWZhaWx1cmVzLnhtbCBpbmNsdWRlIHRoZSBiZWZvcmVTdWl0ZS9hZnRlclN1aXRlIG1ldGhvZHMgKHZlcnkgdHJpY2t5KQorKiBQcm92aWRlIGxvZy5wcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gKG5vdCB1c2luZyBsb2cgYW55IG1vcmUpCisqIE1ha2UgQEV4cGVjdGVkRXhjZXB0aW9ucyBmYWlsIGlmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyogTWFrZSB0aW1lT3V0KCkgd29yayBpbiBub24tcGFyYWxsZWwgbW9kZSAodGhlIGRlZmF1bHQgbW9kZSBuZWVkcyB0byBiZWNvbWUKK3BhcmFsbGVsPXRydWUgdGhyZWFkLWNvdW50PTEKKyogVGhlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIHRlc3QgcGFzc2VzIHdpdGggYSBARXhwZWN0ZWRFeGNlcHRpb25zIGlzIG5vdCAKK2F2YWlsYWJsZSB2aWEgdGhlIFRlc3RORyBBUEk6IElUZXN0UmVzdWx0LmdldFRocm93YWJsZSgpLgorKiBBZGQgYXNzZXJ0IEFQSSBmb3IgYXJyYXlzIGFuZCBjb2xsZWN0aW9ucyAodW5kZWNpZGVkIHlldDogIHBhcnRpYWwgYXNzZXJ0aW5nKQorKiBkZXBlbmRzT25NZXRob2RzCitBbGxvdyB0byBzcGVjaWZ5IDxncm91cHM+IGF0IHRoZSA8c3VpdGU+IGxldmVsCitNYWtlIFRlc3RORyBydW4gb24gY2xhc3MgZmlsZXMgYW5kIG5vdCBqdXN0IG9uIHRlc3RuZy54bWwKK01ha2UgVGVzdE5HIHJ1biBvbiBhIGphciBmaWxlIHRoYXQgaGFzIGEgdGVzdG5nLnhtbCBmaWxlIGluIGl0cyByb290IG9yIGp1c3Qgb24gYWxsCisgIHRoZSBjbGFzc2VzIGluc2lkZSB0aGF0IGphciBmaWxlLgorCitJbXBsZW1lbnQgcGFyYW1ldGVyIHBhc3Npbmcgb2YgdGVzdHM6ICBkZWZpbmUgYSBwcm9wZXJ0eSBpbiB0aGUgcHJvcGVydGllcworZmlsZSBhbmQgcGFzcyBpdCB0byB0aGUgdGVzdCBtZXRob2Q6CisKK0BUZXN0KHBhcmFtcyA9IHsgIiR7Zm59IiwgIiR7bG59IiB9CitwdWJsaWMgdm9pZCB0ZXN0TmFtZXMoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIGxhc3ROYW1lKSB7Cit9CisKK1J1biBncm91cHMgb2YgZ3JvdXBzCitMaXN0IGFsbCB0ZXN0cyB0aGF0IHdpbGwgYmUgcnVuLCBvciBzaG93IG1ldGhvZHMgcGVyIGdyb3VwCitIVE1MIGdlbmVyYXRpb24KK01ha2UgdGVzdCBhbmQgY2xhc3MgbWV0aG9kcyBkaXNjb3ZlcmFibGUKKyAgSlVuaXQgYWRhcHRlcgorTXVsdGlwbGUgRXhwZWN0ZWRFeGNlcHRpb24KK0luaGVyaXRhbmNlCitUZXN0IGxpc3RlbmVycworR3JvdXAgcmVnZXhwcyBmb3IgbGF1bmNoaW5nCisKKz09PT0KKworQSBuZXcgY29tbWVudCBoYXMgYmVlbiBwb3N0ZWQgb24geW91ciBibG9nIE90YWt1LCBDZWRyaWMncyB3ZWJsb2csIG9uIGVudHJ5CisjMTQ5IChUaGUgcG9vciBzaGFwZSBvZiBVbml0IFRlc3RpbmcpLgoraHR0cDovL2JldXN0LmNvbS93ZWJsb2cvYXJjaGl2ZXMvMDAwMTQ5Lmh0bWwKKworSVAgQWRkcmVzczogNjguNzIuNDkuMTg5CitOYW1lOiBDdXJ0IENveAorRW1haWwgQWRkcmVzczogY3VydGNveEBnbWFpbC5jb20KK1VSTDogCisKK0NvbW1lbnRzOgorCitGb3Igd2hhdGV2ZXIgaXRzIHdvcnRoLCBoZXJlIGFyZSBteSBwcm9ibGVtcyB3aXRoIEpVbml0LiAgSSd2ZSBsYXJnZWx5IGRldmVsb3BlZCB3b3JrLWFyb3VuZHMuCisKKzEuIEludGVyZmFjZS1iYXNlZCB0ZXN0aW5nIGlzIGF3a3dhcmQuCisyLiBPbmx5IGZhc3QtZmFpbCB0ZXN0cyBhcmUgc3VwcG9ydGVkLgorMy4gVGhlIGRlc2lnbiBpcyBicml0dGxlLCBwb29ybHkgZG9jdW1lbnRlZCwgYW5kIHRodXMgaGFyZCB0byBleHRlbmQuCisKK0hvdyBzaG91bGQgaW50ZXJmYWNlLWJhc2VkIHRlc3RpbmcgYmUgaGFuZGxlZCBpbiBUZXN0Tkc/ICBBIG5pY2UgZmVhdHVyZSB3b3VsZCBiZSBidW5kbGVkIHRlc3RzIGZvciBpbnRlcmZhY2VzIGluIHRoZSBqYXZhKiBuYW1lc3BhY2UgdGhhdCBhcmUgYXV0b21hdGljYWxseSBhcHBsaWVkLiAgSW4gb3RoZXIgd29yZHM6CistIGFsbCBjbGFzc2VzIHdpbGwgZmFpbCBhIChzdXByZXNzaWJsZSkgdGVzdCBpZiB0aGV5IHZpb2xhdGUgdGhlIGNvbnRyYWN0IGZvciBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKQorLSBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IENvbXBhcmFibGUgd2lsbCBmYWlsIGEgdGVzdCBpZiB0aGV5IGZhaWwgdG8gaW1wbGVtZW50IENvbXBhcmFibGUKKy0gYW5kIGxpa2V3aXNlIGZvciBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgamF2YS51dGlsLk1hcCwgamF2YS51dGlsLkxpc3QsIGV0Yy4uLgorCitXaGVuIEkgc2F5IGFsbCB0ZXN0cyBhcmUgZmFzdC1mYWlsIGluIEpVbml0LCB3aGF0IEkgbWVhbiBpcyB0aGF0IHRoZSBmaXJzdCBmYWlsZWQgYXNzZXJ0aW9uIGluIGEgbWV0aG9kIGNhdXNlcyB0aGUgdGVzdCB0byBleGl0LiAgV2hpbGUgdGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZSwgYSBtb3JlIGNvbnZlcnNhdGlvbmFsIHN0eWxlIG9mIHRlc3RzIGNhbiBzb21ldGltZXMgYmUgbXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgd3JpdGUuICBTdWNoIGEgY29udmVyc2F0aW9uYWwgdGVzdCBkb2Vzbid0IGdlbmVyYXRlIGEgc2ltcGxlIGZhaWx1cmUsIGJ1dCByYXRoZXIgYSBzY29yZS4gIFRoZSBzY29yZSBjb3VsZCBiZSBlaXRoZXIgeCBvZiB5IHBhc3NlZCBvciB4IHBlcmNlbnQgcGFzc2VkLiAgVGhlIGltcG9ydGFudCBwYXJ0IGlzIHRoYXQgdGhlIGZpcnN0IGZhaWx1cmUgZG9lc24ndCB0ZXJtaW5hdGUgdGhlIHRlc3QuCisKK0FzIEkgc2FpZCwgSSd2ZSBsYXJnZWx5IGRldmVsb3BlZCB3b3JrLWFyb3VuZHMgZm9yIGRvaW5nIHRoZXNlIGluIEpVbml0LCBidXQgZGV2ZWxvcGluZyB0b29scyBmb3IgY29udmVyc2F0aW9uYWwgdGVzdHMgdGhhdCBwbGF5IG5pY2Ugd2l0aCB0aGUgdmFyaW91cyBKVW5pdCBydW5uZXJzIHdhcyBhIHJlYWwgY2hhbGxlbmdlLiAgVGhlIGV4YWN0IGNvbnRyYWN0IHRoYXQgRWNsaXBzZSBleHBlY3RzIG9mIEpVbml0IHRlc3RzIHR1cm5zIG91dCB0byBiZSBkaWZmZXJlbnQgdGhhbiB3aGF0IGVpdGhlciBvZiB0aGUgYnVuZGxlZCBydW5uZXJzIG9yIHRoZSBBbnQgdGFzayBleHBlY3QuICBBbnlvbmUgd2hvIGNvbnNpZGVycyBlaXRoZXIgdGhlIEpVbml0IGNvZGUgb3IgaW50ZXJmYWNlcyB3ZWxsLWRvY3VtZW50ZWQgaGFzIGEgbXVjaCBkaWZmZXJlbnQgY29uY2VwdCBvZiB3ZWxsLWRvY3VtZW50ZWQgdGhhbiBJIGRvLgorCisKZGlmZiAtLWdpdCBhL2FudC8zcmRwYXJ0eS9EVEREb2MuamFyIGIvYW50LzNyZHBhcnR5L0RURERvYy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjOTk5YQotLS0gL2Rldi9udWxsCisrKyBiL2FudC8zcmRwYXJ0eS9EVEREb2MuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC8zcmRwYXJ0eS9jb2JlcnR1cmEuamFyIGIvYW50LzNyZHBhcnR5L2NvYmVydHVyYS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4ZmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC8zcmRwYXJ0eS9jb2JlcnR1cmEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC8zcmRwYXJ0eS9kb2NsYXZhLTEuMC4zLmphciBiL2FudC8zcmRwYXJ0eS9kb2NsYXZhLTEuMC4zLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjYxNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50LzNyZHBhcnR5L2RvY2xhdmEtMS4wLjMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9SRUFETUUudGVtcGxhdGUgYi9hbnQvUkVBRE1FLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjVjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvUkVBRE1FLnRlbXBsYXRlCkBAIC0wLDAgKzEsMTIgQEAKK1shW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2NiZXVzdC90ZXN0bmcuc3ZnKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2NiZXVzdC90ZXN0bmcpCisKK1dlbGNvbWUgdG8gVGVzdE5HICR7dmVyc2lvbn0KKworUGxlYXNlIG5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgLnppcCBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIFRlc3RORyBzb3VyY2VzLAoreW91IHdpbGwgbm90IGJlIGFibGUgdG8gYnVpbGQgdGhlIHNvZnR3YXJlIHdpdGggdGhlbSBiZWNhdXNlIHdlIGRlY2lkZWQKK25vdCB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBqYXIgZmlsZXMgaW4gb3JkZXIgdG8ga2VlcCB0aGUgc2l6ZSBkb3duLgorCitJZiB5b3Ugd2FudCB0byBidWlsZCBUZXN0TkcsIHBsZWFzZSBzeW5jIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBhdCBodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy4KKworLS0KK1RoZSBUZXN0TkcgdGVhbQpkaWZmIC0tZ2l0IGEvYW50L2J1aWxkLWFudC54bWwgYi9hbnQvYnVpbGQtYW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTAyMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L2J1aWxkLWFudC54bWwKQEAgLTAsMCArMSw3NCBAQAorPHByb2plY3QgbmFtZT0idGVzdG5nIiBkZWZhdWx0PSJhbGwiIGJhc2VkaXI9Ii4iPgorCisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aGlzLmRpcmVjdG9yeSIgdmFsdWU9IiR7dGVzdC5kaXJ9IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC1vdXRwdXQiIHZhbHVlPSIke3RoaXMuZGlyZWN0b3J5fS90ZXN0LW91dHB1dCIgLz4KKworICA8dGFza2RlZiBuYW1lPSJ0ZXN0bmciIGNsYXNzbmFtZT0ib3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrIiBjbGFzc3BhdGg9IiR7dGVzdG5nLmphcn0iIC8+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxlY2hvPlRoaXMgZGlyOiAke3RoaXMuZGlyZWN0b3J5fTwvZWNobz4KKyAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSIgZGlyPSIke3RoaXMuZGlyZWN0b3J5fS9idWlsZCIgLz4KKyAgCTxta2RpciBkaXI9IiR7dGhpcy5kaXJlY3Rvcnl9L2J1aWxkIiAvPgorICAJCisgIAk8amF2YWMgY2xhc3NwYXRoPSIke3Rlc3RuZy5qYXJ9IgorICAJCSAgZGVzdGRpcj0iJHt0aGlzLmRpcmVjdG9yeX0vYnVpbGQiIHNyY2Rpcj0iJHt0aGlzLmRpcmVjdG9yeX0iIGluY2x1ZGVzPSJ0ZXN0L2FudC8qLmphdmEiIC8+CisKKzwhLS0KKyAgICA8dGVzdG5nIGNsYXNzcGF0aD0iYnVpbGQ7Li4vLi4vdGVzdG5nLTUuMmJldGEtamRrMTUuamFyIgorICAgICAgICAgICAgb3V0cHV0ZGlyPSJ0ZXN0LW91dHB1dCIKKyAgICAJICAgICAgZHVtcGNvbW1hbmQ9InRydWUiPgorICAgICAgICA8eG1sZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJ0ZXN0bmcueG1sIi8+CisgICAgPC90ZXN0bmc+CistLT4KKwk8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSI+CisJPGZpbGVzZXQgZGlyPSIke3Rlc3Qtb3V0cHV0fSIgaW5jbHVkZXM9IioqIi8+PC9kZWxldGU+CisgIAkKKyAgICA8dGVzdG5nIGNsYXNzcGF0aD0iJHt0aGlzLmRpcmVjdG9yeX0vYnVpbGQ7JHt0ZXN0bmcuamFyfSIKKyAgICAgICAgICAgIG91dHB1dGRpcj0iJHt0ZXN0LW91dHB1dH0iCisgIAkgICAgcGFyYWxsZWw9Im1ldGhvZHMiCisgIAkgICAgdGhyZWFkY291bnQ9IjUiCisgICAgCWxpc3RlbmVycyA9ICJvcmcudGVzdG5nLnJlcG9ydGVycy5GYWlsZWRSZXBvcnRlciwgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRG90VGVzdExpc3RlbmVyIgorICAgIAloYWx0b25mYWlsdXJlPSJ0cnVlIgorICAgIAk+CisgICAgICAgIDxjbGFzc2ZpbGVzZXQgZGlyPSIke3RoaXMuZGlyZWN0b3J5fS9idWlsZCI+CisgICAgICAgIAk8aW5jbHVkZSBuYW1lPSJ0ZXN0L2FudC9Ob1BhY2thZ2VUZXN0LmNsYXNzIiAvPgorICAgICAgICAJPGluY2x1ZGUgbmFtZT0idGVzdC9hbnQvTXVsdGlwbGVUaHJlYWRUZXN0LmNsYXNzIiAvPgorICAgICAgICA8L2NsYXNzZmlsZXNldD4KKyAgICA8L3Rlc3RuZz4KKyAgCQorICAJPGF2YWlsYWJsZSBmaWxlPSIke3Rlc3Qtb3V0cHV0fS9BbnQgc3VpdGUvQW50IHRlc3QueG1sIiAKKyAgCQl0eXBlPSJmaWxlIiBwcm9wZXJ0eT0idGVzdC5leGlzdHMiLz4KKyAgCTxmYWlsIHVubGVzcz0idGVzdC5leGlzdHMiIAorICAJCW1lc3NhZ2U9IlRoZSBhcHByb3ByaWF0ZWx5IG5hbWVkIG91dHB1dCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQiLz4KKyAgCQorICAgIDx0ZXN0bmcgY2xhc3NwYXRoPSIke3RoaXMuZGlyZWN0b3J5fS9idWlsZDske3Rlc3RuZy5qYXJ9IgorICAgICAgICAgICAgb3V0cHV0ZGlyPSIke3Rlc3Qtb3V0cHV0fSIKKwkgICAJbGlzdGVuZXJzID0gIm9yZy50ZXN0bmcucmVwb3J0ZXJzLkZhaWxlZFJlcG9ydGVyLCBvcmcudGVzdG5nLnJlcG9ydGVycy5Eb3RUZXN0TGlzdGVuZXIiCisgICAgCWhhbHRvbmZhaWx1cmU9InRydWUiCisgICAgCXN1aXRlbmFtZT0iVGVzdCBBbnQgU3VpdGUiCisgICAgCXRlc3RuYW1lPSJUZXN0IEFudCBUZXN0IgorICAgIAk+CisgICAgICAgIDxjbGFzc2ZpbGVzZXQgZGlyPSIke3RoaXMuZGlyZWN0b3J5fS9idWlsZCI+CisgICAgICAgIAk8aW5jbHVkZSBuYW1lPSJ0ZXN0L2FudC9Eb250T3ZlcnJpZGVTdWl0ZU5hbWVUZXN0LmNsYXNzIiAvPgorICAgICAgICAgPC9jbGFzc2ZpbGVzZXQ+CisgICAgPC90ZXN0bmc+CisgIAkKKyAgCTxhdmFpbGFibGUgZmlsZT0iJHt0ZXN0LW91dHB1dH0vVGVzdCBBbnQgU3VpdGUvVGVzdCBBbnQgVGVzdC54bWwiIAorICAJCXR5cGU9ImZpbGUiIHByb3BlcnR5PSJ0ZXN0Mi5leGlzdHMiLz4KKyAgCTxmYWlsIHVubGVzcz0idGVzdDIuZXhpc3RzIiBtZXNzYWdlPSJUaGUgYXBwcm9wcmlhdGVseSBuYW1lZCBvdXRwdXQgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIi8+CisgIAkKKyAgCTwhLS0gRW5zdXJlIHN0YW5kYXJkIHRlc3RzIGdldCBydW4gLS0+CisgICAgPHRlc3RuZyBjbGFzc3BhdGg9IiR7dGhpcy5kaXJlY3Rvcnl9L2J1aWxkOyR7dGVzdG5nLmphcn0iCisgICAgICAgICAgICBvdXRwdXRkaXI9IiR7dGVzdC1vdXRwdXR9IgorICAgIAlsaXN0ZW5lcnMgPSAib3JnLnRlc3RuZy5yZXBvcnRlcnMuRmFpbGVkUmVwb3J0ZXIsIG9yZy50ZXN0bmcucmVwb3J0ZXJzLkRvdFRlc3RMaXN0ZW5lciIKKyAgICAJaGFsdG9uZmFpbHVyZT0idHJ1ZSIKKyAgICAJPgorICAgICAgICA8eG1sZmlsZXNldCBmaWxlPSIke3Rlc3QucmVzb3VyY2VzLmRpcn0vdGVzdG5nLWFudC54bWwiLz4KKyAgICA8L3Rlc3RuZz4KKyAgCTxhdmFpbGFibGUgZmlsZT0iJHt0ZXN0LW91dHB1dH0vU3VpdGVuYW1lIGZyb20geG1sL1Rlc3ROYW1lLnhtbCIgCisgIAkJdHlwZT0iZmlsZSIgcHJvcGVydHk9InRlc3QzLmV4aXN0cyIvPgorICAJPGZhaWwgdW5sZXNzPSJ0ZXN0My5leGlzdHMiIG1lc3NhZ2U9IlRoZSBhcHByb3ByaWF0ZWx5IG5hbWVkIG91dHB1dCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQiLz4KKworICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9idWlsZC10ZXN0cy54bWwgYi9hbnQvYnVpbGQtdGVzdHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTFjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvYnVpbGQtdGVzdHMueG1sCkBAIC0wLDAgKzEsMTg3IEBACis8cHJvamVjdCBuYW1lPSJ0ZXN0bmciIGRlZmF1bHQ9ImFsbCIgYmFzZWRpcj0iLiI+CisKKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgdmFsdWU9IiR7dGVzdC5vdXRwdXQuZGlyfSIvPgorICA8cHJvcGVydHkgbmFtZT0ianVuaXQucmVwb3J0LmRpciIgdmFsdWU9IiR7cmVwb3J0LmRpcn0vdGVzdC10bXAiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RuZy5yZXBvcnQuZGlyIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfSIvPgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJwcmVwYXJlLGNvbXBpbGUscnVuLHJlcG9ydHMsZG9uZSIvPgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gQ29tcGlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDxwYXRoIGlkPSJjb21waWxlLmNwIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdG5nLmphcn0iIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiBpbmNsdWRlcz0iJHtndWljZTIuamFyfSIgLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iIGluY2x1ZGVzPSIke2p1bml0Lmphcn0iIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiBpbmNsdWRlcz0iYW9wYWxsaWFuY2UtMS4wLmphciIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iZW52OmluZm8iPgorICAgIDxlY2hvPgorQkFTRURJUiAgICAgICAgICA9JHtiYXNlZGlyfQorVEVTVC5ESVIgICAgICAgICA9JHt0ZXN0LmRpcn0KK1RFU1QuQlVJTEQuRElSICAgPSR7dGVzdC5idWlsZC5kaXJ9CitSRVBPUlQuRElSICAgICAgID0ke3JlcG9ydC5kaXJ9CitKVU5JVC5SRVBPUlQuRElSID0ke2p1bml0LnJlcG9ydC5kaXJ9CitURVNUTkcuUkVQT1JULkRJUj0ke3Rlc3RuZy5yZXBvcnQuZGlyfQorICAgIDwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICA8ZWNobyBtZXNzYWdlPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBDb21waWxpbmcgdGVzdHMgLS0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im1vZGVybiIvPgorICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIKKyAgICAgICAgICAgc291cmNlPSIxLjciCisgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5jcCIKKyAgICAgICAgICAgc3JjZGlyPSIke3Rlc3QuZGlyfSIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt0ZXN0LmJ1aWxkLmRpcn0iCisgICAgLz4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiPgorICAgIDx0c3RhbXAvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5idWlsZC5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdG5nLnJlcG9ydC5kaXJ9Ii8+CisKKyAgPHRhc2tkZWYgbmFtZT0idGVzdG5nIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrIgorICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtidWlsZC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCis8IS0tCisgIDxwcm9wZXJ0eSBuYW1lPSJjb2JlcnR1cmEuZGlyIiB2YWx1ZT0iLi4vY29iZXJ0dXJhLTEuOS40LjEiIC8+CisKKyAgPHBhdGggaWQ9ImNvYmVydHVyYS5jbGFzc3BhdGgiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NvYmVydHVyYS5kaXJ9Ij4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb2JlcnR1cmEuamFyIiAvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYi8qKi8qLmphciIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorLS0+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBSdW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHBhdGggaWQ9InJ1bi5jcCI+Cis8IS0tCisgIAk8cGF0aCBsb2NhdGlvbj0idGFyZ2V0L2luc3RydW1lbnRlZC1jbGFzc2VzIiAvPgorICAJPHBhdGggcmVmaWQ9ImNvYmVydHVyYS5jbGFzc3BhdGgiIC8+CistLT4KKyAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jcCIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJ1aWxkLmRpcn0iLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0icnVuIiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIiBkZXBlbmRzPSJjb21waWxlLGNvcHktcmVzb3VyY2VzIj4KKyAgICA8ZWNobyBtZXNzYWdlPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBSdW5uaW5nIHRlc3RzIC0tIi8+CisgICAgPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJHt0ZXN0bmcuamFyfSAtLSIgLz4KKyAgICA8dGVzdG5nIGNsYXNzcGF0aHJlZj0icnVuLmNwIgorICAgICAgICAgICAgb3V0cHV0ZGlyPSIke3Rlc3RuZy5yZXBvcnQuZGlyfSI+CisgICAgICA8eG1sZmlsZXNldCBkaXI9IiR7dGVzdC5yZXNvdXJjZXMuZGlyfSIgaW5jbHVkZXM9InRlc3RuZy54bWwiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EdGVzdC5yZXNvdXJjZXMuZGlyPSR7dGVzdC5yZXNvdXJjZXMuZGlyfSIgLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1Ec3VuLmlvLnNlcmlhbGl6YXRpb24uZXh0ZW5kZWREZWJ1Z0luZm89dHJ1ZSIgLz4KKyAgICA8L3Rlc3RuZz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb3B5LXJlc291cmNlcyIgZGVzY3JpcHRpb249IkNvcGllcyByZXNvdXJjZXMuIj4KKyAgICA8Y29weSB2ZXJib3NlPSJmYWxzZSIKKyAgICAgICAgICBmaWxlPSIke3NyYy5yZXNvdXJjZXMuZGlyfS90ZXN0bmd0YXNrcyIKKyAgICAgICAgICB0b2Rpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5yZXNvdXJjZXMuZGlyfSI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy4qIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9DVlMvKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icnVuOnNpbmdsZSIgZGVzY3JpcHRpb249IlJ1biAxIHByb3BlcnR5IGZpbGUgbmFtZWQgd2l0aCB0aGUgYW50IHByb3BlcnR5IHRlc3QiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGVzdG5nLXRlc3RzLXJ1bjEgLS0iLz4KKworICAgIDx0ZXN0bmcgb3V0cHV0ZGlyPSIke3Rlc3RuZy5yZXBvcnQuZGlyfSIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJydW4uY3AiCisgICAgICAgIHVzZURlZmF1bHRMaXN0ZW5lcnM9InRydWUiCisgICAgICAgIG91dHB1dERpcj0iJHt0ZXN0bmcucmVwb3J0LmRpcn0iPgorICAgICAgPHhtbGZpbGVzZXQgZGlyPSIke3Rlc3QucmVzb3VyY2VzLmRpcn0iIGluY2x1ZGVzPSJ0ZXN0bmctc2luZ2xlLnhtbCIvPgorICAgICA8L3Rlc3RuZz4KKworICAgICAgPGVjaG8+UmVwb3J0IGNyZWF0ZWQgaW4gICAgb3BlbiAke3Rlc3RuZy5yZXBvcnQuZGlyfS9pbmRleC5odG1sPC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJ1bjphbnRwcm9wIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCB0byBzZWUgaWYgYW50IHN5c3RlbSBwcm9wZXJ0ZXMgYXJlIHBhc3NlZCBjb3JyZWN0bHkiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGVzdG5nLXRlc3RzLXJ1bi1hbnRwcm9wIC0tIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic3lzcHJvcHNldDEiIHZhbHVlPSJ2YWx1ZSAxIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic3lzcHJvcHNldDIiIHZhbHVlPSJ2YWx1ZSAyIi8+CisgICAgICA8cHJvcGVydHlzZXQgaWQ9InByb3BzZXQxIj4KKyAgICAgICAgICA8cHJvcGVydHlyZWYgbmFtZT0ic3lzcHJvcHNldDEiLz4KKyAgICAgICAgICA8cHJvcGVydHlyZWYgbmFtZT0ic3lzcHJvcHNldDIiLz4KKyAgICAgIDwvcHJvcGVydHlzZXQ+CisKKyAgICAgIDx0ZXN0bmcgb3V0cHV0ZGlyPSIke3Rlc3RuZy5yZXBvcnQuZGlyfSIKKyAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJydW4uY3AiPgorICAgICAgICAgIDx4bWxmaWxlc2V0IGRpcj0iJHt0ZXN0LnJlc291cmNlcy5kaXJ9IiBpbmNsdWRlcz0idGVzdG5nLXNpbmdsZTMueG1sIi8+CisgICAgICAgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJwcm9wc2V0MSIvPgorICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InN5c3Byb3AxIiB2YWx1ZT0idmFsdWUgMyIvPgorICAgICAgPC90ZXN0bmc+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gUnVuIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0icnVuOmNvbmYiCisgICAgICAgICAgaWY9InRlc3RuZy5jb25mIgorICAgICAgICAgIGRlcGVuZHM9ImNsZWFuOnJlcG9ydHMsY29tcGlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVuIHNwZWNpZmllZCB0ZXN0cyI+CisgICAgPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGVzdG5nLXRlc3RzLXJ1biAtLSIvPgorICAgIDxlY2hvIG1lc3NhZ2U9InVzaW5nOiAke3Rlc3RuZy5jb25mfS54bWwiLz4KKworICAgIDx0ZXN0bmcgY2xhc3NwYXRocmVmPSJydW4uY3AiCisgICAgICAgICAgICBvdXRwdXREaXI9IiR7dGVzdG5nLnJlcG9ydC5kaXJ9Ij4KKyAgICAgICAgPHhtbGZpbGVzZXQgZGlyPSIke3Rlc3QucmVzb3VyY2VzLmRpcn0iIGluY2x1ZGVzPSIke3Rlc3RuZy5jb25mfS54bWwiLz4KKyAgICA8L3Rlc3RuZz4KKworICAgIDxhbnRjYWxsIHRhcmdldD0iY2xlYW4udG1wIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBSZXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InJlcG9ydHMiPgorICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtqdW5pdC5yZXBvcnQuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdG5nLnJlcG9ydC5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0idGVzdG5nLWZhaWxlZC54bWwiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0idGVzdG5nLXJlc3VsdHMueG1sIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPHJlcG9ydCBmb3JtYXQ9Im5vZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnQuZGlyfSIvPgorICAgIDwvanVuaXRyZXBvcnQ+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbi50bXAiPgorICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5vdXRwdXQuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuOnJlcG9ydHMiPgorICAgICAgPGRlbGV0ZSBkaXI9IiR7cmVwb3J0LmRpcn0iLz4KKyAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0LnJlcG9ydC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImNsZWFuLnRtcCxjbGVhbjpyZXBvcnRzIj4KKyAgICA8ZWNobyBtZXNzYWdlPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0ZXN0IGNsZWFuIC0tIi8+CisKKyAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmJ1aWxkLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb25lIj4KKyAgICA8ZWNobz5SZXBvcnRzIGNhbiBiZSBmb3VuZCBpbjogICAgb3BlbiAke3Rlc3RuZy5yZXBvcnQuZGlyfS9pbmRleC5odG1sPC9lY2hvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L2J1aWxkLnByb3BlcnRpZXMgYi9hbnQvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDMwOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NiBAQAorIworIyBUZXN0TkcgZGlzdHJpYnV0aW9uCisjCit0ZXN0bmcuYmFzZW5hbWU9dGVzdG5nCit0ZXN0bmcudmVyc2lvbj02LjguMTQtU05BUFNIT1QKK3Rlc3RuZy5mdWxsbmFtZT0ke3Rlc3RuZy5iYXNlbmFtZX0tJHt0ZXN0bmcudmVyc2lvbn0KKworIworIyBHbG9iYWwgZGlyZWN0b3JpZXMKKyMKK3Jvb3QuZGlyPSR7YmFzZWRpcn0KK2J1aWxkLjNyZHBhcnR5LmRpcj0ke3Jvb3QuZGlyfS9idWlsZDNyZHBhcnR5CitidWlsZC5tYXZlbi1idW5kbGUuZGlyPSR7YnVpbGQuZGlyfS9tYXZlbi1idW5kbGUKK3RhcmdldD0ke3Jvb3QuZGlyfS90YXJnZXQKK2xpYi5kaXI9JHtiYXNlZGlyfS9saWIKK2xpYi1zdXBwbGllZC5kaXI9JHtiYXNlZGlyfS9saWItc3VwcGxpZWQKK3NyYy5kaXI9JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhCitzcmMucmVzb3VyY2VzLmRpcj0ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcworYnVpbGQuZGlyPSR7dGFyZ2V0fS9jbGFzc2VzCit0ZXN0LmRpcj0ke2Jhc2VkaXJ9L3NyYy90ZXN0L2phdmEKK3Rlc3QuYnVpbGQuZGlyPSR7dGFyZ2V0fS90ZXN0LWNsYXNzZXMKK3Rlc3Qub3V0cHV0LmRpcj0ke3RhcmdldH0vdGVzdC1vdXRwdXQKK3Rlc3QucmVzb3VyY2VzLmRpcj0ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcworZXhhbXBsZS5kaXI9JHtiYXNlZGlyfS9leGFtcGxlcworCisjCisjIEphciBmaWxlcworIworYmVhbnNoZWxsLmphcj1ic2gtMi4wYjQuamFyCitndWljZTIuamFyPWd1aWNlLTIuMC5qYXIKK2p1bml0Lmphcj1qdW5pdC00LjEwLmphcgorYW50Lmphcj1hbnQtMS43LjAuamFyCitqY29tbWFuZGVyLmphcj1qY29tbWFuZGVyLTEuMjcuamFyCit5YW1sLmphcj1zbmFrZXlhbWwtMS4xMi5qYXIKKworYWxsLmphci5maWxlcz0ke2JlYW5zaGVsbC5qYXJ9LCR7anVuaXQuamFyfSwke2FudC5qYXJ9LCR7amNvbW1hbmRlci5qYXJ9LCR7eWFtbC5qYXJ9LCR7Z3VpY2UyLmphcn0KKworIworIyBOYW1lcyBvZiBkaXN0cmlidXRpb25zCisjCit0ZXN0bmcuamFyPSR7dGFyZ2V0fS8ke3Rlc3RuZy5mdWxsbmFtZX0uamFyCit0ZXN0bmcuZGlzdC5qYXI9JHt0ZXN0bmcuZnVsbG5hbWV9LWRpc3QuamFyCitzb3VyY2VzLnRlc3RuZy5qYXI9JHt0ZXN0bmcuZnVsbG5hbWV9LXNvdXJjZXMuamFyCit0ZXN0bmcuanVuaXQuamFyPSR7dGVzdG5nLmZ1bGxuYW1lfS1qdW5pdC5qYXIKK3Rlc3RuZy5ub2JzaC5ub2d1aWNlLmphcj0ke3Rlc3RuZy5mdWxsbmFtZX0tbm9ic2gtbm9ndWljZS5qYXIKK3Rlc3RuZy5ic2gubm9ndWljZS5qYXI9JHt0ZXN0bmcuZnVsbG5hbWV9LWJzaC1ub2d1aWNlLmphcgordGVzdG5nLm5vYnNoLmd1aWNlLmphcj0ke3Rlc3RuZy5mdWxsbmFtZX0tbm9ic2gtZ3VpY2UuamFyCit0ZXN0bmcuaWJpYmxpby5qYXI9JHt0ZXN0bmcuZnVsbG5hbWV9LWJ1bmRsZS5qYXIKK3Rlc3RuZy56aXA9JHt0YXJnZXR9LyR7dGVzdG5nLmZ1bGxuYW1lfS56aXAKK3Rlc3RuZy5tYXZlbi1idW5kbGU9JHt0YXJnZXR9LyR7dGVzdG5nLmZ1bGxuYW1lfS1idW5kbGUuamFyCit0ZXN0bmcuamF2YWRvYy56aXA9JHt0ZXN0bmcuZnVsbG5hbWV9LWphdmFkb2MuemlwCisKK290aGVyLmphcnMuZGlyPSR7dGFyZ2V0fS9vdGhlci1qYXJzCisKKyMKKyMgVGVzdCBsb2NhdGlvbnMKKyMKK3Rlc3QubG9jYXRpb24ubXNnPVRlc3QgcmVzdWx0cyBjYW4gYmUgZm91bmQgaW5cblwKK3Rlc3QvdGVzdC1vdXRwdXQvaW5kZXguaHRtbAorCisjCisjIEVjbGlwc2UgcGx1Zy1pbgorIwordGVzdG5nLWVjbGlwc2UuZGlyPS4uL3Rlc3RuZy1lY2xpcHNlCisKKyMKKyMgTWF2ZW4gcGx1Zy1pbiB2ZXJzaW9uCisjIE5vdGUsIHRoaXMgdmVyc2lvbiBudW1iZXIgaXMgYXBwZW5kZWQgdG8gdGhlIHJlc3VsdGluZyBwbHVnLWluIGphcgorIwordGVzdG5nLW1hdmVuLnZlcnNpb249MS4yCisKKyMKKyMgSkRLIDEuNCBmb3Igc2FuaXR5IGNoZWNraW5nIGJlZm9yZSBhIGRpc3RyaWJ1dGlvbgorIworamF2YTE0LmhvbWU9amRrLTEuNS4wXzA0CisjamF2YTE0LmhvbWU9YzovamF2YS9qZGstMS40LjJfMDgKZGlmZiAtLWdpdCBhL2FudC9idWlsZC54bWwgYi9hbnQvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTRiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvYnVpbGQueG1sCkBAIC0wLDAgKzEsNDY3IEBACis8cHJvamVjdCBuYW1lPSJ0ZXN0bmciIGRlZmF1bHQ9ImRldiIgYmFzZWRpcj0iLiIgeG1sbnM6aXZ5PSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50Ij4KKyAgCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBUZXN0TkcgYnVpbGQgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIENyZWF0ZWQgY2JldXN0LCBBcHJpbCAyNnRoLCAyMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9wdGltaXplIiB2YWx1ZT0iZmFsc2UiIC8+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFBSRVBBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXBlbmRzPSJyZXRyaWV2ZS1kZXBlbmRlbmNpZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBlcmZvcm1zIGFsbCBwcmVwYXJhdGlvbnMgcmVxdWlyZWQgdG8gYnVpbGQuIj4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7b3RoZXIuamFycy5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gRFVNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImR1bXAiIGRlc2NyaXB0aW9uPSJEdW1wcyBhbGwgcHJvcGVydGllcy4iIGRlcGVuZHM9InByZXBhcmUiPgorICAgIDxlY2hvcHJvcGVydGllcyAvPgorICA8L3RhcmdldD4KKworCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBWQUxJREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZSIgZGVzY3JpcHRpb249IlZhbGlkYXRlcyB0aGUgYnVpbGQgZW52aXJvbm1lbnQuIj4KKyAgICA8IS0tIGphdmEgZ3JlYXRlciB0aGFuIDEuNiByZXF1aXJlZCB0byBidWlsZCAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyZXF1aXJlZEphdmFWZXJzaW9uIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxLjkiIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMS44IiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuNyIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWwgdW5sZXNzPSJyZXF1aXJlZEphdmFWZXJzaW9uIgorICAgICAgICAgIG1lc3NhZ2U9IkphdmEgdmVyc2lvbiAxLjcgcmVxdWlyZWQuIiAvPgorICAgIDwhLS0gdmFsaWRhdGUgYW50IHZlcnNpb24gdG9vIC4uLiAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBDT1BZLVJFU09VUkNFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImNvcHktcmVzb3VyY2VzIiBkZXNjcmlwdGlvbj0iQ29waWVzIHJlc291cmNlcy4iPgorICAgIDxjb3B5IHZlcmJvc2U9ImZhbHNlIgorICAgICAgICAgIGZpbGU9IiR7c3JjLnJlc291cmNlcy5kaXJ9L3Rlc3RuZ3Rhc2tzIgorICAgICAgICAgIHRvZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnJlc291cmNlcy5kaXJ9Ij4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovLioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0NWUy8qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9ImRldiIKKyAgICAgICAgICBkZXBlbmRzPSJwcmVwYXJlLHZhbGlkYXRlLGNvcHktcmVzb3VyY2VzLGJ1aWxkLHRlc3RzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIgorICAgICAgICAgIGRlcGVuZHM9InByZXBhcmUsdmFsaWRhdGUsY29weS1yZXNvdXJjZXMsYnVpbGQsZGlzdCx0ZXN0cyx0ZXN0LWFudCxqYXZhZG9jcyxkaXN0IiAvPgorCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUsY29tcGlsZSx0ZXN0bmctamFyLWFsbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RuZy1qYXItYWxsIj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZS1qYXIiPgorICAgICAgPHBhcmFtIG5hbWU9Imphci5maWxlIiB2YWx1ZT0iJHt0ZXN0bmcuamFyfSIgLz4KKyAgICA8L2FudGNhbGw+CisgICAgPGphciBqYXJmaWxlPSIke3Rlc3RuZy5qYXJ9IiB1cGRhdGU9InRydWUiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2xpYi5kaXJ9LyR7YmVhbnNoZWxsLmphcn0iIC8+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtqY29tbWFuZGVyLmphcn0iIC8+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHt5YW1sLmphcn0iIC8+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzaW5nbGUiPgorICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQtdGVzdHMueG1sIiB0YXJnZXQ9InJ1bjpzaW5nbGUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBDb21waWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cGF0aCBpZD0iY29tcGlsZTIuY3AiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIgaW5jbHVkZXM9IiR7YWxsLmphci5maWxlc30iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiCisgICAgICAgICAgZGVwZW5kcz0icHJlcGFyZSxjb3B5LXJlc291cmNlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgc291cmNlcyI+CisgICAgPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQ29tcGlsaW5nIHNvdXJjZXMgLS0iIC8+CisKKyAgICA8ZWNobz5TcmM6JHtzcmMuZGlyfTwvZWNobz4KKyAgICA8amF2YWMgY2xhc3NwYXRocmVmPSJjb21waWxlMi5jcCIKKyAgICAgICAgICAgdmVyYm9zZT0iZmFsc2UiCisgICAgICAgICAgIHRhcmdldD0iMS43IgorICAgICAgICAgICBkZWJ1Zz0idHJ1ZSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7b3B0aW1pemV9IgorICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmRpcn0iPgorICAgICAgPHNyYyBwYXRoPSIke3NyYy5kaXJ9IiAvPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZTphbGwiIGRlcGVuZHM9ImNvbXBpbGUiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJleGFtcGxlcyI+CisgICAgPGFudCBpbmhlcml0YWxsPSJubyIgYW50ZmlsZT0iZXhhbXBsZXMvYnVpbGQueG1sIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RzIiBkZXBlbmRzPSJidWlsZCIgZGVzY3JpcHRpb249InJ1bnMgYWxsIEpESzUgdGVzdHMgd2l0aCBKREs1IGRpc3RybyI+CisgICAgPGFudCBpbmhlcml0YWxsPSJubyIgYW50ZmlsZT0iYnVpbGQtdGVzdHMueG1sIiAvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdC1hbnQiIGRlcGVuZHM9ImJ1aWxkIj4KKyAgICA8ZWNobyBtZXNzYWdlPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUZXN0aW5nIGFudCB0ZXN0bmcgdGFzayBmdW5jdGlvbmFsaXR5IC0tIiAvPgorICAgIDxhbnQgaW5oZXJpdGFsbD0ibm8iIGFudGZpbGU9ImJ1aWxkLWFudC54bWwiIC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gRG9jdW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyIgZGVwZW5kcz0iYnVpbGQsamF2YWRvY3MtY3VycmVudCIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImRvY2xhdmEiPgorICAgIDxqYXZhZG9jCisgICAgICBkb2NsZXRwYXRoPSIzcmRwYXJ0eS9kb2NsYXZhLTEuMC4zLmphciIKKyAgICAgIGJvb3RjbGFzc3BhdGg9IiR7amF2YWhvbWV9L2pyZS9saWIvcnQuamFyIgorICAgICAgY2xhc3NwYXRoPSIke3Rlc3RuZy5qYXJ9OmxpYi8ke2FudC5qYXJ9OmxpYi8ke2d1aWNlMi5qYXJ9OmxpYi9hb3BhbGxpYW5jZS0xLjAuamFyIgorICAgICAgbWF4bWVtb3J5PSIyMDQ4TSIKKyAgICAgIGFkZGl0aW9uYWxwYXJhbT0iLXF1aWV0IgorICAgICAgdmVyYm9zZT0iZmFsc2UiCisgICAgICBkZXN0ZGlyPSJqYXZhZG9jcyIKKyAgICAgID4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvdGVzdG5nLyouamF2YSIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvdGVzdG5nL3htbC9YbWwqLmphdmEiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy8qKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxkb2NsZXQgbmFtZT0iY29tLmdvb2dsZS5kb2NsYXZhLkRvY2xhdmEiPgorICAgICAgICA8cGFyYW0gbmFtZT0iLXN0dWJzIiB2YWx1ZT0iYnVpbGQvc3R1YnMiIC8+CisgICAgICAgIDxwYXJhbSBuYW1lPSItaGRmIi8+CisgICAgICAgIDxwYXJhbSBuYW1lPSJwcm9qZWN0Lm5hbWUiIHZhbHVlPSJUZXN0TkciIC8+CisgICAgICAgIDwhLS0gdmVyc2lvbmluZyAtLT4KKyAgICAgICAgPHBhcmFtIG5hbWU9Ii1zaW5jZSIvPgorICAgICAgICA8cGFyYW0gbmFtZT0iZG9jbGF2YS9wcmV2aW91cy54bWwiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9InYxIiAvPgorICAgICAgICA8cGFyYW0gbmFtZT0iLWFwaXZlcnNpb24iIHZhbHVlPSJ2MiIvPgorICAgICAgICA8IS0tIGZlZGVyYXRpb24gLS0+CisgICAgICAgIDxwYXJhbSBuYW1lPSItZmVkZXJhdGUiIC8+CisgICAgICAgIDxwYXJhbSBuYW1lPSJKREsiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9Imh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvYXBpL2luZGV4Lmh0bWw/Ii8+CisgICAgICAgIDxwYXJhbSBuYW1lPSItZmVkZXJhdGlvbnhtbCIvPjxwYXJhbSBuYW1lPSJKREsiLz4KKyAgICAgICAgPHBhcmFtIG5hbWU9Imh0dHA6Ly9kb2NsYXZhLmdvb2dsZWNvZGUuY29tL3N2bi9zdGF0aWMvYXBpL29wZW5qZGstNi54bWwiLz4KKyAgICAgIDwvZG9jbGV0PgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcy1jdXJyZW50Ij4KKyAgICA8amF2YWRvYyBhZGRpdGlvbmFscGFyYW09Ii1xdWlldCIgZGVzdGRpcj0iamF2YWRvY3MiIHNvdXJjZT0iMS43IiB3aW5kb3d0aXRsZT0iVGVzdE5HIgorICAgICAgY2xhc3NwYXRoPSIke3Rlc3RuZy5qYXJ9IiBjbGFzc3BhdGhyZWY9ImNvbXBpbGUyLmNwIiB2ZXJib3NlPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL3Rlc3RuZy8qLmphdmEiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL3Rlc3RuZy94bWwvWG1sKi5qYXZhIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy90ZXN0bmcvYW5ub3RhdGlvbnMvKioiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXZhZG9jPgorICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIERpc3RyaWJ1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQsYWxsLWphci1mbGF2b3JzLGRpc3QtYWxsLXppcCxlY2xpcHNlIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iYWxsLWphci1mbGF2b3JzIiBkZXBlbmRzPSJkaXN0LWp1bml0LGRpc3Qtbm9ic2gtZ3VpY2UsZGlzdC1ic2gtbm9ndWljZSxkaXN0LW5vYnNoLW5vZ3VpY2UsZGlzdC10ZXN0bmctZGlzdCxkaXN0LXRlc3RuZy1qYXZhZG9jIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdC1qdW5pdCI+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJjcmVhdGUtamFyIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJqYXIuZmlsZSIgdmFsdWU9IiR7b3RoZXIuamFycy5kaXJ9LyR7dGVzdG5nLmp1bml0Lmphcn0iIC8+CisgICAgPC9hbnRjYWxsPgorICAgIDxqYXIgamFyZmlsZT0iJHtvdGhlci5qYXJzLmRpcn0vJHt0ZXN0bmcuanVuaXQuamFyfSIgdXBkYXRlPSJ0cnVlIj4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtsaWIuZGlyfS8ke2JlYW5zaGVsbC5qYXJ9IiAvPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2xpYi5kaXJ9LyR7amNvbW1hbmRlci5qYXJ9IiAvPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2xpYi5kaXJ9LyR7anVuaXQuamFyfSIgLz4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtsaWIuZGlyfS8ke3lhbWwuamFyfSIgLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0LW5vYnNoLWd1aWNlIj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZS1qYXIiPgorICAgICAgPHBhcmFtIG5hbWU9Imphci5maWxlIiB2YWx1ZT0iJHtvdGhlci5qYXJzLmRpcn0vJHt0ZXN0bmcubm9ic2guZ3VpY2UuamFyfSIgLz4KKyAgICA8L2FudGNhbGw+CisgICAgPGphciBqYXJmaWxlPSIke290aGVyLmphcnMuZGlyfS8ke3Rlc3RuZy5ub2JzaC5ndWljZS5qYXJ9IiB1cGRhdGU9InRydWUiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2xpYi5kaXJ9LyR7Z3VpY2UyLmphcn0iIC8+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtqY29tbWFuZGVyLmphcn0iIC8+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtqdW5pdC5qYXJ9IiAvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QtYnNoLW5vZ3VpY2UiPgorICAgIDxhbnRjYWxsIHRhcmdldD0iY3JlYXRlLWphciI+CisgICAgICA8cGFyYW0gbmFtZT0iamFyLmZpbGUiIHZhbHVlPSIke290aGVyLmphcnMuZGlyfS8ke3Rlc3RuZy5ic2gubm9ndWljZS5qYXJ9IiAvPgorICAgIDwvYW50Y2FsbD4KKyAgICA8amFyIGphcmZpbGU9IiR7b3RoZXIuamFycy5kaXJ9LyR7dGVzdG5nLmJzaC5ub2d1aWNlLmphcn0iIHVwZGF0ZT0idHJ1ZSI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtiZWFuc2hlbGwuamFyfSIgLz4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtsaWIuZGlyfS8ke2pjb21tYW5kZXIuamFyfSIgLz4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtsaWIuZGlyfS8ke2p1bml0Lmphcn0iIC8+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdC1ub2JzaC1ub2d1aWNlIj4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZS1qYXIiPgorICAgICAgPHBhcmFtIG5hbWU9Imphci5maWxlIiB2YWx1ZT0iJHtvdGhlci5qYXJzLmRpcn0vJHt0ZXN0bmcubm9ic2gubm9ndWljZS5qYXJ9IiAvPgorICAgIDwvYW50Y2FsbD4KKyAgICA8amFyIGphcmZpbGU9IiR7b3RoZXIuamFycy5kaXJ9LyR7dGVzdG5nLmJzaC5ub2d1aWNlLmphcn0iIHVwZGF0ZT0idHJ1ZSI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtqY29tbWFuZGVyLmphcn0iIC8+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7bGliLmRpcn0vJHtqdW5pdC5qYXJ9IiAvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QtdGVzdG5nLWRpc3QiPgorICAgIDxhbnRjYWxsIHRhcmdldD0iY3JlYXRlLWphciI+CisgICAgICA8cGFyYW0gbmFtZT0iamFyLmZpbGUiIHZhbHVlPSIke290aGVyLmphcnMuZGlyfS8ke3Rlc3RuZy5kaXN0Lmphcn0iIC8+CisgICAgPC9hbnRjYWxsPgorICAgIDxqYXIgamFyZmlsZT0iJHtvdGhlci5qYXJzLmRpcn0vJHt0ZXN0bmcuZGlzdC5qYXJ9IiB1cGRhdGU9InRydWUiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2xpYi5kaXJ9LyR7amNvbW1hbmRlci5qYXJ9IiAvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QtdGVzdG5nLWphdmFkb2MiIGRlcGVuZHM9ImphdmFkb2NzIj4KKyAgICA8emlwIGRlc3RmaWxlPSIke290aGVyLmphcnMuZGlyfS8ke3Rlc3RuZy5qYXZhZG9jLnppcH0iPgorICAgICAgICA8ZmlsZXNldCBkaXI9ImphdmFkb2NzIi8+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLWphciIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIGphciBmaWxlIHdpdGggdGhlIFRlc3RuZyBjbGFzc2VzIGFuZCBub3RoaW5nIGVsc2UiIAorICAgICAgICAgIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxkZWxldGUgZmlsZT0iJHtqYXIuZmlsZX0iIC8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtqYXIuZmlsZX0iID4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0ib3JnLnRlc3RuZy5UZXN0TkciIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dGVzdG5nLnZlcnNpb259LSR7RFNUQU1QfSR7VFNUQU1QfSIgLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IlRFU1RORy0ke3Rlc3RuZy52ZXJzaW9ufSIgLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkaXN0LWFsbC16aXAiIGRlcGVuZHM9ImRpc3QtcHJlcGFyZSxqYXZhZG9jcyI+CisgICAgPHByb3BlcnR5IG5hbWU9InppcC5kaXIiIHZhbHVlPSJ0ZXN0bmctJHt0ZXN0bmcudmVyc2lvbn0iIC8+CisgICAgPGVjaG8+QWRkaW5nICR7dGVzdG5nLmZ1bGxuYW1lfTwvZWNobz4KKyAgICA8emlwIHppcGZpbGU9IiR7dGVzdG5nLnppcH0iPgorICAgICAgPHppcGZpbGVzZXQgcHJlZml4PSIke3ppcC5kaXJ9IiBkaXI9IiR7dGFyZ2V0fSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7dGVzdG5nLmZ1bGxuYW1lfS5qYXIiIC8+CisgICAgICA8L3ppcGZpbGVzZXQ+CisgICAgICA8emlwZmlsZXNldCBwcmVmaXg9IiR7emlwLmRpcn0iIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXNmaWxlPSJGSUxFUyIgLz4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtvdGhlci5qYXJzLmRpcn0iIHByZWZpeD0iJHt6aXAuZGlyfS9vdGhlci1qYXJzIi8+CisgICAgICA8emlwZmlsZXNldCBkaXI9ImphdmFkb2NzIiBwcmVmaXg9IiR7emlwLmRpcn0vamF2YWRvY3MiIC8+CisgICAgICA8emlwZmlsZXNldCBkaXI9InNyYyIgcHJlZml4PSIke3ppcC5kaXJ9L3NyYyIgLz4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0ic3ByaW5nIiBwcmVmaXg9IiR7emlwLmRpcn0vc3ByaW5nIiAvPgorICAgICAgPHppcGZpbGVzZXQgZGlyPSJkb2MiIHByZWZpeD0iJHt6aXAuZGlyfS9kb2MiIC8+CisgICAgICA8emlwZmlsZXNldCBkaXI9IiR7c3JjLnJlc291cmNlcy5kaXJ9IgorICAgICAgICAgICAgICAgcHJlZml4PSIke3ppcC5kaXJ9L3Jlc291cmNlcyIgCisgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5jc3MiLz4KKyAgICA8L3ppcD4KKyAgPC90YXJnZXQ+CisgIAorPCEtLQorICA8dGFyZ2V0IG5hbWU9ImRpc3QtbWF2ZW4tYnVuZGxlIiBkZXBlbmRzPSJkaXN0LWFsbC16aXAiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQubWF2ZW4tYnVuZGxlLmRpcn0iIC8+CisgICAgPGNvcHkgZmlsZT0iYnVuZGxlLXBvbS54bWwiIHRvZmlsZT0iJHtidWlsZC5tYXZlbi1idW5kbGUuZGlyfS9wb20ueG1sIiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8ZXhwYW5kcHJvcGVydGllcy8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8amFyIGRlc3RmaWxlPSIke2J1aWxkLm1hdmVuLWJ1bmRsZS5kaXJ9LyR7c291cmNlcy50ZXN0bmcuamFyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIC8+CisgICAgPC9qYXI+CisKKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJncGciPgorICAgICAgPGFyZyB2YWx1ZT0iLSAteWVzIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iLWFiIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0bmcuamFyfSIgLz4KKyAgICA8L2V4ZWM+CisKKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJncGciPgorICAgICAgPGFyZyB2YWx1ZT0iLSAteWVzIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iLWFiIiAvPgorICAgICAgPGFyZyB2YWx1ZT0iJHtidWlsZC5tYXZlbi1idW5kbGUuZGlyfS9wb20ueG1sIiAvPgorICAgIDwvZXhlYz4KKworICAgIDxleGVjIGV4ZWN1dGFibGU9ImdwZyI+CisgICAgICA8YXJnIHZhbHVlPSItIC15ZXMiIC8+CisgICAgICA8YXJnIHZhbHVlPSItYWIiIC8+CisgICAgICA8YXJnIHZhbHVlPSIke2J1aWxkLm1hdmVuLWJ1bmRsZS5kaXJ9LyR7c291cmNlcy50ZXN0bmcuamFyfSIgLz4KKyAgICA8L2V4ZWM+CisKKyAgICA8amFyIGRlc3RmaWxlPSIke3Rlc3RuZy5tYXZlbi1idW5kbGV9Ij4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7YnVpbGQubWF2ZW4tYnVuZGxlLmRpcn0vcG9tLnhtbCIgLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7YnVpbGQubWF2ZW4tYnVuZGxlLmRpcn0vJHtzb3VyY2VzLnRlc3RuZy5qYXJ9IiAvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHtidWlsZC5tYXZlbi1idW5kbGUuZGlyfS8qYXNjIiAvPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHt0ZXN0bmcuamFyfSIgLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdG5nLmphcn0uYXNjIiAvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKy0tPgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIiBkZXBlbmRzPSJ1cGRhdGUtcmVhZG1lIj4KKyAgICA8ZGVsZXRlIGZpbGU9IntvdGhlci5qYXJzLmRpcn0vJHt0ZXN0bmcubm9ic2guamFyfSIgLz4KKyAgICA8bWtkaXIgZGlyPSIke290aGVyLmphcnMuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1cGRhdGUtcmVhZG1lIj4KKyAgICA8Y29weSBmaWxlPSJSRUFETUUudGVtcGxhdGUiIHRvZmlsZT0iUkVBRE1FLm1kIiAvPgorICAgIDxyZXBsYWNlIGZpbGU9IlJFQURNRS5tZCIgdG9rZW49IiR7dmVyc2lvbn0iIHZhbHVlPSIke3Rlc3RuZy52ZXJzaW9ufSIgLz4KKyAgICA8dG91Y2ggZmlsZT0iVEVTVE5HLSR7dGVzdG5nLnZlcnNpb259IiAvPgorICA8L3RhcmdldD4KKyAgICAgIAorICA8dGFyZ2V0IG5hbWU9ImVjbGlwc2UiIGRlc2NyaXB0aW9uPSJVc2VkIGJ5IENlZHJpYyB0byBidWlsZCBkaXN0cmlidXRpb25zIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iamRrMTUuamFyIgorICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0bmctZWNsaXBzZS5kaXJ9L2xpYi90ZXN0bmcuamFyIiAvPgorCisgICAgPGRlbGV0ZSBmaWxlPSIke2pkazE1Lmphcn0iIC8+CisgICAgPGNvcHkgZmlsZT0iJHt0ZXN0bmcuamFyfSIgdG9maWxlPSIke2pkazE1Lmphcn0iIC8+CisKKyAgICA8IS0tIHNvdXJjZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZXMiIHZhbHVlPSIke3Rlc3RuZy1lY2xpcHNlLmRpcn0vbGliL3Rlc3RuZy1zb3VyY2VzLmphciIvPgorICAgIDxlY2hvPlNvdXJjZXM6ICR7c291cmNlc308L2VjaG8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtzb3VyY2VzfSIgYmFzZWRpcj0ic3JjL21haW4vamF2YS8iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZnRwIj4KKyAgICA8IS0tCisgICAgICAgICAgPGZ0cCBhY3Rpb249InB1dCIKKyAgICAgICAgICAgICBzZXJ2ZXI9ImJldXN0LmNvbSIKKyAgICAgICAgICAgICByZW1vdGVkaXI9IncvdGVzdG5nL3Rlc3Qtb3V0cHV0IgorICAgICAgICAgICAgIHVzZXJpZD0iJHt1c2VyaWR9IgorICAgICAgICAgICAgIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSI+CisgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iYzpcd2VibG9naWNcZGV2XHNhbmRib3hcY2JldXN0XHRlc3RuZ1x0ZXN0XHRlc3Qtb3V0cHV0Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJpbmRleC5odG1sIiAvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im1haW4uaHRtbCIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0b2MuaHRtbCIgLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqZWdyZXNzaW9uKiIgLz4KKyAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZnRwPgorICAgICAgLS0+CisgICAgPGZ0cCBhY3Rpb249InB1dCIKKyAgICAgICAgIHNlcnZlcj0iYmV1c3QuY29tIgorICAgICAgICAgcmVtb3RlZGlyPSJ3L3Rlc3RuZyIKKyAgICAgICAgIHVzZXJpZD0iJHt1c2VyaWR9IgorICAgICAgICAgcGFzc3dvcmQ9IiR7cGFzc3dvcmR9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtyb290LmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke3Rlc3RuZy56aXB9IiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZhZG9jcy8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdG5nLTEuMC5kdGQiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdC5kaXJ9L2RvYyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouaHRtbCIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2Z0cD4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZ0cDIiPgorICAgIDxmdHAgYWN0aW9uPSJwdXQiCisgICAgICAgICBzZXJ2ZXI9ImJldXN0LmNvbSIKKyAgICAgICAgIHJlbW90ZWRpcj0idy90ZXN0bmciCisgICAgICAgICB1c2VyaWQ9IiR7dXNlcmlkfSIKKyAgICAgICAgIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdC5kaXJ9L3Rlc3QiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0LW91dHB1dC8qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Jvb3QuZGlyfS90ZXN0Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdC1yZXBvcnQvKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2Z0cD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLm1hdmVuLWJ1bmRsZS5kaXJ9IiAvPgorICAgIDxkZWxldGUgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InRlc3RuZyouamFyLCouemlwIiAvPgorICAgIDwvZGVsZXRlPgorICAgIDxkZWxldGUgZGlyPSJ0ZXN0LW91dHB1dCIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgorICAgIDxkZWxldGUgZGlyPSJ0ZXN0LW91dHB1dC10ZXN0cyIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgorICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQtdGVzdHMueG1sIiB0YXJnZXQ9ImNsZWFuIiAvPgorICAgIDxhbnQgZGlyPSJleGFtcGxlcyIgdGFyZ2V0PSJjbGVhbiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBNYXZlbjEvMiBEaXN0cmlidXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorICA8dGFyZ2V0IG5hbWU9Im1hdmVuLXBsdWdpbiI+CisgICAgPGphciBkZXN0ZmlsZT0ibWF2ZW4tdGVzdG5nLXBsdWdpbi0ke3Rlc3RuZy1tYXZlbi52ZXJzaW9ufS5qYXIiCisgICAgICAgICBiYXNlZGlyPSIuL21hdmVuLyIgLz4KKyAgPC90YXJnZXQ+CistLT4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIEl2eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0icmV0cmlldmUtZGVwZW5kZW5jaWVzIiBkZXNjcmlwdGlvbj0iUmV0cmlldmUgZGVwZW5kZW5jaWVzIHdpdGggaXZ5Ij4KKyAgICA8aXZ5OnJldHJpZXZlIGxvZz0icXVpZXQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icHVibGlzaCI+CisgICAgPGl2eTpyZXNvbHZlIC8+CisgICAgPG1rZGlyIGRpcj0iZGlzdC9qYXJzIiAvPgorICAgIDxjb3B5IGZpbGU9IiR7dGVzdG5nLmphcn0iIHRvZGlyPSJkaXN0L2phcnMiIC8+CisgICAgPGl2eTpwdWJsaXNoIG9yZ2FuaXNhdGlvbj0ib3JnLnRlc3RuZyIgcmVzb2x2ZXI9ImxvY2FsIiBvdmVyd3JpdGU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwb20iPgorICAgIDxpdnk6bWFrZXBvbSBpdnlmaWxlPSJpdnkueG1sIiBwb21maWxlPSJpdnktcG9tLnhtbCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBDb2RlIGNvdmVyYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorICA8cHJvcGVydHkgbmFtZT0iY29iZXJ0dXJhLmRpciIgdmFsdWU9Ii4uL2NvYmVydHVyYS0xLjkuNC4xIiAvPgorCisgIDxwYXRoIGlkPSJjb2JlcnR1cmEuY2xhc3NwYXRoIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2JlcnR1cmEuZGlyfSI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29iZXJ0dXJhLmphciIgLz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvKiovKi5qYXIiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8dGFza2RlZiBjbGFzc3BhdGhyZWY9ImNvYmVydHVyYS5jbGFzc3BhdGgiIHJlc291cmNlPSJ0YXNrcy5wcm9wZXJ0aWVzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iY292ZXJhZ2U6Y3JlYXRlIj4KKyAgICA8Y29iZXJ0dXJhLWluc3RydW1lbnQgY2xhc3NwYXRoPSJjb2JlcnR1cmEtMS45LjQuMS9saWIvKiIgdG9kaXI9InRhcmdldC9pbnN0cnVtZW50ZWQtY2xhc3NlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb2JlcnR1cmEtaW5zdHJ1bWVudD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb3ZlcmFnZSI+CisgICAgPGNvYmVydHVyYS1yZXBvcnQgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSJ0YXJnZXQvY292ZXJhZ2UtcmVwb3J0Ii8+CisgIDwvdGFyZ2V0PgorLS0+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9pdnktMi4xLjAuamFyIGIvYW50L2l2eS0yLjEuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9pdnktMi4xLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9pdnkueG1sIGIvYW50L2l2eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhNWE5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9pdnkueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxpdnktbW9kdWxlIHZlcnNpb249IjIuMCI+CisgIDxpbmZvIG9yZ2FuaXNhdGlvbj0ib3JnLnRlc3RuZyIgbW9kdWxlPSJ0ZXN0bmciIHJldmlzaW9uPSI2LjViZXRhIi8+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5hcGFjaGUuYW50IiBuYW1lPSJhbnQiIHJldj0iMS43LjAiIC8+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJqdW5pdCIgbmFtZT0ianVuaXQiIHJldj0iNC4xMCIgLz4KKyAgICA8ZGVwZW5kZW5jeSBvcmc9Im9yZy5iZWFuc2hlbGwiIG5hbWU9ImJzaCIgcmV2PSIyLjBiNCIgLz4KKyAgICA8ZGVwZW5kZW5jeSBvcmc9ImNvbS5nb29nbGUuaW5qZWN0IiBuYW1lPSJndWljZSIgcmV2PSIyLjAiIC8+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJvcmcueWFtbCIgbmFtZT0ic25ha2V5YW1sIiByZXY9IjEuMTUiIC8+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJjb20uYmV1c3QiIG5hbWU9Impjb21tYW5kZXIiIHJldj0iMS40OCIgLz4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L2l2eS1tb2R1bGU+CisKZGlmZiAtLWdpdCBhL2FudC9vbGQvYnVpbGQtZG9nZm9vZC54bWwgYi9hbnQvb2xkL2J1aWxkLWRvZ2Zvb2QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzk4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb2xkL2J1aWxkLWRvZ2Zvb2QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxwcm9qZWN0IG5hbWU9InRlc3RuZyIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KKwk8cHJvcGVydHkgbmFtZT0idGVzdG5nLmhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpciIgdmFsdWU9IiR7dGVzdG5nLmhvbWV9LzNyZHBhcnR5Ii8+CisgCTxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKwk8cGF0aCBpZD0icnVuLmNwIj4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi96X2J1aWxkIiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPg0KKwkJCTxpbmNsdWRlIG5hbWU9Imp1bml0LmphciIvPg0KKwkJCTxpbmNsdWRlIG5hbWU9IiR7YmVhbnNoZWxsLmphcn0iLz4NCisJCQk8aW5jbHVkZSBuYW1lPSIke3Fkb3guamFyfSIvPg0KKwkJPC9maWxlc2V0Pg0KKyAJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9Ly4uL2xpYi90b29scy5qYXIiLz4KKwk8L3BhdGg+CisKKwk8dGFyZ2V0IG5hbWU9InJ1biIgZGVzY3JpcHRpb249IlJ1biB0ZXN0cyIgPgorCQk8ZWNobz5EZWZpbmluZyB0YXNrIGZyb20gJHtiYXNlZGlyfS8uLi8ke2pkazE1LnRlc3RuZy5qYXJ9PC9lY2hvPgorCQk8dGFza2RlZiBuYW1lPSJ0ZXN0bmciCisgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrIgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7YmFzZWRpcn0vLi4vJHtqZGsxNS50ZXN0bmcuamFyfSIgLz4KKworCQk8dGVzdG5nIGNsYXNzcGF0aHJlZj0icnVuLmNwIgorICAgICAgICBkdW1wY29tbWFuZD0idHJ1ZSIgdmVyYm9zZT0iOSIgb3V0cHV0ZGlyPSJ0ZXN0LW91dHB1dHMiIGhhbHRvbmZhaWx1cmU9InRydWUiPgorCQkJPHhtbGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJ0ZXN0bmctc2luZ2xlLnhtbCIgLz4KKwkJCTwveG1sZmlsZXNldD4KKwkJPC90ZXN0bmc+CisJPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vbGQvYnVpbGQtc2FtcGxlLnhtbCBiL2FudC9vbGQvYnVpbGQtc2FtcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZlYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29sZC9idWlsZC1zYW1wbGUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxwcm9qZWN0IG5hbWU9InRlc3RuZyIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KKworCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0bmcuaG9tZSIgdmFsdWU9ImM6L2phdmEvdGVzdG5nIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0iJHt0ZXN0bmcuaG9tZX0vbGliIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RuZy5qYXIiIHZhbHVlPSIke3Rlc3RuZy5ob21lfS90ZXN0bmctMi41LWpkazE1LmphciIgLz4KKworCTxwYXRoIGlkPSJydW4uY3AiPgorCQk8IS0tCisgICAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jcCIvPgorLS0+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQiIC8+CisJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsaWIuZGlyfS9xZG94LTEuNS5qYXIiLz4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phdmEuaG9tZX0vLi4vbGliL3Rvb2xzLmphciIvPgorCTwvcGF0aD4KKworCTx0YXJnZXQgbmFtZT0icnVuIiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIiA+CisJCTxlY2hvPkRlZmluaW5nIHRhc2sgZnJvbSAke3Rlc3RuZy5qYXJ9PC9lY2hvPgorCQk8dGFza2RlZiBuYW1lPSJ0ZXN0bmciCisgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrIgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdG5nLmphcn0iIC8+CisKKwkJPHRlc3RuZyBjbGFzc3BhdGhyZWY9InJ1bi5jcCIKKyAgICAgICAgZHVtcGNvbW1hbmQ9InRydWUiIHZlcmJvc2U9IjkiIG91dHB1dGRpcj0idGVzdC1vdXRwdXRzIj4KKwkJCTxjbGFzc2ZpbGVzZXQgZGlyPSJidWlsZCI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovanVzdGluLypUZXN0Ki5jbGFzcyIgLz4KKwkJCTwvY2xhc3NmaWxlc2V0PgorCQk8L3Rlc3RuZz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTJmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTAsMCArMSwyNSBAQAordmVyc2lvbjogInticmFuY2h9IHtidWlsZH0iCitza2lwX3RhZ3M6IHRydWUKK2Nsb25lX2RlcHRoOiAxMAorCitidWlsZDoKKyAgdmVyYm9zaXR5OiBkZXRhaWxlZAorCitidWlsZF9zY3JpcHQ6CisgIC0gZ3JhZGxldy5iYXQgYXNzZW1ibGUgLS1pbmZvIC0tbm8tZGFlbW9uCisKK3Rlc3Rfc2NyaXB0OgorICAtIGdyYWRsZXcuYmF0IHRlc3QgLS1pbmZvIC0tbm8tZGFlbW9uCisKK2Vudmlyb25tZW50OgorICBtYXRyaXg6CisgIC0gSkFWQV9IT01FOiBDOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS43LjAKKyAgLSBKQVZBX0hPTUU6IEM6XFByb2dyYW0gRmlsZXNcSmF2YVxqZGsxLjguMAorICAtIEpBVkFfSE9NRTogQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxKYXZhXGpkazEuNy4wCisgIC0gSkFWQV9IT01FOiBDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEphdmFcamRrMS44LjAKKworbWF0cml4OgorICBmYXN0X2ZpbmlzaDogdHJ1ZQorCitjYWNoZToKKyAgLSBDOlxVc2Vyc1xhcHB2ZXlvclwuZ3JhZGxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL2p1bml0Y29udmVydGVyLmJhdCBiL2Jpbi9qdW5pdGNvbnZlcnRlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiY2QwYgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9qdW5pdGNvbnZlcnRlci5iYXQKQEAgLTAsMCArMSw2IEBACitzZXQgUk9PVD1jOlxqYXZhXFRlc3RORw0KK3NldCBKQVI9JVJPT1QlXHRlc3RuZy00LjUtamRrMTUuamFyOyVST09UJVx0ZXN0XGJ1aWxkDQorCXJlbSBzZXQgSkFSPSVST09UJVx0ZXN0bmctNC41LWpkazE0LmphcjslUk9PVCVcdGVzdC0xNFxidWlsZA0KKw0KK2phdmEgLWVhIC1jbGFzc3BhdGggJVJPT1QlXDNyZHBhcnR5XGp1bml0LmphcjslSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyOyVKQVIlOyVDTEFTU1BBVEglIG9yZy50ZXN0bmcuSlVuaXRDb252ZXJ0ZXIgLXJlc3RvcmUgLW92ZXJ3cml0ZSAtYW5ub3RhdGlvbiAtc3JjZGlyIHNyYw0KKw0KZGlmZiAtLWdpdCBhL2Jpbi9tYXN0ZXIuYmF0IGIvYmluL21hc3Rlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9tYXN0ZXIuYmF0CkBAIC0wLDAgKzEgQEAKK3Rlc3RuZyAtaG9zdGZpbGUgdGVzdFxob3N0cy5wcm9wZXJ0aWVzIC1kIHRlc3RcdGVzdC1vdXRwdXQgJTEgJTIgJTMgJTQgJTUgdGVzdFx0ZXN0bmcueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3J1bi10ZXN0cy5zaCBiL2Jpbi9ydW4tdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI3OTJlMQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9ydW4tdGVzdHMuc2gKQEAgLTAsMCArMSwxNCBAQAorUk9PVD1+L2phdmEvdGVzdG5nCitWRVJTSU9OPTUuMAorSkFSMTQ9JFJPT1QvdGVzdG5nLSRWRVJTSU9OLWpkazE0LmphcgorSkFSMTU9JFJPT1QvdGVzdG5nLSRWRVJTSU9OLWpkazE1LmphcgorCitqYXZhIC1lYSAtY2xhc3NwYXRoIHRlc3QvYnVpbGQ6JFJPT1QvM3JkcGFydHkvanVuaXQuamFyOiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphcjokSkFSMTU6JENMQVNTUEFUSCBvcmcudGVzdG5nLlRlc3RORyB0ZXN0L3Rlc3RuZy54bWwKKworamF2YSAtZWEgLWNsYXNzcGF0aCB0ZXN0L3Y0L2J1aWxkOiRST09ULzNyZHBhcnR5L2p1bml0LmphcjokSkFWQV9IT01FL2xpYi90b29scy5qYXI6JEpBUjE1OiRDTEFTU1BBVEggb3JnLnRlc3RuZy5UZXN0TkcgdGVzdC92NC90ZXN0bmcueG1sCisKK2phdmEgLWVhIC1jbGFzc3BhdGggdGVzdC0xNC9idWlsZDokUk9PVC8zcmRwYXJ0eS9qdW5pdC5qYXI6JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyOiRKQVIxNDokQ0xBU1NQQVRIIG9yZy50ZXN0bmcuVGVzdE5HIC1zb3VyY2VkaXIgdGVzdC0xNC9zcmMgdGVzdC0xNC90ZXN0bmcueG1sCisKK2phdmEgLWVhIC1jbGFzc3BhdGggdGVzdC0xNC92NC9idWlsZDokUk9PVC8zcmRwYXJ0eS9qdW5pdC5qYXI6JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyOiRKQVIxNDokQ0xBU1NQQVRIIG9yZy50ZXN0bmcuVGVzdE5HIC1zb3VyY2VkaXIgdGVzdC0xNC92NC9zcmMgdGVzdC0xNC92NC90ZXN0bmcueG1sCisKKwpkaWZmIC0tZ2l0IGEvYmluL3NsYXZlLmJhdCBiL2Jpbi9zbGF2ZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkMmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9zbGF2ZS5iYXQKQEAgLTAsMCArMSBAQAordGVzdG5nIC1kIGNsaWVudC1vdXRwdXQgLXNsYXZlICUxICUyICUzDQpkaWZmIC0tZ2l0IGEvYmluL3Rlc3RuZy5iYXQgYi9iaW4vdGVzdG5nLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWExZWRmCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3Rlc3RuZy5iYXQKQEAgLTAsMCArMSw1IEBACitzZXQgUk9PVD1jOlxqYXZhXFRlc3RORw0KK3NldCBKQVI9JVJPT1QlXHRlc3RuZy01LjJiZXRhLWpkazE1LmphcjslUk9PVCVcdGVzdFxidWlsZA0KKwlyZW0gc2V0IEpBUj0lUk9PVCVcdGVzdG5nLTQuNS1qZGsxNC5qYXI7JVJPT1QlXHRlc3QtMTRcYnVpbGQNCisNCitqYXZhIC1lYSAtY2xhc3NwYXRoICVST09UJVwzcmRwYXJ0eVxqdW5pdC5qYXI7JUpBVkFfSE9NRSVcbGliXHRvb2xzLmphcjslSkFSJTslQ0xBU1NQQVRIJSBvcmcudGVzdG5nLlRlc3RORyAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KZGlmZiAtLWdpdCBhL2Jpbi90ZXN0bmcuc2ggYi9iaW4vdGVzdG5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOGJiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vdGVzdG5nLnNoCkBAIC0wLDAgKzEsNiBAQAorUk9PVD1+L2phdmEvdGVzdG5nCitWRVJTSU9OPTUuMAorSkFSMTQ9JFJPT1QvdGVzdG5nLSRWRVJTSU9OLWpkazE0LmphcgorSkFSMTU9JFJPT1QvdGVzdG5nLSRWRVJTSU9OLWpkazE1LmphcgorCitqYXZhIC1lYSAtY2xhc3NwYXRoICRST09UL3Rlc3QvYnVpbGQ6JFJPT1QvM3JkcGFydHkvanVuaXQuamFyOiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphcjokSkFSMTU6JENMQVNTUEFUSCBvcmcudGVzdG5nLlRlc3RORyAkKgpkaWZmIC0tZ2l0IGEvYnVpbGQtd2l0aC1ncmFkbGUgYi9idWlsZC13aXRoLWdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGU3M2YyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtd2l0aC1ncmFkbGUKQEAgLTAsMCArMSBAQAorLi9ncmFkbGV3IC0tZGFlbW9uIC0tc3RhY2t0cmFjZSBjbGVhbiBidWlsZCB0ZXN0CmRpZmYgLS1naXQgYS9idWlsZC13aXRoLW1hdmVuIGIvYnVpbGQtd2l0aC1tYXZlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNmMxMzVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtd2l0aC1tYXZlbgpAQCAtMCwwICsxLDI1IEBACisjIFR3byBkaWZmZXJlbnQgUE9NcyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFRlc3RORyB3aXRoIE1hdmVuIGJlY2F1c2UgaXQncyBub3QKKyMgYWxsb3dlZCB0byBoYXZlIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4KKyMgLSBwb20ueG1sIGRlZmluZXMgdGhlIHByb2plY3QgdmVyc2lvbiAibi1TTkFQU0hPVCIsIGJ1aWxkcywgamFycyBhbmQgZGVwbG95cyAoYnV0IGRvZXNuJ3QKKyMgcnVuIHRoZSB0ZXN0cykuCisjIC0gcG9tLXRlc3QueG1sIGRlY2xhcmVzIGEgdGVzdCBkZXBlbmRlbmN5IG9uICJuLVNOQVBTSE9UIiwgd2hpY2ggaXQgd2lsbCBmaW5kCisjIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5ICh+Ly5tMi9yZXBvc2l0b3J5KS4gQWxsIGl0IGRvZXMgdGhlbiBpcyBydW4gdGhlIHRlc3RzLgorCisKK212biBjbGVhbiBpbnN0YWxsIC1EZ3BnLnNraXA9dHJ1ZQorI29yIGlmIHlvdSB3YW50IHRvIHNpZ24gdGhlIGphciwgdW5jb21tZW50IHRoaXM6CisjbXZuIGNsZWFuIGluc3RhbGwKKworbXZuIC1mIHBvbS10ZXN0LnhtbCB0ZXN0CisKKworZWNobworZWNobyAiVG8gcnVuIHRoZSB0ZXN0czogbXZuIC1mIHBvbS10ZXN0LnhtbCB0ZXN0IgorZWNobyAiVG8gZGVwbG95IHRvIHRoZSBzbmFwc2hvdCByZXBvc2l0b3J5OiBtdm4gZGVwbG95IgorZWNobyAiVG8gZGVwbG95IHRvIHRoZSByZWxlYXNlIGRpcmVjdG9yeTogbXZuIHJlbGVhc2U6Y2xlYW4gcmVsZWFzZTpwcmVwYXJlIHJlbGVhc2U6cGVyZm9ybSIKK2VjaG8gIk5leHVzIFVJOiAgaHR0cHM6Ly9vc3Muc29uYXR5cGUub3JnL2luZGV4Lmh0bWwiCitlY2hvICJXaWtpOiBodHRwczovL2RvY3Muc29uYXR5cGUub3JnL2Rpc3BsYXkvUmVwb3NpdG9yeS9Tb25hdHlwZStPU1MrTWF2ZW4rUmVwb3NpdG9yeStVc2FnZStHdWlkZSIKKworIyBkZXBsb3kgd2l0aG91dCB0YWdnaW5nOiBtdm4gZGVwbG95IC1EcGVyZm9ybVJlbGVhc2UKKworCmRpZmYgLS1naXQgYS9idWlsZC5ncmFkbGUgYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMTg3MwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDE3NyBAQAorYnVpbGRzY3JpcHQgeworCisgICAgZGVmIGFfdXNlciA9IGhhc1Byb3BlcnR5KCdhcnRpZmFjdG9yeV91c2VyJykgPyBhcnRpZmFjdG9yeV91c2VyIDogU3lzdGVtLmdldGVudignYXJ0aWZhY3RvcnlfdXNlcicpCisgICAgZGVmIGFfcGFzc3dvcmQgPSBoYXNQcm9wZXJ0eSgnYXJ0aWZhY3RvcnlfcGFzc3dvcmQnKSA/IGFydGlmYWN0b3J5X3Bhc3N3b3JkIDogU3lzdGVtLmdldGVudignYXJ0aWZhY3RvcnlfcGFzc3dvcmQnKQorCisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIG1hdmVuIHsKKyAgICAgICAgICAgIHVybCAnaHR0cDovL2RsLmJpbnRyYXkuY29tL2NiZXVzdC9tYXZlbicKKyAgICAgICAgfQorICAgICAgICBtYXZlbiB7CisgICAgICAgICAgICB1cmwgJ2h0dHA6Ly9vc3MuamZyb2cub3JnL2FydGlmYWN0b3J5L3BsdWdpbnMtcmVsZWFzZScKKyAgICAgICAgICAgIGNyZWRlbnRpYWxzIHsKKyAgICAgICAgICAgICAgICB1c2VybmFtZSA9ICIke2FfdXNlcn0iCisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSAiJHthX3Bhc3N3b3JkfSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIC8vQ2hlY2sgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBoZXJlOiBodHRwOi8vcGx1Z2lucy5ncmFkbGUub3JnL3BsdWdpbi9jb20uamZyb2cuYXJ0aWZhY3RvcnkKKyAgICAgICAgY2xhc3NwYXRoICJvcmcuamZyb2cuYnVpbGRpbmZvOmJ1aWxkLWluZm8tZXh0cmFjdG9yLWdyYWRsZTozLjAuMyIKKyAgICAgICAgY2xhc3NwYXRoICJpby5jb2RlYXJ0ZS5ncmFkbGUubmV4dXM6Z3JhZGxlLW5leHVzLXN0YWdpbmctcGx1Z2luOjAuNS4zIgorICAgICAgICBjbGFzc3BhdGggImNvbS5uZXRmbGl4Lm5lYnVsYTpncmFkbGUtZXh0cmEtY29uZmlndXJhdGlvbnMtcGx1Z2luOjMuMC4zIgorICAgIH0KK30KKworcGx1Z2lucyB7CisgICAgaWQgImNvbS5qZnJvZy5iaW50cmF5IiB2ZXJzaW9uICIxLjIiCisgICAgaWQgImNvbS5qZnJvZy5hcnRpZmFjdG9yeSIgdmVyc2lvbiAiMy4xLjEiCisgICAgaWQgIm9yZy5zb25hcnF1YmUiIHZlcnNpb24gIjEuMCIKK30KKwordmVyc2lvbiA9ICc2LjkuMTAtU05BUFNIT1QnCisKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICduZWJ1bGEub3B0aW9uYWwtYmFzZScKK2FwcGx5IHBsdWdpbjogJ25lYnVsYS5wcm92aWRlZC1iYXNlJworCit0YXJnZXRDb21wYXRpYmlsaXR5ID0gIjEuNyIKK3NvdXJjZUNvbXBhdGliaWxpdHkgPSAiMS43IgorCithcHBseSBwbHVnaW46ICdvc2dpJworCityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuQ2VudHJhbCgpCisgICAgamNlbnRlcigpCisgICAgbWF2ZW4geworICAgICAgICB1cmwgJ2h0dHA6Ly9kbC5iaW50cmF5LmNvbS9jYmV1c3QvbWF2ZW4nCisgICAgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgJ29yZy5iZWFuc2hlbGw6YnNoOjIuMGI0JworICAgIGNvbXBpbGUgJ2NvbS5iZXVzdDpqY29tbWFuZGVyOjEuNDgnCisKKyAgICBjb21waWxlICdvcmcuYXBhY2hlLmFudDphbnQ6MS43LjAnLCBvcHRpb25hbAorICAgIGNvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTAnLCBvcHRpb25hbAorICAgIGNvbXBpbGUgJ29yZy55YW1sOnNuYWtleWFtbDoxLjE1Jywgb3B0aW9uYWwKKworICAgIHByb3ZpZGVkICdjb20uZ29vZ2xlLmluamVjdDpndWljZTo0LjA6bm9fYW9wJworCisgICAgdGVzdENvbXBpbGUgJ29yZy5hc3NlcnRqOmFzc2VydGotY29yZToyLjAuMCcKKyAgICB0ZXN0Q29tcGlsZSAnb3JnLnRlc3RuZzp0ZXN0bmc6Ni45LjQnCit9CisKK3Rhc2sgc291cmNlSmFyKHR5cGU6IEphcikgeworICAgIGdyb3VwICdCdWlsZCcKKyAgICBkZXNjcmlwdGlvbiAnQW4gYXJjaGl2ZSBvZiB0aGUgc291cmNlIGNvZGUnCisgICAgY2xhc3NpZmllciAnc291cmNlcycKKyAgICBmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKK30KKworYXJ0aWZhY3RzIHsKKyAgICBzb3VyY2VKYXIKK30KKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUmVwbGFjZVRva2VucworCitkZWYgZ2VuZXJhdGVkU291cmNlc0ZvbGRlciA9IHByb2plY3REaXIudG9TdHJpbmcoKSArICcvc3JjL2dlbmVyYXRlZC9qYXZhJworCitkZWYgZGlyRnJvbSA9IHByb2plY3REaXIudG9TdHJpbmcoKSArICcvc3JjL21haW4vcmVzb3VyY2VzL29yZy90ZXN0bmcvaW50ZXJuYWwnCitkZWYgZGlyVG8gPSBnZW5lcmF0ZWRTb3VyY2VzRm9sZGVyICsgIi9vcmcvdGVzdG5nL2ludGVybmFsIgorZGVmIGZpbGVGcm9tID0gJ1ZlcnNpb25UZW1wbGF0ZUphdmEnCitkZWYgZmlsZVRvID0gJ1ZlcnNpb24uamF2YScKKwordGFzayByZW1vdmVWZXJzaW9uIHsKKyAgICBkZWxldGUgZGlyVG8gKyBmaWxlVG8KK30KKworc291cmNlU2V0cyB7CisgICAgZ2VuZXJhdGVkIHsKKyAgICAgICAgamF2YSB7CisgICAgICAgICAgICBzcmNEaXIgJ3NyYy9nZW5lcmF0ZWQvamF2YScKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgeworICAgICAgICAgICAgc3JjRGlyICdzcmMvZ2VuZXJhdGVkL3Jlc291cmNlcycKKyAgICAgICAgfQorICAgIH0KK30KKworc291cmNlU2V0cyB7CisgICAgbWFpbiB7CisgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggKz0gZ2VuZXJhdGVkLm91dHB1dAorICAgICAgICBydW50aW1lQ2xhc3NwYXRoICs9IGdlbmVyYXRlZC5vdXRwdXQKKyAgICB9Cit9CisKK2dyYWRsZS5wcm9qZWN0c0V2YWx1YXRlZCB7CisgICAgY29tcGlsZUphdmEuZGVwZW5kc09uKG15RGlyKQorfQorCit0YXNrIG15RGlyIHsKKyAgICBkZWxldGUgZGlyVG8gKyAiLyIgKyBmaWxlVG8KKyAgICBta2RpcihkaXJUbykKK30KKworLy8gSW5jbHVkZSB0aGUgZ2VuZXJhdGVkIFZlcnNpb24uY2xhc3MgaW4gdGhlIGphcgoramFyIHsKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGluc3RydWN0aW9uICdCdW5kbGUtTGljZW5zZScsICdodHRwOi8vYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcKKyAgICAgICAgaW5zdHJ1Y3Rpb24gJ0J1bmRsZS1EZXNjcmlwdGlvbicsICdUZXN0TkcgaXMgYSB0ZXN0aW5nIGZyYW1ld29yay4nCisgICAgICAgIGluc3RydWN0aW9uICdJbXBvcnQtUGFja2FnZScsCisgICAgICAgICAgICAnYnNoLio7dmVyc2lvbj0iWzIuMC4wLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwnLAorICAgICAgICAgICAgJ2NvbS5iZXVzdC5qY29tbWFuZGVyLio7dmVyc2lvbj0iWzEuNy4wLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwnLAorICAgICAgICAgICAgJ2NvbS5nb29nbGUuaW5qZWN0Lio7dmVyc2lvbj0iWzEuMiwxLjMpIjtyZXNvbHV0aW9uOj1vcHRpb25hbCcsCisgICAgICAgICAgICAnanVuaXQuZnJhbWV3b3JrO3ZlcnNpb249IlszLjguMSwgNS4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCcsCisgICAgICAgICAgICAnb3JnLmp1bml0Lio7cmVzb2x1dGlvbjo9b3B0aW9uYWwnLAorICAgICAgICAgICAgJ29yZy5hcGFjaGUudG9vbHMuYW50Lio7dmVyc2lvbj0iWzEuNy4wLCAyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsJywKKyAgICAgICAgICAgICdvcmcueWFtbC4qO3ZlcnNpb249IlsxLjYsMi4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwnLAorICAgICAgICAgICAgJyFjb20uYmV1c3QudGVzdG5nJywKKyAgICAgICAgICAgICchb3JnLnRlc3RuZy4qJywKKyAgICAgICAgICAgICchY29tLnN1bi4qJywKKyAgICAgICAgICAgICcqJworICAgIH0KKyAgICBmcm9tICIkYnVpbGREaXIvY2xhc3Nlcy9nZW5lcmF0ZWQiCit9CisKK3Rhc2sgY3JlYXRlVmVyc2lvbih0eXBlOiBDb3B5LCBkZXBlbmRzT246IG15RGlyKSB7CisgICAgcHJpbnRsbigiQ3JlYXRpbmcgVmVyc2lvbiBmaWxlOiAke3ZlcnNpb259IGluICR7ZGlyVG99IikKKyAgICBmcm9tIGRpckZyb20KKyAgICBpbmNsdWRlIGZpbGVGcm9tCisgICAgaW50byhkaXJUbykKKyAgICByZW5hbWUoZmlsZUZyb20sIGZpbGVUbykKKyAgICBmaWx0ZXIoUmVwbGFjZVRva2VucywgdG9rZW5zOiBbdmVyc2lvbjogdmVyc2lvbl0pCit9CisKK2NvbXBpbGVKYXZhLmRlcGVuZHNPbihjcmVhdGVWZXJzaW9uKQorCit0ZXN0IHsKKyAgICB1c2VUZXN0TkcoKSB7CisgICAgICAgIHN1aXRlcyAnc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy54bWwnCisgICAgfQorLy8gICAgdGVzdExvZ2dpbmcuc2hvd1N0YW5kYXJkU3RyZWFtcyA9IHRydWUKKyAgICBzeXN0ZW1Qcm9wZXJ0aWVzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKQorICAgIHN5c3RlbVByb3BlcnRpZXNbJ3Rlc3QucmVzb3VyY2VzLmRpciddID0gJ2J1aWxkL3Jlc291cmNlcy90ZXN0LycKK30KKworaWYgKEphdmFWZXJzaW9uLmN1cnJlbnQoKS5pc0phdmE4Q29tcGF0aWJsZSgpKSB7CisgICAgYWxscHJvamVjdHMgeworICAgICAgICB0YXNrcy53aXRoVHlwZShKYXZhZG9jKSB7CisgICAgICAgICAgICBvcHRpb25zLmFkZFN0cmluZ09wdGlvbignWGRvY2xpbnQ6bm9uZScsICctcXVpZXQnKQorICAgICAgICB9CisgICAgfQorfQorCitzb25hcnF1YmUgeworICAgIHByb3BlcnRpZXMgeworICAgICAgICBwcm9wZXJ0eSAic29uYXIuaG9zdC51cmwiLCAiaHR0cDovL25lbW8uc29uYXJxdWJlLm9yZyIKKyAgICAgICAgcHJvcGVydHkgInNvbmFyLmFuYWx5c2lzLm1vZGUiLCAicHJldmlldyIKKyAgICAgICAgcHJvcGVydHkgInNvbmFyLmdpdGh1Yi5yZXBvc2l0b3J5IiwgImNiZXVzdC90ZXN0bmciCisgICAgICAgIHByb3BlcnR5ICJzb25hci5naXRodWIubG9naW4iLCAidGVzdG5nLWJvdCIKKyAgICB9Cit9CisKK2FwcGx5IGZyb206ICdncmFkbGUvcHVibGlzaGluZy5ncmFkbGUnCmRpZmYgLS1naXQgYS9idW5kbGUtcG9tLnhtbCBiL2J1bmRsZS1wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjlkODAKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGUtcG9tLnhtbApAQCAtMCwwICsxLDU5IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDwhLS0KKyAgICBUaGlzIFBPTSBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBUZXN0Tkc7IGl0IHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgcGFydCBvZiBhIE1hdmVuCisgICAgcmVwb3NpdG9yeSB1cGxvYWQgYnVuZGxlLgorICAgIAorICAgIFNlZSB0aGUgZ3VpZGUgdG8gY3JlYXRpbmcgYSBidW5kbGUgaGVyZToKKyAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvbWluaS9ndWlkZS1jZW50cmFsLXJlcG9zaXRvcnktdXBsb2FkLmh0bWwKKyAgICAtLT4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD50ZXN0bmc8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+VGVzdE5HPC9uYW1lPgorICAgIDx2ZXJzaW9uPjUuMTIuMTwvdmVyc2lvbj4KKyAgICA8ZGVzY3JpcHRpb24+VGVzdE5HIGlzIGEgdGVzdGluZyBmcmFtZXdvcmsgaW5zcGlyZWQgZnJvbSBKVW5pdCBhbmQgTlVuaXQgYnV0IGludHJvZHVjaW5nIHNvbWUgbmV3IGZ1bmN0aW9uYWxpdGllcyB0aGF0IG1ha2UgaXQgbW9yZSBwb3dlcmZ1bCBhbmQgZWFzaWVyIHRvIHVzZS48L2Rlc2NyaXB0aW9uPgorICAgIDx1cmw+aHR0cDovL3Rlc3RuZy5vcmc8L3VybD4KKyAgICAKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxzY20+CisgICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3Rlc3RuZy5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvPC9jb25uZWN0aW9uPgorICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly90ZXN0bmcuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vdGVzdG5nLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuazwvdXJsPgorICAgIDwvc2NtPgorICAgIAorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjEwPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmJlYW5zaGVsbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzaDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMGI0PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VpY2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+ICAgIAorICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZGVwbG95LXRvLW1hdmVuIGIvZGVwbG95LXRvLW1hdmVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmZjNhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kZXBsb3ktdG8tbWF2ZW4KQEAgLTAsMCArMSwxNCBAQAoraWYgWyAteiAiJFNPTkFUWVBFX1VTRVIiIF0KK3RoZW4KKyAgZWNobyAiUGxlYXNlIGRlZmluZSBTT05BVFlQRV9VU0VSIgorICBleGl0IDEKK2ZpCisKK2lmIFsgLXogIiRTT05BVFlQRV9QQVNTV09SRCIgXQordGhlbgorICBlY2hvICJQbGVhc2UgZGVmaW5lIFNPTkFUWVBFX1BBU1NXT1JEIgorICBleGl0IDEKK2ZpCisKKy4vZ3JhZGxldyB1cGxvYWRBcmNoaXZlcyAmJiAuL2dyYWRsZXcgY2xvc2VBbmRQcm9tb3RlUmVwb3NpdG9yeQorCmRpZmYgLS1naXQgYS9kb2MvYW50Lmh0bWwgYi9kb2MvYW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxOWVhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9hbnQuaHRtbApAQCAtMCwwICsxLDM5NyBAQAorPGh0bWw+DQorICAgIDxoZWFkPg0KKyAgICAgICAgPHRpdGxlPlRlc3RORyAtIEFudDwvdGl0bGU+DQorDQorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRlc3RuZy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPg0KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9iZXVzdC5jc3MiICAvPg0KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9wcmV0dGlmeS5qcyI+PC9zY3JpcHQ+DQorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJiYW5uZXIuanMiPjwvc2NyaXB0Pg0KKw0KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQ29yZS5qcyI+PC9zY3JpcHQ+DQorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaEphdmEuanMiPjwvc2NyaXB0Pg0KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hYbWwuanMiPjwvc2NyaXB0Pg0KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hCYXNoLmpzIj48L3NjcmlwdD4NCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoUGxhaW4uanMiPjwvc2NyaXB0Pg0KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9zdHlsZXMvc2hDb3JlLmNzcyIvPg0KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9zdHlsZXMvc2hUaGVtZUNlZHJpYy5jc3MiLz4NCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisgICAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuY29uZmlnLmNsaXBib2FyZFN3ZiA9ICdzY3JpcHRzL2NsaXBib2FyZC5zd2YnOw0KKyAgICAgICAgICBTeW50YXhIaWdobGlnaHRlci5kZWZhdWx0c1snZ3V0dGVyJ10gPSBmYWxzZTsNCisgICAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuYWxsKCk7DQorICAgICAgICA8L3NjcmlwdD4NCisNCis8L2hlYWQ+DQorDQorPGJvZHkgb25Mb2FkPSJwcmV0dHlQcmludCgpIj4NCisNCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorICAgIGRpc3BsYXlNZW51KCJhbnQuaHRtbCIpDQorPC9zY3JpcHQ+DQorDQorPGgyIGFsaWduPSJjZW50ZXIiPlRlc3RORyBBbnQgVGFzazwvaDI+DQorPHA+WW91IGRlZmluZSB0aGUgVGVzdE5HIGFudCB0YXNrIGFzIGZvbGxvd3M6PC9wPg0KKw0KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPg0KKyZsdDt0YXNrZGVmIHJlc291cmNlPSJ0ZXN0bmd0YXNrcyIgY2xhc3NwYXRoPSJ0ZXN0bmcuamFyIi8mZ3Q7DQorPC9wcmU+DQorDQorVGhpcyB0YXNrIHJ1bnMgVGVzdE5HIHRlc3RzIGFuZCBpcyBhbHdheXMgcnVuIGluIGEgZm9ya2VkIEpWTS4mbmJzcDsgSXQgDQorYWNjZXB0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6IDxicj4NCismbmJzcDs8dGFibGUgYm9yZGVyPSIyIiBpZD0idGFibGUxIj4NCisJPHRyPg0KKwkJPHRoPkF0dHJpYnV0ZSA8L3RoPg0KKwkJPHRoPkRlc2NyaXB0aW9uIDwvdGg+DQorCQk8dGg+UmVxdWlyZWQgPC90aD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD5jbGFzc2ZpbGVzZXRyZWY8L3R0PiA8L3RkPg0KKwkJPHRkPkEgcmVmZXJlbmNlIHRvIGENCisJCTxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2VDb2xsZWN0aW9uPC9hPg0KKwkJY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzIHRvIGJlIHJ1bi4gT25seSBGaWxlIGJhc2VkDQorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2VDb2xsZWN0aW9uPC9hPnMNCisgICAgICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCAoaWUuIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPikuPC90ZD4NCisJCTx0ZD4mbmJzcDsgPC90ZD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD5jbGFzc3BhdGg8L3R0PiA8L3RkPg0KKwkJPHRkPkEgUEFUSC1saWtlIHN0cnVjdHVyZSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1bi4gPC90ZD4NCisJCTx0ZD4mbmJzcDsgPC90ZD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD5jbGFzc3BhdGhyZWY8L3R0PiA8L3RkPg0KKwkJPHRkPkEgcmVmZXJlbmNlIHRvIGEgUEFUSC1saWtlIHN0cnVjdHVyZSBmb3IgdGhlIHRlc3RzIHRvIGJlIHJ1bi4gPC90ZD4NCisJCTx0ZD4mbmJzcDsgPC90ZD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD5jb25maWdGYWlsdXJlUG9saWN5PC90dD4gPC90ZD4NCisJCTx0ZD5XaGV0aGVyIFRlc3RORyBzaG91bGQgPHR0PmNvbnRpbnVlPC90dD4gdG8gZXhlY3V0ZSB0aGUgcmVtYWluaW5nIHRlc3RzIGluIHRoZSBzdWl0ZSBvciA8dHQ+c2tpcDwvdHQ+IHRoZW0gaWYgYW4gQEJlZm9yZSogbWV0aG9kIGZhaWxzLjwvdGQ+DQorCQk8dGQ+Tm8uIERlZmF1bHRzIHRvIDx0dD5za2lwPC90dD48L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PmRhdGFQcm92aWRlclRocmVhZENvdW50PC90dD4gPC90ZD4NCisJCTx0ZD5UaGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIGZvciBkYXRhIHByb3ZpZGVycw0KKwkJZm9yIHRoaXMgcnVuLiBJZ25vcmVkIHVubGVzcyB0aGUgcGFyYWxsZWwgbW9kZSBpcyBhbHNvIHNwZWNpZmllZDwvdGQ+DQorCQk8dGQ+MTwvdGQ+DQorCTwvdHI+DQorCTx0cj4NCisJCTx0ZD48dHQ+ZGVsZWdhdGVDb21tYW5kU3lzdGVtUHJvcGVydGllczwvdHQ+IDwvdGQ+DQorCQk8dGQ+UGFzcyB0aGUgY29tbWFuZCBsaW5lIHByb3BlcnRpZXMgYXMgc3lzdGVtIHByb3BlcnRpZXMuPC90ZD4NCisJCTx0ZD5Oby4gRGVmYXVsdHMgdG8gZmFsc2UgPC90ZD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD5kdW1wQ29tbWFuZDwvdHQ+IDwvdGQ+DQorCQk8dGQ+UHJpbnQgdGhlIFRlc3RORyBsYXVuY2hlciBjb21tYW5kLiA8L3RkPg0KKwkJPHRkPk5vLiBEZWZhdWx0cyB0byBmYWxzZSA8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PmZhaWx1cmVQcm9wZXJ0eTwvdHQ+IDwvdGQ+DQorCQk8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZS4gSXQgaXMgdXNlZCANCisJCW9ubHkgaWYgdGhlIDx0dD5oYWx0b25mYWlsdXJlPC90dD4gaXMgbm90IHNldC4gPC90ZD4NCisJCTx0ZD5Oby48L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PmhhbHRvbmZhaWx1cmU8L3R0PiA8L3RkPg0KKwkJPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSBmYWlsdXJlIGhhcyBvY2N1cnJlZCBkdXJpbmcgdGhlIHRlc3QgDQorCQlydW4uIDwvdGQ+DQorCQk8dGQ+Tm8uIERlZmF1bHRzIHRvIGZhbHNlIA0KKwkJPC90ZD4NCisJCTx0ZD4mbmJzcDs8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PmhhbHRvbnNraXBwZWQ8L3R0PiA8L3RkPg0KKwkJPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb24gc2tpcHBlZCB0ZXN0LiA8L3RkPg0KKwkJPHRkPk5vLiBEZWZhdWx0IHRvIGZhbHNlIDwvdGQ+DQorCTwvdHI+DQorCTx0cj4NCisJICA8dGQ+PHR0Pmdyb3VwczwvdHQ+PC90ZD4NCisJICA8dGQ+DQorICAgCVRoZSBsaXN0IG9mIGdyb3VwcyB0byBydW4sIHNlcGFyYXRlZCBieSBzcGFjZXMgb3IgY29tbWFzLjwvdGQ+DQorCSAgPHRkPg0KKyAgIAk8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCSAgPHRkPjx0dD5leGNsdWRlZGdyb3VwczwvdHQ+PC90ZD4NCisJICA8dGQ+DQorICAgCVRoZSBsaXN0IG9mIGdyb3VwcyB0byBleGNsdWRlLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIG9yIGNvbW1hczwvdGQ+DQorCSAgPHRkPg0KKyAgIAk8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0Pmp2bTwvdHQ+PC90ZD4NCisJCTx0ZD5UaGUgSlZNIHRvIHVzZSwgd2hpY2ggd2lsbCBiZSBydW4gYnkgPHR0PlJ1bnRpbWUuZXhlYygpPC90dD48L3RkPg0KKwkJPHRkPjx0dD5qYXZhPC90dD48L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0Pmxpc3RlbmVyczwvdHQ+PC90ZD4NCisJCTx0ZD5BIGNvbW1hIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzc2VzIHRoYXQgYXJlIFRlc3RORyBsaXN0ZW5lcnMgKGZvciBleGFtcGxlPHR0Pg0KKwkJPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvamF2YWRvY3Mvb3JnL3Rlc3RuZy9JVGVzdExpc3RlbmVyLmh0bWwiPg0KKwkJb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyPC9hPjwvdHQ+IG9yIDx0dD4NCisJCTxhIGhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnL2phdmFkb2NzL29yZy90ZXN0bmcvSVJlcG9ydGVyLmh0bWwiPg0KKwkJb3JnLnRlc3RuZy5JUmVwb3J0ZXI8L2E+KTwvdHQ+PC90ZD4NCisJCTx0ZD5Oby48L3RkPg0KKwk8L3RyPg0KKw0KKyAgICAgICAgPHRyPg0KKwkJPHRkPjx0dD5tZXRob2RzPC90dD48L3RkPg0KKwkJPHRkPkEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgYW5kIG1ldGhvZC4gRm9yIGV4YW1wbGUgPHR0PmNvbS5leGFtcGxlLkZvby5mMSxjb20uZXhhbXBsZS5CYXIuZjI8L3R0Pi48L3RkPg0KKwkJPHRkPk5vLjwvdGQ+DQorICAgICAgICA8L3RyPg0KKw0KKyAgICAgICAgPHRyPg0KKwkJPHRkPjx0dD5tb2RlPC90dD48L3RkPg0KKyAgICAgICAgICAgICAgICA8dGQ+RWl0aGVyIDx0dD4idGVzdG5nIjwvdHQ+LCA8dHQ+Imp1bml0IjwvdHQ+IG9yIDx0dD4ibWl4ZWQiPC90dD4uIFdoZXRoZXIgVGVzdE5HIHNob3VsZCBydW4gb25seSBUZXN0TkcgdGVzdHMsIEpVbml0IHRlc3RzIG9yIGJvdGguPC90ZD4NCisJCTx0ZD5Oby4gRGVmYXVsdHMgdG8gInRlc3RuZyIuPC90ZD4NCisgICAgICAgIDwvdHI+DQorDQorCTx0cj4NCisJCTx0ZD48dHQ+b3V0cHV0ZGlyPC90dD4gPC90ZD4NCisJCTx0ZD5EaXJlY3RvcnkgZm9yIHJlcG9ydHMgb3V0cHV0LiANCisJCTwvdGQ+DQorCQk8dGQ+Tm8uIERlZmF1bHRzIHRvIDx0dD50ZXN0LW91dHB1dDwvdHQ+LiA8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PnNraXBwZWRQcm9wZXJ0eTwvdHQ+IDwvdGQ+DQorCQk8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGEgc2tpcHBlZCB0ZXN0LiBJdCBpcyANCisJCXVzZWQgb25seSBpZiB0aGUgPHR0PmhhbHRvbnNraXBwZWQ8L3R0PiBpcyBub3Qgc2V0LiA8L3RkPg0KKwkJPHRkPk5vLiA8L3RkPg0KKwk8L3RyPg0KKwk8dHI+DQorCQk8dGQ+PHR0PnN1aXRlUnVubmVyQ2xhc3M8L3R0PiA8L3RkPg0KKwkJPHRkPkEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBUZXN0Tkcgc3RhcnRlci4gPC90ZD4NCisJCTx0ZD4NCisJCTxwIGFsaWduPSJsZWZ0Ij5Oby4mbmJzcDsgRGVmYXVsdHMgdG8gPHR0Pg0KKwkJPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvamF2YWRvY3Mvb3JnL3Rlc3RuZy9UZXN0TkcuaHRtbCI+b3JnLnRlc3RuZy5UZXN0Tkc8L2E+IDwvdHQ+PC90ZD4NCisJPC90cj4NCisJDQorCTx0cj4NCisJCTx0ZD48dHQ+c3VpdGVUaHJlYWRQb29sU2l6ZTwvdHQ+IDwvdGQ+DQorCQk8dGQ+VGhlIHNpemUgb2YgYSB0aHJlYWQgcG9vbCB0byBydW4gc3VpdGVzLjwvdGQ+DQorCQk8dGQ+DQorCQk8cCBhbGlnbj0ibGVmdCI+Tm8uJm5ic3A7IERlZmF1bHRzIHRvIDEuPC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD5wYXJhbGxlbDwvdHQ+IDwvdGQ+DQorCQk8dGQ+VGhlIHBhcmFsbGVsIG1vZGUgdG8gdXNlIGZvciBydW5uaW5nIHRoZSB0ZXN0cyAtIGVpdGhlciBtZXRob2RzIG9yIHRlc3RzPC90ZD4NCisJCTx0ZD5ObyAtIGlmIG5vdCBwcmVzZW50LCBwYXJhbGxlbCBtb2RlIHdpbGwgbm90IGJlIHNlbGVjdGVkPC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD5zdWl0ZW5hbWU8L3R0PiA8L3RkPg0KKwkJPHRkPlNldHMgdGhlIGRlZmF1bHQgbmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSwgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQgaW4gYSBzdWl0ZSB4bWwgZmlsZSBvciBpbiB0aGUgc291cmNlIGNvZGU8L3RkPg0KKwkJPHRkPk5vLiBEZWZhdWx0cyB0byAiQW50IHN1aXRlIjwvdGQ+DQorCTwvdHI+DQorDQorCTx0cj4NCisJCTx0ZD48dHQ+dGVzdEphcjwvdHQ+IDwvdGQ+DQorCQk8dGQ+UGF0aCB0byBhIGphciBjb250YWluaW5nIHRlc3RzIGFuZCBhIHN1aXRlIGRlZmluaXRpb24uIDwvdGQ+DQorCQk8dGQ+Jm5ic3A7PC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD50ZXN0bmFtZTwvdHQ+IDwvdGQ+DQorCQk8dGQ+U2V0cyB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSB0ZXN0LCBpZiBvbmUgaXMgbm90IHNwZWNpZmllZCBpbiBhIHN1aXRlIHhtbCBmaWxlIG9yIGluIHRoZSBzb3VyY2UgY29kZTwvdGQ+DQorCQk8dGQ+Tm8uIGRlZmF1bHRzIHRvICJBbnQgdGVzdCI8L3RkPg0KKwk8L3RyPg0KKw0KKwk8dHI+DQorCQk8dGQ+PHR0PnRlc3RuYW1lczwvdHQ+IDwvdGQ+DQorCQk8dGQ+QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0IG5hbWVzLCBhcyBkZWZpbmVkDQorCQlpbiB0aGUgJmx0O3Rlc3QmZ3Q7IHRhZy4gT25seSB0aGVzZSB0ZXN0cyB3aWxsIGJlIHJ1bi48L3RkPg0KKwkJPHRkPk5vLiBkZWZhdWx0cyB0byAiQW50IHRlc3QiPC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD50aHJlYWRDb3VudDwvdHQ+IDwvdGQ+DQorCQk8dGQ+VGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSBmb3IgdGhpcyBydW4uIElnbm9yZWQgdW5sZXNzIHRoZSBwYXJhbGxlbCBtb2RlIGlzIGFsc28gc3BlY2lmaWVkPC90ZD4NCisJCTx0ZD4xPC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD50aW1lT3V0PC90dD48L3RkPg0KKwkJPHRkPlRoZSBtYXhpbXVtIHRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcyB0aGF0IGFsbCB0aGUgdGVzdHMgc2hvdWxkIHJ1biANCisJCXVuZGVyLjwvdGQ+DQorCQk8dGQ+Jm5ic3A7PC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD51c2VEZWZhdWx0TGlzdGVuZXJzPC90dD48L3RkPg0KKwkJPHRkPldoZXRoZXIgdGhlIGRlZmF1bHQgbGlzdGVuZXJzIGFuZCByZXBvcnRlcnMgc2hvdWxkIGJlIHVzZWQuPC90ZD4NCisJCTx0ZD5EZWZhdWx0cyB0byB0cnVlLjwvdGQ+DQorCTwvdHI+DQorCTx0cj4NCisJCTx0ZD48dHQ+d29ya2luZ0RpcjwvdHQ+PC90ZD4NCisJCTx0ZD5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBhbnQgdGFzayBzaG91bGQgY2hhbmdlIHRvIGJlZm9yZSBydW5uaW5nIA0KKwkJVGVzdE5HLjwvdGQ+DQorCQk8dGQ+Jm5ic3A7PC90ZD4NCisJPC90cj4NCisJPHRyPg0KKwkJPHRkPjx0dD54bWxmaWxlc2V0cmVmPC90dD4gPC90ZD4NCisJCTx0ZD5BIHJlZmVyZW5jZSB0byBhDQorCQk8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlQ29sbGVjdGlvbjwvYT4NCisJCWNvbnRhaW5pbmcgdGhlIHN1aXRlIGRlZmluaXRpb25zIHRvIGJlIHJ1bi4gT25seSBGaWxlIGJhc2VkDQorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2VDb2xsZWN0aW9uPC9hPnMNCisgICAgICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCAoaWUuIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPikuPC90ZD4NCisJCTx0ZD4mbmJzcDsgPC90ZD4NCisJPC90cj4NCisNCisJPHRyPg0KKwkJPHRkPjx0dD54bWxQYXRoSW5KYXI8L3R0PjwvdGQ+DQorCQk8dGQ+VGhlIHBhdGggb2YgdGhlIFhNTCBmaWxlIGluc2lkZSB0aGUgamFyIGZpbGUsIG9ubHkgYXBwbGljYWJsZSBpZiA8dHQ+dGVzdEphcjwvdHQ+IHdhcyBzcGVjaWZpZWQ8L3RkPg0KKwkJPHRkPnRlc3RuZy54bWw8L3RkPg0KKwk8L3RyPg0KKzwvdGFibGU+DQorPGJyPg0KK09uZSBvZiBhdHRyaWJ1dGVzIDx0dD5jbGFzc3BhdGg8L3R0PiwgPHR0PmNsYXNzcGF0aHJlZjwvdHQ+IG9yIG5lc3RlZCA8dHQ+DQorJmx0O2NsYXNzcGF0aCZndDs8L3R0PiBtdXN0IGJlIHVzZWQgZm9yIHByb3ZpZGluZyB0aGUgdGVzdHMgY2xhc3NwYXRoLiANCis8cD5PbmUgb2YgdGhlIGF0dHJpYnV0ZXMgPHR0PnhtbGZpbGVzZXRyZWY8L3R0PiwgPHR0PmNsYXNzZmlsZXNldHJlZjwvdHQ+IG9yIA0KK25lc3RlZCA8dHQ+Jmx0O3htbGZpbGVzZXQmZ3Q7PC90dD4sIHJlc3BlY3RpdmVseSA8dHQ+Jmx0O2NsYXNzZmlsZXNldCZndDs8L3R0PiBtdXN0IGJlIHVzZWQgDQorZm9yIHByb3ZpZGluZyB0aGUgdGVzdHMuIDwvcD4NCisNCis8aDM+VGVzdE5HIG1vZGVzPC9oMz4NCis8cD5UaGUgVGVzdE5HIG1vZGUgZ2V0cyBhcHBsaWVkIHdoZW4gdGVzdHMgYXJlIHBhc3NlZCB0byBUZXN0TkcgdXNpbmcgPHR0PmNsYXNzZmlsZXNldHJlZjwvdHQ+LCA8dHQ+bWV0aG9kczwvdHQ+DQorb3IgbmVzdGVkIDx0dD4mbHQ7Y2xhc3NmaWxlc2V0Jmd0OzwvdHQ+IGFuZCB0ZWxscyBUZXN0Tkcgd2hhdCBraW5kIG9mDQordGVzdHMgaXQgc2hvdWxkIGxvb2sgZm9yIGFuZCBydW46DQorDQorPHVsPg0KKyAgPGxpPjx0dD4idGVzdG5nIjwvdHQ+OiBmaW5kIGFuZCBydW4gVGVzdE5HIHRlc3RzLg0KKyAgPGxpPjx0dD4ianVuaXQiPC90dD46IGZpbmQgYW5kIHJ1biBKVW5pdCB0ZXN0cy4NCisgIDxsaT48dHQ+Im1peGVkIjwvdHQ+OiBydW4gYm90aCBUZXN0TkcgYW5kIEpVbml0IHRlc3RzLg0KKzwvdWw+DQorDQorPHA+PGVtPk5vdGU8L2VtPjogPHR0PiJqdW5pdCI8L3R0PiBhbmQgPHR0PiJtaXhlZCI8L3R0PiBtb2RlcyByZXF1aXJlIHRoZSBKVW5pdCBqYXIgZmlsZSBvbiB0aGUgY2xhc3NwYXRoLjwvcD4NCisNCis8aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4NCis8aDQ+Y2xhc3NwYXRoPC9oND4NCis8cD5UaGUgPHR0PiZsdDt0ZXN0bmcmZ3Q7PC90dD4gdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8dHQ+Jmx0O2NsYXNzcGF0aCZndDs8L3R0PiBlbGVtZW50IA0KK3RoYXQgcmVwcmVzZW50cyBhIDxlbT5QQVRIPC9lbT4tbGlrZSBzdHJ1Y3R1cmUuIDwvcD4NCis8aDQ+Ym9vdGNsYXNzcGF0aDwvaDQ+DQorPHA+VGhlIGxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoaXMgPGVtPg0KK1BBVEgtbGlrZTwvZW0+IHN0cnVjdHVyZSAtIHdpbGwgYmUgaWdub3JlZCBpZiA8dHQ+Zm9yayA8L3R0PmlzIG5vdCBzZXQuIDwvcD4NCis8aDQ+eG1sZmlsZXNldDwvaDQ+DQorPHA+VGhlIHN1aXRlIGRlZmluaXRpb25zICg8dHQ+dGVzdG5nLnhtbDwvdHQ+KSBjYW4gYmUgcGFzc2VkIHRvIHRoZSB0YXNrIHdpdGggYQ0KKzx0dD48YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT48L3R0Pg0KK3N0cnVjdHVyZS4gPC9wPg0KKzxoND5jbGFzc2ZpbGVzZXQ8L2g0Pg0KKzxwPlRlc3RORyBjYW4gYWxzbyBydW4gZGlyZWN0bHkgb24gY2xhc3NlcywgYWxzbyBzdXBwbGllZCB3aXRoIGEgPHR0Pg0KKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPjwvdHQ+DQorc3RydWN0dXJlLjwvcD4NCis8aDQ+anZtYXJnPC9oND4NCis8cD5BZGRpdGlvbmFsIHBhcmFtZXRlcnMgbWF5IGJlIHBhc3NlZCB0byB0aGUgbmV3IFZNIHZpYSBuZXN0ZWQgPHR0PiZsdDtqdm1hcmcmZ3Q7PC90dD4gDQorZWxlbWVudHMuIEZvciBleGFtcGxlOiA8L3A+DQorDQorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+DQorJmx0O3Rlc3RuZyZndDsNCisgICAmbHQ7anZtYXJnIHZhbHVlPSItRGphdmEuY29tcGlsZXI9Tk9ORSIgLyZndDsNCisgICAmbHQ7IS0tIC4uLiAtLSZndDsNCismbHQ7L3Rlc3RuZyZndDsNCis8L3ByZT4NCisNCis8aDQ+c3lzcHJvcGVydHk8L2g0Pg0KKzxwPlVzZSBuZXN0ZWQgPHR0PiZsdDtzeXNwcm9wZXJ0eSZndDs8L3R0PiBlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIA0KK3JlcXVpcmVkIGJ5IHRoZSBjbGFzcy4gVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB2aXJ0dWFsIA0KK21hY2hpbmUgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHRlc3QuIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIA0KK3RoZSBzYW1lIGFzIGZvciA8ZW0+ZW52aXJvbm1lbnQgdmFyaWFibGVzPC9lbT46PC9wPg0KKw0KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPg0KKyZsdDt0ZXN0bmcmZ3Q7DQorICAgJmx0O3N5c3Byb3BlcnR5IGtleT0iYmFzZWRpciIgdmFsdWU9IiR7YmFzZWRpcn0iLyZndDsNCisgICAmbHQ7IS0tIC4uLiAtLSZndDsNCismbHQ7L3Rlc3RuZyZndDsNCis8L3ByZT4NCisNCis8cD53aWxsIHJ1biB0aGUgdGVzdCBhbmQgbWFrZSB0aGUgPGNvZGU+YmFzZWRpcjwvY29kZT4gcHJvcGVydHkgDQorYXZhaWxhYmxlIHRvIHRoZSB0ZXN0LjwvcD4NCisNCis8aDQ+cHJvcGVydHlzZXQ8L2g0Pg0KKzxwPllvdSBtYXkgYWxzbyB1c2UgYSBuZXN0ZWQgPHR0PiZsdDtwcm9wZXJ0eXNldCZndDs8L3R0PiBlbGVtZW50IHRvIHNwZWNpZnkgYSBzZXQgb2Ygc3lzdGVtIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCANCitvdXRzaWRlIG9mIHRoZSBUZXN0TkcgYW50IHRhc2suIFRoaXMgYWxsb3dzIGZvciBtb3JlIGZsZXhpYmxlIGRlZmluaXRpb25zIG9mIHN5c3RlbSBwcm9wZXJ0aWVzLCBmb3IgaW5zdGFuY2Ugc2VsZWN0aW5nDQorYWxsIHByb3BlcnRpZXMgd2l0aCBhIHNwZWNpZmljIHByZWZpeCBvciBtYXRjaGluZyBhIHJlZ2V4LiBTZWUgdGhlIA0KKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+UHJvcGVydHlTZXQgcGFnZTwvYT4gaW4gdGhlIA0KKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvIj5BbnQgbWFudWFsPC9hPiBmb3IgZnVsbCBkZXRhaWxzLiBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZTo8L3A+DQorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+DQorICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im15cHJvcDEiIHZhbHVlPSJ2YWx1ZSAxIi8mZ3Q7DQorICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im15cHJvcDIiIHZhbHVlPSJ2YWx1ZSAyIi8+DQorCQ0KKyAgICAgICZsdDtwcm9wZXJ0eXNldCBpZD0icHJvcHNldDEiJmd0Ow0KKyAgICAgICAgICAmbHQ7cHJvcGVydHlyZWYgbmFtZT0ibXlwcm9wMSIvJmd0Ow0KKyAgICAgICAgICAmbHQ7cHJvcGVydHlyZWYgbmFtZT0ibXlwcm9wMiIvJmd0Ow0KKyAgICAgICZsdDsvcHJvcGVydHlzZXQmZ3Q7DQorDQorICAgICAgJmx0O3Rlc3RuZyBvdXRwdXRkaXI9IiR7dGVzdG5nLnJlcG9ydC5kaXJ9IiBjbGFzc3BhdGhyZWY9InJ1bi5jcCImZ3Q7DQorICAgICAgICAgICZsdDt4bWxmaWxlc2V0IGRpcj0iJHt0ZXN0MTUuZGlyfSIgaW5jbHVkZXM9InRlc3RuZy1zaW5nbGUzLnhtbCIvJmd0Ow0KKyAgICAgICAgICAmbHQ7cHJvcGVydHlzZXQgcmVmaWQ9InByb3BzZXQxIi8mZ3Q7DQorICAgICAgJmx0Oy90ZXN0bmcmZ3Q7DQorPC9wcmU+DQorPHA+SW4gdGhpcyBjYXNlLCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZWQgIm15cHJvcDEiIGFuZCAibXlwcm9wMiIgYXJlIHBhc3NlZCBhbG9uZyB0byB0aGUgVGVzdE5HIHByb2Nlc3MuPC9wPg0KKw0KKzxoND5yZXBvcnRlcjwvaDQ+DQorPHA+QW4gaW5uZXIgPHR0PiZsdDtyZXBvcnRlciZndDs8L3R0PiBlbGVtZW50IGlzIGFuIGFsdGVybmF0aXZlIHdheSB0byBpbmplY3QgYQ0KK2N1c3RvbSByZXBvcnQgbGlzdGVuZXIgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2V0IGN1c3RvbSBwcm9wZXJ0aWVzIGluIG9yZGVyIHRvIGZpbmUtdHVuZQ0KK3RoZSBiZWhhdmlvciBvZiB0aGUgcmVwb3J0ZXIgYXQgcnVuLXRpbWUuDQorPGJyPg0KK1RoZSBlbGVtZW50IGhhcyBvbmUgPHR0PmNsYXNzbmFtZTwvdHQ+IGF0dHJpYnV0ZSB3aGljaCBpcyBtYW5kYXRvcnksIGluZGljYXRpbmcNCit0aGUgY2xhc3Mgb2YgdGhlIGN1c3RvbSBsaXN0ZW5lci4gSW4gb3JkZXIgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXBvcnRlciwgdGhlDQorPHR0PiZsdDtyZXBvcnRlciZndDs8L3R0PiBlbGVtZW50IGNhbiBjb250YWluIHNldmVyYWwgbmVzdGVkIDx0dD4mbHQ7cHJvcGVydHkmZ3Q7PC90dD4NCitlbGVtZW50cyB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIDx0dD5uYW1lPC90dD4gYW5kIDx0dD52YWx1ZTwvdHQ+IGF0dHJpYnV0ZXMgYXMgc2VlbiBiZWxvdzoNCis8L3A+DQorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+DQorJmx0O3Rlc3RuZyAuLi4mZ3Q7DQorICAgLi4uDQorICAgJmx0O3JlcG9ydGVyIGNsYXNzbmFtZT0iY29tLnRlc3QuTXlSZXBvcnRlciImZ3Q7DQorICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im1ldGhvZEZpbHRlciIgdmFsdWU9IippbnNlcnQqIi8mZ3Q7DQorICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImVuYWJsZUZpbHRlcmluZyIgdmFsdWU9InRydWUiLyZndDsNCisgICAmbHQ7L3JlcG9ydGVyJmd0Ow0KKyAgIC4uLg0KKyZsdDsvdGVzdG5nJmd0Ow0KKzwvcHJlPg0KKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4NCitwdWJsaWMgY2xhc3MgTXlSZXBvcnRlciB7DQorDQorICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEZpbHRlcigpIHsuLi59DQorICBwdWJsaWMgdm9pZCBzZXRNZXRob2RGaWx0ZXIoU3RyaW5nIG1ldGhvZEZpbHRlcikgey4uLn0NCisgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlRmlsdGVyaW5nKCkgey4uLn0NCisgIHB1YmxpYyB2b2lkIHNldEVuYWJsZUZpbHRlcmluZyhib29sZWFuIGVuYWJsZUZpbHRlcmluZykgey4uLn0NCisgIC4uLg0KK30NCis8L3ByZT4NCitZb3UgaGF2ZSB0byBjb25zaWRlciB0aG91Z2ggdGhhdCBmb3IgdGhlIG1vbWVudCBvbmx5IGEgbGltaXRlZCBzZXQgb2YgcHJvcGVydHkgdHlwZXMgYXJlIHN1cHBvcnRlZDoNCis8dHQ+U3RyaW5nLCBpbnQsIGJvb2xlYW4sIGJ5dGUsIGNoYXIsIGRvdWJsZSwgZmxvYXQsIGxvbmcsIHNob3J0PC90dD4uDQorDQorPGg0PmVudjwvaDQ+DQorPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgVGVzdE5HIGZvcmtlZCANCit2aXJ0dWFsIG1hY2hpbmUgdmlhIG5lc3RlZCA8dHQ+Jmx0O2VudiZndDs8L3R0PiBlbGVtZW50cy4gRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIDx0dD4NCismbHQ7ZW52Jmd0OzwvdHQ+IGVsZW1lbnQncyBhdHRyaWJ1dGVzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSA8ZW0+DQorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvZXhlYy5odG1sIj5leGVjPC9hPjwvZW0+IHRhc2suPC9wPg0KKzxoMz5FeGFtcGxlczwvaDM+DQorPGg0PlN1aXRlIHhtbDwvaDQ+DQorDQorPHByZSBjbGFzcz0iYnJ1c2g6IHRleHQiPg0KKyZsdDt0ZXN0bmcgY2xhc3NwYXRocmVmPSJydW4uY3AiDQorICAgICAgICBvdXRwdXREaXI9IiR7dGVzdG5nLnJlcG9ydC5kaXJ9Ig0KKyAgICAgICAgc291cmNlZGlyPSIke3Rlc3Quc3JjLmRpcn0iDQorICAgICAgICBoYWx0T25mYWlsdXJlPSJ0cnVlIiZndDsNCisgDQorICAgJmx0O3htbGZpbGVzZXQgZGlyPSIke3Rlc3QxNC5kaXJ9IiBpbmNsdWRlcz0idGVzdG5nLnhtbCIvJmd0Ow0KKyZsdDsvdGVzdG5nJmd0Ow0KKzwvcHJlPg0KKw0KKzxoND5DbGFzcyBGaWxlU2V0PC9oND4NCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4NCismbHQ7dGVzdG5nIGNsYXNzcGF0aHJlZj0icnVuLmNwIg0KKwkJb3V0cHV0RGlyPSIke3Rlc3RuZy5yZXBvcnQuZGlyfSINCisJCWhhbHRPbkZhaWx1cmU9InRydWUiIHZlcmJvc2U9IjIiJmd0Ow0KKwkmbHQ7Y2xhc3NmaWxlc2V0IGRpcj0iJHt0ZXN0LmJ1aWxkLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmNsYXNzIiAvJmd0Ow0KKyZsdDsvdGVzdG5nJmd0Ow0KKzwvcHJlPg0KKw0KKzxzY3JpcHQgc3JjPSJodHRwOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL3VyY2hpbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCis8L3NjcmlwdD4NCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQorX3VhY2N0ID0gIlVBLTIzODIxNS0yIjsNCit1cmNoaW5UcmFja2VyKCk7DQorPC9zY3JpcHQ+DQorDQorPC9ib2R5Pg0KKw0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvYmFubmVyLmpzIGIvZG9jL2Jhbm5lci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVmNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2Jhbm5lci5qcwpAQCAtMCwwICsxLDUyIEBACisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisvLyBXcml0ZXMgYSB0YWJsZSBkYXRhIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LiBJZiBwSFJlZiBlcXVhbHMNCisvLyBwQ3VycmVudFBhZ2UgdGhlbiAnY2xhc3M9ImN1cnJlbnQiJyBpcyBhZGRlZCB0byB0aGUgdGQgZWxlbWVudC4NCisvLyBGb3IgZXhhbXBsZToNCisvLyAgICB3cml0ZVREKCJhLmh0bWwiLCAiYS5odG1sIiwgImIiKQ0KKy8vIFdvdWxkIHdyaXRlDQorLy8gICAgPHRkIGNsYXNzPSJjdXJyZW50Ij48YSBocmVmPSJhLmh0bWwiPmI8L2E+PHRkPg0KKy8vDQorLy8gQHBhcmFtIHBDdXJyZW50UGFnZSB0aGUgY3VycmVudCBwYWdlLiBGb3IgZXhhbXBsZSAiaW5kZXguaHRtbCINCisvLyBAcGFyYW0gcEhSZWYgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBhcGVhciBpbiB0aGUgaHJlZg0KKy8vIEBwYXJhbSBwVmFsdWUgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBhcGVhciBhcyB0aGUgdmFsdWUNCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitmdW5jdGlvbiB3cml0ZVREKHBDdXJyZW50UGFnZSwgcEhSZWYsIHBWYWx1ZSkNCit7DQorICAgZG9jdW1lbnQud3JpdGUoJyAgICAgICAgICAgICAgICA8dGQnKQ0KKyAgIGRvY3VtZW50LndyaXRlKHBDdXJyZW50UGFnZSA9PSBwSFJlZiA/ICcgY2xhc3M9ImN1cnJlbnQiJyA6ICcnKQ0KKyAgIGRvY3VtZW50LndyaXRlKCc+PGEgaHJlZj0iJykNCisgICBkb2N1bWVudC53cml0ZShwSFJlZikNCisgICBkb2N1bWVudC53cml0ZSgnIj4nKQ0KKyAgIGRvY3VtZW50LndyaXRlKHBWYWx1ZSkNCisgICBkb2N1bWVudC53cml0ZWxuKCc8L2E+PC90ZD4nKQ0KK30NCisNCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKy8vIFdyaXRlcyB0aGUgbWFpbiBtZW51IHRvIHRoZSBkb2N1bWVudC4NCisvLyBAcGFyYW0gcEN1cnJlbnRQYWdlIHRoZSBjdXJyZW50IHBhZ2UuIEZvciBleGFtcGxlICJpbmRleC5odG1sIg0KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorZnVuY3Rpb24gZGlzcGxheU1lbnUocEN1cnJlbnRQYWdlKSB7DQorICAgZG9jdW1lbnQud3JpdGVsbignPGRpdiBpZD0idG9wbWVudSI+JykNCisgICBkb2N1bWVudC53cml0ZWxuKCcgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4nKQ0KKyAgIGRvY3VtZW50LndyaXRlbG4oJyAgICAgICAgICAgIDx0cj4nKQ0KKyAgICAgICB3cml0ZVREKHBDdXJyZW50UGFnZSwgICAgICAgICAgICAgImluZGV4Lmh0bWwiLCAiV2VsY29tZSIpDQorICAgICAgIHdyaXRlVEQocEN1cnJlbnRQYWdlLCAgICAgICAgICAiZG93bmxvYWQuaHRtbCIsICJEb3dubG9hZCIpDQorICAgICAgIHdyaXRlVEQocEN1cnJlbnRQYWdlLCJkb2N1bWVudGF0aW9uLW1haW4uaHRtbCIsICJEb2N1bWVudGF0aW9uIikNCisgICAgICAgd3JpdGVURChwQ3VycmVudFBhZ2UsICAgICAgICAgIm1pZ3JhdGluZy5odG1sIiwgIk1pZ3JhdGluZyBmcm9tIEpVbml0IikNCisgICAgICAgd3JpdGVURChwQ3VycmVudFBhZ2UsICIuLi9qYXZhZG9jcy9pbmRleC5odG1sIiwgIkphdmFEb2MiKQ0KKyAgICAgICB3cml0ZVREKHBDdXJyZW50UGFnZSwgInNlbGVuaXVtLmh0bWwiLCAiU2VsZW5pdW0iKQ0KKyAgIGRvY3VtZW50LndyaXRlbG4oJyAgICAgICAgICAgIDwvdHI+JykNCisgICBkb2N1bWVudC53cml0ZWxuKCcgICAgICAgICAgICA8dHI+JykNCisgICAgICAgd3JpdGVURChwQ3VycmVudFBhZ2UsICAgICAgICAgICAiZWNsaXBzZS5odG1sIiwgIkVjbGlwc2UiKQ0KKyAgICAgICB3cml0ZVREKHBDdXJyZW50UGFnZSwgICAgICAgICAgICAgICJpZGVhLmh0bWwiLCAiSURFQSIpDQorICAgICAgIHdyaXRlVEQocEN1cnJlbnRQYWdlLCAgICAgICAgICAgICAibWF2ZW4uaHRtbCIsICJNYXZlbiIpDQorICAgICAgIHdyaXRlVEQocEN1cnJlbnRQYWdlLCAgICAgICAgICAgICAgICJhbnQuaHRtbCIsICJBbnQiKQ0KKyAgICAgICB3cml0ZVREKHBDdXJyZW50UGFnZSwgICAgICAgICAgICAgICJtaXNjLmh0bWwiLCAiTWlzY2VsbGFuZW91cyIpDQorICAgICAgIHdyaXRlVEQocEN1cnJlbnRQYWdlLCAgICAgICAgICAgICAgImJvb2suaHRtbCIsICJCb29rIikNCisgICAgICAgd3JpdGVURChwQ3VycmVudFBhZ2UsICAgICAgICAgICAgICAiaHR0cDovL2JldXN0LmNvbS9rb2JhbHQiLCAiS29iYWx0IikNCisgICBkb2N1bWVudC53cml0ZWxuKCcgICAgICAgICAgICA8L3RyPicpDQorICAgZG9jdW1lbnQud3JpdGVsbignICAgICAgICA8L3RhYmxlPicpDQorICAgZG9jdW1lbnQud3JpdGVsbignICAgIDwvZGl2PicpDQorDQorfQ0KKw0KZGlmZiAtLWdpdCBhL2RvYy9ib29rLXRvYy5odG1sIGIvZG9jL2Jvb2stdG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5NGNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ib29rLXRvYy5odG1sCkBAIC0wLDAgKzEsMTYwOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+PGh0bWw+PGhlYWQ+PE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InByaW50Ij4uaGlkZXtkaXNwbGF5Om5vbmV9PC9zdHlsZT48L2hlYWQ+CisKKworPGJvZHkgc3R5bGU9Im1hcmdpbjowO3BhZGRpbmc6MCI+PGRpdiBjbGFzcz0iaGlkZSI+CisKKworCisKKworPGRpdiBiZ2NvbG9yPSIjZmZmZmZmIiB2bGluaz0iYmx1ZSIgbGluaz0iYmx1ZSI+Cis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCBiZ2NvbG9yPSJlZWVlZWUiIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iYXJpYWwsc2Fucy1zZXJpZiI+PGEgbmFtZT0iMC4xXzEiPjxiPlBhZ2UgMTwvYj48L2E+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPjxmb250IHNpemU9IjMiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjExNDg7bGVmdDo3MzgiPnY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI2IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTo0OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM1NTtsZWZ0OjE2MiI+PGI+Q29udGVudHM8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTEyO2xlZnQ6MjcwIj5Gb3Jld29yZDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUxMjtsZWZ0OjczMCI+eGlpaTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMDtsZWZ0OjI3MCI+UHJlZmFjZTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMDtsZWZ0OjczNCI+eHY8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NDg7bGVmdDoyNzAiPkFja25vd2xlZGdtZW50czwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0ODtsZWZ0OjczMCI+eHhpPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTY2O2xlZnQ6MjcwIj5BYm91dCB0aGUgQXV0aG9yczwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTY2O2xlZnQ6NzIzIj54eGlpaTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYxMTtsZWZ0OjE2MiI+Q2hhcHRlciAxPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjExO2xlZnQ6MjcwIj5HZXR0aW5nIFN0YXJ0ZWQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MTE7bGVmdDo3MzYiPjE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDA7bGVmdDoyNzAiPkJleW9uZCBKVW5pdCAzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjQwO2xlZnQ6NzM4Ij4zPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NjA7bGVmdDoyODgiPlN0YXRlZnVsIENsYXNzZXM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NTk7bGVmdDo3MzgiPjM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NzY7bGVmdDoyODgiPlBhcmFtZXRlcnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NzU7bGVmdDo3MzgiPjQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY5MztsZWZ0OjI4OCI+QmFzZSBDbGFzc2VzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjkyO2xlZnQ6NzM4Ij40PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzA5O2xlZnQ6Mjg4Ij5FeGNlcHRpb25zIEFyZSBOb3QgVGhhdCBFeGNlcHRpb25hbDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcwODtsZWZ0OjczOCI+NDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcyNjtsZWZ0OjI4OCI+UnVubmluZyBUZXN0czwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzI1O2xlZnQ6NzM4Ij41PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzQzO2xlZnQ6Mjg4Ij5SZWFsLVdvcmxkIFRlc3Rpbmc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NDE7bGVmdDo3MzgiPjY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NTk7bGVmdDoyODgiPkNvbmZpZ3VyYXRpb24gTWV0aG9kczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU4O2xlZnQ6NzM4Ij42PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Nzc1O2xlZnQ6Mjg4Ij5EZXBlbmRlbmNpZXM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NzQ7bGVmdDo3MzgiPjY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3OTI7bGVmdDoyODgiPkVwaXBoYW5pZXM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc5MTtsZWZ0OjczOCI+NzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjgwODtsZWZ0OjI3MCI+SlVuaXQgNDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjgwODtsZWZ0OjczOCI+NzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjgyODtsZWZ0OjI3MCI+RGVzaWduaW5nIGZvciBUZXN0YWJpbGl0eTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjgyODtsZWZ0OjczOCI+ODwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjg0NztsZWZ0OjI4OCI+T2JqZWN0LU9yaWVudGVkIFByb2dyYW1taW5nIGFuZCBFbmNhcHN1bGF0aW9uPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6ODQ2O2xlZnQ6NzM4Ij44PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo4NjQ7bGVmdDoyODgiPlRoZSBEZXNpZ24gUGF0dGVybnMgUmV2b2x1dGlvbjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjg2MztsZWZ0OjczOCI+OTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjg4MDtsZWZ0OjI4OCI+SWRlbnRpZnlpbmcgdGhlIEVuZW15PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6ODc5O2xlZnQ6NzI5Ij4xMDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6ODk3O2xlZnQ6Mjg4Ij5SZWNvbW1lbmRhdGlvbnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo4OTY7bGVmdDo3MjkiPjE2PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OTEzO2xlZnQ6MjcwIj5UZXN0Tkc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo5MTM7bGVmdDo3MjkiPjE3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OTMzO2xlZnQ6Mjg4Ij5Bbm5vdGF0aW9uczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OTMyO2xlZnQ6NzI5Ij4xNzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjk1MDtsZWZ0OjI4OCI+VGVzdHMsIFN1aXRlcywgYW5kIENvbmZpZ3VyYXRpb24gQW5ub3RhdGlvbnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo5NDg7bGVmdDo3MjkiPjE4PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OTY2O2xlZnQ6Mjg4Ij5Hcm91cHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo5NjU7bGVmdDo3MjkiPjIwPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo5ODM7bGVmdDoyODgiPjxiPnRlc3RuZy54bWw8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OTgxO2xlZnQ6NzI5Ij4yMTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjk5OTtsZWZ0OjI3MCI+Q29uY2x1c2lvbjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjk5OTtsZWZ0OjcyOSI+MjE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMDQ1O2xlZnQ6MTYyIj5DaGFwdGVyIDI8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMDQ1O2xlZnQ6MjcwIj5UZXN0aW5nIERlc2lnbiBQYXR0ZXJuczwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTA0NTtsZWZ0OjcyNSI+MjM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMDc1O2xlZnQ6MjcwIj5UZXN0aW5nIGZvciBGYWlsdXJlczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjEwNzU7bGVmdDo3MjkiPjIzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTA5NDtsZWZ0OjI4OCI+UmVwb3J0aW5nIEVycm9yczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjEwOTM7bGVmdDo3MjkiPjI0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMTExO2xlZnQ6Mjg4Ij5SdW50aW1lIGFuZCBDaGVja2VkIEV4Y2VwdGlvbnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMTEwO2xlZnQ6NzI5Ij4yNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjIiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjhweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjAyO2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgdiAgVGh1cnNkYXksIEF1Z3VzdCAxNiwgMjAwNyAgMTA6MjIgQU08L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMjgyO2xlZnQ6MCI+PGhyPjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkIGJnY29sb3I9ImVlZWVlZSIgYWxpZ249InJpZ2h0Ij48Zm9udCBmYWNlPSJhcmlhbCxzYW5zLXNlcmlmIj48YSBuYW1lPSIwLjFfMiI+PGI+UGFnZSAyPC9iPjwvYT48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTM4NztsZWZ0OjExNyI+dmk8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjEzOTA7bGVmdDoxODkiPkNvbnRlbnRzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTQ0NDtsZWZ0OjI0MyI+VGVzdGluZyBXaGV0aGVyIFlvdXIgQ29kZSBIYW5kbGVzIEZhaWx1cmVzIEdyYWNlZnVsbHk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNDQzO2xlZnQ6Njg0Ij4yNzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE0NjA7bGVmdDoyNDMiPldoZW4gTm90IHRvIFVzZSA8Yj5leHBlY3RlZEV4Y2VwdGlvbnM8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNDU5O2xlZnQ6Njg0Ij4zMTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE0Nzc7bGVmdDoyNDMiPjxiPnRlc3RuZy1mYWlsZWQueG1sPC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE0NzY7bGVmdDo2ODQiPjMyPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTQ5MztsZWZ0OjIyNSI+RmFjdG9yaWVzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTQ5MztsZWZ0OjY4NCI+MzQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNTEzO2xlZnQ6MjQzIj48Yj5ARmFjdG9yeTwvYj48L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE1MTI7bGVmdDo2ODQiPjM1PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTUzMDtsZWZ0OjI0MyI+PGI+b3JnLnRlc3RuZy5JVGVzdDwvYj48L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNTI4O2xlZnQ6Njg0Ij4zODwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE1NDY7bGVmdDoyMjUiPkRhdGEtRHJpdmVuIFRlc3Rpbmc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNTQ2O2xlZnQ6Njg0Ij4zOTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTU2NTtsZWZ0OjI0MyI+UGFyYW1ldGVycyBhbmQgVGVzdCBNZXRob2RzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTU2NDtsZWZ0OjY4NCI+NDI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNTgyO2xlZnQ6MjQzIj5QYXNzaW5nIFBhcmFtZXRlcnMgd2l0aCA8Yj50ZXN0bmcueG1sPC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE1ODE7bGVmdDo2ODQiPjQ0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNTk4O2xlZnQ6MjQzIj5QYXNzaW5nIFBhcmFtZXRlcnMgd2l0aCA8Yj5ARGF0YVByb3ZpZGVyPC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE1OTc7bGVmdDo2ODQiPjQ3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTYxNTtsZWZ0OjI0MyI+UGFyYW1ldGVycyBmb3IgRGF0YSBQcm92aWRlcnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNjE0O2xlZnQ6Njg0Ij41MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTYzMTtsZWZ0OjI0MyI+VGhlIDxiPk1ldGhvZCA8L2I+UGFyYW1ldGVyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTYzMDtsZWZ0OjY4NCI+NTA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNjQ4O2xlZnQ6MjQzIj5UaGUgPGI+SVRlc3RDb250ZXh0IDwvYj5QYXJhbWV0ZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE2NDc7bGVmdDo2ODQiPjUyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTY2NDtsZWZ0OjI0MyI+TGF6eSBEYXRhIFByb3ZpZGVyczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE2NjM7bGVmdDo2ODQiPjU0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTY4MTtsZWZ0OjI0MyI+UHJvcyBhbmQgQ29ucyBvZiBCb3RoIEFwcHJvYWNoZXM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNjgwO2xlZnQ6Njg0Ij41OTwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTY5NztsZWZ0OjI0MyI+U3VwcGx5aW5nIHRoZSBEYXRhPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTY5NjtsZWZ0OjY4NCI+NjA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNzE0O2xlZnQ6MjQzIj5EYXRhIFByb3ZpZGVyIG9yIEZhY3Rvcnk/PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTcxMztsZWZ0OjY4NCI+NjI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE3MzA7bGVmdDoyNDMiPlR5aW5nIEl0IEFsbCBUb2dldGhlcjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE3Mjk7bGVmdDo2ODQiPjYzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTc0NztsZWZ0OjIyNSI+QXN5bmNocm9ub3VzIFRlc3Rpbmc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxNzQ3O2xlZnQ6Njg0Ij42NzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE3NjY7bGVmdDoyMjUiPlRlc3RpbmcgTXVsdGl0aHJlYWRlZCBDb2RlPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTc2NjtsZWZ0OjY4NCI+NzE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE3ODY7bGVmdDoyNDMiPkNvbmN1cnJlbnQgVGVzdGluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE3ODU7bGVmdDo2ODQiPjcyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTgwMztsZWZ0OjI0MyI+PGI+dGhyZWFkUG9vbFNpemU8L2I+LCA8Yj5pbnZvY2F0aW9uQ291bnQ8L2I+LCBhbmQgPGI+dGltZU91dDwvYj48L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxODAxO2xlZnQ6Njg0Ij43NTwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTgxOTtsZWZ0OjI0MyI+Q29uY3VycmVudCBSdW5uaW5nPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTgxODtsZWZ0OjY4NCI+Nzk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxODM1O2xlZnQ6MjQzIj5UdXJuaW5nIG9uIHRoZSBQYXJhbGxlbCBCaXQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxODM0O2xlZnQ6Njg0Ij44MjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE4NTI7bGVmdDoyMjUiPlBlcmZvcm1hbmNlIFRlc3Rpbmc8L2Rpdj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE4NTI7bGVmdDo2ODQiPjgzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTg3MTtsZWZ0OjI0MyI+QWxnb3JpdGhtIENvbXBsZXhpdHk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxODcwO2xlZnQ6Njg0Ij44NDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE4ODg7bGVmdDoyNDMiPlRlc3RpbmcgQ29tcGxleGl0eTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE4ODc7bGVmdDo2ODQiPjg3PC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxOTA0O2xlZnQ6MjI1Ij5Nb2NrcyBhbmQgU3R1YnM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxOTA0O2xlZnQ6Njg0Ij45MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE5MjQ7bGVmdDoyNDMiPk1vY2tzIHZlcnN1cyBTdHViczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE5MjM7bGVmdDo2ODQiPjkwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTk0MDtsZWZ0OjI0MyI+RGVzaWduaW5nIGZvciBNb2NrYWJpbGl0eTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTkzOTtsZWZ0OjY4NCI+OTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxOTU3O2xlZnQ6MjQzIj5Nb2NrIExpYnJhcmllczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjE5NTY7bGVmdDo2ODQiPjk2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTk3MztsZWZ0OjI0MyI+U2VsZWN0aW5nIHRoZSBSaWdodCBTdHJhdGVneTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTk3MjtsZWZ0OjY4NCI+OTk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxOTkwO2xlZnQ6MjQzIj5Nb2NrIFBpdGZhbGxzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTk4OTtsZWZ0OjY3NSI+MTAwPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjAwNjtsZWZ0OjIyNSI+RGVwZW5kZW50IFRlc3Rpbmc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDA2O2xlZnQ6Njc1Ij4xMDM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDI2O2xlZnQ6MjQzIj5EZXBlbmRlbnQgQ29kZTwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjAyNTtsZWZ0OjY3NSI+MTA0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjA0MjtsZWZ0OjI0MyI+RGVwZW5kZW50IFRlc3Rpbmcgd2l0aCBUZXN0Tkc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDQxO2xlZnQ6Njc1Ij4xMDU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDU5O2xlZnQ6MjQzIj5EZWNpZGluZyBXaGV0aGVyIHRvIERlcGVuZCBvbiBHcm91cHMgb3Igb24gTWV0aG9kczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjA1ODtsZWZ0OjY3NSI+MTA2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjA3NTtsZWZ0OjI0MyI+RGVwZW5kZW50IFRlc3RpbmcgYW5kIFRocmVhZHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDc0O2xlZnQ6Njc1Ij4xMTA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMDkyO2xlZnQ6MjQzIj5GYWlsdXJlcyBvZiBDb25maWd1cmF0aW9uIE1ldGhvZHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIwOTE7bGVmdDo2NzUiPjExMDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIxMDg7bGVmdDoyMjUiPkluaGVyaXRhbmNlIGFuZCBBbm5vdGF0aW9uIFNjb3BlczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIxMDg7bGVmdDo2NzUiPjExMzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIxMjg7bGVmdDoyNDMiPlRoZSBQcm9ibGVtPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjEyNztsZWZ0OjY3NSI+MTEzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjE0NDtsZWZ0OjI0MyI+UGl0ZmFsbHMgb2YgSW5oZXJpdGFuY2U8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIxNDM7bGVmdDo2NzUiPjExNjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIxNjE7bGVmdDoyMjUiPlRlc3QgR3JvdXBzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjE2MTtsZWZ0OjY3NSI+MTE5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjE4MDtsZWZ0OjI0MyI+U3ludGF4PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjE3OTtsZWZ0OjY3NSI+MTIwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMTk3O2xlZnQ6MjQzIj5Hcm91cHMgYW5kIFJ1bnRpbWU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMTk2O2xlZnQ6Njc1Ij4xMjI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyMjEzO2xlZnQ6MjQzIj5SdW5uaW5nIEdyb3VwczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjIyMTI7bGVmdDo2NzUiPjEyNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjIzMDtsZWZ0OjI0MyI+VXNpbmcgR3JvdXBzIEVmZmVjdGl2ZWx5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjIyOTtsZWZ0OjY3NSI+MTI3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoxMzA5O2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgdmkgIFRodXJzZGF5LCBBdWd1c3QgMTYsIDIwMDcgIDEwOjIyIEFNPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjM4OTtsZWZ0OjAiPjxocj48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCBiZ2NvbG9yPSJlZWVlZWUiIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iYXJpYWwsc2Fucy1zZXJpZiI+PGEgbmFtZT0iMC4xXzMiPjxiPlBhZ2UgMzwvYj48L2E+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2Pjxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI0OTc7bGVmdDo2MjAiPkNvbnRlbnRzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNDk0O2xlZnQ6NzI5Ij52aWk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNTUxO2xlZnQ6MjcwIj5Db2RlIENvdmVyYWdlPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjU1MTtsZWZ0OjcyMCI+MTMyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjU3MDtsZWZ0OjI4OCI+QSBDb3ZlcmFnZSBFeGFtcGxlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjU2OTtsZWZ0OjcyMCI+MTMzPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNTg3O2xlZnQ6Mjg4Ij5Db3ZlcmFnZSBNZXRyaWNzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjU4NjtsZWZ0OjcyMCI+MTM0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjYwMztsZWZ0OjI4OCI+Q292ZXJhZ2UgVG9vbHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNjAyO2xlZnQ6NzIwIj4xMzY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI2MjA7bGVmdDoyODgiPkltcGxlbWVudGF0aW9uPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjYxOTtsZWZ0OjcyMCI+MTQ2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjYzNjtsZWZ0OjI4OCI+QmV3YXJlITwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI2MzU7bGVmdDo3MjAiPjE0NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjY1MztsZWZ0OjI4OCI+QSBHdWlkZSB0byBTdWNjZXNzZnVsIENvdmVyYWdlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjY1MjtsZWZ0OjcyMCI+MTQ3PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjY2OTtsZWZ0OjI3MCI+Q29uY2x1c2lvbjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI2Njk7bGVmdDo3MjAiPjE1MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI3MTY7bGVmdDoxNjIiPkNoYXB0ZXIgMzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI3MTY7bGVmdDoyNzAiPkVudGVycHJpc2UgVGVzdGluZzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI3MTY7bGVmdDo3MTUiPjE1MzwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mjc0NTtsZWZ0OjI3MCI+QSBUeXBpY2FsIEVudGVycHJpc2UgU2NlbmFyaW88L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzQ1O2xlZnQ6NzIwIj4xNTQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzY0O2xlZnQ6Mjg4Ij5QYXJ0aWNpcGFudHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzYzO2xlZnQ6NzIwIj4xNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzgxO2xlZnQ6Mjg4Ij5UZXN0aW5nIE1ldGhvZG9sb2d5PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzgwO2xlZnQ6NzIwIj4xNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNzk3O2xlZnQ6Mjg4Ij5Jc3N1ZXMgd2l0aCB0aGUgQ3VycmVudCBBcHByb2FjaDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI3OTY7bGVmdDo3MjAiPjE1NjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4MTQ7bGVmdDoyNzAiPkEgQ29uY3JldGUgRXhhbXBsZTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4MTQ7bGVmdDo3MjAiPjE1NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjgzMztsZWZ0OjI4OCI+R29hbHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyODMyO2xlZnQ6NzIwIj4xNTk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyODUwO2xlZnQ6Mjg4Ij5Ob25nb2FsczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4NDk7bGVmdDo3MjAiPjE2MDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4NjY7bGVmdDoyNzAiPlRlc3QgSW1wbGVtZW50YXRpb248L2Rpdj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4NjY7bGVmdDo3MjAiPjE2MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI4ODY7bGVmdDoyODgiPlRlc3RpbmcgZm9yIFN1Y2Nlc3M8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyODg1O2xlZnQ6NzIwIj4xNjE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTAzO2xlZnQ6Mjg4Ij5CdWlsZGluZyBUZXN0IERhdGE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTAxO2xlZnQ6NzIwIj4xNjM8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI5MTk7bGVmdDoyODgiPlRlc3QgU2V0dXAgSXNzdWVzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjkxODtsZWZ0OjcyMCI+MTY2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjkzNTtsZWZ0OjI4OCI+RXJyb3IgSGFuZGxpbmc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTM0O2xlZnQ6NzIwIj4xNzI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI5NTI7bGVmdDoyODgiPkVtZXJnaW5nIFVuaXQgVGVzdHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTUxO2xlZnQ6NzIwIj4xNzU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTY4O2xlZnQ6Mjg4Ij5Db3Bpbmcgd2l0aCBJbi1Db250YWluZXIgQ29tcG9uZW50czwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjI5Njc7bGVmdDo3MjAiPjE3NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mjk4NTtsZWZ0OjI4OCI+UHV0dGluZyBJdCBBbGwgVG9nZXRoZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyOTg0O2xlZnQ6NzIwIj4xNzg8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMDAxO2xlZnQ6MjcwIj5FeHBsb3JpbmcgdGhlIENvbXBldGluZyBDb25zdW1lcnMgUGF0dGVybjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMwMDE7bGVmdDo3MjAiPjE4MjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMwMjE7bGVmdDoyODgiPlRoZSBQYXR0ZXJuPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzAyMDtsZWZ0OjcyMCI+MTgyPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMDM4O2xlZnQ6Mjg4Ij5UaGUgVGVzdDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMwMzY7bGVmdDo3MjAiPjE4NDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMwNTQ7bGVmdDoyNzAiPlRoZSBSb2xlIG9mIFJlZmFjdG9yaW5nPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzA1NDtsZWZ0OjcyMCI+MTg2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzA3NDtsZWZ0OjI4OCI+QSBDb25jcmV0ZSBFeGFtcGxlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMDcyO2xlZnQ6NzIwIj4xODc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMDkwO2xlZnQ6Mjg4Ij5BbiBJbi1Db250YWluZXIgQXBwcm9hY2g8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMDg5O2xlZnQ6NzIwIj4xOTM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMTA2O2xlZnQ6MjcwIj5Db25jbHVzaW9uPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzEwNjtsZWZ0OjcyMCI+MTk0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMTUzO2xlZnQ6MTYyIj5DaGFwdGVyIDQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMTUzO2xlZnQ6MjcwIj5KYXZhIEVFIFRlc3Rpbmc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMTUzO2xlZnQ6NzE1Ij4xOTc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMTgyO2xlZnQ6MjcwIj5Jbi1Db250YWluZXIgdmVyc3VzIE91dC1vZi1Db250YWluZXIgVGVzdGluZzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMxODI7bGVmdDo3MjAiPjE5ODwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMyMDI7bGVmdDoyNzAiPkluLUNvbnRhaW5lciBUZXN0aW5nPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzIwMjtsZWZ0OjcyMCI+MjAwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjIxO2xlZnQ6Mjg4Ij5DcmVhdGluZyBhIFRlc3QgRW52aXJvbm1lbnQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjIwO2xlZnQ6NzIwIj4yMDA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjM4O2xlZnQ6Mjg4Ij5JZGVudGlmeWluZyBUZXN0czwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMyMzc7bGVmdDo3MjAiPjIwMTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzI1NDtsZWZ0OjI4OCI+UmVnaXN0ZXJpbmcgVGVzdHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjUzO2xlZnQ6NzIwIj4yMDM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjcxO2xlZnQ6Mjg4Ij5SZWdpc3RlcmluZyBhIFJlc3VsdHMgTGlzdGVuZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjcwO2xlZnQ6NzIwIj4yMDQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjg3O2xlZnQ6MjcwIj5KYXZhIE5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSAoSk5ESSk8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMjg3O2xlZnQ6NzIwIj4yMDc8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMzMDc7bGVmdDoyODgiPlVuZGVyc3RhbmRpbmcgSk5ESVx1MjAxOXMgQm9vdHN0cmFwcGluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMzMDY7bGVmdDo3MjAiPjIwNzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjMzMjM7bGVmdDoyODgiPlNwcmluZ1x1MjAxOXMgPGI+U2ltcGxlTmFtaW5nQ29udGV4dEJ1aWxkZXI8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzMyMjtsZWZ0OjcyMCI+MjA5PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozMzQwO2xlZnQ6Mjg4Ij5Bdm9pZGluZyBKTkRJPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzMzOTtsZWZ0OjcyMCI+MjEwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDoyNDE2O2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgdmlpICBUaHVyc2RheSwgQXVndXN0IDE2LCAyMDA3ICAxMDoyMiBBTTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM0OTY7bGVmdDowIj48aHI+PHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgYmdjb2xvcj0iZWVlZWVlIiBhbGlnbj0icmlnaHQiPjxmb250IGZhY2U9ImFyaWFsLHNhbnMtc2VyaWYiPjxhIG5hbWU9IjAuMV80Ij48Yj5QYWdlIDQ8L2I+PC9hPjwvZm9udD48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNjAxO2xlZnQ6MTE3Ij52aWlpPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNjA0O2xlZnQ6MTg5Ij5Db250ZW50czwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM2NTg7bGVmdDoyMjUiPkphdmEgRGF0YWJhc2UgQ29ubmVjdGl2aXR5IChKREJDKTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM2NTg7bGVmdDo2NzUiPjIxMDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM2Nzc7bGVmdDoyNDMiPmMzcDA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNjc2O2xlZnQ6Njc1Ij4yMTI8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM2OTQ7bGVmdDoyNDMiPkNvbW1vbnMgREJDUDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM2OTM7bGVmdDo2NzUiPjIxMzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM3MTA7bGVmdDoyNDMiPlNwcmluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM3MDk7bGVmdDo2NzUiPjIxMzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM3Mjc7bGVmdDoyMjUiPkphdmEgVHJhbnNhY3Rpb24gQVBJIChKVEEpPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNzI3O2xlZnQ6Njc1Ij4yMTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNzQ2O2xlZnQ6MjQzIj5KYXZhIE9wZW4gVHJhbnNhY3Rpb24gTWFuYWdlciAoSk9UTSk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNzQ1O2xlZnQ6Njc1Ij4yMTc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNzYzO2xlZnQ6MjQzIj5BdG9taWtvcyBUcmFuc2FjdGlvbkVzc2VudGlhbHMgPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzc2MjtsZWZ0OjY3NSI+MjE4PC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozNzc5O2xlZnQ6MjI1Ij5KYXZhIE1lc3NhZ2luZyBTZXJ2aWNlIChKTVMpPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzc3OTtsZWZ0OjY3NSI+MjE5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzc5OTtsZWZ0OjI0MyI+Q3JlYXRpbmcgYSBTZW5kZXIvUmVjZWl2ZXIgVGVzdDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM3OTg7bGVmdDo2NzUiPjIxOTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM4MTU7bGVmdDoyNDMiPlVzaW5nIEFjdGl2ZU1RIGZvciBUZXN0czwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzgxNDtsZWZ0OjY3NSI+MjIxPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzgzMjtsZWZ0OjIyNSI+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSk8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozODMyO2xlZnQ6Njc1Ij4yMjU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozODUxO2xlZnQ6MjQzIj5Db25maWd1cmluZyB0aGUgRGF0YWJhc2U8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozODUwO2xlZnQ6Njc1Ij4yMjc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM4Njg7bGVmdDoyNDMiPkNvbmZpZ3VyaW5nIHRoZSBKUEEgUHJvdmlkZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozODY3O2xlZnQ6Njc1Ij4yMjc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozODg0O2xlZnQ6MjQzIj5Xcml0aW5nIHRoZSBUZXN0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzg4MztsZWZ0OjY3NSI+MjI5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzkwMTtsZWZ0OjI0MyI+U2ltdWxhdGluZyBhIENvbnRhaW5lcjwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzkwMDtsZWZ0OjY3NSI+MjMwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzkxNztsZWZ0OjI0MyI+VXNpbmcgU3ByaW5nIGFzIHRoZSBDb250YWluZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTE2O2xlZnQ6Njc1Ij4yMzE8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTM0O2xlZnQ6MjI1Ij5FbnRlcnByaXNlIEphdmEgQmVhbnMgMy4wIChFSkIzKTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjM5MzQ7bGVmdDo2NzUiPjIzNjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzk1MztsZWZ0OjI0MyI+TWVzc2FnZS1Ecml2ZW4gQmVhbnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTUyO2xlZnQ6Njc1Ij4yMzc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTcwO2xlZnQ6MjQzIj5TZXNzaW9uIEJlYW5zPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Mzk2OTtsZWZ0OjY3NSI+MjQwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTg2O2xlZnQ6MjQzIj5Bbm90aGVyIFNwcmluZyBDb250YWluZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDozOTg1O2xlZnQ6Njc1Ij4yNDM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MDAzO2xlZnQ6MjQzIj5EaXNhZHZhbnRhZ2VzIG9mIGEgRnVsbCBDb250YWluZXI8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MDAyO2xlZnQ6Njc1Ij4yNDQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MDE5O2xlZnQ6MjI1Ij5KYXZhIEFQSSBmb3IgWE1MIFdlYiBTZXJ2aWNlcyAoSkFYLVdTKTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQwMTk7bGVmdDo2NzUiPjI0NjwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDAzOTtsZWZ0OjI0MyI+UmVjb3JkaW5nIFJlcXVlc3RzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDAzODtsZWZ0OjY3NSI+MjQ4PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDA1NTtsZWZ0OjI0MyI+U2V0dGluZyBVcCB0aGUgVGVzdCBFbnZpcm9ubWVudDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQwNTQ7bGVmdDo2NzUiPjI0ODwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDA3MjtsZWZ0OjI0MyI+Q3JlYXRpbmcgdGhlIFNlcnZpY2UgVGVzdDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQwNzE7bGVmdDo2NzUiPjI1MTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQwODg7bGVmdDoyNDMiPlhQYXRoIFRlc3Rpbmc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MDg3O2xlZnQ6Njc1Ij4yNTM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQxMDU7bGVmdDoyNDMiPlRlc3RpbmcgUmVtb3RlIFNlcnZpY2VzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDEwNDtsZWZ0OjY3NSI+MjU0PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDEyMTtsZWZ0OjIyNSI+U2VydmxldHM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MTIxO2xlZnQ6Njc1Ij4yNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MTQxO2xlZnQ6MjQzIj5Jbi1Db250YWluZXIgVGVzdGluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQxNDA7bGVmdDo2NzUiPjI1NTwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDE1NztsZWZ0OjI0MyI+TW9jay9TdHViIE9iamVjdHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MTU2O2xlZnQ6Njc1Ij4yNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MTc0O2xlZnQ6MjQzIj5SZWZhY3RvcmluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQxNzM7bGVmdDo2NzUiPjI1NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDE5MDtsZWZ0OjI0MyI+RW1iZWRkZWQgQ29udGFpbmVyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDE4OTtsZWZ0OjY3NSI+MjU3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDIwNztsZWZ0OjI0MyI+SW4tTWVtb3J5IEludm9jYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MjA2O2xlZnQ6Njc1Ij4yNjA8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MjIzO2xlZnQ6MjI1Ij5YTUw8L2Rpdj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQyMjM7bGVmdDo2NzUiPjI2MjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQyNDM7bGVmdDoyNDMiPlVzaW5nIGRvbTRqPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDI0MjtsZWZ0OjY3NSI+MjYzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDI1OTtsZWZ0OjI0MyI+VXNpbmcgWE1MVW5pdDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQyNTg7bGVmdDo2NzUiPjI2NDwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDI3NjtsZWZ0OjIyNSI+Q29uY2x1c2lvbjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQyNzY7bGVmdDo2NzUiPjI2NjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQzMjI7bGVmdDoxMTciPkNoYXB0ZXIgNTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQzMjI7bGVmdDoyMjUiPkludGVncmF0aW9uPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDMyMjtsZWZ0OjY3MCI+MjY5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDM1MTtsZWZ0OjIyNSI+U3ByaW5nPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDM1MTtsZWZ0OjY3NSI+MjcwPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0MzcxO2xlZnQ6MjQzIj5TcHJpbmdcdTIwMTlzIFRlc3QgUGFja2FnZSBGZWF0dXJlczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQzNzA7bGVmdDo2NzUiPjI3MTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQzODg7bGVmdDoyNDMiPlRlc3QgQ2xhc3MgSGllcmFyY2h5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDM4NjtsZWZ0OjY3NSI+MjcyPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDQwNDtsZWZ0OjIyNSI+R3VpY2U8L2Rpdj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ0MDQ7bGVmdDo2NzUiPjI4MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ0MjQ7bGVmdDoyNDMiPlRoZSBJc3N1ZSB3aXRoIFNwcmluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ0MjI7bGVmdDo2NzUiPjI4MDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ0NDA7bGVmdDoyNDMiPkVudGVyIEd1aWNlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDQzOTtsZWZ0OjY3NSI+MjgxPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0NDU2O2xlZnQ6MjQzIj5BIFR5cGljYWwgRGVwZW5kZW5jeSBTY2VuYXJpbzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ0NTU7bGVmdDo2NzUiPjI4MjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjIiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjhweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MzUyMztsZWZ0OjkwIj5CZXVzdC5ib29rICBQYWdlIHZpaWkgIFRodXJzZGF5LCBBdWd1c3QgMTYsIDIwMDcgIDEwOjIyIEFNPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDYwMztsZWZ0OjAiPjxocj48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCBiZ2NvbG9yPSJlZWVlZWUiIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iYXJpYWwsc2Fucy1zZXJpZiI+PGEgbmFtZT0iMC4xXzUiPjxiPlBhZ2UgNTwvYj48L2E+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2Pjxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3MTE7bGVmdDo2MjAiPkNvbnRlbnRzPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0NzA4O2xlZnQ6NzMzIj5peDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3NjU7bGVmdDoyODgiPlRoZSBPYmplY3QgRmFjdG9yeTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3NjQ7bGVmdDo3MjAiPjI4NDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3ODE7bGVmdDoyODgiPkd1aWNlIENvbmZpZ3VyYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3ODA7bGVmdDo3MjAiPjI4NjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ3OTg7bGVmdDoyODgiPkd1aWNlLUJhc2VkIFRlc3Q8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0Nzk3O2xlZnQ6NzIwIj4yOTA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODE0O2xlZnQ6Mjg4Ij5Hcm91cGluZyBUZXN0IERlcGVuZGVuY2llczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDgxMztsZWZ0OjcyMCI+MjkxPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDgzMTtsZWZ0OjI4OCI+SW5qZWN0aW5nIENvbmZpZ3VyYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODMwO2xlZnQ6NzIwIj4yOTM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODQ3O2xlZnQ6MjcwIj5EYlVuaXQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODQ3O2xlZnQ6NzIwIj4yOTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODY3O2xlZnQ6Mjg4Ij5Db25maWd1cmF0aW9uPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODY2O2xlZnQ6NzIwIj4yOTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODgzO2xlZnQ6Mjg4Ij5Vc2FnZTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ4ODI7bGVmdDo3MjAiPjI5NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ5MDA7bGVmdDoyODgiPlZlcmlmeWluZyBSZXN1bHRzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0ODk5O2xlZnQ6NzIwIj4yOTk8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0OTE2O2xlZnQ6MjcwIj5IdG1sVW5pdDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ5MTY7bGVmdDo3MjAiPjMwMzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ5MzY7bGVmdDoyODgiPkNvbmZpZ3VyYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0OTM1O2xlZnQ6NzIwIj4zMDQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjQ5NTI7bGVmdDoyODgiPlVzYWdlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDk1MTtsZWZ0OjcyMCI+MzA1PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDk2OTtsZWZ0OjI3MCI+U2VsZW5pdW08L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0OTY5O2xlZnQ6NzIwIj4zMTA8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0OTg4O2xlZnQ6MjcwIj5Td2luZyBVSSBUZXN0aW5nPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDk4ODtsZWZ0OjcyMCI+MzEyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAwODtsZWZ0OjI4OCI+VGVzdGluZyBBcHByb2FjaDwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAwNztsZWZ0OjcyMCI+MzEyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAyNDtsZWZ0OjI4OCI+Q29uZmlndXJhdGlvbjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUwMjM7bGVmdDo3MjAiPjMxMzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUwNDE7bGVmdDoyODgiPlVzYWdlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MDQwO2xlZnQ6NzIwIj4zMTQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MDU3O2xlZnQ6MjcwIj5UZXN0cyBmb3IgUGFpbnRpbmcgQ29kZTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUwNTc7bGVmdDo3MjAiPjMxNjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUwNzc7bGVmdDoyNzAiPkNvbnRpbnVvdXMgSW50ZWdyYXRpb248L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MDc3O2xlZnQ6NzIwIj4zMjA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MDk2O2xlZnQ6Mjg4Ij5XaHkgQm90aGVyPzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTA5NTtsZWZ0OjcyMCI+MzIwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTExMztsZWZ0OjI4OCI+Q0kgU2VydmVyIEZlYXR1cmVzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTExMjtsZWZ0OjcyMCI+MzIwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTEyOTtsZWZ0OjI4OCI+VGVzdE5HIEludGVncmF0aW9uPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTEyODtsZWZ0OjcyMCI+MzIxPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MTQ2O2xlZnQ6MjcwIj5Db25jbHVzaW9uPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTE0NjtsZWZ0OjcyMCI+MzIyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTE5MjtsZWZ0OjE2MiI+Q2hhcHRlciA2PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTE5MjtsZWZ0OjI3MCI+RXh0ZW5kaW5nIFRlc3RORzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUxOTI7bGVmdDo3MTUiPjMyNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUyMjE7bGVmdDoyNzAiPlRoZSBUZXN0TkcgQVBJPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTIyMTtsZWZ0OjcyMCI+MzI1PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MjQyO2xlZnQ6Mjg4Ij48Yj5vcmcudGVzdG5nLlRlc3RORzwvYj4sIDxiPklUZXN0UmVzdWx0PC9iPiwgPGI+SVRlc3RMaXN0ZW5lcjwvYj4sIDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUyNTg7bGVmdDozMDYiPjxiPklUZXN0TkdNZXRob2Q8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTI1NjtsZWZ0OjcyMCI+MzI1PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1Mjc0O2xlZnQ6Mjg4Ij5BIENvbmNyZXRlIEV4YW1wbGU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MjczO2xlZnQ6NzIwIj4zMjg8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MjkwO2xlZnQ6Mjg4Ij5UaGUgWE1MIEFQSTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUyODk7bGVmdDo3MjAiPjMzMTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMDc7bGVmdDoyODgiPlN5bnRoZXRpYyBYTUwgRmlsZXM8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMDY7bGVmdDo3MjAiPjMzMzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMjM7bGVmdDoyNzAiPkJlYW5TaGVsbDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzMjM7bGVmdDo3MjAiPjMzNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzNDM7bGVmdDoyODgiPkJlYW5TaGVsbCBPdmVydmlldzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjUzNDI7bGVmdDo3MjAiPjMzNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTM2MDtsZWZ0OjI4OCI+VGVzdE5HIGFuZCBCZWFuU2hlbGw8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MzU4O2xlZnQ6NzIwIj4zMzc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1Mzc2O2xlZnQ6Mjg4Ij5JbnRlcmFjdGl2ZSBFeGVjdXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1Mzc1O2xlZnQ6NzIwIj4zMzk8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MzkyO2xlZnQ6MjcwIj5NZXRob2QgU2VsZWN0b3JzPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1MzkyO2xlZnQ6NzIwIj4zNDE8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NDEyO2xlZnQ6MjcwIj5Bbm5vdGF0aW9uIFRyYW5zZm9ybWVyczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0MTI7bGVmdDo3MjAiPjM0NjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0MzI7bGVmdDoyODgiPkFubm90YXRpb24gSGlzdG9yeTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0MzA7bGVmdDo3MjAiPjM0NjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0NDg7bGVmdDoyODgiPlByb3MgYW5kIENvbnM8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0NDc7bGVmdDo3MjAiPjM0ODwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0NjQ7bGVmdDoyODgiPlVzaW5nIFRlc3RORyBBbm5vdGF0aW9uIFRyYW5zZm9ybWVyczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0NjM7bGVmdDo3MjAiPjM0ODwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0ODE7bGVmdDoyODgiPlBvc3NpYmxlIFVzZXMgb2YgQW5ub3RhdGlvbiBUcmFuc2Zvcm1lcnM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0ODA7bGVmdDo3MjAiPjM1MzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU0OTc7bGVmdDoyNzAiPlJlcG9ydHM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NDk3O2xlZnQ6NzIwIj4zNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NTE3O2xlZnQ6Mjg4Ij5EZWZhdWx0IFJlcG9ydHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NTE2O2xlZnQ6NzIwIj4zNTU8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU1MzQ7bGVmdDoyODgiPlRoZSBSZXBvcnRlciBBUEk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NTMzO2xlZnQ6NzIwIj4zNjA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NTUwO2xlZnQ6Mjg4Ij5UaGUgUmVwb3J0IFBsdWctaW4gQVBJPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTU0OTtsZWZ0OjcyMCI+MzYwPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo0NjMwO2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgaXggIFRodXJzZGF5LCBBdWd1c3QgMTYsIDIwMDcgIDEwOjIyIEFNPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1NzEwO2xlZnQ6MCI+PGhyPjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkIGJnY29sb3I9ImVlZWVlZSIgYWxpZ249InJpZ2h0Ij48Zm9udCBmYWNlPSJhcmlhbCxzYW5zLXNlcmlmIj48YSBuYW1lPSIwLjFfNiI+PGI+UGFnZSA2PC9iPjwvYT48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTgxNTtsZWZ0OjExNyI+eDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU4MTg7bGVmdDoxODkiPkNvbnRlbnRzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTg3MjtsZWZ0OjIyNSI+V3JpdGluZyBDdXN0b20gQW5ub3RhdGlvbnM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo1ODcyO2xlZnQ6Njc1Ij4zNjY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU4OTE7bGVmdDoyNDMiPkltcGxlbWVudGF0aW9uPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTg5MDtsZWZ0OjY3NSI+MzY3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTkwODtsZWZ0OjI0MyI+VGVzdGluZzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU5MDc7bGVmdDo2NzUiPjM3MTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU5MjQ7bGVmdDoyMjUiPkNvbmNsdXNpb248L2Rpdj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU5MjQ7bGVmdDo2NzUiPjM3NTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU5NzE7bGVmdDoxMTciPkNoYXB0ZXIgNzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjU5NzE7bGVmdDoyMjUiPkRpZ3Jlc3Npb25zPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTk3MTtsZWZ0OjY3MCI+Mzc3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjAwMDtsZWZ0OjIyNSI+TW90aXZhdGlvbjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYwMDA7bGVmdDo2NzUiPjM3NzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYwMTk7bGVmdDoyMjUiPlRoZSBUZXN0TkcgUGhpbG9zb3BoeTwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjAxOTtsZWZ0OjY3NSI+Mzc4PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjAzOTtsZWZ0OjIyNSI+VGhlIENhcmUgYW5kIEZlZWRpbmcgb2YgRXhjZXB0aW9uczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYwMzk7bGVmdDo2NzUiPjM3ODwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYwNTg7bGVmdDoyMjUiPlN0YXRlZnVsIFRlc3RzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjA1ODtsZWZ0OjY3NSI+MzgyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjA3ODtsZWZ0OjI0MyI+SW1tdXRhYmxlIFN0YXRlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjA3NztsZWZ0OjY3NSI+MzgyPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MDk0O2xlZnQ6MjQzIj5NdXRhYmxlIFN0YXRlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjA5MztsZWZ0OjY3NSI+MzgzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjExMTtsZWZ0OjIyNSI+VGhlIFBpdGZhbGxzIG9mIFRlc3QtRHJpdmVuIERldmVsb3BtZW50PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjExMTtsZWZ0OjY3NSI+Mzg1PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjEzMDtsZWZ0OjI0MyI+VEREIFByb21vdGVzIE1pY3JvZGVzaWduIG92ZXIgTWFjcm9kZXNpZ248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYxMjk7bGVmdDo2NzUiPjM4NTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYxNDc7bGVmdDoyNDMiPlRERCBJcyBIYXJkIHRvIEFwcGx5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjE0NjtsZWZ0OjY3NSI+Mzg2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjE2MztsZWZ0OjI0MyI+RXh0cmFjdGluZyB0aGUgR29vZCBmcm9tIFRlc3QtRHJpdmVuIERldmVsb3BtZW50PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MTYyO2xlZnQ6Njc1Ij4zODg8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MTgwO2xlZnQ6MjI1Ij5UZXN0aW5nIFByaXZhdGUgTWV0aG9kczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYxODA7bGVmdDo2NzUiPjM4ODwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYxOTk7bGVmdDoyMjUiPlRlc3RpbmcgdmVyc3VzIEVuY2Fwc3VsYXRpb248L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MTk5O2xlZnQ6Njc1Ij4zOTE8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MjE5O2xlZnQ6MjI1Ij5UaGUgUG93ZXIgb2YgRGVidWdnZXJzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjIxOTtsZWZ0OjY3NSI+MzkyPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjIzODtsZWZ0OjIyNSI+TG9nZ2luZyBCZXN0IFByYWN0aWNlczwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjYyMzg7bGVmdDo2NzUiPjM5NDwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjI1ODtsZWZ0OjIyNSI+VGhlIFZhbHVlIG9mIFRpbWU8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MjU4O2xlZnQ6Njc1Ij4zOTc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2Mjc3O2xlZnQ6MjI1Ij5Db25jbHVzaW9uPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjI3NztsZWZ0OjY3NSI+Mzk5PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjMyNDtsZWZ0OjExNyI+QXBwZW5kaXggQSBJREUgSW50ZWdyYXRpb248L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MzI0O2xlZnQ6NjcwIj40MDE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MzUzO2xlZnQ6MjI1Ij5FY2xpcHNlPC9kaXY+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MzUzO2xlZnQ6Njc1Ij40MDE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2MzczO2xlZnQ6MjQzIj5JbnN0YWxsaW5nIHRoZSBQbHVnLWluPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjM3MjtsZWZ0OjY3NSI+NDAxPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjM4OTtsZWZ0OjI0MyI+VmVyaWZ5aW5nIHRoZSBJbnN0YWxsYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2Mzg4O2xlZnQ6Njc1Ij40MDQ8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY0MDY7bGVmdDoyNDMiPkNyZWF0aW5nIGEgTGF1bmNoIENvbmZpZ3VyYXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDA1O2xlZnQ6Njc1Ij40MDQ8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDIyO2xlZnQ6MjQzIj5Db25maWd1cmluZyBQcmVmZXJlbmNlczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY0MjE7bGVmdDo2NzUiPjQxMDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjQzOTtsZWZ0OjI0MyI+Q29udmVydGluZyBKVW5pdCBUZXN0czwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY0Mzg7bGVmdDo2NzUiPjQxMDwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY0NTU7bGVmdDoyMjUiPkludGVsbGlKIElERUE8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDU1O2xlZnQ6Njc1Ij40MTE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDc1O2xlZnQ6MjQzIj5JbnN0YWxsaW5nIHRoZSBQbHVnLWluPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDc0O2xlZnQ6Njc1Ij40MTE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NDkxO2xlZnQ6MjQzIj5SdW5uaW5nIFRlc3RzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjQ5MDtsZWZ0OjY3NSI+NDEyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjUwODtsZWZ0OjI0MyI+UnVubmluZyBTaG9ydGN1dHM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NTA3O2xlZnQ6Njc1Ij40MTc8L2Rpdj4KKworPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY1MjQ7bGVmdDoyNDMiPlZpZXdpbmcgVGVzdCBSZXN1bHRzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjUyMztsZWZ0OjY3NSI+NDE4PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjU0MTtsZWZ0OjI0MyI+UnVubmluZyBQbHVnLWluIFJlZmFjdG9yaW5nczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY1NDA7bGVmdDo2NzUiPjQxOTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjU4NDtsZWZ0OjExNyI+QXBwZW5kaXggQiBUZXN0TkcgSmF2YWRvY3M8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NTg0O2xlZnQ6NjcwIj40MjE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NjEzO2xlZnQ6MjI1Ij5KREsgMS40IGFuZCBKREsgNTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY2MTM7bGVmdDo2NzUiPjQyMTwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY2MzM7bGVmdDoyMjUiPlNob3J0Y3V0IFN5bnRheCBmb3IgSkRLIDUgQW5ub3RhdGlvbnM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2NjMzO2xlZnQ6Njc1Ij40MjM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSIyIiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTo4cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTczNztsZWZ0OjkwIj5CZXVzdC5ib29rICBQYWdlIHggIFRodXJzZGF5LCBBdWd1c3QgMTYsIDIwMDcgIDEwOjIyIEFNPC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjgxNztsZWZ0OjAiPjxocj48dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCBiZ2NvbG9yPSJlZWVlZWUiIGFsaWduPSJyaWdodCI+PGZvbnQgZmFjZT0iYXJpYWwsc2Fucy1zZXJpZiI+PGEgbmFtZT0iMC4xXzciPjxiPlBhZ2UgNzwvYj48L2E+PC9mb250PjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2Pjxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY5MjU7bGVmdDo2MjAiPkNvbnRlbnRzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NjkyMjtsZWZ0OjczMyI+eGk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2OTc5O2xlZnQ6MjcwIj5Bbm5vdGF0aW9uIEphdmFkb2NzPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Njk3OTtsZWZ0OjcyMCI+NDIzPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2OTk5O2xlZnQ6Mjg4Ij48Yj5APGEgaHJlZj0ibWFpbHRvOkRhdGFQcm92aWRlci9AdGVzdG5nLmRhdGEtcHJvdmlkZXIiIHRhcmdldD0iX2JsYW5rIj5EYXRhUHJvdmlkZXIvQHRlc3RuZy5kYXRhPFdCUj4tcHJvdmlkZXI8L2E+PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjY5OTc7bGVmdDo3MjAiPjQyNTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcwMTU7bGVmdDoyODgiPjxiPkA8YSBocmVmPSJtYWlsdG86RmFjdG9yeS9AdGVzdG5nLmZhY3RvcnkiIHRhcmdldD0iX2JsYW5rIj5GYWN0b3J5L0B0ZXN0bmcuZmFjdG9yeTwvYT48L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDE0O2xlZnQ6NzIwIj40MjY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDMyO2xlZnQ6Mjg4Ij48Yj5APGEgaHJlZj0ibWFpbHRvOlBhcmFtZXRlcnMvQHRlc3RuZy5wYXJhbWV0ZXJzIiB0YXJnZXQ9Il9ibGFuayI+UGFyYW1ldGVycy9AdGVzdG5nLnBhcmFtZXRlcnM8L2E+PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcwMzA7bGVmdDo3MjAiPjQyNjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcwNDg7bGVmdDoyODgiPjxiPkA8YSBocmVmPSJtYWlsdG86VGVzdC9AdGVzdG5nLnRlc3QiIHRhcmdldD0iX2JsYW5rIj5UZXN0L0B0ZXN0bmcudGVzdDwvYT48L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorCis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDQ3O2xlZnQ6NzIwIj40Mjc8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDY0O2xlZnQ6MjcwIj5UaGUgPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzA2NjtsZWZ0OjI5OCI+PGI+b3JnLnRlc3RuZy5UZXN0Tkc8L2I+PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzA2NDtsZWZ0OjQ0MSI+Q2xhc3M8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDY0O2xlZnQ6NzIwIj40Mjg8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MDg0O2xlZnQ6MjcwIj5UaGUgWE1MIEFQSTwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzA4NDtsZWZ0OjcyMCI+NDMyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzEzMDtsZWZ0OjE2MiI+QXBwZW5kaXggQyA8Yj50ZXN0bmcueG1sPC9iPjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcxMzE7bGVmdDo3MTUiPjxiPjQzNTwvYj48L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MTU5O2xlZnQ6MjcwIj5PdmVydmlldzwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcxNTk7bGVmdDo3MjAiPjQzNjwvZGl2PgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcxNzk7bGVmdDoyNzAiPlNjb3BlczwvZGl2PgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzE3OTtsZWZ0OjcyMCI+NDM3PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzE5ODtsZWZ0OjI3MCI+WE1MIFRhZ3M8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MTk4O2xlZnQ6NzIwIj40Mzc8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MjE5O2xlZnQ6Mjg4Ij48Yj4mbHQ7c3VpdGUmZ3Q7PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcyMTc7bGVmdDo3MjAiPjQzNzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjcyMzU7bGVmdDoyODgiPjxiPiZsdDtwYWNrYWdlcyZndDsgPC9iPmFuZCA8Yj4mbHQ7cGFja2FnZSZndDs8L2I+PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MjMzO2xlZnQ6NzIwIj40NDA8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MjUyO2xlZnQ6Mjg4Ij48Yj4mbHQ7cGFyYW1ldGVyJmd0OzwvYj48L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MjUwO2xlZnQ6NzIwIj40NDE8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MjY4O2xlZnQ6Mjg4Ij48Yj4mbHQ7c3VpdGUtZmlsZXMmZ3Q7IDwvYj5hbmQgPGI+Jmx0O3N1aXRlLWZpbGUmZ3Q7PC9iPjwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzI2NjtsZWZ0OjcyMCI+NDQyPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzI4NTtsZWZ0OjI4OCI+PGI+Jmx0O21ldGhvZC1zZWxlY3RvcnMmZ3Q7PC9iPiwgPGI+Jmx0O21ldGhvZC1zZWxlY3RvciZndDs8L2I+LCA8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MzAxO2xlZnQ6MzA2Ij48Yj4mbHQ7c2VsZWN0b3ItY2xhc3MmZ3Q7PC9iPiwgYW5kIDxiPiZsdDtzY3JpcHQmZ3Q7PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzI5OTtsZWZ0OjcyMCI+NDQzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzMxODtsZWZ0OjI4OCI+PGI+Jmx0O3Rlc3QmZ3Q7PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjczMTY7bGVmdDo3MjAiPjQ0NDwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjczMzQ7bGVmdDoyODgiPjxiPiZsdDtncm91cHMmZ3Q7PC9iPiwgPGI+Jmx0O2RlZmluZSZndDs8L2I+LCBhbmQgPGI+Jmx0O3J1biZndDs8L2I+PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MzMyO2xlZnQ6NzIwIj40NDY8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3MzUxO2xlZnQ6Mjg4Ij48Yj4mbHQ7Y2xhc3NlcyZndDsgPC9iPmFuZCA8Yj4mbHQ7Y2xhc3MmZ3Q7PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjczNDk7bGVmdDo3MjAiPjQ0NjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorCis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzM2NztsZWZ0OjI4OCI+PGI+Jmx0O21ldGhvZHMmZ3Q7PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjczNjU7bGVmdDo3MjAiPjQ0NzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc0MTA7bGVmdDoxNjIiPkFwcGVuZGl4IEQgTWlncmF0aW5nIGZyb20gSlVuaXQ8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NDEwO2xlZnQ6NzE1Ij40NDk8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NDQxO2xlZnQ6MjcwIj48Yj5KVW5pdENvbnZlcnRlcjwvYj48L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+CisKKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc0Mzk7bGVmdDo3MjAiPjQ0OTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc0NTk7bGVmdDoyODgiPkZyb20gdGhlIENvbW1hbmQgTGluZTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc0NTg7bGVmdDo3MjAiPjQ0OTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc0NzU7bGVmdDoyODgiPkZyb20gPGI+YW50PC9iPjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzQ3NDtsZWZ0OjcyMCI+NDUyPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzQ5MjtsZWZ0OjI3MCI+SW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudHM8L2Rpdj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NDkyO2xlZnQ6NzIwIj40NTM8L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NTExO2xlZnQ6Mjg4Ij5FY2xpcHNlPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzUxMDtsZWZ0OjcyMCI+NDUzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3NTI4O2xlZnQ6Mjg4Ij5JREVBPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzUyNztsZWZ0OjcyMCI+NDU0PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU0NDtsZWZ0OjI3MCI+SW5jcmVtZW50YWwgTWlncmF0aW9uIGFuZCBKVW5pdCBNb2RlPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU0NDtsZWZ0OjcyMCI+NDU1PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU2NDtsZWZ0OjI3MCI+Q29udmVydGluZyBKVW5pdCBDb2RlPC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU2NDtsZWZ0OjcyMCI+NDU2PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU4MztsZWZ0OjI4OCI+QXNzZXJ0aW9uczwvZGl2PgorCis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU4MjtsZWZ0OjcyMCI+NDU3PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzYwMDtsZWZ0OjI4OCI+UnVubmluZyBhIFNpbmdsZSBUZXN0PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzU5OTtsZWZ0OjcyMCI+NDU4PC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzYxNjtsZWZ0OjI4OCI+TWFpbnRhaW5pbmcgU3RhdGUgYmV0d2VlbiBJbnZvY2F0aW9uczwvZGl2PgorPC9zcGFuPjwvZm9udD4KKworPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzYxNTtsZWZ0OjcyMCI+NDYxPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzYzMztsZWZ0OjI4OCI+U3VpdGUtd2lkZSBJbml0aWFsaXphdGlvbjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc2MzI7bGVmdDo3MjAiPjQ2MzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc2NDk7bGVmdDoyODgiPkNsYXNzLXdpZGUgSW5pdGlhbGl6YXRpb248L2Rpdj4KKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKworPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc2NDg7bGVmdDo3MjAiPjQ2MzwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc2NjY7bGVmdDoyODgiPlRoZSBBbGxUZXN0cyBQYXR0ZXJuPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzY2NTtsZWZ0OjcyMCI+NDYzPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzY4MjtsZWZ0OjI4OCI+VGVzdGluZyBFeGNlcHRpb25zPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iOCIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LWZhbWlseTpUaW1lcyI+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NzY4MTtsZWZ0OjcyMCI+NDY3PC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+Cis8Zm9udCBzaXplPSI4IiBmYWNlPSJUaW1lcyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3Njk5O2xlZnQ6Mjg4Ij5UaGUgUGFyYW1ldGVyaXplZCBUZXN0IENhc2UgUGF0dGVybjwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc2OTg7bGVmdDo3MjAiPjQ2OTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzxmb250IHNpemU9IjgiIGZhY2U9IlRpbWVzIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC1mYW1pbHk6VGltZXMiPgorPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjc3NDI7bGVmdDoyNzAiPkluZGV4PC9kaXY+Cis8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Nzc0MjtsZWZ0OjcxNSI+NDcxPC9kaXY+Cis8L3NwYW4+PC9mb250PgorPGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo2ODQ0O2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgeGkgIFRodXJzZGF5LCBBdWd1c3QgMTYsIDIwMDcgIDEwOjIyIEFNPC9kaXY+CisKKzwvc3Bhbj48L2ZvbnQ+CisKKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3OTI0O2xlZnQ6MCI+PGhyPjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkIGJnY29sb3I9ImVlZWVlZSIgYWxpZ249InJpZ2h0Ij48Zm9udCBmYWNlPSJhcmlhbCxzYW5zLXNlcmlmIj48YSBuYW1lPSIwLjFfOCI+PGI+UGFnZSA4PC9iPjwvYT48L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iVGltZXMiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6OHB4O2ZvbnQtZmFtaWx5OlRpbWVzIj4KKzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDo3OTUxO2xlZnQ6OTAiPkJldXN0LmJvb2sgIFBhZ2UgeGlpICBUaHVyc2RheSwgQXVndXN0IDE2LCAyMDA3ICAxMDoyMiBBTTwvZGl2PgorPC9zcGFuPjwvZm9udD4KKzwvZGl2PgorCis8L2Rpdj48L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jL2Jvb2suaHRtbCBiL2RvYy9ib29rLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YjMyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9ib29rLmh0bWwKQEAgLTAsMCArMSw1MiBAQAorPGh0bWw+CisgICA8aGVhZD4KKyAgICAgICA8dGl0bGU+TmV4dCBHZW5lcmF0aW9uIEphdmEgVGVzdGluZzwvdGl0bGU+CisKKyAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRlc3RuZy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vYmV1c3QuY3NzIiAgLz4KKyAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3ByZXR0aWZ5LmpzIj48L3NjcmlwdD4KKyAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9kb2MvYmFubmVyLmpzIj48L3NjcmlwdD4KKyAgICAgPC9oZWFkPgorCis8Ym9keSBvbmxvYWQ9InByZXR0eVByaW50KCkiPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICBkaXNwbGF5TWVudSgiYm9vay5odG1sIik7Cis8L3NjcmlwdD4KKworCis8cCBhbGlnbj0iY2VudGVyIj4KKzxhIGhyZWY9Imh0dHA6Ly93d3cuYW1hem9uLmNvbS9OZXh0LUdlbmVyYXRpb24tSmF2YS1UZXN0aW5nLUFkdmFuY2VkL2RwLzAzMjE1MDMxMDQvcmVmPXBkX2Jic19zcl8xLzEwNC03MTA1ODk3LTExODc5MjM/aWU9VVRGOCZzPWJvb2tzJnFpZD0xMTkzNDE3MTEwJnNyPTgtMSI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3BpY3MvYm9vay1jb3Zlci5qcGciIC8+Cis8L2E+Cis8L3A+CisKK091ciBib29rIGlzIG5vdyA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vTmV4dC1HZW5lcmF0aW9uLUphdmEtVGVzdGluZy1BZHZhbmNlZC9kcC8wMzIxNTAzMTA0L3JlZj1wZF9iYnNfc3JfMS8xMDQtNzEwNTg5Ny0xMTg3OTIzP2llPVVURjgmcz1ib29rcyZxaWQ9MTE5MzQxNzExMCZzcj04LTEiPmF2YWlsYWJsZSBmcm9tIEFtYXpvbjwvYT4gYW5kIHZhcmlvdXMgb3RoZXIgcmV0YWlsIHN0b3JlcyAoY2hlY2sgb3V0IDxhIGhyZWY9ImJvb2stdG9jLmh0bWwiPnRoZSB0YWJsZSBvZiBjb250ZW50czwvYT4pLgorCis8UD4KKworPGI+Qm9vayBEZXNjcmlwdGlvbjwvYj48YnI+CisgPHA+RW50ZXJwcmlzZSBKYXZhIGRldmVsb3BlcnMgbXVzdCBhY2hpZXZlIGJyb2FkZXIsIGRlZXBlciB0ZXN0IGNvdmVyYWdlLCBnb2luZyBiZXlvbmQgdW5pdCB0ZXN0aW5nIHRvIGltcGxlbWVudCBmdW5jdGlvbmFsIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0aW5nIHdpdGggc3lzdGVtYXRpYyBhY2NlcHRhbmNlLiA8Yj48aT5OZXh0IEdlbmVyYXRpb24gSmF2YSBUZXN0aW5nPC9pPjwvYj4gaW50cm9kdWNlcyBicmVha3Rocm91Z2ggSmF2YSB0ZXN0aW5nIHRlY2huaXF1ZXMgYW5kIFRlc3RORywgYSBwb3dlcmZ1bCBvcGVuIHNvdXJjZSBKYXZhIHRlc3RpbmcgcGxhdGZvcm0uPC9wPjxwPkPpZHJpYyBCZXVzdCwgVGVzdE5HJ3MgY3JlYXRvciwgYW5kIGxlYWRpbmcgSmF2YSBkZXZlbG9wZXIgSGFuaSBTdWxlaW1hbiwgcHJlc2VudCBwb3dlcmZ1bCwgZmxleGlibGUgdGVzdGluZyBwYXR0ZXJucyB0aGF0IHdpbGwgd29yayB3aXRoIHZpcnR1YWxseSBhbnkgdGVzdGluZyB0b29sLCBmcmFtZXdvcmssIG9yIGxhbmd1YWdlLiBUaGV5IHNob3cgaG93IHRvIGxldmVyYWdlIGtleSBKYXZhIHBsYXRmb3JtIGltcHJvdmVtZW50cyBkZXNpZ25lZCB0byBmYWNpbGl0YXRlIGVmZmVjdGl2ZSB0ZXN0aW5nLCBzdWNoIGFzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBtb2NrIG9iamVjdHMuIFRoZXkgYWxzbyB0aG9yb3VnaGx5IGludHJvZHVjZSBUZXN0TkcsIGRlbW9uc3RyYXRpbmcgaG93IGl0IG92ZXJjb21lcyB0aGUgbGltaXRhdGlvbnMgb2Ygb2xkZXIgZnJhbWV3b3JrcyBhbmQgZW5hYmxlcyBuZXcgdGVjaG5pcXVlcywgbWFraW5nIGl0IGZhciBlYXNpZXIgdG8gdGVzdCB0b2RheSdzIGNvbXBsZXggc29mdHdhcmUgc3lzdGVtcy48L3A+PHA+UHJhZ21hdGljIGFuZCByZXN1bHRzLWZvY3VzZWQsIDxiPjxpPk5leHQgR2VuZXJhdGlvbiBKYXZhIFRlc3Rpbmc8L2k+PC9iPiB3aWxsIGhlbHAgSmF2YSBkZXZlbG9wZXJzIGJ1aWxkIG1vcmUgcm9idXN0IQorIGNvZGUgZm9yIHRvZGF5J3MgbWlzc2lvbi1jcml0aWNhbCBlbnZpcm9ubWVudHMuPC9wPjxwPlRoaXMgYm9vazwvcD48dWw+PGxpPklsbHVtaW5hdGVzIHRoZSB0cmFkZW9mZnMgYXNzb2NpYXRlZCB3aXRoIHRlc3RpbmcsIHNvIHlvdSBjYW4gbWFrZSBiZXR0ZXIgZGVjaXNpb25zIGFib3V0IHdoYXQgYW5kIGhvdyB0byB0ZXN0PC9saT48bGk+SW50cm9kdWNlcyBUZXN0TkcsIGV4cGxhaW5zIGl0cyBnb2FscyBhbmQgZmVhdHVyZXMsIGFuZCBzaG93cyBob3cgdG8gYXBwbHkgdGhlbSBpbiByZWFsLXdvcmxkIGVudmlyb25tZW50czwvbGk+PGxpPlNob3dzIGhvdyB0byBpbnRlZ3JhdGUgVGVzdE5HIHdpdGggeW91ciBleGlzdGluZyBjb2RlLCBkZXZlbG9wbWVudCBmcmFtZXdvcmtzLCBhbmQgc29mdHdhcmUgbGlicmFyaWVzIDwvbGk+PGxpPkRlbW9uc3RyYXRlcyBob3cgdG8gdGVzdCBjcnVjaWFsIGNvZGUgZmVhdHVyZXMsIHN1Y2ggYXMgZW5jYXBzdWxhdGlvbiwgc3RhdGUgc2hhcmluZywgc2NvcGVzLCBhbmQgdGhyZWFkIHNhZmV0eTwvbGk+PGxpPlNob3dzIGhvdyB0byB0ZXN0IGFwcGxpY2F0aW9uIGVsZW1lbnRzLCBpbmNsdWRpbmcgSmF2YUVFIEFQSXMsIGRhdGFiYXNlcywgV2ViIHBhZ2VzLCBhbmQgWE1MIGZpbGVzIDwvbGk+PGxpPlByZXNlbnRzIGFkdmFuY2VkIHRlY2huaXF1ZXM6IHRlc3RpbmcgcGFydGlhbCBmYWlsdXJlcywgZmFjdG9yaWVzLCBkZXBlbmRlbnQgdGVzdGluZywgcmVtb3RlIGludm9jYXRpb24sIGNsdXN0ZXItYmFzZWQgdGVzdCBmYXJtcywgYW5kIG1vcmU8L2xpPjxsaT5XYWxrcyB0aHJvdWdoIGluc3RhbGxpbmcgYW5kIHVzaW5nIFRlc3RORyBwbHVnLWlucyBmb3IgRWNsaXBzZSwgYW5kIElERUE8L2xpPjxsaT5Db250YWlucyBleHRlbnNpdmUgY29kZSBleGFtcGxlczwvbGk+PC91bD48cD5XaGV0aGVyIHlvdSB1c2UgVGVzdE5HLCBKVW5pdCwgb3IgYW5vdGhlciB0ZXN0aW5nIGZyYW1ld29yaywgdGhlICEKKyB0ZXN0aW5nIGRlc2lnbiBwYXR0ZXJucyBwcmVzZW50ZWQgaW4gdGhpcyBib29rIHdpbGwgc2hvdyB5b3UgaG93IHRvIGltCitwcm92ZSB5b3VyIHRlc3RzIGJ5IGdpdmluZyB5b3UgY29uY3JldGUgYWR2aWNlIG9uIGhvdyB0byBtYWtlIHlvdXIgY29kZSBhbmQgeW91ciBkZXNpZ24gbW9yZSB0ZXN0YWJsZS48L3A+CisKKworPGJyPjxicj4KKyAgICAgPGI+QWJvdXQgdGhlIEF1dGhvcjwvYj48YnI+CisgPHA+PGI+Q+lkcmljIEJldXN0LDwvYj4gYSBzZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQgR29vZ2xlLCBpcyBhbiBhY3RpdmUgbWVtYmVyIG9mIHRoZSBKYXZhIENvbW11bml0eSBQcm9jZXNzIHdobyBoYXMgYmVlbiBleHRlbnNpdmVseSBpbnZvbHZlZCBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGxhdGVzdCBKYXZhIHJlbGVhc2UuIEhlIGlzIHRoZSBjcmVhdG9yIGFuZCBtYWluIGNvbnRyaWJ1dG9yIHRvIHRoZSBUZXN0TkcgcHJvamVjdC48L3A+PHA+PGI+SGFuaSBTdWxlaW1hbjwvYj4gaXMgQ1RPIG9mIEZvcm1pY2FyeSwgYSBjb25zdWx0aW5nIGFuZCBwb3J0YWwgY29tcGFueSBzcGVjaWFsaXppbmcgaW4gZmluYW5jaWFsIGFwcGxpY2F0aW9ucy4gSGUgaXMgb25lIG9mIHR3byBpbmRpdmlkdWFsIG1lbWJlcnMgd2hvIGhhcyBiZWVuIGVsZWN0ZWQgdG8gdGhlIEV4ZWN1dGl2ZSBDb21taXR0ZWUgb2YgdGhlIEphdmEgQ29tbXVuaXR5IFByb2Nlc3MuPC9wPgorCisKKworPHNjcmlwdCBzcmM9Imh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitfdWFjY3QgPSAiVUEtMjM4MjE1LTIiOwordXJjaGluVHJhY2tlcigpOworPC9zY3JpcHQ+CisKKworPC9ib2R5PgorCis8L2h0bWw+CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvY3VtZW50YXRpb24tbWFpbi5odG1sIGIvZG9jL2RvY3VtZW50YXRpb24tbWFpbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTdlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9jdW1lbnRhdGlvbi1tYWluLmh0bWwKQEAgLTAsMCArMSwyNzY0IEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlRlc3RORzwvdGl0bGU+CisKKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0ZXN0bmcuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9iZXVzdC5jc3MiICAvPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJiYW5uZXIuanMiPjwvc2NyaXB0PgorCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hDb3JlLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoSmF2YS5qcyI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaFhtbC5qcyI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaEJhc2guanMiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hQbGFpbi5qcyI+PC9zY3JpcHQ+CisgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL3N0eWxlcy9zaENvcmUuY3NzIi8+CisgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL3N0eWxlcy9zaFRoZW1lQ2VkcmljLmNzcyIvPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICBTeW50YXhIaWdobGlnaHRlci5jb25maWcuY2xpcGJvYXJkU3dmID0gJ3NjcmlwdHMvY2xpcGJvYXJkLnN3Zic7CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmRlZmF1bHRzWydndXR0ZXInXSA9IGZhbHNlOworICAgICAgICBTeW50YXhIaWdobGlnaHRlci5hbGwoKTsKKyAgICAgIDwvc2NyaXB0PgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS90b2MuanMiPjwvc2NyaXB0PgorCisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICAvKiBTZXQgdGhlIGNvbW1hbmQtbGluZSB0YWJsZSBvcHRpb24gY29sdW1uIHdpZHRoLiAqLworICAgICAgICAgICAgI2NvbW1hbmQtbGluZSBjb2xncm91cC5vcHRpb24geworICAgICAgICAgICAgICAgICB3aWR0aDogN2VtOworICAgICAgICAgICAgfQorICAgICAgICA8L3N0eWxlPgorICAgIDwvaGVhZD4KKzxib2R5IG9uTG9hZD0iZ2VuZXJhdGVUb2MoKTsiPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZGlzcGxheU1lbnUoImRvY3VtZW50YXRpb24tbWFpbi5odG1sIikKKzwvc2NyaXB0PgorCis8aDIgYWxpZ249ImNlbnRlciI+VGVzdE5HPC9oMj4KKworPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis8dGFibGUgY2xhc3M9ImZsb2F0LXJpZ2h0Ij4KKyAgPHRyPgorICAgIDx0ZD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCitnb29nbGVfYWRfY2xpZW50ID0gInB1Yi0xNDY3NzU3MDI0MDAyODUwIjsKK2dvb2dsZV9hZF93aWR0aCA9IDEyMDsKK2dvb2dsZV9hZF9oZWlnaHQgPSA2MDA7Citnb29nbGVfYWRfZm9ybWF0ID0gIjEyMHg2MDBfYXMiOworZ29vZ2xlX2FkX2NoYW5uZWwgPSI1NTYwNzQ0OTQ2IjsKKy8vLS0+Cis8IS0tIAorCis8L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiCisgIHNyYz0iaHR0cDovL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+Cis8L3NjcmlwdD4gICAgICAKKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT4KKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRPQworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoMz5UYWJsZSBvZiBDb250ZW50czwvaDM+CisKKzxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIj4KKzwvZGl2PgorCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJTlRST0RVQ1RJT04KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorPGgzPjxhIGNsYXNzPSJzZWN0aW9uIiBuYW1lPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gzPgorCitUZXN0TkcgaXMgYSB0ZXN0aW5nIGZyYW1ld29yayBkZXNpZ25lZCB0byBzaW1wbGlmeSBhIGJyb2FkIHJhbmdlIG9mIHRlc3RpbmcgbmVlZHMsIGZyb20gdW5pdCB0ZXN0aW5nICh0ZXN0aW5nIGEgY2xhc3MgaW4gaXNvbGF0aW9uIG9mIHRoZSBvdGhlcnMpIHRvIGludGVncmF0aW9uIHRlc3RpbmcgKHRlc3RpbmcgZW50aXJlIHN5c3RlbXMgbWFkZSBvZiBzZXZlcmFsIGNsYXNzZXMsIHNldmVyYWwgcGFja2FnZXMgYW5kIGV2ZW4gc2V2ZXJhbCBleHRlcm5hbCBmcmFtZXdvcmtzLCBzdWNoIGFzIGFwcGxpY2F0aW9uIHNlcnZlcnMpLgorCis8cD4KKworV3JpdGluZyBhIHRlc3QgaXMgdHlwaWNhbGx5IGEgdGhyZWUtc3RlcCBwcm9jZXNzOgorCis8dWw+Cis8bGk+V3JpdGUgdGhlIGJ1c2luZXNzIGxvZ2ljIG9mIHlvdXIgdGVzdCBhbmQgaW5zZXJ0IDxhIGhyZWY9IiNhbm5vdGF0aW9ucyI+VGVzdE5HIGFubm90YXRpb25zPC9hPiBpbiB5b3VyIGNvZGUuCis8L2xpPgorPGxpPkFkZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciB0ZXN0IChlLmcuIHRoZSBjbGFzcyBuYW1lLCB0aGUgZ3JvdXBzIHlvdSB3aXNoIHRvIHJ1biwgZXRjLi4uKSBpbiBhIDx0dD48YSBocmVmPSIjdGVzdG5nLXhtbCI+dGVzdG5nLnhtbDwvYT48L3R0PiBmaWxlIG9yIGluIGJ1aWxkLnhtbC4KKzwvbGk+Cis8bGk+PGEgaHJlZj0iYW50Lmh0bWwiPlJ1biBUZXN0Tkc8L2E+LgorPC9saT4KKzwvdWw+CitZb3UgY2FuIGZpbmQgYSBxdWljayBleGFtcGxlIG9uIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5XZWxjb21lIHBhZ2U8L2E+LgorPHA+CitUaGUgY29uY2VwdHMgdXNlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24gYXJlIGFzIGZvbGxvd3M6CisKKzx1bD4KKzxsaT4KK0Egc3VpdGUgaXMgcmVwcmVzZW50ZWQgYnkgb25lIFhNTCBmaWxlLiAgSXQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdGVzdHMgYW5kIGlzIGRlZmluZWQgYnkgdGhlIDx0dD4mbHQ7c3VpdGUmZ3Q7PC90dD4gdGFnLgorPC9saT4KKzxsaT4KK0EgdGVzdCBpcyByZXByZXNlbnRlZCBieSA8dHQ+Jmx0O3Rlc3QmZ3Q7PC90dD4gYW5kIGNhbiBjb250YWluIG9uZSBvciBtb3JlIFRlc3RORyBjbGFzc2VzLgorPC9saT4KKzxsaT4KK0EgVGVzdE5HIGNsYXNzIGlzIGEgSmF2YSBjbGFzcyB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBUZXN0TkcgYW5ub3RhdGlvbi4gIEl0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSA8dHQ+Jmx0O2NsYXNzJmd0OzwvdHQ+IHRhZyBhbmQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdGVzdCBtZXRob2RzLgorPC9saT4KKzxsaT4KK0EgdGVzdCBtZXRob2QgaXMgYSBKYXZhIG1ldGhvZCBhbm5vdGF0ZWQgYnkgPHR0PkBUZXN0PC90dD4gaW4geW91ciBzb3VyY2UuCis8L2xpPjwvdWw+QSBUZXN0TkcgdGVzdCBjYW4gYmUgY29uZmlndXJlZCBieSA8dHQ+QEJlZm9yZVhYWCBhbmQgQEFmdGVyWFhYIDwvdHQ+YW5ub3RhdGlvbnMgd2hpY2ggYWxsb3dzIHRvIHBlcmZvcm0gc29tZSBKYXZhIGxvZ2ljIGJlZm9yZSBhbmQgYWZ0ZXIgYSBjZXJ0YWluIHBvaW50LCB0aGVzZSBwb2ludHMgYmVpbmcgZWl0aGVyIG9mIHRoZSBpdGVtcyBsaXN0ZWQgYWJvdmUuPHA+CitUaGUgcmVzdCBvZiB0aGlzIG1hbnVhbCB3aWxsIGV4cGxhaW4gdGhlIGZvbGxvd2luZzoKKzxwPgorPHVsPgorPGxpPkEgbGlzdCBvZiBhbGwgdGhlIGFubm90YXRpb25zIHdpdGggYSBicmllZiBleHBsYW5hdGlvbi4gIFRoaXMgd2lsbCBnaXZlIHlvdSBhbiBpZGVhIG9mIHRoZSB2YXJpb3VzIGZ1bmN0aW9uYWxpdGllcyBvZmZlcmVkIGJ5IFRlc3RORyBidXQgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBjb25zdWx0IHRoZSBzZWN0aW9uIGRlZGljYXRlZCB0byBlYWNoIG9mIHRoZXNlIGFubm90YXRpb25zIHRvIGxlYXJuIHRoZSBkZXRhaWxzLgorPC9saT4KKzxsaT5BIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0bmcueG1sIGZpbGUsIGl0cyBzeW50YXggYW5kIHdoYXQgeW91IGNhbiBzcGVjaWZ5IGluIGl0LgorPC9saT4KKzxsaT5BIGRldGFpbGVkIGxpc3Qgb2YgdGhlIHZhcmlvdXMgZmVhdHVyZXMgYW5kIGhvdyB0byB1c2UgdGhlbSB3aXRoIGEgY29tYmluYXRpb24gb2YgYW5ub3RhdGlvbnMgYW5kIHRlc3RuZy54bWwuCis8L2xpPgorPC91bD4KKworCis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQU5OT1RBVElPTlMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCis8aDM+PGEgY2xhc3M9InNlY3Rpb24iIG5hbWU9ImFubm90YXRpb25zIj5Bbm5vdGF0aW9uczwvYT48L2gzPgorCitIZXJlIGlzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGFubm90YXRpb25zIGF2YWlsYWJsZSBpbiBUZXN0TkcgYWxvbmcgd2l0aCB0aGVpciBhdHRyaWJ1dGVzLgorCis8cD4KKworPHRhYmxlPgorCis8dHI+Cis8dGQgY29sc3Bhbj0iMiI+PGI+PHR0PkBCZWZvcmVTdWl0ZTxicj5AQWZ0ZXJTdWl0ZTxicj5AQmVmb3JlVGVzdDxicj5AQWZ0ZXJUZXN0PGJyPkBCZWZvcmVHcm91cHM8YnI+QEFmdGVyR3JvdXBzPGJyPkBCZWZvcmVDbGFzczxicj5AQWZ0ZXJDbGFzczxicj5AQmVmb3JlTWV0aG9kPGJyPkBBZnRlck1ldGhvZDwvdHQ+PC9iPjwvdGQ+PHRkPjxiPkNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgVGVzdE5HIGNsYXNzOjwvYj4KKworPGJyPgorCis8YnI+PGI+QEJlZm9yZVN1aXRlOiA8L2I+VGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYmVmb3JlIGFsbCB0ZXN0cyBpbiB0aGlzIHN1aXRlIGhhdmUgcnVuLgorCis8YnI+PGI+QEFmdGVyU3VpdGU6IDwvYj4gVGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgYWxsIHRlc3RzIGluIHRoaXMgc3VpdGUgaGF2ZSBydW4uIAorCis8YnI+PGI+QEJlZm9yZVRlc3Q8L2I+OiBUaGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBiZWZvcmUgYW55IHRlc3QgbWV0aG9kIGJlbG9uZ2luZyB0byB0aGUgY2xhc3NlcyBpbnNpZGUgdGhlICZsdDt0ZXN0Jmd0OyB0YWcgaXMgcnVuLgorCis8YnI+PGI+QEFmdGVyVGVzdDwvYj46IFRoZSBhbm5vdGF0ZWQgbWV0aG9kIHdpbGwgYmUgcnVuIGFmdGVyIGFsbCB0aGUgdGVzdCBtZXRob2RzIGJlbG9uZ2luZyB0byB0aGUgY2xhc3NlcyBpbnNpZGUgdGhlICZsdDt0ZXN0Jmd0OyB0YWcgaGF2ZSBydW4uCisKKzxicj48Yj5AQmVmb3JlR3JvdXBzPC9iPjogICBUaGUgbGlzdCBvZiBncm91cHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgcnVuIGJlZm9yZS4gVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBydW4gc2hvcnRseSBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgbWV0aG9kIHRoYXQgYmVsb25ncyB0byBhbnkgb2YgdGhlc2UgZ3JvdXBzIGlzIGludm9rZWQuCisKKzxicj48Yj5AQWZ0ZXJHcm91cHM8L2I+OiAgIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBydW4gYWZ0ZXIuICBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIHJ1biBzaG9ydGx5IGFmdGVyIHRoZSBsYXN0IHRlc3QgbWV0aG9kIHRoYXQgYmVsb25ncyB0byBhbnkgb2YgdGhlc2UgZ3JvdXBzIGlzIGludm9rZWQuCisKKzxicj48Yj5AQmVmb3JlQ2xhc3M8L2I+OiBUaGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgbWV0aG9kIGluIHRoZSBjdXJyZW50IGNsYXNzIGlzIGludm9rZWQuCisKKzxicj48Yj5AQWZ0ZXJDbGFzczwvYj46IFRoZSBhbm5vdGF0ZWQgbWV0aG9kIHdpbGwgYmUgcnVuIGFmdGVyIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjdXJyZW50IGNsYXNzIGhhdmUgYmVlbiBydW4uIAorCis8YnI+PGI+QEJlZm9yZU1ldGhvZDwvYj46IFRoZSBhbm5vdGF0ZWQgbWV0aG9kIHdpbGwgYmUgcnVuIGJlZm9yZSBlYWNoIHRlc3QgbWV0aG9kLgorCis8YnI+PGI+QEFmdGVyTWV0aG9kPC9iPjogVGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgZWFjaCB0ZXN0IG1ldGhvZC4KKworPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+YWx3YXlzUnVuPC90dD4KKzwvdGQ+Cis8dGQ+CisgICBGb3IgYmVmb3JlIG1ldGhvZHMgKGJlZm9yZVN1aXRlLCBiZWZvcmVUZXN0LCBiZWZvcmVUZXN0Q2xhc3MgYW5kCisgICBiZWZvcmVUZXN0TWV0aG9kLCBidXQgbm90IGJlZm9yZUdyb3Vwcyk6CisgICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgcmVnYXJkbGVzcyBvZiB3aGF0IGdyb3VwcyBpdCBiZWxvbmdzIHRvLiAKKyAgIDxicj4KKyAgIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOiAKKyAgIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICBldmVuIGlmIG9uZSBvciBtb3JlIG1ldGhvZHMgaW52b2tlZCBwcmV2aW91c2x5IGZhaWxlZCBvcgorICAgd2FzIHNraXBwZWQuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5kZXBlbmRzT25Hcm91cHM8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8L3RkPgorPHRkPgorPHR0PmRlcGVuZHNPbk1ldGhvZHM8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5lbmFibGVkPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+Z3JvdXBzPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5pbmhlcml0R3JvdXBzPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgSWYgdHJ1ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZWxvbmcgdG8gZ3JvdXBzIHNwZWNpZmllZCBpbiB0aGUgQFRlc3QgYW5ub3RhdGlvbiBhdCB0aGUgY2xhc3MgbGV2ZWwuCis8L3RkPgorPC90cj4KKworPHRyIGNsYXNzPSJzZXBhcmF0b3IiPgorPHRkIGNvbHNwYW49IjMiPiZuYnNwOzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgY29sc3Bhbj0iMiI+PHR0PjxiPkBEYXRhUHJvdmlkZXI8L2I+PC90dD48L3RkPjx0ZD48Yj5NYXJrcyBhIG1ldGhvZCBhcyBzdXBwbHlpbmcgZGF0YSBmb3IgYSB0ZXN0IG1ldGhvZC4gVGhlIGFubm90YXRlZCBtZXRob2QgbXVzdCByZXR1cm4gYW4gT2JqZWN0W11bXSB3aGVyZSBlYWNoIE9iamVjdFtdIGNhbiBiZSBhc3NpZ25lZCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgdGhlIHRlc3QgbWV0aG9kLiBUaGUgQFRlc3QgbWV0aG9kIHRoYXQgd2FudHMgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdGhpcyBEYXRhUHJvdmlkZXIgbmVlZHMgdG8gdXNlIGEgZGF0YVByb3ZpZGVyIG5hbWUgZXF1YWxzIHRvIHRoZSBuYW1lIG9mIHRoaXMgYW5ub3RhdGlvbi48L2I+PC90ZD48L3RyPjx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+bmFtZTwvdHQ+Cis8L3RkPgorPHRkPgorVGhlIG5hbWUgb2YgdGhpcyBkYXRhIHByb3ZpZGVyLiBJZiBpdCdzIG5vdCBzdXBwbGllZCwgdGhlIG5hbWUgb2YgdGhpcyBkYXRhIHByb3ZpZGVyIHdpbGwgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5wYXJhbGxlbDwvdHQ+Cis8L3RkPgorPHRkPgorSWYgc2V0IHRvIHRydWUsIHRlc3RzIGdlbmVyYXRlZCB1c2luZyB0aGlzIGRhdGEgcHJvdmlkZXIgYXJlIHJ1biBpbiBwYXJhbGxlbC4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkIGNvbHNwYW49IjMiPiZuYnNwOzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgY29sc3Bhbj0iMiI+PGI+PHR0PkBGYWN0b3J5PC90dD48L2I+PC90ZD48dGQ+PGI+IE1hcmtzIGEgbWV0aG9kIGFzIGEgZmFjdG9yeSB0aGF0IHJldHVybnMgb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBieSBUZXN0TkcgYXMgVGVzdCBjbGFzc2VzLiAgVGhlIG1ldGhvZCBtdXN0IHJldHVybiBPYmplY3RbXS48L2I+PC90ZD48L3RyPjx0cj4KKzx0ZCBjb2xzcGFuPSIzIj4mbmJzcDs8L3RkPgorPC90cj4KKworPHRyPgorPHRkIGNvbHNwYW49IjIiPjxiPjx0dD5ATGlzdGVuZXJzPC90dD48L2I+PC90ZD48dGQ+PGI+RGVmaW5lcyBsaXN0ZW5lcnMgb24gYSB0ZXN0IGNsYXNzLjwvYj48L3RkPjwvdHI+Cis8dHI+CisgIDx0ZD48L3RkPgorICA8dGQ+CisgICAgPHR0PnZhbHVlPC90dD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIEFuIGFycmF5IG9mIGNsYXNzZXMgdGhhdCBleHRlbmQgPHR0Pm9yZy50ZXN0bmcuSVRlc3ROR0xpc3RlbmVyPC90dD4uCisgIDwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgY29sc3Bhbj0iMyI+Jm5ic3A7PC90ZD4KKzwvdHI+CisKKzx0ZCBjb2xzcGFuPSIyIj48Yj48dHQ+QFBhcmFtZXRlcnM8L3R0PjwvYj48L3RkPjx0ZD48Yj5EZXNjcmliZXMgaG93IHRvIHBhc3MgcGFyYW1ldGVycyB0byBhIEBUZXN0IG1ldGhvZC48L2I+PC90ZD48L3RyPjx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+dmFsdWU8L3R0PgorPC90ZD4KKzx0ZD4KK1RoZSBsaXN0IG9mIHZhcmlhYmxlcyB1c2VkIHRvIGZpbGwgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkIGNvbHNwYW49IjMiPiZuYnNwOzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgY29sc3Bhbj0iMiI+PGI+QFRlc3Q8L2I+PC90ZD48dGQ+PGI+TWFya3MgYSBjbGFzcyBvciBhIG1ldGhvZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0LjwvYj48L3RkPjwvdHI+PHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5hbHdheXNSdW48L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBydW4gZXZlbiBpZiBpdCBkZXBlbmRzIG9uIGEgbWV0aG9kIHRoYXQgZmFpbGVkLgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+ZGF0YVByb3ZpZGVyPC90dD4KKzwvdGQ+Cis8dGQ+CitUaGUgbmFtZSBvZiB0aGUgZGF0YSBwcm92aWRlciBmb3IgdGhpcyB0ZXN0IG1ldGhvZC4KKzwvdGQ+Cis8L3RyPgorCisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+ZGF0YVByb3ZpZGVyQ2xhc3M8L3R0PgorPC90ZD4KKzx0ZD4KK1RoZSBjbGFzcyB3aGVyZSB0byBsb29rIGZvciB0aGUgZGF0YSBwcm92aWRlci4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkYXRhIHByb3ZpZGVyIHdpbGwgYmUgbG9va2VkIG9uIHRoZSBjbGFzcyBvZiB0aGUgY3VycmVudCB0ZXN0IG1ldGhvZCBvciBvbmUgb2YgaXRzIGJhc2UgY2xhc3Nlcy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGF0YSBwcm92aWRlciBtZXRob2QgbmVlZHMgdG8gYmUgc3RhdGljIG9uIHRoZSBzcGVjaWZpZWQgY2xhc3MuICAKKzwvdGQ+Cis8L3RyPgorCisKKworCisKKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5kZXBlbmRzT25Hcm91cHM8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8L3RkPgorPHRkPgorPHR0PmRlcGVuZHNPbk1ldGhvZHM8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5kZXNjcmlwdGlvbjwvdHQ+Cis8L3RkPgorPHRkPgorICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBtZXRob2QuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5lbmFibGVkPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+ZXhwZWN0ZWRFeGNlcHRpb25zPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgIFRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCBhIHRlc3QgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHRocm93LiAgSWYgbm8gZXhjZXB0aW9uIG9yIGEgZGlmZmVyZW50IHRoYW4gb25lIG9uIHRoaXMgbGlzdCBpcyB0aHJvd24sIHRoaXMgdGVzdCB3aWxsIGJlIG1hcmtlZCBhIGZhaWx1cmUuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5ncm91cHM8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8L3RkPgorPHRkPgorPHR0Pmludm9jYXRpb25Db3VudDwvdHQ+Cis8L3RkPgorPHRkPgorICAgICAgICAgIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5pbnZvY2F0aW9uVGltZU91dDwvdHQ+Cis8L3RkPgorPHRkPgorICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyB0ZXN0IHNob3VsZCB0YWtlIGZvciB0aGUgY3VtdWxhdGVkIHRpbWUgb2YgYWxsIHRoZSBpbnZvY2F0aW9uY291bnRzLiAgVGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGlmIGludm9jYXRpb25Db3VudCBpcyBub3Qgc3BlY2lmaWVkLgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8dHQ+cHJpb3JpdHk8L3R0PgorPC90ZD4KKzx0ZD4KKyAgICAgICAgICBUaGUgcHJpb3JpdHkgZm9yIHRoaXMgdGVzdCBtZXRob2QuIExvd2VyIHByaW9yaXRpZXMgd2lsbCBiZSBzY2hlZHVsZWQgZmlyc3QuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKworPHR0PnN1Y2Nlc3NQZXJjZW50YWdlPC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgVGhlIHBlcmNlbnRhZ2Ugb2Ygc3VjY2VzcyBleHBlY3RlZCBmcm9tIHRoaXMgbWV0aG9kCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD5zaW5nbGVUaHJlYWRlZDwvdHQ+Cis8L3RkPgorPHRkPgorICAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCBhbGwgdGhlIG1ldGhvZHMgb24gdGhpcyB0ZXN0IGNsYXNzIGFyZSBndWFyYW50ZWVkIHRvIHJ1biBpbiB0aGUgc2FtZSB0aHJlYWQsIGV2ZW4gaWYgdGhlIHRlc3RzIGFyZSBjdXJyZW50bHkgYmVpbmcgcnVuIHdpdGggcGFyYWxsZWw9Im1ldGhvZHMiLiBUaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIGF0IHRoZSBjbGFzcyBsZXZlbCBhbmQgaXQgd2lsbCBiZSBpZ25vcmVkIGlmIHVzZWQgYXQgdGhlIG1ldGhvZCBsZXZlbC4gTm90ZTogdGhpcyBhdHRyaWJ1dGUgdXNlZCB0byBiZSBjYWxsZWQgPHR0PnNlcXVlbnRpYWw8L3R0PiAobm93IGRlcHJlY2F0ZWQpLgorCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD50aW1lT3V0PC90dD4KKzwvdGQ+Cis8dGQ+CisgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGlzIHRlc3Qgc2hvdWxkIHRha2UuCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPC90ZD4KKzx0ZD4KKzx0dD50aHJlYWRQb29sU2l6ZTwvdHQ+Cis8L3RkPgorPHRkPgorICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCBmb3IgdGhpcyBtZXRob2QuICAKK1RoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhcyBzcGVjaWZpZWQgYnkgCitpbnZvY2F0aW9uQ291bnQuIDxicj5Ob3RlOiAgdGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiBpbnZvY2F0aW9uQ291bnQgaXMgbm90IHNwZWNpZmllZAorCis8L3RkPgorPC90cj4KKworPC90YWJsZT4KKworCisKKworPC9wcmU+Cis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVEVTVE5HLlhNTAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Cis8aDM+PGEgY2xhc3M9InNlY3Rpb24iIG5hbWU9InRlc3RuZy14bWwiPnRlc3RuZy54bWw8L2E+PC9oMz4KKworPHA+WW91IGNhbiBpbnZva2UgVGVzdE5HIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXM6PC9wPjx1bD4KKwk8bGk+V2l0aCBhIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZTwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnL2RvYy9hbnQuaHRtbCI+V2l0aCBhbnQ8L2E+PC9saT48bGk+RnJvbSB0aGUgY29tbWFuZCBsaW5lPC9saT48L3VsPjxwPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiA8dHQ+dGVzdG5nLnhtbDwvdHQ+ICh5b3Ugd2lsbCBmaW5kIGRvY3VtZW50YXRpb24gCitvbiBhbnQgYW5kIHRoZSBjb21tYW5kIGxpbmUgYmVsb3cpLjwvcD48cD5UaGUgY3VycmVudCBEVEQgZm9yIDx0dD50ZXN0bmcueG1sPC90dD4gY2FuIGJlIGZvdW5kIG9uIHRoZSBtYWluIFdlYiBzaXRlOiZuYnNwOworPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPmh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkPC9hPiAKKyhmb3IgeW91ciBjb252ZW5pZW5jZSwgeW91IG1pZ2h0IHByZWZlciB0byBicm93c2UgdGhlCis8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9kdGQiPkhUTUwgdmVyc2lvbjwvYT4pLjwvcD4KKworSGVyZSBpcyBhbiBleGFtcGxlIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZToKKworPHA+Cis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj50ZXN0bmcueG1sPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0OyFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiICZndDsKKyAKKyZsdDtzdWl0ZSBuYW1lPSJTdWl0ZTEiIHZlcmJvc2U9IjEiICZndDsKKyAgJmx0O3Rlc3QgbmFtZT0iTm9wYWNrYWdlIiAmZ3Q7CisgICAgJmx0O2NsYXNzZXMmZ3Q7CisgICAgICAgJmx0O2NsYXNzIG5hbWU9Ik5vUGFja2FnZVRlc3QiIC8mZ3Q7CisgICAgJmx0Oy9jbGFzc2VzJmd0OworICAmbHQ7L3Rlc3QmZ3Q7CisKKyAgJmx0O3Rlc3QgbmFtZT0iUmVncmVzc2lvbjEiJmd0OworICAgICZsdDtjbGFzc2VzJmd0OworICAgICAgJmx0O2NsYXNzIG5hbWU9InRlc3Quc2FtcGxlLlBhcmFtZXRlclNhbXBsZSIvJmd0OworICAgICAgJmx0O2NsYXNzIG5hbWU9InRlc3Quc2FtcGxlLlBhcmFtZXRlclRlc3QiLyZndDsKKyAgICAmbHQ7L2NsYXNzZXMmZ3Q7CisgICZsdDsvdGVzdCZndDsKKyZsdDsvc3VpdGUmZ3Q7Cis8L3ByZT4KKworWW91IGNhbiBzcGVjaWZ5IHBhY2thZ2UgbmFtZXMgaW5zdGVhZCBvZiBjbGFzcyBuYW1lczoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+dGVzdG5nLnhtbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogeG1sOyBoaWdobGlnaHQ6IFs1LDYsN10iPgorJmx0OyFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiICZndDsKKworJmx0O3N1aXRlIG5hbWU9IlN1aXRlMSIgdmVyYm9zZT0iMSIgJmd0OworICAmbHQ7dGVzdCBuYW1lPSJSZWdyZXNzaW9uMSIgICAmZ3Q7CisgICAgJmx0O3BhY2thZ2VzJmd0OworICAgICAgJmx0O3BhY2thZ2UgbmFtZT0idGVzdC5zYW1wbGUiIC8mZ3Q7CisgICAmbHQ7L3BhY2thZ2VzJmd0OworICZsdDsvdGVzdCZndDsKKyZsdDsvc3VpdGUmZ3Q7Cis8L3ByZT4KKworCis8cD5JbiB0aGlzIGV4YW1wbGUsIFRlc3RORyB3aWxsIGxvb2sgYXQgYWxsIHRoZSBjbGFzc2VzIGluIHRoZSBwYWNrYWdlIAorCTx0dD50ZXN0LnNhbXBsZTwvdHQ+IGFuZCB3aWxsIHJldGFpbiBvbmx5IGNsYXNzZXMgdGhhdCBoYXZlIFRlc3RORyBhbm5vdGF0aW9ucy48L3A+CisKK1lvdSBjYW4gYWxzbyBzcGVjaWZ5IGdyb3VwcyBhbmQgbWV0aG9kcyB0byBiZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQ6CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPnRlc3RuZy54bWw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7dGVzdCBuYW1lPSJSZWdyZXNzaW9uMSImZ3Q7CisgICZsdDtncm91cHMmZ3Q7CisgICAgJmx0O3J1biZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9ImJyb2tlblRlc3RzIiAgLyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImNoZWNraW5UZXN0cyIgIC8mZ3Q7CisgICAgJmx0Oy9ydW4mZ3Q7CisgICZsdDsvZ3JvdXBzJmd0OworIAorICAmbHQ7Y2xhc3NlcyZndDsKKyAgICAmbHQ7Y2xhc3MgbmFtZT0idGVzdC5JbmRpdmlkdWFsTWV0aG9kc1Rlc3QiJmd0OworICAgICAgJmx0O21ldGhvZHMmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9InRlc3RNZXRob2QiIC8mZ3Q7CisgICAgICAmbHQ7L21ldGhvZHMmZ3Q7CisgICAgJmx0Oy9jbGFzcyZndDsKKyAgJmx0Oy9jbGFzc2VzJmd0OworJmx0Oy90ZXN0Jmd0OworPC9wcmU+CisKKzxwPllvdSBjYW4gYWxzbyBkZWZpbmUgbmV3IGdyb3VwcyBpbnNpZGUgPHR0PnRlc3RuZy54bWw8L3R0PiBhbmQgc3BlY2lmeSBhZGRpdGlvbmFsIGRldGFpbHMgaW4gYXR0cmlidXRlcywgc3VjaCBhcyB3aGV0aGVyIHRvIHJ1biB0aGUgdGVzdHMgaW4gcGFyYWxsZWwsIGhvdyBtYW55IHRocmVhZHMgdG8gdXNlLCB3aGV0aGVyIHlvdSBhcmUgcnVubmluZyBKVW5pdCB0ZXN0cywgZXRjLi4uJm5ic3A7Cis8cD4KKworQnkgZGVmYXVsdCwgVGVzdE5HIHdpbGwgcnVuIHlvdXIgdGVzdHMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGZvdW5kIGluIHRoZSBYTUwKK2ZpbGUuIElmIHlvdSB3YW50IHRoZSBjbGFzc2VzIGFuZCBtZXRob2RzIGxpc3RlZCBpbiB0aGlzIGZpbGUgdG8gYmUKK3J1biBpbiBhbiB1bnByZWRpY3RpYmxlIG9yZGVyLCBzZXQgdGhlIDx0dD5wcmVzZXJ2ZS1vcmRlcjwvdHQ+CithdHRyaWJ1dGUgdG8gPHR0PmZhbHNlPC90dD4KKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+dGVzdG5nLnhtbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyZsdDt0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24xIiBwcmVzZXJ2ZS1vcmRlcj0iZmFsc2UiJmd0OworICAmbHQ7Y2xhc3NlcyZndDsKKworICAgICZsdDtjbGFzcyBuYW1lPSJ0ZXN0LlRlc3QxIiZndDsKKyAgICAgICZsdDttZXRob2RzJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJtMSIgLyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0ibTIiIC8mZ3Q7CisgICAgICAmbHQ7L21ldGhvZHMmZ3Q7CisgICAgJmx0Oy9jbGFzcyZndDsKKworICAgICZsdDtjbGFzcyBuYW1lPSJ0ZXN0LlRlc3QyIiAvJmd0OworCisgICZsdDsvY2xhc3NlcyZndDsKKyZsdDsvdGVzdCZndDsKKzwvcHJlPgorCis8cD4KKworUGxlYXNlIHNlZSB0aGUgRFREIGZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGZlYXR1cmVzLCBvciByZWFkIG9uLjwvcD4KKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJVTk5JTkcgVEVTVE5HCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworPGgzPjxhIGNsYXNzPSJzZWN0aW9uIiBuYW1lPSJydW5uaW5nLXRlc3RuZyI+UnVubmluZyBUZXN0Tkc8L2E+PC9oMz4KKworVGVzdE5HIGNhbiBiZSBpbnZva2VkIGluIGRpZmZlcmVudCB3YXlzOgorCis8dWw+Cis8bGk+Q29tbWFuZCBsaW5lCis8L2xpPgorPGxpPjxhIGhyZWY9ImFudC5odG1sIj5hbnQ8L2E+Cis8L2xpPgorPGxpPjxhIGhyZWY9ImVjbGlwc2UuaHRtbCI+RWNsaXBzZTwvYT4KKzwvbGk+Cis8bGk+PGEgaHJlZj0iaWRlYS5odG1sIj5JbnRlbGxpSidzIElERUE8L2E+Cis8L2xpPgorPC91bD4KKworVGhpcyBzZWN0aW9uIG9ubHkgZXhwbGFpbnMgaG93IHRvIGludm9rZSBUZXN0TkcgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgUGxlYXNlIGNsaWNrIG9uIG9uZSBvZiB0aGUgbGlua3MgYWJvdmUgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9uZSBvZiB0aGUgb3RoZXIgd2F5cy4KKzxwPgorQXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBUZXN0TkcgaW4geW91ciBjbGFzcyBwYXRoLCB0aGUgc2ltcGxlc3Qgd2F5IHRvIGludm9rZSBUZXN0TkcgaXMgYXMgZm9sbG93czoKKworPHByZSBjbGFzcz0iYnJ1c2g6IHRleHQiPgoramF2YSBvcmcudGVzdG5nLlRlc3RORyB0ZXN0bmcxLnhtbCBbdGVzdG5nMi54bWwgdGVzdG5nMy54bWwgLi4uXQorPC9wcmU+CisKK1lvdSBuZWVkIHRvIHNwZWNpZnkgYXQgbGVhc3Qgb25lIFhNTCBmaWxlIGRlc2NyaWJpbmcgdGhlIFRlc3RORyBzdWl0ZSB5b3UgYXJlIHRyeWluZyB0byBydW4uICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgY29tbWFuZC1saW5lIHN3aXRjaGVzIGFyZSBhdmFpbGFibGU6CisKKzwvcD4KKworPHRhYmxlIGlkPSJjb21tYW5kLWxpbmUiPgorICAgIDxjYXB0aW9uPkNvbW1hbmQgTGluZSBQYXJhbWV0ZXJzPC9jYXB0aW9uPjxjb2xncm91cCBjbGFzcz0ib3B0aW9uIi8+CisgICAgPGNvbGdyb3VwIGNsYXNzPSJhcmd1bWVudCIvPgorICAgIDxjb2xncm91cCBjbGFzcz0iZG9jdW1lbnRhdGlvbiIvPgorICAgIDx0aGVhZD4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+T3B0aW9uPC90aD4KKyAgICAJPHRoPkFyZ3VtZW50PC90aD4KKyAgICAJPHRoPkRvY3VtZW50YXRpb248L3RoPgorICAgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisKKyAgICA8dGJvZHk+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4tY29uZmlnZmFpbHVyZXBvbGljeTwvdGQ+CisJICAgIDx0ZD48dHQ+c2tpcDwvdHQ+fDx0dD5jb250aW51ZTwvdHQ+PC90ZD4KKwkgICAgPHRkPldoZXRoZXIgVGVzdE5HIHNob3VsZCA8dHQ+Y29udGludWU8L3R0PiB0byBleGVjdXRlIHRoZSByZW1haW5pbmcgdGVzdHMgaW4gdGhlIHN1aXRlIG9yIDx0dD5za2lwPC90dD4gdGhlbSBpZgorICAgICAgICAgICAgYW4gQEJlZm9yZSogbWV0aG9kIGZhaWxzLiAgRGVmYXVsdCBiZWhhdmlvciBpcyA8dHQ+c2tpcDwvdHQ+LjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi1kPC90ZD4KKwkgICAgPHRkPkEgZGlyZWN0b3J5PC90ZD4KKwkgICAgPHRkPlRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydHMgd2lsbCBiZSBnZW5lcmF0ZWQgKGRlZmF1bHRzIHRvIDx0dD50ZXN0LW91dHB1dDwvdHQ+KS48L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4tZGF0YXByb3ZpZGVydGhyZWFkY291bnQ8L3RkPgorCSAgICA8dGQ+VGhlIGRlZmF1bHQgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIGZvciBkYXRhCisgICAgICAgICAgICBwcm92aWRlcnMgd2hlbiBydW5uaW5nIHRlc3RzIGluIHBhcmFsbGVsLjwvdGQ+CisJICAgIDx0ZD5UaGlzIHNldHMgdGhlIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAgICAgICAgICAgIGZvciBkYXRhIHByb3ZpZGVycyB3aGVuIHJ1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWwuIEl0IHdpbGwgb25seSB0YWtlIGVmZmVjdCBpZiB0aGUgcGFyYWxsZWwgbW9kZSBoYXMgYmVlbiBzZWxlY3RlZCAoZm9yIGV4YW1wbGUsIHdpdGggdGhlIC1wYXJhbGxlbCBvcHRpb24pLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBzdWl0ZSBkZWZpbml0aW9uLjwvdGQ+CisgICAgICAgIDwvdHI+CisKKwk8dHI+CisgICAgICAgICAgICA8dGQ+LWV4Y2x1ZGVncm91cHM8L3RkPgorCSAgICA8dGQ+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBncm91cHMuPC90ZD48dGQ+VGhlIGxpc3Qgb2YgZ3JvdXBzIHlvdSB3YW50IHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBydW4uPC90ZD4KKyAgICAgICAgPC90cj4KKwkgIAorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LWdyb3VwczwvdGQ+CisJICAgIDx0ZD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGdyb3Vwcy48L3RkPgorCSAgICA8dGQ+VGhlIGxpc3Qgb2YgZ3JvdXBzIHlvdSB3YW50IHRvIHJ1biAoZS5nLiA8dHQ+IndpbmRvd3MsbGludXgscmVncmVzc2lvbiI8L3R0PikuPC90ZD4KKwk8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4tbGlzdGVuZXI8L3RkPgorCSAgICA8dGQ+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBKYXZhIGNsYXNzZXMgdGhhdCBjYW4gYmUgZm91bmQgb24geW91ciBjbGFzc3BhdGguPC90ZD4KKwkgICAgPHRkPkxldHMgeW91IHNwZWNpZnkgeW91ciBvd24gdGVzdCBsaXN0ZW5lcnMuICBUaGUgY2xhc3NlcyBuZWVkIHRvIGltcGxlbWVudCA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lUZXN0TGlzdGVuZXIuaHRtbCI+IDx0dD5vcmcudGVzdG5nLklUZXN0TGlzdGVuZXI8L3R0PjwvYT48L3RkPgorICAgICAgICA8L3RyPgorCisJPHRyPgorICAgICAgICAgICAgPHRkPi1tZXRob2RzPC90ZD4KKwkgICAgPHRkPkEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgYW5kIG1ldGhvZC4gRm9yIGV4YW1wbGUgPHR0PmNvbS5leGFtcGxlLkZvby5mMSxjb20uZXhhbXBsZS5CYXIuZjI8L3R0Pi48L3RkPgorCSAgICA8dGQ+TGV0cyB5b3Ugc3BlY2lmeSBpbmRpdmlkdWFsIG1ldGhvZHMgdG8gcnVuLjwvdHQ+PC9hPjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi1tZXRob2RzZWxlY3RvcnM8L3RkPgorCSAgICA8dGQ+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBKYXZhIGNsYXNzZXMgYW5kIG1ldGhvZAorICAgICAgICAgICAgcHJpb3JpdGllcyB0aGF0IGRlZmluZSBtZXRob2Qgc2VsZWN0b3JzLjwvdGQ+CisJICAgIDx0ZD5MZXRzIHlvdSBzcGVjaWZ5IG1ldGhvZCBzZWxlY3RvcnMgb24gdGhlIGNvbW1hbmQKKyAgICAgICAgICAgIGxpbmUuIEZvciBleGFtcGxlOiA8dHQ+Y29tLmV4YW1wbGUuU2VsZWN0b3IxOjMsY29tLmV4YW1wbGUuU2VsZWN0b3IyOjI8L3R0PjwvdGQ+CisgICAgICAgIDwvdHI+CisKKwk8dHI+CisgICAgICAgICAgICA8dGQ+LXBhcmFsbGVsPC90ZD4KKwkgICAgPHRkPm1ldGhvZHN8dGVzdHN8Y2xhc3NlczwvdGQ+CisJICAgIDx0ZD5JZiBzcGVjaWZpZWQsIHNldHMgdGhlIGRlZmF1bHQgbWVjaGFuaXNtIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byB1c2UgcGFyYWxsZWwgdGhyZWFkcyB3aGVuIHJ1bm5pbmcgdGVzdHMuIElmIG5vdCBzZXQsIGRlZmF1bHQgbWVjaGFuaXNtIGlzIG5vdCB0byB1c2UgcGFyYWxsZWwgdGhyZWFkcyBhdCBhbGwuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIHN1aXRlIGRlZmluaXRpb24uPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LXJlcG9ydGVyPC90ZD4KKwkgICAgPHRkPlRoZSBleHRlbmRlZCBjb25maWd1cmF0aW9uIGZvciBhIGN1c3RvbSByZXBvcnQgbGlzdGVuZXIuPC90ZD4KKwkgICAgPHRkPlNpbWlsYXIgdG8gdGhlIDx0dD4tbGlzdGVuZXI8L3R0PiBvcHRpb24sIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiBKYXZhQmVhbnMtc3R5bGUgcHJvcGVydGllcyBvbiB0aGUgcmVwb3J0ZXIgaW5zdGFuY2UuCisJICAgICAgPGJyPgorICAgICAgICAgICAgRXhhbXBsZTogPHR0Pi1yZXBvcnRlciBjb20udGVzdC5NeVJlcG9ydGVyOm1ldGhvZEZpbHRlcj0qaW5zZXJ0KixlbmFibGVGaWx0ZXJpbmc9dHJ1ZTwvdHQ+CisJICAgICAgPGJyPgorICAgICAgICAgICAgWW91IGNhbiBoYXZlIGFzIG1hbnkgb2NjdXJlbmNlcyBvZiB0aGlzIG9wdGlvbiwgb25lIGZvciBlYWNoIHJlcG9ydGVyIHRoYXQgbmVlZHMgdG8gYmUgYWRkZWQuPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LXNvdXJjZWRpcjwvdGQ+CisgICAgCSAgICA8dGQ+QSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzLjwvdGQ+CisgICAgICAgICAgICA8dGQ+VGhlIGRpcmVjdG9yaWVzIHdoZXJlIHlvdXIgamF2YWRvYyBhbm5vdGF0ZWQgdGVzdCBzb3VyY2VzIGFyZS4gVGhpcyBvcHRpb24gaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IGFyZSB1c2luZyBqYXZhZG9jIHR5cGUgYW5ub3RhdGlvbnMuIChlLmcuIDx0dD4ic3JjL3Rlc3QiPC90dD4gb3IgPHR0PiJzcmMvdGVzdC9vcmcvdGVzdG5nL2VjbGlwc2UtcGx1Z2luO3NyYy90ZXN0L29yZy90ZXN0bmcvdGVzdG5nIjwvdHQ+KS48L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+LXN1aXRlbmFtZTwvdGQ+CisJICAgPHRkPlRoZSBkZWZhdWx0IG5hbWUgdG8gdXNlIGZvciBhIHRlc3Qgc3VpdGUuPC90ZD4KKwkgICA8dGQ+VGhpcyBzcGVjaWZpZXMgdGhlIHN1aXRlIG5hbWUgZm9yIGEgdGVzdCBzdWl0ZSBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgdGhlIHN1aXRlLnhtbCBmaWxlIG9yIHRoZSBzb3VyY2UgY29kZSBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgc3VpdGUgbmFtZS4gIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIHN1aXRlIG5hbWUgd2l0aCBzcGFjZXMgaW4gaXQgaWYgeW91IHN1cnJvdW5kIGl0IHdpdGggZG91YmxlLXF1b3RlcyAibGlrZSB0aGlzIi48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICAKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi10ZXN0Y2xhc3M8L3RkPgorCSAgICA8dGQ+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHRoYXQgY2FuIGJlIGZvdW5kIGluIHlvdXIgY2xhc3NwYXRoLjwvdGQ+PHRkPkEgbGlzdCBvZiBjbGFzcyBmaWxlcyBzZXBhcmF0ZWQgYnkgY29tbWFzIChlLmcuIDx0dD4ib3JnLmZvby5UZXN0MSxvcmcuZm9vLnRlc3QyIjwvdHQ+KS48L3RkPgorCTwvdHI+CisKKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4tdGVzdGphcjwvdGQ+CisJICAgIDx0ZD5BIGphciBmaWxlLjwvdGQ+CisJICAgIDx0ZD5TcGVjaWZpZXMgYSBqYXIgZmlsZSB0aGF0IGNvbnRhaW5zIHRlc3QgY2xhc3Nlcy4gIElmIGEgPHR0PnRlc3RuZy54bWw8L3R0PiBmaWxlIGlzIGZvdW5kIGF0IHRoZSByb290IG9mIHRoYXQgamFyIGZpbGUsIGl0IHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlLCBhbGwgdGhlIHRlc3QgY2xhc3NlcyBmb3VuZCBpbiB0aGlzIGphciBmaWxlIHdpbGwgYmUgY29uc2lkZXJlZCB0ZXN0IGNsYXNzZXMuPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LXRlc3RuYW1lPC90ZD4KKwkgICAgPHRkPlRoZSBkZWZhdWx0IG5hbWUgdG8gdXNlIGZvciBhIHRlc3QuPC90ZD4KKwkgICAgPHRkPlRoaXMgc3BlY2lmaWVzIHRoZSBuYW1lIGZvciBhIHRlc3QgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBzdWl0ZS54bWwgZmlsZSBvciB0aGUgc291cmNlIGNvZGUgc3BlY2lmaWVzIGEgZGlmZmVyZW50IHRlc3QgbmFtZS4gSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdGVzdCBuYW1lIHdpdGggc3BhY2VzIGluIGl0IGlmIHlvdSBzdXJyb3VuZCBpdCB3aXRoIGRvdWJsZS1xdW90ZXMgImxpa2UgdGhpcyIuPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LXRlc3RuYW1lczwvdGQ+CisJICAgIDx0ZD5BIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRlc3QgbmFtZXMuPC90ZD4KKwkgICAgPHRkPk9ubHkgdGVzdHMgZGVmaW5lZCBpbiBhICZsdDt0ZXN0Jmd0OyB0YWcgbWF0Y2hpbmcgb25lIG9mIHRoZXNlIG5hbWVzIHdpbGwgYmUgcnVuLjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi10ZXN0cnVuZmFjdG9yeTwvdGQ+CisJICAgIDx0ZD5BIEphdmEgY2xhc3NlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiB5b3VyIGNsYXNzcGF0aC48L3RkPgorCSAgICA8dGQ+TGV0cyB5b3Ugc3BlY2lmeSB5b3VyIG93biB0ZXN0IHJ1bm5lcnMuICBUaGUgY2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50IDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSVRlc3RSdW5uZXJGYWN0b3J5Lmh0bWwiPiA8dHQ+b3JnLnRlc3RuZy5JVGVzdFJ1bm5lckZhY3Rvcnk8L3R0PjwvYT4uPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+LXRocmVhZGNvdW50PC90ZD4KKwkgICAgPHRkPlRoZSBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWwuPC90ZD4KKwkgICAgPHRkPlRoaXMgc2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHVzZSBmb3IgcnVubmluZyB0ZXN0cyBpbiBwYXJhbGxlbC4gSXQgd2lsbCBvbmx5IHRha2UgZWZmZWN0IGlmIHRoZSBwYXJhbGxlbCBtb2RlIGhhcyBiZWVuIHNlbGVjdGVkIChmb3IgZXhhbXBsZSwgd2l0aCB0aGUgLXBhcmFsbGVsIG9wdGlvbikuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIHN1aXRlIGRlZmluaXRpb24uPC90ZD4KKyAgICAgICAgPC90cj4KKworCTx0cj4KKyAgICAgICAgICAgIDx0ZD4teG1scGF0aGluamFyPC90ZD4KKwkgICAgPHRkPlRoZSBwYXRoIG9mIHRoZSBYTUwgZmlsZSBpbnNpZGUgdGhlIGphciBmaWxlLjwvdGQ+CisJICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBzaG91bGQgY29udGFpbiB0aGUgcGF0aCB0byBhIHZhbGlkIFhNTCBmaWxlIGluc2lkZSB0aGUgdGVzdCBqYXIgKGUuZy4gPHR0PiJyZXNvdXJjZXMvdGVzdG5nLnhtbCI8L3R0PikuIFRoZSBkZWZhdWx0IGlzIDx0dD4idGVzdG5nLnhtbCI8L3R0Piwgd2hpY2ggbWVhbnMgYSBmaWxlIGNhbGxlZCAiPHR0PnRlc3RuZy54bWw8L3R0PiIgYXQgdGhlIHJvb3Qgb2YgdGhlIGphciBmaWxlLiBUaGlzIG9wdGlvbiB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIDx0dD4tdGVzdGphcjwvdHQ+IGlzIHNwZWNpZmllZC48L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+CisKK1RoaXMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgb2J0YWluZWQgYnkgaW52b2tpbmcgVGVzdE5HIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4KKworPHA+CisKK1lvdSBjYW4gYWxzbyBwdXQgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBpbiBhIHRleHQgZmlsZSwgc2F5IDx0dD5jOlxjb21tYW5kLnR4dDwvdHQ+LCBhbmQgdGVsbCBUZXN0TkcgdG8gdXNlIHRoYXQgZmlsZSB0byByZXRyaWV2ZSBpdHMgcGFyYW1ldGVyczoKKworPHByZSBjbGFzcz0iYnJ1c2g6IHRleHQiPgorICBDOj4gbW9yZSBjOlxjb21tYW5kLnR4dAorICAtZCB0ZXN0LW91dHB1dCB0ZXN0bmcueG1sCisgIEM6PiBqYXZhIG9yZy50ZXN0bmcuVGVzdE5HIEBjOlxjb21tYW5kLnR4dAorPC9wcmU+CisKKzxwPgorCitBZGRpdGlvbmFsbHksIFRlc3RORyBjYW4gYmUgcGFzc2VkIHByb3BlcnRpZXMgb24gdGhlIGNvbW1hbmQgbGluZSBvZiB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsIGZvciBleGFtcGxlCisKKzxwcmUgY2xhc3M9ImJydXNoOiB0ZXh0Ij4KK2phdmEgLUR0ZXN0bmcudGVzdC5jbGFzc3BhdGg9ImM6L2J1aWxkO2M6L2phdmEvY2xhc3NlczsiIG9yZy50ZXN0bmcuVGVzdE5HIHRlc3RuZy54bWwKKzwvcHJlPgorCitIZXJlIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IFRlc3RORyB1bmRlcnN0YW5kczoKKworPHRhYmxlIGlkPSJzeXN0ZW09cHJvcGVydGllcyI+CisgICAgPGNhcHRpb24+U3lzdGVtIHByb3BlcnRpZXM8L2NhcHRpb24+CisgICAgPGNvbGdyb3VwIGNsYXNzPSJvcHRpb24iLz4KKyAgICA8Y29sZ3JvdXAgY2xhc3M9InR5cGUiLz4KKyAgICA8Y29sZ3JvdXAgY2xhc3M9ImRvY3VtZW50YXRpb24iLz4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+PHRoPlByb3BlcnR5PC90aD4KKyAgICAgIDx0aD5UeXBlPC90aD4KKyAgICAgIDx0aD5Eb2N1bWVudGF0aW9uPC90aD48L3RyPgorICAgIDwvdGhlYWQ+CisKKyAgICA8dHI+CisgICAgPHRkPnRlc3RuZy50ZXN0LmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPkEgc2VtaS1jb2xvbiBzZXBhcmF0ZWQgc2VyaWVzIG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiB5b3VyIHRlc3QgY2xhc3Nlcy48L3RkPgorICAgIDx0ZD5JZiB0aGlzIHByb3BlcnR5IGlzIHNldCwgVGVzdE5HIHdpbGwgdXNlIGl0IHRvIGxvb2sgZm9yIHlvdXIgdGVzdCBjbGFzc2VzIGluc3RlYWQgb2YgdGhlIGNsYXNzIHBhdGguICBUaGlzIGlzIGNvbnZlbmllbnQgaWYgeW91IGFyZSB1c2luZyB0aGUgPHR0PnBhY2thZ2U8L3R0PiB0YWcgaW4geW91ciBYTUwgZmlsZSBhbmQgeW91IGhhdmUgYSBsb3Qgb2YgY2xhc3NlcyBpbiB5b3VyIGNsYXNzcGF0aCwgbW9zdCBvZiB0aGVtIG5vdCBiZWluZyB0ZXN0IGNsYXNzZXMuCisgICAgPC90cj4KKzwvdGFibGU+CisKKzxicj4KKworPGI+RXhhbXBsZTo8L2I+CisKKzxwcmUgY2xhc3M9ImJydXNoOiB0ZXh0Ij4KK2phdmEgb3JnLnRlc3RuZy5UZXN0TkcgLWdyb3VwcyB3aW5kb3dzLGxpbnV4IC10ZXN0Y2xhc3Mgb3JnLnRlc3QuTXlUZXN0Cis8L3ByZT4KKworVGhlIDxhIGhyZWY9ImFudC5odG1sIj5hbnQgdGFzazwvYT4gYW5kIDxhIGhyZWY9IiN0ZXN0bmcteG1sIj50ZXN0bmcueG1sPC9hPiBhbGxvdyB5b3UgdG8gbGF1bmNoIFRlc3RORyB3aXRoIG1vcmUgcGFyYW1ldGVycyAobWV0aG9kcyB0byBpbmNsdWRlLCBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMsIGV0Yy4uLiksIHNvIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBvbmx5IHdoZW4geW91IGFyZSB0cnlpbmcgdG8gbGVhcm4gYWJvdXQgVGVzdE5HIGFuZCB5b3Ugd2FudCB0byBnZXQgdXAgYW5kIHJ1bm5pbmcgcXVpY2tseS4KKworPHA+CisKKzxlbT5JbXBvcnRhbnQ8L2VtPjogVGhlIGNvbW1hbmQgbGluZSBmbGFncyB0aGF0IHNwZWNpZnkgd2hhdCB0ZXN0cyBzaG91bGQgYmUgcnVuIHdpbGwgYmUgaWdub3JlZCBpZiB5b3UgYWxzbyBzcGVjaWZ5IGEgPHR0PnRlc3RuZy54bWw8L3R0PiBmaWxlLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgPHR0Pi1pbmNsdWRlZGdyb3VwczwvdHQ+IGFuZCA8dHQ+LWV4Y2x1ZGVkZ3JvdXBzPC90dD4sIHdoaWNoIHdpbGwgb3ZlcnJpZGUgYWxsIHRoZSBncm91cCBpbmNsdXNpb25zL2V4Y2x1c2lvbnMgZm91bmQgaW4gPHR0PnRlc3RuZy54bWw8L3R0Pi4KKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1FVEhPRFMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCis8aDM+PGEgY2xhc3M9InNlY3Rpb24iIG5hbWU9Im1ldGhvZHMiPlRlc3QgbWV0aG9kcywgVGVzdCBjbGFzc2VzIGFuZCBUZXN0IGdyb3VwczwvYT48L2gzPgorCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9InRlc3QtbWV0aG9kcyI+VGVzdCBtZXRob2RzPC9hPjwvaDQ+CisKK1Rlc3QgbWV0aG9kcyBhcmUgYW5ub3RhdGVkIHdpdGggPHR0PkBUZXN0PC90dD4uIE1ldGhvZHMgYW5ub3RhdGVkIHdpdGggPHR0PkBUZXN0PC90dD4gdGhhdCBoYXBwZW4gdG8gcmV0dXJuIGEgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLCB1bmxlc3MgeW91IHNldCA8dHQ+YWxsb3ctcmV0dXJuLXZhbHVlczwvdHQ+IHRvIDx0dD50cnVlPC90dD4gaW4geW91ciA8dHQ+dGVzdG5nLnhtbDwvdHQ+OgorCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyZsdDtzdWl0ZSBhbGxvdy1yZXR1cm4tdmFsdWVzPSJ0cnVlIiZndDsKKworb3IKKworJmx0O3Rlc3QgYWxsb3ctcmV0dXJuLXZhbHVlcz0idHJ1ZSImZ3Q7Cis8L3ByZT4KKworCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9InRlc3QtZ3JvdXBzIj5UZXN0IGdyb3VwczwvYT48L2g0PgorCis8cD4KKworVGVzdE5HIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBzb3BoaXN0aWNhdGVkIGdyb3VwaW5ncyBvZiB0ZXN0IG1ldGhvZHMuIE5vdCAKK29ubHkgY2FuIHlvdSBkZWNsYXJlIHRoYXQgbWV0aG9kcyBiZWxvbmcgdG8gZ3JvdXBzLCBidXQgeW91IGNhbiBhbHNvIHNwZWNpZnkgCitncm91cHMgdGhhdCBjb250YWluIG90aGVyIGdyb3Vwcy4gVGhlbiBUZXN0TkcgY2FuIGJlIGludm9rZWQgYW5kIGFza2VkIHRvIAoraW5jbHVkZSBhIGNlcnRhaW4gc2V0IG9mIGdyb3VwcyAob3IgcmVndWxhciBleHByZXNzaW9ucykgd2hpbGUgZXhjbHVkaW5nIGFub3RoZXIgCitzZXQuJm5ic3A7IFRoaXMgZ2l2ZXMgeW91IG1heGltdW0gZmxleGliaWxpdHkgaW4gaG93IHlvdSBwYXJ0aXRpb24geW91ciB0ZXN0cyAKK2FuZCBkb2Vzbid0IHJlcXVpcmUgeW91IHRvIHJlY29tcGlsZSBhbnl0aGluZyBpZiB5b3Ugd2FudCB0byBydW4gdHdvIGRpZmZlcmVudCAKK3NldHMgb2YgdGVzdHMgYmFjayB0byBiYWNrLjwvcD4KKworPHA+CitHcm91cHMgYXJlIHNwZWNpZmllZCBpbiB5b3VyIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZSBhbmQgY2FuIGJlIGZvdW5kIGVpdGhlciB1bmRlciB0aGUgPHR0PiZsdDt0ZXN0Jmd0OzwvdHQ+IG9yIDx0dD4mbHQ7c3VpdGUmZ3Q7PC90dD4gdGFnLiBHcm91cHMgc3BlY2lmaWVkIGluIHRoZSA8dHQ+Jmx0O3N1aXRlJmd0OzwvdHQ+IHRhZyBhcHBseSB0byBhbGwgdGhlIDx0dD4mbHQ7dGVzdCZndDs8L3R0PiB0YWdzIHVuZGVybmVhdGguIE5vdGUgdGhhdCBncm91cHMgYXJlIGFjY3VtdWxhdGl2ZSBpbiB0aGVzZSB0YWdzOiBpZiB5b3Ugc3BlY2lmeSBncm91cCAiYSIgaW4gPHR0PiZsdDtzdWl0ZSZndDs8L3R0PiBhbmQgImIiIGluIDx0dD4mbHQ7dGVzdCZndDs8L3R0PiwgdGhlbiBib3RoICJhIiBhbmQgImIiIHdpbGwgYmUgaW5jbHVkZWQuCisKKzxwPgorCis8cD5Gb3IgZXhhbXBsZSwgaXQgaXMgcXVpdGUgY29tbW9uIHRvIGhhdmUgYXQgbGVhc3QgdHdvIGNhdGVnb3JpZXMgb2YgdGVzdHM8L3A+PHVsPgorICA8bGk+Q2hlY2staW4gdGVzdHMuJm5ic3A7IFRoZXNlIHRlc3RzIHNob3VsZCBiZSBydW4gYmVmb3JlIHlvdSBzdWJtaXQgbmV3IAorCWNvZGUuJm5ic3A7IFRoZXkgc2hvdWxkIHR5cGljYWxseSBiZSBmYXN0IGFuZCBqdXN0IG1ha2Ugc3VyZSBubyBiYXNpYyAKKwlmdW5jdGlvbmFsaXR5IHdhcyBicm9rZW4uPGJyPgorJm5ic3A7PC9saT4KKyAgPGxpPkZ1bmN0aW9uYWwgdGVzdHMuJm5ic3A7IFRoZXNlIHRlc3RzIHNob3VsZCBjb3ZlciBhbGwgdGhlIGZ1bmN0aW9uYWxpdGllcyAKKwlvZiB5b3VyIHNvZnR3YXJlIGFuZCBiZSBydW4gYXQgbGVhc3Qgb25jZSBhIGRheSwgYWx0aG91Z2ggaWRlYWxseSB5b3Ugd291bGQgCisJd2FudCB0byBydW4gdGhlbSBjb250aW51b3VzbHkuPC9saT48L3VsPgorCisKKwlUeXBpY2FsbHksIGNoZWNrLWluIHRlc3RzIGFyZSBhIHN1YnNldCBvZiBmdW5jdGlvbmFsIHRlc3RzLiZuYnNwOyBUZXN0TkcgCithbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhpcyBpbiBhIHZlcnkgaW50dWl0aXZlIHdheSB3aXRoIHRlc3QgZ3JvdXBzLiZuYnNwOyBGb3IgCitleGFtcGxlLCB5b3UgY291bGQgc3RydWN0dXJlIHlvdXIgdGVzdCBieSBzYXlpbmcgdGhhdCB5b3VyIGVudGlyZSB0ZXN0IGNsYXNzIAorYmVsb25ncyB0byB0aGUgJnF1b3Q7ZnVuY3Rlc3QmcXVvdDsgZ3JvdXAsIGFuZCBhZGRpdGlvbmFsbHkgdGhhdCBhIGNvdXBsZSBvZiBtZXRob2RzIAorYmVsb25nIHRvIHRoZSBncm91cCAmcXVvdDtjaGVja2ludGVzdCZxdW90OzoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+VGVzdDEuamF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgY2xhc3MgVGVzdDEgeworICBAVGVzdChncm91cHMgPSB7ICJmdW5jdGVzdCIsICJjaGVja2ludGVzdCIgfSkKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEoKSB7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ImZ1bmN0ZXN0IiwgImNoZWNraW50ZXN0In0gKQorICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMigpIHsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgImZ1bmN0ZXN0IiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMygpIHsKKyAgfQorfQorPC9wcmU+CisKK0ludm9raW5nIFRlc3RORyB3aXRoCisJPGJyPgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj50ZXN0bmcueG1sPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3Rlc3QgbmFtZT0iVGVzdDEiJmd0OworICAmbHQ7Z3JvdXBzJmd0OworICAgICZsdDtydW4mZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJmdW5jdGVzdCIvJmd0OworICAgICZsdDsvcnVuJmd0OworICAmbHQ7L2dyb3VwcyZndDsKKyAgJmx0O2NsYXNzZXMmZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9ImV4YW1wbGUxLlRlc3QxIi8mZ3Q7CisgICZsdDsvY2xhc3NlcyZndDsKKyZsdDsvdGVzdCZndDsKKzwvcHJlPgorCis8cD53aWxsIHJ1biBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGF0IGNsYXNzZXMsIHdoaWxlIGludm9raW5nIGl0IHdpdGggPHR0PmNoZWNraW50ZXN0PC90dD4gd2lsbCBvbmx5IHJ1biAKKzx0dD50ZXN0TWV0aG9kMSgpPC90dD4gYW5kIDx0dD50ZXN0TWV0aG9kMigpPC90dD4uPC9wPgorCisKK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlLCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHRoaXMgdGltZS4mbmJzcDsgQXNzdW1lIAordGhhdCBzb21lIG9mIHlvdXIgdGVzdCBtZXRob2RzIHNob3VsZCBub3QgYmUgcnVuIG9uIExpbnV4LCB5b3VyIHRlc3Qgd291bGQgbG9vayAKK2xpa2U6CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPlRlc3QxLmphdmE8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQFRlc3QKK3B1YmxpYyBjbGFzcyBUZXN0MSB7CisgIEBUZXN0KGdyb3VwcyA9IHsgIndpbmRvd3MuY2hlY2tpbnRlc3QiIH0pIAorICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c09ubHkoKSB7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ImxpbnV4LmNoZWNraW50ZXN0In0gKQorICBwdWJsaWMgdm9pZCB0ZXN0TGludXhPbmx5KCkgeworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAid2luZG93cy5mdW5jdGVzdCIgKQorICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c1RvbygpIHsKKyAgfQorfQorPC9wcmU+CisKKworWW91IGNvdWxkIHVzZSB0aGUgZm9sbG93aW5nIHRlc3RuZy54bWwgdG8gbGF1bmNoIG9ubHkgdGhlIFdpbmRvd3MgbWV0aG9kczoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+dGVzdG5nLnhtbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogeG1sOyBoaWdobGlnaHQ6IFs0LDldIj4KKyZsdDt0ZXN0IG5hbWU9IlRlc3QxIiZndDsKKyAgJmx0O2dyb3VwcyZndDsKKyAgICAmbHQ7cnVuJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0id2luZG93cy4qIi8mZ3Q7CisgICAgJmx0Oy9ydW4mZ3Q7CisgICZsdDsvZ3JvdXBzJmd0OworCisgICZsdDtjbGFzc2VzJmd0OworICAgICZsdDtjbGFzcyBuYW1lPSJleGFtcGxlMS5UZXN0MSIvJmd0OworICAmbHQ7L2NsYXNzZXMmZ3Q7CismbHQ7L3Rlc3QmZ3Q7Cis8L3ByZT4KKworPGJsb2NrcXVvdGU+Cis8ZW0+Tm90ZTogIFRlc3RORyB1c2VzIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uIj5yZWd1bGFyIGV4cHJlc3Npb25zPC9hPiwgYW5kIG5vdCA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbGRtYXQiPndpbGRtYXRzPC9hPi4gIEJlIGF3YXJlIG9mIHRoZSBkaWZmZXJlbmNlIChmb3IgZXhhbXBsZSwgImFueXRoaW5nIiBpcyBtYXRjaGVkIGJ5ICIuKiIgLS0gZG90IHN0YXIgLS0gYW5kIG5vdCAiKiIpLjwvZW0+Cis8L2Jsb2NrcXVvdGU+CisKKzxoND48YSBuYW1lPSJtZXRob2QtZ3JvdXBzIj5NZXRob2QgZ3JvdXBzPC9hPjwvaDQ+CisKK1lvdSBjYW4gYWxzbyBleGNsdWRlIG9yIGluY2x1ZGUgaW5kaXZpZHVhbCBtZXRob2RzOgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj50ZXN0bmcueG1sPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3Rlc3QgbmFtZT0iVGVzdDEiJmd0OworICAmbHQ7Y2xhc3NlcyZndDsKKyAgICAmbHQ7Y2xhc3MgbmFtZT0iZXhhbXBsZTEuVGVzdDEiJmd0OworICAgICAgJmx0O21ldGhvZHMmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9Ii4qZW5hYmxlZFRlc3RNZXRob2QuKiIvJmd0OworICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIuKmJyb2tlblRlc3RNZXRob2QuKiIvJmd0OworICAgICAgJmx0Oy9tZXRob2RzJmd0OworICAgICAmbHQ7L2NsYXNzJmd0OworICAmbHQ7L2NsYXNzZXMmZ3Q7CismbHQ7L3Rlc3QmZ3Q7Cis8L3ByZT4KKworVGhpcyBjYW4gY29tZSBpbiBoYW5keSB0byBkZWFjdGl2YXRlIGEgc2luZ2xlIG1ldGhvZCB3aXRob3V0IGhhdmluZyB0byByZWNvbXBpbGUgCithbnl0aGluZywgYnV0IEkgZG9uJ3QgcmVjb21tZW5kIHVzaW5nIHRoaXMgdGVjaG5pcXVlIHRvbyBtdWNoIHNpbmNlIGl0IG1ha2VzIAoreW91ciB0ZXN0aW5nIGZyYW1ld29yayBsaWtlbHkgdG8gYnJlYWsgaWYgeW91IHN0YXJ0IHJlZmFjdG9yaW5nIHlvdXIgSmF2YSBjb2RlIAorKHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgaW4gdGhlIHRhZ3MgbWlnaHQgbm90IG1hdGNoIHlvdXIgbWV0aG9kcyBhbnkgCittb3JlKS4KKworCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9Imdyb3Vwcy1vZi1ncm91cHMiPkdyb3VwcyBvZiBncm91cHM8L2E+PC9oND4KKworR3JvdXBzIGNhbiBhbHNvIGluY2x1ZGUgb3RoZXIgZ3JvdXBzLiZuYnNwO1RoZXNlIGdyb3VwcyBhcmUgY2FsbGVkICZxdW90O01ldGFHcm91cHMmcXVvdDsuJm5ic3A7IAorRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIGRlZmluZSBhIGdyb3VwICZxdW90O2FsbCZxdW90OyB0aGF0IGluY2x1ZGVzICZxdW90O2NoZWNraW50ZXN0JnF1b3Q7IAorYW5kICZxdW90O2Z1bmN0ZXN0JnF1b3Q7LiZuYnNwOyAmcXVvdDtmdW5jdGVzdCZxdW90OyBpdHNlbGYgd2lsbCBjb250YWluIHRoZSBncm91cHMgJnF1b3Q7d2luZG93cyZxdW90OyBhbmQgCismcXVvdDtsaW51eCZxdW90OyB3aGlsZSAmcXVvdDtjaGVja2ludGVzdCB3aWxsIG9ubHkgY29udGFpbiAmcXVvdDt3aW5kb3dzJnF1b3Q7LiZuYnNwOyBIZXJlIGlzIGhvdyB5b3UgCit3b3VsZCBkZWZpbmUgdGhpcyBpbiB5b3VyIHByb3BlcnR5IGZpbGU6CisKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+dGVzdG5nLnhtbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyZsdDt0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24xIiZndDsKKyAgJmx0O2dyb3VwcyZndDsKKyAgICAmbHQ7ZGVmaW5lIG5hbWU9ImZ1bmN0ZXN0IiZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IndpbmRvd3MiLyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImxpbnV4Ii8mZ3Q7CisgICAgJmx0Oy9kZWZpbmUmZ3Q7CisgCisgICAgJmx0O2RlZmluZSBuYW1lPSJhbGwiJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iZnVuY3Rlc3QiLyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImNoZWNraW50ZXN0Ii8mZ3Q7CisgICAgJmx0Oy9kZWZpbmUmZ3Q7CisgCisgICAgJmx0O3J1biZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImFsbCIvJmd0OworICAgICZsdDsvcnVuJmd0OworICAmbHQ7L2dyb3VwcyZndDsKKyAKKyAgJmx0O2NsYXNzZXMmZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9InRlc3Quc2FtcGxlLlRlc3QxIi8mZ3Q7CisgICZsdDsvY2xhc3NlcyZndDsKKyZsdDsvdGVzdCZndDsKKzwvcHJlPgorCis8L3A+PCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEVYQ0xVU0lPTgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0iZXhjbHVzaW9ucyI+RXhjbHVzaW9uIGdyb3VwczwvYT48L2g0PgorCis8cD5UZXN0TkcgYWxsb3dzIHlvdSB0byBpbmNsdWRlIGdyb3VwcyBhcyB3ZWxsIGFzIGV4Y2x1ZGUgdGhlbS48L3A+CisKKworRm9yIGV4YW1wbGUsIGl0IGlzIHF1aXRlIHVzdWFsIHRvIGhhdmUgdGVzdHMgdGhhdCB0ZW1wb3JhcmlseSBicmVhayBiZWNhdXNlIAorb2YgYSByZWNlbnQgY2hhbmdlLCBhbmQgeW91IGRvbid0IGhhdmUgdGltZSB0byBmaXggdGhlIGJyZWFrYWdlIHlldC4mbmJzcDsgNAorSG93ZXZlciwgeW91IGRvIHdhbnQgdG8gaGF2ZSBjbGVhbiBydW5zIG9mIHlvdXIgZnVuY3Rpb25hbCB0ZXN0cywgc28geW91IG5lZWQgdG8gCitkZWFjdGl2YXRlIHRoZXNlIHRlc3RzIGJ1dCBrZWVwIGluIG1pbmQgdGhleSB3aWxsIG5lZWQgdG8gYmUgcmVhY3RpdmF0ZWQuPC9wPjxwPkEgc2ltcGxlIHdheSB0byBzb2x2ZSB0aGlzIHByb2JsZW0gaXMgdG8gY3JlYXRlIGEgZ3JvdXAgY2FsbGVkICZxdW90O2Jyb2tlbiZxdW90OyBhbmQgCittYWtlIHRoZXNlIHRlc3QgbWV0aG9kcyBiZWxvbmcgdG8gaXQuJm5ic3A7IEZvciBleGFtcGxlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgSSAKK2tub3cgdGhhdCB0ZXN0TWV0aG9kMigpIGlzIG5vdyBicm9rZW4gc28gSSB3YW50IHRvIGRpc2FibGUgaXQ6CisKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+SmF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitAVGVzdChncm91cHMgPSB7ImNoZWNraW50ZXN0IiwgImJyb2tlbiJ9ICkKK3B1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgeworfQorPC9wcmU+CisKK0FsbCBJIG5lZWQgdG8gZG8gbm93IGlzIHRvIGV4Y2x1ZGUgdGhpcyBncm91cCBmcm9tIHRoZSBydW46CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPnRlc3RuZy54bWw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbDsgaGlnaGxpZ2h0OiA1Ij4KKyZsdDt0ZXN0IG5hbWU9IlNpbXBsZSBleGFtcGxlIiZndDsKKyAgJmx0O2dyb3VwcyZndDsKKyAgICAmbHQ7cnVuJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iY2hlY2tpbnRlc3QiLyZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9ImJyb2tlbiIvJmd0OworICAgICZsdDsvcnVuJmd0OworICAmbHQ7L2dyb3VwcyZndDsKKyAKKyAgJmx0O2NsYXNzZXMmZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9ImV4YW1wbGUxLlRlc3QxIi8mZ3Q7CisgICZsdDsvY2xhc3NlcyZndDsKKyZsdDsvdGVzdCZndDsKKzwvcHJlPgorCis8cD5UaGlzIHdheSwgSSB3aWxsIGdldCBhIGNsZWFuIHRlc3QgcnVuIHdoaWxlIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCB0ZXN0cyBhcmUgCiticm9rZW4gYW5kIG5lZWQgdG8gYmUgZml4ZWQgbGF0ZXIuPC9wPgorCis8YmxvY2txdW90ZT4KKwk8cD48aT5Ob3RlOiZuYnNwOyB5b3UgY2FuIGFsc28gZGlzYWJsZSB0ZXN0cyBvbiBhbiBpbmRpdmlkdWFsIGJhc2lzIGJ5IHVzaW5nIHRoZSAKKyZxdW90O2VuYWJsZWQmcXVvdDsgcHJvcGVydHkgYXZhaWxhYmxlIG9uIGJvdGggQFRlc3QgYW5kIEBCZWZvcmUvQWZ0ZXIKKwlhbm5vdGF0aW9ucy48L2k+PC9wPgorPC9ibG9ja3F1b3RlPgorCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQQVJUSUFMIEdST1VQUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0icGFydGlhbC1ncm91cHMiPlBhcnRpYWwgZ3JvdXBzPC9hPjwvaDQ+CisKK1lvdSBjYW4gZGVmaW5lICBncm91cHMgYXQgdGhlIGNsYXNzIGxldmVsIGFuZCB0aGVuIGFkZCBncm91cHMgYXQgdGhlIG1ldGhvZCBsZXZlbDoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+QWxsLmphdmE8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQFRlc3QoZ3JvdXBzID0geyAiY2hlY2tpbi10ZXN0IiB9KQorcHVibGljIGNsYXNzIEFsbCB7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiZnVuYy10ZXN0IiApCisgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7IC4uLiB9CisKKyAgcHVibGljIHZvaWQgbWV0aG9kMigpIHsgLi4uIH0KK30KKzwvcHJlPgorCitJbiB0aGlzIGNsYXNzLCBtZXRob2QyKCkgaXMgcGFydCBvZiB0aGUgZ3JvdXAgJnF1b3Q7Y2hlY2tpbi10ZXN0JnF1b3Q7LCB3aGljaCBpcyBkZWZpbmVkIAorYXQgdGhlIGNsYXNzIGxldmVsLCB3aGlsZSBtZXRob2QxKCkgYmVsb25ncyB0byBib3RoICZxdW90O2NoZWNraW4tdGVzdCZxdW90OyBhbmQgCismcXVvdDtmdW5jLXRlc3QmcXVvdDsuCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBQQVJBTUVURVJTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJwYXJhbWV0ZXJzIj5QYXJhbWV0ZXJzPC9hPjwvaDQ+CisKKzxwPgorCisKK1Rlc3QgbWV0aG9kcyBkb24ndCBoYXZlIHRvIGJlIHBhcmFtZXRlcmxlc3MuJm5ic3A7IFlvdSBjYW4gdXNlIGFuIGFyYml0cmFyeSAKK251bWJlciBvZiBwYXJhbWV0ZXJzIG9uIGVhY2ggb2YgeW91ciB0ZXN0IG1ldGhvZCwgYW5kIHlvdSBpbnN0cnVjdCBUZXN0TkcgdG8gCitwYXNzIHlvdSB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIHdpdGggdGhlIDx0dD5AUGFyYW1ldGVyczwvdHQ+IGFubm90YXRpb24uPC9wPjxwPgorCisKK1RoZXJlIGFyZSB0d28gd2F5cyB0byBzZXQgdGhlc2UgcGFyYW1ldGVyczombmJzcDsgd2l0aCA8dHQ+dGVzdG5nLnhtbDwvdHQ+IG9yIAorcHJvZ3JhbW1hdGljYWxseS48L3A+CisKKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0icGFyYW1ldGVycy10ZXN0bmcteG1sIj5QYXJhbWV0ZXJzIGZyb20gPHR0PnRlc3RuZy54bWw8L3R0PjwvYT48L2g1PgorCisKK0lmIHlvdSBhcmUgdXNpbmcgc2ltcGxlIHZhbHVlcyBmb3IgeW91ciBwYXJhbWV0ZXJzLCB5b3UgY2FuIHNwZWNpZnkgdGhlbSBpbiB5b3VyIAorPHR0PnRlc3RuZy54bWw8L3R0PjoKKworCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj5KYXZhPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BQYXJhbWV0ZXJzKHsgImZpcnN0LW5hbWUiIH0pCitAVGVzdAorcHVibGljIHZvaWQgdGVzdFNpbmdsZVN0cmluZyhTdHJpbmcgZmlyc3ROYW1lKSB7IAorICBTeXN0ZW0ub3V0LnByaW50bG4oIkludm9rZWQgdGVzdFN0cmluZyAiICsgZmlyc3ROYW1lKTsKKyAgYXNzZXJ0ICJDZWRyaWMiLmVxdWFscyhmaXJzdE5hbWUpOworfQorPC9wcmU+CisKK0luIHRoaXMgY29kZSwgd2Ugc3BlY2lmeSB0aGF0IHRoZSBwYXJhbWV0ZXIgPHR0PmZpcnN0TmFtZTwvdHQ+IG9mIHlvdXIgSmF2YSBtZXRob2QgCitzaG91bGQgcmVjZWl2ZSB0aGUgdmFsdWUgb2YgdGhlIFhNTCBwYXJhbWV0ZXIgY2FsbGVkIDx0dD5maXJzdC1uYW1lPC90dD48aT4uPC9pPiZuYnNwOyAKK1RoaXMgWE1MIHBhcmFtZXRlciBpcyBkZWZpbmVkIGluIDx0dD50ZXN0bmcueG1sPC90dD46PHA+CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPnRlc3RuZy54bWw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7c3VpdGUgbmFtZT0iTXkgc3VpdGUiJmd0OworICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImZpcnN0LW5hbWUiICB2YWx1ZT0iQ2VkcmljIi8mZ3Q7CisgICZsdDt0ZXN0IG5hbWU9IlNpbXBsZSBleGFtcGxlIiZndDsKKyAgJmx0Oy0tIC4uLiAtLSZndDsKKzwvcHJlPgorCis8aDQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiA0MDAiPlRoZSBzYW1lIHRlY2huaXF1ZSBjYW4gYmUgdXNlZCBmb3IgPHR0PkBCZWZvcmUvQWZ0ZXIgPC90dD5hbmQgPHR0PkBGYWN0b3J5PC90dD4gYW5ub3RhdGlvbnM6PC9zcGFuPjwvaDQ+CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BQYXJhbWV0ZXJzKHsgImRhdGFzb3VyY2UiLCAiamRiY0RyaXZlciIgfSkKK0BCZWZvcmVNZXRob2QKK3B1YmxpYyB2b2lkIGJlZm9yZVRlc3QoU3RyaW5nIGRzLCBTdHJpbmcgZHJpdmVyKSB7CisgIG1fZGF0YVNvdXJjZSA9IC4uLjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rIHVwIHRoZSB2YWx1ZSBvZiBkYXRhc291cmNlCisgIG1famRiY0RyaXZlciA9IGRyaXZlcjsKK30KKzwvcHJlPgorCitUaGlzIHRpbWUsIHRoZSB0d28gSmF2YSBwYXJhbWV0ZXIgPGk+ZHM8L2k+IAorYW5kIDxpPmRyaXZlcjwvaT4gd2lsbCByZWNlaXZlIHRoZSB2YWx1ZSBnaXZlbiB0byB0aGUgcHJvcGVydGllcyA8dHQ+ZGF0YXNvdXJjZTwvdHQ+IAorYW5kIDx0dD5qZGJjLWRyaXZlciA8L3R0PnJlc3BlY3RpdmVseS4mbmJzcDsKKworPHA+CisKK1BhcmFtZXRlcnMgY2FuIGJlIGRlY2xhcmVkIG9wdGlvbmFsIHdpdGggdGhlIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvT3B0aW9uYWwuaHRtbCI+PHR0Pk9wdGlvbmFsPC90dD48L2E+IGFubm90YXRpb246CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BQYXJhbWV0ZXJzKCJkYiIpCitAVGVzdAorcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0ZW50UGFyYW1ldGVyKEBPcHRpb25hbCgibXlzcWwiKSBTdHJpbmcgZGIpIHsgLi4uIH0KKzwvcHJlPgorCitJZiBubyBwYXJhbWV0ZXIgbmFtZWQgImRiIiBpcyBmb3VuZCBpbiB5b3VyIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZSwgeW91ciB0ZXN0IG1ldGhvZCB3aWxsIHJlY2VpdmUgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIGluc2lkZSB0aGUgPHR0PkBPcHRpb25hbDwvdHQ+IGFubm90YXRpb246ICJteXNxbCIuCisKKzxwPlRoZSA8dHQ+QFBhcmFtZXRlcnM8L3R0PiBhbm5vdGF0aW9uIGNhbiBiZSBwbGFjZWQgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPjx1bD4KKwk8bGk+T24gYW55IG1ldGhvZCB0aGF0IGFscmVhZHkgaGFzIGEgPHR0PkBUZXN0PC90dD4sIDx0dD5AQmVmb3JlL0FmdGVyPC90dD4gCisJb3IgPHR0PkBGYWN0b3J5PC90dD4gYW5ub3RhdGlvbi48L2xpPjxsaT5PbiBhdCBtb3N0IG9uZSBjb25zdHJ1Y3RvciBvZiB5b3VyIHRlc3QgY2xhc3MuJm5ic3A7IEluIHRoaXMgY2FzZSwgCisJVGVzdE5HIHdpbGwgaW52b2tlIHRoaXMgcGFydGljdWxhciBjb25zdHJ1Y3RvciB3aXRoIHRoZSBwYXJhbWV0ZXJzIAorCWluaXRpYWxpemVkIHRvIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIDx0dD50ZXN0bmcueG1sPC90dD4gd2hlbmV2ZXIgaXQgbmVlZHMgCisJdG8gaW5zdGFudGlhdGUgeW91ciB0ZXN0IGNsYXNzLiZuYnNwOyBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgCisJaW5zaWRlIHlvdXIgY2xhc3NlcyB0byB2YWx1ZXMgdGhhdCB3aWxsIHRoZW4gYmUgdXNlZCBieSB5b3VyCisJdGVzdCBtZXRob2RzLjwvbGk+PC91bD4KKwk8YmxvY2txdW90ZT4KKwk8cD48aT5Ob3RlczoKKworPC9pPgorCTx1bD4KKwkJPGxpPjxpPlRoZSBYTUwgcGFyYW1ldGVycyBhcmUgbWFwcGVkIHRvIHRoZSBKYXZhIHBhcmFtZXRlcnMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgCit0aGV5IGFyZSBmb3VuZCBpbiB0aGUgYW5ub3RhdGlvbiwgYW5kIFRlc3RORyB3aWxsIGlzc3VlIGFuIGVycm9yIGlmIHRoZSBudW1iZXJzIAorZG9uJ3QgbWF0Y2guIDwvaT4KKwkJPGxpPjxpPlBhcmFtZXRlcnMgYXJlIHNjb3BlZC4gSW4gPHR0PnRlc3RuZy54bWw8L3R0PiwgeW91IGNhbiBkZWNsYXJlIHRoZW0gZWl0aGVyIHVuZGVyIGEgCisJCTx0dD4mbHQ7c3VpdGUmZ3Q7PC90dD4gdGFnIG9yIHVuZGVyIDx0dD4mbHQ7dGVzdCZndDs8L3R0Pi4gSWYgdHdvIHBhcmFtZXRlcnMgaGF2ZSB0aGUgc2FtZSBuYW1lLCBpdCdzIHRoZSBvbmUgCitkZWZpbmVkIGluIDx0dD4mbHQ7dGVzdCZndDs8L3R0PiB0aGF0IGhhcyBwcmVjZWRlbmNlLiBUaGlzIGlzIGNvbnZlbmllbnQgaWYgeW91IG5lZWQgdG8gc3BlY2lmeSAKK2EgcGFyYW1ldGVyIGFwcGxpY2FibGUgdG8gYWxsIHlvdXIgdGVzdHMgYW5kIG92ZXJyaWRlIGl0cyB2YWx1ZSBvbmx5IGZvciBjZXJ0YWluIAordGVzdHMuIDwvaT4KKwkJPC91bD4KKwk8cD48L3A+Cis8L2Jsb2NrcXVvdGU+CisKKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0icGFyYW1ldGVycy1kYXRhcHJvdmlkZXJzIj5QYXJhbWV0ZXJzIHdpdGggRGF0YVByb3ZpZGVyczwvYT48L2g1PgorCisKKzxwPlNwZWNpZnlpbmcgcGFyYW1ldGVycyBpbiA8dHQ+dGVzdG5nLnhtbDwvdHQ+IG1pZ2h0IG5vdCBiZSBzdWZmaWNpZW50IGlmIHlvdSBuZWVkIHRvIHBhc3MgY29tcGxleCBwYXJhbWV0ZXJzLCBvciBwYXJhbWV0ZXJzIHRoYXQgbmVlZCB0byBiZSBjcmVhdGVkICBmcm9tIEphdmEgKGNvbXBsZXggb2JqZWN0cywgb2JqZWN0cyByZWFkIGZyb20gYSBwcm9wZXJ0eSBmaWxlIG9yIGEgZGF0YWJhc2UsIGV0Yy4uLikuIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYSBEYXRhIFByb3ZpZGVyIHRvIHN1cHBseSB0aGUgdmFsdWVzIHlvdSBuZWVkIHRvIHRlc3QuJm5ic3A7IEEgRGF0YSBQcm92aWRlciBpcyBhIG1ldGhvZCBvbiB5b3VyIGNsYXNzIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhcnJheSBvZiBvYmplY3RzLiZuYnNwOyBUaGlzIG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aCA8dHQ+QERhdGFQcm92aWRlcjwvdHQ+OgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj5KYXZhPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KKy8vVGhpcyBtZXRob2Qgd2lsbCBwcm92aWRlIGRhdGEgdG8gYW55IHRlc3QgbWV0aG9kIHRoYXQgZGVjbGFyZXMgdGhhdCBpdHMgRGF0YSBQcm92aWRlcgorLy9pcyBuYW1lZCAidGVzdDEiCitARGF0YVByb3ZpZGVyKG5hbWUgPSAidGVzdDEiKQorcHVibGljIE9iamVjdFtdW10gY3JlYXRlRGF0YTEoKSB7CisgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgIHsgIkNlZHJpYyIsIG5ldyBJbnRlZ2VyKDM2KSB9LAorICAgeyAiQW5uZSIsIG5ldyBJbnRlZ2VyKDM3KX0sIAorIH07Cit9CisKKy8vVGhpcyB0ZXN0IG1ldGhvZCBkZWNsYXJlcyB0aGF0IGl0cyBkYXRhIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgRGF0YSBQcm92aWRlcgorLy9uYW1lZCAidGVzdDEiCitAVGVzdChkYXRhUHJvdmlkZXIgPSAidGVzdDEiKQorcHVibGljIHZvaWQgdmVyaWZ5RGF0YTEoU3RyaW5nIG4xLCBJbnRlZ2VyIG4yKSB7CisgU3lzdGVtLm91dC5wcmludGxuKG4xICsgIiAiICsgbjIpOworfSAKKzwvcHJlPgord2lsbCBwcmludAorCis8cHJlIGNsYXNzPSJicnVzaDogdGV4dCI+CitDZWRyaWMgMzYKK0FubmUgMzcKKzwvcHJlPgorCitBIDx0dD5AVGVzdDwvdHQ+IG1ldGhvZCBzcGVjaWZpZXMgaXRzIERhdGEgUHJvdmlkZXIgd2l0aCB0aGUgPHR0PmRhdGFQcm92aWRlcjwvdHQ+IGF0dHJpYnV0ZS4mbmJzcDsgCitUaGlzIG5hbWUgbXVzdCBjb3JyZXNwb25kIHRvIGEgbWV0aG9kIG9uIHRoZSBzYW1lIGNsYXNzIGFubm90YXRlZCB3aXRoIDx0dD5ARGF0YVByb3ZpZGVyKG5hbWU9JnF1b3Q7Li4uJnF1b3Q7KTwvdHQ+IAord2l0aCBhIG1hdGNoaW5nIG5hbWUuCisKKzxwPgorQnkgZGVmYXVsdCwgdGhlIGRhdGEgcHJvdmlkZXIgd2lsbCBiZSBsb29rZWQgZm9yIGluIHRoZSBjdXJyZW50IHRlc3QgY2xhc3Mgb3Igb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMuICBJZiB5b3Ugd2FudCB0byBwdXQgeW91ciBkYXRhIHByb3ZpZGVyIGluIGEgZGlmZmVyZW50IGNsYXNzLCBpdCBuZWVkcyB0byBiZSBhIHN0YXRpYyBtZXRob2Qgb3IgYSBjbGFzcyB3aXRoIGEgbm9uLWFyZyBjb25zdHJ1Y3RvciwgYW5kIHlvdSBzcGVjaWZ5IHRoZSBjbGFzcyB3aGVyZSBpdCBjYW4gYmUgZm91bmQgaW4gdGhlIDx0dD5kYXRhUHJvdmlkZXJDbGFzczwvdHQ+IGF0dHJpYnV0ZToKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+U3RhdGljUHJvdmlkZXIuamF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgY2xhc3MgU3RhdGljUHJvdmlkZXIgeworICBARGF0YVByb3ZpZGVyKG5hbWUgPSAiY3JlYXRlIikKKyAgcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGEoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKDQyKSB9CisgICAgfTsKKyAgfQorfQorCitwdWJsaWMgY2xhc3MgTXlUZXN0IHsKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImNyZWF0ZSIsIGRhdGFQcm92aWRlckNsYXNzID0gU3RhdGljUHJvdmlkZXIuY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3QoSW50ZWdlciBuKSB7CisgICAgLy8gLi4uCisgIH0KK30KKzwvcHJlPgorCitUaGUgZGF0YSBwcm92aWRlciBzdXBwb3J0cyBpbmplY3Rpb24gdG9vLiBUZXN0Tkcgd2lsbCB1c2UgdGhlIHRlc3QgY29udGV4dCBmb3IgdGhlIGluamVjdGlvbi4KKworVGhlIERhdGEgUHJvdmlkZXIgbWV0aG9kIGNhbiByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzOgorCis8dWw+Cis8bGk+QW4gYXJyYXkgb2YgYXJyYXkgb2Ygb2JqZWN0cyAoPHR0Pk9iamVjdFtdW108L3R0Pikgd2hlcmUgdGhlIGZpcnN0IGRpbWVuc2lvbidzIHNpemUgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdGVzdCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGFuZCB0aGUgc2Vjb25kIGRpbWVuc2lvbiBzaXplIGNvbnRhaW5zIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSB0ZXN0IG1ldGhvZC4gVGhpcyBpcyB0aGUgY2FzdCBpbGx1c3RyYXRlZCBieSB0aGUgZXhhbXBsZSBhYm92ZS48L2xpPjxsaT5BbiA8dHQ+SXRlcmF0b3ImbHQ7T2JqZWN0W10mZ3Q7PC90dD4uICBUaGUgb25seSBkaWZmZXJlbmNlIHdpdGggPHR0Pk9iamVjdFtdW108L3R0PiBpcyB0aGF0IGFuIDx0dD5JdGVyYXRvcjwvdHQ+IGxldHMgeW91IGNyZWF0ZSB5b3VyIHRlc3QgZGF0YSBsYXppbHkuICBUZXN0Tkcgd2lsbCBpbnZva2UgdGhlIGl0ZXJhdG9yIGFuZCB0aGVuIHRoZSB0ZXN0IG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHRoaXMgaXRlcmF0b3Igb25lIGJ5IG9uZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxvdCBvZiBwYXJhbWV0ZXIgc2V0cyB0byBwYXNzIHRvIHRoZSBtZXRob2QgYW5kIHlvdSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhbGwgb2YgdGhlbSB1cGZyb250LgorPC91bD4KK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGlzIGZlYXR1cmU6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BEYXRhUHJvdmlkZXIobmFtZSA9ICJ0ZXN0MSIpCitwdWJsaWMgSXRlcmF0b3ImbHQ7T2JqZWN0W10+IGNyZWF0ZURhdGEoKSB7CisgIHJldHVybiBuZXcgTXlJdGVyYXRvcihEQVRBKTsKK30gCis8L3ByZT4KKworSWYgeW91IGRlY2xhcmUgeW91ciA8dHQ+QERhdGFQcm92aWRlcjwvdHQ+IGFzIHRha2luZyBhIDx0dD5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q8L3R0PgorYXMgZmlyc3QgcGFyYW1ldGVyLCBUZXN0Tkcgd2lsbCBwYXNzIHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIGZvciB0aGlzCitmaXJzdCBwYXJhbWV0ZXIuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzZXZlcmFsIHRlc3QgbWV0aG9kcwordXNlIHRoZSBzYW1lIDx0dD5ARGF0YVByb3ZpZGVyPC90dD4gYW5kIHlvdSB3YW50IGl0IHRvIHJldHVybiBkaWZmZXJlbnQKK3ZhbHVlcyBkZXBlbmRpbmcgb24gd2hpY2ggdGVzdCBtZXRob2QgaXQgaXMgc3VwcGx5aW5nIGRhdGEgZm9yLgorPHA+CitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHByaW50cyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QgaW5zaWRlIGl0cyA8dHQ+QERhdGFQcm92aWRlcjwvdHQ+OgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitARGF0YVByb3ZpZGVyKG5hbWUgPSAiZHAiKQorcHVibGljIE9iamVjdFtdW10gY3JlYXRlRGF0YShNZXRob2QgbSkgeworICBTeXN0ZW0ub3V0LnByaW50bG4obS5nZXROYW1lKCkpOyAgLy8gcHJpbnQgdGVzdCBtZXRob2QgbmFtZQorICByZXR1cm4gbmV3IE9iamVjdFtdW10geyBuZXcgT2JqZWN0W10geyAiQ2VkcmljIiB9fTsKK30KKworQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIikKK3B1YmxpYyB2b2lkIHRlc3QxKFN0cmluZyBzKSB7Cit9CisKK0BUZXN0KGRhdGFQcm92aWRlciA9ICJkcCIpCitwdWJsaWMgdm9pZCB0ZXN0MihTdHJpbmcgcykgeworfQorPC9wcmU+CisKK2FuZCB3aWxsIHRoZXJlZm9yZSBkaXNwbGF5OgorCis8cHJlIGNsYXNzPSJicnVzaDogdGV4dCI+Cit0ZXN0MQordGVzdDIKKzwvcHJlPgorCitEYXRhIHByb3ZpZGVycyBjYW4gcnVuIGluIHBhcmFsbGVsIHdpdGggdGhlIGF0dHJpYnV0ZSA8dHQ+cGFyYWxsZWw8L3R0PjoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQERhdGFQcm92aWRlcihwYXJhbGxlbCA9IHRydWUpCisvLyAuLi4KKzwvcHJlPgorCitQYXJhbGxlbCBkYXRhIHByb3ZpZGVycyBydW5uaW5nIGZyb20gYW4gWE1MIGZpbGUgc2hhcmUgdGhlIHNhbWUgcG9vbCBvZiB0aHJlYWRzLCB3aGljaCBoYXMgYSBzaXplIG9mIDEwIGJ5IGRlZmF1bHQuICBZb3UgY2FuIG1vZGlmeSB0aGlzIHZhbHVlIGluIHRoZSA8dHQ+Jmx0O3N1aXRlJmd0OzwvdHQ+IHRhZyBvZiB5b3VyIFhNTCBmaWxlOgorCisKKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3N1aXRlIG5hbWU9IlN1aXRlMSIgZGF0YS1wcm92aWRlci10aHJlYWQtY291bnQ9IjIwIiAmZ3Q7CisuLi4gCis8L3ByZT4KKworSWYgeW91IHdhbnQgdG8gcnVuIGEgZmV3IHNwZWNpZmljIGRhdGEgcHJvdmlkZXJzIGluIGEgZGlmZmVyZW50IHRocmVhZCBwb29sLCB5b3UgbmVlZCB0byBydW4gdGhlbSBmcm9tIGEgZGlmZmVyZW50IFhNTCBmaWxlLgorCis8cD4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0icGFyYW1ldGVycy1yZXBvcnRzIj5QYXJhbWV0ZXJzIGluIHJlcG9ydHM8L2E+PC9oNT4KKworPHA+CisKK1BhcmFtZXRlcnMgdXNlZCB0byBpbnZva2UgeW91ciB0ZXN0IG1ldGhvZHMgYXJlIHNob3duIGluIHRoZSBIVE1MIHJlcG9ydHMgZ2VuZXJhdGVkIGJ5IFRlc3RORy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIHNyYz0icGljcy9wYXJhbWV0ZXJzLnBuZyIgLz4KKzwvcD4KKworCis8L3A+CisKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERFUEVOREVOQ0lFUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKworPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJkZXBlbmRlbnQtbWV0aG9kcyI+RGVwZW5kZW5jaWVzPC9hPjwvaDQ+CisKKzxwPlNvbWV0aW1lcywgeW91IG5lZWQKK3lvdXIgdGVzdCBtZXRob2RzIHRvIGJlIGludm9rZWQgaW4gYSBjZXJ0YWluIG9yZGVyLiZuYnNwOyBIZXJlIGFyZSBhCitmZXcgZXhhbXBsZXM6CisKKzx1bD4KKzxsaT5UbyBtYWtlIHN1cmUgYSBjZXJ0YWluIG51bWJlciBvZiB0ZXN0IG1ldGhvZHMgaGF2ZSBjb21wbGV0ZWQgYW5kIHN1Y2NlZWRlZCAKK2JlZm9yZSBydW5uaW5nIG1vcmUgdGVzdCBtZXRob2RzLgorPGxpPlRvIGluaXRpYWxpemUgeW91ciB0ZXN0cyB3aGlsZSB3YW50aW5nIHRoaXMgaW5pdGlhbGl6YXRpb24gbWV0aG9kcyB0byBiZSAKK3Rlc3QgbWV0aG9kcyBhcyB3ZWxsIChtZXRob2RzIHRhZ2dlZCB3aXRoIDx0dD5AQmVmb3JlL0FmdGVyPC90dD4gd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgCitmaW5hbCByZXBvcnQpLgorPC91bD4KKworVGVzdE5HIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZWl0aGVyIHdpdGggYW5ub3RhdGlvbnMgb3IKK2luIFhNTC4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0iZGVwZW5kZW5jaWVzLXdpdGgtYW5ub3RhdGlvbnMiPkRlcGVuZGVuY2llcyB3aXRoIGFubm90YXRpb25zPC9hPjwvaDU+CisKKzxwPllvdSBjYW4gdXNlIHRoZSBhdHRyaWJ1dGVzIDx0dD5kZXBlbmRzT25NZXRob2RzPC90dD4gb3IgPHR0PmRlcGVuZHNPbkdyb3VwczwvdHQ+LCBmb3VuZCBvbiB0aGUgPHR0PkBUZXN0PC90dD4gYW5ub3RhdGlvbi48L3A+VGhlcmUgYXJlIHR3byBraW5kcyBvZiBkZXBlbmRlbmNpZXM6CisKKzx1bD4KKzxsaT48Yj5IYXJkIGRlcGVuZGVuY2llczwvYj4uICBBbGwgdGhlIG1ldGhvZHMgeW91IGRlcGVuZCBvbiBtdXN0IGhhdmUgcnVuIGFuZCBzdWNjZWVkZWQgZm9yIHlvdSB0byBydW4uICBJZiBhdCBsZWFzdCBvbmUgZmFpbHVyZSBvY2N1cnJlZCBpbiB5b3VyIGRlcGVuZGVuY2llcywgeW91IHdpbGwgbm90IGJlIGludm9rZWQgYW5kIG1hcmtlZCBhcyBhIFNLSVAgaW4gdGhlIHJlcG9ydC4KKzwvbGk+Cis8bGk+PGI+U29mdCBkZXBlbmRlbmNpZXM8L2I+LiAgWW91IHdpbGwgYWx3YXlzIGJlIHJ1biBhZnRlciB0aGUgbWV0aG9kcyB5b3UgZGVwZW5kIG9uLCBldmVuIGlmIHNvbWUgb2YgdGhlbSBoYXZlIGZhaWxlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIHRlc3QgbWV0aG9kcyBhcmUgcnVuIGluIGEgY2VydGFpbiBvcmRlciBidXQgdGhlaXIgc3VjY2VzcyBkb2Vzbid0IHJlYWxseSBkZXBlbmQgb24gdGhlIHN1Y2Nlc3Mgb2Ygb3RoZXJzLiAgQSBzb2Z0IGRlcGVuZGVuY3kgaXMgb2J0YWluZWQgYnkgYWRkaW5nIDx0dD4iYWx3YXlzUnVuPXRydWUiPC90dD4gaW4geW91ciA8dHQ+QFRlc3Q8L3R0PiBhbm5vdGF0aW9uLgorPC91bD4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgaGFyZCBkZXBlbmRlbmN5OgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitAVGVzdAorcHVibGljIHZvaWQgc2VydmVyU3RhcnRlZE9rKCkge30KKworQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsgInNlcnZlclN0YXJ0ZWRPayIgfSkKK3B1YmxpYyB2b2lkIG1ldGhvZDEoKSB7fQorPC9wcmU+CisKKzxwPkluIHRoaXMgZXhhbXBsZSwgPHR0Pm1ldGhvZDEoKTwvdHQ+IGlzIGRlY2xhcmVkIGFzIGRlcGVuZGluZyBvbiBtZXRob2QgCitzZXJ2ZXJTdGFydGVkT2soKSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHNlcnZlclN0YXJ0ZWRPaygpIAord2lsbCBhbHdheXMgYmUgaW52b2tlZCBmaXJzdC48L3A+PHA+WW91IGNhbiBhbHNvIGhhdmUgbWV0aG9kcyB0aGF0IGRlcGVuZCBvbiBlbnRpcmUgZ3JvdXBzOjwvcD4KKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQFRlc3QoZ3JvdXBzID0geyAiaW5pdCIgfSkKK3B1YmxpYyB2b2lkIHNlcnZlclN0YXJ0ZWRPaygpIHt9CisKK0BUZXN0KGdyb3VwcyA9IHsgImluaXQiIH0pCitwdWJsaWMgdm9pZCBpbml0RW52aXJvbm1lbnQoKSB7fQorCitAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJpbml0LioiIH0pCitwdWJsaWMgdm9pZCBtZXRob2QxKCkge30KKzwvcHJlPgorCis8cD5JbiB0aGlzIGV4YW1wbGUsIG1ldGhvZDEoKSBpcyBkZWNsYXJlZCBhcyBkZXBlbmRpbmcgb24gYW55IGdyb3VwIG1hdGNoaW5nIHRoZSAKK3JlZ3VsYXIgZXhwcmVzc2lvbiAmcXVvdDtpbml0LiomcXVvdDssIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgbWV0aG9kcyA8dHQ+c2VydmVyU3RhcnRlZE9rKCk8L3R0PiAKK2FuZCA8dHQ+aW5pdEVudmlyb25tZW50KCk8L3R0PiB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGJlZm9yZSA8dHQ+bWV0aG9kMSgpPC90dD4uJm5ic3A7IDwvcD4KKzxibG9ja3F1b3RlPgorCTxwPjxpPk5vdGU6Jm5ic3A7IGFzIHN0YXRlZCBiZWZvcmUsIHRoZSBvcmRlciBvZiBpbnZvY2F0aW9uIGZvciBtZXRob2RzIHRoYXQgCisJYmVsb25nIGluIHRoZSBzYW1lIGdyb3VwIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGFjcm9zcyB0ZXN0IHJ1bnMuPC9pPjwvcD48L2Jsb2NrcXVvdGU+PHA+SWYgYSBtZXRob2QgZGVwZW5kZWQgdXBvbiBmYWlscyBhbmQgeW91IGhhdmUgYSBoYXJkIGRlcGVuZGVuY3kgb24gaXQgKDx0dD5hbHdheXNSdW49ZmFsc2U8L3R0Piwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB0aGUgbWV0aG9kcyB0aGF0IGRlcGVuZCBvbiBpdCBhcmUgPGI+bm90PC9iPiAKK21hcmtlZCBhcyA8dHQ+RkFJTDwvdHQ+IGJ1dCBhcyA8dHQ+U0tJUDwvdHQ+LiZuYnNwOyBTa2lwcGVkIG1ldGhvZHMgd2lsbCBiZSByZXBvcnRlZCBhcyBzdWNoIGluIAordGhlIGZpbmFsIHJlcG9ydCAoaW4gYSBjb2xvciB0aGF0IGlzIG5laXRoZXIgcmVkIG5vciBncmVlbiBpbiBIVE1MKSwgCit3aGljaCBpcyBpbXBvcnRhbnQgc2luY2Ugc2tpcHBlZCBtZXRob2RzIGFyZSBub3QgbmVjZXNzYXJpbHkgZmFpbHVyZXMuPC9wPjxwPkJvdGggPHR0PmRlcGVuZHNPbkdyb3VwczwvdHQ+IGFuZCA8dHQ+ZGVwZW5kc09uTWV0aG9kczwvdHQ+IGFjY2VwdCByZWd1bGFyIAorZXhwcmVzc2lvbnMgYXMgcGFyYW1ldGVycy4mbmJzcDsgRm9yIDx0dD5kZXBlbmRzT25NZXRob2RzPC90dD4sIGlmIHlvdSBhcmUgCitkZXBlbmRpbmcgb24gYSBtZXRob2Qgd2hpY2ggaGFwcGVucyB0byBoYXZlIHNldmVyYWwgb3ZlcmxvYWRlZCB2ZXJzaW9ucywgYWxsIHRoZSAKK292ZXJsb2FkZWQgbWV0aG9kcyB3aWxsIGJlIGludm9rZWQuJm5ic3A7IElmIHlvdSBvbmx5IHdhbnQgdG8gaW52b2tlIG9uZSBvZiB0aGUgCitvdmVybG9hZGVkIG1ldGhvZHMsIHlvdSBzaG91bGQgdXNlIDx0dD5kZXBlbmRzT25Hcm91cHM8L3R0Pi48L3A+PHA+Rm9yIGEgbW9yZSBhZHZhbmNlZCBleGFtcGxlIG9mIGRlcGVuZGVudCBtZXRob2RzLCBwbGVhc2UgcmVmZXIgdG8gCis8YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy9hcmNoaXZlcy8wMDAxNzEuaHRtbCI+dGhpcyBhcnRpY2xlPC9hPiwgd2hpY2ggCit1c2VzIGluaGVyaXRhbmNlIHRvIHByb3ZpZGUgYW4gZWxlZ2FudCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiBtdWx0aXBsZSAKK2RlcGVuZGVuY2llcy48L3A+CisKK0J5IGRlZmF1bHQsIGRlcGVuZGVudCBtZXRob2RzIGFyZSBncm91cGVkIGJ5IGNsYXNzLiBGb3IgZXhhbXBsZSwgaWYgbWV0aG9kIDx0dD5iKCk8L3R0PiBkZXBlbmRzIG9uIG1ldGhvZCA8dHQ+YSgpPC90dD4gYW5kIHlvdSBoYXZlIHNldmVyYWwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZXNlIG1ldGhvZHMgKGJlY2F1c2Ugb2YgYSBmYWN0b3J5IG9mIGEgZGF0YSBwcm92aWRlciksIHRoZW4gdGhlIGludm9jYXRpb24gb3JkZXIgd2lsbCBiZSBhcyBmb2xsb3dzOgorCis8cHJlIGNsYXNzPSJicnVzaDogcGxhaW4iPgorYSgxKQorYSgyKQorYigyKQorYigyKQorPC9wcmU+CisKK1Rlc3RORyB3aWxsIG5vdCBydW4gPHR0PmIoKTwvdHQ+IHVudGlsIGFsbCB0aGUgaW5zdGFuY2VzIGhhdmUgaW52b2tlZCB0aGVpciA8dHQ+YSgpPC90dD4gbWV0aG9kLgorCis8cD4KKworVGhpcyBiZWhhdmlvciBtaWdodCBub3QgYmUgZGVzaXJhYmxlIGluIGNlcnRhaW4gc2NlbmFyaW9zLCBzdWNoIGFzIGZvciBleGFtcGxlIHRlc3RpbmcgYSBzaWduIGluIGFuZCBzaWduIG91dCBvZiBhIHdlYiBicm93c2VyIGZvciB2YXJpb3VzIGNvdW50cmllcy4gSW4gc3VjaCBhIGNhc2UsIHlvdSB3b3VsZCBsaWtlIHRoZSBmb2xsb3dpbmcgb3JkZXJpbmc6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBwbGFpbiI+CitzaWduSW4oInVzIikKK3NpZ25PdXQoInVzIikKK3NpZ25JbigidWsiKQorc2lnbk91dCgidWsiKQorPC9wcmU+CisKK0ZvciB0aGlzIG9yZGVyaW5nLCB5b3UgY2FuIHVzZSB0aGUgWE1MIGF0dHJpYnV0ZSA8dHQ+Z3JvdXAtYnktaW5zdGFuY2VzPC90dD4uIFRoaXMgYXR0cmlidXRlIGlzIHZhbGlkIGVpdGhlciBvbiAmbHQ7c3VpdGUmZ3Q7IG9yICZsdDt0ZXN0Jmd0OzoKKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CisgICZsdDtzdWl0ZSBuYW1lPSJGYWN0b3J5IiBncm91cC1ieS1pbnN0YW5jZXM9InRydWUiJmd0Oworb3IKKyAgJmx0O3Rlc3QgbmFtZT0iRmFjdG9yeSIgZ3JvdXAtYnktaW5zdGFuY2VzPSJ0cnVlIiZndDsKKzwvcHJlPgorCisKKzxoNT48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLi4iIG5hbWU9ImRlcGVuZGVuY2llcy1pbi14bWwiPkRlcGVuZGVuY2llcyBpbiBYTUw8L2E+PC9oNT4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgZ3JvdXAgZGVwZW5kZW5jaWVzIGluIHRoZSA8dHQ+dGVzdG5nLnhtbDwvdHQ+IGZpbGUuIFlvdSB1c2UgdGhlIDx0dD4mbHQ7ZGVwZW5kZW5jaWVzJmd0OzwvdHQ+IHRhZyB0byBhY2hpZXZlIHRoaXM6CisKKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorICAmbHQ7dGVzdCBuYW1lPSJNeSBzdWl0ZSImZ3Q7CisgICAgJmx0O2dyb3VwcyZndDsKKyAgICAgICZsdDtkZXBlbmRlbmNpZXMmZ3Q7CisgICAgICAgICZsdDtncm91cCBuYW1lPSJjIiBkZXBlbmRzLW9uPSJhICBiIiAvJmd0OworICAgICAgICAmbHQ7Z3JvdXAgbmFtZT0ieiIgZGVwZW5kcy1vbj0iYyIgLyZndDsKKyAgICAgICZsdDsvZGVwZW5kZW5jaWVzJmd0OworICAgICZsdDsvZ3JvdXBzJmd0OworICAmbHQ7L3Rlc3QmZ3Q7Cis8L3ByZT4KKworVGhlIDx0dD4mbHQ7ZGVwZW5kcy1vbiZndDs8L3R0PiBhdHRyaWJ1dGUgY29udGFpbnMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBncm91cHMuCisKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEZBQ1RPUklFUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0iZmFjdG9yaWVzIj5GYWN0b3JpZXM8L2E+PC9oND4KKworRmFjdG9yaWVzIGFsbG93IHlvdSB0byBjcmVhdGUgdGVzdHMgZHluYW1pY2FsbHkuIEZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSAKK3dhbnQgdG8gY3JlYXRlIGEgdGVzdCBtZXRob2QgdGhhdCB3aWxsIGFjY2VzcyBhIHBhZ2Ugb24gYSBXZWIgc2l0ZSBzZXZlcmFsIAordGltZXMsIGFuZCB5b3Ugd2FudCB0byBpbnZva2UgaXQgd2l0aCBkaWZmZXJlbnQgdmFsdWVzOgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj5UZXN0V2ViU2VydmVyLmphdmE8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIGNsYXNzIFRlc3RXZWJTZXJ2ZXIgeworICBAVGVzdChwYXJhbWV0ZXJzID0geyAibnVtYmVyLW9mLXRpbWVzIiB9KQorICBwdWJsaWMgdm9pZCBhY2Nlc3NQYWdlKGludCBudW1iZXJPZlRpbWVzKSB7CisgICAgd2hpbGUgKG51bWJlck9mVGltZXMtLSA+IDApIHsKKyAgICAgLy8gYWNjZXNzIHRoZSB3ZWIgcGFnZQorICAgIH0KKyAgfQorfQorPC9wcmU+CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPnRlc3RuZy54bWw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorJmx0O3Rlc3QgbmFtZT0iVDEiJmd0OworJm5ic3A7Jm5ic3A7Jmx0O3BhcmFtZXRlciBuYW1lPSJudW1iZXItb2YtdGltZXMiIHZhbHVlPSIxMCIvJmd0OworJm5ic3A7Jm5ic3A7Jmx0O2NsYXNzIG5hbWU9ICJUZXN0V2ViU2VydmVyIiAvJmd0OworJmx0Oy90ZXN0Jmd0OworCismbHQ7dGVzdCBuYW1lPSJUMiImZ3Q7CismbmJzcDsmbmJzcDsmbHQ7cGFyYW1ldGVyIG5hbWU9Im51bWJlci1vZi10aW1lcyIgdmFsdWU9IjIwIi8mZ3Q7CismbmJzcDsmbmJzcDsmbHQ7Y2xhc3MgbmFtZT0gIlRlc3RXZWJTZXJ2ZXIiLyZndDsKKyZsdDsvdGVzdCZndDsKKworJmx0O3Rlc3QgbmFtZT0iVDMiJmd0OworJm5ic3A7Jm5ic3A7Jmx0O3BhcmFtZXRlciBuYW1lPSJudW1iZXItb2YtdGltZXMiIHZhbHVlPSIzMCIvJmd0OworJm5ic3A7Jm5ic3A7Jmx0O2NsYXNzIG5hbWU9ICJUZXN0V2ViU2VydmVyIi8mZ3Q7CismbHQ7L3Rlc3QmZ3Q7Cis8L3ByZT4KKworVGhpcyBjYW4gYmVjb21lIHF1aWNrbHkgaW1wb3NzaWJsZSB0byBtYW5hZ2UsIHNvIGluc3RlYWQsIHlvdSBzaG91bGQgdXNlIGEgZmFjdG9yeToKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+V2ViVGVzdEZhY3RvcnkuamF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgY2xhc3MgV2ViVGVzdEZhY3RvcnkgeworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlSW5zdGFuY2VzKCkgeworICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxMF07ICAKKyAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgcmVzdWx0W2ldID0gbmV3IFdlYlRlc3QoaSAqIDEwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorPC9wcmU+CisKK2FuZCB0aGUgbmV3IHRlc3QgY2xhc3MgaXMgbm93OgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj5XZWJUZXN0LmphdmE8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIGNsYXNzIFdlYlRlc3QgeworICBwcml2YXRlIGludCBtX251bWJlck9mVGltZXM7CisgIHB1YmxpYyBXZWJUZXN0KGludCBudW1iZXJPZlRpbWVzKSB7CisgICAgbV9udW1iZXJPZlRpbWVzID0gbnVtYmVyT2ZUaW1lczsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXIoKSB7CisgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbnVtYmVyT2ZUaW1lczsgaSsrKSB7CisgICAgIC8vIGFjY2VzcyB0aGUgd2ViIHBhZ2UKKyAgICB9CisgIH0KK30KKzwvcHJlPgorCis8cD5Zb3VyIDx0dD50ZXN0bmcueG1sPC90dD4gb25seSBuZWVkcyB0byByZWZlcmVuY2UgdGhlIGNsYXNzIHRoYXQgCitjb250YWlucyB0aGUgZmFjdG9yeSBtZXRob2QsIHNpbmNlIHRoZSB0ZXN0IGluc3RhbmNlcyB0aGVtc2VsdmVzIHdpbGwgYmUgY3JlYXRlZCAKK2F0IHJ1bnRpbWU6PC9wPgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CismbHQ7Y2xhc3MgbmFtZT0iV2ViVGVzdEZhY3RvcnkiIC8mZ3Q7Cis8L3ByZT4KKworPHA+VGhlIGZhY3RvcnkgbWV0aG9kIGNhbiByZWNlaXZlIHBhcmFtZXRlcnMganVzdCBsaWtlIDx0dD5AVGVzdDwvdHQ+IGFuZCA8dHQ+QEJlZm9yZS9BZnRlcjwvdHQ+IGFuZCBpdCBtdXN0IHJldHVybiA8dHQ+T2JqZWN0W108L3R0Pi4mbmJzcDsgCitUaGUgb2JqZWN0cyByZXR1cm5lZCBjYW4gYmUgb2YgYW55IGNsYXNzIChub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgY2xhc3MgYXMgdGhlIAorZmFjdG9yeSBjbGFzcykgYW5kIHRoZXkgZG9uJ3QgZXZlbiBuZWVkIHRvIGNvbnRhaW4gVGVzdE5HIGFubm90YXRpb25zIChpbiB3aGljaCAKK2Nhc2UgdGhleSB3aWxsIGJlIGlnbm9yZWQgYnkgVGVzdE5HKS48L3A+CisKKzxwPgorCitGYWN0b3JpZXMgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGRhdGEgcHJvdmlkZXJzLCBhbmQgeW91IGNhbiBsZXZlcmFnZSB0aGlzIGZ1bmN0aW9uYWxpdHkgYnkgcHV0dGluZyB0aGUgPHR0PkBGYWN0b3J5PC90dD4gYW5ub3RhdGlvbiBlaXRoZXIgb24gYSByZWd1bGFyIG1ldGhvZCBvciBvbiBhIGNvbnN0cnVjdG9yLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjb25zdHJ1Y3RvciBmYWN0b3J5OgorCis8cHJlIGNsYXNzPSJicnVzaDpqYXZhIj4KKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIEZhY3RvcnlEYXRhUHJvdmlkZXJTYW1wbGVUZXN0KGludCBuKSB7CisgICAgc3VwZXIobik7CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHN0YXRpYyBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgbmV3IE9iamVjdFtdIHsgNDEgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IDQyIH0sCisgICAgfTsKKyAgfQorPC9wcmU+CisKK1RoZSBleGFtcGxlIHdpbGwgbWFrZSBUZXN0TkcgY3JlYXRlIHR3byB0ZXN0IGNsYXNzZXMsIG9uIHdpdGggdGhlIGNvbnN0cnVjdG9yIGludm9rZWQgd2l0aCB0aGUgdmFsdWUgNDEgYW5kIHRoZSBvdGhlciB3aXRoIDQyLgorCisKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIENMQVNTIExFVkVMIEFOTk9UQVRJT05TCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJjbGFzcy1sZXZlbCI+Q2xhc3MgbGV2ZWwgYW5ub3RhdGlvbnM8L2E+PC9oND4KKworVGhlIDx0dD5AVGVzdDwvdHQ+IGFubm90YXRpb24gY2FuIGJlIHB1dCBvbiBhIGNsYXNzIGluc3RlYWQgb2YgYSB0ZXN0IG1ldGhvZDoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+VGVzdDEuamF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitAVGVzdAorcHVibGljIGNsYXNzIFRlc3QxIHsKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgfQorfQorPC9wcmU+CitUaGUgZWZmZWN0IG9mIGEgY2xhc3MgbGV2ZWwgPHR0PkBUZXN0PC90dD4gYW5ub3RhdGlvbiBpcyB0byBtYWtlIGFsbCB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB0byBiZWNvbWUgdGVzdCBtZXRob2RzIGV2ZW4gaWYgdGhleSBhcmUgbm90IGFubm90YXRlZC4gIFlvdSBjYW4gc3RpbGwgcmVwZWF0IHRoZSA8dHQ+QFRlc3Q8L3R0PiBhbm5vdGF0aW9uIG9uIGEgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGFkZCBjZXJ0YWluIGF0dHJpYnV0ZXMuCis8cD4KKworRm9yIGV4YW1wbGU6CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPlRlc3QxLmphdmE8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQFRlc3QKK3B1YmxpYyBjbGFzcyBUZXN0MSB7CisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImcxIikKKyAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgIH0KK30KKzwvcHJlPgord2lsbCBtYWtlIGJvdGggPHR0PnRlc3QxKCk8L3R0PiBhbmQgPHR0PnRlc3QyKCk8L3R0PiB0ZXN0IG1ldGhvZHMgYnV0IG9uIHRvcCBvZiB0aGF0LCA8dHQ+dGVzdDIoKTwvdHQ+IG5vdyBiZWxvbmdzIHRvIHRoZSBncm91cCAiZzEiLgorPHA+CisKKworCis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUEFSQUxMRUwgUlVOTklORworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0icGFyYWxsZWwtcnVubmluZyI+UGFyYWxsZWxpc20gYW5kIHRpbWUtb3V0czwvYT48L2g0PgorCitZb3UgY2FuICBpbnN0cnVjdCBUZXN0TkcgdG8gcnVuIHlvdXIgdGVzdHMgaW4gc2VwYXJhdGUgdGhyZWFkcyBpbiB2YXJpb3VzIHdheXMuCisKKzxoNT48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLi4iIG5hbWU9InBhcmFsbGVsLXN1aXRlcyI+UGFyYWxsZWwgc3VpdGVzPC9hPjwvaDU+CisKK1RoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgcnVubmluZyBzZXZlcmFsIHN1aXRlIGZpbGVzIChlLmcuICI8dHQ+amF2YSBvcmcudGVzdG5nLlRlc3RORyB0ZXN0bmcxLnhtbCB0ZXN0bmcyLnhtbCI8L3R0PikgYW5kIHlvdSB3YW50IGVhY2ggb2YgdGhlc2Ugc3VpdGVzIHRvIGJlIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZC4gWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgZmxhZyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgdGhyZWFkIHBvb2w6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBwbGFpbiI+CitqYXZhIG9yZy50ZXN0bmcuVGVzdE5HIC1zdWl0ZXRocmVhZHBvb2xzaXplIDMgdGVzdG5nMS54bWwgdGVzdG5nMi54bWwgdGVzdG5nMy54bWwKKzwvcHJlPgorCitUaGUgY29ycmVzcG9uZGluZyBhbnQgdGFzayBuYW1lIGlzIDx0dD5zdWl0ZXRocmVhZHBvb2xzaXplPC90dD4uCisKKzxoNT48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLi4iIG5hbWU9InBhcmFsbGVsLXRlc3RzIj5QYXJhbGxlbCB0ZXN0cywgY2xhc3NlcyBhbmQgbWV0aG9kczwvYT48L2g1PgorVGhlIDxpPnBhcmFsbGVsPC9pPiBhdHRyaWJ1dGUgb24gdGhlICZsdDtzdWl0ZSZndDsgdGFnIGNhbiB0YWtlIG9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzOgorCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyZsdDtzdWl0ZSBuYW1lPSJNeSBzdWl0ZSIgcGFyYWxsZWw9Im1ldGhvZHMiIHRocmVhZC1jb3VudD0iNSImZ3Q7Cis8L3ByZT4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7c3VpdGUgbmFtZT0iTXkgc3VpdGUiIHBhcmFsbGVsPSJ0ZXN0cyIgdGhyZWFkLWNvdW50PSI1IiZndDsKKzwvcHJlPgorCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyZsdDtzdWl0ZSBuYW1lPSJNeSBzdWl0ZSIgcGFyYWxsZWw9ImNsYXNzZXMiIHRocmVhZC1jb3VudD0iNSImZ3Q7Cis8L3ByZT4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7c3VpdGUgbmFtZT0iTXkgc3VpdGUiIHBhcmFsbGVsPSJpbnN0YW5jZXMiIHRocmVhZC1jb3VudD0iNSImZ3Q7Cis8L3ByZT4KKworPHVsPgorPGxpPgorPGI+PHR0PnBhcmFsbGVsPSJtZXRob2RzIjwvdHQ+PC9iPjogIFRlc3RORyB3aWxsIHJ1biBhbGwgeW91ciB0ZXN0IG1ldGhvZHMgaW4gc2VwYXJhdGUgdGhyZWFkcy4gRGVwZW5kZW50IG1ldGhvZHMgd2lsbCBhbHNvIHJ1biBpbiBzZXBhcmF0ZSB0aHJlYWRzIGJ1dCB0aGV5IHdpbGwgcmVzcGVjdCB0aGUgb3JkZXIgdGhhdCB5b3Ugc3BlY2lmaWVkLgorPC9saT4KKworPGJyPgorCis8bGk+Cis8Yj48dHQ+cGFyYWxsZWw9InRlc3RzIjwvdHQ+PC9iPjogIFRlc3RORyB3aWxsIHJ1biBhbGwgdGhlIG1ldGhvZHMgaW4gdGhlIHNhbWUgJmx0O3Rlc3QmZ3Q7IHRhZyBpbiB0aGUgc2FtZSB0aHJlYWQsIGJ1dCBlYWNoICZsdDt0ZXN0Jmd0OyB0YWcgd2lsbCBiZSBpbiBhIHNlcGFyYXRlIHRocmVhZC4gIFRoaXMgYWxsb3dzIHlvdSB0byBncm91cCBhbGwgeW91ciBjbGFzc2VzIHRoYXQgYXJlIG5vdCB0aHJlYWQgc2FmZSBpbiB0aGUgc2FtZSAmbHQ7dGVzdCZndDsgYW5kIGd1YXJhbnRlZSB0aGV5IHdpbGwgYWxsIHJ1biBpbiB0aGUgc2FtZSB0aHJlYWQgd2hpbGUgdGFraW5nIGFkdmFudGFnZSBvZiBUZXN0TkcgdXNpbmcgYXMgbWFueSB0aHJlYWRzIGFzIHBvc3NpYmxlIHRvIHJ1biB5b3VyIHRlc3RzLgorPC9saT4KKworPGJyPgorCis8bGk+Cis8Yj48dHQ+cGFyYWxsZWw9ImNsYXNzZXMiPC90dD48L2I+OiAgVGVzdE5HIHdpbGwgcnVuIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGUgc2FtZSBjbGFzcyBpbiB0aGUgc2FtZSB0aHJlYWQsIGJ1dCBlYWNoIGNsYXNzIHdpbGwgYmUgcnVuIGluIGEgc2VwYXJhdGUgdGhyZWFkLgorPC9saT4KKworPGJyLz4KKworPGxpPgorPGI+PHR0PnBhcmFsbGVsPSJpbnN0YW5jZXMiPC90dD48L2I+OiAgVGVzdE5HIHdpbGwgcnVuIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGUgc2FtZSBpbnN0YW5jZSBpbiB0aGUgc2FtZSB0aHJlYWQsIGJ1dCB0d28gbWV0aG9kcyBvbiB0d28gZGlmZmVyZW50IGluc3RhbmNlcyB3aWxsIGJlIHJ1bm5pbmcgaW4gZGlmZmVyZW50IHRocmVhZHMuCis8L2xpPgorCis8L3VsPgorCis8cD4KKworCitBZGRpdGlvbmFsbHksIHRoZSBhdHRyaWJ1dGUgPGk+Cit0aHJlYWQtY291bnQ8L2k+IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBob3cgbWFueSB0aHJlYWRzIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yIAordGhpcyBleGVjdXRpb24uPGJsb2NrcXVvdGU+CisJPHA+PGk+Tm90ZTogdGhlIDx0dD5AVGVzdDwvdHQ+IGF0dHJpYnV0ZSA8dHQ+dGltZU91dDwvdHQ+IHdvcmtzIGluIGJvdGggCisJcGFyYWxsZWwgYW5kIG5vbi1wYXJhbGxlbCBtb2RlLjwvaT48L3A+PC9ibG9ja3F1b3RlPllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoYXQgYSA8dHQ+QFRlc3Q8L3R0PiBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcy4gIFlvdSBjYW4gdXNlIHRoZSBhdHRyaWJ1dGUgPHR0PnRocmVhZFBvb2xTaXplPC90dD4gdG8gYWNoaWV2ZSB0aGlzIHJlc3VsdDoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorQFRlc3QodGhyZWFkUG9vbFNpemUgPSAzLCBpbnZvY2F0aW9uQ291bnQgPSAxMCwgIHRpbWVPdXQgPSAxMDAwMCkKK3B1YmxpYyB2b2lkIHRlc3RTZXJ2ZXIoKSB7Cis8L3ByZT4KK0luIHRoaXMgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIDx0dD50ZXN0U2VydmVyPC90dD4gd2lsbCBiZSBpbnZva2VkIHRlbiB0aW1lcyBmcm9tIHRocmVlIGRpZmZlcmVudCB0aHJlYWRzLiAgQWRkaXRpb25hbGx5LCBhIHRpbWUtb3V0IG9mIHRlbiBzZWNvbmRzIGd1YXJhbnRlZXMgdGhhdCBub25lIG9mIHRoZSB0aHJlYWRzIHdpbGwgYmxvY2sgb24gdGhpcyB0aHJlYWQgZm9yZXZlci4gCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSRVJVTk5JTkcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0icmVydW5uaW5nIj5SZXJ1bm5pbmcgZmFpbGVkIHRlc3RzPC9hPjwvaDQ+CisKK0V2ZXJ5IHRpbWUgdGVzdHMgZmFpbCBpbiBhIHN1aXRlLCBUZXN0TkcgY3JlYXRlcyBhIGZpbGUgY2FsbGVkIDx0dD50ZXN0bmctZmFpbGVkLnhtbDwvdHQ+IGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorVGhpcyBYTUwgZmlsZSBjb250YWlucyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIHJlcnVuIG9ubHkgdGhlc2UgbWV0aG9kcyAKK3RoYXQgZmFpbGVkLCBhbGxvd2luZyB5b3UgdG8gcXVpY2tseSByZXByb2R1Y2UgdGhlIGZhaWx1cmVzIHdpdGhvdXQgaGF2aW5nIHRvIAorcnVuIHRoZSBlbnRpcmV0eSBvZiB5b3VyIHRlc3RzLiZuYnNwOyBUaGVyZWZvcmUsIGEgdHlwaWNhbCBzZXNzaW9uIHdvdWxkIGxvb2sgCitsaWtlIHRoaXM6CisKKzxwcmUgY2xhc3M9ImJydXNoOiB0ZXh0Ij4KK2phdmEgLWNsYXNzcGF0aCB0ZXN0bmcuamFyOyVDTEFTU1BBVEglIG9yZy50ZXN0bmcuVGVzdE5HIC1kIHRlc3Qtb3V0cHV0cyB0ZXN0bmcueG1sCitqYXZhIC1jbGFzc3BhdGggdGVzdG5nLmphcjslQ0xBU1NQQVRIJSBvcmcudGVzdG5nLlRlc3RORyAtZCB0ZXN0LW91dHB1dHMgdGVzdC1vdXRwdXRzXHRlc3RuZy1mYWlsZWQueG1sCis8L3ByZT4KKworPHA+Tm90ZSB0aGF0IDx0dD50ZXN0bmctZmFpbGVkLnhtbDwvdHQ+IHdpbGwgY29udGFpbiBhbGwgdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbnQgCittZXRob2RzIHNvIHRoYXQgeW91IGFyZSBndWFyYW50ZWVkIHRvIHJ1biB0aGUgbWV0aG9kcyB0aGF0IGZhaWxlZCB3aXRob3V0IGFueSAKK1NLSVAgZmFpbHVyZXMuPC9wPgorCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9Imp1bml0Ij5KVW5pdCB0ZXN0czwvYT48L2g0PgorCitUZXN0TkcgY2FuIHJ1biBKVW5pdCAzIGFuZCBKVW5pdCA0IHRlc3RzLiZuYnNwOyBBbGwgeW91IG5lZWQgdG8gZG8gaXMKK3B1dCB0aGUgSlVuaXQgamFyIGZpbGUgb24gdGhlIGNsYXNzcGF0aCwgc3BlY2lmeSB5b3VyIEpVbml0IHRlc3QgY2xhc3NlcyBpbiB0aGUgPHR0PnRlc3RuZy5jbGFzc05hbWVzPC90dD4KK3Byb3BlcnR5IGFuZCBzZXQgdGhlIDx0dD50ZXN0bmcuanVuaXQ8L3R0PiBwcm9wZXJ0eSB0byB0cnVlOgorCis8cD48L3A+Cis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj50ZXN0bmcueG1sPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3Rlc3QgbmFtZT0iVGVzdDEiIGp1bml0PSJ0cnVlIiZndDsKKyAgJmx0O2NsYXNzZXMmZ3Q7CisgICAgJmx0OyEtLSAuLi4gLS0mZ3Q7Cis8L3ByZT4KKworPHA+VGhlIGJlaGF2aW9yIG9mIFRlc3RORyBpbiB0aGlzIGNhc2UgaXMgc2ltaWxhciB0byBKVW5pdCBkZXBlbmRpbmcgb24gdGhlIEpVbml0IHZlcnNpb24gZm91bmQgb24gdGhlIGNsYXNzIHBhdGg6PGJyPgorPC9wPgorPHVsPgorICAgIDxsaT5KVW5pdCAzOgorPHVsPgorICA8bGk+QWxsIG1ldGhvZHMgc3RhcnRpbmcgd2l0aCB0ZXN0KiBpbiB5b3VyIGNsYXNzZXMgd2lsbCBiZSBydW48L2xpPjxsaT5JZiB0aGVyZSBpcyBhIG1ldGhvZCBzZXRVcCgpIG9uIHlvdXIgdGVzdCBjbGFzcywgaXQgd2lsbCBiZSBpbnZva2VkIGJlZm9yZSAKKwlldmVyeSB0ZXN0IG1ldGhvZDwvbGk+PGxpPklmIHRoZXJlIGlzIGEgbWV0aG9kIHRlYXJEb3duKCkgb24geW91ciB0ZXN0IGNsYXNzLCBpdCB3aWxsIGJlIGludm9rZWQgCisJYmVmb3JlIGFmdGVyIGV2ZXJ5IHRlc3QgbWV0aG9kPC9saT48bGk+SWYgeW91ciB0ZXN0IGNsYXNzIGNvbnRhaW5zIGEgbWV0aG9kIHN1aXRlKCksIGFsbCB0aGUgdGVzdHMgcmV0dXJuZWQgYnkgCisJdGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkPC9saT48L3VsPgorICAgIDwvbGk+CisgICAgPGxpPkpVbml0IDQ6CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT5UZXN0Tkcgd2lsbCB1c2UgdGhlIDx0dD5vcmcuanVuaXQucnVubmVyLkpVbml0Q29yZTwvdHQ+IHJ1bm5lciB0byBydW4geW91ciB0ZXN0czwvbGk+CisgICAgICAgIDwvdWw+CisgICAgPC9saT4KKzwvdWw+CisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBKVU5JVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSVU5OSU5HIFRFU1RORworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0icnVubmluZy10ZXN0bmctcHJvZ3JhbW1hdGljYWxseSI+UnVubmluZyBUZXN0TkcgcHJvZ3JhbW1hdGljYWxseTwvYT48L2g0PgorCitZb3UgY2FuIGludm9rZSBUZXN0TkcgZnJvbSB5b3VyIG93biBwcm9ncmFtcyB2ZXJ5IGVhc2lseToKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+SmF2YTwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CitUZXN0TkcgdGVzdG5nID0gbmV3IFRlc3RORygpOwordGVzdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgUnVuMi5jbGFzcyB9KTsKK3Rlc3RuZy5hZGRMaXN0ZW5lcih0bGEpOwordGVzdG5nLnJ1bigpOyAKKzwvcHJlPgorCitUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIDx0dD48YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9qYXZhZG9jcy9vcmcvdGVzdG5nL1Rlc3RORy5odG1sIj5UZXN0Tkc8L2E+PC90dD4gb2JqZWN0IGFuZCBydW5zIHRoZSB0ZXN0IGNsYXNzIDx0dD5SdW4yPC90dD4uICBJdCBhbHNvIGFkZHMgYSA8dHQ+VGVzdExpc3RlbmVyPC90dD4uICBZb3UgY2FuIGVpdGhlciB1c2UgdGhlIGFkYXB0ZXIgY2xhc3MgPHR0PjxhIGhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnL2phdmFkb2NzL29yZy90ZXN0bmcvVGVzdExpc3RlbmVyQWRhcHRlci5odG1sIj5vcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI8L2E+PC90dD4gb3IgaW1wbGVtZW50IDx0dD48YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9qYXZhZG9jcy9vcmcvdGVzdG5nL0lUZXN0TGlzdGVuZXIuaHRtbCI+b3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyPC9hPjwvdHQ+IHlvdXJzZWxmLiAgVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgdmFyaW91cyBjYWxsYmFjayBtZXRob2RzIHRoYXQgbGV0IHlvdSBrZWVwIHRyYWNrIG9mIHdoZW4gYSB0ZXN0IHN0YXJ0cywgc3VjY2VlZHMsIGZhaWxzLCBldGMuLi4gCis8cD4KK1NpbWlsYXJ5LCB5b3UgY2FuIGludm9rZSBUZXN0Tkcgb24gYSA8dHQ+dGVzdG5nLnhtbDwvdHQ+IGZpbGUgb3IgeW91IGNhbiBjcmVhdGUgYSB2aXJ0dWFsIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZSB5b3Vyc2VsZi4gIEluIG9yZGVyIHRvIGRvIHRoaXMsIHlvdSBjYW4gdXNlIHRoZSBjbGFzc2VzIGZvdW5kIHRoZSBwYWNrYWdlIDx0dD48YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9qYXZhZG9jcy9vcmcvdGVzdG5nL3htbC9wYWNrYWdlLWZyYW1lLmh0bWwiPm9yZy50ZXN0bmcueG1sPC9hPjwvdHQ+OiAgPHR0PjxhIGhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnL2phdmFkb2NzL29yZy90ZXN0bmcveG1sL1htbENsYXNzLmh0bWwiPlhtbENsYXNzPC9hPjwvdHQ+LCA8dHQ+PGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvamF2YWRvY3Mvb3JnL3Rlc3RuZy94bWwvWG1sVGVzdC5odG1sIj5YbWxUZXN0PC9hPjwvdHQ+LCBldGMuLi4gIEVhY2ggb2YgdGhlc2UgY2xhc3NlcyBjb3JyZXNwb25kIHRvIHRoZWlyIFhNTCB0YWcgY291bnRlcnBhcnQuCis8cD4KK0ZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgZm9sbG93aW5nIHZpcnR1YWwgZmlsZToKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorJmx0O3N1aXRlIG5hbWU9IlRtcFN1aXRlIiAmZ3Q7CisgICZsdDt0ZXN0IG5hbWU9IlRtcFRlc3QiICZndDsKKyAgICAmbHQ7Y2xhc3NlcyZndDsKKyAgICAgICZsdDtjbGFzcyBuYW1lPSJ0ZXN0LmZhaWx1cmVzLkNoaWxkIiAgLyZndDsKKyAgICAmbHQ7Y2xhc3NlcyZndDsKKyAgICAmbHQ7L3Rlc3QmZ3Q7CismbHQ7L3N1aXRlJmd0OworPC9wcmU+CisKK1lvdSB3b3VsZCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlOgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitYbWxTdWl0ZSBzdWl0ZSA9IG5ldyBYbWxTdWl0ZSgpOworc3VpdGUuc2V0TmFtZSgiVG1wU3VpdGUiKTsKKworWG1sVGVzdCB0ZXN0ID0gbmV3IFhtbFRlc3Qoc3VpdGUpOwordGVzdC5zZXROYW1lKCJUbXBUZXN0Iik7CitMaXN0Jmx0O1htbENsYXNzJmd0OyBjbGFzc2VzID0gbmV3IEFycmF5TGlzdCZsdDtYbWxDbGFzcyZndDsoKTsKK2NsYXNzZXMuYWRkKG5ldyBYbWxDbGFzcygidGVzdC5mYWlsdXJlcy5DaGlsZCIpKTsKK3Rlc3Quc2V0WG1sQ2xhc3NlcyhjbGFzc2VzKSA7Cis8L3ByZT4KK0FuZCB0aGVuIHlvdSBjYW4gcGFzcyB0aGlzIDx0dD5YbWxTdWl0ZTwvdHQ+IHRvIFRlc3RORzoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorTGlzdCZsdDtYbWxTdWl0ZSZndDsgc3VpdGVzID0gbmV3IEFycmF5TGlzdCZsdDtYbWxTdWl0ZSZndDsoKTsKK3N1aXRlcy5hZGQoc3VpdGUpOworVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsKK3RuZy5zZXRYbWxTdWl0ZXMoc3VpdGVzKTsKK3RuZy5ydW4oKTsgCis8L3ByZT4KKworPHA+UGxlYXNlIHNlZSB0aGUgPGEgaHJlZj0iLi4vZG9jL2phdmFkb2NzL29yZy90ZXN0bmcvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5KYXZhRG9jczwvYT4gZm9yIHRoZSBlbnRpcmUgQVBJLjwvcD48cD4KKworCis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQkVBTlNIRUxMCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCQorPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJiZWFuc2hlbGwiPkJlYW5TaGVsbCBhbmQgYWR2YW5jZWQgZ3JvdXAgc2VsZWN0aW9uPC9hPjwvaDQ+CisKKworCTxwPklmIHRoZSA8dHQ+Jmx0O2luY2x1ZGUmZ3Q7PC90dD4gYW5kIDx0dD4mbHQ7ZXhjbHVkZSZndDs8L3R0PiB0YWdzIGluIDx0dD50ZXN0bmcueG1sPC90dD4gYXJlIG5vdCBlbm91Z2ggZm9yIHlvdXIgbmVlZHMsIHlvdSBjYW4gdXNlIGEgPGEgaHJlZj0iaHR0cDovL2JlYW5zaGVsbC5vcmciPkJlYW5TaGVsbDwvYT4gZXhwcmVzc2lvbiB0byBkZWNpZGUgd2hldGhlciBhIGNlcnRhaW4gdGVzdCBtZXRob2Qgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgdGVzdCBydW4gb3Igbm90LiBZb3Ugc3BlY2lmeSB0aGlzIGV4cHJlc3Npb24ganVzdCB1bmRlciB0aGUgPHR0PiZsdDt0ZXN0Jmd0OzwvdHQ+IHRhZzo8L3A+CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPnRlc3RuZy54bWw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7dGVzdCBuYW1lPSJCZWFuU2hlbGwgdGVzdCImZ3Q7CisgICAmbHQ7bWV0aG9kLXNlbGVjdG9ycyZndDsKKyAgICAgJmx0O21ldGhvZC1zZWxlY3RvciZndDsKKyAgICAgICAmbHQ7c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiJmd0OyZsdDshW0NEQVRBWworICAgICAgICAgZ3JvdXBzLmNvbnRhaW5zS2V5KCJ0ZXN0MSIpCisgICAgICAgXV0mZ3Q7Jmx0Oy9zY3JpcHQmZ3Q7CisgICAgICZsdDsvbWV0aG9kLXNlbGVjdG9yJmd0OworICAgJmx0Oy9tZXRob2Qtc2VsZWN0b3JzJmd0OworICAmbHQ7IS0tIC4uLiAtLSZndDsKKzwvcHJlPgorCitXaGVuIGEgPHR0PiZsdDtzY3JpcHQmZ3Q7PC90dD4gdGFnIGlzIGZvdW5kIGluIDx0dD50ZXN0bmcueG1sPC90dD4sIFRlc3RORyB3aWxsIGlnbm9yZSBzdWJzZXF1ZW50IDx0dD4mbHQ7aW5jbHVkZSZndDs8L3R0PiBhbmQgPHR0PiZsdDtleGNsdWRlJmd0OzwvdHQ+IG9mIGdyb3VwcyBhbmQgbWV0aG9kcyBpbiB0aGUgY3VycmVudCA8dHQ+Jmx0O3Rlc3QmZ3Q7PC90dD4gdGFnOiZuYnNwOyB5b3VyIEJlYW5TaGVsbCBleHByZXNzaW9uIHdpbGwgYmUgdGhlIG9ubHkgd2F5IHRvIGRlY2lkZSB3aGV0aGVyIGEgdGVzdCBtZXRob2QgaXMgaW5jbHVkZWQgb3Igbm90LjwvcD48cD5IZXJlIGFyZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSBCZWFuU2hlbGwgc2NyaXB0OjwvcD48dWw+Cis8bGk+CitJdCBtdXN0IHJldHVybiBhIGJvb2xlYW4gdmFsdWUuJm5ic3A7IEV4Y2VwdCBmb3IgdGhpcyBjb25zdHJhaW50LCBhbnkgdmFsaWQgQmVhblNoZWxsIGNvZGUgaXMgYWxsb3dlZCAoZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIHJldHVybiA8dHQ+dHJ1ZSA8L3R0PmR1cmluZyB3ZWVrIGRheXMgYW5kIGZhbHNlIGR1cmluZyB3ZWVrZW5kcywgd2hpY2ggd291bGQgYWxsb3cgeW91IHRvIHJ1biB0ZXN0cyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIGRhdGUpLjxicj4mbmJzcDsKKzwvbGk+Cis8bGk+CitUZXN0TkcgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBmb3IgeW91ciBjb252ZW5pZW5jZTo8YnI+Jm5ic3A7IDxiPjx0dD5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kPC90dD48L2I+OiZuYnNwOyB0aGUgY3VycmVudCB0ZXN0IG1ldGhvZC48YnI+Jm5ic3A7IDxiPm9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZCB0ZXN0bmdNZXRob2Q8L2I+OiZuYnNwOyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGVzdCBtZXRob2QuPGJyPiZuYnNwOyA8Yj48dHQ+amF2YS51dGlsLk1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsgZ3JvdXBzPC90dD48L2I+OiZuYnNwOyBhIG1hcCBvZiB0aGUgZ3JvdXBzIHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIGJlbG9uZ3MgdG8uPGJyPiZuYnNwOworPC9saT4KKzxsaT4KK1lvdSBtaWdodCB3YW50IHRvIHN1cnJvdW5kIHlvdXIgZXhwcmVzc2lvbiB3aXRoIGEgPHR0PkNEQVRBPC90dD4gZGVjbGFyYXRpb24gKGFzIHNob3duIGFib3ZlKSB0byBhdm9pZCB0ZWRpb3VzIHF1b3Rpbmcgb2YgcmVzZXJ2ZWQgWE1MIGNoYXJhY3RlcnMpLjxicj4mbmJzcDsKKzwvbGk+Cis8L3VsPgorCis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQU5OT1RBVElPTiBUUkFOU0ZPUk1FUlMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisJCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9ImFubm90YXRpb250cmFuc2Zvcm1lcnMiPkFubm90YXRpb24gVHJhbnNmb3JtZXJzPC9hPjwvaDQ+CisKK1Rlc3RORyBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGUgY29udGVudCBvZiBhbGwgdGhlIGFubm90YXRpb25zIGF0IHJ1bnRpbWUuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgc291cmNlIGNvZGUgYXJlIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUsIGJ1dCB0aGVyZSBhcmUgYSBmZXcgc2l0dWF0aW9ucyB3aGVyZSB5b3UnZCBsaWtlIHRvIG92ZXJyaWRlIHRoZWlyIHZhbHVlLgorPHA+CisKK0luIG9yZGVyIHRvIGFjaGlldmUgdGhpcywgeW91IG5lZWQgdG8gdXNlIGFuIEFubm90YXRpb24gVHJhbnNmb3JtZXIuCisKKzxwPgorCitBbiBBbm5vdGF0aW9uIFRyYW5zZm9ybWVyIGlzIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIgeworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYnkgVGVzdE5HIHRvIGdpdmUgeW91IGEgY2hhbmNlCisgICAqIHRvIG1vZGlmeSBhIFRlc3RORyBhbm5vdGF0aW9uIHJlYWQgZnJvbSB5b3VyIHRlc3QgY2xhc3Nlcy4KKyAgICogWW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyB5b3UgbmVlZCBieSBjYWxsaW5nIGFueSBvZiB0aGUKKyAgICogc2V0dGVycyBvbiB0aGUgSVRlc3QgaW50ZXJmYWNlLgorICAgKiAKKyAgICogTm90ZSB0aGF0IG9ubHkgb25lIG9mIHRoZSB0aHJlZSBwYXJhbWV0ZXJzIHRlc3RDbGFzcywKKyAgICogdGVzdENvbnN0cnVjdG9yIGFuZCB0ZXN0TWV0aG9kIHdpbGwgYmUgbm9uLW51bGwuCisgICAqIAorICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiB0aGF0IHdhcyByZWFkIGZyb20geW91cgorICAgKiB0ZXN0IGNsYXNzLgorICAgKiBAcGFyYW0gdGVzdENsYXNzIElmIHRoZSBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiBhIGNsYXNzLCB0aGlzCisgICAqIHBhcmFtZXRlciByZXByZXNlbnRzIHRoaXMgY2xhc3MgKG51bGwgb3RoZXJ3aXNlKS4KKyAgICogQHBhcmFtIHRlc3RDb25zdHJ1Y3RvciBJZiB0aGUgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gYSBjb25zdHJ1Y3RvciwKKyAgICogdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGlzIGNvbnN0cnVjdG9yIChudWxsIG90aGVyd2lzZSkuCisgICAqIEBwYXJhbSB0ZXN0TWV0aG9kIElmIHRoZSBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiBhIG1ldGhvZCwKKyAgICogdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGlzIG1ldGhvZCAobnVsbCBvdGhlcndpc2UpLgorICAgKi8KKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElUZXN0IGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpOworfQorPC9wcmU+CisKK0xpa2UgYWxsIHRoZSBvdGhlciBUZXN0TkcgbGlzdGVuZXJzLCB5b3UgY2FuIHNwZWNpZnkgdGhpcyBjbGFzcyBlaXRoZXIgb24gdGhlIGNvbW1hbmQgbGluZSBvciB3aXRoIGFudDoKKworPHA+CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KKyAgamF2YSBvcmcudGVzdG5nLlRlc3RORyAtbGlzdGVuZXIgTXlUcmFuc2Zvcm1lciB0ZXN0bmcueG1sCis8L3ByZT4KKworb3IgcHJvZ3JhbW1hdGljYWxseToKKworPHA+CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KKyAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsKKyAgdG5nLnNldEFubm90YXRpb25UcmFuc2Zvcm1lcihuZXcgTXlUcmFuc2Zvcm1lcigpKTsKKyAgLy8gLi4uCis8L3ByZT4KKworV2hlbiB0aGUgbWV0aG9kIDx0dD50cmFuc2Zvcm0oKTwvdHQ+IGlzIGludm9rZWQsIHlvdSBjYW4gY2FsbCBhbnkgb2YgdGhlIHNldHRlcnMgb24gdGhlIDx0dD5JVGVzdCB0ZXN0PC90dD4gcGFyYW1ldGVyIHRvIGFsdGVyIGl0cyB2YWx1ZSBiZWZvcmUgVGVzdE5HIHByb2NlZWRzIGZ1cnRoZXIuCis8cD4KK0ZvciBleGFtcGxlLCBoZXJlIGlzIGhvdyB5b3Ugd291bGQgb3ZlcnJpZGUgdGhlIGF0dHJpYnV0ZSA8dHQ+aW52b2NhdGlvbkNvdW50PC90dD4gYnV0IG9ubHkgb24gdGhlIHRlc3QgbWV0aG9kIDx0dD5pbnZva2UoKTwvdHQ+IG9mIG9uZSBvZiB5b3VyIHRlc3QgY2xhc3NlczoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorICBwdWJsaWMgY2xhc3MgTXlUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIgeworICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdCBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgICAgeworICAgICAgaWYgKCJpbnZva2UiLmVxdWFscyh0ZXN0TWV0aG9kLmdldE5hbWUoKSkpIHsKKyAgICAgICAgYW5ub3RhdGlvbi5zZXRJbnZvY2F0aW9uQ291bnQoNSk7CisgICAgICB9CisgICAgfQorICB9Cis8L3ByZT4KKworPHR0PklBbm5vdGF0aW9uVHJhbnNmb3JtZXI8L3R0PiBvbmx5IGxldHMgeW91IG1vZGlmeSBhIDx0dD5AVGVzdDwvdHQ+IGFubm90YXRpb24uICBJZiB5b3UgbmVlZCB0byBtb2RpZnkgYW5vdGhlciBUZXN0TkcgYW5ub3RhdGlvbiAoYSBjb25maWd1cmF0aW9uIGFubm90YXRpb24sIDx0dD5ARmFjdG9yeTwvdHQ+IG9yIDx0dD5ARGF0YVByb3ZpZGVyPC90dD4pLCB1c2UgYW4gPHR0PklBbm5vdGF0aW9uVHJhbnNmb3JtZXIyPC90dD4uCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNRVRIT0QgSU5URVJDRVBUT1JTCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCQorPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJtZXRob2RpbnRlcmNlcHRvcnMiPk1ldGhvZCBJbnRlcmNlcHRvcnM8L2E+PC9oND4KKworT25jZSBUZXN0TkcgaGFzIGNhbGN1bGF0ZWQgaW4gd2hhdCBvcmRlciB0aGUgdGVzdCBtZXRob2RzIHdpbGwgYmUgaW52b2tlZCwgdGhlc2UgbWV0aG9kcyBhcmUgc3BsaXQgaW4gdHdvIGdyb3VwczoKKworPHVsPgorICA8bGk+PGVtPk1ldGhvZHMgcnVuIHNlcXVlbnRpYWxseTwvZW0+LiAgVGhlc2UgYXJlIGFsbCB0aGUgdGVzdCBtZXRob2RzIHRoYXQgaGF2ZSBkZXBlbmRlbmNpZXMgb3IgZGVwZW5kZW50cy4gIFRoZXNlIG1ldGhvZHMgd2lsbCBiZSBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci4KKyAgPGxpPjxlbT5NZXRob2RzIHJ1biBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyPC9lbT4uICBUaGVzZSBhcmUgYWxsIHRoZSBtZXRob2RzIHRoYXQgZG9uJ3QgYmVsb25nIGluIHRoZSBmaXJzdCBjYXRlZ29yeS4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSB0ZXN0IG1ldGhvZHMgYXJlIHJ1biBpcyByYW5kb20gYW5kIGNhbiB2YXJ5IGZyb20gb25lIHJ1biB0byB0aGUgbmV4dCAoYWx0aG91Z2ggYnkgZGVmYXVsdCwgVGVzdE5HIHdpbGwgdHJ5IHRvIGdyb3VwIHRlc3QgbWV0aG9kcyBieSBjbGFzcykuCis8L3VsPgorCitJbiBvcmRlciB0byBnaXZlIHlvdSBtb3JlIGNvbnRyb2wgb24gdGhlIG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNlY29uZCBjYXRlZ29yeSwgVGVzdE5HIGRlZmluZXMgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK3B1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEludGVyY2VwdG9yIHsKKyAgCisgIExpc3QmbHQ7SU1ldGhvZEluc3RhbmNlJmd0OyBpbnRlcmNlcHQoTGlzdCZsdDtJTWV0aG9kSW5zdGFuY2UmZ3Q7IG1ldGhvZHMsIElUZXN0Q29udGV4dCBjb250ZXh0KTsKKworfQorCis8L3ByZT4KKworVGhlIGxpc3Qgb2YgbWV0aG9kcyBwYXNzZWQgaW4gcGFyYW1ldGVycyBhcmUgYWxsIHRoZSBtZXRob2RzIHRoYXQgY2FuIGJlIHJ1biBpbiBhbnkgb3JkZXIuICBZb3VyIDx0dD5pbnRlcmNlcHQ8L3R0PiBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgc2ltaWxhciBsaXN0IG9mIDx0dD5JTWV0aG9kSW5zdGFuY2U8L3R0Piwgd2hpY2ggY2FuIGJlIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nOgorCis8dWw+CisgIDxsaT5UaGUgc2FtZSBsaXN0IHlvdSByZWNlaXZlZCBpbiBwYXJhbWV0ZXIgYnV0IGluIGEgZGlmZmVyZW50IG9yZGVyLgorICA8bGk+QSBzbWFsbGVyIGxpc3Qgb2YgPHR0PklNZXRob2RJbnN0YW5jZTwvdHQ+IG9iamVjdHMuCisgIDxsaT5BIGJpZ2dlciBsaXN0IG9mIDx0dD5JTWV0aG9kSW5zdGFuY2U8L3R0PiBvYmplY3RzLgorPC91bD4KKworT25jZSB5b3UgaGF2ZSBkZWZpbmVkIHlvdXIgaW50ZXJjZXB0b3IsIHlvdSBwYXNzIGl0IHRvIFRlc3RORyBhcyBhIGxpc3RlbmVyLiAgRm9yIGV4YW1wbGU6CisKKzxwPgorCis8aDMgY2xhc3M9InNvdXJjZXRpdGxlIj5TaGVsbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDogdGV4dCI+CitqYXZhIC1jbGFzc3BhdGggInRlc3RuZy1qZGsxNS5qYXI6dGVzdC9idWlsZCIgb3JnLnRlc3RuZy5UZXN0TkcgLWxpc3RlbmVyIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzLk51bGxNZXRob2RJbnRlcmNlcHRvcgorICAgLXRlc3RjbGFzcyB0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5Gb29UZXN0Cis8L3ByZT4KKworRm9yIHRoZSBlcXVpdmFsZW50IDx0dD5hbnQ8L3R0PiBzeW50YXgsIHNlZSB0aGUgPHR0Pmxpc3RlbmVyczwvdHQ+IGF0dHJpYnV0ZSBpbiB0aGUgPGEgaHJlZj0iYW50Lmh0bWwiPmFudCBkb2N1bWVudGF0aW9uPC9hPi4KKzxwPgorRm9yIGV4YW1wbGUsIGhlcmUgaXMgYSBNZXRob2QgSW50ZXJjZXB0b3IgdGhhdCB3aWxsIHJlb3JkZXIgdGhlIG1ldGhvZHMgc28gdGhhdCB0ZXN0IG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhlIGdyb3VwICJmYXN0IiBhcmUgYWx3YXlzIHJ1biBmaXJzdDoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIExpc3QmbHQ7SU1ldGhvZEluc3RhbmNlJmd0OyBpbnRlcmNlcHQoTGlzdCZsdDtJTWV0aG9kSW5zdGFuY2UmZ3Q7IG1ldGhvZHMsIElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgIExpc3QmbHQ7SU1ldGhvZEluc3RhbmNlJmd0OyByZXN1bHQgPSBuZXcgQXJyYXlMaXN0Jmx0O0lNZXRob2RJbnN0YW5jZSZndDsoKTsKKyAgZm9yIChJTWV0aG9kSW5zdGFuY2UgbSA6IG1ldGhvZHMpIHsKKyAgICBUZXN0IHRlc3QgPSBtLmdldE1ldGhvZCgpLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKS5nZXRBbm5vdGF0aW9uKFRlc3QuY2xhc3MpOworICAgIFNldCZsdDtTdHJpbmcmZ3Q7IGdyb3VwcyA9IG5ldyBIYXNoU2V0Jmx0O1N0cmluZyZndDsoKTsKKyAgICBmb3IgKFN0cmluZyBncm91cCA6IHRlc3QuZ3JvdXBzKCkpIHsKKyAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOworICAgIH0KKyAgICBpZiAoZ3JvdXBzLmNvbnRhaW5zKCJmYXN0IikpIHsKKyAgICAgIHJlc3VsdC5hZGQoMCwgbSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzdWx0LmFkZChtKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvcHJlPgorCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBURVNUTkcgTElTVEVORVJTCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCQorPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJ0ZXN0bmctbGlzdGVuZXJzIj5UZXN0TkcgTGlzdGVuZXJzPC9hPjwvaDQ+CisKK1RoZXJlIGFyZSBzZXZlcmFsIGludGVyZmFjZXMgdGhhdCBhbGxvdyB5b3UgdG8gbW9kaWZ5IFRlc3RORydzIGJlaGF2aW9yLiAgVGhlc2UgaW50ZXJmYWNlcyBhcmUgYnJvYWRseSBjYWxsZWQgIlRlc3RORyBMaXN0ZW5lcnMiLiAgSGVyZSBhcmUgYSBmZXcgbGlzdGVuZXJzOgorCis8dWw+CisgIDxsaT48dHQ+SUFubm90YXRpb25UcmFuc2Zvcm1lcjwvdHQ+ICg8YSBocmVmPSIjYW5ub3RhdGlvbnRyYW5zZm9ybWVycyI+ZG9jPC9hPiwgPGEgaHJlZj0iLi4vamF2YWRvY3Mvb3JnL3Rlc3RuZy9JQW5ub3RhdGlvblRyYW5zZm9ybWVyLmh0bWwiPmphdmFkb2M8L2E+KQorICA8bGk+PHR0PklBbm5vdGF0aW9uVHJhbnNmb3JtZXIyPC90dD4gKDxhIGhyZWY9IiNhbm5vdGF0aW9udHJhbnNmb3JtZXJzIj5kb2M8L2E+LCA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIyLmh0bWwiPmphdmFkb2M8L2E+KQorICA8bGk+PHR0PklIb29rYWJsZTwvdHQ+ICg8YSBocmVmPSIjaWhvb2thYmxlIj5kb2M8L2E+LCA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lIb29rYWJsZS5odG1sIj5qYXZhZG9jPC9hPikKKyAgPGxpPjx0dD5JSW52b2tlZE1ldGhvZExpc3RlbmVyPC90dD4gKGRvYywgPGEgaHJlZj0iLi4vamF2YWRvY3Mvb3JnL3Rlc3RuZy9JSW52b2tlZE1ldGhvZExpc3RlbmVyLmh0bWwiPmphdmFkb2M8L2E+KQorICA8bGk+PHR0PklNZXRob2RJbnRlcmNlcHRvcjwvdHQ+ICg8YSBocmVmPSIjbWV0aG9kaW50ZXJjZXB0b3JzIj5kb2M8L2E+LCA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lNZXRob2RJbnRlcmNlcHRvci5odG1sIj5qYXZhZG9jPC9hPikKKyAgPGxpPjx0dD5JUmVwb3J0ZXI8L3R0PiAoPGEgaHJlZj0iI2xvZ2dpbmctcmVwb3J0ZXJzIj5kb2M8L2E+LCA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lSZXBvcnRlci5odG1sIj5qYXZhZG9jPC9hPikKKyAgPGxpPjx0dD5JU3VpdGVMaXN0ZW5lcjwvdHQ+IChkb2MsIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSVN1aXRlTGlzdGVuZXIuaHRtbCI+amF2YWRvYzwvYT4pCisgIDxsaT48dHQ+SVRlc3RMaXN0ZW5lcjwvdHQ+ICg8YSBocmVmPSIjbG9nZ2luZy1saXN0ZW5lcnMiPmRvYzwvYT4sIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSVRlc3RMaXN0ZW5lci5odG1sIj5qYXZhZG9jPC9hPikKKzwvdWw+CisKK1doZW4geW91IGltcGxlbWVudCBvbmUgb2YgdGhlc2UgaW50ZXJmYWNlcywgeW91IGNhbiBsZXQgVGVzdE5HIGtub3cgYWJvdXQgaXQgd2l0aCBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorCis8dWw+CisgIDxsaT48YSBocmVmPSIjcnVubmluZy10ZXN0bmciPlVzaW5nIC1saXN0ZW5lciBvbiB0aGUgY29tbWFuZCBsaW5lLjwvYT4KKyAgPGxpPjxhIGhyZWY9ImFudC5odG1sIj5Vc2luZyAmbHQ7bGlzdGVuZXJzJmd0OyB3aXRoIGFudC48L2E+CisgIDxsaT5Vc2luZyAmbHQ7bGlzdGVuZXJzJmd0OyBpbiB5b3VyIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZS4KKyAgPGxpPlVzaW5nIHRoZSA8dHQ+QExpc3RlbmVyczwvdHQ+IGFubm90YXRpb24gb24gYW55IG9mIHlvdXIgdGVzdCBjbGFzc2VzLgorICA8bGk+VXNpbmcgPHR0PlNlcnZpY2VMb2FkZXI8L3R0Pi4KKzwvdWw+CisKKzxoNT48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLi4iIG5hbWU9Imxpc3RlbmVycy10ZXN0bmcteG1sIj5TcGVjaWZ5aW5nIGxpc3RlbmVycyB3aXRoIDx0dD50ZXN0bmcueG1sPC90dD4gb3IgaW4gSmF2YTwvYT48L2g1PgorCitIZXJlIGlzIGhvdyB5b3UgY2FuIGRlZmluZSBsaXN0ZW5lcnMgaW4geW91ciA8dHQ+dGVzdG5nLnhtbDwvdHQ+IGZpbGU6CisKKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3N1aXRlJmd0OworCisgICZsdDtsaXN0ZW5lcnMmZ3Q7CisgICAgJmx0O2xpc3RlbmVyIGNsYXNzLW5hbWU9ImNvbS5leGFtcGxlLk15TGlzdGVuZXIiIC8mZ3Q7CisgICAgJmx0O2xpc3RlbmVyIGNsYXNzLW5hbWU9ImNvbS5leGFtcGxlLk15TWV0aG9kSW50ZXJjZXB0b3IiIC8mZ3Q7CisgICZsdDsvbGlzdGVuZXJzJmd0OworCisuLi4KKworPC9wcmU+CisKK09yIGlmIHlvdSBwcmVmZXIgdG8gZGVmaW5lIHRoZXNlIGxpc3RlbmVycyBpbiBKYXZhOgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitATGlzdGVuZXJzKHsgY29tLmV4YW1wbGUuTXlMaXN0ZW5lci5jbGFzcywgY29tLmV4YW1wbGUuTXlNZXRob2RJbnRlcmNlcHRvci5jbGFzcyB9KQorcHVibGljIGNsYXNzIE15VGVzdCB7CisgIC8vIC4uLgorfQorPC9wcmU+CisKK1RoZSA8dHQ+QExpc3RlbmVyczwvdHQ+IGFubm90YXRpb24gY2FuIGNvbnRhaW4gYW55IGNsYXNzIHRoYXQgZXh0ZW5kcyA8dHQ+b3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXI8L3R0PiA8Yj5leGNlcHQ8L2I+IDx0dD5JQW5ub3RhdGlvblRyYW5zZm9ybWVyPC90dD4gYW5kIDx0dD5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMjwvdHQ+LiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZXNlIGxpc3RlbmVycyBuZWVkIHRvIGJlIGtub3duIHZlcnkgZWFybHkgaW4gdGhlIHByb2Nlc3Mgc28gdGhhdCBUZXN0TkcgY2FuIHVzZSB0aGVtIHRvIHJld3JpdGUgeW91ciBhbm5vdGF0aW9ucywgdGhlcmVmb3JlIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlc2UgbGlzdGVuZXJzIGluIHlvdXIgPHR0PnRlc3RuZy54bWw8L3R0PiBmaWxlLgorCis8cD4KKworTm90ZSB0aGF0IHRoZSA8dHQ+QExpc3RlbmVyczwvdHQ+IGFubm90YXRpb24gd2lsbCBhcHBseSB0byB5b3VyIGVudGlyZSBzdWl0ZSBmaWxlLCBqdXN0IGFzIGlmIHlvdSBoYWQgc3BlY2lmaWVkIGl0IGluIGEgPHR0PnRlc3RuZy54bWw8L3R0PiBmaWxlLiBJZiB5b3Ugd2FudCB0byByZXN0cmljdCBpdHMgc2NvcGUgKGZvciBleGFtcGxlLCBvbmx5IHJ1bm5pbmcgb24gdGhlIGN1cnJlbnQgY2xhc3MpLCB0aGUgY29kZSBpbiB5b3VyIGxpc3RlbmVyIGNvdWxkIGZpcnN0IGNoZWNrIHRoZSB0ZXN0IG1ldGhvZCB0aGF0J3MgYWJvdXQgdG8gcnVuIGFuZCBkZWNpZGUgd2hhdCB0byBkbyB0aGVuLgorCis8aDU+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4uIiBuYW1lPSJsaXN0ZW5lcnMtc2VydmljZS1sb2FkZXIiPlNwZWNpZnlpbmcgbGlzdGVuZXJzIHdpdGggPHR0PlNlcnZpY2VMb2FkZXI8L3R0PjwvYT48L2g1PgorCitGaW5hbGx5LCB0aGUgSkRLIG9mZmVycyBhIHZlcnkgZWxlZ2FudCBtZWNoYW5pc20gdG8gc3BlY2lmeSBpbXBsZW1lbnRhdGlvbnMgb2YgaW50ZXJmYWNlcyBvbiB0aGUgY2xhc3MgcGF0aCB2aWEgdGhlIDx0dD48YSBocmVmPSJodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL3V0aWwvU2VydmljZUxvYWRlci5odG1sIj5TZXJ2aWNlTG9hZGVyPC9hPjwvdHQ+IGNsYXNzLgorCis8cD4KK1dpdGggU2VydmljZUxvYWRlciwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgeW91ciBsaXN0ZW5lcihzKSBhbmQgYSBmZXcgY29uZmlndXJhdGlvbiBmaWxlcywgcHV0IHRoYXQgamFyIGZpbGUgb24gdGhlIGNsYXNzcGF0aCB3aGVuIHlvdSBydW4gVGVzdE5HIGFuZCBUZXN0Tkcgd2lsbCBhdXRvbWF0aWNhbGx5IGZpbmQgdGhlbS4KKzxwPgorCitIZXJlIGlzIGEgY29uY3JldGUgZXhhbXBsZSBvZiBob3cgaXQgd29ya3MuCisKKzxwPgorCitMZXQncyBzdGFydCBieSBjcmVhdGluZyBhIGxpc3RlbmVyIChhbnkgVGVzdE5HIGxpc3RlbmVyIHNob3VsZCB3b3JrKToKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcGFja2FnZSB0ZXN0LnRtcDsKKworcHVibGljIGNsYXNzIFRtcFN1aXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJU3VpdGVMaXN0ZW5lciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJU3VpdGUgc3VpdGUpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaGluZyIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVN1aXRlIHN1aXRlKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyIpOworICB9Cit9Cis8L3ByZT4KKworQ29tcGlsZSB0aGlzIGZpbGUsIHRoZW4gY3JlYXRlIGEgZmlsZSBhdCB0aGUgbG9jYXRpb24gPHR0Pk1FVEEtSU5GL3NlcnZpY2VzL29yZy50ZXN0bmcuSVRlc3ROR0xpc3RlbmVyPC90dD4sIHdoaWNoIHdpbGwgbmFtZSB0aGUgaW1wbGVtZW50YXRpb24ocykgeW91IHdhbnQgZm9yIHRoaXMgaW50ZXJmYWNlLgorCis8cD4KKworWW91IHNob3VsZCBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHdpdGggb25seSB0d28gZmlsZXM6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBwbGFpbjsgaGlnaGxpZ2h0OiBbNCwgN10iPgorJCB0cmVlCit8X19fX01FVEEtSU5GCit8IHxfX19fc2VydmljZXMKK3wgfCB8X19fX29yZy50ZXN0bmcuSVRlc3ROR0xpc3RlbmVyCit8X19fX3Rlc3QKK3wgfF9fX190bXAKK3wgfCB8X19fX1RtcFN1aXRlTGlzdGVuZXIuY2xhc3MKKworJCBjYXQgTUVUQS1JTkYvc2VydmljZXMvb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXIKK3Rlc3QudG1wLlRtcFN1aXRlTGlzdGVuZXIKKzwvcHJlPgorCitDcmVhdGUgYSBqYXIgb2YgdGhpcyBkaXJlY3Rvcnk6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBwbGFpbiI+CiskIGphciBjdmYgLi4vc2wuamFyIC4KK2FkZGVkIG1hbmlmZXN0CitpZ25vcmluZyBlbnRyeSBNRVRBLUlORi8KK2FkZGluZzogTUVUQS1JTkYvc2VydmljZXMvKGluID0gMCkgKG91dD0gMCkoc3RvcmVkIDAlKQorYWRkaW5nOiBNRVRBLUlORi9zZXJ2aWNlcy9vcmcudGVzdG5nLklUZXN0TkdMaXN0ZW5lcihpbiA9IDI2KSAob3V0PSAyOCkoZGVmbGF0ZWQgLTclKQorYWRkaW5nOiB0ZXN0LyhpbiA9IDApIChvdXQ9IDApKHN0b3JlZCAwJSkKK2FkZGluZzogdGVzdC90bXAvKGluID0gMCkgKG91dD0gMCkoc3RvcmVkIDAlKQorYWRkaW5nOiB0ZXN0L3RtcC9UbXBTdWl0ZUxpc3RlbmVyLmNsYXNzKGluID0gODQ5KSAob3V0PSA0NzApKGRlZmxhdGVkIDQ0JSkKKzwvcHJlPgorCitOZXh0LCBwdXQgdGhpcyBqYXIgZmlsZSBvbiB5b3VyIGNsYXNzcGF0aCB3aGVuIHlvdSBpbnZva2UgVGVzdE5HOgorCis8cHJlIGNsYXNzPSJicnVzaDogcGxhaW4iPgorJCBqYXZhIC1jbGFzc3BhdGggc2wuamFyOnRlc3RuZy5qYXIgb3JnLnRlc3RuZy5UZXN0TkcgdGVzdG5nLXNpbmdsZS55YW1sCitTdGFydGluZworZjIgMTEgMgorUEFTU0VEOiBmMigiMiIpCitGaW5pc2hpbmcKKzwvcHJlPgorCitUaGlzIG1lY2hhbmlzbSBhbGxvd3MgeW91IHRvIGFwcGx5IHRoZSBzYW1lIHNldCBvZiBsaXN0ZW5lcnMgdG8gYW4gZW50aXJlIG9yZ2FuaXphdGlvbiBqdXN0IGJ5IGFkZGluZyBhIGphciBmaWxlIHRvIHRoZSBjbGFzc3BhdGgsIGluc3RlYWQgb2YgYXNraW5nIGV2ZXJ5IHNpbmdsZSBkZXZlbG9wZXIgdG8gcmVtZW1iZXIgdG8gc3BlY2lmeSB0aGVzZSBsaXN0ZW5lcnMgaW4gdGhlaXIgdGVzdG5nLnhtbCBmaWxlLiAKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERFUEVOREVOQ1kgSU5KRUNUSU9OCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCQorPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJkZXBlbmRlbmN5LWluamVjdGlvbiI+RGVwZW5kZW5jeSBpbmplY3Rpb248L2E+PC9oND4KKworVGVzdE5HIHN1cHBvcnRzIHR3byBkaWZmZXJlbnQga2luZHMgb2YgZGVwZW5kZW5jeSBpbmplY3Rpb246IG5hdGl2ZSAocGVyZm9ybWVkIGJ5IFRlc3RORyBpdHNlbGYpIGFuZCBleHRlcm5hbCAocGVyZm9ybWVkIGJ5IGEgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJhbWV3b3JrIHN1Y2ggYXMgR3VpY2UpLgorCis8aDU+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4uIiBuYW1lPSJuYXRpdmUtZGVwZW5kZW5jeS1pbmplY3Rpb24iPk5hdGl2ZSBkZXBlbmRlbmN5IGluamVjdGlvbjwvYT48L2g1PgorCitUZXN0TkcgbGV0cyB5b3UgZGVjbGFyZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgaW4geW91ciBtZXRob2RzLiAgV2hlbiB0aGlzIGhhcHBlbnMsIFRlc3RORyB3aWxsIGF1dG9tYXRpY2FsbHkgZmlsbCB0aGVzZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHJpZ2h0IHZhbHVlLiAgRGVwZW5kZW5jeSBpbmplY3Rpb24gY2FuIGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6CisKKzx1bD4KKyAgCis8bGk+CisgIEFueSBAQmVmb3JlIG1ldGhvZCBvciBAVGVzdCBtZXRob2QgY2FuIGRlY2xhcmUgYSBwYXJhbWV0ZXIgb2YgdHlwZSA8dHQ+SVRlc3RDb250ZXh0PC90dD4uCis8bGk+CisgIEFueSBAQWZ0ZXJNZXRob2QgbWV0aG9kIGNhbiBkZWNsYXJlIGEgcGFyYW1ldGVyIG9mIHR5cGUgPHR0PklUZXN0UmVzdWx0PC90dD4sIHdoaWNoIHdpbGwgcmVmbGVjdCB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0IG1ldGhvZCB0aGF0IHdhcyBqdXN0IHJ1bi4KKzxsaT4KKyAgQW55IEBCZWZvcmUgYW5kIEBBZnRlciBtZXRob2RzIGNhbiBkZWNsYXJlIGEgcGFyYW1ldGVyIG9mIHR5cGUgPHR0PlhtbFRlc3Q8L3R0Piwgd2hpY2ggY29udGFpbiB0aGUgY3VycmVudCA8dHQ+Jmx0O3Rlc3QmZ3Q7PC90dD4gdGFnLgorPGxpPgorICBBbnkgQEJlZm9yZU1ldGhvZCAoYW5kIEBBZnRlck1ldGhvZCkgY2FuIGRlY2xhcmUgYSBwYXJhbWV0ZXIgb2YgdHlwZQorICA8dHQ+amF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kPC90dD4uICBUaGlzIHBhcmFtZXRlciB3aWxsIHJlY2VpdmUgdGhlCisgIHRlc3QgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSB0aGlzIEBCZWZvcmVNZXRob2QgZmluaXNoZXMgKG9yCisgIGFmdGVyIHRoZSBtZXRob2QgYXMgcnVuIGZvciBAQWZ0ZXJNZXRob2QpLgorPGxpPgorICBBbnkgQEJlZm9yZU1ldGhvZCBjYW4gZGVjbGFyZSBhIHBhcmFtZXRlciBvZiB0eXBlIDx0dD5PYmplY3RbXTwvdHQ+LiAgVGhpcyBwYXJhbWV0ZXIgd2lsbCByZWNlaXZlIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgYWJvdXQgdG8gYmUgZmVkIHRvIHRoZSB1cGNvbWluZyB0ZXN0IG1ldGhvZCwgd2hpY2ggY291bGQgYmUgZWl0aGVyIGluamVjdGVkIGJ5IFRlc3RORywgc3VjaCBhcyA8dHQ+amF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kPC90dD4gb3IgY29tZSBmcm9tIGEgPHR0PkBEYXRhUHJvdmlkZXI8L3R0Pi4KKzxsaT4KKyAgQW55IEBEYXRhUHJvdmlkZXIgY2FuIGRlY2xhcmUgYSBwYXJhbWV0ZXIgb2YgdHlwZQorICA8dHQ+SVRlc3RDb250ZXh0PC90dD4gb3IgPHR0PmphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDwvdHQ+LiAgVGhlCisgIGxhdHRlciBwYXJhbWV0ZXIgd2lsbCByZWNlaXZlIHRoZSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFib3V0IHRvIGJlIGludm9rZWQuCis8L3VsPgorCitZb3UgY2FuIHR1cm4gb2ZmIGluamVjdGlvbiB3aXRoIHRoZSA8dHQ+QE5vSW5qZWN0aW9uPC90dD4gYW5ub3RhdGlvbjoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmE7IGhpZ2hsaWdodDogWzldIj4KK3B1YmxpYyBjbGFzcyBOb0luamVjdGlvblRlc3QgeworCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJwcm92aWRlciIpCisgIHB1YmxpYyBPYmplY3RbXVtdIHByb3ZpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7IHsgQ0MuY2xhc3MuZ2V0TWV0aG9kKCJmIikgfSB9OworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gInByb3ZpZGVyIikKKyAgcHVibGljIHZvaWQgd2l0aG91dEluamVjdGlvbihATm9JbmplY3Rpb24gTWV0aG9kIG0pIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobS5nZXROYW1lKCksICJmIik7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAicHJvdmlkZXIiKQorICBwdWJsaWMgdm9pZCB3aXRoSW5qZWN0aW9uKE1ldGhvZCBtKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG0uZ2V0TmFtZSgpLCAid2l0aEluamVjdGlvbiIpOworICB9Cit9Cis8L3ByZT4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0iZ3VpY2UtZGVwZW5kZW5jeS1pbmplY3Rpb24iPkd1aWNlIGRlcGVuZGVuY3kgaW5qZWN0aW9uPC9hPjwvaDU+CisKK0lmIHlvdSB1c2UgR3VpY2UsIFRlc3RORyBnaXZlcyB5b3UgYW4gZWFzeSB3YXkgdG8gaW5qZWN0IHlvdXIgdGVzdCBvYmplY3RzIHdpdGggYSBHdWljZSBtb2R1bGU6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BHdWljZShtb2R1bGVzID0gR3VpY2VFeGFtcGxlTW9kdWxlLmNsYXNzKQorcHVibGljIGNsYXNzIEd1aWNlVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBASW5qZWN0CisgIElTaW5nbGV0b24gbV9zaW5nbGV0b247CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2luZ2xldG9uU2hvdWxkV29yaygpIHsKKyAgICBtX3NpbmdsZXRvbi5kb1NvbWV0aGluZygpOworICB9CisKK30KKzwvcHJlPgorCitJbiB0aGlzIGV4YW1wbGUsIDx0dD5HdWljZUV4YW1wbGVNb2R1bGU8L3R0PiBpcyBleHBlY3RlZCB0byBiaW5kIHRoZSBpbnRlcmZhY2UgPHR0PklTaW5nbGV0b248L3R0PiB0byBzb21lIGNvbmNyZXRlIGNsYXNzOgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgY2xhc3MgR3VpY2VFeGFtcGxlTW9kdWxlIGltcGxlbWVudHMgTW9kdWxlIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY29uZmlndXJlKEJpbmRlciBiaW5kZXIpIHsKKyAgICBiaW5kZXIuYmluZChJU2luZ2xldG9uLmNsYXNzKS50byhFeGFtcGxlU2luZ2xldG9uLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICB9CisKK30KKzwvcHJlPgorCitJZiB5b3UgbmVlZCBtb3JlIGZsZXhpYmlsaXR5IGluIHNwZWNpZnlpbmcgd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSB5b3VyIHRlc3QgY2xhc3NlcywgeW91IGNhbiBzcGVjaWZ5IGEgbW9kdWxlIGZhY3Rvcnk6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK0BHdWljZShtb2R1bGVGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeS5jbGFzcykKK3B1YmxpYyBjbGFzcyBHdWljZU1vZHVsZUZhY3RvcnlUZXN0IHsKKworICBASW5qZWN0CisgIElTaW5nbGV0b24gbV9zaW5nbGV0b247CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2luZ2xldG9uU2hvdWxkV29yaygpIHsKKyAgICBtX3NpbmdsZXRvbi5kb1NvbWV0aGluZygpOworICB9Cit9Cis8L3ByZT4KKworVGhlIG1vZHVsZSBmYWN0b3J5IG5lZWRzIHRvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSU1vZHVsZUZhY3RvcnkuaHRtbCI+SU1vZHVsZUZhY3Rvcnk8L2E+OgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVGYWN0b3J5IHsKKyAvKioKKyAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0CisgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgVGhlIHRlc3QgY2xhc3MKKyAgICoKKyAgICogQHJldHVybiBUaGUgR3VpY2UgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoaXMKKyAgICogdGVzdCBjbGFzcy4KKyAgICovCisgIE1vZHVsZSBjcmVhdGVNb2R1bGUoSVRlc3RDb250ZXh0IGNvbnRleHQsIENsYXNzJmx0Oz8mZ3Q7IHRlc3RDbGFzcyk7Cit9Cis8L3ByZT4KKworWW91ciBmYWN0b3J5IHdpbGwgYmUgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHRoZSB0ZXN0IGNvbnRleHQgYW5kIHRoZSB0ZXN0IGNsYXNzIHRoYXQgVGVzdE5HIG5lZWRzIHRvIGluc3RhbnRpYXRlLiBZb3VyIDx0dD5jcmVhdGVNb2R1bGU8L3R0PiBtZXRob2Qgc2hvdWxkIHJldHVybiBhIEd1aWNlIE1vZHVsZSB0aGF0IHdpbGwga25vdyBob3cgdG8gaW5zdGFudGlhdGUgdGhpcyB0ZXN0IGNsYXNzLiBZb3UgY2FuIHVzZSB0aGUgdGVzdCBjb250ZXh0IHRvIGZpbmQgb3V0IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBlbnZpcm9ubWVudCwgc3VjaCBhcyBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiA8dHQ+dGVzdG5nLnhtbDwvdHQ+LCBldGMuLi4KKworWW91IHdpbGwgZ2V0IGV2ZW4gbW9yZSBmbGV4aWJpbGl0eSBhbmQgR3VpY2UgcG93ZXIgd2l0aCA8dHQ+cGFyZW50LW1vZHVsZTwvdHQ+IGFuZCA8dHQ+Z3VpY2Utc3RhZ2U8L3R0PiBzdWl0ZSBwYXJhbWV0ZXJzLgorPHR0Pmd1aWNlLXN0YWdlPC90dD4gYWxsb3cgeW91IHRvIGNob3NlIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2d1aWNlL3dpa2kvQm9vdHN0cmFwIj48dHQ+U3RhZ2U8L3R0PjwvYT4gdXNlZCB0byBjcmVhdGUgdGhlIHBhcmVudCBpbmplY3Rvci4KK1RoZSBkZWZhdWx0IG9uZSBpcyA8dHQ+REVWRUxPUE1FTlQ8L3R0Pi4gT3RoZXIgYWxsb3dlZCB2YWx1ZXMgYXJlIDx0dD5QUk9EVUNUSU9OPC90dD4gYW5kIDx0dD5UT09MPC90dD4uCitIZXJlIGlzIGhvdyB5b3UgY2FuIGRlZmluZSBwYXJlbnQtbW9kdWxlIGluIHlvdXIgdGVzdC54bWwgZmlsZToKKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+Cis8c3VpdGUgcGFyZW50LW1vZHVsZT0iY29tLmV4YW1wbGUuU3VpdGVQYXJlbk1vZHVsZSIgZ3VpY2Utc3RhZ2U9IlBST0RVQ1RJT04iPgorPC9zdWl0ZT4KKzwvcHJlPgorCitUZXN0Tkcgd2lsbCBjcmVhdGUgdGhpcyBtb2R1bGUgb25seSBvbmNlIGZvciBnaXZlbiBzdWl0ZS4gV2lsbCBhbHNvIHVzZSB0aGlzIG1vZHVsZSBmb3Igb2J0YWluaW5nIGluc3RhbmNlcyBvZiB0ZXN0IHNwZWNpZmljIEd1aWNlIG1vZHVsZXMgYW5kIG1vZHVsZSBmYWN0b3JpZXMsIHRoZW4gd2lsbCBjcmVhdGUgY2hpbGQgaW5qZWN0b3IgZm9yIGVhY2ggdGVzdCBjbGFzcy4KKworV2l0aCBzdWNoIGFwcHJvYWNoIHlvdSBjYW4gZGVjbGFyZSBhbGwgY29tbW9uIGJpbmRpbmdzIGluIHBhcmVudC1tb2R1bGUgYWxzbyB5b3UgY2FuIGluamVjdCBiaW5kaW5nIGRlY2xhcmVkIGluIHBhcmVudC1tb2R1bGUgaW4gbW9kdWxlIGFuZCBtb2R1bGUgZmFjdG9yeS4gSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoaXMgZnVuY3Rpb25hbGl0eToKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcGFja2FnZSBjb20uZXhhbXBsZTsKKworcHVibGljIGNsYXNzIFBhcmVudE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmlndXJlKCkgeworICAgIGJpbmQoTXlTZXJ2aWNlLmNsYXNzKS50b1Byb3ZpZGVyKE15U2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICBiaW5kKE15Q29udGV4dC5jbGFzcykudG8oTXlDb250ZXh0SW1wbC5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgfQorfQorPC9wcmU+CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK3BhY2thZ2UgY29tLmV4YW1wbGU7CisKK3B1YmxpYyBjbGFzcyBUZXN0TW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworICBwcml2YXRlIGZpbmFsIE15Q29udGV4dCBteUNvbnRleHQ7CisKKyAgQEluamVjdAorICBUZXN0TW9kdWxlKE15Q29udGV4dCBteUNvbnRleHQpIHsKKyAgICB0aGlzLm15Q29udGV4dCA9IG15Q29udGV4dAorICB9CisgIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGJpbmQoTXlTZXNzaW9uLmNsYXNzKS50b0luc3RhbmNlKG15Q29udGV4dC5nZXRTZXNzaW9uKCkpOworICB9Cit9Cis8L3ByZT4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+Cis8c3VpdGUgcGFyZW50LW1vZHVsZT0iY29tLmV4YW1wbGUuUGFyZW50TW9kdWxlIj4KKzwvc3VpdGU+Cis8L3ByZT4KKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcGFja2FnZSBjb20uZXhhbXBsZTsKKworQFRlc3QKK0BHdWljZShtb2R1bGVzID0gVGVzdE1vZHVsZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBUZXN0Q2xhc3MgeworICBASW5qZWN0CisgIE15U2VydmljZSBteVNlcnZpY2U7CisgIEBJbmplY3QKKyAgTXlTZXNzaW9uIG15U2Vzc2lvbjsKKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlV2l0aFNlc3Npb24oKSB7CisgICAgbXlTZXJ2aWNlLnNlcnZlKG15U2Vzc2lvbik7CisgIH0KK30KKzwvcHJlPgorCitBcyB5b3Ugc2VlIFBhcmVudE1vZHVsZSBkZWNsYXJlcyBiaW5kaW5nIGZvciBNeVNlcnZpY2UgYW5kIE15Q29udGV4dCBjbGFzc2VzLiBUaGVuIE15Q29udGV4dCBpcyBpbmplY3RlZCB1c2luZyBjb25zdHJ1Y3RvciBpbmplY3Rpb24gaW50byBUZXN0TW9kdWxlIGNsYXNzLCB3aGljaCBhbHNvIGRlY2xhcmUgYmluZGluZyBmb3IgTXlTZXNzaW9uLiBUaGVuIHBhcmVudC1tb2R1bGUgaW4gdGVzdCBYTUwgZmlsZSBpcyBzZXQgdG8gUGFyZW50TW9kdWxlIGNsYXNzLCB0aGlzIGVuYWJsZXMgaW5qZWN0aW9uIGluIFRlc3RNb2R1bGUuIExhdGVyIGluIFRlc3RDbGFzcyB5b3Ugc2VlIHR3byBpbmplY3Rpb25zOgorICogTXlTZXJ2aWNlIC0gYmluZGluZyB0YWtlbiBmcm9tIFBhcmVudE1vZHVsZQorICogTXlTZXNzaW9uIC0gYmluZGluZyB0YWtlbiBmcm9tIFRlc3RNb2R1bGUKK1RoaXMgY29uZmlndXJhdGlvbiBlbnN1cmVzIHlvdSB0aGF0IGFsbCB0ZXN0cyBpbiB0aGlzIHN1aXRlIHdpbGwgYmUgcnVuIHdpdGggc2FtZSBzZXNzaW9uIGluc3RhbmNlLCB0aGUgTXlDb250ZXh0SW1wbCBvYmplY3QgaXMgb25seSBjcmVhdGVkIG9uY2UgcGVyIHN1aXRlLCB0aGlzIGdpdmUgeW91IHBvc3NpYmlsaXR5IHRvIGNvbmZpZ3VyZSBjb21tb24gZW52aXJvbm1lbnQgc3RhdGUgZm9yIGFsbCB0ZXN0cyBpbiBzdWl0ZS4gCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJTlZPS0VEIE1FVEhPRCBMSVNURU5FUlMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisJCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9Imludm9rZWRtZXRob2RsaXN0ZW5lciI+TGlzdGVuaW5nIHRvIG1ldGhvZCBpbnZvY2F0aW9uczwvYT48L2g0PgorCitUaGUgbGlzdGVuZXIgPHR0PjxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSUludm9rZWRNZXRob2RMaXN0ZW5lci5odG1sIj5JSW52b2tlZE1ldGhvZExpc3RlbmVyPC9hPjwvdHQ+IGFsbG93cyB5b3UgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgVGVzdE5HIGlzIGFib3V0IHRvIGludm9rZSBhIHRlc3QgKGFubm90YXRlZCB3aXRoIDx0dD5AVGVzdDwvdHQ+KSBvciBjb25maWd1cmF0aW9uIChhbm5vdGF0ZWQgd2l0aCBhbnkgb2YgdGhlIDx0dD5AQmVmb3JlPC90dD4gb3IgPHR0PkBBZnRlcjwvdHQ+IGFubm90YXRpb24pIG1ldGhvZC4gIFlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIGludGVyZmFjZSBJSW52b2tlZE1ldGhvZExpc3RlbmVyIGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyIHsKKyAgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCk7CisgIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCk7Cit9Cis8L3ByZT4KKworYW5kIGRlY2xhcmUgaXQgYXMgYSBsaXN0ZW5lciwgYXMgZXhwbGFpbmVkIGluIDxhIGhyZWY9IiN0ZXN0bmctbGlzdGVuZXJzIj50aGUgc2VjdGlvbiBhYm91dCBUZXN0TkcgbGlzdGVuZXJzPC9hPi4KKworPHA+CisKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIElIT09LQUJMRSBBTkQgSUNPTkZJR1VSQUJMRQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKzxoND48YSBjbGFzcz0ic2VjdGlvbiIgaW5kZW50PSIuLiIgbmFtZT0iaWhvb2thYmxlIj5PdmVycmlkaW5nIHRlc3QgbWV0aG9kczwvYT48L2g0PgorCitUZXN0TkcgYWxsb3dzIHlvdSB0byBvdmVycmlkZSBhbmQgcG9zc2libHkgc2tpcCB0aGUgaW52b2NhdGlvbiBvZiB0ZXN0IG1ldGhvZHMuIE9uZSBleGFtcGxlIG9mIHdoZXJlIHRoaXMgaXMgdXNlZnVsIGlzIGlmIHlvdSBuZWVkIHRvIHlvdXIgdGVzdCBtZXRob2RzIHdpdGggYSBzcGVjaWZpYyBzZWN1cml0eSBtYW5hZ2VyLiBZb3UgYWNoaWV2ZSB0aGlzIGJ5IHByb3ZpZGluZyBhIGxpc3RlbmVyIHRoYXQgaW1wbGVtZW50cyA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lIb29rYWJsZS5odG1sIj48dHQ+SUhvb2thYmxlPC90dD48L2E+LgorPHA+CitIZXJlIGlzIGFuIGV4YW1wbGUgd2l0aCBKQUFTOgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitwdWJsaWMgY2xhc3MgTXlIb29rIGltcGxlbWVudHMgSUhvb2thYmxlIHsKKyAgcHVibGljIHZvaWQgcnVuKGZpbmFsIElIb29rQ2FsbEJhY2sgaWNiLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgLy8gUHJlZmVyYWJseSBpbml0aWFsaXplZCBpbiBhIEBDb25maWd1cmF0aW9uIG1ldGhvZAorICAgIG15U3ViamVjdCA9IGF1dGhlbnRpY2F0ZVdpdGhKQUFzKCk7CisgICAKKyAgICBTdWJqZWN0LmRvQXMobXlTdWJqZWN0LCBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICBpY2IuY2FsbGJhY2sodGVzdFJlc3VsdCk7CisgICAgICB9CisgICAgfTsKKyAgfQorfQorPC9wcmU+CisKKzxwPgorPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIElBTFRFUlNVSVRFTElTVEVORVIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCis8aDQ+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4iIG5hbWU9ImlhbHRlcnN1aXRlIj5BbHRlcmluZyBzdWl0ZXMgKG9yKSB0ZXN0czwvYT48L2g0PgorU29tZXRpbWVzIHlvdSBtYXkgbmVlZCB0byBqdXN0IHdhbnQgdG8gYWx0ZXIgYSBzdWl0ZSAob3IpIGEgdGVzdCB0YWcgaW4gYSBzdWl0ZSB4bWwgaW4gcnVudGltZSB3aXRob3V0IGhhdmluZyB0bworY2hhbmdlIHRoZSBjb250ZW50cyBvZiBhIHN1aXRlIGZpbGUuCisKKzxwPgorQSBjbGFzc2ljIGV4YW1wbGUgZm9yIHRoaXMgd291bGQgYmUgdG8gdHJ5IGFuZCBsZXZlcmFnZSB5b3VyIGV4aXN0aW5nIHN1aXRlIGZpbGUgYW5kIHRyeSB1c2luZyBpdCBmb3Igc2ltdWxhdGluZyBhIGxvYWQgdGVzdAorb24geW91ciAiQXBwbGljYXRpb24gdW5kZXIgdGVzdCIuCitBdCB0aGUgbWluaW11bSB5b3Ugd291bGQgZW5kIHVwIGR1cGxpY2F0aW5nIHRoZSBjb250ZW50cyBvZiB5b3VyICZsdDt0ZXN0Jmd0OyB0YWcgbXVsdGlwbGUKK3RpbWVzIGFuZCBjcmVhdGUgYSBuZXcgc3VpdGUgeG1sIGZpbGUgYW5kIHdvcmsgd2l0aC4gQnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIHNjYWxlIGEgbG90LgorCis8cD4KK1Rlc3RORyBhbGxvd3MgeW91IHRvIGFsdGVyIGEgc3VpdGUgKG9yKSBhIHRlc3QgdGFnIGluIHlvdXIgc3VpdGUgeG1sIGZpbGUgYXQgcnVudGltZSB2aWEgbGlzdGVuZXJzLgorWW91IGFjaGlldmUgdGhpcyBieSBwcm92aWRpbmcgYSBsaXN0ZW5lciB0aGF0IGltcGxlbWVudHMgPGEgaHJlZj0iLi4vamF2YWRvY3Mvb3JnL3Rlc3RuZy9JQWx0ZXJTdWl0ZUxpc3RlbmVyLmh0bWwiPjx0dD5JQWx0ZXJTdWl0ZUxpc3RlbmVyPC90dD48L2E+LgorUGxlYXNlIHJlZmVyIHRvIDxhIGhyZWY9IiN0ZXN0bmctbGlzdGVuZXJzIj5MaXN0ZW5lcnMgc2VjdGlvbjwvYT4gdG8gbGVhcm4gYWJvdXQgbGlzdGVuZXJzLgorPHA+CitIZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdGhlIHN1aXRlIG5hbWUgaXMgZ2V0dGluZyBhbHRlcmVkIGluIHJ1bnRpbWU6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK3B1YmxpYyBjbGFzcyBBbHRlclN1aXRlTmFtZUxpc3RlbmVyIGltcGxlbWVudHMgSUFsdGVyU3VpdGVMaXN0ZW5lciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhbHRlcihMaXN0Jmx0O1htbFN1aXRlJmd0OyBzdWl0ZXMpIHsKKyAgICAgICAgWG1sU3VpdGUgc3VpdGUgPSBzdWl0ZXMuZ2V0KDApOworICAgICAgICBzdWl0ZS5zZXROYW1lKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9Cit9Cis8L3ByZT4KKworVGhpcyBsaXN0ZW5lciBjYW4gb25seSBiZSBhZGRlZCB3aXRoIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6IAorPHVsPgorICA8bGk+VGhyb3VnaCB0aGUgPHR0PiZsdDtsaXN0ZW5lcnMmZ3Q7PC90dD4gdGFnIGluIHRoZSBzdWl0ZSB4bWwgZmlsZS48L2xpPgorICA8bGk+VGhyb3VnaCBhIDxhIGhyZWY9IiNsaXN0ZW5lcnMtc2VydmljZS1sb2FkZXIiPlNlcnZpY2UgTG9hZGVyPC9hPjwvbGk+Cis8L3VsPgorCitUaGlzIGxpc3RlbmVyIGNhbm5vdCBiZSBhZGRlZCB0byBleGVjdXRpb24gdXNpbmcgdGhlIDx0dD5ATGlzdGVuZXJzPC90dD4gYW5ub3RhdGlvbi4KKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVEVTVCBTVUNDRVNTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKworPGgzPjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4iIG5hbWU9InRlc3QtcmVzdWx0cyI+VGVzdCByZXN1bHRzPC9hPjwvaDM+CisKKworPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJzdWNjZXNzLWZhaWx1cmUiPlN1Y2Nlc3MsIGZhaWx1cmUgYW5kIGFzc2VydDwvYT48L2g0PgorCisKKzxwPkEgdGVzdCBpcyBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgaWYgaXQgY29tcGxldGVkIHdpdGhvdXQgdGhyb3dpbmcgYW55IAorZXhjZXB0aW9uIG9yIGlmJm5ic3A7IGl0IHRocmV3IGFuIGV4Y2VwdGlvbiB0aGF0IHdhcyBleHBlY3RlZCAoc2VlIHRoZSAKK2RvY3VtZW50YXRpb24gZm9yIHRoZSA8dHQ+ZXhwZWN0ZWRFeGNlcHRpb25zPC90dD4gYXR0cmlidXRlIGZvdW5kIG9uIHRoZSA8dHQ+QFRlc3Q8L3R0PiBhbm5vdGF0aW9uKS4KKzwvcD4KKworPHA+WW91ciB0ZXN0IG1ldGhvZHMgd2lsbCB0eXBpY2FsbHkgYmUgbWFkZSBvZiBjYWxscyB0aGF0IGNhbiB0aHJvdyBhbiAKK2V4Y2VwdGlvbiwgb3Igb2YgdmFyaW91cyBhc3NlcnRpb25zICh1c2luZyB0aGUgSmF2YSAmcXVvdDthc3NlcnQmcXVvdDsga2V5d29yZCkuJm5ic3A7IEFuIAorJnF1b3Q7YXNzZXJ0JnF1b3Q7IGZhaWxpbmcgd2lsbCB0cmlnZ2VyIGFuIEFzc2VydGlvbkVycm9yRXhjZXB0aW9uLCB3aGljaCBpbiB0dXJuIHdpbGwgCittYXJrIHRoZSBtZXRob2QgYXMgZmFpbGVkIChyZW1lbWJlciB0byB1c2UgLWVhIG9uIHRoZSBKVk0gaWYgeW91IGFyZSBub3Qgc2VlaW5nIAordGhlIGFzc2VydGlvbiBlcnJvcnMpLjwvcD48cD5IZXJlIGlzIGFuIGV4YW1wbGUgdGVzdCBtZXRob2Q6PC9wPgorCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+CitAVGVzdAorcHVibGljIHZvaWQgdmVyaWZ5TGFzdE5hbWUoKSB7CisgIGFzc2VydCAiQmV1c3QiLmVxdWFscyhtX2xhc3ROYW1lKSA6ICJFeHBlY3RlZCBuYW1lIEJldXN0LCBmb3IiICsgbV9sYXN0TmFtZTsKK30KKzwvcHJlPgorCitUZXN0TkcgYWxzbyBpbmNsdWRlIEpVbml0J3MgQXNzZXJ0IGNsYXNzLCB3aGljaCBsZXRzIHlvdSBwZXJmb3JtIAorYXNzZXJ0aW9ucyBvbiBjb21wbGV4IG9iamVjdHM6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC4qOworLy8uLi4KK0BUZXN0CitwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgIGFzc2VydEVxdWFscygiQmV1c3QiLCBtX2xhc3ROYW1lKTsKK30KKzwvcHJlPgorPHA+Tm90ZSB0aGF0IHRoZSBhYm92ZSBjb2RlIHVzZSBhIHN0YXRpYyBpbXBvcnQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlCis8dHQ+YXNzZXJ0RXF1YWxzPC90dD4gbWV0aG9kIHdpdGhvdXQgaGF2aW5nIHRvIHByZWZpeCBpdCBieSBpdHMgY2xhc3MuCisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBMT0dHSU5HCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4KKzwvcD4KKworPGg0PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uIiBuYW1lPSJsb2dnaW5nIj5Mb2dnaW5nIGFuZCByZXN1bHRzPC9hPjwvaDQ+CisKK1RoZSByZXN1bHRzIG9mIHRoZSB0ZXN0IHJ1biBhcmUgY3JlYXRlZCBpbiBhIGZpbGUgY2FsbGVkIDx0dD5pbmRleC5odG1sPC90dD4gaW4gdGhlIAorZGlyZWN0b3J5IHNwZWNpZmllZCB3aGVuIGxhdW5jaGluZyBTdWl0ZVJ1bm5lci4mbmJzcDsgVGhpcyBmaWxlIHBvaW50cyB0byAKK3ZhcmlvdXMgb3RoZXIgSFRNTCBhbmQgdGV4dCBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIHJlc3VsdCBvZiB0aGUgZW50aXJlIHRlc3QgCitydW4uJm5ic3A7IFlvdSBjYW4gc2VlIGEgdHlwaWNhbCBleGFtcGxlCis8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy90ZXN0LW91dHB1dC9pbmRleC5odG1sIj5oZXJlPC9hPi4KKworPHA+CitJdCdzIHZlcnkgZWFzeSB0byBnZW5lcmF0ZSB5b3VyIG93biByZXBvcnRzIHdpdGggVGVzdE5HIHdpdGggTGlzdGVuZXJzIGFuZCBSZXBvcnRlcnM6CisKKzx1bD4KKzxsaT48Yj5MaXN0ZW5lcnM8L2I+IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSVRlc3RMaXN0ZW5lci5odG1sIj48dHQ+b3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyPC90dD48L2E+IGFuZCBhcmUgbm90aWZpZWQgaW4gcmVhbCB0aW1lIG9mIHdoZW4gYSB0ZXN0IHN0YXJ0cywgcGFzc2VzLCBmYWlscywgZXRjLi4uPC9saT48bGk+PGI+UmVwb3J0ZXJzPC9iPiBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lSZXBvcnRlci5odG1sIj48dHQ+b3JnLnRlc3RuZy5JUmVwb3J0ZXI8L3R0PjwvYT4gYW5kIGFyZSBub3RpZmllZCB3aGVuIGFsbCB0aGUgc3VpdGVzIGhhdmUgYmVlbiBydW4gYnkgVGVzdE5HLiAgVGhlIElSZXBvcnRlciBpbnN0YW5jZSByZWNlaXZlcyBhIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHRoZSBlbnRpcmUgdGVzdCBydW4uPC9saT48L3VsPkZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSBhIFBERiByZXBvcnQgb2YgeW91ciB0ZXN0IHJ1biwgeW91IGRvbid0IG5lZWQgdG8gYmUgbm90aWZpZWQgaW4gcmVhbCB0aW1lIG9mIHRoZSB0ZXN0IHJ1biBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBhbiA8dHQ+SVJlcG9ydGVyPC90dD4uICBJZiB5b3UnZCBsaWtlIHRvIHdyaXRlIGEgcmVhbC10aW1lIHJlcG9ydGluZyBvZiB5b3VyIHRlc3RzLCBzdWNoIGFzIGEgR1VJIHdpdGggYSBwcm9ncmVzcyBiYXIgb3IgYSB0ZXh0IHJlcG9ydGVyIGRpc3BsYXlpbmcgZG90cyAoIi4iKSBhcyBlYWNoIHRlc3QgaXMgaW52b2tlZCAoYXMgaXMgZXhwbGFpbmVkIGJlbG93KSwgPHR0PklUZXN0TGlzdGVuZXI8L3R0PiBpcyB5b3VyIGJlc3QgY2hvaWNlLgorCis8aDU+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4uIiBuYW1lPSJsb2dnaW5nLWxpc3RlbmVycyI+TG9nZ2luZyBMaXN0ZW5lcnM8L2E+PC9oNT4KKworSGVyZSBpcyBhIGxpc3RlbmVyIHRoYXQgZGlzcGxheXMgYSAiLiIgZm9yIGVhY2ggcGFzc2VkIHRlc3QsIGEgIkYiIGZvciBlYWNoIGZhaWx1cmUgYW5kIGEgIlMiIGZvciBlYWNoIHNraXA6CisKKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIj4KK3B1YmxpYyBjbGFzcyBEb3RUZXN0TGlzdGVuZXIgZXh0ZW5kcyBUZXN0TGlzdGVuZXJBZGFwdGVyIHsKKyAgcHJpdmF0ZSBpbnQgbV9jb3VudCA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBsb2coIkYiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbG9nKCJTIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCB0cikgeworICAgIGxvZygiLiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludChzdHJpbmcpOworICAgIGlmICgrK21fY291bnQgJSA0MCA9PSAwKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgIH0KKyAgfQorfSAKKzwvcHJlPgorCitJbiB0aGlzIGV4YW1wbGUsIEkgY2hvc2UgdG8gZXh0ZW5kIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvVGVzdExpc3RlbmVyQWRhcHRlci5odG1sIj48dHQ+VGVzdExpc3RlbmVyQWRhcHRlcjwvdHQ+PC9hPiwgd2hpY2ggaW1wbGVtZW50cyA8YSBocmVmPSIuLi9qYXZhZG9jcy9vcmcvdGVzdG5nL0lUZXN0TGlzdGVuZXIuaHRtbCI+PHR0PklUZXN0TGlzdGVuZXI8L3R0PjwvYT4gd2l0aCBlbXB0eSBtZXRob2RzLCBzbyBJIGRvbid0IGhhdmUgdG8gb3ZlcnJpZGUgb3RoZXIgbWV0aG9kcyBmcm9tIHRoZSBpbnRlcmZhY2UgdGhhdCBJIGhhdmUgbm8gaW50ZXJlc3QgaW4uICBZb3UgY2FuIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGRpcmVjdGx5IGlmIHlvdSBwcmVmZXIuCisKKzxwPgorSGVyZSBpcyBob3cgSSBpbnZva2UgVGVzdE5HIHRvIHVzZSB0aGlzIG5ldyBsaXN0ZW5lcjoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+U2hlbGw8L2gzPgorPHByZSBjbGFzcz0iYnJ1c2g6IHRleHQiPgoramF2YSAtY2xhc3NwYXRoIHRlc3RuZy5qYXI7JUNMQVNTUEFUSCUgb3JnLnRlc3RuZy5UZXN0TkcgLWxpc3RlbmVyIG9yZy50ZXN0bmcucmVwb3J0ZXJzLkRvdFRlc3RMaXN0ZW5lciB0ZXN0XHRlc3RuZy54bWwKKzwvcHJlPgorCithbmQgdGhlIG91dHB1dDoKKworPHA+CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPlNoZWxsPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB0ZXh0Ij4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUZXN0TkcgSkRLIDEuNQorVG90YWwgdGVzdHMgcnVuOiAyMjYsIEZhaWx1cmVzOiAwLCBTa2lwczogMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzwvcHJlPgorCitOb3RlIHRoYXQgd2hlbiB5b3UgdXNlIDx0dD4tbGlzdGVuZXI8L3R0PiwgVGVzdE5HIHdpbGwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbGlzdGVuZXIgeW91IHdhbnQgdG8gdXNlLgorCis8aDU+PGEgY2xhc3M9InNlY3Rpb24iIGluZGVudD0iLi4uIiBuYW1lPSJsb2dnaW5nLXJlcG9ydGVycyI+TG9nZ2luZyBSZXBvcnRlcnM8L2E+PC9oNT4KKworVGhlIDxhIGhyZWY9Ii4uL2phdmFkb2NzL29yZy90ZXN0bmcvSVJlcG9ydGVyLmh0bWwiPjx0dD5vcmcudGVzdG5nLklSZXBvcnRlcjwvdHQ+PC9hPiBpbnRlcmZhY2Ugb25seSBoYXMgb25lIG1ldGhvZDoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdCZsdDtJU3VpdGU8L2E+Jmd0OyBzdWl0ZXMsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkpCis8L3ByZT4KKworVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGJ5IFRlc3RORyB3aGVuIGFsbCB0aGUgc3VpdGVzIGhhdmUgYmVlbiBydW4gYW5kIHlvdSBjYW4gaW5zcGVjdCBpdHMgcGFyYW1ldGVycyB0byBhY2Nlc3MgYWxsIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcnVuIHRoYXQgd2FzIGp1c3QgY29tcGxldGVkLgorCis8cD4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0ibG9nZ2luZy1qdW5pdHJlcG9ydHMiPkpVbml0UmVwb3J0czwvYT48L2g1PgorCis8cD4KKworCitUZXN0TkcgY29udGFpbnMgYSBsaXN0ZW5lciB0aGF0IHRha2VzIHRoZSBUZXN0TkcgcmVzdWx0cyAKK2FuZCBvdXRwdXRzIGFuIFhNTCBmaWxlIHRoYXQgY2FuIHRoZW4gYmUgZmVkIHRvIEpVbml0UmVwb3J0LiAgPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvdGVzdC1yZXBvcnQvanVuaXQtbm9mcmFtZXMuaHRtbCI+CitIZXJlPC9hPiBpcyBhbiBleGFtcGxlLCBhbmQgdGhlIGFudCB0YXNrIHRvIGNyZWF0ZSB0aGlzIHJlcG9ydDoKKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+YnVpbGQueG1sPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiB4bWwiPgorJmx0O3RhcmdldCBuYW1lPSJyZXBvcnRzIiZndDsKKyAgJmx0O2p1bml0cmVwb3J0IHRvZGlyPSJ0ZXN0LXJlcG9ydCImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJ0ZXN0LW91dHB1dCImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLyoueG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworIAorICAgICZsdDtyZXBvcnQgZm9ybWF0PSJub2ZyYW1lcyIgIHRvZGlyPSJ0ZXN0LXJlcG9ydCIvJmd0OworICAmbHQ7L2p1bml0cmVwb3J0Jmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT4KKzxibG9ja3F1b3RlPgorCTxlbT5Ob3RlOiZuYnNwOyBhIGN1cnJlbnQgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIEpESyAxLjUgYW5kIEpVbml0UmVwb3J0cyAKK3ByZXZlbnRzIHRoZSBmcmFtZSB2ZXJzaW9uIGZyb20gd29ya2luZywgc28geW91IG5lZWQgdG8gc3BlY2lmeSAmcXVvdDtub2ZyYW1lcyZxdW90OyB0byAKK2dldCB0aGlzIHRvIHdvcmsgZm9yIG5vdy48L2VtPgorCTwvYmxvY2txdW90ZT4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0ibG9nZ2luZy1yZXBvcnRlci1hcGkiPlJlcG9ydGVyIEFQSTwvYT48L2g1PgorCis8cD4KK0lmIHlvdSBuZWVkIHRvIGxvZyBtZXNzYWdlcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIHJlcG9ydHMsIHlvdSBjYW4gdXNlIHRoZSBjbGFzcyA8dHQ+PGEgaHJlZj0iLi4vamF2YWRvY3Mvb3JnL3Rlc3RuZy9SZXBvcnRlci5odG1sIj5vcmcudGVzdG5nLlJlcG9ydGVyPC9hPjwvdHQ+OgorCis8YmxvY2txdW90ZSBjbGFzcz0iYnJ1c2g6IHRleHQiPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvZm9udD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+UmVwb3J0ZXIubG9nPC9mb250Pjxmb250IGNvbG9yPSIjMDAwMDAwIj4oPC9mb250Pjxmb250IGNvbG9yPSIjMmEwMGZmIj4mIzM0O00zIFdBUyBDQUxMRUQmIzM0OzwvZm9udD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+KTwvZm9udD48Zm9udCBjb2xvcj0iIzAwMDAwMCI+OzwvZm9udD4KKworPC9ibG9ja3F1b3RlPgorCis8cCBhbGlnbj0iY2VudGVyIj4KKworPGltZyBzcmM9InBpY3Mvc2hvdy1vdXRwdXQxLnBuZyIgLz4KKzxpbWcgc3JjPSJwaWNzL3Nob3ctb3V0cHV0Mi5wbmciIC8+CisKKzwvcD4KKworPGg1PjxhIGNsYXNzPSJzZWN0aW9uIiBpbmRlbnQ9Ii4uLiIgbmFtZT0ibG9nZ2luZy14bWwtcmVwb3J0cyI+WE1MIFJlcG9ydHM8L2E+PC9oNT4KKworPHA+CitUZXN0Tkcgb2ZmZXJzIGFuIFhNTCByZXBvcnRlciBjYXB0dXJpbmcgVGVzdE5HIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiBKVW5pdCByZXBvcnRzLiBUaGlzIGlzIHBhcnRpY3VsYXJ5IHVzZWZ1bCB3aGVuIHRoZSB1c2VyJ3MgdGVzdCBlbnZpcm9ubWVudCBuZWVkcyB0byBjb25zdW1lIFhNTCByZXN1bHRzIHdpdGggVGVzdE5HLXNwZWNpZmljIGRhdGEgdGhhdCB0aGUgSlVuaXQgZm9ybWF0IGNhbid0IHByb3ZpZGUuICBCZWxvdyBpcyBhIHNhbXBsZSBvZiB0aGUgb3V0cHV0IG9mIHN1Y2ggYSByZXBvcnRlcjoKKzwvcD4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7dGVzdG5nLXJlc3VsdHMmZ3Q7CisgICZsdDtzdWl0ZSBuYW1lPSZxdW90O1N1aXRlMSZxdW90OyZndDsKKyAgICAmbHQ7Z3JvdXBzJmd0OworICAgICAgJmx0O2dyb3VwIG5hbWU9JnF1b3Q7Z3JvdXAxJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7bWV0aG9kIHNpZ25hdHVyZT0mcXVvdDtjb20udGVzdC5UZXN0T25lLnRlc3QyKCkmcXVvdDsgbmFtZT0mcXVvdDt0ZXN0MiZxdW90OyBjbGFzcz0mcXVvdDtjb20udGVzdC5UZXN0T25lJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O21ldGhvZCBzaWduYXR1cmU9JnF1b3Q7Y29tLnRlc3QuVGVzdE9uZS50ZXN0MSgpJnF1b3Q7IG5hbWU9JnF1b3Q7dGVzdDEmcXVvdDsgY2xhc3M9JnF1b3Q7Y29tLnRlc3QuVGVzdE9uZSZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7L2dyb3VwJmd0OworICAgICAgJmx0O2dyb3VwIG5hbWU9JnF1b3Q7Z3JvdXAyJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7bWV0aG9kIHNpZ25hdHVyZT0mcXVvdDtjb20udGVzdC5UZXN0T25lLnRlc3QyKCkmcXVvdDsgbmFtZT0mcXVvdDt0ZXN0MiZxdW90OyBjbGFzcz0mcXVvdDtjb20udGVzdC5UZXN0T25lJnF1b3Q7LyZndDsKKyAgICAgICZsdDsvZ3JvdXAmZ3Q7CisgICAgJmx0Oy9ncm91cHMmZ3Q7CisgICAgJmx0O3Rlc3QgbmFtZT0mcXVvdDt0ZXN0MSZxdW90OyZndDsKKyAgICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O2NvbS50ZXN0LlRlc3RPbmUmcXVvdDsmZ3Q7CisgICAgICAgICZsdDt0ZXN0LW1ldGhvZCBzdGF0dXM9JnF1b3Q7RkFJTCZxdW90OyBzaWduYXR1cmU9JnF1b3Q7dGVzdDEoKSZxdW90OyBuYW1lPSZxdW90O3Rlc3QxJnF1b3Q7IGR1cmF0aW9uLW1zPSZxdW90OzAmcXVvdDsKKyAgICAgICAgICAgICAgc3RhcnRlZC1hdD0mcXVvdDsyMDA3LTA1LTI4VDEyOjE0OjM3WiZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtzb21lRGVzY3JpcHRpb24yJnF1b3Q7CisgICAgICAgICAgICAgIGZpbmlzaGVkLWF0PSZxdW90OzIwMDctMDUtMjhUMTI6MTQ6MzdaJnF1b3Q7Jmd0OworICAgICAgICAgICZsdDtleGNlcHRpb24gY2xhc3M9JnF1b3Q7amF2YS5sYW5nLkFzc2VydGlvbkVycm9yJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O3Nob3J0LXN0YWNrdHJhY2UmZ3Q7CisgICAgICAgICAgICAgICZsdDshW0NEQVRBWworICAgICAgICAgICAgICAgIGphdmEubGFuZy5Bc3NlcnRpb25FcnJvcgorICAgICAgICAgICAgICAgIC4uLiBSZW1vdmVkIDIyIHN0YWNrIGZyYW1lcworICAgICAgICAgICAgICBdXSZndDsKKyAgICAgICAgICAgICZsdDsvc2hvcnQtc3RhY2t0cmFjZSZndDsKKyAgICAgICAgICAmbHQ7L2V4Y2VwdGlvbiZndDsKKyAgICAgICAgJmx0Oy90ZXN0LW1ldGhvZCZndDsKKyAgICAgICAgJmx0O3Rlc3QtbWV0aG9kIHN0YXR1cz0mcXVvdDtQQVNTJnF1b3Q7IHNpZ25hdHVyZT0mcXVvdDt0ZXN0MigpJnF1b3Q7IG5hbWU9JnF1b3Q7dGVzdDImcXVvdDsgZHVyYXRpb24tbXM9JnF1b3Q7MCZxdW90OworICAgICAgICAgICAgICBzdGFydGVkLWF0PSZxdW90OzIwMDctMDUtMjhUMTI6MTQ6MzdaJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O3NvbWVEZXNjcmlwdGlvbjEmcXVvdDsKKyAgICAgICAgICAgICAgZmluaXNoZWQtYXQ9JnF1b3Q7MjAwNy0wNS0yOFQxMjoxNDozN1omcXVvdDsmZ3Q7CisgICAgICAgICZsdDsvdGVzdC1tZXRob2QmZ3Q7CisgICAgICAgICZsdDt0ZXN0LW1ldGhvZCBzdGF0dXM9JnF1b3Q7UEFTUyZxdW90OyBzaWduYXR1cmU9JnF1b3Q7c2V0VXAoKSZxdW90OyBuYW1lPSZxdW90O3NldFVwJnF1b3Q7IGlzLWNvbmZpZz0mcXVvdDt0cnVlJnF1b3Q7IGR1cmF0aW9uLW1zPSZxdW90OzE1JnF1b3Q7CisgICAgICAgICAgICAgIHN0YXJ0ZWQtYXQ9JnF1b3Q7MjAwNy0wNS0yOFQxMjoxNDozN1omcXVvdDsgZmluaXNoZWQtYXQ9JnF1b3Q7MjAwNy0wNS0yOFQxMjoxNDozN1omcXVvdDsmZ3Q7CisgICAgICAgICZsdDsvdGVzdC1tZXRob2QmZ3Q7CisgICAgICAmbHQ7L2NsYXNzJmd0OworICAgICZsdDsvdGVzdCZndDsKKyAgJmx0Oy9zdWl0ZSZndDsKKyZsdDsvdGVzdG5nLXJlc3VsdHMmZ3Q7Cis8L3ByZT4KKzxwPlRoaXMgcmVwb3J0ZXIgaXMgaW5qZWN0ZWQgYWxvbmcgd2l0aCB0aGUgb3RoZXIgZGVmYXVsdCBsaXN0ZW5lcnMgc28geW91IGNhbiBnZXQgdGhpcyB0eXBlIG9mIG91dHB1dCBieSBkZWZhdWx0LiBUaGUgbGlzdGVuZXIgcHJvdmlkZXMgc29tZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIHR3ZWFrIHRoZSByZXBvcnRlciB0byBmaXQgeW91ciBuZWVkcy4gVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyBhIGxpc3Qgb2YgdGhlc2UgcHJvcGVydGllcyB3aXRoIGEgc2hvcnQgZXhwbGFuYXRpb246Cis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgaWQ9InRhYmxlNiI+CisgIDx0cj4KKyAgICA8dGg+UHJvcGVydHk8L3RoPgorICAgIDx0aD5Db21tZW50PC90aD4KKyAgICA8dGg+RGVmYXVsdCB2YWx1ZTwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b3V0cHV0RGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+QSA8dHQ+U3RyaW5nPC90dD4gaW5kaWNhdGluZyB0aGUgZGlyZWN0b3J5IHdoZXJlIHNob3VsZCB0aGUgWE1MIGZpbGVzIGJlIG91dHB1dGVkLjwvdGQ+CisgICAgPHRkPlRoZSBUZXN0Tkcgb3V0cHV0IGRpcmVjdG9yeTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dGltZXN0YW1wRm9ybWF0PC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgZGF0ZSBmaWVsZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoaXMgcmVwb3J0ZXI8L3RkPgorICAgIDx0ZD55eXl5LU1NLWRkJ1QnSEg6bW06c3MnWic8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZpbGVGcmFnbWVudGF0aW9uTGV2ZWw8L3RkPgorICAgIDx0ZD5BbiBpbnRlZ2VyIGhhdmluZyB0aGUgdmFsdWVzIDEsIDIgb3IgMywgaW5kaWNhdGluZyB0aGUgd2F5IHRoYXQgdGhlIFhNTCBmaWxlcyBhcmUgZ2VuZXJhdGVkOgorICAgICAgPGJyPgorPHByZT4KKyAgIDEgLSB3aWxsIGdlbmVyYXRlIGFsbCB0aGUgcmVzdWx0cyBpbiBvbmUgZmlsZS4KKyAgIDIgLSBlYWNoIHN1aXRlIGlzIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIFhNTCBmaWxlIHRoYXQgaXMgbGlua2VkIHRvIHRoZSBtYWluIGZpbGUuCisgICAzIC0gc2FtZSBhcyAyIHBsdXMgc2VwYXJhdGUgZmlsZXMgZm9yIHRlc3QtY2FzZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIHRoZSBzdWl0ZSBmaWxlcy4KKzwvcHJlPgorICAgIDwvdGQ+CisgICAgPHRkPjE8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNwbGl0Q2xhc3NBbmRQYWNrYWdlTmFtZXM8L3RkPgorICAgIDx0ZD5UaGlzIGJvb2xlYW4gc3BlY2lmaWVzIHRoZSB3YXkgdGhhdCBjbGFzcyBuYW1lcyBhcmUgZ2VuZXJhdGVkIGZvciB0aGUgPHR0PiZsdDtjbGFzcyZndDs8L3R0PiBlbGVtZW50LgorICAgICAgRm9yIGV4YW1wbGUsIHlvdSB3aWxsIGdldCA8dHQ+Jmx0O2NsYXNzIGNsYXNzPSJjb20udGVzdC5NeVRlc3QiJmd0OzwvdHQ+IGZvciBmYWxzZSBhbmQgPHR0PiZsdDtjbGFzcyBjbGFzcz0iTXlUZXN0IiBwYWNrYWdlPSJjb20udGVzdCImZ3Q7PC90dD4gZm9yIHRydWUuCisgICAgPC90ZD4KKyAgICA8dGQ+ZmFsc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmdlbmVyYXRlR3JvdXBzQXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+QSBib29sZWFuIGluZGljYXRpbmcgaWYgYSA8dHQ+Z3JvdXBzPC90dD4gYXR0cmlidXRlIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSA8dHQ+Jmx0O3Rlc3QtbWV0aG9kJmd0OzwvdHQ+IGVsZW1lbnQuIFRoaXMgZmVhdHVyZSBhaW1zIGF0IHByb3ZpZGluZyBhCisgICAgICBzdHJhaWdodC1mb3J3YXJkIG1ldGhvZCBvZiByZXRyaWV2aW5nIHRoZSBncm91cHMgdGhhdCBpbmNsdWRlIGEgdGVzdCBtZXRob2Qgd2l0aG91dCBoYXZpbmcgdG8gc3VyZiB0aHJvdWdoIHRoZSA8dHQ+Jmx0O2dyb3VwJmd0OzwvdHQ+IGVsZW1lbnRzLgorICAgIDwvdGQ+CisgICAgPHRkPmZhbHNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5nZW5lcmF0ZVRlc3RSZXN1bHRBdHRyaWJ1dGVzPC90ZD4KKyAgICA8dGQ+CisgICAgICBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhbiA8dHQ+Jmx0O2F0dHJpYnV0ZXMmZ3Q7PC90dD4gdGFnIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGVhY2ggPHR0PiZsdDt0ZXN0LW1ldGhvZCZndDs8L3R0PiBlbGVtZW50LCBjb250YWluaW5nIHRoZSB0ZXN0IHJlc3VsdAorICAgICAgYXR0cmlidXRlcyAoU2VlIDx0dD5JVGVzdFJlc3VsdC5zZXRBdHRyaWJ1dGUoKTwvdHQ+IGFib3V0IHNldHRpbmcgdGVzdCByZXN1bHQgYXR0cmlidXRlcykuIEVhY2ggYXR0cmlidXRlIDx0dD50b1N0cmluZygpPC90dD4gcmVwcmVzZW50YXRpb24gd2lsbCBiZQorICAgICAgd3JpdHRlbiBpbiBhIDx0dD4mbHQ7YXR0cmlidXRlIG5hbWU9IlthdHRyaWJ1dGUgbmFtZV0iJmd0OzwvdHQ+IHRhZy4KKyAgICA8L3RkPgorICAgIDx0ZD5mYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3RhY2tUcmFjZU91dHB1dE1ldGhvZDwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBzdGFjayB0cmFjZSB0aGF0IGlzIHRvIGJlIGdlbmVyYXRlZCBmb3IgZXhjZXB0aW9ucyBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgICAgPGJyPgorPHByZT4KKyAgIDAgLSBubyBzdGFja3RyYWNlIChqdXN0IEV4Y2VwdGlvbiBjbGFzcyBhbmQgbWVzc2FnZSkuCisgICAxIC0gYSBzaG9ydCB2ZXJzaW9uIG9mIHRoZSBzdGFjayB0cmFjZSBrZWVwaW5nIGp1c3QgYSBmZXcgbGluZXMgZnJvbSB0aGUgdG9wCisgICAyIC0gdGhlIGNvbXBsZXRlIHN0YWNrdHJhY2Ugd2l0aCBhbGwgdGhlIGlubmVyIGV4Y2VwdGlvbnMKKyAgIDMgLSBib3RoIHNob3J0IGFuZCBsb25nIHN0YWNrdHJhY2UKKzwvcHJlPgorICAgIDwvdGQ+CisgICAgPHRkPjI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmdlbmVyYXRlRGVwZW5kc09uTWV0aG9kczwvdGQ+CisgICAgPHRkPlVzZSB0aGlzIGF0dHJpYnV0ZSB0byBlbmFibGUvZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIDx0dD5kZXBlbmRzLW9uLW1ldGhvZHM8L3R0PiBhdHRyaWJ1dGUgZm9yIHRoZSA8dHQ+Jmx0O3Rlc3QtbWV0aG9kJmd0OzwvdHQ+IGVsZW1lbnQuCisgICAgPC90ZD4KKyAgICA8dGQ+dHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Z2VuZXJhdGVEZXBlbmRzT25Hcm91cHM8L3RkPgorICAgIDx0ZD5FbmFibGUvZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIDx0dD5kZXBlbmRzLW9uLWdyb3VwczwvdHQ+IGF0dHJpYnV0ZSBmb3IgdGhlIDx0dD4mbHQ7dGVzdC1tZXRob2QmZ3Q7PC90dD4gZWxlbWVudC4KKyAgICA8L3RkPgorICAgIDx0ZD50cnVlPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KKyAgSW4gb3JkZXIgdG8gY29uZmlndXJlIHRoaXMgcmVwb3J0ZXIgeW91IGNhbiB1c2UgdGhlIDx0dD4tcmVwb3J0ZXI8L3R0PiBvcHRpb24gaW4gdGhlIGNvbW1hbmQgbGluZSBvciB0aGUgPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvZG9jL2FudC5odG1sIj5BbnQ8L2E+CisgIHRhc2sgd2l0aCB0aGUgbmVzdGVkIDx0dD4mbHQ7cmVwb3J0ZXImZ3Q7PC90dD4gZWxlbWVudC4gRm9yIGVhY2ggb2YgdGhlc2UgeW91IG11c3Qgc3BlY2lmeSB0aGUgY2xhc3MgPHR0Pm9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyPC90dD4uCisgIFBsZWFzZSBub3RlIHRoYXQgeW91IGNhbm5vdCBjb25maWd1cmUgdGhlIGJ1aWx0LWluIHJlcG9ydGVyIGJlY2F1c2UgdGhpcyBvbmUgd2lsbCBvbmx5IHVzZSBkZWZhdWx0IHNldHRpbmdzLiBJZiB5b3UgbmVlZCBqdXN0IHRoZSBYTUwgcmVwb3J0IHdpdGggY3VzdG9tIHNldHRpbmdzCisgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIGl0IG1hbnVhbGx5IHdpdGggb25lIG9mIHRoZSB0d28gbWV0aG9kcyBhbmQgZGlzYWJsZSB0aGUgZGVmYXVsdCBsaXN0ZW5lcnMuCis8L3A+CisKKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFlBTUwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCis8aDM+PGEgY2xhc3M9InNlY3Rpb24iIG5hbWU9InlhbWwiPllBTUw8L2E+PC9oMz4KKworVGVzdE5HIHN1cHBvcnRzIDxhIGhyZWY9Imh0dHA6Ly93d3cueWFtbC5vcmcvIj5ZQU1MPC9hPiBhcyBhbiBhbHRlcm5hdGUgd2F5IG9mIHNwZWNpZnlpbmcgeW91ciBzdWl0ZSBmaWxlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBYTUwgZmlsZToKKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vYmV1c3QuY29tL3Rlc3RuZy90ZXN0bmctMS4wLmR0ZCIgPgorCis8c3VpdGUgbmFtZT0iU2luZ2xlU3VpdGUiIHZlcmJvc2U9IjIiIHRocmVhZC1jb3VudD0iNCIgPgorCisgICZsdDtwYXJhbWV0ZXIgbmFtZT0ibiIgdmFsdWU9IjQyIiAvJmd0OworCisgIDx0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24yIj4KKyAgICA8Z3JvdXBzPgorICAgICAgPHJ1bj4KKyAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iYnJva2VuIiAvJmd0OworICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisKKyAgICA8Y2xhc3Nlcz4KKyAgICAgICZsdDtjbGFzcyBuYW1lPSJ0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0IiAvJmd0OworICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KKzwvcHJlPgorPHA+YW5kIGhlcmUgaXMgaXRzIFlBTUwgdmVyc2lvbjo8L3A+Cis8cHJlIGNsYXNzPSJicnVzaDogcGxhaW4iPgorbmFtZTogU2luZ2xlU3VpdGUKK3RocmVhZENvdW50OiA0CitwYXJhbWV0ZXJzOiB7IG46IDQyIH0KKwordGVzdHM6CisgIC0gbmFtZTogUmVncmVzc2lvbjIKKyAgICBwYXJhbWV0ZXJzOiB7IGNvdW50OiAxMCB9CisgICAgZXhjbHVkZWRHcm91cHM6IFsgYnJva2VuIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0Cis8L3ByZT4KKworSGVyZSBpcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9ibG9iL21hc3Rlci9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLnhtbCI+VGVzdE5HJ3Mgb3duIHN1aXRlIGZpbGU8L2E+LCBhbmQgaXRzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nL2Jsb2IvbWFzdGVyL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmcueWFtbCI+WUFNTCBjb3VudGVycGFydDwvYT4uCisKKzxwPgorCitZb3UgbWlnaHQgZmluZCB0aGUgWUFNTCBmaWxlIGZvcm1hdCBlYXNpZXIgdG8gcmVhZCBhbmQgdG8gbWFpbnRhaW4uIFlBTUwgZmlsZXMgYXJlIGFsc28gcmVjb2duaXplZCBieSB0aGUgVGVzdE5HIEVjbGlwc2UgcGx1Zy1pbi4gWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgWUFNTCBhbmQgVGVzdE5HIGluIHRoaXMgPGEgaHJlZj0iaHR0cDovL2JldXN0LmNvbS93ZWJsb2cvMjAxMC8wOC8xNS95YW1sLXRoZS1mb3Jnb3R0ZW4tdmljdGltLW9mLXRoZS1mb3JtYXQtd2Fycy8iPmJsb2cgcG9zdDwvYT4uCisKKworPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCis8YSBuYW1lPSJ0ZXN0bmctZHRkIj4KKyZuYnNwOzxociB3aWR0aD0iMTAwJSI+Cis8cD5CYWNrIHRvIG15IDxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vd2VibG9nIj5ob21lIHBhZ2U8L2E+LjwvcD48cD5PciBjaGVjayBvdXQgc29tZSBvZiBteSBvdGhlciBwcm9qZWN0czo8L3A+PHVsPgorCTxsaT48YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL2VqYmdlbiI+RUpCR2VuPC9hPjombmJzcDsgYW4gRUpCIHRhZyAKKwlnZW5lcmF0b3IuPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmciPlRlc3RORzwvYT46Jm5ic3A7IEEgdGVzdGluZyBmcmFtZXdvcmsgdXNpbmcgYW5ub3RhdGlvbnMsIHRlc3QgZ3JvdXBzIGFuZCBtZXRob2QgcGFyYW1ldGVycy4gPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9kb2NsaXBzZSI+RG9jbGlwc2U8L2E+OiZuYnNwOyBhIEphdmFEb2MgdGFnIAorCUVjbGlwc2UgcGx1Zy1pbi48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL2oxNSI+SjE1PC9hPjombmJzcDsgYW4gRWNsaXBzZSBwbHVnLWluIHRvIGhlbHAgCisJeW91IG1pZ3JhdGUgeW91ciBjb2RlIHRvIHRoZSBuZXcgSkRLIDEuNSBjb25zdHJ1Y3RzLjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc2dlbiI+U0dlbjwvYT46Jm5ic3A7IGEgcmVwbGFjZW1lbnQgZm9yIAorCVhEb2NsZXQgd2l0aCBhbiBlYXN5IHBsdWctaW4gYXJjaGl0ZWN0dXJlLjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vY2FudmFzIj5DYW52YXM8L2E+OiZuYnNwOyBhIHRlbXBsYXRlIGdlbmVyYXRvciAKKwliYXNlZCBvbiB0aGUgR3Jvb3Z5IGxhbmd1YWdlLjwvbGk+PC91bD48cD4KKzwvcD4KKworPHNjcmlwdCBzcmM9Imh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitfdWFjY3QgPSAiVUEtMjM4MjE1LTIiOwordXJjaGluVHJhY2tlcigpOworPC9zY3JpcHQ+CisJCmRpZmYgLS1naXQgYS9kb2MvZG93bmxvYWQuaHRtbCBiL2RvYy9kb3dubG9hZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjA0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG93bmxvYWQuaHRtbApAQCAtMCwwICsxLDEyMyBAQAorPGh0bWw+DQorICAgIDxoZWFkPg0KKyAgICAgICAgPHRpdGxlPlRlc3RORyAtIERvd25sb2FkIEN1cnJlbnQgUmVsZWFzZSBhbmQgQmV0YSBWZXJzaW9uczwvdGl0bGU+DQorDQorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRlc3RuZy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPg0KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9iZXVzdC5jc3MiICAvPg0KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYmFubmVyLmpzIj48L3NjcmlwdD4NCisNCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hDb3JlLmpzIj48L3NjcmlwdD4NCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaEphdmEuanMiPjwvc2NyaXB0Pg0KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoWG1sLmpzIj48L3NjcmlwdD4NCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaEJhc2guanMiPjwvc2NyaXB0Pg0KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoUGxhaW4uanMiPjwvc2NyaXB0Pg0KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoQ29yZS5jc3MiLz4NCisgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL3N0eWxlcy9zaFRoZW1lQ2VkcmljLmNzcyIvPg0KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmNvbmZpZy5jbGlwYm9hcmRTd2YgPSAnc2NyaXB0cy9jbGlwYm9hcmQuc3dmJzsNCisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmRlZmF1bHRzWydndXR0ZXInXSA9IGZhbHNlOw0KKyAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuYWxsKCk7DQorICAgICAgPC9zY3JpcHQ+DQorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS90b2MuanMiPjwvc2NyaXB0Pg0KKw0KKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCisgICAgICAgICAgICAvKiBTZXQgdGhlIGNvbW1hbmQtbGluZSB0YWJsZSBvcHRpb24gY29sdW1uIHdpZHRoLiAqLw0KKyAgICAgICAgICAgICNjb21tYW5kLWxpbmUgY29sZ3JvdXAub3B0aW9uIHsNCisgICAgICAgICAgICAgICAgIHdpZHRoOiA3ZW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgPC9zdHlsZQ0KKyAgICAgIDwvaGVhZD4NCis8Ym9keSBvbmxvYWQ9InByZXR0eVByaW50KCkiPg0KKw0KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisgICAgZGlzcGxheU1lbnUoImRvd25sb2FkLmh0bWwiKQ0KKzwvc2NyaXB0Pg0KKw0KKw0KKzxoMiBhbGlnbj0iY2VudGVyIj5Eb3dubG9hZGluZyBUZXN0Tkc8L2gyPg0KKw0KKzxoMz5DdXJyZW50IFJlbGVhc2UgVmVyc2lvbjwvaDM+DQorDQorPGg0Pk1hdmVuPC9oND4NCisNCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4NCisgICAgJmx0O3JlcG9zaXRvcmllcyZndDsNCisgICAgICAmbHQ7cmVwb3NpdG9yeSZndDsNCisgICAgICAgICZsdDtpZCZndDtjZW50cmFsJmx0Oy9pZCZndDsNCisgICAgICAgICZsdDtuYW1lJmd0O2JpbnRyYXkmbHQ7L25hbWUmZ3Q7DQorICAgICAgICAmbHQ7dXJsJmd0O2h0dHA6Ly9qY2VudGVyLmJpbnRyYXkuY29tJmx0Oy91cmwmZ3Q7DQorICAgICAgJmx0Oy9yZXBvc2l0b3J5Jmd0Ow0KKyAgICAmbHQ7L3JlcG9zaXRvcmllcyZndDsNCisNCisgICAgJmx0O2RlcGVuZGVuY3kmZ3Q7DQorICAgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLnRlc3RuZyZsdDsvZ3JvdXBJZCZndDsNCisgICAgICAmbHQ7YXJ0aWZhY3RJZCZndDt0ZXN0bmcmbHQ7L2FydGlmYWN0SWQmZ3Q7DQorICAgICAgJmx0O3ZlcnNpb24mZ3Q7Ni45LjQmbHQ7L3ZlcnNpb24mZ3Q7DQorICAgICAgJmx0O3Njb3BlJmd0O3Rlc3QmbHQ7L3Njb3BlJmd0Ow0KKyAgICAmbHQ7L2RlcGVuZGVuY3kmZ3Q7DQorPC9wcmU+DQorDQorPGg0PkdyYWRsZTwvaDQ+DQorDQorPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPg0KK3JlcG9zaXRvcmllcyB7DQorICAgIGpjZW50ZXIoKQ0KK30NCisNCitkZXBlbmRlbmNpZXMgew0KKyAgICB0ZXN0Q29tcGlsZSAnb3JnLnRlc3RuZzp0ZXN0bmc6Ni45LjQnDQorfQ0KKzwvcHJlPg0KKw0KKzxoMz5TbmFwc2hvdHM8L2gzPg0KKw0KK1Rlc3RORyA8YSBocmVmPSJodHRwczovL29zcy5zb25hdHlwZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzL29yZy90ZXN0bmcvdGVzdG5nLyI+YXV0b21hdGljYWxseSB1cGxvYWRzIHNuYXBzaG90cyB0byBTb25hdHlwZTwvYT4gd2hpY2ggeW91IGNhbiBhY2Nlc3MgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgcmVwb3NpdG9yeToNCisNCis8cHJlIGNsYXNzPSJicnVzaDogamF2YSI+DQorcmVwb3NpdG9yaWVzIHsNCisgICAgbWF2ZW4gew0KKyAgICAgICAgdXJsICdodHRwczovL29zcy5zb25hdHlwZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzJw0KKyAgICB9DQorfQ0KKzwvcHJlPg0KKw0KKzxoMz5FY2xpcHNlIHBsdWctaW48L2gzPg0KKzxwPllvdSBjYW4gdXNlIGVpdGhlciB0aGUgRWNsaXBzZSBNYXJrZXQgUGxhY2Ugb3IgdGhlIHVwZGF0ZSBzaXRlOjwvcD4NCis8dWw+DQorCTxsaT5TZWxlY3Q8aT4gSGVscCAvIEluc3RhbGwgbmV3IHNvZnR3YXJlLjwvaT4gDQorCTwvbGk+DQorCTxsaT48aT5TZWFyY2ggZm9yIG5ldyBmZWF0dXJlcyB0byBpbnN0YWxsLjwvaT4gDQorCTwvbGk+DQorCTxsaT48aT5OZXcgcmVtb3RlIHNpdGUuPC9pPiANCisJPC9saT4NCisJPGxpPkZvciBFY2xpcHNlIDMuNCBhbmQgYWJvdmUsIGVudGVyIDxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vZWNsaXBzZSI+aHR0cDovL2JldXN0LmNvbS9lY2xpcHNlPC9hPi4NCisJPGxpPkZvciBFY2xpcHNlIDMuMyBhbmQgYmVsb3csIGVudGVyIDxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vZWNsaXBzZTEiPmh0dHA6Ly9iZXVzdC5jb20vZWNsaXBzZTE8L2E+Lg0KKwk8L2xpPg0KKwk8bGk+TWFrZSBzdXJlIHRoZSBjaGVjayBib3ggbmV4dCB0byBVUkwgaXMgY2hlY2tlZCBhbmQgY2xpY2sgPGk+TmV4dDwvaT4uIA0KKwk8L2xpPg0KKwk8bGk+RWNsaXBzZSB3aWxsIHRoZW4gZ3VpZGUgeW91IHRocm91Z2ggdGhlIHByb2Nlc3MuIDwvbGk+DQorPC91bD4NCisNCis8cD5Zb3UgY2FuIGFsc28gaW5zdGFsbCBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgcGx1Zy1pbnMgPGEgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9lY2xpcHNlLW9sZCI+aGVyZTwvYT4uIE5vdGUgdGhhdCB0aGUgVVJMJ3Mgb24gdGhpcyBwYWdlIGFyZSB1cGRhdGUgc2l0ZXMgYXMgd2VsbCwgbm90IGRpcmVjdCBkb3dubG9hZCBsaW5rcy4NCisNCis8cD5UZXN0TkcgaXMgYWxzbyA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nIj5ob3N0ZWQgb24gR2l0SHViPC9hPiwgd2hlcmUgeW91IGNhbiBkb3dubG9hZCB0aGUgc291cmNlIGFuZCBidWlsZCB0aGUgZGlzdHJpYnV0aW9uIHlvdXJzZWxmOg0KKw0KKzxwcmUgY2xhc3M9ImJydXNoOiBwbGFpbiI+DQorJCBnaXQgY2xvbmUgZ2l0Oi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nLmdpdA0KKyQgY2QgdGVzdG5nDQorJCBtdm4gcGFja2FnZQ0KKzwvcHJlPg0KKw0KKzxwPllvdSB3aWxsIHRoZW4gZmluZCB0aGUgamFyIGZpbGUgaW4gdGhlIDx0dD50YXJnZXQ8L3R0PiBkaXJlY3Rvcnk8L3A+DQorDQorPHNjcmlwdCBzcmM9Imh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KKzwvc2NyaXB0Pg0KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCitfdWFjY3QgPSAiVUEtMjM4MjE1LTIiOw0KK3VyY2hpblRyYWNrZXIoKTsNCis8L3NjcmlwdD4NCisNCisNCis8L2JvZHk+DQorDQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9lY2xpcHNlLmh0bWwgYi9kb2MvZWNsaXBzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODFkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWNsaXBzZS5odG1sCkBAIC0wLDAgKzEsMzQ1IEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlRlc3RORyAtIEVjbGlwc2U8L3RpdGxlPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJiYW5uZXIuanMiPjwvc2NyaXB0PgorICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRlc3RuZy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgICAgPC9oZWFkPgorPGJvZHk+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBkaXNwbGF5TWVudSgiZWNsaXBzZS5odG1sIikKKzwvc2NyaXB0PgorCisKKzxoMiBhbGlnbj0iY2VudGVyIj5UZXN0TkcgRWNsaXBzZSBwbHVnLWluPC9oMj4KKzxwPlRoZSBUZXN0TkcgRWNsaXBzZSBwbHVnLWluIGFsbG93cyB5b3UgdG8gcnVuIHlvdXIgVGVzdE5HIHRlc3RzIGZyb20gRWNsaXBzZSAKK2FuZCBlYXNpbHkgbW9uaXRvciB0aGVpciBleGVjdXRpb24gYW5kIHRoZWlyIG91dHB1dC4gSXQgaGFzIGl0cyBvd24gPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy1lY2xpcHNlIj5wcm9qZWN0IHJlcG9zaXRvcnkgY2FsbGVkIDx0dD50ZXN0bmctZWNsaXBzZTwvdHQ+PC9hPi48L3A+CisKKworPGgzPlRhYmxlIG9mIENvbnRlbnRzPC9oMz4KKworJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLWluc3RhbGxhdGlvbiI+MSAtIEluc3RhbGxhdGlvbjwvYT4KKzxicj4KKyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS1jcmVhdGluZyI+MiAtIENyZWF0aW5nIGEgVGVzdE5HIGNsYXNzPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLWNyZWF0ZS1sYXVuY2giPjMgLSBMYXVuY2ggY29uZmlndXJhdGlvbnM8L2E+Cis8YnI+CismbmJzcDsmbmJzcDs8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2UtY3JlYXRlLWNsYXNzIj4zLjEgLSBGcm9tIGEgY2xhc3MgZmlsZTwvYT4KKzxicj4KKyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS1jcmVhdGUtZ3JvdXBzIj4zLjIgLSBGcm9tIGdyb3VwczwvYT4KKzxicj4KKyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS1jcmVhdGUteG1sIj4zLjMgLSBGcm9tIGFuIFhNTCBmaWxlPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLWNyZWF0ZS1tZXRob2QiPjMuNCAtIEZyb20gYSBtZXRob2Q8L2E+Cis8YnI+CismbmJzcDsmbmJzcDs8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2UtbGlzdGVuZXJzIj4zLjUgLSBTcGVjaWZ5aW5nIGxpc3RlbmVycyBhbmQgb3RoZXIgc2V0dGluZ3M8L2E+Cis8YnI+CismbmJzcDsmbmJzcDs8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2Utdmlld2luZyI+NCAtIFZpZXdpbmcgdGhlIHJlc3VsdHM8L2E+Cis8YnI+CismbmJzcDsmbmJzcDs8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2Utc2VhcmNoIj41IC0gU2VhcmNoPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLXN1bW1hcnkiPjYgLSBUaGUgU3VtbWFyeSB0YWI8L2E+Cis8YnI+CismbmJzcDsmbmJzcDs8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2UtcXVpY2tmaXgiPjcgLSBDb252ZXJ0aW5nIEpVbml0IHRlc3RzPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLXF1aWNrZml4ZXMiPjggLSBRdWljayBmaXhlczwvYT4KKzxicj4KKyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS1wcmVmZXJlbmNlcyI+OSAtIFByZWZlcmVuY2VzIGFuZCBQcm9wZXJ0aWVzPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLXdvcmtiZW5jaC1wcmVmZXJlbmNlcyI+OS4xIC0gV29ya2JlbmNoIFByZWZlcmVuY2VzPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLXByb2plY3QtcHJvcGVydGllcyI+OS4yIC0gUHJvamVjdCBQcm9wZXJ0aWVzPC9hPgorPGJyPgorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiN0ZXN0bmcteG1sIj48L2E+CisKKzwhLS0KKyAgSW5zdGFsbGF0aW9uCistLT4KKzxoMz48YSBuYW1lPSJlY2xpcHNlLWluc3RhbGxhdGlvbiI+MSAtIEluc3RhbGxhdGlvbjwvYT48L2gzPjxwPgorT25jZSB5b3UgaGF2ZSA8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9kb2MvZG93bmxvYWQuaHRtbCI+aW5zdGFsbGVkIHRoZSBwbHVnLWluPC9hPiwgcmVzdGFydCBFY2xpcHNlIGFuZCBzZWxlY3QgdGhlIG1lbnUgPHR0PldpbmRvdyAvIFNob3cgVmlldyAKKy8gT3RoZXIuLi48L3R0PiZuYnNwOyBhbmQgeW91IHNob3VsZCBzZWUgdGhlIFRlc3RORyB2aWV3IGxpc3RlZCBpbiB0aGUgSmF2YSBjYXRlZ29yeS48L3A+PHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy92aWV3LnBuZyIgLz4KKzwvcD4KKzxwPgorTk9URTogc2luY2UgVGVzdE5HIEVjbGlwc2UgUGx1Z2luIDYuOS44LCB0aGUgbWluaW11bSByZXF1aXJlZCBUZXN0TkcgdmVyc2lvbiBpcyA8Yj42LjUuMTwvYj4KKzwvcD4KKworPCEtLQorICBDcmVhdGluZworLS0+Cis8aDM+PGEgbmFtZT0iZWNsaXBzZS1jcmVhdGluZyI+MiAtIENyZWF0aW5nIGEgVGVzdE5HIGNsYXNzPC9hPjwvaDM+PHA+CisKK1RvIGNyZWF0ZSBhIG5ldyBUZXN0TkcgY2xhc3MsIHNlbGVjdCB0aGUgbWVudSBGaWxlIC8gTmV3IC8gVGVzdE5HOgorCis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL25ldy0xLnBuZyIgLz4KKzwvcD4KKworSWYgeW91IGN1cnJlbnRseSBoYXZlIGEgSmF2YSBmaWxlIG9wZW4gaW4gdGhlIGVkaXRvciBvciBpZiB5b3UgaGF2ZSBhIEphdmEgZmlsZSBzZWxlY3RlZCBpbiB0aGUgTmF2aWdhdG9yLCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkIHdpbGwgc2hvdyB5b3UgYSBsaXN0IG9mIGFsbCB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhhdCBjbGFzcyBhbmQgaXQgd2lsbCBnaXZlIHlvdSB0aGUgb3B0aW9uIHRvIHNlbGVjdCB0aGUgb25lcyB5b3Ugd2FudCB0byB0ZXN0LiBFYWNoIG1ldGhvZCB5b3Ugc2VsZWN0IG9uIHRoaXMgcGFnZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBuZXcgVGVzdE5HIGNsYXNzIHdpdGggYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgc28geW91IHJlbWVtYmVyIHRvIGltcGxlbWVudCBpdC4KKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9uZXctMi5wbmciIC8+Cis8L3A+CisKK1RoZSBuZXh0IHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB3aGVyZSB0aGF0IGZpbGUgd2lsbCBiZSBjcmVhdGVkLCB3aGV0aGVyIGl0IHNob3VsZCBjb250YWluIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgY29uZmlndXJhdGlvbiBtZXRob2RzLCBpZiB5b3UnZCBsaWtlIGEgZGF0YSBwcm92aWRlciBhbmQgZmluYWxseSwgaWYgYSA8dHQ+dGVzdG5nLnhtbDwvdHQ+IGZpbGUgc2hvdWxkIGJlIGdlbmVyYXRlZC4KKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9uZXctMy5wbmciIC8+Cis8L3A+CisKK1RoZSBwbHVnLWluIHdpbGwgbWFrZSBhIGd1ZXNzIGFib3V0IHRoZSBiZXN0IGxvY2F0aW9uIHdoZXJlIHRoaXMgZmlsZSBzaG91bGQgYmUgY3JlYXRlZCAoZm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgTWF2ZW4sIHRoZSBkZWZhdWx0IGxvY2F0aW9uIHdpbGwgYmUgdW5kZXIgPHR0PnNyYy90ZXN0L2phdmE8L3R0PikuCisKKzxoMz48YSBuYW1lPSJlY2xpcHNlLWNyZWF0ZS1sYXVuY2giPjMgLSBMYXVuY2ggY29uZmlndXJhdGlvbjwvYT48L2gzPjxwPk9uY2UgeW91IGhhdmUgY3JlYXRlZCBjbGFzc2VzIHRoYXQgY29udGFpbiBUZXN0TkcgYW5ub3RhdGlvbnMgYW5kL29yIG9uZSBvciAKK21vcmUgPHR0PnRlc3RuZy54bWw8L3R0PiBmaWxlcywgeW91IGNhbiBjcmVhdGUgYSBUZXN0TkcgTGF1bmNoIENvbmZpZ3VyYXRpb24uJm5ic3A7IAorU2VsZWN0IHRoZSA8dHQ+UnVuIC8gUnVuLi4uPC90dD4gKG9yIDx0dD5SdW4gLyBEZWJ1Zy4uLjwvdHQ+KSBtZW51IGFuZCBjcmVhdGUgYSBuZXcgVGVzdE5HIAorY29uZmlndXJhdGlvbjo8L3A+PHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9sYXVuY2gucG5nIiAvPgorPC9wPgorPHA+WW91IHNob3VsZCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGFuZCBwaWNrIGEgcHJvamVjdCwgd2hpY2ggCitjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIDx0dD5Ccm93c2UuLi48L3R0PiBidXR0b24gYXQgdGhlIHRvcCBvZiB0aGUgd2luZG93LjwvcD4KKzxwPgorUnVudGltZSBvcHRpb25zOgorPHVsPgorPGxpPjxiPkxvZyBMZXZlbDwvYj46IHNwZWNpZnkgdGhlIHZhbHVlICgwLTEwKSBmb3IgZGlmZmVyZW50IHZlcmJvc2UgbG9nIGxldmVsczwvbGk+Cis8bGk+PGI+VmVyYm9zZTwvYj46IGVuYWJsZSB0aGUgcnVudGltZSBUZXN0TkcgdmVyYm9zZSBsb2c8L2xpPgorPGxpPjxiPkRlYnVnPC9iPjogZW5hYmxlIG1vcmUgcnVudGltZSBUZXN0TkcgZGVidWcgaW5mbzwvbGk+Cis8bGk+PGI+U2VyaWFsaXphdGlvbiBQcm90b2NvbDwvYj46IHRoZSBzZXJpYWxpemF0aW9uIHByb3RvY29sIHVzZWQgZm9yIGNvbW11bmljYXRpbmcgYmV0d2VlbiBUZXN0TkcgRWNsaXBzZSBQbHVnaW4gYW5kIFRlc3RORyBydW50aW1lLgorVGhlIGRlZmF1bHQgaXMgIk9iamVjdCBTZXJpYWxpemF0aW9uIiwgdGhlIG90aGVyIG9wdGlvbiAoIlN0cmluZyBTZXJpYWxpemF0aW9uIikgaXMgZGVwcmVjYXRlZC48L2xpPgorPGxpPjxiPkFkZCB0aGUgUE9NJ3MgSlZNIEFyZ3VtZW50cyB3aGVuIGxhdW5jaDwvYj46IGZvciBtYXZlbiBiYXNlZCBwcm9qZWN0LCB3ZSBub3JtYWxseSBkZWZpbmUgbWF2ZW4tc3VyZWZpcmUtcGx1Z2luIGZvciB0ZXN0IHBoYXNlIGFuZCBtYXZlbi1mYWlsc2FmZS1wbHVnaW4gZm9yIGludGVncmF0aW9uIHRlc3QgcGhhc2UsIHRoZXJlIG1pZ2h0IGJlIGhhdmluZyB0aGUgdGVzdGluZyBydW50aW1lIEpWTSBhcmd1bWVudHMgZGVmaW5lZCBpbiB0aGUgImFyZ0xpbmUiIGVsZW1lbnQgb2YgdGhlIG1hdmVuIHBsdWdpbiBjb25maWd1cmF0aW9uLiBJZiB5b3UgY2hlY2sgdGhpcyBvcHRpb24sIFRlc3RORyBFY2xpcHNlIFBsdWdpbiB3aWxsIHRyeSB0byByZWNvZ25pemUgdGhlIEpWTSBhcmd1bWVudHMgaW4gImFyZ0xpbmUiLCBhZGQgdGhlbSB0byBUZXN0TkcgcnVudGltZSBKVk0gYXJndW1lbnRzIHdoZW4gbGF1bmNoLjxici8+CitOT1RFIDE6IHRoZXNlIEpWTSBhcmd1bWVudHMgYXJlIHB1dCBvbiBmcm9udCBvZiB1c2VyIGRlZmluZWQgVk0gYXJndW1lbnRzIG9uICJBcmd1bWVudHMiIHRhYiwgd2hpY2ggbWVhbnMgeW91IGNhbiBvdmVyaWRlIHRoZSBQT00gZGVmaW5lZCBKVk0gYXJndW1ldG5zIHdpdGggdGhlIG9uZXMgb24gIkFyZ3VtZW50cyIgdGFiLjxici8+CitOT1RFIDI6IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSAiYXJnTGluZSIgZWxlbWVudHMgaW4gdGhlIHBvbS54bWwsIHRoZSBmaXJzdCBwcmVzZW5jZSB3aWxsIGJlIHVzZWQuIElmIGl0J3Mgbm90IHRoZSBkZXNpcmVkIGJlaGF2aW91ciwgeW91IGNhbiBzaW1wbHkgdW5jaGVjayB0aGlzIG9wdGlvbiwgYW5kIHR5cGUgeW91ciBKVk0gYXJndW1lbnRzIG9uIHRoZSAiQXJndW1lbnRzIiB0YWIgbmV4dCB0byB0aGlzICJUZXN0IiB0YWIuPC9saT4KKzwvdWw+Cis8L3A+Cis8cD5UaGVuIHlvdSBjaG9vc2UgdG8gbGF1bmNoIHlvdXIgVGVzdE5HIHRlc3RzIGluIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+PGg0PjxhIG5hbWU9ImVjbGlwc2UtbGF1bmNoLWNsYXNzIj40LjIuMSAtIEZyb20gYSBjbGFzcyBmaWxlPC9hPjwvaDQ+PHA+TWFrZSBzdXJlIHRoZSBib3ggbmVhciA8dHQ+Q2xhc3M8L3R0PiBpcyBjaGVja2VkIGFuZCB0aGVuIHBpY2sgYSBjbGFzcyBmcm9tIHlvdXIgCitwcm9qZWN0LiZuYnNwOyBZb3UgY2FuIGNsaWNrIG9uIHRoZSA8dHQ+QnJvd3NlLi4uPC90dD4gYnV0dG9uIGFuZCBwaWNrIGl0IGRpcmVjdGx5IGZyb20gYSAKK2xpc3QuJm5ic3A7IFRoaXMgbGlzdCBvbmx5IGNvbnRhaW5zIGNsYXNzZXMgdGhhdCBjb250YWluIFRlc3RORyBhbm5vdGF0aW9uczo8L3A+PHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9jbGFzc2VzLnBuZyIgLz4KKzwvcD4KKworCis8aDQ+PGEgbmFtZT0iZWNsaXBzZS1jcmVhdGUtZ3JvdXBzIj4zLjIgLSBGcm9tIGdyb3VwczwvYT48L2g0PgorPHA+SWYgeW91IG9ubHkgd2FudCB0byBsYXVuY2ggb25lIG9yIHNldmVyYWwgZ3JvdXBzLCB5b3UgY2FuIHR5cGUgdGhlbSBpbiB0aGUgCit0ZXh0IGZpZWxkIG9yIHBpY2sgdGhlbSBmcm9tIGEgbGlzdCBieSBjbGlja2luZyBvbiB0aGUgPHR0PkJyb3dzZS4uLjwvdHQ+IGJ1dHRvbiZuYnNwOworCis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL2dyb3Vwcy5wbmciIC8+Cis8L3A+CisKKworPGg0PjxhIG5hbWU9ImVjbGlwc2UtY3JlYXRlLXhtbCI+My4zIC0gRnJvbSBhIGRlZmluaXRpb24gZmlsZTwvYT48L2g0PgorRmluYWxseSwgeW91IGNhbiBzZWxlY3QgYSBzdWl0ZSBkZWZpbml0aW9uIGZyb20geW91ciBwcm9qZWN0LiAgSXQgZG9lc24ndCBoYXZlIHRvIGJlIG5hbWVkCis8dHQ+dGVzdG5nLnhtbDwvdHQ+LCB0aGUgcGx1Zy1pbiB3aWxsIGF1dG9tYXRpY2FsbHkgaWRlbnRpZnkgYWxsIHRoZSBhcHBsaWNhYmxlIFRlc3RORyBYTUwgZmlsZXMgCitpbiB5b3VyIHByb2plY3Q6Cis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3N1aXRlcy5wbmciIC8+Cis8L3A+CitZb3UgY2FuIHR5cGUgdGhlIHJlZ2V4IG9uIHRoZSBmaWx0ZXIgdGV4dCBmaWVsZCB0byBuYXJyb3cgZG93biB0byBzdWl0ZSBkZWZpbml0aW9uIGZpbGVzIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGZyb20gYSBsb25nIGxpc3Qgb2YgZmlsZXMuCisKKzxoND4KKzxhIG5hbWU9ImVjbGlwc2UtY3JlYXRlLW1ldGhvZCI+My40IC0gRnJvbSBhIG1ldGhvZCA8L2E+Cis8L2g0PgorPHA+VGhpcyBsYXVuY2ggaXNuJ3QgYWNjb21wbGlzaGVkIGZyb20gdGhlIExhdW5jaCBkaWFsb2cgYnV0IAorZGlyZWN0bHkgZnJvbSB5b3VyIE91dGxpbmUgdmlldzo8L3A+PHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9vdXRsaW5lLnBuZyIgLz4KKzwvcD4KK1lvdSBjYW4gcmlnaHQtY2xpY2sgb24gYW55IHRlc3QgbWV0aG9kcyBhbmQgc2VsZWN0IDx0dD5SdW4gYXMuLi4gLyBUZXN0TkcgdGVzdDwvdHQ+IGFuZCBvbmx5IHRoZSBzZWxlY3RlZAorbWV0aG9kIHdpbGwgYmUgcnVuIChub3Qgc2hvd24gb24gdGhlIGFib3ZlIHNjcmVlbnNob3QgYmVjYXVzZSBJIGNvdWxkbid0IGZpbmQgYSB3YXkgdG8gY2FwdHVyZQorYSBjb250ZXh0dWFsIG1lbnUpLjxwPk1ldGhvZCBsYXVuY2hpbmcgaXMgYWxzbyBhdmFpbGFibGUgZnJvbSB0aGUgUGFja2FnZSAKK0V4cGxvcmVyIHZpZXcgYW5kIGZyb20gdGhlIEphdmEgQnJvd3NlciBwZXJzcGVjdGl2ZS48L3A+PHA+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBvbmUgb2YgdGhlc2UgbGF1bmNoZXMsIHlvdSBjYW4gYWxzbyBjaG9vc2UgdGhlIGxvZ2dpbmcgb2YgbGV2ZWwuIFRoZW4geW91IGNhbiBsYXVuY2ggdGhlIHRlc3RzIGJ5IHByZXNzaW5nIHRoZSA8dHQ+RGVidWc8L3R0PiAob3IgPHR0PlJ1bjwvdHQ+KSBidXR0b24sIHdoaWNoIHdpbGwgc3dpdGNoIHlvdSB0byB0aGUgRGVidWcgcGVyc3BlY3RpdmUgYW5kIHdpbGwgb3BlbiB0aGUgbWFpbiBUZXN0Tkcgdmlldy48L3A+CisKKzxoND4KKzxhIG5hbWU9ImVjbGlwc2UtbGlzdGVuZXJzIj4zLjUgLVNwZWNpZnlpbmcgbGlzdGVuZXJzIGFuZCBvdGhlciBzZXR0aW5ncyA8L2E+Cis8L2g0PgorCitBcyB5b3Ugc2F3IGFib3ZlLCB0aGUgcGx1Zy1pbiB3aWxsIGxldCB5b3Ugc3RhcnQgdGVzdHMgaW4gbWFueSBkaWZmZXJlbnQgd2F5czogIGZyb20gYW4gWE1MIGZpbGUsIGZyb20gYSBtZXRob2QsIGEgY2xhc3MsIGV0Yy4uLiAgV2hlbiB5b3UgYXJlIHJ1bm5pbmcgYW4gWE1MIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHNldHRpbmdzIHlvdSB3YW50IGZvciB0aGlzIHJ1biBpbiB0aGUgWE1MIGZpbGUsIGJ1dCB3aGF0IGlmIHlvdSB3YW50IHRvIHJ1biBhIHBhY2thZ2UgaW4gcGFyYWxsZWwgbW9kZSB3aXRoIHNwZWNpZmljIGxpc3RlbmVycz8gIEhvdyBjYW4geW91IGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgZm9yIGFsbCB0aGUgbGF1bmNoZXMgdGhhdCBhcmUgbm90IGRvbmUgZnJvbSBhbiBYTUwgZmlsZT8KKworPHA+CisKK0luIG9yZGVyIHRvIGdpdmUgeW91IGFjY2VzcyB0byB0aGUgbW9zdCBmbGV4aWJpbGl0eSwgVGVzdE5HIGxldHMgeW91IHNwZWNpZnkgYW4gWE1MIHN1aXRlIGZpbGUgZm9yIGFsbCB0aGVzZSBsYXVuY2hlcywgd2hpY2ggeW91IGNhbiBmaW5kIGluIHRoZSBQcmVmZXJlbmNlcyBtZW51OgorCis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3RlbXBsYXRlLnBuZyIvPgorPC9wPgorCitJZiB5b3Ugc3BlY2lmeSBhIHZhbGlkIHN1aXRlIGZpbGUgYXMgIlhNTCB0ZW1wbGF0ZSBmaWxlIiwgVGVzdE5HIHdpbGwgcmV1c2UgYWxsIHRoZSBzZXR0aW5ncyBmb3VuZCBpbiB0aGlzIFhNTCBmaWxlLCBzdWNoIGFzIHBhcmFsbGVsLCBuYW1lLCBsaXN0ZW5lcnMsIHRocmVhZCBwb29sIHNpemUsIGV0Yy4uLiAgT25seSB0aGUgPHR0PiZsdDt0ZXN0Jmd0OzwvdHQ+IHRhZ3MgaW4gdGhpcyBmaWxlIHdpbGwgYmUgaWdub3JlZCBzaW5jZSB0aGUgcGx1Zy1pbiB3aWxsIHJlcGxhY2UgdGhlc2UgYnkgYSBnZW5lcmF0ZWQgPHR0PiZsdDt0ZXN0Jmd0OzwvdHQ+IHRhZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxhdW5jaCB5b3UgY2hvc2UuCisKKzwhLS0KKyAgVmlld2luZworLS0+Cis8aDM+Cis8YSBuYW1lPSJlY2xpcHNlLXZpZXdpbmciPjQgLSBWaWV3aW5nIHRoZSB0ZXN0IHJlc3VsdHMgPC9hPgorPC9oMz4KKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9zdWNjZXNzLnBuZyIgLz4KKzwvcD4KKworPHA+VGhlIGFib3ZlIHZpZXcgc2hvd3MgYSBzdWNjZXNzZnVsIHJ1biBvZiB0aGUgdGVzdHM6Jm5ic3A7IHRoZSBiYXIgaXMgZ3JlZW4gCithbmQgbm8gZmFpbGVkIHRlc3RzIGFyZSByZXBvcnRlZC4mbmJzcDsgVGhlIDx0dD5BbGwgdGVzdHM8L3R0PiB0YWIgc2hvd3MgeW91IGEgbGlzdCBvZiAKK2FsbCB0aGUgY2xhc3NlcyBhbmQgbWV0aG9kcyB0aGF0IHdlcmUgcnVuLjwvcD48cD5JZiB5b3VyIHRlc3QgcnVuIGNvbnRhaW5zIGZhaWx1cmVzLCB0aGUgdmlldyB3aWxsIGxvb2sgbGlrZSB0aGlzOjwvcD48cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL2ZhaWx1cmUucG5nIiAvPgorPC9wPgorCis8cD5Zb3UgY2FuIHVzZSB0aGUgPHR0PkZhaWxlZCB0ZXN0czwvdHQ+IHRhYiB0byBkaXNwbGF5IG9ubHkgdGhlc2UgdGVzdHMgdGhhdCBmYWlsZWQsIGFuZCAKK3doZW4geW91IHNlbGVjdCBzdWNoIGEgdGVzdCwgdGhlIHN0YWNrIHRyYWNlIHdpbGwgYmUgc2hvd24gb24gdGhlIHJpZ2h0LWhhbmQgCitwYW5lLiZuYnNwOyBZb3UgY2FuIGRvdWJsZSBjbGljayBvbiB0aGUgb2ZmZW5kaW5nIGxpbmUgdG8gYmUgdGFrZW4gZGlyZWN0bHkgdG8gCit0aGUgZmFpbHVyZSBpbiB5b3VyIGNvZGUuPC9wPgorCis8aDM+Cis8YSBuYW1lPSJlY2xpcHNlLXNlYXJjaCI+NSAtIFNlYXJjaCA8L2E+Cis8L2gzPgorCisKKzxwIGFsaWduPSJjZW50ZXIiPgorPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL3Rlc3RuZy5vcmcvcGljdHVyZXMvc2VhcmNoLnBuZyIgLz4KKzwvcD4KKworPHA+V2hlbiB5b3UgaGF2ZSBodW5kcmVkcyBvZiB0ZXN0cyBydW5uaW5nLCBmaW5kaW5nIGEgc3BlY2lmaWMgb25lIGlzIG5vdCBhbHdheXMgZWFzeSwgc28geW91IGNhbiB0eXBlIGEgZmV3IGxldHRlcnMgb2YgdGhlIHRlc3QgbWV0aG9kIG9yIGl0cyBwYXJhbWV0ZXJzIGluIHRoZSBTZWFyY2ggYm94IGFuZCB0aGUgY29udGVudCBvZiB0aGUgdHJlZSB3aWxsIGF1dG9tYXRpY2FsbHkgbmFycm93IGRvd24gdG8gbWV0aG9kcyBtYXRjaGluZyB5b3VyIHNlYXJjaC4gTm90ZSBpbiB0aGUgc2NyZWVuIHNob3QgYWJvdmUgdGhhdCB0aGUgc2VhcmNoIGFsc28gd29ya3Mgb24gcGFyYW1ldGVycyBwcm92aWRlZCBieSA8dHQ+QERhdGFQcm92aWRlcjwvdHQ+LjwvcD4KKworPGgzPgorPGEgbmFtZT0iZWNsaXBzZS1zdW1tYXJ5Ij42IC0gU3VtbWFyeSA8L2E+Cis8L2gzPgorCisKKzxwIGFsaWduPSJjZW50ZXIiPiAKKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3N1bW1hcnkxLnBuZyIgLz4KKzwvcD4gCis8cD5UaGUgU3VtbWFyeSB0YWIgZ2l2ZXMgeW91IHN0YXRpc3RpY3Mgb24geW91ciB0ZXN0IHJ1biwgc3VjaCBhcyB0aGUgdGltaW5ncywgdGhlIHRlc3QgbmFtZXMsIHRoZSBudW1iZXIgb2YgbWV0aG9kcyBhbmQgY2xhc3NlcywgZXRjJiM4MjMwOyBTaW5jZSB0aGUgcmVzdWx0cyBhcmUgc2hvd24gaW4gYSB0YWJsZSwgeW91IGNhbiBhbHNvIHNvcnQgb24gYW55IGNyaXRlcmlvbiB5b3UgbGlrZSBmb3IgZWFzaWVyIHBhcnNpbmcuIFRoaXMgaXMgZXNwZWNpYWxseSBoYW5keSB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGRldGVybWluZSB3aGF0IHRlc3RzIHRha2UgdGhlIGxvbmdlc3QgdGltZS48L3A+CisKKzxwPlRoZSBzZWFyY2ggYm94IHdvcmtzIGluIHRoaXMgdmlldyBhcyB3ZWxsLCBhbmQgbm90ZSB0aGF0IGluIHRoZSBzY3JlZW4gc2hvdCBiZWxvdywgdGhlIFRpbWUgY29sdW1uIGlzIHNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyOjwvcD4gCis8cCBhbGlnbj0iY2VudGVyIj4gCis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9zdW1tYXJ5Mi5wbmciIC8+CisKKworCis8aDM+PGEgbmFtZT0iZWNsaXBzZS1xdWlja2ZpeCI+NyAtIENvbnZlcnRpbmcgSlVuaXQgdGVzdHM8L2E+PC9oMz4KKworWW91IGNhbiBlYXNpbHkgY29udmVydCBKVW5pdCAzIGFuZCBKVW5pdCA0IHRlc3RzIHRvIFRlc3RORy4KKworPHA+CisKK1lvdXIgZmlyc3Qgb3B0aW9uIGlzIHRvIHVzZSB0aGUgUXVpY2sgRml4IGZ1bmN0aW9uOgorCis8cD4KKworPHAgYWxpZ249ImNlbnRlciI+IAorPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL3Rlc3RuZy5vcmcvcGljdHVyZXMvY29udmVydDEucG5nIiAvPgorPGJyPgorPGI+Q29udmVydCBmcm9tIEpVbml0IDM8L2I+Cis8L3A+CisKKzxwIGFsaWduPSJjZW50ZXIiPiAKKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL2NvbnZlcnQyLnBuZyIgLz4KKzxicj4KKzxiPkNvbnZlcnQgZnJvbSBKVW5pdCA0PC9iPgorPC9wPgorCitZb3UgY2FuIGFsc28gY29udmVydCBwYWNrYWdlcyBvciBlbnRpcmUgc291cmNlIGZvbGRlcnMgd2l0aCB0aGUgY29udmVyc2lvbiByZWZhY3RvcmluZzoKKworPHAgYWxpZ249ImNlbnRlciI+IAorPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL3Rlc3RuZy5vcmcvcGljdHVyZXMvcmVmYWN0b3JpbmcxLnBuZyIgLz4KKzwvcD4KKworVGhlIHJlZmFjdG9yaW5nIHdpemFyZCBjb250YWlucyBzZXZlcmFsIHBhZ2VzOgorCis8cCBhbGlnbj0iY2VudGVyIj4gCis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3BpY3MvbWVudS1jb252ZXJ0Mi5wbmcgIiAvPgorPC9wPgorIAorVGhpcyBwYWdlIGxldHMgeW91IGdlbmVyYXRlIGEgdGVzdG5nLnhtbCBhdXRvbWF0aWNhbGx5LiBZb3UgY2FuIGNvbmZpZ3VyZSB3aGV0aGVyIHRvIGluY2x1ZGUgeW91ciB0ZXN0IGNsYXNzZXMgaW5kaXZpZHVhbGx5IG9yIGJ5IHBhY2thZ2UsIHRoZSBzdWl0ZSBhbmQgdGVzdCBuYW1lIGFuZCBhbHNvIHdoZXRoZXIgdGhlc2UgdGVzdHMgc2hvdWxkIHJ1biBpbiBwYXJhbGxlbC4KKworPHAgYWxpZ249ImNlbnRlciI+IAorPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL3Rlc3RuZy5vcmcvcGljdHVyZXMvcmVmYWN0b3JpbmcyLnBuZyIgLz4KKzwvcD4KKworVGhpcyBwYWdlIGdpdmVzIHlvdSBhbiBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyB0aGF0IGFyZSBhYm91dCB0byBiZSBwZXJmb3JtZWQuIFlvdSBjYW4gYWxzbyBkZWNpZGUgdG8gZXhjbHVkZSBjZXJ0YWluIGZpbGVzIGZyb20gdGhlIHJlZmFjdG9yaW5nLgorCis8cD4KKworV2hlbiB5b3UgYXJlIGRvbmUsIHByZXNzIHRoZSAiRmluaXNoIiBidXR0b24uIExpa2UgYWxsIEVjbGlwc2UgcmVmYWN0b3JpbmdzLCB5b3UgY2FuIHVuZG8gYWxsIHRoZXNlIGNoYW5nZXMgaW4gb25lIGNsaWNrOgorCis8cCBhbGlnbj0iY2VudGVyIj4gCis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3BpY3MvbWVudS1jb252ZXJ0NC5wbmciIC8+Cis8L3A+CisKKzxoMz48YSBuYW1lPSJlY2xpcHNlLXF1aWNrZml4ZXMiPjggLSBRdWljayBmaXhlczwvYT48L2gzPgorCitUaGUgVGVzdE5HIEVjbGlwc2UgcGx1Zy1pbiBvZmZlcnMgc2V2ZXJhbCBxdWljayBmaXhlcyB3aGlsZSB5b3UgYXJlIGVkaXRpbmcgYSBUZXN0TkcgY2xhc3MgKGFjY2Vzc2libGUgd2l0aCA8dHQ+Q3RybC0xPC90dD4gb24gV2luZG93cy9MaW51eCBhbmQgPHR0PiYjODk4NDstMTwvdHQ+IG9uIE1hYyBPUyk6CisKKzxoND5Db252ZXJ0IHRvIEpVbml0PC9oND4KKworVGhpcyB3YXMgY292ZXJlZCBpbiB0aGUgPGEgaHJlZj0iI2VjbGlwc2UtcXVpY2tmaXgiPiBwcmV2aW91cyBzZWN0aW9uPC9hPi4KKworPGg0PlB1c2hpbmcgYW5kIHB1bGxpbmcgPHR0PkBUZXN0PC90dD4gYW5ub3RhdGlvbnM8L2g0PgorCitJZiB5b3UgaGF2ZSBzZXZlcmFsIHRlc3QgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCA8dHQ+QFRlc3Q8L3R0PiBhbmQgeW91J2QgbGlrZSB0byByZXBsYWNlIHRoZW0gYWxsIHdpdGggYSBzaW5nbGUgPHR0PkBUZXN0PC90dD4gYW5ub3RhdGlvbiBhdCB0aGUgY2xhc3MgbGV2ZWwsIGNob29zZSB0aGUgIlB1bGwgYW5ub3RhdGlvbiIgcXVpY2sgZml4OgorCis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3JlZmFjdG9yaW5nLXB1bGwtYW5ub3RhdGlvbi5wbmciIC8+Cis8L3A+CisKK1JlY2lwcm9jYWxseSwgeW91IGNhbiBtb3ZlIGEgY2xhc3MgbGV2ZWwgPHR0PkBUZXN0PC90dD4gYW5ub3RhdGlvbiBvbnRvIGFsbCB5b3VyIHB1YmxpYyBtZXRob2RzOgorCis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3JlZmFjdG9yaW5nLXB1c2gtYW5ub3RhdGlvbi5wbmciIC8+Cis8L3A+CisKKzxoND5BdXRvbWF0aWNhbGx5IGltcG9ydGluZyA8dHQ+YXNzZXJ0czwvdHQ+PC9oND4KKworQXBwbHkgYSBxdWljayBmaXggb24gYW4gYXNzZXJ0IG1ldGhvZCB0byBhdXRvbWF0aWNhbGx5IGltcG9ydCBpdDoKKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9xdWlja2ZpeC1pbXBvcnQucG5nIiAvPgorPC9wPgorCis8IS0tCisgIFByZWZlcmVuY2VzIGFuZCBQcm9wZXJ0aWVzCistLT4KKzxoMz48YSBuYW1lPSJlY2xpcHNlLXByZWZlcmVuY2VzIj45IC0gUHJlZmVyZW5jZXMgYW5kIFByb3BlcnRpZXM8L2E+PC9oMz4KKzxoND48YSBuYW1lPSJlY2xpcHNlLXdvcmtiZW5jaC1wcmVmZXJlbmNlcyI+OS4xIC0gV29ya2JlbmNoIFByZWZlcmVuY2VzPC9hPjwvaDQ+CitUZXN0Tkcgd29ya2JlbmNoIHByZWZlcmVuY2VzOgorPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy9wcmVmZXJlbmNlcy5wbmciIC8+Cis8L3A+Cis8cD4KK1RoZSBwcmVmZXJlbmNlcyBoZXJlIGFyZSBzaGFyZWQgYW1vbmcgcHJvamVjdHMgYW5kIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KKzx1bD4KKzxsaT48Yj5PdXRwdXQgZGlyZWN0b3J5PC9iPjogdGhlIHBhdGggd2hlcmUgdG8gc3RvcmUgdGhlIG91dHB1dCBpbmNsdWRpbmcgdGVtcCBmaWxlcywgcmVwb3J0IGZpbGVzLCBldGMuIEJ5IGRlZmF1bHQsIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIGVhY2ggcHJvamVjdCBleGNlcHQgeW91IGNoZWNrIHRoZSBvcHRpb24gPGI+QWJzb2x1dGUgb3VwdXQgcGF0aDwvYj4gYmVsb3cuPC9saT4KKzxsaT48Yj5EaXNhbGJlIGRlZmF1bHQgbGlzdGVuZXJzPC9iPjogZGlzYWJsZSB0aGUgZGVmYXVsdCBsaXN0ZW5lcnMgd2hlbiBsYXVuY2ggdGVzdG5nIHJ1bnRpbWU8L2xpPgorPGxpPjxiPlNob3cgdmlldyB3aGVuIHRlc3QgY29tcGxldGU8L2I+OiBhY3RpdmUgdGhlIFRlc3RORyByZXN1bHQgdmlldyB3aGVuIHRoZSB0ZXN0IGNvbXBsZXRlPC9saT4KKzxsaT48Yj5Vc2UgUHJvamVjdCBUZXN0TkcgamFyPC9iPjogSXQncyBkZWZhdWx0IHRvIGJlIGNoZWNrZWQgd2hpY2ggbWVhbnMgVGVzdE5HIEVjbGlwc2UgUGx1Z2luIHdpbGwgdXNlIHRoZSBwcm9qZWN0IFRlc3RORyBqYXIgKGZvciBleGFtcGxlLCB0aGUgVGVzdE5HIHZlcnNpb24gbWFuYWdlZCB3aXRoIG1hdmVuKSB3aGVuIGxhdW5jaCBUZXN0TkcgcnVudGltZS4gT3RoZXJ3aXNlLCB0aGUgVGVzdE5HIGVjbGlwc2UgcGx1Z2luIGVtYmVkZGVkIFRlc3RORyB2ZXJzaW9uIHdpbGwgYmUgdXNlZC48YnIvPgorV2hlbiB0byBjaGVjayB0aGlzIG9wdGlvbj8KKzx1bD4KKyAgPGxpPnlvdSB3YW50IGl0IGJlaHZpb3VyIGFzIGNsb3NlIGFzIHJ1bm5pbmcgb3V0c2lkZSBJREUsIGUuZy4gd2l0aCBtYXZlbiBzdXJlZmlyZSBwbHVnaW4sIHNpbmNlIHRoZSBQbHVnaW4gZW1iZWRkZWQgdmVyc2lvbiBvZiBUZXN0TkcgbW9zdCBsaWtlbHkgZGlmZmVyZW50IHdpdGggdGhlIHZlcnNpb24gb2YgeW91ciBwcm9qZWN0LjwvbGk+CisgIDxsaT55b3UgZG9uJ3Qgd2FudCB0aGUgUGx1Z2luIGVtYmVkZGVkIHBsdWdpbiBhbmQgaXQncyBkZXBlbmRlbnQgbGlicyAoZS5nLiBzbmFrZXlhbWwsIGV0Yy4pIHBvbGx1dGUgeW91ciBUZXN0TkcgcnVudGltZSBjbGFzc3BhdGguPC9saT4KKzwvdWw+PC9saT4KKzxsaT48Yj5UZW1wbGF0ZSBYTUwgZmlsZTwvYj46IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0ZW1wbGF0ZSB4bWwgZmlsZSB1c2VkIHRvIGdlbmVybmF0ZSB0aGUgY3VzdG9tIHRlc3Qgc3VpdGUgeG1sIGJlZm9yZSBsYXVuY2g8L2xpPgorPGxpPjxiPkV4Y2x1ZGVkIHN0YWNrIHRyYWNlczwvYj46IDwvbGk+Cis8bGk+PGI+UHJlIERlZmluZWQgTGlzdGVuZXJzPC9iPjogPC9saT4KKzwvdWw+Cis8L3A+CisKKzxoND48YSBuYW1lPSJlY2xpcHNlLXByb2plY3QtcHJvcGVydGllcyI+OS4yIC0gUHJvamVjdCBQcm9wZXJ0aWVzPC9hPjwvaDQ+CitQcm9qZWN0IGxldmVsIHByb3BlcnRpZXM6Cis8cCBhbGlnbj0iY2VudGVyIj4KKzxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3Byb2plY3RfcHJvcGVydGllcy5wbmciIC8+Cis8L3A+Cis8cD4KK0hlcmUgYXJlIHByb3BlcnRpZXMgb24gZWFjaCBwcm9qZWN0IGxldmVsLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBzYW1lIHByb3BlcnRpZXMgaWYgZGVmaW5lZCBpbiA8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI2VjbGlwc2Utd29ya2JlbmNoLXByZWZlcmVuY2VzIj5UZXN0Tkcgd29ya2JlbmNoIHByZWZlcmVuY2VzPC9hPgorPHVsPgorPGxpPjxiPk91dHB1dCBkaXJlY3Rvcnk8L2I+OiBmb3IgZXhhbXBsZSwgaW4gdGhlIGZpZ3VyZSBhYm92ZSwgSSBwcmVmZXIgdG8gcHV0IHRoZSBvdXRwdXQgdG8gbWF2ZW4gJ3RhcmdldCcgZGlyZWN0b3J5IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSB1bmRlciBwcm9qZWN0IHJvb3Q8L2xpPgorPGxpPjxiPldhdGNoIHRlc3RuZy1yZXN1bHQueG1sPC9iPjo8L2xpPgorPGxpPjxiPlRlbXBsYXRlIFhNTCBmaWxlPC9iPjogc2VlIGluIDxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS13b3JrYmVuY2gtcHJlZmVyZW5jZXMiPlRlc3RORyB3b3JrYmVuY2ggcHJlZmVyZW5jZXM8L2E+PC9saT4KKzxsaT48Yj5Vc2UgUHJvamVjdCBUZXN0TkcgamFyPC9iPjogc2VlIGluIDxhIGNsYXNzPSJzdW1tYXJ5IiBocmVmPSIjZWNsaXBzZS13b3JrYmVuY2gtcHJlZmVyZW5jZXMiPlRlc3RORyB3b3JrYmVuY2ggcHJlZmVyZW5jZXM8L2E+PC9saT4KKzxsaT48Yj5QcmUgRGVmaW5lZCBMaXN0ZW5lcnM8L2I+OiBzZWUgaW4gPGEgY2xhc3M9InN1bW1hcnkiIGhyZWY9IiNlY2xpcHNlLXdvcmtiZW5jaC1wcmVmZXJlbmNlcyI+VGVzdE5HIHdvcmtiZW5jaCBwcmVmZXJlbmNlczwvYT48L2xpPgorPC91bD4KKzwvcD4KKworPHNjcmlwdCBzcmM9Imh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitfdWFjY3QgPSAiVUEtMjM4MjE1LTIiOwordXJjaGluVHJhY2tlcigpOworPC9zY3JpcHQ+CisKKzwvYm9keT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZmFxIGIvZG9jL2ZhcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDBiZGQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ZhcQpAQCAtMCwwICsxLDMgQEAKKy0gSSdtIHJ1bm5pbmcgZ3JvdXBzIGFuZCBub3csIG15IEBCZWZvcmUgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIHJ1bm5pbmcuCistIEhvdyB0byByZXR1cm4gdmFyaW91cyBudW1iZXJzIG9mIHBhcmFtZXRlcnMgaW4gYSBkYXRhIHByb3ZpZGVyIGJhc2VkIG9uIHRoZSBncm91cAorYmVpbmcgcnVuCmRpZmYgLS1naXQgYS9kb2MvaWRlYS5odG1sIGIvZG9jL2lkZWEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjVjNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2lkZWEuaHRtbApAQCAtMCwwICsxLDczIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlRlc3RORyAtIElERUEgUGx1Z2luPC90aXRsZT4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYmFubmVyLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0ZXN0bmcuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAgIDwvaGVhZD4KKzxib2R5PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZGlzcGxheU1lbnUoImlkZWEuaHRtbCIpCis8L3NjcmlwdD4KKworPGgyIGFsaWduPSJjZW50ZXIiPlRlc3RORyBJREVBIFBsdWctaW48L2gyPgorCisKKworPHAgYWxpZ249ImNlbnRlciI+Cis8aW1nIHNyYz0iaHR0cDovL3Rlc3RuZy5vcmcvcGljdHVyZXMvaWRlYS1vdXRwdXQucG5nIiAvPgorPC9wPgorCis8aDM+SURFQSA3PC9oMz4KKworVGVzdE5HIGlzIGJ1bmRsZWQgaW4gSURFQSA3IG9ud2FyZHMsIG5vIGV4dHJhIHBsdWdpbnMgbmVlZCB0byBiZSBpbnN0YWxsZWQuICBUaGUgZnVsbCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCA8YSBocmVmPSJodHRwOi8vd3d3LmpldGJyYWlucy5jb20vaWRlYS9mZWF0dXJlcy9qdW5pdF90ZXN0bmcuaHRtbCNUZXN0TkciPmhlcmU8L2E+LgorCis8aDM+SURFQSA2IGFuZCBvbGRlciA8L2gzPgorCisKK1Rlc3RORyBoYXMgYW4gSURFQSBwbHVnLWluIHRoYXQgbWlycm9ycyBtdWNoIG9mIHRoZSBiZWhhdmlvciBvZiB0aGUgYnVpbHQtaW4gSlVuaXQgc3VwcG9ydC4gWW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0ZXN0cyB3aXRoaW4gSURFQSB3aXRob3V0IGRlZmluaW5nIGFueSBmaWxlcyBleHRlcm5hbGx5LCBhcyB3ZWxsIGFzIHF1aWNrbHkgYW5kIGVhc2lseSBtaWdyYXRlIEpVbml0IGNvZGUuIFRoZSBwbHVnLWluIGFsc28gcHJvdmlkZXMgdGhlIHNhbWUgb3V0cHV0IHRlc3QgdmlldyBhcyBKVW5pdCB0ZXN0cy4KKworSW5zdGFsbGF0aW9uCisKKzx1bD4KKwk8bGk+RnJvbSBJREVBLCBnbyB0byBQcmVmZXJlbmNlcyAtPiBQbHVnaW5zLjwvbGk+CisJPGxpPkNsaWNrIG92ZXIgdG8gdGhlIEF2YWlsYWJsZSBQbHVnaW5zIHRhYi48L2xpPgorPC91bD4KKzxwPlRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgVGVzdE5HIHBsdWdpbiB3aWxsIGJlIGxpc3RlZCB0aGVyZSwgcmVhZHkgdG8gZG93bmxvYWQgYW5kIGluc3RhbGwuJm5ic3A7CitBbHNvLCB5b3UgY2FuIGdvIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vc3ZuLmpldGJyYWlucy5vcmcvaWRlYS9UcnVuay9idW5kbGVkL3Rlc3RuZyI+CitUZXN0TkcgSURFQSBwbHVnLWluIHByb2plY3QgcGFnZTwvYT4gYW5kIGRvd25sb2FkIGl0cyBzb3VyY2UgZnJvbSB0aGVyZS48L3A+Cis8cD5QbGVhc2Ugbm90ZSB0aGF0IHRoaXMgcGx1Zy1pbiBvbmx5IHdvcmtzIG9uIElERUEgNS4wIGFuZCA2LjAuPC9wPgorCis8cD48Yj5DcmVhdGluZyBhIFRlc3RORyBSdW4vRGVidWcgY29uZmlndXJhdGlvbjwvYj48L3A+Cis8cD5PbmNlIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgcGx1Zy1pbiBhbmQgcmVzdGFydGVkIElERUEsIGFuZCBoYXZlIHNvbWUgVGVzdE5HIGNsYXNzZXMgeW91IHdvdWxkIGxpa2UgdG8gcnVuLCBzaW1wbHkKK29wZW4gdGhlIFJ1bi9EZWJ1ZyB3aW5kb3cuIFlvdSB3aWxsIHNlZSBhIFRlc3RORyB0YWIsIHdoZXJlIHlvdSBjYW4gYWRkIGEgY29uZmlndXJhdGlvbi4KKworPC9wPgorPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIHRoZSBzZXQgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1bi4gVGhlc2UgYXJlOjwvcD4KKzx1bD4KKwk8bGk+UGFja2FnZTogU3BlY2lmeSBhIHBhY2thZ2UgdG8gcnVuLiBBbGwgdGVzdHMgaW4gdGhpcyBwYWNrYWdlIGFuZCBiZWxvdyB3aWxsIGJlIGluY2x1ZGVkLjwvbGk+CisJPGxpPkdyb3VwOiBTcGVjaWZ5IGEgVGVzdE5HIGdyb3VwIHRvIHJ1bi48L2xpPgorCTxsaT5TdWl0ZTogU3BlY2lmeSBhbiBleHRlcm5hbCB0ZXN0bmcueG1sIGZpbGUgdG8gcnVuLjwvbGk+CisJPGxpPkNsYXNzOiBSdW4gYWxsIHRlc3RzIGluIGEgc2luZ2xlIGNsYXNzLjwvbGk+CisJPGxpPk1ldGhvZDogUnVuIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgorCis8L2xpPgorPC91bD4KKzxwPk9uY2UgeW91IGNyZWF0ZSB0aGUgcnVuIGNvbmZpZ3VyYXRpb24sIHlvdSBjYW4gcnVuIGl0LiBVcG9uIHJ1bm5pbmcsIHRoZSBwbHVnLWluIHdpbGwgbGF1bmNoIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gcnVuIHlvdXIgdGVzdHMuIFRoZSB0ZXN0IHJlc3VsdHMgd2lsbCBiZSBkaXNwbGF5IGluIGEgdHJlZSB2aWV3LCB3aXRoIHBhc3NlZCBhbmQgZmFpbGVkIHRlc3RzIGhpZ2hsaWdodGVkLiBZb3UgY2FuIG5hcnJvdyBkb3duIG9uIHRoZSBjb25zb2xlIG91dHB1dCBmb3IgYSBzcGVjaWZ5IHRlc3QgYnkgY2xpY2tpbmcgb24gaXQsIHdoaWxlIGRvdWJsZSBjbGlja2luZyBhIHRlc3Qgd2lsbCBuYXZpZ2F0ZSB0byBpdHMgc291cmNlIGNvZGUuCis8L3A+CisKKzxwIGFsaWduPSJjZW50ZXIiPgorPGltZyBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL2lkZWEtcnVuZGlhbG9nLnBuZyIgLz4KKzwvcD4KKworCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK191YWNjdCA9ICJVQS0yMzgyMTUtMiI7Cit1cmNoaW5UcmFja2VyKCk7Cis8L3NjcmlwdD4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2MvaW5kZXguaHRtbCBiL2RvYy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5kZXguaHRtbApAQCAtMCwwICsxLDIzOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5UZXN0TkcgLSBXZWxjb21lPC90aXRsZT4KKyAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idGVzdG5nLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL2JldXN0LmNzcyIgIC8+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3ByZXR0aWZ5LmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJhbm5lci5qcyI+PC9zY3JpcHQ+CisKKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaENvcmUuanMiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hKYXZhLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoWG1sLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoQmFzaC5qcyI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaFBsYWluLmpzIj48L3NjcmlwdD4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoQ29yZS5jc3MiLz4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoVGhlbWVDZWRyaWMuY3NzIi8+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmNvbmZpZy5jbGlwYm9hcmRTd2YgPSAnc2NyaXB0cy9jbGlwYm9hcmQuc3dmJzsKKyAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuZGVmYXVsdHNbJ2d1dHRlciddID0gZmFsc2U7CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmFsbCgpOworICAgICAgPC9zY3JpcHQ+CisKKyAgICA8L2hlYWQ+CisKKzxib2R5IG9ubG9hZD0icHJldHR5UHJpbnQoKSI+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgIGRpc3BsYXlNZW51KCJpbmRleC5odG1sIik7Cis8L3NjcmlwdD4KKworCis8aDIgPlRlc3RORzwvaDI+Cis8aDI+Tm93IGF2YWlsYWJsZTwvaDI+Cis8cCBhbGlnbj0iY2VudGVyIj4KKzxhIGhyZWY9ImJvb2suaHRtbCI+Cis8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3BpY3MvYm9vay1jb3Zlci5qcGciIC8+Cis8L2E+Cis8L3A+Cis8cCBhbGlnbj0iY2VudGVyIj4KKzxhIGhyZWY9ImJvb2suaHRtbCI+Q2xpY2sgZm9yIG1vcmUgZGV0YWlscy48L2E+Cis8L3A+CisKKworCis8cCBhbGlnbj0icmlnaHQiPjxmb250IHNpemU9Ii0yIj48ZW0+QyZlYWN1dGU7ZHJpYyBCZXVzdCAoY2VkcmljIGF0IGJldXN0LmNvbSk8YnI+CitDdXJyZW50IHZlcnNpb246IDYuOS40PGJyPgorQ3JlYXRlZDombmJzcDtBcHJpbCAyN3RoLCAyMDA0PGJyPgorTGFzdCBNb2RpZmllZDombmJzcDsgTWF5IDl0aCwgMjAxNTwvZW0+PC9mb250PjwvcD4KKworCis8cD5UZXN0TkcgaXMgYSB0ZXN0aW5nIGZyYW1ld29yayBpbnNwaXJlZCBmcm9tIEpVbml0IGFuZCBOVW5pdCBidXQgaW50cm9kdWNpbmcKK3NvbWUgbmV3IGZ1bmN0aW9uYWxpdGllcyB0aGF0IG1ha2UgaXQgbW9yZSBwb3dlcmZ1bCBhbmQgZWFzaWVyIHRvIHVzZSwgc3VjaCBhczo8L3A+Cis8dWw+CisgICAgICAgPGxpPkFubm90YXRpb25zLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPlJ1biB5b3VyIHRlc3RzIGluIGFyYml0cmFyaWx5IGJpZyB0aHJlYWQgcG9vbHMgd2l0aCB2YXJpb3VzIHBvbGljaWVzIGF2YWlsYWJsZQorICAgICAgIChhbGwgbWV0aG9kcyBpbiB0aGVpciBvd24gdGhyZWFkLCBvbmUgdGhyZWFkIHBlciB0ZXN0IGNsYXNzLCBldGMuLi4pLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPlRlc3QgdGhhdCB5b3VyIGNvZGUgaXMgbXVsdGl0aHJlYWQgc2FmZS4KKyAgICAgICA8L2xpPgorICAgICAgIDxsaT5GbGV4aWJsZSB0ZXN0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgPC9saT4KKyAgICAgICA8bGk+U3VwcG9ydCBmb3IgZGF0YS1kcml2ZW4gdGVzdGluZyAod2l0aCA8dHQ+QERhdGFQcm92aWRlcjwvdHQ+KS4KKyAgICAgICA8L2xpPgorICAgICAgIDxsaT5TdXBwb3J0IGZvciBwYXJhbWV0ZXJzLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPlBvd2VyZnVsIGV4ZWN1dGlvbiBtb2RlbCAobm8gbW9yZSA8dHQ+VGVzdFN1aXRlPC90dD4pLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPlN1cHBvcnRlZCBieSBhIHZhcmlldHkgb2YgdG9vbHMgYW5kIHBsdWctaW5zIChFY2xpcHNlLCBJREVBLCBNYXZlbiwKKyAgICAgICBldGMuLi4pLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPkVtYmVkcyBCZWFuU2hlbGwgZm9yIGZ1cnRoZXIgZmxleGliaWxpdHkuCisgICAgICAgPC9saT4KKyAgICAgICA8bGk+RGVmYXVsdCBKREsgZnVuY3Rpb25zIGZvciBydW50aW1lIGFuZCBsb2dnaW5nIChubyBkZXBlbmRlbmNpZXMpLgorICAgICAgIDwvbGk+CisgICAgICAgPGxpPkRlcGVuZGVudCBtZXRob2RzIGZvciBhcHBsaWNhdGlvbiBzZXJ2ZXIgdGVzdGluZy48L2xpPgorPC91bD4KKzxwPlRlc3RORyBpcyBkZXNpZ25lZCB0byBjb3ZlciBhbGwgY2F0ZWdvcmllcyBvZiB0ZXN0czombmJzcDsgdW5pdCwgZnVuY3Rpb25hbCwKK2VuZC10by1lbmQsIGludGVncmF0aW9uLCBldGMuLi48L3A+Cis8cD5JIHN0YXJ0ZWQgVGVzdE5HIG91dCBvZiBmcnVzdHJhdGlvbiBmb3Igc29tZSBKVW5pdCBkZWZpY2llbmNpZXMgd2hpY2ggSSBoYXZlCitkb2N1bWVudGVkIG9uIG15IHdlYmxvZyA8YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy8yMDA0LzA4LzI1L3Rlc3RzZXR1cC1hbmQtZXZpbC1zdGF0aWMtbWV0aG9kcy8iPmhlcmU8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy8yMDA0LzAyLzA4L2p1bml0LXBhaW4vIj5oZXJlPC9hPgorUmVhZGluZyB0aGVzZSBlbnRyaWVzIG1pZ2h0IGdpdmUgeW91IGEgYmV0dGVyIGlkZWEgb2YgdGhlIGdvYWwgSSBhbSB0cnlpbmcgdG8KK2FjaGlldmUgd2l0aCBUZXN0TkcuJm5ic3A7IFlvdSBjYW4gYWxzbyBjaGVjayBvdXQgYSBxdWljaworPGEgaHJlZj0iaHR0cDovL3d3dy5iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDE3Ni5odG1sIj5vdmVydmlldyBvZiB0aGUgbWFpbgorZmVhdHVyZXM8L2E+IGFuZCBhbiA8YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy8yMDA0LzA4LzE4L3VzaW5nLWFubm90YXRpb24taW5oZXJpdGFuY2UtZm9yLXRlc3RpbmcvIj4KK2FydGljbGU8L2E+IGRlc2NyaWJpbmcgYSB2ZXJ5IGNvbmNyZXRlIGV4YW1wbGUgd2hlcmUgdGhlIGNvbWJpbmVkIHVzZSBvZiBzZXZlcmFsCitUZXN0TkcncyBmZWF0dXJlcyBwcm92aWRlcyBmb3IgYSB2ZXJ5IGludHVpdGl2ZSBhbmQgbWFpbnRhaW5hYmxlIHRlc3RpbmcgZGVzaWduLjwvcD4KKzxwPkhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSB0ZXN0OjwvcD4KKworPGgzIGNsYXNzPSJzb3VyY2V0aXRsZSI+U2ltcGxlVGVzdC5qYXZhPC9oMz4KKzxwcmUgY2xhc3M9ImJydXNoOiBqYXZhIiA+CitwYWNrYWdlIGV4YW1wbGUxOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdCB7CisKKyBAQmVmb3JlQ2xhc3MKKyBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgIC8vIGNvZGUgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGlzIHRlc3QgaXMgaW5zdGFudGlhdGVkCisgfQorCisgQFRlc3QoZ3JvdXBzID0geyAiZmFzdCIgfSkKKyBwdWJsaWMgdm9pZCBhRmFzdFRlc3QoKSB7CisgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhc3QgdGVzdCIpOworIH0KKworIEBUZXN0KGdyb3VwcyA9IHsgInNsb3ciIH0pCisgcHVibGljIHZvaWQgYVNsb3dUZXN0KCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2xvdyB0ZXN0Iik7CisgfQorCit9Cis8L3ByZT4KKworVGhlIG1ldGhvZCA8dHQ+c2V0VXAoKTwvdHQ+IHdpbGwgYmUgaW52b2tlZCBhZnRlciB0aGUgdGVzdCBjbGFzcyBoYXMgYmVlbiBidWlsdCBhbmQgYmVmb3JlCithbnkgdGVzdCBtZXRob2QgaXMgcnVuLiZuYnNwOyBJbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgYmUgcnVubmluZyB0aGUgZ3JvdXAKK2Zhc3QsIHNvIDx0dD5hRmFzdFRlc3QoKTwvdHQ+IHdpbGwgYmUgaW52b2tlZCB3aGlsZSA8dHQ+YVNsb3dUZXN0KCk8L3R0PiB3aWxsIGJlCitza2lwcGVkLjxwPgorPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBXUklUSU5HIEEgVEVTVAorCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPgorCitUaGluZ3MgdG8gbm90ZTo8L3A+PHVsPgorICAgICAgIDxsaT5ObyBuZWVkIHRvIGV4dGVuZCBhIGNsYXNzIG9yIGltcGxlbWVudCBhbiBpbnRlcmZhY2UuPC9saT48bGk+RXZlbiB0aG91Z2ggdGhlIGV4YW1wbGUgYWJvdmUgdXNlcyB0aGUgSlVuaXQgY29udmVudGlvbnMsIG91ciBtZXRob2RzCisgICAgICAgY2FuIGJlIGNhbGxlZCBhbnkgbmFtZSB5b3UgbGlrZSwgaXQncyB0aGUgYW5ub3RhdGlvbnMgdGhhdCB0ZWxsIFRlc3RORyB3aGF0CisgICAgICAgdGhleSBhcmUuPC9saT48bGk+QSB0ZXN0IG1ldGhvZCBjYW4gYmVsb25nIHRvIG9uZSBvciBzZXZlcmFsIGdyb3Vwcy48L2xpPjwvdWw+CisKKyAgICAgICA8cD4KKworT25jZSB5b3UgaGF2ZSBjb21waWxlZCB5b3VyIHRlc3QgY2xhc3MgaW50byB0aGUgPHR0PmJ1aWxkPC90dD4gZGlyZWN0b3J5LCB5b3UKK2NhbiBpbnZva2UgeW91ciB0ZXN0IHdpdGggdGhlIGNvbW1hbmQgbGluZSwgYW4gYW50IHRhc2sgKHNob3duIGJlbG93KSBvciBhbiBYTUwKK2ZpbGU6CisKKzxoMyBjbGFzcz0ic291cmNldGl0bGUiPmJ1aWxkLnhtbDwvaDM+Cis8cHJlIGNsYXNzPSJicnVzaDpqYXZhIj4KKyZsdDtwcm9qZWN0IGRlZmF1bHQ9InRlc3QiJmd0OworCisgJmx0O3BhdGggaWQ9ImNwIiZndDsKKyAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliL3Rlc3RuZy10ZXN0bmctNS4xMy4xLmphciIvJmd0OworICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZCIvJmd0OworICZsdDsvcGF0aCZndDsKKworICZsdDt0YXNrZGVmIG5hbWU9InRlc3RuZyIgY2xhc3NwYXRocmVmPSJjcCIKKyAgICAgICAgICBjbGFzc25hbWU9Im9yZy50ZXN0bmcuVGVzdE5HQW50VGFzayIgLyZndDsKKworICZsdDt0YXJnZXQgbmFtZT0idGVzdCImZ3Q7CisgICAmbHQ7dGVzdG5nIGNsYXNzcGF0aHJlZj0iY3AiIGdyb3Vwcz0iZmFzdCImZ3Q7CisgICAgICZsdDtjbGFzc2ZpbGVzZXQgZGlyPSJidWlsZCIgaW5jbHVkZXM9ImV4YW1wbGUxLyouY2xhc3MiLyZndDsKKyAgICZsdDsvdGVzdG5nJmd0OworICZsdDsvdGFyZ2V0Jmd0OworCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKworVXNlIGFudCB0byBpbnZva2UgaXQ6CisKKzxwcmUgY2xhc3M9ImJydXNoOiB0ZXh0Ij4KK2M6Jmd0OyBhbnQKK0J1aWxkZmlsZTogYnVpbGQueG1sCisKK3Rlc3Q6CitbdGVzdG5nXSBGYXN0IHRlc3QKK1t0ZXN0bmddID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitbdGVzdG5nXSBTdWl0ZSBmb3IgQ29tbWFuZCBsaW5lIHRlc3QKK1t0ZXN0bmddIFRvdGFsIHRlc3RzIHJ1bjogMSwgRmFpbHVyZXM6IDAsIFNraXBzOiAwCitbdGVzdG5nXSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0JVSUxEIFNVQ0NFU1NGVUwKK1RvdGFsIHRpbWU6IDQgc2Vjb25kcworPC9wcmU+CisKK1RoZW4geW91IGNhbiBicm93c2UgdGhlIHJlc3VsdCBvZiB5b3VyIHRlc3RzOgorCis8cHJlIGNsYXNzPSJicnVzaDogdGV4dCI+CitzdGFydCB0ZXN0LW91dHB1dFxpbmRleC5odG1sIChvbiBXaW5kb3dzKQorPC9wcmU+CisKKzxoMz48YSBuYW1lPSJyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50czwvYT48L2gzPgorPHA+VGVzdE5HIHJlcXVpcmVzIEpESyA3IG9yIGhpZ2hlci48L3A+CisKKzxoMz48YSBuYW1lPSJtYWlsaW5nLWxpc3RzIj5NYWlsaW5nLWxpc3RzPC9hPjwvaDM+CisKKzx1bD4KKzxsaT5UaGUgdXNlcnMgbWFpbGluZy1saXN0IGNhbiBiZSBmb3VuZCBvbiA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvdGVzdG5nLXVzZXJzIj5Hb29nbGUgR3JvdXBzPC9hPi4KKzxsaT5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd29ya2luZyBvbiBUZXN0TkcgaXRzZWxmLCBqb2luIHRoZSA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvdGVzdG5nLXVzZXJzIj5kZXZlbG9wZXIgbWFpbGluZy1saXN0PC9hPi4KKzxsaT5JZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBoZWFyaW5nIGFib3V0IG5ldyB2ZXJzaW9ucyBvZiBUZXN0TkcsIHlvdSBjYW4gam9pbiB0aGUgbG93IHZvbHVtZSA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvdGVzdG5nLWFubm91bmNlbWVudHMiPlRlc3RORyBhbm5vdW5jZW1lbnQgbWFpbGluZy1saXN0PC9hPi4KKzwvdWw+CisKKworPGgzPjxhIG5hbWU9ImxvY2F0aW9ucy1wcm9qZWN0cyI+TG9jYXRpb25zIG9mIHRoZSBwcm9qZWN0czwvYT48L2gzPgorPHA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBUZXN0Tkcgb3Igb25lIG9mIHRoZSBJREUgcGx1Zy1pbnMsCit5b3Ugd2lsbCBmaW5kIHRoZW0gaW4gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorPHVsPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nLyI+VGVzdE5HPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmctZWNsaXBzZS8iPkVjbGlwc2UgcGx1Zy1pbjwvYT48L2xpPgorPCEtLQorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdGVzdG5nLyI+VGVzdE5HPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90ZXN0bmctZWNsaXBzZSI+RWNsaXBzZSBwbHVnLWluPC9hPjwvbGk+CistLT4KKyAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSmV0QnJhaW5zL2ludGVsbGlqLWNvbW11bml0eS90cmVlL21hc3Rlci9wbHVnaW5zL3Rlc3RuZyI+SURFQSBJbnRlbGxpSiBwbHVnLWluPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93aWtpLm5ldGJlYW5zLm9yZy9UZXN0TkciPk5ldEJlYW5zIHBsdWctaW48L2E+PC9saT4KKzwvdWw+Cis8aDM+PGEgaWQ9ImJ1Zy1yZXBvcnRzIiBuYW1lPSJidWctcmVwb3J0cyI+QnVnIHJlcG9ydHM8L2E+PC9oMz4KKworSWYgeW91IHRoaW5rIHlvdSBmb3VuZCBhIGJ1ZywgaGVyZSBpcyBob3cgdG8gcmVwb3J0IGl0OgorCis8dWw+Cis8bGk+Q3JlYXRlIGEgc21hbGwgcHJvamVjdCB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gcmVwcm9kdWNlIHRoaXMgYnVnLiBJbiBtb3N0IGNhc2VzLCBvbmUgb3IgdHdvIEphdmEgc291cmNlIGZpbGVzIGFuZCBhIDx0dD50ZXN0bmcueG1sPC90dD4gZmlsZSBzaG91bGQgYmUgc3VmZmljaWVudC4gVGhlbiB5b3UgY2FuIGVpdGhlciB6aXAgaXQgYW5kIGVtYWlsIGl0IHRvIHRoZSA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvdGVzdG5nLWRldiI+dGVzdG5nLWRldiBtYWlsaW5nLWxpc3Q8L2E+IG9yIG1ha2UgaXQgYXZhaWxhYmxlIG9uIGFuIG9wZW4gc291cmNlIGhvc3Rpbmcgc2l0ZSwgc3VjaCBhcyA8YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbSI+Z2l0aHViPC9hPiBvciA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2hvc3RpbmcvIj5Hb29nbGUgY29kZTwvYT4gYW5kIGVtYWlsIDx0dD50ZXN0bmctZGV2PC90dD4gc28gd2Uga25vdyBhYm91dCBpdC4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoaXMgcHJvamVjdCBpcyBzZWxmIGNvbnRhaW5lZCBzbyB0aGF0IHdlIGNhbiBidWlsZCBpdCByaWdodCBhd2F5IChyZW1vdmUgdGhlIGRlcGVuZGVuY2llcyBvbiBleHRlcm5hbCBvciBwcm9wcmlldGFyeSBmcmFtZXdvcmtzLCBldGMuLi4pLgorCis8bGk+SWYgdGhlIGJ1ZyB5b3Ugb2JzZXJ2ZWQgaXMgb24gdGhlIEVjbGlwc2UgcGx1Zy1pbiwgbWFrZSBzdXJlIHlvdXIgc2FtcGxlIHByb2plY3QgY29udGFpbnMgdGhlIDx0dD4ucHJvamVjdDwvdHQ+IGFuZCA8dHQ+LmNsYXNzcGF0aDwvdHQ+IGZpbGVzLgorCis8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmcvaXNzdWVzIj5GaWxlIGEgYnVnPC9hPi4KKworPC91bD4KKworPC9wPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgeW91IGNhbiBlaXRoZXIgPGEgaHJlZj0iZG93bmxvYWQuaHRtbCI+ZG93bmxvYWQgVGVzdE5HPC9hPiwgcmVhZCB0aGUgPGEgaHJlZj0iZG9jdW1lbnRhdGlvbi1tYWluLmh0bWwiPm1hbnVhbDwvYT4gb3IgYnJvd3NlIHRoZSBsaW5rcyBhdCB0aGU8YSBocmVmPSIjdG9wIj50b3A8L2E+LjwvcD4KKworPGgzPkxpY2Vuc2U8L2gzPgorCis8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9saWNlbnNlIj5BcGFjaGUgMi4wPC9hPgorCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK191YWNjdCA9ICJVQS0yMzgyMTUtMiI7Cit1cmNoaW5UcmFja2VyKCk7Cis8L3NjcmlwdD4KKworCis8L2JvZHk+CisKKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvZG9jL21hdmVuLmh0bWwgYi9kb2MvbWF2ZW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmZDhkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21hdmVuLmh0bWwKQEAgLTAsMCArMSwyMTggQEAKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+VGVzdE5HIC0gTWF2ZW48L3RpdGxlPgorCisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idGVzdG5nLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vYmV1c3QuY3NzIiAgLz4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9wcmV0dGlmeS5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJhbm5lci5qcyI+PC9zY3JpcHQ+CisKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQ29yZS5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoSmF2YS5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoWG1sLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hCYXNoLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hQbGFpbi5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoQ29yZS5jc3MiLz4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9zdHlsZXMvc2hUaGVtZUNlZHJpYy5jc3MiLz4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmNvbmZpZy5jbGlwYm9hcmRTd2YgPSAnc2NyaXB0cy9jbGlwYm9hcmQuc3dmJzsKKyAgICAgICAgICBTeW50YXhIaWdobGlnaHRlci5kZWZhdWx0c1snZ3V0dGVyJ10gPSBmYWxzZTsKKyAgICAgICAgICBTeW50YXhIaWdobGlnaHRlci5hbGwoKTsKKyAgICAgICAgPC9zY3JpcHQ+CisKKzwvaGVhZD4KKworPGJvZHkgb25Mb2FkPSJwcmV0dHlQcmludCgpIj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRpc3BsYXlNZW51KCJtYXZlbi5odG1sIikKKzwvc2NyaXB0PgorCisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgKi5QMSB7IGZvbnQtZmFtaWx5OlNhbnM7IGZvbnQtc2l6ZToxMHB0OyBtYXJnaW4tbGVmdDowaW47IG1hcmdpbi1yaWdodDowaW47IHRleHQtYWxpZ246bGVmdCAhIGltcG9ydGFudDsgdGV4dC1pbmRlbnQ6MGluY2g7IGNvbG9yOiNhNTJhMmE7IH0KKyAgICAqLlAyIHsgZm9udC1mYW1pbHk6U2FuczsgZm9udC1zaXplOjEwcHQ7IG1hcmdpbi1sZWZ0OjBpbjsgbWFyZ2luLXJpZ2h0OjBpbjsgdGV4dC1hbGlnbjpsZWZ0ICEgaW1wb3J0YW50OyB0ZXh0LWluZGVudDowaW5jaDsgfQorICAgICouUDMgeyBmb250LWZhbWlseTonTmltYnVzIFJvbWFuIE5vOSBMJzsgZm9udC1zaXplOjEycHQ7IG1hcmdpbi1sZWZ0OjBpbjsgbWFyZ2luLXJpZ2h0OjBpbjsgdGV4dC1hbGlnbjpsZWZ0ICEgaW1wb3J0YW50OyB0ZXh0LWluZGVudDowaW5jaDsgfQorICAgICouU3RhbmRhcmQgeyBmb250LWZhbWlseTonTmltYnVzIFJvbWFuIE5vOSBMJzsgZm9udC1zaXplOjEycHQ7IH0KKyAgICAqLlRleHRib2R5IHsgZm9udC1mYW1pbHk6J05pbWJ1cyBSb21hbiBObzkgTCc7IGZvbnQtc2l6ZToxMnB0OyBtYXJnaW4tdG9wOjBpbjsgbWFyZ2luLWJvdHRvbTowLjA4MzVpbjsgfQorICAgICouVDEgeyBmb250LXdlaWdodDpib2xkOyB9CisgICAgKi5UMiB7IGNvbG9yOiMzNTM1MzU7IH0KKyAgICAqLlQzIHsgY29sb3I6I2E1MmEyYTsgZm9udC13ZWlnaHQ6Ym9sZDsgfQorICAgICouVDQgeyBjb2xvcjojYTUyYTJhOyB9CisgICAgKi5UNSB7IGNvbG9yOiMzNTM1MzU7IGZvbnQtZmFtaWx5OlNhbnM7IGZvbnQtc2l6ZToxMHB0OyB9CisgICAgKi5UNiB7IGNvbG9yOiNhNTJhMmE7IGZvbnQtZmFtaWx5OlNhbnM7IGZvbnQtc2l6ZToxMHB0OyBmb250LXdlaWdodDpib2xkOyB9CisgICAgKi5UNyB7IGNvbG9yOiNhNTJhMmE7IGZvbnQtZmFtaWx5OlNhbnM7IGZvbnQtc2l6ZToxMHB0OyB9CisgIHAscHJlIHsgd2lkdGg6IDgwJTsgfQorCisgIHVsLnRvYyB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBtYXJnaW46MCAwLjdlbSAwOworICAgIHBhZGRpbmc6MDsKKyAgICBmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7CisgIH0KKyAgdWwudG9jIGxpIHsKKyAgICBwYWRkaW5nOjA7CisgICAgbWFyZ2luOiAwLjJlbSAwIDA7CisgIH0KKyAgdWwgdWwgeworICAgIG1hcmdpbjowIDJlbSAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICB9CisgIGxpIGEgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBwYWRkaW5nOiAycHggMTBweDsKKyAgICB3aWR0aDogMTQwcHg7CisgIH0KKyAgdWwuc3ViIGxpIGEgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgcGFkZGluZzogMnB4IDEwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIH0KKzwvc3R5bGU+CisKKzxoMj5UZXN0TkcgTWF2ZW4gcGx1Zy1pbnM8L2gyPgorCis8aDQ+VGFibGUgb2YgQ29udGVudHM8L2g0PgorPHVsIGNsYXNzPSJ0b2MiPgorICA8bGkgY2xhc3M9ImZpcnN0Ij4KKyAgICA8YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI21hdmVuMiI+TWF2ZW4yIFBsdWdpbjwvYT4KKworICAgIDx1bCBjbGFzcz0ic3ViIj4KKyAgICAgIDxsaT48YSBocmVmPSIjYXJjaGV0eXBlIj5BcmNoZXR5cGU8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICAKKyAgPGxpIGNsYXNzPSJsYXN0Ij48YSBjbGFzcz0ic3VtbWFyeSIgaHJlZj0iI21hdmVuMSI+TWF2ZW4gMSBQbHVnaW48L2E+PC9saT4KKzwvdWw+CisKKzwhLS0gIGJlZ2luIG1hdmVuMiAgLS0+Cis8aDMgaWQ9Im1hdmVuMiI+TWF2ZW4gMjwvaDM+CisKKzxwPk1hdmVuIDIgc3VwcG9ydHMgVGVzdE5HIG91dCBvZiB0aGUgYm94IHdpdGhvdXQgdGhlIG5lZWQgdG8gZG93bmxvYWQgYW55IGFkZGl0aW9uYWwgcGx1Z2lucyA8ZW0+KG90aGVyIHRoYW4gVGVzdE5HIGl0c2VsZik8L2VtPi4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHZlcnNpb24gMi40IG9yIGFib3ZlIG9mIHRoZSBTdXJlZmlyZSBwbHVnaW4gKHRoaXMgaXMgdGhlIGNhc2UgaW4gYWxsIHJlY2VudCB2ZXJzaW9ucyBvZiBNYXZlbikuPC9wPgorCis8cD4KK1lvdSBjYW4gZmluZCB0aGUgZnVsbCBpbnN0cnVjdGlvbnMgb24gdGhlIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tc3VyZWZpcmUtcGx1Z2luLyI+TWF2ZW4gU3VyZWZpcmUgUGx1Z2luIHdlYiBzaXRlPC9hPi4gVGhlcmUgYXJlIGFsc28gPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1zdXJlZmlyZS1wbHVnaW4vZXhhbXBsZXMvdGVzdG5nLmh0bWwiPlRlc3RORy1zcGVjaWZpYyBpbnN0cnVjdGlvbnM8L2E+LgorPC9wPgorCis8aDQ+U3BlY2lmeWluZyB5b3VyIHBvbS54bWw8L2g0PgorCitUaGUgZGVwZW5kZW5jeSBpbiB5b3VyIHByb2plY3Qgc2hvdWxkIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCis8cHJlIGNsYXNzPSJicnVzaDogeG1sIj4KKyAmbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICZsdDtncm91cElkJmd0O29yZy50ZXN0bmcmbHQ7L2dyb3VwSWQmZ3Q7CisgICAmbHQ7YXJ0aWZhY3RJZCZndDt0ZXN0bmcmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAmbHQ7dmVyc2lvbiZndDs2LjgmbHQ7L3ZlcnNpb24mZ3Q7CisgICAmbHQ7c2NvcGUmZ3Q7dGVzdCZsdDsvc2NvcGUmZ3Q7CisgJmx0Oy9kZXBlbmRlbmN5Jmd0OworPC9wcmU+CisKKzxoND5TYW1wbGUgUmVwb3J0PC9oND4KKzxwPgorQSBzYW1wbGUgc3VyZWZpcmUgcmVwb3J0IHdpdGggVGVzdE5HIGNhbiBiZSBmb3VuZCA8YSBocmVmPSJzYW1wbGVyZXBvcnQvaW5kZXguaHRtbCI+aGVyZTwvYT4uCis8L3A+Cis8YnIvPgorPCEtLSAgZW5kIG1hdmVuMiAgLS0+CisKKzwhLS0gbWF2ZW4yIGFyY2hldHlwZSAtLT4KKzxoMyBpZD0iYXJjaGV0eXBlIj5NYXZlbiBUZXN0TkcgQXJjaGV0eXBlIDxlbT4oTWFydGluIEdpbGRheSk8L2VtPjwvaDM+Cis8cD4KKyAgTWFydGluIEdpbGRheSBoYXMgYWRkZWQgYSBuZXcgYXJjaGV0eXBlIGZvciBNYXZlbjI6IHRvIGNyZWF0ZSBhIHByb2plY3QgdXNpbmcgdGhlIGFyY2hldHlwZSB5b3Ugc2ltcGx5IGhhdmUgdG8gc3BlY2lmeSBteSByZXBvc2l0b3J5IGFuZCB0aGUgYXJjaGV0eXBlIElELgorPC9wPgorICA8cHJlIGNsYXNzPSJicnVzaDogdGV4dCI+CisgIG12biBhcmNoZXR5cGU6Y3JlYXRlIC1EZ3JvdXBJZD1vcmcubWFydGluZ2lsZGF5IC1EYXJ0aWZhY3RJZD10ZXN0MSAtRGFyY2hldHlwZUdyb3VwSWQ9b3JnLm1hcnRpbmdpbGRheSAtRGFyY2hldHlwZUFydGlmYWN0SWQ9dGVzdG5nLWFyY2hldHlwZQorICAgIC1EYXJjaGV0eXBlVmVyc2lvbj0xLjAtU05BUFNIT1QgLURyZW1vdGVSZXBvc2l0b3JpZXM9aHR0cDovL3d3dy5tYXJ0aW5naWxkYXkub3JnL3JlcG9zaXRvcnkvPC9wcmU+CisKKzxwPk9mIGNvdXJzZSBzdWJzdGl0dXRlIGluIHlvdXIgb3duIGdyb3VwSWQgYW5kIGFydGlmYWN0SWQuPC9wPgorPHA+RG9uJ3QgZm9yZ2V0IHRvIGtlZXAgY2hlY2tpbmcgYmFjayBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpbmdpbGRheS5vcmcvdXBkYXRlcy9NYXZlbitUZXN0TkcrQXJjaGV0eXBlIj5NYXJ0aW4ncyBibG9nPC9hPiBmb3IgbW9yZSB1cGRhdGVzLiA8L3A+Cis8IS0tIGVuZCBtYXZlbjIgYXJjaGV0eXBlIC0tPgorCis8YnIvPjxici8+Cis8aDMgaWQ9Im1hdmVuMSI+TWF2ZW4gMSAoYnkgQW5kcmV3IEdsb3Zlcik8L2gzPgorCis8cD5UaGUgVGVzdE5HIE1hdmVuIHBsdWctaW4gaXMgcXVpdGUgc2ltcGxlIGFuZCBjb25zaXN0cyBvZgordHdvIGdvYWxzIGFuZCBhIHNlcmllcyBvZiBvcHRpb25hbCBwcm9wZXJ0aWVzLjwvcD4KKworPHA+Q3VycmVudGx5IHRoZSAxLjEgdmVyc2lvbiBvZiB0aGUgcGx1Zy1pbiBpcyBidW5kbGVkIHdpdGgKK29mZmljaWFsIHJlbGVhc2VzIG9mIFRlc3RORy4gVG8gdXRpbGl6ZSB0aGUgcGx1Zy1pbiwgY29weSB0aGUKKzx0dD5tYXZlbi10ZXN0bmctcGx1Z2luLTx2ZXJzaW9uPi5qYXI8L3R0PiB0byB0aGUgPHR0PiRNQVZFTl9IT01FL3BsdWdpbnM8L3R0PgorZGlyZWN0b3J5LjwvcD4KKworPHA+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcGx1Zy1pbiAoMS4yIGFzIG9mIDEyLzEyLzA1KSwKK3VwZGF0ZSB5b3VyIDx0dD5tYXZlbi5yZXBvLnJlbW90ZTwvdHQ+IHRvIGluY2x1ZGUgPHR0Pmh0dHA6Ly93d3cudmFud2FyZHRlY2hub2xvZ2llcy5jb20vcmVwb3NpdG9yeS88L3R0PgorYW5kIHRoZW4gaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kOiA8dHQ+bWF2ZW4gcGx1Z2luOmRvd25sb2FkPC90dD4uIE1hdmVuIHdpbGwgaXNzdWUgYSBzZXJpZXMgb2YgcXVlc3Rpb25zLAorYW5zd2VyIHRoZW0gYXMgZm9sbG93czogPEJSPgorPEJSPgorPFRBQkxFIGJvcmRlcj0iMSIgaWQ9InRhYmxlMSI+CisgICAgPFRSPgorICAgICAgICA8VEQ+PHR0PmFydGlmYWN0SWQ6PC90dD48L1REPgorICAgICAgICA8VEQ+PHR0Pm1hdmVuLXRlc3RuZy1wbHVnaW48L3R0PjwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFI+CisgICAgICAgIDxURD5ncm91cElkOjwvVEQ+CisgICAgICAgIDxURD48dHQ+dGVzdG5nPC90dD48L1REPgorICAgIDwvVFI+CisgICAgPFRSPgorICAgICAgICA8VEQ+dmVyc2lvbjo8L1REPgorICAgICAgICA8VEQ+PHR0PjEuMjwvdHQ+PC9URD4KKyAgICA8L1RSPgorPC9UQUJMRT4KKzwvcD4KKworCis8aDQ+R29hbHM8L2g0PgorPHRhYmxlIGJvcmRlcj0iMSIgaWQ9InRhYmxlMiI+CisgICAgPHRyPgorICAgICAgICA8dGg+R29hbDwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dHQ+dGVzdG5nPC90dD48L3RkPgorICAgICAgICA8dGQ+UnVucyBUZXN0Tkc8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PHR0PnRlc3RuZzpqdW5pdC1yZXBvcnQ8L3R0PjwvdGQ+CisgICAgICAgIDx0ZD5DcmVhdGVzIGEgSlVuaXQgc3R5bGUgcmVwb3J0PC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKzxoND5Qcm9wZXJ0aWVzPC9oND4KKzx0YWJsZSBib3JkZXI9IjEiIGlkPSJ0YWJsZTMiPgorICAgIDx0cj4KKyAgICAgICAgPHRoPlByb3BlcnR5PC90aD4KKyAgICAgICAgPHRoPk9wdGlvbmFsPzwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dHQ+bWF2ZW4udGVzdG5nLnN1aXRleG1sLm5hbWU8L3R0PjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+WE1MIGZpbGUgbmFtZS0gZGVmYXVsdHMgdG8gPHR0PnRlc3RuZy54bWw8L3R0PjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48dHQ+bWF2ZW4udGVzdG5nLnN1aXRleG1sLmRpcjwvdHQ+PC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hlcmUgWE1MIGZpbGUgbGl2ZXMuIERlZmF1bHRzIHRvIDx0dD4ke2Jhc2VkaXJ9L3Rlc3QvY29uZjwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjx0dD5tYXZlbi50ZXN0bmcub3V0cHV0LmRpcjwvdHQ+PC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5EZWZhdWx0IHJlcG9ydCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIDx0dD4ke21hdmVuLmJ1aWxkLmRpcn0vdGVzdG5nLW91dHB1dDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjx0dD5tYXZlbi50ZXN0bmcucmVwb3J0LmRpcjwvdHQ+PC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5EaXJlY3RvcnkgZm9yIEpVbml0IHJlcG9ydHMuIERlZmF1bHRzIHRvIDx0dD4ke21hdmVuLmJ1aWxkLmRpcn0vdGVzdG5nSnVuaXRSZXBvcnQ8L3R0PjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzwhLS0gZW5kIG1hdmVuIHN0dWZmIC0tPgorCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitfdWFjY3QgPSAiVUEtMjM4MjE1LTIiOwordXJjaGluVHJhY2tlcigpOworPC9zY3JpcHQ+CisJCis8L2JvZHk+CmRpZmYgLS1naXQgYS9kb2MvbWlncmF0aW5nLmh0bWwgYi9kb2MvbWlncmF0aW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2N2M4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9taWdyYXRpbmcuaHRtbApAQCAtMCwwICsxLDExNCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5UZXN0TkcgLSBNaWdyYXRpbmcgZnJvbSBKVW5pdDwvdGl0bGU+CisKKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0ZXN0bmcuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9iZXVzdC5jc3MiICAvPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3ByZXR0aWZ5LmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYmFubmVyLmpzIj48L3NjcmlwdD4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hDb3JlLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hKYXZhLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hYbWwuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaEJhc2guanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaFBsYWluLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2JldXN0LmNvbS9zdHlsZXMvc2hDb3JlLmNzcyIvPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL3N0eWxlcy9zaFRoZW1lQ2VkcmljLmNzcyIvPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuY29uZmlnLmNsaXBib2FyZFN3ZiA9ICdzY3JpcHRzL2NsaXBib2FyZC5zd2YnOworICAgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmRlZmF1bHRzWydndXR0ZXInXSA9IGZhbHNlOworICAgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmFsbCgpOworICAgICAgICA8L3NjcmlwdD4KKworICAgICAgPC9oZWFkPgorPGJvZHkgb25Mb2FkPSJwcmV0dHlQcmludCgpIj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRpc3BsYXlNZW51KCJtaWdyYXRpbmcuaHRtbCIpCis8L3NjcmlwdD4KKworCis8aDIgYWxpZ249ImNlbnRlciI+TWlncmF0aW5nIGZyb20gSlVuaXQ8L2gyPgorCis8aDM+VXNpbmcgRWNsaXBzZTwvaDM+CisKK1RoZSBlYXNpZXN0IHdheSB0byBjb252ZXJ0IHlvdXIgSlVuaXQgdGVzdHMgdG8gVGVzdE5HIGlzIHRvIHVzZSB0aGUgRWNsaXBzZSBUZXN0TkcgcGx1Zy1pbiByZWZhY3RvcmluZyBzdXBwb3J0LiBZb3Ugd2lsbCBmaW5kIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBpdHMgZmVhdHVyZXMgaW4gdGhlIDxhIGhyZWY9ImVjbGlwc2UuaHRtbCNlY2xpcHNlLXF1aWNrZml4Ij5FY2xpcHNlIHNlY3Rpb248L2E+LgorCis8aDM+QXNzZXJ0czwvaDM+CitOb3RlIHRoYXQgdGhlIGNsYXNzIDx0dD5vcmcudGVzdG5nLkFzc2VydDwvdHQ+IHVzZXMgYSBkaWZmZXJlbnQgYXJndW1lbnQgb3JkZXJpbmcgdGhhbiB0aGUgb25lcyB1c2VkIGJ5IEpVbml0LiBJZiB5b3UgYXJlIHBvcnRpbmcgY29kZSB0aGF0IHVzZXMgSlVuaXQncyBhc3NlcnRzLCB5b3UgbWlnaHQgd2FudCB0byB1cyBhIHN0YXRpYyBpbXBvcnQgb2YgdGhhdCBjbGFzczoKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgoraW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0Lio7Cis8L3ByZT4KKworPGgzPlJ1bm5pbmcgSlVuaXQgVGVzdHM8L2gzPgorCis8cD5UZXN0TkcgY2FuIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGFuZCBydW4gSlVuaXQgdGVzdHMsIHNvIHlvdSBjYW4gdXNlIFRlc3RORyBhcyBhIHJ1bm5lciBmb3IgYWxsIHlvdXIgZXhpc3RpbmcgdGVzdHMgYW5kIHdyaXRlIG5ldyB0ZXN0cyB1c2luZyBUZXN0TkcuPC9wPgorCis8cD5BbGwgeW91IGhhdmUgdG8gZG8gaXMgdG8gcHV0IEpVbml0IGxpYnJhcnkgb24gdGhlIFRlc3RORyBjbGFzc3BhdGgsIHNvIGl0IGNhbiBmaW5kIGFuZCB1c2UgSlVuaXQgY2xhc3NlcywKK2NoYW5nZSB5b3VyIHRlc3QgcnVubmVyIGZyb20gSlVuaXQgdG8gVGVzdE5HIGluIEFudCBhbmQgdGhlbiBydW4gVGVzdE5HIGluIDx0dD4ibWl4ZWQiPC90dD4gbW9kZS4KK1RoaXMgd2F5IHlvdSBjYW4gaGF2ZSBhbGwgeW91ciB0ZXN0cyBpbiB0aGUgc2FtZSBwcm9qZWN0LCBldmVuIGluIHRoZSBzYW1lIHBhY2thZ2UsIGFuZCBzdGFydCB1c2luZyBUZXN0TkcuCitUaGlzIGFwcHJvYWNoIGFsc28gYWxsb3dzIHlvdSB0byBjb252ZXJ0IHlvdXIgZXhpc3RpbmcgSlVuaXQgdGVzdHMgdG8gVGVzdE5HIGluY3JlbWVudGFsbHkuPC9wPgorCis8aDQ+RXhhbXBsZSAtIHJlcGxhY2luZyBKVW5pdCBBbnQgdGFzayB3aXRoIFRlc3RORyBvbmU8L2g0PgorCitKVW5pdCB2ZXJzaW9uOgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7anVuaXQgZGlyPSIke3dvcmsuZGlyfSIgZXJyb3Jwcm9wZXJ0eT0idGVzdHMuZmFpbGVkIiBmYWlsdXJlcHJvcGVydHk9InRlc3RzLmZhaWxlZCIgZm9yaz0idHJ1ZSImZ3Q7CisgICAgJmx0O2JhdGNodGVzdCB0b2Rpcj0iJHtidWlsZC50ZXN0LnJlc3VsdHMuZGlyfSImZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLypUZXN0LioiLyZndDsKKyAgICAmbHQ7L2JhdGNodGVzdCZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aCBwYXRoPSIke3J1bi50ZXN0LmNsYXNzcGF0aH0iLyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7c3lzcHJvcGVydHlzZXQmZ3Q7CisgICAgICAgICZsdDtwcm9wZXJ0eXJlZiBwcmVmaXg9InRlc3Qtc3lzLXByb3AuIi8mZ3Q7CisgICAgICAgICZsdDttYXBwZXIgZnJvbT0idGVzdC1zeXMtcHJvcC4qIiB0bz0iKiIgdHlwZT0iZ2xvYiIvJmd0OworICAgICZsdDsvc3lzcHJvcGVydHlzZXQmZ3Q7CisgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJ4bWwiLyZndDsKKyAgICAmbHQ7anZtYXJnIHZhbHVlPSItZWEiLyZndDsKKyAgICAmbHQ7anZtYXJnIGxpbmU9IiR7cnVuLmp2bWFyZ3N9Ii8mZ3Q7CismbHQ7L2p1bml0Jmd0OworPC9wcmU+CisKK1Rlc3RORyB2ZXJzaW9uOgorPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CismbHQ7dGFza2RlZiBuYW1lPSJ0ZXN0bmciIGNsYXNzbmFtZT0ib3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrIiBjbGFzc3BhdGg9IiR7cnVuLnRlc3QuY2xhc3NwYXRofSIvJmd0OworCismbHQ7ZmlsZXNldCBpZD0ibWl4ZWQudGVzdHMiIGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qVGVzdC4qIi8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7CisKKyZsdDt0ZXN0bmcgbW9kZT0ibWl4ZWQiIGNsYXNzZmlsZXNldHJlZj0ibWl4ZWQudGVzdHMiIHdvcmtpbmdEaXI9IiR7d29yay5kaXJ9IiBmYWlsdXJlUHJvcGVydHk9InRlc3RzLmZhaWxlZCIgb3V0cHV0ZGlyPSIke2J1aWxkLnRlc3QucmVzdWx0cy5kaXJ9IiZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC50ZXN0LmNsYXNzZXMuZGlyfSIvJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHtydW4udGVzdC5jbGFzc3BhdGh9Ii8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2p1bml0LmxpYn0iLyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7cHJvcGVydHlzZXQmZ3Q7CisgICAgICAgICZsdDtwcm9wZXJ0eXJlZiBwcmVmaXg9InRlc3Qtc3lzLXByb3AuIi8mZ3Q7CisgICAgICAgICZsdDttYXBwZXIgZnJvbT0idGVzdC1zeXMtcHJvcC4qIiB0bz0iKiIgdHlwZT0iZ2xvYiIvJmd0OworICAgICZsdDsvcHJvcGVydHlzZXQmZ3Q7CisgICAgJmx0O2p2bWFyZyBsaW5lPSIke3J1bi5qdm1hcmdzfSIvJmd0OworJmx0Oy90ZXN0bmcmZ3Q7Cis8L3ByZT4KKworCis8aDM+UmVsYXRlZCByZWFkaW5nPC9oMz4KKworPHVsPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5nYW1tYS5jb20vYmxvZy8yMDExLzA0LzA0L2NvbnZlcnRpbmctb3BlbmdhbW1hLWp1bml0LXRlc3RuZyI+SGVyZSBpcyB0aGUgZGV0YWlsZWQgcmVwb3J0IG9mIGEgY29tcGFueSB0aGF0IHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQgYSBsYXJnZSBjb2RlYmFzZSBvZiBKVW5pdCA0IHRlc3RzIG92ZXIgdG8gVGVzdE5HPC9hPi48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2lraS5uZXRiZWFucy5vcmcvVGVzdE5HX01peGVkTW9kZSI+TWl4ZWQgbW9kZSBpbiBUZXN0Tkc8L2E+LjwvbGk+Cis8L3VsPgorCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK191YWNjdCA9ICJVQS0yMzgyMTUtMiI7Cit1cmNoaW5UcmFja2VyKCk7Cis8L3NjcmlwdD4KKworCis8L2JvZHk+CisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL21pc2MuaHRtbCBiL2RvYy9taXNjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjYjU3YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9taXNjLmh0bWwKQEAgLTAsMCArMSwyMDAgQEAKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+VGVzdE5HIC0gTWlzY2VsbGFuZW91czwvdGl0bGU+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJhbm5lci5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idGVzdG5nLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgICA8L2hlYWQ+Cis8Ym9keT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRpc3BsYXlNZW51KCJtaXNjLmh0bWwiKQorPC9zY3JpcHQ+CisKKworCis8aDIgYWxpZ249ImNlbnRlciI+TU9SRSA8YSBuYW1lPSJuZXdzIj5URVNUTkcgUkVBRElORzwvYT48L2gyPjxwPkhlcmUgYXJlCitzZXZlcmFsIGFydGljbGVzIGFuZCBwcmVzZW50YXRpb25zIGFib3V0IFRlc3RORyAoPGEgaHJlZj0iI2VuZ2xpc2giPkVuZ2xpc2g8L2E+LAorPGEgaHJlZj0iI2ZyZW5jaCI+RnJlbmNoPC9hPiwgPGEgaHJlZj0iI2dlcm1hbiI+R2VybWFuPC9hPikuPC9wPgorPGgzPjxhIG5hbWU9ImVuZ2xpc2giPkVuZ2xpc2g8L2E+PC9oMz48dWw+CisKKworPCEtLQorICAgICAgIDxsaT48YSBocmVmPSIiPjwvYT48L2xpPgorLS0+CisKKyAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9jb21tdW5pdHkub3JhY2xlLmNvbS9kb2NzL0RPQy05MTYzMTUiPlVzZSBUZXN0TkcgdG8gY3JlYXRlIHRlc3QgbG9ncyB0aGF0IGFyZSBzdHJ1Y3R1cmVkIGxpa2UgSmF2YWRvY3MgKFJhZ2h1bmFuZGFuIFNlc2hhZHJpLCBBdWd1c3QgMjAxNSk8L2E+PC9saT4KKyAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2Jsb2dzLmF0bGFzc2lhbi5jb20vMjAxMy8wMi90ZXN0bmctcGx1cy1qdW5pdC1iYW1ib28vIj4KKyAgICAgICAgSG93IEkgTGVhcm5lZCB0byBTdG9wIFdvcnJ5aW5nIGFuZCBMb3ZlIFRlc3RORyAoTWFyY2ggMjAxMyk8L2E+PC9saT4KKyAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3plcm90dXJuYXJvdW5kLmNvbS9sYWJzL3VzaW5nLXNwb2NrLXRvLXRlc3QtZ3Jvb3Z5LWFuZC1qYXZhLWFwcGxpY2F0aW9ucy8iPlVzaW5nIFNwb2NrIHRvIHRlc3QgR3Jvb3Z5IEFORCBKYXZhIGFwcGxpY2F0aW9ucyAoTWFyY2ggMjAxMyk8L2E+PC9saT4KKyAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hc2phdmEuY29tL3Rlc3RuZy90ZXN0bmctdHV0b3JpYWxzLyI+VGVzdE5HIHR1dG9yaWFscyAoSmFtbXkgQ2hlbik8L2E+PC9saT4KKyAgICAgICA8bGk+PGEKKyAgICAgICBocmVmPSJodHRwOi8va2FjemFub3dzY3kucGwvdG9tZWsvMjAxMi0wNC93aHktdGVzdG5nLWFuZC1ub3QtanVuaXQiPldoeSBUZXN0TkcgYW5kIG5vdCBKVW5pdD8gKFRvbWVrIEthY3phbm93c2tpKTwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnJhbmRvbXN5bmMubmV0LzIwMTIvMDIvZXhjZWwtdGVzdG5nLWRyaXZpbmctdGVzdG5nLXRlc3RzLmh0bWwiPlRlc3RORyBhbmQgRXhjZWw8L2E+PC9saT4KKyAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JhY2tzcGFjZS9weXRob24tcHJvYm9zY2lzIj5UZXN0TkcgaW4gUHl0aG9uPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbmdhbW1hLmNvbS9ibG9nLzIwMTEvMDQvMDQvY29udmVydGluZy1vcGVuZ2FtbWEtanVuaXQtdGVzdG5nIj5Db252ZXJ0aW5nIGEgbGFyZ2UgY29kZWJhc2UgZnJvbSBKVW5pdCA0IHRvIFRlc3RORzwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc2VsZW5pdW1leGFtcGxlcy5jb20vYmxvZy9ndWlkZS91c2luZy1zb2Z0LWFzc2VydGlvbnMtaW4tdGVzdG5nLyI+VXNpbmcgc29mdCBhc3NlcnRpb25zIHdpdGggVGVzdE5HPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9rYWN6YW5vd3NjeS5wbC90b21lay8yMDExLTAyL3Zpc3VhbGl6YXRpb24tZGVwZW5kZW50LXRlc3QtbWV0aG9kcyI+VmlzdWFsaXppbmcgbGl2ZSBkZXBlbmRlbmNpZXMgKFRvbWVrIEthY3phbm93c2tpKTwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lmx5c2VyZ2ljamF2YS5jb20vP3A9MTY1Ij5QYXNzaW5nIHBhcmFtZXRlcnMgdG8gQERhdGFQcm92aWRlcnMuPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9iYXJpc2VyZ3VuLmJsb2dzcG90LmNvbS8yMDEwLzA5L2ludGVncmF0ZWQtbW9ja2l0by10ZXN0bmctYW5kLWVtbWEtb24uaHRtbCI+VGVzdE5HLCBFbW1hIGFuZCBNb2NraXRvIDwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmRvdG5ldGVyLm9yZy8yMDEwLzA5L2RhdGEtZHJpdmVuLXRlc3RpbmctdXNpbmctc2VsZW5pdW0tdGVzdG5nLXBhcnQtMS1vZi00Lmh0bWwiPkRhdGEtZHJpdmVuIHRlc3RpbmcgdXNpbmcgU2VsZW5pdW0gYW5kIFRlc3RORyAodmlkZW8pPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9ibG9nLm1lZXNxYS5jb20vMjAxMC8wOS8xMS9jb21iaW5lLW11bHRpcGxlLXRlc3RuZy1yZXN1bHRzeG1sLWZpbGVzLWludG8tYS1zaW5nbGUteG1sLWZpbGUvIj5Db21iaW5pbmcgbXVsdGlwbGUgdGVzdG5nLXJlc3VsdHMueG1sIGZpbGUgaW50byBhIHNpbmdsZSBmaWxlPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90ZWNoby1lY2NvLmNvbS9ibG9nL3Rlc3RuZy13aXRoLWNvYmVydHVyYS8iPlRlc3RORyArIENvYmVydHVyYTwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmxvZy5qYXl3YXkuY29tLzIwMDkvMTIvMTQvcG93ZXJtb2NrLXRlc3RuZy10cnVlLyI+VGVzdE5HICsgUG93ZXJNb2NrICsgTW9ja2l0bzwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWF4aGVhcHNpemUuY29tLzIwMDkvMDkvMjMvdGVzdC1qYm9zcy1ydWxlcy01LXdpdGgtdGVzdG5nLyI+VGVzdE5HIGFuZCBEcm9vbHMgPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9mdW5jdGlvbmFsdGVzdGF1dG9tYXRpb24uYmxvZ3Nwb3QuY29tLzIwMDkvMTAvZGF0YXByb3ZpZGVyLWRhdGEtZHJpdmVuLXRlc3Rpbmctd2l0aC5odG1sIj5EYXRhIERyaXZlbiBUZXN0aW5nIHdpdGggU2VsZW5pdW0gYW5kIFRlc3RORzwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWFyZ2VsYXR1Lm9yZy8yMDA5LzA2LzI1L2phdmEtY29kZS1jb3ZlcmFnZS1yZXBvcnRzLWluLWVjbGlwc2UvIj5Db2RlIGNvdmVyYWdlIHdpdGggRW1tYSBhbmQgVGVzdE5HPC9hPjwvbGk+CisgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubWt5b25nLmNvbS91bml0dGVzdC9qdW5pdC00LXZzLXRlc3RuZy1jb21wYXJpc29uLyI+Q29tcGFyaXNvbiBiZXR3ZWVuIEpVbml0IDQgYW5kIFRlc3RORzwvYT48L2xpPgorICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm1pY2hhZWxtaW5lbGxhLmNvbS90ZXN0aW5nL3VuaXQtdGVzdGluZy13aXRoLXRlc3RuZy1hbmQtam1vY2tpdC5odG1sIj5Vbml0IHRlc3Rpbmcgd2l0aCBUZXN0TkcgYW5kIEpNb2NraXQgKHBhcnQgMSk8L2E+PC9saT4KKworICAgICAgIDxsaT4KKwk8YSBocmVmPSJodHRwOi8vd3d3Lm1pY2hhZWxtaW5lbGxhLmNvbS90ZXN0aW5nL3VuaXQtdGVzdGluZy13aXRoLXRlc3RuZy1hbmQtam1vY2tpdC1wYXJ0LTIuaHRtbCI+VW5pdCB0ZXN0aW5nIHdpdGggVGVzdE5HIGFuZCBKTW9ja2l0IChwYXJ0IDIpPC9hPjwvbGk+CisKKyAgICAgICA8bGk+CisJPGEgaHJlZj0iaHR0cDovL3d3dy50ZWNoYm9va3JlcG9ydC5jb20vdGJyMDMzMi5odG1sIj5SZXZpZXcgb2YgdGhlIGJvb2s8L2E+PC9saT4KKworCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vdGhlZGlzY29ibG9nLmNvbS8yMDA2LzEwLzA1L3Rlc3RuZy1pcy1zby1ncm9vdnkvIj5UZXN0TkcgYW5kCisJR3Jvb3Z5IChBbmRyZXcgR2xvdmVyLCBPY3RvYmVyIDIwMDYpPC9hPjwvbGk+CisJCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLWNxMDgyOTYvIj5JbgorCXB1cnN1aXQgb2YgY29kZSBxdWFsaXR5IChBbmRyZXcgR2xvdmVyLCBBdWd1c3QgMjAwNik8L2E+PC9saT4KKwkJPGxpPgorCTxhIGhyZWY9Imh0dHA6Ly9tZW1icmVzLmx5Y29zLmZyL3Rlc3RuZy8iPlRlc3RORyBUdXRvcmlhbCAoQ2xhdWRlIFF1ZXplbCwKKwlNYXJjaCAyMDA2KTwvYT48L2xpPgorCQk8bGk+CisJPGEgaHJlZj0iaHR0cDovL3N0cmlwZXMubWM0ai5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L3N0cmlwZXMvVW5pdCtUZXN0aW5nIj4KKwlUZXN0TkcgYW5kIFN0cmlwZXMgKFRpbSBGZW5uZWwsIEFwcmlsIDIwMDYpPC9hPjwvbGk+CisJCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vdGVzdGVhcmx5LmNvbS8yMDA2LzA0LzAzL3JlcnVubmluZy1vZi1mYWlsZWQtdGVzdHMvIj4KKwlSZXJ1bm5pbmcgZmFpbGVkIHRlc3RzIChBbmRyZXcgR2xvdmVyLCBBcHJpbCAyMDA2KTwvYT48L2xpPgorCQk8bGk+CisJPGEgaHJlZj0iaHR0cDovL2hvd2FyZGxld2lzc2hpcC5jb20vdGFwZXN0cnktamF2YWZvcmdlL3RhcGVzdHJ5LXRlc3RuZy8iPgorCVRhcGVzdHJ5IGFuZCBUZXN0TkcgKEhvd2FyZCBMZXdpcy1TaGlwLCBBcHJpbCAyMDA2KTwvYT48L2xpPgorCQk8bGk+CisJPGEgaHJlZj0iaHR0cDovL3RoZWRpc2NvYmxvZy5jb20vMjAwNi8wMy8yNy91c2luZy1qdW5pdC1leHRlbnNpb25zLWluLXRlc3RuZy8iPgorCVVzaW5nIEpVbml0IGV4dGVuc2lvbnMgaW4gVGVzdE5HIChBbmRyZXcgR2xvdmVyLCBNYXJjaCAyMDA2KTwvYT48L2xpPgorCQk8bGk+CisJPGEgaHJlZj0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9mb3J1bXMvZHdfdGhyZWFkLmpzcD9mb3J1bT04MTImdGhyZWFkPTExMDc2NSZjYXQ9MTAiPgorCUNvZGUgY292ZXJhZ2Ugb2YgVGVzdE5HIHRlc3RzIHdpdGggQ29iZXJ0dXJhIChBbmRyZXcgR2xvdmVyLCBNYXJjaCAyMDA2KTwvYT48L2xpPgorCQk8bGk+CisJPGEgaHJlZj0iaHR0cDovL2JldXN0LmNvbS93ZWJsb2cvYXJjaGl2ZXMvMDAwMzY5Lmh0bWwiPlN0YXRpc3RpY2FsIFRlc3RpbmcgKEMmZWFjdXRlO2RyaWMKKwlCZXVzdCwgRmVicnVhcnkgMjAwNik8L2E+PC9saT4KKwkJPGxpPgorCTxhIGhyZWY9Imh0dHA6Ly9iaWxsLmR1ZG5leS5uZXQvcm9sbGVyL3BhZ2UvYmlsbD9lbnRyeT10ZXN0bmdfaXNfYV9sZWFwX2JleW9uZCI+CisJVGVzdE5HIGFuZCBKVW5pdCAoQmlsbCBEdWRuZXksIEZlYnJ1YXJ5IDIwMDYpPC9hPjwvbGk+CisJCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy9hcmNoaXZlcy8wMDAzNjIuaHRtbCI+RGlzdHJpYnV0ZWQgVGVzdE5HIChDJmVhY3V0ZTtkcmljCisJQmV1c3QsIEphbnVhcnkgMjAwNik8L2E+PC9saT4KKwkJPGxpPgorCTxhIGhyZWY9Imh0dHA6Ly9lcmlrLnRoYXV2aW4ubmV0L2Jsb2cvbmV3cy5qc3A/ZGF0ZT0yMDA2LTAxLTI5IzQxOCI+VGVzdGluZworCXByaXZhdGUgbWV0aG9kcyAoRXJpayBUaGF1dmluLCBKYW51YXJ5IDIwMDYpPC9hPjwvbGk+CisJCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vYmxvZy5oaWJlcm5hdGUub3JnL2NnaS1iaW4vYmxvc3hvbS5jZ2kvMjAwNS8xMS8yNCNlamIzd2l0aHRlc3RuZyI+CisJVGVzdGluZyBFSkIzIHdpdGggVGVzdE5HIChDaHJpc3RpYW4gQmF1ZXIsIE5vdmVtYmVyIDIwMDUpPC9hPjwvbGk+CisJCTxsaT4KKwk8YSBocmVmPSJodHRwOi8vd3d3LnZhbndhcmR0ZWNobm9sb2dpZXMuY29tL2NlZHJpY2IwMS5waHAiPlZhbndhcmQKKwlUZWNobm9sb2dpZXMgaW50ZXJ2aWV3IChPY3RvYmVyIDIwMDUpPC9hPjwvbGk+CisJPGxpPgorCTxhIGhyZWY9Imh0dHA6Ly9qcm9sbGVyLmNvbS9wYWdlL3RmZW5uZT9lbnRyeT1pX21fc3RhcnRpbmdfdG9fcmVhbGx5Ij5UZXN0TkcKKwlyZWFjdGlvbiAoVGltIEZlbm5lbGwsIE9jdG9iZXIgMjAwNSk8L2E+PC9saT4KKwk8bGk+CisJPGEgaHJlZj0iaHR0cDovL3d3dy5yZWFsc29sdmUuY28udWsvc2l0ZS90ZWNoL2Jsb2cucGhwP25hbWU9cGhpbHpvaW8mbXlkYXRlPTIwMDUwODI2Ij4KKwlVc2luZyBKVW5pdCBsaWJyYXJpZXMgd2l0aCBUZXN0TkcgKFBoaWwgWm9pbywgQXVndXN0IDIwMDUpPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qeXBlcmlvbi5vcmcvYXJ0aWNsZXMvdGVzdG5nL3Rlc3RuZy5odG0iPkludHJvZHVjaW5nCisJVGVzdE5HIChUaGllcnJ5IEphbmF1ZHksIEF1Z3VzdCAyMDA1KTwvYT48L2xpPgorCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnRoZXNlcnZlcnNpZGUuY29tL25ld3MvdGhyZWFkLnRzcz90aHJlYWRfaWQ9MzU3MzciPgorCU1pZ3JhdGluZyB0byBUZXN0TkcgKFRoZVNlcnZlclNpZGUsIEF1Z3VzdCAyMDA1KTwvYT48L2xpPgorCTxsaT48YSBocmVmPSJodHRwOi8vZm9ydW0uc3ByaW5nZnJhbWV3b3JrLm9yZy92aWV3dG9waWMucGhwP3Q9NzkwMyI+VGVzdE5HCisJYW5kIFNwcmluZyAoQXVndXN0IDIwMDUpPC9hPjwvbGk+CisJPGxpPgorCTxhIGhyZWY9Imh0dHA6Ly9ncm91cHMtYmV0YS5nb29nbGUuY29tL2dyb3VwL2NvbXAubGFuZy5ydWJ5L2Jyb3dzZV90aHJlYWQvdGhyZWFkLzNhMDk1MjE5OWJiMWJjMWQvOGE0YTZkNzkzMWMwMzljZT9sbms9c3QmcT10ZXN0bmcrcnVieSZybnVtPTEmaGw9ZW4iPgorCVRlc3RORyBhbmQgUnVieSAoQXVndXN0IDIwMDUpPC9hPjwvbGk+CisJPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudGhlY2hhbmZhbS5uZXQvd29yZHByZXNzLz9wPTM2Ij5UZXN0TkcgYW5kIE1hdmVuCisJKEFwcmlsIDIwMDUpPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9rZXZpbi5vbmVpbGwuaWQuYXUvMjAwNS8wNC8wNi90ZXN0bmciPgorCQlUZXN0TkcgcmV2aWV3IChBcHJpbCAyMDA1KTwvYT48L2xpPjxsaT4KKwk8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTA0LTIwMDUvanctMDQwNC10ZXN0bmdfcC5odG1sIj4KKwlKYXZhV29ybGQgKEFwcmlsIDIwMDUpPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9wY2FsLm5ldC9ibG9nL2FyY2hpdmVzLzIwMDUvMDMvYV9ncmVhdF9uZXdfaWRlLmh0bWwiPgorCQlTb2x2aW5nIHRoZSBKVW5pdCBkZXBlbmRlbmN5IHByb2JsZW0gKE1hcmNoIDIwMDUpPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vd2VibG9nL2FyY2hpdmVzLzAwMDI1OS5odG1sIj4KKwkJQXJlIGRlcGVuZGVudCB0ZXN0IG1ldGhvZHMgcmVhbGx5IGV2aWw/Jm5ic3A7IChNYXJjaCAyMDA1KTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy9hcmNoaXZlcy8wMDAyNTIuaHRtbCI+CisJCVRoZSAmcXVvdDtjYWxsIHN1cGVyJnF1b3Q7IGFudGktcGF0dGVybiAoTWFyY2ggMjAwNSk8L2E+PC9saT48bGk+VGVzdE5HOiZuYnNwOyBBCisJCWRpZmZlcmVudCBsb29rIGF0IHRlc3RpbmcgKFByZXNlbnRhdGlvbiBhdCBUaGVTZXJ2ZXJTaWRlIFN5bXBvc2l1bSwKKwkJTWFyY2ggMjAwNSk8L2xpPjxsaT48YSBocmVmPSJodHRwOi8vYmV1c3QuY29tL3dlYmxvZy9hcmNoaXZlcy8wMDAyMzYuaHRtbCI+CisJCVRlc3RpbmcgYXN5bmNocm9ub3VzIGNvZGUgd2l0aCBUZXN0TkcgKEZlYnJ1YXJ5IDIwMDUpPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvamF2YS9saWJyYXJ5L2otdGVzdG5nLyI+CisJCU1ha2luZyBUZXN0aW5nIGEgQnJlZXplIHdpdGggVGVzdE5HIChEZXZlbG9wZXJXb3JrcywgSmFudWFyeSAyMDA1KTwvYT4KKwkJKGFsc28KKwk8YSBocmVmPSJodHRwOi8vd3d3LjUxdGVzdGluZy5jb20vdGVjaC8yMDA1MDEyMl8xLmh0bSI+aW4gQ2hpbmVzZTwvYT4pPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy50aGVzZXJ2ZXJzaWRlLmNvbS9uZXdzL3RocmVhZC50c3M/dGhyZWFkX2lkPTMxMjE0Ij4KKwkJVGVzdE5HOiZuYnNwOyBDYXRjaCB0aGUgVGVzdGluZyBGZXZlciAoVGhlU2VydmVyU2lkZSwgSmFudWFyeSAyMDA1KTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmJldXN0LmNvbS93ZWJsb2cvYXJjaGl2ZXMvMDAwMjMwLmh0bWwiPgorCQlXaHkgdXNlIFhNTCB0byBjb25maWd1cmUgdGVzdHM/Jm5ic3A7IChKYW51YXJ5IDIwMDUpPC9hPjwvbGk+PGxpPgorCTxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXBvbGlzLmNvbS9jb25mbHVlbmNlL2Rpc3BsYXkvSlAwNC9CZXlvbmQrSlVuaXQrLCtpbnRyb2R1Y2luZytUZXN0TkcsK3RoZStuZXh0K2dlbmVyYXRpb24raW4rdGVzdGluZyI+CisJVGVzdE5HOiZuYnNwOyBCZXlvbmQgSlVuaXQgKFByZXNlbnRhdGlvbiBhdCBKYXZhUG9saXMsIEJlbGdpdW0sIERlY2VtYmVyCisJMjAwNCk8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL3d3dy50aGVzZXJ2ZXJzaWRlLmNvbS9uZXdzL3RocmVhZC50c3M/dGhyZWFkX2lkPTMwMzk0Ij4KKwkJQW5ub3VuY2luZyBUZXN0TkcgMi4wIChUaGVTZXJ2ZXJTaWRlLCBEZWNlbWJlciAyMDA0KTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmphdmFsb2JieS5vcmcvYXJ0aWNsZXMvdGVzdG5nLyI+CisJCVRlc3RORzombmJzcDsgQ2F0Y2hpbmcgdGhlIFRlc3RORyBmZXZlciAoSmF2YUxvYmJ5LCBEZWNlbWJlciAyMDA0KTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vd3d3LmJldXN0LmNvbS93ZWJsb2cvYXJjaGl2ZXMvMDAwMTcwLmh0bWwiPgorCQlVc2luZyBpbmhlcml0YW5jZSBvZiBhbm5vdGF0aW9ucyBmb3IgZmxleGlibGUgdGVzdGluZyAoQXVndXN0IDIwMDQpPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYmV1c3QuY29tL3dlYmxvZy9hcmNoaXZlcy8wMDAxNzUuaHRtbCI+CisJCU11bHRpcGxlIGluc3RhbnRhdGlvbnMgb2YgdGVzdHMgKEF1Z3VzdCAyMDA0KTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwOi8vdGhlc2VydmVyc2lkZS5jb20vYmxvZ3Mvc2hvd2Jsb2cudHNzP2lkPVVuaXRpemVkIj4KKwkJRG9uJ3QgZ2V0IHVuaXRpemVkIChKdWx5IDIwMDQpPC9hPjwvbGk+PGxpPgorCTxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS91cmw/c2E9WCZzdGFydD0zJnE9aHR0cDovL3d3dy50aGVzZXJ2ZXJzaWRlLmNvbS9uZXdzL3RocmVhZC50c3M/dGhyZWFkX2lkPTI1NTY4Ij4KKwlUZXN0Tkc6Jm5ic3A7IFRlc3RpbmcsIHRoZSBOZXh0IEdlbmVyYXRpb24gKFRoZVNlcnZlclNpZGUsIEFwcmlsIDIwMDQpPC9hPjwvbGk+PC91bD4KKzxoMz48YSBuYW1lPSJmcmVuY2giPkZyZW5jaDwvYT48L2gzPgorPHVsPgorCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNwYWx1ZC5pbmZvL3Rlc3RuZy8iPkxlIGZyYW1ld29yayBUZXN0Tkc8L2E+IChTJmVhY3V0ZTtiYXN0aWVuCisJUGFsdWQsIEFwcmlsIDIwMDYpPGJyPgorJm5ic3A7PC9saT4KKzwvdWw+CisKKzxoMz48YSBuYW1lPSJnZXJtYW4iPkdlcm1hbjwvYT48L2gzPgorPHVsPgorCTxsaT48YSBocmVmPSJodHRwOi8vd3d3LnFhd2FyZS5kZS9kb3dubG9hZHMvdG8xLWFkZXJzYmVyZ2VyLnBkZiI+Q29tcGFyaXNvbiBUZXN0TkcgLyBKVW5pdCA0PC9hPiAoSm9zZWYgQWRlcnNiZXJnZXIsCisJTWF5IDIwMDYsIFBERik8YnI+CismbmJzcDs8L2xpPgorPC91bD4KKworPGgyIGFsaWduPSJjZW50ZXIiPgorPGEgbmFtZT0iY29udHJpYnV0b3JzIj5DT05UUklCVVRPUlM8L2E+PC9oMj48cCBhbGlnbj0ibGVmdCI+VGVzdE5HIGhhcyByZWNlaXZlZCBhIGxvdCBvZiBoZWxwIGZyb20gdmFyaW91cyBwZW9wbGUgdGhyb3VnaG91dAoraXRzIGV4aXN0ZW5jZS48L3A+PHAgYWxpZ249ImxlZnQiPldpdGggY29kZTo8L3A+PHVsPgorCTxsaT4KKwk8cCBhbGlnbj0ibGVmdCI+PGEgaHJlZj0ibWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvIj5BbGV4YW5kcnUgUG9wZXNjdTwvYT4sCisJd2hvIHBvcnRlZCBUZXN0TkcgdG8gSkRLIDEuNCBhbmQgaGFzIGJlZW4gdGlyZWxlc3NseSBjb250cmlidXRpbmcgZXZlcgorCXNpbmNlLjwvbGk+CisJPGxpPgorCTxwIGFsaWduPSJsZWZ0Ij5IYW5pIFN1bGVpbWFuIGFuZCBNYXJrIERlcnJpY3V0dCAoSURFQSBwbHVnLWluKS48L2xpPgorCTxsaT4KKwk8cCBhbGlnbj0ibGVmdCI+QW5kcmV3IEdsb3ZlciBhbmQgPGEgaHJlZj0iaHR0cDovL3RhY29zLnNvdXJjZWZvcmdlLm5ldCI+SmVzc2UgS3VobmVydDwvYT4vPGEgaHJlZj0iaHR0cDovL2Jsb2dzLmNvZGVoYXVzLm9yZy9wZW9wbGUvYnJldHQvL2FyY2hpdmVzL21hdmVuLmh0bWwiPkJyZXR0IFBvcnRlcjwvYT4gKE1hdmVuIDEgYW5kIE1hdmVuIDIKKwlwbHVnLWlucyByZXNwZWN0aXZlbHkpLjwvbGk+PGxpPgorCTxwIGFsaWduPSJsZWZ0Ij5Kb2xseSBDaGVuIChKVW5pdFJlcG9ydCBwbHVnLWluKS48L2xpPjxsaT4KKwk8cCBhbGlnbj0ibGVmdCI+VGhpZXJyeSBKYW5hdWR5IChQREYgcmVwb3J0IHBsdWctaW4pLjwvbGk+PC91bD48cCBhbGlnbj0ibGVmdCI+QW5kIGFsc28gd2l0aCBpZGVhcywgYXJ0aWNsZXMgYW5kIGJ1ZyByZXBvcnRzOjwvcD48dWw+CisJPGxpPgorCTxwIGFsaWduPSJsZWZ0Ij5GaWxpcHBvIERpb3RhbGV2aSwgTWF0dGhldyBTY2htaWR0IFJvYmVydCBNY0ludG9zaCwgSlIKKwlCb3llbnMsIFJvYmVydCBXYXRraW5zLCBBbGVrc2kgS2FsbGlvLCBEb3VnIExlYSwgRXJvbiBXcmlnaHQsIEd1aWxsYXVtZQorCUxhZm9yZ2UsIE93ZW4gR3JpZmZpdGhzLCBKZWFuLUxvdWlzIEJlcmxpZXQsCisJTW9ydGVuIENocmlzdGVuc2VuIGFuZCBtYW55IG90aGVycy4uLiA8L2xpPgorPC91bD4KKworPGgyIGFsaWduPSJjZW50ZXIiPiZuYnNwOzwvaDI+CisKKzxoMiBhbGlnbj0iY2VudGVyIj4KK1NQRUNJQUwgVEhBTktTCis8L2gyPgorVG8gPGEgaHJlZj0iaHR0cDovL3lvdXJraXQuY29tIj5Zb3VyS2l0PC9hPiBmb3IgaGVscGluZyB1cyBwcm9maWxpbmcgVGVzdE5HLjxwPiZuYnNwOzwvcD4KKworCis8aDIgYWxpZ249ImNlbnRlciI+PGEgbmFtZT0idGVzdGltb25pZXMiPlRFU1RJTU9OSUVTPC9hPjwvaDI+PHAgYWxpZ249ImxlZnQiPkEgZ3JlYXQgcHJvZHVjdCBpcyBub3RoaW5nIHdpdGhvdXQgdGVzdGltb25pZXMsIHNvIGhlcmUgaXMgd2hhdAorcGVvcGxlIGhhdmUgdG8gc2F5IGFib3V0IFRlc3RORzo8L3A+PHAgYWxpZ249ImxlZnQiPiZxdW90O0l0J3MgYSBsb3Qgb2YgZnVuLiZuYnNwOyBOb3QgYXMgZnVuIGFzIFNlaW5mZWxkLCBidXQgbW9yZSBmdW4gdGhhbgorQ2hyaXMgUm9jayBvbiBhIGJhZCBkYXkmcXVvdDs8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsgLSA8aT5BIGJ1ZGR5PC9pPiZuYnNwOzxicj4KKzxicj4KKyZxdW90O0FyZSB5b3UgZ29pbmcgdG8gZWF0IHlvdXIgZGVzc2VydD8mcXVvdDs8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsgLSA8aT5Tb21lb25lIEkgbWV0IGF0IHRoZSBjYWZldGVyaWE8L2k+PGJyPgorJm5ic3A7PGJyPgorJnF1b3Q7Um9jayBvbiwgZHVkZSZxdW90Ozxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyAtIDxpPkEgc2thdGVib2FyZGVyPGJyPgorPC9pPiZuYnNwOzxicj4KKyZxdW90O09rYXksIEknbGwgdHJ5IGl0LiZuYnNwOyBDYW4gSSBoYXZlIG15IGxhcHRvcCBiYWNrIG5vdyZxdW90Oz88YnI+CismbmJzcDsmbmJzcDsmbmJzcDsgLSA8aT5BIHNjYXJlZCBjb250cmFjdG9yPGJyPgorPC9pPiZuYnNwOzxicj4KKyZxdW90O0NlZHJpYywgc3RvcCB0YWxraW5nIHRvIGhpbSwgaGUncyBzbGVlcGluZyZxdW90Ozxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyAtIDxpPlNvbWUgcmFuZG9tIHBlcnNvbiB3aG8gc2hvdWxkIG1pbmQgdGhlaXIgb3duIGJ1c2luZXNzPC9pPjwvcD4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2MvcGljcy9jaHJvbm9sb2dpY2FsLW1ldGhvZHMucG5nIGIvZG9jL3BpY3MvY2hyb25vbG9naWNhbC1tZXRob2RzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUyM2JlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BpY3MvY2hyb25vbG9naWNhbC1tZXRob2RzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcGljcy9wYXJhbWV0ZXJzLnBuZyBiL2RvYy9waWNzL3BhcmFtZXRlcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTlmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGljcy9wYXJhbWV0ZXJzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcGljcy9zaG93LW91dHB1dDEucG5nIGIvZG9jL3BpY3Mvc2hvdy1vdXRwdXQxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWMxZjNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BpY3Mvc2hvdy1vdXRwdXQxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcGljcy9zaG93LW91dHB1dDIucG5nIGIvZG9jL3BpY3Mvc2hvdy1vdXRwdXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA2ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3BpY3Mvc2hvdy1vdXRwdXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcHJldHRpZnkuY3NzIGIvZG9jL3ByZXR0aWZ5LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JhYjIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3ByZXR0aWZ5LmNzcwpAQCAtMCwwICsxLDM0IEBACisucHJldHR5cHJpbnQgLmt3ZCwgLnRhZyB7DQorICBmb250LXdlaWdodDogYm9sZDsNCisgIGNvbG9yOiAjN2YwMDU1Ow0KK30NCisNCisucHJldHR5cHJpbnQgLnN0ciwuYXR2IHsNCisgIGNvbG9yOiAjMDAwMGNjOw0KK30NCisNCisucHJldHR5cHJpbnQgLmNvbSB7DQorICBjb2xvcjogIzAwODgwMDsNCit9DQorDQorLnByZXR0eXByaW50IC5saXQgew0KKyAgY29sb3I6ICNjYzIyMjI7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQorDQorDQorcHJlLnByZXR0eXByaW50IHsgcGFkZGluZzogMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjODg4OyB9DQorDQorQG1lZGlhIHByaW50IHsNCisgIC5zdHIgeyBjb2xvcjogIzA2MDsgfQ0KKyAgLmt3ZCB7IGNvbG9yOiAjMDA2OyBmb250LXdlaWdodDogYm9sZDsgfQ0KKyAgLmNvbSB7IGNvbG9yOiAjNjAwOyBmb250LXN0eWxlOiBpdGFsaWM7IH0NCisgIC50eXAgeyBjb2xvcjogIzQwNDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCisgIC5saXQgeyBjb2xvcjogIzA0NDsgfQ0KKyAgLnB1biB7IGNvbG9yOiAjNDQwOyB9DQorICAucGxuIHsgY29sb3I6ICMwMDA7IH0NCisgIC50YWcgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCisgIC5hdG4geyBjb2xvcjogIzQwNDsgfQ0KKyAgLmF0diB7IGNvbG9yOiAjMDYwOyB9DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2RvYy9wcmV0dGlmeS5qcyBiL2RvYy9wcmV0dGlmeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg4NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3ByZXR0aWZ5LmpzCkBAIC0wLDAgKzEsMTMxNCBAQAorLy8gQ29weXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4NCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKy8vDQorLy8gbXNhbXVlbEBnb29nbGUuY29tDQorDQorLy8gVXNhZ2U6DQorLy8gMSkgaW5jbHVkZSB0aGlzIHNvdXJjZSBmaWxlIGluIGFuIGh0bWwgcGFnZSB2aWENCisvLyA8c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0IHNyYz1wcmV0dGlmeS5qcz48L3NjcmlwdD4NCisvLyAyKSBkZWZpbmUgc3R5bGUgcnVsZXMuICBTZWUgdGhlIGV4YW1wbGUgcGFnZSBmb3IgZXhhbXBsZXMuDQorLy8gMykgbWFyayB0aGUgPHByZT4gYW5kIDxjb2RlPiB0YWdzIGluIHlvdXIgc291cmNlIHdpdGggY2xhc3M9cHJldHR5cHJpbnQuDQorLy8gICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgKGh0bWwgZGVwcmVjYXRlZCkgPHhtcD4gdGFnLCBidXQgdGhlIHByZXR0eSBwcmludGVyDQorLy8gICAgbmVlZHMgdG8gZG8gbW9yZSBzdWJzdGFudGlhbCBET00gbWFuaXB1bGF0aW9ucyB0byBzdXBwb3J0IHRoYXQsIHNvIHNvbWUNCisvLyAgICBjc3Mgc3R5bGVzIG1heSBub3QgYmUgcHJlc2VydmVkLg0KKw0KKy8vIENoYW5nZSBsb2c6DQorLy8gY2JldXN0LCAyMDA2LzA4LzIyDQorLy8gICBKYXZhIGFubm90YXRpb25zIChzdGFydCB3aXRoICJAIikgYXJlIG5vdyBjYXB0dXJlZCBhcyBsaXRlcmFscyAoImxpdCIpDQorLy8gDQorDQordmFyIFBSX2tleXdvcmRzID0gbmV3IE9iamVjdCgpOw0KKy8qKiBpbml0aWFsaXplIHRoZSBrZXl3b3JkIGxpc3QgZm9yIG91ciB0YXJnZXQgbGFuZ3VhZ2VzLiAqLw0KKyhmdW5jdGlvbiAoKSB7DQorICB2YXIgQ1BQX0tFWVdPUkRTID0gKA0KKyAgICAiYm9vbCBicmVhayBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29uc3RfY2FzdCBjb250aW51ZSBkZWZhdWx0ICIgKw0KKyAgICAiZGVsZXRlIGRlcHJlY2F0ZWQgZGxsZXhwb3J0IGRsbGltcG9ydCBkbyBkb3VibGUgZHluYW1pY19jYXN0IGVsc2UgZW51bSAiICsNCisgICAgImV4cGxpY2l0IGV4dGVybiBmYWxzZSBmbG9hdCBmb3IgZnJpZW5kIGdvdG8gaWYgaW5saW5lIGludCBsb25nIG11dGFibGUgIiArDQorICAgICJuYWtlZCBuYW1lc3BhY2UgbmV3IG5vaW5saW5lIG5vcmV0dXJuIG5vdGhyb3cgbm92dGFibGUgb3BlcmF0b3IgcHJpdmF0ZSAiICsNCisgICAgInByb3BlcnR5IHByb3RlY3RlZCBwdWJsaWMgcmVnaXN0ZXIgcmVpbnRlcnByZXRfY2FzdCByZXR1cm4gc2VsZWN0YW55ICIgKw0KKyAgICAic2hvcnQgc2lnbmVkIHNpemVvZiBzdGF0aWMgc3RhdGljX2Nhc3Qgc3RydWN0IHN3aXRjaCB0ZW1wbGF0ZSB0aGlzICIgKw0KKyAgICAidGhyZWFkIHRocm93IHRydWUgdHJ5IHR5cGVkZWYgdHlwZWlkIHR5cGVuYW1lIHVuaW9uIHVuc2lnbmVkIHVzaW5nICIgKw0KKyAgICAiZGVjbGFyYXRpb24sIHVzaW5nIGRpcmVjdGl2ZSB1dWlkIHZpcnR1YWwgdm9pZCB2b2xhdGlsZSB3aGlsZSB0eXBlb2YiKTsNCisgIHZhciBKQVZBX0tFWVdPUkRTID0gKA0KKyAgICAiYWJzdHJhY3QgZGVmYXVsdCBnb3RvIHBhY2thZ2Ugc3luY2hyb25pemVkIGJvb2xlYW4gZG8gaWYgcHJpdmF0ZSB0aGlzICIgKw0KKyAgICAiYnJlYWsgZG91YmxlIGltcGxlbWVudHMgcHJvdGVjdGVkIHRocm93IGJ5dGUgZWxzZSBpbXBvcnQgcHVibGljIHRocm93cyAiICsNCisgICAgImNhc2UgZW51bSBpbnN0YW5jZW9mIHJldHVybiB0cmFuc2llbnQgY2F0Y2ggZXh0ZW5kcyBpbnQgc2hvcnQgdHJ5IGNoYXIgIiArDQorICAgICJmaW5hbCBpbnRlcmZhY2Ugc3RhdGljIHZvaWQgY2xhc3MgZmluYWxseSBsb25nIHN0cmljdGZwIHZvbGF0aWxlIGNvbnN0ICIgKw0KKyAgICAiZmxvYXQgbmF0aXZlIHN1cGVyIHdoaWxlIGNvbnRpbnVlIGZvciBuZXcgc3dpdGNoIik7DQorICB2YXIgUFlUSE9OX0tFWVdPUkRTID0gKA0KKyAgICAiYW5kIGFzc2VydCBicmVhayBjbGFzcyBjb250aW51ZSBkZWYgZGVsIGVsaWYgZWxzZSBleGNlcHQgZXhlYyBmaW5hbGx5ICIgKw0KKyAgICAiZm9yIGZyb20gZ2xvYmFsIGlmIGltcG9ydCBpbiBpcyBsYW1iZGEgbm90IG9yIHBhc3MgcHJpbnQgcmFpc2UgcmV0dXJuICIgKw0KKyAgICAidHJ5IHdoaWxlIHlpZWxkIik7DQorICB2YXIgSlNDUklQVF9LRVlXT1JEUyA9ICgNCisgICAgImFic3RyYWN0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29udGludWUgIiArDQorICAgICJkZWJ1Z2dlciBkZWZhdWx0IGRlbGV0ZSBkbyBkb3VibGUgZWxzZSBlbnVtIGV4cG9ydCBleHRlbmRzIGZhbHNlIGZpbmFsICIgKw0KKyAgICAiZmluYWxseSBmbG9hdCBmb3IgZnVuY3Rpb24gZ290byBpZiBpbXBsZW1lbnRzIGltcG9ydCBpbiBpbnN0YW5jZW9mIGludCAiICsNCisgICAgImludGVyZmFjZSBsb25nIG5hdGl2ZSBuZXcgbnVsbCBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZXR1cm4gIiArDQorICAgICJzaG9ydCBzdGF0aWMgc3VwZXIgc3dpdGNoIHN5bmNocm9uaXplZCB0aGlzIHRocm93IHRocm93cyB0cmFuc2llbnQgIiArDQorICAgICJ0cnVlIHRyeSB0eXBlb2YgdmFyIHZvaWQgdm9sYXRpbGUgd2hpbGUgd2l0aCBOYU4gSW5maW5pdHkiKTsNCisgIHZhciBQRVJMX0tFWVdPUkRTID0gKA0KKyAgICAiZm9yZWFjaCByZXF1aXJlIHN1YiB1bmxlc3MgdW50aWwgdXNlIGVsc2lmIEJFR0lOIEVORCIpOw0KKyAgdmFyIFNIX0tFWVdPUkRTID0gKA0KKyAgICAiaWYgdGhlbiBkbyBlbHNlIGZpIGVuZCIpOw0KKyAgdmFyIEtFWVdPUkRTID0gW0NQUF9LRVlXT1JEUywgSkFWQV9LRVlXT1JEUywgUFlUSE9OX0tFWVdPUkRTLA0KKyAgICAgICAgICAgICAgICAgIEpTQ1JJUFRfS0VZV09SRFMsIFBFUkxfS0VZV09SRFMsIFNIX0tFWVdPUkRTXTsNCisgIGZvciAodmFyIGsgPSAwOyBrIDwgS0VZV09SRFMubGVuZ3RoOyBrKyspIHsNCisgICAgdmFyIGt3ID0gS0VZV09SRFNba10uc3BsaXQoJyAnKTsNCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrdy5sZW5ndGg7IGkrKykgew0KKyAgICAgIGlmIChrd1tpXSkgeyBQUl9rZXl3b3Jkc1trd1tpXV0gPSB0cnVlOyB9DQorICAgIH0NCisgIH0NCit9KS5jYWxsKHRoaXMpOw0KKw0KKy8vIHRva2VuIHN0eWxlIG5hbWVzLiAgY29ycmVzcG9uZCB0byBjc3MgY2xhc3Nlcw0KKy8qKiB0b2tlbiBzdHlsZSBmb3IgYSBzdHJpbmcgbGl0ZXJhbCAqLw0KK3ZhciBQUl9TVFJJTkcgPSAnc3RyJzsNCisvKiogdG9rZW4gc3R5bGUgZm9yIGEga2V5d29yZCAqLw0KK3ZhciBQUl9LRVlXT1JEID0gJ2t3ZCc7DQorLyoqIHRva2VuIHN0eWxlIGZvciBhIGNvbW1lbnQgKi8NCit2YXIgUFJfQ09NTUVOVCA9ICdjb20nOw0KKy8qKiB0b2tlbiBzdHlsZSBmb3IgYSB0eXBlICovDQordmFyIFBSX1RZUEUgPSAndHlwJzsNCisvKiogdG9rZW4gc3R5bGUgZm9yIGEgbGl0ZXJhbCB2YWx1ZS4gIGUuZy4gMSwgbnVsbCwgdHJ1ZS4gKi8NCit2YXIgUFJfTElURVJBTCA9ICdsaXQnOw0KKy8qKiB0b2tlbiBzdHlsZSBmb3IgYSBwdW5jdHVhdGlvbiBzdHJpbmcuICovDQordmFyIFBSX1BVTkNUVUFUSU9OID0gJ3B1bic7DQorLyoqIHRva2VuIHN0eWxlIGZvciBhIHB1bmN0dWF0aW9uIHN0cmluZy4gKi8NCit2YXIgUFJfUExBSU4gPSAncGxuJzsNCisNCisvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgdGFnLiAqLw0KK3ZhciBQUl9UQUcgPSAndGFnJzsNCisvKiogdG9rZW4gc3R5bGUgZm9yIGEgbWFya3VwIGRlY2xhcmF0aW9uIHN1Y2ggYXMgYSBET0NUWVBFLiAqLw0KK3ZhciBQUl9ERUNMQVJBVElPTiA9ICdkZWMnOw0KKy8qKiB0b2tlbiBzdHlsZSBmb3IgZW1iZWRkZWQgc291cmNlLiAqLw0KK3ZhciBQUl9TT1VSQ0UgPSAnc3JjJzsNCisvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgYXR0cmlidXRlIG5hbWUuICovDQordmFyIFBSX0FUVFJJQl9OQU1FID0gJ2F0bic7DQorLyoqIHRva2VuIHN0eWxlIGZvciBhbiBzZ21sIGF0dHJpYnV0ZSB2YWx1ZS4gKi8NCit2YXIgUFJfQVRUUklCX1ZBTFVFID0gJ2F0dic7DQorDQorLyoqIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIGEgdG9rZW4gZHVyaW5nLiAgQSBkaXZpc2lvbiBvZiBhIHN0cmluZyBpbnRvDQorICAqIG4gdG9rZW5zIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBuIC0gMSB0b2tlbiBlbmRzLCBhcyBsb25nIGFzDQorICAqIHJ1bnMgb2Ygd2hpdGVzcGFjZSB3YXJyYW50IHRoZWlyIG93biB0b2tlbi4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfVG9rZW5FbmQoZW5kLCBzdHlsZSkgew0KKyAgaWYgKHVuZGVmaW5lZCA9PT0gc3R5bGUpIHsgdGhyb3cgbmV3IEVycm9yKCdCQUQnKTsgfQ0KKyAgaWYgKCdudW1iZXInICE9IHR5cGVvZihlbmQpKSB7IHRocm93IG5ldyBFcnJvcignQkFEJyk7IH0NCisgIHRoaXMuZW5kID0gZW5kOw0KKyAgdGhpcy5zdHlsZSA9IHN0eWxlOw0KK30NCitQUl9Ub2tlbkVuZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7DQorICByZXR1cm4gJ1tQUl9Ub2tlbkVuZCAnICsgdGhpcy5lbmQgKw0KKyAgICAodGhpcy5zdHlsZSA/ICc6JyArIHRoaXMuc3R5bGUgOiAnJykgKyAnXSc7DQorfTsNCisNCisNCisvKiogYSBjaHVuayBvZiB0ZXh0IHdpdGggYSBzdHlsZS4gIFRoZXNlIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoIHRoZSBvdXRwdXQNCisgICogZnJvbSB0aGUgbGV4aW5nIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIGludGVybWVkaWF0ZSByZXN1bHRzLg0KKyAgKiBAY29uc3RydWN0b3INCisgICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiB0ZXh0DQorICAqIEBwYXJhbSBzdHlsZSBvbmUgb2YgdGhlIHRva2VuIHN0eWxlcyBkZWZpbmVkIGluIGRlc2lnbmRvYy10ZW1wbGF0ZSwgb3IgbnVsbA0KKyAgKiAgIGZvciBhIHN0eWxlbGVzcyB0b2tlbiwgc3VjaCBhcyBhbiBlbWJlZGRlZCBodG1sIHRhZy4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfVG9rZW4odG9rZW4sIHN0eWxlKSB7DQorICBpZiAodW5kZWZpbmVkID09PSBzdHlsZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ0JBRCcpOyB9DQorICB0aGlzLnRva2VuID0gdG9rZW47DQorICB0aGlzLnN0eWxlID0gc3R5bGU7DQorfQ0KKw0KK1BSX1Rva2VuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsNCisgIHJldHVybiAnW1BSX1Rva2VuICcgKyB0aGlzLnRva2VuICsgKHRoaXMuc3R5bGUgPyAnOicgKyB0aGlzLnN0eWxlIDogJycpICsgJ10nOw0KK307DQorDQorDQorLyoqIGEgaGVscGVyIGNsYXNzIHRoYXQgZGVjb2RlcyBjb21tb24gaHRtbCBlbnRpdGllcyB1c2VkIHRvIGVzY2FwZSBzb3VyY2UgYW5kDQorICAqIG1hcmt1cCBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGluIGh0bWwuDQorICAqIEBjb25zdHJ1Y3Rvcg0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9EZWNvZGVIZWxwZXIoKSB7DQorICB0aGlzLm5leHQgPSAwOw0KKyAgdGhpcy5jaCA9ICdcMCc7DQorfQ0KKw0KK1BSX0RlY29kZUhlbHBlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHMsIGkpIHsNCisgIHZhciBuZXh0ID0gaSArIDE7DQorICB2YXIgY2ggPSBzLmNoYXJBdChpKTsNCisgIGlmICgnJicgPT0gY2gpIHsNCisgICAgdmFyIHNlbWkgPSBzLmluZGV4T2YoJzsnLCBuZXh0KTsNCisgICAgaWYgKHNlbWkgPj0gMCAmJiBzZW1pIDwgbmV4dCArIDQpIHsNCisgICAgICB2YXIgZW50aXR5TmFtZSA9IHMuc3Vic3RyaW5nKG5leHQsIHNlbWkpLnRvTG93ZXJDYXNlKCk7DQorICAgICAgbmV4dCA9IHNlbWkgKyAxOw0KKyAgICAgIGlmICgnbHQnID09IGVudGl0eU5hbWUpIHsNCisgICAgICAgIGNoID0gJzwnOw0KKyAgICAgIH0gZWxzZSBpZiAoJ2d0JyA9PSBlbnRpdHlOYW1lKSB7DQorICAgICAgICBjaCA9ICc+JzsNCisgICAgICB9IGVsc2UgaWYgKCdxdW90JyA9PSBlbnRpdHlOYW1lKSB7DQorICAgICAgICBjaCA9ICciJzsNCisgICAgICB9IGVsc2UgaWYgKCdhcG9zJyA9PSBlbnRpdHlOYW1lKSB7DQorICAgICAgICBjaCA9ICdcJyc7DQorICAgICAgfSBlbHNlIGlmICgnYW1wJyA9PSBlbnRpdHlOYW1lKSB7DQorICAgICAgICBjaCA9ICcmJzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbmV4dCA9IGkgKyAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgdGhpcy5uZXh0ID0gbmV4dDsNCisgIHRoaXMuY2ggPSBjaDsNCisgIHJldHVybiB0aGlzLmNoOw0KK30NCisNCisNCisvLyBzb21lIHN0cmluZyB1dGlsaXRpZXMNCitmdW5jdGlvbiBQUl9pc1dvcmRDaGFyKGNoKSB7DQorICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorDQorZnVuY3Rpb24gUFJfaXNJZGVudGlmaWVyU3RhcnQoY2gpIHsNCisgIHJldHVybiBQUl9pc1dvcmRDaGFyKGNoKSB8fCBjaCA9PSAnXycgfHwgY2ggPT0gJyQnIHx8IGNoID09ICdAJzsNCit9DQorDQorZnVuY3Rpb24gUFJfaXNJZGVudGlmaWVyUGFydChjaCkgew0KKyAgcmV0dXJuIFBSX2lzSWRlbnRpZmllclN0YXJ0KGNoKSB8fCBQUl9pc0RpZ2l0Q2hhcihjaCk7DQorfQ0KKw0KK2Z1bmN0aW9uIFBSX2lzU3BhY2VDaGFyKGNoKSB7DQorICByZXR1cm4gIlx0IFxyXG4iLmluZGV4T2YoY2gpID49IDA7DQorfQ0KKw0KK2Z1bmN0aW9uIFBSX2lzRGlnaXRDaGFyKGNoKSB7DQorICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsNCit9DQorDQorZnVuY3Rpb24gUFJfdHJpbShzKSB7DQorICB2YXIgaSA9IDAsIGogPSBzLmxlbmd0aCAtIDE7DQorICB3aGlsZSAoaSA8PSBqICYmIFBSX2lzU3BhY2VDaGFyKHMuY2hhckF0KGkpKSkgeyArK2k7IH0NCisgIHdoaWxlIChqID4gaSAmJiBQUl9pc1NwYWNlQ2hhcihzLmNoYXJBdChqKSkpIHsgLS1qOyB9DQorICByZXR1cm4gcy5zdWJzdHJpbmcoaSwgaiArIDEpOw0KK30NCisNCitmdW5jdGlvbiBQUl9zdGFydHNXaXRoKHMsIHByZWZpeCkgew0KKyAgcmV0dXJuIHMubGVuZ3RoID49IHByZWZpeC5sZW5ndGggJiYgcHJlZml4ID09IHMuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpOw0KK30NCisNCitmdW5jdGlvbiBQUl9lbmRzV2l0aChzLCBzdWZmaXgpIHsNCisgIHJldHVybiBzLmxlbmd0aCA+PSBzdWZmaXgubGVuZ3RoICYmDQorICAgICAgICAgc3VmZml4ID09IHMuc3Vic3RyaW5nKHMubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCwgcy5sZW5ndGgpOw0KK30NCisNCisvKiogdHJ1ZSBpZmYgcHJlZml4IG1hdGNoZXMgdGhlIGZpcnN0IHByZWZpeCBjaGFyYWN0ZXJzIGluIGNoYXJzWzA6bGVuXS4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfcHJlZml4TWF0Y2goY2hhcnMsIGxlbiwgcHJlZml4KSB7DQorICBpZiAobGVuIDwgcHJlZml4Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCisgIGZvciAodmFyIGkgPSAwLCBuID0gcHJlZml4Lmxlbmd0aDsgaSA8IG47ICsraSkgew0KKyAgICBpZiAocHJlZml4LmNoYXJBdChpKSAhPSBjaGFyc1tpXSkgeyByZXR1cm4gZmFsc2U7IH0NCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCisvKiogdXNlZCB0byBjb252ZXJ0IGh0bWwgc3BlY2lhbCBjaGFyYWN0ZXJzIGVtYmVkZGVkIGluIFhNUCB0YWdzIGludG8gaHRtbC4gKi8NCitmdW5jdGlvbiBQUl90ZXh0VG9IdG1sKHN0cikgew0KKyAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7DQorfQ0KKw0KKw0KKy8qKiBzcGxpdCBtYXJrdXAgaW50byBjaHVua3Mgb2YgaHRtbCB0YWdzIChzdHlsZSBudWxsKSBhbmQNCisgICogcGxhaW4gdGV4dCAoc3R5bGUge0BsaW5rICNQUl9QTEFJTn0pLg0KKyAgKg0KKyAgKiBAcGFyYW0gcyBhIFN0cmluZyBvZiBodG1sLg0KKyAgKiBAcmV0dXJuIGFuIEFycmF5IG9mIFBSX1Rva2VucyBvZiBzdHlsZSBQUl9QTEFJTiBhbmQgbnVsbC4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfY2h1bmtpZnkocykgew0KKyAgdmFyIGNodW5rcyA9IG5ldyBBcnJheSgpOw0KKyAgdmFyIHN0YXRlID0gMDsNCisgIHZhciBzdGFydCA9IDA7DQorICB2YXIgcG9zID0gLTE7DQorICBmb3IgKHZhciBpID0gMCwgbiA9IHMubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQorICAgIHZhciBjaCA9IHMuY2hhckF0KGkpOw0KKyAgICBzd2l0Y2ggKHN0YXRlKSB7DQorICAgICAgY2FzZSAwOg0KKyAgICAgICAgaWYgKCc8JyA9PSBjaCkgeyBzdGF0ZSA9IDE7IH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMToNCisgICAgICAgIHBvcyA9IGkgLSAxOw0KKyAgICAgICAgaWYgKCcvJyA9PSBjaCkgeyBzdGF0ZSA9IDI7IH0NCisgICAgICAgIGVsc2UgaWYgKFBSX2lzV29yZENoYXIoY2gpKSB7IHN0YXRlID0gMzsgfQ0KKyAgICAgICAgZWxzZSBpZiAoJzwnID09IGNoKSB7IHN0YXRlID0gMTsgfQ0KKyAgICAgICAgZWxzZSB7IHN0YXRlID0gMDsgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAyOg0KKyAgICAgICAgaWYgKFBSX2lzV29yZENoYXIoY2gpKSB7IHN0YXRlID0gMzsgfQ0KKyAgICAgICAgZWxzZSBpZiAoJzwnID09IGNoKSB7IHN0YXRlID0gMTsgfQ0KKyAgICAgICAgZWxzZSB7IHN0YXRlID0gMDsgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzOg0KKyAgICAgICAgaWYgKCc+JyA9PSBjaCkgew0KKyAgICAgICAgICBpZiAocG9zID4gc3RhcnQpIHsNCisgICAgICAgICAgICBjaHVua3MucHVzaChuZXcgUFJfVG9rZW4ocy5zdWJzdHJpbmcoc3RhcnQsIHBvcyksIFBSX1BMQUlOKSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2h1bmtzLnB1c2gobmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHBvcywgaSArIDEpLCBudWxsKSk7DQorICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQorICAgICAgICAgIHBvcyA9IC0xOw0KKyAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHMubGVuZ3RoID4gc3RhcnQpIHsNCisgICAgY2h1bmtzLnB1c2gobmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHN0YXJ0LCBzLmxlbmd0aCksIFBSX1BMQUlOKSk7DQorICB9DQorICByZXR1cm4gY2h1bmtzOw0KK30NCisNCisvKiogc3BsaXRzIGNodW5rcyBhcm91bmQgZW50aXRpZXMuDQorICAqIEBwcml2YXRlDQorICAqLw0KK2Z1bmN0aW9uIFBSX3NwbGl0RW50aXRpZXMoY2h1bmtzKSB7DQorICB2YXIgY2h1bmtzT3V0ID0gbmV3IEFycmF5KCk7DQorICB2YXIgc3RhdGUgPSAwOw0KKyAgZm9yICh2YXIgY2kgPSAwLCBuYyA9IGNodW5rcy5sZW5ndGg7IGNpIDwgbmM7ICsrY2kpIHsNCisgICAgdmFyIGNodW5rID0gY2h1bmtzW2NpXTsNCisgICAgaWYgKFBSX1BMQUlOICE9IGNodW5rLnN0eWxlKSB7DQorICAgICAgY2h1bmtzT3V0LnB1c2goY2h1bmspOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHZhciBzID0gY2h1bmsudG9rZW47DQorICAgIHZhciBwb3MgPSAwOw0KKyAgICB2YXIgc3RhcnQ7DQorICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkgew0KKyAgICAgIHZhciBjaCA9IHMuY2hhckF0KGkpOw0KKyAgICAgIHN3aXRjaCAoc3RhdGUpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgaWYgKCcmJyA9PSBjaCkgeyBzdGF0ZSA9IDE7IH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgIGlmICgnIycgPT0gY2ggfHwgUFJfaXNXb3JkQ2hhcihjaCkpIHsNCisgICAgICAgICAgICBzdGFydCA9IGkgLSAxOw0KKyAgICAgICAgICAgIHN0YXRlID0gMjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgIGlmICgnOycgPT0gY2gpIHsNCisgICAgICAgICAgICBpZiAoc3RhcnQgPiBwb3MpIHsNCisgICAgICAgICAgICAgIGNodW5rc091dC5wdXNoKA0KKyAgICAgICAgICAgICAgICAgIG5ldyBQUl9Ub2tlbihzLnN1YnN0cmluZyhwb3MsIHN0YXJ0KSwgY2h1bmsuc3R5bGUpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2h1bmtzT3V0LnB1c2gobmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHN0YXJ0LCBpICsgMSksIG51bGwpKTsNCisgICAgICAgICAgICBwb3MgPSBpICsgMTsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChzLmxlbmd0aCA+IHBvcykgew0KKyAgICAgIGNodW5rc091dC5wdXNoKHBvcyA/DQorICAgICAgICAgICAgICAgICAgICAgbmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHBvcywgcy5sZW5ndGgpLCBjaHVuay5zdHlsZSkgOg0KKyAgICAgICAgICAgICAgICAgICAgIGNodW5rKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGNodW5rc091dDsNCit9DQorDQorLyoqIHdhbGsgdGhlIHRva2VuRW5kcyBsaXN0IGFuZCB0aGUgY2h1bmsgbGlzdCBpbiBwYXJhbGxlbCB0byBnZW5lcmF0ZSBhIGxpc3QNCisgICogb2Ygc3BsaXQgdG9rZW5zLg0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9zcGxpdENodW5rcyhjaHVua3MsIHRva2VuRW5kcykgew0KKyAgdmFyIHRva2VucyA9IG5ldyBBcnJheSgpOyAgLy8gdGhlIG91dHB1dA0KKw0KKyAgdmFyIGNpID0gMDsgIC8vIGluZGV4IGludG8gY2h1bmtzDQorICAvLyBwb3NpdGlvbiBvZiBiZWdpbm5pbmcgb2YgYW1vdW50IHdyaXR0ZW4gc28gZmFyIGluIGFic29sdXRlIHNwYWNlLg0KKyAgdmFyIHBvc0FicyA9IDA7DQorICAvLyBwb3NpdGlvbiBvZiBhbW91bnQgd3JpdHRlbiBzbyBmYXIgaW4gY2h1bmsgc3BhY2UNCisgIHZhciBwb3NDaHVuayA9IDA7DQorDQorICAvLyBjdXJyZW50IGNodW5rDQorICB2YXIgY2h1bmsgPSBuZXcgUFJfVG9rZW4oJycsIG51bGwpOw0KKw0KKyAgZm9yICh2YXIgZWkgPSAwLCBuZSA9IHRva2VuRW5kcy5sZW5ndGg7IGVpIDwgbmU7ICsrZWkpIHsNCisgICAgdmFyIHRva2VuRW5kID0gdG9rZW5FbmRzW2VpXTsNCisgICAgdmFyIGVuZCA9IHRva2VuRW5kLmVuZDsNCisNCisgICAgdmFyIHRva0xlbiA9IGVuZCAtIHBvc0FiczsNCisgICAgdmFyIHJlbWFpbmluZ0luQ2h1bmsgPSBjaHVuay50b2tlbi5sZW5ndGggLSBwb3NDaHVuazsNCisgICAgd2hpbGUgKHJlbWFpbmluZ0luQ2h1bmsgPD0gdG9rTGVuKSB7DQorICAgICAgaWYgKHJlbWFpbmluZ0luQ2h1bmsgPiAwKSB7DQorICAgICAgICB0b2tlbnMucHVzaCgNCisgICAgICAgICAgICBuZXcgUFJfVG9rZW4oY2h1bmsudG9rZW4uc3Vic3RyaW5nKHBvc0NodW5rLCBjaHVuay50b2tlbi5sZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IGNodW5rLnN0eWxlID8gbnVsbCA6IHRva2VuRW5kLnN0eWxlKSk7DQorICAgICAgfQ0KKyAgICAgIHBvc0FicyArPSByZW1haW5pbmdJbkNodW5rOw0KKyAgICAgIHBvc0NodW5rID0gMDsNCisgICAgICBpZiAoY2kgPCBjaHVua3MubGVuZ3RoKSB7IGNodW5rID0gY2h1bmtzW2NpKytdOyB9DQorDQorICAgICAgdG9rTGVuID0gZW5kIC0gcG9zQWJzOw0KKyAgICAgIHJlbWFpbmluZ0luQ2h1bmsgPSBjaHVuay50b2tlbi5sZW5ndGggLSBwb3NDaHVuazsNCisgICAgfQ0KKw0KKyAgICBpZiAodG9rTGVuKSB7DQorICAgICAgdG9rZW5zLnB1c2goDQorICAgICAgICAgIG5ldyBQUl9Ub2tlbihjaHVuay50b2tlbi5zdWJzdHJpbmcocG9zQ2h1bmssIHBvc0NodW5rICsgdG9rTGVuKSwNCisgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRW5kLnN0eWxlKSk7DQorICAgICAgcG9zQWJzICs9IHRva0xlbjsNCisgICAgICBwb3NDaHVuayArPSB0b2tMZW47DQorICAgIH0NCisgIH0NCisNCisgIHJldHVybiB0b2tlbnM7DQorfQ0KKw0KKy8qKiBzcGxpdHMgbWFya3VwIHRva2VucyBpbnRvIGRlY2xhcmF0aW9ucywgdGFncywgYW5kIHNvdXJjZSBjaHVua3MuDQorICAqIEBwcml2YXRlDQorICAqLw0KK2Z1bmN0aW9uIFBSX3NwbGl0TWFya3VwKGNodW5rcykgew0KKyAgLy8gQSBzdGF0ZSBtYWNoaW5lIHRvIHNwbGl0IG91dCBkZWNsYXJhdGlvbnMsIHRhZ3MsIGV0Yy4NCisgIC8vIFRoaXMgc3RhdGUgbWFjaGluZSBkZWFscyB3aXRoIGFic29sdXRlIHNwYWNlIGluIHRoZSB0ZXh0LCBpbmRleGVkIGJ5IGssDQorICAvLyBhbmQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgY2h1bmssIGluZGV4ZWQgYnkgcG9zIGFuZCB0b2tlblN0YXJ0IHRvDQorICAvLyBnZW5lcmF0ZSBhIGxpc3Qgb2YgdGhlIGVuZHMgb2YgdG9rZW5zLg0KKyAgLy8gQWJzb2x1dGUgc3BhY2UgaXMgY2FsY3VsYXRlZCBieSBjb25zaWRlcmluZyB0aGUgY2h1bmtzIGFzIGFwcGVuZGVkIGludG8NCisgIC8vIG9uZSBiaWcgc3RyaW5nLCBhcyB0aGV5IHdlcmUgYmVmb3JlIGJlaW5nIHNwbGl0Lg0KKw0KKyAgLy8gS25vd24gZmFpbHVyZSBjYXNlcw0KKyAgLy8gU2VydmVyIHNpZGUgc2NyaXB0aW5nIHNlY3Rpb25zIHN1Y2ggYXMgPD8uLi4/PiBpbiBhdHRyaWJ1dGVzLg0KKyAgLy8gaS5lLiA8c3BhbiBjbGFzcz0iPD8gZm9vID8+Ij4NCisgIC8vIEhhbmRsaW5nIHRoaXMgd291bGQgcmVxdWlyZSBhIHN0YWNrLCBhbmQgd2UgZG9uJ3QgdXNlIFBIUC4NCisNCisgIC8vIFRoZSBvdXRwdXQ6IGEgbGlzdCBvZiBwYWlycyBvZiBQUl9Ub2tlbkVuZCBpbnN0YW5jZXMNCisgIHZhciB0b2tlbkVuZHMgPSBuZXcgQXJyYXkoKTsNCisNCisgIHZhciBzdGF0ZSA9IDA7ICAvLyBGU00gc3RhdGUgdmFyaWFibGUNCisgIHZhciBrID0gMDsgIC8vIHBvc2l0aW9uIGluIGFic29sdXRlIHNwYWNlIG9mIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBjaHVuaw0KKyAgdmFyIHRva2VuU3RhcnQgPSAtMTsgIC8vIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0b2tlbg0KKw0KKyAgLy8gVHJ5IHRvIGZpbmQgYSBjbG9zaW5nIHRhZyBmb3IgYW55IG9wZW4gPHN0eWxlPiBvciA8c2NyaXB0PiB0YWdzDQorICAvLyBXZSBjYW4ndCBkbyB0aGlzIGF0IGEgbGF0ZXIgc3RhZ2UgYmVjYXVzZSB0aGVuIHRoZSBmb2xsb3dpbmcgY2FzZQ0KKyAgLy8gd291bGQgZmFpbDoNCisgIC8vIDxzY3JpcHQ+ZG9jdW1lbnQud3JpdGVsbignPCEtLScpOzwvc2NyaXB0Pg0KKw0KKyAgLy8gV2UgdXNlIHRva2VuQ2hhcnNbOnRva2VuQ2hhcnNJXSB0byBhY2N1bXVsYXRlIHRoZSB0YWcgbmFtZSBzbyB0aGF0IHdlDQorICAvLyBjYW4gY2hlY2sgd2hldGhlciB0byBlbnRlciBpbnRvIGEgbm8gc2NyaXB0aW5nIHNlY3Rpb24gd2hlbiB0aGUgdGFnIGVuZHMuDQorICB2YXIgdG9rZW5DaGFycyA9IG5ldyBBcnJheSgxMik7DQorICB2YXIgdG9rZW5DaGFyc0kgPSAwOw0KKyAgLy8gaWYgbm9uIG51bGwsIHRoZSB0YWcgcHJlZml4IHRoYXQgd2UgbmVlZCB0byBzZWUgdG8gYnJlYWsgb3V0Lg0KKyAgdmFyIGVuZFNjcmlwdFRhZyA9IG51bGw7DQorICB2YXIgZGVjb2RlSGVscGVyID0gbmV3IFBSX0RlY29kZUhlbHBlcigpOw0KKw0KKyAgZm9yICh2YXIgY2kgPSAwLCBuYyA9IGNodW5rcy5sZW5ndGg7IGNpIDwgbmM7ICsrY2kpIHsNCisgICAgdmFyIGNodW5rID0gY2h1bmtzW2NpXTsNCisgICAgaWYgKFBSX1BMQUlOICE9IGNodW5rLnN0eWxlKSB7DQorICAgICAgayArPSBjaHVuay50b2tlbi5sZW5ndGg7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisNCisgICAgdmFyIHMgPSBjaHVuay50b2tlbjsNCisgICAgdmFyIHBvcyA9IDA7ICAvLyB0aGUgcG9zaXRpb24gcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgcHJvY2Vzc2VkIHNvIGZhciBpbiBzDQorDQorICAgIGZvciAodmFyIGkgPSAwLCBuID0gcy5sZW5ndGg7IGkgPCBuOyAvKiBpID0gbmV4dCBhdCBib3R0b20gKi8pIHsNCisgICAgICBkZWNvZGVIZWxwZXIuZGVjb2RlKHMsIGkpOw0KKyAgICAgIHZhciBjaCA9IGRlY29kZUhlbHBlci5jaDsNCisgICAgICB2YXIgbmV4dCA9IGRlY29kZUhlbHBlci5uZXh0Ow0KKw0KKyAgICAgIHZhciB0b2tlblN0eWxlID0gbnVsbDsNCisgICAgICBzd2l0Y2ggKHN0YXRlKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgIGlmICgnPCcgPT0gY2gpIHsgc3RhdGUgPSAxOyB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICB0b2tlbkNoYXJzSSA9IDA7DQorICAgICAgICAgIGlmICgnLycgPT0gY2gpIHsgIC8vIG9ubHkgY29uc2lkZXIgY2xvc2UgdGFncyBpZiB3ZSdyZSBpbiBzY3JpcHQvc3R5bGUNCisgICAgICAgICAgICBzdGF0ZSA9IDc7DQorICAgICAgICAgIH0gZWxzZSBpZiAobnVsbCA9PSBlbmRTY3JpcHRUYWcpIHsNCisgICAgICAgICAgICBpZiAoJyEnID09IGNoKSB7DQorICAgICAgICAgICAgICBzdGF0ZSA9IDI7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChQUl9pc1dvcmRDaGFyKGNoKSkgew0KKyAgICAgICAgICAgICAgc3RhdGUgPSA4Ow0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoJz8nID09IGNoKSB7DQorICAgICAgICAgICAgICBzdGF0ZSA9IDk7DQorICAgICAgICAgICAgfSBlbHNlIGlmICgnJScgPT0gY2gpIHsNCisgICAgICAgICAgICAgIHN0YXRlID0gMTE7DQorICAgICAgICAgICAgfSBlbHNlIGlmICgnPCcgIT0gY2gpIHsNCisgICAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSBpZiAoJzwnICE9IGNoKSB7DQorICAgICAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICBpZiAoJy0nID09IGNoKSB7DQorICAgICAgICAgICAgc3RhdGUgPSA0Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKFBSX2lzV29yZENoYXIoY2gpKSB7DQorICAgICAgICAgICAgc3RhdGUgPSAzOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKCc8JyA9PSBjaCkgew0KKyAgICAgICAgICAgIHN0YXRlID0gMTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgIGlmICgnPicgPT0gY2gpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgdG9rZW5TdHlsZSA9IFBSX0RFQ0xBUkFUSU9OOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICBpZiAoJy0nID09IGNoKSB7IHN0YXRlID0gNTsgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNToNCisgICAgICAgICAgaWYgKCctJyA9PSBjaCkgeyBzdGF0ZSA9IDY7IH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDY6DQorICAgICAgICAgIGlmICgnPicgPT0gY2gpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgdG9rZW5TdHlsZSA9IFBSX0NPTU1FTlQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoJy0nID09IGNoKSB7DQorICAgICAgICAgICAgc3RhdGUgPSA2Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRlID0gNDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNzoNCisgICAgICAgICAgaWYgKFBSX2lzV29yZENoYXIoY2gpKSB7DQorICAgICAgICAgICAgc3RhdGUgPSA4Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKCc8JyA9PSBjaCkgew0KKyAgICAgICAgICAgIHN0YXRlID0gMTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDg6DQorICAgICAgICAgIGlmICgnPicgPT0gY2gpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgdG9rZW5TdHlsZSA9IFBSX1RBRzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgOToNCisgICAgICAgICAgaWYgKCc/JyA9PSBjaCkgeyBzdGF0ZSA9IDEwOyB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxMDoNCisgICAgICAgICAgaWYgKCc+JyA9PSBjaCkgew0KKyAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICB0b2tlblN0eWxlID0gUFJfU09VUkNFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKCc/JyAhPSBjaCkgew0KKyAgICAgICAgICAgIHN0YXRlID0gOTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTE6DQorICAgICAgICAgIGlmICgnJScgPT0gY2gpIHsgc3RhdGUgPSAxMjsgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMTI6DQorICAgICAgICAgIGlmICgnPicgPT0gY2gpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgdG9rZW5TdHlsZSA9IFBSX1NPVVJDRTsNCisgICAgICAgICAgfSBlbHNlIGlmICgnJScgIT0gY2gpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDExOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAodG9rZW5DaGFyc0kgPCB0b2tlbkNoYXJzLmxlbmd0aCkgew0KKyAgICAgICAgdG9rZW5DaGFyc1t0b2tlbkNoYXJzSSsrXSA9IGNoLnRvTG93ZXJDYXNlKCk7DQorICAgICAgfQ0KKyAgICAgIGlmICgxID09IHN0YXRlKSB7IHRva2VuU3RhcnQgPSBrICsgaTsgfQ0KKyAgICAgIGkgPSBuZXh0Ow0KKyAgICAgIGlmICh0b2tlblN0eWxlICE9IG51bGwpIHsNCisgICAgICAgIGlmIChudWxsICE9IHRva2VuU3R5bGUpIHsNCisgICAgICAgICAgaWYgKGVuZFNjcmlwdFRhZykgew0KKyAgICAgICAgICAgIGlmIChQUl9wcmVmaXhNYXRjaCh0b2tlbkNoYXJzLCB0b2tlbkNoYXJzSSwgZW5kU2NyaXB0VGFnKSkgew0KKyAgICAgICAgICAgICAgZW5kU2NyaXB0VGFnID0gbnVsbDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKFBSX3ByZWZpeE1hdGNoKHRva2VuQ2hhcnMsIHRva2VuQ2hhcnNJLCAnc2NyaXB0JykpIHsNCisgICAgICAgICAgICAgIGVuZFNjcmlwdFRhZyA9ICcvc2NyaXB0JzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKFBSX3ByZWZpeE1hdGNoKHRva2VuQ2hhcnMsIHRva2VuQ2hhcnNJLCAnc3R5bGUnKSkgew0KKyAgICAgICAgICAgICAgZW5kU2NyaXB0VGFnID0gJy9zdHlsZSc7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChQUl9wcmVmaXhNYXRjaCh0b2tlbkNoYXJzLCB0b2tlbkNoYXJzSSwgJ3htcCcpKSB7DQorICAgICAgICAgICAgICBlbmRTY3JpcHRUYWcgPSAnL3htcCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIC8vIGRpc2FsbG93IHRoZSB0YWcgaWYgZW5kU2NyaXB0VGFnIGlzIHNldCBhbmQgdGhpcyB3YXMgbm90IGFuIG9wZW4NCisgICAgICAgICAgLy8gdGFnLg0KKyAgICAgICAgICBpZiAoZW5kU2NyaXB0VGFnICYmIHRva2VuQ2hhcnNJICYmICcvJyA9PSB0b2tlbkNoYXJzWzBdKSB7DQorICAgICAgICAgICAgdG9rZW5TdHlsZSA9IG51bGw7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChudWxsICE9IHRva2VuU3R5bGUpIHsNCisgICAgICAgICAgdG9rZW5FbmRzLnB1c2gobmV3IFBSX1Rva2VuRW5kKHRva2VuU3RhcnQsIFBSX1BMQUlOKSk7DQorICAgICAgICAgIHRva2VuRW5kcy5wdXNoKG5ldyBQUl9Ub2tlbkVuZChrICsgbmV4dCwgdG9rZW5TdHlsZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBrICs9IGNodW5rLnRva2VuLmxlbmd0aDsNCisgIH0NCisgIHRva2VuRW5kcy5wdXNoKG5ldyBQUl9Ub2tlbkVuZChrLCBQUl9QTEFJTikpOw0KKw0KKyAgcmV0dXJuIHRva2VuRW5kczsNCit9DQorDQorLyoqIHNwbGl0cyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gY29tbWVudCwgc3RyaW5nLCBhbmQgIm90aGVyIiB0b2tlbnMuDQorICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgUFJfVG9rZW5zIHdpdGggc3R5bGUgaW4NCisgICogICAoUFJfU1RSSU5HLCBQUl9DT01NRU5ULCBQUl9QTEFJTiwgbnVsbCkNCisgICogICBUaGUgcmVzdWx0IGFycmF5IG1heSBjb250YWluIHNwdXJpb3VzIHplcm8gbGVuZ3RoIHRva2Vucy4gIElnbm9yZSB0aGVtLg0KKyAgKg0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9zcGxpdFN0cmluZ0FuZENvbW1lbnRUb2tlbnMoY2h1bmtzKSB7DQorICAvLyBhIHN0YXRlIG1hY2hpbmUgdG8gc3BsaXQgb3V0IGNvbW1lbnRzLCBzdHJpbmdzLCBhbmQgb3RoZXIgc3R1ZmYNCisgIHZhciB0b2tlbkVuZHMgPSBuZXcgQXJyYXkoKTsgIC8vIHBvc2l0aW9ucyBvZiBlbmRzIG9mIHRva2VucyBpbiBhYnNvbHV0ZSBzcGFjZQ0KKyAgdmFyIHN0YXRlID0gMDsgIC8vIEZTTSBzdGF0ZSB2YXJpYWJsZQ0KKyAgdmFyIGRlbGltID0gLTE7ICAvLyBzdHJpbmcgZGVsaW1pdGVyDQorICB2YXIgayA9IDA7ICAvLyBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBiZWdpbm5pbmcgb2YgY3VycmVudCBjaHVuaw0KKyAgZm9yICh2YXIgY2kgPSAwLCBuYyA9IGNodW5rcy5sZW5ndGg7IGNpIDwgbmM7ICsrY2kpIHsNCisgICAgdmFyIGNodW5rID0gY2h1bmtzW2NpXTsNCisgICAgdmFyIHMgPSBjaHVuay50b2tlbjsNCisgICAgaWYgKFBSX1BMQUlOID09IGNodW5rLnN0eWxlKSB7DQorICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBzLmxlbmd0aDsgaSA8IG47ICsraSkgew0KKyAgICAgICAgdmFyIGNoID0gcy5jaGFyQXQoaSk7DQorICAgICAgICBpZiAoMCA9PSBzdGF0ZSkgew0KKyAgICAgICAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICdcJycgfHwgY2ggPT0gJ2AnKSB7DQorICAgICAgICAgICAgdG9rZW5FbmRzLnB1c2gobmV3IFBSX1Rva2VuRW5kKGsgKyBpLCBQUl9QTEFJTikpOw0KKyAgICAgICAgICAgIHN0YXRlID0gMTsNCisgICAgICAgICAgICBkZWxpbSA9IGNoOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcvJykgew0KKyAgICAgICAgICAgIHN0YXRlID0gMzsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsNCisgICAgICAgICAgICB0b2tlbkVuZHMucHVzaChuZXcgUFJfVG9rZW5FbmQoayArIGksIFBSX1BMQUlOKSk7DQorICAgICAgICAgICAgc3RhdGUgPSA0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKDEgPT0gc3RhdGUpIHsNCisgICAgICAgICAgaWYgKGNoID09IGRlbGltKSB7DQorICAgICAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgICAgIHRva2VuRW5kcy5wdXNoKG5ldyBQUl9Ub2tlbkVuZChrICsgaSArIDEsIFBSX1NUUklORykpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzdGF0ZSkgew0KKyAgICAgICAgICBzdGF0ZSA9IDE7DQorICAgICAgICB9IGVsc2UgaWYgKDMgPT0gc3RhdGUpIHsNCisgICAgICAgICAgaWYgKGNoID09ICcvJykgew0KKyAgICAgICAgICAgIHN0YXRlID0gNDsNCisgICAgICAgICAgICB0b2tlbkVuZHMucHVzaChuZXcgUFJfVG9rZW5FbmQoayArIGkgLSAxLCBQUl9QTEFJTikpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KKyAgICAgICAgICAgIHN0YXRlID0gNTsNCisgICAgICAgICAgICB0b2tlbkVuZHMucHVzaChuZXcgUFJfVG9rZW5FbmQoayArIGkgLSAxLCBQUl9QTEFJTikpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICAvLyBuZXh0IGxvb3Agd2lsbCByZWVudGVyIHN0YXRlIDAgd2l0aG91dCBzYW1lIHZhbHVlIG9mIGksIHNvDQorICAgICAgICAgICAgLy8gY2ggd2lsbCBiZSByZWNvbnNpZGVyZWQgYXMgc3RhcnQgb2YgbmV3IHRva2VuLg0KKyAgICAgICAgICAgIC0taTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICg0ID09IHN0YXRlKSB7DQorICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsNCisgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgdG9rZW5FbmRzLnB1c2gobmV3IFBSX1Rva2VuRW5kKGsgKyBpLCBQUl9DT01NRU5UKSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoNSA9PSBzdGF0ZSkgew0KKyAgICAgICAgICBpZiAoY2ggPT0gJyonKSB7DQorICAgICAgICAgICAgc3RhdGUgPSA2Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKDYgPT0gc3RhdGUpIHsNCisgICAgICAgICAgaWYgKGNoID09ICcvJykgew0KKyAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICB0b2tlbkVuZHMucHVzaChuZXcgUFJfVG9rZW5FbmQoayArIGkgKyAxLCBQUl9DT01NRU5UKSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggIT0gJyonKSB7DQorICAgICAgICAgICAgc3RhdGUgPSA1Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGsgKz0gcy5sZW5ndGg7DQorICB9DQorICB0b2tlbkVuZHMucHVzaChuZXcgUFJfVG9rZW5FbmQoaywgUFJfUExBSU4pKTsgIC8vIGEgdG9rZW4gZW5kcyBhdCB0aGUgZW5kDQorDQorICByZXR1cm4gUFJfc3BsaXRDaHVua3MoY2h1bmtzLCB0b2tlbkVuZHMpOw0KK30NCisNCisvKiogdXNlZCBieSBsZXhTb3VyY2UgdG8gc3BsaXQgYSBub24gc3RyaW5nLCBub24gY29tbWVudCB0b2tlbi4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfc3BsaXROb25TdHJpbmdOb25Db21tZW50VG9rZW4ocywgb3V0bGlzdCkgew0KKyAgdmFyIHBvcyA9IDA7DQorICB2YXIgc3RhdGUgPSAwOw0KKyAgZm9yICh2YXIgaSA9IDA7IGkgPD0gcy5sZW5ndGg7IGkrKykgew0KKyAgICB2YXIgY2ggPSBzLmNoYXJBdChpKTsNCisgICAgLy8gdGhlIG5leHQgc3RhdGUuDQorICAgIC8vIGlmIHNldCB0byAtMSB0aGVuIGl0IHdpbGwgY2F1c2UgYSByZWVudHJ5IHRvIHN0YXRlIDAgd2l0aG91dCBjb25zdW1pbmcNCisgICAgLy8gYW5vdGhlciBjaGFyYWN0ZXIuDQorICAgIHZhciBuc3RhdGUgPSBzdGF0ZTsNCisNCisgICAgaWYgKGkgPT0gcy5sZW5ndGgpIHsNCisgICAgICAvLyBuc3RhdGUgd2lsbCBub3QgYmUgZXF1YWwgdG8gc3RhdGUsIHNvIGl0IHdpbGwgYXBwZW5kIHRoZSB0b2tlbg0KKyAgICAgIG5zdGF0ZSA9IC0yOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHN3aXRjaCAoc3RhdGUpIHsNCisgICAgICBjYXNlIDA6ICAvLyB3aGl0ZXNwYWNlIHN0YXRlDQorICAgICAgICBpZiAoUFJfaXNJZGVudGlmaWVyU3RhcnQoY2gpKSB7DQorICAgICAgICAgIG5zdGF0ZSA9IDE7DQorICAgICAgICB9IGVsc2UgaWYgKFBSX2lzRGlnaXRDaGFyKGNoKSkgew0KKyAgICAgICAgICBuc3RhdGUgPSAyOw0KKyAgICAgICAgfSBlbHNlIGlmICghUFJfaXNTcGFjZUNoYXIoY2gpKSB7DQorICAgICAgICAgIG5zdGF0ZSA9IDM7DQorICAgICAgICB9DQorICAgICAgICBpZiAobnN0YXRlICYmIHBvcyA8IGkpIHsNCisgICAgICAgICAgdmFyIHQgPSBzLnN1YnN0cmluZyhwb3MsIGkpOw0KKyAgICAgICAgICBvdXRsaXN0LnB1c2gobmV3IFBSX1Rva2VuKHQsIFBSX1BMQUlOKSk7DQorICAgICAgICAgIHBvcyA9IGk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6ICAvLyBpZGVudGlmaWVyIHN0YXRlDQorICAgICAgICBpZiAoIVBSX2lzSWRlbnRpZmllclBhcnQoY2gpKSB7DQorICAgICAgICAgIG5zdGF0ZSA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAyOiAgLy8gbnVtYmVyIGxpdGVyYWwgc3RhdGUNCisgICAgICAgIC8vIGhhbmRsZSBudW1lcmljIGxpdGVyYWxzIGxpa2UNCisgICAgICAgIC8vIDB4N2YgMzAwVUwgMTAwXzAwMA0KKw0KKyAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCB0cmVhdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXMgYSBzaW5nbGUgbGl0ZXJhbA0KKyAgICAgICAgLy8gICAwLjEgYW5kIDNlLTYNCisgICAgICAgIC8vIGFyZSBlYWNoIHNwbGl0IGludG8gbXVsdGlwbGUgdG9rZW5zDQorICAgICAgICBpZiAoIShQUl9pc0RpZ2l0Q2hhcihjaCkgfHwgUFJfaXNXb3JkQ2hhcihjaCkgfHwgY2ggPT0gJ18nKSkgew0KKyAgICAgICAgICBuc3RhdGUgPSAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMzogIC8vIHB1bmN0dWF0aW9uIHN0YXRlDQorICAgICAgICBpZiAoUFJfaXNJZGVudGlmaWVyU3RhcnQoY2gpIHx8IFBSX2lzRGlnaXRDaGFyKGNoKSB8fA0KKyAgICAgICAgICAgIFBSX2lzU3BhY2VDaGFyKGNoKSkgew0KKyAgICAgICAgICBuc3RhdGUgPSAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAobnN0YXRlICE9IHN0YXRlKSB7DQorICAgICAgaWYgKG5zdGF0ZSA8IDApIHsNCisgICAgICAgIGlmIChpID4gcG9zKSB7DQorICAgICAgICAgIHZhciB0ID0gcy5zdWJzdHJpbmcocG9zLCBpKTsNCisgICAgICAgICAgdmFyIGNoMCA9IHQuY2hhckF0KDApOw0KKyAgICAgICAgICB2YXIgc3R5bGU7DQorICAgICAgICAgIGlmIChQUl9pc0lkZW50aWZpZXJTdGFydChjaDApKSB7DQorICAgICAgICAgICAgaWYgKFBSX2tleXdvcmRzW3RdKSB7DQorICAgICAgICAgICAgICBzdHlsZSA9IFBSX0tFWVdPUkQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoMCA9PSAnQCcpIHsNCisgICAgICAgICAgICAgIHN0eWxlID0gUFJfTElURVJBTDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgLy8gVHJlYXQgYW55IHdvcmQgdGhhdCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZA0KKyAgICAgICAgICAgICAgLy8gY29udGFpbnMgYXQgbGVhc3Qgb25lIGxvd2VyY2FzZSBjaGFyYWN0ZXIgYXMgYSB0eXBlLCBvcg0KKyAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIF90Lg0KKyAgICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBwZXJmZWN0bHkgZm9yIEphdmEsIHByZXR0eSB3ZWxsIGZvciBDKyssIGFuZA0KKyAgICAgICAgICAgICAgLy8gcGFzc2FibHkgZm9yIFB5dGhvbi4gIFRoZSBfdCBjYXRjaGVzIEMgc3RydWN0cy4NCisgICAgICAgICAgICAgIHZhciBpc1R5cGUgPSBmYWxzZTsNCisgICAgICAgICAgICAgIGlmIChjaDAgPj0gJ0EnICYmIGNoMCA8PSAnWicpIHsNCisgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCB0Lmxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgdmFyIGNoMSA9IHQuY2hhckF0KGopOw0KKyAgICAgICAgICAgICAgICAgIGlmIChjaDEgPj0gJ2EnICYmIGNoMSA8PSAneicpIHsNCisgICAgICAgICAgICAgICAgICAgIGlzVHlwZSA9IHRydWU7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYgKCFpc1R5cGUgJiYgdC5sZW5ndGggPj0gMiAmJg0KKyAgICAgICAgICAgICAgICAgICAgdC5zdWJzdHJpbmcodC5sZW5ndGggLSAyKSA9PSAnX3QnKSB7DQorICAgICAgICAgICAgICAgICAgaXNUeXBlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgc3R5bGUgPSBpc1R5cGUgPyBQUl9UWVBFIDogUFJfUExBSU47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKFBSX2lzRGlnaXRDaGFyKGNoMCkpIHsNCisgICAgICAgICAgICBzdHlsZSA9IFBSX0xJVEVSQUw7DQorICAgICAgICAgIH0gZWxzZSBpZiAoIVBSX2lzU3BhY2VDaGFyKGNoMCkpIHsNCisgICAgICAgICAgICBzdHlsZSA9IFBSX1BVTkNUVUFUSU9OOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0eWxlID0gUFJfUExBSU47DQorICAgICAgICAgIH0NCisgICAgICAgICAgcG9zID0gaTsNCisgICAgICAgICAgb3V0bGlzdC5wdXNoKG5ldyBQUl9Ub2tlbih0LCBzdHlsZSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgaWYgKG5zdGF0ZSA9PSAtMSkgew0KKyAgICAgICAgICAvLyBkb24ndCBpbmNyZW1lbnQuICBUaGlzIGFsbG93cyB1cyB0byB1c2Ugc3RhdGUgMCB0byByZWRpc3BhdGNoIGJhc2VkDQorICAgICAgICAgIC8vIG9uIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4NCisgICAgICAgICAgaS0tOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgc3RhdGUgPSBuc3RhdGU7DQorICAgIH0NCisgIH0NCit9DQorDQorLyoqIHNwbGl0IGEgZ3JvdXAgb2YgY2h1bmtzIG9mIG1hcmt1cC4NCisgICogQHByaXZhdGUNCisgICovDQorZnVuY3Rpb24gUFJfdG9rZW5pemVNYXJrdXAoY2h1bmtzKSB7DQorICBpZiAoIShjaHVua3MgJiYgY2h1bmtzLmxlbmd0aCkpIHsgcmV0dXJuIGNodW5rczsgfQ0KKw0KKyAgdmFyIHRva2VuRW5kcyA9IFBSX3NwbGl0TWFya3VwKGNodW5rcyk7DQorICByZXR1cm4gUFJfc3BsaXRDaHVua3MoY2h1bmtzLCB0b2tlbkVuZHMpOw0KK30NCisNCisvKiogc3BsaXQgdGFncyBhdHRyaWJ1dGVzIGFuZCB0aGVpciB2YWx1ZXMgb3V0IGZyb20gdGhlIHRhZyBuYW1lLCBhbmQNCisgICogcmVjdXJzaXZlbHkgbGV4IHNvdXJjZSBjaHVua3MuDQorICAqIEBwcml2YXRlDQorICAqLw0KK2Z1bmN0aW9uIFBSX3NwbGl0VGFnQXR0cmlidXRlcyh0b2tlbnMpIHsNCisgIHZhciB0b2tlbnNPdXQgPSBuZXcgQXJyYXkoKTsNCisgIHZhciBzdGF0ZSA9IDA7DQorICB2YXIgc3RhdGVTdHlsZSA9IFBSX1RBRzsNCisgIHZhciBkZWxpbSA9IG51bGw7ICAvLyBhdHRyaWJ1dGUgZGVsaW1pdGVyIGZvciBxdW90ZWQgdmFsdWUgc3RhdGUuDQorICB2YXIgZGVjb2RlSGVscGVyID0gbmV3IFBSX0RlY29kZUhlbHBlcigpOw0KKyAgZm9yICh2YXIgY2kgPSAwOyBjaSA8IHRva2Vucy5sZW5ndGg7ICsrY2kpIHsNCisgICAgdmFyIHRvayA9IHRva2Vuc1tjaV07DQorICAgIGlmIChQUl9UQUcgPT0gdG9rLnN0eWxlKSB7DQorICAgICAgdmFyIHMgPSB0b2sudG9rZW47DQorICAgICAgdmFyIHN0YXJ0ID0gMDsNCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyAvKiBpID0gbmV4dCBhdCBib3R0b20gKi8pIHsNCisgICAgICAgIGRlY29kZUhlbHBlci5kZWNvZGUocywgaSk7DQorICAgICAgICB2YXIgY2ggPSBkZWNvZGVIZWxwZXIuY2g7DQorICAgICAgICB2YXIgbmV4dCA9IGRlY29kZUhlbHBlci5uZXh0Ow0KKw0KKyAgICAgICAgdmFyIGVtaXRFbmQgPSBudWxsOyAgLy8gbnVsbCBvciBwb3NpdGlvbiBvZiBlbmQgb2YgY2h1bmsgdG8gZW1pdC4NCisgICAgICAgIHZhciBuZXh0U3R5bGUgPSBudWxsOyAgLy8gbnVsbCBvciBuZXh0IHZhbHVlIG9mIHN0YXRlU3R5bGUNCisgICAgICAgIGlmIChjaCA9PSAnPicpIHsNCisgICAgICAgICAgaWYgKFBSX1RBRyAhPSBzdGF0ZVN0eWxlKSB7DQorICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgbmV4dFN0eWxlID0gUFJfVEFHOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7DQorICAgICAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgICAgaWYgKCc8JyA9PSBjaCkgeyBzdGF0ZSA9IDE7IH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgICAgIGlmIChQUl9pc1NwYWNlQ2hhcihjaCkpIHsgc3RhdGUgPSAyOyB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgICBpZiAoIVBSX2lzU3BhY2VDaGFyKGNoKSkgew0KKyAgICAgICAgICAgICAgICBuZXh0U3R5bGUgPSBQUl9BVFRSSUJfTkFNRTsNCisgICAgICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgICAgIHN0YXRlID0gMzsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICAgIGlmICgnPScgPT0gY2gpIHsNCisgICAgICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgICAgIG5leHRTdHlsZSA9IFBSX1RBRzsNCisgICAgICAgICAgICAgICAgc3RhdGUgPSA1Ow0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChQUl9pc1NwYWNlQ2hhcihjaCkpIHsNCisgICAgICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgICAgIG5leHRTdHlsZSA9IFBSX1RBRzsNCisgICAgICAgICAgICAgICAgc3RhdGUgPSA0Ow0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgICAgaWYgKCc9JyA9PSBjaCkgew0KKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDU7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFQUl9pc1NwYWNlQ2hhcihjaCkpIHsNCisgICAgICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgICAgIG5leHRTdHlsZSA9IFBSX0FUVFJJQl9OQU1FOw0KKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDU6DQorICAgICAgICAgICAgICBpZiAoJyInID09IGNoIHx8ICdcJycgPT0gY2gpIHsNCisgICAgICAgICAgICAgICAgZW1pdEVuZCA9IGk7DQorICAgICAgICAgICAgICAgIG5leHRTdHlsZSA9IFBSX0FUVFJJQl9WQUxVRTsNCisgICAgICAgICAgICAgICAgc3RhdGUgPSA2Ow0KKyAgICAgICAgICAgICAgICBkZWxpbSA9IGNoOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmICghUFJfaXNTcGFjZUNoYXIoY2gpKSB7DQorICAgICAgICAgICAgICAgIGVtaXRFbmQgPSBpOw0KKyAgICAgICAgICAgICAgICBuZXh0U3R5bGUgPSBQUl9BVFRSSUJfVkFMVUU7DQorICAgICAgICAgICAgICAgIHN0YXRlID0gNzsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICAgIGlmIChjaCA9PSBkZWxpbSkgew0KKyAgICAgICAgICAgICAgICBlbWl0RW5kID0gbmV4dDsNCisgICAgICAgICAgICAgICAgbmV4dFN0eWxlID0gUFJfVEFHOw0KKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDI7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDc6DQorICAgICAgICAgICAgICBpZiAoUFJfaXNTcGFjZUNoYXIoY2gpKSB7DQorICAgICAgICAgICAgICAgIGVtaXRFbmQgPSBpOw0KKyAgICAgICAgICAgICAgICBuZXh0U3R5bGUgPSBQUl9UQUc7DQorICAgICAgICAgICAgICAgIHN0YXRlID0gMjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZW1pdEVuZCkgew0KKyAgICAgICAgICBpZiAoZW1pdEVuZCA+IHN0YXJ0KSB7DQorICAgICAgICAgICAgdG9rZW5zT3V0LnB1c2goDQorICAgICAgICAgICAgICAgIG5ldyBQUl9Ub2tlbihzLnN1YnN0cmluZyhzdGFydCwgZW1pdEVuZCksIHN0YXRlU3R5bGUpKTsNCisgICAgICAgICAgICBzdGFydCA9IGVtaXRFbmQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3RhdGVTdHlsZSA9IG5leHRTdHlsZTsNCisgICAgICAgIH0NCisgICAgICAgIGkgPSBuZXh0Ow0KKyAgICAgIH0NCisgICAgICBpZiAocy5sZW5ndGggPiBzdGFydCkgew0KKyAgICAgICAgdG9rZW5zT3V0LnB1c2gobmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHN0YXJ0LCBzLmxlbmd0aCksIHN0YXRlU3R5bGUpKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHRvay5zdHlsZSkgew0KKyAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgc3RhdGVTdHlsZSA9IFBSX1RBRzsNCisgICAgICB9DQorICAgICAgdG9rZW5zT3V0LnB1c2godG9rKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHRva2Vuc091dDsNCit9DQorDQorLyoqIGlkZW50aWZ5IHJlZ2lvbnMgb2YgbWFya3VwIHRoYXQgYXJlIHJlYWxseSBzb3VyY2UgY29kZSwgYW5kIHJlY3Vyc2l2bGV5DQorICAqIGxleCB0aGVtLg0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9zcGxpdFNvdXJjZU5vZGVzKHRva2Vucykgew0KKyAgdmFyIHRva2Vuc091dCA9IG5ldyBBcnJheSgpOw0KKyAgLy8gd2hlbiB3ZSBzZWUgYSA8c2NyaXB0PiB0YWcsIHN0b3JlICcvJyBoZXJlIHNvIHRoYXQgd2Uga25vdyB0byBlbmQgdGhlDQorICAvLyBzb3VyY2UgcHJvY2Vzc2luZw0KKyAgdmFyIGVuZFNjcmlwdFRhZyA9IG51bGw7DQorICB2YXIgZGVjb2RlSGVscGVyID0gbmV3IFBSX0RlY29kZUhlbHBlcigpOw0KKw0KKyAgdmFyIHNvdXJjZUNodW5rcyA9IG51bGw7DQorDQorICBmb3IgKHZhciBjaSA9IDAsIG5jID0gdG9rZW5zLmxlbmd0aDsgY2kgPCBuYzsgKytjaSkgew0KKyAgICB2YXIgdG9rID0gdG9rZW5zW2NpXTsNCisgICAgaWYgKG51bGwgPT0gdG9rLnN0eWxlKSB7DQorICAgICAgdG9rZW5zLnB1c2godG9rKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKw0KKyAgICB2YXIgcyA9IHRvay50b2tlbjsNCisNCisgICAgaWYgKG51bGwgPT0gZW5kU2NyaXB0VGFnKSB7DQorICAgICAgaWYgKFBSX1NPVVJDRSA9PSB0b2suc3R5bGUpIHsNCisgICAgICAgIC8vIHNwbGl0IG9mZiBhbnkgc3RhcnRpbmcgYW5kIHRyYWlsaW5nIDw/LCA8JQ0KKyAgICAgICAgaWYgKCc8JyA9PSBkZWNvZGVIZWxwZXIuZGVjb2RlKHMsIDApKSB7DQorICAgICAgICAgIGRlY29kZUhlbHBlci5kZWNvZGUocywgZGVjb2RlSGVscGVyLm5leHQpOw0KKyAgICAgICAgICBpZiAoJyUnID09IGRlY29kZUhlbHBlci5jaCB8fCAnPycgPT0gZGVjb2RlSGVscGVyLmNoKSB7DQorICAgICAgICAgICAgZW5kU2NyaXB0VGFnID0gZGVjb2RlSGVscGVyLmNoOw0KKyAgICAgICAgICAgIHRva2Vuc091dC5wdXNoKG5ldyBQUl9Ub2tlbihzLnN1YnN0cmluZygwLCBkZWNvZGVIZWxwZXIubmV4dCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSX1RBRykpOw0KKyAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZyhkZWNvZGVIZWxwZXIubmV4dCwgcy5sZW5ndGgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChQUl9UQUcgPT0gdG9rLnN0eWxlKSB7DQorICAgICAgICBpZiAoJzwnID09IGRlY29kZUhlbHBlci5kZWNvZGUocywgMCkgJiYNCisgICAgICAgICAgICAnLycgIT0gcy5jaGFyQXQoZGVjb2RlSGVscGVyLm5leHQpKSB7DQorICAgICAgICAgIHZhciB0YWdDb250ZW50ID0gcy5zdWJzdHJpbmcoZGVjb2RlSGVscGVyLm5leHQpLnRvTG93ZXJDYXNlKCk7DQorICAgICAgICAgIC8vIEZJWE1FKG1zYW11ZWwpOiB0aGlzIGRvZXMgbm90IG1pcnJvciBleGFjdGx5IHRoZSBjb2RlIGluDQorICAgICAgICAgIC8vIGluIFBSX3NwbGl0TWFya3VwIHRoYXQgZGVmZXJzIHNwbGl0dGluZyB0YWdzIGluc2lkZSBzY3JpcHQgYW5kDQorICAgICAgICAgIC8vIHN0eWxlIGJsb2Nrcy4NCisgICAgICAgICAgaWYgKFBSX3N0YXJ0c1dpdGgodGFnQ29udGVudCwgJ3NjcmlwdCcpIHx8DQorICAgICAgICAgICAgICBQUl9zdGFydHNXaXRoKHRhZ0NvbnRlbnQsICdzdHlsZScpIHx8DQorICAgICAgICAgICAgICBQUl9zdGFydHNXaXRoKHRhZ0NvbnRlbnQsICd4bXAnKSkgew0KKyAgICAgICAgICAgIGVuZFNjcmlwdFRhZyA9ICcvJzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAobnVsbCAhPSBlbmRTY3JpcHRUYWcpIHsNCisgICAgICB2YXIgZW5kVG9rID0gbnVsbDsNCisgICAgICBpZiAoUFJfU09VUkNFID09IHRvay5zdHlsZSkgew0KKyAgICAgICAgaWYgKGVuZFNjcmlwdFRhZyA9PSAnJScgfHwgZW5kU2NyaXB0VGFnID09ICc/Jykgew0KKyAgICAgICAgICB2YXIgcG9zID0gcy5sYXN0SW5kZXhPZihlbmRTY3JpcHRUYWcpOw0KKyAgICAgICAgICBpZiAocG9zID49IDAgJiYgJz4nID09IGRlY29kZUhlbHBlci5kZWNvZGUocywgcG9zICsgMSkgJiYNCisgICAgICAgICAgICAgIHMubGVuZ3RoID09IGRlY29kZUhlbHBlci5uZXh0KSB7DQorICAgICAgICAgICAgZW5kVG9rID0gbmV3IFBSX1Rva2VuKHMuc3Vic3RyaW5nKHBvcywgcy5sZW5ndGgpLCBQUl9UQUcpOw0KKyAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBwb3MpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobnVsbCA9PSBzb3VyY2VDaHVua3MpIHsgc291cmNlQ2h1bmtzID0gbmV3IEFycmF5KCk7IH0NCisgICAgICAgIHNvdXJjZUNodW5rcy5wdXNoKG5ldyBQUl9Ub2tlbihzLCBQUl9QTEFJTikpOw0KKyAgICAgIH0gZWxzZSBpZiAoUFJfUExBSU4gPT0gdG9rLnN0eWxlKSB7DQorICAgICAgICBpZiAobnVsbCA9PSBzb3VyY2VDaHVua3MpIHsgc291cmNlQ2h1bmtzID0gbmV3IEFycmF5KCk7IH0NCisgICAgICAgIHNvdXJjZUNodW5rcy5wdXNoKHRvayk7DQorICAgICAgfSBlbHNlIGlmIChQUl9UQUcgPT0gdG9rLnN0eWxlKSB7DQorICAgICAgICAvLyBpZiBpdCBzdGFydHMgd2l0aCA8LyB0aGVuIGl0IG11c3QgYmUgdGhlIGVuZCB0YWcuDQorICAgICAgICBpZiAoJzwnID09IGRlY29kZUhlbHBlci5kZWNvZGUodG9rLnRva2VuLCAwKSAmJg0KKyAgICAgICAgICAgIHRvay50b2tlbi5sZW5ndGggPiBkZWNvZGVIZWxwZXIubmV4dCAmJg0KKyAgICAgICAgICAgICcvJyA9PSBkZWNvZGVIZWxwZXIuZGVjb2RlKHRvay50b2tlbiwgZGVjb2RlSGVscGVyLm5leHQpKSB7DQorICAgICAgICAgIGVuZFRvayA9IHRvazsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHRva2Vuc091dC5wdXNoKHRvayk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChzb3VyY2VDaHVua3MpIHsNCisgICAgICAgICAgc291cmNlQ2h1bmtzLnB1c2godG9rKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIC8vIHB1c2ggcmVtYWluaW5nIHRhZyBhbmQgYXR0cmlidXRlIHRva2VucyBmcm9tIHRoZSBvcGVuaW5nIHRhZw0KKyAgICAgICAgICB0b2tlbnNPdXQucHVzaCh0b2spOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoZW5kVG9rKSB7DQorICAgICAgICBpZiAoc291cmNlQ2h1bmtzKSB7DQorICAgICAgICAgIHZhciBzb3VyY2VUb2tlbnMgPSBQUl9sZXhTb3VyY2Uoc291cmNlQ2h1bmtzKTsNCisgICAgICAgICAgdG9rZW5zT3V0LnB1c2gobmV3IFBSX1Rva2VuKCc8c3BhbiBjbGFzcz1lbWJzcmM+JywgbnVsbCkpOw0KKyAgICAgICAgICBmb3IgKHZhciBzaSA9IDAsIG5zID0gc291cmNlVG9rZW5zLmxlbmd0aDsgc2kgPCBuczsgKytzaSkgew0KKyAgICAgICAgICAgIHRva2Vuc091dC5wdXNoKHNvdXJjZVRva2Vuc1tzaV0pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHRva2Vuc091dC5wdXNoKG5ldyBQUl9Ub2tlbignPC9zcGFuPicsIG51bGwpKTsNCisgICAgICAgICAgc291cmNlQ2h1bmtzID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIHRva2Vuc091dC5wdXNoKGVuZFRvayk7DQorICAgICAgICBlbmRTY3JpcHRUYWcgPSBudWxsOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB0b2tlbnNPdXQucHVzaCh0b2spOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gdG9rZW5zT3V0Ow0KK30NCisNCisvKiogc3BsaXRzIHRoZSBxdW90ZXMgZnJvbSBhbiBhdHRyaWJ1dGUgdmFsdWUuDQorICAqIFsnImZvbyInXSAtPiBbJyInLCAnZm9vJywgJyInXQ0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9zcGxpdEF0dHJpYnV0ZVF1b3Rlcyh0b2tlbnMpIHsNCisgIHZhciBmaXJzdFBsYWluID0gbnVsbCwgbGFzdFBsYWluID0gbnVsbDsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgKytpKSB7DQorICAgIGlmIChQUl9QTEFJTiA9IHRva2Vuc1tpXS5zdHlsZSkgew0KKyAgICAgIGZpcnN0UGxhaW4gPSBpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBmb3IgKHZhciBpID0gdG9rZW5zLmxlbmd0aDsgLS1pID49IDA7KSB7DQorICAgIGlmIChQUl9QTEFJTiA9IHRva2Vuc1tpXS5zdHlsZSkgew0KKyAgICAgIGxhc3RQbGFpbiA9IGk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChudWxsID09IGZpcnN0UGxhaW4pIHsgcmV0dXJuIHRva2VuczsgfQ0KKw0KKyAgdmFyIGRlY29kZUhlbHBlciA9IG5ldyBQUl9EZWNvZGVIZWxwZXIoKTsNCisgIHZhciBmcyA9IHRva2Vuc1tmaXJzdFBsYWluXS50b2tlbjsNCisgIHZhciBmYyA9IGRlY29kZUhlbHBlci5kZWNvZGUoZnMsIDApOw0KKyAgaWYgKCciJyAhPSBmYyAmJiAnXCcnICE9IGZjKSB7DQorICAgIHJldHVybiB0b2tlbnM7DQorICB9DQorICB2YXIgZnBvcyA9IGRlY29kZUhlbHBlci5uZXh0Ow0KKw0KKyAgdmFyIGxzID0gdG9rZW5zW2xhc3RQbGFpbl0udG9rZW47DQorICB2YXIgbHBvcyA9IGxzLmxhc3RJbmRleE9mKCcmJyk7DQorICBpZiAobHBvcyA8IDApIHsgbHBvcyA9IGxzLmxlbmd0aCAtIDE7IH0NCisgIHZhciBsYyA9IGRlY29kZUhlbHBlci5kZWNvZGUobHMsIGxwb3MpOw0KKyAgaWYgKGxjICE9IGZjIHx8IGRlY29kZUhlbHBlci5uZXh0ICE9IGxzLmxlbmd0aCkgew0KKyAgICBsYyA9IG51bGw7DQorICAgIGxwb3MgPSBscy5sZW5ndGg7DQorICB9DQorDQorICB2YXIgdG9rZW5zT3V0ID0gbmV3IEFycmF5KCk7DQorICBmb3IgKHZhciBpID0gMDsgaSA8IGZpcnN0UGxhaW47ICsraSkgew0KKyAgICB0b2tlbnNPdXQucHVzaCh0b2tlbnNbaV0pOw0KKyAgfQ0KKyAgdG9rZW5zT3V0LnB1c2gobmV3IFBSX1Rva2VuKGZzLnN1YnN0cmluZygwLCBmcG9zKSwgUFJfQVRUUklCX1ZBTFVFKSk7DQorICBpZiAobGFzdFBsYWluID09IGZpcnN0UGxhaW4pIHsNCisgICAgdG9rZW5zT3V0LnB1c2gobmV3IFBSX1Rva2VuKGZzLnN1YnN0cmluZyhmcG9zLCBscG9zKSwgUFJfUExBSU4pKTsNCisgIH0gZWxzZSB7DQorICAgIHRva2Vuc091dC5wdXNoKG5ldyBQUl9Ub2tlbihmcy5zdWJzdHJpbmcoZnBvcywgZnMubGVuZ3RoKSwgUFJfUExBSU4pKTsNCisgICAgZm9yICh2YXIgaSA9IGZpcnN0UGxhaW4gKyAxOyBpIDwgbGFzdFBsYWluOyArK2kpIHsNCisgICAgICB0b2tlbnNPdXQucHVzaCh0b2tlbnNbaV0pOw0KKyAgICB9DQorICAgIGlmIChsYykgew0KKyAgICAgIHRva2Vucy5wdXNoKG5ldyBQUl9Ub2tlbihscy5zdWJzdHJpbmcoMCwgbHBvcyksIFBSX1BMQUlOKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgdG9rZW5zLnB1c2godG9rZW5zW2xhc3RQbGFpbl0pOw0KKyAgICB9DQorICB9DQorICBpZiAobGMpIHsNCisgICAgdG9rZW5zT3V0LnB1c2gobmV3IFBSX1Rva2VuKGxzLnN1YnN0cmluZyhscG9zLCBscy5sZW5ndGgpLCBQUl9QTEFJTikpOw0KKyAgfQ0KKyAgZm9yICh2YXIgaSA9IGxhc3RQbGFpbiArIDE7IGkgPCB0b2tlbnMubGVuZ3RoOyArK2kpIHsNCisgICAgdG9rZW5zT3V0LnB1c2godG9rZW5zW2ldKTsNCisgIH0NCisgIHJldHVybiB0b2tlbnNPdXQ7DQorfQ0KKw0KKy8qKiBpZGVudGlmeSBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQgcmVhbGx5IGNvbnRhaW4gc291cmNlIGNvZGUgYW5kIHJlY3Vyc2l2ZWx5DQorICAqIGxleCB0aGVtLg0KKyAgKiBAcHJpdmF0ZQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9zcGxpdFNvdXJjZUF0dHJpYnV0ZXModG9rZW5zKSB7DQorICB2YXIgdG9rZW5zT3V0ID0gbmV3IEFycmF5KCk7DQorDQorICB2YXIgc291cmNlQ2h1bmtzID0gbnVsbDsNCisgIHZhciBpblNvdXJjZSA9IGZhbHNlOw0KKyAgdmFyIG5hbWUgPSAnJzsNCisNCisgIGZvciAodmFyIGNpID0gMCwgbmMgPSB0b2tlbnMubGVuZ3RoOyBjaSA8IG5jOyArK2NpKSB7DQorICAgIHZhciB0b2sgPSB0b2tlbnNbY2ldOw0KKyAgICB2YXIgb3V0TGlzdCA9IHRva2Vuc091dDsNCisgICAgaWYgKFBSX1RBRyA9PSB0b2suc3R5bGUpIHsNCisgICAgICBpZiAoaW5Tb3VyY2UpIHsNCisgICAgICAgIGluU291cmNlID0gZmFsc2U7DQorICAgICAgICBuYW1lID0gJyc7DQorICAgICAgICBpZiAoc291cmNlQ2h1bmtzKSB7DQorICAgICAgICAgIHRva2Vuc091dC5wdXNoKG5ldyBQUl9Ub2tlbignPHNwYW4gY2xhc3M9ZW1ic3JjPicsIG51bGwpKTsNCisgICAgICAgICAgdmFyIHNvdXJjZVRva2VucyA9DQorICAgICAgICAgICAgUFJfbGV4U291cmNlKFBSX3NwbGl0QXR0cmlidXRlUXVvdGVzKHNvdXJjZUNodW5rcykpOw0KKyAgICAgICAgICBmb3IgKHZhciBzaSA9IDAsIG5zID0gc291cmNlVG9rZW5zLmxlbmd0aDsgc2kgPCBuczsgKytzaSkgew0KKyAgICAgICAgICAgIHRva2Vuc091dC5wdXNoKHNvdXJjZVRva2Vuc1tzaV0pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHRva2Vuc091dC5wdXNoKG5ldyBQUl9Ub2tlbignPC9zcGFuPicsIG51bGwpKTsNCisgICAgICAgICAgc291cmNlQ2h1bmtzID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKG5hbWUgJiYgdG9rLnRva2VuLmluZGV4T2YoJz0nKSA+PSAwKSB7DQorICAgICAgICB2YXIgbmFtZUxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOw0KKyAgICAgICAgaWYgKFBSX3N0YXJ0c1dpdGgobmFtZUxvd2VyLCAnb24nKSB8fCAnc3R5bGUnID09IG5hbWVMb3dlcikgew0KKyAgICAgICAgICBpblNvdXJjZSA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG5hbWUgPSAnJzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoUFJfQVRUUklCX05BTUUgPT0gdG9rLnN0eWxlKSB7DQorICAgICAgbmFtZSArPSB0b2sudG9rZW47DQorICAgIH0gZWxzZSBpZiAoUFJfQVRUUklCX1ZBTFVFID09IHRvay5zdHlsZSkgew0KKyAgICAgIGlmIChpblNvdXJjZSkgew0KKyAgICAgICAgaWYgKG51bGwgPT0gc291cmNlQ2h1bmtzKSB7IHNvdXJjZUNodW5rcyA9IG5ldyBBcnJheSgpOyB9DQorICAgICAgICBvdXRMaXN0ID0gc291cmNlQ2h1bmtzOw0KKyAgICAgICAgdG9rID0gbmV3IFBSX1Rva2VuKHRvay50b2tlbiwgUFJfUExBSU4pOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoc291cmNlQ2h1bmtzKSB7DQorICAgICAgICBvdXRMaXN0ID0gc291cmNlQ2h1bmtzOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBvdXRMaXN0LnB1c2godG9rKTsNCisgIH0NCisgIHJldHVybiB0b2tlbnNPdXQ7DQorfQ0KKw0KKy8qKiByZXR1cm5zIGEgbGlzdCBvZiBQUl9Ub2tlbiBvYmplY3RzIGdpdmVuIGNodW5rcyBvZiBzb3VyY2UgY29kZS4NCisgICoNCisgICogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCA8IHRva2VucyBhcmUgaHRtbCBlc2NhcGVkLCBidXQgIiBhcmUgbm90Lg0KKyAgKiBJdCB3aWxsIGRvIGEgcmVzb25hYmxlIGpvYiB3aXRoIDwsIGJ1dCB3aWxsIG5vdCByZWNvZ25pemUgYW4gJnF1b3Q7DQorICAqIGFzIHN0YXJ0aW5nIGEgc3RyaW5nLg0KKyAgKg0KKyAgKiBUaGlzIGNvZGUgdHJlYXRzICIsICcsIGFuZCBgIGFzIHN0cmluZyBkZWxpbWl0ZXJzLCBhbmQgXCBhcyBhIHN0cmluZyBlc2NhcGUuDQorICAqIEl0IGRvZXMgbm90IHJlY29nbml6ZSBkb3VibGUgZGVsaW1pdGVyIGVzY2FwZXMsIG9yIHBlcmwncyBxcSgpIHN0eWxlDQorICAqIHN0cmluZ3MuDQorICAqDQorICAqIEl0IHJlY29nbml6ZXMgQywgQysrLCBhbmQgc2hlbGwgc3R5bGUgY29tbWVudHMuDQorICAqDQorICAqIEBwYXJhbSBjaHVua3MgUFJfVG9rZW5zIHdpdGggc3R5bGUgaW4gKG51bGwsIFBSX1BMQUlOKQ0KKyAgKi8NCitmdW5jdGlvbiBQUl9sZXhTb3VyY2UoY2h1bmtzKSB7DQorICAvLyBwb3NpdGlvbnMgb2YgZW5kcyBvZiB0b2tlbnMgaW4gb3JkZXINCisgIHZhciB0b2tlbnNJbiA9IFBSX3NwbGl0U3RyaW5nQW5kQ29tbWVudFRva2VucyhjaHVua3MpOw0KKw0KKyAgLy8gc3BsaXQgZW50aXRpZXMgb3V0IG9mIHNvIHRoYXQgd2Uga25vdyB0byB0cmVhdCB0aGVtIGFzIHNpbmdsZSB1bml0cy4NCisgIHRva2Vuc0luID0gUFJfc3BsaXRFbnRpdGllcyh0b2tlbnNJbik7DQorDQorICAvLyBzcGxpdCBub24gY29tbWVudHxzdHJpbmcgdG9rZW5zIG9uIHdoaXRlc3BhY2UgYW5kIHdvcmQgYm91bmRhcmllcw0KKyAgdmFyIHRva2Vuc091dCA9IG5ldyBBcnJheSgpOw0KKyAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnNJbi5sZW5ndGg7ICsraSkgew0KKyAgICB2YXIgdG9rID0gdG9rZW5zSW5baV07DQorICAgIHZhciB0ID0gdG9rLnRva2VuOw0KKyAgICB2YXIgcyA9IHRvay5zdHlsZTsNCisNCisgICAgaWYgKFBSX1BMQUlOID09IHMpIHsNCisgICAgICBQUl9zcGxpdE5vblN0cmluZ05vbkNvbW1lbnRUb2tlbih0LCB0b2tlbnNPdXQpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHRva2Vuc091dC5wdXNoKHRvayk7DQorICB9DQorDQorICByZXR1cm4gdG9rZW5zT3V0Ow0KK30NCisNCisvKiogcmV0dXJucyBhIGxpc3Qgb2YgUFJfVG9rZW4gb2JqZWN0cyBnaXZlbiBhIHN0cmluZyBvZiBtYXJrdXAuDQorICAqDQorICAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgPCB0b2tlbnMgYXJlIGh0bWwgZXNjYXBlZCwgYnV0ICIgYXJlIG5vdC4NCisgICogSXQgd2lsbCBkbyBhIHJlc29uYWJsZSBqb2Igd2l0aCA8LCBidXQgd2lsbCBub3QgcmVjb2duaXplIGFuICZxdW90Ow0KKyAgKiBhcyBzdGFydGluZyBhIHN0cmluZy4NCisgICoNCisgICogVGhpcyBjb2RlIHJlY29nbml6ZXMgYSBudW1iZXIgb2YgY29uc3RydWN0cy4NCisgICogPCEtLSAuLi4gLS0+IGNvbW1lbnQNCisgICogPCFcdyAuLi4gPiAgIGRlY2xhcmF0aW9uDQorICAqIDxcdyAuLi4gPiAgICB0YWcNCisgICogPC9cdyAuLi4gPiAgIHRhZw0KKyAgKiA8Py4uLj8+ICAgICAgZW1iZWRkZWQgc291cmNlDQorICAqICZbI1x3XS4uLjsgICBlbnRpdHkNCisgICoNCisgICogSXQgZG9lcyBub3QgcmVjb2duaXplcyAlZm9vOyBlbnRpdGllcy4NCisgICoNCisgICogSXQgd2lsbCByZWN1cnNlIGludG8gYW55IDxzdHlsZT4sIDxzY3JpcHQ+LCBhbmQgb24qIGF0dHJpYnV0ZXMgdXNpbmcNCisgICogUFJfbGV4U291cmNlLg0KKyAgKi8NCitmdW5jdGlvbiBQUl9sZXhNYXJrdXAoY2h1bmtzKSB7DQorICAvLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGZvbGxvd3M6DQorICAvLyAxKSBTdGFydCBieSBzcGxpdHRpbmcgdGhlIG1hcmt1cCBpbnRvIHRleHQgYW5kIHRhZyBjaHVua3MNCisgIC8vICAgIElucHV0OiAgU3RyaW5nIHMNCisgIC8vICAgIE91dHB1dDogTGlzdDxQUl9Ub2tlbj4gd2hlcmUgc3R5bGUgaW4gKFBSX1BMQUlOLCBudWxsKQ0KKyAgLy8gMikgVGhlbiBzcGxpdCB0aGUgdGV4dCBjaHVua3MgZnVydGhlciBpbnRvIGNvbW1lbnRzLCBkZWNsYXJhdGlvbnMsDQorICAvLyAgICB0YWdzLCBldGMuDQorICAvLyAgICBBZnRlciBlYWNoIHNwbGl0LCBjb25zaWRlciB3aGV0aGVyIHRoZSB0b2tlbiBpcyB0aGUgc3RhcnQgb2YgYW4NCisgIC8vICAgIGVtYmVkZGVkIHNvdXJjZSBzZWN0aW9uLCBpLmUuIGlzIGFuIG9wZW4gPHNjcmlwdD4gdGFnLiAgSWYgaXQgaXMsDQorICAvLyAgICBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NlIHRva2VuLCBhbmQgZG9uJ3QgYm90aGVyIHRvIGxleCBpbiBiZXR3ZWVuLg0KKyAgLy8gICAgSW5wdXQ6ICBMaXN0PFN0cmluZz4NCisgIC8vICAgIE91dHB1dDogTGlzdDxQUl9Ub2tlbj4gd2l0aCBzdHlsZSBpbiAoUFJfVEFHLCBQUl9QTEFJTiwgUFJfU09VUkNFLCBudWxsKQ0KKyAgLy8gMykgRmluYWxseSBnbyBvdmVyIGVhY2ggdGFnIHRva2VuIGFuZCBzcGxpdCBvdXQgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuDQorICAvLyAgICBJbnB1dDogIExpc3Q8UFJfVG9rZW4+DQorICAvLyAgICBPdXRwdXQ6IExpc3Q8UFJfVG9rZW4+IHdoZXJlIHN0eWxlIGluDQorICAvLyAgICAgICAgICAgIChQUl9UQUcsIFBSX1BMQUlOLCBQUl9TT1VSQ0UsIE5BTUUsIFZBTFVFLCBudWxsKQ0KKyAgdmFyIHRva2Vuc091dCA9IFBSX3Rva2VuaXplTWFya3VwKGNodW5rcyk7DQorICB0b2tlbnNPdXQgPSBQUl9zcGxpdFRhZ0F0dHJpYnV0ZXModG9rZW5zT3V0KTsNCisgIHRva2Vuc091dCA9IFBSX3NwbGl0U291cmNlTm9kZXModG9rZW5zT3V0KTsNCisgIHRva2Vuc091dCA9IFBSX3NwbGl0U291cmNlQXR0cmlidXRlcyh0b2tlbnNPdXQpOw0KKyAgcmV0dXJuIHRva2Vuc091dDsNCit9DQorDQorLyoqIGNsYXNzaWZ5IHRoZSBzdHJpbmcgYXMgZWl0aGVyIHNvdXJjZSBvciBtYXJrdXAgYW5kIGxleCBhcHByb3ByaWF0ZWx5LiAqLw0KK2Z1bmN0aW9uIFBSX2xleE9uZShzKSB7DQorICB2YXIgY2h1bmtzID0gUFJfY2h1bmtpZnkocyk7DQorICAvLyB0cmVhdCBpdCBhcyBtYXJrdXAgaWYgdGhlIGZpcnN0IG5vbiB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhIDwgYW5kIHRoZQ0KKyAgLy8gbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYSA+DQorICB2YXIgaXNNYXJrdXAgPSBmYWxzZTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKSB7DQorICAgIGlmIChQUl9QTEFJTiA9PSBjaHVua3NbaV0uc3R5bGUpIHsNCisgICAgICBpZiAoUFJfc3RhcnRzV2l0aChQUl90cmltKGNodW5rc1tpXS50b2tlbiksICcmbHQ7JykpIHsNCisgICAgICAgIGZvciAodmFyIGogPSBjaHVua3MubGVuZ3RoOyAtLWogPj0gMDspIHsNCisgICAgICAgICAgaWYgKFBSX1BMQUlOID09IGNodW5rc1tqXS5zdHlsZSkgew0KKyAgICAgICAgICAgIGlzTWFya3VwID0gUFJfZW5kc1dpdGgoUFJfdHJpbShjaHVua3Nbal0udG9rZW4pLCAnJmd0OycpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaXNNYXJrdXAgPyBQUl9sZXhNYXJrdXAoY2h1bmtzKSA6IFBSX2xleFNvdXJjZShjaHVua3MpOw0KK30NCisNCisvKiogcHJldHR5IHByaW50IGEgY2h1bmsgb2YgY29kZS4NCisgICoNCisgICogQHBhcmFtIHMgY29kZSBhcyBodG1sDQorICAqIEByZXR1cm4gY29kZSBhcyBodG1sLCBidXQgcHJldHRpZXINCisgICovDQorZnVuY3Rpb24gcHJldHR5UHJpbnRPbmUocykgew0KKyAgdHJ5IHsNCisgICAgdmFyIHRva2VucyA9IFBSX2xleE9uZShzKTsNCisgICAgdmFyIG91dCA9ICcnOw0KKyAgICB2YXIgbGFzdFN0eWxlID0gbnVsbDsNCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsNCisgICAgICB2YXIgdCA9IHRva2Vuc1tpXTsNCisgICAgICBpZiAodC5zdHlsZSAhPSBsYXN0U3R5bGUpIHsNCisgICAgICAgIGlmIChsYXN0U3R5bGUgIT0gbnVsbCkgew0KKyAgICAgICAgICBvdXQgKz0gJzwvc3Bhbj4nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHQuc3R5bGUgIT0gbnVsbCkgew0KKyAgICAgICAgICBvdXQgKz0gJzxzcGFuIGNsYXNzPScgKyB0LnN0eWxlICsgJz4nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbGFzdFN0eWxlID0gdC5zdHlsZTsNCisgICAgICB9DQorICAgICAgdmFyIGh0bWwgPSB0LnRva2VuOw0KKyAgICAgIGlmIChudWxsICE9IHQuc3R5bGUpIHsNCisgICAgICAgIC8vIFRoaXMgaW50ZXJhY3RzIGJhZGx5IHdpdGggdGhlIHdpa2kgd2hpY2ggaW50cm9kdWNlcyBwYXJhZ3JhcGggdGFncw0KKyAgICAgICAgLy8gaW50IHByZSBibG9ja3MgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uDQorICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSBmb3IgSUUgdGhvdWdoIHdoaWNoIHNlZW1zIHRvIGxvc2UgdGhlIHByZWZvcm1hdHRlZG5lc3MNCisgICAgICAgIC8vIG9mIDxwcmU+IHRhZ3Mgd2hlbiB0aGVpciBpbm5lckhUTUwgaXMgYXNzaWduZWQuDQorICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oPzpcclxuPyl8XG4vZywgJzxicj4nKS5yZXBsYWNlKC8gIC9nLCAnJm5ic3A7ICcpOw0KKyAgICAgIH0NCisgICAgICBvdXQgKz0gaHRtbDsNCisgICAgfQ0KKyAgICBpZiAobGFzdFN0eWxlICE9IG51bGwpIHsNCisgICAgICBvdXQgKz0gJzwvc3Bhbj4nOw0KKyAgICB9DQorICAgIHJldHVybiBvdXQ7DQorICB9IGNhdGNoIChlKSB7DQorICAgIC8vYWxlcnQoZS5zdGFjayk7ICAvLyBESVNBQkxFIGluIHByb2R1Y3Rpb24NCisgICAgcmV0dXJuIHM7DQorICB9DQorfQ0KKw0KKy8qKiBmaW5kIGFsbCB0aGUgPCBwcmUgPiBhbmQgPCBjb2RlID4gdGFncyBpbiB0aGUgRE9NIHdpdGggY2xhc3M9cHJldHR5cHJpbnQgYW5kDQorICAqIHByZXR0aWZ5IHRoZW0uDQorICAqLw0KK2Z1bmN0aW9uIHByZXR0eVByaW50KCkgew0KKyAgLy8gZmV0Y2ggYSBsaXN0IG9mIG5vZGVzIHRvIHJld3JpdGUNCisgIHZhciBjb2RlU2VnbWVudHMgPSBbDQorICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ByZScpLA0KKyAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjb2RlJyksDQorICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3htcCcpIF07DQorICB2YXIgZWxlbWVudHMgPSBbXTsNCisgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVNlZ21lbnRzLmxlbmd0aDsgKytpKSB7DQorICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29kZVNlZ21lbnRzW2ldLmxlbmd0aDsgKytqKSB7DQorICAgICAgZWxlbWVudHMucHVzaChjb2RlU2VnbWVudHNbaV1bal0pOw0KKyAgICB9DQorICB9DQorICBjb2RlU2VnbWVudHMgPSBudWxsOw0KKw0KKyAgLy8gdGhlIGxvb3AgaXMgYnJva2VuIGludG8gYSBzZXJpZXMgb2YgY29udGludWF0aW9ucyB0byBtYWtlIHN1cmUgdGhhdCB3ZQ0KKyAgLy8gZG9uJ3QgbWFrZSB0aGUgYnJvd3NlciB1bnJlc3BvbnNpdmUgd2hlbiByZXdyaXRpbmcgYSBsYXJnZSBwYWdlLg0KKyAgdmFyIGsgPSAwOw0KKw0KKyAgZnVuY3Rpb24gZG9Xb3JrKCkgew0KKyAgICB2YXIgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMjUwOw0KKyAgICBmb3IgKDsgayA8IGVsZW1lbnRzLmxlbmd0aCAmJiBuZXcgRGF0ZSgpLmdldFRpbWUoKSA8IGVuZFRpbWU7IGsrKykgew0KKyAgICAgIHZhciBjcyA9IGVsZW1lbnRzW2tdOw0KKyAgICAgIGlmIChjcy5jbGFzc05hbWUgJiYgY3MuY2xhc3NOYW1lLmluZGV4T2YoJ3ByZXR0eXByaW50JykgPj0gMCkgew0KKw0KKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgaXMgbm90IG5lc3RlZCBpbiBhbiBhbHJlYWR5IHByZXR0aWZpZWQgZWxlbWVudA0KKyAgICAgICAgdmFyIG5lc3RlZCA9IGZhbHNlOw0KKyAgICAgICAgZm9yICh2YXIgcCA9IGNzLnBhcmVudE5vZGU7IHAgIT0gbnVsbDsgcCA9IHAucGFyZW50Tm9kZSkgew0KKyAgICAgICAgICBpZiAoKHAudGFnTmFtZSA9PSAncHJlJyB8fCBwLnRhZ05hbWUgPT0gJ2NvZGUnIHx8DQorICAgICAgICAgICAgICAgcC50YWdOYW1lID09ICd4bXAnKSAmJg0KKyAgICAgICAgICAgICAgcC5jbGFzc05hbWUgJiYgcC5jbGFzc05hbWUuaW5kZXhPZigncHJldHR5cHJpbnQnKSA+PSAwKSB7DQorICAgICAgICAgICAgbmVzdGVkID0gdHJ1ZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFuZXN0ZWQpIHsNCisgICAgICAgICAgLy8gWE1QIHRhZ3MgY29udGFpbiB1bmVzY2FwZWQgZW50aXRpZXMgc28gcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLg0KKyAgICAgICAgICB2YXIgaXNSYXdDb250ZW50ID0gJ1hNUCcgPT0gY3MudGFnTmFtZTsNCisNCisgICAgICAgICAgLy8gZmV0Y2ggdGhlIGNvbnRlbnQgYXMgYSBzbmlwcGV0IG9mIHByb3Blcmx5IGVzY2FwZWQgSFRNTA0KKyAgICAgICAgICB2YXIgY29udGVudCA9IGNzLmlubmVySFRNTDsNCisgICAgICAgICAgaWYgKGlzUmF3Q29udGVudCkgew0KKyAgICAgICAgICAgIGNvbnRlbnQgPSBQUl90ZXh0VG9IdG1sKGNvbnRlbnQpOw0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIC8vIGRvIHRoZSBwcmV0dHkgcHJpbnRpbmcNCisgICAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSBwcmV0dHlQcmludE9uZShjb250ZW50KTsNCisNCisgICAgICAgICAgLy8gcHVzaCB0aGUgcHJldHRpZmllZCBodG1sIGJhY2sgaW50byB0aGUgdGFnLg0KKyAgICAgICAgICBpZiAoIWlzUmF3Q29udGVudCkgew0KKyAgICAgICAgICAgIC8vIGp1c3QgcmVwbGFjZSB0aGUgb2xkIGh0bWwgd2l0aCB0aGUgbmV3DQorICAgICAgICAgICAgY3MuaW5uZXJIVE1MID0gbmV3Q29udGVudDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgdGFnIHRvIGEgPHByZT4gc2luY2UgPHhtcD5zIGRvIG5vdCBhbGxvdw0KKyAgICAgICAgICAgIC8vIGVtYmVkZGVkIHRhZ3Mgc3VjaCBhcyB0aGUgc3BhbiB0YWdzIHVzZWQgdG8gYXR0YWNoIHN0eWxlcyB0bw0KKyAgICAgICAgICAgIC8vIHNlY3Rpb25zIG9mIHNvdXJjZSBjb2RlLg0KKyAgICAgICAgICAgIHZhciBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQUkUnKTsNCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNzLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsNCisgICAgICAgICAgICAgIHZhciBhID0gY3MuYXR0cmlidXRlc1tpXTsNCisgICAgICAgICAgICAgIGlmIChhLnNwZWNpZmllZCkgew0KKyAgICAgICAgICAgICAgICBwcmUuc2V0QXR0cmlidXRlKGEubmFtZSwgYS52YWx1ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHByZS5pbm5lckhUTUwgPSBuZXdDb250ZW50Ow0KKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkDQorICAgICAgICAgICAgY3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocHJlLCBjcyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGsgPCBlbGVtZW50cy5sZW5ndGgpIHsNCisgICAgICAvLyBmaW5pc2ggdXAgaW4gYSBjb250aW51YXRpb24NCisgICAgICBzZXRUaW1lb3V0KGRvV29yaywgMjUwKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZG9Xb3JrKCk7DQorfQ0KZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvY3NzL21hdmVuLWJhc2UuY3NzIGIvZG9jL3NhbXBsZXJlcG9ydC9jc3MvbWF2ZW4tYmFzZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzMzI4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvY3NzL21hdmVuLWJhc2UuY3NzCkBAIC0wLDAgKzEsMTQ3IEBACitib2R5IHsNCisgIG1hcmdpbjogMHB4Ow0KKyAgcGFkZGluZzogMHB4Ow0KK30NCitpbWcgew0KKyAgYm9yZGVyOm5vbmU7DQorfQ0KK3RhYmxlIHsNCisgIHBhZGRpbmc6MHB4Ow0KKyAgd2lkdGg6IDEwMCU7DQorICBtYXJnaW4tbGVmdDogLTJweDsNCisgIG1hcmdpbi1yaWdodDogLTJweDsNCit9DQorYWNyb255bSB7DQorICBjdXJzb3I6IGhlbHA7DQorICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNmZWI7DQorfQ0KK3RhYmxlLmJvZHlUYWJsZSB0aCwgdGFibGUuYm9keVRhYmxlIHRkIHsNCisgIHBhZGRpbmc6IDJweCA0cHggMnB4IDRweDsNCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQorfQ0KK2Rpdi5jbGVhcnsNCisgIGNsZWFyOmJvdGg7DQorICB2aXNpYmlsaXR5OiBoaWRkZW47DQorfQ0KK2Rpdi5jbGVhciBocnsNCisgIGRpc3BsYXk6IG5vbmU7DQorfQ0KKyNiYW5uZXJMZWZ0LCAjYmFubmVyUmlnaHQgew0KKyAgZm9udC1zaXplOiB4eC1sYXJnZTsgDQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQorI2Jhbm5lckxlZnQgaW1nLCAjYmFubmVyUmlnaHQgaW1nIHsNCisgIG1hcmdpbjogMHB4Ow0KK30NCisueGxlZnQsICNiYW5uZXJMZWZ0IGltZyB7DQorICBmbG9hdDpsZWZ0Ow0KKyAgdGV4dC1zaGFkb3c6ICM3Q0ZDMDA7DQorfQ0KKy54cmlnaHQsICNiYW5uZXJSaWdodCBpbWcgew0KKyAgZmxvYXQ6cmlnaHQ7DQorICB0ZXh0LXNoYWRvdzogIzdDRkMwMDsNCit9DQorI2Jhbm5lciB7DQorICBwYWRkaW5nOiAwcHg7DQorfQ0KKyNiYW5uZXIgaW1nIHsNCisgIGJvcmRlcjogbm9uZTsNCit9DQorI2JyZWFkY3J1bWJzIHsNCisgIHBhZGRpbmc6IDNweCAxMHB4IDNweCAxMHB4Ow0KK30NCisjbGVmdENvbHVtbiB7DQorIHdpZHRoOiAxNTBweDsNCisgZmxvYXQ6bGVmdDsNCit9DQorI2JvZHlDb2x1bW4gew0KKyAgbWFyZ2luLXJpZ2h0OiAxLjVlbTsNCisgIG1hcmdpbi1sZWZ0OiAxNzdweDsNCit9DQorI2xlZ2VuZCB7DQorICBwYWRkaW5nOiA4cHggMCA4cHggMDsNCit9DQorI25hdmNvbHVtbiB7DQorICBwYWRkaW5nOiA4cHggNHB4IDAgOHB4Ow0KK30NCisjbmF2Y29sdW1uIGg1IHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmc6IDA7DQorICBmb250LXNpemU6IHNtYWxsOw0KK30NCisjbmF2Y29sdW1uIHVsIHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmc6IDA7DQorICBmb250LXNpemU6IHNtYWxsOw0KK30NCisjbmF2Y29sdW1uIGxpIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsNCisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQorICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwLjRlbTsNCisgIHBhZGRpbmctbGVmdDogMTZweDsNCisgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91c2lkZTsNCisgIGxpbmUtaGVpZ2h0OiAxLjJlbTsNCisgIGZvbnQtc2l6ZTogc21hbGxlcjsNCit9DQorI25hdmNvbHVtbiBsaS5leHBhbmRlZCB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2V4cGFuZGVkLmdpZik7DQorfQ0KKyNuYXZjb2x1bW4gbGkuY29sbGFwc2VkIHsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvY29sbGFwc2VkLmdpZik7DQorfQ0KKyNwb3dlcmVkQnkgew0KKyAgdGV4dC1hbGlnbjogY2VudGVyOw0KK30NCisjbmF2Y29sdW1uIGltZyB7DQorICBtYXJnaW4tdG9wOiAxMHB4Ow0KKyAgbWFyZ2luLWJvdHRvbTogM3B4Ow0KK30NCisjcG93ZXJlZEJ5IGltZyB7DQorICBkaXNwbGF5OmJsb2NrOw0KKyAgbWFyZ2luOiAyMHB4IDAgMjBweCAxN3B4Ow0KKyAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQorICB3aWR0aDogOTBweDsNCisgIGhlaWdodDogMzBweDsNCit9DQorI3NlYXJjaCBpbWcgew0KKyAgICBtYXJnaW46IDBweDsNCisgICAgZGlzcGxheTogYmxvY2s7DQorfQ0KKyNzZWFyY2ggI3EsICNzZWFyY2ggI2J0bkcgew0KKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5Ow0KKyAgICBtYXJnaW4tYm90dG9tOjEwcHg7DQorfQ0KKyNzZWFyY2ggZm9ybSB7DQorICAgIG1hcmdpbjogMHB4Ow0KK30NCisjbGFzdFB1Ymxpc2hlZCB7DQorICBmb250LXNpemU6IHgtc21hbGw7DQorfQ0KKy5uYXZTZWN0aW9uIHsNCisgIG1hcmdpbi1ib3R0b206IDJweDsNCisgIHBhZGRpbmc6IDhweDsNCit9DQorLm5hdlNlY3Rpb25IZWFkIHsNCisgIGZvbnQtd2VpZ2h0OiBib2xkOw0KKyAgZm9udC1zaXplOiB4LXNtYWxsOw0KK30NCisuc2VjdGlvbiB7DQorICBwYWRkaW5nOiA0cHg7DQorfQ0KKyNmb290ZXIgew0KKyAgcGFkZGluZzogM3B4IDEwcHggM3B4IDEwcHg7DQorICBmb250LXNpemU6IHgtc21hbGw7DQorfQ0KKyNicmVhZGNydW1icyB7DQorICBmb250LXNpemU6IHgtc21hbGw7DQorICBtYXJnaW46IDBwdDsNCit9DQorLnNvdXJjZSB7DQorICBwYWRkaW5nOiAxMnB4Ow0KKyAgbWFyZ2luOiAxZW0gN3B4IDFlbSA3cHg7DQorfQ0KKy5zb3VyY2UgcHJlIHsNCisgIG1hcmdpbjogMHB4Ow0KKyAgcGFkZGluZzogMHB4Ow0KK30NCmRpZmYgLS1naXQgYS9kb2Mvc2FtcGxlcmVwb3J0L2Nzcy9tYXZlbi1jbGFzc2ljLmNzcyBiL2RvYy9zYW1wbGVyZXBvcnQvY3NzL21hdmVuLWNsYXNzaWMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTM5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2Nzcy9tYXZlbi1jbGFzc2ljLmNzcwpAQCAtMCwwICsxLDg4MSBAQAorYm9keSB7DQorIGJhY2tncm91bmQ6ICNmZmY7DQorIGNvbG9yOiAjMDAwOw0KKyAgcGFkZGluZzogMHB4IDBweCAxMHB4IDBweDsNCisgfQ0KKw0KKy5jb250ZW50Qm94IGgyIHsNCisgY29sb3I6ICNmZmY7DQorIGJhY2tncm91bmQtY29sb3I6ICMwMzY7DQorIH0NCisNCisuY29udGVudEJveCBoMyB7DQorIGNvbG9yOiAjZmZmOw0KKyBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4Ow0KKyB9DQorDQorLmEgdGQgeyANCisgYmFja2dyb3VuZDogI2RkZDsNCisgY29sb3I6ICMwMDA7DQorIH0NCisNCisuYiB0ZCB7IA0KKyBiYWNrZ3JvdW5kOiAjZWZlZmVmOw0KKyBjb2xvcjogIzAwMDsNCisgfQ0KKw0KKy5jb250ZW50Qm94IHRoIHsNCisgYmFja2dyb3VuZC1jb2xvcjogI2JiYjsNCisgY29sb3I6ICNmZmY7DQorIH0NCisNCitkaXYjYmFubmVyIHsNCisgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMzNjk7DQorIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDAzOw0KKyB9DQorDQorI2Jhbm5lciwgI2Jhbm5lciB0ZCB7IA0KKyBiYWNrZ3JvdW5kOiAjMDM2Ow0KKyBjb2xvcjogI2ZmZjsNCisgfQ0KKyNiYW5uZXIgew0KKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmY7DQorfQ0KKw0KKyNsZWZ0Q29sdW1uIHsNCisgYmFja2dyb3VuZDogI2VlZTsNCisgY29sb3I6ICMwMDA7DQorIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNhYWE7DQorIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhOw0KKyBib3JkZXItdG9wOiAxcHggc29saWQgI2ZmZjsNCit9DQorDQorI25hdmNvbHVtbiB7DQorLyogYmFkIGZvciBJRQ0KKyBiYWNrZ3JvdW5kOiAjZWVlOw0KKyovDQorIGNvbG9yOiAjMDAwOw0KKyBib3JkZXItcmlnaHQ6IG5vbmU7DQorIGJvcmRlci1ib3R0b206IG5vbmU7DQorIGJvcmRlci10b3A6IG5vbmU7DQorIH0NCisNCisjYnJlYWRjcnVtYnMgew0KKyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOw0KKyBjb2xvcjogIzAwMDsNCisgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmZmY7DQorIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhOw0KKyB9DQorDQorLnNvdXJjZSB7DQorIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQorIGNvbG9yOiAjMDAwOw0KKyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjODg4OyANCisgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjODg4OyANCisgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM4ODg7IA0KKyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODsgDQorIG1hcmdpbi1yaWdodDogN3B4Ow0KKyBtYXJnaW4tbGVmdDogN3B4Ow0KKyBtYXJnaW4tdG9wOiAxZW07DQorIH0NCisNCisuc291cmNlIHByZSB7DQorIG1hcmdpbi1yaWdodDogN3B4Ow0KKyBtYXJnaW4tbGVmdDogN3B4Ow0KKyB9DQorDQorYVtuYW1lXTpob3ZlciwgI2xlZnRDb2x1bW4gYVtuYW1lXTpob3ZlciB7DQorIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7DQorIH0NCisNCithOmxpbmssICNicmVhZGNydW1icyBhOnZpc2l0ZWQsICNuYXZjb2x1bW4gYTp2aXNpdGVkLCAuY29udGVudEJveCBhOnZpc2l0ZWQsIC50YXNrbmF2IGE6dmlzaXRlZCB7DQorIGNvbG9yOiBibHVlOw0KKyB9DQorDQorYTphY3RpdmUsIGE6aG92ZXIsICNsZWZ0Q29sdW1uIGE6YWN0aXZlLCAjbGVmdENvbHVtbiBhOmhvdmVyIHsNCisgY29sb3I6ICNmMzAgIWltcG9ydGFudDsNCisgfQ0KKw0KK2E6bGluay5zZWxmcmVmLCBhOnZpc2l0ZWQuc2VsZnJlZiB7DQorIGNvbG9yOiAjNTU1ICFpbXBvcnRhbnQ7DQorIH0NCisNCisjbGVnZW5kIGxpLmV4dGVybmFsTGluayB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2V4dGVybmFsLWNsYXNzaWMucG5nKSBsZWZ0IHRvcCBuby1yZXBlYXQ7DQorICBwYWRkaW5nLWxlZnQ6IDE4cHg7DQorfQ0KK2EuZXh0ZXJuYWxMaW5rLCBhLmV4dGVybmFsTGluazpsaW5rLCBhLmV4dGVybmFsTGluazp2aXNpdGVkLCBhLmV4dGVybmFsTGluazphY3RpdmUsIGEuZXh0ZXJuYWxMaW5rOmhvdmVyIHsNCisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvZXh0ZXJuYWwtY2xhc3NpYy5wbmcpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQorICBwYWRkaW5nLXJpZ2h0OiAxOHB4Ow0KK30NCisNCisjbGVnZW5kIGxpLm5ld1dpbmRvdyB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL25ld3dpbmRvdy1jbGFzc2ljLnBuZykgbGVmdCB0b3Agbm8tcmVwZWF0Ow0KKyAgcGFkZGluZy1sZWZ0OiAxOHB4Ow0KK30NCithLm5ld1dpbmRvdywgYS5uZXdXaW5kb3c6bGluaywgYS5uZXdXaW5kb3c6dmlzaXRlZCwgYS5uZXdXaW5kb3c6YWN0aXZlLCBhLm5ld1dpbmRvdzpob3ZlciB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL25ld3dpbmRvdy1jbGFzc2ljLnBuZykgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsNCisgIHBhZGRpbmctcmlnaHQ6IDE4cHg7DQorfQ0KKw0KK2gyLCBoMyB7DQorIG1hcmdpbi10b3A6IDFlbTsNCisgbWFyZ2luLWJvdHRvbTogMDsNCisgfQ0KKw0KK2ltZy5oYW5kbGUgew0KKyBib3JkZXI6IDA7DQorIHBhZGRpbmctcmlnaHQ6IDJweDsNCit9DQorDQorI25hdmNvbHVtbiBkaXYgZGl2ICB7DQorIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQorIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQorfQ0KKw0KKyNuYXZjb2x1bW4gZGl2IGRpdiB7DQorICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQorfQ0KKy8qICRJZCQNCisgIA0KKyAgVGhpcyBmaWxlIGRlZmluZXMgYmFzaWMgZGVmYXVsdCBmb3JtYXR0aW5nIGZvciBIVE1MIGNvbmZvcm1pbmcgdG8gVGlncmlzIGFwcGxpY2F0aW9uIHN0eWxlLiBUbyBleHRlbmQgb3Igb3ZlcnJpZGUgdGhlc2UgcnVsZXMgZm9yIHlvdXIgaW5zdGFuY2UsIGVkaXQgaW5zdC5jc3MgaW5zdGVhZCBvZiB0aGlzIGZpbGUuICovDQorDQorLyogY29sb3JzLCBiYWNrZ3JvdW5kcywgYm9yZGVycywgbGluayBpbmRpY2F0aW9uICovDQorLmNvbnRlbnRCb3ggaDIsIC5jb250ZW50Qm94IGgzLCAudGFicyB0ZCwgLnRhYnMgdGgsIC5mdW5jdG5iYXIgew0KKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9ud19tYWpfcm9uZC5naWYpOw0KKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCit9DQorDQorLmZ1bmN0bmJhciwgLmZ1bmN0bmJhcjIgew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTsNCit9DQorDQorLmZ1bmN0bmJhcjIsIC5mdW5jdG5iYXIzIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3N3X21hal9yb25kLmdpZik7DQorICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tIGxlZnQ7DQorfQ0KKw0KKy5mdW5jdG5iYXIzIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3N3X21lZF9yb25kLmdpZik7DQorfQ0KKw0KKy5mdW5jdG5iYXIsIC5mdW5jdG5iYXIyLCAuZnVuY3RuYmFyMyB7DQorICBjb2xvcjogIzAwMDsNCit9DQorDQorLmZ1bmN0bmJhciBhLCAuZnVuY3RuYmFyMiBhLCAuZnVuY3RuYmFyMyBhIHsNCisgIGNvbG9yOiAjMDAwOw0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KKw0KKyNuYXZjb2x1bW4gLmJvZHkgZGl2LCBib2R5LmRvY3MgI3RvYyBsaSBsaSB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3N0cmljaC5naWYpOw0KKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCisgIGJhY2tncm91bmQtcG9zaXRpb246IC41ZW0gLjVlbTsNCit9DQorDQorI3NlYXJjaGJveCAuYm9keSBkaXYsICNuYXZjb2x1bW4gLmJvZHkgLmhlYWRpbmcgew0KKyAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsNCit9DQorDQorYTpsaW5rLnNlbGZyZWYsIGE6dmlzaXRlZC5zZWxmcmVmIHsNCisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCit9DQorDQorI2xlZnRDb2x1bW4gYSwgI2JyZWFkY3J1bWJzIGEgew0KKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KK30NCisNCisvKiBVbnN1cmUgb2YgdGhpcy4gVE9ETyAqLw0KKy5jb250ZW50Qm94IGgyIGE6bGluaywgLmNvbnRlbnRCb3ggaDIgYTp2aXNpdGVkLCAuY29udGVudEJveCBoMyBhOmxpbmssIC5jb250ZW50Qm94IGgzIGE6dmlzaXRlZCB7DQorICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQorfQ0KKw0KK3RhYmxlLCB0aCwgdGQgew0KKyAgYm9yZGVyOiBub25lOw0KK30NCisNCitkaXYuY29sYmFyIHsNCisgIGJhY2tncm91bmQ6ICNlZWU7DQorICBib3JkZXItY29sb3I6ICM5OTkgI0VFRSAjRUVFICM5OTk7DQorICBib3JkZXItd2lkdGg6IDFweDsNCisgIGJvcmRlci1zdHlsZTogc29saWQ7DQorfQ0KKw0KKy50b29sZ3JvdXAgew0KKyAgYmFja2dyb3VuZDogI2VmZWZlZjsNCit9DQorDQorLnRvb2xncm91cCAubGFiZWwgew0KKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7DQorICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2Ow0KKyAgYmFja2dyb3VuZDogI2RkZDsNCisgIGNvbG9yOiAjNTU1Ow0KK30NCisNCisudG9vbGdyb3VwIC5ib2R5IHsNCisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNhYWE7DQorICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYTsNCit9DQorDQorI21haW4gew0KKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk7DQorfQ0KKw0KKyNyaWdodGNvbCBkaXYud3d3LCAjcmlnaHRjb2wgZGl2LmhlbHAgew0KKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsNCit9DQorDQorYm9keS5kb2NzIGRpdi5kb2NzIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQorICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7DQorICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsNCit9DQorDQorI2hlbHB0ZXh0IC5sYWJlbCB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2ljb25faGVscF9zbWwuZ2lmKTsNCisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQorICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA5NyU7DQorfQ0KKw0KK2JvZHkuZG9jcyB7DQorICBiYWNrZ3JvdW5kOiAjZWVlIHVybCguLi9pbWFnZXMvaGVscF9sb2dvLmdpZikgdG9wIHJpZ2h0IG5vLXJlcGVhdCAhaW1wb3J0YW50Ow0KK30NCisNCisuZG9jcyBoMiwgLmRvY3MgaDMgew0KKyAgYm9yZGVyLXRvcDogc29saWQgMXB4ICMwMDA7DQorfQ0KKw0KKyNhcHBoZWFkIGgyIGVtIHsNCisgIGNvbG9yOiAjNzc3Ow0KK30NCisNCisudGFicyB0aCB7DQorICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjMzMzOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsNCisgIGNvbG9yOiAjZmZmOw0KKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZmZmOw0KK30NCisNCisudGFicyB0ZCB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5Ow0KKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmY7DQorICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZmZmOw0KKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZmZmOw0KK30NCisNCisudGFicyB7DQorICBib3JkZXItYm90dG9tOiA2cHggI2RkZCBzb2xpZDsNCit9DQorDQorLnRhYnMgdGgsIC50YWJzIHRoIGE6bGluaywgLnRhYnMgdGggYTp2aXNpdGVkIHsNCisgIGNvbG9yOiAjNTU1Ow0KK30NCisNCisudGFicyB0ZCwgLnRhYnMgdGQgYTpsaW5rLCAudGFicyB0ZCBhOnZpc2l0ZWQgew0KKyAgY29sb3I6ICNmZmY7DQorfQ0KKw0KKy50YWJzIGEgew0KKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KK30NCisNCisuYXhpYWwgdGggew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsNCisgIGNvbG9yOiBibGFjazsNCit9DQorDQorLmFsZXJ0IHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNmZjk7DQorfQ0KKw0KKy5leHBhbmRlZHdhc3RlIHsNCisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvaWNvbl9hcnJvd3dhc3RlMl9zbWwuZ2lmKSBuby1yZXBlYXQ7DQorfQ0KKw0KKy5jb2xsYXBzZWR3YXN0ZSB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTFfc21sLmdpZikgbm8tcmVwZWF0Ow0KK30NCisNCisuZmlsZWJyb3dzZSAuZXhwYW5kZWQsIC5maWxlYnJvd3NlLWFsdCAuZXhwYW5kZWQgew0KKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyb3BlbjJfc21sLmdpZik7DQorICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KK30NCisNCisuZmlsZWJyb3dzZSAuY29sbGFwc2VkLCAuZmlsZWJyb3dzZS1hbHQgLmNvbGxhcHNlZCB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXJjbG9zZWQxX3NtbC5naWYpOw0KKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCit9DQorDQorLmZpbGVicm93c2UgLmxlYWZub2RlLCAuZmlsZWJyb3dzZS1hbHQgLmxlYWZub2RlIHsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvaWNvbl9mb2xkZXJfc21sLmdpZik7DQorICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KK30NCisNCisuZmlsZWJyb3dzZSAubGVhZiwgLmZpbGVicm93c2UtYWx0IC5sZWFmIHsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvaWNvbl9kb2Nfc21sLmdpZik7DQorICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KK30NCisNCisuc29ydHVwIHsNCisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvaWNvbl9zb3J0dXAuZ2lmKSBuby1yZXBlYXQ7DQorfQ0KKw0KKy5zb3J0ZG93biB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2ljb25fc29ydGRvd24uZ2lmKSBuby1yZXBlYXQ7DQorfQ0KKw0KKy5jb2xsYXBzZWR3YXN0ZSB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTFfc21sLmdpZikgbm8tcmVwZWF0Ow0KK30NCisNCitib2R5IC5ncmlkIHRkIHsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOw0KKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7DQorfQ0KKw0KKy5jb25maXJtIHsNCisgIGNvbG9yOiAjMDkwOw0KK30NCisNCisuaW5mbyB7DQorICBjb2xvcjogIzA2OTsNCit9DQorDQorLmVycm9ybWVzc2FnZSwgLndhcm5pbmdtZXNzYWdlLCAuZG9uZW1lc3NhZ2UsIC5pbmZvbWVzc2FnZSB7DQorICBib3JkZXItdG9wOiA1cHggc29saWQgIzkwMDsNCisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzkwMDsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvaWNvbl9lcnJvcl9scmcuZ2lmKTsNCisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQorICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggMS4zM2VtOw0KK30NCisNCisud2FybmluZ21lc3NhZ2Ugew0KKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9pY29uX3dhcm5pbmdfbHJnLmdpZik7DQorICBib3JkZXItY29sb3I6ICNjNjA7DQorfQ0KKw0KKy5kb25lbWVzc2FnZSB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2ljb25fc3VjY2Vzc19scmcuZ2lmKTsNCisgIGJvcmRlci1jb2xvcjogIzA5MDsNCit9DQorDQorLmluZm9tZXNzYWdlIHsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvaWNvbl9pbmZvX2xyZy5naWYpOw0KKyAgYm9yZGVyLWNvbG9yOiAjMDY5Ow0KK30NCisNCisuZG9jaW5mbyB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2ljb25fZG9jX2xyZy5naWYpIG5vLXJlcGVhdDsNCit9DQorDQorLmRpcmluZm8gew0KKyAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9pY29uX2ZvbGRlcl9scmcuZ2lmKSBuby1yZXBlYXQ7DQorfQ0KKw0KKy5tZW1iZXJpbmZvIHsNCisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvaWNvbl9tZW1iZXJzX2xyZy5naWYpIG5vLXJlcGVhdDsNCit9DQorDQorLnVzZXJncm91cGluZm8gew0KKyAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9pY29uX3VzZXJncm91cHNfbHJnLmdpZikgbm8tcmVwZWF0Ow0KK30NCisNCisuZXJyb3JtYXJrLCAud2FybmluZ21hcmssIC5kb25lbWFyaywgLmluZm9tYXJrIHsNCisgIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvaWNvbl9lcnJvcl9zbWwuZ2lmKSBuby1yZXBlYXQ7DQorfQ0KKw0KKy53YXJuaW5nbWFyayB7DQorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2ljb25fd2FybmluZ19zbWwuZ2lmKTsNCit9DQorDQorLmRvbmVtYXJrIHsNCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvaWNvbl9zdWNjZXNzX3NtbC5naWYpOw0KK30NCisNCisuaW5mb21hcmsgew0KKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9pY29uX2luZm9fc21sLmdpZik7DQorfQ0KKw0KKy5jdnNkaWZmLCAuY3ZzYmxhbWUgew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsNCit9DQorDQorLmN2c2RpZmZhZGQgew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2FmYTsNCit9DQorDQorLmN2c2RpZmZyZW1vdmUgew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZhYTsNCit9DQorDQorLmN2c2RpZmZjaGFuZ2VzMSB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3Ow0KK30NCisNCisuY3ZzZGlmZmNoYW5nZXMyIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNmZjc7DQorfQ0KKw0KK2xpLnNlbGVjdGlvbiB1bCBhIHsNCisgIGJhY2tncm91bmQ6ICNmZmY7DQorfQ0KKw0KKy5iYW5kMSB7DQorICBjb2xvcjogI2ZmZjsNCisgIGJhY2tncm91bmQtY29sb3I6ICM2NjM7DQorfQ0KKw0KKy5iYW5kMiB7DQorICBjb2xvcjogI2ZmZjsNCisgIGJhY2tncm91bmQtY29sb3I6ICM2NkM7DQorfQ0KKw0KKy5iYW5kMyB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjQzk5Ow0KK30NCisNCisuYmFuZDQgew0KKyAgYmFja2dyb3VuZC1jb2xvcjogI0NGRjsNCit9DQorDQorLmJhbmQ1IHsNCisgIGNvbG9yOiAjZmZmOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogIzMzNjsNCit9DQorDQorLmJhbmQ2IHsNCisgIGNvbG9yOiAjZmZmOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogIzk2NjsNCit9DQorDQorLmJhbmQ3IHsNCisgIGJhY2tncm91bmQtY29sb3I6ICM5Q0M7DQorfQ0KKw0KKy5iYW5kOCB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZDOw0KK30NCisNCisuYmFuZDkgew0KKyAgY29sb3I6ICNmZmY7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjMzOw0KK30NCisNCisuYmFuZDEwIHsNCisgIGNvbG9yOiAjZmZmOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogIzY5OTsNCit9DQorDQorLmJhbmQxMSB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0M5Ow0KK30NCisNCisuYmFuZDEyIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNDQ0Y7DQorfQ0KKw0KKy5iYW5kMTMgew0KKyAgY29sb3I6ICNmZmY7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzY2Ow0KK30NCisNCisuYmFuZDE0IHsNCisgIGNvbG9yOiAjZmZmOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogIzk5NjsNCit9DQorDQorLmJhbmQxNSB7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTlDOw0KK30NCisNCisuYmFuZDE2IHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNGQ0M7DQorfQ0KKw0KKy5jb250ZW50Qm94IC5oZWxwbGluaywgI2hlbHB0ZXh0IC5oZWxwbGluayB7DQorICBjdXJzb3I6IGhlbHA7DQorfQ0KKw0KKy5sZWdlbmQgdGgsIC5iYXJzIHRoIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQorfQ0KKw0KKy8qIGZvbnQgYW5kIHRleHQgcHJvcGVydGllcywgZXhjbHVzaXZlIG9mIGxpbmsgaW5kaWNhdGlvbiwgYWxpZ25tZW50LCB0ZXh0LWluZGVudCAqLw0KK2JvZHksIHRoLCB0ZCwgaW5wdXQsIHNlbGVjdCB7DQorICBmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsNCit9DQorDQorY29kZSwgcHJlIHsNCisgIGZvbnQtZmFtaWx5OiAnQW5kYWxlIE1vbm8nLCBDb3VyaWVyLCBtb25vc3BhY2U7DQorfQ0KKw0KK2JvZHksIC5jb250ZW50Qm94IGgyLCAuY29udGVudEJveCBoMywgI3JpZ2h0Y29sIGgyLCBwcmUsIGNvZGUsICNhcHBoZWFkIGgyIHNtYWxsLCBoMywgdGgsIHRkIHsNCisgIGZvbnQtc2l6ZTogeC1zbWFsbDsNCisgIHZvaWNlLWZhbWlseTogIlwifVwiIjsNCisgIHZvaWNlLWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorfQ0KKw0KK3NtYWxsLCBkaXYjZm9vdGVyLCBkaXYjbG9naW4sIGRpdi50YWJzIHRoLCBkaXYudGFicyB0ZCwgaW5wdXQsIHNlbGVjdCwgLnBhZ2luYXRlLCAuZnVuY3RuYmFyLCAuZnVuY3RuYmFyMiwgLmZ1bmN0bmJhcjMsICNicmVhZGNydW1icywgLmNvdXJ0ZXN5bGlua3MsICNyaWdodGNvbCBkaXYuaGVscCwgLmNvbGJhciwgLnRhc2tuYXYsIGJvZHkuZG9jcyBkaXYjdG9jLCAjbGVmdENvbHVtbiwgLmxlZ2VuZCwgLmJhcnMgew0KKyAgZm9udC1zaXplOiB4eC1zbWFsbDsNCisgIHZvaWNlLWZhbWlseTogIlwifVwiIjsNCisgIHZvaWNlLWZhbWlseTogaW5oZXJpdDsNCisgIGZvbnQtc2l6ZTogeC1zbWFsbDsNCit9DQorDQorLnRhYnMgdGQsIC50YWJzIHRoLCBkdCwgLnRhc2tuYXYgLnNlbGZyZWYsICNsb2dpbiAudXNlcm5hbWUsIC5zZWxlY3Rpb24gew0KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7DQorfQ0KKw0KK2xpLnNlbGVjdGlvbiB1bCB7DQorICBmb250LXdlaWdodDogbm9ybWFsOw0KK30NCisNCisjYXBwaGVhZCBoMiBlbSB7DQorICBmb250LXN0eWxlOiBub3JtYWw7DQorfQ0KKw0KKyNiYW5uZXIgaDEgew0KKyAgZm9udC1zaXplOiAxLjI1ZW07DQorfQ0KKw0KKy8qIGJveCBwcm9wZXJ0aWVzIChleGNsdXNpdmUgb2YgYm9yZGVycyksIHBvc2l0aW9uaW5nLCBhbGlnbm1lbnRzLCBsaXN0IHR5cGVzLCB0ZXh0LWluZGVudCAqLw0KKyNib2R5Q29sdW1uIGgyIHsNCisgIG1hcmdpbi10b3A6IC4zZW07DQorICBtYXJnaW4tYm90dG9tOiAuNWVtOw0KK30NCisNCitwLCB1bCwgb2wsIGRsLCAuYmFycyB0YWJsZSB7DQorICBtYXJnaW4tdG9wOiAuNjdlbTsNCisgIG1hcmdpbi1ib3R0b206IC42N2VtOw0KK30NCisNCitmb3JtIHsNCisgIG1hcmdpbjogMDsNCit9DQorDQorI2JvZHlDb2x1bW4gew0KKyAgcGFkZGluZy1sZWZ0OiAxMnB4Ow0KKyAgcGFkZGluZy1yaWdodDogMTJweDsNCisgIHdpZHRoOiAxMDAlOw0KKyAgdm9pY2UtZmFtaWx5OiAiXCJ9XCIiOw0KKyAgdm9pY2UtZmFtaWx5OiBpbmhlcml0Ow0KKyAgd2lkdGg6IGF1dG87DQorfQ0KKw0KK2h0bWw+Ym9keSAjYm9keUNvbHVtbiB7DQorICB3aWR0aDogYXV0bzsNCit9DQorDQorLmRvY3Mgew0KKyAgbGluZS1oZWlnaHQ6IDEuNDsNCit9DQorDQorb2wgb2wgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsNCit9DQorDQorb2wgb2wgb2wgew0KKyAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1yb21hbjsNCit9DQorDQorLmNvbnRlbnRCb3ggaDIsIC5jb250ZW50Qm94IGgzIHsNCisgIHBhZGRpbmc6IDVweDsNCisgIG1hcmdpbi1yaWdodDogMnB4Ow0KK30NCisNCisuY29udGVudEJveCB0ZCwgLmNvbnRlbnRCb3ggdGggew0KKyAgcGFkZGluZzogMnB4IDNweDsNCit9DQorDQorLmgyIHAsIC5oMyBwLCAuaDIgZHQsIC5oMyBkdCB7DQorICBtYXJnaW4tcmlnaHQ6IDdweDsNCisgIG1hcmdpbi1sZWZ0OiA3cHg7DQorfQ0KKw0KKy50YXNrbmF2IHsNCisgIG1hcmdpbi1ib3R0b206IDEuMzNlbTsNCit9DQorDQorZGl2LmNvbGJhciB7DQorICBwYWRkaW5nOiAzcHg7DQorICBtYXJnaW46IDJweCAycHggMDsNCit9DQorDQorLnRhYnMgew0KKyAgbWFyZ2luLXRvcDogLjY3ZW07DQorICBtYXJnaW4tcmlnaHQ6IDJweDsNCisgIG1hcmdpbi1sZWZ0OiAycHg7DQorICBwYWRkaW5nLWxlZnQ6IDhweDsNCit9DQorDQorLnRhYnMgdGQsIC50YWJzIHRoIHsNCisgIHBhZGRpbmc6IDNweCA5cHg7DQorfQ0KKw0KKyNyaWdodGNvbCBkaXYud3d3LCAjcmlnaHRjb2wgZGl2LmhlbHAgew0KKyAgcGFkZGluZzogMCAuNWVtOw0KK30NCisNCitib2R5LmRvY3MgI3RvYyB7DQorICBwb3NpdGlvbjogYWJzb2x1dGU7DQorICB0b3A6IDE1cHg7DQorICBsZWZ0OiAwcHg7DQorICB3aWR0aDogMTIwcHg7DQorICBwYWRkaW5nOiAwIDIwcHggMCAwOw0KK30NCisNCitib2R5LmRvY3MgI3RvYyB1bCwgI3RvYyBvbCB7DQorICBtYXJnaW4tbGVmdDogMDsNCisgIHBhZGRpbmctbGVmdDogMDsNCit9DQorDQorYm9keS5kb2NzICN0b2MgbGkgew0KKyAgbWFyZ2luLXRvcDogN3B4Ow0KKyAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOw0KK30NCisNCitib2R5LmRvY3MgZGl2LmRvY3Mgew0KKyAgbWFyZ2luOiA2MXB4IDAgMCAxNTBweDsNCisgIHBhZGRpbmc6IDFlbSAyZW0gMWVtIDFlbSAhaW1wb3J0YW50Ow0KK30NCisNCisuZG9jcyBwK3Agew0KKyAgdGV4dC1pbmRlbnQ6IDUlOw0KKyAgbWFyZ2luLXRvcDogLS42N2VtOw0KK30NCisNCisuZG9jcyBoMiwgLmRvY3MgaDMgew0KKyAgbWFyZ2luLWJvdHRvbTogLjFlbTsNCisgIHBhZGRpbmctdG9wOiAuM2VtOw0KK30NCisNCisuZnVuY3RuYmFyLCAuZnVuY3RuYmFyMiwgLmZ1bmN0bmJhcjMgew0KKyAgcGFkZGluZzogNXB4Ow0KKyAgbWFyZ2luOiAuNjdlbSAycHg7DQorfQ0KKw0KKy5mdW5jdG5iYXIzIHsNCisgIG1hcmdpbi10b3A6IDA7DQorfQ0KKw0KK2JvZHkgew0KKyAgcGFkZGluZzogMWVtOw0KK30NCisNCitib2R5LmNvbXBvc2l0ZSwgYm9keS5kb2NzIHsNCisgIG1hcmdpbjogMDsNCisgIHBhZGRpbmc6IDA7DQorfQ0KKw0KK3RoLCB0ZCB7DQorICB0ZXh0LWFsaWduOiBsZWZ0Ow0KKyAgdmVydGljYWwtYWxpZ246IHRvcDsNCit9DQorDQorLnJpZ2h0IHsNCisgIHRleHQtYWxpZ246IHJpZ2h0ICFpbXBvcnRhbnQ7DQorfQ0KKw0KKy5jZW50ZXIgew0KKyAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7DQorfQ0KKw0KKy5heGlhbCB0aCwgLmF4aWFsIHRoIC5zdHJ1dCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCit9DQorDQorLmNvbnRlbnRCb3ggLmF4aWFsIHRkIHRoIHsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorfQ0KKw0KK2JvZHkgLnN0YiB7DQorICBtYXJnaW4tdG9wOiAxZW07DQorICB0ZXh0LWluZGVudDogMDsNCit9DQorDQorYm9keSAubXRiIHsNCisgIG1hcmdpbi10b3A6IDJlbTsNCisgIHRleHQtaW5kZW50OiAwOw0KK30NCisNCisuY291cnRlc3lsaW5rcyB7DQorICBtYXJnaW4tdG9wOiAxZW07DQorICBwYWRkaW5nLXRvcDogMWVtOw0KK30NCisNCitkZCB7DQorICBtYXJnaW4tYm90dG9tOiAuNjdlbTsNCit9DQorDQorLnRvb2xncm91cCB7DQorICBtYXJnaW4tYm90dG9tOiA2cHg7DQorfQ0KKw0KKy50b29sZ3JvdXAgLmJvZHkgew0KKyAgcGFkZGluZzogNHB4IDRweCA0cHggMDsNCit9DQorDQorLnRvb2xncm91cCAubGFiZWwgew0KKyAgcGFkZGluZzogNHB4Ow0KK30NCisNCisudG9vbGdyb3VwIC5ib2R5IGRpdiB7DQorICBwYWRkaW5nLWJvdHRvbTogLjNlbTsNCisgIHBhZGRpbmctbGVmdDogMWVtOw0KK30NCisNCisudG9vbGdyb3VwIC5ib2R5IGRpdiBkaXYgew0KKyAgbWFyZ2luLXRvcDogLjNlbTsNCisgIHBhZGRpbmctYm90dG9tOiAwOw0KK30NCisNCisudGllcjEgew0KKyAgbWFyZ2luLWxlZnQ6IDA7DQorfQ0KKw0KKy50aWVyMiB7DQorICBtYXJnaW4tbGVmdDogMS41ZW07DQorfQ0KKw0KKy50aWVyMyB7DQorICBtYXJnaW4tbGVmdDogM2VtOw0KK30NCisNCisudGllcjQgew0KKyAgbWFyZ2luLWxlZnQ6IDQuNWVtOw0KK30NCisNCisudGllcjUgew0KKyAgbWFyZ2luLWxlZnQ6IDZlbTsNCit9DQorDQorLnRpZXI2IHsNCisgIG1hcmdpbi1sZWZ0OiA3LjVlbTsNCit9DQorDQorLnRpZXI3IHsNCisgIG1hcmdpbi1sZWZ0OiA5ZW07DQorfQ0KKw0KKy50aWVyOCB7DQorICBtYXJnaW4tbGVmdDogMTAuNWVtOw0KK30NCisNCisudGllcjkgew0KKyAgbWFyZ2luLWxlZnQ6IDEyZW07DQorfQ0KKw0KKy50aWVyMTAgew0KKyAgbWFyZ2luLWxlZnQ6IDEzLjVlbTsNCit9DQorDQorLmZpbGVicm93c2UgLmV4cGFuZGVkLCAuZmlsZWJyb3dzZSAuY29sbGFwc2VkIHsNCisgIHBhZGRpbmctbGVmdDogMzRweDsNCit9DQorDQorLmZpbGVicm93c2UgLmxlYWZub2RlLCAuZmlsZWJyb3dzZSAubGVhZiB7DQorICBwYWRkaW5nLWxlZnQ6IDIwcHg7DQorfQ0KKw0KKy5tZXNzYWdlY2hpbGQgew0KKyAgcGFkZGluZy1sZWZ0OiAzNHB4Ow0KK30NCisNCisuZmlsZWJyb3dzZS1hbHQgLmV4cGFuZGVkLCAuZmlsZWJyb3dzZS1hbHQgLmNvbGxhcHNlZCwgLmZpbGVicm93c2UtYWx0IC5sZWFmLCAuZmlsZWJyb3dzZS1hbHQgLmxlYWZub2RlLCAuZXhwYW5kZWR3YXN0ZSwgLmNvbGxhcHNlZHdhc3RlLCAuc29ydHVwLCAuc29ydGRvd24gew0KKyAgLyogaGlkZSBmcm9tIG1hY2llNVwqLw0KKyAgZmxvYXQ6IGxlZnQ7DQorICAvKiByZXN1bWUgKi8NCisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCisgIGhlaWdodDogMTVweDsNCisgIHdpZHRoOiAzNHB4Ow0KKyAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7DQorfQ0KKw0KKy5maWxlYnJvd3NlLWFsdCAubGVhZiwgLmZpbGVicm93c2UtYWx0IC5sZWFmbm9kZSwgLnNvcnR1cCwgLnNvcnRkb3duIHsNCisgIHdpZHRoOiAyMHB4Ow0KK30NCisNCisuZmlsZWJyb3dzZSB1bCwgLmZpbGVicm93c2UtYWx0IHVsIHsNCisgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsNCisgIHBhZGRpbmctbGVmdDogMDsNCisgIG1hcmdpbi1sZWZ0OiAwOw0KK30NCisNCisuZmlsZWJyb3dzZSB1bCB1bCwgLmZpbGVicm93c2UtYWx0IHVsIHVsIHsNCisgIG1hcmdpbi1sZWZ0OiAxLjVlbTsNCisgIG1hcmdpbi10b3A6IDA7DQorICBwYWRkaW5nLXRvcDogLjY3ZW07DQorfQ0KKw0KKy5maWxlYnJvd3NlIGxpLCAuZmlsZWJyb3dzZS1hbHQgbGkgew0KKyAgbWFyZ2luLWJvdHRvbTogLjY3ZW07DQorfQ0KKw0KK3RkLmZpbGVicm93c2UgaDIgew0KKyAgbWFyZ2luLXRvcDogMDsNCit9DQorDQorLmVycm9ybWVzc2FnZSwgLndhcm5pbmdtZXNzYWdlLCAuZG9uZW1lc3NhZ2UsIC5pbmZvbWVzc2FnZSwgLmRvY2luZm8sIC5kaXJpbmZvLCAubWVtYmVyaW5mbywgLnVzZXJncm91cGluZm8gew0KKyAgbWFyZ2luOiAuNjdlbSAwOw0KKyAgcGFkZGluZzogLjMzZW0gMCAuNjdlbSA0MnB4Ow0KKyAgbWluLWhlaWdodDogMzJweDsNCit9DQorDQorLmVycm9ybWFyaywgLndhcm5pbmdtYXJrLCAuZG9uZW1hcmssIC5pbmZvbWFyayB7DQorICBwYWRkaW5nLWxlZnQ6IDIwcHg7DQorICBtaW4taGVpZ2h0OiAxNXB4Ow0KK30NCisNCisuYWx0IHsNCisgIGRpc3BsYXk6IG5vbmU7DQorfQ0KKw0KKyNiYW5uZXIgaDEgew0KKyAgbWFyZ2luOiAwOw0KK30NCisNCisuYXhpYWwgdGgsIC5heGlhbCB0aCAuc3RydXQsICNsZWZ0Q29sdW1uIC5zdHJ1dCB7DQorICB3aWR0aDogMTJlbTsNCit9DQorDQorI2JyZWFkY3J1bWJzIHsNCisgIHBhZGRpbmc6IDJweCA4cHg7DQorfQ0KKw0KKy8qIEJhZCBmb3IgSUUNCisuY29udGVudEJveCBoMiwgLmNvbnRlbnRCb3ggaDMsIC5iYXJzIHsNCisgIGNsZWFyOiBib3RoOw0KK30NCisqLw0KKw0KKy5sZWdlbmQgew0KKyAgZmxvYXQ6IHJpZ2h0Ow0KK30NCisNCisubGVnZW5kIHRoLCAuYmFycyB0aCB7DQorICB0ZXh0LWFsaWduOiByaWdodDsNCisgIHBhZGRpbmctbGVmdDogMWVtOw0KK30NCisNCisuYmFycyB0YWJsZSB7DQorICB0YWJsZS1sYXlvdXQ6IGZpeGVkOw0KK30NCisNCisuYmFycyB0aCB7DQorICB3aWR0aDogMTJlbTsNCit9DQorDQorI3Byb2plY3Rkb2N1bWVudGxpc3QgdGQuZmlsZWJyb3dzZS1hbHQgew0KKyAgcGFkZGluZy1yaWdodDogLjc1ZW07DQorfQ0KKyNvcmdhbml6YXRpb25Mb2dvIGltZywgI3Byb2plY3RMb2dvIGltZywgI3Byb2plY3RMb2dvIHNwYW57DQorICBtYXJnaW46IDhweDsNCit9DQpkaWZmIC0tZ2l0IGEvZG9jL3NhbXBsZXJlcG9ydC9jc3MvbWF2ZW4tdGhlbWUuY3NzIGIvZG9jL3NhbXBsZXJlcG9ydC9jc3MvbWF2ZW4tdGhlbWUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjBiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2Nzcy9tYXZlbi10aGVtZS5jc3MKQEAgLTAsMCArMSwxMjUgQEAKK2JvZHkgew0KKyAgcGFkZGluZzogMHB4IDBweCAxMHB4IDBweDsNCit9DQorYm9keSwgdGQsIHNlbGVjdCwgaW5wdXQsIGxpew0KKyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7DQorICBmb250LXNpemU6IDEzcHg7DQorfQ0KK2NvZGV7DQorICBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlOw0KKyAgZm9udC1zaXplOiAxM3B4Ow0KK30NCithIHsNCisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCit9DQorYTpsaW5rIHsNCisgIGNvbG9yOiMzNmE7DQorfQ0KK2E6dmlzaXRlZCAgew0KKyAgY29sb3I6IzQ3YTsNCit9DQorYTphY3RpdmUsIGE6aG92ZXIgew0KKyAgY29sb3I6IzY5YzsNCit9DQorI2xlZ2VuZCBsaS5leHRlcm5hbExpbmsgew0KKyAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9leHRlcm5hbC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsNCisgIHBhZGRpbmctbGVmdDogMThweDsNCit9DQorYS5leHRlcm5hbExpbmssIGEuZXh0ZXJuYWxMaW5rOmxpbmssIGEuZXh0ZXJuYWxMaW5rOnZpc2l0ZWQsIGEuZXh0ZXJuYWxMaW5rOmFjdGl2ZSwgYS5leHRlcm5hbExpbms6aG92ZXIgew0KKyAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9leHRlcm5hbC5wbmcpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQorICBwYWRkaW5nLXJpZ2h0OiAxOHB4Ow0KK30NCisjbGVnZW5kIGxpLm5ld1dpbmRvdyB7DQorICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL25ld3dpbmRvdy5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDsNCisgIHBhZGRpbmctbGVmdDogMThweDsNCit9DQorYS5uZXdXaW5kb3csIGEubmV3V2luZG93OmxpbmssIGEubmV3V2luZG93OnZpc2l0ZWQsIGEubmV3V2luZG93OmFjdGl2ZSwgYS5uZXdXaW5kb3c6aG92ZXIgew0KKyAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9uZXd3aW5kb3cucG5nKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KKyAgcGFkZGluZy1yaWdodDogMThweDsNCit9DQoraDIgew0KKyAgcGFkZGluZzogNHB4IDRweCA0cHggNnB4Ow0KKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsNCisgIGNvbG9yOiAjOTAwOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsNCisgIGZvbnQtd2VpZ2h0OjkwMDsNCisgIGZvbnQtc2l6ZTogeC1sYXJnZTsNCit9DQoraDMgew0KKyAgcGFkZGluZzogNHB4IDRweCA0cHggNnB4Ow0KKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsNCisgIGNvbG9yOiAjOTAwOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsNCisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQorICBmb250LXNpemU6IGxhcmdlOw0KK30NCitoNCB7DQorICBwYWRkaW5nOiA0cHggNHB4IDRweCA2cHg7DQorICBib3JkZXI6IDFweCBzb2xpZCAjYmJiOw0KKyAgY29sb3I6ICM5MDA7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCisgIGZvbnQtc2l6ZTogbGFyZ2U7DQorfQ0KK2g1IHsNCisgIHBhZGRpbmc6IDRweCA0cHggNHB4IDZweDsNCisgIGNvbG9yOiAjOTAwOw0KKyAgZm9udC1zaXplOiBub3JtYWw7DQorfQ0KK3Agew0KKyAgbGluZS1oZWlnaHQ6IDEuM2VtOw0KKyAgZm9udC1zaXplOiBzbWFsbDsNCit9DQorI2JyZWFkY3J1bWJzIHsNCisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWFhOw0KKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYWE7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOw0KK30NCisjbGVmdENvbHVtbiB7DQorICBtYXJnaW46IDEwcHggMCAwIDVweDsNCisgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7DQorICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOw0KK30NCisjbmF2Y29sdW1uIGg1IHsNCisgIGZvbnQtc2l6ZTogc21hbGxlcjsNCisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhYWFhOw0KKyAgcGFkZGluZy10b3A6IDJweDsNCisgIGNvbG9yOiAjMDAwOw0KK30NCisNCit0YWJsZS5ib2R5VGFibGUgdGggew0KKyAgY29sb3I6IHdoaXRlOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2JiYjsNCisgIHRleHQtYWxpZ246IGxlZnQ7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQorDQordGFibGUuYm9keVRhYmxlIHRoLCB0YWJsZS5ib2R5VGFibGUgdGQgew0KKyAgZm9udC1zaXplOiAxZW07DQorfQ0KKw0KK3RhYmxlLmJvZHlUYWJsZSB0ci5hIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7DQorfQ0KKw0KK3RhYmxlLmJvZHlUYWJsZSB0ci5iIHsNCisgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7DQorfQ0KKw0KKy5zb3VyY2Ugew0KKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsNCit9DQorZGwgew0KKyAgcGFkZGluZzogNHB4IDRweCA0cHggNnB4Ow0KKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsNCisgIGJhY2tncm91bmQtY29sb3I6ICNmZmM7DQorfQ0KK2R0IHsNCisgIGNvbG9yOiAjOTAwOw0KK30NCisjb3JnYW5pemF0aW9uTG9nbyBpbWcsICNwcm9qZWN0TG9nbyBpbWcsICNwcm9qZWN0TG9nbyBzcGFuew0KKyAgbWFyZ2luOiA4cHg7DQorfQ0KKyNiYW5uZXIgew0KKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmY7DQorfQ0KZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvY3NzL3ByaW50LmNzcyBiL2RvYy9zYW1wbGVyZXBvcnQvY3NzL3ByaW50LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFkN2YwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9jc3MvcHJpbnQuY3NzCkBAIC0wLDAgKzEsNyBAQAorI2Jhbm5lciwgI2Zvb3RlciwgI2xlZnRjb2wsICNicmVhZGNydW1icywgLmRvY3MgI3RvYywgLmRvY3MgLmNvdXJ0ZXN5bGlua3MsICNsZWZ0Q29sdW1uLCAjbmF2Q29sdW1uIHsNCisJZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KK30NCisjYm9keUNvbHVtbiwgYm9keS5kb2NzIGRpdi5kb2NzIHsNCisJbWFyZ2luOiAwICFpbXBvcnRhbnQ7DQorCWJvcmRlcjogbm9uZSAhaW1wb3J0YW50DQorfQ0KZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2FkZC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9hZGQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGJkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9hZGQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2NvbGxhcHNlZC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9jb2xsYXBzZWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzEwODQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9jb2xsYXBzZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4cGFuZGVkLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4cGFuZGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVmM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZXhwYW5kZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4dGVybmFsLWNsYXNzaWMucG5nIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZXh0ZXJuYWwtY2xhc3NpYy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhNTQyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4dGVybmFsLWNsYXNzaWMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4dGVybmFsLnBuZyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2V4dGVybmFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk5OWZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZXh0ZXJuYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZpbGUuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjMTNjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZpeC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9maXguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODVmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9maXguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZvbGRlci1jbG9zZWQuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZm9sZGVyLWNsb3NlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhZWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZvbGRlci1jbG9zZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZvbGRlci1vcGVuLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ZvbGRlci1vcGVuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU1ZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvZm9sZGVyLW9wZW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2hlbHBfbG9nby5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9oZWxwX2xvZ28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjVjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9oZWxwX2xvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYWxlcnQuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hbGVydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2OGJjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYWxlcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYWxlcnRzbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hbGVydHNtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxMzA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYWxlcnRzbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXIxX3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyMV9zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDA4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyMV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXIyX3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyMl9zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTdlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyMl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXJjbG9zZWQxX3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyY2xvc2VkMV9zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OGU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2Fycm93Zm9sZGVyY2xvc2VkMV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXJvcGVuMl9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd2ZvbGRlcm9wZW4yX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3ZTMyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dmb2xkZXJvcGVuMl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dtZW1iZXJzMV9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd21lbWJlcnMxX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dtZW1iZXJzMV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dtZW1iZXJzMl9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd21lbWJlcnMyX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3NDM1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3dtZW1iZXJzMl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d1c2VyZ3JvdXBzMV9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd3VzZXJncm91cHMxX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3Nzk1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d1c2VyZ3JvdXBzMV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d1c2VyZ3JvdXBzMl9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd3VzZXJncm91cHMyX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0YmI0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d1c2VyZ3JvdXBzMl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTFfc21sLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTFfc21sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQ3NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd3dhc3RlMV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTJfc21sLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fYXJyb3d3YXN0ZTJfc21sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRiZjQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9hcnJvd3dhc3RlMl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fY29uZmlybXNtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2NvbmZpcm1zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2M4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2NvbmZpcm1zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZG9jX2xyZy5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2RvY19scmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTgyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2RvY19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZG9jX3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2RvY19zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWJmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2RvY19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZXJyb3JfbHJnLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZXJyb3JfbHJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NmZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9lcnJvcl9scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZXJyb3Jfc21sLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZXJyb3Jfc21sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTEzMmVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9lcnJvcl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZm9sZGVyX2xyZy5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2ZvbGRlcl9scmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODNlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2ZvbGRlcl9scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fZm9sZGVyX3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2ZvbGRlcl9zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjZmODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2ZvbGRlcl9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faGVscF9scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9oZWxwX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxNjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faGVscF9scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faGVscF9zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9oZWxwX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faGVscF9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faW5mb19scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9pbmZvX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5MGZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faW5mb19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faW5mb19zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9pbmZvX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjYjlhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faW5mb19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25faW5mb3NtbC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2luZm9zbWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9pY29uX2luZm9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fbWVtYmVyc19scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9tZW1iZXJzX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMmRmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fbWVtYmVyc19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fbWVtYmVyc19zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9tZW1iZXJzX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3ZTY5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fbWVtYmVyc19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydGRvd24uZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zb3J0ZG93bi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MWJiZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydGRvd24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydGxlZnQuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zb3J0bGVmdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkMjFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydGxlZnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydHJpZ2h0LmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydHJpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTgwNzZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zb3J0cmlnaHQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydHVwLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc29ydHVwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk0MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zb3J0dXAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc3VjY2Vzc19scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zdWNjZXNzX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMzE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc3VjY2Vzc19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc3VjY2Vzc19zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl9zdWNjZXNzX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlODVhNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fc3VjY2Vzc19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fdXNlcmdyb3Vwc19scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl91c2VyZ3JvdXBzX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0ZTM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fdXNlcmdyb3Vwc19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fdXNlcmdyb3Vwc19zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl91c2VyZ3JvdXBzX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzNjEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fdXNlcmdyb3Vwc19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FybmluZ19scmcuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl93YXJuaW5nX2xyZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNTlkOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FybmluZ19scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FybmluZ19zbWwuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl93YXJuaW5nX3NtbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczYmJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FybmluZ19zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FzdGVfbHJnLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FzdGVfbHJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQzNGFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl93YXN0ZV9scmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FzdGVfc21sLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2ljb25fd2FzdGVfc21sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQwNDZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvaWNvbl93YXN0ZV9zbWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2xvZ29zL21hdmVuLWZlYXRoZXIucG5nIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbG9nb3MvbWF2ZW4tZmVhdGhlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlYWMxNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL2xvZ29zL21hdmVuLWZlYXRoZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL25ld3dpbmRvdy1jbGFzc2ljLnBuZyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL25ld3dpbmRvdy1jbGFzc2ljLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg3MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbmV3d2luZG93LWNsYXNzaWMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL25ld3dpbmRvdy5wbmcgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9uZXd3aW5kb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODdmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9uZXd3aW5kb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL25vbmUucG5nIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbm9uZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmNmQxOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL25vbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21hai5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tYWouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjI5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tYWouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21hal9oaS5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tYWpfaGkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzM5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tYWpfaGkuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21hal9yb25kLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21hal9yb25kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ0MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbndfbWFqX3JvbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21lZC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tZWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjZkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21lZF9oaS5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tZWRfaGkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmRiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19tZWRfaGkuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21lZF9yb25kLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21lZF9yb25kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFhNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbndfbWVkX3JvbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21pbi5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19taW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGJjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19taW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21pbl8wMzYuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvbndfbWluXzAzNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNDRhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21pbl8wMzYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL253X21pbl9oaS5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19taW5faGkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTMwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9ud19taW5faGkuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3BkZi5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9wZGYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2UzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9wZGYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3Bvd2VyZWRieV8wMzYuZ2lmIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvcG93ZXJlZGJ5XzAzNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMDM0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3Bvd2VyZWRieV8wMzYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3Byb2R1Y3RfbG9nby5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9wcm9kdWN0X2xvZ28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2I4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9wcm9kdWN0X2xvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3JlbW92ZS5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9yZW1vdmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGIyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9yZW1vdmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3NlX21hal9yb25kLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3NlX21hal9yb25kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI1MTBlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvc2VfbWFqX3JvbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N0cmljaC5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9zdHJpY2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzM2U3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9zdHJpY2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N3X21hal9yb25kLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N3X21hal9yb25kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBiZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvc3dfbWFqX3JvbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N3X21lZF9yb25kLmdpZiBiL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N3X21lZF9yb25kLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjcxYzNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbWFnZXMvc3dfbWVkX3JvbmQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3N3X21pbi5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9zd19taW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjM2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy9zd19taW4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW1hZ2VzL3VwZGF0ZS5naWYgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy91cGRhdGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2EyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2FtcGxlcmVwb3J0L2ltYWdlcy91cGRhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9zYW1wbGVyZXBvcnQvaW5kZXguaHRtbCBiL2RvYy9zYW1wbGVyZXBvcnQvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWViNGYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NhbXBsZXJlcG9ydC9pbmRleC5odG1sCkBAIC0wLDAgKzEsODcgQEAKKw0KKw0KKw0KKw0KKw0KKw0KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCis8aHRtbD4NCisgIDxoZWFkPg0KKyAgICA8dGl0bGU+PC90aXRsZT4NCisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIj4NCisgICAgICBAaW1wb3J0IHVybCgiLi9jc3MvbWF2ZW4tYmFzZS5jc3MiKTsNCisgICAgICBAaW1wb3J0IHVybCgiLi9jc3MvbWF2ZW4tdGhlbWUuY3NzIik7DQorICAgICAgQGltcG9ydCB1cmwoIi4vY3NzL3NpdGUuY3NzIik7DQorICAgIDwvc3R5bGU+DQorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi9jc3MvcHJpbnQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InByaW50IiAvPg0KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4NCisgIDwvaGVhZD4NCisgIDxib2R5IGNsYXNzPSJjb21wb3NpdGUiPg0KKyAgICA8ZGl2IGlkPSJiYW5uZXIiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImJhbm5lckxlZnQiPg0KKyAgICANCisgICAgICAgICAgICBDb3JlIExpYnJhcnkNCisgICAgDQorICAgICAgICAgICAgPC9zcGFuPg0KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXIiPg0KKyAgICAgICAgPGhyLz4NCisgICAgICA8L2Rpdj4NCisgICAgPC9kaXY+DQorICAgIDxkaXYgaWQ9ImJyZWFkY3J1bWJzIj4NCisgICAgICA8ZGl2IGNsYXNzPSJ4bGVmdCI+TGFzdCBQdWJsaXNoZWQ6IFR1ZSBKYW4gMjQgMjI6NDA6NDkgRVNUIDIwMDY8L2Rpdj4NCisgICAgICA8ZGl2IGNsYXNzPSJ4cmlnaHQiPiAgICAgIDxhIGhyZWY9Imh0dHA6Ly90YWNvcy5zb3VyY2Vmb3JnZS5uZXQiPkNvcmUgTGlicmFyeTwvYT4NCisgICAgICA8L2Rpdj4NCisgICAgICA8ZGl2IGNsYXNzPSJjbGVhciI+DQorICAgICAgICA8aHIvPg0KKyAgICAgIDwvZGl2Pg0KKyAgICA8L2Rpdj4NCisgICAgPGRpdiBpZD0ibGVmdENvbHVtbiI+PGRpdiBpZD0ibmF2Y29sdW1uIj4gICAgICA8aDU+UHJvamVjdCBEb2N1bWVudGF0aW9uPC9oNT4NCisgICAgPHVsPg0KKyAgICAgICAgICAgICAgDQorICAgICAgICA8bGkgY2xhc3M9ImNvbGxhcHNlZCI+DQorICAgICAgICAgIDx1bD4NCisgICAgICAgICAgICAgICAgICANCisgICAgPGxpIGNsYXNzPSJub25lIj4NCisgICAgICAgICAgPHN0cm9uZz48YSBocmVmPSJzdXJlZmlyZS1yZXBvcnQuaHRtbCI+TWF2ZW4gU3VyZWZpcmUgUmVwb3J0PC9hPjwvc3Ryb25nPg0KKyAgICAgICAgPC9saT4NCisgICAgICAgICAgICAgIDwvdWw+DQorICAgICAgICA8L2xpPg0KKyAgICAgICAgICA8L3VsPg0KKyAgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIiB0aXRsZT0iQnVpbHQgYnkgTWF2ZW4iIGlkPSJwb3dlcmVkQnkiPg0KKyAgICAgICAgICAgICAgPGltZyBhbHQ9IkJ1aWx0IGJ5IE1hdmVuIiBzcmM9Ii4vaW1hZ2VzL2xvZ29zL21hdmVuLWZlYXRoZXIucG5nIj48L2ltZz4NCisgICAgICAgICAgICA8L2E+DQorICAgIDwvZGl2PjwvZGl2Pg0KKyAgICA8ZGl2IGlkPSJib2R5Q29sdW1uIj4NCisgICAgICA8ZGl2IGlkPSJjb250ZW50Qm94Ij4NCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK2Z1bmN0aW9uIHRvZ2dsZURpc3BsYXkoZWxlbWVudElkKSB7CisgdmFyIGVsbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCArICdlcnJvcicpOworIGlmIChlbG0gJiYgdHlwZW9mIGVsbS5zdHlsZSAhPSAidW5kZWZpbmVkIikgeworIGlmIChlbG0uc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpIHsKKyBlbG0uc3R5bGUuZGlzcGxheSA9ICIiOworIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCArICdvZmYnKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCArICdvbicpLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKKyB9IGVsc2UgaWYgKGVsbS5zdHlsZS5kaXNwbGF5ID09ICIiKSB7IGVsbS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCArICdvZmYnKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CisgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkICsgJ29uJykuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKyB9IAorIH0gCisgfQorPC9zY3JpcHQ+PGgyPjxhIG5hbWU9IlN1bW1hcnkiPjwvYT5TdW1tYXJ5PC9oMj48ZGl2IGNsYXNzPSJzZWN0aW9uIj5bPGEgaHJlZj0iI1N1bW1hcnkiPlN1bW1hcnk8L2E+XVs8YSBocmVmPSIjUGFja2FnZV9MaXN0Ij5QYWNrYWdlIExpc3Q8L2E+XVs8YSBocmVmPSIjVGVzdF9DYXNlcyI+VGVzdCBDYXNlczwvYT5dPC9kaXY+PHRhYmxlIGNsYXNzPSJib2R5VGFibGUiPjx0ciBjbGFzcz0iYSI+PC90cj48dHIgY2xhc3M9ImIiPjwvdHI+PC90YWJsZT48dGFibGUgY2xhc3M9ImJvZHlUYWJsZSI+PHRyIGNsYXNzPSJhIj48dGg+VGVzdHM8L3RoPjx0aD5FcnJvcnMgPC90aD48dGg+RmFpbHVyZXM8L3RoPjx0aD5TdWNjZXNzIFJhdGU8L3RoPjx0aD5UaW1lPC90aD48L3RyPjx0ciBjbGFzcz0iYiI+PHRkPjc8L3RkPjx0ZD4wPC90ZD48dGQ+MTwvdGQ+PHRkPjg1LjcxNCU8L3RkPjx0ZD4xOTAuMDcyPC90ZD48L3RyPjwvdGFibGU+PGJyIC8+Tm90ZTogZmFpbHVyZXMgYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgZXJyb3JzIGFyZSB1bmFudGljaXBhdGVkLjx0YWJsZSBjbGFzcz0iYm9keVRhYmxlIj48dHIgY2xhc3M9ImEiPjwvdHI+PHRyIGNsYXNzPSJiIj48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9IlBhY2thZ2VfTGlzdCI+PC9hPlBhY2thZ2UgTGlzdDwvaDI+PGRpdiBjbGFzcz0ic2VjdGlvbiI+WzxhIGhyZWY9IiNTdW1tYXJ5Ij5TdW1tYXJ5PC9hPl1bPGEgaHJlZj0iI1BhY2thZ2VfTGlzdCI+UGFja2FnZSBMaXN0PC9hPl1bPGEgaHJlZj0iI1Rlc3RfQ2FzZXMiPlRlc3QgQ2FzZXM8L2E+XTwvZGl2Pjx0YWJsZSBjbGFzcz0iYm9keVRhYmxlIj48dHIgY2xhc3M9ImEiPjwvdHI+PHRyIGNsYXNzPSJiIj48L3RyPjwvdGFibGU+PHRhYmxlIGNsYXNzPSJib2R5VGFibGUiPjx0ciBjbGFzcz0iYSI+PHRoPlBhY2thZ2U8L3RoPjx0aD5UZXN0czwvdGg+PHRoPkVycm9ycyA8L3RoPjx0aD5GYWlsdXJlczwvdGg+PHRoPlN1Y2Nlc3MgUmF0ZTwvdGg+PHRoPlRpbWU8L3RoPjwvdHI+PHRyIGNsYXNzPSJiIj48dGQ+PGEgaHJlZj0iI1Rlc3RORyBTdWl0ZSI+VGVzdE5HIFN1aXRlPC9hPjwvdGQ+PHRkPjc8L3RkPjx0ZD4wPC90ZD48dGQ+MTwvdGQ+PHRkPjg1LjcxNCU8L3RkPjx0ZD4xOTAuMDcyPC90ZD48L3RyPjwvdGFibGU+PGJyIC8+Tm90ZTogcGFja2FnZSBzdGF0aXN0aWNzIGFyZSBub3QgY29tcHV0ZWQgcmVjdXJzaXZlbHksIHRoZXkgb25seSBzdW0gdXAgYWxsIG9mIGl0cyB0ZXN0c3VpdGVzIG51bWJlcnMuPGgzPjxhIG5hbWU9IlRlc3RORyBTdWl0ZSI+PC9hPlRlc3RORyBTdWl0ZTwvaDM+PHRhYmxlIGNsYXNzPSJib2R5VGFibGUiPjx0ciBjbGFzcz0iYSI+PHRoPjwvdGg+PHRoPkNsYXNzPC90aD48dGg+VGVzdHM8L3RoPjx0aD5FcnJvcnMgPC90aD48dGg+RmFpbHVyZXM8L3RoPjx0aD5TdWNjZXNzIFJhdGU8L3RoPjx0aD5UaW1lPC90aD48L3RyPjx0ciBjbGFzcz0iYiI+PHRkPjxhIGhyZWY9IiNUZXN0TkcgU3VpdGVUZXN0TkcgU3VpdGUiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbl93YXJuaW5nX3NtbC5naWYiIC8+PC9hPjwvdGQ+PHRkPjxhIGhyZWY9IiNUZXN0TkcgU3VpdGVUZXN0TkcgU3VpdGUiPlRlc3RORyBTdWl0ZTwvYT48L3RkPjx0ZD43PC90ZD48dGQ+MDwvdGQ+PHRkPjE8L3RkPjx0ZD44NS43MTQlPC90ZD48dGQ+MTkwLjA3MjwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSBjbGFzcz0iYm9keVRhYmxlIj48dHIgY2xhc3M9ImEiPjwvdHI+PHRyIGNsYXNzPSJiIj48L3RyPjwvdGFibGU+PGgyPjxhIG5hbWU9IlRlc3RfQ2FzZXMiPjwvYT5UZXN0IENhc2VzPC9oMj48ZGl2IGNsYXNzPSJzZWN0aW9uIj5bPGEgaHJlZj0iI1N1bW1hcnkiPlN1bW1hcnk8L2E+XVs8YSBocmVmPSIjUGFja2FnZV9MaXN0Ij5QYWNrYWdlIExpc3Q8L2E+XVs8YSBocmVmPSIjVGVzdF9DYXNlcyI+VGVzdCBDYXNlczwvYT5dPC9kaXY+PGgzPjxhIG5hbWU9IlRlc3RORyBTdWl0ZVRlc3RORyBTdWl0ZSI+PC9hPlRlc3RORyBTdWl0ZTwvaDM+PHRhYmxlIGNsYXNzPSJib2R5VGFibGUiPjx0ciBjbGFzcz0iYSI+PHRkPjxhIGhyZWY9IiNUZXN0TkcgU3VpdGUuVGVzdE5HIFN1aXRlLm5ldC5zZi50YWNvcy5hamF4LmNvbXBvbmVudHMuRGlhbG9nVGVzdCN0ZXN0Q2xpY2tEaWFsb2ciPjxpbWcgc3JjPSJpbWFnZXMvaWNvbl9lcnJvcl9zbWwuZ2lmIiAvPjwvYT48L3RkPjx0ZD5uZXQuc2YudGFjb3MuYWpheC5jb21wb25lbnRzLkRpYWxvZ1Rlc3QjdGVzdENsaWNrRGlhbG9nICA8ZGl2IGNsYXNzPSJkZXRhaWxUb2dnbGUiIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+PGEgaHJlZj0iamF2YXNjcmlwdDp0b2dnbGVEaXNwbGF5KCduZXQuc2YudGFjb3MuYWpheC5jb21wb25lbnRzLkRpYWxvZ1Rlc3QjdGVzdENsaWNrRGlhbG9nJyk7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lOyIgaWQ9Im5ldC5zZi50YWNvcy5hamF4LmNvbXBvbmVudHMuRGlhbG9nVGVzdCN0ZXN0Q2xpY2tEaWFsb2dvZmYiPis8L3NwYW4+PHNwYW4gaWQ9Im5ldC5zZi50YWNvcy5hamF4LmNvbXBvbmVudHMuRGlhbG9nVGVzdCN0ZXN0Q2xpY2tEaWFsb2dvbiIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4tPC9zcGFuPiBbIERldGFpbCBdPC9hPjwvZGl2PjwvdGQ+PHRkPjE4OS4xNzQ8L3RkPjwvdHI+PHRyIGNsYXNzPSJiIj48dGQ+PC90ZD48dGQ+Q29ubmVjdGlvbiB0aW1lZCBvdXQ8L3RkPjx0ZD48L3RkPjwvdHI+PHRyIGNsYXNzPSJhIj48dGQ+PC90ZD48dGQ+ICA8ZGl2IGlkPSJuZXQuc2YudGFjb3MuYWpheC5jb21wb25lbnRzLkRpYWxvZ1Rlc3QjdGVzdENsaWNrRGlhbG9nZXJyb3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5qYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOiBDb25uZWN0aW9uIHRpbWVkIG91dDxiciAvPmF0IGphdmEubmV0LlBsYWluU29ja2V0SW1wbC5zb2NrZXRDb25uZWN0KE5hdGl2ZSBNZXRob2QpPGJyIC8+YXQgamF2YS5uZXQuUGxhaW5Tb2NrZXRJbXBsLmRvQ29ubmVjdChQbGFpblNvY2tldEltcGwuamF2YTozNzIpPGJyIC8+YXQgamF2YS5uZXQuUGxhaW5Tb2NrZXRJbXBsLmNvbm5lY3RUb0FkZHJlc3MoUGxhaW5Tb2NrZXRJbXBsLmphdmE6MjMzKTxiciAvPmF0IGphdmEubmV0LlBsYWluU29ja2V0SW1wbC5jb25uZWN0KFBsYWluU29ja2V0SW1wbC5qYXZhOjIyMCk8YnIgLz5hdCBqYXZhLm5ldC5Tb2Nrc1NvY2tldEltcGwuY29ubmVjdChTb2Nrc1NvY2tldEltcGwuamF2YTozNzgpPGJyIC8+YXQgamF2YS5uZXQuU29ja2V0LmNvbm5lY3QoU29ja2V0LmphdmE6NTM2KTxiciAvPmF0IGphdmEubmV0LlNvY2tldC5jb25uZWN0KFNvY2tldC5qYXZhOjQ4Nik8YnIgLz5hdCBqYXZhLm5ldC5Tb2NrZXQuPGluaXQ+KFNvY2tldC5qYXZhOjM5NCk8YnIgLz5hdCBqYXZhLm5ldC5Tb2NrZXQuPGluaXQ+KFNvY2tldC5qYXZhOjI2Nyk8YnIgLz5hdCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wcm90b2NvbC5EZWZhdWx0UHJvdG9jb2xTb2NrZXRGYWN0b3J5LmNyZWF0ZVNvY2tldChEZWZhdWx0UHJvdG9jb2xTb2NrZXRGYWN0b3J5LmphdmE6NzkpPGJyIC8+YXQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucHJvdG9jb2wuRGVmYXVsdFByb3RvY29sU29ja2V0RmFjdG9yeS5jcmVhdGVTb2NrZXQoRGVmYXVsdFByb3RvY29sU29ja2V0RmFjdG9yeS5qYXZhOjEyMSk8YnIgLz5hdCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ29ubmVjdGlvbi5vcGVuKEh0dHBDb25uZWN0aW9uLmphdmE6NzA0KTxiciAvPmF0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2REaXJlY3Rvci5leGVjdXRlV2l0aFJldHJ5KEh0dHBNZXRob2REaXJlY3Rvci5qYXZhOjM4NCk8YnIgLz5hdCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kRGlyZWN0b3IuZXhlY3V0ZU1ldGhvZChIdHRwTWV0aG9kRGlyZWN0b3IuamF2YToxNzApPGJyIC8+YXQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudC5leGVjdXRlTWV0aG9kKEh0dHBDbGllbnQuamF2YTozOTYpPGJyIC8+YXQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudC5leGVjdXRlTWV0aG9kKEh0dHBDbGllbnQuamF2YTozMjQpPGJyIC8+YXQgY29tLmdhcmdveWxlc29mdHdhcmUuaHRtbHVuaXQuSHR0cFdlYkNvbm5lY3Rpb24uZ2V0UmVzcG9uc2UoSHR0cFdlYkNvbm5lY3Rpb24uamF2YToxMzkpPGJyIC8+YXQgY29tLmdhcmdveWxlc29mdHdhcmUuaHRtbHVuaXQuV2ViQ2xpZW50LmxvYWRXZWJSZXNwb25zZShXZWJDbGllbnQuamF2YToxNTIzKTxiciAvPmF0IGNvbS5nYXJnb3lsZXNvZnR3YXJlLmh0bWx1bml0LldlYkNsaWVudC5nZXRQYWdlKFdlYkNsaWVudC5qYXZhOjMyNSk8YnIgLz5hdCBjb20uZ2FyZ295bGVzb2Z0d2FyZS5odG1sdW5pdC5XZWJDbGllbnQuZ2V0UGFnZShXZWJDbGllbnQuamF2YTozNzcpPGJyIC8+YXQgbmV0LnNmLnRhY29zLmFqYXguY29tcG9uZW50cy5EaWFsb2dUZXN0LnRlc3RDbGlja0RpYWxvZyhEaWFsb2dUZXN0LmphdmE6NTApPGJyIC8+YXQgc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1ldGhvZCk8YnIgLz5hdCBzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKE5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjY0KTxiciAvPmF0IHN1bi5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKERlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YTo0Myk8YnIgLz5hdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjYxNSk8YnIgLz5hdCBvcmcudGVzdG5nLmludGVybmFsLk1ldGhvZEhlbHBlci5pbnZva2VNZXRob2QoTWV0aG9kSGVscGVyLmphdmE6NDYxKTxiciAvPmF0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSW52b2tlci5pbnZva2VNZXRob2QoSW52b2tlci5qYXZhOjM3OCk8YnIgLz5hdCBvcmcudGVzdG5nLmludGVybmFsLkludm9rZXIuaW52b2tlVGVzdE1ldGhvZHMoSW52b2tlci5qYXZhOjU4MCk8YnIgLz5hdCBvcmcudGVzdG5nLmludGVybmFsLlRlc3RNZXRob2RXb3JrZXIucnVuKFRlc3RNZXRob2RXb3JrZXIuamF2YTo4OSk8YnIgLz5hdCBvcmcudGVzdG5nLlRlc3RSdW5uZXIucHJpdmF0ZVJ1bihUZXN0UnVubmVyLmphdmE6NjEyKTxiciAvPmF0IG9yZy50ZXN0bmcuVGVzdFJ1bm5lci5ydW4oVGVzdFJ1bm5lci5qYXZhOjUwMyk8YnIgLz5hdCBvcmcudGVzdG5nLlN1aXRlUnVubmVyLnByaXZhdGVSdW4oU3VpdGVSdW5uZXIuamF2YToyMTgpPGJyIC8+YXQgb3JnLnRlc3RuZy5TdWl0ZVJ1bm5lci5ydW4oU3VpdGVSdW5uZXIuamF2YToxNDQpPGJyIC8+YXQgb3JnLnRlc3RuZy5UZXN0TkcuY3JlYXRlQW5kUnVuU3VpdGVSdW5uZXJzKFRlc3RORy5qYXZhOjU3Nik8YnIgLz5hdCBvcmcudGVzdG5nLlRlc3RORy5ydW5TdWl0ZXNMb2NhbGx5KFRlc3RORy5qYXZhOjUzOSk8YnIgLz5hdCBvcmcuYXBhY2hlLm1hdmVuLnN1cmVmaXJlLlN1cmVmaXJlLnJ1bihTdXJlZmlyZS5qYXZhOjIzNik8YnIgLz5hdCBvcmcuYXBhY2hlLm1hdmVuLnN1cmVmaXJlLlN1cmVmaXJlLnJ1bihTdXJlZmlyZS5qYXZhOjEyOCk8YnIgLz5hdCBzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlMChOYXRpdmUgTWV0aG9kKTxiciAvPmF0IHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NjQpPGJyIC8+YXQgc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjQzKTxiciAvPmF0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTWV0aG9kLmphdmE6NjE1KTxiciAvPmF0IG9yZy5hcGFjaGUubWF2ZW4uc3VyZWZpcmUuU3VyZWZpcmVCb290ZXIucnVuVGVzdHNJblByb2Nlc3MoU3VyZWZpcmVCb290ZXIuamF2YTozNDUpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5zdXJlZmlyZS5TdXJlZmlyZUJvb3Rlci5ydW4oU3VyZWZpcmVCb290ZXIuamF2YToyNTgpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi50ZXN0LlN1cmVmaXJlUGx1Z2luLmV4ZWN1dGUoU3VyZWZpcmVQbHVnaW4uamF2YTo0NzcpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uRGVmYXVsdFBsdWdpbk1hbmFnZXIuZXhlY3V0ZU1vam8oRGVmYXVsdFBsdWdpbk1hbmFnZXIuamF2YTo0MTUpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVHb2FscyhEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTo1MzEpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVHb2FsV2l0aExpZmVjeWNsZShEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTo0NzIpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmZvcmtQcm9qZWN0TGlmZWN5Y2xlKERlZmF1bHRMaWZlY3ljbGVFeGVjdXRvci5qYXZhOjg1OSk8YnIgLz5hdCBvcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5EZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuZm9ya0xpZmVjeWNsZShEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTo3MzEpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVHb2FscyhEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTo1MjIpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVHb2FsV2l0aExpZmVjeWNsZShEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTo0NzIpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVHb2FsKERlZmF1bHRMaWZlY3ljbGVFeGVjdXRvci5qYXZhOjQ1MSk8YnIgLz5hdCBvcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5EZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuZXhlY3V0ZUdvYWxBbmRIYW5kbGVGYWlsdXJlcyhEZWZhdWx0TGlmZWN5Y2xlRXhlY3V0b3IuamF2YTozMDMpPGJyIC8+YXQgb3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUuRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmV4ZWN1dGVUYXNrU2VnbWVudHMoRGVmYXVsdExpZmVjeWNsZUV4ZWN1dG9yLmphdmE6MjcwKTxiciAvPmF0IG9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLkRlZmF1bHRMaWZlY3ljbGVFeGVjdXRvci5leGVjdXRlKERlZmF1bHRMaWZlY3ljbGVFeGVjdXRvci5qYXZhOjEzOSk8YnIgLz5hdCBvcmcuYXBhY2hlLm1hdmVuLkRlZmF1bHRNYXZlbi5kb0V4ZWN1dGUoRGVmYXVsdE1hdmVuLmphdmE6MzIyKTxiciAvPmF0IG9yZy5hcGFjaGUubWF2ZW4uRGVmYXVsdE1hdmVuLmV4ZWN1dGUoRGVmYXVsdE1hdmVuLmphdmE6MTE1KTxiciAvPmF0IG9yZy5hcGFjaGUubWF2ZW4uY2xpLk1hdmVuQ2xpLm1haW4oTWF2ZW5DbGkuamF2YToyNDkpPGJyIC8+YXQgc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1ldGhvZCk8YnIgLz5hdCBzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKE5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjY0KTxiciAvPmF0IHN1bi5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKERlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YTo0Myk8YnIgLz5hdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjYxNSk8YnIgLz5hdCBvcmcuY29kZWhhdXMuY2xhc3N3b3JsZHMuTGF1bmNoZXIubGF1bmNoRW5oYW5jZWQoTGF1bmNoZXIuamF2YTozMTUpPGJyIC8+YXQgb3JnLmNvZGVoYXVzLmNsYXNzd29ybGRzLkxhdW5jaGVyLmxhdW5jaChMYXVuY2hlci5qYXZhOjI1NSk8YnIgLz5hdCBvcmcuY29kZWhhdXMuY2xhc3N3b3JsZHMuTGF1bmNoZXIubWFpbldpdGhFeGl0Q29kZShMYXVuY2hlci5qYXZhOjQzMCk8YnIgLz5hdCBvcmcuY29kZWhhdXMuY2xhc3N3b3JsZHMuTGF1bmNoZXIubWFpbihMYXVuY2hlci5qYXZhOjM3NSk8YnIgLz48L2Rpdj48L3RkPjx0ZD48L3RkPjwvdHI+PHRyIGNsYXNzPSJiIj48dGQ+PGltZyBzcmM9ImltYWdlcy9pY29uX3N1Y2Nlc3Nfc21sLmdpZiIgLz48L3RkPjx0ZD5uZXQuc2YudGFjb3Muc2VydmljZXMuU2l0ZU1hcFRlc3QjdGVzdEluaXRpYWxpemU8L3RkPjx0ZD4wLjAwNjwvdGQ+PC90cj48dHIgY2xhc3M9ImEiPjx0ZD48aW1nIHNyYz0iaW1hZ2VzL2ljb25fc3VjY2Vzc19zbWwuZ2lmIiAvPjwvdGQ+PHRkPm5ldC5zZi50YWNvcy5zZXJ2aWNlcy5TaXRlTWFwVGVzdCN0ZXN0Q2F0ZWdvcnk8L3RkPjx0ZD4wLjU2OTwvdGQ+PC90cj48dHIgY2xhc3M9ImIiPjx0ZD48aW1nIHNyYz0iaW1hZ2VzL2ljb25fc3VjY2Vzc19zbWwuZ2lmIiAvPjwvdGQ+PHRkPm5ldC5zZi50YWNvcy5zZXJ2aWNlcy5TaXRlTWFwVGVzdCN0ZXN0Q29udGFpbnM8L3RkPjx0ZD4wLjEzODwvdGQ+PC90cj48dHIgY2xhc3M9ImEiPjx0ZD48aW1nIHNyYz0iaW1hZ2VzL2ljb25fc3VjY2Vzc19zbWwuZ2lmIiAvPjwvdGQ+PHRkPm5ldC5zZi50YWNvcy5zZXJ2aWNlcy5TaXRlTWFwVGVzdCN0ZXN0U2l0ZW1hcFhtbDE8L3RkPjx0ZD4wLjA1PC90ZD48L3RyPjx0ciBjbGFzcz0iYiI+PHRkPjxpbWcgc3JjPSJpbWFnZXMvaWNvbl9zdWNjZXNzX3NtbC5naWYiIC8+PC90ZD48dGQ+bmV0LnNmLnRhY29zLnNlcnZpY2VzLlNpdGVNYXBUZXN0I3Rlc3RDYXRlZ29yeUxpc3RzPC90ZD48dGQ+MC4xMTc8L3RkPjwvdHI+PHRyIGNsYXNzPSJhIj48dGQ+PGltZyBzcmM9ImltYWdlcy9pY29uX3N1Y2Nlc3Nfc21sLmdpZiIgLz48L3RkPjx0ZD5uZXQuc2YudGFjb3Muc2VydmljZXMuU2l0ZU1hcFRlc3QjdGVzdFVuc2V0UmVzb3VyY2U8L3RkPjx0ZD4wPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGNsYXNzPSJib2R5VGFibGUiPjx0ciBjbGFzcz0iYiI+PC90cj48dHIgY2xhc3M9ImEiPjwvdHI+PC90YWJsZT48dGFibGUgY2xhc3M9ImJvZHlUYWJsZSI+PHRyIGNsYXNzPSJiIj48L3RyPjx0ciBjbGFzcz0iYSI+PC90cj48L3RhYmxlPg0KKyAgICAgIDwvZGl2Pg0KKyAgICA8L2Rpdj4NCisgICAgPGRpdiBjbGFzcz0iY2xlYXIiPg0KKyAgICAgIDxoci8+DQorICAgIDwvZGl2Pg0KKyAgICA8ZGl2IGlkPSJmb290ZXIiPg0KKyAgICAgIDxkaXYgY2xhc3M9InhyaWdodCI+JiMxNjk7ICANCisgICAgICAgICAgMjAwMS0yMDA2DQorICAgIA0KKyAgICAgICAgICBTb3VyY2Vmb3JnZQ0KKyAgICAgIDwvZGl2Pg0KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyIj4NCisgICAgICAgIDxoci8+DQorICAgICAgPC9kaXY+DQorICAgIDwvZGl2Pg0KKyAgPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvc2VsZW5pdW0uaHRtbCBiL2RvYy9zZWxlbml1bS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGM0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc2VsZW5pdW0uaHRtbApAQCAtMCwwICsxLDI3NiBAQAorCisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+VGVzdE5HPC90aXRsZT4KKworICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRlc3RuZy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL2JldXN0LmNzcyIgIC8+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJhbm5lci5qcyI+PC9zY3JpcHQ+CisKKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaENvcmUuanMiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hKYXZhLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoWG1sLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoQmFzaC5qcyI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaFBsYWluLmpzIj48L3NjcmlwdD4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoQ29yZS5jc3MiLz4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoVGhlbWVDZWRyaWMuY3NzIi8+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmNvbmZpZy5jbGlwYm9hcmRTd2YgPSAnc2NyaXB0cy9jbGlwYm9hcmQuc3dmJzsKKyAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuZGVmYXVsdHNbJ2d1dHRlciddID0gZmFsc2U7CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmFsbCgpOworICAgICAgPC9zY3JpcHQ+CisKKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgIC8qIFNldCB0aGUgY29tbWFuZC1saW5lIHRhYmxlIG9wdGlvbiBjb2x1bW4gd2lkdGguICovCisgICAgICAgICAgICAjY29tbWFuZC1saW5lIGNvbGdyb3VwLm9wdGlvbiB7CisgICAgICAgICAgICAgICAgIHdpZHRoOiA3ZW07CisgICAgICAgICAgICB9CisgICAgICAgIDwvc3R5bGU+CisgICAgPC9oZWFkPgorPGJvZHkgb25Mb2FkPSJwcmV0dHlQcmludCgpIj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGRpc3BsYXlNZW51KCJzZWxlbml1bS5odG1sIikKKzwvc2NyaXB0PgorCis8aDIgYWxpZ249ImNlbnRlciI+U2VsZW5pdW0gYW5kIFRlc3RORzwvaDI+CisKKzxlbT5UaGlzIGRvY3VtZW50YXRpb24gd2FzIHdyaXR0ZW4gYnkgRmVsaXBlIEtub3JyIEt1aG4gYW5kIGlzIGFkYXB0ZWQgZnJvbSA8YSBocmVmPSJodHRwOi8va25vcnJpdW0uaW5mby8yMDEwLzA4LzMxL3VzaW5nLXRlc3RuZy10by1sYXVuY2gteW91ci10ZXN0cy1hbmQtdGhlLXNlbGVuaXVtLXNlcnZlci8iPmEgc2VyaWVzIG9mIGFydGljbGVzPC9hPiBwb3N0ZWQgb24gPGEgaHJlZj0iaHR0cDovL2tub3JyaXVtLmluZm8iPmhpcyBibG9nPC9hPjwvZW0+LgorCisKKzxoMz5Db250ZW50PC9oMz4KKworPG9sPgorICA8bGk+PGEgaHJlZj0iI21vZGVsaW5nIj5Ib3cgdG8gdXNlIFRlc3RORyBjb25maWd1cmF0aW9uIG1ldGhvZHMgd2l0aCBwYXJhbWV0ZXJzPC9hPgorICA8bGk+PGEgaHJlZj0iI2NvbmZpZ3VyYXRpb25fbWV0aG9kcyI+SG93IHRvIGNvbmZpZ3VyZSB5b3VyIHRlc3Q8L2E+CisgIDxsaT48YSBocmVmPSIjY3JlYXRpbmdfeG1sIj5DcmVhdGluZyB0aGUgWE1MIGZpbGUgZm9yIFRlc3RORzwvYT4KKyAgPGxpPjxhIGhyZWY9IiNsYXVuY2hpbmciPkxhdWNoaW5nIHlvdXIgdGVzdHMgd2l0aCBFY2xpcHNlPC9hPgorICA8bGk+PGEgaHJlZj0iI2Z1dHVyZSI+SG93IHRvIG1ha2UgdGhlIHRlc3QgZGVzaWduIGEgbGl0dGxlIGJldHRlciBmb3IgdGhlIGZ1dHVyZTwvYT4KKzwvb2w+CisKKzxoMz48YSBuYW1lPSIjbW9kZWxpbmciPk1vZGVsaW5nIHlvdXIgdGVzdCBjYXNlPC9hPjwvaDM+CisKKzxwPkJlZm9yZSB3cml0aW5nIGEgdGVzdCBjYXNlLCB5b3UgbmVlZCB0byBrbm93IGhvdyBhbmQgd2hhdCB3aWxsIGJlIHZhbGlkYXRlZC4gTGV0J3MgdXNlIHRoZSBXb3JkUHJlc3MgPGEgaHJlZj0iaHR0cDovL2tub3JyaXVtLmluZm8vMjAxMC8wNS8xOS9hLWphdmEtYXBwcm9hY2gtdG8tc2VsZW5pdW0iPiJDcmVhdGUgTmV3IFBvc3QiIHRlc3QgY2FzZTwvYT4uCisKKzxvbD4KKyAgCisgIDxsaT5HbyB0byA8YSBocmVmPSJodHRwOi8vZGVtby5vcGVuc291cmNlY21zLmNvbS93b3JkcHJlc3Mvd3AtbG9naW4ucGhwIj5odHRwOi8vZGVtby5vcGVuc291cmNlY21zLmNvbS93b3JkcHJlc3Mvd3AtbG9naW4ucGhwPC9hPgorICA8bGk+RW50ZXIgImFkbWluIiBpbiB0aGUgIlVzZXJuYW1lIiBmaWVsZAorICA8bGk+RW50ZXIgImRlbW8xMjMiIGluIHRoZSAiUGFzc3dvcmQiIGZpZWxkCisgIDxsaT5DbGljayBvbiB0aGUgIkxvZyBJbiIgYnV0dG9uCisgIDxsaT5WZXJpZnkgdGhhdCB0aGUgdGV4dCAiSG93ZHksIGFkbWluIiBpcyBwcmVzZW50CisgIDxsaT5DbGljayBvbiB0aGUgIlBvc3RzIiBsaW5rCisgIDxsaT5DbGljayBvbiB0aGUgIkFkZCBOZXciIGJ1dHRvbgorICA8bGk+VHlwZSAiU2VsZW5pdW0gRGVtbyBQb3N0IiBpbiB0aGUgdGl0bGUgZmllbGQKKyAgPGxpPkNsaWNrIG9uIHRoZSAiUHVibGlzaCIgYnV0dG9uCisgIDxsaT4gVmVyaWZ5IHRoYXQgdGhlIHRleHQgIlBvc3QgcHVibGlzaGVkIiBpcyBwcmVzZW50CisKKzwvb2w+CisKKzxwPkNvbnNpZGVyaW5nIHRoaXMgc2NlbmFyaW8sIHRoZSBmaXJzdCB0aGluZyB0aGF0IGNvbWVzIHRvIG1pbmQgaXMgY3JlYXRpbmcgYSBsb25nIHRlc3QgY2FzZSB0aGF0IGdvZXMgdGhyb3VnaCBhbGwgdGhlIHN0ZXBzLiBUaGlzIG1pZ2h0IGJlIGEgZ29vZCBhcHByb2FjaCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBtYW51YWwgdGVzdCBjYXNlLiBIb3dldmVyLCBzaW5jZSB3ZSBhcmUgd3JpdGluZyBhbiBhdXRvbWF0ZWQgdGVzdCwgd2Ugd2FudCB0byB3cml0ZSBvdXIgc2NyaXB0IGFzIG1vZHVsYXIgYXMgcG9zc2libGUgdG8gYmUgYWJsZSB0byByZXVzZSBwYXJ0cyBvZiBpdCBpbiBmdXR1cmUgc2NlbmFyaW9zLjwvcD4KKworPHA+VGhpcyBpcyBob3cgSSB3b3VsZCBicmVhayBkb3duIHRoZSB0ZXN0OjwvcD4KKworPG9sPgorICA8bGk+TGF1bmNoIHRoZSBXb3JkUHJlc3Mgc2l0ZQorICA8bGk+T3BlbiB0aGUgQWRtaW4gTG9naW4gcGFnZQorICA8bGk+RW50ZXIgdmFsaWQgbG9naW4gZGF0YQorICA8bGk+TmF2aWdhdGUgdG8gdGhlIFdyaXRlIFBvc3QgcGFnZQorICA8bGk+V3JpdGUgdGhlIHBvc3QKKyAgPGxpPlB1Ymxpc2ggdGhlIHBvc3QKKyAgPGxpPlZlcmlmeSB0aGF0IGl0IHdhcyBhY3R1YWxseSBwb3N0Cis8L29sPgorCis8cD5LZWVwIGluIG1pbmQgdGhhdCB0aGlzIGlzIGp1c3QgYW4gZXhhbXBsZS4gWW91IGFyZSBmcmVlIHRvIG1vZGVsIHlvdXIgdGVzdHMgaW4gYW55IHdheSB5b3Ugd2FudCwgYXMgbG9uZyBhcyB0aGV5IGhhdmUgYnVzaW5lc3MgdmFsdWUgYW5kIHdpbGwgdmFsaWRhdGUgeW91ciBidXNpbmVzcyBsb2dpYy48L3A+IAorPHA+TGV0J3Mgc2VlIGhvdyB0byBkbyB0aGF0IHdpdGggYWN0dWFsIEphdmEgY29kZTo8L3A+CisKKzxwcmUgY2xhc3M9ImJydXNoOmphdmEiPgorQFRlc3QoZGVzY3JpcHRpb249IkxhdW5jaGVzIHRoZSBXb3JkUHJlc3Mgc2l0ZSIpCitwdWJsaWMgdm9pZCBsYXVuY2hTaXRlKCl7CisgIHNlbGVuaXVtLm9wZW4oIiIpOworICBzZWxlbml1bS53YWl0Rm9yUGFnZVRvTG9hZCgiMzAwMDAiKTsKKyAgYXNzZXJ0RXF1YWxzKHNlbGVuaXVtLmdldFRpdGxlKCksICJEZW1vIHwgSnVzdCBhbm90aGVyIFdvcmRQcmVzcyBzaXRlIik7Cit9CisgCitAVGVzdChkZXNjcmlwdGlvbj0iTmF2aWdhdGVzIHRvIHRoZSBhZG1pbiBwYWdlIikKKyAgcHVibGljIHZvaWQgb3BlbkFkbWluUGFnZSgpIHsKKyAgc2VsZW5pdW0ub3Blbigid3AtYWRtaW4iKTsKKyAgc2VsZW5pdW0ud2FpdEZvclBhZ2VUb0xvYWQoIjMwMDAwIik7CisgIGFzc2VydEVxdWFscyhzZWxlbml1bS5nZXRUaXRsZSgpLCAiRGVtbyDigLogTG9nIEluIik7Cit9CisgCitAVGVzdChkZXNjcmlwdGlvbj0iRW50ZXJzIHZhbGlkIGxvZ2luIGRhdGEiKQorICBwdWJsaWMgdm9pZCBsb2dpbkFzQWRtaW4oKSB7CisgIHNlbGVuaXVtLnR5cGUoInVzZXJfbG9naW4iLCAiYWRtaW4iKTsKKyAgc2VsZW5pdW0udHlwZSgidXNlcl9wYXNzIiwgImRlbW8xMjMiKTsKKyAgc2VsZW5pdW0uY2xpY2soIndwLXN1Ym1pdCIpOworICBzZWxlbml1bS53YWl0Rm9yUGFnZVRvTG9hZCgiMzAwMDAiKTsKKyAgYXNzZXJ0VHJ1ZShzZWxlbml1bS5pc1RleHRQcmVzZW50KCJIb3dkeSwgYWRtaW4iKSk7Cit9CisgCitAVGVzdChkZXNjcmlwdGlvbj0iTmF2aWdhdGVzIHRvIHRoZSBOZXcgUG9zdCBzY3JlZW4iKQorcHVibGljIHZvaWQgbmF2aWdhdGVOZXdQb3N0KCkgeworICBzZWxlbml1bS5jbGljaygiLy9hW2NvbnRhaW5zKHRleHQoKSwnUG9zdHMnKV0vZm9sbG93aW5nOjphW2NvbnRhaW5zKHRleHQoKSwnQWRkIE5ldycpXVsxXSIpOworICBzZWxlbml1bS53YWl0Rm9yUGFnZVRvTG9hZCgiMzAwMDAiKTsKKyAgYXNzZXJ0VHJ1ZShzZWxlbml1bS5pc1RleHRQcmVzZW50KCJBZGQgTmV3IFBvc3QiKSk7Cit9CisgCitAVGVzdChkZXNjcmlwdGlvbj0iV3JpdGVzIHRoZSBuZXcgcG9zdCIpCitwdWJsaWMgdm9pZCB3cml0ZUJsb2dQb3N0KCkgeworICBzZWxlbml1bS50eXBlKCJ0aXRsZSIsICJOZXcgQmxvZyBQb3N0Iik7CisgIHNlbGVuaXVtLmNsaWNrKCJlZEJ1dHRvbkhUTUwiKTsKKyAgc2VsZW5pdW0udHlwZSgiY29udGVudCIsICJUaGlzIGlzIGEgbmV3IHBvc3QiKTsKKyAgLy9UT0RPOkFzc2VydAorfQorIAorQFRlc3QoZGVzY3JpcHRpb249IlB1Ymxpc2hlcyB0aGUgcG9zdCIpCitwdWJsaWMgdm9pZCBwdWJsaXNoQmxvZ1Bvc3QoKSB7CisgIHNlbGVuaXVtLmNsaWNrKCJzdWJtaXRkaXYiKTsKKyAgc2VsZW5pdW0uY2xpY2soInB1Ymxpc2giKTsKKyAgc2VsZW5pdW0ud2FpdEZvclBhZ2VUb0xvYWQoIjMwMDAwIik7CisgIGFzc2VydFRydWUoc2VsZW5pdW0uaXNUZXh0UHJlc2VudCgiUG9zdCBwdWJsaXNoZWQuIikpOworfQorIAorQFRlc3QoZGVzY3JpcHRpb249IlZlcmlmaWVzIHRoZSBwb3N0IikKK3B1YmxpYyB2b2lkIHZlcmlmeUJsb2dQb3N0KCkgeworICBzZWxlbml1bS5jbGljaygiLy9hW2NvbnRhaW5zKHRleHQoKSwnUG9zdHMnKSBhbmQgY29udGFpbnMoQGNsYXNzLCd3cC1maXJzdC1pdGVtJyldIik7CisgIHNlbGVuaXVtLndhaXRGb3JQYWdlVG9Mb2FkKCIzMDAwMCIpOworICBhc3NlcnRUcnVlKHNlbGVuaXVtLmlzRWxlbWVudFByZXNlbnQoIi8vYVt0ZXh0KCk9J05ldyBCbG9nIFBvc3QnXSIpKTsKK30KKyAKK0BUZXN0KGRlc2NyaXB0aW9uPSJMb2dzIG91dCIpCitwdWJsaWMgdm9pZCBsb2dvdXQoKSB7CisgIHNlbGVuaXVtLmNsaWNrKCIvL2FbdGV4dCgpPSdMb2cgT3V0J10iKTsKKyAgLy9UT0RPOkFzc2VydAorfQorPC9wcmU+CisKKzxwPlRoZXNlIGFyZSB0aGUgdGVzdCBtZXRob2RzIChvciBzdGVwcykgd2UgYXJlIGdvaW5nIHRvIHVzZS4KKworPGgzPjxhIG5hbWU9ImNvbmZpZ3VyYXRpb25fbWV0aG9kcyI+Q29uZmlndXJhdGlvbiBtZXRob2RzPC9hPjwvaDM+CisKKzxwPklmIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCB1bml0IHRlc3RpbmcgZnJhbWV3b3JrcywgeW91IHByb2JhYmx5IGtub3cgYWJvdXQgdGhlIHNldHVwIGFuZCB0ZWFyZG93biBtZXRob2RzLiBUZXN0TkcgZ29lcyBiZXlvbmQgdGhhdCBpZGVhIGFuZCBhbGxvd3MgeW91IHRvIGRlZmluZSBtZXRob2RzIHRoYXQgd2lsbCBiZSBydW4gYWZ0ZXIgb3IgYmVmb3JlIHlvdXIgdGVzdCBzdWl0ZXMsIHRlc3QgZ3JvdXBzIG9yIHRlc3QgbWV0aG9kcy4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3Igb3VyIFNlbGVuaXVtIHRlc3RzIGJlY2F1c2UgeW91IGNhbiBjcmVhdGUgYSBTZWxlbml1bSBzZXJ2ZXIgYW5kIGJyb3dzZXIgaW5zdGFuY2UgYmVmb3JlIHlvdSBzdGFydCBydW5uaW5nIHlvdXIgdGVzdCBzdWl0ZS4pPC9wPgorCis8cD5UbyBhY2hpZXZlIHRoaXMsIHdlIHdpbGwgdXNlIHR3byBUZXN0TkcgPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvZG9jL2RvY3VtZW50YXRpb24tbWFpbi5odG1sI2Fubm90YXRpb25zIj5hbm5vdGF0aW9uczwvYT46IDx0dD5AQmVmb3JlU3VpdGU8L3R0PiBhbmQgPHR0PkBBZnRlclN1aXRlPC90dD46PC9wPgorCis8cHJlIGNsYXNzPSJicnVzaDpqYXZhICI+IAorQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IHRydWUpCitwdWJsaWMgdm9pZCBzZXR1cEJlZm9yZVN1aXRlKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgIFN0cmluZyBzZWxlbml1bUhvc3QgPSBjb250ZXh0LmdldEN1cnJlbnRYbWxUZXN0KCkuZ2V0UGFyYW1ldGVyKCJzZWxlbml1bS5ob3N0Iik7CisgIFN0cmluZyBzZWxlbml1bVBvcnQgPSBjb250ZXh0LmdldEN1cnJlbnRYbWxUZXN0KCkuZ2V0UGFyYW1ldGVyKCJzZWxlbml1bS5wb3J0Iik7CisgIFN0cmluZyBzZWxlbml1bUJyb3dzZXIgPSBjb250ZXh0LmdldEN1cnJlbnRYbWxUZXN0KCkuZ2V0UGFyYW1ldGVyKCJzZWxlbml1bS5icm93c2VyIik7CisgIFN0cmluZyBzZWxlbml1bVVybCA9IGNvbnRleHQuZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXRQYXJhbWV0ZXIoInNlbGVuaXVtLnVybCIpOworIAorICBSZW1vdGVDb250cm9sQ29uZmlndXJhdGlvbiByY2MgPSBuZXcgUmVtb3RlQ29udHJvbENvbmZpZ3VyYXRpb24oKTsKKyAgcmNjLnNldFNpbmdsZVdpbmRvdyh0cnVlKTsKKyAgcmNjLnNldFBvcnQoSW50ZWdlci5wYXJzZUludChzZWxlbml1bVBvcnQpKTsKKyAKKyAgdHJ5IHsKKyAgICBzZXJ2ZXIgPSBuZXcgU2VsZW5pdW1TZXJ2ZXIoZmFsc2UsIHJjYyk7CisgICAgc2VydmVyLmJvb3QoKTsKKyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBzdGFydCBzZWxlbml1bSBzZXJ2ZXIiLCBlKTsKKyAgfQorIAorICBwcm9jID0gbmV3IEh0dHBDb21tYW5kUHJvY2Vzc29yKHNlbGVuaXVtSG9zdCwgSW50ZWdlci5wYXJzZUludChzZWxlbml1bVBvcnQpLAorICAgICAgc2VsZW5pdW1Ccm93c2VyLCBzZWxlbml1bVVybCk7CisgIHNlbGVuaXVtID0gbmV3IERlZmF1bHRTZWxlbml1bShwcm9jKTsKKyAgc2VsZW5pdW0uc3RhcnQoKTsKK30KKyAKK0BBZnRlclN1aXRlKGFsd2F5c1J1biA9IHRydWUpCitwdWJsaWMgdm9pZCBzZXR1cEFmdGVyU3VpdGUoKSB7CisgIHNlbGVuaXVtLnN0b3AoKTsKKyAgc2VydmVyLnN0b3AoKTsKK30KKzwvcHJlPgorCis8cD5QUzogRGlkIHlvdSBub3RpY2UgdGhvc2Ugd2VpcmQgcGFyYW1ldGVycz8gVGhleSBhcmUgc3RvcmVkIGluIHRoZSBYTUwgZmlsZSAod2UgYXJlIGdvaW5nIHRvIHNlZSBpbiB0aGUgbmV4dCBzZWN0aW9uKSBhbmQgYWNjZXNzZWQgYnkgYSA8dHQ+SVRlc3RDb250ZXh0PC90dD4gb2JqZWN0LCB3aGljaCB3YXMgPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvZG9jL2RvY3VtZW50YXRpb24tbWFpbi5odG1sI2RlcGVuZGVuY3ktaW5qZWN0aW9uIj5pbmplY3RlZDwvYT4uIDwvcD4KKworPHA+QnkgYWRkaW5nIHRoZXNlIGFubm90YXRpb25zLCB0aGUgVGVzdE5HIGVuZ2luZSB3aWxsIGludm9rZSB0aGUgY29uZmlndXJhdGlvbiBtZXRob2RzIGF1dG9tYXRpY2FsbHkgYmVmb3JlL2FmdGVyIHlvdXIgdGVzdCBzdWl0ZSAobWFrZSBzdXJlIHRoZSB0ZXN0IG1ldGhvZHMgYXJlIGFubm90YXRlZCB3aXRoIDx0dD5AVGVzdDwvdHQ+KSwgbGF1bmNoaW5nIHRoZSBTZWxlbml1bSBzZXJ2ZXIgYW5kIGluc3RhbnRpYXRpbmcgdGhlIFNlbGVuaXVtIGNsaWVudCBvYmplY3Qgb25seSBvbmNlLCByZXVzaW5nIHRoZSBzYW1lIGJyb3dzZXIgc2Vzc2lvbiBhY3Jvc3MgdGhlIHRlc3RzLjwvcD4KKworPGgzPjxhIG5hbWU9ImNyZWF0aW5nX3htbCI+Q3JlYXRpbmcgdGhlIFhNTCBmaWxlPC9hPjwvaDM+CisKKzxwPlRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIHRlc3RzLCB3ZSB3aWxsIGhhdmUgdG8gY3JlYXRlIGFuIFhNTCBmaWxlIGxpc3RpbmcgdGhlIHRlc3QgbWV0aG9kcyB3ZSB3b3VsZCBsaWtlIHRvIHJ1bi4gTWFrZSBzdXJlIHRoYXQgdGhlIHRlc3QgbWV0aG9kcyBhcmUgYW5ub3RhdGVkIHdpdGggPHR0PkBUZXN0PC90dD4sIG9yIGVsc2UgdGhlIFRlc3RORyBlbmdpbmUgd2lsbCBub3QgaW52b2tlIHRoZW0uPC9wPgorCis8cD5CZWZvcmUgVGVzdE5HIDUuMTMuMSwgeW91IGhhZCB0byB1c2UgTWV0aG9kIEludGVyY2VwdG9ycyBpZiB5b3Ugd2FudGVkIHRvIHJ1biB0aGUgdGVzdHMgaW4gdGhlIG9yZGVyIGRlZmluZWQgaW4gdGhlIFhNTCBmaWxlLiBJIGhhdmUgcG9zdGVkIDxhIGhyZWY9Imh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vNDE2MzEwIj5teSBpbXBsZW1lbnRhdGlvbiBvZiBhIE1ldGhvZCBJbnRlcmNlcHRvcjwvYT4gb24gbXkgR2l0aHViIGFjY291bnQuIEZyb20gVGVzdE5HIDUuMTMuMSssIHlvdSBjYW4ganVzdCBhZGQgdGhlIDx0dD5wcmVzZXJ2ZS1vcmRlcjwvdHQ+IHBhcmFtZXRlciB0byB5b3VyIHRlc3QgdGFnIGFuZCBpbmNsdWRlIHRoZSBtZXRob2RzIHlvdSB3b3VsZCBsaWtlIHRvIHJ1biwgcmVkdWNpbmcgdW5lY2Vzc2FyeSBjb2RlIGluIHlvdXIgdGVzdCBzdWl0ZS48L3A+CisKKzxwPkhlcmUgaXMgdGhlIFhNTCBmaWxlOjwvcD4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+CisKKzxzdWl0ZSBuYW1lPSJLbm9ycml1bS5pbmZvIC0gV29yZHByZXNzIERlbW8iIHZlcmJvc2U9IjEwIj4KKyAgJmx0O3BhcmFtZXRlciBuYW1lPSJzZWxlbml1bS5ob3N0IiB2YWx1ZT0ibG9jYWxob3N0IiAvJmd0OworICAmbHQ7cGFyYW1ldGVyIG5hbWU9InNlbGVuaXVtLnBvcnQiIHZhbHVlPSIzNzM3IiAvJmd0OworICAmbHQ7cGFyYW1ldGVyIG5hbWU9InNlbGVuaXVtLmJyb3dzZXIiIHZhbHVlPSIqZmlyZWZveCIgLyZndDsKKyAgJmx0O3BhcmFtZXRlciBuYW1lPSJzZWxlbml1bS51cmwiIHZhbHVlPSJodHRwOi8vZGVtby5vcGVuc291cmNlY21zLmNvbS93b3JkcHJlc3MvIiAvJmd0OworCisgIDx0ZXN0IG5hbWU9IldyaXRlIG5ldyBwb3N0IiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5Xb3JkcHJlc3MiPgorICAgICAgICA8bWV0aG9kcz4KKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJsYXVuY2hTaXRlIiAvJmd0OworICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9Im9wZW5BZG1pblBhZ2UiIC8mZ3Q7CisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0ibG9naW5Bc0FkbWluIiAvJmd0OworICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9Im5hdmlnYXRlTmV3UG9zdCIgLyZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJ3cml0ZUJsb2dQb3N0IiAvJmd0OworICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9InB1Ymxpc2hCbG9nUG9zdCIgLyZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJ2ZXJpZnlCbG9nUG9zdCIgLyZndDsKKyAgICAgICAgPC9tZXRob2RzPgorICAgICAgPC9jbGFzcz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+Cis8L3ByZT4KKworPGgzPjxhIG5hbWU9ImxhdW5jaGluZyI+TGF1bmNoaW5nIHlvdXIgdGVzdHMgaW4gRWNsaXBzZTwvYT48L2gzPgorCis8cD5XZSBmaW5pc2hlZCB3cml0aW5nIG91ciB0ZXN0cywgbm93IGhvdyBjYW4gd2UgcnVuIHRoZW0/PC9wPiAKKzxwPllvdSBjYW4gbGF1bmNoIFRlc3RORyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHVzaW5nIGEgRWNsaXBzZSBwbHVnaW4gb3IgZXZlbiBwcm9ncmFtYXRpY2FsbHkuIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIEVjbGlwc2UgcGx1Z2luLiBGb2xsb3cgdGhlIHN0ZXBzIGRlc2NyaWJlZCBvbiB0aGUgb2ZmaWNpYWwgVGVzdE5HIGRvY3VtZW50YXRpb24gPGEgaHJlZj0iaHR0cDovL3Rlc3RuZy5vcmcvZG9jL2Rvd25sb2FkLmh0bWwiPm92ZXIgaGVyZTwvYT48L3A+CisKKzxwPklmIHlvdSBpbnN0YWxsZWQgVGVzdE5HIGNvcnJlY3RseSwgeW91IHdpbGwgc2VlIHRoaXMgbWVudSB3aGVuIHlvdSByaWdodCBjbGljayBvbiB0aGUgWE1MIGZpbGU6PGJyIC8+CisKKzxwIGFsaWduPSJjZW50ZXIiPgorICA8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy90ZXN0TkctcnVuLnBuZyI+CisgICAgPGltZyBzcmM9Imh0dHA6Ly90ZXN0bmcub3JnL3BpY3R1cmVzL3Rlc3RORy1ydW4ucG5nIiBhbHQ9IiIgdGl0bGU9InRlc3RORy1ydW4iIHdpZHRoPSI0NjQiIGhlaWdodD0iNTkiIGNsYXNzPSJhbGlnbmNlbnRlciBzaXplLWZ1bGwgd3AtaW1hZ2UtMTkiIC8+Cis8L2E+Cis8L3A+CisKKzxwPkNsaWNrIG9uICYjODIyMDtSdW4gYXMgVGVzdE5HIFN1aXRlJiM4MjIxOyBhbmQgeW91ciB0ZXN0IHdpbGwgc3RhcnQgcnVubmluZy4gWW91IHdpbGwgdGhlbiBzZWUgdGhpcyBuaWNlIHJlc3VsdHMgdHJlZTo8L3A+CisKKzxwIGFsaWduPSJjZW50ZXIiPgorICA8YSBocmVmPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy90ZXN0TkctZXhlYy5wbmciPgorICAgIDxpbWcgc3JjPSJodHRwOi8vdGVzdG5nLm9yZy9waWN0dXJlcy90ZXN0TkctZXhlYy5wbmciIGFsdD0iIiB0aXRsZT0idGVzdE5HLWV4ZWMiIHdpZHRoPSI1OTEiIGhlaWdodD0iMjU2IiBjbGFzcz0iYWxpZ25jZW50ZXIgc2l6ZS1mdWxsIHdwLWltYWdlLTIwIiAvPjwvYT4KKzwvcD4KKworPGgzPjxhIG5hbWU9ImZ1dHVyZSI+VGhpbmtpbmcgYWJvdXQgdGhlIGZ1dHVyZTwvYT48L2gzPgorCisKKzxwPklmIHlvdSByZWFsbHkgd2FudCB0byB0aGluayBhYm91dCB0aGUgZnV0dXJlIG9mIHlvdXIgdGVzdCBzdWl0ZSwgSSB3b3VsZCByZWNvbW1lbmQgeW91IHRvIHJlYWQgPGEgaHJlZj0iaHR0cDovL2FkYW0uZ291Y2hlci5jYS8iPkFkYW08L2E+IDxhIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9hZGFtZ291Y2hlciI+R291Y2hlciYjODIxNztzPC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LnByYWdwcm9nLmNvbS9tYWdhemluZXMiPmFydGljbGU8L2E+IHB1Ymxpc2hlZCBvbiBQcmFnUHViLiBIZSB0YWxrcyBhYm91dCBTZWxlbml1bSAyIGFuZCB0aGUgUGFnZSBPYmplY3RzIE1vZGVsIChhIHZlcnkgbmljZSB3YXkgdG8gbW9kZWwgeW91ciB0ZXN0cywgZXNwZWNpYWxseSBpZiB5b3UgdXNlIFNlbGVuaXVtIDIpLjwvcD4KKworPHA+U2luY2UgdGhlcmUgYXJlIGxvdHMgb2YgcGVvcGxlIHN0aWxsIHVzaW5nIFNlbGVuaXVtIDEsIEknbGwgc3RpY2sgdG8gdGhhdCBmb3IgYSB3aGlsZSwgYnV0IFNlbGVuaXVtIDIgd2lsbCBldmVudHVhbGx5IGJlIGNvdmVyZWQgaGVyZS48L3A+CisKKzxwPkFzIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4geW91ciB0ZXN0IHN1aXRlIGdyb3dzLCB5b3Ugd2lsbCBmaW5kIHRoYXQgZ3JvdXBpbmcgdGhlbSBpbiBkaWZmZXJlbnQgdGVzdCBjbGFzc2VzIGlzIGEgZ29vZCBpZGVhLiBJZiB5b3UgZG8gdGhhdCwgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcgYW5kIGNyZWF0ZSBhIG5ldyBjbGFzcyBuYW1lZCBCYXNlVGVzdCAoZm9yIGV4YW1wbGUpLCBhbmQgbGVhdmUgeW91ciBjb25maWd1cmF0aW9uIGxvZ2ljIHRoZXJlLiBUaGF0IHdheSwgZXZlcnkgdGVzdCBjbGFzcyBtdXN0IGV4dGVuZCB0aGUgQmFzZVRlc3QgY2xhc3MgYW5kIHVzZSBzdGF0aWMgYXR0cmlidXRlcy48L3A+CisKKworPHByZSBjbGFzcz0iYnJ1c2g6IGphdmEiPgorcHVibGljIGNsYXNzIFdvcmRQcmVzc0FkbWluIGV4dGVuZHMgQmFzZVRlc3QgeworQFRlc3QKK3B1YmxpYyB2b2lkIHRlc3QxKCl7CisgIHNlbGVuaXVtLm9wZW4oIiIpOworICAvLy4uLgorfQorCitAVGVzdAorcHVibGljIHZvaWQgdGVzdDIoKXsKKyAgc2VsZW5pdW0ub3BlbigiIik7CisgIC8vLi4uCit9Cit9Cis8L3ByZT4KKworPHA+VGhpcyBpcyBiZXR0ZXIgdGhhbiBsZWF2aW5nIHlvdXIgY29uZmlndXJhdGlvbiBtZXRob2RzIGluIHRoZSB0ZXN0IGNsYXNzLjwvcD4KKworCmRpZmYgLS1naXQgYS9kb2MvdGVzdG5nLmNzcyBiL2RvYy90ZXN0bmcuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDc4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdGVzdG5nLmNzcwpAQCAtMCwwICsxLDE2MyBAQAorYm9keSwgdGQsIHRoIHsNCisgIGZvbnQtZmFtaWx5OiBMdWNpZGEgR3JhbmRlLCBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOw0KKyAgZm9udC1zaXplOiA5cHQ7DQorfQ0KKw0KK3RhYmxlLHRoLHRyLHRkIHsNCisgICAgICAgIGJvcmRlcjogbm9uZTsNCit9DQorDQordGggew0KKyAgICAgICAgYmFja2dyb3VuZDogI2FhYTsNCit9DQorDQordGQgew0KKyAgICAgICAgYmFja2dyb3VuZDogI2VmZWZlZjsNCit9DQorDQordGQgew0KKyAgICAgICAgcGFkZGluZy10b3A6IDNweDsNCisgICAgICAgIHBhZGRpbmctcmlnaHQ6IDRweDsNCisgICAgICAgIHBhZGRpbmctbGVmdDogNHB4Ow0KKyAgICAgICAgcGFkZGluZy1ib3R0b206IDNweDsNCit9DQorDQoraDIgew0KKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KK30NCisNCitoMyB7DQorICAgICAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmOw0KKyAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMTJlbTsNCisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2FhYTsNCisgICAgICAgIHBhZGRpbmctdG9wOiA4cHg7DQorICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsNCisgICAgICAgIHdpZHRoOiA3MCU7DQorfQ0KKw0KK2hyIHsNCisgICAgICAgIGhlaWdodDogNXB4Ow0KKyAgICAgICAgYm9yZGVyOiAwOw0KKyAgICAgICAgY29sb3I6ICNhYWE7DQorICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhOw0KK30NCisNCisuZG9jdHlwZSB7DQorICBjb2xvcjogcmVkDQorfQ0KKw0KKy54bWwtY29tbWVudCB7DQorICBjb2xvcjogZ3JlZW47DQorfQ0KKw0KKy5hdHRyaWJ1dGUgew0KKyAgY29sb3I6IGJsdWU7DQorfQ0KKw0KKy50YWcgew0KKyAgY29sb3I6ICM3ZjAwNTU7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQorDQorLmZsb2F0LXJpZ2h0IHsNCisgIGZsb2F0OiByaWdodDsNCit9DQorDQorLmNvZGUgew0KKyAgbWFyZ2luLWxlZnQ6IDIwcHg7DQorICBtYXJnaW4tdG9wOiAxMHB4Ow0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZkZDsNCisgIGJvcmRlcjogMXB0IHNvbGlkIHNpbHZlcjsNCisgIGJvcmRlci1jb2xvcjogI2NjYyAjOTk5ICM5OTkgI0NDQzsNCisgIGNvbG9yOiAjMDAwMDAwOw0KKyAgcGFkZGluZzogNXB4IDVweCA1cHggN3B4Ow0KKyAgZm9udC1zaXplOiAxMXB4Ow0KKyAgcGFkZGluZzogLjNlbSAuNmVtOw0KKyAgZm9udC1mYW1pbHk6IENvdXJpZXIgTmV3DQorfQ0KKw0KKy5ib3ggew0KKyAgYm9yZGVyOiAxcHQgc29saWQgc2lsdmVyOw0KKyAgYm9yZGVyLWNvbG9yOiAjY2NjICM5OTkgIzk5OSAjQ0NDOw0KKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZkZDsNCit9DQorDQorI21lbnUgew0KKyAgICAgICAgZm9udC1zaXplOiBzbWFsbDsNCisgICAgICAgIGxpbmUtaGVpZ2h0OiAwLjllbTsNCisgICAgICAgIGNsZWFyOiBib3RoOw0KKyAgICAgICAgbWFyZ2luLXRvcDogMTBweDsNCisgICAgICAgIH0NCisNCisjbWVudSBsaSB7DQorICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7DQorICAgICAgICB9DQorDQorI21lbnUgbGkgbGkgew0KKyAgICAgICAgbWFyZ2luLXRvcDogMnB4Ow0KKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4Ow0KKyAgICAgICAgfQ0KKw0KKyNtZW51IGxpLnN1Ym1lbnVpdGVtcyB7DQorICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7DQorICAgICAgICB9DQorDQorI21lbnUgYSB7DQorICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQorICAgICAgICB9DQorDQorLmV7bWFyZ2luLWxlZnQ6MWVtO3RleHQtaW5kZW50Oi0xZW07bWFyZ2luLXJpZ2h0OjFlbX0NCisubXtjb2xvcjpibHVlfQ0KKy50e2NvbG9yOiM5OTAwMDB9DQorDQorQTpsaW5rIHsNCisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCit9DQorDQorQTpob3Zlci5zdW1tYXJ5IHsNCisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCisgIGNvbG9yOiAjZmY5OTAwOw0KK30NCisNCitBOnZpc2l0ZWQgew0KKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KK30NCisNCisNCisNCisNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgdG8gdGhlIHRvcCBtZW51ICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjdG9wbWVudSBhIHsNCisJdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KK30NCisjdG9wbWVudSBhOmxpbmsgew0KKwljb2xvcjogIzAwNjZiYjsgDQorfQ0KKyN0b3BtZW51IGE6dmlzaXRlZCB7DQorCWNvbG9yOiAjMDA2Njk5OyANCit9DQorI3RvcG1lbnUgYTphY3RpdmUgew0KKwljb2xvcjogcmVkOyANCit9DQorI3RvcG1lbnUgYTpob3ZlciB7DQorCWNvbG9yOiByZWQ7IA0KK30NCisjdG9wbWVudSB0YWJsZSB7DQorCWJhY2tncm91bmQtY29sb3I6ICNmZmNjNjY7IA0KKwl0ZXh0LWFsaWduOiBjZW50ZXI7DQorfQ0KKyN0b3BtZW51IHRkIHsNCisgIGZvbnQtc2l6ZTogc21hbGw7DQorICBmb250LXdlaWdodDogYm9sZDsNCit9DQorI3RvcG1lbnUgdGQuY3VycmVudCB7DQorICBiYWNrZ3JvdW5kOiAjZmZmZjAwOw0KK30NCisvKiBUaGUgbmV4dCBydWxlIGlzIGEgcGF0Y2ggYmVjYXVzZSBvdGhlciBydWxlcyBhcmUgbm90IHNjb3BlZCBjb3JyZWN0bHkgKi8NCisjdG9wbWVudSB0ZCB7DQorICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmNjNjY7DQorfQ0KZGlmZiAtLWdpdCBhL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tLy5wcm9qZWN0IGIvZWNsaXBzZS1wcm9qZWN0cy9iZXVzdC5jb20vLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MDZhYgotLS0gL2Rldi9udWxsCisrKyBiL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPmJldXN0LmNvbTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tL2luZGV4Lmh0bWwgYi9lY2xpcHNlLXByb2plY3RzL2JldXN0LmNvbS9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzFiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9lY2xpcHNlLXByb2plY3RzL2JldXN0LmNvbS9pbmRleC5odG1sCkBAIC0wLDAgKzEsNjAgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+YmV1c3QuY29tPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKzxzdHlsZT5AaW1wb3J0IHVybCgid2ViL3NpdGUuY3NzIik7PC9zdHlsZT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKwl2YXIgcmV0dXJudmFsID0gMDsKKwl2YXIgc3R5bGVzaGVldCwgeG1sRmlsZSwgY2FjaGUsIGRvYzsKKwlmdW5jdGlvbiBpbml0KCl7CisJCS8vIE5TQ1AgNy4xKyAvIE1vemlsbGEgMS40LjErIC8gU2FmYXJpCisJCS8vIFVzZSB0aGUgc3RhbmRhcmQgRE9NIExldmVsIDIgdGVjaG5pcXVlLCBpZiBpdCBpcyBzdXBwb3J0ZWQKKwkJaWYgKGRvY3VtZW50LmltcGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KSB7CisJCQl4bWxGaWxlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsKKwkJCXN0eWxlc2hlZXQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgIiIsIG51bGwpOworCQkJaWYgKHhtbEZpbGUubG9hZCl7CisJCQkJeG1sRmlsZS5sb2FkKCJzaXRlLnhtbCIpOworCQkJCXN0eWxlc2hlZXQubG9hZCgid2ViL3NpdGUueHNsIik7CisJCQl9IGVsc2UgeworCQkJCWFsZXJ0KCJEb2N1bWVudCBjb3VsZCBub3QgYmUgbG9hZGVkIGJ5IGJyb3dzZXIuIik7CisJCQl9CisJCQl4bWxGaWxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCB0cmFuc2Zvcm0sIGZhbHNlKTsKKwkJCXN0eWxlc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHRyYW5zZm9ybSwgZmFsc2UpOworCQl9CisJCS8vSUUgNi4wKyBzb2x1dGlvbgorCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgeworCQkJeG1sRmlsZSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJtc3htbDIuRE9NRG9jdW1lbnQuMy4wIik7CisJCQl4bWxGaWxlLmFzeW5jID0gZmFsc2U7CisJCQl4bWxGaWxlLmxvYWQoInNpdGUueG1sIik7CisJCQlzdHlsZXNoZWV0ID0gbmV3IEFjdGl2ZVhPYmplY3QoIm1zeG1sMi5GcmVlVGhyZWFkZWRET01Eb2N1bWVudC4zLjAiKTsKKwkJCXN0eWxlc2hlZXQuYXN5bmMgPSBmYWxzZTsKKwkJCXN0eWxlc2hlZXQubG9hZCgid2ViL3NpdGUueHNsIik7CisJCQljYWNoZSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJtc3htbDIuWFNMVGVtcGxhdGUuMy4wIik7CisJCQljYWNoZS5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKKwkJCXRyYW5zZm9ybURhdGEoKTsKKwkJfQorCX0KKwkvLyBzZXBhcmF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBmb3IgSUUgNi4wKworCWZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoKXsKKwkJdmFyIHByb2Nlc3NvciA9IGNhY2hlLmNyZWF0ZVByb2Nlc3NvcigpOworCQlwcm9jZXNzb3IuaW5wdXQgPSB4bWxGaWxlOworCQlwcm9jZXNzb3IudHJhbnNmb3JtKCk7CisJCWRhdGEuaW5uZXJIVE1MID0gcHJvY2Vzc29yLm91dHB1dDsKKwl9CisJLy8gc2VwYXJhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gZm9yIE5TQ1AgNy4xKyBhbmQgTW96aWxsYSAxLjQuMSsgCisJZnVuY3Rpb24gdHJhbnNmb3JtKCl7CisJCXJldHVybnZhbCs9MTsKKwkJaWYgKHJldHVybnZhbD09Mil7CisJCQl2YXIgcHJvY2Vzc29yID0gbmV3IFhTTFRQcm9jZXNzb3IoKTsKKwkJCXByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHN0eWxlc2hlZXQpOyAKKwkJCWRvYyA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0RvY3VtZW50KHhtbEZpbGUpOworCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGEiKS5pbm5lckhUTUwgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTDsKKwkJfQorCX0KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJpbml0KCk7Ij4KKzwhLS1baW5zZXJ0IHN0YXRpYyBIVE1MIGhlcmVdLS0+Cis8ZGl2IGlkPSJkYXRhIj48IS0tIHRoaXMgaXMgd2hlcmUgdGhlIHRyYW5zZm9ybWVkIGRhdGEgZ29lcyAtLT48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tL3NpdGUueG1sIGIvZWNsaXBzZS1wcm9qZWN0cy9iZXVzdC5jb20vc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0ODI1MgotLS0gL2Rldi9udWxsCisrKyBiL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tL3NpdGUueG1sCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlPgorICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcudGVzdG5nLmZlYXR1cmVfNS44LjAuMi5qYXIiIGlkPSJvcmcudGVzdG5nLmZlYXR1cmUiIHZlcnNpb249IjUuOC4wLjIiPgorICAgICAgPGNhdGVnb3J5IG5hbWU9IlRlc3RORyIvPgorICAgPC9mZWF0dXJlPgorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJUZXN0TkciIGxhYmVsPSJUZXN0TkciLz4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tL3dlYi9zaXRlLmNzcyBiL2VjbGlwc2UtcHJvamVjdHMvYmV1c3QuY29tL3dlYi9zaXRlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM2ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvZWNsaXBzZS1wcm9qZWN0cy9iZXVzdC5jb20vd2ViL3NpdGUuY3NzCkBAIC0wLDAgKzEsMTIgQEAKKzxTVFlMRSB0eXBlPSJ0ZXh0L2NzcyI+Cit0ZC5zcGFjZXIge3BhZGRpbmctYm90dG9tOiAxMHB4OyBwYWRkaW5nLXRvcDogMTBweDt9CisudGl0bGUgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgY29sb3I6ICM5OUFBQ0M7fQorLmJvZHlUZXh0IHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjojMDAwMDAwOyAgfQorLnN1Yi1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTt9CisubG9nLXRleHQge2ZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBsaWdodGVyOyBmb250LXNpemU6IDhwdDsgY29sb3I6YmxhY2s7fQorLmJpZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXRvcDoxMHB4IHNvbGlkIHdoaXRlO30KKy5saWdodC1yb3cge2JhY2tncm91bmQ6I0ZGRkZGRn0KKy5kYXJrLXJvdyB7YmFja2dyb3VuZDojRUVFRUZGfQorLmhlYWRlciB7YmFja2dyb3VuZDojOTlBQUREfQorI2luZGVudCB7d29yZC13cmFwIDogYnJlYWstd29yZDt3aWR0aCA6MzAwcHg7dGV4dC1pbmRlbnQ6MTBweDt9Cis8L1NUWUxFPgpkaWZmIC0tZ2l0IGEvZWNsaXBzZS1wcm9qZWN0cy9iZXVzdC5jb20vd2ViL3NpdGUueHNsIGIvZWNsaXBzZS1wcm9qZWN0cy9iZXVzdC5jb20vd2ViL3NpdGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDk3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9lY2xpcHNlLXByb2plY3RzL2JldXN0LmNvbS93ZWIvc2l0ZS54c2wKQEAgLTAsMCArMSwyMTQgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uID0gJzEuMCcgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nIHhtbG5zOm1zeHNsPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhzbHQiPgorPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBlbmNvZGluZz0iVVRGLTgiLz4KKzx4c2w6a2V5IG5hbWU9ImNhdCIgbWF0Y2g9ImNhdGVnb3J5IiB1c2U9IkBuYW1lIi8+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJzaXRlIj4KKwk8aHRtbD4KKwk8aGVhZD4KKwk8dGl0bGU+YmV1c3QuY29tPC90aXRsZT4KKwk8c3R5bGU+QGltcG9ydCB1cmwoIndlYi9zaXRlLmNzcyIpOzwvc3R5bGU+CisJPC9oZWFkPgorCTxib2R5PgorCTxoMSBjbGFzcz0idGl0bGUiPmJldXN0LmNvbTwvaDE+CisJPHAgY2xhc3M9ImJvZHlUZXh0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGVzY3JpcHRpb24iLz48L3A+CisJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMiI+CisJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNhdGVnb3J5LWRlZiI+CisJCTx4c2w6c29ydCBzZWxlY3Q9IkBsYWJlbCIgb3JkZXI9ImFzY2VuZGluZyIgY2FzZS1vcmRlcj0idXBwZXItZmlyc3QiLz4KKwkJPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+CisJPHhzbDppZiB0ZXN0PSJjb3VudChrZXkoJ2NhdCcsQG5hbWUpKSAhPSAwIj4KKwkJCTx0ciBjbGFzcz0iaGVhZGVyIj4KKwkJCQk8dGQgY2xhc3M9InN1Yi1oZWFkZXIiIHdpZHRoPSIzMCUiPgorCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKwkJCQk8L3RkPgorCQkJCTx0ZCBjbGFzcz0ic3ViLWhlYWRlciIgd2lkdGg9IjcwJSI+CisJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4KKwkJCQk8L3RkPgorCQkJPC90cj4KKwkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ2NhdCcsQG5hbWUpIj4KKwkJCTx4c2w6c29ydCBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIgb3JkZXI9ImFzY2VuZGluZyIvPgorCQkJPHhzbDpzb3J0IHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BpZCIgb3JkZXI9ImFzY2VuZGluZyIgY2FzZS1vcmRlcj0idXBwZXItZmlyc3QiLz4KKwkJCTx0cj4KKwkJCQk8eHNsOmNob29zZT4KKwkJCQk8eHNsOndoZW4gdGVzdD0iKHBvc2l0aW9uKCkgbW9kIDIgPSAxKSI+CisJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kYXJrLXJvdzwveHNsOmF0dHJpYnV0ZT4KKwkJCQk8L3hzbDp3aGVuPgorCQkJCTx4c2w6b3RoZXJ3aXNlPgorCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+bGlnaHQtcm93PC94c2w6YXR0cmlidXRlPgorCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQk8L3hzbDpjaG9vc2U+CisJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+CisJCQkJCQk8eHNsOmNob29zZT4KKwkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGxhYmVsIj4KKwkJCQkJCQk8YSBocmVmPSJ7YW5jZXN0b3I6OmZlYXR1cmUvL0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BsYWJlbCIvPjwvYT4KKwkJCQkJCQk8YnIvPgorCQkJCQkJCTxkaXYgaWQ9ImluZGVudCI+CisJCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIvPikKKwkJCQkJCQk8L2Rpdj4KKwkJCQkJCTwveHNsOndoZW4+CisJCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCTxhIGhyZWY9InthbmNlc3Rvcjo6ZmVhdHVyZS8vQHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AdmVyc2lvbiIvPjwvYT4KKwkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCTwveHNsOmNob29zZT4KKwkJCQkJCTxiciAvPgorCQkJCTwvdGQ+CisJCQkJPHRkPgorCQkJCQk8dGFibGU+CisJCQkJCQk8eHNsOmlmIHRlc3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9Ab3MiPgorCQkJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5PcGVyYXRpbmcgU3lzdGVtczo8L3RkPgorCQkJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG9zIi8+PC90ZD4KKwkJCQkJCQk8L3RyPgorCQkJCQkJPC94c2w6aWY+CisJCQkJCQk8eHNsOmlmIHRlc3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9Ad3MiPgorCQkJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5XaW5kb3dzIFN5c3RlbXM6PC90ZD4KKwkJCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0B3cyIvPjwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwveHNsOmlmPgorCQkJCQkJPHhzbDppZiB0ZXN0PSJhbmNlc3Rvcjo6ZmVhdHVyZS8vQG5sIj4KKwkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+TGFuZ3VhZ2VzOjwvdGQ+CisJCQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AbmwiLz48L3RkPgorCQkJCQkJCTwvdHI+CisJCQkJCQk8L3hzbDppZj4KKwkJCQkJCTx4c2w6aWYgdGVzdD0iYW5jZXN0b3I6OmZlYXR1cmUvL0BhcmNoIj4KKwkJCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+QXJjaGl0ZWN0dXJlOjwvdGQ+CisJCQkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFuY2VzdG9yOjpmZWF0dXJlLy9AYXJjaCIvPjwvdGQ+CisJCQkJCQkJPC90cj4KKwkJCQkJCTwveHNsOmlmPgorCQkJCQk8L3RhYmxlPgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPC94c2w6Zm9yLWVhY2g+CisJCQk8dHI+PHRkIGNsYXNzPSJzcGFjZXIiPjxici8+PC90ZD48dGQgY2xhc3M9InNwYWNlciI+PGJyLz48L3RkPjwvdHI+CisJCTwveHNsOmlmPgorCTwveHNsOmZvci1lYWNoPgorCTx4c2w6aWYgdGVzdD0iY291bnQoZmVhdHVyZSkgICZndDsgY291bnQoZmVhdHVyZS9jYXRlZ29yeSkiPgorCTx0ciBjbGFzcz0iaGVhZGVyIj4KKwkJPHRkIGNsYXNzPSJzdWItaGVhZGVyIiBjb2xzcGFuPSIyIj4KKwkJVW5jYXRlZ29yaXplZAorCQk8L3RkPgorCTwvdHI+CisJPC94c2w6aWY+CisJPHhzbDpjaG9vc2U+CisJPHhzbDp3aGVuIHRlc3Q9ImZ1bmN0aW9uLWF2YWlsYWJsZSgnbXN4c2w6bm9kZS1zZXQnKSI+CisJICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJydGYtbm9kZXMiPgorCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSI+CisJCQk8eHNsOnNvcnQgc2VsZWN0PSJAaWQiIG9yZGVyPSJhc2NlbmRpbmciIGNhc2Utb3JkZXI9InVwcGVyLWZpcnN0Ii8+CisJCQk8eHNsOnNvcnQgc2VsZWN0PSJAdmVyc2lvbiIgb3JkZXI9ImFzY2VuZGluZyIgLz4KKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSIuIiAvPgorCQk8L3hzbDpmb3ItZWFjaD4KKwkgICA8L3hzbDp2YXJpYWJsZT4KKwkgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im15Tm9kZVNldCIgc2VsZWN0PSJtc3hzbDpub2RlLXNldCgkcnRmLW5vZGVzKS8qIi8+CisJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRteU5vZGVTZXQiPgorCTx0cj4KKwkJPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kYXJrLXJvdzwveHNsOmF0dHJpYnV0ZT4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5saWdodC1yb3c8L3hzbDphdHRyaWJ1dGU+CisJCTwveHNsOm90aGVyd2lzZT4KKwkJPC94c2w6Y2hvb3NlPgorCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij4KKwkJCTx4c2w6Y2hvb3NlPgorCQkJPHhzbDp3aGVuIHRlc3Q9IkBsYWJlbCI+CisJCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+PC9hPgorCQkJCTxiciAvPgorCQkJCTxkaXYgaWQ9ImluZGVudCI+CisJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZlcnNpb24iLz4pCisJCQkJPC9kaXY+CisJCQk8L3hzbDp3aGVuPgorCQkJPHhzbDpvdGhlcndpc2U+CisJCQkJPGEgaHJlZj0ie0B1cmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2ZXJzaW9uIi8+PC9hPgorCQkJPC94c2w6b3RoZXJ3aXNlPgorCQkJPC94c2w6Y2hvb3NlPgorCQkJPGJyIC8+PGJyIC8+CisJCTwvdGQ+CisJCTx0ZD4KKwkJCTx0YWJsZT4KKwkJCQk8eHNsOmlmIHRlc3Q9IkBvcyI+CisJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5PcGVyYXRpbmcgU3lzdGVtczo8L3RkPgorCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9zIi8+PC90ZD4KKwkJCQkJPC90cj4KKwkJCQk8L3hzbDppZj4KKwkJCQk8eHNsOmlmIHRlc3Q9IkB3cyI+CisJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5XaW5kb3dzIFN5c3RlbXM6PC90ZD4KKwkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3cyIvPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJPC94c2w6aWY+CisJCQkJPHhzbDppZiB0ZXN0PSJAbmwiPgorCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+TGFuZ3VhZ2VzOjwvdGQ+CisJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmwiLz48L3RkPgorCQkJCQk8L3RyPgorCQkJCTwveHNsOmlmPgorCQkJCTx4c2w6aWYgdGVzdD0iQGFyY2giPgorCQkJCQk8dHI+PHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+QXJjaGl0ZWN0dXJlOjwvdGQ+CisJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJjaCIvPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJPC94c2w6aWY+CisJCQk8L3RhYmxlPgorCQk8L3RkPgorCTwvdHI+CisJPC94c2w6Zm9yLWVhY2g+CisJPC94c2w6d2hlbj4KKwk8eHNsOm90aGVyd2lzZT4KKwk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSI+CisJPHhzbDpzb3J0IHNlbGVjdD0iQGlkIiBvcmRlcj0iYXNjZW5kaW5nIiBjYXNlLW9yZGVyPSJ1cHBlci1maXJzdCIvPgorCTx4c2w6c29ydCBzZWxlY3Q9IkB2ZXJzaW9uIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgorCTx0cj4KKwkJPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudChwcmVjZWRpbmctc2libGluZzo6ZmVhdHVyZVtub3QoY2F0ZWdvcnkpXSkgbW9kIDIgPSAxIj4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmRhcmstcm93PC94c2w6YXR0cmlidXRlPgorCQk8L3hzbDp3aGVuPgorCQk8eHNsOm90aGVyd2lzZT4KKwkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmxpZ2h0LXJvdzwveHNsOmF0dHJpYnV0ZT4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCQk8L3hzbDpjaG9vc2U+CisJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPgorCQkJPHhzbDpjaG9vc2U+CisJCQk8eHNsOndoZW4gdGVzdD0iQGxhYmVsIj4KKwkJCQk8YSBocmVmPSJ7QHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz48L2E+CisJCQkJPGJyIC8+CisJCQkJPGRpdiBpZD0iaW5kZW50Ij4KKwkJCQkoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmVyc2lvbiIvPikKKwkJCQk8L2Rpdj4KKwkJCTwveHNsOndoZW4+CisJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQk8YSBocmVmPSJ7QHVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZlcnNpb24iLz48L2E+CisJCQk8L3hzbDpvdGhlcndpc2U+CisJCQk8L3hzbDpjaG9vc2U+CisJCQk8YnIgLz48YnIgLz4KKwkJPC90ZD4KKwkJPHRkPgorCQkJPHRhYmxlPgorCQkJCTx4c2w6aWYgdGVzdD0iQG9zIj4KKwkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPk9wZXJhdGluZyBTeXN0ZW1zOjwvdGQ+CisJCQkJCTx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3MiLz48L3RkPgorCQkJCQk8L3RyPgorCQkJCTwveHNsOmlmPgorCQkJCTx4c2w6aWYgdGVzdD0iQHdzIj4KKwkJCQkJPHRyPjx0ZCBjbGFzcz0ibG9nLXRleHQiIGlkPSJpbmRlbnQiPldpbmRvd3MgU3lzdGVtczo8L3RkPgorCQkJCQk8dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHdzIi8+PC90ZD4KKwkJCQkJPC90cj4KKwkJCQk8L3hzbDppZj4KKwkJCQk8eHNsOmlmIHRlc3Q9IkBubCI+CisJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5MYW5ndWFnZXM6PC90ZD4KKwkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBubCIvPjwvdGQ+CisJCQkJCTwvdHI+CisJCQkJPC94c2w6aWY+CisJCQkJPHhzbDppZiB0ZXN0PSJAYXJjaCI+CisJCQkJCTx0cj48dGQgY2xhc3M9ImxvZy10ZXh0IiBpZD0iaW5kZW50Ij5BcmNoaXRlY3R1cmU6PC90ZD4KKwkJCQkJPHRkIGNsYXNzPSJsb2ctdGV4dCIgaWQ9ImluZGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcmNoIi8+PC90ZD4KKwkJCQkJPC90cj4KKwkJCQk8L3hzbDppZj4KKwkJCTwvdGFibGU+CisJCTwvdGQ+CisJPC90cj4KKwk8L3hzbDpmb3ItZWFjaD4KKwk8L3hzbDpvdGhlcndpc2U+CisJPC94c2w6Y2hvb3NlPgorCTwvdGFibGU+CisJPC9ib2R5PgorCTwvaHRtbD4KKzwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZWNsaXBzZS1wcm9qZWN0cy9vcmcudGVzdG5nLmVjbGlwc2UvLnByb2plY3QgYi9lY2xpcHNlLXByb2plY3RzL29yZy50ZXN0bmcuZWNsaXBzZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU2OTAwCi0tLSAvZGV2L251bGwKKysrIGIvZWNsaXBzZS1wcm9qZWN0cy9vcmcudGVzdG5nLmVjbGlwc2UvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLnRlc3RuZy5mZWF0dXJlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZWNsaXBzZS1wcm9qZWN0cy9vcmcudGVzdG5nLmVjbGlwc2UvYnVpbGQucHJvcGVydGllcyBiL2VjbGlwc2UtcHJvamVjdHMvb3JnLnRlc3RuZy5lY2xpcHNlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmOTNhOQotLS0gL2Rldi9udWxsCisrKyBiL2VjbGlwc2UtcHJvamVjdHMvb3JnLnRlc3RuZy5lY2xpcHNlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL2VjbGlwc2UtcHJvamVjdHMvb3JnLnRlc3RuZy5lY2xpcHNlL2ZlYXR1cmUueG1sIGIvZWNsaXBzZS1wcm9qZWN0cy9vcmcudGVzdG5nLmVjbGlwc2UvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwMzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2VjbGlwc2UtcHJvamVjdHMvb3JnLnRlc3RuZy5lY2xpcHNlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMjMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcudGVzdG5nLmZlYXR1cmUiCisgICAgICBsYWJlbD0iVGVzdE5HIgorICAgICAgdmVyc2lvbj0iNS44LjAuMiIKKyAgICAgIHByb3ZpZGVyLW5hbWU9IkNlZHJpYyBCZXVzdCI+CisKKyAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly90ZXN0bmcub3JnIj4KKyAgICAgIFRoaXMgaXMgdGhlIEVjbGlzZSBwbHVnLWluIGZvciBUZXN0TkcgKGh0dHA6Ly90ZXN0bmcub3JnKS4KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+CisgICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQorICAgPC9jb3B5cmlnaHQ+CisKKyAgIDxsaWNlbnNlPgorICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAmcXVvdDtMaWNlbnNlJnF1b3Q7IHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAmcXVvdDtMaWNlbnNvciZxdW90OyBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgJnF1b3Q7TGVnYWwgRW50aXR5JnF1b3Q7IHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAmcXVvdDtjb250cm9sJnF1b3Q7IG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAmcXVvdDtZb3UmcXVvdDsgKG9yICZxdW90O1lvdXImcXVvdDspIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICZxdW90O1NvdXJjZSZxdW90OyBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICZxdW90O09iamVjdCZxdW90OyBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAmcXVvdDtXb3JrJnF1b3Q7IHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgJnF1b3Q7RGVyaXZhdGl2ZSBXb3JrcyZxdW90OyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAmcXVvdDtzdWJtaXR0ZWQmcXVvdDsKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICZxdW90O05vdCBhIENvbnRyaWJ1dGlvbi4mcXVvdDsKKworICAgICAgJnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICZxdW90O05PVElDRSZxdW90OyB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAmcXVvdDtbXSZxdW90OworICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbiZhcG9zO3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAmcXVvdDtwcmludGVkIHBhZ2UmcXVvdDsgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICZxdW90O0xpY2Vuc2UmcXVvdDspOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSB1cmw9Imh0dHA6Ly9iZXVzdC5jb20vZWNsaXBzZSIvPgorICAgPC91cmw+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcudGVzdG5nLmVjbGlwc2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZ3JhZGxlL2J1aWxkV2l0aFRyYXZpcy5zaCBiL2dyYWRsZS9idWlsZFdpdGhUcmF2aXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwZGRmMQotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS9idWlsZFdpdGhUcmF2aXMuc2gKQEAgLTAsMCArMSBAQAorLi4vZ3JhZGxldyBjaGVjawpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3B1Ymxpc2hpbmctamNlbnRlci5ncmFkbGUgYi9ncmFkbGUvcHVibGlzaGluZy1qY2VudGVyLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzlhNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3B1Ymxpc2hpbmctamNlbnRlci5ncmFkbGUKQEAgLTAsMCArMSw3MCBAQAorLy8KKy8vIEFydGlmYWN0b3J5CisvLyAuL2dyYWRsZXcgYXJ0aWZhY3RvcnlQdWJsaXNoICh1cGxvYWQgc25hcHNob3QgdG8gamZyb2cpCisvLyAuL2dyYWRsZXcgYmludHJheVVwbG9hZCAodXBsb2FkIHJlbGVhc2UgdG8gSkNlbnRlcikKKy8vCisKK2FwcGx5IHBsdWdpbjogJ2NvbS5qZnJvZy5iaW50cmF5JworYXBwbHkgcGx1Z2luOiAnY29tLmpmcm9nLmFydGlmYWN0b3J5JworCitQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpCit0cnkgeworICAgIHByb3BlcnRpZXMubG9hZChwcm9qZWN0LnJvb3RQcm9qZWN0LmZpbGUoJ2xvY2FsLnByb3BlcnRpZXMnKS5uZXdEYXRhSW5wdXRTdHJlYW0oKSkKK30gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpIHt9CisKK2dyb3VwID0gJ29yZy50ZXN0bmcnCisKK2JpbnRyYXkgeworICAgIHVzZXIgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJiaW50cmF5LnVzZXIiKQorICAgIGtleSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImJpbnRyYXkuYXBpa2V5IikKKyAgICBwdWJsaWNhdGlvbnMgPSBbJ21hdmVuQ3VzdG9tJ10KKyAgICAvLyBXaXRob3V0IHRoaXMsIGphdmFkb2NzIGRvbid0IGdldCB1cGxvYWRlZAorICAgIGNvbmZpZ3VyYXRpb25zID0gWydhcmNoaXZlcyddCisgICAgcGtnIHsKKyAgICAgICAgcmVwbyA9ICdtYXZlbicKKyAgICAgICAgbmFtZSA9ICd0ZXN0bmcnCisgICAgICAgIGRlc2MgPSAnVGVzdGluZyBmcmFtZXdvcmsgZm9yIEphdmEnCisgICAgICAgIGxpY2Vuc2VzID0gWydBcGFjaGUtMi4wJ10KKyAgICAgICAgbGFiZWxzID0gWyd0ZXN0bmcnXQorCisgICAgICAgIHZlcnNpb24geworICAgICAgICAgICAgbmFtZSA9IHByb2plY3QudmVyc2lvbiAvL0JpbnRyYXkgbG9naWNhbCB2ZXJzaW9uIG5hbWUKKyAgICAgICAgICAgIGdwZyB7CisgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCAuYXNjIGZpbGVzIGRvbid0IGdldCBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICBzaWduID0gdHJ1ZQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9Cit9CisKK2FydGlmYWN0b3J5IHsKKyAgICBkZWYgYV91c2VyID0gaGFzUHJvcGVydHkoJ2FydGlmYWN0b3J5X3VzZXInKSA/IGFydGlmYWN0b3J5X3VzZXIgOiBTeXN0ZW0uZ2V0ZW52KCdhcnRpZmFjdG9yeV91c2VyJykKKyAgICBkZWYgYV9wYXNzd29yZCA9IGhhc1Byb3BlcnR5KCdhcnRpZmFjdG9yeV9wYXNzd29yZCcpID8gYXJ0aWZhY3RvcnlfcGFzc3dvcmQgOiBTeXN0ZW0uZ2V0ZW52KCdhcnRpZmFjdG9yeV9wYXNzd29yZCcpCisgICAgZGVmIGFfY29udGV4dFVybCA9IGhhc1Byb3BlcnR5KCdhcnRpZmFjdG9yeV9jb250ZXh0VXJsJykgPyBhcnRpZmFjdG9yeV9wYXNzd29yZCA6IFN5c3RlbS5nZXRlbnYoJ2FydGlmYWN0b3J5X2NvbnRleHRVcmwnKQorCisgICAgY29udGV4dFVybCA9ICIke2FfY29udGV4dFVybH0iCisgICAgLy9UaGUgYmFzZSBBcnRpZmFjdG9yeSBVUkwgaWYgbm90IG92ZXJyaWRkZW4gYnkgdGhlIHB1Ymxpc2hlci9yZXNvbHZlcgorICAgIHB1Ymxpc2ggeworICAgICAgICByZXBvc2l0b3J5IHsKKyAgICAgICAgICAgIHJlcG9LZXkgPSAnb3NzLXNuYXBzaG90LWxvY2FsJworICAgICAgICAgICAgdXNlcm5hbWUgPSAiJHthX3VzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQgPSAiJHthX3Bhc3N3b3JkfSIKKyAgICAgICAgICAgIG1hdmVuID0gdHJ1ZQorCisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdHMgeworICAgICAgICAgICAgcHVibGljYXRpb25zKCdtYXZlbkN1c3RvbScpCisgICAgICAgIH0KKworICAgIH0KKyAgICByZXNvbHZlIHsKKyAgICAgICAgcmVwb3NpdG9yeSB7CisgICAgICAgICAgICByZXBvS2V5ID0gJ2xpYnMtc25hcHNob3QnCisgICAgICAgICAgICB1c2VybmFtZSA9ICIke2FfdXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZCA9ICIke2FfcGFzc3dvcmR9IgorICAgICAgICAgICAgbWF2ZW4gPSB0cnVlCisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYWRsZS9wdWJsaXNoaW5nLW1hdmVuLmdyYWRsZSBiL2dyYWRsZS9wdWJsaXNoaW5nLW1hdmVuLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDczY2EwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3B1Ymxpc2hpbmctbWF2ZW4uZ3JhZGxlCkBAIC0wLDAgKzEsODcgQEAKKy8vCisvLyBQdWJsaXNoIHRvIE1hdmVuIENlbnRyYWwKKy8vCisKK2FwcGx5IHBsdWdpbjogJ21hdmVuLXB1Ymxpc2gnCithcHBseSBwbHVnaW46ICdtYXZlbicKKworYXBwbHkgcGx1Z2luOiAnaW8uY29kZWFydGUubmV4dXMtc3RhZ2luZycKKworbmV4dXNTdGFnaW5nIHsKKyAgICBwYWNrYWdlR3JvdXAgJ29yZy50ZXN0bmcnCisgICAgdXNlcm5hbWUgU3lzdGVtLmdldGVudignU09OQVRZUEVfVVNFUicpCisgICAgcGFzc3dvcmQgU3lzdGVtLmdldGVudignU09OQVRZUEVfUEFTU1dPUkQnKQorfQorCitqYXZhZG9jIHsKKyAgICBmYWlsT25FcnJvciBmYWxzZQorfQorCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7IGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQorCitwdWJsaXNoaW5nIHsKKyAgICBwdWJsaWNhdGlvbnMgeworICAgICAgICBtYXZlbkN1c3RvbShNYXZlblB1YmxpY2F0aW9uKSB7CisgICAgICAgICAgICBmcm9tIGNvbXBvbmVudHMuamF2YQorICAgICAgICAgICAgYXJ0aWZhY3Qgc291cmNlc0phcgorCisgICAgICAgICAgICBncm91cElkICdvcmcudGVzdG5nJworICAgICAgICAgICAgYXJ0aWZhY3RJZCAndGVzdG5nJworICAgICAgICAgICAgdmVyc2lvbiBwcm9qZWN0LnZlcnNpb24KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLi9ncmFkbGV3IHVwbG9hZEFyY2hpdmVzICh1cGxvYWQgc25hcHNob3QgdG8gTWF2ZW4gQ2VudHJhbCdzIHNuYXBzaG90IHJlcG8pCit1cGxvYWRBcmNoaXZlcyB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW5EZXBsb3llciB7CisgICAgICAgICAgICBiZWZvcmVEZXBsb3ltZW50IHsgTWF2ZW5EZXBsb3ltZW50IGRlcGxveW1lbnQgLT4gc2lnbmluZy5zaWduUG9tKGRlcGxveW1lbnQpIH0KKworICAgICAgICAgICAgcmVwb3NpdG9yeSh1cmw6ICJodHRwczovL29zcy5zb25hdHlwZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIiKSB7CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24odXNlck5hbWU6IFN5c3RlbS5nZXRlbnYoJ1NPTkFUWVBFX1VTRVInKSwgcGFzc3dvcmQ6IFN5c3RlbS5nZXRlbnYoJ1NPTkFUWVBFX1BBU1NXT1JEJykpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbmFwc2hvdFJlcG9zaXRvcnkodXJsOiAiaHR0cHM6Ly9vc3Muc29uYXR5cGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3NuYXBzaG90cyIpIHsKKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbih1c2VyTmFtZTogU3lzdGVtLmdldGVudignU09OQVRZUEVfVVNFUicpLCBwYXNzd29yZDogU3lzdGVtLmdldGVudignU09OQVRZUEVfUEFTU1dPUkQnKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbSB7CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHByb2plY3QudmVyc2lvbgorICAgICAgICAgICAgICAgIGFydGlmYWN0SWQgPSAndGVzdG5nJworICAgICAgICAgICAgICAgIGdyb3VwSWQgPSAnb3JnLnRlc3RuZycKKyAgICAgICAgICAgICAgICBwcm9qZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBwcm9qZWN0Lm5hbWUKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gJ1Rlc3RpbmcgZnJhbWV3b3JrIGZvciBKYXZhJworICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHA6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmcnCisgICAgICAgICAgICAgICAgICAgIHNjbSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nLmdpdCcKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6Z2l0QGdpdGh1Yi5jb206Y2JldXN0L3Rlc3RuZy5naXQnCisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgJ2h0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nLmdpdCcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsaWNlbnNlcyB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uICdyZXBvJworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRldmVsb3BlcnMgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcGVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9ICdjYmV1c3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICdDZWRyaWMgQmV1c3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwgPSAnY2VkcmljQGJldXN0LmNvbScKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordXBsb2FkQXJjaGl2ZXMuZG9MYXN0IHsKKyAgICBpZiAoISB2ZXJzaW9uLmNvbnRhaW5zKCJTTkFQU0hPVCIpKSB7CisgICAgICAgIHByaW50bG4oIk5vdyBnbyB0byBodHRwczovL29zcy5zb25hdHlwZS5vcmcvaW5kZXguaHRtbCNzdGFnaW5nUmVwb3NpdG9yaWVzIHRvIGNsb3NlIiArCisgICAgICAgICAgICAgICAgIiBhbmQgcHVibGlzaCB0aGUgZGlzdHJpYnV0aW9uIikKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzRlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSw1NyBAQAoraW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0CisKK2FwcGx5IHBsdWdpbjogJ3NpZ25pbmcnCisKK0RhdGUgYnVpbGRUaW1lQW5kRGF0ZSA9IG5ldyBEYXRlKCkKK2V4dCB7CisgICAgYnVpbGRUaW1lID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoJ3l5eXktTU0tZGQnKS5mb3JtYXQoYnVpbGRUaW1lQW5kRGF0ZSkKKyAgICBidWlsZERhdGUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgnSEg6bW06c3MuU1NTWicpLmZvcm1hdChidWlsZFRpbWVBbmREYXRlKQorfQorCitqYXIgeworICAgIG1hbmlmZXN0IHsKKyAgICAgICAgYXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAnQnVpbHQtQnknOiBTeXN0ZW0ucHJvcGVydGllc1sndXNlci5uYW1lJ10sCisgICAgICAgICAgICAgICAgJ0NyZWF0ZWQtQnknOiBTeXN0ZW0ucHJvcGVydGllc1snamF2YS52ZXJzaW9uJ10gKyAiICgiICsgU3lzdGVtLnByb3BlcnRpZXNbJ2phdmEudmVuZG9yJ10gKyAiICIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpICsgIikiLAorICAgICAgICAgICAgICAgICdCdWlsZC1EYXRlJzogcHJvamVjdC5idWlsZFRpbWUsCisgICAgICAgICAgICAgICAgJ0J1aWxkLVRpbWUnOiBwcm9qZWN0LmJ1aWxkRGF0ZSwKKyAgICAgICAgICAgICAgICAnU3BlY2lmaWNhdGlvbi1UaXRsZSc6IHByb2plY3QubmFtZSwKKyAgICAgICAgICAgICAgICAnU3BlY2lmaWNhdGlvbi1WZXJzaW9uJzogcHJvamVjdC52ZXJzaW9uLAorICAgICAgICApCisgICAgfQorfQorCitqYXZhZG9jIHsKKyAgICBmYWlsT25FcnJvciBmYWxzZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBjbGFzc2lmaWVyID0gJ2phdmFkb2MnCisgICAgZnJvbSAnYnVpbGQvZG9jcy9qYXZhZG9jJworfQorCit0YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyKSB7CisgICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCisgICAgY2xhc3NpZmllciA9ICdzb3VyY2VzJworfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIGphcgorICAgIGFyY2hpdmVzIGphdmFkb2NKYXIKKyAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCit9CisKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBqY2VudGVyKCkKKworICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICAvL0NoZWNrIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24gaGVyZTogaHR0cDovL3BsdWdpbnMuZ3JhZGxlLm9yZy9wbHVnaW4vY29tLmpmcm9nLmFydGlmYWN0b3J5CisgICAgICAgIGNsYXNzcGF0aCAib3JnLmpmcm9nLmJ1aWxkaW5mbzpidWlsZC1pbmZvLWV4dHJhY3Rvci1ncmFkbGU6My4wLjMiCisgICAgfQorfQorCithcHBseSBmcm9tOiAnZ3JhZGxlL3B1Ymxpc2hpbmctbWF2ZW4uZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9wdWJsaXNoaW5nLWpjZW50ZXIuZ3JhZGxlJworCmRpZmYgLS1naXQgYS9ncmFkbGUvdXBsb2FkU25hcHNob3Quc2ggYi9ncmFkbGUvdXBsb2FkU25hcHNob3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGUzNjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS91cGxvYWRTbmFwc2hvdC5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKworZWNobyAiVFJBVklTX0hES19IT01FIiAkVFJBVklTX0pES19IT01FCisKK2lmIFsgJFRSQVZJU19KREtfSE9NRSA9PSAnb3JhY2xlamRrNycgXQordGhlbgorICBlY2hvICJVcGxvYWRpbmcgc25hcHNob3QiCisgIC4vZ3JhZGxldyB1cGxvYWRBcmNoaXZlcworZWxzZQorICBlY2hvICJDdXJyZW50IEpESyBpcyAke1RSQVZJU19KREtfSE9NRX0sIG5vdCB1cGxvYWRpbmcgc25hcHNob3QiCitmaQorCmRpZmYgLS1naXQgYS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1YTFjZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzBkNTZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKKyNTdW4gTWF5IDEwIDE1OjIyOjA4IFBEVCAyMDE1CitkaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cworemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKK3ppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS0yLjUtYmluLnppcApkaWZmIC0tZ2l0IGEvZ3JhZGxldyBiL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTFhN2UyNgotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZXcKQEAgLTAsMCArMSwxNjQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgKKyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoICkgeworICAgIGVjaG8gIiQqIgorfQorCitkaWUgKCApIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7Citlc2FjCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZC4KK2lmICRjeWd3aW4gOyB0aGVuCisgICAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKK2ZpCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPiYtCitBUFBfSE9NRT0iYHB3ZCAtUGAiCitjZCAiJFNBVkVEIiA+Ji0KKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorCisgICAgIyBXZSBidWlsZCB0aGUgcGF0dGVybiBmb3IgYXJndW1lbnRzIHRvIGJlIGNvbnZlcnRlZCB2aWEgY3lncGF0aAorICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKKyAgICBTRVA9IiIKKyAgICBmb3IgZGlyIGluICRST09URElSU1JBVyA7IGRvCisgICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKKyAgICAgICAgU0VQPSJ8IgorICAgIGRvbmUKKyAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKKyAgICAjIEFkZCBhIHVzZXItZGVmaW5lZCBwYXR0ZXJuIHRvIHRoZSBjeWdwYXRoIGFyZ3VtZW50cworICAgIGlmIFsgIiRHUkFETEVfQ1lHUEFUVEVSTiIgIT0gIiIgXSA7IHRoZW4KKyAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCisgICAgZmkKKyAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKKyAgICBpPTAKKyAgICBmb3IgYXJnIGluICIkQCIgOyBkbworICAgICAgICBDSEVDSz1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIiRPVVJDWUdQQVRURVJOIiAtYAorICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KKworICAgICAgICBpZiBbICRDSEVDSyAtbmUgMCBdICYmIFsgJENIRUNLMiAtZXEgMCBdIDsgdGhlbiAgICAgICAgICAgICAgICAgICAgIyMjIEFkZGVkIGEgY29uZGl0aW9uCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9IlwiJGFyZ1wiIgorICAgICAgICBmaQorICAgICAgICBpPSQoKGkrMSkpCisgICAgZG9uZQorICAgIGNhc2UgJGkgaW4KKyAgICAgICAgKDApIHNldCAtLSA7OworICAgICAgICAoMSkgc2V0IC0tICIkYXJnczAiIDs7CisgICAgICAgICgyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsKKyAgICAgICAgKDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OworICAgICAgICAoNCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiIDs7CisgICAgICAgICg1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsKKyAgICAgICAgKDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OworICAgICAgICAoNykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiIDs7CisgICAgICAgICg4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsKKyAgICAgICAgKDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OworICAgIGVzYWMKK2ZpCisKKyMgU3BsaXQgdXAgdGhlIEpWTV9PUFRTIEFuZCBHUkFETEVfT1BUUyB2YWx1ZXMgaW50byBhbiBhcnJheSwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2Z1bmN0aW9uIHNwbGl0SnZtT3B0cygpIHsKKyAgICBKVk1fT1BUUz0oIiRAIikKK30KK2V2YWwgc3BsaXRKdm1PcHRzICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTCitKVk1fT1BUU1skeyNKVk1fT1BUU1sqXX1dPSItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRSIKKworZXhlYyAiJEpBVkFDTUQiICIke0pWTV9PUFRTW0BdfSIgLWNsYXNzcGF0aCAiJENMQVNTUEFUSCIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICIkQCIKZGlmZiAtLWdpdCBhL2dyYWRsZXcuYmF0IGIvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwYjI4MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsOTAgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wCitzZXQgQVBQX0hPTUU9JURJUk5BTUUlCisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3ogdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKK2lmICIlQGV2YWxbMisyXSIgPT0gIjQiIGdvdG8gNE5UX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKK2dvdG8gZXhlY3V0ZQorCis6NE5UX2FyZ3MKK0ByZW0gR2V0IGFyZ3VtZW50cyBmcm9tIHRoZSA0TlQgU2hlbGwgZnJvbSBKUCBTb2Z0d2FyZQorc2V0IENNRF9MSU5FX0FSR1M9JSQKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9rb2JhbHQvc3JjL0J1aWxkLmt0IGIva29iYWx0L3NyYy9CdWlsZC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJjYjIyCi0tLSAvZGV2L251bGwKKysrIGIva29iYWx0L3NyYy9CdWlsZC5rdApAQCAtMCwwICsxLDY0IEBACisKK2ltcG9ydCBjb20uYmV1c3Qua29iYWx0LlRhc2tSZXN1bHQKK2ltcG9ydCBjb20uYmV1c3Qua29iYWx0LmFwaS5Qcm9qZWN0CitpbXBvcnQgY29tLmJldXN0LmtvYmFsdC5hcGkuYW5ub3RhdGlvbi5UYXNrCitpbXBvcnQgY29tLmJldXN0LmtvYmFsdC5wbHVnaW4uamF2YS5qYXZhUHJvamVjdAoraW1wb3J0IGNvbS5iZXVzdC5rb2JhbHQucGx1Z2luLnBhY2thZ2luZy5hc3NlbWJsZQoraW1wb3J0IGNvbS5iZXVzdC5rb2JhbHQucGx1Z2lucworaW1wb3J0IGNvbS5iZXVzdC5rb2JhbHQudGVzdAoraW1wb3J0IGphdmEuaW8uRmlsZQorCisvL2ltcG9ydCBjb20uYmV1c3Qua29iYWx0LnBsdWdpbi5saW5lY291bnQuKgorCit2YWwgVkVSU0lPTiA9ICI2LjkuMTAtU05BUFNIT1QiCisKKy8vdmFsIHBsdWdpbnMgPSBwbHVnaW5zKCJjb20uYmV1c3Qua29iYWx0OmtvYmFsdC1saW5lLWNvdW50OjAuMTciKQorCit2YWwgcCA9IGphdmFQcm9qZWN0IHsKKworLy8gICAgbGluZQorICAgIG5hbWUgPSAidGVzdG5nIgorICAgIGdyb3VwID0gIm9yZy50ZXN0bmciCisgICAgYXJ0aWZhY3RJZCA9IG5hbWUKKyAgICB2ZXJzaW9uID0gVkVSU0lPTgorCisgICAgc291cmNlRGlyZWN0b3JpZXMgeworICAgICAgICBwYXRoKCJzcmMvZ2VuZXJhdGVkL2phdmEiKQorICAgIH0KKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNvbXBpbGUoImNvbS5iZXVzdDpqY29tbWFuZGVyOjEuNDgiLAorICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLmluamVjdDpndWljZTo0LjAiLAorICAgICAgICAgICAgICAgICJqdW5pdDpqdW5pdDo0LjEwIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5hbnQ6YW50OjEuNy4wIiwKKyAgICAgICAgICAgICAgICAib3JnLmJlYW5zaGVsbDpic2g6Mi4wYjQiLAorICAgICAgICAgICAgICAgICJvcmcueWFtbDpzbmFrZXlhbWw6MS4xNSIpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzVGVzdCB7CisgICAgICAgIGNvbXBpbGUoIm9yZy5hc3NlcnRqOmFzc2VydGotY29yZToyLjAuMCIsCisgICAgICAgICAgICAgICAgIm9yZy50ZXN0bmc6dGVzdG5nOjYuOS45IikKKyAgICB9CisKKyAgICB0ZXN0IHsKKyAgICAgICAganZtQXJncygiLUR0ZXN0LnJlc291cmNlcy5kaXI9c3JjL3Rlc3QvcmVzb3VyY2VzIikKKyAgICB9CisKKyAgICBhc3NlbWJsZSB7CisgICAgICAgIGphciB7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0BUYXNrKG5hbWUgPSAiY3JlYXRlVmVyc2lvbiIsIHJ1bkJlZm9yZSA9IGFycmF5T2YoImNvbXBpbGUiKSwgcnVuQWZ0ZXIgPSBhcnJheU9mKCJjbGVhbiIpLCBkZXNjcmlwdGlvbiA9ICIiKQorZnVuIHRhc2tDcmVhdGVWZXJzaW9uKHByb2plY3Q6IFByb2plY3QpIDogVGFza1Jlc3VsdCB7CisgICAgdmFsIHBhdGggPSAib3JnL3Rlc3RuZy9pbnRlcm5hbCIKKyAgICB3aXRoKGFycmF5TGlzdE9mPFN0cmluZz4oKSkgeworICAgICAgICBGaWxlKCJzcmMvbWFpbi9yZXNvdXJjZXMvJHBhdGgvVmVyc2lvblRlbXBsYXRlSmF2YSIpLmZvckVhY2hMaW5lIHsKKyAgICAgICAgICAgIGFkZChpdC5yZXBsYWNlKCJAdmVyc2lvbkAiLCBWRVJTSU9OKSkKKyAgICAgICAgfQorICAgICAgICBGaWxlKCJzcmMvZ2VuZXJhdGVkL2phdmEvJHBhdGgvVmVyc2lvbi5qYXZhIikud3JpdGVUZXh0KGpvaW5Ub1N0cmluZygiXG4iKSkKKyAgICB9CisgICAgcmV0dXJuIFRhc2tSZXN1bHQoKQorfQorCmRpZmYgLS1naXQgYS9rb2JhbHQvd3JhcHBlci9rb2JhbHQtd3JhcHBlci5qYXIgYi9rb2JhbHQvd3JhcHBlci9rb2JhbHQtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzZGM4MQotLS0gL2Rldi9udWxsCisrKyBiL2tvYmFsdC93cmFwcGVyL2tvYmFsdC13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9rb2JhbHQvd3JhcHBlci9rb2JhbHQtd3JhcHBlci5wcm9wZXJ0aWVzIGIva29iYWx0L3dyYXBwZXIva29iYWx0LXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODExYmIzCi0tLSAvZGV2L251bGwKKysrIGIva29iYWx0L3dyYXBwZXIva29iYWx0LXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxIEBACitrb2JhbHQudmVyc2lvbj0wLjMzMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2tvYmFsdHcgYi9rb2JhbHR3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZDIyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9rb2JhbHR3CkBAIC0wLDAgKzEsMiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAoramF2YSAtamFyICQoZGlybmFtZSAkMCkva29iYWx0L3dyYXBwZXIva29iYWx0LXdyYXBwZXIuamFyICQqCmRpZmYgLS1naXQgYS9saWItc3VwcGxpZWQvZ3VpY2UtMi4wLmphciBiL2xpYi1zdXBwbGllZC9ndWljZS0yLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDFhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWItc3VwcGxpZWQvZ3VpY2UtMi4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWItc3VwcGxpZWQvamFyamFyLWlzc3VlLTIxLmphciBiL2xpYi1zdXBwbGllZC9qYXJqYXItaXNzdWUtMjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTYyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWItc3VwcGxpZWQvamFyamFyLWlzc3VlLTIxLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbi9idWlsZC13aXRoLW1hdmVuIGIvbWF2ZW4vYnVpbGQtd2l0aC1tYXZlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI5M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4vYnVpbGQtd2l0aC1tYXZlbgpAQCAtMCwwICsxLDEzIEBACittdm4gY2xlYW4gaW5zdGFsbCAtRGdwZy5za2lwPXRydWUKKyNvciBpZiB5b3Ugd2FudCB0byBzaWduIHRoZSBqYXIsIHVuY29tbWVudCB0aGlzOgorI212biBjbGVhbiBpbnN0YWxsCisKK2VjaG8KK2VjaG8gIlRvIGRlcGxveSB0byB0aGUgc25hcHNob3QgcmVwb3NpdG9yeTogbXZuIGRlcGxveSIKK2VjaG8gIlRvIGRlcGxveSB0byB0aGUgcmVsZWFzZSBkaXJlY3Rvcnk6IG12biByZWxlYXNlOmNsZWFuIHJlbGVhc2U6cHJlcGFyZSByZWxlYXNlOnBlcmZvcm0iCitlY2hvICJOZXh1cyBVSTogIGh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9pbmRleC5odG1sIgorZWNobyAiV2lraTogaHR0cHM6Ly9kb2NzLnNvbmF0eXBlLm9yZy9kaXNwbGF5L1JlcG9zaXRvcnkvU29uYXR5cGUrT1NTK01hdmVuK1JlcG9zaXRvcnkrVXNhZ2UrR3VpZGUiCisKKyMgZGVwbG95IHdpdGhvdXQgdGFnZ2luZzogbXZuIGRlcGxveSAtRHBlcmZvcm1SZWxlYXNlCisKKwpkaWZmIC0tZ2l0IGEvbWF2ZW4vYnVuZGxlLXBvbS54bWwgYi9tYXZlbi9idW5kbGUtcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY5ZDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4vYnVuZGxlLXBvbS54bWwKQEAgLTAsMCArMSw1OSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8IS0tCisgICAgVGhpcyBQT00gY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgVGVzdE5HOyBpdCBzaG91bGQgb25seSBiZSB1c2VkIGFzIHBhcnQgb2YgYSBNYXZlbgorICAgIHJlcG9zaXRvcnkgdXBsb2FkIGJ1bmRsZS4KKyAgICAKKyAgICBTZWUgdGhlIGd1aWRlIHRvIGNyZWF0aW5nIGEgYnVuZGxlIGhlcmU6CisgICAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL21pbmkvZ3VpZGUtY2VudHJhbC1yZXBvc2l0b3J5LXVwbG9hZC5odG1sCisgICAgLS0+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxncm91cElkPm9yZy50ZXN0bmc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPlRlc3RORzwvbmFtZT4KKyAgICA8dmVyc2lvbj41LjEyLjE8L3ZlcnNpb24+CisgICAgPGRlc2NyaXB0aW9uPlRlc3RORyBpcyBhIHRlc3RpbmcgZnJhbWV3b3JrIGluc3BpcmVkIGZyb20gSlVuaXQgYW5kIE5Vbml0IGJ1dCBpbnRyb2R1Y2luZyBzb21lIG5ldyBmdW5jdGlvbmFsaXRpZXMgdGhhdCBtYWtlIGl0IG1vcmUgcG93ZXJmdWwgYW5kIGVhc2llciB0byB1c2UuPC9kZXNjcmlwdGlvbj4KKyAgICA8dXJsPmh0dHA6Ly90ZXN0bmcub3JnPC91cmw+CisgICAgCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL2FwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8c2NtPgorICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly90ZXN0bmcuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rLzwvY29ubmVjdGlvbj4KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vdGVzdG5nLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgICAgIDx1cmw+aHR0cDovL3Rlc3RuZy5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bms8L3VybD4KKyAgICA8L3NjbT4KKyAgICAKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS43LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC4xMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5iZWFuc2hlbGw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2g8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjBiNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgIDxhcnRpZmFjdElkPmd1aWNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPiAgICAKKyAgICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2NsYXNzZXMucG5nIGIvcGljdHVyZXMvY2xhc3Nlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNhNzlkMgotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL2NsYXNzZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2NvbnZlcnQxLnBuZyBiL3BpY3R1cmVzL2NvbnZlcnQxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjc5OWJlCi0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvY29udmVydDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2NvbnZlcnQyLnBuZyBiL3BpY3R1cmVzL2NvbnZlcnQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTM0NjUwCi0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvY29udmVydDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2ZhaWx1cmUucG5nIGIvcGljdHVyZXMvZmFpbHVyZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ3YTFkYgotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL2ZhaWx1cmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2dyb3Vwcy5wbmcgYi9waWN0dXJlcy9ncm91cHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5ZmVhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9ncm91cHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2lkZWEtb3V0cHV0LnBuZyBiL3BpY3R1cmVzL2lkZWEtb3V0cHV0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTIwMDRkCi0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvaWRlYS1vdXRwdXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2lkZWEtcnVuZGlhbG9nLnBuZyBiL3BpY3R1cmVzL2lkZWEtcnVuZGlhbG9nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MThkMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvaWRlYS1ydW5kaWFsb2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL2xhdW5jaC5wbmcgYi9waWN0dXJlcy9sYXVuY2gucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1NmIzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9sYXVuY2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL25ldy0xLnBuZyBiL3BpY3R1cmVzL25ldy0xLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM2NDc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvbmV3LTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL25ldy0yLnBuZyBiL3BpY3R1cmVzL25ldy0yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkyMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvbmV3LTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL291dGxpbmUucG5nIGIvcGljdHVyZXMvb3V0bGluZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU3YjcwMwotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL291dGxpbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3ByZWZlcmVuY2VzLnBuZyBiL3BpY3R1cmVzL3ByZWZlcmVuY2VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJkOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvcHJlZmVyZW5jZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3Byb2plY3RfcHJvcGVydGllcy5wbmcgYi9waWN0dXJlcy9wcm9qZWN0X3Byb3BlcnRpZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2M5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9wcm9qZWN0X3Byb3BlcnRpZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3JlZmFjdG9yaW5nMS5wbmcgYi9waWN0dXJlcy9yZWZhY3RvcmluZzEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDRhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9yZWZhY3RvcmluZzEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3JlZmFjdG9yaW5nMi5wbmcgYi9waWN0dXJlcy9yZWZhY3RvcmluZzIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWRhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9yZWZhY3RvcmluZzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3NlYXJjaC5wbmcgYi9waWN0dXJlcy9zZWFyY2gucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzY1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9zZWFyY2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3N1Y2Nlc3MucG5nIGIvcGljdHVyZXMvc3VjY2Vzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBjYWQzMAotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL3N1Y2Nlc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3N1aXRlcy5wbmcgYi9waWN0dXJlcy9zdWl0ZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWQ5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9waWN0dXJlcy9zdWl0ZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3N1bW1hcnkxLnBuZyBiL3BpY3R1cmVzL3N1bW1hcnkxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZiN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvc3VtbWFyeTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3N1bW1hcnkyLnBuZyBiL3BpY3R1cmVzL3N1bW1hcnkyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmEwZDEyCi0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvc3VtbWFyeTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3RlbXBsYXRlLnBuZyBiL3BpY3R1cmVzL3RlbXBsYXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDFjOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvdGVtcGxhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3Rlc3RORy1leGVjLnBuZyBiL3BpY3R1cmVzL3Rlc3RORy1leGVjLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTY0Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGljdHVyZXMvdGVzdE5HLWV4ZWMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3Rlc3RORy1ydW4ucG5nIGIvcGljdHVyZXMvdGVzdE5HLXJ1bi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0MDZhOQotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL3Rlc3RORy1ydW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3ZpZXcucG5nIGIvcGljdHVyZXMvdmlldy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzU1MWM0MwotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL3ZpZXcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BpY3R1cmVzL3dwLWluZGV4aXQucGhwIGIvcGljdHVyZXMvd3AtaW5kZXhpdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BpY3R1cmVzL3dwLWluZGV4aXQucGhwCkBAIC0wLDAgKzEsMyBAQAorCisKKwpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNzQzZQotLS0gL2Rldi9udWxsCisrKyBiL3BvbS54bWwKQEAgLTAsMCArMSw0MTkgQEAKKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgPCEtLSBSZWZlciB0byB0aGUgZmlsZSAuL2J1aWxkLXdpdGgtbWF2ZW4gZm9yIGluc3RydWN0aW9uIG9uIGhvdyB0byB1c2UgdGhpcyBwb20ueG1sIC0tPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICA8bmFtZT5UZXN0Tkc8L25hbWU+CisgIDx2ZXJzaW9uPjYuOS4xMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPGRlc2NyaXB0aW9uPlRlc3RORyBpcyBhIHRlc3RpbmcgZnJhbWV3b3JrLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cDovL3Rlc3RuZy5vcmc8L3VybD4KKyAgICAKKyAgPGxpY2Vuc2VzPgorICAgIDxsaWNlbnNlPgorICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvdXJsPgorICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgPC9saWNlbnNlPgorICA8L2xpY2Vuc2VzPgorCisgIDxzY20+CisgICAgPGNvbm5lY3Rpb24+c2NtOmdpdDpnaXRAZ2l0aHViLmNvbTpjYmV1c3QvdGVzdG5nLmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Z2l0OmdpdEBnaXRodWIuY29tOmNiZXVzdC90ZXN0bmcuZ2l0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgIDx1cmw+Z2l0QGdpdGh1Yi5jb206Y2JldXN0L3Rlc3RuZy5naXQ8L3VybD4KKyAgPC9zY20+CisgICAgCisgIDxkZXZlbG9wZXJzPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8bmFtZT5DZWRyaWMgQmV1c3Q8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5vc3M8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+b3NzLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4zPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5iaW50cmF5PC9pZD4KKyAgICAgIDx1cmw+aHR0cHM6Ly9hcGkuYmludHJheS5jb20vbWF2ZW4vY2JldXN0L21hdmVuL3Rlc3RuZzwvdXJsPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNy4wPC92ZXJzaW9uPgorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMTA8L3ZlcnNpb24+CisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYmVhbnNoZWxsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YnNoPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wYjQ8L3ZlcnNpb24+Cis8IS0tCisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorLS0+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmluamVjdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1aWNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4wPC92ZXJzaW9uPgorICAgICAgPGNsYXNzaWZpZXI+bm9fYW9wPC9jbGFzc2lmaWVyPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5iZXVzdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpjb21tYW5kZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjQ4PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworCSAgPGRlcGVuZGVuY3k+CisJICAgIDxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorCSAgICA8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisJICAgIDx2ZXJzaW9uPjEuMTU8L3ZlcnNpb24+CisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisJICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNzZXJ0ai1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4gICAgIAorICAKKyAgPHByb3BlcnRpZXM+CisgIAk8dmVyc2lvbi5idWlsZC5kaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvdmVyc2lvbjwvdmVyc2lvbi5idWlsZC5kaXJlY3Rvcnk+CisgIDwvcHJvcGVydGllcz4KKyAgCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+KiovVmVyc2lvblRlbXBsYXRlSmF2YTwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgIDx0YXJnZXRQYXRoPiR7dmVyc2lvbi5idWlsZC5kaXJlY3Rvcnl9PC90YXJnZXRQYXRoPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisKKyAgICAgIDwhLS0gUmVuYW1lIFZlcnNpb24uamF2YSAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPmNvbS5jb2RlcnBsdXMubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29weS1yZW5hbWUtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKwkJICAgIDxpZD5yZW5hbWUtZmlsZTwvaWQ+CisJCQk8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgorCQkJPGdvYWxzPgorCQkJICA8Z29hbD5yZW5hbWU8L2dvYWw+CisJCQk8L2dvYWxzPgorCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkgIDxzb3VyY2VGaWxlPiR7dmVyc2lvbi5idWlsZC5kaXJlY3Rvcnl9L29yZy90ZXN0bmcvaW50ZXJuYWwvVmVyc2lvblRlbXBsYXRlSmF2YTwvc291cmNlRmlsZT4KKwkJCSAgPGRlc3RpbmF0aW9uRmlsZT4ke3ZlcnNpb24uYnVpbGQuZGlyZWN0b3J5fS9vcmcvdGVzdG5nL2ludGVybmFsL1ZlcnNpb24uamF2YTwvZGVzdGluYXRpb25GaWxlPgorCQkJPC9jb25maWd1cmF0aW9uPgorCQkgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIAorICAgICAgPCEtLSBSZWxlYXNlIGZvciBiaW50cmF5IC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDx1c2VSZWxlYXNlUHJvZmlsZT5mYWxzZTwvdXNlUmVsZWFzZVByb2ZpbGU+CisgICAgICAgICAgPHJlbGVhc2VQcm9maWxlcz5yZWxlYXNlPC9yZWxlYXNlUHJvZmlsZXM+CisgICAgICAgICAgPGF1dG9WZXJzaW9uU3VibW9kdWxlcz50cnVlPC9hdXRvVmVyc2lvblN1Ym1vZHVsZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tIEdlbmVyYXRpbmcgSmF2YWRvYyAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTAuMzwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGZhaWxPbkVycm9yPmZhbHNlPC9mYWlsT25FcnJvcj4KKyAgICAgICAgICA8ZXhjbHVkZVBhY2thZ2VOYW1lcz4qaW50ZXJuYWw8L2V4Y2x1ZGVQYWNrYWdlTmFtZXM+CisgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKyAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBCdW5kbGUgc291cmNlcyAtLT4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+CisgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0gQ29tcGlsYXRpb24gLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuNzwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS43PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tIFJlc291cmNlIGhhbmRsaW5nIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3Mtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuOS4xPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5hZGQtc291cmNlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8c291cmNlcz4KKyAgICAgICAgICAgICAgICA8c291cmNlPiR7dmVyc2lvbi5idWlsZC5kaXJlY3Rvcnl9PC9zb3VyY2U+CisgICAgICAgICAgICAgIDwvc291cmNlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0gT1NHaSBtYW5pZmVzdCBjcmVhdGlvbiAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMS4wPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmJ1bmRsZS1tYW5pZmVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPF92ZXJzaW9ucG9saWN5PiQoQCk8L192ZXJzaW9ucG9saWN5PgorICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgIGJzaC4qO3ZlcnNpb249IlsyLjAuMCwzLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgY29tLmJldXN0Lmpjb21tYW5kZXIuKjt2ZXJzaW9uPSJbMS43LjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgIGNvbS5nb29nbGUuaW5qZWN0Lio7dmVyc2lvbj0iWzEuMiwxLjMpIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgIGp1bml0LmZyYW1ld29yazt2ZXJzaW9uPSJbMy44LjEsIDUuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICBvcmcuanVuaXQuKjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50Lio7dmVyc2lvbj0iWzEuNy4wLCAyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgb3JnLnlhbWwuKjt2ZXJzaW9uPSJbMS42LDIuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgIWNvbS5iZXVzdC50ZXN0bmcsCisgICAgICAgICAgICAgICAgICAhb3JnLnRlc3RuZy4qLAorICAgICAgICAgICAgICAgICAgIWNvbS5zdW4uKiwKKyAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0gQWRkIE9TR2kgbWFuaWZlc3QgaW4gSkFSIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9tYW5pZmVzdEZpbGU+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBUZXN0cyAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjE5PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c3VpdGVYbWxGaWxlcz4KKyAgICAgICAgICAgIDxzdWl0ZVhtbEZpbGU+c3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy54bWw8L3N1aXRlWG1sRmlsZT4KKyAgICAgICAgICA8L3N1aXRlWG1sRmlsZXM+CisgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmxpc3RlbmVyPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+dGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXIuTXlMaXN0ZW5lcjwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICA8dGVzdC5yZXNvdXJjZXMuZGlyPiR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fTwvdGVzdC5yZXNvdXJjZXMuZGlyPgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tIFNpZ25pbmcgd2l0aCBncGcgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNDwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5zaWduLWFydGlmYWN0czwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgPC9wbHVnaW5zPgorCisgIDwvYnVpbGQ+CisKKworICA8cHJvZmlsZXM+CisKKyAgICA8IS0tIGJpbnRyYXkgcHJvZmlsZSAtLT4KKworICAgIDxwcm9maWxlPgorICAgICAgPGlkPmJpbnRyYXk8L2lkPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8ZmFpbE9uRXJyb3I+ZmFsc2U8L2ZhaWxPbkVycm9yPgorICAgICAgICAgICAgICA8ZXhjbHVkZVBhY2thZ2VOYW1lcz4qaW50ZXJuYWw8L2V4Y2x1ZGVQYWNrYWdlTmFtZXM+CisgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+CisgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+Cis8IS0tIAorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAtLT4KKyAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKworICAgIDxwcm9maWxlPgorICAgICAgPCEtLSBXaGVuIGFjdGl2YXRlZCwgZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHNuYXBzaG90IHJlcG8gLS0+CisgICAgICA8aWQ+c25hcHNob3Q8L2lkPgorCisgICAgICA8cmVwb3NpdG9yaWVzPgorICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICA8aWQ+bmV4dXMtc25hcHNob3QtcmVwb3NpdG9yeTwvaWQ+CisgICAgICAgICAgPHVybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzLzwvdXJsPgorICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgICA8L3JlcG9zaXRvcmllcz4KKworICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMTE8L3ZlcnNpb24+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYmVhbnNoZWxsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNoPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4wYjQ8L3ZlcnNpb24+Cis8IS0tCisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorLS0+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgIDxhcnRpZmFjdElkPmd1aWNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLmJldXN0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpjb21tYW5kZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+MS40ODwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAKKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NldHRpbmdzLmdyYWRsZSBiL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFiM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEgQEAKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAndGVzdG5nJwpkaWZmIC0tZ2l0IGEvc2l0ZW1hcC54bWwgYi9zaXRlbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYxMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2l0ZW1hcC54bWwKQEAgLTAsMCArMSw2NCBAQAorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVybHNldCB4bWxucz0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NjaGVtYXMvc2l0ZW1hcC8wLjkwIj4KKyAgPHVybD4KKyAgICA8bG9jPmh0dHA6Ly90ZXN0bmcub3JnL2RvYy9pbmRleC5odG1sPC9sb2M+CisgICAgPGNoYW5nZWZyZXE+ZGFpbHk8L2NoYW5nZWZyZXE+CisgICAgPHByaW9yaXR5PjEuMDwvcHJpb3JpdHk+CisgIDwvdXJsPgorCisgIDx1cmw+CisgICAgPGxvYz5odHRwOi8vdGVzdG5nLm9yZy9kb2MvZG93bmxvYWQuaHRtbDwvbG9jPgorICAgIDxjaGFuZ2VmcmVxPmRhaWx5PC9jaGFuZ2VmcmVxPgorICA8L3VybD4KKworICA8dXJsPgorICAgIDxsb2M+aHR0cDovL3Rlc3RuZy5vcmcvZG9jL21pZ3JhdGluZy5odG1sPC9sb2M+CisgICAgPGNoYW5nZWZyZXE+ZGFpbHk8L2NoYW5nZWZyZXE+CisgIDwvdXJsPgorCisKKyAgPHVybD4KKyAgICA8bG9jPmh0dHA6Ly90ZXN0bmcub3JnL2phdmFkb2NzL2luZGV4Lmh0bWw8L2xvYz4KKyAgICA8Y2hhbmdlZnJlcT5kYWlseTwvY2hhbmdlZnJlcT4KKyAgPC91cmw+CisKKworICA8dXJsPgorICAgIDxsb2M+aHR0cDovL3Rlc3RuZy5vcmcvZG9jL2Jvb2suaHRtbDwvbG9jPgorICAgIDxjaGFuZ2VmcmVxPmRhaWx5PC9jaGFuZ2VmcmVxPgorICA8L3VybD4KKworCisgIDx1cmw+CisgICAgPGxvYz5odHRwOi8vdGVzdG5nLm9yZy9kb2MvZWNsaXBzZS5odG1sPC9sb2M+CisgICAgPGNoYW5nZWZyZXE+ZGFpbHk8L2NoYW5nZWZyZXE+CisgIDwvdXJsPgorCisKKyAgPHVybD4KKyAgICA8bG9jPmh0dHA6Ly90ZXN0bmcub3JnL2RvYy9pZGVhLmh0bWw8L2xvYz4KKyAgICA8Y2hhbmdlZnJlcT5kYWlseTwvY2hhbmdlZnJlcT4KKyAgPC91cmw+CisKKworICA8dXJsPgorICAgIDxsb2M+aHR0cDovL3Rlc3RuZy5vcmcvZG9jL21hdmVuLmh0bWw8L2xvYz4KKyAgICA8Y2hhbmdlZnJlcT5kYWlseTwvY2hhbmdlZnJlcT4KKyAgPC91cmw+CisKKworICA8dXJsPgorICAgIDxsb2M+aHR0cDovL3Rlc3RuZy5vcmcvZG9jL2FudC5odG1sPC9sb2M+CisgICAgPGNoYW5nZWZyZXE+ZGFpbHk8L2NoYW5nZWZyZXE+CisgIDwvdXJsPgorCisKKyAgPHVybD4KKyAgICA8bG9jPmh0dHA6Ly90ZXN0bmcub3JnL2RvYy9taXNjLmh0bWw8L2xvYz4KKyAgICA8Y2hhbmdlZnJlcT5kYWlseTwvY2hhbmdlZnJlcT4KKyAgPC91cmw+CisKKzwvdXJsc2V0PgorCisKZGlmZiAtLWdpdCBhL3NyYy9nZW5lcmF0ZWQvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1ZlcnNpb25UZW1wbGF0ZUphdmEgYi9zcmMvZ2VuZXJhdGVkL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9WZXJzaW9uVGVtcGxhdGVKYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTg1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZ2VuZXJhdGVkL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9WZXJzaW9uVGVtcGxhdGVKYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitwdWJsaWMgY2xhc3MgVmVyc2lvbiB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiNi45LjQ3LVNOQVBTSE9UIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUJhbm5lcigpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLlxuLi4uIFRlc3RORyAiICsgVkVSU0lPTiArICIgYnkgQ8OpZHJpYyBCZXVzdCAoY2VkcmljQGJldXN0LmNvbSlcbi4uLlxuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2JldXN0L3Rlc3RuZy9UZXN0TkcuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2JldXN0L3Rlc3RuZy9UZXN0TkcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjM2ODMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vYmV1c3QvdGVzdG5nL1Rlc3RORy5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgY29tLmJldXN0LnRlc3RuZzsKKworLyoqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBDcmVhdGVkIG9uIEp1biAxOCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICogQGRlcHJlY2F0ZWQgVXNlIG9yZy50ZXN0bmcuVGVzdE5HCisgKi8KK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgVGVzdE5HIGV4dGVuZHMgb3JnLnRlc3RuZy5UZXN0TkcgeworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vYmV1c3QvdGVzdG5nL1Rlc3ROR0FudFRhc2suamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2JldXN0L3Rlc3RuZy9UZXN0TkdBbnRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI4OWVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2JldXN0L3Rlc3RuZy9UZXN0TkdBbnRUYXNrLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uYmV1c3QudGVzdG5nOworCisvKioKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICoKKyAqIENyZWF0ZWQgb24gSnVuIDE4LCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAZGVwcmVjYXRlZCBVc2Ugb3JnLnRlc3RuZy5UZXN0TkdBbnRUYXNrCisgKi8KK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgVGVzdE5HQW50VGFzayBleHRlbmRzIG9yZy50ZXN0bmcuVGVzdE5HQW50VGFzayB7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL21haW4uaW1sIGIvc3JjL21haW4vamF2YS9tYWluLmltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzdlMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9tYWluLmltbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG1vZHVsZSB0eXBlPSJKQVZBX01PRFVMRSIgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iTmV3TW9kdWxlUm9vdE1hbmFnZXIiIGluaGVyaXQtY29tcGlsZXItb3V0cHV0PSJ0cnVlIj4KKyAgICA8ZXhjbHVkZS1vdXRwdXQgLz4KKyAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvLi4vLi4vLi4iPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+CisgICAgICA8c291cmNlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC8uLi8uLi9nZW5lcmF0ZWQvamF2YSIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkLy4uLy4uL3Rlc3QvamF2YSIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkLy4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy92ZXJzaW9uIiBpc1Rlc3RTb3VyY2U9ImZhbHNlIiAvPgorICAgIDwvY29udGVudD4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJpbmhlcml0ZWRKZGsiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ic291cmNlRm9sZGVyIiBmb3JUZXN0cz0iZmFsc2UiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9ImtvYmFsdCAoVGVzdCkiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9ImtvYmFsdCAoQ29tcGlsZSkiIGxldmVsPSJwcm9qZWN0IiAvPgorICA8L2NvbXBvbmVudD4KKzwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9Bc3NlcnQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9Bc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM3YjRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0Fzc2VydC5qYXZhCkBAIC0wLDAgKzEsOTk4IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5FY2xpcHNlSW50ZXJmYWNlLkFTU0VSVF9MRUZUOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLkVjbGlwc2VJbnRlcmZhY2UuQVNTRVJUX0xFRlQyOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLkVjbGlwc2VJbnRlcmZhY2UuQVNTRVJUX01JRERMRTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5FY2xpcHNlSW50ZXJmYWNlLkFTU0VSVF9SSUdIVDsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworLyoqCisgKiBBc3NlcnRpb24gdG9vbCBjbGFzcy4gUHJlc2VudHMgYXNzZXJ0aW9uIG1ldGhvZHMgd2l0aCBhIG1vcmUgbmF0dXJhbCBwYXJhbWV0ZXIgb3JkZXIuCisgKiBUaGUgb3JkZXIgaXMgYWx3YXlzIDxCPmFjdHVhbFZhbHVlPC9CPiwgPEI+ZXhwZWN0ZWRWYWx1ZTwvQj4gWywgbWVzc2FnZV0uCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgQXNzZXJ0IHsKKworICAvKioKKyAgICogUHJvdGVjdCBjb25zdHJ1Y3RvciBzaW5jZSBpdCBpcyBhIHN0YXRpYyBvbmx5IGNsYXNzCisgICAqLworICBwcm90ZWN0ZWQgQXNzZXJ0KCkgeworICAgIC8vIGhpZGUgY29uc3RydWN0b3IKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRUcnVlKGJvb2xlYW4gY29uZGl0aW9uLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmKCFjb25kaXRpb24pIHsKKyAgICAgIGZhaWxOb3RFcXVhbHMoY29uZGl0aW9uLCBCb29sZWFuLlRSVUUsIG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIHRvIGV2YWx1YXRlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIGNvbmRpdGlvbikgeworICAgIGFzc2VydFRydWUoY29uZGl0aW9uLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIGl0IGlzbid0LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24gdG8gZXZhbHVhdGUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RmFsc2UoYm9vbGVhbiBjb25kaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYoY29uZGl0aW9uKSB7CisgICAgICBmYWlsTm90RXF1YWxzKGNvbmRpdGlvbiwgQm9vbGVhbi5GQUxTRSwgbWVzc2FnZSk7IC8vIFRFU1RORy04MQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIGl0IGlzbid0LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEZhbHNlKGJvb2xlYW4gY29uZGl0aW9uKSB7CisgICAgYXNzZXJ0RmFsc2UoY29uZGl0aW9uLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBGYWlscyBhIHRlc3Qgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgd3JhcHBpbmcgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqIEBwYXJhbSByZWFsQ2F1c2UgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSByZWFsQ2F1c2UpIHsKKyAgICBBc3NlcnRpb25FcnJvciBhZSA9IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlKTsKKyAgICBhZS5pbml0Q2F1c2UocmVhbENhdXNlKTsKKworICAgIHRocm93IGFlOworICB9CisKKyAgLyoqCisgICAqIEZhaWxzIGEgdGVzdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKSB7CisgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEZhaWxzIGEgdGVzdCB3aXRoIG5vIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgICBmYWlsKG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdCBhY3R1YWwsIE9iamVjdCBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBleHBlY3RlZC5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzSW1wbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBEaWZmZXJzIGZyb20ge0BsaW5rICNhc3NlcnRFcXVhbHMoT2JqZWN0LCBPYmplY3QsIFN0cmluZyl9IGJ5IG5vdCB0YWtpbmcgYXJyYXlzIGludG8KKyAgICogc3BlY2lhbCBjb25zaWRlcmF0aW9uIGhlbmNlIGNvbXBhcmluZyB0aGVtIGJ5IHJlZmVyZW5jZS4gSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5CisgICAqIHRvIHRlc3QgZXF1YWxpdHkgb2YgY29sbGVjdGlvbnMgY29udGVudC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzSW1wbChPYmplY3QgYWN0dWFsLCBPYmplY3QgZXhwZWN0ZWQsCisgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIGlmKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsID09IG51bGwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKGV4cGVjdGVkID09IG51bGwgXiBhY3R1YWwgPT0gbnVsbCkgeworICAgICAgICBmYWlsTm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgICAgaWYgKGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpICYmIGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZhaWxOb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoT2JqZWN0IGFjdHVhbCwgT2JqZWN0IGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG51bGwgPT0gZXhwZWN0ZWQpIHsKKyAgICAgIGZhaWwoImV4cGVjdGVkIGEgbnVsbCBhcnJheSwgYnV0IG5vdCBudWxsIGZvdW5kLiAiICsgbWVzc2FnZSk7CisgICAgfQorICAgIGlmIChudWxsID09IGFjdHVhbCkgeworICAgICAgZmFpbCgiZXhwZWN0ZWQgbm90IG51bGwgYXJyYXksIGJ1dCBudWxsIGZvdW5kLiAiICsgbWVzc2FnZSk7CisgICAgfQorICAgIC8vaXMgY2FsbGVkIG9ubHkgd2hlbiBleHBlY3RlZCBpcyBhbiBhcnJheQorICAgIGlmIChhY3R1YWwuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgIGludCBleHBlY3RlZExlbmd0aCA9IEFycmF5LmdldExlbmd0aChleHBlY3RlZCk7CisgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggPT0gQXJyYXkuZ2V0TGVuZ3RoKGFjdHVhbCkpIHsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGV4cGVjdGVkTGVuZ3RoIDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgX2FjdHVhbCA9IEFycmF5LmdldChhY3R1YWwsIGkpOworICAgICAgICAgICAgT2JqZWN0IF9leHBlY3RlZCA9IEFycmF5LmdldChleHBlY3RlZCwgaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKF9hY3R1YWwsIF9leHBlY3RlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBhZSkgeworICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlID09IG51bGwgPyAiIiA6IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAodmFsdWVzIGF0IGluZGV4ICIgKyBpICsgIiBhcmUgbm90IHRoZSBzYW1lKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLy9hcnJheSB2YWx1ZXMgbWF0Y2hlZAorICAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGZhaWxOb3RFcXVhbHMoQXJyYXkuZ2V0TGVuZ3RoKGFjdHVhbCksIGV4cGVjdGVkTGVuZ3RoLCBtZXNzYWdlID09IG51bGwgPyAiIiA6IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICsgIiAoQXJyYXkgbGVuZ3RocyBhcmUgbm90IHRoZSBzYW1lKSIpOworICAgICAgfQorICAgIH0KKyAgICBmYWlsTm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgYWN0dWFsLCBPYmplY3QgZXhwZWN0ZWQpIHsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBTdHJpbmdzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGFjdHVhbCwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydEVxdWFscygoT2JqZWN0KSBhY3R1YWwsIChPYmplY3QpIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIFN0cmluZ3MgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGFjdHVhbCwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gZG91YmxlcyBhcmUgZXF1YWwgY29uY2VybmluZyBhIGRlbHRhLiAgSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLiAgSWYgdGhlIGV4cGVjdGVkCisgICAqIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBkZWx0YSB0aGUgYWJzb2x1dGUgdG9sZXJhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGRlbHRhLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIC8vIGhhbmRsZSBpbmZpbml0eSBzcGVjaWFsbHkgc2luY2Ugc3VidHJhY3RpbmcgdG8gaW5maW5pdGUgdmFsdWVzIGdpdmVzIE5hTiBhbmQgdGhlCisgICAgLy8gdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzCisgICAgaWYoRG91YmxlLmlzSW5maW5pdGUoZXhwZWN0ZWQpKSB7CisgICAgICBpZighKGV4cGVjdGVkID09IGFjdHVhbCkpIHsKKyAgICAgICAgZmFpbE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoRG91YmxlLmlzTmFOKGV4cGVjdGVkKSkgeworICAgICAgaWYgKCFEb3VibGUuaXNOYU4oYWN0dWFsKSkgeworICAgICAgICBmYWlsTm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCEoTWF0aC5hYnMoZXhwZWN0ZWQgLSBhY3R1YWwpIDw9IGRlbHRhKSkgeworICAgICAgZmFpbE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25jZXJuaW5nIGEgZGVsdGEuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUKKyAgICogZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIGRlbHRhIHRoZSBhYnNvbHV0ZSB0b2xlcmFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcworICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhkb3VibGUgYWN0dWFsLCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBkZWx0YSkgeworICAgIGFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBmbG9hdHMgYXJlIGVxdWFsIGNvbmNlcm5pbmcgYSBkZWx0YS4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLiAgSWYgdGhlIGV4cGVjdGVkCisgICAqIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBkZWx0YSB0aGUgYWJzb2x1dGUgdG9sZXJhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZsb2F0IGFjdHVhbCwgZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGRlbHRhLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIC8vIGhhbmRsZSBpbmZpbml0eSBzcGVjaWFsbHkgc2luY2Ugc3VidHJhY3RpbmcgdG8gaW5maW5pdGUgdmFsdWVzIGdpdmVzIE5hTiBhbmQgdGhlCisgICAgLy8gdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzCisgICAgaWYoRmxvYXQuaXNJbmZpbml0ZShleHBlY3RlZCkpIHsKKyAgICAgIGlmKCEoZXhwZWN0ZWQgPT0gYWN0dWFsKSkgeworICAgICAgICBmYWlsTm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCEoTWF0aC5hYnMoZXhwZWN0ZWQgLSBhY3R1YWwpIDw9IGRlbHRhKSkgeworICAgICAgZmFpbE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBmbG9hdHMgYXJlIGVxdWFsIGNvbmNlcm5pbmcgYSBkZWx0YS4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciBpcyB0aHJvd24uIElmIHRoZSBleHBlY3RlZAorICAgKiB2YWx1ZSBpcyBpbmZpbml0eSB0aGVuIHRoZSBkZWx0YSB2YWx1ZSBpcyBpZ25vcmVkLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gZGVsdGEgdGhlIGFic29sdXRlIHRvbGVyYWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZsb2F0IGFjdHVhbCwgZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGRlbHRhKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGxvbmdzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMobG9uZyBhY3R1YWwsIGxvbmcgZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZihhY3R1YWwpLCBMb25nLnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGxvbmdzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGxvbmcgYWN0dWFsLCBsb25nIGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYm9vbGVhbnMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhib29sZWFuIGFjdHVhbCwgYm9vbGVhbiBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBhc3NlcnRFcXVhbHMoIEJvb2xlYW4udmFsdWVPZihhY3R1YWwpLCBCb29sZWFuLnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGJvb2xlYW5zIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGJvb2xlYW4gYWN0dWFsLCBib29sZWFuIGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYnl0ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhieXRlIGFjdHVhbCwgYnl0ZSBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZS52YWx1ZU9mKGFjdHVhbCksIEJ5dGUudmFsdWVPZihleHBlY3RlZCksIG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYnl0ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoYnl0ZSBhY3R1YWwsIGJ5dGUgZXhwZWN0ZWQpIHsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBjaGFycyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGNoYXIgYWN0dWFsLCBjaGFyIGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydEVxdWFscyhDaGFyYWN0ZXIudmFsdWVPZihhY3R1YWwpLCBDaGFyYWN0ZXIudmFsdWVPZihleHBlY3RlZCksIG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gY2hhcnMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoY2hhciBhY3R1YWwsIGNoYXIgZXhwZWN0ZWQpIHsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBzaG9ydHMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhzaG9ydCBhY3R1YWwsIHNob3J0IGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydEVxdWFscyhTaG9ydC52YWx1ZU9mKGFjdHVhbCksIFNob3J0LnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIHNob3J0cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhzaG9ydCBhY3R1YWwsIHNob3J0IGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gaW50cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGludCBhY3R1YWwsICBpbnQgZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihhY3R1YWwpLCBJbnRlZ2VyLnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGludHMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoaW50IGFjdHVhbCwgaW50IGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXNuJ3QgbnVsbC4gSWYgaXQgaXMsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIG9iamVjdCB0aGUgYXNzZXJ0aW9uIG9iamVjdAorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoT2JqZWN0IG9iamVjdCkgeworICAgIGFzc2VydE5vdE51bGwob2JqZWN0LCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzbid0IG51bGwuIElmIGl0IGlzLAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhc3NlcnRpb24gb2JqZWN0CisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSAiIjsKKyAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICBmb3JtYXR0ZWQgPSBtZXNzYWdlICsgIiAiOworICAgICAgfQorICAgICAgZmFpbChmb3JtYXR0ZWQgKyAiZXhwZWN0ZWQgb2JqZWN0IHRvIG5vdCBiZSBudWxsIik7CisgICAgfQorICAgIGFzc2VydFRydWUob2JqZWN0ICE9IG51bGwsIG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbnVsbC4gSWYgaXQgaXMgbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhc3NlcnRpb24gb2JqZWN0CisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0TnVsbChPYmplY3Qgb2JqZWN0KSB7CisgICAgYXNzZXJ0TnVsbChvYmplY3QsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbnVsbC4gSWYgaXQgaXMgbm90LAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBhc3NlcnRpb24gb2JqZWN0CisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKKyAgICAgIGZhaWxOb3RTYW1lKG9iamVjdCwgbnVsbCwgbWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuIElmIHRoZXkgZG8gbm90LAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKE9iamVjdCBhY3R1YWwsIE9iamVjdCBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZihleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmFpbE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhleSBkbyBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKE9iamVjdCBhY3R1YWwsIE9iamVjdCBleHBlY3RlZCkgeworICAgIGFzc2VydFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIGRvIG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3RzLiBJZiB0aGV5IGRvLAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnROb3RTYW1lKE9iamVjdCBhY3R1YWwsIE9iamVjdCBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZihleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICAgIGZhaWxTYW1lKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhleSBkbywKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdFNhbWUoT2JqZWN0IGFjdHVhbCwgT2JqZWN0IGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0Tm90U2FtZShhY3R1YWwsIGV4cGVjdGVkLCBudWxsKTsKKyAgfQorCisgIHN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbFNhbWUoT2JqZWN0IGFjdHVhbCwgT2JqZWN0IGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIFN0cmluZyBmb3JtYXR0ZWQgPSAiIjsKKyAgICBpZihtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIGZvcm1hdHRlZCA9IG1lc3NhZ2UgKyAiICI7CisgICAgfQorICAgIGZhaWwoZm9ybWF0dGVkICsgQVNTRVJUX0xFRlQyICsgZXhwZWN0ZWQgKyBBU1NFUlRfTUlERExFICsgYWN0dWFsICsgQVNTRVJUX1JJR0hUKTsKKyAgfQorCisgIHN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbE5vdFNhbWUoT2JqZWN0IGFjdHVhbCwgT2JqZWN0IGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIFN0cmluZyBmb3JtYXR0ZWQgPSAiIjsKKyAgICBpZihtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIGZvcm1hdHRlZCA9IG1lc3NhZ2UgKyAiICI7CisgICAgfQorICAgIGZhaWwoZm9ybWF0dGVkICsgQVNTRVJUX0xFRlQgKyBleHBlY3RlZCArIEFTU0VSVF9NSURETEUgKyBhY3R1YWwgKyBBU1NFUlRfUklHSFQpOworICB9CisKKyAgc3RhdGljIHByaXZhdGUgdm9pZCBmYWlsTm90RXF1YWxzKE9iamVjdCBhY3R1YWwgLCBPYmplY3QgZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlICkgeworICAgIGZhaWwoZm9ybWF0KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmcgZm9ybWF0KE9iamVjdCBhY3R1YWwsIE9iamVjdCBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBTdHJpbmcgZm9ybWF0dGVkID0gIiI7CisgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgeworICAgICAgZm9ybWF0dGVkID0gbWVzc2FnZSArICIgIjsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0dGVkICsgQVNTRVJUX0xFRlQgKyBleHBlY3RlZCArIEFTU0VSVF9NSURETEUgKyBhY3R1YWwgKyBBU1NFUlRfUklHSFQ7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBjb2xsZWN0aW9ucyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhDb2xsZWN0aW9uPD8+IGFjdHVhbCwgQ29sbGVjdGlvbjw/PiBleHBlY3RlZCkgeworICAgIGFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGNvbGxlY3Rpb25zIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZXkgZG8gbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbjw/PiBhY3R1YWwsIENvbGxlY3Rpb248Pz4gZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYoYWN0dWFsID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGFjdHVhbCA9PSBudWxsIHx8IGV4cGVjdGVkID09IG51bGwpIHsKKyAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWwoIkNvbGxlY3Rpb25zIG5vdCBlcXVhbDogZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgYW5kIGFjdHVhbDogIiArIGFjdHVhbCk7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbC5zaXplKCksIGV4cGVjdGVkLnNpemUoKSwgKG1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogbWVzc2FnZSArICI6ICIpICsgImxpc3RzIGRvbid0IGhhdmUgdGhlIHNhbWUgc2l6ZSIpOworCisgICAgSXRlcmF0b3I8Pz4gYWN0SXQgPSBhY3R1YWwuaXRlcmF0b3IoKTsKKyAgICBJdGVyYXRvcjw/PiBleHBJdCA9IGV4cGVjdGVkLml0ZXJhdG9yKCk7CisgICAgaW50IGkgPSAtMTsKKyAgICB3aGlsZShhY3RJdC5oYXNOZXh0KCkgJiYgZXhwSXQuaGFzTmV4dCgpKSB7CisgICAgICBpKys7CisgICAgICBPYmplY3QgZSA9IGV4cEl0Lm5leHQoKTsKKyAgICAgIE9iamVjdCBhID0gYWN0SXQubmV4dCgpOworICAgICAgU3RyaW5nIGV4cGxhbmF0aW9uID0gIkxpc3RzIGRpZmZlciBhdCBlbGVtZW50IFsiICsgaSArICJdOiAiICsgZSArICIgIT0gIiArIGE7CisgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gZXhwbGFuYXRpb24gOiBtZXNzYWdlICsgIjogIiArIGV4cGxhbmF0aW9uOworCisgICAgICBhc3NlcnRFcXVhbHNJbXBsKGEsIGUsIGVycm9yTWVzc2FnZSk7CisgICAgfQorICB9CisgIAorICAvKiogQXNzZXJ0cyB0aGF0IHR3byBpdGVyYXRvcnMgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgYXNzZXJ0IGl0ZXJhdGVzIG92ZXIgdGhlIGVsZW1lbnRzIGFuZCBtb2RpZmllcyB0aGUgc3RhdGUgb2YgdGhlIGl0ZXJhdG9ycy4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoSXRlcmF0b3I8Pz4gYWN0dWFsLCBJdGVyYXRvcjw/PiBleHBlY3RlZCkgeworICAgIGFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBudWxsKTsKKyAgfQorICAKKyAgLyoqIEFzc2VydHMgdGhhdCB0d28gaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4gSWYgdGhleSBkbyBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBhc3NlcnQgaXRlcmF0ZXMgb3ZlciB0aGUgZWxlbWVudHMgYW5kIG1vZGlmaWVzIHRoZSBzdGF0ZSBvZiB0aGUgaXRlcmF0b3JzLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoSXRlcmF0b3I8Pz4gYWN0dWFsLCBJdGVyYXRvcjw/PiBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZihhY3R1YWwgPT0gZXhwZWN0ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYoYWN0dWFsID09IG51bGwgfHwgZXhwZWN0ZWQgPT0gbnVsbCkgeworICAgICAgaWYobWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgIGZhaWwobWVzc2FnZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmYWlsKCJJdGVyYXRvcnMgbm90IGVxdWFsOiBleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiBhbmQgYWN0dWFsOiAiICsgYWN0dWFsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaSA9IC0xOworICAgIHdoaWxlKGFjdHVhbC5oYXNOZXh0KCkgJiYgZXhwZWN0ZWQuaGFzTmV4dCgpKSB7CisgICAgICAKKyAgICAgIGkrKzsKKyAgICAgIE9iamVjdCBlID0gZXhwZWN0ZWQubmV4dCgpOworICAgICAgT2JqZWN0IGEgPSBhY3R1YWwubmV4dCgpOworICAgICAgU3RyaW5nIGV4cGxhbmF0aW9uID0gIkl0ZXJhdG9ycyBkaWZmZXIgYXQgZWxlbWVudCBbIiArIGkgKyAiXTogIiArIGUgKyAiICE9ICIgKyBhOworICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IGV4cGxhbmF0aW9uIDogbWVzc2FnZSArICI6ICIgKyBleHBsYW5hdGlvbjsKKyAgICAgIAorICAgICAgYXNzZXJ0RXF1YWxzSW1wbChhLCBlLCBlcnJvck1lc3NhZ2UpOworICAgICAgCisgICAgfQorICAgIAorICAgIGlmKGFjdHVhbC5oYXNOZXh0KCkpIHsgCisgICAgICAKKyAgICAgIFN0cmluZyBleHBsYW5hdGlvbiA9ICJBY3R1YWwgaXRlcmF0b3IgcmV0dXJuZWQgbW9yZSBlbGVtZW50cyB0aGFuIHRoZSBleHBlY3RlZCBpdGVyYXRvci4iOworICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/IGV4cGxhbmF0aW9uIDogbWVzc2FnZSArICI6ICIgKyBleHBsYW5hdGlvbjsKKyAgICAgIGZhaWwoZXJyb3JNZXNzYWdlKTsKKyAgICAgIAorICAgIH0gZWxzZSBpZihleHBlY3RlZC5oYXNOZXh0KCkpIHsKKyAgICAgIAorICAgICAgU3RyaW5nIGV4cGxhbmF0aW9uID0gIkV4cGVjdGVkIGl0ZXJhdG9yIHJldHVybmVkIG1vcmUgZWxlbWVudHMgdGhhbiB0aGUgYWN0dWFsIGl0ZXJhdG9yLiI7CisgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gZXhwbGFuYXRpb24gOiBtZXNzYWdlICsgIjogIiArIGV4cGxhbmF0aW9uOworICAgICAgZmFpbChlcnJvck1lc3NhZ2UpOworICAgICAgCisgICAgfQorICAgIAorICB9CisgIAorICAvKiogQXNzZXJ0cyB0aGF0IHR3byBpdGVyYWJsZXMgcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhJdGVyYWJsZTw/PiBhY3R1YWwsIEl0ZXJhYmxlPD8+IGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisgIAorICAvKiogQXNzZXJ0cyB0aGF0IHR3byBpdGVyYWJsZXMgcmV0dXJuIGl0ZXJhdG9ycyB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKEl0ZXJhYmxlPD8+IGFjdHVhbCwgSXRlcmFibGU8Pz4gZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYoYWN0dWFsID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmKGFjdHVhbCA9PSBudWxsIHx8IGV4cGVjdGVkID09IG51bGwpIHsKKyAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICBmYWlsKG1lc3NhZ2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbCgiSXRlcmFibGVzIG5vdCBlcXVhbDogZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgYW5kIGFjdHVhbDogIiArIGFjdHVhbCk7CisgICAgICB9CisgICAgfQorCisgICAgSXRlcmF0b3I8Pz4gYWN0SXQgPSBhY3R1YWwuaXRlcmF0b3IoKTsKKyAgICBJdGVyYXRvcjw/PiBleHBJdCA9IGV4cGVjdGVkLml0ZXJhdG9yKCk7CisgICAgCisgICAgYXNzZXJ0RXF1YWxzKGFjdEl0LCBleHBJdCwgbWVzc2FnZSk7CisgIH0KKyAgCisgIAorICAgIAorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGFycmF5cyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlCisgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgdmFsdWUKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdFtdIGFjdHVhbCwgT2JqZWN0W10gZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYoYWN0dWFsID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKChhY3R1YWwgPT0gbnVsbCAmJiBleHBlY3RlZCAhPSBudWxsKSB8fCAoYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQgPT0gbnVsbCkpIHsKKyAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWwoIkFycmF5cyBub3QgZXF1YWw6ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpICsgIiBhbmQgIiArIEFycmF5cy50b1N0cmluZyhhY3R1YWwpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoYWN0dWFsKSwgQXJyYXlzLmFzTGlzdChleHBlY3RlZCksIG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYXJyYXlzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gbm8gcGFydGljdWxhciBvcmRlci4gSWYgdGhleSBkbyBub3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsc05vT3JkZXIoT2JqZWN0W10gYWN0dWFsLCBPYmplY3RbXSBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZihhY3R1YWwgPT0gZXhwZWN0ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGFjdHVhbCA9PSBudWxsICYmIGV4cGVjdGVkICE9IG51bGwpIHx8IChhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZCA9PSBudWxsKSkgeworICAgICAgZmFpbEFzc2VydE5vRXF1YWwoCisgICAgICAgICAgIkFycmF5cyBub3QgZXF1YWw6ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWQpICsgIiBhbmQgIiArIEFycmF5cy50b1N0cmluZyhhY3R1YWwpLAorICAgICAgICAgIG1lc3NhZ2UpOworICAgIH0KKworICAgIGlmIChhY3R1YWwubGVuZ3RoICE9IGV4cGVjdGVkLmxlbmd0aCkgeworICAgICAgZmFpbEFzc2VydE5vRXF1YWwoCisgICAgICAgICAgIkFycmF5cyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplOiIgKyBhY3R1YWwubGVuZ3RoICsgIiAhPSAiICsgZXhwZWN0ZWQubGVuZ3RoLAorICAgICAgICAgIG1lc3NhZ2UpOworICAgIH0KKworICAgIExpc3Q8T2JqZWN0PiBhY3R1YWxDb2xsZWN0aW9uID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChPYmplY3QgYSA6IGFjdHVhbCkgeworICAgICAgYWN0dWFsQ29sbGVjdGlvbi5hZGQoYSk7CisgICAgfQorICAgIGZvciAoT2JqZWN0IG8gOiBleHBlY3RlZCkgeworICAgICAgYWN0dWFsQ29sbGVjdGlvbi5yZW1vdmUobyk7CisgICAgfQorICAgIGlmIChhY3R1YWxDb2xsZWN0aW9uLnNpemUoKSAhPSAwKSB7CisgICAgICBmYWlsQXNzZXJ0Tm9FcXVhbCgKKyAgICAgICAgICAiQXJyYXlzIG5vdCBlcXVhbDogIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZCkgKyAiIGFuZCAiICsgQXJyYXlzLnRvU3RyaW5nKGFjdHVhbCksCisgICAgICAgICAgbWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsQXNzZXJ0Tm9FcXVhbChTdHJpbmcgZGVmYXVsdE1lc3NhZ2UsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgZmFpbChtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZmFpbChkZWZhdWx0TWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYXJyYXlzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZXkgZG8gbm90LAorICAgKiBhbiBBc3NlcnRpb25FcnJvciBpcyB0aHJvd24uCisgICAqCisgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCB2YWx1ZQorICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdFtdIGFjdHVhbCwgT2JqZWN0W10gZXhwZWN0ZWQpIHsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBhcnJheXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLiBJZiB0aGV5IGRvIG5vdCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IgaXMgdGhyb3duLgorICAgKiBAcGFyYW0gYWN0dWFsIHRoZSBhY3R1YWwgdmFsdWUKKyAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsc05vT3JkZXIoT2JqZWN0W10gYWN0dWFsLCBPYmplY3RbXSBleHBlY3RlZCkgeworICAgIGFzc2VydEVxdWFsc05vT3JkZXIoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBzZXRzIGFyZSBlcXVhbC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU2V0PD8+IGFjdHVhbCwgU2V0PD8+IGV4cGVjdGVkKSB7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG51bGwpOworICB9CisgIAorCS8qKgorCSAqIEFzc2VydCBzZXQgZXF1YWxzCisJICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU2V0PD8+IGFjdHVhbCwgU2V0PD8+IGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYWN0dWFsID09IG51bGwgfHwgZXhwZWN0ZWQgPT0gbnVsbCkgeworICAgICAgLy8gS2VlcCB0aGUgYmFjayBjb21wYXRpYmxlCisgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgIGZhaWwoIlNldHMgbm90IGVxdWFsOiBleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiBhbmQgYWN0dWFsOiAiICsgYWN0dWFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWxOb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFhY3R1YWwuZXF1YWxzKGV4cGVjdGVkKSkgeworICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICBmYWlsKCJTZXRzIGRpZmZlcjogZXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiBidXQgZ290ICIgKyBhY3R1YWwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBtYXBzIGFyZSBlcXVhbC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoTWFwPD8sID8+IGFjdHVhbCwgTWFwPD8sID8+IGV4cGVjdGVkKSB7CisgICAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhY3R1YWwgPT0gbnVsbCB8fCBleHBlY3RlZCA9PSBudWxsKSB7CisgICAgICBmYWlsKCJNYXBzIG5vdCBlcXVhbDogZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgYW5kIGFjdHVhbDogIiArIGFjdHVhbCk7CisgICAgfQorCisgICAgaWYgKGFjdHVhbC5zaXplKCkgIT0gZXhwZWN0ZWQuc2l6ZSgpKSB7CisgICAgICBmYWlsKCJNYXBzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemU6IiArIGFjdHVhbC5zaXplKCkgKyAiICE9ICIgKyBleHBlY3RlZC5zaXplKCkpOworICAgIH0KKworICAgIFNldDw/PiBlbnRyeVNldCA9IGFjdHVhbC5lbnRyeVNldCgpOworICAgIGZvciAoT2JqZWN0IGFuRW50cnlTZXQgOiBlbnRyeVNldCkgeworICAgICAgTWFwLkVudHJ5PD8sID8+IGVudHJ5ID0gKE1hcC5FbnRyeTw/LCA/PikgYW5FbnRyeVNldDsKKyAgICAgIE9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBPYmplY3QgZXhwZWN0ZWRWYWx1ZSA9IGV4cGVjdGVkLmdldChrZXkpOworICAgICAgYXNzZXJ0RXF1YWxzSW1wbCh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSwgIk1hcHMgZG8gbm90IG1hdGNoIGZvciBrZXk6IiArIGtleSArICIgYWN0dWFsOiIgKyB2YWx1ZQorICAgICAgICAgICAgICArICIgZXhwZWN0ZWQ6IiArIGV4cGVjdGVkVmFsdWUpOworICAgIH0KKworICB9CisKKyAgLy8vLy8KKyAgLy8gYXNzZXJ0Tm90RXF1YWxzCisgIC8vCisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhPYmplY3QgYWN0dWFsMSwgT2JqZWN0IGFjdHVhbDIsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgYm9vbGVhbiBmYWlsID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsMSwgYWN0dWFsMik7CisgICAgICBmYWlsID0gdHJ1ZTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisgICAgfQorCisgICAgaWYgKGZhaWwpIHsKKyAgICAgIEFzc2VydC5mYWlsKG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoT2JqZWN0IGFjdHVhbDEsIE9iamVjdCBhY3R1YWwyKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIG51bGwpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKFN0cmluZyBhY3R1YWwxLCBTdHJpbmcgYWN0dWFsMiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBhc3NlcnROb3RFcXVhbHMoKE9iamVjdCkgYWN0dWFsMSwgKE9iamVjdCkgYWN0dWFsMiwgbWVzc2FnZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoU3RyaW5nIGFjdHVhbDEsIFN0cmluZyBhY3R1YWwyKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIG51bGwpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGxvbmcgYWN0dWFsMSwgbG9uZyBhY3R1YWwyLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydE5vdEVxdWFscyhMb25nLnZhbHVlT2YoYWN0dWFsMSksIExvbmcudmFsdWVPZihhY3R1YWwyKSwgbWVzc2FnZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMobG9uZyBhY3R1YWwxLCBsb25nIGFjdHVhbDIpIHsKKyAgICBhc3NlcnROb3RFcXVhbHMoYWN0dWFsMSwgYWN0dWFsMiwgbnVsbCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoYm9vbGVhbiBhY3R1YWwxLCBib29sZWFuIGFjdHVhbDIsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKEJvb2xlYW4udmFsdWVPZihhY3R1YWwxKSwgQm9vbGVhbi52YWx1ZU9mKGFjdHVhbDIpLCBtZXNzYWdlKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhib29sZWFuIGFjdHVhbDEsIGJvb2xlYW4gYWN0dWFsMikgeworICAgIGFzc2VydE5vdEVxdWFscyhhY3R1YWwxLCBhY3R1YWwyLCBudWxsKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhieXRlIGFjdHVhbDEsIGJ5dGUgYWN0dWFsMiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBhc3NlcnROb3RFcXVhbHMoQnl0ZS52YWx1ZU9mKGFjdHVhbDEpLCBCeXRlLnZhbHVlT2YoYWN0dWFsMiksIG1lc3NhZ2UpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGJ5dGUgYWN0dWFsMSwgYnl0ZSBhY3R1YWwyKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIG51bGwpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGNoYXIgYWN0dWFsMSwgY2hhciBhY3R1YWwyLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydE5vdEVxdWFscyhDaGFyYWN0ZXIudmFsdWVPZihhY3R1YWwxKSwgQ2hhcmFjdGVyLnZhbHVlT2YoYWN0dWFsMiksIG1lc3NhZ2UpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGNoYXIgYWN0dWFsMSwgY2hhciBhY3R1YWwyKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIG51bGwpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKHNob3J0IGFjdHVhbDEsIHNob3J0IGFjdHVhbDIsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKFNob3J0LnZhbHVlT2YoYWN0dWFsMSksIFNob3J0LnZhbHVlT2YoYWN0dWFsMiksIG1lc3NhZ2UpOworICB9CisKKyAgc3RhdGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKHNob3J0IGFjdHVhbDEsIHNob3J0IGFjdHVhbDIpIHsKKyAgICBhc3NlcnROb3RFcXVhbHMoYWN0dWFsMSwgYWN0dWFsMiwgbnVsbCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoaW50IGFjdHVhbDEsIGludCBhY3R1YWwyLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGFzc2VydE5vdEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoYWN0dWFsMSksIEludGVnZXIudmFsdWVPZihhY3R1YWwyKSwgbWVzc2FnZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoaW50IGFjdHVhbDEsIGludCBhY3R1YWwyKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIG51bGwpOworICB9CisKKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhmbG9hdCBhY3R1YWwxLCBmbG9hdCBhY3R1YWwyLCBmbG9hdCBkZWx0YSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBib29sZWFuIGZhaWwgPSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwxLCBhY3R1YWwyLCBkZWx0YSwgbWVzc2FnZSk7CisgICAgICBmYWlsID0gdHJ1ZTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisKKyAgICB9CisKKyAgICBpZiAoZmFpbCkgeworICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhmbG9hdCBhY3R1YWwxLCBmbG9hdCBhY3R1YWwyLCBmbG9hdCBkZWx0YSkgeworICAgIGFzc2VydE5vdEVxdWFscyhhY3R1YWwxLCBhY3R1YWwyLCBkZWx0YSwgbnVsbCk7CisgIH0KKworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGRvdWJsZSBhY3R1YWwxLCBkb3VibGUgYWN0dWFsMiwgZG91YmxlIGRlbHRhLCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGJvb2xlYW4gZmFpbCA9IGZhbHNlOworICAgIHRyeSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIGRlbHRhLCBtZXNzYWdlKTsKKyAgICAgIGZhaWwgPSB0cnVlOworICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKworICAgIH0KKworICAgIGlmIChmYWlsKSB7CisgICAgICBBc3NlcnQuZmFpbChtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGRvdWJsZSBhY3R1YWwxLCBkb3VibGUgYWN0dWFsMiwgZG91YmxlIGRlbHRhKSB7CisgICAgYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbDEsIGFjdHVhbDIsIGRlbHRhLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIGludGVyZmFjZSBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIHtAbGluayAjZXhwZWN0VGhyb3dzfSBmcm9tIEphdmEgOC4gSXQgYWxsb3dzCisgICAqIG1ldGhvZCByZWZlcmVuY2VzIHRvIGJvdGggdm9pZCBhbmQgbm9uLXZvaWQgbWV0aG9kcyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgaW50bworICAgKiBleHBlY3RUaHJvd3Mgd2l0aG91dCB3cmFwcGluZywgZXZlbiBpZiB0aGV5IGRlY2xhcmUgY2hlY2tlZCBleGNlcHRpb25zLgorICAgKiA8cC8+CisgICAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBkaXJlY3RseS4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgVGhyb3dpbmdSdW5uYWJsZSB7CisgICAgdm9pZCBydW4oKSB0aHJvd3MgVGhyb3dhYmxlOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB7QGNvZGUgcnVubmFibGV9IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBpbnZva2VkLiBJZiBpdCBkb2VzIG5vdCwgYW4KKyAgICoge0BsaW5rIEFzc2VydGlvbkVycm9yfSBpcyB0aHJvd24uCisgICAqCisgICAqIEBwYXJhbSBydW5uYWJsZSBBIGZ1bmN0aW9uIHRoYXQgaXMgZXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gaW52b2tlZAorICAgKiBAc2luY2UgNi45LjUKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRUaHJvd3MoVGhyb3dpbmdSdW5uYWJsZSBydW5uYWJsZSkgeworICAgIGFzc2VydFRocm93cyhUaHJvd2FibGUuY2xhc3MsIHJ1bm5hYmxlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQge0Bjb2RlIHJ1bm5hYmxlfSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUge0Bjb2RlIHRocm93YWJsZUNsYXNzfSB3aGVuCisgICAqIGV4ZWN1dGVkLiBJZiBpdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24sIGFuIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLiBJZiBpdAorICAgKiB0aHJvd3MgdGhlIHdyb25nIHR5cGUgb2YgZXhjZXB0aW9uLCBhbiB7QGNvZGUgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biBkZXNjcmliaW5nIHRoZQorICAgKiBtaXNtYXRjaDsgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBhY3R1YWxseSB0aHJvd24gY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rCisgICAqIEFzc2VydGlvbkVycm9yI2dldENhdXNlfS4KKyAgICoKKyAgICogQHBhcmFtIHRocm93YWJsZUNsYXNzIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBleGNlcHRpb24KKyAgICogQHBhcmFtIHJ1bm5hYmxlICAgICAgIEEgZnVuY3Rpb24gdGhhdCBpcyBleHBlY3RlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBpbnZva2VkCisgICAqIEBzaW5jZSA2LjkuNQorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoIlRocm93YWJsZVJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiKQorICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgVGhyb3dhYmxlPiB2b2lkIGFzc2VydFRocm93cyhDbGFzczxUPiB0aHJvd2FibGVDbGFzcywgVGhyb3dpbmdSdW5uYWJsZSBydW5uYWJsZSkgeworICAgIGV4cGVjdFRocm93cyh0aHJvd2FibGVDbGFzcywgcnVubmFibGUpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB7QGNvZGUgcnVubmFibGV9IHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSB7QGNvZGUgdGhyb3dhYmxlQ2xhc3N9IHdoZW4KKyAgICogZXhlY3V0ZWQgYW5kIHJldHVybnMgdGhlIGV4Y2VwdGlvbi4gSWYge0Bjb2RlIHJ1bm5hYmxlfSBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24sIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLiBJZiBpdCB0aHJvd3MgdGhlIHdyb25nIHR5cGUgb2YgZXhjZXB0aW9uLCBhbiB7QGNvZGUKKyAgICogQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biBkZXNjcmliaW5nIHRoZSBtaXNtYXRjaDsgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBhY3R1YWxseSB0aHJvd24gY2FuCisgICAqIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rIEFzc2VydGlvbkVycm9yI2dldENhdXNlfS4KKyAgICoKKyAgICogQHBhcmFtIHRocm93YWJsZUNsYXNzIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBleGNlcHRpb24KKyAgICogQHBhcmFtIHJ1bm5hYmxlICAgICAgIEEgZnVuY3Rpb24gdGhhdCBpcyBleHBlY3RlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBpbnZva2VkCisgICAqIEByZXR1cm4gVGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkge0Bjb2RlIHJ1bm5hYmxlfQorICAgKiBAc2luY2UgNi45LjUKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBUaHJvd2FibGU+IFQgZXhwZWN0VGhyb3dzKENsYXNzPFQ+IHRocm93YWJsZUNsYXNzLCBUaHJvd2luZ1J1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgdHJ5IHsKKyAgICAgIHJ1bm5hYmxlLnJ1bigpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICBpZiAodGhyb3dhYmxlQ2xhc3MuaXNJbnN0YW5jZSh0KSkgeworICAgICAgICByZXR1cm4gdGhyb3dhYmxlQ2xhc3MuY2FzdCh0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZyBtaXNtYXRjaE1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAlcyB0byBiZSB0aHJvd24sIGJ1dCAlcyB3YXMgdGhyb3duIiwKKyAgICAgICAgICAgICAgICB0aHJvd2FibGVDbGFzcy5nZXRTaW1wbGVOYW1lKCksIHQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworCisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXNtYXRjaE1lc3NhZ2UsIHQpOworICAgICAgfQorICAgIH0KKyAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkICVzIHRvIGJlIHRocm93biwgYnV0IG5vdGhpbmcgd2FzIHRocm93biIsCisgICAgICAgICAgICB0aHJvd2FibGVDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0Fzc2VydEpVbml0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvQXNzZXJ0SlVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNDM5MWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0Fzc2VydEpVbml0LmphdmEKQEAgLTAsMCArMSwzNzUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuanVuaXQuQXJyYXlBc3NlcnRzOworCisKKy8qKgorICogQSBzZXQgb2YgYXNzZXJ0IG1ldGhvZHMuICBNZXNzYWdlcyBhcmUgb25seSBkaXNwbGF5ZWQgd2hlbiBhbiBhc3NlcnQgZmFpbHMuCisgKiBSZW5hbWVkIGZyb20gPENPREU+anVuaXQuZnJhbWV3b3JrLkFzc2VydDwvQ09ERT4uCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRKVW5pdCBleHRlbmRzIEFycmF5QXNzZXJ0cyB7CisKKyAgLyoqCisgICAqIFByb3RlY3QgY29uc3RydWN0b3Igc2luY2UgaXQgaXMgYSBzdGF0aWMgb25seSBjbGFzcworICAgKi8KKyAgcHJvdGVjdGVkIEFzc2VydEpVbml0KCkgeworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiBpdCBpc24ndCBpdCB0aHJvd3MKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbikgeworICAgIGlmKCFjb25kaXRpb24pIHsKKyAgICAgIGZhaWwobWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiBpdCBpc24ndCBpdCB0aHJvd3MKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIGNvbmRpdGlvbikgeworICAgIGFzc2VydFRydWUobnVsbCwgY29uZGl0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgZmFsc2UuIElmIGl0IGlzbid0IGl0IHRocm93cworICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEZhbHNlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbikgeworICAgIGFzc2VydFRydWUobWVzc2FnZSwgIWNvbmRpdGlvbik7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIGZhbHNlLiBJZiBpdCBpc24ndCBpdCB0aHJvd3MKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RmFsc2UoYm9vbGVhbiBjb25kaXRpb24pIHsKKyAgICBhc3NlcnRGYWxzZShudWxsLCBjb25kaXRpb24pOworICB9CisKKyAgLyoqCisgICAqIEZhaWxzIGEgdGVzdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAobnVsbCA9PSBtZXNzYWdlKSB7CisgICAgICBtZXNzYWdlID0gIiI7CisgICAgfQorICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlKTsKKyAgfQorCisgIC8qKgorICAgKiBGYWlscyBhIHRlc3Qgd2l0aCBubyBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGZhaWwoKSB7CisgICAgZmFpbChudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKKyAgICBpZigoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZigoZXhwZWN0ZWQgIT0gbnVsbCkgJiYgZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBTdHJpbmdzIGFyZSBlcXVhbC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgeworICAgIGlmKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsID09IG51bGwpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKChleHBlY3RlZCAhPSBudWxsKSAmJiBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZm9ybWF0KG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIFN0cmluZ3MgYXJlIGVxdWFsLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25jZXJuaW5nIGEgZGVsdGEuICBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuICBJZiB0aGUgZXhwZWN0ZWQKKyAgICogdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUgZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIGRlbHRhKSB7CisKKyAgICAvLyBoYW5kbGUgaW5maW5pdHkgc3BlY2lhbGx5IHNpbmNlIHN1YnRyYWN0aW5nIHRvIGluZmluaXRlIHZhbHVlcyBnaXZlcyBOYU4gYW5kIHRoZQorICAgIC8vIHRoZSBmb2xsb3dpbmcgdGVzdCBmYWlscworICAgIGlmKERvdWJsZS5pc0luZmluaXRlKGV4cGVjdGVkKSkgeworICAgICAgaWYoIShleHBlY3RlZCA9PSBhY3R1YWwpKSB7CisgICAgICAgIGZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIShNYXRoLmFicyhleHBlY3RlZCAtIGFjdHVhbCkgPD0gZGVsdGEpKSB7IC8vIEJlY2F1c2UgY29tcGFyaXNvbiB3aXRoIE5hTiBhbHdheXMgcmV0dXJucyBmYWxzZQorICAgICAgZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25jZXJuaW5nIGEgZGVsdGEuIElmIHRoZSBleHBlY3RlZAorICAgKiB2YWx1ZSBpcyBpbmZpbml0eSB0aGVuIHRoZSBkZWx0YSB2YWx1ZSBpcyBpZ25vcmVkLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBkZWx0YSkgeworICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBmbG9hdHMgYXJlIGVxdWFsIGNvbmNlcm5pbmcgYSBkZWx0YS4gSWYgdGhleSBhcmUgbm90CisgICAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLiAgSWYgdGhlIGV4cGVjdGVkCisgICAqIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBmbG9hdCBkZWx0YSkgeworCisgICAgLy8gaGFuZGxlIGluZmluaXR5IHNwZWNpYWxseSBzaW5jZSBzdWJ0cmFjdGluZyB0byBpbmZpbml0ZSB2YWx1ZXMgZ2l2ZXMgTmFOIGFuZCB0aGUKKyAgICAvLyB0aGUgZm9sbG93aW5nIHRlc3QgZmFpbHMKKyAgICBpZihGbG9hdC5pc0luZmluaXRlKGV4cGVjdGVkKSkgeworICAgICAgaWYoIShleHBlY3RlZCA9PSBhY3R1YWwpKSB7CisgICAgICAgIGZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIShNYXRoLmFicyhleHBlY3RlZCAtIGFjdHVhbCkgPD0gZGVsdGEpKSB7CisgICAgICBmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGZsb2F0cyBhcmUgZXF1YWwgY29uY2VybmluZyBhIGRlbHRhLiBJZiB0aGUgZXhwZWN0ZWQKKyAgICogdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUgZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgZmxvYXQgZGVsdGEpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gbG9uZ3MgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBMb25nLnZhbHVlT2YoZXhwZWN0ZWQpLCBMb25nLnZhbHVlT2YoYWN0dWFsKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBsb25ncyBhcmUgZXF1YWwuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGxvbmcgZXhwZWN0ZWQsIGxvbmcgYWN0dWFsKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYm9vbGVhbnMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGV4cGVjdGVkLCBib29sZWFuIGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBCb29sZWFuLnZhbHVlT2YoZXhwZWN0ZWQpLCBCb29sZWFuLnZhbHVlT2YoYWN0dWFsKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBib29sZWFucyBhcmUgZXF1YWwuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGJvb2xlYW4gZXhwZWN0ZWQsIGJvb2xlYW4gYWN0dWFsKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYnl0ZXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBieXRlIGV4cGVjdGVkLCBieXRlIGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBCeXRlLnZhbHVlT2YoZXhwZWN0ZWQpLCBCeXRlLnZhbHVlT2YoYWN0dWFsKSk7CisgIH0KKworICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdHdvIGJ5dGVzIGFyZSBlcXVhbC4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoYnl0ZSBleHBlY3RlZCwgYnl0ZSBhY3R1YWwpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBjaGFycyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGNoYXIgZXhwZWN0ZWQsIGNoYXIgYWN0dWFsKSB7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIENoYXJhY3Rlci52YWx1ZU9mKGV4cGVjdGVkKSwgQ2hhcmFjdGVyLnZhbHVlT2YoYWN0dWFsKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBjaGFycyBhcmUgZXF1YWwuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGNoYXIgZXhwZWN0ZWQsIGNoYXIgYWN0dWFsKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gc2hvcnRzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90CisgICAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgc2hvcnQgZXhwZWN0ZWQsIHNob3J0IGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBTaG9ydC52YWx1ZU9mKGV4cGVjdGVkKSwgU2hvcnQudmFsdWVPZihhY3R1YWwpKTsKKyAgfQorCisgIC8qKgorICAqIEFzc2VydHMgdGhhdCB0d28gc2hvcnRzIGFyZSBlcXVhbC4KKyAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhzaG9ydCBleHBlY3RlZCwgc2hvcnQgYWN0dWFsKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gaW50cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBJbnRlZ2VyLnZhbHVlT2YoZXhwZWN0ZWQpLCBJbnRlZ2VyLnZhbHVlT2YoYWN0dWFsKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBpbnRzIGFyZSBlcXVhbC4KKyAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpc24ndCBudWxsLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoT2JqZWN0IG9iamVjdCkgeworICAgIGFzc2VydE5vdE51bGwobnVsbCwgb2JqZWN0KTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzbid0IG51bGwuIElmIGl0IGlzCisgICAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIG9iamVjdCAhPSBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzIG51bGwuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0TnVsbChPYmplY3Qgb2JqZWN0KSB7CisgICAgYXNzZXJ0TnVsbChudWxsLCBvYmplY3QpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbnVsbC4gIElmIGl0IGlzIG5vdAorICAgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnROdWxsKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLCBvYmplY3QgPT0gbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhleSBhcmUgbm90CisgICAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgeworICAgIGlmKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYWlsTm90U2FtZShtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5IGFyZSBub3QKKyAgICogdGhlIHNhbWUgYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duLgorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7CisgICAgYXNzZXJ0U2FtZShudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5IGFyZSBub3QKKyAgICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0Tm90U2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7CisgICAgaWYoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7CisgICAgICBmYWlsU2FtZShtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4gSWYgdGhleSBhcmUgbm90CisgICAqIHRoZSBzYW1lIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93bi4KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnROb3RTYW1lKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgeworICAgIGFzc2VydE5vdFNhbWUobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGJ5dGVbXSBleHBlY3RlZCwgZmluYWwgYnl0ZVtdIGFjdHVhbCkgeworICAgIGFzc2VydEVxdWFscygiIiwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBieXRlW10gZXhwZWN0ZWQsIGZpbmFsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICBpZihleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihudWxsID09IGV4cGVjdGVkKSB7CisgICAgICBmYWlsKCJleHBlY3RlZCBhIG51bGwgYXJyYXksIGJ1dCBub3QgbnVsbCBmb3VuZC4gIiArIG1lc3NhZ2UpOworICAgIH0KKyAgICBpZihudWxsID09IGFjdHVhbCkgeworICAgICAgICBmYWlsKCJleHBlY3RlZCBub3QgbnVsbCBhcnJheSwgYnV0IG51bGwgZm91bmQuICIgKyBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMoImFycmF5cyBkb24ndCBoYXZlIHRoZSBzYW1lIHNpemUuICIgKyBtZXNzYWdlLCBleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOworCisgICAgZm9yKGludCBpPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYoZXhwZWN0ZWRbaV0gIT0gYWN0dWFsW2ldKSB7CisgICAgICAgICAgICBmYWlsKCJhcnJheXMgZGlmZmVyIGZpcnN0bHkgYXQgZWxlbWVudCBbIiArIGkgKyJdOyAiCisgICAgICAgICAgICAgICAgKyBmb3JtYXQobWVzc2FnZSwgZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSkpOworICAgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIHByaXZhdGUgdm9pZCBmYWlsU2FtZShTdHJpbmcgbWVzc2FnZSkgeworICAgIFN0cmluZyBmb3JtYXR0ZWQgPSAiIjsKKyAgICBpZihtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIGZvcm1hdHRlZCA9IG1lc3NhZ2UgKyAiICI7CisgICAgfQorICAgIGZhaWwoZm9ybWF0dGVkICsgImV4cGVjdGVkIG5vdCBzYW1lIik7CisgIH0KKworICBzdGF0aWMgcHJpdmF0ZSB2b2lkIGZhaWxOb3RTYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKKyAgICBTdHJpbmcgZm9ybWF0dGVkID0gIiI7CisgICAgaWYobWVzc2FnZSAhPSBudWxsKSB7CisgICAgICBmb3JtYXR0ZWQgPSBtZXNzYWdlICsgIiAiOworICAgIH0KKyAgICBmYWlsKGZvcm1hdHRlZCArICJleHBlY3RlZCBzYW1lOjwiICsgZXhwZWN0ZWQgKyAiPiB3YXMgbm90OjwiICsgYWN0dWFsICsgIj4iKTsKKyAgfQorCisgIHN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbE5vdEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7CisgICAgZmFpbChmb3JtYXQobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCkpOworICB9CisKKyAgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgeworICAgIFN0cmluZyBmb3JtYXR0ZWQgPSAiIjsKKyAgICBpZihtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIGZvcm1hdHRlZCA9IG1lc3NhZ2UgKyAiICI7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdHRlZCArICJleHBlY3RlZDo8IiArIGV4cGVjdGVkICsgIj4gYnV0IHdhczo8IiArIGFjdHVhbCArICI+IjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0NsYXNzTWV0aG9kTWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvQ2xhc3NNZXRob2RNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNzViMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0NsYXNzTWV0aG9kTWFwLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5YbWxNZXRob2RTZWxlY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIG1hcCBvZiA8Q09ERT48Q2xhc3MsIExpc3Q8SVRlc3ROR01ldGhvZD4+PC9DT0RFPi4KKyAqIEl0IGlzIHVzZWQgYnkgVGVzdFdvcmtlcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtZXRob2QgdGhleSBqdXN0IHJhbgorICogaXMgdGhlIGxhc3Qgb2YgaXRzIGNsYXNzLCBpbiB3aGljaCBjYXNlIGl0J3MgdGltZSB0byBpbnZva2UgYWxsIHRoZQorICogYWZ0ZXJDbGFzcyBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZVtkb3RdbWluZHN0b3JtW2F0XWdtYWlsW2RvdF1jb20nPkFsZXggUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIENsYXNzTWV0aG9kTWFwIHsKKyAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBMaXN0PElUZXN0TkdNZXRob2Q+PiBtX2NsYXNzTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIC8vIFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgd29ya2VycyB0byBrZWVwIHRyYWNrCisgIC8vIG9mIHdoYXQgYmVmb3JlQ2xhc3MvYWZ0ZXJDbGFzcyBtZXRob2RzIGhhdmUgYmVlbiBpbnZva2VkCisgIHByaXZhdGUgTWFwPElUZXN0Q2xhc3MsIFNldDxPYmplY3Q+PiBtX2JlZm9yZUNsYXNzTWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIE1hcDxJVGVzdENsYXNzLCBTZXQ8T2JqZWN0Pj4gbV9hZnRlckNsYXNzTWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHB1YmxpYyBDbGFzc01ldGhvZE1hcChMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHMsIFhtbE1ldGhvZFNlbGVjdG9yIHhtbE1ldGhvZFNlbGVjdG9yKSB7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICAvLyBPbmx5IGFkZCB0byB0aGUgY2xhc3MgbWFwIG1ldGhvZHMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAvLyBtZXRob2Qgc2VsZWN0b3IuIFdlIGNhbiBwYXNzIGEgbnVsbCBjb250ZXh0IGhlcmUgc2luY2UgdGhlIHNlbGVjdG9yCisgICAgICAvLyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKyAgICAgIGlmICh4bWxNZXRob2RTZWxlY3RvciAhPSBudWxsKXsKKyAgICAJICBpZiAoISB4bWxNZXRob2RTZWxlY3Rvci5pbmNsdWRlTWV0aG9kKG51bGwsIG0sIHRydWUpKSBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgT2JqZWN0IGluc3RhbmNlID0gbS5nZXRJbnN0YW5jZSgpOworICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBsID0gbV9jbGFzc01hcC5nZXQoaW5zdGFuY2UpOworICAgICAgaWYgKGwgPT0gbnVsbCkgeworICAgICAgICBsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIG1fY2xhc3NNYXAucHV0KGluc3RhbmNlLCBsKTsKKyAgICAgIH0KKyAgICAgIGwuYWRkKG0pOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmUgdGhlIG1ldGhvZCBmcm9tIHRoaXMgbWFwIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXMgdGhlIGxhc3QKKyAgICogb2YgaXRzIGNsYXNzLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUFuZENoZWNrSWZMYXN0KElUZXN0TkdNZXRob2QgbSwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBsID0gbV9jbGFzc01hcC5nZXQoaW5zdGFuY2UpOworICAgIGlmIChsICE9IG51bGwpIHsKKyAgICAgIGwucmVtb3ZlKG0pOworICAgICAgLy8gSXQncyB0aGUgbGFzdCBtZXRob2Qgb2YgdGhpcyBjbGFzcyBpZiBhbGwgdGhlIG1ldGhvZHMgcmVtYWluaW5nIGluIHRoZSBsaXN0IGJlbG9uZyB0byBhCisgICAgICAvLyBkaWZmZXJlbnQgY2xhc3MKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCB0bSA6IGwpIHsKKyAgICAgICAgaWYgKHRtLmdldEVuYWJsZWQoKSAmJiB0bS5nZXRUZXN0Q2xhc3MoKS5lcXVhbHMobS5nZXRUZXN0Q2xhc3MoKSkpIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoImwgc2hvdWxkIG5vdCBiZSBudWxsIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBDbGFzczw/PiBnZXRNZXRob2RDbGFzcyhJVGVzdE5HTWV0aG9kIG0pIHsKKyAgICByZXR1cm4gbS5nZXRUZXN0Q2xhc3MoKS5nZXRSZWFsQ2xhc3MoKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8SVRlc3RDbGFzcywgU2V0PE9iamVjdD4+IGdldEludm9rZWRCZWZvcmVDbGFzc01ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlQ2xhc3NNZXRob2RzOworICB9CisKKyAgcHVibGljIE1hcDxJVGVzdENsYXNzLCBTZXQ8T2JqZWN0Pj4gZ2V0SW52b2tlZEFmdGVyQ2xhc3NNZXRob2RzKCkgeworICAgIHJldHVybiBtX2FmdGVyQ2xhc3NNZXRob2RzOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgZm9yKFNldDxPYmplY3Q+IGluc3RhbmNlczogbV9iZWZvcmVDbGFzc01ldGhvZHMudmFsdWVzKCkpIHsKKyAgICAgIGluc3RhbmNlcy5jbGVhcigpOworICAgICAgaW5zdGFuY2VzPSBudWxsOworICAgIH0KKyAgICBmb3IoU2V0PE9iamVjdD4gaW5zdGFuY2VzOiBtX2FmdGVyQ2xhc3NNZXRob2RzLnZhbHVlcygpKSB7CisgICAgICBpbnN0YW5jZXMuY2xlYXIoKTsKKyAgICAgIGluc3RhbmNlcz0gbnVsbDsKKyAgICB9CisgICAgbV9iZWZvcmVDbGFzc01ldGhvZHMuY2xlYXIoKTsKKyAgICBtX2FmdGVyQ2xhc3NNZXRob2RzLmNsZWFyKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9Db21tYW5kTGluZUFyZ3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9Db21tYW5kTGluZUFyZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWZiMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0NvbW1hbmRMaW5lQXJncy5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuY29udmVydGVycy5Db21tYVBhcmFtZXRlclNwbGl0dGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb21tYW5kTGluZUFyZ3MgeworCisgIEBQYXJhbWV0ZXIoZGVzY3JpcHRpb24gPSAiVGhlIFhNTCBzdWl0ZSBmaWxlcyB0byBydW4iKQorICBwdWJsaWMgTGlzdDxTdHJpbmc+IHN1aXRlRmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0cgPSAiLWxvZyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUkJPU0UgPSAiLXZlcmJvc2UiOworICBAUGFyYW1ldGVyKG5hbWVzID0geyBMT0csIFZFUkJPU0UgfSwgZGVzY3JpcHRpb24gPSAiTGV2ZWwgb2YgdmVyYm9zaXR5IikKKyAgcHVibGljIEludGVnZXIgdmVyYm9zZTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUFMgPSAiLWdyb3VwcyI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBHUk9VUFMsIGRlc2NyaXB0aW9uID0gIkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGJlIHJ1biIpCisgIHB1YmxpYyBTdHJpbmcgZ3JvdXBzOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVEX0dST1VQUyA9ICItZXhjbHVkZWdyb3VwcyI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBFWENMVURFRF9HUk9VUFMsIGRlc2NyaXB0aW9uID0iQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZ3JvdXAgbmFtZXMgdG8gIgorICAgICAgKyAiIGV4Y2x1ZGUiKQorICBwdWJsaWMgU3RyaW5nIGV4Y2x1ZGVkR3JvdXBzOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9ESVJFQ1RPUlkgPSAiLWQiOworICBAUGFyYW1ldGVyKG5hbWVzID0gT1VUUFVUX0RJUkVDVE9SWSwgZGVzY3JpcHRpb24gPSJPdXRwdXQgZGlyZWN0b3J5IikKKyAgcHVibGljIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVQgPSAiLWp1bml0IjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IEpVTklULCBkZXNjcmlwdGlvbiA9IkpVbml0IG1vZGUiKQorICBwdWJsaWMgQm9vbGVhbiBqdW5pdCA9IEJvb2xlYW4uRkFMU0U7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlYRUQgPSAiLW1peGVkIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IE1JWEVELCBkZXNjcmlwdGlvbiA9Ik1peGVkIG1vZGUgLSBhdXRvZGV0ZWN0IHRoZSB0eXBlIG9mIGN1cnJlbnQgdGVzdCIgKworICAgICAgIiBhbmQgcnVuIGl0IHdpdGggYXBwcm9wcmlhdGUgcnVubmVyIikKKyAgcHVibGljIEJvb2xlYW4gbWl4ZWQgPSBCb29sZWFuLkZBTFNFOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RFTkVSID0gIi1saXN0ZW5lciI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBMSVNURU5FUiwgZGVzY3JpcHRpb24gPSAiTGlzdCBvZiAuY2xhc3MgZmlsZXMgb3IgbGlzdCBvZiBjbGFzcyBuYW1lcyIgKworICAgICAgIiBpbXBsZW1lbnRpbmcgSVRlc3RMaXN0ZW5lciBvciBJU3VpdGVMaXN0ZW5lciIpCisgIHB1YmxpYyBTdHJpbmcgbGlzdGVuZXI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1NFTEVDVE9SUyA9ICItbWV0aG9kc2VsZWN0b3JzIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IE1FVEhPRF9TRUxFQ1RPUlMsIGRlc2NyaXB0aW9uID0gIkxpc3Qgb2YgLmNsYXNzIGZpbGVzIG9yIGxpc3Qgb2YgY2xhc3MgIiArCisgICAgICAgICJuYW1lcyBpbXBsZW1lbnRpbmcgSU1ldGhvZFNlbGVjdG9yIikKKyAgcHVibGljIFN0cmluZyBtZXRob2RTZWxlY3RvcnM7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0ZBQ1RPUlkgPSAiLW9iamVjdGZhY3RvcnkiOworICBAUGFyYW1ldGVyKG5hbWVzID0gT0JKRUNUX0ZBQ1RPUlksIGRlc2NyaXB0aW9uID0gIkxpc3Qgb2YgLmNsYXNzIGZpbGVzIG9yIGxpc3Qgb2YgY2xhc3MgIiArCisgICAgICAgICJuYW1lcyBpbXBsZW1lbnRpbmcgSVRlc3RSdW5uZXJGYWN0b3J5IikKKyAgcHVibGljIFN0cmluZyBvYmplY3RGYWN0b3J5OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFMTEVMPSAiLXBhcmFsbGVsIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFBBUkFMTEVMLCBkZXNjcmlwdGlvbiA9ICJQYXJhbGxlbCBtb2RlIChtZXRob2RzLCB0ZXN0cyBvciBjbGFzc2VzKSIpCisgIHB1YmxpYyBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgcGFyYWxsZWxNb2RlOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GQUlMVVJFX1BPTElDWSA9ICItY29uZmlnZmFpbHVyZXBvbGljeSI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBDT05GSUdfRkFJTFVSRV9QT0xJQ1kgLCBkZXNjcmlwdGlvbiA9ICJDb25maWd1cmF0aW9uIGZhaWx1cmUgcG9saWN5IChza2lwIG9yIGNvbnRpbnVlKSIpCisgIHB1YmxpYyBTdHJpbmcgY29uZmlnRmFpbHVyZVBvbGljeTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURfQ09VTlQgPSAiLXRocmVhZGNvdW50IjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFRIUkVBRF9DT1VOVCwgZGVzY3JpcHRpb24gPSAiTnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIHdoZW4gcnVubmluZyB0ZXN0cyAiICsKKyAgICAgICJpbiBwYXJhbGxlbCIpCisgIHB1YmxpYyBJbnRlZ2VyIHRocmVhZENvdW50OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUFJPVklERVJfVEhSRUFEX0NPVU5UID0gIi1kYXRhcHJvdmlkZXJ0aHJlYWRjb3VudCI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBEQVRBX1BST1ZJREVSX1RIUkVBRF9DT1VOVCwgZGVzY3JpcHRpb24gPSAiTnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIHdoZW4gIiArCisgICAgICAicnVubmluZyBkYXRhIHByb3ZpZGVycyIpCisgIHB1YmxpYyBJbnRlZ2VyIGRhdGFQcm92aWRlclRocmVhZENvdW50OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX05BTUUgPSAiLXN1aXRlbmFtZSI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBTVUlURV9OQU1FLCBkZXNjcmlwdGlvbiA9ICJEZWZhdWx0IG5hbWUgb2YgdGVzdCBzdWl0ZSwgaWYgbm90IHNwZWNpZmllZCAiICsKKyAgICAgICJpbiBzdWl0ZSBkZWZpbml0aW9uIGZpbGUgb3Igc291cmNlIGNvZGUiKQorICBwdWJsaWMgU3RyaW5nIHN1aXRlTmFtZTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUUgPSAiLXRlc3RuYW1lIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFRFU1RfTkFNRSwgZGVzY3JpcHRpb24gPSAiRGVmYXVsdCBuYW1lIG9mIHRlc3QsIGlmIG5vdCBzcGVjaWZpZWQgaW4gc3VpdGUiICsKKyAgICAgICJkZWZpbml0aW9uIGZpbGUgb3Igc291cmNlIGNvZGUiKQorICBwdWJsaWMgU3RyaW5nIHRlc3ROYW1lOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVEVSID0gIi1yZXBvcnRlciI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBSRVBPUlRFUiwgZGVzY3JpcHRpb24gPSAiRXh0ZW5kZWQgY29uZmlndXJhdGlvbiBmb3IgY3VzdG9tIHJlcG9ydCBsaXN0ZW5lciIpCisgIHB1YmxpYyBTdHJpbmcgcmVwb3J0ZXI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0RFRkFVTFRfTElTVEVORVJTID0gIi11c2VkZWZhdWx0bGlzdGVuZXJzIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFVTRV9ERUZBVUxUX0xJU1RFTkVSUywgZGVzY3JpcHRpb24gPSAiV2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgbGlzdGVuZXJzIikKKyAgcHVibGljIFN0cmluZyB1c2VEZWZhdWx0TGlzdGVuZXJzID0gInRydWUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTID0gIi1za2lwZmFpbGVkaW52b2NhdGlvbmNvdW50cyI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBTS0lQX0ZBSUxFRF9JTlZPQ0FUSU9OX0NPVU5UUywgaGlkZGVuID0gdHJ1ZSkKKyAgcHVibGljIEJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHM7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9ICItdGVzdGNsYXNzIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFRFU1RfQ0xBU1MsIGRlc2NyaXB0aW9uID0gIlRoZSBsaXN0IG9mIHRlc3QgY2xhc3NlcyIpCisgIHB1YmxpYyBTdHJpbmcgdGVzdENsYXNzOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRVMgPSAiLXRlc3RuYW1lcyI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBURVNUX05BTUVTLCBkZXNjcmlwdGlvbiA9ICJUaGUgbGlzdCBvZiB0ZXN0IG5hbWVzIHRvIHJ1biIpCisgIHB1YmxpYyBTdHJpbmcgdGVzdE5hbWVzOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSkFSID0gIi10ZXN0amFyIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFRFU1RfSkFSLCBkZXNjcmlwdGlvbiA9ICJBIGphciBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlc3RzIikKKyAgcHVibGljIFN0cmluZyB0ZXN0SmFyOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QQVRIX0lOX0pBUiA9ICIteG1scGF0aGluamFyIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BBVEhfSU5fSkFSX0RFRkFVTFQgPSAidGVzdG5nLnhtbCI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBYTUxfUEFUSF9JTl9KQVIsIGRlc2NyaXB0aW9uID0gIlRoZSBmdWxsIHBhdGggdG8gdGhlIHhtbCBmaWxlIGluc2lkZSB0aGUgamFyIGZpbGUgKG9ubHkgdmFsaWQgaWYgLXRlc3RqYXIgd2FzIHNwZWNpZmllZCkiKQorICBwdWJsaWMgU3RyaW5nIHhtbFBhdGhJbkphciA9IFhNTF9QQVRIX0lOX0pBUl9ERUZBVUxUOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUlVOTkVSX0ZBQ1RPUlkgPSAiLXRlc3RydW5mYWN0b3J5IjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IHsgVEVTVF9SVU5ORVJfRkFDVE9SWSwgIi10ZXN0UnVuRmFjdG9yeSIgfSwKKyAgICAgIGRlc2NyaXB0aW9uID0gIlRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRlc3RzIikKKyAgcHVibGljIFN0cmluZyB0ZXN0UnVubmVyRmFjdG9yeTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUID0gIi1wb3J0IjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFBPUlQsIGRlc2NyaXB0aW9uID0gIlRoZSBwb3J0IikKKyAgcHVibGljIEludGVnZXIgcG9ydDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gIi1ob3N0IjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IEhPU1QsIGRlc2NyaXB0aW9uID0gIlRoZSBob3N0IiwgaGlkZGVuID0gdHJ1ZSkKKyAgcHVibGljIFN0cmluZyBob3N0OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUiA9ICItbWFzdGVyIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IE1BU1RFUiwgZGVzY3JpcHRpb24gPSAiSG9zdCB3aGVyZSB0aGUgbWFzdGVyIGlzIiwgaGlkZGVuID0gdHJ1ZSkKKyAgcHVibGljIFN0cmluZyBtYXN0ZXI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBVkUgPSAiLXNsYXZlIjsKKyAgQFBhcmFtZXRlcihuYW1lcyA9IFNMQVZFLCBkZXNjcmlwdGlvbiA9ICJIb3N0IHdoZXJlIHRoZSBzbGF2ZSBpcyIsIGhpZGRlbiA9IHRydWUpCisgIHB1YmxpYyBTdHJpbmcgc2xhdmU7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EUyA9ICItbWV0aG9kcyI7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBNRVRIT0RTLCBkZXNjcmlwdGlvbiA9ICJDb21tYSBzZXBhcmF0ZWQgb2YgdGVzdCBtZXRob2RzIiwKKyAgICAgIHNwbGl0dGVyID0gQ29tbWFQYXJhbWV0ZXJTcGxpdHRlci5jbGFzcykKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBjb21tYW5kTGluZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9USFJFQURfUE9PTF9TSVpFID0gIi1zdWl0ZXRocmVhZHBvb2xzaXplIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFNVSVRFX1RIUkVBRF9QT09MX1NJWkVfREVGQVVMVCA9IDE7CisgIEBQYXJhbWV0ZXIobmFtZXMgPSBTVUlURV9USFJFQURfUE9PTF9TSVpFLCBkZXNjcmlwdGlvbiA9ICJTaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB0byB1c2UiCisgICAgICAgICsgIiB0byBydW4gc3VpdGVzIikKKyAgcHVibGljIEludGVnZXIgc3VpdGVUaHJlYWRQb29sU2l6ZSA9IFNVSVRFX1RIUkVBRF9QT09MX1NJWkVfREVGQVVMVDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5ET01JWkVfU1VJVEVTID0gIi1yYW5kb21pemVzdWl0ZXMiOworICBAUGFyYW1ldGVyKG5hbWVzID0gUkFORE9NSVpFX1NVSVRFUywgaGlkZGVuID0gdHJ1ZSwKKyAgICAgIGRlc2NyaXB0aW9uID0gIldoZXRoZXIgdG8gcnVuIHN1aXRlcyBpbiBzYW1lIG9yZGVyIGFzIHNwZWNpZmllZCBpbiBYTUwgb3Igbm90IikKKyAgcHVibGljIEJvb2xlYW4gcmFuZG9taXplU3VpdGVzID0gQm9vbGVhbi5GQUxTRTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICItZGVidWciOworICBAUGFyYW1ldGVyKG5hbWVzID0gREVCVUcsIGhpZGRlbiA9IHRydWUsIGRlc2NyaXB0aW9uID0gIlVzZWQgdG8gZGVidWcgVGVzdE5HIikKKyAgcHVibGljIEJvb2xlYW4gZGVidWcgPSBCb29sZWFuLkZBTFNFOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvQ29udmVyc2lvblV0aWxzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvQ29udmVyc2lvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5NWVlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9Db252ZXJzaW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIHVzZWQgYnkgdGhlIEVjbGlwc2UgcGx1Zy1pbiB3aGVuIGNvbnZlcnRpbmcgdGVzdHMgZnJvbSBKVW5pdC4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDb252ZXJzaW9uVXRpbHMgeworICAvKioKKyAgICogVHVybnMgdGhlIG91dHB1dCBvZiBhIEpVbml0IDQgQFBhcmFtZXRlcnMgc3R5bGUgZGF0YSBwcm92aWRlciBpbnRvCisgICAqIG9uZSB0aGF0IGlzIHN1aXRhYmxlIGZvciBUZXN0TkcncyBARGF0YVByb3ZpZGVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBPYmplY3RbXSB3cmFwRGF0YVByb3ZpZGVyKENsYXNzIGNscywgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSkgeworICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgIGZvciAoT2JqZWN0IG8gOiBkYXRhKSB7CisgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gKE9iamVjdFtdKSBvOworICAgICAgQ29uc3RydWN0b3IgY3RvciA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBmb3IgKENvbnN0cnVjdG9yIGMgOiBjbHMuZ2V0Q29uc3RydWN0b3JzKCkpIHsKKyAgICAgICAgICAvLyBKdXN0IGNvbXBhcmluZyBwYXJhbWV0ZXIgYXJyYXkgc2l6ZXMuIENvbXBhcmluZyB0aGUgcGFyYW1ldGVyIHR5cGVzCisgICAgICAgICAgLy8gaXMgbW9yZSBlcnJvciBwcm9uZSBzaW5jZSB3ZSBuZWVkIHRvIHRha2UgY29udmVyc2lvbnMgaW50byBhY2NvdW50CisgICAgICAgICAgLy8gKGludCAtPiBJbnRlZ2VyLCBldGMuLi4pLgorICAgICAgICAgIGlmIChjLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IHBhcmFtZXRlcnMubGVuZ3RoKSB7CisgICAgICAgICAgICBjdG9yID0gYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ291bGRuJ3QgZmluZCBhIGNvbnN0cnVjdG9yIGluICIgKyBjbHMpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LmFkZChjdG9yLm5ld0luc3RhbmNlKHBhcmFtZXRlcnMpKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0NvbnZlcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDliNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuSkNvbW1hbmRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuUGFyYW1ldGVyRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuWWFtbDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5QYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQ29udmVydCBYTUwgZmlsZXMgdG8gWUFNTCBhbmQgdmljZSB2ZXJzYS4KKyAqIAorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIENvbnZlcnRlciB7CisKKyAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJmaWxlMSBbZmlsZTIgZmlsZTMuLi5dIiwgcmVxdWlyZWQgPSB0cnVlKQorICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2ZpbGVzOworCisgIEBQYXJhbWV0ZXIobmFtZXMgPSAiLWQiLCBkZXNjcmlwdGlvbiA9ICJUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlKHMpIHdpbGwgYmUgY3JlYXRlZCIpCisgIHByaXZhdGUgU3RyaW5nIG1fb3V0cHV0RGlyZWN0b3J5ID0gIi4iOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgQ29udmVydGVyIGMgPSBuZXcgQ29udmVydGVyKCk7CisgICAgYy5ydW4oYXJncyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZmluZEFsbFN1aXRlcyhDb2xsZWN0aW9uPFhtbFN1aXRlPiBzdWl0ZXMsIFNldDxYbWxTdWl0ZT4gcmVzdWx0KSB7CisgICAgZm9yIChYbWxTdWl0ZSBzIDogc3VpdGVzKSB7CisgICAgICByZXN1bHQuYWRkKHMpOworICAgICAgZm9yIChYbWxTdWl0ZSB4cyA6IHMuZ2V0Q2hpbGRTdWl0ZXMoKSkgeworICAgICAgICBmaW5kQWxsU3VpdGVzKEFycmF5cy5hc0xpc3QoeHMpLCByZXN1bHQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW4oU3RyaW5nW10gYXJncykKKyAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBKQ29tbWFuZGVyIGpjID0gbmV3IEpDb21tYW5kZXIodGhpcyk7CisgICAgdHJ5IHsKKyAgICAgIGpjLnBhcnNlKGFyZ3MpOworICAgICAgRmlsZSBmID0gbmV3IEZpbGUobV9vdXRwdXREaXJlY3RvcnkpOworICAgICAgaWYgKCEgZi5leGlzdHMoKSkgZi5ta2RpcigpOworCisgICAgICBmb3IgKFN0cmluZyBmaWxlIDogbV9maWxlcykgeworICAgICAgICBTZXQ8WG1sU3VpdGU+IGFsbFN1aXRlcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihmaWxlKTsKKyAgICAgICAgcGFyc2VyLnNldExvYWRDbGFzc2VzKGZhbHNlKTsgIC8vIHdlIG1pZ2h0IG5vdCBoYXZlIHRoZXNlIGNsYXNzZXMgb24gdGhlIGNsYXNzcGF0aAorICAgICAgICBmaW5kQWxsU3VpdGVzKHBhcnNlci5wYXJzZSgpLCBhbGxTdWl0ZXMpOworCisgICAgICAgIGZvciAoWG1sU3VpdGUgc3VpdGUgOiBhbGxTdWl0ZXMpIHsKKyAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBzdWl0ZS5nZXRGaWxlTmFtZSgpOworICAgICAgICAgIGludCBpbmQgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgIFN0cmluZyBibiA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmQpOworICAgICAgICAgIGludCBpbmQyID0gYm4ubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBibi5zdWJzdHJpbmcoaW5kMiArIDEpOworCisgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobV9vdXRwdXREaXJlY3RvcnksIGJhc2VOYW1lICsgIi55YW1sIik7CisgICAgICAgICAgICB3cml0ZUZpbGUobmV3RmlsZSwgWWFtbC50b1lhbWwoc3VpdGUpLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChmaWxlLmVuZHNXaXRoKCIueWFtbCIpKSB7CisgICAgICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShtX291dHB1dERpcmVjdG9yeSwgYmFzZU5hbWUgKyAiLnhtbCIpOworICAgICAgICAgICAgd3JpdGVGaWxlKG5ld0ZpbGUsIHN1aXRlLnRvWG1sKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlVua25vd24gZmlsZSB0eXBlOiIgKyBmaWxlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goUGFyYW1ldGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgIGpjLnVzYWdlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZShGaWxlIG5ld0ZpbGUsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSAoRmlsZVdyaXRlciBidyA9IG5ldyBGaWxlV3JpdGVyKG5ld0ZpbGUpKSB7CisgICAgICBidy53cml0ZShjb250ZW50KTsKKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSAiICsgbmV3RmlsZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9EZXBlbmRlbmN5TWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvRGVwZW5kZW5jeU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzg5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvRGVwZW5kZW5jeU1hcC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdE11bHRpTWFwOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuU2V0czsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8ga2VlcCB0cmFjayBvZiBkZXBlbmRlbmNpZXMuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBEZXBlbmRlbmN5TWFwIHsKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8U3RyaW5nLCBJVGVzdE5HTWV0aG9kPiBtX2RlcGVuZGVuY2llcyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgIHByaXZhdGUgTGlzdE11bHRpTWFwPFN0cmluZywgSVRlc3ROR01ldGhvZD4gbV9ncm91cHMgPSBNYXBzLm5ld0xpc3RNdWx0aU1hcCgpOworCisgIHB1YmxpYyBEZXBlbmRlbmN5TWFwKElUZXN0TkdNZXRob2RbXSBtZXRob2RzKSB7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgCW1fZGVwZW5kZW5jaWVzLnB1dCggbS5nZXRSZWFsQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyAgbS5nZXRNZXRob2ROYW1lKCksIG0pOworICAgICAgZm9yIChTdHJpbmcgZyA6IG0uZ2V0R3JvdXBzKCkpIHsKKyAgICAgICAgbV9ncm91cHMucHV0KGcsIG0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0PElUZXN0TkdNZXRob2Q+IGdldE1ldGhvZHNUaGF0QmVsb25nVG8oU3RyaW5nIGdyb3VwLCBJVGVzdE5HTWV0aG9kIGZyb21NZXRob2QpIHsKKyAgICBTZXQ8U3RyaW5nPiB1bmlxdWVLZXlzID0gbV9ncm91cHMua2V5U2V0KCk7CisKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgZm9yIChTdHJpbmcgayA6IHVuaXF1ZUtleXMpIHsKKyAgICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMoZ3JvdXAsIGspKSB7CisgICAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdGVtcCA9IG1fZ3JvdXBzLmdldChrKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gbnVsbCkKKyAgICAgICAgICByZXN1bHQuYWRkQWxsKG1fZ3JvdXBzLmdldChrKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkgJiYgIWZyb21NZXRob2QuaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJEZXBlbmRlbmN5TWFwOjpNZXRob2QgXCIiICsgZnJvbU1ldGhvZAorICAgICAgICAgICsgIlwiIGRlcGVuZHMgb24gbm9uZXhpc3RlbnQgZ3JvdXAgXCIiICsgZ3JvdXAgKyAiXCIiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgSVRlc3ROR01ldGhvZCBnZXRNZXRob2REZXBlbmRpbmdPbihTdHJpbmcgbWV0aG9kTmFtZSwgSVRlc3ROR01ldGhvZCBmcm9tTWV0aG9kKSB7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBsID0gbV9kZXBlbmRlbmNpZXMuZ2V0KG1ldGhvZE5hbWUpOworICAgIGlmIChsID09IG51bGwgJiYgZnJvbU1ldGhvZC5pZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKCkpeworICAgIAlyZXR1cm4gZnJvbU1ldGhvZDsKKyAgICB9CisgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBsKSB7CisgICAgICAgIC8vIElmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGNsYXNzIGhpZXJhcmNoeSwgdGhleSBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBpbnN0YW5jZSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdCdzIGEgbWV0aG9kIGRlcGVuZGluZyBvbiBhIG1ldGhvZCBpbiBhIGRpZmZlcmVudCBjbGFzcyBzbyB3ZQorICAgICAgICAvLyBkb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIGluc3RhbmNlCisgICAgICAgIGlmIChmcm9tTWV0aG9kLmdldFJlYWxDbGFzcygpLmlzQXNzaWduYWJsZUZyb20obS5nZXRSZWFsQ2xhc3MoKSkpIHsKKyAgICAgICAgICBpZiAobS5nZXRJbnN0YW5jZSgpID09IGZyb21NZXRob2QuZ2V0SW5zdGFuY2UoKSkgcmV0dXJuIG07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiTWV0aG9kIFwiIiArIGZyb21NZXRob2QKKyAgICAgICAgKyAiXCIgZGVwZW5kcyBvbiBub25leGlzdGVudCBtZXRob2QgXCIiICsgbWV0aG9kTmFtZSArICJcIiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvRmlsZUFzc2VydC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0ZpbGVBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDlhM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0ZpbGVBc3NlcnQuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQXNzZXJ0aW9uIHRvb2wgZm9yIEZpbGUgY2VudHJpYyBhc3NlcnRpb25zLgorICogQ29uY2VwdHVhbGx5IHRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIHtAbGluayBBc3NlcnR9CisgKiBQcmVzZW50cyBhc3NlcnRpb24gbWV0aG9kcyB3aXRoIGEgbW9yZSBuYXR1cmFsIHBhcmFtZXRlciBvcmRlci4KKyAqIFRoZSBvcmRlciBpcyBhbHdheXMgPEI+YWN0dWFsVmFsdWU8L0I+LCA8Qj5leHBlY3RlZFZhbHVlPC9CPiBbLCBtZXNzYWdlXS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzpwbWVuZGVsc29uQHRydWVvdXRjb21lcy5jb20nPlBhdWwgTWVuZGVsb248L2E+CisgKiBAc2luY2UgNS42CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDY1MCAkLCAkRGF0ZTogMjAwOS0wMS0wNSAwMzo1MTo1NCAtMDgwMCAoTW9uLCAwNSBKYW4gMjAwOSkgJAorICovCitwdWJsaWMgY2xhc3MgRmlsZUFzc2VydCB7CisKKyAgLyoqCisgICAqIFByb3RlY3QgY29uc3RydWN0b3Igc2luY2UgaXQgaXMgYSBzdGF0aWMgb25seSBjbGFzcworICAgKi8KKyAgcHJpdmF0ZSBGaWxlQXNzZXJ0KCkgeworICAJLy8gaGlkZSBjb25zdHJ1Y3RvcgorICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhIHtAY29kZSB0c3R2YWx1ZX0gaXMgYSBwcm9wZXIgZGlyZWN0b3J5LiBJZiBpdCBpc24ndCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIHRzdHZhbHVlIHRoZSBmaWxlIHRvIGV2YWx1YXRlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydERpcmVjdG9yeShGaWxlIHRzdHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAJYm9vbGVhbiBjb25kaXRpb249ZmFsc2U7CisgIAl0cnkgeworICAJY29uZGl0aW9uPXRzdHZhbHVlLmlzRGlyZWN0b3J5KCk7CisgIAl9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgCWZhaWxTZWN1cml0eShlLHRzdHZhbHVlLGZpbGVUeXBlKHRzdHZhbHVlKSwiRGlyZWN0b3J5IiwgbWVzc2FnZSk7CisgIAl9CisgIAlpZighY29uZGl0aW9uKSB7CisgIAlmYWlsRmlsZSh0c3R2YWx1ZSxmaWxlVHlwZSh0c3R2YWx1ZSksIkRpcmVjdG9yeSIsIG1lc3NhZ2UpOworICAJfQorICB9CisKKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydERpcmVjdG9yeShGaWxlIHRzdHZhbHVlKSB7CisgIAlhc3NlcnREaXJlY3RvcnkodHN0dmFsdWUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhIHtAY29kZSB0c3R2YWx1ZX0gaXMgYSBwcm9wZXIgZmlsZS4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSB0c3R2YWx1ZSB0aGUgZmlsZSB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRGaWxlKEZpbGUgdHN0dmFsdWUsIFN0cmluZyBtZXNzYWdlKSB7CisgIAlib29sZWFuIGNvbmRpdGlvbj1mYWxzZTsKKyAgCXRyeSB7CisgIAljb25kaXRpb249dHN0dmFsdWUuaXNGaWxlKCk7CisgIAl9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgCWZhaWxTZWN1cml0eShlLHRzdHZhbHVlLGZpbGVUeXBlKHRzdHZhbHVlKSwiRmlsZSIsIG1lc3NhZ2UpOworICAJfQorICAJaWYoIWNvbmRpdGlvbikgeworICAJZmFpbEZpbGUodHN0dmFsdWUsZmlsZVR5cGUodHN0dmFsdWUpLCJGaWxlIiwgbWVzc2FnZSk7CisgIAl9CisgIH0KKworICAvKioKKyAgICogQHNlZSAjYXNzZXJ0RmlsZShGaWxlLCBTdHJpbmcpCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RmlsZShGaWxlIHRzdHZhbHVlKSB7CisgIAlhc3NlcnRGaWxlKHRzdHZhbHVlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSB7QGNvZGUgdHN0dmFsdWV9IGlzIGEgZmlsZSBvZiBleGFjdGx5IHtAY29kZSBleHBlY3RlZH0gY2hhcmFjdGVycworICAgKiBvciBhIGRpcmVjdG9yeSBvZiBleGFjdGx5IHtAY29kZSBleHBlY3RlZH0gZW50cmllcy4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSB0c3R2YWx1ZSB0aGUgZmlsZSB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRMZW5ndGgoRmlsZSB0c3R2YWx1ZSwgbG9uZyBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgCWxvbmcgYWN0dWFsPS0xTDsKKyAgCXRyeSB7CisgIAlhY3R1YWw9dHN0dmFsdWUuaXNEaXJlY3RvcnkoKT90c3R2YWx1ZS5saXN0KCkubGVuZ3RoOnRzdHZhbHVlLmxlbmd0aCgpOworICAJfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgIAlmYWlsU2VjdXJpdHkoZSx0c3R2YWx1ZSxTdHJpbmcudmFsdWVPZihhY3R1YWwpLFN0cmluZy52YWx1ZU9mKGV4cGVjdGVkKSwgbWVzc2FnZSk7CisgIAl9CisgIAlpZihhY3R1YWwhPWV4cGVjdGVkKSB7CisgIAlmYWlsRmlsZSh0c3R2YWx1ZSxTdHJpbmcudmFsdWVPZihhY3R1YWwpLFN0cmluZy52YWx1ZU9mKGV4cGVjdGVkKSwgbWVzc2FnZSk7CisgIAl9CisgIH0KKworICAvKioKKyAgICogQHNlZSAjYXNzZXJ0TGVuZ3RoKEZpbGUsIGxvbmcsIFN0cmluZykKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRMZW5ndGgoRmlsZSB0c3R2YWx1ZSwgbG9uZyBleHBlY3RlZCkgeworICAJYXNzZXJ0TGVuZ3RoKHRzdHZhbHVlLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IGEge0Bjb2RlIHRzdHZhbHVlfSBpcyBhIGZpbGUgb2YgYXQgbGVhc3Qge0Bjb2RlIGV4cGVjdGVkfSBjaGFyYWN0ZXJzCisgICAqIG9yIGEgZGlyZWN0b3J5IG9mIGF0IGxlYXN0IHtAY29kZSBleHBlY3RlZH0gZW50cmllcy4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSB0c3R2YWx1ZSB0aGUgZmlsZSB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRNaW5MZW5ndGgoRmlsZSB0c3R2YWx1ZSwgbG9uZyBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgCWxvbmcgYWN0dWFsPS0xTDsKKyAgCXRyeSB7CisgIAlhY3R1YWw9dHN0dmFsdWUuaXNEaXJlY3RvcnkoKT90c3R2YWx1ZS5saXN0KCkubGVuZ3RoOnRzdHZhbHVlLmxlbmd0aCgpOworICAJfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgIAlmYWlsU2VjdXJpdHkoZSx0c3R2YWx1ZSxTdHJpbmcudmFsdWVPZihhY3R1YWwpLCJhdCBsZWFzdCAiK1N0cmluZy52YWx1ZU9mKGV4cGVjdGVkKSwgbWVzc2FnZSk7CisgIAl9CisgIAlpZihhY3R1YWw8ZXhwZWN0ZWQpIHsKKyAgCWZhaWxGaWxlKHRzdHZhbHVlLFN0cmluZy52YWx1ZU9mKGFjdHVhbCksImF0IGxlYXN0ICIrU3RyaW5nLnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgCX0KKyAgfQorCisgIC8qKgorICAgKiBAc2VlICNhc3NlcnRNaW5MZW5ndGgoRmlsZSwgbG9uZywgU3RyaW5nKQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE1pbkxlbmd0aChGaWxlIHRzdHZhbHVlLCBsb25nIGV4cGVjdGVkKSB7CisgIAlhc3NlcnRNaW5MZW5ndGgodHN0dmFsdWUsIGV4cGVjdGVkLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgYSB7QGNvZGUgdHN0dmFsdWV9IGlzIGEgZmlsZSBvZiBhdCBtb3N0IHtAY29kZSBleHBlY3RlZH0gY2hhcmFjdGVycworICAgKiBvciBhIGRpcmVjdG9yeSBvZiBhdCBtb3N0IHtAY29kZSBleHBlY3RlZH0gZW50cmllcy4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSB0c3R2YWx1ZSB0aGUgZmlsZSB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRNYXhMZW5ndGgoRmlsZSB0c3R2YWx1ZSwgbG9uZyBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgCWxvbmcgYWN0dWFsPS0xTDsKKyAgCXRyeSB7CisgIAlhY3R1YWw9dHN0dmFsdWUuaXNEaXJlY3RvcnkoKT90c3R2YWx1ZS5saXN0KCkubGVuZ3RoOnRzdHZhbHVlLmxlbmd0aCgpOworICAJfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgIAlmYWlsU2VjdXJpdHkoZSx0c3R2YWx1ZSxTdHJpbmcudmFsdWVPZihhY3R1YWwpLCJhdCBtb3N0ICIrU3RyaW5nLnZhbHVlT2YoZXhwZWN0ZWQpLCBtZXNzYWdlKTsKKyAgCX0KKyAgCWlmKGFjdHVhbD5leHBlY3RlZCkgeworICAJZmFpbEZpbGUodHN0dmFsdWUsU3RyaW5nLnZhbHVlT2YoYWN0dWFsKSwiYXQgbW9zdCAiK1N0cmluZy52YWx1ZU9mKGV4cGVjdGVkKSwgbWVzc2FnZSk7CisgIAl9CisgIH0KKworICAvKioKKyAgICogQHNlZSAjYXNzZXJ0TWF4TGVuZ3RoKEZpbGUsIGxvbmcsIFN0cmluZykKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRNYXhMZW5ndGgoRmlsZSB0c3R2YWx1ZSwgbG9uZyBleHBlY3RlZCkgeworICAJYXNzZXJ0TWF4TGVuZ3RoKHRzdHZhbHVlLCBleHBlY3RlZCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IGEge0Bjb2RlIHRzdHZhbHVlfSBpcyByZWFkYWJsZS4gSWYgaXQgaXNuJ3QsCisgICAqIGFuIEFzc2VydGlvbkVycm9yLCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBpcyB0aHJvd24uCisgICAqIEBwYXJhbSB0c3R2YWx1ZSB0aGUgZmlsZSB0byBldmFsdWF0ZQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgYXNzZXJ0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRSZWFkYWJsZShGaWxlIHRzdHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAJYm9vbGVhbiBjb25kaXRpb249ZmFsc2U7CisgIAl0cnkgeworICAJY29uZGl0aW9uPXRzdHZhbHVlLmNhblJlYWQoKTsKKyAgCX0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAJZmFpbFNlY3VyaXR5KGUsdHN0dmFsdWUsZmlsZUFjY2Vzcyh0c3R2YWx1ZSksIlJlYWQgQWNjZXNzIiwgbWVzc2FnZSk7CisgIAl9CisgIAlpZighY29uZGl0aW9uKSB7CisgIAlmYWlsRmlsZSh0c3R2YWx1ZSxmaWxlQWNjZXNzKHRzdHZhbHVlKSwiUmVhZCBBY2Nlc3MiLCBtZXNzYWdlKTsKKyAgCX0KKyAgfQorCisgIC8qKgorICAgKiBAc2VlICNhc3NlcnRSZWFkYWJsZShGaWxlLCBTdHJpbmcpCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0UmVhZGFibGUoRmlsZSB0c3R2YWx1ZSkgeworICAJYXNzZXJ0UmVhZGFibGUodHN0dmFsdWUsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCBhIHtAY29kZSB0c3R2YWx1ZX0gaXMgd3JpdGVhYmxlLiBJZiBpdCBpc24ndCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIHRzdHZhbHVlIHRoZSBmaWxlIHRvIGV2YWx1YXRlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFdyaXRlYWJsZShGaWxlIHRzdHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAJYm9vbGVhbiBjb25kaXRpb249ZmFsc2U7CisgIAl0cnkgeworICAJY29uZGl0aW9uPXRzdHZhbHVlLmNhbldyaXRlKCk7CisgIAl9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgCWZhaWxTZWN1cml0eShlLHRzdHZhbHVlLGZpbGVBY2Nlc3ModHN0dmFsdWUpLCJXcml0ZSBBY2Nlc3MiLCBtZXNzYWdlKTsKKyAgCX0KKyAgCWlmKCFjb25kaXRpb24pIHsKKyAgCWZhaWxGaWxlKHRzdHZhbHVlLGZpbGVBY2Nlc3ModHN0dmFsdWUpLCJXcml0ZSBBY2Nlc3MiLCBtZXNzYWdlKTsKKyAgCX0KKyAgfQorCisgIC8qKgorICAgKiBAc2VlICNhc3NlcnRXcml0ZWFibGUoRmlsZSwgU3RyaW5nKQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFdyaXRlYWJsZShGaWxlIHRzdHZhbHVlKSB7CisgIAlhc3NlcnRSZWFkYWJsZSh0c3R2YWx1ZSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IGEge0Bjb2RlIHRzdHZhbHVlfSBpcyByZWFkYWJsZSBhbmQgd3JpdGVhYmxlLiBJZiBpdCBpc24ndCwKKyAgICogYW4gQXNzZXJ0aW9uRXJyb3IsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGlzIHRocm93bi4KKyAgICogQHBhcmFtIHRzdHZhbHVlIHRoZSBmaWxlIHRvIGV2YWx1YXRlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKi8KKyAgc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFJlYWRXcml0ZShGaWxlIHRzdHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgeworICAJYm9vbGVhbiBjb25kaXRpb249ZmFsc2U7CisgIAl0cnkgeworICAJY29uZGl0aW9uPXRzdHZhbHVlLmNhblJlYWQoKSAmJiB0c3R2YWx1ZS5jYW5Xcml0ZSgpOworICAJfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgIAlmYWlsU2VjdXJpdHkoZSx0c3R2YWx1ZSxmaWxlQWNjZXNzKHRzdHZhbHVlKSwiUmVhZC9Xcml0ZSBBY2Nlc3MiLCBtZXNzYWdlKTsKKyAgCX0KKyAgCWlmKCFjb25kaXRpb24pIHsKKyAgCWZhaWxGaWxlKHRzdHZhbHVlLGZpbGVBY2Nlc3ModHN0dmFsdWUpLCJSZWFkL1dyaXRlIEFjY2VzcyIsIG1lc3NhZ2UpOworICAJfQorICB9CisKKyAgLyoqCisgICAqIEBzZWUgI2Fzc2VydFJlYWRXcml0ZShGaWxlLCBTdHJpbmcpCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0UmVhZFdyaXRlKEZpbGUgdHN0dmFsdWUpIHsKKyAgCWFzc2VydFJlYWRXcml0ZSh0c3R2YWx1ZSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogRmFpbHMgYSB0ZXN0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIHdyYXBwaW5nIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uCisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBhc3NlcnRpb24gZXJyb3IgbWVzc2FnZQorICAgKiBAcGFyYW0gcmVhbENhdXNlIHRoZSBvcmlnaW5hbCBleGNlcHRpb24KKyAgICovCisgIHN0YXRpYyBwdWJsaWMgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcmVhbENhdXNlKSB7CisgIAlBc3NlcnRpb25FcnJvciBhZSA9IG5ldyBBc3NlcnRpb25FcnJvcihtZXNzYWdlKTsKKyAgCWFlLmluaXRDYXVzZShyZWFsQ2F1c2UpOworCisgIAl0aHJvdyBhZTsKKyAgfQorCisgIC8qKgorICAgKiBGYWlscyBhIHRlc3Qgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGFzc2VydGlvbiBlcnJvciBtZXNzYWdlCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgeworICAJdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpOworICB9CisKKyAgLyoqCisgICAqIEZhaWxzIGEgdGVzdCB3aXRoIG5vIG1lc3NhZ2UuCisgICAqLworICBzdGF0aWMgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgCWZhaWwobnVsbCk7CisgIH0KKworICAvKioKKyAgICogRm9ybWF0cyBmYWlsdXJlIGZvciBmaWxlIGFzc2VydGlvbnMKKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbEZpbGUoRmlsZSBwYXRoLCBTdHJpbmcgYWN0dWFsLCBTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBtZXNzYWdlKSB7CisgIAlTdHJpbmcgZm9ybWF0dGVkID0gIiI7CisgIAlpZihtZXNzYWdlICE9IG51bGwpIHsKKyAgCWZvcm1hdHRlZCA9IG1lc3NhZ2UgKyAiICI7CisgIAl9CisgIAlmYWlsKGZvcm1hdHRlZCArICJleHBlY3RlZCA8IiArIGV4cGVjdGVkICsiPiBidXQgd2FzIDwiICsgdG9TdHJpbmcocGF0aCkgKyAiPiIKKyAgCQkrKGV4cGVjdGVkIT1udWxsPyI8IiArIGV4cGVjdGVkICsiPiI6IiIpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdHN0dmFsdWUKKyAgICogQHBhcmFtIHN0cmluZworICAgKiBAcGFyYW0gc3RyaW5nMgorICAgKiBAcGFyYW0gbWVzc2FnZQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsU2VjdXJpdHkoRXhjZXB0aW9uIGUsIEZpbGUgcGF0aCwgU3RyaW5nIGFjdHVhbCwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgbWVzc2FnZSkgeworICAJU3RyaW5nIGZvcm1hdHRlZCA9ICIiOworICAJaWYobWVzc2FnZSAhPSBudWxsKSB7CisgIAlmb3JtYXR0ZWQgPSBtZXNzYWdlICsgIiAiOworICAJfQorICAJZmFpbChmb3JtYXR0ZWQgKyAiZXhwZWN0ZWQgPCIgKyBleHBlY3RlZCArIj4gYnV0IHdhcyA8IiArIHRvU3RyaW5nKHBhdGgpICsgIj4iCisgIAkJKyI8IgorICAJCSsgKGUhPW51bGwgJiYgZS5nZXRNZXNzYWdlKCkhPW51bGwgJiYgZS5nZXRNZXNzYWdlKCkubGVuZ3RoKCk+MAorICAJCQk/ZS5nZXRNZXNzYWdlKCkKKyAgCQkJOiJub3QgYXV0aG9yaXplZCBieSBKVk0iKQorICAJCSsgIj4iKTsKKyAgfQorCisgIC8qKgorICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygd2hhdCBzb3J0IG9mIGZpbGUge0Bjb2RlIHBhdGh9IGlzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbGVUeXBlKEZpbGUgcGF0aCkgeworICAJdHJ5IHsKKyAgCWlmKCFwYXRoLmV4aXN0cygpKSB7CisgICAgICByZXR1cm4gIk5vbiBleGlzdGFudCI7CisgICAgfSBlbHNlIGlmIChwYXRoLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgIHJldHVybiAiRGlyZWN0b3J5IjsKKyAgICB9IGVsc2UgaWYgKHBhdGguaXNGaWxlKCkpIHsKKyAgICAgIHJldHVybiAiRmlsZSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3BlY2lhbCBGaWxlIjsKKyAgICB9CisgIAl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgIAlyZXR1cm4gIlVuYXV0aG9yaXplZCI7CisgIAl9CisgIH0KKworICAvKioKKyAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHdoYXQgc29ydCBvZiBmaWxlIHtAY29kZSBwYXRofSBpcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaWxlQWNjZXNzKEZpbGUgcGF0aCkgeworICAJdHJ5IHsKKyAgCWlmKCFwYXRoLmV4aXN0cygpKSB7CisgICAgICByZXR1cm4gIk5vbiBleGlzdGFudCI7CisgICAgfSBlbHNlIGlmIChwYXRoLmNhbldyaXRlKCkgJiYgcGF0aC5jYW5SZWFkKCkpIHsKKyAgICAgIHJldHVybiAiUmVhZC9Xcml0ZSBBY2Nlc3MiOworICAgIH0gZWxzZSBpZiAocGF0aC5jYW5SZWFkKCkpIHsKKyAgICAgIHJldHVybiAiUmVhZCBvbmx5IEFjY2VzcyI7CisgICAgfSBlbHNlIGlmIChwYXRoLmNhbldyaXRlKCkpIHsKKyAgICAgIHJldHVybiAiV3JpdGUgb25seSBBY2Nlc3MiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIk5vIEFjY2VzcyI7CisgICAgfQorICAJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAJcmV0dXJuICJVbmF1dGhvcml6ZWQiOworICAJfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKEZpbGUgcGF0aCkgeworICAJdHJ5IHsKKyAgCXJldHVybiBwYXRoLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAJcmV0dXJuIHBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7CisgIAl9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQWx0ZXJTdWl0ZUxpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUFsdGVyU3VpdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUFsdGVyU3VpdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgZ2FpbiBhY2Nlc3MgdG8gdGhlIHtAbGluayBYbWxTdWl0ZX0gb2JqZWN0IGFuZCB0aHVzIGxldCB1c2VycyBiZSBhYmxlIHRvCisgKiBhbHRlciBhIHN1aXRlIG9yIGEgdGVzdCBiYXNlZCBvbiB0aGVpciBvd24gbmVlZHMuCisgKiBUaGlzIGxpc3RlbmVyIGNhbiBiZSBhZGRlZCBPTkxZIHZpYSB0aGUgZm9sbG93aW5nIHR3byB3YXlzIDoKKyAqIDxvbD4KKyAqIDxsaT4mbHQ7PGNvZGU+bGlzdGVuZXJzPC9jb2RlPiZndDsgdGFnIGluIGEgc3VpdGUgZmlsZS48L2xpPgorICogPGxpPnZpYSBTZXJ2aWNlIGxvYWRlcnM8L2xpPgorICogPC9vbD4KKyAqIDxwLz4KKyAqIDxiPk5vdGU6IDwvYj5UaGlzIGxpc3RlbmVyIDxiPjx1PndpbGwgTk9UIGJlIGludm9rZWQ8L3U+PC9iPiBpZiBpdCBpcyB3aXJlZCBpbiB2aWEgdGhlICYjMDY0Ozxjb2RlPkxpc3RlbmVyczwvY29kZT4KKyAqIGFubm90YXRpb24uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUFsdGVyU3VpdGVMaXN0ZW5lciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHBhcmFtIHN1aXRlcyAtIFRoZSBsaXN0IG9mIHtAbGluayBYbWxTdWl0ZX1zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGN1cnJlbnQgZXhlY3V0aW9uLgorICAgICAqLworICAgIHZvaWQgYWx0ZXIoTGlzdDxYbWxTdWl0ZT4gc3VpdGVzKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQW5ub3RhdGlvblRyYW5zZm9ybWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU0MTNhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQW5ub3RhdGlvblRyYW5zZm9ybWVyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25UcmFuc2Zvcm1lciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSBUZXN0TkcgdG8gZ2l2ZSB5b3UgYSBjaGFuY2UKKyAgICogdG8gbW9kaWZ5IGEgVGVzdE5HIGFubm90YXRpb24gcmVhZCBmcm9tIHlvdXIgdGVzdCBjbGFzc2VzLgorICAgKiBZb3UgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIHlvdSBuZWVkIGJ5IGNhbGxpbmcgYW55IG9mIHRoZQorICAgKiBzZXR0ZXJzIG9uIHRoZSBJVGVzdCBpbnRlcmZhY2UuCisgICAqCisgICAqIE5vdGUgdGhhdCBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGFyYW1ldGVycyB0ZXN0Q2xhc3MsCisgICAqIHRlc3RDb25zdHJ1Y3RvciBhbmQgdGVzdE1ldGhvZCB3aWxsIGJlIG5vbi1udWxsLgorICAgKgorICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiB0aGF0IHdhcyByZWFkIGZyb20geW91cgorICAgKiB0ZXN0IGNsYXNzLgorICAgKiBAcGFyYW0gdGVzdENsYXNzIElmIHRoZSBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiBhIGNsYXNzLCB0aGlzCisgICAqIHBhcmFtZXRlciByZXByZXNlbnRzIHRoaXMgY2xhc3MgKG51bGwgb3RoZXJ3aXNlKS4KKyAgICogQHBhcmFtIHRlc3RDb25zdHJ1Y3RvciBJZiB0aGUgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gYSBjb25zdHJ1Y3RvciwKKyAgICogdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGlzIGNvbnN0cnVjdG9yIChudWxsIG90aGVyd2lzZSkuCisgICAqIEBwYXJhbSB0ZXN0TWV0aG9kIElmIHRoZSBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiBhIG1ldGhvZCwKKyAgICogdGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGlzIG1ldGhvZCAobnVsbCBvdGhlcndpc2UpLgorICAgKi8KKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElUZXN0QW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsIE1ldGhvZCB0ZXN0TWV0aG9kKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUFubm90YXRpb25UcmFuc2Zvcm1lcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YmI1MzIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRGF0YVByb3ZpZGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklGYWN0b3J5QW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBVc2UgdGhpcyBpbnRlcmZhY2UgaW5zdGVhZCBvZiBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIGlmIHlvdSB3YW50IHRvIG1vZGlmeSBhbnkgVGVzdE5HCisgKiBhbm5vdGF0aW9uIGJlc2lkZXMgQFRlc3QuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25UcmFuc2Zvcm1lcjIgZXh0ZW5kcyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIHsKKyAgLyoqCisgICAqIFRyYW5zZm9ybSBhbiBJQ29uZmlndXJhdGlvbiBhbm5vdGF0aW9uLgorICAgKgorICAgKiBOb3RlIHRoYXQgb25seSBvbmUgb2YgdGhlIHRocmVlIHBhcmFtZXRlcnMgdGVzdENsYXNzLAorICAgKiB0ZXN0Q29uc3RydWN0b3IgYW5kIHRlc3RNZXRob2Qgd2lsbCBiZSBub24tbnVsbC4KKyAgICoKKyAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gdGhhdCB3YXMgcmVhZCBmcm9tIHlvdXIKKyAgICogdGVzdCBjbGFzcy4KKyAgICogQHBhcmFtIHRlc3RDbGFzcyBJZiB0aGUgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gYSBjbGFzcywgdGhpcworICAgKiBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGlzIGNsYXNzIChudWxsIG90aGVyd2lzZSkuCisgICAqIEBwYXJhbSB0ZXN0Q29uc3RydWN0b3IgSWYgdGhlIGFubm90YXRpb24gd2FzIGZvdW5kIG9uIGEgY29uc3RydWN0b3IsCisgICAqIHRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhpcyBjb25zdHJ1Y3RvciAobnVsbCBvdGhlcndpc2UpLgorICAgKiBAcGFyYW0gdGVzdE1ldGhvZCBJZiB0aGUgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gYSBtZXRob2QsCisgICAqIHRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhpcyBtZXRob2QgKG51bGwgb3RoZXJ3aXNlKS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLAorICAgICAgQ29uc3RydWN0b3IgdGVzdENvbnN0cnVjdG9yLCBNZXRob2QgdGVzdE1ldGhvZCk7CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybSBhbiBJRGF0YVByb3ZpZGVyIGFubm90YXRpb24uCisgICAqCisgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCB0aGUgSURhdGFQcm92aWRlciBhbm5vdGF0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElEYXRhUHJvdmlkZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1ldGhvZCBtZXRob2QpOworCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gYW4gSUZhY3RvcnkgYW5ub3RhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIGFubm90YXRlZCB3aXRoIHRoZSBJRmFjdG9yeSBhbm5vdGF0aW9uLgorICAgKi8KKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElGYWN0b3J5QW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZXRob2QgbWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQW5ub3RhdGlvblRyYW5zZm9ybWVyMy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxMDUwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQW5ub3RhdGlvblRyYW5zZm9ybWVyMy5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JTGlzdGVuZXJzQW5ub3RhdGlvbjsKKworcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMyBleHRlbmRzIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIyIHsKKworICB2b2lkIHRyYW5zZm9ybShJTGlzdGVuZXJzQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUF0dHJpYnV0ZXMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhZmZiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgdHJhaXQgdGhhdCBpcyB1c2VkIGJ5IGFsbCBpbnRlcmZhY2VzIHRoYXQgbGV0cyB0aGUgdXNlciBhZGQgb3IgcmVtb3ZlIHRoZWlyCisgKiBvd24gYXR0cmlidXRlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJQXR0cmlidXRlcyBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisgIC8qKgorICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJldHVybgorICAgKi8KKyAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworCisgIC8qKgorICAgKiBTZXQgYSBjdXN0b20gYXR0cmlidXRlLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBuYW1lcy4KKyAgICovCisgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBdHRyaWJ1dGVOYW1lcygpOworCisgIC8qKgorICAgKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZQorICAgKgorICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlCisgICAqLworICBwdWJsaWMgT2JqZWN0IHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNsYXNzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI4YjQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ2xhc3MuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogPGNvZGU+SUNsYXNzPC9jb2RlPiByZXByZXNlbnRzIGEgdGVzdCBjbGFzcyBhbmQgYSBjb2xsZWN0aW9uIG9mIGl0cyBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciA8YSBocmVmID0gIm1haWx0bzpjZWRyaWMmIzY0O2JldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElDbGFzcyBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhpcyB0ZXN0IGNsYXNzIG5hbWUuICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZQorICAgKiBjb3JyZXNwb25kaW5nIEphdmEgY2xhc3MuCisgICAqLworICBTdHJpbmcgZ2V0TmFtZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSAmbHQ7dGVzdCZndDsgdGFnIHRoaXMgY2xhc3Mgd2FzIGZvdW5kIGluLgorICAgKi8KKyAgWG1sVGVzdCBnZXRYbWxUZXN0KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlICpsdDtjbGFzcyZndDsgdGFnIHRoaXMgY2xhc3Mgd2FzIGZvdW5kIGluLgorICAgKi8KKyAgWG1sQ2xhc3MgZ2V0WG1sQ2xhc3MoKTsKKworICAvKioKKyAgICogSWYgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIElUZXN0LCByZXR1cm5zIGl0cyB0ZXN0IG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuCisgICAqLworICBTdHJpbmcgZ2V0VGVzdE5hbWUoKTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUgSmF2YSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSUNsYXNzLgorICAgKi8KKyAgQ2xhc3MgZ2V0UmVhbENsYXNzKCk7CisKKyAgT2JqZWN0W10gZ2V0SW5zdGFuY2VzKGJvb2xlYW4gY3JlYXRlKTsKKworICBpbnQgZ2V0SW5zdGFuY2VDb3VudCgpOworCisgIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpOworCisgIHZvaWQgYWRkSW5zdGFuY2UoT2JqZWN0IGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ2xhc3NMaXN0ZW5lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDbGFzc0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1NmE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ2xhc3NMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitwdWJsaWMgaW50ZXJmYWNlIElDbGFzc0xpc3RlbmVyIGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyIHsKKworICB2b2lkIG9uQmVmb3JlQ2xhc3MoSVRlc3RDbGFzcyB0ZXN0Q2xhc3MsIElNZXRob2RJbnN0YW5jZSBtaSk7CisgIHZvaWQgb25BZnRlckNsYXNzKElUZXN0Q2xhc3MgdGVzdENsYXNzLCBJTWV0aG9kSW5zdGFuY2UgbWkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDb25maWd1cmFibGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ29uZmlndXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YjU2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ29uZmlndXJhYmxlLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCisvKioKKyAqIElmIGEgdGVzdCBjbGFzcyBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCBpdHMgcnVuKCkgbWV0aG9kCisgKiB3aWxsIGJlIGludm9rZWQgaW5zdGVhZCBvZiBlYWNoIGNvbmZpZ3VyYXRpb24gbWV0aG9kIGZvdW5kLiAgVGhlIGludm9jYXRpb24gb2YKKyAqIHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIHRoZW4gYmUgcGVyZm9ybWVkIHVwb24gaW52b2NhdGlvbiBvZiB0aGUgY2FsbEJhY2soKQorICogbWV0aG9kIG9mIHRoZSBJQ29uZmlndXJlQ2FsbEJhY2sgcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBTZXAgMDcsIDIwMTAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhYmxlIGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyIHsKKyAgcHVibGljIHZvaWQgcnVuKElDb25maWd1cmVDYWxsQmFjayBjYWxsQmFjaywgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDb25maWd1cmF0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYmEzMDMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDb25maWd1cmF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7DQorDQorLyoqDQorICogTGlzdGVuZXIgaW50ZXJmYWNlIGZvciBldmVudHMgcmVsYXRlZCB0byBjb25maWd1cmF0aW9uIG1ldGhvZHMuDQorICovDQorcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyIHsNCisNCisgIC8qKg0KKyAgICogSW52b2tlZCB3aGVuZXZlciBhIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHN1Y2NlZWRlZC4NCisgICAqLw0KKyAgdm9pZCBvbkNvbmZpZ3VyYXRpb25TdWNjZXNzKElUZXN0UmVzdWx0IGl0cik7DQorDQorICAvKioNCisgICAqIEludm9rZWQgd2hlbmV2ZXIgYSBjb25maWd1cmF0aW9uIG1ldGhvZCBmYWlsZWQuDQorICAgKi8NCisgIHZvaWQgb25Db25maWd1cmF0aW9uRmFpbHVyZShJVGVzdFJlc3VsdCBpdHIpOw0KKw0KKyAgLyoqDQorICAgKiBJbnZva2VkIHdoZW5ldmVyIGEgY29uZmlndXJhdGlvbiBtZXRob2Qgd2FzIHNraXBwZWQuDQorICAgKi8NCisgIHZvaWQgb25Db25maWd1cmF0aW9uU2tpcChJVGVzdFJlc3VsdCBpdHIpOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JQ29uZmlndXJhdGlvbkxpc3RlbmVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDE2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIgZXh0ZW5kcyBJQ29uZmlndXJhdGlvbkxpc3RlbmVyIHsKKworICAvKioKKyAgICogSW52b2tlZCBiZWZvcmUgYSBjb25maWd1cmF0aW9uIG1ldGhvZCBpcyBpbnZva2VkLgorICAgKi8KKyAgdm9pZCBiZWZvcmVDb25maWd1cmF0aW9uKElUZXN0UmVzdWx0IHRyKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDb25maWd1cmVDYWxsQmFjay5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lDb25maWd1cmVDYWxsQmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTNjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUNvbmZpZ3VyZUNhbGxCYWNrLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCisvKioKKyAqIEEgcGFyYW1ldGVyIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcnVuKCkgbWV0aG9kIG9mIGEgSUNvbmZpZ3VyYWJsZS4KKyAqIEludm9raW5nIHJ1bkNvbmZpZ3VyYXRpb25NZXRob2QoKSBvbiB0aGF0IHBhcmFtZXRlciB3aWxsIGNhdXNlIHRoZSB0ZXN0IG1ldGhvZCBjdXJyZW50bHkKKyAqIGJlaW5nIGRpdmVydGVkIHRvIGJlIGludm9rZWQuCisgKgorICogPGI+VGhpcyBpbnRlcmZhY2UgaXMgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMsIG9ubHkgYnkgVGVzdE5HLjwvYj4KKyAqCisgKiBAc2VlIG9yZy50ZXN0bmcuSUNvbmZpZ3VyYWJsZQorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBTZXAgMDcsIDIwMTAKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlQ2FsbEJhY2sgeworCisgIC8qKgorICAgKiBJbnZva2UgdGhlIHRlc3QgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBoaWphY2tlZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJ1bkNvbmZpZ3VyYXRpb25NZXRob2QoSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW52b2tlIHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZC4KKyAgICovCisgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbWV0ZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUV4ZWN1dGlvbkxpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUV4ZWN1dGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjYWU3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JRXhlY3V0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKy8qKgorICogQSBsaXN0ZW5lciB1c2VkIHRvIG1vbml0b3Igd2hlbiBhIFRlc3RORyBydW4gc3RhcnRzIGFuZCBlbmRzLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRpb25MaXN0ZW5lciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIEludm9rZWQgYmVmb3JlIHRoZSBUZXN0TkcgcnVuIHN0YXJ0cy4KKyAgICovCisgIHZvaWQgb25FeGVjdXRpb25TdGFydCgpOworCisgIC8qKgorICAgKiBJbnZva2VkIG9uY2UgYWxsIHRoZSBzdWl0ZXMgaGF2ZSBiZWVuIHJ1bi4KKyAgICovCisgIHZvaWQgb25FeGVjdXRpb25GaW5pc2goKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhMTc0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitwdWJsaWMgaW50ZXJmYWNlIElFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIgeworCisgIC8qKgorICAgKiBHZXQgdGhlIG1lc3NhZ2UgaW4gY2FzZSB0aGUgVGhyb3dhYmxlIHRocm93biBieSB0aGUgdGVzdCBpcyBub3QgbWF0Y2hpbmcuCisgICAqCisgICAqIEBwYXJhbSBpdGUgVGhlIFRocm93YWJsZSB0aHJvd24gYnkgdGhlIHRlc3QKKyAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIGRpc3BsYXllZCBhcyB0ZXN0IHJlc3VsdAorICAgKi8KKyAgU3RyaW5nIGdldFdyb25nRXhjZXB0aW9uTWVzc2FnZShUaHJvd2FibGUgaXRlKTsKKworICAvKioKKyAgICogQ2hlY2sgaWYgdGhlIFRocm93YWJsZSB0aHJvd24gYnkgdGhlIHRlc3QgaXMgbWF0Y2hpbmcgd2l0aCB0aGUgaG9sZGVyIGxvZ2ljCisgICAqCisgICAqIEBwYXJhbSBpdGUgVGhlIFRocm93YWJsZSB0aHJvd24gYnkgdGhlIHRlc3QKKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBUaHJvd2FibGUgaXMgbWF0Y2hpbmcgd2l0aCB0aGUgaG9sZGVyIGxvZ2ljLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2xlYW4gaXNUaHJvd2FibGVNYXRjaGluZyhUaHJvd2FibGUgaXRlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JRXh0cmFPdXRwdXQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JRXh0cmFPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTEyZTAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lFeHRyYU91dHB1dC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IFJlcG9ydGVyIHRvIHN0b3JlIHRoZSBleHRyYSBvdXRwdXQgdG8gYmUgbGF0ZXIKKyAqIGluY2x1ZGVkIGluIHRoZSBIVE1MIHJlcG9ydDoKKyAqIC0gVXNlci1nZW5lcmF0ZWQgcmVwb3J0CisgKiAtIFBhcmFtZXRlciBpbmZvCisgKgorICogQ3JlYXRlZCBvbiBGZWIgMTYsIDIwMDYKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJRXh0cmFPdXRwdXQgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBAcmV0dXJuIGEgTGlzdDxTdHJpbmc+IHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQKKyAgICogdG8gdGhpcyB0ZXN0IG1ldGhvZCwgb3IgYW4gZW1wdHkgTGlzdCBpZiBubyBwYXJhbWV0ZXJzIHdlcmUgdXNlZC4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyT3V0cHV0KCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSG9va0NhbGxCYWNrLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUhvb2tDYWxsQmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZjk0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUhvb2tDYWxsQmFjay5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBBIHBhcmFtZXRlciBvZiB0aGlzIHR5cGUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJ1bigpIG1ldGhvZCBvZiBhIElIb29rYWJsZS4KKyAqIEludm9raW5nIHJ1blRlc3RNZXRob2QoKSBvbiB0aGF0IHBhcmFtZXRlciB3aWxsIGNhdXNlIHRoZSB0ZXN0IG1ldGhvZCBjdXJyZW50bHkKKyAqIGJlaW5nIGRpdmVydGVkIHRvIGJlIGludm9rZWQuCisgKgorICogIDxwPgorICoKKyAqIDxiPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLCBvbmx5IGJ5IFRlc3RORy48L2I+CisgKgorICogQHNlZSBvcmcudGVzdG5nLklIb29rYWJsZQorICoKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICogSmFuIDI4LCAyMDA2CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUhvb2tDYWxsQmFjayB7CisKKyAgLyoqCisgICAqIEludm9rZSB0aGUgdGVzdCBtZXRob2QgY3VycmVudGx5IGJlaW5nIGhpamFja2VkLgorICAgKi8KKyAgcHVibGljIHZvaWQgcnVuVGVzdE1ldGhvZChJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgdXNlZCB0byBpbnZva2UgdGhlIHRlc3QgbWV0aG9kLgorICAgKi8KKyAgcHVibGljIE9iamVjdFtdIGdldFBhcmFtZXRlcnMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSG9va2FibGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSG9va2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOWI3ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lIb29rYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBJZiBhIHRlc3QgY2xhc3MgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSwgaXRzIHJ1bigpIG1ldGhvZAorICogd2lsbCBiZSBpbnZva2VkIGluc3RlYWQgb2YgZWFjaCBAVGVzdCBtZXRob2QgZm91bmQuICBUaGUgaW52b2NhdGlvbiBvZgorICogdGhlIHRlc3QgbWV0aG9kIHdpbGwgdGhlbiBiZSBwZXJmb3JtZWQgdXBvbiBpbnZvY2F0aW9uIG9mIHRoZSBjYWxsQmFjaygpCisgKiBtZXRob2Qgb2YgdGhlIElIb29rQ2FsbEJhY2sgcGFyYW1ldGVyLgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIHRvIHRlc3QgY2xhc3NlcyB0aGF0IHJlcXVpcmUgSkFBUyBhdXRoZW50aWNhdGlvbiwgd2hpY2ggY2FuCisgKiBiZSBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOgorICoKKyAqIDxwcmU+CisgKiBwdWJsaWMgdm9pZCBydW4oZmluYWwgSUhvb2tDYWxsQmFjayBpY2IsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAqICAgLy8gUHJlZmVyYWJseSBpbml0aWFsaXplZCBpbiBhIEBDb25maWd1cmF0aW9uIG1ldGhvZAorICogICBteVN1YmplY3QgPSBhdXRoZW50aWNhdGVXaXRoSkFBcygpOworICoKKyAqICAgU3ViamVjdC5kb0FzKG15U3ViamVjdCwgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgKiAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgKiAgICAgICBpY2IuY2FsbGJhY2sodGVzdFJlc3VsdCk7CisgKiAgICAgfQorICogICB9OworICogfQorICogPC9wcmU+CisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEphbiAyOCwgMjAwNgorICovCitwdWJsaWMgaW50ZXJmYWNlIElIb29rYWJsZSBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisgIHB1YmxpYyB2b2lkIHJ1bihJSG9va0NhbGxCYWNrIGNhbGxCYWNrLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSW5zdGFuY2VJbmZvLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUluc3RhbmNlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjYTZjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUluc3RhbmNlSW5mby5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYSBwYWlyIG9mIGluc3RhbmNlL2NsYXNzLiAgQSBtZXRob2Qgd2l0aCBARmFjdG9yeQorICogY2FuIHJldHVybiBhbiBhcnJheSBvZiB0aGVzZSBvYmplY3RzIGluc3RlYWQgb2YgT2JqZWN0W10gc28gdGhhdAorICogaW5zdGFuY2VzIGNhbiBiZSBkeW5hbWljIHByb3hpZXMgb3IgbW9jayBvYmplY3RzIGFuZCBzdGlsbCBwcm92aWRlCisgKiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gVGVzdE5HIHRvIGZpZ3VyZSBvdXQgd2hhdCBjbGFzc2VzIHRoZQorICogYW5ub3RhdGlvbnMgc2hvdWxkIGJlIGxvb2tlZCB1cCBpbi4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUluc3RhbmNlSW5mbyB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9uIHdoaWNoIHRoZSB0ZXN0cyB3aWxsIGJlIGludm9rZWQuCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldEluc3RhbmNlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9uIHdoaWNoIHRoZSBUZXN0TkcgYW5ub3RhdGlvbnMgc2hvdWxkIGJlIGxvb2tlZCBmb3IuCisgICAqLworICBwdWJsaWMgQ2xhc3MgZ2V0SW5zdGFuY2VDbGFzcygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lJbnZva2VkTWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUludm9rZWRNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDVkYzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lJbnZva2VkTWV0aG9kLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCisvKioKKyAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBtZXRob2QgdGhhdCBoYXMgYmVlbiBpbnZva2VkIGJ5IFRlc3RORy4KKyAqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlcm5hbC4KKyAqLworcHVibGljIGludGVyZmFjZSBJSW52b2tlZE1ldGhvZCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyBhIHRlc3QgbWV0aG9kCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Rlc3RNZXRob2QoKTsKKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGlzIGEgY29uZmlndXJhdGlvbiBtZXRob2QgKEBCZWZvcmVYWFggb3IgQEFmdGVyWFhYKQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25maWd1cmF0aW9uTWV0aG9kKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHRlc3QgbWV0aG9kCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgSVRlc3ROR01ldGhvZCBnZXRUZXN0TWV0aG9kKCk7CisKKyAgcHVibGljIElUZXN0UmVzdWx0IGdldFRlc3RSZXN1bHQoKTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUgZGF0ZSB3aGVuIHRoaXMgbWV0aG9kIHdhcyBydW4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldERhdGUoKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUludm9rZWRNZXRob2RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwNDIyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSUludm9rZWRNZXRob2RMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBBIGxpc3RlbmVyIHRoYXQgZ2V0cyBpbnZva2VkIGJlZm9yZSBhbmQgYWZ0ZXIgYSBtZXRob2QgaXMgaW52b2tlZCBieSBUZXN0TkcuCisgKiBUaGlzIGxpc3RlbmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBjb25maWd1cmF0aW9uIGFuZCB0ZXN0IG1ldGhvZHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUludm9rZWRNZXRob2RMaXN0ZW5lciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisKKyAgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCk7CisKKyAgdm9pZCBhZnRlckludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSW52b2tlZE1ldGhvZExpc3RlbmVyMi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lJbnZva2VkTWV0aG9kTGlzdGVuZXIyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1Y2E0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JSW52b2tlZE1ldGhvZExpc3RlbmVyMi5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgeW91IG5lZWQgYSBoYW5kbGUgdG8ge0BsaW5rIElUZXN0Q29udGV4dH0uCisgKgorICogQGF1dGhvciBrYXJ0aGlrLmtyaXNobmFuQGdtYWlsLmNvbSAoS2FydGhpayBLcmlzaG5hbikKKyAqLworcHVibGljIGludGVyZmFjZSBJSW52b2tlZE1ldGhvZExpc3RlbmVyMiBleHRlbmRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIgeworCisgIC8qKgorICAgKiBUbyBiZSBpbXBsZW1lbnRlZCBpZiB0aGUgbWV0aG9kIG5lZWRzIGEgaGFuZGxlIHRvIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCisgICAqLworICB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LAorICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQpOworCisgIC8qKgorICAgKiBUbyBiZSBpbXBsZW1lbnRlZCBpZiB0aGUgbWV0aG9kIG5lZWRzIGEgaGFuZGxlIHRvIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uCisgICAqLworICB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsCisgICAgICBJVGVzdENvbnRleHQgY29udGV4dCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kSW5zdGFuY2UuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTM3MjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lNZXRob2RJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNhcHR1cmVzIGEgdGVzdCBtZXRob2QgYWxvbmcgd2l0aCBhbGwgdGhlIGluc3RhbmNlcyBpdCBzaG91bGQKKyAqIGJlIHJ1biBvbi4KKyAqLworcHVibGljIGludGVyZmFjZSBJTWV0aG9kSW5zdGFuY2UgeworCisgIElUZXN0TkdNZXRob2QgZ2V0TWV0aG9kKCk7CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRJbnN0YW5jZSgpCisgICAqLworICBPYmplY3RbXSBnZXRJbnN0YW5jZXMoKTsKKworICBPYmplY3QgZ2V0SW5zdGFuY2UoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kSW50ZXJjZXB0b3IuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDE4ZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lNZXRob2RJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhbHRlciB0aGUgbGlzdCBvZiB0ZXN0IG1ldGhvZHMgdGhhdCBUZXN0TkcgaXMgYWJvdXQgdG8gcnVuLgorICoKKyAqIDxwPgorICoKKyAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBpbnZva2VkIHJpZ2h0IGJlZm9yZSBUZXN0Tkcgc3RhcnRzIGludm9raW5nIHRlc3QgbWV0aG9kcy4KKyAqIE9ubHkgbWV0aG9kcyB0aGF0IGhhdmUgbm8gZGVwZW5kZW50cyBhbmQgdGhhdCBkb24ndCBkZXBlbmQgb24gYW55IG90aGVyIHRlc3QgbWV0aG9kcyB3aWxsCisgKiBiZSBwYXNzZWQgaW4gcGFyYW1ldGVyLiAgSW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG8gcmV0dXJuIGEgbGlzdCBvZiB7QGxpbmsgSU1ldGhvZEluc3RhbmNlfQorICogdGhhdCByZXByZXNlbnRzIHRoZSBsaXN0IG9mIHRlc3QgbWV0aG9kcyB0aGV5IHdhbnQgcnVuLiAgVGVzdE5HIHdpbGwgcnVuIHRoZXNlIG1ldGhvZHMgaW4gdGhlCisgKiBzYW1lIG9yZGVyIGZvdW5kIGluIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAqCisgKiA8cD4KKyAqCisgKiBUeXBpY2FsbHksIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUganVzdCB0aGUgbWV0aG9kcyBwYXNzZWQgaW4gcGFyYW1ldGVyIGJ1dCBzb3J0ZWQKKyAqIGRpZmZlcmVudGx5LCBidXQgaXQgY2FuIGFjdHVhbGx5IGhhdmUgYW55IHNpemUgKGl0IGNhbiBiZSBlbXB0eSwgaXQgY2FuIGJlIG9mIHRoZQorICogc2FtZSBzaXplIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9yIGl0IGNhbiBjb250YWluIG1vcmUgbWV0aG9kcykuCisgKgorICogPHA+CisgKgorICogVGhlIHtAbGluayBJVGVzdENvbnRleHR9IGlzIHBhc3NlZCBpbiB0aGUgPHR0PmludGVyY2VwdDwvdHQ+IG1ldGhvZCBzbyB0aGF0IGltcGxlbWVudGVycyBjYW4gc2V0IHVzZXIgdmFsdWVzCisgKiAodXNpbmcge0BsaW5rIElUZXN0Q29udGV4dCNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBPYmplY3QpfSksIHdoaWNoIHRoZXkgY2FuIHRoZW4gbG9vayB1cAorICogbGF0ZXIgd2hpbGUgZ2VuZXJhdGluZyB0aGUgcmVwb3J0cy4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgaW50ZXJmYWNlIElNZXRob2RJbnRlcmNlcHRvciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisKKyAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGludGVyY2VwdChMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kcywgSVRlc3RDb250ZXh0IGNvbnRleHQpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSU1ldGhvZFNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSU1ldGhvZFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQyNjBkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGF1Z21lbnQgb3IgcmVwbGFjZSBUZXN0TkcncyBhbGdvcml0aG0gdG8KKyAqIGRlY2lkZSB3aGV0aGVyIGEgdGVzdCBtZXRob2Qgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgdGVzdCBydW4uCisgKgorICogQ3JlYXRlZCBvbiBTZXAgMjYsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlbGVjdG9yIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKworICAvKioKKyAgICogQHBhcmFtIGNvbnRleHQgVGhlIHNlbGVjdG9yIGNvbnRleHQuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QKKyAgICogY2FuIGludm9rZSBzZXRIYWx0ZWQodHJ1ZSkgdG8gaW5kaWNhdGUgdGhhdCBubyBvdGhlciBNZXRob2QgU2VsZWN0b3IKKyAgICogc2hvdWxkIGJlIGludm9rZWQgYnkgVGVzdE5HIGFmdGVyIHRoaXMgb25lLiAgQWRkaXRpb25hbGx5LCB0aGlzCisgICAqIGltcGxlbWVudGF0aW9uIGNhbiBtYW5pcHVsYXRlIHRoZSBNYXAgb2JqZWN0IHJldHVybmVkIGJ5CisgICAqIGdldFVzZXJEYXRhKCkuCisgICAqIEBwYXJhbSBtZXRob2QgVGhlIHRlc3QgbWV0aG9kCisgICAqIEBwYXJhbSBpc1Rlc3RNZXRob2QgdHJ1ZSBpZiB0aGlzIGlzIGEgQFRlc3QgbWV0aG9kLCBmYWxzZSBpZiBpdCdzIGEKKyAgICogY29uZmlndXJhdGlvbiBtZXRob2QKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdGVzdCBydW4sIGZhbHNlCisgICAqIG90aGVyd2lzZQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaW5jbHVkZU1ldGhvZChJTWV0aG9kU2VsZWN0b3JDb250ZXh0IGNvbnRleHQsCisgICAgICBJVGVzdE5HTWV0aG9kIG1ldGhvZCwgYm9vbGVhbiBpc1Rlc3RNZXRob2QpOworCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gYWxsIHRoZSB0ZXN0IG1ldGhvZHMgYXJlIGtub3duIHNvIHRoYXQgdGhlIG1ldGhvZCBzZWxlY3RvcgorICAgKiBjYW4gcGVyZm9ybSBhZGRpdGlvbmFsIHdvcmssIHN1Y2ggYXMgYWRkaW5nIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YKKyAgICogYWxsIHRoZSBncm91cHMgYmVpbmcgaW5jbHVkZWQgYW5kIGRlcGVuZGVkIHVwb24uCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUZXN0TWV0aG9kcyhMaXN0PElUZXN0TkdNZXRob2Q+IHRlc3RNZXRob2RzKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lNZXRob2RTZWxlY3RvckNvbnRleHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kU2VsZWN0b3JDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDYwODQxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTWV0aG9kU2VsZWN0b3JDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcudGVzdG5nOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGlzIHBhc3NlZCB0byBhbGwgdGhlIE1ldGhvZCBTZWxlY3RvcnMNCisgKiB3aGVuIHRoZWlyIGluY2x1ZGVNZXRob2QoKSBpcyBpbnZva2VkLiAgTWV0aG9kIHNlbGVjdG9ycyBjYW4gaW52b2tlDQorICogYW55IG1ldGhvZCBvZiB0aGlzIGNvbnRleHQgYXQgdGhhdCB0aW1lLg0KKyAqDQorICogQ3JlYXRlZCBvbiBKYW4gMywgMjAwNw0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4NCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWxlY3RvckNvbnRleHQgew0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgbm8gbW9yZSBNZXRob2QgU2VsZWN0b3JzIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyDQorICAgKiB0aGUgY3VycmVudCBvbmUuDQorICAgKi8NCisgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpOw0KKw0KKyAgLyoqDQorICAgKiBJbmRpY2F0ZSB0aGF0IG5vIG90aGVyIE1ldGhvZCBTZWxlY3RvcnMgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQorICAgKiBjdXJyZW50IG9uZSBpZiBzdG9wcGVkIGlzIGZhbHNlLg0KKyAgICogQHBhcmFtIHN0b3BwZWQNCisgICAqLw0KKyAgcHVibGljIHZvaWQgc2V0U3RvcHBlZChib29sZWFuIHN0b3BwZWQpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIGEgTWFwIHRoYXQgY2FuIGJlIGZyZWVseSBtYW5pcHVsYXRlZCBieSB0aGUgTWV0aG9kIFNlbGVjdG9yLg0KKyAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBpbmZvcm1hdGlvbiBhbW9uZyBzZXZlcmFsIE1ldGhvZCBTZWxlY3RvcnMuDQorICAgKi8NCisgIHB1YmxpYyBNYXA8T2JqZWN0LCBPYmplY3Q+IGdldFVzZXJEYXRhKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTW9kdWxlRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lNb2R1bGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5MDBhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JTW9kdWxlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBtb2R1bGVGYWN0b3J5IGF0dHJpYnV0ZSBvZiB0aGUgQEd1aWNlCisgKiBhbm5vdGF0aW9uLiBJdCBhbGxvd3MgdXNlcnMgdG8gdXNlIGRpZmZlcmVudCBHdWljZSBtb2R1bGVzIGJhc2VkIG9uIHRoZSB0ZXN0CisgKiBjbGFzcyB3YWl0aW5nIHRvIGJlIGluamVjdGVkLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVGYWN0b3J5IHsKKworICAvKioKKyAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0CisgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgVGhlIHRlc3QgY2xhc3MKKyAgICoKKyAgICogQHJldHVybiBUaGUgR3VpY2UgbW9kdWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFuIGluc3RhbmNlIG9mIHRoaXMKKyAgICogdGVzdCBjbGFzcy4KKyAgICovCisgIE1vZHVsZSBjcmVhdGVNb2R1bGUoSVRlc3RDb250ZXh0IGNvbnRleHQsIENsYXNzPD8+IHRlc3RDbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSU9iamVjdEZhY3RvcnkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjYWI4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSU9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworLyoqCisgKiBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIGFsbCB0ZXN0IGluc3RhbmNlcy4gVGhpcyBmYWN0b3J5IGlzIHBhc3NlZCB0aGUgY29uc3RydWN0b3IKKyAqIGFsb25nIHdpdGggdGhlIHBhcmFtZXRlcnMgdGhhdCBUZXN0TkcgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQKKyAqIChAUGFyYW1ldGVycywgZXRjLi4uKS4KKyAqCisgKiBAc2VlIElPYmplY3RGYWN0b3J5MgorICoKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbgorICogQHNpbmNlIDUuNgorICovCitwdWJsaWMgaW50ZXJmYWNlIElPYmplY3RGYWN0b3J5IGV4dGVuZHMgSVRlc3RPYmplY3RGYWN0b3J5IHsKKyAgT2JqZWN0IG5ld0luc3RhbmNlKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBPYmplY3QuLi4gcGFyYW1zKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JT2JqZWN0RmFjdG9yeTIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JT2JqZWN0RmFjdG9yeTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNjYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lPYmplY3RGYWN0b3J5Mi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworCisvKioKKyAqIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgYWxsIHRlc3QgaW5zdGFuY2VzLiBUaGlzIG9iamVjdCBmYWN0b3J5IG9ubHkgcmVjZWl2ZXMgdGhlIGNsYXNzCisgKiBpbiBwYXJhbWV0ZXIuCisgKgorICogQHNlZSBvcmcudGVzdG5nLklPYmplY3RGYWN0b3J5CisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKgorICogQHNpbmNlIDUuMTQuNgorICovCitwdWJsaWMgaW50ZXJmYWNlIElPYmplY3RGYWN0b3J5MiBleHRlbmRzIElUZXN0T2JqZWN0RmFjdG9yeSB7CisgIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzczw/PiBjbHMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXBvcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5NWMzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyB0byBnZW5lcmF0ZSBhIHJlcG9ydC4gIEl0cyBtZXRob2QKKyAqIGdlbmVyYXRlUmVwb3J0KCkgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGFsbCB0aGUgc3VpdGUgaGF2ZSBydW4gYW5kIHRoZSBwYXJhbWV0ZXJzCisgKiBnaXZlIGFsbCB0aGUgdGVzdCByZXN1bHRzIHRoYXQgaGFwcGVuZWQgZHVyaW5nIHRoYXQgcnVuLgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBGZWIgMTcsIDIwMDYKKyAqLworcHVibGljIGludGVyZmFjZSBJUmVwb3J0ZXIgZXh0ZW5kcyBJVGVzdE5HTGlzdGVuZXIgeworICAvKioKKyAgICogR2VuZXJhdGUgYSByZXBvcnQgZm9yIHRoZSBnaXZlbiBzdWl0ZXMgaW50byB0aGUgc3BlY2lmaWVkIG91dHB1dCBkaXJlY3RvcnkuCisgICAqLworICB2b2lkIGdlbmVyYXRlUmVwb3J0KExpc3Q8WG1sU3VpdGU+IHhtbFN1aXRlcywgTGlzdDxJU3VpdGU+IHN1aXRlcywgU3RyaW5nIG91dHB1dERpcmVjdG9yeSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVJlc3VsdE1hcC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXN1bHRNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDNjMjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXN1bHRNYXAuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgaW50ZXJmYWNlIElSZXN1bHRNYXAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCisgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChJVGVzdFJlc3VsdCByZXN1bHQsIElUZXN0TkdNZXRob2QgbWV0aG9kKTsKKworICBwdWJsaWMgU2V0PElUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKElUZXN0TkdNZXRob2QgbWV0aG9kKTsKKworICBwdWJsaWMgU2V0PElUZXN0UmVzdWx0PiBnZXRBbGxSZXN1bHRzKCk7CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlUmVzdWx0KElUZXN0TkdNZXRob2QgbSk7CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlUmVzdWx0KElUZXN0UmVzdWx0IHIpOworCisgIHB1YmxpYyBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IGdldEFsbE1ldGhvZHMoKTsKKworICBwdWJsaWMgaW50IHNpemUoKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXRyeUFuYWx5emVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVJldHJ5QW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGQyNTVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lSZXRyeUFuYWx5emVyLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCisvKioKKyAqIEludGVyZmFjZSB0byBpbXBsZW1lbnQgdG8gYmUgYWJsZSB0byBoYXZlIGEgY2hhbmNlIHRvIHJldHJ5IGEgZmFpbGVkIHRlc3QuCisgKgorICogQGF1dGhvciB0b2NtYW5AZ21haWwuY29tIChKZXJlbWllIExlbmZhbnQtRW5nZWxtYW5uKQorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJUmV0cnlBbmFseXplciB7CisKKyAgLyoqCisgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGVzdCBtZXRob2QgaGFzIHRvIGJlIHJldHJpZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICoKKyAgICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0IG9mIHRoZSB0ZXN0IG1ldGhvZCB0aGF0IGp1c3QgcmFuLgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgbWV0aG9kIGhhcyB0byBiZSByZXRyaWVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiByZXRyeShJVGVzdFJlc3VsdCByZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lTdWl0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4OTI4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVN1aXRlLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsNCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsNCisNCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7DQorDQorLyoqDQorICogSW50ZXJmYWNlIGRlZmluaW5nIGEgVGVzdCBTdWl0ZS4NCisgKg0KKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBdWcgNiwgMjAwNA0KKyAqDQorICovDQorcHVibGljIGludGVyZmFjZSBJU3VpdGUgZXh0ZW5kcyBJQXR0cmlidXRlcyB7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBzdWl0ZS4NCisgICAqLw0KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gVGhlIHJlc3VsdHMgZm9yIHRoaXMgc3VpdGUuDQorICAgKi8NCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IGdldFJlc3VsdHMoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBUaGUgb2JqZWN0IGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgYWxsIHRlc3QgaW5zdGFuY2VzLg0KKyAgICovDQorICBwdWJsaWMgSU9iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpOw0KKyAgcHVibGljIElPYmplY3RGYWN0b3J5MiBnZXRPYmplY3RGYWN0b3J5MigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIFRoZSBvdXRwdXQgZGlyZWN0b3J5IHVzZWQgZm9yIHRoZSByZXBvcnRzLg0KKyAgICovDQorICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3RzIG11c3QgYmUgcnVuIGluIHBhcmFsbGVsLg0KKyAgICovDQorICBwdWJsaWMgU3RyaW5nIGdldFBhcmFsbGVsKCk7DQorDQorICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZHVsZSgpOw0KKw0KKyAgcHVibGljIFN0cmluZyBnZXRHdWljZVN0YWdlKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyLCBvciBudWxsIGlmIG5vbmUgd2FzIHNwZWNpZmllZC4NCisgICAqLw0KKyAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUpOw0KKw0KKyAgLyoqDQorICAgKiBSZXRyaWV2ZXMgdGhlIG1hcCBvZiBncm91cHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgdGVzdCBtZXRob2RzLg0KKyAgICoNCisgICAqIEByZXR1cm4gQSBtYXAgd2hlcmUgdGhlIGtleSBpcyB0aGUgZ3JvdXAgYW5kIHRoZSB2YWx1ZSBpcyBhIGxpc3QNCisgICAqIG9mIG1ldGhvZHMgdXNlZCBieSB0aGlzIGdyb3VwLg0KKyAgICovDQorICBwdWJsaWMgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPj4gZ2V0TWV0aG9kc0J5R3JvdXBzKCk7DQorDQorICAvKioNCisgICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhbGwgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIGludm9rZWQgZHVyaW5nIHRoaXMgcnVuLg0KKyAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgSVRlc3ROR01ldGhvZHMgYmVsb25naW5nIHRvIGFsbCB0ZXN0cyBpbmNsdWRlZCBpbiB0aGUgc3VpdGUuDQorICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWxsSW52b2tlZE1ldGhvZHMoKS4NCisgICAqLw0KKyAgQERlcHJlY2F0ZWQNCisgIHB1YmxpYyBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IGdldEludm9rZWRNZXRob2RzKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyB0aGF0IHdlcmUgaW52b2tlZCBpbiB0aGlzIHN1aXRlLg0KKyAgICovDQorICBwdWJsaWMgTGlzdDxJSW52b2tlZE1ldGhvZD4gZ2V0QWxsSW52b2tlZE1ldGhvZHMoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHRlc3QgcnVuLg0KKyAgICovDQorICBwdWJsaWMgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPiBnZXRFeGNsdWRlZE1ldGhvZHMoKTsNCisNCisgIC8qKg0KKyAgICogVHJpZ2dlcnMgdGhlIHN0YXJ0IG9mIHJ1bm5pbmcgdGVzdHMgaW5jbHVkZWQgaW4gdGhlIHN1aXRlLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCBydW4oKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBUaGUgaG9zdCB3aGVyZSB0aGlzIHN1aXRlIHdhcyBydW4sIG9yIG51bGwgaWYgaXQgd2FzIHJ1biBsb2NhbGx5LiAgVGhlDQorICAgKiByZXR1cm5lZCBzdHJpbmcgaGFzIHRoZSBmb3JtOiAgaG9zdDpwb3J0DQorICAgKi8NCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpOw0KKw0KKyAgLyoqDQorICAgKiBSZXRyaWV2ZXMgdGhlIHNoYXJlZCBzdGF0ZSBmb3IgYSBzdWl0ZS4NCisgICAqDQorICAgKiBAcmV0dXJuIHRoZSBzaGFyZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBzdWl0ZS4NCisgICAqLw0KKyAgcHVibGljIFN1aXRlUnVuU3RhdGUgZ2V0U3VpdGVTdGF0ZSgpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGZpbmRlciB1c2VkIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgKEpESzUgb3IgamF2YWRvYykNCisgICAqLw0KKyAgcHVibGljIElBbm5vdGF0aW9uRmluZGVyIGdldEFubm90YXRpb25GaW5kZXIoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBUaGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgWE1MIHN1aXRlIGZpbGUuDQorICAgKi8NCisgIHB1YmxpYyBYbWxTdWl0ZSBnZXRYbWxTdWl0ZSgpOw0KKw0KKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVRlc3ROR0xpc3RlbmVyIGxpc3RlbmVyKTsNCisNCisgIHB1YmxpYyBJbmplY3RvciBnZXRQYXJlbnRJbmplY3RvcigpOw0KKw0KKyAgcHVibGljIHZvaWQgc2V0UGFyZW50SW5qZWN0b3IoSW5qZWN0b3IgaW5qZWN0b3IpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgbWV0aG9kcyBmb3VuZCBpbiB0aGlzIHN1aXRlLiBUaGUgcHJlc2VuY2Ugb2YNCisgICAqIGZhY3RvcmllcyBvciBkYXRhIHByb3ZpZGVycyBtaWdodCBjYXVzZSB0aGUgYWN0dWFsIG51bWJlciBvZiB0ZXN0IG1ldGhvZHMNCisgICAqIHJ1biBiZSBiaWdnZXIgdGhhbiB0aGlzIGxpc3QuDQorICAgKi8NCisgIExpc3Q8SVRlc3ROR01ldGhvZD4gZ2V0QWxsTWV0aG9kcygpOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVN1aXRlTGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JU3VpdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MzRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVN1aXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKworLyoqCisgKiBMaXN0ZW5lciBmb3IgdGVzdCBzdWl0ZXMuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyA2LCAyMDA0CisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTdWl0ZUxpc3RlbmVyIGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyIHsKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIHRoZSBTdWl0ZVJ1bm5lciBzdGFydHMuCisgICAqLworICBwdWJsaWMgdm9pZCBvblN0YXJ0KElTdWl0ZSBzdWl0ZSk7CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgdGhlIFN1aXRlUnVubmVyIGhhcyBydW4gYWxsCisgICAqIHRoZSB0ZXN0IHN1aXRlcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElTdWl0ZSBzdWl0ZSk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JU3VpdGVSZXN1bHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JU3VpdGVSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGRjYzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lTdWl0ZVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzdWl0ZSBydW4uCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyA2LCAyMDA0CisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTdWl0ZVJlc3VsdCBleHRlbmRzIFNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgZm9yIHRoZXNlIHRlc3RzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVOYW1lKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIHRlc3RpbmcgY29udGV4dCBmb3IgdGhlc2UgdGVzdHMuCisgICAqLworICBwdWJsaWMgSVRlc3RDb250ZXh0IGdldFRlc3RDb250ZXh0KCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQwNDU1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBJZiBhIHRlc3QgY2xhc3MgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSwgaXQgd2lsbCByZWNlaXZlIGEKKyAqIHNwZWNpYWwgdHJlYXRtZW50LCBzdWNoIGFzIGhhdmluZyB0aGUgdGVzdCBuYW1lIGRpc3BsYXllZAorICogaW4gdGhlIEhUTUwgcmVwb3J0cy4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICogSnVuIDYsIDIwMDYKKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdCB7CisKKyAgLyoqCisgICAqIFRoZSBuYW1lIG9mIHRlc3QgaW5zdGFuY2UocykuCisgICAqIEByZXR1cm4gbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIGEgdGVzdC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0Q2xhc3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDA5MWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENsYXNzLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRlc3QgY2xhc3M6CisgKiA8dWw+CisgKiA8bGk+IFRoZSB0ZXN0IG1ldGhvZHMKKyAqIDxsaT5UaGUgY29uZmlndXJhdGlvbiBtZXRob2RzICh0ZXN0IGFuZCBtZXRob2QpCisgKiA8bGk+VGhlIGNsYXNzIGZpbGUKKyAqIDwvdWw+CisgKgorICogTm90ZSB0aGF0IHRoZSBtZXRob2RzIHJldHVybmVkIGJ5IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCisgKiBhcmUgZXhwZWN0ZWQgdG8gYmUgY29ycmVjdCBhdCBydW50aW1lLiAgSW4gb3RoZXIgd29yZHMsCisgKiB0aGV5IG1pZ2h0IGRpZmZlciBmcm9tIHdoYXQgdGhlIElUZXN0TWV0aG9kRmluZGVyIHJldHVybmVkCisgKiBzaW5jZSBJVGVzdENsYXNzIHdpbGwgdGFrZSBpbnRvIGFjY291bnQgdGhlIGdyb3VwcyBiZWluZworICogaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZiA9ICJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdENsYXNzIGV4dGVuZHMgSUNsYXNzLCBTZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBSZXR1cm5zIGFsbCB0aGUgaW5zdGFuY2VzIHRoZSBtZXRob2RzIHdpbGwgYmUgaW52b2tlZCB1cG9uLgorICAgKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIGFuIGFycmF5IG9mIG9uZSBvYmplY3QgaW4gdGhlIGFic2VuY2UKKyAgICogb2YgYSBARmFjdG9yeSBhbm5vdGF0aW9uLgorICAgKgorICAgKiBAcGFyYW0gcmV1c2UgZmxhZyBpZiBhIG5ldyBzZXQgb2YgaW5zdGFuY2VzIG11c3QgYmUgcmV0dXJuZWQKKyAgICogIChpZiBzZXQgdG8gPHR0PmZhbHNlPC90dD4pCisgICAqIEByZXR1cm4gQWxsIHRoZSBpbnN0YW5jZXMgdGhlIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIHVwb24uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBPYmplY3RbXSBnZXRJbnN0YW5jZXMoYm9vbGVhbiByZXVzZSk7CisKKyAgLyoqCisgICAqIFRPRE8gY3F1ZXplbCBKYXZhRG9jLgorICAgKgorICAgKiB7QGluaGVyaXREb2N9CisgICAqLworICBAT3ZlcnJpZGUKKyAgbG9uZ1tdIGdldEluc3RhbmNlSGFzaENvZGVzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpbnN0YW5jZXMgdXNlZCBpbiB0aGlzIGNsYXNzLiAgVGhpcyBtZXRob2QKKyAgICogaXMgbmVlZGVkIGZvciBzZXJpYWxpemF0aW9uIHNpbmNlIHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZSBpZiB0aGUKKyAgICogaW5zdGFuY2VzIG9mIHRoZSB0ZXN0IGNsYXNzZXMgd2lsbCBiZSBzZXJpYWxpemFibGUuCisgICAqLworICBAT3ZlcnJpZGUKKyAgaW50IGdldEluc3RhbmNlQ291bnQoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbGwgdGhlIGFwcGxpY2FibGUgdGVzdCBtZXRob2RzLgorICAgKiBAcmV0dXJuIEFsbCB0aGUgYXBwbGljYWJsZSB0ZXN0IG1ldGhvZHMuCisgICAqLworICBJVGVzdE5HTWV0aG9kW10gZ2V0VGVzdE1ldGhvZHMoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBiZWZvcmUgYSB0ZXN0IG1ldGhvZCBpcyBpbnZva2VkLgorICAgKiBAcmV0dXJuIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGJlZm9yZSBhIHRlc3QgbWV0aG9kIGlzIGludm9rZWQuCisgICAqLworICBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlVGVzdE1ldGhvZHMoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciBhIHRlc3QgbWV0aG9kIGNvbXBsZXRlcy4KKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciBhIHRlc3QgbWV0aG9kIGNvbXBsZXRlcy4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclRlc3RNZXRob2RzKCk7CisKKyAgLyoqCisgICAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciB0aGUgdGVzdCBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkIGFuZCBiZWZvcmUKKyAgICogYW55IG9mIGl0cyB0ZXN0IG1ldGhvZHMgaXMgaW52b2tlZC4KKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciB0aGUgdGVzdCBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkIGFuZCBiZWZvcmUKKyAgICogYW55IG9mIGl0cyB0ZXN0IG1ldGhvZHMgaXMgaW52b2tlZC4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVDbGFzc01ldGhvZHMoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gb24gdGhpcyBjbGFzcy4KKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gb24gdGhpcyBjbGFzcy4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckNsYXNzTWV0aG9kcygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGJlZm9yZSB0aGUgc3VpdGUgaXMgcnVuLgorICAgKiBAcmV0dXJuIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGJlZm9yZSB0aGUgc3VpdGUgaXMgcnVuLgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVN1aXRlTWV0aG9kcygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGFmdGVyIHRoZSBzdWl0ZSBoYXMgcnVuLgorICAgKiBAcmV0dXJuIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGFmdGVyIHRoZSBzdWl0ZSBoYXMgcnVuLgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyU3VpdGVNZXRob2RzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYWxsICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIGFueSBvdGhlcnMgaW4gdGhlCisgICAqIGN1cnJlbnQgdGVzdC4KKyAgICogQHJldHVybiBhbGwgQENvbmZpZ3VyYXRpb24gbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIGJlZm9yZSBhbnkgb3RoZXJzIGluIHRoZSBjdXJyZW50IHRlc3QuCisgICAqLworICBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYWxsICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgbGFzdCBiZWZvcmUgYW55IG90aGVycworICAgKiBpbiB0aGUgY3VycmVudCB0ZXN0LgorICAgKiBAcmV0dXJuIGFsbCBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgbGFzdCBiZWZvcmUgYW55IG90aGVycworICAgKiBpbiB0aGUgY3VycmVudCB0ZXN0LgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYWxsICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIGNlcnRhaW4gZ3JvdXBzLgorICAgKiBAcmV0dXJuIGFsbCBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIGNlcnRhaW4gZ3JvdXBzLgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZUdyb3Vwc01ldGhvZHMoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbGwgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBhZnRlciBjZXJ0YWluIGdyb3Vwcy4KKyAgICogQHJldHVybiBhbGwgQENvbmZpZ3VyYXRpb24gbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIGNlcnRhaW4gZ3JvdXBzLgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyR3JvdXBzTWV0aG9kcygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0Q2xhc3NGaW5kZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENsYXNzRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTJjMmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENsYXNzRmluZGVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBUZXN0TkcgdG8gbG9jYXRlIHRoZSB0ZXN0IGNsYXNzZXMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUZXN0Q2xhc3NGaW5kZXIgeworICAvKioKKyAgICogQHJldHVybiBBbiBhcnJheSBvZiBhbGwgdGhlIGNsYXNzZXMgdGhhdCBjb250YWluIHRlc3QKKyAgICogbWV0aG9kcy4gIFRoaXMgbWV0aG9kIHVzdWFsbHkgcmV0dXJucyBhbiBhcnJheSBvZiBvbmUKKyAgICogY2xhc3MsIHdoaWNoIGlzIHRoZSBjbGFzcyBvbiB3aGljaCBUZXN0TkcgaXMgcnVubmluZywKKyAgICogZXhjZXB0IGluIHRoZSBmb2xsb3dpbmcgY2FzZXMuCisgICAqIC0gVGVzdE5HOiAgdGhlIGNsYXNzIGNvbnRhaW5zIGFuIEBGYWN0b3J5IG1ldGhvZAorICAgKiAtIEpVbml0OiAgdGhlIGNsYXNzIGNvbnRhaW5zIGEgc3VpdGUoKSBtZXRob2QKKyAgICovCisgIHB1YmxpYyBJQ2xhc3NbXSBmaW5kVGVzdENsYXNzZXMoKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBJQ2xhc3MgZm9yIGEgZ2l2ZW4gY2xhc3MKKyAgICovCisgIHB1YmxpYyBJQ2xhc3MgZ2V0SUNsYXNzKENsYXNzIGNscyk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENvbnRleHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZmMzVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSW1wbDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYSB0ZXN0IGNvbnRleHQgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbgorICogZm9yIGEgZ2l2ZW4gdGVzdCBydW4uICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNvbnRleHQgaXMgcGFzc2VkIHRvIHRoZQorICogdGVzdCBsaXN0ZW5lcnMgc28gdGhleSBjYW4gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIKKyAqIGVudmlyb25tZW50LgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBdWcgNiwgMjAwNAorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUZXN0Q29udGV4dCBleHRlbmRzIElBdHRyaWJ1dGVzIHsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0LgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgLyoqCisgICAqIFdoZW4gdGhpcyB0ZXN0IHN0YXJ0ZWQgcnVubmluZy4KKyAgICovCisgIHB1YmxpYyBEYXRlIGdldFN0YXJ0RGF0ZSgpOworCisgIC8qKgorICAgKiBXaGVuIHRoaXMgdGVzdCBzdG9wcGVkIHJ1bm5pbmcuCisgICAqLworICBwdWJsaWMgRGF0ZSBnZXRFbmREYXRlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gQSBsaXN0IG9mIGFsbCB0aGUgdGVzdHMgdGhhdCBydW4gc3VjY2Vzc2Z1bGx5LgorICAgKi8KKyAgcHVibGljIElSZXN1bHRNYXAgZ2V0UGFzc2VkVGVzdHMoKTsKKworICAvKioKKyAgICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIHRoZSB0ZXN0cyB0aGF0IHdlcmUgc2tpcHBlZAorICAgKi8KKyAgcHVibGljIElSZXN1bHRNYXAgIGdldFNraXBwZWRUZXN0cygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBhbGwgdGhlIHRlc3RzIHRoYXQgZmFpbGVkIGJ1dCBhcmUgYmVpbmcgaWdub3JlZCBiZWNhdXNlCisgICAqIGFubm90YXRlZCB3aXRoIGEgc3VjY2Vzc1BlcmNlbnRhZ2UuCisgICAqLworICBwdWJsaWMgSVJlc3VsdE1hcCAgZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIEEgbWFwIG9mIGFsbCB0aGUgdGVzdHMgdGhhdCBwYXNzZWQsIGluZGV4ZWQgYnkKKyAgICogdGhlaXIgSVRleHRNZXRob3IuCisgICAqCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kCisgICAqLworICBwdWJsaWMgSVJlc3VsdE1hcCBnZXRGYWlsZWRUZXN0cygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIEFsbCB0aGUgZ3JvdXBzIHRoYXQgYXJlIGluY2x1ZGVkIGZvciB0aGlzIHRlc3QgcnVuLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkR3JvdXBzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBncm91cHMgdGhhdCBhcmUgZXhjbHVkZWQgZm9yIHRoaXMgdGVzdCBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRHcm91cHMoKTsKKworICAvKioKKyAgICogQHJldHVybiBXaGVyZSB0aGUgcmVwb3J0cyB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIFN1aXRlIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHJ1bm5lcgorICAgKiBhdCBzdGFydC11cC4KKyAgICovCisgIHB1YmxpYyBJU3VpdGUgZ2V0U3VpdGUoKTsKKworICAvKioKKyAgICogQHJldHVybiBBbGwgdGhlIHRlc3QgbWV0aG9kcyB0aGF0IHdlcmUgcnVuLgorICAgKi8KKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBbGxUZXN0TWV0aG9kcygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIFRoZSBob3N0IHdoZXJlIHRoaXMgdGVzdCB3YXMgcnVuLCBvciBudWxsIGlmIGl0IHdhcyBydW4gbG9jYWxseS4gIFRoZQorICAgKiByZXR1cm5lZCBzdHJpbmcgaGFzIHRoZSBmb3JtOiAgaG9zdDpwb3J0CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKTsKKworICAvKioKKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHRlc3QgcnVuLgorICAgKi8KKyAgcHVibGljIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gZ2V0RXhjbHVkZWRNZXRob2RzKCk7CisKKyAgLyoqCisgICAqIFJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAgICovCisgIHB1YmxpYyBJUmVzdWx0TWFwIGdldFBhc3NlZENvbmZpZ3VyYXRpb25zKCk7CisKKyAgLyoqCisgICAqIFJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2tpcHBlZCBjb25maWd1cmF0aW9uIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAgICovCisgIHB1YmxpYyBJUmVzdWx0TWFwIGdldFNraXBwZWRDb25maWd1cmF0aW9ucygpOworCisgIC8qKgorICAgKiBSZXRyaWV2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhaWxlZCBjb25maWd1cmF0aW9uIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAgICovCisgIHB1YmxpYyBJUmVzdWx0TWFwIGdldEZhaWxlZENvbmZpZ3VyYXRpb25zKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgWG1sVGVzdC4KKyAgICovCisgIHB1YmxpYyBYbWxUZXN0IGdldEN1cnJlbnRYbWxUZXN0KCk7CisKKyAgcHVibGljIExpc3Q8TW9kdWxlPiBnZXRHdWljZU1vZHVsZXMoQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gY2xzKTsKKworICBwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoTGlzdDxNb2R1bGU+IG1vZHVsZUluc3RhbmNlcyk7CisgIEluamVjdG9yIGdldEluamVjdG9yKElDbGFzcyBpQ2xhc3MpOworICBwdWJsaWMgdm9pZCBhZGRJbmplY3RvcihMaXN0PE1vZHVsZT4gbW9kdWxlSW5zdGFuY2VzLCBJbmplY3RvciBpbmplY3Rvcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3RMaXN0ZW5lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZDg5OTczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKy8qKgorICogQSBsaXN0ZW5lciBmb3IgdGVzdCBydW5uaW5nLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICogQGF1dGhvciBIYW5pIFN1bGVpbWFuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RMaXN0ZW5lciBleHRlbmRzIElUZXN0TkdMaXN0ZW5lciB7CisgIC8qKgorICAgKiBJbnZva2VkIGVhY2ggdGltZSBiZWZvcmUgYSB0ZXN0IHdpbGwgYmUgaW52b2tlZC4KKyAgICogVGhlIDxjb2RlPklUZXN0UmVzdWx0PC9jb2RlPiBpcyBvbmx5IHBhcnRpYWxseSBmaWxsZWQgd2l0aCB0aGUgcmVmZXJlbmNlcyB0bworICAgKiBjbGFzcywgbWV0aG9kLCBzdGFydCBtaWxsaXMgYW5kIHN0YXR1cy4KKyAgICoKKyAgICogQHBhcmFtIHJlc3VsdCB0aGUgcGFydGlhbGx5IGZpbGxlZCA8Y29kZT5JVGVzdFJlc3VsdDwvY29kZT4KKyAgICogQHNlZSBJVGVzdFJlc3VsdCNTVEFSVEVECisgICAqLworICB2b2lkIG9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0IHJlc3VsdCk7CisKKyAgLyoqCisgICAqIEludm9rZWQgZWFjaCB0aW1lIGEgdGVzdCBzdWNjZWVkcy4KKyAgICoKKyAgICogQHBhcmFtIHJlc3VsdCA8Y29kZT5JVGVzdFJlc3VsdDwvY29kZT4gY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVuIHRlc3QKKyAgICogQHNlZSBJVGVzdFJlc3VsdCNTVUNDRVNTCisgICAqLworICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHJlc3VsdCk7CisKKyAgLyoqCisgICAqIEludm9rZWQgZWFjaCB0aW1lIGEgdGVzdCBmYWlscy4KKyAgICoKKyAgICogQHBhcmFtIHJlc3VsdCA8Y29kZT5JVGVzdFJlc3VsdDwvY29kZT4gY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVuIHRlc3QKKyAgICogQHNlZSBJVGVzdFJlc3VsdCNGQUlMVVJFCisgICAqLworICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHJlc3VsdCk7CisKKyAgLyoqCisgICAqIEludm9rZWQgZWFjaCB0aW1lIGEgdGVzdCBpcyBza2lwcGVkLgorICAgKgorICAgKiBAcGFyYW0gcmVzdWx0IDxjb2RlPklUZXN0UmVzdWx0PC9jb2RlPiBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gdGVzdAorICAgKiBAc2VlIElUZXN0UmVzdWx0I1NLSVAKKyAgICovCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgcmVzdWx0KTsKKworICAvKioKKyAgICogSW52b2tlZCBlYWNoIHRpbWUgYSBtZXRob2QgZmFpbHMgYnV0IGhhcyBiZWVuIGFubm90YXRlZCB3aXRoCisgICAqIHN1Y2Nlc3NQZXJjZW50YWdlIGFuZCB0aGlzIGZhaWx1cmUgc3RpbGwga2VlcHMgaXQgd2l0aGluIHRoZQorICAgKiBzdWNjZXNzIHBlcmNlbnRhZ2UgcmVxdWVzdGVkLgorICAgKgorICAgKiBAcGFyYW0gcmVzdWx0IDxjb2RlPklUZXN0UmVzdWx0PC9jb2RlPiBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gdGVzdAorICAgKiBAc2VlIElUZXN0UmVzdWx0I1NVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFCisgICAqLworICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpOworCisgIC8qKgorICAgKiBJbnZva2VkIGFmdGVyIHRoZSB0ZXN0IGNsYXNzIGlzIGluc3RhbnRpYXRlZCBhbmQgYmVmb3JlCisgICAqIGFueSBjb25maWd1cmF0aW9uIG1ldGhvZCBpcyBjYWxsZWQuCisgICAqLworICBwdWJsaWMgdm9pZCBvblN0YXJ0KElUZXN0Q29udGV4dCBjb250ZXh0KTsKKworICAvKioKKyAgICogSW52b2tlZCBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgcnVuIGFuZCBhbGwgdGhlaXIKKyAgICogQ29uZmlndXJhdGlvbiBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQuCisgICAqLworICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgY29udGV4dCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE1ldGhvZEZpbmRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TWV0aG9kRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWNlY2QzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE1ldGhvZEZpbmRlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKKworCisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIHRvIG1vZGlmeSB0aGUgc3RyYXRlZ3kgdXNlZCBieSBUZXN0UnVubmVyCisgKiB0byBmaW5kIGl0cyB0ZXN0IG1ldGhvZHMuICBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIFRlc3RORworICogc3VwcG9ydHMgdHdvIGRpZmZlcmVudCBzdHJhdGVnaWVzOiAgVGVzdE5HICh1c2luZyBhbm5vdGF0aW9ucyB0bworICogbG9jYXRlIHRoZXNlIG1ldGhvZHMpIGFuZCBKVW5pdCAoc2V0VXAoKS90ZWFyRG93bigpIGFuZCBhbGwKKyAqIG1ldGhvZHMgdGhhdCBzdGFydCB3aXRoICJ0ZXN0IiBvciBoYXZlIGEgc3VpdGUoKSBtZXRob2QpLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMywgMjAwNAorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdE1ldGhvZEZpbmRlciB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBhcHBsaWNhYmxlIHRlc3QgbWV0aG9kcy4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRUZXN0TWV0aG9kcyhDbGFzczw/PiBjbHMsIFhtbFRlc3QgeG1sVGVzdCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQKKyAgICogYmVmb3JlIGEgdGVzdCBtZXRob2QgaXMgaW52b2tlZC4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVUZXN0TWV0aG9kcyhDbGFzczw/PiBjbHMpOworCisgIC8qKgorICAgKiBAcmV0dXJuIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGFmdGVyIGEgdGVzdCBtZXRob2QgY29tcGxldGVzLgorICAgKi8KKyAgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyVGVzdE1ldGhvZHMoQ2xhc3M8Pz4gY2xzKTsKKworICAvKioKKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciB0aGUgdGVzdCBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkIGFuZCBiZWZvcmUKKyAgICogYW55IG9mIGl0cyB0ZXN0IG1ldGhvZHMgaXMgaW52b2tlZC4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVDbGFzc01ldGhvZHMoQ2xhc3M8Pz4gY2xzKTsKKworICAvKioKKyAgICogQHJldHVybiBBbGwgdGhlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgaW52b2tlZAorICAgKiBhZnRlciB0aGUgdGVzdCBjbGFzcyBoYXMgYmVlbiBjcmVhdGVkIGFuZCBhZnRlcgorICAgKiBhbGwgaXRzIHRlc3QgbWV0aG9kcyBoYXZlIGNvbXBsZXRlZC4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckNsYXNzTWV0aG9kcyhDbGFzczw/PiBjbHMpOworCisgIC8qKgorICAgKiBAcmV0dXJuIEFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBpbnZva2VkCisgICAqIGJlZm9yZSB0aGUgc3VpdGUgc3RhcnRzIHJ1bm5pbmcuCisgICAqLworICBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlU3VpdGVNZXRob2RzKENsYXNzPD8+IGNscyk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQKKyAgICogYWZ0ZXIgdGhlIHN1aXRlIGhhcyBydW4gYWxsIGl0cyB0ZXN0cy4KKyAgICovCisgIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclN1aXRlTWV0aG9kcyhDbGFzczw/PiBjbHMpOworCisgIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoQ2xhc3M8Pz4gdGVzdENsYXNzKTsKKworICBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoQ2xhc3M8Pz4gdGVzdENsYXNzKTsKKworICBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbk1ldGhvZHMoQ2xhc3M8Pz4gdGVzdENsYXNzKTsKKworICBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJHcm91cHNDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzczw/PiB0ZXN0Q2xhc3MpOworCisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE5HTGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE5HTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDQzNDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TkdMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSBmb3IgYWxsIG9iamVjdHMgdGhhdCBjYW4gYmUgcGFzc2VkCisgKiBhcyBhIC1saXN0ZW5lciBhcmd1bWVudC4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgaW50ZXJmYWNlIElUZXN0TkdMaXN0ZW5lciB7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3ROR0xpc3RlbmVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TkdMaXN0ZW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZmZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0TkdMaXN0ZW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKy8qKgorICogQSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBJVGVzdE5HTGlzdGVuZXIuICBVc2VycyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlCisgKiBpbiBhbnkgb2YgdGhlaXIgdGVzdCBjbGFzc2VzIGJ1dCB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3VjaCBpbnN0YW5jZS4KKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdE5HTGlzdGVuZXJGYWN0b3J5IHsKKworICAvKioKKyAgICogQ3JlYXRlIGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGNsYXNzIHBhc3NlZCBpbiBwYXJhbWV0ZXIuICBSZXR1cm4gbnVsbAorICAgKiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgZmFjdG9yeS4KKyAgICovCisgIElUZXN0TkdMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcihDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE5HTWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3ROR01ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3MzhiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3ROR01ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMjY4IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7DQorDQorDQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ29uc3RydWN0b3JPck1ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsNCisNCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorLyoqDQorICogRGVzY3JpYmVzIGEgVGVzdE5HIGFubm90YXRlZCBtZXRob2QgYW5kIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCB3aWxsIGJlIGludm9rZWQuDQorICoNCisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdXNlcnMuDQorICoNCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgTWF5IDMsIDIwMDQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIElUZXN0TkdNZXRob2QgZXh0ZW5kcyBDb21wYXJhYmxlLCBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gVGhlIHJlYWwgY2xhc3Mgb24gd2hpY2ggdGhpcyBtZXRob2Qgd2FzIGRlY2xhcmVkDQorICAgKiAoY2FuIGJlIGRpZmZlcmVudCBmcm9tIGdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCkgaWYNCisgICAqIHRoZSB0ZXN0IG1ldGhvZCB3YXMgZGVmaW5lZCBpbiBhIHN1cGVyY2xhc3MpLg0KKyAgICovDQorICBDbGFzcyBnZXRSZWFsQ2xhc3MoKTsNCisNCisgIElUZXN0Q2xhc3MgZ2V0VGVzdENsYXNzKCk7DQorDQorICAvKioNCisgICAqIFNldHMgdGhlIHRlc3QgY2xhc3MgaGF2aW5nIHRoaXMgbWV0aG9kLiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgZGVjbGFyaW5nIGNsYXNzLg0KKyAgICoNCisgICAqIEBwYXJhbSBjbHMgVGhlIHRlc3QgY2xhc3MgaGF2aW5nIHRoaXMgbWV0aG9kLg0KKyAgICovDQorICB2b2lkIHNldFRlc3RDbGFzcyhJVGVzdENsYXNzIGNscyk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSB0ZXN0IG1ldGhvZC4NCisgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbiBub3cgcmV0dXJuIG51bGwuIFVzZQ0KKyAgICogZ2V0Q29uc3RydWN0b3JPck1ldGhvZCgpIGluc3RlYWQuDQorICAgKi8NCisgIEBEZXByZWNhdGVkDQorICBNZXRob2QgZ2V0TWV0aG9kKCk7DQorDQorICAvKioNCisgICAqIFJldHVybnMgdGhlIG1ldGhvZCBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3Igc2VyaWFsaXphdGlvbiBiZWNhdXNlDQorICAgKiBtZXRob2RzIGFyZSBub3QgU2VyaWFsaXphYmxlLg0KKyAgICogQHJldHVybiB0aGUgbWV0aG9kIG5hbWUuDQorICAgKi8NCisgIFN0cmluZyBnZXRNZXRob2ROYW1lKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gQWxsIHRoZSBpbnN0YW5jZXMgdGhlIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIHVwb24uDQorICAgKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIGFuIGFycmF5IG9mIG9uZSBvYmplY3QgaW4gdGhlIGFic2VuY2UNCisgICAqIG9mIGFuIEBGYWN0b3J5IGFubm90YXRpb24uDQorICAgKg0KKyAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEluc3RhbmNlKCkuDQorICAgKi8NCisgIEBEZXByZWNhdGVkDQorICBPYmplY3RbXSBnZXRJbnN0YW5jZXMoKTsNCisNCisgIE9iamVjdCBnZXRJbnN0YW5jZSgpOw0KKw0KKyAgLyoqDQorICAgKiBOZWVkZWQgZm9yIHNlcmlhbGl6YXRpb24uDQorICAgKi8NCisgIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIFRoZSBncm91cHMgdGhpcyBtZXRob2QgYmVsb25ncyB0bywgcG9zc2libHkgYWRkZWQgdG8gdGhlIGdyb3Vwcw0KKyAgICogZGVjbGFyZWQgb24gdGhlIGNsYXNzLg0KKyAgICovDQorICBTdHJpbmdbXSBnZXRHcm91cHMoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBUaGUgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24sIHBvc3NpYmx5IGFkZGVkIHRvIHRoZSBncm91cHMNCisgICAqIGRlY2xhcmVkIG9uIHRoZSBjbGFzcy4NCisgICAqLw0KKyAgU3RyaW5nW10gZ2V0R3JvdXBzRGVwZW5kZWRVcG9uKCk7DQorDQorICAvKioNCisgICAqIElmIGEgZ3JvdXAgd2FzIG5vdCBmb3VuZC4NCisgICAqLw0KKyAgU3RyaW5nIGdldE1pc3NpbmdHcm91cCgpOw0KKyAgcHVibGljIHZvaWQgc2V0TWlzc2luZ0dyb3VwKFN0cmluZyBncm91cCk7DQorDQorICAvKioNCisgICAqIEJlZm9yZSBhbmQgQWZ0ZXIgZ3JvdXBzDQorICAgKi8NCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRCZWZvcmVHcm91cHMoKTsNCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZnRlckdyb3VwcygpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIFRoZSBtZXRob2RzICB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLCBwb3NzaWJseSBhZGRlZCB0byB0aGUgbWV0aG9kcw0KKyAgICogZGVjbGFyZWQgb24gdGhlIGNsYXNzLg0KKyAgICovDQorICBTdHJpbmdbXSBnZXRNZXRob2RzRGVwZW5kZWRVcG9uKCk7DQorICB2b2lkIGFkZE1ldGhvZERlcGVuZGVkVXBvbihTdHJpbmcgbWV0aG9kTmFtZSk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCB3YXMgYW5ub3RhdGVkIHdpdGggQFRlc3QNCisgICAqLw0KKyAgYm9vbGVhbiBpc1Rlc3QoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIHdhcyBhbm5vdGF0ZWQgd2l0aCBAQ29uZmlndXJhdGlvbg0KKyAgICogYW5kIGJlZm9yZVRlc3RNZXRob2QgPSB0cnVlDQorICAgKi8NCisgIGJvb2xlYW4gaXNCZWZvcmVNZXRob2RDb25maWd1cmF0aW9uKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCB3YXMgYW5ub3RhdGVkIHdpdGggQENvbmZpZ3VyYXRpb24NCisgICAqIGFuZCBiZWZvcmVUZXN0TWV0aG9kID0gZmFsc2UNCisgICAqLw0KKyAgYm9vbGVhbiBpc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2Qgd2FzIGFubm90YXRlZCB3aXRoIEBDb25maWd1cmF0aW9uDQorICAgKiBhbmQgYmVmb3JlQ2xhc3NNZXRob2QgPSB0cnVlDQorICAgKi8NCisgIGJvb2xlYW4gaXNCZWZvcmVDbGFzc0NvbmZpZ3VyYXRpb24oKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIHdhcyBhbm5vdGF0ZWQgd2l0aCBAQ29uZmlndXJhdGlvbg0KKyAgICogYW5kIGJlZm9yZUNsYXNzTWV0aG9kID0gZmFsc2UNCisgICAqLw0KKyAgYm9vbGVhbiBpc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCB3YXMgYW5ub3RhdGVkIHdpdGggQENvbmZpZ3VyYXRpb24NCisgICAqIGFuZCBiZWZvcmVTdWl0ZSA9IHRydWUNCisgICAqLw0KKyAgYm9vbGVhbiBpc0JlZm9yZVN1aXRlQ29uZmlndXJhdGlvbigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2Qgd2FzIGFubm90YXRlZCB3aXRoIEBDb25maWd1cmF0aW9uDQorICAgKiBhbmQgYWZ0ZXJTdWl0ZSA9IHRydWUNCisgICAqLw0KKyAgYm9vbGVhbiBpc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1ldGhvZCBpcyBhIEBCZWZvcmVUZXN0IChAQ29uZmlndXJhdGlvbiBiZWZvcmVUZXN0PXRydWUpDQorICAgKi8NCisgIGJvb2xlYW4gaXNCZWZvcmVUZXN0Q29uZmlndXJhdGlvbigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtZXRob2QgaXMgYW4gQEFmdGVyVGVzdCAoQENvbmZpZ3VyYXRpb24gYWZ0ZXJUZXN0PXRydWUpDQorICAgKi8NCisgIGJvb2xlYW4gaXNBZnRlclRlc3RDb25maWd1cmF0aW9uKCk7DQorDQorICBib29sZWFuIGlzQmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbigpOw0KKw0KKyAgYm9vbGVhbiBpc0FmdGVyR3JvdXBzQ29uZmlndXJhdGlvbigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4NCisgICAqLw0KKyAgbG9uZyBnZXRUaW1lT3V0KCk7DQorICB2b2lkIHNldFRpbWVPdXQobG9uZyB0aW1lT3V0KTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGludm9rZWQuDQorICAgKi8NCisgIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKTsNCisgIHZvaWQgc2V0SW52b2NhdGlvbkNvdW50KGludCBjb3VudCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiB0aGltZXMgdGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW52b2tlZCwgaW5jbHVkaW5nIHBvc3NpYmxlDQorICAgKiAgICAgICAgIGNsb25lcyBvZiB0aGlzIG1ldGhvZCAtIHRoaXMgaXMgcmVsZXZhbnQgd2hlbiB0aHJlYWRQb29sU2l6ZSBpcyBiaWdnZXIgdGhhbiAxDQorICAgKiAgICAgICAgIHdoZXJlIGVhY2ggY2xvbmUgb2YgdGhpcyBtZXRob2QgaXMgb25seSBpbnZva2VkIG9uY2UgaW5kaXZpZHVhbGx5LCBpLmUuDQorICAgKiAgICAgICAgIHtAbGluayBvcmcudGVzdG5nLklUZXN0TkdNZXRob2QjZ2V0SW52b2NhdGlvbkNvdW50KCl9IHdvdWxkIGFsd2F5cyByZXR1cm4gMS4NCisgICAqLw0KKyAgaW50IGdldFRvdGFsSW52b2NhdGlvbkNvdW50KCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIHN1Y2Nlc3MgcGVyY2VudGFnZSBmb3IgdGhpcyBtZXRob2QgKGJldHdlZW4gMCBhbmQgMTAwKS4NCisgICAqLw0KKyAgaW50IGdldFN1Y2Nlc3NQZXJjZW50YWdlKCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gVGhlIGlkIG9mIHRoZSB0aHJlYWQgdGhpcyBtZXRob2Qgd2FzIHJ1biBpbi4NCisgICAqLw0KKyAgU3RyaW5nIGdldElkKCk7DQorDQorICB2b2lkIHNldElkKFN0cmluZyBpZCk7DQorDQorICBsb25nIGdldERhdGUoKTsNCisNCisgIHZvaWQgc2V0RGF0ZShsb25nIGRhdGUpOw0KKw0KKyAgLyoqDQorICAgKiBSZXR1cm5zIGlmIHRoaXMgSVRlc3ROR01ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIHdpdGhpbiBJQ2xhc3MuDQorICAgKi8NCisgIGJvb2xlYW4gY2FuUnVuRnJvbUNsYXNzKElDbGFzcyB0ZXN0Q2xhc3MpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgYWx3YXlzUnVuPXRydWUNCisgICAqLw0KKyAgYm9vbGVhbiBpc0Fsd2F5c1J1bigpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBiZSB1c2VkIHdoZW4gaW52b2tpbmcgdGhlIG1ldGhvZCBvbiBwYXJhbGxlbA0KKyAgICovDQorICBpbnQgZ2V0VGhyZWFkUG9vbFNpemUoKTsNCisNCisgIHZvaWQgc2V0VGhyZWFkUG9vbFNpemUoaW50IHRocmVhZFBvb2xTaXplKTsNCisNCisgIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOw0KKw0KKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOw0KKyAgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOw0KKw0KKyAgcHVibGljIHZvaWQgaW5jcmVtZW50Q3VycmVudEludm9jYXRpb25Db3VudCgpOw0KKyAgcHVibGljIGludCBnZXRDdXJyZW50SW52b2NhdGlvbkNvdW50KCk7DQorICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQoaW50IG4pOw0KKyAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQoKTsNCisNCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kIGNsb25lKCk7DQorDQorICBwdWJsaWMgSVJldHJ5QW5hbHl6ZXIgZ2V0UmV0cnlBbmFseXplcigpOw0KKyAgcHVibGljIHZvaWQgc2V0UmV0cnlBbmFseXplcihJUmV0cnlBbmFseXplciByZXRyeUFuYWx5emVyKTsNCisNCisgIHB1YmxpYyBib29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9ucygpOw0KKyAgcHVibGljIHZvaWQgc2V0U2tpcEZhaWxlZEludm9jYXRpb25zKGJvb2xlYW4gc2tpcCk7DQorDQorICAvKioNCisgICAqIFRoZSB0aW1lIHVuZGVyIHdoaWNoIGFsbCBpbnZvY2F0aW9uQ291bnQgbWV0aG9kcyBuZWVkIHRvIGNvbXBsZXRlIGJ5Lg0KKyAgICovDQorICBwdWJsaWMgbG9uZyBnZXRJbnZvY2F0aW9uVGltZU91dCgpOw0KKw0KKyAgcHVibGljIGJvb2xlYW4gaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpOw0KKyAgcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcyhib29sZWFuIGlnbm9yZSk7DQorDQorICAvKioNCisgICAqIFdoaWNoIGludm9jYXRpb24gbnVtYmVycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCAob25seSBhcHBsaWNhYmxlDQorICAgKiBpZiBpdCB1c2VzIGEgZGF0YSBwcm92aWRlcikuIElmIHRoaXMgdmFsdWUgaXMgYW4gZW1wdHkgbGlzdCwgdXNlIGFsbCB0aGUgdmFsdWVzDQorICAgKiByZXR1cm5lZCBmcm9tIHRoZSBkYXRhIHByb3ZpZGVyLiAgVGhlc2UgdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIFhNTCBmaWxlIGluDQorICAgKiB0aGUgPGluY2x1ZGUgaW52b2NhdGlvbk51bWJlcnM9Ii4uLiI+IHRhZy4NCisgICAqLw0KKyAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0SW52b2NhdGlvbk51bWJlcnMoKTsNCisgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25OdW1iZXJzKExpc3Q8SW50ZWdlcj4gbnVtYmVycyk7DQorDQorICAvKioNCisgICAqIFRoZSBsaXN0IG9mIGludm9jYXRpb24gbnVtYmVycyB0aGF0IGZhaWxlZCwgd2hpY2ggaXMgb25seSBhcHBsaWNhYmxlIGZvcg0KKyAgICogbWV0aG9kcyB0aGF0IGhhdmUgYSBkYXRhIHByb3ZpZGVyLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCBhZGRGYWlsZWRJbnZvY2F0aW9uTnVtYmVyKGludCBudW1iZXIpOw0KKyAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0RmFpbGVkSW52b2NhdGlvbk51bWJlcnMoKTsNCisNCisgIC8qKg0KKyAgICogVGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkuIExvd2VyIHByaW9yaXRpZXMgZ2V0IHNjaGVkdWxlZCBmaXJzdC4NCisgICAqLw0KKyAgcHVibGljIGludCBnZXRQcmlvcml0eSgpOw0KKyAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0aGUgWG1sVGVzdCB0aGlzIG1ldGhvZCBiZWxvbmdzIHRvLg0KKyAgICovDQorICBwdWJsaWMgWG1sVGVzdCBnZXRYbWxUZXN0KCk7DQorDQorICBDb25zdHJ1Y3Rvck9yTWV0aG9kIGdldENvbnN0cnVjdG9yT3JNZXRob2QoKTsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUgaW5jbHVkZSB0YWcsIGlmIGFueQ0KKyAgICogQHBhcmFtIHRlc3QNCisgICAqLw0KKyAgTWFwPFN0cmluZywgU3RyaW5nPiBmaW5kTWV0aG9kUGFyYW1ldGVycyhYbWxUZXN0IHRlc3QpOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3RPYmplY3RGYWN0b3J5LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3RPYmplY3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkYjViZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdE9iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBQYXJlbnQgaW50ZXJmYWNlIG9mIGFsbCB0aGUgb2JqZWN0IGZhY3Rvcmllcy4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdE9iamVjdEZhY3RvcnkgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3RSZXN1bHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4YmE3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSVRlc3RSZXN1bHQuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIGEgdGVzdC4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgTWF5IDIsIDIwMDQKKyAqIEBzaW5jZSBNYXkgMiwgMjAwNAorICogQHZlcnNpb24gJFJldmlzaW9uOiA3MjEgJCwgJERhdGU6IDIwMDktMDUtMjMgMDk6NTU6NDYgLTA3MDAgKFNhdCwgMjMgTWF5IDIwMDkpICQKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RSZXN1bHQgZXh0ZW5kcyBJQXR0cmlidXRlcywgQ29tcGFyYWJsZTxJVGVzdFJlc3VsdD4geworCisgIC8vCisgIC8vIFRlc3Qgc3RhdHVzCisgIC8vCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMVVJFID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRD0gMTY7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGlzIHJlc3VsdCwgdXNpbmcgb25lIG9mIHRoZSBjb25zdGFudHMKKyAgICogYWJvdmUuCisgICAqLworICBwdWJsaWMgaW50IGdldFN0YXR1cygpOworICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cyk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIHRlc3QgbWV0aG9kIHRoaXMgcmVzdWx0IHJlcHJlc2VudHMuCisgICAqLworICBwdWJsaWMgSVRlc3ROR01ldGhvZCBnZXRNZXRob2QoKTsKKworICAvKioKKyAgICogQHJldHVybiBUaGUgcGFyYW1ldGVycyB0aGlzIG1ldGhvZCB3YXMgaW52b2tlZCB3aXRoLgorICAgKi8KKyAgcHVibGljIE9iamVjdFtdIGdldFBhcmFtZXRlcnMoKTsKKyAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhPYmplY3RbXSBwYXJhbWV0ZXJzKTsKKworICAvKioKKyAgICogQHJldHVybiBUaGUgdGVzdCBjbGFzcyB1c2VkIHRoaXMgb2JqZWN0IGlzIGEgcmVzdWx0IGZvci4KKyAgICovCisgIHB1YmxpYyBJQ2xhc3MgZ2V0VGVzdENsYXNzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIHRocm93YWJsZSB0aGF0IHdhcyB0aHJvd24gd2hpbGUgcnVubmluZyB0aGUKKyAgICogbWV0aG9kLCBvciBudWxsIGlmIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICAgKi8KKyAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUoKTsKKyAgcHVibGljIHZvaWQgc2V0VGhyb3dhYmxlKFRocm93YWJsZSB0aHJvd2FibGUpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBzdGFydCBkYXRlIGZvciB0aGlzIHRlc3QsIGluIG1pbGxpc2Vjb25kcy4KKyAgICovCisgIHB1YmxpYyBsb25nIGdldFN0YXJ0TWlsbGlzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGVuZCBkYXRlIGZvciB0aGlzIHRlc3QsIGluIG1pbGxpc2Vjb25kcy4KKyAgICovCisgIHB1YmxpYyBsb25nIGdldEVuZE1pbGxpcygpOworICBwdWJsaWMgdm9pZCBzZXRFbmRNaWxsaXMobG9uZyBtaWxsaXMpOworCisgIC8qKgorICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgVGVzdFJlc3VsdCwgdHlwaWNhbGx5IGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgKiBvZiB0aGUgbWV0aG9kLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpZiB0aGlzIHRlc3QgcnVuIGlzIGEgU1VDQ0VTUworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIGhvc3Qgd2hlcmUgdGhpcyBzdWl0ZSB3YXMgcnVuLCBvciBudWxsIGlmIGl0IHdhcyBydW4gbG9jYWxseS4gIFRoZQorICAgKiByZXR1cm5lZCBzdHJpbmcgaGFzIHRoZSBmb3JtOiAgaG9zdDpwb3J0CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKTsKKworICAvKioKKyAgICogVGhlIGluc3RhbmNlIG9uIHdoaWNoIHRoaXMgbWV0aG9kIHdhcyBydW4uCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldEluc3RhbmNlKCk7CisKKyAgLyoqCisgICAqIElmIHRoaXMgcmVzdWx0J3MgcmVsYXRlZCBpbnN0YW5jZSBpbXBsZW1lbnRzIElUZXN0IG9yIHVzZSBAVGVzdCh0ZXN0TmFtZT0uLi4pLCByZXR1cm5zIGl0cyB0ZXN0IG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCk7CisKKyAgcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZU5hbWUoKTsKKyAgCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSVRlc3RDb250ZXh0fSBmb3IgdGhpcyB0ZXN0IHJlc3VsdC4KKyAgICovCisgIHB1YmxpYyBJVGVzdENvbnRleHQgZ2V0VGVzdENvbnRleHQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdFJ1bm5lckZhY3RvcnkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JVGVzdFJ1bm5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgzY2VhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL0lUZXN0UnVubmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgZmFjdG9yeSBmb3IgVGVzdFJ1bm5lcnMgdG8gYmUgdXNlZCBieSBTdWl0ZVJ1bm5lcnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RSdW5uZXJGYWN0b3J5IHsKKwlUZXN0UnVubmVyIG5ld1Rlc3RSdW5uZXIoZmluYWwgSVN1aXRlIHN1aXRlLCBmaW5hbCBYbWxUZXN0IHRlc3QsCisJICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbGlzdGVuZXJzLCBMaXN0PElDbGFzc0xpc3RlbmVyPiBjbGFzc0xpc3RlbmVycyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSW5zdGFuY2VPcmRlcmluZ01ldGhvZEludGVyY2VwdG9yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvSW5zdGFuY2VPcmRlcmluZ01ldGhvZEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ODE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9JbnN0YW5jZU9yZGVyaW5nTWV0aG9kSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBtZXRob2QgaW50ZXJjZXB0b3IgdGhhdCBzb3J0cyBpdHMgbWV0aG9kcyBwZXIgaW5zdGFuY2VzIChpLmUuIHBlciBjbGFzcykuCisgKgorICoKKyAqLworY2xhc3MgSW5zdGFuY2VPcmRlcmluZ01ldGhvZEludGVyY2VwdG9yIGltcGxlbWVudHMgSU1ldGhvZEludGVyY2VwdG9yIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SU1ldGhvZEluc3RhbmNlPiBpbnRlcmNlcHQoTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG1ldGhvZHMsCisgICAgICBJVGVzdENvbnRleHQgY29udGV4dCkgIHsKKyAgICByZXR1cm4gZ3JvdXBNZXRob2RzQnlJbnN0YW5jZShtZXRob2RzKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZGVmYXVsdCBtZXRob2QgaW50ZXJjZXB0b3Igd2hpY2ggc29ydHMgbWV0aG9kcyBieSBpbnN0YW5jZXMgKGkuZS4gYnkgY2xhc3MpLgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PElNZXRob2RJbnN0YW5jZT4gZ3JvdXBNZXRob2RzQnlJbnN0YW5jZShMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kcykgeworICAgIExpc3Q8T2JqZWN0PiBpbnN0YW5jZUxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBNYXA8T2JqZWN0LCBMaXN0PElNZXRob2RJbnN0YW5jZT4+IG1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG1pIDogbWV0aG9kcykgeworICAgICAgT2JqZWN0W10gbWV0aG9kSW5zdGFuY2VzID0gbWkuZ2V0SW5zdGFuY2VzKCk7CisgICAgICBmb3IgKE9iamVjdCBpbnN0YW5jZSA6IG1ldGhvZEluc3RhbmNlcykgeworICAgICAgICBpZiAoIWluc3RhbmNlTGlzdC5jb250YWlucyhpbnN0YW5jZSkpIHsKKyAgICAgICAgICBpbnN0YW5jZUxpc3QuYWRkKGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0PElNZXRob2RJbnN0YW5jZT4gbCA9IG1hcC5nZXQoaW5zdGFuY2UpOworICAgICAgICBpZiAobCA9PSBudWxsKSB7CisgICAgICAgICAgbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgIG1hcC5wdXQoaW5zdGFuY2UsIGwpOworICAgICAgICB9CisgICAgICAgIGwuYWRkKG1pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBMaXN0PElNZXRob2RJbnN0YW5jZT4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChPYmplY3QgaW5zdGFuY2UgOiBpbnN0YW5jZUxpc3QpIHsKKyAgICAgIHJlc3VsdC5hZGRBbGwobWFwLmdldChpbnN0YW5jZSkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1ByZXNlcnZlT3JkZXJNZXRob2RJbnRlcmNlcHRvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1ByZXNlcnZlT3JkZXJNZXRob2RJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTk5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvUHJlc2VydmVPcmRlck1ldGhvZEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5NZXRob2RJbnN0YW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIG1ldGhvZCBpbnRlcmNlcHRvciB0aGF0IHByZXNlcnZlcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGVzdCBjbGFzc2VzIHdlcmUgZm91bmQgaW4KKyAqIHRoZSAmbHQ7dGVzdCZndDsgdGFnLgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKgorICovCitjbGFzcyBQcmVzZXJ2ZU9yZGVyTWV0aG9kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBJTWV0aG9kSW50ZXJjZXB0b3IgeworCisgIHByaXZhdGUgdm9pZCBwKExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLCBTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1ByZXNlcnZlT3JkZXJNZXRob2RJbnRlcmNlcHRvcl0gIiArIHMpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG1pIDogbWV0aG9kcykgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBtaS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkKKyAgICAgICAgICArICIgaW5kZXg6IiArIG1pLmdldE1ldGhvZCgpLmdldFRlc3RDbGFzcygpLmdldFhtbENsYXNzKCkuZ2V0SW5kZXgoKSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLCBJVGVzdENvbnRleHQgY29udGV4dCkgeworLy8gICAgcChtZXRob2RzLCAiQmVmb3JlIik7CisgICAgQ29sbGVjdGlvbnMuc29ydChtZXRob2RzLCBNZXRob2RJbnN0YW5jZS5TT1JUX0JZX0lOREVYKTsKKy8vICAgIHAobWV0aG9kcywgIkFmdGVyIik7CisgICAgcmV0dXJuIG1ldGhvZHM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1JlcG9ydGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjE2YTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1JlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwxODQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy51dGlsLlN0cmluZ3M7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciB0ZXN0IG1ldGhvZHMgdG8gbG9nIG1lc3NhZ2VzIHRoYXQgd2lsbCBiZQorICogaW5jbHVkZWQgaW4gdGhlIEhUTUwgcmVwb3J0cyBnZW5lcmF0ZWQgYnkgVGVzdE5HLgorICogPGJyPgorICogPGJyPgorICogPGI+SW1wbGVtZW50YXRpb24gZGV0YWlscy48L2I+CisgKiA8YnI+CisgKiA8YnI+CisgKiBUaGUgcmVwb3J0ZXIga2VlcHMgYSBjb21iaW5lZCBvdXRwdXQgb2Ygc3RyaW5ncyAoaW4gbV9vdXRwdXQpIGFuZCBhbHNvCisgKiBhIHJlY29yZCBvZiB3aGljaCBtZXRob2Qgb3V0cHV0IHdoaWNoIGxpbmUuICBJbiBvcmRlciB0byBkbyB0aGlzLCBjYWxsZXJzCisgKiBzcGVjaWZ5IHdoYXQgdGhlIGN1cnJlbnQgbWV0aG9kIGlzIHdpdGggc2V0Q3VycmVudFRlc3RSZXN1bHQoKSBhbmQgdGhlCisgKiBSZXBvcnRlciBtYWludGFpbnMgYSBtYXBwaW5nIG9mIGVhY2ggdGVzdCByZXN1bHQgd2l0aCBhIGxpc3Qgb2YgaW50ZWdlcnMuCisgKiBUaGVzZSBpbnRlZ2VycyBhcmUgaW5kaWNlcyBpbiB0aGUgY29tYmluZWQgb3V0cHV0IChhdm9pZHMgZHVwbGljYXRpbmcKKyAqIHRoZSBvdXRwdXQpLgorICoKKyAqIENyZWF0ZWQgb24gTm92IDIsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRlciB7CisgIC8vIHdoZW4gdGVzdHMgYXJlIHJ1biBpbiBwYXJhbGxlbCwgZWFjaCB0aHJlYWQgbWF5IGJlIHdvcmtpbmcgd2l0aCBkaWZmZXJlbnQKKyAgLy8gJ2N1cnJlbnQgdGVzdCByZXN1bHQnLiBBbHNvLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBpbmhlcml0ZWQgaWYgdGhlIHRlc3QgY29kZQorICAvLyBzcGF3bnMgaXRzIG93biB0aHJlYWQuCisgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPElUZXN0UmVzdWx0PiBtX2N1cnJlbnRUZXN0UmVzdWx0ID0gbmV3IEluaGVyaXRhYmxlVGhyZWFkTG9jYWw8PigpOworCisgIC8qKgorICAgKiBBbGwgb3V0cHV0IGxvZ2dlZCBpbiBhIHNlcXVlbnRpYWwgb3JkZXIuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gbV9vdXRwdXQgPSBuZXcgVmVjdG9yPD4oKTsKKworICAvKiogVGhlIGtleSBpcyB0aGUgaGFzaENvZGUgb2YgdGhlIElUZXN0UmVzdWx0ICovCisgIHByaXZhdGUgc3RhdGljIE1hcDxJbnRlZ2VyLCBMaXN0PEludGVnZXI+PiBtX21ldGhvZE91dHB1dE1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9lc2NhcGVIdG1sID0gZmFsc2U7CisgIC8vVGhpcyB2YXJpYWJsZSBpcyByZXNwb25zaWJsZSBmb3IgcGVyc2lzdGluZyBhbGwgb3V0cHV0IHRoYXQgaXMgeWV0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkKKyAgLy92YWxpZCBUZXN0UmVzdWx0IG9iamVjdHMuCisgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPExpc3Q8U3RyaW5nPj4gbV9vcnBoYW5lZE91dHB1dCA9IG5ldyBJbmhlcml0YWJsZVRocmVhZExvY2FsPD4oKTsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q3VycmVudFRlc3RSZXN1bHQoSVRlc3RSZXN1bHQgbSkgeworICAgIG1fY3VycmVudFRlc3RSZXN1bHQuc2V0KG0pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCkgeworICAgIHJldHVybiBtX291dHB1dDsKKyAgfQorCisgIC8qKgorICAgKiBFcmFzZSB0aGUgY29udGVudCBvZiBhbGwgdGhlIG91dHB1dCBnZW5lcmF0ZWQgc28gZmFyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgeworICAgIG1fbWV0aG9kT3V0cHV0TWFwLmNsZWFyKCk7CisgICAgbV9vdXRwdXQuY2xlYXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZXNjYXBlSHRtbCBJZiB0cnVlLCB1c2UgSFRNTCBlbnRpdGllcyBmb3Igc3BlY2lhbCBIVE1MIGNoYXJhY3RlcnMgKDwsID4sICYsIC4uLikuCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXNjYXBlSHRtbChib29sZWFuIGVzY2FwZUh0bWwpIHsKKyAgICBtX2VzY2FwZUh0bWwgPSBlc2NhcGVIdG1sOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9nKFN0cmluZyBzLCBJVGVzdFJlc3VsdCBtKSB7CisgICAgLy8gRXNjYXBlIGZvciB0aGUgSFRNTCByZXBvcnRzCisgICAgaWYgKG1fZXNjYXBlSHRtbCkgeworICAgICAgcyA9IFN0cmluZ3MuZXNjYXBlSHRtbChzKTsKKyAgICB9CisKKyAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAvL1BlcnNpc3QgdGhlIG91dHB1dCB0ZW1wb3JhcmlseSBpbnRvIGEgVGhyZWFkbG9jYWwgU3RyaW5nIGxpc3QuCisgICAgICBpZiAobV9vcnBoYW5lZE91dHB1dC5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgIG1fb3JwaGFuZWRPdXRwdXQuc2V0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKyAgICAgIH0KKyAgICAgIG1fb3JwaGFuZWRPdXRwdXQuZ2V0KCkuYWRkKHMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHN5bmNocm9uaXphdGlvbiBuZWVkZWQgdG8gZW5zdXJlIHRoZSBsaW5lIG51bWJlciBhbmQgbV9vdXRwdXQgYXJlIHVwZGF0ZWQgYXRvbWljYWxseQorICAgIGludCBuID0gZ2V0T3V0cHV0KCkuc2l6ZSgpOworCisgICAgTGlzdDxJbnRlZ2VyPiBsaW5lcyA9IG1fbWV0aG9kT3V0cHV0TWFwLmdldChtLmhhc2hDb2RlKCkpOworICAgIGlmIChsaW5lcyA9PSBudWxsKSB7CisgICAgICBsaW5lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgbV9tZXRob2RPdXRwdXRNYXAucHV0KG0uaGFzaENvZGUoKSwgbGluZXMpOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbHJlYWR5IHNvbWUgb3JwaGFuZWQgb3V0cHV0IGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgaWYgKG1fb3JwaGFuZWRPdXRwdXQuZ2V0KCkgIT0gbnVsbCkgeworICAgICAgbiA9IG4gKyBtX29ycGhhbmVkT3V0cHV0LmdldCgpLnNpemUoKTsKKyAgICAgIGdldE91dHB1dCgpLmFkZEFsbChtX29ycGhhbmVkT3V0cHV0LmdldCgpKTsKKyAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYWxyZWFkeSBhZGRlZCBhbGwgb2YgdGhlIG9ycGhhbmVkIG91dHB1dCB0byB0aGUgY3VycmVudAorICAgICAgLy8gVGVzdFJlc3VsdCwgbGV0cyBjbGVhciBpdCBvZmYKKyAgICAgIG1fb3JwaGFuZWRPdXRwdXQucmVtb3ZlKCk7CisgICAgfQorICAgIGxpbmVzLmFkZChuKTsKKyAgICBnZXRPdXRwdXQoKS5hZGQocyk7CisgIH0KKworICAvKioKKyAgICogTG9nIHRoZSBwYXNzZWQgc3RyaW5nIHRvIHRoZSBIVE1MIHJlcG9ydHMKKyAgICogQHBhcmFtIHMgVGhlIG1lc3NhZ2UgdG8gbG9nCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgbG9nKHMsIGdldEN1cnJlbnRUZXN0UmVzdWx0KCkpOworICB9CisKKyAgLyoqCisgICAqIExvZyB0aGUgcGFzc2VkIHN0cmluZyB0byB0aGUgSFRNTCByZXBvcnRzIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eQorICAgKiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSBwYXNzZWQgaW4gcGFyYW1ldGVyLiBJZiBsb2dUb1N0YW5kYXJkT3V0CisgICAqIGlzIHRydWUsIHRoZSBzdHJpbmcgd2lsbCBhbHNvIGJlIHByaW50ZWQgb24gc3RhbmRhcmQgb3V0LgorICAgKgorICAgKiBAcGFyYW0gcyBUaGUgbWVzc2FnZSB0byBsb2cKKyAgICogQHBhcmFtIGxldmVsIFRoZSB2ZXJib3NpdHkgb2YgdGhpcyBtZXNzYWdlCisgICAqIEBwYXJhbSBsb2dUb1N0YW5kYXJkT3V0IFdoZXRoZXIgdG8gcHJpbnQgdGhpcyBzdHJpbmcgb24gc3RhbmRhcmQKKyAgICogb3V0IHRvbworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgcywgaW50IGxldmVsLCBib29sZWFuIGxvZ1RvU3RhbmRhcmRPdXQpIHsKKyAgICBpZiAoVGVzdFJ1bm5lci5nZXRWZXJib3NlKCkgPj0gbGV2ZWwpIHsKKyAgICAgIGxvZyhzLCBnZXRDdXJyZW50VGVzdFJlc3VsdCgpKTsKKyAgICAgIGlmIChsb2dUb1N0YW5kYXJkT3V0KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogTG9nIHRoZSBwYXNzZWQgc3RyaW5nIHRvIHRoZSBIVE1MIHJlcG9ydHMuICBJZiBsb2dUb1N0YW5kYXJkT3V0CisgICAqIGlzIHRydWUsIHRoZSBzdHJpbmcgd2lsbCBhbHNvIGJlIHByaW50ZWQgb24gc3RhbmRhcmQgb3V0LgorICAgKgorICAgKiBAcGFyYW0gcyBUaGUgbWVzc2FnZSB0byBsb2cKKyAgICogQHBhcmFtIGxvZ1RvU3RhbmRhcmRPdXQgV2hldGhlciB0byBwcmludCB0aGlzIHN0cmluZyBvbiBzdGFuZGFyZAorICAgKiBvdXQgdG9vCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzLCBib29sZWFuIGxvZ1RvU3RhbmRhcmRPdXQpIHsKKyAgICBsb2cocywgZ2V0Q3VycmVudFRlc3RSZXN1bHQoKSk7CisgICAgaWYgKGxvZ1RvU3RhbmRhcmRPdXQpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKKyAgICB9CisgIH0KKyAgLyoqCisgICAqIExvZyB0aGUgcGFzc2VkIHN0cmluZyB0byB0aGUgSFRNTCByZXBvcnRzIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eQorICAgKiBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSBwYXNzZWQgaW4gcGFyYW1ldGVyCisgICAqCisgICAqIEBwYXJhbSBzIFRoZSBtZXNzYWdlIHRvIGxvZworICAgKiBAcGFyYW0gbGV2ZWwgVGhlIHZlcmJvc2l0eSBvZiB0aGlzIG1lc3NhZ2UKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMsIGludCBsZXZlbCkgeworICAgIGlmIChUZXN0UnVubmVyLmdldFZlcmJvc2UoKSA+PSBsZXZlbCkgeworICAgICAgbG9nKHMsIGdldEN1cnJlbnRUZXN0UmVzdWx0KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRlc3QgcmVzdWx0LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBJVGVzdFJlc3VsdCBnZXRDdXJyZW50VGVzdFJlc3VsdCgpIHsKKyAgICByZXR1cm4gbV9jdXJyZW50VGVzdFJlc3VsdC5nZXQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8U3RyaW5nPiBnZXRPdXRwdXQoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgaWYgKHRyID09IG51bGwpIHsKKyAgICAgIC8vZ3VhcmQgYWdhaW5zdCBhIHBvc3NpYmxlIE5QRSBpbiBzY2VuYXJpb3Mgd2hlcmVpbiB0aGUgdGVzdCByZXN1bHQgb2JqZWN0IGl0c2VsZiBjb3VsZCBiZSBhIG51bGwgdmFsdWUuCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBMaXN0PEludGVnZXI+IGxpbmVzID0gbV9tZXRob2RPdXRwdXRNYXAuZ2V0KHRyLmhhc2hDb2RlKCkpOworICAgIGlmIChsaW5lcyAhPSBudWxsKSB7CisgICAgICBmb3IgKEludGVnZXIgbiA6IGxpbmVzKSB7CisgICAgICAgIHJlc3VsdC5hZGQoZ2V0T3V0cHV0KCkuZ2V0KG4pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvUmVwb3J0ZXJDb25maWcuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9SZXBvcnRlckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlN2YzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvUmVwb3J0ZXJDb25maWcuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuUHJvcGVydHlVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogU3RvcmVzIHRoZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBwbHVnZ2FibGUgcmVwb3J0IGxpc3RlbmVyLiBVc2VkIGFsc28KKyAqIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlICZsdDtyZXBvcnRlciZndDsgc3ViLWVsZW1lbnQgb2YgdGhlIEFudCB0YXNrCisgKgorICogTk9URTogdGhpcyBjbGFzcyBuZWVkcyB0byBiZSBwdWJsaWMuIEl0J3MgdXNlZCBieSBUZXN0TkcgQW50IHRhc2sKKyAqCisgKiBAYXV0aG9yIENvc21pbiBNYXJnaW5lYW4sIEFwciAxMiwgMjAwNworICovCitwdWJsaWMgY2xhc3MgUmVwb3J0ZXJDb25maWcgeworCisgIC8qKgorICAgKiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgcmVwb3J0ZXIgbGlzdGVuZXIKKyAgICovCisgIHByaXZhdGUgU3RyaW5nIG1fY2xhc3NOYW1lOworCisgIC8qKgorICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgcmVwb3J0ZXIgbGlzdGVuZXIKKyAgICovCisgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eT4gbV9wcm9wZXJ0aWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBtX3Byb3BlcnRpZXMuYWRkKHByb3BlcnR5KTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworICAgIHJldHVybiBtX3Byb3BlcnRpZXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICByZXR1cm4gbV9jbGFzc05hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgIHRoaXMubV9jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHsKKyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgc2IuYXBwZW5kKG1fY2xhc3NOYW1lKTsKKyAgICBpZiAoIW1fcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKyAgICAgIHNiLmFwcGVuZCgiOiIpOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcHJvcGVydGllcy5zaXplKCk7IGkrKykgeworICAgICAgICBSZXBvcnRlckNvbmZpZy5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IG1fcHJvcGVydGllcy5nZXQoaSk7CisgICAgICAgIHNiLmFwcGVuZChwcm9wZXJ0eS5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHByb3BlcnR5LmdldFZhbHVlKCkpOworICAgICAgICBpZiAoaSA8IG1fcHJvcGVydGllcy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlcG9ydGVyQ29uZmlnIGRlc2VyaWFsaXplKFN0cmluZyBpbnB1dFN0cmluZykgeworICAgIFJlcG9ydGVyQ29uZmlnIHJlcG9ydGVyQ29uZmlnID0gbnVsbDsKKyAgICBpZiAoIVV0aWxzLmlzU3RyaW5nRW1wdHkoaW5wdXRTdHJpbmcpKSB7CisgICAgICByZXBvcnRlckNvbmZpZyA9IG5ldyBSZXBvcnRlckNvbmZpZygpOworICAgICAgaW50IGNsc05hbWVFbmRJbmRleCA9IGlucHV0U3RyaW5nLmluZGV4T2YoIjoiKTsKKyAgICAgIGlmIChjbHNOYW1lRW5kSW5kZXggPT0gLTEpIHsKKyAgICAgICAgcmVwb3J0ZXJDb25maWcuc2V0Q2xhc3NOYW1lKGlucHV0U3RyaW5nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcG9ydGVyQ29uZmlnLnNldENsYXNzTmFtZShpbnB1dFN0cmluZy5zdWJzdHJpbmcoMCwgY2xzTmFtZUVuZEluZGV4KSk7CisgICAgICAgIFN0cmluZyBwcm9wU3RyaW5nID0gaW5wdXRTdHJpbmcuc3Vic3RyaW5nKGNsc05hbWVFbmRJbmRleCArIDEsIGlucHV0U3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nW10gcHJvcHMgPSBwcm9wU3RyaW5nLnNwbGl0KCIsIik7CisgICAgICAgIGlmICgocHJvcHMgIT0gbnVsbCkgJiYgKHByb3BzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgZm9yIChTdHJpbmcgcHJvcCA6IHByb3BzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwcm9wTmFtZUFuZFZhbCA9IHByb3Auc3BsaXQoIj0iKTsKKyAgICAgICAgICAgIGlmICgocHJvcE5hbWVBbmRWYWwgIT0gbnVsbCkgJiYgKHByb3BOYW1lQW5kVmFsLmxlbmd0aCA9PSAyKSkgeworICAgICAgICAgICAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eSgpOworICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXROYW1lKHByb3BOYW1lQW5kVmFsWzBdKTsKKyAgICAgICAgICAgICAgcHJvcGVydHkuc2V0VmFsdWUocHJvcE5hbWVBbmRWYWxbMV0pOworICAgICAgICAgICAgICByZXBvcnRlckNvbmZpZy5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIHJlcG9ydGVyQ29uZmlnOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSByZXBvcnRlciBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAqLworICBwdWJsaWMgT2JqZWN0IG5ld1JlcG9ydGVySW5zdGFuY2UoKSB7CisgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgQ2xhc3MgcmVwb3J0ZXJDbGFzcyA9IENsYXNzSGVscGVyLmZvck5hbWUobV9jbGFzc05hbWUpOworICAgIGlmIChyZXBvcnRlckNsYXNzICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdCA9IENsYXNzSGVscGVyLm5ld0luc3RhbmNlKHJlcG9ydGVyQ2xhc3MpOworICAgICAgZm9yIChSZXBvcnRlckNvbmZpZy5Qcm9wZXJ0eSBwcm9wZXJ0eSA6IG1fcHJvcGVydGllcykgeworICAgICAgICBQcm9wZXJ0eVV0aWxzLnNldFByb3BlcnR5KHJlc3VsdCwgcHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcGVydHkgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBidWYuYXBwZW5kKCJcbkNsYXNzID0gIiArIG1fY2xhc3NOYW1lKTsKKyAgICBmb3IgKFByb3BlcnR5IHByb3AgOiBtX3Byb3BlcnRpZXMpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIlxuXHQgIiArIHByb3AuZ2V0TmFtZSgpICsgIj0iICsgcHJvcC5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU2tpcEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1NraXBFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNWVjNWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1NraXBFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDcyIEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKKy8qKgorICogVGhlIHJvb3QgZXhjZXB0aW9uIGZvciBzcGVjaWFsIHNraXAgaGFuZGxpbmcuIEluIGNhc2UgYSBAVGVzdCBvciBAQ29uZmlndXJhdGlvbgorICogdGhyb3dzIHRoaXMgZXhjZXB0aW9uIHRoZSBtZXRob2Qgd2lsbCBiZSBjb25zaWRlcmVkIGEgc2tpcCBvciBhIGZhaWx1cmUgYWNjb3JkaW5nIHRvIHRoZQorICogcmV0dXJuIG9mIHtAbGluayAjaXNTa2lwKCl9LgorICogVXNlcnMgbWF5IHByb3ZpZGUgZXh0ZW5zaW9ucyB0byB0aGlzIG1lY2hhbmlzbSBieSBleHRlbmRpbmcgdGhpcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVbZG90XW1pbmRzdG9ybVthdF1nbWFpbFtkb3RdY29tJz5BbGV4IFBvcGVzY3U8L2E+CisgKiBAc2luY2UgNS42CisgKi8KK3B1YmxpYyBjbGFzcyBTa2lwRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQwNTIxNDI2NTc4ODU1MjcyNjBMOworICBwcml2YXRlIFN0YWNrVHJhY2VFbGVtZW50W10gbV9zdGFja1RyYWNlOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbV9zdGFja1JlZHVjZWQ7CisKKyAgcHVibGljIFNraXBFeGNlcHRpb24oU3RyaW5nIHNraXBNZXNzYWdlKSB7CisgICAgc3VwZXIoc2tpcE1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIFNraXBFeGNlcHRpb24oU3RyaW5nIHNraXBNZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihza2lwTWVzc2FnZSwgY2F1c2UpOworICB9CisKKyAgLyoqCisgICAqIEZsYWcgaWYgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIG1hcmtzIGEgc2tpcHBlZCBtZXRob2QgKDx0dD50cnVlPC90dD4pCisgICAqIG9yIGEgZmFpbHVyZSAoPHR0PmZhbHNlPC90dD4pLiBCeSBkZWZhdWx0IFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCisgICAqIGluIG9yZGVyIHRvIHByb3ZpZGUgc21hcnRlciBiZWhhdmlvci4KKyAgICoKKyAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBza2lwLAorICAgKiAgICA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgbWV0aG9kIHNob3VsZCBiZSBjb25zaWRlcmVkIGZhaWxlZC4gSWYgbm90CisgICAqICAgIG92ZXJ3cml0dGVuIGl0IHJldHVybnMgPHR0PnRydWU8L3R0PgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTa2lwKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIG1ldGhvZCB0byByZWR1Y2UgdGhlIHByaW50ZWQgc3RhY2sgdHJhY2UuCisgICAqIFRoaXMgbWV0aG9kIGtlZXBzIG9ubHkgdGhlIGxhc3QgZnJhbWUuCisgICAqIDxiPkltcG9ydGFudDwvYj46IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgdGhlIHByZXNlcnZlZCBpbnRlcm5hbGx5CisgICAqIGFuZCBjYW4gYmUgcmVzdG9yZWQgY2FsbGVkIHtAbGluayAjcmVzdG9yZVN0YWNrVHJhY2V9LgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgcmVkdWNlU3RhY2tUcmFjZSgpIHsKKyAgICBpZighbV9zdGFja1JlZHVjZWQpIHsKKyAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gbmV3U3RhY2s9IG5ldyBTdGFja1RyYWNlRWxlbWVudFsxXTsKKyAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBvcmlnaW5hbFN0YWNrPSBnZXRTdGFja1RyYWNlKCk7CisgICAgICAgIGlmKG9yaWdpbmFsU3RhY2subGVuZ3RoID4gMCkgeworICAgICAgICAgIG1fc3RhY2tUcmFjZT0gb3JpZ2luYWxTdGFjazsKKyAgICAgICAgICBuZXdTdGFja1swXT0gZ2V0U3RhY2tUcmFjZSgpWzBdOworICAgICAgICAgIHNldFN0YWNrVHJhY2UobmV3U3RhY2spOworICAgICAgICB9CisgICAgICAgIG1fc3RhY2tSZWR1Y2VkPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIGFmdGVyIGEKKyAgICogcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3JlZHVjZVN0YWNrVHJhY2UoKX0uCisgICAqCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCByZXN0b3JlU3RhY2tUcmFjZSgpIHsKKyAgICBpZihtX3N0YWNrUmVkdWNlZCAmJiBudWxsICE9IG1fc3RhY2tUcmFjZSkgeworICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgc2V0U3RhY2tUcmFjZShtX3N0YWNrVHJhY2UpOworICAgICAgICBtX3N0YWNrUmVkdWNlZD0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSZXN1bHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9TdWl0ZVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRhNTNjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSZXN1bHQuamF2YQpAQCAtMCwwICsxLDc1IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk9iamVjdHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBsb2dzIHRoZSByZXN1bHQgb2YgYW4gZW50aXJlIFRlc3QgU3VpdGUgKGRlZmluZWQgYnkgYQorICogcHJvcGVydHkgZmlsZSkuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1heSAxMCwgMjAwNAorICoKKyAqLworY2xhc3MgU3VpdGVSZXN1bHQgaW1wbGVtZW50cyBJU3VpdGVSZXN1bHQsIENvbXBhcmFibGUgeworCS8qIGdlbmVyYXRlZCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY3Nzg1MTM4Njk4NTg4NjA3NTZMOworICAvL0ZJWE1FOiBJcyBtX3Byb3BlcnR5RmlsZU5hbWUgbmVlZGVkPworCXByaXZhdGUgU3RyaW5nIG1fcHJvcGVydHlGaWxlTmFtZSA9ICBudWxsOworICBwcml2YXRlIFhtbFN1aXRlIG1fc3VpdGUgPSBudWxsOworICBwcml2YXRlIElUZXN0Q29udGV4dCBtX3Rlc3RDb250ZXh0ID0gbnVsbDsKKworICBwcm90ZWN0ZWQgU3VpdGVSZXN1bHQoWG1sU3VpdGUgc3VpdGUsIElUZXN0Q29udGV4dCB0cikgeworICAgIG1fc3VpdGUgPSBzdWl0ZTsKKyAgICBtX3Rlc3RDb250ZXh0ID0gdHI7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXJ0eUZpbGVOYW1lLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlGaWxlTmFtZSgpIHsKKyAgICByZXR1cm4gbV9wcm9wZXJ0eUZpbGVOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2luZ2xlVGVzdFJ1bm5lci4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3RDb250ZXh0IGdldFRlc3RDb250ZXh0KCkgeworICAgIHJldHVybiBtX3Rlc3RDb250ZXh0OworICB9CisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1aXRlLgorICAgKi8KKyAgcHVibGljIFhtbFN1aXRlIGdldFN1aXRlKCkgeworICAgIHJldHVybiBtX3N1aXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgdHJ5IHsKKyAgICAgIFN1aXRlUmVzdWx0IG90aGVyID0gKFN1aXRlUmVzdWx0KSBvOworICAgICAgU3RyaW5nIG4xID0gZ2V0VGVzdENvbnRleHQoKS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgbjIgPSBvdGhlci5nZXRUZXN0Q29udGV4dCgpLmdldE5hbWUoKTsKKyAgICAgIHJlc3VsdCA9IG4xLmNvbXBhcmVUbyhuMik7CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB0ZXN0IGNvbnRleHQgbmFtZS4KKyAgICoge0Bpbmhlcml0RG9jfQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIoZ2V0Q2xhc3MoKSkKKyAgICAgICAgLmFkZCgiY29udGV4dCIsIGdldFRlc3RDb250ZXh0KCkuZ2V0TmFtZSgpKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSdW5TdGF0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1N1aXRlUnVuU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGFmMjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1N1aXRlUnVuU3RhdGUuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KKw0KKw0KKy8qKg0KKyAqIEEgc3RhdGUgb2JqZWN0IHRoYXQgcmVjb3JkcyB0aGUgc3RhdHVzIG9mIHRoZSBzdWl0ZSBydW4uIE1haW5seSB1c2VkIHRvDQorICogZmlndXJlIG91dCBpZiB0aGVyZSBhcmUgYW55IEBCZWZvcmVTdWl0ZSBmYWlsdXJlcy4NCisgKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1bYXRdZXZvbHZhW2RvdF1ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIFN1aXRlUnVuU3RhdGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgew0KKyAgLyoqDQorICAgKg0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjcxNjkzNDkwNTA0OTEyMzg3NEw7DQorICBwcml2YXRlIGJvb2xlYW4gbV9oYXNGYWlsdXJlczsNCisNCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmYWlsZWQoKSB7DQorICAgIG1faGFzRmFpbHVyZXM9IHRydWU7DQorICB9DQorDQorICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGYWlsZWQoKSB7DQorICAgIHJldHVybiBtX2hhc0ZhaWx1cmVzOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSdW5uZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9TdWl0ZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjEzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSdW5uZXIuamF2YQpAQCAtMCwwICsxLDY4MiBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHMuaXNTdHJpbmdCbGFuazsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQXR0cmlidXRlczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSUludm9rZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkLlRocmVhZFV0aWw7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuSlVuaXRYTUxSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5UZXN0SFRNTFJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlRleHRSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworLyoqCisgKiA8Q09ERT5TdWl0ZVJ1bm5lcjwvQ09ERT4gaXMgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cyBpbmNsdWRlZCBpbiBvbmUKKyAqIHN1aXRlLiBUaGUgdGVzdCBzdGFydCBpcyB0cmlnZ2VyZWQgYnkge0BsaW5rICNydW4oKX0gbWV0aG9kLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBcHIgMjYsIDIwMDQKKyAqLworcHVibGljIGNsYXNzIFN1aXRlUnVubmVyIGltcGxlbWVudHMgSVN1aXRlLCBTZXJpYWxpemFibGUsIElJbnZva2VkTWV0aG9kTGlzdGVuZXIgeworCisgIC8qIGdlbmVyYXRlZCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Mjg0MjA4OTMyMDg5NTAzMTMxTDsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRQVVRfRElSID0gInRlc3Qtb3V0cHV0IjsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gbV9zdWl0ZVJlc3VsdHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoTWFwcy48U3RyaW5nLCBJU3VpdGVSZXN1bHQ+bmV3TGlua2VkSGFzaE1hcCgpKTsKKyAgdHJhbnNpZW50IHByaXZhdGUgTGlzdDxUZXN0UnVubmVyPiBtX3Rlc3RSdW5uZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHRyYW5zaWVudCBwcml2YXRlIE1hcDxDbGFzczw/IGV4dGVuZHMgSVN1aXRlTGlzdGVuZXI+LCBJU3VpdGVMaXN0ZW5lcj4gbV9saXN0ZW5lcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgdHJhbnNpZW50IHByaXZhdGUgVGVzdExpc3RlbmVyQWRhcHRlciBtX3RleHRSZXBvcnRlciA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbV9vdXRwdXREaXI7IC8vIERFRkFVTFRfT1VUUFVUX0RJUjsKKyAgcHJpdmF0ZSBYbWxTdWl0ZSBtX3N1aXRlOworICBwcml2YXRlIEluamVjdG9yIG1fcGFyZW50SW5qZWN0b3I7CisKKyAgdHJhbnNpZW50IHByaXZhdGUgTGlzdDxJVGVzdExpc3RlbmVyPiBtX3Rlc3RMaXN0ZW5lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgdHJhbnNpZW50IHByaXZhdGUgTGlzdDxJQ2xhc3NMaXN0ZW5lcj4gbV9jbGFzc0xpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB0cmFuc2llbnQgcHJpdmF0ZSBJVGVzdFJ1bm5lckZhY3RvcnkgbV90bXBSdW5uZXJGYWN0b3J5OworCisgIHRyYW5zaWVudCBwcml2YXRlIElUZXN0UnVubmVyRmFjdG9yeSBtX3J1bm5lckZhY3Rvcnk7CisgIHRyYW5zaWVudCBwcml2YXRlIGJvb2xlYW4gbV91c2VEZWZhdWx0TGlzdGVuZXJzID0gdHJ1ZTsKKworICAvLyBUaGUgcmVtb3RlIGhvc3Qgd2hlcmUgdGhpcyBzdWl0ZSB3YXMgcnVuLCBvciBudWxsIGlmIHJ1biBsb2NhbGx5CisgIHByaXZhdGUgU3RyaW5nIG1faG9zdDsKKworICAvLyBUaGUgY29uZmlndXJhdGlvbgorICB0cmFuc2llbnQgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbiBtX2NvbmZpZ3VyYXRpb247CisKKyAgdHJhbnNpZW50IHByaXZhdGUgSVRlc3RPYmplY3RGYWN0b3J5IG1fb2JqZWN0RmFjdG9yeTsKKyAgdHJhbnNpZW50IHByaXZhdGUgQm9vbGVhbiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzID0gQm9vbGVhbi5GQUxTRTsKKworICB0cmFuc2llbnQgcHJpdmF0ZSBMaXN0PElNZXRob2RJbnRlcmNlcHRvcj4gbV9tZXRob2RJbnRlcmNlcHRvcnM7CisgIHByaXZhdGUgTWFwPENsYXNzPD8gZXh0ZW5kcyBJSW52b2tlZE1ldGhvZExpc3RlbmVyPiwgSUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzOworCisgIC8qKiBUaGUgbGlzdCBvZiBhbGwgdGhlIG1ldGhvZHMgaW52b2tlZCBkdXJpbmcgdGhpcyBydW4gKi8KKyAgcHJpdmF0ZSBMaXN0PElJbnZva2VkTWV0aG9kPiBtX2ludm9rZWRNZXRob2RzID0KKyAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElJbnZva2VkTWV0aG9kPm5ld0FycmF5TGlzdCgpKTsKKworICBwcml2YXRlIExpc3Q8SVRlc3ROR01ldGhvZD4gbV9hbGxUZXN0TWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisvLyAgdHJhbnNpZW50IHByaXZhdGUgSUFubm90YXRpb25UcmFuc2Zvcm1lciBtX2Fubm90YXRpb25UcmFuc2Zvcm1lciA9IG51bGw7CisKKyAgcHVibGljIFN1aXRlUnVubmVyKElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFhtbFN1aXRlIHN1aXRlLAorICAgICAgU3RyaW5nIG91dHB1dERpcikKKyAgeworICAgIHRoaXMoY29uZmlndXJhdGlvbiwgc3VpdGUsIG91dHB1dERpciwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgU3VpdGVSdW5uZXIoSUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgWG1sU3VpdGUgc3VpdGUsIFN0cmluZyBvdXRwdXREaXIsCisgICAgICBJVGVzdFJ1bm5lckZhY3RvcnkgcnVubmVyRmFjdG9yeSkKKyAgeworICAgIHRoaXMoY29uZmlndXJhdGlvbiwgc3VpdGUsIG91dHB1dERpciwgcnVubmVyRmFjdG9yeSwgZmFsc2UpOworICB9CisKKyAgcHVibGljIFN1aXRlUnVubmVyKElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICBYbWxTdWl0ZSBzdWl0ZSwKKyAgICAgIFN0cmluZyBvdXRwdXREaXIsCisgICAgICBJVGVzdFJ1bm5lckZhY3RvcnkgcnVubmVyRmFjdG9yeSwKKyAgICAgIGJvb2xlYW4gdXNlRGVmYXVsdExpc3RlbmVycykKKyAgeworICAgIHRoaXMoY29uZmlndXJhdGlvbiwgc3VpdGUsIG91dHB1dERpciwgcnVubmVyRmFjdG9yeSwgdXNlRGVmYXVsdExpc3RlbmVycywKKyAgICAgICAgbmV3IEFycmF5TGlzdDxJTWV0aG9kSW50ZXJjZXB0b3I+KCkgLyogbWV0aG9kIGludGVyY2VwdG9yICovLAorICAgICAgICBudWxsIC8qIGludm9rZWQgbWV0aG9kIGxpc3RlbmVycyAqLywKKyAgICAgICAgbnVsbCAvKiB0ZXN0IGxpc3RlbmVycyAqLywKKyAgICAgICAgbnVsbCAvKiBjbGFzcyBsaXN0ZW5lcnMgKi8pOworICB9CisKKyAgcHJvdGVjdGVkIFN1aXRlUnVubmVyKElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICBYbWxTdWl0ZSBzdWl0ZSwKKyAgICAgIFN0cmluZyBvdXRwdXREaXIsCisgICAgICBJVGVzdFJ1bm5lckZhY3RvcnkgcnVubmVyRmFjdG9yeSwKKyAgICAgIGJvb2xlYW4gdXNlRGVmYXVsdExpc3RlbmVycywKKyAgICAgIExpc3Q8SU1ldGhvZEludGVyY2VwdG9yPiBtZXRob2RJbnRlcmNlcHRvcnMsCisgICAgICBMaXN0PElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IGludm9rZWRNZXRob2RMaXN0ZW5lcnMsCisgICAgICBMaXN0PElUZXN0TGlzdGVuZXI+IHRlc3RMaXN0ZW5lcnMsCisgICAgICBMaXN0PElDbGFzc0xpc3RlbmVyPiBjbGFzc0xpc3RlbmVycykKKyAgeworICAgIGluaXQoY29uZmlndXJhdGlvbiwgc3VpdGUsIG91dHB1dERpciwgcnVubmVyRmFjdG9yeSwgdXNlRGVmYXVsdExpc3RlbmVycywgbWV0aG9kSW50ZXJjZXB0b3JzLCBpbnZva2VkTWV0aG9kTGlzdGVuZXJzLCB0ZXN0TGlzdGVuZXJzLCBjbGFzc0xpc3RlbmVycyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgIFhtbFN1aXRlIHN1aXRlLAorICAgIFN0cmluZyBvdXRwdXREaXIsCisgICAgSVRlc3RSdW5uZXJGYWN0b3J5IHJ1bm5lckZhY3RvcnksCisgICAgYm9vbGVhbiB1c2VEZWZhdWx0TGlzdGVuZXJzLAorICAgIExpc3Q8SU1ldGhvZEludGVyY2VwdG9yPiBtZXRob2RJbnRlcmNlcHRvcnMsCisgICAgTGlzdDxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBpbnZva2VkTWV0aG9kTGlzdGVuZXIsCisgICAgTGlzdDxJVGVzdExpc3RlbmVyPiB0ZXN0TGlzdGVuZXJzLAorICAgIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKQorICB7CisgICAgbV9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICBtX3N1aXRlID0gc3VpdGU7CisgICAgbV91c2VEZWZhdWx0TGlzdGVuZXJzID0gdXNlRGVmYXVsdExpc3RlbmVyczsKKyAgICBtX3RtcFJ1bm5lckZhY3Rvcnk9IHJ1bm5lckZhY3Rvcnk7CisgICAgbV9tZXRob2RJbnRlcmNlcHRvcnMgPSBtZXRob2RJbnRlcmNlcHRvcnMgIT0gbnVsbCA/IG1ldGhvZEludGVyY2VwdG9ycyA6IG5ldyBBcnJheUxpc3Q8SU1ldGhvZEludGVyY2VwdG9yPigpOworICAgIHNldE91dHB1dERpcihvdXRwdXREaXIpOworICAgIG1fb2JqZWN0RmFjdG9yeSA9IG1fY29uZmlndXJhdGlvbi5nZXRPYmplY3RGYWN0b3J5KCk7CisgICAgaWYobV9vYmplY3RGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIG1fb2JqZWN0RmFjdG9yeSA9IHN1aXRlLmdldE9iamVjdEZhY3RvcnkoKTsKKyAgICB9CisgICAgLy8gQWRkIG91ciBvd24gSUludm9rZWRNZXRob2RMaXN0ZW5lcgorICAgIG1faW52b2tlZE1ldGhvZExpc3RlbmVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGlmIChpbnZva2VkTWV0aG9kTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgZm9yIChJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyIDogaW52b2tlZE1ldGhvZExpc3RlbmVyKSB7CisgICAgICAgIG1faW52b2tlZE1ldGhvZExpc3RlbmVycy5wdXQobGlzdGVuZXIuZ2V0Q2xhc3MoKSwgbGlzdGVuZXIpOworICAgICAgfQorICAgIH0KKyAgICBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMucHV0KGdldENsYXNzKCksIHRoaXMpOworCisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IHN1aXRlLnNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKCk7CisgICAgaWYgKG51bGwgIT0gdGVzdExpc3RlbmVycykgeworICAgICAgbV90ZXN0TGlzdGVuZXJzLmFkZEFsbCh0ZXN0TGlzdGVuZXJzKTsKKyAgICB9CisgICAgaWYgKG51bGwgIT0gY2xhc3NMaXN0ZW5lcnMpIHsKKyAgICAgIG1fY2xhc3NMaXN0ZW5lcnMuYWRkQWxsKGNsYXNzTGlzdGVuZXJzKTsKKyAgICB9CisgICAgbV9ydW5uZXJGYWN0b3J5ID0gYnVpbGRSdW5uZXJGYWN0b3J5KCk7CisKKyAgICAvLyBPcmRlciB0aGUgPHRlc3Q+IHRhZ3MgYmFzZWQgb24gdGhlaXIgb3JkZXIgb2YgYXBwZWFyYW5jZSBpbiB0ZXN0bmcueG1sCisgICAgTGlzdDxYbWxUZXN0PiB4bWxUZXN0cyA9IG1fc3VpdGUuZ2V0VGVzdHMoKTsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KHhtbFRlc3RzLCBuZXcgQ29tcGFyYXRvcjxYbWxUZXN0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKFhtbFRlc3QgYXJnMCwgWG1sVGVzdCBhcmcxKSB7CisgICAgICAgIHJldHVybiBhcmcwLmdldEluZGV4KCkgLSBhcmcxLmdldEluZGV4KCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBmb3IgKFhtbFRlc3QgdGVzdCA6IHhtbFRlc3RzKSB7CisgICAgICBUZXN0UnVubmVyIHRyID0gbV9ydW5uZXJGYWN0b3J5Lm5ld1Rlc3RSdW5uZXIodGhpcywgdGVzdCwgbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzLnZhbHVlcygpLCBtX2NsYXNzTGlzdGVuZXJzKTsKKworICAgICAgLy8KKyAgICAgIC8vIEluc3RhbGwgdGhlIG1ldGhvZCBpbnRlcmNlcHRvciwgaWYgYW55IHdhcyBwYXNzZWQKKyAgICAgIC8vCisgICAgICBmb3IgKElNZXRob2RJbnRlcmNlcHRvciBtZXRob2RJbnRlcmNlcHRvciA6IG1fbWV0aG9kSW50ZXJjZXB0b3JzKSB7CisgICAgICAgIHRyLmFkZE1ldGhvZEludGVyY2VwdG9yKG1ldGhvZEludGVyY2VwdG9yKTsKKyAgICAgIH0KKworICAgICAgLy8gUmV1c2UgdGhlIHNhbWUgdGV4dCByZXBvcnRlciBzbyB3ZSBjYW4gYWNjdW11bGF0ZSBhbGwgdGhlIHJlc3VsdHMKKyAgICAgIC8vICh0aGlzIGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgZmluYWwgc3VpdGUgcmVwb3J0IGF0IHRoZSBlbmQpCisgICAgICB0ci5hZGRMaXN0ZW5lcihtX3RleHRSZXBvcnRlcik7CisgICAgICBtX3Rlc3RSdW5uZXJzLmFkZCh0cik7CisKKyAgICAgIC8vIEFkZCB0aGUgbWV0aG9kcyBmb3VuZCBpbiB0aGlzIHRlc3QgdG8gb3VyIGdsb2JhbCBjb3VudAorICAgICAgbV9hbGxUZXN0TWV0aG9kcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0ci5nZXRBbGxUZXN0TWV0aG9kcygpKSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBYbWxTdWl0ZSBnZXRYbWxTdWl0ZSgpIHsKKyAgICByZXR1cm4gbV9zdWl0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG1fc3VpdGUuZ2V0TmFtZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T2JqZWN0RmFjdG9yeShJVGVzdE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSkgeworICAgIG1fb2JqZWN0RmFjdG9yeSA9IG9iamVjdEZhY3Rvcnk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRSZXN1bHRzKGJvb2xlYW4gcmVwb3J0UmVzdWx0cykgeworICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycyA9IHJlcG9ydFJlc3VsdHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW52b2tlTGlzdGVuZXJzKGJvb2xlYW4gc3RhcnQpIHsKKyAgICBmb3IgKElTdWl0ZUxpc3RlbmVyIHNsIDogbV9saXN0ZW5lcnMudmFsdWVzKCkpIHsKKyAgICAgIGlmIChzdGFydCkgeworICAgICAgICBzbC5vblN0YXJ0KHRoaXMpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHNsLm9uRmluaXNoKHRoaXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRPdXRwdXREaXIoU3RyaW5nIG91dHB1dGRpcikgeworICAgIGlmIChpc1N0cmluZ0JsYW5rKG91dHB1dGRpcikgJiYgbV91c2VEZWZhdWx0TGlzdGVuZXJzKSB7CisgICAgICBvdXRwdXRkaXIgPSBERUZBVUxUX09VVFBVVF9ESVI7CisgICAgfQorCisgICAgbV9vdXRwdXREaXIgPSAobnVsbCAhPSBvdXRwdXRkaXIpID8gbmV3IEZpbGUob3V0cHV0ZGlyKS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICA6IG51bGw7CisgIH0KKworICBwcml2YXRlIElUZXN0UnVubmVyRmFjdG9yeSBidWlsZFJ1bm5lckZhY3RvcnkoKSB7CisgICAgSVRlc3RSdW5uZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCisgICAgaWYgKG51bGwgPT0gbV90bXBSdW5uZXJGYWN0b3J5KSB7CisgICAgICBmYWN0b3J5ID0gbmV3IERlZmF1bHRUZXN0UnVubmVyRmFjdG9yeShtX2NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgbV90ZXN0TGlzdGVuZXJzLnRvQXJyYXkobmV3IElUZXN0TGlzdGVuZXJbbV90ZXN0TGlzdGVuZXJzLnNpemUoKV0pLAorICAgICAgICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycywgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZmFjdG9yeSA9IG5ldyBQcm94eVRlc3RSdW5uZXJGYWN0b3J5KAorICAgICAgICAgIG1fdGVzdExpc3RlbmVycy50b0FycmF5KG5ldyBJVGVzdExpc3RlbmVyW21fdGVzdExpc3RlbmVycy5zaXplKCldKSwKKyAgICAgICAgICBtX3RtcFJ1bm5lckZhY3RvcnkpOworICAgIH0KKworICAgIHJldHVybiBmYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYWxsZWwoKSB7CisgICAgcmV0dXJuIG1fc3VpdGUuZ2V0UGFyYWxsZWwoKS50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRNb2R1bGUoKSB7CisgICAgcmV0dXJuIG1fc3VpdGUuZ2V0UGFyZW50TW9kdWxlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRHdWljZVN0YWdlKCkgeworICAgIHJldHVybiBtX3N1aXRlLmdldEd1aWNlU3RhZ2UoKTsKKyAgfQorCisgIHB1YmxpYyBJbmplY3RvciBnZXRQYXJlbnRJbmplY3RvcigpIHsKKyAgICByZXR1cm4gbV9wYXJlbnRJbmplY3RvcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmVudEluamVjdG9yKEluamVjdG9yIGluamVjdG9yKSB7CisgICAgbV9wYXJlbnRJbmplY3RvciA9IGluamVjdG9yOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBpbnZva2VMaXN0ZW5lcnModHJ1ZSAvKiBzdGFydCAqLyk7CisgICAgdHJ5IHsKKyAgICAgIHByaXZhdGVSdW4oKTsKKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICBpbnZva2VMaXN0ZW5lcnMoZmFsc2UgLyogc3RvcCAqLyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByaXZhdGVSdW4oKSB7CisKKyAgICAvLyBNYXAgZm9yIHVuaWNpdHksIExpbmtlZCBmb3IgZ3VhcmFudGVlZCBvcmRlcgorICAgIE1hcDxNZXRob2QsIElUZXN0TkdNZXRob2Q+IGJlZm9yZVN1aXRlTWV0aG9kcz0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworICAgIE1hcDxNZXRob2QsIElUZXN0TkdNZXRob2Q+IGFmdGVyU3VpdGVNZXRob2RzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCisgICAgSUludm9rZXIgaW52b2tlciA9IG51bGw7CisKKyAgICAvLyBHZXQgdGhlIGludm9rZXIgYW5kIGZpbmQgYWxsIHRoZSBzdWl0ZSBsZXZlbCBtZXRob2RzCisgICAgZm9yIChUZXN0UnVubmVyIHRyOiBtX3Rlc3RSdW5uZXJzKSB7CisgICAgICAvLyBUT0RPOiBDb2RlIHNtZWxsLiAgSW52b2tlciBzaG91bGQgYmVsb25nIHRvIFN1aXRlUnVubmVyLCBub3QgVGVzdFJ1bm5lcgorICAgICAgLy8gLS0gY2JldXN0CisgICAgICBpbnZva2VyID0gdHIuZ2V0SW52b2tlcigpOworCisgICAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IHRyLmdldEJlZm9yZVN1aXRlTWV0aG9kcygpKSB7CisgICAgICAgIGJlZm9yZVN1aXRlTWV0aG9kcy5wdXQobS5nZXRNZXRob2QoKSwgbSk7CisgICAgICB9CisKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogdHIuZ2V0QWZ0ZXJTdWl0ZU1ldGhvZHMoKSkgeworICAgICAgICBhZnRlclN1aXRlTWV0aG9kcy5wdXQobS5nZXRNZXRob2QoKSwgbSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJbnZva2UgYmVmb3JlU3VpdGUgbWV0aG9kcyAodGhlIGludm9rZXIgY2FuIGJlIG51bGwKKyAgICAvLyBpZiB0aGUgc3VpdGUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nIG9ubHkgY29udGFpbnMKKyAgICAvLyBhIDxmaWxlLXN1aXRlPiB0YWcgYW5kIG5vIHJlYWwgdGVzdHMpCisgICAgLy8KKyAgICBpZiAoaW52b2tlciAhPSBudWxsKSB7CisgICAgICBpZihiZWZvcmVTdWl0ZU1ldGhvZHMudmFsdWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICBpbnZva2VyLmludm9rZUNvbmZpZ3VyYXRpb25zKG51bGwsCisgICAgICAgICAgICBiZWZvcmVTdWl0ZU1ldGhvZHMudmFsdWVzKCkudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFtiZWZvcmVTdWl0ZU1ldGhvZHMuc2l6ZSgpXSksCisgICAgICAgICAgICBtX3N1aXRlLCBtX3N1aXRlLmdldFBhcmFtZXRlcnMoKSwgbnVsbCwgLyogbm8gcGFyYW1ldGVyIHZhbHVlcyAqLworICAgICAgICAgICAgbnVsbCAvKiBpbnN0YW5jZSAqLworICAgICAgICApOworICAgICAgfQorCisgICAgICBVdGlscy5sb2coIlN1aXRlUnVubmVyIiwgMywgIkNyZWF0ZWQgIiArIG1fdGVzdFJ1bm5lcnMuc2l6ZSgpICsgIiBUZXN0UnVubmVycyIpOworCisgICAgICAvLworICAgICAgLy8gUnVuIGFsbCB0aGUgdGVzdCBydW5uZXJzCisgICAgICAvLworICAgICAgYm9vbGVhbiB0ZXN0c0luUGFyYWxsZWwgPSBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuVEVTVFMuZXF1YWxzKG1fc3VpdGUuZ2V0UGFyYWxsZWwoKSk7CisgICAgICBpZiAoIXRlc3RzSW5QYXJhbGxlbCkgeworICAgICAgICBydW5TZXF1ZW50aWFsbHkoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBydW5JblBhcmFsbGVsVGVzdE1vZGUoKTsKKyAgICAgIH0KKworLy8gICAgICBTdWl0ZVBsYW4gc3AgPSBuZXcgU3VpdGVQbGFuKCk7CisvLyAgICAgIGZvciAoVGVzdFJ1bm5lciB0ciA6IG1fdGVzdFJ1bm5lcnMpIHsKKy8vICAgICAgICBzcC5hZGRUZXN0UGxhbih0ci5nZXRUZXN0UGxhbigpKTsKKy8vICAgICAgfQorCisvLyAgICAgIHNwLmR1bXAoKTsKKworICAgICAgLy8KKyAgICAgIC8vIEludm9rZSBhZnRlclN1aXRlIG1ldGhvZHMKKyAgICAgIC8vCisgICAgICBpZiAoYWZ0ZXJTdWl0ZU1ldGhvZHMudmFsdWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICBpbnZva2VyLmludm9rZUNvbmZpZ3VyYXRpb25zKG51bGwsCisgICAgICAgICAgICAgIGFmdGVyU3VpdGVNZXRob2RzLnZhbHVlcygpLnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbYWZ0ZXJTdWl0ZU1ldGhvZHMuc2l6ZSgpXSksCisgICAgICAgICAgICAgIG1fc3VpdGUsIG1fc3VpdGUuZ2V0QWxsUGFyYW1ldGVycygpLCBudWxsLCAvKiBubyBwYXJhbWV0ZXIgdmFsdWVzICovCisKKyAgICAgICAgICAgICAgbnVsbCAvKiBpbnN0YW5jZSAqLyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBMaXN0PElSZXBvcnRlcj4gbV9yZXBvcnRlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBwcml2YXRlIHZvaWQgYWRkUmVwb3J0ZXIoSVJlcG9ydGVyIGxpc3RlbmVyKSB7CisgICAgbV9yZXBvcnRlcnMuYWRkKGxpc3RlbmVyKTsKKyAgfQorCisgIHZvaWQgYWRkQ29uZmlndXJhdGlvbkxpc3RlbmVyKElDb25maWd1cmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBtX2NvbmZpZ3VyYXRpb24uYWRkQ29uZmlndXJhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PElSZXBvcnRlcj4gZ2V0UmVwb3J0ZXJzKCkgeworICAgIHJldHVybiBtX3JlcG9ydGVyczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5TZXF1ZW50aWFsbHkoKSB7CisgICAgZm9yIChUZXN0UnVubmVyIHRyIDogbV90ZXN0UnVubmVycykgeworICAgICAgcnVuVGVzdCh0cik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoVGVzdFJ1bm5lciB0cikgeworICAgIHRyLnJ1bigpOworCisgICAgSVN1aXRlUmVzdWx0IHNyID0gbmV3IFN1aXRlUmVzdWx0KG1fc3VpdGUsIHRyKTsKKyAgICBtX3N1aXRlUmVzdWx0cy5wdXQodHIuZ2V0TmFtZSgpLCBzcik7CisgIH0KKworICAvKioKKyAgICogSW1wbGVtZW50IDxzdWl0ZSBwYXJhbGxlbD0idGVzdHMiPi4KKyAgICogU2luY2UgdGhpcyBraW5kIG9mIHBhcmFsbGVsaXNtIGhhcHBlbnMgYXQgdGhlIHN1aXRlIGxldmVsLCB3ZSBuZWVkIGEgc3BlY2lhbCBjb2RlIHBhdGgKKyAgICogdG8gZXhlY3V0ZSBpdC4gIEFsbCB0aGUgb3RoZXIgcGFyYWxsZWxpc20gc3RyYXRlZ2llcyBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIHRlc3QgbGV2ZWwKKyAgICogaW4gVGVzdFJ1bm5lciNjcmVhdGVQYXJhbGxlbFdvcmtlcnMgKGJ1dCBzaW5jZSB0aGlzIG1ldGhvZCBkZWFscyB3aXRoIGp1c3Qgb25lIDx0ZXN0PgorICAgKiB0YWcsIGl0IGNhbid0IGltcGxlbWVudCA8c3VpdGUgcGFyYWxsZWw9InRlc3RzIj4sIHdoaWNoIGlzIHdoeSB3ZSdyZSBkb2luZyBpdCBoZXJlKS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBydW5JblBhcmFsbGVsVGVzdE1vZGUoKSB7CisgICAgTGlzdDxSdW5uYWJsZT4gdGFza3M9IExpc3RzLm5ld0FycmF5TGlzdChtX3Rlc3RSdW5uZXJzLnNpemUoKSk7CisgICAgZm9yKFRlc3RSdW5uZXIgdHI6IG1fdGVzdFJ1bm5lcnMpIHsKKyAgICAgIHRhc2tzLmFkZChuZXcgU3VpdGVXb3JrZXIodHIpKTsKKyAgICB9CisKKyAgICBUaHJlYWRVdGlsLmV4ZWN1dGUodGFza3MsIG1fc3VpdGUuZ2V0VGhyZWFkQ291bnQoKSwKKyAgICAgICAgbV9zdWl0ZS5nZXRUaW1lT3V0KFhtbFRlc3QuREVGQVVMVF9USU1FT1VUX01TKSwgZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBTdWl0ZVdvcmtlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgIHByaXZhdGUgVGVzdFJ1bm5lciBtX3Rlc3RSdW5uZXI7CisKKyAgICAgIHB1YmxpYyBTdWl0ZVdvcmtlcihUZXN0UnVubmVyIHRyKSB7CisgICAgICAgIG1fdGVzdFJ1bm5lciA9IHRyOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgVXRpbHMubG9nKCJbU3VpdGVXb3JrZXJdIiwgNCwgIlJ1bm5pbmcgWE1MIFRlc3QgJyIKKyAgICAgICAgICAgICAgICAgICsgIG1fdGVzdFJ1bm5lci5nZXRUZXN0KCkuZ2V0TmFtZSgpICsgIicgaW4gUGFyYWxsZWwiKTsKKyAgICAgICAgcnVuVGVzdChtX3Rlc3RSdW5uZXIpOworICAgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlZ2lzdGVycyBJU3VpdGVMaXN0ZW5lcnMgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgY3VycmVudAorICAgKiBzdWl0ZS4KKyAgICoKKyAgICogQHBhcmFtIHJlcG9ydGVyCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcihJU3VpdGVMaXN0ZW5lciByZXBvcnRlcikgeworICAgIG1fbGlzdGVuZXJzLnB1dChyZXBvcnRlci5nZXRDbGFzcygpLCByZXBvcnRlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVRlc3ROR0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUludm9rZWRNZXRob2RMaXN0ZW5lcikgeworICAgICAgSUludm9rZWRNZXRob2RMaXN0ZW5lciBpbnZva2VkTWV0aG9kTGlzdGVuZXIgPSAoSUludm9rZWRNZXRob2RMaXN0ZW5lcikgbGlzdGVuZXI7CisgICAgICBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMucHV0KGludm9rZWRNZXRob2RMaXN0ZW5lci5nZXRDbGFzcygpLCBpbnZva2VkTWV0aG9kTGlzdGVuZXIpOworICAgIH0KKyAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJU3VpdGVMaXN0ZW5lcikgeworICAgICAgYWRkTGlzdGVuZXIoKElTdWl0ZUxpc3RlbmVyKSBsaXN0ZW5lcik7CisgICAgfQorICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElSZXBvcnRlcikgeworICAgICAgYWRkUmVwb3J0ZXIoKElSZXBvcnRlcikgbGlzdGVuZXIpOworICAgIH0KKyAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisgICAgICBhZGRDb25maWd1cmF0aW9uTGlzdGVuZXIoKElDb25maWd1cmF0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIG1fb3V0cHV0RGlyICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZ2V0TmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IGdldFJlc3VsdHMoKSB7CisgICAgcmV0dXJuIG1fc3VpdGVSZXN1bHRzOworICB9CisKKyAgLyoqCisgICAqIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZD8KKyAgICoKKyAgICogQHNlZSBvcmcudGVzdG5nLklTdWl0ZSNnZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgeworICAgIHJldHVybiBtX3N1aXRlLmdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVN1aXRlI2dldE1ldGhvZHNCeUdyb3VwcygpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4+IGdldE1ldGhvZHNCeUdyb3VwcygpIHsKKyAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+PiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgIGZvciAoVGVzdFJ1bm5lciB0ciA6IG1fdGVzdFJ1bm5lcnMpIHsKKyAgICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzID0gdHIuZ2V0QWxsVGVzdE1ldGhvZHMoKTsKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogbWV0aG9kcykgeworICAgICAgICBTdHJpbmdbXSBncm91cHMgPSBtLmdldEdyb3VwcygpOworICAgICAgICBmb3IgKFN0cmluZyBncm91cE5hbWUgOiBncm91cHMpIHsKKyAgICAgICAgICBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IHRlc3RNZXRob2RzID0gcmVzdWx0LmdldChncm91cE5hbWUpOworICAgICAgICAgIGlmIChudWxsID09IHRlc3RNZXRob2RzKSB7CisgICAgICAgICAgICB0ZXN0TWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgcmVzdWx0LnB1dChncm91cE5hbWUsIHRlc3RNZXRob2RzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGVzdE1ldGhvZHMuYWRkKG0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVN1aXRlI2dldEludm9rZWRNZXRob2RzKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPiBnZXRJbnZva2VkTWV0aG9kcygpIHsKKyAgICByZXR1cm4gZ2V0SW5jbHVkZWRPckV4Y2x1ZGVkTWV0aG9kcyh0cnVlIC8qIGluY2x1ZGVkICovKTsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVN1aXRlI2dldEV4Y2x1ZGVkTWV0aG9kcygpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gZ2V0RXhjbHVkZWRNZXRob2RzKCkgeworICAgIHJldHVybiBnZXRJbmNsdWRlZE9yRXhjbHVkZWRNZXRob2RzKGZhbHNlLyogaW5jbHVkZWQgKi8pOworICB9CisKKyAgcHJpdmF0ZSBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IGdldEluY2x1ZGVkT3JFeGNsdWRlZE1ldGhvZHMoYm9vbGVhbiBpbmNsdWRlZCkgeworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gcmVzdWx0PSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGZvciAoVGVzdFJ1bm5lciB0ciA6IG1fdGVzdFJ1bm5lcnMpIHsKKyAgICAgIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gbWV0aG9kcyA9IGluY2x1ZGVkID8gdHIuZ2V0SW52b2tlZE1ldGhvZHMoKSA6IHRyLmdldEV4Y2x1ZGVkTWV0aG9kcygpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICAgIHJlc3VsdC5hZGQobSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSU9iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbV9vYmplY3RGYWN0b3J5IGluc3RhbmNlb2YgSU9iamVjdEZhY3RvcnkgPyAoSU9iamVjdEZhY3RvcnkpIG1fb2JqZWN0RmFjdG9yeSA6IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElPYmplY3RGYWN0b3J5MiBnZXRPYmplY3RGYWN0b3J5MigpIHsKKyAgICByZXR1cm4gbV9vYmplY3RGYWN0b3J5IGluc3RhbmNlb2YgSU9iamVjdEZhY3RvcnkyID8gKElPYmplY3RGYWN0b3J5MikgbV9vYmplY3RGYWN0b3J5IDogbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhbm5vdGF0aW9uIGZpbmRlciBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZS4KKyAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBmaW5kZXIgZm9yIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIElBbm5vdGF0aW9uRmluZGVyIGdldEFubm90YXRpb25GaW5kZXIoKSB7CisgICAgcmV0dXJuIG1fY29uZmlndXJhdGlvbi5nZXRBbm5vdGF0aW9uRmluZGVyKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU3VpdGVSdW5uZXJdICIgKyBzKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVRlc3RSdW5uZXJGYWN0b3J5fS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRUZXN0UnVubmVyRmFjdG9yeSBpbXBsZW1lbnRzIElUZXN0UnVubmVyRmFjdG9yeSB7CisgICAgcHJpdmF0ZSBJVGVzdExpc3RlbmVyW10gbV9mYWlsdXJlR2VuZXJhdG9yczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbV91c2VEZWZhdWx0TGlzdGVuZXJzOworICAgIHByaXZhdGUgYm9vbGVhbiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb24gbV9jb25maWd1cmF0aW9uOworCisgICAgcHVibGljIERlZmF1bHRUZXN0UnVubmVyRmFjdG9yeShJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgICAgICBJVGVzdExpc3RlbmVyW10gZmFpbHVyZUxpc3RlbmVycywKKyAgICAgICAgYm9vbGVhbiB1c2VEZWZhdWx0TGlzdGVuZXJzLAorICAgICAgICBib29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKQorICAgIHsKKyAgICAgIG1fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgICBtX2ZhaWx1cmVHZW5lcmF0b3JzID0gZmFpbHVyZUxpc3RlbmVyczsKKyAgICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycyA9IHVzZURlZmF1bHRMaXN0ZW5lcnM7CisgICAgICBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzID0gc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RSdW5uZXIgbmV3VGVzdFJ1bm5lcihJU3VpdGUgc3VpdGUsIFhtbFRlc3QgdGVzdCwKKyAgICAgICAgQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lcnMsIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKSB7CisgICAgICBib29sZWFuIHNraXAgPSBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICAgICAgaWYgKCEgc2tpcCkgeworICAgICAgICBza2lwID0gdGVzdC5za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cygpOworICAgICAgfQorICAgICAgVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFRlc3RSdW5uZXIobV9jb25maWd1cmF0aW9uLCBzdWl0ZSwgdGVzdCwKKyAgICAgICAgICBzdWl0ZS5nZXRPdXRwdXREaXJlY3RvcnkoKSwgc3VpdGUuZ2V0QW5ub3RhdGlvbkZpbmRlcigpLCBza2lwLAorICAgICAgICAgIGxpc3RlbmVycywgY2xhc3NMaXN0ZW5lcnMpOworCisgICAgICBpZiAobV91c2VEZWZhdWx0TGlzdGVuZXJzKSB7CisgICAgICAgIHRlc3RSdW5uZXIuYWRkTGlzdGVuZXIobmV3IFRlc3RIVE1MUmVwb3J0ZXIoKSk7CisgICAgICAgIHRlc3RSdW5uZXIuYWRkTGlzdGVuZXIobmV3IEpVbml0WE1MUmVwb3J0ZXIoKSk7CisKKyAgICAgICAgLy9UT0RPOiBNb3ZlZCB0aGVzZSBoZXJlIGJlY2F1c2UgbWF2ZW4yIGhhcyBvdXRwdXQgcmVwb3J0ZXJzIHJ1bm5pbmcKKyAgICAgICAgLy9hbHJlYWR5LCB0aGUgb3V0cHV0IGZyb20gdGhlc2UgY2F1c2VzIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQgd2l0aAorICAgICAgICAvL2ZpbGVzLiBUaGlzIGlzIG5vdCB0aGUgZGVzaXJlZCBiZWhhdmlvdXIgb2YgcnVubmluZyB0ZXN0cyBpbiBtYXZlbjIuCisgICAgICAgIC8vRG9uJ3Qga25vdyB3aGF0IHRvIGRvIGFib3V0IHRoaXMgdGhvdWdoLCBhcmUgcGVvcGxlIHJlbHlpbmcgb24gdGhlc2UKKyAgICAgICAgLy90byBiZSBhZGRlZCBldmVuIHdpdGggZGVmYXVsdExpc3RlbmVycyBzZXQgdG8gZmFsc2U/CisgICAgICAgIHRlc3RSdW5uZXIuYWRkTGlzdGVuZXIobmV3IFRleHRSZXBvcnRlcih0ZXN0UnVubmVyLmdldE5hbWUoKSwgVGVzdFJ1bm5lci5nZXRWZXJib3NlKCkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChJVGVzdExpc3RlbmVyIGl0bCA6IG1fZmFpbHVyZUdlbmVyYXRvcnMpIHsKKyAgICAgICAgdGVzdFJ1bm5lci5hZGRMaXN0ZW5lcihpdGwpOworICAgICAgfQorICAgICAgZm9yIChJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNsIDogbV9jb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25MaXN0ZW5lcnMoKSkgeworICAgICAgICB0ZXN0UnVubmVyLmFkZENvbmZpZ3VyYXRpb25MaXN0ZW5lcihjbCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0ZXN0UnVubmVyOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb3h5VGVzdFJ1bm5lckZhY3RvcnkgaW1wbGVtZW50cyBJVGVzdFJ1bm5lckZhY3RvcnkgeworICAgIHByaXZhdGUgSVRlc3RMaXN0ZW5lcltdIG1fZmFpbHVyZUdlbmVyYXRvcnM7CisgICAgcHJpdmF0ZSBJVGVzdFJ1bm5lckZhY3RvcnkgbV90YXJnZXQ7CisKKyAgICBwdWJsaWMgUHJveHlUZXN0UnVubmVyRmFjdG9yeShJVGVzdExpc3RlbmVyW10gZmFpbHVyZUxpc3RlbmVycywgSVRlc3RSdW5uZXJGYWN0b3J5IHRhcmdldCkgeworICAgICAgbV9mYWlsdXJlR2VuZXJhdG9ycyA9IGZhaWx1cmVMaXN0ZW5lcnM7CisgICAgICBtX3RhcmdldD0gdGFyZ2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0UnVubmVyIG5ld1Rlc3RSdW5uZXIoSVN1aXRlIHN1aXRlLCBYbWxUZXN0IHRlc3QsCisgICAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbGlzdGVuZXJzLCBMaXN0PElDbGFzc0xpc3RlbmVyPiBjbGFzc0xpc3RlbmVycykgeworICAgICAgVGVzdFJ1bm5lciB0ZXN0UnVubmVyPSBtX3RhcmdldC5uZXdUZXN0UnVubmVyKHN1aXRlLCB0ZXN0LCBsaXN0ZW5lcnMsIGNsYXNzTGlzdGVuZXJzKTsKKworICAgICAgdGVzdFJ1bm5lci5hZGRMaXN0ZW5lcihuZXcgVGV4dFJlcG9ydGVyKHRlc3RSdW5uZXIuZ2V0TmFtZSgpLCBUZXN0UnVubmVyLmdldFZlcmJvc2UoKSkpOworCisgICAgICBmb3IgKElUZXN0TGlzdGVuZXIgaXRsIDogbV9mYWlsdXJlR2VuZXJhdG9ycykgeworICAgICAgICB0ZXN0UnVubmVyLmFkZExpc3RlbmVyKGl0bCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0ZXN0UnVubmVyOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICBtX2hvc3QgPSBob3N0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICByZXR1cm4gbV9ob3N0OworICB9CisKKyAgcHJpdmF0ZSBTdWl0ZVJ1blN0YXRlIG1fc3VpdGVTdGF0ZT0gbmV3IFN1aXRlUnVuU3RhdGUoKTsKKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklTdWl0ZSNnZXRTdWl0ZVN0YXRlKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3VpdGVSdW5TdGF0ZSBnZXRTdWl0ZVN0YXRlKCkgeworICAgIHJldHVybiBtX3N1aXRlU3RhdGU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyhCb29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKSB7CisgICAgaWYgKHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzICE9IG51bGwpIHsKKyAgICAgIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSBza2lwRmFpbGVkSW52b2NhdGlvbkNvdW50czsKKyAgICB9CisgIH0KKworICBwcml2YXRlIElBdHRyaWJ1dGVzIG1fYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICBtX2F0dHJpYnV0ZXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVOYW1lcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgIH0KKworICAvLy8vLworICAvLyBpbXBsZW1lbnRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIKKyAgLy8KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk1ldGhvZCBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICB9CisgICAgbV9pbnZva2VkTWV0aG9kcy5hZGQobWV0aG9kKTsKKyAgfQorCisgIC8vCisgIC8vIGltcGxlbWVudHMgSUludm9rZWRNZXRob2RMaXN0ZW5lcgorICAvLy8vLworCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJSW52b2tlZE1ldGhvZD4gZ2V0QWxsSW52b2tlZE1ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1faW52b2tlZE1ldGhvZHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SVRlc3ROR01ldGhvZD4gZ2V0QWxsTWV0aG9kcygpIHsKKyAgICByZXR1cm4gbV9hbGxUZXN0TWV0aG9kczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1N1aXRlUnVubmVyV29ya2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvU3VpdGVSdW5uZXJXb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1N1aXRlUnVubmVyV29ya2VyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5PYmplY3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuU3VpdGVSdW5uZXJNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5ncmFwaC5JV29ya2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbiB7QGNvZGUgSVdvcmtlcn0gdGhhdCBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIGFuZCBydW4gU3VpdGUgUnVubmVycworICoKKyAqIEBhdXRob3IgY2JldXN0LCBudWxsaW4KKyAqLworcHVibGljIGNsYXNzIFN1aXRlUnVubmVyV29ya2VyIGltcGxlbWVudHMgSVdvcmtlcjxJU3VpdGU+IHsKKworICBwcml2YXRlIFN1aXRlUnVubmVyIG1fc3VpdGVSdW5uZXI7CisgIHByaXZhdGUgSW50ZWdlciBtX3ZlcmJvc2U7CisgIHByaXZhdGUgU3RyaW5nIG1fZGVmYXVsdFN1aXRlTmFtZTsKKyAgcHJpdmF0ZSBTdWl0ZVJ1bm5lck1hcCBtX3N1aXRlUnVubmVyTWFwOworCisgIHB1YmxpYyBTdWl0ZVJ1bm5lcldvcmtlcihJU3VpdGUgc3VpdGVSdW5uZXIsCisgICAgICBTdWl0ZVJ1bm5lck1hcCBzdWl0ZVJ1bm5lck1hcCwKKyAgICAgIGludCB2ZXJib3NlLAorICAgICAgU3RyaW5nIGRlZmF1bHRTdWl0ZU5hbWUpCisgIHsKKyAgICBtX3N1aXRlUnVubmVyTWFwID0gc3VpdGVSdW5uZXJNYXA7CisgICAgbV9zdWl0ZVJ1bm5lciA9IChTdWl0ZVJ1bm5lcikgc3VpdGVSdW5uZXI7CisgICAgbV92ZXJib3NlID0gdmVyYm9zZTsKKyAgICBtX2RlZmF1bHRTdWl0ZU5hbWUgPSBkZWZhdWx0U3VpdGVOYW1lOworICB9CisKKyAgLyoqCisgICAqIFJ1bnMgYSBzdWl0ZQorICAgKiBAcGFyYW0gc3VpdGVSdW5uZXJNYXAgbWFwIG9mIHN1aXRlUnVubmVycyB0aGF0IGFyZSB1cGRhdGVkIHdpdGggdGVzdCByZXN1bHRzCisgICAqIEBwYXJhbSB4bWxTdWl0ZSBYTUwgc3VpdGVzIHRvIHJ1bgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJ1blN1aXRlKFN1aXRlUnVubmVyTWFwIHN1aXRlUnVubmVyTWFwIC8qIE9VVCAqLywgWG1sU3VpdGUgeG1sU3VpdGUpCisgIHsKKyAgICBpZiAobV92ZXJib3NlID4gMCkgeworICAgICAgU3RyaW5nQnVmZmVyIGFsbEZpbGVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgYWxsRmlsZXMuYXBwZW5kKCIgICIpLmFwcGVuZCh4bWxTdWl0ZS5nZXRGaWxlTmFtZSgpICE9IG51bGwKKyAgICAgICAgICA/IHhtbFN1aXRlLmdldEZpbGVOYW1lKCkgOiBtX2RlZmF1bHRTdWl0ZU5hbWUpLmFwcGVuZCgnXG4nKTsKKyAgICAgIFV0aWxzLmxvZygiVGVzdE5HIiwgMCwgIlJ1bm5pbmc6XG4iICsgYWxsRmlsZXMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgU3VpdGVSdW5uZXIgc3VpdGVSdW5uZXIgPSAoU3VpdGVSdW5uZXIpIHN1aXRlUnVubmVyTWFwLmdldCh4bWxTdWl0ZSk7CisgICAgc3VpdGVSdW5uZXIucnVuKCk7CisKKyAgICAvL1RPRE86IHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgcHJvcGVybHkKKyAgICAvLyAgICBmb3IgKElSZXBvcnRlciByIDogc3VpdGVSdW5uZXIuZ2V0UmVwb3J0ZXJzKCkpIHsKKyAgICAvLyAgICAgIGFkZExpc3RlbmVyKHIpOworICAgIC8vICAgIH0KKworICAgIC8vIFBvb2xTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2h1dGRvd24oKTsKKworICAgIC8vCisgICAgLy8gRGlzcGxheSB0aGUgZmluYWwgc3RhdGlzdGljcworICAgIC8vCisgICAgaWYgKHhtbFN1aXRlLmdldFZlcmJvc2UoKSA+IDApIHsKKyAgICAgIFN1aXRlUmVzdWx0Q291bnRzIGNvdW50cyA9IG5ldyBTdWl0ZVJlc3VsdENvdW50cygpOworICAgICAgc3luY2hyb25pemVkIChzdWl0ZVJ1bm5lck1hcCkgeworICAgICAgICBjb3VudHMuY2FsY3VsYXRlUmVzdWx0Q291bnRzKHhtbFN1aXRlLCBzdWl0ZVJ1bm5lck1hcCk7CisgICAgICB9CisKKyAgICAgIFN0cmluZ0J1ZmZlciBidWZMb2cgPSBuZXcgU3RyaW5nQnVmZmVyKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQorICAgICAgICAgIC5hcHBlbmQoeG1sU3VpdGUuZ2V0TmFtZSgpKTsKKyAgICAgIGJ1ZkxvZy5hcHBlbmQoIlxuVG90YWwgdGVzdHMgcnVuOiAiKQorICAgICAgICAgIC5hcHBlbmQoY291bnRzLm1fdG90YWwpLmFwcGVuZCgiLCBGYWlsdXJlczogIikuYXBwZW5kKGNvdW50cy5tX2ZhaWxlZCkKKyAgICAgICAgICAuYXBwZW5kKCIsIFNraXBzOiAiKS5hcHBlbmQoY291bnRzLm1fc2tpcHBlZCk7CisgICAgICBpZihjb3VudHMubV9jb25mRmFpbHVyZXMgPiAwIHx8IGNvdW50cy5tX2NvbmZTa2lwcyA+IDApIHsKKyAgICAgICAgYnVmTG9nLmFwcGVuZCgiXG5Db25maWd1cmF0aW9uIEZhaWx1cmVzOiAiKS5hcHBlbmQoY291bnRzLm1fY29uZkZhaWx1cmVzKQorICAgICAgICAgICAgIC5hcHBlbmQoIiwgU2tpcHM6ICIpLmFwcGVuZChjb3VudHMubV9jb25mU2tpcHMpOworICAgICAgfQorICAgICAgYnVmTG9nLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnVmTG9nLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgcnVuU3VpdGUobV9zdWl0ZVJ1bm5lck1hcCwgbV9zdWl0ZVJ1bm5lci5nZXRYbWxTdWl0ZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhJV29ya2VyPElTdWl0ZT4gYXJnMCkgeworICAgIC8qCisgICAgICogRHVtbXkgSW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIFVzZWQgYnkgSVdvcmtlcnMgdG8gcHJpb3JpdGl6ZSBleGVjdXRpb24gaW4gcGFyYWxsZWwuIE5vdCByZXF1aXJlZCBieQorICAgICAqIHRoaXMgV29ya2VyIGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJU3VpdGU+IGdldFRhc2tzKCkgeworICAgIExpc3Q8SVN1aXRlPiBzdWl0ZVJ1bm5lckxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBzdWl0ZVJ1bm5lckxpc3QuYWRkKG1fc3VpdGVSdW5uZXIpOworICAgIHJldHVybiBzdWl0ZVJ1bm5lckxpc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gT2JqZWN0cy50b1N0cmluZ0hlbHBlcihnZXRDbGFzcygpKQorICAgICAgICAuYWRkKCJuYW1lIiwgbV9zdWl0ZVJ1bm5lci5nZXROYW1lKCkpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFRpbWVPdXQoKQorICB7CisgICAgcmV0dXJuIG1fc3VpdGVSdW5uZXIuZ2V0WG1sU3VpdGUoKS5nZXRUaW1lT3V0KExvbmcuTUFYX1ZBTFVFKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCkKKyAgeworICAgIC8vIHRoaXMgY2xhc3MgZG9lc250IHN1cHBvcnQgcHJpb3JpdGllcyB5ZXQKKyAgICByZXR1cm4gMDsKKyAgfQorCit9CisKKy8qKgorICogQ2xhc3MgdG8gaGVscCBjYWxjdWxhdGUgcmVzdWx0IGNvdW50cyBmb3IgdGVzdHMgcnVuIGFzIHBhcnQgb2YgYSBzdWl0ZSBhbmQKKyAqIGl0cyBjaGlsZHJlbiBzdWl0ZXMKKyAqCisgKiBAYXV0aG9yIG51bGxpbgorICoKKyAqLworY2xhc3MgU3VpdGVSZXN1bHRDb3VudHMgeworCisgIGludCBtX3RvdGFsID0gMDsKKyAgaW50IG1fc2tpcHBlZCA9IDA7CisgIGludCBtX2ZhaWxlZCA9IDA7CisgIGludCBtX2NvbmZGYWlsdXJlcyA9IDA7CisgIGludCBtX2NvbmZTa2lwcyA9IDA7CisKKyAgcHVibGljIHZvaWQgY2FsY3VsYXRlUmVzdWx0Q291bnRzKFhtbFN1aXRlIHhtbFN1aXRlLCBTdWl0ZVJ1bm5lck1hcCBzdWl0ZVJ1bm5lck1hcCkKKyAgeworICAgIElTdWl0ZSBpU3VpdGUgPSBzdWl0ZVJ1bm5lck1hcC5nZXQoeG1sU3VpdGUpOworICAgIGlmIChpU3VpdGUgIT0gbnVsbCkgeworICAgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHRzID0gaVN1aXRlLmdldFJlc3VsdHMoKTsKKyAgICAgIGlmIChyZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxJU3VpdGVSZXN1bHQ+IHRlbXBTdWl0ZVJlc3VsdCA9IHJlc3VsdHMudmFsdWVzKCk7CisgICAgICAgIGZvciAoSVN1aXRlUmVzdWx0IGlzciA6IHRlbXBTdWl0ZVJlc3VsdCkgeworICAgICAgICAgIElUZXN0Q29udGV4dCBjdHggPSBpc3IuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgICBpbnQgc2tpcHBlZCA9IGN0eC5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgICAgaW50IGZhaWxlZCA9IGN0eC5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSArIGN0eC5nZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkuc2l6ZSgpOworICAgICAgICAgIG1fc2tpcHBlZCArPSBza2lwcGVkOworICAgICAgICAgIG1fZmFpbGVkICs9IGZhaWxlZDsKKyAgICAgICAgICBtX2NvbmZGYWlsdXJlcyArPSBjdHguZ2V0RmFpbGVkQ29uZmlndXJhdGlvbnMoKS5zaXplKCk7CisgICAgICAgICAgbV9jb25mU2tpcHMgKz0gY3R4LmdldFNraXBwZWRDb25maWd1cmF0aW9ucygpLnNpemUoKTsKKyAgICAgICAgICBtX3RvdGFsICs9IGN0eC5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSArIGZhaWxlZCArIHNraXBwZWQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFhtbFN1aXRlIGNoaWxkU3VpdGUgOiB4bWxTdWl0ZS5nZXRDaGlsZFN1aXRlcygpKSB7CisgICAgICAgICAgY2FsY3VsYXRlUmVzdWx0Q291bnRzKGNoaWxkU3VpdGUsIHN1aXRlUnVubmVyTWFwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdENsYXNzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk4MmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk9iamVjdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuTm9PcFRlc3RDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlJ1bkluZm87CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5UZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdGVzdCBjbGFzczoKKyAqIC0gVGhlIHRlc3QgbWV0aG9kcworICogLSBUaGUgY29uZmlndXJhdGlvbiBtZXRob2RzICh0ZXN0IGFuZCBtZXRob2QpCisgKiAtIFRoZSBjbGFzcyBmaWxlCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitjbGFzcyBUZXN0Q2xhc3MgZXh0ZW5kcyBOb09wVGVzdENsYXNzIGltcGxlbWVudHMgSVRlc3RDbGFzcyB7CisJLyogZ2VuZXJhdGVkICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwNzc5MTcxMjgyNzgzNjEyOTRMOworICB0cmFuc2llbnQgcHJpdmF0ZSBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXIgPSBudWxsOworICAvLyBUaGUgU3RyYXRlZ3kgdXNlZCB0byBsb2NhdGUgdGVzdCBtZXRob2RzIChUZXN0TkcsIEpVbml0LCBldGMuLi4pCisgIHRyYW5zaWVudCBwcml2YXRlIElUZXN0TWV0aG9kRmluZGVyIG1fdGVzdE1ldGhvZEZpbmRlciA9IG51bGw7CisKKyAgcHJpdmF0ZSBJQ2xhc3MgbV9pQ2xhc3MgPSBudWxsOworICBwcml2YXRlIFJ1bkluZm8gbV9ydW5JbmZvID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgbV90ZXN0TmFtZTsKKyAgcHJpdmF0ZSBYbWxUZXN0IG1feG1sVGVzdDsKKyAgcHJpdmF0ZSBYbWxDbGFzcyBtX3htbENsYXNzOworCisgIHByb3RlY3RlZCBUZXN0Q2xhc3MoSUNsYXNzIGNscywKKyAgICAgICAgICAgICAgICAgICBJVGVzdE1ldGhvZEZpbmRlciB0ZXN0TWV0aG9kRmluZGVyLAorICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgUnVuSW5mbyBydW5JbmZvLAorICAgICAgICAgICAgICAgICAgIFhtbFRlc3QgeG1sVGVzdCwKKyAgICAgICAgICAgICAgICAgICBYbWxDbGFzcyB4bWxDbGFzcykgeworICAgIGluaXQoY2xzLCB0ZXN0TWV0aG9kRmluZGVyLCBhbm5vdGF0aW9uRmluZGVyLCBydW5JbmZvLCB4bWxUZXN0LCB4bWxDbGFzcyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHRlc3QgaWYgdGhlIGNsYXNzIGltcGxlbWVudHMgb3JnLnRlc3RuZy5JVGVzdCwgbnVsbCBvdGhlcndpc2UuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKyAgICByZXR1cm4gbV90ZXN0TmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgWG1sVGVzdCBnZXRYbWxUZXN0KCkgeworICAgIHJldHVybiBtX3htbFRlc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFhtbENsYXNzIGdldFhtbENsYXNzKCkgeworICAgIHJldHVybiBtX3htbENsYXNzOworICB9CisKKyAgcHVibGljIElBbm5vdGF0aW9uRmluZGVyIGdldEFubm90YXRpb25GaW5kZXIoKSB7CisgICAgcmV0dXJuIG1fYW5ub3RhdGlvbkZpbmRlcjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0KElDbGFzcyBjbHMsCisgICAgICAgICAgICAgICAgICAgIElUZXN0TWV0aG9kRmluZGVyIHRlc3RNZXRob2RGaW5kZXIsCisgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgIFJ1bkluZm8gcnVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgWG1sVGVzdCB4bWxUZXN0LAorICAgICAgICAgICAgICAgICAgICBYbWxDbGFzcyB4bWxDbGFzcykKKyAgeworICAgIGxvZygzLCAiQ3JlYXRpbmcgVGVzdENsYXNzIGZvciAiICsgY2xzKTsKKyAgICBtX2lDbGFzcyA9IGNsczsKKyAgICBtX3Rlc3RDbGFzcyA9IGNscy5nZXRSZWFsQ2xhc3MoKTsKKyAgICBtX3htbFRlc3QgPSB4bWxUZXN0OworICAgIG1feG1sQ2xhc3MgPSB4bWxDbGFzczsKKyAgICBtX3J1bkluZm8gPSBydW5JbmZvOworICAgIG1fdGVzdE1ldGhvZEZpbmRlciA9IHRlc3RNZXRob2RGaW5kZXI7CisgICAgbV9hbm5vdGF0aW9uRmluZGVyID0gYW5ub3RhdGlvbkZpbmRlcjsKKyAgICBpbml0VGVzdENsYXNzZXNBbmRJbnN0YW5jZXMoKTsKKyAgICBpbml0TWV0aG9kcygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRUZXN0Q2xhc3Nlc0FuZEluc3RhbmNlcygpIHsKKyAgICAvLworICAgIC8vIFRlc3RDbGFzc2VzIGFuZCBpbnN0YW5jZXMKKyAgICAvLworICAgIE9iamVjdFtdIGluc3RhbmNlcyA9IGdldEluc3RhbmNlcyhmYWxzZSk7CisgICAgZm9yIChPYmplY3QgaW5zdGFuY2UgOiBpbnN0YW5jZXMpIHsKKyAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIElUZXN0KSB7CisgICAgICAgIG1fdGVzdE5hbWUgPSAoKElUZXN0KSBpbnN0YW5jZSkuZ2V0VGVzdE5hbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX3Rlc3ROYW1lID09IG51bGwpIHsKKyAgICAgIG1fdGVzdE5hbWUgPSBtX2lDbGFzcy5nZXRUZXN0TmFtZSgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0W10gZ2V0SW5zdGFuY2VzKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgcmV0dXJuIG1faUNsYXNzLmdldEluc3RhbmNlcyhjcmVhdGUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nW10gZ2V0SW5zdGFuY2VIYXNoQ29kZXMoKSB7CisgICAgcmV0dXJuIG1faUNsYXNzLmdldEluc3RhbmNlSGFzaENvZGVzKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgeworICAgIHJldHVybiBtX2lDbGFzcy5nZXRJbnN0YW5jZUNvdW50KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkSW5zdGFuY2UoT2JqZWN0IGluc3RhbmNlKSB7CisgICAgbV9pQ2xhc3MuYWRkSW5zdGFuY2UoaW5zdGFuY2UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRNZXRob2RzKCkgeworICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzID0gbV90ZXN0TWV0aG9kRmluZGVyLmdldFRlc3RNZXRob2RzKG1fdGVzdENsYXNzLCBtX3htbFRlc3QpOworICAgIG1fdGVzdE1ldGhvZHMgPSBjcmVhdGVUZXN0TWV0aG9kcyhtZXRob2RzKTsKKworICAgIGZvciAoT2JqZWN0IGluc3RhbmNlIDogbV9pQ2xhc3MuZ2V0SW5zdGFuY2VzKGZhbHNlKSkgeworICAgICAgbV9iZWZvcmVTdWl0ZU1ldGhvZHMgPSBDb25maWd1cmF0aW9uTWV0aG9kCisgICAgICAgICAgLmNyZWF0ZVN1aXRlQ29uZmlndXJhdGlvbk1ldGhvZHMobV90ZXN0TWV0aG9kRmluZGVyLmdldEJlZm9yZVN1aXRlTWV0aG9kcyhtX3Rlc3RDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UpOworICAgICAgbV9hZnRlclN1aXRlTWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlU3VpdGVDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RNZXRob2RGaW5kZXIuZ2V0QWZ0ZXJTdWl0ZU1ldGhvZHMobV90ZXN0Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICBtX2JlZm9yZVRlc3RDb25mTWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKG1fdGVzdE1ldGhvZEZpbmRlci5nZXRCZWZvcmVUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMobV90ZXN0Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgIG1fYWZ0ZXJUZXN0Q29uZk1ldGhvZHMgPSBDb25maWd1cmF0aW9uTWV0aG9kCisgICAgICAgICAgLmNyZWF0ZVRlc3RDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RNZXRob2RGaW5kZXIuZ2V0QWZ0ZXJUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMobV90ZXN0Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICBtX2JlZm9yZUNsYXNzTWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlQ2xhc3NDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RNZXRob2RGaW5kZXIuZ2V0QmVmb3JlQ2xhc3NNZXRob2RzKG1fdGVzdENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICBtX2FmdGVyQ2xhc3NNZXRob2RzID0gQ29uZmlndXJhdGlvbk1ldGhvZAorICAgICAgICAgIC5jcmVhdGVDbGFzc0NvbmZpZ3VyYXRpb25NZXRob2RzKG1fdGVzdE1ldGhvZEZpbmRlci5nZXRBZnRlckNsYXNzTWV0aG9kcyhtX3Rlc3RDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgIG1fYmVmb3JlR3JvdXBzTWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlQmVmb3JlQ29uZmlndXJhdGlvbk1ldGhvZHMobV90ZXN0TWV0aG9kRmluZGVyLmdldEJlZm9yZUdyb3Vwc0NvbmZpZ3VyYXRpb25NZXRob2RzKG1fdGVzdENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICBtX2FmdGVyR3JvdXBzTWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlQWZ0ZXJDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RNZXRob2RGaW5kZXIuZ2V0QWZ0ZXJHcm91cHNDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgIG1fYmVmb3JlVGVzdE1ldGhvZHMgPSBDb25maWd1cmF0aW9uTWV0aG9kCisgICAgICAgICAgLmNyZWF0ZVRlc3RNZXRob2RDb25maWd1cmF0aW9uTWV0aG9kcyhtX3Rlc3RNZXRob2RGaW5kZXIuZ2V0QmVmb3JlVGVzdE1ldGhvZHMobV90ZXN0Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgIG1fYWZ0ZXJUZXN0TWV0aG9kcyA9IENvbmZpZ3VyYXRpb25NZXRob2QKKyAgICAgICAgICAuY3JlYXRlVGVzdE1ldGhvZENvbmZpZ3VyYXRpb25NZXRob2RzKG1fdGVzdE1ldGhvZEZpbmRlci5nZXRBZnRlclRlc3RNZXRob2RzKG1fdGVzdENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgdGhlIHRlc3QgbWV0aG9kcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsYXNzIChyZWplY3RzCisgICAqIGFsbCB0aG9zZSB0aGF0IGJlbG9uZyB0byBhIGRpZmZlcmVudCBjbGFzcykuCisgICAqLworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSBjcmVhdGVUZXN0TWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gbWV0aG9kcykgeworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSVRlc3ROR01ldGhvZCB0bSA6IG1ldGhvZHMpIHsKKyAgICAgIE1ldGhvZCBtID0gdG0uZ2V0TWV0aG9kKCk7CisgICAgICBpZiAobS5nZXREZWNsYXJpbmdDbGFzcygpLmlzQXNzaWduYWJsZUZyb20obV90ZXN0Q2xhc3MpKSB7CisgICAgICAgIGZvciAoT2JqZWN0IG8gOiBtX2lDbGFzcy5nZXRJbnN0YW5jZXMoZmFsc2UpKSB7CisgICAgICAgICAgbG9nKDQsICJBZGRpbmcgbWV0aG9kICIgKyB0bSArICIgb24gVGVzdENsYXNzICIgKyBtX3Rlc3RDbGFzcyk7CisgICAgICAgICAgdlJlc3VsdC5hZGQobmV3IFRlc3ROR01ldGhvZCgvKiB0bS5nZXRSZWFsQ2xhc3MoKSwgKi8gbSwgbV9hbm5vdGF0aW9uRmluZGVyLCBtX3htbFRlc3QsCisgICAgICAgICAgICAgIG8pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGxvZyg0LCAiUmVqZWN0aW5nIG1ldGhvZCAiICsgdG0gKyAiIGZvciBUZXN0Q2xhc3MgIiArIG1fdGVzdENsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0ID0gdlJlc3VsdC50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW3ZSZXN1bHQuc2l6ZSgpXSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgUnVuSW5mbyBnZXRSdW5JbmZvKCkgeworICAgIHJldHVybiBtX3J1bkluZm87CisgIH0KKworICBwdWJsaWMgSVRlc3RNZXRob2RGaW5kZXIgZ2V0VGVzdE1ldGhvZEZpbmRlcigpIHsKKyAgICByZXR1cm4gbV90ZXN0TWV0aG9kRmluZGVyOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBzKSB7CisgICAgVXRpbHMubG9nKCJUZXN0Q2xhc3MiLCBsZXZlbCwgcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3RDbGFzc10gIiArIHMpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgZHVtcCgpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09IFRlc3QgY2xhc3NcbiIgKyBtX3Rlc3RDbGFzcy5nZXROYW1lKCkpOworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogbV9iZWZvcmVDbGFzc01ldGhvZHMpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBAQmVmb3JlQ2xhc3MgIiArIG0pOworICAgIH0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1fYmVmb3JlVGVzdE1ldGhvZHMpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBAQmVmb3JlTWV0aG9kICIgKyBtKTsKKyAgICB9CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtX3Rlc3RNZXRob2RzKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBAVGVzdCAiICsgbSk7CisgICAgfQorICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogbV9hZnRlclRlc3RNZXRob2RzKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQEFmdGVyTWV0aG9kICIgKyBtKTsKKyAgICB9CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtX2FmdGVyQ2xhc3NNZXRob2RzKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQEFmdGVyQ2xhc3MgIiArIG0pOworICAgIH0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIoZ2V0Q2xhc3MoKSkKKyAgICAgICAgLmFkZCgibmFtZSIsIG1fdGVzdENsYXNzKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBJQ2xhc3MgZ2V0SUNsYXNzKCkgeworICAgIHJldHVybiBtX2lDbGFzczsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0RXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE2YjRlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYW4gZXhjZXB0aW9uIGhhcHBlbnMgd2hpbGUgcnVubmluZyBhIHRlc3QKKyAqIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgQXByIDI2LCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvbiBleHRlbmRzIFRlc3ROR0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc5NDY2NDQwMjUxODgwMzg4MDRMOworCisgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgc3VwZXIocyk7CisgIH0KKworCXB1YmxpYyBUZXN0RXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisJCXN1cGVyKHQpOworCX0KKworICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCB0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdExpc3RlbmVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3RMaXN0ZW5lckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZGQwNjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3RMaXN0ZW5lckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk9iamVjdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JUmVzdWx0TGlzdGVuZXIyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBBIHNpbXBsZSBJVGVzdExpc3RlbmVyIGFkYXB0ZXIgdGhhdCBzdG9yZXMgYWxsIHRoZSB0ZXN0cworICogdGhhdCB3ZXJlIHJ1bi4gIFlvdSBjYW4gcmV0cmlldmUgdGhlc2UgcmVzdWx0cyB3aXRoIHRoZQorICogZm9sbG93aW5nIG1ldGhvZHM6CisgKiBnZXRQYXNzZWRUZXN0cygpCisgKiBnZXRGYWlsZWRUZXN0cygpCisgKiBnZXRTa2lwcGVkVGVzdHMoKQorICoKKyAqIElmIHlvdSBleHRlbmQgdGhpcyBjbGFzcyBpbiBvcmRlciB0byBvdmVycmlkZSBhbnkgb2YgdGhlc2UKKyAqIG1ldGhvZHMsIHJlbWVtYmVyIHRvIGNhbGwgdGhlaXIgc3VwZXIgZXF1aXZhbGVudCBpZiB5b3Ugd2FudAorICogdGhpcyBsaXN0IG9mIHRlc3RzIHRvIGJlIG1haW50YWluZWQuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyA2LCAyMDA0CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TGlzdGVuZXJBZGFwdGVyIGltcGxlbWVudHMgSVJlc3VsdExpc3RlbmVyMiB7CisgIHByaXZhdGUgTGlzdDxJVGVzdE5HTWV0aG9kPiBtX2FsbFRlc3RNZXRob2RzID0KKyAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0TkdNZXRob2Q+bmV3QXJyYXlMaXN0KCkpOworICBwcml2YXRlIExpc3Q8SVRlc3RSZXN1bHQ+IG1fcGFzc2VkVGVzdHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExpc3RzLjxJVGVzdFJlc3VsdD5uZXdBcnJheUxpc3QoKSk7CisgIHByaXZhdGUgTGlzdDxJVGVzdFJlc3VsdD4gbV9mYWlsZWRUZXN0cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCgpKTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBtX3NraXBwZWRUZXN0cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCgpKTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBtX2ZhaWxlZEJ1dFdTUGVyVGVzdHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExpc3RzLjxJVGVzdFJlc3VsdD5uZXdBcnJheUxpc3QoKSk7CisgIHByaXZhdGUgTGlzdDxJVGVzdENvbnRleHQ+IG1fdGVzdENvbnRleHRzPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8SVRlc3RDb250ZXh0PigpKTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBtX2ZhaWxlZENvbmZzPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExpc3RzLjxJVGVzdFJlc3VsdD5uZXdBcnJheUxpc3QoKSk7CisgIHByaXZhdGUgTGlzdDxJVGVzdFJlc3VsdD4gbV9za2lwcGVkQ29uZnM9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCgpKTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBtX3Bhc3NlZENvbmZzPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExpc3RzLjxJVGVzdFJlc3VsdD5uZXdBcnJheUxpc3QoKSk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBtX2FsbFRlc3RNZXRob2RzLmFkZCh0ci5nZXRNZXRob2QoKSk7CisgICAgbV9wYXNzZWRUZXN0cy5hZGQodHIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBtX2FsbFRlc3RNZXRob2RzLmFkZCh0ci5nZXRNZXRob2QoKSk7CisgICAgbV9mYWlsZWRUZXN0cy5hZGQodHIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBtX2FsbFRlc3RNZXRob2RzLmFkZCh0ci5nZXRNZXRob2QoKSk7CisgICAgbV9za2lwcGVkVGVzdHMuYWRkKHRyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCB0cikgeworICAgIG1fYWxsVGVzdE1ldGhvZHMuYWRkKHRyLmdldE1ldGhvZCgpKTsKKyAgICBtX2ZhaWxlZEJ1dFdTUGVyVGVzdHMuYWRkKHRyKTsKKyAgfQorCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gZ2V0QWxsVGVzdE1ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1fYWxsVGVzdE1ldGhvZHMudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFttX2FsbFRlc3RNZXRob2RzLnNpemUoKV0pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0KSB7CisJICBtX3Rlc3RDb250ZXh0cy5hZGQodGVzdENvbnRleHQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkgeworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cy4KKyAgICovCisgIHB1YmxpYyBMaXN0PElUZXN0UmVzdWx0PiBnZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkgeworICAgIHJldHVybiBtX2ZhaWxlZEJ1dFdTUGVyVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFpbGVkVGVzdHMuCisgICAqLworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0RmFpbGVkVGVzdHMoKSB7CisgICAgcmV0dXJuIG1fZmFpbGVkVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFzc2VkVGVzdHMuCisgICAqLworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0UGFzc2VkVGVzdHMoKSB7CisgICAgcmV0dXJuIG1fcGFzc2VkVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2tpcHBlZFRlc3RzLgorICAgKi8KKyAgcHVibGljIExpc3Q8SVRlc3RSZXN1bHQ+IGdldFNraXBwZWRUZXN0cygpIHsKKyAgICByZXR1cm4gbV9za2lwcGVkVGVzdHM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3RMaXN0ZW5lckFkYXB0ZXJdICIgKyBzKTsKKyAgfQorICAvKioKKyAgICogQHBhcmFtIGFsbFRlc3RNZXRob2RzIFRoZSBhbGxUZXN0TWV0aG9kcyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBbGxUZXN0TWV0aG9kcyhMaXN0PElUZXN0TkdNZXRob2Q+IGFsbFRlc3RNZXRob2RzKSB7CisgICAgbV9hbGxUZXN0TWV0aG9kcyA9IGFsbFRlc3RNZXRob2RzOworICB9CisgIC8qKgorICAgKiBAcGFyYW0gZmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cyBUaGUgZmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKAorICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gZmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cykgeworICAgIG1fZmFpbGVkQnV0V1NQZXJUZXN0cyA9IGZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEBwYXJhbSBmYWlsZWRUZXN0cyBUaGUgZmFpbGVkVGVzdHMgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RmFpbGVkVGVzdHMoTGlzdDxJVGVzdFJlc3VsdD4gZmFpbGVkVGVzdHMpIHsKKyAgICBtX2ZhaWxlZFRlc3RzID0gZmFpbGVkVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEBwYXJhbSBwYXNzZWRUZXN0cyBUaGUgcGFzc2VkVGVzdHMgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UGFzc2VkVGVzdHMoTGlzdDxJVGVzdFJlc3VsdD4gcGFzc2VkVGVzdHMpIHsKKyAgICBtX3Bhc3NlZFRlc3RzID0gcGFzc2VkVGVzdHM7CisgIH0KKyAgLyoqCisgICAqIEBwYXJhbSBza2lwcGVkVGVzdHMgVGhlIHNraXBwZWRUZXN0cyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTa2lwcGVkVGVzdHMoTGlzdDxJVGVzdFJlc3VsdD4gc2tpcHBlZFRlc3RzKSB7CisgICAgbV9za2lwcGVkVGVzdHMgPSBza2lwcGVkVGVzdHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdENvbnRleHQ+IGdldFRlc3RDb250ZXh0cygpIHsKKyAgICByZXR1cm4gbV90ZXN0Q29udGV4dHM7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0Q29uZmlndXJhdGlvbkZhaWx1cmVzKCkgeworICAgIHJldHVybiBtX2ZhaWxlZENvbmZzOworICB9CisKKyAgLyoqCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyI29uQ29uZmlndXJhdGlvbkZhaWx1cmUob3JnLnRlc3RuZy5JVGVzdFJlc3VsdCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25GYWlsdXJlKElUZXN0UmVzdWx0IGl0cikgeworICAgIG1fZmFpbGVkQ29uZnMuYWRkKGl0cik7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0Q29uZmlndXJhdGlvblNraXBzKCkgeworICAgIHJldHVybiBtX3NraXBwZWRDb25mczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBiZWZvcmVDb25maWd1cmF0aW9uKElUZXN0UmVzdWx0IHRyKSB7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uU2tpcChvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblNraXAoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgbV9za2lwcGVkQ29uZnMuYWRkKGl0cik7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uU3VjY2VzcyhvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblN1Y2Nlc3MoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgbV9wYXNzZWRDb25mcy5hZGQoaXRyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKGdldENsYXNzKCkpCisgICAgICAgIC5hZGQoInBhc3NlZCIsIGdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpKQorICAgICAgICAuYWRkKCJmYWlsZWQiLCBnZXRGYWlsZWRUZXN0cygpLnNpemUoKSkKKyAgICAgICAgLmFkZCgic2tpcHBlZCIsIGdldFNraXBwZWRUZXN0cygpLnNpemUoKSkKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkcuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTI1NjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3RORy5qYXZhCkBAIC0wLDAgKzEsMjA1MSBAQAorcGFja2FnZSBvcmcudGVzdG5nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNlcnZpY2VMb2FkZXI7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuU2V0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkR5bmFtaWNHcmFwaDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSVJlc3VsdExpc3RlbmVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLk92ZXJyaWRlUHJvY2Vzc29yOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuU3VpdGVSdW5uZXJNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlZlcnNpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5EZWZhdWx0QW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5KREsxNUFubm90YXRpb25GaW5kZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguR3JhcGhUaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguSVRocmVhZFdvcmtlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguU3VpdGVXb3JrZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuanVuaXQuSlVuaXRUZXN0RmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcubG9nNHRlc3RuZy5Mb2dnZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuU3VpdGVEaXNwYXRjaGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLlN1aXRlU2xhdmU7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRW1haWxhYmxlUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRW1haWxhYmxlUmVwb3J0ZXIyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLkZhaWxlZFJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLkpVbml0UmVwb3J0UmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuU3VpdGVIVE1MUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuVmVyYm9zZVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxLk1haW47CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sTWV0aG9kU2VsZWN0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5KQ29tbWFuZGVyOworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLlBhcmFtZXRlckV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzLmRlZmF1bHRJZlN0cmluZ0VtcHR5OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzLmlzU3RyaW5nRW1wdHk7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHMuaXNTdHJpbmdOb3RFbXB0eTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBydW5uaW5nIHRlc3RzIGluIHRoZSBUZXN0TkcgZnJhbWV3b3JrLgorICogVXNlcnMgY2FuIGNyZWF0ZSB0aGVpciBvd24gVGVzdE5HIG9iamVjdCBhbmQgaW52b2tlIGl0IGluIG1hbnkgZGlmZmVyZW50CisgKiB3YXlzOgorICogPHVsPgorICogPGxpPk9uIGFuIGV4aXN0aW5nIHRlc3RuZy54bWwKKyAqIDxsaT5PbiBhIHN5bnRoZXRpYyB0ZXN0bmcueG1sLCBjcmVhdGVkIGVudGlyZWx5IGZyb20gSmF2YQorICogPGxpPkJ5IGRpcmVjdGx5IHNldHRpbmcgdGhlIHRlc3QgY2xhc3NlcworICogPC91bD4KKyAqIFlvdSBjYW4gYWxzbyBkZWZpbmUgd2hpY2ggZ3JvdXBzIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSwgYXNzaWduIHBhcmFtZXRlcnMsIGV0Yy4uLgorICogPFAvPgorICogVGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFyZToKKyAqIDxVTD4KKyAqICA8TEk+LWQgPFRUPm91dHB1dGRpcjwvVFQ+OiBzcGVjaWZ5IHRoZSBvdXRwdXQgZGlyZWN0b3J5PC9MST4KKyAqICA8TEk+LXRlc3RjbGFzcyA8VFQ+Y2xhc3NfbmFtZTwvVFQ+OiBzcGVjaWZpZXMgb25lIG9yIHNldmVyYWwgY2xhc3MgbmFtZXMgPC9saT4KKyAqICA8TEk+LXRlc3RqYXIgPFRUPmphcl9uYW1lPC9UVD46IHNwZWNpZmllcyB0aGUgamFyIGNvbnRhaW5pbmcgdGhlIHRlc3RzPC9MST4KKyAqICA8TEk+LXNvdXJjZWRpciA8VFQ+c3JjMTtzcmMyPC9UVD46IDsgc2VwYXJhdGVkIGxpc3Qgb2Ygc291cmNlIGRpcmVjdG9yaWVzCisgKiAgICAodXNlZCBvbmx5IHdoZW4gamF2YWRvYyBhbm5vdGF0aW9ucyBhcmUgdXNlZCk8L0xJPgorICogIDxMST4tdGFyZ2V0PC9MST4KKyAqICA8TEk+LWdyb3VwczwvTEk+CisgKiAgPExJPi10ZXN0cnVuZmFjdG9yeTwvTEk+CisgKiAgPExJPi1saXN0ZW5lcjwvTEk+CisgKiA8L1VMPgorICogPFAvPgorICogUGxlYXNlIGNvbnN1bHQgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEZJWE1FOiBzaG91bGQgc3VwcG9ydCBtb3JlIHRoYW4gc2ltcGxlIHBhdGhzIGZvciBzdWl0ZSB4bWxzCisgKgorICogQHNlZSAjdXNhZ2UoKQorICoKKyAqIEBhdXRob3IgPGEgaHJlZiA9ICJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3RORyB7CisKKyAgLyoqIFRoaXMgY2xhc3MnIGxvZzR0ZXN0bmcgTG9nZ2VyLiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0TkcuY2xhc3MpOworCisgIC8qKiBUaGUgZGVmYXVsdCBuYW1lIGZvciBhIHN1aXRlIGxhdW5jaGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTU1BTkRfTElORV9TVUlURV9OQU1FID0gIkNvbW1hbmQgbGluZSBzdWl0ZSI7CisKKyAgLyoqIFRoZSBkZWZhdWx0IG5hbWUgZm9yIGEgdGVzdCBsYXVuY2hlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT01NQU5EX0xJTkVfVEVTVF9OQU1FID0gIkNvbW1hbmQgbGluZSB0ZXN0IjsKKworICAvKiogVGhlIGRlZmF1bHQgbmFtZSBvZiB0aGUgcmVzdWx0J3Mgb3V0cHV0IGRpcmVjdG9yeSAoa2VlcCBwdWJsaWMsIHVzZWQgYnkgRWNsaXBzZSkuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVURElSID0gInRlc3Qtb3V0cHV0IjsKKworICAvKiogU3lzdGVtIHByb3BlcnRpZXMgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19URVNUTkdfU1RBQ0tfRlJBTUVTID0gInRlc3RuZy5zaG93LnN0YWNrLmZyYW1lcyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NQQVRIID0gInRlc3RuZy50ZXN0LmNsYXNzcGF0aCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgVGVzdE5HIG1faW5zdGFuY2U7CisKKyAgcHJpdmF0ZSBzdGF0aWMgSkNvbW1hbmRlciBtX2pDb21tYW5kZXI7CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9jb21tYW5kTGluZU1ldGhvZHM7CisgIHByb3RlY3RlZCBMaXN0PFhtbFN1aXRlPiBtX3N1aXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8WG1sU3VpdGU+IG1fY21kbGluZVN1aXRlczsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9vdXRwdXREaXIgPSBERUZBVUxUX09VVFBVVERJUjsKKworICBwcml2YXRlIFN0cmluZ1tdIG1faW5jbHVkZWRHcm91cHM7CisgIHByaXZhdGUgU3RyaW5nW10gbV9leGNsdWRlZEdyb3VwczsKKworICBwcml2YXRlIEJvb2xlYW4gbV9pc0pVbml0ID0gWG1sU3VpdGUuREVGQVVMVF9KVU5JVDsKKyAgcHJpdmF0ZSBCb29sZWFuIG1faXNNaXhlZCA9IFhtbFN1aXRlLkRFRkFVTFRfTUlYRUQ7CisgIHByb3RlY3RlZCBib29sZWFuIG1fdXNlRGVmYXVsdExpc3RlbmVycyA9IHRydWU7CisKKyAgcHJpdmF0ZSBJVGVzdFJ1bm5lckZhY3RvcnkgbV90ZXN0UnVubmVyRmFjdG9yeTsKKworICAvLyBUaGVzZSBsaXN0ZW5lcnMgY2FuIGJlIG92ZXJyaWRkZW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lCisgIHByaXZhdGUgTGlzdDxJQ2xhc3NMaXN0ZW5lcj4gbV9jbGFzc0xpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8SVRlc3RMaXN0ZW5lcj4gbV90ZXN0TGlzdGVuZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTGlzdDxJU3VpdGVMaXN0ZW5lcj4gbV9zdWl0ZUxpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIFNldDxJUmVwb3J0ZXI+IG1fcmVwb3J0ZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSEFTX0ZBSUxVUkUgPSAxOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBIQVNfU0tJUFBFRCA9IDI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEhBU19GU1AgPSA0OworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBIQVNfTk9fVEVTVCA9IDg7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfVkVSQk9TRSA9IDE7CisKKyAgcHJpdmF0ZSBpbnQgbV9zdGF0dXM7CisgIHByaXZhdGUgYm9vbGVhbiBtX2hhc1Rlc3RzPSBmYWxzZTsKKworICBwcml2YXRlIFN0cmluZyBtX3NsYXZlZmlsZU5hbWUgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBtX21hc3RlcmZpbGVOYW1lID0gbnVsbDsKKworICAvLyBDb21tYW5kIGxpbmUgc3VpdGUgcGFyYW1ldGVycworICBwcml2YXRlIGludCBtX3RocmVhZENvdW50OworICBwcml2YXRlIGJvb2xlYW4gbV91c2VUaHJlYWRDb3VudDsKKyAgcHJpdmF0ZSBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgbV9wYXJhbGxlbE1vZGUgPSBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuRkFMU0U7CisgIHByaXZhdGUgU3RyaW5nIG1fY29uZmlnRmFpbHVyZVBvbGljeTsKKyAgcHJpdmF0ZSBDbGFzc1tdIG1fY29tbWFuZExpbmVUZXN0Q2xhc3NlczsKKworICBwcml2YXRlIFN0cmluZyBtX2RlZmF1bHRTdWl0ZU5hbWU9REVGQVVMVF9DT01NQU5EX0xJTkVfU1VJVEVfTkFNRTsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9kZWZhdWx0VGVzdE5hbWU9REVGQVVMVF9DT01NQU5EX0xJTkVfVEVTVF9OQU1FOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbV9tZXRob2REZXNjcmlwdG9ycyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHByaXZhdGUgSVRlc3RPYmplY3RGYWN0b3J5IG1fb2JqZWN0RmFjdG9yeTsKKworICBwcml2YXRlIExpc3Q8SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHJpdmF0ZSBJbnRlZ2VyIG1fZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQgPSBudWxsOworCisgIHByaXZhdGUgU3RyaW5nIG1famFyUGF0aDsKKyAgLyoqIFRoZSBwYXRoIG9mIHRoZSB0ZXN0bmcueG1sIGZpbGUgaW5zaWRlIHRoZSBqYXIgZmlsZSAqLworICBwcml2YXRlIFN0cmluZyBtX3htbFBhdGhJbkphciA9IENvbW1hbmRMaW5lQXJncy5YTUxfUEFUSF9JTl9KQVJfREVGQVVMVDsKKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX3N0cmluZ1N1aXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgSUhvb2thYmxlIG1faG9va2FibGU7CisgIHByaXZhdGUgSUNvbmZpZ3VyYWJsZSBtX2NvbmZpZ3VyYWJsZTsKKworICBwcm90ZWN0ZWQgbG9uZyBtX2VuZDsKKyAgcHJvdGVjdGVkIGxvbmcgbV9zdGFydDsKKworICBwcml2YXRlIExpc3Q8SUV4ZWN1dGlvbkxpc3RlbmVyPiBtX2V4ZWN1dGlvbkxpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgTGlzdDxJQWx0ZXJTdWl0ZUxpc3RlbmVyPiBtX2FsdGVyU3VpdGVMaXN0ZW5lcnM9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgYm9vbGVhbiBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU2V0dGluZyBhbHNvIHVzYWdlIG9mIGRlZmF1bHQgbGlzdGVuZXJzL3JlcG9ydGVycy4KKyAgICovCisgIHB1YmxpYyBUZXN0TkcoKSB7CisgICAgaW5pdCh0cnVlKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGJ5IG1hdmVuMiB0byBoYXZlIDAgb3V0cHV0IG9mIGFueSBraW5kIGNvbWUgb3V0CisgICAqIG9mIHRlc3RuZy4KKyAgICogQHBhcmFtIHVzZURlZmF1bHRMaXN0ZW5lcnMgV2hldGhlciBvciBub3QgYW55IGRlZmF1bHQgcmVwb3J0cworICAgKiBzaG91bGQgYmUgYWRkZWQgdG8gdGVzdHMuCisgICAqLworICBwdWJsaWMgVGVzdE5HKGJvb2xlYW4gdXNlRGVmYXVsdExpc3RlbmVycykgeworICAgIGluaXQodXNlRGVmYXVsdExpc3RlbmVycyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChib29sZWFuIHVzZURlZmF1bHRMaXN0ZW5lcnMpIHsKKyAgICBtX2luc3RhbmNlID0gdGhpczsKKworICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycyA9IHVzZURlZmF1bHRMaXN0ZW5lcnM7CisgICAgbV9jb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgeworICAgIG1fc3RhdHVzIHw9IHN0YXR1czsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnRzIHdpbGwgYmUgY3JlYXRlZC4KKyAgICogQHBhcmFtIG91dHB1dGRpciBUaGUgZGlyZWN0b3J5LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KGZpbmFsIFN0cmluZyBvdXRwdXRkaXIpIHsKKyAgICBpZiAoaXNTdHJpbmdOb3RFbXB0eShvdXRwdXRkaXIpKSB7CisgICAgICBtX291dHB1dERpciA9IG91dHB1dGRpcjsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSWYgdGhpcyBtZXRob2QgaXMgcGFzc2VkIHRydWUgYmVmb3JlIHJ1bigpLCB0aGUgZGVmYXVsdCBsaXN0ZW5lcnMKKyAgICogd2lsbCBub3QgYmUgdXNlZC4KKyAgICogPHVsPgorICAgKiA8bGk+b3JnLnRlc3RuZy5yZXBvcnRlcnMuVGVzdEhUTUxSZXBvcnRlcgorICAgKiA8bGk+b3JnLnRlc3RuZy5yZXBvcnRlcnMuSlVuaXRYTUxSZXBvcnRlcgorICAgKiA8bGk+b3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MUmVwb3J0ZXIKKyAgICogPC91bD4KKyAgICoKKyAgICogQHNlZSBvcmcudGVzdG5nLnJlcG9ydGVycy5UZXN0SFRNTFJlcG9ydGVyCisgICAqIEBzZWUgb3JnLnRlc3RuZy5yZXBvcnRlcnMuSlVuaXRYTUxSZXBvcnRlcgorICAgKiBAc2VlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGJvb2xlYW4gdXNlRGVmYXVsdExpc3RlbmVycykgeworICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycyA9IHVzZURlZmF1bHRMaXN0ZW5lcnM7CisgIH0KKworICAvKioKKyAgICogU2V0cyBhIGphciBjb250YWluaW5nIGEgdGVzdG5nLnhtbCBmaWxlLgorICAgKgorICAgKiBAcGFyYW0gamFyUGF0aAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGVzdEphcihTdHJpbmcgamFyUGF0aCkgeworICAgIG1famFyUGF0aCA9IGphclBhdGg7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgcGF0aCB0byB0aGUgWE1MIGZpbGUgaW4gdGhlIHRlc3QgamFyIGZpbGUuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRYbWxQYXRoSW5KYXIoU3RyaW5nIHhtbFBhdGhJbkphcikgeworICAgIG1feG1sUGF0aEluSmFyID0geG1sUGF0aEluSmFyOworICB9CisKKyAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVN1aXRlc0FuZEphckZpbGUoKSB7CisgICAgLy8gVGhlIEVjbGlwc2UgcGx1Zy1pbiAoUmVtb3RlVGVzdE5HKSBtaWdodCBoYXZlIGludm9rZWQgdGhpcyBtZXRob2QgYWxyZWFkeQorICAgIC8vIHNvIGRvbid0IGluaXRpYWxpemUgc3VpdGVzIHR3aWNlLgorICAgIGlmIChtX2lzSW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIGlmIChtX3N1aXRlcy5zaXplKCkgPiAwKSB7CisgICAgCS8vdG8gcGFyc2UgdGhlIHN1aXRlIGZpbGVzICg8c3VpdGUtZmlsZT4pLCBpZiBhbnkKKyAgICAJZm9yIChYbWxTdWl0ZSBzOiBtX3N1aXRlcykgeworICAgICAgICBmb3IgKFN0cmluZyBzdWl0ZUZpbGUgOiBzLmdldFN1aXRlRmlsZXMoKSkgeworICAgICAgICAgICAgUGF0aCByb290UGF0aCA9IFBhdGhzLmdldChzLmdldEZpbGVOYW1lKCkpLmdldFBhcmVudCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFhtbFN1aXRlPiBjaGlsZFN1aXRlcyA9IGdldFBhcnNlcihyb290UGF0aC5yZXNvbHZlKHN1aXRlRmlsZSkubm9ybWFsaXplKCkudG9TdHJpbmcoKSkucGFyc2UoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFhtbFN1aXRlIGNTdWl0ZSA6IGNoaWxkU3VpdGVzKXsKKyAgICAgICAgICAgICAgICAgICAgY1N1aXRlLnNldFBhcmVudFN1aXRlKHMpOworICAgICAgICAgICAgICAgICAgICBzLmdldENoaWxkU3VpdGVzKCkuYWRkKGNTdWl0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIHwgU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFBhcnNlIHRoZSBzdWl0ZXMgdGhhdCB3ZXJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgLy8KKyAgICBmb3IgKFN0cmluZyBzdWl0ZVBhdGggOiBtX3N0cmluZ1N1aXRlcykgeworICAgICAgaWYoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgTE9HR0VSLmRlYnVnKCJzdWl0ZVhtbFBhdGg6IFwiIiArIHN1aXRlUGF0aCArICJcIiIpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgQ29sbGVjdGlvbjxYbWxTdWl0ZT4gYWxsU3VpdGVzID0gZ2V0UGFyc2VyKHN1aXRlUGF0aCkucGFyc2UoKTsKKworICAgICAgICBmb3IgKFhtbFN1aXRlIHMgOiBhbGxTdWl0ZXMpIHsKKyAgICAgICAgICAvLyBJZiB0ZXN0IG5hbWVzIHdlcmUgc3BlY2lmaWVkLCBvbmx5IHJ1biB0aGVzZSB0ZXN0IG5hbWVzCisgICAgICAgICAgaWYgKG1fdGVzdE5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1fc3VpdGVzLmFkZChleHRyYWN0VGVzdE5hbWVzKHMsIG1fdGVzdE5hbWVzKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9zdWl0ZXMuYWRkKHMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2F0Y2goU0FYRXhjZXB0aW9uIHwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAvLyBQcm9iYWJseSBhIFlhbWwgZXhjZXB0aW9uLCB1bm5lc3QgaXQKKyAgICAgICAgVGhyb3dhYmxlIHQgPSBleDsKKyAgICAgICAgd2hpbGUgKHQuZ2V0Q2F1c2UoKSAhPSBudWxsKSB0ID0gdC5nZXRDYXVzZSgpOworLy8gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgVGVzdE5HRXhjZXB0aW9uKSB0aHJvdyAoVGVzdE5HRXhjZXB0aW9uKSB0OworICAgICAgICBlbHNlIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24odCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBqYXIgcGF0aAorICAgIC8vCisgICAgLy8gSWYgc3VpdGVzIHdlcmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIHN1aXRlIGZpbGUKKyAgICAvLyBpbnNpZGUgdGhhdCBqYXIgcGF0aAorICAgIGlmIChtX2phclBhdGggIT0gbnVsbCAmJiBtX3N0cmluZ1N1aXRlcy5zaXplKCkgPiAwKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHN1aXRlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3IgKFN0cmluZyBzIDogbV9zdHJpbmdTdWl0ZXMpIHsKKyAgICAgICAgc3VpdGVzLmFwcGVuZChzKTsKKyAgICAgIH0KKyAgICAgIFV0aWxzLmxvZygiVGVzdE5HIiwgMiwgIklnbm9yaW5nIHRoZSBYTUwgZmlsZSBpbnNpZGUgIiArIG1famFyUGF0aCArICIgYW5kIHVzaW5nICIKKyAgICAgICAgICArIHN1aXRlcyArICIgaW5zdGVhZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXNTdHJpbmdFbXB0eShtX2phclBhdGgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBhIGphciBmaWxlIGFuZCBubyBYTUwgZmlsZSB3YXMgc3BlY2lmaWVkOiB0cnkgdG8gZmluZCBhbiBYTUwgZmlsZSBpbnNpZGUgdGhlIGphcgorICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKG1famFyUGF0aCk7CisKKyAgICB0cnkgeworCisgICAgICBVdGlscy5sb2coIlRlc3RORyIsIDIsICJUcnlpbmcgdG8gb3BlbiBqYXIgZmlsZToiICsgamFyRmlsZSk7CisKKyAgICAgIGJvb2xlYW4gZm91bmRUZXN0bmdYbWwgPSBmYWxzZTsKKyAgICAgIExpc3Q8U3RyaW5nPiBjbGFzc2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICB0cnkgKEphckZpbGUgamYgPSBuZXcgSmFyRmlsZShqYXJGaWxlKSkgeworLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIHJlc3VsdDogIiArIGpmKTsKKyAgICAgICAgRW51bWVyYXRpb248SmFyRW50cnk+IGVudHJpZXMgPSBqZi5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgSmFyRW50cnkgamUgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgaWYgKGplLmdldE5hbWUoKS5lcXVhbHMobV94bWxQYXRoSW5KYXIpKSB7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKGpmLmdldElucHV0U3RyZWFtKGplKSk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFhtbFN1aXRlPiBzdWl0ZXMgPSBwYXJzZXIucGFyc2UoKTsKKyAgICAgICAgICAgIGZvciAoWG1sU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgICAgICAgICAgLy8gSWYgdGVzdCBuYW1lcyB3ZXJlIHNwZWNpZmllZCwgb25seSBydW4gdGhlc2UgdGVzdCBuYW1lcworICAgICAgICAgICAgICBpZiAobV90ZXN0TmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1fc3VpdGVzLmFkZChleHRyYWN0VGVzdE5hbWVzKHN1aXRlLCBtX3Rlc3ROYW1lcykpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fc3VpdGVzLmFkZChzdWl0ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm91bmRUZXN0bmdYbWwgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIGlmIChqZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICBpbnQgbiA9IGplLmdldE5hbWUoKS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpOworICAgICAgICAgICAgY2xhc3Nlcy5hZGQoamUuZ2V0TmFtZSgpLnJlcGxhY2UoIi8iLCAiLiIpLnN1YnN0cmluZygwLCBuKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoISBmb3VuZFRlc3RuZ1htbCkgeworICAgICAgICBVdGlscy5sb2coIlRlc3RORyIsIDEsCisgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCB0aGUgIiArIG1feG1sUGF0aEluSmFyICsgIiBpbiB0aGUgamFyIGZpbGUsIHJ1bm5pbmcgYWxsIHRoZSBjbGFzc2VzIik7CisgICAgICAgIFhtbFN1aXRlIHhtbFN1aXRlID0gbmV3IFhtbFN1aXRlKCk7CisgICAgICAgIHhtbFN1aXRlLnNldFZlcmJvc2UoMCk7CisgICAgICAgIHhtbFN1aXRlLnNldE5hbWUoIkphciBzdWl0ZSIpOworICAgICAgICBYbWxUZXN0IHhtbFRlc3QgPSBuZXcgWG1sVGVzdCh4bWxTdWl0ZSk7CisgICAgICAgIExpc3Q8WG1sQ2xhc3M+IHhtbENsYXNzZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY2xzIDogY2xhc3NlcykgeworICAgICAgICAgIFhtbENsYXNzIHhtbENsYXNzID0gbmV3IFhtbENsYXNzKGNscyk7CisgICAgICAgICAgeG1sQ2xhc3Nlcy5hZGQoeG1sQ2xhc3MpOworICAgICAgICB9CisgICAgICAgIHhtbFRlc3Quc2V0WG1sQ2xhc3Nlcyh4bWxDbGFzc2VzKTsKKyAgICAgICAgbV9zdWl0ZXMuYWRkKHhtbFN1aXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIHwgU0FYRXhjZXB0aW9uIGV4KSB7CisgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFBhcnNlciBnZXRQYXJzZXIoU3RyaW5nIHBhdGgpIHsKKyAgICBQYXJzZXIgcmVzdWx0ID0gbmV3IFBhcnNlcihwYXRoKTsKKyAgICBpbml0UHJvY2Vzc29yKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgUGFyc2VyIGdldFBhcnNlcihJbnB1dFN0cmVhbSBpcykgeworICAgIFBhcnNlciByZXN1bHQgPSBuZXcgUGFyc2VyKGlzKTsKKyAgICBpbml0UHJvY2Vzc29yKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc29yKFBhcnNlciByZXN1bHQpIHsKKyAgICByZXN1bHQuc2V0UG9zdFByb2Nlc3NvcihuZXcgT3ZlcnJpZGVQcm9jZXNzb3IobV9pbmNsdWRlZEdyb3VwcywgbV9leGNsdWRlZEdyb3VwcykpOworICB9CisKKyAgLyoqCisgICAqIElmIHRoZSBYbWxTdWl0ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGVzdCBuYW1lZCBhcyB0ZXN0TmFtZXMsIHJldHVybgorICAgKiBhbiBYbWxTdWl0ZSB0aGF0J3MgbWFkZSBvbmx5IG9mIHRoZXNlIHRlc3RzLCBvdGhlcndpc2UsIHJldHVybiB0aGUKKyAgICogb3JpZ2luYWwgc3VpdGUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBYbWxTdWl0ZSBleHRyYWN0VGVzdE5hbWVzKFhtbFN1aXRlIHMsIExpc3Q8U3RyaW5nPiB0ZXN0TmFtZXMpIHsKKyAgICBleHRyYWN0VGVzdE5hbWVzRnJvbUNoaWxkU3VpdGVzKHMsIHRlc3ROYW1lcyk7CisKKyAgICBMaXN0PFhtbFRlc3Q+IHRlc3RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChYbWxUZXN0IHh0IDogcy5nZXRUZXN0cygpKSB7CisgICAgICBmb3IgKFN0cmluZyB0biA6IHRlc3ROYW1lcykgeworICAgICAgICBpZiAoeHQuZ2V0TmFtZSgpLmVxdWFscyh0bikpIHsKKyAgICAgICAgICB0ZXN0cy5hZGQoeHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRlc3RzLnNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBYbWxTdWl0ZSByZXN1bHQgPSAoWG1sU3VpdGUpIHMuY2xvbmUoKTsKKyAgICAgIHJlc3VsdC5nZXRUZXN0cygpLmNsZWFyKCk7CisgICAgICByZXN1bHQuZ2V0VGVzdHMoKS5hZGRBbGwodGVzdHMpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4dHJhY3RUZXN0TmFtZXNGcm9tQ2hpbGRTdWl0ZXMoWG1sU3VpdGUgcywgTGlzdDxTdHJpbmc+IHRlc3ROYW1lcykgeworICAgIExpc3Q8WG1sU3VpdGU+IGNoaWxkU3VpdGVzID0gcy5nZXRDaGlsZFN1aXRlcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRTdWl0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIFhtbFN1aXRlIGNoaWxkID0gY2hpbGRTdWl0ZXMuZ2V0KGkpOworICAgICAgWG1sU3VpdGUgZXh0cmFjdGVkID0gZXh0cmFjdFRlc3ROYW1lcyhjaGlsZCwgdGVzdE5hbWVzKTsKKyAgICAgIC8vIGlmIGEgbmV3IHhtbCBzdWl0ZSBpcyBjcmVhdGVkLCB3aGljaCBtZWFucyBzb21lIHRlc3RzIHdhcyBleHRyYWN0ZWQsIHRoZW4gd2UgcmVwbGFjZSB0aGUgY2hpbGQKKyAgICAgIGlmIChleHRyYWN0ZWQgIT0gY2hpbGQpIHsKKyAgICAgICAgY2hpbGRTdWl0ZXMuc2V0KGksIGV4dHJhY3RlZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERlZmluZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRocmVhZCBwb29sLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGhyZWFkQ291bnQoaW50IHRocmVhZENvdW50KSB7CisgICAgaWYodGhyZWFkQ291bnQgPCAxKSB7CisgICAgICBleGl0V2l0aEVycm9yKCJDYW5ub3QgdXNlIGEgdGhyZWFkQ291bnQgcGFyYW1ldGVyIGxlc3MgdGhhbiAxOyAxID4gIiArIHRocmVhZENvdW50KTsKKyAgICB9CisKKyAgICBtX3RocmVhZENvdW50ID0gdGhyZWFkQ291bnQ7CisgICAgbV91c2VUaHJlYWRDb3VudCA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogRGVmaW5lIHdoZXRoZXIgdGhpcyBydW4gd2lsbCBiZSBydW4gaW4gcGFyYWxsZWwgbW9kZS4KKyAgICogQGRlcHJlY2F0ZWQgVXNlICNzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUpIGluc3RlYWQKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldFBhcmFsbGVsKFN0cmluZyBwYXJhbGxlbCkgeworICAgIGlmIChwYXJhbGxlbCA9PSBudWxsKSB7CisgICAgICBzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICBzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuZ2V0VmFsaWRQYXJhbGxlbChwYXJhbGxlbCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmFsbGVsKFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBwYXJhbGxlbCkgeworICAgIG1fcGFyYWxsZWxNb2RlID0gcGFyYWxsZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kTGluZVN1aXRlKFhtbFN1aXRlIHN1aXRlKSB7CisgICAgbV9jbWRsaW5lU3VpdGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgbV9jbWRsaW5lU3VpdGVzLmFkZChzdWl0ZSk7CisgICAgbV9zdWl0ZXMuYWRkKHN1aXRlKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHRlc3QgY2xhc3NlcyB0byBiZSBydW4gYnkgdGhpcyBUZXN0Tkcgb2JqZWN0LiAgVGhpcyBtZXRob2QKKyAgICogd2lsbCBjcmVhdGUgYSBkdW1teSBzdWl0ZSB0aGF0IHdpbGwgd3JhcCB0aGVzZSBjbGFzc2VzIGNhbGxlZAorICAgKiAiQ29tbWFuZCBMaW5lIFRlc3QiLgorICAgKiA8cC8+CisgICAqIElmIHVzZWQgdG9nZXRoZXIgd2l0aCB0aHJlYWRDb3VudCwgcGFyYWxsZWwsIGdyb3VwcywgZXhjbHVkZWRHcm91cHMgdGhhbiB0aGlzIG9uZSBtdXN0IGJlIHNldCBmaXJzdC4KKyAgICoKKyAgICogQHBhcmFtIGNsYXNzZXMgQW4gYXJyYXkgb2YgY2xhc3NlcyB0aGF0IGNvbnRhaW4gVGVzdE5HIGFubm90YXRpb25zLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGVzdENsYXNzZXMoQ2xhc3NbXSBjbGFzc2VzKSB7CisgICAgbV9zdWl0ZXMuY2xlYXIoKTsKKyAgICBtX2NvbW1hbmRMaW5lVGVzdENsYXNzZXMgPSBjbGFzc2VzOworICB9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgc3RyaW5nIGNvbS5leGFtcGxlLkZvby5mMSwgcmV0dXJuIGFuIGFycmF5IHdoZXJlIFswXSBpcyB0aGUgY2xhc3MgYW5kIFsxXQorICAgKiBpcyB0aGUgbWV0aG9kLgorICAgKi8KKyAgcHJpdmF0ZSBTdHJpbmdbXSBzcGxpdE1ldGhvZChTdHJpbmcgbSkgeworICAgIGludCBpbmRleCA9IG0ubGFzdEluZGV4T2YoIi4iKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJCYWQgZm9ybWF0IGZvciBjb21tYW5kIGxpbmUgbWV0aG9kOiIgKyBtCisgICAgICAgICAgKyAiLCBleHBlY3RlZCA8Y2xhc3M+LjxtZXRob2Q+Iik7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IG0uc3Vic3RyaW5nKDAsIGluZGV4KSwgbS5zdWJzdHJpbmcoaW5kZXggKyAxKS5yZXBsYWNlQWxsKCJcXCoiLCAiXFwuXFwqIikgfTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBYbWxTdWl0ZSBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBsaXN0IG9mIGNsYXNzZXMgYW5kIG1ldGhvZHMgcGFzc2VkCisgICAqIGluIHBhcmFtZXRlci4KKyAgICoKKyAgICogQHBhcmFtIGNvbW1hbmRMaW5lTWV0aG9kcyBhIHN0cmluZyB3aXRoIHRoZSBmb3JtICJjb20uZXhhbXBsZS5Gb28uZjEsY29tLmV4YW1wbGUuQmFyLmYyIgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PFhtbFN1aXRlPiBjcmVhdGVDb21tYW5kTGluZVN1aXRlc0Zvck1ldGhvZHMoTGlzdDxTdHJpbmc+IGNvbW1hbmRMaW5lTWV0aG9kcykgeworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSA8Y2xhc3Nlcz4gdGFnCisgICAgLy8KKyAgICBTZXQ8Q2xhc3M+IGNsYXNzZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKFN0cmluZyBtIDogY29tbWFuZExpbmVNZXRob2RzKSB7CisgICAgICBDbGFzcyBjID0gQ2xhc3NIZWxwZXIuZm9yTmFtZShzcGxpdE1ldGhvZChtKVswXSk7CisgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgY2xhc3Nlcy5hZGQoYyk7CisgICAgICB9CisgICAgfQorCisgICAgTGlzdDxYbWxTdWl0ZT4gcmVzdWx0ID0gY3JlYXRlQ29tbWFuZExpbmVTdWl0ZXNGb3JDbGFzc2VzKGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pKTsKKworICAgIC8vCisgICAgLy8gQWRkIHRoZSBtZXRob2QgdGFncworICAgIC8vCisgICAgTGlzdDxYbWxDbGFzcz4geG1sQ2xhc3NlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoWG1sU3VpdGUgcyA6IHJlc3VsdCkgeworICAgICAgICBmb3IgKFhtbFRlc3QgdCA6IHMuZ2V0VGVzdHMoKSkgeworICAgICAgICAgICAgeG1sQ2xhc3Nlcy5hZGRBbGwodC5nZXRDbGFzc2VzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChYbWxDbGFzcyB4YyA6IHhtbENsYXNzZXMpIHsKKyAgICAgIGZvciAoU3RyaW5nIG0gOiBjb21tYW5kTGluZU1ldGhvZHMpIHsKKyAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBzcGxpdE1ldGhvZChtKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHNwbGl0WzBdOworICAgICAgICBpZiAoeGMuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7CisgICAgICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlZE1ldGhvZCA9IG5ldyBYbWxJbmNsdWRlKHNwbGl0WzFdKTsKKyAgICAgICAgICB4Yy5nZXRJbmNsdWRlZE1ldGhvZHMoKS5hZGQoaW5jbHVkZWRNZXRob2QpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxYbWxTdWl0ZT4gY3JlYXRlQ29tbWFuZExpbmVTdWl0ZXNGb3JDbGFzc2VzKENsYXNzW10gY2xhc3NlcykgeworICAgIC8vCisgICAgLy8gU2VlIGlmIGFueSBvZiB0aGUgY2xhc3NlcyBoYXMgYW4geG1sU3VpdGUgb3IgeG1sVGVzdCBhdHRyaWJ1dGUuCisgICAgLy8gSWYgaXQgZG9lcywgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBYbWxTdWl0ZSwgb3RoZXJ3aXNlLCBjcmVhdGUKKyAgICAvLyB0aGUgZGVmYXVsdCBvbmUKKyAgICAvLworICAgIFhtbENsYXNzW10geG1sQ2xhc3NlcyA9IFV0aWxzLmNsYXNzZXNUb1htbENsYXNzZXMoY2xhc3Nlcyk7CisgICAgTWFwPFN0cmluZywgWG1sU3VpdGU+IHN1aXRlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciA9IG1fY29uZmlndXJhdGlvbi5nZXRBbm5vdGF0aW9uRmluZGVyKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIENsYXNzIGMgPSBjbGFzc2VzW2ldOworICAgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3QgPSBmaW5kZXIuZmluZEFubm90YXRpb24oYywgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgIFN0cmluZyBzdWl0ZU5hbWUgPSBnZXREZWZhdWx0U3VpdGVOYW1lKCk7CisgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBnZXREZWZhdWx0VGVzdE5hbWUoKTsKKyAgICAgIGJvb2xlYW4gaXNKVW5pdCA9IGZhbHNlOworICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgeworICAgICAgICBzdWl0ZU5hbWUgPSBkZWZhdWx0SWZTdHJpbmdFbXB0eSh0ZXN0LmdldFN1aXRlTmFtZSgpLCBzdWl0ZU5hbWUpOworICAgICAgICB0ZXN0TmFtZSA9IGRlZmF1bHRJZlN0cmluZ0VtcHR5KHRlc3QuZ2V0VGVzdE5hbWUoKSwgdGVzdE5hbWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1faXNNaXhlZCAmJiBKVW5pdFRlc3RGaW5kZXIuaXNKVW5pdFRlc3QoYykpIHsKKyAgICAgICAgICBpc0pVbml0ID0gdHJ1ZTsKKyAgICAgICAgICB0ZXN0TmFtZSA9IGMuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBYbWxTdWl0ZSB4bWxTdWl0ZSA9IHN1aXRlcy5nZXQoc3VpdGVOYW1lKTsKKyAgICAgIGlmICh4bWxTdWl0ZSA9PSBudWxsKSB7CisgICAgICAgIHhtbFN1aXRlID0gbmV3IFhtbFN1aXRlKCk7CisgICAgICAgIHhtbFN1aXRlLnNldE5hbWUoc3VpdGVOYW1lKTsKKyAgICAgICAgc3VpdGVzLnB1dChzdWl0ZU5hbWUsIHhtbFN1aXRlKTsKKyAgICAgIH0KKworICAgICAgaWYgKG1fZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQgIT0gbnVsbCkgeworICAgICAgICB4bWxTdWl0ZS5zZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudChtX2RhdGFQcm92aWRlclRocmVhZENvdW50KTsKKyAgICAgIH0KKyAgICAgIFhtbFRlc3QgeG1sVGVzdCA9IG51bGw7CisgICAgICBmb3IgKFhtbFRlc3QgeHQgIDogeG1sU3VpdGUuZ2V0VGVzdHMoKSkgeworICAgICAgICBpZiAoeHQuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0TmFtZSkpIHsKKyAgICAgICAgICB4bWxUZXN0ID0geHQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHhtbFRlc3QgPT0gbnVsbCkgeworICAgICAgICB4bWxUZXN0ID0gbmV3IFhtbFRlc3QoeG1sU3VpdGUpOworICAgICAgICB4bWxUZXN0LnNldE5hbWUodGVzdE5hbWUpOworICAgICAgICB4bWxUZXN0LnNldEpVbml0KGlzSlVuaXQpOworICAgICAgfQorCisgICAgICB4bWxUZXN0LmdldFhtbENsYXNzZXMoKS5hZGQoeG1sQ2xhc3Nlc1tpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihzdWl0ZXMudmFsdWVzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkTWV0aG9kU2VsZWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgaW50IHByaW9yaXR5KSB7CisgICAgbV9tZXRob2REZXNjcmlwdG9ycy5wdXQoY2xhc3NOYW1lLCBwcmlvcml0eSk7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBzdWl0ZXMgZmlsZSBuYW1lcyB0byBiZSBydW4gYnkgdGhpcyBUZXN0Tkcgb2JqZWN0LiBUaGlzIG1ldGhvZCB0cmllcyB0byBsb2FkIGFuZAorICAgKiBwYXJzZSB0aGUgc3BlY2lmaWVkIFRlc3RORyBzdWl0ZSB4bWwgZmlsZXMuIElmIGEgZmlsZSBpcyBtaXNzaW5nLCBpdCBpcyBpZ25vcmVkLgorICAgKgorICAgKiBAcGFyYW0gc3VpdGVzIEEgbGlzdCBvZiBwYXRocyB0byBvbmUgbW9yZSBYTUwgZmlsZXMgZGVmaW5pbmcgdGhlIHRlc3RzLiAgRm9yIGV4YW1wbGU6CisgICAqCisgICAqIDxwcmU+CisgICAqIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAqIExpc3Q8U3RyaW5nPiBzdWl0ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICogc3VpdGVzLmFkZCgiYzovdGVzdHMvdGVzdG5nMS54bWwiKTsKKyAgICogc3VpdGVzLmFkZCgiYzovdGVzdHMvdGVzdG5nMi54bWwiKTsKKyAgICogdG5nLnNldFRlc3RTdWl0ZXMoc3VpdGVzKTsKKyAgICogdG5nLnJ1bigpOworICAgKiA8L3ByZT4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRlc3RTdWl0ZXMoTGlzdDxTdHJpbmc+IHN1aXRlcykgeworICAgIG1fc3RyaW5nU3VpdGVzID0gc3VpdGVzOworICB9CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGUgWG1sU3VpdGUgb2JqZWN0cyB0byBydW4uCisgICAqIEBwYXJhbSBzdWl0ZXMKKyAgICogQHNlZSBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0WG1sU3VpdGVzKExpc3Q8WG1sU3VpdGU+IHN1aXRlcykgeworICAgIG1fc3VpdGVzID0gc3VpdGVzOworICB9CisKKyAgLyoqCisgICAqIERlZmluZSB3aGljaCBncm91cHMgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoaXMgcnVuLgorICAgKgorICAgKiBAcGFyYW0gZ3JvdXBzIEEgbGlzdCBvZiBncm91cCBuYW1lcyBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkR3JvdXBzKFN0cmluZyBncm91cHMpIHsKKyAgICBtX2V4Y2x1ZGVkR3JvdXBzID0gVXRpbHMuc3BsaXQoZ3JvdXBzLCAiLCIpOworICB9CisKKworICAvKioKKyAgICogRGVmaW5lIHdoaWNoIGdyb3VwcyB3aWxsIGJlIGluY2x1ZGVkIGZyb20gdGhpcyBydW4uCisgICAqCisgICAqIEBwYXJhbSBncm91cHMgQSBsaXN0IG9mIGdyb3VwIG5hbWVzIHNlcGFyYXRlZCBieSBhIGNvbW1hLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFN0cmluZyBncm91cHMpIHsKKyAgICBtX2luY2x1ZGVkR3JvdXBzID0gVXRpbHMuc3BsaXQoZ3JvdXBzLCAiLCIpOworICB9CisKKworICBwcml2YXRlIHZvaWQgc2V0VGVzdFJ1bm5lckZhY3RvcnlDbGFzcyhDbGFzcyB0ZXN0UnVubmVyRmFjdG9yeUNsYXNzKSB7CisgICAgc2V0VGVzdFJ1bm5lckZhY3RvcnkoKElUZXN0UnVubmVyRmFjdG9yeSkgQ2xhc3NIZWxwZXIubmV3SW5zdGFuY2UodGVzdFJ1bm5lckZhY3RvcnlDbGFzcykpOworICB9CisKKworICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXN0UnVubmVyRmFjdG9yeShJVGVzdFJ1bm5lckZhY3RvcnkgaXRyZikgeworICAgIG1fdGVzdFJ1bm5lckZhY3Rvcnk9IGl0cmY7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRPYmplY3RGYWN0b3J5KENsYXNzIGMpIHsKKyAgICBtX29iamVjdEZhY3RvcnkgPSAoSVRlc3RPYmplY3RGYWN0b3J5KSBDbGFzc0hlbHBlci5uZXdJbnN0YW5jZShjKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE9iamVjdEZhY3RvcnkoSVRlc3RPYmplY3RGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICBtX29iamVjdEZhY3RvcnkgPSBmYWN0b3J5OworICB9CisKKyAgLyoqCisgICAqIERlZmluZSB3aGljaCBsaXN0ZW5lcnMgdG8gdXNlciBmb3IgdGhpcyBydW4uCisgICAqCisgICAqIEBwYXJhbSBjbGFzc2VzIEEgbGlzdCBvZiBjbGFzc2VzLCB3aGljaCBtdXN0IGJlIGVpdGhlciBJU3VpdGVMaXN0ZW5lciwKKyAgICogSVRlc3RMaXN0ZW5lciBvciBJUmVwb3J0ZXIKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3NlcyhMaXN0PENsYXNzPiBjbGFzc2VzKSB7CisgICAgZm9yIChDbGFzcyBjbHM6IGNsYXNzZXMpIHsKKyAgICAgIGFkZExpc3RlbmVyKENsYXNzSGVscGVyLm5ld0luc3RhbmNlKGNscykpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcikgeworICAgIGlmICghIChsaXN0ZW5lciBpbnN0YW5jZW9mIElUZXN0TkdMaXN0ZW5lcikpCisgICAgeworICAgICAgZXhpdFdpdGhFcnJvcigiTGlzdGVuZXIgIiArIGxpc3RlbmVyCisgICAgICAgICAgKyAiIG11c3QgYmUgb25lIG9mIElUZXN0TGlzdGVuZXIsIElTdWl0ZUxpc3RlbmVyLCBJUmVwb3J0ZXIsICIKKyAgICAgICAgICArICIgSUFubm90YXRpb25UcmFuc2Zvcm1lciwgSU1ldGhvZEludGVyY2VwdG9yIG9yIElJbnZva2VkTWV0aG9kTGlzdGVuZXIiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJU3VpdGVMaXN0ZW5lcikgeworICAgICAgICBhZGRMaXN0ZW5lcigoSVN1aXRlTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElUZXN0TGlzdGVuZXIpIHsKKyAgICAgICAgYWRkTGlzdGVuZXIoKElUZXN0TGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDbGFzc0xpc3RlbmVyKSB7CisgICAgICAgIGFkZExpc3RlbmVyKChJQ2xhc3NMaXN0ZW5lcikgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSVJlcG9ydGVyKSB7CisgICAgICAgIGFkZExpc3RlbmVyKChJUmVwb3J0ZXIpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIpIHsKKyAgICAgICAgc2V0QW5ub3RhdGlvblRyYW5zZm9ybWVyKChJQW5ub3RhdGlvblRyYW5zZm9ybWVyKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJTWV0aG9kSW50ZXJjZXB0b3IpIHsKKyAgICAgICAgbV9tZXRob2RJbnRlcmNlcHRvcnMuYWRkKChJTWV0aG9kSW50ZXJjZXB0b3IpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElJbnZva2VkTWV0aG9kTGlzdGVuZXIpIHsKKyAgICAgICAgYWRkSW52b2tlZE1ldGhvZExpc3RlbmVyKChJSW52b2tlZE1ldGhvZExpc3RlbmVyKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJSG9va2FibGUpIHsKKyAgICAgICAgc2V0SG9va2FibGUoKElIb29rYWJsZSkgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgeworICAgICAgICBzZXRDb25maWd1cmFibGUoKElDb25maWd1cmFibGUpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcikgeworICAgICAgICBhZGRFeGVjdXRpb25MaXN0ZW5lcigoSUV4ZWN1dGlvbkxpc3RlbmVyKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGdldENvbmZpZ3VyYXRpb24oKS5hZGRDb25maWd1cmF0aW9uTGlzdGVuZXIoKElDb25maWd1cmF0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElBbHRlclN1aXRlTGlzdGVuZXIpIHsKKyAgICAgICAgYWRkQWx0ZXJTdWl0ZUxpc3RlbmVyKChJQWx0ZXJTdWl0ZUxpc3RlbmVyKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUludm9rZWRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIG1faW52b2tlZE1ldGhvZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVN1aXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAobnVsbCAhPSBsaXN0ZW5lcikgeworICAgICAgbV9zdWl0ZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAobnVsbCAhPSBsaXN0ZW5lcikgeworICAgICAgbV90ZXN0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNsYXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAobnVsbCAhPSBsaXN0ZW5lcikgeworICAgICAgbV9jbGFzc0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElSZXBvcnRlciBsaXN0ZW5lcikgeworICAgIGlmIChudWxsICE9IGxpc3RlbmVyKSB7CisgICAgICBtX3JlcG9ydGVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEludm9rZWRNZXRob2RMaXN0ZW5lcihJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgIH0KKworICBwdWJsaWMgU2V0PElSZXBvcnRlcj4gZ2V0UmVwb3J0ZXJzKCkgeworICAgIHJldHVybiBtX3JlcG9ydGVyczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PElUZXN0TGlzdGVuZXI+IGdldFRlc3RMaXN0ZW5lcnMoKSB7CisgICAgcmV0dXJuIG1fdGVzdExpc3RlbmVyczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PElTdWl0ZUxpc3RlbmVyPiBnZXRTdWl0ZUxpc3RlbmVycygpIHsKKyAgICByZXR1cm4gbV9zdWl0ZUxpc3RlbmVyczsKKyAgfQorCisgIC8qKiBJZiBtX3ZlcmJvc2UgZ2V0cyBzZXQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZlcmJvc2Ugc2V0dGluZyBpbiB0ZXN0bmcueG1sICovCisgIHByaXZhdGUgSW50ZWdlciBtX3ZlcmJvc2UgPSBudWxsOworCisgIHByaXZhdGUgZmluYWwgSUFubm90YXRpb25UcmFuc2Zvcm1lciBtX2RlZmF1bHRBbm5vUHJvY2Vzc29yID0gbmV3IERlZmF1bHRBbm5vdGF0aW9uVHJhbnNmb3JtZXIoKTsKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIG1fYW5ub3RhdGlvblRyYW5zZm9ybWVyID0gbV9kZWZhdWx0QW5ub1Byb2Nlc3NvcjsKKworICBwcml2YXRlIEJvb2xlYW4gbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IGZhbHNlOworCisgIHByaXZhdGUgTGlzdDxJTWV0aG9kSW50ZXJjZXB0b3I+IG1fbWV0aG9kSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kSW50ZXJjZXB0b3I+KCk7CisKKyAgLyoqIFRoZSBsaXN0IG9mIHRlc3QgbmFtZXMgdG8gcnVuIGZyb20gdGhlIGdpdmVuIHN1aXRlICovCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fdGVzdE5hbWVzOworCisgIHByaXZhdGUgSW50ZWdlciBtX3N1aXRlVGhyZWFkUG9vbFNpemUgPSBDb21tYW5kTGluZUFyZ3MuU1VJVEVfVEhSRUFEX1BPT0xfU0laRV9ERUZBVUxUOworCisgIHByaXZhdGUgYm9vbGVhbiBtX3JhbmRvbWl6ZVN1aXRlcyA9IEJvb2xlYW4uRkFMU0U7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1fcHJlc2VydmVPcmRlciA9IGZhbHNlOworICBwcml2YXRlIEJvb2xlYW4gbV9ncm91cEJ5SW5zdGFuY2VzOworCisgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb24gbV9jb25maWd1cmF0aW9uOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBsZXZlbCBvZiB2ZXJib3NpdHkuIFRoaXMgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAqIGluIHRoZSB0ZXN0IHN1aXRlcy4KKyAgICoKKyAgICogQHBhcmFtIHZlcmJvc2UgdGhlIHZlcmJvc2l0eSBsZXZlbCAoMCB0byAxMCB3aGVyZSAxMCBpcyBtb3N0IGRldGFpbGVkKQorICAgKiBBY3R1YWxseSwgdGhpcyBpcyBhIGxpZTogIHlvdSBjYW4gc3BlY2lmeSAtMSBhbmQgdGhpcyB3aWxsIHB1dCBUZXN0TkcKKyAgICogaW4gZGVidWcgbW9kZSAobm8gbG9uZ2VyIHNsaWNpbmcgb2ZmIHN0YWNrIHRyYWNlcyBhbmQgYWxsKS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoaW50IHZlcmJvc2UpIHsKKyAgICBtX3ZlcmJvc2UgPSB2ZXJib3NlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb21tYW5kTGluZVN1aXRlcygpIHsKKyAgICBpZiAobV9jb21tYW5kTGluZVRlc3RDbGFzc2VzICE9IG51bGwgfHwgbV9jb21tYW5kTGluZU1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgaWYgKG51bGwgIT0gbV9jb21tYW5kTGluZU1ldGhvZHMpIHsKKyAgICAgICAgbV9jbWRsaW5lU3VpdGVzID0gY3JlYXRlQ29tbWFuZExpbmVTdWl0ZXNGb3JNZXRob2RzKG1fY29tbWFuZExpbmVNZXRob2RzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBtX2NtZGxpbmVTdWl0ZXMgPSBjcmVhdGVDb21tYW5kTGluZVN1aXRlc0ZvckNsYXNzZXMobV9jb21tYW5kTGluZVRlc3RDbGFzc2VzKTsKKyAgICAgIH0KKworICAgICAgZm9yIChYbWxTdWl0ZSBzIDogbV9jbWRsaW5lU3VpdGVzKSB7CisgICAgICAgIGZvciAoWG1sVGVzdCB0IDogcy5nZXRUZXN0cygpKSB7CisgICAgICAgICAgdC5zZXRQcmVzZXJ2ZU9yZGVyKFN0cmluZy52YWx1ZU9mKG1fcHJlc2VydmVPcmRlcikpOworICAgICAgICB9CisgICAgICAgIG1fc3VpdGVzLmFkZChzKTsKKyAgICAgICAgaWYgKG1fZ3JvdXBCeUluc3RhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgcy5zZXRHcm91cEJ5SW5zdGFuY2VzKG1fZ3JvdXBCeUluc3RhbmNlcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbW1hbmRMaW5lU3VpdGVzUGFyYW1zKCkgeworICAgIGlmKG51bGwgPT0gbV9jbWRsaW5lU3VpdGVzKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChYbWxTdWl0ZSBzIDogbV9jbWRsaW5lU3VpdGVzKSB7CisgICAgICBpZihtX3VzZVRocmVhZENvdW50KSB7CisgICAgICAgIHMuc2V0VGhyZWFkQ291bnQobV90aHJlYWRDb3VudCk7CisgICAgICB9CisgICAgICBzLnNldFBhcmFsbGVsKG1fcGFyYWxsZWxNb2RlKTsKKyAgICAgIGlmKG1fY29uZmlnRmFpbHVyZVBvbGljeSAhPSBudWxsKSB7CisgICAgICAgIHMuc2V0Q29uZmlnRmFpbHVyZVBvbGljeShtX2NvbmZpZ0ZhaWx1cmVQb2xpY3kudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbW1hbmRMaW5lU3VpdGVzR3JvdXBzKCkgeworICAgIC8vIElmIGdyb3VwcyB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHNob3VsZCBvdmVycmlkZSBncm91cHMKKyAgICAvLyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBmaWxlCisgICAgYm9vbGVhbiBoYXNJbmNsdWRlZEdyb3VwcyA9IG51bGwgIT0gbV9pbmNsdWRlZEdyb3VwcyAmJiBtX2luY2x1ZGVkR3JvdXBzLmxlbmd0aCA+IDA7CisgICAgYm9vbGVhbiBoYXNFeGNsdWRlZEdyb3VwcyA9IG51bGwgIT0gbV9leGNsdWRlZEdyb3VwcyAmJiBtX2V4Y2x1ZGVkR3JvdXBzLmxlbmd0aCA+IDA7CisgICAgTGlzdDxYbWxTdWl0ZT4gc3VpdGVzID0gbV9jbWRsaW5lU3VpdGVzICE9IG51bGwgPyBtX2NtZGxpbmVTdWl0ZXMgOiBtX3N1aXRlczsKKyAgICBpZiAoaGFzSW5jbHVkZWRHcm91cHMgfHwgaGFzRXhjbHVkZWRHcm91cHMpIHsKKyAgICAgIGZvciAoWG1sU3VpdGUgcyA6IHN1aXRlcykgeworICAgICAgICAvL3NldCBvbiBlYWNoIHRlc3QsIGluc3RlYWQgb2YganVzdCB0aGUgZmlyc3Qgb25lIG9mIHRoZSBzdWl0ZQorICAgICAgICBmb3IgKFhtbFRlc3QgdCA6IHMuZ2V0VGVzdHMoKSkgeworICAgICAgICAgIGlmKGhhc0luY2x1ZGVkR3JvdXBzKSB7CisgICAgICAgICAgICB0LnNldEluY2x1ZGVkR3JvdXBzKEFycmF5cy5hc0xpc3QobV9pbmNsdWRlZEdyb3VwcykpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihoYXNFeGNsdWRlZEdyb3VwcykgeworICAgICAgICAgICAgdC5zZXRFeGNsdWRlZEdyb3VwcyhBcnJheXMuYXNMaXN0KG1fZXhjbHVkZWRHcm91cHMpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpdmF0ZSB2b2lkIGFkZFJlcG9ydGVyKENsYXNzPD8gZXh0ZW5kcyBJUmVwb3J0ZXI+IHIpIHsKKyAgICBtX3JlcG9ydGVycy5hZGQoQ2xhc3NIZWxwZXIubmV3SW5zdGFuY2UocikpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0TGlzdGVuZXJzKCkgeworICAgIG1fdGVzdExpc3RlbmVycy5hZGQobmV3IEV4aXRDb2RlTGlzdGVuZXIodGhpcykpOworCisgICAgaWYgKG1fdXNlRGVmYXVsdExpc3RlbmVycykgeworICAgICAgYWRkUmVwb3J0ZXIoU3VpdGVIVE1MUmVwb3J0ZXIuY2xhc3MpOworICAgICAgYWRkUmVwb3J0ZXIoTWFpbi5jbGFzcyk7CisgICAgICBhZGRSZXBvcnRlcihGYWlsZWRSZXBvcnRlci5jbGFzcyk7CisgICAgICBhZGRSZXBvcnRlcihYTUxSZXBvcnRlci5jbGFzcyk7CisgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvbGRUZXN0bmdFbWFpbGFibGVSZXBvcnRlciIpICE9IG51bGwpIHsKKyAgICAgICAgYWRkUmVwb3J0ZXIoRW1haWxhYmxlUmVwb3J0ZXIuY2xhc3MpOworICAgICAgfSBlbHNlIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm5vRW1haWxhYmxlUmVwb3J0ZXIiKSA9PSBudWxsKSB7CisgICAgICAgIGFkZFJlcG9ydGVyKEVtYWlsYWJsZVJlcG9ydGVyMi5jbGFzcyk7CisgICAgICB9CisgICAgICBhZGRSZXBvcnRlcihKVW5pdFJlcG9ydFJlcG9ydGVyLmNsYXNzKTsKKyAgICAgIGlmIChtX3ZlcmJvc2UgIT0gbnVsbCAmJiBtX3ZlcmJvc2UgPiA0KSB7CisgICAgICAgIGFkZExpc3RlbmVyKG5ldyBWZXJib3NlUmVwb3J0ZXIoIltUZXN0TkddICIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgSVRlc3RPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBtX29iamVjdEZhY3Rvcnk7CisgICAgLy8KKyAgICAvLyBJbnN0YWxsIHRoZSBsaXN0ZW5lcnMgZm91bmQgaW4gU2VydmljZUxvYWRlciAob3IgdXNlIHRoZSBjbGFzcworICAgIC8vIGxvYWRlciBmb3IgdGVzdHMsIGlmIHNwZWNpZmllZCkuCisgICAgLy8KKyAgICBhZGRTZXJ2aWNlTG9hZGVyTGlzdGVuZXJzKCk7CisKKyAgICAvLworICAgIC8vIEluc3RhbGwgdGhlIGxpc3RlbmVycyBmb3VuZCBpbiB0aGUgc3VpdGVzCisgICAgLy8KKyAgICBmb3IgKFhtbFN1aXRlIHMgOiBtX3N1aXRlcykgeworICAgICAgZm9yIChTdHJpbmcgbGlzdGVuZXJOYW1lIDogcy5nZXRMaXN0ZW5lcnMoKSkgeworICAgICAgICBDbGFzczw/PiBsaXN0ZW5lckNsYXNzID0gQ2xhc3NIZWxwZXIuZm9yTmFtZShsaXN0ZW5lck5hbWUpOworCisgICAgICAgIC8vIElmIHNwZWNpZmllZCBsaXN0ZW5lciBkb2VzIG5vdCBleGlzdCwgYSBUZXN0TkdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgICAgaWYobGlzdGVuZXJDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiTGlzdGVuZXIgIiArIGxpc3RlbmVyTmFtZQorICAgICAgICAgICAgICArICIgd2FzIG5vdCBmb3VuZCBpbiBwcm9qZWN0J3MgY2xhc3NwYXRoIik7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbGlzdGVuZXIgPSBDbGFzc0hlbHBlci5uZXdJbnN0YW5jZShsaXN0ZW5lckNsYXNzKTsKKyAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgfQorCisgICAgICAvLworICAgICAgLy8gSW5zdGFsbCB0aGUgbWV0aG9kIHNlbGVjdG9ycworICAgICAgLy8KKyAgICAgIGZvciAoWG1sTWV0aG9kU2VsZWN0b3IgbWV0aG9kU2VsZWN0b3IgOiBzLmdldE1ldGhvZFNlbGVjdG9ycygpICkgeworICAgICAgICBhZGRNZXRob2RTZWxlY3RvcihtZXRob2RTZWxlY3Rvci5nZXRDbGFzc05hbWUoKSwgbWV0aG9kU2VsZWN0b3IuZ2V0UHJpb3JpdHkoKSk7CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBGaW5kIGlmIHdlIGhhdmUgYW4gb2JqZWN0IGZhY3RvcnkKKyAgICAgIC8vCisgICAgICBpZiAocy5nZXRPYmplY3RGYWN0b3J5KCkgIT0gbnVsbCkgeworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgZmFjdG9yeSA9IHMuZ2V0T2JqZWN0RmFjdG9yeSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkZvdW5kIG1vcmUgdGhhbiBvbmUgb2JqZWN0LWZhY3RvcnkgdGFnIGluIHlvdXIgc3VpdGVzIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBtX2NvbmZpZ3VyYXRpb24uc2V0QW5ub3RhdGlvbkZpbmRlcihuZXcgSkRLMTVBbm5vdGF0aW9uRmluZGVyKGdldEFubm90YXRpb25UcmFuc2Zvcm1lcigpKSk7CisgICAgbV9jb25maWd1cmF0aW9uLnNldEhvb2thYmxlKG1faG9va2FibGUpOworICAgIG1fY29uZmlndXJhdGlvbi5zZXRDb25maWd1cmFibGUobV9jb25maWd1cmFibGUpOworICAgIG1fY29uZmlndXJhdGlvbi5zZXRPYmplY3RGYWN0b3J5KGZhY3RvcnkpOworICB9CisKKyAgLyoqCisgICAqIFVzaW5nIHJlZmxlY3Rpb24gdG8gcmVtYWluIEphdmEgNSBjb21wbGlhbnQuCisgICAqLworICBwcml2YXRlIHZvaWQgYWRkU2VydmljZUxvYWRlckxpc3RlbmVycygpIHsKKyAgICAgIEl0ZXJhYmxlPElUZXN0TkdMaXN0ZW5lcj4gbG9hZGVyID0gbV9zZXJ2aWNlTG9hZGVyQ2xhc3NMb2FkZXIgIT0gbnVsbCA/CisgICAgICAgICAgU2VydmljZUxvYWRlci5sb2FkKElUZXN0TkdMaXN0ZW5lci5jbGFzcywgbV9zZXJ2aWNlTG9hZGVyQ2xhc3NMb2FkZXIpCisgICAgICAgICAgOiBTZXJ2aWNlTG9hZGVyLmxvYWQoSVRlc3ROR0xpc3RlbmVyLmNsYXNzKTsKKyAgICAgIGZvciAoSVRlc3ROR0xpc3RlbmVyIGwgOiBsb2FkZXIpIHsKKyAgICAgICAgVXRpbHMubG9nKCJbVGVzdE5HXSIsIDIsICJBZGRpbmcgU2VydmljZUxvYWRlciBsaXN0ZW5lcjoiICsgbCk7CisgICAgICAgIGFkZExpc3RlbmVyKGwpOworICAgICAgICBhZGRTZXJ2aWNlTG9hZGVyTGlzdGVuZXIobCk7CisgICAgICB9CisgIH0KKworICAvKioKKyAgICogQmVmb3JlIHN1aXRlcyBhcmUgZXhlY3V0ZWQsIGRvIGEgc2FuaXR5IGNoZWNrIHRvIGVuc3VyZSBhbGwgcmVxdWlyZWQKKyAgICogY29uZGl0aW9ucyBhcmUgbWV0LiBJZiBub3QsIHRocm93IGFuIGV4Y2VwdGlvbiB0byBzdG9wIHRlc3QgZXhlY3V0aW9uCisgICAqCisgICAqIEB0aHJvd3MgVGVzdE5HRXhjZXB0aW9uIGlmIHRoZSBzYW5pdHkgY2hlY2sgZmFpbHMKKyAgICovCisgIHByaXZhdGUgdm9pZCBzYW5pdHlDaGVjaygpIHsKKyAgICBjaGVja1Rlc3ROYW1lcyhtX3N1aXRlcyk7CisgICAgY2hlY2tTdWl0ZU5hbWVzKG1fc3VpdGVzKTsKKyAgfQorCisgIC8qKgorICAgKiBFbnN1cmUgdGhhdCB0d28gWG1sVGVzdCB3aXRoaW4gdGhlIHNhbWUgWG1sU3VpdGUgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBuYW1lCisgICAqLworICBwcml2YXRlIHZvaWQgY2hlY2tUZXN0TmFtZXMoTGlzdDxYbWxTdWl0ZT4gc3VpdGVzKSB7CisgICAgZm9yIChYbWxTdWl0ZSBzdWl0ZSA6IHN1aXRlcykgeworICAgICAgU2V0PFN0cmluZz4gdGVzdE5hbWVzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKFhtbFRlc3QgdGVzdCA6IHN1aXRlLmdldFRlc3RzKCkpIHsKKyAgICAgICAgaWYgKHRlc3ROYW1lcy5jb250YWlucyh0ZXN0LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJUd28gdGVzdHMgaW4gdGhlIHNhbWUgc3VpdGUgIgorICAgICAgICAgICAgICArICJjYW5ub3QgaGF2ZSB0aGUgc2FtZSBuYW1lOiAiICsgdGVzdC5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRlc3ROYW1lcy5hZGQodGVzdC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjaGVja1Rlc3ROYW1lcyhzdWl0ZS5nZXRDaGlsZFN1aXRlcygpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW5zdXJlIHRoYXQgdHdvIFhtbFN1aXRlIGRvbid0IGhhdmUgdGhlIHNhbWUgbmFtZQorICAgKiBPdGhlcndpc2Ugd2lsbCBiZSBjbGFzaCBpbiBTdWl0ZVJ1bm5lck1hcAorICAgKiBTZWUgaXNzdWUgIzMwMgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3VpdGVOYW1lcyhMaXN0PFhtbFN1aXRlPiBzdWl0ZXMpIHsKKyAgICBjaGVja1N1aXRlTmFtZXNJbnRlcm5hbChzdWl0ZXMsIFNldHMuPFN0cmluZz5uZXdIYXNoU2V0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3VpdGVOYW1lc0ludGVybmFsKExpc3Q8WG1sU3VpdGU+IHN1aXRlcywgU2V0PFN0cmluZz4gbmFtZXMpIHsKKyAgICBmb3IgKFhtbFN1aXRlIHN1aXRlIDogc3VpdGVzKSB7CisgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHN1aXRlLmdldE5hbWUoKTsKKworICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgIFN0cmluZyB0bXBOYW1lID0gbmFtZTsKKyAgICAgIHdoaWxlIChuYW1lcy5jb250YWlucyh0bXBOYW1lKSkgeworICAgICAgICB0bXBOYW1lID0gbmFtZSArICIgKCIgKyBjb3VudCsrICsgIikiOworICAgICAgfQorCisgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgIHN1aXRlLnNldE5hbWUodG1wTmFtZSk7CisgICAgICAgIG5hbWVzLmFkZCh0bXBOYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgIH0KKworICAgICAgbmFtZXMuYWRkKG5hbWUpOworICAgICAgY2hlY2tTdWl0ZU5hbWVzSW50ZXJuYWwoc3VpdGUuZ2V0Q2hpbGRTdWl0ZXMoKSwgbmFtZXMpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSdW4gVGVzdE5HLgorICAgKi8KKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIGluaXRpYWxpemVTdWl0ZXNBbmRKYXJGaWxlKCk7CisgICAgaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb24oKTsKKyAgICBpbml0aWFsaXplRGVmYXVsdExpc3RlbmVycygpOworICAgIGluaXRpYWxpemVDb21tYW5kTGluZVN1aXRlcygpOworICAgIGluaXRpYWxpemVDb21tYW5kTGluZVN1aXRlc1BhcmFtcygpOworICAgIGluaXRpYWxpemVDb21tYW5kTGluZVN1aXRlc0dyb3VwcygpOworCisgICAgc2FuaXR5Q2hlY2soKTsKKworICAgIExpc3Q8SVN1aXRlPiBzdWl0ZVJ1bm5lcnMgPSBudWxsOworCisgICAgcnVuU3VpdGVBbHRlcmF0aW9uTGlzdGVuZXJzKCk7CisgICAgcnVuRXhlY3V0aW9uTGlzdGVuZXJzKHRydWUgLyogc3RhcnQgKi8pOworCisgICAgbV9zdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgLy8KKyAgICAvLyBTbGF2ZSBtb2RlCisgICAgLy8KKyAgICBpZiAobV9zbGF2ZWZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICBTdWl0ZVNsYXZlIHNsYXZlID0gbmV3IFN1aXRlU2xhdmUoIG1fc2xhdmVmaWxlTmFtZSwgdGhpcyApOworICAgICAgIHNsYXZlLndhaXRGb3JTdWl0ZXMoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJlZ3VsYXIgbW9kZQorICAgIC8vCisgICAgZWxzZSBpZiAobV9tYXN0ZXJmaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICBzdWl0ZVJ1bm5lcnMgPSBydW5TdWl0ZXNMb2NhbGx5KCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNYXN0ZXIgbW9kZQorICAgIC8vCisgICAgZWxzZSB7CisgICAgICAgU3VpdGVEaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBuZXcgU3VpdGVEaXNwYXRjaGVyKG1fbWFzdGVyZmlsZU5hbWUpOworICAgICAgIHN1aXRlUnVubmVycyA9IGRpc3BhdGNoZXIuZGlzcGF0Y2goZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICBtX3N1aXRlcywgZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAgICAgIGdldFRlc3RMaXN0ZW5lcnMoKSk7CisgICAgfQorCisgICAgbV9lbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBydW5FeGVjdXRpb25MaXN0ZW5lcnMoZmFsc2UgLyogZmluaXNoICovKTsKKworICAgIGlmKG51bGwgIT0gc3VpdGVSdW5uZXJzKSB7CisgICAgICBnZW5lcmF0ZVJlcG9ydHMoc3VpdGVSdW5uZXJzKTsKKyAgICB9CisKKyAgICBpZighbV9oYXNUZXN0cykgeworICAgICAgc2V0U3RhdHVzKEhBU19OT19URVNUKTsKKyAgICAgIGlmIChUZXN0UnVubmVyLmdldFZlcmJvc2UoKSA+IDEpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbVGVzdE5HXSBObyB0ZXN0cyBmb3VuZC4gTm90aGluZyB3YXMgcnVuIik7CisgICAgICAgIHVzYWdlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3ROR10gIiArIHN0cmluZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuU3VpdGVBbHRlcmF0aW9uTGlzdGVuZXJzKCkgeworICAgIGZvciAoTGlzdDxJQWx0ZXJTdWl0ZUxpc3RlbmVyPiBsaXN0ZW5lcnMKKyAgICAgICAgOiBBcnJheXMuYXNMaXN0KG1fYWx0ZXJTdWl0ZUxpc3RlbmVycywgbV9jb25maWd1cmF0aW9uLmdldEFsdGVyU3VpdGVMaXN0ZW5lcnMoKSkpIHsKKyAgICAgIGZvciAoSUFsdGVyU3VpdGVMaXN0ZW5lciBsIDogbGlzdGVuZXJzKSB7CisgICAgICAgIGwuYWx0ZXIobV9zdWl0ZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5FeGVjdXRpb25MaXN0ZW5lcnMoYm9vbGVhbiBzdGFydCkgeworICAgIGZvciAoTGlzdDxJRXhlY3V0aW9uTGlzdGVuZXI+IGxpc3RlbmVycworICAgICAgICA6IEFycmF5cy5hc0xpc3QobV9leGVjdXRpb25MaXN0ZW5lcnMsIG1fY29uZmlndXJhdGlvbi5nZXRFeGVjdXRpb25MaXN0ZW5lcnMoKSkpIHsKKyAgICAgIGZvciAoSUV4ZWN1dGlvbkxpc3RlbmVyIGwgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaWYgKHN0YXJ0KSBsLm9uRXhlY3V0aW9uU3RhcnQoKTsKKyAgICAgICAgZWxzZSBsLm9uRXhlY3V0aW9uRmluaXNoKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkQWx0ZXJTdWl0ZUxpc3RlbmVyKElBbHRlclN1aXRlTGlzdGVuZXIgbCkgeworICAgIG1fYWx0ZXJTdWl0ZUxpc3RlbmVycy5hZGQobCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25MaXN0ZW5lcihJRXhlY3V0aW9uTGlzdGVuZXIgbCkgeworICAgIG1fZXhlY3V0aW9uTGlzdGVuZXJzLmFkZChsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisgICAgaWYgKG1fakNvbW1hbmRlciA9PSBudWxsKSB7CisgICAgICBtX2pDb21tYW5kZXIgPSBuZXcgSkNvbW1hbmRlcihuZXcgQ29tbWFuZExpbmVBcmdzKCkpOworICAgIH0KKyAgICBtX2pDb21tYW5kZXIudXNhZ2UoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVJlcG9ydHMoTGlzdDxJU3VpdGU+IHN1aXRlUnVubmVycykgeworICAgIGZvciAoSVJlcG9ydGVyIHJlcG9ydGVyIDogbV9yZXBvcnRlcnMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgcmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQobV9zdWl0ZXMsIHN1aXRlUnVubmVycywgbV9vdXRwdXREaXIpOworICAgICAgICBVdGlscy5sb2coIlRlc3RORyIsIDIsICJUaW1lIHRha2VuIGJ5ICIgKyByZXBvcnRlciArICI6ICIKKyAgICAgICAgICAgICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIiBtcyIpOworICAgICAgfQorICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW1Rlc3ROR10gUmVwb3J0ZXIgIiArIHJlcG9ydGVyICsgIiBmYWlsZWQiKTsKKyAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUaGlzIG5lZWRzIHRvIGJlIHB1YmxpYyBmb3IgbWF2ZW4yLCBmb3Igbm93Li5BdCBsZWFzdAorICAgKiB1bnRpbCBhbiBhbHRlcm5hdGl2ZSBtZWNoYW5pc20gaXMgZm91bmQuCisgICAqLworICBwdWJsaWMgTGlzdDxJU3VpdGU+IHJ1blN1aXRlc0xvY2FsbHkoKSB7CisgICAgU3VpdGVSdW5uZXJNYXAgc3VpdGVSdW5uZXJNYXAgPSBuZXcgU3VpdGVSdW5uZXJNYXAoKTsKKyAgICBpZiAobV9zdWl0ZXMuc2l6ZSgpID4gMCkgeworICAgICAgaWYgKG1fc3VpdGVzLmdldCgwKS5nZXRWZXJib3NlKCkgPj0gMikgeworICAgICAgICBWZXJzaW9uLmRpc3BsYXlCYW5uZXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gRmlyc3QgaW5pdGlhbGl6ZSB0aGUgc3VpdGUgcnVubmVycyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIGNvbmZpZ3VyYXRpb24gaXNzdWVzLgorICAgICAgLy8gQ3JlYXRlIGEgbWFwIHdpdGggWG1sU3VpdGUgYXMga2V5IGFuZCBjb3JyZXNwb25kaW5nIFN1aXRlUnVubmVyIGFzIHZhbHVlCisgICAgICBmb3IgKFhtbFN1aXRlIHhtbFN1aXRlIDogbV9zdWl0ZXMpIHsKKyAgICAgICAgY3JlYXRlU3VpdGVSdW5uZXJzKHN1aXRlUnVubmVyTWFwLCB4bWxTdWl0ZSk7CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBSdW4gc3VpdGVzCisgICAgICAvLworICAgICAgaWYgKG1fc3VpdGVUaHJlYWRQb29sU2l6ZSA9PSAxICYmICFtX3JhbmRvbWl6ZVN1aXRlcykgeworICAgICAgICAvLyBTaW5nbGUgdGhyZWFkZWQgYW5kIG5vdCByYW5kb21pemVkOiBydW4gdGhlIHN1aXRlcyBpbiBvcmRlcgorICAgICAgICBmb3IgKFhtbFN1aXRlIHhtbFN1aXRlIDogbV9zdWl0ZXMpIHsKKyAgICAgICAgICBydW5TdWl0ZXNTZXF1ZW50aWFsbHkoeG1sU3VpdGUsIHN1aXRlUnVubmVyTWFwLCBnZXRWZXJib3NlKHhtbFN1aXRlKSwKKyAgICAgICAgICAgICAgZ2V0RGVmYXVsdFN1aXRlTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTXVsdGl0aHJlYWRlZDogZ2VuZXJhdGUgYSBkeW5hbWljIGdyYXBoIHRoYXQgc3RvcmVzIHRoZSBzdWl0ZSBoaWVyYXJjaHkuIFRoaXMgaXMgdGhlbgorICAgICAgICAvLyB1c2VkIHRvIHJ1biByZWxhdGVkIHN1aXRlcyBpbiBzcGVjaWZpYyBvcmRlci4gUGFyZW50IHN1aXRlcyBhcmUgcnVuIG9ubHkKKyAgICAgICAgLy8gb25jZSBhbGwgdGhlIGNoaWxkIHN1aXRlcyBoYXZlIGNvbXBsZXRlZCBleGVjdXRpb24KKyAgICAgICAgRHluYW1pY0dyYXBoPElTdWl0ZT4gc3VpdGVHcmFwaCA9IG5ldyBEeW5hbWljR3JhcGg8PigpOworICAgICAgICBmb3IgKFhtbFN1aXRlIHhtbFN1aXRlIDogbV9zdWl0ZXMpIHsKKyAgICAgICAgICBwb3B1bGF0ZVN1aXRlR3JhcGgoc3VpdGVHcmFwaCwgc3VpdGVSdW5uZXJNYXAsIHhtbFN1aXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIElUaHJlYWRXb3JrZXJGYWN0b3J5PElTdWl0ZT4gZmFjdG9yeSA9IG5ldyBTdWl0ZVdvcmtlckZhY3Rvcnkoc3VpdGVSdW5uZXJNYXAsCisgICAgICAgICAgMCAvKiB2ZXJib3NlIGhhc24ndCBiZWVuIHNldCB5ZXQgKi8sIGdldERlZmF1bHRTdWl0ZU5hbWUoKSk7CisgICAgICAgIEdyYXBoVGhyZWFkUG9vbEV4ZWN1dG9yPElTdWl0ZT4gcG9vbGVkRXhlY3V0b3IgPQorICAgICAgICAgICAgICAgIG5ldyBHcmFwaFRocmVhZFBvb2xFeGVjdXRvcjw+KHN1aXRlR3JhcGgsIGZhY3RvcnksIG1fc3VpdGVUaHJlYWRQb29sU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VpdGVUaHJlYWRQb29sU2l6ZSwgSW50ZWdlci5NQVhfVkFMVUUsIFRpbWVVbml0Lk1JTExJU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpKTsKKworICAgICAgICBVdGlscy5sb2coIlRlc3RORyIsIDIsICJTdGFydGluZyBleGVjdXRvciBmb3IgYWxsIHN1aXRlcyIpOworICAgICAgICAvLyBSdW4gYWxsIHN1aXRlcyBpbiBwYXJhbGxlbAorICAgICAgICBwb29sZWRFeGVjdXRvci5ydW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwb29sZWRFeGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKExvbmcuTUFYX1ZBTFVFLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgIHBvb2xlZEV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGhhbmRsZWQpIHsKKyAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgIGVycm9yKCJFcnJvciB3YWl0aW5nIGZvciBjb25jdXJyZW50IGV4ZWN1dG9ycyB0byBmaW5pc2ggIiArIGhhbmRsZWQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNldFN0YXR1cyhIQVNfTk9fVEVTVCk7CisgICAgICBlcnJvcigiTm8gdGVzdCBzdWl0ZSBmb3VuZC4gTm90aGluZyB0byBydW4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBHZW5lcmF0ZSB0aGUgc3VpdGVzIHJlcG9ydAorICAgIC8vCisgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdChzdWl0ZVJ1bm5lck1hcC52YWx1ZXMoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBzKSB7CisgICAgTE9HR0VSLmVycm9yKHMpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHZlcmJvc2UgbGV2ZWwsIGNoZWNraW5nIGluIG9yZGVyOiB0aGUgdmVyYm9zZSBsZXZlbCBvbgorICAgKiB0aGUgc3VpdGUsIHRoZSB2ZXJib3NlIGxldmVsIG9uIHRoZSBUZXN0Tkcgb2JqZWN0LCBvciAxLgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgZ2V0VmVyYm9zZShYbWxTdWl0ZSB4bWxTdWl0ZSkgeworICAgIGludCByZXN1bHQgPSB4bWxTdWl0ZS5nZXRWZXJib3NlKCkgIT0gbnVsbCA/IHhtbFN1aXRlLmdldFZlcmJvc2UoKQorICAgICAgICA6IChtX3ZlcmJvc2UgIT0gbnVsbCA/IG1fdmVyYm9zZSA6IERFRkFVTFRfVkVSQk9TRSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSZWN1cnNpdmVseSBydW5zIHN1aXRlcy4gUnVucyB0aGUgY2hpbGRyZW4gc3VpdGVzIGJlZm9yZSBydW5uaW5nIHRoZSBwYXJlbnQKKyAgICogc3VpdGUuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSByZXN1bHRzIGZvciBwYXJlbnQgc3VpdGUgY2FuIHJlZmxlY3QgdGhlCisgICAqIGNvbWJpbmVkIHJlc3VsdHMgb2YgdGhlIGNoaWxkcmVuIHN1aXRlcy4KKyAgICoKKyAgICogQHBhcmFtIHhtbFN1aXRlIFhNTCBTdWl0ZSB0byBiZSBleGVjdXRlZAorICAgKiBAcGFyYW0gc3VpdGVSdW5uZXJNYXAgTWFwcyB7QGNvZGUgWG1sU3VpdGV9cyB0byByZXNwZWN0aXZlIHtAY29kZSBJU3VpdGV9CisgICAqIEBwYXJhbSB2ZXJib3NlIHZlcmJvc2UgbGV2ZWwKKyAgICogQHBhcmFtIGRlZmF1bHRTdWl0ZU5hbWUgZGVmYXVsdCBzdWl0ZSBuYW1lCisgICAqLworICBwcml2YXRlIHZvaWQgcnVuU3VpdGVzU2VxdWVudGlhbGx5KFhtbFN1aXRlIHhtbFN1aXRlLAorICAgICAgU3VpdGVSdW5uZXJNYXAgc3VpdGVSdW5uZXJNYXAsIGludCB2ZXJib3NlLCBTdHJpbmcgZGVmYXVsdFN1aXRlTmFtZSkgeworICAgIGZvciAoWG1sU3VpdGUgY2hpbGRTdWl0ZSA6IHhtbFN1aXRlLmdldENoaWxkU3VpdGVzKCkpIHsKKyAgICAgIHJ1blN1aXRlc1NlcXVlbnRpYWxseShjaGlsZFN1aXRlLCBzdWl0ZVJ1bm5lck1hcCwgdmVyYm9zZSwgZGVmYXVsdFN1aXRlTmFtZSk7CisgICAgfQorICAgIFN1aXRlUnVubmVyV29ya2VyIHNydyA9IG5ldyBTdWl0ZVJ1bm5lcldvcmtlcihzdWl0ZVJ1bm5lck1hcC5nZXQoeG1sU3VpdGUpLCBzdWl0ZVJ1bm5lck1hcCwKKyAgICAgIHZlcmJvc2UsIGRlZmF1bHRTdWl0ZU5hbWUpOworICAgIHNydy5ydW4oKTsKKyAgfQorCisgIC8qKgorICAgKiBQb3B1bGF0ZXMgdGhlIGR5bmFtaWMgZ3JhcGggd2l0aCB0aGUgcmV2ZXJzZSBoaWVyYXJjaHkgb2Ygc3VpdGVzLiBFZGdlcyBhcmUKKyAgICogYWRkZWQgcG9pbnRpbmcgZnJvbSBjaGlsZCBzdWl0ZSBydW5uZXJzIHRvIHBhcmVudCBzdWl0ZSBydW5uZXJzLCBoZW5jZSBtYWtpbmcKKyAgICogcGFyZW50IHN1aXRlIHJ1bm5lcnMgZGVwZW5kZW50IG9uIGFsbCB0aGUgY2hpbGQgc3VpdGUgcnVubmVycworICAgKgorICAgKiBAcGFyYW0gc3VpdGVHcmFwaCBkeW5hbWljIGdyYXBoIHJlcHJlc2VudGluZyB0aGUgcmV2ZXJzZSBoaWVyYXJjaHkgb2YgU3VpdGVSdW5uZXJzCisgICAqIEBwYXJhbSBzdWl0ZVJ1bm5lck1hcCBNYXAgd2l0aCBYTUxTdWl0ZSBhcyBrZXkgYW5kIGl0cyByZXNwZWN0aXZlIFN1aXRlUnVubmVyIGFzIHZhbHVlCisgICAqIEBwYXJhbSB4bWxTdWl0ZSBYTUwgU3VpdGUKKyAgICovCisgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVN1aXRlR3JhcGgoRHluYW1pY0dyYXBoPElTdWl0ZT4gc3VpdGVHcmFwaCAvKiBPVVQgKi8sCisgICAgICBTdWl0ZVJ1bm5lck1hcCBzdWl0ZVJ1bm5lck1hcCwgWG1sU3VpdGUgeG1sU3VpdGUpIHsKKyAgICBJU3VpdGUgcGFyZW50U3VpdGVSdW5uZXIgPSBzdWl0ZVJ1bm5lck1hcC5nZXQoeG1sU3VpdGUpOworICAgIGlmICh4bWxTdWl0ZS5nZXRDaGlsZFN1aXRlcygpLmlzRW1wdHkoKSkgeworICAgICAgc3VpdGVHcmFwaC5hZGROb2RlKHBhcmVudFN1aXRlUnVubmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3IgKFhtbFN1aXRlIGNoaWxkU3VpdGUgOiB4bWxTdWl0ZS5nZXRDaGlsZFN1aXRlcygpKSB7CisgICAgICAgIHN1aXRlR3JhcGguYWRkRWRnZShwYXJlbnRTdWl0ZVJ1bm5lciwgc3VpdGVSdW5uZXJNYXAuZ2V0KGNoaWxkU3VpdGUpKTsKKyAgICAgICAgcG9wdWxhdGVTdWl0ZUdyYXBoKHN1aXRlR3JhcGgsIHN1aXRlUnVubmVyTWFwLCBjaGlsZFN1aXRlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyB0aGUge0Bjb2RlIFN1aXRlUnVubmVyfXMgYW5kIHBvcHVsYXRlcyB0aGUgc3VpdGUgcnVubmVyIG1hcCB3aXRoCisgICAqIHRoaXMgaW5mb3JtYXRpb24KKyAgICogQHBhcmFtIHN1aXRlUnVubmVyTWFwIE1hcCB3aXRoIFhNTFN1aXRlIGFzIGtleSBhbmQgaXQncyByZXNwZWN0aXZlCisgICAqICAgU3VpdGVSdW5uZXIgYXMgdmFsdWUuIFRoaXMgaXMgdXBkYXRlZCBhcyBwYXJ0IG9mIHRoaXMgbWV0aG9kIGNhbGwKKyAgICogQHBhcmFtIHhtbFN1aXRlIFhtbCBTdWl0ZSAoYW5kIGl0cyBjaGlsZHJlbikgZm9yIHdoaWNoIHtAY29kZSBTdWl0ZVJ1bm5lcn1zIGFyZSBjcmVhdGVkCisgICAqLworICBwcml2YXRlIHZvaWQgY3JlYXRlU3VpdGVSdW5uZXJzKFN1aXRlUnVubmVyTWFwIHN1aXRlUnVubmVyTWFwIC8qIE9VVCAqLywgWG1sU3VpdGUgeG1sU3VpdGUpIHsKKyAgICBpZiAobnVsbCAhPSBtX2lzSlVuaXQgJiYgISBtX2lzSlVuaXQuZXF1YWxzKFhtbFN1aXRlLkRFRkFVTFRfSlVOSVQpKSB7CisgICAgICB4bWxTdWl0ZS5zZXRKVW5pdChtX2lzSlVuaXQpOworICAgIH0KKworICAgIC8vIElmIHRoZSBza2lwIGZsYWcgd2FzIGludm9rZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgaXQKKyAgICAvLyB0YWtlcyBwcmVjZWRlbmNlCisgICAgaWYgKG51bGwgIT0gbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cykgeworICAgICAgeG1sU3VpdGUuc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMobV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyk7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdGhlIFhtbFN1aXRlIHZlcmJvc2UgdmFsdWUgd2l0aCB0aGUgb25lIGZyb20gVGVzdE5HCisgICAgaWYgKG1fdmVyYm9zZSAhPSBudWxsKSB7CisgICAgICB4bWxTdWl0ZS5zZXRWZXJib3NlKG1fdmVyYm9zZSk7CisgICAgfQorCisgICAgaWYgKG51bGwgIT0gbV9jb25maWdGYWlsdXJlUG9saWN5KSB7CisgICAgICB4bWxTdWl0ZS5zZXRDb25maWdGYWlsdXJlUG9saWN5KG1fY29uZmlnRmFpbHVyZVBvbGljeSk7CisgICAgfQorCisgICAgZm9yIChYbWxUZXN0IHQgOiB4bWxTdWl0ZS5nZXRUZXN0cygpKSB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IG1zIDogbV9tZXRob2REZXNjcmlwdG9ycy5lbnRyeVNldCgpKSB7CisgICAgICAgIFhtbE1ldGhvZFNlbGVjdG9yIHhtcyA9IG5ldyBYbWxNZXRob2RTZWxlY3RvcigpOworICAgICAgICB4bXMuc2V0TmFtZShtcy5nZXRLZXkoKSk7CisgICAgICAgIHhtcy5zZXRQcmlvcml0eShtcy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgdC5nZXRNZXRob2RTZWxlY3RvcnMoKS5hZGQoeG1zKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdWl0ZVJ1bm5lck1hcC5wdXQoeG1sU3VpdGUsIGNyZWF0ZVN1aXRlUnVubmVyKHhtbFN1aXRlKSk7CisKKyAgICBmb3IgKFhtbFN1aXRlIGNoaWxkU3VpdGUgOiB4bWxTdWl0ZS5nZXRDaGlsZFN1aXRlcygpKSB7CisgICAgICBjcmVhdGVTdWl0ZVJ1bm5lcnMoc3VpdGVSdW5uZXJNYXAsIGNoaWxkU3VpdGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgc3VpdGUgcnVubmVyIGFuZCBjb25maWd1cmVzIGl0cyBpbml0aWFsIHN0YXRlCisgICAqIEBwYXJhbSB4bWxTdWl0ZQorICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgc3VpdGUgcnVubmVyCisgICAqLworICBwcml2YXRlIFN1aXRlUnVubmVyIGNyZWF0ZVN1aXRlUnVubmVyKFhtbFN1aXRlIHhtbFN1aXRlKSB7CisgICAgU3VpdGVSdW5uZXIgcmVzdWx0ID0gbmV3IFN1aXRlUnVubmVyKGdldENvbmZpZ3VyYXRpb24oKSwgeG1sU3VpdGUsCisgICAgICAgIG1fb3V0cHV0RGlyLAorICAgICAgICBtX3Rlc3RSdW5uZXJGYWN0b3J5LAorICAgICAgICBtX3VzZURlZmF1bHRMaXN0ZW5lcnMsCisgICAgICAgIG1fbWV0aG9kSW50ZXJjZXB0b3JzLAorICAgICAgICBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMsCisgICAgICAgIG1fdGVzdExpc3RlbmVycywKKyAgICAgICAgbV9jbGFzc0xpc3RlbmVycyk7CisKKyAgICBmb3IgKElTdWl0ZUxpc3RlbmVyIGlzbCA6IG1fc3VpdGVMaXN0ZW5lcnMpIHsKKyAgICAgIHJlc3VsdC5hZGRMaXN0ZW5lcihpc2wpOworICAgIH0KKworICAgIGZvciAoSVJlcG9ydGVyIHIgOiByZXN1bHQuZ2V0UmVwb3J0ZXJzKCkpIHsKKyAgICAgIGFkZExpc3RlbmVyKHIpOworICAgIH0KKworICAgIGZvciAoSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBjbCA6IG1fY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTGlzdGVuZXJzKCkpIHsKKyAgICAgIHJlc3VsdC5hZGRDb25maWd1cmF0aW9uTGlzdGVuZXIoY2wpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gbV9jb25maWd1cmF0aW9uOworICB9CisKKyAgLyoqCisgICAqIFRoZSBUZXN0TkcgZW50cnkgcG9pbnQgZm9yIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCisgICAqCisgICAqIEBwYXJhbSBhcmd2IHRoZSBUZXN0TkcgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CisgICAgVGVzdE5HIHRlc3RuZyA9IHByaXZhdGVNYWluKGFyZ3YsIG51bGwpOworICAgIFN5c3RlbS5leGl0KHRlc3RuZy5nZXRTdGF0dXMoKSk7CisgIH0KKworICAvKioKKyAgICogPEI+Tm90ZTwvQj46IHRoaXMgbWV0aG9kIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBpcyBtZWFudCBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVGVzdE5HIHByaXZhdGVNYWluKFN0cmluZ1tdIGFyZ3YsIElUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBUZXN0TkcgcmVzdWx0ID0gbmV3IFRlc3RORygpOworCisgICAgaWYgKG51bGwgIT0gbGlzdGVuZXIpIHsKKyAgICAgIHJlc3VsdC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBQYXJzZSB0aGUgYXJndW1lbnRzCisgICAgLy8KKyAgICB0cnkgeworICAgICAgQ29tbWFuZExpbmVBcmdzIGNsYSA9IG5ldyBDb21tYW5kTGluZUFyZ3MoKTsKKyAgICAgIG1fakNvbW1hbmRlciA9IG5ldyBKQ29tbWFuZGVyKGNsYSwgYXJndik7CisgICAgICB2YWxpZGF0ZUNvbW1hbmRMaW5lUGFyYW1ldGVycyhjbGEpOworICAgICAgcmVzdWx0LmNvbmZpZ3VyZShjbGEpOworICAgIH0KKyAgICBjYXRjaChQYXJhbWV0ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgIGV4aXRXaXRoRXJyb3IoZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJ1bgorICAgIC8vCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdC5ydW4oKTsKKyAgICB9CisgICAgY2F0Y2goVGVzdE5HRXhjZXB0aW9uIGV4KSB7CisgICAgICBpZiAoVGVzdFJ1bm5lci5nZXRWZXJib3NlKCkgPiAxKSB7CisgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBlcnJvcihleC5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgcmVzdWx0LnNldFN0YXR1cyhIQVNfRkFJTFVSRSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBDb25maWd1cmUgdGhlIFRlc3RORyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoQ29tbWFuZExpbmVBcmdzIGNsYSkgeworICAgIGlmIChjbGEudmVyYm9zZSAhPSBudWxsKSB7CisgICAgICBzZXRWZXJib3NlKGNsYS52ZXJib3NlKTsKKyAgICB9CisgICAgc2V0T3V0cHV0RGlyZWN0b3J5KGNsYS5vdXRwdXREaXJlY3RvcnkpOworCisgICAgU3RyaW5nIHRlc3RDbGFzc2VzID0gY2xhLnRlc3RDbGFzczsKKyAgICBpZiAobnVsbCAhPSB0ZXN0Q2xhc3NlcykgeworICAgICAgU3RyaW5nW10gc3RyQ2xhc3NlcyA9IHRlc3RDbGFzc2VzLnNwbGl0KCIsIik7CisgICAgICBMaXN0PENsYXNzPiBjbGFzc2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKFN0cmluZyBjIDogc3RyQ2xhc3NlcykgeworICAgICAgICBjbGFzc2VzLmFkZChDbGFzc0hlbHBlci5maWxlVG9DbGFzcyhjKSk7CisgICAgICB9CisKKyAgICAgIHNldFRlc3RDbGFzc2VzKGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKSk7CisgICAgfQorCisgICAgc2V0T3V0cHV0RGlyZWN0b3J5KGNsYS5vdXRwdXREaXJlY3RvcnkpOworCisgICAgaWYgKGNsYS50ZXN0TmFtZXMgIT0gbnVsbCkgeworICAgICAgc2V0VGVzdE5hbWVzKEFycmF5cy5hc0xpc3QoY2xhLnRlc3ROYW1lcy5zcGxpdCgiLCIpKSk7CisgICAgfQorCisvLyAgICBMaXN0PFN0cmluZz4gdGVzdE5nWG1sID0gKExpc3Q8U3RyaW5nPikgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5TVUlURV9ERUYpOworLy8gICAgaWYgKG51bGwgIT0gdGVzdE5nWG1sKSB7CisvLyAgICAgIHNldFRlc3RTdWl0ZXModGVzdE5nWG1sKTsKKy8vICAgIH0KKworICAgIC8vIE5vdGU6IGNhbid0IHVzZSBhIEJvb2xlYW4gZmllbGQgaGVyZSBiZWNhdXNlIHdlIGFyZSBhbGxvd2luZyBhIGJvb2xlYW4KKyAgICAvLyBwYXJhbWV0ZXIgd2l0aCBhbiBhcml0eSBvZiAxICgiLXVzZWRlZmF1bHRsaXN0ZW5lcnMgZmFsc2UiKQorICAgIGlmIChjbGEudXNlRGVmYXVsdExpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICBzZXRVc2VEZWZhdWx0TGlzdGVuZXJzKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGNsYS51c2VEZWZhdWx0TGlzdGVuZXJzKSk7CisgICAgfQorCisgICAgc2V0R3JvdXBzKGNsYS5ncm91cHMpOworICAgIHNldEV4Y2x1ZGVkR3JvdXBzKGNsYS5leGNsdWRlZEdyb3Vwcyk7CisgICAgc2V0VGVzdEphcihjbGEudGVzdEphcik7CisgICAgc2V0WG1sUGF0aEluSmFyKGNsYS54bWxQYXRoSW5KYXIpOworICAgIHNldEpVbml0KGNsYS5qdW5pdCk7CisgICAgc2V0TWl4ZWQoY2xhLm1peGVkKTsKKyAgICBzZXRNYXN0ZXIoY2xhLm1hc3Rlcik7CisgICAgc2V0U2xhdmUoY2xhLnNsYXZlKTsKKyAgICBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyhjbGEuc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMpOworICAgIGlmIChjbGEucGFyYWxsZWxNb2RlICE9IG51bGwpIHsKKyAgICAgIHNldFBhcmFsbGVsKGNsYS5wYXJhbGxlbE1vZGUpOworICAgIH0KKyAgICBpZiAoY2xhLmNvbmZpZ0ZhaWx1cmVQb2xpY3kgIT0gbnVsbCkgeworICAgICAgc2V0Q29uZmlnRmFpbHVyZVBvbGljeShjbGEuY29uZmlnRmFpbHVyZVBvbGljeSk7CisgICAgfQorICAgIGlmIChjbGEudGhyZWFkQ291bnQgIT0gbnVsbCkgeworICAgICAgc2V0VGhyZWFkQ291bnQoY2xhLnRocmVhZENvdW50KTsKKyAgICB9CisgICAgaWYgKGNsYS5kYXRhUHJvdmlkZXJUaHJlYWRDb3VudCAhPSBudWxsKSB7CisgICAgICBzZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudChjbGEuZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQpOworICAgIH0KKyAgICBpZiAoY2xhLnN1aXRlTmFtZSAhPSBudWxsKSB7CisgICAgICBzZXREZWZhdWx0U3VpdGVOYW1lKGNsYS5zdWl0ZU5hbWUpOworICAgIH0KKyAgICBpZiAoY2xhLnRlc3ROYW1lICE9IG51bGwpIHsKKyAgICAgIHNldERlZmF1bHRUZXN0TmFtZShjbGEudGVzdE5hbWUpOworICAgIH0KKyAgICBpZiAoY2xhLmxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgIFN0cmluZyBzZXAgPSAiOyI7CisgICAgICBpZiAoY2xhLmxpc3RlbmVyLmNvbnRhaW5zKCIsIikpIHsKKyAgICAgICAgc2VwID0gIiwiOworICAgICAgfQorICAgICAgU3RyaW5nW10gc3RycyA9IFV0aWxzLnNwbGl0KGNsYS5saXN0ZW5lciwgc2VwKTsKKyAgICAgIExpc3Q8Q2xhc3M+IGNsYXNzZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgZm9yIChTdHJpbmcgY2xzIDogc3RycykgeworICAgICAgICBjbGFzc2VzLmFkZChDbGFzc0hlbHBlci5maWxlVG9DbGFzcyhjbHMpKTsKKyAgICAgIH0KKworICAgICAgc2V0TGlzdGVuZXJDbGFzc2VzKGNsYXNzZXMpOworICAgIH0KKworICAgIGlmIChudWxsICE9IGNsYS5tZXRob2RTZWxlY3RvcnMpIHsKKyAgICAgIFN0cmluZ1tdIHN0cnMgPSBVdGlscy5zcGxpdChjbGEubWV0aG9kU2VsZWN0b3JzLCAiLCIpOworICAgICAgZm9yIChTdHJpbmcgY2xzIDogc3RycykgeworICAgICAgICBTdHJpbmdbXSBzZWwgPSBVdGlscy5zcGxpdChjbHMsICI6Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKHNlbC5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgYWRkTWV0aG9kU2VsZWN0b3Ioc2VsWzBdLCBJbnRlZ2VyLnBhcnNlSW50KHNlbFsxXSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvcigiTWV0aG9kIHNlbGVjdG9yIHZhbHVlIHdhcyBub3QgaW4gdGhlIGZvcm1hdCBvcmcuZXhhbXBsZS5TZWxlY3Rvcjo0Iik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgZXJyb3IoIk1ldGhvZCBzZWxlY3RvciB2YWx1ZSB3YXMgbm90IGluIHRoZSBmb3JtYXQgb3JnLmV4YW1wbGUuU2VsZWN0b3I6NCIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNsYS5vYmplY3RGYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgIHNldE9iamVjdEZhY3RvcnkoQ2xhc3NIZWxwZXIuZmlsZVRvQ2xhc3MoY2xhLm9iamVjdEZhY3RvcnkpKTsKKyAgICB9CisgICAgaWYgKGNsYS50ZXN0UnVubmVyRmFjdG9yeSAhPSBudWxsKSB7CisgICAgICBzZXRUZXN0UnVubmVyRmFjdG9yeUNsYXNzKAorICAgICAgICAgIENsYXNzSGVscGVyLmZpbGVUb0NsYXNzKGNsYS50ZXN0UnVubmVyRmFjdG9yeSkpOworICAgIH0KKworICAgIGlmIChjbGEucmVwb3J0ZXIgIT0gbnVsbCkgeworICAgICAgUmVwb3J0ZXJDb25maWcgcmVwb3J0ZXJDb25maWcgPSBSZXBvcnRlckNvbmZpZy5kZXNlcmlhbGl6ZShjbGEucmVwb3J0ZXIpOworICAgICAgYWRkUmVwb3J0ZXIocmVwb3J0ZXJDb25maWcpOworICAgIH0KKworICAgIGlmIChjbGEuY29tbWFuZExpbmVNZXRob2RzLnNpemUoKSA+IDApIHsKKyAgICAgIG1fY29tbWFuZExpbmVNZXRob2RzID0gY2xhLmNvbW1hbmRMaW5lTWV0aG9kczsKKyAgICB9CisKKyAgICBpZiAoY2xhLnN1aXRlRmlsZXMgIT0gbnVsbCkgeworICAgICAgc2V0VGVzdFN1aXRlcyhjbGEuc3VpdGVGaWxlcyk7CisgICAgfQorCisgICAgc2V0U3VpdGVUaHJlYWRQb29sU2l6ZShjbGEuc3VpdGVUaHJlYWRQb29sU2l6ZSk7CisgICAgc2V0UmFuZG9taXplU3VpdGVzKGNsYS5yYW5kb21pemVTdWl0ZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3VpdGVUaHJlYWRQb29sU2l6ZShJbnRlZ2VyIHN1aXRlVGhyZWFkUG9vbFNpemUpIHsKKyAgICBtX3N1aXRlVGhyZWFkUG9vbFNpemUgPSBzdWl0ZVRocmVhZFBvb2xTaXplOworICB9CisKKyAgcHVibGljIEludGVnZXIgZ2V0U3VpdGVUaHJlYWRQb29sU2l6ZSgpIHsKKyAgICByZXR1cm4gbV9zdWl0ZVRocmVhZFBvb2xTaXplOworICB9CisKKyAgIHB1YmxpYyB2b2lkIHNldFJhbmRvbWl6ZVN1aXRlcyhib29sZWFuIHJhbmRvbWl6ZVN1aXRlcykgeworICAgICBtX3JhbmRvbWl6ZVN1aXRlcyA9IHJhbmRvbWl6ZVN1aXRlczsKKyAgIH0KKworICAvKioKKyAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSBNYXZlbidzIFN1cmVmaXJlLCBvbmx5IHJlbW92ZSBpdCBvbmNlCisgICAqIFN1cmVmaXJlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIG5vIGxvbmdlciBjYWxsIGl0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChTdHJpbmcgcGF0aCkgeworICAgIC8vIG5vcAorICB9CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgTWF2ZW4ncyBTdXJlZmlyZSB0byBjb25maWd1cmUgdGhlIHJ1bm5lciwKKyAgICogZG8gbm90IHJlbW92ZSB1bmxlc3MgeW91IGtub3cgZm9yIHN1cmUgdGhhdCBTdXJlZmlyZSBoYXMgYmVlbiB1cGRhdGVkCisgICAqIHRvIHVzZSB0aGUgbmV3IGNvbmZpZ3VyZShDb21tYW5kTGluZUFyZ3MpIG1ldGhvZC4KKyAgICoKKyAgICogQGRlcHJlY2F0ZWQgdXNlIG5ldyBjb25maWd1cmUoQ29tbWFuZExpbmVBcmdzKSBtZXRob2QKKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNYXAgY21kTGluZUFyZ3MpIHsKKyAgICBDb21tYW5kTGluZUFyZ3MgcmVzdWx0ID0gbmV3IENvbW1hbmRMaW5lQXJncygpOworCisgICAgSW50ZWdlciB2ZXJib3NlID0gKEludGVnZXIpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuTE9HKTsKKyAgICBpZiAobnVsbCAhPSB2ZXJib3NlKSB7CisgICAgICByZXN1bHQudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgfQorICAgIHJlc3VsdC5vdXRwdXREaXJlY3RvcnkgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLk9VVFBVVF9ESVJFQ1RPUlkpOworCisgICAgU3RyaW5nIHRlc3RDbGFzc2VzID0gKFN0cmluZykgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5URVNUX0NMQVNTKTsKKyAgICBpZiAobnVsbCAhPSB0ZXN0Q2xhc3NlcykgeworICAgICAgcmVzdWx0LnRlc3RDbGFzcyA9IHRlc3RDbGFzc2VzOworICAgIH0KKworICAgIFN0cmluZyB0ZXN0TmFtZXMgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlRFU1RfTkFNRVMpOworICAgIGlmICh0ZXN0TmFtZXMgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnRlc3ROYW1lcyA9IHRlc3ROYW1lczsKKyAgICB9CisKKyAgICBTdHJpbmcgdXNlRGVmYXVsdExpc3RlbmVycyA9IChTdHJpbmcpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuVVNFX0RFRkFVTFRfTElTVEVORVJTKTsKKyAgICBpZiAobnVsbCAhPSB1c2VEZWZhdWx0TGlzdGVuZXJzKSB7CisgICAgICByZXN1bHQudXNlRGVmYXVsdExpc3RlbmVycyA9IHVzZURlZmF1bHRMaXN0ZW5lcnM7CisgICAgfQorCisgICAgcmVzdWx0Lmdyb3VwcyA9IChTdHJpbmcpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuR1JPVVBTKTsKKyAgICByZXN1bHQuZXhjbHVkZWRHcm91cHMgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLkVYQ0xVREVEX0dST1VQUyk7CisgICAgcmVzdWx0LnRlc3RKYXIgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlRFU1RfSkFSKTsKKyAgICByZXN1bHQueG1sUGF0aEluSmFyID0gKFN0cmluZykgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5YTUxfUEFUSF9JTl9KQVIpOworICAgIHJlc3VsdC5qdW5pdCA9IChCb29sZWFuKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLkpVTklUKTsKKyAgICByZXN1bHQubWl4ZWQgPSAoQm9vbGVhbikgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5NSVhFRCk7CisgICAgcmVzdWx0Lm1hc3RlciA9IChTdHJpbmcpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuTUFTVEVSKTsKKyAgICByZXN1bHQuc2xhdmUgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlNMQVZFKTsKKyAgICByZXN1bHQuc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSAoQm9vbGVhbikgY21kTGluZUFyZ3MuZ2V0KAorICAgICAgICBDb21tYW5kTGluZUFyZ3MuU0tJUF9GQUlMRURfSU5WT0NBVElPTl9DT1VOVFMpOworICAgIFN0cmluZyBwYXJhbGxlbE1vZGUgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlBBUkFMTEVMKTsKKyAgICBpZiAocGFyYWxsZWxNb2RlICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wYXJhbGxlbE1vZGUgPSBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuZ2V0VmFsaWRQYXJhbGxlbChwYXJhbGxlbE1vZGUpOworICAgIH0KKworICAgIFN0cmluZyB0aHJlYWRDb3VudCA9IChTdHJpbmcpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuVEhSRUFEX0NPVU5UKTsKKyAgICBpZiAodGhyZWFkQ291bnQgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnRocmVhZENvdW50ID0gSW50ZWdlci5wYXJzZUludCh0aHJlYWRDb3VudCk7CisgICAgfQorCisgICAgLy8gTm90IHN1cHBvcnRlZCBieSBTdXJlZmlyZSB5ZXQKKyAgICBJbnRlZ2VyIGRwdGMgPSAoSW50ZWdlcikgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5EQVRBX1BST1ZJREVSX1RIUkVBRF9DT1VOVCk7CisgICAgaWYgKGRwdGMgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LmRhdGFQcm92aWRlclRocmVhZENvdW50ID0gZHB0YzsKKyAgICB9CisgICAgU3RyaW5nIGRlZmF1bHRTdWl0ZU5hbWUgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlNVSVRFX05BTUUpOworICAgIGlmIChkZWZhdWx0U3VpdGVOYW1lICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zdWl0ZU5hbWUgPSBkZWZhdWx0U3VpdGVOYW1lOworICAgIH0KKworICAgIFN0cmluZyBkZWZhdWx0VGVzdE5hbWUgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLlRFU1RfTkFNRSk7CisgICAgaWYgKGRlZmF1bHRUZXN0TmFtZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQudGVzdE5hbWUgPSBkZWZhdWx0VGVzdE5hbWU7CisgICAgfQorCisgICAgT2JqZWN0IGxpc3RlbmVycyA9IGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuTElTVEVORVIpOworICAgIGlmIChsaXN0ZW5lcnMgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICByZXN1bHQubGlzdGVuZXIgPSBVdGlscy5qb2luKChMaXN0PD8+KSBsaXN0ZW5lcnMsICIsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5saXN0ZW5lciA9IChTdHJpbmcpIGxpc3RlbmVyczsKKyAgICB9CisKKyAgICBTdHJpbmcgbXMgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLk1FVEhPRF9TRUxFQ1RPUlMpOworICAgIGlmIChudWxsICE9IG1zKSB7CisgICAgICByZXN1bHQubWV0aG9kU2VsZWN0b3JzID0gbXM7CisgICAgfQorCisgICAgU3RyaW5nIG9iamVjdEZhY3RvcnkgPSAoU3RyaW5nKSBjbWRMaW5lQXJncy5nZXQoQ29tbWFuZExpbmVBcmdzLk9CSkVDVF9GQUNUT1JZKTsKKyAgICBpZihudWxsICE9IG9iamVjdEZhY3RvcnkpIHsKKyAgICAgIHJlc3VsdC5vYmplY3RGYWN0b3J5ID0gb2JqZWN0RmFjdG9yeTsKKyAgICB9CisKKyAgICBTdHJpbmcgcnVubmVyRmFjdG9yeSA9IChTdHJpbmcpIGNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuVEVTVF9SVU5ORVJfRkFDVE9SWSk7CisgICAgaWYgKG51bGwgIT0gcnVubmVyRmFjdG9yeSkgeworICAgICAgcmVzdWx0LnRlc3RSdW5uZXJGYWN0b3J5ID0gcnVubmVyRmFjdG9yeTsKKyAgICB9CisKKyAgICBTdHJpbmcgcmVwb3J0ZXJDb25maWdzID0gKFN0cmluZykgY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5SRVBPUlRFUik7CisgICAgaWYgKHJlcG9ydGVyQ29uZmlncyAhPSBudWxsKSB7CisgICAgICByZXN1bHQucmVwb3J0ZXIgPSByZXBvcnRlckNvbmZpZ3M7CisgICAgfQorCisgICAgU3RyaW5nIGZhaWx1cmVQb2xpY3kgPSAoU3RyaW5nKWNtZExpbmVBcmdzLmdldChDb21tYW5kTGluZUFyZ3MuQ09ORklHX0ZBSUxVUkVfUE9MSUNZKTsKKyAgICBpZiAoZmFpbHVyZVBvbGljeSAhPSBudWxsKSB7CisgICAgICByZXN1bHQuY29uZmlnRmFpbHVyZVBvbGljeSA9IGZhaWx1cmVQb2xpY3k7CisgICAgfQorCisgICAgT2JqZWN0ICBzdWl0ZVRocmVhZFBvb2xTaXplID0gY21kTGluZUFyZ3MuZ2V0KENvbW1hbmRMaW5lQXJncy5TVUlURV9USFJFQURfUE9PTF9TSVpFKTsKKyAgICBpZiAobnVsbCAhPSBzdWl0ZVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgIGlmIChzdWl0ZVRocmVhZFBvb2xTaXplIGluc3RhbmNlb2YgU3RyaW5nKXsKKyAgICAgICAgICAgIHJlc3VsdC5zdWl0ZVRocmVhZFBvb2xTaXplPUludGVnZXIucGFyc2VJbnQoKFN0cmluZykgc3VpdGVUaHJlYWRQb29sU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1aXRlVGhyZWFkUG9vbFNpemUgaW5zdGFuY2VvZiBJbnRlZ2VyKXsKKyAgICAgICAgICAgIHJlc3VsdC5zdWl0ZVRocmVhZFBvb2xTaXplPShJbnRlZ2VyKSBzdWl0ZVRocmVhZFBvb2xTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgY29uZmlndXJlKHJlc3VsdCk7CisgIH0KKworICAvKioKKyAgICogT25seSBydW4gdGhlIHNwZWNpZmllZCB0ZXN0cyBmcm9tIHRoZSBzdWl0ZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRlc3ROYW1lcyhMaXN0PFN0cmluZz4gdGVzdE5hbWVzKSB7CisgICAgbV90ZXN0TmFtZXMgPSB0ZXN0TmFtZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyhCb29sZWFuIHNraXApIHsKKyAgICBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzID0gc2tpcDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRSZXBvcnRlcihSZXBvcnRlckNvbmZpZyByZXBvcnRlckNvbmZpZykgeworICAgIE9iamVjdCBpbnN0YW5jZSA9IHJlcG9ydGVyQ29uZmlnLm5ld1JlcG9ydGVySW5zdGFuY2UoKTsKKyAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgYWRkTGlzdGVuZXIoaW5zdGFuY2UpOworICAgIH0gZWxzZSB7CisgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IGZpbmQgcmVwb3J0ZSBjbGFzcyA6ICIgKyByZXBvcnRlckNvbmZpZy5nZXRDbGFzc05hbWUoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNwZWNpZnkgaWYgdGhpcyBydW4gc2hvdWxkIGJlIGluIE1hc3Rlci1TbGF2ZSBtb2RlIGFzIE1hc3RlcgorICAgKgorICAgKiBAcGFyYW0gZmlsZU5hbWUgcmVtb3RlLnByb3BlcnRpZXMgcGF0aAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TWFzdGVyKFN0cmluZyBmaWxlTmFtZSkgeworICAgICBtX21hc3RlcmZpbGVOYW1lID0gZmlsZU5hbWU7CisgIH0KKworICAvKioKKyAgICogU3BlY2lmeSBpZiB0aGlzIHJ1biBzaG91bGQgYmUgaW4gTWFzdGVyLVNsYXZlIG1vZGUgYXMgc2xhdmUKKyAgICoKKyAgICogQHBhcmFtIGZpbGVOYW1lIHJlbW90ZS5wcm9wZXJ0aWVzIHBhdGgKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFNsYXZlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICBtX3NsYXZlZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBTcGVjaWZ5IGlmIHRoaXMgcnVuIHNob3VsZCBiZSBtYWRlIGluIEpVbml0IG1vZGUKKyAgICoKKyAgICogQHBhcmFtIGlzSlVuaXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEpVbml0KEJvb2xlYW4gaXNKVW5pdCkgeworICAgIG1faXNKVW5pdCA9IGlzSlVuaXQ7CisgIH0KKworICAvKioKKyAgICogU3BlY2lmeSBpZiB0aGlzIHJ1biBzaG91bGQgYmUgbWFkZSBpbiBtaXhlZCBtb2RlCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNaXhlZChCb29sZWFuIGlzTWl4ZWQpIHsKKyAgICAgIGlmKGlzTWl4ZWQ9PW51bGwpeworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICBtX2lzTWl4ZWQgPSBpc01peGVkOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIFRoZSBUZXN0TkcgdmVyc2lvbiBpcyBub3cgZXN0YWJsaXNoZWQgYXQgbG9hZCB0aW1lLiBUaGlzCisgICAqIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZSBhbmQgaXMgbm93IGEgbm8tb3AuCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGVzdE5HVmVyc2lvbigpIHsKKyAgICBMT0dHRVIuaW5mbygic2V0VGVzdE5HVmVyc2lvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiIpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBKREsgMS40IEpBUiB2ZXJzaW9uIG9mIFRlc3RORywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgSkRLIDEuNCBKQVIgdmVyc2lvbiBvZiBUZXN0TkcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pkazE0KCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBEb3VibGUgY2hlY2sgdGhhdCB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHZhbGlkLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ29tbWFuZExpbmVQYXJhbWV0ZXJzKENvbW1hbmRMaW5lQXJncyBhcmdzKSB7CisgICAgU3RyaW5nIHRlc3RDbGFzc2VzID0gYXJncy50ZXN0Q2xhc3M7CisgICAgTGlzdDxTdHJpbmc+IHRlc3ROZ1htbCA9IGFyZ3Muc3VpdGVGaWxlczsKKyAgICBTdHJpbmcgdGVzdEphciA9IGFyZ3MudGVzdEphcjsKKyAgICBTdHJpbmcgc2xhdmUgPSBhcmdzLnNsYXZlOworICAgIExpc3Q8U3RyaW5nPiBtZXRob2RzID0gYXJncy5jb21tYW5kTGluZU1ldGhvZHM7CisKKyAgICBpZiAodGVzdENsYXNzZXMgPT0gbnVsbCAmJiBzbGF2ZSA9PSBudWxsICYmIHRlc3RKYXIgPT0gbnVsbAorICAgICAgICAmJiAodGVzdE5nWG1sID09IG51bGwgfHwgdGVzdE5nWG1sLmlzRW1wdHkoKSkKKyAgICAgICAgJiYgKG1ldGhvZHMgPT0gbnVsbCB8fCBtZXRob2RzLmlzRW1wdHkoKSkpIHsKKyAgICAgIHRocm93IG5ldyBQYXJhbWV0ZXJFeGNlcHRpb24oIllvdSBuZWVkIHRvIHNwZWNpZnkgYXQgbGVhc3Qgb25lIHRlc3RuZy54bWwsIG9uZSBjbGFzcyIKKyAgICAgICAgICArICIgb3Igb25lIG1ldGhvZCIpOworICAgIH0KKworICAgIFN0cmluZyBncm91cHMgPSBhcmdzLmdyb3VwczsKKyAgICBTdHJpbmcgZXhjbHVkZWRHcm91cHMgPSBhcmdzLmV4Y2x1ZGVkR3JvdXBzOworCisgICAgaWYgKHRlc3RKYXIgPT0gbnVsbCAmJgorICAgICAgICAobnVsbCAhPSBncm91cHMgfHwgbnVsbCAhPSBleGNsdWRlZEdyb3VwcykgJiYgdGVzdENsYXNzZXMgPT0gbnVsbAorICAgICAgICAmJiAodGVzdE5nWG1sID09IG51bGwgfHwgdGVzdE5nWG1sLmlzRW1wdHkoKSkpIHsKKyAgICAgIHRocm93IG5ldyBQYXJhbWV0ZXJFeGNlcHRpb24oIkdyb3VwcyBvcHRpb24gc2hvdWxkIGJlIHVzZWQgd2l0aCB0ZXN0Y2xhc3Mgb3B0aW9uIik7CisgICAgfQorCisgICAgaWYgKGFyZ3Muc2xhdmUgIT0gbnVsbCAmJiBhcmdzLm1hc3RlciAhPSBudWxsKSB7CisgICAgIHRocm93IG5ldyBQYXJhbWV0ZXJFeGNlcHRpb24oQ29tbWFuZExpbmVBcmdzLlNMQVZFICsgIiBjYW4ndCBiZSBjb21iaW5lZCB3aXRoICIKKyAgICAgICAgICsgQ29tbWFuZExpbmVBcmdzLk1BU1RFUik7CisgICAgfQorCisgICAgQm9vbGVhbiBqdW5pdCA9IGFyZ3MuanVuaXQ7CisgICAgQm9vbGVhbiBtaXhlZCA9IGFyZ3MubWl4ZWQ7CisgICAgaWYgKGp1bml0ICYmIG1peGVkKSB7CisgICAgIHRocm93IG5ldyBQYXJhbWV0ZXJFeGNlcHRpb24oQ29tbWFuZExpbmVBcmdzLk1JWEVEICsgIiBjYW4ndCBiZSBjb21iaW5lZCB3aXRoICIKKyAgICAgICAgICsgQ29tbWFuZExpbmVBcmdzLkpVTklUKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSB0ZXN0IGZhaWxlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGhhc0ZhaWx1cmUoKSB7CisgICAgcmV0dXJuIChnZXRTdGF0dXMoKSAmIEhBU19GQUlMVVJFKSA9PSBIQVNfRkFJTFVSRTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIHRlc3QgZmFpbGVkIHdpdGhpbiBzdWNjZXNzIHBlcmNlbnRhZ2UuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNGYWlsdXJlV2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UoKSB7CisgICAgcmV0dXJuIChnZXRTdGF0dXMoKSAmIEhBU19GU1ApID09IEhBU19GU1A7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSB0ZXN0IHdhcyBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzU2tpcCgpIHsKKyAgICByZXR1cm4gKGdldFN0YXR1cygpICYgSEFTX1NLSVBQRUQpID09IEhBU19TS0lQUEVEOworICB9CisKKyAgc3RhdGljIHZvaWQgZXhpdFdpdGhFcnJvcihTdHJpbmcgbXNnKSB7CisgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgdXNhZ2UoKTsKKyAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgeworICAgIHJldHVybiBtX291dHB1dERpcjsKKyAgfQorCisgIHB1YmxpYyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIGdldEFubm90YXRpb25UcmFuc2Zvcm1lcigpIHsKKyAgICByZXR1cm4gbV9hbm5vdGF0aW9uVHJhbnNmb3JtZXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIoSUFubm90YXRpb25UcmFuc2Zvcm1lciB0KSB7CisJLy8gY29tcGFyZSBieSByZWZlcmVuY2UhCisgICAgaWYgKG1fYW5ub3RhdGlvblRyYW5zZm9ybWVyICE9IG1fZGVmYXVsdEFubm9Qcm9jZXNzb3IgJiYgbV9hbm5vdGF0aW9uVHJhbnNmb3JtZXIgIT0gdCkgeworICAgIAlMT0dHRVIud2FybigiQW5ub3RhdGlvblRyYW5zZm9ybWVyIGFscmVhZHkgc2V0Iik7CisgICAgfQorICAgIG1fYW5ub3RhdGlvblRyYW5zZm9ybWVyID0gdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0U3VpdGVOYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdWl0ZU5hbWUoKSB7CisgICAgcmV0dXJuIG1fZGVmYXVsdFN1aXRlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGVmYXVsdFN1aXRlTmFtZSB0aGUgZGVmYXVsdFN1aXRlTmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTdWl0ZU5hbWUoU3RyaW5nIGRlZmF1bHRTdWl0ZU5hbWUpIHsKKyAgICBtX2RlZmF1bHRTdWl0ZU5hbWUgPSBkZWZhdWx0U3VpdGVOYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlZmF1bHRUZXN0TmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGVzdE5hbWUoKSB7CisgICAgcmV0dXJuIG1fZGVmYXVsdFRlc3ROYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBkZWZhdWx0VGVzdE5hbWUgdGhlIGRlZmF1bHRUZXN0TmFtZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRUZXN0TmFtZShTdHJpbmcgZGVmYXVsdFRlc3ROYW1lKSB7CisgICAgbV9kZWZhdWx0VGVzdE5hbWUgPSBkZWZhdWx0VGVzdE5hbWU7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgcG9saWN5IGZvciB3aGV0aGVyIG9yIG5vdCB0byBldmVyIGludm9rZSBhIGNvbmZpZ3VyYXRpb24gbWV0aG9kIGFnYWluIGFmdGVyCisgICAqIGl0IGhhcyBmYWlsZWQgb25jZS4gUG9zc2libGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHtAbGluayBYbWxTdWl0ZX0uICBUaGUgZGVmYXVsdAorICAgKiB2YWx1ZSBpcyB7QGxpbmsgWG1sU3VpdGUjU0tJUH0uCisgICAqIEBwYXJhbSBmYWlsdXJlUG9saWN5IHRoZSBjb25maWd1cmF0aW9uIGZhaWx1cmUgcG9saWN5CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25maWdGYWlsdXJlUG9saWN5KFN0cmluZyBmYWlsdXJlUG9saWN5KSB7CisgICAgbV9jb25maWdGYWlsdXJlUG9saWN5ID0gZmFpbHVyZVBvbGljeTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZhaWx1cmUgcG9saWN5LgorICAgKiBAcmV0dXJuIGNvbmZpZyBmYWlsdXJlIHBvbGljeQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDb25maWdGYWlsdXJlUG9saWN5KCkgeworICAgIHJldHVybiBtX2NvbmZpZ0ZhaWx1cmVQb2xpY3k7CisgIH0KKworICAvLyBERVBSRUNBVEVEOiB0byBiZSByZW1vdmVkIGFmdGVyIGEgbWFqb3IgdmVyc2lvbiBjaGFuZ2UKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMQorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHN0YXRpYyBUZXN0TkcgZ2V0RGVmYXVsdCgpIHsKKyAgICByZXR1cm4gbV9pbnN0YW5jZTsKKyAgfQorCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjEKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldEhhc0ZhaWx1cmUoYm9vbGVhbiBoYXNGYWlsdXJlKSB7CisgICAgbV9zdGF0dXMgfD0gSEFTX0ZBSUxVUkU7CisgIH0KKworICAvKioKKyAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4xCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCBzZXRIYXNGYWlsdXJlV2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UoYm9vbGVhbiBoYXNGYWlsdXJlV2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UpIHsKKyAgICBtX3N0YXR1cyB8PSBIQVNfRlNQOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMQorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0SGFzU2tpcChib29sZWFuIGhhc1NraXApIHsKKyAgICBtX3N0YXR1cyB8PSBIQVNfU0tJUFBFRDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhpdENvZGVMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXN1bHRMaXN0ZW5lcjIgeworICAgIHByaXZhdGUgVGVzdE5HIG1fbWFpblJ1bm5lcjsKKworICAgIHB1YmxpYyBFeGl0Q29kZUxpc3RlbmVyKCkgeworICAgICAgbV9tYWluUnVubmVyID0gVGVzdE5HLm1faW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIEV4aXRDb2RlTGlzdGVuZXIoVGVzdE5HIHJ1bm5lcikgeworICAgICAgbV9tYWluUnVubmVyID0gcnVubmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb24oSVRlc3RSZXN1bHQgdHIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgc2V0SGFzUnVuVGVzdHMoKTsKKyAgICAgIG1fbWFpblJ1bm5lci5zZXRTdGF0dXMoSEFTX0ZBSUxVUkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICBzZXRIYXNSdW5UZXN0cygpOworICAgICAgaWYgKChtX21haW5SdW5uZXIuZ2V0U3RhdHVzKCkgJiBIQVNfRkFJTFVSRSkgIT0gMCkgeworICAgICAgICBtX21haW5SdW5uZXIuc2V0U3RhdHVzKEhBU19TS0lQUEVEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgIHNldEhhc1J1blRlc3RzKCk7CisgICAgICBtX21haW5SdW5uZXIuc2V0U3RhdHVzKEhBU19GU1ApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICBzZXRIYXNSdW5UZXN0cygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgIHNldEhhc1J1blRlc3RzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2goSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTdGFydChJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgIHNldEhhc1J1blRlc3RzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEhhc1J1blRlc3RzKCkgeworICAgICAgbV9tYWluUnVubmVyLm1faGFzVGVzdHM9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uRmFpbHVyZShvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkZhaWx1cmUoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgICBtX21haW5SdW5uZXIuc2V0U3RhdHVzKEhBU19GQUlMVVJFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciNvbkNvbmZpZ3VyYXRpb25Ta2lwKG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU2tpcChJVGVzdFJlc3VsdCBpdHIpIHsKKyAgICAgIG1fbWFpblJ1bm5lci5zZXRTdGF0dXMoSEFTX1NLSVBQRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyI29uQ29uZmlndXJhdGlvblN1Y2Nlc3Mob3JnLnRlc3RuZy5JVGVzdFJlc3VsdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25TdWNjZXNzKElUZXN0UmVzdWx0IGl0cikgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRDb25maWd1cmFibGUoSUNvbmZpZ3VyYWJsZSBjKSB7CisJLy8gY29tcGFyZSBieSByZWZlcmVuY2UhCisgICAgaWYgKG1fY29uZmlndXJhYmxlICE9IG51bGwgJiYgbV9jb25maWd1cmFibGUgIT0gYykgeworICAgIAlMT0dHRVIud2FybigiQ29uZmlndXJhYmxlIGFscmVhZHkgc2V0Iik7CisJfQorICAgIG1fY29uZmlndXJhYmxlID0gYzsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRIb29rYWJsZShJSG9va2FibGUgaCkgeworCS8vIGNvbXBhcmUgYnkgcmVmZXJlbmNlIQorICAgIGlmIChtX2hvb2thYmxlICE9IG51bGwgJiYgbV9ob29rYWJsZSAhPSBoKSB7CisgICAgCUxPR0dFUi53YXJuKCJIb29rYWJsZSBhbHJlYWR5IHNldCIpOworICAgIH0KKyAgICBtX2hvb2thYmxlID0gaDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1ldGhvZEludGVyY2VwdG9yKElNZXRob2RJbnRlcmNlcHRvciBtZXRob2RJbnRlcmNlcHRvcikgeworICAgIG1fbWV0aG9kSW50ZXJjZXB0b3JzLmFkZChtZXRob2RJbnRlcmNlcHRvcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudChpbnQgY291bnQpIHsKKyAgICBtX2RhdGFQcm92aWRlclRocmVhZENvdW50ID0gY291bnQ7CisgIH0KKworICAvKiogQWRkIGEgY2xhc3MgbG9hZGVyIHRvIHRoZSBzZWFyY2hhYmxlIGxvYWRlcnMuICovCisgIHB1YmxpYyB2b2lkIGFkZENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgQ2xhc3NIZWxwZXIuYWRkQ2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZU9yZGVyKGJvb2xlYW4gYikgeworICAgIG1fcHJlc2VydmVPcmRlciA9IGI7CisgIH0KKworICBwcm90ZWN0ZWQgbG9uZyBnZXRTdGFydCgpIHsKKyAgICByZXR1cm4gbV9zdGFydDsKKyAgfQorCisgIHByb3RlY3RlZCBsb25nIGdldEVuZCgpIHsKKyAgICByZXR1cm4gbV9lbmQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHcm91cEJ5SW5zdGFuY2VzKGJvb2xlYW4gYikgeworICAgIG1fZ3JvdXBCeUluc3RhbmNlcyA9IGI7CisgIH0KKworICAvLy8vLworICAvLyBTZXJ2aWNlTG9hZGVyIHRlc3RpbmcKKyAgLy8KKworICBwcml2YXRlIFVSTENsYXNzTG9hZGVyIG1fc2VydmljZUxvYWRlckNsYXNzTG9hZGVyOworICBwcml2YXRlIExpc3Q8SVRlc3ROR0xpc3RlbmVyPiBtX3NlcnZpY2VMb2FkZXJMaXN0ZW5lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAvKgorICAgKiBVc2VkIHRvIHRlc3QgU2VydmljZUNsYXNzTG9hZGVyCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTG9hZGVyQ2xhc3NMb2FkZXIoVVJMQ2xhc3NMb2FkZXIgdWNsKSB7CisgICAgbV9zZXJ2aWNlTG9hZGVyQ2xhc3NMb2FkZXIgPSB1Y2w7CisgIH0KKworICAvKgorICAgKiBVc2VkIHRvIHRlc3QgU2VydmljZUNsYXNzTG9hZGVyCisgICAqLworICBwcml2YXRlIHZvaWQgYWRkU2VydmljZUxvYWRlckxpc3RlbmVyKElUZXN0TkdMaXN0ZW5lciBsKSB7CisgICAgbV9zZXJ2aWNlTG9hZGVyTGlzdGVuZXJzLmFkZChsKTsKKyAgfQorCisgIC8qCisgICAqIFVzZWQgdG8gdGVzdCBTZXJ2aWNlQ2xhc3NMb2FkZXIKKyAgICovCisgIHB1YmxpYyBMaXN0PElUZXN0TkdMaXN0ZW5lcj4gZ2V0U2VydmljZUxvYWRlckxpc3RlbmVycygpIHsKKyAgICByZXR1cm4gbV9zZXJ2aWNlTG9hZGVyTGlzdGVuZXJzOworICB9CisKKyAgLy8KKyAgLy8gU2VydmljZUxvYWRlciB0ZXN0aW5nCisgIC8vLy8vCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGVzdE5HQW50VGFzay5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3ROR0FudFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZGFlMDczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3ROR0FudFRhc2suamF2YQpAQCAtMCwwICsxLDExNzQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVXYXRjaGRvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVuYW1lU2VsZWN0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlZlcmJvc2VSZXBvcnRlcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzLmlzU3RyaW5nTm90Qmxhbms7CisKKy8qKgorICogVGVzdE5HIHNldHRpbmdzOgorICogPHVsPgorICogPGxpPmNsYXNzZmlsZXNldCAoaW5uZXIpPC9saT4KKyAqIDxsaT5jbGFzc2ZpbGVzZXRyZWYgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnhtbGZpbGVzZXQgKGlubmVyKTwvbGk+CisgKiA8bGk+eG1sZmlsZXNldHJlZiAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+ZW5hYmxlQXNzZXJ0IChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5leGNsdWRlZEdyb3VwcyAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+Z3JvdXBzIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5qdW5pdCAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+bGlzdGVuZXIgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPm91dHB1dGRpciAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+cGFyYWxsZWwgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnJlcG9ydGVyIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5zb3VyY2VkaXIgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnNvdXJjZWRpcnJlZiAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+c3VpdGVuYW1lIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5zdWl0ZXJ1bm5lcmNsYXNzIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT50YXJnZXQgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnRlc3RqYXIgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnRlc3RuYW1lIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT50aHJlYWRjb3VudCAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+ZGF0YXByb3ZpZGVydGhyZWFkY291bnQgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnZlcmJvc2UgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnRlc3RydW5mYWN0b3J5IChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5jb25maWdGYWlsdXJlcG9saWN5IChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5yYW5kb21pemVTdWl0ZXMgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPm1ldGhvZHNlbGVjdG9ycyAoYXR0cmlidXRlKTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEFudCBzZXR0aW5nczoKKyAqIDx1bD4KKyAqIDxsaT5jbGFzc3BhdGggKGlubmVyKTwvbGk+CisgKiA8bGk+Y2xhc3NwYXRocmVmIChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5qdm0gKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPndvcmtpbmdEaXIgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPmVudiAoaW5uZXIpPC9saT4KKyAqIDxsaT5zeXNwcm9wZXJ0eSAoaW5uZXIpPC9saT4KKyAqIDxsaT5wcm9wZXJ0eXNldCAoaW5uZXIpPC9saT4KKyAqIDxsaT5qdm1hcmcgKGlubmVyKTwvbGk+CisgKiA8bGk+dGltZW91dCAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+aGFsdG9uZmFpbHVyZSAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+b25IYWx0VGFyZ2V0IChhdHRyaWJ1dGUpPC9saT4KKyAqIDxsaT5mYWlsdXJlUHJvcGVydHkgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPmhhbHRvbkZTUCAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+RlNQcHJvcGVydHkgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPmhhbHRvbnNraXBwZWQgKGF0dHJpYnV0ZSk8L2xpPgorICogPGxpPnNraXBwZWRQcm9wZXJ0eSAoYXR0cmlidXRlKTwvbGk+CisgKiA8bGk+dGVzdFJ1bm5lckZhY3RvcnkgKGF0dHJpYnV0ZSk8L2xpPgorICogPC91bD4KKyAqCisgKiBEZWJ1ZyBpbmZvcm1hdGlvbjoKKyAqIDx1bD4KKyAqIDxsaT5kdW1wQ29tbWFuZCAoYm9vbGVhbik8L2xpPgorICogPGxpPmR1bXBFbnYgKGJvb2xlYW4pPC9saT4KKyAqIDxsaT5kdW1wU3lzIChib29sZWFuKTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvIj5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0CisgKiBAYXV0aG9yIEx1a2FzIEp1bmdtYW5uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TkdBbnRUYXNrIGV4dGVuZHMgVGFzayB7CisKKyAgcHJvdGVjdGVkIENvbW1hbmRsaW5lSmF2YSBtX2phdmFDb21tYW5kOworCisgIHByb3RlY3RlZCBMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gbV94bWxGaWxlc2V0cz0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByb3RlY3RlZCBMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gbV9jbGFzc0ZpbGVzZXRzPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJvdGVjdGVkIEZpbGUgbV9vdXRwdXREaXI7CisgIHByb3RlY3RlZCBGaWxlIG1fdGVzdGphcjsKKyAgcHJvdGVjdGVkIEZpbGUgbV93b3JraW5nRGlyOworICBwcml2YXRlIEludGVnZXIgbV90aW1lb3V0OworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xpc3RlbmVycz0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fbWV0aG9kc2VsZWN0b3JzPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9vYmplY3RGYWN0b3J5OworICBwcm90ZWN0ZWQgU3RyaW5nIG1fdGVzdFJ1bm5lckZhY3Rvcnk7CisgIHByaXZhdGUgYm9vbGVhbiBtX2RlbGVnYXRlQ29tbWFuZFN5c3RlbVByb3BlcnRpZXMgPSBmYWxzZTsKKworICBwcm90ZWN0ZWQgRW52aXJvbm1lbnQgbV9lbnZpcm9ubWVudD0gbmV3IEVudmlyb25tZW50KCk7CisKKyAgLyoqIFRoZSBzdWl0ZSBydW5uZXIgbmFtZSAoZGVmYXVsdHMgdG8gVGVzdE5HLmNsYXNzLmdldE5hbWUoKS4gKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBtX21haW5DbGFzcyA9IFRlc3RORy5jbGFzcy5nZXROYW1lKCk7CisKKyAgLyoqIFRydWUgaWYgdGhlIHRlbXBvcmFyeSBmaWxlIGNyZWF0ZWQgYnkgdGhlIEFudCBUYXNrIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycworICAgKiB0byBUZXN0Tkcgc2hvdWxkIGJlIHByZXNlcnZlZCBhZnRlciBleGVjdXRpb24uICovCisgIHByb3RlY3RlZCBib29sZWFuIG1fZHVtcDsKKyAgcHJpdmF0ZSBib29sZWFuIG1fZHVtcEVudjsKKyAgcHJpdmF0ZSBib29sZWFuIG1fZHVtcFN5czsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBtX2Fzc2VydEVuYWJsZWQ9IHRydWU7CisgIHByb3RlY3RlZCBib29sZWFuIG1faGFsdE9uRmFpbHVyZTsKKyAgcHJvdGVjdGVkIFN0cmluZyBtX29uSGFsdFRhcmdldDsKKyAgcHJvdGVjdGVkIFN0cmluZyBtX2ZhaWx1cmVQcm9wZXJ0eU5hbWU7CisgIHByb3RlY3RlZCBib29sZWFuIG1faGFsdE9uU2tpcHBlZDsKKyAgcHJvdGVjdGVkIFN0cmluZyBtX3NraXBwZWRQcm9wZXJ0eU5hbWU7CisgIHByb3RlY3RlZCBib29sZWFuIG1faGFsdE9uRlNQOworICBwcm90ZWN0ZWQgU3RyaW5nIG1fZnNwUHJvcGVydHlOYW1lOworICBwcm90ZWN0ZWQgU3RyaW5nIG1faW5jbHVkZWRHcm91cHM7CisgIHByb3RlY3RlZCBTdHJpbmcgbV9leGNsdWRlZEdyb3VwczsKKyAgcHJvdGVjdGVkIFN0cmluZyBtX3BhcmFsbGVsTW9kZTsKKyAgcHJvdGVjdGVkIFN0cmluZyBtX3RocmVhZENvdW50OworICBwcm90ZWN0ZWQgU3RyaW5nIG1fZGF0YXByb3ZpZGVydGhyZWFkQ291bnQ7CisgIHByb3RlY3RlZCBTdHJpbmcgbV9jb25maWdGYWlsdXJlUG9saWN5OworICBwcm90ZWN0ZWQgQm9vbGVhbiBtX3JhbmRvbWl6ZVN1aXRlczsKKyAgcHVibGljIFN0cmluZyBtX3VzZURlZmF1bHRMaXN0ZW5lcnM7CisgIHByaXZhdGUgU3RyaW5nIG1fc3VpdGVOYW1lPSJBbnQgc3VpdGUiOworICBwcml2YXRlIFN0cmluZyBtX3Rlc3ROYW1lPSJBbnQgdGVzdCI7CisgIHByaXZhdGUgQm9vbGVhbiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICBwcml2YXRlIFN0cmluZyBtX21ldGhvZHM7CisgIHByaXZhdGUgTW9kZSBtb2RlID0gTW9kZS50ZXN0bmc7CisKKyAgcHVibGljIGVudW0gTW9kZSB7CisgICAgICAvL2xvd2VyLWNhc2UgdG8gYmV0dGVyIGxvb2sgaW4gYnVpbGQgc2NyaXB0cworICAgICAgdGVzdG5nLCBqdW5pdCwgbWl4ZWQ7CisgIH0KKyAgCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiByZXBvcnQgbGlzdGVuZXJzIGFkZGVkIHZpYSAmbHQ7cmVwb3J0ZXImZ3Q7IHN1Yi1lbGVtZW50IG9mIHRoZSBBbnQgdGFzaworICAgKi8KKyAgcHJpdmF0ZSBMaXN0PFJlcG9ydGVyQ29uZmlnPiByZXBvcnRlckNvbmZpZ3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBwcml2YXRlIFN0cmluZyBtX3Rlc3ROYW1lcyA9ICIiOworCisgIHB1YmxpYyB2b2lkIHNldFBhcmFsbGVsKFN0cmluZyBwYXJhbGxlbCkgeworICAgIG1fcGFyYWxsZWxNb2RlPSBwYXJhbGxlbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRocmVhZENvdW50KFN0cmluZyB0aHJlYWRDb3VudCkgeworICAgIG1fdGhyZWFkQ291bnQ9IHRocmVhZENvdW50OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RGF0YVByb3ZpZGVyVGhyZWFkQ291bnQoU3RyaW5nIGRhdGFwcm92aWRlcnRocmVhZENvdW50KSB7CisgICAgbV9kYXRhcHJvdmlkZXJ0aHJlYWRDb3VudCA9IGRhdGFwcm92aWRlcnRocmVhZENvdW50OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdExpc3RlbmVycyhTdHJpbmcgZikgeworICAgIG1fdXNlRGVmYXVsdExpc3RlbmVycz0gZjsKKyAgfQorCisgIC8vIEFudCB0YXNrIHNldHRpbmdzCisgIHB1YmxpYyB2b2lkIHNldEhhbHRvbmZhaWx1cmUoYm9vbGVhbiB2YWx1ZSkgeworICAgIG1faGFsdE9uRmFpbHVyZT0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRPbkhhbHRUYXJnZXQoU3RyaW5nIHRhcmdldE5hbWUpIHsKKyAgICBtX29uSGFsdFRhcmdldD0gdGFyZ2V0TmFtZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgbV9mYWlsdXJlUHJvcGVydHlOYW1lPSBwcm9wZXJ0eU5hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRIYWx0b25za2lwcGVkKGJvb2xlYW4gdmFsdWUpIHsKKyAgICBtX2hhbHRPblNraXBwZWQ9IHZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2tpcHBlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICBtX3NraXBwZWRQcm9wZXJ0eU5hbWU9IHByb3BlcnR5TmFtZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEhhbHRvbkZTUChib29sZWFuIHZhbHVlKSB7CisgICAgbV9oYWx0T25GU1A9IHZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RlNQUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgIG1fZnNwUHJvcGVydHlOYW1lPSBwcm9wZXJ0eU5hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZUNvbW1hbmRTeXN0ZW1Qcm9wZXJ0aWVzKGJvb2xlYW4gdmFsdWUpeworICAgIG1fZGVsZWdhdGVDb21tYW5kU3lzdGVtUHJvcGVydGllcyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGZsYWcgdG8gbG9nIHRoZSBjb21tYW5kIGxpbmUuIFdoZW4gdmVyYm9zZSBpcyBzZXQgdG8gdHJ1ZQorICAgKiB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiBhIHRlbXBvcmFyeSBmaWxlIHN0b3JlZAorICAgKiBpbiB0aGUgdXNlcidzIGRlZmF1bHQgdGVtcG9yYXJ5IGZpbGUgZGlyZWN0b3J5LiBUaGUgZmlsZSBjcmVhdGVkIGlzCisgICAqIHByZWZpeGVkIHdpdGggInRlc3RuZyIuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXREdW1wQ29tbWFuZChib29sZWFuIHZlcmJvc2UpIHsKKyAgICBtX2R1bXAgPSB2ZXJib3NlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGZsYWcgdG8gd3JpdGUgb24gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gdGhlIEFudAorICAgKiBFbnZpcm9ubWVudCBwcm9wZXJ0aWVzLgorICAgKgorICAgKiBAcGFyYW0gdmVyYm9zZSA8dHQ+dHJ1ZTwvdHQ+IGZvciBwcmludGluZworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RHVtcEVudihib29sZWFuIHZlcmJvc2UpIHsKKyAgICBtX2R1bXBFbnY9IHZlcmJvc2U7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0ZSBmbGFnIHRvIHdyaXRlIG9uIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICogQHBhcmFtIHZlcmJvc2UgPHR0PnRydWU8L3R0PiBmb3IgZHVtcGluZyB0aGUgaW5mbworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RHVtcFN5cyhib29sZWFuIHZlcmJvc2UpIHsKKyAgICBtX2R1bXBTeXM9IHZlcmJvc2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRFbmFibGVBc3NlcnQoYm9vbGVhbiBmbGFnKSB7CisgICAgbV9hc3NlcnRFbmFibGVkPSBmbGFnOworICB9CisKKyAgLyoqCisgICAqIFRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4KKyAgICogQHBhcmFtIHdvcmtpbmdEaXIgdGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIEpWTSBmcm9tLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcihGaWxlIHdvcmtpbmdEaXIpIHsKKyAgICBtX3dvcmtpbmdEaXI9IHdvcmtpbmdEaXI7CisgIH0KKworICAvKioKKyAgICogU2V0cyBhIHBhcnRpY3VsYXIgSlZNIHRvIGJlIHVzZWQuIERlZmF1bHQgaXMgJ2phdmEnIGFuZCBpcyBzb2x2ZWQKKyAgICogYnkgPGNvZGU+UnVudGltZS5leGVjKCk8L2NvZGU+LgorICAgKgorICAgKiBAcGFyYW0ganZtIHRoZSBuZXcganZtCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRKdm0oU3RyaW5nIGp2bSkgeworICAgIGdldEphdmFDb21tYW5kKCkuc2V0Vm0oanZtKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHRpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykuCisgICAqCisgICAqIDxwPklmIHRoZSB0ZXN0cyBhcmUgcnVubmluZyBmb3IgbW9yZSB0aGFuIHRoaXMgdmFsdWUsIHRoZSB0ZXN0cworICAgKiB3aWxsIGJlIGNhbmNlbGVkLgorICAgKgorICAgKiA8L3A+CisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbWF4aW11bSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGFsbG93ZWQgYmVmb3JlIGRlY2xhcmluZyB0aGUgdGVzdCBhcyAndGltZWQtb3V0JworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIHZhbHVlKSB7CisgICAgbV90aW1lb3V0PSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVKdm1hcmcoKSB7CisgICAgcmV0dXJuIGdldEphdmFDb21tYW5kKCkuY3JlYXRlVm1Bcmd1bWVudCgpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkU3lzcHJvcGVydHkoRW52aXJvbm1lbnQuVmFyaWFibGUgc3lzcCkgeworICAgIGdldEphdmFDb21tYW5kKCkuYWRkU3lzcHJvcGVydHkoc3lzcCk7CisgIH0KKworICAvKioKKyAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZTsgdXNlZCB3aGVuIGZvcmtpbmcuCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRFbnYoRW52aXJvbm1lbnQuVmFyaWFibGUgdmFyKSB7CisgICAgbV9lbnZpcm9ubWVudC5hZGRWYXJpYWJsZSh2YXIpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgcGF0aCB0byBjbGFzc3BhdGggdXNlZCBmb3IgdGVzdHMuCisgICAqCisgICAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggaW4gdGhlIGVtYmVkZGVkIGphdmEgY29tbWFuZCBsaW5lCisgICAqLworICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgcmV0dXJuIGdldEphdmFDb21tYW5kKCkuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSkuY3JlYXRlUGF0aCgpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBib290Y2xhc3NwYXRoLgorICAgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgYm9vdGNsYXNzcGF0aCBpbiB0aGUgZW1iZWRkZWQgamF2YSBjb21tYW5kIGxpbmUKKyAgICovCisgIHB1YmxpYyBQYXRoIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKSB7CisgICAgcmV0dXJuIGdldEphdmFDb21tYW5kKCkuY3JlYXRlQm9vdGNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLmNyZWF0ZVBhdGgoKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgSmF2YSBjbGFzcworICAgKgorICAgKiBAcGFyYW0gcyBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY2xhc3NwYXRoLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggcykgeworICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChzKTsKKyAgfQorCisgIC8qKgorICAgKiBDbGFzc3BhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuCisgICAqCisgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIGNsYXNzcGF0aAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRYbWxmaWxlc2V0KEZpbGVTZXQgZnMpIHsKKyAgICBtX3htbEZpbGVzZXRzLmFkZChmcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRYbWxmaWxlc2V0UmVmKFJlZmVyZW5jZSByZWYpIHsKKyAgICBtX3htbEZpbGVzZXRzLmFkZChjcmVhdGVSZXNvdXJjZUNvbGxlY3Rpb24ocmVmKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDbGFzc2ZpbGVzZXQoRmlsZVNldCBmcykgeworICAgIG1fY2xhc3NGaWxlc2V0cy5hZGQoYXBwZW5kQ2xhc3NTZWxlY3RvcihmcykpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2xhc3NmaWxlc2V0UmVmKFJlZmVyZW5jZSByZWYpIHsKKyAgICBtX2NsYXNzRmlsZXNldHMuYWRkKGNyZWF0ZVJlc291cmNlQ29sbGVjdGlvbihyZWYpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRlc3ROYW1lcyhTdHJpbmcgdGVzdE5hbWVzKSB7CisgICAgbV90ZXN0TmFtZXMgPSB0ZXN0TmFtZXM7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgc3VpdGUgcnVubmVyIGNsYXNzIHRvIGludm9rZQorICAgKiBAcGFyYW0gcyB0aGUgbmFtZSBvZiB0aGUgc3VpdGUgcnVubmVyIGNsYXNzCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTdWl0ZVJ1bm5lckNsYXNzKFN0cmluZyBzKSB7CisgICAgbV9tYWluQ2xhc3M9IHM7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgc3VpdGUgbmFtZQorICAgKiBAcGFyYW0gcyB0aGUgbmFtZSBvZiB0aGUgc3VpdGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN1aXRlTmFtZShTdHJpbmcgcykgeworICAgIG1fc3VpdGVOYW1lPSBzOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRlc3QgbmFtZQorICAgKiBAcGFyYW0gcyB0aGUgbmFtZSBvZiB0aGUgdGVzdAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGVzdE5hbWUoU3RyaW5nIHMpIHsKKyAgICBtX3Rlc3ROYW1lPSBzOworICB9CisKKyAgLy8gVGVzdE5HIHNldHRpbmdzCisgIHB1YmxpYyB2b2lkIHNldEpVbml0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBtb2RlID0gdmFsdWUgPyBNb2RlLmp1bml0IDogTW9kZS50ZXN0bmc7CisgIH0KKworICAvLyBUZXN0Tkcgc2V0dGluZ3MKKyAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpIHsKKyAgICB0aGlzLm1vZGUgPSBtb2RlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRlc3Qgb3V0cHV0IGRpcmVjdG9yeQorICAgKiBAcGFyYW0gZGlyIHRoZSBuYW1lIG9mIGRpcmVjdG9yeQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKEZpbGUgZGlyKSB7CisgICAgbV9vdXRwdXREaXI9IGRpcjsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0ZXN0IGphcgorICAgKiBAcGFyYW0gcyB0aGUgbmFtZSBvZiB0ZXN0IGphcgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGVzdEphcihGaWxlIHMpIHsKKyAgICBtX3Rlc3RqYXI9IHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoU3RyaW5nIGdyb3VwcykgeworICAgIG1faW5jbHVkZWRHcm91cHM9IGdyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkR3JvdXBzKFN0cmluZyBncm91cHMpIHsKKyAgICBtX2V4Y2x1ZGVkR3JvdXBzPSBncm91cHM7CisgIH0KKworICBwcml2YXRlIEludGVnZXIgbV92ZXJib3NlPSBudWxsOworCisgIHByaXZhdGUgSW50ZWdlciBtX3N1aXRlVGhyZWFkUG9vbFNpemU7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbV94bWxQYXRoSW5KYXI7CisKKyAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShJbnRlZ2VyIHZlcmJvc2UpIHsKKyAgICBtX3ZlcmJvc2U9IHZlcmJvc2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihTdHJpbmcgbGlzdGVuZXIpIHsKKyAgICBtX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T2JqZWN0RmFjdG9yeShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgbV9vYmplY3RGYWN0b3J5ID0gY2xhc3NOYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VGVzdFJ1bm5lckZhY3RvcnkoU3RyaW5nIHRlc3RSdW5uZXJGYWN0b3J5KSB7CisgICAgbV90ZXN0UnVubmVyRmFjdG9yeSA9IHRlc3RSdW5uZXJGYWN0b3J5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3VpdGVUaHJlYWRQb29sU2l6ZShJbnRlZ2VyIG4pIHsKKyAgICBtX3N1aXRlVGhyZWFkUG9vbFNpemUgPSBuOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIFVzZSAibGlzdGVuZXJzIgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisgICAgbV9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVycyhTdHJpbmcgbGlzdGVuZXJzKSB7CisgICAgU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3RlbmVycywgIiAsIik7CisgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICBtX2xpc3RlbmVycy5hZGQoc3QubmV4dFRva2VuKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1ldGhvZFNlbGVjdG9ycyhTdHJpbmcgbWV0aG9kU2VsZWN0b3JzKSB7CisJU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKG1ldGhvZFNlbGVjdG9ycywgIiAsIik7CisJd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKSB7CisJIG1fbWV0aG9kc2VsZWN0b3JzLmFkZChzdC5uZXh0VG9rZW4oKSk7CisJfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmFpbHVyZVBvbGljeShTdHJpbmcgZmFpbHVyZVBvbGljeSkgeworICAgIG1fY29uZmlnRmFpbHVyZVBvbGljeSA9IGZhaWx1cmVQb2xpY3k7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSYW5kb21pemVTdWl0ZXMoQm9vbGVhbiByYW5kb21pemVTdWl0ZXMpIHsKKyAgICBtX3JhbmRvbWl6ZVN1aXRlcyA9IHJhbmRvbWl6ZVN1aXRlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1ldGhvZHMoU3RyaW5nIG1ldGhvZHMpIHsKKyAgICBtX21ldGhvZHMgPSBtZXRob2RzOworICB9CisKKyAgLyoqCisgICAqIExhdW5jaGVzIFRlc3RORyBpbiBhIG5ldyBKVk0uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICB2YWxpZGF0ZU9wdGlvbnMoKTsKKworICAgIENvbW1hbmRsaW5lSmF2YSBjbWQgPSBnZXRKYXZhQ29tbWFuZCgpOworICAgIGNtZC5zZXRDbGFzc25hbWUobV9tYWluQ2xhc3MpOworICAgIGlmKG1fYXNzZXJ0RW5hYmxlZCkgeworICAgICAgY21kLmNyZWF0ZVZtQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVhIik7CisgICAgfQorICAgIGlmIChtX2RlbGVnYXRlQ29tbWFuZFN5c3RlbVByb3BlcnRpZXMpIHsKKyAgICAgIGRlbGVnYXRlQ29tbWFuZFN5c3RlbVByb3BlcnRpZXMoKTsKKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IGFyZ3YgPSBjcmVhdGVBcmd1bWVudHMoKTsKKworICAgIFN0cmluZyBmaWxlTmFtZT0gIiI7CisgICAgRmlsZVdyaXRlciBmdz0gbnVsbDsKKyAgICBCdWZmZXJlZFdyaXRlciBidz0gbnVsbDsKKyAgICB0cnkgeworICAgICAgRmlsZSBmPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0bmciLCAiIik7CisgICAgICBmaWxlTmFtZT0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgLy8gSWYgdGhlIHVzZXIgYXNrZWQgdG8gc2VlIHRoZSBjb21tYW5kLCBwcmVzZXJ2ZSB0aGUgZmlsZQorICAgICAgaWYoIW1fZHVtcCkgeworICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgfQorICAgICAgZnc9IG5ldyBGaWxlV3JpdGVyKGYpOworICAgICAgYnc9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7CisgICAgICBmb3IoU3RyaW5nIGFyZyA6IGFyZ3YpIHsKKyAgICAgICAgYncud3JpdGUoYXJnKTsKKyAgICAgICAgYncubmV3TGluZSgpOworICAgICAgfQorICAgICAgYncuZmx1c2goKTsKKyAgICB9CisgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICB0cnkgeworICAgICAgICBpZihidyAhPSBudWxsKSB7CisgICAgICAgICAgYncuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZihmdyAhPSBudWxsKSB7CisgICAgICAgICAgZncuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaW50RGVidWdJbmZvKGZpbGVOYW1lKTsKKworICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldExvY2F0aW9uKGZpbmRKYXIoKSk7CisKKyAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiQCIgKyBmaWxlTmFtZSk7CisKKyAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2c9IGNyZWF0ZVdhdGNoZG9nKCk7CisgICAgYm9vbGVhbiB3YXNLaWxsZWQ9IGZhbHNlOworICAgIGludCBleGl0VmFsdWU9IGV4ZWN1dGVBc0ZvcmtlZChjbWQsIHdhdGNoZG9nKTsKKyAgICBpZihudWxsICE9IHdhdGNoZG9nKSB7CisgICAgICB3YXNLaWxsZWQ9IHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKTsKKyAgICB9CisKKyAgICBhY3RPblJlc3VsdChleGl0VmFsdWUsIHdhc0tpbGxlZCk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjcmVhdGVBcmd1bWVudHMoKSB7CisJTGlzdDxTdHJpbmc+IGFyZ3Y9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGFkZEJvb2xlYW5JZlRydWUoYXJndiwgQ29tbWFuZExpbmVBcmdzLkpVTklULCBtb2RlID09IE1vZGUuanVuaXQpOworICAgIGFkZEJvb2xlYW5JZlRydWUoYXJndiwgQ29tbWFuZExpbmVBcmdzLk1JWEVELCBtb2RlID09IE1vZGUubWl4ZWQpOworICAgIGFkZEJvb2xlYW5JZlRydWUoYXJndiwgQ29tbWFuZExpbmVBcmdzLlNLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTLCBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKTsKKyAgICBhZGRJbnRlZ2VySWZOb3ROdWxsKGFyZ3YsIENvbW1hbmRMaW5lQXJncy5MT0csIG1fdmVyYm9zZSk7CisgICAgYWRkRGVmYXVsdExpc3RlbmVycyhhcmd2KTsKKyAgICBhZGRPdXRwdXREaXIoYXJndik7CisgICAgYWRkRmlsZUlmRmlsZShhcmd2LCBDb21tYW5kTGluZUFyZ3MuVEVTVF9KQVIsIG1fdGVzdGphcik7CisgICAgYWRkU3RyaW5nSWZOb3RCbGFuayhhcmd2LCBDb21tYW5kTGluZUFyZ3MuR1JPVVBTLCBtX2luY2x1ZGVkR3JvdXBzKTsKKyAgICBhZGRTdHJpbmdJZk5vdEJsYW5rKGFyZ3YsIENvbW1hbmRMaW5lQXJncy5FWENMVURFRF9HUk9VUFMsIG1fZXhjbHVkZWRHcm91cHMpOworICAgIGFkZEZpbGVzT2ZSQ29sbGVjdGlvbihhcmd2LCBDb21tYW5kTGluZUFyZ3MuVEVTVF9DTEFTUywgbV9jbGFzc0ZpbGVzZXRzKTsKKyAgICBhZGRMaXN0T2ZTdHJpbmdJZk5vdEVtcHR5KGFyZ3YsIENvbW1hbmRMaW5lQXJncy5MSVNURU5FUiwgbV9saXN0ZW5lcnMpOworICAgIGFkZExpc3RPZlN0cmluZ0lmTm90RW1wdHkoYXJndiwgQ29tbWFuZExpbmVBcmdzLk1FVEhPRF9TRUxFQ1RPUlMsIG1fbWV0aG9kc2VsZWN0b3JzKTsKKyAgICBhZGRTdHJpbmdJZk5vdE51bGwoYXJndiwgQ29tbWFuZExpbmVBcmdzLk9CSkVDVF9GQUNUT1JZLCBtX29iamVjdEZhY3RvcnkpOworICAgIGFkZFN0cmluZ0lmTm90TnVsbChhcmd2LCBDb21tYW5kTGluZUFyZ3MuVEVTVF9SVU5ORVJfRkFDVE9SWSwgbV90ZXN0UnVubmVyRmFjdG9yeSk7CisgICAgYWRkU3RyaW5nSWZOb3ROdWxsKGFyZ3YsIENvbW1hbmRMaW5lQXJncy5QQVJBTExFTCwgbV9wYXJhbGxlbE1vZGUpOworICAgIGFkZFN0cmluZ0lmTm90TnVsbChhcmd2LCBDb21tYW5kTGluZUFyZ3MuQ09ORklHX0ZBSUxVUkVfUE9MSUNZLCBtX2NvbmZpZ0ZhaWx1cmVQb2xpY3kpOworICAgIGFkZEJvb2xlYW5JZlRydWUoYXJndiwgQ29tbWFuZExpbmVBcmdzLlJBTkRPTUlaRV9TVUlURVMsIG1fcmFuZG9taXplU3VpdGVzKTsKKyAgICBhZGRTdHJpbmdJZk5vdE51bGwoYXJndiwgQ29tbWFuZExpbmVBcmdzLlRIUkVBRF9DT1VOVCwgbV90aHJlYWRDb3VudCk7CisgICAgYWRkU3RyaW5nSWZOb3ROdWxsKGFyZ3YsIENvbW1hbmRMaW5lQXJncy5EQVRBX1BST1ZJREVSX1RIUkVBRF9DT1VOVCwgbV9kYXRhcHJvdmlkZXJ0aHJlYWRDb3VudCk7CisgICAgYWRkU3RyaW5nSWZOb3RCbGFuayhhcmd2LCBDb21tYW5kTGluZUFyZ3MuU1VJVEVfTkFNRSwgbV9zdWl0ZU5hbWUpOworICAgIGFkZFN0cmluZ0lmTm90QmxhbmsoYXJndiwgQ29tbWFuZExpbmVBcmdzLlRFU1RfTkFNRSwgbV90ZXN0TmFtZSk7CisgICAgYWRkU3RyaW5nSWZOb3RCbGFuayhhcmd2LCBDb21tYW5kTGluZUFyZ3MuVEVTVF9OQU1FUywgbV90ZXN0TmFtZXMpOworICAgIGFkZFN0cmluZ0lmTm90QmxhbmsoYXJndiwgQ29tbWFuZExpbmVBcmdzLk1FVEhPRFMsIG1fbWV0aG9kcyk7CisgICAgYWRkUmVwb3J0ZXJDb25maWdzKGFyZ3YpOworICAgIGFkZEludGVnZXJJZk5vdE51bGwoYXJndiwgQ29tbWFuZExpbmVBcmdzLlNVSVRFX1RIUkVBRF9QT09MX1NJWkUsIG1fc3VpdGVUaHJlYWRQb29sU2l6ZSk7CisgICAgYWRkU3RyaW5nSWZOb3ROdWxsKGFyZ3YsIENvbW1hbmRMaW5lQXJncy5YTUxfUEFUSF9JTl9KQVIsIG1feG1sUGF0aEluSmFyKTsKKyAgICBhZGRYbWxGaWxlcyhhcmd2KTsKKwlyZXR1cm4gYXJndjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0TGlzdGVuZXJzKExpc3Q8U3RyaW5nPiBhcmd2KSB7CisgICAgaWYgKG1fdXNlRGVmYXVsdExpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICBTdHJpbmcgdXNlRGVmYXVsdExpc3RlbmVycyA9ICJmYWxzZSI7CisgICAgICBpZiAoInllcyIuZXF1YWxzSWdub3JlQ2FzZShtX3VzZURlZmF1bHRMaXN0ZW5lcnMpIHx8ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKG1fdXNlRGVmYXVsdExpc3RlbmVycykpIHsKKyAgICAgICAgdXNlRGVmYXVsdExpc3RlbmVycyA9ICJ0cnVlIjsKKyAgICAgIH0KKyAgICAgIGFyZ3YuYWRkKENvbW1hbmRMaW5lQXJncy5VU0VfREVGQVVMVF9MSVNURU5FUlMpOworICAgICAgYXJndi5hZGQodXNlRGVmYXVsdExpc3RlbmVycyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZE91dHB1dERpcihMaXN0PFN0cmluZz4gYXJndikgeworICAgIGlmIChudWxsICE9IG1fb3V0cHV0RGlyKSB7CisgICAgICBpZiAoIW1fb3V0cHV0RGlyLmV4aXN0cygpKSB7CisgICAgICAgIG1fb3V0cHV0RGlyLm1rZGlycygpOworICAgICAgfQorICAgICAgaWYgKG1fb3V0cHV0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgYXJndi5hZGQoQ29tbWFuZExpbmVBcmdzLk9VVFBVVF9ESVJFQ1RPUlkpOworICAgICAgICBhcmd2LmFkZChtX291dHB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk91dHB1dCBkaXJlY3RvcnkgaXMgbm90IGEgZGlyZWN0b3J5OiAiICsgbV9vdXRwdXREaXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRSZXBvcnRlckNvbmZpZ3MoTGlzdDxTdHJpbmc+IGFyZ3YpIHsKKyAgICBmb3IgKFJlcG9ydGVyQ29uZmlnIHJlcG9ydGVyQ29uZmlnIDogcmVwb3J0ZXJDb25maWdzKSB7CisgICAgICBhcmd2LmFkZChDb21tYW5kTGluZUFyZ3MuUkVQT1JURVIpOworICAgICAgYXJndi5hZGQocmVwb3J0ZXJDb25maWcuc2VyaWFsaXplKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRGaWxlc09mUkNvbGxlY3Rpb24oTGlzdDxTdHJpbmc+IGFyZ3YsIFN0cmluZyBuYW1lLCBMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gcmVzb3VyY2VzKSB7CisJYWRkQXJndW1lbnRzSWZOb3RFbXB0eShhcmd2LCBuYW1lLCBnZXRGaWxlcyhyZXNvdXJjZXMpLCAiLCIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZExpc3RPZlN0cmluZ0lmTm90RW1wdHkoTGlzdDxTdHJpbmc+IGFyZ3YsIFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzKSB7CisJYWRkQXJndW1lbnRzSWZOb3RFbXB0eShhcmd2LCBuYW1lLCBhcmd1bWVudHMsICI7Iik7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkQXJndW1lbnRzSWZOb3RFbXB0eShMaXN0PFN0cmluZz4gYXJndiwgU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsIFN0cmluZyBzZXBhcmF0b3IpIHsKKwlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgIWFyZ3VtZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgIGFyZ3YuYWRkKG5hbWUpOworICAgICAgU3RyaW5nIHZhbHVlPSBVdGlscy5qb2luKGFyZ3VtZW50cywgc2VwYXJhdG9yKTsKKwkgICAgYXJndi5hZGQodmFsdWUpOworICAJfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZEZpbGVJZkZpbGUoTGlzdDxTdHJpbmc+IGFyZ3YsIFN0cmluZyBuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICBpZiAoKG51bGwgIT0gZmlsZSkgJiYgZmlsZS5pc0ZpbGUoKSkgeworICAgICAgYXJndi5hZGQobmFtZSk7CisgICAgICBhcmd2LmFkZChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBhZGRCb29sZWFuSWZUcnVlKExpc3Q8U3RyaW5nPiBhcmd2LCBTdHJpbmcgbmFtZSwgQm9vbGVhbiB2YWx1ZSkgeworICAgIGlmIChUUlVFLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgIGFyZ3YuYWRkKG5hbWUpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZEludGVnZXJJZk5vdE51bGwoTGlzdDxTdHJpbmc+IGFyZ3YsIFN0cmluZyBuYW1lLCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgIGFyZ3YuYWRkKG5hbWUpOworICAgICAgYXJndi5hZGQodmFsdWUudG9TdHJpbmcoKSk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgYWRkU3RyaW5nSWZOb3ROdWxsKExpc3Q8U3RyaW5nPiBhcmd2LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgIGFyZ3YuYWRkKG5hbWUpOworICAgICAgYXJndi5hZGQodmFsdWUpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZFN0cmluZ0lmTm90QmxhbmsoTGlzdDxTdHJpbmc+IGFyZ3YsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICBpZiAoaXNTdHJpbmdOb3RCbGFuayh2YWx1ZSkpIHsKKyAgICAgIGFyZ3YuYWRkKG5hbWUpOworICAgICAgYXJndi5hZGQodmFsdWUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRYbWxGaWxlcyhMaXN0PFN0cmluZz4gYXJndikgeworICAgIGZvciAoU3RyaW5nIGZpbGUgOiBnZXRTdWl0ZUZpbGVOYW1lcygpKSB7CisgICAgICBhcmd2LmFkZChmaWxlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0aGUgWE1MIGZpbGUgbmFtZXMuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAqLworICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldFN1aXRlRmlsZU5hbWVzKCkgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGZvcihTdHJpbmcgZmlsZSA6IGdldEZpbGVzKG1feG1sRmlsZXNldHMpKSB7CisgICAgICByZXN1bHQuYWRkKGZpbGUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVsZWdhdGVDb21tYW5kU3lzdGVtUHJvcGVydGllcygpIHsKKyAgICAvLyBJdGVyYXRlIG92ZXIgY29tbWFuZC1saW5lIGFyZ3MgYW5kIHBhc3MgdGhlbSB0aHJvdWdoIGFzIHN5c3Byb3BlcnR5CisgICAgLy8gZXhjbHVkZSBhbnkgYnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IHN0YXJ0IHdpdGggImFudC4iCisgICAgZm9yIChPYmplY3QgcHJvcEtleSA6IGdldFByb2plY3QoKS5nZXRVc2VyUHJvcGVydGllcygpLmtleVNldCgpKSB7CisgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBwcm9wS2V5OworICAgICAgU3RyaW5nIHByb3BWYWwgPSBnZXRQcm9qZWN0KCkuZ2V0VXNlclByb3BlcnR5KHByb3BOYW1lKTsKKyAgICAgIGlmIChwcm9wTmFtZS5zdGFydHNXaXRoKCJhbnQuIikpIHsKKyAgICAgICAgbG9nKCJFeGNsdWRpbmcgYW50IHByb3BlcnR5OiAiICsgcHJvcE5hbWUgKyAiOiAiICsgcHJvcFZhbCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgfQllbHNlIHsKKyAgICAgICAgbG9nKCJJbmNsdWRpbmcgdXNlciBwcm9wZXJ0eTogIiArIHByb3BOYW1lICsgIjogIiArIHByb3BWYWwsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgRW52aXJvbm1lbnQuVmFyaWFibGUgdmFyID0gbmV3IEVudmlyb25tZW50LlZhcmlhYmxlKCk7CisgICAgICAgIHZhci5zZXRLZXkocHJvcE5hbWUpOworICAgICAgICB2YXIuc2V0VmFsdWUocHJvcFZhbCk7CisgICAgICAgIGFkZFN5c3Byb3BlcnR5KHZhcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByaW50RGVidWdJbmZvKFN0cmluZyBmaWxlTmFtZSkgeworICAgIGlmKG1fZHVtcFN5cykgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqIFNZU1RFTSBQUk9QRVJUSUVTICoiKTsKKyAgICAgIFByb3BlcnRpZXMgcHJvcHM9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICBFbnVtZXJhdGlvbiBlbj0gcHJvcHMucHJvcGVydHlOYW1lcygpOworICAgICAgd2hpbGUoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgU3RyaW5nIGtleT0gKFN0cmluZykgZW4ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGtleSArICI6ICIgKyBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgfQorICAgIGlmKG1fZHVtcEVudikgeworICAgICAgU3RyaW5nW10gdmFycz0gbV9lbnZpcm9ubWVudC5nZXRWYXJpYWJsZXMoKTsKKyAgICAgIGlmKG51bGwgIT0gdmFycyAmJiB2YXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqIEVOVklST05NRU5UICoiKTsKKyAgICAgICAgZm9yKFN0cmluZyB2OiB2YXJzKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHYpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICB9CisgICAgfQorICAgIGlmKG1fZHVtcCkgeworICAgICAgZHVtcENvbW1hbmQoZmlsZU5hbWUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3ROR0FudFRhc2tdICIgKyBzdHJpbmcpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgYWN0T25SZXN1bHQoaW50IGV4aXRWYWx1ZSwgYm9vbGVhbiB3YXNLaWxsZWQpIHsKKyAgICBpZihleGl0VmFsdWUgPT0gLTEpIHsKKyAgICAgIGV4ZWN1dGVIYWx0VGFyZ2V0KGV4aXRWYWx1ZSk7CisgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFuIGVycm9yIG9jY3VyZWQgd2hlbiBydW5uaW5nIFRlc3RORyB0ZXN0cyIpOworICAgIH0KKworICAgIGlmKChleGl0VmFsdWUgJiBUZXN0TkcuSEFTX05PX1RFU1QpID09IFRlc3RORy5IQVNfTk9fVEVTVCkgeworICAgICAgaWYobV9oYWx0T25GYWlsdXJlKSB7CisgICAgICAgIGV4ZWN1dGVIYWx0VGFyZ2V0KGV4aXRWYWx1ZSk7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdGVzdHMgd2VyZSBydW4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZihudWxsICE9IG1fZmFpbHVyZVByb3BlcnR5TmFtZSkgeworICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShtX2ZhaWx1cmVQcm9wZXJ0eU5hbWUsICJ0cnVlIik7CisgICAgICAgIH0KKworICAgICAgICBsb2coIlRlc3RORyBoYXZlbid0IGZvdW5kIGFueSB0ZXN0cyB0byBiZSBydW4iLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBmYWlsZWQ9ICgoZXhpdFZhbHVlICYgVGVzdE5HLkhBU19GQUlMVVJFKSA9PSBUZXN0TkcuSEFTX0ZBSUxVUkUpIHx8IHdhc0tpbGxlZDsKKyAgICBpZihmYWlsZWQpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBtc2c9IHdhc0tpbGxlZCA/ICJUaGUgdGVzdHMgdGltZWQgb3V0IGFuZCB3ZXJlIGtpbGxlZC4iIDogIlRoZSB0ZXN0cyBmYWlsZWQuIjsKKyAgICAgIGlmKG1faGFsdE9uRmFpbHVyZSkgeworICAgICAgICBleGVjdXRlSGFsdFRhcmdldChleGl0VmFsdWUpOworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZihudWxsICE9IG1fZmFpbHVyZVByb3BlcnR5TmFtZSkgeworICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShtX2ZhaWx1cmVQcm9wZXJ0eU5hbWUsICJ0cnVlIik7CisgICAgICAgIH0KKworICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZigoZXhpdFZhbHVlICYgVGVzdE5HLkhBU19TS0lQUEVEKSA9PSBUZXN0TkcuSEFTX1NLSVBQRUQpIHsKKyAgICAgIGlmKG1faGFsdE9uU2tpcHBlZCkgeworICAgICAgICBleGVjdXRlSGFsdFRhcmdldChleGl0VmFsdWUpOworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZXJlIGFyZSBUZXN0TkcgU0tJUFBFRCB0ZXN0cyIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmKG51bGwgIT0gbV9za2lwcGVkUHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KG1fc2tpcHBlZFByb3BlcnR5TmFtZSwgInRydWUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZygiVGhlcmUgYXJlIFRlc3RORyBTS0lQUEVEIHRlc3RzIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgfQorICAgIH0KKworICAgIGlmKChleGl0VmFsdWUgJiBUZXN0TkcuSEFTX0ZTUCkgPT0gVGVzdE5HLkhBU19GU1ApIHsKKyAgICAgIGlmKG1faGFsdE9uRlNQKSB7CisgICAgICAgIGV4ZWN1dGVIYWx0VGFyZ2V0KGV4aXRWYWx1ZSk7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlcmUgYXJlIFRlc3RORyBGQUlMRUQgV0lUSElOIFNVQ0NFU1MgUEVSQ0VOVEFHRSB0ZXN0cyIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmKG51bGwgIT0gbV9mc3BQcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobV9mc3BQcm9wZXJ0eU5hbWUsICJ0cnVlIik7CisgICAgICAgIH0KKworICAgICAgICBsb2coIlRoZXJlIGFyZSBUZXN0TkcgRkFJTEVEIFdJVEhJTiBTVUNDRVNTIFBFUkNFTlRBR0UgdGVzdHMiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIEV4ZWN1dGVzIHRoZSB0YXJnZXQsIGlmIGFueSwgdGhhdCB1c2VyIGRlc2lnbmF0ZXMgZXhlY3V0aW5nIGJlZm9yZSBmYWlsaW5nIHRoZSB0ZXN0ICovCisgIHByaXZhdGUgdm9pZCBleGVjdXRlSGFsdFRhcmdldChpbnQgZXhpdFZhbHVlKSB7CisgICAgaWYobV9vbkhhbHRUYXJnZXQgIT0gbnVsbCkgeworICAgICAgaWYobV9vdXRwdXREaXIgIT0gbnVsbCkgeworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInRlc3RuZy5vdXRwdXRkaXIiLCBtX291dHB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICB9CisgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInRlc3RuZy5yZXR1cm5jb2RlIiwgU3RyaW5nLnZhbHVlT2YoZXhpdFZhbHVlKSk7CisgICAgICBUYXJnZXQgdD0gKFRhcmdldCkgZ2V0UHJvamVjdCgpLmdldFRhcmdldHMoKS5nZXQobV9vbkhhbHRUYXJnZXQpOworICAgICAgaWYodCAhPSBudWxsKSB7CisgICAgICAgIHQuZXhlY3V0ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZCBsaW5lIGFzIGEgbmV3IHByb2Nlc3MuCisgICAqCisgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQorICAgKiBAcGFyYW0gd2F0Y2hkb2cKKyAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHN1YnByb2Nlc3Mgb3IgSU5WQUxJRC4KKyAgICovCisgIHByb3RlY3RlZCBpbnQgZXhlY3V0ZUFzRm9ya2VkKENvbW1hbmRsaW5lSmF2YSBjbWQsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZykgeworICAgIEV4ZWN1dGUgZXhlY3V0ZT0gbmV3IEV4ZWN1dGUobmV3IFRlc3ROR0xvZ1NIKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4sIChtX3ZlcmJvc2UgPT0gbnVsbCB8fCBtX3ZlcmJvc2UgPCA1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGRvZyk7CisgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgZXhlY3V0ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICBpZihtX3dvcmtpbmdEaXIgIT0gbnVsbCkgeworICAgICAgaWYobV93b3JraW5nRGlyLmV4aXN0cygpICYmIG1fd29ya2luZ0Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIGV4ZWN1dGUuc2V0V29ya2luZ0RpcmVjdG9yeShtX3dvcmtpbmdEaXIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGxvZygiSWdub3JpbmcgaW52YWxpZCB3b3JraW5nIGRpcmVjdG9yeSA6ICIgKyBtX3dvcmtpbmdEaXIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgfQorICAgIH0KKworICAgIFN0cmluZ1tdIGVudmlyb25tZW50PSBtX2Vudmlyb25tZW50LmdldFZhcmlhYmxlcygpOworICAgIGlmKG51bGwgIT0gZW52aXJvbm1lbnQpIHsKKyAgICAgIGZvcihTdHJpbmcgZW52RW50cnkgOiBlbnZpcm9ubWVudCkgeworICAgICAgICBsb2coIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGU6ICIgKyBlbnZFbnRyeSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICB9CisgICAgfQorCisgICAgZXhlY3V0ZS5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7CisKKyAgICBsb2coY21kLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICBpbnQgcmV0VmFsOworICAgIHRyeSB7CisgICAgICByZXRWYWw9IGV4ZWN1dGUuZXhlY3V0ZSgpOworICAgIH0KKyAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2Nlc3MgZm9yayBmYWlsZWQuIiwgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIG9yIHJldHVybnMgdGhlIGFscmVhZHkgY3JlYXRlZCA8Q09ERT5Db21tYW5kbGluZUphdmE8L0NPREU+LgorICAgKi8KKyAgcHJvdGVjdGVkIENvbW1hbmRsaW5lSmF2YSBnZXRKYXZhQ29tbWFuZCgpIHsKKyAgICBpZihudWxsID09IG1famF2YUNvbW1hbmQpIHsKKyAgICAgIG1famF2YUNvbW1hbmQgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1famF2YUNvbW1hbmQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQgdmFsdWUsIG90aGVyd2lzZSB0aGUKKyAgICogd2F0Y2hkb2cgaW5zdGFuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5zcGVjaWZpZWQgY2lyY3Vtc3RhbmNlcworICAgKiBAc2luY2UgQW50IDEuMgorICAgKi8KKyAgcHJvdGVjdGVkIEV4ZWN1dGVXYXRjaGRvZyBjcmVhdGVXYXRjaGRvZygpIC8qdGhyb3dzIEJ1aWxkRXhjZXB0aW9uKi8geworICAgIGlmKG1fdGltZW91dCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEV4ZWN1dGVXYXRjaGRvZyhtX3RpbWVvdXQubG9uZ1ZhbHVlKCkpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVPcHRpb25zKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBpbnQgc3VpdGVDb3VudCA9IGdldFN1aXRlRmlsZU5hbWVzKCkuc2l6ZSgpOworICAgIGlmIChzdWl0ZUNvdW50ID09IDAKKyAgICAgICYmIG1fY2xhc3NGaWxlc2V0cy5zaXplKCkgPT0gMAorICAgICAgJiYgVXRpbHMuaXNTdHJpbmdFbXB0eShtX21ldGhvZHMpCisgICAgICAmJiAoKG51bGwgPT0gbV90ZXN0amFyKSB8fCAhbV90ZXN0amFyLmlzRmlsZSgpKSkgeworICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBzdWl0ZXMsIGNsYXNzZXMsIG1ldGhvZHMgb3IgamFyIGZpbGUgd2FzIHNwZWNpZmllZC4iKTsKKyAgICB9CisKKyAgICBpZigobnVsbCAhPSBtX2luY2x1ZGVkR3JvdXBzKSAmJiAobV9jbGFzc0ZpbGVzZXRzLnNpemUoKSA9PSAwICYmIHN1aXRlQ291bnQgPT0gMCkpIHsKKyAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gY2xhc3MgZmlsZXNldHMgb3IgeG1sIGZpbGUgc2V0cyBzcGVjaWZpZWQgd2hpbGUgdXNpbmcgZ3JvdXBzIik7CisgICAgfQorCisgICAgaWYobV9vbkhhbHRUYXJnZXQgIT0gbnVsbCkgeworICAgICAgaWYoIWdldFByb2plY3QoKS5nZXRUYXJnZXRzKCkuY29udGFpbnNLZXkobV9vbkhhbHRUYXJnZXQpKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGFyZ2V0ICIgKyBtX29uSGFsdFRhcmdldCArICIgbm90IGZvdW5kIGluIHRoaXMgcHJvamVjdCIpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBSZXNvdXJjZUNvbGxlY3Rpb24gY3JlYXRlUmVzb3VyY2VDb2xsZWN0aW9uKFJlZmVyZW5jZSByZWYpIHsKKyAgICBPYmplY3QgbyA9IHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KCk7CisgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJlc291cmNlQ29sbGVjdGlvbikpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IEZpbGUgYmFzZWQgUmVzb3VyY2VDb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkLiIpOworICAgIH0KKyAgICBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSAoUmVzb3VyY2VDb2xsZWN0aW9uKSBvOworICAgIGlmICghcmMuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBSZXNvdXJjZUNvbGxlY3Rpb25zIGZyb20gbG9jYWwgZmlsZSBzeXN0ZW0gYXJlIHN1cHBvcnRlZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcHJpdmF0ZSBGaWxlU2V0IGFwcGVuZENsYXNzU2VsZWN0b3IoRmlsZVNldCBmcykgeworICAgIEZpbGVuYW1lU2VsZWN0b3Igc2VsZWN0b3I9IG5ldyBGaWxlbmFtZVNlbGVjdG9yKCk7CisgICAgc2VsZWN0b3Iuc2V0TmFtZSgiKiovKi5jbGFzcyIpOworICAgIHNlbGVjdG9yLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICBmcy5hcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisKKyAgICByZXR1cm4gZnM7CisgIH0KKworICBwcml2YXRlIEZpbGUgZmluZEphcigpIHsKKyAgICBDbGFzcyB0aGlzQ2xhc3M9IGdldENsYXNzKCk7CisgICAgU3RyaW5nIHJlc291cmNlPSB0aGlzQ2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgVVJMIHVybD0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworCisgICAgaWYobnVsbCAhPSB1cmwpIHsKKyAgICAgIFN0cmluZyB1PSB1cmwudG9TdHJpbmcoKTsKKyAgICAgIGlmKHUuc3RhcnRzV2l0aCgiamFyOmZpbGU6IikpIHsKKyAgICAgICAgaW50IHBsaW5nPSB1LmluZGV4T2YoIiEiKTsKKyAgICAgICAgU3RyaW5nIGphck5hbWU9IHUuc3Vic3RyaW5nKDQsIHBsaW5nKTsKKworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZnJvbVVSSShqYXJOYW1lKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKHUuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgICBpbnQgdGFpbD0gdS5pbmRleE9mKHJlc291cmNlKTsKKyAgICAgICAgU3RyaW5nIGRpck5hbWU9IHUuc3Vic3RyaW5nKDAsIHRhaWwpOworCisgICAgICAgIHJldHVybiBuZXcgRmlsZShmcm9tVVJJKGRpck5hbWUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGZyb21VUkkoU3RyaW5nIHVyaSkgeworICAgIFVSTCB1cmw9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHVybD0gbmV3IFVSTCh1cmkpOworICAgIH0KKyAgICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKKyAgICB9CisgICAgaWYoKG51bGwgPT0gdXJsKSB8fCAhKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgaGFuZGxlIHZhbGlkIGZpbGU6IFVSSXMiKTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKHVybC5nZXRIb3N0KCkpOworICAgIGlmKGJ1Zi5sZW5ndGgoKSA+IDApIHsKKyAgICAgIGJ1Zi5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZmlsZT0gdXJsLmdldEZpbGUoKTsKKyAgICBpbnQgcXVlcnlQb3M9IGZpbGUuaW5kZXhPZignPycpOworICAgIGJ1Zi5hcHBlbmQoKHF1ZXJ5UG9zIDwgMCkgPyBmaWxlIDogZmlsZS5zdWJzdHJpbmcoMCwgcXVlcnlQb3MpKTsKKworICAgIHVyaT0gYnVmLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisKKyAgICBpZigoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciA9PSAnOycpICYmIHVyaS5zdGFydHNXaXRoKCJcXCIpICYmICh1cmkubGVuZ3RoKCkgPiAyKQorICAgICAgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHVyaS5jaGFyQXQoMSkpICYmICh1cmkubGFzdEluZGV4T2YoJzonKSA+IC0xKSkgeworICAgICAgdXJpPSB1cmkuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIFN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXI9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcih1cmkpOworICAgIGZvcihjaGFyIGM9IGl0ZXIuZmlyc3QoKTsgYyAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FOyBjPSBpdGVyLm5leHQoKSkgeworICAgICAgaWYoYyA9PSAnJScpIHsKKyAgICAgICAgY2hhciBjMT0gaXRlci5uZXh0KCk7CisgICAgICAgIGlmKGMxICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpIHsKKyAgICAgICAgICBpbnQgaTE9IENoYXJhY3Rlci5kaWdpdChjMSwgMTYpOworICAgICAgICAgIGNoYXIgYzI9IGl0ZXIubmV4dCgpOworICAgICAgICAgIGlmKGMyICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpIHsKKyAgICAgICAgICAgIGludCBpMj0gQ2hhcmFjdGVyLmRpZ2l0KGMyLCAxNik7CisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpICgoaTEgPDwgNCkgKyBpMikpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc291cmNlIGNvbGxlY3Rpb24KKyAgICoKKyAgICogQHBhcmFtIHJlc291cmNlcworICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc291cmNlIGNvbGxlY3Rpb24KKyAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0RmlsZXMoTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJlc291cmNlcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gZmlsZXM9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoUmVzb3VyY2VDb2xsZWN0aW9uIHJjIDogcmVzb3VyY2VzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJjLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmciA9ICgoRmlsZVJlc291cmNlKSBvKTsKKyAgICAgICAgICAgIGlmIChmci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGlyZWN0b3J5IGJhc2VkIEZpbGVSZXNvdXJjZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgbG9nKCInIiArIGZyLnRvTG9uZ1N0cmluZygpICsgIicgZG9lcyBub3QgZXhpc3QiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGVzLmFkZChmci5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGxvZygiVW5zdXBwb3J0ZWQgUmVzb3VyY2UgdHlwZTogIiArIG8udG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWxlczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGVzZXQKKyAgICoKKyAgICogQHBhcmFtIGZpbGVzZXRzCisgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZXNldAorICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCisgICAqLworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBmaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gZmlsZXM9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzPSBmaWxlc2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKworICAgICAgZm9yKFN0cmluZyBmaWxlIDogZHMuZ2V0SW5jbHVkZWRGaWxlcygpKSB7CisgICAgICAgIGZpbGVzLmFkZChkcy5nZXRCYXNlZGlyKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGUpOworICAgICAgfQorCisgICAgcmV0dXJuIGZpbGVzOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgZG91YmxlIHF1b3RlcyB0byB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4KKyAgICogQHBhcmFtIHBDb21tYW5kTGluZUFyZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50CisgICAqIEByZXR1cm4gcENvbW1hbmRMaW5lQXJnIGluIGRvdWJsZSBxdW90ZXMgaWYgaXQgY29udGFpbnMgc3BhY2UuCisgICAqCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZG91YmxlUXVvdGUoU3RyaW5nIHBDb21tYW5kTGluZUFyZykgeworICAgIGlmKHBDb21tYW5kTGluZUFyZy5pbmRleE9mKCIgIikgIT0gLTEgJiYgIShwQ29tbWFuZExpbmVBcmcuc3RhcnRzV2l0aCgiXCIiKSAmJiBwQ29tbWFuZExpbmVBcmcuZW5kc1dpdGgoIlwiIikpKSB7CisgICAgICByZXR1cm4gIlwiIiArIHBDb21tYW5kTGluZUFyZyArICdcIic7CisgICAgfQorCisgICAgcmV0dXJuIHBDb21tYW5kTGluZUFyZzsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLgorICAgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGF0aFN0cmluZyhQYXRoIHBhdGgsIFN0cmluZyBzZXApIHsKKyAgICBpZihwYXRoID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIGZvcihpbnQgaT0gMDsgaSA8IHBhdGgubGlzdCgpLmxlbmd0aDsgaSsrKSB7CisgICAgICBGaWxlIGZpbGU9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShwYXRoLmxpc3QoKVtpXSk7CisKKyAgICAgIGlmKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgIGxvZygiQ2xhc3NwYXRoIGVudHJ5IG5vdCBmb3VuZDogIiArIGZpbGUsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgfQorCisgICAgICBidWYuYXBwZW5kKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZChzZXApOworICAgIH0KKworICAgIGlmKHBhdGgubGlzdCgpLmxlbmd0aCA+IDApIHsgLy8gY3V0IHRoZSBsYXN0IDsKKyAgICAgIGJ1Zi5kZWxldGVDaGFyQXQoYnVmLmxlbmd0aCgpIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGR1bXBDb21tYW5kKFN0cmluZyBmaWxlTmFtZSkgeworICAgIHBwcCgiVEVTVE5HIFBBU1NFRCBAIiArIGZpbGVOYW1lICsgIiBXSElDSCBDT05UQUlOUzoiKTsKKyAgICByZWFkQW5kUHJpbnRGaWxlKGZpbGVOYW1lKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkQW5kUHJpbnRGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICBCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKyAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKKyAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBsaW5lKTsKKyAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGJyICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRSZXBvcnRlcihSZXBvcnRlckNvbmZpZyByZXBvcnRlckNvbmZpZykgeworICAgIHJlcG9ydGVyQ29uZmlncy5hZGQocmVwb3J0ZXJDb25maWcpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoYm9vbGVhbiBza2lwKSB7CisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IHNraXA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRYbWxQYXRoSW5KYXIoU3RyaW5nIHBhdGgpIHsKKyAgICBtX3htbFBhdGhJbkphciA9IHBhdGg7CisgIH0KKyAgLyoqCisgICAqIEFkZCB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBzZXQgYXMgc3lzdGVtIHByb3BlcnRpZXMgZm9yIHRoZSBUZXN0TkcgSlZNLgorICAgKgorICAgKiBAcGFyYW0gc3lzUHJvcGVydHlTZXQgQSBQcm9wZXJ0eVNldCBvZiBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRQcm9wZXJ0eVNldChQcm9wZXJ0eVNldCBzeXNQcm9wZXJ0eVNldCkgeworICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IHN5c1Byb3BlcnR5U2V0LmdldFByb3BlcnRpZXMoKTsKKyAgICBsb2cocHJvcGVydGllcy5rZXlTZXQoKS5zaXplKCkgKyAiIHByb3BlcnRpZXMgZm91bmQgaW4gbmVzdGVkIHByb3BlcnR5c2V0IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgZm9yIChPYmplY3QgcHJvcEtleU9iaiA6IHByb3BlcnRpZXMua2V5U2V0KCkpIHsKKyAgICAgIFN0cmluZyBwcm9wS2V5ID0gKFN0cmluZykgcHJvcEtleU9iajsKKyAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHN5c1Byb3AgPSBuZXcgRW52aXJvbm1lbnQuVmFyaWFibGUoKTsKKyAgICAgIHN5c1Byb3Auc2V0S2V5KHByb3BLZXkpOworICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0KHByb3BLZXkpIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgIFN0cmluZyBwcm9wVmFsID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcEtleSk7CisgICAgICAgIHN5c1Byb3Auc2V0VmFsdWUocHJvcFZhbCk7CisgICAgICAgIGdldEphdmFDb21tYW5kKCkuYWRkU3lzcHJvcGVydHkoc3lzUHJvcCk7CisgICAgICAgIGxvZygiQWRkZWQgc3lzdGVtIHByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3aXRoIHZhbHVlICIgKyBwcm9wVmFsLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvZygiSWdub3Jpbmcgbm9uLVN0cmluZyBwcm9wZXJ0eSAiICsgcHJvcEtleSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAob3V0cHV0LnN0YXJ0c1dpdGgoVmVyYm9zZVJlcG9ydGVyLkxJU1RFTkVSX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIC8vc2VuZCBldmVyeXRoaW5nIGZyb20gVmVyYm9zZVJlcG9ydGVyIHRvIHZlcmJvc2UgbGV2ZWwgdW5sZXNzIGxvZyBsZXZlbCBpcyA+IDQKKyAgICAgICAgICAgIGxvZyhvdXRwdXQsIG1fdmVyYm9zZSA8IDUgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3ROR0xvZ09TIGV4dGVuZHMgTG9nT3V0cHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIFRhc2sgdGFzazsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7CisKKyAgICAgICAgcHVibGljIFRlc3ROR0xvZ09TKFRhc2sgdGFzaywgaW50IGxldmVsLCBib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHRhc2ssIGxldmVsKTsKKyAgICAgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKFN0cmluZyBsaW5lLCBpbnQgbGV2ZWwpIHsKKyAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoVmVyYm9zZVJlcG9ydGVyLkxJU1RFTkVSX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICB0YXNrLmxvZyhsaW5lLCB2ZXJib3NlID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdXBlci5wcm9jZXNzTGluZShsaW5lLCBsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3ROR0xvZ1NIIGV4dGVuZHMgUHVtcFN0cmVhbUhhbmRsZXIgeworCisgICAgICAgIHB1YmxpYyBUZXN0TkdMb2dTSChUYXNrIHRhc2ssIGludCBvdXRsZXZlbCwgaW50IGVycmxldmVsLCBib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBUZXN0TkdMb2dPUyh0YXNrLCBvdXRsZXZlbCwgdmVyYm9zZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dPdXRwdXRTdHJlYW0odGFzaywgZXJybGV2ZWwpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkdFeGNlcHRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWIzZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3ROR0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworCisvKioKKyAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gYnkgVGVzdE5HLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3ROR0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgIC8qIGdlbmVyYXRlZCAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDIyNjc1OTcxNTA2NDI1OTEzTDsKKworICBwdWJsaWMgVGVzdE5HRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgc3VwZXIodCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHN0cmluZworICAgKi8KKyAgcHVibGljIFRlc3ROR0V4Y2VwdGlvbihTdHJpbmcgc3RyaW5nKSB7CisgICAgc3VwZXIoIlxuIiArIHN0cmluZyk7CisgIH0KKworICBwdWJsaWMgVGVzdE5HRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcsIFRocm93YWJsZSB0KSB7CisgICAgc3VwZXIoIlxuIiArIHN0cmluZywgdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkdVdGlscy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3ROR1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGUyYjQyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0TkdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ2xvbmVkTWV0aG9kOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgVGVzdE5HVXRpbHMgeworCisgIC8qKgorICAgKiBDcmVhdGUgYW4gSVRlc3ROR01ldGhvZCBmb3IgQGNvZGV7bWV0aG9kfSBiYXNlZCBvbiBAY29kZXtleGlzdGluZ01ldGhvZH0sIHdoaWNoIG5lZWRzCisgICAqIHRvIGJlbG9uZyB0byB0aGUgc2FtZSBjbGFzcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSVRlc3ROR01ldGhvZCBjcmVhdGVJVGVzdE5HTWV0aG9kKElUZXN0TkdNZXRob2QgZXhpc3RpbmdNZXRob2QsIE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gbmV3IENsb25lZE1ldGhvZChleGlzdGluZ01ldGhvZCwgbWV0aG9kKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1Rlc3RSdW5uZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYjkyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9UZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwxNjY2IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUxpc3RlbmVyc0Fubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQXR0cmlidXRlczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ2xhc3NJbXBsOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ2xhc3NJbmZvTWFwOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNvbnN0YW50czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkR5bmFtaWNHcmFwaDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkR5bmFtaWNHcmFwaC5TdGF0dXM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklJbnZva2VyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSVRlc3RSZXN1bHROb3RpZmllcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JbnZva2VyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuTWV0aG9kR3JvdXBzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuTWV0aG9kSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuTWV0aG9kSW5zdGFuY2U7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5SZXN1bHRNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5SdW5JbmZvOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVGVzdE1ldGhvZFdvcmtlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlRlc3ROR0NsYXNzRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVGVzdE5HTWV0aG9kRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5YbWxNZXRob2RTZWxlY3RvcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklMaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguR3JhcGhUaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguSVRocmVhZFdvcmtlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGguSVdvcmtlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmp1bml0LklKVW5pdFRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxQYWNrYWdlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIHJ1bm5pbmcgb25lIFRlc3QuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEFwciAyNiwgMjAwNAorICovCitwdWJsaWMgY2xhc3MgVGVzdFJ1bm5lcgorICAgIGltcGxlbWVudHMgSVRlc3RDb250ZXh0LCBJVGVzdFJlc3VsdE5vdGlmaWVyLCBJVGhyZWFkV29ya2VyRmFjdG9yeTxJVGVzdE5HTWV0aG9kPgoreworICAvKiBnZW5lcmF0ZWQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDI0NzgyMDAyNDk4ODMwNjY3MEw7CisgIHByaXZhdGUgSVN1aXRlIG1fc3VpdGU7CisgIHByaXZhdGUgWG1sVGVzdCBtX3htbFRlc3Q7CisgIHByaXZhdGUgU3RyaW5nIG1fdGVzdE5hbWU7CisKKyAgdHJhbnNpZW50IHByaXZhdGUgTGlzdDxYbWxDbGFzcz4gbV90ZXN0Q2xhc3Nlc0Zyb21YbWw9IG51bGw7CisgIHRyYW5zaWVudCBwcml2YXRlIExpc3Q8WG1sUGFja2FnZT4gbV9wYWNrYWdlTmFtZXNGcm9tWG1sPSBudWxsOworCisgIHRyYW5zaWVudCBwcml2YXRlIElJbnZva2VyIG1faW52b2tlcj0gbnVsbDsKKyAgdHJhbnNpZW50IHByaXZhdGUgSUFubm90YXRpb25GaW5kZXIgbV9hbm5vdGF0aW9uRmluZGVyPSBudWxsOworCisgIC8qKiBJVGVzdExpc3RlbmVycyBzdXBwb3J0LiAqLworICB0cmFuc2llbnQgcHJpdmF0ZSBMaXN0PElUZXN0TGlzdGVuZXI+IG1fdGVzdExpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB0cmFuc2llbnQgcHJpdmF0ZSBTZXQ8SUNvbmZpZ3VyYXRpb25MaXN0ZW5lcj4gbV9jb25maWd1cmF0aW9uTGlzdGVuZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgdHJhbnNpZW50IHByaXZhdGUgSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBtX2NvbmZMaXN0ZW5lcj0gbmV3IENvbmZpZ3VyYXRpb25MaXN0ZW5lcigpOworICB0cmFuc2llbnQgcHJpdmF0ZSBib29sZWFuIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHM7CisKKyAgdHJhbnNpZW50IHByaXZhdGUgQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgdHJhbnNpZW50IHByaXZhdGUgTGlzdDxJQ2xhc3NMaXN0ZW5lcj4gbV9jbGFzc0xpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIC8qKgorICAgKiBBbGwgdGhlIHRlc3QgbWV0aG9kcyB3ZSBmb3VuZCwgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgY2xhc3Nlcy4KKyAgICogTm90ZSB0aGF0IHRoZXNlIHRlc3QgbWV0aG9kcyBtaWdodCBiZWxvbmcgdG8gZGlmZmVyZW50IGNsYXNzZXMuCisgICAqIFdlIHBpY2sgd2hpY2ggb25lcyB0byBydW4gYXQgcnVudGltZS4KKyAgICovCisgIHByaXZhdGUgSVRlc3ROR01ldGhvZFtdIG1fYWxsVGVzdE1ldGhvZHMgPSBuZXcgSVRlc3ROR01ldGhvZFswXTsKKworICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlc3QgcnVuCisKKyAgcHJpdmF0ZSBEYXRlIG1fc3RhcnREYXRlID0gbnVsbDsKKyAgcHJpdmF0ZSBEYXRlIG1fZW5kRGF0ZSA9IG51bGw7CisKKyAgLyoqIEEgbWFwIHRvIGtlZXAgdHJhY2sgb2YgQ2xhc3MgPC0+IElDbGFzcy4gKi8KKyAgdHJhbnNpZW50IHByaXZhdGUgTWFwPENsYXNzPD8+LCBJVGVzdENsYXNzPiBtX2NsYXNzTWFwID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisKKyAgLyoqIFdoZXJlIHRoZSByZXBvcnRzIHdpbGwgYmUgY3JlYXRlZC4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgbV9vdXRwdXREaXJlY3Rvcnk9IENvbnN0YW50cy5nZXREZWZhdWx0VmFsdWVGb3IoQ29uc3RhbnRzLlBST1BfT1VUUFVUX0RJUik7CisKKyAgLy8gVGhlIFhNTCBtZXRob2Qgc2VsZWN0b3IgKGdyb3Vwcy9tZXRob2RzIGluY2x1ZGVkL2V4Y2x1ZGVkIGluIFhNTCkKKyAgcHJpdmF0ZSBYbWxNZXRob2RTZWxlY3RvciBtX3htbE1ldGhvZFNlbGVjdG9yID0gbmV3IFhtbE1ldGhvZFNlbGVjdG9yKCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fdmVyYm9zZSA9IDE7CisKKyAgLy8KKyAgLy8gVGhlc2UgbmV4dCBmaWVsZHMgY29udGFpbiBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBmb3VuZCBvbiB0aGlzIGNsYXNzLgorICAvLyBBdCBpbml0aWFsaXphdGlvbiB0aW1lLCB0aGV5IGp1c3QgY29udGFpbiBhbGwgdGhlIHZhcmlvdXMgQENvbmZpZ3VyYXRpb24gbWV0aG9kcworICAvLyBmb3VuZCBpbiBhbGwgdGhlIGNsYXNzZXMgd2UgYXJlIGdvaW5nIHRvIHJ1bi4gIFdoZW4gY29tZXMgdGhlIHRpbWUgdG8gcnVuIHRoZW0sCisgIC8vIG9ubHkgYSBzdWJzZXQgb2YgdGhlbSBhcmUgcnVuOiAgdGhvc2UgdGhhdCBhcmUgZW5hYmxlZCBhbmQgYmVsb25nIG9uIHRoZSBzYW1lIGNsYXNzIGFzCisgIC8vIChvciBhIHBhcmVudCBvZikgdGhlIHRlc3QgY2xhc3MuCisgIC8vCisgIC8qKiAqLworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSBtX2JlZm9yZVN1aXRlTWV0aG9kcyA9IHt9OworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSBtX2FmdGVyU3VpdGVNZXRob2RzID0ge307CisgIHByaXZhdGUgSVRlc3ROR01ldGhvZFtdIG1fYmVmb3JlWG1sVGVzdE1ldGhvZHMgPSB7fTsKKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kW10gbV9hZnRlclhtbFRlc3RNZXRob2RzID0ge307CisgIHByaXZhdGUgTGlzdDxJVGVzdE5HTWV0aG9kPiBtX2V4Y2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIENvbmZpZ3VyYXRpb25Hcm91cE1ldGhvZHMgbV9ncm91cE1ldGhvZHMgPSBudWxsOworCisgIC8vIE1ldGEgZ3JvdXBzCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtX21ldGFHcm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAvLyBBbGwgdGhlIHRlc3RzIHRoYXQgd2VyZSBydW4gYWxvbmcgd2l0aCB0aGVpciByZXN1bHQKKyAgcHJpdmF0ZSBJUmVzdWx0TWFwIG1fcGFzc2VkVGVzdHMgPSBuZXcgUmVzdWx0TWFwKCk7CisgIHByaXZhdGUgSVJlc3VsdE1hcCBtX2ZhaWxlZFRlc3RzID0gbmV3IFJlc3VsdE1hcCgpOworICBwcml2YXRlIElSZXN1bHRNYXAgbV9mYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzID0gbmV3IFJlc3VsdE1hcCgpOworICBwcml2YXRlIElSZXN1bHRNYXAgbV9za2lwcGVkVGVzdHMgPSBuZXcgUmVzdWx0TWFwKCk7CisKKyAgcHJpdmF0ZSBSdW5JbmZvIG1fcnVuSW5mbz0gbmV3IFJ1bkluZm8oKTsKKworICAvLyBUaGUgaG9zdCB3aGVyZSB0aGlzIHRlc3Qgd2FzIHJ1biwgb3IgbnVsbCBpZiBydW4gbG9jYWxseQorICBwcml2YXRlIFN0cmluZyBtX2hvc3Q7CisKKyAgLy8gRGVmaW5lZCBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gPHRlc3QgcHJlc2VydmUtb3JkZXI9InRydWUvZmFsc2UiPgorICB0cmFuc2llbnQgcHJpdmF0ZSBMaXN0PElNZXRob2RJbnRlcmNlcHRvcj4gbV9tZXRob2RJbnRlcmNlcHRvcnM7CisKKyAgcHJpdmF0ZSB0cmFuc2llbnQgQ2xhc3NNZXRob2RNYXAgbV9jbGFzc01ldGhvZE1hcDsKKyAgcHJpdmF0ZSB0cmFuc2llbnQgVGVzdE5HQ2xhc3NGaW5kZXIgbV90ZXN0Q2xhc3NGaW5kZXI7CisgIHByaXZhdGUgdHJhbnNpZW50IElDb25maWd1cmF0aW9uIG1fY29uZmlndXJhdGlvbjsKKyAgcHJpdmF0ZSBJTWV0aG9kSW50ZXJjZXB0b3IgYnVpbHRpbkludGVyY2VwdG9yOworCisgIHByb3RlY3RlZCBUZXN0UnVubmVyKElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIElTdWl0ZSBzdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgWG1sVGVzdCB0ZXN0LAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMsCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gaW52b2tlZE1ldGhvZExpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ2xhc3NMaXN0ZW5lcj4gY2xhc3NMaXN0ZW5lcnMpCisgIHsKKyAgICBpbml0KGNvbmZpZ3VyYXRpb24sIHN1aXRlLCB0ZXN0LCBvdXRwdXREaXJlY3RvcnksIGZpbmRlciwgc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMsCisgICAgICAgIGludm9rZWRNZXRob2RMaXN0ZW5lcnMsIGNsYXNzTGlzdGVuZXJzKTsKKyAgfQorCisgIHB1YmxpYyBUZXN0UnVubmVyKElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElTdWl0ZSBzdWl0ZSwgWG1sVGVzdCB0ZXN0LAorICAgICAgYm9vbGVhbiBza2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cywKKyAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gaW52b2tlZE1ldGhvZExpc3RlbmVycywKKyAgICAgIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKSB7CisgICAgaW5pdChjb25maWd1cmF0aW9uLCBzdWl0ZSwgdGVzdCwgc3VpdGUuZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAgIHN1aXRlLmdldEFubm90YXRpb25GaW5kZXIoKSwKKyAgICAgICAgc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMsIGludm9rZWRNZXRob2RMaXN0ZW5lcnMsIGNsYXNzTGlzdGVuZXJzKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0KElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIElTdWl0ZSBzdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgWG1sVGVzdCB0ZXN0LAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzLAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IGludm9rZWRNZXRob2RMaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKQorICB7CisgICAgbV9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICBtX3htbFRlc3Q9IHRlc3Q7CisgICAgbV9zdWl0ZSA9IHN1aXRlOworICAgIG1fdGVzdE5hbWUgPSB0ZXN0LmdldE5hbWUoKTsKKyAgICBtX2hvc3QgPSBzdWl0ZS5nZXRIb3N0KCk7CisgICAgbV90ZXN0Q2xhc3Nlc0Zyb21YbWw9IHRlc3QuZ2V0WG1sQ2xhc3NlcygpOworICAgIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSBza2lwRmFpbGVkSW52b2NhdGlvbkNvdW50czsKKyAgICBzZXRWZXJib3NlKHRlc3QuZ2V0VmVyYm9zZSgpKTsKKworCisgICAgYm9vbGVhbiBwcmVzZXJ2ZU9yZGVyID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodGVzdC5nZXRQcmVzZXJ2ZU9yZGVyKCkpOworICAgIG1fbWV0aG9kSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kSW50ZXJjZXB0b3I+KCk7CisgICAgYnVpbHRpbkludGVyY2VwdG9yID0gcHJlc2VydmVPcmRlciA/IG5ldyBQcmVzZXJ2ZU9yZGVyTWV0aG9kSW50ZXJjZXB0b3IoKSA6IG5ldyBJbnN0YW5jZU9yZGVyaW5nTWV0aG9kSW50ZXJjZXB0b3IoKTsKKworICAgIG1fcGFja2FnZU5hbWVzRnJvbVhtbD0gdGVzdC5nZXRYbWxQYWNrYWdlcygpOworICAgIGlmKG51bGwgIT0gbV9wYWNrYWdlTmFtZXNGcm9tWG1sKSB7CisgICAgICBmb3IoWG1sUGFja2FnZSB4cDogbV9wYWNrYWdlTmFtZXNGcm9tWG1sKSB7CisgICAgICAgIG1fdGVzdENsYXNzZXNGcm9tWG1sLmFkZEFsbCh4cC5nZXRYbWxDbGFzc2VzKCkpOworICAgICAgfQorICAgIH0KKworICAgIG1fYW5ub3RhdGlvbkZpbmRlcj0gYW5ub3RhdGlvbkZpbmRlcjsKKyAgICBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMgPSBpbnZva2VkTWV0aG9kTGlzdGVuZXJzOworICAgIG1fY2xhc3NMaXN0ZW5lcnMgPSBjbGFzc0xpc3RlbmVyczsKKyAgICBtX2ludm9rZXIgPSBuZXcgSW52b2tlcihtX2NvbmZpZ3VyYXRpb24sIHRoaXMsIHRoaXMsIG1fc3VpdGUuZ2V0U3VpdGVTdGF0ZSgpLAorICAgICAgICBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzLCBpbnZva2VkTWV0aG9kTGlzdGVuZXJzLCBjbGFzc0xpc3RlbmVycyk7CisKKyAgICBpZiAoc3VpdGUuZ2V0UGFyYWxsZWwoKSAhPSBudWxsKSB7CisgICAgICBsb2coMywgIlJ1bm5pbmcgdGhlIHRlc3RzIGluICciICsgdGVzdC5nZXROYW1lKCkgKyAiJyB3aXRoIHBhcmFsbGVsIG1vZGU6IiArIHN1aXRlLmdldFBhcmFsbGVsKCkpOworICAgIH0KKworICAgIHNldE91dHB1dERpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkpOworCisgICAgLy8gRmluaXNoIG91ciBpbml0aWFsaXphdGlvbgorICAgIGluaXQoKTsKKyAgfQorCisgIHB1YmxpYyBJSW52b2tlciBnZXRJbnZva2VyKCkgeworICAgIHJldHVybiBtX2ludm9rZXI7CisgIH0KKworICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVN1aXRlTWV0aG9kcygpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVTdWl0ZU1ldGhvZHM7CisgIH0KKworICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyU3VpdGVNZXRob2RzKCkgeworICAgIHJldHVybiBtX2FmdGVyU3VpdGVNZXRob2RzOworICB9CisKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlWG1sVGVzdE1ldGhvZHM7CisgIH0KKworICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCkgeworICAgIHJldHVybiBtX2FmdGVyWG1sVGVzdE1ldGhvZHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICBpbml0TWV0YUdyb3VwcyhtX3htbFRlc3QpOworICAgIGluaXRSdW5JbmZvKG1feG1sVGVzdCk7CisKKyAgICAvLyBJbml0IG1ldGhvZHMgYW5kIGNsYXNzIG1hcAorICAgIC8vIEpVbml0IGJlaGF2aW9yIGlzIGRpZmZlcmVudCBhbmQgZG9lc24ndCBuZWVkIHRoaXMgaW5pdGlhbGl6YXRpb24gc3RlcAorICAgIGlmKCFtX3htbFRlc3QuaXNKVW5pdCgpKSB7CisgICAgICBpbml0TWV0aG9kcygpOworICAgIH0KKworICAgIGluaXRMaXN0ZW5lcnMoKTsKKyAgICBhZGRDb25maWd1cmF0aW9uTGlzdGVuZXIobV9jb25mTGlzdGVuZXIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdGVuZXJIb2xkZXIgeworICAgIHByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPj4gbGlzdGVuZXJDbGFzc2VzOworICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lckZhY3Rvcnk+IGxpc3RlbmVyRmFjdG9yeUNsYXNzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYWxsIHRoZSBATGlzdGVuZXJzIGFubm90YXRpb25zIGZvdW5kIGluIHRoZSBjdXJyZW50IGNsYXNzIGFuZCBpdHMKKyAgICogc3VwZXJjbGFzc2VzLgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0ZW5lckhvbGRlciBmaW5kQWxsTGlzdGVuZXJzKENsYXNzPD8+IGNscykgeworICAgIExpc3RlbmVySG9sZGVyIHJlc3VsdCA9IG5ldyBMaXN0ZW5lckhvbGRlcigpOworICAgIHJlc3VsdC5saXN0ZW5lckNsYXNzZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGRvIHsKKyAgICAgIElMaXN0ZW5lcnNBbm5vdGF0aW9uIGwgPSBtX2Fubm90YXRpb25GaW5kZXIuZmluZEFubm90YXRpb24oY2xzLCBJTGlzdGVuZXJzQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBJVGVzdE5HTGlzdGVuZXI+W10gY2xhc3NlcyA9IGwuZ2V0VmFsdWUoKTsKKyAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPiBjIDogY2xhc3NlcykgeworICAgICAgICAgIHJlc3VsdC5saXN0ZW5lckNsYXNzZXMuYWRkKGMpOworCisgICAgICAgICAgaWYgKElUZXN0TkdMaXN0ZW5lckZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5saXN0ZW5lckZhY3RvcnlDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHJlc3VsdC5saXN0ZW5lckZhY3RvcnlDbGFzcyA9IChDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyRmFjdG9yeT4pIGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiRm91bmQgbW9yZSB0aGFuIG9uZSBjbGFzcyBpbXBsZW1lbnRpbmciICsKKyAgICAgICAgICAgICAgICAgICJJVGVzdE5HTGlzdGVuZXJGYWN0b3J5OiIgKyBjICsgIiBhbmQgIiArIHJlc3VsdC5saXN0ZW5lckZhY3RvcnlDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOworICAgIH0gd2hpbGUgKGNscyAhPSBPYmplY3QuY2xhc3MpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0TGlzdGVuZXJzKCkgeworICAgIC8vCisgICAgLy8gRmluZCBhbGwgdGhlIGxpc3RlbmVyIGZhY3RvcmllcyBhbmQgY29sbGVjdCBhbGwgdGhlIGxpc3RlbmVycyByZXF1ZXN0ZWQgaW4gYQorICAgIC8vIEBMaXN0ZW5lcnMgYW5ub3RhdGlvbi4KKyAgICAvLworICAgIFNldDxDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPj4gbGlzdGVuZXJDbGFzc2VzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lckZhY3Rvcnk+IGxpc3RlbmVyRmFjdG9yeUNsYXNzID0gbnVsbDsKKworICAgIGZvciAoSUNsYXNzIGNscyA6IGdldFRlc3RDbGFzc2VzKCkpIHsKKyAgICAgIENsYXNzPD8gZXh0ZW5kcyBJVGVzdE5HTGlzdGVuZXJGYWN0b3J5PiByZWFsQ2xhc3MgPSBjbHMuZ2V0UmVhbENsYXNzKCk7CisgICAgICBMaXN0ZW5lckhvbGRlciBsaXN0ZW5lckhvbGRlciA9IGZpbmRBbGxMaXN0ZW5lcnMocmVhbENsYXNzKTsKKyAgICAgIGlmIChsaXN0ZW5lckZhY3RvcnlDbGFzcyA9PSBudWxsKSB7CisgICAgICAgIGxpc3RlbmVyRmFjdG9yeUNsYXNzID0gbGlzdGVuZXJIb2xkZXIubGlzdGVuZXJGYWN0b3J5Q2xhc3M7CisgICAgICB9CisgICAgICBsaXN0ZW5lckNsYXNzZXMuYWRkQWxsKGxpc3RlbmVySG9sZGVyLmxpc3RlbmVyQ2xhc3Nlcyk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgdGhlIGxpc3RlbmVycyBjb2xsZWN0ZWQgZnJvbSBATGlzdGVuZXJzIGFuZCBhdCBtb3N0IG9uZQorICAgIC8vIGxpc3RlbmVyIGZhY3RvcnkgY29sbGVjdGVkIGZyb20gYSBjbGFzcyBpbXBsZW1lbnRpbmcgSVRlc3ROR0xpc3RlbmVyRmFjdG9yeS4KKyAgICAvLyBJbnN0YW50aWF0ZSBhbGwgdGhlIHJlcXVlc3RlZCBsaXN0ZW5lcnMuCisgICAgLy8KKyAgICBJVGVzdE5HTGlzdGVuZXJGYWN0b3J5IGxpc3RlbmVyRmFjdG9yeSA9IG51bGw7CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIHRlc3QgbGlzdGVuZXIgZmFjdG9yeSwgaW5zdGFudGlhdGUgaXQuCisgICAgdHJ5IHsKKyAgICAgIGlmIChtX3Rlc3RDbGFzc0ZpbmRlciAhPSBudWxsKSB7CisgICAgICAgIElDbGFzcyBpYyA9IG1fdGVzdENsYXNzRmluZGVyLmdldElDbGFzcyhsaXN0ZW5lckZhY3RvcnlDbGFzcyk7CisgICAgICAgIGlmIChpYyAhPSBudWxsKSB7CisgICAgICAgICAgbGlzdGVuZXJGYWN0b3J5ID0gKElUZXN0TkdMaXN0ZW5lckZhY3RvcnkpIGljLmdldEluc3RhbmNlcyhmYWxzZSlbMF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lckZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICBsaXN0ZW5lckZhY3RvcnkgPSBsaXN0ZW5lckZhY3RvcnlDbGFzcyAhPSBudWxsID8gbGlzdGVuZXJGYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKSA6IG51bGw7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ291bGRuJ3QgaW5zdGFudGlhdGUgdGhlIElUZXN0TkdMaXN0ZW5lckZhY3Rvcnk6ICIKKyAgICAgICAgICArIGV4KTsKKyAgICB9CisKKyAgICAvLyBJbnN0YW50aWF0ZSBhbGwgdGhlIGxpc3RlbmVycworICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lcj4gYyA6IGxpc3RlbmVyQ2xhc3NlcykgeworICAgICAgT2JqZWN0IGxpc3RlbmVyID0gbGlzdGVuZXJGYWN0b3J5ICE9IG51bGwgPyBsaXN0ZW5lckZhY3RvcnkuY3JlYXRlTGlzdGVuZXIoYykgOiBudWxsOworICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgbGlzdGVuZXIgPSBDbGFzc0hlbHBlci5uZXdJbnN0YW5jZShjKTsKKyAgICAgIH0KKworICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSU1ldGhvZEludGVyY2VwdG9yKSB7CisgICAgICAgIG1fbWV0aG9kSW50ZXJjZXB0b3JzLmFkZCgoSU1ldGhvZEludGVyY2VwdG9yKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJU3VpdGVMaXN0ZW5lcikgeworICAgICAgICBtX3N1aXRlLmFkZExpc3RlbmVyKChJU3VpdGVMaXN0ZW5lcikgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUludm9rZWRNZXRob2RMaXN0ZW5lcikgeworICAgICAgICBtX3N1aXRlLmFkZExpc3RlbmVyKChJVGVzdE5HTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElUZXN0TGlzdGVuZXIpIHsKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkIG1fdGVzdExpc3RlbmVycyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhlIGNyZWF0aW9uCisgICAgICAgIGFkZFRlc3RMaXN0ZW5lcigoSVRlc3RMaXN0ZW5lcikgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNsYXNzTGlzdGVuZXIpIHsKKyAgICAgICAgbV9jbGFzc0xpc3RlbmVycy5hZGQoKElDbGFzc0xpc3RlbmVyKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGFkZENvbmZpZ3VyYXRpb25MaXN0ZW5lcigoSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcikgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSVJlcG9ydGVyKSB7CisgICAgICAgIG1fc3VpdGUuYWRkTGlzdGVuZXIoKElUZXN0TkdMaXN0ZW5lcikgbGlzdGVuZXIpOworICAgICAgfQorICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgeworICAgICAgICBtX2NvbmZpZ3VyYXRpb24uc2V0Q29uZmlndXJhYmxlKChJQ29uZmlndXJhYmxlKSBsaXN0ZW5lcik7CisgICAgICB9CisgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJSG9va2FibGUpIHsKKyAgICAgICAgbV9jb25maWd1cmF0aW9uLnNldEhvb2thYmxlKChJSG9va2FibGUpIGxpc3RlbmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElFeGVjdXRpb25MaXN0ZW5lcikgeworICAgICAgICBJRXhlY3V0aW9uTGlzdGVuZXIgaWVsID0gKElFeGVjdXRpb25MaXN0ZW5lcikgbGlzdGVuZXI7CisgICAgICAgIGllbC5vbkV4ZWN1dGlvblN0YXJ0KCk7CisgICAgICAgIG1fY29uZmlndXJhdGlvbi5hZGRFeGVjdXRpb25MaXN0ZW5lcihpZWwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbml0aWFsaXplIG1ldGEgZ3JvdXBzCisgICAqLworICBwcml2YXRlIHZvaWQgaW5pdE1ldGFHcm91cHMoWG1sVGVzdCB4bWxUZXN0KSB7CisgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtZXRhR3JvdXBzID0geG1sVGVzdC5nZXRNZXRhR3JvdXBzKCk7CisKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBtZXRhR3JvdXBzLmVudHJ5U2V0KCkpIHsKKyAgICAgIGFkZE1ldGFHcm91cChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRSdW5JbmZvKGZpbmFsIFhtbFRlc3QgeG1sVGVzdCkgeworICAgIC8vIEdyb3VwcworICAgIG1feG1sTWV0aG9kU2VsZWN0b3Iuc2V0SW5jbHVkZWRHcm91cHMoY3JlYXRlR3JvdXBzKG1feG1sVGVzdC5nZXRJbmNsdWRlZEdyb3VwcygpKSk7CisgICAgbV94bWxNZXRob2RTZWxlY3Rvci5zZXRFeGNsdWRlZEdyb3VwcyhjcmVhdGVHcm91cHMobV94bWxUZXN0LmdldEV4Y2x1ZGVkR3JvdXBzKCkpKTsKKyAgICBtX3htbE1ldGhvZFNlbGVjdG9yLnNldEV4cHJlc3Npb24obV94bWxUZXN0LmdldEV4cHJlc3Npb24oKSk7CisKKyAgICAvLyBNZXRob2RzCisgICAgbV94bWxNZXRob2RTZWxlY3Rvci5zZXRYbWxDbGFzc2VzKG1feG1sVGVzdC5nZXRYbWxDbGFzc2VzKCkpOworCisgICAgbV9ydW5JbmZvLmFkZE1ldGhvZFNlbGVjdG9yKG1feG1sTWV0aG9kU2VsZWN0b3IsIDEwKTsKKworICAgIC8vIEFkZCB1c2VyLXNwZWNpZmllZCBtZXRob2Qgc2VsZWN0b3JzIChvbmx5IGNsYXNzIHNlbGVjdG9ycywgd2UgY2FuIGlnbm9yZQorICAgIC8vIHNjcmlwdCBzZWxlY3RvcnMgaGVyZSkKKyAgICBpZiAobnVsbCAhPSB4bWxUZXN0LmdldE1ldGhvZFNlbGVjdG9ycygpKSB7CisgICAgICBmb3IgKG9yZy50ZXN0bmcueG1sLlhtbE1ldGhvZFNlbGVjdG9yIHNlbGVjdG9yIDogeG1sVGVzdC5nZXRNZXRob2RTZWxlY3RvcnMoKSkgeworICAgICAgICBpZiAoc2VsZWN0b3IuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgIElNZXRob2RTZWxlY3RvciBzID0gQ2xhc3NIZWxwZXIuY3JlYXRlU2VsZWN0b3Ioc2VsZWN0b3IpOworCisgICAgICAgICAgbV9ydW5JbmZvLmFkZE1ldGhvZFNlbGVjdG9yKHMsIHNlbGVjdG9yLmdldFByaW9yaXR5KCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRNZXRob2RzKCkgeworCisgICAgLy8KKyAgICAvLyBDYWxjdWxhdGUgYWxsIHRoZSBtZXRob2RzIHdlIG5lZWQgdG8gaW52b2tlCisgICAgLy8KKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGJlZm9yZUNsYXNzTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdGVzdE1ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGFmdGVyQ2xhc3NNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBiZWZvcmVTdWl0ZU1ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGFmdGVyU3VpdGVNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBiZWZvcmVYbWxUZXN0TWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gYWZ0ZXJYbWxUZXN0TWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgQ2xhc3NJbmZvTWFwIGNsYXNzTWFwID0gbmV3IENsYXNzSW5mb01hcChtX3Rlc3RDbGFzc2VzRnJvbVhtbCk7CisgICAgbV90ZXN0Q2xhc3NGaW5kZXI9IG5ldyBUZXN0TkdDbGFzc0ZpbmRlcihjbGFzc01hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICBJVGVzdE1ldGhvZEZpbmRlciB0ZXN0TWV0aG9kRmluZGVyCisgICAgICA9IG5ldyBUZXN0TkdNZXRob2RGaW5kZXIobV9ydW5JbmZvLCBtX2Fubm90YXRpb25GaW5kZXIpOworCisgICAgbV9ydW5JbmZvLnNldFRlc3RNZXRob2RzKHRlc3RNZXRob2RzKTsKKworICAgIC8vCisgICAgLy8gSW5pdGlhbGl6ZSBUZXN0Q2xhc3NlcworICAgIC8vCisgICAgSUNsYXNzW10gY2xhc3NlcyA9IG1fdGVzdENsYXNzRmluZGVyLmZpbmRUZXN0Q2xhc3NlcygpOworCisgICAgZm9yIChJQ2xhc3MgaWMgOiBjbGFzc2VzKSB7CisKKyAgICAgIC8vIENyZWF0ZSBUZXN0Q2xhc3MKKyAgICAgIElUZXN0Q2xhc3MgdGMgPSBuZXcgVGVzdENsYXNzKGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV94bWxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc01hcC5nZXRYbWxDbGFzcyhpYy5nZXRSZWFsQ2xhc3MoKSkpOworICAgICAgbV9jbGFzc01hcC5wdXQoaWMuZ2V0UmVhbENsYXNzKCksIHRjKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENhbGN1bGF0ZSBncm91cHMgbWV0aG9kcworICAgIC8vCisgICAgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gYmVmb3JlR3JvdXBNZXRob2RzID0KKyAgICAgICAgTWV0aG9kR3JvdXBzSGVscGVyLmZpbmRHcm91cHNNZXRob2RzKG1fY2xhc3NNYXAudmFsdWVzKCksIHRydWUpOworICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+IGFmdGVyR3JvdXBNZXRob2RzID0KKyAgICAgICAgTWV0aG9kR3JvdXBzSGVscGVyLmZpbmRHcm91cHNNZXRob2RzKG1fY2xhc3NNYXAudmFsdWVzKCksIGZhbHNlKTsKKworICAgIC8vCisgICAgLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgVGVzdENsYXNzZXMsIHN0b3JlIHRoZWlyIG1ldGhvZAorICAgIC8vIGFuZCBpbml0aWFsaXplIHRoZW0gd2l0aCB0aGUgY29ycmVjdCBJVGVzdENsYXNzCisgICAgLy8KKyAgICBmb3IgKElUZXN0Q2xhc3MgdGMgOiBtX2NsYXNzTWFwLnZhbHVlcygpKSB7CisgICAgICBmaXhNZXRob2RzV2l0aENsYXNzKHRjLmdldFRlc3RNZXRob2RzKCksIHRjLCB0ZXN0TWV0aG9kcyk7CisgICAgICBmaXhNZXRob2RzV2l0aENsYXNzKHRjLmdldEJlZm9yZUNsYXNzTWV0aG9kcygpLCB0YywgYmVmb3JlQ2xhc3NNZXRob2RzKTsKKyAgICAgIGZpeE1ldGhvZHNXaXRoQ2xhc3ModGMuZ2V0QmVmb3JlVGVzdE1ldGhvZHMoKSwgdGMsIG51bGwpOworICAgICAgZml4TWV0aG9kc1dpdGhDbGFzcyh0Yy5nZXRBZnRlclRlc3RNZXRob2RzKCksIHRjLCBudWxsKTsKKyAgICAgIGZpeE1ldGhvZHNXaXRoQ2xhc3ModGMuZ2V0QWZ0ZXJDbGFzc01ldGhvZHMoKSwgdGMsIGFmdGVyQ2xhc3NNZXRob2RzKTsKKyAgICAgIGZpeE1ldGhvZHNXaXRoQ2xhc3ModGMuZ2V0QmVmb3JlU3VpdGVNZXRob2RzKCksIHRjLCBiZWZvcmVTdWl0ZU1ldGhvZHMpOworICAgICAgZml4TWV0aG9kc1dpdGhDbGFzcyh0Yy5nZXRBZnRlclN1aXRlTWV0aG9kcygpLCB0YywgYWZ0ZXJTdWl0ZU1ldGhvZHMpOworICAgICAgZml4TWV0aG9kc1dpdGhDbGFzcyh0Yy5nZXRCZWZvcmVUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSwgdGMsIGJlZm9yZVhtbFRlc3RNZXRob2RzKTsKKyAgICAgIGZpeE1ldGhvZHNXaXRoQ2xhc3ModGMuZ2V0QWZ0ZXJUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSwgdGMsIGFmdGVyWG1sVGVzdE1ldGhvZHMpOworICAgICAgZml4TWV0aG9kc1dpdGhDbGFzcyh0Yy5nZXRCZWZvcmVHcm91cHNNZXRob2RzKCksIHRjLAorICAgICAgICAgIE1ldGhvZEhlbHBlci51bmlxdWVNZXRob2RMaXN0KGJlZm9yZUdyb3VwTWV0aG9kcy52YWx1ZXMoKSkpOworICAgICAgZml4TWV0aG9kc1dpdGhDbGFzcyh0Yy5nZXRBZnRlckdyb3Vwc01ldGhvZHMoKSwgdGMsCisgICAgICAgICAgTWV0aG9kSGVscGVyLnVuaXF1ZU1ldGhvZExpc3QoYWZ0ZXJHcm91cE1ldGhvZHMudmFsdWVzKCkpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIG1ldGhvZHMKKyAgICAvLworICAgIG1fYmVmb3JlU3VpdGVNZXRob2RzID0gTWV0aG9kSGVscGVyLmNvbGxlY3RBbmRPcmRlck1ldGhvZHMoYmVmb3JlU3VpdGVNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmb3JUZXN0cyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogdW5pcXVlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1ZGVkTWV0aG9kcyk7CisKKyAgICBtX2JlZm9yZVhtbFRlc3RNZXRob2RzID0gTWV0aG9kSGVscGVyLmNvbGxlY3RBbmRPcmRlck1ldGhvZHMoYmVmb3JlWG1sVGVzdE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZvclRlc3RzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB1bmlxdWUgKENRIGFkZGVkIGJ5IG1lKSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1ZGVkTWV0aG9kcyk7CisKKyAgICBtX2FsbFRlc3RNZXRob2RzID0gTWV0aG9kSGVscGVyLmNvbGxlY3RBbmRPcmRlck1ldGhvZHModGVzdE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmb3JUZXN0PyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHVuaXF1ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1ZGVkTWV0aG9kcyk7CisgICAgbV9jbGFzc01ldGhvZE1hcCA9IG5ldyBDbGFzc01ldGhvZE1hcCh0ZXN0TWV0aG9kcywgbV94bWxNZXRob2RTZWxlY3Rvcik7CisKKyAgICBtX2FmdGVyWG1sVGVzdE1ldGhvZHMgPSBNZXRob2RIZWxwZXIuY29sbGVjdEFuZE9yZGVyTWV0aG9kcyhhZnRlclhtbFRlc3RNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmb3JUZXN0cyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogdW5pcXVlIChDUSBhZGRlZCBieSBtZSkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9leGNsdWRlZE1ldGhvZHMpOworCisgICAgbV9hZnRlclN1aXRlTWV0aG9kcyA9IE1ldGhvZEhlbHBlci5jb2xsZWN0QW5kT3JkZXJNZXRob2RzKGFmdGVyU3VpdGVNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmb3JUZXN0cyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogdW5pcXVlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1ZGVkTWV0aG9kcyk7CisgICAgLy8gc2hhcmVkIGdyb3VwIG1ldGhvZHMKKyAgICBtX2dyb3VwTWV0aG9kcyA9IG5ldyBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzKG1fYWxsVGVzdE1ldGhvZHMsIGJlZm9yZUdyb3VwTWV0aG9kcywgYWZ0ZXJHcm91cE1ldGhvZHMpOworCisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBmaXhNZXRob2RzV2l0aENsYXNzKElUZXN0TkdNZXRob2RbXSBtZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENsYXNzIHRlc3RDbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gbWV0aG9kTGlzdCkgeworICAgIGZvciAoSVRlc3ROR01ldGhvZCBpdG0gOiBtZXRob2RzKSB7CisgICAgICBpdG0uc2V0VGVzdENsYXNzKHRlc3RDbHMpOworCisgICAgICBpZiAobWV0aG9kTGlzdCAhPSBudWxsKSB7CisgICAgICAgIG1ldGhvZExpc3QuYWRkKGl0bSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIENvbGxlY3Rpb248SVRlc3RDbGFzcz4gZ2V0VGVzdENsYXNzZXMoKSB7CisgICAgcmV0dXJuIG1fY2xhc3NNYXAudmFsdWVzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUZXN0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIG1fdGVzdE5hbWUgPSBuYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvZCkgeworICAgIG1fb3V0cHV0RGlyZWN0b3J5PSBvZDsKKy8vICBGSVg6IGVtcHR5IGRpcmVjdG9yaWVzIHdlcmUgY3JlYXRlZAorLy8gICAgaWYgKG9kID09IG51bGwpIHsgbV9vdXRwdXREaXJlY3RvcnkgPSBudWxsOyByZXR1cm47IH0gLy9mb3IgbWF2ZW4yCisvLyAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShvZCk7CisvLyAgICBmaWxlLm1rZGlycygpOworLy8gICAgbV9vdXRwdXREaXJlY3Rvcnk9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkTWV0YUdyb3VwKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gZ3JvdXBOYW1lcykgeworICAgIG1fbWV0YUdyb3Vwcy5wdXQobmFtZSwgZ3JvdXBOYW1lcyk7CisgIH0KKworICAvKioKKyAgICogQ2FsY3VsYXRlIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIHRoZSBNZXRhR3JvdXBzCisgICAqCisgICAqIEBwYXJhbSBncm91cHMKKyAgICogQHBhcmFtIHVuZmluaXNoZWRHcm91cHMKKyAgICogQHBhcmFtIHJlc3VsdCAgICAgICAgICAgVGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBjb250YWluaW5nIGFsbCB0aGUgZ3JvdXBzIGZvdW5kCisgICAqLworICBwcml2YXRlIHZvaWQgY29sbGVjdEdyb3VwcyhTdHJpbmdbXSBncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1bmZpbmlzaGVkR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCkgeworICAgIGZvciAoU3RyaW5nIGduIDogZ3JvdXBzKSB7CisgICAgICBMaXN0PFN0cmluZz4gc3ViR3JvdXBzID0gbV9tZXRhR3JvdXBzLmdldChnbik7CisgICAgICBpZiAobnVsbCAhPSBzdWJHcm91cHMpIHsKKworICAgICAgICBmb3IgKFN0cmluZyBzZyA6IHN1Ykdyb3VwcykgeworICAgICAgICAgIGlmIChudWxsID09IHJlc3VsdC5nZXQoc2cpKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KHNnLCBzZyk7CisgICAgICAgICAgICB1bmZpbmlzaGVkR3JvdXBzLmFkZChzZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWF0ZUdyb3VwcyhMaXN0PFN0cmluZz4gZ3JvdXBzKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyb3Vwcyhncm91cHMudG9BcnJheShuZXcgU3RyaW5nW2dyb3Vwcy5zaXplKCldKSk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlR3JvdXBzKFN0cmluZ1tdIGdyb3VwcykgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICAvLyBHcm91cHMgdGhhdCB3ZXJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsKKyAgICAgIHJlc3VsdC5wdXQoZ3JvdXAsIGdyb3VwKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbnkgTWV0YUdyb3VwcyBhbmQKKyAgICAvLyBleHBhbmQgdGhlbSBpZiB0aGV5IG1hdGNoIG9uZSBvZiB0aGUgZ3JvdXBzCisgICAgLy8gd2UgaGF2ZSBqdXN0IGJlZW4gcGFzc2VkCisgICAgTGlzdDxTdHJpbmc+IHVuZmluaXNoZWRHcm91cHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGlmIChtX21ldGFHcm91cHMuc2l6ZSgpID4gMCkgeworICAgICAgY29sbGVjdEdyb3Vwcyhncm91cHMsIHVuZmluaXNoZWRHcm91cHMsIHJlc3VsdCk7CisKKyAgICAgIC8vIERvIHdlIG5lZWQgdG8gbG9vcCBvdmVyIHVuZmluaXNoZWQgZ3JvdXBzPworICAgICAgd2hpbGUgKHVuZmluaXNoZWRHcm91cHMuc2l6ZSgpID4gMCkgeworICAgICAgICBTdHJpbmdbXSB1R3JvdXBzID0gdW5maW5pc2hlZEdyb3Vwcy50b0FycmF5KG5ldyBTdHJpbmdbdW5maW5pc2hlZEdyb3Vwcy5zaXplKCldKTsKKyAgICAgICAgdW5maW5pc2hlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBjb2xsZWN0R3JvdXBzKHVHcm91cHMsIHVuZmluaXNoZWRHcm91cHMsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gICAgVXRpbHMuZHVtcE1hcChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogVGhlIG1haW4gZW50cnkgbWV0aG9kIGZvciBUZXN0UnVubmVyLgorICAgKgorICAgKiBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgaGFyZCB3b3JrIGlzIGRvbmU6CisgICAqIC0gSW52b2tlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcworICAgKiAtIEludm9rZSB0ZXN0IG1ldGhvZHMKKyAgICogLSBDYXRjaCBleGNlcHRpb25zCisgICAqIC0gQ29sbGVjdCByZXN1bHRzCisgICAqIC0gSW52b2tlIGxpc3RlbmVycworICAgKiAtIGV0Yy4uLgorICAgKi8KKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIGJlZm9yZVJ1bigpOworCisgICAgdHJ5IHsKKyAgICAgIFhtbFRlc3QgdGVzdD0gZ2V0VGVzdCgpOworICAgICAgaWYodGVzdC5pc0pVbml0KCkpIHsKKyAgICAgICAgcHJpdmF0ZVJ1bkpVbml0KHRlc3QpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaXZhdGVSdW4odGVzdCk7CisgICAgICB9CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgYWZ0ZXJSdW4oKTsKKyAgICB9CisgIH0KKworICAvKiogQmVmb3JlIHJ1biBwcmVwYXJlbWVudHMuICovCisgIHByaXZhdGUgdm9pZCBiZWZvcmVSdW4oKSB7CisgICAgLy8KKyAgICAvLyBMb2cgdGhlIHN0YXJ0IGRhdGUKKyAgICAvLworICAgIG1fc3RhcnREYXRlID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgLy8gTG9nIHN0YXJ0CisgICAgbG9nU3RhcnQoKTsKKworICAgIC8vIEludm9rZSBsaXN0ZW5lcnMKKyAgICBmaXJlRXZlbnQodHJ1ZSAvKnN0YXJ0Ki8pOworCisgICAgLy8gaW52b2tlIEBCZWZvcmVUZXN0CisgICAgSVRlc3ROR01ldGhvZFtdIHRlc3RDb25maWd1cmF0aW9uTWV0aG9kcz0gZ2V0QmVmb3JlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCk7CisgICAgaWYobnVsbCAhPSB0ZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMgJiYgdGVzdENvbmZpZ3VyYXRpb25NZXRob2RzLmxlbmd0aCA+IDApIHsKKyAgICAgIG1faW52b2tlci5pbnZva2VDb25maWd1cmF0aW9ucyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDb25maWd1cmF0aW9uTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbFRlc3QuZ2V0U3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbFRlc3QuZ2V0QWxsUGFyYW1ldGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8qIG5vIHBhcmFtZXRlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGluc3RhbmNlICovKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJpdmF0ZVJ1bkpVbml0KFhtbFRlc3QgeG1sVGVzdCkgeworICAgIGZpbmFsIENsYXNzSW5mb01hcCBjaW0gPSBuZXcgQ2xhc3NJbmZvTWFwKG1fdGVzdENsYXNzZXNGcm9tWG1sLCBmYWxzZSk7CisgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gY2ltLmdldENsYXNzZXMoKTsKKyAgICBmaW5hbCBMaXN0PElUZXN0TkdNZXRob2Q+IHJ1bk1ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IHdvcmtlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAvLyBGSVhNRTogZGlyZWN0bHkgcmVmZXJlbmNpbmcgSlVuaXRUZXN0UnVubmVyIHdoaWNoIHVzZXMgSlVuaXQgY2xhc3NlcworICAgIC8vIG1heSByZXN1bHQgaW4gYW4gY2xhc3MgcmVzb2x1dGlvbiBleGNlcHRpb24gdW5kZXIgZGlmZmVyZW50IEpWTXMKKyAgICAvLyBUaGUgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIEpWTSBzcGVjIHdpdGggYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiwKKyAgICAvLyBzbyBpdCBjYW4gYmUgZWFnZXIgPT4gZmFpbHVyZQorICAgIHdvcmtlcnMuYWRkKG5ldyBJV29ya2VyPElUZXN0TkdNZXRob2Q+KCkgeworICAgICAgLyoqCisgICAgICAgKiBAc2VlIFRlc3RNZXRob2RXb3JrZXIjZ2V0VGltZU91dCgpCisgICAgICAgKi8KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGxvbmcgZ2V0VGltZU91dCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKKyAgICAgICAqLworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGZvcihDbGFzczw/PiB0YzogY2xhc3NlcykgeworICAgICAgICAgIExpc3Q8WG1sSW5jbHVkZT4gaW5jbHVkZWRNZXRob2RzID0gY2ltLmdldFhtbENsYXNzKHRjKS5nZXRJbmNsdWRlZE1ldGhvZHMoKTsKKyAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgIGZvciAoWG1sSW5jbHVkZSBpbmM6IGluY2x1ZGVkTWV0aG9kcykgeworICAgICAgICAgICAgICBtZXRob2RzLmFkZChpbmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgSUpVbml0VGVzdFJ1bm5lciB0cj0gQ2xhc3NIZWxwZXIuY3JlYXRlVGVzdFJ1bm5lcihUZXN0UnVubmVyLnRoaXMpOworICAgICAgICAgIHRyLnNldEludm9rZWRNZXRob2RMaXN0ZW5lcnMobV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHIucnVuKHRjLCBtZXRob2RzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXRob2RzLnNpemUoKV0pKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBydW5NZXRob2RzLmFkZEFsbCh0ci5nZXRUZXN0TWV0aG9kcygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTGlzdDxJVGVzdE5HTWV0aG9kPiBnZXRUYXNrcygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiSlVuaXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7CisgICAgICAgIGlmIChtX2FsbFRlc3RNZXRob2RzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgcmV0dXJuIG1fYWxsVGVzdE1ldGhvZHNbMF0uZ2V0UHJpb3JpdHkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKElXb3JrZXI8SVRlc3ROR01ldGhvZD4gb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFByaW9yaXR5KCkgLSBvdGhlci5nZXRQcmlvcml0eSgpOworICAgICAgfQorICAgIH0pOworCisgICAgcnVuSlVuaXRXb3JrZXJzKHdvcmtlcnMpOworICAgIG1fYWxsVGVzdE1ldGhvZHM9IHJ1bk1ldGhvZHMudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFtydW5NZXRob2RzLnNpemUoKV0pOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bVNldDxYbWxTdWl0ZS5QYXJhbGxlbE1vZGU+IFBSSVZBVEVfUlVOX1BBUkFMTEVMX01PREVTCisgICAgICA9IEVudW1TZXQub2YoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk1FVEhPRFMsIFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5UUlVFLAorICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5DTEFTU0VTLCBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuSU5TVEFOQ0VTKTsKKyAgLyoqCisgICAqIE1haW4gbWV0aG9kIHRoYXQgY3JlYXRlIGEgZ3JhcGggb2YgbWV0aG9kcyBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZQorICAgKiBncmFwaCBleGVjdXRvciB0byBydW4gdGhlbS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBwcml2YXRlUnVuKFhtbFRlc3QgeG1sVGVzdCkgeworICAgIFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBwYXJhbGxlbE1vZGUgPSB4bWxUZXN0LmdldFBhcmFsbGVsKCk7CisgICAgYm9vbGVhbiBwYXJhbGxlbCA9IFBSSVZBVEVfUlVOX1BBUkFMTEVMX01PREVTLmNvbnRhaW5zKHBhcmFsbGVsTW9kZSk7CisKKyAgICB7CisgICAgICAvLyBwYXJhbGxlbAorICAgICAgaW50IHRocmVhZENvdW50ID0gcGFyYWxsZWwgPyB4bWxUZXN0LmdldFRocmVhZENvdW50KCkgOiAxOworICAgICAgLy8gTWFrZSBzdXJlIHdlIGNyZWF0ZSBhIGdyYXBoIGJhc2VkIG9uIHRoZSBpbnRlcmNlcHRlZCBtZXRob2RzLCBvdGhlcndpc2UgYW4gaW50ZXJjZXB0b3IKKyAgICAgIC8vIHJlbW92aW5nIG1ldGhvZHMgd291bGQgY2F1c2UgdGhlIGdyYXBoIG5ldmVyIHRvIHRlcm1pbmF0ZSAoYmVjYXVzZSBpdCB3b3VsZCBleHBlY3QKKyAgICAgIC8vIHRlcm1pbmF0aW9uIGZyb20gbWV0aG9kcyB0aGF0IG5ldmVyIGdldCBpbnZva2VkKS4KKyAgICAgIER5bmFtaWNHcmFwaDxJVGVzdE5HTWV0aG9kPiBncmFwaCA9IGNyZWF0ZUR5bmFtaWNHcmFwaChpbnRlcmNlcHQobV9hbGxUZXN0TWV0aG9kcykpOworICAgICAgaWYgKHBhcmFsbGVsKSB7CisgICAgICAgIGlmIChncmFwaC5nZXROb2RlQ291bnQoKSA+IDApIHsKKyAgICAgICAgICBHcmFwaFRocmVhZFBvb2xFeGVjdXRvcjxJVGVzdE5HTWV0aG9kPiBleGVjdXRvciA9CisgICAgICAgICAgICAgICAgICBuZXcgR3JhcGhUaHJlYWRQb29sRXhlY3V0b3I8PihncmFwaCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkQ291bnQsIHRocmVhZENvdW50LCAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpKTsKKyAgICAgICAgICBleGVjdXRvci5ydW4oKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0aW1lT3V0ID0gbV94bWxUZXN0LmdldFRpbWVPdXQoWG1sVGVzdC5ERUZBVUxUX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgVXRpbHMubG9nKCJUZXN0UnVubmVyIiwgMiwgIlN0YXJ0aW5nIGV4ZWN1dG9yIGZvciB0ZXN0ICIgKyBtX3htbFRlc3QuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIHdpdGggdGltZSBvdXQ6IiArIHRpbWVPdXQgKyAiIG1pbGxpc2Vjb25kcy4iKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24odGltZU91dCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaGFuZGxlZCkgeworICAgICAgICAgICAgaGFuZGxlZC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7CisgICAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gZnJlZU5vZGVzID0gZ3JhcGguZ2V0RnJlZU5vZGVzKCk7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnJlZSBub2RlczoiICsgZnJlZU5vZGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChncmFwaC5nZXROb2RlQ291bnQoKSA+IDAgJiYgZnJlZU5vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIk5vIGZyZWUgbm9kZXMgZm91bmQgaW46IiArIGdyYXBoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghIGZyZWVOb2Rlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IHJ1bm5hYmxlcyA9IGNyZWF0ZVdvcmtlcnMoZnJlZU5vZGVzKTsKKyAgICAgICAgICBmb3IgKElXb3JrZXI8SVRlc3ROR01ldGhvZD4gciA6IHJ1bm5hYmxlcykgeworICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3JhcGguc2V0U3RhdHVzKGZyZWVOb2RlcywgU3RhdHVzLkZJTklTSEVEKTsKKyAgICAgICAgICBmcmVlTm9kZXMgPSBncmFwaC5nZXRGcmVlTm9kZXMoKTsKKyAgICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnJlZSBub2RlczoiICsgZnJlZU5vZGVzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQXBwbHkgdGhlIG1ldGhvZCBpbnRlcmNlcHRvciAoaWYgYXBwbGljYWJsZSkgdG8gdGhlIGxpc3Qgb2YgbWV0aG9kcy4KKyAgICovCisgIHByaXZhdGUgSVRlc3ROR01ldGhvZFtdIGludGVyY2VwdChJVGVzdE5HTWV0aG9kW10gbWV0aG9kcykgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RJbnN0YW5jZXMgPSBtZXRob2RzVG9NZXRob2RJbnN0YW5jZXMoQXJyYXlzLmFzTGlzdChtZXRob2RzKSk7CisKKyAgICAvLyBhZGQgYnVpbHQtaW4gaW50ZXJjZXB0b3IgKFByZXNlcnZlT3JkZXJNZXRob2RJbnRlcmNlcHRvciBvciBJbnN0YW5jZU9yZGVyaW5nTWV0aG9kSW50ZXJjZXB0b3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgIG1fbWV0aG9kSW50ZXJjZXB0b3JzLmFkZChidWlsdGluSW50ZXJjZXB0b3IpOworICAgIGZvciAoSU1ldGhvZEludGVyY2VwdG9yIG1fbWV0aG9kSW50ZXJjZXB0b3IgOiBtX21ldGhvZEludGVyY2VwdG9ycykgeworICAgICAgbWV0aG9kSW5zdGFuY2VzID0gbV9tZXRob2RJbnRlcmNlcHRvci5pbnRlcmNlcHQobWV0aG9kSW5zdGFuY2VzLCB0aGlzKTsKKyAgICB9CisKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIGltaSA6IG1ldGhvZEluc3RhbmNlcykgeworICAgICAgcmVzdWx0LmFkZChpbWkuZ2V0TWV0aG9kKCkpOworICAgIH0KKyAgICAKKyAgICAvL1NpbmNlIGFuIGludGVyY2VwdG9yIGlzIGludm9sdmVkLCB3ZSB3b3VsZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBDbGFzc01ldGhvZE1hcCBvYmplY3QgaXMgaW4gc3luYyB3aXRoIHRoZSAKKyAgICAvL291dHB1dCBvZiB0aGUgaW50ZXJjZXB0b3IsIGVsc2UgQEFmdGVyQ2xhc3MgZG9lc24ndCBnZXQgZXhlY3V0ZWQgYXQgYWxsIHdoZW4gaW50ZXJjZXB0b3JzIGFyZSBpbnZvbHZlZC4KKyAgICAvL3NvIGxldCdzIHVwZGF0ZSB0aGUgY3VycmVudCBjbGFzc01ldGhvZE1hcCBvYmplY3Qgd2l0aCB0aGUgbGlzdCBvZiBtZXRob2RzIG9idGFpbmVkIGZyb20gdGhlIGludGVyY2VwdG9yLgorICAgIHRoaXMubV9jbGFzc01ldGhvZE1hcCA9IG5ldyBDbGFzc01ldGhvZE1hcChyZXN1bHQsIG51bGwpOworICAgIAorICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFtyZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbGlzdCBvZiB3b3JrZXJzIHRvIHJ1biB0aGUgbWV0aG9kcyBwYXNzZWQgaW4gcGFyYW1ldGVyLgorICAgKiBFYWNoIHRlc3QgbWV0aG9kIGlzIHJ1biBpbiBpdHMgb3duIHdvcmtlciBleGNlcHQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKyAgICogLSBUaGUgbWV0aG9kIGJlbG9uZ3MgdG8gYSBjbGFzcyB0aGF0IGhhcyBAVGVzdChzZXF1ZW50aWFsPXRydWUpCisgICAqIC0gVGhlIHBhcmFsbGVsIGF0dHJpYnV0ZSBpcyBzZXQgdG8gImNsYXNzZXMiCisgICAqIEluIGJvdGggdGhlc2UgY2FzZXMsIGFsbCB0aGUgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhhdCBjbGFzcyB3aWxsIHRoZW4KKyAgICogYmUgcHV0IGluIHRoZSBzYW1lIHdvcmtlciBpbiBvcmRlciB0byBydW4gaW4gdGhlIHNhbWUgdGhyZWFkLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IGNyZWF0ZVdvcmtlcnMoTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzKSB7CisgICAgTGlzdDxJV29ya2VyPElUZXN0TkdNZXRob2Q+PiByZXN1bHQ7CisgICAgaWYgKFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5JTlNUQU5DRVMuZXF1YWxzKG1feG1sVGVzdC5nZXRQYXJhbGxlbCgpKSkgeworICAgICAgcmVzdWx0ID0gY3JlYXRlSW5zdGFuY2VCYXNlZFBhcmFsbGVsV29ya2VycyhtZXRob2RzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gY3JlYXRlQ2xhc3NCYXNlZFBhcmFsbGVsV29ya2VycyhtZXRob2RzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgd29ya2VycyBmb3IgcGFyYWxsZWw9ImNsYXNzZXMiIGFuZCBzaW1pbGFyIGNhc2VzLgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IGNyZWF0ZUNsYXNzQmFzZWRQYXJhbGxlbFdvcmtlcnMoTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzKSB7CisgICAgTGlzdDxJV29ya2VyPElUZXN0TkdNZXRob2Q+PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAvLyBNZXRob2RzIHRoYXQgYmVsb25nIHRvIGNsYXNzZXMgd2l0aCBhIHNlcXVlbnRpYWw9dHJ1ZSBvciBwYXJhbGxlbD1jbGFzc2VzCisgICAgLy8gYXR0cmlidXRlIG11c3QgYWxsIGJlIHJ1biBpbiB0aGUgc2FtZSB3b3JrZXIKKyAgICBTZXQ8Q2xhc3M+IHNlcXVlbnRpYWxDbGFzc2VzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICBDbGFzczw/IGV4dGVuZHMgSVRlc3RDbGFzcz4gY2xzID0gbS5nZXRSZWFsQ2xhc3MoKTsKKyAgICAgIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uIHRlc3QgPQorICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihjbHMsIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKworICAgICAgLy8gSWYgZWl0aGVyIHNlcXVlbnRpYWw9dHJ1ZSBvciBwYXJhbGxlbD1jbGFzc2VzLCBtYXJrIHRoaXMgY2xhc3Mgc2VxdWVudGlhbAorICAgICAgaWYgKHRlc3QgIT0gbnVsbCAmJiAodGVzdC5nZXRTZXF1ZW50aWFsKCkgfHwgdGVzdC5nZXRTaW5nbGVUaHJlYWRlZCgpKSB8fAorICAgICAgICAgIFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5DTEFTU0VTLmVxdWFscyhtX3htbFRlc3QuZ2V0UGFyYWxsZWwoKSkpIHsKKyAgICAgICAgc2VxdWVudGlhbENsYXNzZXMuYWRkKGNscyk7CisgICAgICB9CisgICAgfQorCisgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG1ldGhvZEluc3RhbmNlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSVRlc3ROR01ldGhvZCB0bSA6IG1ldGhvZHMpIHsKKyAgICAgIG1ldGhvZEluc3RhbmNlcy5hZGRBbGwobWV0aG9kc1RvTXVsdGlwbGVNZXRob2RJbnN0YW5jZXModG0pKTsKKyAgICB9CisKKworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbV94bWxUZXN0LmdldEFsbFBhcmFtZXRlcnMoKTsKKworICAgIFNldDxDbGFzczw/Pj4gcHJvY2Vzc2VkQ2xhc3NlcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIGltIDogbWV0aG9kSW5zdGFuY2VzKSB7CisgICAgICBDbGFzczw/PiBjID0gaW0uZ2V0TWV0aG9kKCkuZ2V0VGVzdENsYXNzKCkuZ2V0UmVhbENsYXNzKCk7CisgICAgICBpZiAoc2VxdWVudGlhbENsYXNzZXMuY29udGFpbnMoYykpIHsKKyAgICAgICAgaWYgKCFwcm9jZXNzZWRDbGFzc2VzLmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgcHJvY2Vzc2VkQ2xhc3Nlcy5hZGQoYyk7CisgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZXhwZXJpbWVudGFsIikgIT0gbnVsbCkgeworICAgICAgICAgICAgTGlzdDxMaXN0PElNZXRob2RJbnN0YW5jZT4+IGluc3RhbmNlcyA9IGNyZWF0ZUluc3RhbmNlcyhtZXRob2RJbnN0YW5jZXMpOworICAgICAgICAgICAgZm9yIChMaXN0PElNZXRob2RJbnN0YW5jZT4gaW5zdCA6IGluc3RhbmNlcykgeworICAgICAgICAgICAgICBUZXN0TWV0aG9kV29ya2VyIHdvcmtlciA9IGNyZWF0ZVRlc3RNZXRob2RXb3JrZXIoaW5zdCwgcGFyYW1zLCBjKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmFkZCh3b3JrZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNlcXVlbnRpYWwgY2xhc3M6IGFsbCBtZXRob2RzIGluIG9uZSB3b3JrZXIKKyAgICAgICAgICAgIFRlc3RNZXRob2RXb3JrZXIgd29ya2VyID0gY3JlYXRlVGVzdE1ldGhvZFdvcmtlcihtZXRob2RJbnN0YW5jZXMsIHBhcmFtcywgYyk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHdvcmtlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gUGFyYWxsZWwgY2xhc3M6IGVhY2ggbWV0aG9kIGluIGl0cyBvd24gd29ya2VyCisgICAgICAgIFRlc3RNZXRob2RXb3JrZXIgd29ya2VyID0gY3JlYXRlVGVzdE1ldGhvZFdvcmtlcihBcnJheXMuYXNMaXN0KGltKSwgcGFyYW1zLCBjKTsKKyAgICAgICAgcmVzdWx0LmFkZCh3b3JrZXIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFNvcnQgYnkgcHJpb3JpdGllcworICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKworICAvKioKKyAgICogQ3JlYXRlIHdvcmtlcnMgZm9yIHBhcmFsbGVsPSJpbnN0YW5jZXMiLgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+CisgICAgICBjcmVhdGVJbnN0YW5jZUJhc2VkUGFyYWxsZWxXb3JrZXJzKExpc3Q8SVRlc3ROR01ldGhvZD4gbWV0aG9kcykgeworICAgIExpc3Q8SVdvcmtlcjxJVGVzdE5HTWV0aG9kPj4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdE11bHRpTWFwPE9iamVjdCwgSVRlc3ROR01ldGhvZD4gbG1tID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgIGxtbS5wdXQobS5nZXRJbnN0YW5jZSgpLCBtKTsKKyAgICB9CisgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBMaXN0PElUZXN0TkdNZXRob2Q+PiBlcyA6IGxtbS5lbnRyeVNldCgpKSB7CisgICAgICBMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kSW5zdGFuY2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IGVzLmdldFZhbHVlKCkpIHsKKyAgICAgICAgbWV0aG9kSW5zdGFuY2VzLmFkZChuZXcgTWV0aG9kSW5zdGFuY2UobSkpOworICAgICAgfQorICAgICAgVGVzdE1ldGhvZFdvcmtlciB0bXcgPSBuZXcgVGVzdE1ldGhvZFdvcmtlcihtX2ludm9rZXIsCisgICAgICAgICAgbWV0aG9kSW5zdGFuY2VzLnRvQXJyYXkobmV3IElNZXRob2RJbnN0YW5jZVttZXRob2RJbnN0YW5jZXMuc2l6ZSgpXSksCisgICAgICAgICAgbV94bWxUZXN0LmdldFN1aXRlKCksCisgICAgICAgICAgbV94bWxUZXN0LmdldEFsbFBhcmFtZXRlcnMoKSwKKyAgICAgICAgICBtX2dyb3VwTWV0aG9kcywKKyAgICAgICAgICBtX2NsYXNzTWV0aG9kTWFwLAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbV9jbGFzc0xpc3RlbmVycyk7CisgICAgICByZXN1bHQuYWRkKHRtdyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxMaXN0PElNZXRob2RJbnN0YW5jZT4+IGNyZWF0ZUluc3RhbmNlcyhMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kSW5zdGFuY2VzKSB7CisgICAgTWFwPE9iamVjdCwgTGlzdDxJTWV0aG9kSW5zdGFuY2U+PiBtYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKy8vICAgIE1hcExpc3Q8SU1ldGhvZEluc3RhbmNlW10sIE9iamVjdD4gbWFwID0gbmV3IE1hcExpc3Q8SU1ldGhvZEluc3RhbmNlW10sIE9iamVjdD4oKTsKKyAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBpbWkgOiBtZXRob2RJbnN0YW5jZXMpIHsKKyAgICAgIGZvciAoT2JqZWN0IG8gOiBpbWkuZ2V0SW5zdGFuY2VzKCkpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8pOworICAgICAgICBMaXN0PElNZXRob2RJbnN0YW5jZT4gbCA9IG1hcC5nZXQobyk7CisgICAgICAgIGlmIChsID09IG51bGwpIHsKKyAgICAgICAgICBsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgbWFwLnB1dChvLCBsKTsKKyAgICAgICAgfQorICAgICAgICBsLmFkZChpbWkpOworICAgICAgfQorLy8gICAgICBmb3IgKE9iamVjdCBpbnN0YW5jZSA6IGltaS5nZXRJbnN0YW5jZXMoKSkgeworLy8gICAgICAgIG1hcC5wdXQoaW1pLCBpbnN0YW5jZSk7CisvLyAgICAgIH0KKyAgICB9CisvLyAgICByZXR1cm4gbWFwLmdldEtleXMoKTsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbihtYXApOworICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obWFwLnZhbHVlcygpKTsKKyAgfQorCisgIHByaXZhdGUgVGVzdE1ldGhvZFdvcmtlciBjcmVhdGVUZXN0TWV0aG9kV29ya2VyKAorICAgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG1ldGhvZEluc3RhbmNlcywgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsCisgICAgICBDbGFzczw/PiBjKSB7CisgICAgcmV0dXJuIG5ldyBUZXN0TWV0aG9kV29ya2VyKG1faW52b2tlciwKKyAgICAgICAgZmluZENsYXNzZXMobWV0aG9kSW5zdGFuY2VzLCBjKSwKKyAgICAgICAgbV94bWxUZXN0LmdldFN1aXRlKCksCisgICAgICAgIHBhcmFtcywKKyAgICAgICAgbV9ncm91cE1ldGhvZHMsCisgICAgICAgIG1fY2xhc3NNZXRob2RNYXAsCisgICAgICAgIHRoaXMsCisgICAgICAgIG1fY2xhc3NMaXN0ZW5lcnMpOworICB9CisKKyAgcHJpdmF0ZSBJTWV0aG9kSW5zdGFuY2VbXSBmaW5kQ2xhc3NlcyhMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kSW5zdGFuY2VzLCBDbGFzczw/PiBjKSB7CisgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG1pIDogbWV0aG9kSW5zdGFuY2VzKSB7CisgICAgICBpZiAobWkuZ2V0TWV0aG9kKCkuZ2V0VGVzdENsYXNzKCkuZ2V0UmVhbENsYXNzKCkgPT0gYykgeworICAgICAgICByZXN1bHQuYWRkKG1pKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBJTWV0aG9kSW5zdGFuY2VbcmVzdWx0LnNpemUoKV0pOworICB9CisKKyAgLyoqCisgICAqIEBAQCByZW1vdmUgdGhpcworICAgKi8KKyAgcHJpdmF0ZSBMaXN0PE1ldGhvZEluc3RhbmNlPiBtZXRob2RzVG9NdWx0aXBsZU1ldGhvZEluc3RhbmNlcyhJVGVzdE5HTWV0aG9kLi4uIHNsKSB7CisgICAgTGlzdDxNZXRob2RJbnN0YW5jZT4gdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogc2wpIHsKKyAgICAgIHZSZXN1bHQuYWRkKG5ldyBNZXRob2RJbnN0YW5jZShtKSk7CisgICAgfQorCisgICAgcmV0dXJuIHZSZXN1bHQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzVG9NZXRob2RJbnN0YW5jZXMoTGlzdDxJVGVzdE5HTWV0aG9kPiBzbCkgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBpVGVzdE5HTWV0aG9kIDogc2wpIHsKKyAgICAgICAgcmVzdWx0LmFkZChuZXcgTWV0aG9kSW5zdGFuY2UoaVRlc3ROR01ldGhvZCkpOworICAgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLworICAvLyBJbnZva2UgdGhlIHdvcmtlcnMKKyAgLy8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bVNldDxYbWxTdWl0ZS5QYXJhbGxlbE1vZGU+IFdPUktFUlNfUEFSQUxMRUxfTU9ERVMKKyAgICAgID0gRW51bVNldC5vZihYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuTUVUSE9EUywgWG1sU3VpdGUuUGFyYWxsZWxNb2RlLlRSVUUsCisgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUuUGFyYWxsZWxNb2RlLkNMQVNTRVMpOworICBwcml2YXRlIHZvaWQgcnVuSlVuaXRXb3JrZXJzKExpc3Q8PyBleHRlbmRzIElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IHdvcmtlcnMpIHsKKyAgICAgIC8vCisgICAgICAvLyBTZXF1ZW50aWFsIHJ1bgorICAgICAgLy8KKyAgICAgIGZvciAoSVdvcmtlcjxJVGVzdE5HTWV0aG9kPiB0bXcgOiB3b3JrZXJzKSB7CisgICAgICAgIHRtdy5ydW4oKTsKKyAgICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZnRlclJ1bigpIHsKKyAgICAvLyBpbnZva2UgQEFmdGVyVGVzdAorICAgIElUZXN0TkdNZXRob2RbXSB0ZXN0Q29uZmlndXJhdGlvbk1ldGhvZHM9IGdldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCk7CisgICAgaWYobnVsbCAhPSB0ZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMgJiYgdGVzdENvbmZpZ3VyYXRpb25NZXRob2RzLmxlbmd0aCA+IDApIHsKKyAgICAgIG1faW52b2tlci5pbnZva2VDb25maWd1cmF0aW9ucyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDb25maWd1cmF0aW9uTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbFRlc3QuZ2V0U3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbFRlc3QuZ2V0QWxsUGFyYW1ldGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8qIG5vIHBhcmFtZXRlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGluc3RhbmNlICovKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIExvZyB0aGUgZW5kIGRhdGUKKyAgICAvLworICAgIG1fZW5kRGF0ZSA9IG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICAgIGlmIChnZXRWZXJib3NlKCkgPj0gMykgeworICAgICAgZHVtcEludm9rZWRNZXRob2RzKCk7CisgICAgfQorCisgICAgLy8gSW52b2tlIGxpc3RlbmVycworICAgIGZpcmVFdmVudChmYWxzZSAvKnN0b3AqLyk7CisKKyAgICAvLyBTdGF0aXN0aWNzCisvLyAgICBsb2dSZXN1bHRzKCk7CisgIH0KKworICBwcml2YXRlIER5bmFtaWNHcmFwaDxJVGVzdE5HTWV0aG9kPiBjcmVhdGVEeW5hbWljR3JhcGgoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICBEeW5hbWljR3JhcGg8SVRlc3ROR01ldGhvZD4gcmVzdWx0ID0gbmV3IER5bmFtaWNHcmFwaDw+KCk7CisgICAgcmVzdWx0LnNldENvbXBhcmF0b3IobmV3IENvbXBhcmF0b3I8SVRlc3ROR01ldGhvZD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShJVGVzdE5HTWV0aG9kIG8xLCBJVGVzdE5HTWV0aG9kIG8yKSB7CisgICAgICAgIHJldHVybiBvMS5nZXRQcmlvcml0eSgpIC0gbzIuZ2V0UHJpb3JpdHkoKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIERlcGVuZGVuY3lNYXAgZGVwZW5kZW5jeU1hcCA9IG5ldyBEZXBlbmRlbmN5TWFwKG1ldGhvZHMpOworCisgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGhhdmUgZ3JvdXAgZGVwZW5kZW5jaWVzLiBJZiB3ZSBkbywgcHJlc2VydmUtb3JkZXIgbmVlZHMKKyAgICAvLyB0byBiZSBpZ25vcmVkIHNpbmNlIGdyb3VwIGRlcGVuZGVuY2llcyBjcmVhdGUgaW50ZXItY2xhc3MgZGVwZW5kZW5jaWVzIHdoaWNoIGNhbgorICAgIC8vIGVuZCB1cCBjcmVhdGluZyBjeWNsZXMgd2hlbiBjb21iaW5lZCB3aXRoIHByZXNlcnZlLW9yZGVyLgorICAgIGJvb2xlYW4gaGFzRGVwZW5kZW5jaWVzID0gZmFsc2U7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICByZXN1bHQuYWRkTm9kZShtKTsKKworICAgICAgLy8gRGVwZW5kZW50IG1ldGhvZHMKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nW10gZGVwZW5kZW50TWV0aG9kcyA9IG0uZ2V0TWV0aG9kc0RlcGVuZGVkVXBvbigpOworICAgICAgICBpZiAoZGVwZW5kZW50TWV0aG9kcyAhPSBudWxsKSB7CisgICAgICAgICAgZm9yIChTdHJpbmcgZCA6IGRlcGVuZGVudE1ldGhvZHMpIHsKKyAgICAgICAgICAgIElUZXN0TkdNZXRob2QgZG0gPSBkZXBlbmRlbmN5TWFwLmdldE1ldGhvZERlcGVuZGluZ09uKGQsIG0pOworICAgICAgICAgICAgaWYgKG0gIT0gZG0peworICAgICAgICAgICAgCXJlc3VsdC5hZGRFZGdlKG0sIGRtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gRGVwZW5kZW50IGdyb3VwcworICAgICAgeworICAgICAgICBTdHJpbmdbXSBkZXBlbmRlbnRHcm91cHMgPSBtLmdldEdyb3Vwc0RlcGVuZGVkVXBvbigpOworICAgICAgICBmb3IgKFN0cmluZyBkIDogZGVwZW5kZW50R3JvdXBzKSB7CisgICAgICAgICAgaGFzRGVwZW5kZW5jaWVzID0gdHJ1ZTsKKyAgICAgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGRnID0gZGVwZW5kZW5jeU1hcC5nZXRNZXRob2RzVGhhdEJlbG9uZ1RvKGQsIG0pOworICAgICAgICAgIGlmIChkZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJNZXRob2QgXCIiICsgbQorICAgICAgICAgICAgICAgICsgIlwiIGRlcGVuZHMgb24gbm9uZXhpc3RlbnQgZ3JvdXAgXCIiICsgZCArICJcIiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgZGRtIDogZGcpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFZGdlKG0sIGRkbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gUHJlc2VydmUgb3JkZXIKKyAgICAvLyBEb24ndCBwcmVzZXJ2ZSB0aGUgb3JkZXJpbmcgaWYgd2UncmUgcnVubmluZyBpbiBwYXJhbGxlbCwgb3RoZXJ3aXNlIHRoZSBzdWl0ZSB3aWxsCisgICAgLy8gY3JlYXRlIG11bHRpcGxlIHRocmVhZHMgYnV0IHRoZXNlIHRocmVhZHMgd2lsbCBiZSBjcmVhdGVkIG9uZSBhZnRlciB0aGUgb3RoZXIsCisgICAgLy8gZ2l2aW5nIHRoZSBpbXByZXNzaW9uIG9mIHBhcmFsbGVsaXNtIChtdWx0aXBsZSB0aHJlYWQgaWQncykgd2hpbGUgc3RpbGwgcnVubmluZworICAgIC8vIHNlcXVlbnRpYWxseS4KKyAgICBpZiAoISBoYXNEZXBlbmRlbmNpZXMKKyAgICAgICAgJiYgZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXRQYXJhbGxlbCgpID09IFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5GQUxTRQorICAgICAgICAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRDdXJyZW50WG1sVGVzdCgpLmdldFByZXNlcnZlT3JkZXIoKSkpIHsKKyAgICAgIC8vIElmIHByZXNlcnZlLW9yZGVyIHdhcyBzcGVjaWZpZWQgYW5kIHRoZSBjbGFzcyBvcmRlciBpcyBBLCBCCisgICAgICAvLyBjcmVhdGUgYSBuZXcgc2V0IG9mIGRlcGVuZGVuY2llcyB3aGVyZSBlYWNoIG1ldGhvZCBvZiBCIGRlcGVuZHMKKyAgICAgIC8vIG9uIGFsbCB0aGUgbWV0aG9kcyBvZiBBCisgICAgICBMaXN0TXVsdGlNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gY2xhc3NEZXBlbmRlbmNpZXMKKyAgICAgICAgICA9IGNyZWF0ZUNsYXNzRGVwZW5kZW5jaWVzKG1ldGhvZHMsIGdldEN1cnJlbnRYbWxUZXN0KCkpOworCisgICAgICBmb3IgKE1hcC5FbnRyeTxJVGVzdE5HTWV0aG9kLCBMaXN0PElUZXN0TkdNZXRob2Q+PiBlcyA6IGNsYXNzRGVwZW5kZW5jaWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIGRtIDogZXMuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIHJlc3VsdC5hZGRFZGdlKGRtLCBlcy5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHcm91cCBieSBpbnN0YW5jZXMKKyAgICBpZiAoZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXRHcm91cEJ5SW5zdGFuY2VzKCkpIHsKKyAgICAgIExpc3RNdWx0aU1hcDxJVGVzdE5HTWV0aG9kLCBJVGVzdE5HTWV0aG9kPiBpbnN0YW5jZURlcGVuZGVuY2llcworICAgICAgICAgID0gY3JlYXRlSW5zdGFuY2VEZXBlbmRlbmNpZXMobWV0aG9kcywgZ2V0Q3VycmVudFhtbFRlc3QoKSk7CisKKyAgICAgIGZvciAoTWFwLkVudHJ5PElUZXN0TkdNZXRob2QsIExpc3Q8SVRlc3ROR01ldGhvZD4+IGVzIDogaW5zdGFuY2VEZXBlbmRlbmNpZXMuZW50cnlTZXQoKSkgeworICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgZG0gOiBlcy5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgcmVzdWx0LmFkZEVkZ2UoZG0sIGVzLmdldEtleSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgTGlzdE11bHRpTWFwPElUZXN0TkdNZXRob2QsIElUZXN0TkdNZXRob2Q+IGNyZWF0ZUluc3RhbmNlRGVwZW5kZW5jaWVzKAorICAgICAgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsIFhtbFRlc3QgY3VycmVudFhtbFRlc3QpCisgIHsKKyAgICBMaXN0TXVsdGlNYXA8T2JqZWN0LCBJVGVzdE5HTWV0aG9kPiBpbnN0YW5jZU1hcCA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICBpbnN0YW5jZU1hcC5wdXQobS5nZXRJbnN0YW5jZSgpLCBtKTsKKyAgICB9CisKKyAgICBMaXN0TXVsdGlNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gcmVzdWx0ID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgICBPYmplY3QgcHJldmlvdXNJbnN0YW5jZSA9IG51bGw7CisgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBMaXN0PElUZXN0TkdNZXRob2Q+PiBlcyA6IGluc3RhbmNlTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIGlmIChwcmV2aW91c0luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGVzLmdldEtleSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBwcmV2aW91c01ldGhvZHMgPSBpbnN0YW5jZU1hcC5nZXQocHJldmlvdXNJbnN0YW5jZSk7CisgICAgICAgIE9iamVjdCBjdXJyZW50SW5zdGFuY2UgPSBlcy5nZXRLZXkoKTsKKyAgICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBjdXJyZW50TWV0aG9kcyA9IGluc3RhbmNlTWFwLmdldChjdXJyZW50SW5zdGFuY2UpOworICAgICAgICAvLyBNYWtlIGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBjdXJyZW50IGluc3RhbmNlIGRlcGVuZCBvbiB0aGUgbWV0aG9kcyBvZgorICAgICAgICAvLyB0aGUgcHJldmlvdXMgaW5zdGFuY2UKKyAgICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIGNtIDogY3VycmVudE1ldGhvZHMpIHsKKyAgICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgcG0gOiBwcmV2aW91c01ldGhvZHMpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQoY20sIHBtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gY3JlYXRlQ2xhc3NEZXBlbmRlbmNpZXMoCisgICAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywgWG1sVGVzdCB0ZXN0KQorICB7CisgICAgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gY2xhc3NlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8vIE5vdGU6IHVzZSBhIExpc3QgaGVyZSB0byBwcmVzZXJ2ZSB0aGUgb3JkZXJpbmcgYnV0IG1ha2Ugc3VyZQorICAgIC8vIHdlIGRvbid0IGFkZCB0aGUgc2FtZSBjbGFzcyB0d2ljZQorICAgIExpc3Q8WG1sQ2xhc3M+IHNvcnRlZENsYXNzZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGZvciAoWG1sQ2xhc3MgYyA6IHRlc3QuZ2V0WG1sQ2xhc3NlcygpKSB7CisgICAgICBjbGFzc2VzLnB1dChjLmdldE5hbWUoKSwgbmV3IEFycmF5TGlzdDxJVGVzdE5HTWV0aG9kPigpKTsKKyAgICAgIGlmICghIHNvcnRlZENsYXNzZXMuY29udGFpbnMoYykpIHNvcnRlZENsYXNzZXMuYWRkKGMpOworICAgIH0KKworICAgIC8vIFNvcnQgdGhlIGNsYXNzZXMgYmFzZWQgb24gdGhlaXIgb3JkZXIgb2YgYXBwZWFyYW5jZSBpbiB0aGUgWE1MCisgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRDbGFzc2VzLCBuZXcgQ29tcGFyYXRvcjxYbWxDbGFzcz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShYbWxDbGFzcyBhcmcwLCBYbWxDbGFzcyBhcmcxKSB7CisgICAgICAgIHJldHVybiBhcmcwLmdldEluZGV4KCkgLSBhcmcxLmdldEluZGV4KCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbmRleGVkQ2xhc3NlczEgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiBpbmRleGVkQ2xhc3NlczIgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChYbWxDbGFzcyBjIDogc29ydGVkQ2xhc3NlcykgeworICAgICAgaW5kZXhlZENsYXNzZXMxLnB1dChjLmdldE5hbWUoKSwgaSk7CisgICAgICBpbmRleGVkQ2xhc3NlczIucHV0KGksIGMuZ2V0TmFtZSgpKTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICBMaXN0TXVsdGlNYXA8U3RyaW5nLCBJVGVzdE5HTWV0aG9kPiBtZXRob2RzRnJvbUNsYXNzID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgIG1ldGhvZHNGcm9tQ2xhc3MucHV0KG0uZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpLCBtKTsKKyAgICB9CisKKyAgICBMaXN0TXVsdGlNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gcmVzdWx0ID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gbS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICBJbnRlZ2VyIGluZGV4ID0gaW5kZXhlZENsYXNzZXMxLmdldChuYW1lKTsKKyAgICAgIC8vIFRoZSBpbmRleCBjb3VsZCBiZSBudWxsIGlmIHRoZSBjbGFzc2VzIGxpc3RlZCBpbiB0aGUgWE1MIGFyZSBkaWZmZXJlbnQKKyAgICAgIC8vIGZyb20gdGhlIG1ldGhvZHMgYmVpbmcgcnVuIChlLmcuIHRoZSAueG1sIG9ubHkgY29udGFpbnMgYSBmYWN0b3J5IHRoYXQKKyAgICAgIC8vIGluc3RhbnRpYXRlcyBtZXRob2RzIGZyb20gYSBkaWZmZXJlbnQgY2xhc3MpLiBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdAorICAgICAgLy8gcGVyZm9ybSBhbnkgb3JkZXJpbmcuCisgICAgICBpZiAoaW5kZXggIT0gbnVsbCAmJiBpbmRleCA+IDApIHsKKyAgICAgICAgLy8gTWFrZSB0aGlzIG1ldGhvZCBkZXBlbmQgb24gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyBpbiB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgU3RyaW5nIGNsYXNzRGVwZW5kZWRVcG9uID0gaW5kZXhlZENsYXNzZXMyLmdldChpbmRleCAtIDEpOworICAgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHNEZXBlbmRlZFVwb24gPSBtZXRob2RzRnJvbUNsYXNzLmdldChjbGFzc0RlcGVuZGVkVXBvbik7CisgICAgICAgIGlmIChtZXRob2RzRGVwZW5kZWRVcG9uICE9IG51bGwpIHsKKyAgICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgbWR1IDogbWV0aG9kc0RlcGVuZGVkVXBvbikgeworICAgICAgICAgICAgcmVzdWx0LnB1dChtZHUsIG0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogTG9ncyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB7QGxpbmsgI2JlZm9yZVJ1bigpfSAuCisgICAqLworICBwcml2YXRlIHZvaWQgbG9nU3RhcnQoKSB7CisgICAgbG9nKDMsCisgICAgICAgICJSdW5uaW5nIHRlc3QgIiArIG1fdGVzdE5hbWUgKyAiIG9uICIgKyBtX2NsYXNzTWFwLnNpemUoKSArICIgIiArICIgY2xhc3NlcywgIgorICAgICAgICArICIgaW5jbHVkZWQgZ3JvdXBzOlsiICsgbWFwVG9TdHJpbmcobV94bWxNZXRob2RTZWxlY3Rvci5nZXRJbmNsdWRlZEdyb3VwcygpKQorICAgICAgICArICJdIGV4Y2x1ZGVkIGdyb3VwczpbIiArIG1hcFRvU3RyaW5nKG1feG1sTWV0aG9kU2VsZWN0b3IuZ2V0RXhjbHVkZWRHcm91cHMoKSkgKyAiXSIpOworCisgICAgaWYgKGdldFZlcmJvc2UoKSA+PSAzKSB7CisgICAgICBmb3IgKElUZXN0Q2xhc3MgdGMgOiBtX2NsYXNzTWFwLnZhbHVlcygpKSB7CisgICAgICAgICgoVGVzdENsYXNzKSB0YykuZHVtcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUcmlnZ2VyIHRoZSBzdGFydC9maW5pc2ggZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBpc1N0YXJ0IDx0dD50cnVlPC90dD4gaWYgdGhlIGV2ZW50IGlzIGZvciBzdGFydCwgPHR0PmZhbHNlPC90dD4gaWYgdGhlCisgICAqICAgICAgICAgICAgICAgIGV2ZW50IGlzIGZvciBmaW5pc2gKKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlRXZlbnQoYm9vbGVhbiBpc1N0YXJ0KSB7CisgICAgZm9yIChJVGVzdExpc3RlbmVyIGl0bCA6IG1fdGVzdExpc3RlbmVycykgeworICAgICAgaWYgKGlzU3RhcnQpIHsKKyAgICAgICAgaXRsLm9uU3RhcnQodGhpcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaXRsLm9uRmluaXNoKHRoaXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLy8vCisgIC8vIElUZXN0Q29udGV4dAorICAvLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX3Rlc3ROYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnREYXRlLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRlIGdldFN0YXJ0RGF0ZSgpIHsKKyAgICByZXR1cm4gbV9zdGFydERhdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmREYXRlLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRlIGdldEVuZERhdGUoKSB7CisgICAgcmV0dXJuIG1fZW5kRGF0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVJlc3VsdE1hcCBnZXRQYXNzZWRUZXN0cygpIHsKKyAgICByZXR1cm4gbV9wYXNzZWRUZXN0czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVJlc3VsdE1hcCBnZXRTa2lwcGVkVGVzdHMoKSB7CisgICAgcmV0dXJuIG1fc2tpcHBlZFRlc3RzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJUmVzdWx0TWFwIGdldEZhaWxlZFRlc3RzKCkgeworICAgIHJldHVybiBtX2ZhaWxlZFRlc3RzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJUmVzdWx0TWFwIGdldEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMoKSB7CisgICAgcmV0dXJuIG1fZmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWRHcm91cHMoKSB7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpZz0gbV94bWxNZXRob2RTZWxlY3Rvci5nZXRJbmNsdWRlZEdyb3VwcygpOworICAgIFN0cmluZ1tdIHJlc3VsdD0gaWcudmFsdWVzKCkudG9BcnJheSgobmV3IFN0cmluZ1tpZy5zaXplKCldKSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZEdyb3VwcygpIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVnPSBtX3htbE1ldGhvZFNlbGVjdG9yLmdldEV4Y2x1ZGVkR3JvdXBzKCk7CisgICAgU3RyaW5nW10gcmVzdWx0PSBlZy52YWx1ZXMoKS50b0FycmF5KChuZXcgU3RyaW5nW2VnLnNpemUoKV0pKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIG1fb3V0cHV0RGlyZWN0b3J5OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3VpdGUuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIElTdWl0ZSBnZXRTdWl0ZSgpIHsKKyAgICByZXR1cm4gbV9zdWl0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFsbFRlc3RNZXRob2RzKCkgeworICAgIHJldHVybiBtX2FsbFRlc3RNZXRob2RzOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgIHJldHVybiBtX2hvc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gZ2V0RXhjbHVkZWRNZXRob2RzKCkgeworICAgIE1hcDxJVGVzdE5HTWV0aG9kLCBJVGVzdE5HTWV0aG9kPiB2UmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1fZXhjbHVkZWRNZXRob2RzKSB7CisgICAgICB2UmVzdWx0LnB1dChtLCBtKTsKKyAgICB9CisKKyAgICByZXR1cm4gdlJlc3VsdC5rZXlTZXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0I2dldEZhaWxlZENvbmZpZ3VyYXRpb25zKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVJlc3VsdE1hcCBnZXRGYWlsZWRDb25maWd1cmF0aW9ucygpIHsKKyAgICByZXR1cm4gbV9mYWlsZWRDb25maWd1cmF0aW9uczsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0I2dldFBhc3NlZENvbmZpZ3VyYXRpb25zKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVJlc3VsdE1hcCBnZXRQYXNzZWRDb25maWd1cmF0aW9ucygpIHsKKyAgICByZXR1cm4gbV9wYXNzZWRDb25maWd1cmF0aW9uczsKKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0I2dldFNraXBwZWRDb25maWd1cmF0aW9ucygpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIElSZXN1bHRNYXAgZ2V0U2tpcHBlZENvbmZpZ3VyYXRpb25zKCkgeworICAgIHJldHVybiBtX3NraXBwZWRDb25maWd1cmF0aW9uczsKKyAgfQorCisgIC8vCisgIC8vIElUZXN0Q29udGV4dAorICAvLy8vLworCisgIC8vLy8vCisgIC8vIElUZXN0UmVzdWx0Tm90aWZpZXIKKyAgLy8KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkUGFzc2VkVGVzdChJVGVzdE5HTWV0aG9kIHRtLCBJVGVzdFJlc3VsdCB0cikgeworICAgIG1fcGFzc2VkVGVzdHMuYWRkUmVzdWx0KHRyLCB0bSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxJVGVzdFJlc3VsdD4gZ2V0UGFzc2VkVGVzdHMoSVRlc3ROR01ldGhvZCB0bSkgeworICAgIHJldHVybiBtX3Bhc3NlZFRlc3RzLmdldFJlc3VsdHModG0pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8SVRlc3RSZXN1bHQ+IGdldEZhaWxlZFRlc3RzKElUZXN0TkdNZXRob2QgdG0pIHsKKyAgICByZXR1cm4gbV9mYWlsZWRUZXN0cy5nZXRSZXN1bHRzKHRtKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PElUZXN0UmVzdWx0PiBnZXRTa2lwcGVkVGVzdHMoSVRlc3ROR01ldGhvZCB0bSkgeworICAgIHJldHVybiBtX3NraXBwZWRUZXN0cy5nZXRSZXN1bHRzKHRtKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRTa2lwcGVkVGVzdChJVGVzdE5HTWV0aG9kIHRtLCBJVGVzdFJlc3VsdCB0cikgeworICAgIG1fc2tpcHBlZFRlc3RzLmFkZFJlc3VsdCh0ciwgdG0pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEludm9rZWRNZXRob2QoSW52b2tlZE1ldGhvZCBpbSkgeworICAgIHN5bmNocm9uaXplZChtX2ludm9rZWRNZXRob2RzKSB7CisgICAgICBtX2ludm9rZWRNZXRob2RzLmFkZChpbSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEZhaWxlZFRlc3QoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLCBJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICBsb2dGYWlsZWRUZXN0KHRlc3RNZXRob2QsIHJlc3VsdCwgZmFsc2UgLyogd2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UgKi8pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdChJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICBsb2dGYWlsZWRUZXN0KHRlc3RNZXRob2QsIHJlc3VsdCwgdHJ1ZSAvKiB3aXRoaW5TdWNjZXNzUGVyY2VudGFnZSAqLyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFhtbFRlc3QgZ2V0VGVzdCgpIHsKKyAgICByZXR1cm4gbV94bWxUZXN0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElUZXN0TGlzdGVuZXI+IGdldFRlc3RMaXN0ZW5lcnMoKSB7CisgICAgcmV0dXJuIG1fdGVzdExpc3RlbmVyczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJQ29uZmlndXJhdGlvbkxpc3RlbmVyPiBnZXRDb25maWd1cmF0aW9uTGlzdGVuZXJzKCkgeworICAgIHJldHVybiBMaXN0cy48SUNvbmZpZ3VyYXRpb25MaXN0ZW5lcj5uZXdBcnJheUxpc3QobV9jb25maWd1cmF0aW9uTGlzdGVuZXJzKTsKKyAgfQorICAvLworICAvLyBJVGVzdFJlc3VsdE5vdGlmaWVyCisgIC8vLy8vCisKKyAgcHJpdmF0ZSB2b2lkIGxvZ0ZhaWxlZFRlc3QoSVRlc3ROR01ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0UmVzdWx0IHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKSB7CisgICAgLyoKKyAgICAgKiBXZSBzaG91bGQgbm90IHJlbW92ZSBhIHBhc3NlZCBtZXRob2QgZnJvbSBtX3Bhc3NlZFRlc3RzIHNvIHRoYXQgd2UgY2FuCisgICAgICogYWNjb3VudCBmb3IgdGhlIHBhc3NlZCBpbnN0YW5jZXMgb2YgdGhpcyB0ZXN0IG1ldGhvZC4KKyAgICAgKi8KKyAgICAvL21fcGFzc2VkVGVzdHMucmVtb3ZlUmVzdWx0KG1ldGhvZCk7CisgICAgaWYgKHdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKSB7CisgICAgICBtX2ZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMuYWRkUmVzdWx0KHRyLCBtZXRob2QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fZmFpbGVkVGVzdHMuYWRkUmVzdWx0KHRyLCBtZXRob2QpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIG1hcFRvU3RyaW5nKE1hcDw/LCA/PiBtKSB7CisgICAgU3RyaW5nQnVmZmVyIHJlc3VsdD0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoT2JqZWN0IG8gOiBtLnZhbHVlcygpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKG8udG9TdHJpbmcoKSkuYXBwZW5kKCIgIik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBzKSB7CisgICAgVXRpbHMubG9nKCJUZXN0UnVubmVyIiwgbGV2ZWwsIHMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VmVyYm9zZSgpIHsKKyAgICByZXR1cm4gbV92ZXJib3NlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShpbnQgbikgeworICAgIG1fdmVyYm9zZSA9IG47CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgVXRpbHMubG9nKCJUZXN0UnVubmVyIiwgMiwgcyk7CisgIH0KKworICAvLy8vLworICAvLyBMaXN0ZW5lcnMKKyAgLy8KKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7CisgICAgaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBJVGVzdExpc3RlbmVyKSB7CisgICAgICBhZGRUZXN0TGlzdGVuZXIoKElUZXN0TGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICB9CisgICAgaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyKSB7CisgICAgICBhZGRDb25maWd1cmF0aW9uTGlzdGVuZXIoKElDb25maWd1cmF0aW9uTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICB9CisgICAgaWYobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ2xhc3NMaXN0ZW5lcikgeworICAgICAgYWRkQ2xhc3NMaXN0ZW5lcigoSUNsYXNzTGlzdGVuZXIpIGxpc3RlbmVyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRUZXN0TGlzdGVuZXIoSVRlc3RMaXN0ZW5lciBpbCkgeworICAgIG1fdGVzdExpc3RlbmVycy5hZGQoaWwpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkQ2xhc3NMaXN0ZW5lcihJQ2xhc3NMaXN0ZW5lciBjbCkgeworICAgIG1fY2xhc3NMaXN0ZW5lcnMuYWRkKGNsKTsKKyAgfQorCisgIHZvaWQgYWRkQ29uZmlndXJhdGlvbkxpc3RlbmVyKElDb25maWd1cmF0aW9uTGlzdGVuZXIgaWNsKSB7CisgICAgbV9jb25maWd1cmF0aW9uTGlzdGVuZXJzLmFkZChpY2wpOworICB9CisgIC8vCisgIC8vIExpc3RlbmVycworICAvLy8vLworCisgIHByaXZhdGUgZmluYWwgTGlzdDxJbnZva2VkTWV0aG9kPiBtX2ludm9rZWRNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHJpdmF0ZSB2b2lkIGR1bXBJbnZva2VkTWV0aG9kcygpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09IEludm9rZWQgbWV0aG9kcyIpOworICAgIGZvciAoSUludm9rZWRNZXRob2QgaW0gOiBtX2ludm9rZWRNZXRob2RzKSB7CisgICAgICBpZiAoaW0uaXNUZXN0TWV0aG9kKCkpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAgICIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaW0uaXNDb25maWd1cmF0aW9uTWV0aG9kKCkpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIiArIGltKTsKKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PSIpOworICB9CisKKyAgcHVibGljIExpc3Q8SVRlc3ROR01ldGhvZD4gZ2V0SW52b2tlZE1ldGhvZHMoKSB7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiByZXN1bHQ9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHN5bmNocm9uaXplZChtX2ludm9rZWRNZXRob2RzKSB7CisgICAgICBmb3IgKElJbnZva2VkTWV0aG9kIGltIDogbV9pbnZva2VkTWV0aG9kcykgeworICAgICAgICBJVGVzdE5HTWV0aG9kIHRtPSBpbS5nZXRUZXN0TWV0aG9kKCk7CisgICAgICAgIHRtLnNldERhdGUoaW0uZ2V0RGF0ZSgpKTsKKyAgICAgICAgcmVzdWx0LmFkZCh0bSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgSVJlc3VsdE1hcCBtX3Bhc3NlZENvbmZpZ3VyYXRpb25zPSBuZXcgUmVzdWx0TWFwKCk7CisgIHByaXZhdGUgSVJlc3VsdE1hcCBtX3NraXBwZWRDb25maWd1cmF0aW9ucz0gbmV3IFJlc3VsdE1hcCgpOworICBwcml2YXRlIElSZXN1bHRNYXAgbV9mYWlsZWRDb25maWd1cmF0aW9ucz0gbmV3IFJlc3VsdE1hcCgpOworCisgIHByaXZhdGUgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb24oSVRlc3RSZXN1bHQgdHIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25GYWlsdXJlKElUZXN0UmVzdWx0IGl0cikgeworICAgICAgbV9mYWlsZWRDb25maWd1cmF0aW9ucy5hZGRSZXN1bHQoaXRyLCBpdHIuZ2V0TWV0aG9kKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblNraXAoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgICBtX3NraXBwZWRDb25maWd1cmF0aW9ucy5hZGRSZXN1bHQoaXRyLCBpdHIuZ2V0TWV0aG9kKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblN1Y2Nlc3MoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgICBtX3Bhc3NlZENvbmZpZ3VyYXRpb25zLmFkZFJlc3VsdChpdHIsIGl0ci5nZXRNZXRob2QoKSk7CisgICAgfQorICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgc2V0TWV0aG9kSW50ZXJjZXB0b3IoSU1ldGhvZEludGVyY2VwdG9yIG1ldGhvZEludGVyY2VwdG9yKXsKKyAgICBtX21ldGhvZEludGVyY2VwdG9ycy5hZGQobWV0aG9kSW50ZXJjZXB0b3IpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkTWV0aG9kSW50ZXJjZXB0b3IoSU1ldGhvZEludGVyY2VwdG9yIG1ldGhvZEludGVyY2VwdG9yKXsKKyAgICBtX21ldGhvZEludGVyY2VwdG9ycy5hZGQobWV0aG9kSW50ZXJjZXB0b3IpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBYbWxUZXN0IGdldEN1cnJlbnRYbWxUZXN0KCkgeworICAgIHJldHVybiBtX3htbFRlc3Q7CisgIH0KKworICBwcml2YXRlIElBdHRyaWJ1dGVzIG1fYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGUobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICBtX2F0dHJpYnV0ZXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVOYW1lcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgIH0KKworICBwcml2YXRlIExpc3RNdWx0aU1hcDxDbGFzczw/IGV4dGVuZHMgTW9kdWxlPiwgTW9kdWxlPiBtX2d1aWNlTW9kdWxlcyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PE1vZHVsZT4gZ2V0R3VpY2VNb2R1bGVzKENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IGNscykgeworICAgIExpc3Q8TW9kdWxlPiByZXN1bHQgPSBtX2d1aWNlTW9kdWxlcy5nZXQoY2xzKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZEd1aWNlTW9kdWxlKENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IGNscywgTW9kdWxlIG1vZHVsZSkgeworICAgIG1fZ3VpY2VNb2R1bGVzLnB1dChjbHMsIG1vZHVsZSk7CisgIH0KKworICBwcml2YXRlIE1hcDxMaXN0PE1vZHVsZT4sIEluamVjdG9yPiBtX2luamVjdG9ycyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoTGlzdDxNb2R1bGU+IG1vZHVsZUluc3RhbmNlcykgeworICAgIHJldHVybiBtX2luamVjdG9ycyAuZ2V0KG1vZHVsZUluc3RhbmNlcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKElDbGFzcyBpQ2xhc3MpIHsKKyAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRBbm5vdGF0aW9uU3VwZXJDbGFzc2VzKEd1aWNlLmNsYXNzLCBpQ2xhc3MuZ2V0UmVhbENsYXNzKCkpOworICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHJldHVybiBudWxsOworICAgIGlmIChpQ2xhc3MgaW5zdGFuY2VvZiBUZXN0Q2xhc3MpIHsKKyAgICAgIGlDbGFzcyA9ICgoVGVzdENsYXNzKWlDbGFzcykuZ2V0SUNsYXNzKCk7CisgICAgfQorICAgIGlmICghKGlDbGFzcyBpbnN0YW5jZW9mIENsYXNzSW1wbCkpIHJldHVybiBudWxsOworICAgIEluamVjdG9yIHBhcmVudEluamVjdG9yID0gKChDbGFzc0ltcGwpaUNsYXNzKS5nZXRQYXJlbnRJbmplY3RvcigpOworCisgICAgR3VpY2UgZ3VpY2UgPSAoR3VpY2UpIGFubm90YXRpb247CisgICAgTGlzdDxNb2R1bGU+IG1vZHVsZUluc3RhbmNlcyA9IExpc3RzLm5ld0FycmF5TGlzdChnZXRNb2R1bGVzKGd1aWNlLCBwYXJlbnRJbmplY3RvciwgaUNsYXNzLmdldFJlYWxDbGFzcygpKSk7CisKKyAgICAvLyBSZXVzZSB0aGUgcHJldmlvdXMgaW5qZWN0b3IsIGlmIGFueQorICAgIEluamVjdG9yIGluamVjdG9yID0gZ2V0SW5qZWN0b3IobW9kdWxlSW5zdGFuY2VzKTsKKyAgICBpZiAoaW5qZWN0b3IgPT0gbnVsbCkgeworICAgICAgaW5qZWN0b3IgPSBwYXJlbnRJbmplY3Rvci5jcmVhdGVDaGlsZEluamVjdG9yKG1vZHVsZUluc3RhbmNlcyk7CisgICAgICBhZGRJbmplY3Rvcihtb2R1bGVJbnN0YW5jZXMsIGluamVjdG9yKTsKKyAgICB9CisgICAgcmV0dXJuIGluamVjdG9yOworICB9CisKKyAgcHJpdmF0ZSBNb2R1bGVbXSBnZXRNb2R1bGVzKEd1aWNlIGd1aWNlLCBJbmplY3RvciBwYXJlbnRJbmplY3RvciwgQ2xhc3M8Pz4gdGVzdENsYXNzKSB7CisgICAgTGlzdDxNb2R1bGU+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gbW9kdWxlQ2xhc3MgOiBndWljZS5tb2R1bGVzKCkpIHsKKyAgICAgIExpc3Q8TW9kdWxlPiBtb2R1bGVzID0gZ2V0R3VpY2VNb2R1bGVzKG1vZHVsZUNsYXNzKTsKKyAgICAgIGlmIChtb2R1bGVzICE9IG51bGwgJiYgbW9kdWxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgIHJlc3VsdC5hZGRBbGwobW9kdWxlcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBNb2R1bGUgaW5zdGFuY2UgPSBwYXJlbnRJbmplY3Rvci5nZXRJbnN0YW5jZShtb2R1bGVDbGFzcyk7CisgICAgICAgIHJlc3VsdC5hZGQoaW5zdGFuY2UpOworICAgICAgICBhZGRHdWljZU1vZHVsZShtb2R1bGVDbGFzcywgaW5zdGFuY2UpOworICAgICAgfQorICAgIH0KKyAgICBDbGFzczw/IGV4dGVuZHMgSU1vZHVsZUZhY3Rvcnk+IGZhY3RvcnkgPSBndWljZS5tb2R1bGVGYWN0b3J5KCk7CisgICAgaWYgKGZhY3RvcnkgIT0gSU1vZHVsZUZhY3RvcnkuY2xhc3MpIHsKKyAgICAgIElNb2R1bGVGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IHBhcmVudEluamVjdG9yLmdldEluc3RhbmNlKGZhY3RvcnkpOworICAgICAgTW9kdWxlIG1vZHVsZUNsYXNzID0gZmFjdG9yeUluc3RhbmNlLmNyZWF0ZU1vZHVsZSh0aGlzLCB0ZXN0Q2xhc3MpOworICAgICAgaWYgKG1vZHVsZUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgcmVzdWx0LmFkZChtb2R1bGVDbGFzcyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBNb2R1bGVbcmVzdWx0LnNpemUoKV0pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEluamVjdG9yKExpc3Q8TW9kdWxlPiBtb2R1bGVJbnN0YW5jZXMsIEluamVjdG9yIGluamVjdG9yKSB7CisgICAgbV9pbmplY3RvcnMucHV0KG1vZHVsZUluc3RhbmNlcywgaW5qZWN0b3IpOworICB9CisKK30gLy8gVGVzdFJ1bm5lcgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1RpbWVCb21iU2tpcEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL1RpbWVCb21iU2tpcEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3NzcyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvVGltZUJvbWJTa2lwRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMzUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZzsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIEEge0BsaW5rIFNraXBFeGNlcHRpb259IGV4dGVuc2lvbiB0aGF0IHRyYW5zZm9ybXMgYSBza2lwcGVkIG1ldGhvZAorICogaW50byBhIGZhaWxlZCBtZXRob2QgYmFzZWQgb24gYSB0aW1lIHRyaWdnZXIuCisgKiA8cC8+CisgKiBCeSBkZWZhdWx0IHRoZSB0aW1lIGZvcm1hdCBpcyB5eXl5L01NL2RkIChhY2NvcmRpbmcgdG8ge0Bjb2RlIFNpbXBsZURhdGVGb3JtYXR9KS4KKyAqIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnkgdXNpbmcgdGhlIHNwZWNpYWxpemVkIGNvbnN0cnVjdG9ycy4gU3VwcHBvcnRlZCBkYXRlCisgKiBmb3JtYXRzIGFyZSBhY2NvcmRpbmcgdG8gdGhlIHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0fS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVbZG90XW1pbmRzdG9ybVthdF1nbWFpbFtkb3RdY29tJz5BbGV4IFBvcGVzY3U8L2E+CisgKiBAc2luY2UgNS42CisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lQm9tYlNraXBFeGNlcHRpb24gZXh0ZW5kcyBTa2lwRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1OTk4MjE0Nzg4MzQwNDg1MzdMOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IFNERj0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQiKTsKKyAgcHJpdmF0ZSBDYWxlbmRhciBtX2V4cGlyZURhdGU7CisgIHByaXZhdGUgRGF0ZUZvcm1hdCBtX2luRm9ybWF0PSBTREY7CisgIHByaXZhdGUgRGF0ZUZvcm1hdCBtX291dEZvcm1hdD0gU0RGOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0Bjb2RlIFRpbWVCb21iZWRTa2lwRXhjZXB0aW9ufSB1c2luZyB0aGUgPHR0PmV4cGlyYXRpb25EYXRlPC90dD4uCisgICAqIFRoZSBmb3JtYXQgdXNlZCBmb3IgZGF0ZSBjb21wYXJpc29uIGlzIDx0dD55eXl5L01NL2RkPC90dD4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZXhwaXJhdGlvbkRhdGUgdGltZSBsaW1pdCBhZnRlciB3aGljaCB0aGUgU0tJUCBiZWNvbWVzIGEgRkFJTFVSRQorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBEYXRlIGV4cGlyYXRpb25EYXRlKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICBpbml0RXhwaXJlRGF0ZShleHBpcmF0aW9uRGF0ZSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5leHBpcmF0aW9uRGF0ZTwvdHQ+LgorICAgKiBUaGUgPHR0PmZvcm1hdDwvdHQ+IHBhcmFtZXRlciB3aWlsIGJlIHVzZWQgZm9yIHBlcmZvcm1pbmcgdGhlIHRpbWUgY29tcGFyaXNvbi4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZXhwaXJhdGlvbkRhdGUgdGltZSBsaW1pdCBhZnRlciB3aGljaCB0aGUgU0tJUCBiZWNvbWVzIGEgRkFJTFVSRQorICAgKiBAcGFyYW0gZm9ybWF0IGZvcm1hdCBmb3IgdGhlIHRpbWUgY29tcGFyaXNvbgorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBEYXRlIGV4cGlyYXRpb25EYXRlLCBTdHJpbmcgZm9ybWF0KSB7CisgICAgc3VwZXIobXNnKTsKKyAgICBtX2luRm9ybWF0PSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpOworICAgIG1fb3V0Rm9ybWF0PSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpOworICAgIGluaXRFeHBpcmVEYXRlKGV4cGlyYXRpb25EYXRlKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0Bjb2RlIFRpbWVCb21iZWRTa2lwRXhjZXB0aW9ufSB1c2luZyB0aGUgPHR0PmRhdGU8L3R0PgorICAgKiBpbiB0aGUgZm9ybWF0IDx0dD55eXl5L01NL2RkPC90dD4uCisgICAqIEBwYXJhbSBtc2cgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICogQHBhcmFtIGRhdGUgdGltZSBsaW1pdCBhZnRlciB3aGljaCB0aGUgU0tJUCBiZWNvbWVzIGEgRkFJTFVSRQorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBTdHJpbmcgZGF0ZSkgeworICAgIHN1cGVyKG1zZyk7CisgICAgaW5pdEV4cGlyZURhdGUoZGF0ZSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5kYXRlPC90dD4KKyAgICogaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgPHR0PmZvcm1hdDwvdHQ+LiBUaGUgc2FtZSBmb3JtYXQgaXMgdXNlZAorICAgKiB3aGVuIHBlcmZvcm1pbmcgdGhlIHRpbWUgY29tcGFyaXNvbi4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZGF0ZSB0aW1lIGxpbWl0IGFmdGVyIHdoaWNoIHRoZSBTS0lQIGJlY29tZXMgYSBGQUlMVVJFCisgICAqIEBwYXJhbSBmb3JtYXQgZm9ybWF0IG9mIHRoZSBwYXNzZWQgaW4gPHR0PmRhdGU8L3R0PiBhbmQgb2YgdGhlIHRpbWUgY29tcGFyaXNvbgorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBTdHJpbmcgZGF0ZSwgU3RyaW5nIGZvcm1hdCkgeworICAgIHRoaXMobXNnLCBkYXRlLCBmb3JtYXQsIGZvcm1hdCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5kYXRlPC90dD4KKyAgICogaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgPHR0PmluRm9ybWF0PC90dD4uIFRoZSA8dHQ+b3V0Rm9ybWF0PC90dD4gd2lsbCBiZQorICAgKiB1c2VkIHRvIHBlcmZvcm0gdGhlIHRpbWUgY29tcGFyaXNvbiBhbmQgZGlzcGxheS4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZGF0ZSB0aW1lIGxpbWl0IGFmdGVyIHdoaWNoIHRoZSBTS0lQIGJlY29tZXMgYSBGQUlMVVJFCisgICAqIEBwYXJhbSBpbkZvcm1hdCBmb3JtYXQgb2YgdGhlIHBhc3NlZCBpbiA8dHQ+ZGF0ZTwvdHQ+CisgICAqIEBwYXJhbSBvdXRGb3JtYXQgZm9ybWF0IG9mIHRoZSB0aW1lIGNvbXBhcmlzb24KKyAgICovCisgIHB1YmxpYyBUaW1lQm9tYlNraXBFeGNlcHRpb24oU3RyaW5nIG1zZywgU3RyaW5nIGRhdGUsIFN0cmluZyBpbkZvcm1hdCwgU3RyaW5nIG91dEZvcm1hdCkgeworICAgIHN1cGVyKG1zZyk7CisgICAgbV9pbkZvcm1hdD0gbmV3IFNpbXBsZURhdGVGb3JtYXQoaW5Gb3JtYXQpOworICAgIG1fb3V0Rm9ybWF0PSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChvdXRGb3JtYXQpOworICAgIGluaXRFeHBpcmVEYXRlKGRhdGUpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSB7QGNvZGUgVGltZUJvbWJlZFNraXBFeGNlcHRpb259IHVzaW5nIHRoZSA8dHQ+ZXhwaXJhdGlvbkRhdGU8L3R0Pi4KKyAgICogVGhlIGZvcm1hdCB1c2VkIGZvciBkYXRlIGNvbXBhcmlzb24gaXMgPHR0Pnl5eXkvTU0vZGQ8L3R0PgorICAgKiBAcGFyYW0gbXNnIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAqIEBwYXJhbSBleHBpcmF0aW9uRGF0ZSB0aW1lIGxpbWl0IGFmdGVyIHdoaWNoIHRoZSBTS0lQIGJlY29tZXMgYSBGQUlMVVJFCisgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlCisgICAqICAgICAgICAge0BsaW5rICNnZXRDYXVzZSgpfSBtZXRob2QpLiAgKEEgPHR0Pm51bGw8L3R0PiB2YWx1ZSBpcworICAgKiAgICAgICAgIHBlcm1pdHRlZCwgYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjYXVzZSBpcyBub25leGlzdGVudCBvcgorICAgKiAgICAgICAgIHVua25vd24uKQorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBEYXRlIGV4cGlyYXRpb25EYXRlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICBpbml0RXhwaXJlRGF0ZShleHBpcmF0aW9uRGF0ZSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5leHBpcmF0aW9uRGF0ZTwvdHQ+LgorICAgKiBUaGUgPHR0PmZvcm1hdDwvdHQ+IHBhcmFtZXRlciB3aWlsIGJlIHVzZWQgZm9yIHBlcmZvcm1pbmcgdGhlIHRpbWUgY29tcGFyaXNvbi4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZXhwaXJhdGlvbkRhdGUgdGltZSBsaW1pdCBhZnRlciB3aGljaCB0aGUgU0tJUCBiZWNvbWVzIGEgRkFJTFVSRQorICAgKiBAcGFyYW0gZm9ybWF0IGZvcm1hdCBmb3IgdGhlIHRpbWUgY29tcGFyaXNvbgorICAgKiBAcGFyYW0gY2F1c2UgdGhlIGNhdXNlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZQorICAgKiAgICAgICAgIHtAbGluayAjZ2V0Q2F1c2UoKX0gbWV0aG9kKS4gIChBIDx0dD5udWxsPC90dD4gdmFsdWUgaXMKKyAgICogICAgICAgICBwZXJtaXR0ZWQsIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2F1c2UgaXMgbm9uZXhpc3RlbnQgb3IKKyAgICogICAgICAgICB1bmtub3duLikKKyAgICovCisgIHB1YmxpYyBUaW1lQm9tYlNraXBFeGNlcHRpb24oU3RyaW5nIG1zZywgRGF0ZSBleHBpcmF0aW9uRGF0ZSwgU3RyaW5nIGZvcm1hdCwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgbV9pbkZvcm1hdD0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZm9ybWF0KTsKKyAgICBtX291dEZvcm1hdD0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZm9ybWF0KTsKKyAgICBpbml0RXhwaXJlRGF0ZShleHBpcmF0aW9uRGF0ZSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5kYXRlPC90dD4KKyAgICogaW4gdGhlIGZvcm1hdCA8dHQ+eXl5eS9NTS9kZDwvdHQ+LgorICAgKiBAcGFyYW0gbXNnIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAqIEBwYXJhbSBkYXRlIHRpbWUgbGltaXQgYWZ0ZXIgd2hpY2ggdGhlIFNLSVAgYmVjb21lcyBhIEZBSUxVUkUKKyAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKKyAgICogICAgICAgICB7QGxpbmsgI2dldENhdXNlKCl9IG1ldGhvZCkuICAoQSA8dHQ+bnVsbDwvdHQ+IHZhbHVlIGlzCisgICAqICAgICAgICAgcGVybWl0dGVkLCBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yCisgICAqICAgICAgICAgdW5rbm93bi4pCisgICAqLworICBwdWJsaWMgVGltZUJvbWJTa2lwRXhjZXB0aW9uKFN0cmluZyBtc2csIFN0cmluZyBkYXRlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICBpbml0RXhwaXJlRGF0ZShkYXRlKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEge0Bjb2RlIFRpbWVCb21iZWRTa2lwRXhjZXB0aW9ufSB1c2luZyB0aGUgPHR0PmRhdGU8L3R0PgorICAgKiBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCA8dHQ+Zm9ybWF0PC90dD4uIFRoZSBzYW1lIGZvcm1hdCBpcyB1c2VkCisgICAqIHdoZW4gcGVyZm9ybWluZyB0aGUgdGltZSBjb21wYXJpc29uLgorICAgKiBAcGFyYW0gbXNnIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAqIEBwYXJhbSBkYXRlIHRpbWUgbGltaXQgYWZ0ZXIgd2hpY2ggdGhlIFNLSVAgYmVjb21lcyBhIEZBSUxVUkUKKyAgICogQHBhcmFtIGZvcm1hdCBmb3JtYXQgb2YgdGhlIHBhc3NlZCBpbiA8dHQ+ZGF0ZTwvdHQ+IGFuZCBvZiB0aGUgdGltZSBjb21wYXJpc29uCisgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlCisgICAqICAgICAgICAge0BsaW5rICNnZXRDYXVzZSgpfSBtZXRob2QpLiAgKEEgPHR0Pm51bGw8L3R0PiB2YWx1ZSBpcworICAgKiAgICAgICAgIHBlcm1pdHRlZCwgYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjYXVzZSBpcyBub25leGlzdGVudCBvcgorICAgKiAgICAgICAgIHVua25vd24uKQorICAgKi8KKyAgcHVibGljIFRpbWVCb21iU2tpcEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBTdHJpbmcgZGF0ZSwgU3RyaW5nIGZvcm1hdCwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgdGhpcyhtc2csIGRhdGUsIGZvcm1hdCwgZm9ybWF0LCBjYXVzZSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAY29kZSBUaW1lQm9tYmVkU2tpcEV4Y2VwdGlvbn0gdXNpbmcgdGhlIDx0dD5kYXRlPC90dD4KKyAgICogaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgPHR0PmluRm9ybWF0PC90dD4uIFRoZSA8dHQ+b3V0Rm9ybWF0PC90dD4gd2lsbCBiZQorICAgKiB1c2VkIHRvIHBlcmZvcm0gdGhlIHRpbWUgY29tcGFyaXNvbiBhbmQgZGlzcGxheS4KKyAgICogQHBhcmFtIG1zZyBleGNlcHRpb24gbWVzc2FnZQorICAgKiBAcGFyYW0gZGF0ZSB0aW1lIGxpbWl0IGFmdGVyIHdoaWNoIHRoZSBTS0lQIGJlY29tZXMgYSBGQUlMVVJFCisgICAqIEBwYXJhbSBpbkZvcm1hdCBmb3JtYXQgb2YgdGhlIHBhc3NlZCBpbiA8dHQ+ZGF0ZTwvdHQ+CisgICAqIEBwYXJhbSBvdXRGb3JtYXQgZm9ybWF0IG9mIHRoZSB0aW1lIGNvbXBhcmlzb24KKyAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUKKyAgICogICAgICAgICB7QGxpbmsgI2dldENhdXNlKCl9IG1ldGhvZCkuICAoQSA8dHQ+bnVsbDwvdHQ+IHZhbHVlIGlzCisgICAqICAgICAgICAgcGVybWl0dGVkLCBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhdXNlIGlzIG5vbmV4aXN0ZW50IG9yCisgICAqICAgICAgICAgdW5rbm93bi4pCisgICAqLworICBwdWJsaWMgVGltZUJvbWJTa2lwRXhjZXB0aW9uKFN0cmluZyBtc2csIFN0cmluZyBkYXRlLCBTdHJpbmcgaW5Gb3JtYXQsIFN0cmluZyBvdXRGb3JtYXQsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgIG1faW5Gb3JtYXQ9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGluRm9ybWF0KTsKKyAgICBtX291dEZvcm1hdD0gbmV3IFNpbXBsZURhdGVGb3JtYXQob3V0Rm9ybWF0KTsKKyAgICBpbml0RXhwaXJlRGF0ZShkYXRlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0RXhwaXJlRGF0ZShEYXRlIGV4cGlyZURhdGUpIHsKKyAgICBtX2V4cGlyZURhdGU9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgbV9leHBpcmVEYXRlLnNldFRpbWUoZXhwaXJlRGF0ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdEV4cGlyZURhdGUoU3RyaW5nIGRhdGUpIHsKKyAgICB0cnkgeworICAgICAgLy8gU2ltcGxlRGF0ZUZvcm1hdCBpcyBub3QgdGhyZWFkLXNhZmUsIGFuZCBtX2luRm9ybWF0IAorICAgICAgLy8gaXMsIGJ5IGRlZmF1bHQsIGNvbm5lY3RlZCB0byB0aGUgc3RhdGljIFNERiB2YXJpYWJsZQorICAgICAgc3luY2hyb25pemVkKCBtX2luRm9ybWF0ICl7CisgICAgICAgIERhdGUgZCA9IG1faW5Gb3JtYXQucGFyc2UoZGF0ZSk7CisgICAgICAgIGluaXRFeHBpcmVEYXRlKGQpOworICAgICAgfQorICAgIH0KKyAgICBjYXRjaChQYXJzZUV4Y2VwdGlvbiBwZXgpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkNhbm5vdCBwYXJzZSBkYXRlOiIgKyBkYXRlICsgIiB1c2luZyBwYXR0ZXJuOiAiICsgbV9pbkZvcm1hdCwgcGV4KTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNTa2lwKCkgeworICAgIGlmIChudWxsID09IG1fZXhwaXJlRGF0ZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBDYWxlbmRhciBub3c9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICBEYXRlIG5vd0RhdGU9IG1faW5Gb3JtYXQucGFyc2UobV9pbkZvcm1hdC5mb3JtYXQobm93LmdldFRpbWUoKSkpOworICAgICAgbm93LnNldFRpbWUobm93RGF0ZSk7CisKKyAgICAgIHJldHVybiAhbm93LmFmdGVyKG1fZXhwaXJlRGF0ZSk7CisgICAgfQorICAgIGNhdGNoKFBhcnNlRXhjZXB0aW9uIHBleCkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2Fubm90IGNvbXBhcmUgZGF0ZXMuIik7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZihpc1NraXAoKSkgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpICsgIjsgVGVzdCBtdXN0IGhhdmUgYmVlbiBlbmFibGVkIGJ5OiAiICsgbV9vdXRGb3JtYXQuZm9ybWF0KG1fZXhwaXJlRGF0ZS5nZXRUaW1lKCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcykgeworICAgIHJlZHVjZVN0YWNrVHJhY2UoKTsKKyAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHMpIHsKKyAgICByZWR1Y2VTdGFja1RyYWNlKCk7CisgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQWZ0ZXJDbGFzcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0FmdGVyQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzVhZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0FmdGVyQ2xhc3MuamF2YQpAQCAtMCwwICsxLDcyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBBZnRlckNsYXNzIHsKKyAgLyoqCisgICAqIFdoZXRoZXIgbWV0aG9kcyBvbiB0aGlzIGNsYXNzL21ldGhvZCBhcmUgZW5hYmxlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIGNsYXNzL21ldGhvZCBiZWxvbmdzIHRvLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgRXZlcnkgbWV0aG9kCisgICAqIG1lbWJlciBvZiBvbmUgb2YgdGhlc2UgZ3JvdXBzIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCisgICAqIGludm9rZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25Hcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqICBGb3IgYmVmb3JlIG1ldGhvZHMgKGJlZm9yZVN1aXRlLCBiZWZvcmVUZXN0LCBiZWZvcmVUZXN0Q2xhc3MgYW5kCisgICAqICBiZWZvcmVUZXN0TWV0aG9kLCBidXQgbm90IGJlZm9yZUdyb3Vwcyk6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgcmVnYXJkbGVzcyBvZiB3aGF0IGdyb3VwcyBpdCBiZWxvbmdzIHRvLgorICAgKiAgPGJyPgorICAgKiBGb3IgYWZ0ZXIgbWV0aG9kcyAoYWZ0ZXJTdWl0ZSwgYWZ0ZXJDbGFzcywgLi4uKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICBldmVuIGlmIG9uZSBvciBtb3JlIG1ldGhvZHMgaW52b2tlZCBwcmV2aW91c2x5IGZhaWxlZCBvcgorICAgKiAgd2FzIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBhbHdheXNSdW4oKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGlzICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZWxvbmcgdG8gZ3JvdXBzIHNwZWNpZmllZCBpbiB0aGUKKyAgICogJiM2NDtUZXN0IGFubm90YXRpb24gb24gdGhlIGNsYXNzIChpZiBhbnkpLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaW5oZXJpdEdyb3VwcygpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIG1ldGhvZC4gIFRoZSBzdHJpbmcgdXNlZCB3aWxsIGFwcGVhciBpbiB0aGUKKyAgICogSFRNTCByZXBvcnQgYW5kIGFsc28gb24gc3RhbmRhcmQgb3V0cHV0IGlmIHZlcmJvc2UgPj0gMi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoaXMgbWV0aG9kIHNob3VsZCB0YWtlLgorICAgKiBJZiBpdCBoYXNuJ3QgcmV0dXJuZWQgYWZ0ZXIgdGhpcyB0aW1lLCB0aGlzIG1ldGhvZCB3aWxsIGZhaWwgYW5kCisgICAqIGl0IHdpbGwgY2F1c2UgdGVzdCBtZXRob2RzIGRlcGVuZGluZyBvbiBpdCB0byBiZSBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGxvbmcgdGltZU91dCgpIGRlZmF1bHQgMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlckdyb3Vwcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0FmdGVyR3JvdXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzQwMTY0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlckdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIEFmdGVyR3JvdXBzIHsKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBydW4gYWZ0ZXIuIElmCisgICAqIHNwZWNpZmllZCBpdCBvdmVycmlkZXMgdGhlIGxpc3Qgb2YgZ3JvdXBzIHByb3ZpZGVkIHRocm91Z2gKKyAgICoge0BsaW5rICNncm91cHMoKX0gYXR0cmlidXRlLiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIHJ1biBzaG9ydGx5CisgICAqIGFmdGVyIHRoZSBsYXN0IHRlc3QgbWV0aG9kIHRoYXQgYmVsb25ncyB0byBhbnkgb2YgdGhlc2UgZ3JvdXBzIGlzCisgICAqIGludm9rZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gdmFsdWUoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBXaGV0aGVyIG1ldGhvZHMgb24gdGhpcyBjbGFzcy9tZXRob2QgYXJlIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4gVGhlIGxpc3QgYWxzbyBkZXNjcmliZXMgdGhlIGdyb3VwcworICAgKiB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgKGlmIG5vIHtAbGluayAjdmFsdWUoKX0gYXR0cmlidXRlIGlzIGRlZmluZWQpLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgRXZlcnkgbWV0aG9kCisgICAqIG1lbWJlciBvZiBvbmUgb2YgdGhlc2UgZ3JvdXBzIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCisgICAqIGludm9rZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25Hcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqICBGb3IgYmVmb3JlIG1ldGhvZHMgKGJlZm9yZVN1aXRlLCBiZWZvcmVUZXN0LCBiZWZvcmVUZXN0Q2xhc3MgYW5kCisgICAqICBiZWZvcmVUZXN0TWV0aG9kLCBidXQgbm90IGJlZm9yZUdyb3Vwcyk6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgcmVnYXJkbGVzcyBvZiB3aGF0IGdyb3VwcyBpdCBiZWxvbmdzIHRvLgorICAgKiAgPGJyPgorICAgKiBGb3IgYWZ0ZXIgbWV0aG9kcyAoYWZ0ZXJTdWl0ZSwgYWZ0ZXJDbGFzcywgLi4uKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICBldmVuIGlmIG9uZSBvciBtb3JlIG1ldGhvZHMgaW52b2tlZCBwcmV2aW91c2x5IGZhaWxlZCBvcgorICAgKiAgd2FzIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBhbHdheXNSdW4oKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGlzICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZWxvbmcgdG8gZ3JvdXBzIHNwZWNpZmllZCBpbiB0aGUKKyAgICogJiM2NDtUZXN0IGFubm90YXRpb24gb24gdGhlIGNsYXNzIChpZiBhbnkpLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaW5oZXJpdEdyb3VwcygpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIG1ldGhvZC4gIFRoZSBzdHJpbmcgdXNlZCB3aWxsIGFwcGVhciBpbiB0aGUKKyAgICogSFRNTCByZXBvcnQgYW5kIGFsc28gb24gc3RhbmRhcmQgb3V0cHV0IGlmIHZlcmJvc2UgPj0gMi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoaXMgbWV0aG9kIHNob3VsZCB0YWtlLgorICAgKiBJZiBpdCBoYXNuJ3QgcmV0dXJuZWQgYWZ0ZXIgdGhpcyB0aW1lLCB0aGlzIG1ldGhvZCB3aWxsIGZhaWwgYW5kCisgICAqIGl0IHdpbGwgY2F1c2UgdGVzdCBtZXRob2RzIGRlcGVuZGluZyBvbiBpdCB0byBiZSBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGxvbmcgdGltZU91dCgpIGRlZmF1bHQgMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlck1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0FmdGVyTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTNjNmExOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlck1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIEFmdGVyTWV0aG9kIHsKKyAgLyoqCisgICAqIFdoZXRoZXIgbWV0aG9kcyBvbiB0aGlzIGNsYXNzL21ldGhvZCBhcmUgZW5hYmxlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIGNsYXNzL21ldGhvZCBiZWxvbmdzIHRvLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgRXZlcnkgbWV0aG9kCisgICAqIG1lbWJlciBvZiBvbmUgb2YgdGhlc2UgZ3JvdXBzIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCisgICAqIGludm9rZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25Hcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqICBGb3IgYmVmb3JlIG1ldGhvZHMgKGJlZm9yZVN1aXRlLCBiZWZvcmVUZXN0LCBiZWZvcmVUZXN0Q2xhc3MgYW5kCisgICAqICBiZWZvcmVUZXN0TWV0aG9kLCBidXQgbm90IGJlZm9yZUdyb3Vwcyk6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgcmVnYXJkbGVzcyBvZiB3aGF0IGdyb3VwcyBpdCBiZWxvbmdzIHRvLgorICAgKiAgPGJyPgorICAgKiBGb3IgYWZ0ZXIgbWV0aG9kcyAoYWZ0ZXJTdWl0ZSwgYWZ0ZXJDbGFzcywgLi4uKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICBldmVuIGlmIG9uZSBvciBtb3JlIHRlc3QgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSA+PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIElmIHRydWUgYW5kIHRoZSBAVGVzdCBtZXRob2QgdGhhdCB3YXMganVzdCBydW4gaGFzIGFuIGludm9jYXRpb25Db3VudCA+IDEsIHRoaXMKKyAgICogQWZ0ZXJNZXRob2Qgd2lsbCBvbmx5IGJlIGludm9rZWQgb25jZSAoYWZ0ZXIgdGhlIGxhc3QgdGVzdCBpbnZvY2F0aW9uKS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGxhc3RUaW1lT25seSgpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0FmdGVyU3VpdGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlclN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM4NjI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlclN1aXRlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQWZ0ZXJTdWl0ZSB7CisgIC8qKgorICAgKiBXaGV0aGVyIG1ldGhvZHMgb24gdGhpcyBjbGFzcy9tZXRob2QgYXJlIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIEV2ZXJ5IG1ldGhvZAorICAgKiBtZW1iZXIgb2Ygb25lIG9mIHRoZXNlIGdyb3VwcyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYmVlbgorICAgKiBpbnZva2VkIGJlZm9yZSB0aGlzIG1ldGhvZC4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uR3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgbWV0aG9kcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlCisgICAqIG9uIHRoZSBvcmRlciBvbiB3aGljaCB0aGUgbWV0aG9kcyBkZXBlbmRlZCB1cG9uIHdpbGwgYmUgcnVuLCBidXQgeW91CisgICAqIGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIHRoZXNlIG1ldGhvZHMgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSB0ZXN0IG1ldGhvZAorICAgKiB0aGF0IGNvbnRhaW5zIHRoaXMgYW5ub3RhdGlvbiBpcyBydW4uICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKgorICAgKiAgSWYgc29tZSBvZiB0aGVzZSBtZXRob2RzIGhhdmUgYmVlbiBvdmVybG9hZGVkLCBhbGwgdGhlIG92ZXJsb2FkZWQKKyAgICogIHZlcnNpb25zIHdpbGwgYmUgcnVuLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbk1ldGhvZHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiAgRm9yIGJlZm9yZSBtZXRob2RzIChiZWZvcmVTdWl0ZSwgYmVmb3JlVGVzdCwgYmVmb3JlVGVzdENsYXNzIGFuZAorICAgKiAgYmVmb3JlVGVzdE1ldGhvZCwgYnV0IG5vdCBiZWZvcmVHcm91cHMpOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBncm91cHMgaXQgYmVsb25ncyB0by4KKyAgICogIDxicj4KKyAgICogRm9yIGFmdGVyIG1ldGhvZHMgKGFmdGVyU3VpdGUsIGFmdGVyQ2xhc3MsIC4uLik6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgZXZlbiBpZiBvbmUgb3IgbW9yZSBtZXRob2RzIGludm9rZWQgcHJldmlvdXNseSBmYWlsZWQgb3IKKyAgICogIHdhcyBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYWx3YXlzUnVuKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhpcyAmIzY0O0NvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmVsb25nIHRvIGdyb3VwcyBzcGVjaWZpZWQgaW4gdGhlCisgICAqICYjNjQ7VGVzdCBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcyAoaWYgYW55KS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGluaGVyaXRHcm91cHMoKSBkZWZhdWx0IHRydWU7CisKKyAgLyoqCisgICAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBtZXRob2QuICBUaGUgc3RyaW5nIHVzZWQgd2lsbCBhcHBlYXIgaW4gdGhlCisgICAqIEhUTUwgcmVwb3J0IGFuZCBhbHNvIG9uIHN0YW5kYXJkIG91dHB1dCBpZiB2ZXJib3NlID49IDIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGlzIG1ldGhvZCBzaG91bGQgdGFrZS4KKyAgICogSWYgaXQgaGFzbid0IHJldHVybmVkIGFmdGVyIHRoaXMgdGltZSwgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIGFuZAorICAgKiBpdCB3aWxsIGNhdXNlIHRlc3QgbWV0aG9kcyBkZXBlbmRpbmcgb24gaXQgdG8gYmUgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBsb25nIHRpbWVPdXQoKSBkZWZhdWx0IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQWZ0ZXJUZXN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQWZ0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA1ZWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9BZnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBBZnRlclRlc3QgeworICAvKioKKyAgICogV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogIElmIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBoYXZlIGJlZW4gb3ZlcmxvYWRlZCwgYWxsIHRoZSBvdmVybG9hZGVkCisgICAqICB2ZXJzaW9ucyB3aWxsIGJlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25NZXRob2RzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogIEZvciBiZWZvcmUgbWV0aG9kcyAoYmVmb3JlU3VpdGUsIGJlZm9yZVRlc3QsIGJlZm9yZVRlc3RDbGFzcyBhbmQKKyAgICogIGJlZm9yZVRlc3RNZXRob2QsIGJ1dCBub3QgYmVmb3JlR3JvdXBzKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICByZWdhcmRsZXNzIG9mIHdoYXQgZ3JvdXBzIGl0IGJlbG9uZ3MgdG8uCisgICAqICA8YnI+CisgICAqIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIGV2ZW4gaWYgb25lIG9yIG1vcmUgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSA+PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZUNsYXNzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQmVmb3JlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMWIxMWMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZUNsYXNzLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlQ2xhc3MgeworICAvKioKKyAgICogV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogIElmIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBoYXZlIGJlZW4gb3ZlcmxvYWRlZCwgYWxsIHRoZSBvdmVybG9hZGVkCisgICAqICB2ZXJzaW9ucyB3aWxsIGJlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25NZXRob2RzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogIEZvciBiZWZvcmUgbWV0aG9kcyAoYmVmb3JlU3VpdGUsIGJlZm9yZVRlc3QsIGJlZm9yZVRlc3RDbGFzcyBhbmQKKyAgICogIGJlZm9yZVRlc3RNZXRob2QsIGJ1dCBub3QgYmVmb3JlR3JvdXBzKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICByZWdhcmRsZXNzIG9mIHdoYXQgZ3JvdXBzIGl0IGJlbG9uZ3MgdG8uCisgICAqICA8YnI+CisgICAqIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIGV2ZW4gaWYgb25lIG9yIG1vcmUgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSA+PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZUdyb3Vwcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZUdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwODk2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQmVmb3JlR3JvdXBzLmphdmEKQEAgLTAsMCArMSw4MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlR3JvdXBzIHsKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBydW4gYmVmb3JlLiBJZiBzcGVjaWZpZWQgaXQgb3ZlcnJpZGVzIHRoZQorICAgKiBsaXN0IG9mIGdyb3VwcyBwcm92aWRlZCB0aHJvdWdoIHtAbGluayAjZ3JvdXBzKCl9IGF0dHJpYnV0ZS4KKyAgICogVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBydW4gc2hvcnRseSBiZWZvcmUgdGhlIGZpcnN0IHRlc3QgbWV0aG9kIHRoYXQKKyAgICogYmVsb25ncyB0byBhbnkgb2YgdGhlc2UgZ3JvdXBzIGlzIGludm9rZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gdmFsdWUoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBXaGV0aGVyIG1ldGhvZHMgb24gdGhpcyBjbGFzcy9tZXRob2QgYXJlIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4gVGhpcyBsaXN0IGFsc28gZGVzY3JpYmVzIHRoZSBncm91cHMKKyAgICogdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgcnVuIGJlZm9yZSAoaWYgbm8ge0BsaW5rICN2YWx1ZSgpfSBhdHRyaWJ1dGUgaXMgZGVmaW5lZCkuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogIElmIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBoYXZlIGJlZW4gb3ZlcmxvYWRlZCwgYWxsIHRoZSBvdmVybG9hZGVkCisgICAqICB2ZXJzaW9ucyB3aWxsIGJlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25NZXRob2RzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogIEZvciBiZWZvcmUgbWV0aG9kcyAoYmVmb3JlU3VpdGUsIGJlZm9yZVRlc3QsIGJlZm9yZVRlc3RDbGFzcyBhbmQKKyAgICogIGJlZm9yZVRlc3RNZXRob2QsIGJ1dCBub3QgYmVmb3JlR3JvdXBzKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICByZWdhcmRsZXNzIG9mIHdoYXQgZ3JvdXBzIGl0IGJlbG9uZ3MgdG8uCisgICAqICA8YnI+CisgICAqIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIGV2ZW4gaWYgb25lIG9yIG1vcmUgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSA+PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZU1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3MzU2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQmVmb3JlTWV0aG9kLmphdmEKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlTWV0aG9kIHsKKyAgLyoqCisgICAqIFdoZXRoZXIgbWV0aG9kcyBvbiB0aGlzIGNsYXNzL21ldGhvZCBhcmUgZW5hYmxlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIGNsYXNzL21ldGhvZCBiZWxvbmdzIHRvLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgRXZlcnkgbWV0aG9kCisgICAqIG1lbWJlciBvZiBvbmUgb2YgdGhlc2UgZ3JvdXBzIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCisgICAqIGludm9rZWQgYmVmb3JlIHRoaXMgbWV0aG9kLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25Hcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqICBGb3IgYmVmb3JlIG1ldGhvZHMgKGJlZm9yZVN1aXRlLCBiZWZvcmVUZXN0LCBiZWZvcmVUZXN0Q2xhc3MgYW5kCisgICAqICBiZWZvcmVUZXN0TWV0aG9kLCBidXQgbm90IGJlZm9yZUdyb3Vwcyk6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgcmVnYXJkbGVzcyBvZiB3aGF0IGdyb3VwcyBpdCBiZWxvbmdzIHRvLgorICAgKiAgPGJyPgorICAgKiBGb3IgYWZ0ZXIgbWV0aG9kcyAoYWZ0ZXJTdWl0ZSwgYWZ0ZXJDbGFzcywgLi4uKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICBldmVuIGlmIG9uZSBvciBtb3JlIG1ldGhvZHMgaW52b2tlZCBwcmV2aW91c2x5IGZhaWxlZCBvcgorICAgKiAgd2FzIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBhbHdheXNSdW4oKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGlzICYjNjQ7Q29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZWxvbmcgdG8gZ3JvdXBzIHNwZWNpZmllZCBpbiB0aGUKKyAgICogJiM2NDtUZXN0IGFubm90YXRpb24gb24gdGhlIGNsYXNzIChpZiBhbnkpLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaW5oZXJpdEdyb3VwcygpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIG1ldGhvZC4gIFRoZSBzdHJpbmcgdXNlZCB3aWxsIGFwcGVhciBpbiB0aGUKKyAgICogSFRNTCByZXBvcnQgYW5kIGFsc28gb24gc3RhbmRhcmQgb3V0cHV0IGlmIHZlcmJvc2UgJmd0Oz0gMi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOworCisgIC8qKgorICAgKiBJZiB0cnVlIGFuZCB0aGUgQFRlc3QgbWV0aG9kIGFib3V0IHRvIGJlIHJ1biBoYXMgYW4gaW52b2NhdGlvbkNvdW50ICZndDsgMSwgdGhpcworICAgKiBCZWZvcmVNZXRob2Qgd2lsbCBvbmx5IGJlIGludm9rZWQgb25jZSAoYmVmb3JlIHRoZSBmaXJzdCB0ZXN0IGludm9jYXRpb24pLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZmlyc3RUaW1lT25seSgpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZVN1aXRlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQmVmb3JlU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lODExMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZVN1aXRlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlU3VpdGUgeworICAvKioKKyAgICogV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogIElmIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBoYXZlIGJlZW4gb3ZlcmxvYWRlZCwgYWxsIHRoZSBvdmVybG9hZGVkCisgICAqICB2ZXJzaW9ucyB3aWxsIGJlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25NZXRob2RzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogIEZvciBiZWZvcmUgbWV0aG9kcyAoYmVmb3JlU3VpdGUsIGJlZm9yZVRlc3QsIGJlZm9yZVRlc3RDbGFzcyBhbmQKKyAgICogIGJlZm9yZVRlc3RNZXRob2QsIGJ1dCBub3QgYmVmb3JlR3JvdXBzKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICByZWdhcmRsZXNzIG9mIHdoYXQgZ3JvdXBzIGl0IGJlbG9uZ3MgdG8uCisgICAqICA8YnI+CisgICAqIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIGV2ZW4gaWYgb25lIG9yIG1vcmUgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSAmZ3Q7PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UuCisgICAqIElmIGl0IGhhc24ndCByZXR1cm5lZCBhZnRlciB0aGlzIHRpbWUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBhbmQKKyAgICogaXQgd2lsbCBjYXVzZSB0ZXN0IG1ldGhvZHMgZGVwZW5kaW5nIG9uIGl0IHRvIGJlIHNraXBwZWQuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0JlZm9yZVRlc3QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9CZWZvcmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTA2NjEyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9CZWZvcmVUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlVGVzdCB7CisgIC8qKgorICAgKiBXaGV0aGVyIG1ldGhvZHMgb24gdGhpcyBjbGFzcy9tZXRob2QgYXJlIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIEV2ZXJ5IG1ldGhvZAorICAgKiBtZW1iZXIgb2Ygb25lIG9mIHRoZXNlIGdyb3VwcyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYmVlbgorICAgKiBpbnZva2VkIGJlZm9yZSB0aGlzIG1ldGhvZC4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uR3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgbWV0aG9kcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlCisgICAqIG9uIHRoZSBvcmRlciBvbiB3aGljaCB0aGUgbWV0aG9kcyBkZXBlbmRlZCB1cG9uIHdpbGwgYmUgcnVuLCBidXQgeW91CisgICAqIGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIHRoZXNlIG1ldGhvZHMgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSB0ZXN0IG1ldGhvZAorICAgKiB0aGF0IGNvbnRhaW5zIHRoaXMgYW5ub3RhdGlvbiBpcyBydW4uICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKgorICAgKiAgSWYgc29tZSBvZiB0aGVzZSBtZXRob2RzIGhhdmUgYmVlbiBvdmVybG9hZGVkLCBhbGwgdGhlIG92ZXJsb2FkZWQKKyAgICogIHZlcnNpb25zIHdpbGwgYmUgcnVuLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbk1ldGhvZHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiAgRm9yIGJlZm9yZSBtZXRob2RzIChiZWZvcmVTdWl0ZSwgYmVmb3JlVGVzdCwgYmVmb3JlVGVzdENsYXNzIGFuZAorICAgKiAgYmVmb3JlVGVzdE1ldGhvZCwgYnV0IG5vdCBiZWZvcmVHcm91cHMpOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBncm91cHMgaXQgYmVsb25ncyB0by4KKyAgICogIDxicj4KKyAgICogRm9yIGFmdGVyIG1ldGhvZHMgKGFmdGVyU3VpdGUsIGFmdGVyQ2xhc3MsIC4uLik6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgZXZlbiBpZiBvbmUgb3IgbW9yZSBtZXRob2RzIGludm9rZWQgcHJldmlvdXNseSBmYWlsZWQgb3IKKyAgICogIHdhcyBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYWx3YXlzUnVuKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhpcyAmIzY0O0NvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmVsb25nIHRvIGdyb3VwcyBzcGVjaWZpZWQgaW4gdGhlCisgICAqICYjNjQ7VGVzdCBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcyAoaWYgYW55KS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGluaGVyaXRHcm91cHMoKSBkZWZhdWx0IHRydWU7CisKKyAgLyoqCisgICAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBtZXRob2QuICBUaGUgc3RyaW5nIHVzZWQgd2lsbCBhcHBlYXIgaW4gdGhlCisgICAqIEhUTUwgcmVwb3J0IGFuZCBhbHNvIG9uIHN0YW5kYXJkIG91dHB1dCBpZiB2ZXJib3NlID49IDIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGlzIG1ldGhvZCBzaG91bGQgdGFrZS4KKyAgICogSWYgaXQgaGFzbid0IHJldHVybmVkIGFmdGVyIHRoaXMgdGltZSwgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIGFuZAorICAgKiBpdCB3aWxsIGNhdXNlIHRlc3QgbWV0aG9kcyBkZXBlbmRpbmcgb24gaXQgdG8gYmUgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBsb25nIHRpbWVPdXQoKSBkZWZhdWx0IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzgwNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIFRlc3RORyBjbGFzcy4KKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgQEJlZm9yZVN1aXRlLCBAQWZ0ZXJTdWl0ZSwgQEJlZm9yZVRlc3QsIEBBZnRlclRlc3QsCisgKiBcQEJlZm9yZUdyb3VwcywgQEFmdGVyR3JvdXBzLCBAQmVmb3JlQ2xhc3MsIEBBZnRlckNsYXNzLCBAQmVmb3JlTWV0aG9kLAorICogXEBBZnRlck1ldGhvZAorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBcHIgMjYsIDIwMDQKKyAqCisgKi8KK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIENvbmZpZ3VyYXRpb24geworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgdGVzdCBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKKyAgICogYW5kIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QgaXMgaW52b2tlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGJlZm9yZVRlc3RDbGFzcygpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoZSBhbm5vdGF0ZWQgbWV0aG9kIHdpbGwgYmUgcnVuIGFmdGVyIGFsbCB0aGUgdGVzdHMgaW4gdGhlIHRlc3QKKyAgICogY2xhc3MgaGF2ZSBiZWVuIHJ1bi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFmdGVyVGVzdENsYXNzKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYmVmb3JlIGFueSB0ZXN0IG1ldGhvZCBpcyBpbnZva2VkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYmVmb3JlVGVzdE1ldGhvZCgpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoZSBhbm5vdGF0ZWQgbWV0aG9kIHdpbGwgYmUgcnVuIGFmdGVyIGFueSB0ZXN0IG1ldGhvZCBpcyBpbnZva2VkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUZXN0TWV0aG9kKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYmVmb3JlIHRoaXMgc3VpdGUgc3RhcnRzLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYmVmb3JlU3VpdGUoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBhZnRlciBhbGwgdGVzdHMgaW4gdGhpcyBzdWl0ZQorICAgKiBoYXZlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFmdGVyU3VpdGUoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBiZWZvcmUgZXZlcnkgdGVzdC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGJlZm9yZVRlc3QoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBhZnRlciBhbGwgZXZlcnkgdGVzdC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFmdGVyVGVzdCgpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBydW4gYmVmb3JlLgorICAgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIHJ1biBzaG9ydGx5IGJlZm9yZSB0aGUgZmlyc3QgdGVzdCBtZXRob2QgdGhhdAorICAgKiBiZWxvbmdzIHRvIGFueSBvZiB0aGVzZSBncm91cHMgaXMgaW52b2tlZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBiZWZvcmVHcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgcnVuIGFmdGVyLgorICAgKiBUaGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIHJ1biBzaG9ydGx5IGFmdGVyIHRoZSBsYXN0IHRlc3QgbWV0aG9kIHRoYXQKKyAgICogYmVsb25ncyB0byBhbnkgb2YgdGhlc2UgZ3JvdXBzIGlzIGludm9rZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gYWZ0ZXJHcm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdXNlZCB0byBmaWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLgorICAgKiBUaGVzZSB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBVc2UgQFBhcmFtZXRlcnMKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmdbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIGRlZmF1bHQgdHJ1ZTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogIElmIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBoYXZlIGJlZW4gb3ZlcmxvYWRlZCwgYWxsIHRoZSBvdmVybG9hZGVkCisgICAqICB2ZXJzaW9ucyB3aWxsIGJlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBkZXBlbmRzT25NZXRob2RzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogIEZvciBiZWZvcmUgbWV0aG9kcyAoYmVmb3JlU3VpdGUsIGJlZm9yZVRlc3QsIGJlZm9yZVRlc3RDbGFzcyBhbmQKKyAgICogIGJlZm9yZVRlc3RNZXRob2QsIGJ1dCBub3QgYmVmb3JlR3JvdXBzKToKKyAgICogIElmIHNldCB0byB0cnVlLCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgYmUgcnVuCisgICAqICByZWdhcmRsZXNzIG9mIHdoYXQgZ3JvdXBzIGl0IGJlbG9uZ3MgdG8uCisgICAqICA8YnI+CisgICAqIEZvciBhZnRlciBtZXRob2RzIChhZnRlclN1aXRlLCBhZnRlckNsYXNzLCAuLi4pOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIGV2ZW4gaWYgb25lIG9yIG1vcmUgbWV0aG9kcyBpbnZva2VkIHByZXZpb3VzbHkgZmFpbGVkIG9yCisgICAqICB3YXMgc2tpcHBlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0R3JvdXBzKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLiAgVGhlIHN0cmluZyB1c2VkIHdpbGwgYXBwZWFyIGluIHRoZQorICAgKiBIVE1MIHJlcG9ydCBhbmQgYWxzbyBvbiBzdGFuZGFyZCBvdXRwdXQgaWYgdmVyYm9zZSAmZ3Q7PSAyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvRGF0YVByb3ZpZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvRGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFlNzNmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9EYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrIGEgbWV0aG9kIGFzIHN1cHBseWluZyBkYXRhIGZvciBhIHRlc3QgbWV0aG9kLiBUaGUgZGF0YSBwcm92aWRlciBuYW1lCisgKiBkZWZhdWx0cyB0byBtZXRob2QgbmFtZS4KKyAqIFRoZSBhbm5vdGF0ZWQgbWV0aG9kIG11c3QgcmV0dXJuIGFuIE9iamVjdFtdW10gd2hlcmUgZWFjaAorICogT2JqZWN0W10gY2FuIGJlIGFzc2lnbmVkIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiB0aGUgdGVzdCBtZXRob2QuCisgKiBUaGUgQFRlc3QgbWV0aG9kIHRoYXQgd2FudHMgdG8gcmVjZWl2ZSBkYXRhIGZyb20gdGhpcyBEYXRhUHJvdmlkZXIKKyAqIG5lZWRzIHRvIHVzZSBhIGRhdGFQcm92aWRlciBuYW1lIGVxdWFscyB0byB0aGUgbmFtZSBvZiB0aGlzIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe01FVEhPRH0pCitwdWJsaWMgQGludGVyZmFjZSBEYXRhUHJvdmlkZXIgeworCisgIC8qKgorICAgKiBUaGUgbmFtZSBvZiB0aGlzIERhdGFQcm92aWRlci4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyBkYXRhIHByb3ZpZGVyIHNob3VsZCBiZSBydW4gaW4gcGFyYWxsZWwuCisgICAqLworICBib29sZWFuIHBhcmFsbGVsKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogV2hpY2ggaW5kaWNlcyB0byBydW4gZnJvbSB0aGlzIGRhdGEgcHJvdmlkZXIsIGRlZmF1bHQ6IGFsbC4KKyAgICovCisgIGludFtdIGluZGljZXMoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0V4cGVjdGVkRXhjZXB0aW9ucy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0V4cGVjdGVkRXhjZXB0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwNGVkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvRXhwZWN0ZWRFeGNlcHRpb25zLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBMaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCBhIHRlc3QgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHRocm93LgorICoKKyAqIEBkZXByZWNhdGVkIFVzZSBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSAiLi4uIikKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgQXByIDI2LCAyMDA0CisgKgorICovCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBFeHBlY3RlZEV4Y2VwdGlvbnMgeworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBleGNlcHRpb25zIGV4cGVjdGVkIHRvIGJlIHRocm93biBieSB0aGlzIG1ldGhvZC4KKyAgICovCisgIHB1YmxpYyBDbGFzc1tdIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjk3Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIE1hcmtzIGEgbWV0aG9kIGFzIGEgZmFjdG9yeSB0aGF0IHJldHVybnMgb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBieSBUZXN0TkcKKyAqIGFzIFRlc3QgY2xhc3Nlcy4gIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gT2JqZWN0W10uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7amF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9ELCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5DT05TVFJVQ1RPUn0pCitwdWJsaWMgQGludGVyZmFjZSBGYWN0b3J5IHsKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIHZhcmlhYmxlcyB1c2VkIHRvIGZpbGwgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QuCisgICAqIFRoZXNlIHZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVzZSBAUGFyYW1ldGVycworICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFN0cmluZ1tdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBUaGUgbmFtZSBvZiB0aGUgZGF0YSBwcm92aWRlciBmb3IgdGhpcyB0ZXN0IG1ldGhvZC4KKyAgICogQHNlZSBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcgorICAgKi8KKyAgcHVibGljIFN0cmluZyBkYXRhUHJvdmlkZXIoKSBkZWZhdWx0ICIiOworCisgIC8qKgorICAgKiBUaGUgY2xhc3Mgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGRhdGEgcHJvdmlkZXIuICBJZiBub3QKKyAgICogc3BlY2lmaWVkLCB0aGUgZGF0YXByb3ZpZGVyIHdpbGwgYmUgbG9va2VkIG9uIHRoZSBjbGFzcworICAgKiBvZiB0aGUgY3VycmVudCB0ZXN0IG1ldGhvZCBvciBvbmUgb2YgaXRzIHN1cGVyIGNsYXNzZXMuCisgICAqIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRhdGEgcHJvdmlkZXIgbWV0aG9kCisgICAqIG5lZWRzIHRvIGJlIHN0YXRpYyBvbiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICAgKi8KKyAgcHVibGljIENsYXNzPD8+IGRhdGFQcm92aWRlckNsYXNzKCkgZGVmYXVsdCBPYmplY3QuY2xhc3M7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0d1aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvR3VpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMzY2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0d1aWNlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNb2R1bGVGYWN0b3J5OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gc3BlY2lmaWVzIHdoYXQgR3VpY2UgbW9kdWxlcyBzaG91bGQgYmUgdXNlZCB0byBpbnN0YW50aWF0ZQorICogdGhpcyB0ZXN0IGNsYXNzLgorICogCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoVFlQRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEd1aWNlIHsKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyB0byBxdWVyeSB3aGVuIHRyeWluZyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNsYXNzLgorICAgKi8KKyAgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT5bXSBtb2R1bGVzKCkgZGVmYXVsdCB7fTsKKworICBDbGFzczw/IGV4dGVuZHMgSU1vZHVsZUZhY3Rvcnk+IG1vZHVsZUZhY3RvcnkoKSBkZWZhdWx0IElNb2R1bGVGYWN0b3J5LmNsYXNzOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2M4ODZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCisvKioKKyAqIFRoZSBwYXJlbnQgaW50ZXJmYWNlIGZvciBhbGwgdGhlIGFubm90YXRpb25zLgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JQ29uZmlndXJhdGlvbkFubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JQ29uZmlndXJhdGlvbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDc2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworLyoqCisgKiBFbmNhcHN1bGF0ZSB0aGUgQENvbmZpZ3VyYXRpb24gLyBAdGVzdG5nLmNvbmZpZ3VyYXRpb24gYW5ub3RhdGlvbgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGV4dGVuZHMgSVRlc3RPckNvbmZpZ3VyYXRpb24geworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgdGhlIHRlc3QgY2xhc3MgaXMgaW5zdGFudGlhdGVkCisgICAqIGFuZCBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kIGlzIGludm9rZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRCZWZvcmVUZXN0Q2xhc3MoKTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBpbiB0aGUgdGVzdAorICAgKiBjbGFzcyBoYXZlIGJlZW4gcnVuLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0QWZ0ZXJUZXN0Q2xhc3MoKTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYmVmb3JlIGFueSB0ZXN0IG1ldGhvZCBpcyBpbnZva2VkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0QmVmb3JlVGVzdE1ldGhvZCgpOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBhZnRlciBhbnkgdGVzdCBtZXRob2QgaXMgaW52b2tlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldEFmdGVyVGVzdE1ldGhvZCgpOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBiZWZvcmUgdGhpcyBzdWl0ZSBzdGFydHMuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRCZWZvcmVTdWl0ZSgpOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGUgYW5ub3RhdGVkIG1ldGhvZCB3aWxsIGJlIHJ1biBhZnRlciBhbGwgdGVzdHMgaW4gdGhpcyBzdWl0ZQorICAgKiBoYXZlIHJ1bi4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldEFmdGVyU3VpdGUoKTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYmVmb3JlIGV2ZXJ5IHRlc3QKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldEJlZm9yZVRlc3QoKTsKKworICAvKioKKyAgICogSWYgdHJ1ZSwgdGhlIGFubm90YXRlZCBtZXRob2Qgd2lsbCBiZSBydW4gYWZ0ZXIgYWxsIGV2ZXJ5IHRlc3QuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRBZnRlclRlc3QoKTsKKworICAvKioKKyAgICogVXNlZCBvbmx5IGZvciBhZnRlciB0eXBlIG9mIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy4gSWYgc2V0IHRvIHRydWUgdGhhbgorICAgKiB0aGUgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4gd2hhdGV2ZXIgdGhlIHN0YXR1cyBvZiBiZWZvcmUKKyAgICogY29uZmlndXJhdGlvbiBtZXRob2RzIHdhcy4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldEFsd2F5c1J1bigpOworCisgIC8qKgorICAgKiBJZiB0cnVlLCB0aGlzIEBDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiBcQFRlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRJbmhlcml0R3JvdXBzKCk7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBydW4gYmVmb3JlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdldEJlZm9yZUdyb3VwcygpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHdpbGwgcnVuIGFmdGVyLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdldEFmdGVyR3JvdXBzKCk7CisKKyAgLyoqCisgICAqIEludGVybmFsIHVzZSBvbmx5LgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjb25maWd1cmF0aW9uIGFubm90YXRpb24gaXMgbm90IGEgInRydWUiIGNvbmZpZ3VyYXRpb24KKyAgICogYW5ub3RhdGlvbiBidXQgYSBAQmVmb3JlU3VpdGUgb3Igc2ltaWxhciB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgY29uZmlndXJhdGlvbgorICAgKiBhbm5vdGF0aW9uLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNGYWtlQ29uZmlndXJhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lEYXRhUHJvdmlkZXJBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSURhdGFQcm92aWRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjRmZWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lEYXRhUHJvdmlkZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCisvKioKKyAqIEVuY2Fwc3VsYXRlIHRoZSBARGF0YVByb3ZpZGVyIC8gQHRlc3RuZy5kYXRhLXByb3ZpZGVyIGFubm90YXRpb24KKyAqCisgKiBDcmVhdGVkIG9uIERlYyAyMCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElEYXRhUHJvdmlkZXJBbm5vdGF0aW9uIGV4dGVuZHMgSUFubm90YXRpb24geworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhpcyBEYXRhUHJvdmlkZXIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyBkYXRhIHByb3ZpZGVyIHNob3VsZCBiZSB1c2VkIGluIHBhcmFsbGVsLgorICAgKi8KKyAgYm9vbGVhbiBpc1BhcmFsbGVsKCk7CisgIHZvaWQgc2V0UGFyYWxsZWwoYm9vbGVhbiBwYXJhbGxlbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2MzQ0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKKy8qKgorICogRW5jYXBzdWxhdGUgdGhlIEBFeHBlY3RlZEV4Y2VwdGlvbnMgLyBAdGVzdG5nLmV4cGVjdGVkLWV4Y2VwdGlvbnMgYW5ub3RhdGlvbgorICogQ3JlYXRlZCBvbiBEZWMgMjAsIDIwMDUKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbiBleHRlbmRzIElBbm5vdGF0aW9uIHsKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIGJ5IHRoaXMgbWV0aG9kLgorICAgKi8KKyAgcHVibGljIENsYXNzW10gZ2V0VmFsdWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lGYWN0b3J5QW5ub3RhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lGYWN0b3J5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmNTgyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUZhY3RvcnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JRGF0YVByb3ZpZGFibGU7CisKKy8qKgorICogRW5jYXBzdWxhdGUgdGhlIEBGYWN0b3J5IC8gQHRlc3RuZy5mYWN0b3J5IGFubm90YXRpb24KKyAqCisgKiBDcmVhdGVkIG9uIERlYyAyMCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElGYWN0b3J5QW5ub3RhdGlvbiBleHRlbmRzIElQYXJhbWV0ZXJpemFibGUsIElEYXRhUHJvdmlkYWJsZSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUxpc3RlbmVyc0Fubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JTGlzdGVuZXJzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMWYzODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSUxpc3RlbmVyc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdMaXN0ZW5lcjsKKworcHVibGljIGludGVyZmFjZSBJTGlzdGVuZXJzQW5ub3RhdGlvbiBleHRlbmRzIElBbm5vdGF0aW9uIHsKKworICBDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPltdIGdldFZhbHVlKCk7CisKKyAgdm9pZCBzZXRWYWx1ZShDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPltdIHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JT2JqZWN0RmFjdG9yeUFubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JT2JqZWN0RmFjdG9yeUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMWQ5OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lPYmplY3RGYWN0b3J5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworLyoqCisgKiBAYXV0aG9yIEhhbmkgU3VsZWltYW4KKyAqICAgICAgICAgRGF0ZTogTWFyIDYsIDIwMDcKKyAqICAgICAgICAgVGltZTogMjoxNjoxMyBQTQorICovCitwdWJsaWMgaW50ZXJmYWNlIElPYmplY3RGYWN0b3J5QW5ub3RhdGlvbiBleHRlbmRzIElBbm5vdGF0aW9uCit7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSVBhcmFtZXRlcml6YWJsZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lQYXJhbWV0ZXJpemFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yY2JjYWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lQYXJhbWV0ZXJpemFibGUuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKKy8qKgorICogUGFyZW50IGludGVyZmFjZSBmb3IgYW5ub3RhdGlvbnMgdGhhdCBjYW4gcmVjZWl2ZSBwYXJhbWV0ZXJzLgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVBhcmFtZXRlcml6YWJsZSBleHRlbmRzIElBbm5vdGF0aW9uIHsKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIHZhcmlhYmxlcyB1c2VkIHRvIGZpbGwgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QuCisgICAqIFRoZXNlIHZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVzZSBAUGFyYW1ldGVycworICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoKTsKKworICAvKioKKyAgICogV2hldGhlciB0aGlzIGFubm90YXRpb24gaXMgZW5hYmxlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKTsKKyAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lQYXJhbWV0ZXJzQW5ub3RhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lQYXJhbWV0ZXJzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3OWEwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSVBhcmFtZXRlcnNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCisvKioKKyAqIEVuY2Fwc3VsYXRlIHRoZSBAUGFyYW1ldGVycyAvIEB0ZXN0bmcucGFyYW1ldGVycyBhbm5vdGF0aW9uCisgKgorICogQ3JlYXRlZCBvbiBEZWMgMjAsIDIwMDUKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJUGFyYW1ldGVyc0Fubm90YXRpb24gZXh0ZW5kcyBJQW5ub3RhdGlvbiB7CisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdXNlZCB0byBmaWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLgorICAgKiBUaGVzZSB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHlvdXIgdGVzdG5nLnhtbCBmaWxlLgorICAgKiBGb3IgZXhhbXBsZQorICAgKiA8cD4KKyAgICogPGNvZGU+CisgICAqICYjMDY0O1BhcmFtZXRlcnMoeyAieG1sUGF0aCIgfSk8YnI+CisgICAqICYjMDY0O1Rlc3Q8YnI+CisgICAqIHB1YmxpYyB2b2lkIHZlcmlmeVhtbEZpbGUoU3RyaW5nIHBhdGgpIHsgLi4uIH08YnI+CisgICAqIDwvY29kZT4KKyAgICogPHA+YW5kIGluIDx0dD50ZXN0bmcueG1sPC90dD46PHA+CisgICAqIDxjb2RlPgorICAgKiAmbHQ7cGFyYW1ldGVyIG5hbWU9InhtbFBhdGgiIHZhbHVlPSJhY2NvdW50LnhtbCIgLyZndDs8YnI+CisgICAqIDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZSgpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSVRlc3RBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvSVRlc3RBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM2MzQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JVGVzdEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklSZXRyeUFuYWx5emVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSURhdGFQcm92aWRhYmxlOworCisvKioKKyAqIEVuY2Fwc3VsYXRlIHRoZSAmIzY0O1Rlc3QgLyAmIzY0O3Rlc3RuZy50ZXN0IGFubm90YXRpb24uCisgKgorICogQ3JlYXRlZCBvbiBEZWMgMjAsIDIwMDUKKyAqIEBhdXRob3IgPGEgaHJlZiA9ICJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdEFubm90YXRpb24gZXh0ZW5kcyBJVGVzdE9yQ29uZmlndXJhdGlvbiwgSURhdGFQcm92aWRhYmxlIHsKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZC4KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbnZva2VkLgorICAgKi8KKyAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKTsKKyAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkNvdW50KGludCBsKTsKKworICAvKioKKyAgICogVGhlIHNpemUgb2YgdGhlIHRocmVhZCBwb29sIGZvciB0aGlzIG1ldGhvZC4gIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCisgICAqIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhcyBzcGVjaWZpZWQgYnkgaW52b2NhdGlvbkNvdW50LgorICAgKiBOb3RlOiAgdGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiBpbnZvY2F0aW9uQ291bnQgaXMgbm90IHNwZWNpZmllZAorICAgKi8KKyAgcHVibGljIGludCBnZXRUaHJlYWRQb29sU2l6ZSgpOworICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRQb29sU2l6ZShpbnQgbik7CisKKyAgLyoqCisgICAqIFRoZSBwZXJjZW50YWdlIG9mIHN1Y2Nlc3MgZXhwZWN0ZWQgZnJvbSB0aGlzIG1ldGhvZC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKTsKKyAgcHVibGljIHZvaWQgc2V0U3VjY2Vzc1BlcmNlbnRhZ2UoaW50IHMpOworCisgIC8qKgorICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBydW4gZXZlbiBpZiBpdCBkZXBlbmRzCisgICAqIG9uIGEgbWV0aG9kIHRoYXQgZmFpbGVkLiAgVGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGlmIHRoaXMgdGVzdAorICAgKiBkb2Vzbid0IGRlcGVuZCBvbiBhbnkgbWV0aG9kIG9yIGdyb3VwLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0QWx3YXlzUnVuKCk7CisgIHB1YmxpYyB2b2lkIHNldEFsd2F5c1J1bihib29sZWFuIGYpOworCisgIHB1YmxpYyBDbGFzczw/PltdIGdldEV4cGVjdGVkRXhjZXB0aW9ucygpOworICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEV4Y2VwdGlvbnMoQ2xhc3M8Pz5bXSBlKTsKKworICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAoKTsKKyAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cChTdHJpbmcgZSk7CisKKyAgcHVibGljIFN0cmluZyBnZXRTdWl0ZU5hbWUoKTsKKyAgcHVibGljIHZvaWQgc2V0U3VpdGVOYW1lKFN0cmluZyBzKTsKKworICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCk7CisgIHB1YmxpYyB2b2lkIHNldFRlc3ROYW1lKFN0cmluZyBzKTsKKworICBwdWJsaWMgYm9vbGVhbiBnZXRTZXF1ZW50aWFsKCk7CisgIHB1YmxpYyB2b2lkIHNldFNlcXVlbnRpYWwoYm9vbGVhbiBmKTsKKworICBwdWJsaWMgYm9vbGVhbiBnZXRTaW5nbGVUaHJlYWRlZCgpOworICBwdWJsaWMgdm9pZCBzZXRTaW5nbGVUaHJlYWRlZChib29sZWFuIGYpOworCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVByb3ZpZGVyKCk7CisgIHB1YmxpYyB2b2lkIHNldERhdGFQcm92aWRlcihTdHJpbmcgdik7CisKKyAgcHVibGljIENsYXNzPD8+IGdldERhdGFQcm92aWRlckNsYXNzKCk7CisgIHB1YmxpYyB2b2lkIHNldERhdGFQcm92aWRlckNsYXNzKENsYXNzPD8+IHYpOworCisgIHB1YmxpYyBJUmV0cnlBbmFseXplciBnZXRSZXRyeUFuYWx5emVyKCk7CisgIHB1YmxpYyB2b2lkIHNldFJldHJ5QW5hbHl6ZXIoQ2xhc3M8Pz4gYyk7CisKKyAgcHVibGljIGJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25zKCk7CisgIHB1YmxpYyB2b2lkIHNldFNraXBGYWlsZWRJbnZvY2F0aW9ucyhib29sZWFuIHNraXApOworCisgIHB1YmxpYyBsb25nIGludm9jYXRpb25UaW1lT3V0KCk7CisgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25UaW1lT3V0KGxvbmcgdGltZU91dCk7CisKKyAgcHVibGljIGJvb2xlYW4gaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpOworICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKGJvb2xlYW4gaWdub3JlKTsKKworICAvKioKKyAgICogVGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkuIExvd2VyIHByaW9yaXRpZXMgZ2V0IHNjaGVkdWxlZCBmaXJzdC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKTsKKyAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JVGVzdE9yQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL0lUZXN0T3JDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE2Yzg2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9JVGVzdE9yQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBjYXB0dXJlcyBtZXRob2RzIGNvbW1vbiB0byBAVGVzdCBhbmQgQENvbmZpZ3VyYXRpb24KKyAqCisgKiBDcmVhdGVkIG9uIERlYyAyMCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElUZXN0T3JDb25maWd1cmF0aW9uIGV4dGVuZHMgSVBhcmFtZXRlcml6YWJsZSB7CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyB0ZXN0IHNob3VsZCB0YWtlLgorICAgKiBJZiBpdCBoYXNuJ3QgcmV0dXJuZWQgYWZ0ZXIgdGhpcyB0aW1lLCBpdCB3aWxsIGJlIG1hcmtlZCBhcyBhIEZBSUwuCisgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGlzIHRlc3Qgc2hvdWxkIHRha2UuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRUaW1lT3V0KCk7CisgIHB1YmxpYyB2b2lkIHNldFRpbWVPdXQobG9uZyBsKTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgY2xhc3MvbWV0aG9kIGJlbG9uZ3MgdG8uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCk7CisgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhTdHJpbmdbXSBncm91cHMpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIEV2ZXJ5IG1ldGhvZAorICAgKiBtZW1iZXIgb2Ygb25lIG9mIHRoZXNlIGdyb3VwcyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYmVlbgorICAgKiBpbnZva2VkIGJlZm9yZSB0aGlzIG1ldGhvZC4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVwZW5kc09uR3JvdXBzKCk7CisgIHB1YmxpYyB2b2lkIHNldERlcGVuZHNPbkdyb3VwcyhTdHJpbmdbXSBncm91cHMpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVwZW5kc09uTWV0aG9kcygpOworICBwdWJsaWMgdm9pZCBzZXREZXBlbmRzT25NZXRob2RzKFN0cmluZ1tdIGRlcGVuZHNPbk1ldGhvZHMpOworCisgIC8qKgorICAgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgbWV0aG9kLCB3aGljaCB3aWxsIGJlIHNob3duIGluIHRoZSByZXBvcnRzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOworICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvTGlzdGVuZXJzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvTGlzdGVuZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiNTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9MaXN0ZW5lcnMuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUFubm90YXRpb25UcmFuc2Zvcm1lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklBbm5vdGF0aW9uVHJhbnNmb3JtZXIyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR0xpc3RlbmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBUaGlzIGFubm90YXRpb24gbGV0cyB5b3UgZGVmaW5lIGxpc3RlbmVycyBkaXJlY3RseSBvbiBhIHRlc3QgY2xhc3MKKyAqIGluc3RlYWQgb2YgZG9pbmcgc28gaW4geW91ciB0ZXN0bmcueG1sLiAgQW55IGNsYXNzIHRoYXQgaW1wbGVtZW50cworICogdGhlIGludGVyZmFjZSB7QGxpbmsgb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXJ9IGlzIGFsbG93ZWQsCisgKiBleGNlcHQge0BsaW5rIElBbm5vdGF0aW9uVHJhbnNmb3JtZXJ9IGFuZCB7QGxpbmsgSUFubm90YXRpb25UcmFuc2Zvcm1lcjJ9LAorICogd2hpY2ggbmVlZCB0byBiZSBkZWZpbmVkIGluIFhNTCBzaW5jZSB0aGV5IGhhdmUgdG8gYmUga25vd24gYmVmb3JlIHdlIGV2ZW4KKyAqIHN0YXJ0IGxvb2tpbmcgZm9yIGFubm90YXRpb25zLgorICoKKyAqIE5vdGUgdGhhdCBsaXN0ZW5lcnMgc3BlY2lmaWVkIHRoaXMgd2F5IGFyZSBnbG9iYWwgdG8geW91ciBlbnRpcmUgc3VpdGUsIGp1c3QKKyAqIGxpa2UgbGlzdGVuZXJzIHNwZWNpZmllZCBpbiB0ZXN0bmcueG1sLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXIgMjYsIDIwMTAKKyAqCisgKi8KK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtUWVBFfSkKK3B1YmxpYyBAaW50ZXJmYWNlIExpc3RlbmVycyB7CisgIENsYXNzPD8gZXh0ZW5kcyBJVGVzdE5HTGlzdGVuZXI+W10gdmFsdWUoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL05vSW5qZWN0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvTm9JbmplY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU3OGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL05vSW5qZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVHVybiBvZmYgVGVzdE5HIGluamVjdGlvbiBmb3IgYSBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEp1bHkgOXRoLCAyMDEwCisgKi8KK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtQQVJBTUVURVJ9KQorcHVibGljIEBpbnRlcmZhY2UgTm9JbmplY3Rpb24geworfQorCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvT2JqZWN0RmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjdhZWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIE1hcmtzIGEgbWV0aG9kIGFzIHRoZSBvYmplY3QgZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW5nIGFsbCB0ZXN0IGluc3RhbmNlcy4KKyAqIFRoZSB0ZXN0IGNsYXNzZXMgY2FuIG9ubHkgY29udGFpbiBvbmUgbWV0aG9kIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiwKKyAqIGFuZCB0aGUgbWV0aG9kIG11c3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcudGVzdG5nLklUZXN0T2JqZWN0RmFjdG9yeX0uCisgKgorICogQGF1dGhvciBIYW5pIFN1bGVpbWFuCisgKiBAc2luY2UgNS42CisgKi8KK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIE9iamVjdEZhY3RvcnkKK3sKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9PcHRpb25hbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL09wdGlvbmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ2MzU3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9PcHRpb25hbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5QYXJhbWV0ZXJzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBTcGVjaWZpZXMgdGhhdCB0aGUgY3VycmVudCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuICBUZXN0Tkcgd2lsbCBwYXNzCisgKiBpbiBhIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIHNwZWNpZmllZC4KKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7UEFSQU1FVEVSfSkKK3B1YmxpYyBAaW50ZXJmYWNlIE9wdGlvbmFsIHsKKyAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHBhc3MgdG8gdGhpcyBwYXJhbWV0ZXIuICA8cD5UaGUgZGVmYXVsdCBkZXNlcnZlcworICAgKiBhIGJpdCBvZiBleHBsYW5hdGlvbi4gIEpTUi0xNzUgKHdoaWNoIGRlZmluZXMgYW5ub3RhdGlvbnMpIHNheXMgdGhhdAorICAgKiBKYXZhIGFubm90YXRpb24gcGFyYW1ldGVycyBjYW4gb25seSBiZSBDb25zdGFudEV4cHJlc3Npb25zLCB3aGljaAorICAgKiBjYW4gYmUgcHJpbWl0aXZlL3N0cmluZyBsaXRlcmFscywgYnV0IG5vdCA8Y29kZT5udWxsPC9jb2RlPi48L3A+CisgICAqIDxwPkluIHRoaXMgY2FzZSwgd2UgdXNlIHRoaXMgc3RyaW5nIGFzIGEgc3Vic3RpdHV0ZQorICAgKiBmb3IgPGNvZGU+bnVsbDwvY29kZT47IGluIHByYWN0aWNlLCBUZXN0Tkcgd2lsbCBwYXNzIDxjb2RlPm51bGw8L2NvZGU+CisgICAqIHRvIHlvdXIgY29kZSwgYW5kIG5vdCB0aGUgc3RyaW5nICJudWxsIiwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5CisgICAqIGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGluIHRoaXMgcGFyYW1ldGVyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgUGFyYW1ldGVycy5OVUxMX1ZBTFVFOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL1BhcmFtZXRlcnMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9QYXJhbWV0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDUwM2RlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hbm5vdGF0aW9ucy9QYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBEZXNjcmliZXMgaG93IHRvIHBhc3MgcGFyYW1ldGVycyB0byBhICYjNjQ7VGVzdCBtZXRob2QuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7TUVUSE9ELCBDT05TVFJVQ1RPUiwgVFlQRSB9KQorcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVycyB7CisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdXNlZCB0byBmaWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLgorICAgKiBUaGVzZSB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHlvdXIgdGVzdG5nLnhtbCBmaWxlLgorICAgKiBGb3IgZXhhbXBsZQorICAgKiA8cD4KKyAgICogPGNvZGU+CisgICAqICYjMDY0O1BhcmFtZXRlcnMoeyAieG1sUGF0aCIgfSk8YnI+CisgICAqICYjMDY0O1Rlc3Q8YnI+CisgICAqIHB1YmxpYyB2b2lkIHZlcmlmeVhtbEZpbGUoU3RyaW5nIHBhdGgpIHsgLi4uIH08YnI+CisgICAqIDwvY29kZT4KKyAgICogPHA+YW5kIGluIDx0dD50ZXN0bmcueG1sPC90dD46PHA+CisgICAqIDxjb2RlPgorICAgKiAmbHQ7cGFyYW1ldGVyIG5hbWU9InhtbFBhdGgiIHZhbHVlPSJhY2NvdW50LnhtbCIgLyZndDs8YnI+CisgICAqIDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB2YWx1ZSgpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvVGVzdC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YzdmODEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL1Rlc3QuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIE1hcmsgYSBjbGFzcyBvciBhIG1ldGhvZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBcHIgMjYsIDIwMDQKKyAqLworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe01FVEhPRCwgVFlQRSwgQ09OU1RSVUNUT1J9KQorcHVibGljIEBpbnRlcmZhY2UgVGVzdCB7CisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgIC8qKgorICAgKiBXaGV0aGVyIG1ldGhvZHMgb24gdGhpcyBjbGFzcy9tZXRob2QgYXJlIGVuYWJsZWQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdXNlZCB0byBmaWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kLgorICAgKiBUaGVzZSB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBVc2UgQFBhcmFtZXRlcnMKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTdHJpbmdbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIG1ldGhvZHMgdGhpcyBtZXRob2QgZGVwZW5kcyBvbi4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZQorICAgKiBvbiB0aGUgb3JkZXIgb24gd2hpY2ggdGhlIG1ldGhvZHMgZGVwZW5kZWQgdXBvbiB3aWxsIGJlIHJ1biwgYnV0IHlvdQorICAgKiBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCB0aGVzZSBtZXRob2RzIHdpbGwgYmUgcnVuIGJlZm9yZSB0aGUgdGVzdCBtZXRob2QKKyAgICogdGhhdCBjb250YWlucyB0aGlzIGFubm90YXRpb24gaXMgcnVuLiAgRnVydGhlcm1vcmUsIGlmIGFueSBvZiB0aGVzZQorICAgKiBtZXRob2RzIHdhcyBub3QgYSBTVUNDRVNTLCB0aGlzIHRlc3QgbWV0aG9kIHdpbGwgbm90IGJlCisgICAqIHJ1biBhbmQgd2lsbCBiZSBmbGFnZ2VkIGFzIGEgU0tJUC4KKyAgICoKKyAgICogSWYgc29tZSBvZiB0aGVzZSBtZXRob2RzIGhhdmUgYmVlbiBvdmVybG9hZGVkLCBhbGwgdGhlIG92ZXJsb2FkZWQKKyAgICogdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyB0ZXN0IHNob3VsZCB0YWtlLgorICAgKiBJZiBpdCBoYXNuJ3QgcmV0dXJuZWQgYWZ0ZXIgdGhpcyB0aW1lLCBpdCB3aWxsIGJlIG1hcmtlZCBhcyBhIEZBSUwuCisgICAqLworICBwdWJsaWMgbG9uZyB0aW1lT3V0KCkgZGVmYXVsdCAwOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBpbnZvY2F0aW9ucyBvbiB0aGlzIHRlc3QKKyAgICogbWV0aG9kIHNob3VsZCB0YWtlLiAgVGhpcyBhbm5vdGF0aW9uIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgYXR0cmlidXRlIGludm9jYXRpb25Db3VudAorICAgKiBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoaXMgbWV0aG9kLgorICAgKiBJZiBpdCBoYXNuJ3QgcmV0dXJuZWQgYWZ0ZXIgdGhpcyB0aW1lLCBpdCB3aWxsIGJlIG1hcmtlZCBhcyBhIEZBSUwuCisgICAqLworICBwdWJsaWMgbG9uZyBpbnZvY2F0aW9uVGltZU91dCgpIGRlZmF1bHQgMDsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZC4KKyAgICovCisgIHB1YmxpYyBpbnQgaW52b2NhdGlvbkNvdW50KCkgZGVmYXVsdCAxOworCisgIC8qKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wgZm9yIHRoaXMgbWV0aG9kLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQKKyAgICogZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGFzIHNwZWNpZmllZCBieSBpbnZvY2F0aW9uQ291bnQuCisgICAqIE5vdGU6ICB0aGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmIGludm9jYXRpb25Db3VudCBpcyBub3Qgc3BlY2lmaWVkCisgICAqLworICBwdWJsaWMgaW50IHRocmVhZFBvb2xTaXplKCkgZGVmYXVsdCAwOworCisgIC8qKgorICAgKiBUaGUgcGVyY2VudGFnZSBvZiBzdWNjZXNzIGV4cGVjdGVkIGZyb20gdGhpcyBtZXRob2QuCisgICAqLworICBwdWJsaWMgaW50IHN1Y2Nlc3NQZXJjZW50YWdlKCkgZGVmYXVsdCAxMDA7CisKKyAgLyoqCisgICAqIFRoZSBuYW1lIG9mIHRoZSBkYXRhIHByb3ZpZGVyIGZvciB0aGlzIHRlc3QgbWV0aG9kLgorICAgKiBAc2VlIG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyCisgICAqLworICBwdWJsaWMgU3RyaW5nIGRhdGFQcm92aWRlcigpIGRlZmF1bHQgIiI7CisKKyAgLyoqCisgICAqIFRoZSBjbGFzcyB3aGVyZSB0byBsb29rIGZvciB0aGUgZGF0YSBwcm92aWRlci4gIElmIG5vdAorICAgKiBzcGVjaWZpZWQsIHRoZSBkYXRhcHJvdmlkZXIgd2lsbCBiZSBsb29rZWQgb24gdGhlIGNsYXNzCisgICAqIG9mIHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIG9yIG9uZSBvZiBpdHMgc3VwZXIgY2xhc3Nlcy4KKyAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGF0YSBwcm92aWRlciBtZXRob2QKKyAgICogbmVlZHMgdG8gYmUgc3RhdGljIG9uIHRoZSBzcGVjaWZpZWQgY2xhc3MuCisgICAqLworICBwdWJsaWMgQ2xhc3M8Pz4gZGF0YVByb3ZpZGVyQ2xhc3MoKSBkZWZhdWx0IE9iamVjdC5jbGFzczsKKworICAvKioKKyAgICogSWYgc2V0IHRvIHRydWUsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBhbHdheXMgYmUgcnVuIGV2ZW4gaWYgaXQgZGVwZW5kcworICAgKiBvbiBhIG1ldGhvZCB0aGF0IGZhaWxlZC4gIFRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZCBpZiB0aGlzIHRlc3QKKyAgICogZG9lc24ndCBkZXBlbmQgb24gYW55IG1ldGhvZCBvciBncm91cC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGFsd2F5c1J1bigpIGRlZmF1bHQgZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBtZXRob2QuICBUaGUgc3RyaW5nIHVzZWQgd2lsbCBhcHBlYXIgaW4gdGhlCisgICAqIEhUTUwgcmVwb3J0IGFuZCBhbHNvIG9uIHN0YW5kYXJkIG91dHB1dCBpZiB2ZXJib3NlID49IDIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IGEgdGVzdCBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gdGhyb3cuICBJZiBubworICAgKiBleGNlcHRpb24gb3IgYSBkaWZmZXJlbnQgdGhhbiBvbmUgb24gdGhpcyBsaXN0IGlzIHRocm93biwgdGhpcyB0ZXN0IHdpbGwgYmUKKyAgICogbWFya2VkIGEgZmFpbHVyZS4KKyAgICovCisgIHB1YmxpYyBDbGFzc1tdIGV4cGVjdGVkRXhjZXB0aW9ucygpIGRlZmF1bHQge307CisKKyAgLyoqCisgICAqIElmIGV4cGVjdGVkRXhjZXB0aW9ucyB3YXMgc3BlY2lmaWVkLCBpdHMgbWVzc2FnZSBtdXN0IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogc3BlY2lmaWVkIGluIHRoaXMgYXR0cmlidXRlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBleHBlY3RlZEV4Y2VwdGlvbnNNZXNzYWdlUmVnRXhwKCkgZGVmYXVsdCAiLioiOworCisgIC8qKgorICAgKiBUaGUgbmFtZSBvZiB0aGUgc3VpdGUgdGhpcyB0ZXN0IGNsYXNzIHNob3VsZCBiZSBwbGFjZWQgaW4uICBUaGlzCisgICAqIGF0dHJpYnV0ZSBpcyBpZ25vcmUgaWYgQFRlc3QgaXMgbm90IGF0IHRoZSBjbGFzcyBsZXZlbC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgc3VpdGVOYW1lKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgIHRoaXMgdGVzdCBjbGFzcyBzaG91bGQgYmUgcGxhY2VkIGluLiAgVGhpcworICAgKiBhdHRyaWJ1dGUgaXMgaWdub3JlIGlmIEBUZXN0IGlzIG5vdCBhdCB0aGUgY2xhc3MgbGV2ZWwuCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRlc3ROYW1lKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogQGRlcHJlY2F0ZWQgVXNlIHNpbmdsZVRocmVhZGVkCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBzZXF1ZW50aWFsKCkgZGVmYXVsdCBmYWxzZTsKKworICAvKioKKyAgICogSWYgc2V0IHRvIHRydWUsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGlzIHRlc3QgY2xhc3MgYXJlIGd1YXJhbnRlZWQgdG8gcnVuCisgICAqIGluIHRoZSBzYW1lIHRocmVhZCwgZXZlbiBpZiB0aGUgdGVzdHMgYXJlIGN1cnJlbnRseSBiZWluZyBydW4gd2l0aCBwYXJhbGxlbD0idHJ1ZSIuCisgICAqCisgICAqIFRoaXMgYXR0cmlidXRlIGNhbiBvbmx5IGJlIHVzZWQgYXQgdGhlIGNsYXNzIGxldmVsIGFuZCB3aWxsIGJlIGlnbm9yZWQKKyAgICogaWYgdXNlZCBhdCB0aGUgbWV0aG9kIGxldmVsLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc2luZ2xlVGhyZWFkZWQoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHRvIHRlc3QgaWYgdGhlIHRlc3QKKyAgICogc2hvdWxkIGJlIHJldHJpZWQuCisgICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgdGVzdCBpZiBhIHRlc3QgbWV0aG9kCisgICAqIHNob3VsZCBiZSByZXRyaWVkLgorICAgKi8KKyAgcHVibGljIENsYXNzIHJldHJ5QW5hbHl6ZXIoKSBkZWZhdWx0IENsYXNzLmNsYXNzOworCisgIC8qKgorICAgKiBJZiB0cnVlIGFuZCBpbnZvY2F0aW9uQ291bnQgaXMgc3BlY2lmaWVkIHdpdGggYSB2YWx1ZSA+IDEsCisgICAqIHRoZW4gYWxsIGludm9jYXRpb25zIGFmdGVyIGEgZmFpbHVyZSB3aWxsIGJlIG1hcmtlZCBhcyBhIFNLSVAKKyAgICogaW5zdGVhZCBvZiBhIEZBSUwuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBza2lwRmFpbGVkSW52b2NhdGlvbnMoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB0ZXN0IHdpbGwgcnVuIGV2ZW4gaWYgdGhlIG1ldGhvZHMKKyAgICogaXQgZGVwZW5kcyBvbiBhcmUgbWlzc2luZyBvciBleGNsdWRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoKSBkZWZhdWx0IGZhbHNlOworCisgIC8qKgorICAgKiBUaGUgc2NoZWR1bGluZyBwcmlvcml0eS4gTG93ZXIgcHJpb3JpdGllcyB3aWxsIGJlIHNjaGVkdWxlZCBmaXJzdC4KKyAgICovCisgIGludCBwcmlvcml0eSgpIGRlZmF1bHQgMDsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL1Rlc3RJbnN0YW5jZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fubm90YXRpb25zL1Rlc3RJbnN0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyYTQwODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYW5ub3RhdGlvbnMvVGVzdEluc3RhbmNlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFubm90YXRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSWYgdGhpcyBhbm5vdGF0aW9uIGlzIHVzZWQgb24gYSBwYXJhbWV0ZXIgb2YgYSBkYXRhIHByb3ZpZGVyLCB0aGF0IHBhcmFtZXRlciBpcyB0aGUgaW5zdGFuY2UKKyAqIG9mIHRoZSB0ZXN0IG1ldGhvZCB3aGljaCBpcyBnb2luZyB0byBiZSBmZWQgYnkgdGhpcyBkYXRhIHByb3ZpZGVyLgorICoKKyAqIFRoaXMgYW5ub3RhdGlvbiBpcyBpZ25vcmVkIGV2ZXJ5d2hlcmUgZWxzZS4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7UEFSQU1FVEVSfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFRlc3RJbnN0YW5jZSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYXNzZXJ0cy9Bc3NlcnRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0Fzc2VydGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGRmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYXNzZXJ0cy9Bc3NlcnRpb24uamF2YQpAQCAtMCwwICsxLDcwOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmFzc2VydHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQW4gYXNzZXJ0IGNsYXNzIHdpdGggdmFyaW91cyBob29rcyBhbGxvd2luZyBpdHMgYmVoYXZpb3IgdG8gYmUgbW9kaWZpZWQKKyAqIGJ5IHN1YmNsYXNzZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRpb24gaW1wbGVtZW50cyBJQXNzZXJ0TGlmZWN5Y2xlIHsKKyAgcHJvdGVjdGVkIHZvaWQgZG9Bc3NlcnQoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKSB7CisgICAgb25CZWZvcmVBc3NlcnQoYXNzZXJ0Q29tbWFuZCk7CisgICAgdHJ5IHsKKyAgICAgIGV4ZWN1dGVBc3NlcnQoYXNzZXJ0Q29tbWFuZCk7CisgICAgICBvbkFzc2VydFN1Y2Nlc3MoYXNzZXJ0Q29tbWFuZCk7CisgICAgfSBjYXRjaChBc3NlcnRpb25FcnJvciBleCkgeworICAgICAgb25Bc3NlcnRGYWlsdXJlKGFzc2VydENvbW1hbmQsIGV4KTsKKyAgICAgIHRocm93IGV4OworICAgIH0gZmluYWxseSB7CisgICAgICBvbkFmdGVyQXNzZXJ0KGFzc2VydENvbW1hbmQpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSdW4gdGhlIGFzc2VydCBjb21tYW5kIGluIHBhcmFtZXRlci4gTWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGV4ZWN1dGVBc3NlcnQoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKSB7CisgICAgYXNzZXJ0Q29tbWFuZC5kb0Fzc2VydCgpOworICB9CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBhbiBhc3NlcnQgc3VjY2VlZHMuIE1lYW50IHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkFzc2VydFN1Y2Nlc3MoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKSB7CisgIH0KKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIGFuIGFzc2VydCBmYWlscy4gTWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgKiAKKyAgICogQGRlcHJlY2F0ZWQgdXNlIG9uQXNzZXJ0RmFpbHVyZShJQXNzZXJ0IGFzc2VydENvbW1hbmQsIEFzc2VydGlvbkVycm9yIGV4KSBpbnN0ZWFkIG9mLgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQXNzZXJ0RmFpbHVyZShJQXNzZXJ0PD8+IGFzc2VydENvbW1hbmQpIHsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQXNzZXJ0RmFpbHVyZShJQXNzZXJ0PD8+IGFzc2VydENvbW1hbmQsIEFzc2VydGlvbkVycm9yIGV4KSB7CisgICAgICBvbkFzc2VydEZhaWx1cmUoYXNzZXJ0Q29tbWFuZCk7CisgIH0KKworICAvKioKKyAgICogSW52b2tlZCBiZWZvcmUgYW4gYXNzZXJ0IGlzIHJ1bi4gTWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQmVmb3JlQXNzZXJ0KElBc3NlcnQ8Pz4gYXNzZXJ0Q29tbWFuZCkgeworICB9CisKKyAgLyoqCisgICAqIEludm9rZWQgYWZ0ZXIgYW4gYXNzZXJ0IGlzIHJ1bi4gTWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQWZ0ZXJBc3NlcnQoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKSB7CisgIH0KKworICBhYnN0cmFjdCBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVBc3NlcnQ8VD4gaW1wbGVtZW50cyBJQXNzZXJ0PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFQgYWN0dWFsOworICAgIHByaXZhdGUgZmluYWwgVCBleHBlY3RlZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtX21lc3NhZ2U7CisKKyAgICBwdWJsaWMgU2ltcGxlQXNzZXJ0KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICB0aGlzKG51bGwsIG51bGwsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBTaW1wbGVBc3NlcnQoVCBhY3R1YWwsIFQgZXhwZWN0ZWQpIHsKKyAgICAgIHRoaXMoYWN0dWFsLCBleHBlY3RlZCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNpbXBsZUFzc2VydChUIGFjdHVhbCwgVCBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHRoaXMuYWN0dWFsID0gYWN0dWFsOworICAgICAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkOworICAgICAgbV9tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICByZXR1cm4gbV9tZXNzYWdlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGdldEFjdHVhbCgpIHsKKyAgICAgICAgcmV0dXJuIGFjdHVhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBnZXRFeHBlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIGV4cGVjdGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCk7CisgIH0KKworCisgIHB1YmxpYyB2b2lkIGFzc2VydFRydWUoZmluYWwgYm9vbGVhbiBjb25kaXRpb24sIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxCb29sZWFuPihjb25kaXRpb24sIEJvb2xlYW4uVFJVRSwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZShjb25kaXRpb24sIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisgIAorCXB1YmxpYyB2b2lkIGFzc2VydFRydWUoZmluYWwgYm9vbGVhbiBjb25kaXRpb24pIHsKKwkJZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxCb29sZWFuPihjb25kaXRpb24sIEJvb2xlYW4uVFJVRSkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKwkJCQlvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlKGNvbmRpdGlvbik7CisJCQl9CisJCX0pOworCX0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRGYWxzZShmaW5hbCBib29sZWFuIGNvbmRpdGlvbiwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEJvb2xlYW4+KGNvbmRpdGlvbiwgQm9vbGVhbi5GQUxTRSwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RmFsc2UoY29uZGl0aW9uLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEZhbHNlKGZpbmFsIGJvb2xlYW4gY29uZGl0aW9uKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxCb29sZWFuPihjb25kaXRpb24sIEJvb2xlYW4uRkFMU0UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmRpdGlvbik7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBmYWlsKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgcmVhbENhdXNlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmZhaWwobWVzc2FnZSwgcmVhbENhdXNlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZhaWwoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdD4obWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuZmFpbChtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZhaWwoKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KG51bGwpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmZhaWwoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyA8VD4gdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgVCBhY3R1YWwsIGZpbmFsIFQgZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxUPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgPFQ+IHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIFQgYWN0dWFsLCBmaW5hbCBUIGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxUPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgU3RyaW5nIGFjdHVhbCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8U3RyaW5nPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIFN0cmluZyBhY3R1YWwsIGZpbmFsIFN0cmluZyBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8U3RyaW5nPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgZG91YmxlIGFjdHVhbCwgZmluYWwgZG91YmxlIGV4cGVjdGVkLCBmaW5hbCBkb3VibGUgZGVsdGEsCisgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8RG91YmxlPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGRvdWJsZSBhY3R1YWwsIGZpbmFsIGRvdWJsZSBleHBlY3RlZCwgZmluYWwgZG91YmxlIGRlbHRhKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxEb3VibGU+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgZmxvYXQgYWN0dWFsLCBmaW5hbCBmbG9hdCBleHBlY3RlZCwgZmluYWwgZmxvYXQgZGVsdGEsCisgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8RmxvYXQ+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgZmxvYXQgYWN0dWFsLCBmaW5hbCBmbG9hdCBleHBlY3RlZCwgZmluYWwgZmxvYXQgZGVsdGEpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEZsb2F0PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGxvbmcgYWN0dWFsLCBmaW5hbCBsb25nIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8TG9uZz4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGxvbmcgYWN0dWFsLCBmaW5hbCBsb25nIGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxMb25nPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgYm9vbGVhbiBhY3R1YWwsIGZpbmFsIGJvb2xlYW4gZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxCb29sZWFuPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgYm9vbGVhbiBhY3R1YWwsIGZpbmFsIGJvb2xlYW4gZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEJvb2xlYW4+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhmaW5hbCBieXRlIGFjdHVhbCwgZmluYWwgYnl0ZSBleHBlY3RlZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEJ5dGU+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhmaW5hbCBieXRlIGFjdHVhbCwgZmluYWwgYnl0ZSBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Qnl0ZT4oYWN0dWFsLCBleHBlY3RlZCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGNoYXIgYWN0dWFsLCBmaW5hbCBjaGFyIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Q2hhcmFjdGVyPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgY2hhciBhY3R1YWwsIGZpbmFsIGNoYXIgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PENoYXJhY3Rlcj4oYWN0dWFsLCBleHBlY3RlZCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIHNob3J0IGFjdHVhbCwgZmluYWwgc2hvcnQgZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxTaG9ydD4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIHNob3J0IGFjdHVhbCwgZmluYWwgc2hvcnQgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PFNob3J0PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgaW50IGFjdHVhbCwgZmluYWwgIGludCBleHBlY3RlZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEludGVnZXI+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhmaW5hbCBpbnQgYWN0dWFsLCBmaW5hbCBpbnQgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEludGVnZXI+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoZmluYWwgT2JqZWN0IG9iamVjdCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8T2JqZWN0PihvYmplY3QsIG51bGwpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdE51bGwob2JqZWN0KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdD4ob2JqZWN0LCBudWxsLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3ROdWxsKG9iamVjdCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnROdWxsKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdD4ob2JqZWN0LCBudWxsKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROdWxsKG9iamVjdCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnROdWxsKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KG9iamVjdCwgbnVsbCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0TnVsbChvYmplY3QsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShmaW5hbCBPYmplY3QgYWN0dWFsLCBmaW5hbCBPYmplY3QgZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKGZpbmFsIE9iamVjdCBhY3R1YWwsIGZpbmFsIE9iamVjdCBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8T2JqZWN0PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRTYW1lKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0Tm90U2FtZShmaW5hbCBPYmplY3QgYWN0dWFsLCBmaW5hbCBPYmplY3QgZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnROb3RTYW1lKGZpbmFsIE9iamVjdCBhY3R1YWwsIGZpbmFsIE9iamVjdCBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8T2JqZWN0PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RTYW1lKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIENvbGxlY3Rpb248Pz4gYWN0dWFsLCBmaW5hbCBDb2xsZWN0aW9uPD8+IGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxDb2xsZWN0aW9uPD8+PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgQ29sbGVjdGlvbjw/PiBhY3R1YWwsIGZpbmFsIENvbGxlY3Rpb248Pz4gZXhwZWN0ZWQsCisgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Q29sbGVjdGlvbjw/Pj4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIE9iamVjdFtdIGFjdHVhbCwgZmluYWwgT2JqZWN0W10gZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3RbXT4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzTm9PcmRlcihmaW5hbCBPYmplY3RbXSBhY3R1YWwsIGZpbmFsIE9iamVjdFtdIGV4cGVjdGVkLAorICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdFtdPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIE9iamVjdFtdIGFjdHVhbCwgZmluYWwgT2JqZWN0W10gZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdFtdPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHNOb09yZGVyKGZpbmFsIE9iamVjdFtdIGFjdHVhbCwgZmluYWwgT2JqZWN0W10gZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PE9iamVjdFtdPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKGFjdHVhbCwgZXhwZWN0ZWQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIGJ5dGVbXSBhY3R1YWwsIGZpbmFsIGJ5dGVbXSBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Ynl0ZVtdPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgYnl0ZVtdIGFjdHVhbCwgZmluYWwgYnl0ZVtdIGV4cGVjdGVkLAorICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PGJ5dGVbXT4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZpbmFsIFNldDw/PiBhY3R1YWwsIGZpbmFsIFNldDw/PiBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8U2V0PD8+PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgU2V0PD8+IGFjdHVhbCwgZmluYWwgU2V0PD8+IGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8U2V0PD8+PihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZmluYWwgTWFwPD8sID8+IGFjdHVhbCwgZmluYWwgTWFwPD8sID8+IGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxNYXA8PywgPz4+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyAgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgT2JqZWN0IGFjdHVhbCwgZmluYWwgT2JqZWN0IGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8T2JqZWN0PihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgT2JqZWN0IGFjdHVhbCwgZmluYWwgT2JqZWN0IGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxPYmplY3Q+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIFN0cmluZyBhY3R1YWwsIGZpbmFsIFN0cmluZyBleHBlY3RlZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PFN0cmluZz4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgU3RyaW5nIGFjdHVhbCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxTdHJpbmc+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIGxvbmcgYWN0dWFsLCBmaW5hbCBsb25nIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8TG9uZz4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgbG9uZyBhY3R1YWwsIGZpbmFsIGxvbmcgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PExvbmc+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIGJvb2xlYW4gYWN0dWFsLCBmaW5hbCBib29sZWFuIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Qm9vbGVhbj4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgYm9vbGVhbiBhY3R1YWwsIGZpbmFsIGJvb2xlYW4gZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEJvb2xlYW4+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIGJ5dGUgYWN0dWFsLCBmaW5hbCBieXRlIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Qnl0ZT4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgYnl0ZSBhY3R1YWwsIGZpbmFsIGJ5dGUgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEJ5dGU+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIGNoYXIgYWN0dWFsLCBmaW5hbCBjaGFyIGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Q2hhcmFjdGVyPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBjaGFyIGFjdHVhbCwgZmluYWwgY2hhciBleHBlY3RlZCkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8Q2hhcmFjdGVyPihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBzaG9ydCBhY3R1YWwsIGZpbmFsIHNob3J0IGV4cGVjdGVkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGRvQXNzZXJ0KG5ldyBTaW1wbGVBc3NlcnQ8U2hvcnQ+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIHNob3J0IGFjdHVhbCwgZmluYWwgc2hvcnQgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PFNob3J0PihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBpbnQgYWN0dWFsLCBmaW5hbCBpbnQgZXhwZWN0ZWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxJbnRlZ2VyPihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvQXNzZXJ0KCkgeworICAgICAgICBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3RFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBpbnQgYWN0dWFsLCBmaW5hbCBpbnQgZXhwZWN0ZWQpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PEludGVnZXI+KGFjdHVhbCwgZXhwZWN0ZWQpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBmbG9hdCBhY3R1YWwsIGZpbmFsIGZsb2F0IGV4cGVjdGVkLCBmaW5hbCBmbG9hdCBkZWx0YSwKKyAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxGbG9hdD4oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0Tm90RXF1YWxzKGZpbmFsIGZsb2F0IGFjdHVhbCwgZmluYWwgZmxvYXQgZXhwZWN0ZWQsIGZpbmFsIGZsb2F0IGRlbHRhKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxGbG9hdD4oYWN0dWFsLCBleHBlY3RlZCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydE5vdEVxdWFscyhmaW5hbCBkb3VibGUgYWN0dWFsLCBmaW5hbCBkb3VibGUgZXhwZWN0ZWQsIGZpbmFsIGRvdWJsZSBkZWx0YSwKKyAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgZG9Bc3NlcnQobmV3IFNpbXBsZUFzc2VydDxEb3VibGU+KGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG9Bc3NlcnQoKSB7CisgICAgICAgIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSwgbWVzc2FnZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhc3NlcnROb3RFcXVhbHMoZmluYWwgZG91YmxlIGFjdHVhbCwgZmluYWwgZG91YmxlIGV4cGVjdGVkLCBmaW5hbCBkb3VibGUgZGVsdGEpIHsKKyAgICBkb0Fzc2VydChuZXcgU2ltcGxlQXNzZXJ0PERvdWJsZT4oYWN0dWFsLCBleHBlY3RlZCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYXNzZXJ0cy9JQXNzZXJ0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvYXNzZXJ0cy9JQXNzZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3MjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0lBc3NlcnQuamF2YQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hc3NlcnRzOworCitwdWJsaWMgaW50ZXJmYWNlIElBc3NlcnQ8VD4geworICBTdHJpbmcgZ2V0TWVzc2FnZSgpOworICB2b2lkIGRvQXNzZXJ0KCk7CisgIFQgZ2V0QWN0dWFsKCk7CisgIFQgZ2V0RXhwZWN0ZWQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0lBc3NlcnRMaWZlY3ljbGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0lBc3NlcnRMaWZlY3ljbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTViMGVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fzc2VydHMvSUFzc2VydExpZmVjeWNsZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hc3NlcnRzOworCisvKioKKyAqIExpZmUgY3ljbGUgbWV0aG9kcyBmb3IgdGhlIGFzc2VydGlvbiBjbGFzcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJQXNzZXJ0TGlmZWN5Y2xlIHsKKyAgLyoqCisgICAqIFJ1biB0aGUgYXNzZXJ0IGNvbW1hbmQgaW4gcGFyYW1ldGVyLgorICAgKi8KKyAgdm9pZCBleGVjdXRlQXNzZXJ0KElBc3NlcnQ8Pz4gYXNzZXJ0Q29tbWFuZCk7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBhbiBhc3NlcnQgc3VjY2VlZHMuCisgICAqLworICB2b2lkIG9uQXNzZXJ0U3VjY2VzcyhJQXNzZXJ0PD8+IGFzc2VydENvbW1hbmQpOworCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gYW4gYXNzZXJ0IGZhaWxzLgorICAgKiAKKyAgICogQGRlcHJlY2F0ZWQgdXNlIG9uQXNzZXJ0RmFpbHVyZShJQXNzZXJ0IGFzc2VydENvbW1hbmQsIEFzc2VydGlvbkVycm9yIGV4KSBpbnN0ZWFkIG9mLgorICAgKi8KKyAgdm9pZCBvbkFzc2VydEZhaWx1cmUoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKTsKKyAgCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gYW4gYXNzZXJ0IGZhaWxzLgorICAgKiAKKyAgICovCisgIHZvaWQgb25Bc3NlcnRGYWlsdXJlKElBc3NlcnQ8Pz4gYXNzZXJ0Q29tbWFuZCwgQXNzZXJ0aW9uRXJyb3IgZXgpOworCisgIC8qKgorICAgKiBJbnZva2VkIGJlZm9yZSBhbiBhc3NlcnQgaXMgcnVuLgorICAgKi8KKyAgdm9pZCBvbkJlZm9yZUFzc2VydChJQXNzZXJ0PD8+IGFzc2VydENvbW1hbmQpOworCisgIC8qKgorICAgKiBJbnZva2VkIGFmdGVyIGFuIGFzc2VydCBpcyBydW4uCisgICAqLworICB2b2lkIG9uQWZ0ZXJBc3NlcnQoSUFzc2VydDw/PiBhc3NlcnRDb21tYW5kKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0xvZ2dpbmdBc3NlcnQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL0xvZ2dpbmdBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY5Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fzc2VydHMvTG9nZ2luZ0Fzc2VydC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hc3NlcnRzOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIExvZyB0aGUgbWVzc2FnZXMgb2YgYWxsIHRoZSBhc3NlcnRpb25zIHRoYXQgZ2V0IHJ1bi4KKyAqLworcHVibGljIGNsYXNzIExvZ2dpbmdBc3NlcnQgZXh0ZW5kcyBBc3NlcnRpb24geworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fbWVzc2FnZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25CZWZvcmVBc3NlcnQoSUFzc2VydDw/PiBhKSB7CisgICAgbV9tZXNzYWdlcy5hZGQoIlRlc3Q6IiArIGEuZ2V0TWVzc2FnZSgpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWVzc2FnZXMoKSB7CisgICAgcmV0dXJuIG1fbWVzc2FnZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL1NvZnRBc3NlcnQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9hc3NlcnRzL1NvZnRBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDViZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2Fzc2VydHMvU29mdEFzc2VydC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5hc3NlcnRzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworLyoqCisgKiBXaGVuIGFuIGFzc2VydGlvbiBmYWlscywgZG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJ1dCByZWNvcmQgdGhlIGZhaWx1cmUuCisgKiBDYWxsaW5nIHtAY29kZSBhc3NlcnRBbGwoKX0gd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIGlmIGF0CisgKiBsZWFzdCBvbmUgYXNzZXJ0aW9uIGZhaWxlZC4KKyAqLworcHVibGljIGNsYXNzIFNvZnRBc3NlcnQgZXh0ZW5kcyBBc3NlcnRpb24geworICAvLyBMaW5rZWRIYXNoTWFwIHRvIHByZXNlcnZlIHRoZSBvcmRlcgorICBwcml2YXRlIGZpbmFsIE1hcDxBc3NlcnRpb25FcnJvciwgSUFzc2VydDw/Pj4gbV9lcnJvcnMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9Bc3NlcnQoSUFzc2VydDw/PiBhKSB7CisgICAgb25CZWZvcmVBc3NlcnQoYSk7CisgICAgdHJ5IHsKKyAgICAgIGEuZG9Bc3NlcnQoKTsKKyAgICAgIG9uQXNzZXJ0U3VjY2VzcyhhKTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBleCkgeworICAgICAgb25Bc3NlcnRGYWlsdXJlKGEsIGV4KTsKKyAgICAgIG1fZXJyb3JzLnB1dChleCwgYSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG9uQWZ0ZXJBc3NlcnQoYSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0QWxsKCkgeworICAgIGlmICghbV9lcnJvcnMuaXNFbXB0eSgpKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBmYWlsZWQ6Iik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PEFzc2VydGlvbkVycm9yLCBJQXNzZXJ0PD8+PiBhZSA6IG1fZXJyb3JzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzYi5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIlxuXHQiKTsKKyAgICAgICAgc2IuYXBwZW5kKGFlLmdldEtleSgpLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioc2IudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvQ29sbGVjdGlvblV0aWxzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvQ29sbGVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9jb2xsZWN0aW9ucy9Db2xsZWN0aW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblV0aWxzIHsKKworICBwcml2YXRlIENvbGxlY3Rpb25VdGlscygpIHt9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0VsZW1lbnRzKENvbGxlY3Rpb248Pz4gYykgeworICAgIHJldHVybiBjICE9IG51bGwgJiYgISBjLmlzRW1wdHkoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFbGVtZW50cyhNYXA8PywgPz4gYykgeworICAgIHJldHVybiBjICE9IG51bGwgJiYgISBjLmlzRW1wdHkoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvTGlzdE11bHRpTWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvTGlzdE11bHRpTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9jb2xsZWN0aW9ucy9MaXN0TXVsdGlNYXAuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgY29udGFpbmVyIHRvIGhvbGQgbGlzdHMgaW5kZXhlZCBieSBhIGtleS4KKyAqLworcHVibGljIGNsYXNzIExpc3RNdWx0aU1hcDxLLCBWPiBleHRlbmRzIE11bHRpTWFwPEssIFYsIExpc3Q8Vj4+IHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIExpc3Q8Vj4gY3JlYXRlVmFsdWUoKSB7CisgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHN0YXRpYyA8SywgVj4gTGlzdE11bHRpTWFwPEssIFY+IGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL0xpc3RzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvTGlzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGU4M2RmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL0xpc3RzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmNvbGxlY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBMaXN0cyB7CisKKyAgcHJpdmF0ZSBMaXN0cygpIHt9CisKKyAgcHVibGljIHN0YXRpYyA8Sz4gTGlzdDxLPiBuZXdBcnJheUxpc3QoKSB7CisgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PigpOworICB9CisKKyAgcHVibGljIHN0YXRpYyA8Sz4gTGlzdDxLPiBuZXdBcnJheUxpc3QoQ29sbGVjdGlvbjxLPiBjKSB7CisgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihjKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPEs+IExpc3Q8Sz4gbmV3QXJyYXlMaXN0KEsuLi4gZWxlbWVudHMpIHsKKyAgICBMaXN0PEs+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIGVsZW1lbnRzKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyA8Sz4gTGlzdDxLPiBuZXdBcnJheUxpc3QoaW50IHNpemUpIHsKKyAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KHNpemUpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvTWFwcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL01hcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTJjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL01hcHMuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIE1hcHMgeworCisgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLFY+IG5ld0hhc2hNYXAoKSB7CisgICAgcmV0dXJuIG5ldyBIYXNoTWFwPD4oKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLFY+IG5ld0hhc2h0YWJsZSgpIHsKKyAgICByZXR1cm4gbmV3IEhhc2h0YWJsZTw+KCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxLLCBWPiBMaXN0TXVsdGlNYXA8SywgVj4gbmV3TGlzdE11bHRpTWFwKCkgeworICAgIHJldHVybiBuZXcgTGlzdE11bHRpTWFwPD4oKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPEssIFY+IFNldE11bHRpTWFwPEssIFY+IG5ld1NldE11bHRpTWFwKCkgeworICAgIHJldHVybiBuZXcgU2V0TXVsdGlNYXA8PigpOworICB9CisKKyAgcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IG5ld0xpbmtlZEhhc2hNYXAoKSB7CisgICAgcmV0dXJuIG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBuZXdIYXNoTWFwKE1hcDxLLCBWPiBwYXJhbWV0ZXJzKSB7CisgICAgcmV0dXJuIG5ldyBIYXNoTWFwPD4ocGFyYW1ldGVycyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9jb2xsZWN0aW9ucy9NdWx0aU1hcC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL011bHRpTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwNjY0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9jb2xsZWN0aW9ucy9NdWx0aU1hcC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpTWFwPEssIFYsIEMgZXh0ZW5kcyBDb2xsZWN0aW9uPFY+PiB7CisgIHByb3RlY3RlZCBmaW5hbCBNYXA8SywgQz4gbV9vYmplY3RzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IEMgY3JlYXRlVmFsdWUoKTsKKworICBwdWJsaWMgYm9vbGVhbiBwdXQoSyBrZXksIFYgbWV0aG9kKSB7CisgICAgYm9vbGVhbiBzZXRFeGlzdHMgPSB0cnVlOworICAgIEMgbCA9IG1fb2JqZWN0cy5nZXQoa2V5KTsKKyAgICBpZiAobCA9PSBudWxsKSB7CisgICAgICBzZXRFeGlzdHMgPSBmYWxzZTsKKyAgICAgIGwgPSBjcmVhdGVWYWx1ZSgpOworICAgICAgbV9vYmplY3RzLnB1dChrZXksIGwpOworICAgIH0KKyAgICByZXR1cm4gbC5hZGQobWV0aG9kKSAmJiBzZXRFeGlzdHM7CisgIH0KKworICBwdWJsaWMgQyBnZXQoSyBrZXkpIHsKKyAgICByZXR1cm4gbV9vYmplY3RzLmdldChrZXkpOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIExpc3Q8Sz4gZ2V0S2V5cygpIHsKKyAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KGtleVNldCgpKTsKKyAgfQorCisgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgeworICAgIHJldHVybiBuZXcgSGFzaFNldChtX29iamVjdHMua2V5U2V0KCkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoSyBrKSB7CisgICAgcmV0dXJuIG1fb2JqZWN0cy5jb250YWluc0tleShrKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTZXQ8Sz4gaW5kaWNlcyA9IGtleVNldCgpOworICAgIGZvciAoSyBpIDogaW5kaWNlcykgeworICAgICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgIikuYXBwZW5kKGkpLmFwcGVuZCgiIDwtLSAiKTsKKyAgICAgIGZvciAoT2JqZWN0IG8gOiBtX29iamVjdHMuZ2V0KGkpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobykuYXBwZW5kKCIgIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgcmV0dXJuIG1fb2JqZWN0cy5zaXplKCkgPT0gMDsKKyAgfQorCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gc2l6ZSgpOworICB9CisKKyAgcHVibGljIGludCBzaXplKCkgeworICAgIHJldHVybiBtX29iamVjdHMuc2l6ZSgpOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIEMgcmVtb3ZlKEsga2V5KSB7CisgICAgcmV0dXJuIHJlbW92ZUFsbChrZXkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKEsga2V5LCBWIHZhbHVlKSB7CisgICAgQyB2YWx1ZXMgPSBnZXQoa2V5KTsKKyAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlcy5yZW1vdmUodmFsdWUpOworICB9CisKKyAgcHVibGljIEMgcmVtb3ZlQWxsKEsga2V5KSB7CisgICAgcmV0dXJuIG1fb2JqZWN0cy5yZW1vdmUoa2V5KTsKKyAgfQorCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIEM+PiBnZXRFbnRyeVNldCgpIHsKKyAgICByZXR1cm4gZW50cnlTZXQoKTsKKyAgfQorCisgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIEM+PiBlbnRyeVNldCgpIHsKKyAgICByZXR1cm4gbV9vYmplY3RzLmVudHJ5U2V0KCk7CisgIH0KKworICBARGVwcmVjYXRlZAorICBwdWJsaWMgQ29sbGVjdGlvbjxDPiBnZXRWYWx1ZXMoKSB7CisgICAgcmV0dXJuIHZhbHVlcygpOworICB9CisKKyAgcHVibGljIENvbGxlY3Rpb248Qz4gdmFsdWVzKCkgeworICAgIHJldHVybiBtX29iamVjdHMudmFsdWVzKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBwdXRBbGwoSyBrLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBWPiB2YWx1ZXMpIHsKKyAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgIGZvciAoViB2IDogdmFsdWVzKSB7CisgICAgICByZXN1bHQgPSBwdXQoaywgdikgfHwgcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvT2JqZWN0cy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL09iamVjdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdhNGZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL09iamVjdHMuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLnV0aWwuU3RyaW5nczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RzIHsKKworICBwcml2YXRlIE9iamVjdHMoKSB7fQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlSG9sZGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBtX25hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbV92YWx1ZTsKKworICAgIHB1YmxpYyBWYWx1ZUhvbGRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBtX25hbWUgPSBuYW1lOworICAgICAgbV92YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOdWxsKCkgeworICAgICAgcmV0dXJuIG1fdmFsdWUgPT0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIG1fbmFtZSArICI9IiArIG1fdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVN0cmluZygpIHsKKyAgICAgIHJldHVybiBTdHJpbmdzLmlzTnVsbE9yRW1wdHkobV92YWx1ZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUb1N0cmluZ0hlbHBlciB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbV9jbGFzc05hbWU7CisgICAgcHJpdmF0ZSBMaXN0PFZhbHVlSG9sZGVyPiB2YWx1ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbV9vbWl0TnVsbHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbV9vbWl0RW1wdHlTdHJpbmdzID0gZmFsc2U7CisKKyAgICBwdWJsaWMgVG9TdHJpbmdIZWxwZXIoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgbV9jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIFRvU3RyaW5nSGVscGVyIG9taXROdWxscygpIHsKKyAgICAgIG1fb21pdE51bGxzID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUb1N0cmluZ0hlbHBlciBvbWl0RW1wdHlTdHJpbmdzKCkgeworICAgICAgbV9vbWl0RW1wdHlTdHJpbmdzID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUb1N0cmluZ0hlbHBlciBhZGQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgdmFsdWVzLmFkZChuZXcgVmFsdWVIb2xkZXIobmFtZSwgcyh2YWx1ZSkpKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUb1N0cmluZ0hlbHBlciBhZGQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgdmFsdWVzLmFkZChuZXcgVmFsdWVIb2xkZXIobmFtZSwgcyh2YWx1ZSkpKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHMoT2JqZWN0IG8pIHsKKyAgICAgIHJldHVybiBvICE9IG51bGwKKyAgICAgICAgICA/IChvLnRvU3RyaW5nKCkuaXNFbXB0eSgpID8gIlwiXCIiIDogby50b1N0cmluZygpKQorICAgICAgICAgIDogIntudWxsfSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlsiICsgbV9jbGFzc05hbWUgKyAiICIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVmFsdWVIb2xkZXIgdmggPSB2YWx1ZXMuZ2V0KGkpOworICAgICAgICBpZiAobV9vbWl0TnVsbHMgJiYgdmguaXNOdWxsKCkpIGNvbnRpbnVlOworICAgICAgICBpZiAobV9vbWl0RW1wdHlTdHJpbmdzICYmIHZoLmlzRW1wdHlTdHJpbmcoKSkgY29udGludWU7CisKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQodmgudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKCJdIik7CisKKyAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRvU3RyaW5nSGVscGVyIHRvU3RyaW5nSGVscGVyKENsYXNzPD8+IGNsYXNzMSkgeworICAgIHJldHVybiBuZXcgVG9TdHJpbmdIZWxwZXIoY2xhc3MxLmdldFNpbXBsZU5hbWUoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL1NldE11bHRpTWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvU2V0TXVsdGlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODViYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL1NldE11bHRpTWFwLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmNvbGxlY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIGNvbnRhaW5lciB0byBob2xkIHNldHMgaW5kZXhlZCBieSBhIGtleS4KKyAqLworcHVibGljIGNsYXNzIFNldE11bHRpTWFwPEssIFY+IGV4dGVuZHMgTXVsdGlNYXA8SywgViwgU2V0PFY+PiB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBTZXQ8Vj4gY3JlYXRlVmFsdWUoKSB7CisgICAgcmV0dXJuIFNldHMubmV3SGFzaFNldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvY29sbGVjdGlvbnMvU2V0cy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL1NldHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQzZDFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2NvbGxlY3Rpb25zL1NldHMuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuY29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0cyB7CisKKyAgcHJpdmF0ZSBTZXRzKCkge30KKworICBwdWJsaWMgc3RhdGljIDxWPiBTZXQ8Vj4gbmV3SGFzaFNldCgpIHsKKyAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PigpOworICB9CisKKyAgcHVibGljIHN0YXRpYyA8Vj4gU2V0PFY+IG5ld0hhc2hTZXQoQ29sbGVjdGlvbjxWPiBjKSB7CisgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oYyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxWPiBTZXQ8Vj4gbmV3TGlua2VkSGFzaFNldCgpIHsKKyAgICByZXR1cm4gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQXR0cmlidXRlcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0F0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWZkODM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0F0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLklBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSUF0dHJpYnV0ZXMuCisgKgorICogQGF1dGhvciBjYmV1c3RAZ29vZ2xlLmNvbSAoQ2VkcmljIEJldXN0KSwgTWFyY2ggMTZ0aCwgMjAxMAorICovCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIElBdHRyaWJ1dGVzIHsKKyAgLyoqCisgICAqCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NzAxMTU5OTc5MjgxMzM1MTUyTDsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IG1fYXR0cmlidXRlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBtX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICByZXR1cm4gbV9hdHRyaWJ1dGVzLmtleVNldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgbV9hdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gbV9hdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0Jhc2VDbGFzc0ZpbmRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0Jhc2VDbGFzc0ZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmZWViMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQmFzZUNsYXNzRmluZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RPYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBCYXNlQ2xhc3NGaW5kZXIgaW1wbGVtZW50cyBJVGVzdENsYXNzRmluZGVyIHsKKyAgcHJpdmF0ZSBNYXA8Q2xhc3MsIElDbGFzcz4gbV9jbGFzc2VzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJQ2xhc3MgZ2V0SUNsYXNzKENsYXNzIGNscykgeworICAgIHJldHVybiBtX2NsYXNzZXMuZ2V0KGNscyk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBwdXRJQ2xhc3MoQ2xhc3MgY2xzLCBJQ2xhc3MgaUNsYXNzKSB7CisgICAgaWYgKCEgbV9jbGFzc2VzLmNvbnRhaW5zS2V5KGNscykpIHsKKyAgICAgIG1fY2xhc3Nlcy5wdXQoY2xzLCBpQ2xhc3MpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltCYXNlQ2xhc3NGaW5kZXJdICIgKyBzKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2xzCisgICAqIEByZXR1cm4gQW4gSUNsYXNzIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIG9yIG51bGwgaWYgd2UgaGF2ZQorICAgKiBhbHJlYWR5IHRyZWF0ZWQgdGhpcyBjbGFzcy4KKyAgICovCisgIHByb3RlY3RlZCBJQ2xhc3MgZmluZE9yQ3JlYXRlSUNsYXNzKElUZXN0Q29udGV4dCBjb250ZXh0LCBDbGFzcyBjbHMsIFhtbENsYXNzIHhtbENsYXNzLAorICAgICAgT2JqZWN0IGluc3RhbmNlLCBYbWxUZXN0IHhtbFRlc3QsIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICBJVGVzdE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSkKKyAgeworICAgIElDbGFzcyByZXN1bHQgPSBtX2NsYXNzZXMuZ2V0KGNscyk7CisgICAgaWYgKG51bGwgPT0gcmVzdWx0KSB7CisgICAgICByZXN1bHQgPSBuZXcgQ2xhc3NJbXBsKGNvbnRleHQsIGNscywgeG1sQ2xhc3MsIGluc3RhbmNlLCBtX2NsYXNzZXMsIHhtbFRlc3QsIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgb2JqZWN0RmFjdG9yeSk7CisgICAgICBtX2NsYXNzZXMucHV0KGNscywgcmVzdWx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJvdGVjdGVkIE1hcCBnZXRFeGlzdGluZ0NsYXNzZXMoKSB7CisgICAgcmV0dXJuIG1fY2xhc3NlczsKKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIGNsYXNzRXhpc3RzKENsYXNzIGNscykgeworICAgIHJldHVybiBtX2NsYXNzZXMuY29udGFpbnNLZXkoY2xzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSUNsYXNzW10gZmluZFRlc3RDbGFzc2VzKCkgeworICAgIHJldHVybiBtX2NsYXNzZXMudmFsdWVzKCkudG9BcnJheShuZXcgSUNsYXNzW21fY2xhc3Nlcy5zaXplKCldKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9CYXNlVGVzdE1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0Jhc2VUZXN0TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjQ0OTc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9CYXNlVGVzdE1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNzkwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsNCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLklSZXRyeUFuYWx5emVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdE9yQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLlNldHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxJbmNsdWRlOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0Ow0KKw0KKy8qKg0KKyAqIFN1cGVyY2xhc3MgdG8gcmVwcmVzZW50IGJvdGggJiM2NDtUZXN0IGFuZCAmIzY0O0NvbmZpZ3VyYXRpb24gbWV0aG9kcy4NCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVRlc3RNZXRob2QgaW1wbGVtZW50cyBJVGVzdE5HTWV0aG9kIHsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNjY2MDMyNjAyNTgwNjUyMTczTDsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gU1BBQ0VfU0VQQVJBVE9SX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIiArIik7DQorDQorICAvKioNCisgICAqIFRoZSB0ZXN0IGNsYXNzIG9uIHdoaWNoIHRoZSB0ZXN0IG1ldGhvZCB3YXMgZm91bmQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdA0KKyAgICogbmVjZXNzYXJpbHkgdGhlIGRlY2xhcmluZyBjbGFzcy4NCisgICAqLw0KKyAgcHJvdGVjdGVkIElUZXN0Q2xhc3MgbV90ZXN0Q2xhc3M7DQorDQorICBwcm90ZWN0ZWQgZmluYWwgdHJhbnNpZW50IENsYXNzPD8+IG1fbWV0aG9kQ2xhc3M7DQorICBwcm90ZWN0ZWQgZmluYWwgdHJhbnNpZW50IENvbnN0cnVjdG9yT3JNZXRob2QgbV9tZXRob2Q7DQorICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgbV9zaWduYXR1cmU7DQorICBwcm90ZWN0ZWQgU3RyaW5nIG1faWQgPSAiIjsNCisgIHByb3RlY3RlZCBsb25nIG1fZGF0ZSA9IC0xOw0KKyAgcHJvdGVjdGVkIGZpbmFsIHRyYW5zaWVudCBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXI7DQorICBwcm90ZWN0ZWQgU3RyaW5nW10gbV9ncm91cHMgPSB7fTsNCisgIHByb3RlY3RlZCBTdHJpbmdbXSBtX2dyb3Vwc0RlcGVuZGVkVXBvbiA9IHt9Ow0KKyAgcHJvdGVjdGVkIFN0cmluZ1tdIG1fbWV0aG9kc0RlcGVuZGVkVXBvbiA9IHt9Ow0KKyAgcHJvdGVjdGVkIFN0cmluZ1tdIG1fYmVmb3JlR3JvdXBzID0ge307DQorICBwcm90ZWN0ZWQgU3RyaW5nW10gbV9hZnRlckdyb3VwcyA9IHt9Ow0KKyAgcHJpdmF0ZSBib29sZWFuIG1faXNBbHdheXNSdW47DQorICBwcml2YXRlIGJvb2xlYW4gbV9lbmFibGVkOw0KKw0KKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbV9tZXRob2ROYW1lOw0KKyAgLy8gSWYgYSBkZXBlbmRlZCBncm91cCBpcyBub3QgZm91bmQNCisgIHByaXZhdGUgU3RyaW5nIG1fbWlzc2luZ0dyb3VwOw0KKyAgcHJpdmF0ZSBTdHJpbmcgbV9kZXNjcmlwdGlvbiA9IG51bGw7DQorICBwcm90ZWN0ZWQgQXRvbWljSW50ZWdlciBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsNCisgIHByaXZhdGUgaW50IG1fcGFyYW1ldGVySW52b2NhdGlvbkNvdW50ID0gMTsNCisgIHByaXZhdGUgSVJldHJ5QW5hbHl6ZXIgbV9yZXRyeUFuYWx5emVyID0gbnVsbDsNCisgIHByaXZhdGUgYm9vbGVhbiBtX3NraXBGYWlsZWRJbnZvY2F0aW9ucyA9IHRydWU7DQorICBwcml2YXRlIGxvbmcgbV9pbnZvY2F0aW9uVGltZU91dCA9IDBMOw0KKw0KKyAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1faW52b2NhdGlvbk51bWJlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgIHByaXZhdGUgZmluYWwgTGlzdDxJbnRlZ2VyPiBtX2ZhaWxlZEludm9jYXRpb25OdW1iZXJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChMaXN0cy48SW50ZWdlcj5uZXdBcnJheUxpc3QoKSk7DQorICBwcml2YXRlIGxvbmcgbV90aW1lT3V0ID0gMDsNCisNCisgIHByaXZhdGUgYm9vbGVhbiBtX2lnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXM7DQorICBwcml2YXRlIGludCBtX3ByaW9yaXR5Ow0KKw0KKyAgcHJpdmF0ZSBYbWxUZXN0IG1feG1sVGVzdDsNCisgIHByaXZhdGUgT2JqZWN0IG1faW5zdGFuY2U7DQorDQorICAvKioNCisgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5CYXNlVGVzdE1ldGhvZDwvY29kZT4gVE9ETyBjcXVlemVsIEphdmFEb2MuDQorICAgKg0KKyAgICogQHBhcmFtIG1ldGhvZA0KKyAgICogQHBhcmFtIGFubm90YXRpb25GaW5kZXINCisgICAqIEBwYXJhbSBpbnN0YW5jZSANCisgICAqLw0KKyAgcHVibGljIEJhc2VUZXN0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLCBPYmplY3QgaW5zdGFuY2UpIHsNCisgICAgdGhpcyhtZXRob2ROYW1lLCBuZXcgQ29uc3RydWN0b3JPck1ldGhvZChtZXRob2QpLCBhbm5vdGF0aW9uRmluZGVyLCBpbnN0YW5jZSk7DQorICB9DQorDQorICBwdWJsaWMgQmFzZVRlc3RNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENvbnN0cnVjdG9yT3JNZXRob2QgY29tLCBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLA0KKyAgICAgIE9iamVjdCBpbnN0YW5jZSkgew0KKyAgICBtX21ldGhvZENsYXNzID0gY29tLmdldERlY2xhcmluZ0NsYXNzKCk7DQorICAgIG1fbWV0aG9kID0gY29tOw0KKyAgICBtX21ldGhvZE5hbWUgPSBtZXRob2ROYW1lOw0KKyAgICBtX2Fubm90YXRpb25GaW5kZXIgPSBhbm5vdGF0aW9uRmluZGVyOw0KKyAgICBtX2luc3RhbmNlID0gaW5zdGFuY2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0Fsd2F5c1J1bigpIHsNCisgICAgcmV0dXJuIG1faXNBbHdheXNSdW47DQorICB9DQorDQorICAvKioNCisgICAqIFRPRE8gY3F1ZXplbCBKYXZhRG9jLg0KKyAgICoNCisgICAqIEBwYXJhbSBhbHdheXNSdW4NCisgICAqLw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0QWx3YXlzUnVuKGJvb2xlYW4gYWx3YXlzUnVuKSB7DQorICAgIG1faXNBbHdheXNSdW4gPSBhbHdheXNSdW47DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0UmVhbENsYXNzKCkgew0KKyAgICByZXR1cm4gbV9tZXRob2RDbGFzczsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJVGVzdENsYXNzIGdldFRlc3RDbGFzcygpIHsNCisgICAgcmV0dXJuIG1fdGVzdENsYXNzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGVzdENsYXNzKElUZXN0Q2xhc3MgdGMpIHsNCisgICAgYXNzZXJ0IG51bGwgIT0gdGM7DQorICAgIGlmICghIHRjLmdldFJlYWxDbGFzcygpLmVxdWFscyhtX21ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSkgew0KKyAgICAgIGFzc2VydCBtX21ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmlzQXNzaWduYWJsZUZyb20odGMuZ2V0UmVhbENsYXNzKCkpIDoNCisgICAgICAgICJcbk1JU01BVENIIDogIiArIHRjLmdldFJlYWxDbGFzcygpICsgIiAiICsgbV9tZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsNCisgICAgfQ0KKyAgICBtX3Rlc3RDbGFzcyA9IHRjOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgbykgew0KKyAgICBpbnQgcmVzdWx0ID0gLTI7DQorICAgIENsYXNzPD8+IHRoaXNDbGFzcyA9IGdldFJlYWxDbGFzcygpOw0KKyAgICBDbGFzczw/PiBvdGhlckNsYXNzID0gKChJVGVzdE5HTWV0aG9kKSBvKS5nZXRSZWFsQ2xhc3MoKTsNCisgICAgaWYgKHRoaXMgPT0gbykgew0KKyAgICAgIHJlc3VsdCA9IDA7DQorICAgIH0gZWxzZSBpZiAodGhpc0NsYXNzLmlzQXNzaWduYWJsZUZyb20ob3RoZXJDbGFzcykpIHsNCisgICAgICByZXN1bHQgPSAtMTsNCisgICAgfSBlbHNlIGlmIChvdGhlckNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhpc0NsYXNzKSkgew0KKyAgICAgIHJlc3VsdCA9IDE7DQorICAgIH0gZWxzZSBpZiAoZXF1YWxzKG8pKSB7DQorICAgICAgcmVzdWx0ID0gMDsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7DQorICAgIHJldHVybiBtX21ldGhvZC5nZXRNZXRob2QoKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsNCisgICAgcmV0dXJuIG1fbWV0aG9kTmFtZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBPYmplY3RbXSBnZXRJbnN0YW5jZXMoKSB7DQorICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBnZXRJbnN0YW5jZSgpIH07DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBPYmplY3QgZ2V0SW5zdGFuY2UoKSB7DQorICAgIHJldHVybiBtX2luc3RhbmNlOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpIHsNCisgICAgcmV0dXJuIG1fdGVzdENsYXNzLmdldEluc3RhbmNlSGFzaENvZGVzKCk7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uIG9mIGdyb3VwcyBkZWZpbmVkIG9uIHRoZSBjbGFzcyBhbmQgb24gdGhpcyBtZXRob2QuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwcygpIHsNCisgICAgcmV0dXJuIG1fZ3JvdXBzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZ1tdIGdldEdyb3Vwc0RlcGVuZGVkVXBvbigpIHsNCisgICAgcmV0dXJuIG1fZ3JvdXBzRGVwZW5kZWRVcG9uOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZ1tdIGdldE1ldGhvZHNEZXBlbmRlZFVwb24oKSB7DQorICAgIHJldHVybiBtX21ldGhvZHNEZXBlbmRlZFVwb247DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3QoKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZVRlc3RDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyVGVzdENvbmZpZ3VyYXRpb24oKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbigpIHsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGJvb2xlYW4gaXNBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb24oKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCkgew0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgbG9uZyBnZXRUaW1lT3V0KCkgew0KKyAgICBsb25nIHJlc3VsdCA9IG1fdGltZU91dCAhPSAwID8gbV90aW1lT3V0IDogKG1feG1sVGVzdCAhPSBudWxsID8gbV94bWxUZXN0LmdldFRpbWVPdXQoMCkgOiAwKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGltZU91dChsb25nIHRpbWVPdXQpIHsNCisgICAgbV90aW1lT3V0ID0gdGltZU91dDsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGludm9rZWQuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBOby1vcC4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ291bnQoaW50IGNvdW50ZXIpIHsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgbWV0aG9kIG9yIG9uZSBvZiBpdHMgY2xvbmVzIG11c3QgYmUgaW52b2tlZC4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldFRvdGFsSW52b2NhdGlvbkNvdW50KCkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfSBEZWZhdWx0IHZhbHVlIGZvciBzdWNjZXNzUGVyY2VudGFnZS4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldFN1Y2Nlc3NQZXJjZW50YWdlKCkgew0KKyAgICByZXR1cm4gMTAwOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCisgICAgcmV0dXJuIG1faWQ7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsNCisgICAgbV9pZCA9IGlkOw0KKyAgfQ0KKw0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRhdGUuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGxvbmcgZ2V0RGF0ZSgpIHsNCisgICAgcmV0dXJuIG1fZGF0ZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gc2V0Lg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldERhdGUobG9uZyBkYXRlKSB7DQorICAgIG1fZGF0ZSA9IGRhdGU7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBjYW5SdW5Gcm9tQ2xhc3MoSUNsYXNzIHRlc3RDbGFzcykgew0KKyAgICByZXR1cm4gbV9tZXRob2RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RDbGFzcy5nZXRSZWFsQ2xhc3MoKSk7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30gQ29tcGFyZXMgdHdvIEJhc2VUZXN0TWV0aG9kIHVzaW5nIHRoZSB0ZXN0IGNsYXNzIHRoZW4gdGhlIGFzc29jaWF0ZWQNCisgICAqIEphdmEgTWV0aG9kLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgIGlmICh0aGlzID09IG9iaikgew0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIGlmIChvYmogPT0gbnVsbCkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBCYXNlVGVzdE1ldGhvZCBvdGhlciA9IChCYXNlVGVzdE1ldGhvZCkgb2JqOw0KKw0KKyAgICBib29sZWFuIGlzRXF1YWwgPSBtX3Rlc3RDbGFzcyA9PSBudWxsID8gb3RoZXIubV90ZXN0Q2xhc3MgPT0gbnVsbA0KKyAgICAgICAgOiBvdGhlci5tX3Rlc3RDbGFzcyAhPSBudWxsICYmDQorICAgICAgICAgIG1fdGVzdENsYXNzLmdldFJlYWxDbGFzcygpLmVxdWFscyhvdGhlci5tX3Rlc3RDbGFzcy5nZXRSZWFsQ2xhc3MoKSkNCisgICAgICAgICAgJiYgbV9pbnN0YW5jZSA9PSBvdGhlci5nZXRJbnN0YW5jZSgpOw0KKw0KKyAgICByZXR1cm4gaXNFcXVhbCAmJiBnZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCkuZXF1YWxzKG90aGVyLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKSk7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIEphdmEgTWV0aG9kJ3MgaGFzaCBjb2RlLg0KKyAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBKYXZhIE1ldGhvZCdzIGhhc2ggY29kZS4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICByZXR1cm4gbV9tZXRob2QuaGFzaENvZGUoKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIGluaXRHcm91cHMoQ2xhc3M8PyBleHRlbmRzIElUZXN0T3JDb25maWd1cmF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsNCisgICAgLy8NCisgICAgLy8gSW5pdCBncm91cHMNCisgICAgLy8NCisgICAgew0KKyAgICAgIElUZXN0T3JDb25maWd1cmF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uRmluZGVyKCkuZmluZEFubm90YXRpb24oZ2V0TWV0aG9kKCksIGFubm90YXRpb25DbGFzcyk7DQorICAgICAgSVRlc3RPckNvbmZpZ3VyYXRpb24gY2xhc3NBbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbkZpbmRlcigpLmZpbmRBbm5vdGF0aW9uKGdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCksIGFubm90YXRpb25DbGFzcyk7DQorDQorICAgICAgc2V0R3JvdXBzKGdldFN0cmluZ0FycmF5KG51bGwgIT0gYW5ub3RhdGlvbiA/IGFubm90YXRpb24uZ2V0R3JvdXBzKCkgOiBudWxsLA0KKyAgICAgICAgICBudWxsICE9IGNsYXNzQW5ub3RhdGlvbiA/IGNsYXNzQW5ub3RhdGlvbi5nZXRHcm91cHMoKSA6IG51bGwpKTsNCisgICAgfQ0KKw0KKyAgICAvLw0KKyAgICAvLyBJbml0IGdyb3VwcyBkZXBlbmRlZCB1cG9uDQorICAgIC8vDQorICAgIHsNCisgICAgICBJVGVzdE9yQ29uZmlndXJhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbkZpbmRlcigpLmZpbmRBbm5vdGF0aW9uKGdldE1ldGhvZCgpLCBhbm5vdGF0aW9uQ2xhc3MpOw0KKyAgICAgIElUZXN0T3JDb25maWd1cmF0aW9uIGNsYXNzQW5ub3RhdGlvbiA9IGdldEFubm90YXRpb25GaW5kZXIoKS5maW5kQW5ub3RhdGlvbihnZXRNZXRob2QoKS5nZXREZWNsYXJpbmdDbGFzcygpLCBhbm5vdGF0aW9uQ2xhc3MpOw0KKw0KKyAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiB4Z2QgPSBjYWxjdWxhdGVYbWxHcm91cERlcGVuZGVuY2llcyhtX3htbFRlc3QpOw0KKyAgICAgIExpc3Q8U3RyaW5nPiB4bWxHcm91cERlcGVuZGVuY2llcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICAgIGZvciAoU3RyaW5nIGcgOiBnZXRHcm91cHMoKSkgew0KKyAgICAgICAgU2V0PFN0cmluZz4gZ2R1ID0geGdkLmdldChnKTsNCisgICAgICAgIGlmIChnZHUgIT0gbnVsbCkgew0KKyAgICAgICAgICB4bWxHcm91cERlcGVuZGVuY2llcy5hZGRBbGwoZ2R1KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgc2V0R3JvdXBzRGVwZW5kZWRVcG9uKA0KKyAgICAgICAgICBnZXRTdHJpbmdBcnJheShudWxsICE9IGFubm90YXRpb24gPyBhbm5vdGF0aW9uLmdldERlcGVuZHNPbkdyb3VwcygpIDogbnVsbCwNCisgICAgICAgICAgbnVsbCAhPSBjbGFzc0Fubm90YXRpb24gPyBjbGFzc0Fubm90YXRpb24uZ2V0RGVwZW5kc09uR3JvdXBzKCkgOiBudWxsKSwNCisgICAgICAgICAgeG1sR3JvdXBEZXBlbmRlbmNpZXMpOw0KKw0KKyAgICAgIFN0cmluZ1tdIG1ldGhvZHNEZXBlbmRlZFVwb24gPQ0KKyAgICAgICAgZ2V0U3RyaW5nQXJyYXkobnVsbCAhPSBhbm5vdGF0aW9uID8gYW5ub3RhdGlvbi5nZXREZXBlbmRzT25NZXRob2RzKCkgOiBudWxsLA0KKyAgICAgICAgbnVsbCAhPSBjbGFzc0Fubm90YXRpb24gPyBjbGFzc0Fubm90YXRpb24uZ2V0RGVwZW5kc09uTWV0aG9kcygpIDogbnVsbCk7DQorICAgICAgLy8gUXVhbGlmeSB0aGVzZSBtZXRob2RzIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHBhY2thZ2UNCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHNEZXBlbmRlZFVwb24ubGVuZ3RoOyBpKyspIHsNCisgICAgICAgIFN0cmluZyBtID0gbWV0aG9kc0RlcGVuZGVkVXBvbltpXTsNCisgICAgICAgIGlmICghbS5jb250YWlucygiLiIpKSB7DQorICAgICAgICAgIG0gPSBNZXRob2RIZWxwZXIuY2FsY3VsYXRlTWV0aG9kQ2Fub25pY2FsTmFtZShtX21ldGhvZENsYXNzLCBtZXRob2RzRGVwZW5kZWRVcG9uW2ldKTsNCisgICAgICAgICAgbWV0aG9kc0RlcGVuZGVkVXBvbltpXSA9IG0gIT0gbnVsbCA/IG0gOiBtZXRob2RzRGVwZW5kZWRVcG9uW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBzZXRNZXRob2RzRGVwZW5kZWRVcG9uKG1ldGhvZHNEZXBlbmRlZFVwb24pOw0KKyAgICB9DQorICB9DQorDQorDQorICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gY2FsY3VsYXRlWG1sR3JvdXBEZXBlbmRlbmNpZXMoWG1sVGVzdCB4bWxUZXN0KSB7DQorICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisgICAgaWYgKHhtbFRlc3QgPT0gbnVsbCkgew0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiB4bWxUZXN0LmdldFhtbERlcGVuZGVuY3lHcm91cHMoKS5lbnRyeVNldCgpKSB7DQorICAgICAgU3RyaW5nIG5hbWUgPSBlLmdldEtleSgpOw0KKyAgICAgIFN0cmluZyBkZXBlbmRzT24gPSBlLmdldFZhbHVlKCk7DQorICAgICAgU2V0PFN0cmluZz4gc2V0ID0gcmVzdWx0LmdldChuYW1lKTsNCisgICAgICBpZiAoc2V0ID09IG51bGwpIHsNCisgICAgICAgIHNldCA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICAgICAgcmVzdWx0LnB1dChuYW1lLCBzZXQpOw0KKyAgICAgIH0NCisgICAgICBzZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoU1BBQ0VfU0VQQVJBVE9SX1BBVFRFUk4uc3BsaXQoZGVwZW5kc09uKSkpOw0KKyAgICB9DQorDQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICBwcm90ZWN0ZWQgSUFubm90YXRpb25GaW5kZXIgZ2V0QW5ub3RhdGlvbkZpbmRlcigpIHsNCisgICAgcmV0dXJuIG1fYW5ub3RhdGlvbkZpbmRlcjsNCisgIH0NCisNCisgIHByb3RlY3RlZCBJQ2xhc3MgZ2V0SUNsYXNzKCkgew0KKyAgICByZXR1cm4gbV90ZXN0Q2xhc3M7DQorICB9DQorDQorICBwcml2YXRlIFN0cmluZyBjb21wdXRlU2lnbmF0dXJlKCkgew0KKyAgICBTdHJpbmcgY2xhc3NMb25nID0gbV9tZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCk7DQorICAgIFN0cmluZyBjbHMgPSBjbGFzc0xvbmcuc3Vic3RyaW5nKGNsYXNzTG9uZy5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQorICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoY2xzKS5hcHBlbmQoIi4iKS5hcHBlbmQobV9tZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoIigiKTsNCisgICAgaW50IGkgPSAwOw0KKyAgICBmb3IgKENsYXNzPD8+IHAgOiBtX21ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKSB7DQorICAgICAgaWYgKGkrKyA+IDApIHsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdC5hcHBlbmQocC5nZXROYW1lKCkpOw0KKyAgICB9DQorICAgIHJlc3VsdC5hcHBlbmQoIikiKTsNCisgICAgcmVzdWx0LmFwcGVuZCgiW3ByaToiKS5hcHBlbmQoZ2V0UHJpb3JpdHkoKSkuYXBwZW5kKCIsIGluc3RhbmNlOiIpLmFwcGVuZChtX2luc3RhbmNlKS5hcHBlbmQoIl0iKTsNCisNCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7DQorICAgIGlmIChtX3NpZ25hdHVyZSA9PSBudWxsKSB7DQorICAgICAgbV9zaWduYXR1cmUgPSBjb21wdXRlU2lnbmF0dXJlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG1fc2lnbmF0dXJlOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgcmV0dXJuIGdldFNpZ25hdHVyZSgpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZ1tdIG1ldGhvZEFycmF5LCBTdHJpbmdbXSBjbGFzc0FycmF5KSB7DQorICAgIGZpbmFsIFNldDxTdHJpbmc+IHZSZXN1bHQgPSBTZXRzLm5ld0hhc2hTZXQoKTsNCisgICAgaWYgKG51bGwgIT0gbWV0aG9kQXJyYXkpIHsNCisgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwodlJlc3VsdCwgbWV0aG9kQXJyYXkpOw0KKyAgICB9DQorICAgIGlmIChudWxsICE9IGNsYXNzQXJyYXkpIHsNCisgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwodlJlc3VsdCwgY2xhc3NBcnJheSk7DQorICAgIH0NCisgICAgcmV0dXJuIHZSZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3ZSZXN1bHQuc2l6ZSgpXSk7DQorICB9DQorDQorICBwcm90ZWN0ZWQgdm9pZCBzZXRHcm91cHMoU3RyaW5nW10gZ3JvdXBzKSB7DQorICAgIG1fZ3JvdXBzID0gZ3JvdXBzOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0R3JvdXBzRGVwZW5kZWRVcG9uKFN0cmluZ1tdIGdyb3VwcywgQ29sbGVjdGlvbjxTdHJpbmc+IHhtbEdyb3VwRGVwZW5kZW5jaWVzKSB7DQorICAgIExpc3Q8U3RyaW5nPiBsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICAgIGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ3JvdXBzKSk7DQorICAgIGwuYWRkQWxsKHhtbEdyb3VwRGVwZW5kZW5jaWVzKTsNCisgICAgbV9ncm91cHNEZXBlbmRlZFVwb24gPSBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0TWV0aG9kc0RlcGVuZGVkVXBvbihTdHJpbmdbXSBtZXRob2RzKSB7DQorICAgIG1fbWV0aG9kc0RlcGVuZGVkVXBvbiA9IG1ldGhvZHM7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBhZGRNZXRob2REZXBlbmRlZFVwb24oU3RyaW5nIG1ldGhvZCkgew0KKyAgICBTdHJpbmdbXSBuZXdNZXRob2RzID0gbmV3IFN0cmluZ1ttX21ldGhvZHNEZXBlbmRlZFVwb24ubGVuZ3RoICsgMV07DQorICAgIG5ld01ldGhvZHNbMF0gPSBtZXRob2Q7DQorICAgIFN5c3RlbS5hcnJheWNvcHkobV9tZXRob2RzRGVwZW5kZWRVcG9uLCAwLCBuZXdNZXRob2RzLCAxLCBtX21ldGhvZHNEZXBlbmRlZFVwb24ubGVuZ3RoKTsNCisgICAgbV9tZXRob2RzRGVwZW5kZWRVcG9uID0gbmV3TWV0aG9kczsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7DQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VUZXN0TWV0aG9kXSAiICsgcyk7DQorICB9DQorDQorICAvKiogQ29tcGFyZXMgdHdvIElUZXN0TkdNZXRob2QgYnkgZGF0ZS4gKi8NCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjw/PiBEQVRFX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgew0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7DQorICAgICAgdHJ5IHsNCisgICAgICAgIElUZXN0TkdNZXRob2QgbTEgPSAoSVRlc3ROR01ldGhvZCkgbzE7DQorICAgICAgICBJVGVzdE5HTWV0aG9kIG0yID0gKElUZXN0TkdNZXRob2QpIG8yOw0KKyAgICAgICAgcmV0dXJuIChpbnQpIChtMS5nZXREYXRlKCkgLSBtMi5nZXREYXRlKCkpOw0KKyAgICAgIH0NCisgICAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsNCisgICAgICAgIHJldHVybiAwOyAvLyBUT0RPIENRIGRvY3VtZW50IHRoaXMgbG9naWMNCisgICAgICB9DQorICAgIH0NCisgIH07DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgU3RyaW5nIGdldE1pc3NpbmdHcm91cCgpIHsNCisgICAgcmV0dXJuIG1fbWlzc2luZ0dyb3VwOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0TWlzc2luZ0dyb3VwKFN0cmluZyBncm91cCkgew0KKyAgICBtX21pc3NpbmdHcm91cCA9IGdyb3VwOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRUaHJlYWRQb29sU2l6ZSgpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorDQorICAvKioNCisgICAqIE5vLW9wLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldFRocmVhZFBvb2xTaXplKGludCB0aHJlYWRQb29sU2l6ZSkgew0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsNCisgICAgbV9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCisgICAgcmV0dXJuIG1fZGVzY3JpcHRpb247DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgew0KKyAgICBtX2VuYWJsZWQgPSBlbmFibGVkOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgew0KKyAgICByZXR1cm4gbV9lbmFibGVkOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZ1tdIGdldEJlZm9yZUdyb3VwcygpIHsNCisgICAgcmV0dXJuIG1fYmVmb3JlR3JvdXBzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZ1tdIGdldEFmdGVyR3JvdXBzKCkgew0KKyAgICByZXR1cm4gbV9hZnRlckdyb3VwczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgaW5jcmVtZW50Q3VycmVudEludm9jYXRpb25Db3VudCgpIHsNCisgICAgbV9jdXJyZW50SW52b2NhdGlvbkNvdW50LmluY3JlbWVudEFuZEdldCgpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgIHJldHVybiBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQuZ2V0KCk7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckludm9jYXRpb25Db3VudChpbnQgbikgew0KKyAgICBtX3BhcmFtZXRlckludm9jYXRpb25Db3VudCA9IG47DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVySW52b2NhdGlvbkNvdW50KCkgew0KKyAgICByZXR1cm4gbV9wYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQ7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBhYnN0cmFjdCBJVGVzdE5HTWV0aG9kIGNsb25lKCk7DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJUmV0cnlBbmFseXplciBnZXRSZXRyeUFuYWx5emVyKCkgew0KKyAgICByZXR1cm4gbV9yZXRyeUFuYWx5emVyOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRSZXRyeUFuYWx5emVyKElSZXRyeUFuYWx5emVyIHJldHJ5QW5hbHl6ZXIpIHsNCisgICAgbV9yZXRyeUFuYWx5emVyID0gcmV0cnlBbmFseXplcjsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25zKCkgew0KKyAgICByZXR1cm4gbV9za2lwRmFpbGVkSW52b2NhdGlvbnM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldFNraXBGYWlsZWRJbnZvY2F0aW9ucyhib29sZWFuIHMpIHsNCisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbnMgPSBzOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvblRpbWVPdXQobG9uZyB0aW1lT3V0KSB7DQorICAgIG1faW52b2NhdGlvblRpbWVPdXQgPSB0aW1lT3V0Ow0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgbG9uZyBnZXRJbnZvY2F0aW9uVGltZU91dCgpIHsNCisgICAgcmV0dXJuIG1faW52b2NhdGlvblRpbWVPdXQ7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoKSB7DQorICAgIHJldHVybiBtX2lnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldElnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoYm9vbGVhbiBpKSB7DQorICAgIG1faWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcyA9IGk7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldEludm9jYXRpb25OdW1iZXJzKCkgew0KKyAgICByZXR1cm4gbV9pbnZvY2F0aW9uTnVtYmVyczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbk51bWJlcnMoTGlzdDxJbnRlZ2VyPiBudW1iZXJzKSB7DQorICAgIG1faW52b2NhdGlvbk51bWJlcnMgPSBudW1iZXJzOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRGYWlsZWRJbnZvY2F0aW9uTnVtYmVycygpIHsNCisgICAgcmV0dXJuIG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIGFkZEZhaWxlZEludm9jYXRpb25OdW1iZXIoaW50IG51bWJlcikgew0KKyAgICBtX2ZhaWxlZEludm9jYXRpb25OdW1iZXJzLmFkZChudW1iZXIpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgew0KKyAgICByZXR1cm4gbV9wcmlvcml0eTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7DQorICAgIG1fcHJpb3JpdHkgPSBwcmlvcml0eTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFhtbFRlc3QgZ2V0WG1sVGVzdCgpIHsNCisgICAgcmV0dXJuIG1feG1sVGVzdDsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldFhtbFRlc3QoWG1sVGVzdCB4bWxUZXN0KSB7DQorICAgIG1feG1sVGVzdCA9IHhtbFRlc3Q7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBDb25zdHJ1Y3Rvck9yTWV0aG9kIGdldENvbnN0cnVjdG9yT3JNZXRob2QoKSB7DQorICAgIHJldHVybiBtX21ldGhvZDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZmluZE1ldGhvZFBhcmFtZXRlcnMoWG1sVGVzdCB0ZXN0KSB7DQorICAgIC8vIEdldCB0aGUgdGVzdCtzdWl0ZSBwYXJhbWV0ZXJzDQorICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gdGVzdC5nZXRBbGxQYXJhbWV0ZXJzKCk7DQorICAgIGZvciAoWG1sQ2xhc3MgeG1sQ2xhc3M6IHRlc3QuZ2V0WG1sQ2xhc3NlcygpKSB7DQorICAgICAgaWYgKHhtbENsYXNzLmdldE5hbWUoKS5lcXVhbHMoZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpKSkgew0KKyAgICAgICAgcmVzdWx0LnB1dEFsbCh4bWxDbGFzcy5nZXRMb2NhbFBhcmFtZXRlcnMoKSk7DQorICAgICAgICBmb3IgKFhtbEluY2x1ZGUgaW5jbHVkZSA6IHhtbENsYXNzLmdldEluY2x1ZGVkTWV0aG9kcygpKSB7DQorICAgICAgICAgIGlmIChpbmNsdWRlLmdldE5hbWUoKS5lcXVhbHMoZ2V0TWV0aG9kTmFtZSgpKSkgew0KKyAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwoaW5jbHVkZS5nZXRMb2NhbFBhcmFtZXRlcnMoKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0JzaC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0JzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZWU3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQnNoLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgYnNoLkV2YWxFcnJvcjsKK2ltcG9ydCBic2guSW50ZXJwcmV0ZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBCc2ggaW1wbGVtZW50cyBJQnNoIHsKKyAgcHJpdmF0ZSBzdGF0aWMgSW50ZXJwcmV0ZXIgc19pbnRlcnByZXRlcjsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaW5jbHVkZU1ldGhvZEZyb21FeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBJVGVzdE5HTWV0aG9kIHRtKSB7CisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworICAgIEludGVycHJldGVyIGludGVycHJldGVyID0gZ2V0SW50ZXJwcmV0ZXIoKTsKKyAgICB0cnkgeworICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBncm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogdG0uZ2V0R3JvdXBzKCkpIHsKKyAgICAgICAgZ3JvdXBzLnB1dChncm91cCwgZ3JvdXApOworICAgICAgfQorICAgICAgc2V0Q29udGV4dChpbnRlcnByZXRlciwgdG0uZ2V0TWV0aG9kKCksIGdyb3VwcywgdG0pOworICAgICAgT2JqZWN0IGV2YWxSZXN1bHQgPSBpbnRlcnByZXRlci5ldmFsKGV4cHJlc3Npb24pOworICAgICAgcmVzdWx0ID0gKEJvb2xlYW4pIGV2YWxSZXN1bHQ7CisgICAgfQorICAgIGNhdGNoIChFdmFsRXJyb3IgZXZhbEVycm9yKSB7CisgICAgICBVdGlscy5sb2coImJzaC5JbnRlcnByZXRlciIsIDIsICJDYW5ub3QgZXZhbHVhdGUgZXhwcmVzc2lvbjoiCisgICAgICAgICAgKyBleHByZXNzaW9uICsgIjoiICsgZXZhbEVycm9yLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgcmVzZXRDb250ZXh0KGludGVycHJldGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJbnRlcnByZXRlciBnZXRJbnRlcnByZXRlcigpIHsKKyAgICBpZihudWxsID09IHNfaW50ZXJwcmV0ZXIpIHsKKyAgICAgIHNfaW50ZXJwcmV0ZXI9IG5ldyBJbnRlcnByZXRlcigpOworICAgIH0KKworICAgIHJldHVybiBzX2ludGVycHJldGVyOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNldENvbnRleHQoSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIsIE1ldGhvZCBtZXRob2QsIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3JvdXBzLCBJVGVzdE5HTWV0aG9kIHRtKSB7CisgICAgdHJ5IHsKKyAgICAgIGludGVycHJldGVyLnNldCgibWV0aG9kIiwgbWV0aG9kKTsKKyAgICAgIGludGVycHJldGVyLnNldCgiZ3JvdXBzIiwgZ3JvdXBzKTsKKyAgICAgIGludGVycHJldGVyLnNldCgidGVzdG5nTWV0aG9kIiwgdG0pOworICAgIH0KKyAgICBjYXRjaChFdmFsRXJyb3IgZXZhbEVycm9yKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IEJTSCBpbnRlcnByZXRlciIsIGV2YWxFcnJvcik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29udGV4dChJbnRlcnByZXRlciBpbnRlcnByZXRlcikgeworICAgIHRyeSB7CisgICAgICBpbnRlcnByZXRlci51bnNldCgibWV0aG9kIik7CisgICAgICBpbnRlcnByZXRlci51bnNldCgiZ3JvdXBzIik7CisgICAgICBpbnRlcnByZXRlci51bnNldCgidGVzdG5nTWV0aG9kIik7CisgICAgfQorICAgIGNhdGNoKEV2YWxFcnJvciBldmFsRXJyb3IpIHsKKyAgICAgIFV0aWxzLmxvZygiYnNoLkludGVycHJldGVyIiwgMiwgIkNhbm5vdCByZXNldCBpbnRlcnByZXRlcjoiICsgZXZhbEVycm9yLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Cc2hNb2NrLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQnNoTW9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MGJmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQnNoTW9jay5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKKworcHVibGljIGNsYXNzIEJzaE1vY2sgaW1wbGVtZW50cyBJQnNoIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaW5jbHVkZU1ldGhvZEZyb21FeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBJVGVzdE5HTWV0aG9kIHRtKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9DbGFzc0hlbHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NsYXNzSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0YWE3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9DbGFzc0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTk5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kU2VsZWN0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5JT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLklPYmplY3RGYWN0b3J5MjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0T2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklGYWN0b3J5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklQYXJhbWV0ZXJzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLlNldHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmp1bml0LklKVW5pdFRlc3RSdW5uZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBkaWZmZXJlbnQgY2xhc3MgbWFuaXB1bGF0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzSGVscGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUX1RFU1RSVU5ORVI9ICJvcmcudGVzdG5nLmp1bml0LkpVbml0VGVzdFJ1bm5lciI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKVU5JVF80X1RFU1RSVU5ORVIgPSAib3JnLnRlc3RuZy5qdW5pdC5KVW5pdDRUZXN0UnVubmVyIjsKKworICAvKiogVGhlIGFkZGl0aW9uYWwgY2xhc3MgbG9hZGVycyB0byBmaW5kIGNsYXNzZXMgaW4uICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q2xhc3NMb2FkZXI+IG1fY2xhc3NMb2FkZXJzID0gbmV3IFZlY3Rvcjw+KCk7CisKKyAgLyoqIEFkZCBhIGNsYXNzIGxvYWRlciB0byB0aGUgc2VhcmNoYWJsZSBsb2FkZXJzLiAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgbV9jbGFzc0xvYWRlcnMuYWRkKGxvYWRlcik7CisgIH0KKworICAvKiogSGlkZSBjb25zdHJ1Y3Rvci4gKi8KKyAgcHJpdmF0ZSBDbGFzc0hlbHBlcigpIHsKKyAgICAvLyBIaWRlIENvbnN0cnVjdG9yCisgIH0KKworICBwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGNsYXp6KSB7CisgICAgdHJ5IHsKKyAgICAgIFQgaW5zdGFuY2UgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworCisgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorICAgIGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJDbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpCisgICAgICAgICAgKyAiIGRvZXMgbm90IGhhdmUgYSBuby1hcmdzIGNvbnN0cnVjdG9yIiwgaWFlKTsKKyAgICB9CisgICAgY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCksIGllKTsKKyAgICB9CisgICAgY2F0Y2goRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGVpaWVycikgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIGluIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBjbGFzcyAiCisgICAgICAgICAgKyBjbGF6ei5nZXROYW1lKCksIGVpaWVycik7CisgICAgfQorICAgIGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKHNlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yLCBPYmplY3QuLi4gcGFyYW1ldGVycykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UocGFyYW1ldGVycyk7CisgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcyAiICsgY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCksIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUcmllcyB0byBsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MgdXNpbmcgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIgb3IgaWYgbm9uZSwKKyAgICogdGhhbiBmcm9tIHRoZSBkZWZhdWx0IENsYXNzTG9hZGVyLiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gdGhlIHN0YW5kYXJkCisgICAqIGNsYXNzIGxvYWRpbmcgbWV0aG9kcyBpbiB0aGF0IGl0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MKKyAgICogaXMgbm90IGZvdW5kIGJ1dCByZXR1cm5zIG51bGwgaW5zdGVhZC4KKyAgICoKKyAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSB0byBiZSBsb2FkZWQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGNsYXNzIG9yIG51bGwgaWYgdGhlIGNsYXNzIGlzIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgVmVjdG9yPENsYXNzTG9hZGVyPiBhbGxDbGFzc0xvYWRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgIGlmIChjb250ZXh0Q2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgYWxsQ2xhc3NMb2FkZXJzLmFkZChjb250ZXh0Q2xhc3NMb2FkZXIpOworICAgIH0KKyAgICBpZiAobV9jbGFzc0xvYWRlcnMgIT0gbnVsbCkgeworICAgICAgYWxsQ2xhc3NMb2FkZXJzLmFkZEFsbChtX2NsYXNzTG9hZGVycyk7CisgICAgfQorCisgICAgZm9yIChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA6IGFsbENsYXNzTG9hZGVycykgeworICAgICAgaWYgKG51bGwgPT0gY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgICB9CisgICAgICBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIC8vIFdpdGggYWRkaXRpb25hbCBjbGFzcyBsb2FkZXJzLCBpdCBpcyBsZWdpdGltYXRlIHRvIGlnbm9yZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgIGlmIChudWxsID09IG1fY2xhc3NMb2FkZXJzIHx8IG1fY2xhc3NMb2FkZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgbG9nQ2xhc3NOb3RGb3VuZEVycm9yKGNsYXNzTmFtZSwgZXgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgfQorICAgIGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgbG9nQ2xhc3NOb3RGb3VuZEVycm9yKGNsYXNzTmFtZSwgY25mZSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0NsYXNzTm90Rm91bmRFcnJvcihTdHJpbmcgY2xhc3NOYW1lLCBFeGNlcHRpb24gZXgpIHsKKyAgICBVdGlscy5sb2coIkNsYXNzSGVscGVyIiwgMiwgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSAiICsgY2xhc3NOYW1lCisgICAgICAgICsgIiA6IENsYXNzIGRvZXNuJ3QgZXhpc3QgKCIgKyBleC5nZXRNZXNzYWdlKCkgKyAiKSIpOworICB9CisKKyAgLyoqCisgICAqIEZvciB0aGUgZ2l2ZW4gY2xhc3MsIHJldHVybnMgdGhlIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCAmIzY0O0ZhY3Rvcnkgb3IgbnVsbAorICAgKiBpZiBub25lIGlzIGZvdW5kLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzZWFyY2ggdXAgdGhlIHN1cGVyY2xhc3MgaGllcmFyY2h5LgorICAgKiBJZiBtb3JlIHRoYW4gb25lIG1ldGhvZCBpcyBARmFjdG9yeSBhbm5vdGF0ZWQsIGEgVGVzdE5HRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICogQHBhcmFtIGNscyBUaGUgY2xhc3MgdG8gc2VhcmNoIGZvciB0aGUgQEZhY3RvcnkgYW5ub3RhdGlvbi4KKyAgICogQHBhcmFtIGZpbmRlciBUaGUgZmluZGVyIChKREsgMS40IG9yIEpESyA1LjArKSB1c2UgdG8gc2VhcmNoIGZvciB0aGUgYW5ub3RhdGlvbi4KKyAgICoKKyAgICogQHJldHVybiB0aGUgQEZhY3RvcnkgPENPREU+bWV0aG9kPC9DT0RFPiBvciBudWxsCisgICAqLworICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yT3JNZXRob2QgZmluZERlY2xhcmVkRmFjdG9yeU1ldGhvZChDbGFzczw/PiBjbHMsCisgICAgICBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpIHsKKyAgICBDb25zdHJ1Y3Rvck9yTWV0aG9kIHJlc3VsdCA9IG51bGw7CisKKyAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBnZXRBdmFpbGFibGVNZXRob2RzKGNscykpIHsKKyAgICAgIElGYWN0b3J5QW5ub3RhdGlvbiBmID0gZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUZhY3RvcnlBbm5vdGF0aW9uLmNsYXNzKTsKKworICAgICAgaWYgKG51bGwgIT0gZikgeworICAgICAgICByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JPck1ldGhvZChtZXRob2QpOworICAgICAgICByZXN1bHQuc2V0RW5hYmxlZChmLmdldEVuYWJsZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGNscy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpKSB7CisgICAgICAgIElBbm5vdGF0aW9uIGYgPSBmaW5kZXIuZmluZEFubm90YXRpb24oY29uc3RydWN0b3IsIElGYWN0b3J5QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgQ29uc3RydWN0b3JPck1ldGhvZChjb25zdHJ1Y3Rvcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxvb2sgZm9yIG5lc3RlZCBjbGFzc2VzCisvLyAgICBpZiAobnVsbCA9PSByZXN1bHQpIHsKKy8vICAgICAgQ2xhc3NbXSBzdWJDbGFzc2VzID0gY2xzLmdldENsYXNzZXMoKTsKKy8vICAgICAgZm9yIChDbGFzcyBzdWJDbGFzcyA6IHN1YkNsYXNzZXMpIHsKKy8vICAgICAgICByZXN1bHQgPSBmaW5kRmFjdG9yeU1ldGhvZChzdWJDbGFzcywgZmluZGVyKTsKKy8vICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKKy8vICAgICAgICAgIGJyZWFrOworLy8gICAgICAgIH0KKy8vICAgICAgfQorLy8gICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBFeHRyYWN0IGFsbCBjYWxsYWJsZSBtZXRob2RzIG9mIGEgY2xhc3MgYW5kIGFsbCBpdHMgc3VwZXIgKGtlZXBpbmcgaW4gbWluZAorICAgKiB0aGUgSmF2YSBhY2Nlc3MgcnVsZXMpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTZXQ8TWV0aG9kPiBnZXRBdmFpbGFibGVNZXRob2RzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgU2V0PE1ldGhvZD4gbWV0aG9kcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIG1ldGhvZHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpKTsKKworICAgIENsYXNzPD8+IHBhcmVudCA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICB3aGlsZSAobnVsbCAhPSBwYXJlbnQpIHsKKyAgICAgIG1ldGhvZHMuYWRkQWxsKGV4dHJhY3RNZXRob2RzKGNsYXp6LCBwYXJlbnQsIG1ldGhvZHMpKTsKKyAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1ldGhvZHM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIElKVW5pdFRlc3RSdW5uZXIgY3JlYXRlVGVzdFJ1bm5lcihUZXN0UnVubmVyIHJ1bm5lcikgeworICAgICAgdHJ5IHsKKyAgICAgICAgICAvL3RyeSB0byBnZXQgcnVubmVyIGZvciBKVW5pdCA0IGZpcnN0CisgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmp1bml0LlRlc3QiKTsKKyAgICAgICAgICBJSlVuaXRUZXN0UnVubmVyIHRyID0gKElKVW5pdFRlc3RSdW5uZXIpIENsYXNzSGVscGVyLmZvck5hbWUoSlVOSVRfNF9URVNUUlVOTkVSKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgIHRyLnNldFRlc3RSZXN1bHROb3RpZmllcihydW5uZXIpOworICAgICAgICAgIHJldHVybiB0cjsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgVXRpbHMubG9nKCJDbGFzc0hlbHBlciIsIDIsICJKVW5pdCA0IHdhcyBub3QgZm91bmQgb24gdGhlIGNsYXNzcGF0aCIpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIC8vZmFsbGJhY2sgdG8gSlVuaXQgMworICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqdW5pdC5mcmFtZXdvcmsuVGVzdCIpOworICAgICAgICAgICAgICBJSlVuaXRUZXN0UnVubmVyIHRyID0gKElKVW5pdFRlc3RSdW5uZXIpIENsYXNzSGVscGVyLmZvck5hbWUoSlVOSVRfVEVTVFJVTk5FUikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgdHIuc2V0VGVzdFJlc3VsdE5vdGlmaWVyKHJ1bm5lcik7CisKKyAgICAgICAgICAgICAgcmV0dXJuIHRyOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICBVdGlscy5sb2coIkNsYXNzSGVscGVyIiwgMiwgIkpVbml0IDMgd2FzIG5vdCBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgIC8vdGhlcmUncyBubyBKVW5pdCBvbiB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgSlVuaXQgcnVubmVyIiwgZXgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFNldDxNZXRob2Q+IGV4dHJhY3RNZXRob2RzKENsYXNzPD8+IGNoaWxkQ2xhc3MsIENsYXNzPD8+IGNsYXp6LAorICAgICAgU2V0PE1ldGhvZD4gY29sbGVjdGVkKSB7CisgICAgU2V0PE1ldGhvZD4gbWV0aG9kcyA9IFNldHMubmV3SGFzaFNldCgpOworCisgICAgTWV0aG9kW10gZGVjbGFyZWRNZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisKKyAgICBQYWNrYWdlIGNoaWxkUGFja2FnZSA9IGNoaWxkQ2xhc3MuZ2V0UGFja2FnZSgpOworICAgIFBhY2thZ2UgY2xhc3NQYWNrYWdlID0gY2xhenouZ2V0UGFja2FnZSgpOworICAgIGJvb2xlYW4gaXNTYW1lUGFja2FnZSA9IGZhbHNlOworCisgICAgaWYgKChudWxsID09IGNoaWxkUGFja2FnZSkgJiYgKG51bGwgPT0gY2xhc3NQYWNrYWdlKSkgeworICAgICAgaXNTYW1lUGFja2FnZSA9IHRydWU7CisgICAgfQorICAgIGlmICgobnVsbCAhPSBjaGlsZFBhY2thZ2UpICYmIChudWxsICE9IGNsYXNzUGFja2FnZSkpIHsKKyAgICAgIGlzU2FtZVBhY2thZ2UgPSBjaGlsZFBhY2thZ2UuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1BhY2thZ2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBkZWNsYXJlZE1ldGhvZHMpIHsKKyAgICAgIGludCBtZXRob2RNb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7CisgICAgICBpZiAoKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZE1vZGlmaWVycykgfHwgTW9kaWZpZXIuaXNQcm90ZWN0ZWQobWV0aG9kTW9kaWZpZXJzKSkKKyAgICAgICAgfHwgKGlzU2FtZVBhY2thZ2UgJiYgIU1vZGlmaWVyLmlzUHJpdmF0ZShtZXRob2RNb2RpZmllcnMpKSkgeworICAgICAgICBpZiAoIWlzT3ZlcnJpZGRlbihtZXRob2QsIGNvbGxlY3RlZCkgJiYgIU1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kTW9kaWZpZXJzKSkgeworICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWV0aG9kczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPdmVycmlkZGVuKE1ldGhvZCBtZXRob2QsIFNldDxNZXRob2Q+IGNvbGxlY3RlZE1ldGhvZHMpIHsKKyAgICBDbGFzczw/PiBtZXRob2RDbGFzcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOworICAgIENsYXNzPD8+W10gbWV0aG9kUGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisKKyAgICBmb3IgKE1ldGhvZCBtOiBjb2xsZWN0ZWRNZXRob2RzKSB7CisgICAgICBDbGFzczw/PltdIHBhcmFtVHlwZXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobS5nZXROYW1lKCkpCisgICAgICAgICAmJiBtZXRob2RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSkKKyAgICAgICAgICYmIG1ldGhvZFBhcmFtcy5sZW5ndGggPT0gcGFyYW1UeXBlcy5sZW5ndGgpIHsKKworICAgICAgICBib29sZWFuIHNhbWVQYXJhbWV0ZXJzID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IG1ldGhvZFBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmICghbWV0aG9kUGFyYW1zW2ldLmVxdWFscyhwYXJhbVR5cGVzW2ldKSkgeworICAgICAgICAgICAgc2FtZVBhcmFtZXRlcnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYW1lUGFyYW1ldGVycykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBJTWV0aG9kU2VsZWN0b3IgY3JlYXRlU2VsZWN0b3Iob3JnLnRlc3RuZy54bWwuWG1sTWV0aG9kU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICB0cnkgeworICAgICAgQ2xhc3M8Pz4gY2xzID0gQ2xhc3MuZm9yTmFtZShzZWxlY3Rvci5nZXRDbGFzc05hbWUoKSk7CisgICAgICByZXR1cm4gKElNZXRob2RTZWxlY3RvcikgY2xzLm5ld0luc3RhbmNlKCk7CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ291bGRuJ3QgZmluZCBtZXRob2Qgc2VsZWN0b3IgOiAiICsgc2VsZWN0b3IuZ2V0Q2xhc3NOYW1lKCksIGV4KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCisgICAqLworICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZShDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywKKyAgICAgIE1hcDxDbGFzcywgSUNsYXNzPiBjbGFzc2VzLAorICAgICAgWG1sVGVzdCB4bWxUZXN0LAorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLAorICAgICAgSVRlc3RPYmplY3RGYWN0b3J5IG9iamVjdEZhY3RvcnkpCisgIHsKKyAgICBpZiAob2JqZWN0RmFjdG9yeSBpbnN0YW5jZW9mIElPYmplY3RGYWN0b3J5KSB7CisgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UxKGRlY2xhcmluZ0NsYXNzLCBjbGFzc2VzLCB4bWxUZXN0LCBmaW5kZXIsCisgICAgICAgICAgKElPYmplY3RGYWN0b3J5KSBvYmplY3RGYWN0b3J5KTsKKyAgICB9IGVsc2UgaWYgKG9iamVjdEZhY3RvcnkgaW5zdGFuY2VvZiBJT2JqZWN0RmFjdG9yeTIpIHsKKyAgICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZTIoZGVjbGFyaW5nQ2xhc3MsIChJT2JqZWN0RmFjdG9yeTIpIG9iamVjdEZhY3RvcnkpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVua25vd24gb2JqZWN0IGZhY3RvcnkgdHlwZToiICsgb2JqZWN0RmFjdG9yeSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNyZWF0ZUluc3RhbmNlMihDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywgSU9iamVjdEZhY3RvcnkyIG9iamVjdEZhY3RvcnkpIHsKKyAgICByZXR1cm4gb2JqZWN0RmFjdG9yeS5uZXdJbnN0YW5jZShkZWNsYXJpbmdDbGFzcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZTEoQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzcywgSUNsYXNzPiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxUZXN0IHhtbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSkgeworICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworCisgICAgdHJ5IHsKKworICAgICAgLy8KKyAgICAgIC8vIEFueSBhbm5vdGF0ZWQgY29uc3RydWN0b3I/CisgICAgICAvLworICAgICAgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgPSBmaW5kQW5ub3RhdGVkQ29uc3RydWN0b3IoZmluZGVyLCBkZWNsYXJpbmdDbGFzcyk7CisgICAgICBpZiAobnVsbCAhPSBjb25zdHJ1Y3RvcikgeworICAgICAgICBJUGFyYW1ldGVyc0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IGZpbmRlci5maW5kQW5ub3RhdGlvbihjb25zdHJ1Y3RvciwgSVBhcmFtZXRlcnNBbm5vdGF0aW9uLmNsYXNzKTsKKworICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcyA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKKyAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMuY3JlYXRlSW5zdGFudGlhdGlvblBhcmFtZXRlcnMoY29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sVGVzdC5nZXRBbGxQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sVGVzdC5nZXRTdWl0ZSgpKTsKKyAgICAgICAgcmVzdWx0ID0gb2JqZWN0RmFjdG9yeS5uZXdJbnN0YW5jZShjb25zdHJ1Y3RvciwgcGFyYW1ldGVycyk7CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBObywganVzdCB0cnkgdG8gaW5zdGFudGlhdGUgdGhlIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgKG9yIHRoZSBvbmUKKyAgICAgIC8vIHdpdGggYSBTdHJpbmcpCisgICAgICAvLworICAgICAgZWxzZSB7CisKKyAgICAgICAgLy8gSWYgdGhpcyBjbGFzcyBpcyBhIChub24tc3RhdGljKSBuZXN0ZWQgY2xhc3MsIHRoZSBjb25zdHJ1Y3RvciBjb250YWlucyBhIGhpZGRlbgorICAgICAgICAvLyBwYXJhbWV0ZXIgb2YgdGhlIHR5cGUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcworICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzID0gbmV3IENsYXNzWzBdOworICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gbmV3IE9iamVjdFswXTsKKyAgICAgICAgQ2xhc3M8Pz4gZWMgPSBnZXRFbmNsb3NpbmdDbGFzcyhkZWNsYXJpbmdDbGFzcyk7CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSAwICE9IChkZWNsYXJpbmdDbGFzcy5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQyk7CisKKyAgICAgICAgLy8gT25seSBhZGQgdGhlIGV4dHJhIHBhcmFtZXRlciBpZiB0aGUgbmVzdGVkIGNsYXNzIGlzIG5vdCBzdGF0aWMKKyAgICAgICAgaWYgKChudWxsICE9IGVjKSAmJiAhaXNTdGF0aWMpIHsKKyAgICAgICAgICBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBDbGFzc1tdIHsgZWMgfTsKKworICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIHNvIHdlIGNhbiBpbnN0YW50aWF0ZQorICAgICAgICAgIC8vIHRoZSBuZXN0ZWQgY2xhc3MgKGFjdHVhbGx5LCB3ZSByZXVzZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UpLgorICAgICAgICAgIElDbGFzcyBlbmNsb3NpbmdJQ2xhc3MgPSBjbGFzc2VzLmdldChlYyk7CisgICAgICAgICAgT2JqZWN0W10gZW5jbG9zaW5nSW5zdGFuY2VzOworICAgICAgICAgIGlmIChudWxsICE9IGVuY2xvc2luZ0lDbGFzcykgeworICAgICAgICAgICAgZW5jbG9zaW5nSW5zdGFuY2VzID0gZW5jbG9zaW5nSUNsYXNzLmdldEluc3RhbmNlcyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoKG51bGwgPT0gZW5jbG9zaW5nSW5zdGFuY2VzKSB8fCAoZW5jbG9zaW5nSW5zdGFuY2VzLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdEZhY3RvcnkubmV3SW5zdGFuY2UoZWMuZ2V0Q29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpKTsKKyAgICAgICAgICAgICAgZW5jbG9zaW5nSUNsYXNzLmFkZEluc3RhbmNlKG8pOworICAgICAgICAgICAgICBlbmNsb3NpbmdJbnN0YW5jZXMgPSBuZXcgT2JqZWN0W10geyBvIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW5jbG9zaW5nSW5zdGFuY2VzID0gbmV3IE9iamVjdFtdIHsgZWMubmV3SW5zdGFuY2UoKSB9OworICAgICAgICAgIH0KKyAgICAgICAgICBPYmplY3QgZW5jbG9zaW5nQ2xhc3NJbnN0YW5jZSA9IGVuY2xvc2luZ0luc3RhbmNlc1swXTsKKworICAgICAgICAgIC8vIFV0aWxzLmNyZWF0ZUluc3RhbmNlKGVjLCBjbGFzc2VzLCB4bWxUZXN0LCBmaW5kZXIpOworICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgT2JqZWN0W10geyBlbmNsb3NpbmdDbGFzc0luc3RhbmNlIH07CisgICAgICAgIH0gLy8gaXNTdGF0aWMKKworICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjdCA9IGRlY2xhcmluZ0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICBjdCA9IGRlY2xhcmluZ0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IE9iamVjdFtdIHsgIkRlZmF1bHQgdGVzdCBuYW1lIiB9OworICAgICAgICAgIC8vIElmIGN0ID09IG51bGwgaGVyZSwgd2UnbGwgcGFzcyBhIG51bGwKKyAgICAgICAgICAvLyBjb25zdHJ1Y3RvciB0byB0aGUgZmFjdG9yeSBhbmQgaG9wZSBpdCBjYW4gZGVhbCB3aXRoIGl0CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gb2JqZWN0RmFjdG9yeS5uZXdJbnN0YW5jZShjdCwgcGFyYW1ldGVycyk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChUZXN0TkdFeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IGV4OworLy8gICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJDb3VsZG4ndCBpbnN0YW50aWF0ZSBjbGFzczoiICsgZGVjbGFyaW5nQ2xhc3MpOworICAgIH0KKyAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgfQorICAgIGNhdGNoIChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgIC8vIFNvbWV0aGluZyBlbHNlIHdlbnQgd3Jvbmcgd2hlbiBydW5uaW5nIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5zdGFudGlhdGluZyBjbGFzcyAiCisgICAgICAgICAgKyBkZWNsYXJpbmdDbGFzcy5nZXROYW1lKCkgKyAiOiAiICsgY2F1c2UuZ2V0TWVzc2FnZSgpLCBjYXVzZSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICBpZiAoISBNb2RpZmllci5pc1B1YmxpYyhkZWNsYXJpbmdDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgLy9yZXN1bHQgc2hvdWxkIG5vdCBiZSBudWxsCisgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbnRpYXRpbmcgY2xhc3MgIgorICAgICAgICAgICAgKyBkZWNsYXJpbmdDbGFzcy5nZXROYW1lKCkgKyAiLiBDaGVjayB0byBtYWtlIHN1cmUgaXQgY2FuIGJlIGFjY2Vzc2VkL2luc3RhbnRpYXRlZC4iKTsKKy8vICAgICAgfSBlbHNlIHsKKy8vICAgICAgICBVdGlscy5sb2coQ2xhc3NIZWxwZXIuY2xhc3MuZ2V0TmFtZSgpLCAyLCAiQ291bGRuJ3QgaW5zdGFudGlhdGUgY2xhc3MgIiArIGRlY2xhcmluZ0NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIENsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgb25seSBleGlzdHMgb24gSkRLNSwgc28gcmVpbXBsZW1lbnRpbmcgaXQKKyAgICogaGVyZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGdldEVuY2xvc2luZ0NsYXNzKENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzKSB7CisgICAgQ2xhc3M8Pz4gcmVzdWx0ID0gbnVsbDsKKworICAgIFN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdDbGFzcy5nZXROYW1lKCk7CisgICAgaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQiKTsKKyAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgIFN0cmluZyBlY24gPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlc3VsdCA9IENsYXNzLmZvck5hbWUoZWNuKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEZpbmQgdGhlIGJlc3QgY29uc3RydWN0b3IgZ2l2ZW4gdGhlIHBhcmFtZXRlcnMgZm91bmQgb24gdGhlIGFubm90YXRpb24KKyAgICovCisgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPD8+IGZpbmRBbm5vdGF0ZWRDb25zdHJ1Y3RvcihJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcykgeworICAgIENvbnN0cnVjdG9yPD8+W10gY29uc3RydWN0b3JzID0gZGVjbGFyaW5nQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKKworICAgIGZvciAoQ29uc3RydWN0b3I8Pz4gcmVzdWx0IDogY29uc3RydWN0b3JzKSB7CisgICAgICBJUGFyYW1ldGVyc0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IGZpbmRlci5maW5kQW5ub3RhdGlvbihyZXN1bHQsIElQYXJhbWV0ZXJzQW5ub3RhdGlvbi5jbGFzcyk7CisKKyAgICAgIGlmIChudWxsICE9IGFubm90YXRpb24pIHsKKyAgICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKKyAgICAgICAgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyA9IHJlc3VsdC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiUGFyYW1ldGVyIGNvdW50IG1pc21hdGNoOiAgIiArIHJlc3VsdCArICJcbmFjY2VwdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYXJhbWV0ZXJzIGJ1dCB0aGUgQFRlc3QgYW5ub3RhdGlvbiBkZWNsYXJlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxUPiBUIHRyeU90aGVyQ29uc3RydWN0b3IoQ2xhc3M8VD4gZGVjbGFyaW5nQ2xhc3MpIHsKKyAgICBUIHJlc3VsdDsKKyAgICB0cnkgeworICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbm5lciBjbGFzc2VzCisgICAgICBpZiAoZGVjbGFyaW5nQ2xhc3MuZ2V0TW9kaWZpZXJzKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgQ29uc3RydWN0b3I8VD4gY3RvciA9IGRlY2xhcmluZ0NsYXNzLmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcyk7CisgICAgICByZXN1bHQgPSBjdG9yLm5ld0luc3RhbmNlKCJEZWZhdWx0IHRlc3QgbmFtZSIpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICBpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgJiYgKGUuZ2V0Q2F1c2UoKSAhPSBudWxsKSkgeworICAgICAgICBtZXNzYWdlID0gZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBlcnJvciA9ICJDb3VsZCBub3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGNsYXNzICIgKyBkZWNsYXJpbmdDbGFzcworICAgICAgKyAoKG1lc3NhZ2UgIT0gbnVsbCkgPyAoIjogIiArIG1lc3NhZ2UpIDogIiIpCisgICAgICAgICsgIi5cblBsZWFzZSBtYWtlIHN1cmUgaXQgaGFzIGEgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGVpdGhlciBhIFN0cmluZyBvciBubyBwYXJhbWV0ZXIuIjsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oZXJyb3IpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogV2hlbiBnaXZlbiBhIGZpbGUgbmFtZSB0byBmb3JtIGEgY2xhc3MgbmFtZSwgdGhlIGZpbGUgbmFtZSBpcyBwYXJzZWQgYW5kIGRpdmlkZWQKKyAgICogaW50byBzZWdtZW50cy4gRm9yIGV4YW1wbGUsICJjOi9qYXZhL2NsYXNzZXMvY29tL2Zvby9BLmNsYXNzIiB3b3VsZCBiZSBkaXZpZGVkCisgICAqIGludG8gNiBzZWdtZW50cyB7IkM6IiAiamF2YSIsICJjbGFzc2VzIiwgImNvbSIsICJmb28iLCAiQSJ9LiBUaGUgZmlyc3Qgc2VnbWVudAorICAgKiBhY3R1YWxseSBtYWtpbmcgdXAgdGhlIGNsYXNzIG5hbWUgaXMgWzNdLiBUaGlzIHZhbHVlIGlzIHNhdmVkIGluIG1fbGFzdEdvb2RSb290SW5kZXgKKyAgICogc28gdGhhdCB3aGVuIHdlIHBhcnNlIHRoZSBuZXh0IGZpbGUgbmFtZSwgd2Ugd2lsbCB0cnkgMyByaWdodCBhd2F5LiBJZiAzIGZhaWxzIHdlCisgICAqIHdpbGwgdGFrZSB0aGUgbG9uZyBhcHByb2FjaC4gVGhpcyBpcyBqdXN0IGEgb3B0aW1pemF0aW9uIGNhY2hlIHZhbHVlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fbGFzdEdvb2RSb290SW5kZXggPSAtMTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgQ2xhc3Mgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG5hbWUuIFRoZSBuYW1lIG1heSBiZQorICAgKiBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisgICAqIDx1bD4KKyAgICogPGxpPkEgY2xhc3MgbmFtZTogIm9yZy50ZXN0bmcuVGVzdE5HIjwvbGk+CisgICAqIDxsaT5BIGNsYXNzIGZpbGUgbmFtZTogIi90ZXN0bmcvc3JjL29yZy90ZXN0bmcvVGVzdE5HLmNsYXNzIjwvbGk+CisgICAqIDxsaT5BIGNsYXNzIHNvdXJjZSBuYW1lOiAiZDpcdGVzdG5nXHNyY1xvcmdcdGVzdG5nXFRlc3RORy5qYXZhIjwvbGk+CisgICAqIDwvdWw+CisgICAqCisgICAqIEBwYXJhbSBmaWxlCisgICAqICAgICAgICAgIHRoZSBjbGFzcyBuYW1lLgorICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYW1lIHNwZWNpZmllZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZmlsZVRvQ2xhc3MoU3RyaW5nIGZpbGUpIHsKKyAgICBDbGFzczw/PiByZXN1bHQgPSBudWxsOworCisgICAgaWYoIWZpbGUuZW5kc1dpdGgoIi5jbGFzcyIpICYmICFmaWxlLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAvLyBEb2Vzbid0IGVuZCBpbiAuamF2YSBvciAuY2xhc3MsIGFzc3VtZSBpdCdzIGEgY2xhc3MgbmFtZQorCisgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCJjbGFzcyAiKSkgeworICAgICAgICBmaWxlID0gZmlsZS5zdWJzdHJpbmcoImNsYXNzICIubGVuZ3RoKCkpOworICAgICAgfQorCisgICAgICByZXN1bHQgPSBDbGFzc0hlbHBlci5mb3JOYW1lKGZpbGUpOworCisgICAgICBpZiAobnVsbCA9PSByZXN1bHQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2Fubm90IGxvYWQgY2xhc3MgZnJvbSBmaWxlOiAiICsgZmlsZSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaW50IGNsYXNzSW5kZXggPSBmaWxlLmxhc3RJbmRleE9mKCIuY2xhc3MiKTsKKyAgICBpZiAoLTEgPT0gY2xhc3NJbmRleCkgeworICAgICAgY2xhc3NJbmRleCA9IGZpbGUubGFzdEluZGV4T2YoIi5qYXZhIik7CisvLworLy8gICAgICBpZigtMSA9PSBjbGFzc0luZGV4KSB7CisvLyAgICAgICAgcmVzdWx0ID0gQ2xhc3NIZWxwZXIuZm9yTmFtZShmaWxlKTsKKy8vCisvLyAgICAgICAgaWYgKG51bGwgPT0gcmVzdWx0KSB7CisvLyAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBjbGFzcyBmcm9tIGZpbGU6ICIgKyBmaWxlKTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIHJldHVybiByZXN1bHQ7CisvLyAgICAgIH0KKy8vCisgICAgfQorCisgICAgLy8gVHJhbnNmb3JtcyB0aGUgZmlsZSBuYW1lIGludG8gYSBjbGFzcyBuYW1lLgorCisgICAgLy8gUmVtb3ZlIHRoZSAiLmNsYXNzIiBvciAiLmphdmEiIGV4dGVuc2lvbi4KKyAgICBTdHJpbmcgc2hvcnRGaWxlTmFtZSA9IGZpbGUuc3Vic3RyaW5nKDAsIGNsYXNzSW5kZXgpOworCisgICAgLy8gU3BsaXQgZmlsZSBuYW1lIGludG8gc2VnbWVudHMuIEZvciBleGFtcGxlICJjOi9qYXZhL2NsYXNzZXMvY29tL2Zvby9BIgorICAgIC8vIGJlY29tZXMgeyJjOiIsICJqYXZhIiwgImNsYXNzZXMiLCAiY29tIiwgImZvbyIsICJBIn0KKyAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHNob3J0RmlsZU5hbWUuc3BsaXQoIlsvXFxcXF0iLCAtMSk7CisKKyAgICAvLworICAgIC8vIENoZWNrIGlmIHRoZSBsYXN0IGdvb2Qgcm9vdCBpbmRleCB3b3JrcyBmb3IgdGhpcyBvbmUuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJldmlvdXMKKyAgICAvLyBuYW1lIHdhcyAiYzovamF2YS9jbGFzc2VzL2NvbS9mb28vQS5jbGFzcyIgdGhlbiBtX2xhc3RHb29kUm9vdEluZGV4IGlzIDMgYW5kIHdlCisgICAgLy8gdHJ5IHRvIG1ha2UgYSBjbGFzcyBuYW1lIGlnbm9yaW5nIHRoZSBmaXJzdCBtX2xhc3RHb29kUm9vdEluZGV4IHNlZ21lbnRzICgzKS4gVGhpcworICAgIC8vIHdpbGwgc3VjY2VlZCByYXBpZGx5IGlmIHRoZSBwYXRoIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZnJvbSB0aGUgcHJldmlvdXMgbmFtZS4KKyAgICAvLworICAgIGlmICgtMSAhPSBtX2xhc3RHb29kUm9vdEluZGV4KSB7CisKKyAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NOYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoc2VnbWVudHNbbV9sYXN0R29vZFJvb3RJbmRleF0pOworICAgICAgZm9yIChpbnQgaSA9IG1fbGFzdEdvb2RSb290SW5kZXggKyAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY2xhc3NOYW1lLmFwcGVuZCgiLiIpLmFwcGVuZChzZWdtZW50c1tpXSk7CisgICAgICB9CisKKyAgICAgIHJlc3VsdCA9IENsYXNzSGVscGVyLmZvck5hbWUoY2xhc3NOYW1lLnRvU3RyaW5nKCkpOworCisgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFdlIGhhdmVuJ3QgZm91bmQgYSBnb29kIHJvb3QgeWV0LCBzdGFydCBieSByZXNvbHZpbmcgdGhlIGNsYXNzIGZyb20gdGhlIGVuZCBzZWdtZW50CisgICAgLy8gYW5kIHdvcmsgb3VyIHdheSB1cC4gIEZvciBleGFtcGxlLCBpZiB3ZSBzdGFydCB3aXRoICJjOi9qYXZhL2NsYXNzZXMvY29tL2Zvby9BIgorICAgIC8vIHdlJ2xsIHN0YXJ0IGJ5IHJlc29sdmluZyAiQSIsIHRoZW4gImZvby5BIiwgdGhlbiAiY29tLmZvby5BIiB1bnRpbCBzb21ldGhpbmcKKyAgICAvLyByZXNvbHZlcy4gIFdoZW4gaXQgZG9lcywgd2UgcmVtZW1iZXIgdGhlIHBhdGggd2UgYXJlIGF0IGFzICJsYXN0R29vZFJvb2RJbmRleCIuCisgICAgLy8KKworICAgIC8vIFRPRE8gQ1EgdXNlIGEgU3RyaW5nQnVmZmVyIGhlcmUKKyAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKKyAgICBmb3IgKGludCBpID0gc2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChudWxsID09IGNsYXNzTmFtZSkgeworICAgICAgICBjbGFzc05hbWUgPSBzZWdtZW50c1tpXTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjbGFzc05hbWUgPSBzZWdtZW50c1tpXSArICIuIiArIGNsYXNzTmFtZTsKKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gQ2xhc3NIZWxwZXIuZm9yTmFtZShjbGFzc05hbWUpOworCisgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKKyAgICAgICAgbV9sYXN0R29vZFJvb3RJbmRleCA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChudWxsID09IHJlc3VsdCkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2Fubm90IGxvYWQgY2xhc3MgZnJvbSBmaWxlOiAiICsgZmlsZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ2xhc3NJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ2xhc3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjBhOGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9DbGFzc0ltcGwuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHMuaXNTdHJpbmdOb3RFbXB0eTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TdGFnZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSU1vZHVsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0T2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5PYmplY3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gSUNsYXNzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIENsYXNzSW1wbCBpbXBsZW1lbnRzIElDbGFzcyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDExMTgxNzgyNzMzMTc1MjAzNDRMOworICB0cmFuc2llbnQgcHJpdmF0ZSBDbGFzcyBtX2NsYXNzID0gbnVsbDsKKyAgdHJhbnNpZW50IHByaXZhdGUgT2JqZWN0IG1fZGVmYXVsdEluc3RhbmNlID0gbnVsbDsKKyAgcHJpdmF0ZSBYbWxUZXN0IG1feG1sVGVzdCA9IG51bGw7CisgIHRyYW5zaWVudCBwcml2YXRlIElBbm5vdGF0aW9uRmluZGVyIG1fYW5ub3RhdGlvbkZpbmRlciA9IG51bGw7CisgIHRyYW5zaWVudCBwcml2YXRlIExpc3Q8T2JqZWN0PiBtX2luc3RhbmNlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB0cmFuc2llbnQgcHJpdmF0ZSBNYXA8Q2xhc3MsIElDbGFzcz4gbV9jbGFzc2VzID0gbnVsbDsKKyAgcHJpdmF0ZSBpbnQgbV9pbnN0YW5jZUNvdW50OworICBwcml2YXRlIGxvbmdbXSBtX2luc3RhbmNlSGFzaENvZGVzOworICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgbV9pbnN0YW5jZTsKKyAgcHJpdmF0ZSBJVGVzdE9iamVjdEZhY3RvcnkgbV9vYmplY3RGYWN0b3J5OworICBwcml2YXRlIFN0cmluZyBtX3Rlc3ROYW1lID0gbnVsbDsKKyAgcHJpdmF0ZSBYbWxDbGFzcyBtX3htbENsYXNzOworICBwcml2YXRlIElUZXN0Q29udGV4dCBtX3Rlc3RDb250ZXh0OworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9oYXNQYXJlbnRNb2R1bGU7CisKKyAgcHVibGljIENsYXNzSW1wbChJVGVzdENvbnRleHQgY29udGV4dCwgQ2xhc3MgY2xzLCBYbWxDbGFzcyB4bWxDbGFzcywgT2JqZWN0IGluc3RhbmNlLAorICAgICAgTWFwPENsYXNzLCBJQ2xhc3M+IGNsYXNzZXMsIFhtbFRlc3QgeG1sVGVzdCwgSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgIElUZXN0T2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5KSB7CisgICAgbV90ZXN0Q29udGV4dCA9IGNvbnRleHQ7CisgICAgbV9jbGFzcyA9IGNsczsKKyAgICBtX2NsYXNzZXMgPSBjbGFzc2VzOworICAgIG1feG1sQ2xhc3MgPSB4bWxDbGFzczsKKyAgICBtX3htbFRlc3QgPSB4bWxUZXN0OworICAgIG1fYW5ub3RhdGlvbkZpbmRlciA9IGFubm90YXRpb25GaW5kZXI7CisgICAgbV9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIG1fb2JqZWN0RmFjdG9yeSA9IG9iamVjdEZhY3Rvcnk7CisgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgSVRlc3QpIHsKKyAgICAgIG1fdGVzdE5hbWUgPSAoKElUZXN0KSBpbnN0YW5jZSkuZ2V0VGVzdE5hbWUoKTsKKyAgICB9CisgICAgaWYgKG1fdGVzdE5hbWUgPT0gbnVsbCkgeworICAgICAgSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtX2Fubm90YXRpb25GaW5kZXIuZmluZEFubm90YXRpb24oY2xzLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICBtX3Rlc3ROYW1lID0gYW5ub3RhdGlvbi5nZXRUZXN0TmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBtX2hhc1BhcmVudE1vZHVsZSA9IGlzU3RyaW5nTm90RW1wdHkobV90ZXN0Q29udGV4dC5nZXRTdWl0ZSgpLmdldFBhcmVudE1vZHVsZSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ2xhc3NJbXBsXSAiICsgcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKyAgICByZXR1cm4gbV90ZXN0TmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG1fY2xhc3MuZ2V0TmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDbGFzcyBnZXRSZWFsQ2xhc3MoKSB7CisgICAgcmV0dXJuIG1fY2xhc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgeworICAgIHJldHVybiBtX2luc3RhbmNlQ291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpIHsKKyAgICByZXR1cm4gbV9pbnN0YW5jZUhhc2hDb2RlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgWG1sVGVzdCBnZXRYbWxUZXN0KCkgeworICAgIHJldHVybiBtX3htbFRlc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFhtbENsYXNzIGdldFhtbENsYXNzKCkgeworICAgIHJldHVybiBtX3htbENsYXNzOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgZ2V0RGVmYXVsdEluc3RhbmNlKCkgeworICAgIGlmIChtX2RlZmF1bHRJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICBpZiAobV9pbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgIG1fZGVmYXVsdEluc3RhbmNlID0gbV9pbnN0YW5jZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbUd1aWNlKCk7CisKKyAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICBtX2RlZmF1bHRJbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fZGVmYXVsdEluc3RhbmNlID0KKyAgICAgICAgICAgICAgQ2xhc3NIZWxwZXIuY3JlYXRlSW5zdGFuY2UobV9jbGFzcywgbV9jbGFzc2VzLCBtX3htbFRlc3QsCisgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsIG1fb2JqZWN0RmFjdG9yeSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbV9kZWZhdWx0SW5zdGFuY2U7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbiBpbnN0YW5jZSBmcm9tIEd1aWNlIGlmIEBUZXN0KGd1aWNlTW9kdWxlKSBhdHRyaWJ1dGUgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgT2JqZWN0IGdldEluc3RhbmNlRnJvbUd1aWNlKCkgeworICAgIEluamVjdG9yIGluamVjdG9yID0gbV90ZXN0Q29udGV4dC5nZXRJbmplY3Rvcih0aGlzKTsKKyAgICBpZiAoaW5qZWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIGluamVjdG9yLmdldEluc3RhbmNlKG1fY2xhc3MpOworICB9CisKKyAgcHVibGljIEluamVjdG9yIGdldFBhcmVudEluamVjdG9yKCkgeworICAgIElTdWl0ZSBzdWl0ZSA9IG1fdGVzdENvbnRleHQuZ2V0U3VpdGUoKTsKKyAgICAvLyBSZXVzZSB0aGUgcHJldmlvdXMgcGFyZW50IGluamVjdG9yLCBpZiBhbnkKKyAgICBJbmplY3RvciBpbmplY3RvciA9IHN1aXRlLmdldFBhcmVudEluamVjdG9yKCk7CisgICAgaWYgKGluamVjdG9yID09IG51bGwpIHsKKyAgICAgIFN0cmluZyBzdGFnZVN0cmluZyA9IHN1aXRlLmdldEd1aWNlU3RhZ2UoKTsKKyAgICAgIFN0YWdlIHN0YWdlOworICAgICAgaWYgKGlzU3RyaW5nTm90RW1wdHkoc3RhZ2VTdHJpbmcpKSB7CisgICAgICAgIHN0YWdlID0gU3RhZ2UudmFsdWVPZihzdGFnZVN0cmluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGFnZSA9IFN0YWdlLkRFVkVMT1BNRU5UOworICAgICAgfQorICAgICAgaWYgKG1faGFzUGFyZW50TW9kdWxlKSB7CisgICAgICAgIENsYXNzPE1vZHVsZT4gcGFyZW50TW9kdWxlID0gKENsYXNzPE1vZHVsZT4pIENsYXNzSGVscGVyLmZvck5hbWUoc3VpdGUuZ2V0UGFyZW50TW9kdWxlKCkpOworICAgICAgICBpZiAocGFyZW50TW9kdWxlID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBwYXJlbnQgR3VpY2UgbW9kdWxlIGNsYXNzOiAiICsgcGFyZW50TW9kdWxlKTsKKyAgICAgICAgfQorICAgICAgICBNb2R1bGUgbW9kdWxlID0gbmV3TW9kdWxlKHBhcmVudE1vZHVsZSk7CisgICAgICAgIGluamVjdG9yID0gY29tLmdvb2dsZS5pbmplY3QuR3VpY2UuY3JlYXRlSW5qZWN0b3Ioc3RhZ2UsIG1vZHVsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmplY3RvciA9IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlLmNyZWF0ZUluamVjdG9yKHN0YWdlKTsKKyAgICAgIH0KKyAgICAgIHN1aXRlLnNldFBhcmVudEluamVjdG9yKGluamVjdG9yKTsKKyAgICB9CisgICAgcmV0dXJuIGluamVjdG9yOworICB9CisKKyAgcHJpdmF0ZSBNb2R1bGUgbmV3TW9kdWxlKENsYXNzPE1vZHVsZT4gbW9kdWxlKSB7CisgICAgdHJ5IHsKKyAgICAgIENvbnN0cnVjdG9yPE1vZHVsZT4gbW9kdWxlQ29uc3RydWN0b3IgPSBtb2R1bGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihJVGVzdENvbnRleHQuY2xhc3MpOworICAgICAgcmV0dXJuIENsYXNzSGVscGVyLm5ld0luc3RhbmNlKG1vZHVsZUNvbnN0cnVjdG9yLCBtX3Rlc3RDb250ZXh0KTsKKyAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIENsYXNzSGVscGVyLm5ld0luc3RhbmNlKG1vZHVsZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3RbXSBnZXRJbnN0YW5jZXMoYm9vbGVhbiBjcmVhdGUpIHsKKyAgICBPYmplY3RbXSByZXN1bHQgPSB7fTsKKworICAgIGlmIChtX3htbFRlc3QuaXNKVW5pdCgpKSB7CisgICAgICBpZiAoY3JlYXRlKSB7CisgICAgICAgIHJlc3VsdCA9IG5ldyBPYmplY3RbXSB7IENsYXNzSGVscGVyLmNyZWF0ZUluc3RhbmNlKG1fY2xhc3MsIG1fY2xhc3NlcywKKyAgICAgICAgICAgIG1feG1sVGVzdCwgbV9hbm5vdGF0aW9uRmluZGVyLCBtX29iamVjdEZhY3RvcnkpIH07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IG5ldyBPYmplY3RbXSB7IGdldERlZmF1bHRJbnN0YW5jZSgpIH07CisgICAgfQorICAgIGlmIChtX2luc3RhbmNlcy5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQgPSBtX2luc3RhbmNlcy50b0FycmF5KG5ldyBPYmplY3RbbV9pbnN0YW5jZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgbV9pbnN0YW5jZUNvdW50ID0gbV9pbnN0YW5jZXMuc2l6ZSgpOworICAgIG1faW5zdGFuY2VIYXNoQ29kZXMgPSBuZXcgbG9uZ1ttX2luc3RhbmNlQ291bnRdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9pbnN0YW5jZUNvdW50OyBpKyspIHsKKyAgICAgIG1faW5zdGFuY2VIYXNoQ29kZXNbaV0gPSBtX2luc3RhbmNlcy5nZXQoaSkuaGFzaENvZGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKGdldENsYXNzKCkpCisgICAgICAgIC5hZGQoImNsYXNzIiwgbV9jbGFzcy5nZXROYW1lKCkpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlKE9iamVjdCBpbnN0YW5jZSkgeworICAgIG1faW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NsYXNzSW5mb01hcC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NsYXNzSW5mb01hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTNiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ2xhc3NJbmZvTWFwLmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NJbmZvTWFwIHsKKyAgcHJpdmF0ZSBNYXA8Q2xhc3M8Pz4sIFhtbENsYXNzPiBtX21hcCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU5lc3RlZENsYXNzZXM7CisKKyAgcHVibGljIENsYXNzSW5mb01hcCgpIHsKKyAgfQorCisgIHB1YmxpYyBDbGFzc0luZm9NYXAoTGlzdDxYbWxDbGFzcz4gY2xhc3NlcykgeworICAgIHRoaXMoY2xhc3NlcywgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgQ2xhc3NJbmZvTWFwKExpc3Q8WG1sQ2xhc3M+IGNsYXNzZXMsIGJvb2xlYW4gaW5jbHVkZU5lc3RlZCkgeworICAgIGluY2x1ZGVOZXN0ZWRDbGFzc2VzID0gaW5jbHVkZU5lc3RlZDsKKyAgICBmb3IgKFhtbENsYXNzIHhtbENsYXNzIDogY2xhc3NlcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgQ2xhc3MgYyA9IHhtbENsYXNzLmdldFN1cHBvcnRDbGFzcygpOworICAgICAgICByZWdpc3RlckNsYXNzKGMsIHhtbENsYXNzKTsKKyAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgVXRpbHMubG9nKCJbQ2xhc3NJbmZvTWFwXSIsIDEsICJVbmFibGUgdG8gb3BlbiBjbGFzcyAiICsgeG1sQ2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICArICIgLSB1bmFibGUgdG8gcmVzb2x2ZSBjbGFzcyByZWZlcmVuY2UgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgaWYgKHhtbENsYXNzLmxvYWRDbGFzc2VzKCkpIHsKKyAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQ2xhc3MoQ2xhc3MgY2wsIFhtbENsYXNzIHhtbENsYXNzKSB7CisgICAgbV9tYXAucHV0KGNsLCB4bWxDbGFzcyk7CisgICAgaWYgKGluY2x1ZGVOZXN0ZWRDbGFzc2VzKSB7CisgICAgICBmb3IgKENsYXNzIGMgOiBjbC5nZXRDbGFzc2VzKCkpIHsKKyAgICAgICAgaWYgKCEgbV9tYXAuY29udGFpbnNLZXkoYykpIHJlZ2lzdGVyQ2xhc3MoYywgeG1sQ2xhc3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZENsYXNzKENsYXNzPD8+IGNscykgeworICAgIG1fbWFwLnB1dChjbHMsIG51bGwpOworICB9CisKKyAgcHVibGljIFhtbENsYXNzIGdldFhtbENsYXNzKENsYXNzPD8+IGNscykgeworICAgIHJldHVybiBtX21hcC5nZXQoY2xzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dChDbGFzczw/PiBjbHMsIFhtbENsYXNzIHhtbENsYXNzKSB7CisgICAgbV9tYXAucHV0KGNscywgeG1sQ2xhc3MpOworICB9CisKKyAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICByZXR1cm4gbV9tYXAua2V5U2V0KCk7CisgIH0KKworICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgcmV0dXJuIG1fbWFwLnNpemUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0Nsb25lZE1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0Nsb25lZE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhOGZmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ2xvbmVkTWV0aG9kLmphdmEKQEAgLTAsMCArMSwzODEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVJldHJ5QW5hbHl6ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBDbG9uZWRNZXRob2QgaW1wbGVtZW50cyBJVGVzdE5HTWV0aG9kIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kIG1fbWV0aG9kOworICB0cmFuc2llbnQgcHJpdmF0ZSBNZXRob2QgbV9qYXZhTWV0aG9kOworICBwcml2YXRlIFN0cmluZyBtX2lkOworICBwcml2YXRlIGludCBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQ7CisgIHByaXZhdGUgbG9uZyBtX2RhdGU7CisKKyAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1faW52b2NhdGlvbk51bWJlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBwdWJsaWMgQ2xvbmVkTWV0aG9kKElUZXN0TkdNZXRob2QgbWV0aG9kLCBNZXRob2QgamF2YU1ldGhvZCkgeworICAgIG1fbWV0aG9kID0gbWV0aG9kOworICAgIG1famF2YU1ldGhvZCA9IGphdmFNZXRob2Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkTWV0aG9kRGVwZW5kZWRVcG9uKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgLy8gbm9wCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gY2FuUnVuRnJvbUNsYXNzKElDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICByZXR1cm4gbV9tZXRob2QuY2FuUnVuRnJvbUNsYXNzKHRlc3RDbGFzcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldEFmdGVyR3JvdXBzKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRBZnRlckdyb3VwcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRCZWZvcmVHcm91cHMoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kLmdldEJlZm9yZUdyb3VwcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpIHsKKyAgICByZXR1cm4gbV9jdXJyZW50SW52b2NhdGlvbkNvdW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldERhdGUoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kLmdldERhdGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICBtX21ldGhvZC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRHcm91cHMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzRGVwZW5kZWRVcG9uKCkgeworICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgcmV0dXJuIG1faWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpIHsKKyAgICByZXR1cm4gbV9tZXRob2QuZ2V0SW5zdGFuY2VIYXNoQ29kZXMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0W10gZ2V0SW5zdGFuY2VzKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRJbnN0YW5jZXMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGdldEluc3RhbmNlKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRJbnN0YW5jZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW52b2NhdGlvbkNvdW50KCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0VG90YWxJbnZvY2F0aW9uQ291bnQoKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0SW52b2NhdGlvblRpbWVPdXQoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kLmdldEludm9jYXRpb25UaW1lT3V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7CisgICAgcmV0dXJuIG1famF2YU1ldGhvZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgcmV0dXJuIG1famF2YU1ldGhvZC5nZXROYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldE1ldGhvZHNEZXBlbmRlZFVwb24oKSB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNaXNzaW5nR3JvdXAoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQoKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENsYXNzIGdldFJlYWxDbGFzcygpIHsKKyAgICByZXR1cm4gbV9qYXZhTWV0aG9kLmdldENsYXNzKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElSZXRyeUFuYWx5emVyIGdldFJldHJ5QW5hbHl6ZXIoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kLmdldFJldHJ5QW5hbHl6ZXIoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFN1Y2Nlc3NQZXJjZW50YWdlKCkgeworICAgIHJldHVybiAxMDA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0Q2xhc3MgZ2V0VGVzdENsYXNzKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRUZXN0Q2xhc3MoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFRocmVhZFBvb2xTaXplKCkgeworICAgIHJldHVybiBtX21ldGhvZC5nZXRUaHJlYWRQb29sU2l6ZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFRpbWVPdXQoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kLmdldFRpbWVPdXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUaW1lT3V0KGxvbmcgdGltZU91dCkgeworICAgIG1fbWV0aG9kLnNldFRpbWVPdXQodGltZU91dCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5jcmVtZW50Q3VycmVudEludm9jYXRpb25Db3VudCgpIHsKKyAgICBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQrKzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyR3JvdXBzQ29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJTdWl0ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJUZXN0Q29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNBbHdheXNSdW4oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZUdyb3Vwc0NvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVGVzdCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXREYXRlKGxvbmcgZGF0ZSkgeworICAgIG1fZGF0ZSA9IGRhdGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgbV9pZCA9IGlkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldElnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoYm9vbGVhbiBpZ25vcmUpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ291bnQoaW50IGNvdW50KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0TWlzc2luZ0dyb3VwKFN0cmluZyBncm91cCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckludm9jYXRpb25Db3VudChpbnQgbikgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFJldHJ5QW5hbHl6ZXIoSVJldHJ5QW5hbHl6ZXIgcmV0cnlBbmFseXplcikgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFNraXBGYWlsZWRJbnZvY2F0aW9ucyhib29sZWFuIHNraXApIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUZXN0Q2xhc3MoSVRlc3RDbGFzcyBjbHMpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRQb29sU2l6ZShpbnQgdGhyZWFkUG9vbFNpemUpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBza2lwRmFpbGVkSW52b2NhdGlvbnMoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisgICAgaW50IHJlc3VsdCA9IC0yOworICAgIENsYXNzPD8+IHRoaXNDbGFzcyA9IGdldFJlYWxDbGFzcygpOworICAgIENsYXNzPD8+IG90aGVyQ2xhc3MgPSAoKElUZXN0TkdNZXRob2QpIG8pLmdldFJlYWxDbGFzcygpOworICAgIGlmICh0aGlzQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvdGhlckNsYXNzKSkgeworICAgICAgcmVzdWx0ID0gLTE7CisgICAgfSBlbHNlIGlmIChvdGhlckNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhpc0NsYXNzKSkgeworICAgICAgcmVzdWx0ID0gMTsKKyAgICB9IGVsc2UgaWYgKGVxdWFscyhvKSkgeworICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDbG9uZWRNZXRob2QgY2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyBDbG9uZWRNZXRob2QobV9tZXRob2QsIG1famF2YU1ldGhvZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBNZXRob2QgbSA9IGdldE1ldGhvZCgpOworICAgIFN0cmluZyBjbHMgPSBtLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpOworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGNscyArICIuIiArIG0uZ2V0TmFtZSgpICsgIigiKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChDbGFzczw/PiBwIDogbS5nZXRQYXJhbWV0ZXJUeXBlcygpKSB7CisgICAgICBpZiAoaSsrID4gMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOworICAgICAgfQorICAgICAgcmVzdWx0LmFwcGVuZChwLmdldE5hbWUoKSk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRJbnZvY2F0aW9uTnVtYmVycygpIHsKKyAgICByZXR1cm4gbV9pbnZvY2F0aW9uTnVtYmVyczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uTnVtYmVycyhMaXN0PEludGVnZXI+IGNvdW50KSB7CisgICAgbV9pbnZvY2F0aW9uTnVtYmVycyA9IGNvdW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldEZhaWxlZEludm9jYXRpb25OdW1iZXJzKCkgeworICAgIHJldHVybiBtX2ZhaWxlZEludm9jYXRpb25OdW1iZXJzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZEZhaWxlZEludm9jYXRpb25OdW1iZXIoaW50IG51bWJlcikgeworICAgIG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMuYWRkKG51bWJlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKKyAgICByZXR1cm4gbV9tZXRob2QuZ2V0UHJpb3JpdHkoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICAvLyBpZ25vcmVkCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFhtbFRlc3QgZ2V0WG1sVGVzdCgpIHsKKyAgICByZXR1cm4gbV9tZXRob2QuZ2V0WG1sVGVzdCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb25zdHJ1Y3Rvck9yTWV0aG9kIGdldENvbnN0cnVjdG9yT3JNZXRob2QoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZmluZE1ldGhvZFBhcmFtZXRlcnMoWG1sVGVzdCB0ZXN0KSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25maWd1cmF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmU4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLio7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLkRlZmF1bHRBbm5vdGF0aW9uVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLkpESzE1QW5ub3RhdGlvbkZpbmRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uIHsKKworICBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXI7CisgIElUZXN0T2JqZWN0RmFjdG9yeSBtX29iamVjdEZhY3Rvcnk7CisgIElIb29rYWJsZSBtX2hvb2thYmxlOworICBJQ29uZmlndXJhYmxlIG1fY29uZmlndXJhYmxlOworICBMaXN0PElFeGVjdXRpb25MaXN0ZW5lcj4gbV9leGVjdXRpb25MaXN0ZW5lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgTGlzdDxJQWx0ZXJTdWl0ZUxpc3RlbmVyPiBtX2FsdGVyU3VpdGVMaXN0ZW5lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBMaXN0PElDb25maWd1cmF0aW9uTGlzdGVuZXI+IG1fY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHB1YmxpYyBDb25maWd1cmF0aW9uKCkgeworICAgIGluaXQobmV3IEpESzE1QW5ub3RhdGlvbkZpbmRlcihuZXcgRGVmYXVsdEFubm90YXRpb25UcmFuc2Zvcm1lcigpKSk7CisgIH0KKworICBwdWJsaWMgQ29uZmlndXJhdGlvbihJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpIHsKKyAgICBpbml0KGZpbmRlcik7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpIHsKKyAgICBtX2Fubm90YXRpb25GaW5kZXIgPSBmaW5kZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElBbm5vdGF0aW9uRmluZGVyIGdldEFubm90YXRpb25GaW5kZXIoKSB7CisgICAgcmV0dXJuIG1fYW5ub3RhdGlvbkZpbmRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uRmluZGVyKElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgeworICAgIG1fYW5ub3RhdGlvbkZpbmRlciA9IGZpbmRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3RPYmplY3RGYWN0b3J5IGdldE9iamVjdEZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG1fb2JqZWN0RmFjdG9yeTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRPYmplY3RGYWN0b3J5KElUZXN0T2JqZWN0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgbV9vYmplY3RGYWN0b3J5ID0gZmFjdG9yeTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSUhvb2thYmxlIGdldEhvb2thYmxlKCkgeworICAgIHJldHVybiBtX2hvb2thYmxlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEhvb2thYmxlKElIb29rYWJsZSBoKSB7CisgICAgbV9ob29rYWJsZSA9IGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElDb25maWd1cmFibGUgZ2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtX2NvbmZpZ3VyYWJsZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmFibGUoSUNvbmZpZ3VyYWJsZSBjKSB7CisgICAgbV9jb25maWd1cmFibGUgPSBjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElFeGVjdXRpb25MaXN0ZW5lcj4gZ2V0RXhlY3V0aW9uTGlzdGVuZXJzKCkgeworICAgIHJldHVybiBtX2V4ZWN1dGlvbkxpc3RlbmVyczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25MaXN0ZW5lcihJRXhlY3V0aW9uTGlzdGVuZXIgbCkgeworICAgIG1fZXhlY3V0aW9uTGlzdGVuZXJzLmFkZChsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJQ29uZmlndXJhdGlvbkxpc3RlbmVyPiBnZXRDb25maWd1cmF0aW9uTGlzdGVuZXJzKCkgeworICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QobV9jb25maWd1cmF0aW9uTGlzdGVuZXJzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uTGlzdGVuZXIoSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBjbCkgeworICAgIGlmICghIG1fY29uZmlndXJhdGlvbkxpc3RlbmVycy5jb250YWlucyhjbCkpIHsKKyAgICAgIG1fY29uZmlndXJhdGlvbkxpc3RlbmVycy5hZGQoY2wpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJQWx0ZXJTdWl0ZUxpc3RlbmVyPiBnZXRBbHRlclN1aXRlTGlzdGVuZXJzKCkgeworICAgIHJldHVybiBtX2FsdGVyU3VpdGVMaXN0ZW5lcnM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Hcm91cE1ldGhvZHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25maWd1cmF0aW9uR3JvdXBNZXRob2RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA0ZjMzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25maWd1cmF0aW9uR3JvdXBNZXRob2RzLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsNCisNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyB3cmFwcyBhY2Nlc3MgdG8gYmVmb3JlR3JvdXBzIGFuZCBhZnRlckdyb3VwcyBtZXRob2RzLA0KKyAqIHNpbmNlIHRoZXkgYXJlIHBhc3NlZCBhcm91bmQgdGhlIHZhcmlvdXMgaW52b2tlcnMgYW5kIHBvdGVudGlhbGx5DQorICogbW9kaWZpZWQgaW4gZGlmZmVyZW50IHRocmVhZHMuDQorICoNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+DQorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPg0KKyAqIEBzaW5jZSA1LjMgKE1hciAyLCAyMDA2KQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCisgIC8qKiBVc2Ugc2VyaWFsVmVyc2lvblVJRCBmb3IgaW50ZXJvcGVyYWJpbGl0eS4gKi8NCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRD0gMTY2MDc5ODUxOTg2NDg5ODQ4MEw7DQorDQorICAvKiogVGhlIGxpc3Qgb2YgYmVmb3JlR3JvdXBzIG1ldGhvZHMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGdyb3VwICovDQorICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+IG1fYmVmb3JlR3JvdXBzTWV0aG9kczsNCisNCisgIC8qKiBUaGUgbGlzdCBvZiBhZnRlckdyb3VwcyBtZXRob2RzIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBncm91cCAqLw0KKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PElUZXN0TkdNZXRob2Q+PiBtX2FmdGVyR3JvdXBzTWV0aG9kczsNCisNCisgIC8qKiBUaGUgbGlzdCBvZiBhbGwgdGVzdCBtZXRob2RzICovDQorICBwcml2YXRlIGZpbmFsIElUZXN0TkdNZXRob2RbXSBtX2FsbE1ldGhvZHM7DQorDQorICAvKipBIG1hcCB0aGF0IHJldHVybnMgdGhlIGxhc3QgbWV0aG9kIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gZ3JvdXAgKi8NCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gbV9hZnRlckdyb3Vwc01hcD0gbnVsbDsNCisNCisgIHB1YmxpYyBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzKElUZXN0TkdNZXRob2RbXSBhbGxNZXRob2RzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gYmVmb3JlR3JvdXBzTWV0aG9kcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+IGFmdGVyR3JvdXBzTWV0aG9kcykNCisgIHsNCisgICAgbV9hbGxNZXRob2RzPSBhbGxNZXRob2RzOw0KKyAgICBtX2JlZm9yZUdyb3Vwc01ldGhvZHM9IGJlZm9yZUdyb3Vwc01ldGhvZHM7DQorICAgIG1fYWZ0ZXJHcm91cHNNZXRob2RzPSBhZnRlckdyb3Vwc01ldGhvZHM7DQorICB9DQorDQorICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gZ2V0QmVmb3JlR3JvdXBzTWV0aG9kcygpIHsNCisgICAgcmV0dXJuIG1fYmVmb3JlR3JvdXBzTWV0aG9kczsNCisgIH0NCisNCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PElUZXN0TkdNZXRob2Q+PiBnZXRBZnRlckdyb3Vwc01ldGhvZHMoKSB7DQorICAgIHJldHVybiBtX2FmdGVyR3JvdXBzTWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXNzZWQgbWV0aG9kIGlzIHRoZSBsYXN0IHRvIHJ1biBmb3IgdGhlIGdyb3VwLg0KKyAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHdoZW4gaXMgdGhlIHJpZ2h0IHRpbWUgdG8gaW52b2tlDQorICAgKiBhZnRlckdyb3VwcyBtZXRob2RzLg0KKyAgICovDQorICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMYXN0TWV0aG9kRm9yR3JvdXAoU3RyaW5nIGdyb3VwLCBJVGVzdE5HTWV0aG9kIG1ldGhvZCkgew0KKw0KKyAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgaW52b2NhdGlvbiB0byBkbywgdGhpcyBpcyBub3QgdGhlIGxhc3Qgb25lIHlldA0KKyAgICBpbnQgaW52b2NhdGlvbkNvdW50PSBtZXRob2QuZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpOw0KKyAgICBpZihpbnZvY2F0aW9uQ291bnQgPCAobWV0aG9kLmdldEludm9jYXRpb25Db3VudCgpICogbWV0aG9kLmdldFBhcmFtZXRlckludm9jYXRpb25Db3VudCgpKSkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIHNpbmNlIHdlIG1pZ2h0IG5ldmVyIGJlIGNhbGxlZA0KKyAgICBpZihtX2FmdGVyR3JvdXBzTWFwID09IG51bGwpIHsNCisgICAgICBtX2FmdGVyR3JvdXBzTWFwPSBpbml0aWFsaXplQWZ0ZXJHcm91cHNNYXAoKTsNCisgICAgfQ0KKw0KKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHNJbkdyb3VwPSBtX2FmdGVyR3JvdXBzTWFwLmdldChncm91cCk7DQorDQorICAgIGlmKG51bGwgPT0gbWV0aG9kc0luR3JvdXAgfHwgbWV0aG9kc0luR3JvdXAuaXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIG1ldGhvZHNJbkdyb3VwLnJlbW92ZShtZXRob2QpOw0KKw0KKyAgICAvLyBOb3RlOiAgPT0gaXMgbm90IGdvb2QgZW5vdWdoIGhlcmUgYXMgd2UgbWF5IHdvcmsgd2l0aCBJVGVzdE5HTWV0aG9kIGNsb25lcw0KKyAgICByZXR1cm4gbWV0aG9kc0luR3JvdXAuaXNFbXB0eSgpOw0KKw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gaW5pdGlhbGl6ZUFmdGVyR3JvdXBzTWFwKCkgew0KKyAgICBNYXA8U3RyaW5nLCBMaXN0PElUZXN0TkdNZXRob2Q+PiByZXN1bHQ9IE1hcHMubmV3SGFzaE1hcCgpOw0KKyAgICBmb3IoSVRlc3ROR01ldGhvZCBtIDogbV9hbGxNZXRob2RzKSB7DQorICAgICAgU3RyaW5nW10gZ3JvdXBzPSBtLmdldEdyb3VwcygpOw0KKyAgICAgIGZvcihTdHJpbmcgZyA6IGdyb3Vwcykgew0KKyAgICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzSW5Hcm91cD0gcmVzdWx0LmdldChnKTsNCisgICAgICAgIGlmKG51bGwgPT0gbWV0aG9kc0luR3JvdXApIHsNCisgICAgICAgICAgbWV0aG9kc0luR3JvdXA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICAgICAgICByZXN1bHQucHV0KGcsIG1ldGhvZHNJbkdyb3VwKTsNCisgICAgICAgIH0NCisgICAgICAgIG1ldGhvZHNJbkdyb3VwLmFkZChtKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVCZWZvcmVNZXRob2QoU3RyaW5nIGdyb3VwLCBJVGVzdE5HTWV0aG9kIG1ldGhvZCkgew0KKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHM9IG1fYmVmb3JlR3JvdXBzTWV0aG9kcy5nZXQoZ3JvdXApOw0KKyAgICBpZihtZXRob2RzICE9IG51bGwpIHsNCisgICAgICBPYmplY3Qgc3VjY2Vzcz0gbWV0aG9kcy5yZW1vdmUobWV0aG9kKTsNCisgICAgICBpZihzdWNjZXNzID09IG51bGwpIHsNCisgICAgICAgIGxvZygiQ291bGRuJ3QgcmVtb3ZlIGJlZm9yZUdyb3VwcyBtZXRob2QgIiArIG1ldGhvZCArICIgZm9yIGdyb3VwICIgKyBncm91cCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgIGxvZygiQ291bGRuJ3QgZmluZCBhbnkgYmVmb3JlR3JvdXBzIG1ldGhvZCBmb3IgZ3JvdXAgIiArIGdyb3VwKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7DQorICAgIFV0aWxzLmxvZygiQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcyIsIDIsIHN0cmluZyk7DQorICB9DQorDQorICBzeW5jaHJvbml6ZWQgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+IGdldEJlZm9yZUdyb3Vwc01hcCgpIHsNCisgICAgcmV0dXJuIG1fYmVmb3JlR3JvdXBzTWV0aG9kczsNCisgIH0NCisNCisgIHN5bmNocm9uaXplZCBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gZ2V0QWZ0ZXJHcm91cHNNYXAoKSB7DQorICAgIHJldHVybiBtX2FmdGVyR3JvdXBzTWV0aG9kczsNCisgIH0NCisNCisgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZW1vdmVCZWZvcmVHcm91cHMoU3RyaW5nW10gZ3JvdXBzKSB7DQorICAgIGZvcihTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsNCisvLyAgICAgIGxvZygiUmVtb3ZpbmcgYmVmb3JlIGdyb3VwICIgKyBncm91cCk7DQorICAgICAgbV9iZWZvcmVHcm91cHNNZXRob2RzLnJlbW92ZShncm91cCk7DQorICAgIH0NCisgIH0NCisNCisgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZW1vdmVBZnRlckdyb3VwcyhDb2xsZWN0aW9uPFN0cmluZz4gZ3JvdXBzKSB7DQorICAgIGZvcihTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsNCisvLyAgICAgIGxvZygiUmVtb3ZpbmcgYmVmb3JlIGdyb3VwICIgKyBncm91cCk7DQorICAgICAgbV9hZnRlckdyb3Vwc01ldGhvZHMucmVtb3ZlKGdyb3VwKTsNCisgICAgfQ0KKw0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ29uZmlndXJhdGlvbk1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NvbmZpZ3VyYXRpb25NZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYmQ1YzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NvbmZpZ3VyYXRpb25NZXRob2QuamF2YQpAQCAtMCwwICsxLDQ2MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBZnRlckdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUJlZm9yZUdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklCZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQmVmb3JlVGVzdDsKKworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NZXRob2QgZXh0ZW5kcyBCYXNlVGVzdE1ldGhvZCB7CisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY1Mzc3NzE0OTg1NTM2MTk2NDVMOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9pc0JlZm9yZVN1aXRlQ29uZmlndXJhdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1faXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbjsKKworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9pc0JlZm9yZVRlc3RDb25maWd1cmF0aW9uOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9pc0FmdGVyVGVzdENvbmZpZ3VyYXRpb247CisKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1faXNCZWZvcmVDbGFzc0NvbmZpZ3VyYXRpb247CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtX2lzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb247CisKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1faXNCZWZvcmVNZXRob2RDb25maWd1cmF0aW9uOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9pc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbjsKKworICBwcml2YXRlIGJvb2xlYW4gbV9pbmhlcml0R3JvdXBzRnJvbVRlc3RDbGFzcyA9IGZhbHNlOworCisgIHByaXZhdGUgQ29uZmlndXJhdGlvbk1ldGhvZChDb25zdHJ1Y3Rvck9yTWV0aG9kIGNvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQmVmb3JlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWZ0ZXJTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FmdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JlZm9yZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlck1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGJlZm9yZUdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFmdGVyR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlKQorICB7CisgICAgc3VwZXIoY29tLmdldE5hbWUoKSwgY29tLCBhbm5vdGF0aW9uRmluZGVyLCBpbnN0YW5jZSk7CisgICAgaWYoaW5pdGlhbGl6ZSkgeworICAgICAgaW5pdCgpOworICAgIH0KKworICAgIG1faXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24gPSBpc0JlZm9yZVN1aXRlOworICAgIG1faXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbiA9IGlzQWZ0ZXJTdWl0ZTsKKworICAgIG1faXNCZWZvcmVUZXN0Q29uZmlndXJhdGlvbiA9IGlzQmVmb3JlVGVzdDsKKyAgICBtX2lzQWZ0ZXJUZXN0Q29uZmlndXJhdGlvbiA9IGlzQWZ0ZXJUZXN0OworCisgICAgbV9pc0JlZm9yZUNsYXNzQ29uZmlndXJhdGlvbiA9IGlzQmVmb3JlQ2xhc3M7CisgICAgbV9pc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uID0gaXNBZnRlckNsYXNzOworCisgICAgbV9pc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24gPSBpc0JlZm9yZU1ldGhvZDsKKyAgICBtX2lzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uID0gaXNBZnRlck1ldGhvZDsKKworICAgIG1fYmVmb3JlR3JvdXBzID0gYmVmb3JlR3JvdXBzOworICAgIG1fYWZ0ZXJHcm91cHMgPSBhZnRlckdyb3VwczsKKworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIHVzZSAjQ29uZmlndXJhdGlvbk1ldGhvZChDb25zdHJ1Y3Rvck9yTWV0aG9kLC4uLikgaW5zdGVhZC4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBDb25maWd1cmF0aW9uTWV0aG9kKE1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FmdGVyU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWZ0ZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQmVmb3JlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQmVmb3JlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWZ0ZXJNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGJlZm9yZUdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYWZ0ZXJHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSkKKyAgeworICAgIHRoaXMobmV3IENvbnN0cnVjdG9yT3JNZXRob2QobWV0aG9kKSwgYW5ub3RhdGlvbkZpbmRlciwgaXNCZWZvcmVTdWl0ZSwgaXNBZnRlclN1aXRlLCBpc0JlZm9yZVRlc3QsIGlzQWZ0ZXJUZXN0LAorICAgICAgICBpc0JlZm9yZUNsYXNzLCBpc0FmdGVyQ2xhc3MsIGlzQmVmb3JlTWV0aG9kLCBpc0FmdGVyTWV0aG9kLCBiZWZvcmVHcm91cHMsIGFmdGVyR3JvdXBzLCBpbnN0YW5jZSk7CisgIH0KKworICBwdWJsaWMgQ29uZmlndXJhdGlvbk1ldGhvZChDb25zdHJ1Y3Rvck9yTWV0aG9kIGNvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JlZm9yZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWZ0ZXJTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0JlZm9yZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FmdGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlck1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYmVmb3JlR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhZnRlckdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgdGhpcyhjb20sIGFubm90YXRpb25GaW5kZXIsIGlzQmVmb3JlU3VpdGUsIGlzQWZ0ZXJTdWl0ZSwgaXNCZWZvcmVUZXN0LCBpc0FmdGVyVGVzdCwKKyAgICAgICAgaXNCZWZvcmVDbGFzcywgaXNBZnRlckNsYXNzLCBpc0JlZm9yZU1ldGhvZCwgaXNBZnRlck1ldGhvZCwgYmVmb3JlR3JvdXBzLCBhZnRlckdyb3VwcywKKyAgICAgICAgdHJ1ZSwgaW5zdGFuY2UpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGNyZWF0ZU1ldGhvZHMoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwKKyAgICAgIGJvb2xlYW4gaXNCZWZvcmVTdWl0ZSwKKyAgICAgIGJvb2xlYW4gaXNBZnRlclN1aXRlLAorICAgICAgYm9vbGVhbiBpc0JlZm9yZVRlc3QsCisgICAgICBib29sZWFuIGlzQWZ0ZXJUZXN0LAorICAgICAgYm9vbGVhbiBpc0JlZm9yZUNsYXNzLAorICAgICAgYm9vbGVhbiBpc0FmdGVyQ2xhc3MsCisgICAgICBib29sZWFuIGlzQmVmb3JlTWV0aG9kLAorICAgICAgYm9vbGVhbiBpc0FmdGVyTWV0aG9kLAorICAgICAgU3RyaW5nW10gYmVmb3JlR3JvdXBzLAorICAgICAgU3RyaW5nW10gYWZ0ZXJHcm91cHMsCisgICAgICBPYmplY3QgaW5zdGFuY2UpCisgIHsKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgICAgICByZXN1bHQuYWRkKG5ldyBDb25maWd1cmF0aW9uTWV0aG9kKG1ldGhvZC5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCksCisgICAgICAgICAgICAgICAgICBmaW5kZXIsCisgICAgICAgICAgICAgICAgICBpc0JlZm9yZVN1aXRlLAorICAgICAgICAgICAgICAgICAgaXNBZnRlclN1aXRlLAorICAgICAgICAgICAgICAgICAgaXNCZWZvcmVUZXN0LAorICAgICAgICAgICAgICAgICAgaXNBZnRlclRlc3QsCisgICAgICAgICAgICAgICAgICBpc0JlZm9yZUNsYXNzLAorICAgICAgICAgICAgICAgICAgaXNBZnRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgaXNCZWZvcmVNZXRob2QsCisgICAgICAgICAgICAgICAgICBpc0FmdGVyTWV0aG9kLAorICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgICAgICAgICBpbnN0YW5jZSkpOworICAgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW3Jlc3VsdC5zaXplKCldKTsKKyAgfQorCisKKyAgcHVibGljIHN0YXRpYyBJVGVzdE5HTWV0aG9kW10gY3JlYXRlU3VpdGVDb25maWd1cmF0aW9uTWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywKKyAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsIGJvb2xlYW4gaXNCZWZvcmUsIE9iamVjdCBpbnN0YW5jZSkgeworICAgIHJldHVybiBjcmVhdGVNZXRob2RzKG1ldGhvZHMsIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgIGlzQmVmb3JlLAorICAgICAgICAhaXNCZWZvcmUsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIGluc3RhbmNlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGNyZWF0ZVRlc3RDb25maWd1cmF0aW9uTWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywKKyAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsIGJvb2xlYW4gaXNCZWZvcmUsIE9iamVjdCBpbnN0YW5jZSkgeworICAgIHJldHVybiBjcmVhdGVNZXRob2RzKG1ldGhvZHMsIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgaXNCZWZvcmUsCisgICAgICAgICFpc0JlZm9yZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIGluc3RhbmNlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGNyZWF0ZUNsYXNzQ29uZmlndXJhdGlvbk1ldGhvZHMoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsCisgICAgICBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLCBib29sZWFuIGlzQmVmb3JlLCBPYmplY3QgaW5zdGFuY2UpICB7CisgICAgcmV0dXJuIGNyZWF0ZU1ldGhvZHMobWV0aG9kcywgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGlzQmVmb3JlLAorICAgICAgICAhaXNCZWZvcmUsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgaW5zdGFuY2UpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBJVGVzdE5HTWV0aG9kW10gY3JlYXRlQmVmb3JlQ29uZmlndXJhdGlvbk1ldGhvZHMoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsCisgICAgICBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLCBib29sZWFuIGlzQmVmb3JlLCBPYmplY3QgaW5zdGFuY2UpCisgIHsKKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0ID0gbmV3IElUZXN0TkdNZXRob2RbbWV0aG9kcy5sZW5ndGhdOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSBuZXcgQ29uZmlndXJhdGlvbk1ldGhvZChtZXRob2RzW2ldLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKSwKKyAgICAgICAgICBhbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgIGlzQmVmb3JlID8gbWV0aG9kc1tpXS5nZXRCZWZvcmVHcm91cHMoKSA6IG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBJVGVzdE5HTWV0aG9kW10gY3JlYXRlQWZ0ZXJDb25maWd1cmF0aW9uTWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywKKyAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsIGJvb2xlYW4gaXNCZWZvcmUsIE9iamVjdCBpbnN0YW5jZSkKKyAgeworICAgIElUZXN0TkdNZXRob2RbXSByZXN1bHQgPSBuZXcgSVRlc3ROR01ldGhvZFttZXRob2RzLmxlbmd0aF07CisgICAgZm9yKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHJlc3VsdFtpXSA9IG5ldyBDb25maWd1cmF0aW9uTWV0aG9kKG1ldGhvZHNbaV0uZ2V0Q29uc3RydWN0b3JPck1ldGhvZCgpLAorICAgICAgICAgIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgICBpc0JlZm9yZSA/IG5ldyBTdHJpbmdbMF0gOiBtZXRob2RzW2ldLmdldEFmdGVyR3JvdXBzKCksCisgICAgICAgICAgaW5zdGFuY2UpOworICAgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGNyZWF0ZVRlc3RNZXRob2RDb25maWd1cmF0aW9uTWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywKKyAgICAgIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsIGJvb2xlYW4gaXNCZWZvcmUsIE9iamVjdCBpbnN0YW5jZSkgeworICAgIHJldHVybiBjcmVhdGVNZXRob2RzKG1ldGhvZHMsIGFubm90YXRpb25GaW5kZXIsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGZhbHNlLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgIGlzQmVmb3JlLAorICAgICAgICAhaXNCZWZvcmUsCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIG5ldyBTdHJpbmdbMF0sCisgICAgICAgIGluc3RhbmNlKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNBZnRlckNsYXNzQ29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gbV9pc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uOworICB9CisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBtX2lzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uOworICB9CisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBtX2lzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uOworICB9CisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIG1faXNCZWZvcmVNZXRob2RDb25maWd1cmF0aW9uOworICB9CisKKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJTdWl0ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIG1faXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBtX2lzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIG1faXNCZWZvcmVUZXN0Q29uZmlndXJhdGlvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyVGVzdENvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIG1faXNBZnRlclRlc3RDb25maWd1cmF0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVHcm91cHMgIT0gbnVsbCAmJiBtX2JlZm9yZUdyb3Vwcy5sZW5ndGggPiAwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJHcm91cHNDb25maWd1cmF0aW9uKCkgeworICAgIHJldHVybiBtX2FmdGVyR3JvdXBzICE9IG51bGwgJiYgbV9hZnRlckdyb3Vwcy5sZW5ndGggPiAwOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRHcm91cHNGcm9tVGVzdENsYXNzKCkgeworICAgIHJldHVybiBtX2luaGVyaXRHcm91cHNGcm9tVGVzdENsYXNzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgSUFubm90YXRpb24gYSA9IEFubm90YXRpb25IZWxwZXIuZmluZENvbmZpZ3VyYXRpb24obV9hbm5vdGF0aW9uRmluZGVyLCBtX21ldGhvZC5nZXRNZXRob2QoKSk7CisgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBhOworICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgIG1faW5oZXJpdEdyb3Vwc0Zyb21UZXN0Q2xhc3MgPSBhbm5vdGF0aW9uLmdldEluaGVyaXRHcm91cHMoKTsKKyAgICAgIHNldEVuYWJsZWQoYW5ub3RhdGlvbi5nZXRFbmFibGVkKCkpOworICAgICAgc2V0RGVzY3JpcHRpb24oYW5ub3RhdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24uaXNGYWtlQ29uZmlndXJhdGlvbigpKSB7CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEJlZm9yZVN1aXRlKCkpIHsKKyAgICAgIGluaXRHcm91cHMoSUJlZm9yZVN1aXRlLmNsYXNzKTsKKyAgICB9CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEFmdGVyU3VpdGUoKSkgeworICAgICAgaW5pdEdyb3VwcyhJQWZ0ZXJTdWl0ZS5jbGFzcyk7CisgICAgfQorICAgICBpZiAoYW5ub3RhdGlvbi5nZXRCZWZvcmVUZXN0KCkpIHsKKyAgICAgIGluaXRHcm91cHMoSUJlZm9yZVRlc3QuY2xhc3MpOworICAgIH0KKyAgICAgaWYgKGFubm90YXRpb24uZ2V0QWZ0ZXJUZXN0KCkpIHsKKyAgICAgIGluaXRHcm91cHMoSUFmdGVyVGVzdC5jbGFzcyk7CisgICAgfQorICAgICBpZiAoYW5ub3RhdGlvbi5nZXRCZWZvcmVHcm91cHMoKS5sZW5ndGggIT0gMCkgeworICAgICAgaW5pdEdyb3VwcyhJQmVmb3JlR3JvdXBzLmNsYXNzKTsKKyAgICB9CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEFmdGVyR3JvdXBzKCkubGVuZ3RoICE9IDApIHsKKyAgICAgIGluaXRHcm91cHMoSUFmdGVyR3JvdXBzLmNsYXNzKTsKKyAgICB9CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEJlZm9yZVRlc3RDbGFzcygpKSB7CisgICAgICBpbml0R3JvdXBzKElCZWZvcmVDbGFzcy5jbGFzcyk7CisgICAgfQorICAgICBpZiAoYW5ub3RhdGlvbi5nZXRBZnRlclRlc3RDbGFzcygpKSB7CisgICAgICBpbml0R3JvdXBzKElBZnRlckNsYXNzLmNsYXNzKTsKKyAgICB9CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEJlZm9yZVRlc3RNZXRob2QoKSkgeworICAgICAgaW5pdEdyb3VwcyhJQmVmb3JlTWV0aG9kLmNsYXNzKTsKKyAgICB9CisgICAgIGlmIChhbm5vdGF0aW9uLmdldEFmdGVyVGVzdE1ldGhvZCgpKSB7CisgICAgICBpbml0R3JvdXBzKElBZnRlck1ldGhvZC5jbGFzcyk7CisgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGluaXRHcm91cHMoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGNvbmZpZ3VyYXRpb24gbWV0aG9kIGhhcyBpbmhlcml0LWdyb3Vwcz10cnVlLCBhZGQgdGhlIGdyb3VwcworICAgIC8vIGRlZmluZWQgaW4gdGhlIEBUZXN0IGNsYXNzCisgICAgaWYgKGluaGVyaXRHcm91cHNGcm9tVGVzdENsYXNzKCkpIHsKKyAgICAgIElUZXN0QW5ub3RhdGlvbiBjbGFzc0Fubm90YXRpb24gPSBtX2Fubm90YXRpb25GaW5kZXIuZmluZEFubm90YXRpb24obV9tZXRob2RDbGFzcywgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgIGlmIChjbGFzc0Fubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICBTdHJpbmdbXSBncm91cHMgPSBjbGFzc0Fubm90YXRpb24uZ2V0R3JvdXBzKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3R3JvdXBzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGcgOiBnZXRHcm91cHMoKSkgeworICAgICAgICAgIG5ld0dyb3Vwcy5wdXQoZywgZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyb3VwcyAhPSBudWxsKSB7CisgICAgICAgICAgZm9yIChTdHJpbmcgZyA6IGdyb3VwcykgeworICAgICAgICAgICAgbmV3R3JvdXBzLnB1dChnLCBnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc2V0R3JvdXBzKG5ld0dyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbbmV3R3JvdXBzLnNpemUoKV0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgIHNldFRpbWVPdXQoYW5ub3RhdGlvbi5nZXRUaW1lT3V0KCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ29uZmlndXJhdGlvbk1ldGhvZF0gIiArIHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb25maWd1cmF0aW9uTWV0aG9kIGNsb25lKCkgeworICAgIENvbmZpZ3VyYXRpb25NZXRob2QgY2xvbmU9IG5ldyBDb25maWd1cmF0aW9uTWV0aG9kKGdldENvbnN0cnVjdG9yT3JNZXRob2QoKSwKKyAgICAgICAgZ2V0QW5ub3RhdGlvbkZpbmRlcigpLAorICAgICAgICBpc0JlZm9yZVN1aXRlQ29uZmlndXJhdGlvbigpLAorICAgICAgICBpc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCksCisgICAgICAgIGlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgaXNBZnRlclRlc3RDb25maWd1cmF0aW9uKCksCisgICAgICAgIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCksCisgICAgICAgIGlzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgaXNCZWZvcmVNZXRob2RDb25maWd1cmF0aW9uKCksCisgICAgICAgIGlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCksCisgICAgICAgIGdldEJlZm9yZUdyb3VwcygpLAorICAgICAgICBnZXRBZnRlckdyb3VwcygpLAorICAgICAgICBmYWxzZSAvKiBkbyBub3QgY2FsbCBpbml0KCkgKi8sCisgICAgICAgIGdldEluc3RhbmNlKCkKKyAgICAgICAgKTsKKyAgICBjbG9uZS5tX3Rlc3RDbGFzcz0gZ2V0VGVzdENsYXNzKCk7CisgICAgY2xvbmUuc2V0RGF0ZShnZXREYXRlKCkpOworICAgIGNsb25lLnNldEdyb3VwcyhnZXRHcm91cHMoKSk7CisgICAgY2xvbmUuc2V0R3JvdXBzRGVwZW5kZWRVcG9uKGdldEdyb3Vwc0RlcGVuZGVkVXBvbigpLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpKTsKKyAgICBjbG9uZS5zZXRNZXRob2RzRGVwZW5kZWRVcG9uKGdldE1ldGhvZHNEZXBlbmRlZFVwb24oKSk7CisgICAgY2xvbmUuc2V0QWx3YXlzUnVuKGlzQWx3YXlzUnVuKCkpOworICAgIGNsb25lLnNldE1pc3NpbmdHcm91cChnZXRNaXNzaW5nR3JvdXAoKSk7CisgICAgY2xvbmUuc2V0RGVzY3JpcHRpb24oZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgY2xvbmUuc2V0RW5hYmxlZChnZXRFbmFibGVkKCkpOworICAgIGNsb25lLnNldFBhcmFtZXRlckludm9jYXRpb25Db3VudChnZXRQYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQoKSk7CisgICAgY2xvbmUubV9pbmhlcml0R3JvdXBzRnJvbVRlc3RDbGFzcz0gaW5oZXJpdEdyb3Vwc0Zyb21UZXN0Q2xhc3MoKTsKKworICAgIHJldHVybiBjbG9uZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRmlyc3RUaW1lT25seSgpIHsKKyAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgIElBbm5vdGF0aW9uIGJlZm9yZSA9IG1fYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihnZXRNZXRob2QoKSwgSUJlZm9yZU1ldGhvZC5jbGFzcyk7CisgICAgaWYgKGJlZm9yZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSAoKENvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBiZWZvcmUpLmlzRmlyc3RUaW1lT25seSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNMYXN0VGltZU9ubHkoKSB7CisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICBJQW5ub3RhdGlvbiBiZWZvcmUgPSBtX2Fubm90YXRpb25GaW5kZXIuZmluZEFubm90YXRpb24oZ2V0TWV0aG9kKCksIElBZnRlck1ldGhvZC5jbGFzcyk7CisgICAgaWYgKGJlZm9yZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSAoKENvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBiZWZvcmUpLmlzTGFzdFRpbWVPbmx5KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWVmMmMxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CisKKworCisvKioKKyAqIENvbnN0YW50cyB1c2VkIGJ5IFRlc3RORworICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMiwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAidGVzdG5nIjsKKworLy8vLy8vLy8gIC8vCisgIC8vIFByb3BlcnRpZXMKKyAgLy8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9PVVRQVVRfRElSID0gTkFNRVNQQUNFICsgIi4iICsgIm91dHB1dERpciI7CisvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9OQU1FID0gTkFNRVNQQUNFICsgIi4iICsgIm5hbWUiOworLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5DTFVERURfR1JPVVBTID0gTkFNRVNQQUNFICsgIi4iICsgImluY2x1ZGVkR3JvdXBzIjsKKy8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VYQ0xVREVEX0dST1VQUyA9IE5BTUVTUEFDRSArICIuIiArICJleGNsdWRlZEdyb3VwcyI7CisvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DTEFTU19OQU1FUyA9IE5BTUVTUEFDRSArICIuIiArICJjbGFzc05hbWVzIjsKKy8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZFUkJPU0UgPSBOQU1FU1BBQ0UgKyAiLiIgKyAidmVyYm9zZSI7CisvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9KVU5JVD0gTkFNRVNQQUNFICsgIi4iICsgImp1bml0IjsKKy8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1FVSUVUPSBOQU1FU1BBQ0UgKyAiLiIgKyAicXVpZXQiOworLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfR1JPVVA9IE5BTUVTUEFDRSArICIuIiArICJncm91cCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdE5HUHJvcGVydHlbXSBDT01NQU5EX0xJTkVfUEFSQU1FVEVSUyA9IHsKKyAgICBuZXcgVGVzdE5HUHJvcGVydHkoIi1kIiwgUFJPUF9PVVRQVVRfRElSLCAiRGlyZWN0b3J5IHdoZXJlIHRoZSByZXN1bHQgZmlsZXMgd2lsbCBiZSBjcmVhdGVkLiIsICJ0ZXN0LW91dHB1dCIpLAorICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFRlc3ROR1Byb3BlcnR5PiBtX3Byb3BlcnRpZXNCeU5hbWUgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBzdGF0aWMgeworLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9QRVJUSUVTLmxlbmd0aDsgaSsrKSB7CisvLyAgICAgIG1fcHJvcGVydGllc0J5TmFtZS5wdXQoUFJPUEVSVElFU1tpXS5nZXROYW1lKCksIFBST1BFUlRJRVNbaV0pOworLy8gICAgfQorICAgIGZvciAoVGVzdE5HUHJvcGVydHkgZWxlbWVudCA6IENPTU1BTkRfTElORV9QQVJBTUVURVJTKSB7CisgICAgICBtX3Byb3BlcnRpZXNCeU5hbWUucHV0KGVsZW1lbnQuZ2V0TmFtZSgpLCBlbGVtZW50KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUZXN0TkdQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgVGVzdE5HUHJvcGVydHkgcmVzdWx0ID0gbV9wcm9wZXJ0aWVzQnlOYW1lLmdldChwcm9wZXJ0eU5hbWUpOworICAgIGFzc2VydCBudWxsICE9IHJlc3VsdCA6ICJVbmtub3duIHByb3BlcnR5IDogIiArIHByb3BlcnR5TmFtZTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnRpZXMgcCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgIFRlc3ROR1Byb3BlcnR5IHI9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgYXNzZXJ0IG51bGwgIT0gciA6ICJVbmtub3duIHByb3BlcnR5IDogIiArIHByb3BlcnR5TmFtZTsKKworICAgIFN0cmluZyByZXN1bHQgPSBwLmdldFByb3BlcnR5KHIuZ2V0TmFtZSgpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5VmFsdWUoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgVGVzdE5HUHJvcGVydHkgcCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgU3RyaW5nIHIgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgcC5nZXREZWZhdWx0KCkpOworICAgIGJvb2xlYW4gcmVzdWx0ID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uocik7CisKKyAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHJlc3VsdCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBnZXRJbnRlZ2VyUHJvcGVydHlWYWx1ZShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICBUZXN0TkdQcm9wZXJ0eSBwID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKyAgICBTdHJpbmcgciA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBwLmdldERlZmF1bHQoKSk7CisgICAgaW50IHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQocik7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlRm9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICBUZXN0TkdQcm9wZXJ0eSBwID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKyAgICByZXR1cm4gcC5nZXREZWZhdWx0KCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNwbGF5U3RhdHVzKGludCBzdGF0dXMpIHsKKyAgICBpZiAoSVRlc3RSZXN1bHQuU0tJUCA9PSBzdGF0dXMpIHsKKyAgICAgIHJldHVybiAiU0tJUCI7CisgICAgfSBlbHNlIGlmIChJVGVzdFJlc3VsdC5TVUNDRVNTID09IHN0YXR1cykgeworICAgICAgcmV0dXJuICJTVUNDRVNTIjsKKyAgICB9IGVsc2UgaWYgKElUZXN0UmVzdWx0LkZBSUxVUkUgPT0gc3RhdHVzKSB7CisgICAgICByZXR1cm4gIkZBSUxVUkUiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlVOS05PV05fU1RBVFVTIjsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0NvbnN0cnVjdG9yT3JNZXRob2QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25zdHJ1Y3Rvck9yTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNzVjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Db25zdHJ1Y3Rvck9yTWV0aG9kLmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEVuY2Fwc3VsYXRpb24gb2YgZWl0aGVyIGEgbWV0aG9kIG9yIGEgY29uc3RydWN0b3IuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3Rvck9yTWV0aG9kIHsKKworICBwcml2YXRlIE1ldGhvZCBtX21ldGhvZDsKKyAgcHJpdmF0ZSBDb25zdHJ1Y3RvciBtX2NvbnN0cnVjdG9yOworICBwcml2YXRlIGJvb2xlYW4gbV9lbmFibGVkID0gdHJ1ZTsKKworICBwdWJsaWMgQ29uc3RydWN0b3JPck1ldGhvZChNZXRob2QgbSkgeworICAgIG1fbWV0aG9kID0gbTsKKyAgfQorCisgIHB1YmxpYyBDb25zdHJ1Y3Rvck9yTWV0aG9kKENvbnN0cnVjdG9yIGMpIHsKKyAgICBtX2NvbnN0cnVjdG9yID0gYzsKKyAgfQorCisgIHB1YmxpYyBDbGFzczw/PiBnZXREZWNsYXJpbmdDbGFzcygpIHsKKyAgICByZXR1cm4gZ2V0TWV0aG9kKCkgIT0gbnVsbCA/IGdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCkgOiBnZXRDb25zdHJ1Y3RvcigpLmdldERlY2xhcmluZ0NsYXNzKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIGdldE1ldGhvZCgpICE9IG51bGwgPyBnZXRNZXRob2QoKS5nZXROYW1lKCkgOiBnZXRDb25zdHJ1Y3RvcigpLmdldE5hbWUoKTsKKyAgfQorCisgIHB1YmxpYyBDbGFzc1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgIHJldHVybiBnZXRNZXRob2QoKSAhPSBudWxsID8gZ2V0TWV0aG9kKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKSA6IGdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgfQorCisgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgeworICAgIHJldHVybiBtX21ldGhvZDsKKyAgfQorCisgIHB1YmxpYyBDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvcigpIHsKKyAgICByZXR1cm4gbV9jb25zdHJ1Y3RvcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChnZXRDb25zdHJ1Y3RvcigpID09IG51bGwpID8gMCA6IGdldENvbnN0cnVjdG9yKCkuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGdldE1ldGhvZCgpID09IG51bGwpID8gMCA6IGdldE1ldGhvZCgpLmhhc2hDb2RlKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgQ29uc3RydWN0b3JPck1ldGhvZCBvdGhlciA9IChDb25zdHJ1Y3Rvck9yTWV0aG9kKSBvYmo7CisgICAgaWYgKGdldENvbnN0cnVjdG9yKCkgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLmdldENvbnN0cnVjdG9yKCkgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIWdldENvbnN0cnVjdG9yKCkuZXF1YWxzKG90aGVyLmdldENvbnN0cnVjdG9yKCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRNZXRob2QoKSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIuZ2V0TWV0aG9kKCkgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIWdldE1ldGhvZCgpLmVxdWFscyhvdGhlci5nZXRNZXRob2QoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgIG1fZW5hYmxlZCA9IGVuYWJsZWQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgeworICAgIHJldHVybiBtX2VuYWJsZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBpZiAobV9tZXRob2QgIT0gbnVsbCkgcmV0dXJuIG1fbWV0aG9kLnRvU3RyaW5nKCk7CisgICAgZWxzZSByZXR1cm4gbV9jb25zdHJ1Y3Rvci50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRGF0YVByb3ZpZGVySG9sZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRGF0YVByb3ZpZGVySG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDcxNjJjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9EYXRhUHJvdmlkZXJIb2xkZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklEYXRhUHJvdmlkZXJBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEEgaG9sZGVyIGZvciBhIHBhaXIgb2YgTWV0aG9kIGFuZCBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbgorICovCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVySG9sZGVyIHsKKyAgT2JqZWN0IGluc3RhbmNlOworICBNZXRob2QgbWV0aG9kOworICBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uOworCisgIHB1YmxpYyBEYXRhUHJvdmlkZXJIb2xkZXIoSURhdGFQcm92aWRlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKKyAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9EZWZhdWx0TWV0aG9kU2VsZWN0b3JDb250ZXh0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRGVmYXVsdE1ldGhvZFNlbGVjdG9yQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkZjkzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRGVmYXVsdE1ldGhvZFNlbGVjdG9yQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kU2VsZWN0b3JDb250ZXh0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorLyoqDQorICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIElNZXRob2RTZWxlY3RvckNvbnRleHQNCisgKg0KKyAqIENyZWF0ZWQgb24gSmFuIDMsIDIwMDcNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+DQorICovDQorcHVibGljIGNsYXNzIERlZmF1bHRNZXRob2RTZWxlY3RvckNvbnRleHQgaW1wbGVtZW50cyBJTWV0aG9kU2VsZWN0b3JDb250ZXh0IHsNCisgIHByaXZhdGUgTWFwPE9iamVjdCwgT2JqZWN0PiBtX3VzZXJEYXRhID0gTWFwcy5uZXdIYXNoTWFwKCk7DQorICBwcml2YXRlIGJvb2xlYW4gbV9pc1N0b3BwZWQgPSBmYWxzZTsNCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE1hcDxPYmplY3QsIE9iamVjdD4gZ2V0VXNlckRhdGEoKSB7DQorICAgIHJldHVybiBtX3VzZXJEYXRhOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwZWQoKSB7DQorICAgIHJldHVybiBtX2lzU3RvcHBlZDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0U3RvcHBlZChib29sZWFuIHN0b3BwZWQpIHsNCisgICAgbV9pc1N0b3BwZWQgPSBzdG9wcGVkOw0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRHluYW1pYy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0R5bmFtaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTczNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0R5bmFtaWMuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKKy8qKgorICogRGV0ZXJtaW5lIHRoZSBhdmFpbGFiaWxpdHkgb2YgY2VydGFpbiBqYXIgZmlsZXMgYXQgcnVudGltZS4KKyAqLworcHVibGljIGNsYXNzIER5bmFtaWMgeworCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNCc2goKSB7CisgICAgdHJ5IHsKKyAgICAgIENsYXNzLmZvck5hbWUoImJzaC5JbnRlcnByZXRlciIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRHluYW1pY0dyYXBoLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRHluYW1pY0dyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5Nzk5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9EeW5hbWljR3JhcGguamF2YQpAQCAtMCwwICsxLDIxNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhcGggb2YgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIER5bmFtaWNHcmFwaDxUPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICBwcml2YXRlIExpc3Q8VD4gbV9ub2Rlc1JlYWR5ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTGlzdDxUPiBtX25vZGVzUnVubmluZyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8VD4gbV9ub2Rlc0ZpbmlzaGVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHJpdmF0ZSBDb21wYXJhdG9yPD8gc3VwZXIgVD4gbV9ub2RlQ29tcGFyYXRvciA9IG51bGw7CisKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8VCwgVD4gbV9kZXBlbmRlZFVwb24gPSBNYXBzLm5ld0xpc3RNdWx0aU1hcCgpOworICBwcml2YXRlIExpc3RNdWx0aU1hcDxULCBUPiBtX2RlcGVuZGluZ09uID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKworICBwdWJsaWMgc3RhdGljIGVudW0gU3RhdHVzIHsKKyAgICBSRUFEWSwgUlVOTklORywgRklOSVNIRUQKKyAgfQorCisgIC8qKgorICAgKiBEZWZpbmUgYSBjb21wYXJhdG9yIGZvciB0aGUgbm9kZXMgb2YgdGhpcyBncmFwaCwgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAqIHRvIG9yZGVyIHRoZSBmcmVlIG5vZGVzIHdoZW4gdGhleSBhcmUgYXNrZWQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8PyBzdXBlciBUPiBjKSB7CisgICAgbV9ub2RlQ29tcGFyYXRvciA9IGM7CisgIH0KKworICAvKioKKyAgICogQWRkIGEgbm9kZSB0byB0aGUgZ3JhcGguCisgICAqLworICBwdWJsaWMgdm9pZCBhZGROb2RlKFQgbm9kZSkgeworICAgIG1fbm9kZXNSZWFkeS5hZGQobm9kZSk7CisgIH0KKworICAvKioKKyAgICogQWRkIGFuIGVkZ2UgYmV0d2VlbiB0d28gbm9kZXMuCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRFZGdlKFQgZnJvbSwgVCB0bykgeworICAgIG1fZGVwZW5kaW5nT24ucHV0KHRvLCBmcm9tKTsKKyAgICBtX2RlcGVuZGVkVXBvbi5wdXQoZnJvbSwgdG8pOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYSBzZXQgb2YgYWxsIHRoZSBub2RlcyB0aGF0IGRvbid0IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMuCisgICAqLworICBwdWJsaWMgTGlzdDxUPiBnZXRGcmVlTm9kZXMoKSB7CisgICAgTGlzdDxUPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKFQgbSA6IG1fbm9kZXNSZWFkeSkgeworICAgICAgLy8gQSBub2RlIGlzIGZyZWUgaWYuLi4KKworICAgICAgTGlzdDxUPiBkdSA9IG1fZGVwZW5kZWRVcG9uLmdldChtKTsKKyAgICAgIC8vIC0gbm8gb3RoZXIgbm9kZXMgZGVwZW5kIG9uIGl0CisgICAgICBpZiAoIW1fZGVwZW5kZWRVcG9uLmNvbnRhaW5zS2V5KG0pKSB7CisgICAgICAgIHJlc3VsdC5hZGQobSk7CisgICAgICB9IGVsc2UgaWYgKGdldFVuZmluaXNoZWROb2RlcyhkdSkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmVzdWx0LmFkZChtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTb3J0IHRoZSBmcmVlIG5vZGVzIGlmIHJlcXVlc3RlZCAoZS5nLiBwcmlvcml0aWVzKQorICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhIHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgIGlmIChtX25vZGVDb21wYXJhdG9yICE9IG51bGwpIHsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIG1fbm9kZUNvbXBhcmF0b3IpOworICAgICAgICBwcHAoIk5vZGVzIGFmdGVyIHNvcnRpbmc6IiArIHJlc3VsdC5nZXQoMCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBub2RlcyB0aGF0IGhhdmUgYSBzdGF0dXMgb3RoZXIgdGhhbiBGSU5JU0hFRC4KKyAgICovCisgIHByaXZhdGUgQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gZ2V0VW5maW5pc2hlZE5vZGVzKExpc3Q8VD4gbm9kZXMpIHsKKyAgICBTZXQ8VD4gcmVzdWx0ID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChUIG5vZGUgOiBub2RlcykgeworICAgICAgaWYgKG1fbm9kZXNSZWFkeS5jb250YWlucyhub2RlKSB8fCBtX25vZGVzUnVubmluZy5jb250YWlucyhub2RlKSkgeworICAgICAgICByZXN1bHQuYWRkKG5vZGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgc3RhdHVzIGZvciBhIHNldCBvZiBub2Rlcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhDb2xsZWN0aW9uPFQ+IG5vZGVzLCBTdGF0dXMgc3RhdHVzKSB7CisgICAgZm9yIChUIG4gOiBub2RlcykgeworICAgICAgc2V0U3RhdHVzKG4sIHN0YXR1cyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgc3RhdHVzIGZvciBhIG5vZGUuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoVCBub2RlLCBTdGF0dXMgc3RhdHVzKSB7CisgICAgcmVtb3ZlTm9kZShub2RlKTsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICBjYXNlIFJFQURZOiBtX25vZGVzUmVhZHkuYWRkKG5vZGUpOyBicmVhazsKKyAgICAgIGNhc2UgUlVOTklORzogbV9ub2Rlc1J1bm5pbmcuYWRkKG5vZGUpOyBicmVhazsKKyAgICAgIGNhc2UgRklOSVNIRUQ6IG1fbm9kZXNGaW5pc2hlZC5hZGQobm9kZSk7IGJyZWFrOworICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZW1vdmVOb2RlKFQgbm9kZSkgeworICAgIGlmICghbV9ub2Rlc1JlYWR5LnJlbW92ZShub2RlKSkgeworICAgICAgaWYgKCFtX25vZGVzUnVubmluZy5yZW1vdmUobm9kZSkpIHsKKyAgICAgICAgbV9ub2Rlc0ZpbmlzaGVkLnJlbW92ZShub2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgZ3JhcGguCisgICAqLworICBwdWJsaWMgaW50IGdldE5vZGVDb3VudCgpIHsKKyAgICBpbnQgcmVzdWx0ID0gbV9ub2Rlc1JlYWR5LnNpemUoKSArIG1fbm9kZXNSdW5uaW5nLnNpemUoKSArIG1fbm9kZXNGaW5pc2hlZC5zaXplKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0Tm9kZUNvdW50V2l0aFN0YXR1cyhTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgY2FzZSBSRUFEWTogcmV0dXJuIG1fbm9kZXNSZWFkeS5zaXplKCk7CisgICAgICBjYXNlIFJVTk5JTkc6IHJldHVybiBtX25vZGVzUnVubmluZy5zaXplKCk7CisgICAgICBjYXNlIEZJTklTSEVEOiByZXR1cm4gbV9ub2Rlc0ZpbmlzaGVkLnNpemUoKTsKKyAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKERFQlVHKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIFtHcm91cFRocmVhZFBvb2xFeGVjdXRvcl0gIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICIgIgorICAgICAgICAgICsgc3RyaW5nKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbRHluYW1pY0dyYXBoICIpOworICAgIHJlc3VsdC5hcHBlbmQoIlxuICBSZWFkeToiICsgbV9ub2Rlc1JlYWR5KTsKKyAgICByZXN1bHQuYXBwZW5kKCJcbiAgUnVubmluZzoiICsgbV9ub2Rlc1J1bm5pbmcpOworICAgIHJlc3VsdC5hcHBlbmQoIlxuICBGaW5pc2hlZDoiICsgbV9ub2Rlc0ZpbmlzaGVkKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcbiAgRWRnZXM6XG4iKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxULCBMaXN0PFQ+PiBlcyA6IG1fZGVwZW5kaW5nT24uZW50cnlTZXQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAiICsgZXMuZ2V0S2V5KCkgKyAiXG4iKTsKKyAgICAgIGZvciAoVCB0IDogZXMuZ2V0VmFsdWUoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICAgICIgKyB0ICsgIlxuIik7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXROYW1lKFQgdCkgeworICAgIFN0cmluZyBzID0gdC50b1N0cmluZygpOworICAgIGludCBuMSA9IHMubGFzdEluZGV4T2YoJy4nKSArIDE7CisgICAgaW50IG4yID0gcy5pbmRleE9mKCcoJyk7CisgICAgcmV0dXJuIHMuc3Vic3RyaW5nKG4xLCBuMik7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhIC5kb3QgZmlsZSAoR3JhcGhWaXopIHZlcnNpb24gb2YgdGhpcyBncmFwaC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9Eb3QoKSB7CisgICAgU3RyaW5nIEZSRUUgPSAiW3N0eWxlPWZpbGxlZCBjb2xvcj15ZWxsb3ddIjsKKyAgICBTdHJpbmcgUlVOTklORyA9ICJbc3R5bGU9ZmlsbGVkIGNvbG9yPWdyZWVuXSI7CisgICAgU3RyaW5nIEZJTklTSEVEID0gIltzdHlsZT1maWxsZWQgY29sb3I9Z3JleV0iOworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoImRpZ3JhcGggZyB7XG4iKTsKKyAgICBMaXN0PFQ+IGZyZWVOb2RlcyA9IGdldEZyZWVOb2RlcygpOworICAgIFN0cmluZyBjb2xvcjsKKyAgICBmb3IgKFQgbiA6IG1fbm9kZXNSZWFkeSkgeworICAgICAgY29sb3IgPSBmcmVlTm9kZXMuY29udGFpbnMobikgPyBGUkVFIDogIiI7CisgICAgICByZXN1bHQuYXBwZW5kKCIgICIgKyBnZXROYW1lKG4pICsgY29sb3IgKyAiXG4iKTsKKyAgICB9CisgICAgZm9yIChUIG4gOiBtX25vZGVzUnVubmluZykgeworICAgICAgY29sb3IgPSBmcmVlTm9kZXMuY29udGFpbnMobikgPyBGUkVFIDogUlVOTklORzsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIiArIGdldE5hbWUobikgKyBjb2xvciArICJcbiIpOworICAgIH0KKyAgICBmb3IgKFQgbiA6IG1fbm9kZXNGaW5pc2hlZCkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiICAiICsgZ2V0TmFtZShuKSArIEZJTklTSEVEKyAiXG4iKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIGZvciAoVCBrIDogbV9kZXBlbmRpbmdPbi5rZXlTZXQoKSkgeworICAgICAgTGlzdDxUPiBub2RlcyA9IG1fZGVwZW5kaW5nT24uZ2V0KGspOworICAgICAgZm9yIChUIG4gOiBub2RlcykgeworICAgICAgICBTdHJpbmcgZG90dGVkID0gbV9ub2Rlc0ZpbmlzaGVkLmNvbnRhaW5zKGspID8gInN0eWxlPWRvdHRlZCIgOiAiIjsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiICsgZ2V0TmFtZShrKSArICIgLT4gIiArIGdldE5hbWUobikgKyAiIFtkaXI9YmFjayAiICsgZG90dGVkICsgIl1cbiIpOworICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJ9XG4iKTsKKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0TXVsdGlNYXA8VCwgVD4gZ2V0RWRnZXMoKSB7CisgICAgcmV0dXJuIG1fZGVwZW5kaW5nT247CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0VjbGlwc2VJbnRlcmZhY2UuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9FY2xpcHNlSW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMTg5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9FY2xpcHNlSW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCisvKioKKyAqIFN5bWJvbHMgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCBieSB0aGUgRWNsaXBzZSBwbHVnLWluLCBkbyBub3QgbW9kaWZ5IHRoZW0KKyAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHBsdWctaW4gYXMgd2VsbC4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqIEBzaW5jZSBBdWcgMjUsIDIwMTIKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VJbnRlcmZhY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJhY3RlciBPUEVOSU5HX0NIQVJBQ1RFUiA9ICdbJzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyYWN0ZXIgQ0xPU0lOR19DSEFSQUNURVIgPSAnXSc7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUX0xFRlQgPSAiZXhwZWN0ZWQgIiArIE9QRU5JTkdfQ0hBUkFDVEVSOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRfTEVGVDIgPSAiZXhwZWN0ZWQgbm90IHNhbWUgIiArIE9QRU5JTkdfQ0hBUkFDVEVSOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRfTUlERExFID0gQ0xPU0lOR19DSEFSQUNURVIgKyAiIGJ1dCBmb3VuZCAiICsgT1BFTklOR19DSEFSQUNURVI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVF9SSUdIVCA9IENoYXJhY3Rlci50b1N0cmluZyhDTE9TSU5HX0NIQVJBQ1RFUik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwOGFlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9FeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciB7CisKKyAgcHJvdGVjdGVkIGZpbmFsIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcjsKKyAgcHJvdGVjdGVkIGZpbmFsIElUZXN0TkdNZXRob2QgbWV0aG9kOworICBwcml2YXRlIGZpbmFsIENsYXNzPD8+W10gZXhwZWN0ZWRDbGFzc2VzOworICBwcml2YXRlIGZpbmFsIElFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIgaG9sZGVyOworCisgIHByb3RlY3RlZCBFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIoSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBJVGVzdE5HTWV0aG9kIG1ldGhvZCwgSUV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciBob2xkZXIpIHsKKyAgICB0aGlzLmZpbmRlciA9IGZpbmRlcjsKKyAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICBleHBlY3RlZENsYXNzZXMgPSBmaW5kRXhwZWN0ZWRDbGFzc2VzKGZpbmRlciwgbWV0aG9kKTsKKyAgICB0aGlzLmhvbGRlciA9IGhvbGRlcjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+W10gZmluZEV4cGVjdGVkQ2xhc3NlcyhJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24gZXhwZWN0ZWRFeGNlcHRpb25zID0KKyAgICAgICAgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uY2xhc3MpOworICAgIC8vIE9sZCBzeW50YXgKKyAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb25zICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBleHBlY3RlZEV4Y2VwdGlvbnMuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvLyBOZXcgc3ludGF4CisgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3RBbm5vdGF0aW9uID0gZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICBpZiAodGVzdEFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRlc3RBbm5vdGF0aW9uLmdldEV4cGVjdGVkRXhjZXB0aW9ucygpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQ2xhc3M8Pz5bMF07CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGl0ZSBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIGp1c3QgdGhyb3duCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIGp1c3QgdGhyb3duIGlzIHBhcnQgb2YgdGhlCisgICAqIGV4cGVjdGVkIGV4Y2VwdGlvbnMKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzRXhwZWN0ZWRFeGNlcHRpb24oVGhyb3dhYmxlIGl0ZSkgeworICAgIGlmICghaGFzRXhwZWN0ZWRDbGFzc2VzKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUZXN0RXhjZXB0aW9uIGlzIHRoZSB3cmFwcGVyIGV4Y2VwdGlvbiB0aGF0IFRlc3RORyB3aWxsIGJlIHRocm93aW5nIHdoZW4gYW4gZXhjZXB0aW9uIHdhcworICAgIC8vIGV4cGVjdGVkIGJ1dCBub3QgdGhyb3duCisgICAgaWYgKGl0ZS5nZXRDbGFzcygpID09IFRlc3RFeGNlcHRpb24uY2xhc3MpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDbGFzczw/PiByZWFsRXhjZXB0aW9uQ2xhc3M9IGl0ZS5nZXRDbGFzcygpOworCisgICAgZm9yIChDbGFzczw/PiBleGNlcHRpb24gOiBleHBlY3RlZENsYXNzZXMpIHsKKyAgICAgIGlmIChleGNlcHRpb24uaXNBc3NpZ25hYmxlRnJvbShyZWFsRXhjZXB0aW9uQ2xhc3MpICYmIGhvbGRlci5pc1Rocm93YWJsZU1hdGNoaW5nKGl0ZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIFRocm93YWJsZSB3cm9uZ0V4Y2VwdGlvbihUaHJvd2FibGUgaXRlKSB7CisgICAgaWYgKCFoYXNFeHBlY3RlZENsYXNzZXMoKSkgeworICAgICAgcmV0dXJuIGl0ZTsKKyAgICB9CisKKyAgICBpZiAoaG9sZGVyLmlzVGhyb3dhYmxlTWF0Y2hpbmcoaXRlKSkgeworICAgICAgcmV0dXJuIG5ldyBUZXN0RXhjZXB0aW9uKCJFeHBlY3RlZCBleGNlcHRpb24gb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXhwZWN0ZWRFeGNlcHRpb25zUGx1cmFsaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGdvdCAiICsgaXRlLCBpdGUpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IFRlc3RFeGNlcHRpb24oaG9sZGVyLmdldFdyb25nRXhjZXB0aW9uTWVzc2FnZShpdGUpLCBpdGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBUZXN0RXhjZXB0aW9uIG5vRXhjZXB0aW9uKElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCkgeworICAgIGlmICghaGFzRXhwZWN0ZWRDbGFzc2VzKCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRlc3RFeGNlcHRpb24oIk1ldGhvZCAiICsgdGVzdE1ldGhvZCArICIgc2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RXhwZWN0ZWRFeGNlcHRpb25zUGx1cmFsaXplKCkpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0V4cGVjdGVkQ2xhc3NlcygpIHsKKyAgICByZXR1cm4gZXhwZWN0ZWRDbGFzc2VzICE9IG51bGwgJiYgZXhwZWN0ZWRDbGFzc2VzLmxlbmd0aCA+IDA7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZEV4Y2VwdGlvbnNQbHVyYWxpemUoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgaWYgKGV4cGVjdGVkQ2xhc3Nlcy5sZW5ndGggPiAxKSB7CisgICAgICBzYi5hcHBlbmQoImFueSBvZiB0eXBlcyAiKTsKKyAgICAgIHNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRDbGFzc2VzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCgidHlwZSAiKTsKKyAgICAgIHNiLmFwcGVuZChleHBlY3RlZENsYXNzZXNbMF0pOworICAgIH0KKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0V4dHJhT3V0cHV0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvRXh0cmFPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjMwODljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0V4dHJhT3V0cHV0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JRXh0cmFPdXRwdXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBSZXBvcnRlciB0byBzdG9yZSB0aGUgZXh0cmEgb3V0cHV0IHRvIGJlIGxhdGVyCisgKiBpbmNsdWRlZCBpbiB0aGUgSFRNTCByZXBvcnQ6CisgKiAtIFVzZXItZ2VuZXJhdGVkIHJlcG9ydAorICogLSBQYXJhbWV0ZXIgaW5mbworICoKKyAqIENyZWF0ZWQgb24gRmViIDE2LCAyMDA2CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBFeHRyYU91dHB1dCBpbXBsZW1lbnRzIElFeHRyYU91dHB1dCB7CisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODE5NTM4ODQxOTYxMTkxMjE5Mkw7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fcGFyYW1ldGVyT3V0cHV0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyT3V0cHV0KCkgeworICAgIHJldHVybiBtX3BhcmFtZXRlck91dHB1dDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ZhY3RvcnlNZXRob2QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9GYWN0b3J5TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNTljMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9GYWN0b3J5TWV0aG9kLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW5zdGFuY2VJbmZvOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbWV0aG9kIGFubm90YXRlZCB3aXRoIEBGYWN0b3J5CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgY2xhc3MgRmFjdG9yeU1ldGhvZCBleHRlbmRzIEJhc2VUZXN0TWV0aG9kIHsKKyAgLyoqCisgICAqCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzMyOTkxODgyMTM0NjE5NzA5OUw7CisgIHByaXZhdGUgT2JqZWN0IG1faW5zdGFuY2UgPSBudWxsOworICBwcml2YXRlIFhtbFRlc3QgbV94bWxUZXN0ID0gbnVsbDsKKyAgcHJpdmF0ZSBJVGVzdENvbnRleHQgbV90ZXN0Q29udGV4dCA9IG51bGw7CisKKyAgcHVibGljIEZhY3RvcnlNZXRob2QoQ29uc3RydWN0b3JPck1ldGhvZCBjb20sCisgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgWG1sVGVzdCB4bWxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpCisgIHsKKyAgICBzdXBlcihjb20uZ2V0TmFtZSgpLCBjb20sIGFubm90YXRpb25GaW5kZXIsIGluc3RhbmNlKTsKKyAgICBVdGlscy5jaGVja0luc3RhbmNlT3JTdGF0aWMoaW5zdGFuY2UsIGNvbS5nZXRNZXRob2QoKSk7CisgICAgVXRpbHMuY2hlY2tSZXR1cm5UeXBlKGNvbS5nZXRNZXRob2QoKSwgT2JqZWN0W10uY2xhc3MsIElJbnN0YW5jZUluZm9bXS5jbGFzcyk7CisgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBjb20uZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCAmJiAhIGRlY2xhcmluZ0NsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5zdGFuY2UuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIk1pc21hdGNoIGJldHdlZW4gaW5zdGFuY2UvbWV0aG9kIGNsYXNzZXM6IgorICAgICAgICAgICsgaW5zdGFuY2UuZ2V0Q2xhc3MoKSArICIgIiArIGRlY2xhcmluZ0NsYXNzKTsKKyAgICB9CisgICAgaWYgKGluc3RhbmNlID09IG51bGwgJiYgY29tLmdldE1ldGhvZCgpICE9IG51bGwgJiYgIU1vZGlmaWVyLmlzU3RhdGljKGNvbS5nZXRNZXRob2QoKS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkFuIGlubmVyIGZhY3RvcnkgbWV0aG9kIE1VU1QgYmUgc3RhdGljLiBCdXQgJyIgKyBjb20uZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpICsgIicgZnJvbSAnIiArIGRlY2xhcmluZ0NsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdC4iKTsKKyAgICB9CisgICAgaWYgKGNvbS5nZXRNZXRob2QoKSAhPSBudWxsICYmICFNb2RpZmllci5pc1B1YmxpYyhjb20uZ2V0TWV0aG9kKCkuZ2V0TW9kaWZpZXJzKCkpKSB7CisgICAgICB0cnkgeworICAgICAgICBjb20uZ2V0TWV0aG9kKCkuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtX2luc3RhbmNlID0gaW5zdGFuY2U7CisgICAgbV94bWxUZXN0ID0geG1sVGVzdDsKKyAgICBtX3Rlc3RDb250ZXh0ID0gdGVzdENvbnRleHQ7CisgICAgTm9PcFRlc3RDbGFzcyB0YyA9IG5ldyBOb09wVGVzdENsYXNzKCk7CisgICAgdGMuc2V0VGVzdENsYXNzKGRlY2xhcmluZ0NsYXNzKTsKKyAgICBtX3Rlc3RDbGFzcyA9IHRjOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGYWN0b3J5TWV0aG9kXSAiICsgcyk7CisgIH0KKworICBwdWJsaWMgT2JqZWN0W10gaW52b2tlKCkgeworICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsUGFyYW1ldGVyTmFtZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBJdGVyYXRvcjxPYmplY3RbXT4gcGFyYW1ldGVySXRlcmF0b3IgPQorICAgICAgUGFyYW1ldGVycy5oYW5kbGVQYXJhbWV0ZXJzKHRoaXMsCisgICAgICAgICAgYWxsUGFyYW1ldGVyTmFtZXMsCisgICAgICAgICAgbV9pbnN0YW5jZSwKKyAgICAgICAgICBuZXcgUGFyYW1ldGVycy5NZXRob2RQYXJhbWV0ZXJzKG1feG1sVGVzdC5nZXRBbGxQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICAgIGZpbmRNZXRob2RQYXJhbWV0ZXJzKG1feG1sVGVzdCksCisgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1fdGVzdENvbnRleHQsCisgICAgICAgICAgICAgIG51bGwgLyogdGVzdFJlc3VsdCAqLyksCisgICAgICAgICAgbV94bWxUZXN0LmdldFN1aXRlKCksCisgICAgICAgICAgbV9hbm5vdGF0aW9uRmluZGVyLAorICAgICAgICAgIG51bGwgLyogZmVkSW5zdGFuY2UgKi8pLnBhcmFtZXRlcnM7CisKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHBhcmFtZXRlckl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gcGFyYW1ldGVySXRlcmF0b3IubmV4dCgpOworICAgICAgICBPYmplY3RbXSB0ZXN0SW5zdGFuY2VzOworICAgICAgICBDb25zdHJ1Y3Rvck9yTWV0aG9kIGNvbSA9IGdldENvbnN0cnVjdG9yT3JNZXRob2QoKTsKKyAgICAgICAgaWYgKGNvbS5nZXRNZXRob2QoKSAhPSBudWxsKSB7CisgICAgICAgICAgdGVzdEluc3RhbmNlcyA9IChPYmplY3RbXSkgZ2V0TWV0aG9kKCkuaW52b2tlKG1faW5zdGFuY2UsIHBhcmFtZXRlcnMpOworICAgICAgICAgIGZvciAoT2JqZWN0IHRlc3RJbnN0YW5jZSA6IHRlc3RJbnN0YW5jZXMpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQodGVzdEluc3RhbmNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gY29tLmdldENvbnN0cnVjdG9yKCkubmV3SW5zdGFuY2UocGFyYW1ldGVycyk7CisgICAgICAgICAgcmVzdWx0LmFkZChpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICBDb25zdHJ1Y3Rvck9yTWV0aG9kIGNvbSA9IGdldENvbnN0cnVjdG9yT3JNZXRob2QoKTsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlRoZSBmYWN0b3J5IG1ldGhvZCAiCisgICAgICAgICAgKyBjb20uZ2V0RGVjbGFyaW5nQ2xhc3MoKSArICIuIiArIGNvbS5nZXROYW1lKCkKKyAgICAgICAgICArICIoKSB0aHJldyBhbiBleGNlcHRpb24iLCB0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IE9iamVjdFtyZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2QgY2xvbmUoKSB7CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2xvbmUgaXMgbm90IHN1cHBvcnRlZCBmb3IgRmFjdG9yeU1ldGhvZCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvR3JhcGguamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9HcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzM2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvR3JhcGguamF2YQpAQCAtMCwwICsxLDM0MyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworLyoqCisgKiBTaW1wbGUgZ3JhcGggY2xhc3MgdG8gaW1wbGVtZW50IHRvcG9sb2dpY2FsIHNvcnQgKHVzZWQgdG8gc29ydCBtZXRob2RzIGJhc2VkIG9uIHdoYXQgZ3JvdXBzCisgKiB0aGV5IGRlcGVuZCBvbikuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyAxOSwgMjAwNAorICovCitwdWJsaWMgY2xhc3MgR3JhcGg8VD4geworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fdmVyYm9zZSA9IGZhbHNlOworICBwcml2YXRlIE1hcDxULCBOb2RlPFQ+PiBtX25vZGVzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgIHByaXZhdGUgTGlzdDxUPiBtX3N0cmljdGx5U29ydGVkTm9kZXMgPSBudWxsOworCisgIC8vICBBIG1hcCBvZiBub2RlcyB0aGF0IGFyZSBub3QgdGhlIHByZWRlY2Vzc29ycyBvZiBhbnkgbm9kZQorICAvLyAobm90IG5lZWRlZCBmb3IgdGhlIGFsZ29yaXRobSBidXQgY29udmVuaWVudCB0byBjYWxjdWxhdGUKKyAgLy8gdGhlIHBhcmFsbGVsL3NlcXVlbnRpYWwgbGlzdHMgaW4gVGVzdE5HKS4KKyAgcHJpdmF0ZSBNYXA8VCwgTm9kZTxUPj4gbV9pbmRlcGVuZGVudE5vZGVzID0gbnVsbDsKKworICBwdWJsaWMgdm9pZCBhZGROb2RlKFQgdG0pIHsKKyAgICBwcHAoIkFERElORyBOT0RFICIgKyB0bSArICIgIiArIHRtLmhhc2hDb2RlKCkpOworICAgIG1fbm9kZXMucHV0KHRtLCBuZXcgTm9kZTw+KHRtKSk7CisgICAgLy8gSW5pdGlhbGx5LCBhbGwgdGhlIG5vZGVzIGFyZSBwdXQgaW4gdGhlIGluZGVwZW5kZW50IGxpc3QgYXMgd2VsbAorICB9CisKKyAgcHVibGljIFNldDxUPiBnZXRQcmVkZWNlc3NvcnMoVCBub2RlKSB7CisgICAgcmV0dXJuIGZpbmROb2RlKG5vZGUpLmdldFByZWRlY2Vzc29ycygpLmtleVNldCgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNJbmRlcGVuZGVudChUIG9iamVjdCkgeworICAgIHJldHVybiBtX2luZGVwZW5kZW50Tm9kZXMuY29udGFpbnNLZXkob2JqZWN0KTsKKyAgfQorCisgIHByaXZhdGUgTm9kZTxUPiBmaW5kTm9kZShUIG9iamVjdCkgeworICAgIHJldHVybiBtX25vZGVzLmdldChvYmplY3QpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkUHJlZGVjZXNzb3IoVCB0bSwgVCBwcmVkZWNlc3NvcikgeworICAgIE5vZGU8VD4gbm9kZSA9IGZpbmROb2RlKHRtKTsKKyAgICBpZiAobnVsbCA9PSBub2RlKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJOb24tZXhpc3Rpbmcgbm9kZTogIiArIHRtKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBub2RlLmFkZFByZWRlY2Vzc29yKHByZWRlY2Vzc29yKTsKKyAgICAgIGFkZE5laWdoYm9yKHRtLCBwcmVkZWNlc3Nvcik7CisgICAgICAvLyBSZW1vdmUgdGhlc2UgdHdvIG5vZGVzIGZyb20gdGhlIGluZGVwZW5kZW50IGxpc3QKKyAgICAgIGluaXRpYWxpemVJbmRlcGVuZGVudE5vZGVzKCk7CisgICAgICBtX2luZGVwZW5kZW50Tm9kZXMucmVtb3ZlKHByZWRlY2Vzc29yKTsKKyAgICAgIG1faW5kZXBlbmRlbnROb2Rlcy5yZW1vdmUodG0pOworICAgICAgcHBwKCIgIFJFTU9WRUQgIiArIHByZWRlY2Vzc29yICsgIiBGUk9NIElOREVQRU5ERU5UIE9CSkVDVFMiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkTmVpZ2hib3IoVCB0bSwgVCBwcmVkZWNlc3NvcikgeworICAgIGZpbmROb2RlKHRtKS5hZGROZWlnaGJvcihmaW5kTm9kZShwcmVkZWNlc3NvcikpOworICB9CisKKyAgcHVibGljIFNldDxUPiBnZXROZWlnaGJvcnMoVCB0KSB7CisgICAgU2V0PFQ+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBmb3IgKE5vZGU8VD4gbiA6IGZpbmROb2RlKHQpLmdldE5laWdoYm9ycygpKSB7CisgICAgICByZXN1bHQuYWRkKG4uZ2V0T2JqZWN0KCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIENvbGxlY3Rpb248Tm9kZTxUPj4gZ2V0Tm9kZXMoKSB7CisgICAgcmV0dXJuIG1fbm9kZXMudmFsdWVzKCk7CisgIH0KKworICBwdWJsaWMgQ29sbGVjdGlvbjxUPiBnZXROb2RlVmFsdWVzKCkgeworICAgIHJldHVybiBtX25vZGVzLmtleVNldCgpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBub2RlcyB0aGF0IGRvbid0IGhhdmUgYW55IG9yZGVyIHdpdGggZWFjaCBvdGhlci4KKyAgICovCisgIHB1YmxpYyBTZXQ8VD4gZ2V0SW5kZXBlbmRlbnROb2RlcygpIHsKKyAgICByZXR1cm4gbV9pbmRlcGVuZGVudE5vZGVzLmtleVNldCgpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gQWxsIHRoZSBub2RlcyB0aGF0IGhhdmUgYW4gb3JkZXIgd2l0aCBlYWNoIG90aGVyLCBzb3J0ZWQKKyAgICogaW4gb25lIG9mIHRoZSB2YWxpZCBzb3J0cy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFQ+IGdldFN0cmljdGx5U29ydGVkTm9kZXMoKSB7CisgICAgcmV0dXJuIG1fc3RyaWN0bHlTb3J0ZWROb2RlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRvcG9sb2dpY2FsU29ydCgpIHsKKyAgICBwcHAoIj09PT09PT09PT09PT09PT0gU09SVElORyIpOworICAgIG1fc3RyaWN0bHlTb3J0ZWROb2RlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGluaXRpYWxpemVJbmRlcGVuZGVudE5vZGVzKCk7CisKKyAgICAvLworICAgIC8vIENsb25lIHRoZSBsaXN0IG9mIG5vZGVzIGJ1dCBvbmx5IGtlZXAgdGhvc2UgdGhhdCBhcmUKKyAgICAvLyBub3QgaW5kZXBlbmRlbnQuCisgICAgLy8KKyAgICBMaXN0PE5vZGU8VD4+IG5vZGVzMiA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoTm9kZTxUPiBuIDogZ2V0Tm9kZXMoKSkgeworICAgICAgaWYgKCEgaXNJbmRlcGVuZGVudChuLmdldE9iamVjdCgpKSkgeworICAgICAgICBwcHAoIkFERElORyBGT1IgU09SVDogIiArIG4uZ2V0T2JqZWN0KCkpOworICAgICAgICBub2RlczIuYWRkKG4uY2xvbmUoKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHBwKCJTS0lQUElORyBJTkRFUEVOREVOVCBOT0RFICIgKyBuKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIG5vZGVzIGFscGhhYmV0aWNhbGx5IHRvIG1ha2Ugc3VyZSB0aGF0IG1ldGhvZHMgb2YgdGhlIHNhbWUgY2xhc3MKKyAgICAvLyBnZXQgcnVuIGNsb3NlIHRvIGVhY2ggb3RoZXIgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgIC8vCisgICAgQ29sbGVjdGlvbnMuc29ydChub2RlczIpOworCisgICAgLy8KKyAgICAvLyBTb3J0CisgICAgLy8KKyAgICB3aGlsZSAoISBub2RlczIuaXNFbXB0eSgpKSB7CisKKyAgICAgIC8vCisgICAgICAvLyBGaW5kIGFsbCB0aGUgbm9kZXMgdGhhdCBkb24ndCBoYXZlIGFueSBwcmVkZWNlc3NvcnMsIGFkZAorICAgICAgLy8gdGhlbSB0byB0aGUgcmVzdWx0IGFuZCBtYXJrIHRoZW0gZm9yIHJlbW92YWwKKyAgICAgIC8vCisgICAgICBOb2RlPFQ+IG5vZGUgPSBmaW5kTm9kZVdpdGhOb1ByZWRlY2Vzc29ycyhub2RlczIpOworICAgICAgaWYgKG51bGwgPT0gbm9kZSkgeworICAgICAgICBMaXN0PFQ+IGN5Y2xlID0gbmV3IFRhcmphbjw+KHRoaXMsIG5vZGVzMi5nZXQoMCkuZ2V0T2JqZWN0KCkpLmdldEN5Y2xlKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoIlRoZSBmb2xsb3dpbmcgbWV0aG9kcyBoYXZlIGN5Y2xpYyBkZXBlbmRlbmNpZXM6XG4iKTsKKyAgICAgICAgZm9yIChUIG0gOiBjeWNsZSkgeworICAgICAgICAgIHNiLmFwcGVuZChtKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihzYi50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBtX3N0cmljdGx5U29ydGVkTm9kZXMuYWRkKG5vZGUuZ2V0T2JqZWN0KCkpOworICAgICAgICByZW1vdmVGcm9tTm9kZXMobm9kZXMyLCBub2RlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcHAoIj09PT09PT09PT09PT09PSBET05FIFNPUlRJTkciKTsKKyAgICBpZiAobV92ZXJib3NlKSB7CisgICAgICBkdW1wU29ydGVkTm9kZXMoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUluZGVwZW5kZW50Tm9kZXMoKSB7CisgICAgaWYgKG51bGwgPT0gbV9pbmRlcGVuZGVudE5vZGVzKSB7CisgICAgICBMaXN0PE5vZGU8VD4+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QobV9ub2Rlcy52YWx1ZXMoKSk7CisgICAgICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgbm90IGhhdmUgdG8gc29ydCB0aGlzLiBIb3dldmVyLCBkdWUgdG8gYSBidWcgd2hlcmUgaXQgdHJlYXRzIGFsbCB0aGUgbWV0aG9kcyBhcworICAgICAgLy8gZGVwZW5kZW50IG5vZGVzLiBUaGVyZWZvcmUsIGFsbCB0aGUgbm9kZXMgd2VyZSBtb3N0bHkgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBTbyB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgIC8vIHRoZSBiZWhhdmlvciBmb3Igbm93LgorICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgIG1faW5kZXBlbmRlbnROb2RlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgZm9yIChOb2RlPFQ+IG5vZGUgOiBsaXN0KSB7CisgICAgICAgIG1faW5kZXBlbmRlbnROb2Rlcy5wdXQobm9kZS5nZXRPYmplY3QoKSwgbm9kZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGR1bXBTb3J0ZWROb2RlcygpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PSBTT1JURUQgTk9ERVMiKTsKKyAgICBmb3IgKFQgbiA6IG1fc3RyaWN0bHlTb3J0ZWROb2RlcykgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICIgKyBuKTsKKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT0gRU5EIFNPUlRFRCBOT0RFUyIpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZSBhIG5vZGUgZnJvbSBhIGxpc3Qgb2Ygbm9kZXMgYW5kIHVwZGF0ZSB0aGUgbGlzdCBvZiBwcmVkZWNlc3NvcnMKKyAgICogZm9yIGFsbCB0aGUgcmVtYWluaW5nIG5vZGVzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21Ob2RlcyhMaXN0PE5vZGU8VD4+IG5vZGVzLCBOb2RlPFQ+IG5vZGUpIHsKKyAgICBub2Rlcy5yZW1vdmUobm9kZSk7CisgICAgZm9yIChOb2RlPFQ+IG4gOiBub2RlcykgeworICAgICAgbi5yZW1vdmVQcmVkZWNlc3Nvcihub2RlLmdldE9iamVjdCgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChtX3ZlcmJvc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0dyYXBoXSAiICsgcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBOb2RlPFQ+IGZpbmROb2RlV2l0aE5vUHJlZGVjZXNzb3JzKExpc3Q8Tm9kZTxUPj4gbm9kZXMpIHsKKyAgICBmb3IgKE5vZGU8VD4gbiA6IG5vZGVzKSB7CisgICAgICBpZiAoISBuLmhhc1ByZWRlY2Vzc29ycygpKSB7CisgICAgICAgIHJldHVybiBuOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBvCisgICAqIEByZXR1cm4gQSBsaXN0IG9mIGFsbCB0aGUgcHJlZGVjZXNzb3JzIGZvciBvCisgICAqLworICBwdWJsaWMgTGlzdDxUPiBmaW5kUHJlZGVjZXNzb3JzKFQgbykgeworICAgIC8vIExvY2F0ZSB0aGUgbm9kZQorICAgIE5vZGU8VD4gbm9kZSA9IGZpbmROb2RlKG8pOworICAgIGlmIChudWxsID09IG5vZGUpIHsKKyAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhbiBpbnRlcmNlcHRvciByZXR1cm5lZCBuZXcgbWV0aG9kcworICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKworICAgIC8vIElmIHdlIGZvdW5kIHRoZSBub2RlLCB1c2UgYnJlYWR0aCBmaXJzdCBzZWFyY2ggdG8gZmluZCBhbGwKKyAgICAvLyBhbGwgb2YgdGhlIHByZWRlY2Vzc29ycyBvZiBvLiAgInJlc3VsdCIgaXMgdGhlIGdyb3dpbmcgbGlzdAorICAgIC8vIG9mIGFsbCBwcmVkZWNlc3NvcnMuICAidmlzaXRlZCIgaXMgdGhlIHNldCBvZiBpdGVtcyB3ZSd2ZQorICAgIC8vIGFscmVhZHkgZW5jb3VudGVyZWQuICAicXVldWUiIGlzIHRoZSBxdWV1ZSBvZiBpdGVtcyB3aG9zZQorICAgIC8vIHByZWRlY2Vzc29ycyB3ZSBoYXZlbid0IHlldCBleHBsb3JlZC4KKworICAgIExpbmtlZExpc3Q8VD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgIFNldDxUPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8PigpOworICAgIExpbmtlZExpc3Q8VD4gcXVldWUgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgdmlzaXRlZC5hZGQobyk7CisgICAgcXVldWUuYWRkTGFzdChvKTsKKworICAgIHdoaWxlICghIHF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgZm9yIChUIG9iaiA6IGdldFByZWRlY2Vzc29ycyhxdWV1ZS5yZW1vdmVGaXJzdCgpKSkgeworICAgICAgICBpZiAoISB2aXNpdGVkLmNvbnRhaW5zKG9iaikpIHsKKyAgICAgICAgICB2aXNpdGVkLmFkZChvYmopOworICAgICAgICAgIHF1ZXVlLmFkZExhc3Qob2JqKTsKKyAgICAgICAgICByZXN1bHQuYWRkRmlyc3Qob2JqKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbR3JhcGggIik7CisgICAgZm9yIChUIG5vZGUgOiBtX25vZGVzLmtleVNldCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGZpbmROb2RlKG5vZGUpKS5hcHBlbmQoIiAiKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKworICAvLy8vLworICAvLyBjbGFzcyBOb2RlCisgIC8vCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZTxUPiBpbXBsZW1lbnRzIENvbXBhcmFibGU8Tm9kZTxUPj4geworICAgIHByaXZhdGUgVCBtX29iamVjdCA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXA8VCwgVD4gbV9wcmVkZWNlc3NvcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgIHB1YmxpYyBOb2RlKFQgdG0pIHsKKyAgICAgIG1fb2JqZWN0ID0gdG07CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8Tm9kZTxUPj4gbV9uZWlnaGJvcnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgcHVibGljIHZvaWQgYWRkTmVpZ2hib3IoTm9kZTxUPiBuZWlnaGJvcikgeworICAgICAgbV9uZWlnaGJvcnMuYWRkKG5laWdoYm9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PE5vZGU8VD4+IGdldE5laWdoYm9ycygpIHsKKyAgICAgIHJldHVybiBtX25laWdoYm9yczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTm9kZTxUPiBjbG9uZSgpIHsKKyAgICAgIE5vZGU8VD4gcmVzdWx0ID0gbmV3IE5vZGU8PihtX29iamVjdCk7CisgICAgICBmb3IgKFQgcHJlZCA6IG1fcHJlZGVjZXNzb3JzLnZhbHVlcygpKSB7CisgICAgICAgIHJlc3VsdC5hZGRQcmVkZWNlc3NvcihwcmVkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFQgZ2V0T2JqZWN0KCkgeworICAgICAgcmV0dXJuIG1fb2JqZWN0OworICAgIH0KKworICAgIHB1YmxpYyBNYXA8VCwgVD4gZ2V0UHJlZGVjZXNzb3JzKCkgeworICAgICAgcmV0dXJuIG1fcHJlZGVjZXNzb3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcHJlZGVjZXNzb3Igd2FzIGZvdW5kIGFuZCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJlZGVjZXNzb3IoVCBvKSB7CisgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCisgICAgICBUIHByZWQgPSBtX3ByZWRlY2Vzc29ycy5nZXQobyk7CisgICAgICBpZiAobnVsbCAhPSBwcmVkKSB7CisgICAgICAgIHJlc3VsdCA9IG51bGwgIT0gbV9wcmVkZWNlc3NvcnMucmVtb3ZlKG8pOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgcHBwKCIgIFJFTU9WRUQgUFJFRCAiICsgbyArICIgRlJPTSBOT0RFICIgKyBtX29iamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHBwKCIgIEZBSUxFRCBUTyBSRU1PVkUgUFJFRCAiICsgbyArICIgRlJPTSBOT0RFICIgKyBtX29iamVjdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbTm9kZToiICsgbV9vYmplY3QpOworICAgICAgc2IuYXBwZW5kKCIgIHByZWQ6Iik7CisgICAgICBmb3IgKFQgbyA6IG1fcHJlZGVjZXNzb3JzLnZhbHVlcygpKSB7CisgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZChvKTsKKyAgICAgIH0KKyAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByZWRlY2Vzc29yKFQgdG0pIHsKKyAgICAgIHBwcCgiICBBRERJTkcgUFJFREVDRVNTT1IgRk9SICIgKyBtX29iamVjdCArICIgPT0+ICIgKyB0bSk7CisgICAgICBtX3ByZWRlY2Vzc29ycy5wdXQodG0sIHRtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVkZWNlc3NvcnMoKSB7CisgICAgICByZXR1cm4gbV9wcmVkZWNlc3NvcnMuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVkZWNlc3NvcihUIG0pIHsKKyAgICAgIHJldHVybiBtX3ByZWRlY2Vzc29ycy5jb250YWluc0tleShtKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhOb2RlPFQ+IG8pIHsKKyAgICAgIHJldHVybiBnZXRPYmplY3QoKS50b1N0cmluZygpLmNvbXBhcmVUbyhvLmdldE9iamVjdCgpLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lCc2guamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JQnNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkN2JhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JQnNoLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUJzaCB7CisgIGJvb2xlYW4gaW5jbHVkZU1ldGhvZEZyb21FeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBJVGVzdE5HTWV0aG9kIHRtKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyMjdiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuKjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb24geworICBJQW5ub3RhdGlvbkZpbmRlciBnZXRBbm5vdGF0aW9uRmluZGVyKCk7CisgIHZvaWQgc2V0QW5ub3RhdGlvbkZpbmRlcihJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpOworCisgIElUZXN0T2JqZWN0RmFjdG9yeSBnZXRPYmplY3RGYWN0b3J5KCk7CisgIHZvaWQgc2V0T2JqZWN0RmFjdG9yeShJVGVzdE9iamVjdEZhY3RvcnkgbV9vYmplY3RGYWN0b3J5KTsKKworICBJSG9va2FibGUgZ2V0SG9va2FibGUoKTsKKyAgdm9pZCBzZXRIb29rYWJsZShJSG9va2FibGUgaCk7CisKKyAgSUNvbmZpZ3VyYWJsZSBnZXRDb25maWd1cmFibGUoKTsKKyAgdm9pZCBzZXRDb25maWd1cmFibGUoSUNvbmZpZ3VyYWJsZSBjKTsKKworICBMaXN0PElFeGVjdXRpb25MaXN0ZW5lcj4gZ2V0RXhlY3V0aW9uTGlzdGVuZXJzKCk7CisgIHZvaWQgYWRkRXhlY3V0aW9uTGlzdGVuZXIoSUV4ZWN1dGlvbkxpc3RlbmVyIGwpOworCisgIExpc3Q8SUNvbmZpZ3VyYXRpb25MaXN0ZW5lcj4gZ2V0Q29uZmlndXJhdGlvbkxpc3RlbmVycygpOworICB2b2lkIGFkZENvbmZpZ3VyYXRpb25MaXN0ZW5lcihJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGNsKTsKKworICBMaXN0PElBbHRlclN1aXRlTGlzdGVuZXI+IGdldEFsdGVyU3VpdGVMaXN0ZW5lcnMoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JSW52b2tlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThjZGEyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gaW52b2tlci4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUludm9rZXIgeworCisgIC8qKgorICAgKiBJbnZva2UgY29uZmlndXJhdGlvbiBtZXRob2RzIGlmIHRoZXkgYmVsb25nIHRvIHRoZSBzYW1lIFRlc3RDbGFzcworICAgKiBwYXNzZWQgaW4gcGFyYW1ldGVyLi4KKyAgICoKKyAgICogVE9ETzogIENhbGN1bGF0ZSBhaGVhZCBvZiB0aW1lIHdoaWNoIG1ldGhvZHMgc2hvdWxkIGJlCisgICAqIGludm9rZWQgZm9yIGVhY2ggY2xhc3MuICAgTWlnaHQgc3BlZWQgdGhpbmdzIHVwIGZvciB1c2VycyB3aG8gaW52b2tlIHRoZSBzYW1lCisgICAqIHRlc3QgY2xhc3Mgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyBpbiB0aGUgc2FtZSBzdWl0ZSBydW4uCisgICAqCisgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgdGhlIGNsYXNzIHdob3NlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBtdXN0IGJlIHJ1bgorICAgKi8KKyAgcHVibGljICB2b2lkIGludm9rZUNvbmZpZ3VyYXRpb25zKElDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kW10gYWxsTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlKTsKKworICAvKioKKyAgICogSW52b2tlIHRoZSBnaXZlbiBtZXRob2QKKyAgICoKKyAgICogQHBhcmFtIHRlc3RNZXRob2QKKyAgICogQHBhcmFtIHN1aXRlCisgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAqIEBwYXJhbSBncm91cE1ldGhvZHMKKyAgICoKKyAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdCBtZXRob2RzIGludm9jYXRpb25zCisgICAqLworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gaW52b2tlVGVzdE1ldGhvZHMoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JUmVzdWx0TGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JUmVzdWx0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWVmMDAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lSZXN1bHRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TGlzdGVuZXI7DQorDQorDQorLyoqDQorICogQSBjb252ZW5pZW50IGludGVyZmFjZSB0byB1c2Ugd2hlbiBpbXBsZW1lbnRpbmcgbGlzdGVuZXJzLg0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4NCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIElSZXN1bHRMaXN0ZW5lciBleHRlbmRzIElUZXN0TGlzdGVuZXIsIElDb25maWd1cmF0aW9uTGlzdGVuZXIgew0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvSVJlc3VsdExpc3RlbmVyMi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lSZXN1bHRMaXN0ZW5lcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU5MjgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lSZXN1bHRMaXN0ZW5lcjIuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVJlc3VsdExpc3RlbmVyMiBleHRlbmRzIElSZXN1bHRMaXN0ZW5lciwgSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvSVRlc3RSZXN1bHROb3RpZmllci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lUZXN0UmVzdWx0Tm90aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMGViZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0lUZXN0UmVzdWx0Tm90aWZpZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCisvKioKKyAqIEFuIGludGVyZmFjZSBkZWZpbmluZyB0aGUgbm90aWZpY2F0aW9uIGZvciBAVGVzdCByZXN1bHRzIGFuZCBhbHNvCisgKiBcQENvbmZpZ3VyYXRpb24gcmVzdWx0cy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RSZXN1bHROb3RpZmllciB7CisKKyAgU2V0PElUZXN0UmVzdWx0PiBnZXRQYXNzZWRUZXN0cyhJVGVzdE5HTWV0aG9kIHRtKTsKKworICBTZXQ8SVRlc3RSZXN1bHQ+IGdldEZhaWxlZFRlc3RzKElUZXN0TkdNZXRob2QgdG0pOworCisgIFNldDxJVGVzdFJlc3VsdD4gZ2V0U2tpcHBlZFRlc3RzKElUZXN0TkdNZXRob2QgdG0pOworCisgIHZvaWQgYWRkUGFzc2VkVGVzdChJVGVzdE5HTWV0aG9kIHRtLCBJVGVzdFJlc3VsdCB0cik7CisKKyAgdm9pZCBhZGRTa2lwcGVkVGVzdChJVGVzdE5HTWV0aG9kIHRtLCBJVGVzdFJlc3VsdCB0cik7CisKKyAgdm9pZCBhZGRGYWlsZWRUZXN0KElUZXN0TkdNZXRob2QgdG0sIElUZXN0UmVzdWx0IHRyKTsKKworICB2b2lkIGFkZEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdChJVGVzdE5HTWV0aG9kIHRtLCBJVGVzdFJlc3VsdCB0cik7CisKKyAgdm9pZCBhZGRJbnZva2VkTWV0aG9kKEludm9rZWRNZXRob2QgaW0pOworCisgIFhtbFRlc3QgZ2V0VGVzdCgpOworCisgIExpc3Q8SVRlc3RMaXN0ZW5lcj4gZ2V0VGVzdExpc3RlbmVycygpOworCisgIExpc3Q8SUNvbmZpZ3VyYXRpb25MaXN0ZW5lcj4gZ2V0Q29uZmlndXJhdGlvbkxpc3RlbmVycygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0luc3RhbmNlSW5mby5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0luc3RhbmNlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3NGUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvSW5zdGFuY2VJbmZvLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW5zdGFuY2VJbmZvOworCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VJbmZvIGltcGxlbWVudHMgSUluc3RhbmNlSW5mbyB7CisgIHByaXZhdGUgQ2xhc3MgbV9pbnN0YW5jZUNsYXNzID0gbnVsbDsKKyAgcHJpdmF0ZSBPYmplY3QgbV9pbnN0YW5jZSA9IG51bGw7CisKKyAgcHVibGljIEluc3RhbmNlSW5mbyhDbGFzcyBjbHMsIE9iamVjdCBpbnN0YW5jZSkgeworICAgIG1faW5zdGFuY2VDbGFzcyA9IGNsczsKKyAgICBtX2luc3RhbmNlID0gaW5zdGFuY2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gbV9pbnN0YW5jZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3MgZ2V0SW5zdGFuY2VDbGFzcygpIHsKKyAgICByZXR1cm4gbV9pbnN0YW5jZUNsYXNzOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JbnZva2VNZXRob2RSdW5uYWJsZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ludm9rZU1ldGhvZFJ1bm5hYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzZjFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9JbnZva2VNZXRob2RSdW5uYWJsZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUhvb2thYmxlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEEgUnVubmFibGUgTWV0aG9kIGludm9rZXIuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8+dGhlX21pbmRzdG9ybTwvYT4KKyAqLworcHVibGljIGNsYXNzIEludm9rZU1ldGhvZFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICBwcml2YXRlIElUZXN0TkdNZXRob2QgbV9tZXRob2QgPSBudWxsOworICBwcml2YXRlIE9iamVjdCBtX2luc3RhbmNlID0gbnVsbDsKKyAgcHJpdmF0ZSBPYmplY3RbXSBtX3BhcmFtZXRlcnMgPSBudWxsOworICBwcml2YXRlIGZpbmFsIElIb29rYWJsZSBtX2hvb2thYmxlOworICBwcml2YXRlIGZpbmFsIElUZXN0UmVzdWx0IG1fdGVzdFJlc3VsdDsKKworICBwdWJsaWMgSW52b2tlTWV0aG9kUnVubmFibGUoSVRlc3ROR01ldGhvZCB0aGlzTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIb29rYWJsZSBob29rYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpCisgIHsKKyAgICBtX21ldGhvZCA9IHRoaXNNZXRob2Q7CisgICAgbV9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgbV9ob29rYWJsZSA9IGhvb2thYmxlOworICAgIG1fdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIFRlc3ROR1J1bnRpbWVFeGNlcHRpb24geworICAgIC8vIElmIHRoZXJlIGlzIGFuIGludm9jYXRpb24gdGltZSBvdXQsIGFsbCB0aGUgaW52b2NhdGlvbnMgbmVlZCB0byBiZSBkb25lIHdpdGhpbiB0aGlzCisgICAgLy8gUnVubmFibGUKKyAgICBpZiAobV9tZXRob2QuZ2V0SW52b2NhdGlvblRpbWVPdXQoKSA+IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9tZXRob2QuZ2V0SW52b2NhdGlvbkNvdW50KCk7IGkrKykgeworICAgICAgICBydW5PbmUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBydW5PbmUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuT25lKCkgeworICAgIHRyeSB7CisgICAgICBSdW50aW1lRXhjZXB0aW9uIHQgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgTWV0aG9kIG0gPSBtX21ldGhvZC5nZXRNZXRob2QoKTsKKyAgICAgICAgaWYgKG1faG9va2FibGUgPT0gbnVsbCkgeworICAgICAgICAgIE1ldGhvZEludm9jYXRpb25IZWxwZXIuaW52b2tlTWV0aG9kKG0sIG1faW5zdGFuY2UsIG1fcGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTWV0aG9kSW52b2NhdGlvbkhlbHBlci5pbnZva2VIb29rYWJsZShtX2luc3RhbmNlLCBtX3BhcmFtZXRlcnMsIG1faG9va2FibGUsIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rlc3RSZXN1bHQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjYXRjaChUaHJvd2FibGUgZSkgeworICAgICAgICB0ID0gbmV3IFRlc3ROR1J1bnRpbWVFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmKG51bGwgIT0gdCkgeworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICB0aHJvdyB0OworICAgICAgfQorICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgIG1fbWV0aG9kLmluY3JlbWVudEN1cnJlbnRJbnZvY2F0aW9uQ291bnQoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3ROR1J1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NjE5ODk5MjcwNzg1NTk2MjMxTDsKKworICAgIHB1YmxpYyBUZXN0TkdSdW50aW1lRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKKyAgICAgIHN1cGVyKHJvb3RDYXVzZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvSW52b2tlZE1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ludm9rZWRNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjBhOGNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ludm9rZWRNZXRob2QuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBJbnZva2VkTWV0aG9kIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBJSW52b2tlZE1ldGhvZCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxMjYxMjcxOTQxMDI4MTkyMjJMOworICB0cmFuc2llbnQgcHJpdmF0ZSBPYmplY3QgbV9pbnN0YW5jZTsKKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kIG1fdGVzdE1ldGhvZDsKKyAgcHJpdmF0ZSBPYmplY3RbXSBtX3BhcmFtZXRlcnM7CisgIHByaXZhdGUgbG9uZyBtX2RhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgcHJpdmF0ZSBJVGVzdFJlc3VsdCBtX3Rlc3RSZXN1bHQ7CisKKyAgcHVibGljIEludm9rZWRNZXRob2QoT2JqZWN0IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgbV9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIG1fdGVzdE1ldGhvZCA9IG1ldGhvZDsKKyAgICBtX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgIG1fZGF0ZSA9IGRhdGU7CisgICAgbV90ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdDsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcudGVzdG5nLmludGVybmFsLklJbnZva2VkTWV0aG9kI2lzVGVzdE1ldGhvZCgpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNUZXN0TWV0aG9kKCkgeworICAgIHJldHVybiBtX3Rlc3RNZXRob2QuaXNUZXN0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihtX3Rlc3RNZXRob2QudG9TdHJpbmcoKSk7CisgICAgZm9yIChPYmplY3QgcCA6IG1fcGFyYW1ldGVycykgeworICAgICAgcmVzdWx0LmFwcGVuZChwKS5hcHBlbmQoIiAiKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiICIpLmFwcGVuZChtX2luc3RhbmNlICE9IG51bGwgPyBtX2luc3RhbmNlLmhhc2hDb2RlKCkgOiAiIDxzdGF0aWM+Iik7CisKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnRlc3RuZy5pbnRlcm5hbC5JSW52b2tlZE1ldGhvZCNpc0NvbmZpZ3VyYXRpb25NZXRob2QoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJhdGlvbk1ldGhvZCgpIHsKKyAgICByZXR1cm4gbV90ZXN0TWV0aG9kLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpIHx8CisgICAgICAgICAgIG1fdGVzdE1ldGhvZC5pc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpIHx8CisgICAgICAgICAgIG1fdGVzdE1ldGhvZC5pc0JlZm9yZVRlc3RDb25maWd1cmF0aW9uKCkgfHwKKyAgICAgICAgICAgbV90ZXN0TWV0aG9kLmlzQWZ0ZXJUZXN0Q29uZmlndXJhdGlvbigpIHx8CisgICAgICAgICAgIG1fdGVzdE1ldGhvZC5pc0JlZm9yZUNsYXNzQ29uZmlndXJhdGlvbigpIHx8CisgICAgICAgICAgIG1fdGVzdE1ldGhvZC5pc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uKCkgfHwKKyAgICAgICAgICAgbV90ZXN0TWV0aG9kLmlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkgfHwKKyAgICAgICAgICAgbV90ZXN0TWV0aG9kLmlzQWZ0ZXJTdWl0ZUNvbmZpZ3VyYXRpb24oKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcudGVzdG5nLmludGVybmFsLklJbnZva2VkTWV0aG9kI2dldFRlc3RNZXRob2QoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kIGdldFRlc3RNZXRob2QoKSB7CisgICAgcmV0dXJuIG1fdGVzdE1ldGhvZDsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcudGVzdG5nLmludGVybmFsLklJbnZva2VkTWV0aG9kI2dldERhdGUoKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldERhdGUoKSB7CisgICAgcmV0dXJuIG1fZGF0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3RSZXN1bHQgZ2V0VGVzdFJlc3VsdCgpIHsKKyAgICByZXR1cm4gbV90ZXN0UmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvSW52b2tlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDA3M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL0ludm9rZXIuamF2YQpAQCAtMCwwICsxLDE3MzggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLklDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLklDbGFzc0xpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSUNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklSZXRyeUFuYWx5emVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlNraXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5TdWl0ZVJ1blN0YXRlOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLk5vSW5qZWN0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuU2V0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkludm9rZU1ldGhvZFJ1bm5hYmxlLlRlc3ROR1J1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5QYXJhbWV0ZXJIb2xkZXIuUGFyYW1ldGVyT3JpZ2luOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuaW52b2tlcnMuSW52b2tlZE1ldGhvZExpc3RlbmVySW52b2tlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmludm9rZXJzLkludm9rZWRNZXRob2RMaXN0ZW5lck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5UaHJlYWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuVGhyZWFkVXRpbDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5ncmFwaC5JV29ya2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2Vycy5JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuQUZURVJfSU5WT0NBVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2Vycy5JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuQkVGT1JFX0lOVk9DQVRJT047CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgbWV0aG9kczoKKyAqIC0gdGVzdCBtZXRob2RzCisgKiAtIGNvbmZpZ3VyYXRpb24gbWV0aG9kcworICogLSBwb3NzaWJseSBpbiBhIHNlcGFyYXRlIHRocmVhZAorICogYW5kIHRoZW4gZm9yIG5vdGlmeWluZyB0aGUgcmVzdWx0IGxpc3RlbmVycy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBJbnZva2VyIGltcGxlbWVudHMgSUludm9rZXIgeworICBwcml2YXRlIGZpbmFsIElUZXN0Q29udGV4dCBtX3Rlc3RDb250ZXh0OworICBwcml2YXRlIGZpbmFsIElUZXN0UmVzdWx0Tm90aWZpZXIgbV9ub3RpZmllcjsKKyAgcHJpdmF0ZSBmaW5hbCBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXI7CisgIHByaXZhdGUgZmluYWwgU3VpdGVSdW5TdGF0ZSBtX3N1aXRlU3RhdGU7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbV9jb250aW51ZU9uRmFpbGVkQ29uZmlndXJhdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PElDbGFzc0xpc3RlbmVyPiBtX2NsYXNzTGlzdGVuZXJzOworCisgIC8qKiBHcm91cCBmYWlsdXJlcyBtdXN0IGJlIHN5bmNlZCBhcyB0aGUgSW52b2tlciBpcyBhY2Nlc3NlZCBjb25jdXJyZW50bHkgKi8KKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBCb29sZWFuPiBtX2JlZm9yZWdyb3Vwc0ZhaWx1cmVzID0gTWFwcy5uZXdIYXNodGFibGUoKTsKKworICAvKiogQ2xhc3MgZmFpbHVyZXMgbXVzdCBiZSBzeW5jZWQgYXMgdGhlIEludm9rZXIgaXMgYWNjZXNzZWQgY29uY3VycmVudGx5ICovCisgIHByaXZhdGUgTWFwPENsYXNzPD8+LCBTZXQ8T2JqZWN0Pj4gbV9jbGFzc0ludm9jYXRpb25SZXN1bHRzID0gTWFwcy5uZXdIYXNodGFibGUoKTsKKworICAvKiogVGVzdCBtZXRob2RzIHdob3NlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBoYXZlIGZhaWxlZC4gKi8KKyAgcHJpdmF0ZSBNYXA8SVRlc3ROR01ldGhvZCwgU2V0PE9iamVjdD4+IG1fbWV0aG9kSW52b2NhdGlvblJlc3VsdHMgPSBNYXBzLm5ld0hhc2h0YWJsZSgpOworICBwcml2YXRlIElDb25maWd1cmF0aW9uIG1fY29uZmlndXJhdGlvbjsKKworICAvKiogUHJlZGljYXRlIHRvIGZpbHRlciBtZXRob2RzICovCisgIHByaXZhdGUgc3RhdGljIFByZWRpY2F0ZTxJVGVzdE5HTWV0aG9kLCBJQ2xhc3M+IENBTl9SVU5fRlJPTV9DTEFTUyA9IG5ldyBDYW5SdW5Gcm9tQ2xhc3NQcmVkaWNhdGUoKTsKKyAgLyoqIFByZWRpY2F0ZSB0byBmaWx0ZXIgbWV0aG9kcyAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8SVRlc3ROR01ldGhvZCwgSUNsYXNzPiBTQU1FX0NMQVNTID0gbmV3IFNhbWVDbGFzc05hbWVQcmVkaWNhdGUoKTsKKworICBwcml2YXRlIHZvaWQgc2V0Q2xhc3NJbnZvY2F0aW9uRmFpbHVyZShDbGFzczw/PiBjbGF6eiwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgU2V0PE9iamVjdD4gaW5zdGFuY2VzID0gbV9jbGFzc0ludm9jYXRpb25SZXN1bHRzLmdldCggY2xhenogKTsKKyAgICBpZiAoaW5zdGFuY2VzID09IG51bGwpIHsKKyAgICAgIGluc3RhbmNlcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgbV9jbGFzc0ludm9jYXRpb25SZXN1bHRzLnB1dChjbGF6eiwgaW5zdGFuY2VzKTsKKyAgICB9CisgICAgaW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0TWV0aG9kSW52b2NhdGlvbkZhaWx1cmUoSVRlc3ROR01ldGhvZCBtZXRob2QsIE9iamVjdCBpbnN0YW5jZSkgeworICAgIFNldDxPYmplY3Q+IGluc3RhbmNlcyA9IG1fbWV0aG9kSW52b2NhdGlvblJlc3VsdHMuZ2V0KG1ldGhvZCk7CisgICAgaWYgKGluc3RhbmNlcyA9PSBudWxsKSB7CisgICAgICBpbnN0YW5jZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIG1fbWV0aG9kSW52b2NhdGlvblJlc3VsdHMucHV0KG1ldGhvZCwgaW5zdGFuY2VzKTsKKyAgICB9CisgICAgaW5zdGFuY2VzLmFkZChnZXRNZXRob2RJbnZvY2F0aW9uVG9rZW4obWV0aG9kLCBpbnN0YW5jZSkpOworICB9CisKKyAgcHVibGljIEludm9rZXIoSUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdE5vdGlmaWVyIG5vdGlmaWVyLAorICAgICAgICAgICAgICAgICBTdWl0ZVJ1blN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICBib29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzLAorICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IGludm9rZWRNZXRob2RMaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKSB7CisgICAgbV9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICBtX3Rlc3RDb250ZXh0PSB0ZXN0Q29udGV4dDsKKyAgICBtX3N1aXRlU3RhdGU9IHN0YXRlOworICAgIG1fbm90aWZpZXI9IG5vdGlmaWVyOworICAgIG1fYW5ub3RhdGlvbkZpbmRlcj0gY29uZmlndXJhdGlvbi5nZXRBbm5vdGF0aW9uRmluZGVyKCk7CisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICAgIG1faW52b2tlZE1ldGhvZExpc3RlbmVycyA9IGludm9rZWRNZXRob2RMaXN0ZW5lcnM7CisgICAgbV9jb250aW51ZU9uRmFpbGVkQ29uZmlndXJhdGlvbiA9IFhtbFN1aXRlLkNPTlRJTlVFLmVxdWFscyh0ZXN0Q29udGV4dC5nZXRTdWl0ZSgpLmdldFhtbFN1aXRlKCkuZ2V0Q29uZmlnRmFpbHVyZVBvbGljeSgpKTsKKyAgICBtX2NsYXNzTGlzdGVuZXJzID0gY2xhc3NMaXN0ZW5lcnM7CisgIH0KKworICAvKioKKyAgICogSW52b2tlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBUZXN0Q2xhc3MgcGFzc2VkCisgICAqIGluIHBhcmFtZXRlci4uIDxwLz5UT0RPOiBDYWxjdWxhdGUgYWhlYWQgb2YgdGltZSB3aGljaCBtZXRob2RzIHNob3VsZCBiZQorICAgKiBpbnZva2VkIGZvciBlYWNoIGNsYXNzLiBNaWdodCBzcGVlZCB0aGluZ3MgdXAgZm9yIHVzZXJzIHdobyBpbnZva2UgdGhlCisgICAqIHNhbWUgdGVzdCBjbGFzcyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGluIHRoZSBzYW1lIHN1aXRlIHJ1bi4KKyAgICoKKyAgICogSWYgaW5zdGFuY2UgaXMgbm9uLW51bGwsIHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgcnVuIG9uIGl0LiAgSWYgaXQgaXMgbnVsbCwKKyAgICogdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyB3aWxsIGJlIHJ1biBvbiBhbGwgdGhlIGluc3RhbmNlcyByZXRyaWV2ZWQKKyAgICogZnJvbSB0aGUgSVRlc3RDbGFzcy4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbnZva2VDb25maWd1cmF0aW9ucyhJQ2xhc3MgdGVzdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kW10gYWxsTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSkKKyAgeworICAgIGludm9rZUNvbmZpZ3VyYXRpb25zKHRlc3RDbGFzcywgbnVsbCwgYWxsTWV0aG9kcywgc3VpdGUsIHBhcmFtcywgcGFyYW1ldGVyVmFsdWVzLCBpbnN0YW5jZSwKKyAgICAgICAgbnVsbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW52b2tlQ29uZmlndXJhdGlvbnMoSUNsYXNzIHRlc3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZCBjdXJyZW50VGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZFtdIGFsbE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0UmVzdWx0IHRlc3RNZXRob2RSZXN1bHQpCisgIHsKKyAgICBpZihudWxsID09IGFsbE1ldGhvZHMpIHsKKyAgICAgIGxvZyg1LCAiTm8gY29uZmlndXJhdGlvbiBtZXRob2RzIGZvdW5kIik7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcz0gZmlsdGVyTWV0aG9kcyh0ZXN0Q2xhc3MsIGFsbE1ldGhvZHMsIFNBTUVfQ0xBU1MpOworCisgICAgZm9yKElUZXN0TkdNZXRob2QgdG0gOiBtZXRob2RzKSB7CisgICAgICBpZihudWxsID09IHRlc3RDbGFzcykgeworICAgICAgICB0ZXN0Q2xhc3M9IHRtLmdldFRlc3RDbGFzcygpOworICAgICAgfQorCisgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0PSBuZXcgVGVzdFJlc3VsdCh0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rlc3RDb250ZXh0KTsKKworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgT2JqZWN0IGluc3QgPSB0bS5nZXRJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW5zdCA9PSBudWxsKSB7CisgICAgICAgICAgaW5zdCA9IGluc3RhbmNlOworICAgICAgICB9CisgICAgICAgIENsYXNzPD8+IG9iamVjdENsYXNzPSBpbnN0LmdldENsYXNzKCk7CisgICAgICAgIE1ldGhvZCBtZXRob2Q9IHRtLmdldE1ldGhvZCgpOworCisgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBjb25maWd1cmF0aW9uIGlmCisgICAgICAgIC8vIC0gdGhlIHRlc3QgaXMgZW5hYmxlZCBhbmQKKyAgICAgICAgLy8gLSB0aGUgQ29uZmlndXJhdGlvbiBtZXRob2QgYmVsb25ncyB0byB0aGUgc2FtZSBjbGFzcyBvciBhIHBhcmVudAorICAgICAgICBjb25maWd1cmF0aW9uQW5ub3RhdGlvbiA9IEFubm90YXRpb25IZWxwZXIuZmluZENvbmZpZ3VyYXRpb24obV9hbm5vdGF0aW9uRmluZGVyLCBtZXRob2QpOworICAgICAgICBib29sZWFuIGFsd2F5c1J1bj0gaXNBbHdheXNSdW4oY29uZmlndXJhdGlvbkFubm90YXRpb24pOworICAgICAgICBpZihNZXRob2RIZWxwZXIuaXNFbmFibGVkKG9iamVjdENsYXNzLCBtX2Fubm90YXRpb25GaW5kZXIpIHx8IGFsd2F5c1J1bikgeworCisgICAgICAgICAgaWYgKE1ldGhvZEhlbHBlci5pc0VuYWJsZWQoY29uZmlndXJhdGlvbkFubm90YXRpb24pKSB7CisKKyAgICAgICAgICAgIGlmICghY29uZkludm9jYXRpb25QYXNzZWQodG0sIGN1cnJlbnRUZXN0TWV0aG9kLCB0ZXN0Q2xhc3MsIGluc3RhbmNlKSAmJiAhYWx3YXlzUnVuKSB7CisgICAgICAgICAgICAgIGhhbmRsZUNvbmZpZ3VyYXRpb25Ta2lwKHRtLCB0ZXN0UmVzdWx0LCBjb25maWd1cmF0aW9uQW5ub3RhdGlvbiwgY3VycmVudFRlc3RNZXRob2QsIGluc3RhbmNlLCBzdWl0ZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coMywgIkludm9raW5nICIgKyBVdGlscy5kZXRhaWxlZE1ldGhvZE5hbWUodG0sIHRydWUpKTsKKworICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMuY3JlYXRlQ29uZmlndXJhdGlvblBhcmFtZXRlcnModG0uZ2V0TWV0aG9kKCksCisgICAgICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcywKKyAgICAgICAgICAgICAgICBjdXJyZW50VGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgc3VpdGUsCisgICAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kUmVzdWx0KTsKKyAgICAgICAgICAgIHRlc3RSZXN1bHQuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKworICAgICAgICAgICAgT2JqZWN0IG5ld0luc3RhbmNlID0gbnVsbCAhPSBpbnN0YW5jZSA/IGluc3RhbmNlOiBpbnN0OworCisgICAgICAgICAgICBydW5Db25maWd1cmF0aW9uTGlzdGVuZXJzKHRlc3RSZXN1bHQsIHRydWUgLyogYmVmb3JlICovKTsKKworICAgICAgICAgICAgaW52b2tlQ29uZmlndXJhdGlvbk1ldGhvZChuZXdJbnN0YW5jZSwgdG0sCisgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIHRlc3RSZXN1bHQpOworCisgICAgICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSB3ZSBzaG91bGQgdHJpZ2dlciB0aGUgZXZlbnQgZm9yIGVhY2ggaW5zdGFuY2U/Pz8KKyAgICAgICAgICAgIHRlc3RSZXN1bHQuc2V0RW5kTWlsbGlzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIHJ1bkNvbmZpZ3VyYXRpb25MaXN0ZW5lcnModGVzdFJlc3VsdCwgZmFsc2UgLyogYWZ0ZXIgKi8pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvZygzLAorICAgICAgICAgICAgICAgICJTa2lwcGluZyAiCisgICAgICAgICAgICAgICAgKyBVdGlscy5kZXRhaWxlZE1ldGhvZE5hbWUodG0sIHRydWUpCisgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgaXQgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gLy8gaWYgaXMgZW5hYmxlZAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBsb2coMywKKyAgICAgICAgICAgICAgIlNraXBwaW5nICIKKyAgICAgICAgICAgICAgKyBVdGlscy5kZXRhaWxlZE1ldGhvZE5hbWUodG0sIHRydWUpCisgICAgICAgICAgICAgICsgIiBiZWNhdXNlICIKKyAgICAgICAgICAgICAgKyBvYmplY3RDbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgKyAiIGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgaGFuZGxlQ29uZmlndXJhdGlvbkZhaWx1cmUoZXgsIHRtLCB0ZXN0UmVzdWx0LCBjb25maWd1cmF0aW9uQW5ub3RhdGlvbiwgY3VycmVudFRlc3RNZXRob2QsIGluc3RhbmNlLCBzdWl0ZSk7CisgICAgICB9IGNhdGNoKFRocm93YWJsZSBleCkgeyAvLyBjb3ZlcnMgdGhlIG5vbi13cmFwcGVyIGV4Y2VwdGlvbnMKKyAgICAgICAgaGFuZGxlQ29uZmlndXJhdGlvbkZhaWx1cmUoZXgsIHRtLCB0ZXN0UmVzdWx0LCBjb25maWd1cmF0aW9uQW5ub3RhdGlvbiwgY3VycmVudFRlc3RNZXRob2QsIGluc3RhbmNlLCBzdWl0ZSk7CisgICAgICB9CisgICAgfSAvLyBmb3IgbWV0aG9kcworICB9CisKKyAgLyoqCisgICAqIE1hcmtzIHRoZSBjdXJyZW50IDxjb2RlPlRlc3RSZXN1bHQ8L2NvZGU+IGFzIHNraXBwZWQgYW5kIGludm9rZXMgdGhlIGxpc3RlbmVycy4KKyAgICovCisgIHByaXZhdGUgdm9pZCBoYW5kbGVDb25maWd1cmF0aW9uU2tpcChJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZCBjdXJyZW50VGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlKSB7CisgICAgcmVjb3JkQ29uZmlndXJhdGlvbkludm9jYXRpb25GYWlsZWQodG0sIHRlc3RSZXN1bHQuZ2V0VGVzdENsYXNzKCksIGFubm90YXRpb24sIGN1cnJlbnRUZXN0TWV0aG9kLCBpbnN0YW5jZSwgc3VpdGUpOworICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LlNLSVApOworICAgIHJ1bkNvbmZpZ3VyYXRpb25MaXN0ZW5lcnModGVzdFJlc3VsdCwgZmFsc2UgLyogYWZ0ZXIgKi8pOworICB9CisKKyAgLyoqCisgICAqIElzIHRoZSA8Y29kZT5JQ29uZmlndXJhdGlvbjwvY29kZT4gbWFya2VkIGFzIGFsd2F5c1J1bi4KKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBpc0Fsd2F5c1J1bihJQ29uZmlndXJhdGlvbkFubm90YXRpb24gY29uZmlndXJhdGlvbkFubm90YXRpb24pIHsKKyAgICBpZihudWxsID09IGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBhbHdheXNSdW49IGZhbHNlOworICAgIGlmICgoY29uZmlndXJhdGlvbkFubm90YXRpb24uZ2V0QWZ0ZXJTdWl0ZSgpCisgICAgICAgIHx8IGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmdldEFmdGVyVGVzdCgpCisgICAgICAgIHx8IGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmdldEFmdGVyVGVzdENsYXNzKCkKKyAgICAgICAgfHwgY29uZmlndXJhdGlvbkFubm90YXRpb24uZ2V0QWZ0ZXJUZXN0TWV0aG9kKCkKKyAgICAgICAgfHwgY29uZmlndXJhdGlvbkFubm90YXRpb24uZ2V0QmVmb3JlVGVzdE1ldGhvZCgpCisgICAgICAgIHx8IGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmdldEJlZm9yZVRlc3RDbGFzcygpCisgICAgICAgIHx8IGNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmdldEJlZm9yZVRlc3QoKQorICAgICAgICB8fCBjb25maWd1cmF0aW9uQW5ub3RhdGlvbi5nZXRCZWZvcmVTdWl0ZSgpKQorICAgICAgICAmJiBjb25maWd1cmF0aW9uQW5ub3RhdGlvbi5nZXRBbHdheXNSdW4oKSkKKyAgICB7CisgICAgICAgIGFsd2F5c1J1bj0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gYWx3YXlzUnVuOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbmZpZ3VyYXRpb25GYWlsdXJlKFRocm93YWJsZSBpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZCBjdXJyZW50VGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlKQorICB7CisgICAgVGhyb3dhYmxlIGNhdXNlPSBpdGUuZ2V0Q2F1c2UoKSAhPSBudWxsID8gaXRlLmdldENhdXNlKCkgOiBpdGU7CisKKyAgICBpZihpc1NraXBFeGNlcHRpb25BbmRTa2lwKGNhdXNlKSkgeworICAgICAgdGVzdFJlc3VsdC5zZXRUaHJvd2FibGUoY2F1c2UpOworICAgICAgaGFuZGxlQ29uZmlndXJhdGlvblNraXAodG0sIHRlc3RSZXN1bHQsIGFubm90YXRpb24sIGN1cnJlbnRUZXN0TWV0aG9kLCBpbnN0YW5jZSwgc3VpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBVdGlscy5sb2coIiIsIDMsICJGYWlsZWQgdG8gaW52b2tlIGNvbmZpZ3VyYXRpb24gbWV0aG9kICIKKyAgICAgICAgKyB0bS5nZXRSZWFsQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyB0bS5nZXRNZXRob2ROYW1lKCkgKyAiOiIgKyBjYXVzZS5nZXRNZXNzYWdlKCkpOworICAgIGhhbmRsZUV4Y2VwdGlvbihjYXVzZSwgdG0sIHRlc3RSZXN1bHQsIDEpOworICAgIHJ1bkNvbmZpZ3VyYXRpb25MaXN0ZW5lcnModGVzdFJlc3VsdCwgZmFsc2UgLyogYWZ0ZXIgKi8pOworCisgICAgLy8KKyAgICAvLyBJZiBpbiBUZXN0TkcgbW9kZSwgbmVlZCB0byB0YWtlIGEgbG9vayBhdCB0aGUgYW5ub3RhdGlvbiB0byBmaWd1cmUgb3V0CisgICAgLy8gd2hhdCBraW5kIG9mIEBDb25maWd1cmF0aW9uIG1ldGhvZCB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAgICAvLworICAgIGlmIChudWxsICE9IGFubm90YXRpb24pIHsKKyAgICAgIHJlY29yZENvbmZpZ3VyYXRpb25JbnZvY2F0aW9uRmFpbGVkKHRtLCB0ZXN0UmVzdWx0LmdldFRlc3RDbGFzcygpLCBhbm5vdGF0aW9uLCBjdXJyZW50VGVzdE1ldGhvZCwgaW5zdGFuY2UsIHN1aXRlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBBbGwgdGhlIGNsYXNzZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgPHRlc3Q+IHRhZyBhcyBAcGFyYW0gY2xzCisgICAqLworICBwcml2YXRlIFhtbENsYXNzW10gZmluZENsYXNzZXNJblNhbWVUZXN0KENsYXNzPD8+IGNscywgWG1sU3VpdGUgc3VpdGUpIHsKKyAgICBNYXA8U3RyaW5nLCBYbWxDbGFzcz4gdlJlc3VsdD0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgU3RyaW5nIGNsYXNzTmFtZT0gY2xzLmdldE5hbWUoKTsKKyAgICBmb3IoWG1sVGVzdCB0ZXN0IDogc3VpdGUuZ2V0VGVzdHMoKSkgeworICAgICAgZm9yKFhtbENsYXNzIHRlc3RDbGFzcyA6IHRlc3QuZ2V0WG1sQ2xhc3NlcygpKSB7CisgICAgICAgIGlmKHRlc3RDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKKworICAgICAgICAgIC8vIEZvdW5kIGl0LCBhZGQgYWxsIHRoZSBjbGFzc2VzIGluIHRoaXMgdGVzdCBpbiB0aGUgcmVzdWx0CisgICAgICAgICAgZm9yKFhtbENsYXNzIHRoaXNDbGFzcyA6IHRlc3QuZ2V0WG1sQ2xhc3NlcygpKSB7CisgICAgICAgICAgICB2UmVzdWx0LnB1dCh0aGlzQ2xhc3MuZ2V0TmFtZSgpLCB0aGlzQ2xhc3MpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBOb3RlOiAgd2UgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGVudGlyZSBzdWl0ZSBzaW5jZSB0aGUgc2FtZQorICAgICAgICAgIC8vIGNsYXNzIG1pZ2h0IGFwcGVhciBpbiBzZXZlcmFsIDx0ZXN0PiB0YWdzCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBYbWxDbGFzc1tdIHJlc3VsdD0gdlJlc3VsdC52YWx1ZXMoKS50b0FycmF5KG5ldyBYbWxDbGFzc1t2UmVzdWx0LnNpemUoKV0pOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmQgaW50ZXJuYWxseSB0aGUgZmFpbHVyZSBvZiBhIENvbmZpZ3VyYXRpb24sIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZQorICAgKiBsYXRlciBpZiBAVGVzdCBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCByZWNvcmRDb25maWd1cmF0aW9uSW52b2NhdGlvbkZhaWxlZChJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNsYXNzIHRlc3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZCBjdXJyZW50VGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlKSB7CisgICAgLy8gSWYgYmVmb3JlVGVzdENsYXNzIG9yIGFmdGVyVGVzdENsYXNzIGZhaWxlZCwgbWFyayBlaXRoZXIgdGhlIGNvbmZpZyBtZXRob2QncworICAgIC8vIGVudGlyZSBjbGFzcyBhcyBmYWlsZWQsIG9yIHRoZSBjbGFzcyB1bmRlciB0ZXN0cyBhcyBmYWlsZWQsIGRlcGVuZGluZyBvbgorICAgIC8vIHRoZSBjb25maWd1cmF0aW9uIGZhaWx1cmUgcG9saWN5CisgICAgaWYgKGFubm90YXRpb24uZ2V0QmVmb3JlVGVzdENsYXNzKCkgfHwgYW5ub3RhdGlvbi5nZXRBZnRlclRlc3RDbGFzcygpKSB7CisgICAgICAvLyB0bSBpcyB0aGUgY29uZmlndXJhdGlvbiBtZXRob2QsIGFuZCBjdXJyZW50VGVzdE1ldGhvZCBpcyBudWxsIGZvciBCZWZvcmVDbGFzcworICAgICAgLy8gbWV0aG9kcywgc28gd2UgbmVlZCB0ZXN0Q2xhc3MKKyAgICAgIGlmIChtX2NvbnRpbnVlT25GYWlsZWRDb25maWd1cmF0aW9uKSB7CisgICAgICAgIHNldENsYXNzSW52b2NhdGlvbkZhaWx1cmUodGVzdENsYXNzLmdldFJlYWxDbGFzcygpLCBpbnN0YW5jZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRDbGFzc0ludm9jYXRpb25GYWlsdXJlKHRtLmdldFJlYWxDbGFzcygpLCBpbnN0YW5jZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgYmVmb3JlL2FmdGVyVGVzdE1ldGhvZCBmYWlsZWQsIG1hcmsgZWl0aGVyIHRoZSBjb25maWcgbWV0aG9kJ3MgZW50aXJlCisgICAgLy8gY2xhc3MgYXMgZmFpbGVkLCBvciBqdXN0IHRoZSBjdXJyZW50IHRlc3QgbWV0aG9kIGFzIGZhaWxlZCwgZGVwZW5kaW5nIG9uCisgICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBwb2xpY3kKKyAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmdldEJlZm9yZVRlc3RNZXRob2QoKSB8fCBhbm5vdGF0aW9uLmdldEFmdGVyVGVzdE1ldGhvZCgpKSB7CisgICAgICBpZiAobV9jb250aW51ZU9uRmFpbGVkQ29uZmlndXJhdGlvbikgeworICAgICAgICBzZXRNZXRob2RJbnZvY2F0aW9uRmFpbHVyZShjdXJyZW50VGVzdE1ldGhvZCwgaW5zdGFuY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0Q2xhc3NJbnZvY2F0aW9uRmFpbHVyZSh0bS5nZXRSZWFsQ2xhc3MoKSwgaW5zdGFuY2UpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIGJlZm9yZVN1aXRlIG9yIGFmdGVyU3VpdGUgZmFpbGVkLCBtYXJrICphbGwqIHRoZSBjbGFzc2VzIGFzIGZhaWxlZAorICAgIC8vIGZvciBjb25maWd1cmF0aW9ucy4gIEF0IHRoaXMgcG9pbnQsIHRoZSBlbnRpcmUgU3VpdGUgaXMgc2NyZXdlZAorICAgIGVsc2UgaWYgKGFubm90YXRpb24uZ2V0QmVmb3JlU3VpdGUoKSB8fCBhbm5vdGF0aW9uLmdldEFmdGVyU3VpdGUoKSkgeworICAgICAgbV9zdWl0ZVN0YXRlLmZhaWxlZCgpOworICAgIH0KKworICAgIC8vIGJlZm9yZVRlc3Qgb3IgYWZ0ZXJUZXN0OiAgbWFyayBhbGwgdGhlIGNsYXNzZXMgaW4gdGhlIHNhbWUKKyAgICAvLyA8dGVzdD4gc3RhbnphIGFzIGZhaWxlZCBmb3IgY29uZmlndXJhdGlvbgorICAgIGVsc2UgaWYgKGFubm90YXRpb24uZ2V0QmVmb3JlVGVzdCgpIHx8IGFubm90YXRpb24uZ2V0QWZ0ZXJUZXN0KCkpIHsKKyAgICAgIHNldENsYXNzSW52b2NhdGlvbkZhaWx1cmUodG0uZ2V0UmVhbENsYXNzKCksIGluc3RhbmNlKTsKKyAgICAgIFhtbENsYXNzW10gY2xhc3Nlcz0gZmluZENsYXNzZXNJblNhbWVUZXN0KHRtLmdldFJlYWxDbGFzcygpLCBzdWl0ZSk7CisgICAgICBmb3IoWG1sQ2xhc3MgeG1sQ2xhc3MgOiBjbGFzc2VzKSB7CisgICAgICAgIHNldENsYXNzSW52b2NhdGlvbkZhaWx1cmUoeG1sQ2xhc3MuZ2V0U3VwcG9ydENsYXNzKCksIGluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgU3RyaW5nW10gYmVmb3JlR3JvdXBzPSBhbm5vdGF0aW9uLmdldEJlZm9yZUdyb3VwcygpOworICAgIGlmKG51bGwgIT0gYmVmb3JlR3JvdXBzICYmIGJlZm9yZUdyb3Vwcy5sZW5ndGggPiAwKSB7CisgICAgICBmb3IoU3RyaW5nIGdyb3VwOiBiZWZvcmVHcm91cHMpIHsKKyAgICAgICAgbV9iZWZvcmVncm91cHNGYWlsdXJlcy5wdXQoZ3JvdXAsIEJvb2xlYW4uRkFMU0UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjbGFzcyBvciBhIHBhcmVudCBjbGFzcyBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBjbGFzc0NvbmZpZ3VyYXRpb25GYWlsZWQoQ2xhc3M8Pz4gY2xzKSB7CisgICAgZm9yIChDbGFzczw/PiBjIDogbV9jbGFzc0ludm9jYXRpb25SZXN1bHRzLmtleVNldCgpKSB7CisgICAgICBpZiAoYyA9PSBjbHMgfHwgYy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjbGFzcyBoYXMgc3VjY2Vzc2Z1bGx5IHJ1biBhbGwgaXRzIEBDb25maWd1cmF0aW9uCisgICAqIG1ldGhvZCBvciBmYWxzZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgbWV0aG9kcyBmYWlsZWQuCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gY29uZkludm9jYXRpb25QYXNzZWQoSVRlc3ROR01ldGhvZCBtZXRob2QsIElUZXN0TkdNZXRob2QgY3VycmVudFRlc3RNZXRob2QsCisgICAgICBJQ2xhc3MgdGVzdENsYXNzLCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICBib29sZWFuIHJlc3VsdD0gdHJ1ZTsKKworICAgIENsYXNzPD8+IGNscyA9IHRlc3RDbGFzcy5nZXRSZWFsQ2xhc3MoKTsKKworICAgIGlmKG1fc3VpdGVTdGF0ZS5pc0ZhaWxlZCgpKSB7CisgICAgICByZXN1bHQ9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjbGFzc0NvbmZpZ3VyYXRpb25GYWlsZWQoY2xzKSkgeworICAgICAgICBpZiAoISBtX2NvbnRpbnVlT25GYWlsZWRDb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgcmVzdWx0ID0gIWNsYXNzQ29uZmlndXJhdGlvbkZhaWxlZChjbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCA9ICFtX2NsYXNzSW52b2NhdGlvblJlc3VsdHMuZ2V0KGNscykuY29udGFpbnMoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBpZiBtZXRob2QgaXMgQmVmb3JlQ2xhc3MsIGN1cnJlbnRUZXN0TWV0aG9kIHdpbGwgYmUgbnVsbAorICAgICAgZWxzZSBpZiAobV9jb250aW51ZU9uRmFpbGVkQ29uZmlndXJhdGlvbiAmJgorICAgICAgICAgICAgICBjdXJyZW50VGVzdE1ldGhvZCAhPSBudWxsICYmCisgICAgICAgICAgICAgIG1fbWV0aG9kSW52b2NhdGlvblJlc3VsdHMuY29udGFpbnNLZXkoY3VycmVudFRlc3RNZXRob2QpKSB7CisgICAgICAgIHJlc3VsdCA9ICFtX21ldGhvZEludm9jYXRpb25SZXN1bHRzLmdldChjdXJyZW50VGVzdE1ldGhvZCkuY29udGFpbnMoZ2V0TWV0aG9kSW52b2NhdGlvblRva2VuKGN1cnJlbnRUZXN0TWV0aG9kLCBpbnN0YW5jZSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoISBtX2NvbnRpbnVlT25GYWlsZWRDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGZvcihDbGFzczw/PiBjbGF6ejogbV9jbGFzc0ludm9jYXRpb25SZXN1bHRzLmtleVNldCgpKSB7CisvLyAgICAgICAgICBpZiAoY2xhenogPT0gY2xzKSB7CisgICAgICAgICAgaWYoY2xhenouaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7CisgICAgICAgICAgICByZXN1bHQ9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGZhaWxlZCBAQmVmb3JlR3JvdXBzCisgICAgU3RyaW5nW10gZ3JvdXBzPSBtZXRob2QuZ2V0R3JvdXBzKCk7CisgICAgaWYobnVsbCAhPSBncm91cHMgJiYgZ3JvdXBzLmxlbmd0aCA+IDApIHsKKyAgICAgIGZvcihTdHJpbmcgZ3JvdXA6IGdyb3VwcykgeworICAgICAgICBpZihtX2JlZm9yZWdyb3Vwc0ZhaWx1cmVzLmNvbnRhaW5zS2V5KGdyb3VwKSkgeworICAgICAgICAgIHJlc3VsdD0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgICAvLyBDcmVhdGVzIGEgdG9rZW4gZm9yIHRyYWNraW5nIGEgdW5pcXVlIGludm9jYXRpb24gb2YgYSBtZXRob2Qgb24gYW4gaW5zdGFuY2UuCisgICAvLyBJcyB1c2VkIHdoZW4gY29uZmlnRmFpbHVyZVBvbGljeT1jb250aW51ZS4KKyAgcHJpdmF0ZSBPYmplY3QgZ2V0TWV0aG9kSW52b2NhdGlvblRva2VuKElUZXN0TkdNZXRob2QgbWV0aG9kLCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMrJWQiLCBpbnN0YW5jZS50b1N0cmluZygpLCBtZXRob2QuZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBFZmZlY3RpdmVseSBpbnZva2VzIGEgY29uZmlndXJhdGlvbiBtZXRob2Qgb24gYWxsIHBhc3NlZCBpbiBpbnN0YW5jZXMuCisgICAqIFRPRE86IFNob3VsZCBjaGFuZ2UgdGhpcyBtZXRob2QgdG8gYmUgbW9yZSBsaWtlIGludm9rZU1ldGhvZCgpIHNvIHRoYXQgd2UgY2FuCisgICAqIGhhbmRsZSBjYWxscyB0byB7QGNvZGUgSUludm9rZWRNZXRob2RMaXN0ZW5lcn0gYmV0dGVyLgorICAgKgorICAgKiBAcGFyYW0gdGFyZ2V0SW5zdGFuY2UgdGhlIGluc3RhbmNlIHRvIGludm9rZSB0aGUgY29uZmlndXJhdGlvbiBtZXRob2Qgb24KKyAgICogQHBhcmFtIHRtIHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZAorICAgKiBAcGFyYW0gcGFyYW1zIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCBmb3IgbWV0aG9kIGludm9jYXRpb24KKyAgICogQHBhcmFtIHRlc3RSZXN1bHQKKyAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCisgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGludm9rZUNvbmZpZ3VyYXRpb25NZXRob2QoT2JqZWN0IHRhcmdldEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpCisgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgeworICAgIC8vIE1hcmsgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgaWQKKyAgICB0bS5zZXRJZChUaHJlYWRVdGlsLmN1cnJlbnRUaHJlYWRJbmZvKCkpOworCisgICAgeworICAgICAgSW52b2tlZE1ldGhvZCBpbnZva2VkTWV0aG9kPSBuZXcgSW52b2tlZE1ldGhvZCh0YXJnZXRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0KTsKKworICAgICAgcnVuSW52b2tlZE1ldGhvZExpc3RlbmVycyhCRUZPUkVfSU5WT0NBVElPTiwgaW52b2tlZE1ldGhvZCwgdGVzdFJlc3VsdCk7CisgICAgICBtX25vdGlmaWVyLmFkZEludm9rZWRNZXRob2QoaW52b2tlZE1ldGhvZCk7CisgICAgICB0cnkgeworICAgICAgICBSZXBvcnRlci5zZXRDdXJyZW50VGVzdFJlc3VsdCh0ZXN0UmVzdWx0KTsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRtLmdldE1ldGhvZCgpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgbWV0aG9kIGlzIGEgSUNvbmZpZ3VyYWJsZSwgaW52b2tlIGl0cyBydW4oKSBtZXRob2QKKyAgICAgICAgLy8KKyAgICAgICAgSUNvbmZpZ3VyYWJsZSBjb25maWd1cmFibGVJbnN0YW5jZSA9CisgICAgICAgICAgSUNvbmZpZ3VyYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRtLmdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCkpID8KKyAgICAgICAgICAoSUNvbmZpZ3VyYWJsZSkgdGFyZ2V0SW5zdGFuY2UgOiBtX2NvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgIGlmIChjb25maWd1cmFibGVJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgTWV0aG9kSW52b2NhdGlvbkhlbHBlci5pbnZva2VDb25maWd1cmFibGUodGFyZ2V0SW5zdGFuY2UsIHBhcmFtcywgY29uZmlndXJhYmxlSW5zdGFuY2UsIG1ldGhvZCwKKyAgICAgICAgICAgICAgdGVzdFJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBOb3QgYSBJQ29uZmlndXJhYmxlLCBpbnZva2UgZGlyZWN0bHkKKyAgICAgICAgICAvLworICAgICAgICAgIGlmIChNZXRob2RIZWxwZXIuY2FsY3VsYXRlVGltZU91dCh0bSkgPD0gMCkgeworICAgICAgICAgICAgTWV0aG9kSW52b2NhdGlvbkhlbHBlci5pbnZva2VNZXRob2QobWV0aG9kLCB0YXJnZXRJbnN0YW5jZSwgcGFyYW1zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNZXRob2RJbnZvY2F0aW9uSGVscGVyLmludm9rZVdpdGhUaW1lb3V0KHRtLCB0YXJnZXRJbnN0YW5jZSwgcGFyYW1zLCB0ZXN0UmVzdWx0KTsKKyAgICAgICAgICAgIGlmICghdGVzdFJlc3VsdC5pc1N1Y2Nlc3MoKSkgeworICAgICAgICAgICAgICAvLyBBIHRpbWUgb3V0IGhhcHBlbmVkCisgICAgICAgICAgICAgIHRocm93Q29uZmlndXJhdGlvbkZhaWx1cmUodGVzdFJlc3VsdCwgdGVzdFJlc3VsdC5nZXRUaHJvd2FibGUoKSk7CisgICAgICAgICAgICAgIHRocm93IHRlc3RSZXN1bHQuZ2V0VGhyb3dhYmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICB0aHJvd0NvbmZpZ3VyYXRpb25GYWlsdXJlKHRlc3RSZXN1bHQsIGV4KTsKKyAgICAgICB0aHJvdyBleDsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICB0aHJvd0NvbmZpZ3VyYXRpb25GYWlsdXJlKHRlc3RSZXN1bHQsIGV4KTsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihleCk7CisgICAgICB9CisgICAgICBmaW5hbGx5IHsKKyAgICAgICAgUmVwb3J0ZXIuc2V0Q3VycmVudFRlc3RSZXN1bHQodGVzdFJlc3VsdCk7CisgICAgICAgIHJ1bkludm9rZWRNZXRob2RMaXN0ZW5lcnMoQUZURVJfSU5WT0NBVElPTiwgaW52b2tlZE1ldGhvZCwgdGVzdFJlc3VsdCk7CisgICAgICAgIFJlcG9ydGVyLnNldEN1cnJlbnRUZXN0UmVzdWx0KG51bGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB0aHJvd0NvbmZpZ3VyYXRpb25GYWlsdXJlKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsIFRocm93YWJsZSBleCkKKyAgeworICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOzsKKyAgICB0ZXN0UmVzdWx0LnNldFRocm93YWJsZShleC5nZXRDYXVzZSgpID09IG51bGwgPyBleCA6IGV4LmdldENhdXNlKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1bkludm9rZWRNZXRob2RMaXN0ZW5lcnMoSW52b2tlZE1ldGhvZExpc3RlbmVyTWV0aG9kIGxpc3RlbmVyTWV0aG9kLCBJSW52b2tlZE1ldGhvZCBpbnZva2VkTWV0aG9kLAorICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkKKyAgeworICAgIGlmICggbm9MaXN0ZW5lcnNQcmVzZW50KCkgKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgSW52b2tlZE1ldGhvZExpc3RlbmVySW52b2tlciBpbnZva2VyID0gbmV3IEludm9rZWRNZXRob2RMaXN0ZW5lckludm9rZXIobGlzdGVuZXJNZXRob2QsIHRlc3RSZXN1bHQsIG1fdGVzdENvbnRleHQpOworICAgIGZvciAoSUludm9rZWRNZXRob2RMaXN0ZW5lciBjdXJyZW50TGlzdGVuZXIgOiBtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMpIHsKKyAgICAgIGludm9rZXIuaW52b2tlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyLCBpbnZva2VkTWV0aG9kKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gbm9MaXN0ZW5lcnNQcmVzZW50KCkgeworICAgIHJldHVybiAobV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzID09IG51bGwpIHx8IChtX2ludm9rZWRNZXRob2RMaXN0ZW5lcnMuc2l6ZSgpID09IDApOworICB9CisKKyAgLy8gcGFzcyBib3RoIHBhcmFtVmFsdWVzIGFuZCBwYXJhbUluZGV4IHRvIGJlIHRocmVhZCBzYWZlIGluIGNhc2UgcGFyYWxsZWw9dHJ1ZSArIGRhdGFwcm92aWRlci4KKyAgcHJpdmF0ZSBJVGVzdFJlc3VsdCBpbnZva2VNZXRob2QoT2JqZWN0IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJzSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0TkdNZXRob2RbXSBiZWZvcmVNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kW10gYWZ0ZXJNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZUNvbnRleHQgZmFpbHVyZUNvbnRleHQpIHsKKyAgICBUZXN0UmVzdWx0IHRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOworCisgICAgLy8KKyAgICAvLyBJbnZva2UgYmVmb3JlR3JvdXBzIGNvbmZpZ3VyYXRpb25zCisgICAgLy8KKyAgICBpbnZva2VCZWZvcmVHcm91cHNDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsIHRtLCBncm91cE1ldGhvZHMsIHN1aXRlLCBwYXJhbXMsCisgICAgICAgIGluc3RhbmNlKTsKKworICAgIC8vCisgICAgLy8gSW52b2tlIGJlZm9yZU1ldGhvZHMgb25seSBpZgorICAgIC8vIC0gZmlyc3RUaW1lT25seSBpcyBub3Qgc2V0CisgICAgLy8gLSBmaXJzdFRpbWVPbmx5IGlzIHNldCwgYW5kIHdlIGFyZSByZWFjaGluZyBhdCB0aGUgZmlyc3QgaW52b2NhdGlvbkNvdW50CisgICAgLy8KKyAgICBpbnZva2VDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsIHRtLAorICAgICAgZmlsdGVyQ29uZmlndXJhdGlvbk1ldGhvZHModG0sIGJlZm9yZU1ldGhvZHMsIHRydWUgLyogYmVmb3JlTWV0aG9kcyAqLyksCisgICAgICBzdWl0ZSwgcGFyYW1zLCBwYXJhbWV0ZXJWYWx1ZXMsCisgICAgICBpbnN0YW5jZSwgdGVzdFJlc3VsdCk7CisKKyAgICAvLworICAgIC8vIENyZWF0ZSB0aGUgRXh0cmFPdXRwdXQgZm9yIHRoaXMgbWV0aG9kCisgICAgLy8KKyAgICBJbnZva2VkTWV0aG9kIGludm9rZWRNZXRob2QgPSBudWxsOworICAgIHRyeSB7CisgICAgICB0ZXN0UmVzdWx0LmluaXQodGVzdENsYXNzLCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdGVzdENvbnRleHQpOworICAgICAgdGVzdFJlc3VsdC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlclZhbHVlcyk7CisgICAgICB0ZXN0UmVzdWx0LnNldEhvc3QobV90ZXN0Q29udGV4dC5nZXRIb3N0KCkpOworICAgICAgdGVzdFJlc3VsdC5zZXRTdGF0dXMoSVRlc3RSZXN1bHQuU1RBUlRFRCk7CisKKyAgICAgIGludm9rZWRNZXRob2Q9IG5ldyBJbnZva2VkTWV0aG9kKGluc3RhbmNlLAorICAgICAgICAgIHRtLAorICAgICAgICAgIHBhcmFtZXRlclZhbHVlcywKKyAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICB0ZXN0UmVzdWx0KTsKKworICAgICAgLy8gRml4IGZyb20gYW5zZ2Fya29uZXJtYW5uCisgICAgICAvLyBpbnZva2VkTWV0aG9kIGlzIHVzZWQgaW4gdGhlIGZpbmFsbHksIHdoaWNoIGNhbiBiZSBpbnZva2VkIGlmCisgICAgICAvLyBhbnkgb2YgdGhlIHRlc3QgbGlzdGVuZXJzIHRocm93cyBhbiBleGNlcHRpb24sIHRoZXJlZm9yZSwKKyAgICAgIC8vIGludm9rZWRNZXRob2QgbXVzdCBoYXZlIGEgdmFsdWUgYmVmb3JlIHdlIGdldCBoZXJlCisgICAgICBydW5UZXN0TGlzdGVuZXJzKHRlc3RSZXN1bHQpOworCisgICAgICBydW5JbnZva2VkTWV0aG9kTGlzdGVuZXJzKEJFRk9SRV9JTlZPQ0FUSU9OLCBpbnZva2VkTWV0aG9kLCB0ZXN0UmVzdWx0KTsKKworICAgICAgbV9ub3RpZmllci5hZGRJbnZva2VkTWV0aG9kKGludm9rZWRNZXRob2QpOworCisgICAgICBNZXRob2QgdGhpc01ldGhvZCA9IHRtLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKS5nZXRNZXRob2QoKTsKKworICAgICAgaWYoY29uZkludm9jYXRpb25QYXNzZWQodG0sIHRtLCB0ZXN0Q2xhc3MsIGluc3RhbmNlKSkgeworICAgICAgICBsb2coMywgIkludm9raW5nICIgKyB0bS5nZXRSZWFsQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyB0bS5nZXRNZXRob2ROYW1lKCkpOworCisgICAgICAgIFJlcG9ydGVyLnNldEN1cnJlbnRUZXN0UmVzdWx0KHRlc3RSZXN1bHQpOworCisgICAgICAgIC8vIElmIHRoaXMgbWV0aG9kIGlzIGEgSUhvb2thYmxlLCBpbnZva2UgaXRzIHJ1bigpIG1ldGhvZAorICAgICAgICBJSG9va2FibGUgaG9va2FibGVJbnN0YW5jZSA9CisgICAgICAgICAgICBJSG9va2FibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0bS5nZXRSZWFsQ2xhc3MoKSkgPworICAgICAgICAgICAgKElIb29rYWJsZSkgaW5zdGFuY2UgOiBtX2NvbmZpZ3VyYXRpb24uZ2V0SG9va2FibGUoKTsKKworICAgICAgICBpZiAoTWV0aG9kSGVscGVyLmNhbGN1bGF0ZVRpbWVPdXQodG0pIDw9IDApIHsKKyAgICAgICAgICBpZiAoaG9va2FibGVJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICBNZXRob2RJbnZvY2F0aW9uSGVscGVyLmludm9rZUhvb2thYmxlKGluc3RhbmNlLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcywgaG9va2FibGVJbnN0YW5jZSwgdGhpc01ldGhvZCwgdGVzdFJlc3VsdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdCBhIElIb29rYWJsZSwgaW52b2tlIGRpcmVjdGx5CisgICAgICAgICAgICBNZXRob2RJbnZvY2F0aW9uSGVscGVyLmludm9rZU1ldGhvZCh0aGlzTWV0aG9kLCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMpOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZXN0UmVzdWx0LnNldFN0YXR1cyhJVGVzdFJlc3VsdC5TVUNDRVNTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBNZXRob2Qgd2l0aCBhIHRpbWVvdXQKKyAgICAgICAgICBNZXRob2RJbnZvY2F0aW9uSGVscGVyLmludm9rZVdpdGhUaW1lb3V0KHRtLCBpbnN0YW5jZSwgcGFyYW1ldGVyVmFsdWVzLCB0ZXN0UmVzdWx0LCBob29rYWJsZUluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LlNLSVApOworICAgICAgfQorICAgIH0KKyAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgdGVzdFJlc3VsdC5zZXRUaHJvd2FibGUoaXRlLmdldENhdXNlKCkpOworICAgICAgdGVzdFJlc3VsdC5zZXRTdGF0dXMoSVRlc3RSZXN1bHQuRkFJTFVSRSk7CisgICAgfQorICAgIGNhdGNoKFRocmVhZEV4ZWN1dGlvbkV4Y2VwdGlvbiB0ZWUpIHsgLy8gd3JhcHBlciBmb3IgVGVzdE5HUnVudGltZUV4Y2VwdGlvbgorICAgICAgVGhyb3dhYmxlIGNhdXNlPSB0ZWUuZ2V0Q2F1c2UoKTsKKyAgICAgIGlmKFRlc3ROR1J1bnRpbWVFeGNlcHRpb24uY2xhc3MuZXF1YWxzKGNhdXNlLmdldENsYXNzKCkpKSB7CisgICAgICAgIHRlc3RSZXN1bHQuc2V0VGhyb3dhYmxlKGNhdXNlLmdldENhdXNlKCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRlc3RSZXN1bHQuc2V0VGhyb3dhYmxlKGNhdXNlKTsKKyAgICAgIH0KKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOworICAgIH0KKyAgICBjYXRjaChUaHJvd2FibGUgdGhyKSB7IC8vIGNvdmVycyB0aGUgbm9uLXdyYXBwZXIgZXhjZXB0aW9ucworICAgICAgdGVzdFJlc3VsdC5zZXRUaHJvd2FibGUodGhyKTsKKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOworICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgIC8vIFNldCBlbmQgdGltZSBBU0FQCisgICAgICB0ZXN0UmVzdWx0LnNldEVuZE1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgICAgIEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciBleHBlY3RlZEV4Y2VwdGlvbkNsYXNzZXMKKyAgICAgICAgICA9IG5ldyBFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIobV9hbm5vdGF0aW9uRmluZGVyLCB0bSwgbmV3IFJlZ2V4cEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlcihtX2Fubm90YXRpb25GaW5kZXIsIHRtKSk7CisgICAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHRzID0gTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCh0ZXN0UmVzdWx0KTsKKyAgICAgIGhhbmRsZUludm9jYXRpb25SZXN1bHRzKHRtLCByZXN1bHRzLCBleHBlY3RlZEV4Y2VwdGlvbkNsYXNzZXMsIGZhaWx1cmVDb250ZXh0KTsKKworICAgICAgLy8gSWYgdGhpcyBtZXRob2QgaGFzIGEgZGF0YSBwcm92aWRlciBhbmQganVzdCBmYWlsZWQsIG1lbW9yaXplIHRoZSBudW1iZXIKKyAgICAgIC8vIGF0IHdoaWNoIGl0IGZhaWxlZC4KKyAgICAgIC8vIE5vdGU6IHdlJ3JlIG5vdCBleGFjdGx5IHRlc3RpbmcgdGhhdCB0aGlzIG1ldGhvZCBoYXMgYSBkYXRhIHByb3ZpZGVyLCBqdXN0CisgICAgICAvLyB0aGF0IGl0IGhhcyBwYXJhbWV0ZXJzLCBzbyBtaWdodCBoYXZlIHRvIHJldmlzaXQgdGhpcyBpZiBidWdzIGdldCByZXBvcnRlZAorICAgICAgLy8gZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgY29tZSBmcm9tIGEgZGF0YQorICAgICAgLy8gcHJvdmlkZXIKKyAgICAgIGlmICh0ZXN0UmVzdWx0LmdldFRocm93YWJsZSgpICE9IG51bGwgJiYgcGFyYW1ldGVyVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgdG0uYWRkRmFpbGVkSW52b2NhdGlvbk51bWJlcihwYXJhbWV0ZXJzSW5kZXgpOworICAgICAgfQorCisgICAgICAvLworICAgICAgLy8gSW5jcmVtZW50IHRoZSBpbnZvY2F0aW9uIGNvdW50IGZvciB0aGlzIG1ldGhvZAorICAgICAgLy8KKyAgICAgIHRtLmluY3JlbWVudEN1cnJlbnRJbnZvY2F0aW9uQ291bnQoKTsKKworICAgICAgLy8gUnVuIGludm9rZWRNZXRob2RMaXN0ZW5lcnMgYWZ0ZXIgdXBkYXRpbmcgVGVzdFJlc3VsdAorICAgICAgcnVuSW52b2tlZE1ldGhvZExpc3RlbmVycyhBRlRFUl9JTlZPQ0FUSU9OLCBpbnZva2VkTWV0aG9kLCB0ZXN0UmVzdWx0KTsKKyAgICAgIHJ1blRlc3RMaXN0ZW5lcnModGVzdFJlc3VsdCk7CisKKyAgICAgIC8vCisgICAgICAvLyBJbnZva2UgYWZ0ZXJNZXRob2RzIG9ubHkgaWYKKyAgICAgIC8vIC0gbGFzdFRpbWVPbmx5IGlzIG5vdCBzZXQKKyAgICAgIC8vIC0gbGFzdFRpbWVPbmx5IGlzIHNldCwgYW5kIHdlIGFyZSByZWFjaGluZyB0aGUgbGFzdCBpbnZvY2F0aW9uQ291bnQKKyAgICAgIC8vCisgICAgICBpbnZva2VDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsIHRtLAorICAgICAgICAgIGZpbHRlckNvbmZpZ3VyYXRpb25NZXRob2RzKHRtLCBhZnRlck1ldGhvZHMsIGZhbHNlIC8qIGJlZm9yZU1ldGhvZHMgKi8pLAorICAgICAgICAgIHN1aXRlLCBwYXJhbXMsIHBhcmFtZXRlclZhbHVlcywKKyAgICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgICB0ZXN0UmVzdWx0KTsKKworICAgICAgLy8KKyAgICAgIC8vIEludm9rZSBhZnRlckdyb3VwcyBjb25maWd1cmF0aW9ucworICAgICAgLy8KKyAgICAgIGludm9rZUFmdGVyR3JvdXBzQ29uZmlndXJhdGlvbnModGVzdENsYXNzLCB0bSwgZ3JvdXBNZXRob2RzLCBzdWl0ZSwKKyAgICAgICAgICBwYXJhbXMsIGluc3RhbmNlKTsKKworICAgICAgLy8gUmVzZXQgdGhlIHRlc3QgcmVzdWx0IGxhc3QuIElmIHdlIGRvIHRoaXMgdG9vIGVhcmx5LCBSZXBvcnRlci5sb2coKQorICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBsaXN0ZW5lcnMgd2lsbCBiZSBkaXNjYXJkZWQKKyAgICAgIFJlcG9ydGVyLnNldEN1cnJlbnRUZXN0UmVzdWx0KG51bGwpOworICAgIH0KKworICAgIHJldHVybiB0ZXN0UmVzdWx0OworICB9CisKKyAgdm9pZCBjb2xsZWN0UmVzdWx0cyhJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsIENvbGxlY3Rpb248SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgIC8vIENvbGxlY3QgdGhlIHJlc3VsdHMKKyAgICAgIGZpbmFsIGludCBzdGF0dXMgPSByZXN1bHQuZ2V0U3RhdHVzKCk7CisgICAgICBpZihJVGVzdFJlc3VsdC5TVUNDRVNTID09IHN0YXR1cykgeworICAgICAgICBtX25vdGlmaWVyLmFkZFBhc3NlZFRlc3QodGVzdE1ldGhvZCwgcmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoSVRlc3RSZXN1bHQuU0tJUCA9PSBzdGF0dXMpIHsKKyAgICAgICAgbV9ub3RpZmllci5hZGRTa2lwcGVkVGVzdCh0ZXN0TWV0aG9kLCByZXN1bHQpOworICAgICAgfQorICAgICAgZWxzZSBpZihJVGVzdFJlc3VsdC5GQUlMVVJFID09IHN0YXR1cykgeworICAgICAgICBtX25vdGlmaWVyLmFkZEZhaWxlZFRlc3QodGVzdE1ldGhvZCwgcmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoSVRlc3RSZXN1bHQuU1VDQ0VTU19QRVJDRU5UQUdFX0ZBSUxVUkUgPT0gc3RhdHVzKSB7CisgICAgICAgIG1fbm90aWZpZXIuYWRkRmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0KHRlc3RNZXRob2QsIHJlc3VsdCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0IGZhbHNlIDogIlVOS05PV04gU1RBVFVTOiIgKyBzdGF0dXM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoZSBhcnJheSBvZiBtZXRob2RzIGNvbnRhaW5zIEBCZWZvcmVNZXRob2RzIGlmIGlzQmVmb3JlIGlmIHRydWUsIEBBZnRlck1ldGhvZHMKKyAgICogb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBub3QgYmUgcnVuIGF0IHRoaXMKKyAgICogcG9pbnQgYmVjYXVzZSB0aGV5IGFyZSBlaXRoZXIgZmlyc3RUaW1lT25seSBvciBsYXN0VGltZU9ubHkgYW5kIHdlIGhhdmVuJ3QgcmVhY2hlZAorICAgKiB0aGUgY3VycmVudCBpbnZvY2F0aW9uQ291bnQgeWV0CisgICAqLworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSBmaWx0ZXJDb25maWd1cmF0aW9uTWV0aG9kcyhJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsIGJvb2xlYW4gaXNCZWZvcmUpCisgIHsKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogbWV0aG9kcykgeworICAgICAgQ29uZmlndXJhdGlvbk1ldGhvZCBjbSA9IChDb25maWd1cmF0aW9uTWV0aG9kKSBtOworICAgICAgaWYgKGlzQmVmb3JlKSB7CisgICAgICAgIGlmICghIGNtLmlzRmlyc3RUaW1lT25seSgpIHx8CisgICAgICAgICAgICAoY20uaXNGaXJzdFRpbWVPbmx5KCkgJiYgdG0uZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0LmFkZChtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGludCBjdXJyZW50ID0gdG0uZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpOworICAgICAgICBib29sZWFuIGlzTGFzdCA9IGZhbHNlOworICAgICAgICAvLyBJZiB3ZSBoYXZlIHBhcmFtZXRlcnMsIHNldCB0aGUgYm9vbGVhbiBpZiB3ZSBhcmUgYWJvdXQgdG8gcnVuCisgICAgICAgIC8vIHRoZSBsYXN0IGludm9jYXRpb24KKyAgICAgICAgaWYgKHRtLmdldFBhcmFtZXRlckludm9jYXRpb25Db3VudCgpID4gMCkgeworICAgICAgICAgIGlzTGFzdCA9IGN1cnJlbnQgPT0gdG0uZ2V0UGFyYW1ldGVySW52b2NhdGlvbkNvdW50KCkgKiB0bS5nZXRUb3RhbEludm9jYXRpb25Db3VudCgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIHdlIGhhdmUgaW52b2NhdGlvbkNvdW50ID4gMSwgc2V0IHRoZSBib29sZWFuIGlmIHdlIGFyZSBhYm91dCB0bworICAgICAgICAvLyBydW4gdGhlIGxhc3QgaW52b2NhdGlvbgorICAgICAgICBlbHNlIGlmICh0bS5nZXRUb3RhbEludm9jYXRpb25Db3VudCgpID4gMSkgeworICAgICAgICAgIGlzTGFzdCA9IGN1cnJlbnQgPT0gdG0uZ2V0VG90YWxJbnZvY2F0aW9uQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBjbS5pc0xhc3RUaW1lT25seSgpIHx8IChjbS5pc0xhc3RUaW1lT25seSgpICYmIGlzTGFzdCkpIHsKKyAgICAgICAgICByZXN1bHQuYWRkKG0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW3Jlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIC8qKgorICAgKiBpbnZva2VUZXN0TWV0aG9kcygpIGV2ZW50dWFsbHkgY29udmVyZ2UgaGVyZSB0byBpbnZva2UgYSBzaW5nbGUgQFRlc3QgbWV0aG9kLgorICAgKiA8cC8+CisgICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBhY3R1YWxseSBpbnZva2luZyB0aGUgbWV0aG9kLiBJdCBkZWNpZGVzIGlmIHRoZSBpbnZvY2F0aW9uCisgICAqIG11c3QgYmUgZG9uZToKKyAgICogPHVsPgorICAgKiA8bGk+dGhyb3VnaCBhbiA8Y29kZT5JSG9va2FibGU8L2NvZGU+PC9saT4KKyAgICogPGxpPmRpcmVjdGx5ICh0aHJvdWdoIHJlZmxlY3Rpb24pPC9saT4KKyAgICogPGxpPmluIGEgc2VwYXJhdGUgdGhyZWFkIChpbiBjYXNlIGl0IG5lZWRzIHRvIHRpbWVvdXQpCisgICAqIDwvdWw+CisgICAqCisgICAqIDxwLz4KKyAgICogVGhpcyBtZXRob2QgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgQEJlZm9yZUdyb3VwLCBAQmVmb3JlTWV0aG9kLCBAQWZ0ZXJNZXRob2QsIEBBZnRlckdyb3VwCisgICAqIGlmIGl0IGlzIHRoZSBjYXNlIGZvciB0aGUgcGFzc2VkIGluIEBUZXN0IG1ldGhvZC4KKyAgICovCisgIHByb3RlY3RlZCBJVGVzdFJlc3VsdCBpbnZva2VUZXN0TWV0aG9kKE9iamVjdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElUZXN0TkdNZXRob2QgdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyc0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0Q2xhc3MgdGVzdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZFtdIGJlZm9yZU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kW10gYWZ0ZXJNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcyBncm91cE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlQ29udGV4dCBmYWlsdXJlQ29udGV4dCkKKyAgeworICAgIC8vIE1hcmsgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgaWQKKyAgICB0bS5zZXRJZChUaHJlYWRVdGlsLmN1cnJlbnRUaHJlYWRJbmZvKCkpOworCisgICAgSVRlc3RSZXN1bHQgcmVzdWx0ID0gaW52b2tlTWV0aG9kKGluc3RhbmNlLCB0bSwgcGFyYW1ldGVyVmFsdWVzLCBwYXJhbWV0ZXJzSW5kZXgsIHN1aXRlLCBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDbGFzcywgYmVmb3JlTWV0aG9kcywgYWZ0ZXJNZXRob2RzLCBncm91cE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVDb250ZXh0KTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogRmlsdGVyIGFsbCB0aGUgYmVmb3JlR3JvdXBzIG1ldGhvZHMgYW5kIGludm9rZSBvbmx5IHRob3NlIHRoYXQgYXBwbHkKKyAgICogdG8gdGhlIGN1cnJlbnQgdGVzdCBtZXRob2QKKyAgICovCisgIHByaXZhdGUgdm9pZCBpbnZva2VCZWZvcmVHcm91cHNDb25maWd1cmF0aW9ucyhJVGVzdENsYXNzIHRlc3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0TkdNZXRob2QgY3VycmVudFRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UpCisgIHsKKyAgICBzeW5jaHJvbml6ZWQoZ3JvdXBNZXRob2RzKSB7CisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGZpbHRlcmVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgU3RyaW5nW10gZ3JvdXBzID0gY3VycmVudFRlc3RNZXRob2QuZ2V0R3JvdXBzKCk7CisgICAgICBNYXA8U3RyaW5nLCBMaXN0PElUZXN0TkdNZXRob2Q+PiBiZWZvcmVHcm91cE1hcCA9IGdyb3VwTWV0aG9kcy5nZXRCZWZvcmVHcm91cHNNYXAoKTsKKworICAgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsKKyAgICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzID0gYmVmb3JlR3JvdXBNYXAuZ2V0KGdyb3VwKTsKKyAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgIGZpbHRlcmVkTWV0aG9kcy5hZGRBbGwobWV0aG9kcyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSVRlc3ROR01ldGhvZFtdIGJlZm9yZU1ldGhvZHNBcnJheSA9IGZpbHRlcmVkTWV0aG9kcy50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW2ZpbHRlcmVkTWV0aG9kcy5zaXplKCldKTsKKyAgICAgIC8vCisgICAgICAvLyBJbnZva2UgdGhlIHJpZ2h0IGdyb3VwcyBtZXRob2RzCisgICAgICAvLworICAgICAgaWYoYmVmb3JlTWV0aG9kc0FycmF5Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgLy8gZG9uJ3QgcGFzcyB0aGUgSUNsYXNzIG9yIHRoZSBpbnN0YW5jZSBhcyB0aGUgbWV0aG9kIG1heSBiZSBleHRlcm5hbAorICAgICAgICAvLyB0aGUgaW52b2NhdGlvbiBtdXN0IGJlIHNpbWlsYXIgdG8gQEJlZm9yZVRlc3QvQEJlZm9yZVN1aXRlCisgICAgICAgIGludm9rZUNvbmZpZ3VyYXRpb25zKG51bGwsIGJlZm9yZU1ldGhvZHNBcnJheSwgc3VpdGUsIHBhcmFtcywKKyAgICAgICAgICAgIG51bGwsIC8qIG5vIHBhcmFtZXRlciB2YWx1ZXMgKi8KKyAgICAgICAgICAgIG51bGwpOworICAgICAgfQorCisgICAgICAvLworICAgICAgLy8gUmVtb3ZlIHRoZW0gc28gdGhleSBkb24ndCBnZXQgcnVuIGFnYWluCisgICAgICAvLworICAgICAgZ3JvdXBNZXRob2RzLnJlbW92ZUJlZm9yZUdyb3Vwcyhncm91cHMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbnZva2VBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb25zKElUZXN0Q2xhc3MgdGVzdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kIGN1cnJlbnRUZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UpCisgIHsKKyAgICAvLyBTa2lwIHRoaXMgaWYgdGhlIGN1cnJlbnQgbWV0aG9kIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBncm91cAorICAgIC8vIChvbmx5IGEgbWV0aG9kIHRoYXQgYmVsb25ncyB0byBhIGdyb3VwIGNhbiB0cmlnZ2VyIHRoZSBpbnZvY2F0aW9uCisgICAgLy8gb2YgYWZ0ZXJHcm91cHMgbWV0aG9kcykKKyAgICBpZiAoY3VycmVudFRlc3RNZXRob2QuZ2V0R3JvdXBzKCkubGVuZ3RoID09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhlIGN1cnJlbnRNZXRob2QgaXMgdGhlIGxhc3QgbWV0aG9kIGluIGFueSBvZiB0aGUgZ3JvdXBzCisgICAgLy8gaXQgYmVsb25ncyB0bworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZmlsdGVyZWRHcm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBTdHJpbmdbXSBncm91cHMgPSBjdXJyZW50VGVzdE1ldGhvZC5nZXRHcm91cHMoKTsKKyAgICBzeW5jaHJvbml6ZWQoZ3JvdXBNZXRob2RzKSB7CisgICAgICBmb3IgKFN0cmluZyBncm91cCA6IGdyb3VwcykgeworICAgICAgICBpZiAoZ3JvdXBNZXRob2RzLmlzTGFzdE1ldGhvZEZvckdyb3VwKGdyb3VwLCBjdXJyZW50VGVzdE1ldGhvZCkpIHsKKyAgICAgICAgICBmaWx0ZXJlZEdyb3Vwcy5wdXQoZ3JvdXAsIGdyb3VwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZihmaWx0ZXJlZEdyb3Vwcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBUaGUgbGlzdCBvZiBhZnRlck1ldGhvZHMgdG8gcnVuCisgICAgICBNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gYWZ0ZXJNZXRob2RzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICAgIC8vIE5vdyBmaWx0ZXJlZEdyb3VwcyBjb250YWlucyBhbGwgdGhlIGdyb3VwcyBmb3Igd2hpY2ggd2UgbmVlZCB0byBydW4gdGhlIGFmdGVyR3JvdXBzCisgICAgICAvLyBtZXRob2QuICBGaW5kIGFsbCB0aGUgbWV0aG9kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlc2UgZ3JvdXBzIGFuZCBpbnZva2UgdGhlbS4KKyAgICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+IG1hcCA9IGdyb3VwTWV0aG9kcy5nZXRBZnRlckdyb3Vwc01hcCgpOworICAgICAgZm9yIChTdHJpbmcgZyA6IGZpbHRlcmVkR3JvdXBzLnZhbHVlcygpKSB7CisgICAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gbWV0aG9kcyA9IG1hcC5nZXQoZyk7CisgICAgICAgIC8vIE5vdGU6ICBzaG91bGQgcHV0IHRoZW0gaW4gYSBtYXAgaWYgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIHNhbWUgYWZ0ZXJHcm91cHMKKyAgICAgICAgLy8gZG9lc24ndCBnZXQgcnVuIHR3aWNlCisgICAgICAgIGlmIChtZXRob2RzICE9IG51bGwpIHsKKyAgICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIGFmdGVyTWV0aG9kcy5wdXQobSwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEdvdCBvdXIgYWZ0ZXJNZXRob2RzLCBpbnZva2UgdGhlbQorICAgICAgSVRlc3ROR01ldGhvZFtdIGFmdGVyTWV0aG9kc0FycmF5ID0gYWZ0ZXJNZXRob2RzLmtleVNldCgpLnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbYWZ0ZXJNZXRob2RzLnNpemUoKV0pOworICAgICAgLy8gZG9uJ3QgcGFzcyB0aGUgSUNsYXNzIG9yIHRoZSBpbnN0YW5jZSBhcyB0aGUgbWV0aG9kIG1heSBiZSBleHRlcm5hbAorICAgICAgLy8gdGhlIGludm9jYXRpb24gbXVzdCBiZSBzaW1pbGFyIHRvIEBCZWZvcmVUZXN0L0BCZWZvcmVTdWl0ZQorICAgICAgaW52b2tlQ29uZmlndXJhdGlvbnMobnVsbCwgYWZ0ZXJNZXRob2RzQXJyYXksIHN1aXRlLCBwYXJhbXMsCisgICAgICAgICAgbnVsbCwgLyogbm8gcGFyYW1ldGVyIHZhbHVlcyAqLworICAgICAgICAgIG51bGwpOworCisgICAgICAvLyBSZW1vdmUgdGhlIGdyb3VwcyBzbyB0aGV5IGRvbid0IGdldCBydW4gYWdhaW4KKyAgICAgIGdyb3VwTWV0aG9kcy5yZW1vdmVBZnRlckdyb3VwcyhmaWx0ZXJlZEdyb3Vwcy5rZXlTZXQoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBPYmplY3RbXSBnZXRQYXJhbWV0ZXJzRnJvbUluZGV4KEl0ZXJhdG9yPE9iamVjdFtdPiBwYXJhbWV0ZXJzVmFsdWVzLCBpbnQgaW5kZXgpIHsKKyAgICB3aGlsZSAocGFyYW1ldGVyc1ZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzVmFsdWVzLm5leHQoKTsKKworICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisgICAgICB9CisgICAgICBpbmRleC0tOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGludCByZXRyeUZhaWxlZChPYmplY3QgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVGVzdE5HTWV0aG9kIHRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENsYXNzIHRlc3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0TkdNZXRob2RbXSBiZWZvcmVNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZFtdIGFmdGVyTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Hcm91cE1ldGhvZHMgZ3JvdXBNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciBleHBlY3RlZEV4Y2VwdGlvbkhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJzSW5kZXgpIHsKKyAgICBmaW5hbCBGYWlsdXJlQ29udGV4dCBmYWlsdXJlID0gbmV3IEZhaWx1cmVDb250ZXh0KCk7CisgICAgZmFpbHVyZS5jb3VudCA9IGZhaWx1cmVDb3VudDsKKyAgICBkbyB7CisgICAgICBmYWlsdXJlLmluc3RhbmNlcyA9IExpc3RzLm5ld0FycmF5TGlzdCAoKTsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsUGFyYW1ldGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgLyoqCisgICAgICAgKiBUT0RPOiBUaGlzIHJlY3JlYXRlcyBhbGwgdGhlIHBhcmFtZXRlcnMgZXZlcnkgdGltZSB3aGVuIHdlIG9ubHkgbmVlZAorICAgICAgICogb25lIHNwZWNpZmljIHNldC4gU2hvdWxkIG9wdGltaXplIGl0IGJ5IG9ubHkgcmVjcmVhdGluZyB0aGUgc2V0IG5lZWRlZC4KKyAgICAgICAqLworICAgICAgUGFyYW1ldGVyQmFnIGJhZyA9IGNyZWF0ZVBhcmFtZXRlcnModG0sIHBhcmFtZXRlcnMsCisgICAgICAgICAgYWxsUGFyYW1ldGVycywgc3VpdGUsIHRlc3RDb250ZXh0LCBudWxsIC8qIGZlZEluc3RhbmNlICovKTsKKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlclZhbHVlcyA9CisgICAgICAgICAgZ2V0UGFyYW1ldGVyc0Zyb21JbmRleChiYWcucGFyYW1ldGVySG9sZGVyLnBhcmFtZXRlcnMsIHBhcmFtZXRlcnNJbmRleCk7CisKKyAgICAgIHJlc3VsdC5hZGQoaW52b2tlTWV0aG9kKGluc3RhbmNlLCB0bSwgcGFyYW1ldGVyVmFsdWVzLCBwYXJhbWV0ZXJzSW5kZXgsIHN1aXRlLAorICAgICAgICAgIGFsbFBhcmFtZXRlcnMsIHRlc3RDbGFzcywgYmVmb3JlTWV0aG9kcywgYWZ0ZXJNZXRob2RzLCBncm91cE1ldGhvZHMsIGZhaWx1cmUpKTsKKyAgICB9CisgICAgd2hpbGUgKCFmYWlsdXJlLmluc3RhbmNlcy5pc0VtcHR5KCkpOworICAgIHJldHVybiBmYWlsdXJlLmNvdW50OworICB9CisKKyAgcHJpdmF0ZSBQYXJhbWV0ZXJCYWcgY3JlYXRlUGFyYW1ldGVycyhJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsUGFyYW1ldGVyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmZWRJbnN0YW5jZSkKKyAgeworICAgIE9iamVjdCBpbnN0YW5jZTsKKyAgICBpZiAoZmVkSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgaW5zdGFuY2UgPSBmZWRJbnN0YW5jZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpbnN0YW5jZSA9IHRlc3RNZXRob2QuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBQYXJhbWV0ZXJCYWcgYmFnID0gaGFuZGxlUGFyYW1ldGVycyh0ZXN0TWV0aG9kLAorICAgICAgICBpbnN0YW5jZSwgYWxsUGFyYW1ldGVyTmFtZXMsIHBhcmFtZXRlcnMsIG51bGwsIHN1aXRlLCB0ZXN0Q29udGV4dCwgZmVkSW5zdGFuY2UsIG51bGwpOworCisgICAgcmV0dXJuIGJhZzsKKyAgfQorCisgIC8qKgorICAgKiBJbnZva2UgYWxsIHRoZSB0ZXN0IG1ldGhvZHMuIE5vdGUgdGhlIHBsdXJhbDogdGhlIG1ldGhvZCBwYXNzZWQgaW4KKyAgICogcGFyYW1ldGVyIG1pZ2h0IGJlIGludm9rZWQgc2V2ZXJhbCB0aW1lcyBpZiB0aGUgdGVzdCBjbGFzcyBpdCBiZWxvbmdzCisgICAqIHRvIGhhcyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIChpLmUuLCBpZiBhbiBARmFjdG9yeSBtZXRob2QgaGFzIGJlZW4KKyAgICogZGVjbGFyZWQgc29tZXdoZXJlIHRoYXQgcmV0dXJucyBzZXZlcmFsIGluc3RhbmNlcyBvZiB0aGlzIFRlc3RDbGFzcykuCisgICAqIElmIG5vIEBGYWN0b3J5IG1ldGhvZCB3YXMgc3BlY2lmaWVkLCB0ZXN0TWV0aG9kIHdpbGwgb25seSBiZSBpbnZva2VkCisgICAqIG9uY2UuCisgICAqIDxwLz4KKyAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGFsc28gdGFrZXMgY2FyZSBvZiBpbnZva2luZyB0aGUgYmVmb3JlVGVzdE1ldGhvZAorICAgKiBhbmQgYWZ0ZXJUZXN0TWV0aG9kLCBpZiBhbnkuCisgICAqCisgICAqIE5vdGUgKGFsZXgpOiB0aGlzIG1ldGhvZCBjYW4gYmUgcmVmYWN0b3JlZCB0byB1c2UgYSBTaW5nbGVUZXN0TWV0aG9kV29ya2VyIHRoYXQKKyAgICogZGlyZWN0bHkgaW52b2tlcworICAgKiB7QGxpbmsgI2ludm9rZVRlc3RNZXRob2QoT2JqZWN0LCBJVGVzdE5HTWV0aG9kLCBPYmplY3RbXSwgaW50LCBYbWxTdWl0ZSwgTWFwLCBJVGVzdENsYXNzLCBJVGVzdE5HTWV0aG9kW10sIElUZXN0TkdNZXRob2RbXSwgQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcywgRmFpbHVyZUNvbnRleHQpfQorICAgKiBhbmQgdGhpcyB3b3VsZCBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24gKHNlZSBob3cgRGF0YVRlc3RNZXRob2RXb3JrZXIgaXMgdXNlZCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gaW52b2tlVGVzdE1ldGhvZHMoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlc3RQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcyBncm91cE1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpCisgIHsKKyAgICAvLyBQb3RlbnRpYWwgYnVnIGhlcmUgaWYgdGhlIHRlc3QgbWV0aG9kIHdhcyBkZWNsYXJlZCBvbiBhIHBhcmVudCBjbGFzcworICAgIGFzc2VydCBudWxsICE9IHRlc3RNZXRob2QuZ2V0VGVzdENsYXNzKCkKKyAgICAgICAgOiAiQ09VTEROJ1QgRklORCBURVNUQ0xBU1MgRk9SICIgKyB0ZXN0TWV0aG9kLmdldFJlYWxDbGFzcygpOworCisgICAgaWYgKCFNZXRob2RIZWxwZXIuaXNFbmFibGVkKHRlc3RNZXRob2QuZ2V0TWV0aG9kKCksIG1fYW5ub3RhdGlvbkZpbmRlcikpIHsKKyAgICAgIC8vIHJldHVybiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBlbmFibGVkLiBObyBuZWVkIHRvIGRvIGFueSBtb3JlIGNhbGN1bGF0aW9ucworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIC8vIEJ5IHRoZSB0aW1lIHRoaXMgdGVzdE1ldGhvZCB0byBiZSBpbnZva2VkLAorICAgIC8vIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIGFscmVhZHkgcnVuIG9yIHdlIG5lZWQgdG8gc2tpcCB0aGlzIG1ldGhvZCwKKyAgICAvLyBzbyBpbnZvY2F0aW9uIGNvdW50IHNob3VsZCBub3QgYWZmZWN0IGRlcGVuZGVuY2llcyBjaGVjaworICAgIGZpbmFsIFN0cmluZyBva1RvUHJvY2VlZCA9IGNoZWNrRGVwZW5kZW5jaWVzKHRlc3RNZXRob2QsIHRlc3RDb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCkpOworCisgICAgaWYgKG9rVG9Qcm9jZWVkICE9IG51bGwpIHsKKyAgICAgIC8vCisgICAgICAvLyBOb3Qgb2tUb1Byb2NlZWQuIFRlc3QgaXMgYmVpbmcgc2tpcHBlZAorICAgICAgLy8KKyAgICAgIElUZXN0UmVzdWx0IHJlc3VsdCA9IHJlZ2lzdGVyU2tpcHBlZFRlc3RSZXN1bHQodGVzdE1ldGhvZCwgbnVsbCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgICAgbmV3IFRocm93YWJsZShva1RvUHJvY2VlZCkpOworICAgICAgbV9ub3RpZmllci5hZGRTa2lwcGVkVGVzdCh0ZXN0TWV0aG9kLCByZXN1bHQpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzdWx0KTsKKyAgICB9CisKKworICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9CisgICAgICAgIHRlc3RNZXRob2QuZmluZE1ldGhvZFBhcmFtZXRlcnModGVzdENvbnRleHQuZ2V0Q3VycmVudFhtbFRlc3QoKSk7CisKKyAgICAvLyBGb3IgaW52b2NhdGlvbkNvdW50ID4gMSBhbmQgdGhyZWFkUG9vbFNpemUgPiAxIHJ1biB0aGlzIG1ldGhvZCBpbiBpdHMgb3duIHBvb2wgdGhyZWFkLgorICAgIGlmICh0ZXN0TWV0aG9kLmdldEludm9jYXRpb25Db3VudCgpID4gMSAmJiB0ZXN0TWV0aG9kLmdldFRocmVhZFBvb2xTaXplKCkgPiAxKSB7CisgICAgICByZXR1cm4gaW52b2tlUG9vbGVkVGVzdE1ldGhvZHModGVzdE1ldGhvZCwgc3VpdGUsIHBhcmFtZXRlcnMsIGdyb3VwTWV0aG9kcywgdGVzdENvbnRleHQpOworICAgIH0KKworICAgIGxvbmcgdGltZU91dEludm9jYXRpb25Db3VudCA9IHRlc3RNZXRob2QuZ2V0SW52b2NhdGlvblRpbWVPdXQoKTsKKyAgICAvL0ZJWE1FOiBJcyB0aGlzIGNvcnJlY3Q/CisgICAgYm9vbGVhbiBvbmx5T25lID0gdGVzdE1ldGhvZC5nZXRUaHJlYWRQb29sU2l6ZSgpID4gMSB8fAorICAgICAgdGltZU91dEludm9jYXRpb25Db3VudCA+IDA7CisKKyAgICBpbnQgaW52b2NhdGlvbkNvdW50ID0gb25seU9uZSA/IDEgOiB0ZXN0TWV0aG9kLmdldEludm9jYXRpb25Db3VudCgpOworCisgICAgRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyIGV4cGVjdGVkRXhjZXB0aW9uSG9sZGVyID0KKyAgICAgICAgbmV3IEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlcihtX2Fubm90YXRpb25GaW5kZXIsIHRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2V4cEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlcihtX2Fubm90YXRpb25GaW5kZXIsIHRlc3RNZXRob2QpKTsKKyAgICBmaW5hbCBJVGVzdENsYXNzIHRlc3RDbGFzcz0gdGVzdE1ldGhvZC5nZXRUZXN0Q2xhc3MoKTsKKyAgICBmaW5hbCBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmaW5hbCBGYWlsdXJlQ29udGV4dCBmYWlsdXJlID0gbmV3IEZhaWx1cmVDb250ZXh0KCk7CisgICAgZmluYWwgSVRlc3ROR01ldGhvZFtdIGJlZm9yZU1ldGhvZHMgPSBmaWx0ZXJNZXRob2RzKHRlc3RDbGFzcywgdGVzdENsYXNzLmdldEJlZm9yZVRlc3RNZXRob2RzKCksIENBTl9SVU5fRlJPTV9DTEFTUyk7CisgICAgZmluYWwgSVRlc3ROR01ldGhvZFtdIGFmdGVyTWV0aG9kcyA9IGZpbHRlck1ldGhvZHModGVzdENsYXNzLCB0ZXN0Q2xhc3MuZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpLCBDQU5fUlVOX0ZST01fQ0xBU1MpOworICAgIHdoaWxlKGludm9jYXRpb25Db3VudC0tID4gMCkgeworICAgICAgaWYoZmFsc2UpIHsKKyAgICAgICAgLy8gUHJldmVudCBjb2RlIGZvcm1hdHRpbmcKKyAgICAgIH0KKyAgICAgIC8vCisgICAgICAvLyBObyB0aHJlYWRzLCByZWd1bGFyIGludm9jYXRpb24KKyAgICAgIC8vCisgICAgICBlbHNlIHsKKyAgICAgICAgLy8gVXNlZCBpbiBjYXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsUGFyYW1ldGVyTmFtZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAgUGFyYW1ldGVyQmFnIGJhZyA9IGNyZWF0ZVBhcmFtZXRlcnModGVzdE1ldGhvZCwKKyAgICAgICAgICAgIHBhcmFtZXRlcnMsIGFsbFBhcmFtZXRlck5hbWVzLCBzdWl0ZSwgdGVzdENvbnRleHQsIGluc3RhbmNlKTsKKworICAgICAgICBpZiAoYmFnLmhhc0Vycm9ycygpKSB7CisgICAgICAgICAgZmluYWwgSVRlc3RSZXN1bHQgdHIgPSBiYWcuZXJyb3JSZXN1bHQ7CisgICAgICAgICAgdHIuc2V0U3RhdHVzKElUZXN0UmVzdWx0LlNLSVApOworICAgICAgICAgIHJ1blRlc3RMaXN0ZW5lcnModHIpOworICAgICAgICAgIG1fbm90aWZpZXIuYWRkU2tpcHBlZFRlc3QodGVzdE1ldGhvZCwgdHIpOworICAgICAgICAgIHJlc3VsdC5hZGQodHIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3I8T2JqZWN0W10+IGFsbFBhcmFtZXRlclZhbHVlcyA9IGJhZy5wYXJhbWV0ZXJIb2xkZXIucGFyYW1ldGVyczsKKyAgICAgICAgaW50IHBhcmFtZXRlcnNJbmRleCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBMaXN0PFRlc3RNZXRob2RXaXRoRGF0YVByb3ZpZGVyTWV0aG9kV29ya2VyPiB3b3JrZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgICBpZiAoYmFnLnBhcmFtZXRlckhvbGRlci5vcmlnaW4gPT0gUGFyYW1ldGVyT3JpZ2luLk9SSUdJTl9EQVRBX1BST1ZJREVSICYmCisgICAgICAgICAgICAgIGJhZy5wYXJhbWV0ZXJIb2xkZXIuZGF0YVByb3ZpZGVySG9sZGVyLmFubm90YXRpb24uaXNQYXJhbGxlbCgpKSB7CisgICAgICAgICAgICB3aGlsZSAoYWxsUGFyYW1ldGVyVmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMgPSBpbmplY3RQYXJhbWV0ZXJzKGFsbFBhcmFtZXRlclZhbHVlcy5uZXh0KCksCisgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kLmdldE1ldGhvZCgpLCB0ZXN0Q29udGV4dCwgbnVsbCAvKiB0ZXN0IHJlc3VsdCAqLyk7CisgICAgICAgICAgICAgIFRlc3RNZXRob2RXaXRoRGF0YVByb3ZpZGVyTWV0aG9kV29ya2VyIHcgPQorICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0aG9kV2l0aERhdGFQcm92aWRlck1ldGhvZFdvcmtlcih0aGlzLAorICAgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kLCBwYXJhbWV0ZXJzSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcywgaW5zdGFuY2UsIHN1aXRlLCBwYXJhbWV0ZXJzLCB0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGJlZm9yZU1ldGhvZHMsIGFmdGVyTWV0aG9kcywgZ3JvdXBNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbkhvbGRlciwgdGVzdENvbnRleHQsIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMsCisgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudCwgZmFpbHVyZS5jb3VudCwgbV9ub3RpZmllcik7CisgICAgICAgICAgICAgIHdvcmtlcnMuYWRkKHcpOworICAgICAgICAgICAgICAvLyB0ZXN0bmczODc6IGluY3JlbWVudCB0aGUgcGFyYW0gaW5kZXggaW4gdGhlIGJhZy4KKyAgICAgICAgICAgICAgcGFyYW1ldGVyc0luZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQb29sU2VydmljZTxMaXN0PElUZXN0UmVzdWx0Pj4gcHMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUG9vbFNlcnZpY2U8PihzdWl0ZS5nZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudCgpKTsKKyAgICAgICAgICAgIExpc3Q8TGlzdDxJVGVzdFJlc3VsdD4+IHIgPSBwcy5zdWJtaXRUYXNrc0FuZFdhaXQod29ya2Vycyk7CisgICAgICAgICAgICBmb3IgKExpc3Q8SVRlc3RSZXN1bHQ+IGwyIDogcikgeworICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKGwyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoYWxsUGFyYW1ldGVyVmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMgPSBpbmplY3RQYXJhbWV0ZXJzKGFsbFBhcmFtZXRlclZhbHVlcy5uZXh0KCksCisgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kLmdldE1ldGhvZCgpLCB0ZXN0Q29udGV4dCwgbnVsbCAvKiB0ZXN0IHJlc3VsdCAqLyk7CisKKyAgICAgICAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gdG1wUmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdG1wUmVzdWx0cy5hZGQoaW52b2tlVGVzdE1ldGhvZChpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICB0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGJlZm9yZU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgIGFmdGVyTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBNZXRob2RzLCBmYWlsdXJlKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmUuaW5zdGFuY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXBSZXN1bHRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmFpbGVkSW5zdGFuY2UgOiBmYWlsdXJlLmluc3RhbmNlcykgeworICAgICAgICAgICAgICAgICAgICBMaXN0PElUZXN0UmVzdWx0PiByZXRyeVJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLmNvdW50ID0gcmV0cnlGYWlsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkSW5zdGFuY2UsIHRlc3RNZXRob2QsIHN1aXRlLCB0ZXN0Q2xhc3MsIGJlZm9yZU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICBhZnRlck1ldGhvZHMsIGdyb3VwTWV0aG9kcywgcmV0cnlSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5jb3VudCwgZXhwZWN0ZWRFeGNlcHRpb25Ib2xkZXIsCisgICAgICAgICAgICAgICAgICAgICB0ZXN0Q29udGV4dCwgcGFyYW1ldGVycywgcGFyYW1ldGVyc0luZGV4KTsKKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwocmV0cnlSZXN1bHRzKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBmYWlsdXJlLCBza2lwIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvdGhlciBpbnZvY2F0aW9uQ291bnRzCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZS5jb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAmJiAobV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRlc3RNZXRob2Quc2tpcEZhaWxlZEludm9jYXRpb25zKCkpKSB7CisgICAgICAgICAgICAgICAgICB3aGlsZSAoaW52b2NhdGlvbkNvdW50LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocmVnaXN0ZXJTa2lwcGVkVGVzdFJlc3VsdCh0ZXN0TWV0aG9kLCBpbnN0YW5jZSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfS8vIGVuZCBmaW5hbGx5CisgICAgICAgICAgICAgIHBhcmFtZXRlcnNJbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgICAgSVRlc3RSZXN1bHQgciA9CisgICAgICAgICAgICAgIG5ldyBUZXN0UmVzdWx0KHRlc3RNZXRob2QuZ2V0VGVzdENsYXNzKCksCisgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICBjYXVzZSwKKyAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICAgICAgICBtX3Rlc3RDb250ZXh0KTsKKyAgICAgICAgICAgIHIuc2V0U3RhdHVzKFRlc3RSZXN1bHQuRkFJTFVSRSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHIpOworICAgICAgICAgICAgcnVuVGVzdExpc3RlbmVycyhyKTsKKyAgICAgICAgICAgIG1fbm90aWZpZXIuYWRkRmFpbGVkVGVzdCh0ZXN0TWV0aG9kLCByKTsKKyAgICAgICAgfSAvLyBjYXRjaAorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisKKyAgfSAvLyBpbnZva2VUZXN0TWV0aG9kCisKKyAgcHJpdmF0ZSBJVGVzdFJlc3VsdCByZWdpc3RlclNraXBwZWRUZXN0UmVzdWx0KElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCwgT2JqZWN0IGluc3RhbmNlLAorICAgICAgbG9uZyBzdGFydCwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgIElUZXN0UmVzdWx0IHJlc3VsdCA9CisgICAgICBuZXcgVGVzdFJlc3VsdCh0ZXN0TWV0aG9kLmdldFRlc3RDbGFzcygpLAorICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgdGVzdE1ldGhvZCwKKyAgICAgICAgdGhyb3dhYmxlLAorICAgICAgICBzdGFydCwKKyAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgIG1fdGVzdENvbnRleHQpOworICAgIHJlc3VsdC5zZXRTdGF0dXMoVGVzdFJlc3VsdC5TS0lQKTsKKyAgICBydW5UZXN0TGlzdGVuZXJzKHJlc3VsdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEdldHMgYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyByZXR1cm5lZCBieSBkYXRhIHByb3ZpZGVyIG9yIHRoZSBvbmVzIHRoYXQKKyAgICogYXJlIGluamVjdGVkIGJhc2VkIG9uIHBhcmFtZXRlciB0eXBlLiBUaGUgbWV0aG9kIGFsc28gY2hlY2tzIGZvciB7QGNvZGUgTm9JbmplY3Rpb259CisgICAqIGFubm90YXRpb24KKyAgICogQHBhcmFtIHBhcmFtZXRlclZhbHVlcyBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gYSBkYXRhIHByb3ZpZGVyCisgICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIHRvIGJlIGludm9rZWQKKyAgICogQHBhcmFtIGNvbnRleHQgdGVzdCBjb250ZXh0CisgICAqIEBwYXJhbSB0ZXN0UmVzdWx0IHRlc3QgcmVzdWx0CisgICAqLworICBwcml2YXRlIE9iamVjdFtdIGluamVjdFBhcmFtZXRlcnMoT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLCBNZXRob2QgbWV0aG9kLAorICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpCisgICAgdGhyb3dzIFRlc3ROR0V4Y2VwdGlvbiB7CisgICAgTGlzdDxPYmplY3Q+IHZSZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IG51bVZhbHVlcyA9IHBhcmFtZXRlclZhbHVlcy5sZW5ndGg7CisgICAgaW50IG51bVBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKworICAgIGlmIChudW1WYWx1ZXMgPiBudW1QYXJhbXMgJiYgISBtZXRob2QuaXNWYXJBcmdzKCkpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlRoZSBkYXRhIHByb3ZpZGVyIGlzIHRyeWluZyB0byBwYXNzICIgKyBudW1WYWx1ZXMKKyAgICAgICAgICArICIgcGFyYW1ldGVycyBidXQgdGhlIG1ldGhvZCAiCisgICAgICAgICAgKyBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2QuZ2V0TmFtZSgpCisgICAgICAgICAgKyAiIHRha2VzICIgKyBudW1QYXJhbXMpOworICAgIH0KKworICAgIC8vIGJleW9uZCB0aGlzLCBudW1WYWx1ZXMgPD0gbnVtUGFyYW1zCisgICAgZm9yIChDbGFzczw/PiBjbHMgOiBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSkgeworICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKClbaV07CisgICAgICBib29sZWFuIG5vSW5qZWN0aW9uID0gZmFsc2U7CisgICAgICBmb3IgKEFubm90YXRpb24gYSA6IGFubm90YXRpb25zKSB7CisgICAgICAgIGlmIChhIGluc3RhbmNlb2YgTm9JbmplY3Rpb24pIHsKKyAgICAgICAgICBub0luamVjdGlvbiA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE9iamVjdCBpbmplY3RlZCA9IFBhcmFtZXRlcnMuZ2V0SW5qZWN0ZWRQYXJhbWV0ZXIoY2xzLCBtZXRob2QsIGNvbnRleHQsIHRlc3RSZXN1bHQpOworICAgICAgaWYgKGluamVjdGVkICE9IG51bGwgJiYgISBub0luamVjdGlvbikgeworICAgICAgICB2UmVzdWx0LmFkZChpbmplY3RlZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChtZXRob2QuaXNWYXJBcmdzKCkpIHZSZXN1bHQuYWRkKHBhcmFtZXRlclZhbHVlcyk7CisgICAgICAgICAgZWxzZSB2UmVzdWx0LmFkZChwYXJhbWV0ZXJWYWx1ZXNbaSsrXSk7CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlRoZSBkYXRhIHByb3ZpZGVyIGlzIHRyeWluZyB0byBwYXNzICIgKyBudW1WYWx1ZXMKKyAgICAgICAgICAgICAgKyAiIHBhcmFtZXRlcnMgYnV0IHRoZSBtZXRob2QgIgorICAgICAgICAgICAgICArIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIjIiArIG1ldGhvZC5nZXROYW1lKCkKKyAgICAgICAgICAgICAgKyAiIHRha2VzICIgKyBudW1QYXJhbXMKKyAgICAgICAgICAgICAgKyAiIGFuZCBUZXN0TkcgaXMgdW5hYmxlIGluIGluamVjdCBhIHN1aXRhYmxlIG9iamVjdCIsIGV4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdlJlc3VsdC50b0FycmF5KG5ldyBPYmplY3RbdlJlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIHByaXZhdGUgUGFyYW1ldGVyQmFnIGhhbmRsZVBhcmFtZXRlcnMoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLAorICAgICAgT2JqZWN0IGluc3RhbmNlLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhbGxQYXJhbWV0ZXJOYW1lcywKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlclZhbHVlcywKKyAgICAgIFhtbFN1aXRlIHN1aXRlLAorICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LAorICAgICAgT2JqZWN0IGZlZEluc3RhbmNlLAorICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkKKyAgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckJhZygKKyAgICAgICAgICBQYXJhbWV0ZXJzLmhhbmRsZVBhcmFtZXRlcnModGVzdE1ldGhvZCwKKyAgICAgICAgICAgIGFsbFBhcmFtZXRlck5hbWVzLAorICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgICAgICAgICBuZXcgUGFyYW1ldGVycy5NZXRob2RQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZC5maW5kTWV0aG9kUGFyYW1ldGVycyh0ZXN0Q29udGV4dC5nZXRDdXJyZW50WG1sVGVzdCgpKSwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMsCisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZC5nZXRNZXRob2QoKSwgdGVzdENvbnRleHQsIHRlc3RSZXN1bHQpLAorICAgICAgICAgICAgc3VpdGUsCisgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICBmZWRJbnN0YW5jZSkpOworICAgIH0KKy8vICAgIGNhdGNoKFRlc3ROR0V4Y2VwdGlvbiBleCkgeworLy8gICAgICB0aHJvdyBleDsKKy8vICAgIH0KKyAgICBjYXRjaChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyQmFnKAorICAgICAgICAgIG5ldyBUZXN0UmVzdWx0KAorICAgICAgICAgICAgICB0ZXN0TWV0aG9kLmdldFRlc3RDbGFzcygpLAorICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgdGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgY2F1c2UsCisgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAorICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbnZva2VzIGEgbWV0aG9kIHRoYXQgaGFzIGEgc3BlY2lmaWVkIHRocmVhZFBvb2xTaXplLgorICAgKi8KKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBpbnZva2VQb29sZWRUZXN0TWV0aG9kcyhJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Hcm91cE1ldGhvZHMgZ3JvdXBNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkKKyAgeworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSB3b3JrZXJzCisgICAgLy8KKyAgICBMaXN0PElXb3JrZXI8SVRlc3ROR01ldGhvZD4+IHdvcmtlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIC8vIENyZWF0ZSBvbmUgd29ya2VyIHBlciBpbnZvY2F0aW9uQ291bnQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RNZXRob2QuZ2V0SW52b2NhdGlvbkNvdW50KCk7IGkrKykgeworICAgICAgLy8gd2UgdXNlIGNsb25lcyBmb3IgcmVwb3J0aW5nIHB1cnBvc2VzCisgICAgICBJVGVzdE5HTWV0aG9kIGNsb25lZE1ldGhvZD0gdGVzdE1ldGhvZC5jbG9uZSgpOworICAgICAgY2xvbmVkTWV0aG9kLnNldEludm9jYXRpb25Db3VudCgxKTsKKyAgICAgIGNsb25lZE1ldGhvZC5zZXRUaHJlYWRQb29sU2l6ZSgxKTsKKworICAgICAgTWV0aG9kSW5zdGFuY2UgbWkgPSBuZXcgTWV0aG9kSW5zdGFuY2UoY2xvbmVkTWV0aG9kKTsKKyAgICAgIHdvcmtlcnMuYWRkKG5ldyBTaW5nbGVUZXN0TWV0aG9kV29ya2VyKHRoaXMsCisgICAgICAgICAgbWksCisgICAgICAgICAgc3VpdGUsCisgICAgICAgICAgcGFyYW1ldGVycywKKyAgICAgICAgICB0ZXN0Q29udGV4dCwKKyAgICAgICAgICBtX2NsYXNzTGlzdGVuZXJzKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJ1bldvcmtlcnModGVzdE1ldGhvZCwgd29ya2VycywgdGVzdE1ldGhvZC5nZXRUaHJlYWRQb29sU2l6ZSgpLCBncm91cE1ldGhvZHMsIHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworICB9CisKKyAgc3RhdGljIGNsYXNzIEZhaWx1cmVDb250ZXh0IHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIExpc3Q8T2JqZWN0PiBpbnN0YW5jZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW52b2NhdGlvblJlc3VsdHMoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIgZXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVDb250ZXh0IGZhaWx1cmUpCisgIHsKKyAgICAvLworICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjcmVhdGUgYSBUZXN0UmVzdWx0IGZvciBlYWNoIG9mIHRoZW0KKyAgICAvLworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHNUb1JldHJ5ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBmb3IgKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQgOiByZXN1bHQpIHsKKyAgICAgIFRocm93YWJsZSBpdGU9IHRlc3RSZXN1bHQuZ2V0VGhyb3dhYmxlKCk7CisgICAgICBpbnQgc3RhdHVzPSB0ZXN0UmVzdWx0LmdldFN0YXR1cygpOworCisgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKworICAgICAgLy8gRXhjZXB0aW9uIHRocm93bj8KKyAgICAgIGlmIChpdGUgIT0gbnVsbCkgeworCisgICAgICAgIC8vICBJbnZvY2F0aW9uIGNhdXNlZCBhbiBleGNlcHRpb24sIHNlZSBpZiB0aGUgbWV0aG9kIHdhcyBhbm5vdGF0ZWQgd2l0aCBARXhwZWN0ZWRFeGNlcHRpb24KKyAgICAgICAgaWYgKGV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKGV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlci5pc0V4cGVjdGVkRXhjZXB0aW9uKGl0ZSkpIHsKKyAgICAgICAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LlNVQ0NFU1MpOworICAgICAgICAgICAgc3RhdHVzID0gSVRlc3RSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzU2tpcEV4Y2VwdGlvbkFuZFNraXAoaXRlKSl7CisgICAgICAgICAgICAgIHN0YXR1cyA9IElUZXN0UmVzdWx0LlNLSVA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0ZXN0UmVzdWx0LnNldFRocm93YWJsZShleHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIud3JvbmdFeGNlcHRpb24oaXRlKSk7CisgICAgICAgICAgICAgIHN0YXR1cyA9IElUZXN0UmVzdWx0LkZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpdGUsIHRlc3RNZXRob2QsIHRlc3RSZXN1bHQsIGZhaWx1cmUuY291bnQrKyk7CisgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgc3RhdHVzID0gdGVzdFJlc3VsdC5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBObyBleGNlcHRpb24gdGhyb3duLCBtYWtlIHN1cmUgd2Ugd2VyZW4ndCBleHBlY3Rpbmcgb25lCisgICAgICBlbHNlIGlmKHN0YXR1cyAhPSBJVGVzdFJlc3VsdC5TS0lQICYmIGV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciAhPSBudWxsKSB7CisgICAgICAgIFRlc3RFeGNlcHRpb24gZXhjZXB0aW9uID0gZXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLm5vRXhjZXB0aW9uKHRlc3RNZXRob2QpOworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICB0ZXN0UmVzdWx0LnNldFRocm93YWJsZShleGNlcHRpb24pOworICAgICAgICAgIHN0YXR1cz0gSVRlc3RSZXN1bHQuRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBJUmV0cnlBbmFseXplciByZXRyeUFuYWx5emVyID0gdGVzdE1ldGhvZC5nZXRSZXRyeUFuYWx5emVyKCk7CisgICAgICBib29sZWFuIHdpbGxSZXRyeSA9IHJldHJ5QW5hbHl6ZXIgIT0gbnVsbCAmJiBzdGF0dXMgPT0gSVRlc3RSZXN1bHQuRkFJTFVSRSAmJiBmYWlsdXJlLmluc3RhbmNlcyAhPSBudWxsICYmIHJldHJ5QW5hbHl6ZXIucmV0cnkodGVzdFJlc3VsdCk7CisKKyAgICAgIGlmICh3aWxsUmV0cnkpIHsKKyAgICAgICAgcmVzdWx0c1RvUmV0cnkuYWRkKHRlc3RSZXN1bHQpOworICAgICAgICBmYWlsdXJlLmNvdW50Kys7CisgICAgICAgIGZhaWx1cmUuaW5zdGFuY2VzLmFkZCh0ZXN0UmVzdWx0LmdldEluc3RhbmNlKCkpOworICAgICAgICB0ZXN0UmVzdWx0LnNldFN0YXR1cyhJVGVzdFJlc3VsdC5TS0lQKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gSVRlc3RSZXN1bHQuRkFJTFVSRSAmJiAhaGFuZGxlZCkgeworICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpdGUsIHRlc3RNZXRob2QsIHRlc3RSZXN1bHQsIGZhaWx1cmUuY291bnQrKyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbGxlY3RSZXN1bHRzKHRlc3RNZXRob2QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbih0ZXN0UmVzdWx0KSk7CisgICAgfSAvLyBmb3IgcmVzdWx0cworCisgICAgcmVtb3ZlUmVzdWx0c1RvUmV0cnlGcm9tUmVzdWx0KHJlc3VsdHNUb1JldHJ5LCByZXN1bHQsIGZhaWx1cmUpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzU2tpcEV4Y2VwdGlvbkFuZFNraXAoVGhyb3dhYmxlIGl0ZSkgeworICAgIHJldHVybiBTa2lwRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaXRlLmdldENsYXNzKCkpICYmICgoU2tpcEV4Y2VwdGlvbikgaXRlKS5pc1NraXAoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZW1vdmVSZXN1bHRzVG9SZXRyeUZyb21SZXN1bHQoTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0c1RvUmV0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0LCBGYWlsdXJlQ29udGV4dCBmYWlsdXJlKSB7CisgICAgaWYgKHJlc3VsdHNUb1JldHJ5ICE9IG51bGwpIHsKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgcmVzIDogcmVzdWx0c1RvUmV0cnkpIHsKKyAgICAgICAgcmVzdWx0LnJlbW92ZShyZXMpOworICAgICAgICBmYWlsdXJlLmNvdW50LS07CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRvIHJlZHVjZSB0aHJlYWQgY29udGVudGlvbiBhbmQgYWxzbyB0byBjb3JyZWN0bHkgaGFuZGxlIHRocmVhZC1jb25maW5lbWVudAorICAgKiB0aGlzIG1ldGhvZCBpbnZva2VzIHRoZSBAQmVmb3JlR3JvdXBzIGFuZCBAQWZ0ZXJHcm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBAVGVzdCBtZXRob2QuCisgICAqLworICBwcml2YXRlIExpc3Q8SVRlc3RSZXN1bHQ+IHJ1bldvcmtlcnMoSVRlc3ROR01ldGhvZCB0ZXN0TWV0aG9kLAorICAgICAgTGlzdDxJV29ya2VyPElUZXN0TkdNZXRob2Q+PiB3b3JrZXJzLAorICAgICAgaW50IHRocmVhZFBvb2xTaXplLAorICAgICAgQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcyBncm91cE1ldGhvZHMsCisgICAgICBYbWxTdWl0ZSBzdWl0ZSwKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKyAgeworICAgIC8vIEludm9rZSBAQmVmb3JlR3JvdXBzIG9uIHRoZSBvcmlnaW5hbCBtZXRob2QgKHJlZHVjZSB0aHJlYWQgY29udGVudGlvbiwKKyAgICAvLyBhbmQgYWxzbyBzb2x2ZSB0aHJlYWQgY29uZmluZW1lbnQpCisgICAgSVRlc3RDbGFzcyB0ZXN0Q2xhc3M9IHRlc3RNZXRob2QuZ2V0VGVzdENsYXNzKCk7CisgICAgT2JqZWN0W10gaW5zdGFuY2VzID0gdGVzdENsYXNzLmdldEluc3RhbmNlcyh0cnVlKTsKKyAgICBmb3IoT2JqZWN0IGluc3RhbmNlOiBpbnN0YW5jZXMpIHsKKyAgICAgIGludm9rZUJlZm9yZUdyb3Vwc0NvbmZpZ3VyYXRpb25zKHRlc3RDbGFzcywgdGVzdE1ldGhvZCwgZ3JvdXBNZXRob2RzLCBzdWl0ZSwgcGFyYW1ldGVycywgaW5zdGFuY2UpOworICAgIH0KKworCisgICAgbG9uZyBtYXhUaW1lT3V0PSAtMTsgLy8gMTAgc2Vjb25kcworCisgICAgZm9yKElXb3JrZXI8SVRlc3ROR01ldGhvZD4gdG13IDogd29ya2VycykgeworICAgICAgbG9uZyBtdD0gdG13LmdldFRpbWVPdXQoKTsKKyAgICAgIGlmKG10ID4gbWF4VGltZU91dCkgeworICAgICAgICBtYXhUaW1lT3V0PSBtdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUaHJlYWRVdGlsLmV4ZWN1dGUod29ya2VycywgdGhyZWFkUG9vbFNpemUsIG1heFRpbWVPdXQsIHRydWUpOworCisgICAgLy8KKyAgICAvLyBDb2xsZWN0IGFsbCB0aGUgVGVzdFJlc3VsdHMKKyAgICAvLworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoSVdvcmtlcjxJVGVzdE5HTWV0aG9kPiB0bXcgOiB3b3JrZXJzKSB7CisgICAgICBpZiAodG13IGluc3RhbmNlb2YgVGVzdE1ldGhvZFdvcmtlcikgeworICAgICAgICByZXN1bHQuYWRkQWxsKCgoVGVzdE1ldGhvZFdvcmtlcil0bXcpLmdldFRlc3RSZXN1bHRzKCkpOworICAgICAgfQorICAgIH0KKworICAgIGZvcihPYmplY3QgaW5zdGFuY2U6IGluc3RhbmNlcykgeworICAgICAgaW52b2tlQWZ0ZXJHcm91cHNDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsIHRlc3RNZXRob2QsIGdyb3VwTWV0aG9kcywgc3VpdGUsIHBhcmFtZXRlcnMsIGluc3RhbmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIENoZWNrcyB0byBzZWUgb2YgdGhlIHRlc3QgbWV0aG9kIGhhcyBjZXJ0YWluIGRlcGVuZGVuY2llcyB0aGF0IHByZXZlbnRzCisgICAqIFRlc3RORyBmcm9tIGV4ZWN1dGluZyBpdAorICAgKiBAcGFyYW0gdGVzdE1ldGhvZCB0ZXN0IG1ldGhvZCBiZWluZyBjaGVja2VkIGZvcgorICAgKiBAcmV0dXJuIGVycm9yIG1lc3NhZ2Ugb3IgbnVsbCBpZiBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJ1biBzdWNjZXNzZnVsbHkKKyAgICovCisgIHByaXZhdGUgU3RyaW5nIGNoZWNrRGVwZW5kZW5jaWVzKElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3ROR01ldGhvZFtdIGFsbFRlc3RNZXRob2RzKQorICB7CisgICAgLy8gSWYgdGhpcyBtZXRob2QgaXMgbWFya2VkIGFsd2F5c1J1biwgbm8gbmVlZCB0byBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcworICAgIGlmICh0ZXN0TWV0aG9kLmlzQWx3YXlzUnVuKCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIEFueSBtaXNzaW5nIGdyb3VwPworICAgIGlmICh0ZXN0TWV0aG9kLmdldE1pc3NpbmdHcm91cCgpICE9IG51bGwKKyAgICAgICAgJiYgIXRlc3RNZXRob2QuaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpKSB7CisgICAgICByZXR1cm4gIk1ldGhvZCAiICsgdGVzdE1ldGhvZCArICIgZGVwZW5kcyBvbiBub25leGlzdGVudCBncm91cCBcIiIgKyB0ZXN0TWV0aG9kLmdldE1pc3NpbmdHcm91cCgpICsgIlwiIjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uIGdyb3VwcywgY29sbGVjdCBhbGwgdGhlIG1ldGhvZHMgdGhhdAorICAgIC8vIGJlbG9uZyB0byB0aGVzZSBncm91cHMgYW5kIG1ha2Ugc3VyZSB0aGV5IGhhdmUgYmVlbiBydW4gc3VjY2Vzc2Z1bGx5CisgICAgZmluYWwgU3RyaW5nW10gZ3JvdXBzID0gdGVzdE1ldGhvZC5nZXRHcm91cHNEZXBlbmRlZFVwb24oKTsKKyAgICBpZiAobnVsbCAhPSBncm91cHMgJiYgZ3JvdXBzLmxlbmd0aCA+IDApIHsKKyAgICAgIC8vIEdldCBhbGwgdGhlIG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhlIGdyb3VwIGRlcGVuZGVkIHVwb24KKyAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBncm91cHMpIHsKKyAgICAgICAgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMgPQorICAgICAgICAgICAgTWV0aG9kR3JvdXBzSGVscGVyLmZpbmRNZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXAodGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICBtX3Rlc3RDb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCksCisgICAgICAgICAgICAgICAgZWxlbWVudCk7CisgICAgICAgIGlmIChtZXRob2RzLmxlbmd0aCA9PSAwICYmICF0ZXN0TWV0aG9kLmlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoKSkgeworICAgICAgICAgIC8vIEdyb3VwIGlzIG1pc3NpbmcKKyAgICAgICAgICByZXR1cm4gIk1ldGhvZCAiICsgdGVzdE1ldGhvZCArICIgZGVwZW5kcyBvbiBub25leGlzdGVudCBncm91cCBcIiIgKyBlbGVtZW50ICsgIlwiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhdmVCZWVuUnVuU3VjY2Vzc2Z1bGx5KHRlc3RNZXRob2QsIG1ldGhvZHMpKSB7CisgICAgICAgICAgcmV0dXJuICJNZXRob2QgIiArIHRlc3RNZXRob2QgKworICAgICAgICAgICAgICAiIGRlcGVuZHMgb24gbm90IHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBtZXRob2RzIGluIGdyb3VwIFwiIiArIGVsZW1lbnQgKyAiXCIiOworICAgICAgICB9CisgICAgICB9CisgICAgfSAvLyBkZXBlbmRzIG9uIGdyb3VwcworCisgICAgLy8gSWYgdGhpcyBtZXRob2QgZGVwZW5kcyBvbiBvdGhlciBtZXRob2RzLCBtYWtlIHN1cmUgYWxsIHRoZXNlIG90aGVyCisgICAgLy8gbWV0aG9kcyBoYXZlIGJlZW4gcnVuIHN1Y2Nlc3NmdWxseQorICAgIGlmIChkZXBlbmRzT25NZXRob2RzKHRlc3RNZXRob2QpKSB7CisgICAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcyA9CisgICAgICAgICAgTWV0aG9kSGVscGVyLmZpbmREZXBlbmRlZFVwb25NZXRob2RzKHRlc3RNZXRob2QsIGFsbFRlc3RNZXRob2RzKTsKKworICAgICAgaWYgKCFoYXZlQmVlblJ1blN1Y2Nlc3NmdWxseSh0ZXN0TWV0aG9kLCBtZXRob2RzKSkgeworICAgICAgICByZXR1cm4gIk1ldGhvZCAiICsgdGVzdE1ldGhvZCArICIgZGVwZW5kcyBvbiBub3Qgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIG1ldGhvZHMiOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHRlc3QgcmVzdWx0cyB0aGF0IGFwcGx5IHRvIG9uZSBvZiB0aGUgaW5zdGFuY2VzIG9mIHRoZSB0ZXN0TWV0aG9kLgorICAgKi8KKyAgcHJpdmF0ZSBTZXQ8SVRlc3RSZXN1bHQ+IGtlZXBTYW1lSW5zdGFuY2VzKElUZXN0TkdNZXRob2QgbWV0aG9kLCBTZXQ8SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICBTZXQ8SVRlc3RSZXN1bHQ+IHJlc3VsdCA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoSVRlc3RSZXN1bHQgciA6IHJlc3VsdHMpIHsKKyAgICAgIGZpbmFsIE9iamVjdCBvID0gbWV0aG9kLmdldEluc3RhbmNlKCk7CisgICAgICAgIC8vIEtlZXAgdGhpcyBpbnN0YW5jZSBpZiAxKSBJdCdzIG9uIGEgZGlmZmVyZW50IGNsYXNzIG9yIDIpIEl0J3Mgb24gdGhlIHNhbWUgY2xhc3MKKyAgICAgICAgLy8gYW5kIG9uIHRoZSBzYW1lIGluc3RhbmNlCisgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IHIuZ2V0SW5zdGFuY2UoKSAhPSBudWxsCisgICAgICAgICAgICA/IHIuZ2V0SW5zdGFuY2UoKSA6IHIuZ2V0TWV0aG9kKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKHIuZ2V0VGVzdENsYXNzKCkgIT0gbWV0aG9kLmdldFRlc3RDbGFzcygpIHx8IGluc3RhbmNlID09IG8pIHJlc3VsdC5hZGQocik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIGFsbCB0aGUgbWV0aG9kcyBoYXZlIGJlZW4gcnVuIHN1Y2Nlc3NmdWxseQorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGhhdmVCZWVuUnVuU3VjY2Vzc2Z1bGx5KElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCwgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhlIG1ldGhvZCBoYXMgYmVlbiBydW4gc3VjY2Vzc2Z1bGx5CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgIFNldDxJVGVzdFJlc3VsdD4gcmVzdWx0cyA9IGtlZXBTYW1lSW5zdGFuY2VzKHRlc3RNZXRob2QsIG1fbm90aWZpZXIuZ2V0UGFzc2VkVGVzdHMobWV0aG9kKSk7CisgICAgICBTZXQ8SVRlc3RSZXN1bHQ+IGZhaWxlZEFuZFNraXBwZWRNZXRob2RzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmYWlsZWRBbmRTa2lwcGVkTWV0aG9kcy5hZGRBbGwobV9ub3RpZmllci5nZXRGYWlsZWRUZXN0cyhtZXRob2QpKTsKKyAgICAgIGZhaWxlZEFuZFNraXBwZWRNZXRob2RzLmFkZEFsbChtX25vdGlmaWVyLmdldFNraXBwZWRUZXN0cyhtZXRob2QpKTsKKyAgICAgIFNldDxJVGVzdFJlc3VsdD4gZmFpbGVkcmVzdWx0cyA9IGtlZXBTYW1lSW5zdGFuY2VzKHRlc3RNZXRob2QsIGZhaWxlZEFuZFNraXBwZWRNZXRob2RzKTsKKworICAgICAgLy8gSWYgZmFpbGVkIHJlc3VsdHMgd2VyZSByZXR1cm5lZCBvbiB0aGUgc2FtZSBpbnN0YW5jZSwgdGhlbiB0aGVzZSB0ZXN0cyBkaWRuJ3QgcGFzcworICAgICAgaWYgKGZhaWxlZHJlc3VsdHMgIT0gbnVsbCAmJiBmYWlsZWRyZXN1bHRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBmb3IgKElUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgaWYoIXJlc3VsdC5pc1N1Y2Nlc3MoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKy8vICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnN0YW5jZShTZXQ8SVRlc3RSZXN1bHQ+IGZhaWxlZHJlc3VsdHMsIE9iamVjdFtdIGluc3RhbmNlcykgeworLy8gICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IGZhaWxlZHJlc3VsdHMpIHsKKy8vICAgICAgZm9yIChPYmplY3QgbyA6IGluc3RhbmNlcykgeworLy8gICAgICAgIGlmIChvID09IHRyLmdldEluc3RhbmNlKCkpIHsKKy8vICAgICAgICAgIHJldHVybiB0cnVlOworLy8gICAgICAgIH0KKy8vICAgICAgfQorLy8gICAgfQorLy8gICAgcmV0dXJuIGZhbHNlOworLy8gIH0KKworICAvKioKKyAgICogQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgdGhlIHRlc3QsIGRldGVybWluZSBpZiB0aGlzIG1ldGhvZAorICAgKiBzaG91bGQgYmUgbWFya2VkIGFzIGEgZmFpbHVyZSBvciBhcyBmYWlsdXJlX2J1dF93aXRoaW5fc3VjY2Vzc1BlcmNlbnRhZ2UKKyAgICovCisgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFpbHVyZUNvdW50KSB7CisgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICB0ZXN0UmVzdWx0LnNldFRocm93YWJsZSh0aHJvd2FibGUpOworICAgIH0KKyAgICBpbnQgc3VjY2Vzc1BlcmNlbnRhZ2U9IHRlc3RNZXRob2QuZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKTsKKyAgICBpbnQgaW52b2NhdGlvbkNvdW50PSB0ZXN0TWV0aG9kLmdldEludm9jYXRpb25Db3VudCgpOworICAgIGZsb2F0IG51bWJlck9mVGVzdHNUaGF0Q2FuRmFpbD0gKCgxMDAgLSBzdWNjZXNzUGVyY2VudGFnZSkgKiBpbnZvY2F0aW9uQ291bnQpIC8gMTAwZjsKKworICAgIGlmKGZhaWx1cmVDb3VudCA8IG51bWJlck9mVGVzdHNUaGF0Q2FuRmFpbCkgeworICAgICAgdGVzdFJlc3VsdC5zZXRTdGF0dXMoSVRlc3RSZXN1bHQuU1VDQ0VTU19QRVJDRU5UQUdFX0ZBSUxVUkUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOworICAgIH0KKworICB9CisKKyAgc3RhdGljIGludGVyZmFjZSBQcmVkaWNhdGU8SywgVD4geworICAgIGJvb2xlYW4gaXNUcnVlKEsgaywgVCB2KTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDYW5SdW5Gcm9tQ2xhc3NQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGUgPElUZXN0TkdNZXRob2QsIElDbGFzcz4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1ZShJVGVzdE5HTWV0aG9kIG0sIElDbGFzcyB2KSB7CisgICAgICByZXR1cm4gbS5jYW5SdW5Gcm9tQ2xhc3Modik7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIFNhbWVDbGFzc05hbWVQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGU8SVRlc3ROR01ldGhvZCwgSUNsYXNzPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUcnVlKElUZXN0TkdNZXRob2QgbSwgSUNsYXNzIGMpIHsKKyAgICAgIHJldHVybiBjID09IG51bGwgfHwgbS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGMuZ2V0TmFtZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBPbmx5IHRoZSBJVGVzdE5HTWV0aG9kcyBhcHBsaWNhYmxlIGZvciB0aGlzIHRlc3RDbGFzcworICAgKi8KKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kW10gZmlsdGVyTWV0aG9kcyhJQ2xhc3MgdGVzdENsYXNzLCBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywKKyAgICAgIFByZWRpY2F0ZTxJVGVzdE5HTWV0aG9kLCBJQ2xhc3M+IHByZWRpY2F0ZSkgeworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdlJlc3VsdD0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBmb3IoSVRlc3ROR01ldGhvZCB0bSA6IG1ldGhvZHMpIHsKKyAgICAgIGlmIChwcmVkaWNhdGUuaXNUcnVlKHRtLCB0ZXN0Q2xhc3MpKSB7CisgICAgICAgIGxvZygxMCwgIktlZXBpbmcgbWV0aG9kICIgKyB0bSArICIgZm9yIGNsYXNzICIgKyB0ZXN0Q2xhc3MpOworICAgICAgICB2UmVzdWx0LmFkZCh0bSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2coMTAsICJGaWx0ZXJpbmcgb3V0IG1ldGhvZCAiICsgdG0gKyAiIGZvciBjbGFzcyAiICsgdGVzdENsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0PSB2UmVzdWx0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbdlJlc3VsdC5zaXplKCldKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gY2VydGFpbiBtZXRob2RzLgorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGRlcGVuZHNPbk1ldGhvZHMoSVRlc3ROR01ldGhvZCB0bSkgeworICAgIFN0cmluZ1tdIG1ldGhvZHMgPSB0bS5nZXRNZXRob2RzRGVwZW5kZWRVcG9uKCk7CisgICAgcmV0dXJuIG51bGwgIT0gbWV0aG9kcyAmJiBtZXRob2RzLmxlbmd0aCA+IDA7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuQ29uZmlndXJhdGlvbkxpc3RlbmVycyhJVGVzdFJlc3VsdCB0ciwgYm9vbGVhbiBiZWZvcmUpIHsKKyAgICBpZiAoYmVmb3JlKSB7CisgICAgICBmb3IoSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBpY2w6IG1fbm90aWZpZXIuZ2V0Q29uZmlndXJhdGlvbkxpc3RlbmVycygpKSB7CisgICAgICAgIGlmIChpY2wgaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkxpc3RlbmVyMikgeworICAgICAgICAgICgoSUNvbmZpZ3VyYXRpb25MaXN0ZW5lcjIpIGljbCkuYmVmb3JlQ29uZmlndXJhdGlvbih0cik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yKElDb25maWd1cmF0aW9uTGlzdGVuZXIgaWNsOiBtX25vdGlmaWVyLmdldENvbmZpZ3VyYXRpb25MaXN0ZW5lcnMoKSkgeworICAgICAgICBzd2l0Y2godHIuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICBjYXNlIElUZXN0UmVzdWx0LlNLSVA6CisgICAgICAgICAgICBpY2wub25Db25maWd1cmF0aW9uU2tpcCh0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIElUZXN0UmVzdWx0LkZBSUxVUkU6CisgICAgICAgICAgICBpY2wub25Db25maWd1cmF0aW9uRmFpbHVyZSh0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIElUZXN0UmVzdWx0LlNVQ0NFU1M6CisgICAgICAgICAgICBpY2wub25Db25maWd1cmF0aW9uU3VjY2Vzcyh0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcnVuVGVzdExpc3RlbmVycyhJVGVzdFJlc3VsdCB0cikgeworICAgIHJ1blRlc3RMaXN0ZW5lcnModHIsIG1fbm90aWZpZXIuZ2V0VGVzdExpc3RlbmVycygpKTsKKyAgfQorCisgIC8vIFRPRE86IG1vdmUgdGhpcyBmcm9tIGhlcmUgYXMgaXQgaXMgZGlyZWN0bHkgY2FsbGVkIGZyb20gVGVzdE5HCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5UZXN0TGlzdGVuZXJzKElUZXN0UmVzdWx0IHRyLCBMaXN0PElUZXN0TGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgIGZvciAoSVRlc3RMaXN0ZW5lciBpdGwgOiBsaXN0ZW5lcnMpIHsKKyAgICAgIHN3aXRjaCh0ci5nZXRTdGF0dXMoKSkgeworICAgICAgICBjYXNlIElUZXN0UmVzdWx0LlNLSVA6IHsKKyAgICAgICAgICBpdGwub25UZXN0U2tpcHBlZCh0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TVUNDRVNTX1BFUkNFTlRBR0VfRkFJTFVSRTogeworICAgICAgICAgIGl0bC5vblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSh0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBJVGVzdFJlc3VsdC5GQUlMVVJFOiB7CisgICAgICAgICAgaXRsLm9uVGVzdEZhaWx1cmUodHIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSVRlc3RSZXN1bHQuU1VDQ0VTUzogeworICAgICAgICAgIGl0bC5vblRlc3RTdWNjZXNzKHRyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVRlc3RSZXN1bHQuU1RBUlRFRDogeworICAgICAgICAgIGl0bC5vblRlc3RTdGFydCh0cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIlVOS05PV04gU1RBVFVTOiIgKyB0cjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgcykgeworICAgIFV0aWxzLmxvZygiSW52b2tlciAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpLCBsZXZlbCwgcyk7CisgIH0KKworICAvKioKKyAgICogVGhpcyBjbGFzcyBob2xkcyBhIHtAY29kZSBQYXJhbWV0ZXJIb2xkZXJ9IG9yIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGEgbm9uLW51bGwKKyAgICoge0Bjb2RlIFRlc3RSZXN1bHR9IGNvbnRhaW5pbmcgdGhlIGNhdXNlCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJCYWcgeworICAgIGZpbmFsIFBhcmFtZXRlckhvbGRlciBwYXJhbWV0ZXJIb2xkZXI7CisgICAgZmluYWwgSVRlc3RSZXN1bHQgZXJyb3JSZXN1bHQ7CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQmFnKFBhcmFtZXRlckhvbGRlciBwYXJhbWV0ZXJIb2xkZXIpIHsKKyAgICAgIHRoaXMucGFyYW1ldGVySG9sZGVyID0gcGFyYW1ldGVySG9sZGVyOworICAgICAgdGhpcy5lcnJvclJlc3VsdCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlckJhZyhJVGVzdFJlc3VsdCBlcnJvclJlc3VsdCkgeworICAgICAgdGhpcy5wYXJhbWV0ZXJIb2xkZXIgPSBudWxsOworICAgICAgdGhpcy5lcnJvclJlc3VsdCA9IGVycm9yUmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKKyAgICAgIHJldHVybiBlcnJvclJlc3VsdCAhPSBudWxsOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kR3JvdXBzSGVscGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kR3JvdXBzSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3YTBmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RHcm91cHNIZWxwZXIuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RPckNvbmZpZ3VyYXRpb247DQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uSGVscGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmNvbGxlY3Rpb25zLlBhaXI7DQorDQorLyoqDQorICogQ29sbGVjdGlvbnMgb2YgaGVscGVyIG1ldGhvZHMgdG8gaGVscCBkZWFsIHdpdGggdGVzdCBtZXRob2RzDQorICoNCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4NCisgKiBAYXV0aG9yIG51bGxpbiA8bmFsaW4ubWFrYXIgKiBnbWFpbC5jb20+DQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgTWV0aG9kR3JvdXBzSGVscGVyIHsNCisNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFBhdHRlcm4+IFBBVFRFUk5fQ0FDSEUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBCb29sZWFuPiBNQVRDSF9DQUNIRSA9DQorICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7DQorDQorICAgIC8qKg0KKyAgICogQ29sbGVjdCBhbGwgdGhlIG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhlIGluY2x1ZGVkIGdyb3VwcyBhbmQgZXhjbHVkZSBhbGwNCisgICAqIHRoZSBtZXRob2RzIHRoYXQgYmVsb25nIHRvIGFuIGV4Y2x1ZGVkIGdyb3VwLg0KKyAgICovDQorICBzdGF0aWMgdm9pZCBjb2xsZWN0TWV0aG9kc0J5R3JvdXAoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsDQorICAgICAgYm9vbGVhbiBmb3JUZXN0cywNCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG91dEluY2x1ZGVkTWV0aG9kcywNCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG91dEV4Y2x1ZGVkTWV0aG9kcywNCisgICAgICBSdW5JbmZvIHJ1bkluZm8sDQorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBib29sZWFuIHVuaXF1ZSkNCisgIHsNCisgICAgZm9yIChJVGVzdE5HTWV0aG9kIHRtIDogbWV0aG9kcykgew0KKyAgICAgIGJvb2xlYW4gaW4gPSBmYWxzZTsNCisgICAgICBNZXRob2QgbSA9IHRtLmdldE1ldGhvZCgpOw0KKyAgICAgIC8vDQorICAgICAgLy8gQFRlc3QgbWV0aG9kDQorICAgICAgLy8NCisgICAgICBpZiAoZm9yVGVzdHMpIHsNCisgICAgICAgIGluID0gTWV0aG9kR3JvdXBzSGVscGVyLmluY2x1ZGVNZXRob2QoQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChmaW5kZXIsIG0pLA0KKyAgICAgICAgICAgIHJ1bkluZm8sIHRtLCBmb3JUZXN0cywgdW5pcXVlLCBvdXRJbmNsdWRlZE1ldGhvZHMpOw0KKyAgICAgIH0NCisNCisgICAgICAvLw0KKyAgICAgIC8vIEBDb25maWd1cmF0aW9uIG1ldGhvZA0KKyAgICAgIC8vDQorICAgICAgZWxzZSB7DQorICAgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25IZWxwZXIuZmluZENvbmZpZ3VyYXRpb24oZmluZGVyLCBtKTsNCisgICAgICAgIGlmIChhbm5vdGF0aW9uLmdldEFsd2F5c1J1bigpKSB7DQorICAgICAgICAJaWYgKCF1bmlxdWUgfHwgIU1ldGhvZEdyb3Vwc0hlbHBlci5pc01ldGhvZEFscmVhZHlQcmVzZW50KG91dEluY2x1ZGVkTWV0aG9kcywgdG0pKSB7DQorICAgICAgICAJCWluID0gdHJ1ZTsNCisgICAgICAgIAl9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgaW4gPSBNZXRob2RHcm91cHNIZWxwZXIuaW5jbHVkZU1ldGhvZChBbm5vdGF0aW9uSGVscGVyLmZpbmRUZXN0KGZpbmRlciwgdG0pLA0KKyAgICAgICAgICAgICAgcnVuSW5mbywgdG0sIGZvclRlc3RzLCB1bmlxdWUsIG91dEluY2x1ZGVkTWV0aG9kcyk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpbikgew0KKyAgICAgICAgb3V0SW5jbHVkZWRNZXRob2RzLmFkZCh0bSk7DQorICAgICAgfQ0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgb3V0RXhjbHVkZWRNZXRob2RzLmFkZCh0bSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluY2x1ZGVNZXRob2QoSVRlc3RPckNvbmZpZ3VyYXRpb24gYW5ub3RhdGlvbiwNCisgICAgICBSdW5JbmZvIHJ1bkluZm8sIElUZXN0TkdNZXRob2QgdG0sIGJvb2xlYW4gZm9yVGVzdHMsIGJvb2xlYW4gdW5pcXVlLCBMaXN0PElUZXN0TkdNZXRob2Q+IG91dEluY2x1ZGVkTWV0aG9kcykNCisgIHsNCisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCisNCisgICAgaWYgKE1ldGhvZEhlbHBlci5pc0VuYWJsZWQoYW5ub3RhdGlvbikpIHsNCisgICAgICBpZiAocnVuSW5mby5pbmNsdWRlTWV0aG9kKHRtLCBmb3JUZXN0cykpIHsNCisgICAgICAgIGlmICh1bmlxdWUpIHsNCisgICAgICAgICAgaWYgKCFNZXRob2RHcm91cHNIZWxwZXIuaXNNZXRob2RBbHJlYWR5UHJlc2VudChvdXRJbmNsdWRlZE1ldGhvZHMsIHRtKSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gcmVzdWx0DQorICAgKiBAcGFyYW0gdG0NCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIG1ldGhvZCBieSBhIHNpbWlsYXIgbmFtZSAoYW5kIHNhbWUgaGllcmFyY2h5KSBhbHJlYWR5DQorICAgKiAgICAgICAgIGV4aXN0cw0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQWxyZWFkeVByZXNlbnQoTGlzdDxJVGVzdE5HTWV0aG9kPiByZXN1bHQsDQorICAgICAgSVRlc3ROR01ldGhvZCB0bSkgew0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IHJlc3VsdCkgew0KKyAgICAgIE1ldGhvZCBqbTEgPSBtLmdldE1ldGhvZCgpOw0KKyAgICAgIE1ldGhvZCBqbTIgPSB0bS5nZXRNZXRob2QoKTsNCisgICAgICBpZiAoam0xLmdldE5hbWUoKS5lcXVhbHMoam0yLmdldE5hbWUoKSkpIHsNCisgICAgICAgIC8vIFNhbWUgbmFtZXMsIHNlZSBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBoaWVyYXJjaHkNCisgICAgICAgIENsYXNzPD8+IGMxID0gam0xLmdldERlY2xhcmluZ0NsYXNzKCk7DQorICAgICAgICBDbGFzczw/PiBjMiA9IGptMi5nZXREZWNsYXJpbmdDbGFzcygpOw0KKyAgICAgICAgaWYgKGMxLmlzQXNzaWduYWJsZUZyb20oYzIpIHx8IGMyLmlzQXNzaWduYWJsZUZyb20oYzEpKSB7DQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICAvKioNCisgICAqIEV4dHJhY3RzIHRoZSBtYXAgb2YgZ3JvdXBzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG1ldGhvZHMgZnJvbSB0aGUgPGNvZGU+Y2xhc3NlczwvY29kZT4uDQorICAgKi8NCisgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gZmluZEdyb3Vwc01ldGhvZHMoQ29sbGVjdGlvbjxJVGVzdENsYXNzPiBjbGFzc2VzLCBib29sZWFuIGJlZm9yZSkgew0KKyAgICBNYXA8U3RyaW5nLCBMaXN0PElUZXN0TkdNZXRob2Q+PiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisgICAgZm9yIChJVGVzdENsYXNzIGNscyA6IGNsYXNzZXMpIHsNCisgICAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcyA9IGJlZm9yZSA/IGNscy5nZXRCZWZvcmVHcm91cHNNZXRob2RzKCkgOiBjbHMuZ2V0QWZ0ZXJHcm91cHNNZXRob2RzKCk7DQorICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsNCisgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogYmVmb3JlID8gbWV0aG9kLmdldEJlZm9yZUdyb3VwcygpIDogbWV0aG9kLmdldEFmdGVyR3JvdXBzKCkpIHsNCisgICAgICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RMaXN0ID0gcmVzdWx0LmdldChncm91cCk7DQorICAgICAgICAgIGlmIChtZXRob2RMaXN0ID09IG51bGwpIHsNCisgICAgICAgICAgICBtZXRob2RMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICAgICAgICAgICAgcmVzdWx0LnB1dChncm91cCwgbWV0aG9kTGlzdCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgLy8gTk9URShjYmV1c3QsIDIwMDcvMDEvMjMpDQorICAgICAgICAgIC8vIEJlZm9yZUdyb3Vwcy9BZnRlckdyb3VwcyBtZXRob2RzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZS4NCisgICAgICAgICAgLy8gSSBzaG91bGQgcHJvYmFibHkgdXNlIGEgbWFwIGluc3RlYWQgb2YgYSBsaXN0IGZvciBhIGNvbnRhaW5zKCksIGJ1dA0KKyAgICAgICAgICAvLyB0aGlzIGxpc3Qgc2hvdWxkIHVzdWFsbHkgYmUgZmFpcmx5IHNob3J0DQorICAgICAgICAgIGlmICghIG1ldGhvZExpc3QuY29udGFpbnMobWV0aG9kKSkgew0KKyAgICAgICAgICAgIG1ldGhvZExpc3QuYWRkKG1ldGhvZCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaW5kR3JvdXBUcmFuc2l0aXZlQ2xvc3VyZShYbWxNZXRob2RTZWxlY3RvciB4bXMsDQorICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBpbmNsdWRlZE1ldGhvZHMsDQorICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBhbGxNZXRob2RzLA0KKyAgICAgIFN0cmluZ1tdIGluY2x1ZGVkR3JvdXBzLA0KKyAgICAgIFNldDxTdHJpbmc+IG91dEdyb3VwcywgU2V0PElUZXN0TkdNZXRob2Q+IG91dE1ldGhvZHMpDQorICB7DQorICAgIE1hcDxJVGVzdE5HTWV0aG9kLCBJVGVzdE5HTWV0aG9kPiBydW5uaW5nTWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IGluY2x1ZGVkTWV0aG9kcykgew0KKyAgICAgIHJ1bm5pbmdNZXRob2RzLnB1dChtLCBtKTsNCisgICAgfQ0KKw0KKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJ1bm5pbmdHcm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisgICAgZm9yIChTdHJpbmcgdGhpc0dyb3VwIDogaW5jbHVkZWRHcm91cHMpIHsNCisgICAgICBydW5uaW5nR3JvdXBzLnB1dCh0aGlzR3JvdXAsIHRoaXNHcm91cCk7DQorICAgIH0NCisNCisgICAgYm9vbGVhbiBrZWVwR29pbmcgPSB0cnVlOw0KKw0KKyAgICBNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gbmV3TWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKyAgICB3aGlsZSAoa2VlcEdvaW5nKSB7DQorICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBpbmNsdWRlZE1ldGhvZHMpIHsNCisNCisgICAgICAgIC8vDQorICAgICAgICAvLyBEZXBlbmRzIG9uIGdyb3Vwcz8NCisgICAgICAgIC8vIEFkZHMgYWxsIGluY2x1ZGVkIG1ldGhvZHMgdG8gcnVubmluZ01ldGhvZHMNCisgICAgICAgIC8vDQorICAgICAgICBTdHJpbmdbXSBpZyA9IG0uZ2V0R3JvdXBzRGVwZW5kZWRVcG9uKCk7DQorICAgICAgICBmb3IgKFN0cmluZyBnIDogaWcpIHsNCisgICAgICAgICAgaWYgKCEgcnVubmluZ0dyb3Vwcy5jb250YWluc0tleShnKSkgew0KKyAgICAgICAgICAgIC8vIEZvdW5kIGEgbmV3IGluY2x1ZGVkIGdyb3VwLCBhZGQgYWxsIHRoZSBtZXRob2RzIGl0IGNvbnRhaW5zIHRvDQorICAgICAgICAgICAgLy8gb3VyIG91dE1ldGhvZCBjbG9zdXJlDQorICAgICAgICAgICAgcnVubmluZ0dyb3Vwcy5wdXQoZywgZyk7DQorICAgICAgICAgICAgSVRlc3ROR01ldGhvZFtdIGltID0NCisgICAgICAgICAgICAgIE1ldGhvZEdyb3Vwc0hlbHBlci5maW5kTWV0aG9kc1RoYXRCZWxvbmdUb0dyb3VwKG0sDQorICAgICAgICAgICAgICAgICAgICBhbGxNZXRob2RzLnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbYWxsTWV0aG9kcy5zaXplKCldKSwgZyk7DQorICAgICAgICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIHRoaXNNZXRob2QgOiBpbSkgew0KKyAgICAgICAgICAgICAgaWYgKCEgcnVubmluZ01ldGhvZHMuY29udGFpbnNLZXkodGhpc01ldGhvZCkpIHsNCisgICAgICAgICAgICAgICAgcnVubmluZ01ldGhvZHMucHV0KHRoaXNNZXRob2QsIHRoaXNNZXRob2QpOw0KKyAgICAgICAgICAgICAgICBuZXdNZXRob2RzLnB1dCh0aGlzTWV0aG9kLCB0aGlzTWV0aG9kKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0gLy8gZ3JvdXBzDQorDQorICAgICAgICAvLw0KKyAgICAgICAgLy8gRGVwZW5kcyBvbiBtZXRob2RzPw0KKyAgICAgICAgLy8gQWRkcyBhbGwgZGVwZW5kZWQgbWV0aG9kcyB0byBydW5uaW5nTWV0aG9kcw0KKyAgICAgICAgLy8NCisgICAgICAgIFN0cmluZ1tdIG1kdSA9IG0uZ2V0TWV0aG9kc0RlcGVuZGVkVXBvbigpOw0KKyAgICAgICAgZm9yIChTdHJpbmcgdG0gOiBtZHUpIHsNCisgICAgICAgICAgSVRlc3ROR01ldGhvZCB0aGlzTWV0aG9kID0gTWV0aG9kR3JvdXBzSGVscGVyLmZpbmRNZXRob2ROYW1lZCh0bSwgYWxsTWV0aG9kcyk7DQorICAgICAgICAgIGlmICh0aGlzTWV0aG9kICE9IG51bGwgJiYgISBydW5uaW5nTWV0aG9kcy5jb250YWluc0tleSh0aGlzTWV0aG9kKSkgew0KKyAgICAgICAgICAgIHJ1bm5pbmdNZXRob2RzLnB1dCh0aGlzTWV0aG9kLCB0aGlzTWV0aG9kKTsNCisgICAgICAgICAgICBuZXdNZXRob2RzLnB1dCh0aGlzTWV0aG9kLCB0aGlzTWV0aG9kKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgIH0gLy8gbWV0aG9kcw0KKw0KKyAgICAgIC8vDQorICAgICAgLy8gT25seSBrZWVwIGdvaW5nIGlmIG5ldyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZA0KKyAgICAgIC8vDQorICAgICAga2VlcEdvaW5nID0gbmV3TWV0aG9kcy5zaXplKCkgPiAwOw0KKyAgICAgIGluY2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICAgIGluY2x1ZGVkTWV0aG9kcy5hZGRBbGwobmV3TWV0aG9kcy5rZXlTZXQoKSk7DQorICAgICAgbmV3TWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKyAgICB9IC8vIHdoaWxlIGtlZXBHb2luZw0KKw0KKyAgICBvdXRNZXRob2RzLmFkZEFsbChydW5uaW5nTWV0aG9kcy5rZXlTZXQoKSk7DQorICAgIG91dEdyb3Vwcy5hZGRBbGwocnVubmluZ0dyb3Vwcy5rZXlTZXQoKSk7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyBJVGVzdE5HTWV0aG9kIGZpbmRNZXRob2ROYW1lZChTdHJpbmcgdG0sIExpc3Q8SVRlc3ROR01ldGhvZD4gYWxsTWV0aG9kcykgew0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IGFsbE1ldGhvZHMpIHsNCisgICAgICAvLyBUT0RPKGNiZXVzdCk6ICBhY2NvdW50IGZvciBwYWNrYWdlDQorICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPQ0KKyAgICAgICAgbS5nZXRNZXRob2QoKS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIiArIG0uZ2V0TWV0aG9kTmFtZSgpOw0KKyAgICAgIGlmIChtZXRob2ROYW1lLmVxdWFscyh0bSkpIHsNCisgICAgICAgIHJldHVybiBtOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCisgIC8qKg0KKyAgICogT25seSB1c2VkIGlmIGEgZ3JvdXAgaXMgbWlzc2luZyB0byBmbGFnIGFuIGVycm9yIG9uIHRoYXQgbWV0aG9kDQorICAgKg0KKyAgICogQHBhcmFtIG1ldGhvZCBpZiBubyBncm91cCBpcyBmb3VuZCwgZ3JvdXAgcmVnZXggaXMgc2V0IGFzIHRoaXMgbWV0aG9kJ3MgbWlzc2luZyBncm91cA0KKyAgICogQHBhcmFtIG1ldGhvZHMgbGlzdCBvZiBtZXRob2RzIHRvIHNlYXJjaA0KKyAgICogQHBhcmFtIGdyb3VwUmVnZXhwIHJlZ2V4IHJlcHJlc2VudGluZyB0aGUgZ3JvdXANCisgICAqDQorICAgKiBAcmV0dXJuIGFsbCB0aGUgbWV0aG9kcyB0aGF0IGJlbG9uZyB0byB0aGUgZ3JvdXAgc3BlY2lmaWVkIGJ5IHRoZSByZWd1bGFyDQorICAgKiBleHByZXNzaW9uIGdyb3VwUmVnRXhwLiAgbWV0aG9kc1tdIGlzIHRoZSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyB3ZQ0KKyAgICogYXJlIGNob29zaW5nIGZyb20gYW5kIG1ldGhvZCBpcyB0aGUgbWV0aG9kIHRoYXQgb3ducyB0aGUgZGVwZW5kc09uR3JvdXBzDQorICAgKiBzdGF0ZW1lbnQgKG9ubHkgdXNlZCBpZiBhIGdyb3VwIGlzIG1pc3NpbmcgdG8gZmxhZyBhbiBlcnJvciBvbiB0aGF0IG1ldGhvZCkuDQorICAgKi8NCisgIHByb3RlY3RlZCBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGZpbmRNZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXAoDQorICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QsDQorICAgICAgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsIFN0cmluZyBncm91cFJlZ2V4cCkNCisgIHsNCisgICAgSVRlc3ROR01ldGhvZFtdIGZvdW5kID0gZmluZE1ldGhvZHNUaGF0QmVsb25nVG9Hcm91cChtZXRob2RzLCBncm91cFJlZ2V4cCk7DQorDQorICAgIGlmIChmb3VuZC5sZW5ndGggPT0gMCkgew0KKyAgICAgIG1ldGhvZC5zZXRNaXNzaW5nR3JvdXAoZ3JvdXBSZWdleHApOw0KKyAgICB9DQorDQorICAgIHJldHVybiBmb3VuZDsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIG1ldGhvZHMgbGlzdCBvZiBtZXRob2RzIHRvIHNlYXJjaA0KKyAgICogQHBhcmFtIGdyb3VwUmVnZXhwIHJlZ2V4IHJlcHJlc2VudGluZyB0aGUgZ3JvdXANCisgICAqDQorICAgKiBAcmV0dXJuIGFsbCB0aGUgbWV0aG9kcyB0aGF0IGJlbG9uZyB0byB0aGUgZ3JvdXAgc3BlY2lmaWVkIGJ5IHRoZSByZWd1bGFyDQorICAgKiBleHByZXNzaW9uIGdyb3VwUmVnRXhwLiAgbWV0aG9kc1tdIGlzIHRoZSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyB3ZQ0KKyAgICogYXJlIGNob29zaW5nIGZyb20uDQorICAgKi8NCisgIHByb3RlY3RlZCBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGZpbmRNZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXAoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMsIFN0cmluZyBncm91cFJlZ2V4cCkNCisgIHsNCisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiB2UmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICAgIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IGdldFBhdHRlcm4oZ3JvdXBSZWdleHApOw0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgdG0gOiBtZXRob2RzKSB7DQorICAgICAgU3RyaW5nW10gZ3JvdXBzID0gdG0uZ2V0R3JvdXBzKCk7DQorICAgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsNCisgICAgICAgIEJvb2xlYW4gbWF0Y2ggPSBpc01hdGNoKHBhdHRlcm4sIGdyb3VwKTsNCisgICAgICAgIGlmIChtYXRjaCkgew0KKyAgICAgICAgICB2UmVzdWx0LmFkZCh0bSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiB2UmVzdWx0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbdlJlc3VsdC5zaXplKCldKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gaXNNYXRjaChQYXR0ZXJuIHBhdHRlcm4sIFN0cmluZyBncm91cCkgew0KKyAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBjYWNoZUtleSA9IFBhaXIuY3JlYXRlKHBhdHRlcm4ucGF0dGVybigpLCBncm91cCk7DQorICAgIEJvb2xlYW4gbWF0Y2ggPSBNQVRDSF9DQUNIRS5nZXQoY2FjaGVLZXkpOw0KKyAgICBpZiAobWF0Y2ggPT0gbnVsbCkgew0KKyAgICAgIG1hdGNoID0gcGF0dGVybi5tYXRjaGVyKGdyb3VwKS5tYXRjaGVzKCk7DQorICAgICAgTUFUQ0hfQ0FDSEUucHV0KGNhY2hlS2V5LCBtYXRjaCk7DQorICAgIH0NCisgICAgcmV0dXJuIG1hdGNoOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBnZXRQYXR0ZXJuKFN0cmluZyBncm91cFJlZ2V4cCkgew0KKyAgICBQYXR0ZXJuIGdyb3VwUGF0dGVybiA9IFBBVFRFUk5fQ0FDSEUuZ2V0KGdyb3VwUmVnZXhwKTsNCisgICAgaWYgKGdyb3VwUGF0dGVybiA9PSBudWxsKSB7DQorICAgICAgZ3JvdXBQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKGdyb3VwUmVnZXhwKTsNCisgICAgICBQQVRURVJOX0NBQ0hFLnB1dChncm91cFJlZ2V4cCwgZ3JvdXBQYXR0ZXJuKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZ3JvdXBQYXR0ZXJuOw0KKyAgfQ0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kSGVscGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NjZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0QW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdE9yQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25IZWxwZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuY29sbGVjdGlvbnMuUGFpcjsNCisNCisvKioNCisgKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIGhlbHAgc29ydCBhbmQgYXJyYW5nZSBtZXRob2RzLg0KKyAqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPg0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1bYXRdZXZvbHZhW2RvdF1ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIE1ldGhvZEhlbHBlciB7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SVRlc3ROR01ldGhvZFtdLCBHcmFwaDxJVGVzdE5HTWV0aG9kPj4gR1JBUEhfQ0FDSEUgPQ0KKyAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPE1ldGhvZCwgU3RyaW5nPiBDQU5PTklDQUxfTkFNRV9DQUNIRSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIEJvb2xlYW4+IE1BVENIX0NBQ0hFID0NCisgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsNCisNCisgIC8qKg0KKyAgICogQ29sbGVjdHMgYW5kIG9yZGVycyB0ZXN0IG9yIGNvbmZpZ3VyYXRpb24gbWV0aG9kcw0KKyAgICogQHBhcmFtIG1ldGhvZHMgbWV0aG9kcyB0byBiZSB3b3JrZWQgb24NCisgICAqIEBwYXJhbSBmb3JUZXN0cyB0cnVlIGZvciB0ZXN0IG1ldGhvZHMsIGZhbHNlIGZvciBjb25maWd1cmF0aW9uIG1ldGhvZHMNCisgICAqIEBwYXJhbSBydW5JbmZvDQorICAgKiBAcGFyYW0gZmluZGVyIGFubm90YXRpb24gZmluZGVyDQorICAgKiBAcGFyYW0gdW5pcXVlIHRydWUgZm9yIHVuaXF1ZSBtZXRob2RzLCBmYWxzZSBvdGhlcndpc2UNCisgICAqIEBwYXJhbSBvdXRFeGNsdWRlZE1ldGhvZHMNCisgICAqIEByZXR1cm4gbGlzdCBvZiBvcmRlcmVkIG1ldGhvZHMNCisgICAqLw0KKyAgcHVibGljIHN0YXRpYyBJVGVzdE5HTWV0aG9kW10gY29sbGVjdEFuZE9yZGVyTWV0aG9kcyhMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHMsDQorICAgICAgYm9vbGVhbiBmb3JUZXN0cywgUnVuSW5mbyBydW5JbmZvLCBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsDQorICAgICAgYm9vbGVhbiB1bmlxdWUsIExpc3Q8SVRlc3ROR01ldGhvZD4gb3V0RXhjbHVkZWRNZXRob2RzKQ0KKyAgew0KKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGluY2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICBNZXRob2RHcm91cHNIZWxwZXIuY29sbGVjdE1ldGhvZHNCeUdyb3VwKG1ldGhvZHMudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFttZXRob2RzLnNpemUoKV0pLA0KKyAgICAgICAgZm9yVGVzdHMsDQorICAgICAgICBpbmNsdWRlZE1ldGhvZHMsDQorICAgICAgICBvdXRFeGNsdWRlZE1ldGhvZHMsDQorICAgICAgICBydW5JbmZvLA0KKyAgICAgICAgZmluZGVyLA0KKyAgICAgICAgdW5pcXVlKTsNCisNCisgICAgcmV0dXJuIHNvcnRNZXRob2RzKGZvclRlc3RzLCBpbmNsdWRlZE1ldGhvZHMsIGZpbmRlcikudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFtde30pOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBGaW5kcyBUZXN0TkcgbWV0aG9kcyB0aGF0IHRoZSBzcGVjaWZpZWQgVGVzdE5HIG1ldGhvZCBkZXBlbmRzIHVwb24NCisgICAqIEBwYXJhbSBtIFRlc3RORyBtZXRob2QNCisgICAqIEBwYXJhbSBtZXRob2RzIGxpc3Qgb2YgbWV0aG9kcyB0byBzZWFyY2ggZm9yIGRlcGVuZGVkIHVwb24gbWV0aG9kcw0KKyAgICogQHJldHVybiBsaXN0IG9mIG1ldGhvZHMgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWENCisgICAqLw0KKyAgcHJvdGVjdGVkIHN0YXRpYyBJVGVzdE5HTWV0aG9kW10gZmluZERlcGVuZGVkVXBvbk1ldGhvZHMoSVRlc3ROR01ldGhvZCBtLA0KKyAgICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzKQ0KKyAgew0KKyAgICBTdHJpbmcgY2Fub25pY2FsTWV0aG9kTmFtZSA9IGNhbGN1bGF0ZU1ldGhvZENhbm9uaWNhbE5hbWUobSk7DQorICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICBTdHJpbmcgcmVnZXhwID0gbnVsbDsNCisgICAgZm9yIChTdHJpbmcgZnVsbHlRdWFsaWZpZWRSZWdleHAgOiBtLmdldE1ldGhvZHNEZXBlbmRlZFVwb24oKSkgew0KKyAgICAgIGJvb2xlYW4gZm91bmRBdExlYXN0QU1ldGhvZCA9IGZhbHNlOw0KKw0KKyAgICAgIGlmIChudWxsICE9IGZ1bGx5UXVhbGlmaWVkUmVnZXhwKSB7DQorICAgICAgICAvLyBFc2NhcGVzICQgaW4gcmVnZXhwcyBhcyBpdCBpcyBub3QgbWVhbnQgZm9yIGVuZCAtIGxpbmUgbWF0Y2hpbmcsIGJ1dCBpbm5lciBjbGFzcyBtYXRjaGVzLg0KKyAgICAgICAgcmVnZXhwID0gZnVsbHlRdWFsaWZpZWRSZWdleHAucmVwbGFjZSgiJCIsICJcXCQiKTsNCisgICAgICAgIGJvb2xlYW4gdXNlUGFja2FnZSA9IHJlZ2V4cC5pbmRleE9mKCcuJykgIT0gLTE7DQorICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXhwKTsNCisNCisgICAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7DQorICAgICAgICAgIE1ldGhvZCB0aGlzTWV0aG9kID0gbWV0aG9kLmdldE1ldGhvZCgpOw0KKyAgICAgICAgICBTdHJpbmcgdGhpc01ldGhvZE5hbWUgPSB0aGlzTWV0aG9kLmdldE5hbWUoKTsNCisgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSB1c2VQYWNrYWdlID8NCisgICAgICAgICAgICAgIGNhbGN1bGF0ZU1ldGhvZENhbm9uaWNhbE5hbWUodGhpc01ldGhvZCkNCisgICAgICAgICAgICAgIDogdGhpc01ldGhvZE5hbWU7DQorICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IGNhY2hlS2V5ID0gUGFpci5jcmVhdGUocmVnZXhwLCBtZXRob2ROYW1lKTsNCisgICAgICAgICAgQm9vbGVhbiBtYXRjaCA9IE1BVENIX0NBQ0hFLmdldChjYWNoZUtleSk7DQorICAgICAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4ubWF0Y2hlcihtZXRob2ROYW1lKS5tYXRjaGVzKCk7DQorICAgICAgICAgICAgICBNQVRDSF9DQUNIRS5wdXQoY2FjaGVLZXksIG1hdGNoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAobWF0Y2gpIHsNCisgICAgICAgICAgICB2UmVzdWx0LmFkZChtZXRob2QpOw0KKyAgICAgICAgICAgIGZvdW5kQXRMZWFzdEFNZXRob2QgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGlmICghZm91bmRBdExlYXN0QU1ldGhvZCkgew0KKyAgICAgICAgaWYgKG0uaWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcygpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG0uaXNBbHdheXNSdW4oKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIE1ldGhvZCBtYXliZVJlZmVycmluZ1RvID0gZmluZE1ldGhvZEJ5TmFtZShtLCByZWdleHApOw0KKyAgICAgICAgaWYgKG1heWJlUmVmZXJyaW5nVG8gIT0gbnVsbCkgew0KKyAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKGNhbm9uaWNhbE1ldGhvZE5hbWUgKyAiKCkgaXMgZGVwZW5kaW5nIG9uIG1ldGhvZCAiDQorICAgICAgICAgICAgICArIG1heWJlUmVmZXJyaW5nVG8gKyAiLCB3aGljaCBpcyBub3QgYW5ub3RhdGVkIHdpdGggQFRlc3Qgb3Igbm90IGluY2x1ZGVkLiIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihjYW5vbmljYWxNZXRob2ROYW1lDQorICAgICAgICAgICAgKyAiKCkgZGVwZW5kcyBvbiBub25leGlzdGVudCBtZXRob2QgIiArIHJlZ2V4cCk7DQorICAgICAgfQ0KKyAgICB9Ly9lbmQgZm9yDQorDQorICAgIHJldHVybiB2UmVzdWx0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbdlJlc3VsdC5zaXplKCldKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogRmluZHMgbWV0aG9kIGJhc2VkIG9uIHJlZ2V4IGFuZCBUZXN0TkdNZXRob2QuIElmIHJlZ2V4IGRvZXNuJ3QgcmVwcmVzZW50IHRoZQ0KKyAgICogY2xhc3MgbmFtZSwgdXNlcyB0aGUgVGVzdE5HIG1ldGhvZCdzIGNsYXNzIG5hbWUuDQorICAgKiBAcGFyYW0gdGVzdG5nTWV0aG9kIFRlc3RORyBtZXRob2QNCisgICAqIEBwYXJhbSByZWdFeHAgcmVnZXggcmVwcmVzZW50aW5nIGEgbWV0aG9kIGFuZC9vciByZWxhdGVkIGNsYXNzIG5hbWUNCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRNZXRob2RCeU5hbWUoSVRlc3ROR01ldGhvZCB0ZXN0bmdNZXRob2QsIFN0cmluZyByZWdFeHApIHsNCisgICAgaWYgKHJlZ0V4cCA9PSBudWxsKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisgICAgaW50IGxhc3REb3QgPSByZWdFeHAubGFzdEluZGV4T2YoJy4nKTsNCisgICAgU3RyaW5nIGNsYXNzTmFtZSwgbWV0aG9kTmFtZTsNCisgICAgaWYgKGxhc3REb3QgPT0gLTEpIHsNCisgICAgICBjbGFzc05hbWUgPSB0ZXN0bmdNZXRob2QuZ2V0TWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7DQorICAgICAgbWV0aG9kTmFtZSA9IHJlZ0V4cDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtZXRob2ROYW1lID0gcmVnRXhwLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7DQorICAgICAgY2xhc3NOYW1lID0gcmVnRXhwLnN1YnN0cmluZygwLCBsYXN0RG90KTsNCisgICAgfQ0KKw0KKyAgICB0cnkgew0KKyAgICAgIENsYXNzPD8+IGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7DQorICAgICAgZm9yIChNZXRob2QgbSA6IGMuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsNCisgICAgICAgIGlmIChtZXRob2ROYW1lLmVxdWFscyhtLmdldE5hbWUoKSkpIHsNCisgICAgICAgICAgcmV0dXJuIG07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgIC8vb25seSBsb2dnaW5nDQorICAgICAgVXRpbHMubG9nKCJNZXRob2RIZWxwZXIiLCAzLCAiQ2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSBzZWFyY2hpbmcgZm9yIG1ldGhvZHMgdXNpbmcgcmVnZXgiKTsNCisgICAgfQ0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCisgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoQ2xhc3M8Pz4gb2JqZWN0Q2xhc3MsIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgew0KKyAgICBJVGVzdEFubm90YXRpb24gdGVzdENsYXNzQW5ub3RhdGlvbiA9IEFubm90YXRpb25IZWxwZXIuZmluZFRlc3QoZmluZGVyLCBvYmplY3RDbGFzcyk7DQorICAgIHJldHVybiBpc0VuYWJsZWQodGVzdENsYXNzQW5ub3RhdGlvbik7DQorICB9DQorDQorICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE1ldGhvZCBtLCBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpIHsNCisgICAgSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRUZXN0KGZpbmRlciwgbSk7DQorDQorICAgIC8vIElmIG5vIG1ldGhvZCBhbm5vdGF0aW9uLCBsb29rIGZvciBvbmUgb24gdGhlIGNsYXNzDQorICAgIGlmIChudWxsID09IGFubm90YXRpb24pIHsNCisgICAgICBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChmaW5kZXIsIG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIGlzRW5hYmxlZChhbm5vdGF0aW9uKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoSVRlc3RPckNvbmZpZ3VyYXRpb24gdGVzdCkgew0KKyAgICByZXR1cm4gbnVsbCA9PSB0ZXN0IHx8IHRlc3QuZ2V0RW5hYmxlZCgpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBFeHRyYWN0cyB0aGUgdW5pcXVlIGxpc3Qgb2YgPGNvZGU+SVRlc3ROR01ldGhvZDwvY29kZT5zLg0KKyAgICovDQorICBwdWJsaWMgc3RhdGljIExpc3Q8SVRlc3ROR01ldGhvZD4gdW5pcXVlTWV0aG9kTGlzdChDb2xsZWN0aW9uPExpc3Q8SVRlc3ROR01ldGhvZD4+IG1ldGhvZHMpIHsNCisgICAgU2V0PElUZXN0TkdNZXRob2Q+IHJlc3VsdFNldCA9IFNldHMubmV3SGFzaFNldCgpOw0KKw0KKyAgICBmb3IgKExpc3Q8SVRlc3ROR01ldGhvZD4gbCA6IG1ldGhvZHMpIHsNCisgICAgICByZXN1bHRTZXQuYWRkQWxsKGwpOw0KKyAgICB9DQorDQorICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QocmVzdWx0U2V0KTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIEdyYXBoPElUZXN0TkdNZXRob2Q+IHRvcG9sb2dpY2FsU29ydChJVGVzdE5HTWV0aG9kW10gbWV0aG9kcywNCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHNlcXVlbnRpYWxMaXN0LCBMaXN0PElUZXN0TkdNZXRob2Q+IHBhcmFsbGVsTGlzdCkgew0KKyAgICBHcmFwaDxJVGVzdE5HTWV0aG9kPiByZXN1bHQgPSBuZXcgR3JhcGg8PigpOw0KKw0KKyAgICBpZiAobWV0aG9kcy5sZW5ndGggPT0gMCkgew0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgLy8NCisgICAgLy8gQ3JlYXRlIHRoZSBncmFwaA0KKyAgICAvLw0KKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsNCisgICAgICByZXN1bHQuYWRkTm9kZShtKTsNCisNCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHByZWRlY2Vzc29ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKw0KKyAgICAgIFN0cmluZ1tdIG1ldGhvZHNEZXBlbmRlZFVwb24gPSBtLmdldE1ldGhvZHNEZXBlbmRlZFVwb24oKTsNCisgICAgICBTdHJpbmdbXSBncm91cHNEZXBlbmRlZFVwb24gPSBtLmdldEdyb3Vwc0RlcGVuZGVkVXBvbigpOw0KKyAgICAgIGlmIChtZXRob2RzRGVwZW5kZWRVcG9uLmxlbmd0aCA+IDApIHsNCisgICAgICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzTmFtZWQgPQ0KKyAgICAgICAgICBNZXRob2RIZWxwZXIuZmluZERlcGVuZGVkVXBvbk1ldGhvZHMobSwgbWV0aG9kcyk7DQorICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgcHJlZCA6IG1ldGhvZHNOYW1lZCkgew0KKyAgICAgICAgICBwcmVkZWNlc3NvcnMuYWRkKHByZWQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoZ3JvdXBzRGVwZW5kZWRVcG9uLmxlbmd0aCA+IDApIHsNCisgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogZ3JvdXBzRGVwZW5kZWRVcG9uKSB7DQorICAgICAgICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXAgPQ0KKyAgICAgICAgICAgIE1ldGhvZEdyb3Vwc0hlbHBlci5maW5kTWV0aG9kc1RoYXRCZWxvbmdUb0dyb3VwKG0sIG1ldGhvZHMsIGdyb3VwKTsNCisgICAgICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIHByZWQgOiBtZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXApIHsNCisgICAgICAgICAgICBwcmVkZWNlc3NvcnMuYWRkKHByZWQpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBwcmVkZWNlc3NvciA6IHByZWRlY2Vzc29ycykgew0KKyAgICAgICAgcmVzdWx0LmFkZFByZWRlY2Vzc29yKG0sIHByZWRlY2Vzc29yKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgcmVzdWx0LnRvcG9sb2dpY2FsU29ydCgpOw0KKyAgICBzZXF1ZW50aWFsTGlzdC5hZGRBbGwocmVzdWx0LmdldFN0cmljdGx5U29ydGVkTm9kZXMoKSk7DQorICAgIHBhcmFsbGVsTGlzdC5hZGRBbGwocmVzdWx0LmdldEluZGVwZW5kZW50Tm9kZXMoKSk7DQorDQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVNZXRob2RDYW5vbmljYWxOYW1lKElUZXN0TkdNZXRob2QgbSkgew0KKyAgICByZXR1cm4gY2FsY3VsYXRlTWV0aG9kQ2Fub25pY2FsTmFtZShtLmdldE1ldGhvZCgpKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVNZXRob2RDYW5vbmljYWxOYW1lKE1ldGhvZCBtKSB7DQorICAgIFN0cmluZyByZXN1bHQgPSBDQU5PTklDQUxfTkFNRV9DQUNIRS5nZXQobSk7DQorICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgew0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIiArIG0uZ2V0TmFtZSgpOw0KKw0KKyAgICAvLyBUcnkgdG8gZmluZCB0aGUgbWV0aG9kIG9uIHRoaXMgY2xhc3Mgb3IgcGFyZW50cw0KKyAgICBDbGFzczw/PiBjbHMgPSBtLmdldERlY2xhcmluZ0NsYXNzKCk7DQorICAgIHdoaWxlIChjbHMgIT0gT2JqZWN0LmNsYXNzKSB7DQorICAgICAgdHJ5IHsNCisgICAgICAgIGlmIChjbHMuZ2V0RGVjbGFyZWRNZXRob2QobS5nZXROYW1lKCksIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICBwYWNrYWdlTmFtZSA9IGNscy5nZXROYW1lKCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgIC8vIGlnbm9yZQ0KKyAgICAgIH0NCisgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOw0KKyAgICB9DQorDQorICAgIHJlc3VsdCA9IHBhY2thZ2VOYW1lICsgIi4iICsgbS5nZXROYW1lKCk7DQorICAgIENBTk9OSUNBTF9OQU1FX0NBQ0hFLnB1dChtLCByZXN1bHQpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxJVGVzdE5HTWV0aG9kPiBzb3J0TWV0aG9kcyhib29sZWFuIGZvclRlc3RzLA0KKyAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gYWxsTWV0aG9kcywgSUFubm90YXRpb25GaW5kZXIgZmluZGVyKSB7DQorICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gc2wgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBwbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICBJVGVzdE5HTWV0aG9kW10gYWxsTWV0aG9kc0FycmF5ID0gYWxsTWV0aG9kcy50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW2FsbE1ldGhvZHMuc2l6ZSgpXSk7DQorDQorICAgIC8vIEZpeCB0aGUgbWV0aG9kIGluaGVyaXRhbmNlIGlmIHRoZXNlIGFyZSBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHRvIG1ha2UNCisgICAgLy8gc3VyZSBiYXNlIGNsYXNzZXMgYXJlIGludm9rZWQgYmVmb3JlIGNoaWxkIGNsYXNzZXMgaWYgJ2JlZm9yZScgYW5kIHRoZQ0KKyAgICAvLyBvdGhlciB3YXkgYXJvdW5kIGlmIHRoZXkgYXJlICdhZnRlcicNCisgICAgaWYgKCFmb3JUZXN0cyAmJiBhbGxNZXRob2RzQXJyYXkubGVuZ3RoID4gMCkgew0KKyAgICAgIElUZXN0TkdNZXRob2QgbSA9IGFsbE1ldGhvZHNBcnJheVswXTsNCisgICAgICBib29sZWFuIGJlZm9yZSA9IG0uaXNCZWZvcmVDbGFzc0NvbmZpZ3VyYXRpb24oKQ0KKyAgICAgICAgICB8fCBtLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpIHx8IG0uaXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24oKQ0KKyAgICAgICAgICB8fCBtLmlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKTsNCisgICAgICBNZXRob2RJbmhlcml0YW5jZS5maXhNZXRob2RJbmhlcml0YW5jZShhbGxNZXRob2RzQXJyYXksIGJlZm9yZSk7DQorICAgIH0NCisNCisgICAgdG9wb2xvZ2ljYWxTb3J0KGFsbE1ldGhvZHNBcnJheSwgc2wsIHBsKTsNCisNCisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgcmVzdWx0LmFkZEFsbChzbCk7DQorICAgIHJlc3VsdC5hZGRBbGwocGwpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIEEgc29ydGVkIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBtZXRob2RzICdtZXRob2QnIGRlcGVuZHMgb24NCisgICAqLw0KKyAgcHVibGljIHN0YXRpYyBMaXN0PElUZXN0TkdNZXRob2Q+IGdldE1ldGhvZHNEZXBlbmRlZFVwb24oSVRlc3ROR01ldGhvZCBtZXRob2QsIElUZXN0TkdNZXRob2RbXSBtZXRob2RzKSB7DQorICAgIEdyYXBoPElUZXN0TkdNZXRob2Q+IGcgPSBHUkFQSF9DQUNIRS5nZXQobWV0aG9kcyk7DQorICAgIGlmIChnID09IG51bGwpIHsNCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHBhcmFsbGVsTGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKyAgICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gc2VxdWVudGlhbExpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgICBnID0gdG9wb2xvZ2ljYWxTb3J0KG1ldGhvZHMsIHNlcXVlbnRpYWxMaXN0LCBwYXJhbGxlbExpc3QpOw0KKyAgICAgIEdSQVBIX0NBQ0hFLnB1dChtZXRob2RzLCBnKTsNCisgICAgfQ0KKw0KKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IGcuZmluZFByZWRlY2Vzc29ycyhtZXRob2QpOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHN0YXRpYyBJdGVyYXRvcjxPYmplY3RbXT4gY3JlYXRlQXJyYXlJdGVyYXRvcihmaW5hbCBPYmplY3RbXVtdIG9iamVjdHMpIHsNCisgICAgQXJyYXlJdGVyYXRvciByZXN1bHQgPSBuZXcgQXJyYXlJdGVyYXRvcihvYmplY3RzKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZU1ldGhvZENhbm9uaWNhbE5hbWUoQ2xhc3M8Pz4gbWV0aG9kQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7DQorICAgIFNldDxNZXRob2Q+IG1ldGhvZHMgPSBDbGFzc0hlbHBlci5nZXRBdmFpbGFibGVNZXRob2RzKG1ldGhvZENsYXNzKTsgLy8gVEVTVE5HLTEzOQ0KKyAgICBNZXRob2QgcmVzdWx0ID0gbnVsbDsNCisgICAgZm9yIChNZXRob2QgbSA6IG1ldGhvZHMpIHsNCisgICAgICBpZiAobWV0aG9kTmFtZS5lcXVhbHMobS5nZXROYW1lKCkpKSB7DQorICAgICAgICByZXN1bHQgPSBtOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IGNhbGN1bGF0ZU1ldGhvZENhbm9uaWNhbE5hbWUocmVzdWx0KSA6IG51bGw7DQorICB9DQorDQorICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgY2FsY3VsYXRlVGltZU91dChJVGVzdE5HTWV0aG9kIHRtKSB7DQorICAgIGxvbmcgcmVzdWx0ID0gdG0uZ2V0VGltZU91dCgpID4gMCA/IHRtLmdldFRpbWVPdXQoKSA6IHRtLmdldEludm9jYXRpb25UaW1lT3V0KCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorfQ0KKw0KKy8qKg0KKyAqIEN1c3RvbSBpdGVyYXRvciBjbGFzcyBvdmVyIGEgMkQgYXJyYXkNCisgKg0KKyAqLw0KK2NsYXNzIEFycmF5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxPYmplY3RbXT4gew0KKyAgcHJpdmF0ZSBPYmplY3RbXVtdIG1fb2JqZWN0czsNCisgIHByaXZhdGUgaW50IG1fY291bnQ7DQorDQorICBwdWJsaWMgQXJyYXlJdGVyYXRvcihPYmplY3RbXVtdIG9iamVjdHMpIHsNCisgICAgbV9vYmplY3RzID0gb2JqZWN0czsNCisgICAgbV9jb3VudCA9IDA7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7DQorICAgIHJldHVybiBtX2NvdW50IDwgbV9vYmplY3RzLmxlbmd0aDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE9iamVjdFtdIG5leHQoKSB7DQorICAgIGlmIChtX2NvdW50ID49IG1fb2JqZWN0cy5sZW5ndGgpIHsNCisgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KKyAgICB9DQorICAgIHJldHVybiBtX29iamVjdHNbbV9jb3VudCsrXTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW92ZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGl0ZXJhdG9yIik7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbmhlcml0YW5jZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL01ldGhvZEluaGVyaXRhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmUzZDU3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbmhlcml0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworcHVibGljIGNsYXNzIE1ldGhvZEluaGVyaXRhbmNlIHsKKyAgLyoqCisgICAqIExvb2sgaW4gbWFwIGZvciBhIGNsYXNzIHRoYXQgaXMgYSBzdXBlcmNsYXNzIG9mIG1ldGhvZENsYXNzCisgICAqLworICBwcml2YXRlIHN0YXRpYyBMaXN0PElUZXN0TkdNZXRob2Q+IGZpbmRNZXRob2RMaXN0U3VwZXJDbGFzcyhNYXA8Q2xhc3MsIExpc3Q8SVRlc3ROR01ldGhvZD4+IG1hcCwKKyAgICAgIENsYXNzPCA/IGV4dGVuZHMgSVRlc3ROR01ldGhvZD4gbWV0aG9kQ2xhc3MpCisgIHsKKyAgICBmb3IgKE1hcC5FbnRyeTxDbGFzcywgTGlzdDxJVGVzdE5HTWV0aG9kPj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmlzQXNzaWduYWJsZUZyb20obWV0aG9kQ2xhc3MpKSB7CisgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBMb29rIGluIG1hcCBmb3IgYSBjbGFzcyB0aGF0IGlzIGEgc3ViY2xhc3Mgb2YgbWV0aG9kQ2xhc3MKKyAgICovCisgIHByaXZhdGUgc3RhdGljIENsYXNzIGZpbmRTdWJDbGFzcyhNYXA8Q2xhc3MsIExpc3Q8SVRlc3ROR01ldGhvZD4+IG1hcCwKKyAgICAgIENsYXNzPCA/IGV4dGVuZHMgSVRlc3ROR01ldGhvZD4gbWV0aG9kQ2xhc3MpCisgIHsKKyAgICBmb3IgKENsYXNzIGNscyA6IG1hcC5rZXlTZXQoKSkgeworICAgICAgaWYgKG1ldGhvZENsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICByZXR1cm4gY2xzOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEZpeCB0aGUgbWV0aG9kc0RlcGVuZGVkVXBvbiB0byBtYWtlIHN1cmUgdGhhdCBAQ29uZmlndXJhdGlvbiBtZXRob2RzCisgICAqIHJlc3BlY3QgaW5oZXJpdGFuY2UgKGJlZm9yZSBtZXRob2RzIGFyZSBpbnZva2VkIGluIHRoZSBvcmRlciBCYXNlIGZpcnN0CisgICAqIGFuZCBhZnRlciBtZXRob2RzIGFyZSBpbnZva2VkIGluIHRoZSBvcmRlciBDaGlsZCBmaXJzdCkKKyAgICoKKyAgICogQHBhcmFtIG1ldGhvZHMgdGhlIGxpc3Qgb2YgbWV0aG9kcworICAgKiBAcGFyYW0gYmVmb3JlIHRydWUgaWYgd2UgYXJlIGhhbmRsaW5nIGEgYmVmb3JlIG1ldGhvZCAobWVhbmluZywgdGhlIG1ldGhvZHMKKyAgICogbmVlZCB0byBiZSBzb3J0ZWQgYmFzZSBjbGFzcyBmaXJzdCBhbmQgc3ViY2xhc3MgbGFzdCkuIGZhbHNlIG90aGVyd2lzZSAoc3ViY2xhc3MKKyAgICogbWV0aG9kcyBmaXJzdCwgYmFzZSBjbGFzc2VzIGxhc3QpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGZpeE1ldGhvZEluaGVyaXRhbmNlKElUZXN0TkdNZXRob2RbXSBtZXRob2RzLCBib29sZWFuIGJlZm9yZSkgeworICAgIC8vIE1hcCBvZiBjbGFzc2VzIC0+IExpc3Qgb2YgbWV0aG9kcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsYXNzIG9yIHNhbWUgaGllcmFyY2h5CisgICAgTWFwPENsYXNzLCBMaXN0PElUZXN0TkdNZXRob2Q+PiBtYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgIC8vCisgICAgLy8gUHV0IHRoZSBsaXN0IG9mIG1ldGhvZHMgaW4gdGhlaXIgaGllcmFyY2h5IGJ1Y2tldHMKKyAgICAvLworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICBDbGFzczwgPyBleHRlbmRzIElUZXN0TkdNZXRob2Q+IG1ldGhvZENsYXNzID0gbWV0aG9kLmdldFJlYWxDbGFzcygpOworICAgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBsID0gZmluZE1ldGhvZExpc3RTdXBlckNsYXNzKG1hcCwgbWV0aG9kQ2xhc3MpOworICAgICAgaWYgKG51bGwgIT0gbCkgeworICAgICAgICBsLmFkZChtZXRob2QpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIENsYXNzIHN1YkNsYXNzID0gZmluZFN1YkNsYXNzKG1hcCwgbWV0aG9kQ2xhc3MpOworICAgICAgICBpZiAobnVsbCAhPSBzdWJDbGFzcykgeworICAgICAgICAgIGwgPSBtYXAuZ2V0KHN1YkNsYXNzKTsKKyAgICAgICAgICBsLmFkZChtZXRob2QpOworICAgICAgICAgIG1hcC5yZW1vdmUoc3ViQ2xhc3MpOworICAgICAgICAgIG1hcC5wdXQobWV0aG9kQ2xhc3MsIGwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICBsLmFkZChtZXRob2QpOworICAgICAgICAgIG1hcC5wdXQobWV0aG9kQ2xhc3MsIGwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBFYWNoIGJ1Y2tldCB0aGF0IGhhcyBhIGxpc3QgYmlnZ2VyIHRoYW4gb25lIGVsZW1lbnQgZ2V0cyBzb3J0ZWQKKyAgICAvLworICAgIGZvciAoTGlzdDxJVGVzdE5HTWV0aG9kPiBsIDogbWFwLnZhbHVlcygpKSB7CisgICAgICBpZiAobC5zaXplKCkgPiAxKSB7CisgICAgICAgIC8vIFNvcnQgdGhlbQorICAgICAgICBzb3J0TWV0aG9kc0J5SW5oZXJpdGFuY2UobCwgYmVmb3JlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgU2V0IG1ldGhvZERlcGVuZGVkVXBvbiBhY2NvcmRpbmdseQorICAgICAgICAgKiAgRS5nLiBCYXNlIGNsYXNzIGNhbiBoYXZlIG11bHRpcGxlIEBCZWZvcmVDbGFzcyBtZXRob2RzLiBOZWVkIHRvIGVuc3VyZQorICAgICAgICAgKiAgdGhhdCBAQmVmb3JlQ2xhc3MgbWV0aG9kcyBpbiBkZXJpdmVkIGNsYXNzIGRlcGVuZCBvbiBhbGwgQEJlZm9yZUNsYXNzIG1ldGhvZHMKKyAgICAgICAgICogIG9mIGJhc2UgY2xhc3MuIFZpY2UgdmVyc2EgZm9yIEBBZnRlclhYWCBtZXRob2RzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGwuc2l6ZSgpIC0gMTsgaSsrKSB7CisgICAgICAgICAgSVRlc3ROR01ldGhvZCBtMSA9IGwuZ2V0KGkpOworICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGwuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIElUZXN0TkdNZXRob2QgbTIgPSBsLmdldChqKTsKKyAgICAgICAgICAgIGlmICghZXF1YWxzRWZmZWN0aXZlQ2xhc3MobTEsIG0yKSAmJiAhZGVwZW5kZW5jeUV4aXN0cyhtMSwgbTIsIG1ldGhvZHMpKSB7CisgICAgICAgICAgICAgIFV0aWxzLmxvZygiTWV0aG9kSW5oZXJpdGFuY2UiLCA0LCBtMiArICIgREVQRU5EUyBPTiAiICsgbTEpOworICAgICAgICAgICAgICBtMi5hZGRNZXRob2REZXBlbmRlZFVwb24oTWV0aG9kSGVscGVyLmNhbGN1bGF0ZU1ldGhvZENhbm9uaWNhbE5hbWUobTEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlcGVuZGVuY3lFeGlzdHMoSVRlc3ROR01ldGhvZCBtMSwgSVRlc3ROR01ldGhvZCBtMiwgSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxEZXBlbmRlbmN5RXhpc3RzKG0xLCBtMiwgbWV0aG9kcykgfHwgaW50ZXJuYWxEZXBlbmRlbmN5RXhpc3RzKG0yLCBtMSwgbWV0aG9kcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGludGVybmFsRGVwZW5kZW5jeUV4aXN0cyhJVGVzdE5HTWV0aG9kIG0xLCBJVGVzdE5HTWV0aG9kIG0yLCBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcykgeworICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzTmFtZWQgPQorICAgICAgTWV0aG9kSGVscGVyLmZpbmREZXBlbmRlZFVwb25NZXRob2RzKG0xLCBtZXRob2RzKTsKKworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtZXRob2QgOiBtZXRob2RzTmFtZWQpIHsKKyAgICAgIGlmIChtZXRob2QuZXF1YWxzKG0yKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyBncm91cCA6IG0xLmdldEdyb3Vwc0RlcGVuZGVkVXBvbigpKSB7CisgICAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kc1RoYXRCZWxvbmdUb0dyb3VwID0KKyAgICAgICAgTWV0aG9kR3JvdXBzSGVscGVyLmZpbmRNZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXAobTEsIG1ldGhvZHMsIGdyb3VwKTsKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtZXRob2QgOiBtZXRob2RzVGhhdEJlbG9uZ1RvR3JvdXApIHsKKyAgICAgICAgIGlmIChtZXRob2QuZXF1YWxzKG0yKSkgeworICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNFZmZlY3RpdmVDbGFzcyhJVGVzdE5HTWV0aG9kIG0xLCBJVGVzdE5HTWV0aG9kIG0yKSB7CisgICAgdHJ5IHsKKyAgICAgIENsYXNzIGMxID0gbTEuZ2V0UmVhbENsYXNzKCk7CisgICAgICBDbGFzcyBjMiA9IG0yLmdldFJlYWxDbGFzcygpOworCisgICAgICByZXR1cm4gYzEgPT0gbnVsbCA/IGMyID09IG51bGwgOiBjMS5lcXVhbHMoYzIpOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworCisgIC8qKgorICAgKiBHaXZlbiBhIGxpc3Qgb2YgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgY2xhc3MgaGllcmFyY2h5LCBvcmRlcnMgdGhlbQorICAgKiBmcm9tIHRoZSBiYXNlIGNsYXNzIHRvIHRoZSBjaGlsZCAoaWYgdHJ1ZSkgb3IgZnJvbSBjaGlsZCB0byBiYXNlIGNsYXNzIChpZiBmYWxzZSkKKyAgICogQHBhcmFtIG1ldGhvZHMKKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgc29ydE1ldGhvZHNCeUluaGVyaXRhbmNlKExpc3Q8SVRlc3ROR01ldGhvZD4gbWV0aG9kcywKKyAgICAgIGJvb2xlYW4gYmFzZUNsYXNzVG9DaGlsZCkKKyAgeworICAgIENvbGxlY3Rpb25zLnNvcnQobWV0aG9kcyk7CisgICAgaWYgKCEgYmFzZUNsYXNzVG9DaGlsZCkgeworICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShtZXRob2RzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbnN0YW5jZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL01ldGhvZEluc3RhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWI0Nzg4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZEluc3RhbmNlOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuT2JqZWN0czsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5zdGFuY2UgaW1wbGVtZW50cyBJTWV0aG9kSW5zdGFuY2Ugew0KKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kIG1fbWV0aG9kOw0KKw0KKyAgcHVibGljIE1ldGhvZEluc3RhbmNlKElUZXN0TkdNZXRob2QgbWV0aG9kKSB7DQorICAgIG1fbWV0aG9kID0gbWV0aG9kOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3ROR01ldGhvZCBnZXRNZXRob2QoKSB7DQorICAgIHJldHVybiBtX21ldGhvZDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE9iamVjdFtdIGdldEluc3RhbmNlcygpIHsNCisgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IGdldEluc3RhbmNlKCkgfTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZSgpIHsNCisgICAgcmV0dXJuIG1fbWV0aG9kLmdldEluc3RhbmNlKCk7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgIHJldHVybiBPYmplY3RzLnRvU3RyaW5nSGVscGVyKGdldENsYXNzKCkpDQorICAgICAgICAuYWRkKCJtZXRob2QiLCBtX21ldGhvZCkNCisgICAgICAgIC5hZGQoImluc3RhbmNlIiwgZ2V0SW5zdGFuY2UoKSkNCisgICAgICAgIC50b1N0cmluZygpOw0KKyAgfQ0KKw0KKw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElNZXRob2RJbnN0YW5jZT4gU09SVF9CWV9JTkRFWA0KKyAgICA9IG5ldyBDb21wYXJhdG9yPElNZXRob2RJbnN0YW5jZT4oKSB7DQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoSU1ldGhvZEluc3RhbmNlIG8xLCBJTWV0aG9kSW5zdGFuY2UgbzIpIHsNCisgICAgICAvLyBJZiB0aGUgdHdvIG1ldGhvZHMgYXJlIGluIGRpZmZlcmVudCA8dGVzdD4NCisgICAgICBYbWxUZXN0IHRlc3QxID0gbzEuZ2V0TWV0aG9kKCkuZ2V0VGVzdENsYXNzKCkuZ2V0WG1sVGVzdCgpOw0KKyAgICAgIFhtbFRlc3QgdGVzdDIgPSBvMi5nZXRNZXRob2QoKS5nZXRUZXN0Q2xhc3MoKS5nZXRYbWxUZXN0KCk7DQorDQorICAgICAgLy8gSWYgdGhlIHR3byBtZXRob2RzIGFyZSBub3QgaW4gdGhlIHNhbWUgPHRlc3Q+LCB3ZSBjYW4ndCBjb21wYXJlIHRoZW0NCisgICAgICBpZiAoISB0ZXN0MS5nZXROYW1lKCkuZXF1YWxzKHRlc3QyLmdldE5hbWUoKSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisNCisgICAgICBpbnQgcmVzdWx0ID0gMDsNCisNCisgICAgICAvLyBJZiB0aGUgdHdvIG1ldGhvZHMgYXJlIGluIHRoZSBzYW1lIDxjbGFzcz4sIGNvbXBhcmUgdGhlbSBieSB0aGVpciBtZXRob2QNCisgICAgICAvLyBpbmRleCwgb3RoZXJ3aXNlIGNvbXBhcmUgdGhlbSB3aXRoIHRoZWlyIGNsYXNzIGluZGV4Lg0KKyAgICAgIFhtbENsYXNzIGNsYXNzMSA9IG8xLmdldE1ldGhvZCgpLmdldFRlc3RDbGFzcygpLmdldFhtbENsYXNzKCk7DQorICAgICAgWG1sQ2xhc3MgY2xhc3MyID0gbzIuZ2V0TWV0aG9kKCkuZ2V0VGVzdENsYXNzKCkuZ2V0WG1sQ2xhc3MoKTsNCisNCisgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlc2UgY2xhc3NlcyBjYW1lIGZyb20gYSBARmFjdG9yeSwgaW4gd2hpY2ggY2FzZSwgdGhleQ0KKyAgICAgIC8vIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBYbWxDbGFzcw0KKyAgICAgIGlmIChjbGFzczEgPT0gbnVsbCB8fCBjbGFzczIgPT0gbnVsbCkgew0KKyAgICAgICAgaWYgKGNsYXNzMSAhPSBudWxsKSByZXR1cm4gLTE7DQorICAgICAgICBpZiAoY2xhc3MyICE9IG51bGwpIHJldHVybiAxOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmICghIGNsYXNzMS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzMi5nZXROYW1lKCkpKSB7DQorICAgICAgICBpbnQgaW5kZXgxID0gY2xhc3MxLmdldEluZGV4KCk7DQorICAgICAgICBpbnQgaW5kZXgyID0gY2xhc3MyLmdldEluZGV4KCk7DQorICAgICAgICByZXN1bHQgPSBpbmRleDEgLSBpbmRleDI7DQorICAgICAgfQ0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlMSA9DQorICAgICAgICAgICAgZmluZFhtbEluY2x1ZGUoY2xhc3MxLmdldEluY2x1ZGVkTWV0aG9kcygpLCBvMS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkpOw0KKyAgICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlMiA9DQorICAgICAgICAgIGZpbmRYbWxJbmNsdWRlKGNsYXNzMi5nZXRJbmNsdWRlZE1ldGhvZHMoKSwgbzIuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsNCisgICAgICAgIGlmIChpbmNsdWRlMSAhPSBudWxsICYmIGluY2x1ZGUyICE9IG51bGwpIHsNCisgICAgICAgICAgcmVzdWx0ID0gaW5jbHVkZTEuZ2V0SW5kZXgoKSAtIGluY2x1ZGUyLmdldEluZGV4KCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBYbWxJbmNsdWRlIGZpbmRYbWxJbmNsdWRlKExpc3Q8WG1sSW5jbHVkZT4gaW5jbHVkZWRNZXRob2RzLCBTdHJpbmcgbWV0aG9kTmFtZSkgew0KKyAgICAgIGZvciAoWG1sSW5jbHVkZSB4aSA6IGluY2x1ZGVkTWV0aG9kcykgew0KKyAgICAgICAgaWYgKHhpLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsNCisgICAgICAgICAgcmV0dXJuIHhpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKyAgfTsNCisNCisvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElNZXRob2RJbnN0YW5jZT4gU09SVF9CWV9DTEFTUw0KKy8vICAgID0gbmV3IENvbXBhcmF0b3I8SU1ldGhvZEluc3RhbmNlPigpIHsNCisvLyAgICBwdWJsaWMgaW50IGNvbXBhcmUoSU1ldGhvZEluc3RhbmNlIG8xLCBJTWV0aG9kSW5zdGFuY2UgbzIpIHsNCisvLyAgICAgIGludCByZXN1bHQ9IG8xLmdldE1ldGhvZCgpLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKQ0KKy8vICAgICAgICAuY29tcGFyZVRvKG8yLmdldE1ldGhvZCgpLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKSk7DQorLy8gICAgICByZXR1cm4gcmVzdWx0Ow0KKy8vICAgIH0NCisvLyAgfTsNCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL01ldGhvZEludm9jYXRpb25IZWxwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbnZvY2F0aW9uSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1NWY0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbnZvY2F0aW9uSGVscGVyLmphdmEKQEAgLTAsMCArMSwzMTEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhYmxlOw0KK2ltcG9ydCBvcmcudGVzdG5nLklDb25maWd1cmVDYWxsQmFjazsNCitpbXBvcnQgb3JnLnRlc3RuZy5JSG9va0NhbGxCYWNrOw0KK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmNvbGxlY3Rpb25zLlBhaXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkLklFeGVjdXRvcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuSUZ1dHVyZVJlc3VsdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuVGhyZWFkRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5UaHJlYWRUaW1lb3V0RXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5UaHJlYWRVdGlsOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKy8qKg0KKyAqIENvbGxlY3Rpb25zIG9mIGhlbHBlciBtZXRob2RzIHRvIGhlbHAgZGVhbCB3aXRoIGludm9jYXRpb24gb2YgVGVzdE5HIG1ldGhvZHMNCisgKg0KKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPg0KKyAqIEBhdXRob3IgbnVsbGluIDxuYWxpbi5tYWthciAqIGdtYWlsLmNvbT4NCisgKg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNZXRob2RJbnZvY2F0aW9uSGVscGVyIHsNCisNCisgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChNZXRob2QgdGhpc01ldGhvZCwgT2JqZWN0IGluc3RhbmNlLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQ0KKyAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsNCisgICAgVXRpbHMuY2hlY2tJbnN0YW5jZU9yU3RhdGljKGluc3RhbmNlLCB0aGlzTWV0aG9kKTsNCisNCisgICAgLy8gVEVTVE5HLTMyNiwgYWxsb3cgSU9iamVjdEZhY3RvcnkgdG8gbG9hZCBmcm9tIG5vbi1zdGFuZGFyZCBjbGFzc2xvYWRlcg0KKyAgICAvLyBJZiB0aGUgaW5zdGFuY2UgaGFzIGEgZGlmZmVyZW50IGNsYXNzbG9hZGVyLCBpdHMgY2xhc3Mgd29uJ3QgbWF0Y2ggdGhlDQorICAgIC8vIG1ldGhvZCdzIGNsYXNzDQorICAgIGlmIChpbnN0YW5jZSA9PSBudWxsIHx8ICF0aGlzTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShpbnN0YW5jZS5nZXRDbGFzcygpKSkgew0KKyAgICAgIC8vIGZvciBzb21lIHJlYXNvbiwgd2UgY2FuJ3QgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGlzIGNsYXNzDQorICAgICAgLy8gaXMgaXQgc3RhdGljPw0KKyAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSBNb2RpZmllci5pc1N0YXRpYyh0aGlzTWV0aG9kLmdldE1vZGlmaWVycygpKTsNCisgICAgICBpZiAoIWlzU3RhdGljKSB7DQorICAgICAgICAvLyBub3Qgc3RhdGljLCBzbyBncmFiIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIGluIHRoaXMgY2FzZQ0KKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBpbnN0YW5jZS5nZXRDbGFzcygpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgdGhpc01ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCh0aGlzTWV0aG9kLmdldE5hbWUoKSwgdGhpc01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgIC8vIGlnbm9yZSwgdGhlIG1ldGhvZCBtYXkgYmUgcHJpdmF0ZQ0KKyAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7DQorICAgICAgICAgIGZvciAoOyBjbGF6eiAhPSBudWxsOyBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKSkgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICB0aGlzTWV0aG9kID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QodGhpc01ldGhvZC5nZXROYW1lKCksDQorICAgICAgICAgICAgICAgICAgdGhpc01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsNCisgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgew0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoIWZvdW5kKSB7DQorICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGFzc2VydCBoZXJlPyBPciBqdXN0IGFsbG93IGl0IHRvIGZhaWwgb24gaW52b2NhdGlvbj8NCisgICAgICAgICAgICBpZiAodGhpc01ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7DQorICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgaW52b2tlIG1ldGhvZCAiICsgdGhpc01ldGhvZA0KKyAgICAgICAgICAgICAgICAgICsgIiwgcHJvYmFibHkgZHVlIHRvIGNsYXNzbG9hZGVyIG1pc21hdGNoIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBpbnZva2UgbWV0aG9kICIgKyB0aGlzTWV0aG9kDQorICAgICAgICAgICAgICAgICsgIiBvbiB0aGlzIGluc3RhbmNlIG9mICIgKyBpbnN0YW5jZS5nZXRDbGFzcygpICsgIiBkdWUgdG8gY2xhc3MgbWlzbWF0Y2giKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBzeW5jaHJvbml6ZWQodGhpc01ldGhvZCkgew0KKyAgICAgIGlmICghIE1vZGlmaWVyLmlzUHVibGljKHRoaXNNZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7DQorICAgICAgICB0aGlzTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiB0aGlzTWV0aG9kLmludm9rZShpbnN0YW5jZSwgcGFyYW1ldGVycyk7DQorICB9DQorDQorICBwcm90ZWN0ZWQgc3RhdGljIEl0ZXJhdG9yPE9iamVjdFtdPiBpbnZva2VEYXRhUHJvdmlkZXIoT2JqZWN0IGluc3RhbmNlLCBNZXRob2QgZGF0YVByb3ZpZGVyLA0KKyAgICAgIElUZXN0TkdNZXRob2QgbWV0aG9kLCBJVGVzdENvbnRleHQgdGVzdENvbnRleHQsIE9iamVjdCBmZWRJbnN0YW5jZSwNCisgICAgICBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyKSB7DQorICAgIEl0ZXJhdG9yPE9iamVjdFtdPiByZXN1bHQ7DQorICAgIGZpbmFsIENvbnN0cnVjdG9yT3JNZXRob2QgY29tID0gbWV0aG9kLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKTsNCisNCisgICAgLy8gSWYgaXQgcmV0dXJucyBhbiBPYmplY3RbXVtdLCBjb252ZXJ0IGl0IHRvIGFuIEl0ZXJhYmxlPE9iamVjdFtdPg0KKyAgICB0cnkgew0KKyAgICAgIExpc3Q8T2JqZWN0PiBsUGFyYW1ldGVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKw0KKyAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIG9uIHRoaXMgRGF0YSBQcm92aWRlciBhbmQNCisgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBtb3N0IG9uZSBNZXRob2QgYW5kIG9uZSBJVGVzdENvbnRleHQuDQorICAgICAgLy8gQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvcg0KKyAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMgPSBkYXRhUHJvdmlkZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisNCisgICAgICBmaW5hbCBDb2xsZWN0aW9uPFBhaXI8SW50ZWdlciwgQ2xhc3M8Pz4+PiB1bnJlc29sdmVkID0gbmV3IEFycmF5TGlzdDw+KHBhcmFtZXRlclR5cGVzLmxlbmd0aCk7DQorICAgICAgaW50IGkgPSAwOw0KKyAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogcGFyYW1ldGVyVHlwZXMpIHsNCisgICAgICAgIGJvb2xlYW4gaXNUZXN0SW5zdGFuY2UgPSBhbm5vdGF0aW9uRmluZGVyLmhhc1Rlc3RJbnN0YW5jZShkYXRhUHJvdmlkZXIsIGkrKyk7DQorICAgICAgICBpZiAoY2xzLmVxdWFscyhNZXRob2QuY2xhc3MpKSB7DQorICAgICAgICAgIGxQYXJhbWV0ZXJzLmFkZChjb20uZ2V0TWV0aG9kKCkpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjbHMuZXF1YWxzKENvbnN0cnVjdG9yLmNsYXNzKSkgew0KKyAgICAgICAgICBsUGFyYW1ldGVycy5hZGQoY29tLmdldENvbnN0cnVjdG9yKCkpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjbHMuZXF1YWxzKENvbnN0cnVjdG9yT3JNZXRob2QuY2xhc3MpKSB7DQorICAgICAgICAgIGxQYXJhbWV0ZXJzLmFkZChjb20pOw0KKyAgICAgICAgfSBlbHNlIGlmIChjbHMuZXF1YWxzKElUZXN0TkdNZXRob2QuY2xhc3MpKSB7DQorICAgICAgICAgIGxQYXJhbWV0ZXJzLmFkZChtZXRob2QpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjbHMuZXF1YWxzKElUZXN0Q29udGV4dC5jbGFzcykpIHsNCisgICAgICAgICAgbFBhcmFtZXRlcnMuYWRkKHRlc3RDb250ZXh0KTsNCisgICAgICAgIH0gZWxzZSBpZiAoaXNUZXN0SW5zdGFuY2UpIHsNCisgICAgICAgICAgbFBhcmFtZXRlcnMuYWRkKGZlZEluc3RhbmNlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHVucmVzb2x2ZWQuYWRkKG5ldyBQYWlyPEludGVnZXIsIENsYXNzPD8+PihpLCBjbHMpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCF1bnJlc29sdmVkLmlzRW1wdHkoKSkgew0KKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICBzYi5hcHBlbmQoIlNvbWUgRGF0YVByb3ZpZGVyICIpLmFwcGVuZChkYXRhUHJvdmlkZXIpLmFwcGVuZCgiIHBhcmFtZXRlcnMgdW5yZXNvbHZlZDogIik7DQorICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgQ2xhc3M8Pz4+IHBhaXIgOiB1bnJlc29sdmVkKSB7DQorICAgICAgICAgIHNiLmFwcGVuZCgiIGF0ICIpLmFwcGVuZChwYWlyLmZpcnN0KCkpLmFwcGVuZCgiIHR5cGUgIikuYXBwZW5kKHBhaXIuc2Vjb25kKCkpLmFwcGVuZCgiXG4iKTsNCisgICAgICAgIH0NCisgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oc2IudG9TdHJpbmcoKSk7DQorICAgICAgfQ0KKw0KKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlcnMgPSBsUGFyYW1ldGVycy50b0FycmF5KG5ldyBPYmplY3RbbFBhcmFtZXRlcnMuc2l6ZSgpXSk7DQorDQorICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IGRhdGFQcm92aWRlci5nZXRSZXR1cm5UeXBlKCk7DQorICAgICAgaWYgKE9iamVjdFtdW10uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlKSkgew0KKyAgICAgICAgT2JqZWN0W11bXSBvcmlnaW5hbFJlc3VsdCA9IChPYmplY3RbXVtdKSBpbnZva2VNZXRob2QoZGF0YVByb3ZpZGVyLCBpbnN0YW5jZSwgcGFyYW1ldGVycyk7DQorDQorICAgICAgICAvLyBJZiB0aGUgZGF0YSBwcm92aWRlciBpcyByZXN0cmljdGluZyB0aGUgaW5kaWNlcyB0byByZXR1cm4sIGZpbHRlciB0aGVtIG91dA0KKyAgICAgICAgaW50W10gaW5kaWNlcyA9IGRhdGFQcm92aWRlci5nZXRBbm5vdGF0aW9uKERhdGFQcm92aWRlci5jbGFzcykuaW5kaWNlcygpOw0KKyAgICAgICAgT2JqZWN0W11bXSBvUmVzdWx0Ow0KKyAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMCkgew0KKyAgICAgICAgICBvUmVzdWx0ID0gbmV3IE9iamVjdFtpbmRpY2VzLmxlbmd0aF1bXTsNCisgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgb1Jlc3VsdFtqXSA9IG9yaWdpbmFsUmVzdWx0W2luZGljZXNbal1dOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBvUmVzdWx0ID0gb3JpZ2luYWxSZXN1bHQ7DQorICAgICAgICB9DQorDQorICAgICAgICBtZXRob2Quc2V0UGFyYW1ldGVySW52b2NhdGlvbkNvdW50KG9SZXN1bHQubGVuZ3RoKTsNCisgICAgICAgIHJlc3VsdCA9IE1ldGhvZEhlbHBlci5jcmVhdGVBcnJheUl0ZXJhdG9yKG9SZXN1bHQpOw0KKyAgICAgIH0gZWxzZSBpZiAoSXRlcmF0b3IuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXR1cm5UeXBlKSkgew0KKyAgICAgICAgLy8gQWxyZWFkeSBhbiBJdGVyYXRvcjxPYmplY3RbXT4sIGFzc2lnbiBpdCBkaXJlY3RseQ0KKyAgICAgICAgcmVzdWx0ID0gKEl0ZXJhdG9yPE9iamVjdFtdPikgaW52b2tlTWV0aG9kKGRhdGFQcm92aWRlciwgaW5zdGFuY2UsIHBhcmFtZXRlcnMpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJEYXRhIFByb3ZpZGVyICIgKyBkYXRhUHJvdmlkZXIgKyAiIG11c3QgcmV0dXJuIg0KKyAgICAgICAgICAgICsgIiBlaXRoZXIgT2JqZWN0W11bXSBvciBJdGVyYXRvcjxPYmplY3Q+W10sIG5vdCAiICsgcmV0dXJuVHlwZSk7DQorICAgICAgfQ0KKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7DQorICAgICAgLy8gRG9uJ3QgdGhyb3cgVGVzdE5HRXhjZXB0aW9uIGhlcmUgb3IgdGhpcyB0ZXN0IHdvbid0IGJlIHJlcG9ydGVkIGFzIGENCisgICAgICAvLyBza2lwIG9yIGZhaWx1cmUNCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldENhdXNlKCkpOw0KKyAgICB9DQorDQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICAvKioNCisgICAqIEludm9rZXMgdGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIG9mIHRoZSA8Y29kZT5JSG9va2FibGU8L2NvZGU+Lg0KKyAgICoNCisgICAqIEBwYXJhbSB0ZXN0SW5zdGFuY2UNCisgICAqICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byBpbnZva2UgdGhlIG1ldGhvZCBpbg0KKyAgICogQHBhcmFtIHBhcmFtZXRlcnMNCisgICAqICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byA8Y29kZT5JSG9va0NhbGxCYWNrPC9jb2RlPg0KKyAgICogQHBhcmFtIHRoaXNNZXRob2QNCisgICAqICAgICAgICAgIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZCB0aHJvdWdoIHRoZSA8Y29kZT5JSG9va0NhbGxCYWNrPC9jb2RlPg0KKyAgICogQHBhcmFtIHRlc3RSZXN1bHQNCisgICAqICAgICAgICAgIHRoZSBjdXJyZW50IDxjb2RlPklUZXN0UmVzdWx0PC9jb2RlPiBwYXNzZWQgdG8NCisgICAqICAgICAgICAgIDxjb2RlPklIb29rYWJsZS5ydW48L2NvZGU+DQorICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbg0KKyAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uDQorICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCisgICAqIEB0aHJvd3MgVGhyb3dhYmxlDQorICAgKiAgICAgICAgICAgdGhyb3duIGlmIHRoZSByZWZsZWN0aXZlIGNhbGwgdG8NCisgICAqICAgICAgICAgICA8dHQ+dGhpc01ldGhvZDwvY29kZT4gcmVzdWx0cyBpbiBhbiBleGNlcHRpb24NCisgICAqLw0KKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGludm9rZUhvb2thYmxlKGZpbmFsIE9iamVjdCB0ZXN0SW5zdGFuY2UsIGZpbmFsIE9iamVjdFtdIHBhcmFtZXRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUhvb2thYmxlIGhvb2thYmxlLCBmaW5hbCBNZXRob2QgdGhpc01ldGhvZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB0aHJvd3MgVGhyb3dhYmxlIHsNCisgICAgZmluYWwgVGhyb3dhYmxlW10gZXJyb3IgPSBuZXcgVGhyb3dhYmxlWzFdOw0KKw0KKyAgICBJSG9va0NhbGxCYWNrIGNhbGxiYWNrID0gbmV3IElIb29rQ2FsbEJhY2soKSB7DQorICAgICAgQE92ZXJyaWRlDQorICAgICAgcHVibGljIHZvaWQgcnVuVGVzdE1ldGhvZChJVGVzdFJlc3VsdCB0cikgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgaW52b2tlTWV0aG9kKHRoaXNNZXRob2QsIHRlc3RJbnN0YW5jZSwgcGFyYW1ldGVycyk7DQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KKyAgICAgICAgICBlcnJvclswXSA9IHQ7DQorICAgICAgICAgIHRyLnNldFRocm93YWJsZSh0KTsgLy8gbWFrZSBUaHJvd2FibGUgYXZhaWxhYmxlIHRvIElIb29rYWJsZQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBAT3ZlcnJpZGUNCisgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UGFyYW1ldGVycygpIHsNCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOw0KKyAgICAgIH0NCisgICAgfTsNCisgICAgaG9va2FibGUucnVuKGNhbGxiYWNrLCB0ZXN0UmVzdWx0KTsNCisgICAgaWYgKGVycm9yWzBdICE9IG51bGwpIHsNCisgICAgICB0aHJvdyBlcnJvclswXTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBJbnZva2VzIGEgbWV0aG9kIG9uIGEgc2VwYXJhdGUgdGhyZWFkIGluIG9yZGVyIHRvIGFsbG93IHVzIHRvIHRpbWVvdXQgdGhlDQorICAgKiBpbnZvY2F0aW9uLiBJdCB1c2VzIGFzIGltcGxlbWVudGF0aW9uIGFuIDxjb2RlPkV4ZWN1dG9yPC9jb2RlPiBhbmQgYQ0KKyAgICogPGNvZGU+Q291bnREb3duTGF0Y2g8L2NvZGU+Lg0KKyAgICovDQorICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW52b2tlV2l0aFRpbWVvdXQoSVRlc3ROR01ldGhvZCB0bSwgT2JqZWN0IGluc3RhbmNlLA0KKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlclZhbHVlcywgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkNCisgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRocmVhZEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorICAgIGludm9rZVdpdGhUaW1lb3V0KHRtLCBpbnN0YW5jZSwgcGFyYW1ldGVyVmFsdWVzLCB0ZXN0UmVzdWx0LCBudWxsKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbnZva2VXaXRoVGltZW91dChJVGVzdE5HTWV0aG9kIHRtLCBPYmplY3QgaW5zdGFuY2UsDQorICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LCBJSG9va2FibGUgaG9va2FibGUpDQorICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaHJlYWRFeGVjdXRpb25FeGNlcHRpb24gew0KKyAgICBpZiAoVGhyZWFkVXRpbC5pc1Rlc3ROR1RocmVhZCgpICYmIHRlc3RSZXN1bHQuZ2V0VGVzdENvbnRleHQoKS5nZXRDdXJyZW50WG1sVGVzdCgpLmdldFBhcmFsbGVsKCkgIT0gWG1sU3VpdGUuUGFyYWxsZWxNb2RlLlRFU1RTKSB7DQorICAgICAgLy8gV2UgYXJlIGFscmVhZHkgcnVubmluZyBpbiBvdXIgb3duIGV4ZWN1dG9yLCBkb24ndCBjcmVhdGUgYW5vdGhlciBvbmUgKG9yIHdlIHdpbGwNCisgICAgICAvLyBsb3NlIHRoZSB0aW1lIG91dCBvZiB0aGUgZW5jbG9zaW5nIGV4ZWN1dG9yKS4NCisgICAgICBpbnZva2VXaXRoVGltZW91dFdpdGhOb0V4ZWN1dG9yKHRtLCBpbnN0YW5jZSwgcGFyYW1ldGVyVmFsdWVzLCB0ZXN0UmVzdWx0LCBob29rYWJsZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW52b2tlV2l0aFRpbWVvdXRXaXRoTmV3RXhlY3V0b3IodG0sIGluc3RhbmNlLCBwYXJhbWV0ZXJWYWx1ZXMsIHRlc3RSZXN1bHQsIGhvb2thYmxlKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VXaXRoVGltZW91dFdpdGhOb0V4ZWN1dG9yKElUZXN0TkdNZXRob2QgdG0sIE9iamVjdCBpbnN0YW5jZSwNCisgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsIElIb29rYWJsZSBob29rYWJsZSkgew0KKw0KKyAgICBJbnZva2VNZXRob2RSdW5uYWJsZSBpbXIgPSBuZXcgSW52b2tlTWV0aG9kUnVubmFibGUodG0sIGluc3RhbmNlLCBwYXJhbWV0ZXJWYWx1ZXMsIGhvb2thYmxlLCB0ZXN0UmVzdWx0KTsNCisgICAgdHJ5IHsNCisgICAgICBpbXIucnVuKCk7DQorICAgICAgdGVzdFJlc3VsdC5zZXRTdGF0dXMoSVRlc3RSZXN1bHQuU1VDQ0VTUyk7DQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KKyAgICAgIHRlc3RSZXN1bHQuc2V0VGhyb3dhYmxlKGV4LmdldENhdXNlKCkpOw0KKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOw0KKyAgICB9DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZVdpdGhUaW1lb3V0V2l0aE5ld0V4ZWN1dG9yKElUZXN0TkdNZXRob2QgdG0sIE9iamVjdCBpbnN0YW5jZSwNCisgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsIElIb29rYWJsZSBob29rYWJsZSkNCisgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRocmVhZEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorICAgIElFeGVjdXRvciBleGVjID0gVGhyZWFkVXRpbC5jcmVhdGVFeGVjdXRvcigxLCB0bS5nZXRNZXRob2ROYW1lKCkpOw0KKw0KKyAgICBJbnZva2VNZXRob2RSdW5uYWJsZSBpbXIgPSBuZXcgSW52b2tlTWV0aG9kUnVubmFibGUodG0sIGluc3RhbmNlLCBwYXJhbWV0ZXJWYWx1ZXMsIGhvb2thYmxlLCB0ZXN0UmVzdWx0KTsNCisgICAgSUZ1dHVyZVJlc3VsdCBmdXR1cmUgPSBleGVjLnN1Ym1pdFJ1bm5hYmxlKGltcik7DQorICAgIGV4ZWMuc2h1dGRvd24oKTsNCisgICAgbG9uZyByZWFsVGltZU91dCA9IE1ldGhvZEhlbHBlci5jYWxjdWxhdGVUaW1lT3V0KHRtKTsNCisgICAgYm9vbGVhbiBmaW5pc2hlZCA9IGV4ZWMuYXdhaXRUZXJtaW5hdGlvbihyZWFsVGltZU91dCk7DQorDQorICAgIGlmICghZmluaXNoZWQpIHsNCisgICAgICBleGVjLnN0b3BOb3coKTsNCisgICAgICBUaHJlYWRUaW1lb3V0RXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG5ldyBUaHJlYWRUaW1lb3V0RXhjZXB0aW9uKCJNZXRob2QgIg0KKyAgICAgICAgICArIHRtLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi4iICsgdG0uZ2V0TWV0aG9kTmFtZSgpICsgIigpIg0KKyAgICAgICAgICArICIgZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlIHRpbWUtb3V0ICIgKyByZWFsVGltZU91dCk7DQorICAgICAgZXhjZXB0aW9uLnNldFN0YWNrVHJhY2UoZXhlYy5nZXRTdGFja1RyYWNlcygpWzBdKTsNCisgICAgICB0ZXN0UmVzdWx0LnNldFRocm93YWJsZShleGNlcHRpb24pOw0KKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LkZBSUxVUkUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFV0aWxzLmxvZygiSW52b2tlciAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpLCAzLCAiTWV0aG9kICIgKyB0bS5nZXRNZXRob2ROYW1lKCkNCisgICAgICAgICAgKyAiIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUtb3V0ICIgKyB0bS5nZXRUaW1lT3V0KCkpOw0KKw0KKyAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIHJlc3VsdCBmcm9tIHRoZSBmdXR1cmUgYnV0IGludm9raW5nIGdldCgpIG9uIGl0DQorICAgICAgLy8gd2lsbCB0cmlnZ2VyIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duLCBpZiBhbnkNCisgICAgICBmdXR1cmUuZ2V0KCk7DQorICAgICAgLy8gZG9uZS5hd2FpdCgpOw0KKw0KKyAgICAgIHRlc3RSZXN1bHQuc2V0U3RhdHVzKElUZXN0UmVzdWx0LlNVQ0NFU1MpOyAvLyBpZiBubyBleGNlcHRpb24gdGlsbCBoZXJlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gU1VDQ0VTUw0KKyAgICB9DQorICB9DQorDQorICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW52b2tlQ29uZmlndXJhYmxlKGZpbmFsIE9iamVjdCBpbnN0YW5jZSwgZmluYWwgT2JqZWN0W10gcGFyYW1ldGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYWJsZSBjb25maWd1cmFibGVJbnN0YW5jZSwgZmluYWwgTWV0aG9kIHRoaXNNZXRob2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHRocm93cyBUaHJvd2FibGUgew0KKyAgICBmaW5hbCBUaHJvd2FibGVbXSBlcnJvciA9IG5ldyBUaHJvd2FibGVbMV07DQorDQorICAgIElDb25maWd1cmVDYWxsQmFjayBjYWxsYmFjayA9IG5ldyBJQ29uZmlndXJlQ2FsbEJhY2soKSB7DQorICAgICAgQE92ZXJyaWRlDQorICAgICAgcHVibGljIHZvaWQgcnVuQ29uZmlndXJhdGlvbk1ldGhvZChJVGVzdFJlc3VsdCB0cikgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgaW52b2tlTWV0aG9kKHRoaXNNZXRob2QsIGluc3RhbmNlLCBwYXJhbWV0ZXJzKTsNCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQorICAgICAgICAgIGVycm9yWzBdID0gdDsNCisgICAgICAgICAgdHIuc2V0VGhyb3dhYmxlKHQpOyAvLyBtYWtlIFRocm93YWJsZSBhdmFpbGFibGUgdG8gSUNvbmZpZ3VyYWJsZQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBAT3ZlcnJpZGUNCisgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UGFyYW1ldGVycygpIHsNCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOw0KKyAgICAgIH0NCisgICAgfTsNCisgICAgY29uZmlndXJhYmxlSW5zdGFuY2UucnVuKGNhbGxiYWNrLCB0ZXN0UmVzdWx0KTsNCisgICAgaWYgKGVycm9yWzBdICE9IG51bGwpIHsNCisgICAgICB0aHJvdyBlcnJvclswXTsNCisgICAgfQ0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWFkMmQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RTZWxlY3RvckRlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RTZWxlY3RvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlc2NyaWJlcyBhIG1ldGhvZCBzZWxlY3RvcjoKKyAqIC0gVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBpdAorICogLSBJdHMgcHJpb3JpdHkKKyAqCisgKiBDcmVhdGVkIG9uIFNlcCAyNiwgMjAwNQorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZFNlbGVjdG9yRGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGU8TWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yPiB7CisgIHByaXZhdGUgSU1ldGhvZFNlbGVjdG9yIG1fbWV0aG9kU2VsZWN0b3I7CisgIHByaXZhdGUgaW50IG1fcHJpb3JpdHk7CisKKyAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKKyAgICByZXR1cm4gbV9wcmlvcml0eTsKKyAgfQorCisgIHB1YmxpYyBJTWV0aG9kU2VsZWN0b3IgZ2V0TWV0aG9kU2VsZWN0b3IoKSB7CisgICAgcmV0dXJuIG1fbWV0aG9kU2VsZWN0b3I7CisgIH0KKworICBwdWJsaWMgTWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yKElNZXRob2RTZWxlY3RvciBzZWxlY3RvciwgaW50IHByaW9yaXR5KSB7CisgICAgbV9tZXRob2RTZWxlY3RvciA9IHNlbGVjdG9yOworICAgIG1fcHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhNZXRob2RTZWxlY3RvckRlc2NyaXB0b3Igb3RoZXIpIHsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIHRyeSB7CisgICAgICBpbnQgcDEgPSBnZXRQcmlvcml0eSgpOworICAgICAgaW50IHAyID0gb3RoZXIuZ2V0UHJpb3JpdHkoKTsKKyAgICAgIHJlc3VsdCA9IHAxIC0gcDI7CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgLy8gaWdub3JlCisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRlc3RNZXRob2RzKExpc3Q8SVRlc3ROR01ldGhvZD4gdGVzdE1ldGhvZHMpIHsKKyAgICBtX21ldGhvZFNlbGVjdG9yLnNldFRlc3RNZXRob2RzKHRlc3RNZXRob2RzKTsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTm9PcFRlc3RDbGFzcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL05vT3BUZXN0Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDNhNGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL05vT3BUZXN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQorcHVibGljIGNsYXNzIE5vT3BUZXN0Q2xhc3MgaW1wbGVtZW50cyBJVGVzdENsYXNzIHsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NTQ0MDYxNDA1MzI5MDQwNTkzTDsNCisNCisgIHByb3RlY3RlZCBDbGFzcyBtX3Rlc3RDbGFzcz0gbnVsbDsNCisNCisgIC8vIFRlc3QgbWV0aG9kcw0KKyAgcHJvdGVjdGVkIElUZXN0TkdNZXRob2RbXSBtX2JlZm9yZUNsYXNzTWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9iZWZvcmVUZXN0TWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV90ZXN0TWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9hZnRlckNsYXNzTWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9hZnRlclRlc3RNZXRob2RzPSBudWxsOw0KKyAgcHJvdGVjdGVkIElUZXN0TkdNZXRob2RbXSBtX2JlZm9yZVN1aXRlTWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9hZnRlclN1aXRlTWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9iZWZvcmVUZXN0Q29uZk1ldGhvZHM9IG51bGw7DQorICBwcm90ZWN0ZWQgSVRlc3ROR01ldGhvZFtdIG1fYWZ0ZXJUZXN0Q29uZk1ldGhvZHM9IG51bGw7DQorICBwcm90ZWN0ZWQgSVRlc3ROR01ldGhvZFtdIG1fYmVmb3JlR3JvdXBzTWV0aG9kcz0gbnVsbDsNCisgIHByb3RlY3RlZCBJVGVzdE5HTWV0aG9kW10gbV9hZnRlckdyb3Vwc01ldGhvZHM9IG51bGw7DQorDQorICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3RbXSBtX2luc3RhbmNlczsNCisgIHByaXZhdGUgbG9uZ1tdIG1faW5zdGFuY2VIYXNoZXM7DQorDQorICBwcml2YXRlIFhtbFRlc3QgbV94bWxUZXN0Ow0KKw0KKyAgcHJpdmF0ZSBYbWxDbGFzcyBtX3htbENsYXNzOw0KKw0KKyAgcHJvdGVjdGVkIE5vT3BUZXN0Q2xhc3MoKSB7DQorICB9DQorDQorICBwdWJsaWMgTm9PcFRlc3RDbGFzcyhJVGVzdENsYXNzIHRlc3RDbGFzcykgew0KKyAgICBtX3Rlc3RDbGFzcz0gdGVzdENsYXNzLmdldFJlYWxDbGFzcygpOw0KKyAgICBtX2JlZm9yZVN1aXRlTWV0aG9kcz0gdGVzdENsYXNzLmdldEJlZm9yZVN1aXRlTWV0aG9kcygpOw0KKyAgICBtX2JlZm9yZVRlc3RDb25mTWV0aG9kcz0gdGVzdENsYXNzLmdldEJlZm9yZVRlc3RDb25maWd1cmF0aW9uTWV0aG9kcygpOw0KKyAgICBtX2JlZm9yZUdyb3Vwc01ldGhvZHM9IHRlc3RDbGFzcy5nZXRCZWZvcmVHcm91cHNNZXRob2RzKCk7DQorICAgIG1fYmVmb3JlQ2xhc3NNZXRob2RzPSB0ZXN0Q2xhc3MuZ2V0QmVmb3JlQ2xhc3NNZXRob2RzKCk7DQorICAgIG1fYmVmb3JlVGVzdE1ldGhvZHM9IHRlc3RDbGFzcy5nZXRCZWZvcmVUZXN0TWV0aG9kcygpOw0KKyAgICBtX2FmdGVyU3VpdGVNZXRob2RzPSB0ZXN0Q2xhc3MuZ2V0QWZ0ZXJTdWl0ZU1ldGhvZHMoKTsNCisgICAgbV9hZnRlclRlc3RDb25mTWV0aG9kcz0gdGVzdENsYXNzLmdldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCk7DQorICAgIG1fYWZ0ZXJHcm91cHNNZXRob2RzPSB0ZXN0Q2xhc3MuZ2V0QWZ0ZXJHcm91cHNNZXRob2RzKCk7DQorICAgIG1fYWZ0ZXJDbGFzc01ldGhvZHM9IHRlc3RDbGFzcy5nZXRBZnRlckNsYXNzTWV0aG9kcygpOw0KKyAgICBtX2FmdGVyVGVzdE1ldGhvZHM9IHRlc3RDbGFzcy5nZXRBZnRlclRlc3RNZXRob2RzKCk7DQorICAgIG1faW5zdGFuY2VzPSB0ZXN0Q2xhc3MuZ2V0SW5zdGFuY2VzKHRydWUpOw0KKyAgICBtX2luc3RhbmNlSGFzaGVzPSB0ZXN0Q2xhc3MuZ2V0SW5zdGFuY2VIYXNoQ29kZXMoKTsNCisgICAgbV94bWxUZXN0ID0gdGVzdENsYXNzLmdldFhtbFRlc3QoKTsNCisgICAgbV94bWxDbGFzcyA9IHRlc3RDbGFzcy5nZXRYbWxDbGFzcygpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0QmVmb3JlVGVzdE1ldGhvZHMoSVRlc3ROR01ldGhvZFtdIGJlZm9yZVRlc3RNZXRob2RzKSB7DQorICAgIG1fYmVmb3JlVGVzdE1ldGhvZHM9IGJlZm9yZVRlc3RNZXRob2RzOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0QWZ0ZXJUZXN0TWV0aG9kKElUZXN0TkdNZXRob2RbXSBhZnRlclRlc3RNZXRob2RzKSB7DQorICAgIG1fYWZ0ZXJUZXN0TWV0aG9kcz0gYWZ0ZXJUZXN0TWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhZnRlckNsYXNzTWV0aG9kcy4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyQ2xhc3NNZXRob2RzKCkgew0KKyAgICByZXR1cm4gbV9hZnRlckNsYXNzTWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhZnRlclRlc3RNZXRob2RzLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpIHsNCisgICAgcmV0dXJuIG1fYWZ0ZXJUZXN0TWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBiZWZvcmVDbGFzc01ldGhvZHMuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVDbGFzc01ldGhvZHMoKSB7DQorICAgIHJldHVybiBtX2JlZm9yZUNsYXNzTWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBiZWZvcmVUZXN0TWV0aG9kcy4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RNZXRob2RzKCkgew0KKyAgICByZXR1cm4gbV9iZWZvcmVUZXN0TWV0aG9kczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0TWV0aG9kcy4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldFRlc3RNZXRob2RzKCkgew0KKyAgICByZXR1cm4gbV90ZXN0TWV0aG9kczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVTdWl0ZU1ldGhvZHMoKSB7DQorICAgIHJldHVybiBtX2JlZm9yZVN1aXRlTWV0aG9kczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclN1aXRlTWV0aG9kcygpIHsNCisgICAgcmV0dXJuIG1fYWZ0ZXJTdWl0ZU1ldGhvZHM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCkgew0KKyAgICByZXR1cm4gbV9iZWZvcmVUZXN0Q29uZk1ldGhvZHM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSB7DQorICAgIHJldHVybiBtX2FmdGVyVGVzdENvbmZNZXRob2RzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIGFsbCBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIGNlcnRhaW4gZ3JvdXBzDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVHcm91cHNNZXRob2RzKCkgew0KKyAgICByZXR1cm4gbV9iZWZvcmVHcm91cHNNZXRob2RzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIGFsbCBAQ29uZmlndXJhdGlvbiBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgY2VydGFpbiBncm91cHMNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyR3JvdXBzTWV0aG9kcygpIHsNCisgICAgcmV0dXJuIG1fYWZ0ZXJHcm91cHNNZXRob2RzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDbGFzcyNnZXRJbnN0YW5jZUNvdW50KCkNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldEluc3RhbmNlQ291bnQoKSB7DQorICAgIHJldHVybiBtX2luc3RhbmNlcy5sZW5ndGg7DQorICB9DQorDQorICAvKioNCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEluc3RhbmNlSGFzaENvZGVzKCkNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgbG9uZ1tdIGdldEluc3RhbmNlSGFzaENvZGVzKCkgew0KKyAgICByZXR1cm4gbV9pbnN0YW5jZUhhc2hlczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0SW5zdGFuY2VzKGJvb2xlYW4pDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIE9iamVjdFtdIGdldEluc3RhbmNlcyhib29sZWFuIHJldXNlKSB7DQorICAgIHJldHVybiBtX2luc3RhbmNlczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICByZXR1cm4gbV90ZXN0Q2xhc3MuZ2V0TmFtZSgpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgQ2xhc3MgZ2V0UmVhbENsYXNzKCkgew0KKyAgICByZXR1cm4gbV90ZXN0Q2xhc3M7DQorICB9DQorDQorICAvKioNCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JQ2xhc3MjYWRkSW5zdGFuY2UoamF2YS5sYW5nLk9iamVjdCkNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBhZGRJbnN0YW5jZShPYmplY3QgaW5zdGFuY2UpIHsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldFRlc3RDbGFzcyhDbGFzczwgPyA+IGRlY2xhcmluZ0NsYXNzKSB7DQorICAgIG1fdGVzdENsYXNzID0gZGVjbGFyaW5nQ2xhc3M7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7DQorICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBYbWxUZXN0IGdldFhtbFRlc3QoKSB7DQorICAgIHJldHVybiBtX3htbFRlc3Q7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBYbWxDbGFzcyBnZXRYbWxDbGFzcygpIHsNCisgICAgcmV0dXJuIG1feG1sQ2xhc3M7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9OdWxsYWJsZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL051bGxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5MmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9OdWxsYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVJ9KQorcHVibGljIEBpbnRlcmZhY2UgTnVsbGFibGUgeworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL09iamVjdEZhY3RvcnlJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvT2JqZWN0RmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OWMwNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL09iamVjdEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCisvKioKKyAqIERlZmF1bHQgZmFjdG9yeSBmb3IgdGVzdCBjcmVhdGlvbi4KKyAqIE5vdGUgdGhhdCBpZiBubyBjb25zdHJ1Y3RvciBpcyBmb3VuZCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMsCisgKiB0aGlzIGZhY3Rvcnkgd2lsbCB0cnkgdG8gaW52b2tlIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBpbiBhIHN0cmluZyBvYmplY3QKKyAqCisgKiBAYXV0aG9yIEhhbmkgU3VsZWltYW4KKyAqICAgICAgICAgRGF0ZTogTWFyIDYsIDIwMDcKKyAqICAgICAgICAgVGltZTogMTI6MDA6MjcgUE0KKyAqIEBzaW5jZSA1LjYKKyAqLworcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnlJbXBsIGltcGxlbWVudHMgSU9iamVjdEZhY3RvcnkgeworCisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1NDczODkzMjg0NzU1NDAwMTdMOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgdHJ5IHsKKyAgICAgIGNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UocGFyYW1zKTsKKyAgICB9CisgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgIHJldHVybiBDbGFzc0hlbHBlci50cnlPdGhlckNvbnN0cnVjdG9yKGNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkpOworICAgIH0KKyAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgcmV0dXJuIENsYXNzSGVscGVyLnRyeU90aGVyQ29uc3RydWN0b3IoY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIGNsYXNzICIKKyAgICAgICAgICArIChjb25zdHJ1Y3RvciAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgIDogIjogY291bGRuJ3QgZmluZCBhIHN1aXRhYmxlIGNvbnN0cnVjdG9yIiksCisgICAgICAgICAgICAgICAgICAgIGV4KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9PdmVycmlkZVByb2Nlc3Nvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL092ZXJyaWRlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiZGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9PdmVycmlkZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcueG1sLklQb3N0UHJvY2Vzc29yOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIE92ZXJyaWRlIHRoZSBncm91cHMgaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlIHdpdGggZ3JvdXBzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVQcm9jZXNzb3IgaW1wbGVtZW50cyBJUG9zdFByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX2dyb3VwczsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX2V4Y2x1ZGVkR3JvdXBzOworCisgIHB1YmxpYyBPdmVycmlkZVByb2Nlc3NvcihTdHJpbmdbXSBncm91cHMsIFN0cmluZ1tdIGV4Y2x1ZGVkR3JvdXBzKSB7CisgICAgbV9ncm91cHMgPSBncm91cHM7CisgICAgbV9leGNsdWRlZEdyb3VwcyA9IGV4Y2x1ZGVkR3JvdXBzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb2xsZWN0aW9uPFhtbFN1aXRlPiBwcm9jZXNzKENvbGxlY3Rpb248WG1sU3VpdGU+IHN1aXRlcykgeworICAgIGZvciAoWG1sU3VpdGUgcyA6IHN1aXRlcykgeworICAgICAgaWYgKG1fZ3JvdXBzICE9IG51bGwgJiYgbV9ncm91cHMubGVuZ3RoID4gMCkgeworICAgICAgICBmb3IgKFhtbFRlc3QgdCA6IHMuZ2V0VGVzdHMoKSkgeworICAgICAgICAgIHQuZ2V0SW5jbHVkZWRHcm91cHMoKS5jbGVhcigpOworICAgICAgICAgIHQuZ2V0SW5jbHVkZWRHcm91cHMoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChtX2dyb3VwcykpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChtX2V4Y2x1ZGVkR3JvdXBzICE9IG51bGwgJiYgbV9leGNsdWRlZEdyb3Vwcy5sZW5ndGggPiAwKSB7CisgICAgICAgIGZvciAoWG1sVGVzdCB0IDogcy5nZXRUZXN0cygpKSB7CisgICAgICAgICAgdC5nZXRFeGNsdWRlZEdyb3VwcygpLmNsZWFyKCk7CisgICAgICAgICAgdC5nZXRFeGNsdWRlZEdyb3VwcygpLmFkZEFsbChBcnJheXMuYXNMaXN0KG1fZXhjbHVkZWRHcm91cHMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdWl0ZXM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1BhY2thZ2VVdGlscy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1BhY2thZ2VVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmNiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUGFja2FnZVV0aWxzLmphdmEKQEAgLTAsMCArMSwzMDQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBmaW5kcyBhbGwgdGhlIGNsYXNzZXMgaW4gYSBnaXZlbiBwYWNrYWdlLgorICoKKyAqIENyZWF0ZWQgb24gRmViIDI0LCAyMDA2CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlVXRpbHMgeworICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzX3Rlc3RDbGFzc1BhdGhzOworCisgIC8qKiBUaGUgYWRkaXRpb25hbCBjbGFzcyBsb2FkZXJzIHRvIGZpbmQgY2xhc3NlcyBpbi4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxDbGFzc0xvYWRlcj4gbV9jbGFzc0xvYWRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKKworICAvKiogQWRkIGEgY2xhc3MgbG9hZGVyIHRvIHRoZSBzZWFyY2hhYmxlIGxvYWRlcnMuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICBtX2NsYXNzTG9hZGVycy5hZGQobG9hZGVyKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gcGFja2FnZU5hbWUKKyAgICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwgdGhlIGNsYXNzZXMgaW5zaWRlIHRoaXMgcGFja2FnZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGZpbmRDbGFzc2VzSW5QYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgIExpc3Q8U3RyaW5nPiBpbmNsdWRlZCwgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVkKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICB7CisgICAgU3RyaW5nIHBhY2thZ2VPbmx5ID0gcGFja2FnZU5hbWU7CisgICAgYm9vbGVhbiByZWN1cnNpdmUgPSBmYWxzZTsKKyAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi4qIikpIHsKKyAgICAgIHBhY2thZ2VPbmx5ID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VOYW1lLmxhc3RJbmRleE9mKCIuKiIpKTsKKyAgICAgIHJlY3Vyc2l2ZSA9IHRydWU7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IHZSZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBTdHJpbmcgcGFja2FnZURpck5hbWUgPSBwYWNrYWdlT25seS5yZXBsYWNlKCcuJywgJy8nKSArIChwYWNrYWdlT25seS5sZW5ndGgoKSA+IDAgPyAiLyIgOiAiIik7CisKKworICAgIFZlY3RvcjxVUkw+IGRpcnMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAvLyBnbyB0aHJvdWdoIGFkZGl0aW9uYWwgY2xhc3MgbG9hZGVycworICAgIFZlY3RvcjxDbGFzc0xvYWRlcj4gYWxsQ2xhc3NMb2FkZXJzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICBpZiAoY29udGV4dENsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgIGFsbENsYXNzTG9hZGVycy5hZGQoY29udGV4dENsYXNzTG9hZGVyKTsKKyAgICB9CisgICAgaWYgKG1fY2xhc3NMb2FkZXJzICE9IG51bGwpIHsKKyAgICAgIGFsbENsYXNzTG9hZGVycy5hZGRBbGwobV9jbGFzc0xvYWRlcnMpOworICAgIH0KKworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA6IGFsbENsYXNzTG9hZGVycykgeworICAgICAgKytjb3VudDsKKyAgICAgIGlmIChudWxsID09IGNsYXNzTG9hZGVyKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgRW51bWVyYXRpb248VVJMPiBkaXJFbnVtZXJhdGlvbiA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlcyhwYWNrYWdlRGlyTmFtZSk7CisgICAgICB3aGlsZShkaXJFbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSl7CisgICAgICAgIFVSTCBkaXIgPSBkaXJFbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICBkaXJzLmFkZChkaXIpOworICAgICAgfQorICAgIH0KKworICAgIEl0ZXJhdG9yPFVSTD4gZGlySXRlcmF0b3IgPSBkaXJzLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGRpckl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgVVJMIHVybCA9IGRpckl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIFN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgaWYoIW1hdGNoVGVzdENsYXNzcGF0aCh1cmwsIHBhY2thZ2VEaXJOYW1lLCByZWN1cnNpdmUpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoImZpbGUiLmVxdWFscyhwcm90b2NvbCkpIHsKKyAgICAgICAgZmluZENsYXNzZXNJbkRpclBhY2thZ2UocGFja2FnZU9ubHksIGluY2x1ZGVkLCBleGNsdWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSwgIlVURi04IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJlc3VsdCk7CisgICAgICB9CisgICAgICBlbHNlIGlmICgiamFyIi5lcXVhbHMocHJvdG9jb2wpKSB7CisgICAgICAgIEphckZpbGUgamFyID0gKChKYXJVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKSkuZ2V0SmFyRmlsZSgpOworICAgICAgICBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphci5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09ICcvJykgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKHBhY2thZ2VEaXJOYW1lKSkgeworICAgICAgICAgICAgaW50IGlkeCA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGlmIChpZHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpZHgpLnJlcGxhY2UoJy8nLCAnLicpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVjdXJzaXZlIHx8IHBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlT25seSkpIHsKKyAgICAgICAgICAgICAgLy9pdCdzIG5vdCBpbnNpZGUgYSBkZWVwZXIgZGlyCisgICAgICAgICAgICAgIFV0aWxzLmxvZygiUGFja2FnZVV0aWxzIiwgNCwgIlBhY2thZ2UgbmFtZSBpcyAiICsgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikgJiYgIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbmFtZS5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpIC0gNik7CisgICAgICAgICAgICAgICAgVXRpbHMubG9nKCJQYWNrYWdlVXRpbHMiLCA0LCAiRm91bmQgY2xhc3MgIiArIGNsYXNzTmFtZSArICIsIHNlZWluZyBpdCBpZiBpdCdzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIik7CisgICAgICAgICAgICAgICAgaW5jbHVkZU9yRXhjbHVkZUNsYXNzKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUsIGluY2x1ZGVkLCBleGNsdWRlZCwgdlJlc3VsdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCJidW5kbGVyZXNvdXJjZSIuZXF1YWxzKHByb3RvY29sKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIENsYXNzIHBhcmFtc1tdID0ge307CisgICAgICAgICAgLy8gQnVuZGxlVVJMQ29ubmVjdGlvbgorICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgIE1ldGhvZCB0aGlzTWV0aG9kID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2QoImdldEZpbGVVUkwiLCBwYXJhbXMpOworICAgICAgICAgIE9iamVjdCBwYXJhbXNPYmpbXSA9IHt9OworICAgICAgICAgIFVSTCBmaWxlVXJsID0gKFVSTCkgdGhpc01ldGhvZC5pbnZva2UoY29ubmVjdGlvbiwgcGFyYW1zT2JqKTsKKyAgICAgICAgICBmaW5kQ2xhc3Nlc0luRGlyUGFja2FnZShwYWNrYWdlT25seSwgaW5jbHVkZWQsIGV4Y2x1ZGVkLAorICAgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShmaWxlVXJsLmdldEZpbGUoKSwgIlVURi04IiksIHJlY3Vyc2l2ZSwgdlJlc3VsdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIC8vIGlnbm9yZSAtIHByb2JhYmx5IG5vdCBhbiBFY2xpcHNlIE9TR2kgYnVuZGxlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmdbXSByZXN1bHQgPSB2UmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1t2UmVzdWx0LnNpemUoKV0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRUZXN0Q2xhc3NwYXRoKCkgeworICAgIGlmIChudWxsICE9IHNfdGVzdENsYXNzUGF0aHMpIHsKKyAgICAgIHJldHVybiBzX3Rlc3RDbGFzc1BhdGhzOworICAgIH0KKworICAgIFN0cmluZyB0ZXN0Q2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KFRlc3RORy5URVNUX0NMQVNTUEFUSCk7CisgICAgaWYgKG51bGwgPT0gdGVzdENsYXNzcGF0aCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgU3RyaW5nW10gY2xhc3NwYXRoRnJhZ21lbnRzPSBVdGlscy5zcGxpdCh0ZXN0Q2xhc3NwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgIHNfdGVzdENsYXNzUGF0aHM9IG5ldyBTdHJpbmdbY2xhc3NwYXRoRnJhZ21lbnRzLmxlbmd0aF07CisKKyAgICBmb3IoaW50IGk9IDA7IGkgPCBjbGFzc3BhdGhGcmFnbWVudHMubGVuZ3RoOyBpKyspICB7CisgICAgICBTdHJpbmcgcGF0aD0gbnVsbDsKKyAgICAgIGlmKGNsYXNzcGF0aEZyYWdtZW50c1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikgfHwgY2xhc3NwYXRoRnJhZ21lbnRzW2ldLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi56aXAiKSkgeworICAgICAgICBwYXRoPSBjbGFzc3BhdGhGcmFnbWVudHNbaV0gKyAiIS8iOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmKGNsYXNzcGF0aEZyYWdtZW50c1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICBwYXRoPSBjbGFzc3BhdGhGcmFnbWVudHNbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcGF0aD0gY2xhc3NwYXRoRnJhZ21lbnRzW2ldICsgIi8iOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNfdGVzdENsYXNzUGF0aHNbaV09IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOworICAgIH0KKworICAgIHJldHVybiBzX3Rlc3RDbGFzc1BhdGhzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaFRlc3RDbGFzc3BhdGgoVVJMIHVybCwgU3RyaW5nIGxhc3RGcmFnbWVudCwgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICBTdHJpbmdbXSBjbGFzc3BhdGhGcmFnbWVudHM9IGdldFRlc3RDbGFzc3BhdGgoKTsKKyAgICBpZihudWxsID09IGNsYXNzcGF0aEZyYWdtZW50cykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgU3RyaW5nIGZpbGVOYW1lPSBudWxsOworICAgIHRyeSB7CisgICAgICBmaWxlTmFtZT0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSwgIlVURi04Iik7CisgICAgfQorICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVleCkgeworICAgICAgOyAvLyBpZ25vcmUuIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICB9CisKKyAgICBmb3IoU3RyaW5nIGNsYXNzcGF0aEZyYWc6IGNsYXNzcGF0aEZyYWdtZW50cykgeworICAgICAgU3RyaW5nIHBhdGg9ICBjbGFzc3BhdGhGcmFnICsgbGFzdEZyYWdtZW50OworICAgICAgaW50IGlkeD0gZmlsZU5hbWUuaW5kZXhPZihwYXRoKTsKKyAgICAgIGlmKChpZHggPT0gLTEpIHx8IChpZHggPiAwICYmIGZpbGVOYW1lLmNoYXJBdChpZHgtMSkgIT0gJy8nKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoY2xhc3NwYXRoRnJhZyArIGxhc3RGcmFnbWVudCkKKyAgICAgICAgICB8fCAocmVjdXJzaXZlICYmIGZpbGVOYW1lLmNoYXJBdChpZHggKyBwYXRoLmxlbmd0aCgpKSA9PSAnLycpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluZENsYXNzZXNJbkRpclBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbmNsdWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjbGFzc2VzKSB7CisgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShwYWNrYWdlUGF0aCk7CisKKyAgICBpZiAoIWRpci5leGlzdHMoKSB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBGaWxlW10gZGlyZmlsZXMgPSBkaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAocmVjdXJzaXZlICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgfHwgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkKKyAgICAgICAgICAgICAgfHwgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuZ3Jvb3Z5IikpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICBVdGlscy5sb2coIlBhY2thZ2VVdGlscyIsIDQsICJMb29raW5nIGZvciB0ZXN0IGNsYXNzZXMgaW4gdGhlIGRpcmVjdG9yeTogIiArIGRpcik7CisgICAgZm9yIChGaWxlIGZpbGUgOiBkaXJmaWxlcykgeworICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICBmaW5kQ2xhc3Nlc0luRGlyUGFja2FnZShtYWtlRnVsbENsYXNzTmFtZShwYWNrYWdlTmFtZSwgZmlsZS5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBmaWxlLmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLiIpKTsKKyAgICAgICAgVXRpbHMubG9nKCJQYWNrYWdlVXRpbHMiLCA0LCAiRm91bmQgY2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgKyAiLCBzZWVpbmcgaXQgaWYgaXQncyBpbmNsdWRlZCBvciBleGNsdWRlZCIpOworICAgICAgICBpbmNsdWRlT3JFeGNsdWRlQ2xhc3MocGFja2FnZU5hbWUsIGNsYXNzTmFtZSwgaW5jbHVkZWQsIGV4Y2x1ZGVkLCBjbGFzc2VzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUZ1bGxDbGFzc05hbWUoU3RyaW5nIHBrZywgU3RyaW5nIGNscykgeworICAgIHJldHVybiBwa2cubGVuZ3RoKCkgPiAwID8gcGtnICsgIi4iICsgY2xzIDogY2xzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbmNsdWRlT3JFeGNsdWRlQ2xhc3MoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgTGlzdDxTdHJpbmc+IGluY2x1ZGVkLCBMaXN0PFN0cmluZz4gZXhjbHVkZWQsIExpc3Q8U3RyaW5nPiBjbGFzc2VzKQorICB7CisgICAgaWYgKGlzSW5jbHVkZWQocGFja2FnZU5hbWUsIGluY2x1ZGVkLCBleGNsdWRlZCkpIHsKKyAgICAgIFV0aWxzLmxvZygiUGFja2FnZVV0aWxzIiwgNCwgIi4uLiBJbmNsdWRpbmcgY2xhc3MgIiArIGNsYXNzTmFtZSk7CisgICAgICBjbGFzc2VzLmFkZChtYWtlRnVsbENsYXNzTmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgVXRpbHMubG9nKCJQYWNrYWdlVXRpbHMiLCA0LCAiLi4uIEV4Y2x1ZGluZyBjbGFzcyAiICsgY2xhc3NOYW1lKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luY2x1ZGVkKFN0cmluZyBuYW1lLAorICAgICAgTGlzdDxTdHJpbmc+IGluY2x1ZGVkLCBMaXN0PFN0cmluZz4gZXhjbHVkZWQpCisgIHsKKyAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCisgICAgLy8KKyAgICAvLyBJZiBubyBpbmNsdWRlcyBub3IgZXhjbHVkZXMgd2VyZSBzcGVjaWZpZWQsIHJldHVybiB0cnVlLgorICAgIC8vCisgICAgaWYgKGluY2x1ZGVkLnNpemUoKSA9PSAwICYmIGV4Y2x1ZGVkLnNpemUoKSA9PSAwKSB7CisgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJvb2xlYW4gaXNJbmNsdWRlZCA9IFBhY2thZ2VVdGlscy5maW5kKG5hbWUsIGluY2x1ZGVkKTsKKyAgICAgIGJvb2xlYW4gaXNFeGNsdWRlZCA9IFBhY2thZ2VVdGlscy5maW5kKG5hbWUsIGV4Y2x1ZGVkKTsKKyAgICAgIGlmIChpc0luY2x1ZGVkICYmICFpc0V4Y2x1ZGVkKSB7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpc0V4Y2x1ZGVkKSB7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGluY2x1ZGVkLnNpemUoKSA9PSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaW5kKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gbGlzdCkgeworICAgIGZvciAoU3RyaW5nIHJlZ2V4cFN0ciA6IGxpc3QpIHsKKyAgICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMocmVnZXhwU3RyLCBuYW1lKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUGFyYW1ldGVySG9sZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUGFyYW1ldGVySG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJkMDkxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9QYXJhbWV0ZXJIb2xkZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQSBzaW1wbGUgaG9sZGVyIGZvciBwYXJhbWV0ZXJzIHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlcnMgYW5kIHdoZXJlIHRoZXNlIGNhbWUgZnJvbQorICogKGRhdGEgcHJvdmlkZXIgb3IgdGVzdG5nLnhtbCkKKyAqIEBhdXRob3IgY2JldXN0CisgKgorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVySG9sZGVyIHsKKyAgLyoqCisgICAqIE9yaWdpbiBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICovCisgIHB1YmxpYyBlbnVtIFBhcmFtZXRlck9yaWdpbiB7CisgICAgT1JJR0lOX0RBVEFfUFJPVklERVIsIC8vIEEgZGF0YSBwcm92aWRlcgorICAgIE9SSUdJTl9YTUwgLy8gVGVzdE5HIFhNTCBzdWl0ZQorICB9OworCisgIHB1YmxpYyBEYXRhUHJvdmlkZXJIb2xkZXIgZGF0YVByb3ZpZGVySG9sZGVyOworICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0W10+IHBhcmFtZXRlcnM7CisgIHB1YmxpYyBQYXJhbWV0ZXJPcmlnaW4gb3JpZ2luOworCisgIHB1YmxpYyBQYXJhbWV0ZXJIb2xkZXIoSXRlcmF0b3I8T2JqZWN0W10+IHBhcmFtZXRlcnMsIFBhcmFtZXRlck9yaWdpbiBvcmlnaW4sIERhdGFQcm92aWRlckhvbGRlciBkcGgpIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgdGhpcy5vcmlnaW4gPSBvcmlnaW47CisgICAgdGhpcy5kYXRhUHJvdmlkZXJIb2xkZXIgPSBkcGg7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1BhcmFtZXRlcnMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9QYXJhbWV0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2Q4NmViOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9QYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSw1MzIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSURhdGFQcm92aWRlckFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JUGFyYW1ldGVyaXphYmxlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVBhcmFtZXRlcnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuUGFyYW1ldGVySG9sZGVyLlBhcmFtZXRlck9yaWdpbjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklEYXRhUHJvdmlkYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLnV0aWwuU3RyaW5nczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCisvKioKKyAqIE1ldGhvZHMgdGhhdCBiaW5kIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGVzdG5nLnhtbCB0byBhY3R1YWwgdmFsdWVzCisgKiB1c2VkIHRvIGludm9rZSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlcnMgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1ZBTFVFPSAibnVsbCI7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBjb25zdHJ1Y3RpbmcgYSB0ZXN0IGNsYXNzIGluc3RhbmNlLgorICAgKiBAcGFyYW0gZmluZGVyIFRPRE8KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY3JlYXRlSW5zdGFudGlhdGlvblBhcmFtZXRlcnMoQ29uc3RydWN0b3IgY3RvciwKKyAgICAgIFN0cmluZyBtZXRob2RBbm5vdGF0aW9uLAorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLAorICAgICAgU3RyaW5nW10gcGFyYW1ldGVyTmFtZXMsCisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywgWG1sU3VpdGUgeG1sU3VpdGUpCisgIHsKKyAgICByZXR1cm4gY3JlYXRlUGFyYW1ldGVycyhjdG9yLnRvU3RyaW5nKCksIGN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKSwKKyAgICAgICAgZmluZGVyLmZpbmRPcHRpb25hbFZhbHVlcyhjdG9yKSwgbWV0aG9kQW5ub3RhdGlvbiwgZmluZGVyLCBwYXJhbWV0ZXJOYW1lcywKKyAgICAgICAgICAgIG5ldyBNZXRob2RQYXJhbWV0ZXJzKHBhcmFtcywgQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPmVtcHR5TWFwKCkpLAorICAgICAgICAgICAgeG1sU3VpdGUpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWVkIDx0dD5AQ29uZmlndXJhdGlvbjwvdHQ+IDxjb2RlPk1ldGhvZDwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBtIHRoZSBjb25maWd1cmF0b24gbWV0aG9kCisgICAqIEBwYXJhbSBjdXJyZW50VGVzdE1ldGhvZCB0aGUgY3VycmVudCBAVGVzdCBtZXRob2Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gQFRlc3QgaXMgYXZhaWxhYmxlICh0aGlzIGlzIG5vdAorICAgKiAgICBvbmx5IGluIGNhc2UgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kIGlzIGEgQEJlZm9yZS9AQWZ0ZXJNZXRob2QKKyAgICogQHBhcmFtIGZpbmRlciB0aGUgYW5ub3RhdGlvbiBmaW5kZXIKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY3JlYXRlQ29uZmlndXJhdGlvblBhcmFtZXRlcnMoTWV0aG9kIG0sCisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywKKyAgICAgIE9iamVjdFtdIHBhcmFtZXRlclZhbHVlcywKKyAgICAgIEBOdWxsYWJsZSBJVGVzdE5HTWV0aG9kIGN1cnJlbnRUZXN0TWV0aG9kLAorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLAorICAgICAgWG1sU3VpdGUgeG1sU3VpdGUsCisgICAgICBJVGVzdENvbnRleHQgY3R4LAorICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkKKyAgeworICAgIE1ldGhvZCBjdXJyZW50VGVzdE1ldGg9IGN1cnJlbnRUZXN0TWV0aG9kICE9IG51bGwgPworICAgICAgICBjdXJyZW50VGVzdE1ldGhvZC5nZXRNZXRob2QoKSA6IG51bGw7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGhvZFBhcmFtcyA9IGN1cnJlbnRUZXN0TWV0aG9kICE9IG51bGwKKyAgICAgICAgPyBjdXJyZW50VGVzdE1ldGhvZC5maW5kTWV0aG9kUGFyYW1ldGVycyhjdHguZ2V0Q3VycmVudFhtbFRlc3QoKSkKKyAgICAgICAgOiBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKTsKKworICAgIHJldHVybiBjcmVhdGVQYXJhbWV0ZXJzKG0sCisgICAgICAgIG5ldyBNZXRob2RQYXJhbWV0ZXJzKHBhcmFtcywKKyAgICAgICAgICAgIG1ldGhvZFBhcmFtcywKKyAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcywKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0TWV0aCwgY3R4LCB0ZXN0UmVzdWx0KSwKKyAgICAgICAgZmluZGVyLCB4bWxTdWl0ZSwgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmNsYXNzLCAiQENvbmZpZ3VyYXRpb24iKTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW5qZWN0ZWRQYXJhbWV0ZXIoQ2xhc3M8Pz4gYywgTWV0aG9kIG1ldGhvZCwgSVRlc3RDb250ZXh0IGNvbnRleHQsCisgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgaWYgKE1ldGhvZC5jbGFzcy5lcXVhbHMoYykpIHsKKyAgICAgIHJlc3VsdCA9IG1ldGhvZDsKKyAgICB9CisgICAgZWxzZSBpZiAoSVRlc3RDb250ZXh0LmNsYXNzLmVxdWFscyhjKSkgeworICAgICAgcmVzdWx0ID0gY29udGV4dDsKKyAgICB9CisgICAgZWxzZSBpZiAoWG1sVGVzdC5jbGFzcy5lcXVhbHMoYykpIHsKKyAgICAgIHJlc3VsdCA9IGNvbnRleHQuZ2V0Q3VycmVudFhtbFRlc3QoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoSVRlc3RSZXN1bHQuY2xhc3MuZXF1YWxzKGMpKSB7CisgICAgICByZXN1bHQgPSB0ZXN0UmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgcGFyYW1ldGVycyBzdWl0YWJsZSB0byBpbnZva2UgdGhpcyBtZXRob2QsIHBvc3NpYmx5CisgICAqIHBpY2tlZCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCisgICAqLworICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBjcmVhdGVQYXJhbWV0ZXJzKFN0cmluZyBtZXRob2ROYW1lLAorICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcywKKyAgICAgIFN0cmluZ1tdIG9wdGlvbmFsVmFsdWVzLAorICAgICAgU3RyaW5nIG1ldGhvZEFubm90YXRpb24sCisgICAgICBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsCisgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcywgTWV0aG9kUGFyYW1ldGVycyBwYXJhbXMsIFhtbFN1aXRlIHhtbFN1aXRlKQorICB7CisgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKKyAgICBpZihwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPiAwKSB7CisgICAgICBMaXN0PE9iamVjdD4gdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICBjaGVja1BhcmFtZXRlclR5cGVzKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBtZXRob2RBbm5vdGF0aW9uLCBwYXJhbWV0ZXJOYW1lcyk7CisKKyAgICAgIGZvcihpbnQgaSA9IDAsIGogPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgT2JqZWN0IGluamVjdCA9IGdldEluamVjdGVkUGFyYW1ldGVyKHBhcmFtZXRlclR5cGVzW2ldLCBwYXJhbXMuY3VycmVudFRlc3RNZXRob2QsCisgICAgICAgICAgICBwYXJhbXMuY29udGV4dCwgcGFyYW1zLnRlc3RSZXN1bHQpOworICAgICAgICBpZiAoaW5qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICB2UmVzdWx0LmFkZChpbmplY3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmIChqIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoKSB7CisgICAgICAgICAgICBTdHJpbmcgcCA9IHBhcmFtZXRlck5hbWVzW2pdOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyYW1zLnhtbFBhcmFtZXRlcnMuZ2V0KHApOworICAgICAgICAgICAgaWYobnVsbCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAvLyB0cnkgU3lzRW52IGVudHJpZXMKKyAgICAgICAgICAgICAgdmFsdWU9IFN5c3RlbS5nZXRQcm9wZXJ0eShwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsID09IHZhbHVlKSB7CisgICAgICAgICAgICAgIGlmIChvcHRpb25hbFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25hbFZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJQYXJhbWV0ZXIgJyIgKyBwICsgIicgaXMgcmVxdWlyZWQgYnkgIgorICAgICAgICAgICAgICAgICAgKyBtZXRob2RBbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICArICIgb24gbWV0aG9kICIKKyAgICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZQorICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBoYXMgbm90IGJlZW4gbWFya2VkIEBPcHRpb25hbCBvciBkZWZpbmVkXG4iCisgICAgICAgICAgICAgICAgICArICh4bWxTdWl0ZS5nZXRGaWxlTmFtZSgpICE9IG51bGwgPyAiaW4gIgorICAgICAgICAgICAgICAgICAgKyB4bWxTdWl0ZS5nZXRGaWxlTmFtZSgpIDogIiIpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2UmVzdWx0LmFkZChjb252ZXJ0VHlwZShwYXJhbWV0ZXJUeXBlc1tpXSwgdmFsdWUsIHApKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gdlJlc3VsdC50b0FycmF5KG5ldyBPYmplY3RbdlJlc3VsdC5zaXplKCldKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BhcmFtZXRlclR5cGVzKFN0cmluZyBtZXRob2ROYW1lLAorICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcywgU3RyaW5nIG1ldGhvZEFubm90YXRpb24sIFN0cmluZ1tdIHBhcmFtZXRlck5hbWVzKQorICB7CisgICAgaW50IHRvdGFsTGVuZ3RoID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoOworICAgIFNldDxDbGFzcz4gaW5qZWN0ZWRUeXBlcyA9IG5ldyBIYXNoU2V0PENsYXNzPigpIHsKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzI0ODk0NTgxNzkzNDM1ODEyTDsKKworICAgIHsKKyAgICAgIGFkZChJVGVzdENvbnRleHQuY2xhc3MpOworICAgICAgYWRkKElUZXN0UmVzdWx0LmNsYXNzKTsKKyAgICAgIGFkZChYbWxUZXN0LmNsYXNzKTsKKyAgICAgIGFkZChNZXRob2QuY2xhc3MpOworICAgICAgYWRkKE9iamVjdFtdLmNsYXNzKTsKKyAgICB9fTsKKyAgICBmb3IgKENsYXNzIHBhcmFtZXRlclR5cGUgOiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgaWYgKGluamVjdGVkVHlwZXMuY29udGFpbnMocGFyYW1ldGVyVHlwZSkpIHsKKyAgICAgICAgdG90YWxMZW5ndGgtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyYW1ldGVyTmFtZXMubGVuZ3RoICE9IHRvdGFsTGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCAiTWV0aG9kICIgKyBtZXRob2ROYW1lICsgIiByZXF1aXJlcyAiCisgICAgICAgICAgKyBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggKyAiIHBhcmFtZXRlcnMgYnV0ICIKKyAgICAgICAgICArIHBhcmFtZXRlck5hbWVzLmxlbmd0aAorICAgICAgICAgICsgIiB3ZXJlIHN1cHBsaWVkIGluIHRoZSAiCisgICAgICAgICAgKyBtZXRob2RBbm5vdGF0aW9uCisgICAgICAgICAgKyAiIGFubm90YXRpb24uIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFR5cGUoQ2xhc3MgdHlwZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgcGFyYW1OYW1lKSB7CisgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisKKyAgICBpZihOVUxMX1ZBTFVFLmVxdWFscyh2YWx1ZS50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgaWYodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgIFV0aWxzLmxvZygiUGFyYW1ldGVycyIsIDIsICJBdHRlbXB0IHRvIHBhc3MgbnVsbCB2YWx1ZSB0byBwcmltaXRpdmUgdHlwZSBwYXJhbWV0ZXIgJyIgKyBwYXJhbU5hbWUgKyAiJyIpOworICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsgLy8gbnVsbCB2YWx1ZSBtdXN0IGJlIHVzZWQKKyAgICB9CisKKyAgICBpZih0eXBlID09IFN0cmluZy5jbGFzcykgeworICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgfQorICAgIGVsc2UgaWYodHlwZSA9PSBpbnQuY2xhc3MgfHwgdHlwZSA9PSBJbnRlZ2VyLmNsYXNzKSB7CisgICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IGJvb2xlYW4uY2xhc3MgfHwgdHlwZSA9PSBCb29sZWFuLmNsYXNzKSB7CisgICAgICByZXN1bHQgPSBCb29sZWFuLnZhbHVlT2YodmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gYnl0ZS5jbGFzcyB8fCB0eXBlID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgIHJlc3VsdCA9IEJ5dGUucGFyc2VCeXRlKHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IGNoYXIuY2xhc3MgfHwgdHlwZSA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgIHJlc3VsdCA9IHZhbHVlLmNoYXJBdCgwKTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IGRvdWJsZS5jbGFzcyB8fCB0eXBlID09IERvdWJsZS5jbGFzcykgeworICAgICAgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IGZsb2F0LmNsYXNzIHx8IHR5cGUgPT0gRmxvYXQuY2xhc3MpIHsKKyAgICAgIHJlc3VsdCA9IEZsb2F0LnBhcnNlRmxvYXQodmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmKHR5cGUgPT0gbG9uZy5jbGFzcyB8fCB0eXBlID09IExvbmcuY2xhc3MpIHsKKyAgICAgIHJlc3VsdCA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZih0eXBlID09IHNob3J0LmNsYXNzIHx8IHR5cGUgPT0gU2hvcnQuY2xhc3MpIHsKKyAgICAgIHJlc3VsdCA9IFNob3J0LnBhcnNlU2hvcnQodmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLmlzRW51bSgpKSB7CisgICAgCXJlc3VsdCA9IEVudW0udmFsdWVPZih0eXBlLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYXNzZXJ0IGZhbHNlIDogIlVuc3VwcG9ydGVkIHR5cGUgcGFyYW1ldGVyIDogIiArIHR5cGU7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIERhdGFQcm92aWRlckhvbGRlciBmaW5kRGF0YVByb3ZpZGVyKE9iamVjdCBpbnN0YW5jZSwgSVRlc3RDbGFzcyBjbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3JPck1ldGhvZCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgRGF0YVByb3ZpZGVySG9sZGVyIHJlc3VsdCA9IG51bGw7CisKKyAgICBJRGF0YVByb3ZpZGFibGUgZHAgPSBmaW5kRGF0YVByb3ZpZGVySW5mbyhjbGF6eiwgbSwgZmluZGVyKTsKKyAgICBpZiAoZHAgIT0gbnVsbCkgeworICAgICAgU3RyaW5nIGRhdGFQcm92aWRlck5hbWUgPSBkcC5nZXREYXRhUHJvdmlkZXIoKTsKKyAgICAgIENsYXNzIGRhdGFQcm92aWRlckNsYXNzID0gZHAuZ2V0RGF0YVByb3ZpZGVyQ2xhc3MoKTsKKworICAgICAgaWYgKCEgVXRpbHMuaXNTdHJpbmdFbXB0eShkYXRhUHJvdmlkZXJOYW1lKSkgeworICAgICAgICByZXN1bHQgPSBmaW5kRGF0YVByb3ZpZGVyKGluc3RhbmNlLCBjbGF6eiwgZmluZGVyLCBkYXRhUHJvdmlkZXJOYW1lLCBkYXRhUHJvdmlkZXJDbGFzcywgY29udGV4dCk7CisKKyAgICAgICAgaWYobnVsbCA9PSByZXN1bHQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJNZXRob2QgIiArIG0gKyAiIHJlcXVpcmVzIGEgQERhdGFQcm92aWRlciBuYW1lZCA6ICIKKyAgICAgICAgICAgICAgKyBkYXRhUHJvdmlkZXJOYW1lICsgKGRhdGFQcm92aWRlckNsYXNzICE9IG51bGwgPyAiIGluIGNsYXNzICIgKyBkYXRhUHJvdmlkZXJDbGFzcy5nZXROYW1lKCkgOiAiIikKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogRmluZCB0aGUgZGF0YSBwcm92aWRlciBpbmZvIChkYXRhIHByb3ZpZGVyIG5hbWUgYW5kIGNsYXNzKSBvbiBlaXRoZXIgQFRlc3QoZGF0YVByb3ZpZGVyKSwKKyAgICogQEZhY3RvcnkoZGF0YVByb3ZpZGVyKSBvbiBhIG1ldGhvZCBvciBARmFjdG9yeShkYXRhUHJvdmlkZXIpIG9uIGEgY29uc3RydWN0b3IuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBJRGF0YVByb3ZpZGFibGUgZmluZERhdGFQcm92aWRlckluZm8oSVRlc3RDbGFzcyBjbGF6eiwgQ29uc3RydWN0b3JPck1ldGhvZCBtLAorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyKSB7CisgICAgSURhdGFQcm92aWRhYmxlIHJlc3VsdDsKKworICAgIGlmIChtLmdldE1ldGhvZCgpICE9IG51bGwpIHsKKyAgICAgIC8vCisgICAgICAvLyBAVGVzdChkYXRhUHJvdmlkZXIpIG9uIGEgbWV0aG9kCisgICAgICAvLworICAgICAgcmVzdWx0ID0gQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChmaW5kZXIsIG0uZ2V0TWV0aG9kKCkpOworICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEBGYWN0b3J5KGRhdGFQcm92aWRlcikgb24gYSBtZXRob2QKKyAgICAgICAgLy8KKyAgICAgICAgcmVzdWx0ID0gQW5ub3RhdGlvbkhlbHBlci5maW5kRmFjdG9yeShmaW5kZXIsIG0uZ2V0TWV0aG9kKCkpOworICAgICAgfQorICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEBUZXN0KGRhdGFQcm92aWRlcikgb24gYSBjbGFzcworICAgICAgICByZXN1bHQgPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRUZXN0KGZpbmRlciwgY2xhenouZ2V0UmVhbENsYXNzKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLworICAgICAgLy8gQEZhY3RvcnkoZGF0YVByb3ZpZGVyKSBvbiBhIGNvbnN0cnVjdG9yCisgICAgICAvLworICAgICAgcmVzdWx0ID0gQW5ub3RhdGlvbkhlbHBlci5maW5kRmFjdG9yeShmaW5kZXIsIG0uZ2V0Q29uc3RydWN0b3IoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBGaW5kIGEgbWV0aG9kIHRoYXQgaGFzIGEgQERhdGFQcm92aWRlcihuYW1lPW5hbWUpCisgICAqLworICBwcml2YXRlIHN0YXRpYyBEYXRhUHJvdmlkZXJIb2xkZXIgZmluZERhdGFQcm92aWRlcihPYmplY3QgaW5zdGFuY2UsIElUZXN0Q2xhc3MgY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIENsYXNzIGRhdGFQcm92aWRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENvbnRleHQgY29udGV4dCkKKyAgeworICAgIERhdGFQcm92aWRlckhvbGRlciByZXN1bHQgPSBudWxsOworCisgICAgQ2xhc3MgY2xzID0gY2xhenouZ2V0UmVhbENsYXNzKCk7CisgICAgYm9vbGVhbiBzaG91bGRCZVN0YXRpYyA9IGZhbHNlOworICAgIGlmIChkYXRhUHJvdmlkZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICBjbHMgPSBkYXRhUHJvdmlkZXJDbGFzczsKKyAgICAgIHNob3VsZEJlU3RhdGljID0gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKE1ldGhvZCBtIDogQ2xhc3NIZWxwZXIuZ2V0QXZhaWxhYmxlTWV0aG9kcyhjbHMpKSB7CisgICAgICBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBkcCA9IGZpbmRlci5maW5kQW5ub3RhdGlvbihtLCBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICBpZiAobnVsbCAhPSBkcCAmJiBuYW1lLmVxdWFscyhnZXREYXRhUHJvdmlkZXJOYW1lKGRwLCBtKSkpIHsKKyAgICAgICAgaWYgKHNob3VsZEJlU3RhdGljICYmIChtLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7CisgICAgICAgICAgSW5qZWN0b3IgaW5qZWN0b3IgPSBjb250ZXh0LmdldEluamVjdG9yKGNsYXp6KTsKKyAgICAgICAgICBpZiAoaW5qZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXRJbnN0YW5jZShkYXRhUHJvdmlkZXJDbGFzcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiRm91bmQgdHdvIHByb3ZpZGVycyBjYWxsZWQgJyIgKyBuYW1lICsgIicgb24gIiArIGNscyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gbmV3IERhdGFQcm92aWRlckhvbGRlcihkcCwgbSwgaW5zdGFuY2UpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YVByb3ZpZGVyTmFtZShJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBkcCwgTWV0aG9kIG0pIHsKKwkgIHJldHVybiBTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZHAuZ2V0TmFtZSgpKSA/IG0uZ2V0TmFtZSgpIDogZHAuZ2V0TmFtZSgpOworICB9CisgIAorICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdIGNyZWF0ZVBhcmFtZXRlcnMoTWV0aG9kIG0sIE1ldGhvZFBhcmFtZXRlcnMgcGFyYW1zLAorICAgICAgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBYbWxTdWl0ZSB4bWxTdWl0ZSwgQ2xhc3MgYW5ub3RhdGlvbkNsYXNzLCBTdHJpbmcgYXROYW1lKQorICB7CisgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgT2JqZWN0W10gZXh0cmFQYXJhbWV0ZXJzOworICAgIC8vCisgICAgLy8gVHJ5IHRvIGZpbmQgYW4gQFBhcmFtZXRlcnMgYW5ub3RhdGlvbgorICAgIC8vCisgICAgSVBhcmFtZXRlcnNBbm5vdGF0aW9uIGFubm90YXRpb24gPSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSVBhcmFtZXRlcnNBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICBDbGFzczw/PltdIHR5cGVzID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgIGlmKG51bGwgIT0gYW5ub3RhdGlvbikgeworICAgICAgU3RyaW5nW10gcGFyYW1ldGVyTmFtZXMgPSBhbm5vdGF0aW9uLmdldFZhbHVlKCk7CisgICAgICBleHRyYVBhcmFtZXRlcnMgPSBjcmVhdGVQYXJhbWV0ZXJzKG0uZ2V0TmFtZSgpLCB0eXBlcywKKyAgICAgICAgICBmaW5kZXIuZmluZE9wdGlvbmFsVmFsdWVzKG0pLCBhdE5hbWUsIGZpbmRlciwgcGFyYW1ldGVyTmFtZXMsIHBhcmFtcywgeG1sU3VpdGUpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRWxzZSwgdXNlIHRoZSBkZXByZWNhdGVkIHN5bnRheAorICAgIC8vCisgICAgZWxzZSB7CisgICAgICBJUGFyYW1ldGVyaXphYmxlIGEgPSAoSVBhcmFtZXRlcml6YWJsZSkgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIGFubm90YXRpb25DbGFzcyk7CisgICAgICBpZihudWxsICE9IGEgJiYgYS5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCkgeworICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcyA9IGEuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBleHRyYVBhcmFtZXRlcnMgPSBjcmVhdGVQYXJhbWV0ZXJzKG0uZ2V0TmFtZSgpLCB0eXBlcywKKyAgICAgICAgICAgIGZpbmRlci5maW5kT3B0aW9uYWxWYWx1ZXMobSksIGF0TmFtZSwgZmluZGVyLCBwYXJhbWV0ZXJOYW1lcywgcGFyYW1zLCB4bWxTdWl0ZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgZXh0cmFQYXJhbWV0ZXJzID0gY3JlYXRlUGFyYW1ldGVycyhtLmdldE5hbWUoKSwgdHlwZXMsCisgICAgICAgICAgICBmaW5kZXIuZmluZE9wdGlvbmFsVmFsdWVzKG0pLCBhdE5hbWUsIGZpbmRlciwgbmV3IFN0cmluZ1swXSwgcGFyYW1zLCB4bWxTdWl0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBZGQgdGhlIGV4dHJhIHBhcmFtZXRlcnMgd2UgZm91bmQKKyAgICAvLworICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIGV4dHJhUGFyYW1ldGVycyk7CisKKyAgICAvLyBJZiB0aGUgbWV0aG9kIGRlY2xhcmVkIGFuIE9iamVjdFtdIHBhcmFtZXRlciBhbmQgd2UgaGF2ZSBwYXJhbWV0ZXIgdmFsdWVzLCBpbmplY3QgdGhlbQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKE9iamVjdFtdLmNsYXNzLmVxdWFscyh0eXBlc1tpXSkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoaSwgcGFyYW1zLnBhcmFtZXRlclZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgT2JqZWN0W3Jlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIC8qKgorICAgKiBJZiB0aGUgbWV0aG9kIGhhcyBwYXJhbWV0ZXJzLCBmaWxsIHRoZW0gaW4uIEVpdGhlciBieSB1c2luZyBhIEBEYXRhUHJvdmlkZXIKKyAgICogaWYgYW55IHdhcyBwcm92aWRlZCwgb3IgYnkgbG9va2luZyB1cCA8cGFyYW1ldGVycz4gaW4gdGVzdG5nLnhtbAorICAgKiBAcmV0dXJuIEFuIEl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIgb2YgdGhpcworICAgKiBtZXRob2QuCisgICAqLworICBwdWJsaWMgc3RhdGljIFBhcmFtZXRlckhvbGRlciBoYW5kbGVQYXJhbWV0ZXJzKElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCwKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWxsUGFyYW1ldGVyTmFtZXMsCisgICAgICBPYmplY3QgaW5zdGFuY2UsCisgICAgICBNZXRob2RQYXJhbWV0ZXJzIG1ldGhvZFBhcmFtcywKKyAgICAgIFhtbFN1aXRlIHhtbFN1aXRlLAorICAgICAgSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgIE9iamVjdCBmZWRJbnN0YW5jZSkKKyAgeworICAgIFBhcmFtZXRlckhvbGRlciByZXN1bHQ7CisgICAgSXRlcmF0b3I8T2JqZWN0W10+IHBhcmFtZXRlcnM7CisKKyAgICAvKgorICAgICAqIERvIHdlIGhhdmUgYSBARGF0YVByb3ZpZGVyPyBJZiB5ZXMsIHRoZW4gd2UgaGF2ZSBzZXZlcmFsCisgICAgICogc2V0cyBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZAorICAgICAqLworICAgIERhdGFQcm92aWRlckhvbGRlciBkYXRhUHJvdmlkZXJIb2xkZXIgPQorICAgICAgICBmaW5kRGF0YVByb3ZpZGVyKGluc3RhbmNlLCB0ZXN0TWV0aG9kLmdldFRlc3RDbGFzcygpLAorICAgICAgICAgICAgdGVzdE1ldGhvZC5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCksIGFubm90YXRpb25GaW5kZXIsIG1ldGhvZFBhcmFtcy5jb250ZXh0KTsKKworICAgIGlmIChudWxsICE9IGRhdGFQcm92aWRlckhvbGRlcikgeworICAgICAgaW50IHBhcmFtZXRlckNvdW50ID0gdGVzdE1ldGhvZC5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7IGkrKykgeworICAgICAgICBTdHJpbmcgbiA9ICJwYXJhbSIgKyBpOworICAgICAgICBhbGxQYXJhbWV0ZXJOYW1lcy5wdXQobiwgbik7CisgICAgICB9CisKKyAgICAgIHBhcmFtZXRlcnMgPSBNZXRob2RJbnZvY2F0aW9uSGVscGVyLmludm9rZURhdGFQcm92aWRlcigKKyAgICAgICAgICBkYXRhUHJvdmlkZXJIb2xkZXIuaW5zdGFuY2UsIC8qIGEgdGVzdCBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBkYXRhcHJvdmlkZXIgaXMgc3RhdGljKi8KKyAgICAgICAgICBkYXRhUHJvdmlkZXJIb2xkZXIubWV0aG9kLAorICAgICAgICAgIHRlc3RNZXRob2QsCisgICAgICAgICAgbWV0aG9kUGFyYW1zLmNvbnRleHQsCisgICAgICAgICAgZmVkSW5zdGFuY2UsCisgICAgICAgICAgYW5ub3RhdGlvbkZpbmRlcik7CisKKyAgICAgIEl0ZXJhdG9yPE9iamVjdFtdPiBmaWx0ZXJlZFBhcmFtZXRlcnMgPSBmaWx0ZXJQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsCisgICAgICAgICAgdGVzdE1ldGhvZC5nZXRJbnZvY2F0aW9uTnVtYmVycygpKTsKKworICAgICAgcmVzdWx0ID0gbmV3IFBhcmFtZXRlckhvbGRlcihmaWx0ZXJlZFBhcmFtZXRlcnMsIFBhcmFtZXRlck9yaWdpbi5PUklHSU5fREFUQV9QUk9WSURFUiwKKyAgICAgICAgICBkYXRhUHJvdmlkZXJIb2xkZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vCisgICAgICAvLyBOb3JtYWwgY2FzZTogd2UgaGF2ZSBvbmx5IG9uZSBzZXQgb2YgcGFyYW1ldGVycyBjb21pbmcgZnJvbSB0ZXN0bmcueG1sCisgICAgICAvLworICAgICAgYWxsUGFyYW1ldGVyTmFtZXMucHV0QWxsKG1ldGhvZFBhcmFtcy54bWxQYXJhbWV0ZXJzKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBPYmplY3RbXVtdIGNvbnRhaW5pbmcganVzdCBvbmUgcm93IG9mIHBhcmFtZXRlcnMKKyAgICAgIE9iamVjdFtdW10gYWxsUGFyYW1ldGVyVmFsdWVzQXJyYXkgPSBuZXcgT2JqZWN0WzFdW107CisgICAgICBhbGxQYXJhbWV0ZXJWYWx1ZXNBcnJheVswXSA9IGNyZWF0ZVBhcmFtZXRlcnModGVzdE1ldGhvZC5nZXRNZXRob2QoKSwKKyAgICAgICAgICBtZXRob2RQYXJhbXMsIGFubm90YXRpb25GaW5kZXIsIHhtbFN1aXRlLCBJVGVzdEFubm90YXRpb24uY2xhc3MsICJAVGVzdCIpOworCisgICAgICAvLyBNYXJrIHRoYXQgdGhpcyBtZXRob2QgbmVlZHMgdG8gaGF2ZSBhdCBsZWFzdCBhIGNlcnRhaW4KKyAgICAgIC8vIG51bWJlciBvZiBpbnZvY2F0aW9ucyAobmVlZGVkIGxhdGVyIHRvIGNhbGwgQWZ0ZXJHcm91cHMKKyAgICAgIC8vIGF0IHRoZSByaWdodCB0aW1lKS4KKyAgICAgIHRlc3RNZXRob2Quc2V0UGFyYW1ldGVySW52b2NhdGlvbkNvdW50KGFsbFBhcmFtZXRlclZhbHVlc0FycmF5Lmxlbmd0aCk7CisgICAgICAvLyBUdXJuIGl0IGludG8gYW4gSXRlcmFibGUKKyAgICAgIHBhcmFtZXRlcnMgPSBNZXRob2RIZWxwZXIuY3JlYXRlQXJyYXlJdGVyYXRvcihhbGxQYXJhbWV0ZXJWYWx1ZXNBcnJheSk7CisKKyAgICAgIHJlc3VsdCA9IG5ldyBQYXJhbWV0ZXJIb2xkZXIocGFyYW1ldGVycywgUGFyYW1ldGVyT3JpZ2luLk9SSUdJTl9YTUwsIG51bGwpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogSWYgbnVtYmVycyBpcyBlbXB0eSwgcmV0dXJuIHBhcmFtZXRlcnMsIG90aGVyd2lzZSwgcmV0dXJuIGEgc3Vic2V0IG9mIHBhcmFtZXRlcnMKKyAgICogd2hvc2Ugb3JkaW5hbCBudW1iZXIgbWF0Y2ggdGhlc2UgZm91bmQgaW4gbnVtYmVycy4KKyAgICovCisgIHN0YXRpYyBwcml2YXRlIEl0ZXJhdG9yPE9iamVjdFtdPiBmaWx0ZXJQYXJhbWV0ZXJzKEl0ZXJhdG9yPE9iamVjdFtdPiBwYXJhbWV0ZXJzLAorICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0KSB7CisgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9IGVsc2UgeworICAgICAgTGlzdDxPYmplY3RbXT4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBpbnQgaSA9IDA7CisgICAgICB3aGlsZSAocGFyYW1ldGVycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgT2JqZWN0W10gbmV4dCA9IHBhcmFtZXRlcnMubmV4dCgpOworICAgICAgICBpZiAobGlzdC5jb250YWlucyhpKSkgeworICAgICAgICAgIHJlc3VsdC5hZGQobmV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHJlc3VsdC50b0FycmF5KG5ldyBPYmplY3RbbGlzdC5zaXplKCldW10pKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1BhcmFtZXRlcnNdICIgKyBzKTsKKyAgfQorCisgIC8qKiBBIHBhcmFtZXRlciBwYXNzaW5nIGhlbHBlciBjbGFzcy4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRob2RQYXJhbWV0ZXJzIHsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4geG1sUGFyYW1ldGVyczsKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBjdXJyZW50VGVzdE1ldGhvZDsKKyAgICBwcml2YXRlIGZpbmFsIElUZXN0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzOworICAgIHB1YmxpYyBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0OworCisgICAgcHVibGljIE1ldGhvZFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0aG9kUGFyYW1zKSB7CisgICAgICB0aGlzKHBhcmFtcywgbWV0aG9kUGFyYW1zLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRob2RQYXJhbXMsCisgICAgICAgIE1ldGhvZCBtKSB7CisgICAgICB0aGlzKHBhcmFtcywgbWV0aG9kUGFyYW1zLCBudWxsLCBtLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHN1aXRlIGFuZCB0ZXN0IHRhZ3MKKyAgICAgKiBAcGFyYW0gbWV0aG9kUGFyYW1zIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIGluY2x1ZGUgdGFnCisgICAgICogQHBhcmFtIHB2CisgICAgICogQHBhcmFtIG0KKyAgICAgKiBAcGFyYW0gY3R4CisgICAgICogQHBhcmFtIHRyCisgICAgICovCisgICAgcHVibGljIE1ldGhvZFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMsCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0aG9kUGFyYW1zLAorICAgICAgICBPYmplY3RbXSBwdiwgTWV0aG9kIG0sIElUZXN0Q29udGV4dCBjdHgsCisgICAgICAgIElUZXN0UmVzdWx0IHRyKSB7CisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbFBhcmFtcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgYWxsUGFyYW1zLnB1dEFsbChwYXJhbXMpOworICAgICAgYWxsUGFyYW1zLnB1dEFsbChtZXRob2RQYXJhbXMpOworICAgICAgeG1sUGFyYW1ldGVycyA9IGFsbFBhcmFtczsKKyAgICAgIGN1cnJlbnRUZXN0TWV0aG9kID0gbTsKKyAgICAgIGNvbnRleHQgPSBjdHg7CisgICAgICBwYXJhbWV0ZXJWYWx1ZXMgPSBwdjsKKyAgICAgIHRlc3RSZXN1bHQgPSB0cjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Qb29sU2VydmljZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Bvb2xTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU2NWY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Qb29sU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworCisvKioKKyAqIFNpbXBsZSB3cmFwcGVyIGZvciBhbiBFeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgUG9vbFNlcnZpY2U8RnV0dXJlVHlwZT4geworCisgIHByaXZhdGUgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTxGdXR1cmVUeXBlPiBtX2NvbXBsZXRpb25TZXJ2aWNlOworICBwcml2YXRlIFRocmVhZEZhY3RvcnkgbV90aHJlYWRGYWN0b3J5OworICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBtX2V4ZWN1dG9yOworCisgIHB1YmxpYyBQb29sU2VydmljZShpbnQgdGhyZWFkUG9vbFNpemUpIHsKKyAgICBtX3RocmVhZEZhY3RvcnkgPSBuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgIHByaXZhdGUgaW50IG1fdGhyZWFkSW5kZXggPSAwOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgVGhyZWFkIHJlc3VsdCA9IG5ldyBUaHJlYWQocik7CisgICAgICAgIHJlc3VsdC5zZXROYW1lKCJQb29sU2VydmljZS0iICsgbV90aHJlYWRJbmRleCk7CisgICAgICAgIG1fdGhyZWFkSW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9OworICAgIG1fZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKHRocmVhZFBvb2xTaXplLCBtX3RocmVhZEZhY3RvcnkpOworICAgIG1fY29tcGxldGlvblNlcnZpY2UgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTw+KG1fZXhlY3V0b3IpOworICB9CisKKyAgcHVibGljIExpc3Q8RnV0dXJlVHlwZT4gc3VibWl0VGFza3NBbmRXYWl0KExpc3Q8PyBleHRlbmRzIENhbGxhYmxlPEZ1dHVyZVR5cGU+PiB0YXNrcykgeworICAgIExpc3Q8RnV0dXJlVHlwZT4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBmb3IgKENhbGxhYmxlPEZ1dHVyZVR5cGU+IGNhbGxhYmxlIDogdGFza3MpIHsKKyAgICAgIG1fY29tcGxldGlvblNlcnZpY2Uuc3VibWl0KGNhbGxhYmxlKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5zaXplKCk7IGkrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgRnV0dXJlPEZ1dHVyZVR5cGU+IHRha2UgPSBtX2NvbXBsZXRpb25TZXJ2aWNlLnRha2UoKTsKKyAgICAgICAgcmVzdWx0LmFkZCh0YWtlLmdldCgpKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHwgRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtX2V4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Byb3BlcnRpZXNGaWxlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUHJvcGVydGllc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODRlNGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Byb3BlcnRpZXNGaWxlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGxvYWRzIGFuZCBhYnN0cmFjdHMgcmVtb3RlLnByb3BlcnRpZXMNCisgKg0KKyAqIEBhdXRob3IgY2JldXN0DQorICogQGF1dGhvciBHdXkgS29ybGFuZA0KKyAqIEBzaW5jZSBBcHJpbCAxMywgMjAwNg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzRmlsZSB7DQorDQorICBwcml2YXRlIFByb3BlcnRpZXMgbV9wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsNCisNCisgIC8qKg0KKyAgICogTG9hZHMgYSBQcm9wZXJ0aWVzIGZpbGUuDQorICAgKg0KKyAgICogQHBhcmFtIGZpbGVOYW1lIHByb3BlcnRpZXMgZmlsZSBwYXRoDQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBQcm9wZXJ0aWVzIGZpbGUuDQorICAgKi8NCisgIHB1YmxpYyBQcm9wZXJ0aWVzRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbg0KKyAgew0KKwkgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOw0KKwkgIC8vDQorCSAgLy8gUGFyc2UgdGhlIFByb3BlcnRpZXMgZmlsZQ0KKwkgIC8vDQorCSAgdHJ5IHsNCisJCSAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlTmFtZSkpOw0KKwkJICBtX3Byb3BlcnRpZXMubG9hZChmaXMpOw0KKwkgIH0NCisJICBmaW5hbGx5DQorCSAgew0KKwkJICBpZiggZmlzICE9IG51bGwpIHsNCisgICAgICAgIGZpcy5jbG9zZSgpOw0KKyAgICAgIH0NCisJICB9DQorICB9DQorDQorICAvKioNCisgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgbG9hZGVkLg0KKyAgICogQHJldHVybiBsb2FkZWQgcHJvcGVydGllcy4NCisgICAqLw0KKyAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpDQorICB7DQorCSAgcmV0dXJuIG1fcHJvcGVydGllczsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Byb3BlcnR5VXRpbHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Qcm9wZXJ0eVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmE2OTExMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9Qcm9wZXJ0eVV0aWxzLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5sb2c0dGVzdG5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNldHRpbmcgSmF2YUJlYW5zLXN0eWxlIHByb3BlcnRpZXMgb24gaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgQ29zbWluIE1hcmdpbmVhbiwgQXByIDEyLCAyMDA3CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVV0aWxzIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihQcm9wZXJ0eVV0aWxzLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKKyAgICAgIExPR0dFUi53YXJuKCJDYW5ub3Qgc2V0IHByb3BlcnR5ICIgKyBuYW1lICsgIiB3aXRoIHZhbHVlICIgKyB2YWx1ZSArICIuIFRoZSB0YXJnZXQgaW5zdGFuY2UgaXMgbnVsbCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENsYXNzIHByb3BDbGFzcyA9IGdldFByb3BlcnR5VHlwZShpbnN0YW5jZS5nZXRDbGFzcygpLCBuYW1lKTsKKyAgICBpZiAocHJvcENsYXNzID09IG51bGwpIHsKKyAgICAgIExPR0dFUi53YXJuKCJDYW5ub3Qgc2V0IHByb3BlcnR5ICIgKyBuYW1lICsgIiB3aXRoIHZhbHVlICIgKyB2YWx1ZSArICIuIFByb3BlcnR5IGNsYXNzIGNvdWxkIG5vdCBiZSBmb3VuZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE9iamVjdCByZWFsVmFsdWUgPSBQYXJhbWV0ZXJzLmNvbnZlcnRUeXBlKHByb3BDbGFzcywgdmFsdWUsIG5hbWUpOworICAgIC8vVE9ETzogSGVyZSB0aGUgcHJvcGVydHkgZGVzYyBpcyBzZXJjaGVkIGFnYWluCisgICAgc2V0UHJvcGVydHlSZWFsVmFsdWUoaW5zdGFuY2UsIG5hbWUsIHJlYWxWYWx1ZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFByb3BlcnR5VHlwZShDbGFzcyBpbnN0YW5jZUNsYXNzLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgaWYgKGluc3RhbmNlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgTE9HR0VSLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBwcm9wZXJ0eSBjbGFzcyBmb3IgIiArIHByb3BlcnR5TmFtZSArICIuIFRhcmdldCBpbnN0YW5jZSBjbGFzcyBpcyBudWxsIik7CisgICAgfQorICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihpbnN0YW5jZUNsYXNzLCBwcm9wZXJ0eU5hbWUpOworICAgIHJldHVybiBwcm9wRGVzYy5nZXRQcm9wZXJ0eVR5cGUoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKKyAgICBpZiAodGFyZ2V0Q2xhc3MgPT0gbnVsbCkgeworICAgICAgTE9HR0VSLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBwcm9wZXJ0eSAiICsgcHJvcGVydHlOYW1lICsgIi4gQ2xhc3MgaXMgbnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICB0cnkgeworICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyh0YXJnZXRDbGFzcyk7CisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MgOiBwcm9wRGVzY3JpcHRvcnMpIHsKKyAgICAgICAgICBpZiAocHJvcERlc2MuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBwcm9wRGVzYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICBMT0dHRVIud2FybigiQ2Fubm90IHJldHJpZXZlIHByb3BlcnR5ICIgKyBwcm9wZXJ0eU5hbWUgKyAiLiBDYXVzZSBpczogIiArIGllKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eVJlYWxWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgTE9HR0VSLndhcm4oIkNhbm5vdCBzZXQgcHJvcGVydHkgIiArIG5hbWUgKyAiIHdpdGggdmFsdWUgIiArIHZhbHVlICsgIi4gVGFyZ2UgaW5zdGFuY2UgaXMgbnVsbCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihpbnN0YW5jZS5nZXRDbGFzcygpLCBuYW1lKTsKKyAgICBpZiAocHJvcERlc2MgPT0gbnVsbCkgeworICAgICAgTE9HR0VSLndhcm4oIkNhbm5vdCBzZXQgcHJvcGVydHkgIiArIG5hbWUgKyAiIHdpdGggdmFsdWUgIiArIHZhbHVlICsgIi4gUHJvcGVydHkgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNZXRob2QgbWV0aG9kID0gcHJvcERlc2MuZ2V0V3JpdGVNZXRob2QoKTsKKyAgICB0cnkgeworICAgICAgbWV0aG9kLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtde3ZhbHVlfSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWFlKSB7CisgICAgICBMT0dHRVIud2FybigiQ2Fubm90IHNldCBwcm9wZXJ0eSAiICsgbmFtZSArICIgd2l0aCB2YWx1ZSAiICsgdmFsdWUgKyAiLiBDYXVzZSAiICsgaWFlKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1JlZ2V4cEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1JlZ2V4cEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZjFlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUmVnZXhwRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbnMgYW5kIHRoZSBtZXNzYWdlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBSZWdleHBFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIgaW1wbGVtZW50cyBJRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRUdFWFAgPSAiLioiOworCisgIHByaXZhdGUgZmluYWwgSUFubm90YXRpb25GaW5kZXIgZmluZGVyOworICBwcml2YXRlIGZpbmFsIElUZXN0TkdNZXRob2QgbWV0aG9kOworCisgIHB1YmxpYyBSZWdleHBFeHBlY3RlZEV4Y2VwdGlvbnNIb2xkZXIoSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBJVGVzdE5HTWV0aG9kIG1ldGhvZCkgeworICAgIHRoaXMuZmluZGVyID0gZmluZGVyOworICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICB9CisKKyAgLyoqCisgICAqICAgbWVzc2FnZSAvIHJlZ0V4ICAuKiAgICAgIG90aGVyCisgICAqICAgbnVsbCAgICAgICAgICAgICB0cnVlICAgIGZhbHNlCisgICAqICAgbm9uLW51bGwgICAgICAgICB0cnVlICAgIG1hdGNoCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNUaHJvd2FibGVNYXRjaGluZyhUaHJvd2FibGUgaXRlKSB7CisgICAgU3RyaW5nIG1lc3NhZ2VSZWdFeHAgPSBnZXRSZWdFeHAoKTsKKworICAgIGlmIChERUZBVUxUX1JFR0VYUC5lcXVhbHMobWVzc2FnZVJlZ0V4cCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gaXRlLmdldE1lc3NhZ2UoKTsKKyAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsICYmIFBhdHRlcm4uY29tcGlsZShtZXNzYWdlUmVnRXhwLCBQYXR0ZXJuLkRPVEFMTCkubWF0Y2hlcihtZXNzYWdlKS5tYXRjaGVzKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFdyb25nRXhjZXB0aW9uTWVzc2FnZShUaHJvd2FibGUgaXRlKSB7CisgICAgcmV0dXJuICJUaGUgZXhjZXB0aW9uIHdhcyB0aHJvd24gd2l0aCB0aGUgd3JvbmcgbWVzc2FnZToiICsKKyAgICAgICAgICAgIiBleHBlY3RlZCBcIiIgKyBnZXRSZWdFeHAoKSArICJcIiIgKworICAgICAgICAgICAiIGJ1dCBnb3QgXCIiICsgaXRlLmdldE1lc3NhZ2UoKSArICJcIiI7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRSZWdFeHAoKSB7CisgICAgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24gZXhwZWN0ZWRFeGNlcHRpb25zID0KKyAgICAgICAgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uY2xhc3MpOworICAgIGlmIChleHBlY3RlZEV4Y2VwdGlvbnMgIT0gbnVsbCkgeworICAgICAgLy8gT2xkIHN5bnRheCA9PiBkZWZhdWx0IHZhbHVlCisgICAgICByZXR1cm4gREVGQVVMVF9SRUdFWFA7CisgICAgfQorCisgICAgLy8gTmV3IHN5bnRheAorICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0QW5ub3RhdGlvbiA9IGZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgaWYgKHRlc3RBbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0ZXN0QW5ub3RhdGlvbi5nZXRFeHBlY3RlZEV4Y2VwdGlvbnNNZXNzYWdlUmVnRXhwKCk7CisgICAgfQorCisgICAgcmV0dXJuIERFRkFVTFRfUkVHRVhQOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUmVzdWx0TWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUmVzdWx0TWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUzN2VlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9SZXN1bHRNYXAuamF2YQpAQCAtMCwwICsxLDc3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLklSZXN1bHRNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5PYmplY3RzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBSZXN1bHRNYXAgaW1wbGVtZW50cyBJUmVzdWx0TWFwIHsKKyAgLyoqCisgICAqCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MDEzNDM3NjUxNTk5OTA5M0w7CisgIHByaXZhdGUgTWFwPElUZXN0UmVzdWx0LCBJVGVzdE5HTWV0aG9kPiBtX21hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZFJlc3VsdChJVGVzdFJlc3VsdCByZXN1bHQsIElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgbV9tYXAucHV0KHJlc3VsdCwgbWV0aG9kKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PElUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgU2V0PElUZXN0UmVzdWx0PiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICBmb3IgKE1hcC5FbnRyeTxJVGVzdFJlc3VsdCwgSVRlc3ROR01ldGhvZD4gZW50cnkgOiBtX21hcC5lbnRyeVNldCgpKSB7CisgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMobWV0aG9kKSkgeworICAgICAgICByZXN1bHQuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc3VsdChJVGVzdE5HTWV0aG9kIG0pIHsKKyAgICBmb3IgKEVudHJ5PElUZXN0UmVzdWx0LCBJVGVzdE5HTWV0aG9kPiBlbnRyeSA6IG1fbWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmVxdWFscyhtKSkgeworICAgICAgICBtX21hcC5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc3VsdChJVGVzdFJlc3VsdCByKSB7CisgICAgbV9tYXAucmVtb3ZlKHIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8SVRlc3RSZXN1bHQ+IGdldEFsbFJlc3VsdHMoKSB7CisgICAgcmV0dXJuIG1fbWFwLmtleVNldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICByZXR1cm4gbV9tYXAuc2l6ZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IGdldEFsbE1ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1fbWFwLnZhbHVlcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIoZ2V0Q2xhc3MoKSkKKyAgICAgICAgLmFkZCgibWFwIiwgbV9tYXApCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9SdW5JbmZvLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUnVuSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmNjVkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvUnVuSW5mby5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yQ29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRldGVybWluZQorICogd2hhdCBtZXRob2RzIHNob3VsZCBiZSBydW4uICBJdCBnZXRzIGludm9rZWQgYnkgdGhlIFRlc3RSdW5uZXIKKyAqIGFuZCB0aGVuIGdvZXMgdGhyb3VnaCBpdHMgbGlzdCBvZiBtZXRob2Qgc2VsZWN0b3JzIHRvIGRlY2lkZSB3aGF0IG1ldGhvZHMKKyAqIG5lZWQgdG8gYmUgcnVuLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIFJ1bkluZm8gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTA4NTIyMTY3MjgyMjU2Mjg4OEw7CisgIHRyYW5zaWVudCBwcml2YXRlIExpc3Q8TWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yPgorICAgIG1fbWV0aG9kU2VsZWN0b3JzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHVibGljIHZvaWQgYWRkTWV0aG9kU2VsZWN0b3IoSU1ldGhvZFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgcHJpb3JpdHkpIHsKKyAgICBVdGlscy5sb2coIlJ1bkluZm8iLCAzLCAiQWRkaW5nIG1ldGhvZCBzZWxlY3RvcjogIiArIHNlbGVjdG9yICsgIiBwcmlvcml0eTogIiArIHByaW9yaXR5KTsKKyAgICBNZXRob2RTZWxlY3RvckRlc2NyaXB0b3IgbWQgPSBuZXcgTWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yKHNlbGVjdG9yLCBwcmlvcml0eSk7CisgICAgbV9tZXRob2RTZWxlY3RvcnMuYWRkKG1kKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRydWUgYXMgc29vbiBhcyB3ZSBmb25kIGEgTWV0aG9kIFNlbGVjdG9yIHRoYXQgcmV0dXJucworICAgKiB0cnVlIGZvciB0aGUgbWV0aG9kICJ0bSIuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlTWV0aG9kKElUZXN0TkdNZXRob2QgdG0sIGJvb2xlYW4gaXNUZXN0TWV0aG9kKSB7CisgICAgQ29sbGVjdGlvbnMuc29ydChtX21ldGhvZFNlbGVjdG9ycyk7CisgICAgYm9vbGVhbiBmb3VuZE5lZ2F0aXZlID0gZmFsc2U7CisgICAgSU1ldGhvZFNlbGVjdG9yQ29udGV4dCBjb250ZXh0ID0gbmV3IERlZmF1bHRNZXRob2RTZWxlY3RvckNvbnRleHQoKTsKKworICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgZm9yIChNZXRob2RTZWxlY3RvckRlc2NyaXB0b3IgbWRzIDogbV9tZXRob2RTZWxlY3RvcnMpIHsKKyAgICAgIC8vIElmIHdlIGZvdW5kIGFueSBuZWdhdGl2ZSBwcmlvcml0eSwgd2UgYnJlYWsgYXMgc29vbiBhcyB3ZSBlbmNvdW50ZXIKKyAgICAgIC8vIGEgc2VsZWN0b3Igd2l0aCBhIHBvc2l0aXZlIHByaW9yaXR5CisgICAgICBpZiAoISBmb3VuZE5lZ2F0aXZlKSB7CisgICAgICAgIGZvdW5kTmVnYXRpdmUgPSBtZHMuZ2V0UHJpb3JpdHkoKSA8IDA7CisgICAgICB9CisgICAgICBpZiAoZm91bmROZWdhdGl2ZSAmJiBtZHMuZ2V0UHJpb3JpdHkoKSA+PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBQcm9jZWVlZCBub3JtYWxseQorICAgICAgSU1ldGhvZFNlbGVjdG9yIG1kID0gbWRzLmdldE1ldGhvZFNlbGVjdG9yKCk7CisgICAgICByZXN1bHQgPSBtZC5pbmNsdWRlTWV0aG9kKGNvbnRleHQsIHRtLCBpc1Rlc3RNZXRob2QpOworICAgICAgaWYgKGNvbnRleHQuaXNTdG9wcGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgLy8gVGhpcyBzZWxlY3RvciByZXR1cm5lZCBmYWxzZSwgbW92ZSBvbiB0byB0aGUgbmV4dAorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbUnVuSW5mb10gIiArIHMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VGVzdE1ldGhvZHMoTGlzdDxJVGVzdE5HTWV0aG9kPiB0ZXN0TWV0aG9kcykgeworICAgIGZvciAoTWV0aG9kU2VsZWN0b3JEZXNjcmlwdG9yIG1kcyA6IG1fbWV0aG9kU2VsZWN0b3JzKSB7CisgICAgICBtZHMuc2V0VGVzdE1ldGhvZHModGVzdE1ldGhvZHMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1N1aXRlUnVubmVyTWFwLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvU3VpdGVSdW5uZXJNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc4MzNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1N1aXRlUnVubmVyTWFwLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFN1aXRlUnVubmVyTWFwIHsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIElTdWl0ZT4gbV9tYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBwdWJsaWMgdm9pZCBwdXQoWG1sU3VpdGUgeG1sU3VpdGUsIElTdWl0ZSBzdWl0ZSkgeworICAgIGZpbmFsIFN0cmluZyBuYW1lID0geG1sU3VpdGUuZ2V0TmFtZSgpOworICAgIGlmIChtX21hcC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiU3VpdGVSdW5uZXJNYXAgYWxyZWFkeSBoYXZlIHJ1bm5lciBmb3Igc3VpdGUgIiArIG5hbWUpOworICAgIH0KKyAgICBtX21hcC5wdXQobmFtZSwgc3VpdGUpOworICB9CisKKyAgcHVibGljIElTdWl0ZSBnZXQoWG1sU3VpdGUgeG1sU3VpdGUpIHsKKyAgICByZXR1cm4gbV9tYXAuZ2V0KHhtbFN1aXRlLmdldE5hbWUoKSk7CisgIH0KKworICBwdWJsaWMgQ29sbGVjdGlvbjxJU3VpdGU+IHZhbHVlcygpIHsKKyAgICByZXR1cm4gbV9tYXAudmFsdWVzKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UYXJqYW4uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UYXJqYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wN2JhMzVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Rhcmphbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRhcmphbiBhbGdvcml0aG0gdG8gZmluZCBhbmQgZGlzcGxheSBhIGN5Y2xlIGluIGEgZ3JhcGguCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgVGFyamFuPFQ+IHsKKyAgaW50IG1faW5kZXggPSAwOworICBwcml2YXRlIFN0YWNrPFQ+IG1fczsKKyAgTWFwPFQsIEludGVnZXI+IG1faW5kaWNlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBNYXA8VCwgSW50ZWdlcj4gbV9sb3dsaW5rcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIExpc3Q8VD4gbV9jeWNsZTsKKworICBwdWJsaWMgVGFyamFuKEdyYXBoPFQ+IGdyYXBoLCBUIHN0YXJ0KSB7CisgICAgbV9zID0gbmV3IFN0YWNrPD4oKTsKKyAgICBydW4oZ3JhcGgsIHN0YXJ0KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW4oR3JhcGg8VD4gZ3JhcGgsIFQgdikgeworICAgIG1faW5kaWNlcy5wdXQodiwgbV9pbmRleCk7CisgICAgbV9sb3dsaW5rcy5wdXQodiwgbV9pbmRleCk7CisgICAgbV9pbmRleCsrOworICAgIG1fcy5wdXNoKHYpOworCisgICAgZm9yIChUIHZwcmltZSA6IGdyYXBoLmdldFByZWRlY2Vzc29ycyh2KSkgeworICAgICAgaWYgKCEgbV9pbmRpY2VzLmNvbnRhaW5zS2V5KHZwcmltZSkpIHsKKyAgICAgICAgcnVuKGdyYXBoLCB2cHJpbWUpOworICAgICAgICBpbnQgbWluID0gTWF0aC5taW4obV9sb3dsaW5rcy5nZXQodiksIG1fbG93bGlua3MuZ2V0KHZwcmltZSkpOworICAgICAgICBtX2xvd2xpbmtzLnB1dCh2LCBtaW4pOworICAgICAgfQorICAgICAgZWxzZSBpZiAobV9zLmNvbnRhaW5zKHZwcmltZSkpIHsKKyAgICAgICAgbV9sb3dsaW5rcy5wdXQodiwgTWF0aC5taW4obV9sb3dsaW5rcy5nZXQodiksIG1faW5kaWNlcy5nZXQodnByaW1lKSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChPYmplY3RzLmVxdWFscyhtX2xvd2xpbmtzLmdldCh2KSwgbV9pbmRpY2VzLmdldCh2KSkpIHsKKyAgICAgIG1fY3ljbGUgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIFQgbjsKKyAgICAgIGRvIHsKKyAgICAgICAgbiA9IG1fcy5wb3AoKTsKKyAgICAgICAgbV9jeWNsZS5hZGQobik7CisgICAgICB9IHdoaWxlICghIG4uZXF1YWxzKHYpKTsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBHcmFwaDxTdHJpbmc+IGcgPSBuZXcgR3JhcGg8PigpOworICAgIGcuYWRkTm9kZSgiYSIpOworICAgIGcuYWRkTm9kZSgiYiIpOworICAgIGcuYWRkTm9kZSgiYyIpOworICAgIGcuYWRkTm9kZSgiZCIpOworCisgICAgU3RyaW5nW10gZWRnZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiYSIsICJiIiwKKyAgICAgICAgImIiLCAiYSIsCisgICAgICAgICJjIiwgImQiLAorICAgICAgICAiZCIsICJhIiwKKyAgICAgICAgImEiLCAiYyIsCisgICAgfTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgIGcuYWRkUHJlZGVjZXNzb3IoZWRnZXNbaV0sIGVkZ2VzW2krMV0pOworICAgIH0KKworICAgIG5ldyBUYXJqYW48PihnLCAiYSIpOworICB9CisKKyAgcHVibGljIExpc3Q8VD4gZ2V0Q3ljbGUoKSB7CisgICAgcmV0dXJuIG1fY3ljbGU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Rlc3RNZXRob2RXaXRoRGF0YVByb3ZpZGVyTWV0aG9kV29ya2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE1ldGhvZFdpdGhEYXRhUHJvdmlkZXJNZXRob2RXb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NmJlMTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Rlc3RNZXRob2RXaXRoRGF0YVByb3ZpZGVyTWV0aG9kV29ya2VyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKKworcHVibGljIGNsYXNzIFRlc3RNZXRob2RXaXRoRGF0YVByb3ZpZGVyTWV0aG9kV29ya2VyIGltcGxlbWVudHMgQ2FsbGFibGU8TGlzdDxJVGVzdFJlc3VsdD4+IHsKKworICBwcml2YXRlIElUZXN0TkdNZXRob2QgbV90ZXN0TWV0aG9kOworICBwcml2YXRlIE9iamVjdFtdIG1fcGFyYW1ldGVyVmFsdWVzOworICBwcml2YXRlIE9iamVjdCBtX2luc3RhbmNlOworICBwcml2YXRlIFhtbFN1aXRlIG1feG1sU3VpdGU7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX3BhcmFtZXRlcnM7CisgIHByaXZhdGUgSVRlc3RDbGFzcyBtX3Rlc3RDbGFzczsKKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kW10gbV9iZWZvcmVNZXRob2RzOworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSBtX2FmdGVyTWV0aG9kczsKKyAgcHJpdmF0ZSBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIG1fZ3JvdXBNZXRob2RzOworICBwcml2YXRlIEludm9rZXIgbV9pbnZva2VyOworICBwcml2YXRlIEV4cGVjdGVkRXhjZXB0aW9uc0hvbGRlciBtX2V4cGVjdGVkRXhjZXB0aW9uSG9sZGVyOworICBwcml2YXRlIElUZXN0Q29udGV4dCBtX3Rlc3RDb250ZXh0OworICBwcml2YXRlIGludCBtX3BhcmFtZXRlckluZGV4OworICBwcml2YXRlIGJvb2xlYW4gbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50czsKKyAgcHJpdmF0ZSBpbnQgbV9pbnZvY2F0aW9uQ291bnQ7CisgIHByaXZhdGUgSVRlc3RSZXN1bHROb3RpZmllciBtX25vdGlmaWVyOworCisgIHByaXZhdGUgTGlzdDxJVGVzdFJlc3VsdD4gbV90ZXN0UmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIGludCBtX2ZhaWx1cmVDb3VudDsKKworICBwdWJsaWMgVGVzdE1ldGhvZFdpdGhEYXRhUHJvdmlkZXJNZXRob2RXb3JrZXIoSW52b2tlciBpbnZva2VyLCBJVGVzdE5HTWV0aG9kIHRlc3RNZXRob2QsCisgICAgICBpbnQgcGFyYW1ldGVySW5kZXgsCisgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBpbnN0YW5jZSwgWG1sU3VpdGUgc3VpdGUsCisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIElUZXN0Q2xhc3MgdGVzdENsYXNzLAorICAgICAgSVRlc3ROR01ldGhvZFtdIGJlZm9yZU1ldGhvZHMsIElUZXN0TkdNZXRob2RbXSBhZnRlck1ldGhvZHMsCisgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywgRXhwZWN0ZWRFeGNlcHRpb25zSG9sZGVyIGV4cGVjdGVkRXhjZXB0aW9uSG9sZGVyLAorICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LCBib29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzLAorICAgICAgaW50IGludm9jYXRpb25Db3VudCwgaW50IGZhaWx1cmVDb3VudCwgSVRlc3RSZXN1bHROb3RpZmllciBub3RpZmllcikgeworICAgIG1faW52b2tlciA9IGludm9rZXI7CisgICAgbV90ZXN0TWV0aG9kID0gdGVzdE1ldGhvZDsKKyAgICBtX3BhcmFtZXRlckluZGV4ID0gcGFyYW1ldGVySW5kZXg7CisgICAgbV9wYXJhbWV0ZXJWYWx1ZXMgPSBwYXJhbWV0ZXJWYWx1ZXM7CisgICAgbV9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIG1feG1sU3VpdGUgPSBzdWl0ZTsKKyAgICBtX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgIG1fdGVzdENsYXNzID0gdGVzdENsYXNzOworICAgIG1fYmVmb3JlTWV0aG9kcyA9IGJlZm9yZU1ldGhvZHM7CisgICAgbV9hZnRlck1ldGhvZHMgPSBhZnRlck1ldGhvZHM7CisgICAgbV9ncm91cE1ldGhvZHMgPSBncm91cE1ldGhvZHM7CisgICAgbV9leHBlY3RlZEV4Y2VwdGlvbkhvbGRlciA9IGV4cGVjdGVkRXhjZXB0aW9uSG9sZGVyOworICAgIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSBza2lwRmFpbGVkSW52b2NhdGlvbkNvdW50czsKKyAgICBtX3Rlc3RDb250ZXh0ID0gdGVzdENvbnRleHQ7CisgICAgbV9pbnZvY2F0aW9uQ291bnQgPSBpbnZvY2F0aW9uQ291bnQ7CisgICAgbV9mYWlsdXJlQ291bnQgPSBmYWlsdXJlQ291bnQ7CisgICAgbV9ub3RpZmllciA9IG5vdGlmaWVyOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0TWF4VGltZU91dCgpIHsKKyAgICByZXR1cm4gNTAwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElUZXN0UmVzdWx0PiBjYWxsKCkgeworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRtcFJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICBmaW5hbCBJbnZva2VyLkZhaWx1cmVDb250ZXh0IGZhaWx1cmUgPSBuZXcgSW52b2tlci5GYWlsdXJlQ29udGV4dCgpOworICAgIGZhaWx1cmUuY291bnQgPSBtX2ZhaWx1cmVDb3VudDsKKyAgICB0cnkgeworICAgICAgdG1wUmVzdWx0cy5hZGQobV9pbnZva2VyLmludm9rZVRlc3RNZXRob2QobV9pbnN0YW5jZSwKKyAgICAgICAgICBtX3Rlc3RNZXRob2QsCisgICAgICAgICAgbV9wYXJhbWV0ZXJWYWx1ZXMsCisgICAgICAgICAgbV9wYXJhbWV0ZXJJbmRleCwKKyAgICAgICAgICBtX3htbFN1aXRlLAorICAgICAgICAgIG1fcGFyYW1ldGVycywKKyAgICAgICAgICBtX3Rlc3RDbGFzcywKKyAgICAgICAgICBtX2JlZm9yZU1ldGhvZHMsCisgICAgICAgICAgbV9hZnRlck1ldGhvZHMsCisgICAgICAgICAgbV9ncm91cE1ldGhvZHMsCisgICAgICAgICAgZmFpbHVyZSkpOworICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgIG1fZmFpbHVyZUNvdW50ID0gZmFpbHVyZS5jb3VudDsKKyAgICAgIGlmIChmYWlsdXJlLmluc3RhbmNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbV90ZXN0UmVzdWx0cy5hZGRBbGwodG1wUmVzdWx0cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKE9iamVjdCBpbnN0YW5jZSA6IGZhaWx1cmUuaW5zdGFuY2VzKSB7CisgICAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmV0cnlSZXN1bHRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgICBtX2ZhaWx1cmVDb3VudCA9CisgICAgICAgICAgICAgbV9pbnZva2VyLnJldHJ5RmFpbGVkKAorICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbV90ZXN0TWV0aG9kLCBtX3htbFN1aXRlLCBtX3Rlc3RDbGFzcywgbV9iZWZvcmVNZXRob2RzLAorICAgICAgICAgICAgICAgICBtX2FmdGVyTWV0aG9kcywgbV9ncm91cE1ldGhvZHMsIHJldHJ5UmVzdWx0cywKKyAgICAgICAgICAgICAgICAgbV9mYWlsdXJlQ291bnQsIG1fZXhwZWN0ZWRFeGNlcHRpb25Ib2xkZXIsCisgICAgICAgICAgICAgICAgIG1fdGVzdENvbnRleHQsIG1fcGFyYW1ldGVycywgbV9wYXJhbWV0ZXJJbmRleCk7CisgICAgICAgICAgbV90ZXN0UmVzdWx0cy5hZGRBbGwocmV0cnlSZXN1bHRzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLworICAgICAgLy8gSWYgd2UgaGF2ZSBhIGZhaWx1cmUsIHNraXAgYWxsIHRoZQorICAgICAgLy8gb3RoZXIgaW52b2NhdGlvbkNvdW50cworICAgICAgLy8KKworICAgICAgLy8gSWYgbm90IHNwZWNpZmllZCBnbG9iYWxseSwgdXNlIHRoZSBhdHRyaWJ1dGUKKyAgICAgIC8vIG9uIHRoZSBhbm5vdGF0aW9uCisgICAgICAvLworICAgICAgaWYgKCEgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cykgeworICAgICAgICBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzID0gbV90ZXN0TWV0aG9kLnNraXBGYWlsZWRJbnZvY2F0aW9ucygpOworICAgICAgfQorICAgICAgaWYgKG1fZmFpbHVyZUNvdW50ID4gMCAmJiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKSB7CisgICAgICAgIHdoaWxlIChtX2ludm9jYXRpb25Db3VudC0tID4gMCkgeworICAgICAgICAgIElUZXN0UmVzdWx0IHIgPQorICAgICAgICAgICAgbmV3IFRlc3RSZXN1bHQobV90ZXN0TWV0aG9kLmdldFRlc3RDbGFzcygpLAorICAgICAgICAgICAgICBtX2luc3RhbmNlLAorICAgICAgICAgICAgICBtX3Rlc3RNZXRob2QsCisgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dCk7CisgICAgICAgICAgci5zZXRTdGF0dXMoVGVzdFJlc3VsdC5TS0lQKTsKKyAgICAgICAgICBtX3Rlc3RSZXN1bHRzLmFkZChyKTsKKyAgICAgICAgICBtX2ludm9rZXIucnVuVGVzdExpc3RlbmVycyhyKTsKKyAgICAgICAgICBtX25vdGlmaWVyLmFkZFNraXBwZWRUZXN0KG1fdGVzdE1ldGhvZCwgcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbV9wYXJhbWV0ZXJJbmRleCsrOworCisgICAgcmV0dXJuIG1fdGVzdFJlc3VsdHM7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0VGVzdFJlc3VsdHMoKSB7CisgICAgcmV0dXJuIG1fdGVzdFJlc3VsdHM7CisgIH0KKworICBwdWJsaWMgaW50IGdldEludm9jYXRpb25Db3VudCgpIHsKKyAgICByZXR1cm4gbV9pbnZvY2F0aW9uQ291bnQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldEZhaWx1cmVDb3VudCgpIHsKKyAgICByZXR1cm4gbV9mYWlsdXJlQ291bnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UZXN0TWV0aG9kV29ya2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE1ldGhvZFdvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE1ldGhvZFdvcmtlci5qYXZhCkBAIC0wLDAgKzEsMzEwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLkNsYXNzTWV0aG9kTWFwOworaW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW5zdGFuY2U7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuVGhyZWFkVXRpbDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5ncmFwaC5JV29ya2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEZJWE1FOiByZWR1Y2UgY29udGVudGlvbiB3aGVuIHRoaXMgY2xhc3MgaXMgdXNlZCB0aHJvdWdoIHBhcmFsbGVsIGludm9jYXRpb24gZHVlIHRvCisgKiBpbnZvY2F0aW9uQ291bnQgYW5kIHRocmVhZFBvb2xTaXplIGJ5IG5vdCBpbnZva2luZyB0aGUgQEJlZm9yZUNsYXNzIGFuZCBAQWZ0ZXJDbGFzcworICogd2hpY2ggYXJlIGFscmVhZHkgaW52b2tlZCBvbiB0aGUgb3JpZ2luYWwgbWV0aG9kLgorICoKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBSdW5uYWJsZSBhbmQgd2lsbCBpbnZva2UgdGhlIElUZXN0TWV0aG9kIHBhc3NlZCBpbiBpdHMKKyAqIGNvbnN0cnVjdG9yIG9uIGl0cyBydW4oKSBtZXRob2QuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXRob2RXb3JrZXIgaW1wbGVtZW50cyBJV29ya2VyPElUZXN0TkdNZXRob2Q+IHsKKyAgLy8gTWFwIG9mIHRoZSB0ZXN0IG1ldGhvZHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgaW5zdGFuY2VzCisgIC8vIEl0IGhhcyB0byBiZSBhIHNldCBiZWNhdXNlIHRoZSBzYW1lIG1ldGhvZCBjYW4gYmUgcGFzc2VkIHNldmVyYWwgdGltZXMKKyAgLy8gYW5kIGFzc29jaWF0ZWQgdG8gYSBkaWZmZXJlbnQgaW5zdGFuY2UKKyAgcHJpdmF0ZSBJTWV0aG9kSW5zdGFuY2VbXSBtX21ldGhvZEluc3RhbmNlczsKKyAgcHJpdmF0ZSBmaW5hbCBJSW52b2tlciBtX2ludm9rZXI7CisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtX3BhcmFtZXRlcnM7CisgIHByaXZhdGUgZmluYWwgWG1sU3VpdGUgbV9zdWl0ZTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0UmVzdWx0PiBtX3Rlc3RSZXN1bHRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbkdyb3VwTWV0aG9kcyBtX2dyb3VwTWV0aG9kczsKKyAgcHJpdmF0ZSBmaW5hbCBDbGFzc01ldGhvZE1hcCBtX2NsYXNzTWV0aG9kTWFwOworICBwcml2YXRlIGZpbmFsIElUZXN0Q29udGV4dCBtX3Rlc3RDb250ZXh0OworICBwcml2YXRlIGZpbmFsIExpc3Q8SUNsYXNzTGlzdGVuZXI+IG1fbGlzdGVuZXJzOworCisgIHB1YmxpYyBUZXN0TWV0aG9kV29ya2VyKElJbnZva2VyIGludm9rZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXRob2RJbnN0YW5jZVtdIHRlc3RNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTdWl0ZSBzdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIGdyb3VwTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NNZXRob2RNYXAgY2xhc3NNZXRob2RNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ2xhc3NMaXN0ZW5lcj4gbGlzdGVuZXJzKQorICB7CisgICAgbV9pbnZva2VyID0gaW52b2tlcjsKKyAgICBtX21ldGhvZEluc3RhbmNlcyA9IHRlc3RNZXRob2RzOworICAgIG1fc3VpdGUgPSBzdWl0ZTsKKyAgICBtX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgIG1fZ3JvdXBNZXRob2RzID0gZ3JvdXBNZXRob2RzOworICAgIG1fY2xhc3NNZXRob2RNYXAgPSBjbGFzc01ldGhvZE1hcDsKKyAgICBtX3Rlc3RDb250ZXh0ID0gdGVzdENvbnRleHQ7CisgICAgbV9saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CisgIH0KKworICAvKioKKyAgICogUmV0cmlldmVzIHRoZSBtYXhpbXVtIHNwZWNpZmllZCB0aW1lb3V0IG9mIGFsbCBJVGVzdE5HTWV0aG9kcyB0bworICAgKiBiZSBydW4uCisgICAqCisgICAqIEByZXR1cm4gdGhlIG1heCB0aW1lb3V0IG9yIDAgaWYgbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0VGltZU91dCgpIHsKKyAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgZm9yIChJTWV0aG9kSW5zdGFuY2UgbWkgOiBtX21ldGhvZEluc3RhbmNlcykgeworICAgICAgSVRlc3ROR01ldGhvZCB0bSA9IG1pLmdldE1ldGhvZCgpOworICAgICAgaWYgKHRtLmdldFRpbWVPdXQoKSA+IHJlc3VsdCkgeworICAgICAgICByZXN1bHQgPSB0bS5nZXRUaW1lT3V0KCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoIltXb3JrZXIgdGhyZWFkOiIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkKKyAgICAgICAgKyAiIHByaW9yaXR5OiIgKyBnZXRQcmlvcml0eSgpICsgIiAiKTsKKworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG0gOiBtX21ldGhvZEluc3RhbmNlcykgeworICAgICAgcmVzdWx0LmFwcGVuZChtLmdldE1ldGhvZCgpKS5hcHBlbmQoIiAiKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIFJ1biBhbGwgdGhlIElUZXN0TkdNZXRob2RzIHBhc3NlZCBpbiB0aHJvdWdoIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgZm9yIChJTWV0aG9kSW5zdGFuY2UgdGVzdE10aGRJbnN0IDogbV9tZXRob2RJbnN0YW5jZXMpIHsKKyAgICAgIElUZXN0TkdNZXRob2QgdGVzdE1ldGhvZCA9IHRlc3RNdGhkSW5zdC5nZXRNZXRob2QoKTsKKyAgICAgIElUZXN0Q2xhc3MgdGVzdENsYXNzID0gdGVzdE1ldGhvZC5nZXRUZXN0Q2xhc3MoKTsKKworICAgICAgaW52b2tlQmVmb3JlQ2xhc3NNZXRob2RzKHRlc3RDbGFzcywgdGVzdE10aGRJbnN0KTsKKworICAgICAgLy8gSW52b2tlIHRlc3QgbWV0aG9kCisgICAgICB0cnkgeworICAgICAgICBpbnZva2VUZXN0TWV0aG9kcyh0ZXN0TWV0aG9kLCB0ZXN0TXRoZEluc3QuZ2V0SW5zdGFuY2UoKSwgbV90ZXN0Q29udGV4dCk7CisgICAgICB9CisgICAgICBmaW5hbGx5IHsKKyAgICAgICAgaW52b2tlQWZ0ZXJDbGFzc01ldGhvZHModGVzdENsYXNzLCB0ZXN0TXRoZEluc3QpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGludm9rZVRlc3RNZXRob2RzKElUZXN0TkdNZXRob2QgdG0sIE9iamVjdCBpbnN0YW5jZSwKKyAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkKKyAgeworICAgIC8vIFBvdGVudGlhbCBidWcgaGVyZTogIHdlIGxvb2sgdXAgdGhlIG1ldGhvZCBpbmRleCBvZiB0bSBhbW9uZyBhbGwKKyAgICAvLyB0aGUgdGVzdCBtZXRob2RzIChub3QgdmVyeSBlZmZpY2llbnQpIGJ1dCBpZiB0aGlzIG1ldGhvZCBhcHBlYXJzCisgICAgLy8gc2V2ZXJhbCB0aW1lcyBhbmQgdGhlc2UgbWV0aG9kcyBhcmUgcnVuIGluIHBhcmFsbGVsLCB0aGUgcmVzdWx0cworICAgIC8vIGFyZSB1bnByZWRpY3RhYmxlLi4uICBOZWVkIHRvIHRoaW5rIGFib3V0IHRoaXMgbW9yZSAoYW5kIG1ha2UgaXQKKyAgICAvLyBtb3JlIGVmZmljaWVudCkKKyAgICBMaXN0PElUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cyA9CisgICAgICAgIG1faW52b2tlci5pbnZva2VUZXN0TWV0aG9kcyh0bSwKKyAgICAgICAgICAgIG1fc3VpdGUsCisgICAgICAgICAgICBtX3BhcmFtZXRlcnMsCisgICAgICAgICAgICBtX2dyb3VwTWV0aG9kcywKKyAgICAgICAgICAgIGluc3RhbmNlLAorICAgICAgICAgICAgdGVzdENvbnRleHQpOworCisgICAgaWYgKHRlc3RSZXN1bHRzICE9IG51bGwpIHsKKyAgICAgIG1fdGVzdFJlc3VsdHMuYWRkQWxsKHRlc3RSZXN1bHRzKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSW52b2tlIHRoZSBAQmVmb3JlQ2xhc3MgbWV0aG9kcyBpZiBub3QgZG9uZSBhbHJlYWR5CisgICAqIEBwYXJhbSB0ZXN0Q2xhc3MKKyAgICogQHBhcmFtIG1pCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VCZWZvcmVDbGFzc01ldGhvZHMoSVRlc3RDbGFzcyB0ZXN0Q2xhc3MsIElNZXRob2RJbnN0YW5jZSBtaSkgeworICAgIGZvciAoSUNsYXNzTGlzdGVuZXIgbGlzdGVuZXIgOiBtX2xpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIub25CZWZvcmVDbGFzcyh0ZXN0Q2xhc3MsIG1pKTsKKyAgICB9CisKKyAgICAvLyBpZiBubyBCZWZvcmVDbGFzcyB0aGFuIHJldHVybiBpbW1lZGlhdGVseQorICAgIC8vIHVzZWQgZm9yIHBhcmFsbGVsIGNhc2Ugd2hlbiBCZWZvcmVDbGFzcyB3ZXJlIGFscmVhZHkgaW52b2tlZAorICAgIGlmKCAobnVsbCA9PSBtX2NsYXNzTWV0aG9kTWFwKSB8fCAobnVsbCA9PSBtX2NsYXNzTWV0aG9kTWFwLmdldEludm9rZWRCZWZvcmVDbGFzc01ldGhvZHMoKSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgSVRlc3ROR01ldGhvZFtdIGNsYXNzTWV0aG9kcz0gdGVzdENsYXNzLmdldEJlZm9yZUNsYXNzTWV0aG9kcygpOworICAgIGlmKG51bGwgPT0gY2xhc3NNZXRob2RzIHx8IGNsYXNzTWV0aG9kcy5sZW5ndGggPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHRoZSB3aG9sZSBpbnZvY2F0aW9uIG11c3QgYmUgc3luY2hyb25pemVkIGFzIG90aGVyIHRocmVhZHMgbXVzdAorICAgIC8vIGdldCBhIGZ1bGwgaW5pdGlhbGl6ZWQgdGVzdCBvYmplY3QgKG5vdCB0aGUgc2FtZSBmb3IgQEFmdGVyKQorICAgIE1hcDxJVGVzdENsYXNzLCBTZXQ8T2JqZWN0Pj4gaW52b2tlZEJlZm9yZUNsYXNzTWV0aG9kcyA9CisgICAgICAgIG1fY2xhc3NNZXRob2RNYXAuZ2V0SW52b2tlZEJlZm9yZUNsYXNzTWV0aG9kcygpOworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJTWU5DSFJPTklaSU5HIE9OICIgKyB0ZXN0Q2xhc3MKKy8vICAgICAgICArICIgdGhyZWFkOiIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkKKy8vICAgICAgICArICIgaW52b2tlZE1hcDoiICsgaW52b2tlZEJlZm9yZUNsYXNzTWV0aG9kcy5oYXNoQ29kZSgpICsgIiAiCisvLyAgICAgICAgKyBpbnZva2VkQmVmb3JlQ2xhc3NNZXRob2RzKTsKKyAgICBzeW5jaHJvbml6ZWQodGVzdENsYXNzKSB7CisgICAgICBTZXQ8T2JqZWN0PiBpbnN0YW5jZXM9IGludm9rZWRCZWZvcmVDbGFzc01ldGhvZHMuZ2V0KHRlc3RDbGFzcyk7CisgICAgICBpZihudWxsID09IGluc3RhbmNlcykgeworICAgICAgICBpbnN0YW5jZXM9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaW52b2tlZEJlZm9yZUNsYXNzTWV0aG9kcy5wdXQodGVzdENsYXNzLCBpbnN0YW5jZXMpOworICAgICAgfQorICAgICAgZm9yKE9iamVjdCBpbnN0YW5jZTogbWkuZ2V0SW5zdGFuY2VzKCkpIHsKKyAgICAgICAgaWYgKCEgaW5zdGFuY2VzLmNvbnRhaW5zKGluc3RhbmNlKSkgeworICAgICAgICAgIGluc3RhbmNlcy5hZGQoaW5zdGFuY2UpOworICAgICAgICAgIG1faW52b2tlci5pbnZva2VDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDbGFzcy5nZXRCZWZvcmVDbGFzc01ldGhvZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvKiBubyBwYXJhbWV0ZXIgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbnZva2UgdGhlIEBBZnRlckNsYXNzIG1ldGhvZHMgaWYgbm90IGRvbmUgYWxyZWFkeQorICAgKiBAcGFyYW0gdGVzdENsYXNzCisgICAqIEBwYXJhbSBtaQorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgaW52b2tlQWZ0ZXJDbGFzc01ldGhvZHMoSVRlc3RDbGFzcyB0ZXN0Q2xhc3MsIElNZXRob2RJbnN0YW5jZSBtaSkgeworICAgIGZvciAoSUNsYXNzTGlzdGVuZXIgbGlzdGVuZXIgOiBtX2xpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIub25BZnRlckNsYXNzKHRlc3RDbGFzcywgbWkpOworICAgIH0KKworICAgIC8vIGlmIG5vIEJlZm9yZUNsYXNzIHRoYW4gcmV0dXJuIGltbWVkaWF0ZWx5CisgICAgLy8gdXNlZCBmb3IgcGFyYWxsZWwgY2FzZSB3aGVuIEJlZm9yZUNsYXNzIHdlcmUgYWxyZWFkeSBpbnZva2VkCisgICAgaWYoIChudWxsID09IG1fY2xhc3NNZXRob2RNYXApIHx8IChudWxsID09IG1fY2xhc3NNZXRob2RNYXAuZ2V0SW52b2tlZEFmdGVyQ2xhc3NNZXRob2RzKCkpICkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJVGVzdE5HTWV0aG9kW10gYWZ0ZXJDbGFzc01ldGhvZHM9IHRlc3RDbGFzcy5nZXRBZnRlckNsYXNzTWV0aG9kcygpOworCisgICAgaWYobnVsbCA9PSBhZnRlckNsYXNzTWV0aG9kcyB8fCBhZnRlckNsYXNzTWV0aG9kcy5sZW5ndGggPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gSW52b2tlIGFmdGVyIGNsYXNzIG1ldGhvZHMgaWYgdGhpcyB0ZXN0IG1ldGhvZCBpcyB0aGUgbGFzdCBvbmUKKyAgICAvLworICAgIExpc3Q8T2JqZWN0PiBpbnZva2VJbnN0YW5jZXM9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIElUZXN0TkdNZXRob2QgdG09IG1pLmdldE1ldGhvZCgpOworICAgIGlmIChtX2NsYXNzTWV0aG9kTWFwLnJlbW92ZUFuZENoZWNrSWZMYXN0KHRtLCBtaS5nZXRJbnN0YW5jZSgpKSkgeworICAgICAgTWFwPElUZXN0Q2xhc3MsIFNldDxPYmplY3Q+PiBpbnZva2VkQWZ0ZXJDbGFzc01ldGhvZHMKKyAgICAgICAgICA9IG1fY2xhc3NNZXRob2RNYXAuZ2V0SW52b2tlZEFmdGVyQ2xhc3NNZXRob2RzKCk7CisgICAgICBzeW5jaHJvbml6ZWQoaW52b2tlZEFmdGVyQ2xhc3NNZXRob2RzKSB7CisgICAgICAgIFNldDxPYmplY3Q+IGluc3RhbmNlcyA9IGludm9rZWRBZnRlckNsYXNzTWV0aG9kcy5nZXQodGVzdENsYXNzKTsKKyAgICAgICAgaWYobnVsbCA9PSBpbnN0YW5jZXMpIHsKKyAgICAgICAgICBpbnN0YW5jZXM9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICBpbnZva2VkQWZ0ZXJDbGFzc01ldGhvZHMucHV0KHRlc3RDbGFzcywgaW5zdGFuY2VzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoT2JqZWN0IGluc3Q6IG1pLmdldEluc3RhbmNlcygpKSB7CisgICAgICAgICAgaWYoISBpbnN0YW5jZXMuY29udGFpbnMoaW5zdCkpIHsKKyAgICAgICAgICAgIGludm9rZUluc3RhbmNlcy5hZGQoaW5zdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvcihPYmplY3QgaW5zdDogaW52b2tlSW5zdGFuY2VzKSB7CisgICAgICAgIG1faW52b2tlci5pbnZva2VDb25maWd1cmF0aW9ucyh0ZXN0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNsYXNzTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvKiBubyBwYXJhbWV0ZXIgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgaW50IGluZGV4T2YoSVRlc3ROR01ldGhvZCB0bSwgSVRlc3ROR01ldGhvZFtdIGFsbFRlc3RNZXRob2RzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxUZXN0TWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKGFsbFRlc3RNZXRob2RzW2ldID09IHRtKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0VGVzdFJlc3VsdHMoKSB7CisgICAgcmV0dXJuIG1fdGVzdFJlc3VsdHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgVXRpbHMubG9nKCJUZXN0TWV0aG9kV29ya2VyIiwgMiwgVGhyZWFkVXRpbC5jdXJyZW50VGhyZWFkSW5mbygpICsgIjoiICsgcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SVRlc3ROR01ldGhvZD4gZ2V0VGFza3MoKQorICB7CisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBtIDogbV9tZXRob2RJbnN0YW5jZXMpIHsKKyAgICAgIHJlc3VsdC5hZGQobS5nZXRNZXRob2QoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oSVdvcmtlcjxJVGVzdE5HTWV0aG9kPiBvdGhlcikgeworICAgIHJldHVybiBnZXRQcmlvcml0eSgpIC0gb3RoZXIuZ2V0UHJpb3JpdHkoKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgcHJpb3JpdHkgb2YgYSB3b3JrZXIgaXMgdGhlIHByaW9yaXR5IG9mIHRoZSBmaXJzdCBtZXRob2QgaXQncyBnb2luZyB0byBydW4uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKKyAgICByZXR1cm4gbV9tZXRob2RJbnN0YW5jZXMubGVuZ3RoID4gMAorICAgICAgICA/IG1fbWV0aG9kSW5zdGFuY2VzWzBdLmdldE1ldGhvZCgpLmdldFByaW9yaXR5KCkKKyAgICAgICAgOiAwOworICB9Cit9CisKKy8qKgorICogRXh0ZW5kcyB7QGNvZGUgVGVzdE1ldGhvZFdvcmtlcn0gYW5kIGlzIHVzZWQgdG8gd29yayBvbiBvbmx5IGEgc2luZ2xlIG1ldGhvZAorICogaW5zdGFuY2UKKyAqLworY2xhc3MgU2luZ2xlVGVzdE1ldGhvZFdvcmtlciBleHRlbmRzIFRlc3RNZXRob2RXb3JrZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzIEVNUFRZX0dST1VQX01FVEhPRFMgPQorICAgIG5ldyBDb25maWd1cmF0aW9uR3JvdXBNZXRob2RzKG5ldyBJVGVzdE5HTWV0aG9kWzBdLAorICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SVRlc3ROR01ldGhvZD4+KCksIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxJVGVzdE5HTWV0aG9kPj4oKSk7CisKKyAgcHVibGljIFNpbmdsZVRlc3RNZXRob2RXb3JrZXIoSUludm9rZXIgaW52b2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSW5zdGFuY2UgdGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElDbGFzc0xpc3RlbmVyPiBsaXN0ZW5lcnMpCisgIHsKKyAgICBzdXBlcihpbnZva2VyLAorICAgICAgICAgIG5ldyBNZXRob2RJbnN0YW5jZVtdIHt0ZXN0TWV0aG9kfSwKKyAgICAgICAgICBzdWl0ZSwKKyAgICAgICAgICBwYXJhbWV0ZXJzLAorICAgICAgICAgIEVNUFRZX0dST1VQX01FVEhPRFMsCisgICAgICAgICAgbnVsbCwKKyAgICAgICAgICB0ZXN0Q29udGV4dCwKKyAgICAgICAgICBsaXN0ZW5lcnMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HQ2xhc3NGaW5kZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UZXN0TkdDbGFzc0ZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YTBiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HQ2xhc3NGaW5kZXIuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSUluc3RhbmNlSW5mbzsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0T2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5DbGFzc0hlbHBlci5nZXRBdmFpbGFibGVNZXRob2RzOworCisvKioKKyAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhbiBJVGVzdENsYXNzIGZyb20gYSB0ZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3ROR0NsYXNzRmluZGVyIGV4dGVuZHMgQmFzZUNsYXNzRmluZGVyIHsKKyAgcHJpdmF0ZSBJVGVzdENvbnRleHQgbV90ZXN0Q29udGV4dCA9IG51bGw7CisgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PE9iamVjdD4+IG1faW5zdGFuY2VNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBwdWJsaWMgVGVzdE5HQ2xhc3NGaW5kZXIoQ2xhc3NJbmZvTWFwIGNpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzcywgTGlzdDxPYmplY3Q+PiBpbnN0YW5jZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFRlc3QgeG1sVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpCisgIHsKKyAgICBtX3Rlc3RDb250ZXh0ID0gdGVzdENvbnRleHQ7CisKKyAgICBpZihudWxsID09IGluc3RhbmNlTWFwKSB7CisgICAgICBpbnN0YW5jZU1hcD0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgfQorCisgICAgSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0QW5ub3RhdGlvbkZpbmRlcigpOworICAgIElUZXN0T2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5ID0gY29uZmlndXJhdGlvbi5nZXRPYmplY3RGYWN0b3J5KCk7CisKKyAgICAvLworICAgIC8vIEZpbmQgYWxsIHRoZSBuZXcgY2xhc3NlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBpbnN0YW5jZXMKKyAgICAvLworICAgIFNldDxDbGFzczw/Pj4gYWxsQ2xhc3Nlcz0gY2ltLmdldENsYXNzZXMoKTsKKworICAgIC8vdmVyeSBmaXJzdCBwYXNzIGlzIHRvIGZpbmQgT2JqZWN0RmFjdG9yeSwgY2FuJ3QgY3JlYXRlIGFueXRoaW5nIGVsc2UgdW50aWwgdGhlbgorICAgIGlmKG9iamVjdEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgb2JqZWN0RmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5SW1wbCgpOworICAgICAgb3V0ZXI6CisgICAgICBmb3IgKENsYXNzIGNscyA6IGFsbENsYXNzZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAobnVsbCAhPSBjbHMpIHsKKyAgICAgICAgICAgIE1ldGhvZFtdIG1zOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgbXMgPSBjbHMuZ2V0TWV0aG9kcygpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgeworICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvNjAyCisgICAgICAgICAgICAgIHBwcCgiV2FybmluZzogQ2FuJ3QgbGluayBhbmQgZGV0ZXJtaW5lIG1ldGhvZHMgb2YgIiArIGNscyk7CisgICAgICAgICAgICAgIG1zID0gbmV3IE1ldGhvZFswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBtcykgeworICAgICAgICAgICAgICBJQW5ub3RhdGlvbiBhID0gYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihtLAorICAgICAgICAgICAgICAgICAgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JT2JqZWN0RmFjdG9yeUFubm90YXRpb24uY2xhc3MpOworICAgICAgICAgICAgICBpZiAobnVsbCAhPSBhKSB7CisgICAgICAgICAgICAgICAgaWYgKCFJVGVzdE9iamVjdEZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtLmdldFJldHVyblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlJldHVybiB0eXBlIG9mICIgKyBtICsgIiBpcyBub3QgSU9iamVjdEZhY3RvcnkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IGNscy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgaWYgKG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPiAwICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5lcXVhbHMoSVRlc3RDb250ZXh0LmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5ID0gKElUZXN0T2JqZWN0RmFjdG9yeSkgbS5pbnZva2UoaW5zdGFuY2UsIHRlc3RDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkgPSAoSVRlc3RPYmplY3RGYWN0b3J5KSBtLmludm9rZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgb2JqZWN0IGZhY3Rvcnk6ICIgKyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgeworICAgICAgICAgIFV0aWxzLmxvZygiW1Rlc3ROR0NsYXNzRmluZGVyXSIsIDEsICJVbmFibGUgdG8gcmVhZCBtZXRob2RzIG9uIGNsYXNzICIgKyBjbHMuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICsgIiAtIHVuYWJsZSB0byByZXNvbHZlIGNsYXNzIHJlZmVyZW5jZSAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgICAgZm9yIChYbWxDbGFzcyB4bWxDbGFzcyA6IHhtbFRlc3QuZ2V0WG1sQ2xhc3NlcygpKSB7CisgICAgICAgICAgICBpZiAoeG1sQ2xhc3MubG9hZENsYXNzZXMoKSAmJiB4bWxDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNscy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoQ2xhc3MgY2xzIDogYWxsQ2xhc3NlcykgeworICAgICAgaWYoKG51bGwgPT0gY2xzKSkgeworICAgICAgICBwcHAoIkZPVU5EIE5VTEwgQ0xBU1MgSU4gRk9MTE9XSU5HIEFSUkFZOiIpOworICAgICAgICBpbnQgaT0gMDsKKyAgICAgICAgZm9yKENsYXNzIGMgOiBhbGxDbGFzc2VzKSB7CisgICAgICAgICAgcHBwKCIgICIgKyBpICsgIjogIiArIGMpOworICAgICAgICB9CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKGlzVGVzdE5HQ2xhc3MoY2xzLCBhbm5vdGF0aW9uRmluZGVyKSkgeworICAgICAgICBMaXN0IGFsbEluc3RhbmNlcz0gaW5zdGFuY2VNYXAuZ2V0KGNscyk7CisgICAgICAgIE9iamVjdCB0aGlzSW5zdGFuY2U9IChudWxsICE9IGFsbEluc3RhbmNlcykgPyBhbGxJbnN0YW5jZXMuZ2V0KDApIDogbnVsbDsKKworICAgICAgICAvLyBJZiBhbm5vdGF0aW9uIGNsYXNzIGFuZCBpbnN0YW5jZXMgYXJlIGFic3RyYWN0LCBza2lwIHRoZW0KKyAgICAgICAgaWYgKChudWxsID09IHRoaXNJbnN0YW5jZSkgJiYgTW9kaWZpZXIuaXNBYnN0cmFjdChjbHMuZ2V0TW9kaWZpZXJzKCkpKSB7CisgICAgICAgICAgVXRpbHMubG9nKCIiLCA1LCAiW1dBUk5dIEZvdW5kIGFuIGFic3RyYWN0IGNsYXNzIHdpdGggbm8gdmFsaWQgaW5zdGFuY2UgYXR0YWNoZWQ6ICIgKyBjbHMpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSUNsYXNzIGljPSBmaW5kT3JDcmVhdGVJQ2xhc3MobV90ZXN0Q29udGV4dCwgY2xzLCBjaW0uZ2V0WG1sQ2xhc3MoY2xzKSwgdGhpc0luc3RhbmNlLAorICAgICAgICAgICAgeG1sVGVzdCwgYW5ub3RhdGlvbkZpbmRlciwgb2JqZWN0RmFjdG9yeSk7CisgICAgICAgIGlmKG51bGwgIT0gaWMpIHsKKyAgICAgICAgICBPYmplY3RbXSB0aGVzZUluc3RhbmNlcyA9IGljLmdldEluc3RhbmNlcyhmYWxzZSk7CisgICAgICAgICAgaWYgKHRoZXNlSW5zdGFuY2VzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aGVzZUluc3RhbmNlcyA9IGljLmdldEluc3RhbmNlcyh0cnVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgT2JqZWN0IGluc3RhbmNlPSB0aGVzZUluc3RhbmNlc1swXTsKKyAgICAgICAgICBwdXRJQ2xhc3MoY2xzLCBpYyk7CisKKyAgICAgICAgICBDb25zdHJ1Y3Rvck9yTWV0aG9kIGZhY3RvcnlNZXRob2QgPQorICAgICAgICAgICAgQ2xhc3NIZWxwZXIuZmluZERlY2xhcmVkRmFjdG9yeU1ldGhvZChjbHMsIGFubm90YXRpb25GaW5kZXIpOworICAgICAgICAgIGlmIChmYWN0b3J5TWV0aG9kICE9IG51bGwgJiYgZmFjdG9yeU1ldGhvZC5nZXRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIEZhY3RvcnlNZXRob2QgZm0gPSBuZXcgRmFjdG9yeU1ldGhvZCggLyogY2xzLCAqLworICAgICAgICAgICAgICBmYWN0b3J5TWV0aG9kLAorICAgICAgICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgeG1sVGVzdCwKKyAgICAgICAgICAgICAgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dCk7CisgICAgICAgICAgICBDbGFzc0luZm9NYXAgbW9yZUNsYXNzZXMgPSBuZXcgQ2xhc3NJbmZvTWFwKCk7CisKKyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgcHBwKCJJTlZPS0lORyBGQUNUT1JZICIgKyBmbSArICIgIiArIHRoaXMuaGFzaENvZGUoKSk7CisgICAgICAgICAgICAgIE9iamVjdFtdIGluc3RhbmNlcz0gZm0uaW52b2tlKCk7CisKKyAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgLy8gSWYgdGhlIGZhY3RvcnkgcmV0dXJuZWQgSUluc3RhbmNlSW5mbywgZ2V0IHRoZSBjbGFzcyBmcm9tIGl0LAorICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3QgY2FsbCBnZXRDbGFzcygpIG9uIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlc1swXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBDbGFzcyBlbGVtZW50Q2xhc3MgPSBpbnN0YW5jZXNbMF0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgIGlmKElJbnN0YW5jZUluZm8uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlbGVtZW50Q2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcihPYmplY3QgbyA6IGluc3RhbmNlcykgeworICAgICAgICAgICAgICAgICAgICAgIElJbnN0YW5jZUluZm8gaWkgPSAoSUluc3RhbmNlSW5mbykgbzsKKyAgICAgICAgICAgICAgICAgICAgICBhZGRJbnN0YW5jZShpaS5nZXRJbnN0YW5jZUNsYXNzKCksIGlpLmdldEluc3RhbmNlKCkpOworICAgICAgICAgICAgICAgICAgICAgIG1vcmVDbGFzc2VzLmFkZENsYXNzKGlpLmdldEluc3RhbmNlQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaW5zdGFuY2VzW2ldOworICAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIlRoZSBmYWN0b3J5ICIgKyBmbSArICIgcmV0dXJuZWQgYSBudWxsIGluc3RhbmNlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGluZGV4ICIgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5zdGFuY2Uoby5nZXRDbGFzcygpLCBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjbGFzc0V4aXN0cyhvLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVDbGFzc2VzLmFkZENsYXNzKG8uZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1vcmVDbGFzc2VzLmdldFNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgVGVzdE5HQ2xhc3NGaW5kZXIgZmluZGVyPQorICAgICAgICAgICAgICAgIG5ldyBUZXN0TkdDbGFzc0ZpbmRlcihtb3JlQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgbV9pbnN0YW5jZU1hcCwKKyAgICAgICAgICAgICAgICAgICAgeG1sVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dCk7CisKKyAgICAgICAgICAgICAgSUNsYXNzW10gbW9yZUlDbGFzc2VzPSBmaW5kZXIuZmluZFRlc3RDbGFzc2VzKCk7CisgICAgICAgICAgICAgIGZvcihJQ2xhc3MgaWMyIDogbW9yZUlDbGFzc2VzKSB7CisgICAgICAgICAgICAgICAgcHV0SUNsYXNzKGljMi5nZXRSZWFsQ2xhc3MoKSwgaWMyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBpZiBtb3JlQ2xhc3Nlcy5zaXplKCkgPiAwCisgICAgICAgICAgfQorICAgICAgICB9IC8vIG51bGwgIT0gaWMKKyAgICAgIH0gLy8gaWYgbm90IFRlc3RORyBjbGFzcworICAgICAgZWxzZSB7CisgICAgICAgIFV0aWxzLmxvZygiVGVzdE5HQ2xhc3NGaW5kZXIiLCAzLCAiU0tJUFBJTkcgQ0xBU1MgIiArIGNscyArICIgbm8gVGVzdE5HIGFubm90YXRpb25zIGZvdW5kIik7CisgICAgICB9CisgICAgfSAvLyBmb3IKKworICAgIC8vCisgICAgLy8gQWRkIGFsbCB0aGUgaW5zdGFuY2VzIHdlIGZvdW5kIHRvIHRoZWlyIHJlc3BlY3RpdmUgSUNsYXNzZXMKKyAgICAvLworICAgIGZvcihNYXAuRW50cnk8Q2xhc3MsIExpc3Q8T2JqZWN0Pj4gZW50cnkgOiBtX2luc3RhbmNlTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIENsYXNzIGNsYXp6ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBmb3IoT2JqZWN0IGluc3RhbmNlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICBJQ2xhc3MgaWM9IGdldElDbGFzcyhjbGF6eik7CisgICAgICAgIGlmKG51bGwgIT0gaWMpIHsKKyAgICAgICAgICBpYy5hZGRJbnN0YW5jZShpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2xhc3MgY29udGFpbnMgVGVzdE5HIGFubm90YXRpb25zIChlaXRoZXIgb24gaXRzZWxmCisgICAqIG9yIG9uIGEgc3VwZXJjbGFzcykuCisgICAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0TkdDbGFzcyhDbGFzczw/PiBjLCBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyKSB7CisgICAgQ2xhc3NbXSBhbGxBbm5vdGF0aW9ucz0gQW5ub3RhdGlvbkhlbHBlci5nZXRBbGxBbm5vdGF0aW9ucygpOworICAgIENsYXNzPD8+IGNscyA9IGM7CisKKyAgICB0cnkgeworICAgICAgZm9yKENsYXNzIGFubm90YXRpb24gOiBhbGxBbm5vdGF0aW9ucykgeworCisgICAgICAgIGZvciAoY2xzID0gYzsgY2xzICE9IG51bGw7IGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCkpIHsKKyAgICAgICAgICAvLyBUcnkgb24gdGhlIG1ldGhvZHMKKyAgICAgICAgICBmb3IgKE1ldGhvZCBtIDogZ2V0QXZhaWxhYmxlTWV0aG9kcyhjbHMpKSB7CisgICAgICAgICAgICBJQW5ub3RhdGlvbiBtYT0gYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihtLCBhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIGlmKG51bGwgIT0gbWEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVHJ5IG9uIHRoZSBjbGFzcworICAgICAgICAgIElBbm5vdGF0aW9uIGE9IGFubm90YXRpb25GaW5kZXIuZmluZEFubm90YXRpb24oY2xzLCBhbm5vdGF0aW9uKTsKKyAgICAgICAgICBpZihudWxsICE9IGEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFRyeSBvbiB0aGUgY29uc3RydWN0b3JzCisgICAgICAgICAgZm9yIChDb25zdHJ1Y3RvciBjdG9yIDogY2xzLmdldENvbnN0cnVjdG9ycygpKSB7CisgICAgICAgICAgICBJQW5ub3RhdGlvbiBjYT0gYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihjdG9yLCBhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIGlmKG51bGwgIT0gY2EpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgIFV0aWxzLmxvZygiW1Rlc3ROR0NsYXNzRmluZGVyXSIsIDEsCisgICAgICAgICAgIlVuYWJsZSB0byByZWFkIG1ldGhvZHMgb24gY2xhc3MgIiArIGNscy5nZXROYW1lKCkKKyAgICAgICAgICArICIgLSB1bmFibGUgdG8gcmVzb2x2ZSBjbGFzcyByZWZlcmVuY2UgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkSW5zdGFuY2UoQ2xhc3MgY2xhenosIE9iamVjdCBvKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3Q9IG1faW5zdGFuY2VNYXAuZ2V0KGNsYXp6KTsKKworICAgIGlmKG51bGwgPT0gbGlzdCkgeworICAgICAgbGlzdD0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBtX2luc3RhbmNlTWFwLnB1dChjbGF6eiwgbGlzdCk7CisgICAgfQorCisgICAgbGlzdC5hZGQobyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdE5HQ2xhc3NGaW5kZXJdICIgKyBzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HTWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2U4NmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UZXN0TkdNZXRob2QuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkhlbHBlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRlc3QgbWV0aG9kLg0KKyAqDQorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1heSAzLCAyMDA0DQorICogQGF1dGhvciA8YSBocmVmID0gIm1haWx0bzp0aGVfbWluZHN0b3JtJiM2NDtldm9sdmEucm8iPkFsZXhhbmRydSBQb3Blc2N1PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0TkdNZXRob2QgZXh0ZW5kcyBCYXNlVGVzdE1ldGhvZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7DQorICAvKioNCisgICAqDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzQyODY4ODkxOTg2Nzc1MzA3TDsNCisgIHByaXZhdGUgaW50IG1fdGhyZWFkUG9vbFNpemUgPSAwOw0KKyAgcHJpdmF0ZSBpbnQgbV9pbnZvY2F0aW9uQ291bnQgPSAxOw0KKyAgcHJpdmF0ZSBpbnQgbV90b3RhbEludm9jYXRpb25Db3VudCA9IG1faW52b2NhdGlvbkNvdW50Ow0KKyAgcHJpdmF0ZSBpbnQgbV9zdWNjZXNzUGVyY2VudGFnZSA9IDEwMDsNCisNCisgIC8qKg0KKyAgICogQ29uc3RydWN0cyBhIDxjb2RlPlRlc3ROR01ldGhvZDwvY29kZT4NCisgICAqDQorICAgKiBAcGFyYW0gbWV0aG9kDQorICAgKiBAcGFyYW0gZmluZGVyDQorICAgKi8NCisgIHB1YmxpYyBUZXN0TkdNZXRob2QoTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBYbWxUZXN0IHhtbFRlc3QsIE9iamVjdCBpbnN0YW5jZSkgew0KKyAgICB0aGlzKG1ldGhvZCwgZmluZGVyLCB0cnVlLCB4bWxUZXN0LCBpbnN0YW5jZSk7DQorICB9DQorDQorICBwcml2YXRlIFRlc3ROR01ldGhvZChNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIGJvb2xlYW4gaW5pdGlhbGl6ZSwNCisgICAgICBYbWxUZXN0IHhtbFRlc3QsIE9iamVjdCBpbnN0YW5jZSkgew0KKyAgICBzdXBlcihtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QsIGZpbmRlciwgaW5zdGFuY2UpOw0KKw0KKyAgICBpZihpbml0aWFsaXplKSB7DQorICAgICAgaW5pdCh4bWxUZXN0KTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgIHJldHVybiBtX2ludm9jYXRpb25Db3VudDsNCisgIH0NCisNCisgIC8qKg0KKyAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBpbnQgZ2V0VG90YWxJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgIHJldHVybiBtX3RvdGFsSW52b2NhdGlvbkNvdW50Ow0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiB7QGluaGVyaXREb2N9DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRTdWNjZXNzUGVyY2VudGFnZSgpIHsNCisgICAgcmV0dXJuIG1fc3VjY2Vzc1BlcmNlbnRhZ2U7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3QoKSB7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgew0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0TkdNZXRob2RdICIgKyBzKTsNCisgIH0NCisNCisgIHByaXZhdGUgdm9pZCBpbml0KFhtbFRlc3QgeG1sVGVzdCkgew0KKyAgICBzZXRYbWxUZXN0KHhtbFRlc3QpOw0KKyAgICBzZXRJbnZvY2F0aW9uTnVtYmVycyh4bWxUZXN0LmdldEludm9jYXRpb25OdW1iZXJzKA0KKyAgICAgICAgbV9tZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyBtX21ldGhvZC5nZXROYW1lKCkpKTsNCisgICAgew0KKyAgICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0QW5ub3RhdGlvbiA9DQorICAgICAgICAgIEFubm90YXRpb25IZWxwZXIuZmluZFRlc3QoZ2V0QW5ub3RhdGlvbkZpbmRlcigpLCBtX21ldGhvZC5nZXRNZXRob2QoKSk7DQorDQorICAgICAgaWYgKHRlc3RBbm5vdGF0aW9uID09IG51bGwpIHsNCisgICAgICAgIC8vIFRyeSBvbiB0aGUgY2xhc3MNCisgICAgICAgIHRlc3RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChnZXRBbm5vdGF0aW9uRmluZGVyKCksIG1fbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAobnVsbCAhPSB0ZXN0QW5ub3RhdGlvbikgew0KKyAgICAgICAgc2V0VGltZU91dCh0ZXN0QW5ub3RhdGlvbi5nZXRUaW1lT3V0KCkpOw0KKyAgICAgICAgbV9zdWNjZXNzUGVyY2VudGFnZSA9IHRlc3RBbm5vdGF0aW9uLmdldFN1Y2Nlc3NQZXJjZW50YWdlKCk7DQorDQorICAgICAgICBzZXRJbnZvY2F0aW9uQ291bnQodGVzdEFubm90YXRpb24uZ2V0SW52b2NhdGlvbkNvdW50KCkpOw0KKyAgICAgICAgbV90b3RhbEludm9jYXRpb25Db3VudCA9IHRlc3RBbm5vdGF0aW9uLmdldEludm9jYXRpb25Db3VudCgpOw0KKyAgICAgICAgc2V0VGhyZWFkUG9vbFNpemUodGVzdEFubm90YXRpb24uZ2V0VGhyZWFkUG9vbFNpemUoKSk7DQorICAgICAgICBzZXRBbHdheXNSdW4odGVzdEFubm90YXRpb24uZ2V0QWx3YXlzUnVuKCkpOw0KKyAgICAgICAgc2V0RGVzY3JpcHRpb24oZmluZERlc2NyaXB0aW9uKHRlc3RBbm5vdGF0aW9uLCB4bWxUZXN0KSk7DQorICAgICAgICBzZXRFbmFibGVkKHRlc3RBbm5vdGF0aW9uLmdldEVuYWJsZWQoKSk7DQorICAgICAgICBzZXRSZXRyeUFuYWx5emVyKHRlc3RBbm5vdGF0aW9uLmdldFJldHJ5QW5hbHl6ZXIoKSk7DQorICAgICAgICBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbnModGVzdEFubm90YXRpb24uc2tpcEZhaWxlZEludm9jYXRpb25zKCkpOw0KKyAgICAgICAgc2V0SW52b2NhdGlvblRpbWVPdXQodGVzdEFubm90YXRpb24uaW52b2NhdGlvblRpbWVPdXQoKSk7DQorICAgICAgICBzZXRJZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKHRlc3RBbm5vdGF0aW9uLmlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoKSk7DQorICAgICAgICBzZXRQcmlvcml0eSh0ZXN0QW5ub3RhdGlvbi5nZXRQcmlvcml0eSgpKTsNCisgICAgICB9DQorDQorICAgICAgLy8gR3JvdXBzDQorICAgICAgew0KKyAgICAgICAgaW5pdEdyb3VwcyhJVGVzdEFubm90YXRpb24uY2xhc3MpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBTdHJpbmcgZmluZERlc2NyaXB0aW9uKElUZXN0QW5ub3RhdGlvbiB0ZXN0QW5ub3RhdGlvbiwgWG1sVGVzdCB4bWxUZXN0KSB7DQorICAgIFN0cmluZyByZXN1bHQgPSB0ZXN0QW5ub3RhdGlvbi5nZXREZXNjcmlwdGlvbigpOw0KKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHsNCisgICAgICBMaXN0PFhtbENsYXNzPiBjbGFzc2VzID0geG1sVGVzdC5nZXRYbWxDbGFzc2VzKCk7DQorICAgICAgZm9yIChYbWxDbGFzcyBjIDogY2xhc3Nlcykgew0KKyAgICAgICAgaWYgKGMuZ2V0TmFtZSgpLmVxdWFscyhtX21ldGhvZC5nZXRNZXRob2QoKS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSkpIHsNCisgICAgICAgICAgZm9yIChYbWxJbmNsdWRlIGluY2x1ZGUgOiBjLmdldEluY2x1ZGVkTWV0aG9kcygpKSB7DQorICAgICAgICAgICAgaWYgKGluY2x1ZGUuZ2V0TmFtZSgpLmVxdWFscyhtX21ldGhvZC5nZXROYW1lKCkpKSB7DQorICAgICAgICAgICAgICByZXN1bHQgPSBpbmNsdWRlLmdldERlc2NyaXB0aW9uKCk7DQorICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICAvKioNCisgICAqIHtAaW5oZXJpdERvY30NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldFRocmVhZFBvb2xTaXplKCkgew0KKyAgICByZXR1cm4gbV90aHJlYWRQb29sU2l6ZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgb24gd2hpY2ggdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGludm9rZWQuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGhyZWFkUG9vbFNpemUoaW50IHRocmVhZFBvb2xTaXplKSB7DQorICAgIG1fdGhyZWFkUG9vbFNpemUgPSB0aHJlYWRQb29sU2l6ZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGludm9jYXRpb25zIGZvciB0aGlzIG1ldGhvZC4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ291bnQoaW50IGNvdW50ZXIpIHsNCisgICAgbV9pbnZvY2F0aW9uQ291bnQ9IGNvdW50ZXI7DQorICB9DQorDQorICAvKioNCisgICAqIENsb25lcyB0aGUgY3VycmVudCA8Y29kZT5UZXN0TkdNZXRob2Q8L2NvZGU+IGFuZCBpdHMgQEJlZm9yZU1ldGhvZCBhbmQgQEFmdGVyTWV0aG9kIG1ldGhvZHMuDQorICAgKiBAc2VlIG9yZy50ZXN0bmcuaW50ZXJuYWwuQmFzZVRlc3RNZXRob2QjY2xvbmUoKQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBCYXNlVGVzdE1ldGhvZCBjbG9uZSgpIHsNCisgICAgVGVzdE5HTWV0aG9kIGNsb25lPSBuZXcgVGVzdE5HTWV0aG9kKGdldE1ldGhvZCgpLCBnZXRBbm5vdGF0aW9uRmluZGVyKCksIGZhbHNlLCBnZXRYbWxUZXN0KCksDQorICAgICAgICBnZXRJbnN0YW5jZSgpKTsNCisgICAgSVRlc3RDbGFzcyB0Yz0gZ2V0VGVzdENsYXNzKCk7DQorICAgIE5vT3BUZXN0Q2xhc3MgdGVzdENsYXNzPSBuZXcgTm9PcFRlc3RDbGFzcyh0Yyk7DQorICAgIHRlc3RDbGFzcy5zZXRCZWZvcmVUZXN0TWV0aG9kcyhjbG9uZSh0Yy5nZXRCZWZvcmVUZXN0TWV0aG9kcygpKSk7DQorICAgIHRlc3RDbGFzcy5zZXRBZnRlclRlc3RNZXRob2QoY2xvbmUodGMuZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpKSk7DQorICAgIGNsb25lLm1fdGVzdENsYXNzPSB0ZXN0Q2xhc3M7DQorICAgIGNsb25lLnNldERhdGUoZ2V0RGF0ZSgpKTsNCisgICAgY2xvbmUuc2V0R3JvdXBzKGdldEdyb3VwcygpKTsNCisgICAgY2xvbmUuc2V0R3JvdXBzRGVwZW5kZWRVcG9uKGdldEdyb3Vwc0RlcGVuZGVkVXBvbigpLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpKTsNCisgICAgY2xvbmUuc2V0TWV0aG9kc0RlcGVuZGVkVXBvbihnZXRNZXRob2RzRGVwZW5kZWRVcG9uKCkpOw0KKyAgICBjbG9uZS5zZXRBbHdheXNSdW4oaXNBbHdheXNSdW4oKSk7DQorICAgIGNsb25lLm1fYmVmb3JlR3JvdXBzPSBnZXRCZWZvcmVHcm91cHMoKTsNCisgICAgY2xvbmUubV9hZnRlckdyb3Vwcz0gZ2V0QWZ0ZXJHcm91cHMoKTsNCisgICAgY2xvbmUubV9jdXJyZW50SW52b2NhdGlvbkNvdW50PSBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQ7DQorICAgIGNsb25lLnNldE1pc3NpbmdHcm91cChnZXRNaXNzaW5nR3JvdXAoKSk7DQorICAgIGNsb25lLnNldFRocmVhZFBvb2xTaXplKGdldFRocmVhZFBvb2xTaXplKCkpOw0KKyAgICBjbG9uZS5zZXREZXNjcmlwdGlvbihnZXREZXNjcmlwdGlvbigpKTsNCisgICAgY2xvbmUuc2V0RW5hYmxlZChnZXRFbmFibGVkKCkpOw0KKyAgICBjbG9uZS5zZXRQYXJhbWV0ZXJJbnZvY2F0aW9uQ291bnQoZ2V0UGFyYW1ldGVySW52b2NhdGlvbkNvdW50KCkpOw0KKyAgICBjbG9uZS5zZXRJbnZvY2F0aW9uQ291bnQoZ2V0SW52b2NhdGlvbkNvdW50KCkpOw0KKyAgICBjbG9uZS5tX3RvdGFsSW52b2NhdGlvbkNvdW50ID0gZ2V0VG90YWxJbnZvY2F0aW9uQ291bnQoKTsNCisgICAgY2xvbmUubV9zdWNjZXNzUGVyY2VudGFnZSA9IGdldFN1Y2Nlc3NQZXJjZW50YWdlKCk7DQorICAgIGNsb25lLnNldFRpbWVPdXQoZ2V0VGltZU91dCgpKTsNCisgICAgY2xvbmUuc2V0UmV0cnlBbmFseXplcihnZXRSZXRyeUFuYWx5emVyKCkpOw0KKyAgICBjbG9uZS5zZXRTa2lwRmFpbGVkSW52b2NhdGlvbnMoc2tpcEZhaWxlZEludm9jYXRpb25zKCkpOw0KKyAgICBjbG9uZS5zZXRJbnZvY2F0aW9uTnVtYmVycyhnZXRJbnZvY2F0aW9uTnVtYmVycygpKTsNCisgICAgY2xvbmUuc2V0UHJpb3JpdHkoZ2V0UHJpb3JpdHkoKSk7DQorDQorICAgIHJldHVybiBjbG9uZTsNCisgIH0NCisNCisgIHByaXZhdGUgSVRlc3ROR01ldGhvZFtdIGNsb25lKElUZXN0TkdNZXRob2RbXSBzb3VyY2VzKSB7DQorICAgIElUZXN0TkdNZXRob2RbXSBjbG9uZXM9IG5ldyBJVGVzdE5HTWV0aG9kW3NvdXJjZXMubGVuZ3RoXTsNCisgICAgZm9yKGludCBpPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykgew0KKyAgICAgIGNsb25lc1tpXT0gc291cmNlc1tpXS5jbG9uZSgpOw0KKyAgICB9DQorDQorICAgIHJldHVybiBjbG9uZXM7DQorICB9DQorDQorICAvKiogU29ydHMgSVRlc3ROR01ldGhvZCBieSBDbGFzcyBuYW1lLiAqLw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElUZXN0TkdNZXRob2Q+IFNPUlRfQllfQ0xBU1MgPQ0KKyAgICBuZXcgQ29tcGFyYXRvcjxJVGVzdE5HTWV0aG9kPigpIHsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShJVGVzdE5HTWV0aG9kIG8xLCBJVGVzdE5HTWV0aG9kIG8yKSB7DQorICAgICAgU3RyaW5nIGMxID0gbzEuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpOw0KKyAgICAgIFN0cmluZyBjMiA9IG8yLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKTsNCisgICAgICByZXR1cm4gYzEuY29tcGFyZVRvKGMyKTsNCisgICAgfQ0KKyAgfTsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Rlc3ROR01ldGhvZEZpbmRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1Rlc3ROR01ldGhvZEZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwZjNiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HTWV0aG9kRmluZGVyLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TWV0aG9kRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklBbm5vdGF0aW9uRmluZGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKKy8qKgorICogVGhlIGRlZmF1bHQgc3RyYXRlZ3kgZm9yIGZpbmRpbmcgdGVzdCBtZXRob2RzOiAgbG9vayB1cAorICogYW5ub3RhdGlvbnMgQFRlc3QgaW4gZnJvbnQgb2YgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgTWF5IDMsIDIwMDQKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3ROR01ldGhvZEZpbmRlciBpbXBsZW1lbnRzIElUZXN0TWV0aG9kRmluZGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9TVUlURSA9IDE7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRlRFUl9TVUlURSA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfVEVTVCA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRlRFUl9URVNUID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9DTEFTUyA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRlRFUl9DTEFTUyA9IDY7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfVEVTVF9NRVRIT0QgPSA3OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUZURVJfVEVTVF9NRVRIT0QgPSA4OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkVGT1JFX0dST1VQUyA9IDk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRlRFUl9HUk9VUFMgPSAxMDsKKworICBwcml2YXRlIFJ1bkluZm8gbV9ydW5JbmZvID0gbnVsbDsKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXIgPSBudWxsOworCisgIHB1YmxpYyBUZXN0TkdNZXRob2RGaW5kZXIoUnVuSW5mbyBydW5JbmZvLCBJQW5ub3RhdGlvbkZpbmRlciBhbm5vdGF0aW9uRmluZGVyKQorICB7CisgICAgbV9ydW5JbmZvID0gcnVuSW5mbzsKKyAgICBtX2Fubm90YXRpb25GaW5kZXIgPSBhbm5vdGF0aW9uRmluZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0VGVzdE1ldGhvZHMoQ2xhc3M8Pz4gY2xhenosIFhtbFRlc3QgeG1sVGVzdCkgeworICAgIHJldHVybiBBbm5vdGF0aW9uSGVscGVyLmZpbmRNZXRob2RzV2l0aEFubm90YXRpb24oCisgICAgICAgIGNsYXp6LCBJVGVzdEFubm90YXRpb24uY2xhc3MsIG1fYW5ub3RhdGlvbkZpbmRlciwgeG1sVGVzdCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVDbGFzc01ldGhvZHMoQ2xhc3MgY2xzKSB7CisgICAgcmV0dXJuIGZpbmRDb25maWd1cmF0aW9uKGNscywgQkVGT1JFX0NMQVNTKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyQ2xhc3NNZXRob2RzKENsYXNzIGNscykgeworICAgIHJldHVybiBmaW5kQ29uZmlndXJhdGlvbihjbHMsIEFGVEVSX0NMQVNTKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RNZXRob2RzKENsYXNzIGNscykgeworICAgIHJldHVybiBmaW5kQ29uZmlndXJhdGlvbihjbHMsIEJFRk9SRV9URVNUX01FVEhPRCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclRlc3RNZXRob2RzKENsYXNzIGNscykgeworICAgIHJldHVybiBmaW5kQ29uZmlndXJhdGlvbihjbHMsIEFGVEVSX1RFU1RfTUVUSE9EKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVN1aXRlTWV0aG9kcyhDbGFzcyBjbHMpIHsKKyAgICByZXR1cm4gZmluZENvbmZpZ3VyYXRpb24oY2xzLCBCRUZPUkVfU1VJVEUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJTdWl0ZU1ldGhvZHMoQ2xhc3MgY2xzKSB7CisgICAgcmV0dXJuIGZpbmRDb25maWd1cmF0aW9uKGNscywgQUZURVJfU1VJVEUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKENsYXNzIGNsYXp6KSB7CisgICAgcmV0dXJuIGZpbmRDb25maWd1cmF0aW9uKGNsYXp6LCBCRUZPUkVfVEVTVCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclRlc3RDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzcyBjbGF6eikgeworICAgIHJldHVybiBmaW5kQ29uZmlndXJhdGlvbihjbGF6eiwgQUZURVJfVEVTVCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVHcm91cHNDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzcyBjbGF6eikgeworICAgIHJldHVybiBmaW5kQ29uZmlndXJhdGlvbihjbGF6eiwgQkVGT1JFX0dST1VQUyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb25NZXRob2RzKENsYXNzIGNsYXp6KSB7CisgICAgcmV0dXJuIGZpbmRDb25maWd1cmF0aW9uKGNsYXp6LCBBRlRFUl9HUk9VUFMpOworICB9CisKKyAgcHJpdmF0ZSBJVGVzdE5HTWV0aG9kW10gZmluZENvbmZpZ3VyYXRpb24oZmluYWwgQ2xhc3MgY2xhenosIGZpbmFsIGludCBjb25maWd1cmF0aW9uVHlwZSkgeworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgU2V0PE1ldGhvZD4gbWV0aG9kcyA9IENsYXNzSGVscGVyLmdldEF2YWlsYWJsZU1ldGhvZHMoY2xhenopOworCisgICAgZm9yIChNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5maW5kQ29uZmlndXJhdGlvbihtX2Fubm90YXRpb25GaW5kZXIsIG0pOworCisgICAgICBpZiAobnVsbCA9PSBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBib29sZWFuIGNyZWF0ZSA9IGZhbHNlOworICAgICAgYm9vbGVhbiBpc0JlZm9yZVN1aXRlID0gZmFsc2U7CisgICAgICBib29sZWFuIGlzQWZ0ZXJTdWl0ZSA9IGZhbHNlOworICAgICAgYm9vbGVhbiBpc0JlZm9yZVRlc3QgPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gaXNBZnRlclRlc3QgPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gaXNCZWZvcmVDbGFzcyA9IGZhbHNlOworICAgICAgYm9vbGVhbiBpc0FmdGVyQ2xhc3MgPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gaXNCZWZvcmVUZXN0TWV0aG9kID0gZmFsc2U7CisgICAgICBib29sZWFuIGlzQWZ0ZXJUZXN0TWV0aG9kID0gZmFsc2U7CisgICAgICBTdHJpbmdbXSBiZWZvcmVHcm91cHMgPSBudWxsOworICAgICAgU3RyaW5nW10gYWZ0ZXJHcm91cHMgPSBudWxsOworCisgICAgICBzd2l0Y2goY29uZmlndXJhdGlvblR5cGUpIHsKKyAgICAgICAgY2FzZSBCRUZPUkVfU1VJVEU6CisgICAgICAgICAgY3JlYXRlID0gY29uZmlndXJhdGlvbi5nZXRCZWZvcmVTdWl0ZSgpOworICAgICAgICAgIGlzQmVmb3JlU3VpdGUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFGVEVSX1NVSVRFOgorICAgICAgICAgIGNyZWF0ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJTdWl0ZSgpOworICAgICAgICAgIGlzQWZ0ZXJTdWl0ZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVGT1JFX1RFU1Q6CisgICAgICAgICAgY3JlYXRlID0gY29uZmlndXJhdGlvbi5nZXRCZWZvcmVUZXN0KCk7CisgICAgICAgICAgaXNCZWZvcmVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBRlRFUl9URVNUOgorICAgICAgICAgIGNyZWF0ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJUZXN0KCk7CisgICAgICAgICAgaXNBZnRlclRlc3QgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRV9DTEFTUzoKKyAgICAgICAgICBjcmVhdGUgPSBjb25maWd1cmF0aW9uLmdldEJlZm9yZVRlc3RDbGFzcygpOworICAgICAgICAgIGlzQmVmb3JlQ2xhc3MgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFGVEVSX0NMQVNTOgorICAgICAgICAgIGNyZWF0ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJUZXN0Q2xhc3MoKTsKKyAgICAgICAgICBpc0FmdGVyQ2xhc3MgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRV9URVNUX01FVEhPRDoKKyAgICAgICAgICBjcmVhdGUgPSBjb25maWd1cmF0aW9uLmdldEJlZm9yZVRlc3RNZXRob2QoKTsKKyAgICAgICAgICBpc0JlZm9yZVRlc3RNZXRob2QgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFGVEVSX1RFU1RfTUVUSE9EOgorICAgICAgICAgIGNyZWF0ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJUZXN0TWV0aG9kKCk7CisgICAgICAgICAgaXNBZnRlclRlc3RNZXRob2QgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRV9HUk9VUFM6CisgICAgICAgICAgYmVmb3JlR3JvdXBzID0gY29uZmlndXJhdGlvbi5nZXRCZWZvcmVHcm91cHMoKTsKKyAgICAgICAgICBjcmVhdGUgPSBiZWZvcmVHcm91cHMubGVuZ3RoID4gMDsKKyAgICAgICAgICBpc0JlZm9yZVRlc3RNZXRob2QgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFGVEVSX0dST1VQUzoKKyAgICAgICAgICBhZnRlckdyb3VwcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJHcm91cHMoKTsKKyAgICAgICAgICBjcmVhdGUgPSBhZnRlckdyb3Vwcy5sZW5ndGggPiAwOworICAgICAgICAgIGlzQmVmb3JlVGVzdE1ldGhvZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKGNyZWF0ZSkgeworICAgICAgICBhZGRDb25maWd1cmF0aW9uTWV0aG9kKGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JlZm9yZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXJTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JlZm9yZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCZWZvcmVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCZWZvcmVUZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXJUZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsgLyogQEBAICovCisgICAgICB9CisgICAgfQorCisgICAgTGlzdDxJVGVzdE5HTWV0aG9kPiBleGNsdWRlZE1ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBib29sZWFuIHVuaXF1ZSA9IGNvbmZpZ3VyYXRpb25UeXBlID09IEJFRk9SRV9TVUlURSB8fCBjb25maWd1cmF0aW9uVHlwZSA9PSBBRlRFUl9TVUlURTsKKyAgICBJVGVzdE5HTWV0aG9kW10gdG1SZXN1bHQgPSBNZXRob2RIZWxwZXIuY29sbGVjdEFuZE9yZGVyTWV0aG9kcyhMaXN0cy5uZXdBcnJheUxpc3QodlJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZm9yVGVzdHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRNZXRob2RzKTsKKworICAgIHJldHVybiB0bVJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRDb25maWd1cmF0aW9uTWV0aG9kKENsYXNzPD8+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FmdGVyU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCZWZvcmVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWZ0ZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQmVmb3JlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBZnRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQmVmb3JlVGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FmdGVyVGVzdE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYmVmb3JlR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhZnRlckdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlKQorICB7CisgICAgaWYobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKKyAgICAgIElUZXN0TkdNZXRob2QgY29uZk1ldGhvZCA9IG5ldyBDb25maWd1cmF0aW9uTWV0aG9kKG5ldyBDb25zdHJ1Y3Rvck9yTWV0aG9kKG1ldGhvZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Fubm90YXRpb25GaW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JlZm9yZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlclN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCZWZvcmVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JlZm9yZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCZWZvcmVUZXN0TWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlclRlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgIHJlc3VsdHMuYWRkKGNvbmZNZXRob2QpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HUHJvcGVydHkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UZXN0TkdQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyN2M2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdE5HUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKKworLyoqCisgKiBEZXNjcmliZXMgYSBwcm9wZXJ0eQorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMiwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3ROR1Byb3BlcnR5IHsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9jb21tYW5kTGluZU5hbWUgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBtX25hbWUgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBtX2RvY3VtZW50YXRpb24gPSBudWxsOworICBwcml2YXRlIFN0cmluZyBtX2RlZmF1bHQgPSBudWxsOworCisgIHB1YmxpYyBUZXN0TkdQcm9wZXJ0eShTdHJpbmcgY2xOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRvYywgU3RyaW5nIGRlZikgeworICAgIGluaXQoY2xOYW1lLCBuYW1lLCBkb2MsIGRlZik7CisgIH0KKworICBwdWJsaWMgVGVzdE5HUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyBkb2MsIFN0cmluZyBkZWYpIHsKKyAgICBpbml0KG5hbWUsIG5hbWUsIGRvYywgZGVmKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBjbE5hbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZG9jLCBTdHJpbmcgZGVmKSB7CisgICAgbV9jb21tYW5kTGluZU5hbWUgPSBjbE5hbWU7CisgICAgbV9uYW1lID0gbmFtZTsKKyAgICBtX2RvY3VtZW50YXRpb24gPSBkb2M7CisgICAgbV9kZWZhdWx0ID0gZGVmOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKKyAgICByZXR1cm4gbV9kZWZhdWx0OworICB9CisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50YXRpb24oKSB7CisgICAgcmV0dXJuIG1fZG9jdW1lbnRhdGlvbjsKKyAgfQorICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX25hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmRMaW5lTmFtZSgpIHsKKyAgICByZXR1cm4gbV9jb21tYW5kTGluZU5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9UZXN0UmVzdWx0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2N2JkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVGVzdFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuSUF0dHJpYnV0ZXM7DQoraW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLlJlcG9ydGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk9iamVjdHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgdGVzdC4NCisgKg0KKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMiwgMjAwNA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0UmVzdWx0IGltcGxlbWVudHMgSVRlc3RSZXN1bHQgew0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjI3MzAxNzQxODIzMzMyNDU1Nkw7DQorICBwcml2YXRlIElDbGFzcyBtX3Rlc3RDbGFzcyA9IG51bGw7DQorICBwcml2YXRlIElUZXN0TkdNZXRob2QgbV9tZXRob2QgPSBudWxsOw0KKyAgcHJpdmF0ZSBpbnQgbV9zdGF0dXMgPSAtMTsNCisgIHByaXZhdGUgVGhyb3dhYmxlIG1fdGhyb3dhYmxlID0gbnVsbDsNCisgIHByaXZhdGUgbG9uZyBtX3N0YXJ0TWlsbGlzID0gMDsNCisgIHByaXZhdGUgbG9uZyBtX2VuZE1pbGxpcyA9IDA7DQorICBwcml2YXRlIFN0cmluZyBtX25hbWUgPSBudWxsOw0KKyAgcHJpdmF0ZSBTdHJpbmcgbV9ob3N0Ow0KKyAgdHJhbnNpZW50IHByaXZhdGUgT2JqZWN0W10gbV9wYXJhbWV0ZXJzID0ge307DQorICB0cmFuc2llbnQgcHJpdmF0ZSBPYmplY3QgbV9pbnN0YW5jZTsNCisgIHByaXZhdGUgU3RyaW5nIG1faW5zdGFuY2VOYW1lOw0KKyAgcHJpdmF0ZSBJVGVzdENvbnRleHQgbV9jb250ZXh0Ow0KKw0KKyAgcHVibGljIFRlc3RSZXN1bHQoKSB7DQorDQorICB9DQorDQorICBwdWJsaWMgVGVzdFJlc3VsdChJQ2xhc3MgdGVzdENsYXNzLA0KKyAgICAgIE9iamVjdCBpbnN0YW5jZSwNCisgICAgICBJVGVzdE5HTWV0aG9kIG1ldGhvZCwNCisgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlLA0KKyAgICAgIGxvbmcgc3RhcnQsDQorICAgICAgbG9uZyBlbmQsDQorICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQpDQorICB7DQorICAgIGluaXQodGVzdENsYXNzLCBpbnN0YW5jZSwgbWV0aG9kLCB0aHJvd2FibGUsIHN0YXJ0LCBlbmQsIGNvbnRleHQpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKg0KKyAgICogQHBhcmFtIHRlc3RDbGFzcw0KKyAgICogQHBhcmFtIGluc3RhbmNlDQorICAgKiBAcGFyYW0gbWV0aG9kDQorICAgKiBAcGFyYW0gdGhyb3dhYmxlDQorICAgKiBAcGFyYW0gc3RhcnQNCisgICAqIEBwYXJhbSBlbmQNCisgICAqLw0KKyAgcHVibGljIHZvaWQgaW5pdCAoSUNsYXNzIHRlc3RDbGFzcywNCisgICAgICBPYmplY3QgaW5zdGFuY2UsDQorICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QsDQorICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSwNCisgICAgICBsb25nIHN0YXJ0LA0KKyAgICAgIGxvbmcgZW5kLA0KKyAgICAgIElUZXN0Q29udGV4dCBjb250ZXh0KQ0KKyAgew0KKyAgICBtX3Rlc3RDbGFzcyA9IHRlc3RDbGFzczsNCisgICAgbV90aHJvd2FibGUgPSB0aHJvd2FibGU7DQorICAgIG1faW5zdGFuY2VOYW1lID0gbV90ZXN0Q2xhc3MuZ2V0TmFtZSgpOw0KKyAgICBpZiAobnVsbCA9PSBtX3Rocm93YWJsZSkgew0KKyAgICAgIG1fc3RhdHVzID0gSVRlc3RSZXN1bHQuU1VDQ0VTUzsNCisgICAgfQ0KKyAgICBtX3N0YXJ0TWlsbGlzID0gc3RhcnQ7DQorICAgIG1fZW5kTWlsbGlzID0gZW5kOw0KKyAgICBtX21ldGhvZCA9IG1ldGhvZDsNCisgICAgbV9jb250ZXh0ID0gY29udGV4dDsNCisNCisgICAgbV9pbnN0YW5jZSA9IGluc3RhbmNlOw0KKw0KKyAgICAvLyBDYWxjdWxhdGUgdGhlIG5hbWU6IGVpdGhlciB0aGUgbWV0aG9kIG5hbWUsIElUZXN0I2dldFRlc3ROYW1lIG9yDQorICAgIC8vIHRvU3RyaW5nKCkgaWYgaXQncyBiZWVuIG92ZXJyaWRkZW4uDQorICAgIGlmIChtX2luc3RhbmNlID09IG51bGwpIHsNCisgICAgICBtX25hbWUgPSBtX21ldGhvZC5nZXRNZXRob2ROYW1lKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG1faW5zdGFuY2UgaW5zdGFuY2VvZiBJVGVzdCkgew0KKyAgICAgICAgbV9uYW1lID0gKChJVGVzdCkgbV9pbnN0YW5jZSkuZ2V0VGVzdE5hbWUoKTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAodGVzdENsYXNzLmdldFRlc3ROYW1lKCkgIT0gbnVsbCkgew0KKyAgICAgICAgbV9uYW1lID0gdGVzdENsYXNzLmdldFRlc3ROYW1lKCk7DQorICAgICAgfQ0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgU3RyaW5nIHN0cmluZyA9IG1faW5zdGFuY2UudG9TdHJpbmcoKTsNCisgICAgICAgIC8vIE9ubHkgZGlzcGxheSB0b1N0cmluZygpIGlmIGl0J3MgYmVlbiBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyDQorICAgICAgICBtX25hbWUgPSBnZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICBpZiAoIU9iamVjdC5jbGFzcy5nZXRNZXRob2QoInRvU3RyaW5nIikNCisgICAgICAgICAgICAgIC5lcXVhbHMobV9pbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgidG9TdHJpbmciKSkpIHsNCisgICAgICAgICAgICBtX2luc3RhbmNlTmFtZSA9IHN0cmluZy5zdGFydHNXaXRoKCJjbGFzcyAiKQ0KKyAgICAgICAgICAgICAgICA/IHN0cmluZy5zdWJzdHJpbmcoImNsYXNzICIubGVuZ3RoKCkpDQorICAgICAgICAgICAgICAgIDogc3RyaW5nOw0KKyAgICAgICAgICAgIG1fbmFtZSA9IG1fbmFtZSArICIgb24gIiArIG1faW5zdGFuY2VOYW1lOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBjYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gaWdub3JlKSB7DQorICAgICAgICAgIC8vIGlnbm9yZQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdFJlc3VsdF0gIiArIHMpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRFbmRNaWxsaXMobG9uZyBtaWxsaXMpIHsNCisgICAgbV9lbmRNaWxsaXMgPSBtaWxsaXM7DQorICB9DQorDQorICAvKioNCisgICAqIElmIHRoaXMgcmVzdWx0J3MgcmVsYXRlZCBpbnN0YW5jZSBpbXBsZW1lbnRzIElUZXN0IG9yIHVzZSBAVGVzdCh0ZXN0TmFtZT0uLi4pLCByZXR1cm5zIGl0cyB0ZXN0IG5hbWUsDQorICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7DQorICAgIGlmIChtX2luc3RhbmNlIGluc3RhbmNlb2YgSVRlc3QpIHsNCisgICAgICByZXR1cm4gKChJVGVzdCkgbV9pbnN0YW5jZSkuZ2V0VGVzdE5hbWUoKTsNCisgICAgfQ0KKyAgICBpZiAobV90ZXN0Q2xhc3MuZ2V0VGVzdE5hbWUoKSAhPSBudWxsKSB7DQorICAgICAgcmV0dXJuIG1fdGVzdENsYXNzLmdldFRlc3ROYW1lKCk7DQorICAgIH0NCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgcmV0dXJuIG1fbmFtZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtZXRob2QuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElUZXN0TkdNZXRob2QgZ2V0TWV0aG9kKCkgew0KKyAgICByZXR1cm4gbV9tZXRob2Q7DQorICB9DQorDQorICAvKioNCisgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBzZXQuDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChJVGVzdE5HTWV0aG9kIG1ldGhvZCkgew0KKyAgICBtX21ldGhvZCA9IG1ldGhvZDsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGF0dXMuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7DQorICAgIHJldHVybiBtX3N0YXR1czsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIHN0YXR1cyBUaGUgc3RhdHVzIHRvIHNldC4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgew0KKyAgICBtX3N0YXR1cyA9IHN0YXR1czsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCkgew0KKyAgICByZXR1cm4gSVRlc3RSZXN1bHQuU1VDQ0VTUyA9PSBtX3N0YXR1czsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0Q2xhc3MuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIElDbGFzcyBnZXRUZXN0Q2xhc3MoKSB7DQorICAgIHJldHVybiBtX3Rlc3RDbGFzczsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIHRlc3RDbGFzcyBUaGUgdGVzdENsYXNzIHRvIHNldC4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgc2V0VGVzdENsYXNzKElDbGFzcyB0ZXN0Q2xhc3MpIHsNCisgICAgbV90ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3M7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGhyb3dhYmxlLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKCkgew0KKyAgICByZXR1cm4gbV90aHJvd2FibGU7DQorICB9DQorDQorICAvKioNCisgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIHRocm93YWJsZSB0byBzZXQuDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGhyb3dhYmxlKFRocm93YWJsZSB0aHJvd2FibGUpIHsNCisgICAgbV90aHJvd2FibGUgPSB0aHJvd2FibGU7DQorICB9DQorDQorICAvKioNCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5kTWlsbGlzLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBsb25nIGdldEVuZE1pbGxpcygpIHsNCisgICAgcmV0dXJuIG1fZW5kTWlsbGlzOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0TWlsbGlzLg0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBsb25nIGdldFN0YXJ0TWlsbGlzKCkgew0KKyAgICByZXR1cm4gbV9zdGFydE1pbGxpczsNCisgIH0NCisNCisvLyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRPdXRwdXQoKSB7DQorLy8gICAgcmV0dXJuIG1fb3V0cHV0Ow0KKy8vICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBSZXBvcnRlci5nZXRPdXRwdXQodGhpcyk7DQorICAgIFN0cmluZyByZXN1bHQgPSBPYmplY3RzLnRvU3RyaW5nSGVscGVyKGdldENsYXNzKCkpDQorICAgICAgICAub21pdE51bGxzKCkNCisgICAgICAgIC5vbWl0RW1wdHlTdHJpbmdzKCkNCisgICAgICAgIC5hZGQoIm5hbWUiLCBnZXROYW1lKCkpDQorICAgICAgICAuYWRkKCJzdGF0dXMiLCB0b1N0cmluZyhtX3N0YXR1cykpDQorICAgICAgICAuYWRkKCJtZXRob2QiLCBtX21ldGhvZCkNCisgICAgICAgIC5hZGQoIm91dHB1dCIsIG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5zaXplKCkgPiAwID8gb3V0cHV0LmdldCgwKSA6IG51bGwpDQorICAgICAgICAudG9TdHJpbmcoKTsNCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBzdGF0dXMpIHsNCisgICAgc3dpdGNoKHN0YXR1cykgew0KKyAgICAgIGNhc2UgU1VDQ0VTUzogcmV0dXJuICJTVUNDRVNTIjsNCisgICAgICBjYXNlIEZBSUxVUkU6IHJldHVybiAiRkFJTFVSRSI7DQorICAgICAgY2FzZSBTS0lQOiByZXR1cm4gIlNLSVAiOw0KKyAgICAgIGNhc2UgU1VDQ0VTU19QRVJDRU5UQUdFX0ZBSUxVUkU6IHJldHVybiAiU1VDQ0VTUyBXSVRISU4gUEVSQ0VOVEFHRSI7DQorICAgICAgY2FzZSBTVEFSVEVEOiByZXR1cm4gIlNUQVJURUQiOw0KKyAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7DQorICAgIH0NCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgew0KKyAgICByZXR1cm4gbV9ob3N0Ow0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgew0KKyAgICBtX2hvc3QgPSBob3N0Ow0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgT2JqZWN0W10gZ2V0UGFyYW1ldGVycygpIHsNCisgICAgcmV0dXJuIG1fcGFyYW1ldGVyczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhPYmplY3RbXSBwYXJhbWV0ZXJzKSB7DQorICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBPYmplY3QgZ2V0SW5zdGFuY2UoKSB7DQorICAgIHJldHVybiBtX2luc3RhbmNlOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBJQXR0cmlidXRlcyBtX2F0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOw0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgew0KKyAgICByZXR1cm4gbV9hdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZShuYW1lKTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsNCisgICAgbV9hdHRyaWJ1dGVzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsNCisgICAgcmV0dXJuIG1fYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVOYW1lcygpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgT2JqZWN0IHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgew0KKyAgICByZXR1cm4gbV9hdHRyaWJ1dGVzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCisgIH0NCisgIA0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgSVRlc3RDb250ZXh0IGdldFRlc3RDb250ZXh0KCkgew0KKwkgIHJldHVybiBtX2NvbnRleHQ7DQorICB9DQorICANCisgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsNCisJICBtX2NvbnRleHQgPSBjb250ZXh0Ow0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhJVGVzdFJlc3VsdCBjb21wYXJpc29uKSB7DQorCSAgaWYoIGdldFN0YXJ0TWlsbGlzKCkgPiBjb21wYXJpc29uLmdldFN0YXJ0TWlsbGlzKCkgKSB7DQorCQkgIHJldHVybiAxOw0KKwkgIH0gZWxzZSBpZiggZ2V0U3RhcnRNaWxsaXMoKSA8IGNvbXBhcmlzb24uZ2V0U3RhcnRNaWxsaXMoKSkgew0KKwkJICByZXR1cm4gLTE7DQorCSAgfSBlbHNlIHsNCisJCSAgcmV0dXJuIDA7DQorCSAgfQ0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlTmFtZSgpIHsNCisgICAgcmV0dXJuIG1faW5zdGFuY2VOYW1lOw0KKyAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVXRpbHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWFjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvVXRpbHMuamF2YQpAQCAtMCwwICsxLDg2MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0UnVubmVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5sb2cuVGV4dEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CisKKy8qKgorICogSGVscGVyIG1ldGhvZHMgdG8gcGFyc2UgYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEFwciAyNiwgMjAwNAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbHMgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gU1BFQ0lBTF9DSEFSQUNURVJTID0KKyAgICAgIHsnKicsJy8nLCdcXCcsJz8nLCclJywnOicsJzsnLCc8JywnPicsJyYnLCd+JywnfCd9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9SRVBMQUNFTUVOVCA9ICdfJzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFVOSUNPREVfUkVQTEFDRU1FTlQgPSAweEZGRkQ7CisKKyAgLyoqCisgICAqIEhpZGUgY29uc3RydWN0b3IgZm9yIHV0aWxpdHkgY2xhc3MuCisgICAqLworICBwcml2YXRlIFV0aWxzKCkgeworICAgIC8vIEhpZGUgY29uc3RydWN0b3IKKyAgfQorCisgIC8qKgorICAgKiBTcGxpdHMgdGhlIGdpdmVuIFN0cmluZyBzIGludG8gdG9rZW5zIHdoZXJlIHRoZSBzZXBhcmF0b3IgaXMKKyAgICogZWl0aGVyIHRoZSBzcGFjZSBjaGFyYWN0ZXIgb3IgdGhlIGNvbW1hIGNoYXJhY3Rlci4gRm9yIGV4YW1wbGUsCisgICAqIGlmIHMgaXMgImEsYiwgYyIgdGhpcyBtZXRob2QgcmV0dXJucyB7ImEiLCAiYiIsICJjIn0KKyAgICoKKyAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBzcGxpdAorICAgKiBAcmV0dXJuIHRoZSBzcGxpdCB0b2tlbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzdHJpbmdUb0FycmF5KFN0cmluZyBzKSB7CisgICAgLy8gVE9ETyBDUSB3b3VsZCBzLnNwbGl0KCkgYmUgYSBiZXR0ZXIgd2F5IG9mIGRvaW5nIHRoaXM/CisgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiICwiKTsKKyAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSBzdC5uZXh0VG9rZW4oKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBYbWxDbGFzc1tdIGNsYXNzZXNUb1htbENsYXNzZXMoQ2xhc3M8Pz5bXSBjbGFzc2VzKSB7CisgICAgTGlzdDxYbWxDbGFzcz4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBmb3IgKENsYXNzPD8+IGNscyA6IGNsYXNzZXMpIHsKKyAgICAgIHJlc3VsdC5hZGQobmV3IFhtbENsYXNzKGNscywgdHJ1ZSAvKiBsb2FkIGNsYXNzZXMgKi8pKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFhtbENsYXNzW2NsYXNzZXMubGVuZ3RoXSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHBhcnNlTXVsdGlMaW5lKFN0cmluZyBsaW5lKSB7CisgICAgTGlzdDxTdHJpbmc+IHZSZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBpZiAoaXNTdHJpbmdOb3RCbGFuayhsaW5lKSkgeworICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiICIpOworICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICB2UmVzdWx0LmFkZChzdC5uZXh0VG9rZW4oKSk7CisgICAgICB9CisgICAgICAvLyBCdWcgaW4gc3BsaXQgd2hlbiBwYXNzZWQgIiAiIDogcmV0dXJucyBvbmUgdG9vIG1hbnkgcmVzdWx0CisgICAgICAvLyAgICAgIHJlc3VsdCA9IGxpbmUuc3BsaXQoIiAiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdlJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbdlJlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVV0ZjhGaWxlKEBOdWxsYWJsZSBTdHJpbmcgb3V0cHV0RGlyLCBTdHJpbmcgZmlsZU5hbWUsIFhNTFN0cmluZ0J1ZmZlciB4c2IsIFN0cmluZyBwcmVmaXgpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgRmlsZSBvdXREaXIgPSAob3V0cHV0RGlyICE9IG51bGwpID8gbmV3IEZpbGUob3V0cHV0RGlyKSA6IG5ldyBGaWxlKCIiKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgIGlmICghb3V0RGlyLmV4aXN0cygpKSB7CisgICAgICAgIG91dERpci5ta2RpcnMoKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG91dERpciwgZmlsZU5hbWUpOworICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgfQorICAgICAgZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLCAiVVRGLTgiKTsKKyAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICB3LmFwcGVuZChwcmVmaXgpOworICAgICAgfQorICAgICAgeHNiLnRvV3JpdGVyKHcpOworICAgICAgdy5jbG9zZSgpOworICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNiIHN0cmluZyB0byB0aGUgZmlsZSBuYW1lZCBmaWxlbmFtZSBpbiBvdXREaXIgZW5jb2RpbmcgdGhlIG91dHB1dCBhcyBVVEYtOC4KKyAgICogSWYgb3V0RGlyIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgorICAgKgorICAgKiBAcGFyYW0gb3V0cHV0RGlyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IChtYXkgbm90IGV4aXN0KS4gSWYgPHR0Pm51bGw8L3R0PiB0aGVuIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHVzZWQuCisgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgZmlsZW5hbWUKKyAgICogQHBhcmFtIHNiIHRoZSBmaWxlIGNvbnRlbnQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVV0ZjhGaWxlKEBOdWxsYWJsZSBTdHJpbmcgb3V0cHV0RGlyLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBzYikgeworICAgIGZpbmFsIFN0cmluZyBvdXREaXJQYXRoPSBvdXRwdXREaXIgIT0gbnVsbCA/IG91dHB1dERpciA6ICIiOworICAgIGZpbmFsIEZpbGUgb3V0RGlyPSBuZXcgRmlsZShvdXREaXJQYXRoKTsKKyAgICB3cml0ZUZpbGUob3V0RGlyLCBmaWxlTmFtZSwgZXNjYXBlVW5pY29kZShzYiksICJVVEYtOCIsIGZhbHNlIC8qIGRvbid0IGFwcGVuZCAqLyk7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBzYiBzdHJpbmcgdG8gdGhlIGZpbGUgbmFtZWQgZmlsZW5hbWUgaW4gb3V0RGlyLiBJZgorICAgKiBvdXREaXIgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCisgICAqCisgICAqIEBwYXJhbSBvdXRwdXREaXIgdGhlIG91dHB1dCBkaXJlY3RvcnkgKG1heSBub3QgZXhpc3QpLiBJZiA8dHQ+bnVsbDwvdHQ+IHRoZW4gY3VycmVudCBkaXJlY3RvcnkgaXMgdXNlZC4KKyAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlbmFtZQorICAgKiBAcGFyYW0gc2IgdGhlIGZpbGUgY29udGVudAorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShATnVsbGFibGUgU3RyaW5nIG91dHB1dERpciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc2IpIHsKKyAgICBmaW5hbCBTdHJpbmcgb3V0RGlyUGF0aD0gb3V0cHV0RGlyICE9IG51bGwgPyBvdXRwdXREaXIgOiAiIjsKKyAgICBmaW5hbCBGaWxlIG91dERpcj0gbmV3IEZpbGUob3V0RGlyUGF0aCk7CisgICAgd3JpdGVGaWxlKG91dERpciwgZmlsZU5hbWUsIHNiLCBudWxsLCBmYWxzZSAvKiBkb24ndCBhcHBlbmQgKi8pOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgc2Igc3RyaW5nIHRvIHRoZSBmaWxlIG5hbWVkIGZpbGVuYW1lIGluIG91dERpci4gSWYKKyAgICogb3V0RGlyIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgorICAgKgorICAgKiBAcGFyYW0gb3V0RGlyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IChtYXkgbm90IGV4aXN0KS4gSWYgPHR0Pm51bGw8L3R0PiB0aGVuIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHVzZWQuCisgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgZmlsZW5hbWUKKyAgICogQHBhcmFtIHNiIHRoZSBmaWxlIGNvbnRlbnQKKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVGaWxlKEBOdWxsYWJsZSBGaWxlIG91dERpciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc2IsIEBOdWxsYWJsZSBTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChvdXREaXIgPT0gbnVsbCkgeworICAgICAgICBvdXREaXIgPSBuZXcgRmlsZSgiIikuZ2V0QWJzb2x1dGVGaWxlKCk7CisgICAgICB9CisgICAgICBpZiAoIW91dERpci5leGlzdHMoKSkgeworICAgICAgICBvdXREaXIubWtkaXJzKCk7CisgICAgICB9CisKKyAgICAgIGZpbGVOYW1lID0gcmVwbGFjZVNwZWNpYWxDaGFyYWN0ZXJzKGZpbGVOYW1lKTsKKyAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dERpciwgZmlsZU5hbWUpOworICAgICAgaWYgKCFhcHBlbmQpIHsKKyAgICAgICAgb3V0cHV0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgb3V0cHV0RmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICB9CisgICAgICB3cml0ZUZpbGUob3V0cHV0RmlsZSwgc2IsIGVuY29kaW5nLCBhcHBlbmQpOworICAgIH0KKyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgaWYgKFRlc3RSdW5uZXIuZ2V0VmVyYm9zZSgpID4gMSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGxvZygiW1V0aWxzXSIsIDEsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRmlsZShGaWxlIG91dHB1dEZpbGUsIFN0cmluZyBzYiwgQE51bGxhYmxlIFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBhcHBlbmQpIHsKKyAgICBCdWZmZXJlZFdyaXRlciBmdyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGZ3ID0gb3BlbldyaXRlcihvdXRwdXRGaWxlLCBlbmNvZGluZywgYXBwZW5kKTsKKyAgICAgIGZ3LndyaXRlKHNiKTsKKworICAgICAgVXRpbHMubG9nKCIiLCAzLCAiQ3JlYXRpbmcgIiArIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKyAgICBjYXRjaChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgaWYgKFRlc3RSdW5uZXIuZ2V0VmVyYm9zZSgpID4gMSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SIFdISUxFIFdSSVRJTkcgVE8gIiArIG91dHB1dEZpbGUpOworICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBsb2coIltVdGlsc10iLCAxLCAiRXJyb3Igd2hpbGUgd3JpdGluZyB0byAiICsgb3V0cHV0RmlsZSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChmdyAhPSBudWxsKSB7CisgICAgICAgICAgZncuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgOyAvLyBpZ25vcmUKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogT3BlbiBhIEJ1ZmZlcmVkV3JpdGVyIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuIElmIG91dHB1dCBkaXJlY3RvcnkgZG9lc24ndAorICAgKiBleGlzdCwgaXQgaXMgY3JlYXRlZC4gSWYgdGhlIG91dHB1dCBmaWxlIGV4aXN0cywgaXQgaXMgZGVsZXRlZC4gVGhlIG91dHB1dCBmaWxlIGlzCisgICAqIGNyZWF0ZWQgaW4gYW55IGNhc2UuCisgICAqIEBwYXJhbSBvdXRwdXREaXIgb3V0cHV0IGRpcmVjdG9yeS4gSWYgPHR0Pm51bGw8L3R0PiwgdGhlbiBjdXJyZW50IGRpcmVjdG9yeSBpcyB1c2VkCisgICAqIEBwYXJhbSBmaWxlTmFtZSBmaWxlIG5hbWUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nIHdoaWxlIGNyZWF0aW5nIGZpbGVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFdyaXRlciBvcGVuV3JpdGVyKEBOdWxsYWJsZSBTdHJpbmcgb3V0cHV0RGlyLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIG91dERpclBhdGg9IG91dHB1dERpciAhPSBudWxsID8gb3V0cHV0RGlyIDogIiI7CisgICAgRmlsZSBvdXREaXI9IG5ldyBGaWxlKG91dERpclBhdGgpOworICAgIGlmIChvdXREaXIuZXhpc3RzKCkpIHsKKyAgICAgIG91dERpci5ta2RpcnMoKTsKKyAgICB9CisgICAgZmlsZU5hbWUgPSByZXBsYWNlU3BlY2lhbENoYXJhY3RlcnMoZmlsZU5hbWUpOworICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dERpciwgZmlsZU5hbWUpOworICAgIG91dHB1dEZpbGUuZGVsZXRlKCk7CisgICAgcmV0dXJuIG9wZW5Xcml0ZXIob3V0cHV0RmlsZSwgbnVsbCwgZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRXcml0ZXIgb3BlbldyaXRlcihGaWxlIG91dHB1dEZpbGUsIEBOdWxsYWJsZSBTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICghb3V0cHV0RmlsZS5leGlzdHMoKSkgeworICAgICAgb3V0cHV0RmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgfQorICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3c9IG51bGw7CisgICAgaWYgKG51bGwgIT0gZW5jb2RpbmcpIHsKKyAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSwgYXBwZW5kKSwgZW5jb2RpbmcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSwgYXBwZW5kKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIob3N3KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgVXRpbHMubG9nKCJVdGlscyIsIDAsIHMpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSByZXN1bHQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wTWFwKE1hcDw/LCA/PiByZXN1bHQpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZ2dnZ2Iik7CisgICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiByZXN1bHQuZW50cnlTZXQoKSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVudHJ5LmdldEtleSgpICsgIiA9PiAiICsgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXl5eXl4iKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYWxsTWV0aG9kcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBNZXRob2RzKExpc3Q8SVRlc3ROR01ldGhvZD4gYWxsTWV0aG9kcykgeworICAgIHBwcCgiPT09PT09PT0gTUVUSE9EUzoiKTsKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgdG0gOiBhbGxNZXRob2RzKSB7CisgICAgICBwcHAoIiAgIiArIHRtKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgbGlzdCBvZiBkZXBlbmRlbnQgZ3JvdXBzIGZvciB0aGlzIG1ldGhvZCwgaW5jbHVkaW5nIHRoZQorICAgKiBjbGFzcyBncm91cHMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZGVwZW5kZW50R3JvdXBzRm9yVGhpc01ldGhvZEZvclRlc3QoTWV0aG9kIG0sIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgeworICAgIExpc3Q8U3RyaW5nPiB2UmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgQ2xhc3M8Pz4gY2xzID0gbS5nZXREZWNsYXJpbmdDbGFzcygpOworCisgICAgLy8gQ29sbGVjdCBncm91cHMgb24gdGhlIGNsYXNzCisgICAgSVRlc3RBbm5vdGF0aW9uIHRjID0gQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChmaW5kZXIsIGNscyk7CisgICAgaWYgKG51bGwgIT0gdGMpIHsKKyAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogdGMuZ2V0RGVwZW5kc09uR3JvdXBzKCkpIHsKKyAgICAgICAgdlJlc3VsdC5hZGQoZ3JvdXApOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvbGxlY3QgZ3JvdXBzIG9uIHRoZSBtZXRob2QKKyAgICBJVGVzdEFubm90YXRpb24gdG0gPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRUZXN0KGZpbmRlciwgbSk7CisgICAgaWYgKG51bGwgIT0gdG0pIHsKKyAgICAgIFN0cmluZ1tdIGdyb3VwcyA9IHRtLmdldERlcGVuZHNPbkdyb3VwcygpOworCisgICAgICAvLyAgICAgICBwcHAoIk1ldGhvZDoiICsgbSArICIgI0dyb3VwczoiICsgZ3JvdXBzLmxlbmd0aCk7CisgICAgICBmb3IgKFN0cmluZyBncm91cCA6IGdyb3VwcykgeworICAgICAgICB2UmVzdWx0LmFkZChncm91cCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZSZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3ZSZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgYmVsb25ncyB0bywgaW5jbHVkaW5nIHRoZQorICAgKiBjbGFzcyBncm91cHMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ3JvdXBzRm9yVGhpc01ldGhvZEZvclRlc3QoTWV0aG9kIG0sIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgeworICAgIExpc3Q8U3RyaW5nPiB2UmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgQ2xhc3M8Pz4gY2xzID0gbS5nZXREZWNsYXJpbmdDbGFzcygpOworCisgICAgLy8gQ29sbGVjdCBncm91cHMgb24gdGhlIGNsYXNzCisgICAgSVRlc3RBbm5vdGF0aW9uIHRjID0gQW5ub3RhdGlvbkhlbHBlci5maW5kVGVzdChmaW5kZXIsIGNscyk7CisgICAgaWYgKG51bGwgIT0gdGMpIHsKKyAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogdGMuZ2V0R3JvdXBzKCkpIHsKKyAgICAgICAgdlJlc3VsdC5hZGQoZ3JvdXApOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvbGxlY3QgZ3JvdXBzIG9uIHRoZSBtZXRob2QKKyAgICBJVGVzdEFubm90YXRpb24gdG0gPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRUZXN0KGZpbmRlciwgbSk7CisgICAgaWYgKG51bGwgIT0gdG0pIHsKKyAgICAgIFN0cmluZ1tdIGdyb3VwcyA9IHRtLmdldEdyb3VwcygpOworCisgICAgICAvLyAgICAgICBwcHAoIk1ldGhvZDoiICsgbSArICIgI0dyb3VwczoiICsgZ3JvdXBzLmxlbmd0aCk7CisgICAgICBmb3IgKFN0cmluZyBncm91cCA6IGdyb3VwcykgeworICAgICAgICB2UmVzdWx0LmFkZChncm91cCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZSZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3ZSZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBtZXRob2QgYmVsb25ncyB0bywgaW5jbHVkaW5nIHRoZQorICAgKiBjbGFzcyBncm91cHMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ3JvdXBzRm9yVGhpc01ldGhvZEZvckNvbmZpZ3VyYXRpb24oTWV0aG9kIG0sIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgeworICAgIFN0cmluZ1tdIHJlc3VsdCA9IHt9OworCisgICAgLy8gQ29sbGVjdCBncm91cHMgb24gdGhlIG1ldGhvZAorICAgIElUZXN0QW5ub3RhdGlvbiB0bSA9IEFubm90YXRpb25IZWxwZXIuZmluZFRlc3QoZmluZGVyLCBtKTsKKyAgICBpZiAobnVsbCAhPSB0bSkgeworICAgICAgcmVzdWx0ID0gdG0uZ2V0R3JvdXBzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGdyb3VwcyB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uLCBpbmNsdWRpbmcgdGhlCisgICAqIGNsYXNzIGdyb3VwcworICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBkZXBlbmRlbnRHcm91cHNGb3JUaGlzTWV0aG9kRm9yQ29uZmlndXJhdGlvbihNZXRob2QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIpIHsKKyAgICBTdHJpbmdbXSByZXN1bHQgPSB7fTsKKworICAgIC8vIENvbGxlY3QgZ3JvdXBzIG9uIHRoZSBtZXRob2QKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gdG0gPSBBbm5vdGF0aW9uSGVscGVyLmZpbmRDb25maWd1cmF0aW9uKGZpbmRlciwgbSk7CisgICAgaWYgKG51bGwgIT0gdG0pIHsKKyAgICAgIHJlc3VsdCA9IHRtLmdldERlcGVuZHNPbkdyb3VwcygpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICBsb2coIlV0aWxzIiwgMiwgbXNnKTsKKyAgfQorCisgIC8qKgorICAgKiBMb2dzIHRoZSB0aGUgbWVzc2FnZSB0byBTeXN0ZW0ub3V0IGlmIGxldmVsIGlzIGdyZWF0ZXIgdGhhbgorICAgKiBvciBlcXVhbCB0byBUZXN0UnVubmVyLmdldFZlcmJvc2UoKS4gVGhlIG1lc3NhZ2UgaXMgbG9nZ2VkIGFzOgorICAgKiA8cHJlPgorICAgKiAgICAgIltjbHNdIG1zZyIKKyAgICogPC9wcmU+CisgICAqCisgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzIG5hbWUgdG8gcHJlZml4IHRoZSBsb2cgbWVzc2FnZS4KKyAgICogQHBhcmFtIGxldmVsIHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoZSBtZXNzYWdlLgorICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIGxvZyB0byBTeXN0ZW0ub3V0LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgY2xzLCBpbnQgbGV2ZWwsIFN0cmluZyBtc2cpIHsKKyAgICAvLyBXaHkgdGhpcyBjb3VwbGluZyBvbiBhIHN0YXRpYyBtZW1iZXIgb2YgVGVzdFJ1bm5lci5nZXRWZXJib3NlKCk/CisgICAgaWYgKFRlc3RSdW5uZXIuZ2V0VmVyYm9zZSgpID49IGxldmVsKSB7CisgICAgICBpZiAoY2xzLmxlbmd0aCgpID4gMCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgY2xzICsgIl0gIiArIG1zZyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltFcnJvcl0gIiArIGVycm9yTWVzc2FnZSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG1ldGhvZHMgaW52b2tlZCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbnVtYmVyCisgICAqIG9mIGluc3RhbmNlcy4KKyAgICovCisvLyAgcHVibGljIHN0YXRpYyBpbnQgY2FsY3VsYXRlSW52b2tlZE1ldGhvZENvdW50KElSZXN1bHRNYXAgbWFwKSB7CisvLyAgICByZXR1cm4gY2FsY3VsYXRlSW52b2tlZE1ldGhvZENvdW50KAorLy8gICAgICAgIChJVGVzdE5HTWV0aG9kW10pIG1hcC5nZXRBbGxNZXRob2RzKCkudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFttYXAuc2l6ZSgpXSkpOworLy8gIH0KKworICBwdWJsaWMgc3RhdGljIGludCBjYWxjdWxhdGVJbnZva2VkTWV0aG9kQ291bnQoSVRlc3ROR01ldGhvZFtdIG1ldGhvZHMpIHsKKyAgICByZXR1cm4gbWV0aG9kcy5sZW5ndGg7CisvLyAgICBpbnQgcmVzdWx0ID0gMDsKKy8vCisvLyAgICBmb3IgKElUZXN0TkdNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworLy8gICAgICBpbnQgaW5zdGFuY2VDb3VudCA9IG1ldGhvZC5nZXRJbnZvY2F0aW9uQ291bnQoKTsKKy8vICAgICAgcmVzdWx0ICs9IGluc3RhbmNlQ291bnQ7CisvLyAgICB9CisvLworLy8gICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisvLyAgcHVibGljIHN0YXRpYyBpbnQgY2FsY3VsYXRlSW52b2tlZE1ldGhvZENvdW50KE1hcDxJVGVzdE5HTWV0aG9kLCBJVGVzdFJlc3VsdD4gbWV0aG9kcykgeworLy8gICAgcmV0dXJuIGNhbGN1bGF0ZUludm9rZWRNZXRob2RDb3VudChtZXRob2RzLmtleVNldCgpLnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbbWV0aG9kcy52YWx1ZXMoKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pKTsKKy8vICB9CisKKyAgLyoqCisgICAqIFRva2VuaXplIHRoZSBzdHJpbmcgdXNpbmcgdGhlIHNlcGFyYXRvci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHNlcCkgeworICAgIGlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgIH0KKworICAgIC8vIFRPRE8gSG93IGRpZmZlcmVudCBpcyB0aGlzIGZyb206CisgICAgLy8gcmV0dXJuIHN0cmluZy5zcGxpdChzZXApOworCisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBpbnQgaWR4ID0gc3RyaW5nLmluZGV4T2Yoc2VwLCBzdGFydCk7CisgICAgaW50IGxlbiA9IHNlcC5sZW5ndGgoKTsKKyAgICBMaXN0PFN0cmluZz4gc3RyaW5ncyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgd2hpbGUgKGlkeCAhPSAtMSkgeworICAgICAgc3RyaW5ncy5hZGQoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgaWR4KS50cmltKCkpOworICAgICAgc3RhcnQgPSBpZHggKyBsZW47CisgICAgICBpZHggPSBzdHJpbmcuaW5kZXhPZihzZXAsIHN0YXJ0KTsKKyAgICB9CisKKyAgICBzdHJpbmdzLmFkZChzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0KS50cmltKCkpOworCisgICAgcmV0dXJuIHN0cmluZ3MudG9BcnJheShuZXcgU3RyaW5nW3N0cmluZ3Muc2l6ZSgpXSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdExvZ2dlcihMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgb3V0cHV0TG9nUGF0aCkgeworICAgIHRyeSB7CisgICAgICBsb2dnZXIuc2V0VXNlUGFyZW50SGFuZGxlcnMoZmFsc2UpOworICAgICAgRmlsZUhhbmRsZXIgZmggPSBuZXcgRmlsZUhhbmRsZXIob3V0cHV0TG9nUGF0aCk7CisgICAgICBmaC5zZXRGb3JtYXR0ZXIobmV3IFRleHRGb3JtYXR0ZXIoKSk7CisgICAgICBmaC5zZXRMZXZlbChMZXZlbC5JTkZPKTsKKyAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGZoKTsKKyAgICB9CisgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gc2UpIHsKKyAgICAgIHNlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbnZvY2F0aW9uKFN0cmluZyByZWFzb24sIE1ldGhvZCB0aGlzTWV0aG9kLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CisgICAgU3RyaW5nIGNsc05hbWUgPSB0aGlzTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpOworICAgIGludCBuID0gY2xzTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgIGlmIChuID49IDApIHsKKyAgICAgIGNsc05hbWUgPSBjbHNOYW1lLnN1YnN0cmluZyhuICsgMSk7CisgICAgfQorICAgIFN0cmluZyBtZXRob2ROYW1lID0gY2xzTmFtZSArICcuJyArIHRoaXNNZXRob2QuZ2V0TmFtZSgpOworICAgIGlmIChUZXN0UnVubmVyLmdldFZlcmJvc2UoKSA+PSAyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcGFyYW1TdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoT2JqZWN0IHAgOiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgcGFyYW1TdHJpbmcuYXBwZW5kKHAudG9TdHJpbmcoKSkuYXBwZW5kKCcgJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxvZygiIiwgMiwgIkludm9raW5nICIgKyByZWFzb24gKyBtZXRob2ROYW1lICsgJygnICsgcGFyYW1TdHJpbmcgKyAnKScpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVJlc291cmNlVG9GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gY2xhc3opIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBjbGFzei5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvIiArIHJlc291cmNlTmFtZSk7CisgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGRuJ3QgZmluZCByZXNvdXJjZSBvbiB0aGUgY2xhc3MgcGF0aDogIiArIHJlc291cmNlTmFtZSk7CisvLyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc291cmNlIGRvZXMgbm90IGV4aXN0OiAiICsgcmVzb3VyY2VOYW1lKTsKKyAgICB9CisKKyAgICBlbHNlIHsKKworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpbnQgbnJlYWQ7CisgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICAgIHdoaWxlICgwIDwgKG5yZWFkID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSkgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbnJlYWQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0SWZTdHJpbmdFbXB0eShTdHJpbmcgcywgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgIHJldHVybiBpc1N0cmluZ0VtcHR5KHMpID8gZGVmYXVsdFZhbHVlIDogczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmluZ0JsYW5rKFN0cmluZyBzKSB7CisgICAgcmV0dXJuIHMgPT0gbnVsbCB8fCAiIi5lcXVhbHMocy50cmltKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RyaW5nRW1wdHkoU3RyaW5nIHMpIHsKKyAgICByZXR1cm4gcyA9PSBudWxsIHx8ICIiLmVxdWFscyhzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmluZ05vdEJsYW5rKFN0cmluZyBzKSB7CisgICAgcmV0dXJuICFpc1N0cmluZ0JsYW5rKHMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RyaW5nTm90RW1wdHkoU3RyaW5nIHMpIHsKKyAgICByZXR1cm4gIWlzU3RyaW5nRW1wdHkocyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbiBhcnJheSBvZiB0d28gc3RyaW5nczogdGhlIHNob3J0IHN0YWNrIHRyYWNlIGFuZCB0aGUgbG9uZyBzdGFjayB0cmFjZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3RhY2tUcmFjZShUaHJvd2FibGUgdCwgYm9vbGVhbiB0b0h0bWwpIHsKKyAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICBwdy5mbHVzaCgpOworCisgICAgU3RyaW5nIGZ1bGxTdGFja1RyYWNlID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgc2hvcnRTdGFja1RyYWNlOworCisgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihUZXN0TkcuU0hPV19URVNUTkdfU1RBQ0tfRlJBTUVTKSB8fCBUZXN0UnVubmVyLmdldFZlcmJvc2UoKSA+PSAyKSB7CisgICAgICBzaG9ydFN0YWNrVHJhY2UgPSBmdWxsU3RhY2tUcmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgc2hvcnRTdGFja1RyYWNlID0gZmlsdGVyVHJhY2Uoc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKHRvSHRtbCkgeworICAgICAgc2hvcnRTdGFja1RyYWNlID0gZXNjYXBlSHRtbChzaG9ydFN0YWNrVHJhY2UpOworICAgICAgZnVsbFN0YWNrVHJhY2UgPSBlc2NhcGVIdG1sKGZ1bGxTdGFja1RyYWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc2hvcnRTdGFja1RyYWNlLCBmdWxsU3RhY2tUcmFjZQorICAgIH07CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IEVTQ0FQRVMgPSBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4oKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI4NTYwNzY2MDI0NzE1NzUyM0w7CisKKyAgeworICAgIHB1dCgnPCcsICImbHQ7Iik7CisgICAgcHV0KCc+JywgIiZndDsiKTsKKyAgICBwdXQoJ1wnJywgIiZhcG9zOyIpOworICAgIHB1dCgnIicsICImcXVvdDsiKTsKKyAgICBwdXQoJyYnLCAiJmFtcDsiKTsKKyAgfX07CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlSHRtbChTdHJpbmcgcykgeworICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgIFN0cmluZyBuYyA9IEVTQ0FQRVMuZ2V0KGMpOworICAgICAgaWYgKG5jICE9IG51bGwpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChuYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKGMpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZVVuaWNvZGUoU3RyaW5nIHMpIHsKKyAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICBjaGFyIGNhID0gKENoYXJhY3Rlci5pc0RlZmluZWQoYykpID8gYzogVU5JQ09ERV9SRVBMQUNFTUVOVDsKKyAgICAgIHJlc3VsdC5hcHBlbmQoY2EpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaWx0ZXJUcmFjZShTdHJpbmcgdHJhY2UpIHsKKyAgICBTdHJpbmdSZWFkZXIgICBzdHJpbmdSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRyYWNlKTsKKyAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihzdHJpbmdSZWFkZXIpOworICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICB0cnkgeworICAgICAgLy8gZmlyc3QgbGluZSBjb250YWlucyB0aGUgdGhyb3duIGV4Y2VwdGlvbgorICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgaWYobGluZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0KKyAgICAgIGJ1Zi5hcHBlbmQobGluZSkuYXBwZW5kKExJTkVfU0VQKTsKKworICAgICAgLy8KKyAgICAgIC8vIHRoZSBzdGFjayBmcmFtZXMgb2YgdGhlIHRyYWNlCisgICAgICAvLworICAgICAgU3RyaW5nW10gZXhjbHVkZWRTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAib3JnLnRlc3RuZyIsCisgICAgICAgICAgInJlZmxlY3QiLAorICAgICAgICAgICJvcmcuYXBhY2hlLm1hdmVuLnN1cmVmaXJlIgorICAgICAgfTsKKworICAgICAgaW50IGV4Y2x1ZGVkQ291bnQgPSAwOworICAgICAgd2hpbGUoKGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgIGJvb2xlYW4gaXNFeGNsdWRlZCA9IGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlZCA6IGV4Y2x1ZGVkU3RyaW5ncykgeworICAgICAgICAgIGlmKGxpbmUuY29udGFpbnMoZXhjbHVkZWQpKSB7CisgICAgICAgICAgICBpc0V4Y2x1ZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4Y2x1ZGVkQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgaXNFeGNsdWRlZCkgeworICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZSkuYXBwZW5kKExJTkVfU0VQKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGV4Y2x1ZGVkQ291bnQgPiAwKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoIi4uLiBSZW1vdmVkICIgKyBleGNsdWRlZENvdW50ICsgIiBzdGFjayBmcmFtZXMiKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9leCkgeworICAgICAgOyAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IG9iamVjdCwgQ2xhc3M8Pz4gb2JqZWN0Q2xhc3MpIHsKKyAgICBpZihudWxsID09IG9iamVjdCkgeworICAgICAgcmV0dXJuICJudWxsIjsKKyAgICB9CisgICAgZmluYWwgU3RyaW5nIHRvU3RyaW5nPSBvYmplY3QudG9TdHJpbmcoKTsKKyAgICBpZihpc1N0cmluZ0VtcHR5KHRvU3RyaW5nKSkgeworICAgICAgcmV0dXJuICJcIlwiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoU3RyaW5nLmNsYXNzLmVxdWFscyhvYmplY3RDbGFzcykpIHsKKyAgICAgIHJldHVybiAiXCIiICsgdG9TdHJpbmcgKyAnXCInOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiB0b1N0cmluZzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhaWxlZE1ldGhvZE5hbWUoSVRlc3ROR01ldGhvZCBtZXRob2QsIGJvb2xlYW4gZnFuKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGlmKG1ldGhvZC5pc0JlZm9yZVN1aXRlQ29uZmlndXJhdGlvbigpKSB7CisgICAgICBidWYuYXBwZW5kKCJAQmVmb3JlU3VpdGUgIik7CisgICAgfQorICAgIGVsc2UgaWYobWV0aG9kLmlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgYnVmLmFwcGVuZCgiQEJlZm9yZVRlc3QgIik7CisgICAgfQorICAgIGVsc2UgaWYobWV0aG9kLmlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIkBCZWZvcmVDbGFzcyAiKTsKKyAgICB9CisgICAgZWxzZSBpZihtZXRob2QuaXNCZWZvcmVHcm91cHNDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIkBCZWZvcmVHcm91cHMgIik7CisgICAgfQorICAgIGVsc2UgaWYobWV0aG9kLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICBidWYuYXBwZW5kKCJAQmVmb3JlTWV0aG9kICIpOworICAgIH0KKyAgICBlbHNlIGlmKG1ldGhvZC5pc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICBidWYuYXBwZW5kKCJAQWZ0ZXJNZXRob2QgIik7CisgICAgfQorICAgIGVsc2UgaWYobWV0aG9kLmlzQWZ0ZXJHcm91cHNDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIkBBZnRlckdyb3VwcyAiKTsKKyAgICB9CisgICAgZWxzZSBpZihtZXRob2QuaXNBZnRlckNsYXNzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICBidWYuYXBwZW5kKCJAQWZ0ZXJDbGFzcyAiKTsKKyAgICB9CisgICAgZWxzZSBpZihtZXRob2QuaXNBZnRlclRlc3RDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIkBBZnRlclRlc3QgIik7CisgICAgfQorICAgIGVsc2UgaWYobWV0aG9kLmlzQWZ0ZXJTdWl0ZUNvbmZpZ3VyYXRpb24oKSkgeworICAgICAgYnVmLmFwcGVuZCgiQEFmdGVyU3VpdGUgIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zi5hcHBlbmQoZnFuID8gbWV0aG9kLnRvU3RyaW5nKCkgOiBtZXRob2QuZ2V0TWV0aG9kTmFtZSgpKS50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXJyYXlUb1N0cmluZyhTdHJpbmdbXSBzdHJpbmdzKSB7CisgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgIGlmICgoc3RyaW5ncyAhPSBudWxsKSAmJiAoc3RyaW5ncy5sZW5ndGggPiAwKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nc1tpXSk7CisgICAgICAgIGlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICAvKioKKyAgICogSWYgdGhlIGZpbGUgbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSAqLC8sXCBhbmQgc28gb24sCisgICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBhbmQgcmVwb3J0IGZpbGUgd2lsbCBub3QgYmUgY3JlYXRlZC48YnI+CisgICAqIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgcGxhdGZvcm0gc3BlY2lmaWMgYW5kIHRoZXkgYXJlIG5vdCBzYW1lIGZvcgorICAgKiBleGFtcGxlIG9uIFdpbmRvd3MgYW5kIE1hY2ludG9zaC4gKiBpcyBub3QgYWxsb3dlZCBvbiBXaW5kb3dzLCBidXQgaXQgaXMgb24gTWFjaW50b3NoLjxicj4KKyAgICogSW4gb3JkZXIgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBvZiB0ZXN0bmcgb24gdGhlIGFsbCBwbGF0Zm9ybXMsIGNoYXJhY3RlcnMgbGlrZSAqIHdpbGwKKyAgICogYmUgcmVwbGFjZWQgb24gYWxsIHBsYXRmb3JtcyB3aGV0aGVyIHRoZXkgYXJlIGNhdXNpbmcgdGhlIHByb2JsZW0gb3Igbm90LgorICAgKgorICAgKiBAcGFyYW0gZmlsZU5hbWUgZmlsZSBuYW1lIHRoYXQgY291bGQgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICAqIEByZXR1cm4gZmlsZU5hbWUgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgcmVwbGFjZWQKKyAgICogQGF1dGhvciBCb3JvamV2aWMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VTcGVjaWFsQ2hhcmFjdGVycyhTdHJpbmcgZmlsZU5hbWUpIHsKKyAgIGlmIChmaWxlTmFtZSA9PSBudWxsIHx8IGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgfQorICAgZm9yIChjaGFyIGVsZW1lbnQgOiBTUEVDSUFMX0NIQVJBQ1RFUlMpIHsKKyAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKGVsZW1lbnQsIENIQVJfUkVQTEFDRU1FTlQpOworICAgfQorCisgICByZXR1cm4gZmlsZU5hbWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgam9pbihMaXN0PFQ+IG9iamVjdHMsIFN0cmluZyBzZXBhcmF0b3IpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgfQorICAgICAgcmVzdWx0LmFwcGVuZChvYmplY3RzLmdldChpKS50b1N0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKEZpbGUgZnJvbSwgRmlsZSB0bykgeworICAgIHRvLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICB0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmcm9tKTsgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKSkgeworICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgaW50IGxlbjsKKyAgICAgIHdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKKyAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhIHRlbXBvcmFyeSBmaWxlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuCisgICAqLworICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICB0cnkgeworICAgICAgLy8gQ3JlYXRlIHRlbXAgZmlsZS4KKyAgICAgIEZpbGUgcmVzdWx0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdG5nLXRtcCIsICIiKTsKKworICAgICAgLy8gRGVsZXRlIHRlbXAgZmlsZSB3aGVuIHByb2dyYW0gZXhpdHMuCisgICAgICByZXN1bHQuZGVsZXRlT25FeGl0KCk7CisKKyAgICAgIC8vIFdyaXRlIHRvIHRlbXAgZmlsZQorICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHJlc3VsdCkpOworICAgICAgb3V0LndyaXRlKGNvbnRlbnQpOworICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTWFrZSBzdXJlIHRoYXQgZWl0aGVyIHdlIGhhdmUgYW4gaW5zdGFuY2Ugb3IgaWYgbm90LCB0aGF0IHRoZSBtZXRob2QgaXMgc3RhdGljCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tJbnN0YW5jZU9yU3RhdGljKE9iamVjdCBpbnN0YW5jZSwgTWV0aG9kIG1ldGhvZCkgeworICAgIGlmIChpbnN0YW5jZSA9PSBudWxsICYmIG1ldGhvZCAhPSBudWxsICYmICEgTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2FuJ3QgaW52b2tlICIgKyBtZXRob2QgKyAiOiBlaXRoZXIgbWFrZSBpdCBzdGF0aWMgb3IgYWRkICIKKyAgICAgICAgICArICJhIG5vLWFyZ3MgY29uc3RydWN0b3IgdG8geW91ciBjbGFzcyIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1JldHVyblR5cGUoTWV0aG9kIG1ldGhvZCwgQ2xhc3M8Pz4uLi4gcmV0dXJuVHlwZXMpIHsKKyAgICBpZiAobWV0aG9kID09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChDbGFzczw/PiByZXR1cm5UeXBlIDogcmV0dXJuVHlwZXMpIHsKKyAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IHJldHVyblR5cGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIgorICAgICAgICAgICAgICArIG1ldGhvZC5nZXROYW1lKCkgKyAiIE1VU1QgcmV0dXJuICIgKyB0b1N0cmluZyhyZXR1cm5UeXBlcykgKyAiIGJ1dCByZXR1cm5zICIgKyBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQ2xhc3M8Pz5bXSBjbGFzc2VzKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbICIpOworICAgIGZvciAoaW50IGk9MDsgaTxjbGFzc2VzLmxlbmd0aDspIHsKKyAgICAgIENsYXNzPD8+IGNsYXp6ID0gY2xhc3Nlc1tpXTsKKyAgICAgIGlmIChjbGF6ei5pc0FycmF5KCkpIHsKKyAgICAgICAgc2IuYXBwZW5kKGNsYXp6LmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCkpLmFwcGVuZCgiW10iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZChjbGF6ei5nZXROYW1lKCkpOworICAgICAgfQorICAgICAgaWYgKCsraSA8IGNsYXNzZXMubGVuZ3RoKSB7IC8vIGluY3JlbWVudCBhbmQgY29tcGFyZQorICAgICAgICBzYi5hcHBlbmQoIiBvciAiKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCIgXSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCwgdHJhbnNwYXJlbnRseQorICAgKiBoYW5kbGluZyBudWxsIHJlZmVyZW5jZXMgYW5kIGFycmF5cy4KKyAgICoKKyAgICogQHBhcmFtIG9iagorICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QKKyAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPYmplY3Qgb2JqKSB7CisgICAgU3RyaW5nIHJlc3VsdDsKKyAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBib29sZWFuW10pIHsKKyAgICAgICAgcmVzdWx0ID0gQXJyYXlzLnRvU3RyaW5nKChib29sZWFuW10pIG9iaik7CisgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICByZXN1bHQgPSBBcnJheXMudG9TdHJpbmcoKGJ5dGVbXSkgb2JqKTsKKyAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICAgIHJlc3VsdCA9IEFycmF5cy50b1N0cmluZygoY2hhcltdKSBvYmopOworICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBkb3VibGVbXSkgeworICAgICAgICByZXN1bHQgPSBBcnJheXMudG9TdHJpbmcoKGRvdWJsZVtdKSBvYmopOworICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBmbG9hdFtdKSB7CisgICAgICAgIHJlc3VsdCA9IEFycmF5cy50b1N0cmluZygoZmxvYXRbXSkgb2JqKTsKKyAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgaW50W10pIHsKKyAgICAgICAgcmVzdWx0ID0gQXJyYXlzLnRvU3RyaW5nKChpbnRbXSkgb2JqKTsKKyAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgbG9uZ1tdKSB7CisgICAgICAgIHJlc3VsdCA9IEFycmF5cy50b1N0cmluZygobG9uZ1tdKSBvYmopOworICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICByZXN1bHQgPSBBcnJheXMuZGVlcFRvU3RyaW5nKChPYmplY3RbXSkgb2JqKTsKKyAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2Ygc2hvcnRbXSkgeworICAgICAgICByZXN1bHQgPSBBcnJheXMudG9TdHJpbmcoKHNob3J0W10pIG9iaik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBvYmoudG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gIm51bGwiOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvWG1sTWV0aG9kU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9YbWxNZXRob2RTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzZjY0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvWG1sTWV0aG9kU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDM4NSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yQ29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBkZWZhdWx0IG1ldGhvZCBzZWxlY3RvciB1c2VkIGJ5IFRlc3RORyB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG1ldGhvZHMgbmVlZCB0byBiZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgYmFzZWQgb24gdGhlIHNwZWNpZmljYXRpb24KKyAqIGdpdmVuIGluIHRlc3RuZy54bWwuCisgKgorICogQ3JlYXRlZCBvbiBTZXAgMzAsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxNZXRob2RTZWxlY3RvciBpbXBsZW1lbnRzIElNZXRob2RTZWxlY3RvciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDMwNTQ4MTc4MDI1NjA1NjI5TDsKKworICAvLyBHcm91cHMgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGZvciB0aGlzIHJ1bgorICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9pbmNsdWRlZEdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9leGNsdWRlZEdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIExpc3Q8WG1sQ2xhc3M+IG1fY2xhc3NlcyA9IG51bGw7CisgIC8vIFRoZSBCZWFuU2hlbGwgZXhwcmVzc2lvbiBmb3IgdGhpcyB0ZXN0LCBpZiBhbnkKKyAgcHJpdmF0ZSBTdHJpbmcgbV9leHByZXNzaW9uID0gbnVsbDsKKyAgLy8gTGlzdCBvZiBtZXRob2RzIGluY2x1ZGVkIGltcGxpY2l0bHkKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8U3RyaW5nLCBYbWxJbmNsdWRlPiBtX2luY2x1ZGVkTWV0aG9kcyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgIHByaXZhdGUgSUJzaCBtX2JzaCA9IER5bmFtaWMuaGFzQnNoKCkgPyBuZXcgQnNoKCkgOiBuZXcgQnNoTW9jaygpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlTWV0aG9kKElNZXRob2RTZWxlY3RvckNvbnRleHQgY29udGV4dCwKKyAgICAgIElUZXN0TkdNZXRob2QgdG0sIGJvb2xlYW4gaXNUZXN0TWV0aG9kKQorICB7CisvLyAgICBwcHAoIlhNTCBNRVRIT0QgU0VMRUNUT1IgIiArIHRtICsgIiAiICsgbV9pc0luaXRpYWxpemVkKTsKKworICAgIGlmICghIG1faXNJbml0aWFsaXplZCkgeworICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIGluaXQoY29udGV4dCk7CisgICAgfQorCisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAobnVsbCAhPSBtX2V4cHJlc3Npb24pIHsKKyAgICAgIHJldHVybiBtX2JzaC5pbmNsdWRlTWV0aG9kRnJvbUV4cHJlc3Npb24obV9leHByZXNzaW9uLCB0bSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzdWx0ID0gaW5jbHVkZU1ldGhvZEZyb21JbmNsdWRlRXhjbHVkZSh0bSwgaXNUZXN0TWV0aG9kKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVNZXRob2RGcm9tSW5jbHVkZUV4Y2x1ZGUoSVRlc3ROR01ldGhvZCB0bSwgYm9vbGVhbiBpc1Rlc3RNZXRob2QpIHsKKyAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgIE1ldGhvZCBtID0gdG0uZ2V0TWV0aG9kKCk7CisgICAgU3RyaW5nW10gZ3JvdXBzID0gdG0uZ2V0R3JvdXBzKCk7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZEdyb3VwcyA9IG1faW5jbHVkZWRHcm91cHM7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBleGNsdWRlZEdyb3VwcyA9IG1fZXhjbHVkZWRHcm91cHM7CisgICAgTGlzdDxYbWxJbmNsdWRlPiBpbmNsdWRlTGlzdCA9CisgICAgICAgIG1faW5jbHVkZWRNZXRob2RzLmdldChNZXRob2RIZWxwZXIuY2FsY3VsYXRlTWV0aG9kQ2Fub25pY2FsTmFtZSh0bSkpOworCisgICAgLy8KKyAgICAvLyBObyBncm91cHMgd2VyZSBzcGVjaWZpZWQ6CisgICAgLy8KKyAgICBpZiAoaW5jbHVkZWRHcm91cHMuc2l6ZSgpID09IDAgJiYgZXhjbHVkZWRHcm91cHMuc2l6ZSgpID09IDAKKyAgICAgICAgJiYgISBoYXNJbmNsdWRlZE1ldGhvZHMoKSAmJiAhIGhhc0V4Y2x1ZGVkTWV0aG9kcygpKQorICAgIC8vCisgICAgLy8gSWYgd2UgZG9uJ3QgaW5jbHVkZSBvciBleGNsdWRlIGFueSBtZXRob2RzLCBtZXRob2QgaXMgaW4KKyAgICAvLworICAgIHsKKyAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorICAgIC8vCisgICAgLy8gSWYgaXQncyBhIGNvbmZpZ3VyYXRpb24gbWV0aG9kIGFuZCBubyBncm91cHMgd2VyZSByZXF1ZXN0ZWQsIHdlIHdhbnQgaXQgaW4KKyAgICAvLworICAgIGVsc2UgaWYgKGluY2x1ZGVkR3JvdXBzLnNpemUoKSA9PSAwICYmIGV4Y2x1ZGVkR3JvdXBzLnNpemUoKSA9PSAwICYmICEgaXNUZXN0TWV0aG9kKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBJcyB0aGlzIG1ldGhvZCBpbmNsdWRlZCBpbXBsaWNpdGx5PworICAgIC8vCisgICAgZWxzZSBpZiAoaW5jbHVkZUxpc3QgIT0gbnVsbCkgeworICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEluY2x1ZGUgb3IgRXhjbHVkZSBncm91cHMgd2VyZSBzcGVjaWZpZWQ6CisgICAgLy8KKyAgICBlbHNlIHsKKyAgICAgIC8vCisgICAgICAvLyBPbmx5IGFkZCB0aGlzIG1ldGhvZCBpZiBpdCBiZWxvbmdzIHRvIGFuIGluY2x1ZGVkIGdyb3VwIGFuZCBub3QKKyAgICAgIC8vIHRvIGFuIGV4Y2x1ZGVkIGdyb3VwCisgICAgICAvLworICAgICAgeworICAgICAgICBib29sZWFuIGlzSW5jbHVkZWRJbkdyb3VwcyA9IGlzSW5jbHVkZWQoZ3JvdXBzLCBtX2luY2x1ZGVkR3JvdXBzLnZhbHVlcygpKTsKKyAgICAgICAgYm9vbGVhbiBpc0V4Y2x1ZGVkSW5Hcm91cHMgPSBpc0V4Y2x1ZGVkKGdyb3VwcywgbV9leGNsdWRlZEdyb3Vwcy52YWx1ZXMoKSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBydW4gbWV0aG9kcyBieSBncm91cHMgZmlyc3QKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGlzSW5jbHVkZWRJbkdyb3VwcyAmJiAhaXNFeGNsdWRlZEluR3JvdXBzKSB7CisgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc0V4Y2x1ZGVkSW5Hcm91cHMpIHsKKyAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZihpc1Rlc3RNZXRob2QpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93IGZpbHRlciBieSBtZXRob2QgbmFtZQorICAgICAgICAvLworICAgICAgICBNZXRob2QgbWV0aG9kID0gdG0uZ2V0TWV0aG9kKCk7CisgICAgICAgIENsYXNzIG1ldGhvZENsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIFN0cmluZyBmdWxsTWV0aG9kTmFtZSA9ICBtZXRob2RDbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICIuIgorICAgICAgICAgICAgICAgICsgbWV0aG9kLmdldE5hbWUoKTsKKworICAgICAgICBTdHJpbmdbXSBmdWxseVF1YWxpZmllZE1ldGhvZE5hbWUgPSBuZXcgU3RyaW5nW10geyBmdWxsTWV0aG9kTmFtZSB9OworCisgICAgICAgIC8vCisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGNsYXNzZXMgc28gd2UgY2FuIGdhdGhlciBhbGwgdGhlIGluY2x1ZGVkIGFuZAorICAgICAgICAvLyBleGNsdWRlZCBtZXRob2RzCisgICAgICAgIC8vCisgICAgICAgIGZvciAoWG1sQ2xhc3MgeG1sQ2xhc3MgOiBtX2NsYXNzZXMpIHsKKyAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGluY2x1ZGVkL2V4Y2x1ZGVkIG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgY2xhc3MKKyAgICAgICAgICAvLyB3ZSBhcmUgbG9va2luZyBhdAorICAgICAgICAgIENsYXNzIGNscyA9IHhtbENsYXNzLmdldFN1cHBvcnRDbGFzcygpOworICAgICAgICAgIGlmKCFhc3NpZ25hYmxlKG1ldGhvZENsYXNzLCBjbHMpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBMaXN0PFN0cmluZz4gaW5jbHVkZWRNZXRob2RzID0KKyAgICAgICAgICAgICAgY3JlYXRlUXVhbGlmaWVkTWV0aG9kTmFtZXMoeG1sQ2xhc3MsIHRvU3RyaW5nTGlzdCh4bWxDbGFzcy5nZXRJbmNsdWRlZE1ldGhvZHMoKSkpOworICAgICAgICAgIGJvb2xlYW4gaXNJbmNsdWRlZEluTWV0aG9kcyA9IGlzSW5jbHVkZWQoZnVsbHlRdWFsaWZpZWRNZXRob2ROYW1lLCBpbmNsdWRlZE1ldGhvZHMpOworICAgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlZE1ldGhvZHMgPSBjcmVhdGVRdWFsaWZpZWRNZXRob2ROYW1lcyh4bWxDbGFzcywKKyAgICAgICAgICAgICAgeG1sQ2xhc3MuZ2V0RXhjbHVkZWRNZXRob2RzKCkpOworICAgICAgICAgIGJvb2xlYW4gaXNFeGNsdWRlZEluTWV0aG9kcyA9IGlzRXhjbHVkZWQoZnVsbHlRdWFsaWZpZWRNZXRob2ROYW1lLCBleGNsdWRlZE1ldGhvZHMpOworICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIGluY2x1ZGUgdGhpcyBtZXRob2QgYnkgZ3JvdXAsIG1ha2Ugc3VyZQorICAgICAgICAgICAgLy8gaXQncyBpbmNsdWRlZCBieSBtZXRob2QgYW5kIG5vdCBleGNsdWRlZCBieSBtZXRob2QKKyAgICAgICAgICAgIHJlc3VsdCA9IGlzSW5jbHVkZWRJbk1ldGhvZHMgJiYgISBpc0V4Y2x1ZGVkSW5NZXRob2RzOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBvdGhlcndpc2UgaXQncyBhbHJlYWR5IGV4Y2x1ZGVkIGFuZCBub3RoaW5nIHdpbGwgYnJpbmcgaXQgYmFjaywKKyAgICAgICAgICAvLyBzaW5jZSBleGNsdXNpb25zIHByZWVtcHQgaW5jbHVzaW9ucworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgUGFja2FnZSBwa2cgPSBtLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0UGFja2FnZSgpOworICAgIFN0cmluZyBtZXRob2ROYW1lID0gcGtnICE9IG51bGwgPyBwa2cuZ2V0TmFtZSgpICsgIi4iICsgbS5nZXROYW1lKCkgOiBtLmdldE5hbWUoKTsKKworICAgIGxvZ0luY2x1c2lvbihyZXN1bHQgPyAiSW5jbHVkaW5nIiA6ICJFeGNsdWRpbmciLCAibWV0aG9kIiwgbWV0aG9kTmFtZSArICIoKSIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgIHByaXZhdGUgYm9vbGVhbiBhc3NpZ25hYmxlKENsYXNzIHNvdXJjZUNsYXNzLCBDbGFzcyB0YXJnZXRDbGFzcykgeworICAgIHJldHVybiBzb3VyY2VDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSB8fCB0YXJnZXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNvdXJjZUNsYXNzKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX2xvZ2dlZCA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIHZvaWQgbG9nSW5jbHVzaW9uKFN0cmluZyBpbmNsdWRpbmcsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgIGlmICghIG1fbG9nZ2VkLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICBsb2coNCwgaW5jbHVkaW5nICsgIiAiICsgdHlwZSArICIgIiArIG5hbWUpOworICAgICAgbV9sb2dnZWQucHV0KG5hbWUsIG5hbWUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBoYXNJbmNsdWRlZE1ldGhvZHMoKSB7CisgICAgZm9yIChYbWxDbGFzcyB4bWxDbGFzcyA6IG1fY2xhc3NlcykgeworICAgICAgaWYgKHhtbENsYXNzLmdldEluY2x1ZGVkTWV0aG9kcygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0V4Y2x1ZGVkTWV0aG9kcygpIHsKKyAgICBmb3IgKFhtbENsYXNzIHhtbENsYXNzIDogbV9jbGFzc2VzKSB7CisgICAgICBpZiAoeG1sQ2xhc3MuZ2V0RXhjbHVkZWRNZXRob2RzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiB0b1N0cmluZ0xpc3QoTGlzdDxYbWxJbmNsdWRlPiBtZXRob2RzKSB7CisgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoWG1sSW5jbHVkZSBtIDogbWV0aG9kcykgeworICAgICAgcmVzdWx0LmFkZChtLmdldE5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjcmVhdGVRdWFsaWZpZWRNZXRob2ROYW1lcyhYbWxDbGFzcyB4bWxDbGFzcywKKyAgICAgIExpc3Q8U3RyaW5nPiBtZXRob2RzKSB7CisgICAgTGlzdDxTdHJpbmc+IHZSZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBDbGFzcyBjbHMgPSB4bWxDbGFzcy5nZXRTdXBwb3J0Q2xhc3MoKTsKKworICAgIHdoaWxlIChudWxsICE9IGNscykgeworICAgICAgZm9yIChTdHJpbmcgaW0gOiBtZXRob2RzKSB7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gaW07CisgICAgICAgIE1ldGhvZFtdIGFsbE1ldGhvZHMgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShtZXRob2ROYW1lKTsKKyAgICAgICAgZm9yIChNZXRob2QgbSA6IGFsbE1ldGhvZHMpIHsKKyAgICAgICAgICBpZiAocGF0dGVybi5tYXRjaGVyKG0uZ2V0TmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgIHZSZXN1bHQuYWRkKG1ha2VNZXRob2ROYW1lKGNscy5nZXROYW1lKCksIG0uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOworICAgIH0KKworICAgIHJldHVybiB2UmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbWFrZU1ldGhvZE5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICByZXR1cm4gY2xhc3NOYW1lICsgIi4iICsgbWV0aG9kTmFtZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja01ldGhvZChDbGFzczw/PiBjLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZShtZXRob2ROYW1lKTsKKyAgICBmb3IgKE1ldGhvZCBtIDogYy5nZXRNZXRob2RzKCkpIHsKKyAgICAgIGlmIChwLm1hdGNoZXIobS5nZXROYW1lKCkpLm1hdGNoZXMoKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIFV0aWxzLmxvZygiV2FybmluZyIsIDIsICJUaGUgcmVndWxhciBleHByZXNzaW9uIFwiIiArIG1ldGhvZE5hbWUgKyAiXCIgZGlkbid0IG1hdGNoIGFueSIgKworICAgICAgICAgICAgICAiIG1ldGhvZCBpbiBjbGFzcyAiICsgYy5nZXROYW1lKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0WG1sQ2xhc3NlcyhMaXN0PFhtbENsYXNzPiBjbGFzc2VzKSB7CisgICAgbV9jbGFzc2VzID0gY2xhc3NlczsKKyAgICBmb3IgKFhtbENsYXNzIGMgOiBjbGFzc2VzKSB7CisgICAgICBmb3IgKFhtbEluY2x1ZGUgbSA6IGMuZ2V0SW5jbHVkZWRNZXRob2RzKCkpIHsKKyAgICAgICAgY2hlY2tNZXRob2QoYy5nZXRTdXBwb3J0Q2xhc3MoKSwgbS5nZXROYW1lKCkpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ha2VNZXRob2ROYW1lKGMuZ2V0TmFtZSgpLCBtLmdldE5hbWUoKSk7CisgICAgICAgIG1faW5jbHVkZWRNZXRob2RzLnB1dChtZXRob2ROYW1lLCBtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBleGNsdWRlZEdyb3Vwcy4KKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEV4Y2x1ZGVkR3JvdXBzKCkgeworICAgIHJldHVybiBtX2V4Y2x1ZGVkR3JvdXBzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5jbHVkZWRHcm91cHMuCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbmNsdWRlZEdyb3VwcygpIHsKKyAgICByZXR1cm4gbV9pbmNsdWRlZEdyb3VwczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZXhjbHVkZWRHcm91cHMgVGhlIGV4Y2x1ZGVkR3JvdXBzIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkR3JvdXBzKE1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZWRHcm91cHMpIHsKKyAgICBtX2V4Y2x1ZGVkR3JvdXBzID0gZXhjbHVkZWRHcm91cHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGluY2x1ZGVkR3JvdXBzIFRoZSBpbmNsdWRlZEdyb3VwcyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlZEdyb3VwcyhNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkR3JvdXBzKSB7CisgICAgbV9pbmNsdWRlZEdyb3VwcyA9IGluY2x1ZGVkR3JvdXBzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luY2x1ZGVkKFN0cmluZ1tdIGdyb3VwcywgQ29sbGVjdGlvbjxTdHJpbmc+IGluY2x1ZGVkR3JvdXBzKSB7CisgICAgaWYgKGluY2x1ZGVkR3JvdXBzLnNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gaXNNZW1iZXJPZihncm91cHMsIGluY2x1ZGVkR3JvdXBzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nW10gZ3JvdXBzLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhjbHVkZWRHcm91cHMpIHsKKyAgICByZXR1cm4gaXNNZW1iZXJPZihncm91cHMsIGV4Y2x1ZGVkR3JvdXBzKTsKKyAgfQorCisgIC8qKgorICAgKgorICAgKiBAcGFyYW0gZ3JvdXBzIEFycmF5IG9mIGdyb3VwcyBvbiB0aGUgbWV0aG9kCisgICAqIEBwYXJhbSBsaXN0IE1hcCBvZiByZWdleHBzIG9mIGdyb3VwcyB0byBiZSBydW4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNZW1iZXJPZihTdHJpbmdbXSBncm91cHMsIENvbGxlY3Rpb248U3RyaW5nPiBsaXN0KSB7CisgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsKKyAgICAgIGZvciAoT2JqZWN0IG8gOiBsaXN0KSB7CisgICAgICAgIFN0cmluZyByZWdleHBTdHIgPSBvLnRvU3RyaW5nKCk7CisgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBQYXR0ZXJuLm1hdGNoZXMocmVnZXhwU3RyLCBncm91cCk7CisgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgcykgeworICAgIFV0aWxzLmxvZygiWG1sTWV0aG9kU2VsZWN0b3IiLCBsZXZlbCwgcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1htbE1ldGhvZFNlbGVjdG9yXSAiICsgcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgbV9leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgcHJpdmF0ZSBMaXN0PElUZXN0TkdNZXRob2Q+IG1fdGVzdE1ldGhvZHMgPSBudWxsOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUZXN0TWV0aG9kcyhMaXN0PElUZXN0TkdNZXRob2Q+IHRlc3RNZXRob2RzKSB7CisgICAgLy8gQ2F1dGlvbjogdGhpcyB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IGxpc3QgZmlyc3QgYW5kIHRoZW4gbW9kaWZpZWQKKyAgICAvLyBleHRlcm5hbGx5IGJ5IHRoZSBjYWxsZXIgKFRlc3RSdW5uZXIjZml4TWV0aG9kV2l0aENsYXNzKS4gVWdseS4KKyAgICBtX3Rlc3RNZXRob2RzID0gdGVzdE1ldGhvZHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChJTWV0aG9kU2VsZWN0b3JDb250ZXh0IGNvbnRleHQpIHsKKyAgICBTdHJpbmdbXSBncm91cHMgPSBtX2luY2x1ZGVkR3JvdXBzLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1ttX2luY2x1ZGVkR3JvdXBzLnNpemUoKV0pOworICAgIFNldDxTdHJpbmc+IGdyb3VwQ2xvc3VyZSA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBTZXQ8SVRlc3ROR01ldGhvZD4gbWV0aG9kQ2xvc3VyZSA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gaW5jbHVkZWRNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtX3Rlc3RNZXRob2RzKSB7CisgICAgICBpZiAoaW5jbHVkZU1ldGhvZChjb250ZXh0LCBtLCB0cnVlKSkgeworICAgICAgICBpbmNsdWRlZE1ldGhvZHMuYWRkKG0pOworICAgICAgfQorICAgIH0KKyAgICBNZXRob2RHcm91cHNIZWxwZXIuZmluZEdyb3VwVHJhbnNpdGl2ZUNsb3N1cmUodGhpcywgaW5jbHVkZWRNZXRob2RzLCBtX3Rlc3RNZXRob2RzLAorICAgICAgICBncm91cHMsIGdyb3VwQ2xvc3VyZSwgbWV0aG9kQ2xvc3VyZSk7CisKKyAgICAvLyBJZiB3ZSBhcmUgYXNrZWQgdG8gaW5jbHVkZSBvciBleGNsdWRlIHNwZWNpZmljIGdyb3VwcywgY2FsY3VsYXRlCisgICAgLy8gdGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgdGhlIGluY2x1ZGVkIGdyb3Vwcy4gIElmIG5vIGluY2x1ZGUgZ3JvdXBzCisgICAgLy8gd2VyZSBzcGVjaWZpZWQsIGRvbid0IGRvIGFueXRoaW5nLgorICAgIC8vIEFueSBncm91cCB0aGF0IGlzIHBhcnQgb2YgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBidXQgbm90IHBhcnQgb2YKKyAgICAvLyBtX2luY2x1ZGVkR3JvdXBzIGlzIGJlaW5nIGFkZGVkIGltcGxpY2l0bHkgYnkgVGVzdE5HIHNvIHRoYXQgaWYgc29tZW9uZQorICAgIC8vIGluY2x1ZGVzIGEgZ3JvdXAgeiB0aGF0IGRlcGVuZHMgb24gYSwgYiBhbmQgYywgdGhleSBkb24ndCBuZWVkIHRvCisgICAgLy8gaW5jbHVkZSBhLCBiIGFuZCBjIGV4cGxpY2l0bHkuCisgICAgaWYgKG1faW5jbHVkZWRHcm91cHMuc2l6ZSgpID4gMCkgeworICAgICAgLy8gTWFrZSB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG91ciBuZXcgaW5jbHVkZWQgZ3JvdXBzCisgICAgICBmb3IgKFN0cmluZyBnIDogZ3JvdXBDbG9zdXJlKSB7CisgICAgICAgIGxvZyg0LCAiSW5jbHVkaW5nIGdyb3VwICIKKyAgICAgICAgICAgICsgKG1faW5jbHVkZWRHcm91cHMuY29udGFpbnNLZXkoZykgPworICAgICAgICAgICAgICAgICI6ICIgOiAiKGltcGxpY2l0bHkpOiAiKSArIGcpOworICAgICAgICBtX2luY2x1ZGVkR3JvdXBzLnB1dChnLCBnKTsKKyAgICAgIH0KKworICAgICAgLy8gTWFrZSB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG91ciBuZXcgaW5jbHVkZWQgbWV0aG9kcworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtZXRob2RDbG9zdXJlKSB7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0KKyAgICAgICAgIG0uZ2V0TWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyBtLmdldE1ldGhvZE5hbWUoKTsKKy8vICAgICAgICBtX2luY2x1ZGVkTWV0aG9kcy5hZGQobWV0aG9kTmFtZSk7CisgICAgICAgIExpc3Q8WG1sSW5jbHVkZT4gaW5jbHVkZUxpc3QgPSBtX2luY2x1ZGVkTWV0aG9kcy5nZXQobWV0aG9kTmFtZSk7CisgICAgICAgIFhtbEluY2x1ZGUgeGkgPSBuZXcgWG1sSW5jbHVkZShtZXRob2ROYW1lKTsKKyAgICAgICAgLy8gVE9ETzogc2V0IHRoZSBYbWxDbGFzcyBvbiB0aGlzIHhpIG9yIHdlIHdvbid0IGdldCBpbmhlcml0YW5jZSBvZiBwYXJhbWV0ZXJzCisgICAgICAgIG1faW5jbHVkZWRNZXRob2RzLnB1dChtZXRob2ROYW1lLCB4aSk7CisgICAgICAgIGxvZ0luY2x1c2lvbigiSW5jbHVkaW5nIiwgIm1ldGhvZCAiLCBtZXRob2ROYW1lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9ZYW1sLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvWWFtbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWNkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvWWFtbC5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxJbmNsdWRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFBhY2thZ2U7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuVHlwZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwubm9kZXMuTm9kZTsKK2ltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwubm9kZXMuTm9kZUlkOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ub2Rlcy5TY2FsYXJOb2RlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBZQU1MIHN1cHBvcnQgZm9yIFRlc3RORy4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworcHVibGljIGNsYXNzIFlhbWwgeworCisgIHB1YmxpYyBzdGF0aWMgWG1sU3VpdGUgcGFyc2UoU3RyaW5nIGZpbGVQYXRoLCBJbnB1dFN0cmVhbSBpcykKKyAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbmV3IFRlc3ROR0NvbnN0cnVjdG9yKFhtbFN1aXRlLmNsYXNzKTsKKyAgICB7CisgICAgICBUeXBlRGVzY3JpcHRpb24gc3VpdGVEZXNjcmlwdGlvbiA9IG5ldyBUeXBlRGVzY3JpcHRpb24oWG1sU3VpdGUuY2xhc3MpOworICAgICAgc3VpdGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJwYWNrYWdlcyIsIFhtbFBhY2thZ2UuY2xhc3MpOworICAgICAgc3VpdGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJsaXN0ZW5lcnMiLCBTdHJpbmcuY2xhc3MpOworICAgICAgc3VpdGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJ0ZXN0cyIsIFhtbFRlc3QuY2xhc3MpOworICAgICAgc3VpdGVEZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJtZXRob2Qtc2VsZWN0b3JzIiwgWG1sTWV0aG9kU2VsZWN0b3IuY2xhc3MpOworICAgICAgY29uc3RydWN0b3IuYWRkVHlwZURlc2NyaXB0aW9uKHN1aXRlRGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHsKKyAgICAgIFR5cGVEZXNjcmlwdGlvbiB0ZXN0RGVzY3JpcHRpb24gPSBuZXcgVHlwZURlc2NyaXB0aW9uKFhtbFRlc3QuY2xhc3MpOworICAgICAgdGVzdERlc2NyaXB0aW9uLnB1dExpc3RQcm9wZXJ0eVR5cGUoImNsYXNzZXMiLCBYbWxDbGFzcy5jbGFzcyk7CisgICAgICB0ZXN0RGVzY3JpcHRpb24ucHV0TWFwUHJvcGVydHlUeXBlKCJtZXRhR3JvdXBzIiwgU3RyaW5nLmNsYXNzLCBMaXN0LmNsYXNzKTsKKyAgICAgIHRlc3REZXNjcmlwdGlvbi5wdXRMaXN0UHJvcGVydHlUeXBlKCJtZXRob2Qtc2VsZWN0b3JzIiwgWG1sTWV0aG9kU2VsZWN0b3IuY2xhc3MpOworICAgICAgY29uc3RydWN0b3IuYWRkVHlwZURlc2NyaXB0aW9uKHRlc3REZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgb3JnLnlhbWwuc25ha2V5YW1sLllhbWwgeSA9IG5ldyBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbChjb25zdHJ1Y3Rvcik7CisgICAgaWYgKGlzID09IG51bGwpIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmaWxlUGF0aCkpOworICAgIFhtbFN1aXRlIHJlc3VsdCA9IChYbWxTdWl0ZSkgeS5sb2FkKGlzKTsKKworICAgIHJlc3VsdC5zZXRGaWxlTmFtZShmaWxlUGF0aCk7CisgICAgLy8gREVCVUcKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1lhbWxdICIgKyByZXN1bHQudG9YbWwoKSk7CisKKyAgICAvLyBBZGp1c3QgWG1sVGVzdCBwYXJlbnRzIGFuZCBpbmRpY2VzCisgICAgZm9yIChYbWxUZXN0IHQgOiByZXN1bHQuZ2V0VGVzdHMoKSkgeworICAgICAgdC5zZXRTdWl0ZShyZXN1bHQpOworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGZvciAoWG1sQ2xhc3MgYyA6IHQuZ2V0Q2xhc3NlcygpKSB7CisgICAgICAgIGMuc2V0SW5kZXgoaW5kZXgrKyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbWF5YmVBZGQoU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBPYmplY3QgZGVmKSB7CisgICAgbWF5YmVBZGQoc2IsICIiLCBrZXksIHZhbHVlLCBkZWYpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXliZUFkZChTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmcgc3AsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSwgT2JqZWN0IGRlZikgeworICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICEgdmFsdWUuZXF1YWxzKGRlZikpIHsKKyAgICAgIHNiLmFwcGVuZChzcCkuYXBwZW5kKGtleSkuYXBwZW5kKCI6ICIpLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoZSBtYWluIGVudHJ5IHBvaW50IHRvIGNvbnZlcnQgYW4gWG1sU3VpdGUgaW50byBZQU1MLiBUaGlzIG1ldGhvZCBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKyAgICogYnkgZXh0ZXJuYWwgdG9vbHMgKGUuZy4gRWNsaXBzZSkuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1aWxkZXIgdG9ZYW1sKFhtbFN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgbWF5YmVBZGQocmVzdWx0LCAibmFtZSIsIHN1aXRlLmdldE5hbWUoKSwgbnVsbCk7CisgICAgbWF5YmVBZGQocmVzdWx0LCAianVuaXQiLCBzdWl0ZS5pc0pVbml0KCksIFhtbFN1aXRlLkRFRkFVTFRfSlVOSVQpOworICAgIG1heWJlQWRkKHJlc3VsdCwgInZlcmJvc2UiLCBzdWl0ZS5nZXRWZXJib3NlKCksIFhtbFN1aXRlLkRFRkFVTFRfVkVSQk9TRSk7CisgICAgbWF5YmVBZGQocmVzdWx0LCAidGhyZWFkQ291bnQiLCBzdWl0ZS5nZXRUaHJlYWRDb3VudCgpLCBYbWxTdWl0ZS5ERUZBVUxUX1RIUkVBRF9DT1VOVCk7CisgICAgbWF5YmVBZGQocmVzdWx0LCAiZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQiLCBzdWl0ZS5nZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudCgpLAorICAgICAgICBYbWxTdWl0ZS5ERUZBVUxUX0RBVEFfUFJPVklERVJfVEhSRUFEX0NPVU5UKTsKKyAgICBtYXliZUFkZChyZXN1bHQsICJ0aW1lT3V0Iiwgc3VpdGUuZ2V0VGltZU91dCgpLCBudWxsKTsKKyAgICBtYXliZUFkZChyZXN1bHQsICJwYXJhbGxlbCIsIHN1aXRlLmdldFBhcmFsbGVsKCksIFhtbFN1aXRlLkRFRkFVTFRfUEFSQUxMRUwpOworICAgIG1heWJlQWRkKHJlc3VsdCwgInNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzIiwgc3VpdGUuc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoKSwKKyAgICAgICAgWG1sU3VpdGUuREVGQVVMVF9TS0lQX0ZBSUxFRF9JTlZPQ0FUSU9OX0NPVU5UUyk7CisKKyAgICB0b1lhbWwocmVzdWx0LCAicGFyYW1ldGVycyIsICIiLCBzdWl0ZS5nZXRQYXJhbWV0ZXJzKCkpOworICAgIHRvWWFtbChyZXN1bHQsIHN1aXRlLmdldFBhY2thZ2VzKCkpOworCisgICAgaWYgKHN1aXRlLmdldExpc3RlbmVycygpLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoImxpc3RlbmVyczpcbiIpOworICAgICAgdG9ZYW1sKHJlc3VsdCwgIiAgIiwgc3VpdGUuZ2V0TGlzdGVuZXJzKCkpOworICAgIH0KKworICAgIGlmIChzdWl0ZS5nZXRQYWNrYWdlcygpLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoInBhY2thZ2VzOlxuIik7CisgICAgICB0b1lhbWwocmVzdWx0LCBzdWl0ZS5nZXRQYWNrYWdlcygpKTsKKyAgICB9CisgICAgaWYgKHN1aXRlLmdldFRlc3RzKCkuc2l6ZSgpID4gMCkgeworICAgICAgcmVzdWx0LmFwcGVuZCgidGVzdHM6XG4iKTsKKyAgICAgIGZvciAoWG1sVGVzdCB0IDogc3VpdGUuZ2V0VGVzdHMoKSkgeworICAgICAgICB0b1lhbWwocmVzdWx0LCAiICAiLCB0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3VpdGUuZ2V0Q2hpbGRTdWl0ZXMoKS5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJzdWl0ZS1maWxlczpcbiIpOworICAgICAgdG9ZYW1sKHJlc3VsdCwgIiAgIiwgc3VpdGUuZ2V0U3VpdGVGaWxlcygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b1lhbWwoU3RyaW5nQnVpbGRlciByZXN1bHQsIFN0cmluZyBzcCwgWG1sVGVzdCB0KSB7CisgICAgU3RyaW5nIHNwMiA9IHNwICsgIiAgIjsKKyAgICByZXN1bHQuYXBwZW5kKHNwKS5hcHBlbmQoIi0gbmFtZTogIikuYXBwZW5kKHQuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7CisKKyAgICBtYXliZUFkZChyZXN1bHQsIHNwMiwgImp1bml0IiwgdC5pc0pVbml0KCksIFhtbFN1aXRlLkRFRkFVTFRfSlVOSVQpOworICAgIG1heWJlQWRkKHJlc3VsdCwgc3AyLCAidmVyYm9zZSIsIHQuZ2V0VmVyYm9zZSgpLCBYbWxTdWl0ZS5ERUZBVUxUX1ZFUkJPU0UpOworICAgIG1heWJlQWRkKHJlc3VsdCwgc3AyLCAidGltZU91dCIsIHQuZ2V0VGltZU91dCgpLCBudWxsKTsKKyAgICBtYXliZUFkZChyZXN1bHQsIHNwMiwgInBhcmFsbGVsIiwgdC5nZXRQYXJhbGxlbCgpLCBYbWxTdWl0ZS5ERUZBVUxUX1BBUkFMTEVMKTsKKyAgICBtYXliZUFkZChyZXN1bHQsIHNwMiwgInNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzIiwgdC5za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cygpLAorICAgICAgICBYbWxTdWl0ZS5ERUZBVUxUX1NLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTKTsKKworICAgIG1heWJlQWRkKHJlc3VsdCwgInByZXNlcnZlT3JkZXIiLCBzcDIsIHQuZ2V0UHJlc2VydmVPcmRlcigpLCBYbWxTdWl0ZS5ERUZBVUxUX1BSRVNFUlZFX09SREVSKTsKKworICAgIHRvWWFtbChyZXN1bHQsICJwYXJhbWV0ZXJzIiwgc3AyLCB0LmdldFRlc3RQYXJhbWV0ZXJzKCkpOworCisgICAgaWYgKHQuZ2V0SW5jbHVkZWRHcm91cHMoKS5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHNwMikuYXBwZW5kKCJpbmNsdWRlZEdyb3VwczogWyAiKQorICAgICAgICAgIC5hcHBlbmQoVXRpbHMuam9pbih0LmdldEluY2x1ZGVkR3JvdXBzKCksICIsIikpCisgICAgICAgICAgLmFwcGVuZCgiIF1cbiIpOworICAgIH0KKworICAgIGlmICh0LmdldEV4Y2x1ZGVkR3JvdXBzKCkuc2l6ZSgpID4gMCkgeworICAgICAgcmVzdWx0LmFwcGVuZChzcDIpLmFwcGVuZCgiZXhjbHVkZWRHcm91cHM6IFsgIikKKyAgICAgICAgICAuYXBwZW5kKFV0aWxzLmpvaW4odC5nZXRFeGNsdWRlZEdyb3VwcygpLCAiLCIpKQorICAgICAgICAgIC5hcHBlbmQoIiBdXG4iKTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG1nID0gdC5nZXRNZXRhR3JvdXBzKCk7CisgICAgaWYgKG1nLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoc3AyKS5hcHBlbmQoIm1ldGFHcm91cHM6IHsgIik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IG1nLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgaWYgKCEgZmlyc3QpIHJlc3VsdC5hcHBlbmQoIiwgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiBbICIpCisgICAgICAgIC5hcHBlbmQoVXRpbHMuam9pbihlbnRyeS5nZXRWYWx1ZSgpLCAiLCIpKS5hcHBlbmQoIiBdICIpOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0LmFwcGVuZCgiIH1cbiIpOworICAgIH0KKworICAgIGlmICh0LmdldFhtbFBhY2thZ2VzKCkuc2l6ZSgpID4gMCkgeworICAgICAgcmVzdWx0LmFwcGVuZChzcDIpLmFwcGVuZCgieG1sUGFja2FnZXM6XG4iKTsKKyAgICAgIGZvciAoWG1sUGFja2FnZSB4cCA6IHQuZ2V0WG1sUGFja2FnZXMoKSkgIHsKKyAgICAgICAgdG9ZYW1sKHJlc3VsdCwgc3AyICsgIiAgLSAiLCB4cCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHQuZ2V0WG1sQ2xhc3NlcygpLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoc3AyKS5hcHBlbmQoImNsYXNzZXM6XG4iKTsKKyAgICAgIGZvciAoWG1sQ2xhc3MgeGMgOiB0LmdldFhtbENsYXNzZXMoKSkgIHsKKyAgICAgICAgdG9ZYW1sKHJlc3VsdCwgc3AyICsgIiAgIiwgeGMpOworICAgICAgfQorICAgIH0KKworCisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdG9ZYW1sKFN0cmluZ0J1aWxkZXIgcmVzdWx0LCBTdHJpbmcgc3AyLCBYbWxDbGFzcyB4YykgeworICAgIExpc3Q8WG1sSW5jbHVkZT4gaW0gPSB4Yy5nZXRJbmNsdWRlZE1ldGhvZHMoKTsKKyAgICBMaXN0PFN0cmluZz4gZW0gPSB4Yy5nZXRFeGNsdWRlZE1ldGhvZHMoKTsKKyAgICBTdHJpbmcgbmFtZSA9IGltLnNpemUoKSA+IDAgfHwgZW0uc2l6ZSgpID4gMCA/ICJuYW1lOiAiIDogIiI7CisKKyAgICByZXN1bHQuYXBwZW5kKHNwMikuYXBwZW5kKCItICIgKyBuYW1lKS5hcHBlbmQoeGMuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7CisgICAgaWYgKGltLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoc3AyICsgIiAgaW5jbHVkZWRNZXRob2RzOlxuIik7CisgICAgICBmb3IgKFhtbEluY2x1ZGUgeGkgOiBpbSkgeworICAgICAgICB0b1lhbWwocmVzdWx0LCBzcDIgKyAiICAgICIsIHhpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW0uc2l6ZSgpID4gMCkgeworICAgICAgcmVzdWx0LmFwcGVuZChzcDIgKyAiICBleGNsdWRlZE1ldGhvZHM6XG4iKTsKKyAgICAgIHRvWWFtbChyZXN1bHQsIHNwMiArICIgICAgIiwgZW0pOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdG9ZYW1sKFN0cmluZ0J1aWxkZXIgcmVzdWx0LCBTdHJpbmcgc3AyLCBYbWxJbmNsdWRlIHhpKSB7CisgICAgcmVzdWx0LmFwcGVuZChzcDIgKyAiLSAiICsgeGkuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHRvWWFtbChTdHJpbmdCdWlsZGVyIHJlc3VsdCwgU3RyaW5nIHNwLCBMaXN0PFN0cmluZz4gc3RyaW5ncykgeworICAgIGZvciAoU3RyaW5nIGwgOiBzdHJpbmdzKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHNwKS5hcHBlbmQoIi0gIikuYXBwZW5kKGwpLmFwcGVuZCgiXG4iKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1AgPSAiICAiOworCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdG9ZYW1sKFN0cmluZ0J1aWxkZXIgc2IsIExpc3Q8WG1sUGFja2FnZT4gcGFja2FnZXMpIHsKKyAgICBpZiAocGFja2FnZXMuc2l6ZSgpID4gMCkgeworICAgICAgc2IuYXBwZW5kKCJwYWNrYWdlczpcbiIpOworICAgICAgZm9yIChYbWxQYWNrYWdlIHAgOiBwYWNrYWdlcykgeworICAgICAgICB0b1lhbWwoc2IsICIgICIsIHApOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKFhtbFBhY2thZ2UgcCA6IHBhY2thZ2VzKSB7CisgICAgICB0b1lhbWwoc2IsICIgICIsIHApOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdG9ZYW1sKFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZyBzcCwgWG1sUGFja2FnZSBwKSB7CisgICAgc2IuYXBwZW5kKHNwKS5hcHBlbmQoIm5hbWU6ICIpLmFwcGVuZChwLmdldE5hbWUoKSkuYXBwZW5kKCJcbiIpOworCisgICAgZ2VuZXJhdGVJbmNsdWRlRXhjbHVkZShzYiwgc3AsICJpbmNsdWRlcyIsIHAuZ2V0SW5jbHVkZSgpKTsKKyAgICBnZW5lcmF0ZUluY2x1ZGVFeGNsdWRlKHNiLCBzcCwgImV4Y2x1ZGVzIiwgcC5nZXRFeGNsdWRlKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUluY2x1ZGVFeGNsdWRlKFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZyBzcCwKKyAgICAgIFN0cmluZyBrZXksIExpc3Q8U3RyaW5nPiBpbmNsdWRlcykgeworICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgICBzYi5hcHBlbmQoc3ApLmFwcGVuZCgiICAiKS5hcHBlbmQoa2V5KS5hcHBlbmQoIlxuIik7CisgICAgICBmb3IgKFN0cmluZyBpbmMgOiBpbmNsdWRlcykgeworICAgICAgICBzYi5hcHBlbmQoc3ApLmFwcGVuZCgiICAgICIpLmFwcGVuZChpbmMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFwVG9ZYW1sKE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwLCBTdHJpbmdCdWlsZGVyIG91dCkgeworICAgIGlmIChtYXAuc2l6ZSgpID4gMCkgeworICAgICAgb3V0LmFwcGVuZCgieyAiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgICBpZiAoISBmaXJzdCkgb3V0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0LmFwcGVuZChlLmdldEtleSgpICsgIjogIiArIGUuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgICBvdXQuYXBwZW5kKCIgfVxuIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b1lhbWwoU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nIGtleSwgU3RyaW5nIHNwLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgaWYgKHBhcmFtZXRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgc2IuYXBwZW5kKHNwKS5hcHBlbmQoa2V5KS5hcHBlbmQoIjogIik7CisgICAgICBtYXBUb1lhbWwocGFyYW1ldGVycywgc2IpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3ROR0NvbnN0cnVjdG9yIGV4dGVuZHMgQ29uc3RydWN0b3IgeworICAgIHB1YmxpYyBUZXN0TkdDb25zdHJ1Y3RvcihDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiB0aGVSb290KSB7CisgICAgICBzdXBlcih0aGVSb290KTsKKyAgICAgIHlhbWxDbGFzc0NvbnN0cnVjdG9ycy5wdXQoTm9kZUlkLnNjYWxhciwgbmV3IENvbnN0cnVjdFBhcmFsbGVsTW9kZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvbnN0cnVjdFBhcmFsbGVsTW9kZSBleHRlbmRzIENvbnN0cnVjdFNjYWxhciB7CisgICAgICBwdWJsaWMgT2JqZWN0IGNvbnN0cnVjdChOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpLmVxdWFscyhYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuY2xhc3MpKSB7CisgICAgICAgICAgU3RyaW5nIHBhcmFsbGVsID0gKFN0cmluZykgY29uc3RydWN0U2NhbGFyKChTY2FsYXJOb2RlKSBub2RlKTsKKyAgICAgICAgICByZXR1cm4gWG1sU3VpdGUuUGFyYWxsZWxNb2RlLmdldFZhbGlkUGFyYWxsZWwocGFyYWxsZWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jb25zdHJ1Y3Qobm9kZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvWWFtbFBhcnNlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1lhbWxQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Y5ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1lhbWxQYXJzZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5JU3VpdGVQYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgWWFtbFBhcnNlciBpbXBsZW1lbnRzIElTdWl0ZVBhcnNlciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBYbWxTdWl0ZSBwYXJzZShTdHJpbmcgZmlsZVBhdGgsIElucHV0U3RyZWFtIGlzLCBib29sZWFuIGxvYWRDbGFzc2VzKQorICAgICAgdGhyb3dzIFRlc3ROR0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBZYW1sLnBhcnNlKGZpbGVQYXRoLCBpcyk7CisgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gZmlsZU5hbWUuZW5kc1dpdGgoIi55YW1sIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0FmdGVyU3VpdGVBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQWZ0ZXJTdWl0ZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTBiZTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0FmdGVyU3VpdGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBBZnRlclN1aXRlQW5ub3RhdGlvbiBleHRlbmRzIEJhc2VCZWZvcmVBZnRlciB7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSGVscGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwODQ5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMzIxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRGF0YVByb3ZpZGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVBhcmFtZXRlcnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKKy8qKgorICogSGVscGVyIG1ldGhvZHMgdG8gZmluZCBAVGVzdCBhbmQgQENvbmZpZ3VyYXRpb24gdGFncy4gIFRoZXkgbWluaW1pemUKKyAqIHRoZSBhbW91bnQgb2YgY2FzdGluZyB3ZSBuZWVkIHRvIGRvLgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkhlbHBlciB7CisKKyAgcHVibGljIHN0YXRpYyBJVGVzdEFubm90YXRpb24gZmluZFRlc3QoSUFubm90YXRpb25GaW5kZXIgZmluZGVyLCBDbGFzczw/PiBjbHMpIHsKKyAgICByZXR1cm4gZmluZGVyLmZpbmRBbm5vdGF0aW9uKGNscywgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSVRlc3RBbm5vdGF0aW9uIGZpbmRUZXN0KElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwgTWV0aG9kIG0pIHsKKyAgICByZXR1cm4gZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIElUZXN0QW5ub3RhdGlvbiBmaW5kVGVzdChJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIElUZXN0TkdNZXRob2QgbSkgeworICAgIHJldHVybiBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSUZhY3RvcnlBbm5vdGF0aW9uIGZpbmRGYWN0b3J5KElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwgTWV0aG9kIG0pIHsKKyAgICByZXR1cm4gZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElGYWN0b3J5QW5ub3RhdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIElGYWN0b3J5QW5ub3RhdGlvbiBmaW5kRmFjdG9yeShJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIENvbnN0cnVjdG9yIGMpIHsKKyAgICByZXR1cm4gZmluZGVyLmZpbmRBbm5vdGF0aW9uKGMsIElGYWN0b3J5QW5ub3RhdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIElUZXN0QW5ub3RhdGlvbiBmaW5kVGVzdChJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIENvbnN0cnVjdG9yIGN0b3IpIHsKKyAgICByZXR1cm4gZmluZGVyLmZpbmRBbm5vdGF0aW9uKGN0b3IsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBmaW5kQ29uZmlndXJhdGlvbihJQW5ub3RhdGlvbkZpbmRlciBmaW5kZXIsIENvbnN0cnVjdG9yIGN0b3IpIHsKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gcmVzdWx0ID0gZmluZGVyLmZpbmRBbm5vdGF0aW9uKGN0b3IsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYnMgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24oY3RvciwgSUJlZm9yZVN1aXRlLmNsYXNzKTsKKyAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhcyA9IChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIGZpbmRlci5maW5kQW5ub3RhdGlvbihjdG9yLCBJQWZ0ZXJTdWl0ZS5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYnQgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24oY3RvciwgSUJlZm9yZVRlc3QuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGF0ID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKGN0b3IsIElBZnRlclRlc3QuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGJnID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKGN0b3IsIElCZWZvcmVHcm91cHMuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFnID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKGN0b3IsIElBZnRlckdyb3Vwcy5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYmMgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24oY3RvciwgSUJlZm9yZUNsYXNzLmNsYXNzKTsKKyAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhYyA9IChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIGZpbmRlci5maW5kQW5ub3RhdGlvbihjdG9yLCBJQWZ0ZXJDbGFzcy5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYm0gPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24oY3RvciwgSUJlZm9yZU1ldGhvZC5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYW0gPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24oY3RvciwgSUFmdGVyTWV0aG9kLmNsYXNzKTsKKworICAgICAgaWYgKGJzICE9IG51bGwgfHwgYXMgIT0gbnVsbCB8fCBidCAhPSBudWxsIHx8IGF0ICE9IG51bGwgfHwgYmcgIT0gbnVsbCB8fCBhZyAhPSBudWxsCisgICAgICAgICAgfHwgYmMgIT0gbnVsbCB8fCBhYyAhPSBudWxsIHx8IGJtICE9IG51bGwgfHwgYW0gIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZmlndXJhdGlvbihicywgYXMsIGJ0LCBhdCwgYmcsIGFnLCBiYywgYWMsIGJtLCBhbSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGZpbmRDb25maWd1cmF0aW9uKElBbm5vdGF0aW9uRmluZGVyIGZpbmRlciwgTWV0aG9kIG0pIHsKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gcmVzdWx0ID0gZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYnMgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSUJlZm9yZVN1aXRlLmNsYXNzKTsKKyAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhcyA9IChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIGZpbmRlci5maW5kQW5ub3RhdGlvbihtLCBJQWZ0ZXJTdWl0ZS5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYnQgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSUJlZm9yZVRlc3QuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGF0ID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElBZnRlclRlc3QuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGJnID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElCZWZvcmVHcm91cHMuY2xhc3MpOworICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFnID0gKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgZmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIElBZnRlckdyb3Vwcy5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYmMgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSUJlZm9yZUNsYXNzLmNsYXNzKTsKKyAgICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBhYyA9IChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIGZpbmRlci5maW5kQW5ub3RhdGlvbihtLCBJQWZ0ZXJDbGFzcy5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYm0gPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSUJlZm9yZU1ldGhvZC5jbGFzcyk7CisgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYW0gPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBmaW5kZXIuZmluZEFubm90YXRpb24obSwgSUFmdGVyTWV0aG9kLmNsYXNzKTsKKworICAgICAgaWYgKGJzICE9IG51bGwgfHwgYXMgIT0gbnVsbCB8fCBidCAhPSBudWxsIHx8IGF0ICE9IG51bGwgfHwgYmcgIT0gbnVsbCB8fCBhZyAhPSBudWxsCisgICAgICAgICAgfHwgYmMgIT0gbnVsbCB8fCBhYyAhPSBudWxsIHx8IGJtICE9IG51bGwgfHwgYW0gIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZmlndXJhdGlvbihicywgYXMsIGJ0LCBhdCwgYmcsIGFnLCBiYywgYWMsIGJtLCBhbSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBicywgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFzLAorICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGJ0LCBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYXQsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBiZywgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFnLAorICAgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGJjLCBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYWMsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBibSwgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFtKQorICB7CisgICAgQ29uZmlndXJhdGlvbkFubm90YXRpb24gcmVzdWx0ID0gbmV3IENvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKCk7CisKKyAgICBpZiAoYnMgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnNldEJlZm9yZVN1aXRlKHRydWUpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGJzKTsKKyAgICB9CisgICAgaWYgKGFzICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRBZnRlclN1aXRlKHRydWUpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGFzKTsKKyAgICB9CisgICAgaWYgKGJ0ICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRCZWZvcmVUZXN0KHRydWUpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGJ0KTsKKyAgICB9CisgICAgaWYgKGF0ICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRBZnRlclRlc3QodHJ1ZSk7CisgICAgICBmaW5pc2hJbml0aWFsaXplKHJlc3VsdCwgYXQpOworICAgIH0KKyAgICBpZiAoYmcgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnNldEJlZm9yZUdyb3VwcyhiZy5nZXRCZWZvcmVHcm91cHMoKSk7CisgICAgICBmaW5pc2hJbml0aWFsaXplKHJlc3VsdCwgYmcpOworICAgIH0KKyAgICBpZiAoYWcgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnNldEFmdGVyR3JvdXBzKGFnLmdldEFmdGVyR3JvdXBzKCkpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGFnKTsKKyAgICB9CisgICAgaWYgKGJjICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRCZWZvcmVUZXN0Q2xhc3ModHJ1ZSk7CisgICAgICBmaW5pc2hJbml0aWFsaXplKHJlc3VsdCwgYmMpOworICAgIH0KKyAgICBpZiAoYWMgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnNldEFmdGVyVGVzdENsYXNzKHRydWUpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGFjKTsKKyAgICB9CisgICAgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRCZWZvcmVUZXN0TWV0aG9kKHRydWUpOworICAgICAgZmluaXNoSW5pdGlhbGl6ZShyZXN1bHQsIGJtKTsKKyAgICB9CisgICAgaWYgKGFtICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5zZXRBZnRlclRlc3RNZXRob2QodHJ1ZSk7CisgICAgICBmaW5pc2hJbml0aWFsaXplKHJlc3VsdCwgYW0pOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluaXNoSW5pdGlhbGl6ZShDb25maWd1cmF0aW9uQW5ub3RhdGlvbiByZXN1bHQsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBicykgeworICAgIHJlc3VsdC5zZXRGYWtlQ29uZmlndXJhdGlvbih0cnVlKTsKKyAgICByZXN1bHQuc2V0QWx3YXlzUnVuKGJzLmdldEFsd2F5c1J1bigpKTsKKyAgICByZXN1bHQuc2V0RGVwZW5kc09uR3JvdXBzKGJzLmdldERlcGVuZHNPbkdyb3VwcygpKTsKKyAgICByZXN1bHQuc2V0RGVwZW5kc09uTWV0aG9kcyhicy5nZXREZXBlbmRzT25NZXRob2RzKCkpOworICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbihicy5nZXREZXNjcmlwdGlvbigpKTsKKyAgICByZXN1bHQuc2V0RW5hYmxlZChicy5nZXRFbmFibGVkKCkpOworICAgIHJlc3VsdC5zZXRHcm91cHMoYnMuZ2V0R3JvdXBzKCkpOworICAgIHJlc3VsdC5zZXRJbmhlcml0R3JvdXBzKGJzLmdldEluaGVyaXRHcm91cHMoKSk7CisgICAgcmVzdWx0LnNldFBhcmFtZXRlcnMoYnMuZ2V0UGFyYW1ldGVycygpKTsKKyAgICByZXN1bHQuc2V0VGltZU91dChicy5nZXRUaW1lT3V0KCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBTExfQU5OT1RBVElPTlMgPSBuZXcgQ2xhc3NbXSB7CisgICAgSVRlc3RBbm5vdGF0aW9uLmNsYXNzLCBJQ29uZmlndXJhdGlvbkFubm90YXRpb24uY2xhc3MsCisgICAgSUJlZm9yZUNsYXNzLmNsYXNzLCBJQWZ0ZXJDbGFzcy5jbGFzcywKKyAgICBJQmVmb3JlTWV0aG9kLmNsYXNzLCBJQWZ0ZXJNZXRob2QuY2xhc3MsCisgICAgSURhdGFQcm92aWRlckFubm90YXRpb24uY2xhc3MsIElFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uLmNsYXNzLAorICAgIElGYWN0b3J5QW5ub3RhdGlvbi5jbGFzcywgSVBhcmFtZXRlcnNBbm5vdGF0aW9uLmNsYXNzLAorICAgIElCZWZvcmVTdWl0ZS5jbGFzcywgSUFmdGVyU3VpdGUuY2xhc3MsCisgICAgSUJlZm9yZVRlc3QuY2xhc3MsIElBZnRlclRlc3QuY2xhc3MsCisgICAgSUJlZm9yZUdyb3Vwcy5jbGFzcywgSUFmdGVyR3JvdXBzLmNsYXNzCisgIH07CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzc1tdIENPTkZJR1VSQVRJT05fQ0xBU1NFUyA9IG5ldyBDbGFzc1tdIHsKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24uY2xhc3MsCisgICAgSUJlZm9yZVN1aXRlLmNsYXNzLCBJQWZ0ZXJTdWl0ZS5jbGFzcywKKyAgICBJQmVmb3JlVGVzdC5jbGFzcywgSUFmdGVyVGVzdC5jbGFzcywKKyAgICBJQmVmb3JlR3JvdXBzLmNsYXNzLCBJQWZ0ZXJHcm91cHMuY2xhc3MsCisgICAgSUJlZm9yZUNsYXNzLmNsYXNzLCBJQWZ0ZXJDbGFzcy5jbGFzcywKKyAgICBJQmVmb3JlTWV0aG9kLmNsYXNzLCBJQWZ0ZXJNZXRob2QuY2xhc3MKKyAgfTsKKworICBwdWJsaWMgc3RhdGljIENsYXNzW10gZ2V0QWxsQW5ub3RhdGlvbnMoKSB7CisgICAgcmV0dXJuIEFMTF9BTk5PVEFUSU9OUzsKKyAgfQorCisgIC8qKgorICAgKiBEZWxlZ2F0aW9uIG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIGxpc3Qgb2YgPENPREU+SVRlc3RNZXRob2Q8L0NPREU+cyB0byBiZQorICAgKiBhbmFseXNlZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSVRlc3ROR01ldGhvZFtdIGZpbmRNZXRob2RzV2l0aEFubm90YXRpb24oQ2xhc3M8Pz4gcm9vdENsYXNzLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIElBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsIElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsCisgICAgICBYbWxUZXN0IHhtbFRlc3QpCisgIHsKKyAgICAvLyBLZWVwIGEgbWFwIG9mIHRoZSBtZXRob2RzIHdlIHNhdyBzbyB0aGF0IHdlIGlnbm9yZSBhIG1ldGhvZCBpbiBhIHN1cGVyY2xhc3MgaWYgaXQncworICAgIC8vIGFscmVhZHkgYmVlbiBzZWVuIGluIGEgY2hpbGQgY2xhc3MKKyAgICBNYXA8U3RyaW5nLCBJVGVzdE5HTWV0aG9kPiB2UmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICB0cnkgeworICAgICAgdlJlc3VsdCA9IE1hcHMubmV3SGFzaE1hcCgpOworLy8gICAgQ2xhc3NbXSBjbGFzc2VzID0gcm9vdENsYXNzLmdldFRlc3RDbGFzc2VzKCk7CisgICAgICBDbGFzczw/PiBjbHMgPSByb290Q2xhc3M7CisKKyAgICAgIC8vCisgICAgICAvLyBJZiB0aGUgYW5ub3RhdGlvbiBpcyBvbiB0aGUgY2xhc3Mgb3Igc3VwZXJjbGFzcywgaXQgYXBwbGllcyB0byBhbGwgcHVibGljIG1ldGhvZHMKKyAgICAgIC8vIGV4Y2VwdCBtZXRob2RzIG1hcmtlZCB3aXRoIEBDb25maWd1cmF0aW9uCisgICAgICAvLworCisgICAgICAvLworICAgICAgLy8gT3RoZXJ3aXNlIHdhbGsgdGhyb3VnaCBhbGwgdGhlIG1ldGhvZHMgYW5kIGtlZXAgdGhvc2UKKyAgICAgIC8vIHRoYXQgaGF2ZSB0aGUgYW5ub3RhdGlvbgorICAgICAgLy8KKy8vICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogY2xhc3NlcykgeworICAgICAgICB3aGlsZSAobnVsbCAhPSBjbHMpIHsKKyAgICAgICAgICBib29sZWFuIGhhc0NsYXNzQW5ub3RhdGlvbiA9IGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkZpbmRlciwgY2xzLCBhbm5vdGF0aW9uQ2xhc3MpOworICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgZm9yIChNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzTWV0aG9kQW5ub3RhdGlvbiA9IGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkZpbmRlciwgbSwgYW5ub3RhdGlvbkNsYXNzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGVzdE5HQW5ub3RhdGlvbiA9CisgICAgICAgICAgICAgIGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkZpbmRlciwgbSwgSUZhY3RvcnlBbm5vdGF0aW9uLmNsYXNzKSB8fAorICAgICAgICAgICAgICBpc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25GaW5kZXIsIG0sIElUZXN0QW5ub3RhdGlvbi5jbGFzcykgfHwKKyAgICAgICAgICAgICAgaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uRmluZGVyLCBtLCBDT05GSUdVUkFUSU9OX0NMQVNTRVMpOworICAgICAgICAgICAgYm9vbGVhbiBpc1B1YmxpYyA9IE1vZGlmaWVyLmlzUHVibGljKG0uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgYm9vbGVhbiBpc1N5bnRoZXRpYyA9IG0uaXNTeW50aGV0aWMoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoaXNQdWJsaWMgJiYgaGFzQ2xhc3NBbm5vdGF0aW9uICYmICFpc1N5bnRoZXRpYyAmJiAoISBoYXNUZXN0TkdBbm5vdGF0aW9uKSkgfHwgaGFzTWV0aG9kQW5ub3RhdGlvbikgeworCisgICAgICAgICAgICAgIC8vIFNtYWxsIGhhY2sgdG8gYWxsb3cgdXNlcnMgdG8gc3BlY2lmeSBAQ29uZmlndXJhdGlvbiBjbGFzc2VzIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgIC8vIGEgY2xhc3MtbGV2ZWwgQFRlc3QgYW5ub3RhdGlvbiBpcyBwcmVzZW50LiAgSW4gdGhpcyBjYXNlLCBkb24ndCBjb3VudAorICAgICAgICAgICAgICAvLyB0aGF0IG1ldGhvZCBhcyBhIEBUZXN0CisgICAgICAgICAgICAgIGlmIChpc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25GaW5kZXIsIG0sIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5jbGFzcykgJiYKKyAgICAgICAgICAgICAgICAgIGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkZpbmRlciwgY2xzLCBJVGVzdEFubm90YXRpb24uY2xhc3MpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXRpbHMubG9nKCIiLCAzLCAiTWV0aG9kICIgKyBtICsgIiBoYXMgYSBjb25maWd1cmF0aW9uIGFubm90YXRpb24iCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgYSBjbGFzcy1sZXZlbCBAVGVzdC4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGtlcHQgYXMgYSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbmZpZ3VyYXRpb24gbWV0aG9kLiIpOworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBtZXRob2QgaWYgaXQgaGFzIGEgcmV0dXJuIHR5cGUKKyAgICAgICAgICAgICAgaWYgKG0uZ2V0UmV0dXJuVHlwZSgpICE9IHZvaWQuY2xhc3MgJiYgISB4bWxUZXN0LmdldEFsbG93UmV0dXJuVmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBVdGlscy5sb2coIiIsIDIsICJNZXRob2QgIiArIG0gKyAiIGhhcyBhIEBUZXN0IGFubm90YXRpb24iCisgICAgICAgICAgICAgICAgICAgICsgIiBidXQgYWxzbyBhIHJldHVybiB2YWx1ZToiCisgICAgICAgICAgICAgICAgICAgICsgIiBpZ25vcmluZyBpdC4gVXNlIDxzdWl0ZSBhbGxvdy1yZXR1cm4tdmFsdWVzPVwidHJ1ZVwiPiB0byBmaXggdGhpcyIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNyZWF0ZU1ldGhvZEtleShtKTsKKyAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdlJlc3VsdC5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgIElUZXN0TkdNZXRob2QgdG0gPSBuZXcgVGVzdE5HTWV0aG9kKC8qIG0uZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgKi8gbSwKKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkZpbmRlciwgeG1sVGVzdCwgbnVsbCk7IC8qIEBAQCAqLworICAgICAgICAgICAgICAgIHZSZXN1bHQucHV0KGtleSx0bSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IC8vIGZvcgorICAgICAgICAgIC8vIE5vdyBleHBsb3JlIHRoZSBzdXBlcmNsYXNzCisgICAgICAgICAgY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfSAvLyB3aGlsZQorCisgICAgfQorICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0ID0gdlJlc3VsdC52YWx1ZXMoKS50b0FycmF5KG5ldyBJVGVzdE5HTWV0aG9kW3ZSZXN1bHQuc2l6ZSgpXSk7CisKKyAgLy8gICAgZm9yIChNZXRob2QgbSA6IHJlc3VsdCkgeworICAvLyAgICAgIHBwcCgiICAgTUVUSE9EIEZPVU5EOiAiICsgbSk7CisgIC8vICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uIGZpbmRBbm5vdGF0aW9uU3VwZXJDbGFzc2VzKENsYXNzPD8+IGFubm90YXRpb25DbGFzcywgQ2xhc3MgYykgeworICAgIHdoaWxlIChjICE9IG51bGwpIHsKKyAgICAgIEFubm90YXRpb24gcmVzdWx0ID0gYy5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25DbGFzcyk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CisgICAgICBlbHNlIGMgPSBjLmdldFN1cGVyY2xhc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciwKKyAgICAgIE1ldGhvZCBtLCBDbGFzc1tdIGFubm90YXRpb25DbGFzc2VzKQorICB7CisgICAgZm9yIChDbGFzcyBhIDogYW5ub3RhdGlvbkNsYXNzZXMpIHsKKyAgICAgIGlmIChhbm5vdGF0aW9uRmluZGVyLmZpbmRBbm5vdGF0aW9uKG0sIGEpICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KElBbm5vdGF0aW9uRmluZGVyIGFubm90YXRpb25GaW5kZXIsIE1ldGhvZCBtLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIElBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihtLCBhbm5vdGF0aW9uQ2xhc3MpICE9IG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoSUFubm90YXRpb25GaW5kZXIgYW5ub3RhdGlvbkZpbmRlciwgQ2xhc3M8Pz4gY2xzLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIElBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbkZpbmRlci5maW5kQW5ub3RhdGlvbihjbHMsIGFubm90YXRpb25DbGFzcykgIT0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIEEgaGFzaGNvZGUgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGFuZCBpdHMgcGFyYW1ldGVycywKKyAgICogYnV0IHdpdGhvdXQgaXRzIGNsYXNzCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWV0aG9kS2V5KE1ldGhvZCBtKSB7CisgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobS5nZXROYW1lKCkpOworICAgIGZvciAoQ2xhc3MgcGFyYW1DbGFzcyA6IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgnICcpLmFwcGVuZChwYXJhbUNsYXNzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQmFzZUFubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9CYXNlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmNWJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQmFzZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBCYXNlQW5ub3RhdGlvbiB7CisgIHByaXZhdGUgQ2xhc3MgbV90ZXN0Q2xhc3M7CisgIHByaXZhdGUgTWV0aG9kIG1fbWV0aG9kOworICBwcml2YXRlIENvbnN0cnVjdG9yIG1fY29uc3RydWN0b3I7CisKKyAgcHVibGljIENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yKCkgeworICAgIHJldHVybiBtX2NvbnN0cnVjdG9yOworICB9CisgIHB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CisgICAgbV9jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOworICB9CisgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgeworICAgIHJldHVybiBtX21ldGhvZDsKKyAgfQorICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoTWV0aG9kIG1ldGhvZCkgeworICAgIG1fbWV0aG9kID0gbWV0aG9kOworICB9CisgIHB1YmxpYyBDbGFzcyBnZXRUZXN0Q2xhc3MoKSB7CisgICAgcmV0dXJuIG1fdGVzdENsYXNzOworICB9CisgIHB1YmxpYyB2b2lkIHNldFRlc3RDbGFzcyhDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICBtX3Rlc3RDbGFzcyA9IHRlc3RDbGFzczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQmFzZUJlZm9yZUFmdGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQmFzZUJlZm9yZUFmdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYxYjQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9CYXNlQmVmb3JlQWZ0ZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBCYXNlQmVmb3JlQWZ0ZXIKKyAgZXh0ZW5kcyBUZXN0T3JDb25maWd1cmF0aW9uCisgIGltcGxlbWVudHMgSUJhc2VCZWZvcmVBZnRlcgoreworICBwcml2YXRlIFN0cmluZ1tdIG1fcGFyYW1ldGVycyA9IHt9OworICBwcml2YXRlIGJvb2xlYW4gbV9hbHdheXNSdW4gPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1faW5oZXJpdEdyb3VwcyA9IHRydWU7CisgIHByaXZhdGUgU3RyaW5nW10gbV9iZWZvcmVHcm91cHMgPSB7fTsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX2FmdGVyR3JvdXBzID0ge307CisgIHByaXZhdGUgU3RyaW5nIG1fZGVzY3JpcHRpb247CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gbV9kZXNjcmlwdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIHRvIHNldAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgIG1fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFsd2F5c1J1bihib29sZWFuIGFsd2F5c1J1bikgeworICAgIG1fYWx3YXlzUnVuID0gYWx3YXlzUnVuOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SW5oZXJpdEdyb3Vwcyhib29sZWFuIGluaGVyaXRHcm91cHMpIHsKKyAgICBtX2luaGVyaXRHcm91cHMgPSBpbmhlcml0R3JvdXBzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1ldGVycykgeworICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIG1fcGFyYW1ldGVyczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBnZXRBbHdheXNSdW4oKSB7CisgICAgcmV0dXJuIG1fYWx3YXlzUnVuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGdldEluaGVyaXRHcm91cHMoKSB7CisgICAgcmV0dXJuIG1faW5oZXJpdEdyb3VwczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZnRlckdyb3VwcygpIHsKKyAgICByZXR1cm4gbV9hZnRlckdyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFmdGVyR3JvdXBzKFN0cmluZ1tdIGFmdGVyR3JvdXBzKSB7CisgICAgbV9hZnRlckdyb3VwcyA9IGFmdGVyR3JvdXBzOworICB9CisKKyAgcHVibGljIFN0cmluZ1tdIGdldEJlZm9yZUdyb3VwcygpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVHcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVHcm91cHMoU3RyaW5nW10gYmVmb3JlR3JvdXBzKSB7CisgICAgbV9iZWZvcmVHcm91cHMgPSBiZWZvcmVHcm91cHM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0JlZm9yZVN1aXRlQW5ub3RhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0JlZm9yZVN1aXRlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4NTRkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQmVmb3JlU3VpdGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVTdWl0ZUFubm90YXRpb24gZXh0ZW5kcyBCYXNlQmVmb3JlQWZ0ZXIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29uZmlndXJhdGlvbkFubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db25maWd1cmF0aW9uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZjJiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29uZmlndXJhdGlvbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDE4MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CisKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29uZmlndXJhdGlvbgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDE2LCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFubm90YXRpb24gZXh0ZW5kcyBUZXN0T3JDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLAorICAgIElCZWZvcmVTdWl0ZSwgSUFmdGVyU3VpdGUsCisgICAgSUJlZm9yZVRlc3QsIElBZnRlclRlc3QsCisgICAgSUJlZm9yZUdyb3VwcywgSUFmdGVyR3JvdXBzLAorICAgIElCZWZvcmVDbGFzcywgSUFmdGVyQ2xhc3MsCisgICAgSUJlZm9yZU1ldGhvZCwgSUFmdGVyTWV0aG9kIHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlVGVzdENsYXNzID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2FmdGVyVGVzdENsYXNzID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZVRlc3RNZXRob2QgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWZ0ZXJUZXN0TWV0aG9kID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZVRlc3QgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWZ0ZXJUZXN0ID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZVN1aXRlID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2FmdGVyU3VpdGUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX3BhcmFtZXRlcnMgPSB7fTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWx3YXlzUnVuID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2luaGVyaXRHcm91cHMgPSB0cnVlOworICBwcml2YXRlIFN0cmluZ1tdIG1fYmVmb3JlR3JvdXBzID0ge307CisgIHByaXZhdGUgU3RyaW5nW10gbV9hZnRlckdyb3VwcyA9IHt9OworICBwcml2YXRlIGJvb2xlYW4gbV9pc0Zha2VDb25maWd1cmF0aW9uOworICBwcml2YXRlIGJvb2xlYW4gbV9maXJzdFRpbWVPbmx5ID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2xhc3RUaW1lT25seSA9IGZhbHNlOworCisgIHB1YmxpYyBDb25maWd1cmF0aW9uQW5ub3RhdGlvbigpIHsKKworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWZ0ZXJTdWl0ZShib29sZWFuIGFmdGVyU3VpdGUpIHsKKyAgICBtX2FmdGVyU3VpdGUgPSBhZnRlclN1aXRlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWZ0ZXJUZXN0KGJvb2xlYW4gYWZ0ZXJUZXN0KSB7CisgICAgbV9hZnRlclRlc3QgPSBhZnRlclRlc3Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBZnRlclRlc3RDbGFzcyhib29sZWFuIGFmdGVyVGVzdENsYXNzKSB7CisgICAgbV9hZnRlclRlc3RDbGFzcyA9IGFmdGVyVGVzdENsYXNzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWZ0ZXJUZXN0TWV0aG9kKGJvb2xlYW4gYWZ0ZXJUZXN0TWV0aG9kKSB7CisgICAgbV9hZnRlclRlc3RNZXRob2QgPSBhZnRlclRlc3RNZXRob2Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbHdheXNSdW4oYm9vbGVhbiBhbHdheXNSdW4pIHsKKyAgICBtX2Fsd2F5c1J1biA9IGFsd2F5c1J1bjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEJlZm9yZVN1aXRlKGJvb2xlYW4gYmVmb3JlU3VpdGUpIHsKKyAgICBtX2JlZm9yZVN1aXRlID0gYmVmb3JlU3VpdGU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVUZXN0KGJvb2xlYW4gYmVmb3JlVGVzdCkgeworICAgIG1fYmVmb3JlVGVzdCA9IGJlZm9yZVRlc3Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVUZXN0Q2xhc3MoYm9vbGVhbiBiZWZvcmVUZXN0Q2xhc3MpIHsKKyAgICBtX2JlZm9yZVRlc3RDbGFzcyA9IGJlZm9yZVRlc3RDbGFzczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEJlZm9yZVRlc3RNZXRob2QoYm9vbGVhbiBiZWZvcmVUZXN0TWV0aG9kKSB7CisgICAgbV9iZWZvcmVUZXN0TWV0aG9kID0gYmVmb3JlVGVzdE1ldGhvZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEluaGVyaXRHcm91cHMoYm9vbGVhbiBpbmhlcml0R3JvdXBzKSB7CisgICAgbV9pbmhlcml0R3JvdXBzID0gaW5oZXJpdEdyb3VwczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFN0cmluZ1tdIHBhcmFtZXRlcnMpIHsKKyAgICBtX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGdldEJlZm9yZVRlc3RDbGFzcygpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVUZXN0Q2xhc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0QWZ0ZXJUZXN0Q2xhc3MoKSB7CisgICAgcmV0dXJuIG1fYWZ0ZXJUZXN0Q2xhc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0QmVmb3JlVGVzdE1ldGhvZCgpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVUZXN0TWV0aG9kOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGdldEFmdGVyVGVzdE1ldGhvZCgpIHsKKyAgICByZXR1cm4gbV9hZnRlclRlc3RNZXRob2Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0QmVmb3JlU3VpdGUoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlU3VpdGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0QWZ0ZXJTdWl0ZSgpIHsKKyAgICByZXR1cm4gbV9hZnRlclN1aXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGdldEJlZm9yZVRlc3QoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlVGVzdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBnZXRBZnRlclRlc3QoKSB7CisgICAgcmV0dXJuIG1fYWZ0ZXJUZXN0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBtX3BhcmFtZXRlcnM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0QWx3YXlzUnVuKCkgeworICAgIHJldHVybiBtX2Fsd2F5c1J1bjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBnZXRJbmhlcml0R3JvdXBzKCkgeworICAgIHJldHVybiBtX2luaGVyaXRHcm91cHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldEFmdGVyR3JvdXBzKCkgeworICAgIHJldHVybiBtX2FmdGVyR3JvdXBzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWZ0ZXJHcm91cHMoU3RyaW5nW10gYWZ0ZXJHcm91cHMpIHsKKyAgICBtX2FmdGVyR3JvdXBzID0gYWZ0ZXJHcm91cHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldEJlZm9yZUdyb3VwcygpIHsKKyAgICByZXR1cm4gbV9iZWZvcmVHcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVHcm91cHMoU3RyaW5nW10gYmVmb3JlR3JvdXBzKSB7CisgICAgbV9iZWZvcmVHcm91cHMgPSBiZWZvcmVHcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGYWtlQ29uZmlndXJhdGlvbihib29sZWFuIGIpIHsKKyAgICBtX2lzRmFrZUNvbmZpZ3VyYXRpb24gPSBiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzRmFrZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgcmV0dXJuIG1faXNGYWtlQ29uZmlndXJhdGlvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpcnN0VGltZU9ubHkoYm9vbGVhbiBmKSB7CisgICAgbV9maXJzdFRpbWVPbmx5ID0gZjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRmlyc3RUaW1lT25seSgpIHsKKyAgICByZXR1cm4gbV9maXJzdFRpbWVPbmx5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TGFzdFRpbWVPbmx5KGJvb2xlYW4gZikgeworICAgIG1fbGFzdFRpbWVPbmx5ID0gZjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzTGFzdFRpbWVPbmx5KCkgeworICAgIHJldHVybiBtX2xhc3RUaW1lT25seTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0NvbnZlcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwNmJkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIENvbnZlcnQgYSBzdHJpbmcgdmFsdWVzIGludG8gcHJpbWl0aXZlIHR5cGVzLgorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQ29udmVydGVyIHsKKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gIGdldEJvb2xlYW4oU3RyaW5nIHRhZ1ZhbHVlLCBib29sZWFuIGRlZikgeworICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVmOworICAgIGlmICh0YWdWYWx1ZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBCb29sZWFuLnZhbHVlT2YodGFnVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KFN0cmluZyB0YWdWYWx1ZSwgaW50IGRlZikgeworICAgIGludCByZXN1bHQgPSBkZWY7CisgICAgaWYgKHRhZ1ZhbHVlICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQodGFnVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyB0YWdWYWx1ZSwgU3RyaW5nIGRlZikgeworICAgIFN0cmluZyByZXN1bHQgPSBkZWY7CisgICAgaWYgKHRhZ1ZhbHVlICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdCA9IHRhZ1ZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoU3RyaW5nIHRhZ1ZhbHVlLCBsb25nIGRlZikgeworICAgIGxvbmcgcmVzdWx0ID0gZGVmOworICAgIGlmICh0YWdWYWx1ZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyh0YWdWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyB0YWdWYWx1ZSwgU3RyaW5nW10gZGVmKSB7CisgICAgU3RyaW5nW10gcmVzdWx0ID0gZGVmOworICAgIGlmICh0YWdWYWx1ZSAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBVdGlscy5zdHJpbmdUb0FycmF5KHRhZ1ZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldENsYXNzQXJyYXkoU3RyaW5nIHRhZ1ZhbHVlLCBDbGFzc1tdIGRlZikgeworICAgIENsYXNzW10gcmVzdWx0ID0gZGVmOworICAgIExpc3QgdlJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGlmICh0YWdWYWx1ZSAhPSBudWxsKSB7CisgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRhZ1ZhbHVlLCAiICwiKTsKKyAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgdlJlc3VsdC5hZGQoY2xzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzdWx0ID0gKENsYXNzW10pIHZSZXN1bHQudG9BcnJheShuZXcgQ2xhc3NbdlJlc3VsdC5zaXplKCldKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRDbGFzcyhTdHJpbmcgbmFtZWRQYXJhbWV0ZXIpIHsKKyAgICBDbGFzcyByZXN1bHQgPSBudWxsOworICAgIGlmIChuYW1lZFBhcmFtZXRlciAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBDbGFzc0hlbHBlci5mb3JOYW1lKG5hbWVkUGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9EYXRhUHJvdmlkZXJBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRGF0YVByb3ZpZGVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyOWYwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRGF0YVByb3ZpZGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSURhdGFQcm92aWRlckFubm90YXRpb247CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgSURhdGFQcm92aWRlci4KKyAqCisgKiBDcmVhdGVkIG9uIERlYyAyMCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVyQW5ub3RhdGlvbgorICBleHRlbmRzIEJhc2VBbm5vdGF0aW9uCisgIGltcGxlbWVudHMgSURhdGFQcm92aWRlckFubm90YXRpb24KK3sKKyAgcHJpdmF0ZSBTdHJpbmcgbV9uYW1lOworICBwcml2YXRlIGJvb2xlYW4gbV9wYXJhbGxlbDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNQYXJhbGxlbCgpIHsKKyAgICByZXR1cm4gbV9wYXJhbGxlbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRQYXJhbGxlbChib29sZWFuIHBhcmFsbGVsKSB7CisgICAgbV9wYXJhbGxlbCA9IHBhcmFsbGVsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbV9uYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBtX25hbWUgPSBuYW1lOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRGVmYXVsdEFubm90YXRpb25UcmFuc2Zvcm1lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0RlZmF1bHRBbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MmQwNTkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0RlZmF1bHRBbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklBbm5vdGF0aW9uVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRyYW5zZm9ybWVyCisgIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lcgoreworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0V4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTVkYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0V4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElFeHBlY3RlZEV4Y2VwdGlvbnMKKyAqCisgKiBDcmVhdGVkIG9uIERlYyAyMCwgMjAwNQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgY2xhc3MgRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbgorICBleHRlbmRzIEJhc2VBbm5vdGF0aW9uCisgIGltcGxlbWVudHMgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24KK3sKKyAgcHJpdmF0ZSBDbGFzc1tdIG1fdmFsdWUgPSB7fTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENsYXNzW10gZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIG1fdmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShDbGFzc1tdIHZhbHVlKSB7CisgICAgbV92YWx1ZSA9IHZhbHVlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRmFjdG9yeUFubm90YXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9GYWN0b3J5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MjQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRmFjdG9yeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklGYWN0b3J5QW5ub3RhdGlvbjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJRmFjdG9yeQorICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBGYWN0b3J5QW5ub3RhdGlvbgorICBleHRlbmRzIEJhc2VBbm5vdGF0aW9uCisgIGltcGxlbWVudHMgSUZhY3RvcnlBbm5vdGF0aW9uCit7CisgIHByaXZhdGUgU3RyaW5nW10gbV9wYXJhbWV0ZXJzID0ge307CisgIHByaXZhdGUgU3RyaW5nIG1fZGF0YVByb3ZpZGVyID0gbnVsbDsKKyAgcHJpdmF0ZSBDbGFzczw/PiBtX2RhdGFQcm92aWRlckNsYXNzOworICBwcml2YXRlIGJvb2xlYW4gbV9lbmFibGVkID0gdHJ1ZTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREYXRhUHJvdmlkZXIoKSB7CisgICAgcmV0dXJuIG1fZGF0YVByb3ZpZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldERhdGFQcm92aWRlcihTdHJpbmcgZGF0YVByb3ZpZGVyKSB7CisgICAgbV9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIG1fcGFyYW1ldGVyczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1ldGVycykgeworICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREYXRhUHJvdmlkZXJDbGFzcyhDbGFzczw/PiBkYXRhUHJvdmlkZXJDbGFzcykgeworICAgIG1fZGF0YVByb3ZpZGVyQ2xhc3MgPSBkYXRhUHJvdmlkZXJDbGFzczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGF0YVByb3ZpZGVyQ2xhc3MoKSB7CisgICAgcmV0dXJuIG1fZGF0YVByb3ZpZGVyQ2xhc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKyAgICByZXR1cm4gbV9lbmFibGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgbV9lbmFibGVkID0gZW5hYmxlZDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyQ2xhc3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQWZ0ZXJDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5ZjNiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyQ2xhc3MuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBJQWZ0ZXJDbGFzcyBleHRlbmRzIElCYXNlQmVmb3JlQWZ0ZXIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyR3JvdXBzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyR3JvdXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2EyMWM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQWZ0ZXJHcm91cHMuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBJQWZ0ZXJHcm91cHMgZXh0ZW5kcyBJQmFzZUJlZm9yZUFmdGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBZnRlck1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBZnRlck1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViNGIxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyTWV0aG9kLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUFmdGVyTWV0aG9kIGV4dGVuZHMgSUJhc2VCZWZvcmVBZnRlciB7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQWZ0ZXJTdWl0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBZnRlclN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU1M2M3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQWZ0ZXJTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElBZnRlclN1aXRlIGV4dGVuZHMgSUJhc2VCZWZvcmVBZnRlciB7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQWZ0ZXJUZXN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkN2YwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElBZnRlclRlc3QgZXh0ZW5kcyBJQmFzZUJlZm9yZUFmdGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBZnRlclRlc3RzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFmdGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTkwNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBZnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUFmdGVyVGVzdHMgZXh0ZW5kcyBJQmFzZUJlZm9yZUFmdGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uRmluZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFubm90YXRpb25GaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2U5MzJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uRmluZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUFubm90YXRpb247CisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGhvdyBhbm5vdGF0aW9ucyBhcmUgZm91bmQgb24gY2xhc3NlcywgbWV0aG9kcworICogYW5kIGNvbnN0cnVjdG9ycy4gIEl0IHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgYm90aCBKREsgMS40IGFuZCBKREsgNQorICogYW5ub3RhdGlvbiBmaW5kZXJzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkZpbmRlciB7CisKKyAgLyoqCisgICAqIEBwYXJhbSBjbHMKKyAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcworICAgKiBAcmV0dXJuIFRoZSBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcyBvciBudWxsIGlmIG5vbmUgZm91bmQuCisgICAqLworICBwdWJsaWMgPEEgZXh0ZW5kcyBJQW5ub3RhdGlvbj4gQSBmaW5kQW5ub3RhdGlvbihDbGFzczw/PiBjbHMsIENsYXNzPEE+IGFubm90YXRpb25DbGFzcyk7CisKKyAgLyoqCisgICAqIEBwYXJhbSBtCisgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MKKyAgICogQHJldHVybiBUaGUgYW5ub3RhdGlvbiBvbiB0aGUgbWV0aG9kLgorICAgKiBJZiBub3QgZm91bmQsIHJldHVybiB0aGUgYW5ub3RhdGlvbiBvbiB0aGUgZGVjbGFyaW5nIGNsYXNzLgorICAgKiBJZiBub3QgZm91bmQsIHJldHVybiBudWxsLgorICAgKi8KKyAgcHVibGljIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oTWV0aG9kIG0sIENsYXNzPEE+IGFubm90YXRpb25DbGFzcyk7CisgIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oSVRlc3ROR01ldGhvZCBtLCBDbGFzczxBPiBhbm5vdGF0aW9uQ2xhc3MpOworCisgIC8qKgorICAgKiBAcGFyYW0gY29ucworICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzCisgICAqIEByZXR1cm4gVGhlIGFubm90YXRpb24gb24gdGhlIG1ldGhvZC4KKyAgICogSWYgbm90IGZvdW5kLCByZXR1cm4gdGhlIGFubm90YXRpb24gb24gdGhlIGRlY2xhcmluZyBjbGFzcy4KKyAgICogSWYgbm90IGZvdW5kLCByZXR1cm4gbnVsbC4KKyAgICovCisgIHB1YmxpYyA8QSBleHRlbmRzIElBbm5vdGF0aW9uPiBBIGZpbmRBbm5vdGF0aW9uKENvbnN0cnVjdG9yPD8+IGNvbnMsIENsYXNzPEE+IGFubm90YXRpb25DbGFzcyk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRoIHBhcmFtZXRlciBvZiB0aGUgZ2l2ZW4gbWV0aG9kIGhhcyB0aGUgYW5ub3RhdGlvbiBAVGVzdEluc3RhbmNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzVGVzdEluc3RhbmNlKE1ldGhvZCBtZXRob2QsIGludCBpKTsKKworICAvKioKKyAgICogQHJldHVybiB0aGUgQE9wdGlvbmFsIHZhbHVlcyBvZiB0aGlzIG1ldGhvZCdzIHBhcmFtZXRlcnMgKDxjb2RlPm51bGw8L2NvZGU+CisgICAqIGlmIHRoZSBwYXJhbWV0ZXIgaXNuJ3Qgb3B0aW9uYWwpCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZmluZE9wdGlvbmFsVmFsdWVzKE1ldGhvZCBtZXRob2QpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBAT3B0aW9uYWwgdmFsdWVzIG9mIHRoaXMgbWV0aG9kJ3MgcGFyYW1ldGVycyAoPGNvZGU+bnVsbDwvY29kZT4KKyAgICogaWYgdGhlIHBhcmFtZXRlciBpc24ndCBvcHRpb25hbCkKKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBmaW5kT3B0aW9uYWxWYWx1ZXMoQ29uc3RydWN0b3IgY3Rvcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUFubm90YXRpb25UcmFuc2Zvcm1lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDFhMmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworLyoqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqLworcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIGV4dGVuZHMgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyIHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lCYXNlQmVmb3JlQWZ0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmFzZUJlZm9yZUFmdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE1NWRiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmFzZUJlZm9yZUFmdGVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdE9yQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgSUJlZm9yZVN1aXRlLCBJQWZ0ZXJTdWl0ZSwgZXRjLi4uCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEBzaW5jZSBKdW4gMjIsIDIwMDYKKyAqLworcHVibGljIGludGVyZmFjZSBJQmFzZUJlZm9yZUFmdGVyIGV4dGVuZHMgSVRlc3RPckNvbmZpZ3VyYXRpb24geworICAvKioKKyAgICogV2hldGhlciBtZXRob2RzIG9uIHRoaXMgY2xhc3MvbWV0aG9kIGFyZSBlbmFibGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBncm91cHMgdGhpcyBjbGFzcy9tZXRob2QgYmVsb25ncyB0by4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBnZXRHcm91cHMoKTsKKworICAvKioKKyAgICogVGhlIGxpc3Qgb2YgZ3JvdXBzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBFdmVyeSBtZXRob2QKKyAgICogbWVtYmVyIG9mIG9uZSBvZiB0aGVzZSBncm91cHMgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICogaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QuICBGdXJ0aGVybW9yZSwgaWYgYW55IG9mIHRoZXNlCisgICAqIG1ldGhvZHMgd2FzIG5vdCBhIFNVQ0NFU1MsIHRoaXMgdGVzdCBtZXRob2Qgd2lsbCBub3QgYmUKKyAgICogcnVuIGFuZCB3aWxsIGJlIGZsYWdnZWQgYXMgYSBTS0lQLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIGdldERlcGVuZHNPbkdyb3VwcygpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24uICBUaGVyZSBpcyBubyBndWFyYW50ZWUKKyAgICogb24gdGhlIG9yZGVyIG9uIHdoaWNoIHRoZSBtZXRob2RzIGRlcGVuZGVkIHVwb24gd2lsbCBiZSBydW4sIGJ1dCB5b3UKKyAgICogYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIHRlc3QgbWV0aG9kCisgICAqIHRoYXQgY29udGFpbnMgdGhpcyBhbm5vdGF0aW9uIGlzIHJ1bi4gIEZ1cnRoZXJtb3JlLCBpZiBhbnkgb2YgdGhlc2UKKyAgICogbWV0aG9kcyB3YXMgbm90IGEgU1VDQ0VTUywgdGhpcyB0ZXN0IG1ldGhvZCB3aWxsIG5vdCBiZQorICAgKiBydW4gYW5kIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFNLSVAuCisgICAqCisgICAqICBJZiBzb21lIG9mIHRoZXNlIG1ldGhvZHMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQsIGFsbCB0aGUgb3ZlcmxvYWRlZAorICAgKiAgdmVyc2lvbnMgd2lsbCBiZSBydW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVwZW5kc09uTWV0aG9kcygpOworCisgIC8qKgorICAgKiAgRm9yIGJlZm9yZSBtZXRob2RzIChiZWZvcmVTdWl0ZSwgYmVmb3JlVGVzdCwgYmVmb3JlVGVzdENsYXNzIGFuZAorICAgKiAgYmVmb3JlVGVzdE1ldGhvZCwgYnV0IG5vdCBiZWZvcmVHcm91cHMpOgorICAgKiAgSWYgc2V0IHRvIHRydWUsIHRoaXMgY29uZmlndXJhdGlvbiBtZXRob2Qgd2lsbCBiZSBydW4KKyAgICogIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBncm91cHMgaXQgYmVsb25ncyB0by4KKyAgICogIDxicj4KKyAgICogRm9yIGFmdGVyIG1ldGhvZHMgKGFmdGVyU3VpdGUsIGFmdGVyQ2xhc3MsIC4uLik6CisgICAqICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBjb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlIHJ1bgorICAgKiAgZXZlbiBpZiBvbmUgb3IgbW9yZSBtZXRob2RzIGludm9rZWQgcHJldmlvdXNseSBmYWlsZWQgb3IKKyAgICogIHdhcyBza2lwcGVkLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0QWx3YXlzUnVuKCk7CisKKyAgLyoqCisgICAqIElmIHRydWUsIHRoaXMgJiM2NDtDb25maWd1cmF0aW9uIG1ldGhvZCB3aWxsIGJlbG9uZyB0byBncm91cHMgc3BlY2lmaWVkIGluIHRoZQorICAgKiAmIzY0O1Rlc3QgYW5ub3RhdGlvbiBvbiB0aGUgY2xhc3MgKGlmIGFueSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBnZXRJbmhlcml0R3JvdXBzKCk7CisKKyAgLyoqCisgICAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBtZXRob2QuICBUaGUgc3RyaW5nIHVzZWQgd2lsbCBhcHBlYXIgaW4gdGhlCisgICAqIEhUTUwgcmVwb3J0IGFuZCBhbHNvIG9uIHN0YW5kYXJkIG91dHB1dCBpZiB2ZXJib3NlID49IDIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlQ2xhc3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNGU0NzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lCZWZvcmVDbGFzcy5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElCZWZvcmVDbGFzcyBleHRlbmRzIElCYXNlQmVmb3JlQWZ0ZXIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUJlZm9yZUdyb3Vwcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lCZWZvcmVHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDgwZDYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lCZWZvcmVHcm91cHMuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBJQmVmb3JlR3JvdXBzIGV4dGVuZHMgSUJhc2VCZWZvcmVBZnRlciB7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlTWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUJlZm9yZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwYjlmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUJlZm9yZU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElCZWZvcmVNZXRob2QgZXh0ZW5kcyBJQmFzZUJlZm9yZUFmdGVyIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlU3VpdGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWQyZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lCZWZvcmVTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElCZWZvcmVTdWl0ZSBleHRlbmRzIElCYXNlQmVmb3JlQWZ0ZXIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUJlZm9yZVRlc3QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JQmVmb3JlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlNjQxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUJlZm9yZVRlc3QuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBJQmVmb3JlVGVzdCBleHRlbmRzIElCYXNlQmVmb3JlQWZ0ZXIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSURhdGFQcm92aWRhYmxlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSURhdGFQcm92aWRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3MGUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JRGF0YVByb3ZpZGFibGUuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKKy8qKgorICogQSB0cmFpdCBzaGFyZWQgYnkgYWxsIHRoZSBhbm5vdGF0aW9ucyB0aGF0IGhhdmUgZGF0YVByb3ZpZGVyL2RhdGFQcm92aWRlckNsYXNzIGF0dHJpYnV0ZXMuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSURhdGFQcm92aWRhYmxlIHsKKyAgcHVibGljIFN0cmluZyBnZXREYXRhUHJvdmlkZXIoKTsKKyAgcHVibGljIHZvaWQgc2V0RGF0YVByb3ZpZGVyKFN0cmluZyB2KTsKKworICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGF0YVByb3ZpZGVyQ2xhc3MoKTsKKyAgcHVibGljIHZvaWQgc2V0RGF0YVByb3ZpZGVyQ2xhc3MoQ2xhc3M8Pz4gdik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSUxpc3RlbmVycy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lMaXN0ZW5lcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM3NzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lMaXN0ZW5lcnMuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUxpc3RlbmVyc0Fubm90YXRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgSUxpc3RlbmVycyBleHRlbmRzIElMaXN0ZW5lcnNBbm5vdGF0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lUZXN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNmY1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0lUZXN0LmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0QW5ub3RhdGlvbjsKKworcHVibGljIGludGVyZmFjZSBJVGVzdCBleHRlbmRzIElUZXN0QW5ub3RhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9KREsxNUFubm90YXRpb25GaW5kZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9KREsxNUFubm90YXRpb25GaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMWI5MzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0pESzE1QW5ub3RhdGlvbkZpbmRlci5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuSUFubm90YXRpb25UcmFuc2Zvcm1lcjI7CitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMzsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5FeHBlY3RlZEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRGF0YVByb3ZpZGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUxpc3RlbmVyc0Fubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JT2JqZWN0RmFjdG9yeUFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JUGFyYW1ldGVyc0Fubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5PYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmNvbGxlY3Rpb25zLlBhaXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIElBbm5vdGF0aW9uRmluZGVyIHdpdGggSkRLNSBhbm5vdGF0aW9ucworICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBKREsxNUFubm90YXRpb25GaW5kZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkZpbmRlciB7CisgIHByaXZhdGUgSkRLMTVUYWdGYWN0b3J5IG1fdGFnRmFjdG9yeSA9IG5ldyBKREsxNVRhZ0ZhY3RvcnkoKTsKKyAgcHJpdmF0ZSBNYXA8Q2xhc3M8PyBleHRlbmRzIElBbm5vdGF0aW9uPiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBtX2Fubm90YXRpb25NYXAgPQorICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgcHJpdmF0ZSBNYXA8UGFpcjxBbm5vdGF0aW9uLCA/PiwgSUFubm90YXRpb24+IG1fYW5ub3RhdGlvbnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgIHByaXZhdGUgSUFubm90YXRpb25UcmFuc2Zvcm1lciBtX3RyYW5zZm9ybWVyID0gbnVsbDsKKworICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgIHB1YmxpYyBKREsxNUFubm90YXRpb25GaW5kZXIoSUFubm90YXRpb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgIG1fdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElMaXN0ZW5lcnNBbm5vdGF0aW9uLmNsYXNzLCBMaXN0ZW5lcnMuY2xhc3MpOworICAgIG1fYW5ub3RhdGlvbk1hcC5wdXQoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmNsYXNzLCBDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElEYXRhUHJvdmlkZXJBbm5vdGF0aW9uLmNsYXNzLCBEYXRhUHJvdmlkZXIuY2xhc3MpOworICAgIG1fYW5ub3RhdGlvbk1hcC5wdXQoSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uY2xhc3MsIEV4cGVjdGVkRXhjZXB0aW9ucy5jbGFzcyk7CisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJRmFjdG9yeUFubm90YXRpb24uY2xhc3MsIEZhY3RvcnkuY2xhc3MpOworICAgIG1fYW5ub3RhdGlvbk1hcC5wdXQoSU9iamVjdEZhY3RvcnlBbm5vdGF0aW9uLmNsYXNzLCBPYmplY3RGYWN0b3J5LmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElQYXJhbWV0ZXJzQW5ub3RhdGlvbi5jbGFzcywgUGFyYW1ldGVycy5jbGFzcyk7CisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJVGVzdEFubm90YXRpb24uY2xhc3MsIFRlc3QuY2xhc3MpOworICAgIC8vIGludGVybmFsCisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJQmVmb3JlU3VpdGUuY2xhc3MsIEJlZm9yZVN1aXRlLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElBZnRlclN1aXRlLmNsYXNzLCBBZnRlclN1aXRlLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElCZWZvcmVUZXN0LmNsYXNzLCBCZWZvcmVUZXN0LmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElBZnRlclRlc3QuY2xhc3MsIEFmdGVyVGVzdC5jbGFzcyk7CisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJQmVmb3JlQ2xhc3MuY2xhc3MsIEJlZm9yZUNsYXNzLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElBZnRlckNsYXNzLmNsYXNzLCBBZnRlckNsYXNzLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElCZWZvcmVHcm91cHMuY2xhc3MsIEJlZm9yZUdyb3Vwcy5jbGFzcyk7CisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJQWZ0ZXJHcm91cHMuY2xhc3MsIEFmdGVyR3JvdXBzLmNsYXNzKTsKKyAgICBtX2Fubm90YXRpb25NYXAucHV0KElCZWZvcmVNZXRob2QuY2xhc3MsIEJlZm9yZU1ldGhvZC5jbGFzcyk7CisgICAgbV9hbm5vdGF0aW9uTWFwLnB1dChJQWZ0ZXJNZXRob2QuY2xhc3MsIEFmdGVyTWV0aG9kLmNsYXNzKTsKKyAgfQorCisgIHByaXZhdGUgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBBIGZpbmRBbm5vdGF0aW9uSW5TdXBlckNsYXNzZXMoQ2xhc3M8Pz4gY2xzLCBDbGFzczxBPiBhKSB7CisgICAgLy8gSGFjayBmb3IgQExpc3RlbmVyczogd2UgZG9uJ3QgbG9vayBpbiBzdXBlcmNsYXNzZXMgZm9yIHRoaXMgYW5ub3RhdGlvbgorICAgIC8vIGJlY2F1c2UgaW5oZXJpdGFuY2Ugb2YgdGhpcyBhbm5vdGF0aW9uIGNhdXNlcyBhZ2dyZWdhdGlvbiBpbnN0ZWFkIG9mCisgICAgLy8gb3ZlcnJpZGluZworICAgIGlmIChhLmVxdWFscyhvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVycy5jbGFzcykpIHsKKyAgICAgIHJldHVybiBjbHMuZ2V0QW5ub3RhdGlvbihhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgQSByZXN1bHQgPSBjbHMuZ2V0QW5ub3RhdGlvbihhKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oTWV0aG9kIG0sIENsYXNzPEE+IGFubm90YXRpb25DbGFzcykgeworICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhID0gbV9hbm5vdGF0aW9uTWFwLmdldChhbm5vdGF0aW9uQ2xhc3MpOworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkphdmEgQEFubm90YXRpb24gY2xhc3MgZm9yICciCisgICAgICAgICAgKyBhbm5vdGF0aW9uQ2xhc3MgKyAiJyBub3QgZm91bmQuIik7CisgICAgfQorICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG0uZ2V0QW5ub3RhdGlvbihhKTsKKyAgICByZXR1cm4gZmluZEFubm90YXRpb24obS5nZXREZWNsYXJpbmdDbGFzcygpLCBhbm5vdGF0aW9uLCBhbm5vdGF0aW9uQ2xhc3MsIG51bGwsIG51bGwsIG0sCisgICAgICAgIG5ldyBQYWlyPD4oYW5ub3RhdGlvbiwgbSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyA8QSBleHRlbmRzIElBbm5vdGF0aW9uPiBBIGZpbmRBbm5vdGF0aW9uKElUZXN0TkdNZXRob2QgdG0sIENsYXNzPEE+IGFubm90YXRpb25DbGFzcykgeworICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhID0gbV9hbm5vdGF0aW9uTWFwLmdldChhbm5vdGF0aW9uQ2xhc3MpOworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkphdmEgQEFubm90YXRpb24gY2xhc3MgZm9yICciCisgICAgICAgICAgICArIGFubm90YXRpb25DbGFzcyArICInIG5vdCBmb3VuZC4iKTsKKyAgICB9CisgICAgTWV0aG9kIG0gPSB0bS5nZXRNZXRob2QoKTsKKyAgICBDbGFzczw/PiB0ZXN0Q2xhc3M7CisgICAgaWYgKHRtLmdldEluc3RhbmNlKCkgPT0gbnVsbCkgeworICAgICAgdGVzdENsYXNzID0gbS5nZXREZWNsYXJpbmdDbGFzcygpOworICAgIH0gZWxzZSB7CisgICAgICB0ZXN0Q2xhc3MgPSB0bS5nZXRJbnN0YW5jZSgpLmdldENsYXNzKCk7CisgICAgfQorICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG0uZ2V0QW5ub3RhdGlvbihhKTsKKyAgICBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7CisgICAgICBhbm5vdGF0aW9uID0gdGVzdENsYXNzLmdldEFubm90YXRpb24oYSk7CisgICAgfQorICAgIHJldHVybiBmaW5kQW5ub3RhdGlvbih0ZXN0Q2xhc3MsIGFubm90YXRpb24sIGFubm90YXRpb25DbGFzcywgbnVsbCwgbnVsbCwgbSwKKyAgICAgICAgbmV3IFBhaXI8Pihhbm5vdGF0aW9uLCBtKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdHJhbnNmb3JtKElBbm5vdGF0aW9uIGEsIENsYXNzPD8+IHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yPD8+IHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpICB7CisgICAgLy8KKyAgICAvLyBUcmFuc2Zvcm0gQFRlc3QKKyAgICAvLworICAgIGlmIChhIGluc3RhbmNlb2YgSVRlc3RBbm5vdGF0aW9uKSB7CisgICAgICBtX3RyYW5zZm9ybWVyLnRyYW5zZm9ybSgoSVRlc3RBbm5vdGF0aW9uKSBhLCB0ZXN0Q2xhc3MsIHRlc3RDb25zdHJ1Y3RvciwgdGVzdE1ldGhvZCk7CisgICAgfQorCisgICAgZWxzZSBpZiAobV90cmFuc2Zvcm1lciBpbnN0YW5jZW9mIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIyKSB7CisgICAgICBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMiB0cmFuc2Zvcm1lcjIgPSAoSUFubm90YXRpb25UcmFuc2Zvcm1lcjIpIG1fdHJhbnNmb3JtZXI7CisKKyAgICAgIC8vCisgICAgICAvLyBUcmFuc2Zvcm0gYSBjb25maWd1cmF0aW9uIGFubm90YXRpb24KKyAgICAgIC8vCisgICAgICBpZiAoYSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgeworICAgICAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gY29uZmlndXJhdGlvbiA9IChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIGE7CisgICAgICAgIHRyYW5zZm9ybWVyMi50cmFuc2Zvcm0oY29uZmlndXJhdGlvbix0ZXN0Q2xhc3MsIHRlc3RDb25zdHJ1Y3RvciwgdGVzdE1ldGhvZCk7CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBUcmFuc2Zvcm0gQERhdGFQcm92aWRlcgorICAgICAgLy8KKyAgICAgIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbikgeworICAgICAgICB0cmFuc2Zvcm1lcjIudHJhbnNmb3JtKChJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbikgYSwgdGVzdE1ldGhvZCk7CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBUcmFuc2Zvcm0gQEZhY3RvcnkKKyAgICAgIC8vCisgICAgICBlbHNlIGlmIChhIGluc3RhbmNlb2YgSUZhY3RvcnlBbm5vdGF0aW9uKSB7CisgICAgICAgIHRyYW5zZm9ybWVyMi50cmFuc2Zvcm0oKElGYWN0b3J5QW5ub3RhdGlvbikgYSwgdGVzdE1ldGhvZCk7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKG1fdHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMykgeworICAgICAgICBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMyB0cmFuc2Zvcm1lciA9IChJQW5ub3RhdGlvblRyYW5zZm9ybWVyMykgbV90cmFuc2Zvcm1lcjsKKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gQExpc3RlbmVycworICAgICAgICAvLworICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIElMaXN0ZW5lcnNBbm5vdGF0aW9uKSB7CisgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKChJTGlzdGVuZXJzQW5ub3RhdGlvbilhLCB0ZXN0Q2xhc3MpOworICAgICAgICB9CisgICAgICB9IC8vIEVuZCBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMworICAgIH0gLy8gRW5kIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIyCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oQ2xhc3M8Pz4gY2xzLCBDbGFzczxBPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYSA9IG1fYW5ub3RhdGlvbk1hcC5nZXQoYW5ub3RhdGlvbkNsYXNzKTsKKyAgICBpZiAoYSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKYXZhIEBBbm5vdGF0aW9uIGNsYXNzIGZvciAnIgorICAgICAgICAgICsgYW5ub3RhdGlvbkNsYXNzICsgIicgbm90IGZvdW5kLiIpOworICAgIH0KKyAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBmaW5kQW5ub3RhdGlvbkluU3VwZXJDbGFzc2VzKGNscywgYSk7CisgICAgcmV0dXJuIGZpbmRBbm5vdGF0aW9uKGNscywgYW5ub3RhdGlvbiwgYW5ub3RhdGlvbkNsYXNzLCBjbHMsIG51bGwsIG51bGwsCisgICAgICAgIG5ldyBQYWlyPD4oYW5ub3RhdGlvbiwgYW5ub3RhdGlvbkNsYXNzKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oQ29uc3RydWN0b3I8Pz4gY29ucywgQ2xhc3M8QT4gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGEgPSBtX2Fubm90YXRpb25NYXAuZ2V0KGFubm90YXRpb25DbGFzcyk7CisgICAgaWYgKGEgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSmF2YSBAQW5ub3RhdGlvbiBjbGFzcyBmb3IgJyIKKyAgICAgICAgICArIGFubm90YXRpb25DbGFzcyArICInIG5vdCBmb3VuZC4iKTsKKyAgICB9CisgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gY29ucy5nZXRBbm5vdGF0aW9uKGEpOworICAgIHJldHVybiBmaW5kQW5ub3RhdGlvbihjb25zLmdldERlY2xhcmluZ0NsYXNzKCksIGFubm90YXRpb24sIGFubm90YXRpb25DbGFzcywgbnVsbCwgY29ucywgbnVsbCwKKyAgICAgICAgbmV3IFBhaXI8Pihhbm5vdGF0aW9uLCBjb25zKSk7CisgIH0KKworICBwcml2YXRlIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgZmluZEFubm90YXRpb24oQ2xhc3MgY2xzLCBBbm5vdGF0aW9uIGEsCisgICAgICBDbGFzczxBPiBhbm5vdGF0aW9uQ2xhc3MsIENsYXNzPD8+IHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yPD8+IHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QsIFBhaXI8QW5ub3RhdGlvbiwgPz4gcCkgeworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIElBbm5vdGF0aW9uIHJlc3VsdCA9IG1fYW5ub3RhdGlvbnMuZ2V0KHApOworICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgcmVzdWx0ID0gbV90YWdGYWN0b3J5LmNyZWF0ZVRhZyhjbHMsIGEsIGFubm90YXRpb25DbGFzcywgbV90cmFuc2Zvcm1lcik7CisgICAgICBtX2Fubm90YXRpb25zLnB1dChwLCByZXN1bHQpOworICAgICAgdHJhbnNmb3JtKHJlc3VsdCwgdGVzdENsYXNzLCB0ZXN0Q29uc3RydWN0b3IsIHRlc3RNZXRob2QpOworICAgIH0KKyAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICByZXR1cm4gKEEpIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNUZXN0SW5zdGFuY2UoTWV0aG9kIG1ldGhvZCwgaW50IGkpIHsKKyAgICBmaW5hbCBBbm5vdGF0aW9uW11bXSBhbm5vdGF0aW9ucyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPiAwICYmIGFubm90YXRpb25zW2ldLmxlbmd0aCA+IDApIHsKKyAgICAgIGZpbmFsIEFubm90YXRpb25bXSBwYSA9IGFubm90YXRpb25zW2ldOworICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBwYSkgeworICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIFRlc3RJbnN0YW5jZSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZmluZE9wdGlvbmFsVmFsdWVzKE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gb3B0aW9uYWxWYWx1ZXMobWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBmaW5kT3B0aW9uYWxWYWx1ZXMoQ29uc3RydWN0b3IgbWV0aG9kKSB7CisgICAgcmV0dXJuIG9wdGlvbmFsVmFsdWVzKG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gb3B0aW9uYWxWYWx1ZXMoQW5ub3RhdGlvbltdW10gYW5ub3RhdGlvbnMpIHsKKyAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2Fubm90YXRpb25zLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBhbm5vdGF0aW9uc1tpXSkgeworICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIE9wdGlvbmFsKSB7CisgICAgICAgICAgcmVzdWx0W2ldID0gKChPcHRpb25hbClhKS52YWx1ZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9KREsxNVRhZ0ZhY3RvcnkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9KREsxNVRhZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42M2Q0MTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL0pESzE1VGFnRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTMzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJUZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRXhwZWN0ZWRFeGNlcHRpb25zOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSURhdGFQcm92aWRlckFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklGYWN0b3J5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklMaXN0ZW5lcnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSU9iamVjdEZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVBhcmFtZXRlcnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCisvKioKKyAqIFRoaXMgY2xhc3MgY3JlYXRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgSUFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBKREs1CisgKiBhbm5vdGF0aW9uIHRoYXQgd2FzIGZvdW5kIG9uIHRoZSBKYXZhIGVsZW1lbnQuCisgKgorICogQ3JlYXRlZCBvbiBEZWMgMjAsIDIwMDUKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqLworcHVibGljIGNsYXNzIEpESzE1VGFnRmFjdG9yeSB7CisKKyAgcHVibGljIDxBIGV4dGVuZHMgSUFubm90YXRpb24+IEEgY3JlYXRlVGFnKENsYXNzPD8+IGNscywgQW5ub3RhdGlvbiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8QT4gYW5ub3RhdGlvbkNsYXNzLCBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgSUFubm90YXRpb24gcmVzdWx0ID0gbnVsbDsKKworICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmNsYXNzKSB7CisgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGFubm90YXRpb25DbGFzcyA9PSBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbi5jbGFzcykgeworICAgICAgICByZXN1bHQgPSBjcmVhdGVEYXRhUHJvdmlkZXJUYWcoYSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24uY2xhc3MpIHsKKyAgICAgICAgcmVzdWx0ID0gY3JlYXRlRXhwZWN0ZWRFeGNlcHRpb25zVGFnKGEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElGYWN0b3J5QW5ub3RhdGlvbi5jbGFzcykgeworICAgICAgICByZXN1bHQgPSBjcmVhdGVGYWN0b3J5VGFnKGNscywgYSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSVBhcmFtZXRlcnNBbm5vdGF0aW9uLmNsYXNzKSB7CisgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcmFtZXRlcnNUYWcoYSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSU9iamVjdEZhY3RvcnlBbm5vdGF0aW9uLmNsYXNzKSB7CisgICAgICAgIHJlc3VsdCA9IGNyZWF0ZU9iamVjdEZhY3RvcnlUYWcoYSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSVRlc3RBbm5vdGF0aW9uLmNsYXNzKSB7CisgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRlc3RUYWcoY2xzLCBhLCB0cmFuc2Zvcm1lcik7CisgICAgICB9CisgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUxpc3RlbmVyc0Fubm90YXRpb24uY2xhc3MpIHsKKyAgICAgICAgcmVzdWx0ID0gY3JlYXRlTGlzdGVuZXJzVGFnKGNscywgYSwgdHJhbnNmb3JtZXIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElCZWZvcmVTdWl0ZS5jbGFzcyB8fCBhbm5vdGF0aW9uQ2xhc3MgPT0gSUFmdGVyU3VpdGUuY2xhc3MgfHwKKyAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MgPT0gSUJlZm9yZVRlc3QuY2xhc3MgfHwgYW5ub3RhdGlvbkNsYXNzID09IElBZnRlclRlc3QuY2xhc3MgfHwKKyAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MgPT0gSUJlZm9yZUdyb3Vwcy5jbGFzcyB8fCBhbm5vdGF0aW9uQ2xhc3MgPT0gSUFmdGVyR3JvdXBzLmNsYXNzIHx8CisgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzID09IElCZWZvcmVDbGFzcy5jbGFzcyB8fCBhbm5vdGF0aW9uQ2xhc3MgPT0gSUFmdGVyQ2xhc3MuY2xhc3MgfHwKKyAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MgPT0gSUJlZm9yZU1ldGhvZC5jbGFzcyB8fCBhbm5vdGF0aW9uQ2xhc3MgPT0gSUFmdGVyTWV0aG9kLmNsYXNzKQorICAgICAgeworICAgICAgICByZXN1bHQgPSBtYXliZUNyZWF0ZU5ld0NvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLCBhbm5vdGF0aW9uQ2xhc3MpOworICAgICAgfQorCisgICAgICBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiVW5rbm93biBhbm5vdGF0aW9uIHJlcXVlc3RlZDoiICsgYW5ub3RhdGlvbkNsYXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICByZXR1cm4gKEEpIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgSUFubm90YXRpb24gbWF5YmVDcmVhdGVOZXdDb25maWd1cmF0aW9uVGFnKENsYXNzPD8+IGNscywgQW5ub3RhdGlvbiBhLAorICAgICAgQ2xhc3M8Pz4gYW5ub3RhdGlvbkNsYXNzKQorICB7CisgICAgSUFubm90YXRpb24gcmVzdWx0ID0gbnVsbDsKKworICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUJlZm9yZVN1aXRlLmNsYXNzKSB7CisgICAgICBCZWZvcmVTdWl0ZSBicyA9IChCZWZvcmVTdWl0ZSkgYTsKKyAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLAorICAgICAgICAgIHRydWUsIGZhbHNlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMuYWx3YXlzUnVuKCksCisgICAgICAgICAgYnMuZGVwZW5kc09uR3JvdXBzKCksIGJzLmRlcGVuZHNPbk1ldGhvZHMoKSwKKyAgICAgICAgICBicy5kZXNjcmlwdGlvbigpLCBicy5lbmFibGVkKCksIGJzLmdyb3VwcygpLAorICAgICAgICAgIGJzLmluaGVyaXRHcm91cHMoKSwgbnVsbCwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMudGltZU91dCgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElBZnRlclN1aXRlLmNsYXNzKSB7CisgICAgICBBZnRlclN1aXRlIGJzID0gKEFmdGVyU3VpdGUpIGE7CisgICAgICByZXN1bHQgPSBjcmVhdGVDb25maWd1cmF0aW9uVGFnKGNscywgYSwKKyAgICAgICAgICBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGJzLmFsd2F5c1J1bigpLAorICAgICAgICAgIGJzLmRlcGVuZHNPbkdyb3VwcygpLCBicy5kZXBlbmRzT25NZXRob2RzKCksCisgICAgICAgICAgYnMuZGVzY3JpcHRpb24oKSwgYnMuZW5hYmxlZCgpLCBicy5ncm91cHMoKSwKKyAgICAgICAgICBicy5pbmhlcml0R3JvdXBzKCksIG51bGwsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGJzLnRpbWVPdXQoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFubm90YXRpb25DbGFzcyA9PSBJQmVmb3JlVGVzdC5jbGFzcykgeworICAgICAgQmVmb3JlVGVzdCBicyA9IChCZWZvcmVUZXN0KSBhOworICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZmlndXJhdGlvblRhZyhjbHMsIGEsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIHRydWUsIGZhbHNlLAorICAgICAgICAgIG5ldyBTdHJpbmdbMF0sIG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBicy5hbHdheXNSdW4oKSwKKyAgICAgICAgICBicy5kZXBlbmRzT25Hcm91cHMoKSwgYnMuZGVwZW5kc09uTWV0aG9kcygpLAorICAgICAgICAgIGJzLmRlc2NyaXB0aW9uKCksIGJzLmVuYWJsZWQoKSwgYnMuZ3JvdXBzKCksCisgICAgICAgICAgYnMuaW5oZXJpdEdyb3VwcygpLCBudWxsLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBicy50aW1lT3V0KCkpOworICAgIH0KKyAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUFmdGVyVGVzdC5jbGFzcykgeworICAgICAgQWZ0ZXJUZXN0IGJzID0gKEFmdGVyVGVzdCkgYTsKKyAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICBuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMuYWx3YXlzUnVuKCksCisgICAgICAgICAgYnMuZGVwZW5kc09uR3JvdXBzKCksIGJzLmRlcGVuZHNPbk1ldGhvZHMoKSwKKyAgICAgICAgICBicy5kZXNjcmlwdGlvbigpLCBicy5lbmFibGVkKCksIGJzLmdyb3VwcygpLAorICAgICAgICAgIGJzLmluaGVyaXRHcm91cHMoKSwgbnVsbCwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMudGltZU91dCgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElCZWZvcmVHcm91cHMuY2xhc3MpIHsKKyAgICAgIEJlZm9yZUdyb3VwcyBicyA9IChCZWZvcmVHcm91cHMpIGE7CisgICAgICBmaW5hbCBTdHJpbmdbXSBncm91cHM9IGJzLnZhbHVlKCkubGVuZ3RoID4gMCA/IGJzLnZhbHVlKCkgOiBicy5ncm91cHMoKTsKKyAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgZ3JvdXBzLCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMuYWx3YXlzUnVuKCksCisgICAgICAgICAgYnMuZGVwZW5kc09uR3JvdXBzKCksIGJzLmRlcGVuZHNPbk1ldGhvZHMoKSwKKyAgICAgICAgICBicy5kZXNjcmlwdGlvbigpLCBicy5lbmFibGVkKCksIGJzLmdyb3VwcygpLAorICAgICAgICAgIGJzLmluaGVyaXRHcm91cHMoKSwgbnVsbCwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMudGltZU91dCgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElBZnRlckdyb3Vwcy5jbGFzcykgeworICAgICAgQWZ0ZXJHcm91cHMgYnMgPSAoQWZ0ZXJHcm91cHMpIGE7CisgICAgICBmaW5hbCBTdHJpbmdbXSBncm91cHM9IGJzLnZhbHVlKCkubGVuZ3RoID4gMCA/IGJzLnZhbHVlKCkgOiBicy5ncm91cHMoKTsKKyAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwgZ3JvdXBzLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMuYWx3YXlzUnVuKCksCisgICAgICAgICAgYnMuZGVwZW5kc09uR3JvdXBzKCksIGJzLmRlcGVuZHNPbk1ldGhvZHMoKSwKKyAgICAgICAgICBicy5kZXNjcmlwdGlvbigpLCBicy5lbmFibGVkKCksIGJzLmdyb3VwcygpLAorICAgICAgICAgIGJzLmluaGVyaXRHcm91cHMoKSwgbnVsbCwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgYnMudGltZU91dCgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5ub3RhdGlvbkNsYXNzID09IElCZWZvcmVDbGFzcy5jbGFzcykgeworICAgICAgQmVmb3JlQ2xhc3MgYnMgPSAoQmVmb3JlQ2xhc3MpIGE7CisgICAgICByZXN1bHQgPSBjcmVhdGVDb25maWd1cmF0aW9uVGFnKGNscywgYSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIG5ldyBTdHJpbmdbMF0sIG5ldyBTdHJpbmdbMF0sCisgICAgICAgICAgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGJzLmFsd2F5c1J1bigpLAorICAgICAgICAgIGJzLmRlcGVuZHNPbkdyb3VwcygpLCBicy5kZXBlbmRzT25NZXRob2RzKCksCisgICAgICAgICAgYnMuZGVzY3JpcHRpb24oKSwgYnMuZW5hYmxlZCgpLCBicy5ncm91cHMoKSwKKyAgICAgICAgICBicy5pbmhlcml0R3JvdXBzKCksIG51bGwsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGJzLnRpbWVPdXQoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFubm90YXRpb25DbGFzcyA9PSBJQWZ0ZXJDbGFzcy5jbGFzcykgeworICAgICAgQWZ0ZXJDbGFzcyBicyA9IChBZnRlckNsYXNzKSBhOworICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZmlndXJhdGlvblRhZyhjbHMsIGEsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgIGZhbHNlLCB0cnVlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBicy5hbHdheXNSdW4oKSwKKyAgICAgICAgICBicy5kZXBlbmRzT25Hcm91cHMoKSwgYnMuZGVwZW5kc09uTWV0aG9kcygpLAorICAgICAgICAgIGJzLmRlc2NyaXB0aW9uKCksIGJzLmVuYWJsZWQoKSwgYnMuZ3JvdXBzKCksCisgICAgICAgICAgYnMuaW5oZXJpdEdyb3VwcygpLCBudWxsLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBicy50aW1lT3V0KCkpOworICAgIH0KKyAgICBlbHNlIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gSUJlZm9yZU1ldGhvZC5jbGFzcykgeworICAgICAgQmVmb3JlTWV0aG9kIGJzID0gKEJlZm9yZU1ldGhvZCkgYTsKKyAgICAgIHJlc3VsdCA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoY2xzLCBhLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1swXSwKKyAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgYnMuYWx3YXlzUnVuKCksCisgICAgICAgICAgYnMuZGVwZW5kc09uR3JvdXBzKCksIGJzLmRlcGVuZHNPbk1ldGhvZHMoKSwKKyAgICAgICAgICBicy5kZXNjcmlwdGlvbigpLCBicy5lbmFibGVkKCksIGJzLmdyb3VwcygpLAorICAgICAgICAgIGJzLmluaGVyaXRHcm91cHMoKSwgbnVsbCwKKyAgICAgICAgICBicy5maXJzdFRpbWVPbmx5KCksIGZhbHNlLAorICAgICAgICAgIGJzLnRpbWVPdXQoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFubm90YXRpb25DbGFzcyA9PSBJQWZ0ZXJNZXRob2QuY2xhc3MpIHsKKyAgICAgIEFmdGVyTWV0aG9kIGJzID0gKEFmdGVyTWV0aG9kKSBhOworICAgICAgcmVzdWx0ID0gY3JlYXRlQ29uZmlndXJhdGlvblRhZyhjbHMsIGEsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBuZXcgU3RyaW5nWzBdLCBuZXcgU3RyaW5nWzBdLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICBicy5hbHdheXNSdW4oKSwKKyAgICAgICAgICBicy5kZXBlbmRzT25Hcm91cHMoKSwgYnMuZGVwZW5kc09uTWV0aG9kcygpLAorICAgICAgICAgIGJzLmRlc2NyaXB0aW9uKCksIGJzLmVuYWJsZWQoKSwgYnMuZ3JvdXBzKCksCisgICAgICAgICAgYnMuaW5oZXJpdEdyb3VwcygpLCBudWxsLAorICAgICAgICAgIGZhbHNlLCBicy5sYXN0VGltZU9ubHkoKSwKKyAgICAgICAgICBicy50aW1lT3V0KCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgIHByaXZhdGUgQ29uZmlndXJhdGlvbkFubm90YXRpb24gY3JlYXRlQ29uZmlndXJhdGlvblRhZyhDbGFzczw/PiBjbHMsIEFubm90YXRpb24gYSkgeworICAgIENvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBDb25maWd1cmF0aW9uQW5ub3RhdGlvbigpOworICAgIENvbmZpZ3VyYXRpb24gYyA9IChDb25maWd1cmF0aW9uKSBhOworICAgIHJlc3VsdC5zZXRCZWZvcmVUZXN0Q2xhc3MoYy5iZWZvcmVUZXN0Q2xhc3MoKSk7CisgICAgcmVzdWx0LnNldEFmdGVyVGVzdENsYXNzKGMuYWZ0ZXJUZXN0Q2xhc3MoKSk7CisgICAgcmVzdWx0LnNldEJlZm9yZVRlc3RNZXRob2QoYy5iZWZvcmVUZXN0TWV0aG9kKCkpOworICAgIHJlc3VsdC5zZXRBZnRlclRlc3RNZXRob2QoYy5hZnRlclRlc3RNZXRob2QoKSk7CisgICAgcmVzdWx0LnNldEJlZm9yZVRlc3QoYy5iZWZvcmVUZXN0KCkpOworICAgIHJlc3VsdC5zZXRBZnRlclRlc3QoYy5hZnRlclRlc3QoKSk7CisgICAgcmVzdWx0LnNldEJlZm9yZVN1aXRlKGMuYmVmb3JlU3VpdGUoKSk7CisgICAgcmVzdWx0LnNldEFmdGVyU3VpdGUoYy5hZnRlclN1aXRlKCkpOworICAgIHJlc3VsdC5zZXRCZWZvcmVHcm91cHMoYy5iZWZvcmVHcm91cHMoKSk7CisgICAgcmVzdWx0LnNldEFmdGVyR3JvdXBzKGMuYWZ0ZXJHcm91cHMoKSk7CisgICAgcmVzdWx0LnNldFBhcmFtZXRlcnMoYy5wYXJhbWV0ZXJzKCkpOworICAgIHJlc3VsdC5zZXRFbmFibGVkKGMuZW5hYmxlZCgpKTsKKworICAgIHJlc3VsdC5zZXRHcm91cHMoam9pbihjLmdyb3VwcygpLCBmaW5kSW5oZXJpdGVkU3RyaW5nQXJyYXkoY2xzLCBUZXN0LmNsYXNzLCAiZ3JvdXBzIikpKTsKKyAgICByZXN1bHQuc2V0RGVwZW5kc09uR3JvdXBzKGMuZGVwZW5kc09uR3JvdXBzKCkpOworICAgIHJlc3VsdC5zZXREZXBlbmRzT25NZXRob2RzKGMuZGVwZW5kc09uTWV0aG9kcygpKTsKKyAgICByZXN1bHQuc2V0QWx3YXlzUnVuKGMuYWx3YXlzUnVuKCkpOworICAgIHJlc3VsdC5zZXRJbmhlcml0R3JvdXBzKGMuaW5oZXJpdEdyb3VwcygpKTsKKyAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oYy5kZXNjcmlwdGlvbigpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIElBbm5vdGF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb25UYWcoQ2xhc3M8Pz4gY2xzLCBBbm5vdGF0aW9uIGEsCisgICAgICBib29sZWFuIGJlZm9yZVN1aXRlLCBib29sZWFuIGFmdGVyU3VpdGUsCisgICAgICBib29sZWFuIGJlZm9yZVRlc3QsIGJvb2xlYW4gYWZ0ZXJUZXN0LAorICAgICAgU3RyaW5nW10gYmVmb3JlR3JvdXBzLCBTdHJpbmdbXSBhZnRlckdyb3VwcywKKyAgICAgIGJvb2xlYW4gYmVmb3JlQ2xhc3MsIGJvb2xlYW4gYWZ0ZXJDbGFzcywKKyAgICAgIGJvb2xlYW4gYmVmb3JlTWV0aG9kLCBib29sZWFuIGFmdGVyTWV0aG9kLAorICAgICAgYm9vbGVhbiBhbHdheXNSdW4sCisgICAgICBTdHJpbmdbXSBkZXBlbmRzT25Hcm91cHMsIFN0cmluZ1tdIGRlcGVuZHNPbk1ldGhvZHMsCisgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gZW5hYmxlZCwgU3RyaW5nW10gZ3JvdXBzLAorICAgICAgYm9vbGVhbiBpbmhlcml0R3JvdXBzLCBTdHJpbmdbXSBwYXJhbWV0ZXJzLAorICAgICAgYm9vbGVhbiBmaXJzdFRpbWVPbmx5LCBib29sZWFuIGxhc3RUaW1lT25seSwKKyAgICAgIGxvbmcgdGltZU91dCkKKyAgeworICAgIENvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBDb25maWd1cmF0aW9uQW5ub3RhdGlvbigpOworICAgIHJlc3VsdC5zZXRGYWtlQ29uZmlndXJhdGlvbih0cnVlKTsKKyAgICByZXN1bHQuc2V0QmVmb3JlU3VpdGUoYmVmb3JlU3VpdGUpOworICAgIHJlc3VsdC5zZXRBZnRlclN1aXRlKGFmdGVyU3VpdGUpOworICAgIHJlc3VsdC5zZXRCZWZvcmVUZXN0KGJlZm9yZVRlc3QpOworICAgIHJlc3VsdC5zZXRBZnRlclRlc3QoYWZ0ZXJUZXN0KTsKKyAgICByZXN1bHQuc2V0QmVmb3JlVGVzdENsYXNzKGJlZm9yZUNsYXNzKTsKKyAgICByZXN1bHQuc2V0QWZ0ZXJUZXN0Q2xhc3MoYWZ0ZXJDbGFzcyk7CisgICAgcmVzdWx0LnNldEJlZm9yZUdyb3VwcyhiZWZvcmVHcm91cHMpOworICAgIHJlc3VsdC5zZXRBZnRlckdyb3VwcyhhZnRlckdyb3Vwcyk7CisgICAgcmVzdWx0LnNldEJlZm9yZVRlc3RNZXRob2QoYmVmb3JlTWV0aG9kKTsKKyAgICByZXN1bHQuc2V0QWZ0ZXJUZXN0TWV0aG9kKGFmdGVyTWV0aG9kKTsKKworICAgIHJlc3VsdC5zZXRBbHdheXNSdW4oYWx3YXlzUnVuKTsKKyAgICByZXN1bHQuc2V0RGVwZW5kc09uR3JvdXBzKGRlcGVuZHNPbkdyb3Vwcyk7CisgICAgcmVzdWx0LnNldERlcGVuZHNPbk1ldGhvZHMoZGVwZW5kc09uTWV0aG9kcyk7CisgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKyAgICByZXN1bHQuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICByZXN1bHQuc2V0R3JvdXBzKGdyb3Vwcyk7CisgICAgcmVzdWx0LnNldEluaGVyaXRHcm91cHMoaW5oZXJpdEdyb3Vwcyk7CisgICAgcmVzdWx0LnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgcmVzdWx0LnNldEZpcnN0VGltZU9ubHkoZmlyc3RUaW1lT25seSk7CisgICAgcmVzdWx0LnNldExhc3RUaW1lT25seShsYXN0VGltZU9ubHkpOworICAgIHJlc3VsdC5zZXRUaW1lT3V0KHRpbWVPdXQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgSUFubm90YXRpb24gY3JlYXRlRGF0YVByb3ZpZGVyVGFnKEFubm90YXRpb24gYSkgeworICAgIERhdGFQcm92aWRlckFubm90YXRpb24gcmVzdWx0ID0gbmV3IERhdGFQcm92aWRlckFubm90YXRpb24oKTsKKyAgICBEYXRhUHJvdmlkZXIgYyA9IChEYXRhUHJvdmlkZXIpIGE7CisgICAgcmVzdWx0LnNldE5hbWUoYy5uYW1lKCkpOworICAgIHJlc3VsdC5zZXRQYXJhbGxlbChjLnBhcmFsbGVsKCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbiBjcmVhdGVFeHBlY3RlZEV4Y2VwdGlvbnNUYWcoQW5ub3RhdGlvbiBhKSB7CisgICAgRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbiAoKTsKKyAgICBFeHBlY3RlZEV4Y2VwdGlvbnMgYyA9IChFeHBlY3RlZEV4Y2VwdGlvbnMgKSBhOworICAgIHJlc3VsdC5zZXRWYWx1ZShjLnZhbHVlKCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbiBjcmVhdGVGYWN0b3J5VGFnKENsYXNzPD8+IGNscywgQW5ub3RhdGlvbiBhKSB7CisgICAgRmFjdG9yeUFubm90YXRpb24gcmVzdWx0ID0gbmV3IEZhY3RvcnlBbm5vdGF0aW9uKCk7CisgICAgRmFjdG9yeSBjID0gKEZhY3RvcnkpIGE7CisgICAgcmVzdWx0LnNldFBhcmFtZXRlcnMoYy5wYXJhbWV0ZXJzKCkpOworICAgIHJlc3VsdC5zZXREYXRhUHJvdmlkZXIoYy5kYXRhUHJvdmlkZXIoKSk7CisgICAgcmVzdWx0LnNldERhdGFQcm92aWRlckNsYXNzKAorICAgICAgICBmaW5kSW5oZXJpdGVkKGMuZGF0YVByb3ZpZGVyQ2xhc3MoKSwgY2xzLCBGYWN0b3J5LmNsYXNzLCAiZGF0YVByb3ZpZGVyQ2xhc3MiLAorICAgICAgICAgICAgREVGQVVMVF9DTEFTUykpOworICAgIHJlc3VsdC5zZXRFbmFibGVkKGMuZW5hYmxlZCgpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIElBbm5vdGF0aW9uIGNyZWF0ZU9iamVjdEZhY3RvcnlUYWcoQW5ub3RhdGlvbiBhKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RGYWN0b3J5QW5ub3RhdGlvbigpOworICB9CisKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbiBjcmVhdGVQYXJhbWV0ZXJzVGFnKEFubm90YXRpb24gYSkgeworICAgIFBhcmFtZXRlcnNBbm5vdGF0aW9uIHJlc3VsdCA9IG5ldyBQYXJhbWV0ZXJzQW5ub3RhdGlvbigpOworICAgIFBhcmFtZXRlcnMgYyA9IChQYXJhbWV0ZXJzKSBhOworICAgIHJlc3VsdC5zZXRWYWx1ZShjLnZhbHVlKCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24ifSkKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbiBjcmVhdGVMaXN0ZW5lcnNUYWcoQ2xhc3M8Pz4gY2xzLCBBbm5vdGF0aW9uIGEsCisgICAgICBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKQorICB7CisgICAgTGlzdGVuZXJzQW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgTGlzdGVuZXJzQW5ub3RhdGlvbigpOworICAgIExpc3RlbmVycyBsID0gKExpc3RlbmVycykgYTsKKyAgICByZXN1bHQuc2V0VmFsdWUobC52YWx1ZSgpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgIHByaXZhdGUgSUFubm90YXRpb24gY3JlYXRlVGVzdFRhZyhDbGFzczw/PiBjbHMsIEFubm90YXRpb24gYSwKKyAgICAgIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpCisgIHsKKyAgICBUZXN0QW5ub3RhdGlvbiByZXN1bHQgPSBuZXcgVGVzdEFubm90YXRpb24oKTsKKyAgICBUZXN0IHRlc3QgPSAoVGVzdCkgYTsKKworICAgIHJlc3VsdC5zZXRFbmFibGVkKHRlc3QuZW5hYmxlZCgpKTsKKyAgICByZXN1bHQuc2V0R3JvdXBzKGpvaW4odGVzdC5ncm91cHMoKSwgZmluZEluaGVyaXRlZFN0cmluZ0FycmF5KGNscywgVGVzdC5jbGFzcywgImdyb3VwcyIpKSk7CisgICAgcmVzdWx0LnNldFBhcmFtZXRlcnModGVzdC5wYXJhbWV0ZXJzKCkpOworICAgIHJlc3VsdC5zZXREZXBlbmRzT25Hcm91cHMoam9pbih0ZXN0LmRlcGVuZHNPbkdyb3VwcygpLAorICAgICAgICBmaW5kSW5oZXJpdGVkU3RyaW5nQXJyYXkoY2xzLCBUZXN0LmNsYXNzLCAiZGVwZW5kc09uR3JvdXBzIikpKTsKKyAgICByZXN1bHQuc2V0RGVwZW5kc09uTWV0aG9kcyhqb2luKHRlc3QuZGVwZW5kc09uTWV0aG9kcygpLAorICAgICAgICBmaW5kSW5oZXJpdGVkU3RyaW5nQXJyYXkoY2xzLCBUZXN0LmNsYXNzLCAiZGVwZW5kc09uTWV0aG9kcyIpKSk7CisgICAgcmVzdWx0LnNldFRpbWVPdXQodGVzdC50aW1lT3V0KCkpOworICAgIHJlc3VsdC5zZXRJbnZvY2F0aW9uVGltZU91dCh0ZXN0Lmludm9jYXRpb25UaW1lT3V0KCkpOworICAgIHJlc3VsdC5zZXRJbnZvY2F0aW9uQ291bnQodGVzdC5pbnZvY2F0aW9uQ291bnQoKSk7CisgICAgcmVzdWx0LnNldFRocmVhZFBvb2xTaXplKHRlc3QudGhyZWFkUG9vbFNpemUoKSk7CisgICAgcmVzdWx0LnNldFN1Y2Nlc3NQZXJjZW50YWdlKHRlc3Quc3VjY2Vzc1BlcmNlbnRhZ2UoKSk7CisgICAgcmVzdWx0LnNldERhdGFQcm92aWRlcih0ZXN0LmRhdGFQcm92aWRlcigpKTsKKy8vICAgIHJlc3VsdC5zZXREYXRhUHJvdmlkZXJDbGFzcyh0ZXN0LmRhdGFQcm92aWRlckNsYXNzKCkgIT0gT2JqZWN0LmNsYXNzID8KKy8vICAgICAgICB0ZXN0LmRhdGFQcm92aWRlckNsYXNzKCkgOiBudWxsKTsKKyAgICByZXN1bHQuc2V0RGF0YVByb3ZpZGVyQ2xhc3MoCisgICAgICAgIGZpbmRJbmhlcml0ZWQodGVzdC5kYXRhUHJvdmlkZXJDbGFzcygpLCBjbHMsIFRlc3QuY2xhc3MsICJkYXRhUHJvdmlkZXJDbGFzcyIsCisgICAgICAgICAgICBERUZBVUxUX0NMQVNTKSk7CisgICAgcmVzdWx0LnNldEFsd2F5c1J1bih0ZXN0LmFsd2F5c1J1bigpKTsKKyAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oCisgICAgICAgIGZpbmRJbmhlcml0ZWQodGVzdC5kZXNjcmlwdGlvbigpLCBjbHMsIFRlc3QuY2xhc3MsICJkZXNjcmlwdGlvbiIsIERFRkFVTFRfU1RSSU5HKSk7CisgICAgcmVzdWx0LnNldEV4cGVjdGVkRXhjZXB0aW9ucyh0ZXN0LmV4cGVjdGVkRXhjZXB0aW9ucygpKTsKKyAgICByZXN1bHQuc2V0RXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cCh0ZXN0LmV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAoKSk7CisgICAgcmVzdWx0LnNldFN1aXRlTmFtZSh0ZXN0LnN1aXRlTmFtZSgpKTsKKyAgICByZXN1bHQuc2V0VGVzdE5hbWUodGVzdC50ZXN0TmFtZSgpKTsKKyAgICByZXN1bHQuc2V0U2VxdWVudGlhbCh0ZXN0LnNlcXVlbnRpYWwoKSk7CisgICAgcmVzdWx0LnNldFNpbmdsZVRocmVhZGVkKHRlc3Quc2luZ2xlVGhyZWFkZWQoKSk7CisgICAgcmVzdWx0LnNldFJldHJ5QW5hbHl6ZXIodGVzdC5yZXRyeUFuYWx5emVyKCkpOworICAgIHJlc3VsdC5zZXRTa2lwRmFpbGVkSW52b2NhdGlvbnModGVzdC5za2lwRmFpbGVkSW52b2NhdGlvbnMoKSk7CisgICAgcmVzdWx0LnNldElnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXModGVzdC5pZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKCkpOworICAgIHJlc3VsdC5zZXRQcmlvcml0eSh0ZXN0LnByaW9yaXR5KCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gam9pbihTdHJpbmdbXSBzdHJpbmdzLCBTdHJpbmdbXSBzdHJpbmdzMikgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3Qoc3RyaW5ncyk7CisgICAgU2V0PFN0cmluZz4gc2VlbiA9IG5ldyBIYXNoU2V0PD4oTGlzdHMubmV3QXJyYXlMaXN0KHN0cmluZ3MpKTsKKyAgICBmb3IgKFN0cmluZyBzIDogc3RyaW5nczIpIHsKKyAgICAgIGlmICghIHNlZW4uY29udGFpbnMocykpIHsKKyAgICAgICAgcmVzdWx0LmFkZChzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICAvKioKKyAgICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHZhcmlvdXMKKyAgICogYW5ub3RhdGlvbiByZXR1cm4gdHlwZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGxvb2tpbmcgZm9yIGFuIGFubm90YXRpb24gaW4gYQorICAgKiBoaWVyYXJjaHkuIFdlIGNhbid0IHVzZSBudWxsIGFzIGEgZGVmYXVsdCBzaW5jZSBhbm5vdGF0aW9uIGRvbid0IGFsbG93CisgICAqIG51bGxzLCBzbyBlYWNoIHR5cGUgaGFzIGEgZGlmZmVyZW50IHdheSBvZiBkZWZpbmluZyBpdHMgb3duIGRlZmF1bHQuCisgICAqLworICBzdGF0aWMgaW50ZXJmYWNlIERlZmF1bHQ8VD4geworICAgIGJvb2xlYW4gaXNEZWZhdWx0KFQgdCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0PENsYXNzPD8+PiBERUZBVUxUX0NMQVNTID0gbmV3IERlZmF1bHQ8Q2xhc3M8Pz4+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChDbGFzczw/PiBjKSB7CisgICAgICByZXR1cm4gYyA9PSBPYmplY3QuY2xhc3M7CisgICAgfQorICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHQ8U3RyaW5nPiBERUZBVUxUX1NUUklORyA9IG5ldyBEZWZhdWx0PFN0cmluZz4oKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBzKSB7CisgICAgICByZXR1cm4gVXRpbHMuaXNTdHJpbmdFbXB0eShzKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEZpbmQgdGhlIHZhbHVlIG9mIGFuIGFubm90YXRpb24sIHN0YXJ0aW5nIHdpdGggdGhlIGFubm90YXRpb24gZm91bmQgb24gdGhlCisgICAqIG1ldGhvZCwgdGhlbiB0aGUgY2xhc3MgYW5kIHRoZW4gcGFyZW50IGNsYXNzZXMgdW50aWwgd2UgZWl0aGVyIGZpbmQgYQorICAgKiBub24tZGVmYXVsdCB2YWx1ZSBvciB3ZSByZWFjaCB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkgKE9iamVjdCkuCisgICAqLworICBwcml2YXRlIDxUPiBUIGZpbmRJbmhlcml0ZWQoVCBtZXRob2RWYWx1ZSwgQ2xhc3M8Pz4gY2xzLAorICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICBEZWZhdWx0PFQ+IGRlZikgeworCisgICAgLy8gTG9vayBvbiB0aGUgbWV0aG9kIGZpcnN0IGFuZCByZXR1cm4gcmlnaHQgYXdheSBpZiB0aGUgYW5ub3RhdGlvbiBpcyB0aGVyZQorICAgIGlmICghZGVmLmlzRGVmYXVsdChtZXRob2RWYWx1ZSkpIHsKKyAgICAgIHJldHVybiBtZXRob2RWYWx1ZTsKKyAgICB9CisKKyAgICAvLyBOb3QgZm91bmQsIGxvb2sgb24gdGhlIGNsYXNzIGFuZCB0aGVuIHVwIHRoZSBoaWVyYXJjaHkKKyAgICB3aGlsZSAoY2xzICE9IG51bGwgJiYgY2xzICE9IE9iamVjdC5jbGFzcykgeworICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKTsKKyAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgVCByZXN1bHQgPSAoVCkgaW52b2tlTWV0aG9kKGFubm90YXRpb24sIG1ldGhvZE5hbWUpOworICAgICAgICBpZiAoIWRlZi5pc0RlZmF1bHQocmVzdWx0KSkgeworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogRmluZCB0aGUgdmFsdWUgb2YgYSBTdHJpbmdbXSBhbm5vdGF0aW9uLiBUaGUgZGlmZmVyZW5jZSB3aXRoIHRoZQorICAgKiBmaW5kSW5oZXJpdGVkIG1ldGhvZCBhYm92ZSBpcyB0aGF0IFRlc3RORyBhZ2dyZWdhdGVzIFN0cmluZ1tdIHZhbHVlcyBhY3Jvc3MKKyAgICogaGllcmFyY2hpZXMuIEZvciBleGFtcGxlLCBvZiB0aGUgbWV0aG9kIGFubm90YXRpb24gaGFzIHsgImEiLCAiYiIgfSBhbmQgdGhlCisgICAqIGNsYXNzIGhhcyB7ICJjIiB9LCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB7ICJhIiwgImIiLCAiYyIgfS4KKyAgICovCisgIHByaXZhdGUgU3RyaW5nW10gZmluZEluaGVyaXRlZFN0cmluZ0FycmF5KENsYXNzPD8+IGNscywKKyAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQorICB7CisgICAgaWYgKG51bGwgPT0gY2xzKSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICB3aGlsZSAoY2xzICE9IG51bGwgJiYgY2xzICE9IE9iamVjdC5jbGFzcykgeworICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKTsKKyAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgU3RyaW5nW10gZyA9IChTdHJpbmdbXSkgaW52b2tlTWV0aG9kKGFubm90YXRpb24sIG1ldGhvZE5hbWUpOworICAgICAgICBmb3IgKFN0cmluZyBzIDogZykgeworICAgICAgICAgIHJlc3VsdC5hZGQocyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgaW52b2tlTWV0aG9kKEFubm90YXRpb24gdGVzdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgLy8gTm90ZTogIHdlIHNob3VsZCBjYWNoZSBtZXRob2RzIGFscmVhZHkgbG9va2VkIHVwCisgICAgICBNZXRob2QgbSA9IHRlc3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzWzBdKTsKKyAgICAgIHJlc3VsdCA9IG0uaW52b2tlKHRlc3QsIG5ldyBPYmplY3RbMF0pOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltKREsxNVRhZ0ZhY3RvcnldICIgKyBzdHJpbmcpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9MaXN0ZW5lcnNBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvTGlzdGVuZXJzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvTGlzdGVuZXJzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR0xpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBMaXN0ZW5lcnNBbm5vdGF0aW9uIGltcGxlbWVudHMgSUxpc3RlbmVycywgSUFubm90YXRpb24geworCisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lcj5bXSBtX3ZhbHVlOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lcj5bXSBnZXRWYWx1ZSgpIHsKKyAgICByZXR1cm4gbV92YWx1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPltdIHZhbHVlKSB7CisgICAgbV92YWx1ZSA9IHZhbHVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9PYmplY3RGYWN0b3J5QW5ub3RhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL09iamVjdEZhY3RvcnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUzOTRkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9PYmplY3RGYWN0b3J5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSU9iamVjdEZhY3RvcnlBbm5vdGF0aW9uOworCisvKioKKyAqIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBAT2JqZWN0RmFjdG9yeQorICogQGF1dGhvciBIYW5pCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5QW5ub3RhdGlvbiBleHRlbmRzIEJhc2VBbm5vdGF0aW9uIGltcGxlbWVudHMgSU9iamVjdEZhY3RvcnlBbm5vdGF0aW9uCit7fQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtZXRlcnNBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1ldGVyc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNGZiNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtZXRlcnNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JUGFyYW1ldGVyc0Fubm90YXRpb247CisKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJUGFyYW1ldGVycworICoKKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJzQW5ub3RhdGlvbgorICBleHRlbmRzIEJhc2VBbm5vdGF0aW9uCisgIGltcGxlbWVudHMgSVBhcmFtZXRlcnNBbm5vdGF0aW9uCit7CisgIHByaXZhdGUgU3RyaW5nW10gbV92YWx1ZSAgPSB7fTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlKCkgeworICAgIHJldHVybiBtX3ZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nW10gdmFsdWUpIHsKKyAgICBtX3ZhbHVlID0gdmFsdWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1Rlc3RBbm5vdGF0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvVGVzdEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTYxMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1Rlc3RBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JUmV0cnlBbmFseXplcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247DQorDQorDQorLyoqDQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgSVRlc3QNCisgKg0KKyAqIENyZWF0ZWQgb24gRGVjIDIwLCAyMDA1DQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0QW5ub3RhdGlvbiBleHRlbmRzIFRlc3RPckNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJVGVzdEFubm90YXRpb24gew0KKyAgcHJpdmF0ZSBsb25nIG1faW52b2NhdGlvblRpbWVPdXQgPSAwOw0KKyAgcHJpdmF0ZSBpbnQgbV9pbnZvY2F0aW9uQ291bnQgPSAxOw0KKyAgcHJpdmF0ZSBpbnQgbV90aHJlYWRQb29sU2l6ZSA9IDA7DQorICBwcml2YXRlIGludCBtX3N1Y2Nlc3NQZXJjZW50YWdlID0gMTAwOw0KKyAgcHJpdmF0ZSBTdHJpbmcgbV9kYXRhUHJvdmlkZXIgPSAiIjsNCisgIHByaXZhdGUgYm9vbGVhbiBtX2Fsd2F5c1J1biA9IGZhbHNlOw0KKyAgcHJpdmF0ZSBDbGFzczw/PltdIG1fZXhwZWN0ZWRFeGNlcHRpb25zID0ge307DQorICBwcml2YXRlIFN0cmluZyBtX2V4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAgPSAiLioiOw0KKyAgcHJpdmF0ZSBTdHJpbmcgbV9zdWl0ZU5hbWUgPSAiIjsNCisgIHByaXZhdGUgU3RyaW5nIG1fdGVzdE5hbWUgPSAiIjsNCisgIHByaXZhdGUgYm9vbGVhbiBtX3NpbmdsZVRocmVhZGVkID0gZmFsc2U7DQorICBwcml2YXRlIGJvb2xlYW4gbV9zZXF1ZW50aWFsID0gZmFsc2U7DQorICBwcml2YXRlIENsYXNzPD8+IG1fZGF0YVByb3ZpZGVyQ2xhc3MgPSBudWxsOw0KKyAgcHJpdmF0ZSBJUmV0cnlBbmFseXplciBtX3JldHJ5QW5hbHl6ZXIgPSBudWxsOw0KKyAgcHJpdmF0ZSBib29sZWFuIG1fc2tpcEZhaWxlZEludm9jYXRpb25zID0gZmFsc2U7DQorICBwcml2YXRlIGJvb2xlYW4gbV9pZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzID0gZmFsc2U7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIGV4cGVjdGVkRXhjZXB0aW9ucw0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBDbGFzczw/PltdIGdldEV4cGVjdGVkRXhjZXB0aW9ucygpIHsNCisgICAgcmV0dXJuIG1fZXhwZWN0ZWRFeGNlcHRpb25zOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAcGFyYW0gZXhwZWN0ZWRFeGNlcHRpb25zIHRoZSBleHBlY3RlZEV4Y2VwdGlvbnMgdG8gc2V0DQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRFeGNlcHRpb25zKENsYXNzPD8+W10gZXhwZWN0ZWRFeGNlcHRpb25zKSB7DQorICAgIG1fZXhwZWN0ZWRFeGNlcHRpb25zID0gZXhwZWN0ZWRFeGNlcHRpb25zOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAoKSB7DQorICAgIHJldHVybiBtX2V4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHA7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAoDQorICAgICAgU3RyaW5nIGV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHApIHsNCisgICAgbV9leHBlY3RlZEV4Y2VwdGlvbnNNZXNzYWdlUmVnRXhwID0gZXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0QWx3YXlzUnVuKGJvb2xlYW4gYWx3YXlzUnVuKSB7DQorICAgIG1fYWx3YXlzUnVuID0gYWx3YXlzUnVuOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXREYXRhUHJvdmlkZXIoU3RyaW5nIGRhdGFQcm92aWRlcikgew0KKyAgICBtX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIENsYXNzPD8+IGdldERhdGFQcm92aWRlckNsYXNzKCkgew0KKyAgICByZXR1cm4gbV9kYXRhUHJvdmlkZXJDbGFzczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0RGF0YVByb3ZpZGVyQ2xhc3MoQ2xhc3M8Pz4gZGF0YVByb3ZpZGVyQ2xhc3MpIHsNCisgICAgbV9kYXRhUHJvdmlkZXJDbGFzcyA9IGRhdGFQcm92aWRlckNsYXNzOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ291bnQoaW50IGludm9jYXRpb25Db3VudCkgew0KKyAgICBtX2ludm9jYXRpb25Db3VudCA9IGludm9jYXRpb25Db3VudDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0U3VjY2Vzc1BlcmNlbnRhZ2UoaW50IHN1Y2Nlc3NQZXJjZW50YWdlKSB7DQorICAgIG1fc3VjY2Vzc1BlcmNlbnRhZ2UgPSBzdWNjZXNzUGVyY2VudGFnZTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgIHJldHVybiBtX2ludm9jYXRpb25Db3VudDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGxvbmcgaW52b2NhdGlvblRpbWVPdXQoKSB7DQorICAgcmV0dXJuIG1faW52b2NhdGlvblRpbWVPdXQ7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25UaW1lT3V0KGxvbmcgdGltZU91dCkgew0KKyAgICBtX2ludm9jYXRpb25UaW1lT3V0ID0gdGltZU91dDsNCisgIH0NCisNCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGludCBnZXRTdWNjZXNzUGVyY2VudGFnZSgpIHsNCisgICAgcmV0dXJuIG1fc3VjY2Vzc1BlcmNlbnRhZ2U7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVByb3ZpZGVyKCkgew0KKyAgICByZXR1cm4gbV9kYXRhUHJvdmlkZXI7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGdldEFsd2F5c1J1bigpIHsNCisgICAgcmV0dXJuIG1fYWx3YXlzUnVuOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgaW50IGdldFRocmVhZFBvb2xTaXplKCkgew0KKyAgICByZXR1cm4gbV90aHJlYWRQb29sU2l6ZTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGhyZWFkUG9vbFNpemUoaW50IHRocmVhZFBvb2xTaXplKSB7DQorICAgIG1fdGhyZWFkUG9vbFNpemUgPSB0aHJlYWRQb29sU2l6ZTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIFN0cmluZyBnZXRTdWl0ZU5hbWUoKSB7DQorICAgIHJldHVybiBtX3N1aXRlTmFtZTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0U3VpdGVOYW1lKFN0cmluZyB4bWxTdWl0ZSkgew0KKyAgICBtX3N1aXRlTmFtZSA9IHhtbFN1aXRlOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgew0KKyAgICByZXR1cm4gbV90ZXN0TmFtZTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGVzdE5hbWUoU3RyaW5nIHhtbFRlc3QpIHsNCisgICAgbV90ZXN0TmFtZSA9IHhtbFRlc3Q7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGdldFNpbmdsZVRocmVhZGVkKCkgew0KKyAgICByZXR1cm4gbV9zaW5nbGVUaHJlYWRlZDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0U2luZ2xlVGhyZWFkZWQoYm9vbGVhbiBzaW5nbGVUaHJlYWRlZCkgew0KKyAgICBtX3NpbmdsZVRocmVhZGVkID0gc2luZ2xlVGhyZWFkZWQ7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGdldFNlcXVlbnRpYWwoKSB7DQorICAgIHJldHVybiBtX3NlcXVlbnRpYWw7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldFNlcXVlbnRpYWwoYm9vbGVhbiBzZXF1ZW50aWFsKSB7DQorICAgIG1fc2VxdWVudGlhbCA9IHNlcXVlbnRpYWw7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBJUmV0cnlBbmFseXplciBnZXRSZXRyeUFuYWx5emVyKCkgew0KKyAgICByZXR1cm4gbV9yZXRyeUFuYWx5emVyOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRSZXRyeUFuYWx5emVyKENsYXNzPD8+IGMpIHsNCisgICAgbV9yZXRyeUFuYWx5emVyID0gbnVsbDsNCisNCisgICAgaWYgKGMgIT0gbnVsbCAmJiBJUmV0cnlBbmFseXplci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpKSB7DQorICAgICAgdHJ5IHsNCisgICAgICAgIG1fcmV0cnlBbmFseXplciA9IChJUmV0cnlBbmFseXplcikgYy5uZXdJbnN0YW5jZSgpOw0KKyAgICAgIH0NCisgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KKyAgICAgICAgLy8gVGhlIGNsYXNzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLg0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbnMoYm9vbGVhbiBza2lwKSB7DQorICAgIG1fc2tpcEZhaWxlZEludm9jYXRpb25zID0gc2tpcDsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIGJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25zKCkgew0KKyAgICByZXR1cm4gbV9za2lwRmFpbGVkSW52b2NhdGlvbnM7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHNldElnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMoYm9vbGVhbiBpZ25vcmUpIHsNCisgICAgbV9pZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzID0gaWdub3JlOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiBpZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKCkgew0KKyAgICByZXR1cm4gbV9pZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvYW5ub3RhdGlvbnMvVGVzdE9yQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1Rlc3RPckNvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGZjNWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2Fubm90YXRpb25zL1Rlc3RPckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0T3JDb25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdE9yQ29uZmlndXJhdGlvbgorICBleHRlbmRzIEJhc2VBbm5vdGF0aW9uCisgIGltcGxlbWVudHMgSVRlc3RPckNvbmZpZ3VyYXRpb24KK3sKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX3BhcmFtZXRlcnMgPSB7fTsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX2dyb3VwcyA9IHt9OworICBwcml2YXRlIGJvb2xlYW4gbV9lbmFibGVkID0gdHJ1ZTsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBtX2RlcGVuZHNPbkdyb3VwcyA9IHt9OworICBwcml2YXRlIFN0cmluZ1tdIG1fZGVwZW5kc09uTWV0aG9kcyA9IHt9OworICBwcml2YXRlIFN0cmluZyBtX2Rlc2NyaXB0aW9uID0gIiI7CisgIHByaXZhdGUgaW50IG1fcHJpb3JpdHk7CisgIHByaXZhdGUgbG9uZyBtX3RpbWVPdXQgPSAwOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworICAgIHJldHVybiBtX2dyb3VwczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgeworICAgIHJldHVybiBtX2VuYWJsZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0RGVwZW5kc09uR3JvdXBzKFN0cmluZ1tdIGRlcGVuZHNPbkdyb3VwcykgeworICAgIG1fZGVwZW5kc09uR3JvdXBzID0gZGVwZW5kc09uR3JvdXBzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldERlcGVuZHNPbk1ldGhvZHMoU3RyaW5nW10gZGVwZW5kc09uTWV0aG9kcykgeworICAgIG1fZGVwZW5kc09uTWV0aG9kcyA9IGRlcGVuZHNPbk1ldGhvZHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFN0cmluZ1tdIGdyb3VwcykgeworICAgIG1fZ3JvdXBzID0gZ3JvdXBzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIG1fZGVzY3JpcHRpb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICBtX2VuYWJsZWQgPSBlbmFibGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXREZXBlbmRzT25Hcm91cHMoKSB7CisgICAgcmV0dXJuIG1fZGVwZW5kc09uR3JvdXBzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmdbXSBnZXREZXBlbmRzT25NZXRob2RzKCkgeworICAgIHJldHVybiBtX2RlcGVuZHNPbk1ldGhvZHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIG1fcGFyYW1ldGVyczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1ldGVycykgeworICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgbV9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICB9CisKKyAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKKyAgICByZXR1cm4gbV9wcmlvcml0eTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFByaW9yaXR5KGludCBwcmlvcml0eSkgeworICAgIG1fcHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUaW1lT3V0KGxvbmcgdGltZU91dCkgeworICAgIG1fdGltZU91dCA9IHRpbWVPdXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0VGltZU91dCgpIHsKKyAgICByZXR1cm4gbV90aW1lT3V0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvY29sbGVjdGlvbnMvUGFpci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbGxlY3Rpb25zL1BhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU1MzZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbGxlY3Rpb25zL1BhaXIuamF2YQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuY29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk9iamVjdHM7CisKKworCisKKworcHVibGljIGNsYXNzIFBhaXI8QSwgQj4geworICBwcml2YXRlIGZpbmFsIEEgZmlyc3Q7CisgIHByaXZhdGUgZmluYWwgQiBzZWNvbmQ7CisKKyAgcHVibGljIFBhaXIoQSBmaXJzdCwgQiBzZWNvbmQpIHsKKyAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7CisgIH0KKworICBwdWJsaWMgQSBmaXJzdCgpIHsKKyAgICByZXR1cm4gZmlyc3Q7CisgIH0KKworICBwdWJsaWMgQiBzZWNvbmQoKSB7CisgICAgcmV0dXJuIHNlY29uZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChmaXJzdCA9PSBudWxsKSA/IDAgOiBmaXJzdC5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoc2Vjb25kID09IG51bGwpID8gMCA6IHNlY29uZC5oYXNoQ29kZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKHRoaXMgPT0gb2JqKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZpbmFsIFBhaXIgb3RoZXIgPSAoUGFpcikgb2JqOworICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIuZmlyc3QgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFmaXJzdC5lcXVhbHMob3RoZXIuZmlyc3QpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzZWNvbmQgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLnNlY29uZCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNlY29uZC5lcXVhbHMob3RoZXIuc2Vjb25kKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPEEsIEI+IFBhaXI8QSwgQj4gY3JlYXRlKEEgZmlyc3QsIEIgc2Vjb25kKSB7CisgICAgcmV0dXJuIG9mKGZpcnN0LCBzZWNvbmQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyA8QSwgQj4gUGFpcjxBLCBCPiBvZihBIGEsIEIgYikgeworICAgIHJldHVybiBuZXcgUGFpcjw+KGEsIGIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIoZ2V0Q2xhc3MoKSkKKyAgICAgICAgLmFkZCgiZmlyc3QiLCBmaXJzdCgpKQorICAgICAgICAuYWRkKCJzZWNvbmQiLCBzZWNvbmQoKSkKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvaW52b2tlcnMvSW52b2tlZE1ldGhvZExpc3RlbmVySW52b2tlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2ludm9rZXJzL0ludm9rZWRNZXRob2RMaXN0ZW5lckludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYyZGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2ludm9rZXJzL0ludm9rZWRNZXRob2RMaXN0ZW5lckludm9rZXIuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmludm9rZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2Vycy5JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuQUZURVJfSU5WT0NBVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2Vycy5JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuQkVGT1JFX0lOVk9DQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuaW52b2tlcnMuSW52b2tlZE1ldGhvZExpc3RlbmVyU3VidHlwZS5FWFRFTkRFRF9MSVNURU5FUjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2Vycy5JbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlLlNJTVBMRV9MSVNURU5FUjsKKworLyoqCisgKiBIaWRlcyBjb21wbGV4aXR5IG9mIGNhbGxpbmcgbWV0aG9kcyBvZiB7QGxpbmsgSUludm9rZWRNZXRob2RMaXN0ZW5lcn0gYW5kCisgKiB7QGxpbmsgSUludm9rZWRNZXRob2RMaXN0ZW5lcjJ9LgorICoKKyAqIEBhdXRob3IgQW5zZ2FyIEtvbmVybWFubgorICovCitwdWJsaWMgY2xhc3MgSW52b2tlZE1ldGhvZExpc3RlbmVySW52b2tlciB7CisKKyAgcHJpdmF0ZSBJbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QgbV9saXN0ZW5lck1ldGhvZDsKKyAgcHJpdmF0ZSBJVGVzdENvbnRleHQgbV90ZXN0Q29udGV4dDsKKyAgcHJpdmF0ZSBJVGVzdFJlc3VsdCBtX3Rlc3RSZXN1bHQ7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgaW52b2tlciBpbnN0YW5jZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGxpc3RlbmVyTWV0aG9kfQorICAgKiBvbiBhbnkgbnVtYmVyIG9mIHtAbGluayBJSW52b2tlZE1ldGhvZExpc3RlbmVyfXMuCisgICAqCisgICAqIEBwYXJhbSBsaXN0ZW5lck1ldGhvZCBtZXRob2Qgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZAorICAgKiBAcGFyYW0gdGVzdFJlc3VsdCB0ZXN0IHJlc3VsdCB3aGljaCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBtZXRob2QgdXBvbiBpbnZvY2F0aW9uCisgICAqIEBwYXJhbSB0ZXN0Q29udGV4dCB0ZXN0IGNvbnRleHQgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgbWV0aG9kIHVwb24gaW52b2NhdGlvbi4KKyAgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCB3aGVuIGNhbGxpbmcgbWV0aG9kcyBvbiBhbiB7QGxpbmsgSUludm9rZWRNZXRob2RMaXN0ZW5lcjJ9LgorICAgKi8KKyAgcHVibGljIEludm9rZWRNZXRob2RMaXN0ZW5lckludm9rZXIoSW52b2tlZE1ldGhvZExpc3RlbmVyTWV0aG9kIGxpc3RlbmVyTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LCBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsKKyAgICBtX2xpc3RlbmVyTWV0aG9kID0gbGlzdGVuZXJNZXRob2Q7CisgICAgbV90ZXN0Q29udGV4dCA9IHRlc3RDb250ZXh0OworICAgIG1fdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogSW52b2tlIHRoZSBnaXZlbiB7QGNvZGUgbGlzdGVuZXJJbnN0YW5jZX0sIGNhbGxpbmcgdGhlIG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mCisgICAqIHRoaXMge0BsaW5rIEludm9rZWRNZXRob2RMaXN0ZW5lckludm9rZXJ9LgorICAgKgorICAgKiBAcGFyYW0gbGlzdGVuZXJJbnN0YW5jZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2Ugd2hpY2ggc2hvdWxkIGJlIGludm9rZWQuCisgICAqIEBwYXJhbSBpbnZva2VkTWV0aG9kIHRoZSB7QGxpbmsgSUludm9rZWRNZXRob2R9IGluc3RhbmNlIHdoaWNoIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlCisgICAqICAgICAgICB7QGxpbmsgSUludm9rZWRNZXRob2RMaXN0ZW5lciNiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kLCBJVGVzdFJlc3VsdCl9LAorICAgKiAgICAgICAge0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXIjYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kLCBJVGVzdFJlc3VsdCl9LAorICAgKiAgICAgICAge0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXIyI2JlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QsIElUZXN0UmVzdWx0LCBJVGVzdENvbnRleHQpfQorICAgKiAgICAgICAgb3Ige0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXIyI2FmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCwgSVRlc3RSZXN1bHQsIElUZXN0Q29udGV4dCl9CisgICAqICAgICAgICBtZXRob2QuCisgICAqLworCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgdm9pZCBpbnZva2VMaXN0ZW5lcihJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnZva2VkTWV0aG9kIGludm9rZWRNZXRob2QpIHsKKyAgICBmaW5hbCBJbnZvY2F0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvYnRhaW5TdHJhdGVneUZvcihsaXN0ZW5lckluc3RhbmNlLCBtX2xpc3RlbmVyTWV0aG9kKTsKKyAgICBzdHJhdGVneS5jYWxsTWV0aG9kKGxpc3RlbmVySW5zdGFuY2UsIGludm9rZWRNZXRob2QsIG1fdGVzdFJlc3VsdCwgbV90ZXN0Q29udGV4dCk7CisgIH0KKworICBwcml2YXRlIEludm9jYXRpb25TdHJhdGVneSBvYnRhaW5TdHJhdGVneUZvcihJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVySW5zdGFuY2UsCisgICAgICBJbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QgbGlzdGVuZXJNZXRob2QpIHsKKyAgICBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlIGludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUgPSBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlCisgICAgICAgIC5mcm9tTGlzdGVuZXIobGlzdGVuZXJJbnN0YW5jZSk7CisgICAgTWFwPEludm9rZWRNZXRob2RMaXN0ZW5lck1ldGhvZCwgSW52b2NhdGlvblN0cmF0ZWd5PiBzdHJhdGVnaWVzRm9yTGlzdGVuZXJUeXBlID0gc3RyYXRlZ2llcworICAgICAgICAuZ2V0KGludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUpOworICAgIEludm9jYXRpb25TdHJhdGVneSBpbnZvY2F0aW9uU3RyYXRlZ3kgPSBzdHJhdGVnaWVzRm9yTGlzdGVuZXJUeXBlLmdldChsaXN0ZW5lck1ldGhvZCk7CisgICAgcmV0dXJuIGludm9jYXRpb25TdHJhdGVneTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBJbnZvY2F0aW9uU3RyYXRlZ3k8TElTVEVORVJfVFlQRSBleHRlbmRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IHsKKyAgICB2b2lkIGNhbGxNZXRob2QoTElTVEVORVJfVFlQRSBsaXN0ZW5lciwgSUludm9rZWRNZXRob2QgaW52b2tlZE1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwKKyAgICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEludm9rZUJlZm9yZUludm9jYXRpb25XaXRob3V0Q29udGV4dFN0cmF0ZWd5IGltcGxlbWVudHMKKyAgICAgIEludm9jYXRpb25TdHJhdGVneTxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiB7CisgICAgcHVibGljIHZvaWQgY2FsbE1ldGhvZChJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyLCBJSW52b2tlZE1ldGhvZCBpbnZva2VkTWV0aG9kLAorICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LCBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsKKyAgICAgIGxpc3RlbmVyLmJlZm9yZUludm9jYXRpb24oaW52b2tlZE1ldGhvZCwgdGVzdFJlc3VsdCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW52b2tlQmVmb3JlSW52b2NhdGlvbldpdGhDb250ZXh0U3RyYXRlZ3kgaW1wbGVtZW50cworICAgICAgSW52b2NhdGlvblN0cmF0ZWd5PElJbnZva2VkTWV0aG9kTGlzdGVuZXIyPiB7CisgICAgcHVibGljIHZvaWQgY2FsbE1ldGhvZChJSW52b2tlZE1ldGhvZExpc3RlbmVyMiBsaXN0ZW5lciwgSUludm9rZWRNZXRob2QgaW52b2tlZE1ldGhvZCwKKyAgICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCwgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0KSB7CisgICAgICBsaXN0ZW5lci5iZWZvcmVJbnZvY2F0aW9uKGludm9rZWRNZXRob2QsIHRlc3RSZXN1bHQsIHRlc3RDb250ZXh0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnZva2VBZnRlckludm9jYXRpb25XaXRob3V0Q29udGV4dFN0cmF0ZWd5IGltcGxlbWVudHMKKyAgICAgIEludm9jYXRpb25TdHJhdGVneTxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiB7CisgICAgcHVibGljIHZvaWQgY2FsbE1ldGhvZChJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyLCBJSW52b2tlZE1ldGhvZCBpbnZva2VkTWV0aG9kLAorICAgICAgICBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LCBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsKKyAgICAgIGxpc3RlbmVyLmFmdGVySW52b2NhdGlvbihpbnZva2VkTWV0aG9kLCB0ZXN0UmVzdWx0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnZva2VBZnRlckludm9jYXRpb25XaXRoQ29udGV4dFN0cmF0ZWd5IGltcGxlbWVudHMKKyAgICAgIEludm9jYXRpb25TdHJhdGVneTxJSW52b2tlZE1ldGhvZExpc3RlbmVyMj4geworICAgIHB1YmxpYyB2b2lkIGNhbGxNZXRob2QoSUludm9rZWRNZXRob2RMaXN0ZW5lcjIgbGlzdGVuZXIsIElJbnZva2VkTWV0aG9kIGludm9rZWRNZXRob2QsCisgICAgICAgIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQsIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkgeworICAgICAgbGlzdGVuZXIuYWZ0ZXJJbnZvY2F0aW9uKGludm9rZWRNZXRob2QsIHRlc3RSZXN1bHQsIHRlc3RDb250ZXh0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW52b2tlZE1ldGhvZExpc3RlbmVyU3VidHlwZSwgTWFwPEludm9rZWRNZXRob2RMaXN0ZW5lck1ldGhvZCwKKyAgICAgIEludm9jYXRpb25TdHJhdGVneT4+IHN0cmF0ZWdpZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludm9rZWRNZXRob2RMaXN0ZW5lck1ldGhvZCwgSW52b2NhdGlvblN0cmF0ZWd5PgorICAgICAgSU5WT0tFX1dJVEhfQ09OVEVYVF9TVFJBVEVHSUVTID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QsIEludm9jYXRpb25TdHJhdGVneT4KKyAgICAgIElOVk9LRV9XSVRIT1VUX0NPTlRFWFRfU1RSQVRFR0lFUyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHN0YXRpYyB7CisgICAgSU5WT0tFX1dJVEhfQ09OVEVYVF9TVFJBVEVHSUVTLnB1dChCRUZPUkVfSU5WT0NBVElPTiwKKyAgICAgICAgbmV3IEludm9rZUJlZm9yZUludm9jYXRpb25XaXRoQ29udGV4dFN0cmF0ZWd5KCkpOworICAgIElOVk9LRV9XSVRIX0NPTlRFWFRfU1RSQVRFR0lFUy5wdXQoQUZURVJfSU5WT0NBVElPTiwKKyAgICAgICAgbmV3IEludm9rZUFmdGVySW52b2NhdGlvbldpdGhDb250ZXh0U3RyYXRlZ3koKSk7CisgICAgSU5WT0tFX1dJVEhPVVRfQ09OVEVYVF9TVFJBVEVHSUVTLnB1dChCRUZPUkVfSU5WT0NBVElPTiwKKyAgICAgICAgbmV3IEludm9rZUJlZm9yZUludm9jYXRpb25XaXRob3V0Q29udGV4dFN0cmF0ZWd5KCkpOworICAgIElOVk9LRV9XSVRIT1VUX0NPTlRFWFRfU1RSQVRFR0lFUy5wdXQoQUZURVJfSU5WT0NBVElPTiwKKyAgICAgICAgbmV3IEludm9rZUFmdGVySW52b2NhdGlvbldpdGhvdXRDb250ZXh0U3RyYXRlZ3koKSk7CisKKyAgICBzdHJhdGVnaWVzLnB1dChFWFRFTkRFRF9MSVNURU5FUiwgSU5WT0tFX1dJVEhfQ09OVEVYVF9TVFJBVEVHSUVTKTsKKyAgICBzdHJhdGVnaWVzLnB1dChTSU1QTEVfTElTVEVORVIsIElOVk9LRV9XSVRIT1VUX0NPTlRFWFRfU1RSQVRFR0lFUyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTczYmNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2ludm9rZXJzL0ludm9rZWRNZXRob2RMaXN0ZW5lck1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2VyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kTGlzdGVuZXIyOworCisvKioKKyAqIEluZGljYXRlcyB3aGljaCBvZiB0aGUgbWV0aG9kcyBvZiBhIHtAbGluayBJSW52b2tlZE1ldGhvZExpc3RlbmVyfSBvcgorICoge0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXIyfSBzaG91bGQgYmUgY2FsbGVkLgorICoKKyAqIEBhdXRob3IgQW5zZ2FyIEtvbmVybWFubgorICovCitwdWJsaWMgZW51bSBJbnZva2VkTWV0aG9kTGlzdGVuZXJNZXRob2QgeworICBCRUZPUkVfSU5WT0NBVElPTiwKKyAgQUZURVJfSU5WT0NBVElPTgorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2ludm9rZXJzL0ludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzOWZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmludm9rZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CisKKy8qKgorICogSW5kaWNhdGVzIHdoZXRoZXIgYSB7QGxpbmsgSW52b2tlZE1ldGhvZExpc3RlbmVyTWV0aG9kfSBpcyB0byBiZSBjYWxsZWQgb24gYSBzaW1wbGUgb3IgYW4KKyAqIGV4dGVuZGVkIGludm9rZWQgbWV0aG9kIGxpc3RlbmVyLiBBbGwge0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXJ9cyBhcmUgY29uc2lkZXJlZAorICoge0BsaW5rICNTSU1QTEVfTElTVEVORVJ9LCBpbnN0YW5jZXMgb2Yge0BsaW5rIElJbnZva2VkTWV0aG9kTGlzdGVuZXIyfSBhcmUgYWxsIGNvbnNpZGVyZWQKKyAqIHtAbGluayAjRVhURU5ERURfTElTVEVORVJ9LgorICoKKyAqIEBhdXRob3IgQW5zZ2FyIEtvbmVybWFubgorICovCitlbnVtIEludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUgeworCisgIEVYVEVOREVEX0xJU1RFTkVSKElJbnZva2VkTWV0aG9kTGlzdGVuZXIyLmNsYXNzKSwKKyAgU0lNUExFX0xJU1RFTkVSKElJbnZva2VkTWV0aG9kTGlzdGVuZXIuY2xhc3MpOworCisgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IG1fbWF0Y2hpbmdJbnRlcmZhY2U7CisKKyAgcHJpdmF0ZSBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlKENsYXNzPD8gZXh0ZW5kcyBJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7CisgICAgbV9tYXRjaGluZ0ludGVyZmFjZSA9IGxpc3RlbmVyQ2xhc3M7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNJbnN0YW5jZShJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVySW5zdGFuY2UpIHsKKyAgICByZXR1cm4gbV9tYXRjaGluZ0ludGVyZmFjZS5pc0luc3RhbmNlKGxpc3RlbmVySW5zdGFuY2UpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlIGZyb21MaXN0ZW5lcihJSW52b2tlZE1ldGhvZExpc3RlbmVyIGxpc3RlbmVySW5zdGFuY2UpIHsKKyAgICBpZiAoRVhURU5ERURfTElTVEVORVIuaXNJbnN0YW5jZShsaXN0ZW5lckluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIEVYVEVOREVEX0xJU1RFTkVSOworICAgIH0KKyAgICBlbHNlIGlmIChTSU1QTEVfTElTVEVORVIuaXNJbnN0YW5jZShsaXN0ZW5lckluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIFNJTVBMRV9MSVNURU5FUjsKKyAgICB9CisgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiSWxsZWdhbCAiICsgSUludm9rZWRNZXRob2RMaXN0ZW5lci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgICAgICAgKyAiIGluc3RhbmNlOiAiICsgbGlzdGVuZXJJbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9qdW5pdC9BcnJheUFzc2VydHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9qdW5pdC9BcnJheUFzc2VydHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAxMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0FycmF5QXNzZXJ0cy5qYXZhCkBAIC0wLDAgKzEsMjczIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuanVuaXQ7CisKK3B1YmxpYyBjbGFzcyBBcnJheUFzc2VydHMgeworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3QgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLiBJZgorICAgKiA8Y29kZT5leHBlY3RlZHM8L2NvZGU+IGFuZCA8Y29kZT5hY3R1YWxzPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4sCisgICAqIHRoZXkgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAqIAorICAgKiBAcGFyYW0gbWVzc2FnZQorICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmeWluZyBtZXNzYWdlIGZvciB0aGUge0BsaW5rIEFzc2VydGlvbkVycm9yfSAoPGNvZGU+bnVsbDwvY29kZT4KKyAgICogICAgICAgICAgICBva2F5KQorICAgKiBAcGFyYW0gZXhwZWN0ZWRzCisgICAqICAgICAgICAgICAgT2JqZWN0IGFycmF5IG9yIGFycmF5IG9mIGFycmF5cyAobXVsdGktZGltZW5zaW9uYWwgYXJyYXkpIHdpdGgKKyAgICogICAgICAgICAgICBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgT2JqZWN0IGFycmF5IG9yIGFycmF5IG9mIGFycmF5cyAobXVsdGktZGltZW5zaW9uYWwgYXJyYXkpIHdpdGgKKyAgICogICAgICAgICAgICBhY3R1YWwgdmFsdWVzCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkcywKKyAgICAgICAgICBPYmplY3RbXSBhY3R1YWxzKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBpbnRlcm5hbEFycmF5RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkcywgYWN0dWFscyk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3QgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93bi4gSWYgPGNvZGU+ZXhwZWN0ZWQ8L2NvZGU+IGFuZAorICAgKiA8Y29kZT5hY3R1YWw8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgY29uc2lkZXJlZAorICAgKiBlcXVhbC4KKyAgICogCisgICAqIEBwYXJhbSBleHBlY3RlZHMKKyAgICogICAgICAgICAgICBPYmplY3QgYXJyYXkgb3IgYXJyYXkgb2YgYXJyYXlzIChtdWx0aS1kaW1lbnNpb25hbCBhcnJheSkgd2l0aAorICAgKiAgICAgICAgICAgIGV4cGVjdGVkIHZhbHVlcworICAgKiBAcGFyYW0gYWN0dWFscworICAgKiAgICAgICAgICAgIE9iamVjdCBhcnJheSBvciBhcnJheSBvZiBhcnJheXMgKG11bHRpLWRpbWVuc2lvbmFsIGFycmF5KSB3aXRoCisgICAqICAgICAgICAgICAgYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKE9iamVjdFtdIGV4cGVjdGVkcywgT2JqZWN0W10gYWN0dWFscykgeworICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobnVsbCwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGJ5dGUgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYnl0ZVtdIGV4cGVjdGVkcywKKyAgICAgICAgICBieXRlW10gYWN0dWFscykgdGhyb3dzIEFycmF5Q29tcGFyaXNvbkZhaWx1cmUgeworICAgICAgaW50ZXJuYWxBcnJheUVxdWFscyhtZXNzYWdlLCBleHBlY3RlZHMsIGFjdHVhbHMpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gYnl0ZSBhcnJheXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgorICAgKiAKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhieXRlW10gZXhwZWN0ZWRzLCBieXRlW10gYWN0dWFscykgeworICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobnVsbCwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGNoYXIgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGNoYXIgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgY2hhciBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhTdHJpbmcgbWVzc2FnZSwgY2hhcltdIGV4cGVjdGVkcywKKyAgICAgICAgICBjaGFyW10gYWN0dWFscykgdGhyb3dzIEFycmF5Q29tcGFyaXNvbkZhaWx1cmUgeworICAgICAgaW50ZXJuYWxBcnJheUVxdWFscyhtZXNzYWdlLCBleHBlY3RlZHMsIGFjdHVhbHMpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gY2hhciBhcnJheXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgorICAgKiAKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGNoYXIgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgY2hhciBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhjaGFyW10gZXhwZWN0ZWRzLCBjaGFyW10gYWN0dWFscykgeworICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobnVsbCwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIHNob3J0IGFycmF5cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgYW4KKyAgICoge0BsaW5rIEFzc2VydGlvbkVycm9yfSBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICogCisgICAqIEBwYXJhbSBtZXNzYWdlCisgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG1lc3NhZ2UgZm9yIHRoZSB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9ICg8Y29kZT5udWxsPC9jb2RlPgorICAgKiAgICAgICAgICAgIG9rYXkpCisgICAqIEBwYXJhbSBleHBlY3RlZHMKKyAgICogICAgICAgICAgICBzaG9ydCBhcnJheSB3aXRoIGV4cGVjdGVkIHZhbHVlcy4KKyAgICogQHBhcmFtIGFjdHVhbHMKKyAgICogICAgICAgICAgICBzaG9ydCBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhTdHJpbmcgbWVzc2FnZSwgc2hvcnRbXSBleHBlY3RlZHMsCisgICAgICAgICAgc2hvcnRbXSBhY3R1YWxzKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBpbnRlcm5hbEFycmF5RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkcywgYWN0dWFscyk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBzaG9ydCBhcnJheXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgorICAgKiAKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIHNob3J0IGFycmF5IHdpdGggZXhwZWN0ZWQgdmFsdWVzLgorICAgKiBAcGFyYW0gYWN0dWFscworICAgKiAgICAgICAgICAgIHNob3J0IGFycmF5IHdpdGggYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKHNob3J0W10gZXhwZWN0ZWRzLCBzaG9ydFtdIGFjdHVhbHMpIHsKKyAgICAgIGFzc2VydEFycmF5RXF1YWxzKG51bGwsIGV4cGVjdGVkcywgYWN0dWFscyk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBpbnQgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGludCBhcnJheSB3aXRoIGV4cGVjdGVkIHZhbHVlcy4KKyAgICogQHBhcmFtIGFjdHVhbHMKKyAgICogICAgICAgICAgICBpbnQgYXJyYXkgd2l0aCBhY3R1YWwgdmFsdWVzCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludFtdIGV4cGVjdGVkcywKKyAgICAgICAgICBpbnRbXSBhY3R1YWxzKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBpbnRlcm5hbEFycmF5RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkcywgYWN0dWFscyk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHR3byBpbnQgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93bi4KKyAgICogCisgICAqIEBwYXJhbSBleHBlY3RlZHMKKyAgICogICAgICAgICAgICBpbnQgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgaW50IGFycmF5IHdpdGggYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKGludFtdIGV4cGVjdGVkcywgaW50W10gYWN0dWFscykgeworICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobnVsbCwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGxvbmcgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGxvbmcgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgbG9uZyBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhTdHJpbmcgbWVzc2FnZSwgbG9uZ1tdIGV4cGVjdGVkcywKKyAgICAgICAgICBsb25nW10gYWN0dWFscykgdGhyb3dzIEFycmF5Q29tcGFyaXNvbkZhaWx1cmUgeworICAgICAgaW50ZXJuYWxBcnJheUVxdWFscyhtZXNzYWdlLCBleHBlY3RlZHMsIGFjdHVhbHMpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gbG9uZyBhcnJheXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgorICAgKiAKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGxvbmcgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgbG9uZyBhcnJheSB3aXRoIGFjdHVhbCB2YWx1ZXMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhsb25nW10gZXhwZWN0ZWRzLCBsb25nW10gYWN0dWFscykgeworICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobnVsbCwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorICAKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gZG91YmxlIGFycmF5cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgYW4KKyAgICoge0BsaW5rIEFzc2VydGlvbkVycm9yfSBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICogCisgICAqIEBwYXJhbSBtZXNzYWdlCisgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG1lc3NhZ2UgZm9yIHRoZSB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9ICg8Y29kZT5udWxsPC9jb2RlPgorICAgKiAgICAgICAgICAgIG9rYXkpCisgICAqIEBwYXJhbSBleHBlY3RlZHMKKyAgICogICAgICAgICAgICBkb3VibGUgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgZG91YmxlIGFycmF5IHdpdGggYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBkb3VibGVbXSBleHBlY3RlZHMsCisgICAgICAgICAgZG91YmxlW10gYWN0dWFscywgZG91YmxlIGRlbHRhKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBuZXcgSW5leGFjdENvbXBhcmlzb25Dcml0ZXJpYShkZWx0YSkuYXJyYXlFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGRvdWJsZSBhcnJheXMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QsIGFuCisgICAqIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaXMgdGhyb3duLgorICAgKiAKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGRvdWJsZSBhcnJheSB3aXRoIGV4cGVjdGVkIHZhbHVlcy4KKyAgICogQHBhcmFtIGFjdHVhbHMKKyAgICogICAgICAgICAgICBkb3VibGUgYXJyYXkgd2l0aCBhY3R1YWwgdmFsdWVzCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoZG91YmxlW10gZXhwZWN0ZWRzLCBkb3VibGVbXSBhY3R1YWxzLCBkb3VibGUgZGVsdGEpIHsKKyAgICAgIGFzc2VydEFycmF5RXF1YWxzKG51bGwsIGV4cGVjdGVkcywgYWN0dWFscywgZGVsdGEpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gZmxvYXQgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90LCBhbgorICAgKiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzIHRocm93biB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIGZsb2F0IGFycmF5IHdpdGggZXhwZWN0ZWQgdmFsdWVzLgorICAgKiBAcGFyYW0gYWN0dWFscworICAgKiAgICAgICAgICAgIGZsb2F0IGFycmF5IHdpdGggYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBmbG9hdFtdIGV4cGVjdGVkcywKKyAgICAgICAgICBmbG9hdFtdIGFjdHVhbHMsIGZsb2F0IGRlbHRhKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBuZXcgSW5leGFjdENvbXBhcmlzb25Dcml0ZXJpYShkZWx0YSkuYXJyYXlFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRzLCBhY3R1YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdHdvIGZsb2F0IGFycmF5cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgYW4KKyAgICoge0BsaW5rIEFzc2VydGlvbkVycm9yfSBpcyB0aHJvd24uCisgICAqIAorICAgKiBAcGFyYW0gZXhwZWN0ZWRzCisgICAqICAgICAgICAgICAgZmxvYXQgYXJyYXkgd2l0aCBleHBlY3RlZCB2YWx1ZXMuCisgICAqIEBwYXJhbSBhY3R1YWxzCisgICAqICAgICAgICAgICAgZmxvYXQgYXJyYXkgd2l0aCBhY3R1YWwgdmFsdWVzCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoZmxvYXRbXSBleHBlY3RlZHMsIGZsb2F0W10gYWN0dWFscywgZmxvYXQgZGVsdGEpIHsKKyAgICAgIGFzc2VydEFycmF5RXF1YWxzKG51bGwsIGV4cGVjdGVkcywgYWN0dWFscywgZGVsdGEpOworICB9CisKKyAgLyoqCisgICAqIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0IGFycmF5cyBhcmUgZXF1YWwuIElmIHRoZXkgYXJlIG5vdCwgYW4KKyAgICoge0BsaW5rIEFzc2VydGlvbkVycm9yfSBpcyB0aHJvd24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4gSWYKKyAgICogPGNvZGU+ZXhwZWN0ZWRzPC9jb2RlPiBhbmQgPGNvZGU+YWN0dWFsczwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+LAorICAgKiB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgKiAKKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKDxjb2RlPm51bGw8L2NvZGU+CisgICAqICAgICAgICAgICAgb2theSkKKyAgICogQHBhcmFtIGV4cGVjdGVkcworICAgKiAgICAgICAgICAgIE9iamVjdCBhcnJheSBvciBhcnJheSBvZiBhcnJheXMgKG11bHRpLWRpbWVuc2lvbmFsIGFycmF5KSB3aXRoCisgICAqICAgICAgICAgICAgZXhwZWN0ZWQgdmFsdWVzLgorICAgKiBAcGFyYW0gYWN0dWFscworICAgKiAgICAgICAgICAgIE9iamVjdCBhcnJheSBvciBhcnJheSBvZiBhcnJheXMgKG11bHRpLWRpbWVuc2lvbmFsIGFycmF5KSB3aXRoCisgICAqICAgICAgICAgICAgYWN0dWFsIHZhbHVlcworICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnRlcm5hbEFycmF5RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRzLAorICAgICAgICAgIE9iamVjdCBhY3R1YWxzKSB0aHJvd3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSB7CisgICAgICBuZXcgRXhhY3RDb21wYXJpc29uQ3JpdGVyaWEoKS5hcnJheUVxdWFscyhtZXNzYWdlLCBleHBlY3RlZHMsIGFjdHVhbHMpOworICB9ICAgCisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9qdW5pdC9BcnJheUNvbXBhcmlzb25GYWlsdXJlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvanVuaXQvQXJyYXlDb21wYXJpc29uRmFpbHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGMwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvanVuaXQvQXJyYXlDb21wYXJpc29uRmFpbHVyZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5qdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhyb3duIHdoZW4gdHdvIGFycmF5IGVsZW1lbnRzIGRpZmZlcgorICovCitwdWJsaWMgY2xhc3MgQXJyYXlDb21wYXJpc29uRmFpbHVyZSBleHRlbmRzIEFzc2VydGlvbkVycm9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRD0gMUw7CisgICAgCisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IGZJbmRpY2VzPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmTWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIEFzc2VydGlvbkVycm9yIGZDYXVzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5BcnJheUNvbXBhcmlzb25GYWlsdXJlPC9jb2RlPiB3aXRoIGFuIGVycm9yIHRleHQgYW5kIHRoZSBhcnJheSdzCisgICAgICogZGltZW5zaW9uIHRoYXQgd2FzIG5vdCBlcXVhbAorICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBhcnJheSdzIGNvbnRlbnQgdG8gZmFpbCB0aGUgYXNzZXJ0aW9uIHRlc3QgCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBhcnJheSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgZXF1YWwuCisgICAgICovCisgICAgcHVibGljIEFycmF5Q29tcGFyaXNvbkZhaWx1cmUoU3RyaW5nIG1lc3NhZ2UsIEFzc2VydGlvbkVycm9yIGNhdXNlLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgZk1lc3NhZ2U9IG1lc3NhZ2U7CisgICAgICAgIGZDYXVzZT0gY2F1c2U7CisgICAgICAgIGFkZERpbWVuc2lvbihpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRGltZW5zaW9uKGludCBpbmRleCkgeworICAgICAgICBmSW5kaWNlcy5hZGQoMCwgaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoZk1lc3NhZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZNZXNzYWdlKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoImFycmF5cyBmaXJzdCBkaWZmZXJlZCBhdCBlbGVtZW50ICIpOworICAgICAgICBmb3IgKGludCBlYWNoIDogZkluZGljZXMpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJbIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlYWNoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZDYXVzZS5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRNZXNzYWdlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0NvbXBhcmlzb25Dcml0ZXJpYS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0NvbXBhcmlzb25Dcml0ZXJpYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTA3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvanVuaXQvQ29tcGFyaXNvbkNyaXRlcmlhLmphdmEKQEAgLTAsMCArMSw3NiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmp1bml0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworCisvKioKKyAqIERlZmluZXMgY3JpdGVyaWEgZm9yIGZpbmRpbmcgdHdvIGl0ZW1zICJlcXVhbCBlbm91Z2giLiBDb25jcmV0ZSBzdWJjbGFzc2VzCisgKiBtYXkgZGVtYW5kIGV4YWN0IGVxdWFsaXR5LCBvciwgZm9yIGV4YW1wbGUsIGVxdWFsaXR5IHdpdGhpbiBhIGdpdmVuIGRlbHRhLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGFyaXNvbkNyaXRlcmlhIHsKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdHdvIGFycmF5cyBhcmUgZXF1YWwsIGFjY29yZGluZyB0byB0aGUgY3JpdGVyaWEgZGVmaW5lZCBieQorICAgICAqIHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4gSWYgdGhleSBhcmUgbm90LCBhbiB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9IGlzCisgICAgICogdGhyb3duIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuIElmIDxjb2RlPmV4cGVjdGVkczwvY29kZT4gYW5kCisgICAgICogPGNvZGU+YWN0dWFsczwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbWVzc2FnZSBmb3IgdGhlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gKAorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gb2theSkKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRzCisgICAgICogICAgICAgICAgICBPYmplY3QgYXJyYXkgb3IgYXJyYXkgb2YgYXJyYXlzIChtdWx0aS1kaW1lbnNpb25hbCBhcnJheSkgd2l0aAorICAgICAqICAgICAgICAgICAgZXhwZWN0ZWQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBhY3R1YWxzCisgICAgICogICAgICAgICAgICBPYmplY3QgYXJyYXkgb3IgYXJyYXkgb2YgYXJyYXlzIChtdWx0aS1kaW1lbnNpb25hbCBhcnJheSkgd2l0aAorICAgICAqICAgICAgICAgICAgYWN0dWFsIHZhbHVlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFycmF5RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRzLCBPYmplY3QgYWN0dWFscykKKyAgICAgICAgICAgIHRocm93cyBBcnJheUNvbXBhcmlzb25GYWlsdXJlIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkcyA9PSBhY3R1YWxzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTdHJpbmcgaGVhZGVyPSBtZXNzYWdlID09IG51bGwgPyAiIiA6IG1lc3NhZ2UgKyAiOiAiOworCisgICAgICAgIGludCBleHBlY3RlZHNMZW5ndGg9IGFzc2VydEFycmF5c0FyZVNhbWVMZW5ndGgoZXhwZWN0ZWRzLAorICAgICAgICAgICAgICAgIGFjdHVhbHMsIGhlYWRlcik7CisKKyAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGV4cGVjdGVkc0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWQ9IEFycmF5LmdldChleHBlY3RlZHMsIGkpOworICAgICAgICAgICAgT2JqZWN0IGFjdHVhbD0gQXJyYXkuZ2V0KGFjdHVhbHMsIGkpOworCisgICAgICAgICAgICBpZiAoaXNBcnJheShleHBlY3RlZCkgJiYgaXNBcnJheShhY3R1YWwpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlDb21wYXJpc29uRmFpbHVyZSBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUuYWRkRGltZW5zaW9uKGkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVsZW1lbnRzRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlDb21wYXJpc29uRmFpbHVyZShoZWFkZXIsIGUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FycmF5KE9iamVjdCBleHBlY3RlZCkgeworICAgICAgICByZXR1cm4gZXhwZWN0ZWQgIT0gbnVsbCAmJiBleHBlY3RlZC5nZXRDbGFzcygpLmlzQXJyYXkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBhc3NlcnRBcnJheXNBcmVTYW1lTGVuZ3RoKE9iamVjdCBleHBlY3RlZHMsCisgICAgICAgICAgICBPYmplY3QgYWN0dWFscywgU3RyaW5nIGhlYWRlcikgeworICAgICAgICBpZiAoZXhwZWN0ZWRzID09IG51bGwpCisgICAgICAgICAgICBBc3NlcnRKVW5pdC5mYWlsKGhlYWRlciArICJleHBlY3RlZCBhcnJheSB3YXMgbnVsbCIpOworICAgICAgICBpZiAoYWN0dWFscyA9PSBudWxsKQorICAgICAgICAgICAgQXNzZXJ0SlVuaXQuZmFpbChoZWFkZXIgKyAiYWN0dWFsIGFycmF5IHdhcyBudWxsIik7CisgICAgICAgIGludCBhY3R1YWxzTGVuZ3RoPSBBcnJheS5nZXRMZW5ndGgoYWN0dWFscyk7CisgICAgICAgIGludCBleHBlY3RlZHNMZW5ndGg9IEFycmF5LmdldExlbmd0aChleHBlY3RlZHMpOworICAgICAgICBpZiAoYWN0dWFsc0xlbmd0aCAhPSBleHBlY3RlZHNMZW5ndGgpCisgICAgICAgICAgICBBc3NlcnRKVW5pdC5mYWlsKGhlYWRlciArICJhcnJheSBsZW5ndGhzIGRpZmZlcmVkLCBleHBlY3RlZC5sZW5ndGg9IgorICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkc0xlbmd0aCArICIgYWN0dWFsLmxlbmd0aD0iICsgYWN0dWFsc0xlbmd0aCk7CisgICAgICAgIHJldHVybiBleHBlY3RlZHNMZW5ndGg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXNzZXJ0RWxlbWVudHNFcXVhbChPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0V4YWN0Q29tcGFyaXNvbkNyaXRlcmlhLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvanVuaXQvRXhhY3RDb21wYXJpc29uQ3JpdGVyaWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE1Y2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0V4YWN0Q29tcGFyaXNvbkNyaXRlcmlhLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmp1bml0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKKworcHVibGljIGNsYXNzIEV4YWN0Q29tcGFyaXNvbkNyaXRlcmlhIGV4dGVuZHMgQ29tcGFyaXNvbkNyaXRlcmlhIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFbGVtZW50c0VxdWFsKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgeworICAgICAgICBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2p1bml0L0luZXhhY3RDb21wYXJpc29uQ3JpdGVyaWEuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9qdW5pdC9JbmV4YWN0Q29tcGFyaXNvbkNyaXRlcmlhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxOGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9qdW5pdC9JbmV4YWN0Q29tcGFyaXNvbkNyaXRlcmlhLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmp1bml0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdDsKKworcHVibGljIGNsYXNzIEluZXhhY3RDb21wYXJpc29uQ3JpdGVyaWEgZXh0ZW5kcyBDb21wYXJpc29uQ3JpdGVyaWEgeworICAgIHB1YmxpYyBkb3VibGUgZkRlbHRhOworCisgICAgcHVibGljIEluZXhhY3RDb21wYXJpc29uQ3JpdGVyaWEoZG91YmxlIGRlbHRhKSB7CisgICAgICAgIGZEZWx0YT0gZGVsdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RWxlbWVudHNFcXVhbChPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgRG91YmxlKQorICAgICAgICAgICAgQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKChEb3VibGUpZXhwZWN0ZWQsIChEb3VibGUpYWN0dWFsLCBmRGVsdGEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoKEZsb2F0KWV4cGVjdGVkLCAoRmxvYXQpYWN0dWFsLCBmRGVsdGEpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvcmVtb3RlL1NsYXZlUG9vbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3JlbW90ZS9TbGF2ZVBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wM2I4NTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3JlbW90ZS9TbGF2ZVBvb2wuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwucmVtb3RlOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLkNvbm5lY3Rpb25JbmZvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEgcG9vbCBvZiBzbGF2ZXMgKHJlcHJlc2VudGVkIGJ5IHNvY2tldHMpLgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBTbGF2ZVBvb2wgeworICBwcml2YXRlIHN0YXRpYyBTb2NrZXRMaW5rZWRCbG9ja2luZ1F1ZXVlIG1faG9zdHMgPSBuZXcgU29ja2V0TGlua2VkQmxvY2tpbmdRdWV1ZSgpOworICBwcml2YXRlIHN0YXRpYyBNYXA8U29ja2V0LCBDb25uZWN0aW9uSW5mbz4gbV9jb25uZWN0aW9uSW5mb3MgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBwdWJsaWMgdm9pZCBhZGRTbGF2ZXMoU29ja2V0W10gc2xhdmVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoU29ja2V0IHMgOiBzbGF2ZXMpIHsKKyAgICAgIGFkZFNsYXZlKHMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFNsYXZlKFNvY2tldCBzKSB7CisJICBpZiggcz09bnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKwkgIENvbm5lY3Rpb25JbmZvIGNpID0gbmV3IENvbm5lY3Rpb25JbmZvKCk7CisJICBjaS5zZXRTb2NrZXQocyk7CisJICBhZGRTbGF2ZShzLCBjaSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkU2xhdmUoU29ja2V0IHMsIENvbm5lY3Rpb25JbmZvIGNpKSB7CisgICAgbV9ob3N0cy5hZGQocyk7CisgICAgbV9jb25uZWN0aW9uSW5mb3MucHV0KHMsIGNpKTsKKyAgfQorCisgIHB1YmxpYyBDb25uZWN0aW9uSW5mbyBnZXRTbGF2ZSgpIHsKKyAgICBDb25uZWN0aW9uSW5mbyByZXN1bHQgPSBudWxsOworICAgIFNvY2tldCBob3N0ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBob3N0ID0gbV9ob3N0cy50YWtlKCk7CisgICAgICByZXN1bHQgPSBtX2Nvbm5lY3Rpb25JbmZvcy5nZXQoaG9zdCk7CisgICAgfQorICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBoYW5kbGVkKSB7CisgICAgICBoYW5kbGVkLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgcmV0dXJuU2xhdmUoQ29ubmVjdGlvbkluZm8gc2xhdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbV9ob3N0cy5hZGQoc2xhdmUuZ2V0U29ja2V0KCkpOworLy8gICAgQ29ubmVjdGlvbkluZm8gY2kgPSBtX2Nvbm5lY3Rpb25JbmZvcy5yZW1vdmUoc2xhdmUuc29ja2V0KTsKKy8vICAgIGNpLm9vcy5jbG9zZSgpOworLy8gICAgY2kub2lzLmNsb3NlKCk7CisvLyAgICBhZGRTbGF2ZShzbGF2ZS5zb2NrZXQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9yZW1vdGUvU29ja2V0TGlua2VkQmxvY2tpbmdRdWV1ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3JlbW90ZS9Tb2NrZXRMaW5rZWRCbG9ja2luZ1F1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmZmYWNjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9yZW1vdGUvU29ja2V0TGlua2VkQmxvY2tpbmdRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5yZW1vdGU7DQorDQoraW1wb3J0IGphdmEubmV0LlNvY2tldDsNCisNCisvKioNCisgKiA8Y29kZT5Tb2NrZXRMaW5rZWRCbG9ja2luZ1F1ZXVlPC9jb2RlPiBpcyBhIHdyYXBwZXIgb24gTGlua2VkQmxvY2tpbmdRdWV1ZSBzbw0KKyAqIHdlIG1heSBmYWN0b3Igb3V0IGNvZGUgY29tbW9uIHRvIEpESzE0IGFuZCBKREs1KyB1c2luZyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24NCisgKiBvZiBMaW5rZWRCbG9ja2luZ1F1ZXVlDQorICoNCisgKiBAYXV0aG9yIGNxdWV6ZWwNCisgKiBAc2luY2UgNS4yDQorICovDQorcHVibGljIGNsYXNzIFNvY2tldExpbmtlZEJsb2NraW5nUXVldWUgZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlPFNvY2tldD4NCit7DQorDQorICAvKioNCisgICAqDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ1NDg0NTA0OTU4MDY1Mjc5ODVMOw0KKyAgLy8gd3JhcHBlcg0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0V4ZWN1dG9yQWRhcHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9FeGVjdXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTRhMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9FeGVjdXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIGZvciA8Y29kZT5JRXhlY3V0b3I8L2NvZGU+IGJhc2VkIG9uIDxjb2RlPlRocmVhZFBvb2xFeGVjdXRvcjwvY29kZT4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dG9yQWRhcHRlciBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvciBpbXBsZW1lbnRzIElFeGVjdXRvciB7CisgIHByaXZhdGUgSVRocmVhZEZhY3RvcnkgbV90aHJlYWRGYWN0b3J5OworCisgIHB1YmxpYyBFeGVjdXRvckFkYXB0ZXIoaW50IHRocmVhZENvdW50LCBJVGhyZWFkRmFjdG9yeSB0ZikgeworICAgICAgc3VwZXIodGhyZWFkQ291bnQsCisgICAgICAgICAgICB0aHJlYWRDb3VudCwKKyAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLAorICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCksCisgICAgICAgICAgICAoVGhyZWFkRmFjdG9yeSkgdGYuZ2V0VGhyZWFkRmFjdG9yeSgpKTsKKyAgICAgIG1fdGhyZWFkRmFjdG9yeSA9IHRmOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgcHVibGljIElGdXR1cmVSZXN1bHQgc3VibWl0UnVubmFibGUoZmluYWwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlUmVzdWx0QWRhcHRlcihzdXBlci5zdWJtaXQocnVubmFibGUpKTsKKyAgIH0KKworICAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3BOb3coKSB7CisgICAgICBzdXBlci5zaHV0ZG93bk5vdygpOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYXdhaXRUZXJtaW5hdGlvbihsb25nIHRpbWVvdXQpIHsKKyAgICAgYm9vbGVhbiByZXN1bHQ9IGZhbHNlOworICAgICB0cnkgeworICAgICAgcmVzdWx0PSBzdXBlci5hd2FpdFRlcm1pbmF0aW9uKHRpbWVvdXQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgIH0KKyAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaGFuZGxlZCkgeworICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1dBUk5dIFRocmVhZFBvb2xFeGVjdXRvciBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB3aGlsZSBhd2FpdGluZyB0ZXJtaW5hdGlvbiIpOworICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgIH0KKworICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RhY2tUcmFjZUVsZW1lbnRbXVtdIGdldFN0YWNrVHJhY2VzKCkgeworICAgIExpc3Q8VGhyZWFkPiB0aHJlYWRzID0gbV90aHJlYWRGYWN0b3J5LmdldFRocmVhZHMoKTsKKyAgICBpbnQgdGhyZWFkQ291bnQgPSB0aHJlYWRzLnNpemUoKTsKKyAgICBTdGFja1RyYWNlRWxlbWVudFtdW10gcmVzdWx0ID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50W3RocmVhZENvdW50XVtdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSB0aHJlYWRzLmdldChpKS5nZXRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0Z1dHVyZVJlc3VsdEFkYXB0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvRnV0dXJlUmVzdWx0QWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmExM2FlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0Z1dHVyZVJlc3VsdEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCisvKioKKyAqIEEgdmVyeSByZWR1Y2VkIGludGVyZmFjZSBvZiA8Y29kZT5GdXR1cmU8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvPnRoZV9taW5kc3Rvcm08L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBGdXR1cmVSZXN1bHRBZGFwdGVyIGltcGxlbWVudHMgSUZ1dHVyZVJlc3VsdCB7CisgICBGdXR1cmU8Pz4gbV9mdXR1cmU7CisKKyAgIHB1YmxpYyBGdXR1cmVSZXN1bHRBZGFwdGVyKEZ1dHVyZTw/PiBmdXR1cmUpIHsKKyAgICAgIG1fZnV0dXJlID0gZnV0dXJlOworICAgfQorCisgICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBnZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRocmVhZEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICAgcmV0dXJuIG1fZnV0dXJlLmdldCgpOworICAgICAgfQorICAgICAgY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICB0aHJvdyBuZXcgVGhyZWFkRXhlY3V0aW9uRXhjZXB0aW9uKGVlLmdldENhdXNlKCkpOyAvLyBOT1RFIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCB0aGUgRUUKKyAgICAgIH0KKyAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0lFeGVjdXRvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9JRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTNlMzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9JRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCisvKioKKyAqIFJlZHVjZWQgaW50ZXJmYWNlIHRvIG1pbWljIGFuIEV4ZWN1dG9yU2VydmljZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dG9yIHsKKyAgIElGdXR1cmVSZXN1bHQgc3VibWl0UnVubmFibGUoUnVubmFibGUgcnVubmFibGUpOworCisgICB2b2lkIHNodXRkb3duKCk7CisKKyAgIGJvb2xlYW4gYXdhaXRUZXJtaW5hdGlvbihsb25nIHRpbWVvdXQpOworCisgICB2b2lkIHN0b3BOb3coKTsKKworICAgU3RhY2tUcmFjZUVsZW1lbnRbXVtdIGdldFN0YWNrVHJhY2VzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0lGdXR1cmVSZXN1bHQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvSUZ1dHVyZVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhOTVlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0lGdXR1cmVSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCisvKioKKyAqIFJlZHVjZWQgaW50ZXJmYWNlIHRvIG1pbWljIEZ1dHVyZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUZ1dHVyZVJlc3VsdCB7CisgICBPYmplY3QgZ2V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaHJlYWRFeGVjdXRpb25FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0lUaHJlYWRGYWN0b3J5LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL0lUaHJlYWRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzAwOTA5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvSVRocmVhZEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUmVkdWNlZCBpbnRlcmZhY2UgdG8gbWltaWMgVGhyZWFkRmFjdG9yeS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtQGV2b2x2YS5ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRocmVhZEZhY3RvcnkgeworICAgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSBydW4pOworCisgICBPYmplY3QgZ2V0VGhyZWFkRmFjdG9yeSgpOworCisgICBMaXN0PFRocmVhZD4gZ2V0VGhyZWFkcygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UZXN0TkdUaHJlYWQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvVGVzdE5HVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA1YjQxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvVGVzdE5HVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZDsKKworLyoqCisgKiBDdXN0b20gbmFtZWQgdGhyZWFkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3ROR1RocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICBwdWJsaWMgVGVzdE5HVGhyZWFkKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICBzdXBlcigiVGVzdE5HSW52b2tlci0iICsgbWV0aG9kTmFtZSArICIoKSIpOworICAgfQorCisgICBwdWJsaWMgVGVzdE5HVGhyZWFkKFJ1bm5hYmxlIHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgIHN1cGVyKHRhcmdldCwgIlRlc3ROR0ludm9rZXItIiArIG1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL1RocmVhZEV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UaHJlYWRFeGVjdXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWZmMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UaHJlYWRFeGVjdXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkOworCisvKioKKyAqIFdyYXBwZXIgZXhjZXB0aW9uIGZvciBFeGVjdXRpb25FeGNlcHRpb25zLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvPnRoZV9taW5kc3Rvcm08L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc2NjY0NDE0MzMzMzIzNjI2M0w7CisKKyAgIHB1YmxpYyBUaHJlYWRFeGVjdXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKKwkJc3VwZXIodCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvVGhyZWFkVGltZW91dEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UaHJlYWRUaW1lb3V0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM3MTAwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvVGhyZWFkVGltZW91dEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQ7CisKKy8qKgorICogRXhjZXB0aW9uIHVzZWQgdG8gc2lnbmFsIGEgdGhyZWFkIHRpbWVvdXQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkVGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MDA5NDAwNzI5NzgzMzkzNTQ4TDsKKworICAgcHVibGljIFRocmVhZFRpbWVvdXRFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgc3VwZXIobXNnKTsKKyAgIH0KKworICAgcHVibGljIFRocmVhZFRpbWVvdXRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICBzdXBlcihjYXVzZSk7CisgICB9CisKKyAgIHB1YmxpYyBUaHJlYWRUaW1lb3V0RXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UaHJlYWRVdGlsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL1RocmVhZFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRjZmViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9UaHJlYWRVdGlsLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7DQoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsNCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsNCisNCisvKioNCisgKiBBIGhlbHBlciBjbGFzcyB0byBpbnRlcmZhY2UgVGVzdE5HIGNvbmN1cnJlbmN5IHVzYWdlLg0KKyAqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8+QWxleCBQb3Blc2N1PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUaHJlYWRVdGlsIHsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURfTkFNRSA9ICJUZXN0TkciOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIHdhcyBjcmVhdGVkIGJ5IFRlc3RORy4NCisgICAqLw0KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdE5HVGhyZWFkKCkgew0KKyAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkuY29udGFpbnMoVEhSRUFEX05BTUUpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBQYXJhbGxlbCBleGVjdXRpb24gb2YgdGhlIDxjb2RlPnRhc2tzPC9jb2RlPi4gVGhlIHN0YXJ0dXAgaXMgc3luY2hyb25pemVkIHNvIHRoaXMgbWV0aG9kDQorICAgKiBlbXVsYXRlcyBhIGxvYWQgdGVzdC4NCisgICAqIEBwYXJhbSB0YXNrcyB0aGUgbGlzdCBvZiB0YXNrcyB0byBiZSBydW4NCisgICAqIEBwYXJhbSB0aHJlYWRQb29sU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgcGFyYWxsZWwgdGhyZWFkcyB0byBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIHRhc2tzDQorICAgKiBAcGFyYW0gdGltZW91dCBhIG1heGltdW0gdGltZW91dCB0byB3YWl0IGZvciB0YXNrcyBmaW5hbGl6YXRpb24NCisgICAqIEBwYXJhbSB0cmlnZ2VyQXRPbmNlIDx0dD50cnVlPC90dD4gaWYgdGhlIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiB0YXNrcyBzaG91bGQgYmUgdHJpZ2dlciBhdCBvbmNlDQorICAgKi8NCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBleGVjdXRlKExpc3Q8PyBleHRlbmRzIFJ1bm5hYmxlPiB0YXNrcywgaW50IHRocmVhZFBvb2xTaXplLA0KKyAgICAgIGxvbmcgdGltZW91dCwgYm9vbGVhbiB0cmlnZ2VyQXRPbmNlKSB7DQorICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0R2F0ZT0gbmV3IENvdW50RG93bkxhdGNoKDEpOw0KKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBlbmRHYXRlPSBuZXcgQ291bnREb3duTGF0Y2godGFza3Muc2l6ZSgpKTsNCisNCisgICAgVXRpbHMubG9nKCJUaHJlYWRVdGlsIiwgMiwgIlN0YXJ0aW5nIGV4ZWN1dG9yIHRpbWVPdXQ6IiArIHRpbWVvdXQgKyAibXMiDQorICAgICAgICArICIgd29ya2VyczoiICsgdGFza3Muc2l6ZSgpICsgIiB0aHJlYWRQb29sU2l6ZToiICsgdGhyZWFkUG9vbFNpemUpOw0KKyAgICBFeGVjdXRvclNlcnZpY2UgcG9vbGVkRXhlY3V0b3IgPSAvLyBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKHRocmVhZFBvb2xTaXplKTsNCisgICAgICAgIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IodGhyZWFkUG9vbFNpemUsIHRocmVhZFBvb2xTaXplLA0KKyAgICAgICAgdGltZW91dCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLA0KKyAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCksDQorICAgICAgICBuZXcgVGhyZWFkRmFjdG9yeSgpIHsNCisgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsNCisgICAgICAgICAgICBUaHJlYWQgcmVzdWx0ID0gbmV3IFRocmVhZChyKTsNCisgICAgICAgICAgICByZXN1bHQuc2V0TmFtZShUSFJFQURfTkFNRSk7DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorDQorICAgIExpc3Q8Q2FsbGFibGU8T2JqZWN0Pj4gY2FsbGFibGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICAgIGZvciAoZmluYWwgUnVubmFibGUgdGFzayA6IHRhc2tzKSB7DQorICAgICAgY2FsbGFibGVzLmFkZChuZXcgQ2FsbGFibGU8T2JqZWN0PigpIHsNCisNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICAgIHRhc2sucnVuKCk7DQorICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgIH0pOw0KKyAgICB9DQorICAgIHRyeSB7DQorICAgICAgaWYgKHRpbWVvdXQgIT0gMCkgew0KKyAgICAgICAgcG9vbGVkRXhlY3V0b3IuaW52b2tlQWxsKGNhbGxhYmxlcywgdGltZW91dCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcG9vbGVkRXhlY3V0b3IuaW52b2tlQWxsKGNhbGxhYmxlcyk7DQorICAgICAgfQ0KKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBoYW5kbGVkKSB7DQorICAgICAgaGFuZGxlZC5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOw0KKyAgICB9IGZpbmFsbHkgew0KKyAgICAgIHBvb2xlZEV4ZWN1dG9yLnNodXRkb3duKCk7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhIHJlYWRhYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZC4NCisgICAqLw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3VycmVudFRocmVhZEluZm8oKSB7DQorICAgIFRocmVhZCB0aHJlYWQ9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQorICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0aHJlYWQuZ2V0TmFtZSgpICsgIkAiICsgdGhyZWFkLmhhc2hDb2RlKCkpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJRXhlY3V0b3IgY3JlYXRlRXhlY3V0b3IoaW50IHRocmVhZENvdW50LCBTdHJpbmcgdGhyZWFkRmFjdG9yeU5hbWUpIHsNCisgICAgcmV0dXJuIG5ldyBFeGVjdXRvckFkYXB0ZXIodGhyZWFkQ291bnQsIGNyZWF0ZUZhY3RvcnkodGhyZWFkRmFjdG9yeU5hbWUpKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIElUaHJlYWRGYWN0b3J5IGNyZWF0ZUZhY3RvcnkoU3RyaW5nIG5hbWUpIHsNCisgICAgcmV0dXJuIG5ldyBUaHJlYWRGYWN0b3J5SW1wbChuYW1lKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1zZykgew0KKyAgICBVdGlscy5sb2coIlRocmVhZFV0aWw6IiArIFRocmVhZFV0aWwuY3VycmVudFRocmVhZEluZm8oKSwgbGV2ZWwsIG1zZyk7DQorICB9DQorDQorICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocmVhZEZhY3RvcnlJbXBsIGltcGxlbWVudHMgSVRocmVhZEZhY3RvcnksIFRocmVhZEZhY3Rvcnkgew0KKyAgICBwcml2YXRlIFN0cmluZyBtX21ldGhvZE5hbWU7DQorICAgIHByaXZhdGUgTGlzdDxUaHJlYWQ+IG1fdGhyZWFkcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKw0KKyAgICBwdWJsaWMgVGhyZWFkRmFjdG9yeUltcGwoU3RyaW5nIG5hbWUpIHsNCisgICAgICBtX21ldGhvZE5hbWU9IG5hbWU7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHJ1bikgew0KKyAgICAgIFRocmVhZCByZXN1bHQgPSBuZXcgVGVzdE5HVGhyZWFkKHJ1biwgbV9tZXRob2ROYW1lKTsNCisgICAgICBtX3RocmVhZHMuYWRkKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIE9iamVjdCBnZXRUaHJlYWRGYWN0b3J5KCkgew0KKyAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgTGlzdDxUaHJlYWQ+IGdldFRocmVhZHMoKSB7DQorICAgICAgcmV0dXJuIG1fdGhyZWFkczsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL2dyYXBoL0dyYXBoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL2dyYXBoL0dyYXBoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMjU4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvZ3JhcGgvR3JhcGhUaHJlYWRQb29sRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5ncmFwaDsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5EeW5hbWljR3JhcGg7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5EeW5hbWljR3JhcGguU3RhdHVzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBbiBFeGVjdXRvciB0aGF0IGxhdW5jaGVzIHRhc2tzIHBlciBiYXRjaGVzLiBJdCB0YWtlcyBhIHtAY29kZSBEeW5hbWljR3JhcGh9CisgKiBvZiB0YXNrcyB0byBiZSBydW4gYW5kIGEge0Bjb2RlIElUaHJlYWRXb3JrZXJGYWN0b3J5fSB0byBpbml0aWFsaXplL2NyZWF0ZQorICoge0Bjb2RlIFJ1bm5hYmxlfSB3cmFwcGVycyBhcm91bmQgdGhvc2UgdGFza3MKKyAqLworcHVibGljIGNsYXNzIEdyYXBoVGhyZWFkUG9vbEV4ZWN1dG9yPFQ+IGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAvKiogU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgR3JhcGhWaXogZ3JhcGhzICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRE9UX0ZJTEVTID0gZmFsc2U7CisKKyAgcHJpdmF0ZSBEeW5hbWljR3JhcGg8VD4gbV9ncmFwaDsKKyAgcHJpdmF0ZSBMaXN0PFJ1bm5hYmxlPiBtX2FjdGl2ZVJ1bm5hYmxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIElUaHJlYWRXb3JrZXJGYWN0b3J5PFQ+IG1fZmFjdG9yeTsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9kb3RGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIGludCBtX3RocmVhZENvdW50OworCisgIHB1YmxpYyBHcmFwaFRocmVhZFBvb2xFeGVjdXRvcihEeW5hbWljR3JhcGg8VD4gZ3JhcGgsIElUaHJlYWRXb3JrZXJGYWN0b3J5PFQ+IGZhY3RvcnksIGludCBjb3JlUG9vbFNpemUsCisgICAgICBpbnQgbWF4aW11bVBvb2xTaXplLCBsb25nIGtlZXBBbGl2ZVRpbWUsIFRpbWVVbml0IHVuaXQsIEJsb2NraW5nUXVldWU8UnVubmFibGU+IHdvcmtRdWV1ZSkgeworICAgIHN1cGVyKGNvcmVQb29sU2l6ZSwgbWF4aW11bVBvb2xTaXplLCBrZWVwQWxpdmVUaW1lLCB1bml0LCB3b3JrUXVldWUKKyAgICAgICAgLyogLCBuZXcgVGVzdE5HVGhyZWFkUG9vbEZhY3RvcnkoKSAqLyk7CisgICAgcHBwKCJJbml0aWFsaXppbmcgZXhlY3V0b3Igd2l0aCAiICsgY29yZVBvb2xTaXplICsgIiB0aHJlYWRzIGFuZCBmb2xsb3dpbmcgZ3JhcGggIiArIGdyYXBoKTsKKyAgICBtX3RocmVhZENvdW50ID0gbWF4aW11bVBvb2xTaXplOworICAgIG1fZ3JhcGggPSBncmFwaDsKKyAgICBtX2ZhY3RvcnkgPSBmYWN0b3J5OworCisgICAgaWYgKG1fZ3JhcGguZ2V0RnJlZU5vZGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJUaGUgZ3JhcGggb2YgbWV0aG9kcyBjb250YWlucyBhIGN5Y2xlOiIgKyBncmFwaC5nZXRFZGdlcygpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgc3luY2hyb25pemVkKG1fZ3JhcGgpIHsKKyAgICAgIGlmIChET1RfRklMRVMpIHsKKyAgICAgICAgbV9kb3RGaWxlcy5hZGQobV9ncmFwaC50b0RvdCgpKTsKKyAgICAgIH0KKyAgICAgIExpc3Q8VD4gZnJlZU5vZGVzID0gbV9ncmFwaC5nZXRGcmVlTm9kZXMoKTsKKyAgICAgIHJ1bk5vZGVzKGZyZWVOb2Rlcyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBvbmUgd29ya2VyIHBlciBub2RlIGFuZCBleGVjdXRlIHRoZW0uCisgICAqLworICBwcml2YXRlIHZvaWQgcnVuTm9kZXMoTGlzdDxUPiBmcmVlTm9kZXMpIHsKKyAgICBMaXN0PElXb3JrZXI8VD4+IHJ1bm5hYmxlcyA9IG1fZmFjdG9yeS5jcmVhdGVXb3JrZXJzKGZyZWVOb2Rlcyk7CisgICAgZm9yIChJV29ya2VyPFQ+IHIgOiBydW5uYWJsZXMpIHsKKyAgICAgIG1fYWN0aXZlUnVubmFibGVzLmFkZChyKTsKKyAgICAgIHBwcCgiQWRkZWQgdG8gYWN0aXZlIHJ1bm5hYmxlIik7CisgICAgICBzZXRTdGF0dXMociwgU3RhdHVzLlJVTk5JTkcpOworICAgICAgcHBwKCJFeGVjdXRpbmc6ICIgKyByKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGV4ZWN1dGUocik7CisvLyAgICAgICAgaWYgKG1fdGhyZWFkQ291bnQgPiAxKSBleGVjdXRlKHIpOworLy8gICAgICAgIGVsc2Ugci5ydW4oKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0U3RhdHVzKElXb3JrZXI8VD4gd29ya2VyLCBTdGF0dXMgc3RhdHVzKSB7CisgICAgcHBwKCJTZXQgc3RhdHVzOiIgKyB3b3JrZXIgKyAiIHN0YXR1czoiICsgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1cy5GSU5JU0hFRCkgeworICAgICAgbV9hY3RpdmVSdW5uYWJsZXMucmVtb3ZlKHdvcmtlcik7CisgICAgfQorICAgIHN5bmNocm9uaXplZChtX2dyYXBoKSB7CisgICAgICBmb3IgKFQgbSA6IHdvcmtlci5nZXRUYXNrcygpKSB7CisgICAgICAgIG1fZ3JhcGguc2V0U3RhdHVzKG0sIHN0YXR1cyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVyRXhlY3V0ZShSdW5uYWJsZSByLCBUaHJvd2FibGUgdCkgeworICAgIHBwcCgiRmluaXNoZWQgcnVubmFibGU6IiArIHIpOworICAgIHNldFN0YXR1cygoSVdvcmtlcjxUPikgciwgU3RhdHVzLkZJTklTSEVEKTsKKyAgICBzeW5jaHJvbml6ZWQobV9ncmFwaCkgeworICAgICAgcHBwKCJOb2RlIGNvdW50OiIgKyBtX2dyYXBoLmdldE5vZGVDb3VudCgpICsgIiBhbmQgIgorICAgICAgICAgICsgbV9ncmFwaC5nZXROb2RlQ291bnRXaXRoU3RhdHVzKFN0YXR1cy5GSU5JU0hFRCkgKyAiIGZpbmlzaGVkIik7CisgICAgICBpZiAobV9ncmFwaC5nZXROb2RlQ291bnQoKSA9PSBtX2dyYXBoLmdldE5vZGVDb3VudFdpdGhTdGF0dXMoU3RhdHVzLkZJTklTSEVEKSkgeworICAgICAgICBwcHAoIlNodXR0aW5nIGRvd24gZXhlY3V0b3IgIiArIHRoaXMpOworICAgICAgICBpZiAoRE9UX0ZJTEVTKSB7CisgICAgICAgICAgZ2VuZXJhdGVGaWxlcyhtX2RvdEZpbGVzKTsKKyAgICAgICAgfQorICAgICAgICBzaHV0ZG93bigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKERPVF9GSUxFUykgeworICAgICAgICAgIG1fZG90RmlsZXMuYWRkKG1fZ3JhcGgudG9Eb3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxUPiBmcmVlTm9kZXMgPSBtX2dyYXBoLmdldEZyZWVOb2RlcygpOworICAgICAgICBydW5Ob2RlcyhmcmVlTm9kZXMpOworICAgICAgfQorICAgIH0KKy8vICAgIGlmIChtX2FjdGl2ZVJ1bm5hYmxlcy5pc0VtcHR5KCkgJiYgbV9pbmRleCA8IG1fcnVubmFibGVzLmdldFNpemUoKSkgeworLy8gICAgICBydW5Ob2RlcyhtX2luZGV4KyspOworLy8gICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRmlsZXMoTGlzdDxTdHJpbmc+IGZpbGVzKSB7CisgICAgdHJ5IHsKKyAgICAgIEZpbGUgZGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiVGVzdE5HLSIsICIiKTsKKyAgICAgIGRpci5kZWxldGUoKTsKKyAgICAgIGRpci5ta2RpcigpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsICIiICsgKGkgPCAxMCA/ICIwIiA6ICIiKSArIGkgKyAiLmRvdCIpOworICAgICAgICBCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmKSk7CisgICAgICAgIGJ3LmFwcGVuZChmaWxlcy5nZXQoaSkpOworICAgICAgICBidy5jbG9zZSgpOworICAgICAgfQorICAgICAgaWYgKERPVF9GSUxFUykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZWQgZ3JhcGggZmlsZXMgaW4gIiArIGRpcik7CisgICAgICB9CisgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKERFQlVHKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PSBbR3JhcGhUaHJlYWRQb29sRXhlY3V0b3JdICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiICIKKyAgICAgICAgICArIHN0cmluZyk7CisgICAgfQorICB9CisKK30KKworY2xhc3MgVGVzdE5HVGhyZWFkUG9vbEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKKyAgcHJpdmF0ZSBpbnQgbV9jb3VudCA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKyAgICBUaHJlYWQgcmVzdWx0ID0gbmV3IFRocmVhZChyKTsKKyAgICByZXN1bHQuc2V0TmFtZSgiVGVzdE5HLSIgKyBtX2NvdW50KyspOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvZ3JhcGgvSVRocmVhZFdvcmtlckZhY3RvcnkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvZ3JhcGgvSVRocmVhZFdvcmtlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGI1YTEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9ncmFwaC9JVGhyZWFkV29ya2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisKKy8qKgorICogQSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB3b3JrZXJzIHVzZWQgYnkge0Bjb2RlIEdyYXBoVGhyZWFkUG9vbEV4ZWN1dG9yfQorICogQGF1dGhvciBudWxsaW4KKyAqCisgKiBAcGFyYW0gPFQ+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRocmVhZFdvcmtlckZhY3Rvcnk8VD4geworCisgIC8qKgorICAgKiBDcmVhdGVzIHtAY29kZSBJV29ya2VyfSBmb3Igc3BlY2lmaWVkIHNldCBvZiB0YXNrcy4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0aGF0CisgICAqIG51bWJlciBvZiB3b3JrZXJzIHJldHVybmVkIGJlIHNhbWUgYXMgbnVtYmVyIG9mIHRhc2tzIGVudGVyZWQuCisgICAqCisgICAqIEBwYXJhbSBmcmVlTm9kZXMgdGFza3MgdGhhdCBuZWVkIHRvIGJlIGV4ZWN1dGVkCisgICAqIEByZXR1cm4gbGlzdCBvZiB3b3JrZXJzCisgICAqLworICBMaXN0PElXb3JrZXI8VD4+IGNyZWF0ZVdvcmtlcnMoTGlzdDxUPiBmcmVlTm9kZXMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9ncmFwaC9JV29ya2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL2dyYXBoL0lXb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBkYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL3RocmVhZC9ncmFwaC9JV29ya2VyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLnRocmVhZC5ncmFwaDsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorLyoqDQorICogQSBydW5uYWJsZSBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHtAY29kZSBHcmFwaFRocmVhZFBvb2xFeGVjdXRvcn0gdG8gZXhlY3V0ZQ0KKyAqIHRhc2tzDQorICovDQorcHVibGljIGludGVyZmFjZSBJV29ya2VyPFQ+IGV4dGVuZHMgUnVubmFibGUsIENvbXBhcmFibGU8SVdvcmtlcjxUPj4gew0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGFza3MgdGhpcyB3b3JrZXIgaXMgd29ya2luZyBvbi4NCisgICAqLw0KKyAgTGlzdDxUPiBnZXRUYXNrcygpOw0KKw0KKyAgLyoqDQorICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHRpbWUgYWxsb3dlZCBmb3IgdGhlIHdvcmtlciB0byBjb21wbGV0ZSB0aGUgdGFzay4NCisgICAqLw0KKyAgbG9uZyBnZXRUaW1lT3V0KCk7DQorDQorICAvKioNCisgICAqIEByZXR1cm4gdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFzay4NCisgICAqLw0KKyAgaW50IGdldFByaW9yaXR5KCk7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC90aHJlYWQvZ3JhcGgvU3VpdGVXb3JrZXJGYWN0b3J5LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL2dyYXBoL1N1aXRlV29ya2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmUyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvdGhyZWFkL2dyYXBoL1N1aXRlV29ya2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuZ3JhcGg7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLlN1aXRlUnVubmVyV29ya2VyOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5TdWl0ZVJ1bm5lck1hcDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIHtAY29kZSBJVGhyZWFkV29ya2VyRmFjdG9yeX0gZm9yIHtAY29kZSBTdWl0ZVJ1bm5lcn1zCisgKgorICogQGF1dGhvciBudWxsaW4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdWl0ZVdvcmtlckZhY3RvcnkgaW1wbGVtZW50cyBJVGhyZWFkV29ya2VyRmFjdG9yeTxJU3VpdGU+Cit7CisgIHByaXZhdGUgSW50ZWdlciBtX3ZlcmJvc2U7CisgIHByaXZhdGUgU3RyaW5nIG1fZGVmYXVsdFN1aXRlTmFtZTsKKyAgcHJpdmF0ZSBTdWl0ZVJ1bm5lck1hcCBtX3N1aXRlUnVubmVyTWFwOworCisgIHB1YmxpYyBTdWl0ZVdvcmtlckZhY3RvcnkoU3VpdGVSdW5uZXJNYXAgc3VpdGVSdW5uZXJNYXAsCisgICAgICBJbnRlZ2VyIHZlcmJvc2UsIFN0cmluZyBkZWZhdWx0U3VpdGVOYW1lKSB7CisgICAgbV9zdWl0ZVJ1bm5lck1hcCA9IHN1aXRlUnVubmVyTWFwOworICAgIG1fdmVyYm9zZSA9IHZlcmJvc2U7CisgICAgbV9kZWZhdWx0U3VpdGVOYW1lID0gZGVmYXVsdFN1aXRlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBGb3IgZWFjaCBzdWl0ZSwgY3JlYXRlcyBhIHtAY29kZSBTdWl0ZVJ1bm5lcldvcmtlcn0KKyAgICogQHBhcmFtIHN1aXRlcyBzZXQgb2Ygc3VpdGUgcnVubmVycworICAgKiBAcmV0dXJuIGxpc3Qgb2Ygc3VpdGUgcnVubmVyIHdvcmtlcnMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxJV29ya2VyPElTdWl0ZT4+IGNyZWF0ZVdvcmtlcnMoTGlzdDxJU3VpdGU+IHN1aXRlcykKKyAgeworICAgIExpc3Q8SVdvcmtlcjxJU3VpdGU+PiBzdWl0ZVdvcmtlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKElTdWl0ZSBzdWl0ZVJ1bm5lciA6IHN1aXRlcykgeworICAgICAgU3VpdGVSdW5uZXJXb3JrZXIgd29ya2VyID0gbmV3IFN1aXRlUnVubmVyV29ya2VyKHN1aXRlUnVubmVyLCBtX3N1aXRlUnVubmVyTWFwLAorICAgICAgICBtX3ZlcmJvc2UsIG1fZGVmYXVsdFN1aXRlTmFtZSk7CisgICAgICBzdWl0ZVdvcmtlcnMuYWRkKHdvcmtlcik7CisgICAgfQorICAgIHJldHVybiBzdWl0ZVdvcmtlcnM7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0lKVW5pdFRlc3RSdW5uZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9JSlVuaXRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTIzOGM3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9JSlVuaXRUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklUZXN0UmVzdWx0Tm90aWZpZXI7DQorDQorDQorLyoqDQorICogQW4gYWJzdHJhY3Rpb24gaW50ZXJmYWNlIG92ZXIgSlVuaXQgdGVzdCBydW5uZXJzLg0KKyAqDQorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgSUpVbml0VGVzdFJ1bm5lciB7DQorDQorICB2b2lkIHNldEludm9rZWRNZXRob2RMaXN0ZW5lcnMoQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lcik7DQorDQorICB2b2lkIHNldFRlc3RSZXN1bHROb3RpZmllcihJVGVzdFJlc3VsdE5vdGlmaWVyIG5vdGlmaWVyKTsNCisNCisgIHZvaWQgcnVuKENsYXNzIGp1bml0VGVzdENsYXNzLCBTdHJpbmcuLi4gbWV0aG9kcyk7DQorDQorICBMaXN0PElUZXN0TkdNZXRob2Q+IGdldFRlc3RNZXRob2RzKCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDNUZXN0Q2xhc3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDNUZXN0Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmYwYjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0M1Rlc3RDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdDNUZXN0Q2xhc3MgZXh0ZW5kcyBKVW5pdFRlc3RDbGFzcyB7CisKKyAgICBwdWJsaWMgSlVuaXQzVGVzdENsYXNzKFRlc3QgdGVzdCkgeworICAgICAgICBzdXBlcih0ZXN0LmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDNUZXN0TWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQzVGVzdE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjMzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQzVGVzdE1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5qdW5pdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdDNUZXN0TWV0aG9kIGV4dGVuZHMgSlVuaXRUZXN0TWV0aG9kIHsKKworICAgIHB1YmxpYyBKVW5pdDNUZXN0TWV0aG9kKEpVbml0VGVzdENsYXNzIG93bmVyLCBUZXN0IHRlc3QpIHsKKyAgICAgICAgc3VwZXIob3duZXIsIGdldE1ldGhvZCh0ZXN0KSwgdGVzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChUZXN0IHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG5hbWVNZXRob2QgPSB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXROYW1lIik7CisgICAgICAgICAgICBuYW1lID0gKFN0cmluZykgbmFtZU1ldGhvZC5pbnZva2UodCk7CisgICAgICAgICAgICByZXR1cm4gdC5nZXRDbGFzcygpLmdldE1ldGhvZChuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7CisgICAgICAgICAgICBVdGlscy5sb2coIkpVbml0M1Rlc3RNZXRob2QiLCAyLAorICAgICAgICAgICAgICAgICAgICAiTWV0aG9kICciICsgbmFtZSArICInIG5vdCBmb3VuZCBpbiBjbGFzcyAnIiArIHQgKyAiJzogIiArIHRoLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDNUZXN0UmVjb2duaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0M1Rlc3RSZWNvZ25pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNGRmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDNUZXN0UmVjb2duaXplci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5qdW5pdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCitwdWJsaWMgY2xhc3MgSlVuaXQzVGVzdFJlY29nbml6ZXIgaW1wbGVtZW50cyBKVW5pdFRlc3RSZWNvZ25pemVyIHsKKworICAgIHB1YmxpYyBKVW5pdDNUZXN0UmVjb2duaXplcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3QoQ2xhc3MgYykgeworICAgICAgICAvL2NsYXNzIGltcGxlbWVudGluZyBqdW5pdC5mcmFtZXdvcmsuVGVzdCB3aXRoIGF0IGxlYXN0IG9uZSB0ZXN0KiBtZXRob2QKKyAgICAgICAgaWYgKFRlc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKSkgeworICAgICAgICAgICAgYm9vbGVhbiBoYXZlVGVzdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChNZXRob2QgbSA6IGMuZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSkgeworICAgICAgICAgICAgICAgICAgICBoYXZlVGVzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXZlVGVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL29yIGEgY2xhc3Mgd2l0aCBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSBtZXRob2QKKyAgICAgICAgICAgIE1ldGhvZCBtID0gYy5nZXREZWNsYXJlZE1ldGhvZCgic3VpdGUiKTsKKyAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSAmJiBNb2RpZmllci5pc1N0YXRpYyhtLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmdldFJldHVyblR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKFRlc3QuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQ0VGVzdENsYXNzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQ0VGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1MTgzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDRUZXN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcuanVuaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdDRUZXN0Q2xhc3MgZXh0ZW5kcyBKVW5pdFRlc3RDbGFzcyB7CisKKyAgICBwdWJsaWMgSlVuaXQ0VGVzdENsYXNzKERlc2NyaXB0aW9uIHRlc3QpIHsKKyAgICAgICAgc3VwZXIodGVzdC5nZXRUZXN0Q2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0NFRlc3RNZXRob2QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDRUZXN0TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhMGU3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdDRUZXN0TWV0aG9kLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCitwdWJsaWMgY2xhc3MgSlVuaXQ0VGVzdE1ldGhvZCBleHRlbmRzIEpVbml0VGVzdE1ldGhvZCB7CisKKyAgICBwdWJsaWMgSlVuaXQ0VGVzdE1ldGhvZChKVW5pdFRlc3RDbGFzcyBvd25lciwgRGVzY3JpcHRpb24gZGVzYykgeworICAgICAgICBzdXBlcihvd25lciwgZGVzYy5nZXRNZXRob2ROYW1lKCksIGdldE1ldGhvZChkZXNjKSwgZGVzYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdIGdldEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChEZXNjcmlwdGlvbiBkZXNjKSB7CisgICAgICAgIENsYXNzPD8+IGMgPSBkZXNjLmdldFRlc3RDbGFzcygpOworICAgICAgICBTdHJpbmcgbWV0aG9kID0gZGVzYy5nZXRNZXRob2ROYW1lKCk7CisgICAgICAgIC8vIHJlbW92ZSBbaW5kZXhdIGZyb20gbWV0aG9kIG5hbWUgaW4gY2FzZSBvZiBwYXJhbWV0ZXJpemVkIHRlc3QKKyAgICAgICAgaW50IGlkeCA9IG1ldGhvZC5pbmRleE9mKCdbJyk7CisgICAgICAgIGlmIChpZHggIT0gLTEpIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZC5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGMuZ2V0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBVdGlscy5sb2coIkpVbml0NFRlc3RNZXRob2QiLCAyLAorICAgICAgICAgICAgICAgICAgICAiTWV0aG9kICciICsgbWV0aG9kICsgIicgbm90IGZvdW5kIGluIGNsYXNzICciICsgYy5nZXROYW1lKCkgKyAiJzogIiArIHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0NFRlc3RSZWNvZ25pemVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQ0VGVzdFJlY29nbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzU4ODEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0NFRlc3RSZWNvZ25pemVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKVW5pdDRUZXN0UmVjb2duaXplciBpbXBsZW1lbnRzIEpVbml0VGVzdFJlY29nbml6ZXIgeworCisgICAgcHVibGljIEpVbml0NFRlc3RSZWNvZ25pemVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGVzdChDbGFzcyBjKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbjogYy5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoUnVuV2l0aC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFuLmFubm90YXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBoYXZlVGVzdCA9IGZhbHNlOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogYy5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhIDogbS5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3JnLmp1bml0LlRlc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhLmFubm90YXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhdmVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXZlVGVzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXQ0VGVzdFJ1bm5lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0NFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg0MWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0NFRlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0OworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkpVbml0Q29yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5tYW5pcHVsYXRpb24uRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uUnVuTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy4qOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JVGVzdFJlc3VsdE5vdGlmaWVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlRlc3RSZXN1bHQ7CisKKy8qKgorICogQSBKVW5pdCBUZXN0UnVubmVyIHRoYXQgcmVjb3Jkcy90cmlnZ2VycyBhbGwgaW5mb3JtYXRpb24vZXZlbnRzIG5lY2Vzc2FyeSB0bworICogVGVzdE5HLgorICoKKyAqIEBhdXRob3IgTHVrYXMgSnVuZ21hbm4KKyAqLworcHVibGljIGNsYXNzIEpVbml0NFRlc3RSdW5uZXIgaW1wbGVtZW50cyBJSlVuaXRUZXN0UnVubmVyIHsKKworICAgIHByaXZhdGUgSVRlc3RSZXN1bHROb3RpZmllciBtX3BhcmVudFJ1bm5lcjsKKyAgICBwcml2YXRlIExpc3Q8SVRlc3ROR01ldGhvZD4gbV9tZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PElUZXN0TGlzdGVuZXI+IG1fbGlzdGVuZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPElJbnZva2VkTWV0aG9kTGlzdGVuZXI+IG1faW52b2tlTGlzdGVuZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgSlVuaXQ0VGVzdFJ1bm5lcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSlVuaXQ0VGVzdFJ1bm5lcihJVGVzdFJlc3VsdE5vdGlmaWVyIHRyKSB7CisgICAgICAgIG1fcGFyZW50UnVubmVyID0gdHI7CisgICAgICAgIG1fbGlzdGVuZXJzID0gbV9wYXJlbnRSdW5uZXIuZ2V0VGVzdExpc3RlbmVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5lZWRlZCBmcm9tIFRlc3RSdW5uZXIgaW4gb3JkZXIgdG8gZmlndXJlIG91dCB3aGF0IEpVbml0IHRlc3QgbWV0aG9kcworICAgICAqIHdlcmUgcnVuLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgSlVuaXQgdGVzdCBtZXRob2RzIHJ1bgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PElUZXN0TkdNZXRob2Q+IGdldFRlc3RNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbV9tZXRob2RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRlc3RSZXN1bHROb3RpZmllcihJVGVzdFJlc3VsdE5vdGlmaWVyIG5vdGlmaWVyKSB7CisgICAgICAgIG1fcGFyZW50UnVubmVyID0gbm90aWZpZXI7CisgICAgICAgIG1fbGlzdGVuZXJzID0gbV9wYXJlbnRSdW5uZXIuZ2V0VGVzdExpc3RlbmVycygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludm9rZWRNZXRob2RMaXN0ZW5lcnMoQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgbV9pbnZva2VMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQQorICAgICAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlnbm9yZXMgdGhlCisgICAgICogPGNvZGU+VGVzdFJlc3VsdDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgdGhlIEpVbml0IHRlc3QgY2xhc3MKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oQ2xhc3MgdGVzdENsYXNzLCBTdHJpbmcuLi4gbWV0aG9kcykgeworICAgICAgICBzdGFydCh0ZXN0Q2xhc3MsIG1ldGhvZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhIHRlc3QgcnVuLiBBbmFseXplcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgcnVucyB0aGUgZ2l2ZW4KKyAgICAgKiB0ZXN0IHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyBSZXN1bHQgc3RhcnQoZmluYWwgQ2xhc3MgdGVzdENhc2UsIGZpbmFsIFN0cmluZy4uLiBtZXRob2RzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKVW5pdENvcmUgY29yZSA9IG5ldyBKVW5pdENvcmUoKTsKKyAgICAgICAgICAgIGNvcmUuYWRkTGlzdGVuZXIobmV3IFJMKCkpOworICAgICAgICAgICAgUmVxdWVzdCByID0gUmVxdWVzdC5hQ2xhc3ModGVzdENhc2UpOworICAgICAgICAgICAgcmV0dXJuIGNvcmUucnVuKHIuZmlsdGVyV2l0aChuZXcgRmlsdGVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcnVuIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG06IG1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4gcCA9IFBhdHRlcm4uY29tcGlsZShtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLm1hdGNoZXIoZGVzY3JpcHRpb24uZ2V0TWV0aG9kTmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmliZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJUZXN0TkcgbWV0aG9kIGZpbHRlciI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiRmFpbHVyZSBpbiBKVW5pdCBtb2RlIGZvciBjbGFzcyAiICsgdGVzdENhc2UuZ2V0TmFtZSgpLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUkwgZXh0ZW5kcyBSdW5MaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBNYXA8RGVzY3JpcHRpb24sIElUZXN0UmVzdWx0PiBydW5zID0gbmV3IFdlYWtIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PERlc2NyaXB0aW9uPiBub3RpZmllZCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFzc3VtcHRpb25GYWlsdXJlKEZhaWx1cmUgZmFpbHVyZSkgeworICAgICAgICAgICAgbm90aWZpZWQuYWRkKGZhaWx1cmUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICBJVGVzdFJlc3VsdCB0ciA9IHJ1bnMuZ2V0KGZhaWx1cmUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICB0ci5zZXRTdGF0dXMoVGVzdFJlc3VsdC5TS0lQKTsKKyAgICAgICAgICAgIHRyLnNldEVuZE1pbGxpcyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKKyAgICAgICAgICAgIHRyLnNldFRocm93YWJsZShmYWlsdXJlLmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIG1fcGFyZW50UnVubmVyLmFkZFNraXBwZWRUZXN0KHRyLmdldE1ldGhvZCgpLCB0cik7CisgICAgICAgICAgICBmb3IgKElUZXN0TGlzdGVuZXIgbCA6IG1fbGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbC5vblRlc3RTa2lwcGVkKHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZShGYWlsdXJlIGZhaWx1cmUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGlzQXNzdW1wdGlvbkZhaWxlZChmYWlsdXJlKSkgeworICAgICAgICAgICAgICAgIHRoaXMudGVzdEFzc3VtcHRpb25GYWlsdXJlKGZhaWx1cmUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmaWVkLmFkZChmYWlsdXJlLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgSVRlc3RSZXN1bHQgdHIgPSBydW5zLmdldChmYWlsdXJlLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgdHIuc2V0U3RhdHVzKFRlc3RSZXN1bHQuRkFJTFVSRSk7CisgICAgICAgICAgICB0ci5zZXRFbmRNaWxsaXMoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgICAgICAgICB0ci5zZXRUaHJvd2FibGUoZmFpbHVyZS5nZXRFeGNlcHRpb24oKSk7CisgICAgICAgICAgICBtX3BhcmVudFJ1bm5lci5hZGRGYWlsZWRUZXN0KHRyLmdldE1ldGhvZCgpLCB0cik7CisgICAgICAgICAgICBmb3IgKElUZXN0TGlzdGVuZXIgbCA6IG1fbGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbC5vblRlc3RGYWlsdXJlKHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluaXNoZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgSVRlc3RSZXN1bHQgdHIgPSBydW5zLmdldChkZXNjcmlwdGlvbik7CisgICAgICAgICAgICBpZiAoIW5vdGlmaWVkLmNvbnRhaW5zKGRlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgICAgIHRyLnNldFN0YXR1cyhUZXN0UmVzdWx0LlNVQ0NFU1MpOworICAgICAgICAgICAgICAgIHRyLnNldEVuZE1pbGxpcyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICBtX3BhcmVudFJ1bm5lci5hZGRQYXNzZWRUZXN0KHRyLmdldE1ldGhvZCgpLCB0cik7CisgICAgICAgICAgICAgICAgZm9yIChJVGVzdExpc3RlbmVyIGwgOiBtX2xpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBsLm9uVGVzdFN1Y2Nlc3ModHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fbWV0aG9kcy5hZGQodHIuZ2V0TWV0aG9kKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIElUZXN0UmVzdWx0IHRyID0gY3JlYXRlVGVzdFJlc3VsdChkZXNjcmlwdGlvbik7CisgICAgICAgICAgICB0ci5zZXRTdGF0dXMoVGVzdFJlc3VsdC5TS0lQKTsKKyAgICAgICAgICAgIHRyLnNldEVuZE1pbGxpcyh0ci5nZXRTdGFydE1pbGxpcygpKTsKKyAgICAgICAgICAgIG1fcGFyZW50UnVubmVyLmFkZFNraXBwZWRUZXN0KHRyLmdldE1ldGhvZCgpLCB0cik7CisgICAgICAgICAgICBtX21ldGhvZHMuYWRkKHRyLmdldE1ldGhvZCgpKTsKKyAgICAgICAgICAgIGZvciAoSVRlc3RMaXN0ZW5lciBsIDogbV9saXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsLm9uVGVzdFNraXBwZWQodHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GaW5pc2hlZChSZXN1bHQgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3RhcnRlZChEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0ZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgSVRlc3RSZXN1bHQgdHIgPSBjcmVhdGVUZXN0UmVzdWx0KGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJ1bnMucHV0KGRlc2NyaXB0aW9uLCB0cik7CisgICAgICAgICAgICBmb3IgKElUZXN0TGlzdGVuZXIgbCA6IG1fbGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbC5vblRlc3RTdGFydCh0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElUZXN0UmVzdWx0IGNyZWF0ZVRlc3RSZXN1bHQoRGVzY3JpcHRpb24gdGVzdCkgeworICAgICAgICAgICAgSlVuaXQ0VGVzdENsYXNzIHRjID0gbmV3IEpVbml0NFRlc3RDbGFzcyh0ZXN0KTsKKyAgICAgICAgICAgIEpVbml0VGVzdE1ldGhvZCB0bSA9IG5ldyBKVW5pdDRUZXN0TWV0aG9kKHRjLCB0ZXN0KTsKKworICAgICAgICAgICAgVGVzdFJlc3VsdCB0ciA9IG5ldyBUZXN0UmVzdWx0KHRjLAorICAgICAgICAgICAgICAgICAgICB0ZXN0LAorICAgICAgICAgICAgICAgICAgICB0bSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisKKyAgICAgICAgICAgIEludm9rZWRNZXRob2QgaW0gPSBuZXcgSW52b2tlZE1ldGhvZCh0ci5nZXRUZXN0Q2xhc3MoKSwgdHIuZ2V0TWV0aG9kKCksIG5ldyBPYmplY3RbMF0sIHRyLmdldFN0YXJ0TWlsbGlzKCksIHRyKTsKKyAgICAgICAgICAgIG1fcGFyZW50UnVubmVyLmFkZEludm9rZWRNZXRob2QoaW0pOworICAgICAgICAgICAgZm9yIChJSW52b2tlZE1ldGhvZExpc3RlbmVyIGw6IG1faW52b2tlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbC5iZWZvcmVJbnZvY2F0aW9uKGltLCB0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXNzdW1wdGlvbkZhaWxlZChGYWlsdXJlIGZhaWx1cmUpIHsKKyAgICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFRocm93YWJsZVJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IGZhaWx1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CisgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAib3JnLmp1bml0LmludGVybmFsLkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbiIuZXF1YWxzKGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0TWV0aG9kRmluZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRNZXRob2RGaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZGM2YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0TWV0aG9kRmluZGVyLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5qdW5pdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RNZXRob2RGaW5kZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5UZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgbG9jYXRlcyBhbGwgdGVzdCBhbmQgY29uZmlndXJhdGlvbiBtZXRob2RzIGFjY29yZGluZyB0byBKVW5pdC4KKyAqIEl0IGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBzdHJhdGVneSB1c2VkIGJ5IFRlc3RSdW5uZXIgdG8gbG9jYXRlIGl0cyB0ZXN0CisgKiBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMywgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIEpVbml0TWV0aG9kRmluZGVyIGltcGxlbWVudHMgSVRlc3RNZXRob2RGaW5kZXIgeworICBwcml2YXRlIFN0cmluZyBtX3Rlc3ROYW1lID0gbnVsbDsKKyAgcHJpdmF0ZSBJQW5ub3RhdGlvbkZpbmRlciBtX2Fubm90YXRpb25GaW5kZXIgPSBudWxsOworCisgIHB1YmxpYyBKVW5pdE1ldGhvZEZpbmRlcihTdHJpbmcgdGVzdE5hbWUsIElBbm5vdGF0aW9uRmluZGVyIGZpbmRlcikgeworICAgIG1fdGVzdE5hbWUgPSB0ZXN0TmFtZTsKKyAgICBtX2Fubm90YXRpb25GaW5kZXIgPSBmaW5kZXI7CisgIH0KKworICBwcml2YXRlIENvbnN0cnVjdG9yIGZpbmRDb25zdHJ1Y3RvcihDbGFzcyBjbHMsIENsYXNzW10gcGFyYW1ldGVycykgeworICAgIENvbnN0cnVjdG9yIHJlc3VsdCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gY2xzLmdldENvbnN0cnVjdG9yKHBhcmFtZXRlcnMpOworICAgIH0KKyAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gfCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgIC8vIGlnbm9yZQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRUZXN0TWV0aG9kcyhDbGFzcyBjbHMsIFhtbFRlc3QgeG1sVGVzdCkgeworICAgIElUZXN0TkdNZXRob2RbXSByZXN1bHQgPQorICAgICAgcHJpdmF0ZUZpbmRUZXN0TWV0aG9kcyhuZXcgSU5hbWVGaWx0ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSAmJgorICAgICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7CisgICAgICAgIH0KKyAgICB9LCBjbHMpOworCisvLyAgICBwcHAoIj09PT09Iik7CisvLyAgICBwcHAoIkZJTkQgVEVTVCBNRVRIT0QgUkVUVVJOSU5HICIpOworLy8gICAgZm9yIChJVGVzdE1ldGhvZCBtIDogcmVzdWx0KSB7CisvLyAgICAgIHBwcCgiICAiICsgbSk7CisvLyAgICB9CisvLyAgICBwcHAoIj09PT09Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgSVRlc3ROR01ldGhvZFtdIHByaXZhdGVGaW5kVGVzdE1ldGhvZHMoSU5hbWVGaWx0ZXIgZmlsdGVyLCBDbGFzcyBjbHMpIHsKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHZSZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHdhbGsgdXAgdGhlIGNsYXNzIGhpZXJhcmNoeSBhbmQgYWNjZXB0IHRoZQorICAgIC8vIHNhbWUgbWV0aG9kIHR3aWNlIChlLmcuIHNldFVwKSB3aGljaCB3b3VsZCBsZWFkIHRvIGRvdWJsZS1pbnZvY2F0aW9uLgorICAgIC8vIEFsbCByZWxldmFudCBKVW5pdCBtZXRob2RzIGFyZSBwYXJhbWV0ZXItbGVzcyBzbyB3ZSBzdG9yZSBhY2NlcHRlZAorICAgIC8vIG1ldGhvZCBuYW1lcyBpbiBhIFNldCB0byBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMuCisgICAgU2V0PFN0cmluZz4gYWNjZXB0ZWRNZXRob2ROYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgIC8vCisgICAgLy8gQ29sbGVjdCBhbGwgbWV0aG9kcyB0aGF0IHN0YXJ0IHdpdGggdGVzdAorICAgIC8vCisgICAgQ2xhc3MgY3VycmVudCA9IGNsczsKKyAgICB3aGlsZSghKGN1cnJlbnQgPT0gT2JqZWN0LmNsYXNzKSkgeworICAgICAgTWV0aG9kW10gYWxsTWV0aG9kcyA9IGN1cnJlbnQuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICBmb3IoTWV0aG9kIGFsbE1ldGhvZCA6IGFsbE1ldGhvZHMpIHsKKyAgICAgICAgSVRlc3ROR01ldGhvZCBtID0gbmV3IFRlc3ROR01ldGhvZCgvKiBhbGxNZXRob2RzW2ldLmdldERlY2xhcmluZ0NsYXNzKCksICovIGFsbE1ldGhvZCwKKyAgICAgICAgICAgIG1fYW5ub3RhdGlvbkZpbmRlciwgbnVsbCwKKyAgICAgICAgICAgIG51bGwpOyAvKiBAQEAgKi8KKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG0uZ2V0TWV0aG9kKCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgaWYoZmlsdGVyLmFjY2VwdChtZXRob2QpICYmICFhY2NlcHRlZE1ldGhvZE5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgLy8gICAgICAgICAgaWYgKG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSkgeworICAgICAgICAgIC8vICAgICAgICAgICAgcHBwKCJGb3VuZCBKVW5pdCB0ZXN0IG1ldGhvZDogIiArIHRtKTsKKyAgICAgICAgICB2UmVzdWx0LmFkZChtKTsKKyAgICAgICAgICBhY2NlcHRlZE1ldGhvZE5hbWVzLmFkZChtZXRob2ROYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0U3VwZXJjbGFzcygpOworICAgIH0KKworICAgIHJldHVybiB2UmVzdWx0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbdlJlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbSlVuaXRNZXRob2RGaW5kZXJdICIgKyBzKTsKKyAgfQorCisgIHByaXZhdGUgT2JqZWN0IGluc3RhbnRpYXRlKENsYXNzIGNscykgeworICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworCisgICAgQ29uc3RydWN0b3IgY3RvciA9IGZpbmRDb25zdHJ1Y3RvcihjbHMsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOworICAgIHRyeSB7CisgICAgICBpZiAobnVsbCAhPSBjdG9yKSB7CisgICAgICAgIHJlc3VsdCA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgbV90ZXN0TmFtZSB9KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjdG9yID0gY2xzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7CisgICAgICAgIHJlc3VsdCA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFswXSk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkbid0IGZpbmQgYSBjb25zdHJ1Y3RvciB3aXRoIGEgU3RyaW5nIHBhcmFtZXRlciBvbiB5b3VyIEpVbml0IHRlc3QgY2xhc3MuIik7CisgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVUZXN0TWV0aG9kcyhDbGFzcyBjbHMpIHsKKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0ID0gcHJpdmF0ZUZpbmRUZXN0TWV0aG9kcyhuZXcgSU5hbWVGaWx0ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgIHJldHVybiAic2V0VXAiLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfSwgY2xzKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclRlc3RNZXRob2RzKENsYXNzIGNscykgeworICAgIElUZXN0TkdNZXRob2RbXSByZXN1bHQgPSAgcHJpdmF0ZUZpbmRUZXN0TWV0aG9kcyhuZXcgSU5hbWVGaWx0ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgIHJldHVybiAidGVhckRvd24iLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfSwgY2xzKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckNsYXNzTWV0aG9kcyhDbGFzcyBjbHMpIHsKKyAgICByZXR1cm4gbmV3IElUZXN0TkdNZXRob2RbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVDbGFzc01ldGhvZHMoQ2xhc3MgY2xzKSB7CisgICAgcmV0dXJuIG5ldyBJVGVzdE5HTWV0aG9kWzBdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlU3VpdGVNZXRob2RzKENsYXNzIGNscykgeworICAgIHJldHVybiBuZXcgSVRlc3ROR01ldGhvZFswXTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyU3VpdGVNZXRob2RzKENsYXNzIGNscykgeworICAgIHJldHVybiBuZXcgSVRlc3ROR01ldGhvZFswXTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICByZXR1cm4gbmV3IElUZXN0TkdNZXRob2RbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclRlc3RDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICByZXR1cm4gbmV3IElUZXN0TkdNZXRob2RbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVHcm91cHNDb25maWd1cmF0aW9uTWV0aG9kcyhDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICByZXR1cm4gbmV3IElUZXN0TkdNZXRob2RbMF07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb25NZXRob2RzKENsYXNzIHRlc3RDbGFzcykgeworICAgIHJldHVybiBuZXcgSVRlc3ROR01ldGhvZFswXTsKKyAgfQorfQorCisvLy8vLy8vLy8vLy8vCisKK2ludGVyZmFjZSBJTmFtZUZpbHRlciB7CisgIHB1YmxpYyBib29sZWFuIGFjY2VwdChNZXRob2QgbWV0aG9kKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdFRlc3RDbGFzcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNGQxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdFRlc3RDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuanVuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCisvL05PIEpVbml0IHNwZWNpZmljIGNvZGUgaGVyZSB0byBhdm9pZCBydW50aW1lIGVycm9ycworcHVibGljIGFic3RyYWN0IGNsYXNzIEpVbml0VGVzdENsYXNzIGltcGxlbWVudHMgSVRlc3RDbGFzcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDU1OTg2MTU3OTQ4NTA5MjVMOworICAgIHByaXZhdGUgTGlzdDxJVGVzdE5HTWV0aG9kPiBtX3Rlc3RNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PElUZXN0TkdNZXRob2Q+IG1fYmVmb3JlQ2xhc3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIExpc3Q8SVRlc3ROR01ldGhvZD4gbV9hZnRlckNsYXNzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PElUZXN0TkdNZXRob2Q+IG1fYmVmb3JlVGVzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxJVGVzdE5HTWV0aG9kPiBtX2FmdGVyVGVzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHByaXZhdGUgQ2xhc3MgbV9yZWFsQ2xhc3M7CisgICAgcHJpdmF0ZSBPYmplY3RbXSBtX2luc3RhbmNlczsKKyAgICBwcml2YXRlIGxvbmdbXSBtX2luc3RhbmNlSGFzaGVzOworCisgICAgcHVibGljIEpVbml0VGVzdENsYXNzKENsYXNzIHRlc3QpIHsKKyAgICAgICAgbV9yZWFsQ2xhc3MgPSB0ZXN0OworICAgICAgICBtX2luc3RhbmNlcyA9IG5ldyBPYmplY3RbXXt0ZXN0fTsKKyAgICAgICAgbV9pbnN0YW5jZUhhc2hlcyA9IG5ldyBsb25nW117dGVzdC5oYXNoQ29kZSgpfTsKKyAgICB9CisKKyAgICBMaXN0PElUZXN0TkdNZXRob2Q+IGdldFRlc3RNZXRob2RMaXN0KCkgeworICAgICAgcmV0dXJuIG1fdGVzdE1ldGhvZHM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JQ2xhc3MjYWRkSW5zdGFuY2UoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnN0YW5jZShPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkSW5zdGFuY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgSlVuaXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSUNsYXNzI2dldE5hbWUoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1fcmVhbENsYXNzLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSUNsYXNzI2dldFJlYWxDbGFzcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzIGdldFJlYWxDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG1fcmVhbENsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBYbWxUZXN0IGdldFhtbFRlc3QoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBYbWxDbGFzcyBnZXRYbWxDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0SW5zdGFuY2VDb3VudCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDbGFzcyNnZXRJbnN0YW5jZUhhc2hDb2RlcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIG1faW5zdGFuY2VIYXNoZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0SW5zdGFuY2VzKGJvb2xlYW4pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdIGdldEluc3RhbmNlcyhib29sZWFuIHJldXNlKSB7CisgICAgICAgIHJldHVybiBtX2luc3RhbmNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RDbGFzcyNnZXRUZXN0TWV0aG9kcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRUZXN0TWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIG1fdGVzdE1ldGhvZHMudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFttX3Rlc3RNZXRob2RzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEJlZm9yZVRlc3RNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbV9iZWZvcmVUZXN0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbbV9iZWZvcmVUZXN0LnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEFmdGVyVGVzdE1ldGhvZHMoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIG1fYWZ0ZXJUZXN0LnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbbV9hZnRlclRlc3Quc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0QmVmb3JlQ2xhc3NNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZUNsYXNzTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIG1fYmVmb3JlQ2xhc3MudG9BcnJheShuZXcgSVRlc3ROR01ldGhvZFttX2JlZm9yZUNsYXNzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEFmdGVyQ2xhc3NNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyQ2xhc3NNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbV9hZnRlckNsYXNzLnRvQXJyYXkobmV3IElUZXN0TkdNZXRob2RbbV9hZnRlckNsYXNzLnNpemUoKV0pOworICAgIH0KKworICAgIC8vZmVhdHVyZXMgbm90IHN1cHBvcnRlZCBieSBKVW5pdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElUZXN0TkdNZXRob2RbXSBFTVBUWV9NRVRIT0RBUlJBWSA9IG5ldyBJVGVzdE5HTWV0aG9kWzBdOworCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0QmVmb3JlU3VpdGVNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVN1aXRlTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX01FVEhPREFSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEFmdGVyU3VpdGVNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyU3VpdGVNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gRU1QVFlfTUVUSE9EQVJSQVk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0QmVmb3JlR3JvdXBzTWV0aG9kcygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVHcm91cHNNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gRU1QVFlfTUVUSE9EQVJSQVk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0QWZ0ZXJHcm91cHNNZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyR3JvdXBzTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX01FVEhPREFSUkFZOworICAgIH0KKworICAgIC8vYWxyZWFkeSBkZXByZWNhdGVkIHN0dWZmLCBub3QgdXNhYmxlIGluIGp1bml0CisgICAgLyoqCisgICAgICogQHNlZSBvcmcudGVzdG5nLklUZXN0Q2xhc3MjZ2V0QmVmb3JlVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RDb25maWd1cmF0aW9uTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX01FVEhPREFSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdENsYXNzI2dldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyVGVzdENvbmZpZ3VyYXRpb25NZXRob2RzKCkgeworICAgICAgICByZXR1cm4gRU1QVFlfTUVUSE9EQVJSQVk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdEZpbmRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdEZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTU1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRUZXN0RmluZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKKworLyoqCisgKgorICogQGF1dGhvciBsanVuZ21hbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSlVuaXRUZXN0RmluZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKVU5JVDNfVEVTVCA9ICJqdW5pdC5mcmFtZXdvcmsuVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUM19GSU5ERVIgPSAib3JnLnRlc3RuZy5qdW5pdC5KVW5pdDNUZXN0UmVjb2duaXplciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUNF9URVNUID0gIm9yZy5qdW5pdC5UZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVQ0X0ZJTkRFUiA9ICJvcmcudGVzdG5nLmp1bml0LkpVbml0NFRlc3RSZWNvZ25pemVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKVW5pdFRlc3RSZWNvZ25pemVyIGp1bml0MzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKVW5pdFRlc3RSZWNvZ25pemVyIGp1bml0NDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGp1bml0MyA9IGdldEpVbml0VGVzdFJlY29nbml6ZXIoSlVOSVQzX1RFU1QsIEpVTklUM19GSU5ERVIpOworICAgICAgICBqdW5pdDQgPSBnZXRKVW5pdFRlc3RSZWNvZ25pemVyKEpVTklUNF9URVNULCBKVU5JVDRfRklOREVSKTsKKyAgICAgICAgaWYgKGp1bml0MyA9PSBudWxsKSB7CisgICAgICAgICAgICBVdGlscy5sb2coIkpVbml0VGVzdEZpbmRlciIsIDIsICJKVW5pdDMgd2FzIG5vdCBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoanVuaXQ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIFV0aWxzLmxvZygiSlVuaXRUZXN0RmluZGVyIiwgMiwgIkpVbml0NCB3YXMgbm90IGZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pVbml0VGVzdChDbGFzcyBjKSB7CisgICAgICAgIGlmICghaGF2ZUpVbml0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvL29ubHkgcHVibGljIGNsYXNzZXMgYXJlIGludGVyZXN0aW5nLCBzbyBmaWx0ZXIgb3V0IHRoZSByZXN0CisgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoYy5nZXRNb2RpZmllcnMoKSkgfHwgYy5pc0ludGVyZmFjZSgpIHx8IGMuaXNBbm5vdGF0aW9uKCkgfHwgYy5pc0VudW0oKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoanVuaXQzICE9IG51bGwgJiYganVuaXQzLmlzVGVzdChjKSkgfHwgKGp1bml0NCAhPSBudWxsICYmIGp1bml0NC5pc1Rlc3QoYykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGF2ZUpVbml0KCkgeworICAgICAgICByZXR1cm4ganVuaXQzICE9IG51bGwgfHwganVuaXQ0ICE9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSlVuaXRUZXN0UmVjb2duaXplciBnZXRKVW5pdFRlc3RSZWNvZ25pemVyKFN0cmluZyB0ZXN0LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSh0ZXN0KTsKKyAgICAgICAgICAgIENsYXNzPEpVbml0VGVzdFJlY29nbml6ZXI+IGMgPSAoQ2xhc3M8SlVuaXRUZXN0UmVjb2duaXplcj4pIENsYXNzLmZvck5hbWUobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gYy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdE1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWU0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRUZXN0TWV0aG9kLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkJhc2VUZXN0TWV0aG9kOworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KKy8vTk8gSlVuaXQgc3BlY2lmaWMgY29kZSBoZXJlIHRvIGF2b2lkIHJ1bnRpbWUgZXJyb3JzCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSlVuaXRUZXN0TWV0aG9kIGV4dGVuZHMgQmFzZVRlc3RNZXRob2QgeworCisgICAgcHJvdGVjdGVkIEpVbml0VGVzdE1ldGhvZChKVW5pdFRlc3RDbGFzcyBvd25lciwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgIHRoaXMob3duZXIsIG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZCwgaW5zdGFuY2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBKVW5pdFRlc3RNZXRob2QoSlVuaXRUZXN0Q2xhc3Mgb3duZXIsIFN0cmluZyBtZXRob2ROYW1lLCBNZXRob2QgbWV0aG9kLCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgc3VwZXIobWV0aG9kTmFtZSwgbWV0aG9kLCBudWxsLCBpbnN0YW5jZSk7CisgICAgICAgIHNldFRlc3RDbGFzcyhvd25lcik7CisgICAgICAgIG93bmVyLmdldFRlc3RNZXRob2RMaXN0KCkuYWRkKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVGVzdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElUZXN0TkdNZXRob2QgY2xvbmUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNsb25lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIEpVbml0Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRUZXN0UmVjb2duaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdFJlY29nbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIzNThjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL2p1bml0L0pVbml0VGVzdFJlY29nbml6ZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuanVuaXQ7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworaW50ZXJmYWNlIEpVbml0VGVzdFJlY29nbml6ZXIgeworCisgICAgYm9vbGVhbiBpc1Rlc3QoQ2xhc3MgYyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjkyZDUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9qdW5pdC9KVW5pdFRlc3RSdW5uZXIuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmp1bml0Ow0KKw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklUZXN0UmVzdWx0Tm90aWZpZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuSW52b2tlZE1ldGhvZDsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RMaXN0ZW5lcjsNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7DQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuKjsNCisNCisvKioNCisgKiBBIEpVbml0IFRlc3RSdW5uZXIgdGhhdCByZWNvcmRzL3RyaWdnZXJzIGFsbCBpbmZvcm1hdGlvbi9ldmVudHMgbmVjZXNzYXJ5IHRvIFRlc3RORy4NCisgKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1bYXRdZXZvbHZhW2RvdF1ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIEpVbml0VGVzdFJ1bm5lciBpbXBsZW1lbnRzIFRlc3RMaXN0ZW5lciwgSUpVbml0VGVzdFJ1bm5lciB7DQorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURV9NRVRIT0ROQU1FID0gInN1aXRlIjsNCisNCisgIHByaXZhdGUgSVRlc3RSZXN1bHROb3RpZmllciBtX3BhcmVudFJ1bm5lcjsNCisNCisgIHByaXZhdGUgTWFwPFRlc3QsIFRlc3RSdW5JbmZvPiBtX3Rlc3RzPSBuZXcgV2Vha0hhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBMaXN0PElUZXN0TkdNZXRob2Q+IG1fbWV0aG9kcz0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICBwcml2YXRlIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorDQorICBwdWJsaWMgSlVuaXRUZXN0UnVubmVyKCkgew0KKyAgfQ0KKw0KKyAgcHVibGljIEpVbml0VGVzdFJ1bm5lcihJVGVzdFJlc3VsdE5vdGlmaWVyIHRyKSB7DQorICAgIG1fcGFyZW50UnVubmVyPSB0cjsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTmVlZGVkIGZyb20gVGVzdFJ1bm5lciBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoYXQgSlVuaXQgdGVzdCBtZXRob2RzIHdlcmUgcnVuLg0KKyAgICoNCisgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIEpVbml0IHRlc3QgbWV0aG9kcyBydW4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgTGlzdDxJVGVzdE5HTWV0aG9kPiBnZXRUZXN0TWV0aG9kcygpIHsNCisgICAgcmV0dXJuIG1fbWV0aG9kczsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgc2V0VGVzdFJlc3VsdE5vdGlmaWVyKElUZXN0UmVzdWx0Tm90aWZpZXIgbm90aWZpZXIpIHsNCisgICAgbV9wYXJlbnRSdW5uZXI9IG5vdGlmaWVyOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXIjc3RhcnRUZXN0KGp1bml0LmZyYW1ld29yay5UZXN0KQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsNCisgICAgbV90ZXN0cy5wdXQodGVzdCwgbmV3IFRlc3RSdW5JbmZvKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpKTsNCisgIH0NCisNCisNCisgIC8qKg0KKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyI2FkZEVycm9yKGp1bml0LmZyYW1ld29yay5UZXN0LCBqYXZhLmxhbmcuVGhyb3dhYmxlKQ0KKyAgICovDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsNCisgICAgcmVjb3JkRmFpbHVyZSh0ZXN0LCB0KTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyI2FkZEZhaWx1cmUoanVuaXQuZnJhbWV3b3JrLlRlc3QsIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcikNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgew0KKyAgICByZWNvcmRGYWlsdXJlKHRlc3QsIHQpOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIHJlY29yZEZhaWx1cmUoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgew0KKyAgICBUZXN0UnVuSW5mbyB0cmk9IG1fdGVzdHMuZ2V0KHRlc3QpOw0KKyAgICBpZihudWxsICE9IHRyaSkgew0KKyAgICAgIHRyaS5zZXRUaHJvd2FibGUodCk7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyI2VuZFRlc3QoanVuaXQuZnJhbWV3b3JrLlRlc3QpDQorICAgKi8NCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsNCisgICAgVGVzdFJ1bkluZm8gdHJpPSBtX3Rlc3RzLmdldCh0ZXN0KTsNCisgICAgaWYobnVsbCA9PSB0cmkpIHsNCisgICAgICByZXR1cm47IC8vIEhJTlQ6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gSG93IGRvIEkgcHJvdGVjdCBteXNlbGY/DQorICAgIH0NCisNCisgICAgb3JnLnRlc3RuZy5pbnRlcm5hbC5UZXN0UmVzdWx0IHRyPSByZWNvcmRSZXN1bHRzKHRlc3QsIHRyaSk7DQorDQorICAgIHJ1blRlc3RMaXN0ZW5lcnModHIsIG1fcGFyZW50UnVubmVyLmdldFRlc3RMaXN0ZW5lcnMoKSk7DQorICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldEludm9rZWRNZXRob2RMaXN0ZW5lcnMoQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lcnMpIHsNCisgICAgICAgIG1faW52b2tlZE1ldGhvZExpc3RlbmVycyA9IGxpc3RlbmVyczsNCisgICAgfQ0KKw0KKw0KKyAgcHJpdmF0ZSBvcmcudGVzdG5nLmludGVybmFsLlRlc3RSZXN1bHQgcmVjb3JkUmVzdWx0cyhUZXN0IHRlc3QsIFRlc3RSdW5JbmZvIHRyaSkgIHsNCisgICAgSlVuaXRUZXN0Q2xhc3MgdGM9IG5ldyBKVW5pdDNUZXN0Q2xhc3ModGVzdCk7DQorICAgIEpVbml0VGVzdE1ldGhvZCB0bT0gbmV3IEpVbml0M1Rlc3RNZXRob2QodGMsIHRlc3QpOw0KKw0KKyAgICBvcmcudGVzdG5nLmludGVybmFsLlRlc3RSZXN1bHQgdHI9IG5ldyBvcmcudGVzdG5nLmludGVybmFsLlRlc3RSZXN1bHQodGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmkubV9mYWlsdXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpLm1fc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7DQorDQorICAgIGlmKHRyaS5pc0ZhaWx1cmUoKSkgew0KKyAgICAgIHRyLnNldFN0YXR1cyhJVGVzdFJlc3VsdC5GQUlMVVJFKTsNCisgICAgICBtX3BhcmVudFJ1bm5lci5hZGRGYWlsZWRUZXN0KHRtLCB0cik7DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgbV9wYXJlbnRSdW5uZXIuYWRkUGFzc2VkVGVzdCh0bSwgdHIpOw0KKyAgICB9DQorDQorICAgIEludm9rZWRNZXRob2QgaW0gPSBuZXcgSW52b2tlZE1ldGhvZCh0ZXN0LCB0bSwgbmV3IE9iamVjdFswXSwgdHJpLm1fc3RhcnQsIHRyKTsNCisgICAgbV9wYXJlbnRSdW5uZXIuYWRkSW52b2tlZE1ldGhvZChpbSk7DQorICAgIG1fbWV0aG9kcy5hZGQodG0pOw0KKyAgICBmb3IgKElJbnZva2VkTWV0aG9kTGlzdGVuZXIgbDogbV9pbnZva2VkTWV0aG9kTGlzdGVuZXJzKSB7DQorICAgICAgICBsLmJlZm9yZUludm9jYXRpb24oaW0sIHRyKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gdHI7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blRlc3RMaXN0ZW5lcnMoSVRlc3RSZXN1bHQgdHIsIExpc3Q8SVRlc3RMaXN0ZW5lcj4gbGlzdGVuZXJzKSB7DQorICAgIGZvciAoSVRlc3RMaXN0ZW5lciBpdGwgOiBsaXN0ZW5lcnMpIHsNCisgICAgICBzd2l0Y2godHIuZ2V0U3RhdHVzKCkpIHsNCisgICAgICAgIGNhc2UgSVRlc3RSZXN1bHQuU0tJUDogew0KKyAgICAgICAgICBpdGwub25UZXN0U2tpcHBlZCh0cik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TVUNDRVNTX1BFUkNFTlRBR0VfRkFJTFVSRTogew0KKyAgICAgICAgICBpdGwub25UZXN0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UodHIpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgSVRlc3RSZXN1bHQuRkFJTFVSRTogew0KKyAgICAgICAgICBpdGwub25UZXN0RmFpbHVyZSh0cik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TVUNDRVNTOiB7DQorICAgICAgICAgIGl0bC5vblRlc3RTdWNjZXNzKHRyKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorDQorICAgICAgICBjYXNlIElUZXN0UmVzdWx0LlNUQVJURUQ6IHsNCisgICAgICAgICAgaXRsLm9uVGVzdFN0YXJ0KHRyKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorDQorICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJVTktOT1dOIFNUQVRVUzoiICsgdHI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIFJldHVybnMgdGhlIFRlc3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc3VpdGUuIFRoaXMgaXMNCisgICAqIGEgdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHJ1bkZhaWxlZCgpLCBjbGVhclN0YXR1cygpLg0KKyAgICovDQorICBwcm90ZWN0ZWQgVGVzdCBnZXRUZXN0KENsYXNzIHRlc3RDbGFzcywgU3RyaW5nLi4uIG1ldGhvZHMpIHsNCisgICAgaWYgKG1ldGhvZHMubGVuZ3RoID4gMCkgew0KKyAgICAgIFRlc3RTdWl0ZSB0cyA9IG5ldyBUZXN0U3VpdGUoKTsNCisgICAgICB0cnkgew0KKyAgICAgICAgQ29uc3RydWN0b3IgYyA9IHRlc3RDbGFzcy5nZXRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpOw0KKyAgICAgICAgZm9yIChTdHJpbmcgbTogbWV0aG9kcykgew0KKyAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHRzLmFkZFRlc3QoKFRlc3QpIGMubmV3SW5zdGFuY2UobSkpOw0KKyAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICAgICAgcnVuRmFpbGVkKHRlc3RDbGFzcywgImFic3RyYWN0IGNsYXNzICIgKyBleCk7DQorICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsNCisgICAgICAgICAgICBydW5GYWlsZWQodGVzdENsYXNzLCAiY29uc3RydWN0b3IgaXMgbm90IHB1YmxpYyAiICsgZXgpOw0KKyAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsNCisgICAgICAgICAgICBydW5GYWlsZWQodGVzdENsYXNzLCAiYWN0dWFsIGFuZCBmb3JtYWwgcGFyYW1ldGVycyBkaWZmZXIgIiArIGV4KTsNCisgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgew0KKyAgICAgICAgICAgIHJ1bkZhaWxlZCh0ZXN0Q2xhc3MsICJleGNlcHRpb24gd2hpbGUgaW5zdGF0aWF0aW5nIHRlc3QgZm9yIG1ldGhvZCAnIiArIG0gKyAiJyAiICsgZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICBydW5GYWlsZWQodGVzdENsYXNzLCAibm8gY29uc3RydWN0b3IgYWNjZXB0aW5nIFN0cmluZyBhcmd1bWVudCBmb3VuZCAiICsgZXgpOw0KKyAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7DQorICAgICAgICBydW5GYWlsZWQodGVzdENsYXNzLCAic2VjdXJpdHkgZXhjZXB0aW9uICIgKyBleCk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiB0czsNCisgICAgfQ0KKyAgICBNZXRob2Qgc3VpdGVNZXRob2QgPSBudWxsOw0KKyAgICB0cnkgew0KKyAgICAgIHN1aXRlTWV0aG9kID0gdGVzdENsYXNzLmdldE1ldGhvZChTVUlURV9NRVRIT0ROQU1FLCBuZXcgQ2xhc3NbMF0pOw0KKyAgICB9DQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KKw0KKyAgICAgIC8vIHRyeSB0byBleHRyYWN0IGEgdGVzdCBzdWl0ZSBhdXRvbWF0aWNhbGx5DQorICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUodGVzdENsYXNzKTsNCisgICAgfQ0KKyAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKHN1aXRlTWV0aG9kLmdldE1vZGlmaWVycygpKSkgew0KKyAgICAgIHJ1bkZhaWxlZCh0ZXN0Q2xhc3MsICJzdWl0ZSgpIG1ldGhvZCBtdXN0IGJlIHN0YXRpYyIpOw0KKw0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorICAgIFRlc3QgdGVzdCA9IG51bGw7DQorICAgIHRyeSB7DQorICAgICAgdGVzdCA9IChUZXN0KSBzdWl0ZU1ldGhvZC5pbnZva2UobnVsbCwgKE9iamVjdFtdKSBuZXcgQ2xhc3NbMF0pOyAvLyBzdGF0aWMgbWV0aG9kDQorICAgICAgaWYgKHRlc3QgPT0gbnVsbCkgew0KKyAgICAgICAgcmV0dXJuIHRlc3Q7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCisgICAgICBydW5GYWlsZWQodGVzdENsYXNzLCAiZmFpbGVkIHRvIGludm9rZSBtZXRob2Qgc3VpdGUoKToiICsgZS5nZXRUYXJnZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsNCisNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKyAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7DQorICAgICAgcnVuRmFpbGVkKHRlc3RDbGFzcywgImZhaWxlZCB0byBpbnZva2UgbWV0aG9kIHN1aXRlKCk6IiArIGUudG9TdHJpbmcoKSk7DQorDQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHRlc3Q7DQorICB9DQorDQorICAvKioNCisgICAqIEEgPGNvZGU+c3RhcnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgaWdub3JlcyB0aGUgPGNvZGU+VGVzdFJlc3VsdDwvY29kZT4NCisgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgdGhlIEpVbml0IHRlc3QgY2xhc3MNCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBydW4oQ2xhc3MgdGVzdENsYXNzLCBTdHJpbmcuLi4gbWV0aG9kcykgew0KKyAgICBzdGFydCh0ZXN0Q2xhc3MsIG1ldGhvZHMpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBTdGFydHMgYSB0ZXN0IHJ1bi4gQW5hbHl6ZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHJ1bnMgdGhlIGdpdmVuDQorICAgKiB0ZXN0IHN1aXRlLg0KKyAgICovDQorICBwdWJsaWMgVGVzdFJlc3VsdCBzdGFydChDbGFzcyB0ZXN0Q2FzZSwgU3RyaW5nLi4uIG1ldGhvZHMpIHsNCisgICAgdHJ5IHsNCisgICAgICBUZXN0IHN1aXRlID0gZ2V0VGVzdCh0ZXN0Q2FzZSwgbWV0aG9kcyk7DQorDQorICAgICAgaWYobnVsbCAhPSBzdWl0ZSkgew0KKyAgICAgICAgcmV0dXJuIGRvUnVuKHN1aXRlKTsNCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICBydW5GYWlsZWQodGVzdENhc2UsICJjb3VsZCBub3QgY3JlYXRlL3J1biBKVW5pdCB0ZXN0IHN1aXRlIik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgIHJ1bkZhaWxlZCh0ZXN0Q2FzZSwgImNvdWxkIG5vdCBjcmVhdGUvcnVuIEpVbml0IHRlc3Qgc3VpdGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICBwcm90ZWN0ZWQgdm9pZCBydW5GYWlsZWQoQ2xhc3MgY2xhenosIFN0cmluZyBtZXNzYWdlKSB7DQorICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkZhaWx1cmUgaW4gSlVuaXQgbW9kZSBmb3IgY2xhc3MgIiArIGNsYXp6LmdldE5hbWUoKSArICI6ICIgKyBtZXNzYWdlKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQ3JlYXRlcyB0aGUgVGVzdFJlc3VsdCB0byBiZSB1c2VkIGZvciB0aGUgdGVzdCBydW4uDQorICAgKi8NCisgIHByb3RlY3RlZCBUZXN0UmVzdWx0IGNyZWF0ZVRlc3RSZXN1bHQoKSB7DQorICAgIHJldHVybiBuZXcgVGVzdFJlc3VsdCgpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIFRlc3RSZXN1bHQgZG9SdW4oVGVzdCBzdWl0ZSkgew0KKyAgICBUZXN0UmVzdWx0IHJlc3VsdCA9IGNyZWF0ZVRlc3RSZXN1bHQoKTsNCisgICAgcmVzdWx0LmFkZExpc3RlbmVyKHRoaXMpOw0KKyAgICBzdWl0ZS5ydW4ocmVzdWx0KTsNCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSdW5JbmZvIHsNCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1fc3RhcnQ7DQorICAgIHByaXZhdGUgVGhyb3dhYmxlIG1fZmFpbHVyZTsNCisNCisgICAgcHVibGljIFRlc3RSdW5JbmZvKGxvbmcgc3RhcnQpIHsNCisgICAgICBtX3N0YXJ0PSBzdGFydDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWx1cmUoKSB7DQorICAgICAgcmV0dXJuIG51bGwgIT0gbV9mYWlsdXJlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFRocm93YWJsZShUaHJvd2FibGUgdCkgew0KKyAgICAgIG1fZmFpbHVyZT0gdDsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbG9nL1RleHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9sb2cvVGV4dEZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2MDc4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbG9nL1RleHRGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcubG9nOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcjsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBUZXh0Rm9ybWF0dGVyIGJlY2F1c2UgdGhlIGJyYWluZGVkCisgKiBkZWZhdWx0IGZvcm1hdHRlciBvZiBqYXZhLnV0aWwubG9nZ2luZyBvdXRwdXRzIGV2ZXJ5dGhpbmcgb24gdHdvCisgKiBsaW5lcyBhbmQgaXQncyB1Z2x5IGFzIGJ1dHQuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1heSAyLCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgVGV4dEZvcm1hdHRlciBleHRlbmRzIFNpbXBsZUZvcm1hdHRlciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBmb3JtYXQoTG9nUmVjb3JkIHJlY29yZCkgeworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICByZXN1bHQuYXBwZW5kKHJlY29yZC5nZXRNZXNzYWdlKCkpLmFwcGVuZCgiXG4iKTsKKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbG9nNHRlc3RuZy9Mb2dnZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9sb2c0dGVzdG5nL0xvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzNDA1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbG9nNHRlc3RuZy9Mb2dnZXIuamF2YQpAQCAtMCwwICsxLDcyMyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmxvZzR0ZXN0bmc7DQorDQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7DQoraW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOw0KKw0KKy8qKg0KKyAqIFRlc3RORyBzdXBwb3J0IGxvZ2dpbmcgdmlhIGEgY3VzdG9tIGxvZ2dpbmcgZnJhbWV3b3JrIHNpbWlsYXIgdG8NCisgKiA8YSBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqIj4gTG9nNGo8L2E+LiBUbyBjb250cm9sIGxvZ2dpbmcsIGFkZCBhDQorICogcmVzb3VyY2UgbmFtZWQgImxvZzR0ZXN0bmcucHJvcGVydGllcyIgdG8geW91ciBjbGFzc3BhdGguIFRoZSBsb2dnaW5nIGxldmVscyBhcmUNCisgKiBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SIGFuZCBGQVRBTC4NCisgKiBUaGUgTG9nZ2luZyBmcmFtZXdvcmsgaGFzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOg0KKyAqDQorICogPHVsPg0KKyAqIDxsaT5BbGwgbG9nZ2luZyBpcyBkb25lIHVzaW5nIFN5c3RlbS5vdXQgKGZvciBsZXZlbHMgJmx0OyBFUlJPUikgb3IgU3lzdGVtLmVyci4gVGhlcmUNCisgKiBpcyBubyB3YXkgdG8gc3BlY2lmeSBBcHBlbmRlcnMuPC9saT4NCisgKiA8bGk+VGhlcmUgaXMgbm8gd2F5IHRvIGNvbnRyb2wgbG9nZ2luZyBwcm9ncmFtbWF0aWNhbGx5LjwvbGk+DQorICogPGxpPlRoZSBsb2c0dGVzdG5nLnByb3BlcnRpZXMgcmVzb3VyY2UgaXMgc2VhcmNoZWQgaW4gdGhlIGNsYXNzcGF0aCBvbiB0aGUgZmlyc3QNCisgKiBjYWxsIHRvIHRoZSBsb2dnaW5nIEFQSS4gSWYgaXQgaXMgbm90IHByZXNlbnQsIGxvZ2dpbmcgZGVmYXVsdHMgdG8gdGhlIFdBUk4NCisgKiBsZXZlbC48L2xpPg0KKyAqIDwvdWw+DQorICoNCisgKiBUaGUgcHJvcGVydHkgZmlsZSBjb250YWlucyBsaW5lcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoNCisgKg0KKyAqIDxwcmU+PGNvZGU+DQorICogIyBsb2c0dGVzdG5nIHdpbGwgbG9nIGl0cyBvd24gYmVoYXZpb3IgKGdlbmVyYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcgdGhpcyBwYWNrYWdlIG9ubHkpLg0KKyAqIGxvZzR0ZXN0bmcuZGVidWc9dHJ1ZQ0KKyAqDQorICogIyBTcGVjaWZpZXMgdGhlIHJvb3QgTG9nZ2VycyBsb2dnaW5nIGxldmVsLiBXaWxsIGxvZyBERUJVRyBsZXZlbCBhbmQgYWJvdmUNCisgKiBsb2c0dGVzdG5nLnJvb3RMb2dnZXI9REVCVUcNCisgKg0KKyAqICMgVGhlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLkVtYWlsYWJsZVJlcG9ydGVyIExvZ2dlciB3aWxsIGxvZyBUUkFDRSBsZXZlbCBhbmQgYWJvdmUNCisgKiBsb2c0dGVzdG5nLmxvZ2dlci5vcmcudGVzdG5nLnJlcG9ydGVycy5FbWFpbGFibGVSZXBvcnRlcj1UUkFDRQ0KKyAqDQorICogIyBBbGwgTG9nZ2VyIGluIHBhY2thZ2VzIGJlbG93IG9yZy50ZXN0bmcgd2lsbCBsb2cgV0FSTiBsZXZlbCBhbmQgYWJvdmUNCisgKiBsb2c0dGVzdG5nLmxvZ2dlci5vcmcudGVzdG5nPVdBUk4NCisgKiA8L2NvZGU+PC9wcmU+DQorICoNCisgKiBJbiB5b3VyIHNvdXJjZSBmaWxlcyB5b3Ugd2lsbCB0eXBpY2FsbHkgaW5zdGFudGlhdGUgYW5kIHVzZSBsb2dnZXJzIHRoaXMgd2F5czoNCisgKiA8cHJlPjxjb2RlPg0KKyAqIGltcG9ydCBvcmcudGVzdG5nLmxvZzR0ZXN0bmcuTG9nZ2VyOw0KKyAqDQorICogY2xhc3MgVGhpc0NsYXNzIHsNCisgKiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVGhpc0NsYXNzLmNsYXNzKTsNCisgKg0KKyAqICAgICAuLi4NCisgKiAgICAgTE9HR0VSLmRlYnVnKCJlbnRlcmluZyBteU1ldGhvZCgpIik7DQorICogICAgIC4uLg0KKyAqICAgICBMT0dHRVIud2FybigidW5rbm93biBmaWxlOiAiICsgZmlsZW5hbWUpOw0KKyAqICAgICAuLi4NCisgKiAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIGVycm9yIiwgZXhjZXB0aW9uKTsNCisgKiA8L2NvZGU+PC9wcmU+DQorICovDQorcHVibGljIGNsYXNzIExvZ2dlciB7DQorDQorICAvLyBBdHRyaWJ1dGUgYW4gaGllcmFyY2hpY2FsIGludGVnZXIgdmFsdWUgdG8gYWxsIGxldmVscy4NCisgIHByaXZhdGUgc3RhdGljIGludCBpPSAwOw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQUNFPSBpKys7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVCVUc9IGkrKzsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkZPPSBpKys7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTj0gaSsrOw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SPSBpKys7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFUQUw9IGkrKzsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRVZFTF9DT1VOVD0gaTsNCisNCisgIC8qKiBTdGFuZGFyZCBwcmVmaXggb2YgYWxsIHByb3BlcnR5IG5hbWVzIGluIGxvZzR0ZXN0bmcucHJvcGVydGllcy4gKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVg9ICJsb2c0dGVzdG5nLiI7DQorDQorICAvKiogU3RhbmRhcmQgcHJlZml4IG9mIGFsbCBsb2dnZXIgbmFtZXMgaW4gbG9nNHRlc3RuZy5wcm9wZXJ0aWVzLiAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9QUkVGSVg9IFBSRUZJWCArICJsb2dnZXIuIjsNCisNCisgIC8qKiBSb290IGxvZ2dlciBuYW1lIGluIGxvZzR0ZXN0bmcucHJvcGVydGllcy4gKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0xPR0dFUj0gUFJFRklYICsgInJvb3RMb2dnZXIiOw0KKw0KKyAgLyoqIERlYnVnIHByb3BlcnR5IG5hbWUgaW4gbG9nNHRlc3RuZy5wcm9wZXJ0aWVzLiAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BST1BFUlRZPSBQUkVGSVggKyAiZGVidWciOw0KKw0KKyAgLyoqIFRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gKHRoaXMgaXMgYWxsd2F5cyBTeXN0ZW0uZXJyIGV4Y2VwdCBmb3IgdW5pdCB0ZXN0cykgKi8NCisgIHByaXZhdGUgc3RhdGljIFByaW50U3RyZWFtIGVycj0gU3lzdGVtLmVycjsNCisNCisgIC8qKiBUaGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSAodGhpcyBpcyBhbGx3YXlzIFN5c3RlbS5vdXQgZXhjZXB0IGZvciB1bml0IHRlc3RzKSAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0PSBTeXN0ZW0ub3V0Ow0KKw0KKyAgLyoqIEFuIG9yZGVyZWQgbGlzdCBvZiBsZXZlbCBuYW1lcy4gKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXM9IG5ldyBTdHJpbmdbTEVWRUxfQ09VTlRdOw0KKw0KKyAgc3RhdGljIHsNCisgICAgbGV2ZWxOYW1lc1tUUkFDRV09ICJUUkFDRSI7DQorICAgIGxldmVsTmFtZXNbREVCVUddPSAiREVCVUciOw0KKyAgICBsZXZlbE5hbWVzW0lORk9dID0gIklORk8iOw0KKyAgICBsZXZlbE5hbWVzW1dBUk5dID0gIldBUk4iOw0KKyAgICBsZXZlbE5hbWVzW0VSUk9SXSA9ICJFUlJPUiI7DQorICAgIGxldmVsTmFtZXNbRkFUQUxdID0gIkZBVEFMIjsNCisgIH0NCisNCisgIC8qKiBBIG1hcCBmcm9tIGxldmVsIG5hbWUgdG8gbGV2ZWwgaW50ZWdlciBpbmRleCAoVFJBQ0UtPjAsIERFQlVHLT4xIC4uLikgKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IGxldmVsTWFwPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisNCisgIHN0YXRpYyB7DQorICAgIGZvcihpPSAwOyBpIDwgTEVWRUxfQ09VTlQ7ICsraSkgew0KKyAgICAgIGxldmVsTWFwLnB1dChsZXZlbE5hbWVzW2ldLCBpKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyoqIHRydWUgaWYgdGhlIExvZ2dpbmcgc3lzdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkLiAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsNCisNCisgIC8qKiBNYXAgZnJvbSBMb2dnZXIgbmFtZXMgdG8gbGV2ZWwgaW5kZXggKGFzIHNwZWNpZmllZCBpbiBsb2c0dGVzdG5nLnByb3BlcnRpZXMpICovDQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBsb2dnZXJMZXZlbHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisNCisgIC8qKiBNYXAgb2YgYWxsIGtub3duIGxvZ2dlcnMuICovDQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3MsIExvZ2dlcj4gbG9nZ2VycyA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKw0KKyAgLyoqIFRoZSBsb2dnaW5nIGxldmVsIG9mIHRoZSByb290IGxvZ2dlciAoZGVmYXVsdHMgdG8gd2FybikuICovDQorICBwcml2YXRlIHN0YXRpYyBpbnQgcm9vdExvZ2dlckxldmVsPSBXQVJOOw0KKw0KKyAgLyoqIFNob3VsZCBsb2c0dGVzdG5nIGxvZyB3aGF0IGl0IGlzIGRvaW5nIChkZWZhdWx0cyB0byBmYWxzZSkuICovDQorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnPSBmYWxzZTsNCisNCisgIC8qKiBUaGUgbG9nZ2VyJ3MgbGV2ZWwgKi8NCisgIHByaXZhdGUgZmluYWwgaW50IGxldmVsOw0KKw0KKyAgLyoqIFRoZSBsb2dnZXIncyBuYW1lLiAqLw0KKyAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBrbGFzczsNCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1fY2xhc3NOYW1lOw0KKw0KKyAgLyoqDQorICAgKiBSZXRyaWV2ZSBhIGxvZ2dlciBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBwQ2xhc3MuZ2V0TmFtZSgpDQorICAgKiBwYXJhbWV0ZXIuIElmIHRoZSBuYW1lZCBsb2dnZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gdGhlIGV4aXN0aW5nIGluc3RhbmNlDQorICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQuIEJ5IGRlZmF1bHQsIGxvZ2dlcnMNCisgICAqIGRvIG5vdCBoYXZlIGEgc2V0IGxldmVsIGJ1dCBpbmhlcml0IGl0IGZyb20gdGhlaXIgbmVhcmVzdCBhbmNlc3RvciB3aXRoDQorICAgKiBhIHNldCBsZXZlbC4NCisgICAqDQorICAgKiBAcGFyYW0gcENsYXNzIFRoZSBjbGFzcycgbG9nZ2VyIHRvIHJldHJpZXZlLg0KKyAgICogQHJldHVybiBhIGxvZ2dlciBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBwQ2xhc3MuZ2V0TmFtZSgpLg0KKyAgICovDQorICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMb2dnZXIgZ2V0TG9nZ2VyKENsYXNzIHBDbGFzcykgew0KKyAgICBpbml0aWFsaXplKCk7DQorICAgIExvZ2dlciBsb2dnZXI9IGxvZ2dlcnMuZ2V0KHBDbGFzcyk7DQorICAgIGlmKGxvZ2dlciAhPSBudWxsKSB7DQorICAgICAgcmV0dXJuIGxvZ2dlcjsNCisgICAgfQ0KKyAgICBpbnQgbGV2ZWw9IGdldExldmVsKHBDbGFzcyk7DQorICAgIGxvZ2dlcj0gbmV3IExvZ2dlcihwQ2xhc3MsIGxldmVsKTsNCisgICAgbG9nZ2Vycy5wdXQocENsYXNzLCBsb2dnZXIpOw0KKw0KKyAgICByZXR1cm4gbG9nZ2VyOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgbG9nZ2VyIGlzIGVuYWJsZWQgZm9yIHRoZSBUUkFDRSBMZXZlbC4NCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGxvZ2dlciBpcyBlbmFibGVkIGZvciBsZXZlbCBUUkFDRSwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICovDQorICBwdWJsaWMgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpIHsNCisgICAgcmV0dXJuIGlzTGV2ZWxFbmFibGVkKFRSQUNFKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTG9nIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgVFJBQ0UgbGV2ZWwuIFRoaXMgbWV0aG9kIGZpcnN0IGNoZWNrcyBpZiB0aGlzDQorICAgKiBsb2dnZXIgaXMgVFJBQ0UgZW5hYmxlZC4gSWYgdGhpcyBsb2dnZXIgaXMgVFJBQ0UgZW5hYmxlZCwgdGhlbiBpdCBjb252ZXJ0cw0KKyAgICogdGhlIG1lc3NhZ2Ugb2JqZWN0IChwYXNzZWQgYXMgcGFyYW1ldGVyKSB0byBhIHN0cmluZyBieSBpbnZva2luZyB0b1N0cmluZygpLg0KKyAgICogV0FSTklORyBOb3RlIHRoYXQgcGFzc2luZyBhIFRocm93YWJsZSB0byB0aGlzIG1ldGhvZCB3aWxsIHByaW50IHRoZSBuYW1lIG9mDQorICAgKiB0aGUgVGhyb3dhYmxlIGJ1dCBubyBzdGFjayB0cmFjZS4gVG8gcHJpbnQgYSBzdGFjayB0cmFjZSB1c2UgdGhlDQorICAgKiB0cmFjZShPYmplY3QsIFRocm93YWJsZSkgZm9ybSBpbnN0ZWFkLg0KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGxvZy4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG1lc3NhZ2UpIHsNCisgICAgbG9nKFRSQUNFLCBtZXNzYWdlLCBudWxsKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTG9nIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgVFJBQ0UgbGV2ZWwgaW5jbHVkaW5nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUNCisgICAqIFRocm93YWJsZSB0IHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQorICAgKiBTZWUgTG9nZ2VyLnRyYWNlKE9iamVjdCkgZm9ybSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4NCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIG9iamVjdCB0byBsb2cuDQorICAgKiBAcGFyYW0gdCB0aGUgZXhjZXB0aW9uIHRvIGxvZywgaW5jbHVkaW5nIGl0cyBzdGFjayB0cmFjZS4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7DQorICAgIGxvZyhUUkFDRSwgbWVzc2FnZSwgdCk7DQorICB9DQorDQorICAvKioNCisgICAqIENoZWNrIHdoZXRoZXIgdGhpcyBsb2dnZXIgaXMgZW5hYmxlZCBmb3IgdGhlIERFQlVHIExldmVsLg0KKyAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbG9nZ2VyIGlzIGVuYWJsZWQgZm9yIGxldmVsIERFQlVHLCBmYWxzZSBvdGhlcndpc2UuDQorICAgKi8NCisgIHB1YmxpYyBib29sZWFuIGlzRGVidWdFbmFibGVkKCkgew0KKyAgICByZXR1cm4gaXNMZXZlbEVuYWJsZWQoREVCVUcpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBMb2cgYSBtZXNzYWdlIG9iamVjdCB3aXRoIHRoZSBERUJVRyBsZXZlbC4NCisgICAqIFNlZSBMb2dnZXIudHJhY2UoT2JqZWN0KSBmb3JtIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGxvZy4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgZGVidWcoT2JqZWN0IG1lc3NhZ2UpIHsNCisgICAgbG9nKERFQlVHLCBtZXNzYWdlLCBudWxsKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTG9nIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgREVCVUcgbGV2ZWwgaW5jbHVkaW5nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUNCisgICAqIFRocm93YWJsZSB0IHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQorICAgKiBTZWUgTG9nZ2VyLnRyYWNlKE9iamVjdCwgVGhyb3dhYmxlKSBmb3JtIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGxvZy4NCisgICAqIEBwYXJhbSB0IHRoZSBleGNlcHRpb24gdG8gbG9nLCBpbmNsdWRpbmcgaXRzIHN0YWNrIHRyYWNlLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCBkZWJ1ZyhPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsNCisgICAgbG9nKERFQlVHLCBtZXNzYWdlLCB0KTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQ2hlY2sgd2hldGhlciB0aGlzIGxvZ2dlciBpcyBlbmFibGVkIGZvciB0aGUgSU5GTyBMZXZlbC4NCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGxvZ2dlciBpcyBlbmFibGVkIGZvciBsZXZlbCBJTkZPLCBmYWxzZSBvdGhlcndpc2UuDQorICAgKi8NCisgIHB1YmxpYyBib29sZWFuIGlzSW5mb0VuYWJsZWQoKSB7DQorICAgIHJldHVybiBpc0xldmVsRW5hYmxlZChJTkZPKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTG9nIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgSU5GTyBsZXZlbC4NCisgICAqIFNlZSBMb2dnZXIudHJhY2UoT2JqZWN0KSBmb3JtIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGxvZy4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSkgew0KKyAgICBsb2coSU5GTywgbWVzc2FnZSwgbnVsbCk7DQorICB9DQorDQorICAvKioNCisgICAqIExvZyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIFdBUk4gbGV2ZWwgaW5jbHVkaW5nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUNCisgICAqIFRocm93YWJsZSB0IHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQorICAgKiBTZWUgTG9nZ2VyLnRyYWNlKE9iamVjdCwgVGhyb3dhYmxlKSBmb3JtIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLg0KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGxvZy4NCisgICAqIEBwYXJhbSB0IHRoZSBleGNlcHRpb24gdG8gbG9nLCBpbmNsdWRpbmcgaXRzIHN0YWNrIHRyYWNlLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCBpbmZvKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkgew0KKyAgICBsb2coSU5GTywgbWVzc2FnZSwgdCk7DQorICB9DQorDQorICAvKioNCisgICAqIExvZyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIFdBUk4gbGV2ZWwuDQorICAgKiBTZWUgTG9nZ2VyLnRyYWNlKE9iamVjdCkgZm9ybSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4NCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIG9iamVjdCB0byBsb2cuDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UpIHsNCisgICAgbG9nKFdBUk4sIG1lc3NhZ2UsIG51bGwpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBMb2cgYSBtZXNzYWdlIG9iamVjdCB3aXRoIHRoZSBFUlJPUiBsZXZlbCBpbmNsdWRpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZQ0KKyAgICogVGhyb3dhYmxlIHQgcGFzc2VkIGFzIHBhcmFtZXRlci4NCisgICAqIFNlZSBMb2dnZXIudHJhY2UoT2JqZWN0LCBUaHJvd2FibGUpIGZvcm0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uDQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBvYmplY3QgdG8gbG9nLg0KKyAgICogQHBhcmFtIHQgdGhlIGV4Y2VwdGlvbiB0byBsb2csIGluY2x1ZGluZyBpdHMgc3RhY2sgdHJhY2UuDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7DQorICAgIGxvZyhXQVJOLCBtZXNzYWdlLCB0KTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTG9nIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgRVJST1IgbGV2ZWwuDQorICAgKiBTZWUgTG9nZ2VyLnRyYWNlKE9iamVjdCkgZm9ybSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4NCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIG9iamVjdCB0byBsb2cuDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlKSB7DQorICAgIGxvZyhFUlJPUiwgbWVzc2FnZSwgbnVsbCk7DQorICB9DQorDQorICAvKioNCisgICAqIExvZyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIERFQlVHIGxldmVsIGluY2x1ZGluZyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlDQorICAgKiBUaHJvd2FibGUgdCBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KKyAgICogU2VlIExvZ2dlci50cmFjZShPYmplY3QsIFRocm93YWJsZSkgZm9ybSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4NCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIG9iamVjdCB0byBsb2cuDQorICAgKiBAcGFyYW0gdCB0aGUgZXhjZXB0aW9uIHRvIGxvZywgaW5jbHVkaW5nIGl0cyBzdGFjayB0cmFjZS4NCisgICAqLw0KKyAgcHVibGljIHZvaWQgZXJyb3IoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7DQorICAgIGxvZyhFUlJPUiwgbWVzc2FnZSwgdCk7DQorICB9DQorDQorICAvKioNCisgICAqIExvZyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIEZBVEFMIGxldmVsLg0KKyAgICogU2VlIExvZ2dlci50cmFjZShPYmplY3QpIGZvcm0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uDQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBvYmplY3QgdG8gbG9nLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbWVzc2FnZSkgew0KKyAgICBsb2coRkFUQUwsIG1lc3NhZ2UsIG51bGwpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBMb2cgYSBtZXNzYWdlIG9iamVjdCB3aXRoIHRoZSBGQVRBTCBsZXZlbCBpbmNsdWRpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZQ0KKyAgICogVGhyb3dhYmxlIHQgcGFzc2VkIGFzIHBhcmFtZXRlci4NCisgICAqIFNlZSBMb2dnZXIudHJhY2UoT2JqZWN0LCBUaHJvd2FibGUpIGZvcm0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uDQorICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBvYmplY3QgdG8gbG9nLg0KKyAgICogQHBhcmFtIHQgdGhlIGV4Y2VwdGlvbiB0byBsb2csIGluY2x1ZGluZyBpdHMgc3RhY2sgdHJhY2UuDQorICAgKi8NCisgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkgew0KKyAgICBsb2coRkFUQUwsIG1lc3NhZ2UsIHQpOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBMb2dnZXIoQ2xhc3MgcENsYXNzLCBpbnQgcExldmVsKSB7DQorICAgIGxldmVsPSBwTGV2ZWw7DQorICAgIGtsYXNzPSBwQ2xhc3M7DQorICAgIG1fY2xhc3NOYW1lPSBwQ2xhc3MuZ2V0TmFtZSgpLnN1YnN0cmluZyhwQ2xhc3MuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCcuJykgKyAxKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemUoKSB7DQorICAgIGlmKGluaXRpYWxpemVkKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIC8vIFdlIGZsYWcgYXMgaW5pdGlhbGl6ZWQgcmlnaHQgYXdheSBiZWNhdXNlIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcNCisgICAgLy8gV2Ugc3RpbGwgY29uc2lkZXIgaXQgaW5pdGlhbGl6ZWQuIFRPRE8gSXMgdGhpcyBPSz8NCisgICAgaW5pdGlhbGl6ZWQ9IHRydWU7DQorDQorICAgIElucHV0U3RyZWFtIGlzPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oImxvZzR0ZXN0bmcucHJvcGVydGllcyIpOw0KKyAgICBpZihpcyA9PSBudWxsKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFByb3BlcnRpZXMgcHJvcGVydGllcz0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgdHJ5IHsNCisgICAgICBwcm9wZXJ0aWVzLmxvYWQoaXMpOw0KKyAgICB9DQorICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpIHsNCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCisgICAgfQ0KKw0KKyAgICBjaGVja1Byb3BlcnRpZXMocHJvcGVydGllcyk7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUHJvcGVydGllcyhQcm9wZXJ0aWVzIHBQcm9wZXJ0aWVzKSB7DQorICAgIHsNCisgICAgICAvLyBTZWUgaWYgd2Ugd2FudCB0byBkZWJ1ZyBsb2c0dGVzdG5nDQorICAgICAgU3RyaW5nIGRlYnVnU3RyPSBwUHJvcGVydGllcy5nZXRQcm9wZXJ0eShERUJVR19QUk9QRVJUWSk7DQorICAgICAgaWYoZGVidWdTdHIgIT0gbnVsbCkgew0KKyAgICAgICAgaWYoZGVidWdTdHIuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7DQorICAgICAgICAgIGRlYnVnPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZihkZWJ1Z1N0ci5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7DQorICAgICAgICAgIGRlYnVnPSBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duICIgKyBERUJVR19QUk9QRVJUWQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWx1ZSAiICsgZGVidWdTdHIpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBsb2dsb2c0dGVzdG5nKCJsb2c0dGVzdG5nLmRlYnVnIHNldCB0byAiICsgZGVidWcpOw0KKyAgICB9DQorDQorICAgIHsNCisgICAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSByb290IGxvZ2dlciAoaWYgYW55KS4NCisgICAgICBTdHJpbmcgcm9vdExldmVsU3RyPSBwUHJvcGVydGllcy5nZXRQcm9wZXJ0eShST09UX0xPR0dFUik7DQorICAgICAgaWYocm9vdExldmVsU3RyICE9IG51bGwpIHsNCisgICAgICAgIEludGVnZXIgaWxldmVsPSBsZXZlbE1hcC5nZXQocm9vdExldmVsU3RyLnRvVXBwZXJDYXNlKCkpOw0KKyAgICAgICAgaWYoaWxldmVsID09IG51bGwpIHsNCisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBsZXZlbCBmb3IgbG9nNHRlc3RuZy5yb290TG9nZ2VyICINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvb3RMZXZlbFN0ciArICIgaW4gbG9nNHRlc3RuZy5wcm9wZXJ0aWVzIik7DQorICAgICAgICB9DQorICAgICAgICByb290TG9nZ2VyTGV2ZWw9IGlsZXZlbDsNCisgICAgICAgIGxvZ2xvZzR0ZXN0bmcoIlJvb3QgbGV2ZWwgbG9nZ2VyIHNldCB0byAiICsgcm9vdExldmVsU3RyICsgIiBsZXZlbC4iKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgSXRlcmF0b3IgaXQ9IHBQcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCisgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7DQorICAgICAgTWFwLkVudHJ5IGVudHJ5PSAoRW50cnkpIGl0Lm5leHQoKTsNCisgICAgICBTdHJpbmcgbG9nZ2VyPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsNCisgICAgICBTdHJpbmcgbGV2ZWw9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7DQorDQorICAgICAgaWYoIWxvZ2dlci5zdGFydHNXaXRoKFBSRUZJWCkpIHsNCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHkgdmFsdWU6ICIgKyBsb2dnZXIpOw0KKyAgICAgIH0NCisgICAgICBpZihsb2dnZXIuZXF1YWxzKERFQlVHX1BST1BFUlRZKSkgew0KKyAgICAgICAgLy8gQWxyZWFkeSBoYW5kbGVkDQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYobG9nZ2VyLmVxdWFscyhST09UX0xPR0dFUikpIHsNCisgICAgICAgIC8vIEFscmVhZHkgaGFuZGxlZA0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgIGlmKCFsb2dnZXIuc3RhcnRzV2l0aChMT0dHRVJfUFJFRklYKSkgew0KKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5IHZhbHVlOiAiICsgbG9nZ2VyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEludGVnZXIgaWxldmVsPSBsZXZlbE1hcC5nZXQobGV2ZWwudG9VcHBlckNhc2UoKSk7DQorICAgICAgICBpZihpbGV2ZWwgPT0gbnVsbCkgew0KKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGxldmVsICIgKyBsZXZlbCArICIgZm9yIGxvZ2dlciAiICsgbG9nZ2VyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIGxvZzR0ZXN0bmcucHJvcGVydGllcyIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbG9nZ2VyTGV2ZWxzLnB1dChsb2dnZXIuc3Vic3RyaW5nKExPR0dFUl9QUkVGSVgubGVuZ3RoKCkpLCBpbGV2ZWwpOw0KKyAgICAgICAgbG9nbG9nNHRlc3RuZygibG9nZ2VyICIgKyBsb2dnZXIgKyAiIHNldCB0byAiICsgaWxldmVsICsgIiBsZXZlbC4iKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyB0aGUgbGV2ZWwgYXNzb2NpYXRlZCB0byB0aGUgY3VycmVudCBjbGFzcy4gVGhlIGxldmVsIGlzIG9idGFpbiBieSBzZWFyY2hpbmcNCisgICAqIGZvciBhIGxvZ2dlciBpbiB0aGUgInRlc3RuZy1sb2dnaW5nLnByb3BlcnRpZXMiIHJlc291cmNlLiBGb3IgZXhhbXBsZSwgaWYgY2xhc3MgaXMNCisgICAqICJvcmcudGVzdG5nLlRlc3RORyIgdGhlIHRoZSBmb2xsb3dpbmcgbG9nZ2VycyBhcmUgc2VhcmNoZWQgaW4gdGhpcyBvcmRlcjoNCisgICAqIDxvbD4NCisgICAqIDxsaT4ib3JnLnRlc3RuZy5UZXN0TkciPC9saT4NCisgICAqIDxsaT4ib3JnLnRlc3RuZyI8L2xpPg0KKyAgICogPGxpPiJvcmciPC9saT4NCisgICAqIDxsaT5UaGUgcm9vdCBsZXZlbDwvbGk+DQorICAgKiA8L29sPg0KKyAgICoNCisgICAqIEBwYXJhbSBwQ2xhc3MgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgbG9nZ2VyIG5hbWUuDQorICAgKiBAcmV0dXJuIHRoZSBsZXZlbCBhc3NvY2lhdGVkIHRvIHRoZSBjdXJyZW50IGNsYXNzLg0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGV2ZWwoQ2xhc3MgcENsYXNzKSB7DQorICAgIFN0cmluZyBuYW1lPSBwQ2xhc3MuZ2V0TmFtZSgpOw0KKyAgICBsb2dsb2c0dGVzdG5nKCJHZXR0aW5nIGxldmVsIGZvciBsb2dnZXIgIiArIG5hbWUpOw0KKyAgICB3aGlsZSh0cnVlKSB7DQorICAgICAgSW50ZWdlciBsZXZlbD0gbG9nZ2VyTGV2ZWxzLmdldChuYW1lKTsNCisgICAgICBpZihsZXZlbCAhPSBudWxsKSB7DQorICAgICAgICBsb2dsb2c0dGVzdG5nKCJGb3VuZCBsZXZlbCAiICsgbGV2ZWwgKyAiIGZvciBsb2dnZXIgIiArIG5hbWUpOw0KKw0KKyAgICAgICAgcmV0dXJuIGxldmVsOw0KKyAgICAgIH0NCisgICAgICBpbnQgZG90PSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQorICAgICAgaWYoZG90ID09IC0xKSB7DQorICAgICAgICBsb2dsb2c0dGVzdG5nKCJGb3VuZCBsZXZlbCAiICsgcm9vdExvZ2dlckxldmVsICsgIiBmb3Igcm9vdCBsb2dnZXIiKTsNCisNCisgICAgICAgIC8vIExvZ2dlciBuYW1lIG5vdCBmb3VuZC4gRGVmYXVsdHMgdG8gcm9vdCBsb2dnZXIgbGV2ZWwuDQorICAgICAgICByZXR1cm4gcm9vdExvZ2dlckxldmVsOw0KKyAgICAgIH0NCisgICAgICBuYW1lPSBuYW1lLnN1YnN0cmluZygwLCBkb3QpOw0KKyAgICB9DQorICB9DQorDQorICBwcml2YXRlIGJvb2xlYW4gaXNMZXZlbEVuYWJsZWQoaW50IHBMZXZlbCkgew0KKyAgICByZXR1cm4gbGV2ZWwgPD0gcExldmVsOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIGxvZyhpbnQgcExldmVsLCBPYmplY3QgcE1lc3NhZ2UsIFRocm93YWJsZSBwVCkgew0KKyAgICBpZihpc0xldmVsRW5hYmxlZChwTGV2ZWwpKSB7DQorICAgICAgUHJpbnRTdHJlYW0gcHM9IChwTGV2ZWwgPj0gRVJST1IpID8gZXJyIDogb3V0Ow0KKyAgICAgIGlmKG51bGwgIT0gcFQpIHsNCisgICAgICAgIHN5bmNocm9uaXplZChwcykgew0KKyAgICAgICAgICBwcy5wcmludGxuKCJbIiArIG1fY2xhc3NOYW1lICsgIl0gWyIgKyBsZXZlbE5hbWVzW3BMZXZlbF0gKyAiXSAiICsgcE1lc3NhZ2UpOw0KKyAgICAgICAgICBwVC5wcmludFN0YWNrVHJhY2UocHMpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgIHBzLnByaW50bG4oIlsiICsgbV9jbGFzc05hbWUgKyAiXSBbIiArIGxldmVsTmFtZXNbcExldmVsXSArICJdICIgKyBwTWVzc2FnZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIExvZ3MgdGhlIG1lc3NhZ2UgdG8gU3lzdGVtLm91dCBvZiBkZWJ1ZyBpcyBvbi4NCisgICAqIEBwYXJhbSBwbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2cgdG8gdGhlIGNvbnNvbGUNCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dsb2c0dGVzdG5nKFN0cmluZyBwbWVzc2FnZSkgew0KKyAgICBpZihkZWJ1Zykgew0KKyAgICAgIG91dC5wcmludGxuKCJbbG9nNHRlc3RuZ10gW2RlYnVnXSAiICsgcG1lc3NhZ2UpOw0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIFRoaXMgbWV0aG9kIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvbmx5Lg0KKyAgICoNCisgICAqIEBwYXJhbSBwUHJvcGVydGllcyBhIHByb3BlcnRpZXMgYnVuZGxlIGluaXRpYWxpc2VkIGFzIGxvZzR0ZXN0bmcNCisgICAqIHByb3BlcnR5IGZpbGUgd291bGQgYmUuDQorICAgKiBAcGFyYW0gcE91dCB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSB0byBiZSB1c2VkIGZvciBsb2dnaW5nLg0KKyAgICogQHBhcmFtIHBFcnIgdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSB0byBiZSB1c2VkIGZvciBsb2dnaW5nLg0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB0ZXN0SW5pdGlhbGl6ZShQcm9wZXJ0aWVzIHBQcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gcE91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIHBFcnIpIHsNCisgICAgaW5pdGlhbGl6ZWQ9IHRydWU7DQorICAgIGxvZ2dlcnMuY2xlYXIoKTsNCisgICAgcm9vdExvZ2dlckxldmVsPSBXQVJOOw0KKyAgICBkZWJ1Zz0gZmFsc2U7DQorICAgIG91dD0gcE91dDsNCisgICAgZXJyPSBwRXJyOw0KKyAgICBjaGVja1Byb3BlcnRpZXMocFByb3BlcnRpZXMpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBNYWtlcyBzdXJlIHRoZSBkZWZhdWx0IGRlYnVnIHZhbHVlIGlzIGZhbHNlLg0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3REZWJ1Z0RlZmF1bHQoKSB7DQorICAgIFByb3BlcnRpZXMgcHJvcHM9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIFByaW50U3RyZWFtIG91dDI9IG5ldyBQcmludFN0cmVhbShvdXQxKTsNCisgICAgUHJpbnRTdHJlYW0gZXJyMj0gbmV3IFByaW50U3RyZWFtKGVycjEpOw0KKyAgICBwcm9wcy5wdXQoImxvZzR0ZXN0bmcucm9vdExvZ2dlciIsICJXQVJOIik7DQorICAgIHRlc3RJbml0aWFsaXplKHByb3BzLCBvdXQyLCBlcnIyKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvdXQxLnRvU3RyaW5nKCksICIiKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhlcnIxLnRvU3RyaW5nKCksICIiKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogTWFrZXMgc3VyZSB0aGUgZGVidWcgdmFsdWUgY2FuIGJlIHR1cm5lZCBvbiBhbmQgYWN0dWFsbHMgbG9ncyBzb21ldGhpbmcuDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdERlYnVnT24oKSB7DQorICAgIFByb3BlcnRpZXMgcHJvcHM9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIFByaW50U3RyZWFtIG91dDI9IG5ldyBQcmludFN0cmVhbShvdXQxKTsNCisgICAgUHJpbnRTdHJlYW0gZXJyMj0gbmV3IFByaW50U3RyZWFtKGVycjEpOw0KKyAgICBwcm9wcy5wdXQoImxvZzR0ZXN0bmcuZGVidWciLCAidHJ1ZSIpOw0KKyAgICBwcm9wcy5wdXQoImxvZzR0ZXN0bmcucm9vdExvZ2dlciIsICJXQVJOIik7DQorICAgIHRlc3RJbml0aWFsaXplKHByb3BzLCBvdXQyLCBlcnIyKTsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUob3V0MS50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltsb2c0dGVzdG5nXVtkZWJ1Z10iKSk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICB9DQorDQorICAvKioNCisgICAqIE1ha2VzIHN1cmUgdGhlIGRlYnVnIHZhbHVlIGNhbiBiZSB0dXJuZWQgb2ZmIGFuZCBsb2dzIG5vdGhpbmcuDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdERlYnVnT2ZmKCkgew0KKyAgICBQcm9wZXJ0aWVzIHByb3BzPSBuZXcgUHJvcGVydGllcygpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0MT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyMT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBQcmludFN0cmVhbSBvdXQyPSBuZXcgUHJpbnRTdHJlYW0ob3V0MSk7DQorICAgIFByaW50U3RyZWFtIGVycjI9IG5ldyBQcmludFN0cmVhbShlcnIxKTsNCisgICAgcHJvcHMucHV0KCJsb2c0dGVzdG5nLmRlYnVnIiwgImZhbHNlIik7DQorICAgIHByb3BzLnB1dCgibG9nNHRlc3RuZy5yb290TG9nZ2VyIiwgIldBUk4iKTsNCisgICAgdGVzdEluaXRpYWxpemUocHJvcHMsIG91dDIsIGVycjIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBNYWtlcyBzdXJlIGFuIGlsbGVnYWwgZGVidWcgdmFsdWUgdGhyb3dzIGFuIGV4Y2VwdGlvbi4NCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0RGVidWdFcnJvcigpIHsNCisgICAgUHJvcGVydGllcyBwcm9wcz0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVycjE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgUHJpbnRTdHJlYW0gb3V0Mj0gbmV3IFByaW50U3RyZWFtKG91dDEpOw0KKyAgICBQcmludFN0cmVhbSBlcnIyPSBuZXcgUHJpbnRTdHJlYW0oZXJyMSk7DQorICAgIHByb3BzLnB1dCgibG9nNHRlc3RuZy5kZWJ1ZyIsICJ1bmtub3duIik7DQorICAgIHByb3BzLnB1dCgibG9nNHRlc3RuZy5yb290TG9nZ2VyIiwgIldBUk4iKTsNCisgICAgdHJ5IHsNCisgICAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZhaWx1cmUiKTsNCisgICAgfQ0KKyAgICBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcEV4KSB7DQorDQorICAgICAgLy8gTm9ybWFsIGNhc2UNCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogVGVzdHMgdGhhdCB0aGUgcm9vdCBsb2dnZXIncyBkZWZhdWx0IGxldmVsIGlzIFdBUk4gYW5kIHRoYXQgbG9nZ2VycyBkbyBub3QNCisgICAqIGxvZyBiZWxsb3cgdGhpcyBsZXZlbCBhbmQgZG8gbG9nIGluIHRoZSBjb3JyZWN0IHN0cmVhbSBmb3IgbGV2ZWxzIGVxdWFsIHRvDQorICAgKiBhbmQgYWJvdmUgV0FSTi4NCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Um9vdExvZ2dlckRlZmF1bHQoKSB7DQorICAgIFByb3BlcnRpZXMgcHJvcHM9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIFByaW50U3RyZWFtIG91dDI9IG5ldyBQcmludFN0cmVhbShvdXQxKTsNCisgICAgUHJpbnRTdHJlYW0gZXJyMj0gbmV3IFByaW50U3RyZWFtKGVycjEpOw0KKyAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorDQorICAgIExvZ2dlciBzdHJMb2dnZXI9IExvZ2dlci5nZXRMb2dnZXIoU3RyaW5nLmNsYXNzKTsNCisgICAgc3RyTG9nZ2VyLnRyYWNlKCJ0cmFjZSBzaG91bGQgbm90IGFwcGVhciIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBzdHJMb2dnZXIuZGVidWcoImRlYnVnIHNob3VsZCBub3QgYXBwZWFyIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0MS50b1N0cmluZygpLCAiIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIHN0ckxvZ2dlci5pbmZvKCJpbmZvIHNob3VsZCBub3QgYXBwZWFyIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0MS50b1N0cmluZygpLCAiIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIHN0ckxvZ2dlci53YXJuKCJ3YXJuIHNob3VsZCBhcHBlYXIiKTsNCisgICAgaW50IG91dGxlbmd0aD0gb3V0MS50b1N0cmluZygpLmxlbmd0aCgpOw0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvdXQxLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW2phdmEubGFuZy5TdHJpbmddIFtXQVJOXSB3YXJuIHNob3VsZCBhcHBlYXIiKSk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIHN0ckxvZ2dlci5lcnJvcigiZXJyb3Igc2hvdWxkIGFwcGVhciIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKS5sZW5ndGgoKSwgb3V0bGVuZ3RoKTsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUoZXJyMS50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltqYXZhLmxhbmcuU3RyaW5nXSBbRVJST1JdIGVycm9yIHNob3VsZCBhcHBlYXIiKSk7DQorICAgIHN0ckxvZ2dlci5mYXRhbCgiZmF0YWwgc2hvdWxkIGFwcGVhciIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKS5sZW5ndGgoKSwgb3V0bGVuZ3RoKTsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUoZXJyMS50b1N0cmluZygpLmNvbnRhaW5zKCJbamF2YS5sYW5nLlN0cmluZ10gW0ZBVEFMXSBmYXRhbCBzaG91bGQgYXBwZWFyIikpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBUZXN0IHNldHRpbmcgdGhlIHJvb3QgbG9nZ2VyIGxldmVsDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvb3RMb2dnZXJTZXQoKSB7DQorICAgIFByb3BlcnRpZXMgcHJvcHM9IG5ldyBQcm9wZXJ0aWVzKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIxPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgIFByaW50U3RyZWFtIG91dDI9IG5ldyBQcmludFN0cmVhbShvdXQxKTsNCisgICAgUHJpbnRTdHJlYW0gZXJyMj0gbmV3IFByaW50U3RyZWFtKGVycjEpOw0KKyAgICBwcm9wcy5wdXQoImxvZzR0ZXN0bmcucm9vdExvZ2dlciIsICJERUJVRyIpOw0KKyAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorDQorICAgIExvZ2dlciBzdHJMb2dnZXI9IExvZ2dlci5nZXRMb2dnZXIoU3RyaW5nLmNsYXNzKTsNCisgICAgc3RyTG9nZ2VyLnRyYWNlKCJ0cmFjZSBzaG91bGQgYXBwZWFyIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0MS50b1N0cmluZygpLCAiIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIHN0ckxvZ2dlci5kZWJ1ZygiZGVidWcgc2hvdWxkIGFwcGVhciIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvdXQxLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW2phdmEubGFuZy5TdHJpbmddIFtERUJVR10gZGVidWcgc2hvdWxkIGFwcGVhciIpKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhlcnIxLnRvU3RyaW5nKCksICIiKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogVGVzdCBzZXR0aW5nIHRoZSByb290IGxvZ2dlciB0byBhbiBpbGxlZ2FsIGxldmVsIHZhbHVlIHRocm93cyBhbiBleGNlcHRpb24uDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvb3RMb2dnZXJTZXRFcnJvcigpIHsNCisgICAgUHJvcGVydGllcyBwcm9wcz0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVycjE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgUHJpbnRTdHJlYW0gb3V0Mj0gbmV3IFByaW50U3RyZWFtKG91dDEpOw0KKyAgICBQcmludFN0cmVhbSBlcnIyPSBuZXcgUHJpbnRTdHJlYW0oZXJyMSk7DQorICAgIHByb3BzLnB1dCgibG9nNHRlc3RuZy5yb290TG9nZ2VyIiwgInVua25vd24iKTsNCisgICAgdHJ5IHsNCisgICAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZhaWx1cmUiKTsNCisgICAgfQ0KKyAgICBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcEV4KSB7DQorDQorICAgICAgLy8gTm9ybWFsIGNhc2UNCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogVGVzdCBzZXR0aW5nIGEgdXNlciBsb2dnZXIgbGV2ZWwNCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0VXNlckxvZ2dlclNldCgpIHsNCisgICAgUHJvcGVydGllcyBwcm9wcz0gbmV3IFByb3BlcnRpZXMoKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVycjE9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgUHJpbnRTdHJlYW0gb3V0Mj0gbmV3IFByaW50U3RyZWFtKG91dDEpOw0KKyAgICBQcmludFN0cmVhbSBlcnIyPSBuZXcgUHJpbnRTdHJlYW0oZXJyMSk7DQorICAgIHByb3BzLnB1dCgibG9nNHRlc3RuZy5sb2dnZXIuamF2YS5sYW5nLlN0cmluZyIsICJERUJVRyIpOw0KKyAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorDQorICAgIExvZ2dlciBzdHJMb2dnZXI9IExvZ2dlci5nZXRMb2dnZXIoU3RyaW5nLmNsYXNzKTsNCisgICAgc3RyTG9nZ2VyLnRyYWNlKCJ0cmFjZSBzaG91bGQgbm90IGFwcGVhciIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBzdHJMb2dnZXIuZGVidWcoImRlYnVnIHNob3VsZCBhcHBlYXIiKTsNCisgICAgaW50IG91dExlbmd0aD0gb3V0MS50b1N0cmluZygpLmxlbmd0aCgpOw0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvdXQxLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW2phdmEubGFuZy5TdHJpbmddIFtERUJVR10gZGVidWcgc2hvdWxkIGFwcGVhciIpKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhlcnIxLnRvU3RyaW5nKCksICIiKTsNCisNCisgICAgTG9nZ2VyIGNsYXNzTG9nZ2VyPSBMb2dnZXIuZ2V0TG9nZ2VyKENsYXNzLmNsYXNzKTsNCisgICAgY2xhc3NMb2dnZXIuZGVidWcoImRlYnVnIHNob3VsZCBub3QgYXBwZWFyIik7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob3V0MS50b1N0cmluZygpLmxlbmd0aCgpLCBvdXRMZW5ndGgpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICBjbGFzc0xvZ2dlci53YXJuKCJ3YXJuIHNob3VsZCBhcHBlYXIiKTsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUob3V0MS50b1N0cmluZygpLmNvbnRhaW5zKCJbamF2YS5sYW5nLkNsYXNzXSBbV0FSTl0gd2FybiBzaG91bGQgYXBwZWFyIikpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBUZXN0IHNldHRpbmcgYSB1c2VyIGxvZ2dlciB0byBhbiBpbGxlZ2FsIGxldmVsIHZhbHVlIHRocm93cyBhbiBleGNlcHRpb24NCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0VXNlckxvZ2dlclNldEVycm9yKCkgew0KKyAgICBQcm9wZXJ0aWVzIHByb3BzPSBuZXcgUHJvcGVydGllcygpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0MT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyMT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBQcmludFN0cmVhbSBvdXQyPSBuZXcgUHJpbnRTdHJlYW0ob3V0MSk7DQorICAgIFByaW50U3RyZWFtIGVycjI9IG5ldyBQcmludFN0cmVhbShlcnIxKTsNCisgICAgcHJvcHMucHV0KCJsb2c0dGVzdG5nLmxvZ2dlci5qYXZhLmxhbmcuU3RyaW5nIiwgInVua25vd24iKTsNCisgICAgdHJ5IHsNCisgICAgICB0ZXN0SW5pdGlhbGl6ZShwcm9wcywgb3V0MiwgZXJyMik7DQorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZhaWx1cmUiKTsNCisgICAgfQ0KKyAgICBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcEV4KSB7DQorDQorICAgICAgLy8gTm9ybWFsIGNhc2UNCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG91dDEudG9TdHJpbmcoKSwgIiIpOw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXJyMS50b1N0cmluZygpLCAiIik7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogVGVzdHMgc2V0dGluZyBhIHBhcnRpYWwgbG9nZ2VyIG5hbWUgKGEgaGllcmFyY2h5IHNjb3BlKQ0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RVc2VyTG9nZ2VyU2V0SGllcmFyY2h5KCkgew0KKyAgICBQcm9wZXJ0aWVzIHByb3BzPSBuZXcgUHJvcGVydGllcygpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0MT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyMT0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICBQcmludFN0cmVhbSBvdXQyPSBuZXcgUHJpbnRTdHJlYW0ob3V0MSk7DQorICAgIFByaW50U3RyZWFtIGVycjI9IG5ldyBQcmludFN0cmVhbShlcnIxKTsNCisgICAgcHJvcHMucHV0KCJsb2c0dGVzdG5nLmxvZ2dlci5qYXZhLmxhbmciLCAiREVCVUciKTsNCisgICAgdGVzdEluaXRpYWxpemUocHJvcHMsIG91dDIsIGVycjIpOw0KKw0KKyAgICBMb2dnZXIgc3RyTG9nZ2VyPSBMb2dnZXIuZ2V0TG9nZ2VyKFN0cmluZy5jbGFzcyk7DQorICAgIHN0ckxvZ2dlci50cmFjZSgidHJhY2Ugc2hvdWxkIG5vdCBhcHBlYXIiKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvdXQxLnRvU3RyaW5nKCksICIiKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhlcnIxLnRvU3RyaW5nKCksICIiKTsNCisgICAgc3RyTG9nZ2VyLmRlYnVnKCJkZWJ1ZyBzaG91bGQgYXBwZWFyIik7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG91dDEudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbamF2YS5sYW5nLlN0cmluZ10gW0RFQlVHXSBkZWJ1ZyBzaG91bGQgYXBwZWFyIikpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVycjEudG9TdHJpbmcoKSwgIiIpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBSdW4gYWxsIHRlc3RzLiAodmVyeSBjcnVzdHkgLi4uKQ0KKyAgICogQHBhcmFtIHBBcmdzIG5vdCB1c2VkDQorICAgKi8NCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIHBBcmdzKSB7DQorICAgIHRlc3REZWJ1Z0RlZmF1bHQoKTsNCisgICAgdGVzdERlYnVnT24oKTsNCisgICAgdGVzdERlYnVnT2ZmKCk7DQorICAgIHRlc3REZWJ1Z0Vycm9yKCk7DQorICAgIHRlc3RSb290TG9nZ2VyRGVmYXVsdCgpOw0KKyAgICB0ZXN0Um9vdExvZ2dlclNldCgpOw0KKyAgICB0ZXN0Um9vdExvZ2dlclNldEVycm9yKCk7DQorICAgIHRlc3RVc2VyTG9nZ2VyU2V0KCk7DQorICAgIHRlc3RVc2VyTG9nZ2VyU2V0RXJyb3IoKTsNCisgICAgdGVzdFVzZXJMb2dnZXJTZXRIaWVyYXJjaHkoKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL0Jhc2VDaHVuay5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL0Jhc2VDaHVuay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvQmFzZUNodW5rLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBvcmcudGVzdG5nLm11c3RhY2hlOworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZUNodW5rIHsKKworICBwcm90ZWN0ZWQgTW9kZWwgbV9tb2RlbDsKKworICBwdWJsaWMgQmFzZUNodW5rKE1vZGVsIG1vZGVsKSB7CisgICAgbV9tb2RlbCA9IG1vZGVsOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nKTsKKyAgICB9CisgIH0KKworICBhYnN0cmFjdCBTdHJpbmcgY29tcG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL01vZGVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA3MDIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL01vZGVsLmphdmEKQEAgLTAsMCArMSw4MyBAQAorcGFja2FnZSBvcmcudGVzdG5nLm11c3RhY2hlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK3B1YmxpYyBjbGFzcyBNb2RlbCB7CisgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBtX21vZGVsOworICBwcml2YXRlIFN0YWNrPFN1Yk1vZGVsPiBtX3N1Yk1vZGVscyA9IG5ldyBTdGFjazw+KCk7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1Yk1vZGVsIHsKKyAgICBTdHJpbmcgdmFyaWFibGU7CisgICAgT2JqZWN0IHN1Yk1vZGVsOworICB9CisKKyAgcHVibGljIE1vZGVsKE1hcDxTdHJpbmcsIE9iamVjdD4gbW9kZWwpIHsKKyAgICBtX21vZGVsID0gbW9kZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXNoKFN0cmluZyB2YXJpYWJsZSwgT2JqZWN0IHN1Yk1vZGVsKSB7CisgICAgU3ViTW9kZWwgc2wgPSBuZXcgU3ViTW9kZWwoKTsKKyAgICBzbC52YXJpYWJsZSA9IHZhcmlhYmxlOworICAgIHNsLnN1Yk1vZGVsID0gc3ViTW9kZWw7CisgICAgbV9zdWJNb2RlbHMucHVzaChzbCk7CisgIH0KKworICBwdWJsaWMgVmFsdWUgcmVzb2x2ZVZhbHVlKFN0cmluZyB2YXJpYWJsZSkgeworICAgIGlmICghIG1fc3ViTW9kZWxzLmlzRW1wdHkoKSkgeworICAgICAgZm9yIChTdWJNb2RlbCBvYmplY3QgOiBtX3N1Yk1vZGVscykgeworICAgICAgICBWYWx1ZSB2YWx1ZSA9IHJlc29sdmVPbkNsYXNzKG9iamVjdC5zdWJNb2RlbCwgdmFyaWFibGUpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcgVmFsdWUobV9tb2RlbC5nZXQodmFyaWFibGUpKTsKKyAgfQorCisgIHByaXZhdGUgVmFsdWUgcmVzb2x2ZU9uQ2xhc3MoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHZhcmlhYmxlKSB7CisvLyAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlcmFibGUpIHsKKy8vICAgICAgSXRlcmFibGUgaXQgPSAoSXRlcmFibGUpIG9iamVjdDsKKy8vICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworLy8gICAgICBmb3IgKE9iamVjdCBvIDogaXQpIHsKKy8vICAgICAgICBMaXN0PE9iamVjdD4gdmFsdWVzID0gcmVzb2x2ZU9uQ2xhc3MobywgdmFyaWFibGUpOworLy8gICAgICAgIHJlc3VsdC5hZGRBbGwodmFsdWVzKTsKKy8vICAgICAgfQorLy8gICAgICByZXR1cm4gcmVzdWx0OworLy8gICAgfSBlbHNlIHsKKyAgICAgIENsYXNzPD8gZXh0ZW5kcyBPYmplY3Q+IGNscyA9IG9iamVjdC5nZXRDbGFzcygpOworICAgICAgdHJ5IHsKKyAgICAgICAgRmllbGQgZiA9IGNscy5nZXRGaWVsZCh2YXJpYWJsZSk7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWUoZi5nZXQob2JqZWN0KSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgTm9TdWNoRmllbGRFeGNlcHRpb24gfCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKy8vICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRUb3BTdWJNb2RlbCgpIHsKKyAgICByZXR1cm4gbV9zdWJNb2RlbHMucGVlaygpLnZhcmlhYmxlOworICB9CisKKyAgcHVibGljIHZvaWQgcG9wU3ViTW9kZWwoKSB7CisgICAgbV9zdWJNb2RlbHMucG9wKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHJlc29sdmVWYWx1ZVRvU3RyaW5nKFN0cmluZyB2YXJpYWJsZSkgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBWYWx1ZSB2YWx1ZSA9IHJlc29sdmVWYWx1ZSh2YXJpYWJsZSk7CisgICAgaWYgKHZhbHVlLmdldCgpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB2YWx1ZS5nZXQoKS50b1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbTW9kZWwgIiArIG1fbW9kZWwgKyAiIHN1Yk1vZGVsOiIgKyBtX3N1Yk1vZGVscyArICJdIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL011c3RhY2hlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvTXVzdGFjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc3N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL011c3RhY2hlLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5tdXN0YWNoZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBNdXN0YWNoZSB7CisKKyAgcHVibGljIFN0cmluZyBydW4oU3RyaW5nIHRlbXBsYXRlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJ1bih0ZW1wbGF0ZSwgbmV3IE1vZGVsKG0pKTsKKyAgfQorCisgIFN0cmluZyBydW4oU3RyaW5nIHRlbXBsYXRlLCBNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgbGluZU51bWJlciA9IDA7CisKKyAgICBMaXN0PEJhc2VDaHVuaz4gY2h1bmtzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgaW50IHRpID0gMDsKKyAgICB3aGlsZSAodGkgPCB0ZW1wbGF0ZS5sZW5ndGgoKSkgeworICAgICAgaW50IHN0YXJ0OworICAgICAgaW50IGVuZDsKKyAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQXQodGkpID09ICdcbicpIGxpbmVOdW1iZXIrKzsKKworICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCh0aSkgPT0gJ3snICYmIHRpICsgMSA8IHRlbXBsYXRlLmxlbmd0aCgpCisgICAgICAgICAgJiYgdGVtcGxhdGUuY2hhckF0KHRpICsgMSkgPT0gJ3snKSB7CisgICAgICAgIGludCBpbmRleCA9IHRpICsgMjsKKyAgICAgICAgc3RhcnQgPSBpbmRleDsKKyAgICAgICAgYm9vbGVhbiBmb3VuZEVuZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoaW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGgoKSAmJiAhIGZvdW5kRW5kKSB7CisgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICBmb3VuZEVuZCA9IHRlbXBsYXRlLmNoYXJBdChpbmRleCkgPT0gJ30nICYmIGluZGV4ICsgMSA8IHRlbXBsYXRlLmxlbmd0aCgpCisgICAgICAgICAgICAgICYmIHRlbXBsYXRlLmNoYXJBdChpbmRleCArIDEpID09ICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3VuZEVuZCkgeworICAgICAgICAgIGVuZCA9IGluZGV4OworICAgICAgICAgIFN0cmluZyB2YXJpYWJsZSA9IHRlbXBsYXRlLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKKyAgICAgICAgICBwKCJGb3VuZCB2YXJpYWJsZToiICsgdmFyaWFibGUpOworICAgICAgICAgIGlmICh2YXJpYWJsZS5zdGFydHNXaXRoKCIjIikpIHsKKyAgICAgICAgICAgIC8vIENvbXBsZXggdmFyaWFibGUge3sjZm9vfX0uCisgICAgICAgICAgICBTdHJpbmcgY29uZGl0aW9uYWxWYXJpYWJsZSA9IHZhcmlhYmxlLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIFZhbHVlIHZhbHVlID0gbW9kZWwucmVzb2x2ZVZhbHVlKGNvbmRpdGlvbmFsVmFyaWFibGUpOworICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gZmluZENsb3NpbmdJbmRleCh0ZW1wbGF0ZSwgdGksIGNvbmRpdGlvbmFsVmFyaWFibGUpOworICAgICAgICAgICAgT2JqZWN0IHYgPSB2YWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgLy8gTnVsbCBjb25kaXRpb24sIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIEl0ZXJhYmxlKSB7CisgICAgICAgICAgICAgIC8vIEl0ZXJhYmxlLCBjYWxsIGEgc3ViIE11c3RhY2hlIHRvIHByb2Nlc3MgdGhpcyBjaHVuayBpbiBhIGxvb3AKKyAgICAgICAgICAgICAgLy8gYWZ0ZXIgcHVzaGluZyBhIG5ldyBzdWJtb2RlbAorICAgICAgICAgICAgICBJdGVyYWJsZSBpdCA9IChJdGVyYWJsZSkgdjsKKyAgICAgICAgICAgICAgU3RyaW5nIHN1YlRlbXBsYXRlID0gdGVtcGxhdGUuc3Vic3RyaW5nKHRpICsgdmFyaWFibGUubGVuZ3RoKCkgKyA0LCBlbmRJbmRleCk7CisgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBpdCkgeworICAgICAgICAgICAgICAgIG1vZGVsLnB1c2goY29uZGl0aW9uYWxWYXJpYWJsZSwgbyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHIgPSBuZXcgTXVzdGFjaGUoKS5ydW4oc3ViVGVtcGxhdGUsIG1vZGVsKTsKKyAgICAgICAgICAgICAgICBtb2RlbC5wb3BTdWJNb2RlbCgpOworICAgICAgICAgICAgICAgIGNodW5rcy5hZGQobmV3IFN0cmluZ0NodW5rKG1vZGVsLCByKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIFNjb3BlLCBjYWxsIGEgc3ViIE11c3RhY2hlIHRvIHByb2Nlc3MgdGhpcyBjaHVuaworICAgICAgICAgICAgICAvLyBhZnRlciBwdXNoaW5nIGEgbmV3IHN1Ym1vZGVsCisgICAgICAgICAgICAgIFN0cmluZyBzdWJUZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cmluZyh0aSArIHZhcmlhYmxlLmxlbmd0aCgpICsgNCwgZW5kSW5kZXgpOworICAgICAgICAgICAgICBtb2RlbC5wdXNoKGNvbmRpdGlvbmFsVmFyaWFibGUsIHYpOworICAgICAgICAgICAgICBTdHJpbmcgciA9IG5ldyBNdXN0YWNoZSgpLnJ1bihzdWJUZW1wbGF0ZSwgbW9kZWwpOworICAgICAgICAgICAgICBtb2RlbC5wb3BTdWJNb2RlbCgpOworICAgICAgICAgICAgICBjaHVua3MuYWRkKG5ldyBTdHJpbmdDaHVuayhtb2RlbCwgcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGkgPSBlbmRJbmRleCArIHZhcmlhYmxlLmxlbmd0aCgpICsgNDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVndWxhciB2YXJpYWJsZSB7e2Zvb319CisgICAgICAgICAgICBjaHVua3MuYWRkKG5ldyBWYXJpYWJsZUNodW5rKG1vZGVsLCB2YXJpYWJsZSkpOworICAgICAgICAgICAgdGkgKz0gdmFyaWFibGUubGVuZ3RoKCkgKyA0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5jbG9zZWQgdmFyaWFibGUgYXQgbGluZSAiICsgbGluZU51bWJlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNodW5rcy5hZGQobmV3IFN0cmluZ0NodW5rKG1vZGVsLCAiIiArIHRlbXBsYXRlLmNoYXJBdCh0aSkpKTsKKyAgICAgICAgdGkrKzsKKyAgICAgIH0KKyAgICB9IC8vIHdoaWxlCisKKyAgICBwKCIqKioqKioqKioqKioqKioqKioqKiBGaW5hbCBjb21wb3NpdGlvbiwgY2h1bmtzOiIpOworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBwKCIqKiogVGVtcGxhdGU6IiArIHRlbXBsYXRlKTsKKyAgICBmb3IgKEJhc2VDaHVuayBiYyA6IGNodW5rcykgeworICAgICAgcCgiKioqICAiICsgYmMpOworICAgIH0KKworICAgIGZvciAoQmFzZUNodW5rIGJjIDogY2h1bmtzKSB7CisgICAgICBTdHJpbmcgYyA9IGJjLmNvbXBvc2UoKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoYyk7CisgICAgfQorICAgIHAoIioqKiBGaW5hbCByZXN1bHQ6IiArIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgZmluZENsb3NpbmdJbmRleChTdHJpbmcgdGVtcGxhdGUsIGludCB0aSwKKyAgICAgIFN0cmluZyBjb25kaXRpb25hbFZhcmlhYmxlKSB7CisgICAgaW50IHJlc3VsdCA9IHRlbXBsYXRlLmxhc3RJbmRleE9mKCJ7ey8iICsgY29uZGl0aW9uYWxWYXJpYWJsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHJpbmcpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9tdXN0YWNoZS9TdHJpbmdDaHVuay5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL1N0cmluZ0NodW5rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMjhiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9tdXN0YWNoZS9TdHJpbmdDaHVuay5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5tdXN0YWNoZTsKKworcHVibGljIGNsYXNzIFN0cmluZ0NodW5rIGV4dGVuZHMgQmFzZUNodW5rIHsKKworICBwcml2YXRlIFN0cmluZyBtX3N0cmluZzsKKworICBwdWJsaWMgU3RyaW5nQ2h1bmsoTW9kZWwgbW9kZWwsIFN0cmluZyBzdHJpbmcpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgICAgbV9zdHJpbmcgPSBzdHJpbmc7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBjb21wb3NlKCkgeworICAgIHJldHVybiBtX3N0cmluZzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiW1N0cmluZ0NodW5rICIgKyBtX3N0cmluZyArICJdIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL1ZhbHVlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZlODA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL211c3RhY2hlL1ZhbHVlLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLm11c3RhY2hlOworCitwdWJsaWMgY2xhc3MgVmFsdWUgeworICBwcml2YXRlIE9iamVjdCBtX29iamVjdDsKKworICBwdWJsaWMgVmFsdWUoT2JqZWN0IG9iamVjdCkgeworICAgIG1fb2JqZWN0ID0gb2JqZWN0OworICB9CisKKyAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgcmV0dXJuIG1fb2JqZWN0OworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9tdXN0YWNoZS9WYXJpYWJsZUNodW5rLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvVmFyaWFibGVDaHVuay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTk0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvbXVzdGFjaGUvVmFyaWFibGVDaHVuay5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5tdXN0YWNoZTsKKworcHVibGljIGNsYXNzIFZhcmlhYmxlQ2h1bmsgZXh0ZW5kcyBCYXNlQ2h1bmsgeworCisgIHByaXZhdGUgU3RyaW5nIG1fdmFyaWFibGU7CisKKyAgcHVibGljIFZhcmlhYmxlQ2h1bmsoTW9kZWwgbW9kZWwsIFN0cmluZyB2YXJpYWJsZSkgeworICAgIHN1cGVyKG1vZGVsKTsKKyAgICBtX3ZhcmlhYmxlID0gdmFyaWFibGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBjb21wb3NlKCkgeworICAgIFN0cmluZyByZXN1bHQgPSBtX21vZGVsLnJlc29sdmVWYWx1ZVRvU3RyaW5nKG1fdmFyaWFibGUpOworICAgIHAoIlZhcmlhYmxlQ2h1bmsgcmV0dXJuaW5nOiAiICsgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbVmFyaWFibGVDaHVuayAiICsgbV92YXJpYWJsZSArICIgbW9kZWw6IiArIG1fbW9kZWwgKyAiXSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvQ29ubmVjdGlvbkluZm8uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvQ29ubmVjdGlvbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODJmZjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9Db25uZWN0aW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkluZm8geworICBwcml2YXRlIFNvY2tldCBtX3NvY2tldDsKKyAgcHJpdmF0ZSBPYmplY3RJbnB1dFN0cmVhbSBtX29pczsKKyAgcHJpdmF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gbV9vb3M7CisKKyAgcHVibGljIE9iamVjdElucHV0U3RyZWFtIGdldE9pcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG1fb2lzID09IG51bGwpIHsKKyAgICAgIG1fb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG1fc29ja2V0LmdldElucHV0U3RyZWFtKCkpOworICAgIH0KKyAgICByZXR1cm4gbV9vaXM7CisgIH0KKworICBwdWJsaWMgT2JqZWN0T3V0cHV0U3RyZWFtIGdldE9vcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG1fb29zID09IG51bGwpIHsKKyAgICAgIG1fb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShtX3NvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgfQorICAgIHJldHVybiBtX29vczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNvY2tldChTb2NrZXQgcykgeworICAgIG1fc29ja2V0ID0gczsKKyAgfQorCisgIHB1YmxpYyBTb2NrZXQgZ2V0U29ja2V0KCkgeworICAgIHJldHVybiBtX3NvY2tldDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1JlbW90ZUFyZ3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlQXJncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODlkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1JlbW90ZUFyZ3MuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlOworCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuUGFyYW1ldGVyOworCitwdWJsaWMgY2xhc3MgUmVtb3RlQXJncyB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAiLXNlcnBvcnQiOworICBAUGFyYW1ldGVyKG5hbWVzID0gUE9SVCwgZGVzY3JpcHRpb24gPSAiVGhlIHBvcnQgZm9yIHRoZSBzZXJpYWxpemF0aW9uIHByb3RvY29sIikKKyAgcHVibGljIEludGVnZXIgc2VyUG9ydDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET05UX0VYSVQ9ICItZG9udGV4aXQiOworICBAUGFyYW1ldGVyKG5hbWVzID0gRE9OVF9FWElULCBkZXNjcmlwdGlvbiA9ICJEbyBub3QgZXhpdCB0aGUgSlZNIG9uY2UgZG9uZSIpCisgIHB1YmxpYyBib29sZWFuIGRvbnRFeGl0ID0gZmFsc2U7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNLID0gIi1hY2siOworICBAUGFyYW1ldGVyKG5hbWVzID0gQUNLLCBkZXNjcmlwdGlvbiA9ICJVc2UgQUNLJ3MiKQorICBwdWJsaWMgYm9vbGVhbiBhY2sgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlU3VpdGVXb3JrZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlU3VpdGVXb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYmVjYTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9SZW1vdGVTdWl0ZVdvcmtlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLlN1aXRlUnVubmVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwucmVtb3RlLlNsYXZlUG9vbDsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLlJlbW90ZVJlc3VsdExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCisvKioKKyAqIEEgd29ya2VyIHRoYXQgd2lsbCBiZSBwdXQgaW50byBhbiBFeGVjdXRvciBhbmQgdGhhdCBzZW5kcyBhIHN1aXRlCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZVN1aXRlV29ya2VyIGV4dGVuZHMgUmVtb3RlV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgeworICBwcml2YXRlIFhtbFN1aXRlIG1fc3VpdGU7CisKKyAgcHVibGljIFJlbW90ZVN1aXRlV29ya2VyKFhtbFN1aXRlIHN1aXRlLCBTbGF2ZVBvb2wgc2xhdmVQb29sLCBSZW1vdGVSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHN1cGVyKGxpc3RlbmVyLCBzbGF2ZVBvb2wpOworICAgIG1fc3VpdGUgPSBzdWl0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIFN1aXRlUnVubmVyIHJlc3VsdCA9IHNlbmRTdWl0ZShnZXRTbGF2ZVBvb2woKS5nZXRTbGF2ZSgpLCBtX3N1aXRlKTsKKyAgICAgIG1fbGlzdGVuZXIub25SZXN1bHQocmVzdWx0KTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlVGVzdE5HLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1JlbW90ZVRlc3RORy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWViZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1JlbW90ZVRlc3RORy5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlOw0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlscy5kZWZhdWx0SWZTdHJpbmdFbXB0eTsNCisNCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuSkNvbW1hbmRlcjsNCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuUGFyYW1ldGVyRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkNvbW1hbmRMaW5lQXJnczsNCitpbXBvcnQgb3JnLnRlc3RuZy5JQ2xhc3NMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJ1bm5lckZhY3Rvcnk7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0UnVubmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbC5HZW5lcmljTWVzc2FnZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuSU1lc3NhZ2VTZW5kZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLk1lc3NhZ2VIZWxwZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLk1lc3NhZ2VIdWI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlJlbW90ZVRlc3RMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuU2VyaWFsaXplZE1lc3NhZ2VTZW5kZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlN0cmluZ01lc3NhZ2VTZW5kZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlN1aXRlTWVzc2FnZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuSlVuaXRYTUxSZXBvcnRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuVGVzdEhUTUxSZXBvcnRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvKioNCisgKiBFeHRlbnNpb24gb2YgVGVzdE5HIHJlZ2lzdGVyaW5nIGEgcmVtb3RlIFRlc3RMaXN0ZW5lci4NCisgKg0KKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBSZW1vdGVUZXN0TkcgZXh0ZW5kcyBUZXN0Tkcgew0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMSE9TVCA9ICJsb2NhbGhvc3QiOw0KKw0KKyAgLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIEVjbGlwc2UgcGx1Zy1pbiwgbWFrZSBzdXJlIHlvdQ0KKyAgLy8gbW9kaWZ5IHRoZSBwbHVnLWluIGFzIHdlbGwgaWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlbS4NCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BPUlQgPSAiMTIzNDUiOw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfU1VJVEVfRklMRSA9ICJ0ZXN0bmctY3VzdG9tc3VpdGUueG1sIjsNCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1NVSVRFX0RJUkVDVE9SWSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsNCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFQlVHID0gInRlc3RuZy5lY2xpcHNlLmRlYnVnIjsNCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZFUkJPU0UgPSAidGVzdG5nLmVjbGlwc2UudmVyYm9zZSI7DQorICAvLyBFbmQgb2YgRWNsaXBzZSBjb25zdGFudHMuDQorDQorICBwcml2YXRlIElUZXN0UnVubmVyRmFjdG9yeSBtX2N1c3RvbVRlc3RSdW5uZXJGYWN0b3J5Ow0KKyAgcHJpdmF0ZSBTdHJpbmcgbV9ob3N0Ow0KKw0KKyAgLyoqIFBvcnQgdXNlZCBmb3IgdGhlIHN0cmluZyBwcm90b2NvbCAqLw0KKyAgcHJpdmF0ZSBJbnRlZ2VyIG1fcG9ydCA9IG51bGw7DQorDQorICAvKiogUG9ydCB1c2VkIGZvciB0aGUgc2VyaWFsaXplZCBwcm90b2NvbCAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgSW50ZWdlciBtX3NlclBvcnQgPSBudWxsOw0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX2RlYnVnOw0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX2RvbnRFeGl0Ow0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX2FjazsNCisNCisgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsNCisgICAgbV9ob3N0ID0gZGVmYXVsdElmU3RyaW5nRW1wdHkoaG9zdCwgTE9DQUxIT1NUKTsNCisgIH0NCisNCisgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVBbGxTdWl0ZXMoTGlzdDxYbWxTdWl0ZT4gc3VpdGVzLCBMaXN0PFhtbFN1aXRlPiBvdXRTdWl0ZXMpIHsNCisgICAgZm9yIChYbWxTdWl0ZSBzIDogc3VpdGVzKSB7DQorICAgICAgb3V0U3VpdGVzLmFkZChzKTsNCisvLyAgICAgIGNhbGN1bGF0ZUFsbFN1aXRlcyhzLmdldENoaWxkU3VpdGVzKCksIG91dFN1aXRlcyk7DQorICAgIH0NCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgcnVuKCkgew0KKyAgICBJTWVzc2FnZVNlbmRlciBzZW5kZXIgPSBtX3NlclBvcnQgIT0gbnVsbA0KKyAgICAgICAgPyBuZXcgU2VyaWFsaXplZE1lc3NhZ2VTZW5kZXIobV9ob3N0LCBtX3NlclBvcnQsIG1fYWNrKQ0KKyAgICAgICAgOiBuZXcgU3RyaW5nTWVzc2FnZVNlbmRlcihtX2hvc3QsIG1fcG9ydCk7DQorICAgIGZpbmFsIE1lc3NhZ2VIdWIgbXNoID0gbmV3IE1lc3NhZ2VIdWIoc2VuZGVyKTsNCisgICAgbXNoLnNldERlYnVnKGlzRGVidWcoKSk7DQorICAgIHRyeSB7DQorICAgICAgbXNoLmNvbm5lY3QoKTsNCisgICAgICAvLyBXZSBjb3VsZG4ndCBkbyB0aGlzIHVudGlsIG5vdyBpbiBkZWJ1ZyBtb2RlIHNpbmNlIHRoZSAueG1sIGZpbGUgZGlkbid0IGV4aXN0IHlldC4NCisgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGNvbm5lY3RlZCB3aXRoIHRoZSBFY2xpcHNlIGNsaWVudCwgd2Uga25vdyB0aGF0IGl0IGNyZWF0ZWQgdGhlIC54bWwNCisgICAgICAvLyBmaWxlIHNvIHdlIGNhbiBwcm9jZWVkIHdpdGggdGhlIGluaXRpYWxpemF0aW9uDQorICAgICAgaW5pdGlhbGl6ZVN1aXRlc0FuZEphckZpbGUoKTsNCisNCisgICAgICBMaXN0PFhtbFN1aXRlPiBzdWl0ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgICBjYWxjdWxhdGVBbGxTdWl0ZXMobV9zdWl0ZXMsIHN1aXRlcyk7DQorLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1aXRlczogIiArIG1fc3VpdGVzLmdldCgwKS5nZXRDaGlsZFN1aXRlcygpLnNpemUoKQ0KKy8vICAgICAgICAgICsgIiBhbmQ6IiArIHN1aXRlcy5nZXQoMCkuZ2V0Q2hpbGRTdWl0ZXMoKS5zaXplKCkpOw0KKyAgICAgIGlmKHN1aXRlcy5zaXplKCkgPiAwKSB7DQorDQorICAgICAgICBpbnQgdGVzdENvdW50PSAwOw0KKw0KKyAgICAgICAgZm9yIChYbWxTdWl0ZSBzdWl0ZSA6IHN1aXRlcykgew0KKyAgICAgICAgICB0ZXN0Q291bnQgKz0gc3VpdGUuZ2V0VGVzdHMoKS5zaXplKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBHZW5lcmljTWVzc2FnZSBnbT0gbmV3IEdlbmVyaWNNZXNzYWdlKE1lc3NhZ2VIZWxwZXIuR0VORVJJQ19TVUlURV9DT1VOVCk7DQorICAgICAgICBnbS5zZXRTdWl0ZUNvdW50KHN1aXRlcy5zaXplKCkpOw0KKyAgICAgICAgZ20uc2V0VGVzdENvdW50KHRlc3RDb3VudCk7DQorICAgICAgICBtc2guc2VuZE1lc3NhZ2UoZ20pOw0KKw0KKyAgICAgICAgYWRkTGlzdGVuZXIobmV3IFJlbW90ZVN1aXRlTGlzdGVuZXIobXNoKSk7DQorICAgICAgICBzZXRUZXN0UnVubmVyRmFjdG9yeShuZXcgRGVsZWdhdGluZ1Rlc3RSdW5uZXJGYWN0b3J5KGJ1aWxkVGVzdFJ1bm5lckZhY3RvcnkoKSwgbXNoKSk7DQorDQorLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3RlVGVzdE5HIHN0YXJ0aW5nIik7DQorICAgICAgICBzdXBlci5ydW4oKTsNCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHRlc3Qgc3VpdGUgZm91bmQuIE5vdGhpbmcgdG8gcnVuIik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGNhdGNoKFRocm93YWJsZSBjYXVzZSkgew0KKyAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsNCisgICAgfQ0KKyAgICBmaW5hbGx5IHsNCisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3RlVGVzdE5HIGZpbmlzaGluZzogIiArIChnZXRFbmQoKSAtIGdldFN0YXJ0KCkpICsgIiBtcyIpOw0KKyAgICAgIG1zaC5zaHV0RG93bigpOw0KKyAgICAgIGlmICghIG1fZGVidWcgJiYgISBtX2RvbnRFeGl0KSB7DQorICAgICAgICBTeXN0ZW0uZXhpdCgwKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogT3ZlcnJpZGUgYnkgdGhlIHBsdWdpbiBpZiB5b3UgbmVlZCB0byBjb25maWd1cmUgZGlmZmVyZW50bHkgdGhlIDxjb2RlPlRlc3RSdW5uZXI8L2NvZGU+DQorICAgKiAodXN1YWxseSB0aGlzIGlzIG5lZWRlZCBpZiBkaWZmZXJlbnQgbGlzdGVuZXJzL3JlcG9ydGVycyBhcmUgbmVlZGVkKS4NCisgICAqIDxiPk5vdGU8L2I+OiB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgd2lyaW5nIGxpc3RlbmVyLCBiZWNhdXNlIGl0IGlzIGFkZGVkDQorICAgKiBhdXRvbWF0aWNhbGx5Lg0KKyAgICovDQorICBwcm90ZWN0ZWQgSVRlc3RSdW5uZXJGYWN0b3J5IGJ1aWxkVGVzdFJ1bm5lckZhY3RvcnkoKSB7DQorICAgIGlmKG51bGwgPT0gbV9jdXN0b21UZXN0UnVubmVyRmFjdG9yeSkgew0KKyAgICAgIG1fY3VzdG9tVGVzdFJ1bm5lckZhY3Rvcnk9IG5ldyBJVGVzdFJ1bm5lckZhY3RvcnkoKSB7DQorICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICBwdWJsaWMgVGVzdFJ1bm5lciBuZXdUZXN0UnVubmVyKElTdWl0ZSBzdWl0ZSwgWG1sVGVzdCB4bWxUZXN0LA0KKyAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJSW52b2tlZE1ldGhvZExpc3RlbmVyPiBsaXN0ZW5lcnMsIExpc3Q8SUNsYXNzTGlzdGVuZXI+IGNsYXNzTGlzdGVuZXJzKSB7DQorICAgICAgICAgICAgVGVzdFJ1bm5lciBydW5uZXIgPQ0KKyAgICAgICAgICAgICAgbmV3IFRlc3RSdW5uZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBzdWl0ZSwgeG1sVGVzdCwNCisgICAgICAgICAgICAgICAgICBmYWxzZSAvKnNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzICovLA0KKyAgICAgICAgICAgICAgICAgIGxpc3RlbmVycywgY2xhc3NMaXN0ZW5lcnMpOw0KKyAgICAgICAgICAgIGlmIChtX3VzZURlZmF1bHRMaXN0ZW5lcnMpIHsNCisgICAgICAgICAgICAgIHJ1bm5lci5hZGRMaXN0ZW5lcihuZXcgVGVzdEhUTUxSZXBvcnRlcigpKTsNCisgICAgICAgICAgICAgIHJ1bm5lci5hZGRMaXN0ZW5lcihuZXcgSlVuaXRYTUxSZXBvcnRlcigpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuIHJ1bm5lcjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbV9jdXN0b21UZXN0UnVubmVyRmFjdG9yeTsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBQYXJhbWV0ZXJFeGNlcHRpb24gew0KKyAgICBDb21tYW5kTGluZUFyZ3MgY2xhID0gbmV3IENvbW1hbmRMaW5lQXJncygpOw0KKyAgICBSZW1vdGVBcmdzIHJhID0gbmV3IFJlbW90ZUFyZ3MoKTsNCisgICAgbmV3IEpDb21tYW5kZXIoQXJyYXlzLmFzTGlzdChjbGEsIHJhKSwgYXJncyk7DQorICAgIG1fZG9udEV4aXQgPSByYS5kb250RXhpdDsNCisgICAgaWYgKGNsYS5wb3J0ICE9IG51bGwgJiYgcmEuc2VyUG9ydCAhPSBudWxsKSB7DQorICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiQ2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgIiArIENvbW1hbmRMaW5lQXJncy5QT1JUDQorICAgICAgICAgICsgIiBhbmQgIiArIFJlbW90ZUFyZ3MuUE9SVCk7DQorICAgIH0NCisgICAgbV9kZWJ1ZyA9IGNsYS5kZWJ1ZzsNCisgICAgbV9hY2sgPSByYS5hY2s7DQorICAgIGlmIChtX2RlYnVnKSB7DQorLy8gICAgICB3aGlsZSAodHJ1ZSkgew0KKyAgICAgICAgaW5pdEFuZFJ1bihhcmdzLCBjbGEsIHJhKTsNCisvLyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICBpbml0QW5kUnVuKGFyZ3MsIGNsYSwgcmEpOw0KKyAgICB9DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRBbmRSdW4oU3RyaW5nW10gYXJncywgQ29tbWFuZExpbmVBcmdzIGNsYSwgUmVtb3RlQXJncyByYSkgew0KKyAgICBSZW1vdGVUZXN0TkcgcmVtb3RlVGVzdE5nID0gbmV3IFJlbW90ZVRlc3RORygpOw0KKyAgICBpZiAobV9kZWJ1Zykgew0KKyAgICAgIC8vIEluIGRlYnVnIG1vZGUsIG92ZXJyaWRlIHRoZSBwb3J0IGFuZCB0aGUgWE1MIGZpbGUgdG8gYSBmaXhlZCBsb2NhdGlvbg0KKyAgICAgIGNsYS5wb3J0ID0gSW50ZWdlci5wYXJzZUludChERUJVR19QT1JUKTsNCisgICAgICByYS5zZXJQb3J0ID0gY2xhLnBvcnQ7DQorICAgICAgY2xhLnN1aXRlRmlsZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7DQorICAgICAgICAgIERFQlVHX1NVSVRFX0RJUkVDVE9SWSArIERFQlVHX1NVSVRFX0ZJTEUNCisgICAgICB9KTsNCisgICAgfQ0KKyAgICByZW1vdGVUZXN0TmcuY29uZmlndXJlKGNsYSk7DQorICAgIHJlbW90ZVRlc3ROZy5zZXRIb3N0KGNsYS5ob3N0KTsNCisgICAgbV9zZXJQb3J0ID0gcmEuc2VyUG9ydDsNCisgICAgcmVtb3RlVGVzdE5nLm1fcG9ydCA9IGNsYS5wb3J0Ow0KKyAgICBpZiAoaXNWZXJib3NlKCkpIHsNCisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkludm9rZWQgd2l0aCAiKTsNCisgICAgICBmb3IgKFN0cmluZyBzIDogYXJncykgew0KKyAgICAgICAgc2IuYXBwZW5kKHMpLmFwcGVuZCgiICIpOw0KKyAgICAgIH0NCisgICAgICBwKHNiLnRvU3RyaW5nKCkpOw0KKy8vICAgICAgcmVtb3RlVGVzdE5nLnNldFZlcmJvc2UoMSk7DQorLy8gICAgfSBlbHNlIHsNCisvLyAgICAgIHJlbW90ZVRlc3ROZy5zZXRWZXJib3NlKDApOw0KKyAgICB9DQorICAgIHZhbGlkYXRlQ29tbWFuZExpbmVQYXJhbWV0ZXJzKGNsYSk7DQorICAgIHJlbW90ZVRlc3ROZy5ydW4oKTsNCisvLyAgICBpZiAobV9kZWJ1Zykgew0KKy8vICAgICAgLy8gUnVuIGluIGEgbG9vcCBpZiBpbiBkZWJ1ZyBtb2RlIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHJ1biBzZXZlcmFsIGxhdW5jaGVzDQorLy8gICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZWxhdWNoIFJlbW90ZVRlc3RORy4NCisvLyAgICAgIHdoaWxlICh0cnVlKSB7DQorLy8gICAgICAgIHJlbW90ZVRlc3ROZy5ydW4oKTsNCisvLyAgICAgICAgcmVtb3RlVGVzdE5nLmNvbmZpZ3VyZShjbGEpOw0KKy8vICAgICAgfQ0KKy8vICAgIH0gZWxzZSB7DQorLy8gICAgICByZW1vdGVUZXN0TmcucnVuKCk7DQorLy8gICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwKFN0cmluZyBzKSB7DQorICAgIGlmIChpc1ZlcmJvc2UoKSkgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1JlbW90ZVRlc3ROR10gIiArIHMpOw0KKyAgICB9DQorICB9DQorDQorICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJib3NlKCkgew0KKyAgICBib29sZWFuIHJlc3VsdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QRVJUWV9WRVJCT1NFKSAhPSBudWxsIHx8IGlzRGVidWcoKTsNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnKCkgew0KKyAgICByZXR1cm4gbV9kZWJ1ZyB8fCBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUEVSVFlfREVCVUcpICE9IG51bGw7DQorICB9DQorDQorICBwcml2YXRlIFN0cmluZyBnZXRIb3N0KCkgew0KKyAgICByZXR1cm4gbV9ob3N0Ow0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBpbnQgZ2V0UG9ydCgpIHsNCisgICAgcmV0dXJuIG1fcG9ydDsNCisgIH0NCisNCisgIC8qKiBBIElTdWl0ZUxpc3RlbmVyIHdpcmluZyB0aGUgcmVzdWx0cyB1c2luZyB0aGUgaW50ZXJuYWwgc3RyaW5nLWJhc2VkIHByb3RvY29sLiAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVtb3RlU3VpdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElTdWl0ZUxpc3RlbmVyIHsNCisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlSHViIG1fbWVzc2FnZVNlbmRlcjsNCisNCisgICAgUmVtb3RlU3VpdGVMaXN0ZW5lcihNZXNzYWdlSHViIHNtc2gpIHsNCisgICAgICBtX21lc3NhZ2VTZW5kZXI9IHNtc2g7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElTdWl0ZSBzdWl0ZSkgew0KKyAgICAgIG1fbWVzc2FnZVNlbmRlci5zZW5kTWVzc2FnZShuZXcgU3VpdGVNZXNzYWdlKHN1aXRlLCBmYWxzZSAvKnN0YXJ0Ki8pKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgb25TdGFydChJU3VpdGUgc3VpdGUpIHsNCisgICAgICBtX21lc3NhZ2VTZW5kZXIuc2VuZE1lc3NhZ2UobmV3IFN1aXRlTWVzc2FnZShzdWl0ZSwgdHJ1ZSAvKnN0YXJ0Ki8pKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsZWdhdGluZ1Rlc3RSdW5uZXJGYWN0b3J5IGltcGxlbWVudHMgSVRlc3RSdW5uZXJGYWN0b3J5IHsNCisgICAgcHJpdmF0ZSBmaW5hbCBJVGVzdFJ1bm5lckZhY3RvcnkgbV9kZWxlZ2F0ZUZhY3Rvcnk7DQorICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUh1YiBtX21lc3NhZ2VTZW5kZXI7DQorDQorICAgIERlbGVnYXRpbmdUZXN0UnVubmVyRmFjdG9yeShJVGVzdFJ1bm5lckZhY3RvcnkgdHJmLCBNZXNzYWdlSHViIHNtc2gpIHsNCisgICAgICBtX2RlbGVnYXRlRmFjdG9yeT0gdHJmOw0KKyAgICAgIG1fbWVzc2FnZVNlbmRlcj0gc21zaDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFRlc3RSdW5uZXIgbmV3VGVzdFJ1bm5lcihJU3VpdGUgc3VpdGUsIFhtbFRlc3QgdGVzdCwNCisgICAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbGlzdGVuZXJzLCBMaXN0PElDbGFzc0xpc3RlbmVyPiBjbGFzc0xpc3RlbmVycykgew0KKyAgICAgIFRlc3RSdW5uZXIgdHIgPSBtX2RlbGVnYXRlRmFjdG9yeS5uZXdUZXN0UnVubmVyKHN1aXRlLCB0ZXN0LCBsaXN0ZW5lcnMsIGNsYXNzTGlzdGVuZXJzKTsNCisgICAgICB0ci5hZGRMaXN0ZW5lcihuZXcgUmVtb3RlVGVzdExpc3RlbmVyKHN1aXRlLCB0ZXN0LCBtX21lc3NhZ2VTZW5kZXIpKTsNCisgICAgICByZXR1cm4gdHI7DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9SZW1vdGVXb3JrZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBhYmRlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvUmVtb3RlV29ya2VyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuU3VpdGVSdW5uZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLnJlbW90ZS5TbGF2ZVBvb2w7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5SZW1vdGVSZXN1bHRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBSZW1vdGVXb3JrZXIgeworICBwcm90ZWN0ZWQgUmVtb3RlUmVzdWx0TGlzdGVuZXIgbV9saXN0ZW5lcjsKKyAgcHJpdmF0ZSBTbGF2ZVBvb2wgbV9zbGF2ZVBvb2w7CisKKyAgcHVibGljIFJlbW90ZVdvcmtlcihSZW1vdGVSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lciwgU2xhdmVQb29sIHNsYXZlUG9vbCkgeworICAgIG1fbGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICBtX3NsYXZlUG9vbCA9IHNsYXZlUG9vbDsKKyAgfQorCisgIHByb3RlY3RlZCBTbGF2ZVBvb2wgZ2V0U2xhdmVQb29sKCkgeworICAgIHJldHVybiBtX3NsYXZlUG9vbDsKKyAgfQorCisgIHByb3RlY3RlZCBTdWl0ZVJ1bm5lciBzZW5kU3VpdGUoQ29ubmVjdGlvbkluZm8gY2ksIFhtbFN1aXRlIHN1aXRlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICB7CisgICAgbG9nKCJTZW5kaW5nICIgKyBzdWl0ZS5nZXROYW1lKCkgKyAiIHRvICIKKyAgICAgICAgKyBjaS5nZXRTb2NrZXQoKS5nZXRJbmV0QWRkcmVzcygpLmdldENhbm9uaWNhbEhvc3ROYW1lKCkgKyAiOiIKKyAgICAgICAgKyBjaS5nZXRTb2NrZXQoKS5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkpOworICAgIGNpLmdldE9vcygpLndyaXRlT2JqZWN0KHN1aXRlKTsKKyAgICBjaS5nZXRPb3MoKS5mbHVzaCgpOworICAgIFN1aXRlUnVubmVyIHJlc3VsdCA9IChTdWl0ZVJ1bm5lcikgY2kuZ2V0T2lzKCkucmVhZE9iamVjdCgpOworICAgIGxvZygiUmVjZWl2ZWQgcmVzdWx0cyBmb3IgIiArIHJlc3VsdC5nZXROYW1lKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzdHJpbmcpIHsKKyAgICBVdGlscy5sb2coIiIsIDIsIHN0cmluZyk7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1N1aXRlRGlzcGF0Y2hlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9TdWl0ZURpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY0NzkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9TdWl0ZURpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZTsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TGlzdGVuZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuU3VpdGVSdW5uZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklDb25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkludm9rZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuUHJvcGVydGllc0ZpbGU7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLmFkYXB0ZXIuRGVmYXVsdE1hc3RlcnRBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLklNYXN0ZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLlJlbW90ZVJlc3VsdExpc3RlbmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsNCisNCisvKioNCisgKiBEaXNwYXRjaGVzIHRlc3Qgc3VpdHMgYWNjb3JkaW5nIHRvIHRoZSBzdHJhdGVneSBkZWZpbmVkLg0KKyAqDQorICoNCisgKiBAYXV0aG9yCUd1eSBLb3JsYW5kDQorICogQHNpbmNlIAlBcHJpbCAyMCwgMjAwNw0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdWl0ZURpc3BhdGNoZXINCit7DQorCS8qKg0KKwkgKiBQcm9wZXJ0aWVzIGFsbG93ZWQgaW4gcmVtb3RlLnByb3BlcnRpZXMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9TVFJBVEVHWSA9ICJ0ZXN0bmcubWFzdGVyLnN0cmF0ZWd5IjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQk9TRSA9ICJ0ZXN0bmcudmVyYm9zZSI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9BRFBBVEVSID0gInRlc3RuZy5tYXN0ZXIuYWRwdGVyIjsNCisNCisJLyoqDQorCSAqIFZhbHVlcyBhbGxvd2VkIGZvciBTVFJBVEVHWQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSQVRFR1lfVEVTVCA9ICJ0ZXN0IjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSQVRFR1lfU1VJVEUgPSAic3VpdGUiOw0KKw0KKwlmaW5hbCBwcml2YXRlIGludCBtX3ZlcmJvc2U7DQorCWZpbmFsIHByaXZhdGUgYm9vbGVhbiBtX2lzU3RyYXRlZ3lUZXN0Ow0KKw0KKwlmaW5hbCBwcml2YXRlIElNYXN0ZXJBZGFwdGVyIG1fbWFzdGVyQWRwdGVyOw0KKw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBzdWl0ZSBkaXNwYXRjaGVyLg0KKwkgKi8NCisJcHVibGljIFN1aXRlRGlzcGF0Y2hlciggU3RyaW5nIHByb3BlcnRpZXNGaWxlKSB0aHJvd3MgVGVzdE5HRXhjZXB0aW9uDQorCXsNCisJCXRyeQ0KKwkJew0KKwkJCVByb3BlcnRpZXNGaWxlIGZpbGUgPSBuZXcgUHJvcGVydGllc0ZpbGUoIHByb3BlcnRpZXNGaWxlKTsNCisJCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBmaWxlLmdldFByb3BlcnRpZXMoKTsNCisNCisJCQltX3ZlcmJvc2UgPSBJbnRlZ2VyLnBhcnNlSW50KCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFZFUkJPU0UsICIxIikpOw0KKw0KKwkJCVN0cmluZyBzdHJhdGVneSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoTUFTVEVSX1NUUkFURUdZLCBTVFJBVEVHWV9TVUlURSk7DQorCQkJbV9pc1N0cmF0ZWd5VGVzdCA9IFNUUkFURUdZX1RFU1QuZXF1YWxzSWdub3JlQ2FzZShzdHJhdGVneSk7DQorDQorCQkJU3RyaW5nIGFkYXB0ZXIgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KE1BU1RFUl9BRFBBVEVSKTsNCisJCQlpZiggYWRhcHRlciA9PSBudWxsKQ0KKwkJCXsNCisJCQkJbV9tYXN0ZXJBZHB0ZXIgPSBuZXcgRGVmYXVsdE1hc3RlcnRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShhZGFwdGVyKTsNCisJCQkJbV9tYXN0ZXJBZHB0ZXIgPSAoSU1hc3RlckFkYXB0ZXIpY2xhenoubmV3SW5zdGFuY2UoKTsNCisJCQl9DQorCQkJbV9tYXN0ZXJBZHB0ZXIuaW5pdChwcm9wZXJ0aWVzKTsNCisJCX0NCisJCWNhdGNoKCBFeGNlcHRpb24gZSkNCisJCXsNCisJCQl0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCAiRmFpbCB0byBpbml0aWFsaXplIG1hc3RlciBtb2RlIiwgZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIERpc3BhdGNoIHRlc3Qgc3VpdGVzDQorCSAqIEByZXR1cm4gc3VpdGVzIHJlc3VsdA0KKwkgKi8NCisJcHVibGljIExpc3Q8SVN1aXRlPiBkaXNwYXRjaChJQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLA0KKwkgICAgTGlzdDxYbWxTdWl0ZT4gc3VpdGVzLCBTdHJpbmcgb3V0cHV0RGlyLCBMaXN0PElUZXN0TGlzdGVuZXI+IHRlc3RMaXN0ZW5lcnMpew0KKwkJTGlzdDxJU3VpdGU+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKwkJdHJ5DQorCQl7DQorCQkJLy8NCisJCQkvLyBEaXNwYXRjaCB0aGUgc3VpdGVzL3Rlc3RzDQorCQkJLy8NCisNCisJCQlmb3IgKFhtbFN1aXRlIHN1aXRlIDogc3VpdGVzKSB7DQorCQkJCXN1aXRlLnNldFZlcmJvc2UobV92ZXJib3NlKTsNCisJCQkJU3VpdGVSdW5uZXIgc3VpdGVSdW5uZXIgPSBuZXcgU3VpdGVSdW5uZXIoY29uZmlndXJhdGlvbiwgc3VpdGUsIG91dHB1dERpcik7DQorCQkJCVJlbW90ZVJlc3VsdExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFJlbW90ZVJlc3VsdExpc3RlbmVyKCBzdWl0ZVJ1bm5lcik7DQorCQkJCWlmIChtX2lzU3RyYXRlZ3lUZXN0KSB7DQorCQkJCQlmb3IgKFhtbFRlc3QgdGVzdCA6IHN1aXRlLmdldFRlc3RzKCkpIHsNCisJCQkJCQlYbWxTdWl0ZSB0bXBTdWl0ZSA9IG5ldyBYbWxTdWl0ZSgpOw0KKwkJCQkJCXRtcFN1aXRlLnNldFhtbFBhY2thZ2VzKHN1aXRlLmdldFhtbFBhY2thZ2VzKCkpOw0KKwkJCQkJCXRtcFN1aXRlLnNldEpVbml0KHN1aXRlLmlzSlVuaXQoKSk7DQorICAgICAgICAgICAgdG1wU3VpdGUuc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoc3VpdGUuc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoKSk7DQorCQkJCQkJdG1wU3VpdGUuc2V0TmFtZSgiVGVtcG9yYXJ5IHN1aXRlIGZvciAiICsgdGVzdC5nZXROYW1lKCkpOw0KKwkJCQkJCXRtcFN1aXRlLnNldFBhcmFsbGVsKHN1aXRlLmdldFBhcmFsbGVsKCkpOw0KKwkJCQkJCXRtcFN1aXRlLnNldFBhcmVudE1vZHVsZShzdWl0ZS5nZXRQYXJlbnRNb2R1bGUoKSk7DQorCQkJCQkJdG1wU3VpdGUuc2V0R3VpY2VTdGFnZShzdWl0ZS5nZXRHdWljZVN0YWdlKCkpOw0KKwkJCQkJCXRtcFN1aXRlLnNldFBhcmFtZXRlcnMoc3VpdGUuZ2V0UGFyYW1ldGVycygpKTsNCisJCQkJCQl0bXBTdWl0ZS5zZXRUaHJlYWRDb3VudChzdWl0ZS5nZXRUaHJlYWRDb3VudCgpKTsNCisgICAgICAgICAgICB0bXBTdWl0ZS5zZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudChzdWl0ZS5nZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudCgpKTsNCisJCQkJCQl0bXBTdWl0ZS5zZXRWZXJib3NlKHN1aXRlLmdldFZlcmJvc2UoKSk7DQorCQkJCQkJdG1wU3VpdGUuc2V0T2JqZWN0RmFjdG9yeShzdWl0ZS5nZXRPYmplY3RGYWN0b3J5KCkpOw0KKwkJCQkJCVhtbFRlc3QgdG1wVGVzdCA9IG5ldyBYbWxUZXN0KHRtcFN1aXRlKTsNCisJCQkJCQl0bXBUZXN0LnNldEJlYW5TaGVsbEV4cHJlc3Npb24odGVzdC5nZXRFeHByZXNzaW9uKCkpOw0KKwkJCQkJCXRtcFRlc3Quc2V0WG1sQ2xhc3Nlcyh0ZXN0LmdldFhtbENsYXNzZXMoKSk7DQorCQkJCQkJdG1wVGVzdC5zZXRFeGNsdWRlZEdyb3Vwcyh0ZXN0LmdldEV4Y2x1ZGVkR3JvdXBzKCkpOw0KKwkJCQkJCXRtcFRlc3Quc2V0SW5jbHVkZWRHcm91cHModGVzdC5nZXRJbmNsdWRlZEdyb3VwcygpKTsNCisJCQkJCQl0bXBUZXN0LnNldEpVbml0KHRlc3QuaXNKVW5pdCgpKTsNCisJCQkJCQl0bXBUZXN0LnNldE1ldGhvZFNlbGVjdG9ycyh0ZXN0LmdldE1ldGhvZFNlbGVjdG9ycygpKTsNCisJCQkJCQl0bXBUZXN0LnNldE5hbWUodGVzdC5nZXROYW1lKCkpOw0KKwkJCQkJCXRtcFRlc3Quc2V0UGFyYWxsZWwodGVzdC5nZXRQYXJhbGxlbCgpKTsNCisJCQkJCQl0bXBUZXN0LnNldFBhcmFtZXRlcnModGVzdC5nZXRMb2NhbFBhcmFtZXRlcnMoKSk7DQorCQkJCQkJdG1wVGVzdC5zZXRWZXJib3NlKHRlc3QuZ2V0VmVyYm9zZSgpKTsNCisJCQkJCQl0bXBUZXN0LnNldFhtbENsYXNzZXModGVzdC5nZXRYbWxDbGFzc2VzKCkpOw0KKwkJCQkJCXRtcFRlc3Quc2V0WG1sUGFja2FnZXModGVzdC5nZXRYbWxQYWNrYWdlcygpKTsNCisNCisJCQkJCQltX21hc3RlckFkcHRlci5ydW5TdWl0ZXNSZW1vdGVseSh0bXBTdWl0ZSwgbGlzdGVuZXIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJbV9tYXN0ZXJBZHB0ZXIucnVuU3VpdGVzUmVtb3RlbHkoc3VpdGUsIGxpc3RlbmVyKTsNCisJCQkJfQ0KKwkJCQlyZXN1bHQuYWRkKHN1aXRlUnVubmVyKTsNCisJCQl9DQorDQorCQkJbV9tYXN0ZXJBZHB0ZXIuYXdhaXRUZXJtaW5hdGlvbigxMDAwMDApOw0KKw0KKwkJCS8vDQorCQkJLy8gUnVuIHRlc3QgbGlzdGVuZXJzDQorCQkJLy8NCisJCQlmb3IgKElTdWl0ZSBzdWl0ZSA6IHJlc3VsdCkgew0KKwkJCQlmb3IgKElTdWl0ZVJlc3VsdCBzdWl0ZVJlc3VsdCA6IHN1aXRlLmdldFJlc3VsdHMoKS52YWx1ZXMoKSkgew0KKwkJCQkJQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gYWxsVGVzdHNbXSA9IG5ldyBDb2xsZWN0aW9uW10gew0KKwkJCQkJCQlzdWl0ZVJlc3VsdC5nZXRUZXN0Q29udGV4dCgpLmdldFBhc3NlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpLA0KKwkJCQkJCQlzdWl0ZVJlc3VsdC5nZXRUZXN0Q29udGV4dCgpLmdldEZhaWxlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpLA0KKwkJCQkJCQlzdWl0ZVJlc3VsdC5nZXRUZXN0Q29udGV4dCgpLmdldFNraXBwZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSwNCisJCQkJCQkJc3VpdGVSZXN1bHQuZ2V0VGVzdENvbnRleHQoKS5nZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpLA0KKwkJCQkJfTsNCisJCQkJCWZvciAoQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gYWxsIDogYWxsVGVzdHMpIHsNCisJCQkJCQlmb3IgKElUZXN0UmVzdWx0IHRyIDogYWxsKSB7DQorCQkJCQkJCUludm9rZXIucnVuVGVzdExpc3RlbmVycyh0ciwgdGVzdExpc3RlbmVycyk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJY2F0Y2goIEV4Y2VwdGlvbiBleCkNCisJCXsNCisJCQkvL1RPRE8gYWRkIHRvIGxvZ3MNCisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9TdWl0ZVNsYXZlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL1N1aXRlU2xhdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNkMTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9TdWl0ZVNsYXZlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGU7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5Qcm9wZXJ0aWVzRmlsZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5EZWZhdWx0V29ya2VyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5JV29ya2VyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7DQorDQorLyoqDQorICogUnVuIHRlc3Qgc3VpdHMgc2VudCBieSB0aGUgZGlzcGF0Y2hlci4NCisgKg0KKyAqDQorICogQGF1dGhvcglHdXkgS29ybGFuZA0KKyAqIEBzaW5jZSAJQXByaWwgMjAsIDIwMDcNCisgKi8NCitwdWJsaWMgY2xhc3MgU3VpdGVTbGF2ZQ0KK3sNCisNCisJLyoqDQorCSAqIFByb3BlcnRpZXMgYWxsb3dlZCBpbiByZW1vdGUucHJvcGVydGllcw0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQk9TRSA9ICJ0ZXN0bmcudmVyYm9zZSI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNMQVZFX0FEUEFURVIgPSAidGVzdG5nLnNsYXZlLmFkcHRlciI7DQorDQorDQorCWZpbmFsIHByaXZhdGUgaW50IG1fdmVyYm9zZTsNCisJZmluYWwgcHJpdmF0ZSBJV29ya2VyQWRhcHRlciBtX3NsYXZlQWRwdGVyOw0KKwlmaW5hbCBwcml2YXRlIFRlc3RORyBtX3Rlc3RuZzsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgc3VpdGUgZGlzcGF0Y2hlci4NCisJICovDQorCXB1YmxpYyBTdWl0ZVNsYXZlKCBTdHJpbmcgcHJvcGVydGllc0ZpbGUsIFRlc3RORyB0ZXN0bmcpIHRocm93cyBUZXN0TkdFeGNlcHRpb24NCisJew0KKwkJdHJ5DQorCQl7DQorCQkJbV90ZXN0bmcgPSB0ZXN0bmc7DQorDQorCQkJUHJvcGVydGllc0ZpbGUgZmlsZSA9IG5ldyBQcm9wZXJ0aWVzRmlsZSggcHJvcGVydGllc0ZpbGUpOw0KKwkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGZpbGUuZ2V0UHJvcGVydGllcygpOw0KKw0KKwkJCW1fdmVyYm9zZSA9IEludGVnZXIucGFyc2VJbnQoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVkVSQk9TRSwgIjEiKSk7DQorDQorCQkJU3RyaW5nIGFkYXB0ZXIgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFNMQVZFX0FEUEFURVIpOw0KKwkJCWlmKCBhZGFwdGVyID09IG51bGwpDQorCQkJew0KKwkJCQltX3NsYXZlQWRwdGVyID0gbmV3IERlZmF1bHRXb3JrZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShhZGFwdGVyKTsNCisJCQkJbV9zbGF2ZUFkcHRlciA9IChJV29ya2VyQWRhcHRlciljbGF6ei5uZXdJbnN0YW5jZSgpOw0KKwkJCX0NCisJCQltX3NsYXZlQWRwdGVyLmluaXQocHJvcGVydGllcyk7DQorCQl9DQorCQljYXRjaCggRXhjZXB0aW9uIGUpDQorCQl7DQorCQkJdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbiggIkZhaWwgdG8gaW5pdGlhbGl6ZSBzbGF2ZSBtb2RlIiwgZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEludm9rZWQgaW4gY2xpZW50IG1vZGUuICBJbiB0aGlzIGNhc2UsIHdhaXQgZm9yIGEgY29ubmVjdGlvbg0KKwkgKiBvbiB0aGUgZ2l2ZW4gcG9ydCwgcnVuIHRoZSBYbWxTdWl0ZSB3ZSByZWNlaXZlZCBhbmQgcmV0dXJuIHRoZSBTdWl0ZVJ1bm5lcg0KKwkgKiBjcmVhdGVkIHRvIHJ1biBpdC4NCisJICovDQorCXB1YmxpYyB2b2lkIHdhaXRGb3JTdWl0ZXMoKSB7DQorCQl0cnkgew0KKwkJCXdoaWxlICh0cnVlKSB7DQorCQkJCS8vVE9ETyBzZXQgdGltZW91dA0KKwkJCQlYbWxTdWl0ZSBzID0gbV9zbGF2ZUFkcHRlci5nZXRTdWl0ZShMb25nLk1BWF9WQUxVRSk7DQorCQkJCWlmKCBzPT0gbnVsbCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisJCQkJbG9nKCJQcm9jZXNzaW5nICIgKyBzLmdldE5hbWUoKSk7DQorCQkJCUxpc3Q8WG1sU3VpdGU+IHN1aXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOw0KKwkJCQlzdWl0ZXMuYWRkKHMpOw0KKwkJCQltX3Rlc3RuZy5zZXRYbWxTdWl0ZXMoc3VpdGVzKTsNCisJCQkJTGlzdDxJU3VpdGU+IHN1aXRlUnVubmVycyA9IG1fdGVzdG5nLnJ1blN1aXRlc0xvY2FsbHkoKTsNCisJCQkJSVN1aXRlIHNyID0gc3VpdGVSdW5uZXJzLmdldCgwKTsNCisJCQkJbG9nKCJEb25lIHByb2Nlc3NpbmcgIiArIHMuZ2V0TmFtZSgpKTsNCisJCQkJbV9zbGF2ZUFkcHRlci5yZXR1cm5SZXN1bHQoc3IpOw0KKwkJCX0NCisJCX0NCisJCWNhdGNoKEV4Y2VwdGlvbiBleCkgew0KKwkJCWV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsNCisJCX0NCisJfQ0KKw0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7DQorCQlVdGlscy5sb2coIiIsIDIsIHN0cmluZyk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0RlZmF1bHRNYXN0ZXJ0QWRhcHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0RlZmF1bHRNYXN0ZXJ0QWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwZmNlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL2FkYXB0ZXIvRGVmYXVsdE1hc3RlcnRBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7DQoraW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwucmVtb3RlLlNsYXZlUG9vbDsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuVGhyZWFkVXRpbDsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuUmVtb3RlU3VpdGVXb3JrZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOw0KKw0KKy8qKg0KKyAqIERlZmF1bHQgTWFzdGVyIGFkYXB0ZXIsIHByb3ZpZGVzIGFuIGFkYXB0ZXIgYmFzZWQgb24gaG9zdHMgZmlsZS4NCisgKg0KKyAqDQorICogQGF1dGhvcglHdXkgS29ybGFuZA0KKyAqIEBzaW5jZSAJQXByaWwgMjAsIDIwMDcNCisgKi8NCitwdWJsaWMgY2xhc3MgRGVmYXVsdE1hc3RlcnRBZGFwdGVyDQoraW1wbGVtZW50cyBJTWFzdGVyQWRhcHRlcg0KK3sNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVFMgCT0gInRlc3RuZy5ob3N0cyI7DQorDQorCXByaXZhdGUgU3RyaW5nW10gbV9ob3N0czsNCisNCisJZmluYWwgcHJpdmF0ZSBTbGF2ZVBvb2wgbV9zbGF2ZVBvb2wgPSBuZXcgU2xhdmVQb29sKCk7DQorCWZpbmFsIHByaXZhdGUgTGlzdDxSdW5uYWJsZT4gbV93b3JrZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorDQorCS8qDQorCSAqIEBzZWUgb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5JTWFzdGVyQWRhcHRlciNpbml0KGphdmEudXRpbC5Qcm9wZXJ0aWVzKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBpbml0KFByb3BlcnRpZXMgcHJvcGVydGllcykNCisJew0KKwkJU3RyaW5nIGhvc3RMaW5lID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShIT1NUUyk7DQorCQltX2hvc3RzID0gIGhvc3RMaW5lLnNwbGl0KCIgIik7DQorDQorCQkvLw0KKwkJLy8gQ3JlYXRlIG9uZSBzb2NrZXQgcGVyIGhvc3QgZm91bmQNCisJCS8vDQorCQlTb2NrZXRbXSBzb2NrZXRzID0gbmV3IFNvY2tldFttX2hvc3RzLmxlbmd0aF07DQorCQlmb3IgKGludCBpID0gMDsgaSA8IG1faG9zdHMubGVuZ3RoOyBpKyspIHsNCisJCQlTdHJpbmcgaG9zdCA9IG1faG9zdHNbaV07DQorCQkJU3RyaW5nW10gcyA9IGhvc3Quc3BsaXQoIjoiKTsNCisJCQl0cnkgew0KKwkJCQlzb2NrZXRzW2ldID0gbmV3IFNvY2tldChzWzBdLCBJbnRlZ2VyLnBhcnNlSW50KHNbMV0pKTsNCisJCQl9DQorCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB8IFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsNCisJCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7DQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCQlVdGlscy5lcnJvcigiQ291bGRuJ3QgY29ubmVjdCB0byAiICsgaG9zdCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLy8NCisJCS8vIEFkZCB0aGVzZSBob3N0cyB0byB0aGUgcG9vbA0KKwkJLy8NCisJCXRyeSB7DQorCQkJbV9zbGF2ZVBvb2wuYWRkU2xhdmVzKHNvY2tldHMpOw0KKwkJfQ0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7DQorCQkJZTEucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOw0KKwkJfQ0KKwl9DQorDQorCS8qDQorCSAqIEBzZWUgb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5JTWFzdGVyQWRhcHRlciNydW5TdWl0ZXNSZW1vdGVseShqYXZhLnV0aWwuTGlzdCwgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlciwgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcikNCisJICovDQorCUBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgcnVuU3VpdGVzUmVtb3RlbHkoIFhtbFN1aXRlIHN1aXRlLCBSZW1vdGVSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCW1fd29ya2Vycy5hZGQobmV3IFJlbW90ZVN1aXRlV29ya2VyKHN1aXRlLCBtX3NsYXZlUG9vbCwgbGlzdGVuZXIpKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIGF3YWl0VGVybWluYXRpb24obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24NCisJew0KKwkJVGhyZWFkVXRpbC5leGVjdXRlKG1fd29ya2VycywgMSwgMTAgKiAxMDAwTCwgZmFsc2UpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvYWRhcHRlci9EZWZhdWx0V29ya2VyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0RlZmF1bHRXb3JrZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2NTY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvYWRhcHRlci9EZWZhdWx0V29ya2VyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlcjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0Ow0KK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7DQoraW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuQ29ubmVjdGlvbkluZm87DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOw0KKw0KKw0KKy8qKg0KKyAqIERlZmF1bHQgU2xhdmUgYWRhcHRlciwgcHJvdmlkZXMgYW4gYWRhcHRlciBiYXNlZCBvbiBzdGF0aWMgcG9ydC4NCisgKg0KKyAqDQorICogQGF1dGhvcglHdXkgS29ybGFuZA0KKyAqIEBzaW5jZSAJQXByaWwgMjAsIDIwMDcNCisgKi8NCitwdWJsaWMgY2xhc3MgRGVmYXVsdFdvcmtlckFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2VyQWRhcHRlcg0KK3sNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBVkVfUE9SVCA9ICJzbGF2ZS5wb3J0IjsNCisNCisJcHJpdmF0ZSBDb25uZWN0aW9uSW5mbyBtX2Nvbm5lY3Rpb25JbmZvOw0KKwlwcml2YXRlIGludCBtX2NsaWVudFBvcnQ7DQorDQorCUBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgaW5pdCggUHJvcGVydGllcyBwcm9wKSB0aHJvd3MgRXhjZXB0aW9uDQorCXsNCisJCW1fY2xpZW50UG9ydCA9IEludGVnZXIucGFyc2VJbnQoIHByb3AuZ2V0UHJvcGVydHkoU0xBVkVfUE9SVCwgIjAiKSk7DQorCQltX2Nvbm5lY3Rpb25JbmZvID0gcmVzZXRTb2NrZXQoIG1fY2xpZW50UG9ydCwgbnVsbCk7DQorCX0NCisNCisJLyoNCisJICogQHNlZSBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLklXb3JrZXJBcGFkdGVyI2dldFN1aXRlKGxvbmcpDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisgIHB1YmxpYyBYbWxTdWl0ZSBnZXRTdWl0ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCisJew0KKyAgICAgIHRyeSB7DQorICAgICAgICByZXR1cm4gKFhtbFN1aXRlKSBtX2Nvbm5lY3Rpb25JbmZvLmdldE9pcygpLnJlYWRPYmplY3QoKTsNCisgICAgICB9DQorICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgew0KKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7DQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSk7DQorICAgICAgfQ0KKyAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICBsb2coIkNvbm5lY3Rpb24gY2xvc2VkICIgKyBleC5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgbV9jb25uZWN0aW9uSW5mbyA9IHJlc2V0U29ja2V0KG1fY2xpZW50UG9ydCwgbV9jb25uZWN0aW9uSW5mbyk7DQorICAgICAgICB0aHJvdyBleDsNCisgICAgICB9DQorCX0NCisNCisJLyoNCisJICogQHNlZSBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLklXb3JrZXJBcGFkdGVyI3JldHVyblJlc3VsdChvcmcudGVzdG5nLklTdWl0ZSkNCisJICovDQorCUBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgcmV0dXJuUmVzdWx0KElTdWl0ZSByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQl0cnkNCisJCXsNCisJCQltX2Nvbm5lY3Rpb25JbmZvLmdldE9vcygpLndyaXRlT2JqZWN0KHJlc3VsdCk7DQorCQl9DQorCQljYXRjaChJT0V4Y2VwdGlvbiBleCkgew0KKwkJCWxvZygiQ29ubmVjdGlvbiBjbG9zZWQgIiArIGV4LmdldE1lc3NhZ2UoKSk7DQorCQkJbV9jb25uZWN0aW9uSW5mbyA9IHJlc2V0U29ja2V0KG1fY2xpZW50UG9ydCwgbV9jb25uZWN0aW9uSW5mbyk7DQorCQkJdGhyb3cgZXg7DQorCQl9DQorCX0NCisNCisJcHJpdmF0ZSBzdGF0aWMgQ29ubmVjdGlvbkluZm8gcmVzZXRTb2NrZXQoaW50IGNsaWVudFBvcnQsIENvbm5lY3Rpb25JbmZvIG9sZENpKQ0KKwl0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJQ29ubmVjdGlvbkluZm8gcmVzdWx0ID0gbmV3IENvbm5lY3Rpb25JbmZvKCk7DQorCQlTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChjbGllbnRQb3J0KTsNCisJCXNlcnZlclNvY2tldC5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7DQorCQlsb2coIldhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIG9uIHBvcnQgIiArIGNsaWVudFBvcnQpOw0KKwkJU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsNCisJCXJlc3VsdC5zZXRTb2NrZXQoc29ja2V0KTsNCisNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgew0KKwkJVXRpbHMubG9nKCIiLCAyLCBzdHJpbmcpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvYWRhcHRlci9JTWFzdGVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0lNYXN0ZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkZGIzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvYWRhcHRlci9JTWFzdGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlcjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOw0KKw0KKy8qKg0KKyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgTWFzdGVyLVNsYXZlIHRyYW5zcG9ydCBhZGFwdGVyLg0KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIE1hc3RlciB0byBwdXNoIHN1aXRlcyBhbmQgZ2V0IHJlc3VsdHMuDQorICoNCisgKiBAYXV0aG9yIEd1eSBLb3JsYW5kDQorICogQHNpbmNlIEFwcmlsIDksIDIwMDcNCisgKiBAc2VlIElXb3JrZXJBZGFwdGVyDQorICovDQorcHVibGljIGludGVyZmFjZSBJTWFzdGVyQWRhcHRlcg0KK3sNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBNYXN0ZXIgYWRhcHRlci4NCisJICogQHBhcmFtIHByb3AgaG9sZHMgdGhlIHByb3BlcnRpZXMgbG9hZGVkIGZyb20gdGhlIHJlbW90ZS5wcm9wZXJ0aWVzIGZpbGUuDQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uIGFkYXB0ZXIgbWlnaHQgdGhyb3cgYW55IGV4Y2VwdGlvbiBvbiBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2lsbCBhYm9ydCB0aGlzIGFkYXB0ZXIuDQorCSAqLw0KKwl2b2lkIGluaXQoIFByb3BlcnRpZXMgcHJvcCkgdGhyb3dzIEV4Y2VwdGlvbjsNCisNCisJLyoqDQorCSAqIFJ1biBhIHN1aXRlIHJlbW90ZWx5Lg0KKwkgKiBAcGFyYW0gc3VpdGUgdGhlIHN1aXRlIHRvIHNlbmQuDQorCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgY29ycmVzcG9uZGVkIGxpc3RlbmVyLCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gcmVzdWx0IGlzIHJlYWR5Lg0KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG1pZ2h0IGJlIHRocm93biBvbiBJTyBlcnJvci4NCisJICovDQorCXZvaWQgcnVuU3VpdGVzUmVtb3RlbHkoIFhtbFN1aXRlIHN1aXRlLCBSZW1vdGVSZXN1bHRMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uOw0KKw0KKwkvKioNCisJICogQSBibG9ja2luZyB3YWl0IGZvciB0aGUgcmVtb3RlIHJlc3VsdHMgdG8gcmV0dXJuLg0KKwkgKg0KKwkgKiBAcGFyYW0gdGltZW91dCB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGFsbCB0aGUgc3VpdGVzIHRvIHJldHVybiBhIHJlc3VsdC4NCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KKwkgKi8NCisJcHVibGljIHZvaWQgYXdhaXRUZXJtaW5hdGlvbihsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0lXb3JrZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL2FkYXB0ZXIvSVdvcmtlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ5NjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9hZGFwdGVyL0lXb3JrZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOw0KKw0KKy8qKg0KKyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgTWFzdGVyLVNsYXZlIHRyYW5zcG9ydCBhZGFwdGVyLg0KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIFNsYXZlIHRvIHB1bGwgc3VpdGVzIGFuZCByZXR1cm4gcmVzdWx0cy4NCisgKg0KKyAqIEBhdXRob3IJR3V5IEtvcmxhbmQNCisgKiBAc2luY2UgQXByaWwgOSwgMjAwNw0KKyAqIEBzZWUgSU1hc3RlckFkYXB0ZXINCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIElXb3JrZXJBZGFwdGVyDQorew0KKwkvKioNCisJICogSW5pdGlhbGl6ZXMgdGhlIHdvcmtlciBhZGFwdGVyLg0KKwkgKiBAcGFyYW0gcHJvcGVydGllcyBob2xkcyB0aGUgcHJvcGVydGllcyBsb2FkZWQgZnJvbSB0aGUgcmVtb3RlLnByb3BlcnRpZXMgZmlsZS4NCisJICogQHRocm93cyBFeGNlcHRpb24gYWRhcHRlciBtaWdodCB0aHJvdyBhbnkgZXhjZXB0aW9uIG9uIGluaXRpYWxpemF0aW9uLCB3aGljaCB3aWxsIGFib3J0IHRoaXMgYWRhcHRlci4NCisJICovDQorCXZvaWQgaW5pdCggUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB0aHJvd3MgRXhjZXB0aW9uOw0KKw0KKwkvKioNCisJICogQSBibG9ja2luZyBjYWxsIHRvIGdldCB0aGUgbmV4dCBTdWl0ZSB0byB0ZXN0Lg0KKwkgKiBAcGFyYW0gdGltZW91dCB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHN1aXRlLg0KKwkgKiBAcmV0dXJuIHRoZSBuZXh0IHN1aXRlIGF2YWxpYWJsZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdGltZW91dCBoYXMgcmVhY2hlZC4NCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBtaWdodCBiZSB0aHJvd24gb24gSU8gZXJyb3IuDQorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZy4NCisJICovDQorCVhtbFN1aXRlIGdldFN1aXRlKCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gYSBzdWl0ZSByZXN1bHQuDQorCSAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCB0byByZXR1cm4NCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBtaWdodCBiZSB0aHJvd24gb24gSU8gZXJyb3IuDQorCSAqLw0KKwl2b2lkIHJldHVyblJlc3VsdCggSVN1aXRlIHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL2FkYXB0ZXIvUmVtb3RlUmVzdWx0TGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvYWRhcHRlci9SZW1vdGVSZXN1bHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTU0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL2FkYXB0ZXIvUmVtb3RlUmVzdWx0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKg0KKyAqIEAoIylSZXN1bHRMaXN0ZW5lci5qYXZhICAgQXByIDksIDIwMDcNCisgKg0KKyAqIENvcHlyaWdodCAyMDA3IEdpZ2FTcGFjZXMgVGVjaG5vbG9naWVzIEluYy4NCisgKi8NCisNCitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLmFkYXB0ZXI7DQorDQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOw0KK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZVJlc3VsdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuU3VpdGVSdW5uZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlRlc3RIVE1MUmVwb3J0ZXI7DQorDQorLyoqDQorICogVGhpcyBsaXN0ZW5lciBpcyBjYWxsZWQgYnkgdGhlIHtAbGluayBJV29ya2VyQWRhcHRlcn0gaW1wbGVtZW50YXRpb24gd2hlbiBhIHJlbW90ZSB0ZXN0IHJlc3VsdCBpcyByZWFkeS4NCisgKg0KKyAqIEBhdXRob3IgR3V5IEtvcmxhbmQNCisgKiBAc2luY2UgQXByaWwgOSwgMjAwNw0KKyAqIEBzZWUgSVdvcmtlckFkYXB0ZXINCisgKi8NCitwdWJsaWMgY2xhc3MgUmVtb3RlUmVzdWx0TGlzdGVuZXINCit7DQorCS8qKg0KKwkgKiBIb2xkcyB0aGUgY29ycmVzcG9uZGVkIHtAbGluayBTdWl0ZVJ1bm5lcn0gZm9yIHRoZSBwcm9jZXNzZWQge0BsaW5rIG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlfS4NCisJICovDQorCWZpbmFsIHByaXZhdGUgU3VpdGVSdW5uZXIgbV9ydW5uZXI7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgZm9yIGFuIHtAbGluayBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZX0gcmVzdWx0Lg0KKwkgKiBAcGFyYW0gcnVubmVyIHRoZSBjb3JyZXNwb25kZWQge0BsaW5rIFN1aXRlUnVubmVyfQ0KKwkgKi8NCisJcHVibGljIFJlbW90ZVJlc3VsdExpc3RlbmVyKCBTdWl0ZVJ1bm5lciBydW5uZXIpDQorCXsNCisJCW1fcnVubmVyID0gcnVubmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBTaG91bGQgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgSVdvcmtlckFkYXB0ZXJ9IGltcGxlbWVudGF0aW9uIHdoZW4gYSByZW1vdGUgc3VpdGUgcmVzdWx0IGlzIHJlYWR5Lg0KKwkgKiBAcGFyYW0gcmVtb3RlU3VpdGVSdW5uZXIgcmVtb3RlIHJlc3VsdC4NCisJICovDQorCXB1YmxpYyB2b2lkIG9uUmVzdWx0KCBJU3VpdGUgcmVtb3RlU3VpdGVSdW5uZXIpDQorCXsNCisJCW1fcnVubmVyLnNldEhvc3QocmVtb3RlU3VpdGVSdW5uZXIuZ2V0SG9zdCgpKTsNCisJCU1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gdG1wUmVzdWx0cyA9IHJlbW90ZVN1aXRlUnVubmVyLmdldFJlc3VsdHMoKTsNCisJCU1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gc3VpdGVSZXN1bHRzID0gbV9ydW5uZXIuZ2V0UmVzdWx0cygpOw0KKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IGVudHJ5IDogdG1wUmVzdWx0cy5lbnRyeVNldCgpKQ0KKwkJew0KKwkJCUlTdWl0ZVJlc3VsdCBzdWl0ZVJlc3VsdCA9IGVudHJ5LmdldFZhbHVlKCk7DQorCQkJc3VpdGVSZXN1bHRzLnB1dChlbnRyeS5nZXRLZXkoKSwgc3VpdGVSZXN1bHQpOw0KKwkJCUlUZXN0Q29udGV4dCB0YyA9IHN1aXRlUmVzdWx0LmdldFRlc3RDb250ZXh0KCk7DQorCQkJVGVzdEhUTUxSZXBvcnRlci5nZW5lcmF0ZUxvZyh0YywgcmVtb3RlU3VpdGVSdW5uZXIuZ2V0SG9zdCgpLA0KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5uZXIuZ2V0T3V0cHV0RGlyZWN0b3J5KCksDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5nZXRGYWlsZWRDb25maWd1cmF0aW9ucygpLmdldEFsbFJlc3VsdHMoKSwNCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLmdldFNraXBwZWRDb25maWd1cmF0aW9ucygpLmdldEFsbFJlc3VsdHMoKSwNCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjLmdldFBhc3NlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpLA0KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMuZ2V0RmFpbGVkVGVzdHMoKS5nZXRBbGxSZXN1bHRzKCksDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5nZXRTa2lwcGVkVGVzdHMoKS5nZXRBbGxSZXN1bHRzKCksDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yy5nZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpKTsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0Fic3RyYWN0UmVtb3RlVGVzdFJ1bm5lckNsaWVudC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9BYnN0cmFjdFJlbW90ZVRlc3RSdW5uZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTE3MGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9BYnN0cmFjdFJlbW90ZVRlc3RSdW5uZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSnVsaWVuIFJ1YXV4OiBqcnVhdXhAb2N0by5jb20KKyAqICAgICBWaW5jZW50IE1hc3NvbDogdm1hc3NvbEBvY3RvLmNvbQorICoKKyAqIEFkYXB0ZWQgYnk6CisgKiAgICAgQWxleGFuZHJ1IFBvcGVzY3U6IHRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKKy8qKgorICogVGhlIGNsaWVudCBzaWRlIG9mIHRoZSBSZW1vdGVUZXN0UnVubmVyLiBIYW5kbGVzIHRoZQorICogbWFyc2hhbGluZyBvZiB0aGUgZGlmZmVyZW50IG1lc3NhZ2VzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW1vdGVUZXN0UnVubmVyQ2xpZW50IHsKKyAgLyoqCisgICAqIEFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBpbmZvcm1lZCBhYm91dCB0ZXN0IGV2ZW50cy4KKyAgICovCisgIHByb3RlY3RlZCBJUmVtb3RlU3VpdGVMaXN0ZW5lcltdIG1fc3VpdGVMaXN0ZW5lcnM7CisgIHByb3RlY3RlZCBJUmVtb3RlVGVzdExpc3RlbmVyW10gbV90ZXN0TGlzdGVuZXJzOworCisgIC8qKgorICAgKiBUaGUgc2VydmVyIHNvY2tldAorICAgKi8KKyAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgICAgICAgZlNlcnZlclNvY2tldDsKKyAgcHJpdmF0ZSBTb2NrZXQgICAgICAgICAgICAgZlNvY2tldDsKKyAgcHJpdmF0ZSBTZXJ2ZXJDb25uZWN0aW9uIG1fc2VydmVyQ29ubmVjdGlvbjsKKy8vICBwcml2YXRlIFByaW50V3JpdGVyICAgICAgICBtX291dHB1dFdyaXRlcjsKKy8vICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyICAgICBtX2lucHV0UmVhZGVyOworCisgIC8qKgorICAgKiBTdGFydCBsaXN0ZW5pbmcgdG8gYSB0ZXN0IHJ1bi4gU3RhcnQgYSBzZXJ2ZXIgY29ubmVjdGlvbiB0aGF0CisgICAqIHRoZSBSZW1vdGVUZXN0UnVubmVyIGNhbiBjb25uZWN0IHRvLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKElSZW1vdGVTdWl0ZUxpc3RlbmVyW10gc3VpdGVMaXN0ZW5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVtb3RlVGVzdExpc3RlbmVyW10gdGVzdExpc3RlbmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckNvbm5lY3Rpb24gc2VydmVyQ29ubmVjdGlvbikgeworICAgIG1fc3VpdGVMaXN0ZW5lcnM9IHN1aXRlTGlzdGVuZXJzOworICAgIG1fdGVzdExpc3RlbmVycz0gdGVzdExpc3RlbmVyczsKKyAgICBtX3NlcnZlckNvbm5lY3Rpb24gPSBzZXJ2ZXJDb25uZWN0aW9uOworCisgICAgc2VydmVyQ29ubmVjdGlvbi5zdGFydCgpOworICB9CisKKyAgcHVibGljIElSZW1vdGVTdWl0ZUxpc3RlbmVyW10gZ2V0U3VpdGVMaXN0ZW5lcnMoKSB7CisgICAgcmV0dXJuIG1fc3VpdGVMaXN0ZW5lcnM7CisgIH0KKworICBwdWJsaWMgSVJlbW90ZVRlc3RMaXN0ZW5lcltdIGdldFRlc3RMaXN0ZW5lcnMoKSB7CisgICAgcmV0dXJuIG1fdGVzdExpc3RlbmVyczsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7CisvLyAgICBpZihtX291dHB1dFdyaXRlciAhPSBudWxsKSB7CisvLyAgICAgIG1fb3V0cHV0V3JpdGVyLmNsb3NlKCk7CisvLyAgICAgIG1fb3V0cHV0V3JpdGVyID0gbnVsbDsKKy8vICAgIH0KKy8vICAgIHRyeSB7CisvLyAgICAgIGlmKG1faW5wdXRSZWFkZXIgIT0gbnVsbCkgeworLy8gICAgICAgIG1faW5wdXRSZWFkZXIuY2xvc2UoKTsKKy8vICAgICAgICBtX2lucHV0UmVhZGVyID0gbnVsbDsKKy8vICAgICAgfQorLy8gICAgfQorLy8gICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgeworLy8gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworLy8gICAgfQorICAgIHRyeSB7CisgICAgICBpZihmU29ja2V0ICE9IG51bGwpIHsKKyAgICAgICAgZlNvY2tldC5jbG9zZSgpOworICAgICAgICBmU29ja2V0ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGlmKGZTZXJ2ZXJTb2NrZXQgIT0gbnVsbCkgeworICAgICAgICBmU2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIGZTZXJ2ZXJTb2NrZXQgPSBudWxsOworICAgICAgfQorICAgIH0KKyAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICByZXR1cm4gbV9zZXJ2ZXJDb25uZWN0aW9uLmdldE1lc3NhZ2VTZW5kZXIoKSAhPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIFJlcXVlc3RzIHRvIHN0b3AgdGhlIHJlbW90ZSB0ZXN0IHJ1bi4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wVGVzdCgpIHsKKyAgICBpZihpc1J1bm5pbmcoKSkgeworICAgICAgbV9zZXJ2ZXJDb25uZWN0aW9uLmdldE1lc3NhZ2VTZW5kZXIoKS5zZW5kU3RvcCgpOworICAgICAgc2h1dGRvd24oKTsKKyAgICB9CisgIH0KKworLy8gIHByaXZhdGUgU3RyaW5nIHJlYWRNZXNzYWdlKEJ1ZmZlcmVkUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworLy8gICAgcmV0dXJuIGluLnJlYWRMaW5lKCk7CisvLyAgfQorLy8KKy8vICBwcml2YXRlIHZvaWQgcmVjZWl2ZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKy8vICAgIGludCBtZXNzYWdlVHlwZSA9IE1lc3NhZ2VIZWxwZXIuZ2V0TWVzc2FnZVR5cGUobWVzc2FnZSk7CisvLworLy8gICAgdHJ5IHsKKy8vICAgICAgaWYobWVzc2FnZVR5cGUgPCBNZXNzYWdlSGVscGVyLlNVSVRFKSB7CisvLyAgICAgICAgLy8gR2VuZXJpYyBtZXNzYWdlCisvLyAgICAgICAgR2VuZXJpY01lc3NhZ2UgZ20gPSBNZXNzYWdlSGVscGVyLnVubWFyc2hhbGxHZW5lcmljTWVzc2FnZShtZXNzYWdlKTsKKy8vICAgICAgICBub3RpZnlTdGFydChnbSk7CisvLyAgICAgIH0KKy8vICAgICAgZWxzZSBpZihtZXNzYWdlVHlwZSA8IE1lc3NhZ2VIZWxwZXIuVEVTVCkgeworLy8gICAgICAgIC8vIFN1aXRlIG1lc3NhZ2UKKy8vICAgICAgICBTdWl0ZU1lc3NhZ2Ugc20gPSBNZXNzYWdlSGVscGVyLmNyZWF0ZVN1aXRlTWVzc2FnZShtZXNzYWdlKTsKKy8vICAgICAgICBub3RpZnlTdWl0ZUV2ZW50cyhzbSk7CisvLyAgICAgIH0KKy8vICAgICAgZWxzZSBpZihtZXNzYWdlVHlwZSA8IE1lc3NhZ2VIZWxwZXIuVEVTVF9SRVNVTFQpIHsKKy8vICAgICAgICAvLyBUZXN0IG1lc3NhZ2UKKy8vICAgICAgICBUZXN0TWVzc2FnZSB0bSA9IE1lc3NhZ2VIZWxwZXIuY3JlYXRlVGVzdE1lc3NhZ2UobWVzc2FnZSk7CisvLyAgICAgICAgbm90aWZ5VGVzdEV2ZW50cyh0bSk7CisvLyAgICAgIH0KKy8vICAgICAgZWxzZSB7CisvLyAgICAgICAgLy8gVGVzdFJlc3VsdCBtZXNzYWdlCisvLyAgICAgICAgVGVzdFJlc3VsdE1lc3NhZ2UgdHJtID0gTWVzc2FnZUhlbHBlci51bm1hcnNoYWxsVGVzdFJlc3VsdE1lc3NhZ2UobWVzc2FnZSk7CisvLyAgICAgICAgbm90aWZ5UmVzdWx0RXZlbnRzKHRybSk7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIGZpbmFsbHkgeworLy8gICAgICBpZihpc1J1bm5pbmcoKSAmJiAobnVsbCAhPSBtX291dHB1dFdyaXRlcikpIHsKKy8vICAgICAgICBtX291dHB1dFdyaXRlci5wcmludGxuKE1lc3NhZ2VIZWxwZXIuQUNLX01TRyk7CisvLyAgICAgICAgbV9vdXRwdXRXcml0ZXIuZmx1c2goKTsKKy8vICAgICAgfQorLy8gICAgfQorLy8gIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBub3RpZnlTdGFydChmaW5hbCBHZW5lcmljTWVzc2FnZSBnZW5lcmljTWVzc2FnZSk7CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbm90aWZ5U3VpdGVFdmVudHMoZmluYWwgU3VpdGVNZXNzYWdlIHN1aXRlTWVzc2FnZSk7CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbm90aWZ5VGVzdEV2ZW50cyhmaW5hbCBUZXN0TWVzc2FnZSB0ZXN0TWVzc2FnZSk7CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbm90aWZ5UmVzdWx0RXZlbnRzKGZpbmFsIFRlc3RSZXN1bHRNZXNzYWdlIHRlc3RSZXN1bHRNZXNzYWdlKTsKKworCisgIC8qKgorICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBzdHJlYW0gZnJvbSB0aGUgUmVtb3RlVGVzdFJ1bm5lcgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckNvbm5lY3Rpb24gZXh0ZW5kcyBUaHJlYWQgeworICAgIHByaXZhdGUgTWVzc2FnZUh1YiBtX21lc3NhZ2VIdWI7CisKKyAgICBwdWJsaWMgU2VydmVyQ29ubmVjdGlvbihJTWVzc2FnZVNlbmRlciBtZXNzYWdlTWFyc2hhbGxlcikgeworICAgICAgc3VwZXIoIlRlc3RORyAtIFNlcnZlckNvbm5lY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgbV9tZXNzYWdlSHViID0gbmV3IE1lc3NhZ2VIdWIobWVzc2FnZU1hcnNoYWxsZXIpOworICAgIH0KKworICAgIElNZXNzYWdlU2VuZGVyIGdldE1lc3NhZ2VTZW5kZXIoKSB7CisgICAgICByZXR1cm4gbV9tZXNzYWdlSHViICE9IG51bGwgPyBtX21lc3NhZ2VIdWIuZ2V0TWVzc2FnZVNlbmRlcigpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gbV9tZXNzYWdlSHViLnJlY2VpdmVNZXNzYWdlKCk7CisgICAgICAgIHdoaWxlIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEdlbmVyaWNNZXNzYWdlKSB7CisgICAgICAgICAgICBub3RpZnlTdGFydCgoR2VuZXJpY01lc3NhZ2UpIG1lc3NhZ2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgU3VpdGVNZXNzYWdlKSB7CisgICAgICAgICAgICBub3RpZnlTdWl0ZUV2ZW50cygoU3VpdGVNZXNzYWdlKSBtZXNzYWdlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFRlc3RNZXNzYWdlKSB7CisgICAgICAgICAgICBub3RpZnlUZXN0RXZlbnRzKChUZXN0TWVzc2FnZSkgbWVzc2FnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBUZXN0UmVzdWx0TWVzc2FnZSkgeworICAgICAgICAgICAgbm90aWZ5UmVzdWx0RXZlbnRzKChUZXN0UmVzdWx0TWVzc2FnZSkgbWVzc2FnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiVW5rbm93biBtZXNzYWdlIHR5cGU6IiArIG1lc3NhZ2UpOworICAgICAgICAgIH0KKy8vICAgICAgICAgIGlmIChpc1J1bm5pbmcoKSkgeworLy8gICAgICAgICAgICBtX21lc3NhZ2VNYXJzaGFsbGVyLnNlbmRBY2soKTsKKy8vICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlID0gbV9tZXNzYWdlSHViLnJlY2VpdmVNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpbmFsbHkgeworICAgICAgICBtX21lc3NhZ2VIdWIuc2h1dERvd24oKTsKKyAgICAgICAgbV9tZXNzYWdlSHViID0gbnVsbDsKKyAgICAgIH0KKy8vICAgICAgdHJ5IHsKKy8vICAgICAgICBmU2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChmU2VydmVyUG9ydCk7CisvLyAgICAgICAgZlNvY2tldCA9IGZTZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisvLyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgIG1faW5wdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGZTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisvLyAgICAgICAgfQorLy8gICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworLy8gICAgICAgICAgbV9pbnB1dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZlNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7CisvLyAgICAgICAgfQorLy8gICAgICAgIHRyeSB7CisvLyAgICAgICAgICBtX291dHB1dFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksICJVVEYtOCIpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgeworLy8gICAgICAgICAgbV9vdXRwdXRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmU29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSwgdHJ1ZSk7CisvLyAgICAgICAgfQorLy8gICAgICAgIFN0cmluZyBtZXNzYWdlOworLy8gICAgICAgIHdoaWxlKChtX2lucHV0UmVhZGVyICE9IG51bGwpICYmICgobWVzc2FnZSA9IHJlYWRNZXNzYWdlKG1faW5wdXRSZWFkZXIpKSAhPSBudWxsKSkgeworLy8gICAgICAgICAgcmVjZWl2ZU1lc3NhZ2UobWVzc2FnZSk7CisvLyAgICAgICAgfQorLy8gICAgICB9CisvLyAgICAgIGNhdGNoKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgaGFuZGxlVGhyb3dhYmxlKGUpOworLy8gICAgICB9CisvLyAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICBoYW5kbGVUaHJvd2FibGUoZSk7CisvLyAgICAgIH0KKy8vICAgICAgZmluYWxseSB7CisvLyAgICAgICAgc2h1dGRvd24oKTsKKy8vICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVRocm93YWJsZShUaHJvd2FibGUgY2F1c2UpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvQmFzZU1lc3NhZ2VTZW5kZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvQmFzZU1lc3NhZ2VTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg2YmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9CYXNlTWVzc2FnZVNlbmRlci5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5yZW1vdGUuUmVtb3RlVGVzdE5HLmlzVmVyYm9zZTsKKworYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VNZXNzYWdlU2VuZGVyIGltcGxlbWVudHMgSU1lc3NhZ2VTZW5kZXIgeworICBwcml2YXRlIGJvb2xlYW4gbV9kZWJ1ZyA9IGZhbHNlOworICBwcm90ZWN0ZWQgU29ja2V0IG1fY2xpZW50U29ja2V0OworICBwcml2YXRlIFN0cmluZyBtX2hvc3Q7CisgIHByaXZhdGUgaW50IG1fcG9ydDsKKyAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtX2Fja0xvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1fcmVxdWVzdFN0b3BSZWNlaXZlcjsKKyAgLyoqIE91dGdvaW5nIG1lc3NhZ2Ugc3RyZWFtLiAqLworICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG1fb3V0U3RyZWFtOworICAvKiogVXNlZCB0byBzZW5kIEFDSyBhbmQgU1RPUCAqLworICBwcml2YXRlIFByaW50V3JpdGVyIG1fb3V0V3JpdGVyOworCisgIC8qKiBJbmNvbWluZyBtZXNzYWdlIHN0cmVhbS4gKi8KKyAgcHJvdGVjdGVkIHZvbGF0aWxlIElucHV0U3RyZWFtIG1faW5TdHJlYW07CisgIC8qKiBVc2VkIHRvIHJlY2VpdmUgQUNLIGFuZCBTVE9QICovCisgIHByb3RlY3RlZCB2b2xhdGlsZSBCdWZmZXJlZFJlYWRlciBtX2luUmVhZGVyOworCisgIHByaXZhdGUgUmVhZGVyVGhyZWFkIG1fcmVhZGVyVGhyZWFkOworICBwcml2YXRlIGJvb2xlYW4gbV9hY2s7CisvLyAgcHJvdGVjdGVkIElucHV0U3RyZWFtIG1fcmVjZWl2ZXJJbnB1dFN0cmVhbTsKKworICBwdWJsaWMgQmFzZU1lc3NhZ2VTZW5kZXIoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBib29sZWFuIGFjaykgeworICAgIG1faG9zdCA9IGhvc3Q7CisgICAgbV9wb3J0ID0gcG9ydDsKKyAgICBtX2FjayA9IGFjazsKKyAgfQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIGNvbm5lY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgVGVzdE5HRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBlc3RhYmxpc2hpbmcgdGhlIGNvbm5lY3Rpb24KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwKCJXYWl0aW5nIGZvciBFY2xpcHNlIGNsaWVudCBvbiAiICsgbV9ob3N0ICsgIjoiICsgbV9wb3J0KTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgbV9jbGllbnRTb2NrZXQgPSBuZXcgU29ja2V0KG1faG9zdCwgbV9wb3J0KTsKKyAgICAgICAgcCgiUmVjZWl2ZWQgYSBjb25uZWN0aW9uIGZyb20gRWNsaXBzZSBvbiAiICsgbV9ob3N0ICsgIjoiICsgbV9wb3J0KTsKKworICAgICAgICAvLyBPdXRwdXQgc3RyZWFtcworICAgICAgICBtX291dFN0cmVhbSA9IG1fY2xpZW50U29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBtX291dFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihtX291dFN0cmVhbSkpKTsKKworICAgICAgICAvLyBJbnB1dCBzdHJlYW1zCisgICAgICAgIG1faW5TdHJlYW0gPSBtX2NsaWVudFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgIG1faW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG1faW5TdHJlYW0sCisgICAgICAgICAgICAgICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVleCkgeworICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICBtX2luUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtX2luU3RyZWFtKSk7CisgICAgICAgIH0KKworICAgICAgICBwKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkLCBzdGFydGluZyByZWFkZXIgdGhyZWFkIik7CisgICAgICAgIG1fcmVhZGVyVGhyZWFkID0gbmV3IFJlYWRlclRocmVhZCgpOworICAgICAgICBtX3JlYWRlclRocmVhZC5zdGFydCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjYXRjaChDb25uZWN0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgIC8vIGlnbm9yZSBhbmQgcmV0cnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBUaHJlYWQuc2xlZXAoNDAwMCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaGFuZGxlZCkgeworICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2VuZEFkbWluTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgIG1fb3V0V3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgbV9vdXRXcml0ZXIuZmx1c2goKTsKKyAgfQorCisgIHByaXZhdGUgaW50IG1fc2VyaWFsID0gMDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZEFjaygpIHsKKyAgICBwKCJTZW5kaW5nIEFDSyAiICsgbV9zZXJpYWwpOworICAgIC8vIE5vdGU6IGFkZGluZyB0aGUgc2VyaWFsIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXNzYWdlIGNhdXNlcyBhIGxvY2sgdXAgaWYgaW50ZXJhY3RpbmcKKyAgICAvLyB3aXRoIFRlc3RORyA1LjE0IGFuZCBvbGRlciAocmVwb3J0ZWQgYnkgSmV0QnJhaW5zKS4gVGhlIGZvbGxvd2luZyBnaXQgY29tbWl0OgorICAgIC8vIDU3MzBiZGZiMzNlYzdhOGJmNDEwNDg1MmNkNGE1ZjI4NzViYTgyNjcKKyAgICAvLyBjaGFuZ2VkIGVxdWFscygpIHRvIHN0YXJ0c1dpdGgoKS4KKyAgICAvLyBJdCdzIG9rIHRvIGFkZCB0aGlzIHNlcmlhbCBiYWNrIGZvciBkZWJ1Z2dpbmcsIGJ1dCBkb24ndCBjb21taXQgaXQgdW50aWwgSmV0QnJhaW5zCisgICAgLy8gY29uZmlybXMgdGhleSBubyBsb25nZXIgbmVlZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggNS4xNC4KKyAgICBzZW5kQWRtaW5NZXNzYWdlKE1lc3NhZ2VIZWxwZXIuQUNLX01TRyk7IC8vICsgbV9zZXJpYWwrKyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZFN0b3AoKSB7CisgICAgc2VuZEFkbWluTWVzc2FnZShNZXNzYWdlSGVscGVyLlNUT1BfTVNHKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0UmVjZWl2ZXIoKSB0aHJvd3MgU29ja2V0VGltZW91dEV4Y2VwdGlvbiB7CisgICAgaWYgKG1faW5TdHJlYW0gIT0gbnVsbCkgeworICAgICAgcCgiUmVjZWl2ZXIgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgIH0KKyAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcCgiaW5pdFJlY2VpdmVyIG9uIHBvcnQgIiArIG1fcG9ydCk7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1fcG9ydCk7CisgICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KDUwMDApOworCisgICAgICBTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgIHdoaWxlICghbV9yZXF1ZXN0U3RvcFJlY2VpdmVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKG1fZGVidWcpIHsKKyAgICAgICAgICAgIHAoInBvbGxpbmcgdGhlIGNsaWVudCBjb25uZWN0aW9uIik7CisgICAgICAgICAgfQorICAgICAgICAgIHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAvLyBicmVhayB0aGUgbG9vcCBvbmNlIHRoZSBmaXJzdCBjbGllbnQgY29ubmVjdGVkCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwTCk7CisgICAgICAgICAgfQorICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgeworICAgICAgICBtX2luU3RyZWFtID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIG1faW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG1faW5TdHJlYW0pKTsKKyAgICAgICAgbV9vdXRTdHJlYW0gPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG1fb3V0V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobV9vdXRTdHJlYW0pKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2goU29ja2V0VGltZW91dEV4Y2VwdGlvbiBzdGUpIHsKKyAgICAgIHRocm93IHN0ZTsKKyAgICB9CisgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgY2xvc2VRdWlldGx5KHNlcnZlclNvY2tldCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc3RvcFJlY2VpdmVyKCkgeworICAgIG1fcmVxdWVzdFN0b3BSZWNlaXZlciA9IHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2h1dERvd24oKSB7CisgICAgY2xvc2VRdWlldGx5KG1fb3V0U3RyZWFtKTsKKyAgICBtX291dFN0cmVhbSA9IG51bGw7CisKKyAgICBpZiAobnVsbCAhPSBtX3JlYWRlclRocmVhZCkgeworICAgICAgbV9yZWFkZXJUaHJlYWQuaW50ZXJydXB0KCk7CisgICAgfQorCisgICAgY2xvc2VRdWlldGx5KG1faW5SZWFkZXIpOworICAgIG1faW5SZWFkZXIgPSBudWxsOworCisgICAgY2xvc2VRdWlldGx5KG1fY2xpZW50U29ja2V0KTsKKyAgICBtX2NsaWVudFNvY2tldCA9IG51bGw7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2xvc2VRdWlldGx5KENsb3NlYWJsZSBjKSB7CisgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBpZiAobV9kZWJ1ZykgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBtX2xhdGVzdEFjazsKKworICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yQWNrKCkgeworICAgIGlmIChtX2FjaykgeworICAgICAgdHJ5IHsKKyAgICAgICAgcCgiTWVzc2FnZSBzZW50LCB3YWl0aW5nIGZvciBBQ0suLi4iKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1fYWNrTG9jaykgeworICAgICAgICAgIG1fYWNrTG9jay53YWl0KCk7CisgICAgICAgIH0KKyAgICAgICAgcCgiLi4uIEFDSyByZWNlaXZlZDoiICsgbV9sYXRlc3RBY2spOworICAgICAgfQorICAgICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaGFuZGxlZCkgeworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcChTdHJpbmcgbXNnKSB7CisgICAgaWYgKGlzVmVyYm9zZSgpKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltCYXNlTWVzc2FnZVNlbmRlcl0gIiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZGVyIHRocmVhZCB0aGF0IHByb2Nlc3NlcyBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQuCisgICAqLworICBwcml2YXRlIGNsYXNzIFJlYWRlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICBwdWJsaWMgUmVhZGVyVGhyZWFkKCkgeworICAgICAgc3VwZXIoIlJlYWRlclRocmVhZCIpOyAvLyROT04tTkxTLTEkCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcCgiUmVhZGVyVGhyZWFkIHdhaXRpbmcgZm9yIGFuIGFkbWluIG1lc3NhZ2UiKTsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtX2luUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIHAoIlJlYWRlclRocmVhZCByZWNlaXZlZCBhZG1pbiBtZXNzYWdlOiIgKyBtZXNzYWdlKTsKKyAgICAgICAgd2hpbGUgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChtX2RlYnVnKSB7CisgICAgICAgICAgICBwKCJBZG1pbiBtZXNzYWdlOiIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgIH0KKyAgICAgICAgICBib29sZWFuIGFja25vd2xlZGdlID0gbWVzc2FnZS5zdGFydHNXaXRoKE1lc3NhZ2VIZWxwZXIuQUNLX01TRyk7CisgICAgICAgICAgYm9vbGVhbiBzdG9wID0gTWVzc2FnZUhlbHBlci5TVE9QX01TRy5lcXVhbHMobWVzc2FnZSk7CisgICAgICAgICAgaWYoYWNrbm93bGVkZ2UgfHwgc3RvcCkgeworICAgICAgICAgICAgaWYgKGFja25vd2xlZGdlKSB7CisgICAgICAgICAgICAgIHAoIlJlY2VpdmVkIEFDSzoiICsgbWVzc2FnZSk7CisgICAgICAgICAgICAgIG1fbGF0ZXN0QWNrID0gbWVzc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZChtX2Fja0xvY2spIHsKKyAgICAgICAgICAgICAgbV9hY2tMb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0b3ApIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAoIlJlY2VpdmVkIHVua25vd24gbWVzc2FnZTogJyIgKyBtZXNzYWdlICsgIiciKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZSA9IG1faW5SZWFkZXIgIT0gbnVsbCA/IG1faW5SZWFkZXIucmVhZExpbmUoKSA6IG51bGw7CisgICAgICAgIH0KKy8vICAgICAgICB3aGlsZSgobV9yZWFkZXIgIT0gbnVsbCkgJiYgKG1lc3NhZ2UgPSBtX3JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisvLyAgICAgICAgICBpZiAobV9kZWJ1ZykgeworLy8gICAgICAgICAgICBwKCJBZG1pbiBtZXNzYWdlOiIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAorLy8gICAgICAgICAgfQorLy8gICAgICAgICAgYm9vbGVhbiBhY2tub3dsZWRnZSA9IE1lc3NhZ2VIZWxwZXIuQUNLX01TRy5lcXVhbHMobWVzc2FnZSk7CisvLyAgICAgICAgICBib29sZWFuIHN0b3AgPSBNZXNzYWdlSGVscGVyLlNUT1BfTVNHLmVxdWFscyhtZXNzYWdlKTsKKy8vICAgICAgICAgIGlmKGFja25vd2xlZGdlIHx8IHN0b3ApIHsKKy8vICAgICAgICAgICAgc3luY2hyb25pemVkKG1fbG9jaykgeworLy8gICAgICAgICAgICAgIG1fbG9jay5ub3RpZnlBbGwoKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBpZiAoc3RvcCkgeworLy8gICAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgICAgfQorICAgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgIGlmIChpc1ZlcmJvc2UoKSkgeworICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9HZW5lcmljTWVzc2FnZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9HZW5lcmljTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzYTI3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0dlbmVyaWNNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworCisKKworLyoqCisgKiBBIGdlbmVyaWMgbWVzc2FnZSB0byBiZSB1c2VkIHdpdGggcmVtb3RlIGxpc3RlbmVycy4KKyAqIEl0IGlzIGRlc2NyaWJlZCBieSBhIHtAbGluayAjbV9tZXNzYWdlVHlwZX0gYW5kIGNhbiBjb250YWluIGEgPGNvZGU+TWFwPC9jb2RlPgorICogb3IgdmFsdWVzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1bYXRdZXZvbHZhW2RvdF1ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljTWVzc2FnZSBpbXBsZW1lbnRzIElTdHJpbmdNZXNzYWdlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQ0MDA3NDI4MTk1Mzc2MzU0NUw7CisvLyAgcHJvdGVjdGVkIE1hcCBtX3Byb3BlcnRpZXM7CisgIHByb3RlY3RlZCBmaW5hbCBpbnQgbV9tZXNzYWdlVHlwZTsKKyAgcHJpdmF0ZSBpbnQgbV9zdWl0ZUNvdW50OworCisgIHByaXZhdGUgaW50IG1fdGVzdENvdW50OworCisgIHB1YmxpYyBHZW5lcmljTWVzc2FnZShmaW5hbCBpbnQgdHlwZSkgeworICAgIG1fbWVzc2FnZVR5cGUgPSB0eXBlOworICB9CisKKyAgcHVibGljIGludCBnZXRTdWl0ZUNvdW50KCkgeworICAgIHJldHVybiBtX3N1aXRlQ291bnQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTdWl0ZUNvdW50KGludCBzdWl0ZUNvdW50KSB7CisgICAgbV9zdWl0ZUNvdW50ID0gc3VpdGVDb3VudDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VGVzdENvdW50KCkgeworICAgIHJldHVybiBtX3Rlc3RDb3VudDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRlc3RDb3VudChpbnQgdGVzdENvdW50KSB7CisgICAgbV90ZXN0Q291bnQgPSB0ZXN0Q291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlQXNTdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIGJ1Zi5hcHBlbmQobV9tZXNzYWdlVHlwZSk7CisgICAgYnVmLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikuYXBwZW5kKCJ0ZXN0Q291bnQiKS5hcHBlbmQoZ2V0VGVzdENvdW50KCkpCisgICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpLmFwcGVuZCgic3VpdGVDb3VudCIpLmFwcGVuZChnZXRTdWl0ZUNvdW50KCkpOworCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbR2VuZXJpY01lc3NhZ2Ugc3VpdGVDb3VudDoiICsgbV9zdWl0ZUNvdW50ICsgIiB0ZXN0Q291bnQ6IiArIG1fdGVzdENvdW50ICsgIl0iOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lNZXNzYWdlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2FlYWE0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBtZXNzYWdlcyBleGNoYW5nZWQgYmV0d2VlbiBSZW1vdGVUZXN0TkcgYW5kIGEgY2xpZW50LgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSU1lc3NhZ2VTZW5kZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSU1lc3NhZ2VTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM2YzUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9JTWVzc2FnZVNlbmRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlU2VuZGVyIHsKKworICB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEluaXRpYWxpemUgdGhlIHJlY2VpdmVyLgorICAgKiB0aGUgdW5kZXJseWluZyBzb2NrZXQgc2VydmVyIHdpbGwgYmUgcG9sbGluZyB1bnRpbCBhIGZpcnN0IGNsaWVudCBjb25uZWN0LgorICAgKgorICAgKiBAdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiBhIGNvbm5lY3Rpb24KKyAgICogdG8gdGhlIHJlbW90ZSBUZXN0TkcgaW5zdGFuY2UgY291bGQgbm90IGJlIGVzdGFibGlzaGVkIGFmdGVyIHRlbgorICAgKiBzZWNvbmRzLgorICAgKi8KKyAgdm9pZCBpbml0UmVjZWl2ZXIoKSB0aHJvd3MgU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogU3RvcCB0aGUgcmVjZWl2ZXIuCisgICAqIGl0IHByb3ZpZGVzIGEgd2F5IHRoYXQgYWxsb3cgdGhlIEFQSSBpbnZva2VyIHRvIHN0b3AgdGhlIHJlY2VpdmVyLAorICAgKiBlLmcuIGJyZWFrIGZyb20gYSBkZWFkIHdoaWxlIGxvb3AKKyAgICovCisgIHZvaWQgc3RvcFJlY2VpdmVyKCk7CisKKyAgdm9pZCBzZW5kTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBXaWxsIHJldHVybiBudWxsIG9yIHRocm93IEVPRkV4Y2VwdGlvbiB3aGVuIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHNldmVyZWQuCisgICAqLworICBJTWVzc2FnZSByZWNlaXZlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb247CisKKyAgdm9pZCBzaHV0RG93bigpOworCisgIC8vIFRoZXNlIHR3byBtZXRob2RzIHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIGNsYXNzIHNpbmNlIHRoZXkgc2hvdWxkIGFsbCBiZQorICAvLyB0aGUgc2FtZSBmb3IgaW1wbGVtZW50ZXJzIG9mIHRoaXMgaW50ZXJmYWNlLgorICB2b2lkIHNlbmRBY2soKTsKKworICB2b2lkIHNlbmRTdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lSZW1vdGVTdWl0ZUxpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lSZW1vdGVTdWl0ZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU5NzMwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSVJlbW90ZVN1aXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sOworCisKKworLyoqCisgKiBJbnRlcmZhY2UgcmVwbGljYXRpbmcgdGhlIDxjb2RlPklTdWl0ZUxpc3RlbmVyPC9jb2RlPiB1c2VkIGZvciByZW1vdGUgbGlzdGVuZXJzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1bYXRdZXZvbHZhW2RvdF1ybyc+QWxleGFuZHJ1IFBvcGVzY3U8L2E+CisgKiBAc2VlIG9yZy50ZXN0bmcuSVN1aXRlTGlzdGVuZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJUmVtb3RlU3VpdGVMaXN0ZW5lciB7CisgIC8qKgorICAgKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2Ygc3VpdGVzIHRvIGJlIHJ1bi4KKyAgICogVGhpcyBpcyBjYWxsZWQgb25jZSBiZWZvcmUgYWxsIHN1aXRlcy4KKyAgICoKKyAgICogQHBhcmFtIGdlbmVyaWNNZXNzYWdlIGEgbWVzc2FnZSBjb250YWluaW5nIHRoZSBudW1iZXIgb2Ygc3VpdGVzIHRoYXQgd2lsbCBiZSBydW4KKyAgICovCisgIHZvaWQgb25Jbml0aWFsaXphdGlvbihHZW5lcmljTWVzc2FnZSBnZW5lcmljTWVzc2FnZSk7CisKKyAgLyoqCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lciNvblN0YXJ0KG9yZy50ZXN0bmcuSVN1aXRlKQorICAgKgorICAgKiBAcGFyYW0gc3VpdGVNZXNzYWdlIHRoZSBzdWl0ZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzdWl0ZSB0byBiZSBydW4uCisgICAqLworICB2b2lkIG9uU3RhcnQoU3VpdGVNZXNzYWdlIHN1aXRlTWVzc2FnZSk7CisKKyAgLyoqCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lciNvbkZpbmlzaChvcmcudGVzdG5nLklTdWl0ZSkKKyAgICoKKyAgICogQHBhcmFtIHN1aXRlTWVzc2FnZSB0aGUgc3VpdGUgbWVzc2FnZSBjb250YWluaW5nIGluZm9zIGFib3V0IHRoZSBmaW5pc2hlZCBzdWl0ZS4KKyAgICovCisgIHZvaWQgb25GaW5pc2goU3VpdGVNZXNzYWdlIHN1aXRlTWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lSZW1vdGVUZXN0TGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSVJlbW90ZVRlc3RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlOTMyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL0lSZW1vdGVUZXN0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sOworCisKKworLyoqCisgKiBJbnRlcmZhY2UgcmVwbGljYXRpbmcgPGNvZGU+SVRlc3RMaXN0ZW5lcjwvY29kZT4gZm9yIHJlbW90ZSBsaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqIEBzZWUgb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVJlbW90ZVRlc3RMaXN0ZW5lciB7CisgIHZvaWQgb25TdGFydChUZXN0TWVzc2FnZSB0bSk7CisKKyAgdm9pZCBvbkZpbmlzaChUZXN0TWVzc2FnZSB0bSk7CisKKyAgdm9pZCBvblRlc3RTdGFydChUZXN0UmVzdWx0TWVzc2FnZSB0cm0pOworCisgIHZvaWQgb25UZXN0U3VjY2VzcyhUZXN0UmVzdWx0TWVzc2FnZSB0cm0pOworCisgIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UmVzdWx0TWVzc2FnZSB0cm0pOworCisgIHZvaWQgb25UZXN0U2tpcHBlZChUZXN0UmVzdWx0TWVzc2FnZSB0cm0pOworCisgIHZvaWQgb25UZXN0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UoVGVzdFJlc3VsdE1lc3NhZ2UgdHJtKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSVN0cmluZ01lc3NhZ2UuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvSVN0cmluZ01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTUwN2MxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9JU3RyaW5nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2w7CisKKworLyoqCisgKiBTdHJpbmcgYmFzZWQgcHJvdG9jb2wgbWFpbiBpbnRlcmZhY2UgdG8gYmUgdXNlZCB3aXRoIHJlbW90ZSBsaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBJU3RyaW5nTWVzc2FnZSBleHRlbmRzIElNZXNzYWdlIHsKKyAgU3RyaW5nIGdldE1lc3NhZ2VBc1N0cmluZygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9NZXNzYWdlSGVscGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL01lc3NhZ2VIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTM5NjAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9NZXNzYWdlSGVscGVyLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2w7CisKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisKKy8qKgorICogTWFyc2hhbC91bm1hcnNoYWwgdG9vbCBmb3IgPGNvZGU+SVN0cmluZ01lc3NhZ2U8L2NvZGU+cy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUhlbHBlciB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBERUxJTUlURVIgPSAnXHUwMDAxJzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFBBUkFNX0RFTElNSVRFUiA9ICdcdTAwMDQnOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExJTkVfU0VQX0RFTElNSVRFUl8xID0gJ1x1MDAwMic7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTElORV9TRVBfREVMSU1JVEVSXzIgPSAnXHUwMDAzJzsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX1NVSVRFX0NPVU5UID0gMTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUlURSA9IDEwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUlURV9TVEFSVCA9IDExOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUlURV9GSU5JU0ggPSAxMjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUID0gMTAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX1NUQVJUID0gMTAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0ZJTklTSCA9IDEwMjsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX1JFU1VMVCA9IDEwMDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NFRF9URVNUID0gVEVTVF9SRVNVTFQgKyBJVGVzdFJlc3VsdC5TVUNDRVNTOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMRURfVEVTVCA9IFRFU1RfUkVTVUxUICsgSVRlc3RSZXN1bHQuRkFJTFVSRTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0tJUFBFRF9URVNUID0gVEVTVF9SRVNVTFQgKyBJVGVzdFJlc3VsdC5TS0lQOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUlMRURfT05fUEVSQ0VOVEFHRV9URVNUID0gVEVTVF9SRVNVTFQgKyBJVGVzdFJlc3VsdC5TVUNDRVNTX1BFUkNFTlRBR0VfRkFJTFVSRTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9TVEFSVEVEID0gVEVTVF9SRVNVTFQgKyBJVGVzdFJlc3VsdC5TVEFSVEVEOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTVNHID0gIj5TVE9QIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNLX01TRyA9ICI+QUNLIjsKKworICBwdWJsaWMgc3RhdGljIGludCBnZXRNZXNzYWdlVHlwZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIGludCBpZHggPSBtZXNzYWdlLmluZGV4T2YoREVMSU1JVEVSKTsKKworICAgIHJldHVybiBpZHggPT0gLTEgPyBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2UpIDogSW50ZWdlci5wYXJzZUludChtZXNzYWdlLnN1YnN0cmluZygwLCBpZHgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgR2VuZXJpY01lc3NhZ2UgdW5tYXJzaGFsbEdlbmVyaWNNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgU3RyaW5nW10gbWVzc2FnZVBhcnRzID0gcGFyc2VNZXNzYWdlKG1lc3NhZ2UpOworICAgIGlmKG1lc3NhZ2VQYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgcmV0dXJuIG5ldyBHZW5lcmljTWVzc2FnZShJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1swXSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEdlbmVyaWNNZXNzYWdlIHJlc3VsdCA9IG5ldyBHZW5lcmljTWVzc2FnZShJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1swXSkpOworCisgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgbWVzc2FnZVBhcnRzLmxlbmd0aDsgaSs9MikgeworICAgICAgICBpZiAoInRlc3RDb3VudCIuZXF1YWxzKG1lc3NhZ2VQYXJ0c1tpXSkpIHsKKyAgICAgICAgICByZXN1bHQuc2V0VGVzdENvdW50KEludGVnZXIucGFyc2VJbnQobWVzc2FnZVBhcnRzW2kgKyAxXSkpOworICAgICAgICB9IGVsc2UgaWYgKCJzdWl0ZUNvdW50Ii5lcXVhbHMobWVzc2FnZVBhcnRzW2ldKSkgeworICAgICAgICAgIHJlc3VsdC5zZXRTdWl0ZUNvdW50KEludGVnZXIucGFyc2VJbnQobWVzc2FnZVBhcnRzW2kgKyAxXSkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBTdWl0ZU1lc3NhZ2UgY3JlYXRlU3VpdGVNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaW50IHR5cGUgPSBnZXRNZXNzYWdlVHlwZShtZXNzYWdlKTsKKyAgICBTdHJpbmdbXSBtZXNzYWdlUGFydHMgPSBwYXJzZU1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICBTdWl0ZU1lc3NhZ2UgcmVzdWx0ID0gbmV3IFN1aXRlTWVzc2FnZShtZXNzYWdlUGFydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUhlbHBlci5TVUlURV9TVEFSVCA9PSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQobWVzc2FnZVBhcnRzWzJdKSk7CisgICAgLy8gQW55IGV4Y2x1ZGVkIG1ldGhvZHM/CisgICAgaWYgKG1lc3NhZ2VQYXJ0cy5sZW5ndGggPiAzKSB7CisgICAgICBpbnQgY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1szXSk7CisgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGludCBpID0gNDsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgICAgbWV0aG9kcy5hZGQobWVzc2FnZVBhcnRzW2krK10pOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5zZXRFeGNsdWRlZE1ldGhvZHMobWV0aG9kcyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdE1lc3NhZ2UgY3JlYXRlVGVzdE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpbnQgdHlwZSA9IGdldE1lc3NhZ2VUeXBlKG1lc3NhZ2UpOworICAgIFN0cmluZ1tdIG1lc3NhZ2VQYXJ0cyA9IHBhcnNlTWVzc2FnZShtZXNzYWdlKTsKKworICAgIHJldHVybiBuZXcgVGVzdE1lc3NhZ2UoTWVzc2FnZUhlbHBlci5URVNUX1NUQVJUID09IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1szXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1s0XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1s1XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1s2XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1s3XSkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0UmVzdWx0TWVzc2FnZSB1bm1hcnNoYWxsVGVzdFJlc3VsdE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBTdHJpbmdbXSBtZXNzYWdlUGFydHMgPSBwYXJzZU1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICBTdHJpbmcgcGFyYW1ldGVyc0ZyYWdtZW50PSBudWxsOworICAgIFN0cmluZyBzdGFydFRpbWVzdGFtcEZyYWdtZW50PSBudWxsOworICAgIFN0cmluZyBzdG9wVGltZXN0YW1wRnJhZ21lbnQ9IG51bGw7CisgICAgU3RyaW5nIHN0YWNrVHJhY2VGcmFnbWVudD0gbnVsbDsKKyAgICBTdHJpbmcgdGVzdERlc2NyaXB0b3I9IG51bGw7CisgICAgc3dpdGNoKG1lc3NhZ2VQYXJ0cy5sZW5ndGgpIHsKKyAgICAgIGNhc2UgMTA6CisgICAgICB7CisgICAgICAgIHBhcmFtZXRlcnNGcmFnbWVudD0gbWVzc2FnZVBhcnRzWzVdOworICAgICAgICBzdGFydFRpbWVzdGFtcEZyYWdtZW50PSBtZXNzYWdlUGFydHNbNl07CisgICAgICAgIHN0b3BUaW1lc3RhbXBGcmFnbWVudD0gbWVzc2FnZVBhcnRzWzddOworICAgICAgICBzdGFja1RyYWNlRnJhZ21lbnQ9IG1lc3NhZ2VQYXJ0c1s4XTsKKyAgICAgICAgdGVzdERlc2NyaXB0b3I9IG1lc3NhZ2VQYXJ0c1s5XTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgY2FzZSA5OgorICAgICAgeworICAgICAgICBwYXJhbWV0ZXJzRnJhZ21lbnQ9IG1lc3NhZ2VQYXJ0c1s1XTsKKyAgICAgICAgc3RhcnRUaW1lc3RhbXBGcmFnbWVudD0gbWVzc2FnZVBhcnRzWzZdOworICAgICAgICBzdG9wVGltZXN0YW1wRnJhZ21lbnQ9IG1lc3NhZ2VQYXJ0c1s3XTsKKyAgICAgICAgc3RhY2tUcmFjZUZyYWdtZW50PSBtZXNzYWdlUGFydHNbOF07CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIC8vIEhJTlQ6IG9sZCBwcm90b2NvbCB3aXRob3V0IHBhcmFtZXRlcnMKKyAgICAgICAgcGFyYW1ldGVyc0ZyYWdtZW50PSBudWxsOworICAgICAgICBzdGFydFRpbWVzdGFtcEZyYWdtZW50PSBtZXNzYWdlUGFydHNbNV07CisgICAgICAgIHN0b3BUaW1lc3RhbXBGcmFnbWVudD0gbWVzc2FnZVBhcnRzWzZdOworICAgICAgICBzdGFja1RyYWNlRnJhZ21lbnQ9IG1lc3NhZ2VQYXJ0c1s3XTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBUZXN0UmVzdWx0TWVzc2FnZShJbnRlZ2VyLnBhcnNlSW50KG1lc3NhZ2VQYXJ0c1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFydHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlQXNjaWlDaGFyYWN0ZXJzV2l0aFVuaWNvZGUocmVwbGFjZU5ld0xpbmVSZXBsYWNlcih0ZXN0RGVzY3JpcHRvcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUFzY2lpQ2hhcmFjdGVyc1dpdGhVbmljb2RlKHJlcGxhY2VOZXdMaW5lUmVwbGFjZXIodGVzdERlc2NyaXB0b3IpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGFyYW1ldGVycyhwYXJhbWV0ZXJzRnJhZ21lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcoc3RhcnRUaW1lc3RhbXBGcmFnbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhzdG9wVGltZXN0YW1wRnJhZ21lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUFzY2lpQ2hhcmFjdGVyc1dpdGhVbmljb2RlKHJlcGxhY2VOZXdMaW5lUmVwbGFjZXIoc3RhY2tUcmFjZUZyYWdtZW50KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwIC8qIGludm9jYXRpb24gY291bnRzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwcm90b2NvbCAqLworICAgICAgICAgICAgKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VOZXdMaW5lKFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYobnVsbCA9PSBtZXNzYWdlKSB7CisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCdcbicsIExJTkVfU0VQX0RFTElNSVRFUl8xKS5yZXBsYWNlKCdccicsIExJTkVfU0VQX0RFTElNSVRFUl8yKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VVbmljb2RlQ2hhcmFjdGVyc1dpdGhBc2NpaShTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmKG51bGwgPT0gbWVzc2FnZSkgeworICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcmV0dXJuIHJlcGxhY2UoCisgICAgICAgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICAgICAgICByZXBsYWNlKAorICAgICAgICAgICAgICAgICAgICByZXBsYWNlKG1lc3NhZ2UsICJcdTAwMDQiLCAiXFx1MDAwNCIpLAorICAgICAgICAgICAgICAgICAgIlx1MDAwMyIsICJcXHUwMDAzIiksCisgICAgICAgICAgICAgICJcdTAwMDIiLCAiXFx1MDAwMiIpLAorICAgICAgICAgICAiXHUwMDAxIiwgIlxcdTAwMDEiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBc2NpaUNoYXJhY3RlcnNXaXRoVW5pY29kZShTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmKG51bGwgPT0gbWVzc2FnZSkgeworICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcmV0dXJuIHJlcGxhY2UoCisgICAgICAgICAgICByZXBsYWNlKAorICAgICAgICAgICAgICAgIHJlcGxhY2UoCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UobWVzc2FnZSwgIlxcdTAwMDQiLCAiXHUwMDA0IiksCisgICAgICAgICAgICAgICAgICAgICJcXHUwMDAzIiwgIlx1MDAwMyIpLAorICAgICAgICAgICAgICAgICJcXHUwMDAyIiwgIlx1MDAwMiIpLAorICAgICAgICAgICAgIlxcdTAwMDEiLCAiXHUwMDAxIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlTmV3TGluZVJlcGxhY2VyKFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYobnVsbCA9PSBtZXNzYWdlKSB7CisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKExJTkVfU0VQX0RFTElNSVRFUl8xLCAnXG4nKS5yZXBsYWNlKExJTkVfU0VQX0RFTElNSVRFUl8yLCAnXHInKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHBhcnNlUGFyYW1ldGVycyhmaW5hbCBTdHJpbmcgbWVzc2FnZVBhcnQpIHsKKyAgICByZXR1cm4gdG9rZW5pemUobWVzc2FnZVBhcnQsIFBBUkFNX0RFTElNSVRFUik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBwYXJzZU1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICByZXR1cm4gdG9rZW5pemUobWVzc2FnZSwgREVMSU1JVEVSKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBjaGFyIHNlcGFyYXRvcikgeworICAgIGlmKG51bGwgPT0gbWVzc2FnZSkgeworICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IHRva2VucyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGludCBzdGFydCA9IDA7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG1lc3NhZ2UubGVuZ3RoKCk7IGkrKykgeworICAgICAgaWYoc2VwYXJhdG9yID09IG1lc3NhZ2UuY2hhckF0KGkpKSB7CisgICAgICAgIHRva2Vucy5hZGQobWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKKyAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoc3RhcnQgPCBtZXNzYWdlLmxlbmd0aCgpKSB7CisgICAgICB0b2tlbnMuYWRkKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0LCBtZXNzYWdlLmxlbmd0aCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRva2Vucy50b0FycmF5KG5ldyBTdHJpbmdbdG9rZW5zLnNpemUoKV0pOworICB9CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBKREs1IFN0cmluZy5yZXBsYWNlKENoYXJTZXF1ZW5jZSxDaGFyU2VxdWVuY2UpCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVwbGFjZShTdHJpbmcgb3JpZ2luYWwsIENoYXJTZXF1ZW5jZSB0YXJnZXQsIENoYXJTZXF1ZW5jZSByZXBsYWNlbWVudCkgeworICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZSh0YXJnZXQudG9TdHJpbmcoKSwgUGF0dGVybi5MSVRFUkFMKS5tYXRjaGVyKG9yaWdpbmFsKQorICAgICAgICAgIC5yZXBsYWNlQWxsKHF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQudG9TdHJpbmcoKSkpOworICB9CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBKREs1IFN0cmluZy5yZXBsYWNlKENoYXJTZXF1ZW5jZSxDaGFyU2VxdWVuY2UpCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVvdGVSZXBsYWNlbWVudChTdHJpbmcgcykgeworICAgICAgaWYgKChzLmluZGV4T2YoJ1xcJykgPT0gLTEpICYmIChzLmluZGV4T2YoJyQnKSA9PSAtMSkpIHsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgICB9CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJyk7IHNiLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyQnKSB7CisgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXFwnKTsgc2IuYXBwZW5kKCckJyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL01lc3NhZ2VIdWIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvTWVzc2FnZUh1Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwZjJhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL01lc3NhZ2VIdWIuamF2YQpAQCAtMCwwICsxLDc5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5SZW1vdGVUZXN0Tkc7CisKKy8qKgorICogQ2VudHJhbCBjbGFzcyB0byBjb25uZWN0IHRvIHRoZSBob3N0IGFuZCBzZW5kIG1lc3NhZ2UuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlSHViIHsKKworICBwcml2YXRlIGJvb2xlYW4gbV9kZWJ1ZyA9IGZhbHNlOworCisgIHByaXZhdGUgSU1lc3NhZ2VTZW5kZXIgbV9tZXNzYWdlU2VuZGVyOworCisgIHB1YmxpYyBNZXNzYWdlSHViKElNZXNzYWdlU2VuZGVyIG1lc3NhZ2VTZW5kZXIpIHsKKyAgICBtX21lc3NhZ2VTZW5kZXIgPSBtZXNzYWdlU2VuZGVyOworICB9CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgY29ubmVjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBUZXN0TkdFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGVzdGFibGlzaGluZyB0aGUgY29ubmVjdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbV9tZXNzYWdlU2VuZGVyLmNvbm5lY3QoKTsKKyAgfQorCisgIC8qKgorICAgKiBTaHV0c2Rvd24gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSB0ZXN0IGxpc3RlbmVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2h1dERvd24oKSB7CisgICAgbV9tZXNzYWdlU2VuZGVyLnNodXREb3duKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIG1fbWVzc2FnZVNlbmRlci5zZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgSU1lc3NhZ2UgcmVjZWl2ZU1lc3NhZ2UoKSB7CisgICAgSU1lc3NhZ2UgcmVzdWx0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gbV9tZXNzYWdlU2VuZGVyLnJlY2VpdmVNZXNzYWdlKCk7CisgICAgICBtX21lc3NhZ2VTZW5kZXIuc2VuZEFjaygpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwKFN0cmluZyBtc2cpIHsKKyAgICBpZiAoUmVtb3RlVGVzdE5HLmlzVmVyYm9zZSgpKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTdHJpbmdNZXNzYWdlU2VuZGVySGVscGVyXSAiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KKyAgfQorCisKKyAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgeworICAgIG1fZGVidWcgPSBkZWJ1ZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGluaXRSZWNlaXZlcigpIHRocm93cyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICBtX21lc3NhZ2VTZW5kZXIuaW5pdFJlY2VpdmVyKCk7CisgIH0KKworICBwdWJsaWMgSU1lc3NhZ2VTZW5kZXIgZ2V0TWVzc2FnZVNlbmRlcigpIHsKKyAgICByZXR1cm4gbV9tZXNzYWdlU2VuZGVyOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1JlbW90ZVRlc3RMaXN0ZW5lci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9SZW1vdGVUZXN0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTMwMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9SZW1vdGVUZXN0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JUmVzdWx0TGlzdGVuZXIyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKKy8qKgorICogQSBzcGVjaWFsIGxpc3RlbmVyIHRoYXQgcmVtb3RlIHRoZSBldmVudCB3aXRoIHN0cmluZyBwcm90b2NvbC4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlVGVzdExpc3RlbmVyIGltcGxlbWVudHMgSVJlc3VsdExpc3RlbmVyMiB7CisgIHByaXZhdGUgZmluYWwgTWVzc2FnZUh1YiBtX3NlbmRlcjsKKyAgcHJpdmF0ZSBJU3VpdGUgbV9zdWl0ZTsKKyAgcHJpdmF0ZSBYbWxUZXN0IG1feG1sVGVzdDsKKyAgcHJpdmF0ZSBJVGVzdENvbnRleHQgbV9jdXJyZW50VGVzdENvbnRleHQ7CisKKyAgcHVibGljIFJlbW90ZVRlc3RMaXN0ZW5lcihJU3VpdGUgc3VpdGUsIFhtbFRlc3QgdGVzdCwgTWVzc2FnZUh1YiBtc2gpIHsKKyAgICBtX3NlbmRlciA9IG1zaDsKKyAgICBtX3N1aXRlPSBzdWl0ZTsKKyAgICBtX3htbFRlc3Q9IHRlc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TdGFydChJVGVzdENvbnRleHQgdGVzdEN0eCkgeworICAgIG1fY3VycmVudFRlc3RDb250ZXh0ID0gdGVzdEN0eDsKKyAgICBtX3NlbmRlci5zZW5kTWVzc2FnZShuZXcgVGVzdE1lc3NhZ2UodGVzdEN0eCwgdHJ1ZSAvKnN0YXJ0Ki8pKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgdGVzdEN0eCkgeworICAgIG1fc2VuZGVyLnNlbmRNZXNzYWdlKG5ldyBUZXN0TWVzc2FnZSh0ZXN0Q3R4LCBmYWxzZSAvKmVuZCovKSk7CisgICAgbV9jdXJyZW50VGVzdENvbnRleHQgPSBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBUZXN0UmVzdWx0TWVzc2FnZSB0cm09IG51bGw7CisKKyAgICBpZiAobnVsbCA9PSBtX2N1cnJlbnRUZXN0Q29udGV4dCkgeworICAgICAgdHJtPSBuZXcgVGVzdFJlc3VsdE1lc3NhZ2UobV9zdWl0ZS5nZXROYW1lKCksIG1feG1sVGVzdC5nZXROYW1lKCksIHRlc3RSZXN1bHQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRybT0gbmV3IFRlc3RSZXN1bHRNZXNzYWdlKG1fY3VycmVudFRlc3RDb250ZXh0LCB0ZXN0UmVzdWx0KTsKKyAgICB9CisKKyAgICBtX3NlbmRlci5zZW5kTWVzc2FnZSh0cm0pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb24oSVRlc3RSZXN1bHQgdHIpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgaWYgKG51bGwgPT0gbV9jdXJyZW50VGVzdENvbnRleHQpIHsKKyAgICAgIG1fc2VuZGVyLnNlbmRNZXNzYWdlKG5ldyBUZXN0UmVzdWx0TWVzc2FnZShtX3N1aXRlLmdldE5hbWUoKSwgbV94bWxUZXN0LmdldE5hbWUoKSwgdGVzdFJlc3VsdCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fc2VuZGVyLnNlbmRNZXNzYWdlKG5ldyBUZXN0UmVzdWx0TWVzc2FnZShtX2N1cnJlbnRUZXN0Q29udGV4dCwgdGVzdFJlc3VsdCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBpZiAobnVsbCA9PSBtX2N1cnJlbnRUZXN0Q29udGV4dCkgeworICAgICAgbV9zZW5kZXIuc2VuZE1lc3NhZ2UobmV3IFRlc3RSZXN1bHRNZXNzYWdlKG1fc3VpdGUuZ2V0TmFtZSgpLCBtX3htbFRlc3QuZ2V0TmFtZSgpLCB0ZXN0UmVzdWx0KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbV9zZW5kZXIuc2VuZE1lc3NhZ2UobmV3IFRlc3RSZXN1bHRNZXNzYWdlKG1fY3VycmVudFRlc3RDb250ZXh0LCB0ZXN0UmVzdWx0KSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIGlmIChudWxsID09IG1fY3VycmVudFRlc3RDb250ZXh0KSB7CisgICAgICBtX3NlbmRlci5zZW5kTWVzc2FnZShuZXcgVGVzdFJlc3VsdE1lc3NhZ2UobV9zdWl0ZS5nZXROYW1lKCksIG1feG1sVGVzdC5nZXROYW1lKCksIHRlc3RSZXN1bHQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtX3NlbmRlci5zZW5kTWVzc2FnZShuZXcgVGVzdFJlc3VsdE1lc3NhZ2UobV9jdXJyZW50VGVzdENvbnRleHQsIHRlc3RSZXN1bHQpKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgaWYgKG51bGwgPT0gbV9jdXJyZW50VGVzdENvbnRleHQpIHsKKyAgICAgIG1fc2VuZGVyLnNlbmRNZXNzYWdlKG5ldyBUZXN0UmVzdWx0TWVzc2FnZShtX3N1aXRlLmdldE5hbWUoKSwgbV94bWxUZXN0LmdldE5hbWUoKSwgdGVzdFJlc3VsdCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fc2VuZGVyLnNlbmRNZXNzYWdlKG5ldyBUZXN0UmVzdWx0TWVzc2FnZShtX2N1cnJlbnRUZXN0Q29udGV4dCwgdGVzdFJlc3VsdCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAc2VlIG9yZy50ZXN0bmcuSUNvbmZpZ3VyYXRpb25MaXN0ZW5lciNvbkNvbmZpZ3VyYXRpb25GYWlsdXJlKG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uRmFpbHVyZShJVGVzdFJlc3VsdCBpdHIpIHsKKyAgICAvLyBTaG93IGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgaW4gdGhlIG1haW4gdmlldyBmb3IgY29udmVuaWVuY2UKKyAgICBvblRlc3RGYWlsdXJlKGl0cik7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uU2tpcChvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblNraXAoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgb25UZXN0U2tpcHBlZChpdHIpOworICB9CisKKyAgLyoqCisgICAqIEBzZWUgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyI29uQ29uZmlndXJhdGlvblN1Y2Nlc3Mob3JnLnRlc3RuZy5JVGVzdFJlc3VsdCkKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25TdWNjZXNzKElUZXN0UmVzdWx0IGl0cikgeworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TZXJpYWxpemVkTWVzc2FnZVNlbmRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TZXJpYWxpemVkTWVzc2FnZVNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNmRjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1NlcmlhbGl6ZWRNZXNzYWdlU2VuZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLlJlbW90ZVRlc3RORzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKKworCitwdWJsaWMgY2xhc3MgU2VyaWFsaXplZE1lc3NhZ2VTZW5kZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZVNlbmRlciB7CisKKyAgcHVibGljIFNlcmlhbGl6ZWRNZXNzYWdlU2VuZGVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgeworICAgIHN1cGVyKGhvc3QsIHBvcnQsIGZhbHNlIC8qIG5vIGFjayAqLyk7CisgIH0KKworICBwdWJsaWMgU2VyaWFsaXplZE1lc3NhZ2VTZW5kZXIoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBib29sZWFuIGFjaykgeworICAgIHN1cGVyKGhvc3QsIHBvcnQsIGFjayk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoSU1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzeW5jaHJvbml6ZWQobV9vdXRTdHJlYW0pIHsKKyAgICAgIHAoIlNlbmRpbmcgbWVzc2FnZSAiICsgbWVzc2FnZSk7CisgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShtX291dFN0cmVhbSk7CisgICAgICBvb3Mud3JpdGVPYmplY3QobWVzc2FnZSk7CisgICAgICBvb3MuZmx1c2goKTsKKworICAgICAgd2FpdEZvckFjaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSU1lc3NhZ2UgcmVjZWl2ZU1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgSU1lc3NhZ2UgcmVzdWx0ID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW9zID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG1faW5TdHJlYW0pOworLy8gICAgICBzeW5jaHJvbml6ZWQobV9pbnB1dCkgeworICAgICAgICByZXN1bHQgPSAoSU1lc3NhZ2UpIGlvcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIHAoIlJlY2VpdmVkIG1lc3NhZ2UgIiArIHJlc3VsdCk7CisvLyAgICAgICAgc2VuZEFjaygpOworLy8gICAgICB9CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgaWYgKFJlbW90ZVRlc3RORy5pc1ZlcmJvc2UoKSkgeworICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoUmVtb3RlVGVzdE5HLmlzVmVyYm9zZSgpKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTZXJpYWxpemVkTWVzc2FnZVNlbmRlcl0gIiArIHMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TdHJpbmdNZXNzYWdlU2VuZGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1N0cmluZ01lc3NhZ2VTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTI0ZWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TdHJpbmdNZXNzYWdlU2VuZGVyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2w7CisKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5SZW1vdGVUZXN0Tkc7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFN0cmluZ01lc3NhZ2VTZW5kZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZVNlbmRlciB7CisKKyAgcHJpdmF0ZSBQcmludFdyaXRlciB3cml0ZXI7CisKKyAgcHVibGljIFN0cmluZ01lc3NhZ2VTZW5kZXIoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CisgICAgc3VwZXIoaG9zdCwgcG9ydCwgZmFsc2UgLyogbm8gYWNrICovKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmdNZXNzYWdlU2VuZGVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgYm9vbGVhbiBhY2spIHsKKyAgICBzdXBlcihob3N0LCBwb3J0LCBhY2spOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAobV9vdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJ5aW5nIHRvIHNlbmQgYSBtZXNzYWdlIG9uIGEgc2h1dGRvd24gc2VuZGVyIik7CisgICAgfQorICAgIGlmICh3cml0ZXIgPT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobV9vdXRTdHJlYW0sICJVVEYtOCIpKSwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZmFsc2UgLyogYXV0b2ZsdXNoICovKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobV9vdXRTdHJlYW0pKSwKKyAgICAgICAgICAgIGZhbHNlIC8qIGF1dG9mbHVzaCAqLyk7CisgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1zZyA9ICgoSVN0cmluZ01lc3NhZ2UpIG1lc3NhZ2UpLmdldE1lc3NhZ2VBc1N0cmluZygpOworICAgIGlmIChSZW1vdGVUZXN0TkcuaXNWZXJib3NlKCkpIHsKKyAgICAgIHAoIlNlbmRpbmcgbWVzc2FnZToiICsgbWVzc2FnZSk7CisgICAgICBwKCIgIFN0cmluZyB2ZXJzaW9uOiIgKyBtc2cpOworCisgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1zZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGlmKCdcdTAwMDEnID09IG1zZy5jaGFyQXQoaSkpIHsKKyAgICAgICAgICBwKCIgIHdvcmQ6WyIgKyBidWYudG9TdHJpbmcoKSArICJdIik7CisgICAgICAgICAgYnVmLmRlbGV0ZSgwLCBidWYubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGJ1Zi5hcHBlbmQobXNnLmNoYXJBdChpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHAoIiAgd29yZDpbIiArIGJ1Zi50b1N0cmluZygpICsgIl0iKTsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQobV9hY2tMb2NrKSB7CisgICAgICB3cml0ZXIucHJpbnRsbihtc2cpOworICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICB3YWl0Rm9yQWNrKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwKFN0cmluZyBtc2cpIHsKKyAgICBpZiAoUmVtb3RlVGVzdE5HLmlzVmVyYm9zZSgpKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTdHJpbmdNZXNzYWdlU2VuZGVyXSAiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSU1lc3NhZ2UgcmVjZWl2ZU1lc3NhZ2UoKSB7CisgICAgSU1lc3NhZ2UgcmVzdWx0ID0gbnVsbDsKKworICAgIGlmIChtX2luUmVhZGVyID09IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG1faW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG1faW5TdHJlYW0sICJVVEYtOCIpKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICBtX2luUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtX2luU3RyZWFtKSk7CisgICAgICB9CisgICAgfQorICAgIHRyeSB7CisvLyAgICAgIHRyeSB7CisvLyAgICAgICAgbV9vdXRwdXRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmU29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCAiVVRGLTgiKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworLy8gICAgICB9CisvLyAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKKy8vICAgICAgICBtX291dHB1dFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpLCB0cnVlKTsKKy8vICAgICAgfQorICAgICAgcmVzdWx0ID0gcmVjZWl2ZU1lc3NhZ2UobV9pblJlYWRlci5yZWFkTGluZSgpKTsKKyAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGhhbmRsZVRocm93YWJsZShlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworLy8gICAgZmluYWxseSB7CisvLyAgICAgIHNodXREb3duKCk7CisvLyAgICAgIHJldHVybiBudWxsOworLy8gICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVGhyb3dhYmxlKFRocm93YWJsZSBjYXVzZSkgeworICAgIGlmIChSZW1vdGVUZXN0TkcuaXNWZXJib3NlKCkpIHsKKyAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorCisvLyAgcHJpdmF0ZSBTdHJpbmcgcmVhZE1lc3NhZ2UoQnVmZmVyZWRSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisvLyAgICByZXR1cm4gaW4ucmVhZExpbmUoKTsKKy8vICB9CisKKyAgcHJpdmF0ZSBJTWVzc2FnZSByZWNlaXZlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHJldHVybiBudWxsOworICAgIElNZXNzYWdlIHJlc3VsdCA9IG51bGw7CisKKyAgICBpbnQgbWVzc2FnZVR5cGUgPSBNZXNzYWdlSGVscGVyLmdldE1lc3NhZ2VUeXBlKG1lc3NhZ2UpOworCisvLyAgICB0cnkgeworICAgICAgaWYobWVzc2FnZVR5cGUgPCBNZXNzYWdlSGVscGVyLlNVSVRFKSB7CisgICAgICAgIC8vIEdlbmVyaWMgbWVzc2FnZQorICAgICAgICByZXN1bHQgPSBNZXNzYWdlSGVscGVyLnVubWFyc2hhbGxHZW5lcmljTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobWVzc2FnZVR5cGUgPCBNZXNzYWdlSGVscGVyLlRFU1QpIHsKKyAgICAgICAgLy8gU3VpdGUgbWVzc2FnZQorICAgICAgICByZXN1bHQgPSBNZXNzYWdlSGVscGVyLmNyZWF0ZVN1aXRlTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobWVzc2FnZVR5cGUgPCBNZXNzYWdlSGVscGVyLlRFU1RfUkVTVUxUKSB7CisgICAgICAgIC8vIFRlc3QgbWVzc2FnZQorICAgICAgICByZXN1bHQgPSBNZXNzYWdlSGVscGVyLmNyZWF0ZVRlc3RNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFRlc3RSZXN1bHQgbWVzc2FnZQorICAgICAgICByZXN1bHQgPSBNZXNzYWdlSGVscGVyLnVubWFyc2hhbGxUZXN0UmVzdWx0TWVzc2FnZShtZXNzYWdlKTsKKyAgICAgIH0KKy8vICAgIH0KKy8vICAgIGZpbmFsbHkgeworLy8gICAgICBpZihpc1J1bm5pbmcoKSAmJiAobnVsbCAhPSBtX291dHB1dFdyaXRlcikpIHsKKy8vICAgICAgICBtX291dHB1dFdyaXRlci5wcmludGxuKE1lc3NhZ2VIZWxwZXIuQUNLX01TRyk7CisvLyAgICAgICAgbV9vdXRwdXRXcml0ZXIuZmx1c2goKTsKKy8vICAgICAgfQorLy8gICAgfQorCisgICAgcCgicmVjZWl2ZU1lc3NhZ2UoKSByZWNlaXZlZDoiICsgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1N1aXRlTWVzc2FnZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TdWl0ZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWUyYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9TdWl0ZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CisKKworLyoqCisgKiBBIDxjb2RlPklTdHJpbmdNZXNzYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmb3Igc3VpdGUgcnVubmluZyBldmVudHMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFN1aXRlTWVzc2FnZSBpbXBsZW1lbnRzIElTdHJpbmdNZXNzYWdlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyOTg1MjgyNjE5NDI2MjA0MTlMOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1fc3VpdGVOYW1lOworICBwcm90ZWN0ZWQgZmluYWwgaW50IG1fdGVzdE1ldGhvZENvdW50OworICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtX3N0YXJ0U3VpdGU7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fZXhjbHVkZWRNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX2Rlc2NyaXB0aW9uczsKKworICBwdWJsaWMgU3VpdGVNZXNzYWdlKGZpbmFsIFN0cmluZyBzdWl0ZU5hbWUsIGZpbmFsIGJvb2xlYW4gc3RhcnRTdWl0ZVJ1biwgZmluYWwgaW50IG1ldGhvZENvdW50KSB7CisgICAgbV9zdWl0ZU5hbWUgPSBzdWl0ZU5hbWU7CisgICAgbV9zdGFydFN1aXRlID0gc3RhcnRTdWl0ZVJ1bjsKKyAgICBtX3Rlc3RNZXRob2RDb3VudCA9IG1ldGhvZENvdW50OworICB9CisKKyAgcHVibGljIFN1aXRlTWVzc2FnZShmaW5hbCBJU3VpdGUgc3VpdGUsIGZpbmFsIGJvb2xlYW4gc3RhcnRTdWl0ZVJ1bikgeworICAgIG1fc3VpdGVOYW1lID0gc3VpdGUuZ2V0TmFtZSgpOworICAgIG1fdGVzdE1ldGhvZENvdW50ID1zdWl0ZS5nZXRJbnZva2VkTWV0aG9kcygpLnNpemUoKTsKKyAgICBtX3N0YXJ0U3VpdGUgPSBzdGFydFN1aXRlUnVuOworICAgIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gZXhjbHVkZWRNZXRob2RzID0gc3VpdGUuZ2V0RXhjbHVkZWRNZXRob2RzKCk7CisgICAgaWYgKGV4Y2x1ZGVkTWV0aG9kcyAhPSBudWxsICYmIGV4Y2x1ZGVkTWV0aG9kcy5zaXplKCkgPiAwKSB7CisgICAgICBtX2V4Y2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgbV9kZXNjcmlwdGlvbnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogZXhjbHVkZWRNZXRob2RzKSB7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLiIgKyBtLmdldE1ldGhvZE5hbWUoKTsKKyAgICAgICAgbV9leGNsdWRlZE1ldGhvZHMuYWRkKG1ldGhvZE5hbWUpOworICAgICAgICBpZiAobS5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpIG1fZGVzY3JpcHRpb25zLnB1dChtZXRob2ROYW1lLCBtLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkTWV0aG9kcyhMaXN0PFN0cmluZz4gbWV0aG9kcykgeworICAgIG1fZXhjbHVkZWRNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgbV9leGNsdWRlZE1ldGhvZHMuYWRkQWxsKG1ldGhvZHMpOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlZE1ldGhvZHMoKSB7CisgICAgcmV0dXJuIG1fZXhjbHVkZWRNZXRob2RzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbkZvck1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgIHJldHVybiBtX2Rlc2NyaXB0aW9ucy5nZXQobWV0aG9kTmFtZSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VPblN0YXJ0KCkgeworICAgIHJldHVybiBtX3N0YXJ0U3VpdGU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFN1aXRlTmFtZSgpIHsKKyAgICByZXR1cm4gbV9zdWl0ZU5hbWU7CisgIH0KKworICBwdWJsaWMgaW50IGdldFRlc3RNZXRob2RDb3VudCgpIHsKKyAgICByZXR1cm4gbV90ZXN0TWV0aG9kQ291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlQXNTdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIGJ1Zi5hcHBlbmQobV9zdGFydFN1aXRlID8gTWVzc2FnZUhlbHBlci5TVUlURV9TVEFSVCA6IE1lc3NhZ2VIZWxwZXIuU1VJVEVfRklOSVNIKQorICAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgICAuYXBwZW5kKG1fc3VpdGVOYW1lKQorICAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgICAuYXBwZW5kKG1fdGVzdE1ldGhvZENvdW50KQorICAgICAgICA7CisKKyAgICBpZiAobV9leGNsdWRlZE1ldGhvZHMgIT0gbnVsbCAmJiBtX2V4Y2x1ZGVkTWV0aG9kcy5zaXplKCkgPiAwKSB7CisgICAgICBidWYuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKTsKKyAgICAgIGJ1Zi5hcHBlbmQobV9leGNsdWRlZE1ldGhvZHMuc2l6ZSgpKTsKKyAgICAgIGZvciAoU3RyaW5nIG1ldGhvZCA6IG1fZXhjbHVkZWRNZXRob2RzKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpOworICAgICAgICBidWYuYXBwZW5kKG1ldGhvZCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiW1N1aXRlTWVzc2FnZSBzdWl0ZToiICsgbV9zdWl0ZU5hbWUKKyAgICAgICAgKyAobV9zdGFydFN1aXRlID8gIiBzdGFydGluZyIgOiAiIGVuZGluZyIpCisgICAgICAgICsgIiBtZXRob2RDb3VudDoiICsgbV90ZXN0TWV0aG9kQ291bnQKKyAgICAgICAgKyAiXSI7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9UZXN0TWVzc2FnZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9UZXN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhNjg0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1Rlc3RNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2w7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKKworCisvKioKKyAqIEFuIDxjb2RlPklTdHJpbmdNZXNzYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGVzdCBldmVudHMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3RNZXNzYWdlIGltcGxlbWVudHMgSVN0cmluZ01lc3NhZ2UgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAzOTI2NzE0MzU3MDU1OTY0MEw7CisgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1fdGVzdFN0YXJ0OworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1fc3VpdGVOYW1lOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1fdGVzdE5hbWU7CisgIHByb3RlY3RlZCBmaW5hbCBpbnQgbV90ZXN0TWV0aG9kQ291bnQ7CisgIHByb3RlY3RlZCBmaW5hbCBpbnQgbV9wYXNzZWRUZXN0Q291bnQ7CisgIHByb3RlY3RlZCBmaW5hbCBpbnQgbV9mYWlsZWRUZXN0Q291bnQ7CisgIHByb3RlY3RlZCBmaW5hbCBpbnQgbV9za2lwcGVkVGVzdENvdW50OworICBwcm90ZWN0ZWQgZmluYWwgaW50IG1fc3VjY2Vzc1BlcmNlbnRhZ2VGYWlsZWRUZXN0Q291bnQ7CisKKyAgcHVibGljIFRlc3RNZXNzYWdlKGZpbmFsIGJvb2xlYW4gaXNUZXN0U3RhcnQsCisgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWl0ZU5hbWUsCisgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0TmFtZSwKKyAgICAgICAgICAgICAgZmluYWwgaW50IG1ldGhvZENvdW50LAorICAgICAgICAgICAgICBmaW5hbCBpbnQgcGFzc2VkQ291bnQsCisgICAgICAgICAgICAgIGZpbmFsIGludCBmYWlsZWRDb3VudCwKKyAgICAgICAgICAgICAgZmluYWwgaW50IHNraXBwZWRDb3VudCwKKyAgICAgICAgICAgICAgZmluYWwgaW50IHBlcmNlbnRhZ2VDb3VudCkgeworICAgIG1fdGVzdFN0YXJ0ID0gaXNUZXN0U3RhcnQ7CisgICAgbV9zdWl0ZU5hbWUgPSBzdWl0ZU5hbWU7CisgICAgbV90ZXN0TmFtZSA9IHRlc3ROYW1lOworICAgIG1fdGVzdE1ldGhvZENvdW50ID0gbWV0aG9kQ291bnQ7CisgICAgbV9wYXNzZWRUZXN0Q291bnQgPSBwYXNzZWRDb3VudDsKKyAgICBtX2ZhaWxlZFRlc3RDb3VudCA9IGZhaWxlZENvdW50OworICAgIG1fc2tpcHBlZFRlc3RDb3VudCA9IHNraXBwZWRDb3VudDsKKyAgICBtX3N1Y2Nlc3NQZXJjZW50YWdlRmFpbGVkVGVzdENvdW50ID0gcGVyY2VudGFnZUNvdW50OworICB9CisKKyAgcHVibGljIFRlc3RNZXNzYWdlKGZpbmFsIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCwgZmluYWwgYm9vbGVhbiBpc1Rlc3RTdGFydCkgeworICAgIHRoaXMoaXNUZXN0U3RhcnQsCisgICAgICAgICB0ZXN0Q29udGV4dC5nZXRTdWl0ZSgpLmdldE5hbWUoKSwKKyAgICAgICAgIHRlc3RDb250ZXh0LmdldEN1cnJlbnRYbWxUZXN0KCkuZ2V0TmFtZSgpLAorICAgICAgICAgdGVzdENvbnRleHQuZ2V0QWxsVGVzdE1ldGhvZHMoKS5sZW5ndGgsCisgICAgICAgICB0ZXN0Q29udGV4dC5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwKKyAgICAgICAgIHRlc3RDb250ZXh0LmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLAorICAgICAgICAgdGVzdENvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpLAorICAgICAgICAgdGVzdENvbnRleHQuZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpLnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VPblN0YXJ0KCkgeworICAgIHJldHVybiBtX3Rlc3RTdGFydDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VBc1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgYnVmLmFwcGVuZChtX3Rlc3RTdGFydCA/IE1lc3NhZ2VIZWxwZXIuVEVTVF9TVEFSVCA6IE1lc3NhZ2VIZWxwZXIuVEVTVF9GSU5JU0gpCisgICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgIC5hcHBlbmQobV9zdWl0ZU5hbWUpCisgICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgIC5hcHBlbmQobV90ZXN0TmFtZSkKKyAgICAgICAgLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikKKyAgICAgICAgLmFwcGVuZChtX3Rlc3RNZXRob2RDb3VudCkKKyAgICAgICAgLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikKKyAgICAgICAgLmFwcGVuZChtX3Bhc3NlZFRlc3RDb3VudCkKKyAgICAgICAgLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikKKyAgICAgICAgLmFwcGVuZChtX2ZhaWxlZFRlc3RDb3VudCkKKyAgICAgICAgLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikKKyAgICAgICAgLmFwcGVuZChtX3NraXBwZWRUZXN0Q291bnQpCisgICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgIC5hcHBlbmQobV9zdWNjZXNzUGVyY2VudGFnZUZhaWxlZFRlc3RDb3VudCkKKyAgICAgICAgOworCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTdWl0ZU5hbWUoKSB7CisgICAgcmV0dXJuIG1fc3VpdGVOYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKyAgICByZXR1cm4gbV90ZXN0TmFtZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzVGVzdFN0YXJ0KCkgeworICAgIHJldHVybiBtX3Rlc3RTdGFydDsKKyAgfQorICBwdWJsaWMgaW50IGdldFRlc3RNZXRob2RDb3VudCgpIHsKKyAgICByZXR1cm4gbV90ZXN0TWV0aG9kQ291bnQ7CisgIH0KKyAgcHVibGljIGludCBnZXRTdWNjZXNzUGVyY2VudGFnZUZhaWxlZFRlc3RDb3VudCgpIHsKKyAgICByZXR1cm4gbV9zdWNjZXNzUGVyY2VudGFnZUZhaWxlZFRlc3RDb3VudDsKKyAgfQorICBwdWJsaWMgaW50IGdldEZhaWxlZFRlc3RDb3VudCgpIHsKKyAgICByZXR1cm4gbV9mYWlsZWRUZXN0Q291bnQ7CisgIH0KKyAgcHVibGljIGludCBnZXRQYXNzZWRUZXN0Q291bnQoKSB7CisgICAgcmV0dXJuIG1fcGFzc2VkVGVzdENvdW50OworICB9CisgIHB1YmxpYyBpbnQgZ2V0U2tpcHBlZFRlc3RDb3VudCgpIHsKKyAgICByZXR1cm4gbV9za2lwcGVkVGVzdENvdW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbVGVzdE1lc3NhZ2Ugc3VpdGU6IiArIG1fc3VpdGVOYW1lICsgIiB0ZXN0TmFtZToiICsgbV90ZXN0TmFtZQorICAgICAgICArICIgcGFzc2VkOiIgKyBtX3Bhc3NlZFRlc3RDb3VudCArICIgZmFpbGVkOiIgKyBtX2ZhaWxlZFRlc3RDb3VudAorICAgICAgICArICJdIjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1Rlc3RSZXN1bHRNZXNzYWdlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVtb3RlL3N0cnByb3RvY29sL1Rlc3RSZXN1bHRNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEzMWZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvVGVzdFJlc3VsdE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDQ0MiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuU2tpcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHMuaXNTdHJpbmdFbXB0eTsKKworCisvKioKKyAqIEFuIDxjb2RlPklTdHJpbmdNZXNzYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGVzdCByZXN1bHRzIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgVGVzdFJlc3VsdE1lc3NhZ2UgaW1wbGVtZW50cyBJU3RyaW5nTWVzc2FnZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MTU3MTUwNzc3ODg5MTE3NDc5TDsKKyAgcHJvdGVjdGVkIGludCAgICBtX21lc3NhZ2VUeXBlOworICBwcm90ZWN0ZWQgU3RyaW5nIG1fc3VpdGVOYW1lOworICBwcm90ZWN0ZWQgU3RyaW5nIG1fdGVzdE5hbWU7CisgIHByb3RlY3RlZCBTdHJpbmcgbV90ZXN0Q2xhc3NOYW1lOworICBwcm90ZWN0ZWQgU3RyaW5nIG1fdGVzdE1ldGhvZE5hbWU7CisgIHByb3RlY3RlZCBTdHJpbmcgbV9zdGFja1RyYWNlOworICBwcm90ZWN0ZWQgbG9uZyBtX3N0YXJ0TWlsbGlzOworICBwcm90ZWN0ZWQgbG9uZyBtX2VuZE1pbGxpczsKKyAgcHJvdGVjdGVkIFN0cmluZ1tdIG1fcGFyYW1ldGVycz0gbmV3IFN0cmluZ1swXTsKKyAgcHJvdGVjdGVkIFN0cmluZ1tdIG1fcGFyYW1UeXBlcz0gbmV3IFN0cmluZ1swXTsKKyAgcHJpdmF0ZSBTdHJpbmcgbV90ZXN0RGVzY3JpcHRpb247CisgIHByaXZhdGUgaW50IG1faW52b2NhdGlvbkNvdW50OworICBwcml2YXRlIGludCBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQ7CisgIHByaXZhdGUgU3RyaW5nIG1faW5zdGFuY2VOYW1lOworCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIEVjbGlwc2UgY2xpZW50IHRvIGluaXRpYWxpemUgYSByZXN1bHQgbWVzc2FnZSBiYXNlZAorICAgKiBvbiB3aGF0IHdhcyByZWNlaXZlZCBvdmVyIHRoZSBuZXR3b3JrLgorICAgKi8KKyAgcHVibGljIFRlc3RSZXN1bHRNZXNzYWdlKGZpbmFsIGludCByZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VpdGVOYW1lLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdERlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0YW5jZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydE1pbGxpcywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbmRNaWxsaXMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdGFja1RyYWNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW52b2NhdGlvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudEludm9jYXRpb25Db3VudCkKKyAgeworICAgIGluaXQocmVzdWx0VHlwZSwKKyAgICAgICAgIHN1aXRlTmFtZSwKKyAgICAgICAgIHRlc3ROYW1lLAorICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgbWV0aG9kTmFtZSwKKyAgICAgICAgIHN0YWNrVHJhY2UsCisgICAgICAgICBzdGFydE1pbGxpcywKKyAgICAgICAgIGVuZE1pbGxpcywKKyAgICAgICAgIGV4dHJhY3RQYXJhbXMocGFyYW1zKSwKKyAgICAgICAgIGV4dHJhY3RQYXJhbVR5cGVzKHBhcmFtcyksCisgICAgICAgICB0ZXN0RGVzY3JpcHRvciwKKyAgICAgICAgIGluc3RhbmNlTmFtZSwKKyAgICAgICAgIGludm9jYXRpb25Db3VudCwKKyAgICAgICAgIGN1cnJlbnRJbnZvY2F0aW9uQ291bnQKKyAgICApOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSBSZW1vdGVUZXN0TkcgdG8gaW5pdGlhbGl6ZSBhIHJlc3VsdCBtZXNzYWdlCisgICAqIGZyb20gYW4gSVRlc3RSZXN1bHQuCisgICAqLworICBwdWJsaWMgVGVzdFJlc3VsdE1lc3NhZ2UoZmluYWwgU3RyaW5nIHN1aXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElUZXN0UmVzdWx0IHJlc3VsdCkKKyAgeworICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSByZXN1bHQuZ2V0VGhyb3dhYmxlKCk7CisgICAgU3RyaW5nIHN0YWNrVHJhY2UgPSBudWxsOworCisgICAgaWYoKElUZXN0UmVzdWx0LkZBSUxVUkUgPT0gcmVzdWx0LmdldFN0YXR1cygpKQorICAgICAgfHwgKElUZXN0UmVzdWx0LlNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFID09IHJlc3VsdC5nZXRTdGF0dXMoKSkpIHsKKyAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgIFByaW50V3JpdGVyICBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CisgICAgICBUaHJvd2FibGUgY2F1c2U9IHRocm93YWJsZTsKKyAgICAgIGlmIChudWxsICE9IGNhdXNlKSB7CisgICAgICAgIGNhdXNlLnByaW50U3RhY2tUcmFjZShwdyk7CisgICAgICAgIHN0YWNrVHJhY2UgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHN0YWNrVHJhY2U9ICJ1bmtub3duIHN0YWNrIHRyYWNlIjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihJVGVzdFJlc3VsdC5TS0lQID09IHJlc3VsdC5nZXRTdGF0dXMoKQorICAgICAgICAmJiAodGhyb3dhYmxlICE9IG51bGwgJiYgU2tpcEV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRocm93YWJsZS5nZXRDbGFzcygpKSkpIHsKKyAgICAgIHN0YWNrVHJhY2U9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7CisgICAgfSBlbHNlIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgeworICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShwdyk7CisgICAgICBzdGFja1RyYWNlID0gc3cudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBpbml0KE1lc3NhZ2VIZWxwZXIuVEVTVF9SRVNVTFQgKyByZXN1bHQuZ2V0U3RhdHVzKCksCisgICAgICAgICBzdWl0ZU5hbWUsCisgICAgICAgICB0ZXN0TmFtZSwKKyAgICAgICAgIHJlc3VsdC5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICByZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpLAorICAgICAgICAgTWVzc2FnZUhlbHBlci5yZXBsYWNlVW5pY29kZUNoYXJhY3RlcnNXaXRoQXNjaWkoc3RhY2tUcmFjZSksCisgICAgICAgICByZXN1bHQuZ2V0U3RhcnRNaWxsaXMoKSwKKyAgICAgICAgIHJlc3VsdC5nZXRFbmRNaWxsaXMoKSwKKyAgICAgICAgIHRvU3RyaW5nKHJlc3VsdC5nZXRQYXJhbWV0ZXJzKCksIHJlc3VsdC5nZXRNZXRob2QoKS5nZXRNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpKSwKKyAgICAgICAgIHRvU3RyaW5nKHJlc3VsdC5nZXRNZXRob2QoKS5nZXRNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpKSwKKyAgICAgICAgIE1lc3NhZ2VIZWxwZXIucmVwbGFjZVVuaWNvZGVDaGFyYWN0ZXJzV2l0aEFzY2lpKHJlc3VsdC5nZXROYW1lKCkpLAorICAgICAgICAgTWVzc2FnZUhlbHBlci5yZXBsYWNlVW5pY29kZUNoYXJhY3RlcnNXaXRoQXNjaWkocmVzdWx0LmdldEluc3RhbmNlTmFtZSgpKSwKKyAgICAgICAgIHJlc3VsdC5nZXRNZXRob2QoKS5nZXRJbnZvY2F0aW9uQ291bnQoKSwKKyAgICAgICAgIHJlc3VsdC5nZXRNZXRob2QoKS5nZXRDdXJyZW50SW52b2NhdGlvbkNvdW50KCkKKyAgICApOworICB9CisKKyAgcHVibGljIFRlc3RSZXN1bHRNZXNzYWdlKGZpbmFsIElUZXN0Q29udGV4dCB0ZXN0Q3R4LCBmaW5hbCBJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICB0aGlzKHRlc3RDdHguZ2V0U3VpdGUoKS5nZXROYW1lKCksIHRlc3RDdHguZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXROYW1lKCksIHJlc3VsdCk7CisvLyAgICB0aGlzKHRlc3RDdHguZ2V0U3VpdGUoKS5nZXROYW1lKCksCisvLyAgICAgICAgcmVzdWx0LmdldFRlc3ROYW1lKCkgIT0gbnVsbCA/IHJlc3VsdC5nZXRUZXN0TmFtZSgpIDogcmVzdWx0LmdldE5hbWUoKSwgcmVzdWx0KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0KGZpbmFsIGludCByZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VpdGVOYW1lLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RhY2tUcmFjZSwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydE1pbGxpcywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbmRNaWxsaXMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHR5cGVzLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdERlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdGFuY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW52b2NhdGlvbkNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgY3VycmVudEludm9jYXRpb25Db3VudCkgeworICAgIG1fbWVzc2FnZVR5cGUgPSByZXN1bHRUeXBlOworICAgIG1fc3VpdGVOYW1lID0gc3VpdGVOYW1lOworICAgIG1fdGVzdE5hbWUgPSB0ZXN0TmFtZTsKKyAgICBtX3Rlc3RDbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgbV90ZXN0TWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgbV9zdGFja1RyYWNlID0gc3RhY2tUcmFjZTsKKyAgICBtX3N0YXJ0TWlsbGlzPSBzdGFydE1pbGxpczsKKyAgICBtX2VuZE1pbGxpcz0gZW5kTWlsbGlzOworICAgIG1fcGFyYW1ldGVycz0gcGFyYW1ldGVyczsKKyAgICBtX3BhcmFtVHlwZXM9IHR5cGVzOworICAgIG1fdGVzdERlc2NyaXB0aW9uPSB0ZXN0RGVzY3JpcHRpb247CisgICAgbV9pbnZvY2F0aW9uQ291bnQgPSBpbnZvY2F0aW9uQ291bnQ7CisgICAgbV9jdXJyZW50SW52b2NhdGlvbkNvdW50ID0gY3VycmVudEludm9jYXRpb25Db3VudDsKKyAgICBtX2luc3RhbmNlTmFtZSA9IGluc3RhbmNlTmFtZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0UmVzdWx0KCkgeworICAgIHJldHVybiBtX21lc3NhZ2VUeXBlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUFzU3RyaW5nKCkgeworICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgU3RyaW5nQnVmZmVyIHBhcmFtYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgaWYobnVsbCAhPSBtX3BhcmFtZXRlcnMgJiYgbV9wYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9wYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGlmIChqID4gMCkgeworICAgICAgICAgIHBhcmFtYnVmLmFwcGVuZChNZXNzYWdlSGVscGVyLlBBUkFNX0RFTElNSVRFUik7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1idWYuYXBwZW5kKG1fcGFyYW1UeXBlc1tqXSArICI6IiArIG1fcGFyYW1ldGVyc1tqXSk7CisgICAgICB9CisgICAgfQorCisgICAgYnVmLmFwcGVuZChtX21lc3NhZ2VUeXBlKQorICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgLmFwcGVuZChtX3N1aXRlTmFtZSkKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgIC5hcHBlbmQobV90ZXN0TmFtZSkKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgIC5hcHBlbmQobV90ZXN0Q2xhc3NOYW1lKQorICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgLmFwcGVuZChtX3Rlc3RNZXRob2ROYW1lKQorICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5ERUxJTUlURVIpCisgICAgICAgLmFwcGVuZChwYXJhbWJ1ZikKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgIC5hcHBlbmQobV9zdGFydE1pbGxpcykKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgIC5hcHBlbmQobV9lbmRNaWxsaXMpCisgICAgICAgLmFwcGVuZChNZXNzYWdlSGVscGVyLkRFTElNSVRFUikKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIucmVwbGFjZU5ld0xpbmUobV9zdGFja1RyYWNlKSkKKyAgICAgICAuYXBwZW5kKE1lc3NhZ2VIZWxwZXIuREVMSU1JVEVSKQorICAgICAgIC5hcHBlbmQoTWVzc2FnZUhlbHBlci5yZXBsYWNlTmV3TGluZShtX3Rlc3REZXNjcmlwdGlvbikpCisgICAgICAgOworCisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTdWl0ZU5hbWUoKSB7CisgICAgcmV0dXJuIG1fc3VpdGVOYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUZXN0Q2xhc3MoKSB7CisgICAgcmV0dXJuIG1fdGVzdENsYXNzTmFtZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgIHJldHVybiBtX3Rlc3RNZXRob2ROYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX3Rlc3ROYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTdGFja1RyYWNlKCkgeworICAgIHJldHVybiBtX3N0YWNrVHJhY2U7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRFbmRNaWxsaXMoKSB7CisgICAgcmV0dXJuIG1fZW5kTWlsbGlzOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0U3RhcnRNaWxsaXMoKSB7CisgICAgcmV0dXJuIG1fc3RhcnRNaWxsaXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gbV9wYXJhbWV0ZXJzOworICB9CisKKyAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgIHJldHVybiBtX3BhcmFtVHlwZXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFRlc3REZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gbV90ZXN0RGVzY3JpcHRpb247CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvRGlzcGxheVN0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKG1fdGVzdE5hbWUgIT0gbnVsbCA/IG1fdGVzdE5hbWUgOiBtX3Rlc3RNZXRob2ROYW1lKTsKKworICAgIGlmKG51bGwgIT0gbV9wYXJhbWV0ZXJzICYmIG1fcGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CisgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICBmb3IoaW50IGk9IDA7IGkgPCBtX3BhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYoaSA+IDApIHsKKyAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGlmKCJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMobV9wYXJhbVR5cGVzW2ldKSAmJiAhKCJudWxsIi5lcXVhbHMobV9wYXJhbWV0ZXJzW2ldKSB8fCAiXCJcIiIuZXF1YWxzKG1fcGFyYW1ldGVyc1tpXSkpKSB7CisgICAgICAgICAgYnVmLmFwcGVuZCgiXCIiKS5hcHBlbmQobV9wYXJhbWV0ZXJzW2ldKS5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYnVmLmFwcGVuZChtX3BhcmFtZXRlcnNbaV0pOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYodGhpcyA9PSBvKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmluYWwgVGVzdFJlc3VsdE1lc3NhZ2UgdGhhdCA9IChUZXN0UmVzdWx0TWVzc2FnZSkgbzsKKworICAgIGlmKG1fc3VpdGVOYW1lICE9IG51bGwgPyAhbV9zdWl0ZU5hbWUuZXF1YWxzKHRoYXQubV9zdWl0ZU5hbWUpIDogdGhhdC5tX3N1aXRlTmFtZSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKG1fdGVzdE5hbWUgIT0gbnVsbCA/ICFtX3Rlc3ROYW1lLmVxdWFscyh0aGF0Lm1fdGVzdE5hbWUpIDogdGhhdC5tX3Rlc3ROYW1lICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYobV90ZXN0Q2xhc3NOYW1lICE9IG51bGwgPyAhbV90ZXN0Q2xhc3NOYW1lLmVxdWFscyh0aGF0Lm1fdGVzdENsYXNzTmFtZSkgOiB0aGF0Lm1fdGVzdENsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0cmluZyB0b0Rpc3BsYXlTdHJpbmc9IHRvRGlzcGxheVN0cmluZygpOworICAgIGlmKHRvRGlzcGxheVN0cmluZyAhPSBudWxsID8gIXRvRGlzcGxheVN0cmluZy5lcXVhbHModGhhdC50b0Rpc3BsYXlTdHJpbmcoKSkgOiB0aGF0LnRvRGlzcGxheVN0cmluZygpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGludCByZXN1bHQgPSAobV9zdWl0ZU5hbWUgIT0gbnVsbCA/IG1fc3VpdGVOYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChtX3Rlc3ROYW1lICE9IG51bGwgPyBtX3Rlc3ROYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIG1fdGVzdENsYXNzTmFtZS5oYXNoQ29kZSgpOworICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgdG9EaXNwbGF5U3RyaW5nKCkuaGFzaENvZGUoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgU3RyaW5nW10gdG9TdHJpbmcoT2JqZWN0W10gb2JqZWN0cywgQ2xhc3M8Pz5bXSBvYmplY3RDbGFzc2VzKSB7CisgICAgaWYobnVsbCA9PSBvYmplY3RzKSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IHJlc3VsdD0gTGlzdHMubmV3QXJyYXlMaXN0KG9iamVjdHMubGVuZ3RoKTsKKyAgICBmb3IoT2JqZWN0IG86IG9iamVjdHMpIHsKKyAgICAgIGlmKG51bGwgPT0gbykgeworICAgICAgICByZXN1bHQuYWRkKCJudWxsIik7CisgICAgICB9CisgICAgICBlbHNlIGlmIChvLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5OworICAgICAgICBpZiAoby5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKXsKKyAgICAgICAgICBzdHJBcnJheSA9IHByaW1pdGl2ZUFycmF5VG9TdHJpbmcobyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyQXJyYXkgPSB0b1N0cmluZygoT2JqZWN0W10pIG8sIG51bGwpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ckFycmF5Lmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc2IuYXBwZW5kKHN0ckFycmF5W2ldKTsKKyAgICAgICAgICBpZiAoaSArIDEgPCBzdHJBcnJheS5sZW5ndGgpCisgICAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXN1bHQuYWRkKHNiLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIFN0cmluZyB0b3N0cmluZz0gby50b1N0cmluZygpOworICAgICAgICBpZihpc1N0cmluZ0VtcHR5KHRvc3RyaW5nKSkgeworICAgICAgICAgIHJlc3VsdC5hZGQoIlwiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZXN1bHQuYWRkKE1lc3NhZ2VIZWxwZXIucmVwbGFjZU5ld0xpbmUodG9zdHJpbmcpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gcHJpbWl0aXZlQXJyYXlUb1N0cmluZyhPYmplY3QgbykgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgaWYgKG8gaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgIGJ5dGVbXSBhcnJheSA9IChieXRlW10pIG87CisgICAgICAgIGZvciAoYnl0ZSBhbkFycmF5IDogYXJyYXkpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKFN0cmluZy52YWx1ZU9mKGFuQXJyYXkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgeworICAgICAgYm9vbGVhbltdIGFycmF5ID0gKGJvb2xlYW5bXSkgbzsKKyAgICAgICAgZm9yIChib29sZWFuIGFuQXJyYXkgOiBhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU3RyaW5nLnZhbHVlT2YoYW5BcnJheSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICBjaGFyW10gYXJyYXkgPSAoY2hhcltdKSBvOworICAgICAgICBmb3IgKGNoYXIgYW5BcnJheSA6IGFycmF5KSB7CisgICAgICAgICAgICByZXN1bHRzLmFkZChTdHJpbmcudmFsdWVPZihhbkFycmF5KSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBkb3VibGVbXSkgeworICAgICAgZG91YmxlW10gYXJyYXkgPSAoZG91YmxlW10pIG87CisgICAgICAgIGZvciAoZG91YmxlIGFuQXJyYXkgOiBhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU3RyaW5nLnZhbHVlT2YoYW5BcnJheSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgZmxvYXRbXSkgeworICAgICAgZmxvYXRbXSBhcnJheSA9IChmbG9hdFtdKSBvOworICAgICAgICBmb3IgKGZsb2F0IGFuQXJyYXkgOiBhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU3RyaW5nLnZhbHVlT2YoYW5BcnJheSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2Ygc2hvcnRbXSkgeworICAgICAgc2hvcnRbXSBhcnJheSA9IChzaG9ydFtdKSBvOworICAgICAgICBmb3IgKHNob3J0IGFuQXJyYXkgOiBhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU3RyaW5nLnZhbHVlT2YoYW5BcnJheSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgaW50W10pIHsKKyAgICAgIGludFtdIGFycmF5ID0gKGludFtdKSBvOworICAgICAgICBmb3IgKGludCBhbkFycmF5IDogYXJyYXkpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKFN0cmluZy52YWx1ZU9mKGFuQXJyYXkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIGxvbmdbXSkgeworICAgICAgbG9uZ1tdIGFycmF5ID0gKGxvbmdbXSkgbzsKKyAgICAgICAgZm9yIChsb25nIGFuQXJyYXkgOiBhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0cy5hZGQoU3RyaW5nLnZhbHVlT2YoYW5BcnJheSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSB0b1N0cmluZyhDbGFzczw/PltdIGNsYXNzZXMpIHsKKyAgICBpZihudWxsID09IGNsYXNzZXMpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgIH0KKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0PSBMaXN0cy5uZXdBcnJheUxpc3QoY2xhc3Nlcy5sZW5ndGgpOworICAgIGZvcihDbGFzczw/PiBjbHM6IGNsYXNzZXMpIHsKKyAgICAgIHJlc3VsdC5hZGQoY2xzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBleHRyYWN0UGFyYW1UeXBlcyhTdHJpbmdbXSBwYXJhbXMpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0PSBMaXN0cy5uZXdBcnJheUxpc3QocGFyYW1zLmxlbmd0aCk7CisgICAgZm9yKFN0cmluZyBzOiBwYXJhbXMpIHsKKyAgICAgIHJlc3VsdC5hZGQocy5zdWJzdHJpbmcoMCwgcy5pbmRleE9mKCc6JykpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZ1tdIGV4dHJhY3RQYXJhbXMoU3RyaW5nW10gcGFyYW1zKSB7CisgICAgTGlzdDxTdHJpbmc+IHJlc3VsdD0gTGlzdHMubmV3QXJyYXlMaXN0KHBhcmFtcy5sZW5ndGgpOworICAgIGZvcihTdHJpbmcgczogcGFyYW1zKSB7CisgICAgICByZXN1bHQuYWRkKE1lc3NhZ2VIZWxwZXIucmVwbGFjZU5ld0xpbmVSZXBsYWNlcihzLnN1YnN0cmluZyhzLmluZGV4T2YoJzonKSArIDEpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICB9CisKKyAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKSB7CisgICAgcmV0dXJuIG1faW52b2NhdGlvbkNvdW50OworICB9CisKKyAgcHVibGljIGludCBnZXRDdXJyZW50SW52b2NhdGlvbkNvdW50KCkgeworICAgIHJldHVybiBtX2N1cnJlbnRJbnZvY2F0aW9uQ291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIltUZXN0UmVzdWx0TWVzc2FnZSBzdWl0ZToiICsgbV9zdWl0ZU5hbWUgKyAiIHRlc3Q6IiArIG1fdGVzdE5hbWUKKyAgICAgICAgKyAiIG1ldGhvZDoiICsgbV90ZXN0TWV0aG9kTmFtZQorICAgICAgICArICJdIjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1zKSB7CisgICAgbV9wYXJhbWV0ZXJzID0gZXh0cmFjdFBhcmFtcyhwYXJhbXMpOworICAgIG1fcGFyYW1UeXBlcyA9IGV4dHJhY3RQYXJhbVR5cGVzKHBhcmFtcyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlTmFtZSgpIHsKKyAgICByZXR1cm4gbV9pbnN0YW5jZU5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvQnVmZmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0J1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDczZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0J1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVyczsKKworcHVibGljIGNsYXNzIEJ1ZmZlciB7CisgIHB1YmxpYyBzdGF0aWMgSUJ1ZmZlciBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBGaWxlU3RyaW5nQnVmZmVyKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRG90VGVzdExpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0RvdFRlc3RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwNWFiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0RvdFRlc3RMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKKworcHVibGljIGNsYXNzIERvdFRlc3RMaXN0ZW5lciBleHRlbmRzIFRlc3RMaXN0ZW5lckFkYXB0ZXIgeworICBwcml2YXRlIGludCBtX2NvdW50ID0gMDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCB0cikgeworICAgIGxvZygiRiIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBsb2coIlMiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbG9nKCIuIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50KHN0cmluZyk7CisgICAgaWYgKG1fY291bnQrKyAlIDQwID09IDApIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRW1haWxhYmxlUmVwb3J0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRW1haWxhYmxlUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OTBiZjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9FbWFpbGFibGVSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsNTA3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLklSZXN1bHRNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcubG9nNHRlc3RuZy5Mb2dnZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUmVwb3J0ZWQgZGVzaWduZWQgdG8gcmVuZGVyIHNlbGYtY29udGFpbmVkIEhUTUwgdG9wIGRvd24gdmlldyBvZiBhIHRlc3RpbmcKKyAqIHN1aXRlLgorICoKKyAqIEBhdXRob3IgUGF1bCBNZW5kZWxzb24KKyAqIEBzaW5jZSA1LjIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzE5ICQKKyAqLworcHVibGljIGNsYXNzIEVtYWlsYWJsZVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIEwgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVtYWlsYWJsZVJlcG9ydGVyLmNsYXNzKTsKKworICAvLyB+IEluc3RhbmNlIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIFByaW50V3JpdGVyIG1fb3V0OworCisgIHByaXZhdGUgaW50IG1fcm93OworCisgIHByaXZhdGUgSW50ZWdlciBtX3Rlc3RJbmRleDsKKworICBwcml2YXRlIGludCBtX21ldGhvZEluZGV4OworCisgIC8vIH4gTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKiBDcmVhdGVzIHN1bW1hcnkgb2YgdGhlIHJ1biAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sLCBMaXN0PElTdWl0ZT4gc3VpdGVzLCBTdHJpbmcgb3V0ZGlyKSB7CisgICAgdHJ5IHsKKyAgICAgIG1fb3V0ID0gY3JlYXRlV3JpdGVyKG91dGRpcik7CisgICAgfQorICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBMLmVycm9yKCJvdXRwdXQgZmlsZSIsIGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGFydEh0bWwobV9vdXQpOworICAgIGdlbmVyYXRlU3VpdGVTdW1tYXJ5UmVwb3J0KHN1aXRlcyk7CisgICAgZ2VuZXJhdGVNZXRob2RTdW1tYXJ5UmVwb3J0KHN1aXRlcyk7CisgICAgZ2VuZXJhdGVNZXRob2REZXRhaWxSZXBvcnQoc3VpdGVzKTsKKyAgICBlbmRIdG1sKG1fb3V0KTsKKyAgICBtX291dC5mbHVzaCgpOworICAgIG1fb3V0LmNsb3NlKCk7CisgIH0KKworICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgY3JlYXRlV3JpdGVyKFN0cmluZyBvdXRkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbmV3IEZpbGUob3V0ZGlyKS5ta2RpcnMoKTsKKyAgICByZXR1cm4gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihuZXcgRmlsZShvdXRkaXIsCisgICAgICAgICJlbWFpbGFibGUtcmVwb3J0Lmh0bWwiKSkpKTsKKyAgfQorCisgIC8qKiBDcmVhdGVzIGEgdGFibGUgc2hvd2luZyB0aGUgaGlnaGxpZ2h0cyBvZiBlYWNoIHRlc3QgbWV0aG9kIHdpdGggbGlua3MgdG8gdGhlIG1ldGhvZCBkZXRhaWxzICovCisgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTWV0aG9kU3VtbWFyeVJlcG9ydChMaXN0PElTdWl0ZT4gc3VpdGVzKSB7CisgICAgbV9tZXRob2RJbmRleCA9IDA7CisgICAgc3RhcnRSZXN1bHRTdW1tYXJ5VGFibGUoIm1ldGhvZE92ZXJ2aWV3Iik7CisgICAgaW50IHRlc3RJbmRleCA9IDE7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIGlmKHN1aXRlcy5zaXplKCk+MSkgeworICAgICAgICB0aXRsZVJvdyhzdWl0ZS5nZXROYW1lKCksIDUpOworICAgICAgfQorICAgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiByID0gc3VpdGUuZ2V0UmVzdWx0cygpOworICAgICAgZm9yIChJU3VpdGVSZXN1bHQgcjIgOiByLnZhbHVlcygpKSB7CisgICAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCA9IHIyLmdldFRlc3RDb250ZXh0KCk7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IHRlc3RDb250ZXh0LmdldE5hbWUoKTsKKyAgICAgICAgbV90ZXN0SW5kZXggPSB0ZXN0SW5kZXg7CisgICAgICAgIHJlc3VsdFN1bW1hcnkoc3VpdGUsIHRlc3RDb250ZXh0LmdldEZhaWxlZENvbmZpZ3VyYXRpb25zKCksIHRlc3ROYW1lLAorICAgICAgICAgICAgImZhaWxlZCIsICIgKGNvbmZpZ3VyYXRpb24gbWV0aG9kcykiKTsKKyAgICAgICAgcmVzdWx0U3VtbWFyeShzdWl0ZSwgdGVzdENvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKSwgdGVzdE5hbWUsICJmYWlsZWQiLAorICAgICAgICAgICAgIiIpOworICAgICAgICByZXN1bHRTdW1tYXJ5KHN1aXRlLCB0ZXN0Q29udGV4dC5nZXRTa2lwcGVkQ29uZmlndXJhdGlvbnMoKSwgdGVzdE5hbWUsCisgICAgICAgICAgICAic2tpcHBlZCIsICIgKGNvbmZpZ3VyYXRpb24gbWV0aG9kcykiKTsKKyAgICAgICAgcmVzdWx0U3VtbWFyeShzdWl0ZSwgdGVzdENvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCksIHRlc3ROYW1lLAorICAgICAgICAgICAgInNraXBwZWQiLCAiIik7CisgICAgICAgIHJlc3VsdFN1bW1hcnkoc3VpdGUsIHRlc3RDb250ZXh0LmdldFBhc3NlZFRlc3RzKCksIHRlc3ROYW1lLCAicGFzc2VkIiwKKyAgICAgICAgICAgICIiKTsKKyAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICB9CisgICAgfQorICAgIG1fb3V0LnByaW50bG4oIjwvdGFibGU+Iik7CisgIH0KKworICAvKiogQ3JlYXRlcyBhIHNlY3Rpb24gc2hvd2luZyBrbm93biByZXN1bHRzIGZvciBlYWNoIG1ldGhvZCAqLworICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU1ldGhvZERldGFpbFJlcG9ydChMaXN0PElTdWl0ZT4gc3VpdGVzKSB7CisgICAgbV9tZXRob2RJbmRleCA9IDA7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gciA9IHN1aXRlLmdldFJlc3VsdHMoKTsKKyAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHIyIDogci52YWx1ZXMoKSkgeworICAgICAgICBJVGVzdENvbnRleHQgdGVzdENvbnRleHQgPSByMi5nZXRUZXN0Q29udGV4dCgpOworICAgICAgICBpZiAoci52YWx1ZXMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgbV9vdXQucHJpbnRsbigiPGgxPiIgKyB0ZXN0Q29udGV4dC5nZXROYW1lKCkgKyAiPC9oMT4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHREZXRhaWwodGVzdENvbnRleHQuZ2V0RmFpbGVkQ29uZmlndXJhdGlvbnMoKSk7CisgICAgICAgIHJlc3VsdERldGFpbCh0ZXN0Q29udGV4dC5nZXRGYWlsZWRUZXN0cygpKTsKKyAgICAgICAgcmVzdWx0RGV0YWlsKHRlc3RDb250ZXh0LmdldFNraXBwZWRDb25maWd1cmF0aW9ucygpKTsKKyAgICAgICAgcmVzdWx0RGV0YWlsKHRlc3RDb250ZXh0LmdldFNraXBwZWRUZXN0cygpKTsKKyAgICAgICAgcmVzdWx0RGV0YWlsKHRlc3RDb250ZXh0LmdldFBhc3NlZFRlc3RzKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gdGVzdHMKKyAgICovCisgIHByaXZhdGUgdm9pZCByZXN1bHRTdW1tYXJ5KElTdWl0ZSBzdWl0ZSwgSVJlc3VsdE1hcCB0ZXN0cywgU3RyaW5nIHRlc3RuYW1lLCBTdHJpbmcgc3R5bGUsCisgICAgICBTdHJpbmcgZGV0YWlscykgeworICAgIGlmICh0ZXN0cy5nZXRBbGxSZXN1bHRzKCkuc2l6ZSgpID4gMCkgeworICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBTdHJpbmcgbGFzdENsYXNzTmFtZSA9ICIiOworICAgICAgaW50IG1xID0gMDsKKyAgICAgIGludCBjcSA9IDA7CisgICAgICBmb3IgKElUZXN0TkdNZXRob2QgbWV0aG9kIDogZ2V0TWV0aG9kU2V0KHRlc3RzLCBzdWl0ZSkpIHsKKyAgICAgICAgbV9yb3cgKz0gMTsKKyAgICAgICAgbV9tZXRob2RJbmRleCArPSAxOworICAgICAgICBJVGVzdENsYXNzIHRlc3RDbGFzcyA9IG1ldGhvZC5nZXRUZXN0Q2xhc3MoKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHRlc3RDbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChtcSA9PSAwKSB7CisgICAgICAgICAgU3RyaW5nIGlkID0gKG1fdGVzdEluZGV4ID09IG51bGwgPyBudWxsIDogInQiICsgSW50ZWdlci50b1N0cmluZyhtX3Rlc3RJbmRleCkpOworICAgICAgICAgIHRpdGxlUm93KHRlc3RuYW1lICsgIiAmIzgyMTI7ICIgKyBzdHlsZSArIGRldGFpbHMsIDUsIGlkKTsKKyAgICAgICAgICBtX3Rlc3RJbmRleCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjbGFzc05hbWUuZXF1YWxzSWdub3JlQ2FzZShsYXN0Q2xhc3NOYW1lKSkgeworICAgICAgICAgIGlmIChtcSA+IDApIHsKKyAgICAgICAgICAgIGNxICs9IDE7CisgICAgICAgICAgICBtX291dC5wcmludCgiPHRyIGNsYXNzPVwiIiArIHN0eWxlCisgICAgICAgICAgICAgICAgKyAoY3EgJSAyID09IDAgPyAiZXZlbiIgOiAib2RkIikgKyAiXCI+IiArICI8dGQiKTsKKyAgICAgICAgICAgIGlmIChtcSA+IDEpIHsKKyAgICAgICAgICAgICAgbV9vdXQucHJpbnQoIiByb3dzcGFuPVwiIiArIG1xICsgIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX291dC5wcmludGxuKCI+IiArIGxhc3RDbGFzc05hbWUgKyAiPC90ZD4iICsgYnVmZik7CisgICAgICAgICAgfQorICAgICAgICAgIG1xID0gMDsKKyAgICAgICAgICBidWZmLnNldExlbmd0aCgwKTsKKyAgICAgICAgICBsYXN0Q2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICB9CisgICAgICAgIFNldDxJVGVzdFJlc3VsdD4gcmVzdWx0U2V0ID0gdGVzdHMuZ2V0UmVzdWx0cyhtZXRob2QpOworICAgICAgICBsb25nIGVuZCA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICBsb25nIHN0YXJ0ID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCA6IHRlc3RzLmdldFJlc3VsdHMobWV0aG9kKSkgeworICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmdldEVuZE1pbGxpcygpID4gZW5kKSB7CisgICAgICAgICAgICBlbmQgPSB0ZXN0UmVzdWx0LmdldEVuZE1pbGxpcygpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGVzdFJlc3VsdC5nZXRTdGFydE1pbGxpcygpIDwgc3RhcnQpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gdGVzdFJlc3VsdC5nZXRTdGFydE1pbGxpcygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtcSArPSAxOworICAgICAgICBpZiAobXEgPiAxKSB7CisgICAgICAgICAgYnVmZi5hcHBlbmQoIjx0ciBjbGFzcz1cIiIgKyBzdHlsZSArIChjcSAlIDIgPT0gMCA/ICJvZGQiIDogImV2ZW4iKQorICAgICAgICAgICAgICArICJcIj4iKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBtZXRob2QuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgU3RyaW5nIHRlc3RJbnN0YW5jZU5hbWUgPSByZXN1bHRTZXQudG9BcnJheShuZXcgSVRlc3RSZXN1bHRbXXt9KVswXS5nZXRUZXN0TmFtZSgpOworICAgICAgICBidWZmLmFwcGVuZCgiPHRkPjxhIGhyZWY9XCIjbSIgKyBtX21ldGhvZEluZGV4ICsgIlwiPiIKKyAgICAgICAgICAgICsgcXVhbGlmaWVkTmFtZShtZXRob2QpCisgICAgICAgICAgICArICIgIiArIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMAorICAgICAgICAgICAgICAgID8gIihcIiIgKyBkZXNjcmlwdGlvbiArICJcIikiCisgICAgICAgICAgICAgICAgOiAiIikKKyAgICAgICAgICAgICsgIjwvYT4iICsgKG51bGwgPT0gdGVzdEluc3RhbmNlTmFtZSA/ICIiIDogIjxicj4oIiArIHRlc3RJbnN0YW5jZU5hbWUgKyAiKSIpCisgICAgICAgICAgICArICI8L3RkPiIKKyAgICAgICAgICAgICsgIjx0ZCBjbGFzcz1cIm51bWlcIj4iICsgcmVzdWx0U2V0LnNpemUoKSArICI8L3RkPiIKKyAgICAgICAgICAgICsgIjx0ZD4iICsgc3RhcnQgKyAiPC90ZD4iCisgICAgICAgICAgICArICI8dGQgY2xhc3M9XCJudW1pXCI+IiArIChlbmQgLSBzdGFydCkgKyAiPC90ZD4iCisgICAgICAgICAgICArICI8L3RyPiIpOworICAgICAgfQorICAgICAgaWYgKG1xID4gMCkgeworICAgICAgICBjcSArPSAxOworICAgICAgICBtX291dC5wcmludCgiPHRyIGNsYXNzPVwiIiArIHN0eWxlICsgKGNxICUgMiA9PSAwID8gImV2ZW4iIDogIm9kZCIpCisgICAgICAgICAgICArICJcIj4iICsgIjx0ZCIpOworICAgICAgICBpZiAobXEgPiAxKSB7CisgICAgICAgICAgbV9vdXQucHJpbnQoIiByb3dzcGFuPVwiIiArIG1xICsgIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgbV9vdXQucHJpbnRsbigiPiIgKyBsYXN0Q2xhc3NOYW1lICsgIjwvdGQ+IiArIGJ1ZmYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKiBTdGFydHMgYW5kIGRlZmluZXMgY29sdW1ucyByZXN1bHQgc3VtbWFyeSB0YWJsZSAqLworICBwcml2YXRlIHZvaWQgc3RhcnRSZXN1bHRTdW1tYXJ5VGFibGUoU3RyaW5nIHN0eWxlKSB7CisgICAgdGFibGVTdGFydChzdHlsZSwgInN1bW1hcnkiKTsKKyAgICBtX291dC5wcmludGxuKCI8dHI+PHRoPkNsYXNzPC90aD4iCisgICAgICAgICAgICArICI8dGg+TWV0aG9kPC90aD48dGg+IyBvZjxici8+U2NlbmFyaW9zPC90aD48dGg+U3RhcnQ8L3RoPjx0aD5UaW1lPGJyLz4obXMpPC90aD48L3RyPiIpOworICAgIG1fcm93ID0gMDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWUoSVRlc3ROR01ldGhvZCBtZXRob2QpIHsKKyAgICBTdHJpbmdCdWlsZGVyIGFkZG9uID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTdHJpbmdbXSBncm91cHMgPSBtZXRob2QuZ2V0R3JvdXBzKCk7CisgICAgaW50IGxlbmd0aCA9IGdyb3Vwcy5sZW5ndGg7CisgICAgaWYgKGxlbmd0aCA+IDAgJiYgISJiYXNpYyIuZXF1YWxzSWdub3JlQ2FzZShncm91cHNbMF0pKSB7CisgICAgICBhZGRvbi5hcHBlbmQoIigiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgYWRkb24uYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgICAgYWRkb24uYXBwZW5kKGdyb3Vwc1tpXSk7CisgICAgICAgIH0KKyAgICAgIGFkZG9uLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHJldHVybiAiPGI+IiArIG1ldGhvZC5nZXRNZXRob2ROYW1lKCkgKyAiPC9iPiAiICsgYWRkb247CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVzdWx0RGV0YWlsKElSZXN1bHRNYXAgdGVzdHMpIHsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHJlc3VsdCA6IHRlc3RzLmdldEFsbFJlc3VsdHMoKSkgeworICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QgPSByZXN1bHQuZ2V0TWV0aG9kKCk7CisgICAgICAgIG1fbWV0aG9kSW5kZXgrKzsKKyAgICAgICAgU3RyaW5nIGNuYW1lID0gbWV0aG9kLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgbV9vdXQucHJpbnRsbigiPGgyIGlkPVwibSIgKyBtX21ldGhvZEluZGV4ICsgIlwiPiIgKyBjbmFtZSArICI6IgorICAgICAgICAgICAgKyBtZXRob2QuZ2V0TWV0aG9kTmFtZSgpICsgIjwvaDI+Iik7CisgICAgICAgIFNldDxJVGVzdFJlc3VsdD4gcmVzdWx0U2V0ID0gdGVzdHMuZ2V0UmVzdWx0cyhtZXRob2QpOworICAgICAgICBnZW5lcmF0ZUZvclJlc3VsdChyZXN1bHQsIG1ldGhvZCwgcmVzdWx0U2V0LnNpemUoKSk7CisgICAgICAgIG1fb3V0LnByaW50bG4oIjxwIGNsYXNzPVwidG90b3BcIj48YSBocmVmPVwiI3N1bW1hcnlcIj5iYWNrIHRvIHN1bW1hcnk8L2E+PC9wPiIpOworCisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRm9yUmVzdWx0KElUZXN0UmVzdWx0IGFucywgSVRlc3ROR01ldGhvZCBtZXRob2QsIGludCByZXN1bHRTZXRTaXplKSB7CisgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IGFucy5nZXRQYXJhbWV0ZXJzKCk7CisgICAgYm9vbGVhbiBoYXNQYXJhbWV0ZXJzID0gcGFyYW1ldGVycyAhPSBudWxsICYmIHBhcmFtZXRlcnMubGVuZ3RoID4gMDsKKyAgICBpZiAoaGFzUGFyYW1ldGVycykgeworICAgICAgdGFibGVTdGFydCgicmVzdWx0IiwgbnVsbCk7CisgICAgICBtX291dC5wcmludCgiPHRyIGNsYXNzPVwicGFyYW1cIj4iKTsKKyAgICAgIGZvciAoaW50IHggPSAxOyB4IDw9IHBhcmFtZXRlcnMubGVuZ3RoOyB4KyspIHsKKyAgICAgICAgbV9vdXQucHJpbnQoIjx0aD5QYXJhbWV0ZXIgIyIgKyB4ICsgIjwvdGg+Iik7CisgICAgICB9CisgICAgICBtX291dC5wcmludGxuKCI8L3RyPiIpOworICAgICAgbV9vdXQucHJpbnQoIjx0ciBjbGFzcz1cInBhcmFtIHN0cmlwZVwiPiIpOworICAgICAgZm9yIChPYmplY3QgcCA6IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgbV9vdXQucHJpbnRsbigiPHRkPiIgKyBVdGlscy5lc2NhcGVIdG1sKFV0aWxzLnRvU3RyaW5nKHApKSArICI8L3RkPiIpOworICAgICAgfQorICAgICAgbV9vdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IG1zZ3MgPSBSZXBvcnRlci5nZXRPdXRwdXQoYW5zKTsKKyAgICBib29sZWFuIGhhc1JlcG9ydGVyT3V0cHV0ID0gbXNncy5zaXplKCkgPiAwOworICAgIFRocm93YWJsZSBleGNlcHRpb249YW5zLmdldFRocm93YWJsZSgpOworICAgIGJvb2xlYW4gaGFzVGhyb3dhYmxlID0gZXhjZXB0aW9uIT1udWxsOworICAgIGlmIChoYXNSZXBvcnRlck91dHB1dHx8aGFzVGhyb3dhYmxlKSB7CisgICAgICBpZiAoaGFzUGFyYW1ldGVycykgeworICAgICAgICBtX291dC5wcmludCgiPHRyPjx0ZCIpOworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAxKSB7CisgICAgICAgICAgbV9vdXQucHJpbnQoIiBjb2xzcGFuPVwiIiArIHBhcmFtZXRlcnMubGVuZ3RoICsgIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgbV9vdXQucHJpbnRsbigiPiIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIG1fb3V0LnByaW50bG4oIjxkaXY+Iik7CisgICAgICB9CisgICAgICBpZiAoaGFzUmVwb3J0ZXJPdXRwdXQpIHsKKyAgICAgICAgaWYoaGFzVGhyb3dhYmxlKSB7CisgICAgICAgICAgbV9vdXQucHJpbnRsbigiPGgzPlRlc3QgTWVzc2FnZXM8L2gzPiIpOworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBtc2dzKSB7CisgICAgICAgICAgbV9vdXQucHJpbnRsbihsaW5lICsgIjxici8+Iik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKGhhc1Rocm93YWJsZSkgeworICAgICAgICBib29sZWFuIHdhbnRzTWluaW1hbE91dHB1dCA9IGFucy5nZXRTdGF0dXMoKT09SVRlc3RSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgaWYoaGFzUmVwb3J0ZXJPdXRwdXQpIHsKKyAgICAgICAgICBtX291dC5wcmludGxuKCI8aDM+IgorICAgICAgICAgICAgICArKHdhbnRzTWluaW1hbE91dHB1dD8iRXhwZWN0ZWQgRXhjZXB0aW9uIjoiRmFpbHVyZSIpCisgICAgICAgICAgICAgICsiPC9oMz4iKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZUV4Y2VwdGlvblJlcG9ydChleGNlcHRpb24sbWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIGlmIChoYXNQYXJhbWV0ZXJzKSB7CisgICAgICAgIG1fb3V0LnByaW50bG4oIjwvdGQ+PC90cj4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBtX291dC5wcmludGxuKCI8L2Rpdj4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc1BhcmFtZXRlcnMpIHsKKyAgICAgIG1fb3V0LnByaW50bG4oIjwvdGFibGU+Iik7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFeGNlcHRpb25SZXBvcnQoVGhyb3dhYmxlIGV4Y2VwdGlvbixJVGVzdE5HTWV0aG9kIG1ldGhvZCkgeworICAgIG1fb3V0LnByaW50KCI8ZGl2IGNsYXNzPVwic3RhY2t0cmFjZVwiPiIpOworICAgIG1fb3V0LnByaW50KFV0aWxzLnN0YWNrVHJhY2UoZXhjZXB0aW9uLCB0cnVlKVswXSk7CisgICAgbV9vdXQucHJpbnRsbigiPC9kaXY+Iik7CisgIH0KKworICAvKioKKyAgICogU2luY2UgdGhlIG1ldGhvZHMgd2lsbCBiZSBzb3J0ZWQgY2hyb25vbG9naWNhbGx5LCB3ZSB3YW50IHRvIHJldHVybgorICAgKiB0aGUgSVRlc3ROR01ldGhvZCBmcm9tIHRoZSBpbnZva2VkIG1ldGhvZHMuCisgICAqLworICBwcml2YXRlIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gZ2V0TWV0aG9kU2V0KElSZXN1bHRNYXAgdGVzdHMsIElTdWl0ZSBzdWl0ZSkgeworICAgIExpc3Q8SUludm9rZWRNZXRob2Q+IHIgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PElJbnZva2VkTWV0aG9kPiBpbnZva2VkTWV0aG9kcyA9IHN1aXRlLmdldEFsbEludm9rZWRNZXRob2RzKCk7CisgICAgZm9yIChJSW52b2tlZE1ldGhvZCBpbSA6IGludm9rZWRNZXRob2RzKSB7CisgICAgICBpZiAodGVzdHMuZ2V0QWxsTWV0aG9kcygpLmNvbnRhaW5zKGltLmdldFRlc3RNZXRob2QoKSkpIHsKKyAgICAgICAgci5hZGQoaW0pOworICAgICAgfQorICAgIH0KKyAgICBBcnJheXMuc29ydChyLnRvQXJyYXkobmV3IElJbnZva2VkTWV0aG9kW3Iuc2l6ZSgpXSksIG5ldyBUZXN0U29ydGVyKCkpOworICAgIExpc3Q8SVRlc3ROR01ldGhvZD4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAvLyBBZGQgYWxsIHRoZSBpbnZva2VkIG1ldGhvZHMKKyAgICBmb3IgKElJbnZva2VkTWV0aG9kIG0gOiByKSB7CisgICAgICByZXN1bHQuYWRkKG0uZ2V0VGVzdE1ldGhvZCgpKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYWxsIHRoZSBtZXRob2RzIHRoYXQgd2VyZW4ndCBpbnZva2VkIChlLmcuIHNraXBwZWQpIHRoYXQgd2UKKyAgICAvLyBoYXZlbid0IGFkZGVkIHlldAorICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogdGVzdHMuZ2V0QWxsTWV0aG9kcygpKSB7CisgICAgICBpZiAoIXJlc3VsdC5jb250YWlucyhtKSkgeworICAgICAgICByZXN1bHQuYWRkKG0pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVTdWl0ZVN1bW1hcnlSZXBvcnQoTGlzdDxJU3VpdGU+IHN1aXRlcykgeworICAgIHRhYmxlU3RhcnQoInRlc3RPdmVydmlldyIsIG51bGwpOworICAgIG1fb3V0LnByaW50KCI8dHI+Iik7CisgICAgdGFibGVDb2x1bW5TdGFydCgiVGVzdCIpOworICAgIHRhYmxlQ29sdW1uU3RhcnQoIk1ldGhvZHM8YnIvPlBhc3NlZCIpOworICAgIHRhYmxlQ29sdW1uU3RhcnQoIlNjZW5hcmlvczxici8+UGFzc2VkIik7CisgICAgdGFibGVDb2x1bW5TdGFydCgiIyBza2lwcGVkIik7CisgICAgdGFibGVDb2x1bW5TdGFydCgiIyBmYWlsZWQiKTsKKyAgICB0YWJsZUNvbHVtblN0YXJ0KCJUb3RhbDxici8+VGltZSIpOworICAgIHRhYmxlQ29sdW1uU3RhcnQoIkluY2x1ZGVkPGJyLz5Hcm91cHMiKTsKKyAgICB0YWJsZUNvbHVtblN0YXJ0KCJFeGNsdWRlZDxici8+R3JvdXBzIik7CisgICAgbV9vdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICBOdW1iZXJGb3JtYXQgZm9ybWF0dGVyID0gbmV3IERlY2ltYWxGb3JtYXQoIiMsIyMwLjAiKTsKKyAgICBpbnQgcXR5X3Rlc3RzID0gMDsKKyAgICBpbnQgcXR5X3Bhc3NfbSA9IDA7CisgICAgaW50IHF0eV9wYXNzX3MgPSAwOworICAgIGludCBxdHlfc2tpcCA9IDA7CisgICAgaW50IHF0eV9mYWlsID0gMDsKKyAgICBsb25nIHRpbWVfc3RhcnQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICBsb25nIHRpbWVfZW5kID0gTG9uZy5NSU5fVkFMVUU7CisgICAgbV90ZXN0SW5kZXggPSAxOworICAgIGZvciAoSVN1aXRlIHN1aXRlIDogc3VpdGVzKSB7CisgICAgICBpZiAoc3VpdGVzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgdGl0bGVSb3coc3VpdGUuZ2V0TmFtZSgpLCA4KTsKKyAgICAgIH0KKyAgICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gdGVzdHMgPSBzdWl0ZS5nZXRSZXN1bHRzKCk7CisgICAgICBmb3IgKElTdWl0ZVJlc3VsdCByIDogdGVzdHMudmFsdWVzKCkpIHsKKyAgICAgICAgcXR5X3Rlc3RzICs9IDE7CisgICAgICAgIElUZXN0Q29udGV4dCBvdmVydmlldyA9IHIuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgc3RhcnRTdW1tYXJ5Um93KG92ZXJ2aWV3LmdldE5hbWUoKSk7CisgICAgICAgIGludCBxID0gZ2V0TWV0aG9kU2V0KG92ZXJ2aWV3LmdldFBhc3NlZFRlc3RzKCksIHN1aXRlKS5zaXplKCk7CisgICAgICAgIHF0eV9wYXNzX20gKz0gcTsKKyAgICAgICAgc3VtbWFyeUNlbGwocSxJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIHEgPSBvdmVydmlldy5nZXRQYXNzZWRUZXN0cygpLnNpemUoKTsKKyAgICAgICAgcXR5X3Bhc3NfcyArPSBxOworICAgICAgICBzdW1tYXJ5Q2VsbChxLEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgcSA9IGdldE1ldGhvZFNldChvdmVydmlldy5nZXRTa2lwcGVkVGVzdHMoKSwgc3VpdGUpLnNpemUoKTsKKyAgICAgICAgcXR5X3NraXAgKz0gcTsKKyAgICAgICAgc3VtbWFyeUNlbGwocSwwKTsKKyAgICAgICAgcSA9IGdldE1ldGhvZFNldChvdmVydmlldy5nZXRGYWlsZWRUZXN0cygpLCBzdWl0ZSkuc2l6ZSgpOworICAgICAgICBxdHlfZmFpbCArPSBxOworICAgICAgICBzdW1tYXJ5Q2VsbChxLDApOworICAgICAgICB0aW1lX3N0YXJ0ID0gTWF0aC5taW4ob3ZlcnZpZXcuZ2V0U3RhcnREYXRlKCkuZ2V0VGltZSgpLCB0aW1lX3N0YXJ0KTsKKyAgICAgICAgdGltZV9lbmQgPSBNYXRoLm1heChvdmVydmlldy5nZXRFbmREYXRlKCkuZ2V0VGltZSgpLCB0aW1lX2VuZCk7CisgICAgICAgIHN1bW1hcnlDZWxsKGZvcm1hdHRlci5mb3JtYXQoCisgICAgICAgICAgICAob3ZlcnZpZXcuZ2V0RW5kRGF0ZSgpLmdldFRpbWUoKSAtIG92ZXJ2aWV3LmdldFN0YXJ0RGF0ZSgpLmdldFRpbWUoKSkgLyAxMDAwLikKKyAgICAgICAgICAgICsgIiBzZWNvbmRzIiwgdHJ1ZSk7CisgICAgICAgIHN1bW1hcnlDZWxsKG92ZXJ2aWV3LmdldEluY2x1ZGVkR3JvdXBzKCkpOworICAgICAgICBzdW1tYXJ5Q2VsbChvdmVydmlldy5nZXRFeGNsdWRlZEdyb3VwcygpKTsKKyAgICAgICAgbV9vdXQucHJpbnRsbigiPC90cj4iKTsKKyAgICAgICAgbV90ZXN0SW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHF0eV90ZXN0cyA+IDEpIHsKKyAgICAgIG1fb3V0LnByaW50bG4oIjx0ciBjbGFzcz1cInRvdGFsXCI+PHRkPlRvdGFsPC90ZD4iKTsKKyAgICAgIHN1bW1hcnlDZWxsKHF0eV9wYXNzX20sSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgc3VtbWFyeUNlbGwocXR5X3Bhc3NfcyxJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICBzdW1tYXJ5Q2VsbChxdHlfc2tpcCwwKTsKKyAgICAgIHN1bW1hcnlDZWxsKHF0eV9mYWlsLDApOworICAgICAgc3VtbWFyeUNlbGwoZm9ybWF0dGVyLmZvcm1hdCgodGltZV9lbmQgLSB0aW1lX3N0YXJ0KSAvIDEwMDAuKSArICIgc2Vjb25kcyIsIHRydWUpOworICAgICAgbV9vdXQucHJpbnRsbigiPHRkIGNvbHNwYW49XCIyXCI+Jm5ic3A7PC90ZD48L3RyPiIpOworICAgIH0KKyAgICBtX291dC5wcmludGxuKCI8L3RhYmxlPiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN1bW1hcnlDZWxsKFN0cmluZ1tdIHZhbCkgeworICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGZvciAoU3RyaW5nIHYgOiB2YWwpIHsKKyAgICAgIGIuYXBwZW5kKHYgKyAiICIpOworICAgIH0KKyAgICBzdW1tYXJ5Q2VsbChiLnRvU3RyaW5nKCksdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3VtbWFyeUNlbGwoU3RyaW5nIHYsYm9vbGVhbiBpc2dvb2QpIHsKKyAgICBtX291dC5wcmludCgiPHRkIGNsYXNzPVwibnVtaSIrKGlzZ29vZD8iIjoiX2F0dG4iKSsiXCI+IiArIHYgKyAiPC90ZD4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFN1bW1hcnlSb3coU3RyaW5nIGxhYmVsKSB7CisgICAgbV9yb3cgKz0gMTsKKyAgICBtX291dC5wcmludCgiPHRyIiArIChtX3JvdyAlIDIgPT0gMCA/ICIgY2xhc3M9XCJzdHJpcGVcIiIgOiAiIikKKyAgICAgICAgICAgICsgIj48dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZy1yaWdodDoyZW1cIj48YSBocmVmPVwiI3QiCisgICAgICAgICAgICArIG1fdGVzdEluZGV4ICsgIlwiPiIgKyBsYWJlbCArICI8L2E+IgorICAgICAgICAgICAgKyAiPC90ZD4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdW1tYXJ5Q2VsbChpbnQgdixpbnQgbWF4ZXhwZWN0ZWQpIHsKKyAgICBzdW1tYXJ5Q2VsbChTdHJpbmcudmFsdWVPZih2KSx2PD1tYXhleHBlY3RlZCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGFibGVTdGFydChTdHJpbmcgY3NzY2xhc3MsIFN0cmluZyBpZCkgeworICAgIG1fb3V0LnByaW50bG4oIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiIKKyAgICAgICAgKyAoY3NzY2xhc3MgIT0gbnVsbCA/ICIgY2xhc3M9XCIiICsgY3NzY2xhc3MgKyAiXCIiCisgICAgICAgICAgICA6ICIgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbToyZW1cIiIpCisgICAgICAgICsgKGlkICE9IG51bGwgPyAiIGlkPVwiIiArIGlkICsgIlwiIiA6ICIiKQorICAgICAgICArICI+Iik7CisgICAgbV9yb3cgPSAwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRhYmxlQ29sdW1uU3RhcnQoU3RyaW5nIGxhYmVsKSB7CisgICAgbV9vdXQucHJpbnQoIjx0aD4iICsgbGFiZWwgKyAiPC90aD4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0aXRsZVJvdyhTdHJpbmcgbGFiZWwsIGludCBjcSkgeworICAgIHRpdGxlUm93KGxhYmVsLCBjcSwgbnVsbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGl0bGVSb3coU3RyaW5nIGxhYmVsLCBpbnQgY3EsIFN0cmluZyBpZCkgeworICAgIG1fb3V0LnByaW50KCI8dHIiKTsKKyAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgbV9vdXQucHJpbnQoIiBpZD1cIiIgKyBpZCArICJcIiIpOworICAgIH0KKyAgICBtX291dC5wcmludGxuKCAiPjx0aCBjb2xzcGFuPVwiIiArIGNxICsgIlwiPiIgKyBsYWJlbCArICI8L3RoPjwvdHI+Iik7CisgICAgbV9yb3cgPSAwOworICB9CisKKyAgLyoqIFN0YXJ0cyBIVE1MIHN0cmVhbSAqLworICBwcm90ZWN0ZWQgdm9pZCBzdGFydEh0bWwoUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgb3V0LnByaW50bG4oIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkXCI+Iik7CisgICAgb3V0LnByaW50bG4oIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIpOworICAgIG91dC5wcmludGxuKCI8aGVhZD4iKTsKKyAgICBvdXQucHJpbnRsbigiPHRpdGxlPlRlc3RORyBSZXBvcnQ8L3RpdGxlPiIpOworICAgIG91dC5wcmludGxuKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7CisgICAgb3V0LnByaW50bG4oInRhYmxlIHttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2VtcHR5LWNlbGxzOnNob3d9Iik7CisgICAgb3V0LnByaW50bG4oInRkLHRoIHtib3JkZXI6MXB4IHNvbGlkICMwMDk7cGFkZGluZzouMjVlbSAuNWVtfSIpOworICAgIG91dC5wcmludGxuKCIucmVzdWx0IHRoIHt2ZXJ0aWNhbC1hbGlnbjpib3R0b219Iik7CisgICAgb3V0LnByaW50bG4oIi5wYXJhbSB0aCB7cGFkZGluZy1sZWZ0OjFlbTtwYWRkaW5nLXJpZ2h0OjFlbX0iKTsKKyAgICBvdXQucHJpbnRsbigiLnBhcmFtIHRkIHtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0OjJlbX0iKTsKKyAgICBvdXQucHJpbnRsbigiLnN0cmlwZSB0ZCwuc3RyaXBlIHRoIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRTZFQkY5fSIpOworICAgIG91dC5wcmludGxuKCIubnVtaSwubnVtaV9hdHRuIHt0ZXh0LWFsaWduOnJpZ2h0fSIpOworICAgIG91dC5wcmludGxuKCIudG90YWwgdGQge2ZvbnQtd2VpZ2h0OmJvbGR9Iik7CisgICAgb3V0LnByaW50bG4oIi5wYXNzZWRvZGQgdGQge2JhY2tncm91bmQtY29sb3I6ICMwQTB9Iik7CisgICAgb3V0LnByaW50bG4oIi5wYXNzZWRldmVuIHRkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjM0YzfSIpOworICAgIG91dC5wcmludGxuKCIuc2tpcHBlZG9kZCB0ZCB7YmFja2dyb3VuZC1jb2xvcjogI0NDQ30iKTsKKyAgICBvdXQucHJpbnRsbigiLnNraXBwZWRvZGQgdGQge2JhY2tncm91bmQtY29sb3I6ICNERER9Iik7CisgICAgb3V0LnByaW50bG4oIi5mYWlsZWRvZGQgdGQsLm51bWlfYXR0biB7YmFja2dyb3VuZC1jb2xvcjogI0YzM30iKTsKKyAgICBvdXQucHJpbnRsbigiLmZhaWxlZGV2ZW4gdGQsLnN0cmlwZSAubnVtaV9hdHRuIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRDAwfSIpOworICAgIG91dC5wcmludGxuKCIuc3RhY2t0cmFjZSB7d2hpdGUtc3BhY2U6cHJlO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0iKTsKKyAgICBvdXQucHJpbnRsbigiLnRvdG9wIHtmb250LXNpemU6ODUlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMwMDB9Iik7CisgICAgb3V0LnByaW50bG4oIjwvc3R5bGU+Iik7CisgICAgb3V0LnByaW50bG4oIjwvaGVhZD4iKTsKKyAgICBvdXQucHJpbnRsbigiPGJvZHk+Iik7CisgIH0KKworICAvKiogRmluaXNoZXMgSFRNTCBzdHJlYW0gKi8KKyAgcHJvdGVjdGVkIHZvaWQgZW5kSHRtbChQcmludFdyaXRlciBvdXQpIHsKKyAgICBvdXQucHJpbnRsbigiPC9ib2R5PjwvaHRtbD4iKTsKKyAgfQorCisgIC8vIH4gSW5uZXIgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKiogQXJyYW5nZXMgbWV0aG9kcyBieSBjbGFzc25hbWUgYW5kIG1ldGhvZCBuYW1lICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RTb3J0ZXIgaW1wbGVtZW50cyBDb21wYXJhdG9yPElJbnZva2VkTWV0aG9kPiB7CisgICAgLy8gfiBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKiBBcnJhbmdlcyBtZXRob2RzIGJ5IGNsYXNzbmFtZSBhbmQgbWV0aG9kIG5hbWUgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUludm9rZWRNZXRob2QgbzEsIElJbnZva2VkTWV0aG9kIG8yKSB7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyaW5nICIgKyBvMS5nZXRNZXRob2ROYW1lKCkgKyAiICIgKyBvMS5nZXREYXRlKCkKKy8vICAgICAgICAgICsgIiBhbmQgIiArIG8yLmdldE1ldGhvZE5hbWUoKSArICIgIiArIG8yLmdldERhdGUoKSk7CisgICAgICByZXR1cm4gKGludCkgKG8xLmdldERhdGUoKSAtIG8yLmdldERhdGUoKSk7CisvLyAgICAgIGludCByID0gKChUKSBvMSkuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKFQpIG8yKS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCkpOworLy8gICAgICBpZiAociA9PSAwKSB7CisvLyAgICAgICAgciA9ICgoVCkgbzEpLmdldE1ldGhvZE5hbWUoKS5jb21wYXJlVG8oKChUKSBvMikuZ2V0TWV0aG9kTmFtZSgpKTsKKy8vICAgICAgfQorLy8gICAgICByZXR1cm4gcjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRW1haWxhYmxlUmVwb3J0ZXIyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0VtYWlsYWJsZVJlcG9ydGVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjc2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0VtYWlsYWJsZVJlcG9ydGVyMi5qYXZhCkBAIC0wLDAgKzEsODM0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5sb2c0dGVzdG5nLkxvZ2dlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworLyoqCisgKiBSZXBvcnRlciB0aGF0IGdlbmVyYXRlcyBhIHNpbmdsZS1wYWdlIEhUTUwgcmVwb3J0IG9mIHRoZSB0ZXN0IHJlc3VsdHMuCisgKiA8cD4KKyAqIEJhc2VkIG9uIGFuIGVhcmxpZXIgaW1wbGVtZW50YXRpb24gYnkgUGF1bCBNZW5kZWxzb24uCisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgQWJyYWhhbSBMaW4KKyAqLworcHVibGljIGNsYXNzIEVtYWlsYWJsZVJlcG9ydGVyMiBpbXBsZW1lbnRzIElSZXBvcnRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRW1haWxhYmxlUmVwb3J0ZXIuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIHdyaXRlcjsKKworICAgIHByb3RlY3RlZCBMaXN0PFN1aXRlUmVzdWx0PiBzdWl0ZVJlc3VsdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIC8vIFJldXNhYmxlIGJ1ZmZlcgorICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLAorICAgICAgICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBvdXRwdXQgZmlsZSIsIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoSVN1aXRlIHN1aXRlIDogc3VpdGVzKSB7CisgICAgICAgICAgICBzdWl0ZVJlc3VsdHMuYWRkKG5ldyBTdWl0ZVJlc3VsdChzdWl0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVEb2N1bWVudFN0YXJ0KCk7CisgICAgICAgIHdyaXRlSGVhZCgpOworICAgICAgICB3cml0ZUJvZHkoKTsKKyAgICAgICAgd3JpdGVEb2N1bWVudEVuZCgpOworCisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcmludFdyaXRlciBjcmVhdGVXcml0ZXIoU3RyaW5nIG91dGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IEZpbGUob3V0ZGlyKS5ta2RpcnMoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoCisgICAgICAgICAgICAgICAgb3V0ZGlyLCAiZW1haWxhYmxlLXJlcG9ydC5odG1sIikpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVEb2N1bWVudFN0YXJ0KCkgeworICAgICAgICB3cml0ZXIucHJpbnRsbigiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGRcIj4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUhlYWQoKSB7CisgICAgICAgIHdyaXRlci5wcmludCgiPGhlYWQ+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRpdGxlPlRlc3RORyBSZXBvcnQ8L3RpdGxlPiIpOworICAgICAgICB3cml0ZVN0eWxlc2hlZXQoKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8L2hlYWQ+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTdHlsZXNoZWV0KCkgeworICAgICAgICB3cml0ZXIucHJpbnQoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCJ0YWJsZSB7bWFyZ2luLWJvdHRvbToxMHB4O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtlbXB0eS1jZWxsczpzaG93fSIpOworICAgICAgICB3cml0ZXIucHJpbnQoInRoLHRkIHtib3JkZXI6MXB4IHNvbGlkICMwMDk7cGFkZGluZzouMjVlbSAuNWVtfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoInRoIHt2ZXJ0aWNhbC1hbGlnbjpib3R0b219Iik7CisgICAgICAgIHdyaXRlci5wcmludCgidGQge3ZlcnRpY2FsLWFsaWduOnRvcH0iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCJ0YWJsZSBhIHtmb250LXdlaWdodDpib2xkfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoIi5zdHJpcGUgdGQge2JhY2tncm91bmQtY29sb3I6ICNFNkVCRjl9Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiLm51bSB7dGV4dC1hbGlnbjpyaWdodH0iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCIucGFzc2Vkb2RkIHRkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjM0YzfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoIi5wYXNzZWRldmVuIHRkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMEEwfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoIi5za2lwcGVkb2RkIHRkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjREREfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoIi5za2lwcGVkZXZlbiB0ZCB7YmFja2dyb3VuZC1jb2xvcjogI0NDQ30iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCIuZmFpbGVkb2RkIHRkLC5hdHRuIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRjMzfSIpOworICAgICAgICB3cml0ZXIucHJpbnQoIi5mYWlsZWRldmVuIHRkLC5zdHJpcGUgLmF0dG4ge2JhY2tncm91bmQtY29sb3I6ICNEMDB9Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiLnN0YWNrdHJhY2Uge3doaXRlLXNwYWNlOnByZTtmb250LWZhbWlseTptb25vc3BhY2V9Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiLnRvdG9wIHtmb250LXNpemU6ODUlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMwMDB9Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPC9zdHlsZT4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUJvZHkoKSB7CisgICAgICAgIHdyaXRlci5wcmludCgiPGJvZHk+Iik7CisgICAgICAgIHdyaXRlU3VpdGVTdW1tYXJ5KCk7CisgICAgICAgIHdyaXRlU2NlbmFyaW9TdW1tYXJ5KCk7CisgICAgICAgIHdyaXRlU2NlbmFyaW9EZXRhaWxzKCk7CisgICAgICAgIHdyaXRlci5wcmludCgiPC9ib2R5PiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRG9jdW1lbnRFbmQoKSB7CisgICAgICAgIHdyaXRlci5wcmludCgiPC9odG1sPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU3VpdGVTdW1tYXJ5KCkgeworICAgICAgICBOdW1iZXJGb3JtYXQgaW50ZWdlckZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRJbnRlZ2VySW5zdGFuY2UoKTsKKyAgICAgICAgTnVtYmVyRm9ybWF0IGRlY2ltYWxGb3JtYXQgPSBOdW1iZXJGb3JtYXQuZ2V0TnVtYmVySW5zdGFuY2UoKTsKKworICAgICAgICBpbnQgdG90YWxQYXNzZWRUZXN0cyA9IDA7CisgICAgICAgIGludCB0b3RhbFNraXBwZWRUZXN0cyA9IDA7CisgICAgICAgIGludCB0b3RhbEZhaWxlZFRlc3RzID0gMDsKKyAgICAgICAgbG9uZyB0b3RhbER1cmF0aW9uID0gMDsKKworICAgICAgICB3cml0ZXIucHJpbnQoIjx0YWJsZT4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dHI+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRoPlRlc3Q8L3RoPiIpOworICAgICAgICB3cml0ZXIucHJpbnQoIjx0aD4jIFBhc3NlZDwvdGg+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRoPiMgU2tpcHBlZDwvdGg+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRoPiMgRmFpbGVkPC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dGg+VGltZSAobXMpPC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dGg+SW5jbHVkZWQgR3JvdXBzPC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dGg+RXhjbHVkZWQgR3JvdXBzPC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8L3RyPiIpOworCisgICAgICAgIGludCB0ZXN0SW5kZXggPSAwOworICAgICAgICBmb3IgKFN1aXRlUmVzdWx0IHN1aXRlUmVzdWx0IDogc3VpdGVSZXN1bHRzKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0cj48dGggY29sc3Bhbj1cIjdcIj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChVdGlscy5lc2NhcGVIdG1sKHN1aXRlUmVzdWx0LmdldFN1aXRlTmFtZSgpKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGg+PC90cj4iKTsKKworICAgICAgICAgICAgZm9yIChUZXN0UmVzdWx0IHRlc3RSZXN1bHQgOiBzdWl0ZVJlc3VsdC5nZXRUZXN0UmVzdWx0cygpKSB7CisgICAgICAgICAgICAgICAgaW50IHBhc3NlZFRlc3RzID0gdGVzdFJlc3VsdC5nZXRQYXNzZWRUZXN0Q291bnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZFRlc3RzID0gdGVzdFJlc3VsdC5nZXRTa2lwcGVkVGVzdENvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IGZhaWxlZFRlc3RzID0gdGVzdFJlc3VsdC5nZXRGYWlsZWRUZXN0Q291bnQoKTsKKyAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gdGVzdFJlc3VsdC5nZXREdXJhdGlvbigpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHIiKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRlc3RJbmRleCAlIDIpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY2xhc3M9XCJzdHJpcGVcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIj4iKTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgd3JpdGVUYWJsZURhdGEoYnVmZmVyLmFwcGVuZCgiPGEgaHJlZj1cIiN0IikuYXBwZW5kKHRlc3RJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFV0aWxzLmVzY2FwZUh0bWwodGVzdFJlc3VsdC5nZXRUZXN0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjwvYT4iKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRhYmxlRGF0YShpbnRlZ2VyRm9ybWF0LmZvcm1hdChwYXNzZWRUZXN0cyksICJudW0iKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRhYmxlRGF0YShpbnRlZ2VyRm9ybWF0LmZvcm1hdChza2lwcGVkVGVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHNraXBwZWRUZXN0cyA+IDAgPyAibnVtIGF0dG4iIDogIm51bSIpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRhYmxlRGF0YShpbnRlZ2VyRm9ybWF0LmZvcm1hdChmYWlsZWRUZXN0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAoZmFpbGVkVGVzdHMgPiAwID8gIm51bSBhdHRuIiA6ICJudW0iKSk7CisgICAgICAgICAgICAgICAgd3JpdGVUYWJsZURhdGEoZGVjaW1hbEZvcm1hdC5mb3JtYXQoZHVyYXRpb24pLCAibnVtIik7CisgICAgICAgICAgICAgICAgd3JpdGVUYWJsZURhdGEodGVzdFJlc3VsdC5nZXRJbmNsdWRlZEdyb3VwcygpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRhYmxlRGF0YSh0ZXN0UmVzdWx0LmdldEV4Y2x1ZGVkR3JvdXBzKCkpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RyPiIpOworCisgICAgICAgICAgICAgICAgdG90YWxQYXNzZWRUZXN0cyArPSBwYXNzZWRUZXN0czsKKyAgICAgICAgICAgICAgICB0b3RhbFNraXBwZWRUZXN0cyArPSBza2lwcGVkVGVzdHM7CisgICAgICAgICAgICAgICAgdG90YWxGYWlsZWRUZXN0cyArPSBmYWlsZWRUZXN0czsKKyAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IGR1cmF0aW9uOworCisgICAgICAgICAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmludCB0b3RhbHMgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgdGVzdAorICAgICAgICBpZiAodGVzdEluZGV4ID4gMSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHI+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0aD5Ub3RhbDwvdGg+Iik7CisgICAgICAgICAgICB3cml0ZVRhYmxlSGVhZGVyKGludGVnZXJGb3JtYXQuZm9ybWF0KHRvdGFsUGFzc2VkVGVzdHMpLCAibnVtIik7CisgICAgICAgICAgICB3cml0ZVRhYmxlSGVhZGVyKGludGVnZXJGb3JtYXQuZm9ybWF0KHRvdGFsU2tpcHBlZFRlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgKHRvdGFsU2tpcHBlZFRlc3RzID4gMCA/ICJudW0gYXR0biIgOiAibnVtIikpOworICAgICAgICAgICAgd3JpdGVUYWJsZUhlYWRlcihpbnRlZ2VyRm9ybWF0LmZvcm1hdCh0b3RhbEZhaWxlZFRlc3RzKSwKKyAgICAgICAgICAgICAgICAgICAgKHRvdGFsRmFpbGVkVGVzdHMgPiAwID8gIm51bSBhdHRuIiA6ICJudW0iKSk7CisgICAgICAgICAgICB3cml0ZVRhYmxlSGVhZGVyKGRlY2ltYWxGb3JtYXQuZm9ybWF0KHRvdGFsRHVyYXRpb24pLCAibnVtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0aCBjb2xzcGFuPVwiMlwiPjwvdGg+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvdHI+Iik7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGFibGU+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3VtbWFyeSBvZiBhbGwgdGhlIHRlc3Qgc2NlbmFyaW9zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2NlbmFyaW9TdW1tYXJ5KCkgeworICAgICAgICB3cml0ZXIucHJpbnQoIjx0YWJsZT4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dGhlYWQ+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRyPiIpOworICAgICAgICB3cml0ZXIucHJpbnQoIjx0aD5DbGFzczwvdGg+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRoPk1ldGhvZDwvdGg+Iik7CisgICAgICAgIHdyaXRlci5wcmludCgiPHRoPlN0YXJ0PC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8dGg+VGltZSAobXMpPC90aD4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8L3RyPiIpOworICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGhlYWQ+Iik7CisKKyAgICAgICAgaW50IHRlc3RJbmRleCA9IDA7CisgICAgICAgIGludCBzY2VuYXJpb0luZGV4ID0gMDsKKyAgICAgICAgZm9yIChTdWl0ZVJlc3VsdCBzdWl0ZVJlc3VsdCA6IHN1aXRlUmVzdWx0cykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dGJvZHk+PHRyPjx0aCBjb2xzcGFuPVwiNFwiPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KFV0aWxzLmVzY2FwZUh0bWwoc3VpdGVSZXN1bHQuZ2V0U3VpdGVOYW1lKCkpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90aD48L3RyPjwvdGJvZHk+Iik7CisKKyAgICAgICAgICAgIGZvciAoVGVzdFJlc3VsdCB0ZXN0UmVzdWx0IDogc3VpdGVSZXN1bHQuZ2V0VGVzdFJlc3VsdHMoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRib2R5IGlkPVwidCIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCh0ZXN0SW5kZXgpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCI+Iik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBVdGlscy5lc2NhcGVIdG1sKHRlc3RSZXN1bHQuZ2V0VGVzdE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICBzY2VuYXJpb0luZGV4ICs9IHdyaXRlU2NlbmFyaW9TdW1tYXJ5KHRlc3ROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgJiM4MjEyOyBmYWlsZWQgKGNvbmZpZ3VyYXRpb24gbWV0aG9kcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5nZXRGYWlsZWRDb25maWd1cmF0aW9uUmVzdWx0cygpLCAiZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvSW5kZXgpOworICAgICAgICAgICAgICAgIHNjZW5hcmlvSW5kZXggKz0gd3JpdGVTY2VuYXJpb1N1bW1hcnkodGVzdE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAmIzgyMTI7IGZhaWxlZCIsIHRlc3RSZXN1bHQuZ2V0RmFpbGVkVGVzdFJlc3VsdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQiLCBzY2VuYXJpb0luZGV4KTsKKyAgICAgICAgICAgICAgICBzY2VuYXJpb0luZGV4ICs9IHdyaXRlU2NlbmFyaW9TdW1tYXJ5KHRlc3ROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgJiM4MjEyOyBza2lwcGVkIChjb25maWd1cmF0aW9uIG1ldGhvZHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZ2V0U2tpcHBlZENvbmZpZ3VyYXRpb25SZXN1bHRzKCksICJza2lwcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5hcmlvSW5kZXgpOworICAgICAgICAgICAgICAgIHNjZW5hcmlvSW5kZXggKz0gd3JpdGVTY2VuYXJpb1N1bW1hcnkodGVzdE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAmIzgyMTI7IHNraXBwZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5nZXRTa2lwcGVkVGVzdFJlc3VsdHMoKSwgInNraXBwZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCk7CisgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCArPSB3cml0ZVNjZW5hcmlvU3VtbWFyeSh0ZXN0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICYjODIxMjsgcGFzc2VkIiwgdGVzdFJlc3VsdC5nZXRQYXNzZWRUZXN0UmVzdWx0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhc3NlZCIsIHNjZW5hcmlvSW5kZXgpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3Rib2R5PiIpOworCisgICAgICAgICAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGFibGU+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzY2VuYXJpbyBzdW1tYXJ5IGZvciB0aGUgcmVzdWx0cyBvZiBhIGdpdmVuIHN0YXRlIGZvciBhIHNpbmdsZQorICAgICAqIHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgd3JpdGVTY2VuYXJpb1N1bW1hcnkoU3RyaW5nIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgTGlzdDxDbGFzc1Jlc3VsdD4gY2xhc3NSZXN1bHRzLCBTdHJpbmcgY3NzQ2xhc3NQcmVmaXgsCisgICAgICAgICAgICBpbnQgc3RhcnRpbmdTY2VuYXJpb0luZGV4KSB7CisgICAgICAgIGludCBzY2VuYXJpb0NvdW50ID0gMDsKKyAgICAgICAgaWYgKCFjbGFzc1Jlc3VsdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0cj48dGggY29sc3Bhbj1cIjRcIj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChkZXNjcmlwdGlvbik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGg+PC90cj4iKTsKKworICAgICAgICAgICAgaW50IHNjZW5hcmlvSW5kZXggPSBzdGFydGluZ1NjZW5hcmlvSW5kZXg7CisgICAgICAgICAgICBpbnQgY2xhc3NJbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKENsYXNzUmVzdWx0IGNsYXNzUmVzdWx0IDogY2xhc3NSZXN1bHRzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNzc0NsYXNzID0gY3NzQ2xhc3NQcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKChjbGFzc0luZGV4ICUgMikgPT0gMCA/ICJldmVuIiA6ICJvZGQiKTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMCk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2NlbmFyaW9zUGVyQ2xhc3MgPSAwOworICAgICAgICAgICAgICAgIGludCBtZXRob2RJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChNZXRob2RSZXN1bHQgbWV0aG9kUmVzdWx0IDogY2xhc3NSZXN1bHQuZ2V0TWV0aG9kUmVzdWx0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMgPSBtZXRob2RSZXN1bHQuZ2V0UmVzdWx0cygpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0c0NvdW50ID0gcmVzdWx0cy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCByZXN1bHRzQ291bnQgPiAwOworCisgICAgICAgICAgICAgICAgICAgIElUZXN0UmVzdWx0IGZpcnN0UmVzdWx0ID0gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBVdGlscy5lc2NhcGVIdG1sKGZpcnN0UmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBmaXJzdFJlc3VsdC5nZXRTdGFydE1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uID0gZmlyc3RSZXN1bHQuZ2V0RW5kTWlsbGlzKCkgLSBzdGFydDsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgbWV0aG9kIHBlciBjbGFzcyBzaGFyZXMgYSByb3cgd2l0aCB0aGUgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx0ciBjbGFzcz1cIiIpLmFwcGVuZChjc3NDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCI+Iik7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gd2l0aCB0aGUgZmlyc3Qgc2NlbmFyaW8gcGVyCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8dGQ+PGEgaHJlZj1cIiNtIikuYXBwZW5kKHNjZW5hcmlvSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCI+IikuYXBwZW5kKG1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiPC9hPjwvdGQ+IikuYXBwZW5kKCI8dGQgcm93c3Bhbj1cIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXN1bHRzQ291bnQpLmFwcGVuZCgiXCI+IikuYXBwZW5kKHN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjwvdGQ+IikuYXBwZW5kKCI8dGQgcm93c3Bhbj1cIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXN1bHRzQ291bnQpLmFwcGVuZCgiXCI+IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGR1cmF0aW9uKS5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCsrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSByZW1haW5pbmcgc2NlbmFyaW9zIGZvciB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcmVzdWx0c0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjx0ciBjbGFzcz1cIiIpLmFwcGVuZChjc3NDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCI+IikuYXBwZW5kKCI8dGQ+PGEgaHJlZj1cIiNtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChzY2VuYXJpb0luZGV4KS5hcHBlbmQoIlwiPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWV0aG9kTmFtZSkuYXBwZW5kKCI8L2E+PC90ZD48L3RyPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9zUGVyQ2xhc3MgKz0gcmVzdWx0c0NvdW50OworICAgICAgICAgICAgICAgICAgICBtZXRob2RJbmRleCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSB0ZXN0IHJlc3VsdHMgZm9yIHRoZSBjbGFzcworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRyIGNsYXNzPVwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGNzc0NsYXNzKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRkIHJvd3NwYW49XCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoc2NlbmFyaW9zUGVyQ2xhc3MpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCI+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KFV0aWxzLmVzY2FwZUh0bWwoY2xhc3NSZXN1bHQuZ2V0Q2xhc3NOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBjbGFzc0luZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2VuYXJpb0NvdW50ID0gc2NlbmFyaW9JbmRleCAtIHN0YXJ0aW5nU2NlbmFyaW9JbmRleDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NlbmFyaW9Db3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRldGFpbHMgZm9yIGFsbCB0ZXN0IHNjZW5hcmlvcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNjZW5hcmlvRGV0YWlscygpIHsKKyAgICAgICAgaW50IHNjZW5hcmlvSW5kZXggPSAwOworICAgICAgICBmb3IgKFN1aXRlUmVzdWx0IHN1aXRlUmVzdWx0IDogc3VpdGVSZXN1bHRzKSB7CisgICAgICAgICAgICBmb3IgKFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA6IHN1aXRlUmVzdWx0LmdldFRlc3RSZXN1bHRzKCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMj4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoVXRpbHMuZXNjYXBlSHRtbCh0ZXN0UmVzdWx0LmdldFRlc3ROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvaDI+Iik7CisKKyAgICAgICAgICAgICAgICBzY2VuYXJpb0luZGV4ICs9IHdyaXRlU2NlbmFyaW9EZXRhaWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5nZXRGYWlsZWRDb25maWd1cmF0aW9uUmVzdWx0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCk7CisgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCArPSB3cml0ZVNjZW5hcmlvRGV0YWlscygKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZ2V0RmFpbGVkVGVzdFJlc3VsdHMoKSwgc2NlbmFyaW9JbmRleCk7CisgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCArPSB3cml0ZVNjZW5hcmlvRGV0YWlscygKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZ2V0U2tpcHBlZENvbmZpZ3VyYXRpb25SZXN1bHRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzY2VuYXJpb0luZGV4KTsKKyAgICAgICAgICAgICAgICBzY2VuYXJpb0luZGV4ICs9IHdyaXRlU2NlbmFyaW9EZXRhaWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5nZXRTa2lwcGVkVGVzdFJlc3VsdHMoKSwgc2NlbmFyaW9JbmRleCk7CisgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCArPSB3cml0ZVNjZW5hcmlvRGV0YWlscygKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZ2V0UGFzc2VkVGVzdFJlc3VsdHMoKSwgc2NlbmFyaW9JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHNjZW5hcmlvIGRldGFpbHMgZm9yIHRoZSByZXN1bHRzIG9mIGEgZ2l2ZW4gc3RhdGUgZm9yIGEgc2luZ2xlCisgICAgICogdGVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB3cml0ZVNjZW5hcmlvRGV0YWlscyhMaXN0PENsYXNzUmVzdWx0PiBjbGFzc1Jlc3VsdHMsCisgICAgICAgICAgICBpbnQgc3RhcnRpbmdTY2VuYXJpb0luZGV4KSB7CisgICAgICAgIGludCBzY2VuYXJpb0luZGV4ID0gc3RhcnRpbmdTY2VuYXJpb0luZGV4OworICAgICAgICBmb3IgKENsYXNzUmVzdWx0IGNsYXNzUmVzdWx0IDogY2xhc3NSZXN1bHRzKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NSZXN1bHQuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICBmb3IgKE1ldGhvZFJlc3VsdCBtZXRob2RSZXN1bHQgOiBjbGFzc1Jlc3VsdC5nZXRNZXRob2RSZXN1bHRzKCkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHRzID0gbWV0aG9kUmVzdWx0LmdldFJlc3VsdHMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIXJlc3VsdHMuaXNFbXB0eSgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lc2NhcGVIdG1sKGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3VsdHMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWV0aG9kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKElUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTY2VuYXJpbyhzY2VuYXJpb0luZGV4LCBsYWJlbCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgc2NlbmFyaW9JbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzY2VuYXJpb0luZGV4IC0gc3RhcnRpbmdTY2VuYXJpb0luZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZGV0YWlscyBmb3IgYW4gaW5kaXZpZHVhbCB0ZXN0IHNjZW5hcmlvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZVNjZW5hcmlvKGludCBzY2VuYXJpb0luZGV4LCBTdHJpbmcgbGFiZWwsCisgICAgICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8aDMgaWQ9XCJtIik7CisgICAgICAgIHdyaXRlci5wcmludChzY2VuYXJpb0luZGV4KTsKKyAgICAgICAgd3JpdGVyLnByaW50KCJcIj4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KGxhYmVsKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8L2gzPiIpOworCisgICAgICAgIHdyaXRlci5wcmludCgiPHRhYmxlIGNsYXNzPVwicmVzdWx0XCI+Iik7CisKKyAgICAgICAgLy8gV3JpdGUgdGVzdCBwYXJhbWV0ZXJzIChpZiBhbnkpCisgICAgICAgIE9iamVjdFtdIHBhcmFtZXRlcnMgPSByZXN1bHQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBpbnQgcGFyYW1ldGVyQ291bnQgPSAocGFyYW1ldGVycyA9PSBudWxsID8gMCA6IHBhcmFtZXRlcnMubGVuZ3RoKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlckNvdW50ID4gMCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHIgY2xhc3M9XCJwYXJhbVwiPiIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcGFyYW1ldGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRoPlBhcmFtZXRlciAjIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGkpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90aD4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90cj48dHIgY2xhc3M9XCJwYXJhbSBzdHJpcGVcIj4iKTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0ZD4iKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoVXRpbHMuZXNjYXBlSHRtbChVdGlscy50b1N0cmluZyhwYXJhbWV0ZXIpKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RkPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RyPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgcmVwb3J0ZXIgbWVzc2FnZXMgKGlmIGFueSkKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlcG9ydGVyTWVzc2FnZXMgPSBSZXBvcnRlci5nZXRPdXRwdXQocmVzdWx0KTsKKyAgICAgICAgaWYgKCFyZXBvcnRlck1lc3NhZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHI+PHRoIik7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY29sc3Bhbj1cIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChwYXJhbWV0ZXJDb3VudCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI+TWVzc2FnZXM8L3RoPjwvdHI+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHRyPjx0ZCIpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlckNvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIGNvbHNwYW49XCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocGFyYW1ldGVyQ291bnQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPiIpOworICAgICAgICAgICAgd3JpdGVSZXBvcnRlck1lc3NhZ2VzKHJlcG9ydGVyTWVzc2FnZXMpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L3RkPjwvdHI+Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBleGNlcHRpb24gKGlmIGFueSkKKyAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IHJlc3VsdC5nZXRUaHJvd2FibGUoKTsKKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0cj48dGgiKTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJDb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBjb2xzcGFuPVwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHBhcmFtZXRlckNvdW50KTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgocmVzdWx0LmdldFN0YXR1cygpID09IElUZXN0UmVzdWx0LlNVQ0NFU1MgPyAiRXhwZWN0ZWQgRXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICA6ICJFeGNlcHRpb24iKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvdGg+PC90cj4iKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHI+PHRkIik7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyQ291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY29sc3Bhbj1cIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChwYXJhbWV0ZXJDb3VudCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI+Iik7CisgICAgICAgICAgICB3cml0ZVN0YWNrVHJhY2UodGhyb3dhYmxlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90ZD48L3RyPiIpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLnByaW50KCI8L3RhYmxlPiIpOworICAgICAgICB3cml0ZXIucHJpbnQoIjxwIGNsYXNzPVwidG90b3BcIj48YSBocmVmPVwiI3N1bW1hcnlcIj5iYWNrIHRvIHN1bW1hcnk8L2E+PC9wPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUmVwb3J0ZXJNZXNzYWdlcyhMaXN0PFN0cmluZz4gcmVwb3J0ZXJNZXNzYWdlcykgeworICAgICAgICB3cml0ZXIucHJpbnQoIjxkaXYgY2xhc3M9XCJtZXNzYWdlc1wiPiIpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gcmVwb3J0ZXJNZXNzYWdlcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnQgaXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICB3cml0ZXIucHJpbnQoVXRpbHMuZXNjYXBlSHRtbChpdGVyYXRvci5uZXh0KCkpKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8YnIvPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KFV0aWxzLmVzY2FwZUh0bWwoaXRlcmF0b3IubmV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50KCI8L2Rpdj4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVN0YWNrVHJhY2UoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICB3cml0ZXIucHJpbnQoIjxkaXYgY2xhc3M9XCJzdGFja3RyYWNlXCI+Iik7CisgICAgICAgIHdyaXRlci5wcmludChVdGlscy5zdGFja1RyYWNlKHRocm93YWJsZSwgdHJ1ZSlbMF0pOworICAgICAgICB3cml0ZXIucHJpbnQoIjwvZGl2PiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIFRIIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnRlbnRzIGFuZCBDU1MgY2xhc3MgbmFtZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGh0bWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIVE1MIGNvbnRlbnRzCisgICAgICogQHBhcmFtIGNzc0NsYXNzZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGFjZS1kZWxpbWl0ZWQgQ1NTIGNsYXNzZXMgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgICAgIGNsYXNzZXMgdG8gYXBwbHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRhYmxlSGVhZGVyKFN0cmluZyBodG1sLCBTdHJpbmcgY3NzQ2xhc3NlcykgeworICAgICAgICB3cml0ZVRhZygidGgiLCBodG1sLCBjc3NDbGFzc2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBURCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb250ZW50cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaHRtbAorICAgICAqICAgICAgICAgICAgdGhlIEhUTUwgY29udGVudHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRhYmxlRGF0YShTdHJpbmcgaHRtbCkgeworICAgICAgICB3cml0ZVRhYmxlRGF0YShodG1sLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBURCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb250ZW50cyBhbmQgQ1NTIGNsYXNzIG5hbWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBodG1sCisgICAgICogICAgICAgICAgICB0aGUgSFRNTCBjb250ZW50cworICAgICAqIEBwYXJhbSBjc3NDbGFzc2VzCisgICAgICogICAgICAgICAgICB0aGUgc3BhY2UtZGVsaW1pdGVkIENTUyBjbGFzc2VzIG9yIG51bGwgaWYgdGhlcmUgYXJlIG5vCisgICAgICogICAgICAgICAgICBjbGFzc2VzIHRvIGFwcGx5CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUYWJsZURhdGEoU3RyaW5nIGh0bWwsIFN0cmluZyBjc3NDbGFzc2VzKSB7CisgICAgICAgIHdyaXRlVGFnKCJ0ZCIsIGh0bWwsIGNzc0NsYXNzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBhcmJpdHJhcnkgSFRNTCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjb250ZW50cyBhbmQgQ1NTCisgICAgICogY2xhc3MgbmFtZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHRhZworICAgICAqICAgICAgICAgICAgdGhlIHRhZyBuYW1lCisgICAgICogQHBhcmFtIGh0bWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIVE1MIGNvbnRlbnRzCisgICAgICogQHBhcmFtIGNzc0NsYXNzZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGFjZS1kZWxpbWl0ZWQgQ1NTIGNsYXNzZXMgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgICAgIGNsYXNzZXMgdG8gYXBwbHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRhZyhTdHJpbmcgdGFnLCBTdHJpbmcgaHRtbCwgU3RyaW5nIGNzc0NsYXNzZXMpIHsKKyAgICAgICAgd3JpdGVyLnByaW50KCI8Iik7CisgICAgICAgIHdyaXRlci5wcmludCh0YWcpOworICAgICAgICBpZiAoY3NzQ2xhc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBjbGFzcz1cIiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGNzc0NsYXNzZXMpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPiIpOworICAgICAgICB3cml0ZXIucHJpbnQoaHRtbCk7CisgICAgICAgIHdyaXRlci5wcmludCgiPC8iKTsKKyAgICAgICAgd3JpdGVyLnByaW50KHRhZyk7CisgICAgICAgIHdyaXRlci5wcmludCgiPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyb3VwcyB7QGxpbmsgVGVzdFJlc3VsdH1zIGJ5IHN1aXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU3VpdGVSZXN1bHQgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdWl0ZU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICAgIHB1YmxpYyBTdWl0ZVJlc3VsdChJU3VpdGUgc3VpdGUpIHsKKyAgICAgICAgICAgIHN1aXRlTmFtZSA9IHN1aXRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHN1aXRlUmVzdWx0IDogc3VpdGUuZ2V0UmVzdWx0cygpLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgdGVzdFJlc3VsdHMuYWRkKG5ldyBUZXN0UmVzdWx0KHN1aXRlUmVzdWx0LmdldFRlc3RDb250ZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VpdGVOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1aXRlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHJlc3VsdHMgKHBvc3NpYmx5IGVtcHR5KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8VGVzdFJlc3VsdD4gZ2V0VGVzdFJlc3VsdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdFJlc3VsdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcm91cHMge0BsaW5rIENsYXNzUmVzdWx0fXMgYnkgdGVzdCwgdHlwZSAoY29uZmlndXJhdGlvbiBvciB0ZXN0KSwgYW5kCisgICAgICogc3RhdHVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdFJlc3VsdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBPcmRlcnMgdGVzdCByZXN1bHRzIGJ5IGNsYXNzIG5hbWUgYW5kIHRoZW4gYnkgbWV0aG9kIG5hbWUgKGluCisgICAgICAgICAqIGxleGljb2dyYXBoaWMgb3JkZXIpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElUZXN0UmVzdWx0PiBSRVNVTFRfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPElUZXN0UmVzdWx0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKElUZXN0UmVzdWx0IG8xLCBJVGVzdFJlc3VsdCBvMikgeworICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBvMS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYXJlVG8obzIuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbzEuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhcmVUbyhvMi5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRlc3ROYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3NSZXN1bHQ+IGZhaWxlZENvbmZpZ3VyYXRpb25SZXN1bHRzOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3NSZXN1bHQ+IGZhaWxlZFRlc3RSZXN1bHRzOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3NSZXN1bHQ+IHNraXBwZWRDb25maWd1cmF0aW9uUmVzdWx0czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzUmVzdWx0PiBza2lwcGVkVGVzdFJlc3VsdHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzc1Jlc3VsdD4gcGFzc2VkVGVzdFJlc3VsdHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGZhaWxlZFRlc3RDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2tpcHBlZFRlc3RDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcGFzc2VkVGVzdENvdW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgZHVyYXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGluY2x1ZGVkR3JvdXBzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleGNsdWRlZEdyb3VwczsKKworICAgICAgICBwdWJsaWMgVGVzdFJlc3VsdChJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgdGVzdE5hbWUgPSBjb250ZXh0LmdldE5hbWUoKTsKKworICAgICAgICAgICAgU2V0PElUZXN0UmVzdWx0PiBmYWlsZWRDb25maWd1cmF0aW9ucyA9IGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLmdldEZhaWxlZENvbmZpZ3VyYXRpb25zKCkuZ2V0QWxsUmVzdWx0cygpOworICAgICAgICAgICAgU2V0PElUZXN0UmVzdWx0PiBmYWlsZWRUZXN0cyA9IGNvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsUmVzdWx0cygpOworICAgICAgICAgICAgU2V0PElUZXN0UmVzdWx0PiBza2lwcGVkQ29uZmlndXJhdGlvbnMgPSBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIC5nZXRTa2lwcGVkQ29uZmlndXJhdGlvbnMoKS5nZXRBbGxSZXN1bHRzKCk7CisgICAgICAgICAgICBTZXQ8SVRlc3RSZXN1bHQ+IHNraXBwZWRUZXN0cyA9IGNvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEFsbFJlc3VsdHMoKTsKKyAgICAgICAgICAgIFNldDxJVGVzdFJlc3VsdD4gcGFzc2VkVGVzdHMgPSBjb250ZXh0LmdldFBhc3NlZFRlc3RzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEFsbFJlc3VsdHMoKTsKKworICAgICAgICAgICAgZmFpbGVkQ29uZmlndXJhdGlvblJlc3VsdHMgPSBncm91cFJlc3VsdHMoZmFpbGVkQ29uZmlndXJhdGlvbnMpOworICAgICAgICAgICAgZmFpbGVkVGVzdFJlc3VsdHMgPSBncm91cFJlc3VsdHMoZmFpbGVkVGVzdHMpOworICAgICAgICAgICAgc2tpcHBlZENvbmZpZ3VyYXRpb25SZXN1bHRzID0gZ3JvdXBSZXN1bHRzKHNraXBwZWRDb25maWd1cmF0aW9ucyk7CisgICAgICAgICAgICBza2lwcGVkVGVzdFJlc3VsdHMgPSBncm91cFJlc3VsdHMoc2tpcHBlZFRlc3RzKTsKKyAgICAgICAgICAgIHBhc3NlZFRlc3RSZXN1bHRzID0gZ3JvdXBSZXN1bHRzKHBhc3NlZFRlc3RzKTsKKworICAgICAgICAgICAgZmFpbGVkVGVzdENvdW50ID0gZmFpbGVkVGVzdHMuc2l6ZSgpOworICAgICAgICAgICAgc2tpcHBlZFRlc3RDb3VudCA9IHNraXBwZWRUZXN0cy5zaXplKCk7CisgICAgICAgICAgICBwYXNzZWRUZXN0Q291bnQgPSBwYXNzZWRUZXN0cy5zaXplKCk7CisKKyAgICAgICAgICAgIGR1cmF0aW9uID0gY29udGV4dC5nZXRFbmREYXRlKCkuZ2V0VGltZSgpCisgICAgICAgICAgICAgICAgICAgIC0gY29udGV4dC5nZXRTdGFydERhdGUoKS5nZXRUaW1lKCk7CisKKyAgICAgICAgICAgIGluY2x1ZGVkR3JvdXBzID0gZm9ybWF0R3JvdXBzKGNvbnRleHQuZ2V0SW5jbHVkZWRHcm91cHMoKSk7CisgICAgICAgICAgICBleGNsdWRlZEdyb3VwcyA9IGZvcm1hdEdyb3Vwcyhjb250ZXh0LmdldEV4Y2x1ZGVkR3JvdXBzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdyb3VwcyB0ZXN0IHJlc3VsdHMgYnkgbWV0aG9kIGFuZCB0aGVuIGJ5IGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8Q2xhc3NSZXN1bHQ+IGdyb3VwUmVzdWx0cyhTZXQ8SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIExpc3Q8Q2xhc3NSZXN1bHQ+IGNsYXNzUmVzdWx0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgaWYgKCFyZXN1bHRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExpc3Q8TWV0aG9kUmVzdWx0PiByZXN1bHRzUGVyQ2xhc3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHRzUGVyTWV0aG9kID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgICAgICAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHRzTGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdChyZXN1bHRzKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHNMaXN0LCBSRVNVTFRfQ09NUEFSQVRPUik7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8SVRlc3RSZXN1bHQ+IHJlc3VsdHNJdGVyYXRvciA9IHJlc3VsdHNMaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdHNJdGVyYXRvci5oYXNOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBJVGVzdFJlc3VsdCByZXN1bHQgPSByZXN1bHRzSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHJlc3VsdHNQZXJNZXRob2QuYWRkKHJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJldmlvdXNDbGFzc05hbWUgPSByZXN1bHQuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmV2aW91c01ldGhvZE5hbWUgPSByZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICAgICAgICAgIHdoaWxlIChyZXN1bHRzSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNJdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc3VsdC5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNDbGFzc05hbWUuZXF1YWxzKGNsYXNzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBjbGFzcyBpbXBsaWVzIGRpZmZlcmVudCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAhcmVzdWx0c1Blck1ldGhvZC5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzUGVyQ2xhc3MuYWRkKG5ldyBNZXRob2RSZXN1bHQocmVzdWx0c1Blck1ldGhvZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1Blck1ldGhvZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIXJlc3VsdHNQZXJDbGFzcy5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Jlc3VsdHMuYWRkKG5ldyBDbGFzc1Jlc3VsdChwcmV2aW91c0NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1BlckNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzUGVyQ2xhc3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c01ldGhvZE5hbWUgPSByZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSByZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c01ldGhvZE5hbWUuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFyZXN1bHRzUGVyTWV0aG9kLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzUGVyQ2xhc3MuYWRkKG5ldyBNZXRob2RSZXN1bHQocmVzdWx0c1Blck1ldGhvZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNQZXJNZXRob2QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1Blck1ldGhvZC5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFyZXN1bHRzUGVyTWV0aG9kLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzUGVyQ2xhc3MuYWRkKG5ldyBNZXRob2RSZXN1bHQocmVzdWx0c1Blck1ldGhvZCkpOworICAgICAgICAgICAgICAgIGFzc2VydCAhcmVzdWx0c1BlckNsYXNzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICBjbGFzc1Jlc3VsdHMuYWRkKG5ldyBDbGFzc1Jlc3VsdChwcmV2aW91c0NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNQZXJDbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsYXNzUmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgcmVzdWx0cyBmb3IgZmFpbGVkIGNvbmZpZ3VyYXRpb25zIChwb3NzaWJseSBlbXB0eSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PENsYXNzUmVzdWx0PiBnZXRGYWlsZWRDb25maWd1cmF0aW9uUmVzdWx0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWRDb25maWd1cmF0aW9uUmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzIGZvciBmYWlsZWQgdGVzdHMgKHBvc3NpYmx5IGVtcHR5KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8Q2xhc3NSZXN1bHQ+IGdldEZhaWxlZFRlc3RSZXN1bHRzKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZFRlc3RSZXN1bHRzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdHMgZm9yIHNraXBwZWQgY29uZmlndXJhdGlvbnMgKHBvc3NpYmx5IGVtcHR5KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8Q2xhc3NSZXN1bHQ+IGdldFNraXBwZWRDb25maWd1cmF0aW9uUmVzdWx0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBza2lwcGVkQ29uZmlndXJhdGlvblJlc3VsdHM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgcmVzdWx0cyBmb3Igc2tpcHBlZCB0ZXN0cyAocG9zc2libHkgZW1wdHkpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdDxDbGFzc1Jlc3VsdD4gZ2V0U2tpcHBlZFRlc3RSZXN1bHRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHNraXBwZWRUZXN0UmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzIGZvciBwYXNzZWQgdGVzdHMgKHBvc3NpYmx5IGVtcHR5KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8Q2xhc3NSZXN1bHQ+IGdldFBhc3NlZFRlc3RSZXN1bHRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhc3NlZFRlc3RSZXN1bHRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGYWlsZWRUZXN0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkVGVzdENvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRTa2lwcGVkVGVzdENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIHNraXBwZWRUZXN0Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFBhc3NlZFRlc3RDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzZWRUZXN0Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBkdXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZWRHcm91cHMoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5jbHVkZWRHcm91cHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1ZGVkR3JvdXBzKCkgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkR3JvdXBzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcm1hdHMgYW4gYXJyYXkgb2YgZ3JvdXBzIGZvciBkaXNwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRHcm91cHMoU3RyaW5nW10gZ3JvdXBzKSB7CisgICAgICAgICAgICBpZiAoZ3JvdXBzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ3JvdXBzWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIikuYXBwZW5kKGdyb3Vwc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JvdXBzIHtAbGluayBNZXRob2RSZXN1bHR9cyBieSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENsYXNzUmVzdWx0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWV0aG9kUmVzdWx0PiBtZXRob2RSZXN1bHRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgICogQHBhcmFtIG1ldGhvZFJlc3VsdHMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbm9uLW51bGwsIG5vbi1lbXB0eSB7QGxpbmsgTWV0aG9kUmVzdWx0fSBsaXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3NSZXN1bHQoU3RyaW5nIGNsYXNzTmFtZSwgTGlzdDxNZXRob2RSZXN1bHQ+IG1ldGhvZFJlc3VsdHMpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICAgICAgdGhpcy5tZXRob2RSZXN1bHRzID0gbWV0aG9kUmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBub24tbnVsbCwgbm9uLWVtcHR5IHtAbGluayBNZXRob2RSZXN1bHR9IGxpc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PE1ldGhvZFJlc3VsdD4gZ2V0TWV0aG9kUmVzdWx0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RSZXN1bHRzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JvdXBzIHRlc3QgcmVzdWx0cyBieSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNZXRob2RSZXN1bHQgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSByZXN1bHRzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5vbi1udWxsLCBub24tZW1wdHkgcmVzdWx0IGxpc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRob2RSZXN1bHQoTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0cykgeworICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBub24tbnVsbCwgbm9uLWVtcHR5IHJlc3VsdCBsaXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0UmVzdWx0cygpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9FeGl0Q29kZUxpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0V4aXRDb2RlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDViYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9FeGl0Q29kZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworCisvKioKKyAqIEEgdmVyeSBzaW1wbGUgPGNvZGU+SVRlc3RMaXN0ZW5lcjwvY29kZT4gdXNlZCBieSB0aGUgVGVzdE5HIHJ1bm5lciB0bworICogZmluZCBvdXQgdGhlIGV4aXQgY29kZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgRXhpdENvZGVMaXN0ZW5lciBleHRlbmRzIFRlc3RORy5FeGl0Q29kZUxpc3RlbmVyIHsKKyAgcHVibGljIEV4aXRDb2RlTGlzdGVuZXIoKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBFeGl0Q29kZUxpc3RlbmVyKFRlc3RORyBydW5uZXIpIHsKKyAgICBzdXBlcihydW5uZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0ZhaWxlZFJlcG9ydGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0ZhaWxlZFJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjE2NWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRmFpbGVkUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLlNldHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5NZXRob2RIZWxwZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxJbmNsdWRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVGhpcyByZXBvcnRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGVzdG5nLWZhaWxlZC54bWwKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgRmFpbGVkUmVwb3J0ZXIgZXh0ZW5kcyBUZXN0TGlzdGVuZXJBZGFwdGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVE5HX0ZBSUxFRF9YTUwgPSAidGVzdG5nLWZhaWxlZC54bWwiOworCisgIHByaXZhdGUgWG1sU3VpdGUgbV94bWxTdWl0ZTsKKworICBwdWJsaWMgRmFpbGVkUmVwb3J0ZXIoKSB7CisgIH0KKworICBwdWJsaWMgRmFpbGVkUmVwb3J0ZXIoWG1sU3VpdGUgeG1sU3VpdGUpIHsKKyAgICBtX3htbFN1aXRlID0geG1sU3VpdGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIGdlbmVyYXRlRmFpbHVyZVN1aXRlKHN1aXRlLmdldFhtbFN1aXRlKCksIHN1aXRlLCBvdXRwdXREaXJlY3RvcnkpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRmFpbHVyZVN1aXRlKFhtbFN1aXRlIHhtbFN1aXRlLCBJU3VpdGUgc3VpdGUsIFN0cmluZyBvdXRwdXREaXIpIHsKKyAgICBYbWxTdWl0ZSBmYWlsZWRTdWl0ZSA9IChYbWxTdWl0ZSkgeG1sU3VpdGUuY2xvbmUoKTsKKyAgICBmYWlsZWRTdWl0ZS5zZXROYW1lKCJGYWlsZWQgc3VpdGUgWyIgKyB4bWxTdWl0ZS5nZXROYW1lKCkgKyAiXSIpOworICAgIG1feG1sU3VpdGU9IGZhaWxlZFN1aXRlOworCisgICAgTWFwPFN0cmluZywgWG1sVGVzdD4geG1sVGVzdHM9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvcihYbWxUZXN0IHhtbFQ6IHhtbFN1aXRlLmdldFRlc3RzKCkpIHsKKyAgICAgIHhtbFRlc3RzLnB1dCh4bWxULmdldE5hbWUoKSwgeG1sVCk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHRzID0gc3VpdGUuZ2V0UmVzdWx0cygpOworCisgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gZW50cnkgOiByZXN1bHRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIElTdWl0ZVJlc3VsdCBzdWl0ZVJlc3VsdCA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBJVGVzdENvbnRleHQgdGVzdENvbnRleHQgPSBzdWl0ZVJlc3VsdC5nZXRUZXN0Q29udGV4dCgpOworCisgICAgICBnZW5lcmF0ZVhtbFRlc3Qoc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgeG1sVGVzdHMuZ2V0KHRlc3RDb250ZXh0LmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgdGVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdENvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKS5nZXRBbGxSZXN1bHRzKCksCisgICAgICAgICAgICAgICAgICAgICAgdGVzdENvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpKTsKKyAgICB9CisKKyAgICBpZihudWxsICE9IGZhaWxlZFN1aXRlLmdldFRlc3RzKCkgJiYgZmFpbGVkU3VpdGUuZ2V0VGVzdHMoKS5zaXplKCkgPiAwKSB7CisgICAgICBVdGlscy53cml0ZVV0ZjhGaWxlKG91dHB1dERpciwgVEVTVE5HX0ZBSUxFRF9YTUwsIGZhaWxlZFN1aXRlLnRvWG1sKCkpOworICAgICAgVXRpbHMud3JpdGVVdGY4RmlsZShzdWl0ZS5nZXRPdXRwdXREaXJlY3RvcnkoKSwgVEVTVE5HX0ZBSUxFRF9YTUwsIGZhaWxlZFN1aXRlLnRvWG1sKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEbyBub3QgcmVseSBvbiB0aGlzIG1ldGhvZC4gVGhlIGNsYXNzIGlzIHVzZWQgYXMgPGNvZGU+SVJlcG9ydGVyPC9jb2RlPi4KKyAgICoKKyAgICogQHNlZSBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXIjb25GaW5pc2gob3JnLnRlc3RuZy5JVGVzdENvbnRleHQpCisgICAqIEBkZXByZWNhdGVkIHRoaXMgY2xhc3MgaXMgdXNlZCBub3cgYXMgSVJlcG9ydGVyCisgICAqLworICBARGVwcmVjYXRlZAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25GaW5pc2goSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAvLyBEZWxldGUgdGhlIHByZXZpb3VzIGZpbGUKKy8vICAgIEZpbGUgZiA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0T3V0cHV0RGlyZWN0b3J5KCksIGdldEZpbGVOYW1lKGNvbnRleHQpKTsKKy8vICAgIGYuZGVsZXRlKCk7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG1ldGhvZHMgd2UgbmVlZCB0byByZXJ1biA6ICBmYWlsZWQgdGVzdHMgYW5kCisgICAgLy8gdGhlaXIgZGVwZW5kZW50cworLy8gICAgTGlzdDxJVGVzdFJlc3VsdD4gZmFpbGVkVGVzdHMgPSBnZXRGYWlsZWRUZXN0cygpOworLy8gICAgTGlzdDxJVGVzdFJlc3VsdD4gc2tpcHBlZFRlc3RzID0gZ2V0U2tpcHBlZFRlc3RzKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVYbWxUZXN0KElTdWl0ZSBzdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxUZXN0IHhtbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gZmFpbGVkVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gc2tpcHBlZFRlc3RzKSB7CisgICAgLy8gTm90ZTogIHdlIGNhbiBoYXZlIHNraXBwZWQgdGVzdHMgYW5kIG5vIGZhaWxlZCB0ZXN0cworICAgIC8vIGlmIGEgbWV0aG9kIGRlcGVuZHMgb24gbm9uZXhpc3RlbnQgZ3JvdXBzCisgICAgaWYgKHNraXBwZWRUZXN0cy5zaXplKCkgPiAwIHx8IGZhaWxlZFRlc3RzLnNpemUoKSA+IDApIHsKKyAgICAgIFNldDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzVG9SZVJ1biA9IFNldHMubmV3SGFzaFNldCgpOworCisgICAgICAvLyBHZXQgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgdGhlIGZhaWxlZCBtZXRob2RzIGFuZCB0aGUgbWV0aG9kcworICAgICAgLy8gdGhleSBkZXBlbmQgb24KKyAgICAgIENvbGxlY3Rpb25bXSBhbGxUZXN0cyA9IG5ldyBDb2xsZWN0aW9uW10geworICAgICAgICAgIGZhaWxlZFRlc3RzLCBza2lwcGVkVGVzdHMKKyAgICAgIH07CisKKyAgICAgIGZvciAoQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gdGVzdHMgOiBhbGxUZXN0cykgeworICAgICAgICBmb3IgKElUZXN0UmVzdWx0IGZhaWxlZFRlc3QgOiB0ZXN0cykgeworICAgICAgICAgIElUZXN0TkdNZXRob2QgY3VycmVudCA9IGZhaWxlZFRlc3QuZ2V0TWV0aG9kKCk7CisgICAgICAgICAgaWYgKGN1cnJlbnQuaXNUZXN0KCkpIHsKKyAgICAgICAgICAgIG1ldGhvZHNUb1JlUnVuLmFkZChjdXJyZW50KTsKKyAgICAgICAgICAgIElUZXN0TkdNZXRob2QgbWV0aG9kID0gZmFpbGVkVGVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgIC8vIERvbid0IGNvdW50IGNvbmZpZ3VyYXRpb24gbWV0aG9kcworICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1Rlc3QoKSkgeworICAgICAgICAgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHNEZXBlbmRlZFVwb24gPQorICAgICAgICAgICAgICAgICAgTWV0aG9kSGVscGVyLmdldE1ldGhvZHNEZXBlbmRlZFVwb24obWV0aG9kLCBjb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCkpOworCisgICAgICAgICAgICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogbWV0aG9kc0RlcGVuZGVkVXBvbikgeworICAgICAgICAgICAgICAgIGlmIChtLmlzVGVzdCgpKSB7CisgICAgICAgICAgICAgICAgICBtZXRob2RzVG9SZVJ1bi5hZGQobSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgdGhlIHJpZ2h0IG1ldGhvZHMuICBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mCisgICAgICAvLyBhbGwgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlIHJ1biBhbmQgb25seSBwaWNrIHRob3NlIHRoYXQgYXJlCisgICAgICAvLyBpbiB0aGUgbWV0aG9kVG9SZVJ1biBtYXAuICBTaW5jZSB0aGUgbWV0aG9kcyBhcmUgYWxyZWFkeQorICAgICAgLy8gc29ydGVkLCB3ZSBkb24ndCBuZWVkIHRvIHNvcnQgdGhlbSBhZ2Fpbi4KKyAgICAgIC8vCisgICAgICBMaXN0PElUZXN0TkdNZXRob2Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBjb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCkpIHsKKyAgICAgICAgaWYgKG1ldGhvZHNUb1JlUnVuLmNvbnRhaW5zKG0pKSB7CisgICAgICAgICAgcmVzdWx0LmFkZChtKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtZXRob2RzVG9SZVJ1bi5jbGVhcigpOworICAgICAgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPiBpbnZva2VkPSBzdWl0ZS5nZXRJbnZva2VkTWV0aG9kcygpOworICAgICAgZm9yKElUZXN0TkdNZXRob2QgdG06IGludm9rZWQpIHsKKyAgICAgICAgaWYoIXRtLmlzVGVzdCgpKSB7CisgICAgICAgICAgbWV0aG9kc1RvUmVSdW4uYWRkKHRtKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXN1bHQuYWRkQWxsKG1ldGhvZHNUb1JlUnVuKTsKKyAgICAgIGNyZWF0ZVhtbFRlc3QoY29udGV4dCwgcmVzdWx0LCB4bWxUZXN0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGUgdGVzdG5nLWZhaWxlZC54bWwKKyAgICovCisgIHByaXZhdGUgdm9pZCBjcmVhdGVYbWxUZXN0KElUZXN0Q29udGV4dCBjb250ZXh0LCBMaXN0PElUZXN0TkdNZXRob2Q+IG1ldGhvZHMsIFhtbFRlc3Qgc3JjWG1sVGVzdCkgeworICAgIFhtbFRlc3QgeG1sVGVzdCA9IG5ldyBYbWxUZXN0KG1feG1sU3VpdGUpOworICAgIHhtbFRlc3Quc2V0TmFtZShjb250ZXh0LmdldE5hbWUoKSArICIoZmFpbGVkKSIpOworICAgIHhtbFRlc3Quc2V0QmVhblNoZWxsRXhwcmVzc2lvbihzcmNYbWxUZXN0LmdldEV4cHJlc3Npb24oKSk7CisgICAgeG1sVGVzdC5zZXRJbmNsdWRlZEdyb3VwcyhzcmNYbWxUZXN0LmdldEluY2x1ZGVkR3JvdXBzKCkpOworICAgIHhtbFRlc3Quc2V0RXhjbHVkZWRHcm91cHMoc3JjWG1sVGVzdC5nZXRFeGNsdWRlZEdyb3VwcygpKTsKKyAgICB4bWxUZXN0LnNldFBhcmFsbGVsKHNyY1htbFRlc3QuZ2V0UGFyYWxsZWwoKSk7CisgICAgeG1sVGVzdC5zZXRQYXJhbWV0ZXJzKHNyY1htbFRlc3QuZ2V0TG9jYWxQYXJhbWV0ZXJzKCkpOworICAgIHhtbFRlc3Quc2V0SlVuaXQoc3JjWG1sVGVzdC5pc0pVbml0KCkpOworICAgIExpc3Q8WG1sQ2xhc3M+IHhtbENsYXNzZXMgPSBjcmVhdGVYbWxDbGFzc2VzKG1ldGhvZHMsIHNyY1htbFRlc3QpOworICAgIHhtbFRlc3Quc2V0WG1sQ2xhc3Nlcyh4bWxDbGFzc2VzKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbWV0aG9kcyBUaGUgbWV0aG9kcyB3ZSB3YW50IHRvIHJlcHJlc2VudAorICAgKiBAcGFyYW0gc3JjWG1sVGVzdCAKKyAgICogQHJldHVybiBBIGxpc3Qgb2YgWG1sQ2xhc3Mgb2JqZWN0cyAoZWFjaCByZXByZXNlbnRpbmcgYSA8Y2xhc3M+IHRhZykgYmFzZWQKKyAgICogb24gdGhlIHBhcmFtZXRlciBtZXRob2RzCisgICAqLworICBwcml2YXRlIExpc3Q8WG1sQ2xhc3M+IGNyZWF0ZVhtbENsYXNzZXMoTGlzdDxJVGVzdE5HTWV0aG9kPiBtZXRob2RzLCBYbWxUZXN0IHNyY1htbFRlc3QpIHsKKyAgICBMaXN0PFhtbENsYXNzPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBNYXA8Q2xhc3MsIFNldDxJVGVzdE5HTWV0aG9kPj4gbWV0aG9kc01hcD0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICBmb3IgKElUZXN0TkdNZXRob2QgbSA6IG1ldGhvZHMpIHsKKyAgICAgIE9iamVjdFtdIGluc3RhbmNlcz0gbS5nZXRJbnN0YW5jZXMoKTsKKyAgICAgIENsYXNzIGNsYXp6PSBpbnN0YW5jZXMgPT0gbnVsbCB8fCBpbnN0YW5jZXMubGVuZ3RoID09IDAgfHwgaW5zdGFuY2VzWzBdID09IG51bGwKKyAgICAgICAgICA/IG0uZ2V0UmVhbENsYXNzKCkKKyAgICAgICAgICA6IGluc3RhbmNlc1swXS5nZXRDbGFzcygpOworICAgICAgU2V0PElUZXN0TkdNZXRob2Q+IG1ldGhvZExpc3Q9IG1ldGhvZHNNYXAuZ2V0KGNsYXp6KTsKKyAgICAgIGlmKG51bGwgPT0gbWV0aG9kTGlzdCkgeworICAgICAgICBtZXRob2RMaXN0PSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIG1ldGhvZHNNYXAucHV0KGNsYXp6LCBtZXRob2RMaXN0KTsKKyAgICAgIH0KKyAgICAgIG1ldGhvZExpc3QuYWRkKG0pOworICAgIH0KKworICAgIC8vIElkZWFsbHksIHdlIHNob3VsZCBwcmVzZXJ2ZSBlYWNoIHBhcmFtZXRlciBpbiBlYWNoIGNsYXNzIGJ1dCBwdXR0aW5nIHRoZW0KKyAgICAvLyBhbGwgaW4gdGhlIHNhbWUgYmFnIGZvciBub3cKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKFhtbENsYXNzIGMgOiBzcmNYbWxUZXN0LmdldENsYXNzZXMoKSkgeworICAgICAgcGFyYW1ldGVycy5wdXRBbGwoYy5nZXRMb2NhbFBhcmFtZXRlcnMoKSk7CisgICAgfQorCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IoTWFwLkVudHJ5PENsYXNzLCBTZXQ8SVRlc3ROR01ldGhvZD4+IGVudHJ5OiBtZXRob2RzTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIENsYXNzIGNsYXp6PSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIFNldDxJVGVzdE5HTWV0aG9kPiBtZXRob2RMaXN0PSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgLy8gQGF1dGhvciBCb3JvamV2aWMKKyAgICAgIC8vIE5lZWQgdG8gY2hlY2sgYWxsIHRoZSBtZXRob2RzLCBub3QganVzdCBAVGVzdCBvbmVzLgorICAgICAgWG1sQ2xhc3MgeG1sQ2xhc3M9IG5ldyBYbWxDbGFzcyhjbGF6ei5nZXROYW1lKCksIGluZGV4KyssIGZhbHNlIC8qIGRvbid0IGxvYWQgY2xhc3NlcyAqLyk7CisgICAgICBMaXN0PFhtbEluY2x1ZGU+IG1ldGhvZE5hbWVzPSBMaXN0cy5uZXdBcnJheUxpc3QobWV0aG9kTGlzdC5zaXplKCkpOworICAgICAgaW50IGluZCA9IDA7CisgICAgICBmb3IoSVRlc3ROR01ldGhvZCBtOiBtZXRob2RMaXN0KSB7CisgICAgICAgIG1ldGhvZE5hbWVzLmFkZChuZXcgWG1sSW5jbHVkZShtLmdldE1ldGhvZCgpLmdldE5hbWUoKSwgbS5nZXRGYWlsZWRJbnZvY2F0aW9uTnVtYmVycygpLAorICAgICAgICAgICAgaW5kKyspKTsKKyAgICAgIH0KKyAgICAgIHhtbENsYXNzLnNldEluY2x1ZGVkTWV0aG9kcyhtZXRob2ROYW1lcyk7CisgICAgICB4bWxDbGFzcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgcmVzdWx0LmFkZCh4bWxDbGFzcyk7CisKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFRPRE86ICB3ZSBtaWdodCB3YW50IHRvIG1ha2UgdGhhdCBtb3JlIGZsZXhpYmxlIGluIHRoZSBmdXR1cmUsIGJ1dCBmb3IKKyAgICogbm93LCBoYXJkY29kZSB0aGUgZmlsZSBuYW1lCisgICAqLworICBwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBURVNUTkdfRkFJTEVEX1hNTDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRmFpbGVkUmVwb3J0ZXJdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9GaWxlU3RyaW5nQnVmZmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0ZpbGVTdHJpbmdCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk4MGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9GaWxlU3RyaW5nQnVmZmVyLmphdmEKQEAgLTAsMCArMSwxODUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIHN0cmluZyBidWZmZXIgdGhhdCBmbHVzaGVzIGl0cyBjb250ZW50IHRvIGEgdGVtcG9yYXJ5IGZpbGUgd2hlbmV2ZXIgdGhlIGludGVybmFsCisgKiBzdHJpbmcgYnVmZmVyIGJlY29tZXMgbGFyZ2VyIHRoYW4gTUFYLiBJZiB0aGUgYnVmZmVyIG5ldmVyIHJlYWNoZXMgdGhhdCBzaXplLCBubyBmaWxlCisgKiBpcyBldmVyIGNyZWF0ZWQgYW5kIGV2ZXJ5dGhpbmcgaGFwcGVucyBpbiBtZW1vcnksIHNvIHRoZSBvdmVyaGVhZCBjb21wYXJlZCB0bworICogU3RyaW5nQnVmZmVyL1N0cmluZ0J1aWxkZXIgaXMgbWluaW1hbC4KKyAqCisgKiBOb3RlOiBjYWxsaW5nIHRvU3RyaW5nKCkgd2lsbCBmb3JjZSB0aGUgZW50aXJlIHN0cmluZyB0byBiZSBsb2FkZWQgaW4gbWVtb3J5LCB1c2UKKyAqIHRvV3JpdGVyKCkgaWYgeW91IG5lZWQgdG8gYXZvaWQgdGhpcy4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBtdWx0aSB0aHJlYWQgc2FmZS4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqCisgKiBAc2luY2UgTm92IDksIDIwMTIKKyAqLworcHVibGljIGNsYXNzIEZpbGVTdHJpbmdCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IE1BWCA9IDEwMDAwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlU3RyaW5nQnVmZmVyIikgIT0gbnVsbDsKKworICBwcml2YXRlIEZpbGUgbV9maWxlOworICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbV9zYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgIHByaXZhdGUgZmluYWwgaW50IG1fbWF4Q2hhcmFjdGVyczsKKworICBwdWJsaWMgRmlsZVN0cmluZ0J1ZmZlcigpIHsKKyAgICB0aGlzKE1BWCk7CisgIH0KKworICBwdWJsaWMgRmlsZVN0cmluZ0J1ZmZlcihpbnQgbWF4Q2hhcmFjdGVycykgeworICAgIG1fbWF4Q2hhcmFjdGVycyA9IG1heENoYXJhY3RlcnM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpbGVTdHJpbmdCdWZmZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBzKSB7CisgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2hhclNlcXVlbmNlIChBcmd1bWVudCAwIG9mIEZpbGVTdHJpbmdCdWZmZXIjYXBwZW5kKSBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICB9CisvLyAgICBtX3NiLmFwcGVuZChzKTsKKyAgICBpZiAobV9zYi5sZW5ndGgoKSA+IG1fbWF4Q2hhcmFjdGVycykgeworICAgICAgZmx1c2hUb0ZpbGUoKTsKKyAgICB9CisgICAgaWYgKHMubGVuZ3RoKCkgPCBNQVgpIHsKKyAgICAgIC8vIFNtYWxsIHN0cmluZywgYWRkIGl0IHRvIG91ciBpbnRlcm5hbCBidWZmZXIKKyAgICAgIG1fc2IuYXBwZW5kKHMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBCaWcgc3RyaW5nLCBhZGQgaXQgdG8gdGhlIHRlbXBvcmFyeSBmaWxlIGRpcmVjdGx5CisgICAgICBmbHVzaFRvRmlsZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgY29weShuZXcgU3RyaW5nUmVhZGVyKHMudG9TdHJpbmcoKSksIG5ldyBGaWxlV3JpdGVyKG1fZmlsZSwgdHJ1ZSAvKiBhcHBlbmQgKi8pKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdG9Xcml0ZXIoV3JpdGVyIGZ3KSB7CisgICAgaWYgKGZ3ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyaXRlciAoQXJndW1lbnQgMCBvZiBGaWxlU3RyaW5nQnVmZmVyI3RvV3JpdGVyKSBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIEJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKKyAgICAgIGlmIChtX2ZpbGUgPT0gbnVsbCkgeworICAgICAgICBidy53cml0ZShtX3NiLnRvU3RyaW5nKCkpOworICAgICAgICBidy5jbG9zZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmx1c2hUb0ZpbGUoKTsKKyAgICAgICAgY29weShuZXcgRmlsZVJlYWRlcihtX2ZpbGUpLCBidyk7CisgICAgICB9CisgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5KFJlYWRlciBpbnB1dCwgV3JpdGVyIG91dHB1dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW01BWF07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCBsZW5ndGggPSBpbnB1dC5yZWFkKGJ1Zik7CisgICAgICBpZiAobGVuZ3RoIDwgMCkgYnJlYWs7CisgICAgICBvdXRwdXQud3JpdGUoYnVmLCAwLCBsZW5ndGgpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpbnB1dC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgeworICAgIH0KKyAgICB0cnkgeworICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGZsdXNoVG9GaWxlKCkgeworICAgIGlmIChtX3NiLmxlbmd0aCgpID09IDApIHJldHVybjsKKworICAgIGlmIChtX2ZpbGUgPT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgbV9maWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdG5nIiwgImZpbGVTdHJpbmdCdWZmZXIiKTsKKyAgICAgICAgbV9maWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBwKCJDcmVhdGVkIHRlbXAgZmlsZSAiICsgbV9maWxlKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwKCJTaXplICIgKyBtX3NiLmxlbmd0aCgpICsgIiwgZmx1c2hpbmcgdG8gIiArIG1fZmlsZSk7CisgICAgdHJ5IChGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIobV9maWxlLCB0cnVlIC8qIGFwcGVuZCAqLykpIHsKKyAgICAgIGZ3LmFwcGVuZChtX3NiKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICBtX3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcChTdHJpbmcgcykgeworICAgIGlmIChWRVJCT1NFKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGaWxlU3RyaW5nQnVmZmVyXSAiICsgcyk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgaWYgKG1fZmlsZSAhPSBudWxsKSB7CisgICAgICBmbHVzaFRvRmlsZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgcmVzdWx0ID0gRmlsZXMucmVhZEZpbGUobV9maWxlKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gbV9zYi50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlKEZpbGUgZXhwZWN0ZWQsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGV4cGVjdGVkLmRlbGV0ZSgpOworICAgIHRyeSAoRmlsZVdyaXRlciBleHBlY3RlZFdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGV4cGVjdGVkKSkgeworICAgICAgZXhwZWN0ZWRXcml0ZXIuYXBwZW5kKHMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICAgIEZpbGVTdHJpbmdCdWZmZXIgZnNiID0gbmV3IEZpbGVTdHJpbmdCdWZmZXIoMTApOworICAgIFN0cmluZ0J1aWxkZXIgY29udHJvbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIGludCBzdGFydCA9IE1hdGguYWJzKHIubmV4dEludCgpICUgMjYpOworICAgICAgaW50IGxlbmd0aCA9IE1hdGguYWJzKHIubmV4dEludCgpICUgKDI2IC0gc3RhcnQpKTsKKyAgICAgIFN0cmluZyBmcmFnbWVudCA9IHMuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CisgICAgICBwKCIuLi4gQXBwZW5kaW5nICIgKyBmcmFnbWVudCk7CisgICAgICBmc2IuYXBwZW5kKGZyYWdtZW50KTsKKyAgICAgIGNvbnRyb2wuYXBwZW5kKGZyYWdtZW50KTsKKyAgICB9CisKKyAgICBGaWxlIGV4cGVjdGVkID0gbmV3IEZpbGUoIi90bXAvZXhwZWN0ZWQiKTsKKyAgICBleHBlY3RlZC5kZWxldGUoKTsKKyAgICBGaWxlV3JpdGVyIGV4cGVjdGVkV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZXhwZWN0ZWQpOworICAgIGV4cGVjdGVkV3JpdGVyLmFwcGVuZChjb250cm9sKTsKKyAgICBleHBlY3RlZFdyaXRlci5jbG9zZSgpOworCisgICAgRmlsZSBhY3R1YWwgPSBuZXcgRmlsZSgiL3RtcC9hY3R1YWwiKTsKKyAgICBhY3R1YWwuZGVsZXRlKCk7CisgICAgRmlsZVdyaXRlciBhY3R1YWxXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihhY3R1YWwpOworICAgIGZzYi50b1dyaXRlcihhY3R1YWxXcml0ZXIpOworICAgIGFjdHVhbFdyaXRlci5jbG9zZSgpOworLy8gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmc2IudG9TdHJpbmcoKSwgY29udHJvbC50b1N0cmluZygpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0ZpbGVzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0ZpbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2NjEwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvRmlsZXMuamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitwdWJsaWMgY2xhc3MgRmlsZXMgeworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGaWxlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKSkgeworICAgICAgcmV0dXJuIHJlYWRGaWxlKGlzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkRmlsZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOworICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQobGluZSArICJcbiIpOworICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHN0cmluZywgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihmKTsKKyAgICBCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7CisgICAgYncud3JpdGUoc3RyaW5nKTsKKyAgICBidy5jbG9zZSgpOworICAgIGZ3LmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoSW5wdXRTdHJlYW0gZnJvbSwgRmlsZSB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoISB0by5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgIHRvLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICB9CisKKyAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRvKSkgeworICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgIGludCBjb3VudCA9IGZyb20ucmVhZChidWZmZXIpOworICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgY291bnQgPSBmcm9tLnJlYWQoYnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJlYW1Ub1N0cmluZyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgdHJ5IHsKKyAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsICJVVEYtOCIpKTsKKyAgICAgICAgaW50IG47CisgICAgICAgIHdoaWxlICgobiA9IHJlYWRlci5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvSHRtbEhlbHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9IdG1sSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzMyMjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvSHRtbEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBIdG1sSGVscGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19GSUxFX05BTUUgPSAidGVzdG5nLmNzcyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9DU1NfRklMRV9OQU1FID0gIm15LXRlc3RuZy5jc3MiOworCisgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENzc1N0cmluZygpIHsKKyAgICByZXR1cm4gZ2V0Q3NzU3RyaW5nKCIuLiIpOworICB9CisKKyAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q3NzU3RyaW5nKFN0cmluZyBkaXJlY3RvcnkpIHsKKyAgICByZXR1cm4KKyAgICAgICI8bGluayBocmVmPVwiIiArIGRpcmVjdG9yeSArICIvIiArIENTU19GSUxFX05BTUUgKyAiXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIC8+XG4iICsKKyAgICAgICI8bGluayBocmVmPVwiIiArIGRpcmVjdG9yeSArICIvIisgTVlfQ1NTX0ZJTEVfTkFNRSArICJcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgLz5cbiI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEZpbGUgZ2VuZXJhdGVTdHlsZXNoZWV0KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZSBzdHlsZXNoZWV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgQ1NTX0ZJTEVfTkFNRSk7CisgICAgaWYgKCFzdHlsZXNoZWV0RmlsZS5leGlzdHMoKSkgeworICAgICAgVXRpbHMud3JpdGVSZXNvdXJjZVRvRmlsZShzdHlsZXNoZWV0RmlsZSwgQ1NTX0ZJTEVfTkFNRSwgVGVzdEhUTUxSZXBvcnRlci5jbGFzcyk7CisgICAgfQorICAgIHJldHVybiBzdHlsZXNoZWV0RmlsZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9JQnVmZmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0lCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM4OTFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9JQnVmZmVyLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUJ1ZmZlciB7CisgIElCdWZmZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBzdHJpbmcpOworICB2b2lkIHRvV3JpdGVyKFdyaXRlciBmdyk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0pVbml0UmVwb3J0UmVwb3J0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvSlVuaXRSZXBvcnRSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjRkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0pVbml0UmVwb3J0UmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdE11bHRpTWFwOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuU2V0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBKVW5pdFJlcG9ydFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLAorICAgICAgU3RyaW5nIGRlZmF1bHRPdXRwdXREaXJlY3RvcnkpIHsKKworICAgIE1hcDxDbGFzczw/PiwgU2V0PElUZXN0UmVzdWx0Pj4gcmVzdWx0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIE1hcDxDbGFzczw/PiwgU2V0PElUZXN0UmVzdWx0Pj4gZmFpbGVkQ29uZmlndXJhdGlvbnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBMaXN0TXVsdGlNYXA8T2JqZWN0LCBJVGVzdFJlc3VsdD4gYmVmb3JlcyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgICAgTGlzdE11bHRpTWFwPE9iamVjdCwgSVRlc3RSZXN1bHQ+IGFmdGVycyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gc3VpdGVSZXN1bHRzID0gc3VpdGUuZ2V0UmVzdWx0cygpOworICAgICAgZm9yIChJU3VpdGVSZXN1bHQgc3IgOiBzdWl0ZVJlc3VsdHMudmFsdWVzKCkpIHsKKyAgICAgICAgSVRlc3RDb250ZXh0IHRjID0gc3IuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgYWRkUmVzdWx0cyh0Yy5nZXRQYXNzZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSwgcmVzdWx0cyk7CisgICAgICAgIGFkZFJlc3VsdHModGMuZ2V0RmFpbGVkVGVzdHMoKS5nZXRBbGxSZXN1bHRzKCksIHJlc3VsdHMpOworICAgICAgICBhZGRSZXN1bHRzKHRjLmdldFNraXBwZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSwgcmVzdWx0cyk7CisgICAgICAgIGFkZFJlc3VsdHModGMuZ2V0RmFpbGVkQ29uZmlndXJhdGlvbnMoKS5nZXRBbGxSZXN1bHRzKCksIGZhaWxlZENvbmZpZ3VyYXRpb25zKTsKKyAgICAgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IHRjLmdldFBhc3NlZENvbmZpZ3VyYXRpb25zKCkuZ2V0QWxsUmVzdWx0cygpKSB7CisgICAgICAgICAgaWYgKHRyLmdldE1ldGhvZCgpLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBiZWZvcmVzLnB1dCh0ci5nZXRJbnN0YW5jZSgpLCB0cik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0ci5nZXRNZXRob2QoKS5pc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBhZnRlcnMucHV0KHRyLmdldEluc3RhbmNlKCksIHRyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIGxpc3Qgb2YgaXRlcmF0b3JzIGZvciBhbGwgdGhlIHBhc3NlZCBjb25maWd1cmF0aW9uLCBleHBsYW5hdGlvbiBiZWxvdworLy8gICAgTGlzdE11bHRpTWFwPENsYXNzPD8+LCBJVGVzdFJlc3VsdD4gYmVmb3JlQ29uZmlndXJhdGlvbnMgPSBNYXBzLm5ld0xpc3RNdWx0aU1hcCgpOworLy8gICAgTGlzdE11bHRpTWFwPENsYXNzPD8+LCBJVGVzdFJlc3VsdD4gYWZ0ZXJDb25maWd1cmF0aW9ucyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisvLyAgICBmb3IgKE1hcC5FbnRyeTxDbGFzczw/PiwgU2V0PElUZXN0UmVzdWx0Pj4gZXMgOiBwYXNzZWRDb25maWd1cmF0aW9ucy5lbnRyeVNldCgpKSB7CisvLyAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBlcy5nZXRWYWx1ZSgpKSB7CisvLyAgICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QgPSB0ci5nZXRNZXRob2QoKTsKKy8vICAgICAgICBpZiAobWV0aG9kLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisvLyAgICAgICAgICBiZWZvcmVDb25maWd1cmF0aW9ucy5wdXQobWV0aG9kLmdldFJlYWxDbGFzcygpLCB0cik7CisvLyAgICAgICAgfQorLy8gICAgICAgIGlmIChtZXRob2QuaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSkgeworLy8gICAgICAgICAgYWZ0ZXJDb25maWd1cmF0aW9ucy5wdXQobWV0aG9kLmdldFJlYWxDbGFzcygpLCB0cik7CisvLyAgICAgICAgfQorLy8gICAgICB9CisvLyAgICB9CisvLyAgICBNYXA8T2JqZWN0LCBJdGVyYXRvcjxJVGVzdFJlc3VsdD4+IGJlZm9yZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKy8vICAgIGZvciAoTWFwLkVudHJ5PENsYXNzPD8+LCBMaXN0PElUZXN0UmVzdWx0Pj4gZXMgOiBiZWZvcmVDb25maWd1cmF0aW9ucy5nZXRFbnRyeVNldCgpKSB7CisvLyAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRyID0gZXMuZ2V0VmFsdWUoKTsKKy8vICAgICAgZm9yIChJVGVzdFJlc3VsdCBpdHIgOiBlcy5nZXRWYWx1ZSgpKSB7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIE1hcDxDbGFzczw/PiwgSXRlcmF0b3I8SVRlc3RSZXN1bHQ+PiBhZnRlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKy8vICAgIGZvciAoTWFwLkVudHJ5PENsYXNzPD8+LCBMaXN0PElUZXN0UmVzdWx0Pj4gZXMgOiBhZnRlckNvbmZpZ3VyYXRpb25zLmdldEVudHJ5U2V0KCkpIHsKKy8vICAgICAgYWZ0ZXJzLnB1dChlcy5nZXRLZXkoKSwgZXMuZ2V0VmFsdWUoKS5pdGVyYXRvcigpKTsKKy8vICAgIH0KKworICAgIGZvciAoTWFwLkVudHJ5PENsYXNzPD8+LCBTZXQ8SVRlc3RSZXN1bHQ+PiBlbnRyeSA6IHJlc3VsdHMuZW50cnlTZXQoKSkgeworICAgICAgQ2xhc3M8Pz4gY2xzID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBQcm9wZXJ0aWVzIHAxID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgIHAxLnNldFByb3BlcnR5KCJuYW1lIiwgY2xzLmdldE5hbWUoKSk7CisgICAgICBEYXRlIHRpbWVTdGFtcCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpOworICAgICAgcDEuc2V0UHJvcGVydHkoWE1MQ29uc3RhbnRzLkFUVFJfVElNRVNUQU1QLCB0aW1lU3RhbXAudG9HTVRTdHJpbmcoKSk7CisKKyAgICAgIExpc3Q8VGVzdFRhZz4gdGVzdENhc2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBpbnQgZmFpbHVyZXMgPSAwOworICAgICAgaW50IGVycm9ycyA9IDA7CisgICAgICBpbnQgdGVzdENvdW50ID0gMDsKKyAgICAgIGZsb2F0IHRvdGFsVGltZSA9IDA7CisKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHI6IGVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgVGVzdFRhZyB0ZXN0VGFnID0gbmV3IFRlc3RUYWcoKTsKKworICAgICAgICBib29sZWFuIGlzU3VjY2VzcyA9IHRyLmdldFN0YXR1cygpID09IElUZXN0UmVzdWx0LlNVQ0NFU1M7CisgICAgICAgIGlmICghIGlzU3VjY2VzcykgeworICAgICAgICAgIGlmICh0ci5nZXRUaHJvd2FibGUoKSBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yKSB7CisgICAgICAgICAgICBmYWlsdXJlcysrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvcnMrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQcm9wZXJ0aWVzIHAyID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcDIuc2V0UHJvcGVydHkoImNsYXNzbmFtZSIsIGNscy5nZXROYW1lKCkpOworICAgICAgICBwMi5zZXRQcm9wZXJ0eSgibmFtZSIsIGdldFRlc3ROYW1lKHRyKSk7CisgICAgICAgIGxvbmcgdGltZSA9IHRyLmdldEVuZE1pbGxpcygpIC0gdHIuZ2V0U3RhcnRNaWxsaXMoKTsKKworICAgICAgICB0aW1lICs9IGdldE5leHRDb25maWd1cmF0aW9uKGJlZm9yZXMsIHRyKTsKKyAgICAgICAgdGltZSArPSBnZXROZXh0Q29uZmlndXJhdGlvbihhZnRlcnMsIHRyKTsKKworICAgICAgICBwMi5zZXRQcm9wZXJ0eSgidGltZSIsICIiICsgZm9ybWF0VGltZSh0aW1lKSk7CisgICAgICAgIFRocm93YWJsZSB0ID0gZ2V0VGhyb3dhYmxlKHRyLCBmYWlsZWRDb25maWd1cmF0aW9ucyk7CisgICAgICAgIGlmICghIGlzU3VjY2VzcyAmJiB0ICE9IG51bGwpIHsKKyAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgICB0ZXN0VGFnLm1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICB0ZXN0VGFnLnR5cGUgPSB0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAgIHRlc3RUYWcuc3RhY2tUcmFjZSA9IHN3LnRvU3RyaW5nKCk7CisgICAgICAgICAgdGVzdFRhZy5lcnJvclRhZyA9IHRyLmdldFRocm93YWJsZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IgPyAiZmFpbHVyZSIgOiAiZXJyb3IiOworICAgICAgICB9CisgICAgICAgIHRvdGFsVGltZSArPSB0aW1lOworICAgICAgICB0ZXN0Q291bnQrKzsKKyAgICAgICAgdGVzdFRhZy5wcm9wZXJ0aWVzID0gcDI7CisgICAgICAgIHRlc3RDYXNlcy5hZGQodGVzdFRhZyk7CisgICAgICB9CisKKyAgICAgIHAxLnNldFByb3BlcnR5KCJmYWlsdXJlcyIsICIiICsgZmFpbHVyZXMpOworICAgICAgcDEuc2V0UHJvcGVydHkoImVycm9ycyIsICIiICsgZXJyb3JzKTsKKyAgICAgIHAxLnNldFByb3BlcnR5KCJuYW1lIiwgY2xzLmdldE5hbWUoKSk7CisgICAgICBwMS5zZXRQcm9wZXJ0eSgidGVzdHMiLCAiIiArIHRlc3RDb3VudCk7CisgICAgICBwMS5zZXRQcm9wZXJ0eSgidGltZSIsICIiICsgZm9ybWF0VGltZSh0b3RhbFRpbWUpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHAxLnNldFByb3BlcnR5KFhNTENvbnN0YW50cy5BVFRSX0hPU1ROQU1FLCBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpKTsKKyAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gaWdub3JlCisgICAgICB9CisKKyAgICAgIC8vCisgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCwgZ2VuZXJhdGUgdGhlIGZpbGUKKyAgICAgIC8vCisgICAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcigpOworICAgICAgeHNiLmFkZENvbW1lbnQoIkdlbmVyYXRlZCBieSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgICB4c2IucHVzaCgidGVzdHN1aXRlIiwgcDEpOworICAgICAgZm9yIChUZXN0VGFnIHRlc3RUYWcgOiB0ZXN0Q2FzZXMpIHsKKyAgICAgICAgaWYgKHRlc3RUYWcuc3RhY2tUcmFjZSA9PSBudWxsKSB7CisgICAgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgidGVzdGNhc2UiLCB0ZXN0VGFnLnByb3BlcnRpZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHhzYi5wdXNoKCJ0ZXN0Y2FzZSIsIHRlc3RUYWcucHJvcGVydGllcyk7CisKKyAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgIGlmICh0ZXN0VGFnLm1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWVzc2FnZSIsIHRlc3RUYWcubWVzc2FnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHAuc2V0UHJvcGVydHkoInR5cGUiLCB0ZXN0VGFnLnR5cGUpOworICAgICAgICAgIHhzYi5wdXNoKHRlc3RUYWcuZXJyb3JUYWcsIHApOworICAgICAgICAgIHhzYi5hZGRDREFUQSh0ZXN0VGFnLnN0YWNrVHJhY2UpOworICAgICAgICAgIHhzYi5wb3AodGVzdFRhZy5lcnJvclRhZyk7CisKKyAgICAgICAgICB4c2IucG9wKCJ0ZXN0Y2FzZSIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB4c2IucG9wKCJ0ZXN0c3VpdGUiKTsKKworICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9IGRlZmF1bHRPdXRwdXREaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJqdW5pdHJlcG9ydHMiOworICAgICAgVXRpbHMud3JpdGVVdGY4RmlsZShvdXRwdXREaXJlY3RvcnksIGdldEZpbGVOYW1lKGNscyksIHhzYi50b1hNTCgpKTsKKyAgICB9CisKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbih4c2IudG9YTUwoKSk7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgIH0KKworICAvKioKKyAgICogQWRkIHRoZSB0aW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZCB0byB0aGlzIHRlc3QgbWV0aG9kLgorICAgKgorICAgKiBUaGUgb25seSBwcm9ibGVtIHdpdGggdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUgdGltaW5nIG9mIGEgdGVzdCBtZXRob2QKKyAgICogbWlnaHQgbm90IGJlIGFkZGVkIHRvIHRoZSB0aW1lIG9mIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHRoYXQgcmFuIGJlZm9yZQorICAgKiBpdCBidXQgc2luY2UgdGhleSBzaG91bGQgYWxsIGJlIGVxdWl2YWxlbnQsIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGFuIGlzc3VlLgorICAgKi8KKyAgcHJpdmF0ZSBsb25nIGdldE5leHRDb25maWd1cmF0aW9uKExpc3RNdWx0aU1hcDxPYmplY3QsIElUZXN0UmVzdWx0PiBjb25maWd1cmF0aW9ucywKKyAgICAgIElUZXN0UmVzdWx0IHRyKQorICB7CisgICAgbG9uZyByZXN1bHQgPSAwOworCisgICAgTGlzdDxJVGVzdFJlc3VsdD4gY29uZlJlc3VsdHMgPSBjb25maWd1cmF0aW9ucy5nZXQodHIuZ2V0SW5zdGFuY2UoKSk7CisgICAgTWFwPElUZXN0TkdNZXRob2QsIElUZXN0UmVzdWx0PiBzZWVuID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgaWYgKGNvbmZSZXN1bHRzICE9IG51bGwpIHsKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgciA6IGNvbmZSZXN1bHRzKSB7CisgICAgICAgIGlmICghIHNlZW4uY29udGFpbnNLZXkoci5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICByZXN1bHQgKz0gci5nZXRFbmRNaWxsaXMoKSAtIHIuZ2V0U3RhcnRNaWxsaXMoKTsKKyAgICAgICAgICBzZWVuLnB1dChyLmdldE1ldGhvZCgpLCByKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY29uZlJlc3VsdHMucmVtb3ZlQWxsKHNlZW4udmFsdWVzKCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lKENsYXNzIGNscykgeworICAgIHJldHVybiAiVEVTVC0iICsgY2xzLmdldE5hbWUoKSArICIueG1sIjsKKyAgfQorCisgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdE5hbWUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICByZXR1cm4gdHIuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0VGltZShmbG9hdCB0aW1lKSB7CisgICAgRGVjaW1hbEZvcm1hdFN5bWJvbHMgc3ltYm9scyA9IG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scygpOworICAgIC8vIEpVbml0UmVwb3J0cyB3YW50cyBwb2ludHMgaGVyZSwgcmVnYXJkbGVzcyBvZiB0aGUgbG9jYWxlCisgICAgc3ltYm9scy5zZXREZWNpbWFsU2VwYXJhdG9yKCcuJyk7CisgICAgRGVjaW1hbEZvcm1hdCBmb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIy4jIyMiLCBzeW1ib2xzKTsKKyAgICBmb3JtYXQuc2V0TWluaW11bUZyYWN0aW9uRGlnaXRzKDMpOworICAgIHJldHVybiBmb3JtYXQuZm9ybWF0KHRpbWUgLyAxMDAwLjBmKTsKKyAgfQorCisgIHByaXZhdGUgVGhyb3dhYmxlIGdldFRocm93YWJsZShJVGVzdFJlc3VsdCB0ciwKKyAgICAgIE1hcDxDbGFzczw/PiwgU2V0PElUZXN0UmVzdWx0Pj4gZmFpbGVkQ29uZmlndXJhdGlvbnMpIHsKKyAgICBUaHJvd2FibGUgcmVzdWx0ID0gdHIuZ2V0VGhyb3dhYmxlKCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIHRyLmdldFN0YXR1cygpID09IElUZXN0UmVzdWx0LlNLSVApIHsKKyAgICAgIC8vIEF0dGVtcHQgdG8gZ3JhYiB0aGUgc3RhY2sgdHJhY2UgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmYWlsdXJlCisgICAgICBmb3IgKFNldDxJVGVzdFJlc3VsdD4gZmFpbHVyZXMgOiBmYWlsZWRDb25maWd1cmF0aW9ucy52YWx1ZXMoKSkgeworICAgICAgICBmb3IgKElUZXN0UmVzdWx0IGZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICAgIC8vIE5haXZlIGltcGxlbWVudGF0aW9uIGZvciBub3csIGV2ZW50dWFsbHksIHdlIG5lZWQgdG8gdHJ5IHRvIGZpbmQKKyAgICAgICAgICAvLyBvdXQgaWYgaXQncyB0aGlzIGZhaWx1cmUgdGhhdCBjYXVzZWQgdGhlIHNraXAgc2luY2UgKG1heWJlIGJ5CisgICAgICAgICAgLy8gc2VlaW5nIGlmIHRoZSBjbGFzcyBvZiB0aGUgY29uZmlndXJhdGlvbiBtZXRob2QgaXMgYXNzaWduYWJsZSB0bworICAgICAgICAgIC8vIHRoZSBjbGFzcyBvZiB0aGUgdGVzdCBtZXRob2QsIGFsdGhvdWdoIHRoYXQncyBub3QgMTAwJSBmb29sIHByb29mCisgICAgICAgICAgaWYgKGZhaWx1cmUuZ2V0VGhyb3dhYmxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmUuZ2V0VGhyb3dhYmxlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0VGFnIHsKKyAgICBwdWJsaWMgUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKKyAgICBwdWJsaWMgU3RyaW5nIHR5cGU7CisgICAgcHVibGljIFN0cmluZyBzdGFja1RyYWNlOworICAgIHB1YmxpYyBTdHJpbmcgZXJyb3JUYWc7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkUmVzdWx0cyhTZXQ8SVRlc3RSZXN1bHQ+IGFsbFJlc3VsdHMsIE1hcDxDbGFzczw/PiwgU2V0PElUZXN0UmVzdWx0Pj4gb3V0KSB7CisgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IGFsbFJlc3VsdHMpIHsKKyAgICAgIENsYXNzPD8+IGNscyA9IHRyLmdldE1ldGhvZCgpLmdldFRlc3RDbGFzcygpLmdldFJlYWxDbGFzcygpOworICAgICAgU2V0PElUZXN0UmVzdWx0PiBsID0gb3V0LmdldChjbHMpOworICAgICAgaWYgKGwgPT0gbnVsbCkgeworICAgICAgICBsID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIG91dC5wdXQoY2xzLCBsKTsKKyAgICAgIH0KKyAgICAgIGwuYWRkKHRyKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9KVW5pdFhNTFJlcG9ydGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL0pVbml0WE1MUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDk3YmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9KVW5pdFhNTFJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwzMTcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuU2V0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklSZXN1bHRMaXN0ZW5lcjI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgSlVuaXQgWE1MIHJlcG9ydCBnZW5lcmF0b3IgKHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgSlVuaXRYTUxSZXBvcnRlciB0aGF0IHdhcworICogYmFzZWQgb24gWE1MIEFQSXMpLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZVtkb3RdbWluZHN0b3JtW2F0XWdtYWlsW2RvdF1jb20nPkFsZXggUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIEpVbml0WE1MUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVzdWx0TGlzdGVuZXIyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFTlRJVFk9IFBhdHRlcm4uY29tcGlsZSgiJlthLXpBLVpdKzsuKiIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIExFU1M9IFBhdHRlcm4uY29tcGlsZSgiPCIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEdSRUFURVI9IFBhdHRlcm4uY29tcGlsZSgiPiIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFNJTkdMRV9RVU9URSA9IFBhdHRlcm4uY29tcGlsZSgiJyIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFFVT1RFID0gUGF0dGVybi5jb21waWxlKCJcIiIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBQYXR0ZXJuPiBBVFRSX0VTQ0FQRVM9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHN0YXRpYyB7CisgICAgQVRUUl9FU0NBUEVTLnB1dCgiJmx0OyIsIExFU1MpOworICAgIEFUVFJfRVNDQVBFUy5wdXQoIiZndDsiLCBHUkVBVEVSKTsKKyAgICBBVFRSX0VTQ0FQRVMucHV0KCImYXBvczsiLCBTSU5HTEVfUVVPVEUpOworICAgIEFUVFJfRVNDQVBFUy5wdXQoIiZxdW90OyIsIFFVT1RFKTsKKyAgfQorCisKKyAgLyoqCisgICAqIGtlZXAgbGlzdHMgb2YgYWxsIHRoZSByZXN1bHRzCisgICAqLworICBwcml2YXRlIGludCBtX251bVBhc3NlZD0gMDsKKyAgcHJpdmF0ZSBpbnQgbV9udW1GYWlsZWQ9IDA7CisgIHByaXZhdGUgaW50IG1fbnVtU2tpcHBlZD0gMDsKKyAgcHJpdmF0ZSBpbnQgbV9udW1GYWlsZWRCdXRJZ25vcmVkPSAwOworICBwcml2YXRlIExpc3Q8SVRlc3RSZXN1bHQ+IG1fYWxsVGVzdHMgPQorICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChMaXN0cy48SVRlc3RSZXN1bHQ+bmV3QXJyYXlMaXN0KCkpOworICBwcml2YXRlIExpc3Q8SVRlc3RSZXN1bHQ+IG1fY29uZmlnSXNzdWVzID0KKyAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCgpKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1fZmlsZU5hbWVNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBpbnQgbV9maWxlTmFtZUluY3JlbWVudGVyID0gMDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYmVmb3JlQ29uZmlndXJhdGlvbihJVGVzdFJlc3VsdCB0cikgeworICB9CisKKyAgLyoqCisgICAqIEludm9rZWQgZWFjaCB0aW1lIGEgdGVzdCBzdWNjZWVkcy4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbV9hbGxUZXN0cy5hZGQodHIpOworICAgIG1fbnVtUGFzc2VkKys7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2UoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBtX2FsbFRlc3RzLmFkZCh0cik7CisgICAgbV9udW1GYWlsZWRCdXRJZ25vcmVkKys7CisgIH0KKworICAvKioKKyAgICogSW52b2tlZCBlYWNoIHRpbWUgYSB0ZXN0IGZhaWxzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBtX2FsbFRlc3RzLmFkZCh0cik7CisgICAgbV9udW1GYWlsZWQrKzsKKyAgfQorCisgIC8qKgorICAgKiBJbnZva2VkIGVhY2ggdGltZSBhIHRlc3QgaXMgc2tpcHBlZC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbV9hbGxUZXN0cy5hZGQodHIpOworICAgIG1fbnVtU2tpcHBlZCsrOworICB9CisKKyAgLyoqCisgICAqIEludm9rZWQgYWZ0ZXIgdGhlIHRlc3QgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGFuZCBiZWZvcmUKKyAgICogYW55IGNvbmZpZ3VyYXRpb24gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICoKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblN0YXJ0KElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisKKyAgfQorCisgIC8qKgorICAgKiBJbnZva2VkIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBydW4gYW5kIGFsbCB0aGVpcgorICAgKiBDb25maWd1cmF0aW9uIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICoKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgY29udGV4dCkgeworCWdlbmVyYXRlUmVwb3J0KGNvbnRleHQpOworICAgIHJlc2V0QWxsKCk7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uRmFpbHVyZShvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkZhaWx1cmUoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgbV9jb25maWdJc3N1ZXMuYWRkKGl0cik7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uU2tpcChvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblNraXAoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgbV9jb25maWdJc3N1ZXMuYWRkKGl0cik7CisgIH0KKworICAvKioKKyAgICogQHNlZSBvcmcudGVzdG5nLklDb25maWd1cmF0aW9uTGlzdGVuZXIjb25Db25maWd1cmF0aW9uU3VjY2VzcyhvcmcudGVzdG5nLklUZXN0UmVzdWx0KQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblN1Y2Nlc3MoSVRlc3RSZXN1bHQgaXRyKSB7CisgIH0KKworICAvKioKKyAgICogZ2VuZXJhdGUgdGhlIFhNTCByZXBvcnQgZ2l2ZW4gd2hhdCB3ZSBrbm93IGZyb20gYWxsIHRoZSB0ZXN0IHJlc3VsdHMKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUmVwb3J0KElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgIFhNTFN0cmluZ0J1ZmZlciBkb2N1bWVudD0gbmV3IFhNTFN0cmluZ0J1ZmZlcigpOworICAgICAgZG9jdW1lbnQuYWRkQ29tbWVudCgiR2VuZXJhdGVkIGJ5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgIFByb3BlcnRpZXMgYXR0cnM9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9FUlJPUlMsICIwIik7CisgICAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9GQUlMVVJFUywgIiIgKyBtX251bUZhaWxlZCk7CisgICAgICB0cnkgeworICAgICAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9IT1NUTkFNRSwgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSk7CisgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGlnbm9yZQorICAgICAgfQorICAgICAgU2V0PFN0cmluZz4gcGFja2FnZXMgPSBnZXRQYWNrYWdlcyhjb250ZXh0KTsKKyAgICAgIGlmIChwYWNrYWdlcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGF0dHJzLnNldFByb3BlcnR5KFhNTENvbnN0YW50cy5BVFRSX05BTUUsIGNvbnRleHQuZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXROYW1lKCkpOworLy8gICAgICAgIGF0dHJzLnNldFByb3BlcnR5KFhNTENvbnN0YW50cy5BVFRSX1BBQ0tBR0UsIHBhY2thZ2VzLml0ZXJhdG9yKCkubmV4dCgpKTsKKyAgICAgIH0KKworICAgICAgYXR0cnMuc2V0UHJvcGVydHkoWE1MQ29uc3RhbnRzLkFUVFJfVEVTVFMsICIiICsgbV9hbGxUZXN0cy5zaXplKCkpOworICAgICAgYXR0cnMuc2V0UHJvcGVydHkoWE1MQ29uc3RhbnRzLkFUVFJfVElNRSwgIiIKKyAgICAgICAgICArICgoY29udGV4dC5nZXRFbmREYXRlKCkuZ2V0VGltZSgpIC0gY29udGV4dC5nZXRTdGFydERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMC4wKSk7CisKKyAgICAgIERhdGUgdGltZVN0YW1wID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCk7CisgICAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9USU1FU1RBTVAsIHRpbWVTdGFtcC50b0dNVFN0cmluZygpKTsKKworICAgICAgZG9jdW1lbnQucHVzaChYTUxDb25zdGFudHMuVEVTVFNVSVRFLCBhdHRycyk7CisvLyAgICAgIGRvY3VtZW50LmFkZEVtcHR5RWxlbWVudChYTUxDb25zdGFudHMuUFJPUEVSVElFUyk7CisKKyAgICAgIGNyZWF0ZUVsZW1lbnRGcm9tVGVzdFJlc3VsdHMoZG9jdW1lbnQsIG1fY29uZmlnSXNzdWVzKTsKKyAgICAgIGNyZWF0ZUVsZW1lbnRGcm9tVGVzdFJlc3VsdHMoZG9jdW1lbnQsIG1fYWxsVGVzdHMpOworCisgICAgICBkb2N1bWVudC5wb3AoKTsKKyAgICAgIFV0aWxzLndyaXRlVXRmOEZpbGUoY29udGV4dC5nZXRPdXRwdXREaXJlY3RvcnkoKSxnZW5lcmF0ZUZpbGVOYW1lKGNvbnRleHQpICsgIi54bWwiLCBkb2N1bWVudC50b1hNTCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjcmVhdGVFbGVtZW50RnJvbVRlc3RSZXN1bHRzKFhNTFN0cmluZ0J1ZmZlciBkb2N1bWVudCwgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0cykgeworICAgIHN5bmNocm9uaXplZChyZXN1bHRzKSB7CisgICAgICBmb3IoSVRlc3RSZXN1bHQgdHIgOiByZXN1bHRzKSB7CisgICAgICAgIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIHRyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFNldDxTdHJpbmc+IGdldFBhY2thZ2VzKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgU2V0PFN0cmluZz4gcmVzdWx0ID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBjb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCkpIHsKKyAgICAgIFBhY2thZ2UgcGtnID0gbS5nZXRNZXRob2QoKS5nZXREZWNsYXJpbmdDbGFzcygpLmdldFBhY2thZ2UoKTsKKyAgICAgIGlmIChwa2cgIT0gbnVsbCkgeworICAgICAgICByZXN1bHQuYWRkKHBrZy5nZXROYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVsZW1lbnQoWE1MU3RyaW5nQnVmZmVyIGRvYywgSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBQcm9wZXJ0aWVzIGF0dHJzPSBuZXcgUHJvcGVydGllcygpOworICAgIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXM9IHRyLmdldEVuZE1pbGxpcygpIC0gdHIuZ2V0U3RhcnRNaWxsaXMoKTsKKyAgICBTdHJpbmcgbmFtZT0gdHIuZ2V0TWV0aG9kKCkuaXNUZXN0KCkgPyB0ci5nZXROYW1lKCkgOiBVdGlscy5kZXRhaWxlZE1ldGhvZE5hbWUodHIuZ2V0TWV0aG9kKCksIGZhbHNlKTsKKyAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9OQU1FLCBuYW1lKTsKKyAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9DTEFTU05BTUUsIHRyLmdldFRlc3RDbGFzcygpLmdldFJlYWxDbGFzcygpLmdldE5hbWUoKSk7CisgICAgYXR0cnMuc2V0UHJvcGVydHkoWE1MQ29uc3RhbnRzLkFUVFJfVElNRSwgIiIgKyAoKChkb3VibGUpIGVsYXBzZWRUaW1lTWlsbGlzKSAvIDEwMDApKTsKKworICAgIGlmKChJVGVzdFJlc3VsdC5GQUlMVVJFID09IHRyLmdldFN0YXR1cygpKSB8fCAoSVRlc3RSZXN1bHQuU0tJUCA9PSB0ci5nZXRTdGF0dXMoKSkpIHsKKyAgICAgIGRvYy5wdXNoKFhNTENvbnN0YW50cy5URVNUQ0FTRSwgYXR0cnMpOworCisgICAgICBpZihJVGVzdFJlc3VsdC5GQUlMVVJFID09IHRyLmdldFN0YXR1cygpKSB7CisgICAgICAgIGNyZWF0ZUZhaWx1cmVFbGVtZW50KGRvYywgdHIpOworICAgICAgfQorICAgICAgZWxzZSBpZihJVGVzdFJlc3VsdC5TS0lQID09IHRyLmdldFN0YXR1cygpKSB7CisgICAgICAgIGNyZWF0ZVNraXBFbGVtZW50KGRvYywgdHIpOworICAgICAgfQorCisgICAgICBkb2MucG9wKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZG9jLmFkZEVtcHR5RWxlbWVudChYTUxDb25zdGFudHMuVEVTVENBU0UsIGF0dHJzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY3JlYXRlRmFpbHVyZUVsZW1lbnQoWE1MU3RyaW5nQnVmZmVyIGRvYywgSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBQcm9wZXJ0aWVzIGF0dHJzPSBuZXcgUHJvcGVydGllcygpOworICAgIFRocm93YWJsZSB0PSB0ci5nZXRUaHJvd2FibGUoKTsKKyAgICBpZih0ICE9IG51bGwpIHsKKyAgICAgIGF0dHJzLnNldFByb3BlcnR5KFhNTENvbnN0YW50cy5BVFRSX1RZUEUsIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgU3RyaW5nIG1lc3NhZ2U9IHQuZ2V0TWVzc2FnZSgpOworICAgICAgaWYoKG1lc3NhZ2UgIT0gbnVsbCkgJiYgKG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxDb25zdGFudHMuQVRUUl9NRVNTQUdFLCBlbmNvZGVBdHRyKG1lc3NhZ2UpKTsgLy8gRU5DT0RFCisgICAgICB9CisgICAgICBkb2MucHVzaChYTUxDb25zdGFudHMuRkFJTFVSRSwgYXR0cnMpOworICAgICAgZG9jLmFkZENEQVRBKFV0aWxzLnN0YWNrVHJhY2UodCwgZmFsc2UpWzBdKTsKKyAgICAgIGRvYy5wb3AoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkb2MuYWRkRW1wdHlFbGVtZW50KFhNTENvbnN0YW50cy5GQUlMVVJFKTsgLy8gVEhJUyBJUyBBTiBFUlJPUgorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjcmVhdGVTa2lwRWxlbWVudChYTUxTdHJpbmdCdWZmZXIgZG9jLCBJVGVzdFJlc3VsdCB0cikgeworICAgIGRvYy5hZGRFbXB0eUVsZW1lbnQoInNraXBwZWQiKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGVuY29kZUF0dHIoU3RyaW5nIGF0dHIpIHsKKyAgICBTdHJpbmcgcmVzdWx0PSByZXBsYWNlQW1wZXJzYW5kKGF0dHIsIEVOVElUWSk7CisgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIFBhdHRlcm4+IGU6IEFUVFJfRVNDQVBFUy5lbnRyeVNldCgpKSB7CisgICAgICByZXN1bHQ9IGUuZ2V0VmFsdWUoKS5tYXRjaGVyKHJlc3VsdCkucmVwbGFjZUFsbChlLmdldEtleSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZUFtcGVyc2FuZChTdHJpbmcgc3RyLCBQYXR0ZXJuIHBhdHRlcm4pIHsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGludCBpZHggPSBzdHIuaW5kZXhPZignJicsIHN0YXJ0KTsKKyAgICBpZihpZHggPT0gLTEpIHsKKyAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIFN0cmluZ0J1ZmZlciByZXN1bHQ9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZShpZHggIT0gLTEpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgaWR4KSk7CisgICAgICBpZihwYXR0ZXJuLm1hdGNoZXIoc3RyLnN1YnN0cmluZyhpZHgpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZyBpdCBpcyBhbiBlbnRpdHk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgfQorICAgICAgc3RhcnQ9IGlkeCArIDE7CisgICAgICBpZHg9IHN0ci5pbmRleE9mKCcmJywgc3RhcnQpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQpKTsKKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisKKyAgLyoqCisJICogUmVzZXQgYWxsIG1lbWJlciB2YXJpYWJsZXMgZm9yIG5leHQgdGVzdC4KKwkgKiAqLworCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKKwkJbV9hbGxUZXN0cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoTGlzdHMuPElUZXN0UmVzdWx0Pm5ld0FycmF5TGlzdCgpKTsKKwkJbV9jb25maWdJc3N1ZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KExpc3RzLjxJVGVzdFJlc3VsdD5uZXdBcnJheUxpc3QoKSk7CisJCW1fbnVtRmFpbGVkID0gMDsKKwkJbV9udW1GYWlsZWRCdXRJZ25vcmVkID0gMDsKKwkJbV9udW1QYXNzZWQgPSAwOworCQltX251bVNraXBwZWQgPSAwOworCX0KKworCS8qKgorCSAqIEBhdXRob3IgQm9yb2pldmljIENyZWF0ZWQgdGhpcyBtZXRob2QgdG8gZ3VhcmFudGVlIHVuaXF1ZSBmaWxlIG5hbWVzIGZvcgorCSAqICAgICAgICAgcmVwb3J0cy48YnI+CisJICogICAgICAgICBBbHNvLCB0aGlzIHdpbGwgZ3VhcmFudGVlIHRoYXQgdGhlIG9sZCByZXBvcnRzIGFyZSBvdmVyd3JpdHRlbgorCSAqICAgICAgICAgd2hlbiB0ZXN0cyBhcmUgcnVuIGFnYWluLgorCSAqIEBwYXJhbSBjb250ZXh0CisJICogICAgICAgICAgICB0ZXN0IGNvbnRleHQKKwkgKiBAcmV0dXJuIHVuaXF1ZSBuYW1lIGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNvbnRleHQuCisJICogKi8KKwlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUZpbGVOYW1lKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7CisJCVN0cmluZyBrZXlUb1NlYXJjaCA9IGNvbnRleHQuZ2V0U3VpdGUoKS5nZXROYW1lKCkgKyBjb250ZXh0LmdldE5hbWUoKTsKKwkJaWYgKG1fZmlsZU5hbWVNYXAuZ2V0KGtleVRvU2VhcmNoKSA9PSBudWxsKSB7CisJCQlmaWxlTmFtZSA9IGNvbnRleHQuZ2V0TmFtZSgpOworCQl9IGVsc2UgeworCQkJZmlsZU5hbWUgPSBjb250ZXh0LmdldE5hbWUoKSArIG1fZmlsZU5hbWVJbmNyZW1lbnRlcisrOworCQl9CisKKwkJbV9maWxlTmFtZU1hcC5wdXQoa2V5VG9TZWFyY2gsIGZpbGVOYW1lKTsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvSnFSZXBvcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9KcVJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwY2IxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvSnFSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JUmVzdWx0TWFwOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgSnFSZXBvcnRlciBpbXBsZW1lbnRzIElSZXBvcnRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDID0gImNsYXNzIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEQgPSAiZGl2IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFMgPSAic3BhbiI7CisKKyAgcHJpdmF0ZSBpbnQgbV90ZXN0Q291bnQgPSAwOworICBwcml2YXRlIFN0cmluZyBtX291dHB1dERpcmVjdG9yeTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1fdGVzdE1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcG9ydChMaXN0PFhtbFN1aXRlPiB4bWxTdWl0ZXMsIExpc3Q8SVN1aXRlPiBzdWl0ZXMsCisgICAgICBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgbV9vdXRwdXREaXJlY3RvcnkgPSAiL1VzZXJzL2NlZHJpYy9qYXZhL21pc2MvanF1ZXJ5IjsKKworICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCIgICIpOworICAgIHhzYi5wdXNoKEQsICJpZCIsICJzdWl0ZXMiKTsKKyAgICBnZW5lcmF0ZVN1aXRlcyh4bWxTdWl0ZXMsIHN1aXRlcywgeHNiKTsKKyAgICB4c2IucG9wKEQpOworCisgICAgU3RyaW5nIGFsbDsKKyAgICB0cnkgeworICAgICAgYWxsID0gRmlsZXMucmVhZEZpbGUobmV3IEZpbGUoIi9Vc2Vycy9jZWRyaWMvamF2YS9taXNjL2pxdWVyeS9oZWFkIikpOworICAgICAgVXRpbHMud3JpdGVGaWxlKG1fb3V0cHV0RGlyZWN0b3J5LCAiaW5kZXgyLmh0bWwiLCBhbGwgKyB4c2IudG9YTUwoKSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFhNTFN0cmluZ0J1ZmZlciBnZW5lcmF0ZVN1aXRlcyhMaXN0PFhtbFN1aXRlPiB4bWxTdWl0ZXMsCisgICAgICBMaXN0PElTdWl0ZT4gc3VpdGVzLCBYTUxTdHJpbmdCdWZmZXIgbWFpbikgeworICAgICBmb3IgKElTdWl0ZSBzdWl0ZSA6IHN1aXRlcykgeworICAgICAgaWYgKHN1aXRlLmdldFJlc3VsdHMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIobWFpbi5nZXRDdXJyZW50SW5kZW50KCkpOworICAgICAgWE1MU3RyaW5nQnVmZmVyIGhlYWRlciA9IG5ldyBYTUxTdHJpbmdCdWZmZXIobWFpbi5nZXRDdXJyZW50SW5kZW50KCkpOworCisgICAgICB4c2IucHVzaChELCBDLCAic3VpdGUtY29udGVudCIpOworICAgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHRzID0gc3VpdGUuZ2V0UmVzdWx0cygpOworICAgICAgWE1MU3RyaW5nQnVmZmVyIHhzMSA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoeHNiLmdldEN1cnJlbnRJbmRlbnQoKSk7CisgICAgICBYTUxTdHJpbmdCdWZmZXIgeHMyID0gbmV3IFhNTFN0cmluZ0J1ZmZlcih4c2IuZ2V0Q3VycmVudEluZGVudCgpKTsKKyAgICAgIFhNTFN0cmluZ0J1ZmZlciB4czMgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKHhzYi5nZXRDdXJyZW50SW5kZW50KCkpOworICAgICAgaW50IGZhaWxlZCA9IDA7CisgICAgICBpbnQgc2tpcHBlZCA9IDA7CisgICAgICBpbnQgcGFzc2VkID0gMDsKKyAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpIHsKKyAgICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQgPSByZXN1bHQuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgZmFpbGVkICs9IGNvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIGdlbmVyYXRlVGVzdHMoImZhaWxlZCIsIGNvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKSwgY29udGV4dCwgeHMxKTsKKyAgICAgICAgc2tpcHBlZCArPSBjb250ZXh0LmdldFNraXBwZWRUZXN0cygpLnNpemUoKTsKKyAgICAgICAgZ2VuZXJhdGVUZXN0cygic2tpcHBlZCIsIGNvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCksIGNvbnRleHQsIHhzMik7CisgICAgICAgIHBhc3NlZCArPSBjb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgICBnZW5lcmF0ZVRlc3RzKCJwYXNzZWQiLCBjb250ZXh0LmdldFBhc3NlZFRlc3RzKCksIGNvbnRleHQsIHhzMyk7CisgICAgICB9CisgICAgICB4c2IuYWRkT3B0aW9uYWwoRCwgIkZhaWxlZCIgKyAiIHRlc3RzIiwgQywgInJlc3VsdC1iYW5uZXIgIiArICJmYWlsZWQiKTsKKyAgICAgIHhzYi5hZGRTdHJpbmcoeHMxLnRvWE1MKCkpOworICAgICAgeHNiLmFkZE9wdGlvbmFsKEQsICJTa2lwcGVkIiArICIgdGVzdHMiLCBDLCAicmVzdWx0LWJhbm5lciAiICsgInNraXBwZWQiKTsKKyAgICAgIHhzYi5hZGRTdHJpbmcoeHMyLnRvWE1MKCkpOworICAgICAgeHNiLmFkZE9wdGlvbmFsKEQsICJQYXNzZWQiICsgIiB0ZXN0cyIsIEMsICJyZXN1bHQtYmFubmVyICIgKyAicGFzc2VkIik7CisgICAgICB4c2IuYWRkU3RyaW5nKHhzMy50b1hNTCgpKTsKKworCisgICAgICBoZWFkZXIucHVzaChELCBDLCAic3VpdGUiKTsKKyAgICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1oZWFkZXIiKTsKKyAgICAgIGhlYWRlci5hZGRPcHRpb25hbChTLCBzdWl0ZS5nZXROYW1lKCksIEMsICJzdWl0ZS1uYW1lIik7CisgICAgICBoZWFkZXIucHVzaChELCBDLCAic3RhdHMiKTsKKyAgICAgIGludCB0b3RhbCA9IGZhaWxlZCArIHNraXBwZWQgKyBwYXNzZWQ7CisgICAgICBTdHJpbmcgc3RhdHMgPSBTdHJpbmcuZm9ybWF0KCIlcywgJWQgZmFpbGVkLCAlZCBza2lwcGVkLCAlZCBwYXNzZWQiLAorICAgICAgICAgIHBsdXJhbGl6ZSh0b3RhbCwgIm1ldGhvZCIpLCBmYWlsZWQsIHNraXBwZWQsIHBhc3NlZCk7CisgICAgICBoZWFkZXIucHVzaCgidWwiKTsKKworICAgICAgLy8gTWV0aG9kIHN0YXRzCisgICAgICBoZWFkZXIucHVzaCgibGkiKTsKKyAgICAgIGhlYWRlci5hZGRPcHRpb25hbChTLCBzdGF0cywgQywgIm1ldGhvZC1zdGF0cyIpOworICAgICAgaGVhZGVyLnBvcCgibGkiKTsKKworICAgICAgLy8gVGVzdHMKKyAgICAgIGhlYWRlci5wdXNoKCJsaSIpOworICAgICAgaGVhZGVyLmFkZE9wdGlvbmFsKFMsIFN0cmluZy5mb3JtYXQoIiVzICIsIHBsdXJhbGl6ZShyZXN1bHRzLnZhbHVlcygpLnNpemUoKSwgInRlc3QiKSwKKyAgICAgICAgICBDLCAidGVzdC1zdGF0cyIpKTsKKyAgICAgIGhlYWRlci5wb3AoImxpIik7CisKKyAgICAgIC8vIExpc3Qgb2YgdGVzdHMKKyAgICAgIGhlYWRlci5wdXNoKCJ1bCIpOworICAgICAgZm9yIChJU3VpdGVSZXN1bHQgdHIgOiByZXN1bHRzLnZhbHVlcygpKSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IHRyLmdldFRlc3RDb250ZXh0KCkuZ2V0TmFtZSgpOworICAgICAgICBoZWFkZXIucHVzaCgibGkiKTsKKyAgICAgICAgaGVhZGVyLmFkZE9wdGlvbmFsKCJhIiwgdGVzdE5hbWUsICJocmVmIiwgIiMiICsgbV90ZXN0TWFwLmdldCh0ZXN0TmFtZSkpOworICAgICAgICBoZWFkZXIucG9wKCJsaSIpOworICAgICAgfQorICAgICAgaGVhZGVyLnBvcCgidWwiKTsKKworICAgICAgaGVhZGVyLnBvcCgidWwiKTsKKyAgICAgIGhlYWRlci5wb3AoRCk7CisKKyAgICAgIGhlYWRlci5wb3AoRCk7CisKKyAgICAgIG1haW4uYWRkU3RyaW5nKGhlYWRlci50b1hNTCgpKTsKKyAgICAgIG1haW4uYWRkU3RyaW5nKHhzYi50b1hNTCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFpbjsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHMpIHsKKyAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdHMoU3RyaW5nIHRhZ0NsYXNzLCBJUmVzdWx0TWFwIHRlc3RzLCBJVGVzdENvbnRleHQgY29udGV4dCwKKyAgICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IpIHsKKworICAgIGlmICh0ZXN0cy5nZXRBbGxNZXRob2RzKCkuaXNFbXB0eSgpKSByZXR1cm47CisKKyAgICB4c2IucHVzaChELCBDLCAidGVzdCIgKyAodGFnQ2xhc3MgIT0gbnVsbCA/ICIgIiArIHRhZ0NsYXNzIDogIiIpKTsKKyAgICBMaXN0TXVsdGlNYXA8Q2xhc3M8Pz4sIElUZXN0UmVzdWx0PiBtYXAgPSBNYXBzLm5ld0xpc3RNdWx0aU1hcCgpOworICAgIGZvciAoSVRlc3RSZXN1bHQgbSA6IHRlc3RzLmdldEFsbFJlc3VsdHMoKSkgeworICAgICAgbWFwLnB1dChtLmdldFRlc3RDbGFzcygpLmdldFJlYWxDbGFzcygpLCBtKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdGVzdE5hbWUgPSAidGVzdC0iICsgKG1fdGVzdENvdW50KyspOworICAgIG1fdGVzdE1hcC5wdXQoY29udGV4dC5nZXROYW1lKCksIHRlc3ROYW1lKTsKKyAgICB4c2IucHVzaChELCBDLCAidGVzdC1uYW1lIik7CisgICAgeHNiLnB1c2goImEiLCAibmFtZSIsIHRlc3ROYW1lKTsKKyAgICB4c2IuYWRkU3RyaW5nKGNvbnRleHQuZ2V0TmFtZSgpKTsKKyAgICB4c2IucG9wKCJhIik7CisKKyAgICAvLyBFeHBhbmQgaWNvbgorICAgIHhzYi5wdXNoKCJhIiwgQywgImV4cGFuZCIsICJocmVmIiwgIiMiKTsKKyAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJpbWciLCAic3JjIiwgZ2V0U3RhdHVzSW1hZ2UodGFnQ2xhc3MpKTsKKyAgICB4c2IucG9wKCJhIik7CisKKyAgICB4c2IucG9wKEQpOworCisgICAgeHNiLnB1c2goRCwgQywgInRlc3QtY29udGVudCIpOworICAgIGZvciAoQ2xhc3M8Pz4gYyA6IG1hcC5rZXlTZXQoKSkgeworICAgICAgeHNiLnB1c2goRCwgQywgQyk7CisgICAgICB4c2IucHVzaChELCBDLCAiY2xhc3MtaGVhZGVyIik7CisKKyAgICAgIC8vIFBhc3NlZC9mYWlsZWQgaWNvbgorICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiaW1nIiwgInNyYyIsIGdldEltYWdlKHRhZ0NsYXNzKSk7CisKKyAgICAgIHhzYi5hZGRPcHRpb25hbChTLCBjLmdldE5hbWUoKSwgQywgImNsYXNzLW5hbWUiKTsKKworICAgICAgeHNiLnBvcChEKTsKKyAgICAgIHhzYi5wdXNoKEQsIEMsICJjbGFzcy1jb250ZW50Iik7CisgICAgICBMaXN0PElUZXN0UmVzdWx0PiBsID0gbWFwLmdldChjKTsKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgbSA6IGwpIHsKKyAgICAgICAgZ2VuZXJhdGVNZXRob2QodGFnQ2xhc3MsIG0sIGNvbnRleHQsIHhzYik7CisgICAgICB9CisgICAgICB4c2IucG9wKEQpOworICAgICAgeHNiLnBvcChEKTsKKyAgICB9CisgICAgeHNiLnBvcChEKTsKKworICAgIHhzYi5wb3AoRCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdHVzSW1hZ2UoU3RyaW5nIHN0YXR1cykgeworICAgIHJldHVybiAidXAucG5nIjsKKy8vICAgIGlmICgicGFzc2VkIi5lcXVhbHMoc3RhdHVzKSkgcmV0dXJuICJkb3duLnBuZyI7CisvLyAgICBlbHNlIHJldHVybiAidXAucG5nIjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbWFnZShTdHJpbmcgdGFnQ2xhc3MpIHsKKyAgICByZXR1cm4gdGFnQ2xhc3MgKyAiLnBuZyI7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVNZXRob2QoU3RyaW5nIHRhZ0NsYXNzLCBJVGVzdFJlc3VsdCB0ciwKKyAgICAgIElUZXN0Q29udGV4dCBjb250ZXh0LCBYTUxTdHJpbmdCdWZmZXIgeHNiKSB7CisgICAgbG9uZyB0aW1lID0gdHIuZ2V0RW5kTWlsbGlzKCkgLSB0ci5nZXRTdGFydE1pbGxpcygpOworICAgIHhzYi5wdXNoKEQsIEMsICJtZXRob2QiKTsKKyAgICB4c2IucHVzaChELCBDLCAibWV0aG9kLWNvbnRlbnQiKTsKKyAgICB4c2IuYWRkT3B0aW9uYWwoUywgdHIuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCBDLCAibWV0aG9kLW5hbWUiKTsKKworICAgIC8vIFBhcmFtZXRlcnM/CisgICAgaWYgKHRyLmdldFBhcmFtZXRlcnMoKS5sZW5ndGggPiAwKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChPYmplY3QgcCA6IHRyLmdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIHNiLmFwcGVuZChVdGlscy50b1N0cmluZyhwKSk7CisgICAgICB9CisgICAgICB4c2IuYWRkT3B0aW9uYWwoUywgIigiICsgc2IudG9TdHJpbmcoKSArICIpIiwgQywgInBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICAvLyBFeGNlcHRpb24/CisgICAgaWYgKHRyLmdldFRocm93YWJsZSgpICE9IG51bGwpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc3RhY2tUcmFjZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHN0ciA6IHRyLmdldFRocm93YWJsZSgpLmdldFN0YWNrVHJhY2UoKSkgeworICAgICAgICBzdGFja1RyYWNlLmFwcGVuZChzdHIudG9TdHJpbmcoKSkuYXBwZW5kKCI8YnI+Iik7CisgICAgICB9CisgICAgICB4c2IuYWRkT3B0aW9uYWwoRCwgc3RhY2tUcmFjZS50b1N0cmluZygpICsgIlxuIiwKKyAgICAgICAgICBDLCAic3RhY2stdHJhY2UiKTsKKyAgICB9CisKKyAgICB4c2IuYWRkT3B0aW9uYWwoUywgIiAiICsgTG9uZy50b1N0cmluZyh0aW1lKSArICIgbXMiLCBDLCAibWV0aG9kLXRpbWUiKTsKKyAgICB4c2IucG9wKEQpOworICAgIHhzYi5wb3AoRCk7CisgIH0KKworICAvKioKKyAgICogT3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcyB0byBjcmVhdGUgZGlmZmVyZW50IGRpcmVjdG9yeSBuYW1lcyAoZS5nLiB3aXRoIHRpbWVzdGFtcHMpLgorICAgKiBAcGFyYW0gb3V0cHV0RGlyZWN0b3J5IHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgdXNlcgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZU91dHB1dERpcmVjdG9yeU5hbWUoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBwbHVyYWxpemUoaW50IGNvdW50LCBTdHJpbmcgc2luZ3VsYXIpIHsKKyAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhjb3VudCkgKyAiICIKKyAgICAgICAgKyAoY291bnQgPiAxID8gKHNpbmd1bGFyLmVuZHNXaXRoKCJzIikgPyBzaW5ndWxhciArICJlcyIgOiBzaW5ndWxhciArICJzIikgOiBzaW5ndWxhcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9TdWl0ZUhUTUxSZXBvcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9TdWl0ZUhUTUxSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmZjhkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1N1aXRlSFRNTFJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSw3MzUgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlscy5pc1N0cmluZ05vdEVtcHR5OworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZVJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBIVE1MIHJlcG9ydGVyIGZvciBzdWl0ZXMuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFN1aXRlSFRNTFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EU19DSFJPTk9MT0dJQ0FMID0gIm1ldGhvZHMuaHRtbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRFNfQUxQSEFCRVRJQ0FMID0gIm1ldGhvZHMtYWxwaGFiZXRpY2FsLmh0bWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUFMgPSAiZ3JvdXBzLmh0bWwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTID0gImNsYXNzZXMuaHRtbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVEVSX09VVFBVVCA9ICJyZXBvcnRlci1vdXRwdXQuaHRtbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRFNfTk9UX1JVTiA9ICJtZXRob2RzLW5vdC1ydW4uaHRtbCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1ROR19YTUwgPSAidGVzdG5nLnhtbC5odG1sIjsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIElUZXN0Q2xhc3M+IG1fY2xhc3NlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIFN0cmluZyBtX291dHB1dERpcmVjdG9yeTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgbV9vdXRwdXREaXJlY3RvcnkgPSBnZW5lcmF0ZU91dHB1dERpcmVjdG9yeU5hbWUob3V0cHV0RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAib2xkIik7CisKKyAgICB0cnkgeworICAgICAgSHRtbEhlbHBlci5nZW5lcmF0ZVN0eWxlc2hlZXQob3V0cHV0RGlyZWN0b3J5KTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyAgVE9ETyBQcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbiBwcm9wZXJseS4KKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKworICAgICAgLy8KKyAgICAgIC8vIEdlbmVyYXRlIHRoZSB2YXJpb3VzIHJlcG9ydHMKKyAgICAgIC8vCisgICAgICBYbWxTdWl0ZSB4bWxTdWl0ZSA9IHN1aXRlLmdldFhtbFN1aXRlKCk7CisgICAgICBpZiAoeG1sU3VpdGUuZ2V0VGVzdHMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGdlbmVyYXRlVGFibGVPZkNvbnRlbnRzKHhtbFN1aXRlLCBzdWl0ZSk7CisgICAgICBnZW5lcmF0ZVN1aXRlcyh4bWxTdWl0ZSwgc3VpdGUpOworICAgICAgZ2VuZXJhdGVJbmRleCh4bWxTdWl0ZSwgc3VpdGUpOworICAgICAgZ2VuZXJhdGVNYWluKHhtbFN1aXRlLCBzdWl0ZSk7CisgICAgICBnZW5lcmF0ZU1ldGhvZHNBbmRHcm91cHMoeG1sU3VpdGUsIHN1aXRlKTsKKyAgICAgIGdlbmVyYXRlTWV0aG9kc0Nocm9ub2xvZ2ljYWxseSh4bWxTdWl0ZSwgc3VpdGUsIE1FVEhPRFNfQ0hST05PTE9HSUNBTCwgZmFsc2UpOworICAgICAgZ2VuZXJhdGVNZXRob2RzQ2hyb25vbG9naWNhbGx5KHhtbFN1aXRlLCBzdWl0ZSwgTUVUSE9EU19BTFBIQUJFVElDQUwsIHRydWUpOworICAgICAgZ2VuZXJhdGVDbGFzc2VzKHhtbFN1aXRlLCBzdWl0ZSk7CisgICAgICBnZW5lcmF0ZVJlcG9ydGVyT3V0cHV0KHhtbFN1aXRlLCBzdWl0ZSk7CisgICAgICBnZW5lcmF0ZUV4Y2x1ZGVkTWV0aG9kc1JlcG9ydCh4bWxTdWl0ZSwgc3VpdGUpOworICAgICAgZ2VuZXJhdGVYbWxGaWxlKHhtbFN1aXRlLCBzdWl0ZSk7CisgICAgfQorCisgICAgZ2VuZXJhdGVJbmRleChzdWl0ZXMpOworICB9CisKKyAgLyoqCisgICAqIE92ZXJyaWRhYmxlIGJ5IHN1YmNsYXNzZXMgdG8gY3JlYXRlIGRpZmZlcmVudCBkaXJlY3RvcnkgbmFtZXMgKGUuZy4gd2l0aCB0aW1lc3RhbXBzKS4KKyAgICogQHBhcmFtIG91dHB1dERpcmVjdG9yeSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVPdXRwdXREaXJlY3RvcnlOYW1lKFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKKyAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlWG1sRmlsZShYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nIGNvbnRlbnQgPSB4bWxTdWl0ZS50b1htbCgpLnJlcGxhY2VBbGwoIjwiLCAiJmx0OyIpLnJlcGxhY2VBbGwoIj4iLCAiJmd0OyIpCisgICAgICAgICAgLnJlcGxhY2VBbGwoIiAiLCAiJm5ic3A7IikucmVwbGFjZUFsbCgiXG4iLCAiPGJyLz4iKTsKKworICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjxodG1sPiIpOworCisgICAgc2IuYXBwZW5kKCI8aGVhZD48dGl0bGU+IikuYXBwZW5kKCJ0ZXN0bmcueG1sIGZvciAiKQorICAgICAgLmFwcGVuZCh4bWxTdWl0ZS5nZXROYW1lKCkpLmFwcGVuZCgiPC90aXRsZT48L2hlYWQ+PGJvZHk+PHR0PiIpCisgICAgICAuYXBwZW5kKGNvbnRlbnQpCisgICAgICAuYXBwZW5kKCI8L3R0PjwvYm9keT48L2h0bWw+Iik7CisKKyAgICBVdGlscy53cml0ZUZpbGUoZ2V0T3V0cHV0RGlyZWN0b3J5KHhtbFN1aXRlKSwgVEVTVE5HX1hNTCwgc2IudG9TdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGUgdGhlIG1haW4gaW5kZXguaHRtbCBmaWxlIHRoYXQgbGlzdHMgYWxsIHRoZSBzdWl0ZXMKKyAgICogYW5kIHRoZWlyIHJlc3VsdAorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW5kZXgoTGlzdDxJU3VpdGU+IHN1aXRlcykgeworICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBTdHJpbmcgdGl0bGUgPSAiVGVzdCByZXN1bHRzIjsKKyAgICBzYi5hcHBlbmQoIjxodG1sPlxuPGhlYWQ+PHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpCisgICAgICAuYXBwZW5kKEh0bWxIZWxwZXIuZ2V0Q3NzU3RyaW5nKCIuIikpCisgICAgICAuYXBwZW5kKCI8L2hlYWQ+PGJvZHk+XG4iKQorICAgICAgLmFwcGVuZCgiPGgyPjxwIGFsaWduPSdjZW50ZXInPiIpLmFwcGVuZCh0aXRsZSkuYXBwZW5kKCI8L3A+PC9oMj5cbiIpCisgICAgICAuYXBwZW5kKCI8dGFibGUgYm9yZGVyPScxJyB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4tcGFnZSc+IikKKyAgICAgIC5hcHBlbmQoIjx0cj48dGg+U3VpdGU8L3RoPjx0aD5QYXNzZWQ8L3RoPjx0aD5GYWlsZWQ8L3RoPjx0aD5Ta2lwcGVkPC90aD48dGg+dGVzdG5nLnhtbDwvdGg+PC90cj5cbiIpOworCisgICAgaW50IHRvdGFsRmFpbGVkVGVzdHMgPSAwOworICAgIGludCB0b3RhbFBhc3NlZFRlc3RzID0gMDsKKyAgICBpbnQgdG90YWxTa2lwcGVkVGVzdHMgPSAwOworCisgICAgU3RyaW5nQnVmZmVyIHN1aXRlQnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIGlmIChzdWl0ZS5nZXRSZXN1bHRzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFN0cmluZyBuYW1lID0gc3VpdGUuZ2V0TmFtZSgpOworCisgICAgICBpbnQgZmFpbGVkVGVzdHM9IDA7CisgICAgICBpbnQgcGFzc2VkVGVzdHM9IDA7CisgICAgICBpbnQgc2tpcHBlZFRlc3RzPSAwOworCisgICAgICBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IHJlc3VsdHMgPSBzdWl0ZS5nZXRSZXN1bHRzKCk7CisgICAgICBmb3IgKElTdWl0ZVJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKSB7CisgICAgICAgIElUZXN0Q29udGV4dCBjb250ZXh0ID0gcmVzdWx0LmdldFRlc3RDb250ZXh0KCk7CisgICAgICAgIGZhaWxlZFRlc3RzICs9IGNvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIHRvdGFsRmFpbGVkVGVzdHMgKz0gY29udGV4dC5nZXRGYWlsZWRUZXN0cygpLnNpemUoKTsKKyAgICAgICAgcGFzc2VkVGVzdHMgKz0gY29udGV4dC5nZXRQYXNzZWRUZXN0cygpLnNpemUoKTsKKyAgICAgICAgdG90YWxQYXNzZWRUZXN0cyArPSBjb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgICBza2lwcGVkVGVzdHMgKz0gY29udGV4dC5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIHRvdGFsU2tpcHBlZFRlc3RzICs9IGNvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgfQorCisgICAgICBTdHJpbmcgY2xzID0gZmFpbGVkVGVzdHMgPiAwID8gImludm9jYXRpb24tZmFpbGVkIgorICAgICAgICAgIDogKHBhc3NlZFRlc3RzID4gMCAgPyAiaW52b2NhdGlvbi1wYXNzZWQiIDogImludm9jYXRpb24tZmFpbGVkIik7CisgICAgICBzdWl0ZUJ1Zi5hcHBlbmQoIjx0ciBhbGlnbj0nY2VudGVyJyBjbGFzcz0nIikuYXBwZW5kKGNscykuYXBwZW5kKCInPiIpCisgICAgICAgIC5hcHBlbmQoIjx0ZD48YSBocmVmPSciKS5hcHBlbmQobmFtZSkuYXBwZW5kKCIvaW5kZXguaHRtbCc+IikKKyAgICAgICAgLmFwcGVuZChuYW1lKS5hcHBlbmQoIjwvYT48L3RkPlxuIik7CisgICAgICBzdWl0ZUJ1Zi5hcHBlbmQoIjx0ZD4iICsgcGFzc2VkVGVzdHMgKyAiPC90ZD4iKQorICAgICAgICAuYXBwZW5kKCI8dGQ+IiArIGZhaWxlZFRlc3RzICsgIjwvdGQ+IikKKyAgICAgICAgLmFwcGVuZCgiPHRkPiIgKyBza2lwcGVkVGVzdHMgKyAiPC90ZD4iKQorICAgICAgICAuYXBwZW5kKCI8dGQ+PGEgaHJlZj0nIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLyIpLmFwcGVuZChURVNUTkdfWE1MKS5hcHBlbmQoIic+TGluayIpLmFwcGVuZCgiPC9hPjwvdGQ+IikKKyAgICAgICAgLmFwcGVuZCgiPC90cj4iKTsKKworICAgIH0KKworICAgIFN0cmluZyBjbHM9IHRvdGFsRmFpbGVkVGVzdHMgPiAwID8gImludm9jYXRpb24tZmFpbGVkIgorICAgICAgICA6ICh0b3RhbFBhc3NlZFRlc3RzID4gMCA/ICJpbnZvY2F0aW9uLXBhc3NlZCIgOiAiaW52b2NhdGlvbi1mYWlsZWQiKTsKKyAgICBzYi5hcHBlbmQoIjx0ciBhbGlnbj0nY2VudGVyJyBjbGFzcz0nIikuYXBwZW5kKGNscykuYXBwZW5kKCInPiIpCisgICAgICAuYXBwZW5kKCI8dGQ+PGVtPlRvdGFsPC9lbT48L3RkPiIpCisgICAgICAuYXBwZW5kKCI8dGQ+PGVtPiIpLmFwcGVuZCh0b3RhbFBhc3NlZFRlc3RzKS5hcHBlbmQoIjwvZW0+PC90ZD4iKQorICAgICAgLmFwcGVuZCgiPHRkPjxlbT4iKS5hcHBlbmQodG90YWxGYWlsZWRUZXN0cykuYXBwZW5kKCI8L2VtPjwvdGQ+IikKKyAgICAgIC5hcHBlbmQoIjx0ZD48ZW0+IikuYXBwZW5kKHRvdGFsU2tpcHBlZFRlc3RzKS5hcHBlbmQoIjwvZW0+PC90ZD4iKQorICAgICAgLmFwcGVuZCgiPHRkPiZuYnNwOzwvdGQ+IikKKyAgICAgIC5hcHBlbmQoIjwvdHI+XG4iKTsKKyAgICBzYi5hcHBlbmQoc3VpdGVCdWYpOworICAgIHNiLmFwcGVuZCgiPC90YWJsZT4iKS5hcHBlbmQoIjwvYm9keT48L2h0bWw+XG4iKTsKKworICAgIFV0aWxzLndyaXRlRmlsZShtX291dHB1dERpcmVjdG9yeSwgImluZGV4Lmh0bWwiLCBzYi50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUV4Y2x1ZGVkTWV0aG9kc1JlcG9ydChYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHN1aXRlKSB7CisgICAgICBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+IGV4Y2x1ZGVkID0gc3VpdGUuZ2V0RXhjbHVkZWRNZXRob2RzKCk7CisgICAgICBTdHJpbmdCdWZmZXIgc2IyID0gbmV3IFN0cmluZ0J1ZmZlcigiPGgyPk1ldGhvZHMgdGhhdCB3ZXJlIG5vdCBydW48L2gyPjx0YWJsZT5cbiIpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IGV4Y2x1ZGVkKSB7CisgICAgICAgIE1ldGhvZCBtID0gbWV0aG9kLmdldE1ldGhvZCgpOworICAgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgICAgc2IyLmFwcGVuZCgiPHRyPjx0ZD4iKQorICAgICAgICAgIC5hcHBlbmQobS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIiArIG0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBtZXRob2QuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICBpZihpc1N0cmluZ05vdEVtcHR5KGRlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgc2IyLmFwcGVuZCgiPGJyLz4iKS5hcHBlbmQoU1AyKS5hcHBlbmQoIjxpPiIpLmFwcGVuZChkZXNjcmlwdGlvbikuYXBwZW5kKCI8L2k+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIHNiMi5hcHBlbmQoIjwvdGQ+PC90cj5cbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzYjIuYXBwZW5kKCI8L3RhYmxlPiIpOworCisgICAgICBVdGlscy53cml0ZUZpbGUoZ2V0T3V0cHV0RGlyZWN0b3J5KHhtbFN1aXRlKSwgTUVUSE9EU19OT1RfUlVOLCBzYjIudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVSZXBvcnRlck91dHB1dChYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgLy8KKyAgICAvLyBSZXBvcnRlciBvdXRwdXQKKyAgICAvLworICAgIHNiLmFwcGVuZCgiPGgyPlJlcG9ydGVyIG91dHB1dDwvaDI+IikKKyAgICAgIC5hcHBlbmQoIjx0YWJsZT4iKTsKKyAgICBMaXN0PFN0cmluZz4gb3V0cHV0ID0gUmVwb3J0ZXIuZ2V0T3V0cHV0KCk7CisgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dCkgeworICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPiIpLmFwcGVuZChsaW5lKS5hcHBlbmQoIjwvdGQ+PC90cj5cbiIpOworICAgIH0KKworICAgIHNiLmFwcGVuZCgiPC90YWJsZT4iKTsKKworICAgIFV0aWxzLndyaXRlRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoeG1sU3VpdGUpLCBSRVBPUlRFUl9PVVRQVVQsIHNiLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2xhc3NlcyhYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHNiLmFwcGVuZCgiPHRhYmxlIGJvcmRlcj0nMSc+XG4iKQorICAgIC5hcHBlbmQoIjx0cj5cbiIpCisgICAgLmFwcGVuZCgiPHRoPkNsYXNzIG5hbWU8L3RoPlxuIikKKyAgICAuYXBwZW5kKCI8dGg+TWV0aG9kIG5hbWU8L3RoPlxuIikKKyAgICAuYXBwZW5kKCI8dGg+R3JvdXBzPC90aD5cbiIpCisgICAgLmFwcGVuZCgiPC90cj4iKQorICAgIDsKKyAgICBmb3IgKElUZXN0Q2xhc3MgdGMgOiBtX2NsYXNzZXMudmFsdWVzKCkpIHsKKyAgICAgIHNiLmFwcGVuZChnZW5lcmF0ZUNsYXNzKHRjKSk7CisgICAgfQorCisgICAgc2IuYXBwZW5kKCI8L3RhYmxlPlxuIik7CisKKyAgICBVdGlscy53cml0ZUZpbGUoZ2V0T3V0cHV0RGlyZWN0b3J5KHhtbFN1aXRlKSwgQ0xBU1NFUywgc2IudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1AgPSAiJm5ic3A7IjsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNQMiA9IFNQICsgU1AgKyBTUCArIFNQOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1AzID0gU1AyICsgU1AyOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1A0ID0gU1AzICsgU1AzOworCisgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ2xhc3MoSVRlc3RDbGFzcyBjbHMpIHsKKyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICBzYi5hcHBlbmQoIjx0cj5cbiIpCisgICAgICAuYXBwZW5kKCI8dGQ+IikuYXBwZW5kKGNscy5nZXRSZWFsQ2xhc3MoKS5nZXROYW1lKCkpLmFwcGVuZCgiPC90ZD5cbiIpCisgICAgICAuYXBwZW5kKCI8dGQ+Jm5ic3A7PC90ZD4iKQorICAgICAgLmFwcGVuZCgiPHRkPiZuYnNwOzwvdGQ+IikKKyAgICAgIC5hcHBlbmQoIjwvdHI+XG4iKQorICAgICAgOworCisgICAgU3RyaW5nW10gdGFncyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICJAVGVzdCIsCisgICAgICAgICJAQmVmb3JlQ2xhc3MiLAorICAgICAgICAiQEJlZm9yZU1ldGhvZCIsCisgICAgICAgICJAQWZ0ZXJNZXRob2QiLAorICAgICAgICAiQEFmdGVyQ2xhc3MiCisgICAgfTsKKyAgICBJVGVzdE5HTWV0aG9kW11bXSBtZXRob2RzID0gbmV3IElUZXN0TkdNZXRob2RbXVtdIHsKKyAgICAgIGNscy5nZXRUZXN0TWV0aG9kcygpLAorICAgICAgY2xzLmdldEJlZm9yZUNsYXNzTWV0aG9kcygpLAorICAgICAgY2xzLmdldEJlZm9yZVRlc3RNZXRob2RzKCksCisgICAgICBjbHMuZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpLAorICAgICAgY2xzLmdldEFmdGVyQ2xhc3NNZXRob2RzKCkKKyAgICB9OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CisgICAgICBzYi5hcHBlbmQoIjx0cj5cbiIpCisgICAgICAuYXBwZW5kKCI8dGQgYWxpZ249J2NlbnRlcicgY29sc3Bhbj0nMyc+IikuYXBwZW5kKHRhZ3NbaV0pLmFwcGVuZCgiPC90ZD5cbiIpCisgICAgICAuYXBwZW5kKCI8L3RyPlxuIikKKyAgICAgIC5hcHBlbmQoZHVtcE1ldGhvZHMobWV0aG9kc1tpXSkpCisgICAgICA7CisgICAgfQorLy8gICAgc2IuYXBwZW5kKCI8aHIgd2lkdGg9JzEwMCUnLz4iKQorLy8gICAgLmFwcGVuZCgiPGgzPiIpLmFwcGVuZChjbHMuZ2V0UmVhbENsYXNzKCkuZ2V0TmFtZSgpKS5hcHBlbmQoIjwvaDM+XG4iKTsKKy8vCisvLyAgICBzYi5hcHBlbmQoIjxkaXY+IikuYXBwZW5kKFNQMykuYXBwZW5kKCJUZXN0IG1ldGhvZHNcbiIpCisvLyAgICAgIC5hcHBlbmQoZHVtcE1ldGhvZHMoY2xzLmdldFRlc3RNZXRob2RzKCkpKS5hcHBlbmQoIjwvZGl2PlxuIikKKy8vICAgICAgLmFwcGVuZCgiPGRpdj4iKS5hcHBlbmQoU1AzKS5hcHBlbmQoIkBCZWZvcmVDbGFzc1xuIikKKy8vICAgICAgLmFwcGVuZChkdW1wTWV0aG9kcyhjbHMuZ2V0QmVmb3JlQ2xhc3NNZXRob2RzKCkpKS5hcHBlbmQoIjwvZGl2PlxuIikKKy8vICAgICAgLmFwcGVuZCgiPGRpdj4iKS5hcHBlbmQoU1AzKS5hcHBlbmQoIkBCZWZvcmVNZXRob2RcbiIpCisvLyAgICAgIC5hcHBlbmQoZHVtcE1ldGhvZHMoY2xzLmdldEJlZm9yZVRlc3RNZXRob2RzKCkpKS5hcHBlbmQoIjwvZGl2PlxuIikKKy8vICAgICAgLmFwcGVuZCgiPGRpdj4iKS5hcHBlbmQoU1AzKS5hcHBlbmQoIkBBZnRlck1ldGhvZFxuIikKKy8vICAgICAgLmFwcGVuZChkdW1wTWV0aG9kcyhjbHMuZ2V0QWZ0ZXJUZXN0TWV0aG9kcygpKSkuYXBwZW5kKCI8L2Rpdj5cbiIpCisvLyAgICAgIC5hcHBlbmQoIjxkaXY+IikuYXBwZW5kKFNQMykuYXBwZW5kKCJAQWZ0ZXJDbGFzc1xuIikKKy8vICAgICAgLmFwcGVuZChkdW1wTWV0aG9kcyhjbHMuZ2V0QWZ0ZXJDbGFzc01ldGhvZHMoKSkpLmFwcGVuZCgiPC9kaXY+XG4iKQorLy8gICAgIDsKKworICAgIFN0cmluZyByZXN1bHQgPSBzYi50b1N0cmluZygpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBkdW1wTWV0aG9kcyhJVGVzdE5HTWV0aG9kW10gdGVzdE1ldGhvZHMpIHsKKyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgaWYobnVsbCA9PSB0ZXN0TWV0aG9kcyB8fCB0ZXN0TWV0aG9kcy5sZW5ndGggPT0gMCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogdGVzdE1ldGhvZHMpIHsKKyAgICAgIHNiLmFwcGVuZCgiPHRyPlxuIik7CisgICAgICBzYi5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPlxuIikKKyAgICAgICAgLmFwcGVuZCgiPHRkPiIpLmFwcGVuZChtLmdldE1ldGhvZE5hbWUoKSkuYXBwZW5kKCI8L3RkPlxuIikKKyAgICAgICAgOworICAgICAgU3RyaW5nW10gZ3JvdXBzID0gbS5nZXRHcm91cHMoKTsKKyAgICAgIGlmIChncm91cHMgIT0gbnVsbCAmJiBncm91cHMubGVuZ3RoID4gMCkgeworICAgICAgICBzYi5hcHBlbmQoIjx0ZD4iKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZyA6IGdyb3VwcykgeworICAgICAgICAgIHNiLmFwcGVuZChnKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+XG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzYi5hcHBlbmQoIjx0ZD4mbmJzcDs8L3RkPiIpOworICAgICAgfQorICAgICAgc2IuYXBwZW5kKCI8L3RyPlxuIik7CisgICAgfQorCisvLyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8YnIvPiIpOyAgLy8iPHRhYmxlIGJnY29sb3I9XCIjYzBjMGMwXCIvPiIpOworLy8gICAgZm9yIChJVGVzdE5HTWV0aG9kIHRtIDogdGVzdE1ldGhvZHMpIHsKKy8vICAgICAgc2IKKy8vICAgICAgLmFwcGVuZChTUDQpLmFwcGVuZCh0bS5nZXRNZXRob2ROYW1lKCkpLmFwcGVuZCgiKClcbiIpCisvLyAgICAgIC5hcHBlbmQoZHVtcEdyb3Vwcyh0bS5nZXRHcm91cHMoKSkpCisvLyAgICAgIC5hcHBlbmQoIjxici8+Iik7CisvLyAgICAgIDsKKy8vICAgIH0KKworCisgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGR1bXBHcm91cHMoU3RyaW5nW10gZ3JvdXBzKSB7CisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgaWYgKG51bGwgIT0gZ3JvdXBzICYmIGdyb3Vwcy5sZW5ndGggPiAwKSB7CisgICAgICBzYi5hcHBlbmQoU1A0KS5hcHBlbmQoIjxlbT5bIik7CisKKyAgICAgIGZvciAoU3RyaW5nIGcgOiBncm91cHMpIHsKKyAgICAgICAgc2IuYXBwZW5kKGcpLmFwcGVuZCgiICIpOworICAgICAgfQorCisgICAgICBzYi5hcHBlbmQoIl08L2VtPjxici8+XG4iKTsKKyAgICB9CisKKyAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXRob2RzIHRoYXQgd2VyZSBydW4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSPSAiJmx0OyZsdDsiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkUgPSAiJmd0OyZndDsiOworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVNZXRob2RzQ2hyb25vbG9naWNhbGx5KFhtbFN1aXRlIHhtbFN1aXRlLCBJU3VpdGUgc3VpdGUsCisgICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUsIGJvb2xlYW4gYWxwaGFiZXRpY2FsKQorICB7CisgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBidyA9IFV0aWxzLm9wZW5Xcml0ZXIoZ2V0T3V0cHV0RGlyZWN0b3J5KHhtbFN1aXRlKSwgb3V0cHV0RmlsZU5hbWUpKSB7CisgICAgICBidy5hcHBlbmQoIjxoMj5NZXRob2RzIHJ1biwgc29ydGVkIGNocm9ub2xvZ2ljYWxseTwvaDI+Iik7CisgICAgICBidy5hcHBlbmQoIjxoMz4iICsgQkVGT1JFICsgIiBtZWFucyBiZWZvcmUsICIgKyBBRlRFUiArICIgbWVhbnMgYWZ0ZXI8L2gzPjxwLz4iKTsKKworICAgICAgbG9uZyBzdGFydERhdGUgPSAtMTsKKyAgICAgIGJ3LmFwcGVuZCgiPGJyLz48ZW0+IikuYXBwZW5kKHN1aXRlLmdldE5hbWUoKSkuYXBwZW5kKCI8L2VtPjxwLz4iKTsKKyAgICAgIGJ3LmFwcGVuZCgiPHNtYWxsPjxpPihIb3ZlciB0aGUgbWV0aG9kIG5hbWUgdG8gc2VlIHRoZSB0ZXN0IGNsYXNzIG5hbWUpPC9pPjwvc21hbGw+PHAvPlxuIik7CisKKyAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2Q+IGludm9rZWRNZXRob2RzID0gc3VpdGUuZ2V0QWxsSW52b2tlZE1ldGhvZHMoKTsKKyAgICAgIGlmIChhbHBoYWJldGljYWwpIHsKKwlAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQorCUNvbXBhcmF0b3I8PyBzdXBlciBJVGVzdE5HTWV0aG9kPiAgYWxwaGFiZXRpY2FsQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCl7CisJICBAT3ZlcnJpZGUKKwkgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworCSAgICBJSW52b2tlZE1ldGhvZCBtMSA9IChJSW52b2tlZE1ldGhvZCkgbzE7CisJICAgIElJbnZva2VkTWV0aG9kIG0yID0gKElJbnZva2VkTWV0aG9kKSBvMjsKKwkgICAgcmV0dXJuIG0xLmdldFRlc3RNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkuY29tcGFyZVRvKG0yLmdldFRlc3RNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkpOworCSAgfQorCX07CisJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgaW52b2tlZE1ldGhvZHMsIGFscGhhYmV0aWNhbENvbXBhcmF0b3IpOworICAgICAgfQorCisgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eS9NTS9kZCBISDptbTpzcyIpOworICAgICAgYm9vbGVhbiBhZGRlZEhlYWRlciA9IGZhbHNlOworICAgICAgZm9yIChJSW52b2tlZE1ldGhvZCBpaW0gOiBpbnZva2VkTWV0aG9kcykgeworCUlUZXN0TkdNZXRob2QgdG0gPSBpaW0uZ2V0VGVzdE1ldGhvZCgpOworCWlmICghYWRkZWRIZWFkZXIpIHsKKwkgIGJ3LmFwcGVuZCgiPHRhYmxlIGJvcmRlcj1cIjFcIj5cbiIpCisJICAgIC5hcHBlbmQoIjx0cj4iKQorCSAgICAuYXBwZW5kKCI8dGg+VGltZTwvdGg+IikKKwkgICAgLmFwcGVuZCgiPHRoPkRlbHRhIChtcyk8L3RoPiIpCisJICAgIC5hcHBlbmQoIjx0aD5TdWl0ZTxicj5jb25maWd1cmF0aW9uPC90aD4iKQorCSAgICAuYXBwZW5kKCI8dGg+VGVzdDxicj5jb25maWd1cmF0aW9uPC90aD4iKQorCSAgICAuYXBwZW5kKCI8dGg+Q2xhc3M8YnI+Y29uZmlndXJhdGlvbjwvdGg+IikKKwkgICAgLmFwcGVuZCgiPHRoPkdyb3Vwczxicj5jb25maWd1cmF0aW9uPC90aD4iKQorCSAgICAuYXBwZW5kKCI8dGg+TWV0aG9kPGJyPmNvbmZpZ3VyYXRpb248L3RoPiIpCisJICAgIC5hcHBlbmQoIjx0aD5UZXN0PGJyPm1ldGhvZDwvdGg+IikKKwkgICAgLmFwcGVuZCgiPHRoPlRocmVhZDwvdGg+IikKKwkgICAgLmFwcGVuZCgiPHRoPkluc3RhbmNlczwvdGg+IikKKwkgICAgLmFwcGVuZCgiPC90cj5cbiIpOworCSAgYWRkZWRIZWFkZXIgPSB0cnVlOworCX0KKwlTdHJpbmcgbWV0aG9kTmFtZSA9IHRtLnRvU3RyaW5nKCk7CisJYm9vbGVhbiBiYyA9IHRtLmlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCk7CisJYm9vbGVhbiBhYyA9IHRtLmlzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb24oKTsKKwlib29sZWFuIGJ0ID0gdG0uaXNCZWZvcmVUZXN0Q29uZmlndXJhdGlvbigpOworCWJvb2xlYW4gYXQgPSB0bS5pc0FmdGVyVGVzdENvbmZpZ3VyYXRpb24oKTsKKwlib29sZWFuIGJzID0gdG0uaXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24oKTsKKwlib29sZWFuIGFzID0gdG0uaXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbigpOworCWJvb2xlYW4gYmcgPSB0bS5pc0JlZm9yZUdyb3Vwc0NvbmZpZ3VyYXRpb24oKTsKKwlib29sZWFuIGFnID0gdG0uaXNBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb24oKTsKKwlib29sZWFuIHNldFVwID0gdG0uaXNCZWZvcmVNZXRob2RDb25maWd1cmF0aW9uKCk7CisJYm9vbGVhbiB0ZWFyRG93biA9IHRtLmlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCk7CisJYm9vbGVhbiBpc0NsYXNzQ29uZmlndXJhdGlvbiA9IGJjIHx8IGFjOworCWJvb2xlYW4gaXNHcm91cHNDb25maWd1cmF0aW9uID0gYmcgfHwgYWc7CisJYm9vbGVhbiBpc1Rlc3RDb25maWd1cmF0aW9uID0gYnQgfHwgYXQ7CisJYm9vbGVhbiBpc1N1aXRlQ29uZmlndXJhdGlvbiA9IGJzIHx8IGFzOworCWJvb2xlYW4gaXNTZXR1cE9yVGVhckRvd24gPSBzZXRVcCB8fCB0ZWFyRG93bjsKKwlTdHJpbmcgY29uZmlndXJhdGlvbkNsYXNzTWV0aG9kID0gaXNDbGFzc0NvbmZpZ3VyYXRpb24gPyAoYmMgPyBCRUZPUkUgOiBBRlRFUikgKyBtZXRob2ROYW1lIDogU1A7CisJU3RyaW5nIGNvbmZpZ3VyYXRpb25UZXN0TWV0aG9kID0gaXNUZXN0Q29uZmlndXJhdGlvbiA/IChidCA/IEJFRk9SRSA6IEFGVEVSKSArIG1ldGhvZE5hbWUgOiBTUDsKKwlTdHJpbmcgY29uZmlndXJhdGlvbkdyb3Vwc01ldGhvZCA9IGlzR3JvdXBzQ29uZmlndXJhdGlvbiA/IChiZyA/IEJFRk9SRSA6IEFGVEVSKSArIG1ldGhvZE5hbWUgOiBTUDsKKwlTdHJpbmcgY29uZmlndXJhdGlvblN1aXRlTWV0aG9kID0gaXNTdWl0ZUNvbmZpZ3VyYXRpb24gPyAoYnMgPyBCRUZPUkUgOiBBRlRFUikgKyBtZXRob2ROYW1lIDogU1A7CisJU3RyaW5nIHNldFVwT3JUZWFyRG93bk1ldGhvZCA9IGlzU2V0dXBPclRlYXJEb3duID8gKHNldFVwID8gQkVGT1JFIDogQUZURVIpICsgbWV0aG9kTmFtZSA6IFNQOworCVN0cmluZyB0ZXN0TWV0aG9kID0gdG0uaXNUZXN0KCkgPyBtZXRob2ROYW1lIDogU1A7CisKKwlTdHJpbmdCdWZmZXIgaW5zdGFuY2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWZvciAobG9uZyBvIDogdG0uZ2V0SW5zdGFuY2VIYXNoQ29kZXMoKSkgeworCSAgaW5zdGFuY2VzLmFwcGVuZChvKS5hcHBlbmQoIiAiKTsKKwl9CisKKwlpZiAoc3RhcnREYXRlID09IC0xKSB7CisJICBzdGFydERhdGUgPSBpaW0uZ2V0RGF0ZSgpOworCX0KKwlTdHJpbmcgZGF0ZSA9IGZvcm1hdC5mb3JtYXQoaWltLmdldERhdGUoKSk7CisJYncuYXBwZW5kKCI8dHIgYmdjb2xvcj1cIiIgKyBjcmVhdGVDb2xvcih0bSkgKyAiXCI+IikKKwkgIC5hcHBlbmQoIiAgPHRkPiIpLmFwcGVuZChkYXRlKS5hcHBlbmQoIjwvdGQ+ICIpCisJICAuYXBwZW5kKCIgIDx0ZD4iKS5hcHBlbmQoTG9uZy50b1N0cmluZyhpaW0uZ2V0RGF0ZSgpIC0gc3RhcnREYXRlKSkuYXBwZW5kKCI8L3RkPiAiKQorCSAgLmFwcGVuZCh0ZChjb25maWd1cmF0aW9uU3VpdGVNZXRob2QpKQorCSAgLmFwcGVuZCh0ZChjb25maWd1cmF0aW9uVGVzdE1ldGhvZCkpCisJICAuYXBwZW5kKHRkKGNvbmZpZ3VyYXRpb25DbGFzc01ldGhvZCkpCisJICAuYXBwZW5kKHRkKGNvbmZpZ3VyYXRpb25Hcm91cHNNZXRob2QpKQorCSAgLmFwcGVuZCh0ZChzZXRVcE9yVGVhckRvd25NZXRob2QpKQorCSAgLmFwcGVuZCh0ZCh0ZXN0TWV0aG9kKSkKKwkgIC5hcHBlbmQoIiAgPHRkPiIpLmFwcGVuZCh0bS5nZXRJZCgpKS5hcHBlbmQoIjwvdGQ+ICIpCisJICAuYXBwZW5kKCIgIDx0ZD4iKS5hcHBlbmQoaW5zdGFuY2VzKS5hcHBlbmQoIjwvdGQ+ICIpCisJICAuYXBwZW5kKCI8L3RyPlxuIikKKwkgIDsKKyAgICAgIH0KKyAgICAgIGJ3LmFwcGVuZCgiPC90YWJsZT5cbiIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIFV0aWxzLmxvZygiW1N1aXRlSFRNTFJlcG9ydGVyXSIsIDEsICJFcnJvciB3cml0aW5nIHRvICIgKyBvdXRwdXRGaWxlTmFtZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGEgSFRNTCBjb2xvciBiYXNlZCBvbiB0aGUgY2xhc3Mgb2YgdGhlIG1ldGhvZAorICAgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ29sb3IoSVRlc3ROR01ldGhvZCB0bSkgeworICAgIC8vIHJlYWwgY2xhc3MgY2FuIGJlIG51bGwgaWYgdGhpcyBjbGllbnQgaXMgcmVtb3RlIChub3Qgc2VyaWFsaXphYmxlKQorICAgIGxvbmcgY29sb3IgPSB0bS5nZXRSZWFsQ2xhc3MoKSAhPSBudWxsID8gdG0uZ2V0UmVhbENsYXNzKCkuaGFzaENvZGUoKSAmIDB4ZmZmZmZmOiAweGZmZmZmZjsKKyAgICBsb25nW10gcmdiID0geworICAgICAgICAoKGNvbG9yICYgMHhmZjAwMDApID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICgoY29sb3IgJiAweDAwZmYwMCkgPj4gOCkgJiAweGZmLAorICAgICAgICBjb2xvciAmIDB4ZmYKKyAgICB9OworICAgIC8vIE5vdCB0b28gZGFyaworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAocmdiW2ldIDwgMHg2MCkgeworICAgICAgICByZ2JbaV0gKz0gMHg2MDsKKyAgICAgIH0KKyAgICB9CisgICAgbG9uZyBhZGp1c3RlZENvbG9yID0gKHJnYlswXSA8PCAxNikgfCAocmdiWzFdIDw8IDgpIHwgcmdiWzJdOworICAgIFN0cmluZyByZXN1bHQgPSBMb25nLnRvSGV4U3RyaW5nKGFkanVzdGVkQ29sb3IpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIHRkKFN0cmluZyBzKSB7CisgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBTdHJpbmcgcHJlZml4ID0gIiI7CisKKyAgICBpZiAocy5zdGFydHNXaXRoKEJFRk9SRSkpIHsKKyAgICAgIHByZWZpeCA9IEJFRk9SRTsKKyAgICB9CisgICAgZWxzZSBpZiAocy5zdGFydHNXaXRoKEFGVEVSKSkgeworICAgICAgcHJlZml4ID0gQUZURVI7CisgICAgfQorCisgICAgaWYgKCEgcy5lcXVhbHMoU1ApKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCI8dGQgdGl0bGU9XCIiKS5hcHBlbmQocykuYXBwZW5kKCJcIj4iKTsKKyAgICAgIGludCBvcGVuID0gcy5sYXN0SW5kZXhPZigiKCIpOworICAgICAgaW50IHN0YXJ0ID0gcy5zdWJzdHJpbmcoMCwgb3BlbikubGFzdEluZGV4T2YoIi4iKTsKKy8vICAgICAgaW50IGVuZCA9IHMubGFzdEluZGV4T2YoIikiKTsKKyAgICAgIGlmIChzdGFydCA+PSAwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4ICsgcy5zdWJzdHJpbmcoc3RhcnQgKyAxLCBvcGVuKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXggKyBzKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIjwvdGQ+IFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzdWx0LmFwcGVuZCgiPHRkPiIpLmFwcGVuZChTUCkuYXBwZW5kKCI8L3RkPiIpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTdWl0ZUhUTUxSZXBvcnRlcl0gIiArIHMpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGluZm9ybWF0aW9uIGFib3V0IG1ldGhvZHMgYW5kIGdyb3VwcworICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWV0aG9kc0FuZEdyb3VwcyhYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPj4gZ3JvdXBzID0gc3VpdGUuZ2V0TWV0aG9kc0J5R3JvdXBzKCk7CisKKyAgICBzYi5hcHBlbmQoIjxoMj5Hcm91cHMgdXNlZCBmb3IgdGhpcyB0ZXN0IHJ1bjwvaDI+Iik7CisgICAgaWYgKGdyb3Vwcy5zaXplKCkgPiAwKSB7CisgICAgICBzYi5hcHBlbmQoIjx0YWJsZSBib3JkZXI9XCIxXCI+XG4iKQorICAgICAgICAuYXBwZW5kKCI8dHI+IDx0ZCBhbGlnbj1cImNlbnRlclwiPjxiPkdyb3VwIG5hbWU8L2I+PC90ZD4iKQorICAgICAgICAuYXBwZW5kKCI8dGQgYWxpZ249XCJjZW50ZXJcIj48Yj5NZXRob2RzPC9iPjwvdGQ+PC90cj4iKTsKKworICAgICAgU3RyaW5nW10gZ3JvdXBOYW1lcyA9IGdyb3Vwcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbZ3JvdXBzLnNpemUoKV0pOworICAgICAgQXJyYXlzLnNvcnQoZ3JvdXBOYW1lcyk7CisgICAgICBmb3IgKFN0cmluZyBncm91cCA6IGdyb3VwTmFtZXMpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPiBtZXRob2RzID0gZ3JvdXBzLmdldChncm91cCk7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD4iKS5hcHBlbmQoZ3JvdXApLmFwcGVuZCgiPC90ZD4iKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1ldGhvZE5hbWVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBNYXA8SVRlc3ROR01ldGhvZCwgSVRlc3ROR01ldGhvZD4gdW5pcXVlTWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgdG0gOiBtZXRob2RzKSB7CisgICAgICAgICAgdW5pcXVlTWV0aG9kcy5wdXQodG0sIHRtKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKElUZXN0TkdNZXRob2QgdG0gOiB1bmlxdWVNZXRob2RzLnZhbHVlcygpKSB7CisgICAgICAgICAgbWV0aG9kTmFtZXMuYXBwZW5kKHRtLnRvU3RyaW5nKCkpLmFwcGVuZCgiPGJyLz4iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIjx0ZD4iICsgbWV0aG9kTmFtZXMudG9TdHJpbmcoKSArICI8L3RkPjwvdHI+XG4iKTsKKyAgICAgIH0KKworICAgICAgc2IuYXBwZW5kKCI8L3RhYmxlPlxuIik7CisgICAgfQorICAgIFV0aWxzLndyaXRlRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoeG1sU3VpdGUpLCBHUk9VUFMsIHNiLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW5kZXgoWG1sU3VpdGUgeG1sU3VpdGUsIElTdWl0ZSBzcikgeworICAgIFN0cmluZ0J1ZmZlciBpbmRleCA9IG5ldyBTdHJpbmdCdWZmZXIoKQorICAgIC5hcHBlbmQoIjxodG1sPjxoZWFkPjx0aXRsZT5SZXN1bHRzIGZvciAiICsgc3IuZ2V0TmFtZSgpICsgIjwvdGl0bGU+PC9oZWFkPlxuIikKKyAgICAuYXBwZW5kKCI8ZnJhbWVzZXQgY29scz1cIjI2JSw3NCVcIj5cbiIpCisgICAgLmFwcGVuZCgiPGZyYW1lIHNyYz1cInRvYy5odG1sXCIgbmFtZT1cIm5hdkZyYW1lXCI+XG4iKQorICAgIC5hcHBlbmQoIjxmcmFtZSBzcmM9XCJtYWluLmh0bWxcIiBuYW1lPVwibWFpbkZyYW1lXCI+XG4iKQorICAgIC5hcHBlbmQoIjwvZnJhbWVzZXQ+XG4iKQorICAgIC5hcHBlbmQoIjwvaHRtbD5cbiIpCisgICAgOworCisgICAgVXRpbHMud3JpdGVGaWxlKGdldE91dHB1dERpcmVjdG9yeSh4bWxTdWl0ZSksICJpbmRleC5odG1sIiwgaW5kZXgudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBtYWtlVGl0bGUoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuICJSZXN1bHRzIGZvcjxici8+PGVtPiIgKyBzdWl0ZS5nZXROYW1lKCkgKyAiPC9lbT4iOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWFpbihYbWxTdWl0ZSB4bWxTdWl0ZSwgSVN1aXRlIHNyKSB7CisgICAgU3RyaW5nQnVmZmVyIGluZGV4ID0gbmV3IFN0cmluZ0J1ZmZlcigpCisgICAgLmFwcGVuZCgiPGh0bWw+PGhlYWQ+PHRpdGxlPlJlc3VsdHMgZm9yICIgKyBzci5nZXROYW1lKCkgKyAiPC90aXRsZT48L2hlYWQ+XG4iKQorICAgIC5hcHBlbmQoIjxib2R5PlNlbGVjdCBhIHJlc3VsdCBvbiB0aGUgbGVmdC1oYW5kIHBhbmUuPC9ib2R5PiIpCisgICAgLmFwcGVuZCgiPC9odG1sPlxuIikKKyAgICA7CisKKyAgICBVdGlscy53cml0ZUZpbGUoZ2V0T3V0cHV0RGlyZWN0b3J5KHhtbFN1aXRlKSwgIm1haW4uaHRtbCIsIGluZGV4LnRvU3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqCisgICAqLworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUYWJsZU9mQ29udGVudHMoWG1sU3VpdGUgeG1sU3VpdGUsIElTdWl0ZSBzdWl0ZSkgeworICAgIFN0cmluZ0J1ZmZlciB0YWJsZU9mQ29udGVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAvLworICAgIC8vIEdlbmVyYXRlIG1ldGhvZHMgYW5kIGdyb3VwcyBoeXBlcmxpbmtzCisgICAgLy8KKyAgICBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IHN1aXRlUmVzdWx0cyA9IHN1aXRlLmdldFJlc3VsdHMoKTsKKyAgICBpbnQgZ3JvdXBDb3VudCA9IHN1aXRlLmdldE1ldGhvZHNCeUdyb3VwcygpLnNpemUoKTsKKyAgICBpbnQgbWV0aG9kQ291bnQgPSAwOworICAgIGZvciAoSVN1aXRlUmVzdWx0IHNyIDogc3VpdGVSZXN1bHRzLnZhbHVlcygpKSB7CisgICAgICBJVGVzdE5HTWV0aG9kW10gbWV0aG9kcyA9IHNyLmdldFRlc3RDb250ZXh0KCkuZ2V0QWxsVGVzdE1ldGhvZHMoKTsKKyAgICAgIG1ldGhvZENvdW50ICs9IFV0aWxzLmNhbGN1bGF0ZUludm9rZWRNZXRob2RDb3VudChtZXRob2RzKTsKKworICAgICAgLy8gQ29sbGVjdCB0ZXN0Q2xhc3NlcworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIHRtIDogbWV0aG9kcykgeworICAgICAgICBJVGVzdENsYXNzIHRjID0gdG0uZ2V0VGVzdENsYXNzKCk7CisgICAgICAgIG1fY2xhc3Nlcy5wdXQodGMuZ2V0UmVhbENsYXNzKCkuZ2V0TmFtZSgpLCB0Yyk7CisgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG5hbWUgPSAiUmVzdWx0cyBmb3IgIiArIHN1aXRlLmdldE5hbWUoKTsKKyAgICB0YWJsZU9mQ29udGVudHMKKyAgICAgICAgLmFwcGVuZCgiPGh0bWw+XG4iKQorICAgICAgICAuYXBwZW5kKCI8aGVhZD5cbiIpCisgICAgICAgIC5hcHBlbmQoIjx0aXRsZT4iICsgbmFtZSArICI8L3RpdGxlPlxuIikKKyAgICAgICAgLmFwcGVuZChIdG1sSGVscGVyLmdldENzc1N0cmluZygpKQorICAgICAgICAuYXBwZW5kKCI8L2hlYWQ+XG4iKQorICAgICAgICA7CisgICAgdGFibGVPZkNvbnRlbnRzCisgICAgICAgIC5hcHBlbmQoIjxib2R5PlxuIikKKyAgICAgICAgLmFwcGVuZCgiPGgzPjxwIGFsaWduPVwiY2VudGVyXCI+IiArIG1ha2VUaXRsZShzdWl0ZSkgKyAiPC9wPjwvaDM+XG4iKQorICAgICAgICAuYXBwZW5kKCI8dGFibGUgYm9yZGVyPScxJyB3aWR0aD0nMTAwJSc+XG4iKQorICAgICAgICAuYXBwZW5kKCI8dHIgdmFsaWduPSd0b3AnPlxuIikKKyAgICAgICAgICAuYXBwZW5kKCI8dGQ+IikKKyAgICAgICAgICAgIC5hcHBlbmQoc3VpdGVSZXN1bHRzLnNpemUoKSkuYXBwZW5kKCIgIikuYXBwZW5kKHBsdXJhbGl6ZShzdWl0ZVJlc3VsdHMuc2l6ZSgpLCAidGVzdCIpKQorICAgICAgICAgIC5hcHBlbmQoIjwvdGQ+XG4iKQorICAgICAgICAgIC5hcHBlbmQoIjx0ZD4iKQorICAgICAgICAgICAgICAuYXBwZW5kKCI8YSB0YXJnZXQ9J21haW5GcmFtZScgaHJlZj0nIikuYXBwZW5kKENMQVNTRVMpLmFwcGVuZCgiJz4iKQorICAgICAgICAgICAgICAuYXBwZW5kKG1fY2xhc3Nlcy5zaXplKCkgKyAiICIgKyBwbHVyYWxpemUobV9jbGFzc2VzLnNpemUoKSwgImNsYXNzIikpCisgICAgICAgICAgICAgIC5hcHBlbmQoIjwvYT4iKQorICAgICAgICAgIC5hcHBlbmQoIjwvdGQ+XG4iKQorICAgICAgICAgIC5hcHBlbmQoIjx0ZD4iICsgbWV0aG9kQ291bnQgKyAiICIgKyBwbHVyYWxpemUobWV0aG9kQ291bnQsICJtZXRob2QiKSArICI6PGJyLz5cbiIpCisgICAgICAgICAgICAuYXBwZW5kKCImbmJzcDsmbmJzcDs8YSB0YXJnZXQ9J21haW5GcmFtZScgaHJlZj0nIikuYXBwZW5kKE1FVEhPRFNfQ0hST05PTE9HSUNBTCkuYXBwZW5kKCInPiIpLmFwcGVuZCgiY2hyb25vbG9naWNhbDwvYT48YnIvPlxuIikKKyAgICAgICAgICAgIC5hcHBlbmQoIiZuYnNwOyZuYnNwOzxhIHRhcmdldD0nbWFpbkZyYW1lJyBocmVmPSciKS5hcHBlbmQoTUVUSE9EU19BTFBIQUJFVElDQUwpLmFwcGVuZCgiXCc+IikuYXBwZW5kKCJhbHBoYWJldGljYWw8L2E+PGJyLz5cbiIpCisgICAgICAgICAgICAuYXBwZW5kKCImbmJzcDsmbmJzcDs8YSB0YXJnZXQ9J21haW5GcmFtZScgaHJlZj0nIikuYXBwZW5kKE1FVEhPRFNfTk9UX1JVTikuYXBwZW5kKCInPm5vdCBydW4gKCIgKyBzdWl0ZS5nZXRFeGNsdWRlZE1ldGhvZHMoKS5zaXplKCkgKyAiKTwvYT4iKQorICAgICAgICAgIC5hcHBlbmQoIjwvdGQ+XG4iKQorICAgICAgICAuYXBwZW5kKCI8L3RyPlxuIikKKworICAgICAgICAuYXBwZW5kKCI8dHI+XG4iKQorICAgICAgICAuYXBwZW5kKCI8dGQ+PGEgdGFyZ2V0PSdtYWluRnJhbWUnIGhyZWY9JyIpLmFwcGVuZChHUk9VUFMpLmFwcGVuZCgiJz4iKS5hcHBlbmQoZ3JvdXBDb3VudCArIHBsdXJhbGl6ZShncm91cENvdW50LCAiIGdyb3VwIikgKyAiPC9hPjwvdGQ+XG4iKQorICAgICAgICAuYXBwZW5kKCI8dGQ+PGEgdGFyZ2V0PSdtYWluRnJhbWUnIGhyZWY9JyIpLmFwcGVuZChSRVBPUlRFUl9PVVRQVVQpLmFwcGVuZCgiJz5yZXBvcnRlciBvdXRwdXQ8L2E+PC90ZD5cbiIpCisgICAgICAgIC5hcHBlbmQoIjx0ZD48YSB0YXJnZXQ9J21haW5GcmFtZScgaHJlZj0nIikuYXBwZW5kKFRFU1ROR19YTUwpLmFwcGVuZCgiJz50ZXN0bmcueG1sPC9hPjwvdGQ+XG4iKQorICAgICAgICAuYXBwZW5kKCI8L3RyPiIpCisgICAgICAgIC5hcHBlbmQoIjwvdGFibGU+Iik7CisKKyAgICAgIC8vCisgICAgICAvLyBHZW5lcmF0ZSByZXN1bHRzIGZvciBpbmRpdmlkdWFsIHRlc3RzCisgICAgICAvLworCisgICAgICAvLyBPcmRlciB0aGUgcmVzdWx0cyBzbyB3ZSBjYW4gc2hvdyB0aGUgZmFpbHVyZXMgZmlyc3QsIHRoZW4gdGhlIHNraXAgYW5kCisgICAgICAvLyBmaW5hbGx5IHRoZSBzdWNjZXNzZXMKKyAgICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gcmVkUmVzdWx0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiB5ZWxsb3dSZXN1bHRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IGdyZWVuUmVzdWx0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gZW50cnkgOiBzdWl0ZVJlc3VsdHMuZW50cnlTZXQoKSkgeworICAgICAgICBTdHJpbmcgc3VpdGVOYW1lID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIElTdWl0ZVJlc3VsdCBzciA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgIElUZXN0Q29udGV4dCB0YyA9IHNyLmdldFRlc3RDb250ZXh0KCk7CisgICAgICAgIGludCBmYWlsZWQgPSB0Yy5nZXRGYWlsZWRUZXN0cygpLnNpemUoKTsKKyAgICAgICAgaW50IHNraXBwZWQgPSB0Yy5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIGludCBwYXNzZWQgPSB0Yy5nZXRQYXNzZWRUZXN0cygpLnNpemUoKTsKKworICAgICAgICBpZiAoZmFpbGVkID4gMCkgeworICAgICAgICAgIHJlZFJlc3VsdHMucHV0KHN1aXRlTmFtZSwgc3IpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNraXBwZWQgPiAwKSB7CisgICAgICAgICAgeWVsbG93UmVzdWx0cy5wdXQoc3VpdGVOYW1lLCBzcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFzc2VkID4gMCkgeworICAgICAgICAgIGdyZWVuUmVzdWx0cy5wdXQoc3VpdGVOYW1lLCBzcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcmVkUmVzdWx0cy5wdXQoc3VpdGVOYW1lLCBzcik7CisgICAgICAgIH0KKyAgICAgIH0KKworCisgICAgICBJU3VpdGVSZXN1bHRbXVtdIHJlc3VsdHMgPSBuZXcgSVN1aXRlUmVzdWx0W11bXSB7CisgICAgICAgIHNvcnRSZXN1bHRzKHJlZFJlc3VsdHMudmFsdWVzKCkpLCBzb3J0UmVzdWx0cyh5ZWxsb3dSZXN1bHRzLnZhbHVlcygpKSwgc29ydFJlc3VsdHMoZ3JlZW5SZXN1bHRzLnZhbHVlcygpKQorICAgICAgfTsKKworICAgICAgU3RyaW5nW10gY29sb3JzID0geyJmYWlsZWQiLCAic2tpcHBlZCIsICJwYXNzZWQifTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIElTdWl0ZVJlc3VsdFtdIHIgPSByZXN1bHRzW2ldOworICAgICAgICBmb3IgKElTdWl0ZVJlc3VsdCBzcjogcikgeworICAgICAgICAgIFN0cmluZyBzdWl0ZU5hbWUgPSBzci5nZXRUZXN0Q29udGV4dCgpLmdldE5hbWUoKTsKKyAgICAgICAgICBnZW5lcmF0ZVN1aXRlUmVzdWx0KHN1aXRlTmFtZSwgc3IsIGNvbG9yc1tpXSwgdGFibGVPZkNvbnRlbnRzLCBtX291dHB1dERpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIHRhYmxlT2ZDb250ZW50cy5hcHBlbmQoIjwvYm9keT48L2h0bWw+Iik7CisgICAgVXRpbHMud3JpdGVGaWxlKGdldE91dHB1dERpcmVjdG9yeSh4bWxTdWl0ZSksICJ0b2MuaHRtbCIsIHRhYmxlT2ZDb250ZW50cy50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIHBsdXJhbGl6ZShpbnQgY291bnQsIFN0cmluZyBzaW5ndWxhcikgeworICAgIHJldHVybiBjb3VudCA+IDEgPyAoc2luZ3VsYXIuZW5kc1dpdGgoInMiKSA/IHNpbmd1bGFyICsgImVzIiA6IHNpbmd1bGFyICsgInMiKSA6IHNpbmd1bGFyOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KFhtbFN1aXRlIHhtbFN1aXRlKSB7CisgICAgcmV0dXJuIG1fb3V0cHV0RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgeG1sU3VpdGUuZ2V0TmFtZSgpOworICB9CisKKyAgcHJpdmF0ZSBJU3VpdGVSZXN1bHRbXSBzb3J0UmVzdWx0cyhDb2xsZWN0aW9uPElTdWl0ZVJlc3VsdD4gcikgeworICAgIElTdWl0ZVJlc3VsdFtdIHJlc3VsdCA9IHIudG9BcnJheShuZXcgSVN1aXRlUmVzdWx0W3Iuc2l6ZSgpXSk7CisgICAgQXJyYXlzLnNvcnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU3VpdGVSZXN1bHQoU3RyaW5nIHN1aXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN1aXRlUmVzdWx0IHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3NzQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0YWJsZU9mQ29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXREaXJlY3RvcnkpCisgIHsKKyAgICBJVGVzdENvbnRleHQgdGMgPSBzci5nZXRUZXN0Q29udGV4dCgpOworICAgIGludCBwYXNzZWQgPSB0Yy5nZXRQYXNzZWRUZXN0cygpLnNpemUoKTsKKyAgICBpbnQgZmFpbGVkID0gdGMuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCk7CisgICAgaW50IHNraXBwZWQgPSB0Yy5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCk7CisgICAgU3RyaW5nIGJhc2VGaWxlID0gdGMuZ2V0TmFtZSgpOworICAgIHRhYmxlT2ZDb250ZW50cworICAgICAgLmFwcGVuZCgiXG48dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSd0ZXN0LSIpLmFwcGVuZChjc3NDbGFzcykuYXBwZW5kKCInPlxuIikKKyAgICAgIC5hcHBlbmQoIjx0cj48dGQ+XG4iKQorICAgICAgLmFwcGVuZCgiPHRhYmxlIHN0eWxlPSd3aWR0aDogMTAwJSc+PHRyPiIpCisgICAgICAuYXBwZW5kKCI8dGQgdmFsaWduPSd0b3AnPiIpCisgICAgICAuYXBwZW5kKHN1aXRlTmFtZSkuYXBwZW5kKCIgKCIpLmFwcGVuZChwYXNzZWQpLmFwcGVuZCgiLyIpLmFwcGVuZChmYWlsZWQpLmFwcGVuZCgiLyIpLmFwcGVuZChza2lwcGVkKS5hcHBlbmQoIikiKQorICAgICAgLmFwcGVuZCgiPC90ZD4iKQorICAgICAgLmFwcGVuZCgiPHRkIHZhbGlnbj0ndG9wJyBhbGlnbj0ncmlnaHQnPlxuIikKKyAgICAgIC5hcHBlbmQoIiAgPGEgaHJlZj0nIiArIGJhc2VGaWxlICsgIi5odG1sJyB0YXJnZXQ9J21haW5GcmFtZSc+UmVzdWx0czwvYT5cbiIpCisvLyAgICAgIC5hcHBlbmQoIiAgPGEgaHJlZj1cIiIgKyBiYXNlRmlsZSArICIub3V0XCIgdGFyZ2V0PVwibWFpbkZyYW1lXCJcIj5PdXRwdXQ8L2E+XG4iKQorLy8gICAgICAuYXBwZW5kKCImbmJzcDsmbmJzcDs8YSBocmVmPVwiZmlsZTovLyIgKyBiYXNlRmlsZSArICIucHJvcGVydGllc1wiIHRhcmdldD1cIm1haW5GcmFtZVwiXCI+UHJvcGVydHkgZmlsZTwvYT48YnI+XG4iKQorICAgICAgLmFwcGVuZCgiPC90ZD4iKQorICAgICAgLmFwcGVuZCgiPC90cj48L3RhYmxlPlxuIikKKyAgICAgIC5hcHBlbmQoIjwvdGQ+PC90cj48cC8+XG4iKQorICAgICAgOworCisgICAgdGFibGVPZkNvbnRlbnRzLmFwcGVuZCgiPC90YWJsZT5cbiIpOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyBhIHByb3BlcnR5IGZpbGUgZm9yIGVhY2ggc3VpdGUgcmVzdWx0LgorICAgKgorICAgKiBAcGFyYW0geG1sU3VpdGUKKyAgICogQHBhcmFtIHN1aXRlCisgICAqLworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTdWl0ZXMoWG1sU3VpdGUgeG1sU3VpdGUsIElTdWl0ZSBzdWl0ZSkgeworICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gc3VpdGVSZXN1bHRzID0gc3VpdGUuZ2V0UmVzdWx0cygpOworCisgICAgZm9yIChJU3VpdGVSZXN1bHQgc3IgOiBzdWl0ZVJlc3VsdHMudmFsdWVzKCkpIHsKKyAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCA9IHNyLmdldFRlc3RDb250ZXh0KCk7CisgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHN1aXRlUmVzdWx0IDogc3VpdGVSZXN1bHRzLnZhbHVlcygpKSB7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZVJlc3VsdC50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIFV0aWxzLndyaXRlRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoeG1sU3VpdGUpLCB0ZXN0Q29udGV4dC5nZXROYW1lKCkgKyAiLnByb3BlcnRpZXMiLCBzYi50b1N0cmluZygpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvVGVzdEhUTUxSZXBvcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9UZXN0SFRNTFJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNjMjUyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvVGVzdEhUTUxSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBIVE1MIHJlcG9ydGVyIGZvciBpbmRpdmlkdWFsIHRlc3RzLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgMiwgMjAwNAorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgVGVzdEhUTUxSZXBvcnRlciBleHRlbmRzIFRlc3RMaXN0ZW5lckFkYXB0ZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElUZXN0UmVzdWx0PiBOQU1FX0NPTVBBUkFUT1I9IG5ldyBOYW1lQ29tcGFyYXRvcigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElUZXN0UmVzdWx0PiBDT05GSUdVUkFUSU9OX0NPTVBBUkFUT1I9IG5ldyBDb25maWd1cmF0aW9uQ29tcGFyYXRvcigpOworCisgIHByaXZhdGUgSVRlc3RDb250ZXh0IG1fdGVzdENvbnRleHQgPSBudWxsOworCisgIC8vLy8vCisgIC8vIGltcGxlbWVudHMgSVRlc3RMaXN0ZW5lcgorICAvLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TdGFydChJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIG1fdGVzdENvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgZ2VuZXJhdGVMb2cobV90ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICBudWxsIC8qIGhvc3QgKi8sCisgICAgICAgICAgICAgICAgbV90ZXN0Q29udGV4dC5nZXRPdXRwdXREaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uRmFpbHVyZXMoKSwKKyAgICAgICAgICAgICAgICBnZXRDb25maWd1cmF0aW9uU2tpcHMoKSwKKyAgICAgICAgICAgICAgICBnZXRQYXNzZWRUZXN0cygpLAorICAgICAgICAgICAgICAgIGdldEZhaWxlZFRlc3RzKCksCisgICAgICAgICAgICAgICAgZ2V0U2tpcHBlZFRlc3RzKCksCisgICAgICAgICAgICAgICAgZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpKTsKKyAgfQorICAvLworICAvLyBpbXBsZW1lbnRzIElUZXN0TGlzdGVuZXIKKyAgLy8vLy8KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0RmlsZShJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBjb250ZXh0LmdldE5hbWUoKSArICIuaHRtbCI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVUYWJsZShTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyB0aXRsZSwKKyAgICAgIENvbGxlY3Rpb248SVRlc3RSZXN1bHQ+IHRlc3RzLCBTdHJpbmcgY3NzQ2xhc3MsIENvbXBhcmF0b3I8SVRlc3RSZXN1bHQ+IGNvbXBhcmF0b3IpCisgIHsKKyAgICBzYi5hcHBlbmQoIjx0YWJsZSB3aWR0aD0nMTAwJScgYm9yZGVyPScxJyBjbGFzcz0naW52b2NhdGlvbi0iKS5hcHBlbmQoY3NzQ2xhc3MpLmFwcGVuZCgiJz5cbiIpCisgICAgICAuYXBwZW5kKCI8dHI+PHRkIGNvbHNwYW49JzQnIGFsaWduPSdjZW50ZXInPjxiPiIpLmFwcGVuZCh0aXRsZSkuYXBwZW5kKCI8L2I+PC90ZD48L3RyPlxuIikKKyAgICAgIC5hcHBlbmQoIjx0cj4iKQorICAgICAgLmFwcGVuZCgiPHRkPjxiPlRlc3QgbWV0aG9kPC9iPjwvdGQ+XG4iKQorICAgICAgLmFwcGVuZCgiPHRkIHdpZHRoPVwiMzAlXCI+PGI+RXhjZXB0aW9uPC9iPjwvdGQ+XG4iKQorICAgICAgLmFwcGVuZCgiPHRkIHdpZHRoPVwiMTAlXCI+PGI+VGltZSAoc2Vjb25kcyk8L2I+PC90ZD5cbiIpCisgICAgICAuYXBwZW5kKCI8dGQ+PGI+SW5zdGFuY2U8L2I+PC90ZD5cbiIpCisgICAgICAuYXBwZW5kKCI8L3RyPlxuIik7CisKKyAgICBpZiAodGVzdHMgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KChMaXN0PElUZXN0UmVzdWx0PikgdGVzdHMsIGNvbXBhcmF0b3IpOworICAgIH0KKworICAgIC8vIFVzZXIgb3V0cHV0PworICAgIFN0cmluZyBpZCA9ICIiOworICAgIFRocm93YWJsZSB0dyA9IG51bGw7CisKKyAgICBmb3IgKElUZXN0UmVzdWx0IHRyIDogdGVzdHMpIHsKKyAgICAgIHNiLmFwcGVuZCgiPHRyPlxuIik7CisKKyAgICAgIC8vIFRlc3QgbWV0aG9kCisgICAgICBJVGVzdE5HTWV0aG9kIG1ldGhvZCA9IHRyLmdldE1ldGhvZCgpOworCisgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXRNZXRob2ROYW1lKCk7CisgICAgICBzYi5hcHBlbmQoIjx0ZCB0aXRsZT0nIikuYXBwZW5kKHRyLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKSkuYXBwZW5kKCIuIikKKyAgICAgICAgLmFwcGVuZChuYW1lKQorICAgICAgICAuYXBwZW5kKCIoKSc+IikKKyAgICAgICAgLmFwcGVuZCgiPGI+IikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPC9iPiIpOworCisgICAgICAvLyBUZXN0IGNsYXNzCisgICAgICBTdHJpbmcgdGVzdENsYXNzID0gdHIuZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgaWYgKHRlc3RDbGFzcyAhPSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPGJyPiIpLmFwcGVuZCgiVGVzdCBjbGFzczogIiArIHRlc3RDbGFzcyk7CisKKyAgICAgICAgLy8gVGVzdCBuYW1lCisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IHRyLmdldFRlc3ROYW1lKCk7CisgICAgICAgIGlmICh0ZXN0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCIgKCIpLmFwcGVuZCh0ZXN0TmFtZSkuYXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gTWV0aG9kIGRlc2NyaXB0aW9uCisgICAgICBpZiAoISBVdGlscy5pc1N0cmluZ0VtcHR5KG1ldGhvZC5nZXREZXNjcmlwdGlvbigpKSkgeworICAgICAgICBzYi5hcHBlbmQoIjxicj4iKS5hcHBlbmQoIlRlc3QgbWV0aG9kOiAiKS5hcHBlbmQobWV0aG9kLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgfQorCisgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gdHIuZ2V0UGFyYW1ldGVycygpOworICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI8YnI+UGFyYW1ldGVyczogIik7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1ldGVycy5sZW5ndGg7IGorKykgeworICAgICAgICAgIGlmIChqID4gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBzYi5hcHBlbmQocGFyYW1ldGVyc1tqXSA9PSBudWxsID8gIm51bGwiIDogcGFyYW1ldGVyc1tqXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLworICAgICAgLy8gT3V0cHV0IGZyb20gdGhlIG1ldGhvZCwgY3JlYXRlZCBieSB0aGUgdXNlciBjYWxsaW5nIFJlcG9ydGVyLmxvZygpCisgICAgICAvLworICAgICAgeworICAgICAgICBMaXN0PFN0cmluZz4gb3V0cHV0ID0gUmVwb3J0ZXIuZ2V0T3V0cHV0KHRyKTsKKyAgICAgICAgaWYgKG51bGwgIT0gb3V0cHV0ICYmIG91dHB1dC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCI8YnIvPiIpOworICAgICAgICAgIC8vIE1ldGhvZCBuYW1lCisgICAgICAgICAgU3RyaW5nIGRpdklkID0gIk91dHB1dC0iICsgdHIuaGFzaENvZGUoKTsKKyAgICAgICAgICBzYi5hcHBlbmQoIlxuPGEgaHJlZj1cIiMiKS5hcHBlbmQoZGl2SWQpLmFwcGVuZCgiXCIiKQorICAgICAgICAgICAgLmFwcGVuZCgiIG9uQ2xpY2s9J3RvZ2dsZUJveChcIiIpLmFwcGVuZChkaXZJZCkuYXBwZW5kKCJcIiwgdGhpcywgXCJTaG93IG91dHB1dFwiLCBcIkhpZGUgb3V0cHV0XCIpOyc+IikKKyAgICAgICAgICAgIC5hcHBlbmQoIlNob3cgb3V0cHV0PC9hPlxuIikKKyAgICAgICAgICAgIC5hcHBlbmQoIlxuPGEgaHJlZj1cIiMiKS5hcHBlbmQoZGl2SWQpLmFwcGVuZCgiXCIiKQorICAgICAgICAgICAgLmFwcGVuZCgiIG9uQ2xpY2s9XCJ0b2dnbGVBbGxCb3hlcygpO1wiPlNob3cgYWxsIG91dHB1dHM8L2E+XG4iKQorICAgICAgICAgICAgOworCisgICAgICAgICAgLy8gTWV0aG9kIG91dHB1dAorICAgICAgICAgIHNiLmFwcGVuZCgiPGRpdiBjbGFzcz0nbG9nJyBpZD1cIiIpLmFwcGVuZChkaXZJZCkuYXBwZW5kKCJcIj5cbiIpOworICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBvdXRwdXQpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzKS5hcHBlbmQoIjxici8+XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc2IuYXBwZW5kKCI8L2Rpdj5cbiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNiLmFwcGVuZCgiPC90ZD5cbiIpOworCisKKyAgICAgIC8vIEV4Y2VwdGlvbgorICAgICAgdHcgPSB0ci5nZXRUaHJvd2FibGUoKTsKKyAgICAgIFN0cmluZyBzdGFja1RyYWNlID0gIiI7CisgICAgICBTdHJpbmcgZnVsbFN0YWNrVHJhY2UgPSAiIjsKKworICAgICAgaWQgPSAic3RhY2stdHJhY2UiICsgdHIuaGFzaENvZGUoKTsKKyAgICAgIHNiLmFwcGVuZCgiPHRkPiIpOworCisgICAgICBpZiAobnVsbCAhPSB0dykgeworICAgICAgICBTdHJpbmdbXSBzdGFja1RyYWNlcyA9IFV0aWxzLnN0YWNrVHJhY2UodHcsIHRydWUpOworICAgICAgICBmdWxsU3RhY2tUcmFjZSA9IHN0YWNrVHJhY2VzWzFdOworICAgICAgICBzdGFja1RyYWNlID0gIjxkaXY+PHByZT4iICsgc3RhY2tUcmFjZXNbMF0gICsgIjwvcHJlPjwvZGl2PiI7CisKKyAgICAgICAgc2IuYXBwZW5kKHN0YWNrVHJhY2UpOworICAgICAgICAvLyBKYXZhU2NyaXB0IGxpbmsKKyAgICAgICAgc2IuYXBwZW5kKCI8YSBocmVmPScjJyBvbkNsaWNrPSd0b2dnbGVCb3goXCIiKQorICAgICAgICAuYXBwZW5kKGlkKS5hcHBlbmQoIlwiLCB0aGlzLCBcIkNsaWNrIHRvIHNob3cgYWxsIHN0YWNrIGZyYW1lc1wiLCBcIkNsaWNrIHRvIGhpZGUgc3RhY2sgZnJhbWVzXCIpJz4iKQorICAgICAgICAuYXBwZW5kKCJDbGljayB0byBzaG93IGFsbCBzdGFjayBmcmFtZXMiKS5hcHBlbmQoIjwvYT5cbiIpCisgICAgICAgIC5hcHBlbmQoIjxkaXYgY2xhc3M9J3N0YWNrLXRyYWNlJyBpZD0nIiArIGlkICsgIic+IikKKyAgICAgICAgLmFwcGVuZCgiPHByZT4iICsgZnVsbFN0YWNrVHJhY2UgKyAiPC9wcmU+IikKKyAgICAgICAgLmFwcGVuZCgiPC9kaXY+IikKKyAgICAgICAgOworICAgICAgfQorCisgICAgICBzYi5hcHBlbmQoIjwvdGQ+XG4iKTsKKworICAgICAgLy8gVGltZQorICAgICAgbG9uZyB0aW1lID0gKHRyLmdldEVuZE1pbGxpcygpIC0gdHIuZ2V0U3RhcnRNaWxsaXMoKSkgLyAxMDAwOworICAgICAgU3RyaW5nIHN0clRpbWUgPSBMb25nLnRvU3RyaW5nKHRpbWUpOworICAgICAgc2IuYXBwZW5kKCI8dGQ+IikuYXBwZW5kKHN0clRpbWUpLmFwcGVuZCgiPC90ZD5cbiIpOworCisgICAgICAvLyBJbnN0YW5jZQorICAgICAgT2JqZWN0IGluc3RhbmNlID0gdHIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgIHNiLmFwcGVuZCgiPHRkPiIpLmFwcGVuZChpbnN0YW5jZSkuYXBwZW5kKCI8L3RkPiIpOworCisgICAgICBzYi5hcHBlbmQoIjwvdHI+XG4iKTsKKyAgICB9CisKKyAgICBzYi5hcHBlbmQoIjwvdGFibGU+PHA+XG4iKTsKKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFycmF5VG9TdHJpbmcoU3RyaW5nW10gYXJyYXkpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IGFycmF5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnQpLmFwcGVuZCgiICIpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBIRUFEID0KKyAgICAiXG48c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+XG4iICsKKyAgICAiLmxvZyB7IGRpc3BsYXk6IG5vbmU7fSBcbiIgKworICAgICIuc3RhY2stdHJhY2UgeyBkaXNwbGF5OiBub25lO30gXG4iICsKKyAgICAiPC9zdHlsZT5cbiIgKworICAgICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj5cbiIgKworICAgICAgIjwhLS1cbiIgKworICAgICAgImZ1bmN0aW9uIGZsaXAoZSkge1xuIiArCisgICAgICAiICBjdXJyZW50ID0gZS5zdHlsZS5kaXNwbGF5O1xuIiArCisgICAgICAiICBpZiAoY3VycmVudCA9PSAnYmxvY2snKSB7XG4iICsKKyAgICAgICIgICAgZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuIiArCisgICAgICAiICAgIHJldHVybiAwO1xuIiArCisgICAgICAiICB9XG4iICsKKyAgICAgICIgIGVsc2Uge1xuIiArCisgICAgICAiICAgIGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4iICsKKyAgICAgICIgICAgcmV0dXJuIDE7XG4iICsKKyAgICAgICIgIH1cbiIgKworICAgICAgIn1cbiIgKworICAgICAgIlxuIiArCisgICAgICAiZnVuY3Rpb24gdG9nZ2xlQm94KHN6RGl2SWQsIGVsZW0sIG1zZzEsIG1zZzIpXG4iICsKKyAgICAgICJ7XG4iICsKKyAgICAgICIgIHZhciByZXMgPSAtMTsiICsKKyAgICAgICIgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkge1xuIiArCisgICAgICAiICAgIHJlcyA9IGZsaXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3pEaXZJZCkpO1xuIiArCisgICAgICAiICB9XG4iICsKKyAgICAgICIgIGVsc2UgaWYgKGRvY3VtZW50LmFsbCkge1xuIiArCisgICAgICAiICAgIC8vIHRoaXMgaXMgdGhlIHdheSBvbGQgbXNpZSB2ZXJzaW9ucyB3b3JrXG4iICsKKyAgICAgICIgICAgcmVzID0gZmxpcChkb2N1bWVudC5hbGxbc3pEaXZJZF0pO1xuIiArCisgICAgICAiICB9XG4iICsKKyAgICAgICIgIGlmKGVsZW0pIHtcbiIgKworICAgICAgIiAgICBpZihyZXMgPT0gMCkgZWxlbS5pbm5lckhUTUwgPSBtc2cxOyBlbHNlIGVsZW0uaW5uZXJIVE1MID0gbXNnMjtcbiIgKworICAgICAgIiAgfVxuIiArCisgICAgICAiXG4iICsKKyAgICAgICJ9XG4iICsKKyAgICAgICJcbiIgKworICAgICAgImZ1bmN0aW9uIHRvZ2dsZUFsbEJveGVzKCkge1xuIiArCisgICAgICAiICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHtcbiIgKworICAgICAgIiAgICBkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpO1xuIiArCisgICAgICAiICAgIGZvciAoaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSsrKSB7XG4iICsKKyAgICAgICIgICAgICBpZiAoZFtpXS5jbGFzc05hbWUgPT0gJ2xvZycpIHtcbiIgKworICAgICAgIiAgICAgICAgZmxpcChkW2ldKTtcbiIgKworICAgICAgIiAgICAgIH1cbiIgKworICAgICAgIiAgICB9XG4iICsKKyAgICAgICIgIH1cbiIgKworICAgICAgIn1cbiIgKworICAgICAgIlxuIiArCisgICAgICAiLy8gLS0+XG4iICsKKyAgICAgICI8L3NjcmlwdD5cbiIgKworICAgICAgIlxuIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVMb2coSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0LAorICAgICAgU3RyaW5nIGhvc3QsCisgICAgICBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LAorICAgICAgQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gZmFpbGVkQ29uZnMsCisgICAgICBDb2xsZWN0aW9uPElUZXN0UmVzdWx0PiBza2lwcGVkQ29uZnMsCisgICAgICBDb2xsZWN0aW9uPElUZXN0UmVzdWx0PiBwYXNzZWRUZXN0cywKKyAgICAgIENvbGxlY3Rpb248SVRlc3RSZXN1bHQ+IGZhaWxlZFRlc3RzLAorICAgICAgQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gc2tpcHBlZFRlc3RzLAorICAgICAgQ29sbGVjdGlvbjxJVGVzdFJlc3VsdD4gcGVyY2VudGFnZVRlc3RzKQorICB7CisgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHNiLmFwcGVuZCgiPGh0bWw+XG48aGVhZD5cbiIpCisgICAgICAuYXBwZW5kKCI8dGl0bGU+VGVzdE5HOiAgIikuYXBwZW5kKHRlc3RDb250ZXh0LmdldE5hbWUoKSkuYXBwZW5kKCI8L3RpdGxlPlxuIikKKyAgICAgIC5hcHBlbmQoSHRtbEhlbHBlci5nZXRDc3NTdHJpbmcoKSkKKyAgICAgIC5hcHBlbmQoSEVBRCkKKyAgICAgIC5hcHBlbmQoIjwvaGVhZD5cbiIpCisgICAgICAuYXBwZW5kKCI8Ym9keT5cbiIpOworCisgICAgRGF0ZSBzdGFydERhdGUgPSB0ZXN0Q29udGV4dC5nZXRTdGFydERhdGUoKTsKKyAgICBEYXRlIGVuZERhdGUgPSB0ZXN0Q29udGV4dC5nZXRFbmREYXRlKCk7CisgICAgbG9uZyBkdXJhdGlvbiA9IChlbmREYXRlLmdldFRpbWUoKSAtIHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gMTAwMDsKKyAgICBpbnQgcGFzc2VkID0KKyAgICAgIHRlc3RDb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpICsKKyAgICAgIHRlc3RDb250ZXh0LmdldEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMoKS5zaXplKCk7CisgICAgaW50IGZhaWxlZCA9IHRlc3RDb250ZXh0LmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpOworICAgIGludCBza2lwcGVkID0gdGVzdENvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpOworICAgIFN0cmluZyBob3N0TGluZSA9IFV0aWxzLmlzU3RyaW5nRW1wdHkoaG9zdCkgPyAiIiA6ICI8dHI+PHRkPlJlbW90ZSBob3N0OjwvdGQ+PHRkPiIgKyBob3N0CisgICAgICAgICsgIjwvdGQ+XG48L3RyPiI7CisKKyAgICBzYgorICAgIC5hcHBlbmQoIjxoMiBhbGlnbj0nY2VudGVyJz4iKS5hcHBlbmQodGVzdENvbnRleHQuZ2V0TmFtZSgpKS5hcHBlbmQoIjwvaDI+IikKKyAgICAuYXBwZW5kKCI8dGFibGUgYm9yZGVyPScxJyBhbGlnbj1cImNlbnRlclwiPlxuIikKKyAgICAuYXBwZW5kKCI8dHI+XG4iKQorLy8gICAgLmFwcGVuZCgiPHRkPlByb3BlcnR5IGZpbGU6PC90ZD48dGQ+IikuYXBwZW5kKG1fdGVzdFJ1bm5lci5nZXRQcm9wZXJ0eUZpbGVOYW1lKCkpLmFwcGVuZCgiPC90ZD5cbiIpCisvLyAgICAuYXBwZW5kKCI8L3RyPjx0cj5cbiIpCisgICAgLmFwcGVuZCgiPHRkPlRlc3RzIHBhc3NlZC9GYWlsZWQvU2tpcHBlZDo8L3RkPjx0ZD4iKS5hcHBlbmQocGFzc2VkKS5hcHBlbmQoIi8iKS5hcHBlbmQoZmFpbGVkKS5hcHBlbmQoIi8iKS5hcHBlbmQoc2tpcHBlZCkuYXBwZW5kKCI8L3RkPlxuIikKKyAgICAuYXBwZW5kKCI8L3RyPjx0cj5cbiIpCisgICAgLmFwcGVuZCgiPHRkPlN0YXJ0ZWQgb246PC90ZD48dGQ+IikuYXBwZW5kKHRlc3RDb250ZXh0LmdldFN0YXJ0RGF0ZSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgiPC90ZD5cbiIpCisgICAgLmFwcGVuZCgiPC90cj5cbiIpCisgICAgLmFwcGVuZChob3N0TGluZSkKKyAgICAuYXBwZW5kKCI8dHI+PHRkPlRvdGFsIHRpbWU6PC90ZD48dGQ+IikuYXBwZW5kKGR1cmF0aW9uKS5hcHBlbmQoIiBzZWNvbmRzICgiKS5hcHBlbmQoZW5kRGF0ZS5nZXRUaW1lKCkgLSBzdGFydERhdGUuZ2V0VGltZSgpKQorICAgICAgLmFwcGVuZCgiIG1zKTwvdGQ+XG4iKQorICAgIC5hcHBlbmQoIjwvdHI+PHRyPlxuIikKKyAgICAuYXBwZW5kKCI8dGQ+SW5jbHVkZWQgZ3JvdXBzOjwvdGQ+PHRkPiIpLmFwcGVuZChhcnJheVRvU3RyaW5nKHRlc3RDb250ZXh0LmdldEluY2x1ZGVkR3JvdXBzKCkpKS5hcHBlbmQoIjwvdGQ+XG4iKQorICAgIC5hcHBlbmQoIjwvdHI+PHRyPlxuIikKKyAgICAuYXBwZW5kKCI8dGQ+RXhjbHVkZWQgZ3JvdXBzOjwvdGQ+PHRkPiIpLmFwcGVuZChhcnJheVRvU3RyaW5nKHRlc3RDb250ZXh0LmdldEV4Y2x1ZGVkR3JvdXBzKCkpKS5hcHBlbmQoIjwvdGQ+XG4iKQorICAgIC5hcHBlbmQoIjwvdHI+XG4iKQorICAgIC5hcHBlbmQoIjwvdGFibGU+PHAvPlxuIikKKyAgICA7CisKKyAgICBzYi5hcHBlbmQoIjxzbWFsbD48aT4oSG92ZXIgdGhlIG1ldGhvZCBuYW1lIHRvIHNlZSB0aGUgdGVzdCBjbGFzcyBuYW1lKTwvaT48L3NtYWxsPjxwLz5cbiIpOworICAgIGlmIChmYWlsZWRDb25mcy5zaXplKCkgPiAwKSB7CisgICAgICBnZW5lcmF0ZVRhYmxlKHNiLCAiRkFJTEVEIENPTkZJR1VSQVRJT05TIiwgZmFpbGVkQ29uZnMsICJmYWlsZWQiLCBDT05GSUdVUkFUSU9OX0NPTVBBUkFUT1IpOworICAgIH0KKyAgICBpZiAoc2tpcHBlZENvbmZzLnNpemUoKSA+IDApIHsKKyAgICAgIGdlbmVyYXRlVGFibGUoc2IsICJTS0lQUEVEIENPTkZJR1VSQVRJT05TIiwgc2tpcHBlZENvbmZzLCAic2tpcHBlZCIsIENPTkZJR1VSQVRJT05fQ09NUEFSQVRPUik7CisgICAgfQorICAgIGlmIChmYWlsZWRUZXN0cy5zaXplKCkgPiAwKSB7CisgICAgICBnZW5lcmF0ZVRhYmxlKHNiLCAiRkFJTEVEIFRFU1RTIiwgZmFpbGVkVGVzdHMsICJmYWlsZWQiLCBOQU1FX0NPTVBBUkFUT1IpOworICAgIH0KKyAgICBpZiAocGVyY2VudGFnZVRlc3RzLnNpemUoKSA+IDApIHsKKyAgICAgIGdlbmVyYXRlVGFibGUoc2IsICJGQUlMRUQgVEVTVFMgQlVUIFdJVEhJTiBTVUNDRVNTIFBFUkNFTlRBR0UiLAorICAgICAgICAgIHBlcmNlbnRhZ2VUZXN0cywgInBlcmNlbnQiLCBOQU1FX0NPTVBBUkFUT1IpOworICAgIH0KKyAgICBpZiAocGFzc2VkVGVzdHMuc2l6ZSgpID4gMCkgeworICAgICAgZ2VuZXJhdGVUYWJsZShzYiwgIlBBU1NFRCBURVNUUyIsIHBhc3NlZFRlc3RzLCAicGFzc2VkIiwgTkFNRV9DT01QQVJBVE9SKTsKKyAgICB9CisgICAgaWYgKHNraXBwZWRUZXN0cy5zaXplKCkgPiAwKSB7CisgICAgICBnZW5lcmF0ZVRhYmxlKHNiLCAiU0tJUFBFRCBURVNUUyIsIHNraXBwZWRUZXN0cywgInNraXBwZWQiLCBOQU1FX0NPTVBBUkFUT1IpOworICAgIH0KKworICAgIHNiLmFwcGVuZCgiPC9ib2R5PlxuPC9odG1sPiIpOworCisgICAgVXRpbHMud3JpdGVGaWxlKG91dHB1dERpcmVjdG9yeSwgZ2V0T3V0cHV0RmlsZSh0ZXN0Q29udGV4dCksIHNiLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0SFRNTFJlcG9ydGVyXSAiICsgcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOYW1lQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SVRlc3RSZXN1bHQ+LCBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MTc3NTgxNTgzODM2NjkwN0w7CisgICAgcHVibGljIGludCBjb21wYXJlKElUZXN0UmVzdWx0IG8xLCBJVGVzdFJlc3VsdCBvMikgeworICAgICAgU3RyaW5nIGMxID0gbzEuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgU3RyaW5nIGMyID0gbzIuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgcmV0dXJuIGMxLmNvbXBhcmVUbyhjMik7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SVRlc3RSZXN1bHQ+LCBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU1NTg1NTA4NTA2ODU0ODM0NTVMOworCisgICAgcHVibGljIGludCBjb21wYXJlKElUZXN0UmVzdWx0IG8xLCBJVGVzdFJlc3VsdCBvMikgeworICAgICAgSVRlc3ROR01ldGhvZCB0bTE9IG8xLmdldE1ldGhvZCgpOworICAgICAgSVRlc3ROR01ldGhvZCB0bTI9IG8yLmdldE1ldGhvZCgpOworICAgICAgcmV0dXJuIGFubm90YXRpb25WYWx1ZSh0bTIpIC0gYW5ub3RhdGlvblZhbHVlKHRtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGFubm90YXRpb25WYWx1ZShJVGVzdE5HTWV0aG9kIG1ldGhvZCkgeworICAgICAgaWYobWV0aG9kLmlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIDEwOworICAgICAgfQorICAgICAgaWYobWV0aG9kLmlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICByZXR1cm4gOTsKKyAgICAgIH0KKyAgICAgIGlmKG1ldGhvZC5pc0JlZm9yZUNsYXNzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIHJldHVybiA4OworICAgICAgfQorICAgICAgaWYobWV0aG9kLmlzQmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIHJldHVybiA3OworICAgICAgfQorICAgICAgaWYobWV0aG9kLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIHJldHVybiA2OworICAgICAgfQorICAgICAgaWYobWV0aG9kLmlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIDU7CisgICAgICB9CisgICAgICBpZihtZXRob2QuaXNBZnRlckdyb3Vwc0NvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICByZXR1cm4gNDsKKyAgICAgIH0KKyAgICAgIGlmKG1ldGhvZC5pc0FmdGVyQ2xhc3NDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisgICAgICBpZihtZXRob2QuaXNBZnRlclRlc3RDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBpZihtZXRob2QuaXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9UZXh0UmVwb3J0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvVGV4dFJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxNDQwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvVGV4dFJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwxODMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlscy5pc1N0cmluZ05vdEJsYW5rOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIHNpbXBsZSByZXBvcnRlciB0aGF0IGNvbGxlY3RzIHRoZSByZXN1bHRzIGFuZCBwcmludHMgdGhlbSBvbiBzdGFuZGFyZCBvdXQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlX21pbmRzdG9ybUBldm9sdmEucm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlcG9ydGVyIGV4dGVuZHMgVGVzdExpc3RlbmVyQWRhcHRlciB7CisgIHByaXZhdGUgaW50IG1fdmVyYm9zZSA9IDA7CisgIHByaXZhdGUgU3RyaW5nIG1fdGVzdE5hbWUgPSBudWxsOworCisKKyAgcHVibGljIFRleHRSZXBvcnRlcihTdHJpbmcgdGVzdE5hbWUsIGludCB2ZXJib3NlKSB7CisgICAgbV90ZXN0TmFtZSA9IHRlc3ROYW1lOworICAgIG1fdmVyYm9zZSA9IHZlcmJvc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25GaW5pc2goSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICBpZiAobV92ZXJib3NlID49IDIpIHsKKyAgICAgIGxvZ1Jlc3VsdHMoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSByZXN1bHRzVG9NZXRob2RzKExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICBJVGVzdE5HTWV0aG9kW10gcmVzdWx0ID0gbmV3IElUZXN0TkdNZXRob2RbcmVzdWx0cy5zaXplKCldOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHRyIDogcmVzdWx0cykgeworICAgICAgcmVzdWx0W2krK10gPSB0ci5nZXRNZXRob2QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdHMoKSB7CisgICAgLy8KKyAgICAvLyBMb2cgVGV4dAorICAgIC8vCisgICAgZm9yKE9iamVjdCBvIDogZ2V0Q29uZmlndXJhdGlvbkZhaWx1cmVzKCkpIHsKKyAgICAgIElUZXN0UmVzdWx0IHRyID0gKElUZXN0UmVzdWx0KSBvOworICAgICAgVGhyb3dhYmxlIGV4ID0gdHIuZ2V0VGhyb3dhYmxlKCk7CisgICAgICBTdHJpbmcgc3RhY2tUcmFjZT0gIiI7CisgICAgICBpZiAoZXggIT0gbnVsbCkgeworICAgICAgICBpZiAobV92ZXJib3NlID49IDIpIHsKKyAgICAgICAgICBzdGFja1RyYWNlPSBVdGlscy5zdGFja1RyYWNlKGV4LCBmYWxzZSlbMF07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbG9nUmVzdWx0KCJGQUlMRUQgQ09ORklHVVJBVElPTiIsCisgICAgICAgICAgVXRpbHMuZGV0YWlsZWRNZXRob2ROYW1lKHRyLmdldE1ldGhvZCgpLCBmYWxzZSksCisgICAgICAgICAgdHIuZ2V0TWV0aG9kKCkuZ2V0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICBzdGFja1RyYWNlLAorICAgICAgICAgIHRyLmdldFBhcmFtZXRlcnMoKSwKKyAgICAgICAgICB0ci5nZXRNZXRob2QoKS5nZXRNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpCisgICAgICApOworICAgIH0KKworICAgIGZvcihPYmplY3QgbyA6IGdldENvbmZpZ3VyYXRpb25Ta2lwcygpKSB7CisgICAgICBJVGVzdFJlc3VsdCB0ciA9IChJVGVzdFJlc3VsdCkgbzsKKyAgICAgIGxvZ1Jlc3VsdCgiU0tJUFBFRCBDT05GSUdVUkFUSU9OIiwKKyAgICAgICAgICBVdGlscy5kZXRhaWxlZE1ldGhvZE5hbWUodHIuZ2V0TWV0aG9kKCksIGZhbHNlKSwKKyAgICAgICAgICB0ci5nZXRNZXRob2QoKS5nZXREZXNjcmlwdGlvbigpLAorICAgICAgICAgIG51bGwsCisgICAgICAgICAgdHIuZ2V0UGFyYW1ldGVycygpLAorICAgICAgICAgIHRyLmdldE1ldGhvZCgpLmdldE1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCkKKyAgICAgICk7CisgICAgfQorCisgICAgZm9yKE9iamVjdCBvIDogZ2V0UGFzc2VkVGVzdHMoKSkgeworICAgICAgSVRlc3RSZXN1bHQgdHIgPSAoSVRlc3RSZXN1bHQpIG87CisgICAgICBsb2dSZXN1bHQoIlBBU1NFRCIsIHRyLCBudWxsKTsKKyAgICB9CisKKyAgICBmb3IoT2JqZWN0IG8gOiBnZXRGYWlsZWRUZXN0cygpKSB7CisgICAgICBJVGVzdFJlc3VsdCB0ciA9IChJVGVzdFJlc3VsdCkgbzsKKyAgICAgIFRocm93YWJsZSBleCA9IHRyLmdldFRocm93YWJsZSgpOworICAgICAgU3RyaW5nIHN0YWNrVHJhY2U9ICIiOworICAgICAgaWYgKGV4ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1fdmVyYm9zZSA+PSAyKSB7CisgICAgICAgICAgc3RhY2tUcmFjZT0gVXRpbHMuc3RhY2tUcmFjZShleCwgZmFsc2UpWzBdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxvZ1Jlc3VsdCgiRkFJTEVEIiwgdHIsIHN0YWNrVHJhY2UpOworICAgIH0KKworICAgIGZvcihPYmplY3QgbyA6IGdldFNraXBwZWRUZXN0cygpKSB7CisgICAgICBJVGVzdFJlc3VsdCB0ciA9IChJVGVzdFJlc3VsdCkgbzsKKyAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSB0ci5nZXRUaHJvd2FibGUoKTsKKyAgICAgIGxvZ1Jlc3VsdCgiU0tJUFBFRCIsIHRyLCB0aHJvd2FibGUgIT0gbnVsbCA/IFV0aWxzLnN0YWNrVHJhY2UodGhyb3dhYmxlLCBmYWxzZSlbMF0gOiBudWxsKTsKKyAgICB9CisKKyAgICBJVGVzdE5HTWV0aG9kW10gZnQgPSByZXN1bHRzVG9NZXRob2RzKGdldEZhaWxlZFRlc3RzKCkpOworICAgIFN0cmluZ0J1ZmZlciBsb2dCdWY9IG5ldyBTdHJpbmdCdWZmZXIoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIGxvZ0J1Zi5hcHBlbmQoIiAgICAiKS5hcHBlbmQobV90ZXN0TmFtZSkuYXBwZW5kKCJcbiIpOworICAgIGxvZ0J1Zi5hcHBlbmQoIiAgICBUZXN0cyBydW46ICIpLmFwcGVuZChVdGlscy5jYWxjdWxhdGVJbnZva2VkTWV0aG9kQ291bnQoZ2V0QWxsVGVzdE1ldGhvZHMoKSkpCisgICAgICAgIC5hcHBlbmQoIiwgRmFpbHVyZXM6ICIpLmFwcGVuZChVdGlscy5jYWxjdWxhdGVJbnZva2VkTWV0aG9kQ291bnQoZnQpKQorICAgICAgICAuYXBwZW5kKCIsIFNraXBzOiAiKS5hcHBlbmQoVXRpbHMuY2FsY3VsYXRlSW52b2tlZE1ldGhvZENvdW50KHJlc3VsdHNUb01ldGhvZHMoZ2V0U2tpcHBlZFRlc3RzKCkpKSk7CisgICAgaW50IGNvbmZGYWlsdXJlcz0gZ2V0Q29uZmlndXJhdGlvbkZhaWx1cmVzKCkuc2l6ZSgpOworICAgIGludCBjb25mU2tpcHM9IGdldENvbmZpZ3VyYXRpb25Ta2lwcygpLnNpemUoKTsKKyAgICBpZihjb25mRmFpbHVyZXMgPiAwIHx8IGNvbmZTa2lwcyA+IDApIHsKKyAgICAgIGxvZ0J1Zi5hcHBlbmQoIlxuIikuYXBwZW5kKCIgICAgQ29uZmlndXJhdGlvbiBGYWlsdXJlczogIikuYXBwZW5kKGNvbmZGYWlsdXJlcykKKyAgICAgICAgICAuYXBwZW5kKCIsIFNraXBzOiAiKS5hcHBlbmQoY29uZlNraXBzKTsKKyAgICB9CisgICAgbG9nQnVmLmFwcGVuZCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgbG9nUmVzdWx0KCIiLCBsb2dCdWYudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX3Rlc3ROYW1lOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcgc3RhdHVzLCBJVGVzdFJlc3VsdCB0ciwgU3RyaW5nIHN0YWNrVHJhY2UpIHsKKyAgICBsb2dSZXN1bHQoc3RhdHVzLCB0ci5nZXROYW1lKCksIHRyLmdldE1ldGhvZCgpLmdldERlc2NyaXB0aW9uKCksIHN0YWNrVHJhY2UsCisgICAgICAgIHRyLmdldFBhcmFtZXRlcnMoKSwgdHIuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nUmVzdWx0KFN0cmluZyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGlmKGlzU3RyaW5nTm90Qmxhbmsoc3RhdHVzKSkgeworICAgICAgYnVmLmFwcGVuZChzdGF0dXMpLmFwcGVuZCgiOiAiKTsKKyAgICB9CisgICAgYnVmLmFwcGVuZChtZXNzYWdlKTsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihidWYpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZ1Jlc3VsdChTdHJpbmcgc3RhdHVzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBzdGFja1RyYWNlLAorICAgICAgICAgIE9iamVjdFtdIHBhcmFtcywgQ2xhc3NbXSBwYXJhbVR5cGVzKSB7CisgICAgU3RyaW5nQnVmZmVyIG1zZz0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKKworICAgIGlmKG51bGwgIT0gcGFyYW1zICYmIHBhcmFtcy5sZW5ndGggPiAwKSB7CisgICAgICBtc2cuYXBwZW5kKCIoIik7CisKKyAgICAgIC8vIFRoZSBlcnJvciBtaWdodCBiZSBhIGRhdGEgcHJvdmlkZXIgcGFyYW1ldGVyIG1pc21hdGNoLCBzbyBtYWtlCisgICAgICAvLyBhIHNwZWNpYWwgY2FzZSBoZXJlCisgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSBwYXJhbVR5cGVzLmxlbmd0aCkgeworICAgICAgICBtc2cuYXBwZW5kKG5hbWUgKyAiOiBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGJ5ICIgKworICAgICAgICAgICAgICAgICJ0aGUgRGF0YSBQcm92aWRlcjogZm91bmQgIiArIHBhcmFtcy5sZW5ndGggKyAiIGJ1dCAiICsKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgIiArIHBhcmFtVHlwZXMubGVuZ3RoCisgICAgICAgICAgICAgICAgKyAiKSIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGZvcihpbnQgaT0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmKGkgPiAwKSB7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBtc2cuYXBwZW5kKFV0aWxzLnRvU3RyaW5nKHBhcmFtc1tpXSwgcGFyYW1UeXBlc1tpXSkpOworICAgICAgICB9CisKKyAgICAgICAgbXNnLmFwcGVuZCgiKSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoISBVdGlscy5pc1N0cmluZ0VtcHR5KGRlc2NyaXB0aW9uKSkgeworICAgICAgbXNnLmFwcGVuZCgiXG4iKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aCgpICsgMjsgaSsrKSB7CisgICAgICAgIG1zZy5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIG1zZy5hcHBlbmQoZGVzY3JpcHRpb24pOworICAgIH0KKyAgICBpZiAoICEgVXRpbHMuaXNTdHJpbmdFbXB0eShzdGFja1RyYWNlKSkgeworICAgICAgbXNnLmFwcGVuZCgiXG4iKS5hcHBlbmQoc3RhY2tUcmFjZSk7CisgICAgfQorCisgICAgbG9nUmVzdWx0KHN0YXR1cywgbXNnLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGV4dFJlcG9ydGVyICIgKyBnZXROYW1lKCkgKyAiXSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvVmVyYm9zZVJlcG9ydGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1ZlcmJvc2VSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1ZlcmJvc2VSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCisvKioKKyAqIFJlcG9ydGVyIHByaW50aW5nIG91dCBkZXRhaWxlZCBtZXNzYWdlcyBhYm91dCB3aGF0IFRlc3RORworICogaXMgZ29pbmcgdG8gcnVuIGFuZCB3aGF0IGlzIHRoZSBzdGF0dXMgb2Ygd2hhdCBoYXMgYmVlbiBqdXN0IHJ1bi4KKyAqCisgKiBUbyBzZWUgbWVzc2FnZXMgZnJvbSB0aGlzIHJlcG9ydGVyLCBlaXRoZXIgcnVuIEFudCBpbiB2ZXJib3NlIG1vZGUgKCdhbnQgLXYnKQorICogb3Igc2V0IHZlcmJvc2UgbGV2ZWwgdG8gNSBvciBoaWdoZXIKKyAqCisgKiBAYXV0aG9yIEx1a2FzIEp1bmdtYW5uCisgKiBAc2luY2UgNi40CisgKi8KK3B1YmxpYyBjbGFzcyBWZXJib3NlUmVwb3J0ZXIgZXh0ZW5kcyBUZXN0TGlzdGVuZXJBZGFwdGVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJlZml4IGZvciBtZXNzYWdlcyBwcmludGVkIG91dCBieSB0aGlzIHJlcG9ydGVyCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5FUl9QUkVGSVggPSAiW1ZlcmJvc2VUZXN0TkddICI7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3VpdGVOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKKworICAgIHByaXZhdGUgZW51bSBTdGF0dXMgeworCisgICAgICAgIFNVQ0NFU1MoSVRlc3RSZXN1bHQuU1VDQ0VTUyksIEZBSUxVUkUoSVRlc3RSZXN1bHQuRkFJTFVSRSksIFNLSVAoSVRlc3RSZXN1bHQuU0tJUCksCisgICAgICAgIFNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFKElUZXN0UmVzdWx0LlNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFKSwgU1RBUlRFRChJVGVzdFJlc3VsdC5TVEFSVEVEKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdHVzOworCisgICAgICAgIHByaXZhdGUgU3RhdHVzKGludCBpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBWZXJib3NlUmVwb3J0ZXIoKSB7CisgICAgICAgIHRoaXMoTElTVEVORVJfUFJFRklYKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgVmVyYm9zZVJlcG9ydGVyIHdpdGggY3VzdG9tIHByZWZpeAorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBwcmVmaXggZm9yIG1lc3NhZ2VzIHByaW50ZWQgb3V0IGJ5IHRoaXMgcmVwb3J0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVyYm9zZVJlcG9ydGVyKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYmVmb3JlQ29uZmlndXJhdGlvbihJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5iZWZvcmVDb25maWd1cmF0aW9uKHRyKTsKKyAgICAgICAgbG9nVGVzdFJlc3VsdChTdGF0dXMuU1RBUlRFRCwgdHIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkZhaWx1cmUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uRmFpbHVyZSh0cik7CisgICAgICAgIGxvZ1Rlc3RSZXN1bHQoU3RhdHVzLkZBSUxVUkUsIHRyLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25Ta2lwKElUZXN0UmVzdWx0IHRyKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvblNraXAodHIpOworICAgICAgICBsb2dUZXN0UmVzdWx0KFN0YXR1cy5TS0lQLCB0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU3VjY2VzcyhJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25TdWNjZXNzKHRyKTsKKyAgICAgICAgbG9nVGVzdFJlc3VsdChTdGF0dXMuU1VDQ0VTUywgdHIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0IHRyKSB7CisgICAgICAgIGxvZ1Rlc3RSZXN1bHQoU3RhdHVzLlNUQVJURUQsIHRyLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5vblRlc3RGYWlsdXJlKHRyKTsKKyAgICAgICAgbG9nVGVzdFJlc3VsdChTdGF0dXMuRkFJTFVSRSwgdHIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5vblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSh0cik7CisgICAgICAgIGxvZ1Rlc3RSZXN1bHQoU3RhdHVzLlNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFLCB0ciwgZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICAgICAgc3VwZXIub25UZXN0U2tpcHBlZCh0cik7CisgICAgICAgIGxvZ1Rlc3RSZXN1bHQoU3RhdHVzLlNLSVAsIHRyLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5vblRlc3RTdWNjZXNzKHRyKTsKKyAgICAgICAgbG9nVGVzdFJlc3VsdChTdGF0dXMuU1VDQ0VTUywgdHIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KElUZXN0Q29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VpdGVOYW1lID0gY3R4LmdldE5hbWUoKTsvL2N0eC5nZXRTdWl0ZSgpLmdldFhtbFN1aXRlKCkuZ2V0RmlsZU5hbWUoKTsKKyAgICAgICAgbG9nKCJSVU5OSU5HOiBTdWl0ZTogXCIiICsgc3VpdGVOYW1lICsgIlwiIGNvbnRhaW5pbmcgXCIiICsgY3R4LmdldEFsbFRlc3RNZXRob2RzKCkubGVuZ3RoICsgIlwiIFRlc3RzIChjb25maWc6ICIgKyBjdHguZ2V0U3VpdGUoKS5nZXRYbWxTdWl0ZSgpLmdldEZpbGVOYW1lKCkgKyAiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGxvZ1Jlc3VsdHMoKTsKKyAgICAgICAgc3VpdGVOYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIElUZXN0TkdNZXRob2RbXSByZXN1bHRzVG9NZXRob2RzKExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICAgICAgSVRlc3ROR01ldGhvZFtdIHJlc3VsdCA9IG5ldyBJVGVzdE5HTWV0aG9kW3Jlc3VsdHMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKElUZXN0UmVzdWx0IHRyIDogcmVzdWx0cykgeworICAgICAgICAgICAgcmVzdWx0W2krK10gPSB0ci5nZXRNZXRob2QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IG91dCB0ZXN0IHN1bW1hcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nUmVzdWx0cygpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9nIHRlc3Qgc3VtbWFyeQorICAgICAgICAvLworICAgICAgICBJVGVzdE5HTWV0aG9kW10gZnQgPSByZXN1bHRzVG9NZXRob2RzKGdldEZhaWxlZFRlc3RzKCkpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgICAgICBzYi5hcHBlbmQoIiAgICAiKS5hcHBlbmQoc3VpdGVOYW1lKS5hcHBlbmQoIlxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiICAgIFRlc3RzIHJ1bjogIikuYXBwZW5kKFV0aWxzLmNhbGN1bGF0ZUludm9rZWRNZXRob2RDb3VudChnZXRBbGxUZXN0TWV0aG9kcygpKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBGYWlsdXJlczogIikuYXBwZW5kKFV0aWxzLmNhbGN1bGF0ZUludm9rZWRNZXRob2RDb3VudChmdCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgU2tpcHM6ICIpLmFwcGVuZChVdGlscy5jYWxjdWxhdGVJbnZva2VkTWV0aG9kQ291bnQocmVzdWx0c1RvTWV0aG9kcyhnZXRTa2lwcGVkVGVzdHMoKSkpKTsKKyAgICAgICAgaW50IGNvbmZGYWlsdXJlcyA9IGdldENvbmZpZ3VyYXRpb25GYWlsdXJlcygpLnNpemUoKTsKKyAgICAgICAgaW50IGNvbmZTa2lwcyA9IGdldENvbmZpZ3VyYXRpb25Ta2lwcygpLnNpemUoKTsKKyAgICAgICAgaWYgKGNvbmZGYWlsdXJlcyA+IDAgfHwgY29uZlNraXBzID4gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJcbiIpLmFwcGVuZCgiICAgIENvbmZpZ3VyYXRpb24gRmFpbHVyZXM6ICIpLmFwcGVuZChjb25mRmFpbHVyZXMpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIFNraXBzOiAiKS5hcHBlbmQoY29uZlNraXBzKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgbG9nKHNiLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBtZWFuaW5nZnVsIG1lc3NhZ2UgZm9yIHBhc3NlZCBpbiBhcmd1bWVudHMuCisgICAgICogTWVzc2FnZSBpdHNlbGYgaXMgb2YgZm9ybToKKyAgICAgKiAkc3RhdHVzOiAiJHN1aXRlTmFtZSIgLSAkbWV0aG9kRGVjbGFyYXRpb24gKCRhY3R1YWxBcmd1bWVudHMpIGZpbmlzaGVkIGluICR4IG1zICgkcnVuIG9mICR0b3RhbFJ1bnMpCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3Qgc3RhdHVzIG9mIHBhc3NlZCBpbiBpdHIKKyAgICAgKiBAcGFyYW0gaXRyIHRlc3QgcmVzdWx0IHRvIGJlIGRlc2NyaWJlZAorICAgICAqIEBwYXJhbSBpc0NvbmZNZXRob2QgaXMgaXRyIGRlc2NyaWJpbmcgY29uZmlndXJhdGlvbiBtZXRob2QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nVGVzdFJlc3VsdChTdGF0dXMgc3QsIElUZXN0UmVzdWx0IGl0ciwgYm9vbGVhbiBpc0NvbmZNZXRob2QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3VjY1JhdGUgPSBudWxsOworICAgICAgICBTdHJpbmcgc3RhY2tUcmFjZSA9ICIiOworICAgICAgICBzd2l0Y2ggKHN0KSB7CisgICAgICAgICAgICBjYXNlIFNUQVJURUQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJJTlZPS0lORyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTS0lQOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiU0tJUFBFRCIpOworICAgICAgICAgICAgICAgIHN0YWNrVHJhY2UgPSBpdHIuZ2V0VGhyb3dhYmxlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBVdGlscy5zdGFja1RyYWNlKGl0ci5nZXRUaHJvd2FibGUoKSwgZmFsc2UpWzBdIDogIiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZBSUxVUkU6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJGQUlMRUQiKTsKKyAgICAgICAgICAgICAgICBzdGFja1RyYWNlID0gaXRyLmdldFRocm93YWJsZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gVXRpbHMuc3RhY2tUcmFjZShpdHIuZ2V0VGhyb3dhYmxlKCksIGZhbHNlKVswXSA6ICIiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUEFTU0VEIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNVQ0NFU1NfUEVSQ0VOVEFHRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUEFTU0VEIHdpdGggZmFpbHVyZXMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy9ub3QgaGFwcGVuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHRlc3Qgc3RhdHVzOiIgKyBpdHIuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NvbmZNZXRob2QpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIENPTkZJR1VSQVRJT046ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKCI6ICIpOworICAgICAgICB9CisgICAgICAgIElUZXN0TkdNZXRob2QgdG0gPSBpdHIuZ2V0TWV0aG9kKCk7CisgICAgICAgIGludCBpZGVudExldmVsID0gc2IubGVuZ3RoKCk7CisgICAgICAgIHNiLmFwcGVuZChnZXRNZXRob2REZWNsYXJhdGlvbih0bSkpOworICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBpdHIuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSB0bS5nZXRNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBpZiAobnVsbCAhPSBwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIFRoZSBlcnJvciBtaWdodCBiZSBhIGRhdGEgcHJvdmlkZXIgcGFyYW1ldGVyIG1pc21hdGNoLCBzbyBtYWtlCisgICAgICAgICAgICAvLyBhIHNwZWNpYWwgY2FzZSBoZXJlCisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSBwYXJhbVR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZCBieSB0aGUgRGF0YSBQcm92aWRlcjogZm91bmQgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGJ1dCBleHBlY3RlZCAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyYW1UeXBlcy5sZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIih2YWx1ZShzKTogIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFV0aWxzLnRvU3RyaW5nKHBhcmFtc1tpXSwgcGFyYW1UeXBlc1tpXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChTdGF0dXMuU1RBUlRFRCAhPSBzdCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZmluaXNoZWQgaW4gIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaXRyLmdldEVuZE1pbGxpcygpIC0gaXRyLmdldFN0YXJ0TWlsbGlzKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbXMiKTsKKyAgICAgICAgICAgIGlmICghVXRpbHMuaXNTdHJpbmdFbXB0eSh0bS5nZXREZXNjcmlwdGlvbigpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkZW50TGV2ZWw7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRtLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtLmdldEludm9jYXRpb25Db3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodG0uZ2V0Q3VycmVudEludm9jYXRpb25Db3VudCgpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBvZiAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodG0uZ2V0SW52b2NhdGlvbkNvdW50KCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFVdGlscy5pc1N0cmluZ0VtcHR5KHN0YWNrVHJhY2UpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcbiIpLmFwcGVuZChzdGFja1RyYWNlLnN1YnN0cmluZygwLCBzdGFja1RyYWNlLmxhc3RJbmRleE9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghaXNDb25mTWV0aG9kICYmIHRtLmdldEludm9jYXRpb25Db3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHN1Y2Nlc3M6ICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0bS5nZXRTdWNjZXNzUGVyY2VudGFnZSgpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2coc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIC8vcHJlZml4IGFsbCBvdXRwdXQgbGluZXMKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UucmVwbGFjZUFsbCgiKD9tKV4iLCBwcmVmaXgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIHRvIGJlIGRlc2NyaWJlZAorICAgICAqIEByZXR1cm4gRlFOIG9mIGEgY2xhc3MgKyBtZXRob2QgZGVjbGFyYXRpb24gZm9yIGEgbWV0aG9kIHBhc3NlZCBpbgorICAgICAqICAgICAgaWUuIHRlc3QudHJpYW5nbGUuQ2hlY2tDb3VudC50ZXN0Q2hlY2tDb3VudChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldE1ldGhvZERlY2xhcmF0aW9uKElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIC8vc2VlIFV0aWxzLmRldGFpbGVkTWV0aG9kTmFtZQorICAgICAgICAvL3BlcmhhcHMgc2hvdWxkIHJhdGhlciBhZG9wdCB0aGUgb3JpZ2luYWwgbWV0aG9kIGluc3RlYWQKKyAgICAgICAgTWV0aG9kIG0gPSBtZXRob2QuZ2V0TWV0aG9kKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgaWYgKHN1aXRlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHN1aXRlTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJVTktOT1dOIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIC0gIik7CisgICAgICAgIGlmIChtZXRob2QuaXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQEJlZm9yZVN1aXRlICIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5pc0JlZm9yZVRlc3RDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkBCZWZvcmVUZXN0ICIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5pc0JlZm9yZUNsYXNzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJAQmVmb3JlQ2xhc3MgIik7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmlzQmVmb3JlR3JvdXBzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJAQmVmb3JlR3JvdXBzICIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5pc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQEJlZm9yZU1ldGhvZCAiKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQEFmdGVyTWV0aG9kICIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5pc0FmdGVyR3JvdXBzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJAQWZ0ZXJHcm91cHMgIik7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmlzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQEFmdGVyQ2xhc3MgIik7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmlzQWZ0ZXJUZXN0Q29uZmlndXJhdGlvbigpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJAQWZ0ZXJUZXN0ICIpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5pc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkBBZnRlclN1aXRlICIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQobS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIi4iKTsKKyAgICAgICAgYnVmLmFwcGVuZChtLmdldE5hbWUoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIigiKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKENsYXNzPD8+IHAgOiBtLmdldFBhcmFtZXRlclR5cGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChpKysgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVmVyYm9zZVJlcG9ydGVyeyIgKyAic3VpdGVOYW1lPSIgKyBzdWl0ZU5hbWUgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDhjZGNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVyczsKKworLyoqCisgKiBpbnRlcmZhY2UgZ3JvdXBzIHRoZSBYTUwgY29uc3RhbnRzCisgKiB0cmllcyB0byBlbXVsYXRlIHdoYXQncyBpbiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5YTUxDb25zdGFudHMKKyAqIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBqdW5pdHJlcG9ydAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhNTENvbnN0YW50cyB7CisgIC8qKiB0aGUgdGVzdHN1aXRlcyBlbGVtZW50IGZvciB0aGUgYWdncmVnYXRlIGRvY3VtZW50ICovCisgIFN0cmluZyBURVNUU1VJVEVTID0gInRlc3RzdWl0ZXMiOworCisgIC8qKiB0aGUgdGVzdHN1aXRlIGVsZW1lbnQgKi8KKyAgU3RyaW5nIFRFU1RTVUlURSA9ICJ0ZXN0c3VpdGUiOworCisgIC8qKiB0aGUgdGVzdGNhc2UgZWxlbWVudCAqLworICBTdHJpbmcgVEVTVENBU0UgPSAidGVzdGNhc2UiOworCisgIC8qKiB0aGUgZXJyb3IgZWxlbWVudCAqLworICBTdHJpbmcgRVJST1IgPSAiZXJyb3IiOworCisgIC8qKiB0aGUgZmFpbHVyZSBlbGVtZW50ICovCisgIFN0cmluZyBGQUlMVVJFID0gImZhaWx1cmUiOworCisgIC8qKiB0aGUgc3lzdGVtLWVyciBlbGVtZW50ICovCisgIFN0cmluZyBTWVNURU1fRVJSID0gInN5c3RlbS1lcnIiOworCisgIC8qKiB0aGUgc3lzdGVtLW91dCBlbGVtZW50ICovCisgIFN0cmluZyBTWVNURU1fT1VUID0gInN5c3RlbS1vdXQiOworCisgIC8qKiBwYWNrYWdlIGF0dHJpYnV0ZSBmb3IgdGhlIGFnZ3JlZ2F0ZSBkb2N1bWVudCAqLworICBTdHJpbmcgQVRUUl9QQUNLQUdFID0gInBhY2thZ2UiOworCisgIC8qKiBuYW1lIGF0dHJpYnV0ZSBmb3IgcHJvcGVydHksIHRlc3RjYXNlIGFuZCB0ZXN0c3VpdGUgZWxlbWVudHMgKi8KKyAgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKKworICAvKiogdGltZSBhdHRyaWJ1dGUgZm9yIHRlc3RjYXNlIGFuZCB0ZXN0c3VpdGUgZWxlbWVudHMgKi8KKyAgU3RyaW5nIEFUVFJfVElNRSA9ICJ0aW1lIjsKKworICAvKiogZXJyb3JzIGF0dHJpYnV0ZSBmb3IgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgIFN0cmluZyBBVFRSX0VSUk9SUyA9ICJlcnJvcnMiOworCisgIC8qKiBmYWlsdXJlcyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLworICBTdHJpbmcgQVRUUl9GQUlMVVJFUyA9ICJmYWlsdXJlcyI7CisKKyAgLyoqIHRlc3RzIGF0dHJpYnV0ZSBmb3IgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgIFN0cmluZyBBVFRSX1RFU1RTID0gInRlc3RzIjsKKworICAvKiogdHlwZSBhdHRyaWJ1dGUgZm9yIGZhaWx1cmUgYW5kIGVycm9yIGVsZW1lbnRzICovCisgIFN0cmluZyBBVFRSX1RZUEUgPSAidHlwZSI7CisKKyAgLyoqIG1lc3NhZ2UgYXR0cmlidXRlIGZvciBmYWlsdXJlIGVsZW1lbnRzICovCisgIFN0cmluZyBBVFRSX01FU1NBR0UgPSAibWVzc2FnZSI7CisKKyAgLyoqIHRoZSBwcm9wZXJ0aWVzIGVsZW1lbnQgKi8KKyAgU3RyaW5nIFBST1BFUlRJRVMgPSAicHJvcGVydGllcyI7CisKKyAgLyoqIHRoZSBwcm9wZXJ0eSBlbGVtZW50ICovCisgIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7CisKKyAgLyoqIHZhbHVlIGF0dHJpYnV0ZSBmb3IgcHJvcGVydHkgZWxlbWVudHMgKi8KKyAgU3RyaW5nIEFUVFJfVkFMVUUgPSAidmFsdWUiOworCisgIC8qKiBjbGFzc25hbWUgYXR0cmlidXRlIGZvciB0ZXN0Y2FzZSBlbGVtZW50cyAqLworICBTdHJpbmcgQVRUUl9DTEFTU05BTUUgPSAiY2xhc3NuYW1lIjsKKworICBTdHJpbmcgQVRUUl9IT1NUTkFNRSA9ICJob3N0bmFtZSI7CisKKyAgU3RyaW5nIEFUVFJfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxSZXBvcnRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1hNTFJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklSZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZVJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorICogVGhlIG1haW4gZW50cnkgZm9yIHRoZSBYTUwgZ2VuZXJhdGlvbiBvcGVyYXRpb24KKyAqIAorICogQGF1dGhvciBDb3NtaW4gTWFyZ2luZWFuLCBNYXIgMTYsIDIwMDcKKyAqLworcHVibGljIGNsYXNzIFhNTFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FID0gInRlc3RuZy1yZXN1bHRzLnhtbCI7CisKKyAgcHJpdmF0ZSBmaW5hbCBYTUxSZXBvcnRlckNvbmZpZyBjb25maWcgPSBuZXcgWE1MUmVwb3J0ZXJDb25maWcoKTsKKyAgcHJpdmF0ZSBYTUxTdHJpbmdCdWZmZXIgcm9vdEJ1ZmZlcjsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLAorICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgIGlmIChVdGlscy5pc1N0cmluZ0VtcHR5KGNvbmZpZy5nZXRPdXRwdXREaXJlY3RvcnkoKSkpIHsKKyAgICAgIGNvbmZpZy5zZXRPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgcGFzc2VkL2ZhaWxlZC9za2lwcGVkCisgICAgaW50IHBhc3NlZCA9IDA7CisgICAgaW50IGZhaWxlZCA9IDA7CisgICAgaW50IHNraXBwZWQgPSAwOworICAgIGZvciAoSVN1aXRlIHMgOiBzdWl0ZXMpIHsKKyAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHNyIDogcy5nZXRSZXN1bHRzKCkudmFsdWVzKCkpIHsKKyAgICAgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0ID0gc3IuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgcGFzc2VkICs9IHRlc3RDb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgICBmYWlsZWQgKz0gdGVzdENvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIHNraXBwZWQgKz0gdGVzdENvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHJvb3RCdWZmZXIgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCk7CisgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwLnB1dCgicGFzc2VkIiwgcGFzc2VkKTsKKyAgICBwLnB1dCgiZmFpbGVkIiwgZmFpbGVkKTsKKyAgICBwLnB1dCgic2tpcHBlZCIsIHNraXBwZWQpOworICAgIHAucHV0KCJ0b3RhbCIsIHBhc3NlZCArIGZhaWxlZCArIHNraXBwZWQpOworICAgIHJvb3RCdWZmZXIucHVzaChYTUxSZXBvcnRlckNvbmZpZy5UQUdfVEVTVE5HX1JFU1VMVFMsIHApOworICAgIHdyaXRlUmVwb3J0ZXJPdXRwdXQocm9vdEJ1ZmZlcik7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIHdyaXRlU3VpdGUoc3VpdGUuZ2V0WG1sU3VpdGUoKSwgc3VpdGUpOworICAgIH0KKyAgICByb290QnVmZmVyLnBvcCgpOworICAgIFV0aWxzLndyaXRlVXRmOEZpbGUoY29uZmlnLmdldE91dHB1dERpcmVjdG9yeSgpLCBGSUxFX05BTUUsIHJvb3RCdWZmZXIsIG51bGwgLyogbm8gcHJlZml4ICovKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZVJlcG9ydGVyT3V0cHV0KFhNTFN0cmluZ0J1ZmZlciB4bWxCdWZmZXIpIHsKKyAgICAvLyBUT0RPOiBDb3NtaW4gLSBtYXliZSBhIDxsaW5lPiBlbGVtZW50IGlzbid0IGluZGljYXRlZCBmb3IgZWFjaCBsaW5lCisgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX1JFUE9SVEVSX09VVFBVVCk7CisgICAgTGlzdDxTdHJpbmc+IG91dHB1dCA9IFJlcG9ydGVyLmdldE91dHB1dCgpOworICAgIGZvciAoU3RyaW5nIGxpbmUgOiBvdXRwdXQpIHsKKyAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX0xJTkUpOworICAgICAgICB4bWxCdWZmZXIuYWRkQ0RBVEEobGluZSk7CisgICAgICAgIHhtbEJ1ZmZlci5wb3AoKTsKKyAgICAgIH0KKyAgICB9CisgICAgeG1sQnVmZmVyLnBvcCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlU3VpdGUoWG1sU3VpdGUgeG1sU3VpdGUsIElTdWl0ZSBzdWl0ZSkgeworICAgIHN3aXRjaCAoY29uZmlnLmdldEZpbGVGcmFnbWVudGF0aW9uTGV2ZWwoKSkgeworICAgIGNhc2UgWE1MUmVwb3J0ZXJDb25maWcuRkZfTEVWRUxfTk9ORToKKyAgICAgIHdyaXRlU3VpdGVUb0J1ZmZlcihyb290QnVmZmVyLCBzdWl0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTFJlcG9ydGVyQ29uZmlnLkZGX0xFVkVMX1NVSVRFOgorICAgIGNhc2UgWE1MUmVwb3J0ZXJDb25maWcuRkZfTEVWRUxfU1VJVEVfUkVTVUxUOgorICAgICAgRmlsZSBzdWl0ZUZpbGUgPSByZWZlcmVuY2VTdWl0ZShyb290QnVmZmVyLCBzdWl0ZSk7CisgICAgICB3cml0ZVN1aXRlVG9GaWxlKHN1aXRlRmlsZSwgc3VpdGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZVN1aXRlVG9GaWxlKEZpbGUgc3VpdGVGaWxlLCBJU3VpdGUgc3VpdGUpIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyID0gbmV3IFhNTFN0cmluZ0J1ZmZlcigpOworICAgIHdyaXRlU3VpdGVUb0J1ZmZlcih4bWxCdWZmZXIsIHN1aXRlKTsKKyAgICBGaWxlIHBhcmVudERpciA9IHN1aXRlRmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgaWYgKHBhcmVudERpci5leGlzdHMoKSB8fCBzdWl0ZUZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpKSB7CisgICAgICBVdGlscy53cml0ZUZpbGUocGFyZW50RGlyLmdldEFic29sdXRlUGF0aCgpLCBGSUxFX05BTUUsIHhtbEJ1ZmZlci50b1hNTCgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEZpbGUgcmVmZXJlbmNlU3VpdGUoWE1MU3RyaW5nQnVmZmVyIHhtbEJ1ZmZlciwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHN1aXRlLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIEZJTEVfTkFNRTsKKyAgICBGaWxlIHN1aXRlRmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5nZXRPdXRwdXREaXJlY3RvcnkoKSwgcmVsYXRpdmVQYXRoKTsKKyAgICBQcm9wZXJ0aWVzIGF0dHJzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBhdHRycy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX1VSTCwgcmVsYXRpdmVQYXRoKTsKKyAgICB4bWxCdWZmZXIuYWRkRW1wdHlFbGVtZW50KFhNTFJlcG9ydGVyQ29uZmlnLlRBR19TVUlURSwgYXR0cnMpOworICAgIHJldHVybiBzdWl0ZUZpbGU7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVTdWl0ZVRvQnVmZmVyKFhNTFN0cmluZ0J1ZmZlciB4bWxCdWZmZXIsIElTdWl0ZSBzdWl0ZSkgeworICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19TVUlURSwgZ2V0U3VpdGVBdHRyaWJ1dGVzKHN1aXRlKSk7CisgICAgd3JpdGVTdWl0ZUdyb3Vwcyh4bWxCdWZmZXIsIHN1aXRlKTsKKworICAgIE1hcDxTdHJpbmcsIElTdWl0ZVJlc3VsdD4gcmVzdWx0cyA9IHN1aXRlLmdldFJlc3VsdHMoKTsKKyAgICBYTUxTdWl0ZVJlc3VsdFdyaXRlciBzdWl0ZVJlc3VsdFdyaXRlciA9IG5ldyBYTUxTdWl0ZVJlc3VsdFdyaXRlcihjb25maWcpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHQgOiByZXN1bHRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHN1aXRlUmVzdWx0V3JpdGVyLndyaXRlU3VpdGVSZXN1bHQoeG1sQnVmZmVyLCByZXN1bHQuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgeG1sQnVmZmVyLnBvcCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlU3VpdGVHcm91cHMoWE1MU3RyaW5nQnVmZmVyIHhtbEJ1ZmZlciwgSVN1aXRlIHN1aXRlKSB7CisgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX0dST1VQUyk7CisgICAgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPj4gbWV0aG9kc0J5R3JvdXBzID0gc3VpdGUuZ2V0TWV0aG9kc0J5R3JvdXBzKCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPElUZXN0TkdNZXRob2Q+PiBlbnRyeSA6IG1ldGhvZHNCeUdyb3Vwcy5lbnRyeVNldCgpKSB7CisgICAgICBQcm9wZXJ0aWVzIGdyb3VwQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgZ3JvdXBBdHRycy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUUsIGVudHJ5LmdldEtleSgpKTsKKyAgICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19HUk9VUCwgZ3JvdXBBdHRycyk7CisgICAgICBTZXQ8SVRlc3ROR01ldGhvZD4gZ3JvdXBNZXRob2RzID0gZ2V0VW5pcXVlTWV0aG9kU2V0KGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIGdyb3VwTWV0aG9kIDogZ3JvdXBNZXRob2RzKSB7CisgICAgICAgIFByb3BlcnRpZXMgbWV0aG9kQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBtZXRob2RBdHRycy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUUsIGdyb3VwTWV0aG9kLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgIG1ldGhvZEF0dHJzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfTUVUSE9EX1NJRywgZ3JvdXBNZXRob2QudG9TdHJpbmcoKSk7CisgICAgICAgIG1ldGhvZEF0dHJzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfQ0xBU1MsIGdyb3VwTWV0aG9kLmdldFJlYWxDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIHhtbEJ1ZmZlci5hZGRFbXB0eUVsZW1lbnQoWE1MUmVwb3J0ZXJDb25maWcuVEFHX01FVEhPRCwgbWV0aG9kQXR0cnMpOworICAgICAgfQorICAgICAgeG1sQnVmZmVyLnBvcCgpOworICAgIH0KKyAgICB4bWxCdWZmZXIucG9wKCk7CisgIH0KKworICBwcml2YXRlIFByb3BlcnRpZXMgZ2V0U3VpdGVBdHRyaWJ1dGVzKElTdWl0ZSBzdWl0ZSkgeworICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgIHByb3BzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfTkFNRSwgc3VpdGUuZ2V0TmFtZSgpKTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgZHVyYXRpb24KKyAgICBNYXA8U3RyaW5nLCBJU3VpdGVSZXN1bHQ+IHJlc3VsdHMgPSBzdWl0ZS5nZXRSZXN1bHRzKCk7CisgICAgRGF0ZSBtaW5TdGFydERhdGUgPSBuZXcgRGF0ZSgpOworICAgIERhdGUgbWF4RW5kRGF0ZSA9IG51bGw7CisgICAgLy8gVE9ETzogV2UgY291bGQgcHJvYmFibHkgb3B0aW1pemUgdGhpcyBpbiBvcmRlciBub3QgdG8gdHJhdmVyc2UgdGhpcyB0d2ljZQorICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHQgOiByZXN1bHRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCA9IHJlc3VsdC5nZXRWYWx1ZSgpLmdldFRlc3RDb250ZXh0KCk7CisgICAgICBEYXRlIHN0YXJ0RGF0ZSA9IHRlc3RDb250ZXh0LmdldFN0YXJ0RGF0ZSgpOworICAgICAgRGF0ZSBlbmREYXRlID0gdGVzdENvbnRleHQuZ2V0RW5kRGF0ZSgpOworICAgICAgaWYgKG1pblN0YXJ0RGF0ZS5hZnRlcihzdGFydERhdGUpKSB7CisgICAgICAgIG1pblN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhFbmREYXRlID09IG51bGwgfHwgbWF4RW5kRGF0ZS5iZWZvcmUoZW5kRGF0ZSkpIHsKKyAgICAgICAgbWF4RW5kRGF0ZSA9IGVuZERhdGUgIT0gbnVsbCA/IGVuZERhdGUgOiBzdGFydERhdGU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIHN1aXRlIGNvdWxkIGJlIGNvbXBsZXRlbHkgZW1wdHkKKyAgICBpZiAobWF4RW5kRGF0ZSA9PSBudWxsKSB7CisgICAgICBtYXhFbmREYXRlID0gbWluU3RhcnREYXRlOworICAgIH0KKyAgICBhZGREdXJhdGlvbkF0dHJpYnV0ZXMoY29uZmlnLCBwcm9wcywgbWluU3RhcnREYXRlLCBtYXhFbmREYXRlKTsKKyAgICByZXR1cm4gcHJvcHM7CisgIH0KKworICAvKioKKyAgICogQWRkIHN0YXJ0ZWQtYXQsIGZpbmlzaGVkLWF0IGFuZCBkdXJhdGlvbi1tcyBhdHRyaWJ1dGVzIHRvIHRoZSA8c3VpdGU+IHRhZworICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZER1cmF0aW9uQXR0cmlidXRlcyhYTUxSZXBvcnRlckNvbmZpZyBjb25maWcsIFByb3BlcnRpZXMgYXR0cmlidXRlcywKKyAgICAgIERhdGUgbWluU3RhcnREYXRlLCBEYXRlIG1heEVuZERhdGUpIHsKKyAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGNvbmZpZy5nZXRUaW1lc3RhbXBGb3JtYXQoKSk7CisgICAgVGltZVpvbmUgdXRjID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpOworICAgIGZvcm1hdC5zZXRUaW1lWm9uZSh1dGMpOworICAgIFN0cmluZyBzdGFydFRpbWUgPSBmb3JtYXQuZm9ybWF0KG1pblN0YXJ0RGF0ZSk7CisgICAgU3RyaW5nIGVuZFRpbWUgPSBmb3JtYXQuZm9ybWF0KG1heEVuZERhdGUpOworICAgIGxvbmcgZHVyYXRpb24gPSBtYXhFbmREYXRlLmdldFRpbWUoKSAtIG1pblN0YXJ0RGF0ZS5nZXRUaW1lKCk7CisKKyAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfU1RBUlRFRF9BVCwgc3RhcnRUaW1lKTsKKyAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfRklOSVNIRURfQVQsIGVuZFRpbWUpOworICAgIGF0dHJpYnV0ZXMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9EVVJBVElPTl9NUywgTG9uZy50b1N0cmluZyhkdXJhdGlvbikpOworICB9CisKKyAgcHJpdmF0ZSBTZXQ8SVRlc3ROR01ldGhvZD4gZ2V0VW5pcXVlTWV0aG9kU2V0KENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gbWV0aG9kcykgeworICAgIFNldDxJVGVzdE5HTWV0aG9kPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgIHJlc3VsdC5hZGQobWV0aG9kKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIFRPRE86IFRoaXMgaXMgbm90IHRoZSBzbWFydGVzdCB3YXkgdG8gaW1wbGVtZW50IHRoZSBjb25maWcKKyAgcHVibGljIGludCBnZXRGaWxlRnJhZ21lbnRhdGlvbkxldmVsKCkgeworICAgIHJldHVybiBjb25maWcuZ2V0RmlsZUZyYWdtZW50YXRpb25MZXZlbCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmlsZUZyYWdtZW50YXRpb25MZXZlbChpbnQgZmlsZUZyYWdtZW50YXRpb25MZXZlbCkgeworICAgIGNvbmZpZy5zZXRGaWxlRnJhZ21lbnRhdGlvbkxldmVsKGZpbGVGcmFnbWVudGF0aW9uTGV2ZWwpOworICB9CisKKyAgcHVibGljIGludCBnZXRTdGFja1RyYWNlT3V0cHV0TWV0aG9kKCkgeworICAgIHJldHVybiBjb25maWcuZ2V0U3RhY2tUcmFjZU91dHB1dE1ldGhvZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3RhY2tUcmFjZU91dHB1dE1ldGhvZChpbnQgc3RhY2tUcmFjZU91dHB1dE1ldGhvZCkgeworICAgIGNvbmZpZy5zZXRTdGFja1RyYWNlT3V0cHV0TWV0aG9kKHN0YWNrVHJhY2VPdXRwdXRNZXRob2QpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIGNvbmZpZy5nZXRPdXRwdXREaXJlY3RvcnkoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgY29uZmlnLnNldE91dHB1dERpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUdyb3Vwc0F0dHJpYnV0ZSgpIHsKKyAgICByZXR1cm4gY29uZmlnLmlzR2VuZXJhdGVHcm91cHNBdHRyaWJ1dGUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlR3JvdXBzQXR0cmlidXRlKGJvb2xlYW4gZ2VuZXJhdGVHcm91cHNBdHRyaWJ1dGUpIHsKKyAgICBjb25maWcuc2V0R2VuZXJhdGVHcm91cHNBdHRyaWJ1dGUoZ2VuZXJhdGVHcm91cHNBdHRyaWJ1dGUpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNTcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzKCkgeworICAgIHJldHVybiBjb25maWcuaXNTcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzKGJvb2xlYW4gc3BsaXRDbGFzc0FuZFBhY2thZ2VOYW1lcykgeworICAgIGNvbmZpZy5zZXRTcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzKHNwbGl0Q2xhc3NBbmRQYWNrYWdlTmFtZXMpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXBGb3JtYXQoKSB7CisgICAgcmV0dXJuIGNvbmZpZy5nZXRUaW1lc3RhbXBGb3JtYXQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcEZvcm1hdChTdHJpbmcgdGltZXN0YW1wRm9ybWF0KSB7CisgICAgY29uZmlnLnNldFRpbWVzdGFtcEZvcm1hdCh0aW1lc3RhbXBGb3JtYXQpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURlcGVuZHNPbk1ldGhvZHMoKSB7CisgICAgcmV0dXJuIGNvbmZpZy5pc0dlbmVyYXRlRGVwZW5kc09uTWV0aG9kcygpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEZXBlbmRzT25NZXRob2RzKGJvb2xlYW4gZ2VuZXJhdGVEZXBlbmRzT25NZXRob2RzKSB7CisgICAgY29uZmlnLnNldEdlbmVyYXRlRGVwZW5kc09uTWV0aG9kcyhnZW5lcmF0ZURlcGVuZHNPbk1ldGhvZHMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEZXBlbmRzT25Hcm91cHMoYm9vbGVhbiBnZW5lcmF0ZURlcGVuZHNPbkdyb3VwcykgeworICAgIGNvbmZpZy5zZXRHZW5lcmF0ZURlcGVuZHNPbkdyb3VwcyhnZW5lcmF0ZURlcGVuZHNPbkdyb3Vwcyk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRGVwZW5kc09uR3JvdXBzKCkgeworICAgIHJldHVybiBjb25maWcuaXNHZW5lcmF0ZURlcGVuZHNPbkdyb3VwcygpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcyhib29sZWFuIGdlbmVyYXRlVGVzdFJlc3VsdEF0dHJpYnV0ZXMpIHsKKyAgICBjb25maWcuc2V0R2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcyhnZW5lcmF0ZVRlc3RSZXN1bHRBdHRyaWJ1dGVzKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcygpIHsKKyAgICByZXR1cm4gY29uZmlnLmlzR2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcygpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MUmVwb3J0ZXJDb25maWcuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MUmVwb3J0ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjI1Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxSZXBvcnRlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbiBEYXRlOiBNYXIgMjcsIDIwMDcgVGltZTogOToxNjoyOCBBTQorICovCitwdWJsaWMgY2xhc3MgWE1MUmVwb3J0ZXJDb25maWcgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19URVNUID0gInRlc3QiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVEVTVF9NRVRIT0QgPSAidGVzdC1tZXRob2QiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRVhDRVBUSU9OID0gImV4Y2VwdGlvbiI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NRVNTQUdFID0gIm1lc3NhZ2UiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0hPUlRfU1RBQ0tUUkFDRSA9ICJzaG9ydC1zdGFja3RyYWNlIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZVTExfU1RBQ0tUUkFDRSA9ICJmdWxsLXN0YWNrdHJhY2UiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVEVTVE5HX1JFU1VMVFMgPSAidGVzdG5nLXJlc3VsdHMiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU1VJVEUgPSAic3VpdGUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfR1JPVVBTID0gImdyb3VwcyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19HUk9VUCA9ICJncm91cCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTEFTUyA9ICJjbGFzcyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NRVRIT0QgPSAibWV0aG9kIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUkFNUyA9ICJwYXJhbXMiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSQU0gPSAicGFyYW0iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSQU1fVkFMVUUgPSAidmFsdWUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQT1JURVJfT1VUUFVUID0gInJlcG9ydGVyLW91dHB1dCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19MSU5FID0gImxpbmUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFUyA9ICJhdHRyaWJ1dGVzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVJMID0gInVybCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFUVVMgPSAic3RhdHVzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERVNDID0gImRlc2NyaXB0aW9uIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRVRIT0RfU0lHID0gInNpZ25hdHVyZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfR1JPVVBTID0gImdyb3VwcyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RFU1RfSU5TVEFOQ0VfTkFNRSA9ICJ0ZXN0LWluc3RhbmNlLW5hbWUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOREVYID0gImluZGV4IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JU19OVUxMID0gImlzLW51bGwiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BBQ0tBR0UgPSAicGFja2FnZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlRFRF9BVCA9ICJzdGFydGVkLWF0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSU5JU0hFRF9BVCA9ICJmaW5pc2hlZC1hdCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRFVSQVRJT05fTVMgPSAiZHVyYXRpb24tbXMiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lTX0NPTkZJRyA9ICJpcy1jb25maWciOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFUEVORFNfT05fTUVUSE9EUyA9ICJkZXBlbmRzLW9uLW1ldGhvZHMiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFUEVORFNfT05fR1JPVVBTID0gImRlcGVuZHMtb24tZ3JvdXBzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRBX1BST1ZJREVSID0gImRhdGEtcHJvdmlkZXIiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFTU0VEID0gIlBBU1MiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZBSUxFRCA9ICJGQUlMIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TS0lQUEVEID0gIlNLSVAiOworCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IFNUQVRVU0VTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpIHt7CisgICAgcHV0KFRFU1RfUEFTU0VELCBJVGVzdFJlc3VsdC5TVUNDRVNTKTsKKyAgICBwdXQoVEVTVF9GQUlMRUQsIElUZXN0UmVzdWx0LkZBSUxVUkUpOworICAgIHB1dChURVNUX1NLSVBQRUQsIElUZXN0UmVzdWx0LlNLSVApOworICB9fTsKKworICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKKyAgICByZXR1cm4gU1RBVFVTRVMuZ2V0KHN0YXR1cyk7CisgIH0KKworICAvKioKKyAgICogSW5kaWNhdGVzIHRoYXQgbm8gZmlsZSBmcmFnbWVudGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoaXMgdmFsdWUKKyAgICogaW5kaWNhdGVzIHRoZSBYTUwgZ2VuZXJhdG9yIHRvIHdyaXRlIGFsbCB0aGUgcmVzdWx0cyBpbiBvbmUgYmlnIGZpbGUuIE5vdAorICAgKiByZWNvbW1lbmRlZCBmb3IgbGFyZ2UgdGVzdCBzdWl0ZXMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRl9MRVZFTF9OT05FID0gMTsKKyAgLyoqCisgICAqIFdpbGwgY2F1c2UgdGhlIFhNTCBnZW5lcmF0b3IgdG8gY3JlYXRlIHNlcGFyYXRlIGZpbGVzIGZvciBlYWNoIG9mIHRoZQorICAgKiBzdWl0ZXMuIEEgc2VwYXJhdGUgZGlyZWN0b3J5IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoIHN1aXRlIGhhdmluZyB0aGUKKyAgICogbmFtZSBvZiB0aGUgc3VpdGUgYW5kIGNvbnRhaW5pbmcgYSA8Y29kZT5zdWl0ZS54bWw8L2NvZGU+IGZpbGUgdGhhdCB3aWxsIGJlCisgICAqIHJlZmVyZW5jZWQgaW4gdGhlIG1haW4gZmlsZSB3aXRoIGFuIDxjb2RlPnVybDwvY29kZT4gYXR0cmlidXRlCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRl9MRVZFTF9TVUlURSA9IDI7CisgIC8qKgorICAgKiBJdCBiZWhhdmVzIGxpa2UgPGNvZGU+RkZfTEVWRUxfU1VJVEU8L2NvZGU+LCBleGNlcHQgdGhhdCBpdCB3aWxsIGFsc28KKyAgICogY3JlYXRlIGEgZmlsZSBmb3IgZWFjaCA8Y29kZT5JU3VpdGVSZXN1bHQ8L2NvZGU+CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRl9MRVZFTF9TVUlURV9SRVNVTFQgPSAzOworCisgIC8qKgorICAgKiBObyBzdGFja3RyYWNlIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgb3V0cHV0IGZpbGUKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUNLVFJBQ0VfTk9ORSA9IDA7CisgIC8qKgorICAgKiBXcml0ZSBvbmx5IGEgc2hvcnQgdmVyc2lvbiBvZiB0aGUgc3RhY2t0cmFjZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0tUUkFDRV9TSE9SVCA9IDE7CisgIC8qKgorICAgKiBXcml0ZSBvbmx5IHRoZSBmdWxsIHZlcnNpb24gb2YgdGhlIHN0YWNrdHJhY2UKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUNLVFJBQ0VfRlVMTCA9IDI7CisgIC8qKgorICAgKiBXcml0ZSBib3RoIHR5cGVzIG9mIHN0YWNrdHJhY2UKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUNLVFJBQ0VfQk9USCA9IDM7CisKKyAgLy8gbm90ZTogV2UncmUgaGFyZGNvZGluZyB0aGUgJ1onIGJlY2F1c2UgSmF2YSBkb2Vzbid0IHN1cHBvcnQgYWxsIHRoZQorICAvLyBpbnRyaWNhY2llcyBvZiBJU08tODYwMS4KKyAgc3RhdGljIGZpbmFsIFN0cmluZyBGTVRfREVGQVVMVCA9ICJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MnWiciOworCisgIC8qKgorICAgKiBJbmRpY2F0ZXMgdGhlIHdheSB0aGF0IHRoZSBmaWxlIGZyYWdtZW50YXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gU2V0IHRoaXMKKyAgICogcHJvcGVydHkgdG8gb25lIG9mIHRoZSBGRl9MRVZFTF8qIHZhbHVlcyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IHN0cnVjdHVyZQorICAgKi8KKyAgcHJpdmF0ZSBpbnQgZmlsZUZyYWdtZW50YXRpb25MZXZlbCA9IEZGX0xFVkVMX05PTkU7CisKKyAgLyoqCisgICAqIFN0YWNrIHRyYWNlIG91dHB1dCBtZXRob2QgZm9yIHRoZSBmYWlsZWQgdGVzdHMgdXNpbmcgb25lIG9mIHRoZQorICAgKiBTVEFDS1RSQUNFXyogY29uc3RhbnRzLgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgc3RhY2tUcmFjZU91dHB1dE1ldGhvZCA9IFNUQUNLVFJBQ0VfRlVMTDsKKworICAvKioKKyAgICogVGhlIHJvb3Qgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSB0aGUgWE1McyB3aWxsIGJlIHdyaXR0ZW4uIFRoaXMgd2lsbCBkZWZhdWx0CisgICAqIGZvciBub3cgdG8gdGhlIGRlZmF1bHQgVGVzdE5HIG91dHB1dCBkaXJlY3RvcnkKKyAgICovCisgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKKworICAvKioKKyAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIDxjb2RlPmdyb3VwczwvY29kZT4gYXR0cmlidXRlIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yCisgICAqIGEgPGNvZGU+dGVzdC1tZXRob2Q8L2NvZGU+IGVsZW1lbnQuIERlZmF1bHRzIHRvIGZhbHNlIGR1ZSB0byB0aGUgZmFjdCB0aGF0CisgICAqIHRoaXMgbWlnaHQgYmUgY29uc2lkZXJlZCByZWR1bmRhbnQgYmVjYXVzZSBvZiB0aGUgZ3JvdXAgZ2VuZXJhdGlvbiBpbiB0aGUKKyAgICogc3VpdGUgZmlsZS4KKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUdyb3Vwc0F0dHJpYnV0ZSA9IGZhbHNlOworCisgIC8qKgorICAgKiBXaGVuIDxjb2RlPnRydWU8L2NvZGU+IGl0IHdpbGwgZ2VuZXJhdGUgdGhlICZsdDtjbGFzcyZsdDsgZWxlbWVudCB3aXRoIGEKKyAgICogPGNvZGU+bmFtZTwvY29kZT4gYW5kIGEgPGNvZGU+cGFja2FnZTwvY29kZT4gYXR0cmlidXRlLiBPdGhlcndpc2UsIHRoZQorICAgKiBmdWxseSBxdWFsaWZpZWQgbmFtZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gc3BsaXRDbGFzc0FuZFBhY2thZ2VOYW1lcyA9IGZhbHNlOworCisgIC8qKgorICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgPGNvZGU+ZGVwZW5kcy1vbi1tZXRob2RzPC9jb2RlPiBhdHRyaWJ1dGUgc2hvdWxkIGJlCisgICAqIGdlbmVyYXRlZCBmb3IgYSA8Y29kZT50ZXN0LW1ldGhvZDwvY29kZT4gZWxlbWVudAorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRGVwZW5kc09uTWV0aG9kcyA9IHRydWU7CisKKyAgLyoqCisgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSA8Y29kZT5kZXBlbmRzLW9uLWdyb3VwczwvY29kZT4gYXR0cmlidXRlIHNob3VsZCBiZQorICAgKiBnZW5lcmF0ZWQgZm9yIGEgPGNvZGU+dGVzdC1tZXRob2Q8L2NvZGU+IGVsZW1lbnQKKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURlcGVuZHNPbkdyb3VwcyA9IHRydWU7CisKKyAgLyoqCisgICAqIEluZGljYXRlcyB3aGV0aGVyIHtAbGluayBJVGVzdFJlc3VsdH0gYXR0cmlidXRlcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvcgorICAgKiBlYWNoIDxjb2RlPnRlc3QtbWV0aG9kPC9jb2RlPiBlbGVtZW50CisgICAqLworICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcyA9IGZhbHNlOworCisgIC8qKgorICAgKiBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgdGltZXN0YW1wcworICAgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgdGltZXN0YW1wRm9ybWF0ID0gRk1UX0RFRkFVTFQ7CisKKyAgcHVibGljIGludCBnZXRGaWxlRnJhZ21lbnRhdGlvbkxldmVsKCkgeworICAgIHJldHVybiBmaWxlRnJhZ21lbnRhdGlvbkxldmVsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmlsZUZyYWdtZW50YXRpb25MZXZlbChpbnQgZmlsZUZyYWdtZW50YXRpb25MZXZlbCkgeworICAgIHRoaXMuZmlsZUZyYWdtZW50YXRpb25MZXZlbCA9IGZpbGVGcmFnbWVudGF0aW9uTGV2ZWw7CisgIH0KKworICBwdWJsaWMgaW50IGdldFN0YWNrVHJhY2VPdXRwdXRNZXRob2QoKSB7CisgICAgcmV0dXJuIHN0YWNrVHJhY2VPdXRwdXRNZXRob2Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTdGFja1RyYWNlT3V0cHV0TWV0aG9kKGludCBzdGFja1RyYWNlT3V0cHV0TWV0aG9kKSB7CisgICAgdGhpcy5zdGFja1RyYWNlT3V0cHV0TWV0aG9kID0gc3RhY2tUcmFjZU91dHB1dE1ldGhvZDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgeworICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUdyb3Vwc0F0dHJpYnV0ZSgpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVHcm91cHNBdHRyaWJ1dGU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUdyb3Vwc0F0dHJpYnV0ZShib29sZWFuIGdlbmVyYXRlR3JvdXBzQXR0cmlidXRlKSB7CisgICAgdGhpcy5nZW5lcmF0ZUdyb3Vwc0F0dHJpYnV0ZSA9IGdlbmVyYXRlR3JvdXBzQXR0cmlidXRlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNTcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzKCkgeworICAgIHJldHVybiBzcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3BsaXRDbGFzc0FuZFBhY2thZ2VOYW1lcyhib29sZWFuIHNwbGl0Q2xhc3NBbmRQYWNrYWdlTmFtZXMpIHsKKyAgICB0aGlzLnNwbGl0Q2xhc3NBbmRQYWNrYWdlTmFtZXMgPSBzcGxpdENsYXNzQW5kUGFja2FnZU5hbWVzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXBGb3JtYXQoKSB7CisgICAgcmV0dXJuIHRpbWVzdGFtcEZvcm1hdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcEZvcm1hdChTdHJpbmcgdGltZXN0YW1wRm9ybWF0KSB7CisgICAgdGhpcy50aW1lc3RhbXBGb3JtYXQgPSB0aW1lc3RhbXBGb3JtYXQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRGVwZW5kc09uTWV0aG9kcygpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVEZXBlbmRzT25NZXRob2RzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEZXBlbmRzT25NZXRob2RzKGJvb2xlYW4gZ2VuZXJhdGVEZXBlbmRzT25NZXRob2RzKSB7CisgICAgdGhpcy5nZW5lcmF0ZURlcGVuZHNPbk1ldGhvZHMgPSBnZW5lcmF0ZURlcGVuZHNPbk1ldGhvZHM7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRGVwZW5kc09uR3JvdXBzKCkgeworICAgIHJldHVybiBnZW5lcmF0ZURlcGVuZHNPbkdyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRGVwZW5kc09uR3JvdXBzKGJvb2xlYW4gZ2VuZXJhdGVEZXBlbmRzT25Hcm91cHMpIHsKKyAgICB0aGlzLmdlbmVyYXRlRGVwZW5kc09uR3JvdXBzID0gZ2VuZXJhdGVEZXBlbmRzT25Hcm91cHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVRlc3RSZXN1bHRBdHRyaWJ1dGVzKGJvb2xlYW4gZ2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcykgeworICAgIHRoaXMuZ2VuZXJhdGVUZXN0UmVzdWx0QXR0cmlidXRlcyA9IGdlbmVyYXRlVGVzdFJlc3VsdEF0dHJpYnV0ZXM7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlVGVzdFJlc3VsdEF0dHJpYnV0ZXMoKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlVGVzdFJlc3VsdEF0dHJpYnV0ZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MU3RyaW5nQnVmZmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1hNTFN0cmluZ0J1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlMmIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL1hNTFN0cmluZ0J1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMzg2IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5OdWxsYWJsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYW4gWE1MIHRleHQgZG9jdW1lbnQgYnkgcHVzaGluZworICogYW5kIHBvcHBpbmcgdGFncyBmcm9tIGEgc3RhY2sgbWFpbnRhaW5lZCBpbnRlcm5hbGx5LgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4gSnVsIDIxLCAyMDAzCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJpbmdCdWZmZXIgeworICAvKiogRW5kIG9mIGxpbmUsIHZhbHVlIG9mICdsaW5lLnNlcGFyYXRvcicgc3lzdGVtIHByb3BlcnR5IG9yICdcbicgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKKworICAvKiogVGFiIHNwYWNlIGluZGVudCBmb3IgWE1MIGRvY3VtZW50ICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOREVOVF9JTkNSRU1FTlQgPSAiICAiOworCisgIC8qKiBUaGUgYnVmZmVyIHRvIGhvbGQgdGhlIHhtbCBkb2N1bWVudCAqLworICBwcml2YXRlIElCdWZmZXIgbV9idWZmZXI7CisKKyAgLyoqIFRoZSBzdGFjayBvZiB0YWdzIHRvIG1ha2Ugc3VyZSBYTUwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQuICovCisgIHByaXZhdGUgZmluYWwgU3RhY2s8VGFnPiBtX3RhZ1N0YWNrID0gbmV3IFN0YWNrPD4oKTsKKworICAvKiogQSBzdHJpbmcgb2Ygc3BhY2UgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4gKi8KKyAgcHJpdmF0ZSBTdHJpbmcgbV9jdXJyZW50SW5kZW50ID0gIiI7CisKKyAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcigpIHsKKyAgICBpbml0KEJ1ZmZlci5jcmVhdGUoKSwgIiIsICIxLjAiLCAiVVRGLTgiKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gc3RhcnQgQSBzdHJpbmcgb2Ygc3BhY2VzIGluZGljYXRpbmcgdGhlIGluZGVudGF0aW9uIGF0IHdoaWNoCisgICAqIHRvIHN0YXJ0IHRoZSBnZW5lcmF0aW9uLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgbm90IGluc2VydCBhbiA8P3htbAorICAgKiBwcm9sb2d1ZS4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoU3RyaW5nIHN0YXJ0KSB7CisgICAgaW5pdChCdWZmZXIuY3JlYXRlKCksIHN0YXJ0KTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBTdHJpbmdCdWZmZXIgdG8gdXNlIGludGVybmFsbHkgdG8gcmVwcmVzZW50IHRoZQorICAgKiBkb2N1bWVudC4KKyAgICogQHBhcmFtIHN0YXJ0IEEgc3RyaW5nIG9mIHNwYWNlcyBpbmRpY2F0aW5nIHRoZSBpbmRlbnRhdGlvbiBhdCB3aGljaAorICAgKiB0byBzdGFydCB0aGUgZ2VuZXJhdGlvbi4KKyAgICovCisgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBzdGFydCkgeworICAgIGluaXQoYnVmZmVyLCBzdGFydCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0YXJ0KSB7CisgICAgaW5pdChidWZmZXIsIHN0YXJ0LCBudWxsLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAqCisgICogQHBhcmFtIHN0YXJ0IEEgc3RyaW5nIG9mIHNwYWNlcyBpbmRpY2F0aW5nIHRoZSBpbmRlbnRhdGlvbiBhdCB3aGljaAorICAqIHRvIHN0YXJ0IHRoZSBnZW5lcmF0aW9uLgorICAqLworICBwcml2YXRlIHZvaWQgaW5pdChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0YXJ0LCBATnVsbGFibGUgU3RyaW5nIHZlcnNpb24sIEBOdWxsYWJsZSBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICBtX2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtX2N1cnJlbnRJbmRlbnQgPSBzdGFydDsKKyAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7CisgICAgICBzZXRYbWxEZXRhaWxzKHZlcnNpb24sIGVuY29kaW5nKTsKKyAgICB9CisgIH0KKworIC8qKgorICAgKiBTZXQgdGhlIHhtbCB2ZXJzaW9uIGFuZCBlbmNvZGluZyBmb3IgdGhpcyBkb2N1bWVudC4KKyAgICoKKyAgICogQHBhcmFtIHYgdGhlIFhNTCB2ZXJzaW9uCisgICAqIEBwYXJhbSBlbmMgdGhlIFhNTCBlbmNvZGluZworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0WG1sRGV0YWlscyhTdHJpbmcgdiwgU3RyaW5nIGVuYykgeworICAgIGlmIChtX2J1ZmZlci50b1N0cmluZygpLmxlbmd0aCgpICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJ1ZmZlciBzaG91bGQgYmUgZW1wdHk6ICciICsgbV9idWZmZXIudG9TdHJpbmcoKSArICInIik7CisgICAgfQorICAgIG1fYnVmZmVyLmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIiIgKyB2ICsgIlwiIGVuY29kaW5nPVwiIiArIGVuYyArICJcIj8+IikuYXBwZW5kKEVPTCk7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBkb2N0eXBlIGZvciB0aGlzIGRvY3VtZW50LgorICAgKgorICAgKiBAcGFyYW0gZG9jVHlwZSBUaGUgRE9DVFlQRSBzdHJpbmcsIHdpdGhvdXQgdGhlICImbHQ7IURPQ1RZUEUgIiAiJmd0OyIKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERvY1R5cGUoU3RyaW5nIGRvY1R5cGUpIHsKKyAgICBtX2J1ZmZlci5hcHBlbmQoIjwhRE9DVFlQRSAiICsgZG9jVHlwZSArICI+IiArIEVPTCk7CisgIH0KKworICAvKioKKyAgICogUHVzaCBhIG5ldyB0YWcuICBJdHMgdmFsdWUgaXMgc3RvcmVkIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIHBhcmFtZXRlcgorICAgKiBwYXNzZWQgdG8gcG9wKCkuCisgICAqCisgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcuCisgICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSB0byB1c2UgKGNhbiBiZSBudWxsIG9yIGFuIGVtcHR5IHN0cmluZykuCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgUHJvcGVydGllcyBmaWxlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlcyAob3IgbnVsbCkKKyAgICovCisgIHB1YmxpYyB2b2lkIHB1c2goU3RyaW5nIHRhZ05hbWUsIEBOdWxsYWJsZSBTdHJpbmcgc2NoZW1hLCBATnVsbGFibGUgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgWE1MVXRpbHMueG1sT3BlbihtX2J1ZmZlciwgbV9jdXJyZW50SW5kZW50LCB0YWdOYW1lICsgc2NoZW1hLCBhdHRyaWJ1dGVzKTsKKyAgICBtX3RhZ1N0YWNrLnB1c2gobmV3IFRhZyhtX2N1cnJlbnRJbmRlbnQsIHRhZ05hbWUsIGF0dHJpYnV0ZXMpKTsKKyAgICBtX2N1cnJlbnRJbmRlbnQgKz0gREVGQVVMVF9JTkRFTlRfSU5DUkVNRU5UOworICB9CisKKyAgLyoqCisgICAqIFB1c2ggYSBuZXcgdGFnLiAgSXRzIHZhbHVlIGlzIHN0b3JlZCBhbmQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBwYXJhbWV0ZXIKKyAgICogcGFzc2VkIHRvIHBvcCgpLgorICAgKgorICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnLgorICAgKiBAcGFyYW0gc2NoZW1hIFRoZSBzY2hlbWEgdG8gdXNlIChjYW4gYmUgbnVsbCBvciBhbiBlbXB0eSBzdHJpbmcpLgorICAgKi8KKyAgcHVibGljIHZvaWQgcHVzaChTdHJpbmcgdGFnTmFtZSwgQE51bGxhYmxlIFN0cmluZyBzY2hlbWEpIHsKKyAgICBwdXNoKHRhZ05hbWUsIHNjaGVtYSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogUHVzaCBhIG5ldyB0YWcuICBJdHMgdmFsdWUgaXMgc3RvcmVkIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIHBhcmFtZXRlcgorICAgKiBwYXNzZWQgdG8gcG9wKCkuCisgICAqCisgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcuCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgUHJvcGVydGllcyBmaWxlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlcyAob3IgbnVsbCkKKyAgICovCisgIHB1YmxpYyB2b2lkIHB1c2goU3RyaW5nIHRhZ05hbWUsIEBOdWxsYWJsZSBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMpIHsKKyAgICBwdXNoKHRhZ05hbWUsICIiLCBhdHRyaWJ1dGVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1c2goU3RyaW5nIHRhZ05hbWUsIFN0cmluZy4uLiBhdHRyaWJ1dGVzKSB7CisgICAgcHVzaCh0YWdOYW1lLCBjcmVhdGVQcm9wZXJ0aWVzKGF0dHJpYnV0ZXMpKTsKKyAgfQorCisgIHByaXZhdGUgUHJvcGVydGllcyBjcmVhdGVQcm9wZXJ0aWVzKFN0cmluZ1tdIGF0dHJpYnV0ZXMpIHsKKyAgICBQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoICUgMiAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudHMgJ2F0dHJpYnV0ZXMnIGxlbmd0aCBtdXN0IGJlIGV2ZW4uIEFjdHVhbDogIiArIGF0dHJpYnV0ZXMubGVuZ3RoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICByZXN1bHQucHV0KGF0dHJpYnV0ZXNbaV0sIGF0dHJpYnV0ZXNbaSArIDFdKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBQdXNoIGEgbmV3IHRhZy4gIEl0cyB2YWx1ZSBpcyBzdG9yZWQgYW5kIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgcGFyYW1ldGVyCisgICAqIHBhc3NlZCB0byBwb3AoKS4KKyAgICoKKyAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHB1c2goU3RyaW5nIHRhZ05hbWUpIHsKKyAgICBwdXNoKHRhZ05hbWUsICIiKTsKKyAgfQorCisgIC8qKgorICAgKiBQb3AgdGhlIGxhc3QgcHVzaGVkIGVsZW1lbnQgd2l0aG91dCB2ZXJpZnlpbmcgaXQgaWYgbWF0Y2hlcyB0aGUgcHJldmlvdXNseQorICAgKiBwdXNoZWQgdGFnLgorICAgKi8KKyAgcHVibGljIHZvaWQgcG9wKCkgeworICAgIHBvcChudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBQb3AgdGhlIGxhc3QgcHVzaGVkIGVsZW1lbnQgYW5kIHRocm93cyBhbiBBc3NlcnRpb25FcnJvciBpZiBpdCBkb2Vzbid0CisgICAqIG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHRhZyB0aGF0IHdhcyBwdXNoZWQgZWFybGllci4KKyAgICoKKyAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZyB0aGlzIHBvcCgpIGlzIHN1cHBvc2VkIHRvIG1hdGNoLgorICAgKi8KKyAgcHVibGljIHZvaWQgcG9wKFN0cmluZyB0YWdOYW1lKSB7CisgICAgbV9jdXJyZW50SW5kZW50ID0gbV9jdXJyZW50SW5kZW50LnN1YnN0cmluZyhERUZBVUxUX0lOREVOVF9JTkNSRU1FTlQubGVuZ3RoKCkpOworICAgIFRhZyB0ID0gbV90YWdTdGFjay5wb3AoKTsKKyAgICBpZiAobnVsbCAhPSB0YWdOYW1lKSB7CisgICAgICBpZiAoIXRhZ05hbWUuZXF1YWxzKHQudGFnTmFtZSkpIHsKKyAgICAgICAgLy8gVE9ETyBJcyBpdCBub3JtYWwgdG8gdGhyb3cgYW4gRXJyb3IgaGVyZT8KKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIlBvcHBpbmcgdGhlIHdyb25nIHRhZzogIiArIHQudGFnTmFtZSArICIgYnV0IGV4cGVjdGVkICIgKyB0YWdOYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgWE1MVXRpbHMueG1sQ2xvc2UobV9idWZmZXIsIG1fY3VycmVudEluZGVudCwgdC50YWdOYW1lLAorICAgICAgICBYTUxVdGlscy5leHRyYWN0Q29tbWVudCh0YWdOYW1lLCB0LnByb3BlcnRpZXMpKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGQgYSByZXF1aXJlZCBlbGVtZW50IHRvIHRoZSBjdXJyZW50IHRhZy4gIEFuIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnCisgICAqIHdpbGwgYmUgZ2VuZXJhdGVkIGV2ZW4gaWYgdmFsdWUgaXMgbnVsbC4KKyAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZworICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGlzIHRhZworICAgKi8KKyAgcHVibGljIHZvaWQgYWRkUmVxdWlyZWQoU3RyaW5nIHRhZ05hbWUsIEBOdWxsYWJsZSBTdHJpbmcgdmFsdWUpIHsKKyAgICBhZGRSZXF1aXJlZCh0YWdOYW1lLCB2YWx1ZSwgKFByb3BlcnRpZXMpIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhIHJlcXVpcmVkIGVsZW1lbnQgdG8gdGhlIGN1cnJlbnQgdGFnLiAgQW4gb3BlbmluZyBhbmQgY2xvc2luZyB0YWcKKyAgICogd2lsbCBiZSBnZW5lcmF0ZWQgZXZlbiBpZiB2YWx1ZSBpcyBudWxsLgorICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnCisgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZm9yIHRoaXMgdGFnCisgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgUHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgKG9yIG51bGwpCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRSZXF1aXJlZChTdHJpbmcgdGFnTmFtZSwgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSwgQE51bGxhYmxlIFByb3BlcnRpZXMgYXR0cmlidXRlcykgeworICAgIFhNTFV0aWxzLnhtbFJlcXVpcmVkKG1fYnVmZmVyLCBtX2N1cnJlbnRJbmRlbnQsIHRhZ05hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKTsKKyAgfQorICBwdWJsaWMgdm9pZCBhZGRSZXF1aXJlZChTdHJpbmcgdGFnTmFtZSwgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSwgU3RyaW5nLi4uIGF0dHJpYnV0ZXMpIHsKKyAgICBhZGRSZXF1aXJlZCh0YWdOYW1lLCB2YWx1ZSwgY3JlYXRlUHJvcGVydGllcyhhdHRyaWJ1dGVzKSk7CisgIH0KKworICAvKioKKyAgICogQWRkIGFuIG9wdGlvbmFsIFN0cmluZyBlbGVtZW50IHRvIHRoZSBjdXJyZW50IHRhZy4gIElmIHZhbHVlIGlzIG51bGwsIG5vdGhpbmcgaXMKKyAgICogYWRkZWQuCisgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcKKyAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhpcyB0YWcKKyAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQSBQcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyAob3IgbnVsbCkKKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZE9wdGlvbmFsKFN0cmluZyB0YWdOYW1lLCBATnVsbGFibGUgU3RyaW5nIHZhbHVlLCBATnVsbGFibGUgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgIFhNTFV0aWxzLnhtbE9wdGlvbmFsKG1fYnVmZmVyLCBtX2N1cnJlbnRJbmRlbnQsIHRhZ05hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRPcHRpb25hbChTdHJpbmcgdGFnTmFtZSwgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSwgU3RyaW5nLi4uIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgWE1MVXRpbHMueG1sT3B0aW9uYWwobV9idWZmZXIsIG1fY3VycmVudEluZGVudCwgdGFnTmFtZSwgdmFsdWUsIGNyZWF0ZVByb3BlcnRpZXMoYXR0cmlidXRlcykpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBZGQgYW4gb3B0aW9uYWwgU3RyaW5nIGVsZW1lbnQgdG8gdGhlIGN1cnJlbnQgdGFnLiAgSWYgdmFsdWUgaXMgbnVsbCwgbm90aGluZyBpcworICAgKiBhZGRlZC4KKyAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZworICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGlzIHRhZworICAgKi8KKyAgcHVibGljIHZvaWQgYWRkT3B0aW9uYWwoU3RyaW5nIHRhZ05hbWUsIEBOdWxsYWJsZSBTdHJpbmcgdmFsdWUpIHsKKyAgICBhZGRPcHRpb25hbCh0YWdOYW1lLCB2YWx1ZSwgKFByb3BlcnRpZXMpIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhbiBvcHRpb25hbCBCb29sZWFuIGVsZW1lbnQgdG8gdGhlIGN1cnJlbnQgdGFnLiAgSWYgdmFsdWUgaXMgbnVsbCwgbm90aGluZyBpcworICAgKiBhZGRlZC4KKyAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZworICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGlzIHRhZworICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBIFByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIChvciBudWxsKQorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkT3B0aW9uYWwoU3RyaW5nIHRhZ05hbWUsIEBOdWxsYWJsZSBCb29sZWFuIHZhbHVlLCBATnVsbGFibGUgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG51bGwgIT0gdmFsdWUpIHsKKyAgICAgIFhNTFV0aWxzLnhtbE9wdGlvbmFsKG1fYnVmZmVyLCBtX2N1cnJlbnRJbmRlbnQsIHRhZ05hbWUsIHZhbHVlLnRvU3RyaW5nKCksIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBZGQgYW4gb3B0aW9uYWwgQm9vbGVhbiBlbGVtZW50IHRvIHRoZSBjdXJyZW50IHRhZy4gIElmIHZhbHVlIGlzIG51bGwsIG5vdGhpbmcgaXMKKyAgICogYWRkZWQuCisgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcKKyAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhpcyB0YWcKKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZE9wdGlvbmFsKFN0cmluZyB0YWdOYW1lLCBATnVsbGFibGUgQm9vbGVhbiB2YWx1ZSkgeworICAgIGFkZE9wdGlvbmFsKHRhZ05hbWUsIHZhbHVlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGQgYW4gZW1wdHkgZWxlbWVudCB0YWcgKGUuZy4gPGZvby8+KQorICAgKgorICAgKiBAcGFyYW0gdGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnCisgICAqCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRFbXB0eUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHsKKyAgICBhZGRFbXB0eUVsZW1lbnQodGFnTmFtZSwgKFByb3BlcnRpZXMpIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhbiBlbXB0eSBlbGVtZW50IHRhZyAoZS5nLiA8Zm9vLz4pCisgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcKKyAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQSBQcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyAob3IgbnVsbCkKKyAgICovCisgIHB1YmxpYyB2b2lkIGFkZEVtcHR5RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgQE51bGxhYmxlIFByb3BlcnRpZXMgYXR0cmlidXRlcykgeworICAgIG1fYnVmZmVyLmFwcGVuZChtX2N1cnJlbnRJbmRlbnQpLmFwcGVuZCgiPCIpLmFwcGVuZCh0YWdOYW1lKTsKKyAgICBYTUxVdGlscy5hcHBlbmRBdHRyaWJ1dGVzKG1fYnVmZmVyLCBhdHRyaWJ1dGVzKTsKKyAgICBtX2J1ZmZlci5hcHBlbmQoIi8+IikuYXBwZW5kKEVPTCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRFbXB0eUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFN0cmluZy4uLiBhdHRyaWJ1dGVzKSB7CisgICAgYWRkRW1wdHlFbGVtZW50KHRhZ05hbWUsIGNyZWF0ZVByb3BlcnRpZXMoYXR0cmlidXRlcykpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkQ29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgIG1fYnVmZmVyLmFwcGVuZChtX2N1cnJlbnRJbmRlbnQpLmFwcGVuZCgiPCEtLSAiICsgY29tbWVudC5yZXBsYWNlQWxsKCJbLV17Mix9IiwgIi0iKSArICIgLS0+XG4iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFN0cmluZyhTdHJpbmcgcykgeworICAgIG1fYnVmZmVyLmFwcGVuZChzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbWE1MU3RyaW5nQnVmZmVyXSAiICsgcyk7CisgIH0KKworICAvKioKKyAgICogQWRkIGEgQ0RBVEEgdGFnLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkQ0RBVEEoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICBpZiAoY29udGVudCA9PSBudWxsKSB7CisgICAgICBjb250ZW50ID0gIm51bGwiOworICAgIH0KKyAgICBpZiAoY29udGVudC5jb250YWlucygiXV0+IikpIHsKKyAgICAgIFN0cmluZ1tdIHN1YlN0cmluZ3MgPSBjb250ZW50LnNwbGl0KCJdXT4iKTsKKyAgICAgIG1fYnVmZmVyLmFwcGVuZChtX2N1cnJlbnRJbmRlbnQpLmFwcGVuZCgiPCFbQ0RBVEFbIikuYXBwZW5kKHN1YlN0cmluZ3NbMF0pLmFwcGVuZCgiXV1dXT4iKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3ViU3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgbV9idWZmZXIuYXBwZW5kKCI8IVtDREFUQVs+IikuYXBwZW5kKHN1YlN0cmluZ3NbaV0pLmFwcGVuZCgiXV1dXT4iKTsKKyAgICAgIH0KKyAgICAgIG1fYnVmZmVyLmFwcGVuZCgiPCFbQ0RBVEFbPiIpLmFwcGVuZChzdWJTdHJpbmdzW3N1YlN0cmluZ3MubGVuZ3RoIC0gMV0pLmFwcGVuZCgiXV0+Iik7CisgICAgICBpZiAoY29udGVudC5lbmRzV2l0aCgiXV0+IikpIHsKKyAgICAgICAgbV9idWZmZXIuYXBwZW5kKCI8IVtDREFUQVtdXV1dPiIpLmFwcGVuZCgiPCFbQ0RBVEFbPl1dPiIpOworICAgICAgfQorICAgICAgbV9idWZmZXIuYXBwZW5kKEVPTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYnVmZmVyLmFwcGVuZChtX2N1cnJlbnRJbmRlbnQpLmFwcGVuZCgiPCFbQ0RBVEFbIikuYXBwZW5kKGNvbnRlbnQpLmFwcGVuZCgiXV0+IiArIEVPTCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4gVGhlIFN0cmluZ0J1ZmZlciB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnQuCisgICAqLworICBwdWJsaWMgSUJ1ZmZlciBnZXRTdHJpbmdCdWZmZXIoKSB7CisgICAgcmV0dXJuIG1fYnVmZmVyOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBJTlZBTElEX1hNTF9DSEFSUyA9CisgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlteXFx1MDAwOVxcdTAwMEFcXHUwMDBEXFx1MDAyMC1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZEXHVEODAwXHVEQzAwLVx1REJGRlx1REZGRl0iKTsKKworICAvKioKKyAgICogQHJldHVybiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBYTUwgZm9yIHRoaXMgWE1MU3RyaW5nQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1hNTCgpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9YTUxfQ0hBUlMubWF0Y2hlcihtX2J1ZmZlci50b1N0cmluZygpKS5yZXBsYWNlQWxsKCIiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKyAgICBJQnVmZmVyIHJlc3VsdCA9IEJ1ZmZlci5jcmVhdGUoKTsKKyAgICBYTUxTdHJpbmdCdWZmZXIgc2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKHJlc3VsdCwgIiIpOworCisgICAgc2IucHVzaCgiZmFtaWx5Iik7CisgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwLnNldFByb3BlcnR5KCJwcm9wMSIsICJ2YWx1ZTEiKTsKKyAgICBwLnNldFByb3BlcnR5KCJwcm9wMiIsICJ2YWx1ZTIiKTsKKyAgICBzYi5hZGRSZXF1aXJlZCgiY2VkcmljIiwgInRydWUiLCBwKTsKKyAgICBzYi5hZGRSZXF1aXJlZCgiYWxvaXMiLCAidHJ1ZSIpOworICAgIHNiLmFkZE9wdGlvbmFsKCJhbm5lLW1hcmllIiwgKFN0cmluZykgbnVsbCk7CisgICAgc2IucG9wKCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LnRvU3RyaW5nKCkpOworCisgICAgYXNzZXJ0ICgiPGZhbWlseT4iICsgRU9MICsgIjxjZWRyaWM+dHJ1ZTwvY2VkcmljPiIgKyBFT0wgKyAiPGFsb2lzPnRydWU8L2Fsb2lzPiIgKyBFT0wgKyAiPC9mYW1pbHk+IiAgKyBFT0wpCisgICAgICAuZXF1YWxzKHJlc3VsdC50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEluZGVudCgpIHsKKyAgICByZXR1cm4gbV9jdXJyZW50SW5kZW50OworICB9CisKKyAgcHVibGljIHZvaWQgdG9Xcml0ZXIoV3JpdGVyIGZ3KSB7CisgICAgbV9idWZmZXIudG9Xcml0ZXIoZncpOworICB9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFRhZyB7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdGFnTmFtZTsKKyAgcHVibGljIGZpbmFsIFN0cmluZyBpbmRlbnQ7CisgIHB1YmxpYyBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKKyAgcHVibGljIFRhZyhTdHJpbmcgaW5kLCBTdHJpbmcgbiwgUHJvcGVydGllcyBwKSB7CisgICAgdGFnTmFtZSA9IG47CisgICAgaW5kZW50ID0gaW5kOworICAgIHByb3BlcnRpZXMgPSBwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIHRhZ05hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MU3VpdGVSZXN1bHRXcml0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MU3VpdGVSZXN1bHRXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOGViZWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxTdWl0ZVJlc3VsdFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzQxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JUmVzdWx0TWFwOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ29uc3RydWN0b3JPck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcudXRpbC5TdHJpbmdzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBVdGlsaXR5IHdyaXRpbmcgYW4gSVN1aXRlUmVzdWx0IHRvIGFuIFhNTFN0cmluZ0J1ZmZlci4gRGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBpbiB0aGUgPGNvZGU+Y29uZmlnPC9jb2RlPiBwcm9wZXJ0eQorICogaXQgbWlnaHQgZ2VuZXJhdGUgYW4gYWRkaXRpb25hbCBYTUwgZmlsZSB3aXRoIHRoZSBhY3R1YWwgY29udGVudCBhbmQgb25seSByZWZlcmVuY2UgdGhlIGZpbGUgd2l0aCBhbiA8Y29kZT51cmw8L2NvZGU+CisgKiBhdHRyaWJ1dGUgaW4gdGhlIHBhc3NlZCBYTUxTdHJpbmdCdWZmZXIuCisgKgorICogQGF1dGhvciBDb3NtaW4gTWFyZ2luZWFuLCBNYXIgMTYsIDIwMDcKKyAqLworCitwdWJsaWMgY2xhc3MgWE1MU3VpdGVSZXN1bHRXcml0ZXIgeworCisgIHByaXZhdGUgWE1MUmVwb3J0ZXJDb25maWcgY29uZmlnOworCisgIHB1YmxpYyBYTUxTdWl0ZVJlc3VsdFdyaXRlcihYTUxSZXBvcnRlckNvbmZpZyBjb25maWcpIHsKKyAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBJU3VpdGVSZXN1bHQgaW4gdGhlIGdpdmVuIFhNTFN0cmluZ0J1ZmZlci4gUGxlYXNlIGNvbnNpZGVyIHRoYXQgZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBpbgorICAgKiB0aGUgPGNvZGU+Y29uZmlnPC9jb2RlPiBwcm9wZXJ0eSBpdCBtaWdodCBnZW5lcmF0ZSBhbiBhZGRpdGlvbmFsIFhNTCBmaWxlIHdpdGggdGhlIGFjdHVhbCBjb250ZW50IGFuZCBvbmx5CisgICAqIHJlZmVyZW5jZSB0aGUgZmlsZSB3aXRoIGFuIDxjb2RlPnVybDwvY29kZT4gYXR0cmlidXRlIGluIHRoZSBwYXNzZWQgWE1MU3RyaW5nQnVmZmVyLgorICAgKgorICAgKiBAcGFyYW0geG1sQnVmZmVyICAgVGhlIFhNTCBidWZmZXIgd2hlcmUgdG8gd3JpdGUgb3IgcmVmZXJlbmNlIHRoZSBzdWl0ZSByZXN1bHQKKyAgICogQHBhcmFtIHN1aXRlUmVzdWx0IFRoZSA8Y29kZT5JU3VpdGVSZXN1bHQ8L2NvZGU+IHRvIHNlcmlhbGl6ZQorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTdWl0ZVJlc3VsdChYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBJU3VpdGVSZXN1bHQgc3VpdGVSZXN1bHQpIHsKKyAgICBpZiAoWE1MUmVwb3J0ZXJDb25maWcuRkZfTEVWRUxfU1VJVEVfUkVTVUxUICE9IGNvbmZpZy5nZXRGaWxlRnJhZ21lbnRhdGlvbkxldmVsKCkpIHsKKyAgICAgIHdyaXRlQWxsVG9CdWZmZXIoeG1sQnVmZmVyLCBzdWl0ZVJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBwYXJlbnREaXIgPQorICAgICAgICAgICAgICBjb25maWcuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBzdWl0ZVJlc3VsdC5nZXRUZXN0Q29udGV4dCgpLmdldFN1aXRlKCkuZ2V0TmFtZSgpOworICAgICAgRmlsZSBmaWxlID0gcmVmZXJlbmNlU3VpdGVSZXN1bHQoeG1sQnVmZmVyLCBwYXJlbnREaXIsIHN1aXRlUmVzdWx0KTsKKyAgICAgIFhNTFN0cmluZ0J1ZmZlciBzdWl0ZVhtbEJ1ZmZlciA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoKTsKKyAgICAgIHdyaXRlQWxsVG9CdWZmZXIoc3VpdGVYbWxCdWZmZXIsIHN1aXRlUmVzdWx0KTsKKyAgICAgIFV0aWxzLndyaXRlVXRmOEZpbGUoZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRQYXJlbnQoKSwgZmlsZS5nZXROYW1lKCksIHN1aXRlWG1sQnVmZmVyLnRvWE1MKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUFsbFRvQnVmZmVyKFhNTFN0cmluZ0J1ZmZlciB4bWxCdWZmZXIsIElTdWl0ZVJlc3VsdCBzdWl0ZVJlc3VsdCkgeworICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19URVNULCBnZXRTdWl0ZVJlc3VsdEF0dHJpYnV0ZXMoc3VpdGVSZXN1bHQpKTsKKyAgICBTZXQ8SVRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgSVRlc3RDb250ZXh0IHRlc3RDb250ZXh0ID0gc3VpdGVSZXN1bHQuZ2V0VGVzdENvbnRleHQoKTsKKyAgICBhZGRBbGxUZXN0UmVzdWx0cyh0ZXN0UmVzdWx0cywgdGVzdENvbnRleHQuZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgYWRkQWxsVGVzdFJlc3VsdHModGVzdFJlc3VsdHMsIHRlc3RDb250ZXh0LmdldEZhaWxlZFRlc3RzKCkpOworICAgIGFkZEFsbFRlc3RSZXN1bHRzKHRlc3RSZXN1bHRzLCB0ZXN0Q29udGV4dC5nZXRTa2lwcGVkVGVzdHMoKSk7CisgICAgYWRkQWxsVGVzdFJlc3VsdHModGVzdFJlc3VsdHMsIHRlc3RDb250ZXh0LmdldFBhc3NlZENvbmZpZ3VyYXRpb25zKCkpOworICAgIGFkZEFsbFRlc3RSZXN1bHRzKHRlc3RSZXN1bHRzLCB0ZXN0Q29udGV4dC5nZXRTa2lwcGVkQ29uZmlndXJhdGlvbnMoKSk7CisgICAgYWRkQWxsVGVzdFJlc3VsdHModGVzdFJlc3VsdHMsIHRlc3RDb250ZXh0LmdldEZhaWxlZENvbmZpZ3VyYXRpb25zKCkpOworICAgIGFkZEFsbFRlc3RSZXN1bHRzKHRlc3RSZXN1bHRzLCB0ZXN0Q29udGV4dC5nZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkpOworICAgIGFkZFRlc3RSZXN1bHRzKHhtbEJ1ZmZlciwgdGVzdFJlc3VsdHMpOworICAgIHhtbEJ1ZmZlci5wb3AoKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcml2YXRlIHZvaWQgYWRkQWxsVGVzdFJlc3VsdHMoU2V0PElUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cywgSVJlc3VsdE1hcCByZXN1bHRNYXApIHsKKyAgICBpZiAocmVzdWx0TWFwICE9IG51bGwpIHsKKyAgICAgIC8vIFNvcnQgdGhlIHJlc3VsdHMgY2hyb25vbG9naWNhbGx5IGJlZm9yZSBhZGRpbmcgdGhlbQorICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gYWxsUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgYWxsUmVzdWx0cy5hZGRBbGwocmVzdWx0TWFwLmdldEFsbFJlc3VsdHMoKSk7CisKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQobmV3IEFycmF5TGlzdChhbGxSZXN1bHRzKSwgbmV3IENvbXBhcmF0b3I8SVRlc3RSZXN1bHQ+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKElUZXN0UmVzdWx0IG8xLCBJVGVzdFJlc3VsdCBvMikgeworICAgICAgICAgIHJldHVybiAoaW50KSAobzEuZ2V0U3RhcnRNaWxsaXMoKSAtIG8yLmdldFN0YXJ0TWlsbGlzKCkpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgdGVzdFJlc3VsdHMuYWRkQWxsKGFsbFJlc3VsdHMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRmlsZSByZWZlcmVuY2VTdWl0ZVJlc3VsdChYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBTdHJpbmcgcGFyZW50RGlyLCBJU3VpdGVSZXN1bHQgc3VpdGVSZXN1bHQpIHsKKyAgICBQcm9wZXJ0aWVzIGF0dHJzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBTdHJpbmcgc3VpdGVSZXN1bHROYW1lID0gc3VpdGVSZXN1bHQuZ2V0VGVzdENvbnRleHQoKS5nZXROYW1lKCkgKyAiLnhtbCI7CisgICAgYXR0cnMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9VUkwsIHN1aXRlUmVzdWx0TmFtZSk7CisgICAgeG1sQnVmZmVyLmFkZEVtcHR5RWxlbWVudChYTUxSZXBvcnRlckNvbmZpZy5UQUdfVEVTVCwgYXR0cnMpOworICAgIHJldHVybiBuZXcgRmlsZShwYXJlbnREaXIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBzdWl0ZVJlc3VsdE5hbWUpOworICB9CisKKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFN1aXRlUmVzdWx0QXR0cmlidXRlcyhJU3VpdGVSZXN1bHQgc3VpdGVSZXN1bHQpIHsKKyAgICBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgIElUZXN0Q29udGV4dCB0YyA9IHN1aXRlUmVzdWx0LmdldFRlc3RDb250ZXh0KCk7CisgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUUsIHRjLmdldE5hbWUoKSk7CisgICAgWE1MUmVwb3J0ZXIuYWRkRHVyYXRpb25BdHRyaWJ1dGVzKGNvbmZpZywgYXR0cmlidXRlcywgdGMuZ2V0U3RhcnREYXRlKCksIHRjLmdldEVuZERhdGUoKSk7CisgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkVGVzdFJlc3VsdHMoWE1MU3RyaW5nQnVmZmVyIHhtbEJ1ZmZlciwgU2V0PElUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cykgeworICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiB0ZXN0c0dyb3VwZWRCeUNsYXNzID0gYnVpbGRUZXN0Q2xhc3NHcm91cHModGVzdFJlc3VsdHMpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxJVGVzdFJlc3VsdD4+IHJlc3VsdCA6IHRlc3RzR3JvdXBlZEJ5Q2xhc3MuZW50cnlTZXQoKSkgeworICAgICAgUHJvcGVydGllcyBhdHRyaWJ1dGVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZXN1bHQuZ2V0S2V5KCk7CisgICAgICBpZiAoY29uZmlnLmlzU3BsaXRDbGFzc0FuZFBhY2thZ2VOYW1lcygpKSB7CisgICAgICAgIGludCBkb3QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUUsCisgICAgICAgICAgICAgICAgZG90ID4gLTEgPyBjbGFzc05hbWUuc3Vic3RyaW5nKGRvdCArIDEsIGNsYXNzTmFtZS5sZW5ndGgoKSkgOiBjbGFzc05hbWUpOworICAgICAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfUEFDS0FHRSwgZG90ID4gLTEgPyBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGRvdCkgOiAiW2RlZmF1bHRdIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfTkFNRSwgY2xhc3NOYW1lKTsKKyAgICAgIH0KKworICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX0NMQVNTLCBhdHRyaWJ1dGVzKTsKKyAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHNvcnRlZFJlc3VsdHMgPSByZXN1bHQuZ2V0VmFsdWUoKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoIHNvcnRlZFJlc3VsdHMgKTsKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCA6IHNvcnRlZFJlc3VsdHMpIHsKKyAgICAgICAgYWRkVGVzdFJlc3VsdCh4bWxCdWZmZXIsIHRlc3RSZXN1bHQpOworICAgICAgfQorICAgICAgeG1sQnVmZmVyLnBvcCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxJVGVzdFJlc3VsdD4+IGJ1aWxkVGVzdENsYXNzR3JvdXBzKFNldDxJVGVzdFJlc3VsdD4gdGVzdFJlc3VsdHMpIHsKKyAgICBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gbWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChJVGVzdFJlc3VsdCByZXN1bHQgOiB0ZXN0UmVzdWx0cykgeworICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc3VsdC5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICBMaXN0PElUZXN0UmVzdWx0PiBsaXN0ID0gbWFwLmdldChjbGFzc05hbWUpOworICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIG1hcC5wdXQoY2xhc3NOYW1lLCBsaXN0KTsKKyAgICAgIH0KKyAgICAgIGxpc3QuYWRkKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiBtYXA7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkVGVzdFJlc3VsdChYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgUHJvcGVydGllcyBhdHRyaWJzID0gZ2V0VGVzdFJlc3VsdEF0dHJpYnV0ZXModGVzdFJlc3VsdCk7CisgICAgYXR0cmlicy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX1NUQVRVUywgZ2V0U3RhdHVzU3RyaW5nKHRlc3RSZXN1bHQuZ2V0U3RhdHVzKCkpKTsKKyAgICB4bWxCdWZmZXIucHVzaChYTUxSZXBvcnRlckNvbmZpZy5UQUdfVEVTVF9NRVRIT0QsIGF0dHJpYnMpOworICAgIGFkZFRlc3RNZXRob2RQYXJhbXMoeG1sQnVmZmVyLCB0ZXN0UmVzdWx0KTsKKyAgICBhZGRUZXN0UmVzdWx0RXhjZXB0aW9uKHhtbEJ1ZmZlciwgdGVzdFJlc3VsdCk7CisgICAgYWRkVGVzdFJlc3VsdE91dHB1dCh4bWxCdWZmZXIsIHRlc3RSZXN1bHQpOworICAgIGlmIChjb25maWcuaXNHZW5lcmF0ZVRlc3RSZXN1bHRBdHRyaWJ1dGVzKCkpIHsKKyAgICAgIGFkZFRlc3RSZXN1bHRBdHRyaWJ1dGVzKHhtbEJ1ZmZlciwgdGVzdFJlc3VsdCk7CisgICAgfQorICAgIHhtbEJ1ZmZlci5wb3AoKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFN0YXR1c1N0cmluZyhpbnQgdGVzdFJlc3VsdFN0YXR1cykgeworICAgIHN3aXRjaCAodGVzdFJlc3VsdFN0YXR1cykgeworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TVUNDRVNTOgorICAgICAgICByZXR1cm4gIlBBU1MiOworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5GQUlMVVJFOgorICAgICAgICByZXR1cm4gIkZBSUwiOworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TS0lQOgorICAgICAgICByZXR1cm4gIlNLSVAiOworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TVUNDRVNTX1BFUkNFTlRBR0VfRkFJTFVSRToKKyAgICAgICAgcmV0dXJuICJTVUNDRVNTX1BFUkNFTlRBR0VfRkFJTFVSRSI7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFRlc3RSZXN1bHRBdHRyaWJ1dGVzKElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgIGlmICghdGVzdFJlc3VsdC5nZXRNZXRob2QoKS5pc1Rlc3QoKSkgeworICAgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX0lTX0NPTkZJRywgInRydWUiKTsKKyAgICB9CisgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUUsIHRlc3RSZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICBTdHJpbmcgdGVzdEluc3RhbmNlTmFtZSA9IHRlc3RSZXN1bHQuZ2V0VGVzdE5hbWUoKTsKKyAgICBpZiAobnVsbCAhPSB0ZXN0SW5zdGFuY2VOYW1lKSB7CisgICAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfVEVTVF9JTlNUQU5DRV9OQU1FLCB0ZXN0SW5zdGFuY2VOYW1lKTsKKyAgICB9CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gdGVzdFJlc3VsdC5nZXRNZXRob2QoKS5nZXREZXNjcmlwdGlvbigpOworICAgIGlmICghVXRpbHMuaXNTdHJpbmdFbXB0eShkZXNjcmlwdGlvbikpIHsKKyAgICAgIGF0dHJpYnV0ZXMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9ERVNDLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX01FVEhPRF9TSUcsIHJlbW92ZUNsYXNzTmFtZSh0ZXN0UmVzdWx0LmdldE1ldGhvZCgpLnRvU3RyaW5nKCkpKTsKKworICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoY29uZmlnLmdldFRpbWVzdGFtcEZvcm1hdCgpKTsKKyAgICBTdHJpbmcgc3RhcnRUaW1lID0gZm9ybWF0LmZvcm1hdCh0ZXN0UmVzdWx0LmdldFN0YXJ0TWlsbGlzKCkpOworICAgIFN0cmluZyBlbmRUaW1lID0gZm9ybWF0LmZvcm1hdCh0ZXN0UmVzdWx0LmdldEVuZE1pbGxpcygpKTsKKyAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfU1RBUlRFRF9BVCwgc3RhcnRUaW1lKTsKKyAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfRklOSVNIRURfQVQsIGVuZFRpbWUpOworICAgIGxvbmcgZHVyYXRpb24gPSB0ZXN0UmVzdWx0LmdldEVuZE1pbGxpcygpIC0gdGVzdFJlc3VsdC5nZXRTdGFydE1pbGxpcygpOworICAgIFN0cmluZyBzdHJEdXJhdGlvbiA9IExvbmcudG9TdHJpbmcoZHVyYXRpb24pOworICAgIGF0dHJpYnV0ZXMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9EVVJBVElPTl9NUywgc3RyRHVyYXRpb24pOworCisgICAgaWYgKGNvbmZpZy5pc0dlbmVyYXRlR3JvdXBzQXR0cmlidXRlKCkpIHsKKyAgICAgIFN0cmluZyBncm91cE5hbWVzU3RyID0gVXRpbHMuYXJyYXlUb1N0cmluZyh0ZXN0UmVzdWx0LmdldE1ldGhvZCgpLmdldEdyb3VwcygpKTsKKyAgICAgIGlmICghVXRpbHMuaXNTdHJpbmdFbXB0eShncm91cE5hbWVzU3RyKSkgeworICAgICAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfR1JPVVBTLCBncm91cE5hbWVzU3RyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZmlnLmlzR2VuZXJhdGVEZXBlbmRzT25NZXRob2RzKCkpIHsKKyAgICAgIFN0cmluZyBkZXBlbmRzT25TdHIgPSBVdGlscy5hcnJheVRvU3RyaW5nKHRlc3RSZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kc0RlcGVuZGVkVXBvbigpKTsKKyAgICAgIGlmICghVXRpbHMuaXNTdHJpbmdFbXB0eShkZXBlbmRzT25TdHIpKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9ERVBFTkRTX09OX01FVEhPRFMsIGRlcGVuZHNPblN0cik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbmZpZy5pc0dlbmVyYXRlRGVwZW5kc09uR3JvdXBzKCkpIHsKKyAgICAgIFN0cmluZyBkZXBlbmRzT25TdHIgPSBVdGlscy5hcnJheVRvU3RyaW5nKHRlc3RSZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0R3JvdXBzRGVwZW5kZWRVcG9uKCkpOworICAgICAgaWYgKCFVdGlscy5pc1N0cmluZ0VtcHR5KGRlcGVuZHNPblN0cikpIHsKKyAgICAgICAgYXR0cmlidXRlcy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX0RFUEVORFNfT05fR1JPVVBTLCBkZXBlbmRzT25TdHIpOworICAgICAgfQorICAgIH0KKworICAgIENvbnN0cnVjdG9yT3JNZXRob2QgY20gPSB0ZXN0UmVzdWx0LmdldE1ldGhvZCgpLmdldENvbnN0cnVjdG9yT3JNZXRob2QoKTsKKyAgICBUZXN0IHRlc3RBbm5vdGF0aW9uOworICAgIGlmIChjbS5nZXRNZXRob2QoKSAhPSBudWxsKSB7CisgICAgICB0ZXN0QW5ub3RhdGlvbiA9IGNtLmdldE1ldGhvZCgpLmdldEFubm90YXRpb24oVGVzdC5jbGFzcyk7CisgICAgICBpZiAodGVzdEFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICBTdHJpbmcgZGF0YVByb3ZpZGVyID0gdGVzdEFubm90YXRpb24uZGF0YVByb3ZpZGVyKCk7CisgICAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGRhdGFQcm92aWRlcikpIHsKKyAgICAgICAgICBhdHRyaWJ1dGVzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfREFUQV9QUk9WSURFUiwgZGF0YVByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQ2xhc3NOYW1lKFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHsKKyAgICBpbnQgZmlyc3RQYXJhbnRoZXNpc1BvcyA9IG1ldGhvZFNpZ25hdHVyZS5pbmRleE9mKCIoIik7CisgICAgaW50IGRvdEFmZXJDbGFzc1BvcyA9IG1ldGhvZFNpZ25hdHVyZS5zdWJzdHJpbmcoMCwgZmlyc3RQYXJhbnRoZXNpc1BvcykubGFzdEluZGV4T2YoIi4iKTsKKyAgICByZXR1cm4gbWV0aG9kU2lnbmF0dXJlLnN1YnN0cmluZyhkb3RBZmVyQ2xhc3NQb3MgKyAxLCBtZXRob2RTaWduYXR1cmUubGVuZ3RoKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkVGVzdE1ldGhvZFBhcmFtcyhYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IHRlc3RSZXN1bHQuZ2V0UGFyYW1ldGVycygpOworICAgIGlmICgocGFyYW1ldGVycyAhPSBudWxsKSAmJiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSkgeworICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX1BBUkFNUyk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgYWRkUGFyYW1ldGVyKHhtbEJ1ZmZlciwgcGFyYW1ldGVyc1tpXSwgaSk7CisgICAgICB9CisgICAgICB4bWxCdWZmZXIucG9wKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZFBhcmFtZXRlcihYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBPYmplY3QgcGFyYW1ldGVyLCBpbnQgaSkgeworICAgIFByb3BlcnRpZXMgYXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgIGF0dHJzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfSU5ERVgsIFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICB4bWxCdWZmZXIucHVzaChYTUxSZXBvcnRlckNvbmZpZy5UQUdfUEFSQU0sIGF0dHJzKTsKKyAgICBpZiAocGFyYW1ldGVyID09IG51bGwpIHsKKyAgICAgIFByb3BlcnRpZXMgdmFsdWVBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICB2YWx1ZUF0dHJzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfSVNfTlVMTCwgInRydWUiKTsKKyAgICAgIHhtbEJ1ZmZlci5hZGRFbXB0eUVsZW1lbnQoWE1MUmVwb3J0ZXJDb25maWcuVEFHX1BBUkFNX1ZBTFVFLCB2YWx1ZUF0dHJzKTsKKyAgICB9IGVsc2UgeworICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX1BBUkFNX1ZBTFVFKTsKKyAgICAgIHhtbEJ1ZmZlci5hZGRDREFUQShwYXJhbWV0ZXIudG9TdHJpbmcoKSk7CisgICAgICB4bWxCdWZmZXIucG9wKCk7CisgICAgfQorICAgIHhtbEJ1ZmZlci5wb3AoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRUZXN0UmVzdWx0RXhjZXB0aW9uKFhNTFN0cmluZ0J1ZmZlciB4bWxCdWZmZXIsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBUaHJvd2FibGUgZXhjZXB0aW9uID0gdGVzdFJlc3VsdC5nZXRUaHJvd2FibGUoKTsKKyAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgIFByb3BlcnRpZXMgZXhjZXB0aW9uQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgZXhjZXB0aW9uQXR0cnMuc2V0UHJvcGVydHkoWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9DTEFTUywgZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19FWENFUFRJT04sIGV4Y2VwdGlvbkF0dHJzKTsKKworICAgICAgaWYgKCFVdGlscy5pc1N0cmluZ0VtcHR5KGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19NRVNTQUdFKTsKKyAgICAgICAgeG1sQnVmZmVyLmFkZENEQVRBKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICB4bWxCdWZmZXIucG9wKCk7CisgICAgICB9CisKKyAgICAgIFN0cmluZ1tdIHN0YWNrVHJhY2VzID0gVXRpbHMuc3RhY2tUcmFjZShleGNlcHRpb24sIGZhbHNlKTsKKyAgICAgIGlmICgoY29uZmlnLmdldFN0YWNrVHJhY2VPdXRwdXRNZXRob2QoKSAmIFhNTFJlcG9ydGVyQ29uZmlnLlNUQUNLVFJBQ0VfU0hPUlQpID09IFhNTFJlcG9ydGVyQ29uZmlnCisgICAgICAgICAgICAgIC5TVEFDS1RSQUNFX1NIT1JUKSB7CisgICAgICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19TSE9SVF9TVEFDS1RSQUNFKTsKKyAgICAgICAgeG1sQnVmZmVyLmFkZENEQVRBKHN0YWNrVHJhY2VzWzBdKTsKKyAgICAgICAgeG1sQnVmZmVyLnBvcCgpOworICAgICAgfQorICAgICAgaWYgKChjb25maWcuZ2V0U3RhY2tUcmFjZU91dHB1dE1ldGhvZCgpICYgWE1MUmVwb3J0ZXJDb25maWcuU1RBQ0tUUkFDRV9GVUxMKSA9PSBYTUxSZXBvcnRlckNvbmZpZworICAgICAgICAgICAgICAuU1RBQ0tUUkFDRV9GVUxMKSB7CisgICAgICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19GVUxMX1NUQUNLVFJBQ0UpOworICAgICAgICB4bWxCdWZmZXIuYWRkQ0RBVEEoc3RhY2tUcmFjZXNbMV0pOworICAgICAgICB4bWxCdWZmZXIucG9wKCk7CisgICAgICB9CisKKyAgICAgIHhtbEJ1ZmZlci5wb3AoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkVGVzdFJlc3VsdE91dHB1dChYTUxTdHJpbmdCdWZmZXIgeG1sQnVmZmVyLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgLy8gVE9ETzogQ29zbWluIC0gbWF5YmUgYSA8bGluZT4gZWxlbWVudCBpc24ndCBpbmRpY2F0ZWQgZm9yIGVhY2ggbGluZQorICAgIHhtbEJ1ZmZlci5wdXNoKFhNTFJlcG9ydGVyQ29uZmlnLlRBR19SRVBPUlRFUl9PVVRQVVQpOworICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBSZXBvcnRlci5nZXRPdXRwdXQodGVzdFJlc3VsdCk7CisgICAgZm9yIChTdHJpbmcgbGluZSA6IG91dHB1dCkgeworICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICB4bWxCdWZmZXIucHVzaChYTUxSZXBvcnRlckNvbmZpZy5UQUdfTElORSk7CisgICAgICAgIHhtbEJ1ZmZlci5hZGRDREFUQShsaW5lKTsKKyAgICAgICAgeG1sQnVmZmVyLnBvcCgpOworICAgICAgfQorICAgIH0KKyAgICB4bWxCdWZmZXIucG9wKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkVGVzdFJlc3VsdEF0dHJpYnV0ZXMoWE1MU3RyaW5nQnVmZmVyIHhtbEJ1ZmZlciwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIGlmICh0ZXN0UmVzdWx0LmdldEF0dHJpYnV0ZU5hbWVzKCkgIT0gbnVsbCAmJiB0ZXN0UmVzdWx0LmdldEF0dHJpYnV0ZU5hbWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX0FUVFJJQlVURVMpOworICAgICAgZm9yIChTdHJpbmcgYXR0ck5hbWU6IHRlc3RSZXN1bHQuZ2V0QXR0cmlidXRlTmFtZXMoKSkgeworICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBhdHRyVmFsdWUgPSB0ZXN0UmVzdWx0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7CisKKyAgICAgICAgUHJvcGVydGllcyBhdHRyaWJ1dGVBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGF0dHJpYnV0ZUF0dHJzLnNldFByb3BlcnR5KFhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfTkFNRSwgYXR0ck5hbWUpOworICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICBhdHRyaWJ1dGVBdHRycy5zZXRQcm9wZXJ0eShYTUxSZXBvcnRlckNvbmZpZy5BVFRSX0lTX05VTEwsICJ0cnVlIik7CisgICAgICAgICAgeG1sQnVmZmVyLmFkZEVtcHR5RWxlbWVudChYTUxSZXBvcnRlckNvbmZpZy5UQUdfQVRUUklCVVRFLCBhdHRyaWJ1dGVBdHRycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgeG1sQnVmZmVyLnB1c2goWE1MUmVwb3J0ZXJDb25maWcuVEFHX0FUVFJJQlVURSwgYXR0cmlidXRlQXR0cnMpOworICAgICAgICAgIHhtbEJ1ZmZlci5hZGRDREFUQShhdHRyVmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgeG1sQnVmZmVyLnBvcCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICB4bWxCdWZmZXIucG9wKCk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MVXRpbHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvWE1MVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmU2MWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9YTUxVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnRleHQuU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBTdGF0aWMgaGVscGVycyBmb3IgWE1MLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IEp1bCAyMSwgMjAwMworICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFhNTFV0aWxzIHsKKworICAvKiogUGxhdGZvcm0gc3BlY2lmaWMgZW5kIG9mIGxpbmUgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICBwcml2YXRlIFhNTFV0aWxzKCkgeworICAgIC8vIEhpZGUgY29uc3RydWN0b3IKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZSB0YWcuCisgICAqIEFuIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIHdpbGwgYmUgZ2VuZXJhdGVkIGV2ZW4gaWYgdmFsdWUgaXMgbnVsbC4KKyAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgdGFnCisgICAqIEBwYXJhbSBjb250ZW50IGNvbnRlbnQgZm9yIHRoaXMgdGFnIChvciBudWxsKQorICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0YWcgYXR0cmlidXRlcyAob3IgbnVsbCkKKyAgICovCisgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHhtbChTdHJpbmcgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgSUJ1ZmZlciByZXN1bHQgPSBCdWZmZXIuY3JlYXRlKCk7CisgICAgeG1sT3BlbihyZXN1bHQsIGluZGVudCwgbmFtZSwgYXR0cmlidXRlcywgdHJ1ZSAvKiBubyBuZXdsaW5lICovKTsKKyAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGNvbnRlbnQpOworICAgIH0KKyAgICB4bWxDbG9zZShyZXN1bHQsICIiLCBuYW1lLCBYTUxVdGlscy5leHRyYWN0Q29tbWVudChuYW1lLCBhdHRyaWJ1dGVzKSk7CisKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0Q29tbWVudChTdHJpbmcgdGFnLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKyAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8ICJzcGFuIi5lcXVhbHModGFnKSkgcmV0dXJuIG51bGw7CisKKyAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1tdIHsgImlkIiwgIm5hbWUiLCAiY2xhc3MiIH07CisgICAgZm9yIChTdHJpbmcgYSA6IGF0dHJpYnV0ZXMpIHsKKyAgICAgIFN0cmluZyBjb21tZW50ID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShhKTsKKyAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuICIgPCEtLSAiICsgY29tbWVudC5yZXBsYWNlQWxsKCJbLV17Mix9IiwgIi0iKSArICIgLS0+IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB4bWxPcHRpb25hbChJQnVmZmVyIHJlc3VsdCwgU3RyaW5nIHNwLAorICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBCb29sZWFuIHZhbHVlLCBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobnVsbCAhPSB2YWx1ZSkgeworICAgICAgeG1sUmVxdWlyZWQocmVzdWx0LCBzcCwgZWxlbWVudE5hbWUsIHZhbHVlLnRvU3RyaW5nKCksIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB4bWxPcHRpb25hbChJQnVmZmVyIHJlc3VsdCwgU3RyaW5nIHNwLAorICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBATnVsbGFibGUgU3RyaW5nIHZhbHVlLCBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobnVsbCAhPSB2YWx1ZSkgeworICAgICAgeG1sUmVxdWlyZWQocmVzdWx0LCBzcCwgZWxlbWVudE5hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgeG1sUmVxdWlyZWQoSUJ1ZmZlciByZXN1bHQsIFN0cmluZyBzcCwKKyAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgQE51bGxhYmxlIFN0cmluZyB2YWx1ZSwgQE51bGxhYmxlIFByb3BlcnRpZXMgYXR0cmlidXRlcykgeworICAgIHJlc3VsdC5hcHBlbmQoeG1sKHNwLCBlbGVtZW50TmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB4bWxPcGVuKElCdWZmZXIgcmVzdWx0LCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgdGFnLAorICAgICAgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgeG1sT3BlbihyZXN1bHQsIGluZGVudCwgdGFnLCBhdHRyaWJ1dGVzLCBmYWxzZSAvKiBubyBuZXdsaW5lICovKTsKKyAgfQorCisgIC8qKgorICAgKiBBcHBlbmRzIHRoZSBhdHRyaWJ1dGVzIHRvIHJlc3VsdC4gVGhlIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIG9uIGEgc2luZ2xlIGxpbmUKKyAgICogYXM6IGtleTE9InZhbHVlMSIga2V5Mj0idmFsdWUyIiAuLi4gKGEgc3BhY2UgaXMgYWRkZWQgYmVmb3JlIHRoZSBmaXJzdCBrZXkpCisgICAqCisgICAqIEBwYXJhbSByZXN1bHQKKyAgICogICAgICAgICAgdGhlIGJ1ZmZlciB0byBhcHBlbmQgYXR0cmlidXRlcyB0by4KKyAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICogICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gYXBwZW5kIChtYXkgYmUgbnVsbCkuCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kQXR0cmlidXRlcyhJQnVmZmVyIHJlc3VsdCwgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG51bGwgIT0gYXR0cmlidXRlcykgeworICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGF0dHJpYnV0ZXMuZW50cnlTZXQoKSkgeworICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSkgZWxlbWVudDsKKyAgICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVzY2FwZShlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgIikuYXBwZW5kKGtleSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiXCIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgeG1sT3BlbihJQnVmZmVyIHJlc3VsdCwgU3RyaW5nIGluZGVudCwgU3RyaW5nIHRhZywKKyAgICAgIFByb3BlcnRpZXMgYXR0cmlidXRlcywgYm9vbGVhbiBub05ld0xpbmUpIHsKKyAgICByZXN1bHQuYXBwZW5kKGluZGVudCkuYXBwZW5kKCI8IikuYXBwZW5kKHRhZyk7CisgICAgYXBwZW5kQXR0cmlidXRlcyhyZXN1bHQsIGF0dHJpYnV0ZXMpOworICAgIHJlc3VsdC5hcHBlbmQoIj4iKTsKKyAgICBpZiAoIW5vTmV3TGluZSkgeworICAgICAgcmVzdWx0LmFwcGVuZChFT0wpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB4bWxDbG9zZShJQnVmZmVyIHJlc3VsdCwgU3RyaW5nIGluZGVudCwgU3RyaW5nIHRhZywgU3RyaW5nIGNvbW1lbnQpIHsKKyAgICByZXN1bHQuYXBwZW5kKGluZGVudCkuYXBwZW5kKCI8LyIpLmFwcGVuZCh0YWcpLmFwcGVuZCgiPiIpCisgICAgICAgIC5hcHBlbmQoY29tbWVudCAhPSBudWxsID8gY29tbWVudCA6ICIiKQorICAgICAgICAuYXBwZW5kKEVPTCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIGlucHV0KSB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoaW5wdXQpOworICAgIGNoYXIgY2hhcmFjdGVyID0gaXRlcmF0b3IuY3VycmVudCgpOworICAgIHdoaWxlIChjaGFyYWN0ZXIgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSkgeworICAgICAgaWYgKGNoYXJhY3RlciA9PSAnPCcpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmx0OyIpOworICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gJz4nKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZndDsiKTsKKyAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09ICdcIicpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PSAnXCcnKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiYjMDM5OyIpOworICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gJyYnKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZhbXA7Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKGNoYXJhY3Rlcik7CisgICAgICB9CisgICAgICBjaGFyYWN0ZXIgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9CYW5uZXJQYW5lbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9CYW5uZXJQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWYyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0Jhbm5lclBhbmVsLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworcHVibGljIGNsYXNzIEJhbm5lclBhbmVsIGV4dGVuZHMgQmFzZVBhbmVsIHsKKworICBwdWJsaWMgQmFubmVyUGFuZWwoTW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGUoWE1MU3RyaW5nQnVmZmVyIHhzYikgeworICAgIHhzYi5wdXNoKEQsIEMsICJ0b3AtYmFubmVyLXJvb3QiKTsKKyAgICB4c2IuYWRkUmVxdWlyZWQoUywgIlRlc3QgcmVzdWx0cyIsIEMsICJ0b3AtYmFubmVyLXRpdGxlLWZvbnQiKTsKKyAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJiciIpOworICAgIGludCBmYWlsZWRDb3VudCA9IGdldE1vZGVsKCkuZ2V0QWxsRmFpbGVkUmVzdWx0cygpLnNpemUoKTsKKyAgICBTdHJpbmcgdGVzdFJlc3VsdCA9IGZhaWxlZENvdW50ID4gMCA/ICIsICIgKyBwbHVyYWxpemUoZmFpbGVkQ291bnQsICJmYWlsZWQgdGVzdCIpIDogIiI7CisgICAgU3RyaW5nIHN1YlRpdGxlID0gcGx1cmFsaXplKGdldE1vZGVsKCkuZ2V0U3VpdGVzKCkuc2l6ZSgpLCAic3VpdGUiKQorICAgICAgICArIHRlc3RSZXN1bHQ7CisgICAgeHNiLmFkZFJlcXVpcmVkKFMsIHN1YlRpdGxlLCBDLCAidG9wLWJhbm5lci1mb250LTEiKTsKKyAgICB4c2IucG9wKEQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvQmFzZU11bHRpU3VpdGVQYW5lbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9CYXNlTXVsdGlTdWl0ZVBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzZjgzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvQmFzZU11bHRpU3VpdGVQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMuanE7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBCYXNlTXVsdGlTdWl0ZVBhbmVsIGV4dGVuZHMgQmFzZVBhbmVsIGltcGxlbWVudHMgSU5hdmlnYXRvclBhbmVsIHsKKworICBhYnN0cmFjdCBTdHJpbmcgZ2V0SGVhZGVyKElTdWl0ZSBzdWl0ZSk7CisgIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50KElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIHhzYik7CisKKyAgcHVibGljIEJhc2VNdWx0aVN1aXRlUGFuZWwoTW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGUoWE1MU3RyaW5nQnVmZmVyIHhzYikgeworICAgIGZvciAoSVN1aXRlIHMgOiBnZXRTdWl0ZXMoKSkgeworICAgICAgeHNiLnB1c2goRCwgQywgInBhbmVsIiwgInBhbmVsLW5hbWUiLCBnZXRQYW5lbE5hbWUocykpOworICAgICAgeHNiLnB1c2goRCwgQywgIm1haW4tcGFuZWwtaGVhZGVyIHJvdW5kZWQtd2luZG93LXRvcCIpOworICAgICAgeHNiLmFkZE9wdGlvbmFsKFMsIGdldEhlYWRlcihzKSwgQywgImhlYWRlci1jb250ZW50Iik7CisgICAgICB4c2IucG9wKEQpOworCisgICAgICB4c2IucHVzaChELCBDLCAibWFpbi1wYW5lbC1jb250ZW50IHJvdW5kZWQtd2luZG93LWJvdHRvbSIpOworICAgICAgeHNiLmFkZFN0cmluZyhnZXRDb250ZW50KHMsIHhzYikpOworICAgICAgeHNiLnBvcChEKTsKKworICAgICAgeHNiLnBvcChEKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQYW5lbE5hbWUoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuIGdldFByZWZpeCgpICsgc3VpdGVUb1RhZyhzdWl0ZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9CYXNlUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvQmFzZVBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3MjkyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvQmFzZVBhbmVsLmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBCYXNlUGFuZWwgaW1wbGVtZW50cyBJUGFuZWwgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDID0gImNsYXNzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRCA9ICJkaXYiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTID0gInNwYW4iOworCisgIHByaXZhdGUgTW9kZWwgbV9tb2RlbDsKKworICBwdWJsaWMgQmFzZVBhbmVsKE1vZGVsIG1vZGVsKSB7CisgICAgbV9tb2RlbCA9IG1vZGVsOworICB9CisKKyAgcHJvdGVjdGVkIE1vZGVsIGdldE1vZGVsKCkgeworICAgIHJldHVybiBtX21vZGVsOworICB9CisKKyAgcHJvdGVjdGVkIExpc3Q8SVN1aXRlPiBnZXRTdWl0ZXMoKSB7CisgICAgcmV0dXJuIGdldE1vZGVsKCkuZ2V0U3VpdGVzKCk7CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwbHVyYWxpemUoaW50IGNvdW50LCBTdHJpbmcgc2luZ3VsYXIpIHsKKyAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhjb3VudCkgKyAiICIgKyAoY291bnQgPT0gMCB8fCBjb3VudCA+IDEKKyAgICAgICAgPyAoc2luZ3VsYXIuZW5kc1dpdGgoInMiKSA/IHNpbmd1bGFyICsgImVzIiA6IHNpbmd1bGFyICsgInMiKQorICAgICAgICA6IHNpbmd1bGFyKTsKKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHN1aXRlVG9UYWcoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuIHN1aXRlLmdldE5hbWUoKS5yZXBsYWNlKCIgIiwgIl8iKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0Nocm9ub2xvZ2ljYWxQYW5lbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9DaHJvbm9sb2dpY2FsUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVkNDkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9DaHJvbm9sb2dpY2FsUGFuZWwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ2hyb25vbG9naWNhbFBhbmVsIGV4dGVuZHMgQmFzZU11bHRpU3VpdGVQYW5lbCB7CisKKyAgcHVibGljIENocm9ub2xvZ2ljYWxQYW5lbChNb2RlbCBtb2RlbCkgeworICAgIHN1cGVyKG1vZGVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICByZXR1cm4gImNocm9ub2xvZ2ljYWwtIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihJU3VpdGUgc3VpdGUpIHsKKyAgICByZXR1cm4gIk1ldGhvZHMgaW4gY2hyb25vbG9naWNhbCBvcmRlciI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIG1haW4pIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihtYWluLmdldEN1cnJlbnRJbmRlbnQoKSk7CisgICAgTGlzdDxJSW52b2tlZE1ldGhvZD4gaW52b2tlZE1ldGhvZHMgPSBzdWl0ZS5nZXRBbGxJbnZva2VkTWV0aG9kcygpOworCisgICAgQ29sbGVjdGlvbnMuc29ydChpbnZva2VkTWV0aG9kcywgbmV3IENvbXBhcmF0b3I8SUludm9rZWRNZXRob2Q+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUludm9rZWRNZXRob2QgYXJnMCwgSUludm9rZWRNZXRob2QgYXJnMSkgeworICAgICAgICByZXR1cm4gKGludCkKKyAgICAgICAgICAgIChhcmcwLmdldFRlc3RSZXN1bHQoKS5nZXRTdGFydE1pbGxpcygpIC0gYXJnMS5nZXRUZXN0UmVzdWx0KCkuZ2V0U3RhcnRNaWxsaXMoKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBTdHJpbmcgY3VycmVudENsYXNzID0gIiI7CisgICAgbG9uZyBzdGFydCA9IDA7CisgICAgZm9yIChJSW52b2tlZE1ldGhvZCBpbSA6IGludm9rZWRNZXRob2RzKSB7CisgICAgICBJVGVzdE5HTWV0aG9kIG0gPSBpbS5nZXRUZXN0TWV0aG9kKCk7CisvLyAgICBmb3IgKElUZXN0UmVzdWx0IHRyIDogcmVzdWx0cykgeworLy8gICAgICBJVGVzdE5HTWV0aG9kIG0gPSB0ci5nZXRNZXRob2QoKTsKKyAgICAgIFN0cmluZyBjbHMgPSAidGVzdC1tZXRob2QiOworICAgICAgaWYgKG0uaXNCZWZvcmVTdWl0ZUNvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICBjbHMgPSAiY29uZmlndXJhdGlvbi1zdWl0ZSBiZWZvcmUiOworICAgICAgfSBlbHNlIGlmIChtLmlzQWZ0ZXJTdWl0ZUNvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICBjbHMgPSAiY29uZmlndXJhdGlvbi1zdWl0ZSBhZnRlciI7CisgICAgICB9IGVsc2UgaWYgKG0uaXNCZWZvcmVUZXN0Q29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIGNscyA9ICJjb25maWd1cmF0aW9uLXRlc3QgYmVmb3JlIjsKKyAgICAgIH0gZWxzZSBpZiAobS5pc0FmdGVyVGVzdENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICBjbHMgPSAiY29uZmlndXJhdGlvbi10ZXN0IGFmdGVyIjsKKyAgICAgIH0gZWxzZSBpZiAobS5pc0JlZm9yZUNsYXNzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIGNscyA9ICJjb25maWd1cmF0aW9uLWNsYXNzIGJlZm9yZSI7CisgICAgICB9IGVsc2UgaWYgKG0uaXNBZnRlckNsYXNzQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIGNscyA9ICJjb25maWd1cmF0aW9uLWNsYXNzIGFmdGVyIjsKKyAgICAgIH0gZWxzZSBpZiAobS5pc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICBjbHMgPSAiY29uZmlndXJhdGlvbi1tZXRob2QgYmVmb3JlIjsKKyAgICAgIH0gZWxzZSBpZiAobS5pc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpKSB7CisgICAgICAgIGNscyA9ICJjb25maWd1cmF0aW9uLW1ldGhvZCBhZnRlciI7CisgICAgICB9CisgICAgICBJVGVzdFJlc3VsdCB0ciA9IGltLmdldFRlc3RSZXN1bHQoKTsKKyAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gTW9kZWwuZ2V0VGVzdFJlc3VsdE5hbWUodHIpOworCisgICAgICBpZiAoIW0uZ2V0VGVzdENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MpKSB7CisgICAgICAgIGlmICghIiIuZXF1YWxzKGN1cnJlbnRDbGFzcykpIHsKKyAgICAgICAgICB4c2IucG9wKEQpOworICAgICAgICB9CisgICAgICAgIHhzYi5wdXNoKEQsIEMsICJjaHJvbm9sb2dpY2FsLWNsYXNzIik7CisgICAgICAgIHhzYi5hZGRSZXF1aXJlZChELCBtLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKSwgQywgImNocm9ub2xvZ2ljYWwtY2xhc3MtbmFtZSIpOworICAgICAgICBjdXJyZW50Q2xhc3MgPSBtLmdldFRlc3RDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIH0KKyAgICAgIHhzYi5wdXNoKEQsIEMsIGNscyk7CisgICAgICBpZiAodHIuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuRkFJTFVSRSkgeworICAgICAgICB4c2IucHVzaCgiaW1nIiwgInNyYyIsIE1vZGVsLmdldEltYWdlKCJmYWlsZWQiKSk7CisgICAgICAgIHhzYi5wb3AoImltZyIpOworICAgICAgfQorCisgICAgICAvLyBObyBuZWVkIHRvIGNoZWNrIGZvciBza2lwcGVkIG1ldGhvZHMgc2luY2UgYnkgZGVmaW5pdGlvbiwgdGhleSB3ZXJlIG5ldmVyCisgICAgICAvLyBpbnZva2VkLgorCisgICAgICB4c2IuYWRkUmVxdWlyZWQoUywgbWV0aG9kTmFtZSwgQywgIm1ldGhvZC1uYW1lIik7CisgICAgICBpZiAoc3RhcnQgPT0gMCkgeworICAgICAgICBzdGFydCA9IHRyLmdldFN0YXJ0TWlsbGlzKCk7CisgICAgICB9CisgICAgICB4c2IuYWRkUmVxdWlyZWQoUywgTG9uZy50b1N0cmluZyh0ci5nZXRTdGFydE1pbGxpcygpIC0gc3RhcnQpICArICIgbXMiLCBDLCAibWV0aG9kLXN0YXJ0Iik7CisgICAgICB4c2IucG9wKEQpOworICAgIH0KKyAgICByZXR1cm4geHNiLnRvWE1MKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXROYXZpZ2F0b3JMaW5rKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiAiQ2hyb25vbG9naWNhbCB2aWV3IjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0dyb3VwUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvR3JvdXBQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDM0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0dyb3VwUGFuZWwuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR3JvdXBQYW5lbCBleHRlbmRzIEJhc2VNdWx0aVN1aXRlUGFuZWwgeworICBwdWJsaWMgR3JvdXBQYW5lbChNb2RlbCBtb2RlbCkgeworICAgIHN1cGVyKG1vZGVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICByZXR1cm4gImdyb3VwLSI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuICJHcm91cHMgZm9yICIgKyBzdWl0ZS5nZXROYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIG1haW4pIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihtYWluLmdldEN1cnJlbnRJbmRlbnQoKSk7CisgICAgTGlzdDxTdHJpbmc+IHNvcnRlZEdyb3VwcyA9IGdldE1vZGVsKCkuZ2V0R3JvdXBzKHN1aXRlLmdldE5hbWUoKSk7CisgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRHcm91cHMpOworICAgIGZvciAoU3RyaW5nIGdyb3VwIDogc29ydGVkR3JvdXBzKSB7CisgICAgICB4c2IucHVzaChELCBDLCAidGVzdC1ncm91cCIpOworICAgICAgeHNiLmFkZFJlcXVpcmVkKFMsIGdyb3VwLCBDLCAidGVzdC1ncm91cC1uYW1lIik7CisgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJiciIpOworICAgICAgTGlzdDxTdHJpbmc+IHNvcnRlZE1ldGhvZHMgPSBnZXRNb2RlbCgpLmdldE1ldGhvZHNJbkdyb3VwKGdyb3VwKTsKKyAgICAgIGZvciAoU3RyaW5nIG1ldGhvZCA6IHNvcnRlZE1ldGhvZHMpIHsKKyAgICAgICAgeHNiLnB1c2goRCwgQywgIm1ldGhvZC1pbi1ncm91cCIpOworICAgICAgICB4c2IuYWRkUmVxdWlyZWQoUywgbWV0aG9kLCBDLCAibWV0aG9kLWluLWdyb3VwLW5hbWUiKTsKKyAgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiYnIiKTsKKyAgICAgICAgeHNiLnBvcChEKTsKKyAgICAgIH0KKyAgICAgIHhzYi5wb3AoRCk7CisgICAgfQorICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hdmlnYXRvckxpbmsoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuIHBsdXJhbGl6ZShnZXRNb2RlbCgpLmdldEdyb3VwcyhzdWl0ZS5nZXROYW1lKCkpLnNpemUoKSwgImdyb3VwIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvSU5hdmlnYXRvclBhbmVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0lOYXZpZ2F0b3JQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTk1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0lOYXZpZ2F0b3JQYW5lbC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMuanE7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKKworLyoqCisgKiBQYW5lbHMgdGhhdCBhcmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBuYXZpZ2F0b3IuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSU5hdmlnYXRvclBhbmVsIGV4dGVuZHMgSVBhbmVsIHsKKyAgU3RyaW5nIGdldFBhbmVsTmFtZShJU3VpdGUgc3VpdGUpOworICBTdHJpbmcgZ2V0TmF2aWdhdG9yTGluayhJU3VpdGUgc3VpdGUpOworICBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7CisgIFN0cmluZyBnZXRQcmVmaXgoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvSVBhbmVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0lQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDFjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0lQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworcHVibGljIGludGVyZmFjZSBJUGFuZWwgeworICB2b2lkIGdlbmVyYXRlKFhNTFN0cmluZ0J1ZmZlciB4c2IpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9JZ25vcmVkTWV0aG9kc1BhbmVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL0lnbm9yZWRNZXRob2RzUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYzNWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9JZ25vcmVkTWV0aG9kc1BhbmVsLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRNdWx0aU1hcDsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBJZ25vcmVkTWV0aG9kc1BhbmVsIGV4dGVuZHMgQmFzZU11bHRpU3VpdGVQYW5lbCB7CisKKyAgcHVibGljIElnbm9yZWRNZXRob2RzUGFuZWwoTW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgIH0KKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICByZXR1cm4gImlnbm9yZWQtbWV0aG9kcy0iOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiBwbHVyYWxpemUoc3VpdGUuZ2V0RXhjbHVkZWRNZXRob2RzKCkuc2l6ZSgpLCAiaWdub3JlZCBtZXRob2QiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoSVN1aXRlIHN1aXRlLCBYTUxTdHJpbmdCdWZmZXIgbWFpbikgeworICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKG1haW4uZ2V0Q3VycmVudEluZGVudCgpKTsKKyAgICBTZXRNdWx0aU1hcDxDbGFzczw/PiwgSVRlc3ROR01ldGhvZD4gbWFwID0gTWFwcy5uZXdTZXRNdWx0aU1hcCgpOworCisgICAgZm9yIChJVGVzdE5HTWV0aG9kIG1ldGhvZCA6IHN1aXRlLmdldEV4Y2x1ZGVkTWV0aG9kcygpKSB7CisgICAgICBtYXAucHV0KG1ldGhvZC5nZXRUZXN0Q2xhc3MoKS5nZXRSZWFsQ2xhc3MoKSwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBmb3IgKENsYXNzPD8+IGMgOiBtYXAua2V5U2V0KCkpIHsKKyAgICAgIHhzYi5wdXNoKEQsIEMsICJpZ25vcmVkLWNsYXNzLWRpdiIpOworICAgICAgeHNiLmFkZFJlcXVpcmVkKFMsIGMuZ2V0TmFtZSgpLCBDLCAiaWdub3JlZC1jbGFzcy1uYW1lIik7CisgICAgICB4c2IucHVzaChELCBDLCAiaWdub3JlZC1tZXRob2RzLWRpdiIpOworICAgICAgZm9yIChJVGVzdE5HTWV0aG9kIG0gOiBtYXAuZ2V0KGMpKSB7CisgICAgICAgIHhzYi5hZGRSZXF1aXJlZChTLCBtLmdldE1ldGhvZE5hbWUoKSwgQywgImlnbm9yZWQtbWV0aG9kLW5hbWUiKTsKKyAgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiYnIiKTsKKyAgICAgIH0KKyAgICAgIHhzYi5wb3AoRCk7CisgICAgICB4c2IucG9wKEQpOworICAgIH0KKyAgICByZXR1cm4geHNiLnRvWE1MKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXROYXZpZ2F0b3JMaW5rKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiAiSWdub3JlZCBtZXRob2RzIjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL01haW4uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmM0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL01haW4uamF2YQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxLkJhc2VQYW5lbC5DOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLnJlcG9ydGVycy5qcS5CYXNlUGFuZWwuRDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRmlsZXM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWFpbiBpbXBsZW1lbnRzIElSZXBvcnRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFU09VUkNFUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgImpxdWVyeS0xLjcuMS5taW4uanMiLCAidGVzdG5nLXJlcG9ydHMuY3NzIiwgInRlc3RuZy1yZXBvcnRzLmpzIiwKKyAgICAicGFzc2VkLnBuZyIsICJmYWlsZWQucG5nIiwgInNraXBwZWQucG5nIiwgIm5hdmlnYXRvci1idWxsZXQucG5nIiwKKyAgICAiYnVsbGV0X3BvaW50LnBuZyIsICJjb2xsYXBzZWFsbC5naWYiCisgIH07CisKKyAgcHJpdmF0ZSBNb2RlbCBtX21vZGVsOworICBwcml2YXRlIFN0cmluZyBtX291dHB1dERpcmVjdG9yeTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVSZXBvcnQoTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzLCBMaXN0PElTdWl0ZT4gc3VpdGVzLAorICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgIG1fbW9kZWwgPSBuZXcgTW9kZWwoc3VpdGVzKTsKKyAgICBtX291dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKKworICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCIgICAgIik7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgdG9wIGJhbm5lcgorICAgIG5ldyBCYW5uZXJQYW5lbChtX21vZGVsKS5nZW5lcmF0ZSh4c2IpOworCisgICAgLy8gQWxsIHRoZSBwYW5lbHMgc2VsZWN0YWJsZSBmcm9tIHRoZSBuYXZpZ2F0b3IKKyAgICBMaXN0PElOYXZpZ2F0b3JQYW5lbD4gcGFuZWxzID0gQXJyYXlzLjxJTmF2aWdhdG9yUGFuZWw+YXNMaXN0KAorICAgICAgICBuZXcgVGVzdE5nWG1sUGFuZWwobV9tb2RlbCksCisgICAgICAgIG5ldyBUZXN0UGFuZWwobV9tb2RlbCksCisgICAgICAgIG5ldyBHcm91cFBhbmVsKG1fbW9kZWwpLAorICAgICAgICBuZXcgVGltZXNQYW5lbChtX21vZGVsKSwKKyAgICAgICAgbmV3IFJlcG9ydGVyUGFuZWwobV9tb2RlbCksCisgICAgICAgIG5ldyBJZ25vcmVkTWV0aG9kc1BhbmVsKG1fbW9kZWwpLAorICAgICAgICBuZXcgQ2hyb25vbG9naWNhbFBhbmVsKG1fbW9kZWwpKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBuYXZpZ2F0b3Igb24gdGhlIGxlZnQgaGFuZCBzaWRlCisgICAgbmV3IE5hdmlnYXRvclBhbmVsKG1fbW9kZWwsIHBhbmVscykuZ2VuZXJhdGUoeHNiKTsKKworICAgIHhzYi5wdXNoKEQsIEMsICJ3cmFwcGVyIik7CisgICAgeHNiLnB1c2goRCwgImNsYXNzIiwgIm1haW4tcGFuZWwtcm9vdCIpOworCisgICAgLy8KKyAgICAvLyBHZW5lcmF0ZSB0aGUgbWFpbiBzdWl0ZSBwYW5lbAorICAgIC8vCisgICAgbmV3IFN1aXRlUGFuZWwobV9tb2RlbCkuZ2VuZXJhdGUoeHNiKTsKKworICAgIC8vIEdlbmVyYXRlIGFsbCB0aGUgbmF2aWdhdG9yIHBhbmVscworICAgIGZvciAoSU5hdmlnYXRvclBhbmVsIHBhbmVsIDogcGFuZWxzKSB7CisgICAgICBwYW5lbC5nZW5lcmF0ZSh4c2IpOworICAgIH0KKworICAgIHhzYi5wb3AoRCk7IC8vIG1haW4tcGFuZWwtcm9vdAorICAgIHhzYi5wb3AoRCk7IC8vIHdyYXBwZXIKKworICAgIHhzYi5hZGRTdHJpbmcoIiAgPC9ib2R5PlxuIik7CisgICAgeHNiLmFkZFN0cmluZygiPC9odG1sPlxuIik7CisKKyAgICBTdHJpbmcgYWxsOworICAgIHRyeSB7CisgICAgICB0cnkgKElucHV0U3RyZWFtIGhlYWRlciA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL2hlYWRlciIpKSB7CisgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIHJlc291cmNlIGhlYWRlciIpOworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGZpbGVOYW1lIDogUkVTT1VSQ0VTKSB7CisgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiLyIgKyBmaWxlTmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ291bGRuJ3QgZmluZCByZXNvdXJjZTogIiArIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVzLmNvcHlGaWxlKGlzLCBuZXcgRmlsZShtX291dHB1dERpcmVjdG9yeSwgZmlsZU5hbWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWxsID0gRmlsZXMucmVhZEZpbGUoaGVhZGVyKTsKKyAgICAgICAgVXRpbHMud3JpdGVVdGY4RmlsZShtX291dHB1dERpcmVjdG9yeSwgImluZGV4Lmh0bWwiLCB4c2IsIGFsbCk7IAorICAgICAgfQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvTW9kZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjFkYWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxOworCitpbXBvcnQgb3JnLnRlc3RuZy5JUmVzdWx0TWFwOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRNdWx0aU1hcDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgTW9kZWwgeworICBwcml2YXRlIExpc3RNdWx0aU1hcDxJU3VpdGUsIElUZXN0UmVzdWx0PiBtX21vZGVsID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgcHJpdmF0ZSBMaXN0PElTdWl0ZT4gbV9zdWl0ZXMgPSBudWxsOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV90ZXN0VGFncyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIE1hcDxJVGVzdFJlc3VsdCwgU3RyaW5nPiBtX3Rlc3RSZXN1bHRNYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBNYXA8SVN1aXRlLCBSZXN1bHRzQnlDbGFzcz4gbV9mYWlsZWRSZXN1bHRzQnlDbGFzcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIE1hcDxJU3VpdGUsIFJlc3VsdHNCeUNsYXNzPiBtX3NraXBwZWRSZXN1bHRzQnlDbGFzcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIE1hcDxJU3VpdGUsIFJlc3VsdHNCeUNsYXNzPiBtX3Bhc3NlZFJlc3VsdHNCeUNsYXNzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgTGlzdDxJVGVzdFJlc3VsdD4gbV9hbGxGYWlsZWRSZXN1bHRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIC8vIEVhY2ggc3VpdGUgaXMgbWFwcGVkIHRvIGZhaWxlZC5wbmcsIHNraXBwZWQucG5nIG9yIG5vdGhpbmcgKHdoaWNoIG1lYW5zIHBhc3NlZC5wbmcpCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX3N0YXR1c0J5U3VpdGVOYW1lID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgU2V0TXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1fZ3JvdXBzQnlTdWl0ZU5hbWUgPSBNYXBzLm5ld1NldE11bHRpTWFwKCk7CisgIHByaXZhdGUgU2V0TXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1fbWV0aG9kc0J5R3JvdXAgPSBNYXBzLm5ld1NldE11bHRpTWFwKCk7CisKKyAgcHVibGljIE1vZGVsKExpc3Q8SVN1aXRlPiBzdWl0ZXMpIHsKKyAgICBtX3N1aXRlcyA9IHN1aXRlczsKKyAgICBpbml0KCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxJU3VpdGU+IGdldFN1aXRlcygpIHsKKyAgICByZXR1cm4gbV9zdWl0ZXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICBpbnQgdGVzdENvdW50ZXIgPSAwOworICAgIGZvciAoSVN1aXRlIHN1aXRlIDogbV9zdWl0ZXMpIHsKKyAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHBhc3NlZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gZmFpbGVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBMaXN0PElUZXN0UmVzdWx0PiBza2lwcGVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKElTdWl0ZVJlc3VsdCBzciA6IHN1aXRlLmdldFJlc3VsdHMoKS52YWx1ZXMoKSkgeworICAgICAgICBJVGVzdENvbnRleHQgY29udGV4dCA9IHNyLmdldFRlc3RDb250ZXh0KCk7CisgICAgICAgIG1fdGVzdFRhZ3MucHV0KGNvbnRleHQuZ2V0TmFtZSgpLCAidGVzdC0iICsgdGVzdENvdW50ZXIrKyk7CisgICAgICAgIGZhaWxlZC5hZGRBbGwoY29udGV4dC5nZXRGYWlsZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSk7CisgICAgICAgIHNraXBwZWQuYWRkQWxsKGNvbnRleHQuZ2V0U2tpcHBlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpKTsKKyAgICAgICAgcGFzc2VkLmFkZEFsbChjb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuZ2V0QWxsUmVzdWx0cygpKTsKKyAgICAgICAgSVJlc3VsdE1hcFtdIG1hcCA9IG5ldyBJUmVzdWx0TWFwW10geworICAgICAgICAgICAgY29udGV4dC5nZXRGYWlsZWRUZXN0cygpLAorICAgICAgICAgICAgY29udGV4dC5nZXRTa2lwcGVkVGVzdHMoKSwKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0UGFzc2VkVGVzdHMoKQorICAgICAgICB9OworICAgICAgICBmb3IgKElSZXN1bHRNYXAgbSA6IG1hcCkgeworICAgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBtLmdldEFsbFJlc3VsdHMoKSkgeworICAgICAgICAgICAgbV90ZXN0UmVzdWx0TWFwLnB1dCh0ciwgZ2V0VGVzdFJlc3VsdE5hbWUodHIpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUHJvY2VzcyB0aGVtIGluIHRoZSBvcmRlciBwYXNzZWQsIHNraXBwZWQgYW5kIGZhaWxlZCwgc28gdGhhdCB0aGUgZmFpbGVkCisgICAgICAvLyBpY29uIG92ZXJyaWRlcyBhbGwgdGhlIG90aGVycyBhbmQgdGhlIHNraXBwZWQgaWNvbiBvdmVycmlkZXMgcGFzc2VkLgorCisgICAgICAvLyBQYXNzZWQKKyAgICAgIHsKKyAgICAgICAgUmVzdWx0c0J5Q2xhc3MgcmJjID0gbmV3IFJlc3VsdHNCeUNsYXNzKCk7CisgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBwYXNzZWQpIHsKKyAgICAgICAgICByYmMuYWRkUmVzdWx0KHRyLmdldFRlc3RDbGFzcygpLmdldFJlYWxDbGFzcygpLCB0cik7CisgICAgICAgICAgdXBkYXRlR3JvdXBzKHN1aXRlLCB0cik7CisgICAgICAgIH0KKyAgICAgICAgbV9wYXNzZWRSZXN1bHRzQnlDbGFzcy5wdXQoc3VpdGUsIHJiYyk7CisgICAgICB9CisKKyAgICAgIC8vIFNraXBwZWQKKyAgICAgIHsKKyAgICAgICAgUmVzdWx0c0J5Q2xhc3MgcmJjID0gbmV3IFJlc3VsdHNCeUNsYXNzKCk7CisgICAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBza2lwcGVkKSB7CisgICAgICAgICAgbV9zdGF0dXNCeVN1aXRlTmFtZS5wdXQoc3VpdGUuZ2V0TmFtZSgpLCAic2tpcHBlZCIpOworICAgICAgICAgIHJiYy5hZGRSZXN1bHQodHIuZ2V0VGVzdENsYXNzKCkuZ2V0UmVhbENsYXNzKCksIHRyKTsKKyAgICAgICAgICB1cGRhdGVHcm91cHMoc3VpdGUsIHRyKTsKKyAgICAgICAgfQorICAgICAgICBtX3NraXBwZWRSZXN1bHRzQnlDbGFzcy5wdXQoc3VpdGUsIHJiYyk7CisgICAgICB9CisKKyAgICAgIC8vIEZhaWxlZAorICAgICAgeworICAgICAgICBSZXN1bHRzQnlDbGFzcyByYmMgPSBuZXcgUmVzdWx0c0J5Q2xhc3MoKTsKKyAgICAgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IGZhaWxlZCkgeworICAgICAgICAgIG1fc3RhdHVzQnlTdWl0ZU5hbWUucHV0KHN1aXRlLmdldE5hbWUoKSwgImZhaWxlZCIpOworICAgICAgICAgIHJiYy5hZGRSZXN1bHQodHIuZ2V0VGVzdENsYXNzKCkuZ2V0UmVhbENsYXNzKCksIHRyKTsKKyAgICAgICAgICBtX2FsbEZhaWxlZFJlc3VsdHMuYWRkKHRyKTsKKyAgICAgICAgICB1cGRhdGVHcm91cHMoc3VpdGUsIHRyKTsKKyAgICAgICAgfQorICAgICAgICBtX2ZhaWxlZFJlc3VsdHNCeUNsYXNzLnB1dChzdWl0ZSwgcmJjKTsKKyAgICAgIH0KKworICAgICAgbV9tb2RlbC5wdXRBbGwoc3VpdGUsIGZhaWxlZCk7CisgICAgICBtX21vZGVsLnB1dEFsbChzdWl0ZSwgc2tpcHBlZCk7CisgICAgICBtX21vZGVsLnB1dEFsbChzdWl0ZSwgcGFzc2VkKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgdXBkYXRlR3JvdXBzKElTdWl0ZSBzdWl0ZSwgSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBTdHJpbmdbXSBncm91cHMgPSB0ci5nZXRNZXRob2QoKS5nZXRHcm91cHMoKTsKKyAgICBtX2dyb3Vwc0J5U3VpdGVOYW1lLnB1dEFsbChzdWl0ZS5nZXROYW1lKCksCisgICAgICAgIEFycmF5cy5hc0xpc3QoZ3JvdXBzKSk7CisgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBncm91cHMpIHsKKyAgICAgIG1fbWV0aG9kc0J5R3JvdXAucHV0KGdyb3VwLCB0ci5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBSZXN1bHRzQnlDbGFzcyBnZXRGYWlsZWRSZXN1bHRzQnlDbGFzcyhJU3VpdGUgc3VpdGUpIHsKKyAgICByZXR1cm4gbV9mYWlsZWRSZXN1bHRzQnlDbGFzcy5nZXQoc3VpdGUpOworICB9CisKKyAgcHVibGljIFJlc3VsdHNCeUNsYXNzIGdldFNraXBwZWRSZXN1bHRzQnlDbGFzcyhJU3VpdGUgc3VpdGUpIHsKKyAgICByZXR1cm4gbV9za2lwcGVkUmVzdWx0c0J5Q2xhc3MuZ2V0KHN1aXRlKTsKKyAgfQorCisgIHB1YmxpYyBSZXN1bHRzQnlDbGFzcyBnZXRQYXNzZWRSZXN1bHRzQnlDbGFzcyhJU3VpdGUgc3VpdGUpIHsKKyAgICByZXR1cm4gbV9wYXNzZWRSZXN1bHRzQnlDbGFzcy5nZXQoc3VpdGUpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUYWcoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICByZXR1cm4gbV90ZXN0UmVzdWx0TWFwLmdldCh0cik7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0VGVzdFJlc3VsdHMoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuIG5vbm51bGxMaXN0KG1fbW9kZWwuZ2V0KHN1aXRlKSk7CisgICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdFJlc3VsdE5hbWUoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHRyLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IHRyLmdldFBhcmFtZXRlcnMoKTsKKyAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIoIik7CisgICAgICBTdHJpbmdCdWlsZGVyIHAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpID4gMCkgcC5hcHBlbmQoIiwgIik7CisgICAgICAgIHAuYXBwZW5kKFV0aWxzLnRvU3RyaW5nKHBhcmFtZXRlcnNbaV0pKTsKKyAgICAgIH0KKyAgICAgIGlmIChwLmxlbmd0aCgpID4gMTAwKSB7CisgICAgICAgIFN0cmluZyBzID0gcC50b1N0cmluZygpLnN1YnN0cmluZygwLCAxMDApOworICAgICAgICBzID0gcyArICIuLi4iOworICAgICAgICByZXN1bHQuYXBwZW5kKHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PElUZXN0UmVzdWx0PiBnZXRBbGxGYWlsZWRSZXN1bHRzKCkgeworICAgIHJldHVybiBtX2FsbEZhaWxlZFJlc3VsdHM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbWFnZShTdHJpbmcgdGFnQ2xhc3MpIHsKKyAgICByZXR1cm4gdGFnQ2xhc3MgKyAiLnBuZyI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0ZvclN1aXRlKFN0cmluZyBzdWl0ZU5hbWUpIHsKKyAgICBTdHJpbmcgcmVzdWx0ID0gbV9zdGF0dXNCeVN1aXRlTmFtZS5nZXQoc3VpdGVOYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAicGFzc2VkIjsKKyAgfQorCisgIHB1YmxpYyA8VD4gU2V0PFQ+IG5vbm51bGxTZXQoU2V0PFQ+IGwpIHsKKyAgICByZXR1cm4gbCAhPSBudWxsID8gbCA6IENvbGxlY3Rpb25zLjxUPmVtcHR5U2V0KCk7CisgIH0KKworICBwdWJsaWMgPFQ+IExpc3Q8VD4gbm9ubnVsbExpc3QoTGlzdDxUPiBsKSB7CisgICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwgOiBDb2xsZWN0aW9ucy48VD5lbXB0eUxpc3QoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBzKFN0cmluZyBuYW1lKSB7CisgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdChub25udWxsU2V0KG1fZ3JvdXBzQnlTdWl0ZU5hbWUuZ2V0KG5hbWUpKSk7CisgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1ldGhvZHNJbkdyb3VwKFN0cmluZyBncm91cE5hbWUpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KG5vbm51bGxTZXQobV9tZXRob2RzQnlHcm91cC5nZXQoZ3JvdXBOYW1lKSkpOworICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIExpc3Q8SVRlc3RSZXN1bHQ+IGdldEFsbFRlc3RSZXN1bHRzKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiBnZXRBbGxUZXN0UmVzdWx0cyhzdWl0ZSwgdHJ1ZSAvKiB0ZXN0cyBvbmx5ICovKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PElUZXN0UmVzdWx0PiBnZXRBbGxUZXN0UmVzdWx0cyhJU3VpdGUgc3VpdGUsIGJvb2xlYW4gdGVzdHNPbmx5KSB7CisgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChJU3VpdGVSZXN1bHQgc3IgOiBzdWl0ZS5nZXRSZXN1bHRzKCkudmFsdWVzKCkpIHsKKyAgICAgIHJlc3VsdC5hZGRBbGwoc3IuZ2V0VGVzdENvbnRleHQoKS5nZXRQYXNzZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSk7CisgICAgICByZXN1bHQuYWRkQWxsKHNyLmdldFRlc3RDb250ZXh0KCkuZ2V0RmFpbGVkVGVzdHMoKS5nZXRBbGxSZXN1bHRzKCkpOworICAgICAgcmVzdWx0LmFkZEFsbChzci5nZXRUZXN0Q29udGV4dCgpLmdldFNraXBwZWRUZXN0cygpLmdldEFsbFJlc3VsdHMoKSk7CisgICAgICBpZiAoISB0ZXN0c09ubHkpIHsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChzci5nZXRUZXN0Q29udGV4dCgpLmdldFBhc3NlZENvbmZpZ3VyYXRpb25zKCkuZ2V0QWxsUmVzdWx0cygpKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChzci5nZXRUZXN0Q29udGV4dCgpLmdldEZhaWxlZENvbmZpZ3VyYXRpb25zKCkuZ2V0QWxsUmVzdWx0cygpKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChzci5nZXRUZXN0Q29udGV4dCgpLmdldFNraXBwZWRDb25maWd1cmF0aW9ucygpLmdldEFsbFJlc3VsdHMoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvTmF2aWdhdG9yUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvTmF2aWdhdG9yUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRkNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9OYXZpZ2F0b3JQYW5lbC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcucmVwb3J0ZXJzLmpxOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTmF2aWdhdG9yUGFuZWwgZXh0ZW5kcyBCYXNlUGFuZWwgeworCisgIHByaXZhdGUgTGlzdDxJTmF2aWdhdG9yUGFuZWw+IG1fcGFuZWxzOworCisgIHB1YmxpYyBOYXZpZ2F0b3JQYW5lbChNb2RlbCBtb2RlbCwgTGlzdDxJTmF2aWdhdG9yUGFuZWw+IHBhbmVscykgeworICAgIHN1cGVyKG1vZGVsKTsKKyAgICBtX3BhbmVscyA9IHBhbmVsczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShYTUxTdHJpbmdCdWZmZXIgbWFpbikgeworICAgIG1haW4ucHVzaChELCBDLCAibmF2aWdhdG9yLXJvb3QiKTsKKyAgICBtYWluLnB1c2goRCwgQywgIm5hdmlnYXRvci1zdWl0ZS1oZWFkZXIiKTsKKyAgICBtYWluLmFkZFJlcXVpcmVkKFMsICJBbGwgc3VpdGVzIik7CisgICAgbWFpbi5wdXNoKCJhIiwgQywgImNvbGxhcHNlLWFsbC1saW5rIiwgImhyZWYiLCAiIyIsICJ0aXRsZSIsICJDb2xsYXBzZS9leHBhbmQgYWxsIHRoZSBzdWl0ZXMiKTsKKyAgICBtYWluLnB1c2goImltZyIsICJzcmMiLCAiY29sbGFwc2VhbGwuZ2lmIiwgQywgImNvbGxhcHNlLWFsbC1pY29uIik7CisgICAgbWFpbi5wb3AoImltZyIpOworICAgIG1haW4ucG9wKCJhIik7CisgICAgbWFpbi5wb3AoRCk7CisgICAgZm9yIChJU3VpdGUgc3VpdGUgOiBnZXRTdWl0ZXMoKSkgeworICAgICAgaWYgKHN1aXRlLmdldFJlc3VsdHMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgU3RyaW5nIHN1aXRlTmFtZSA9ICJzdWl0ZS0iICsgc3VpdGVUb1RhZyhzdWl0ZSk7CisKKyAgICAgIFhNTFN0cmluZ0J1ZmZlciBoZWFkZXIgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKG1haW4uZ2V0Q3VycmVudEluZGVudCgpKTsKKworICAgICAgTWFwPFN0cmluZywgSVN1aXRlUmVzdWx0PiByZXN1bHRzID0gc3VpdGUuZ2V0UmVzdWx0cygpOworICAgICAgaW50IGZhaWxlZCA9IDA7CisgICAgICBpbnQgc2tpcHBlZCA9IDA7CisgICAgICBpbnQgcGFzc2VkID0gMDsKKyAgICAgIGZvciAoSVN1aXRlUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpIHsKKyAgICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQgPSByZXN1bHQuZ2V0VGVzdENvbnRleHQoKTsKKyAgICAgICAgZmFpbGVkICs9IGNvbnRleHQuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIHNraXBwZWQgKz0gY29udGV4dC5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCk7CisgICAgICAgIHBhc3NlZCArPSBjb250ZXh0LmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpOworICAgICAgfQorCisgICAgICAvLyBTdWl0ZSBuYW1lIGluIGJpZyBmb250CisgICAgICBoZWFkZXIucHVzaChELCBDLCAic3VpdGUiKTsKKyAgICAgIGhlYWRlci5wdXNoKEQsIEMsICJyb3VuZGVkLXdpbmRvdyIpOworICAgICAgLy8gRXh0cmEgZGl2IHNvIHRoZSBoaWdobGlnaHRpbmcgbG9naWMgd2lsbCBvbmx5IGhpZ2hsaWdodCB0aGlzIGxpbmUgYW5kIG5vdAorICAgICAgLy8gdGhlIGVudGlyZSBjb250YWluZXIKKyAgICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1oZWFkZXIgbGlnaHQtcm91bmRlZC13aW5kb3ctdG9wIik7CisgICAgICBoZWFkZXIucHVzaCgiYSIsICJocmVmIiwgIiMiLAorICAgICAgICAgICJwYW5lbC1uYW1lIiwgc3VpdGVOYW1lLAorICAgICAgICAgIEMsICJuYXZpZ2F0b3ItbGluayIpOworICAgICAgaGVhZGVyLmFkZE9wdGlvbmFsKFMsIHN1aXRlLmdldE5hbWUoKSwKKyAgICAgICAgICBDLCAic3VpdGUtbmFtZSBib3JkZXItIiArIGdldE1vZGVsKCkuZ2V0U3RhdHVzRm9yU3VpdGUoc3VpdGUuZ2V0TmFtZSgpKSk7CisgICAgICBoZWFkZXIucG9wKCJhIik7CisgICAgICBoZWFkZXIucG9wKEQpOworCisgICAgICBoZWFkZXIucHVzaChELCBDLCAibmF2aWdhdG9yLXN1aXRlLWNvbnRlbnQiKTsKKworICAgICAgZ2VuZXJhdGVJbmZvKGhlYWRlciwgc3VpdGUpOworICAgICAgZ2VuZXJhdGVSZXN1bHQoaGVhZGVyLCBmYWlsZWQsIHNraXBwZWQsIHBhc3NlZCwgc3VpdGUsIHN1aXRlTmFtZSk7CisKKyAgICAgIGhlYWRlci5wb3AoInVsIik7CisKKyAgICAgIGhlYWRlci5wb3AoRCk7IC8vIHN1aXRlLXNlY3Rpb24tY29udGVudAorICAgICAgaGVhZGVyLnBvcChEKTsgLy8gc3VpdGUtaGVhZGVyCisgICAgICBoZWFkZXIucG9wKEQpOyAvLyBzdWl0ZQorCisgICAgICBoZWFkZXIucG9wKEQpOyAvLyByZXN1bHQtc2VjdGlvbgorCisgICAgICBoZWFkZXIucG9wKEQpOyAvLyBuYXZpZ2F0b3Itc3VpdGUtY29udGVudAorCisgICAgICBtYWluLmFkZFN0cmluZyhoZWFkZXIudG9YTUwoKSk7CisgICAgfQorICAgIG1haW4ucG9wKEQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUmVzdWx0KFhNTFN0cmluZ0J1ZmZlciBoZWFkZXIsIGludCBmYWlsZWQsIGludCBza2lwcGVkLCBpbnQgcGFzc2VkLAorICAgICAgSVN1aXRlIHN1aXRlLCBTdHJpbmcgc3VpdGVOYW1lKSB7CisgICAgLy8KKyAgICAvLyBSZXN1bHRzCisgICAgLy8KKyAgICBoZWFkZXIucHVzaChELCBDLCAicmVzdWx0LXNlY3Rpb24iKTsKKworICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1zZWN0aW9uLXRpdGxlIik7CisgICAgaGVhZGVyLmFkZFJlcXVpcmVkKFMsICJSZXN1bHRzIik7CisgICAgaGVhZGVyLnBvcChEKTsKKworICAgIC8vIE1ldGhvZCBzdGF0cworICAgIGludCB0b3RhbCA9IGZhaWxlZCArIHNraXBwZWQgKyBwYXNzZWQ7CisgICAgU3RyaW5nIHN0YXRzID0gU3RyaW5nLmZvcm1hdCgiJXMsICVzICVzICVzIiwKKyAgICAgICAgcGx1cmFsaXplKHRvdGFsLCAibWV0aG9kIiksCisgICAgICAgIG1heWJlKGZhaWxlZCwgImZhaWxlZCIsICIsICIpLAorICAgICAgICBtYXliZShza2lwcGVkLCAic2tpcHBlZCIsICIsICIpLAorICAgICAgICBtYXliZShwYXNzZWQsICJwYXNzZWQiLCAiIikpOworICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1zZWN0aW9uLWNvbnRlbnQiKTsKKyAgICBoZWFkZXIucHVzaCgidWwiKTsKKyAgICBoZWFkZXIucHVzaCgibGkiKTsKKyAgICBoZWFkZXIuYWRkT3B0aW9uYWwoUywgc3RhdHMsIEMsICJtZXRob2Qtc3RhdHMiKTsKKyAgICBoZWFkZXIucG9wKCJsaSIpOworCisgICAgZ2VuZXJhdGVNZXRob2RMaXN0KCJGYWlsZWQgbWV0aG9kcyIsIG5ldyBSZXN1bHRzQnlTdGF0dXMoc3VpdGUsICJmYWlsZWQiLCBJVGVzdFJlc3VsdC5GQUlMVVJFKSwKKyAgICAgICAgc3VpdGVOYW1lLCBoZWFkZXIpOworICAgIGdlbmVyYXRlTWV0aG9kTGlzdCgiU2tpcHBlZCBtZXRob2RzIiwgbmV3IFJlc3VsdHNCeVN0YXR1cyhzdWl0ZSwgInNraXBwZWQiLCBJVGVzdFJlc3VsdC5TS0lQKSwKKyAgICAgICAgc3VpdGVOYW1lLCBoZWFkZXIpOworICAgIGdlbmVyYXRlTWV0aG9kTGlzdCgiUGFzc2VkIG1ldGhvZHMiLCBuZXcgUmVzdWx0c0J5U3RhdHVzKHN1aXRlLCAicGFzc2VkIiwgSVRlc3RSZXN1bHQuU1VDQ0VTUyksCisgICAgICAgIHN1aXRlTmFtZSwgaGVhZGVyKTsKKyAgICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW5mbyhYTUxTdHJpbmdCdWZmZXIgaGVhZGVyLCBJU3VpdGUgc3VpdGUpIHsKKyAgICAvLworICAgIC8vIEluZm8KKyAgICAvLworICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1zZWN0aW9uLXRpdGxlIik7CisgICAgaGVhZGVyLmFkZFJlcXVpcmVkKFMsICJJbmZvIik7CisgICAgaGVhZGVyLnBvcChEKTsKKworICAgIGhlYWRlci5wdXNoKEQsIEMsICJzdWl0ZS1zZWN0aW9uLWNvbnRlbnQiKTsKKworICAgIGhlYWRlci5wdXNoKCJ1bCIpOworCisgICAgLy8gQWxsIHRoZSBwYW5lbHMKKyAgICBmb3IgKElOYXZpZ2F0b3JQYW5lbCBwYW5lbCA6IG1fcGFuZWxzKSB7CisgICAgICBhZGRMaW5rVG8oaGVhZGVyLCBwYW5lbCwgc3VpdGUpOworICAgIH0KKworICAgIGhlYWRlci5wb3AoInVsIik7CisgICAgaGVhZGVyLnBvcChEKTsgLy8gc3VpdGUtc2VjdGlvbi1jb250ZW50CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkTGlua1RvKFhNTFN0cmluZ0J1ZmZlciBoZWFkZXIsIElOYXZpZ2F0b3JQYW5lbCBwYW5lbCwgSVN1aXRlIHN1aXRlKSB7CisgICAgU3RyaW5nIHRleHQgPSBwYW5lbC5nZXROYXZpZ2F0b3JMaW5rKHN1aXRlKTsKKyAgICBoZWFkZXIucHVzaCgibGkiKTsKKyAgICBoZWFkZXIucHVzaCgiYSIsICJocmVmIiwgIiMiLAorICAgICAgICAicGFuZWwtbmFtZSIsIHBhbmVsLmdldFBhbmVsTmFtZShzdWl0ZSksCisgICAgICAgIEMsICJuYXZpZ2F0b3ItbGluayAiKTsKKyAgICBTdHJpbmcgY2xhc3NOYW1lID0gcGFuZWwuZ2V0Q2xhc3NOYW1lKCk7CisgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICBoZWFkZXIuYWRkT3B0aW9uYWwoUywgdGV4dCwgQywgY2xhc3NOYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgaGVhZGVyLmFkZE9wdGlvbmFsKFMsIHRleHQpOworICAgIH0KKyAgICBoZWFkZXIucG9wKCJhIik7CisgICAgaGVhZGVyLnBvcCgibGkiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYXliZShpbnQgY291bnQsIFN0cmluZyBzLCBTdHJpbmcgc2VwKSB7CisgICAgcmV0dXJuIGNvdW50ID4gMCA/IGNvdW50ICsgIiAiICsgcyArIHNlcDogIiI7CisgIH0KKworICBwcml2YXRlIExpc3Q8SVRlc3RSZXN1bHQ+IGdldE1ldGhvZHNCeVN0YXR1cyhJU3VpdGUgc3VpdGUsIGludCBzdGF0dXMpIHsKKyAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PElUZXN0UmVzdWx0PiB0ZXN0UmVzdWx0cyA9IGdldE1vZGVsKCkuZ2V0VGVzdFJlc3VsdHMoc3VpdGUpOworICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiB0ZXN0UmVzdWx0cykgeworICAgICAgaWYgKHRyLmdldFN0YXR1cygpID09IHN0YXR1cykgeworICAgICAgICByZXN1bHQuYWRkKHRyKTsKKyAgICAgIH0KKyAgICB9CisgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIFJlc3VsdHNCeUNsYXNzLk1FVEhPRF9OQU1FX0NPTVBBUkFUT1IpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBJUmVzdWx0UHJvdmlkZXIgeworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IGdldFJlc3VsdHMoKTsKKyAgICBTdHJpbmcgZ2V0VHlwZSgpOworICB9CisKKyAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZVJlc3VsdFByb3ZpZGVyIGltcGxlbWVudHMgSVJlc3VsdFByb3ZpZGVyIHsKKyAgICBwcm90ZWN0ZWQgSVN1aXRlIG1fc3VpdGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtX3R5cGU7CisgICAgcHVibGljIEJhc2VSZXN1bHRQcm92aWRlcihJU3VpdGUgc3VpdGUsIFN0cmluZyB0eXBlKSB7CisgICAgICBtX3N1aXRlID0gc3VpdGU7CisgICAgICBtX3R5cGUgPSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgIHJldHVybiBtX3R5cGU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBSZXN1bHRzQnlTdGF0dXMgZXh0ZW5kcyBCYXNlUmVzdWx0UHJvdmlkZXIgeworICAgIHByaXZhdGUgZmluYWwgaW50IG1fc3RhdHVzOworCisgICAgcHVibGljIFJlc3VsdHNCeVN0YXR1cyhJU3VpdGUgc3VpdGUsIFN0cmluZyB0eXBlLCBpbnQgc3RhdHVzKSB7CisgICAgICBzdXBlcihzdWl0ZSwgdHlwZSk7CisgICAgICBtX3N0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0UmVzdWx0cygpIHsKKyAgICAgIHJldHVybiBnZXRNZXRob2RzQnlTdGF0dXMobV9zdWl0ZSwgbV9zdGF0dXMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1ldGhvZExpc3QoU3RyaW5nIG5hbWUsIElSZXN1bHRQcm92aWRlciBwcm92aWRlciwKKyAgICAgIFN0cmluZyBzdWl0ZU5hbWUsIFhNTFN0cmluZ0J1ZmZlciBtYWluKSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIobWFpbi5nZXRDdXJyZW50SW5kZW50KCkpOworICAgIFN0cmluZyB0eXBlID0gcHJvdmlkZXIuZ2V0VHlwZSgpOworICAgIFN0cmluZyBpbWFnZSA9IE1vZGVsLmdldEltYWdlKHR5cGUpOworCisgICAgeHNiLnB1c2goImxpIik7CisKKyAgICAvLyBUaGUgbWV0aG9kcyB0aGVtc2VsdmVzCisgICAgeHNiLmFkZFJlcXVpcmVkKFMsIG5hbWUsIEMsICJtZXRob2QtbGlzdC10aXRsZSAiICsgdHlwZSk7CisKKyAgICAvLyBUaGUgbWFyayB1cCB0byBzaG93IHRoZSAoaGlkZSkvKHNob3cpIGxpbmtzCisgICAgeHNiLnB1c2goUywgQywgInNob3ctb3ItaGlkZS1tZXRob2RzICIgKyB0eXBlKTsKKyAgICB4c2IuYWRkUmVxdWlyZWQoImEiLCAiIChoaWRlKSIsICJocmVmIiwgIiMiLCBDLCAiaGlkZS1tZXRob2RzICIgKyB0eXBlICsgIiAiICsgc3VpdGVOYW1lLAorICAgICAgICAicGFuZWwtbmFtZSIsIHN1aXRlTmFtZSk7CisgICAgeHNiLmFkZFJlcXVpcmVkKCJhIiwgIiAoc2hvdykiLCAiaHJlZiIsICIjIixDLCAic2hvdy1tZXRob2RzICIgKyB0eXBlICsgIiAiICsgc3VpdGVOYW1lLAorICAgICAgICAicGFuZWwtbmFtZSIsIHN1aXRlTmFtZSk7CisgICAgeHNiLnBvcChTKTsKKworICAgIC8vIExpc3Qgb2YgbWV0aG9kcworICAgIHhzYi5wdXNoKEQsIEMsICJtZXRob2QtbGlzdC1jb250ZW50ICIgKyB0eXBlICsgIiAiICsgc3VpdGVOYW1lKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRlc3RSZXN1bHRzID0gcHJvdmlkZXIuZ2V0UmVzdWx0cygpOworICAgIGlmICh0ZXN0UmVzdWx0cyAhPSBudWxsKSB7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRlc3RSZXN1bHRzLCBSZXN1bHRzQnlDbGFzcy5NRVRIT0RfTkFNRV9DT01QQVJBVE9SKTsKKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiB0ZXN0UmVzdWx0cykgeworICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBNb2RlbC5nZXRUZXN0UmVzdWx0TmFtZSh0cik7CisgICAgICAgIHhzYi5wdXNoKFMpOworICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJpbWciLCAic3JjIiwgaW1hZ2UsICJ3aWR0aCIsICIzJSIpOworICAgICAgICB4c2IuYWRkUmVxdWlyZWQoImEiLCB0ZXN0TmFtZSwgImhyZWYiLCAiIyIsCisgICAgICAgICAgICAiaGFzaC1mb3ItbWV0aG9kIiwgZ2V0TW9kZWwoKS5nZXRUYWcodHIpLAorICAgICAgICAgICAgInBhbmVsLW5hbWUiLCBzdWl0ZU5hbWUsCisgICAgICAgICAgICAidGl0bGUiLCB0ci5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgICBDLCAibWV0aG9kIG5hdmlnYXRvci1saW5rIik7CisgICAgICAgIHhzYi5wb3AoUyk7CisgICAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImJyIik7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorICAgIHhzYi5wb3AoRCk7CisgICAgeHNiLnBvcCgibGkiKTsKKworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgIG1haW4uYWRkU3RyaW5nKHhzYi50b1hNTCgpKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9SZXBvcnRlclBhbmVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1JlcG9ydGVyUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTJhYTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9SZXBvcnRlclBhbmVsLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBEaXNwbGF5IHRoZSByZXBvcnRlciBvdXRwdXQgZm9yIGVhY2ggdGVzdCByZXN1bHQuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRlclBhbmVsIGV4dGVuZHMgQmFzZU11bHRpU3VpdGVQYW5lbCB7CisKKyAgcHVibGljIFJlcG9ydGVyUGFuZWwoTW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgIH0KKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICByZXR1cm4gInJlcG9ydGVyLSI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuICJSZXBvcnRlciBvdXRwdXQgZm9yICIgKyBzdWl0ZS5nZXROYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIG1haW4pIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihtYWluLmdldEN1cnJlbnRJbmRlbnQoKSk7CisgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IGdldE1vZGVsKCkuZ2V0QWxsVGVzdFJlc3VsdHMoc3VpdGUpKSB7CisgICAgICBMaXN0PFN0cmluZz4gbGluZXMgPSBSZXBvcnRlci5nZXRPdXRwdXQodHIpOworICAgICAgaWYgKCEgbGluZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIHhzYi5wdXNoKEQsIEMsICJyZXBvcnRlci1tZXRob2QtZGl2Iik7CisgICAgICAgIHhzYi5hZGRSZXF1aXJlZChTLCBNb2RlbC5nZXRUZXN0UmVzdWx0TmFtZSh0ciksIEMsICJyZXBvcnRlci1tZXRob2QtbmFtZSIpOworICAgICAgICB4c2IucHVzaChELCBDLCAicmVwb3J0ZXItbWV0aG9kLW91dHB1dC1kaXYiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3V0cHV0IDogbGluZXMpIHsKKyAgICAgICAgICB4c2IuYWRkUmVxdWlyZWQoUywgb3V0cHV0LCBDLCAicmVwb3J0ZXItbWV0aG9kLW91dHB1dCIpOworICAgICAgICB9CisgICAgICAgIHhzYi5wb3AoRCk7CisgICAgICAgIHhzYi5wb3AoRCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hdmlnYXRvckxpbmsoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuICJSZXBvcnRlciBvdXRwdXQiOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvUmVzdWx0c0J5Q2xhc3MuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvUmVzdWx0c0J5Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI0MmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9SZXN1bHRzQnlDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMuanE7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdE11bHRpTWFwOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFJlc3VsdHNCeUNsYXNzIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPElUZXN0UmVzdWx0PiBNRVRIT0RfTkFNRV9DT01QQVJBVE9SID0KKyAgICAgIG5ldyBDb21wYXJhdG9yPElUZXN0UmVzdWx0PigpIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShJVGVzdFJlc3VsdCBhcmcwLCBJVGVzdFJlc3VsdCBhcmcxKSB7CisgICAgICByZXR1cm4gYXJnMC5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCkuY29tcGFyZVRvKAorICAgICAgICAgIGFyZzEuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICB9CisKKyAgfTsKKworICBwcml2YXRlIExpc3RNdWx0aU1hcDxDbGFzczw/PiwgSVRlc3RSZXN1bHQ+IG1fcmVzdWx0cyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisKKyAgcHVibGljIHZvaWQgYWRkUmVzdWx0KENsYXNzPD8+IGMsIElUZXN0UmVzdWx0IHRyKSB7CisgICAgbV9yZXN1bHRzLnB1dChjLCB0cik7CisgIH0KKworICBwdWJsaWMgTGlzdDxJVGVzdFJlc3VsdD4gZ2V0UmVzdWx0cyhDbGFzczw/PiBjKSB7CisgICAgTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0ID0gbV9yZXN1bHRzLmdldChjKTsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgTUVUSE9EX05BTUVfQ09NUEFSQVRPUik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBMaXN0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgIC8vIFRPRE8gZG8gbm90IHVzZSBkZXByZWNhdGVkIG1ldGhvZAorICAgIHJldHVybiBtX3Jlc3VsdHMuZ2V0S2V5cygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1N1aXRlUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvU3VpdGVQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzI1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1N1aXRlUGFuZWwuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy51dGlsLlN0cmluZ3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFN1aXRlUGFuZWwgZXh0ZW5kcyBCYXNlUGFuZWwgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU0VEID0gInBhc3NlZCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQUEVEID0gInNraXBwZWQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTEVEID0gImZhaWxlZCI7CisKKyAgcHVibGljIFN1aXRlUGFuZWwoTW9kZWwgbW9kZWwpIHsKKyAgICBzdXBlcihtb2RlbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGUoWE1MU3RyaW5nQnVmZmVyIHhzYikgeworICAgIGZvciAoSVN1aXRlIHN1aXRlIDogZ2V0U3VpdGVzKCkpIHsKKyAgICAgIGdlbmVyYXRlU3VpdGVQYW5lbChzdWl0ZSwgeHNiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTdWl0ZVBhbmVsKElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIHhzYikgeworICAgIFN0cmluZyBkaXZOYW1lID0gc3VpdGVUb1RhZyhzdWl0ZSk7CisgICAgeHNiLnB1c2goRCwgQywgInBhbmVsICIgKyBkaXZOYW1lLCAicGFuZWwtbmFtZSIsICJzdWl0ZS0iICsgZGl2TmFtZSk7CisgICAgU3RyaW5nW10gc3RhdHVzZXMgPSBuZXcgU3RyaW5nW10geyBGQUlMRUQsIFNLSVBQRUQsIFBBU1NFRCB9OworICAgIFJlc3VsdHNCeUNsYXNzW10gcmVzdWx0cyA9IG5ldyBSZXN1bHRzQnlDbGFzc1tdIHsKKyAgICAgICAgZ2V0TW9kZWwoKS5nZXRGYWlsZWRSZXN1bHRzQnlDbGFzcyhzdWl0ZSksCisgICAgICAgIGdldE1vZGVsKCkuZ2V0U2tpcHBlZFJlc3VsdHNCeUNsYXNzKHN1aXRlKSwKKyAgICAgICAgZ2V0TW9kZWwoKS5nZXRQYXNzZWRSZXN1bHRzQnlDbGFzcyhzdWl0ZSksCisgICAgfTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgeworICAgICAgUmVzdWx0c0J5Q2xhc3MgYnlDbGFzcyA9IHJlc3VsdHNbaV07CisgICAgICBmb3IgKENsYXNzPD8+IGMgOiBieUNsYXNzLmdldENsYXNzZXMoKSkgeworICAgICAgICBnZW5lcmF0ZUNsYXNzUGFuZWwoYywgYnlDbGFzcy5nZXRSZXN1bHRzKGMpLCB4c2IsIHN0YXR1c2VzW2ldLCBzdWl0ZSk7CisgICAgICB9CisgICAgfQorICAgIHhzYi5wb3AoRCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDbGFzc1BhbmVsKENsYXNzIGMsIExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMsIFhNTFN0cmluZ0J1ZmZlciB4c2IsCisgICAgICBTdHJpbmcgc3RhdHVzLCBJU3VpdGUgc3VpdGUpIHsKKyAgICB4c2IucHVzaChELCBDLCAic3VpdGUtIiArIHN1aXRlVG9UYWcoc3VpdGUpICsgIi1jbGFzcy0iICsgc3RhdHVzKTsKKyAgICB4c2IucHVzaChELCBDLCAibWFpbi1wYW5lbC1oZWFkZXIgcm91bmRlZC13aW5kb3ctdG9wIik7CisKKyAgICAvLyBQYXNzZWQvZmFpbGVkIGljb24KKyAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJpbWciLCAic3JjIiwgTW9kZWwuZ2V0SW1hZ2Uoc3RhdHVzKSk7CisgICAgeHNiLmFkZE9wdGlvbmFsKFMsIGMuZ2V0TmFtZSgpLCBDLCAiY2xhc3MtbmFtZSIpOworICAgIHhzYi5wb3AoRCk7CisKKyAgICB4c2IucHVzaChELCBDLCAibWFpbi1wYW5lbC1jb250ZW50IHJvdW5kZWQtd2luZG93LWJvdHRvbSIpOworCisgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IHJlc3VsdHMpIHsKKyAgICAgIGdlbmVyYXRlTWV0aG9kKHRyLCB4c2IpOworICAgIH0KKyAgICB4c2IucG9wKEQpOworICAgIHhzYi5wb3AoRCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVNZXRob2QoSVRlc3RSZXN1bHQgdHIsIFhNTFN0cmluZ0J1ZmZlciB4c2IpIHsKKyAgICB4c2IucHVzaChELCBDLCAibWV0aG9kIik7CisgICAgeHNiLnB1c2goRCwgQywgIm1ldGhvZC1jb250ZW50Iik7CisgICAgeHNiLnB1c2goImEiLCAibmFtZSIsIE1vZGVsLmdldFRlc3RSZXN1bHROYW1lKHRyKSk7CisgICAgeHNiLnBvcCgiYSIpOworICAgIHhzYi5hZGRPcHRpb25hbChTLCB0ci5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksIEMsICJtZXRob2QtbmFtZSIpOworCisgICAgLy8gUGFyYW1ldGVycz8KKyAgICBpZiAodHIuZ2V0UGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKE9iamVjdCBwIDogdHIuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgc2IuYXBwZW5kKFV0aWxzLnRvU3RyaW5nKHApKTsKKyAgICAgIH0KKyAgICAgIHhzYi5hZGRPcHRpb25hbChTLCAiKCIgKyBzYi50b1N0cmluZygpICsgIikiLCBDLCAicGFyYW1ldGVycyIpOworICAgIH0KKworICAgIC8vIEV4Y2VwdGlvbj8KKyAgICBpZiAodHIuZ2V0U3RhdHVzKCkgIT0gSVRlc3RSZXN1bHQuU1VDQ0VTUyAmJiB0ci5nZXRUaHJvd2FibGUoKSAhPSBudWxsKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHN0YWNrVHJhY2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgc3RhY2tUcmFjZS5hcHBlbmQoVXRpbHMuc3RhY2tUcmFjZSh0ci5nZXRUaHJvd2FibGUoKSwgdHJ1ZSlbMF0pOworICAgICAgeHNiLmFkZE9wdGlvbmFsKEQsIHN0YWNrVHJhY2UudG9TdHJpbmcoKSArICJcbiIsCisgICAgICAgICAgQywgInN0YWNrLXRyYWNlIik7CisgICAgfQorCisgICAgLy8gRGVzY3JpcHRpb24/CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gdHIuZ2V0TWV0aG9kKCkuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoISBTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZGVzY3JpcHRpb24pKSB7CisgICAgICAgIHhzYi5wdXNoKCJlbSIpOworICAgICAgICB4c2IuYWRkU3RyaW5nKCIoIiArIGRlc2NyaXB0aW9uICsgIikiKTsKKyAgICAgICAgeHNiLnBvcCgiZW0iKTsKKyAgICB9CisvLyAgICBsb25nIHRpbWUgPSB0ci5nZXRFbmRNaWxsaXMoKSAtIHRyLmdldFN0YXJ0TWlsbGlzKCk7CisvLyAgICB4c2IuYWRkT3B0aW9uYWwoUywgIiAiICsgTG9uZy50b1N0cmluZyh0aW1lKSArICIgbXMiLCBDLCAibWV0aG9kLXRpbWUiKTsKKyAgICB4c2IucG9wKEQpOworICAgIHhzYi5wb3AoRCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvVGVzdE5nWG1sUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvVGVzdE5nWG1sUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Y5OGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy9qcS9UZXN0TmdYbWxQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMuanE7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworcHVibGljIGNsYXNzIFRlc3ROZ1htbFBhbmVsIGV4dGVuZHMgQmFzZU11bHRpU3VpdGVQYW5lbCB7CisKKyAgcHVibGljIFRlc3ROZ1htbFBhbmVsKE1vZGVsIG1vZGVsKSB7CisgICAgc3VwZXIobW9kZWwpOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgcmV0dXJuICJ0ZXN0LXhtbC0iOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiBzdWl0ZS5nZXRYbWxTdWl0ZSgpLmdldEZpbGVOYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KElTdWl0ZSBzdWl0ZSwgWE1MU3RyaW5nQnVmZmVyIG1haW4pIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihtYWluLmdldEN1cnJlbnRJbmRlbnQoKSk7CisgICAgeHNiLnB1c2goInByZSIpOworICAgIHhzYi5hZGRTdHJpbmcoVXRpbHMuZXNjYXBlSHRtbChzdWl0ZS5nZXRYbWxTdWl0ZSgpLnRvWG1sKCkpKTsKKyAgICB4c2IucG9wKCJwcmUiKTsKKyAgICByZXR1cm4geHNiLnRvWE1MKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXROYXZpZ2F0b3JMaW5rKElTdWl0ZSBzdWl0ZSkgeworICAgIFN0cmluZyBmcU5hbWUgPSBzdWl0ZS5nZXRYbWxTdWl0ZSgpLmdldEZpbGVOYW1lKCk7CisgICAgaWYgKGZxTmFtZSA9PSBudWxsKSBmcU5hbWUgPSAiL1t1bnNldCBmaWxlIG5hbWVdIjsKKyAgICByZXR1cm4gZnFOYW1lLnN1YnN0cmluZyhmcU5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvVGVzdFBhbmVsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1Rlc3RQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NmJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1Rlc3RQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMuanE7CisKK2ltcG9ydCBvcmcudGVzdG5nLklTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworLyoqCisgKiBEaXNwbGF5IHRoZSBsaXN0IG9mIDx0ZXN0PiB0YWdzLgorICovCitwdWJsaWMgY2xhc3MgVGVzdFBhbmVsIGV4dGVuZHMgQmFzZU11bHRpU3VpdGVQYW5lbCB7CisKKyAgcHVibGljIFRlc3RQYW5lbChNb2RlbCBtb2RlbCkgeworICAgIHN1cGVyKG1vZGVsKTsKKyAgfQorCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgIHJldHVybiAidGVzdGxpc3QtIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihJU3VpdGUgc3VpdGUpIHsKKyAgICByZXR1cm4gIlRlc3RzIGZvciAiICsgc3VpdGUuZ2V0TmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudChJU3VpdGUgc3VpdGUsIFhNTFN0cmluZ0J1ZmZlciBtYWluKSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIobWFpbi5nZXRDdXJyZW50SW5kZW50KCkpOworCisgICAgeHNiLnB1c2goInVsIik7CisgICAgZm9yIChYbWxUZXN0IHRlc3QgOiBzdWl0ZS5nZXRYbWxTdWl0ZSgpLmdldFRlc3RzKCkpIHsKKyAgICAgIHhzYi5wdXNoKCJsaSIpOworICAgICAgaW50IGNvdW50ID0gdGVzdC5nZXRYbWxDbGFzc2VzKCkuc2l6ZSgpOworICAgICAgU3RyaW5nIG5hbWUgPSB0ZXN0LmdldE5hbWUoKSArICIgKCIgKyBwbHVyYWxpemUoY291bnQsICJjbGFzcyIpICsgIikiOworICAgICAgeHNiLmFkZFJlcXVpcmVkKFMsIG5hbWUsIEMsICJ0ZXN0LW5hbWUiKTsKKyAgICAgIHhzYi5wb3AoImxpIik7CisgICAgfQorICAgIHhzYi5wb3AoInVsIik7CisKKyAgICByZXR1cm4geHNiLnRvWE1MKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXROYXZpZ2F0b3JMaW5rKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiBwbHVyYWxpemUoc3VpdGUuZ2V0WG1sU3VpdGUoKS5nZXRUZXN0cygpLnNpemUoKSwgInRlc3QiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICByZXR1cm4gInRlc3Qtc3RhdHMiOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1RpbWVzUGFuZWwuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvanEvVGltZXNQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWQ4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvcmVwb3J0ZXJzL2pxL1RpbWVzUGFuZWwuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlcG9ydGVycy5qcTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFRpbWVzUGFuZWwgZXh0ZW5kcyBCYXNlTXVsdGlTdWl0ZVBhbmVsIHsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb25nPiBtX3RvdGFsVGltZSA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHB1YmxpYyBUaW1lc1BhbmVsKE1vZGVsIG1vZGVsKSB7CisgICAgc3VwZXIobW9kZWwpOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgcmV0dXJuICJ0aW1lcy0iOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKElTdWl0ZSBzdWl0ZSkgeworICAgIHJldHVybiAiVGltZXMgZm9yICIgKyBzdWl0ZS5nZXROYW1lKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBqcyhJU3VpdGUgc3VpdGUpIHsKKyAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gInRhYmxlRGF0YV8iICsgc3VpdGVUb1RhZyhzdWl0ZSk7CisgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigKKyAgICAgICAgInN1aXRlVGFibGVJbml0RnVuY3Rpb25zLnB1c2goJyIgKyBmdW5jdGlvbk5hbWUgKyAiJyk7XG4iCisgICAgICAgICAgKyAiZnVuY3Rpb24gIiArIGZ1bmN0aW9uTmFtZSArICIoKSB7XG4iCisgICAgICAgICAgKyAidmFyIGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7XG4iCisgICAgICAgICAgKyAiZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdOdW1iZXInKTtcbiIKKyAgICAgICAgICArICJkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ01ldGhvZCcpO1xuIgorICAgICAgICAgICsgImRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnQ2xhc3MnKTtcbiIKKyAgICAgICAgICArICJkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1RpbWUgKG1zKScpO1xuIik7CisKKyAgICBMaXN0PElUZXN0UmVzdWx0PiBhbGxUZXN0UmVzdWx0cyA9IGdldE1vZGVsKCkuZ2V0QWxsVGVzdFJlc3VsdHMoc3VpdGUpOworICAgIHJlc3VsdC5hcHBlbmQoCisgICAgICAiZGF0YS5hZGRSb3dzKCIgKyBhbGxUZXN0UmVzdWx0cy5zaXplKCkgKyAiKTtcbiIpOworCisgICAgQ29sbGVjdGlvbnMuc29ydChhbGxUZXN0UmVzdWx0cywgbmV3IENvbXBhcmF0b3I8SVRlc3RSZXN1bHQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSVRlc3RSZXN1bHQgbzEsIElUZXN0UmVzdWx0IG8yKSB7CisgICAgICAgIGxvbmcgdDEgPSBvMS5nZXRFbmRNaWxsaXMoKSAtIG8xLmdldFN0YXJ0TWlsbGlzKCk7CisgICAgICAgIGxvbmcgdDIgPSBvMi5nZXRFbmRNaWxsaXMoKSAtIG8yLmdldFN0YXJ0TWlsbGlzKCk7CisgICAgICAgIHJldHVybiAoaW50KSAodDIgLSB0MSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBhbGxUZXN0UmVzdWx0cykgeworICAgICAgSVRlc3ROR01ldGhvZCBtID0gdHIuZ2V0TWV0aG9kKCk7CisgICAgICBsb25nIHRpbWUgPSB0ci5nZXRFbmRNaWxsaXMoKSAtIHRyLmdldFN0YXJ0TWlsbGlzKCk7CisgICAgICByZXN1bHQKKyAgICAgICAgICAuYXBwZW5kKCJkYXRhLnNldENlbGwoIiArIGluZGV4ICsgIiwgIgorICAgICAgICAgICAgICArICIwLCAiICsgaW5kZXggKyAiKVxuIikKKyAgICAgICAgICAuYXBwZW5kKCJkYXRhLnNldENlbGwoIiArIGluZGV4ICsgIiwgIgorICAgICAgICAgICAgICArICIxLCAnIiArIG0uZ2V0TWV0aG9kTmFtZSgpICsgIicpXG4iKQorICAgICAgICAgIC5hcHBlbmQoImRhdGEuc2V0Q2VsbCgiICsgaW5kZXggKyAiLCAiCisgICAgICAgICAgICAgICsgIjIsICciICsgbS5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJylcbiIpCisgICAgICAgICAgLmFwcGVuZCgiZGF0YS5zZXRDZWxsKCIgKyBpbmRleCArICIsICIKKyAgICAgICAgICAgICAgKyAiMywgIiArIHRpbWUgKyAiKTtcbiIpOworICAgICAgTG9uZyB0b3RhbCA9IG1fdG90YWxUaW1lLmdldChzdWl0ZS5nZXROYW1lKCkpOworICAgICAgaWYgKHRvdGFsID09IG51bGwpIHsKKyAgICAgICAgdG90YWwgPSAwTDsKKyAgICAgIH0KKyAgICAgIG1fdG90YWxUaW1lLnB1dChzdWl0ZS5nZXROYW1lKCksIHRvdGFsICsgdGltZSk7CisgICAgICBpbmRleCsrOworICAgIH0KKworICAgIHJlc3VsdC5hcHBlbmQoCisgICAgICAgICJ3aW5kb3cuc3VpdGVUYWJsZURhdGFbJyIgKyBzdWl0ZVRvVGFnKHN1aXRlKSArICInXSIgKworICAgICAgICAJCSI9IHsgdGFibGVEYXRhOiBkYXRhLCB0YWJsZURpdjogJ3RpbWVzLWRpdi0iICsgc3VpdGVUb1RhZyhzdWl0ZSkgKyAiJ31cbiIKKyAgICAgICAgKyAicmV0dXJuIGRhdGE7XG4iICsKKyAgICAgICAgIn1cbiIpOworCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudChJU3VpdGUgc3VpdGUsIFhNTFN0cmluZ0J1ZmZlciBtYWluKSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIobWFpbi5nZXRDdXJyZW50SW5kZW50KCkpOworICAgIHhzYi5wdXNoKEQsIEMsICJ0aW1lcy1kaXYiKTsKKyAgICB4c2IucHVzaCgic2NyaXB0IiwgInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0Iik7CisgICAgeHNiLmFkZFN0cmluZyhqcyhzdWl0ZSkpOworICAgIHhzYi5wb3AoInNjcmlwdCIpOworICAgIExvbmcgdGltZSA9IG1fdG90YWxUaW1lLmdldChzdWl0ZS5nZXROYW1lKCkpOworICAgIGlmICh0aW1lICE9IG51bGwpIHsKKyAgICAgIHhzYi5hZGRSZXF1aXJlZChTLCBTdHJpbmcuZm9ybWF0KCJUb3RhbCBydW5uaW5nIHRpbWU6ICVzIiwgcHJldHR5RHVyYXRpb24odGltZSkpLAorICAgICAgICAgIEMsICJzdWl0ZS10b3RhbC10aW1lIik7CisgICAgfQorICAgIHhzYi5wdXNoKEQsICJpZCIsICJ0aW1lcy1kaXYtIiArIHN1aXRlVG9UYWcoc3VpdGUpKTsKKyAgICB4c2IucG9wKEQpOworICAgIHhzYi5wb3AoRCk7CisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5RHVyYXRpb24obG9uZyB0b3RhbFRpbWUpIHsKKyAgICBTdHJpbmcgcmVzdWx0OworICAgIGlmICh0b3RhbFRpbWUgPCAxMDAwKSB7CisgICAgICByZXN1bHQgPSB0b3RhbFRpbWUgKyAiIG1zIjsKKyAgICB9IGVsc2UgaWYgKHRvdGFsVGltZSA8IDEwMDAgKiA2MCkgeworICAgICAgcmVzdWx0ID0gKHRvdGFsVGltZSAvIDEwMDApICsgIiBzZWNvbmRzIjsKKyAgICB9IGVsc2UgaWYgKHRvdGFsVGltZSA8IDEwMDAgKiA2MCAqIDYwKSB7CisgICAgICByZXN1bHQgPSAodG90YWxUaW1lIC8gMTAwMCAvIDYwKSArICIgbWludXRlcyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9ICh0b3RhbFRpbWUgLyAxMDAwIC8gNjAgLyA2MCkgKyAiIGhvdXJzIjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hdmlnYXRvckxpbmsoSVN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuICJUaW1lcyI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvdXRpbC9TdGFja1RyYWNlVG9vbHMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy9yZXBvcnRlcnMvdXRpbC9TdGFja1RyYWNlVG9vbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjE3MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3JlcG9ydGVycy91dGlsL1N0YWNrVHJhY2VUb29scy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5yZXBvcnRlcnMudXRpbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKKworLyoqCisgKiBGdW5jdGlvbmFsaXR5IHRvIGFsbG93IHRvb2xzIHRvIGFuYWx5c2UgYW5kIHN1YmRpdmlkZSBzdGFjayB0cmFjZXMuCisgKgorICogQGF1dGhvciBQYXVsIE1lbmRlbHNvbgorICogQHNpbmNlIDUuMworICogQHZlcnNpb24gJFJldmlzaW9uOiAxNzMgJAorICovCitwdWJsaWMgY2xhc3MgU3RhY2tUcmFjZVRvb2xzIHsKKyAgLy8gfiBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqIEZpbmRzIHRvcG1vc3QgcG9zaXRpb24gb2YgdGhlIHRlc3QgbWV0aG9kIGluIHRoZSBzdGFjaywgb3IgdG9wIG9mIHN0YWNrIGlmIDxjb2RlPm1ldGhvZDwvY29kZT4gaXMgbm90IGluIGl0LiAqLworICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXN0Um9vdChTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrLElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgaWYoc3RhY2shPW51bGwpIHsKKyAgICAgIFN0cmluZyBjbmFtZSA9IG1ldGhvZC5nZXRUZXN0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICBmb3IoaW50IHg9c3RhY2subGVuZ3RoLTE7IHg+PTA7IHgtLSkgeworICAgICAgICBpZihjbmFtZS5lcXVhbHMoc3RhY2tbeF0uZ2V0Q2xhc3NOYW1lKCkpCisgICAgICAgICAgICAmJiBtZXRob2QuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscyhzdGFja1t4XS5nZXRNZXRob2ROYW1lKCkpKSB7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGFjay5sZW5ndGgtMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8qKiBGaW5kcyB0b3Btb3N0IHBvc2l0aW9uIG9mIHRoZSB0ZXN0IG1ldGhvZCBpbiB0aGUgc3RhY2ssIG9yIHRvcCBvZiBzdGFjayBpZiA8Y29kZT5tZXRob2Q8L2NvZGU+IGlzIG5vdCBpbiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBTdGFja1RyYWNlRWxlbWVudFtdIGdldFRlc3ROR0luc3RyYXN0cnVjdHVyZShTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrLElUZXN0TkdNZXRob2QgbWV0aG9kKSB7CisgICAgaW50IHNsb3Q9U3RhY2tUcmFjZVRvb2xzLmdldFRlc3RSb290KHN0YWNrLCBtZXRob2QpOworICAgIGlmKHNsb3Q+PTApIHsKKyAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gcj1uZXcgU3RhY2tUcmFjZUVsZW1lbnRbc3RhY2subGVuZ3RoLXNsb3RdOworICAgICAgZm9yKGludCB4PTA7IHg8ci5sZW5ndGg7IHgrKykgeworICAgICAgICByW3hdPXN0YWNrW3grc2xvdF07CisgICAgICB9CisgICAgICByZXR1cm4gcjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBTdGFja1RyYWNlRWxlbWVudFswXTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy91dGlsL1JldHJ5QW5hbHl6ZXJDb3VudC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3V0aWwvUmV0cnlBbmFseXplckNvdW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM5NDlmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy91dGlsL1JldHJ5QW5hbHl6ZXJDb3VudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JUmV0cnlBbmFseXplcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsNCisNCisvKioNCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJUmV0cnlBbmFseXplciB0aGF0IGFsbG93cyB5b3UgdG8gc3BlY2lmeQ0KKyAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB5b3Ugd2FudCB5b3VyIHRlc3QgdG8gYmUgcmV0cmllZC4NCisgKg0KKyAqIEBhdXRob3IgdG9jbWFuQGdtYWlsLmNvbSAoSmVyZW1pZSBMZW5mYW50LUVuZ2VsbWFubikNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmV0cnlBbmFseXplckNvdW50IGltcGxlbWVudHMgSVJldHJ5QW5hbHl6ZXIgew0KKw0KKyAgLy8gRGVmYXVsdCByZXRyeSBvbmNlLg0KKyAgQXRvbWljSW50ZWdlciBjb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOw0KKw0KKyAgLyoqDQorICAgKiBTZXQgdGhlIG1heCBudW1iZXIgb2YgdGltZSB0aGUgbWV0aG9kIG5lZWRzIHRvIGJlIHJldHJpZWQuDQorICAgKi8NCisgIHByb3RlY3RlZCB2b2lkIHNldENvdW50KGludCBjb3VudCkgew0KKyAgICB0aGlzLmNvdW50LnNldChjb3VudCk7DQorICB9DQorDQorICAvKioNCisgICAqIFJldHVybiB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlDQorICAgKi8NCisgIHByb3RlY3RlZCBpbnQgZ2V0Q291bnQoKXsNCisgICAgICByZXR1cm4gdGhpcy5jb3VudC5nZXQoKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0cmllcyB0aGUgdGVzdCBpZiBjb3VudCBpcyBub3QgMC4NCisgICAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4NCisgICAqLw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiByZXRyeShJVGVzdFJlc3VsdCByZXN1bHQpIHsNCisgICAgaWYgKGNvdW50LmdldEFuZERlY3JlbWVudCgpID4gMCkgew0KKyAgICAgIHJldHVybiByZXRyeU1ldGhvZChyZXN1bHQpOw0KKyAgICB9DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogVGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MgdGhhdCB0ZXN0IGlmIHRoZSB0ZXN0DQorICAgKiBtdXN0IGJlIHJldHJpZWQgb3Igbm90Lg0KKyAgICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0IG9mIHRoZSB0ZXN0Lg0KKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0ZXN0IG11c3QgYmUgcmV0cmllZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAgICovDQorICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZXRyeU1ldGhvZChJVGVzdFJlc3VsdCByZXN1bHQpOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvdXRpbC9TdHJpbmdzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcvdXRpbC9TdHJpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0YmM5OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy91dGlsL1N0cmluZ3MuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcudXRpbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFN0cmluZ3MgeworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgc3RyaW5nKSB7CisgICAgcmV0dXJuIHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwOyAvLyBzdHJpbmcuaXNFbXB0eSgpIGluIEphdmEgNgorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IEVTQ0FQRV9IVE1MX0xJU1QgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgIiYiLCAiJmFtcDsiLAorICAgICI8IiwgIiZsdDsiLAorICAgICI+IiwgIiZndDsiCisgICk7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IEVTQ0FQRV9IVE1MX01BUCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworCisgIHN0YXRpYyB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFU0NBUEVfSFRNTF9MSVNULnNpemUoKTsgaSArPSAyKSB7CisgICAgICBFU0NBUEVfSFRNTF9NQVAucHV0KEVTQ0FQRV9IVE1MX0xJU1QuZ2V0KGkpLCBFU0NBUEVfSFRNTF9MSVNULmdldChpICsgMSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUh0bWwoU3RyaW5nIHRleHQpIHsKKyAgICBTdHJpbmcgcmVzdWx0ID0gdGV4dDsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBFU0NBUEVfSFRNTF9NQVAuZW50cnlTZXQoKSkgeworICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbihlc2NhcGVIdG1sKCIxMCA8IDIwICYmIDMwID4gMjAiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvSUZpbGVQYXJzZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvSUZpbGVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThiYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9JRmlsZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK3B1YmxpYyBpbnRlcmZhY2UgSUZpbGVQYXJzZXI8VD4geworCisgIFQgcGFyc2UoU3RyaW5nIGZpbGVQYXRoLCBJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBsb2FkQ2xhc3NlcykgdGhyb3dzIFRlc3ROR0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9JUG9zdFByb2Nlc3Nvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9JUG9zdFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODJmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL0lQb3N0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIFVzZWQgYnkgUGFyc2VyIHRvIHBlcmZvcm0gY2hhbmdlcyBvbiBhbiBYTUwgc3VpdGUgYWZ0ZXIgaXQncyBiZWVuIHBhcnNlZC4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworcHVibGljIGludGVyZmFjZSBJUG9zdFByb2Nlc3NvciB7CisKKyAgQ29sbGVjdGlvbjxYbWxTdWl0ZT4gcHJvY2VzcyhDb2xsZWN0aW9uPFhtbFN1aXRlPiBzdWl0ZXMpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL0lTdWl0ZVBhcnNlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9JU3VpdGVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM3ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9JU3VpdGVQYXJzZXIuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVN1aXRlUGFyc2VyIGV4dGVuZHMgSUZpbGVQYXJzZXI8WG1sU3VpdGU+IHsKKworICBib29sZWFuIGFjY2VwdChTdHJpbmcgZmlsZU5hbWUpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9MYXVuY2hTdWl0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9MYXVuY2hTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmNDU2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL0xhdW5jaFN1aXRlLmphdmEKQEAgLTAsMCArMSw0MzkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzLmlzU3RyaW5nTm90Qmxhbms7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5sb2c0dGVzdG5nLkxvZ2dlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5SZW1vdGVUZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSBhIGxhdW5jaC4gVmFyaW91cyBzeW50aGV0aWMgWE1MIGZpbGVzIGFyZSBjcmVhdGVkCisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbGF1bmNoIGEgc3VpdGUsIGEgY2xhc3MsIGEgbWV0aG9kLCBldGMuLi4gCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXVuY2hTdWl0ZSB7CisgIC8qKiBUaGlzIGNsYXNzJ3MgbG9nNHRlc3RuZyBMb2dnZXIuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExhdW5jaFN1aXRlLmNsYXNzKTsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBtX3RlbXBvcmFyeTsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIDxjb2RlPkxhdW5jaFN1aXRlPC9jb2RlPgorICAgKgorICAgKiBAcGFyYW0gaXNUZW1wIHRoZSB0ZW1wb3Jhcnkgc3RhdHVzCisgICAqLworICBwcm90ZWN0ZWQgTGF1bmNoU3VpdGUoYm9vbGVhbiBpc1RlbXApIHsKKyAgICBtX3RlbXBvcmFyeSA9IGlzVGVtcDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB0ZW1wb3Jhcnkgc3RhdGUuCisgICAqIEByZXR1cm4gdGhlIHRlbXBvcmFyeSBzdGF0ZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzVGVtcG9yYXJ5KCkgeworICAgIHJldHVybiBtX3RlbXBvcmFyeTsKKyAgfQorCisgIC8qKgorICAgKiBTYXZlcyB0aGUgc3VpdGUgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgZmlsZQorICAgKiBwYXRobmFtZS4KKyAgICoKKyAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzdWl0ZSBmaWxlIGlzIHRvIGJlIHNhdmVkLgorICAgKiBAcmV0dXJuIHRoZSBmaWxlIHBhdGhuYW1lIG9mIHRoZSBzYXZlZCBmaWxlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IEZpbGUgc2F2ZShGaWxlIGRpcmVjdG9yeSk7CisKKyAgcHVibGljIGFic3RyYWN0IFhNTFN0cmluZ0J1ZmZlciBnZXRTdWl0ZUJ1ZmZlcigpOworCisgIC8qKgorICAgKiA8Y29kZT5FeGlzdGluZ1N1aXRlPC9jb2RlPiBpcyBhIG5vbi10ZW1wb3JhcnkgTGF1bmNoU3VpdGUgYmFzZWQgb24gYW4gZXhpc3RpbmcKKyAgICogZmlsZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhpc3RpbmdTdWl0ZSBleHRlbmRzIExhdW5jaFN1aXRlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBleGlzdGluZyBzdWl0ZSBwYXRoIChlaXRoZXIgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdCBvciBhbiBhYnNvbHV0ZSBwYXRoKQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBtX3N1aXRlUGF0aDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5FeGlzdGluZ1N1aXRlPC9jb2RlPiBiYXNlZCBvbiBhbiBleGlzdGluZyBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZXhpc3RpbmcgTGF1bmNoIHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyBFeGlzdGluZ1N1aXRlKEZpbGUgcGF0aCkgeworICAgICAgc3VwZXIoZmFsc2UpOworCisgICAgICBtX3N1aXRlUGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlciBnZXRTdWl0ZUJ1ZmZlcigpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeWluZyB0byBydW4gYW4gZXhpc3RpbmcgWE1MIGZpbGU6IGNvcHkgaXRzIGNvbnRlbnQgdG8gd2hlcmUgdGhlIHBsdWctaW4KKyAgICAgKiBleHBlY3RzIGl0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlIHNhdmUoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgIGlmIChSZW1vdGVUZXN0TkcuaXNEZWJ1ZygpKSB7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBSZW1vdGVUZXN0TkcuREVCVUdfU1VJVEVfRklMRSk7CisgICAgICAgIFV0aWxzLmNvcHlGaWxlKG1fc3VpdGVQYXRoLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1fc3VpdGVQYXRoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiA8Y29kZT5DdXN0b21pemVkU3VpdGU8L2NvZGU+IFRPRE8gY3F1ZXplbCBKYXZhRG9jLgorICAgKi8KKyAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ3VzdG9taXplZFN1aXRlIGV4dGVuZHMgTGF1bmNoU3VpdGUgeworICAgIHByb3RlY3RlZCBTdHJpbmcgbV9wcm9qZWN0TmFtZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1fc3VpdGVOYW1lOworCisgICAgLyoqIFRoZSBhbm5vdGF0aW9uIHR5cGUuIE1heSBiZSBudWxsLiAqLworICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1fcGFyYW1ldGVyczsKKworICAgIC8qKiBUaGUgc3RyaW5nIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRoZSBYTUwgZmlsZS4gKi8KKyAgICBwcml2YXRlIFhNTFN0cmluZ0J1ZmZlciBtX3N1aXRlQnVmZmVyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPkN1c3RvbWl6ZWRTdWl0ZTwvY29kZT4gVE9ETyBjcXVlemVsIEphdmFEb2MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIEN1c3RvbWl6ZWRTdWl0ZShmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKKyAgICAgICAgZmluYWwgU3RyaW5nIGFubm90YXRpb25UeXBlKQorICAgIHsKKyAgICAgIHN1cGVyKHRydWUpOworCisgICAgICBtX3Byb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisgICAgICBtX3N1aXRlTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBjcXVlemVsIEphdmFEb2MKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWE1MU3RyaW5nQnVmZmVyIGNyZWF0ZUNvbnRlbnRCdWZmZXIoKSB7CisgICAgICBYTUxTdHJpbmdCdWZmZXIgc3VpdGVCdWZmZXIgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKCk7CisgICAgICBzdWl0ZUJ1ZmZlci5zZXREb2NUeXBlKCJzdWl0ZSBTWVNURU0gXCIiICsgUGFyc2VyLlRFU1ROR19EVERfVVJMICsgIlwiIik7CisKKyAgICAgIFByb3BlcnRpZXMgYXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgYXR0cnMuc2V0UHJvcGVydHkoInBhcmFsbGVsIiwgWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk5PTkUudG9TdHJpbmcoKSk7CisgICAgICBhdHRycy5zZXRQcm9wZXJ0eSgibmFtZSIsIG1fc3VpdGVOYW1lKTsKKyAgICAgIHN1aXRlQnVmZmVyLnB1c2goInN1aXRlIiwgYXR0cnMpOworCisgICAgICBpZiAobV9wYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbV9wYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIHBhcmFtQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgIHBhcmFtQXR0cnMuc2V0UHJvcGVydHkoIm5hbWUiLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgcGFyYW1BdHRycy5zZXRQcm9wZXJ0eSgidmFsdWUiLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICBzdWl0ZUJ1ZmZlci5wdXNoKCJwYXJhbWV0ZXIiLCBwYXJhbUF0dHJzKTsKKyAgICAgICAgICBzdWl0ZUJ1ZmZlci5wb3AoInBhcmFtZXRlciIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluaXRDb250ZW50QnVmZmVyKHN1aXRlQnVmZmVyKTsKKworICAgICAgc3VpdGVCdWZmZXIucG9wKCJzdWl0ZSIpOworCisgICAgICByZXR1cm4gc3VpdGVCdWZmZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBjcXVlemVsIEphdmFEb2MKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgWE1MU3RyaW5nQnVmZmVyIGdldFN1aXRlQnVmZmVyKCkgeworICAgICAgaWYgKG51bGwgPT0gbV9zdWl0ZUJ1ZmZlcikgeworICAgICAgICBtX3N1aXRlQnVmZmVyID0gY3JlYXRlQ29udGVudEJ1ZmZlcigpOworICAgICAgfQorCisgICAgICByZXR1cm4gbV9zdWl0ZUJ1ZmZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgY29udGVudCBvZiB0aGUgeG1sIHN0cmluZyBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VpdGVCdWZmZXIgdGhlIHN0cmluZyBidWZmZXIgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29udGVudEJ1ZmZlcihYTUxTdHJpbmdCdWZmZXIgc3VpdGVCdWZmZXIpOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfSBUaGlzIGltcGxlbWVudGF0aW9uIHNhdmVzIHRoZSBzdWl0ZSB0byB0aGUgInRlbXAtdGVzdG5nLWN1c3RvbXN1aXRlLnhtbCIKKyAgICAgKiBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlIHNhdmUoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgIGZpbmFsIEZpbGUgc3VpdGVGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAidGVtcC10ZXN0bmctY3VzdG9tc3VpdGUueG1sIik7CisKKyAgICAgIHNhdmVTdWl0ZUNvbnRlbnQoc3VpdGVGaWxlLCBnZXRTdWl0ZUJ1ZmZlcigpKTsKKworICAgICAgcmV0dXJuIHN1aXRlRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nIGJ1ZmZlciB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudCB0byB3cml0ZSB0byB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlU3VpdGVDb250ZW50KGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgWE1MU3RyaW5nQnVmZmVyIGNvbnRlbnQpIHsKKworICAgICAgdHJ5IHsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmdy53cml0ZShjb250ZW50LmdldFN0cmluZ0J1ZmZlcigpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgLy8gVE9ETyBDUSBpcyB0aGlzIG5vcm1hbCB0byBzd2FsbG93IGV4Y2VwdGlvbiBoZXJlCisgICAgICAgIExPR0dFUi5lcnJvcigiSU8gRXhjZXB0aW9uIiwgaW9lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSA8Y29kZT5NZXRob2RzU3VpdGU8L2NvZGU+IGlzIGEgc3VpdGUgbWFkZSB1cCBvZiBtZXRob2RzLgorICAgKi8KKyAgc3RhdGljIGNsYXNzIE1ldGhvZHNTdWl0ZSBleHRlbmRzIEN1c3RvbWl6ZWRTdWl0ZSB7CisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBtX21ldGhvZE5hbWVzOworICAgIHByb3RlY3RlZCBTdHJpbmcgbV9jbGFzc05hbWU7CisgICAgcHJvdGVjdGVkIGludCBtX2xvZ0xldmVsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPk1ldGhvZHNTdWl0ZTwvY29kZT4gVE9ETyBjcXVlemVsIEphdmFEb2MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWVzCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUgKG1heSBiZSBudWxsKQorICAgICAqIEBwYXJhbSBsb2dMZXZlbAorICAgICAqLworICAgIE1ldGhvZHNTdWl0ZShmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBtZXRob2ROYW1lcywKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAorICAgICAgICBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblR5cGUsCisgICAgICAgIGZpbmFsIGludCBsb2dMZXZlbCkgeworICAgICAgc3VwZXIocHJvamVjdE5hbWUsIGNsYXNzTmFtZSwgcGFyYW1ldGVycywgYW5ub3RhdGlvblR5cGUpOworCisgICAgICBtX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgIG1fbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lczsKKyAgICAgIG1fbG9nTGV2ZWwgPSBsb2dMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRCdWZmZXIoWE1MU3RyaW5nQnVmZmVyIHN1aXRlQnVmZmVyKSB7CisgICAgICBQcm9wZXJ0aWVzIHRlc3RBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICB0ZXN0QXR0cnMuc2V0UHJvcGVydHkoIm5hbWUiLCBtX2NsYXNzTmFtZSk7CisgICAgICB0ZXN0QXR0cnMuc2V0UHJvcGVydHkoInZlcmJvc2UiLCBTdHJpbmcudmFsdWVPZihtX2xvZ0xldmVsKSk7CisKKyAgICAgIHN1aXRlQnVmZmVyLnB1c2goInRlc3QiLCB0ZXN0QXR0cnMpOworCisgICAgICBzdWl0ZUJ1ZmZlci5wdXNoKCJjbGFzc2VzIik7CisKKyAgICAgIFByb3BlcnRpZXMgY2xhc3NBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICBjbGFzc0F0dHJzLnNldFByb3BlcnR5KCJuYW1lIiwgbV9jbGFzc05hbWUpOworCisgICAgICBpZiAoKG51bGwgIT0gbV9tZXRob2ROYW1lcykgJiYgKG1fbWV0aG9kTmFtZXMuc2l6ZSgpID4gMCkpIHsKKyAgICAgICAgc3VpdGVCdWZmZXIucHVzaCgiY2xhc3MiLCBjbGFzc0F0dHJzKTsKKworICAgICAgICBzdWl0ZUJ1ZmZlci5wdXNoKCJtZXRob2RzIik7CisKKyAgICAgICAgZm9yIChPYmplY3QgbWV0aG9kTmFtZSA6IG1fbWV0aG9kTmFtZXMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIG1ldGhvZEF0dHJzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICBtZXRob2RBdHRycy5zZXRQcm9wZXJ0eSgibmFtZSIsIChTdHJpbmcpIG1ldGhvZE5hbWUpOworICAgICAgICAgIHN1aXRlQnVmZmVyLmFkZEVtcHR5RWxlbWVudCgiaW5jbHVkZSIsIG1ldGhvZEF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgibWV0aG9kcyIpOworICAgICAgICBzdWl0ZUJ1ZmZlci5wb3AoImNsYXNzIik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgc3VpdGVCdWZmZXIuYWRkRW1wdHlFbGVtZW50KCJjbGFzcyIsIGNsYXNzQXR0cnMpOworICAgICAgfQorICAgICAgc3VpdGVCdWZmZXIucG9wKCJjbGFzc2VzIik7CisgICAgICBzdWl0ZUJ1ZmZlci5wb3AoInRlc3QiKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgQ2xhc3Nlc0FuZE1ldGhvZHNTdWl0ZSBleHRlbmRzIEN1c3RvbWl6ZWRTdWl0ZSB7CisgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gbV9jbGFzc2VzOworICAgIHByb3RlY3RlZCBpbnQgbV9sb2dMZXZlbDsKKworICAgIENsYXNzZXNBbmRNZXRob2RzU3VpdGUoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLAorICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGNsYXNzZXMsCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKKyAgICAgICAgZmluYWwgU3RyaW5nIGFubm90YXRpb25UeXBlLAorICAgICAgICBmaW5hbCBpbnQgbG9nTGV2ZWwpIHsKKyAgICAgIHN1cGVyKHByb2plY3ROYW1lLCAiQ3VzdG9tIHN1aXRlIiwgcGFyYW1ldGVycywgYW5ub3RhdGlvblR5cGUpOworICAgICAgbV9jbGFzc2VzID0gY2xhc3NlczsKKyAgICAgIG1fbG9nTGV2ZWwgPSBsb2dMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRCdWZmZXIoWE1MU3RyaW5nQnVmZmVyIHN1aXRlQnVmZmVyKSB7CisgICAgICBQcm9wZXJ0aWVzIHRlc3RBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICB0ZXN0QXR0cnMuc2V0UHJvcGVydHkoIm5hbWUiLCBtX3Byb2plY3ROYW1lKTsKKyAgICAgIHRlc3RBdHRycy5zZXRQcm9wZXJ0eSgidmVyYm9zZSIsIFN0cmluZy52YWx1ZU9mKG1fbG9nTGV2ZWwpKTsKKworICAgICAgc3VpdGVCdWZmZXIucHVzaCgidGVzdCIsIHRlc3RBdHRycyk7CisKKyAgICAgIHN1aXRlQnVmZmVyLnB1c2goImNsYXNzZXMiKTsKKworICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gZW50cnkgOiBtX2NsYXNzZXMuZW50cnlTZXQoKSkgeworICAgICAgICBQcm9wZXJ0aWVzIGNsYXNzQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjbGFzc0F0dHJzLnNldFByb3BlcnR5KCJuYW1lIiwgZW50cnkuZ2V0S2V5KCkpOworCisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBtZXRob2ROYW1lcz0gc2FuaXRpemUoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGlmICgobnVsbCAhPSBtZXRob2ROYW1lcykgJiYgKG1ldGhvZE5hbWVzLnNpemUoKSA+IDApKSB7CisgICAgICAgICAgc3VpdGVCdWZmZXIucHVzaCgiY2xhc3MiLCBjbGFzc0F0dHJzKTsKKworICAgICAgICAgIHN1aXRlQnVmZmVyLnB1c2goIm1ldGhvZHMiKTsKKworICAgICAgICAgIGZvciAoU3RyaW5nIG1ldGhvZE5hbWUgOiBtZXRob2ROYW1lcykgeworICAgICAgICAgICAgUHJvcGVydGllcyBtZXRob2RBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBtZXRob2RBdHRycy5zZXRQcm9wZXJ0eSgibmFtZSIsIG1ldGhvZE5hbWUpOworICAgICAgICAgICAgc3VpdGVCdWZmZXIuYWRkRW1wdHlFbGVtZW50KCJpbmNsdWRlIiwgbWV0aG9kQXR0cnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgibWV0aG9kcyIpOworICAgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgiY2xhc3MiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzdWl0ZUJ1ZmZlci5hZGRFbXB0eUVsZW1lbnQoImNsYXNzIiwgY2xhc3NBdHRycyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN1aXRlQnVmZmVyLnBvcCgiY2xhc3NlcyIpOworICAgICAgc3VpdGVCdWZmZXIucG9wKCJ0ZXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc2FuaXRpemUoQ29sbGVjdGlvbjxTdHJpbmc+IHNvdXJjZSkgeworICAgICAgaWYobnVsbCA9PSBzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQ9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yKFN0cmluZyBuYW1lOiBzb3VyY2UpIHsKKyAgICAgICAgaWYoaXNTdHJpbmdOb3RCbGFuayhuYW1lKSkgeworICAgICAgICAgIHJlc3VsdC5hZGQobmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogPGNvZGU+Q2xhc3NMaXN0U3VpdGU8L2NvZGU+IFRPRE8gY3F1ZXplbCBKYXZhRG9jLgorICAgKi8KKyAgc3RhdGljIGNsYXNzIENsYXNzTGlzdFN1aXRlIGV4dGVuZHMgQ3VzdG9taXplZFN1aXRlIHsKKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IG1fcGFja2FnZU5hbWVzOworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gbV9jbGFzc05hbWVzOworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gbV9ncm91cE5hbWVzOworICAgIHByb3RlY3RlZCBpbnQgbV9sb2dMZXZlbDsKKworICAgIENsYXNzTGlzdFN1aXRlKGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2thZ2VOYW1lcywKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBncm91cE5hbWVzLAorICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsCisgICAgICAgIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uVHlwZSwKKyAgICAgICAgZmluYWwgaW50IGxvZ0xldmVsKSB7CisgICAgICBzdXBlcihwcm9qZWN0TmFtZSwgIkN1c3RvbSBzdWl0ZSIsIHBhcmFtZXRlcnMsIGFubm90YXRpb25UeXBlKTsKKworICAgICAgbV9wYWNrYWdlTmFtZXMgPSBwYWNrYWdlTmFtZXM7CisgICAgICBtX2NsYXNzTmFtZXMgPSBjbGFzc05hbWVzOworICAgICAgbV9ncm91cE5hbWVzID0gZ3JvdXBOYW1lczsKKyAgICAgIG1fbG9nTGV2ZWwgPSBsb2dMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRCdWZmZXIoWE1MU3RyaW5nQnVmZmVyIHN1aXRlQnVmZmVyKSB7CisgICAgICBQcm9wZXJ0aWVzIHRlc3RBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICB0ZXN0QXR0cnMuc2V0UHJvcGVydHkoIm5hbWUiLCBtX3Byb2plY3ROYW1lKTsKKyAgICAgIHRlc3RBdHRycy5zZXRQcm9wZXJ0eSgidmVyYm9zZSIsIFN0cmluZy52YWx1ZU9mKG1fbG9nTGV2ZWwpKTsKKworICAgICAgc3VpdGVCdWZmZXIucHVzaCgidGVzdCIsIHRlc3RBdHRycyk7CisKKyAgICAgIGlmIChudWxsICE9IG1fZ3JvdXBOYW1lcykgeworICAgICAgICBzdWl0ZUJ1ZmZlci5wdXNoKCJncm91cHMiKTsKKyAgICAgICAgc3VpdGVCdWZmZXIucHVzaCgicnVuIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBOYW1lIDogbV9ncm91cE5hbWVzKSB7CisgICAgICAgICAgUHJvcGVydGllcyBpbmNsdWRlQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgIGluY2x1ZGVBdHRycy5zZXRQcm9wZXJ0eSgibmFtZSIsIGdyb3VwTmFtZSk7CisgICAgICAgICAgc3VpdGVCdWZmZXIuYWRkRW1wdHlFbGVtZW50KCJpbmNsdWRlIiwgaW5jbHVkZUF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgicnVuIik7CisgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgiZ3JvdXBzIik7CisgICAgICB9CisKKyAgICAgIC8vIHBhY2thZ2VzIGJlbG9uZ3MgdG8gc3VpdGUgYWNjb3JkaW5nIHRvIHRoZSBsYXRlc3QgRFRECisgICAgICBpZiAoKG1fcGFja2FnZU5hbWVzICE9IG51bGwpICYmIChtX3BhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSkgeworICAgICAgICBzdWl0ZUJ1ZmZlci5wdXNoKCJwYWNrYWdlcyIpOworCisgICAgICAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lIDogbV9wYWNrYWdlTmFtZXMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIHBhY2thZ2VBdHRycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgcGFja2FnZUF0dHJzLnNldFByb3BlcnR5KCJuYW1lIiwgcGFja2FnZU5hbWUpOworICAgICAgICAgIHN1aXRlQnVmZmVyLmFkZEVtcHR5RWxlbWVudCgicGFja2FnZSIsIHBhY2thZ2VBdHRycyk7CisgICAgICAgIH0KKyAgICAgICAgc3VpdGVCdWZmZXIucG9wKCJwYWNrYWdlcyIpOworICAgICAgfQorCisgICAgICBpZiAoKG1fY2xhc3NOYW1lcyAhPSBudWxsKSAmJiAobV9jbGFzc05hbWVzLnNpemUoKSA+IDApKSB7CisgICAgICAgIHN1aXRlQnVmZmVyLnB1c2goImNsYXNzZXMiKTsKKworICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtX2NsYXNzTmFtZXMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIGNsYXNzQXR0cnMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgIGNsYXNzQXR0cnMuc2V0UHJvcGVydHkoIm5hbWUiLCBjbGFzc05hbWUpOworICAgICAgICAgIHN1aXRlQnVmZmVyLmFkZEVtcHR5RWxlbWVudCgiY2xhc3MiLCBjbGFzc0F0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1aXRlQnVmZmVyLnBvcCgiY2xhc3NlcyIpOworICAgICAgfQorICAgICAgc3VpdGVCdWZmZXIucG9wKCJ0ZXN0Iik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1BhcmFtZXRlcnMuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvUGFyYW1ldGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzk5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1BhcmFtZXRlcnMuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0TXVsdGlNYXA7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBob2xkZXIgY2xhc3MgZm9yIHBhcmFtZXRlcnMgZGVmaW5lZCBqdXN0IGluIHRoaXMgdGFnIGFuZCBhbGwgcGFyYW1ldGVycworICogaW5jbHVkaW5nIHRoZSBvbmVzIGluaGVyaXRlZCBmcm9tIGVuY2xvc2luZyB0YWdzLgorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVycyB7CisKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1fbG9jYWxQYXJhbWV0ZXJzID0gTWFwcy5uZXdMaXN0TXVsdGlNYXAoKTsKKyAgcHJpdmF0ZSBMaXN0TXVsdGlNYXA8U3RyaW5nLCBTdHJpbmc+IG1fYWxsUGFyYW1ldGVycyA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRMb2NhbFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBtX2xvY2FsUGFyYW1ldGVycy5nZXQobmFtZSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbFZhbHVlcyhTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBtX2FsbFBhcmFtZXRlcnMuZ2V0KG5hbWUpOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBtX2xvY2FsUGFyYW1ldGVycy5nZXQobmFtZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRMb2NhbFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgbV9sb2NhbFBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICBtX2FsbFBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEFsbFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgbV9hbGxQYXJhbWV0ZXJzLnB1dChuYW1lLCB2YWx1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvUGFyc2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViZTQzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2VydmljZUxvYWRlcjsKKworLyoqCisgKiA8Y29kZT5QYXJzZXI8L2NvZGU+IGlzIGEgcGFyc2VyIGZvciBhIFRlc3RORyBYTUwgdGVzdCBzdWl0ZSBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VyIHsKKworICAvKiogVGhlIG5hbWUgb2YgdGhlIFRlc3RORyBEVEQuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1ROR19EVEQgPSAidGVzdG5nLTEuMC5kdGQiOworCisgIC8qKiBUaGUgVVJMIHRvIHRoZSBkZXByZWNhdGVkIFRlc3RORyBEVEQuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUFJFQ0FURURfVEVTVE5HX0RURF9VUkwgPSAiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvIiArIFRFU1ROR19EVEQ7CisKKyAgLyoqIFRoZSBVUkwgdG8gdGhlIFRlc3RORyBEVEQuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1ROR19EVERfVVJMID0gImh0dHA6Ly90ZXN0bmcub3JnLyIgKyBURVNUTkdfRFREOworCisgIC8qKiBUaGUgZGVmYXVsdCBmaWxlIG5hbWUgZm9yIHRoZSBUZXN0TkcgdGVzdCBzdWl0ZSBpZiBub25lIGlzIHNwZWNpZmllZCAodGVzdG5nLnhtbCkuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRklMRU5BTUUgPSAidGVzdG5nLnhtbCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN1aXRlUGFyc2VyIERFRkFVTFRfRklMRV9QQVJTRVIgPSBuZXcgU3VpdGVYbWxQYXJzZXIoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxJU3VpdGVQYXJzZXI+IFBBUlNFUlMgPSBMaXN0cy5uZXdBcnJheUxpc3QoREVGQVVMVF9GSUxFX1BBUlNFUik7CisgIHN0YXRpYyB7CisgICAgU2VydmljZUxvYWRlcjxJU3VpdGVQYXJzZXI+IHN1aXRlUGFyc2VyTG9hZGVyID0gU2VydmljZUxvYWRlci5sb2FkKElTdWl0ZVBhcnNlci5jbGFzcyk7CisgICAgZm9yIChJU3VpdGVQYXJzZXIgcGFyc2VyIDogc3VpdGVQYXJzZXJMb2FkZXIpIHsKKyAgICAgIFBBUlNFUlMuYWRkKHBhcnNlcik7CisgICAgfQorICB9CisKKyAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIHhtbCBzdWl0ZSBiZWluZyBwYXJzZWQuIFRoaXMgbWF5IGJlIG51bGwgaWYgdGhlIFBhcnNlcgorICAgKiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhIGZpbGUgbmFtZS4gVE9ETyBDUSBUaGlzIG1lbWJlciBpcyBuZXZlciB1c2VkLiAqLworICBwcml2YXRlIFN0cmluZyBtX2ZpbGVOYW1lOworCisgIHByaXZhdGUgSW5wdXRTdHJlYW0gbV9pbnB1dFN0cmVhbTsKKyAgcHJpdmF0ZSBJUG9zdFByb2Nlc3NvciBtX3Bvc3RQcm9jZXNzb3I7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1fbG9hZENsYXNzZXMgPSB0cnVlOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+UGFyc2VyPC9jb2RlPiB0byB1c2UgdGhlIGlucHV0U3RyZWFtIGFzIHRoZSBzb3VyY2Ugb2YKKyAgICogdGhlIHhtbCB0ZXN0IHN1aXRlIHRvIHBhcnNlLgorICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGVuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0U3RyZWFtIG9yIG51bGwgaWYKKyAgICogdW5rbm93bi4KKyAgICovCisgIHB1YmxpYyBQYXJzZXIoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgaW5pdChmaWxlTmFtZSwgbnVsbCwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHBhcnNlciB0aGF0IHdpbGwgdHJ5IHRvIGZpbmQgdGhlIERFRkFVTFRfRklMRU5BTUUgZnJvbSB0aGUgamFyLgorICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgREVGQVVMVF9GSUxFTkFNRSByZXNvdXJjZSBpcyBub3QKKyAgICogZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICovCisgIHB1YmxpYyBQYXJzZXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBpbml0KG51bGwsIG51bGwsIG51bGwpOworICB9CisKKyAgcHVibGljIFBhcnNlcihJbnB1dFN0cmVhbSBpcykgeworICAgIGluaXQobnVsbCwgaXMsIG51bGwpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIGZpbGVOYW1lLCBJbnB1dFN0cmVhbSBpcywgSUZpbGVQYXJzZXIgZnApIHsKKyAgICBtX2ZpbGVOYW1lID0gZmlsZU5hbWUgIT0gbnVsbCA/IGZpbGVOYW1lIDogREVGQVVMVF9GSUxFTkFNRTsKKyAgICBtX2lucHV0U3RyZWFtID0gaXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQb3N0UHJvY2Vzc29yKElQb3N0UHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIG1fcG9zdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgfQorCisgIC8qKgorICAgKiBJZiBmYWxzZSwgZG9uJ3QgdHJ5IHRvIGxvYWQgdGhlIGNsYXNzZXMgZHVyaW5nIHRoZSBwYXJzaW5nLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TG9hZENsYXNzZXMoYm9vbGVhbiBsb2FkQ2xhc3NlcykgeworICAgIG1fbG9hZENsYXNzZXMgPSBsb2FkQ2xhc3NlczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBvbiB0aGUgcmVzb3VyY2UgbmFtZWQgREVGQVVMVF9GSUxFTkFNRS4KKyAgICoKKyAgICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIHJlc291cmNlIG5hbWVkIERFRkFVTFRfRklMRU5BTUUuCisgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBERUZBVUxUX0ZJTEVOQU1FIHJlc291cmNlIGlzIG5vdAorICAgKiBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgorICAgKi8KKy8vICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworLy8gICAgLy8gVHJ5IHRvIGxvb2sgZm9yIHRoZSBERUZBVUxUX0ZJTEVOQU1FIGZyb20gdGhlIGphcgorLy8gICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworLy8gICAgSW5wdXRTdHJlYW0gaW47CisvLyAgICAvLyBUT0RPIENRIGlzIHRoaXMgT0s/IHNob3VsZCB3ZSBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgY2xhc3Nsb2FkZXIgaWYgdGhlCisvLyAgICAvLyBjb250ZXh0IGNsYXNzbG9hZGVyIGZhaWxzLgorLy8gICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKy8vICAgICAgaW4gPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKKy8vICAgIH0KKy8vICAgIGVsc2UgeworLy8gICAgICBpbiA9IFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKKy8vICAgIH0KKy8vICAgIGlmIChpbiA9PSBudWxsKSB7CisvLyAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZU5hbWUpOworLy8gICAgfQorLy8gICAgcmV0dXJuIGluOworLy8gIH0KKworICBwcml2YXRlIHN0YXRpYyBJRmlsZVBhcnNlciBnZXRQYXJzZXIoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgZm9yIChJU3VpdGVQYXJzZXIgcGFyc2VyIDogUEFSU0VSUykgeworICAgICAgaWYgKHBhcnNlci5hY2NlcHQoZmlsZU5hbWUpKSB7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIERFRkFVTFRfRklMRV9QQVJTRVI7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIHRoZSBUZXN0TkcgdGVzdCBzdWl0ZSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYbWxTdWl0ZSwKKyAgICogYW5kIHBvc3NpYmx5LCBvdGhlciBYbWxTdWl0ZSB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IDxzdWl0ZS1maWxlcz4KKyAgICogdGFncy4KKyAgICoKKyAgICogQHJldHVybiB0aGUgcGFyc2VkIFRlc3RORyB0ZXN0IHN1aXRlLgorICAgKgorICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIHRlc3Qgc3VpdGUgZmlsZSBvcgorICAgKiBpZiB0aGUgZGVmYXVsdCB0ZXN0bmcueG1sIGZpbGUgaXMgbm90IGZvdW5kLgorICAgKi8KKyAgcHVibGljIENvbGxlY3Rpb248WG1sU3VpdGU+IHBhcnNlKCkKKyAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICB7CisgICAgLy8gRWFjaCBzdWl0ZSBmb3VuZCBpcyBwdXQgaW4gdGhpcyBsaXN0LCB1c2luZyB0aGVpciBjYW5vbmljYWwKKyAgICAvLyBwYXRoIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBhZGQgYSBzYW1lIGZpbGUgdHdpY2UKKyAgICAvLyAoZS5nLiAidGVzdG5nLnhtbCIgYW5kICIuL3Rlc3RuZy54bWwiKQorICAgIExpc3Q8U3RyaW5nPiBwcm9jZXNzZWRTdWl0ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBYbWxTdWl0ZSByZXN1bHRTdWl0ZSA9IG51bGw7CisKKyAgICBMaXN0PFN0cmluZz4gdG9CZVBhcnNlZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8U3RyaW5nPiB0b0JlQWRkZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PFN0cmluZz4gdG9CZVJlbW92ZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGlmIChtX2ZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgIEZpbGUgbWFpbkZpbGUgPSBuZXcgRmlsZShtX2ZpbGVOYW1lKTsKKyAgICAgIHRvQmVQYXJzZWQuYWRkKG1haW5GaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBLZWVwcyBhIHRyYWNrIG9mIHBhcmVudCBYbWxTdWl0ZSBmb3IgZWFjaCBjaGlsZCBzdWl0ZQorICAgICAqLworICAgIE1hcDxTdHJpbmcsIFhtbFN1aXRlPiBjaGlsZFRvUGFyZW50TWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgd2hpbGUgKHRvQmVQYXJzZWQuc2l6ZSgpID4gMCkgeworCisgICAgICBmb3IgKFN0cmluZyBjdXJyZW50RmlsZSA6IHRvQmVQYXJzZWQpIHsKKyAgICAgICAgRmlsZSBjdXJyRmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgRmlsZSBwYXJlbnRGaWxlID0gY3VyckZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG1faW5wdXRTdHJlYW0gIT0gbnVsbAorICAgICAgICAgICAgPyBtX2lucHV0U3RyZWFtCisgICAgICAgICAgICA6IG5ldyBGaWxlSW5wdXRTdHJlYW0oY3VycmVudEZpbGUpOworCisgICAgICAgIElGaWxlUGFyc2VyPFhtbFN1aXRlPiBmaWxlUGFyc2VyID0gZ2V0UGFyc2VyKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgWG1sU3VpdGUgY3VycmVudFhtbFN1aXRlID0gZmlsZVBhcnNlci5wYXJzZShjdXJyZW50RmlsZSwgaW5wdXRTdHJlYW0sIG1fbG9hZENsYXNzZXMpOworICAgICAgICBwcm9jZXNzZWRTdWl0ZXMuYWRkKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgdG9CZVJlbW92ZWQuYWRkKGN1cnJlbnRGaWxlKTsKKworICAgICAgICBpZiAoY2hpbGRUb1BhcmVudE1hcC5jb250YWluc0tleShjdXJyZW50RmlsZSkpIHsKKyAgICAgICAgICAgWG1sU3VpdGUgcGFyZW50U3VpdGUgPSBjaGlsZFRvUGFyZW50TWFwLmdldChjdXJyZW50RmlsZSk7CisgICAgICAgICAgIC8vU2V0IHBhcmVudAorICAgICAgICAgICBjdXJyZW50WG1sU3VpdGUuc2V0UGFyZW50U3VpdGUocGFyZW50U3VpdGUpOworICAgICAgICAgICAvL2FwcGVuZCBjaGlsZHJlbgorICAgICAgICAgICBwYXJlbnRTdWl0ZS5nZXRDaGlsZFN1aXRlcygpLmFkZChjdXJyZW50WG1sU3VpdGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gcmVzdWx0U3VpdGUpIHsKKyAgICAgICAgICAgcmVzdWx0U3VpdGUgPSBjdXJyZW50WG1sU3VpdGU7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFN0cmluZz4gc3VpdGVGaWxlcyA9IGN1cnJlbnRYbWxTdWl0ZS5nZXRTdWl0ZUZpbGVzKCk7CisgICAgICAgIGlmIChzdWl0ZUZpbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogc3VpdGVGaWxlcykgeworICAgICAgICAgICAgU3RyaW5nIGNhbm9uaWNhbFBhdGg7CisgICAgICAgICAgICBpZiAocGFyZW50RmlsZSAhPSBudWxsICYmIG5ldyBGaWxlKHBhcmVudEZpbGUsIHBhdGgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgIGNhbm9uaWNhbFBhdGggPSBuZXcgRmlsZShwYXJlbnRGaWxlLCBwYXRoKS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjYW5vbmljYWxQYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWRTdWl0ZXMuY29udGFpbnMoY2Fub25pY2FsUGF0aCkpIHsKKyAgICAgICAgICAgICAgdG9CZUFkZGVkLmFkZChjYW5vbmljYWxQYXRoKTsKKyAgICAgICAgICAgICAgY2hpbGRUb1BhcmVudE1hcC5wdXQoY2Fub25pY2FsUGF0aCwgY3VycmVudFhtbFN1aXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8KKyAgICAgIC8vIEFkZCBhbmQgcmVtb3ZlIGZpbGVzIGZyb20gdG9CZVBhcnNlZCBiZWZvcmUgd2UgbG9vcAorICAgICAgLy8KKyAgICAgIGZvciAoU3RyaW5nIHMgOiB0b0JlUmVtb3ZlZCkgeworICAgICAgICB0b0JlUGFyc2VkLnJlbW92ZShzKTsKKyAgICAgIH0KKyAgICAgIHRvQmVSZW1vdmVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAgIGZvciAoU3RyaW5nIHMgOiB0b0JlQWRkZWQpIHsKKyAgICAgICAgdG9CZVBhcnNlZC5hZGQocyk7CisgICAgICB9CisgICAgICB0b0JlQWRkZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIH0KKworICAgIC8vcmV0dXJuaW5nIGEgbGlzdCBvZiBzaW5nbGUgc3VpdGUgdG8ga2VlcCBjaGFuZ2VzIG1pbmltdW0KKyAgICBMaXN0PFhtbFN1aXRlPiByZXN1bHRMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgcmVzdWx0TGlzdC5hZGQocmVzdWx0U3VpdGUpOworCisgICAgYm9vbGVhbiBwb3N0UHJvY2VzcyA9IHRydWU7CisKKyAgICBpZiAocG9zdFByb2Nlc3MgJiYgbV9wb3N0UHJvY2Vzc29yICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBtX3Bvc3RQcm9jZXNzb3IucHJvY2VzcyhyZXN1bHRMaXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlc3VsdExpc3Q7CisgICAgfQorCisgIH0KKworICBwdWJsaWMgTGlzdDxYbWxTdWl0ZT4gcGFyc2VUb0xpc3QoKQorICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgIHsKKyAgICBMaXN0PFhtbFN1aXRlPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBDb2xsZWN0aW9uPFhtbFN1aXRlPiBzdWl0ZXMgPSBwYXJzZSgpOworICAgIGZvciAoWG1sU3VpdGUgc3VpdGUgOiBzdWl0ZXMpIHsKKyAgICAgIHJlc3VsdC5hZGQoc3VpdGUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworCisKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9SZXN1bHRDb250ZW50SGFuZGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9SZXN1bHRDb250ZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODUxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1Jlc3VsdENvbnRlbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MUmVwb3J0ZXJDb25maWcuQVRUUl9ERVNDOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxSZXBvcnRlckNvbmZpZy5BVFRSX0RVUkFUSU9OX01TOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxSZXBvcnRlckNvbmZpZy5BVFRSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyQ29uZmlnLkFUVFJfU1RBVFVTOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxSZXBvcnRlckNvbmZpZy5UQUdfQ0xBU1M7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyQ29uZmlnLlRBR19QQVJBTVM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyQ29uZmlnLlRBR19TVUlURTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MUmVwb3J0ZXJDb25maWcuVEFHX1RFU1Q7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyQ29uZmlnLlRBR19URVNUX01FVEhPRDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbC5HZW5lcmljTWVzc2FnZTsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbC5JUmVtb3RlU3VpdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbC5JUmVtb3RlVGVzdExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLk1lc3NhZ2VIZWxwZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuU3VpdGVNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlRlc3RNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLlRlc3RSZXN1bHRNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFJlcG9ydGVyQ29uZmlnOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFBhcnNlcyB0ZXN0bmctcmVzdWx0LnhtbCwgY3JlYXRlIFRlc3RSZXN1bHRNZXNzYWdlcyBhbmQgc2VuZCB0aGVtIGJhY2sgdG8gdGhlIGxpc3RlbmVyCisgKiBhcyB3ZSBlbmNvdW50ZXIgdGhlbS4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworcHVibGljIGNsYXNzIFJlc3VsdENvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICBwcml2YXRlIGludCBtX3N1aXRlTWV0aG9kQ291bnQgPSAwOworICBwcml2YXRlIGludCBtX3Rlc3RNZXRob2RDb3VudCA9IDA7CisgIHByaXZhdGUgU3VpdGVNZXNzYWdlIG1fY3VycmVudFN1aXRlOworICBwcml2YXRlIFRlc3RNZXNzYWdlIG1fY3VycmVudFRlc3Q7CisgIHByaXZhdGUgU3RyaW5nIG1fY2xhc3NOYW1lOworICBwcml2YXRlIGludCBtX3Bhc3NlZDsKKyAgcHJpdmF0ZSBpbnQgbV9mYWlsZWQ7CisgIHByaXZhdGUgaW50IG1fc2tpcHBlZDsKKyAgcHJpdmF0ZSBpbnQgbV9pbnZvY2F0aW9uQ291bnQ7CisgIHByaXZhdGUgaW50IG1fY3VycmVudEludm9jYXRpb25Db3VudDsKKyAgcHJpdmF0ZSBUZXN0UmVzdWx0TWVzc2FnZSBtX2N1cnJlbnRUZXN0UmVzdWx0OworICBwcml2YXRlIElSZW1vdGVTdWl0ZUxpc3RlbmVyIG1fc3VpdGVMaXN0ZW5lcjsKKyAgcHJpdmF0ZSBJUmVtb3RlVGVzdExpc3RlbmVyIG1fdGVzdExpc3RlbmVyOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX3BhcmFtcyA9IG51bGw7CisKKyAgcHVibGljIFJlc3VsdENvbnRlbnRIYW5kbGVyKElSZW1vdGVTdWl0ZUxpc3RlbmVyIHN1aXRlTGlzdGVuZXIsCisgICAgICBJUmVtb3RlVGVzdExpc3RlbmVyIHRlc3RMaXN0ZW5lciwgYm9vbGVhbiByZXNvbHZlQ2xhc3NlcyAvKiBpZ25vcmVkICovKSB7CisgICAgbV9zdWl0ZUxpc3RlbmVyID0gc3VpdGVMaXN0ZW5lcjsKKyAgICBtX3Rlc3RMaXN0ZW5lciA9IHRlc3RMaXN0ZW5lcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQgKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIHAoIlN0YXJ0ICIgKyBxTmFtZSk7CisgICAgaWYgKFRBR19TVUlURS5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX3N1aXRlTGlzdGVuZXIub25Jbml0aWFsaXphdGlvbihuZXcgR2VuZXJpY01lc3NhZ2UoTWVzc2FnZUhlbHBlci5HRU5FUklDX1NVSVRFX0NPVU5UKSk7CisgICAgICBtX3N1aXRlTWV0aG9kQ291bnQgPSAwOworICAgICAgbV9jdXJyZW50U3VpdGUgPSBuZXcgU3VpdGVNZXNzYWdlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FKSwKKyAgICAgICAgICB0cnVlIC8qIHN0YXJ0ICovLCBtX3N1aXRlTWV0aG9kQ291bnQpOworICAgICAgbV9zdWl0ZUxpc3RlbmVyLm9uU3RhcnQobV9jdXJyZW50U3VpdGUpOworICAgIH0gZWxzZSBpZiAoVEFHX1RFU1QuZXF1YWxzKHFOYW1lKSkgeworICAgICAgbV9wYXNzZWQgPSBtX2ZhaWxlZCA9IG1fc2tpcHBlZCA9IDA7CisgICAgICBtX2N1cnJlbnRUZXN0ID0gbmV3IFRlc3RNZXNzYWdlKHRydWUgLyogc3RhcnQgKi8sIG1fY3VycmVudFN1aXRlLmdldFN1aXRlTmFtZSgpLAorICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FKSwgbV90ZXN0TWV0aG9kQ291bnQsCisgICAgICAgICAgbV9wYXNzZWQsIG1fZmFpbGVkLCBtX3NraXBwZWQsIDApOworICAgICAgbV90ZXN0TGlzdGVuZXIub25TdGFydChtX2N1cnJlbnRUZXN0KTsKKyAgICB9IGVsc2UgaWYgKFRBR19DTEFTUy5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX2NsYXNzTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FKTsKKyAgICB9IGVsc2UgaWYgKFRBR19URVNUX01FVEhPRC5lcXVhbHMocU5hbWUpKSB7CisgICAgICBJbnRlZ2VyIHN0YXR1cyA9IFhNTFJlcG9ydGVyQ29uZmlnLmdldFN0YXR1cyhhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfU1RBVFVTKSk7CisgICAgICBtX2N1cnJlbnRUZXN0UmVzdWx0ID0gbmV3IFRlc3RSZXN1bHRNZXNzYWdlKHN0YXR1cywgbV9jdXJyZW50U3VpdGUuZ2V0U3VpdGVOYW1lKCksCisgICAgICAgICAgbV9jdXJyZW50VGVzdC5nZXRUZXN0TmFtZSgpLCBtX2NsYXNzTmFtZSwgYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX05BTUUpLAorICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9ERVNDKSwKKyAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfREVTQyksCisgICAgICAgICAgbmV3IFN0cmluZ1swXSwgLyogbm8gcGFyYW1ldGVycywgZmlsbGVkIGxhdGVyICovCisgICAgICAgICAgMCwgTG9uZy5wYXJzZUxvbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0RVUkFUSU9OX01TKSksCisgICAgICAgICAgIiIgLyogc3RhY2sgdHJhY2UsIGZpbGxlZCBsYXRlciAqLywKKyAgICAgICAgICBtX2ludm9jYXRpb25Db3VudCwgbV9jdXJyZW50SW52b2NhdGlvbkNvdW50KTsKKyAgICAgIG1fc3VpdGVNZXRob2RDb3VudCsrOworICAgICAgbV90ZXN0TWV0aG9kQ291bnQrKzsKKyAgICAgIGlmIChzdGF0dXMgPT0gSVRlc3RSZXN1bHQuU1VDQ0VTUykgbV9wYXNzZWQrKzsKKyAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBJVGVzdFJlc3VsdC5GQUlMVVJFKSBtX2ZhaWxlZCsrOworICAgICAgZWxzZSBpZiAoc3RhdHVzID09IElUZXN0UmVzdWx0LlNLSVApIG1fc2tpcHBlZCsrOworICAgIH0gZWxzZSBpZiAoVEFHX1BBUkFNUy5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX3BhcmFtcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKG1fcGFyYW1zICE9IG51bGwpIHsKKyAgICAgIFN0cmluZyBzdHJpbmcgPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgIFN0cmluZyBwYXJhbWV0ZXIgPSBzdHJpbmc7CisgICAgICBpZiAocGFyYW1ldGVyLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgIG1fcGFyYW1zLmFkZChwYXJhbWV0ZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50IChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHsKKyAgICBpZiAoVEFHX1NVSVRFLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIG1fc3VpdGVMaXN0ZW5lci5vbkZpbmlzaChuZXcgU3VpdGVNZXNzYWdlKG51bGwsIGZhbHNlIC8qIGVuZCAqLywgbV9zdWl0ZU1ldGhvZENvdW50KSk7CisgICAgICBtX2N1cnJlbnRTdWl0ZSA9IG51bGw7CisgICAgfSBlbHNlIGlmIChUQUdfVEVTVC5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX2N1cnJlbnRUZXN0ID0gbmV3IFRlc3RNZXNzYWdlKGZhbHNlIC8qIHN0YXJ0ICovLCBtX2N1cnJlbnRTdWl0ZS5nZXRTdWl0ZU5hbWUoKSwKKyAgICAgICAgICBudWxsLCBtX3Rlc3RNZXRob2RDb3VudCwKKyAgICAgICAgICBtX3Bhc3NlZCwgbV9mYWlsZWQsIG1fc2tpcHBlZCwgMCk7CisgICAgICBtX3Rlc3RNZXRob2RDb3VudCA9IDA7CisgICAgICBtX3Rlc3RMaXN0ZW5lci5vbkZpbmlzaChtX2N1cnJlbnRUZXN0KTsKKyAgICB9IGVsc2UgaWYgKFRBR19DTEFTUy5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX2NsYXNzTmFtZSA9IG51bGw7CisgICAgfSBlbHNlIGlmIChUQUdfVEVTVF9NRVRIT0QuZXF1YWxzKHFOYW1lKSkgeworICAgICAgc3dpdGNoKG1fY3VycmVudFRlc3RSZXN1bHQuZ2V0UmVzdWx0KCkpIHsKKyAgICAgIGNhc2UgSVRlc3RSZXN1bHQuU1VDQ0VTUzoKKyAgICAgICAgbV90ZXN0TGlzdGVuZXIub25UZXN0U3VjY2VzcyhtX2N1cnJlbnRUZXN0UmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElUZXN0UmVzdWx0LkZBSUxVUkU6CisgICAgICAgIG1fdGVzdExpc3RlbmVyLm9uVGVzdEZhaWx1cmUobV9jdXJyZW50VGVzdFJlc3VsdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5TS0lQOgorICAgICAgICBtX3Rlc3RMaXN0ZW5lci5vblRlc3RTa2lwcGVkKG1fY3VycmVudFRlc3RSZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgcCgiSWdub3JpbmcgdGVzdCBzdGF0dXM6IiArIG1fY3VycmVudFRlc3RSZXN1bHQuZ2V0UmVzdWx0KCkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChUQUdfUEFSQU1TLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbbV9wYXJhbXMuc2l6ZSgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wYXJhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy8gVGhlIHBhcmFtZXRlcnMgYXJlIGVuY29kZWQgIGFzIHR5cGU6dmFsdWUuIFNpbmNlIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUKKyAgICAgICAgLy8gdmFsdWUgKGFuZCB3ZSBkb24ndCByZWNlaXZlIHRoZSB0eXBlIGFueXdheSksIHVzZSBhIGR1bW15IGNoYXJhY3RlciBpbgorICAgICAgICAvLyBpdHMgcGxhY2UKKyAgICAgICAgcGFyYW1zW2ldID0gIkA6IiArIG1fcGFyYW1zLmdldChpKTsKKyAgICAgIH0KKyAgICAgIG1fY3VycmVudFRlc3RSZXN1bHQuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgbV9wYXJhbXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltSZXN1bHRDb250ZW50SGFuZGxlcl0gIiArIHN0cmluZyk7CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvUmVzdWx0WE1MUGFyc2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1Jlc3VsdFhNTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjVkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1Jlc3VsdFhNTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuR2VuZXJpY01lc3NhZ2U7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuSVJlbW90ZVN1aXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuSVJlbW90ZVRlc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbC5TdWl0ZU1lc3NhZ2U7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuVGVzdE1lc3NhZ2U7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuVGVzdFJlc3VsdE1lc3NhZ2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBQYXJzZXMgdGVzdG5nLXJlc3VsdC54bWwuCisgKgorICogQHNlZSBSZXN1bHRDb250ZW50SGFuZGxlcgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgY2xhc3MgUmVzdWx0WE1MUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyPE9iamVjdD4geworICBwcml2YXRlIElSZW1vdGVUZXN0TGlzdGVuZXIgbV90ZXN0TGlzdGVuZXI7CisgIHByaXZhdGUgSVJlbW90ZVN1aXRlTGlzdGVuZXIgbV9zdWl0ZUxpc3RlbmVyOworCisgIHB1YmxpYyBSZXN1bHRYTUxQYXJzZXIoSVJlbW90ZVN1aXRlTGlzdGVuZXIgc3VpdGVMaXN0ZW5lciwgSVJlbW90ZVRlc3RMaXN0ZW5lciB0ZXN0TGlzdGVuZXIpIHsKKyAgICBtX3N1aXRlTGlzdGVuZXIgPSBzdWl0ZUxpc3RlbmVyOworICAgIG1fdGVzdExpc3RlbmVyID0gdGVzdExpc3RlbmVyOworICB9CisKKyAgcHVibGljIHZvaWQgcGFyc2UoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBwYXJzZShTdHJpbmcgY3VycmVudEZpbGUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBib29sZWFuIGxvYWRDbGFzc2VzKSB7CisgICAgUmVzdWx0Q29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBSZXN1bHRDb250ZW50SGFuZGxlcihtX3N1aXRlTGlzdGVuZXIsIG1fdGVzdExpc3RlbmVyLAorICAgICAgICBsb2FkQ2xhc3Nlcyk7CisKKyAgICB0cnkgeworICAgICAgcGFyc2UoaW5wdXRTdHJlYW0sIGhhbmRsZXIpOworCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgIElSZW1vdGVTdWl0ZUxpc3RlbmVyIGwxID0gbmV3IElSZW1vdGVTdWl0ZUxpc3RlbmVyKCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6YXRpb24oR2VuZXJpY01lc3NhZ2UgZ2VuZXJpY01lc3NhZ2UpIHsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KFN1aXRlTWVzc2FnZSBzdWl0ZU1lc3NhZ2UpIHsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaChTdWl0ZU1lc3NhZ2Ugc3VpdGVNZXNzYWdlKSB7CisgICAgICB9CisKKyAgICB9OworCisgICAgSVJlbW90ZVRlc3RMaXN0ZW5lciBsMiA9IG5ldyBJUmVtb3RlVGVzdExpc3RlbmVyKCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoVGVzdE1lc3NhZ2UgdG0pIHsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaChUZXN0TWVzc2FnZSB0bSkgeworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0KFRlc3RSZXN1bHRNZXNzYWdlIHRybSkgeworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoVGVzdFJlc3VsdE1lc3NhZ2UgdHJtKSB7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UmVzdWx0TWVzc2FnZSB0cm0pIHsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKFRlc3RSZXN1bHRNZXNzYWdlIHRybSkgeworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKFRlc3RSZXN1bHRNZXNzYWdlIHRybSkgeworICAgICAgfQorCisgICAgfTsKKyAgICBSZXN1bHRYTUxQYXJzZXIgcGFyc2VyID0gbmV3IFJlc3VsdFhNTFBhcnNlcihsMSwgbDIpOworICAgIFN0cmluZyBmaWxlTmFtZSA9ICIvVXNlcnMvY2JldXN0L2phdmEvdGVzdG5nL3Rlc3Qtb3V0cHV0L3Rlc3RuZy1yZXN1bHRzLnhtbCI7CisgICAgcGFyc2VyLnBhcnNlKGZpbGVOYW1lLCBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGVOYW1lKSksIGZhbHNlIC8qIGRvbid0IGxvYWQgY2xhc3NlcyAqLyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvU3VpdGVHZW5lcmF0b3IuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvU3VpdGVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jODg3MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9TdWl0ZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBGYWN0b3J5IHRvIGNyZWF0ZSBjdXN0b20gc3VpdGVzLgorICogQGF1dGhvciBIYW5pIFN1bGVpbWFuCisgKiAgICAgICAgIERhdGU6IEp1bCAyNSwgMjAwNQorICogICAgICAgICBUaW1lOiAxOjEyOjE4IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBTdWl0ZUdlbmVyYXRvciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBFTVBUWV9DTEFTU19MSVNUPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKworICBwdWJsaWMgc3RhdGljIExhdW5jaFN1aXRlIGNyZWF0ZVByb3hpZWRYbWxTdWl0ZShmaW5hbCBGaWxlIHhtbFN1aXRlUGF0aCkgeworICAgIHJldHVybiBuZXcgTGF1bmNoU3VpdGUuRXhpc3RpbmdTdWl0ZSh4bWxTdWl0ZVBhdGgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMYXVuY2hTdWl0ZSBjcmVhdGVTdWl0ZShTdHJpbmcgcHJvamVjdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrYWdlTmFtZXMsCisgICAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGNsYXNzQW5kTWV0aG9kTmFtZXMsIENvbGxlY3Rpb248U3RyaW5nPiBncm91cE5hbWVzLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmcgYW5ub3RhdGlvblR5cGUsIGludCBsb2dMZXZlbCkgeworCisgICAgTGF1bmNoU3VpdGUgcmVzdWx0OworICAgIENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc2VzID0gY2xhc3NBbmRNZXRob2ROYW1lcyAhPSBudWxsID8gY2xhc3NBbmRNZXRob2ROYW1lcy5rZXlTZXQoKQorICAgICAgICA6IEVNUFRZX0NMQVNTX0xJU1Q7CisgICAgaWYgKChudWxsICE9IGdyb3VwTmFtZXMpICYmICFncm91cE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgLy8KKyAgICAgIC8vIENyZWF0ZSBhIHN1aXRlIGZyb20gZ3JvdXBzCisgICAgICAvLworICAgICAgcmVzdWx0ID0gbmV3IExhdW5jaFN1aXRlLkNsYXNzTGlzdFN1aXRlKHByb2plY3ROYW1lLCBwYWNrYWdlTmFtZXMsIGNsYXNzZXMsIGdyb3VwTmFtZXMsCisgICAgICAgICAgcGFyYW1ldGVycywgYW5ub3RhdGlvblR5cGUsIGxvZ0xldmVsKTsKKyAgICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lcyAhPSBudWxsICYmIHBhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSB7CisgICAgICAvLworICAgICAgLy8gQ3JlYXRlIGEgc3VpdGUgZnJvbSBwYWNrYWdlcworICAgICAgLy8KKyAgICAgIHJlc3VsdCA9IG5ldyBMYXVuY2hTdWl0ZS5DbGFzc0xpc3RTdWl0ZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWVzLCBjbGFzc2VzLCBncm91cE5hbWVzLAorICAgICAgICAgIHBhcmFtZXRlcnMsIGFubm90YXRpb25UeXBlLCBsb2dMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vCisgICAgICAvLyBEZWZhdWx0IHN1aXRlIGNyZWF0aW9uCisgICAgICAvLworICAgICAgcmVzdWx0ID0gbmV3IExhdW5jaFN1aXRlLkNsYXNzZXNBbmRNZXRob2RzU3VpdGUocHJvamVjdE5hbWUsIGNsYXNzQW5kTWV0aG9kTmFtZXMsIHBhcmFtZXRlcnMsCisgICAgICAgICAgYW5ub3RhdGlvblR5cGUsIGxvZ0xldmVsKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2NyZWF0ZVN1aXRlKFN0cmluZywgamF2YS51dGlsLkNvbGxlY3Rpb24sIGphdmEudXRpbC5NYXAsCisgICAqIGphdmEudXRpbC5Db2xsZWN0aW9uLCBqYXZhLnV0aWwuTWFwLCBTdHJpbmcsIGludCl9IGluc3RlYWQuCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgc3RhdGljIExhdW5jaFN1aXRlIGNyZWF0ZUN1c3RvbWl6ZWRTdWl0ZShTdHJpbmcgcHJvamVjdE5hbWUsCisgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gcGFja2FnZU5hbWVzLCBDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywKKyAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBtZXRob2ROYW1lcywgQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTmFtZXMsCisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIFN0cmluZyBhbm5vdGF0aW9uVHlwZSwgaW50IGxvZ0xldmVsKSB7CisgICAgaWYgKChudWxsICE9IGdyb3VwTmFtZXMpICYmICFncm91cE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIG5ldyBMYXVuY2hTdWl0ZS5DbGFzc0xpc3RTdWl0ZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWVzLCBjbGFzc05hbWVzLCBncm91cE5hbWVzLAorICAgICAgICAgIHBhcmFtZXRlcnMsIGFubm90YXRpb25UeXBlLCBsb2dMZXZlbCk7CisgICAgfSBlbHNlIGlmICgoY2xhc3NOYW1lcyAhPSBudWxsICYmIGNsYXNzTmFtZXMuc2l6ZSgpID4gMSkgfHwgcGFja2FnZU5hbWVzICE9IG51bGwKKyAgICAgICAgJiYgcGFja2FnZU5hbWVzLnNpemUoKSA+IDApIHsKKyAgICAgIHJldHVybiBuZXcgTGF1bmNoU3VpdGUuQ2xhc3NMaXN0U3VpdGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lcywgY2xhc3NOYW1lcywgZ3JvdXBOYW1lcywKKyAgICAgICAgICBwYXJhbWV0ZXJzLCBhbm5vdGF0aW9uVHlwZSwgbG9nTGV2ZWwpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IExhdW5jaFN1aXRlLk1ldGhvZHNTdWl0ZShwcm9qZWN0TmFtZSwgY2xhc3NOYW1lcy5pdGVyYXRvcigpLm5leHQoKSwgbWV0aG9kTmFtZXMsCisgICAgICAgICAgcGFyYW1ldGVycywgYW5ub3RhdGlvblR5cGUsIGxvZ0xldmVsKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvU3VpdGVYbWxQYXJzZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvU3VpdGVYbWxQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ3MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9TdWl0ZVhtbFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBTdWl0ZVhtbFBhcnNlciBleHRlbmRzIFhNTFBhcnNlcjxYbWxTdWl0ZT4gaW1wbGVtZW50cyBJU3VpdGVQYXJzZXIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgWG1sU3VpdGUgcGFyc2UoU3RyaW5nIGN1cnJlbnRGaWxlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgYm9vbGVhbiBsb2FkQ2xhc3NlcykgeworICAgIFRlc3ROR0NvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyID0gbmV3IFRlc3ROR0NvbnRlbnRIYW5kbGVyKGN1cnJlbnRGaWxlLCBsb2FkQ2xhc3Nlcyk7CisKKyAgICB0cnkgeworICAgICAgcGFyc2UoaW5wdXRTdHJlYW0sIGNvbnRlbnRIYW5kbGVyKTsKKworICAgICAgcmV0dXJuIGNvbnRlbnRIYW5kbGVyLmdldFN1aXRlKCk7CisgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBmaWxlTmFtZSkgeworICAgIHJldHVybiBmaWxlTmFtZS5lbmRzV2l0aCgiLnhtbCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1Rlc3ROR0NvbnRlbnRIYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1Rlc3ROR0NvbnRlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTRiZjJmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvVGVzdE5HQ29udGVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDgxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzLmlzU3RyaW5nQmxhbms7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0T2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcubG9nNHRlc3RuZy5Mb2dnZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvKioKKyAqIFN1aXRlIGRlZmluaXRpb24gcGFyc2VyIHV0aWxpdHkuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QKKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZV9taW5kc3Rvcm1AZXZvbHZhLnJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFRlc3ROR0NvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICBwcml2YXRlIFhtbFN1aXRlIG1fY3VycmVudFN1aXRlID0gbnVsbDsKKyAgcHJpdmF0ZSBYbWxUZXN0IG1fY3VycmVudFRlc3QgPSBudWxsOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2N1cnJlbnREZWZpbmVzID0gbnVsbDsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9jdXJyZW50UnVucyA9IG51bGw7CisgIHByaXZhdGUgTGlzdDxYbWxDbGFzcz4gbV9jdXJyZW50Q2xhc3NlcyA9IG51bGw7CisgIHByaXZhdGUgaW50IG1fY3VycmVudFRlc3RJbmRleCA9IDA7CisgIHByaXZhdGUgaW50IG1fY3VycmVudENsYXNzSW5kZXggPSAwOworICBwcml2YXRlIGludCBtX2N1cnJlbnRJbmNsdWRlSW5kZXggPSAwOworICBwcml2YXRlIExpc3Q8WG1sUGFja2FnZT4gbV9jdXJyZW50UGFja2FnZXMgPSBudWxsOworICBwcml2YXRlIFhtbFBhY2thZ2UgbV9jdXJyZW50UGFja2FnZSA9IG51bGw7CisgIHByaXZhdGUgTGlzdDxYbWxTdWl0ZT4gbV9zdWl0ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9jdXJyZW50SW5jbHVkZWRHcm91cHMgPSBudWxsOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2N1cnJlbnRFeGNsdWRlZEdyb3VwcyA9IG51bGw7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX2N1cnJlbnRUZXN0UGFyYW1ldGVycyA9IG51bGw7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX2N1cnJlbnRTdWl0ZVBhcmFtZXRlcnMgPSBudWxsOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9jdXJyZW50Q2xhc3NQYXJhbWV0ZXJzID0gbnVsbDsKKyAgcHJpdmF0ZSBJbmNsdWRlIG1fY3VycmVudEluY2x1ZGU7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fY3VycmVudE1ldGFHcm91cCA9IG51bGw7CisgIHByaXZhdGUgU3RyaW5nIG1fY3VycmVudE1ldGFHcm91cE5hbWU7CisKKyAgZW51bSBMb2NhdGlvbiB7CisgICAgU1VJVEUsCisgICAgVEVTVCwKKyAgICBDTEFTUywKKyAgICBJTkNMVURFLAorICAgIEVYQ0xVREUKKyAgfQorICBwcml2YXRlIFN0YWNrPExvY2F0aW9uPiBtX2xvY2F0aW9ucyA9IG5ldyBTdGFjazw+KCk7CisKKyAgcHJpdmF0ZSBYbWxDbGFzcyBtX2N1cnJlbnRDbGFzcyA9IG51bGw7CisgIHByaXZhdGUgQXJyYXlMaXN0PFhtbEluY2x1ZGU+IG1fY3VycmVudEluY2x1ZGVkTWV0aG9kcyA9IG51bGw7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fY3VycmVudEV4Y2x1ZGVkTWV0aG9kcyA9IG51bGw7CisgIHByaXZhdGUgQXJyYXlMaXN0PFhtbE1ldGhvZFNlbGVjdG9yPiBtX2N1cnJlbnRTZWxlY3RvcnMgPSBudWxsOworICBwcml2YXRlIFhtbE1ldGhvZFNlbGVjdG9yIG1fY3VycmVudFNlbGVjdG9yID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9jdXJyZW50TGFuZ3VhZ2UgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBtX2N1cnJlbnRFeHByZXNzaW9uID0gbnVsbDsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9zdWl0ZUZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgYm9vbGVhbiBtX2VuYWJsZWRUZXN0OworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xpc3RlbmVyczsKKworICBwcml2YXRlIFN0cmluZyBtX2ZpbGVOYW1lOworICBwcml2YXRlIGJvb2xlYW4gbV9sb2FkQ2xhc3NlczsKKyAgcHJpdmF0ZSBib29sZWFuIG1fdmFsaWRhdGUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1faGFzV2FybiA9IGZhbHNlOworCisgIHB1YmxpYyBUZXN0TkdDb250ZW50SGFuZGxlcihTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gbG9hZENsYXNzZXMpIHsKKyAgICBtX2ZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgbV9sb2FkQ2xhc3NlcyA9IGxvYWRDbGFzc2VzOworICB9CisKKyAgc3RhdGljIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0TkdDb250ZW50SGFuZGxlcl0gIiArIHMpOworICB9CisKKyAgLyoKKyAgICogKG5vbi1KYXZhZG9jKQorICAgKgorICAgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywKKyAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHB1YmxpY0lkKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgIElucHV0U291cmNlIHJlc3VsdCA9IG51bGw7CisgICAgaWYgKFBhcnNlci5ERVBSRUNBVEVEX1RFU1ROR19EVERfVVJMLmVxdWFscyhwdWJsaWNJZCkKKyAgICAgICAgfHwgUGFyc2VyLlRFU1ROR19EVERfVVJMLmVxdWFscyhwdWJsaWNJZCkpIHsKKyAgICAgIG1fdmFsaWRhdGUgPSB0cnVlOworICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShQYXJzZXIuVEVTVE5HX0RURCk7CisgICAgICBpZiAobnVsbCA9PSBpcykgeworICAgICAgICBpcyA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShQYXJzZXIuVEVTVE5HX0RURCk7CisgICAgICAgIGlmIChudWxsID09IGlzKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXQVJOSU5HOiBjb3VsZG4ndCBmaW5kIGluIGNsYXNzcGF0aCAiICsgcHVibGljSWQKKyAgICAgICAgICAgICAgKyAiXG4iICsgIkZldGNoaW5nIGl0IGZyb20gdGhlIFdlYiBzaXRlLiIpOworICAgICAgICAgIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVFbnRpdHkoc3lzdGVtSWQsIHB1YmxpY0lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IElucHV0U291cmNlKGlzKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQgPSBzdXBlci5yZXNvbHZlRW50aXR5KHN5c3RlbUlkLCBwdWJsaWNJZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSA8c3VpdGUtZmlsZT4KKyAgICovCisgIHByaXZhdGUgdm9pZCB4bWxTdWl0ZUZpbGUoYm9vbGVhbiBzdGFydCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICBTdHJpbmcgcGF0aCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGgiKTsKKyAgICAgIHB1c2hMb2NhdGlvbihMb2NhdGlvbi5TVUlURSk7CisgICAgICBtX3N1aXRlRmlsZXMuYWRkKHBhdGgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fY3VycmVudFN1aXRlLnNldFN1aXRlRmlsZXMobV9zdWl0ZUZpbGVzKTsKKyAgICAgIHBvcExvY2F0aW9uKExvY2F0aW9uLlNVSVRFKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgPHN1aXRlPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHhtbFN1aXRlKGJvb2xlYW4gc3RhcnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIGlmIChzdGFydCkgeworICAgICAgcHVzaExvY2F0aW9uKExvY2F0aW9uLlNVSVRFKTsKKyAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOworICAgICAgaWYgKGlzU3RyaW5nQmxhbmsobmFtZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3ROR0V4Y2VwdGlvbigiVGhlIDxzdWl0ZT4gdGFnIG11c3QgZGVmaW5lIHRoZSBuYW1lIGF0dHJpYnV0ZSIpOworICAgICAgfQorICAgICAgbV9jdXJyZW50U3VpdGUgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICAgIG1fY3VycmVudFN1aXRlLnNldEZpbGVOYW1lKG1fZmlsZU5hbWUpOworICAgICAgbV9jdXJyZW50U3VpdGUuc2V0TmFtZShuYW1lKTsKKyAgICAgIG1fY3VycmVudFN1aXRlUGFyYW1ldGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgICAgICBTdHJpbmcgdmVyYm9zZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcmJvc2UiKTsKKyAgICAgIGlmIChudWxsICE9IHZlcmJvc2UpIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0VmVyYm9zZShJbnRlZ2VyLnBhcnNlSW50KHZlcmJvc2UpKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBqVW5pdCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImp1bml0Iik7CisgICAgICBpZiAobnVsbCAhPSBqVW5pdCkgeworICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRKVW5pdChCb29sZWFuLnZhbHVlT2YoalVuaXQpKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBwYXJhbGxlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhcmFsbGVsIik7CisgICAgICBpZiAocGFyYWxsZWwgIT0gbnVsbCkgeworICAgICAgICBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgbW9kZSA9IFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5nZXRWYWxpZFBhcmFsbGVsKHBhcmFsbGVsKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgIG1fY3VycmVudFN1aXRlLnNldFBhcmFsbGVsKG1vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFV0aWxzLmxvZygiUGFyc2VyIiwgMSwgIltXQVJOXSBVbmtub3duIHZhbHVlIG9mIGF0dHJpYnV0ZSAncGFyYWxsZWwnIGF0IHN1aXRlIGxldmVsOiAnIiArIHBhcmFsbGVsICsgIicuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFN0cmluZyBwYXJlbnRNb2R1bGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXJlbnQtbW9kdWxlIik7CisgICAgICBpZiAocGFyZW50TW9kdWxlICE9IG51bGwpIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0UGFyZW50TW9kdWxlKHBhcmVudE1vZHVsZSk7CisgICAgICB9CisgICAgICBTdHJpbmcgZ3VpY2VTdGFnZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImd1aWNlLXN0YWdlIik7CisgICAgICBpZiAoZ3VpY2VTdGFnZSAhPSBudWxsKSB7CisgICAgICAgIG1fY3VycmVudFN1aXRlLnNldEd1aWNlU3RhZ2UoZ3VpY2VTdGFnZSk7CisgICAgICB9CisgICAgICBTdHJpbmcgY29uZmlnRmFpbHVyZVBvbGljeSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImNvbmZpZ2ZhaWx1cmVwb2xpY3kiKTsKKyAgICAgIGlmIChudWxsICE9IGNvbmZpZ0ZhaWx1cmVQb2xpY3kpIHsKKyAgICAgICAgaWYgKFhtbFN1aXRlLlNLSVAuZXF1YWxzKGNvbmZpZ0ZhaWx1cmVQb2xpY3kpIHx8IFhtbFN1aXRlLkNPTlRJTlVFLmVxdWFscyhjb25maWdGYWlsdXJlUG9saWN5KSkgeworICAgICAgICAgIG1fY3VycmVudFN1aXRlLnNldENvbmZpZ0ZhaWx1cmVQb2xpY3koY29uZmlnRmFpbHVyZVBvbGljeSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFN0cmluZyBncm91cEJ5SW5zdGFuY2VzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZ3JvdXAtYnktaW5zdGFuY2VzIik7CisgICAgICBpZiAoZ3JvdXBCeUluc3RhbmNlcyE9IG51bGwpIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0R3JvdXBCeUluc3RhbmNlcyhCb29sZWFuLnZhbHVlT2YoZ3JvdXBCeUluc3RhbmNlcykpOworICAgICAgfQorICAgICAgU3RyaW5nIHNraXAgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJza2lwZmFpbGVkaW52b2NhdGlvbmNvdW50cyIpOworICAgICAgaWYgKHNraXAgIT0gbnVsbCkgeworICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRTa2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyhCb29sZWFuLnZhbHVlT2Yoc2tpcCkpOworICAgICAgfQorICAgICAgU3RyaW5nIHRocmVhZENvdW50ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidGhyZWFkLWNvdW50Iik7CisgICAgICBpZiAobnVsbCAhPSB0aHJlYWRDb3VudCkgeworICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRUaHJlYWRDb3VudChJbnRlZ2VyLnBhcnNlSW50KHRocmVhZENvdW50KSk7CisgICAgICB9CisgICAgICBTdHJpbmcgZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudCIpOworICAgICAgaWYgKG51bGwgIT0gZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQpIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0RGF0YVByb3ZpZGVyVGhyZWFkQ291bnQoSW50ZWdlci5wYXJzZUludChkYXRhUHJvdmlkZXJUaHJlYWRDb3VudCkpOworICAgICAgfQorICAgICAgU3RyaW5nIHRpbWVPdXQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0aW1lLW91dCIpOworICAgICAgaWYgKG51bGwgIT0gdGltZU91dCkgeworICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRUaW1lT3V0KHRpbWVPdXQpOworICAgICAgfQorICAgICAgU3RyaW5nIG9iamVjdEZhY3RvcnkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvYmplY3QtZmFjdG9yeSIpOworICAgICAgaWYgKG51bGwgIT0gb2JqZWN0RmFjdG9yeSAmJiBtX2xvYWRDbGFzc2VzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0T2JqZWN0RmFjdG9yeSgoSVRlc3RPYmplY3RGYWN0b3J5KUNsYXNzLmZvck5hbWUob2JqZWN0RmFjdG9yeSkubmV3SW5zdGFuY2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBVdGlscy5sb2coIlBhcnNlciIsIDEsICJbRVJST1JdIFVuYWJsZSB0byBjcmVhdGUgY3VzdG9tIG9iamVjdCBmYWN0b3J5ICciICsgb2JqZWN0RmFjdG9yeSArICInIDoiICsgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFN0cmluZyBwcmVzZXJ2ZU9yZGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJlc2VydmUtb3JkZXIiKTsKKyAgICAgIGlmIChwcmVzZXJ2ZU9yZGVyICE9IG51bGwpIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0UHJlc2VydmVPcmRlcihwcmVzZXJ2ZU9yZGVyKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBhbGxvd1JldHVyblZhbHVlcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFsbG93LXJldHVybi12YWx1ZXMiKTsKKyAgICAgIGlmIChhbGxvd1JldHVyblZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgIG1fY3VycmVudFN1aXRlLnNldEFsbG93UmV0dXJuVmFsdWVzKEJvb2xlYW4udmFsdWVPZihhbGxvd1JldHVyblZhbHVlcykpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fY3VycmVudFN1aXRlLnNldFBhcmFtZXRlcnMobV9jdXJyZW50U3VpdGVQYXJhbWV0ZXJzKTsKKyAgICAgIG1fc3VpdGVzLmFkZChtX2N1cnJlbnRTdWl0ZSk7CisgICAgICBtX2N1cnJlbnRTdWl0ZVBhcmFtZXRlcnMgPSBudWxsOworICAgICAgcG9wTG9jYXRpb24oTG9jYXRpb24uU1VJVEUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSA8ZGVmaW5lPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHhtbERlZmluZShib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOworICAgICAgbV9jdXJyZW50RGVmaW5lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgbV9jdXJyZW50TWV0YUdyb3VwID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBtX2N1cnJlbnRNZXRhR3JvdXBOYW1lID0gbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtX2N1cnJlbnRUZXN0LmFkZE1ldGFHcm91cChtX2N1cnJlbnRNZXRhR3JvdXBOYW1lLCBtX2N1cnJlbnRNZXRhR3JvdXApOworICAgICAgbV9jdXJyZW50RGVmaW5lcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIDxzY3JpcHQ+CisgICAqLworICBwcml2YXRlIHZvaWQgeG1sU2NyaXB0KGJvb2xlYW4gc3RhcnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIGlmIChzdGFydCkgeworLy8gICAgICBwcHAoIk9QRU4gU0NSSVBUIik7CisgICAgICBtX2N1cnJlbnRMYW5ndWFnZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhbmd1YWdlIik7CisgICAgICBtX2N1cnJlbnRFeHByZXNzaW9uID0gIiI7CisgICAgfQorICAgIGVsc2UgeworLy8gICAgICBwcHAoIkNMT1NFIFNDUklQVDpAQCIgKyBtX2N1cnJlbnRFeHByZXNzaW9uICsgIkBAIik7CisgICAgICBtX2N1cnJlbnRTZWxlY3Rvci5zZXRFeHByZXNzaW9uKG1fY3VycmVudEV4cHJlc3Npb24pOworICAgICAgbV9jdXJyZW50U2VsZWN0b3Iuc2V0TGFuZ3VhZ2UobV9jdXJyZW50TGFuZ3VhZ2UpOworICAgICAgaWYgKG1fbG9jYXRpb25zLnBlZWsoKSA9PSBMb2NhdGlvbi5URVNUKSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0QmVhblNoZWxsRXhwcmVzc2lvbihtX2N1cnJlbnRFeHByZXNzaW9uKTsKKyAgICAgIH0KKyAgICAgIG1fY3VycmVudExhbmd1YWdlID0gbnVsbDsKKyAgICAgIG1fY3VycmVudEV4cHJlc3Npb24gPSBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSA8dGVzdD4KKyAgICovCisgIHByaXZhdGUgdm9pZCB4bWxUZXN0KGJvb2xlYW4gc3RhcnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIGlmIChzdGFydCkgeworICAgICAgbV9jdXJyZW50VGVzdCA9IG5ldyBYbWxUZXN0KG1fY3VycmVudFN1aXRlLCBtX2N1cnJlbnRUZXN0SW5kZXgrKyk7CisgICAgICBwdXNoTG9jYXRpb24oTG9jYXRpb24uVEVTVCk7CisgICAgICBtX2N1cnJlbnRUZXN0UGFyYW1ldGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICBpZihpc1N0cmluZ0JsYW5rKHRlc3ROYW1lKSkgeworICAgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJUaGUgPHRlc3Q+IHRhZyBtdXN0IGRlZmluZSB0aGUgbmFtZSBhdHRyaWJ1dGUiKTsKKyAgICAgIH0KKyAgICAgIG1fY3VycmVudFRlc3Quc2V0TmFtZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIikpOworICAgICAgU3RyaW5nIHZlcmJvc2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJib3NlIik7CisgICAgICBpZiAobnVsbCAhPSB2ZXJib3NlKSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0VmVyYm9zZShJbnRlZ2VyLnBhcnNlSW50KHZlcmJvc2UpKTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBqVW5pdCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImp1bml0Iik7CisgICAgICBpZiAobnVsbCAhPSBqVW5pdCkgeworICAgICAgICBtX2N1cnJlbnRUZXN0LnNldEpVbml0KEJvb2xlYW4udmFsdWVPZihqVW5pdCkpOworICAgICAgfQorICAgICAgU3RyaW5nIHNraXAgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJza2lwZmFpbGVkaW52b2NhdGlvbmNvdW50cyIpOworICAgICAgaWYgKHNraXAgIT0gbnVsbCkgeworICAgICAgICBtX2N1cnJlbnRUZXN0LnNldFNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKEJvb2xlYW4udmFsdWVPZihza2lwKSk7CisgICAgICB9CisgICAgICBTdHJpbmcgZ3JvdXBCeUluc3RhbmNlcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImdyb3VwLWJ5LWluc3RhbmNlcyIpOworICAgICAgaWYgKGdyb3VwQnlJbnN0YW5jZXMhPSBudWxsKSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0R3JvdXBCeUluc3RhbmNlcyhCb29sZWFuLnZhbHVlT2YoZ3JvdXBCeUluc3RhbmNlcykpOworICAgICAgfQorICAgICAgU3RyaW5nIHByZXNlcnZlT3JkZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcmVzZXJ2ZS1vcmRlciIpOworICAgICAgaWYgKHByZXNlcnZlT3JkZXIgIT0gbnVsbCkgeworICAgICAgICBtX2N1cnJlbnRUZXN0LnNldFByZXNlcnZlT3JkZXIocHJlc2VydmVPcmRlcik7CisgICAgICB9CisgICAgICBTdHJpbmcgcGFyYWxsZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXJhbGxlbCIpOworICAgICAgaWYgKHBhcmFsbGVsICE9IG51bGwpIHsKKyAgICAgICAgWG1sU3VpdGUuUGFyYWxsZWxNb2RlIG1vZGUgPSBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuZ2V0VmFsaWRQYXJhbGxlbChwYXJhbGxlbCk7CisgICAgICAgIGlmIChtb2RlICE9IG51bGwpIHsKKyAgICAgICAgICBtX2N1cnJlbnRUZXN0LnNldFBhcmFsbGVsKG1vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFV0aWxzLmxvZygiUGFyc2VyIiwgMSwgIltXQVJOXSBVbmtub3duIHZhbHVlIG9mIGF0dHJpYnV0ZSAncGFyYWxsZWwnIGZvciB0ZXN0ICciCisgICAgICAgICAgICArIG1fY3VycmVudFRlc3QuZ2V0TmFtZSgpICsgIic6ICciICsgcGFyYWxsZWwgKyAiJyIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBTdHJpbmcgdGhyZWFkQ291bnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0aHJlYWQtY291bnQiKTsKKyAgICAgIGlmKG51bGwgIT0gdGhyZWFkQ291bnQpIHsKKyAgICAgICAgbV9jdXJyZW50VGVzdC5zZXRUaHJlYWRDb3VudChJbnRlZ2VyLnBhcnNlSW50KHRocmVhZENvdW50KSk7CisgICAgICB9CisgICAgICBTdHJpbmcgdGltZU91dCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInRpbWUtb3V0Iik7CisgICAgICBpZiAobnVsbCAhPSB0aW1lT3V0KSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0VGltZU91dChMb25nLnBhcnNlTG9uZyh0aW1lT3V0KSk7CisgICAgICB9CisgICAgICBtX2VuYWJsZWRUZXN0PSB0cnVlOworICAgICAgU3RyaW5nIGVuYWJsZWRUZXN0U3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZW5hYmxlZCIpOworICAgICAgaWYobnVsbCAhPSBlbmFibGVkVGVzdFN0cmluZykgeworICAgICAgICBtX2VuYWJsZWRUZXN0ID0gQm9vbGVhbi52YWx1ZU9mKGVuYWJsZWRUZXN0U3RyaW5nKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnRUZXN0UGFyYW1ldGVycyAmJiBtX2N1cnJlbnRUZXN0UGFyYW1ldGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0UGFyYW1ldGVycyhtX2N1cnJlbnRUZXN0UGFyYW1ldGVycyk7CisgICAgICB9CisgICAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnRDbGFzc2VzKSB7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0WG1sQ2xhc3NlcyhtX2N1cnJlbnRDbGFzc2VzKTsKKyAgICAgIH0KKyAgICAgIG1fY3VycmVudENsYXNzZXMgPSBudWxsOworICAgICAgbV9jdXJyZW50VGVzdCA9IG51bGw7CisgICAgICBtX2N1cnJlbnRUZXN0UGFyYW1ldGVycyA9IG51bGw7CisgICAgICBwb3BMb2NhdGlvbihMb2NhdGlvbi5URVNUKTsKKyAgICAgIGlmKCFtX2VuYWJsZWRUZXN0KSB7CisgICAgICAgIExpc3Q8WG1sVGVzdD4gdGVzdHM9IG1fY3VycmVudFN1aXRlLmdldFRlc3RzKCk7CisgICAgICAgIHRlc3RzLnJlbW92ZSh0ZXN0cy5zaXplKCkgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgPGNsYXNzZXM+CisgICAqLworICBwdWJsaWMgdm9pZCB4bWxDbGFzc2VzKGJvb2xlYW4gc3RhcnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIGlmIChzdGFydCkgeworICAgICAgbV9jdXJyZW50Q2xhc3NlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgbV9jdXJyZW50Q2xhc3NJbmRleCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbV9jdXJyZW50VGVzdC5zZXRYbWxDbGFzc2VzKG1fY3VycmVudENsYXNzZXMpOworICAgICAgbV9jdXJyZW50Q2xhc3NlcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIDxsaXN0ZW5lcnM+CisgICAqLworICBwdWJsaWMgdm9pZCB4bWxMaXN0ZW5lcnMoYm9vbGVhbiBzdGFydCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICBtX2xpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChudWxsICE9IG1fbGlzdGVuZXJzKSB7CisgICAgICAgIG1fY3VycmVudFN1aXRlLnNldExpc3RlbmVycyhtX2xpc3RlbmVycyk7CisgICAgICAgIG1fbGlzdGVuZXJzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgPGxpc3RlbmVyPgorICAgKi8KKyAgcHVibGljIHZvaWQgeG1sTGlzdGVuZXIoYm9vbGVhbiBzdGFydCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICBTdHJpbmcgbGlzdGVuZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJjbGFzcy1uYW1lIik7CisgICAgICBtX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSA8cGFja2FnZXM+CisgICAqLworICBwdWJsaWMgdm9pZCB4bWxQYWNrYWdlcyhib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIG1fY3VycmVudFBhY2thZ2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG51bGwgIT0gbV9jdXJyZW50UGFja2FnZXMpIHsKKyAgICAgICAgc3dpdGNoKG1fbG9jYXRpb25zLnBlZWsoKSkgeworICAgICAgICAgIGNhc2UgVEVTVDoKKyAgICAgICAgICAgIG1fY3VycmVudFRlc3Quc2V0WG1sUGFja2FnZXMobV9jdXJyZW50UGFja2FnZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBTVUlURToKKyAgICAgICAgICAgIG1fY3VycmVudFN1aXRlLnNldFhtbFBhY2thZ2VzKG1fY3VycmVudFBhY2thZ2VzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0xBU1M6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNMQVNTIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbV9jdXJyZW50UGFja2FnZXMgPSBudWxsOworICAgICAgbV9jdXJyZW50UGFja2FnZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIDxtZXRob2Qtc2VsZWN0b3JzPgorICAgKi8KKyAgcHVibGljIHZvaWQgeG1sTWV0aG9kU2VsZWN0b3JzKGJvb2xlYW4gc3RhcnQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgIGlmIChzdGFydCkgeworICAgICAgbV9jdXJyZW50U2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3dpdGNoKG1fbG9jYXRpb25zLnBlZWsoKSkgeworICAgICAgICBjYXNlIFRFU1Q6CisgICAgICAgICAgbV9jdXJyZW50VGVzdC5zZXRNZXRob2RTZWxlY3RvcnMobV9jdXJyZW50U2VsZWN0b3JzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRNZXRob2RTZWxlY3RvcnMobV9jdXJyZW50U2VsZWN0b3JzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbV9jdXJyZW50U2VsZWN0b3JzID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgPHNlbGVjdG9yLWNsYXNzPgorICAgKi8KKyAgcHVibGljIHZvaWQgeG1sU2VsZWN0b3JDbGFzcyhib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIG1fY3VycmVudFNlbGVjdG9yLnNldE5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpKTsKKyAgICAgIFN0cmluZyBwcmlvcml0eSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByaW9yaXR5Iik7CisgICAgICBpZiAocHJpb3JpdHkgPT0gbnVsbCkgeworICAgICAgICBwcmlvcml0eSA9ICIwIjsKKyAgICAgIH0KKyAgICAgIG1fY3VycmVudFNlbGVjdG9yLnNldFByaW9yaXR5KEludGVnZXIucGFyc2VJbnQocHJpb3JpdHkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIDxtZXRob2Qtc2VsZWN0b3I+CisgICAqLworICBwdWJsaWMgdm9pZCB4bWxNZXRob2RTZWxlY3Rvcihib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIG1fY3VycmVudFNlbGVjdG9yID0gbmV3IFhtbE1ldGhvZFNlbGVjdG9yKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbV9jdXJyZW50U2VsZWN0b3JzLmFkZChtX2N1cnJlbnRTZWxlY3Rvcik7CisgICAgICBtX2N1cnJlbnRTZWxlY3RvciA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHhtbE1ldGhvZChib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIG1fY3VycmVudEluY2x1ZGVkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgbV9jdXJyZW50RXhjbHVkZWRNZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBtX2N1cnJlbnRJbmNsdWRlSW5kZXggPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1fY3VycmVudENsYXNzLnNldEluY2x1ZGVkTWV0aG9kcyhtX2N1cnJlbnRJbmNsdWRlZE1ldGhvZHMpOworICAgICAgbV9jdXJyZW50Q2xhc3Muc2V0RXhjbHVkZWRNZXRob2RzKG1fY3VycmVudEV4Y2x1ZGVkTWV0aG9kcyk7CisgICAgICBtX2N1cnJlbnRJbmNsdWRlZE1ldGhvZHMgPSBudWxsOworICAgICAgbV9jdXJyZW50RXhjbHVkZWRNZXRob2RzID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgPHJ1bj4KKyAgICovCisgIHB1YmxpYyB2b2lkIHhtbFJ1bihib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGlmIChzdGFydCkgeworICAgICAgbV9jdXJyZW50UnVucyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChtX2N1cnJlbnRUZXN0ICE9IG51bGwpIHsKKyAgICAgICAgbV9jdXJyZW50VGVzdC5zZXRJbmNsdWRlZEdyb3VwcyhtX2N1cnJlbnRJbmNsdWRlZEdyb3Vwcyk7CisgICAgICAgIG1fY3VycmVudFRlc3Quc2V0RXhjbHVkZWRHcm91cHMobV9jdXJyZW50RXhjbHVkZWRHcm91cHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9jdXJyZW50U3VpdGUuc2V0SW5jbHVkZWRHcm91cHMobV9jdXJyZW50SW5jbHVkZWRHcm91cHMpOworICAgICAgICBtX2N1cnJlbnRTdWl0ZS5zZXRFeGNsdWRlZEdyb3VwcyhtX2N1cnJlbnRFeGNsdWRlZEdyb3Vwcyk7CisgICAgICB9CisgICAgICBtX2N1cnJlbnRSdW5zID0gbnVsbDsKKyAgICB9CisgIH0KKworCisgIC8qKgorICAgKiBQYXJzZSA8Z3JvdXA+CisgICAqLworICBwdWJsaWMgdm9pZCB4bWxHcm91cChib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGlmIChzdGFydCkgeworICAgICAgbV9jdXJyZW50VGVzdC5hZGRYbWxEZXBlbmRlbmN5R3JvdXAoYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpLAorICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRlcGVuZHMtb24iKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE5PVEU6IEkgb25seSBpbnZva2UgeG1sKm1ldGhvZHMgKGUuZy4geG1sU3VpdGUoKSkgaWYgSSBhbSBhY3Rpbmcgb24gYm90aAorICAgKiB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHRhZy4gVGhpcyB3YXkgSSBjYW4ga2VlcCB0aGUgdHJlYXRtZW50IG9mCisgICAqIHRoaXMgdGFnIGluIG9uZSBwbGFjZS4gSWYgSSBhbSBvbmx5IGRvaW5nIHNvbWV0aGluZyB3aGVuIHRoZSB0YWcgb3BlbnMsCisgICAqIHRoZSBjb2RlIGlzIGlubGluZWQgYmVsb3cgaW4gdGhlIHN0YXJ0RWxlbWVudCgpIG1ldGhvZC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGlmICghbV92YWxpZGF0ZSAmJiAhbV9oYXNXYXJuKSB7CisgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3ROR0NvbnRlbnRIYW5kbGVyLmNsYXNzKS53YXJuKCJJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBhZGQgIiArCisgICAgICAgICAgICAgICJcIjwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gXCJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZFwiID5cIiBhdCB0aGUgdG9wIG9mIHlvdXIgZmlsZSwgIiArCisgICAgICAgICAgICAgICJvdGhlcndpc2UgVGVzdE5HIG1heSBmYWlsIG9yIG5vdCB3b3JrIGFzIGV4cGVjdGVkLiIpOworICAgICAgbV9oYXNXYXJuID0gdHJ1ZTsKKyAgICB9CisgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisKKyAgICAvLyBwcHAoIlNUQVJUIEVMRU1FTlQgdXJpOiIgKyB1cmkgKyAiIHNOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSArCisgICAgLy8gIiAiICsgYXR0cmlidXRlcyk7CisgICAgaWYgKCJzdWl0ZSIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sU3VpdGUodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJzdWl0ZS1maWxlIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxTdWl0ZUZpbGUodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJ0ZXN0Ii5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxUZXN0KHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgic2NyaXB0Ii5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxTY3JpcHQodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJtZXRob2Qtc2VsZWN0b3IiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbE1ldGhvZFNlbGVjdG9yKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgibWV0aG9kLXNlbGVjdG9ycyIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sTWV0aG9kU2VsZWN0b3JzKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgic2VsZWN0b3ItY2xhc3MiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFNlbGVjdG9yQ2xhc3ModHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJjbGFzc2VzIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxDbGFzc2VzKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgicGFja2FnZXMiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFBhY2thZ2VzKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgibGlzdGVuZXJzIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxMaXN0ZW5lcnModHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJsaXN0ZW5lciIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sTGlzdGVuZXIodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJjbGFzcyIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgLy8gSWYgbV9jdXJyZW50Q2xhc3NlcyBpcyBudWxsLCB0aGUgWE1MIGlzIGludmFsaWQgYW5kIFNBWAorICAgICAgLy8gd2lsbCBjb21wbGFpbiwgYnV0IGluIHRoZSBtZWFudGltZSwgZG9kZ2UgdGhlIE5QRSBzbyBTQVgKKyAgICAgIC8vIGNhbiBmaW5pc2ggcGFyc2luZyB0aGUgZmlsZS4KKyAgICAgIGlmIChudWxsICE9IG1fY3VycmVudENsYXNzZXMpIHsKKyAgICAgICAgbV9jdXJyZW50Q2xhc3MgPSBuZXcgWG1sQ2xhc3MobmFtZSwgbV9jdXJyZW50Q2xhc3NJbmRleCsrLCBtX2xvYWRDbGFzc2VzKTsKKyAgICAgICAgbV9jdXJyZW50Q2xhc3Muc2V0WG1sVGVzdChtX2N1cnJlbnRUZXN0KTsKKyAgICAgICAgbV9jdXJyZW50Q2xhc3NQYXJhbWV0ZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICAgIG1fY3VycmVudENsYXNzZXMuYWRkKG1fY3VycmVudENsYXNzKTsKKyAgICAgICAgcHVzaExvY2F0aW9uKExvY2F0aW9uLkNMQVNTKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoInBhY2thZ2UiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIGlmIChudWxsICE9IG1fY3VycmVudFBhY2thZ2VzKSB7CisgICAgICAgIG1fY3VycmVudFBhY2thZ2UgPSBuZXcgWG1sUGFja2FnZSgpOworICAgICAgICBtX2N1cnJlbnRQYWNrYWdlLnNldE5hbWUobmFtZSk7CisgICAgICAgIG1fY3VycmVudFBhY2thZ2VzLmFkZChtX2N1cnJlbnRQYWNrYWdlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoImRlZmluZSIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sRGVmaW5lKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgicnVuIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxSdW4odHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJncm91cCIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sR3JvdXAodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJncm91cHMiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIG1fY3VycmVudEluY2x1ZGVkR3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBtX2N1cnJlbnRFeGNsdWRlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKyAgICBlbHNlIGlmICgibWV0aG9kcyIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sTWV0aG9kKHRydWUsIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBlbHNlIGlmICgiaW5jbHVkZSIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sSW5jbHVkZSh0cnVlLCBhdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoImV4Y2x1ZGUiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbEV4Y2x1ZGUodHJ1ZSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCJwYXJhbWV0ZXIiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIFN0cmluZyB2YWx1ZSA9IGV4cGFuZFZhbHVlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZhbHVlIikpOworICAgICAgc3dpdGNoKG1fbG9jYXRpb25zLnBlZWsoKSkgeworICAgICAgICBjYXNlIFRFU1Q6CisgICAgICAgICAgbV9jdXJyZW50VGVzdFBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVUlURToKKyAgICAgICAgICBtX2N1cnJlbnRTdWl0ZVBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTEFTUzoKKyAgICAgICAgICBtX2N1cnJlbnRDbGFzc1BhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkNMVURFOgorICAgICAgICAgIG1fY3VycmVudEluY2x1ZGUucGFyYW1ldGVycy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluY2x1ZGUgeworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBpbnZvY2F0aW9uTnVtYmVyczsKKyAgICBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICBwdWJsaWMgSW5jbHVkZShTdHJpbmcgbmFtZSwgU3RyaW5nIG51bWJlcnMpIHsKKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICB0aGlzLmludm9jYXRpb25OdW1iZXJzID0gbnVtYmVyczsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgeG1sSW5jbHVkZShib29sZWFuIHN0YXJ0LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgIG1fbG9jYXRpb25zLnB1c2goTG9jYXRpb24uSU5DTFVERSk7CisgICAgICBtX2N1cnJlbnRJbmNsdWRlID0gbmV3IEluY2x1ZGUoYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpLAorICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImludm9jYXRpb24tbnVtYmVycyIpKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIG5hbWUgPSBtX2N1cnJlbnRJbmNsdWRlLm5hbWU7CisgICAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnRJbmNsdWRlZE1ldGhvZHMpIHsKKyAgICAgICAgU3RyaW5nIGluID0gbV9jdXJyZW50SW5jbHVkZS5pbnZvY2F0aW9uTnVtYmVyczsKKyAgICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlOworICAgICAgICBpZiAoIVV0aWxzLmlzU3RyaW5nRW1wdHkoaW4pKSB7CisgICAgICAgICAgaW5jbHVkZSA9IG5ldyBYbWxJbmNsdWRlKG5hbWUsIHN0cmluZ1RvTGlzdChpbiksIG1fY3VycmVudEluY2x1ZGVJbmRleCsrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmNsdWRlID0gbmV3IFhtbEluY2x1ZGUobmFtZSwgbV9jdXJyZW50SW5jbHVkZUluZGV4KyspOworICAgICAgICB9CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1fY3VycmVudEluY2x1ZGUucGFyYW1ldGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgaW5jbHVkZS5hZGRQYXJhbWV0ZXIoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW5jbHVkZS5zZXREZXNjcmlwdGlvbihtX2N1cnJlbnRJbmNsdWRlLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgbV9jdXJyZW50SW5jbHVkZWRNZXRob2RzLmFkZChpbmNsdWRlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG51bGwgIT0gbV9jdXJyZW50RGVmaW5lcykgeworICAgICAgICBtX2N1cnJlbnRNZXRhR3JvdXAuYWRkKG5hbWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAobnVsbCAhPSBtX2N1cnJlbnRSdW5zKSB7CisgICAgICAgIG1fY3VycmVudEluY2x1ZGVkR3JvdXBzLmFkZChuYW1lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG51bGwgIT0gbV9jdXJyZW50UGFja2FnZSkgeworICAgICAgICBtX2N1cnJlbnRQYWNrYWdlLmdldEluY2x1ZGUoKS5hZGQobmFtZSk7CisgICAgICB9CisKKyAgICAgIHBvcExvY2F0aW9uKExvY2F0aW9uLklOQ0xVREUpOworICAgICAgbV9jdXJyZW50SW5jbHVkZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHhtbEV4Y2x1ZGUoYm9vbGVhbiBzdGFydCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICBtX2xvY2F0aW9ucy5wdXNoKExvY2F0aW9uLkVYQ0xVREUpOworICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnRFeGNsdWRlZE1ldGhvZHMpIHsKKyAgICAgICAgbV9jdXJyZW50RXhjbHVkZWRNZXRob2RzLmFkZChuYW1lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG51bGwgIT0gbV9jdXJyZW50UnVucykgeworICAgICAgICBtX2N1cnJlbnRFeGNsdWRlZEdyb3Vwcy5hZGQobmFtZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChudWxsICE9IG1fY3VycmVudFBhY2thZ2UpIHsKKyAgICAgICAgbV9jdXJyZW50UGFja2FnZS5nZXRFeGNsdWRlKCkuYWRkKG5hbWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwb3BMb2NhdGlvbihMb2NhdGlvbi5FWENMVURFKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcHVzaExvY2F0aW9uKExvY2F0aW9uIGwpIHsKKyAgICBtX2xvY2F0aW9ucy5wdXNoKGwpOworICB9CisKKyAgcHJpdmF0ZSBMb2NhdGlvbiBwb3BMb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgIHJldHVybiBtX2xvY2F0aW9ucy5wb3AoKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBzdHJpbmdUb0xpc3QoU3RyaW5nIGluKSB7CisgICAgU3RyaW5nW10gbnVtYmVycyA9IGluLnNwbGl0KCIgIik7CisgICAgTGlzdDxJbnRlZ2VyPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKFN0cmluZyBuIDogbnVtYmVycykgeworICAgICAgcmVzdWx0LmFkZChJbnRlZ2VyLnBhcnNlSW50KG4pKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgaWYgKCJzdWl0ZSIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sU3VpdGUoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgic3VpdGUtZmlsZSIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sU3VpdGVGaWxlKGZhbHNlLCBudWxsKTsKKyAgICB9CisgICAgZWxzZSBpZiAoInRlc3QiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFRlc3QoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgiZGVmaW5lIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxEZWZpbmUoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgicnVuIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxSdW4oZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgibWV0aG9kcyIuZXF1YWxzKHFOYW1lKSkgeworICAgICAgeG1sTWV0aG9kKGZhbHNlLCBudWxsKTsKKyAgICB9CisgICAgZWxzZSBpZiAoImNsYXNzZXMiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbENsYXNzZXMoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgicGFja2FnZXMiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFBhY2thZ2VzKGZhbHNlLCBudWxsKTsKKyAgICB9CisgICAgZWxzZSBpZiAoImNsYXNzIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICBtX2N1cnJlbnRDbGFzcy5zZXRQYXJhbWV0ZXJzKG1fY3VycmVudENsYXNzUGFyYW1ldGVycyk7CisgICAgICBtX2N1cnJlbnRDbGFzc1BhcmFtZXRlcnMgPSBudWxsOworICAgICAgcG9wTG9jYXRpb24oTG9jYXRpb24uQ0xBU1MpOworICAgIH0KKyAgICBlbHNlIGlmICgibGlzdGVuZXJzIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxMaXN0ZW5lcnMoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgibWV0aG9kLXNlbGVjdG9yIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxNZXRob2RTZWxlY3RvcihmYWxzZSwgbnVsbCk7CisgICAgfQorICAgIGVsc2UgaWYgKCJtZXRob2Qtc2VsZWN0b3JzIi5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxNZXRob2RTZWxlY3RvcnMoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgic2VsZWN0b3ItY2xhc3MiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFNlbGVjdG9yQ2xhc3MoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgic2NyaXB0Ii5lcXVhbHMocU5hbWUpKSB7CisgICAgICB4bWxTY3JpcHQoZmFsc2UsIG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmICgicGFja2FnZXMiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbFBhY2thZ2VzKGZhbHNlLCBudWxsKTsKKyAgICB9CisgICAgZWxzZSBpZiAoImluY2x1ZGUiLmVxdWFscyhxTmFtZSkpIHsKKyAgICAgIHhtbEluY2x1ZGUoZmFsc2UsIG51bGwpOworICAgIH0gZWxzZSBpZiAoImV4Y2x1ZGUiLmVxdWFscyhxTmFtZSkpeworICAgICAgeG1sRXhjbHVkZShmYWxzZSwgbnVsbCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGlmIChtX3ZhbGlkYXRlKSB7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBhcmVXaGl0ZVNwYWNlcyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGNoYXIgYyA9IGNoW2ldOworICAgICAgaWYgKGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcgJiYgYyAhPSAnICcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAobnVsbCAhPSBtX2N1cnJlbnRMYW5ndWFnZSAmJiAhIGFyZVdoaXRlU3BhY2VzKGNoLCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgbV9jdXJyZW50RXhwcmVzc2lvbiArPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgWG1sU3VpdGUgZ2V0U3VpdGUoKSB7CisgICAgcmV0dXJuIG1fY3VycmVudFN1aXRlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4cGFuZFZhbHVlKFN0cmluZyB2YWx1ZSkKKyAgeworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOworICAgIGludCBzdGFydEluZGV4ID0gMDsKKyAgICBpbnQgZW5kSW5kZXggPSAwOworICAgIGludCBzdGFydFBvc2l0aW9uID0gMDsKKyAgICBTdHJpbmcgcHJvcGVydHkgPSBudWxsOworICAgIHdoaWxlICgoc3RhcnRJbmRleCA9IHZhbHVlLmluZGV4T2YoIiR7Iiwgc3RhcnRQb3NpdGlvbikpID4gLTEgJiYgKGVuZEluZGV4ID0gdmFsdWUuaW5kZXhPZigifSIsIHN0YXJ0SW5kZXggKyAzKSkgPiAtMSkgeworICAgICAgcHJvcGVydHkgPSB2YWx1ZS5zdWJzdHJpbmcoc3RhcnRJbmRleCArIDIsIGVuZEluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZyhzdGFydFBvc2l0aW9uLCBzdGFydEluZGV4KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlLnN1YnN0cmluZyhzdGFydFBvc2l0aW9uLCBzdGFydEluZGV4KSk7CisgICAgICB9CisgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICBpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHByb3BlcnR5VmFsdWUgPSBTeXN0ZW0uZ2V0ZW52KHByb3BlcnR5KTsKKyAgICAgIH0KKyAgICAgIGlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcm9wZXJ0eVZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiR7Iik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJvcGVydHkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJ9Iik7CisgICAgICB9CisgICAgICBzdGFydFBvc2l0aW9uID0gc3RhcnRJbmRleCArIDMgKyBwcm9wZXJ0eS5sZW5ndGgoKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlLnN1YnN0cmluZyhzdGFydFBvc2l0aW9uKSk7CisgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWE1MUGFyc2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1hNTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1hNTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFhNTFBhcnNlcjxUPiBpbXBsZW1lbnRzIElGaWxlUGFyc2VyPFQ+IHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXIgbV9zYXhQYXJzZXI7CisKKyAgc3RhdGljIHsKKyAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IGxvYWRTQVhQYXJzZXJGYWN0b3J5KCk7CisKKyAgICBpZiAoc3VwcG9ydHNWYWxpZGF0aW9uKHNwZikpIHsKKyAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgIHNwZi5zZXRWYWxpZGF0aW5nKHRydWUpOworICAgIH0KKworICAgIFNBWFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBwYXJzZXIgPSBzcGYubmV3U0FYUGFyc2VyKCk7CisgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB8IFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgICBtX3NheFBhcnNlciA9IHBhcnNlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBEZWZhdWx0SGFuZGxlciBkaCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHN5bmNocm9uaXplZCAobV9zYXhQYXJzZXIpIHsKKyAgICAgIG1fc2F4UGFyc2VyLnBhcnNlKGlzLCBkaCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRyaWVzIHRvIGxvYWQgYSA8Y29kZT5TQVhQYXJzZXJGYWN0b3J5PC9jb2RlPiBieSB0cnlpbmcgaW4gb3JkZXIgdGhlIGZvbGxvd2luZzoKKyAgICogPHR0PmNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwuamF4cC5TQVhQYXJzZXJGYWN0b3J5SW1wbDwvdHQ+IChTVU4gSkRLNSkKKyAgICogPHR0Pm9yZy5hcGFjaGUuY3JpbXNvbi5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsPC90dD4gKFNVTiBKREsxLjQpIGFuZAorICAgKiBsYXN0IDxjb2RlPlNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTwvY29kZT4uCisgICAqCisgICAqIEByZXR1cm4gYSA8Y29kZT5TQVhQYXJzZXJGYWN0b3J5PC9jb2RlPiBpbXBsZW1lbnRhdGlvbgorICAgKiBAdGhyb3dzIFRlc3ROR0V4Y2VwdGlvbiB0aHJvd24gaWYgbm8gPGNvZGU+U0FYUGFyc2VyRmFjdG9yeTwvY29kZT4gY2FuIGJlIGxvYWRlZAorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBsb2FkU0FYUGFyc2VyRmFjdG9yeSgpIHsKKyAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IG51bGw7CisKKyAgICBTdHJpbmdCdWZmZXIgZXJyb3JMb2c9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB0cnkgeworICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzPSBDbGFzc0hlbHBlci5mb3JOYW1lKCJjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGwiKTsKKyAgICAgIHNwZiA9IChTQVhQYXJzZXJGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICB9CisgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICBlcnJvckxvZy5hcHBlbmQoIkpESzUgU0FYUGFyc2VyRmFjdG9yeSBjYW5ub3QgYmUgbG9hZGVkOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBpZihudWxsID09IHNwZikgeworICAgICAgLy8gSWYgcnVubmluZyB3aXRoIEpESyAxLjQKKyAgICAgIHRyeSB7CisgICAgICAgIENsYXNzIGZhY3RvcnlDbGFzcyA9IENsYXNzSGVscGVyLmZvck5hbWUoIm9yZy5hcGFjaGUuY3JpbXNvbi5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsIik7CisgICAgICAgIHNwZiA9IChTQVhQYXJzZXJGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICBlcnJvckxvZy5hcHBlbmQoIlxuIikuYXBwZW5kKCJKREsxLjQgU0FYUGFyc2VyRmFjdG9yeSBjYW5ub3QgYmUgbG9hZGVkOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUaHJvd2FibGUgY2F1c2U9IG51bGw7CisgICAgaWYobnVsbCA9PSBzcGYpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNwZj0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgfQorICAgICAgY2F0Y2goRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBmY2VycikgeworICAgICAgICBjYXVzZT0gZmNlcnI7CisgICAgICB9CisgICAgfQorCisgICAgaWYobnVsbCA9PSBzcGYpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkNhbm5vdCBpbml0aWFsaXplIGEgU0FYUGFyc2VyRmFjdG9yeVxuIiArIGVycm9yTG9nLnRvU3RyaW5nKCksIGNhdXNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3BmOworICB9CisKKworICAvKioKKyAgICogVGVzdHMgaWYgdGhlIGN1cnJlbnQgPGNvZGU+U0FYUGFyc2VyRmFjdG9yeTwvY29kZT4gc3VwcG9ydHMgRFREIHZhbGlkYXRpb24uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzVmFsaWRhdGlvbihTQVhQYXJzZXJGYWN0b3J5IHNwZikgeworICAgIHRyeSB7CisgICAgICBzcGYuZ2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworLy8gIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltQYXJzZXJdICIgKyBzKTsKKy8vICB9CisKKy8vICAvKioKKy8vICAgKgorLy8gICAqIEBwYXJhbSBhcmd2IGlnbm9yZWQKKy8vICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUKKy8vICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KKy8vICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorLy8gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKy8vICAgKiBAc2luY2UgMS4wCisvLyAgICovCisvLyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikKKy8vICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKy8vICB7CisvLyAgICBYbWxTdWl0ZSBsID0KKy8vICAgICAgbmV3IFBhcnNlcigiYzovZWNsaXBzZS13b3Jrc3BhY2UvdGVzdG5nL3Rlc3QvdGVzdG5nLnhtbCIpLnBhcnNlKCk7CisvLworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKGwpOworLy8gIH0gIEBPdmVycmlkZQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbENsYXNzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDNiNGJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWG1sQ2xhc3MuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuT2JqZWN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIHRhZyA8Y2xhc3M+IGluIHRlc3RuZy54bWwuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgY2xhc3MgWG1sQ2xhc3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg4NTM2MDg5Njk2NjE0OTg5N0w7CisgIHByaXZhdGUgTGlzdDxYbWxJbmNsdWRlPiBtX2luY2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2V4Y2x1ZGVkTWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIFN0cmluZyBtX25hbWUgPSBudWxsOworICBwcml2YXRlIENsYXNzIG1fY2xhc3MgPSBudWxsOworICAvKiogVGhlIGluZGV4IG9mIHRoaXMgY2xhc3MgaW4gdGhlIDx0ZXN0PiB0YWcgKi8KKyAgcHJpdmF0ZSBpbnQgbV9pbmRleDsKKyAgLyoqIFRydWUgaWYgdGhlIGNsYXNzZXMgbmVlZCB0byBiZSBsb2FkZWQgKi8KKyAgcHJpdmF0ZSBib29sZWFuIG1fbG9hZENsYXNzZXMgPSB0cnVlOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9wYXJhbWV0ZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgWG1sVGVzdCBtX3htbFRlc3Q7CisKKyAgcHVibGljIFhtbENsYXNzKCkgeworICAgIGluaXQoIiIsIG51bGwsIDAsIGZhbHNlIC8qIGxvYWQgY2xhc3NlcyAqLyk7CisgIH0KKworICBwdWJsaWMgWG1sQ2xhc3MoU3RyaW5nIG5hbWUpIHsKKyAgICBpbml0KG5hbWUsIG51bGwsIDApOworICB9CisKKyAgcHVibGljIFhtbENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIGxvYWRDbGFzc2VzKSB7CisgICAgaW5pdChuYW1lLCBudWxsLCAwLCBsb2FkQ2xhc3Nlcyk7CisgIH0KKworICBwdWJsaWMgWG1sQ2xhc3MoQ2xhc3MgY2xzKSB7CisgICAgaW5pdChjbHMuZ2V0TmFtZSgpLCBjbHMsIDAsIHRydWUpOworICB9CisKKyAgcHVibGljIFhtbENsYXNzKENsYXNzIGNscywgYm9vbGVhbiBsb2FkQ2xhc3NlcykgeworICAgIGluaXQoY2xzLmdldE5hbWUoKSwgY2xzLCAwLCBsb2FkQ2xhc3Nlcyk7CisgIH0KKworICBwdWJsaWMgWG1sQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgaW50IGluZGV4KSB7CisgICAgaW5pdChjbGFzc05hbWUsIG51bGwsIGluZGV4LCB0cnVlIC8qIGxvYWQgY2xhc3NlcyAqLyk7CisgIH0KKworICBwdWJsaWMgWG1sQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgaW50IGluZGV4LCBib29sZWFuIGxvYWRDbGFzc2VzKSB7CisgICAgaW5pdChjbGFzc05hbWUsIG51bGwsIGluZGV4LCBsb2FkQ2xhc3Nlcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgY2xhc3NOYW1lLCBDbGFzcyBjbHMsIGludCBpbmRleCkgeworICAgIGluaXQoY2xhc3NOYW1lLCBjbHMsIGluZGV4LCB0cnVlIC8qIGxvYWQgY2xhc3NlcyAqLyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgY2xhc3NOYW1lLCBDbGFzcyBjbHMsIGludCBpbmRleCwKKyAgICAgIGJvb2xlYW4gcmVzb2x2ZUNsYXNzKSB7CisgICAgbV9uYW1lID0gY2xhc3NOYW1lOworICAgIG1fY2xhc3MgPSBjbHM7CisgICAgbV9pbmRleCA9IGluZGV4OworCisgICAgaWYgKG51bGwgPT0gbV9jbGFzcyAmJiByZXNvbHZlQ2xhc3MpIHsKKyAgICAgIGxvYWRDbGFzcygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2FkQ2xhc3MoKSB7CisgICAgbV9jbGFzcyA9IENsYXNzSGVscGVyLmZvck5hbWUobV9uYW1lKTsKKworICAgIGlmIChudWxsID09IG1fY2xhc3MpIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGNsYXNzIGluIGNsYXNzcGF0aDogIiArIG1fbmFtZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgorICAgKi8KKyAgcHVibGljIENsYXNzIGdldFN1cHBvcnRDbGFzcygpIHsKKyAgICBpZiAobV9jbGFzcyA9PSBudWxsKSBsb2FkQ2xhc3MoKTsKKyAgICByZXR1cm4gbV9jbGFzczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzc05hbWUgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q2xhc3MoQ2xhc3MgY2xhc3NOYW1lKSB7CisgICAgbV9jbGFzcyA9IGNsYXNzTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2x1ZGVkTWV0aG9kcy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXhjbHVkZWRNZXRob2RzKCkgeworICAgIHJldHVybiBtX2V4Y2x1ZGVkTWV0aG9kczsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZXhjbHVkZWRNZXRob2RzIFRoZSBleGNsdWRlZE1ldGhvZHMgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXhjbHVkZWRNZXRob2RzKExpc3Q8U3RyaW5nPiBleGNsdWRlZE1ldGhvZHMpIHsKKyAgICBtX2V4Y2x1ZGVkTWV0aG9kcyA9IGV4Y2x1ZGVkTWV0aG9kczsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluY2x1ZGVkTWV0aG9kcy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFhtbEluY2x1ZGU+IGdldEluY2x1ZGVkTWV0aG9kcygpIHsKKyAgICByZXR1cm4gbV9pbmNsdWRlZE1ldGhvZHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGluY2x1ZGVkTWV0aG9kcyBUaGUgaW5jbHVkZWRNZXRob2RzIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTWV0aG9kcyhMaXN0PFhtbEluY2x1ZGU+IGluY2x1ZGVkTWV0aG9kcykgeworICAgIG1faW5jbHVkZWRNZXRob2RzID0gaW5jbHVkZWRNZXRob2RzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbV9uYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBtX25hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhc3NlcyBuZWVkIHRvIGJlIGxvYWRlZC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGxvYWRDbGFzc2VzKCkgeworICAgIHJldHVybiBtX2xvYWRDbGFzc2VzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE9iamVjdHMudG9TdHJpbmdIZWxwZXIoZ2V0Q2xhc3MoKSkKKyAgICAgICAgLmFkZCgiY2xhc3MiLCBtX25hbWUpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1htbChTdHJpbmcgaW5kZW50KSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoaW5kZW50KTsKKyAgICBQcm9wZXJ0aWVzIHByb3AgPSBuZXcgUHJvcGVydGllcygpOworICAgIHByb3Auc2V0UHJvcGVydHkoIm5hbWUiLCBnZXROYW1lKCkpOworCisgICAgYm9vbGVhbiBoYXNNZXRob2RzID0gIW1faW5jbHVkZWRNZXRob2RzLmlzRW1wdHkoKSB8fCAhbV9leGNsdWRlZE1ldGhvZHMuaXNFbXB0eSgpOworICAgIGJvb2xlYW4gaGFzUGFyYW1ldGVycyA9ICFtX3BhcmFtZXRlcnMuaXNFbXB0eSgpOworICAgIGlmIChoYXNQYXJhbWV0ZXJzIHx8IGhhc01ldGhvZHMpIHsKKyAgICAgIHhzYi5wdXNoKCJjbGFzcyIsIHByb3ApOworICAgICAgWG1sVXRpbHMuZHVtcFBhcmFtZXRlcnMoeHNiLCBtX3BhcmFtZXRlcnMpOworCisgICAgICBpZiAoaGFzTWV0aG9kcykgeworICAgICAgICB4c2IucHVzaCgibWV0aG9kcyIpOworICAKKyAgICAgICAgZm9yIChYbWxJbmNsdWRlIG0gOiBnZXRJbmNsdWRlZE1ldGhvZHMoKSkgeworICAgICAgICAgIHhzYi5nZXRTdHJpbmdCdWZmZXIoKS5hcHBlbmQobS50b1htbChpbmRlbnQgKyAiICAgICIpKTsKKyAgICAgICAgfQorICAKKyAgICAgICAgZm9yIChTdHJpbmcgbTogZ2V0RXhjbHVkZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIHA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgcC5zZXRQcm9wZXJ0eSgibmFtZSIsIG0pOworICAgICAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImV4Y2x1ZGUiLCBwKTsKKyAgICAgICAgfQorICAKKyAgICAgICAgeHNiLnBvcCgibWV0aG9kcyIpOworICAgICAgfQorCisgICAgICB4c2IucG9wKCJjbGFzcyIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImNsYXNzIiwgcHJvcCk7CisgICAgfQorCisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworCisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxJbnRlZ2VyPiBpbnZvY2F0aW9uTnVtYmVycykgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChJbnRlZ2VyIG4gOiBpbnZvY2F0aW9uTnVtYmVycykgeworICAgICAgaWYgKGkrKyA+IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgcmVzdWx0LmFwcGVuZChuKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIENsb25lIGFuIFhtbENsYXNzIGJ5IGNvcHlpbmcgYWxsIGl0cyBjb21wb25lbnRzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgWG1sQ2xhc3MgcmVzdWx0ID0gbmV3IFhtbENsYXNzKGdldE5hbWUoKSwgZ2V0SW5kZXgoKSwgbG9hZENsYXNzZXMoKSk7CisgICAgcmVzdWx0LnNldEV4Y2x1ZGVkTWV0aG9kcyhnZXRFeGNsdWRlZE1ldGhvZHMoKSk7CisgICAgcmVzdWx0LnNldEluY2x1ZGVkTWV0aG9kcyhnZXRJbmNsdWRlZE1ldGhvZHMoKSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIE5vdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb21lIGZyb20gdGhlIFhNTCBmaWxlLCBpdCdzIGNhbGN1bGF0ZWQKKyAgICogaW50ZXJuYWxseSBhbmQgcmVwcmVzZW50cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBjbGFzcyB3YXMgZm91bmQgaW4gaXRzCisgICAqICZsdDt0ZXN0Jmd0OyB0YWcuICBJdCdzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBvcmRlcmluZyBvZiB0aGUgY2xhc3NlcworICAgKiB3aGVuIHByZXNlcnZlLW9yZGVyIGlzIHRydWUuCisgICAqLworICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgIHJldHVybiBtX2luZGV4OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgbV9pbmRleCA9IGluZGV4OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1fY2xhc3MgPT0gbnVsbCkgPyAwIDogbV9jbGFzcy5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChtX2xvYWRDbGFzc2VzID8gMSA6IDApOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX2V4Y2x1ZGVkTWV0aG9kcyA9PSBudWxsKSA/IDAgOiBtX2V4Y2x1ZGVkTWV0aG9kcy5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV9pbmNsdWRlZE1ldGhvZHMgPT0gbnVsbCkgPyAwIDogbV9pbmNsdWRlZE1ldGhvZHMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBtX2luZGV4OworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX25hbWUgPT0gbnVsbCkgPyAwIDogbV9uYW1lLmhhc2hDb2RlKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBYbWxDbGFzcyBvdGhlciA9IChYbWxDbGFzcykgb2JqOworICAgIGlmIChvdGhlci5tX2xvYWRDbGFzc2VzICE9IG1fbG9hZENsYXNzZXMpIHsKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9leGNsdWRlZE1ldGhvZHMuZXF1YWxzKG90aGVyLm1fZXhjbHVkZWRNZXRob2RzKSkgeworICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9CisgICAgaWYgKG1faW5jbHVkZWRNZXRob2RzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2luY2x1ZGVkTWV0aG9kcyAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1faW5jbHVkZWRNZXRob2RzLmVxdWFscyhvdGhlci5tX2luY2x1ZGVkTWV0aG9kcykpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworLy8gICAgaWYgKG1faW5kZXggIT0gb3RoZXIubV9pbmRleCkKKy8vICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9uYW1lID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX25hbWUgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX25hbWUuZXF1YWxzKG90aGVyLm1fbmFtZSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworICAgIG1fcGFyYW1ldGVycy5jbGVhcigpOworICAgIG1fcGFyYW1ldGVycy5wdXRBbGwocGFyYW1ldGVycyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoaXMgdGVzdCB0YWcgYW5kIHRoZSB0YWdzIGFib3ZlIGl0LgorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QWxsUGFyYW1ldGVycygpIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG1feG1sVGVzdC5nZXRMb2NhbFBhcmFtZXRlcnMoKTsKKyAgICByZXN1bHQucHV0QWxsKHBhcmFtZXRlcnMpOworICAgIHJlc3VsdC5wdXRBbGwobV9wYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGlzIHRhZywgYW5kIG9ubHkgdGhpcyB0ZXN0IHRhZy4gVG8gcmV0cmlldmUKKyAgICogdGhlIGluaGVyaXRlZCBwYXJhbWV0ZXJzIGFzIHdlbGwsIGNhbGwge0Bjb2RlIGdldEFsbFBhcmFtZXRlcnMoKX0uCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRMb2NhbFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIG1fcGFyYW1ldGVyczsKKyAgfQorCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIGdldExvY2FsUGFyYW1ldGVycygpfSBvciB7QGNvZGUgZ2V0QWxsUGFyYW1ldGVycygpfQorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gZ2V0QWxsUGFyYW1ldGVycygpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0WG1sVGVzdChYbWxUZXN0IHRlc3QpIHsKKyAgICBtX3htbFRlc3QgPSB0ZXN0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbERlZmluZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxEZWZpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVhYzRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxEZWZpbmUuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuQ29sbGVjdGlvblV0aWxzLmhhc0VsZW1lbnRzOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLk9uRWxlbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgWG1sRGVmaW5lIHsKKworICBwcml2YXRlIFN0cmluZyBtX25hbWU7CisKKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIG1fbmFtZSA9IG5hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG1fbmFtZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9YbWwoU3RyaW5nIGluZGVudCkgeworICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKGluZGVudCk7CisgICAgYm9vbGVhbiBoYXNFbGVtZW50cyA9IGhhc0VsZW1lbnRzKG1faW5jbHVkZXMpOworICAgIGlmIChoYXNFbGVtZW50cykgeworICAgICAgeHNiLnB1c2goImRlZmluZSIsICJuYW1lIiwgbV9uYW1lKTsKKyAgICB9CisgICAgZm9yIChTdHJpbmcgcyA6IG1faW5jbHVkZXMpIHsKKyAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImluY2x1ZGUiLCAibmFtZSIsIHMpOworICAgIH0KKyAgICBpZiAoaGFzRWxlbWVudHMpIHsKKyAgICAgIHhzYi5wb3AoImRlZmluZSIpOworICAgIH0KKworICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1faW5jbHVkZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBAT25FbGVtZW50KHRhZyA9ICJpbmNsdWRlIiwgYXR0cmlidXRlcyA9ICJuYW1lIikKKyAgcHVibGljIHZvaWQgb25FbGVtZW50KFN0cmluZyBuYW1lKSB7CisgICAgbV9pbmNsdWRlcy5hZGQobmFtZSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVzKCkgeworICAgIHJldHVybiBtX2luY2x1ZGVzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbERlcGVuZGVuY2llcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxEZXBlbmRlbmNpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIyNGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxEZXBlbmRlbmNpZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLk9uRWxlbWVudDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlscy5oYXNFbGVtZW50czsKKworcHVibGljIGNsYXNzIFhtbERlcGVuZGVuY2llcyB7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1feG1sRGVwZW5kZW5jeUdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIEBPbkVsZW1lbnQodGFnID0gImdyb3VwIiwgYXR0cmlidXRlcyA9IHsgIm5hbWUiLCAiZGVwZW5kcy1vbiIgfSkKKyAgcHVibGljIHZvaWQgb25Hcm91cChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlcGVuZHNPbikgeworICAgIG1feG1sRGVwZW5kZW5jeUdyb3Vwcy5wdXQobmFtZSwgZGVwZW5kc09uKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldERlcGVuZGVuY2llcygpIHsKKyAgICByZXR1cm4gbV94bWxEZXBlbmRlbmN5R3JvdXBzOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1htbChTdHJpbmcgaW5kZW50KSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoaW5kZW50KTsKKyAgICBib29sZWFuIGhhc0VsZW1lbnRzID0gaGFzRWxlbWVudHMobV94bWxEZXBlbmRlbmN5R3JvdXBzKTsKKyAgICBpZiAoaGFzRWxlbWVudHMpIHsKKyAgICAgIHhzYi5wdXNoKCJkZXBlbmRlbmNpZXMiKTsKKyAgICB9CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbV94bWxEZXBlbmRlbmN5R3JvdXBzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImluY2x1ZGUiLCAibmFtZSIsIGVudHJ5LmdldEtleSgpLCAiZGVwZW5kcy1vbiIsIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoaGFzRWxlbWVudHMpIHsKKyAgICAgIHhzYi5wb3AoImRlcGVuZGVuY2llcyIpOworICAgIH0KKworICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbEdyb3Vwcy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U2OGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxHcm91cHMuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5kb20uVGFnOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuQ29sbGVjdGlvblV0aWxzLmhhc0VsZW1lbnRzOworCitwdWJsaWMgY2xhc3MgWG1sR3JvdXBzIHsKKworICBwcml2YXRlIExpc3Q8WG1sRGVmaW5lPiBtX2RlZmluZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBYbWxSdW4gbV9ydW47CisgIHByaXZhdGUgTGlzdDxYbWxEZXBlbmRlbmNpZXM+IG1fZGVwZW5kZW5jaWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHVibGljIExpc3Q8WG1sRGVmaW5lPiBnZXREZWZpbmVzKCkgeworICAgIHJldHVybiBtX2RlZmluZXM7CisgIH0KKworICBAVGFnKG5hbWUgPSAiZGVmaW5lIikKKyAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFhtbERlZmluZSBkZWZpbmUpIHsKKyAgICBnZXREZWZpbmVzKCkuYWRkKGRlZmluZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREZWZpbmVzKExpc3Q8WG1sRGVmaW5lPiBkZWZpbmVzKSB7CisgICAgbV9kZWZpbmVzID0gZGVmaW5lczsKKyAgfQorCisgIHB1YmxpYyBYbWxSdW4gZ2V0UnVuKCkgeworICAgIHJldHVybiBtX3J1bjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFJ1bihYbWxSdW4gcnVuKSB7CisgICAgbV9ydW4gPSBydW47CisgIH0KKworICBwdWJsaWMgTGlzdDxYbWxEZXBlbmRlbmNpZXM+IGdldERlcGVuZGVuY2llcygpIHsKKyAgICByZXR1cm4gbV9kZXBlbmRlbmNpZXM7CisgIH0KKworLy8gIHB1YmxpYyB2b2lkIHNldERlcGVuZGVuY2llcyhMaXN0PFhtbERlcGVuZGVuY2llcz4gZGVwZW5kZW5jaWVzKSB7CisvLyAgICBtX2RlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llczsKKy8vICB9CisKKyAgQFRhZyhuYW1lID0gImRlcGVuZGVuY2llcyIpCisgIHB1YmxpYyB2b2lkIHNldFhtbERlcGVuZGVuY2llcyhYbWxEZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzKSB7CisgICAgbV9kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY2llcyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvWG1sKFN0cmluZyBpbmRlbnQpIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihpbmRlbnQpOworICAgIFN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgIjsKKworICAgIGJvb2xlYW4gaGFzR3JvdXBzID0gaGFzRWxlbWVudHMobV9kZWZpbmVzKSB8fCBtX3J1biAhPSBudWxsCisgICAgICAgIHx8IGhhc0VsZW1lbnRzKG1fZGVwZW5kZW5jaWVzKTsKKworICAgIGlmIChoYXNHcm91cHMpIHsKKyAgICAgIHhzYi5wdXNoKCJncm91cHMiKTsKKyAgICB9CisKKyAgICBmb3IgKFhtbERlZmluZSBkIDogbV9kZWZpbmVzKSB7CisgICAgICB4c2IuZ2V0U3RyaW5nQnVmZmVyKCkuYXBwZW5kKGQudG9YbWwoaW5kZW50MikpOworICAgIH0KKworICAgIHhzYi5nZXRTdHJpbmdCdWZmZXIoKS5hcHBlbmQobV9ydW4udG9YbWwoaW5kZW50MikpOworCisgICAgZm9yIChYbWxEZXBlbmRlbmNpZXMgZCA6IG1fZGVwZW5kZW5jaWVzKSB7CisgICAgICB4c2IuZ2V0U3RyaW5nQnVmZmVyKCkuYXBwZW5kKGQudG9YbWwoaW5kZW50MikpOworICAgIH0KKworICAgIGlmIChoYXNHcm91cHMpIHsKKyAgICAgIHhzYi5wb3AoImdyb3VwcyIpOworICAgIH0KKworICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxJbmNsdWRlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbEluY2x1ZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNlYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxJbmNsdWRlLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworcHVibGljIGNsYXNzIFhtbEluY2x1ZGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwcml2YXRlIFN0cmluZyBtX25hbWU7CisgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtX2ludm9jYXRpb25OdW1iZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgaW50IG1faW5kZXg7CisgIHByaXZhdGUgU3RyaW5nIG1fZGVzY3JpcHRpb247CisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX3BhcmFtZXRlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBwcml2YXRlIFhtbENsYXNzIG1feG1sQ2xhc3M7CisKKyAgcHVibGljIFhtbEluY2x1ZGUoKSB7CisgIH0KKworICBwdWJsaWMgWG1sSW5jbHVkZShTdHJpbmcgbikgeworICAgIHRoaXMobiwgQ29sbGVjdGlvbnMuPEludGVnZXI+IGVtcHR5TGlzdCgpLCAwKTsKKyAgfQorCisgIHB1YmxpYyBYbWxJbmNsdWRlKFN0cmluZyBuLCBpbnQgaW5kZXgpIHsKKyAgICB0aGlzKG4sIENvbGxlY3Rpb25zLjxJbnRlZ2VyPiBlbXB0eUxpc3QoKSwgaW5kZXgpOworICB9CisKKyAgcHVibGljIFhtbEluY2x1ZGUoU3RyaW5nIG4sIExpc3Q8SW50ZWdlcj4gbGlzdCwgaW50IGluZGV4KSB7CisgICAgbV9uYW1lID0gbjsKKyAgICBtX2ludm9jYXRpb25OdW1iZXJzID0gbGlzdDsKKyAgICBtX2luZGV4ID0gaW5kZXg7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICBtX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBtX2Rlc2NyaXB0aW9uOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX25hbWU7CisgIH0KKworICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRJbnZvY2F0aW9uTnVtYmVycygpIHsKKyAgICByZXR1cm4gbV9pbnZvY2F0aW9uTnVtYmVyczsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgcmV0dXJuIG1faW5kZXg7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvWG1sKFN0cmluZyBpbmRlbnQpIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihpbmRlbnQpOworICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgcC5zZXRQcm9wZXJ0eSgibmFtZSIsIGdldE5hbWUoKSk7CisgICAgTGlzdDxJbnRlZ2VyPiBpbnZvY2F0aW9uTnVtYmVycyA9IGdldEludm9jYXRpb25OdW1iZXJzKCk7CisgICAgaWYgKGludm9jYXRpb25OdW1iZXJzICE9IG51bGwgJiYgaW52b2NhdGlvbk51bWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgcC5zZXRQcm9wZXJ0eSgiaW52b2NhdGlvbi1udW1iZXJzIiwKKyAgICAgICAgICBYbWxDbGFzcy5saXN0VG9TdHJpbmcoaW52b2NhdGlvbk51bWJlcnMpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGlmICghbV9wYXJhbWV0ZXJzLmlzRW1wdHkoKSl7CisgICAgICAgIHhzYi5wdXNoKCJpbmNsdWRlIiwgcCk7CisgICAgICAgIFhtbFV0aWxzLmR1bXBQYXJhbWV0ZXJzKHhzYiwgbV9wYXJhbWV0ZXJzKTsKKyAgICAgICAgeHNiLnBvcCgiaW5jbHVkZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiaW5jbHVkZSIsIHApOworICAgIH0KKworICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbV9pbmRleDsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV9pbnZvY2F0aW9uTnVtYmVycyA9PSBudWxsKSA/IDAgOiBtX2ludm9jYXRpb25OdW1iZXJzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKG1fcGFyYW1ldGVycyA9PSBudWxsID8gMCA6IG1fcGFyYW1ldGVycy5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobV9uYW1lID09IG51bGwpID8gMCA6IG1fbmFtZS5oYXNoQ29kZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgWG1sSW5jbHVkZSBvdGhlciA9IChYbWxJbmNsdWRlKSBvYmo7CisgICAgLy8gaWYgKG1faW5kZXggIT0gb3RoZXIubV9pbmRleCkKKyAgICAvLyByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX2ludm9jYXRpb25OdW1iZXJzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2ludm9jYXRpb25OdW1iZXJzICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9pbnZvY2F0aW9uTnVtYmVycy5lcXVhbHMob3RoZXIubV9pbnZvY2F0aW9uTnVtYmVycykpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX25hbWUgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fbmFtZSAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1fbmFtZS5lcXVhbHMob3RoZXIubV9uYW1lKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1fcGFyYW1ldGVycyA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9wYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFtX3BhcmFtZXRlcnMuZXF1YWxzKG90aGVyLm1fcGFyYW1ldGVycykpIHsKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICBtX3BhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIGdldExvY2FsUGFyYW1ldGVycygpfSBvciB7QGNvZGUgZ2V0QWxsUGFyYW1ldGVycygpfQorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gZ2V0QWxsUGFyYW1ldGVycygpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGlzIHRlc3QgdGFnLCBhbmQgb25seSB0aGlzIHRlc3QgdGFnLiBUbyByZXRyaWV2ZQorICAgKiB0aGUgaW5oZXJpdGVkIHBhcmFtZXRlcnMgYXMgd2VsbCwgY2FsbCB7QGNvZGUgZ2V0QWxsUGFyYW1ldGVycygpfS4KKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvY2FsUGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gbV9wYXJhbWV0ZXJzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGlzIHRhZyBhbmQgdGhlIHRhZ3MgYWJvdmUgaXQuCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbGxQYXJhbWV0ZXJzKCkgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgaWYgKG1feG1sQ2xhc3MgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LnB1dEFsbChtX3htbENsYXNzLmdldEFsbFBhcmFtZXRlcnMoKSk7CisgICAgfQorICAgIHJlc3VsdC5wdXRBbGwobV9wYXJhbWV0ZXJzKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0WG1sQ2xhc3MoWG1sQ2xhc3MgeG1sQ2xhc3MpIHsKKyAgICBtX3htbENsYXNzID0geG1sQ2xhc3M7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxNZXRob2RTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxNZXRob2RTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkY2JlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbE1ldGhvZFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLk9uRWxlbWVudDsKKworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVzY3JpYmVzIHRoZSB0YWcgPG1ldGhvZC1zZWxlY3Rvcj4gIGluIHRlc3RuZy54bWwuCisgKgorICogQ3JlYXRlZCBvbiBTZXAgMjYsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgWG1sTWV0aG9kU2VsZWN0b3IgeworICAvLyBFaXRoZXIgdGhpczoKKyAgcHJpdmF0ZSBTdHJpbmcgbV9jbGFzc05hbWU7CisgIHByaXZhdGUgaW50IG1fcHJpb3JpdHk7CisKKyAgLy8gT3IgdGhhdDoKKyAgcHJpdmF0ZSBYbWxTY3JpcHQgbV9zY3JpcHQgPSBuZXcgWG1sU2NyaXB0KCk7CisKKyAgLy8gRm9yIFlBTUwKKyAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBzKSB7CisgICAgbV9jbGFzc05hbWUgPSBzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIG1fY2xhc3NOYW1lOworICB9CisKKyAgLy8gRm9yIFlBTUwKKyAgQE9uRWxlbWVudCh0YWcgPSAic2VsZWN0b3ItY2xhc3MiLCBhdHRyaWJ1dGVzID0geyAibmFtZSIsICJwcmlvcml0eSIgfSkKKyAgcHVibGljIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHByaW9yaXR5KSB7CisgICAgc2V0TmFtZShuYW1lKTsKKyAgICBzZXRQcmlvcml0eShJbnRlZ2VyLnBhcnNlSW50KHByaW9yaXR5KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgbV9jbGFzc05hbWUgPSBuYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFhtbFNjcmlwdCBzY3JpcHQpIHsKKyAgICBtX3NjcmlwdCA9IHNjcmlwdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4cHJlc3Npb24uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb24oKSB7CisgICAgcmV0dXJuIG1fc2NyaXB0LmdldFNjcmlwdCgpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBtX3NjcmlwdC5zZXRTY3JpcHQoZXhwcmVzc2lvbik7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgcmV0dXJuIG1fc2NyaXB0LmdldExhbmd1YWdlKCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGxhbmd1YWdlIFRoZSBsYW5ndWFnZSB0byBzZXQuCisgICAqLworLy8gIEBPbkVsZW1lbnQodGFnID0gInNjcmlwdCIsIGF0dHJpYnV0ZXMgPSAibGFuZ3VhZ2UiKQorICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICBtX3NjcmlwdC5zZXRMYW5ndWFnZShsYW5ndWFnZSk7CisvLyAgICBtX2xhbmd1YWdlID0gbGFuZ3VhZ2U7CisgIH0KKworICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgeworICAgIHJldHVybiBtX3ByaW9yaXR5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbV9wcmlvcml0eSA9IHByaW9yaXR5OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1htbE1ldGhvZFNlbGVjdG9yXSAiICsgcyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvWG1sKFN0cmluZyBpbmRlbnQpIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihpbmRlbnQpOworCisgICAgeHNiLnB1c2goIm1ldGhvZC1zZWxlY3RvciIpOworCisgICAgaWYgKG51bGwgIT0gbV9jbGFzc05hbWUpIHsKKyAgICAgIFByb3BlcnRpZXMgY2xzUHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICBjbHNQcm9wLnNldFByb3BlcnR5KCJuYW1lIiwgZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgaWYoZ2V0UHJpb3JpdHkoKSAhPSAtMSkgeworICAgICAgICBjbHNQcm9wLnNldFByb3BlcnR5KCJwcmlvcml0eSIsIFN0cmluZy52YWx1ZU9mKGdldFByaW9yaXR5KCkpKTsKKyAgICAgIH0KKyAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoInNlbGVjdG9yLWNsYXNzIiwgY2xzUHJvcCk7CisgICAgfQorICAgIGVsc2UgaWYgKGdldExhbmd1YWdlKCkgIT0gbnVsbCkgeworICAgICAgUHJvcGVydGllcyBzY3JpcHRQcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgIHNjcmlwdFByb3Auc2V0UHJvcGVydHkoImxhbmd1YWdlIiwgZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICB4c2IucHVzaCgic2NyaXB0Iiwgc2NyaXB0UHJvcCk7CisgICAgICB4c2IuYWRkQ0RBVEEoZ2V0RXhwcmVzc2lvbigpKTsKKyAgICAgIHhzYi5wb3AoInNjcmlwdCIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUZXN0TkdFeGNlcHRpb24oIkludmFsaWQgTWV0aG9kIFNlbGVjdG9yOiAgZm91bmQgbmVpdGhlciBjbGFzcyBuYW1lIG5vciBsYW5ndWFnZSIpOworICAgIH0KKworICAgIHhzYi5wb3AoIm1ldGhvZC1zZWxlY3RvciIpOworCisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fY2xhc3NOYW1lID09IG51bGwpID8gMCA6IG1fY2xhc3NOYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChnZXRFeHByZXNzaW9uKCkgPT0gbnVsbCkgPyAwIDogZ2V0RXhwcmVzc2lvbigpLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChnZXRMYW5ndWFnZSgpID09IG51bGwpID8gMCA6IGdldExhbmd1YWdlKCkuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBtX3ByaW9yaXR5OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBYbWxNZXRob2RTZWxlY3RvciBvdGhlciA9IChYbWxNZXRob2RTZWxlY3Rvcikgb2JqOworICAgIGlmIChtX2NsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9jbGFzc05hbWUgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX2NsYXNzTmFtZS5lcXVhbHMob3RoZXIubV9jbGFzc05hbWUpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAoZ2V0RXhwcmVzc2lvbigpID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5nZXRFeHByZXNzaW9uKCkgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFnZXRFeHByZXNzaW9uKCkuZXF1YWxzKG90aGVyLmdldEV4cHJlc3Npb24oKSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChnZXRMYW5ndWFnZSgpID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5nZXRMYW5ndWFnZSgpICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMob3RoZXIuZ2V0TGFuZ3VhZ2UoKSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX3ByaW9yaXR5ICE9IG90aGVyLm1fcHJpb3JpdHkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbE1ldGhvZFNlbGVjdG9ycy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxNZXRob2RTZWxlY3RvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc2NmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxNZXRob2RTZWxlY3RvcnMuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuQ29sbGVjdGlvblV0aWxzLmhhc0VsZW1lbnRzOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLnJlcG9ydGVycy5YTUxTdHJpbmdCdWZmZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFhtbE1ldGhvZFNlbGVjdG9ycyB7CisKKyAgcHJpdmF0ZSBMaXN0PFhtbE1ldGhvZFNlbGVjdG9yPiBtX21ldGhvZFNlbGVjdG9ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHB1YmxpYyBYbWxNZXRob2RTZWxlY3RvcnMoKSB7CisgIH0KKworICBwdWJsaWMgTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gZ2V0TWV0aG9kU2VsZWN0b3JzKCkgeworICAgIHJldHVybiBtX21ldGhvZFNlbGVjdG9yczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1ldGhvZFNlbGVjdG9yKFhtbE1ldGhvZFNlbGVjdG9yIHhtcykgeworICAgIG1fbWV0aG9kU2VsZWN0b3JzLmFkZCh4bXMpOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1htbChTdHJpbmcgaW5kZW50KSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoaW5kZW50KTsKKyAgICBpZiAoaGFzRWxlbWVudHMobV9tZXRob2RTZWxlY3RvcnMpKSB7CisgICAgICB4c2IucHVzaCgibWV0aG9kLXNlbGVjdG9ycyIpOworICAgICAgZm9yIChYbWxNZXRob2RTZWxlY3RvciBzZWxlY3RvciA6IG1fbWV0aG9kU2VsZWN0b3JzKSB7CisgICAgICAgIHhzYi5nZXRTdHJpbmdCdWZmZXIoKS5hcHBlbmQoc2VsZWN0b3IudG9YbWwoaW5kZW50ICsgIiAgIikpOworICAgICAgfQorICAKKyAgICAgIHhzYi5wb3AoIm1ldGhvZC1zZWxlY3RvcnMiKTsKKyAgICB9CisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFBhY2thZ2UuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWG1sUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhYmUxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuUGFja2FnZVV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVzY3JpYmVzIHRoZSB0YWcgPHBhY2thZ2U+ICBpbiB0ZXN0bmcueG1sLgorICoKKyAqIEBhdXRob3IgQ2VkcmljCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgWG1sUGFja2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTk5NjM0MTY3MDM1NDkyMzIwNEw7CisgIHByaXZhdGUgU3RyaW5nIG1fbmFtZTsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9pbmNsdWRlID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fZXhjbHVkZSA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8WG1sQ2xhc3M+IG1feG1sQ2xhc3Nlcz0gbnVsbDsKKworICBwdWJsaWMgWG1sUGFja2FnZSgpIHsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyBYbWxQYWNrYWdlKFN0cmluZyBuYW1lKSB7CisgICAgbV9uYW1lID0gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBleGNsdWRlCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4Y2x1ZGUoKSB7CisgICAgcmV0dXJuIG1fZXhjbHVkZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZXhjbHVkZSB0aGUgZXhjbHVkZSB0byBzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGUoTGlzdDxTdHJpbmc+IGV4Y2x1ZGUpIHsKKyAgICBtX2V4Y2x1ZGUgPSBleGNsdWRlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGluY2x1ZGUKKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZSgpIHsKKyAgICByZXR1cm4gbV9pbmNsdWRlOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBpbmNsdWRlIHRoZSBpbmNsdWRlIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SW5jbHVkZShMaXN0PFN0cmluZz4gaW5jbHVkZSkgeworICAgIG1faW5jbHVkZSA9IGluY2x1ZGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgbmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX25hbWU7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gc2V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgbV9uYW1lID0gbmFtZTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFhtbENsYXNzPiBnZXRYbWxDbGFzc2VzKCkgeworICAgIGlmKG51bGwgPT0gbV94bWxDbGFzc2VzKSB7CisgICAgICBtX3htbENsYXNzZXM9IGluaXRpYWxpemVYbWxDbGFzc2VzKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1feG1sQ2xhc3NlczsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxYbWxDbGFzcz4gaW5pdGlhbGl6ZVhtbENsYXNzZXMoKSB7CisgICAgTGlzdDxYbWxDbGFzcz4gcmVzdWx0PSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICB0cnkgeworICAgICAgU3RyaW5nW10gY2xhc3NlcyA9IFBhY2thZ2VVdGlscy5maW5kQ2xhc3Nlc0luUGFja2FnZShtX25hbWUsIG1faW5jbHVkZSwgbV9leGNsdWRlKTsKKworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGZvcihTdHJpbmcgY2xhc3NOYW1lOiBjbGFzc2VzKSB7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IFhtbENsYXNzKGNsYXNzTmFtZSwgaW5kZXgrKywgZmFsc2UgLyogZG9uJ3QgbG9hZCBjbGFzc2VzICovKSk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoKElPRXhjZXB0aW9uIGlvZXgpIHsKKyAgICAgIFV0aWxzLmxvZygiWG1sUGFja2FnZSIsIDEsIGlvZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1htbChTdHJpbmcgaW5kZW50KSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoaW5kZW50KTsKKyAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgIHAuc2V0UHJvcGVydHkoIm5hbWUiLCBnZXROYW1lKCkpOworCisgICAgaWYgKGdldEluY2x1ZGUoKS5pc0VtcHR5KCkgJiYgZ2V0RXhjbHVkZSgpLmlzRW1wdHkoKSkgeworICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgicGFja2FnZSIsIHApOworICAgIH0gZWxzZSB7CisgICAgICB4c2IucHVzaCgicGFja2FnZSIsIHApOworCisgICAgICBmb3IgKFN0cmluZyBtIDogZ2V0SW5jbHVkZSgpKSB7CisgICAgICAgIFByb3BlcnRpZXMgaW5jbHVkZVByb3A9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGluY2x1ZGVQcm9wLnNldFByb3BlcnR5KCJuYW1lIiwgbSk7CisgICAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImluY2x1ZGUiLCBpbmNsdWRlUHJvcCk7CisgICAgICB9CisgICAgICBmb3IgKFN0cmluZyBtOiBnZXRFeGNsdWRlKCkpIHsKKyAgICAgICAgUHJvcGVydGllcyBleGNsdWRlUHJvcD0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgZXhjbHVkZVByb3Auc2V0UHJvcGVydHkoIm5hbWUiLCBtKTsKKyAgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiZXhjbHVkZSIsIGV4Y2x1ZGVQcm9wKTsKKyAgICAgIH0KKworICAgICAgeHNiLnBvcCgicGFja2FnZSIpOworICAgIH0KKworICAgIHJldHVybiB4c2IudG9YTUwoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX2V4Y2x1ZGUgPT0gbnVsbCkgPyAwIDogbV9leGNsdWRlLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX2luY2x1ZGUgPT0gbnVsbCkgPyAwIDogbV9pbmNsdWRlLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX25hbWUgPT0gbnVsbCkgPyAwIDogbV9uYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX3htbENsYXNzZXMgPT0gbnVsbCkgPyAwIDogbV94bWxDbGFzc2VzLmhhc2hDb2RlKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBYbWxQYWNrYWdlIG90aGVyID0gKFhtbFBhY2thZ2UpIG9iajsKKyAgICBpZiAobV9leGNsdWRlID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2V4Y2x1ZGUgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX2V4Y2x1ZGUuZXF1YWxzKG90aGVyLm1fZXhjbHVkZSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX2luY2x1ZGUgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1faW5jbHVkZSAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1faW5jbHVkZS5lcXVhbHMob3RoZXIubV9pbmNsdWRlKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1fbmFtZSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9uYW1lICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9uYW1lLmVxdWFscyhvdGhlci5tX25hbWUpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV94bWxDbGFzc2VzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX3htbENsYXNzZXMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3htbENsYXNzZXMuZXF1YWxzKG90aGVyLm1feG1sQ2xhc3NlcykpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIHJldHVybiB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWG1sUnVuLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFJ1bi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjA3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFJ1bi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5Db2xsZWN0aW9uVXRpbHMuaGFzRWxlbWVudHM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5kb20uT25FbGVtZW50OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBYbWxSdW4geworCisgIHB1YmxpYyBTdHJpbmcgdG9YbWwoU3RyaW5nIGluZGVudCkgeworICAgIFhNTFN0cmluZ0J1ZmZlciB4c2IgPSBuZXcgWE1MU3RyaW5nQnVmZmVyKGluZGVudCk7CisgICAgYm9vbGVhbiBoYXNFbGVtZW50cyA9IGhhc0VsZW1lbnRzKG1fZXhjbHVkZXMpIHx8IGhhc0VsZW1lbnRzKG1faW5jbHVkZXMpOworICAgIGlmIChoYXNFbGVtZW50cykgeworICAgICAgeHNiLnB1c2goInJ1biIpOworICAgIH0KKyAgICBmb3IgKFN0cmluZyBzIDogbV9pbmNsdWRlcykgeworICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgiaW5jbHVkZSIsICJuYW1lIiwgcyk7CisgICAgfQorICAgIGZvciAoU3RyaW5nIHMgOiBtX2V4Y2x1ZGVzKSB7CisgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJleGNsdWRlIiwgIm5hbWUiLCBzKTsKKyAgICB9CisgICAgaWYgKGhhc0VsZW1lbnRzKSB7CisgICAgICB4c2IucG9wKCJydW4iKTsKKyAgICB9CisKKyAgICByZXR1cm4geHNiLnRvWE1MKCk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2V4Y2x1ZGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlcygpIHsKKyAgICByZXR1cm4gbV9leGNsdWRlczsKKyAgfQorCisgIEBPbkVsZW1lbnQodGFnID0gImV4Y2x1ZGUiLCBhdHRyaWJ1dGVzID0gIm5hbWUiKQorICBwdWJsaWMgdm9pZCBvbkV4Y2x1ZGUoU3RyaW5nIG5hbWUpIHsKKyAgICBtX2V4Y2x1ZGVzLmFkZChuYW1lKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1faW5jbHVkZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVzKCkgeworICAgIHJldHVybiBtX2luY2x1ZGVzOworICB9CisKKyAgQE9uRWxlbWVudCh0YWcgPSAiaW5jbHVkZSIsIGF0dHJpYnV0ZXMgPSAibmFtZSIpCisgIHB1YmxpYyB2b2lkIG9uSW5jbHVkZShTdHJpbmcgbmFtZSkgeworICAgIG1faW5jbHVkZXMuYWRkKG5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFNjcmlwdC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxTY3JpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWFhN2JjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxTY3JpcHQuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLlRhZ0NvbnRlbnQ7CisKKworcHVibGljIGNsYXNzIFhtbFNjcmlwdCB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbV9sYW5ndWFnZTsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9zY3JpcHQ7CisKKyAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgbV9sYW5ndWFnZSA9IGxhbmd1YWdlOworICB9CisKKyAgQFRhZ0NvbnRlbnQobmFtZSA9ICJzY3JpcHQiKQorICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCkgeworICAgIG1fc2NyaXB0ID0gc2NyaXB0OworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgcmV0dXJuIG1fc2NyaXB0OworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICByZXR1cm4gbV9sYW5ndWFnZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxTdWl0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3OGE5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFN1aXRlLmphdmEKQEAgLTAsMCArMSwxMDc0IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLmRvbS5PbkVsZW1lbnQ7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLk9uRWxlbWVudExpc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuZG9tLlRhZzsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkNvbGxlY3Rpb25VdGlscy5oYXNFbGVtZW50czsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlscy5pc1N0cmluZ05vdEVtcHR5OworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVzY3JpYmVzIHRoZSB0YWcgJmx0O3N1aXRlJmd0OyBpbiB0ZXN0bmcueG1sLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZiA9ICJtYWlsdG86Y2VkcmljJiM2NDtiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZiA9ICdtYWlsdG86dGhlX21pbmRzdG9ybVthdF1ldm9sdmFbZG90XXJvJz5BbGV4YW5kcnUgUG9wZXNjdTwvYT4KKyAqLworcHVibGljIGNsYXNzIFhtbFN1aXRlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgeworICAvKiogUGFyYWxsZWwgbW9kZXMgKi8KKyAgcHVibGljIGVudW0gUGFyYWxsZWxNb2RlIHsKKyAgICBURVNUUywgTUVUSE9EUywgQ0xBU1NFUywgSU5TVEFOQ0VTLCBOT05FLCBUUlVFLCBGQUxTRTsKKworICAgIHB1YmxpYyBzdGF0aWMgWG1sU3VpdGUuUGFyYWxsZWxNb2RlIGdldFZhbGlkUGFyYWxsZWwoU3RyaW5nIHBhcmFsbGVsKSB7CisgICAgICBpZiAocGFyYWxsZWwgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5QYXJhbGxlbE1vZGUudmFsdWVPZihwYXJhbGxlbC50b1VwcGVyQ2FzZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gbmFtZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgfQorICB9CisKKyAgLyoqIENvbmZpZ3VyYXRpb24gZmFpbHVyZSBwb2xpY3kgb3B0aW9ucyAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQID0gInNraXAiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05USU5VRSA9ICJjb250aW51ZSI7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbV90ZXN0OworCisgIC8qKiBUaGUgZGVmYXVsdCBzdWl0ZSBuYW1lIFRPRE8gQ1EgaXMgdGhpcyBPSyBhcyBhIGRlZmF1bHQgbmFtZS4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VJVEVfTkFNRSA9ICJEZWZhdWx0IFN1aXRlIjsKKworICAvKiogVGhlIHN1aXRlIG5hbWUgKGRlZmF1bHRzIHRvIERFRkFVTFRfU1VJVEVfTkFNRSkgKi8KKyAgcHJpdmF0ZSBTdHJpbmcgbV9uYW1lID0gREVGQVVMVF9TVUlURV9OQU1FOworCisgIC8qKiBUaGUgc3VpdGUgdmVyYm9zZSBmbGFnLiAoMCB0byAxMCkqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9WRVJCT1NFID0gMTsKKyAgcHJpdmF0ZSBJbnRlZ2VyIG1fdmVyYm9zZSA9IG51bGw7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbGxlbE1vZGUgREVGQVVMVF9QQVJBTExFTCA9IFBhcmFsbGVsTW9kZS5GQUxTRTsKKyAgcHJpdmF0ZSBQYXJhbGxlbE1vZGUgbV9wYXJhbGxlbCA9IERFRkFVTFRfUEFSQUxMRUw7CisKKyAgcHJpdmF0ZSBTdHJpbmcgbV9wYXJlbnRNb2R1bGUgPSAiIjsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9ndWljZVN0YWdlID0gIiI7CisKKyAgLyoqIFdoZXRoZXIgdG8gU0tJUCBvciBDT05USU5VRSB0byByZS1hdHRlbXB0IGZhaWxlZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09ORklHX0ZBSUxVUkVfUE9MSUNZID0gU0tJUDsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9jb25maWdGYWlsdXJlUG9saWN5ID0gREVGQVVMVF9DT05GSUdfRkFJTFVSRV9QT0xJQ1k7CisKKyAgLyoqIEpVbml0IGNvbXBhdGliaWxpdHkgZmxhZy4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfSlVOSVQgPSBCb29sZWFuLkZBTFNFOworICBwcml2YXRlIEJvb2xlYW4gbV9pc0pVbml0ID0gREVGQVVMVF9KVU5JVDsKKworICAvKiogbWl4ZWQgbW9kZSBmbGFnLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9NSVhFRCA9IEJvb2xlYW4uRkFMU0U7CisgIHByaXZhdGUgQm9vbGVhbiBtX2lzTWl4ZWQgPSBERUZBVUxUX01JWEVEOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTID0gQm9vbGVhbi5GQUxTRTsKKyAgcHJpdmF0ZSBCb29sZWFuIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSBERUZBVUxUX1NLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTOworCisgIC8qKiBUaGUgdGhyZWFkIGNvdW50LiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9USFJFQURfQ09VTlQgPSA1OworICBwcml2YXRlIGludCBtX3RocmVhZENvdW50ID0gREVGQVVMVF9USFJFQURfQ09VTlQ7CisKKyAgLyoqIFRocmVhZCBjb3VudCBmb3IgdGhlIGRhdGEgcHJvdmlkZXIgcG9vbCAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9EQVRBX1BST1ZJREVSX1RIUkVBRF9DT1VOVCA9IDEwOworICBwcml2YXRlIGludCBtX2RhdGFQcm92aWRlclRocmVhZENvdW50ID0gREVGQVVMVF9EQVRBX1BST1ZJREVSX1RIUkVBRF9DT1VOVDsKKworICAvKiogQnkgZGVmYXVsdCwgYSBtZXRob2QgZmFpbGluZyB3aWxsIGNhdXNlIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyB0byBza2lwICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0dST1VQX0JZX0lOU1RBTkNFUyA9IGZhbHNlOworICBwcml2YXRlIEJvb2xlYW4gbV9ncm91cEJ5SW5zdGFuY2VzID0gREVGQVVMVF9HUk9VUF9CWV9JTlNUQU5DRVM7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfQUxMT1dfUkVUVVJOX1ZBTFVFUyA9IEJvb2xlYW4uRkFMU0U7CisgIHByaXZhdGUgQm9vbGVhbiBtX2FsbG93UmV0dXJuVmFsdWVzID0gREVGQVVMVF9BTExPV19SRVRVUk5fVkFMVUVTOworCisgIC8qKiBUaGUgcGFja2FnZXMgY29udGFpbmluZyB0ZXN0IGNsYXNzZXMuICovCisgIHByaXZhdGUgTGlzdDxYbWxQYWNrYWdlPiBtX3htbFBhY2thZ2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgLyoqIEJlYW5TaGVsbCBleHByZXNzaW9uLiAqLworICBwcml2YXRlIFN0cmluZyBtX2V4cHJlc3Npb24gPSBudWxsOworCisgIC8qKiBTdWl0ZSBsZXZlbCBtZXRob2Qgc2VsZWN0b3JzLiAqLworICBwcml2YXRlIExpc3Q8WG1sTWV0aG9kU2VsZWN0b3I+IG1fbWV0aG9kU2VsZWN0b3JzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgLyoqIFRlc3RzIGluIHN1aXRlLiAqLworICBwcml2YXRlIExpc3Q8WG1sVGVzdD4gbV90ZXN0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIC8qKiBTdWl0ZSBsZXZlbCBwYXJhbWV0ZXJzLiAqLworICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9wYXJhbWV0ZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgLyoqIE5hbWUgb2YgdGhlIFhNTCBmaWxlICovCisgIHByaXZhdGUgU3RyaW5nIG1fZmlsZU5hbWU7CisKKyAgLyoqIFRpbWUgb3V0IGZvciBtZXRob2RzL3Rlc3RzICovCisgIHByaXZhdGUgU3RyaW5nIG1fdGltZU91dDsKKworICAvKiogTGlzdCBvZiBjaGlsZCBYTUwgc3VpdGUgc3BlY2lmaWVkIHVzaW5nIDxzdWl0ZS1maWxlPiB0YWdzICovCisgIHByaXZhdGUgTGlzdDxYbWxTdWl0ZT4gbV9jaGlsZFN1aXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIC8qKiBQYXJlbnQgWE1MIFN1aXRlIGlmIHRoaXMgc3VpdGUgd2FzIHNwZWNpZmllZCBpbiBhbm90aGVyIHN1aXRlIHVzaW5nIDxzdWl0ZS1maWxlPiB0YWcgKi8KKyAgcHJpdmF0ZSBYbWxTdWl0ZSBtX3BhcmVudFN1aXRlOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fc3VpdGVGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgSVRlc3RPYmplY3RGYWN0b3J5IG1fb2JqZWN0RmFjdG9yeTsKKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xpc3RlbmVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ5OTk5NjIyODgyNzI3NTAyMjZMOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJFU0VSVkVfT1JERVIgPSAidHJ1ZSI7CisgIHByaXZhdGUgU3RyaW5nIG1fcHJlc2VydmVPcmRlciA9IERFRkFVTFRfUFJFU0VSVkVfT1JERVI7CisKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9pbmNsdWRlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2V4Y2x1ZGVkR3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgWG1sTWV0aG9kU2VsZWN0b3JzIG1feG1sTWV0aG9kU2VsZWN0b3JzOworCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBmaWxlTmFtZQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKyAgICByZXR1cm4gbV9maWxlTmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGVOYW1lIHRvIHNldAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgbV9maWxlTmFtZSA9IGZpbGVOYW1lOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHBhcmFsbGVsIG1vZGUuCisgICAqIEByZXR1cm4gdGhlIHBhcmFsbGVsIG1vZGUuCisgICAqLworICBwdWJsaWMgUGFyYWxsZWxNb2RlIGdldFBhcmFsbGVsKCkgeworICAgIHJldHVybiBtX3BhcmFsbGVsOworICB9CisKKworICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZHVsZSgpIHsKKyAgICByZXR1cm4gbV9wYXJlbnRNb2R1bGU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEd1aWNlU3RhZ2UoKSB7CisgICAgcmV0dXJuIG1fZ3VpY2VTdGFnZTsKKyAgfQorCisgIHB1YmxpYyBJVGVzdE9iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbV9vYmplY3RGYWN0b3J5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T2JqZWN0RmFjdG9yeShJVGVzdE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSkgeworICAgIG1fb2JqZWN0RmFjdG9yeSA9IG9iamVjdEZhY3Rvcnk7CisgIH0KKworICAvKioKKyAgICogQGRlcHJlY2F0ZWQgVXNlICNzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUpIGluc3RlYWQKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldFBhcmFsbGVsKFN0cmluZyBwYXJhbGxlbCkgeworICAgIGlmIChwYXJhbGxlbCA9PSBudWxsKSB7CisgICAgICBzZXRQYXJhbGxlbCgoUGFyYWxsZWxNb2RlKW51bGwpOworICAgIH0gZWxzZSB7CisgICAgICBzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuZ2V0VmFsaWRQYXJhbGxlbChwYXJhbGxlbCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBwYXJhbGxlbCBtb2RlCisgICAqIEBwYXJhbSBwYXJhbGxlbCB0aGUgcGFyYWxsZWwgbW9kZQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UGFyYWxsZWwoUGFyYWxsZWxNb2RlIHBhcmFsbGVsKSB7CisgICAgaWYgKHBhcmFsbGVsID09IG51bGwpIHsKKyAgICAgIG1fcGFyYWxsZWwgPSBERUZBVUxUX1BBUkFMTEVMOworICAgIH0gZWxzZSB7CisgICAgICBtX3BhcmFsbGVsID0gcGFyYWxsZWw7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0UGFyZW50TW9kdWxlKFN0cmluZyBwYXJlbnRNb2R1bGUpIHsKKyAgICBtX3BhcmVudE1vZHVsZSA9IHBhcmVudE1vZHVsZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEd1aWNlU3RhZ2UoU3RyaW5nIGd1aWNlU3RhZ2UpIHsKKyAgICBtX2d1aWNlU3RhZ2UgPSBndWljZVN0YWdlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBwb2xpY3kuCisgICAqIEBwYXJhbSBjb25maWdGYWlsdXJlUG9saWN5IHRoZSBjb25maWcgZmFpbHVyZSBwb2xpY3kKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZhaWx1cmVQb2xpY3koU3RyaW5nIGNvbmZpZ0ZhaWx1cmVQb2xpY3kpIHsKKyAgICBtX2NvbmZpZ0ZhaWx1cmVQb2xpY3kgPSBjb25maWdGYWlsdXJlUG9saWN5OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBwb2xpY3kuCisgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSBwb2xpY3kKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnRmFpbHVyZVBvbGljeSgpIHsKKyAgICByZXR1cm4gbV9jb25maWdGYWlsdXJlUG9saWN5OworICB9CisKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmVyYm9zZS4KKyAgICogQHJldHVybiB0aGUgdmVyYm9zZS4KKyAgICovCisgIHB1YmxpYyBJbnRlZ2VyIGdldFZlcmJvc2UoKSB7CisgICAgcmV0dXJuIG1fdmVyYm9zZSAhPSBudWxsID8gbV92ZXJib3NlIDogVGVzdE5HLkRFRkFVTFRfVkVSQk9TRTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHZlcmJvc2UuCisgICAqIEBwYXJhbSB2ZXJib3NlIFRoZSB2ZXJib3NlIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoSW50ZWdlciB2ZXJib3NlKSB7CisgICAgbV92ZXJib3NlID0gdmVyYm9zZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuYW1lLgorICAgKiBAcmV0dXJuIHRoZSBuYW1lLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBtX25hbWU7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgbmFtZS4KKyAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgIG1fbmFtZSA9IG5hbWU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdGVzdC4KKyAgICogQHJldHVybiB0aGUgdGVzdC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdCgpIHsKKyAgICByZXR1cm4gbV90ZXN0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHRlc3RzLgorICAgKiBAcmV0dXJuIHRoZSB0ZXN0cy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFhtbFRlc3Q+IGdldFRlc3RzKCkgeworICAgIHJldHVybiBtX3Rlc3RzOworICB9CisKKyAgLy8gRm9yIFlBTUwKKyAgcHVibGljIHZvaWQgc2V0VGVzdHMoTGlzdDxYbWxUZXN0PiB0ZXN0cykgeworICAgIG1fdGVzdHMgPSB0ZXN0czsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRob2Qgc2VsZWN0b3JzLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBtZXRob2Qgc2VsZWN0b3JzLgorICAgKi8KKyAgcHVibGljIExpc3Q8WG1sTWV0aG9kU2VsZWN0b3I+IGdldE1ldGhvZFNlbGVjdG9ycygpIHsKKyAgICBpZiAobV94bWxNZXRob2RTZWxlY3RvcnMgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIG1feG1sTWV0aG9kU2VsZWN0b3JzLmdldE1ldGhvZFNlbGVjdG9ycygpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBkZXByZWNhdGVkCisgICAgICByZXR1cm4gbV9tZXRob2RTZWxlY3RvcnM7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIG1ldGhvZCBzZWxlY3RvcnMuCisgICAqCisgICAqIEBwYXJhbSBtZXRob2RTZWxlY3RvcnMgdGhlIG1ldGhvZCBzZWxlY3RvcnMuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNZXRob2RTZWxlY3RvcnMoTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gbWV0aG9kU2VsZWN0b3JzKSB7CisgICAgbV9tZXRob2RTZWxlY3RvcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QobWV0aG9kU2VsZWN0b3JzKTsKKyAgfQorCisgIC8qKgorICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgdGhhdCBhcHBseSB0byB0aGlzIFhNTCBzdWl0ZS4gVGhpcyBtZXRob2QKKyAgICogc2hvdWxkIGJlIGludm9rZWQgYW55IHRpbWUgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHN0YXRlIG9mIHRoaXMgc3VpdGUgdGhhdAorICAgKiB3b3VsZCBhZmZlY3QgdGhlIHBhcmFtZXRlciBsaXN0Ljxicj4KKyAgICogTk9URTogQ3VycmVudGx5IGJlaW5nIGludm9rZWQgYWZ0ZXIgYSBwYXJlbnQgc3VpdGUgaXMgYWRkZWQgb3IgaWYgcGFyYW1ldGVycworICAgKiBmb3IgdGhpcyBzdWl0ZSBhcmUgdXBkYXRlZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCB1cGRhdGVQYXJhbWV0ZXJzKCkgeworICAgIC8qCisgICAgICogV2hhdGV2ZXIgcGFyYW1ldGVycyBhcmUgc2V0IGJ5IHVzZXIgb3IgdmlhIFhNTCwgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAgKiB1c2luZyBwYXJhbWV0ZXJzIGZyb20gcGFyZW50IHN1aXRlLCBpZiBpdCBleGlzdHMuIFBhcmFtZXRlcnMgZnJvbSB0aGlzCisgICAgICogc3VpdGUgb3ZlcnJpZGUgdGhlIHNhbWUgbmFtZWQgcGFyYW1ldGVycyBmcm9tIHBhcmVudCBzdWl0ZS4KKyAgICAgKi8KKyAgICBpZiAobV9wYXJlbnRTdWl0ZSAhPSBudWxsKSB7CisgICAgICBTZXQ8U3RyaW5nPiBrZXlTZXQgPSBtX3BhcmVudFN1aXRlLmdldFBhcmFtZXRlcnMoKS5rZXlTZXQoKTsKKyAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBrZXlTZXQpIHsKKyAgICAgICAgaWYgKCFtX3BhcmFtZXRlcnMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgbV9wYXJhbWV0ZXJzLnB1dChuYW1lLCBtX3BhcmVudFN1aXRlLmdldFBhcmFtZXRlcihuYW1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0cyBwYXJhbWV0ZXJzLgorICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgcGFyYW1ldGVycy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgbV9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB1cGRhdGVQYXJhbWV0ZXJzKCk7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgcGFyYW1ldGVycyB0aGF0IGFwcGx5IHRvIHRlc3RzIGluIHRoaXMgc3VpdGUuPGJyPgorICAgKiBTZXQgb2YgcGFyYW1ldGVycyBmb3IgYSBzdWl0ZSBpcyBhcHBlbmRlZCB3aXRoIHBhcmFtZXRlcnMgZnJvbSBwYXJlbnQgc3VpdGUuCisgICAqIEFsc28sIHBhcmFtZXRlcnMgZnJvbSB0aGlzIHN1aXRlIG92ZXJyaWRlIHRoZSBzYW1lIG5hbWVkIHBhcmFtZXRlcnMgZnJvbQorICAgKiBwYXJlbnQgc3VpdGUuCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBtX3BhcmFtZXRlcnM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIHRoaXMgc3VpdGUgYW5kIGFsbCBpdHMgWG1sVGVzdHMuCisgICAqLworICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbGxQYXJhbWV0ZXJzKCkgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbV9wYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHJlc3VsdC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKworICAgIGZvciAoWG1sVGVzdCB0ZXN0IDogZ2V0VGVzdHMoKSkgeworICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0cCA9IHRlc3QuZ2V0TG9jYWxQYXJhbWV0ZXJzKCk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiB0cC5lbnRyeVNldCgpKSB7CisgICAgICAgIHJlc3VsdC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIGRlZmluZWQgaW4gdGhpcyBzdWl0ZSBvbmx5LgorICAgKiBAcGFyYW0gbmFtZSB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlciBkZWZpbmVkIGluIHRoaXMgc3VpdGUgb25seS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG1fcGFyYW1ldGVycy5nZXQobmFtZSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgdGhyZWFkQ291bnQuCisgICAqLworICBwdWJsaWMgaW50IGdldFRocmVhZENvdW50KCkgeworICAgIHJldHVybiBtX3RocmVhZENvdW50OworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgdGhyZWFkIGNvdW50LgorICAgKiBAcGFyYW0gdGhyZWFkQ291bnQgVGhlIHRocmVhZCBjb3VudCB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRDb3VudChpbnQgdGhyZWFkQ291bnQpIHsKKyAgICBtX3RocmVhZENvdW50ID0gdGhyZWFkQ291bnQ7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBUaGUgSlVuaXQgY29tcGF0aWJpbGl0eSBmbGFnLgorICAgKi8KKyAgcHVibGljIEJvb2xlYW4gaXNKVW5pdCgpIHsKKyAgICByZXR1cm4gbV9pc0pVbml0OworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIEpVbml0IGNvbXBhdGliaWxpdHkgZmxhZy4KKyAgICoKKyAgICogQHBhcmFtIGlzSlVuaXQgdGhlIEpVbml0IGNvbXBhdGliaWxpdHkgZmxhZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEpVbml0KEJvb2xlYW4gaXNKVW5pdCkgeworICAgIG1faXNKVW5pdCA9IGlzSlVuaXQ7CisgIH0KKworICAvLyBGb3IgWUFNTAorICBwdWJsaWMgdm9pZCBzZXRKdW5pdChCb29sZWFuIGopIHsKKyAgICBzZXRKVW5pdChqKTsKKyAgfQorCisgIHB1YmxpYyBCb29sZWFuIHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKCkgeworICAgIHJldHVybiBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoYm9vbGVhbiBza2lwKSB7CisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IHNraXA7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgWE1MIHBhY2thZ2VzLgorICAgKgorICAgKiBAcGFyYW0gcGFja2FnZXMgdGhlIFhNTCBwYWNrYWdlcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFhtbFBhY2thZ2VzKExpc3Q8WG1sUGFja2FnZT4gcGFja2FnZXMpIHsKKyAgICBtX3htbFBhY2thZ2VzID0gTGlzdHMubmV3QXJyYXlMaXN0KHBhY2thZ2VzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBYTUwgcGFja2FnZXMuCisgICAqCisgICAqIEByZXR1cm4gdGhlIFhNTCBwYWNrYWdlcy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFhtbFBhY2thZ2U+IGdldFhtbFBhY2thZ2VzKCkgeworICAgIHJldHVybiBtX3htbFBhY2thZ2VzOworICB9CisKKworICAvLyBGb3IgWUFNTAorICBwdWJsaWMgTGlzdDxYbWxQYWNrYWdlPiBnZXRQYWNrYWdlcygpIHsKKyAgICByZXR1cm4gZ2V0WG1sUGFja2FnZXMoKTsKKyAgfQorCisgIEBUYWcobmFtZSA9ICJtZXRob2Qtc2VsZWN0b3JzIikKKyAgcHVibGljIHZvaWQgc2V0TWV0aG9kU2VsZWN0b3JzKFhtbE1ldGhvZFNlbGVjdG9ycyB4bXMpIHsKKyAgICBtX3htbE1ldGhvZFNlbGVjdG9ycyA9IHhtczsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKExpc3Q8WG1sUGFja2FnZT4gcGFja2FnZXMpIHsKKyAgICBzZXRYbWxQYWNrYWdlcyhwYWNrYWdlcyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBBIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFhNTCBzdWl0ZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9YbWwoKSB7CisgICAgWE1MU3RyaW5nQnVmZmVyIHhzYiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoKTsKKyAgICB4c2Iuc2V0RG9jVHlwZSgic3VpdGUgU1lTVEVNIFwiIiArIFBhcnNlci5URVNUTkdfRFREX1VSTCArICdcIicpOworICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgcC5zZXRQcm9wZXJ0eSgibmFtZSIsIGdldE5hbWUoKSk7CisgICAgaWYgKGdldFZlcmJvc2UoKSAhPSBudWxsKSB7CisgICAgICBYbWxVdGlscy5zZXRQcm9wZXJ0eShwLCAidmVyYm9zZSIsIGdldFZlcmJvc2UoKS50b1N0cmluZygpLCBERUZBVUxUX1ZFUkJPU0UudG9TdHJpbmcoKSk7CisgICAgfQorICAgIGZpbmFsIFBhcmFsbGVsTW9kZSBwYXJhbGxlbD0gZ2V0UGFyYWxsZWwoKTsKKyAgICBpZihwYXJhbGxlbCAhPSBudWxsICYmICFERUZBVUxUX1BBUkFMTEVMLmVxdWFscyhwYXJhbGxlbCkpIHsKKyAgICAgIHAuc2V0UHJvcGVydHkoInBhcmFsbGVsIiwgcGFyYWxsZWwudG9TdHJpbmcoKSk7CisgICAgfQorICAgIFhtbFV0aWxzLnNldFByb3BlcnR5KHAsICJncm91cC1ieS1pbnN0YW5jZXMiLCBTdHJpbmcudmFsdWVPZihnZXRHcm91cEJ5SW5zdGFuY2VzKCkpLAorICAgICAgICBERUZBVUxUX0dST1VQX0JZX0lOU1RBTkNFUy50b1N0cmluZygpKTsKKyAgICBYbWxVdGlscy5zZXRQcm9wZXJ0eShwLCAiY29uZmlnZmFpbHVyZXBvbGljeSIsIGdldENvbmZpZ0ZhaWx1cmVQb2xpY3koKSwKKyAgICAgICAgREVGQVVMVF9DT05GSUdfRkFJTFVSRV9QT0xJQ1kpOworICAgIFhtbFV0aWxzLnNldFByb3BlcnR5KHAsICJ0aHJlYWQtY291bnQiLCBTdHJpbmcudmFsdWVPZihnZXRUaHJlYWRDb3VudCgpKSwKKyAgICAgICAgREVGQVVMVF9USFJFQURfQ09VTlQudG9TdHJpbmcoKSk7CisgICAgWG1sVXRpbHMuc2V0UHJvcGVydHkocCwgImRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50IiwgU3RyaW5nLnZhbHVlT2YoZ2V0RGF0YVByb3ZpZGVyVGhyZWFkQ291bnQoKSksCisgICAgICAgIERFRkFVTFRfREFUQV9QUk9WSURFUl9USFJFQURfQ09VTlQudG9TdHJpbmcoKSk7CisgICAgaWYgKCEgREVGQVVMVF9KVU5JVC5lcXVhbHMobV9pc0pVbml0KSkgeworICAgICAgcC5zZXRQcm9wZXJ0eSgianVuaXQiLCBtX2lzSlVuaXQgIT0gbnVsbCA/IG1faXNKVW5pdC50b1N0cmluZygpIDogImZhbHNlIik7IC8vIFRFU1RORy0xNDEKKyAgICB9CisgICAgWG1sVXRpbHMuc2V0UHJvcGVydHkocCwgInNraXBmYWlsZWRpbnZvY2F0aW9uY291bnRzIiwgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cy50b1N0cmluZygpLAorICAgICAgICBERUZBVUxUX1NLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTLnRvU3RyaW5nKCkpOworICAgIGlmKG51bGwgIT0gbV9vYmplY3RGYWN0b3J5KSB7CisgICAgICBwLnNldFByb3BlcnR5KCJvYmplY3QtZmFjdG9yeSIsIG1fb2JqZWN0RmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorICAgIGlmIChpc1N0cmluZ05vdEVtcHR5KG1fcGFyZW50TW9kdWxlKSkgeworICAgICAgcC5zZXRQcm9wZXJ0eSgicGFyZW50LW1vZHVsZSIsIGdldFBhcmVudE1vZHVsZSgpKTsKKyAgICB9CisgICAgaWYgKGlzU3RyaW5nTm90RW1wdHkobV9ndWljZVN0YWdlKSkgeworICAgICAgcC5zZXRQcm9wZXJ0eSgiZ3VpY2Utc3RhZ2UiLCBnZXRHdWljZVN0YWdlKCkpOworICAgIH0KKyAgICBYbWxVdGlscy5zZXRQcm9wZXJ0eShwLCAiYWxsb3ctcmV0dXJuLXZhbHVlcyIsIFN0cmluZy52YWx1ZU9mKGdldEFsbG93UmV0dXJuVmFsdWVzKCkpLAorICAgICAgICBERUZBVUxUX0FMTE9XX1JFVFVSTl9WQUxVRVMudG9TdHJpbmcoKSk7CisgICAgeHNiLnB1c2goInN1aXRlIiwgcCk7CisKKyAgICBYbWxVdGlscy5kdW1wUGFyYW1ldGVycyh4c2IsIG1fcGFyYW1ldGVycyk7CisKKyAgICBpZiAoaGFzRWxlbWVudHMobV9saXN0ZW5lcnMpKSB7CisgICAgICB4c2IucHVzaCgibGlzdGVuZXJzIik7CisgICAgICBmb3IgKFN0cmluZyBsaXN0ZW5lck5hbWU6IG1fbGlzdGVuZXJzKSB7CisgICAgICAgIFByb3BlcnRpZXMgbGlzdGVuZXJQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGxpc3RlbmVyUHJvcHMuc2V0UHJvcGVydHkoImNsYXNzLW5hbWUiLCBsaXN0ZW5lck5hbWUpOworICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJsaXN0ZW5lciIsIGxpc3RlbmVyUHJvcHMpOworICAgICAgfQorICAgICAgeHNiLnBvcCgibGlzdGVuZXJzIik7CisgICAgfQorCisgICAgaWYgKGhhc0VsZW1lbnRzKGdldFhtbFBhY2thZ2VzKCkpKSB7CisgICAgICB4c2IucHVzaCgicGFja2FnZXMiKTsKKworICAgICAgZm9yIChYbWxQYWNrYWdlIHBhY2sgOiBnZXRYbWxQYWNrYWdlcygpKSB7CisgICAgICAgIHhzYi5nZXRTdHJpbmdCdWZmZXIoKS5hcHBlbmQocGFjay50b1htbCgiICAgICIpKTsKKyAgICAgIH0KKworICAgICAgeHNiLnBvcCgicGFja2FnZXMiKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0WG1sTWV0aG9kU2VsZWN0b3JzKCkgIT0gbnVsbCkgeworICAgICAgeHNiLmdldFN0cmluZ0J1ZmZlcigpLmFwcGVuZChnZXRYbWxNZXRob2RTZWxlY3RvcnMoKS50b1htbCgiICAiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGRlcHJlY2F0ZWQKKyAgICAgIGlmIChoYXNFbGVtZW50cyhnZXRNZXRob2RTZWxlY3RvcnMoKSkpIHsKKyAgICAgICAgeHNiLnB1c2goIm1ldGhvZC1zZWxlY3RvcnMiKTsKKyAgICAgICAgZm9yIChYbWxNZXRob2RTZWxlY3RvciBzZWxlY3RvciA6IGdldE1ldGhvZFNlbGVjdG9ycygpKSB7CisgICAgICAgICAgeHNiLmdldFN0cmluZ0J1ZmZlcigpLmFwcGVuZChzZWxlY3Rvci50b1htbCgiICAiKSk7CisgICAgICAgIH0KKworICAgICAgICB4c2IucG9wKCJtZXRob2Qtc2VsZWN0b3JzIik7CisgICAgICB9CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IHN1aXRlRmlsZXMgPSBnZXRTdWl0ZUZpbGVzKCk7CisgICAgaWYgKHN1aXRlRmlsZXMuc2l6ZSgpID4gMCkgeworICAgICAgeHNiLnB1c2goInN1aXRlLWZpbGVzIik7CisgICAgICBmb3IgKFN0cmluZyBzZiA6IHN1aXRlRmlsZXMpIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcC5zZXRQcm9wZXJ0eSgicGF0aCIsIHNmKTsKKyAgICAgICAgeHNiLmFkZEVtcHR5RWxlbWVudCgic3VpdGUtZmlsZSIsIHByb3ApOworICAgICAgfQorICAgICAgeHNiLnBvcCgic3VpdGUtZmlsZXMiKTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gaW5jbHVkZWQgPSBnZXRJbmNsdWRlZEdyb3VwcygpOworICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlZCA9IGdldEV4Y2x1ZGVkR3JvdXBzKCk7CisgICAgaWYgKGhhc0VsZW1lbnRzKGluY2x1ZGVkKSB8fCBoYXNFbGVtZW50cyhleGNsdWRlZCkpIHsKKyAgICAgIHhzYi5wdXNoKCJncm91cHMiKTsKKyAgICAgIHhzYi5wdXNoKCJydW4iKTsKKyAgICAgIGZvciAoU3RyaW5nIGcgOiBpbmNsdWRlZCkgeworICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJpbmNsdWRlIiwgIm5hbWUiLCBnKTsKKyAgICAgIH0KKyAgICAgIGZvciAoU3RyaW5nIGcgOiBleGNsdWRlZCkgeworICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJleGNsdWRlIiwgIm5hbWUiLCBnKTsKKyAgICAgIH0KKyAgICAgIHhzYi5wb3AoInJ1biIpOworICAgICAgeHNiLnBvcCgiZ3JvdXBzIik7CisgICAgfQorCisgICAgaWYgKG1feG1sR3JvdXBzICE9IG51bGwpIHsKKyAgICAgIHhzYi5nZXRTdHJpbmdCdWZmZXIoKS5hcHBlbmQobV94bWxHcm91cHMudG9YbWwoIiAgIikpOworICAgIH0KKworICAgIGZvciAoWG1sVGVzdCB0ZXN0IDogZ2V0VGVzdHMoKSkgeworICAgICAgeHNiLmdldFN0cmluZ0J1ZmZlcigpLmFwcGVuZCh0ZXN0LnRvWG1sKCIgICIpKTsKKyAgICB9CisKKyAgICB4c2IucG9wKCJzdWl0ZSIpOworCisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworICB9CisKKyAgQFRhZyhuYW1lID0gIm1ldGhvZC1zZWxlY3RvcnMiKQorICBwdWJsaWMgdm9pZCBzZXRYbWxNZXRob2RTZWxlY3RvcnMoWG1sTWV0aG9kU2VsZWN0b3JzIHhtcykgeworICAgIG1feG1sTWV0aG9kU2VsZWN0b3JzID0geG1zOworICB9CisKKyAgcHJpdmF0ZSBYbWxNZXRob2RTZWxlY3RvcnMgZ2V0WG1sTWV0aG9kU2VsZWN0b3JzKCkgeworICAgIHJldHVybiBtX3htbE1ldGhvZFNlbGVjdG9yczsKKyAgfQorCisgIC8qKgorICAgKiB7QGluaGVyaXREb2N9CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiW1N1aXRlOiBcIiIpLmFwcGVuZCggbV9uYW1lKS5hcHBlbmQoICJcIiAiKTsKKworICAgIGZvciAoWG1sVGVzdCB0IDogbV90ZXN0cykgeworICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKS5hcHBlbmQoIHQudG9TdHJpbmcoKSkuYXBwZW5kKCcgJyk7CisgICAgfQorCisgICAgZm9yIChYbWxNZXRob2RTZWxlY3RvciBtcyA6IG1fbWV0aG9kU2VsZWN0b3JzKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIgbWV0aG9kU2VsZWN0b3I6IiArIG1zKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKCddJyk7CisKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICAvKioKKyAgICogTG9ncyB0byBTeXN0ZW0ub3V0LgorICAgKiBAcGFyYW0gcyB0aGUgbWVzc2FnZSB0byBsb2cuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1htbFN1aXRlXSAiICsgcyk7CisgIH0KKworICAvKioKKyAgICoge0Bpbmhlcml0RG9jfQorICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBmdWxsIGNsb25lOiAgWG1sVGVzdCBjaGlsZHJlbiBhcmUgbm90IGNsb25lZCBieSB0aGlzCisgICAqIG1ldGhvZC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgIFhtbFN1aXRlIHJlc3VsdCA9IG5ldyBYbWxTdWl0ZSgpOworICAgIAorICAgIHJlc3VsdC5zZXRFeGNsdWRlZEdyb3VwcyhnZXRFeGNsdWRlZEdyb3VwcygpKTsKKyAgICByZXN1bHQuc2V0SW5jbHVkZWRHcm91cHMoZ2V0SW5jbHVkZWRHcm91cHMoKSk7CisgICAgcmVzdWx0LnNldEdyb3VwQnlJbnN0YW5jZXMoZ2V0R3JvdXBCeUluc3RhbmNlcygpKTsKKyAgICByZXN1bHQuc2V0R3JvdXBzKGdldEdyb3VwcygpKTsKKyAgICByZXN1bHQuc2V0TWV0aG9kU2VsZWN0b3JzKGdldFhtbE1ldGhvZFNlbGVjdG9ycygpKTsKKyAgICByZXN1bHQuc2V0UGFja2FnZXMoZ2V0UGFja2FnZXMoKSk7CisgICAgcmVzdWx0LnNldFBhcmVudFN1aXRlKGdldFBhcmVudFN1aXRlKCkpOworICAgIHJlc3VsdC5zZXRQcmVzZXJ2ZU9yZGVyKGdldFByZXNlcnZlT3JkZXIoKSk7CisgICAgcmVzdWx0LnNldFN1aXRlRmlsZXMoZ2V0U3VpdGVGaWxlcygpKTsKKyAgICByZXN1bHQuc2V0VGVzdHMoZ2V0VGVzdHMoKSk7CisgICAgcmVzdWx0LnNldFhtbE1ldGhvZFNlbGVjdG9ycyhnZXRYbWxNZXRob2RTZWxlY3RvcnMoKSk7CisgICAgcmVzdWx0LnNldE5hbWUoZ2V0TmFtZSgpKTsKKyAgICByZXN1bHQuc2V0RmlsZU5hbWUoZ2V0RmlsZU5hbWUoKSk7CisgICAgcmVzdWx0LnNldExpc3RlbmVycyhnZXRMaXN0ZW5lcnMoKSk7CisgICAgcmVzdWx0LnNldFBhcmFsbGVsKGdldFBhcmFsbGVsKCkpOworICAgIHJlc3VsdC5zZXRQYXJlbnRNb2R1bGUoZ2V0UGFyZW50TW9kdWxlKCkpOworICAgIHJlc3VsdC5zZXRHdWljZVN0YWdlKGdldEd1aWNlU3RhZ2UoKSk7CisgICAgcmVzdWx0LnNldENvbmZpZ0ZhaWx1cmVQb2xpY3koZ2V0Q29uZmlnRmFpbHVyZVBvbGljeSgpKTsKKyAgICByZXN1bHQuc2V0VGhyZWFkQ291bnQoZ2V0VGhyZWFkQ291bnQoKSk7CisgICAgcmVzdWx0LnNldERhdGFQcm92aWRlclRocmVhZENvdW50KGdldERhdGFQcm92aWRlclRocmVhZENvdW50KCkpOworICAgIHJlc3VsdC5zZXRQYXJhbWV0ZXJzKGdldEFsbFBhcmFtZXRlcnMoKSk7CisgICAgcmVzdWx0LnNldFZlcmJvc2UoZ2V0VmVyYm9zZSgpKTsKKyAgICByZXN1bHQuc2V0WG1sUGFja2FnZXMoZ2V0WG1sUGFja2FnZXMoKSk7CisvLyAgICByZXN1bHQuc2V0QmVhblNoZWxsRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uKCkpOworICAgIHJlc3VsdC5zZXRNZXRob2RTZWxlY3RvcnMoZ2V0TWV0aG9kU2VsZWN0b3JzKCkpOworICAgIHJlc3VsdC5zZXRKVW5pdChpc0pVbml0KCkpOyAvLyBURVNUTkctMTQxCisgICAgcmVzdWx0LnNldFNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKHNraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKCkpOworICAgIHJlc3VsdC5zZXRPYmplY3RGYWN0b3J5KGdldE9iamVjdEZhY3RvcnkoKSk7CisgICAgcmVzdWx0LnNldEFsbG93UmV0dXJuVmFsdWVzKGdldEFsbG93UmV0dXJuVmFsdWVzKCkpOworICAgIHJlc3VsdC5zZXRUaW1lT3V0KGdldFRpbWVPdXQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZU91dCB0aGUgdGltZW91dC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRpbWVPdXQoU3RyaW5nIHRpbWVPdXQpIHsKKyAgICBtX3RpbWVPdXQgPSB0aW1lT3V0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHRpbWVvdXQuCisgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFRpbWVPdXQoKSB7CisgICAgcmV0dXJuIG1fdGltZU91dDsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHRpbWVvdXQgYXMgYSBsb25nIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCBpZgorICAgKiBubyB0aW1lb3V0IHdhcyBzcGVjaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSBkZWYgdGhlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgaWYgbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkLgorICAgKiBAcmV0dXJuIHRoZSB0aW1lb3V0IGFzIGEgbG9uZyB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgaWYKKyAgICogbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkLgorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0VGltZU91dChsb25nIGRlZikgeworICAgIGxvbmcgcmVzdWx0ID0gZGVmOworICAgIGlmIChtX3RpbWVPdXQgIT0gbnVsbCkgeworICAgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyhtX3RpbWVPdXQpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHN1aXRlIGZpbGVzLgorICAgKgorICAgKiBAcGFyYW0gZmlsZXMgdGhlIHN1aXRlIGZpbGVzLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U3VpdGVGaWxlcyhMaXN0PFN0cmluZz4gZmlsZXMpIHsKKyAgICBtX3N1aXRlRmlsZXMgPSBmaWxlczsKKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHN1aXRlIGZpbGVzLgorICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBmaWxlcy4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U3VpdGVGaWxlcygpIHsKKyAgICByZXR1cm4gbV9zdWl0ZUZpbGVzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXJzKExpc3Q8U3RyaW5nPiBsaXN0ZW5lcnMpIHsKKyAgICBtX2xpc3RlbmVycyA9IGxpc3RlbmVyczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdGVuZXJzKCkgeworICAgIGlmIChtX3BhcmVudFN1aXRlICE9IG51bGwpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ZW5lcnMgPSBtX3BhcmVudFN1aXRlLmdldExpc3RlbmVycygpOworICAgICAgZm9yIChTdHJpbmcgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaWYgKCFtX2xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgbV9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9saXN0ZW5lcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudChpbnQgY291bnQpIHsKKyAgICBtX2RhdGFQcm92aWRlclRocmVhZENvdW50ID0gY291bnQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldERhdGFQcm92aWRlclRocmVhZENvdW50KCkgeworICAgIC8vIG9yZy50ZXN0bmcuQ29tbWFuZExpbmVBcmdzLkRBVEFfUFJPVklERVJfVEhSRUFEX0NPVU5UCisgICAgU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImRhdGFwcm92aWRlcnRocmVhZGNvdW50Iik7CisgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW50IG50aHJlYWRzID0gSW50ZWdlci5wYXJzZUludChzKTsKKyAgICAgICAgcmV0dXJuIG50aHJlYWRzOworICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUGFyc2luZyBTeXN0ZW0gcHJvcGVydHkgJ2RhdGFwcm92aWRlcnRocmVhZGNvdW50JzogIiArIG5mZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX2RhdGFQcm92aWRlclRocmVhZENvdW50OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UGFyZW50U3VpdGUoWG1sU3VpdGUgcGFyZW50U3VpdGUpIHsKKyAgICBtX3BhcmVudFN1aXRlID0gcGFyZW50U3VpdGU7CisgICAgdXBkYXRlUGFyYW1ldGVycygpOworICB9CisKKyAgcHVibGljIFhtbFN1aXRlIGdldFBhcmVudFN1aXRlKCkgeworICAgIHJldHVybiBtX3BhcmVudFN1aXRlOworICB9CisKKyAgcHVibGljIExpc3Q8WG1sU3VpdGU+IGdldENoaWxkU3VpdGVzKCkgeworICAgIHJldHVybiBtX2NoaWxkU3VpdGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgaW50IHJlc3VsdCA9IDE7CisvLyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisvLyAgICAgICAgICArICgobV9jaGlsZFN1aXRlcyA9PSBudWxsKSA/IDAgOiBtX2NoaWxkU3VpdGVzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lCisgICAgICAgICogcmVzdWx0CisgICAgICAgICsgKChtX2NvbmZpZ0ZhaWx1cmVQb2xpY3kgPT0gbnVsbCkgPyAwIDogbV9jb25maWdGYWlsdXJlUG9saWN5CisgICAgICAgICAgICAuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBtX2RhdGFQcm92aWRlclRocmVhZENvdW50OworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX2V4cHJlc3Npb24gPT0gbnVsbCkgPyAwIDogbV9leHByZXNzaW9uLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX2ZpbGVOYW1lID09IG51bGwpID8gMCA6IG1fZmlsZU5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1faXNKVW5pdCA9PSBudWxsKSA/IDAgOiBtX2lzSlVuaXQuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fbGlzdGVuZXJzID09IG51bGwpID8gMCA6IG1fbGlzdGVuZXJzLmhhc2hDb2RlKCkpOworCisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fbWV0aG9kU2VsZWN0b3JzID09IG51bGwpID8gMCA6IG1fbWV0aG9kU2VsZWN0b3JzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX25hbWUgPT0gbnVsbCkgPyAwIDogbV9uYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX29iamVjdEZhY3RvcnkgPT0gbnVsbCkgPyAwIDogbV9vYmplY3RGYWN0b3J5Lmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX3BhcmFsbGVsID09IG51bGwpID8gMCA6IG1fcGFyYWxsZWwuaGFzaENvZGUoKSk7CisvLyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorLy8gICAgICAgICsgKChtX3BhcmFtZXRlcnMgPT0gbnVsbCkgPyAwIDogbV9wYXJhbWV0ZXJzLmhhc2hDb2RlKCkpOworLy8gICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorLy8gICAgICAgICAgKyAoKG1fcGFyZW50U3VpdGUgPT0gbnVsbCkgPyAwIDogbV9wYXJlbnRTdWl0ZS5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZQorICAgICAgICAqIHJlc3VsdAorICAgICAgICArICgobV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9PSBudWxsKSA/IDAKKyAgICAgICAgICAgIDogbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cy5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV9zdWl0ZUZpbGVzID09IG51bGwpID8gMCA6IG1fc3VpdGVGaWxlcy5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobV90ZXN0ID09IG51bGwpID8gMCA6IG1fdGVzdC5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobV90ZXN0cyA9PSBudWxsKSA/IDAgOiBtX3Rlc3RzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbV90aHJlYWRDb3VudDsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV90aW1lT3V0ID09IG51bGwpID8gMCA6IG1fdGltZU91dC5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV92ZXJib3NlID09IG51bGwpID8gMCA6IG1fdmVyYm9zZS5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAorICAgICAgICArICgobV94bWxQYWNrYWdlcyA9PSBudWxsKSA/IDAgOiBtX3htbFBhY2thZ2VzLmhhc2hDb2RlKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogVXNlZCB0byBkZWJ1ZyBlcXVhbHMoKSBidWdzLgorICAgKi8KKyAgc3RhdGljIGJvb2xlYW4gZigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmKCk7CisgICAgfQorICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICByZXR1cm4gZigpOworICAgIH0KKyAgICBYbWxTdWl0ZSBvdGhlciA9IChYbWxTdWl0ZSkgb2JqOworLy8gICAgICBpZiAobV9jaGlsZFN1aXRlcyA9PSBudWxsKSB7CisvLyAgICAgICAgaWYgKG90aGVyLm1fY2hpbGRTdWl0ZXMgIT0gbnVsbCkKKy8vICAgICAgICAgIHJldHVybiBmKCk7CisvLyAgICAgIH0gZWxzZSBpZiAoIW1fY2hpbGRTdWl0ZXMuZXF1YWxzKG90aGVyLm1fY2hpbGRTdWl0ZXMpKQorLy8gICAgICAgIHJldHVybiBmKCk7CisgICAgaWYgKG1fY29uZmlnRmFpbHVyZVBvbGljeSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9jb25maWdGYWlsdXJlUG9saWN5ICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGYoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFtX2NvbmZpZ0ZhaWx1cmVQb2xpY3kuZXF1YWxzKG90aGVyLm1fY29uZmlnRmFpbHVyZVBvbGljeSkpIHsKKyAgICAgIHJldHVybiBmKCk7CisgICAgfQorICAgIGlmIChtX2RhdGFQcm92aWRlclRocmVhZENvdW50ICE9IG90aGVyLm1fZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQpIHsKKyAgICAgIHJldHVybiBmKCk7CisgICAgfQorICAgIGlmIChtX2V4cHJlc3Npb24gPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fZXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghbV9leHByZXNzaW9uLmVxdWFscyhvdGhlci5tX2V4cHJlc3Npb24pKSB7CisgICAgICByZXR1cm4gZigpOworICAgIH0KKyAgICBpZiAobV9pc0pVbml0ID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2lzSlVuaXQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZigpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIW1faXNKVW5pdC5lcXVhbHMob3RoZXIubV9pc0pVbml0KSkgeworICAgICAgcmV0dXJuIGYoKTsKKyAgICB9CisgICAgaWYgKG1fbGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2xpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghbV9saXN0ZW5lcnMuZXF1YWxzKG90aGVyLm1fbGlzdGVuZXJzKSkgeworICAgICAgcmV0dXJuIGYoKTsKKyAgICB9CisgICAgaWYgKG1fbWV0aG9kU2VsZWN0b3JzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX21ldGhvZFNlbGVjdG9ycyAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghbV9tZXRob2RTZWxlY3RvcnMuZXF1YWxzKG90aGVyLm1fbWV0aG9kU2VsZWN0b3JzKSkgeworICAgICAgcmV0dXJuIGYoKTsKKyAgICB9CisgICAgaWYgKG1fbmFtZSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGYoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFtX25hbWUuZXF1YWxzKG90aGVyLm1fbmFtZSkpIHsKKyAgICAgIHJldHVybiBmKCk7CisgICAgfQorICAgIGlmIChtX29iamVjdEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fb2JqZWN0RmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghbV9vYmplY3RGYWN0b3J5LmVxdWFscyhvdGhlci5tX29iamVjdEZhY3RvcnkpKSB7CisgICAgICByZXR1cm4gZigpOworICAgIH0KKyAgICBpZiAobV9wYXJhbGxlbCA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9wYXJhbGxlbCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghbV9wYXJhbGxlbC5lcXVhbHMob3RoZXIubV9wYXJhbGxlbCkpIHsKKyAgICAgIHJldHVybiBmKCk7CisgICAgfQorLy8gICAgaWYgKG1fcGFyYW1ldGVycyA9PSBudWxsKSB7CisvLyAgICAgIGlmIChvdGhlci5tX3BhcmFtZXRlcnMgIT0gbnVsbCkgeworLy8gICAgICAgIHJldHVybiBmKCk7CisvLyAgICAgIH0KKy8vICAgIH0gZWxzZSBpZiAoIW1fcGFyYW1ldGVycy5lcXVhbHMob3RoZXIubV9wYXJhbWV0ZXJzKSkgeworLy8gICAgICByZXR1cm4gZigpOworLy8gICAgfQorLy8gICAgICBpZiAobV9wYXJlbnRTdWl0ZSA9PSBudWxsKSB7CisvLyAgICAgICAgaWYgKG90aGVyLm1fcGFyZW50U3VpdGUgIT0gbnVsbCkKKy8vICAgICAgICAgIHJldHVybiBmKCk7CisvLyAgICAgIH0gZWxzZSBpZiAoIW1fcGFyZW50U3VpdGUuZXF1YWxzKG90aGVyLm1fcGFyZW50U3VpdGUpKQorLy8gICAgICAgIHJldHVybiBmKCk7CisgICAgaWYgKG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzCisgICAgICAgIC5lcXVhbHMob3RoZXIubV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cykpCisgICAgICByZXR1cm4gZigpOworICAgIGlmIChtX3N1aXRlRmlsZXMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fc3VpdGVGaWxlcyAhPSBudWxsKQorICAgICAgICByZXR1cm4gZigpOworICAgIH0gZWxzZSBpZiAoIW1fc3VpdGVGaWxlcy5lcXVhbHMob3RoZXIubV9zdWl0ZUZpbGVzKSkKKyAgICAgIHJldHVybiBmKCk7CisgICAgaWYgKG1fdGVzdCA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV90ZXN0ICE9IG51bGwpCisgICAgICAgIHJldHVybiBmKCk7CisgICAgfSBlbHNlIGlmICghbV90ZXN0LmVxdWFscyhvdGhlci5tX3Rlc3QpKQorICAgICAgcmV0dXJuIGYoKTsKKyAgICBpZiAobV90ZXN0cyA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV90ZXN0cyAhPSBudWxsKQorICAgICAgICByZXR1cm4gZigpOworICAgIH0gZWxzZSBpZiAoIW1fdGVzdHMuZXF1YWxzKG90aGVyLm1fdGVzdHMpKQorICAgICAgcmV0dXJuIGYoKTsKKyAgICBpZiAobV90aHJlYWRDb3VudCAhPSBvdGhlci5tX3RocmVhZENvdW50KQorICAgICAgcmV0dXJuIGYoKTsKKyAgICBpZiAobV90aW1lT3V0ID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX3RpbWVPdXQgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3RpbWVPdXQuZXF1YWxzKG90aGVyLm1fdGltZU91dCkpCisgICAgICByZXR1cm4gZigpOworICAgIGlmIChtX3ZlcmJvc2UgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fdmVyYm9zZSAhPSBudWxsKQorICAgICAgICByZXR1cm4gZigpOworICAgIH0gZWxzZSBpZiAoIW1fdmVyYm9zZS5lcXVhbHMob3RoZXIubV92ZXJib3NlKSkKKyAgICAgIHJldHVybiBmKCk7CisgICAgaWYgKG1feG1sUGFja2FnZXMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1feG1sUGFja2FnZXMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3htbFBhY2thZ2VzLmVxdWFscyhvdGhlci5tX3htbFBhY2thZ2VzKSkKKyAgICAgIHJldHVybiBmKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisgIC8qKgorICAgKiBUaGUgRFREIHNvbWV0aW1lcyBmb3JjZXMgY2VydGFpbiBhdHRyaWJ1dGVzIHRvIHJlY2VpdmUgYSBkZWZhdWx0IHZhbHVlLiBTdWNoCisgICAqIGEgdmFsdWUgaXMgY29uc2lkZXJlZCBlcXVhbCB0byBhbm90aGVyIG9uZSBpZiB0aGF0IG90aGVyIG9uZSBpcyBudWxsLgorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIGVxKFN0cmluZyBvMSwgU3RyaW5nIG8yLCBTdHJpbmcgZGVmKSB7CisgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKSByZXN1bHQgPSB0cnVlOworICAgIGVsc2UgaWYgKG8xICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdCA9IG8xLmVxdWFscyhvMikgfHwgKGRlZi5lcXVhbHMobzEpICYmIG8yID09IG51bGwpOworICAgIH0KKyAgICBlbHNlIGlmIChvMiAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBvMi5lcXVhbHMobzEpIHx8IChkZWYuZXF1YWxzKG8yKSAmJiBvMSA9PSBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlT3JkZXIoU3RyaW5nIGYpIHsKKyAgICBtX3ByZXNlcnZlT3JkZXIgPSBmOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQcmVzZXJ2ZU9yZGVyKCkgeworICAgIHJldHVybiBtX3ByZXNlcnZlT3JkZXI7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpbmNsdWRlZEdyb3Vwcy4KKyAgICogTm90ZTogZG8gbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgdmFsdWUsIHVzZSB7QGxpbmsgI2FkZEluY2x1ZGVkR3JvdXAoU3RyaW5nKX0uCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVkR3JvdXBzKCkgeworICAgIGlmIChtX3htbEdyb3VwcyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gbV94bWxHcm91cHMuZ2V0UnVuKCkuZ2V0SW5jbHVkZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gZGVwcmVjYXRlZAorICAgICAgcmV0dXJuIG1faW5jbHVkZWRHcm91cHM7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYWRkSW5jbHVkZWRHcm91cChTdHJpbmcgZykgeworICAgIG1faW5jbHVkZWRHcm91cHMuYWRkKGcpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBnCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlZEdyb3VwcyhMaXN0PFN0cmluZz4gZykgeworICAgIG1faW5jbHVkZWRHcm91cHMgPSBnOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBnIFRoZSBleGNsdWRlZEdyb3VzcHMgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXhjbHVkZWRHcm91cHMoTGlzdDxTdHJpbmc+IGcpIHsKKyAgICBtX2V4Y2x1ZGVkR3JvdXBzID0gZzsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2x1ZGVkR3JvdXBzLgorICAgKiBOb3RlOiBkbyBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCB2YWx1ZSwgdXNlIHtAbGluayAjYWRkRXhjbHVkZWRHcm91cChTdHJpbmcpfS4KKyAgICovCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXhjbHVkZWRHcm91cHMoKSB7CisgICAgaWYgKG1feG1sR3JvdXBzICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBtX3htbEdyb3Vwcy5nZXRSdW4oKS5nZXRFeGNsdWRlcygpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbV9leGNsdWRlZEdyb3VwczsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRFeGNsdWRlZEdyb3VwKFN0cmluZyBnKSB7CisgICAgbV9leGNsdWRlZEdyb3Vwcy5hZGQoZyk7CisgIH0KKworICBwdWJsaWMgQm9vbGVhbiBnZXRHcm91cEJ5SW5zdGFuY2VzKCkgeworICAgIHJldHVybiBtX2dyb3VwQnlJbnN0YW5jZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRHcm91cEJ5SW5zdGFuY2VzKGJvb2xlYW4gZikgeworICAgIG1fZ3JvdXBCeUluc3RhbmNlcyA9IGY7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpIHsKKyAgICBtX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICB9CisKKyAgcHVibGljIEJvb2xlYW4gZ2V0QWxsb3dSZXR1cm5WYWx1ZXMoKSB7CisgICAgcmV0dXJuIG1fYWxsb3dSZXR1cm5WYWx1ZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbGxvd1JldHVyblZhbHVlcyhCb29sZWFuIGFsbG93UmV0dXJuVmFsdWVzKSB7CisgICAgbV9hbGxvd1JldHVyblZhbHVlcyA9IGFsbG93UmV0dXJuVmFsdWVzOworICB9CisKKyAgcHJpdmF0ZSBYbWxHcm91cHMgbV94bWxHcm91cHM7CisKKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFhtbEdyb3VwcyB4bWxHcm91cHMpIHsKKyAgICBtX3htbEdyb3VwcyA9IHhtbEdyb3VwczsKKyAgfQorCisgIEBPbkVsZW1lbnQodGFnID0gInBhcmFtZXRlciIsIGF0dHJpYnV0ZXMgPSB7ICJuYW1lIiwgInZhbHVlIiB9KQorICBwdWJsaWMgdm9pZCBvblBhcmFtZXRlckVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIGdldFBhcmFtZXRlcnMoKS5wdXQobmFtZSwgdmFsdWUpOworICB9CisKKyAgQE9uRWxlbWVudExpc3QodGFnID0gImxpc3RlbmVycyIsIGF0dHJpYnV0ZXMgPSB7ICJjbGFzcy1uYW1lIiB9KQorICBwdWJsaWMgdm9pZCBvbkxpc3RlbmVyRWxlbWVudChTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgYWRkTGlzdGVuZXIoY2xhc3NOYW1lKTsKKyAgfQorCisgIEBPbkVsZW1lbnRMaXN0KHRhZyA9ICJzdWl0ZS1maWxlcyIsIGF0dHJpYnV0ZXMgPSB7ICJwYXRoIiB9KQorICBwdWJsaWMgdm9pZCBvblN1aXRlRmlsZXNFbGVtZW50KFN0cmluZyBwYXRoKSB7CisgICAgZ2V0U3VpdGVGaWxlcygpLmFkZChwYXRoKTsKKyAgfQorCisgIEBPbkVsZW1lbnRMaXN0KHRhZyA9ICJwYWNrYWdlcyIsIGF0dHJpYnV0ZXMgPSB7ICJuYW1lIiB9KQorICBwdWJsaWMgdm9pZCBvblBhY2thZ2VzRWxlbWVudChTdHJpbmcgbmFtZSkgeworICAgIGdldFBhY2thZ2VzKCkuYWRkKG5ldyBYbWxQYWNrYWdlKG5hbWUpKTsKKyAgfQorCisvLyAgQE9uRWxlbWVudExpc3QodGFnID0gIm1ldGhvZC1zZWxlY3RvcnMiLCBhdHRyaWJ1dGVzID0geyAibGFuZ3VhZ2UiLCAibmFtZSIsICJwcmlvcml0eSIgfSkKKyAgcHVibGljIHZvaWQgb25NZXRob2RTZWxlY3RvckVsZW1lbnQoU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHByaW9yaXR5KSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJMYW5ndWFnZToiICsgbGFuZ3VhZ2UpOworICB9CisKKyAgcHVibGljIFhtbEdyb3VwcyBnZXRHcm91cHMoKSB7CisgICAgcmV0dXJuIG1feG1sR3JvdXBzOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkVGVzdChYbWxUZXN0IHRlc3QpIHsKKyAgICBnZXRUZXN0cygpLmFkZCh0ZXN0KTsKKyAgfQorCisgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFja2FnZU5hbWVzKCkgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKFhtbFBhY2thZ2UgcCA6IGdldFBhY2thZ2VzKCkpIHsKKyAgICAgIHJlc3VsdC5hZGQocC5nZXROYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWG1sVGVzdC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM2YTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvWG1sVGVzdC5qYXZhCkBAIC0wLDAgKzEsODk5IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuWE1MU3RyaW5nQnVmZmVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLmRvbS5QYXJlbnRTZXR0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIHRhZyAmbHQ7dGVzdCZndDsgIGluIHRlc3RuZy54bWwuCisgKgorICogQGF1dGhvciA8YSBocmVmID0gIm1haWx0bzpjZWRyaWMmIzY0O2JldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICogQGF1dGhvciA8YSBocmVmID0gJ21haWx0bzp0aGVfbWluZHN0b3JtW2F0XWV2b2x2YVtkb3Rdcm8nPkFsZXhhbmRydSBQb3Blc2N1PC9hPgorICovCitwdWJsaWMgY2xhc3MgWG1sVGVzdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjUzMzUwNDMyNTk0MjQxNzYwNkw7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUX01TID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgcHJpdmF0ZSBYbWxTdWl0ZSBtX3N1aXRlOworICBwcml2YXRlIFN0cmluZyBtX25hbWU7CisgIHByaXZhdGUgSW50ZWdlciBtX3ZlcmJvc2UgPSBYbWxTdWl0ZS5ERUZBVUxUX1ZFUkJPU0U7CisgIHByaXZhdGUgQm9vbGVhbiBtX2lzSlVuaXQgPSBYbWxTdWl0ZS5ERUZBVUxUX0pVTklUOworICBwcml2YXRlIGludCBtX3RocmVhZENvdW50PSAtMTsKKworICBwcml2YXRlIExpc3Q8WG1sQ2xhc3M+IG1feG1sQ2xhc3NlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1faW5jbHVkZWRHcm91cHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9leGNsdWRlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtX21ldGFHcm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1fcGFyYW1ldGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBtX3BhcmFsbGVsOworCisgIHByaXZhdGUgTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gbV9tZXRob2RTZWxlY3RvcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgLy8gdGVzdCBsZXZlbCBwYWNrYWdlcworICBwcml2YXRlIExpc3Q8WG1sUGFja2FnZT4gbV94bWxQYWNrYWdlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIHByaXZhdGUgU3RyaW5nIG1fdGltZU91dDsKKyAgcHJpdmF0ZSBCb29sZWFuIG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPSBYbWxTdWl0ZS5ERUZBVUxUX1NLSVBfRkFJTEVEX0lOVk9DQVRJT05fQ09VTlRTOworICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8SW50ZWdlcj4+IG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMgPSBudWxsOyAvLyBsYXppbHkgaW5pdGlhbGl6ZWQKKworICBwcml2YXRlIFN0cmluZyBtX3ByZXNlcnZlT3JkZXIgPSBYbWxTdWl0ZS5ERUZBVUxUX1BSRVNFUlZFX09SREVSOworCisgIHByaXZhdGUgaW50IG1faW5kZXg7CisKKyAgcHJpdmF0ZSBCb29sZWFuIG1fZ3JvdXBCeUluc3RhbmNlczsKKworICBwcml2YXRlIEJvb2xlYW4gbV9hbGxvd1JldHVyblZhbHVlcyA9IG51bGw7CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1feG1sRGVwZW5kZW5jeUdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+WG1sVGVzdDwvY29kZT4gYW5kIGFkZHMgaXQgdG8gc3VpdGUncyBsaXN0IG9mIHRlc3RzLgorICAgKgorICAgKiBAcGFyYW0gc3VpdGUgdGhlIHBhcmVudCBzdWl0ZS4KKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGlzIHRlc3QgdGFnIGluIHRlc3RuZy54bWwKKyAgICovCisgIHB1YmxpYyBYbWxUZXN0KFhtbFN1aXRlIHN1aXRlLCBpbnQgaW5kZXgpIHsKKyAgICBpbml0KHN1aXRlLCBpbmRleCk7CisgIH0KKworICBwdWJsaWMgWG1sVGVzdChYbWxTdWl0ZSBzdWl0ZSkgeworICAgIGluaXQoc3VpdGUsIDApOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXQoWG1sU3VpdGUgc3VpdGUsIGludCBpbmRleCkgeworICAgIG1fc3VpdGUgPSBzdWl0ZTsKKyAgICBtX3N1aXRlLmdldFRlc3RzKCkuYWRkKHRoaXMpOworICAgIG1faW5kZXggPSBpbmRleDsKKyAgICAvL25vIHR3byB0ZXN0cyBpbiB0aGUgc2FtZSBzdWl0ZSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgIC8vc28sIG1ha2UgdGhlIGRlZmF1bHQgdGVzdCBuYW1lIHVuaXF1ZQorICAgIG1fbmFtZSA9IFRlc3RORy5ERUZBVUxUX0NPTU1BTkRfTElORV9URVNUX05BTUUKKyAgICAgICsgIiAiICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyBYbWxUZXN0KCkgeworICB9CisKKyAgcHVibGljIHZvaWQgc2V0WG1sUGFja2FnZXMoTGlzdDxYbWxQYWNrYWdlPiBwYWNrYWdlcykgeworICAgIG1feG1sUGFja2FnZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QocGFja2FnZXMpOworICB9CisKKyAgcHVibGljIExpc3Q8WG1sUGFja2FnZT4gZ2V0WG1sUGFja2FnZXMoKSB7CisgICAgcmV0dXJuIG1feG1sUGFja2FnZXM7CisgIH0KKworICAvLyBGb3IgWUFNTAorICBwdWJsaWMgTGlzdDxYbWxQYWNrYWdlPiBnZXRQYWNrYWdlcygpIHsKKyAgICByZXR1cm4gZ2V0WG1sUGFja2FnZXMoKTsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKExpc3Q8WG1sUGFja2FnZT4gcCkgeworICAgIHNldFhtbFBhY2thZ2VzKHApOworICB9CisKKyAgcHVibGljIExpc3Q8WG1sTWV0aG9kU2VsZWN0b3I+IGdldE1ldGhvZFNlbGVjdG9ycygpIHsKKyAgICByZXR1cm4gbV9tZXRob2RTZWxlY3RvcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRNZXRob2RTZWxlY3RvcnMoTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gbWV0aG9kU2VsZWN0b3JzKSB7CisgICAgbV9tZXRob2RTZWxlY3RvcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QobWV0aG9kU2VsZWN0b3JzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBzdWl0ZSB0aGlzIHRlc3QgaXMgcGFydCBvZi4KKyAgICogQHJldHVybiB0aGUgc3VpdGUgdGhpcyB0ZXN0IGlzIHBhcnQgb2YuCisgICAqLworICBwdWJsaWMgWG1sU3VpdGUgZ2V0U3VpdGUoKSB7CisgICAgcmV0dXJuIG1fc3VpdGU7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgaW5jbHVkZWRHcm91cHMuCisgICAqIE5vdGU6IGRvIG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHZhbHVlLCB1c2Uge0BsaW5rICNhZGRJbmNsdWRlZEdyb3VwKFN0cmluZyl9LgorICAgKi8KKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlZEdyb3VwcygpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0OworICAgIGlmIChtX3htbEdyb3VwcyAhPSBudWxsKSB7CisgICAgICByZXN1bHQgPSBtX3htbEdyb3Vwcy5nZXRSdW4oKS5nZXRJbmNsdWRlcygpOworICAgICAgcmVzdWx0LmFkZEFsbChtX3N1aXRlLmdldEluY2x1ZGVkR3JvdXBzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBkZXByZWNhdGVkCisgICAgICByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QobV9pbmNsdWRlZEdyb3Vwcyk7CisgICAgICByZXN1bHQuYWRkQWxsKG1fc3VpdGUuZ2V0SW5jbHVkZWRHcm91cHMoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgWE1MIENsYXNzZXMuCisgICAqIEBwYXJhbSBjbGFzc2VzIFRoZSBjbGFzc2VzIHRvIHNldC4KKyAgICogQGRlcHJlY2F0ZWQgdXNlIHNldFhtbENsYXNzZXMKKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZXMoTGlzdDxYbWxDbGFzcz4gY2xhc3NlcykgeworICAgIG1feG1sQ2xhc3NlcyA9IGNsYXNzZXM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzc2VzLgorICAgKi8KKyAgcHVibGljIExpc3Q8WG1sQ2xhc3M+IGdldFhtbENsYXNzZXMoKSB7CisgICAgcmV0dXJuIG1feG1sQ2xhc3NlczsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyBMaXN0PFhtbENsYXNzPiBnZXRDbGFzc2VzKCkgeworICAgIHJldHVybiBnZXRYbWxDbGFzc2VzKCk7CisgIH0KKworICAvLyBGb3IgWUFNTAorICBwdWJsaWMgdm9pZCBzZXRDbGFzc2VzKExpc3Q8WG1sQ2xhc3M+IGMpIHsKKyAgICBzZXRYbWxDbGFzc2VzKGMpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIFhNTCBDbGFzc2VzLgorICAgKiBAcGFyYW0gY2xhc3NlcyBUaGUgY2xhc3NlcyB0byBzZXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRYbWxDbGFzc2VzKExpc3Q8WG1sQ2xhc3M+IGNsYXNzZXMpIHsKKyAgICBtX3htbENsYXNzZXMgPSBjbGFzc2VzOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbV9uYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBtX25hbWUgPSBuYW1lOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB2CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGludCB2KSB7CisgICAgbV92ZXJib3NlID0gdjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VGhyZWFkQ291bnQoKSB7CisgICAgcmV0dXJuIG1fdGhyZWFkQ291bnQgPiAwID8gbV90aHJlYWRDb3VudCA6IGdldFN1aXRlKCkuZ2V0VGhyZWFkQ291bnQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRocmVhZENvdW50KGludCB0aHJlYWRDb3VudCkgeworICAgIG1fdGhyZWFkQ291bnQgPSB0aHJlYWRDb3VudDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWRHcm91cHMoTGlzdDxTdHJpbmc+IGcpIHsKKyAgICBtX2luY2x1ZGVkR3JvdXBzID0gZzsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZyBUaGUgZXhjbHVkZWRHcm91c3BzIHRvIHNldC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkR3JvdXBzKExpc3Q8U3RyaW5nPiBnKSB7CisgICAgbV9leGNsdWRlZEdyb3VwcyA9IGc7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBleGNsdWRlZEdyb3Vwcy4KKyAgICogTm90ZTogZG8gbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgdmFsdWUsIHVzZSB7QGxpbmsgI2FkZEV4Y2x1ZGVkR3JvdXAoU3RyaW5nKX0uCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4Y2x1ZGVkR3JvdXBzKCkgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG1fZXhjbHVkZWRHcm91cHMpOworICAgIHJlc3VsdC5hZGRBbGwobV9zdWl0ZS5nZXRFeGNsdWRlZEdyb3VwcygpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgYWRkSW5jbHVkZWRHcm91cChTdHJpbmcgZykgeworICAgIG1faW5jbHVkZWRHcm91cHMuYWRkKGcpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkRXhjbHVkZWRHcm91cChTdHJpbmcgZykgeworICAgIG1fZXhjbHVkZWRHcm91cHMuYWRkKGcpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmVyYm9zZS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VmVyYm9zZSgpIHsKKyAgICBJbnRlZ2VyIHJlc3VsdCA9IG1fdmVyYm9zZTsKKyAgICBpZiAobnVsbCA9PSByZXN1bHQgfHwgWG1sU3VpdGUuREVGQVVMVF9WRVJCT1NFLmVxdWFscyhtX3ZlcmJvc2UpKSB7CisgICAgICByZXN1bHQgPSBtX3N1aXRlLmdldFZlcmJvc2UoKTsKKyAgICB9CisKKyAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldEdyb3VwQnlJbnN0YW5jZXMoKSB7CisgICAgQm9vbGVhbiByZXN1bHQgPSBtX2dyb3VwQnlJbnN0YW5jZXM7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IFhtbFN1aXRlLkRFRkFVTFRfR1JPVVBfQllfSU5TVEFOQ0VTLmVxdWFscyhtX2dyb3VwQnlJbnN0YW5jZXMpKSB7CisgICAgICByZXN1bHQgPSBtX3N1aXRlLmdldEdyb3VwQnlJbnN0YW5jZXMoKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gWG1sU3VpdGUuREVGQVVMVF9HUk9VUF9CWV9JTlNUQU5DRVM7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0R3JvdXBCeUluc3RhbmNlcyhib29sZWFuIGYpIHsKKyAgICBtX2dyb3VwQnlJbnN0YW5jZXMgPSBmOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNKVW5pdC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzSlVuaXQoKSB7CisgICAgQm9vbGVhbiByZXN1bHQgPSBtX2lzSlVuaXQ7CisgICAgaWYgKG51bGwgPT0gcmVzdWx0IHx8IFhtbFN1aXRlLkRFRkFVTFRfSlVOSVQuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgIHJlc3VsdCA9IG1fc3VpdGUuaXNKVW5pdCgpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGlzSlVuaXQgVGhlIGlzSlVuaXQgdG8gc2V0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0SlVuaXQoYm9vbGVhbiBpc0pVbml0KSB7CisgICAgbV9pc0pVbml0ID0gaXNKVW5pdDsKKyAgfQorCisgIC8vIEZvciBZQU1MCisgIHB1YmxpYyB2b2lkIHNldEp1bml0KGJvb2xlYW4gaXNKVW5pdCkgeworICAgIHNldEpVbml0KGlzSlVuaXQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoYm9vbGVhbiBza2lwKSB7CisgICAgbV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9IHNraXA7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0pVbml0LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoKSB7CisgICAgQm9vbGVhbiByZXN1bHQgPSBtX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzOworICAgIGlmIChudWxsID09IHJlc3VsdCkgeworICAgICAgcmVzdWx0ID0gbV9zdWl0ZS5za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cygpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRNZXRhR3JvdXAoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiBtZXRhR3JvdXApIHsKKyAgICBtX21ldGFHcm91cHMucHV0KG5hbWUsIG1ldGFHcm91cCk7CisgIH0KKworICAvLyBGb3IgWUFNTAorICBwdWJsaWMgdm9pZCBzZXRNZXRhR3JvdXBzKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbWV0YUdyb3VwcykgeworICAgIG1fbWV0YUdyb3VwcyA9IG1ldGFHcm91cHM7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtZXRhR3JvdXBzLgorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0TWV0YUdyb3VwcygpIHsKKyAgICBpZiAobV94bWxHcm91cHMgIT0gbnVsbCkgeworICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIExpc3Q8WG1sRGVmaW5lPiBkZWZpbmVzID0gbV94bWxHcm91cHMuZ2V0RGVmaW5lcygpOworICAgICAgZm9yIChYbWxEZWZpbmUgeGQgOiBkZWZpbmVzKSB7CisgICAgICAgIHJlc3VsdC5wdXQoeGQuZ2V0TmFtZSgpLCB4ZC5nZXRJbmNsdWRlcygpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGRlcHJlY2F0ZWQKKyAgICAgIHJldHVybiBtX21ldGFHcm91cHM7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworICAgIG1fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgbV9wYXJhbWV0ZXJzLnB1dChrZXksIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgU3RyaW5nIHJlc3VsdCA9IG1fcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgaWYgKG51bGwgPT0gcmVzdWx0KSB7CisgICAgICByZXN1bHQgPSBtX3N1aXRlLmdldFBhcmFtZXRlcihuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiB0aGlzIHRlc3QgdGFnIGFuZCB0aGUgdGFncyBhYm92ZSBpdC4KKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEFsbFBhcmFtZXRlcnMoKSB7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICByZXN1bHQucHV0QWxsKGdldFN1aXRlKCkuZ2V0UGFyYW1ldGVycygpKTsKKyAgICByZXN1bHQucHV0QWxsKG1fcGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhpcyB0YWcsIGFuZCBvbmx5IHRoaXMgdGVzdCB0YWcuIFRvIHJldHJpZXZlCisgICAqIHRoZSBpbmhlcml0ZWQgcGFyYW1ldGVycyBhcyB3ZWxsLCBjYWxsIHtAY29kZSBnZXRBbGxQYXJhbWV0ZXJzKCl9LgorICAgKi8KKyAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TG9jYWxQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBtX3BhcmFtZXRlcnM7CisgIH0KKworICAvKioKKyAgICogQGRlcHJlY2F0ZWQgVXNlIHtAY29kZSBnZXRMb2NhbFBhcmFtZXRlcnMoKX0gb3Ige0Bjb2RlIGdldEFsbFBhcmFtZXRlcnMoKX0KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIGdldEFsbFBhcmFtZXRlcnMoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgb24gdGhpcyA8dGVzdD4gdGFnIG9ubHkKKyAgICovCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFRlc3RQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBtX3BhcmFtZXRlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgcGFyYWxsZWwpIHsKKyAgICBtX3BhcmFsbGVsID0gcGFyYWxsZWw7CisgIH0KKworICBwdWJsaWMgWG1sU3VpdGUuUGFyYWxsZWxNb2RlIGdldFBhcmFsbGVsKCkgeworICAgIFhtbFN1aXRlLlBhcmFsbGVsTW9kZSByZXN1bHQ7CisgICAgaWYgKG51bGwgIT0gbV9wYXJhbGxlbCB8fCBYbWxTdWl0ZS5ERUZBVUxUX1BBUkFMTEVMLmVxdWFscyhtX3BhcmFsbGVsKSkgeworICAgICAgcmVzdWx0ID0gbV9wYXJhbGxlbDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQgPSBtX3N1aXRlLmdldFBhcmFsbGVsKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZU91dCgpIHsKKyAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICBpZiAobnVsbCAhPSBtX3RpbWVPdXQpIHsKKyAgICAgIHJlc3VsdCA9IG1fdGltZU91dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQgPSBtX3N1aXRlLmdldFRpbWVPdXQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0VGltZU91dChsb25nIGRlZikgeworICAgIGxvbmcgcmVzdWx0ID0gZGVmOworICAgIGlmIChnZXRUaW1lT3V0KCkgIT0gbnVsbCkgeworICAgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyhnZXRUaW1lT3V0KCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUaW1lT3V0KGxvbmcgdGltZU91dCkgeworICAgICAgbV90aW1lT3V0ID0gTG9uZy50b1N0cmluZyh0aW1lT3V0KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRUaW1lT3V0KFN0cmluZyB0aW1lT3V0KSB7CisgICAgICBtX3RpbWVPdXQgPSB0aW1lT3V0OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgIHNldEJlYW5TaGVsbEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRCZWFuU2hlbGxFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gc2VsZWN0b3JzID0gZ2V0TWV0aG9kU2VsZWN0b3JzKCk7CisgICAgaWYgKHNlbGVjdG9ycy5zaXplKCkgPiAwKSB7CisgICAgICBzZWxlY3RvcnMuZ2V0KDApLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgfSBlbHNlIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsKKyAgICAgIFhtbE1ldGhvZFNlbGVjdG9yIHhtcyA9IG5ldyBYbWxNZXRob2RTZWxlY3RvcigpOworICAgICAgeG1zLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICB4bXMuc2V0TGFuZ3VhZ2UoIkJlYW5TaGVsbCIpOworICAgICAgZ2V0TWV0aG9kU2VsZWN0b3JzKCkuYWRkKHhtcyk7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgeworICAgIExpc3Q8WG1sTWV0aG9kU2VsZWN0b3I+IHNlbGVjdG9ycyA9IGdldE1ldGhvZFNlbGVjdG9ycygpOworICAgIGlmIChzZWxlY3RvcnMuc2l6ZSgpID4gMCkgeworICAgICAgcmV0dXJuIHNlbGVjdG9ycy5nZXQoMCkuZ2V0RXhwcmVzc2lvbigpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvWG1sKFN0cmluZyBpbmRlbnQpIHsKKyAgICBYTUxTdHJpbmdCdWZmZXIgeHNiID0gbmV3IFhNTFN0cmluZ0J1ZmZlcihpbmRlbnQpOworICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgcC5zZXRQcm9wZXJ0eSgibmFtZSIsIGdldE5hbWUoKSk7CisgICAgaWYgKG1faXNKVW5pdCAhPSBudWxsKSB7CisgICAgICBYbWxVdGlscy5zZXRQcm9wZXJ0eShwLCAianVuaXQiLCBtX2lzSlVuaXQudG9TdHJpbmcoKSwgWG1sU3VpdGUuREVGQVVMVF9KVU5JVC50b1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKG1fcGFyYWxsZWwgIT0gbnVsbCkgeworICAgICAgWG1sVXRpbHMuc2V0UHJvcGVydHkocCwgInBhcmFsbGVsIiwgbV9wYXJhbGxlbC50b1N0cmluZygpLCBYbWxTdWl0ZS5ERUZBVUxUX1BBUkFMTEVMLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAobV92ZXJib3NlICE9IG51bGwpIHsKKyAgICAgIFhtbFV0aWxzLnNldFByb3BlcnR5KHAsICJ2ZXJib3NlIiwgbV92ZXJib3NlLnRvU3RyaW5nKCksIFhtbFN1aXRlLkRFRkFVTFRfVkVSQk9TRS50b1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKG51bGwgIT0gbV90aW1lT3V0KSB7CisgICAgICBwLnNldFByb3BlcnR5KCJ0aW1lLW91dCIsIG1fdGltZU91dC50b1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKG1fcHJlc2VydmVPcmRlciAhPSBudWxsICYmICEgWG1sU3VpdGUuREVGQVVMVF9QUkVTRVJWRV9PUkRFUi5lcXVhbHMobV9wcmVzZXJ2ZU9yZGVyKSkgeworICAgICAgcC5zZXRQcm9wZXJ0eSgicHJlc2VydmUtb3JkZXIiLCBtX3ByZXNlcnZlT3JkZXIudG9TdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChtX3RocmVhZENvdW50ICE9IC0xKSB7CisgICAgICBwLnNldFByb3BlcnR5KCJ0aHJlYWQtY291bnQiLCBJbnRlZ2VyLnRvU3RyaW5nKG1fdGhyZWFkQ291bnQpKTsKKyAgICB9CisgICAgaWYgKG1fZ3JvdXBCeUluc3RhbmNlcyAhPSBudWxsKSB7CisgICAgICBYbWxVdGlscy5zZXRQcm9wZXJ0eShwLCAiZ3JvdXAtYnktaW5zdGFuY2VzIiwgU3RyaW5nLnZhbHVlT2YoZ2V0R3JvdXBCeUluc3RhbmNlcygpKSwKKyAgICAgICAgICBYbWxTdWl0ZS5ERUZBVUxUX0dST1VQX0JZX0lOU1RBTkNFUy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICB4c2IucHVzaCgidGVzdCIsIHApOworCisKKyAgICBpZiAobnVsbCAhPSBnZXRNZXRob2RTZWxlY3RvcnMoKSAmJiAhZ2V0TWV0aG9kU2VsZWN0b3JzKCkuaXNFbXB0eSgpKSB7CisgICAgICB4c2IucHVzaCgibWV0aG9kLXNlbGVjdG9ycyIpOworICAgICAgZm9yIChYbWxNZXRob2RTZWxlY3RvciBzZWxlY3RvcjogZ2V0TWV0aG9kU2VsZWN0b3JzKCkpIHsKKyAgICAgICAgeHNiLmdldFN0cmluZ0J1ZmZlcigpLmFwcGVuZChzZWxlY3Rvci50b1htbChpbmRlbnQgKyAiICAgICIpKTsKKyAgICAgIH0KKworICAgICAgeHNiLnBvcCgibWV0aG9kLXNlbGVjdG9ycyIpOworICAgIH0KKworICAgIFhtbFV0aWxzLmR1bXBQYXJhbWV0ZXJzKHhzYiwgbV9wYXJhbWV0ZXJzKTsKKworICAgIC8vIGdyb3VwcworICAgIGlmICghbV9tZXRhR3JvdXBzLmlzRW1wdHkoKSB8fCAhbV9pbmNsdWRlZEdyb3Vwcy5pc0VtcHR5KCkgfHwgIW1fZXhjbHVkZWRHcm91cHMuaXNFbXB0eSgpCisgICAgICAgIHx8ICFtX3htbERlcGVuZGVuY3lHcm91cHMuaXNFbXB0eSgpKSB7CisgICAgICB4c2IucHVzaCgiZ3JvdXBzIik7CisKKyAgICAgIC8vIGRlZmluZQorICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5OiBtX21ldGFHcm91cHMuZW50cnlTZXQoKSkgeworICAgICAgICBTdHJpbmcgbWV0YUdyb3VwTmFtZSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBOYW1lcyA9IGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgUHJvcGVydGllcyBtZXRhR3JvdXBQcm9wPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBtZXRhR3JvdXBQcm9wLnNldFByb3BlcnR5KCJuYW1lIiwgIG1ldGFHcm91cE5hbWUpOworCisgICAgICAgIHhzYi5wdXNoKCJkZWZpbmUiLCBtZXRhR3JvdXBQcm9wKTsKKworICAgICAgICBmb3IgKFN0cmluZyBncm91cE5hbWU6IGdyb3VwTmFtZXMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIGluY2x1ZGVQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgaW5jbHVkZVByb3BzLnNldFByb3BlcnR5KCJuYW1lIiwgZ3JvdXBOYW1lKTsKKworICAgICAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImluY2x1ZGUiLCBpbmNsdWRlUHJvcHMpOworICAgICAgICB9CisKKyAgICAgICAgeHNiLnBvcCgiZGVmaW5lIik7CisgICAgICB9CisKKyAgICAgIC8vIHJ1bgorICAgICAgaWYgKCFtX2luY2x1ZGVkR3JvdXBzLmlzRW1wdHkoKSB8fCAhbV9leGNsdWRlZEdyb3Vwcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgeHNiLnB1c2goInJ1biIpOworCisgICAgICAgIGZvciAoU3RyaW5nIGluY2x1ZGVHcm91cE5hbWU6IG1faW5jbHVkZWRHcm91cHMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIGluY2x1ZGVQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgaW5jbHVkZVByb3BzLnNldFByb3BlcnR5KCJuYW1lIiwgaW5jbHVkZUdyb3VwTmFtZSk7CisKKyAgICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJpbmNsdWRlIiwgaW5jbHVkZVByb3BzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIGV4Y2x1ZGVHcm91cE5hbWU6IG1fZXhjbHVkZWRHcm91cHMpIHsKKyAgICAgICAgICBQcm9wZXJ0aWVzIGV4Y2x1ZGVQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgZXhjbHVkZVByb3BzLnNldFByb3BlcnR5KCJuYW1lIiwgZXhjbHVkZUdyb3VwTmFtZSk7CisKKyAgICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJleGNsdWRlIiwgZXhjbHVkZVByb3BzKTsKKyAgICAgICAgfQorCisgICAgICAgIHhzYi5wb3AoInJ1biIpOworICAgICAgfQorCisgICAgICAvLyBncm91cCBkZXBlbmRlbmNpZXMKKyAgICAgIGlmIChtX3htbERlcGVuZGVuY3lHcm91cHMgIT0gbnVsbCAmJiAhIG1feG1sRGVwZW5kZW5jeUdyb3Vwcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgeHNiLnB1c2goImRlcGVuZGVuY2llcyIpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtX3htbERlcGVuZGVuY3lHcm91cHMuZW50cnlTZXQoKSkgeworICAgICAgICAgIHhzYi5hZGRFbXB0eUVsZW1lbnQoImdyb3VwIiwgIm5hbWUiLCBlbnRyeS5nZXRLZXkoKSwgImRlcGVuZHMtb24iLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB4c2IucG9wKCJkZXBlbmRlbmNpZXMiKTsKKyAgICAgIH0KKworICAgICAgeHNiLnBvcCgiZ3JvdXBzIik7CisgICAgfQorCisgICAgaWYgKG51bGwgIT0gbV94bWxQYWNrYWdlcyAmJiAhbV94bWxQYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgIHhzYi5wdXNoKCJwYWNrYWdlcyIpOworCisgICAgICBmb3IgKFhtbFBhY2thZ2UgcGFjazogbV94bWxQYWNrYWdlcykgeworICAgICAgICB4c2IuZ2V0U3RyaW5nQnVmZmVyKCkuYXBwZW5kKHBhY2sudG9YbWwoIiAgICAgICIpKTsKKyAgICAgIH0KKworICAgICAgeHNiLnBvcCgicGFja2FnZXMiKTsKKyAgICB9CisKKyAgICAvLyBjbGFzc2VzCisgICAgaWYgKG51bGwgIT0gZ2V0WG1sQ2xhc3NlcygpICYmICFnZXRYbWxDbGFzc2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICB4c2IucHVzaCgiY2xhc3NlcyIpOworICAgICAgZm9yIChYbWxDbGFzcyBjbHMgOiBnZXRYbWxDbGFzc2VzKCkpIHsKKyAgICAgICAgeHNiLmdldFN0cmluZ0J1ZmZlcigpLmFwcGVuZChjbHMudG9YbWwoaW5kZW50ICsgIiAgICAiKSk7CisgICAgICB9CisgICAgICB4c2IucG9wKCJjbGFzc2VzIik7CisgICAgfQorCisgICAgeHNiLnBvcCgidGVzdCIpOworCisgICAgcmV0dXJuIHhzYi50b1hNTCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisvLyAgICByZXR1cm4gdG9YbWwoIiIpOworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoIltUZXN0OiBcIiIpCisgICAgICAgICAgICAuYXBwZW5kKG1fbmFtZSkKKyAgICAgICAgICAgIC5hcHBlbmQoIlwiIikKKyAgICAgICAgICAgIC5hcHBlbmQoIiB2ZXJib3NlOiIpCisgICAgICAgICAgICAuYXBwZW5kKG1fdmVyYm9zZSk7CisKKyAgICByZXN1bHQuYXBwZW5kKCJbcGFyYW1ldGVyczoiKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtX3BhcmFtZXRlcnMuZW50cnlTZXQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI9PiIpLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKCJdIik7CisgICAgcmVzdWx0LmFwcGVuZCgiW21ldGFncm91cHM6Iik7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogbV9tZXRhR3JvdXBzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiPSIpOworICAgICAgZm9yIChTdHJpbmcgbiA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChuKS5hcHBlbmQoIiwiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXSAiKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIltpbmNsdWRlZDogIik7CisgICAgZm9yIChTdHJpbmcgZyA6IG1faW5jbHVkZWRHcm91cHMpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZykuYXBwZW5kKCIgIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIltleGNsdWRlZDogIik7CisgICAgZm9yIChTdHJpbmcgZyA6IG1fZXhjbHVkZWRHcm91cHMpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZykuYXBwZW5kKCIgIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIl0gIik7CisKKyAgICByZXN1bHQuYXBwZW5kKCIgY2xhc3NlczoiKTsKKyAgICBmb3IgKFhtbENsYXNzIGNsIDogbV94bWxDbGFzc2VzKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGNsKS5hcHBlbmQoIiAiKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKCIgcGFja2FnZXM6Iik7CisgICAgZm9yIChYbWxQYWNrYWdlIHAgOiBtX3htbFBhY2thZ2VzKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHApLmFwcGVuZCgiICIpOworICAgIH0KKworICAgIHJlc3VsdC5hcHBlbmQoIl0gIik7CisKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltYbWxUZXN0XSAiICsgcyk7CisgIH0KKworICAvKioKKyAgICogQ2xvbmUgdGhlIDxUVD5zb3VyY2U8L1RUPiA8Q09ERT5YbWxUZXN0PC9DT0RFPiBieSBpbmNsdWRpbmc6CisgICAqIC0gdGVzdCBhdHRyaWJ1dGVzCisgICAqIC0gZ3JvdXBzIGRlZmluaXRpb25zCisgICAqIC0gcGFyYW1ldGVycworICAgKgorICAgKiBUaGUgJmx0O2NsYXNzZXMmZ3Q7IHN1YiBlbGVtZW50IGlzIGlnbm9yZWQgZm9yIHRoZSBtb21lbnQuCisgICAqCisgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGUgY3VycmVudCBYbWxUZXN0CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICBYbWxUZXN0IHJlc3VsdCA9IG5ldyBYbWxUZXN0KGdldFN1aXRlKCkpOworCisgICAgcmVzdWx0LnNldE5hbWUoZ2V0TmFtZSgpKTsKKyAgICByZXN1bHQuc2V0SW5jbHVkZWRHcm91cHMoZ2V0SW5jbHVkZWRHcm91cHMoKSk7CisgICAgcmVzdWx0LnNldEV4Y2x1ZGVkR3JvdXBzKGdldEV4Y2x1ZGVkR3JvdXBzKCkpOworICAgIHJlc3VsdC5zZXRKVW5pdChpc0pVbml0KCkpOworICAgIHJlc3VsdC5zZXRQYXJhbGxlbChnZXRQYXJhbGxlbCgpKTsKKyAgICByZXN1bHQuc2V0VmVyYm9zZShnZXRWZXJib3NlKCkpOworICAgIHJlc3VsdC5zZXRQYXJhbWV0ZXJzKGdldExvY2FsUGFyYW1ldGVycygpKTsKKyAgICByZXN1bHQuc2V0WG1sUGFja2FnZXMoZ2V0WG1sUGFja2FnZXMoKSk7CisgICAgcmVzdWx0LnNldFRpbWVPdXQoZ2V0VGltZU91dCgpKTsKKworICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbWV0YWdyb3VwcyA9IGdldE1ldGFHcm91cHMoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ3JvdXA6IG1ldGFncm91cHMuZW50cnlTZXQoKSkgeworICAgICAgcmVzdWx0LmFkZE1ldGFHcm91cChncm91cC5nZXRLZXkoKSwgZ3JvdXAuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FjaGUgdGhlIG9yZGVyaW5nIG51bWJlcnMgZm9yIG1ldGhvZHMuCisgICAqLworICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRJbnZvY2F0aW9uTnVtYmVycyhTdHJpbmcgbWV0aG9kKSB7CisgICAgaWYgKG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMgPT0gbnVsbCkgeworICAgICAgbV9mYWlsZWRJbnZvY2F0aW9uTnVtYmVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgZm9yIChYbWxDbGFzcyBjIDogZ2V0WG1sQ2xhc3NlcygpKSB7CisgICAgICAgIGZvciAoWG1sSW5jbHVkZSB4aSA6IGMuZ2V0SW5jbHVkZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICBMaXN0PEludGVnZXI+IGludm9jYXRpb25OdW1iZXJzID0geGkuZ2V0SW52b2NhdGlvbk51bWJlcnMoKTsKKyAgICAgICAgICBpZiAoaW52b2NhdGlvbk51bWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBjLmdldE5hbWUoKSArICIuIiArIHhpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMucHV0KG1ldGhvZE5hbWUsIGludm9jYXRpb25OdW1iZXJzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBMaXN0PEludGVnZXI+IHJlc3VsdCA9IG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMuZ2V0KG1ldGhvZCk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAvLyBEb24ndCB1c2UgZW1wdHlMaXN0IGhlcmUgc2luY2UgdGhpcyBsaXN0IG1pZ2h0IGVuZCB1cCByZWNlaXZpbmcgdmFsdWVzIGlmCisgICAgICAvLyB0aGUgdGVzdCBydW4gZmFpbHMuCisgICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVPcmRlcihTdHJpbmcgcHJlc2VydmVPcmRlcikgeworICAgIG1fcHJlc2VydmVPcmRlciA9IHByZXNlcnZlT3JkZXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFByZXNlcnZlT3JkZXIoKSB7CisgICAgU3RyaW5nIHJlc3VsdCA9IG1fcHJlc2VydmVPcmRlcjsKKyAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgWG1sU3VpdGUuREVGQVVMVF9QUkVTRVJWRV9PUkRFUi5lcXVhbHMobV9wcmVzZXJ2ZU9yZGVyKSkgeworICAgICAgcmVzdWx0ID0gbV9zdWl0ZS5nZXRQcmVzZXJ2ZU9yZGVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFN1aXRlKFhtbFN1aXRlIHJlc3VsdCkgeworICAgIG1fc3VpdGUgPSByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgQm9vbGVhbiBnZXRBbGxvd1JldHVyblZhbHVlcygpIHsKKyAgICBpZiAobV9hbGxvd1JldHVyblZhbHVlcyAhPSBudWxsKSByZXR1cm4gbV9hbGxvd1JldHVyblZhbHVlczsKKyAgICBlbHNlIHJldHVybiBnZXRTdWl0ZSgpLmdldEFsbG93UmV0dXJuVmFsdWVzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbGxvd1JldHVyblZhbHVlcyhCb29sZWFuIGFsbG93UmV0dXJuVmFsdWVzKSB7CisgICAgbV9hbGxvd1JldHVyblZhbHVlcyA9IGFsbG93UmV0dXJuVmFsdWVzOworICB9CisKKyAgLyoqCisgICAqIE5vdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb21lIGZyb20gdGhlIFhNTCBmaWxlLCBpdCdzIGNhbGN1bGF0ZWQKKyAgICogaW50ZXJuYWxseSBhbmQgcmVwcmVzZW50cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpcyB0ZXN0IHRhZyB3YXMgZm91bmQgaW4gaXRzCisgICAqICZsdDtzdWl0ZSZndDsgdGFnLiAgSXQncyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgb3JkZXJpbmcgb2YgdGhlIHRlc3RzCisgICAqIHdoZW4gcHJlc2VydmUtdGVzdC1vcmRlciBpcyB0cnVlLgorICAgKi8KKyAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKyAgICByZXR1cm4gbV9pbmRleDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX2V4Y2x1ZGVkR3JvdXBzID09IG51bGwpID8gMCA6IG1fZXhjbHVkZWRHcm91cHMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUKKyAgICAgICAgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMgPT0gbnVsbCkgPyAwIDogbV9mYWlsZWRJbnZvY2F0aW9uTnVtYmVycworICAgICAgICAgICAgLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX2luY2x1ZGVkR3JvdXBzID09IG51bGwpID8gMCA6IG1faW5jbHVkZWRHcm91cHMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1faXNKVW5pdCA9PSBudWxsKSA/IDAgOiBtX2lzSlVuaXQuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fbWV0YUdyb3VwcyA9PSBudWxsKSA/IDAgOiBtX21ldGFHcm91cHMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fbWV0aG9kU2VsZWN0b3JzID09IG51bGwpID8gMCA6IG1fbWV0aG9kU2VsZWN0b3JzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX25hbWUgPT0gbnVsbCkgPyAwIDogbV9uYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX3BhcmFsbGVsID09IG51bGwpID8gMCA6IG1fcGFyYWxsZWwuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fcGFyYW1ldGVycyA9PSBudWxsKSA/IDAgOiBtX3BhcmFtZXRlcnMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fcHJlc2VydmVPcmRlciA9PSBudWxsKSA/IDAgOiBtX3ByZXNlcnZlT3JkZXIuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUKKyAgICAgICAgKiByZXN1bHQKKyAgICAgICAgKyAoKG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMgPT0gbnVsbCkgPyAwCisgICAgICAgICAgICA6IG1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBtX3RocmVhZENvdW50OworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX3RpbWVPdXQgPT0gbnVsbCkgPyAwIDogbV90aW1lT3V0Lmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtX3ZlcmJvc2UgPT0gbnVsbCkgPyAwIDogbV92ZXJib3NlLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX3htbENsYXNzZXMgPT0gbnVsbCkgPyAwIDogbV94bWxDbGFzc2VzLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0CisgICAgICAgICsgKChtX3htbFBhY2thZ2VzID09IG51bGwpID8gMCA6IG1feG1sUGFja2FnZXMuaGFzaENvZGUoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIFhtbFRlc3Qgb3RoZXIgPSAoWG1sVGVzdCkgb2JqOworICAgIGlmIChtX2V4Y2x1ZGVkR3JvdXBzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2V4Y2x1ZGVkR3JvdXBzICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9leGNsdWRlZEdyb3Vwcy5lcXVhbHMob3RoZXIubV9leGNsdWRlZEdyb3VwcykpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworLy8gICAgaWYgKG1fZXhwcmVzc2lvbiA9PSBudWxsKSB7CisvLyAgICAgIGlmIChvdGhlci5tX2V4cHJlc3Npb24gIT0gbnVsbCkKKy8vICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworLy8gICAgfSBlbHNlIGlmICghbV9leHByZXNzaW9uLmVxdWFscyhvdGhlci5tX2V4cHJlc3Npb24pKQorLy8gICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX2ZhaWxlZEludm9jYXRpb25OdW1iZXJzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2ZhaWxlZEludm9jYXRpb25OdW1iZXJzICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9mYWlsZWRJbnZvY2F0aW9uTnVtYmVycworICAgICAgICAuZXF1YWxzKG90aGVyLm1fZmFpbGVkSW52b2NhdGlvbk51bWJlcnMpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9pbmNsdWRlZEdyb3VwcyA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9pbmNsdWRlZEdyb3VwcyAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1faW5jbHVkZWRHcm91cHMuZXF1YWxzKG90aGVyLm1faW5jbHVkZWRHcm91cHMpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9pc0pVbml0ID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX2lzSlVuaXQgIT0gbnVsbCAmJiAhIG90aGVyLm1faXNKVW5pdC5lcXVhbHMoWG1sU3VpdGUuREVGQVVMVF9KVU5JVCkpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9pc0pVbml0LmVxdWFscyhvdGhlci5tX2lzSlVuaXQpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9tZXRhR3JvdXBzID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX21ldGFHcm91cHMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX21ldGFHcm91cHMuZXF1YWxzKG90aGVyLm1fbWV0YUdyb3VwcykpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX21ldGhvZFNlbGVjdG9ycyA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9tZXRob2RTZWxlY3RvcnMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX21ldGhvZFNlbGVjdG9ycy5lcXVhbHMob3RoZXIubV9tZXRob2RTZWxlY3RvcnMpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9uYW1lID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX25hbWUgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX25hbWUuZXF1YWxzKG90aGVyLm1fbmFtZSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX3BhcmFsbGVsID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX3BhcmFsbGVsICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9wYXJhbGxlbC5lcXVhbHMob3RoZXIubV9wYXJhbGxlbCkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX3BhcmFtZXRlcnMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1fcGFyYW1ldGVycyAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1fcGFyYW1ldGVycy5lcXVhbHMob3RoZXIubV9wYXJhbWV0ZXJzKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1fcHJlc2VydmVPcmRlciA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9wcmVzZXJ2ZU9yZGVyICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV9wcmVzZXJ2ZU9yZGVyLmVxdWFscyhvdGhlci5tX3ByZXNlcnZlT3JkZXIpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV9za2lwRmFpbGVkSW52b2NhdGlvbkNvdW50cyAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1fc2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMKKyAgICAgICAgLmVxdWFscyhvdGhlci5tX3NraXBGYWlsZWRJbnZvY2F0aW9uQ291bnRzKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1fdGhyZWFkQ291bnQgIT0gb3RoZXIubV90aHJlYWRDb3VudCkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1fdGltZU91dCA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubV90aW1lT3V0ICE9IG51bGwpCisgICAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgfSBlbHNlIGlmICghbV90aW1lT3V0LmVxdWFscyhvdGhlci5tX3RpbWVPdXQpKQorICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICBpZiAobV92ZXJib3NlID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5tX3ZlcmJvc2UgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3ZlcmJvc2UuZXF1YWxzKG90aGVyLm1fdmVyYm9zZSkpCisgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIGlmIChtX3htbENsYXNzZXMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1feG1sQ2xhc3NlcyAhPSBudWxsKQorICAgICAgICByZXR1cm4gWG1sU3VpdGUuZigpOworICAgIH0gZWxzZSBpZiAoIW1feG1sQ2xhc3Nlcy5lcXVhbHMob3RoZXIubV94bWxDbGFzc2VzKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisgICAgaWYgKG1feG1sUGFja2FnZXMgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm1feG1sUGFja2FnZXMgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIFhtbFN1aXRlLmYoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3htbFBhY2thZ2VzLmVxdWFscyhvdGhlci5tX3htbFBhY2thZ2VzKSkKKyAgICAgIHJldHVybiBYbWxTdWl0ZS5mKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZFhtbERlcGVuZGVuY3lHcm91cChTdHJpbmcgZ3JvdXAsIFN0cmluZyBkZXBlbmRzT24pIHsKKyAgICBpZiAoISBtX3htbERlcGVuZGVuY3lHcm91cHMuY29udGFpbnNLZXkoZ3JvdXApKSB7CisgICAgICBtX3htbERlcGVuZGVuY3lHcm91cHMucHV0KGdyb3VwLCBkZXBlbmRzT24pOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVGVzdE5HRXhjZXB0aW9uKCJEdXBsaWNhdGUgZ3JvdXAgZGVwZW5kZW5jeSBmb3VuZCBmb3IgZ3JvdXAgXCIiICsgZ3JvdXAgKyAiXCIiCisgICAgICAgICAgKyAiLCB1c2UgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBncm91cHMgaW4gdGhlIFwiZGVwZW5kcy1vblwiIGF0dHJpYnV0ZSIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhtbERlcGVuZGVuY3lHcm91cHMoKSB7CisgICAgaWYgKG1feG1sR3JvdXBzICE9IG51bGwpIHsKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICBMaXN0PFhtbERlcGVuZGVuY2llcz4gZGVwcyA9IG1feG1sR3JvdXBzLmdldERlcGVuZGVuY2llcygpOworICAgICAgZm9yIChYbWxEZXBlbmRlbmNpZXMgZCA6IGRlcHMpIHsKKyAgICAgICAgcmVzdWx0LnB1dEFsbChkLmdldERlcGVuZGVuY2llcygpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGRlcHJlY2F0ZWQKKyAgICAgIHJldHVybiBtX3htbERlcGVuZGVuY3lHcm91cHM7CisgICAgfQorICB9CisKKyAgQFBhcmVudFNldHRlcgorICBwdWJsaWMgdm9pZCBzZXRYbWxTdWl0ZShYbWxTdWl0ZSBzdWl0ZSkgeworCSAgbV9zdWl0ZSA9IHN1aXRlOworICB9CisKKyAgcHJpdmF0ZSBYbWxHcm91cHMgbV94bWxHcm91cHM7CisKKyAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFhtbEdyb3VwcyB4bWxHcm91cHMpIHsKKyAgICBtX3htbEdyb3VwcyA9IHhtbEdyb3VwczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxVdGlscy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9YbWxVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTM0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL1htbFV0aWxzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbDsKKworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLlhNTFN0cmluZ0J1ZmZlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworcHVibGljIGNsYXNzIFhtbFV0aWxzIHsKKworICAvKioKKyAgICogRG9uJ3QgYWRkIHRoaXMgcHJvcGVydHkgaWYgaXQncyBlcXVhbCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShQcm9wZXJ0aWVzIHAsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWYpIHsKKyAgICBpZiAoISBkZWYuZXF1YWxzKHZhbHVlKSAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICBwLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcFBhcmFtZXRlcnMoWE1MU3RyaW5nQnVmZmVyIHhzYiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgLy8gcGFyYW1ldGVycworICAgIGlmICghcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKKyAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHBhcmE6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICBQcm9wZXJ0aWVzIHBhcmFtUHJvcHM9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHBhcmFtUHJvcHMuc2V0UHJvcGVydHkoIm5hbWUiLCBwYXJhLmdldEtleSgpKTsKKyAgICAgICAgcGFyYW1Qcm9wcy5zZXRQcm9wZXJ0eSgidmFsdWUiLCBwYXJhLmdldFZhbHVlKCkpOworICAgICAgICB4c2IuYWRkRW1wdHlFbGVtZW50KCJwYXJhbWV0ZXIiLCBwYXJhbVByb3BzKTsgLy8gQlVHRklYOiBURVNUTkctMjcKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vRG9tVXRpbC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vRG9tVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGY3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9Eb21VdGlsLmphdmEKQEAgLTAsMCArMSwyNzcgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBEb21VdGlsIHsKKworICBwcml2YXRlIFhQYXRoIG1feHBhdGg7CisgIHByaXZhdGUgRG9jdW1lbnQgbV9kb2N1bWVudDsKKworICBwdWJsaWMgRG9tVXRpbChEb2N1bWVudCBkb2MpIHsKKyAgICBYUGF0aEZhY3RvcnkgeHBhdGhGYWN0b3J5ID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgbV94cGF0aCA9IHhwYXRoRmFjdG9yeS5uZXdYUGF0aCgpOworICAgIG1fZG9jdW1lbnQgPSBkb2M7CisgIH0KKworICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShmaW5hbCBYbWxTdWl0ZSB4bWxTdWl0ZSkgdGhyb3dzIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgTm9kZUxpc3Qgbm9kZXMgPSBtX2RvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIE5vZGUgaXRlbTEgPSBub2Rlcy5pdGVtKGkpOworCisgICAgICBNYXA8U3RyaW5nLCBOb2RlUHJvY2Vzc29yPiBtYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIG1hcC5wdXQoInBhcmFtZXRlciIsIG5ldyBOb2RlUHJvY2Vzc29yKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgbm9kZTsKKyAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChlLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgbWFwLnB1dCgidGVzdCIsIG5ldyBOb2RlUHJvY2Vzc29yKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgICBYbWxUZXN0IHhtbFRlc3QgPSBuZXcgWG1sVGVzdCh4bWxTdWl0ZSk7CisgICAgICAgICAgcG9wdWxhdGVUZXN0KHhtbFRlc3QsIG5vZGUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIG1hcC5wdXQoInN1aXRlLWZpbGVzIiwgbmV3IE5vZGVQcm9jZXNzb3IoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKE5vZGUgbm9kZSkgeworICAgICAgICAgIE5vZGVMaXN0IGl0ZW0yQ2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICBMaXN0PFN0cmluZz4gc3VpdGVGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaXRlbTJDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICBOb2RlIGl0ZW0zID0gaXRlbTJDaGlsZHJlbi5pdGVtKGspOworICAgICAgICAgICAgaWYgKGl0ZW0zIGluc3RhbmNlb2YgRWxlbWVudCkgeworICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgaXRlbTM7CisgICAgICAgICAgICAgIGlmICgic3VpdGUtZmlsZSIuZXF1YWxzKGl0ZW0zLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3VpdGVGaWxlcy5hZGQoZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgeG1sU3VpdGUuc2V0U3VpdGVGaWxlcyhzdWl0ZUZpbGVzKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBwYXJzZU5vZGVBbmRDaGlsZHJlbigic3VpdGUiLCBpdGVtMSwgeG1sU3VpdGUsIG1hcCk7CisKKy8vICAgICAgaWYgKCJzdWl0ZSIuZXF1YWxzKGl0ZW0xLmdldE5vZGVOYW1lKCkpICYmIGl0ZW0xLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7CisvLyAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGl0ZW0xLCB4bWxTdWl0ZSk7CisvLyAgICAgICAgTm9kZUxpc3QgaXRlbTFDaGlsZHJlbiA9IGl0ZW0xLmdldENoaWxkTm9kZXMoKTsKKy8vICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGl0ZW0xQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgeworLy8gICAgICAgICAgTm9kZSBpdGVtMiA9IGl0ZW0xQ2hpbGRyZW4uaXRlbShqKTsKKy8vICAgICAgICAgIGlmICgicGFyYW1ldGVyIi5lcXVhbHMoaXRlbTIuZ2V0Tm9kZU5hbWUoKSkpIHsKKy8vICAgICAgICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpIGl0ZW0yOworLy8gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChlLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKSk7CisvLyAgICAgICAgICB9IGVsc2UgaWYgKCJ0ZXN0Ii5lcXVhbHMoaXRlbTIuZ2V0Tm9kZU5hbWUoKSkpIHsKKy8vICAgICAgICAgICAgWG1sVGVzdCB4bWxUZXN0ID0gbmV3IFhtbFRlc3QoeG1sU3VpdGUpOworLy8gICAgICAgICAgICBwb3B1bGF0ZVRlc3QoeG1sVGVzdCwgaXRlbTIpOworLy8gICAgICAgICAgfSBlbHNlIGlmICgic3VpdGUtZmlsZXMiLmVxdWFscyhpdGVtMi5nZXROb2RlTmFtZSgpKSkgeworLy8gICAgICAgICAgICBOb2RlTGlzdCBpdGVtMkNoaWxkcmVuID0gaXRlbTIuZ2V0Q2hpbGROb2RlcygpOworLy8gICAgICAgICAgICBMaXN0PFN0cmluZz4gc3VpdGVGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworLy8gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGl0ZW0yQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGsrKykgeworLy8gICAgICAgICAgICAgIE5vZGUgaXRlbTMgPSBpdGVtMkNoaWxkcmVuLml0ZW0oayk7CisvLyAgICAgICAgICAgICAgaWYgKGl0ZW0zIGluc3RhbmNlb2YgRWxlbWVudCkgeworLy8gICAgICAgICAgICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpIGl0ZW0zOworLy8gICAgICAgICAgICAgICAgaWYgKCJzdWl0ZS1maWxlIi5lcXVhbHMoaXRlbTMuZ2V0Tm9kZU5hbWUoKSkpIHsKKy8vICAgICAgICAgICAgICAgICAgc3VpdGVGaWxlcy5hZGQoZS5nZXRBdHRyaWJ1dGUoInBhdGgiKSk7CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICAgIHhtbFN1aXRlLnNldFN1aXRlRmlsZXMoc3VpdGVGaWxlcyk7CisvLyAgICAgICAgICB9CisvLyAgICAgICAgfQorLy8gICAgICB9CisgICAgfQorCisgICAgeG1sU3VpdGUuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKy8vICAgIFhQYXRoRXhwcmVzc2lvbiBleHByID0gbV94cGF0aC5jb21waWxlKCIvL3N1aXRlL3Rlc3QiKTsKKy8vICAgIE5vZGVMaXN0IHRlc3RzID0gKE5vZGVMaXN0KSBleHByLmV2YWx1YXRlKG1fZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLk5PREVTRVQpOworLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisvLyAgICAgIE5vZGUgbm9kZSA9IHRlc3RzLml0ZW0oaSk7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPHRlc3Q+OiIgKyBub2RlKTsKKy8vICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE5vZGVQcm9jZXNzb3IgeworICAgIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBhcnNlTm9kZUFuZENoaWxkcmVuKFN0cmluZyBuYW1lLCBOb2RlIHJvb3QsIE9iamVjdCBvYmplY3QsCisgICAgICBNYXA8U3RyaW5nLCBOb2RlUHJvY2Vzc29yPiBwcm9jZXNzb3JzKSB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICBpZiAobmFtZS5lcXVhbHMocm9vdC5nZXROb2RlTmFtZSgpKSAmJiByb290LmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7CisgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXMocm9vdCwgb2JqZWN0KTsKKyAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgTm9kZSBpdGVtMiA9IGNoaWxkcmVuLml0ZW0oaik7CisgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGl0ZW0yLmdldE5vZGVOYW1lKCk7CisgICAgICAgIE5vZGVQcm9jZXNzb3IgcHJvYyA9IHByb2Nlc3NvcnMuZ2V0KG5vZGVOYW1lKTsKKyAgICAgICAgaWYgKHByb2MgIT0gbnVsbCkgeworICAgICAgICAgIHByb2MucHJvY2VzcyhpdGVtMik7CisgICAgICAgIH0gZWxzZSBpZiAoISBub2RlTmFtZS5zdGFydHNXaXRoKCIjIikpeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBwcm9jZXNzb3IgZm91bmQgZm9yICIgKyBub2RlTmFtZSk7CisgICAgICAgIH0KKy8vICAgICAgICBpZiAoInBhcmFtZXRlciIuZXF1YWxzKGl0ZW0yLmdldE5vZGVOYW1lKCkpKSB7CisvLyAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgaXRlbTI7CisvLyAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChlLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKSk7CisvLyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxOb2RlPiBmaW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgeworICAgIExpc3Q8Tm9kZT4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIE5vZGUgbiA9IGNoaWxkcmVuLml0ZW0oaSk7CisgICAgICBpZiAobmFtZS5lcXVhbHMobi5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICByZXN1bHQuYWRkKG4pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcG9wdWxhdGVUZXN0KFhtbFRlc3QgeG1sVGVzdCwgTm9kZSBpdGVtKSB7CisgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0ZXN0UGFyYW1ldGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIHBvcHVsYXRlQXR0cmlidXRlcyhpdGVtLCB4bWxUZXN0KTsKKyAgICBOb2RlTGlzdCBpdGVtQ2hpbGRyZW4gPSBpdGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGl0ZW1DaGlsZHJlbi5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICBOb2RlIGl0ZW0yID0gaXRlbUNoaWxkcmVuLml0ZW0oayk7CisgICAgICBpZiAoInBhcmFtZXRlciIuZXF1YWxzKGl0ZW0yLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSBpdGVtMjsKKyAgICAgICAgdGVzdFBhcmFtZXRlcnMucHV0KGUuZ2V0QXR0cmlidXRlKCJuYW1lIiksIGUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKTsKKyAgICAgIH0gZWxzZSBpZiAoImNsYXNzZXMiLmVxdWFscyhpdGVtMi5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICBOb2RlTGlzdCBpdGVtMkNoaWxkcmVuID0gaXRlbTIuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGl0ZW0yQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGwrKykgeworICAgICAgICAgIE5vZGUgaXRlbTQgPSBpdGVtMkNoaWxkcmVuLml0ZW0obCk7CisgICAgICAgICAgaWYgKCJjbGFzcyIuZXF1YWxzKGl0ZW00LmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICBYbWxDbGFzcyB4bWxDbGFzcyA9IG5ldyBYbWxDbGFzcygpOworICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGl0ZW00LCB4bWxDbGFzcyk7CisgICAgICAgICAgICB4bWxUZXN0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3MpOworCisgICAgICAgICAgICAvLyBUT0RPOiBleGNsdWRlZC9pbmNsdWRlZCBtZXRob2RzCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCJncm91cHMiLmVxdWFscyhpdGVtMi5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICBOb2RlTGlzdCBpdGVtMkNoaWxkcmVuID0gaXRlbTIuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBMaXN0PFN0cmluZz4gaW5jbHVkZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaXRlbTJDaGlsZHJlbi5nZXRMZW5ndGgoKTsgbCsrKSB7CisgICAgICAgICAgTm9kZSBpdGVtMyA9IGl0ZW0yQ2hpbGRyZW4uaXRlbShsKTsKKyAgICAgICAgICBpZiAoInJ1biIuZXF1YWxzKGl0ZW0zLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICBOb2RlTGlzdCBpdGVtM0NoaWxkcmVuID0gaXRlbTMuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBpdGVtM0NoaWxkcmVuLmdldExlbmd0aCgpOyBtKyspIHsKKyAgICAgICAgICAgICAgTm9kZSBpdGVtNCA9IGl0ZW0zQ2hpbGRyZW4uaXRlbShtKTsKKyAgICAgICAgICAgICAgaWYgKCJpbmNsdWRlIi5lcXVhbHMoaXRlbTQuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBpbmNsdWRlcy5hZGQoKChFbGVtZW50KSBpdGVtNCkuZ2V0QXR0cmlidXRlKCJuYW1lIikpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJleGNsdWRlIi5lcXVhbHMoaXRlbTQuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBleGNsdWRlcy5hZGQoKChFbGVtZW50KSBpdGVtNCkuZ2V0QXR0cmlidXRlKCJuYW1lIikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICgiZGVwZW5kZW5jaWVzIi5lcXVhbHMoaXRlbTMuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0IGl0ZW0zQ2hpbGRyZW4gPSBpdGVtMy5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IGl0ZW0zQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IG0rKykgeworICAgICAgICAgICAgICBOb2RlIGl0ZW00ID0gaXRlbTNDaGlsZHJlbi5pdGVtKG0pOworICAgICAgICAgICAgICBpZiAoImdyb3VwIi5lcXVhbHMoaXRlbTQuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgaXRlbTQ7CisgICAgICAgICAgICAgICAgeG1sVGVzdC5hZGRYbWxEZXBlbmRlbmN5R3JvdXAoZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZS5nZXRBdHRyaWJ1dGUoImRlcGVuZHMtb24iKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKCJkZWZpbmUiLmVxdWFscyhpdGVtMy5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICAgICAgeG1sRGVmaW5lKHhtbFRlc3QsIGl0ZW0zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeG1sVGVzdC5zZXRJbmNsdWRlZEdyb3VwcyhpbmNsdWRlcyk7CisgICAgICAgIHhtbFRlc3Quc2V0RXhjbHVkZWRHcm91cHMoZXhjbHVkZXMpOworICAgICAgfSAvLyBUT0RPOiAobWV0aG9kLXNlbGVjdG9ycz8scGFja2FnZXM/KSA+CisgICAgfQorCisgICAgeG1sVGVzdC5zZXRQYXJhbWV0ZXJzKHRlc3RQYXJhbWV0ZXJzKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSB0aGUgPGRlZmluZT4gdGFnLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHhtbERlZmluZShYbWxUZXN0IHhtbFRlc3QsIE5vZGUgaXRlbSkgeworICAgIE5vZGVMaXN0IGl0ZW0zQ2hpbGRyZW4gPSBpdGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICBMaXN0PFN0cmluZz4gZ3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBpdGVtM0NoaWxkcmVuLmdldExlbmd0aCgpOyBtKyspIHsKKyAgICAgIE5vZGUgaXRlbTQgPSBpdGVtM0NoaWxkcmVuLml0ZW0obSk7CisgICAgICBpZiAoImluY2x1ZGUiLmVxdWFscyhpdGVtNC5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudCkgaXRlbTQ7CisgICAgICAgIGdyb3Vwcy5hZGQoZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7CisgICAgICB9CisgICAgfQorICAgIHhtbFRlc3QuYWRkTWV0YUdyb3VwKCgoRWxlbWVudCkgaXRlbSkuZ2V0QXR0cmlidXRlKCJuYW1lIiksIGdyb3Vwcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgTm9kZSBpdGVtID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuaXRlbShqKTsKKyAgICAgIHAobm9kZS5nZXRBdHRyaWJ1dGVzKCkuaXRlbShqKS50b1N0cmluZygpKTsKKyAgICAgIHNldFByb3BlcnR5KG9iamVjdCwgaXRlbS5nZXRMb2NhbE5hbWUoKSwgaXRlbS5nZXROb2RlVmFsdWUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHRvQ2FtZWxDYXNlU2V0dGVyKG5hbWUpOworICAgIE1ldGhvZCBmb3VuZE1ldGhvZCA9IG51bGw7CisgICAgZm9yIChNZXRob2QgbSA6IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgIGZvdW5kTWV0aG9kID0gbTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kTWV0aG9kID09IG51bGwpIHsKKyAgICAgIHAoIldhcm5pbmc6IGNvdWxkbid0IGZpbmQgc2V0dGVyIG1ldGhvZCAiICsgbWV0aG9kTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHAoIkludm9raW5nICIgKyBtZXRob2ROYW1lICsgIiB3aXRoICIgKyB2YWx1ZSk7CisgICAgICAgIENsYXNzPD8+IHR5cGUgPSBmb3VuZE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdOworICAgICAgICBpZiAodHlwZSA9PSBCb29sZWFuLmNsYXNzIHx8IHR5cGUgPT0gYm9vbGVhbi5jbGFzcykgeworICAgICAgICAgIGZvdW5kTWV0aG9kLmludm9rZShvYmplY3QsIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEludGVnZXIuY2xhc3MgfHwgdHlwZSA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICBmb3VuZE1ldGhvZC5pbnZva2Uob2JqZWN0LCBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3VuZE1ldGhvZC5pbnZva2Uob2JqZWN0LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBwKFN0cmluZyBzdHJpbmcpIHsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1hQYXRoVXRpbF0gIiArIHN0cmluZyk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyB0b0NhbWVsQ2FzZVNldHRlcihTdHJpbmcgbmFtZSkgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoInNldCIgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgICAgaWYgKG5hbWUuY2hhckF0KGkpID09ICctJykgeworICAgICAgICByZXN1bHQuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShuYW1lLmNoYXJBdChpICsgMSkpKTsKKyAgICAgICAgaSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChuYW1lLmNoYXJBdChpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vRG9tWG1sUGFyc2VyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9Eb21YbWxQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjUxM2VmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vRG9tWG1sUGFyc2VyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbC5kb207CisKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5JU3VpdGVQYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWE1MUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIERvbVhtbFBhcnNlciBleHRlbmRzIFhNTFBhcnNlcjxYbWxTdWl0ZT4gaW1wbGVtZW50cyBJU3VpdGVQYXJzZXIgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFhtbFN1aXRlIHBhcnNlKFN0cmluZyBjdXJyZW50RmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGJvb2xlYW4gbG9hZENsYXNzZXMpIHsKKyAgICBYbWxTdWl0ZSByZXN1bHQgPSBudWxsOworICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBwYXJzZTIoY3VycmVudEZpbGUsIGlucHV0U3RyZWFtLCBsb2FkQ2xhc3Nlcyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgcmV0dXJuIGZpbGVOYW1lLmVuZHNXaXRoKCIueG1sIik7CisgIH0KKworICBwdWJsaWMgWG1sU3VpdGUgcGFyc2UyKFN0cmluZyBjdXJyZW50RmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCisgICAgICBib29sZWFuIGxvYWRDbGFzc2VzKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAorICAgICAgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7IC8vIG5ldmVyIGZvcmdldCB0aGlzIQorICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGlucHV0U3RyZWFtKTsKKworICAgIERvbVV0aWwgeHB1ID0gbmV3IERvbVV0aWwoZG9jKTsKKyAgICBYbWxTdWl0ZSByZXN1bHQgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICB4cHUucG9wdWxhdGUocmVzdWx0KTsKKy8vICAgIFhQYXRoRmFjdG9yeSB4cGF0aEZhY3RvcnkgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKy8vICAgIFhQYXRoIHhwYXRoID0geHBhdGhGYWN0b3J5Lm5ld1hQYXRoKCk7CisvLworLy8gICAgeworLy8gICAgICBYUGF0aEV4cHJlc3Npb24gZXhwciA9IHhwYXRoLmNvbXBpbGUoIi8vc3VpdGUiKTsKKy8vICAgICAgT2JqZWN0IHJlc3VsdCA9IGV4cHIuZXZhbHVhdGUoZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFU0VUKTsKKy8vICAgICAgTm9kZUxpc3Qgbm9kZXMgPSAoTm9kZUxpc3QpIHJlc3VsdDsKKy8vICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisvLyAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKKy8vICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpOyBqKyspIHsKKy8vICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihub2RlLmdldEF0dHJpYnV0ZXMoKS5pdGVtKGopKTsKKy8vICAgICAgICB9CisvLyAgICAgIH0KKy8vICAgIH0KKworLy8gICAgeworLy8gICAgICBYUGF0aEV4cHJlc3Npb24gZXhwciA9IHhwYXRoLmNvbXBpbGUoIi8vc3VpdGUvQG5hbWUiKTsKKy8vICAgICAgT2JqZWN0IHJlc3VsdCA9IGV4cHIuZXZhbHVhdGUoZG9jLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5BTUU6IiArIHJlc3VsdCk7CisvLyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC50b1htbCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9JVGFnRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vSVRhZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRiZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vSVRhZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitwdWJsaWMgaW50ZXJmYWNlIElUYWdGYWN0b3J5IHsKKworICBDbGFzczw/PiBnZXRDbGFzc0ZvclRhZyhTdHJpbmcgdGFnKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL0lUYWdTZXR0ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL0lUYWdTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWJkMDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vSVRhZ1NldHRlci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbC5kb207CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitwdWJsaWMgaW50ZXJmYWNlIElUYWdTZXR0ZXI8VD4geworICB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBUIHBhcmVudCwgTm9kZSBub2RlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL09uRWxlbWVudC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vT25FbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiNzE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL09uRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtNRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgT25FbGVtZW50IHsKKworICBTdHJpbmcgdGFnKCk7CisKKyAgU3RyaW5nW10gYXR0cmlidXRlcygpOworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9PbkVsZW1lbnRMaXN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9PbkVsZW1lbnRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMTYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL09uRWxlbWVudExpc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sLmRvbTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7TUVUSE9EfSkKK3B1YmxpYyBAaW50ZXJmYWNlIE9uRWxlbWVudExpc3QgeworCisgIFN0cmluZyB0YWcoKTsKKworICBTdHJpbmdbXSBhdHRyaWJ1dGVzKCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1BhcmVudFNldHRlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vUGFyZW50U2V0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzNjkwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1BhcmVudFNldHRlci5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtNRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgUGFyZW50U2V0dGVyIHsKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1JlZmxlY3QuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1JlZmxlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjcxYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vUmVmbGVjdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmNvbGxlY3Rpb25zLlBhaXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgUmVmbGVjdCB7CisgIHB1YmxpYyBzdGF0aWMgTGlzdDxQYWlyPE1ldGhvZCwgV3JhcHBlcj4+IGZpbmRNZXRob2RzV2l0aEFubm90YXRpb24oCisgICAgICBDbGFzczw/PiBjLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYWMsIE9iamVjdCBiZWFuKSB7CisgICAgTGlzdDxQYWlyPE1ldGhvZCwgV3JhcHBlcj4+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoTWV0aG9kIG0gOiBjLmdldE1ldGhvZHMoKSkgeworICAgICAgQW5ub3RhdGlvbiBhID0gbS5nZXRBbm5vdGF0aW9uKGFjKTsKKyAgICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgICAgcmVzdWx0LmFkZChQYWlyLm9mKG0sIG5ldyBXcmFwcGVyKGEsIGJlYW4pKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFBhaXI8TWV0aG9kLCBXcmFwcGVyPiBmaW5kU2V0dGVyRm9yVGFnKAorICAgICAgQ2xhc3M8Pz4gYywgU3RyaW5nIHRhZ05hbWUsIE9iamVjdCBiZWFuKSB7CisKKyAgICAvLyBUcnkgdG8gZmluZCBhbiBhbm5vdGF0aW9uCisgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGFubm90YXRpb25zID0KKyAgICAgICAgQXJyYXlzLmFzTGlzdChPbkVsZW1lbnQuY2xhc3MsIE9uRWxlbWVudExpc3QuY2xhc3MsIFRhZy5jbGFzcyk7CisgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgIExpc3Q8UGFpcjxNZXRob2QsIFdyYXBwZXI+PiBtZXRob2RzCisgICAgICAgICAgPSBmaW5kTWV0aG9kc1dpdGhBbm5vdGF0aW9uKGMsIGFubm90YXRpb25DbGFzcywgYmVhbik7CisgIAorICAgICAgZm9yIChQYWlyPE1ldGhvZCwgV3JhcHBlcj4gcGFpciA6IG1ldGhvZHMpIHsKKyAgICAgICAgaWYgKHBhaXIuc2Vjb25kKCkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgIHJldHVybiBwYWlyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gdHJ5IGZvIGZpbmQgYW4gYWRkZXIgb3IgYSBzZXR0ZXIKKyAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBuZXcgU3RyaW5nW10geyAiYWRkIiwgInNldCIgfSkgeworICAgICAgZm9yIChNZXRob2QgbSA6IGMuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSB0b0NhbWVsQ2FzZSh0YWdOYW1lLCBwcmVmaXgpOworICAgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgcmV0dXJuIFBhaXIub2YobSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0NhbWVsQ2FzZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkgeworICAgIHJldHVybiBwcmVmaXggKyB0b0NhcGl0YWxpemVkQ2FtZWxDYXNlKG5hbWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9DYXBpdGFsaXplZENhbWVsQ2FzZShTdHJpbmcgbmFtZSkgeworICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIobmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGlmIChuYW1lLmNoYXJBdChpKSA9PSAnLScpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UobmFtZS5jaGFyQXQoaSArIDEpKSk7CisgICAgICAgIGkrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobmFtZS5jaGFyQXQoaSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vVGFnLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9UYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2E2OGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vVGFnLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbC5kb207CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe01FVEhPRH0pCitwdWJsaWMgQGludGVyZmFjZSBUYWcgeworCisgIFN0cmluZyBuYW1lKCk7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1RhZ0NvbnRlbnQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1RhZ0NvbnRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmUwMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vVGFnQ29udGVudC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtNRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgVGFnQ29udGVudCB7CisKKyAgU3RyaW5nIG5hbWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vVGVzdE5HVGFnRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vVGVzdE5HVGFnRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDNmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9UZXN0TkdUYWdGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbC5kb207CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworCitwdWJsaWMgY2xhc3MgVGVzdE5HVGFnRmFjdG9yeSBpbXBsZW1lbnRzIElUYWdGYWN0b3J5IHsKKworICBwcml2YXRlIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtX21hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIHB1YmxpYyBUZXN0TkdUYWdGYWN0b3J5KCkgeworLy8gICAgbV9tYXAucHV0KCJzdWl0ZS1maWxlcyIsIFhEb20uQ2hpbGRTdWl0ZS5jbGFzcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENsYXNzPD8+IGdldENsYXNzRm9yVGFnKFN0cmluZyB0YWcpIHsKKyAgICBDbGFzczw/PiByZXN1bHQgPSBtX21hcC5nZXQodGFnKTsKKyAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAib3JnLnRlc3RuZy54bWwuWG1sIiArIFJlZmxlY3QudG9DYXBpdGFsaXplZENhbWVsQ2FzZSh0YWcpOworICAgICAgdHJ5IHsKKyAgICAgICAgcmVzdWx0ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3QgZmluZCBjbGFzcyAiICsgY2xhc3NOYW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1dyYXBwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTVmYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvdGVzdG5nL3htbC9kb20vV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy54bWwuZG9tOworCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFdyYXBwZXIgeworCisgIHByaXZhdGUgT25FbGVtZW50IG1fb25FbGVtZW50OworICBwcml2YXRlIE9uRWxlbWVudExpc3QgbV9vbkVsZW1lbnRMaXN0OworICBwcml2YXRlIFRhZyBtX3RhZzsKKyAgcHJpdmF0ZSBUYWdDb250ZW50IG1fdGFnQ29udGVudDsKKyAgcHJpdmF0ZSBPYmplY3QgbV9iZWFuOworCisgIHB1YmxpYyBXcmFwcGVyKEFubm90YXRpb24gYSwgT2JqZWN0IGJlYW4pIHsKKyAgICBtX2JlYW4gPSBiZWFuOworICAgIGlmIChhIGluc3RhbmNlb2YgT25FbGVtZW50KSBtX29uRWxlbWVudCA9IChPbkVsZW1lbnQpIGE7CisgICAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE9uRWxlbWVudExpc3QpIG1fb25FbGVtZW50TGlzdCA9IChPbkVsZW1lbnRMaXN0KSBhOworICAgIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBUYWcpIG1fdGFnID0gKFRhZykgYTsKKyAgICBlbHNlIGlmIChhIGluc3RhbmNlb2YgVGFnQ29udGVudCkgbV90YWdDb250ZW50ID0gKFRhZ0NvbnRlbnQpIGE7CisgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSWxsZWdhbCBhbm5vdGF0aW9uICIgKyBhKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKKyAgICBpZiAobV9vbkVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIG1fb25FbGVtZW50LnRhZygpOworICAgIGVsc2UgaWYgKG1fb25FbGVtZW50TGlzdCAhPSBudWxsKSByZXR1cm4gbV9vbkVsZW1lbnRMaXN0LnRhZygpOworICAgIGVsc2UgcmV0dXJuIG1fdGFnLm5hbWUoKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PE9iamVjdFtdPiBnZXRQYXJhbWV0ZXJzKEVsZW1lbnQgZWxlbWVudCkgeworICAgIExpc3Q8T2JqZWN0W10+IGFsbFBhcmFtZXRlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBpZiAobV9vbkVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChTdHJpbmcgYXR0cmlidXRlTmFtZSA6IG1fb25FbGVtZW50LmF0dHJpYnV0ZXMoKSkgeworICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKTsKKyAgICAgIH0KKyAgICAgIGFsbFBhcmFtZXRlcnMuYWRkKHJlc3VsdC50b0FycmF5KCkpOworICAgIH0gZWxzZSBpZiAobV90YWcgIT0gbnVsbCkgeworICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgcmVzdWx0LmFkZChtX2JlYW4pOworICAgICAgYWxsUGFyYW1ldGVycy5hZGQocmVzdWx0LnRvQXJyYXkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGlmIChjaGlsZE5vZGVzLml0ZW0oaSkuaGFzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgRWxlbWVudCBpdGVtID0gKEVsZW1lbnQpIGNoaWxkTm9kZXMuaXRlbShpKTsKKyAgICAgICAgICBMaXN0PE9iamVjdD4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgZm9yIChTdHJpbmcgYXR0cmlidXRlTmFtZSA6IG1fb25FbGVtZW50TGlzdC5hdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoaXRlbS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBhbGxQYXJhbWV0ZXJzLmFkZChyZXN1bHQudG9BcnJheSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhbGxQYXJhbWV0ZXJzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9YRG9tLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0bmcveG1sL2RvbS9YRG9tLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL3Rlc3RuZy94bWwvZG9tL1hEb20uamF2YQpAQCAtMCwwICsxLDM3MSBAQAorcGFja2FnZSBvcmcudGVzdG5nLnhtbC5kb207CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RNdWx0aU1hcDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmNvbGxlY3Rpb25zLlBhaXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sRGVmaW5lOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxNZXRob2RTZWxlY3RvcjsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFhEb20geworLy8gIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBtX21hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICBwcml2YXRlIERvY3VtZW50IG1fZG9jdW1lbnQ7CisgIHByaXZhdGUgSVRhZ0ZhY3RvcnkgbV90YWdGYWN0b3J5OworCisgIHB1YmxpYyBYRG9tKElUYWdGYWN0b3J5IHRhZ0ZhY3RvcnksIERvY3VtZW50IGRvY3VtZW50KQorICAgICAgdGhyb3dzIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiwKKyAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgIG1fdGFnRmFjdG9yeSA9IHRhZ0ZhY3Rvcnk7CisgICAgbV9kb2N1bWVudCA9IGRvY3VtZW50OworICB9CisKKyAgcHVibGljIE9iamVjdCBwYXJzZSgpIHRocm93cyBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24sCisgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgTm9kZUxpc3Qgbm9kZXMgPSBtX2RvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIE5vZGUgaXRlbSA9IG5vZGVzLml0ZW0oaSk7CisgICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgeworICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBpdGVtLmdldE5vZGVOYW1lKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIG5hbWU6IiArIG5vZGVOYW1lKTsKKyAgICAgICAgQ2xhc3M8Pz4gYyA9IG1fdGFnRmFjdG9yeS5nZXRDbGFzc0ZvclRhZyhub2RlTmFtZSk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gY2xhc3MgZm91bmQgZm9yIHRhZyAiICsgbm9kZU5hbWUpOworICAgICAgICB9CisgIAorICAgICAgICByZXN1bHQgPSBjLm5ld0luc3RhbmNlKCk7CisgICAgICAgIHBvcHVsYXRlQXR0cmlidXRlcyhpdGVtLCByZXN1bHQpOworICAgICAgICBpZiAoSVRhZ1NldHRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdC5nZXRDbGFzcygpKSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUQUcgU0VUVEVSIik7CisgICAgICAgIH0KKyAgICAgICAgcG9wdWxhdGVDaGlsZHJlbihpdGVtLCByZXN1bHQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgcG9wdWxhdGVDaGlsZHJlbihOb2RlIHJvb3QsIE9iamVjdCByZXN1bHQpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgIHAoInBvcHVsYXRlQ2hpbGRyZW46ICIgKyByb290LmdldExvY2FsTmFtZSgpKTsKKyAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisgICAgTGlzdE11bHRpTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbiA9IE1hcHMubmV3TGlzdE11bHRpTWFwKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIE5vZGUgaXRlbSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKKyAgICAgIGlmIChpdGVtLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7CisgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGl0ZW0uZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgaWYgKCJzdWl0ZS1maWxlcyIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQlJFQUsiKTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzPD8+IGMgPSBtX3RhZ0ZhY3RvcnkuZ2V0Q2xhc3NGb3JUYWcobm9kZU5hbWUpOworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBObyBjbGFzcyBmb3VuZCBmb3IgdGFnICIgKyBub2RlTmFtZSk7CisgICAgICAgICAgYm9vbGVhbiBmb3VuZFNldHRlciA9IGludm9rZU9uU2V0dGVyKHJlc3VsdCwgKEVsZW1lbnQpIGl0ZW0sIG5vZGVOYW1lLCBudWxsKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgZm91bmQgc2V0dGVyOiIgKyBmb3VuZFNldHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGluc3RhbnRpYXRlRWxlbWVudChjLCByZXN1bHQpOworICAgICAgICAgIGlmIChJVGFnU2V0dGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0LmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRhZyBzZXR0ZXI6IiAgKyByZXN1bHQpOworICAgICAgICAgICAgKChJVGFnU2V0dGVyKSBvYmplY3QpLnNldFByb3BlcnR5KG5vZGVOYW1lLCByZXN1bHQsIGl0ZW0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGlsZHJlbi5wdXQobm9kZU5hbWUsIG9iamVjdCk7CisgICAgICAgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXMoaXRlbSwgb2JqZWN0KTsKKyAgICAgICAgICAgIHBvcHVsYXRlQ29udGVudChpdGVtLCBvYmplY3QpOworICAgICAgICAgIH0KKyAgICAgICAgICBib29sZWFuIGZvdW5kU2V0dGVyID0gaW52b2tlT25TZXR0ZXIocmVzdWx0LCAoRWxlbWVudCkgaXRlbSwgbm9kZU5hbWUsIG9iamVjdCk7CisvLyAgICAgICAgICBzZXRQcm9wZXJ0eShyZXN1bHQsIG5vZGVOYW1lLCBvYmplY3QpOworICAgICAgICAgIHBvcHVsYXRlQ2hpbGRyZW4oaXRlbSwgb2JqZWN0KTsKKyAgICAgICAgfQorCisvLyAgICAgICAgYm9vbGVhbiBmb3VuZFNldHRlciA9IGludm9rZU9uU2V0dGVyKHJlc3VsdCwgKEVsZW1lbnQpIGl0ZW0sIG5vZGVOYW1lKTsKKy8vICAgICAgICBpZiAoISBmb3VuZFNldHRlcikgeworLy8gICAgICAgICAgYm9vbGVhbiBmb3VuZExpc3RTZXR0ZXIgPSBpbnZva2VPbkxpc3RTZXR0ZXIocmVzdWx0LCBub2RlTmFtZSwgaXRlbSk7CisvLyAgICAgICAgICBpZiAoISBmb3VuZExpc3RTZXR0ZXIpIHsKKy8vICAgICAgICAgIH0KKy8vICAgICAgICB9CisgICAgICB9CisgICAgfQorLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBjaGlsZHJlbjoiICsgY2hpbGRyZW4pOworLy8gICAgZm9yIChTdHJpbmcgcyA6IGNoaWxkcmVuLmdldEtleXMoKSkgeworLy8gICAgICBzZXRDb2xsZWN0aW9uUHJvcGVydHkocmVzdWx0LCBzLCBjaGlsZHJlbi5nZXQocyksIG9iamVjdCk7CisvLyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJ5IHRvIGZpbmQgYSBAUGFyZW50U2V0dGVyLiBJZiB0aGlzIGZhaWxzLCB0cnkgdG8gZmluZCBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIHBhcmVudCBhcyBhIHBhcmFtZXRlci4KKyAgICogSWYgdGhpcyBmYWlscywgdXNlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgKi8KKyAgcHJpdmF0ZSBPYmplY3QgaW5zdGFudGlhdGVFbGVtZW50KENsYXNzPD8+IGMsIE9iamVjdCBwYXJlbnQpCisgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgIE1ldGhvZCBtID0gZmluZE1ldGhvZEFubm90YXRlZFdpdGgoYywgUGFyZW50U2V0dGVyLmNsYXNzKTsKKyAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgIHJlc3VsdCA9IGMubmV3SW5zdGFuY2UoKTsKKyAgICAJbS5pbnZva2UocmVzdWx0LCBwYXJlbnQpOworICAgIH0gZWxzZSB7CisJICAgIHRyeSB7CisJICAgICAgcmVzdWx0ID0gYy5nZXRDb25zdHJ1Y3RvcihwYXJlbnQuZ2V0Q2xhc3MoKSkubmV3SW5zdGFuY2UocGFyZW50KTsKKwkgICAgfSBjYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKwkgICAgICByZXN1bHQgPSBjLm5ld0luc3RhbmNlKCk7CisJICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKy8vICBwcml2YXRlIExpc3Q8UGFpcjxNZXRob2QsID8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4KKy8vICAgICAgZmluZE1ldGhvZHNXaXRoQW5ub3RhdGlvbihDbGFzczw/PiBjLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYWMpIHsKKy8vICAgIExpc3Q8UGFpcjxNZXRob2QsID8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisvLyAgICBmb3IgKE1ldGhvZCBtIDogYy5nZXRNZXRob2RzKCkpIHsKKy8vICAgICAgQW5ub3RhdGlvbiBhID0gbS5nZXRBbm5vdGF0aW9uKGFjKTsKKy8vICAgICAgaWYgKGEgIT0gbnVsbCkgeworLy8gICAgICAgIHJlc3VsdC5hZGQoUGFpci5vZihtLCBhKSk7CisvLyAgICAgIH0KKy8vICAgIH0KKy8vICAgIHJldHVybiByZXN1bHQ7CisvLyAgfQorCisgIHByaXZhdGUgTWV0aG9kIGZpbmRNZXRob2RBbm5vdGF0ZWRXaXRoKENsYXNzPD8+IGMsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7CisJICBmb3IgKE1ldGhvZCBtIDogYy5nZXRNZXRob2RzKCkpIHsKKwkJICBpZiAobS5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pICE9IG51bGwpIHsKKwkJCSAgcmV0dXJuIG07CisJCSAgfQorCSAgfQorCSAgcmV0dXJuIG51bGw7CisgIH0KKworcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29udGVudChOb2RlIGl0ZW0sIE9iamVjdCBvYmplY3QpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0uZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgIE5vZGUgY2hpbGQgPSBpdGVtLmdldENoaWxkTm9kZXMoKS5pdGVtKGkpOworICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgeworICAgICAgICBzZXRUZXh0KG9iamVjdCwgKFRleHQpIGNoaWxkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0VGV4dChPYmplY3QgYmVhbiwgVGV4dCBjaGlsZCkgeworICAgIExpc3Q8UGFpcjxNZXRob2QsIFdyYXBwZXI+PiBwYWlycyA9CisgICAgICAgIFJlZmxlY3QuZmluZE1ldGhvZHNXaXRoQW5ub3RhdGlvbihiZWFuLmdldENsYXNzKCksIFRhZ0NvbnRlbnQuY2xhc3MsIGJlYW4pOworICAgIGZvciAoUGFpcjxNZXRob2QsIFdyYXBwZXI+IHBhaXIgOiBwYWlycykgeworICAgICAgdHJ5IHsKKyAgICAgICAgcGFpci5maXJzdCgpLmludm9rZShiZWFuLCBjaGlsZC5nZXRUZXh0Q29udGVudCgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgRE9NRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaW52b2tlT25TZXR0ZXIoT2JqZWN0IG9iamVjdCwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbm9kZU5hbWUsCisgICAgICBPYmplY3QgYmVhbikgeworICAgIFBhaXI8TWV0aG9kLCBXcmFwcGVyPiBwYWlyID0KKyAgICAgICBSZWZsZWN0LmZpbmRTZXR0ZXJGb3JUYWcob2JqZWN0LmdldENsYXNzKCksIG5vZGVOYW1lLCBiZWFuKTsKKworICAgIExpc3Q8T2JqZWN0W10+IGFsbFBhcmFtZXRlcnMgPSBudWxsOworICAgIGlmIChwYWlyICE9IG51bGwpIHsKKyAgICAgIE1ldGhvZCBtID0gcGFpci5maXJzdCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHBhaXIuc2Vjb25kKCkgIT0gbnVsbCkgeworICAgICAgICAgIGFsbFBhcmFtZXRlcnMgPSBwYWlyLnNlY29uZCgpLmdldFBhcmFtZXRlcnMoZWxlbWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWxsUGFyYW1ldGVycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgIGFsbFBhcmFtZXRlcnMuYWRkKG5ldyBPYmplY3RbXSB7IGJlYW4gfSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE9iamVjdFtdIHAgOiBhbGxQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgbS5pbnZva2Uob2JqZWN0LCBwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyczogIiArIGFsbFBhcmFtZXRlcnMpOworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KSB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgIE5vZGUgaXRlbSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLml0ZW0oaik7CisgICAgICBzZXRQcm9wZXJ0eShvYmplY3QsIGl0ZW0uZ2V0TG9jYWxOYW1lKCksIGl0ZW0uZ2V0Tm9kZVZhbHVlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgUGFpcjxNZXRob2QsIFdyYXBwZXI+IHNldHRlciA9IFJlZmxlY3QuZmluZFNldHRlckZvclRhZyhvYmplY3QuZ2V0Q2xhc3MoKSwgbmFtZSwKKyAgICAgICAgdmFsdWUpOworCisgICAgaWYgKHNldHRlciAhPSBudWxsKSB7CisgICAgICBNZXRob2QgZm91bmRNZXRob2QgPSBzZXR0ZXIuZmlyc3QoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIENsYXNzPD8+IHR5cGUgPSBmb3VuZE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdOworICAgICAgICBpZiAodHlwZSA9PSBCb29sZWFuLmNsYXNzIHx8IHR5cGUgPT0gYm9vbGVhbi5jbGFzcykgeworICAgICAgICAgIGZvdW5kTWV0aG9kLmludm9rZShvYmplY3QsIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEludGVnZXIuY2xhc3MgfHwgdHlwZSA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICBmb3VuZE1ldGhvZC5pbnZva2Uob2JqZWN0LCBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3VuZE1ldGhvZC5pbnZva2Uob2JqZWN0LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZSgiQ291bGRuJ3QgZmluZCBzZXR0ZXIgbWV0aG9kIGZvciBwcm9wZXJ0eSIgKyBuYW1lICsgIiBvbiAiICsgb2JqZWN0LmdldENsYXNzKCkpOworICAgIH0KKyAgfQorCisvLyAgcHJpdmF0ZSBNZXRob2QgZmluZFNldHRlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSkgeworLy8gICAgU3RyaW5nIG1ldGhvZE5hbWUgPSB0b0NhbWVsQ2FzZVNldHRlcihuYW1lKTsKKy8vICAgIE1ldGhvZCBmb3VuZE1ldGhvZCA9IG51bGw7CisvLyAgICBmb3IgKE1ldGhvZCBtIDogb2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKy8vICAgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgeworLy8gICAgICAgIGZvdW5kTWV0aG9kID0gbTsKKy8vICAgICAgICBicmVhazsKKy8vICAgICAgfQorLy8gICAgfQorLy8gICAgcmV0dXJuIGZvdW5kTWV0aG9kOworLy8gIH0KKworICBwcml2YXRlIHZvaWQgcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbWERvbV0gIiArIHN0cmluZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZShTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbWERvbV0gW0Vycm9yXSAiICsgc3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLAorICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKKyAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOyAvLyBuZXZlciBmb3JnZXQgdGhpcyEKKyAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0KKyAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpCisgICAgICAgICAgICArICIvamF2YS90ZXN0bmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1hbGwueG1sIikpOworICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoaW5wdXRTdHJlYW0pOworICAgIFhtbFN1aXRlIHJlc3VsdCA9IChYbWxTdWl0ZSkgbmV3IFhEb20obmV3IFRlc3ROR1RhZ0ZhY3RvcnkoKSwgZG9jKS5wYXJzZSgpOworCisgICAgdGVzdChyZXN1bHQpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQudG9YbWwoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QoWG1sU3VpdGUgcykgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRlc3RORyIsIHMuZ2V0TmFtZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0RGF0YVByb3ZpZGVyVGhyZWFkQ291bnQoKSwgMyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzLmdldFRocmVhZENvdW50KCksIDIpOworCisgICAgeworICAgICAgLy8gbWV0aG9kLXNlbGVjdG9ycworICAgICAgTGlzdDxYbWxNZXRob2RTZWxlY3Rvcj4gc2VsZWN0b3JzID0gcy5nZXRNZXRob2RTZWxlY3RvcnMoKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2VsZWN0b3JzLnNpemUoKSwgMik7CisgICAgICBYbWxNZXRob2RTZWxlY3RvciBzMSA9IHNlbGVjdG9ycy5nZXQoMCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMxLmdldExhbmd1YWdlKCksICJqYXZhc2NyaXB0Iik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMxLmdldEV4cHJlc3Npb24oKSwgImZvbygpIik7CisgICAgICBYbWxNZXRob2RTZWxlY3RvciBzMiA9IHNlbGVjdG9ycy5nZXQoMSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMyLmdldENsYXNzTmFtZSgpLCAiU2VsZWN0b3JDbGFzcyIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzMi5nZXRQcmlvcml0eSgpLCAzKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBjaGlsZC1zdWl0ZXMKKyAgICAgIExpc3Q8U3RyaW5nPiBzdWl0ZUZpbGVzID0gcy5nZXRTdWl0ZUZpbGVzKCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN1aXRlRmlsZXMsIEFycmF5cy5hc0xpc3QoIi4vanVuaXQtc3VpdGUueG1sIikpOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIHBhcmFtZXRlcnMKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IHMuZ2V0UGFyYW1ldGVycygpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwLnNpemUoKSwgMik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHAuZ2V0KCJzdWl0ZVBhcmFtZXRlciIpLCAic3VpdGVQYXJhbWV0ZXJWYWx1ZSIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwLmdldCgiZmlyc3QtbmFtZSIpLCAiQ2VkcmljIik7CisgICAgfQorCisgICAgeworICAgICAgLy8gcnVuCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0SW5jbHVkZWRHcm91cHMoKSwgQXJyYXlzLmFzTGlzdCgiaW5jbHVkZVRoaXNHcm91cCIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRFeGNsdWRlZEdyb3VwcygpLCBBcnJheXMuYXNMaXN0KCJleGNsdWRlVGhpc0dyb3VwIikpOworICAgICAgWG1sR3JvdXBzIGdyb3VwcyA9IHMuZ2V0R3JvdXBzKCk7CisKKyAgICAgIC8vIGRlZmluZQorICAgICAgTGlzdDxYbWxEZWZpbmU+IGRlZmluZXMgPSBncm91cHMuZ2V0RGVmaW5lcygpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkZWZpbmVzLnNpemUoKSwgMSk7CisgICAgICBYbWxEZWZpbmUgZGVmaW5lID0gZGVmaW5lcy5nZXQoMCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRlZmluZS5nZXROYW1lKCksICJiaWdTdWl0ZSIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkZWZpbmUuZ2V0SW5jbHVkZXMoKSwgQXJyYXlzLmFzTGlzdCgic3VpdGUxIiwgInN1aXRlMiIpKTsKKworICAgICAgLy8gcGFja2FnZXMKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRQYWNrYWdlTmFtZXMoKSwgQXJyYXlzLmFzTGlzdCgiY29tLmV4YW1wbGUxIiwgImNvbS5leGFtcGxlMiIpKTsKKworICAgICAgLy8gbGlzdGVuZXJzCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMuZ2V0TGlzdGVuZXJzKCksCisgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiY29tLmJldXN0Lkxpc3RlbmVyMSIsICJjb20uYmV1c3QuTGlzdGVuZXIyIikpOworICAgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgICAvLyBvbmx5IGRlZmluZWQgb24gdGVzdCBmb3Igbm93CisgICAgfQorCisgICAgeworICAgICAgLy8gdGVzdHMKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocy5nZXRUZXN0cygpLnNpemUoKSwgMyk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuZ2V0VGVzdHMoKS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIk5vcGFja2FnZSIuZXF1YWxzKHMuZ2V0VGVzdHMoKS5nZXQoaSkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgIHRlc3ROb1BhY2thZ2Uocy5nZXRUZXN0cygpLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROb1BhY2thZ2UoWG1sVGVzdCB0KSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0LmdldFRocmVhZENvdW50KCksIDQyKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0LmdldEFsbG93UmV0dXJuVmFsdWVzKCkpOworCisgICAgLy8gZGVmaW5lCisgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtZXRhR3JvdXBzID0gdC5nZXRNZXRhR3JvdXBzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXRhR3JvdXBzLmdldCgiZXZlbm9kZCIpLCBBcnJheXMuYXNMaXN0KCJldmVuIiwgIm9kZCIpKTsKKworICAgIC8vIHJ1bgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHModC5nZXRJbmNsdWRlZEdyb3VwcygpLCBBcnJheXMuYXNMaXN0KCJub3BhY2thZ2UiLCAiaW5jbHVkZVRoaXNHcm91cCIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQuZ2V0RXhjbHVkZWRHcm91cHMoKSwgQXJyYXlzLmFzTGlzdCgiZXhjbHVkZVRoaXNHcm91cCIpKTsKKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZGcgPSB0LmdldFhtbERlcGVuZGVuY3lHcm91cHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRnLnNpemUoKSwgMik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkZy5nZXQoImUiKSwgImYiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRnLmdldCgiZyIpLCAiaCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL3Rlc3RuZy0xLjAuZHRkLmh0bWwgYi9zcmMvbWFpbi9qYXZhL3Rlc3RuZy0xLjAuZHRkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4NzNhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvdGVzdG5nLTEuMC5kdGQuaHRtbApAQCAtMCwwICsxLDIwNiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICA8dGl0bGU+RFREIGZvciBUZXN0TkcgMS4wPC90aXRsZT4KKyAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYmV1c3QuY29tL2JldXN0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KKyAgICA8L2hlYWQ+Cis8Ym9keT4KKworPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tCisKK0hlcmUgaXMgYSBxdWljayBvdmVydmlldyBvZiB0aGUgbWFpbiBwYXJ0cyBvZiB0aGlzIERURC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLAorcmVmZXIgdG8gdGhlICZsdDthIDxzcGFuIGNsYXNzPSJhdHRyaWJ1dGUiPmhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnIjwvc3Bhbj4gJmd0O21haW4gd2ViIHNpdGU8c3BhbiBjbGFzcz0idGFnIj4mbHQ7L2EmZ3Q7LgorCis8L3NwYW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitBIDxzcGFuIGNsYXNzPSJ0YWciPiZsdDtiJmd0O3N1aXRlJmx0Oy9iJmd0Ozwvc3Bhbj4gaXMgbWFkZSBvZiA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7YiZndDt0ZXN0cyZsdDsvYiZndDs8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7YiZndDtwYXJhbWV0ZXJzJmx0Oy9iJmd0Oy4KKzwvc3Bhbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworQSA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7YiZndDt0ZXN0Jmx0Oy9iJmd0Ozwvc3Bhbj4gaXMgbWFkZSBvZiB0aHJlZSBwYXJ0czogICAgICAgICAgICAgICAgICAgICAgICAKKworPHNwYW4gY2xhc3M9InRhZyI+Jmx0O3VsJmd0OworJmx0O2xpJmd0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9InRhZyI+Jmx0O2ImZ3Q7cGFyYW1ldGVycyZsdDsvYiZndDssPC9zcGFuPiB3aGljaCBvdmVycmlkZSB0aGUgc3VpdGUgcGFyYW1ldGVycyAgICAgCis8c3BhbiBjbGFzcz0idGFnIj4mbHQ7bGkmZ3Q7PC9zcGFuPiA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7YiZndDtncm91cHMmbHQ7L2ImZ3Q7LDwvc3Bhbj4gbWFkZSBvZiB0d28gcGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworPHNwYW4gY2xhc3M9InRhZyI+Jmx0O2xpJmd0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9InRhZyI+Jmx0O2ImZ3Q7Y2xhc3NlcyZsdDsvYiZndDssPC9zcGFuPiBkZWZpbmluZyB3aGljaCBjbGFzc2VzIGFyZSBnb2luZyB0byBiZSBwYXJ0CisgIG9mIHRoaXMgdGVzdCBydW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxzcGFuIGNsYXNzPSJ0YWciPiZsdDsvdWwmZ3Q7Cis8L3NwYW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitJbiB0dXJuLCA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7YiZndDtncm91cHMmbHQ7L2ImZ3Q7PC9zcGFuPiBhcmUgbWFkZSBvZiB0d28gcGFydHM6ICAgICAgICAgICAgICAgIAorCis8c3BhbiBjbGFzcz0idGFnIj4mbHQ7dWwmZ3Q7CismbHQ7bGkmZ3Q7PC9zcGFuPiBEZWZpbml0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIGdyb3VwIGdyb3VwcyBpbnRvICAgCisgIGJpZ2dlciBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxzcGFuIGNsYXNzPSJ0YWciPiZsdDtsaSZndDs8L3NwYW4+IFJ1bnMsIHdoaWNoIGRlZmluZXMgdGhlIGdyb3VwcyB0aGF0IHRoZSBtZXRob2RzICAgICAKKyAgbXVzdCBiZWxvbmcgdG8gaW4gb3JkZXIgdG8gYmUgcnVuIGR1cmluZyB0aGlzIHRlc3QgIAorPHNwYW4gY2xhc3M9InRhZyI+Jmx0Oy91bCZndDsKKzwvc3Bhbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0NlZHJpYyBCZXVzdCAmIEFsZXhhbmRydSBQb3Blc2N1ICAgICAgICAgICAgICAgICAgICAgIAorQHRpdGxlIERURCBmb3IgVGVzdE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitAcm9vdCBzdWl0ZQorCistLSZndDs8L3NwYW4+CisKKworPHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tIEEgc3VpdGUgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGEgdGVzdG5nLnhtbCBmaWxlICAgICAgICAgICAgICAgICAgLS0mZ3Q7PC9zcGFuPgorCismbHQ7IUVMRU1FTlQgc3VpdGUgKGxpc3RlbmVyc3xwYWNrYWdlc3x0ZXN0fHBhcmFtZXRlcnxtZXRob2Qtc2VsZWN0b3JzfHN1aXRlLWZpbGVzKSogJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gQXR0cmlidXRlczogLS0mZ3Q7PC9zcGFuPgorPHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tCitAYXR0ciAgbmFtZSAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBzdWl0ZSAoYXMgaXQgd2lsbCBhcHBlYXIgaW4gdGhlIHJlcG9ydHMpCitAYXR0ciAganVuaXQgICAgICAgV2hldGhlciB0byBydW4gaW4gSlVuaXQgbW9kZS4KK0BhdHRyICB2ZXJib3NlICAgICBIb3cgdmVyYm9zZSB0aGUgb3V0cHV0IG9uIHRoZSBjb25zb2xlIHdpbGwgYmUuICAKKyAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgaGFzIG5vIGltcGFjdCBvbiB0aGUgSFRNTCByZXBvcnRzLgorQGF0dHIgIHBhcmFsbGVsICAgV2hldGhlciBUZXN0Tkcgc2hvdWxkIHVzZSBkaWZmZXJlbnQgdGhyZWFkcworICAgICAgICAgICAgICAgIHRvIHJ1biB5b3VyIHRlc3RzIChtaWdodCBzcGVlZCB1cCB0aGUgcHJvY2VzcykKK0BhdHRyICBjb25maWdmYWlsdXJlcG9saWN5ICBXaGV0aGVyIHRvIGNvbnRpbnVlIGF0dGVtcHRpbmcgQmVmb3JlL0FmdGVyCisgICAgICAgICAgICAgICAgQ2xhc3MvTWV0aG9kcyBhZnRlciB0aGV5J3ZlIGZhaWxlZCBvbmNlIG9yIGp1c3Qgc2tpcCByZW1haW5pbmcuCitAYXR0ciAgdGhyZWFkLWNvdW50IEFuIGludGVnZXIgZ2l2aW5nIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB0byB1c2UKKyAgICAgICAgICAgICAgICBpZiB5b3Ugc2V0IHBhcmFsbGVsLgorQGF0dHIgIGFubm90YXRpb25zICBJZiAiamF2YWRvYyIsIFRlc3RORyB3aWxsIGxvb2sgZm9yCisgICAgICAgICAgICAgICAgSmF2YURvYyBhbm5vdGF0aW9ucyBpbiB5b3VyIHNvdXJjZXMsIG90aGVyd2lzZSBpdCB3aWxsCisgICAgICAgICAgICAgICAgdXNlIEpESzUgYW5ub3RhdGlvbnMuCitAYXR0ciAgdGltZS1vdXQgICAgIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhYm9ydGluZyB0aGUKKyAgICAgICAgICAgICAgICBtZXRob2QgKGlmIDxzcGFuIGNsYXNzPSJhdHRyaWJ1dGUiPnBhcmFsbGVsPSJtZXRob2RzIjwvc3Bhbj4gKSBvciB0aGUgdGVzdCAocGFyYWxsZWw9InRlc3RzIikKK0BhdHRyICBza2lwZmFpbGVkaW52b2NhdGlvbkNvdW50cyBXaGV0aGVyIHRvIHNraXAgZmFpbGVkIGludm9jYXRpb25zLgorQGF0dHIgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50IEFuIGludGVnZXIgZ2l2aW5nIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB0byB1c2UKKyAgICAgICBmb3IgcGFyYWxsZWwgZGF0YSBwcm92aWRlcnMuCitAYXR0ciAgb2JqZWN0LWZhY3RvcnkgQSBjbGFzcyB0aGF0IGltcGxlbWVudHMgSU9iamVjdEZhY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgICBpbnN0YW50aWF0ZSB0aGUgdGVzdCBvYmplY3RzLgorLS0mZ3Q7PC9zcGFuPgorJmx0OyFBVFRMSVNUIHN1aXRlIAorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVECisgICAganVuaXQgKHRydWUgfCBmYWxzZSkgImZhbHNlIgorICAgIHZlcmJvc2UgQ0RBVEEgI0lNUExJRUQKKyAgICBwYXJhbGxlbCAoZmFsc2UgfCBtZXRob2RzIHwgdGVzdHMgfCBjbGFzc2VzKSAiZmFsc2UiCisgICAgY29uZmlnZmFpbHVyZXBvbGljeSAoc2tpcCB8IGNvbnRpbnVlKSAic2tpcCIKKyAgICB0aHJlYWQtY291bnQgQ0RBVEEgIjUiCisgICAgYW5ub3RhdGlvbnMgQ0RBVEEgI0lNUExJRUQKKyAgICB0aW1lLW91dCBDREFUQSAjSU1QTElFRAorICAgIHNraXBmYWlsZWRpbnZvY2F0aW9uQ291bnRzICh0cnVlIHwgZmFsc2UpICJmYWxzZSIKKyAgICBkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudCBDREFUQSAiMTAiCisgICAgb2JqZWN0LWZhY3RvcnkgQ0RBVEEgI0lNUExJRUQKKyZndDsKKworPHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tIEEgbGlzdCBvZiBYTUwgZmlsZXMgdGhhdCBjb250YWluIG1vcmUgc3VpdGUgZGVzY3JpcHRpb25zIC0tJmd0Ozwvc3Bhbj4KKyZsdDshRUxFTUVOVCBzdWl0ZS1maWxlcyAoc3VpdGUtZmlsZSkqICZndDsKKworJmx0OyFFTEVNRU5UIHN1aXRlLWZpbGUgQU5ZICZndDsKKyZsdDshQVRUTElTVCBzdWl0ZS1maWxlCisgICAgcGF0aCBDREFUQSAjUkVRVUlSRUQKKyZndDsKKworPHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tCitQYXJhbWV0ZXJzIGNhbiBiZSBkZWZpbmVkIGF0IHRoZSA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7c3VpdGUmZ3Q7PC9zcGFuPiBvciBhdCB0aGUgPHNwYW4gY2xhc3M9InRhZyI+Jmx0O3Rlc3QmZ3Q7PC9zcGFuPiBsZXZlbC4KK1BhcmFtZXRlcnMgZGVmaW5lZCBhdCB0aGUgPHNwYW4gY2xhc3M9InRhZyI+Jmx0O3Rlc3QmZ3Q7PC9zcGFuPiBsZXZlbCBvdmVycmlkZSBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIG5hbWUgaW4gPHNwYW4gY2xhc3M9InRhZyI+Jmx0O3N1aXRlJmd0OworCitQYXJhbWV0ZXJzPC9zcGFuPiBhcmUgdXNlZCB0byBsaW5rIEphdmEgbWV0aG9kIHBhcmFtZXRlcnMgdG8gdGhlaXIgYWN0dWFsIHZhbHVlLCBkZWZpbmVkIGhlcmUuCistLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgcGFyYW1ldGVyIEFOWSZndDsKKyZsdDshQVRUTElTVCBwYXJhbWV0ZXIKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRAorICAgIHZhbHVlIENEQVRBICNSRVFVSVJFRCAmZ3Q7CisKKzxzcGFuIGNsYXNzPSJ4bWwtY29tbWVudCI+Jmx0OyEtLQorTWV0aG9kIHNlbGVjdG9ycyBkZWZpbmUgdXNlciBjbGFzc2VzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1ldGhvZHMgdG8gcnVuLgorVGhleSBuZWVkIHRvIGltcGxlbWVudCA8c3BhbiBjbGFzcz0idGFnIj4mbHQ7dHQmZ3Q7b3JnLnRlc3RuZy5JTWV0aG9kU2VsZWN0b3ImbHQ7L3R0Jmd0Ozwvc3Bhbj4gCistLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgbWV0aG9kLXNlbGVjdG9ycyAobWV0aG9kLXNlbGVjdG9yKikgJmd0OworCismbHQ7IUVMRU1FTlQgbWV0aG9kLXNlbGVjdG9yICgoc2VsZWN0b3ItY2xhc3MpKnxzY3JpcHQpICZndDsKKyZsdDshRUxFTUVOVCBzZWxlY3Rvci1jbGFzcyBBTlkmZ3Q7CismbHQ7IUFUVExJU1Qgc2VsZWN0b3ItY2xhc3MKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRAorICBwcmlvcml0eSBDREFUQSAjSU1QTElFRAorJmd0OworJmx0OyFFTEVNRU5UIHNjcmlwdCBBTlkmZ3Q7CismbHQ7IUFUVExJU1Qgc2NyaXB0CisgICAgbGFuZ3VhZ2UgQ0RBVEEgI1JFUVVJUkVECismZ3Q7CisKKzxzcGFuIGNsYXNzPSJ4bWwtY29tbWVudCI+Jmx0OyEtLQorQSB0ZXN0IGNvbnRhaW5zIHBhcmFtZXRlcnMgYW5kIGNsYXNzZXMuICBBZGRpdGlvbmFsbHksIHlvdSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgZ3JvdXBzICgiZ3JvdXBzIG9mIGdyb3VwcyIpCistLSZndDs8L3NwYW4+CisKKyZsdDshRUxFTUVOVCB0ZXN0IChtZXRob2Qtc2VsZWN0b3JzPyxwYXJhbWV0ZXIqLGdyb3Vwcz8scGFja2FnZXM/LGNsYXNzZXM/KSAmZ3Q7CisKKzxzcGFuIGNsYXNzPSJ4bWwtY29tbWVudCI+Jmx0OyEtLQorQGF0dHIgIG5hbWUgICAgICAgICBUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGFzIGl0IHdpbGwgYXBwZWFyIGluIHRoZSByZXBvcnRzKQorQGF0dHIgIGp1bml0ICAgICAgICBXaGV0aGVyIHRvIHJ1biBpbiBKVW5pdCBtb2RlLgorQGF0dHIgIHZlcmJvc2UgICAgICBIb3cgdmVyYm9zZSB0aGUgb3V0cHV0IG9uIHRoZSBjb25zb2xlIHdpbGwgYmUuCisgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGhhcyBubyBpbXBhY3Qgb24gdGhlIEhUTUwgcmVwb3J0cy4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiBzdWl0ZSBsZXZlbCB2ZXJib3NlLgorQGF0dHIgIHBhcmFsbGVsICAgICBXaGV0aGVyIFRlc3RORyBzaG91bGQgdXNlIGRpZmZlcmVudCB0aHJlYWRzCisgICAgICAgICAgICAgICAgdG8gcnVuIHlvdXIgdGVzdHMgKG1pZ2h0IHNwZWVkIHVwIHRoZSBwcm9jZXNzKQorQGF0dHIgIHRocmVhZC1jb3VudCBBbiBpbnRlZ2VyIGdpdmluZyB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wgdG8gYmUgdXNlZCBpZgorICAgICAgICAgICAgICAgIHBhcmFsbGVsIG1vZGUgaXMgdXNlZC4gT3ZlcnJpZGVzIHRoZSBzdWl0ZSBsZXZlbCB2YWx1ZS4KK0BhdHRyICBhbm5vdGF0aW9ucyAgSWYgImphdmFkb2MiLCBUZXN0Tkcgd2lsbCBsb29rIGZvcgorICAgICAgICAgICAgICAgIEphdmFEb2MgYW5ub3RhdGlvbnMgaW4geW91ciBzb3VyY2VzLCBvdGhlcndpc2UgaXQgd2lsbAorICAgICAgICAgICAgICAgIHVzZSBKREs1IGFubm90YXRpb25zLgorQGF0dHIgIHRpbWUtb3V0ICAgICB0aGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYWJvcnRpbmcKKyAgICAgICAgICAgICAgICB0aGUgbWV0aG9kIChpZiA8c3BhbiBjbGFzcz0iYXR0cmlidXRlIj5wYXJhbGxlbD0ibWV0aG9kcyI8L3NwYW4+ICkgb3IgdGhlIHRlc3QgKGlmIDxzcGFuIGNsYXNzPSJhdHRyaWJ1dGUiPnBhcmFsbGVsPSJ0ZXN0cyI8L3NwYW4+ICkKK0BhdHRyICBlbmFibGVkICAgICAgZmxhZyB0byBlbmFibGUvZGlzYWJsZSBjdXJyZW50IHRlc3QuIERlZmF1bHQgdmFsdWU6IHRydWUgCitAYXR0ciAgc2tpcGZhaWxlZGludm9jYXRpb25Db3VudHMgV2hldGhlciB0byBza2lwIGZhaWxlZCBpbnZvY2F0aW9ucy4KKy0tJmd0Ozwvc3Bhbj4KKyZsdDshQVRUTElTVCB0ZXN0CisgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQgCisgICAganVuaXQgKHRydWUgfCBmYWxzZSkgImZhbHNlIgorICAgIHZlcmJvc2UgIENEQVRBICNJTVBMSUVECisgICAgcGFyYWxsZWwgIENEQVRBICNJTVBMSUVECisgICAgdGhyZWFkLWNvdW50IENEQVRBICNJTVBMSUVECisgICAgYW5ub3RhdGlvbnMgIENEQVRBICNJTVBMSUVECisgICAgdGltZS1vdXQgQ0RBVEEgI0lNUExJRUQKKyAgICBlbmFibGVkIENEQVRBICNJTVBMSUVECisgICAgc2tpcGZhaWxlZGludm9jYXRpb25Db3VudHMgKHRydWUgfCBmYWxzZSkgImZhbHNlIgorJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0KK0RlZmluZXMgYWRkaXRpb25hbCBncm91cHMgKCJncm91cHMgb2YgZ3JvdXBzIikgYW5kIGFsc28gd2hpY2ggZ3JvdXBzIHRvIGluY2x1ZGUgaW4gdGhpcyB0ZXN0IHJ1bgorLS0mZ3Q7PC9zcGFuPgorJmx0OyFFTEVNRU5UIGdyb3VwcyAoZGVmaW5lKixydW4/KSAmZ3Q7CisKKyZsdDshRUxFTUVOVCBkZWZpbmUgKGluY2x1ZGUqKSZndDsKKworJmx0OyFBVFRMSVNUIGRlZmluZQorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gRGVmaW5lcyB3aGljaCBncm91cHMgdG8gaW5jbHVkZSBpbiB0aGUgY3VycmVudCBncm91cCBvZiBncm91cHMgICAgICAgICAtLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgaW5jbHVkZSBBTlkmZ3Q7CismbHQ7IUFUVExJU1QgaW5jbHVkZQorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gRGVmaW5lcyB3aGljaCBncm91cHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBjdXJyZW50IGdyb3VwIG9mIGdyb3VwcyAgICAgICAtLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgZXhjbHVkZSBBTlkmZ3Q7CismbHQ7IUFUVExJU1QgZXhjbHVkZQorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gVGhlIHN1YnRhZyBvZiBncm91cHMgdXNlZCB0byBkZWZpbmUgd2hpY2ggZ3JvdXBzIHNob3VsZCBiZSBydW4gICAgICAgICAtLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgcnVuIChpbmNsdWRlPyxleGNsdWRlPykqICZndDsKKworPHNwYW4gY2xhc3M9InhtbC1jb21tZW50Ij4mbHQ7IS0tIFRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gaW5jbHVkZSBpbiB0aGlzIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0mZ3Q7PC9zcGFuPgorJmx0OyFFTEVNRU5UIGNsYXNzZXMgKGNsYXNzKikgJmd0OworJmx0OyFFTEVNRU5UIGNsYXNzIChtZXRob2RzKikgJmd0OworJmx0OyFBVFRMSVNUIGNsYXNzCisgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQgJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gVGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gaW5jbHVkZSBpbiB0aGlzIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDs8L3NwYW4+CismbHQ7IUVMRU1FTlQgcGFja2FnZXMgKHBhY2thZ2UqKSAmZ3Q7CisKKzxzcGFuIGNsYXNzPSJ4bWwtY29tbWVudCI+Jmx0OyEtLSBUaGUgcGFja2FnZSBkZXNjcmlwdGlvbi4gCisgICAgIElmIHRoZSBwYWNrYWdlIG5hbWUgZW5kcyB3aXRoIC4qIHRoZW4gc3VicGFja2FnZXMgYXJlIGluY2x1ZGVkIHRvby4KKy0tJmd0Ozwvc3Bhbj4KKyZsdDshRUxFTUVOVCBwYWNrYWdlIChpbmNsdWRlPyxleGNsdWRlPykqJmd0OworJmx0OyFBVFRMSVNUIHBhY2thZ2UKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRCAmZ3Q7CisKKzxzcGFuIGNsYXNzPSJ4bWwtY29tbWVudCI+Jmx0OyEtLSBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIGluY2x1ZGUvZXhjbHVkZSBmcm9tIHRoaXMgdGVzdCAgICAgICAgICAgICAgICAgLS0mZ3Q7PC9zcGFuPgorJmx0OyFFTEVNRU5UIG1ldGhvZHMgKGluY2x1ZGU/LGV4Y2x1ZGU/KSogJmd0OworCis8c3BhbiBjbGFzcz0ieG1sLWNvbW1lbnQiPiZsdDshLS0gVGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gVGVzdE5HIC0tJmd0Ozwvc3Bhbj4KKyZsdDshRUxFTUVOVCBsaXN0ZW5lcnMgKGxpc3RlbmVyKikgJmd0OworCismbHQ7IUVMRU1FTlQgbGlzdGVuZXIgQU5ZJmd0OworJmx0OyFBVFRMSVNUIGxpc3RlbmVyCisgICAgY2xhc3MtbmFtZSBDREFUQSAjUkVRVUlSRUQgJmd0OworPC9wcmU+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLnRlc3RuZy54bWwuSVN1aXRlUGFyc2VyIGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy50ZXN0bmcueG1sLklTdWl0ZVBhcnNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzBmY2EzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy50ZXN0bmcueG1sLklTdWl0ZVBhcnNlcgpAQCAtMCwwICsxIEBACitvcmcudGVzdG5nLmludGVybmFsLllhbWxQYXJzZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvYnVsbGV0X3BvaW50LnBuZyBiL3NyYy9tYWluL3Jlc291cmNlcy9idWxsZXRfcG9pbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NmU2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvYnVsbGV0X3BvaW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvY29sbGFwc2VhbGwuZ2lmIGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbGxhcHNlYWxsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ4MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbGxhcHNlYWxsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvZmFpbGVkLnBuZyBiL3NyYy9tYWluL3Jlc291cmNlcy9mYWlsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTdiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvZmFpbGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvaGVhZGVyIGIvc3JjL21haW4vcmVzb3VyY2VzL2hlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk5YzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL2hlYWRlcgpAQCAtMCwwICsxLDIzIEBACis8IURPQ1RZUEUgaHRtbD4KKworPGh0bWw+CisgIDxoZWFkPgorICA8bWV0YSBjaGFyc2V0PSd1dGYtOCc+CisgIDx0aXRsZT5UZXN0TkcgcmVwb3J0czwvdGl0bGU+CisKKyAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0idGVzdG5nLXJlcG9ydHMuY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+ICAKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcXVlcnktMS43LjEubWluLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0bmctcmVwb3J0cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgorICAgICAgZ29vZ2xlLmxvYWQoJ3Zpc3VhbGl6YXRpb24nLCAnMScsIHtwYWNrYWdlczpbJ3RhYmxlJ119KTsKKyAgICAgIGdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3VGFibGUpOworICAgICAgdmFyIHN1aXRlVGFibGVJbml0RnVuY3Rpb25zID0gbmV3IEFycmF5KCk7CisgICAgICB2YXIgc3VpdGVUYWJsZURhdGEgPSBuZXcgQXJyYXkoKTsKKyAgICA8L3NjcmlwdD4KKyAgICA8IS0tCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcXVlcnktdWkvanMvanF1ZXJ5LXVpLTEuOC4xNi5jdXN0b20ubWluLmpzIj48L3NjcmlwdD4KKyAgICAgLS0+CisgIDwvaGVhZD4KKworICA8Ym9keT4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9qcXVlcnktMS43LjEubWluLmpzIGIvc3JjL21haW4vcmVzb3VyY2VzL2pxdWVyeS0xLjcuMS5taW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YjNmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9qcXVlcnktMS43LjEubWluLmpzCkBAIC0wLDAgKzEsNCBAQAorLyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLworKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY3koYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjdihhKXtpZighY2tbYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NsfHwoY2w9Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjbC5mcmFtZUJvcmRlcj1jbC53aWR0aD1jbC5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjbCk7aWYoIWNtfHwhY2wuY3JlYXRlRWxlbWVudCljbT0oY2wuY29udGVudFdpbmRvd3x8Y2wuY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjbS53cml0ZSgoYy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY20uY2xvc2UoKTtkPWNtLmNyZWF0ZUVsZW1lbnQoYSksY20uYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNsKX1ja1thXT1lfXJldHVybiBja1thXX1mdW5jdGlvbiBjdShhLGIpe3ZhciBjPXt9O2YuZWFjaChjcS5jb25jYXQuYXBwbHkoW10sY3Euc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjdCgpe2NyPWJ9ZnVuY3Rpb24gY3MoKXtzZXRUaW1lb3V0KGN0LDApO3JldHVybiBjcj1mLm5vdygpfWZ1bmN0aW9uIGNqKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2koKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2MoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNiKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gY2EoYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkUudGVzdChhKT9kKGEsZSk6Y2EoYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Inx8Zi5pc0FycmF5KGUpP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZiIT1udWxsJiZ0eXBlb2YgYj09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpY2EoYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGJfKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gYiQoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJULGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9YiQoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9YiQoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJaKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiQyhhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiP2J4OmJ5LGc9MCxoPWUubGVuZ3RoO2lmKGQ+MCl7aWYoYyE9PSJib3JkZXIiKWZvcig7ZzxoO2crKyljfHwoZC09cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitlW2ddKSl8fDApLGM9PT0ibWFyZ2luIj9kKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDA6ZC09cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwO3JldHVybiBkKyJweCJ9ZD1ieihhLGIsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXXx8MDtkPXBhcnNlRmxvYXQoZCl8fDA7aWYoYylmb3IoO2c8aDtnKyspZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitlW2ddKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIitlW2ddKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrZVtnXSkpfHwwKTtyZXR1cm4gZCsicHgifWZ1bmN0aW9uIGJwKGEsYil7Yi5zcmM/Zi5hamF4KHt1cmw6Yi5zcmMsYXN5bmM6ITEsZGF0YVR5cGU6InNjcmlwdCJ9KTpmLmdsb2JhbEV2YWwoKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKGJmLCIvKiQwKi8iKSksYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9ZnVuY3Rpb24gYm8oYSl7dmFyIGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtiaC5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD1hLm91dGVySFRNTDtyZXR1cm4gYi5maXJzdENoaWxkfWZ1bmN0aW9uIGJuKGEpe3ZhciBiPShhLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKTtiPT09ImlucHV0Ij9ibShhKTpiIT09InNjcmlwdCImJnR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIiYmZi5ncmVwKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYm0pfWZ1bmN0aW9uIGJtKGEpe2lmKGEudHlwZT09PSJjaGVja2JveCJ8fGEudHlwZT09PSJyYWRpbyIpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gYmwoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYmsoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlPT09MSl7Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGM9PT0ib2JqZWN0IiliLm91dGVySFRNTD1hLm91dGVySFRNTDtlbHNlIGlmKGMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iKXtpZihjPT09Im9wdGlvbiIpYi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDtlbHNlIGlmKGM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIiliLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZX1lbHNlIGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2IucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyl9fWZ1bmN0aW9uIGJqKGEsYil7aWYoYi5ub2RlVHlwZT09PTEmJiEhZi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZz1mLl9kYXRhKGEpLGg9Zi5fZGF0YShiLGcpLGk9Zy5ldmVudHM7aWYoaSl7ZGVsZXRlIGguaGFuZGxlLGguZXZlbnRzPXt9O2ZvcihjIGluIGkpZm9yKGQ9MCxlPWlbY10ubGVuZ3RoO2Q8ZTtkKyspZi5ldmVudC5hZGQoYixjKyhpW2NdW2RdLm5hbWVzcGFjZT8iLiI6IiIpK2lbY11bZF0ubmFtZXNwYWNlLGlbY11bZF0saVtjXVtkXS5kYXRhKX1oLmRhdGEmJihoLmRhdGE9Zi5leHRlbmQoe30saC5kYXRhKSl9fWZ1bmN0aW9uIGJpKGEsYil7cmV0dXJuIGYubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIFUoYSl7dmFyIGI9Vi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY31mdW5jdGlvbiBUKGEsYixjKXtiPWJ8fDA7aWYoZi5pc0Z1bmN0aW9uKGIpKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3ZhciBlPSEhYi5jYWxsKGEsZCxhKTtyZXR1cm4gZT09PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBhPT09Yj09PWN9KTtpZih0eXBlb2YgYj09InN0cmluZyIpe3ZhciBkPWYuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09MX0pO2lmKE8udGVzdChiKSlyZXR1cm4gZi5maWx0ZXIoYixkLCFjKTtiPWYuZmlsdGVyKGIsZCl9cmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuaW5BcnJheShhLGIpPj0wPT09Y30pfWZ1bmN0aW9uIFMoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIEsoKXtyZXR1cm4hMH1mdW5jdGlvbiBKKCl7cmV0dXJuITF9ZnVuY3Rpb24gbihhLGIsYyl7dmFyIGQ9YisiZGVmZXIiLGU9YisicXVldWUiLGc9YisibWFyayIsaD1mLl9kYXRhKGEsZCk7aCYmKGM9PT0icXVldWUifHwhZi5fZGF0YShhLGUpKSYmKGM9PT0ibWFyayJ8fCFmLl9kYXRhKGEsZykpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IWYuX2RhdGEoYSxlKSYmIWYuX2RhdGEoYSxnKSYmKGYucmVtb3ZlRGF0YShhLGQsITApLGguZmlyZSgpKX0sMCl9ZnVuY3Rpb24gbShhKXtmb3IodmFyIGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmZi5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBsKGEsYyxkKXtpZihkPT09YiYmYS5ub2RlVHlwZT09PTEpe3ZhciBlPSJkYXRhLSIrYy5yZXBsYWNlKGssIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZD1hLmdldEF0dHJpYnV0ZShlKTtpZih0eXBlb2YgZD09InN0cmluZyIpe3RyeXtkPWQ9PT0idHJ1ZSI/ITA6ZD09PSJmYWxzZSI/ITE6ZD09PSJudWxsIj9udWxsOmYuaXNOdW1lcmljKGQpP3BhcnNlRmxvYXQoZCk6ai50ZXN0KGQpP2YucGFyc2VKU09OKGQpOmR9Y2F0Y2goZyl7fWYuZGF0YShhLGMsZCl9ZWxzZSBkPWJ9cmV0dXJuIGR9ZnVuY3Rpb24gaChhKXt2YXIgYj1nW2FdPXt9LGMsZDthPWEuc3BsaXQoL1xzKy8pO2ZvcihjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGM9YS5kb2N1bWVudCxkPWEubmF2aWdhdG9yLGU9YS5sb2NhdGlvbixmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSigpe2lmKCFlLmlzUmVhZHkpe3RyeXtjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQoSiwxKTtyZXR1cm59ZS5yZWFkeSgpfX12YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZS5mbi5pbml0KGEsYixoKX0sZj1hLmpRdWVyeSxnPWEuJCxoLGk9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLGo9L1xTLyxrPS9eXHMrLyxsPS9ccyskLyxtPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sbj0vXltcXSw6e31cc10qJC8sbz0vXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLHA9LyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLHE9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxyPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLHM9LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLHQ9Lyhtc2llKSAoW1x3Ll0rKS8sdT0vKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLHY9Ly0oW2Etel18WzAtOV0pL2lnLHc9L14tbXMtLyx4PWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LHk9ZC51c2VyQWdlbnQseixBLEIsQz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFPUFycmF5LnByb3RvdHlwZS5wdXNoLEY9QXJyYXkucHJvdG90eXBlLnNsaWNlLEc9U3RyaW5nLnByb3RvdHlwZS50cmltLEg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsST17fTtlLmZuPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGluaXQ6ZnVuY3Rpb24oYSxkLGYpe3ZhciBnLGgsaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZCYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09InN0cmluZyIpe2EuY2hhckF0KDApIT09IjwifHxhLmNoYXJBdChhLmxlbmd0aC0xKSE9PSI+Inx8YS5sZW5ndGg8Mz9nPWkuZXhlYyhhKTpnPVtudWxsLGEsbnVsbF07aWYoZyYmKGdbMV18fCFkKSl7aWYoZ1sxXSl7ZD1kIGluc3RhbmNlb2YgZT9kWzBdOmQsaz1kP2Qub3duZXJEb2N1bWVudHx8ZDpjLGo9bS5leGVjKGEpLGo/ZS5pc1BsYWluT2JqZWN0KGQpPyhhPVtjLmNyZWF0ZUVsZW1lbnQoalsxXSldLGUuZm4uYXR0ci5jYWxsKGEsZCwhMCkpOmE9W2suY3JlYXRlRWxlbWVudChqWzFdKV06KGo9ZS5idWlsZEZyYWdtZW50KFtnWzFdXSxba10pLGE9KGouY2FjaGVhYmxlP2UuY2xvbmUoai5mcmFnbWVudCk6ai5mcmFnbWVudCkuY2hpbGROb2Rlcyk7cmV0dXJuIGUubWVyZ2UodGhpcyxhKX1oPWMuZ2V0RWxlbWVudEJ5SWQoZ1syXSk7aWYoaCYmaC5wYXJlbnROb2RlKXtpZihoLmlkIT09Z1syXSlyZXR1cm4gZi5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1ofXRoaXMuY29udGV4dD1jLHRoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31yZXR1cm4hZHx8ZC5qcXVlcnk/KGR8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihkKS5maW5kKGEpfWlmKGUuaXNGdW5jdGlvbihhKSlyZXR1cm4gZi5yZWFkeShhKTthLnNlbGVjdG9yIT09YiYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KTtyZXR1cm4gZS5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjcuMSIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBGLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9FLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEEuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXthPSthO3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixGLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpFLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm4sZS5leHRlbmQ9ZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZixnLGgsaT1hcmd1bWVudHNbMF18fHt9LGo9MSxrPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgaT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT0ib2JqZWN0IiYmIWUuaXNGdW5jdGlvbihpKSYmKGk9e30pLGs9PT1qJiYoaT10aGlzLC0taik7Zm9yKDtqPGs7aisrKWlmKChhPWFyZ3VtZW50c1tqXSkhPW51bGwpZm9yKGMgaW4gYSl7ZD1pW2NdLGY9YVtjXTtpZihpPT09Ziljb250aW51ZTtsJiZmJiYoZS5pc1BsYWluT2JqZWN0KGYpfHwoZz1lLmlzQXJyYXkoZikpKT8oZz8oZz0hMSxoPWQmJmUuaXNBcnJheShkKT9kOltdKTpoPWQmJmUuaXNQbGFpbk9iamVjdChkKT9kOnt9LGlbY109ZS5leHRlbmQobCxoLGYpKTpmIT09YiYmKGlbY109Zil9cmV0dXJuIGl9LGUuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGIpe2EuJD09PWUmJihhLiQ9ZyksYiYmYS5qUXVlcnk9PT1lJiYoYS5qUXVlcnk9Zik7cmV0dXJuIGV9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/ZS5yZWFkeVdhaXQrKzplLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoYT09PSEwJiYhLS1lLnJlYWR5V2FpdHx8YSE9PSEwJiYhZS5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7ZS5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1lLnJlYWR5V2FpdD4wKXJldHVybjtBLmZpcmVXaXRoKGMsW2VdKSxlLmZuLnRyaWdnZXImJmUoYykudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighQSl7QT1lLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJkooKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmdHlwZW9mIGE9PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gYX0saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/U3RyaW5nKGEpOklbQy5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fGUudHlwZShhKSE9PSJvYmplY3QifHxhLm5vZGVUeXBlfHxlLmlzV2luZG93KGEpKXJldHVybiExO3RyeXtpZihhLmNvbnN0cnVjdG9yJiYhRC5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFELmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX12YXIgZDtmb3IoZCBpbiBhKTtyZXR1cm4gZD09PWJ8fEQuY2FsbChhLGQpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSlNPTjpmdW5jdGlvbihiKXtpZih0eXBlb2YgYiE9InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZS50cmltKGIpO2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYik7aWYobi50ZXN0KGIucmVwbGFjZShvLCJAIikucmVwbGFjZShwLCJdIikucmVwbGFjZShxLCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihjKXt2YXIgZCxmO3RyeXthLkRPTVBhcnNlcj8oZj1uZXcgRE9NUGFyc2VyLGQ9Zi5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChnKXtkPWJ9KCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmZS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyk7cmV0dXJuIGR9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmai50ZXN0KGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHcsIm1zLSIpLnJlcGxhY2Uodix4KX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnPTAsaD1hLmxlbmd0aCxpPWg9PT1ifHxlLmlzRnVuY3Rpb24oYSk7aWYoZCl7aWYoaSl7Zm9yKGYgaW4gYSlpZihjLmFwcGx5KGFbZl0sZCk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmFwcGx5KGFbZysrXSxkKT09PSExKWJyZWFrfWVsc2UgaWYoaSl7Zm9yKGYgaW4gYSlpZihjLmNhbGwoYVtmXSxmLGFbZl0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5jYWxsKGFbZ10sZyxhW2crK10pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06Rz9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpHLmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBkPWUudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZD09PSJzdHJpbmcifHxkPT09ImZ1bmN0aW9uInx8ZD09PSJyZWdleHAifHxlLmlzV2luZG93KGEpP0UuY2FsbChjLGEpOmUubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYoSClyZXR1cm4gSC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9Yy5sZW5ndGg7ZTxmO2UrKylhW2QrK109Y1tlXTtlbHNlIHdoaWxlKGNbZV0hPT1iKWFbZCsrXT1jW2UrK107YS5sZW5ndGg9ZDtyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSxjIT09ZSYmZC5wdXNoKGFbZl0pO3JldHVybiBkfSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGcsaD1bXSxpPTAsaj1hLmxlbmd0aCxrPWEgaW5zdGFuY2VvZiBlfHxqIT09YiYmdHlwZW9mIGo9PSJudW1iZXIiJiYoaj4wJiZhWzBdJiZhW2otMV18fGo9PT0wfHxlLmlzQXJyYXkoYSkpO2lmKGspZm9yKDtpPGo7aSsrKWY9YyhhW2ldLGksZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO2Vsc2UgZm9yKGcgaW4gYSlmPWMoYVtnXSxnLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtyZXR1cm4gaC5jb25jYXQuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIil7dmFyIGQ9YVtjXTtjPWEsYT1kfWlmKCFlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGI7dmFyIGY9Ri5jYWxsKGFyZ3VtZW50cywyKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYyxmLmNvbmNhdChGLmNhbGwoYXJndW1lbnRzKSkpfTtnLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Zy5ndWlkfHxlLmd1aWQrKztyZXR1cm4gZ30sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyxoKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYz09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBjKWUuYWNjZXNzKGEsaixjW2pdLGYsZyxkKTtyZXR1cm4gYX1pZihkIT09Yil7Zj0haCYmZiYmZS5pc0Z1bmN0aW9uKGQpO2Zvcih2YXIgaz0wO2s8aTtrKyspZyhhW2tdLGMsZj9kLmNhbGwoYVtrXSxrLGcoYVtrXSxjKSk6ZCxoKTtyZXR1cm4gYX1yZXR1cm4gaT9nKGFbMF0sYyk6Yn0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9ci5leGVjKGEpfHxzLmV4ZWMoYSl8fHQuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdS5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWUuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViPXRoaXMuc3ViLGEuZm4uaW5pdD1mdW5jdGlvbihkLGYpe2YmJmYgaW5zdGFuY2VvZiBlJiYhKGYgaW5zdGFuY2VvZiBhKSYmKGY9YShmKSk7cmV0dXJuIGUuZm4uaW5pdC5jYWxsKHRoaXMsZCxmLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGUuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksej1lLnVhTWF0Y2goeSksei5icm93c2VyJiYoZS5icm93c2VyW3ouYnJvd3Nlcl09ITAsZS5icm93c2VyLnZlcnNpb249ei52ZXJzaW9uKSxlLmJyb3dzZXIud2Via2l0JiYoZS5icm93c2VyLnNhZmFyaT0hMCksai50ZXN0KCLCoCIpJiYoaz0vXltcc1x4QTBdKy8sbD0vW1xzXHhBMF0rJC8pLGg9ZShjKSxjLmFkZEV2ZW50TGlzdGVuZXI/Qj1mdW5jdGlvbigpe2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiwhMSksZS5yZWFkeSgpfTpjLmF0dGFjaEV2ZW50JiYoQj1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSImJihjLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEIpLGUucmVhZHkoKSl9KTtyZXR1cm4gZX0oKSxnPXt9O2YuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9YT9nW2FdfHxoKGEpOnt9O3ZhciBjPVtdLGQ9W10sZSxpLGosayxsLG09ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bShnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IW8uaGFzKGcpKSYmYy5wdXNoKGcpfSxuPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxsPWp8fDAsaj0wLGs9Yy5sZW5ndGg7Zm9yKDtjJiZsPGs7bCsrKWlmKGNbbF0uYXBwbHkoYixmKT09PSExJiZhLnN0b3BPbkZhbHNlKXtlPSEwO2JyZWFrfWk9ITEsYyYmKGEub25jZT9lPT09ITA/by5kaXNhYmxlKCk6Yz1bXTpkJiZkLmxlbmd0aCYmKGU9ZC5zaGlmdCgpLG8uZmlyZVdpdGgoZVswXSxlWzFdKSkpfSxvPXthZGQ6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYT1jLmxlbmd0aDttKGFyZ3VtZW50cyksaT9rPWMubGVuZ3RoOmUmJmUhPT0hMCYmKGo9YSxuKGVbMF0sZVsxXSkpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYj1hcmd1bWVudHMsZD0wLGU9Yi5sZW5ndGg7Zm9yKDtkPGU7ZCsrKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKGJbZF09PT1jW2ZdKXtpJiZmPD1rJiYoay0tLGY8PWwmJmwtLSksYy5zcGxpY2UoZi0tLDEpO2lmKGEudW5pcXVlKWJyZWFrfX1yZXR1cm4gdGhpc30saGFzOmZ1bmN0aW9uKGEpe2lmKGMpe3ZhciBiPTAsZD1jLmxlbmd0aDtmb3IoO2I8ZDtiKyspaWYoYT09PWNbYl0pcmV0dXJuITB9cmV0dXJuITF9LGVtcHR5OmZ1bmN0aW9uKCl7Yz1bXTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe2M9ZD1lPWI7cmV0dXJuIHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWN9LGxvY2s6ZnVuY3Rpb24oKXtkPWIsKCFlfHxlPT09ITApJiZvLmRpc2FibGUoKTtyZXR1cm4gdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWR9LGZpcmVXaXRoOmZ1bmN0aW9uKGIsYyl7ZCYmKGk/YS5vbmNlfHxkLnB1c2goW2IsY10pOighYS5vbmNlfHwhZSkmJm4oYixjKSk7cmV0dXJuIHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtvLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9fTtyZXR1cm4gb307dmFyIGk9W10uc2xpY2U7Zi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGM9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZD1mLkNhbGxiYWNrcygibWVtb3J5IiksZT0icGVuZGluZyIsZz17cmVzb2x2ZTpiLHJlamVjdDpjLG5vdGlmeTpkfSxoPXtkb25lOmIuYWRkLGZhaWw6Yy5hZGQscHJvZ3Jlc3M6ZC5hZGQsc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZX0saXNSZXNvbHZlZDpiLmZpcmVkLGlzUmVqZWN0ZWQ6Yy5maXJlZCx0aGVuOmZ1bmN0aW9uKGEsYixjKXtpLmRvbmUoYSkuZmFpbChiKS5wcm9ncmVzcyhjKTtyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7aS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKTtyZXR1cm4gdGhpc30scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGQsZSxnLGgsaSxqLGssbCxtLG4sbyxwLHE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPWMuZG9jdW1lbnRFbGVtZW50O3Euc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscS5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpxLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFxLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnEuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Yy5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITB9LGkuY2hlY2tlZD0hMCxiLm5vQ2xvbmVDaGVja2VkPWkuY2xvbmVOb2RlKCEwKS5jaGVja2VkLGcuZGlzYWJsZWQ9ITAsYi5vcHREaXNhYmxlZD0haC5kaXNhYmxlZDt0cnl7ZGVsZXRlIHEudGVzdH1jYXRjaChzKXtiLmRlbGV0ZUV4cGFuZG89ITF9IXEuYWRkRXZlbnRMaXN0ZW5lciYmcS5hdHRhY2hFdmVudCYmcS5maXJlRXZlbnQmJihxLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2Iubm9DbG9uZUV2ZW50PSExfSkscS5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGljayIpKSxpPWMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYi5yYWRpb1ZhbHVlPWkudmFsdWU9PT0idCIsaS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIikscS5hcHBlbmRDaGlsZChpKSxrPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGsuYXBwZW5kQ2hpbGQocS5sYXN0Q2hpbGQpLGIuY2hlY2tDbG9uZT1rLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmFwcGVuZENoZWNrZWQ9aS5jaGVja2VkLGsucmVtb3ZlQ2hpbGQoaSksay5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iIixhLmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIscS5zdHlsZS53aWR0aD0iMnB4IixxLmFwcGVuZENoaWxkKGopLGIucmVsaWFibGVNYXJnaW5SaWdodD0ocGFyc2VJbnQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShqLG51bGwpfHx7bWFyZ2luUmlnaHQ6MH0pLm1hcmdpblJpZ2h0LDEwKXx8MCk9PT0wKTtpZihxLmF0dGFjaEV2ZW50KWZvcihvIGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pbj0ib24iK28scD1uIGluIHEscHx8KHEuc2V0QXR0cmlidXRlKG4sInJldHVybjsiKSxwPXR5cGVvZiBxW25dPT0iZnVuY3Rpb24iKSxiW28rIkJ1YmJsZXMiXT1wO2sucmVtb3ZlQ2hpbGQocSksaz1nPWg9aj1xPWk9bnVsbCxmKGZ1bmN0aW9uKCl7dmFyIGEsZCxlLGcsaCxpLGosayxtLG4sbyxyPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTshcnx8KGo9MSxrPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7bWFyZ2luOjA7IixtPSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDsiLG49InN0eWxlPSciK2srImJvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7JyIsbz0iPGRpdiAiK24rIj48ZGl2PjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIiBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPiIrIjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IixhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5zdHlsZS5jc3NUZXh0PW0rIndpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6IitqKyJweCIsci5pbnNlcnRCZWZvcmUoYSxyLmZpcnN0Q2hpbGQpLHE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLmFwcGVuZENoaWxkKHEpLHEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsbD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHA9bFswXS5vZmZzZXRIZWlnaHQ9PT0wLGxbMF0uc3R5bGUuZGlzcGxheT0iIixsWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGIucmVsaWFibGVIaWRkZW5PZmZzZXRzPXAmJmxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxxLmlubmVySFRNTD0iIixxLnN0eWxlLndpZHRoPXEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCIsZi5ib3hNb2RlbD1iLmJveE1vZGVsPXEub2Zmc2V0V2lkdGg9PT0yLHR5cGVvZiBxLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYocS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHEuc3R5bGUuem9vbT0xLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1xLm9mZnNldFdpZHRoPT09MixxLnN0eWxlLmRpc3BsYXk9IiIscS5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiIsYi5zaHJpbmtXcmFwQmxvY2tzPXEub2Zmc2V0V2lkdGghPT0yKSxxLnN0eWxlLmNzc1RleHQ9ayttLHEuaW5uZXJIVE1MPW8sZD1xLmZpcnN0Q2hpbGQsZT1kLmZpcnN0Q2hpbGQsaD1kLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCxpPXtkb2VzTm90QWRkQm9yZGVyOmUub2Zmc2V0VG9wIT09NSxkb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsczpoLm9mZnNldFRvcD09PTV9LGUuc3R5bGUucG9zaXRpb249ImZpeGVkIixlLnN0eWxlLnRvcD0iMjBweCIsaS5maXhlZFBvc2l0aW9uPWUub2Zmc2V0VG9wPT09MjB8fGUub2Zmc2V0VG9wPT09MTUsZS5zdHlsZS5wb3NpdGlvbj1lLnN0eWxlLnRvcD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixpLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1lLm9mZnNldFRvcD09PS01LGkuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9ci5vZmZzZXRUb3AhPT1qLHIucmVtb3ZlQ2hpbGQoYSkscT1hPW51bGwsZi5leHRlbmQoYixpKSl9KTtyZXR1cm4gYn0oKTt2YXIgaj0vXig/Olx7LipcfXxcWy4qXF0pJC8saz0vKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIW0oYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnLGgsaSxqPWYuZXhwYW5kbyxrPXR5cGVvZiBjPT0ic3RyaW5nIixsPWEubm9kZVR5cGUsbT1sP2YuY2FjaGU6YSxuPWw/YVtqXTphW2pdJiZqLG89Yz09PSJldmVudHMiO2lmKCghbnx8IW1bbl18fCFvJiYhZSYmIW1bbl0uZGF0YSkmJmsmJmQ9PT1iKXJldHVybjtufHwobD9hW2pdPW49KytmLnV1aWQ6bj1qKSxtW25dfHwobVtuXT17fSxsfHwobVtuXS50b0pTT049Zi5ub29wKSk7aWYodHlwZW9mIGM9PSJvYmplY3QifHx0eXBlb2YgYz09ImZ1bmN0aW9uIillP21bbl09Zi5leHRlbmQobVtuXSxjKTptW25dLmRhdGE9Zi5leHRlbmQobVtuXS5kYXRhLGMpO2c9aD1tW25dLGV8fChoLmRhdGF8fChoLmRhdGE9e30pLGg9aC5kYXRhKSxkIT09YiYmKGhbZi5jYW1lbENhc2UoYyldPWQpO2lmKG8mJiFoW2NdKXJldHVybiBnLmV2ZW50cztrPyhpPWhbY10saT09bnVsbCYmKGk9aFtmLmNhbWVsQ2FzZShjKV0pKTppPWg7cmV0dXJuIGl9fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYixjKXtpZighIWYuYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxnLGg9Zi5leHBhbmRvLGk9YS5ub2RlVHlwZSxqPWk/Zi5jYWNoZTphLGs9aT9hW2hdOmg7aWYoIWpba10pcmV0dXJuO2lmKGIpe2Q9Yz9qW2tdOmpba10uZGF0YTtpZihkKXtmLmlzQXJyYXkoYil8fChiIGluIGQ/Yj1bYl06KGI9Zi5jYW1lbENhc2UoYiksYiBpbiBkP2I9W2JdOmI9Yi5zcGxpdCgiICIpKSk7Zm9yKGU9MCxnPWIubGVuZ3RoO2U8ZztlKyspZGVsZXRlIGRbYltlXV07aWYoIShjP206Zi5pc0VtcHR5T2JqZWN0KShkKSlyZXR1cm59fWlmKCFjKXtkZWxldGUgaltrXS5kYXRhO2lmKCFtKGpba10pKXJldHVybn1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8IWouc2V0SW50ZXJ2YWw/ZGVsZXRlIGpba106altrXT1udWxsLGkmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtoXTphLnJlbW92ZUF0dHJpYnV0ZT9hLnJlbW92ZUF0dHJpYnV0ZShoKTphW2hdPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZyxoPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7aD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIikpe2U9dGhpc1swXS5hdHRyaWJ1dGVzO2Zvcih2YXIgaT0wLGo9ZS5sZW5ndGg7aTxqO2krKylnPWVbaV0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksbCh0aGlzWzBdLGcsaFtnXSkpO2YuX2RhdGEodGhpc1swXSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGh9aWYodHlwZW9mIGE9PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRhdGEodGhpcyxhKX0pO2Q9YS5zcGxpdCgiLiIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihjPT09Yil7aD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitkWzFdKyIhIixbZFswXV0pLGg9PT1iJiZ0aGlzLmxlbmd0aCYmKGg9Zi5kYXRhKHRoaXNbMF0sYSksaD1sKHRoaXNbMF0sYSxoKSk7cmV0dXJuIGg9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTpofXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGU9W2RbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIrZFsxXSsiISIsZSksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitkWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZSgpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO3tpZighIWFyZ3VtZW50cy5sZW5ndGgpe2U9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGc9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtlP2g9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1t0aGlzLnR5cGVdO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfWlmKGcpe2M9Zi52YWxIb29rc1tnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxmLnZhbEhvb2tzW2cudHlwZV07aWYoYyYmImdldCJpbiBjJiYoZD1jLmdldChnLCJ2YWx1ZSIpKSE9PWIpcmV0dXJuIGQ7ZD1nLnZhbHVlO3JldHVybiB0eXBlb2YgZD09InN0cmluZyI/ZC5yZXBsYWNlKHEsIiIpOmQ9PW51bGw/IiI6ZH19fX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGc9YS5zZWxlY3RlZEluZGV4LGg9W10saT1hLm9wdGlvbnMsaj1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZzwwKXJldHVybiBudWxsO2M9aj9nOjAsZD1qP2crMTppLmxlbmd0aDtmb3IoO2M8ZDtjKyspe2U9aVtjXTtpZihlLnNlbGVjdGVkJiYoZi5zdXBwb3J0Lm9wdERpc2FibGVkPyFlLmRpc2FibGVkOmUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpPT09bnVsbCkmJighZS5wYXJlbnROb2RlLmRpc2FibGVkfHwhZi5ub2RlTmFtZShlLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWYoZSkudmFsKCk7aWYoailyZXR1cm4gYjtoLnB1c2goYil9fWlmKGomJiFoLmxlbmd0aCYmaS5sZW5ndGgpcmV0dXJuIGYoaVtnXSkudmFsKCk7cmV0dXJuIGh9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWYubWFrZUFycmF5KGIpO2YoYSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Zi5pbkFycmF5KGYodGhpcykudmFsKCksYyk+PTB9KSxjLmxlbmd0aHx8KGEuc2VsZWN0ZWRJbmRleD0tMSk7cmV0dXJuIGN9fX0sYXR0ckZuOnt2YWw6ITAsY3NzOiEwLGh0bWw6ITAsdGV4dDohMCxkYXRhOiEwLHdpZHRoOiEwLGhlaWdodDohMCxvZmZzZXQ6ITB9LGF0dHI6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGcsaCxpLGo9YS5ub2RlVHlwZTtpZighIWEmJmohPT0zJiZqIT09OCYmaiE9PTIpe2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYodHlwZW9mIGEuZ2V0QXR0cmlidXRlPT0idW5kZWZpbmVkIilyZXR1cm4gZi5wcm9wKGEsYyxkKTtpPWohPT0xfHwhZi5pc1hNTERvYyhhKSxpJiYoYz1jLnRvTG93ZXJDYXNlKCksaD1mLmF0dHJIb29rc1tjXXx8KHUudGVzdChjKT94OncpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybn1pZihoJiYic2V0ImluIGgmJmkmJihnPWguc2V0KGEsZCxjKSkhPT1iKXJldHVybiBnO2Euc2V0QXR0cmlidXRlKGMsIiIrZCk7cmV0dXJuIGR9aWYoaCYmImdldCJpbiBoJiZpJiYoZz1oLmdldChhLGMpKSE9PW51bGwpcmV0dXJuIGc7Zz1hLmdldEF0dHJpYnV0ZShjKTtyZXR1cm4gZz09PW51bGw/YjpnfX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGg9MDtpZihiJiZhLm5vZGVUeXBlPT09MSl7ZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQocCksZz1kLmxlbmd0aDtmb3IoO2g8ZztoKyspZT1kW2hdLGUmJihjPWYucHJvcEZpeFtlXXx8ZSxmLmF0dHIoYSxlLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh2P2U6YyksdS50ZXN0KGUpJiZjIGluIGEmJihhW2NdPSExKSl9fSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHIudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKWYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIWYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmZi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO2Euc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKTtyZXR1cm4gYn19fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5nZXQoYSxiKTtyZXR1cm4gYiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGk9YS5ub2RlVHlwZTtpZighIWEmJmkhPT0zJiZpIT09OCYmaSE9PTIpe2g9aSE9PTF8fCFmLmlzWE1MRG9jKGEpLGgmJihjPWYucHJvcEZpeFtjXXx8YyxnPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/ZyYmInNldCJpbiBnJiYoZT1nLnNldChhLGQsYykpIT09Yj9lOmFbY109ZDpnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsYykpIT09bnVsbD9lOmFbY119fSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9wYXJzZUludChjLnZhbHVlLDEwKTpzLnRlc3QoYS5ub2RlTmFtZSl8fHQudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6Yn19fX0pLGYuYXR0ckhvb2tzLnRhYmluZGV4PWYucHJvcEhvb2tzLnRhYkluZGV4LHg9e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkLGU9Zi5wcm9wKGEsYyk7cmV0dXJuIGU9PT0hMHx8dHlwZW9mIGUhPSJib29sZWFuIiYmKGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpKSYmZC5ub2RlVmFsdWUhPT0hMT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSx2fHwoeT17bmFtZTohMCxpZDohMH0sdz1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJih5W2NdP2Qubm9kZVZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRBdHRyaWJ1dGVOb2RlKGQpO2V8fChlPWMuY3JlYXRlQXR0cmlidXRlKGQpLGEuc2V0QXR0cmlidXRlTm9kZShlKSk7cmV0dXJuIGUubm9kZVZhbHVlPWIrIiJ9fSxmLmF0dHJIb29rcy50YWJpbmRleC5zZXQ9dy5zZXQsZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSxmLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDp3LmdldCxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2I9PT0iIiYmKGI9ImZhbHNlIiksdy5zZXQoYSxiLGMpfX0pLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmVuY3R5cGV8fChmLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHo9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEE9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEI9L1xiaG92ZXIoXC5cUyspP1xiLyxDPS9ea2V5LyxEPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxFPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxGPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sRz1mdW5jdGlvbihhKXt2YXIgYj1GLmV4ZWMoYSk7YiYmKGJbMV09KGJbMV18fCIiKS50b0xvd2VyQ2FzZSgpLGJbM109YlszXSYmbmV3IFJlZ0V4cCgiKD86XnxcXHMpIitiWzNdKyIoPzpcXHN8JCkiKSk7cmV0dXJuIGJ9LEg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmF0dHJpYnV0ZXN8fHt9O3JldHVybighYlsxXXx8YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YlsxXSkmJighYlsyXXx8KGMuaWR8fHt9KS52YWx1ZT09PWJbMl0pJiYoIWJbM118fGJbM10udGVzdCgoY1siY2xhc3MiXXx8e30pLnZhbHVlKSl9LEk9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShCLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9OworZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCit7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmdbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IodmFyIGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspdGhpc1tjXS5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YSh0aGlzW2NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHRoaXNbY10uaW5uZXJIVE1MPWEpfWNhdGNoKGUpe3RoaXMuZW1wdHkoKS5hcHBlbmQoYSl9fWVsc2UgZi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MuaHRtbChhLmNhbGwodGhpcyxiLGMuaHRtbCgpKSl9KTp0aGlzLmVtcHR5KCkuYXBwZW5kKGEpO3JldHVybiB0aGlzfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmQudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmkodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxicCl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaSxqPWFbMF07YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGo9PSJzdHJpbmciJiZqLmxlbmd0aDw1MTImJmk9PT1jJiZqLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoaikmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJkLnRlc3QoaikpJiYoZi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KGopKSYmKGc9ITAsaD1mLmZyYWdtZW50c1tqXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1tqXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoail9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxoPWYuc3VwcG9ydC5odG1sNUNsb25lfHwhYmMudGVzdCgiPCIrYS5ub2RlTmFtZSk/YS5jbG9uZU5vZGUoITApOmJvKGEpO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JrKGEsaCksZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpZVtnXSYmYmsoZFtnXSxlW2ddKX1pZihiKXtiaihhLGgpO2lmKGMpe2Q9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWJqKGRbZ10sZVtnXSl9fWQ9ZT1udWxsO3JldHVybiBofSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZztiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTt2YXIgaD1bXSxpO2Zvcih2YXIgaj0wLGs7KGs9YVtqXSkhPW51bGw7aisrKXt0eXBlb2Ygaz09Im51bWJlciImJihrKz0iIik7aWYoIWspY29udGludWU7aWYodHlwZW9mIGs9PSJzdHJpbmciKWlmKCFfLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dmFyIGw9KFouZXhlYyhrKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxtPWJnW2xdfHxiZy5fZGVmYXVsdCxuPW1bMF0sbz1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2I9PT1jP2JoLmFwcGVuZENoaWxkKG8pOlUoYikuYXBwZW5kQ2hpbGQobyksby5pbm5lckhUTUw9bVsxXStrK21bMl07d2hpbGUobi0tKW89by5sYXN0Q2hpbGQ7aWYoIWYuc3VwcG9ydC50Ym9keSl7dmFyIHA9JC50ZXN0KGspLHE9bD09PSJ0YWJsZSImJiFwP28uZmlyc3RDaGlsZCYmby5maXJzdENoaWxkLmNoaWxkTm9kZXM6bVsxXT09PSI8dGFibGU+IiYmIXA/by5jaGlsZE5vZGVzOltdO2ZvcihpPXEubGVuZ3RoLTE7aT49MDstLWkpZi5ub2RlTmFtZShxW2ldLCJ0Ym9keSIpJiYhcVtpXS5jaGlsZE5vZGVzLmxlbmd0aCYmcVtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHFbaV0pfSFmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlgudGVzdChrKSYmby5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShYLmV4ZWMoaylbMF0pLG8uZmlyc3RDaGlsZCksaz1vLmNoaWxkTm9kZXN9dmFyIHI7aWYoIWYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGtbMF0mJnR5cGVvZiAocj1rLmxlbmd0aCk9PSJudW1iZXIiKWZvcihpPTA7aTxyO2krKylibihrW2ldKTtlbHNlIGJuKGspO2subm9kZVR5cGU/aC5wdXNoKGspOmg9Zi5tZXJnZShoLGspfWlmKGQpe2c9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8YmUudGVzdChhLnR5cGUpfTtmb3Ioaj0wO2hbal07aisrKWlmKGUmJmYubm9kZU5hbWUoaFtqXSwic2NyaXB0IikmJighaFtqXS50eXBlfHxoW2pdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goaFtqXS5wYXJlbnROb2RlP2hbal0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoW2pdKTpoW2pdKTtlbHNle2lmKGhbal0ubm9kZVR5cGU9PT0xKXt2YXIgcz1mLmdyZXAoaFtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7aC5zcGxpY2UuYXBwbHkoaCxbaisxLDBdLmNvbmNhdChzKSl9ZC5hcHBlbmRDaGlsZChoW2pdKX19cmV0dXJuIGh9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9Zi5jYWNoZSxlPWYuZXZlbnQuc3BlY2lhbCxnPWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaD0wLGk7KGk9YVtoXSkhPW51bGw7aCsrKXtpZihpLm5vZGVOYW1lJiZmLm5vRGF0YVtpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9aVtmLmV4cGFuZG9dO2lmKGMpe2I9ZFtjXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBqIGluIGIuZXZlbnRzKWVbal0/Zi5ldmVudC5yZW1vdmUoaSxqKTpmLnJlbW92ZUV2ZW50KGksaixiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWc/ZGVsZXRlIGlbZi5leHBhbmRvXTppLnJlbW92ZUF0dHJpYnV0ZSYmaS5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxkZWxldGUgZFtjXX19fX0pO3ZhciBicT0vYWxwaGFcKFteKV0qXCkvaSxicj0vb3BhY2l0eT0oW14pXSopLyxicz0vKFtBLVpdfF5tcykvZyxidD0vXi0/XGQrKD86cHgpPyQvaSxidT0vXi0/XGQvLGJ2PS9eKFtcLStdKT0oW1wtKy5cZGVdKykvLGJ3PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxieD1bIkxlZnQiLCJSaWdodCJdLGJ5PVsiVG9wIiwiQm90dG9tIl0sYnosYkEsYkI7Zi5mbi5jc3M9ZnVuY3Rpb24oYSxjKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MiYmYz09PWIpcmV0dXJuIHRoaXM7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxjLCEwLGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZCE9PWI/Zi5zdHlsZShhLGMsZCk6Zi5jc3MoYSxjKX0pfSxmLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWJ6KGEsIm9wYWNpdHkiLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFhJiZhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgmJiEhYS5zdHlsZSl7dmFyIGcsaCxpPWYuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZSxrPWYuY3NzSG9va3NbaV07Yz1mLmNzc1Byb3BzW2ldfHxpO2lmKGQ9PT1iKXtpZihrJiYiZ2V0ImluIGsmJihnPWsuZ2V0KGEsITEsZSkpIT09YilyZXR1cm4gZztyZXR1cm4galtjXX1oPXR5cGVvZiBkLGg9PT0ic3RyaW5nIiYmKGc9YnYuZXhlYyhkKSkmJihkPSsoZ1sxXSsxKSorZ1syXStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpO2lmKGQ9PW51bGx8fGg9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2g9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ6KXJldHVybiBieihhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fTtmb3IodmFyIGUgaW4gYilkW2VdPWEuc3R5bGVbZV0sYS5zdHlsZVtlXT1iW2VdO2MuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZFtlXX19KSxmLmN1ckNTUz1mLmNzcyxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZTtpZihjKXtpZihhLm9mZnNldFdpZHRoIT09MClyZXR1cm4gYkMoYSxiLGQpO2Yuc3dhcChhLGJ3LGZ1bmN0aW9uKCl7ZT1iQyhhLGIsZCl9KTtyZXR1cm4gZX19LHNldDpmdW5jdGlvbihhLGIpe2lmKCFidC50ZXN0KGIpKXJldHVybiBiO2I9cGFyc2VGbG9hdChiKTtpZihiPj0wKXJldHVybiBiKyJweCJ9fX0pLGYuc3VwcG9ydC5vcGFjaXR5fHwoZi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYnIudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpP3BhcnNlRmxvYXQoUmVnRXhwLiQxKS8xMDArIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPWYuaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiOiIiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MTtpZihiPj0xJiZmLnRyaW0oZy5yZXBsYWNlKGJxLCIiKSk9PT0iIil7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YnEudGVzdChnKT9nLnJlcGxhY2UoYnEsZSk6ZysiICIrZX19KSxmKGZ1bmN0aW9uKCl7Zi5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChmLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYztmLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtiP2M9YnooYSwibWFyZ2luLXJpZ2h0IiwibWFyZ2luUmlnaHQiKTpjPWEuc3R5bGUubWFyZ2luUmlnaHR9KTtyZXR1cm4gY319KX0pLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJBPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2I9Yi5yZXBsYWNlKGJzLCItJDEiKS50b0xvd2VyQ2FzZSgpLChkPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykmJihlPWQuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKSYmKGM9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLGM9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGM9Zi5zdHlsZShhLGIpKSk7cmV0dXJuIGN9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiQj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnQudGVzdChmKSYmYnUudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYno9YkF8fGJCLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkQ9LyUyMC9nLGJFPS9cW1xdJC8sYkY9L1xyP1xuL2csYkc9LyMuKiQvLGJIPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYkk9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJKPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYks9L14oPzpHRVR8SEVBRCkkLyxiTD0vXlwvXC8vLGJNPS9cPy8sYk49LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYk89L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlA9L1xzKy8sYlE9LyhbPyZdKV89W14mXSovLGJSPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiUz1mLmZuLmxvYWQsYlQ9e30sYlU9e30sYlYsYlcsYlg9WyIqLyJdK1siKiJdO3RyeXtiVj1lLmhyZWZ9Y2F0Y2goYlkpe2JWPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJWLmhyZWY9IiIsYlY9YlYuaHJlZn1iVz1iUi5leGVjKGJWLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiUylyZXR1cm4gYlMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYk4sIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJPLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJJLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJGLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiRiwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksZi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYyl7ZltjXT1mdW5jdGlvbihhLGQsZSxnKXtmLmlzRnVuY3Rpb24oZCkmJihnPWd8fGUsZT1kLGQ9Yik7cmV0dXJuIGYuYWpheCh7dHlwZTpjLHVybDphLGRhdGE6ZCxzdWNjZXNzOmUsZGF0YVR5cGU6Z30pfX0pLGYuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5nZXQoYSxiLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5nZXQoYSxiLGMsImpzb24iKX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7Yj9iXyhhLGYuYWpheFNldHRpbmdzKTooYj1hLGE9Zi5hamF4U2V0dGluZ3MpLGJfKGEsYik7cmV0dXJuIGF9LGFqYXhTZXR0aW5nczp7dXJsOmJWLGlzTG9jYWw6YkoudGVzdChiV1sxXSksZ2xvYmFsOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHRleHQ6InRleHQvcGxhaW4iLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsIioiOmJYfSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0In0sY29udmVydGVyczp7IiogdGV4dCI6YS5TdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6Zi5wYXJzZUpTT04sInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7Y29udGV4dDohMCx1cmw6ITB9fSxhamF4UHJlZmlsdGVyOmJaKGJUKSxhamF4VHJhbnNwb3J0OmJaKGJVKSxhamF4OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gdyhhLGMsbCxtKXtpZihzIT09Mil7cz0yLHEmJmNsZWFyVGltZW91dChxKSxwPWIsbj1tfHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MDt2YXIgbyxyLHUsdz1jLHg9bD9jYihkLHYsbCk6Yix5LHo7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNCl7aWYoZC5pZk1vZGlmaWVkKXtpZih5PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSlmLmxhc3RNb2RpZmllZFtrXT15O2lmKHo9di5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWYuZXRhZ1trXT16fWlmKGE9PT0zMDQpdz0ibm90bW9kaWZpZWQiLG89ITA7ZWxzZSB0cnl7cj1jYyhkLHgpLHc9InN1Y2Nlc3MiLG89ITB9Y2F0Y2goQSl7dz0icGFyc2VyZXJyb3IiLHU9QX19ZWxzZXt1PXc7aWYoIXd8fGEpdz0iZXJyb3IiLGE8MCYmKGE9MCl9di5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9IiIrKGN8fHcpLG8/aC5yZXNvbHZlV2l0aChlLFtyLHcsdl0pOmgucmVqZWN0V2l0aChlLFt2LHcsdV0pLHYuc3RhdHVzQ29kZShqKSxqPWIsdCYmZy50cmlnZ2VyKCJhamF4Iisobz8iU3VjY2VzcyI6IkVycm9yIiksW3YsZCxvP3I6dV0pLGkuZmlyZVdpdGgoZSxbdix3XSksdCYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixkXSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKX19dHlwZW9mIGE9PSJvYmplY3QiJiYoYz1hLGE9YiksYz1jfHx7fTt2YXIgZD1mLmFqYXhTZXR1cCh7fSxjKSxlPWQuY29udGV4dHx8ZCxnPWUhPT1kJiYoZS5ub2RlVHlwZXx8ZSBpbnN0YW5jZW9mIGYpP2YoZSk6Zi5ldmVudCxoPWYuRGVmZXJyZWQoKSxpPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGo9ZC5zdGF0dXNDb2RlfHx7fSxrLGw9e30sbT17fSxuLG8scCxxLHIscz0wLHQsdSx2PXtyZWFkeVN0YXRlOjAsc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe2lmKCFzKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7YT1tW2NdPW1bY118fGEsbFthXT1ifXJldHVybiB0aGlzfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcz09PTI/bjpudWxsfSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYztpZihzPT09Mil7aWYoIW8pe289e307d2hpbGUoYz1iSC5leGVjKG4pKW9bY1sxXS50b0xvd2VyQ2FzZSgpXT1jWzJdfWM9b1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBjPT09Yj9udWxsOmN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7c3x8KGQubWltZVR5cGU9YSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe2E9YXx8ImFib3J0IixwJiZwLmFib3J0KGEpLHcoMCxhKTtyZXR1cm4gdGhpc319O2gucHJvbWlzZSh2KSx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLHYuY29tcGxldGU9aS5hZGQsdi5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKHM8Milmb3IoYiBpbiBhKWpbYl09W2pbYl0sYVtiXV07ZWxzZSBiPWFbdi5zdGF0dXNdLHYudGhlbihiLGIpfXJldHVybiB0aGlzfSxkLnVybD0oKGF8fGQudXJsKSsiIikucmVwbGFjZShiRywiIikucmVwbGFjZShiTCxiV1sxXSsiLy8iKSxkLmRhdGFUeXBlcz1mLnRyaW0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KGJQKSxkLmNyb3NzRG9tYWluPT1udWxsJiYocj1iUi5leGVjKGQudXJsLnRvTG93ZXJDYXNlKCkpLGQuY3Jvc3NEb21haW49ISghcnx8clsxXT09YldbMV0mJnJbMl09PWJXWzJdJiYoclszXXx8KHJbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0oYldbM118fChiV1sxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJnR5cGVvZiBkLmRhdGEhPSJzdHJpbmciJiYoZC5kYXRhPWYucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSxiJChiVCxkLGMsdik7aWYocz09PTIpcmV0dXJuITE7dD1kLmdsb2JhbCxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFiSy50ZXN0KGQudHlwZSksdCYmZi5hY3RpdmUrKz09PTAmJmYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWQuaGFzQ29udGVudCl7ZC5kYXRhJiYoZC51cmwrPShiTS50ZXN0KGQudXJsKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksaz1kLnVybDtpZihkLmNhY2hlPT09ITEpe3ZhciB4PWYubm93KCkseT1kLnVybC5yZXBsYWNlKGJRLCIkMV89Iit4KTtkLnVybD15Kyh5PT09ZC51cmw/KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpKyJfPSIreDoiIil9fShkLmRhdGEmJmQuaGFzQ29udGVudCYmZC5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLGQuaWZNb2RpZmllZCYmKGs9a3x8ZC51cmwsZi5sYXN0TW9kaWZpZWRba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGYubGFzdE1vZGlmaWVkW2tdKSxmLmV0YWdba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW2tdKSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKGQuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrYlgrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pO2Zvcih1IGluIGQuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIodSxkLmhlYWRlcnNbdV0pO2lmKGQuYmVmb3JlU2VuZCYmKGQuYmVmb3JlU2VuZC5jYWxsKGUsdixkKT09PSExfHxzPT09Mikpe3YuYWJvcnQoKTtyZXR1cm4hMX1mb3IodSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W3VdKGRbdV0pO3A9YiQoYlUsZCxjLHYpO2lmKCFwKXcoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7di5yZWFkeVN0YXRlPTEsdCYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3YsZF0pLGQuYXN5bmMmJmQudGltZW91dD4wJiYocT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7cz0xLHAuc2VuZChsLHcpfWNhdGNoKHope2lmKHM8Mil3KC0xLHopO2Vsc2UgdGhyb3cgen19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2EoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkQsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Q9Zi5ub3coKSxjZT0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZCsrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZS50ZXN0KGIudXJsKXx8ZSYmY2UudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2UsbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNlLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2Y9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNoKWNoW2FdKDAsMSl9OiExLGNnPTAsY2g7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNpKCl8fGNqKCl9OmNpLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2YmJmRlbGV0ZSBjaFtpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjZyxjZiYmKGNofHwoY2g9e30sZihhKS51bmxvYWQoY2YpKSxjaFtpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2s9e30sY2wsY20sY249L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNvPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3AsY3E9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3I7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdSgic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjdihkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdSgiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdSgidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN2KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNuLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jby5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0mJmdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3UoInNob3ciLDEpLHNsaWRlVXA6Y3UoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN1KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jcnx8Y3MoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjcCYmKGNwPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3J8fGNzKCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3ApLGNwPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykrYS51bml0KX19KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ3JlcChmLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjdz0vXnQoPzphYmxlfGR8aCkkL2ksY3g9L14oPzpib2R5fGh0bWwpJC9pOyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gYy5kb2N1bWVudEVsZW1lbnQ/Zi5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxjO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZCl7fXZhciBlPWIub3duZXJEb2N1bWVudCxnPWUuZG9jdW1lbnRFbGVtZW50O2lmKCFjfHwhZi5jb250YWlucyhnLGIpKXJldHVybiBjP3t0b3A6Yy50b3AsbGVmdDpjLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBoPWUuYm9keSxpPWN5KGUpLGo9Zy5jbGllbnRUb3B8fGguY2xpZW50VG9wfHwwLGs9Zy5jbGllbnRMZWZ0fHxoLmNsaWVudExlZnR8fDAsbD1pLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmcuc2Nyb2xsVG9wfHxoLnNjcm9sbFRvcCxtPWkucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxMZWZ0fHxoLnNjcm9sbExlZnQsbj1jLnRvcCtsLWosbz1jLmxlZnQrbS1rO3JldHVybnt0b3A6bixsZWZ0Om99fTpmLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3ZhciBjLGQ9Yi5vZmZzZXRQYXJlbnQsZT1iLGc9Yi5vd25lckRvY3VtZW50LGg9Zy5kb2N1bWVudEVsZW1lbnQsaT1nLmJvZHksaj1nLmRlZmF1bHRWaWV3LGs9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsPWIub2Zmc2V0VG9wLG09Yi5vZmZzZXRMZWZ0O3doaWxlKChiPWIucGFyZW50Tm9kZSkmJmIhPT1pJiZiIT09aCl7aWYoZi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2M9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsLT1iLnNjcm9sbFRvcCxtLT1iLnNjcm9sbExlZnQsYj09PWQmJihsKz1iLm9mZnNldFRvcCxtKz1iLm9mZnNldExlZnQsZi5zdXBwb3J0LmRvZXNOb3RBZGRCb3JkZXImJighZi5zdXBwb3J0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3cudGVzdChiLm5vZGVOYW1lKSkmJihsKz1wYXJzZUZsb2F0KGMuYm9yZGVyVG9wV2lkdGgpfHwwLG0rPXBhcnNlRmxvYXQoYy5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxlPWQsZD1iLm9mZnNldFBhcmVudCksZi5zdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmYy5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGs9Y31pZihrLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ay5wb3NpdGlvbj09PSJzdGF0aWMiKWwrPWkub2Zmc2V0VG9wLG0rPWkub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCImJihsKz1NYXRoLm1heChoLnNjcm9sbFRvcCxpLnNjcm9sbFRvcCksbSs9TWF0aC5tYXgoaC5zY3JvbGxMZWZ0LGkuc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6bCxsZWZ0Om19fSxmLm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN4LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN4LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9InNjcm9sbCIrYztmLmZuW2RdPWZ1bmN0aW9uKGMpe3ZhciBlLGc7aWYoYz09PWIpe2U9dGhpc1swXTtpZighZSlyZXR1cm4gbnVsbDtnPWN5KGUpO3JldHVybiBnPyJwYWdlWE9mZnNldCJpbiBnP2dbYT8icGFnZVlPZmZzZXQiOiJwYWdlWE9mZnNldCJdOmYuc3VwcG9ydC5ib3hNb2RlbCYmZy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF18fGcuZG9jdW1lbnQuYm9keVtkXTplW2RdfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtnPWN5KHRoaXMpLGc/Zy5zY3JvbGxUbyhhP2YoZykuc2Nyb2xsTGVmdCgpOmMsYT9jOmYoZykuc2Nyb2xsVG9wKCkpOnRoaXNbZF09Y30pfX0pLGYuZWFjaChbIkhlaWdodCIsIldpZHRoIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnRvTG93ZXJDYXNlKCk7Zi5mblsiaW5uZXIiK2NdPWZ1bmN0aW9uKCl7dmFyIGE9dGhpc1swXTtyZXR1cm4gYT9hLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYSxkLCJwYWRkaW5nIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuWyJvdXRlciIrY109ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtyZXR1cm4gYj9iLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYixkLGE/Im1hcmdpbiI6ImJvcmRlciIpKTp0aGlzW2RdKCk6bnVsbH0sZi5mbltkXT1mdW5jdGlvbihhKXt2YXIgZT10aGlzWzBdO2lmKCFlKXJldHVybiBhPT1udWxsP251bGw6dGhpcztpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2NbZF0oYS5jYWxsKHRoaXMsYixjW2RdKCkpKX0pO2lmKGYuaXNXaW5kb3coZSkpe3ZhciBnPWUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2NdLGg9ZS5kb2N1bWVudC5ib2R5O3JldHVybiBlLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmd8fGgmJmhbImNsaWVudCIrY118fGd9aWYoZS5ub2RlVHlwZT09PTkpcmV0dXJuIE1hdGgubWF4KGUuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2NdLGUuYm9keVsic2Nyb2xsIitjXSxlLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIitjXSxlLmJvZHlbIm9mZnNldCIrY10sZS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIrY10pO2lmKGE9PT1iKXt2YXIgaT1mLmNzcyhlLGQpLGo9cGFyc2VGbG9hdChpKTtyZXR1cm4gZi5pc051bWVyaWMoaik/ajppfXJldHVybiB0aGlzLmNzcyhkLHR5cGVvZiBhPT0ic3RyaW5nIj9hOmErInB4Iil9fSksYS5qUXVlcnk9YS4kPWYsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBmfSl9KSh3aW5kb3cpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9uYXZpZ2F0b3ItYnVsbGV0LnBuZyBiL3NyYy9tYWluL3Jlc291cmNlcy9uYXZpZ2F0b3ItYnVsbGV0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ5MGQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL25hdmlnYXRvci1idWxsZXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvdGVzdG5nL2ludGVybmFsL1ZlcnNpb25UZW1wbGF0ZUphdmEgYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL3Rlc3RuZy9pbnRlcm5hbC9WZXJzaW9uVGVtcGxhdGVKYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDNiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL3Rlc3RuZy9pbnRlcm5hbC9WZXJzaW9uVGVtcGxhdGVKYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOworCitwdWJsaWMgY2xhc3MgVmVyc2lvbiB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiQHZlcnNpb25AIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUJhbm5lcigpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLlxuLi4uIFRlc3RORyAiICsgVkVSU0lPTiArICIgYnkgQ8OpZHJpYyBCZXVzdCAoY2VkcmljQGJldXN0LmNvbSlcbi4uLlxuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9wYXNzZWQucG5nIGIvc3JjL21haW4vcmVzb3VyY2VzL3Bhc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlODViYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9wYXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9za2lwcGVkLnBuZyBiL3NyYy9tYWluL3Jlc291cmNlcy9za2lwcGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZhMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL3NraXBwZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmctMS4wLmR0ZCBiL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmctMS4wLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OGI1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3RuZy0xLjAuZHRkCkBAIC0wLDAgKzEsMjExIEBACis8IS0tCisKK0hlcmUgaXMgYSBxdWljayBvdmVydmlldyBvZiB0aGUgbWFpbiBwYXJ0cyBvZiB0aGlzIERURC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLAorcmVmZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly90ZXN0bmcub3JnIj5tYWluIHdlYiBzaXRlPC9hPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQSA8Yj5zdWl0ZTwvYj4gaXMgbWFkZSBvZiA8Yj50ZXN0czwvYj4gYW5kIDxiPnBhcmFtZXRlcnM8L2I+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitBIDxiPnRlc3Q8L2I+IGlzIG1hZGUgb2YgdGhyZWUgcGFydHM6ICAgICAgICAgICAgICAgICAgICAgICAgCisKKzx1bD4KKzxsaT4gPGI+cGFyYW1ldGVyczwvYj4sIHdoaWNoIG92ZXJyaWRlIHRoZSBzdWl0ZSBwYXJhbWV0ZXJzICAgICAKKzxsaT4gPGI+Z3JvdXBzPC9iPiwgbWFkZSBvZiB0d28gcGFydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxsaT4gPGI+Y2xhc3NlczwvYj4sIGRlZmluaW5nIHdoaWNoIGNsYXNzZXMgYXJlIGdvaW5nIHRvIGJlIHBhcnQKKyAgb2YgdGhpcyB0ZXN0IHJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorSW4gdHVybiwgPGI+Z3JvdXBzPC9iPiBhcmUgbWFkZSBvZiB0d28gcGFydHM6ICAgICAgICAgICAgICAgIAorPHVsPgorPGxpPiBEZWZpbml0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIGdyb3VwIGdyb3VwcyBpbnRvICAgCisgIGJpZ2dlciBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxsaT4gUnVucywgd2hpY2ggZGVmaW5lcyB0aGUgZ3JvdXBzIHRoYXQgdGhlIG1ldGhvZHMgICAgIAorICBtdXN0IGJlbG9uZyB0byBpbiBvcmRlciB0byBiZSBydW4gZHVyaW5nIHRoaXMgdGVzdCAgCis8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitDZWRyaWMgQmV1c3QgJiBBbGV4YW5kcnUgUG9wZXNjdSAgICAgICAgICAgICAgICAgICAgICAKK0B0aXRsZSBEVEQgZm9yIFRlc3RORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQHJvb3Qgc3VpdGUKKworLS0+CisKKworPCEtLSBBIHN1aXRlIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhIHRlc3RuZy54bWwgZmlsZSAgICAgICAgICAgICAgICAgIC0tPgorPCFFTEVNRU5UIHN1aXRlIChncm91cHM/LChsaXN0ZW5lcnN8cGFja2FnZXN8dGVzdHxwYXJhbWV0ZXJ8bWV0aG9kLXNlbGVjdG9yc3xzdWl0ZS1maWxlcykqKSA+CisKKzwhLS0gQXR0cmlidXRlczogLS0+Cis8IS0tCitAYXR0ciAgbmFtZSAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBzdWl0ZSAoYXMgaXQgd2lsbCBhcHBlYXIgaW4gdGhlIHJlcG9ydHMpCitAYXR0ciAganVuaXQgICAgICAgV2hldGhlciB0byBydW4gaW4gSlVuaXQgbW9kZS4KK0BhdHRyICB2ZXJib3NlICAgICBIb3cgdmVyYm9zZSB0aGUgb3V0cHV0IG9uIHRoZSBjb25zb2xlIHdpbGwgYmUuICAKKyAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgaGFzIG5vIGltcGFjdCBvbiB0aGUgSFRNTCByZXBvcnRzLgorQGF0dHIgIHBhcmFsbGVsICAgV2hldGhlciBUZXN0Tkcgc2hvdWxkIHVzZSBkaWZmZXJlbnQgdGhyZWFkcworICAgICAgICAgICAgICAgIHRvIHJ1biB5b3VyIHRlc3RzIChtaWdodCBzcGVlZCB1cCB0aGUgcHJvY2VzcykKK0BhdHRyICBwYXJlbnQtbW9kdWxlIEEgbW9kdWxlIHVzZWQgdG8gY3JlYXRlIHRoZSBwYXJlbnQgaW5qZWN0b3Igb2YgYWxsIGd1aWNlIGluamVjdG9ycyB1c2VkCisgICAgICAgaW4gdGVzdHMgb2YgdGhlIHN1aXRlCitAYXR0ciAgZ3VpY2Utc3RhZ2UgVGhlIHN0YWdlIHdpdGggd2hpY2ggdGhlIHBhcmVudCBpbmplY3RvciBpcyBjcmVhdGVkCitAYXR0ciAgY29uZmlnZmFpbHVyZXBvbGljeSAgV2hldGhlciB0byBjb250aW51ZSBhdHRlbXB0aW5nIEJlZm9yZS9BZnRlcgorICAgICAgICAgICAgICAgIENsYXNzL01ldGhvZHMgYWZ0ZXIgdGhleSd2ZSBmYWlsZWQgb25jZSBvciBqdXN0IHNraXAgcmVtYWluaW5nLgorQGF0dHIgIHRocmVhZC1jb3VudCBBbiBpbnRlZ2VyIGdpdmluZyB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wgdG8gdXNlCisgICAgICAgICAgICAgICAgaWYgeW91IHNldCBwYXJhbGxlbC4KK0BhdHRyICBhbm5vdGF0aW9ucyAgSWYgImphdmFkb2MiLCBUZXN0Tkcgd2lsbCBsb29rIGZvcgorICAgICAgICAgICAgICAgIEphdmFEb2MgYW5ub3RhdGlvbnMgaW4geW91ciBzb3VyY2VzLCBvdGhlcndpc2UgaXQgd2lsbAorICAgICAgICAgICAgICAgIHVzZSBKREs1IGFubm90YXRpb25zLgorQGF0dHIgIHRpbWUtb3V0ICAgICBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYWJvcnRpbmcgdGhlCisgICAgICAgICAgICAgICAgbWV0aG9kIChpZiBwYXJhbGxlbD0ibWV0aG9kcyIpIG9yIHRoZSB0ZXN0IChwYXJhbGxlbD0idGVzdHMiKQorQGF0dHIgIHNraXBmYWlsZWRpbnZvY2F0aW9uY291bnRzIFdoZXRoZXIgdG8gc2tpcCBmYWlsZWQgaW52b2NhdGlvbnMuCitAYXR0ciAgZGF0YS1wcm92aWRlci10aHJlYWQtY291bnQgQW4gaW50ZWdlciBnaXZpbmcgdGhlIHNpemUgb2YgdGhlIHRocmVhZCBwb29sIHRvIHVzZQorICAgICAgIGZvciBwYXJhbGxlbCBkYXRhIHByb3ZpZGVycy4KK0BhdHRyICBvYmplY3QtZmFjdG9yeSBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJT2JqZWN0RmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCB0bworICAgICAgIGluc3RhbnRpYXRlIHRoZSB0ZXN0IG9iamVjdHMuCitAYXR0ciBhbGxvdy1yZXR1cm4tdmFsdWVzIElmIHRydWUsIHRlc3RzIHRoYXQgcmV0dXJuIGEgdmFsdWUgd2lsbCBiZSBydW4gYXMgd2VsbAorLS0+Cis8IUFUVExJU1Qgc3VpdGUgCisgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKKyAgICBqdW5pdCAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiCisgICAgdmVyYm9zZSBDREFUQSAjSU1QTElFRAorICAgIHBhcmFsbGVsIChmYWxzZSB8IG1ldGhvZHMgfCB0ZXN0cyB8IGNsYXNzZXMgfCBpbnN0YW5jZXMpICJmYWxzZSIKKyAgICBwYXJlbnQtbW9kdWxlIENEQVRBICNJTVBMSUVECisgICAgZ3VpY2Utc3RhZ2UgKERFVkVMT1BNRU5UIHwgUFJPRFVDVElPTiB8IFRPT0wpICJERVZFTE9QTUVOVCIKKyAgICBjb25maWdmYWlsdXJlcG9saWN5IChza2lwIHwgY29udGludWUpICJza2lwIgorICAgIHRocmVhZC1jb3VudCBDREFUQSAiNSIKKyAgICBhbm5vdGF0aW9ucyBDREFUQSAjSU1QTElFRAorICAgIHRpbWUtb3V0IENEQVRBICNJTVBMSUVECisgICAgc2tpcGZhaWxlZGludm9jYXRpb25jb3VudHMgKHRydWUgfCBmYWxzZSkgImZhbHNlIgorICAgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50IENEQVRBICIxMCIKKyAgICBvYmplY3QtZmFjdG9yeSBDREFUQSAjSU1QTElFRAorICAgIGdyb3VwLWJ5LWluc3RhbmNlcyAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiCisgICAgcHJlc2VydmUtb3JkZXIgKHRydWUgfCBmYWxzZSkgInRydWUiCisgICAgYWxsb3ctcmV0dXJuLXZhbHVlcyAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiCis+CisKKzwhLS0gQSBsaXN0IG9mIFhNTCBmaWxlcyB0aGF0IGNvbnRhaW4gbW9yZSBzdWl0ZSBkZXNjcmlwdGlvbnMgLS0+Cis8IUVMRU1FTlQgc3VpdGUtZmlsZXMgKHN1aXRlLWZpbGUpKiA+CisKKzwhRUxFTUVOVCBzdWl0ZS1maWxlIEFOWSA+Cis8IUFUVExJU1Qgc3VpdGUtZmlsZQorICAgIHBhdGggQ0RBVEEgI1JFUVVJUkVECis+CisKKzwhLS0KK1BhcmFtZXRlcnMgY2FuIGJlIGRlZmluZWQgYXQgdGhlIDxzdWl0ZT4gb3IgYXQgdGhlIDx0ZXN0PiBsZXZlbC4KK1BhcmFtZXRlcnMgZGVmaW5lZCBhdCB0aGUgPHRlc3Q+IGxldmVsIG92ZXJyaWRlIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8c3VpdGU+CitQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGxpbmsgSmF2YSBtZXRob2QgcGFyYW1ldGVycyB0byB0aGVpciBhY3R1YWwgdmFsdWUsIGRlZmluZWQgaGVyZS4KKy0tPgorPCFFTEVNRU5UIHBhcmFtZXRlciBBTlk+Cis8IUFUVExJU1QgcGFyYW1ldGVyCisgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKKyAgICB2YWx1ZSBDREFUQSAjUkVRVUlSRUQgPgorCis8IS0tCitNZXRob2Qgc2VsZWN0b3JzIGRlZmluZSB1c2VyIGNsYXNzZXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbWV0aG9kcyB0byBydW4uCitUaGV5IG5lZWQgdG8gaW1wbGVtZW50IDx0dD5vcmcudGVzdG5nLklNZXRob2RTZWxlY3RvcjwvdHQ+IAorLS0+Cis8IUVMRU1FTlQgbWV0aG9kLXNlbGVjdG9ycyAobWV0aG9kLXNlbGVjdG9yKikgPgorPCFFTEVNRU5UIG1ldGhvZC1zZWxlY3RvciAoKHNlbGVjdG9yLWNsYXNzKSp8c2NyaXB0KSA+Cis8IUVMRU1FTlQgc2VsZWN0b3ItY2xhc3MgQU5ZPgorPCFBVFRMSVNUIHNlbGVjdG9yLWNsYXNzCisgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKKyAgcHJpb3JpdHkgQ0RBVEEgI0lNUExJRUQKKz4KKzwhRUxFTUVOVCBzY3JpcHQgQU5ZPgorPCFBVFRMSVNUIHNjcmlwdAorICAgIGxhbmd1YWdlIENEQVRBICNSRVFVSVJFRAorPgorCis8IS0tCitBIHRlc3QgY29udGFpbnMgcGFyYW1ldGVycyBhbmQgY2xhc3Nlcy4gIEFkZGl0aW9uYWxseSwgeW91IGNhbiBkZWZpbmUgYWRkaXRpb25hbCBncm91cHMgKCJncm91cHMgb2YgZ3JvdXBzIikKKy0tPgorCis8IUVMRU1FTlQgdGVzdCAobWV0aG9kLXNlbGVjdG9ycz8scGFyYW1ldGVyKixncm91cHM/LHBhY2thZ2VzPyxjbGFzc2VzPykgPgorCis8IS0tCitAYXR0ciAgbmFtZSAgICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgdGVzdCAoYXMgaXQgd2lsbCBhcHBlYXIgaW4gdGhlIHJlcG9ydHMpCitAYXR0ciAganVuaXQgICAgICAgIFdoZXRoZXIgdG8gcnVuIGluIEpVbml0IG1vZGUuCitAYXR0ciAgdmVyYm9zZSAgICAgIEhvdyB2ZXJib3NlIHRoZSBvdXRwdXQgb24gdGhlIGNvbnNvbGUgd2lsbCBiZS4KKyAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgaGFzIG5vIGltcGFjdCBvbiB0aGUgSFRNTCByZXBvcnRzLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IHN1aXRlIGxldmVsIHZlcmJvc2UuCitAYXR0ciAgcGFyYWxsZWwgICAgIFdoZXRoZXIgVGVzdE5HIHNob3VsZCB1c2UgZGlmZmVyZW50IHRocmVhZHMKKyAgICAgICAgICAgICAgICB0byBydW4geW91ciB0ZXN0cyAobWlnaHQgc3BlZWQgdXAgdGhlIHByb2Nlc3MpCitAYXR0ciAgdGhyZWFkLWNvdW50IEFuIGludGVnZXIgZ2l2aW5nIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB0byBiZSB1c2VkIGlmCisgICAgICAgICAgICAgICAgcGFyYWxsZWwgbW9kZSBpcyB1c2VkLiBPdmVycmlkZXMgdGhlIHN1aXRlIGxldmVsIHZhbHVlLgorQGF0dHIgIGFubm90YXRpb25zICBJZiAiamF2YWRvYyIsIFRlc3RORyB3aWxsIGxvb2sgZm9yCisgICAgICAgICAgICAgICAgSmF2YURvYyBhbm5vdGF0aW9ucyBpbiB5b3VyIHNvdXJjZXMsIG90aGVyd2lzZSBpdCB3aWxsCisgICAgICAgICAgICAgICAgdXNlIEpESzUgYW5ub3RhdGlvbnMuCitAYXR0ciAgdGltZS1vdXQgICAgIHRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhYm9ydGluZworICAgICAgICAgICAgICAgIHRoZSBtZXRob2QgKGlmIHBhcmFsbGVsPSJtZXRob2RzIikgb3IgdGhlIHRlc3QgKGlmIHBhcmFsbGVsPSJ0ZXN0cyIpCitAYXR0ciAgZW5hYmxlZCAgICAgIGZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY3VycmVudCB0ZXN0LiBEZWZhdWx0IHZhbHVlOiB0cnVlIAorQGF0dHIgIHNraXBmYWlsZWRpbnZvY2F0aW9uY291bnRzIFdoZXRoZXIgdG8gc2tpcCBmYWlsZWQgaW52b2NhdGlvbnMuCitAYXR0ciBwcmVzZXJ2ZS1vcmRlciBJZiB0cnVlLCB0aGUgY2xhc3NlcyBpbiB0aGlzIHRhZyB3aWxsIGJlIHJ1biBpbiB0aGUgc2FtZSBvcmRlciBhcworZm91bmQgaW4gdGhlIFhNTCBmaWxlLgorQGF0dHIgYWxsb3ctcmV0dXJuLXZhbHVlcyBJZiB0cnVlLCB0ZXN0cyB0aGF0IHJldHVybiBhIHZhbHVlIHdpbGwgYmUgcnVuIGFzIHdlbGwKKy0tPgorPCFBVFRMSVNUIHRlc3QKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRCAKKyAgICBqdW5pdCAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiCisgICAgdmVyYm9zZSAgQ0RBVEEgI0lNUExJRUQKKyAgICBwYXJhbGxlbCAgKGZhbHNlIHwgbWV0aG9kcyB8IHRlc3RzIHwgY2xhc3NlcyB8IGluc3RhbmNlcykgI0lNUExJRUQKKyAgICB0aHJlYWQtY291bnQgQ0RBVEEgI0lNUExJRUQKKyAgICBhbm5vdGF0aW9ucyAgQ0RBVEEgI0lNUExJRUQKKyAgICB0aW1lLW91dCBDREFUQSAjSU1QTElFRAorICAgIGVuYWJsZWQgKHRydWUgfCBmYWxzZSkgI0lNUExJRUQKKyAgICBza2lwZmFpbGVkaW52b2NhdGlvbmNvdW50cyAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiCisgICAgcHJlc2VydmUtb3JkZXIgKHRydWUgfCBmYWxzZSkgInRydWUiCisgICAgZ3JvdXAtYnktaW5zdGFuY2VzICh0cnVlIHwgZmFsc2UpICJmYWxzZSIKKyAgICBhbGxvdy1yZXR1cm4tdmFsdWVzICh0cnVlIHwgZmFsc2UpICJmYWxzZSIKKz4KKworPCEtLQorRGVmaW5lcyBhZGRpdGlvbmFsIGdyb3VwcyAoImdyb3VwcyBvZiBncm91cHMiKSBhbmQgYWxzbyB3aGljaCBncm91cHMgdG8gaW5jbHVkZSBpbiB0aGlzIHRlc3QgcnVuCistLT4KKzwhRUxFTUVOVCBncm91cHMgKGRlZmluZSoscnVuPyxkZXBlbmRlbmNpZXM/KSA+CisKKzwhRUxFTUVOVCBkZWZpbmUgKGluY2x1ZGUqKT4KKzwhQVRUTElTVCBkZWZpbmUKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCEtLSBEZWZpbmVzIHdoaWNoIGdyb3VwcyB0byBpbmNsdWRlIGluIHRoZSBjdXJyZW50IGdyb3VwIG9mIGdyb3VwcyAgICAgICAgIC0tPgorPCFFTEVNRU5UIGluY2x1ZGUgQU5ZPgorPCFBVFRMSVNUIGluY2x1ZGUKKyAgICBuYW1lIENEQVRBICNSRVFVSVJFRAorICAgIGRlc2NyaXB0aW9uIENEQVRBICNJTVBMSUVECisgICAgaW52b2NhdGlvbi1udW1iZXJzIENEQVRBICNJTVBMSUVEPgorCis8IS0tIERlZmluZXMgd2hpY2ggZ3JvdXBzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgY3VycmVudCBncm91cCBvZiBncm91cHMgICAgICAgLS0+Cis8IUVMRU1FTlQgZXhjbHVkZSBBTlk+Cis8IUFUVExJU1QgZXhjbHVkZQorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IS0tIFRoZSBzdWJ0YWcgb2YgZ3JvdXBzIHVzZWQgdG8gZGVmaW5lIHdoaWNoIGdyb3VwcyBzaG91bGQgYmUgcnVuICAgICAgICAgLS0+Cis8IUVMRU1FTlQgcnVuIChpbmNsdWRlPyxleGNsdWRlPykqID4KKworPCFFTEVNRU5UIGRlcGVuZGVuY2llcyAoZ3JvdXAqKT4KKworPCFFTEVNRU5UIGdyb3VwIEFOWT4KKzwhQVRUTElTVCBncm91cAorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVECisgICAgZGVwZW5kcy1vbiBDREFUQSAjUkVRVUlSRUQ+CisKKzwhLS0gVGhlIGxpc3Qgb2YgY2xhc3NlcyB0byBpbmNsdWRlIGluIHRoaXMgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhRUxFTUVOVCBjbGFzc2VzIChjbGFzcyoscGFyYW1ldGVyKikgPgorPCFFTEVNRU5UIGNsYXNzIChtZXRob2RzfHBhcmFtZXRlcikqID4KKzwhQVRUTElTVCBjbGFzcworICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEID4KKworPCEtLSBUaGUgbGlzdCBvZiBwYWNrYWdlcyB0byBpbmNsdWRlIGluIHRoaXMgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCFFTEVNRU5UIHBhY2thZ2VzIChwYWNrYWdlKikgPgorPCEtLSBUaGUgcGFja2FnZSBkZXNjcmlwdGlvbi4gCisgICAgIElmIHRoZSBwYWNrYWdlIG5hbWUgZW5kcyB3aXRoIC4qIHRoZW4gc3VicGFja2FnZXMgYXJlIGluY2x1ZGVkIHRvby4KKy0tPgorPCFFTEVNRU5UIHBhY2thZ2UgKGluY2x1ZGU/LGV4Y2x1ZGU/KSo+Cis8IUFUVExJU1QgcGFja2FnZQorICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVEID4KKworPCEtLSBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIGluY2x1ZGUvZXhjbHVkZSBmcm9tIHRoaXMgdGVzdCAgICAgICAgICAgICAgICAgLS0+Cis8IUVMRU1FTlQgbWV0aG9kcyAoaW5jbHVkZT8sZXhjbHVkZT8scGFyYW1ldGVyPykqID4KKworPCEtLSBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBUZXN0TkcgLS0+Cis8IUVMRU1FTlQgbGlzdGVuZXJzIChsaXN0ZW5lciopID4KKworPCFFTEVNRU5UIGxpc3RlbmVyIEFOWT4KKzwhQVRUTElTVCBsaXN0ZW5lcgorICAgIGNsYXNzLW5hbWUgQ0RBVEEgI1JFUVVJUkVEID4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmctcmVwb3J0cy5jc3MgYi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLXJlcG9ydHMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTg4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLXJlcG9ydHMuY3NzCkBAIC0wLDAgKzEsMzA5IEBACitib2R5IHsKKyAgICBtYXJnaW46IDBweCAwcHggNXB4IDVweDsKK30KKwordWwgeworICAgIG1hcmdpbjogMHB4OworfQorCitsaSB7CisgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworfQorCithIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2E6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisubmF2aWdhdG9yLXNlbGVjdGVkIHsKKyAgICBiYWNrZ3JvdW5kOiAjZmZhNTAwOworfQorCisud3JhcHBlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNjBweDsKKyAgICBib3R0b206IDA7CisgICAgbGVmdDogNDAwcHg7CisgICAgcmlnaHQ6IDA7CisgICAgb3ZlcmZsb3c6IGF1dG87Cit9CisKKy5uYXZpZ2F0b3Itcm9vdCB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNjBweDsKKyAgICBib3R0b206IDA7CisgICAgbGVmdDogMDsKKyAgICB3aWR0aDogNDAwcHg7CisgICAgb3ZlcmZsb3cteTogYXV0bzsKK30KKworLnN1aXRlIHsKKyAgICBtYXJnaW46IDBweCAxMHB4IDEwcHggMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY4ZGM7Cit9CisKKy5zdWl0ZS1uYW1lIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgZm9udC1zaXplOiAyNXB4OworICAgIGZvbnQtZmFtaWx5OiBUaW1lczsKK30KKworLm1haW4tcGFuZWwtaGVhZGVyIHsKKyAgICBwYWRkaW5nOiA1cHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzlGQjREOTsgLy9hZmVlZWU7CisgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgICBmb250LXNpemU6IDE4cHg7Cit9CisKKy5tYWluLXBhbmVsLWNvbnRlbnQgeworICAgIHBhZGRpbmc6IDVweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNERUU4RkM7IC8vZDBmZmZmOworfQorCisucm91bmRlZC13aW5kb3cgeworICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CisgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IDFweDsKK30KKworLnJvdW5kZWQtd2luZG93LXRvcCB7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEwcHggMTBweDsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMHB4IDEwcHg7CisgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IDFweDsKKyAgICBvdmVyZmxvdzogYXV0bzsKK30KKworLmxpZ2h0LXJvdW5kZWQtd2luZG93LXRvcCB7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDEwcHggMTBweDsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMHB4IDEwcHg7Cit9CisKKy5yb3VuZGVkLXdpbmRvdy1ib3R0b20geworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiAwcHggMXB4IDFweCAxcHg7CisgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDEwcHggMTBweDsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4IDEwcHg7CisgICAgb3ZlcmZsb3c6IGF1dG87Cit9CisKKy5tZXRob2QtbmFtZSB7CisgICAgZm9udC1zaXplOiAxMnB4OworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKKy5tZXRob2QtY29udGVudCB7CisgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IDBweCAwcHggMXB4IDBweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMDsKKyAgICBwYWRkaW5nLWJvdHRvbTogNXB4OworICAgIHdpZHRoOiA4MCU7Cit9CisKKy5wYXJhbWV0ZXJzIHsKKyAgICBmb250LXNpemU6IDE0cHg7CisgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKworLnN0YWNrLXRyYWNlIHsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgICAgZm9udC1zaXplOiAxMnB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbi10b3A6IDBweDsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKK30KKworLnRlc3RuZy14bWwgeworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKKy5tZXRob2QtbGlzdC1jb250ZW50IHsKKyAgICBtYXJnaW4tbGVmdDogMTBweDsKK30KKworLm5hdmlnYXRvci1zdWl0ZS1jb250ZW50IHsKKyAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICBmb250OiAxMnB4ICdMdWNpZGEgR3JhbmRlJzsKK30KKworLnN1aXRlLXNlY3Rpb24tdGl0bGUgeworICAgIG1hcmdpbi10b3A6IDEwcHg7CisgICAgd2lkdGg6IDgwJTsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworICAgIGJvcmRlci13aWR0aDogMXB4IDBweCAwcHggMHB4OworICAgIGZvbnQtZmFtaWx5OiBUaW1lczsKKyAgICBmb250LXNpemU6IDE4cHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5zdWl0ZS1zZWN0aW9uLWNvbnRlbnQgeworICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IHVybChidWxsZXRfcG9pbnQucG5nKTsKK30KKworLnRvcC1iYW5uZXItcm9vdCB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKKyAgICBoZWlnaHQ6IDQ1cHg7CisgICAgbGVmdDogMDsKKyAgICByaWdodDogMDsKKyAgICBwYWRkaW5nOiA1cHg7CisgICAgbWFyZ2luOiAwcHggMHB4IDVweCAwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjZmZjsKKyAgICBmb250LWZhbWlseTogVGltZXM7CisgICAgY29sb3I6ICNmZmY7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisudG9wLWJhbm5lci10aXRsZS1mb250IHsKKyAgICBmb250LXNpemU6IDI1cHg7Cit9CisKKy50ZXN0LW5hbWUgeworICAgIGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7CisgICAgZm9udC1zaXplOiAxNnB4OworfQorCisuc3VpdGUtaWNvbiB7CisgICAgcGFkZGluZzogNXB4OworICAgIGZsb2F0OiByaWdodDsKKyAgICBoZWlnaHQ6IDIwOworfQorCisudGVzdC1ncm91cCB7CisgICAgZm9udDogMjBweCAnTHVjaWRhIEdyYW5kZSc7CisgICAgbWFyZ2luOiA1cHggNXB4IDEwcHggNXB4OworICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgcGFkZGluZzogNXB4OworfQorCisudGVzdC1ncm91cC1uYW1lIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworLm1ldGhvZC1pbi1ncm91cCB7CisgICAgZm9udC1zaXplOiAxNnB4OworICAgIG1hcmdpbi1sZWZ0OiA4MHB4OworfQorCit0YWJsZS5nb29nbGUtdmlzdWFsaXphdGlvbi10YWJsZS10YWJsZSB7CisgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5yZXBvcnRlci1tZXRob2QtbmFtZSB7CisgICAgZm9udC1zaXplOiAxNHB4OworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKKy5yZXBvcnRlci1tZXRob2Qtb3V0cHV0LWRpdiB7CisgICAgcGFkZGluZzogNXB4OworICAgIG1hcmdpbjogMHB4IDBweCA1cHggMjBweDsKKyAgICBmb250LXNpemU6IDEycHg7CisgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgICBib3JkZXItd2lkdGg6IDBweCAwcHggMHB4IDFweDsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworfQorCisuaWdub3JlZC1jbGFzcy1kaXYgeworICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorCisuaWdub3JlZC1tZXRob2RzLWRpdiB7CisgICAgcGFkZGluZzogNXB4OworICAgIG1hcmdpbjogMHB4IDBweCA1cHggMjBweDsKKyAgICBmb250LXNpemU6IDEycHg7CisgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgICBib3JkZXItd2lkdGg6IDBweCAwcHggMHB4IDFweDsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworfQorCisuYm9yZGVyLWZhaWxlZCB7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTBweCAxMHB4OworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHggMTBweDsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAwcHggMTBweDsKKyAgICBib3JkZXItY29sb3I6ICNmMDA7Cit9CisKKy5ib3JkZXItc2tpcHBlZCB7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTBweCAxMHB4OworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHggMTBweDsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAwcHggMTBweDsKKyAgICBib3JkZXItY29sb3I6ICNlZGM2MDA7Cit9CisKKy5ib3JkZXItcGFzc2VkIHsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMHB4IDEwcHg7CisgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTBweCAxMHB4OworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDBweCAxMHB4OworICAgIGJvcmRlci1jb2xvcjogIzE5ZjUyZDsKK30KKworLnRpbWVzLWRpdiB7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHBhZGRpbmc6IDVweDsKK30KKworLnN1aXRlLXRvdGFsLXRpbWUgeworICAgIGZvbnQ6IDE2cHggJ0x1Y2lkYSBHcmFuZGUnOworfQorCisuY29uZmlndXJhdGlvbi1zdWl0ZSB7CisgICAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKy5jb25maWd1cmF0aW9uLXRlc3QgeworICAgIG1hcmdpbi1sZWZ0OiA0MHB4OworfQorCisuY29uZmlndXJhdGlvbi1jbGFzcyB7CisgICAgbWFyZ2luLWxlZnQ6IDYwcHg7Cit9CisKKy5jb25maWd1cmF0aW9uLW1ldGhvZCB7CisgICAgbWFyZ2luLWxlZnQ6IDgwcHg7Cit9CisKKy50ZXN0LW1ldGhvZCB7CisgICAgbWFyZ2luLWxlZnQ6IDEwMHB4OworfQorCisuY2hyb25vbG9naWNhbC1jbGFzcyB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzBjY2ZmOworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweCAxcHg7Cit9CisKKy5tZXRob2Qtc3RhcnQgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLmNocm9ub2xvZ2ljYWwtY2xhc3MtbmFtZSB7CisgICAgcGFkZGluZzogMHB4IDBweCAwcHggNXB4OworICAgIGNvbG9yOiAjMDA4OworfQorCisuYWZ0ZXIsIC5iZWZvcmUsIC50ZXN0LW1ldGhvZCB7CisgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgICBmb250LXNpemU6IDE0cHg7Cit9CisKKy5uYXZpZ2F0b3Itc3VpdGUtaGVhZGVyIHsKKyAgICBmb250LXNpemU6IDIycHg7CisgICAgbWFyZ2luOiAwcHggMTBweCA1cHggMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWI4ODc7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisuY29sbGFwc2UtYWxsLWljb24geworICAgIHBhZGRpbmc6IDVweDsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLXJlcG9ydHMuanMgYi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLXJlcG9ydHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1OWY4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmctcmVwb3J0cy5qcwpAQCAtMCwwICsxLDEyMiBAQAorJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgJCgnYS5uYXZpZ2F0b3ItbGluaycpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBFeHRyYWN0IHRoZSBwYW5lbCBmb3IgdGhpcyBsaW5rCisgICAgICAgIHZhciBwYW5lbCA9IGdldFBhbmVsTmFtZSgkKHRoaXMpKTsKKworICAgICAgICAvLyBNYXJrIHRoaXMgbGluayBhcyBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgJCgnLm5hdmlnYXRvci1saW5rJykucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ25hdmlnYXRvci1zZWxlY3RlZCcpOworICAgICAgICAkKHRoaXMpLnBhcmVudCgpLmFkZENsYXNzKCduYXZpZ2F0b3Itc2VsZWN0ZWQnKTsKKworICAgICAgICBzaG93UGFuZWwocGFuZWwpOworICAgIH0pOworCisgICAgaW5zdGFsbE1ldGhvZEhhbmRsZXJzKCdmYWlsZWQnKTsKKyAgICBpbnN0YWxsTWV0aG9kSGFuZGxlcnMoJ3NraXBwZWQnKTsKKyAgICBpbnN0YWxsTWV0aG9kSGFuZGxlcnMoJ3Bhc3NlZCcsIHRydWUpOyAvLyBoaWRlIHBhc3NlZCBtZXRob2RzIGJ5IGRlZmF1bHQKKworICAgICQoJ2EubWV0aG9kJykuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgIHNob3dNZXRob2QoJCh0aGlzKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KTsKKworICAgIC8vIEhpZGUgYWxsIHRoZSBwYW5lbHMgYW5kIGRpc3BsYXkgdGhlIGZpcnN0IG9uZSAoZG8gdGhpcyBsYXN0CisgICAgLy8gdG8gbWFrZSBzdXJlIHRoZSBjbGljaygpIHdpbGwgaW52b2tlIHRoZSBsaXN0ZW5lcnMpCisgICAgJCgnLnBhbmVsJykuaGlkZSgpOworICAgICQoJy5uYXZpZ2F0b3ItbGluaycpLmZpcnN0KCkuY2xpY2soKTsKKworICAgIC8vIENvbGxhcHNlL2V4cGFuZCB0aGUgc3VpdGVzCisgICAgJCgnYS5jb2xsYXBzZS1hbGwtbGluaycpLmNsaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgY29udGVudHMgPSAkKCcubmF2aWdhdG9yLXN1aXRlLWNvbnRlbnQnKTsKKyAgICAgICAgaWYgKGNvbnRlbnRzLmNzcygnZGlzcGxheScpID09ICdub25lJykgeworICAgICAgICAgICAgY29udGVudHMuc2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudHMuaGlkZSgpOworICAgICAgICB9CisgICAgfSk7Cit9KTsKKworLy8gVGhlIGhhbmRsZXJzIHRoYXQgdGFrZSBjYXJlIG9mIHNob3dpbmcvaGlkaW5nIHRoZSBtZXRob2RzCitmdW5jdGlvbiBpbnN0YWxsTWV0aG9kSGFuZGxlcnMobmFtZSwgaGlkZSkgeworICAgIGZ1bmN0aW9uIGdldENvbnRlbnQodCkgeworICAgIHJldHVybiAkKCcubWV0aG9kLWxpc3QtY29udGVudC4nICsgbmFtZSArICIuIiArIHQuYXR0cigncGFuZWwtbmFtZScpKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBnZXRIaWRlTGluayh0LCBuYW1lKSB7CisgICAgICAgIHZhciBzID0gJ2EuaGlkZS1tZXRob2RzLicgKyBuYW1lICsgIi4iICsgdC5hdHRyKCdwYW5lbC1uYW1lJyk7CisgICAgICAgIHJldHVybiAkKHMpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGdldFNob3dMaW5rKHQsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICQoJ2Euc2hvdy1tZXRob2RzLicgKyBuYW1lICsgIi4iICsgdC5hdHRyKCdwYW5lbC1uYW1lJykpOworICAgIH0KKworICAgIGZ1bmN0aW9uIGdldE1ldGhvZFBhbmVsQ2xhc3NTZWwoZWxlbWVudCwgbmFtZSkgeworICAgICAgICB2YXIgcGFuZWxOYW1lID0gZ2V0UGFuZWxOYW1lKGVsZW1lbnQpOworICAgIHZhciBzZWwgPSAnLicgKyBwYW5lbE5hbWUgKyAiLWNsYXNzLSIgKyBuYW1lOworICAgICAgICByZXR1cm4gJChzZWwpOworICAgIH0KKworICAgICQoJ2EuaGlkZS1tZXRob2RzLicgKyBuYW1lKS5jbGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHcgPSBnZXRDb250ZW50KCQodGhpcykpOworICAgICAgICB3LmhpZGUoKTsKKyAgICAgICAgZ2V0SGlkZUxpbmsoJCh0aGlzKSwgbmFtZSkuaGlkZSgpOworICAgICAgICBnZXRTaG93TGluaygkKHRoaXMpLCBuYW1lKS5zaG93KCk7CisgICAgZ2V0TWV0aG9kUGFuZWxDbGFzc1NlbCgkKHRoaXMpLCBuYW1lKS5oaWRlKCk7CisgICAgfSk7CisKKyAgICAkKCdhLnNob3ctbWV0aG9kcy4nICsgbmFtZSkuY2xpY2soZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciB3ID0gZ2V0Q29udGVudCgkKHRoaXMpKTsKKyAgICAgICAgdy5zaG93KCk7CisgICAgICAgIGdldEhpZGVMaW5rKCQodGhpcyksIG5hbWUpLnNob3coKTsKKyAgICAgICAgZ2V0U2hvd0xpbmsoJCh0aGlzKSwgbmFtZSkuaGlkZSgpOworICAgIHNob3dQYW5lbChnZXRQYW5lbE5hbWUoJCh0aGlzKSkpOworICAgIGdldE1ldGhvZFBhbmVsQ2xhc3NTZWwoJCh0aGlzKSwgbmFtZSkuc2hvdygpOworICAgIH0pOworCisgICAgaWYgKGhpZGUpIHsKKyAgICAgICAgJCgnYS5oaWRlLW1ldGhvZHMuJyArIG5hbWUpLmNsaWNrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJCgnYS5zaG93LW1ldGhvZHMuJyArIG5hbWUpLmNsaWNrKCk7CisgICAgfQorfQorCitmdW5jdGlvbiBnZXRIYXNoRm9yTWV0aG9kKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gZWxlbWVudC5hdHRyKCdoYXNoLWZvci1tZXRob2QnKTsKK30KKworZnVuY3Rpb24gZ2V0UGFuZWxOYW1lKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gZWxlbWVudC5hdHRyKCdwYW5lbC1uYW1lJyk7Cit9CisKK2Z1bmN0aW9uIHNob3dQYW5lbChwYW5lbE5hbWUpIHsKKyAgICAkKCcucGFuZWwnKS5oaWRlKCk7CisgICAgdmFyIHBhbmVsID0gJCgnLnBhbmVsW3BhbmVsLW5hbWU9IicgKyBwYW5lbE5hbWUgKyAnIl0nKTsKKyAgICBwYW5lbC5zaG93KCk7Cit9CisKK2Z1bmN0aW9uIHNob3dNZXRob2QoZWxlbWVudCkgeworICAgIHZhciBoYXNoVGFnID0gZ2V0SGFzaEZvck1ldGhvZChlbGVtZW50KTsKKyAgICB2YXIgcGFuZWxOYW1lID0gZ2V0UGFuZWxOYW1lKGVsZW1lbnQpOworICAgIHNob3dQYW5lbChwYW5lbE5hbWUpOworICAgIHZhciBjdXJyZW50ID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsKKyAgICB2YXIgYmFzZSA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIGN1cnJlbnQuaW5kZXhPZignIycpKQorICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSBiYXNlICsgJyMnICsgaGFzaFRhZzsKKyAgICB2YXIgbmV3UG9zaXRpb24gPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSAtIDY1OworICAgICQoZG9jdW1lbnQpLnNjcm9sbFRvcChuZXdQb3NpdGlvbik7Cit9CisKK2Z1bmN0aW9uIGRyYXdUYWJsZSgpIHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1aXRlVGFibGVJbml0RnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHdpbmRvd1tzdWl0ZVRhYmxlSW5pdEZ1bmN0aW9uc1tpXV0oKTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBrIGluIHdpbmRvdy5zdWl0ZVRhYmxlRGF0YSkgeworICAgICAgICB2YXIgdiA9IHdpbmRvdy5zdWl0ZVRhYmxlRGF0YVtrXTsKKyAgICAgICAgdmFyIGRpdiA9IHYudGFibGVEaXY7CisgICAgICAgIHZhciBkYXRhID0gdi50YWJsZURhdGEKKyAgICAgICAgdmFyIHRhYmxlID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdikpOworICAgICAgICB0YWJsZS5kcmF3KGRhdGEsIHsKKyAgICAgICAgICAgIHNob3dSb3dOdW1iZXIgOiBmYWxzZQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLmNzcyBiL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmcuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDQ4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLmNzcwpAQCAtMCwwICsxLDkgQEAKKy5pbnZvY2F0aW9uLWZhaWxlZCwgIC50ZXN0LWZhaWxlZCAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjREQwMDAwOyB9DQorLmludm9jYXRpb24tcGVyY2VudCwgLnRlc3QtcGVyY2VudCB7IGJhY2tncm91bmQtY29sb3I6ICMwMDY2MDA7IH0NCisuaW52b2NhdGlvbi1wYXNzZWQsICAudGVzdC1wYXNzZWQgIHsgYmFja2dyb3VuZC1jb2xvcjogIzAwQUEwMDsgfQ0KKy5pbnZvY2F0aW9uLXNraXBwZWQsIC50ZXN0LXNraXBwZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzAwOyB9DQorDQorLm1haW4tcGFnZSB7DQorICBmb250LXNpemU6IHgtbGFyZ2U7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmd0YXNrcyBiL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0bmd0YXNrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWVhODZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3RuZ3Rhc2tzCkBAIC0wLDAgKzEgQEAKK3Rlc3RuZz1vcmcudGVzdG5nLlRlc3ROR0FudFRhc2sKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvQ29udmVydGVyU2FtcGxlMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS9Db252ZXJ0ZXJTYW1wbGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjNjVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvQ29udmVydGVyU2FtcGxlMi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8vIE5vdCB0aGF0IHRoaXMgZmlsZSBoYXMgbm8gcGFja2FnZSAodGhhdCdzIHdoYXQgd2UgYXJlIHRlc3RpbmcpIGFuZCB0aGVyZWZvcmUsCisvLyBpdCBpcyBhdCB0aGUgd3JvbmcgbG9jYXRpb24sIGJ1dCBpdCdzIGVhc2llciB0byBsZWF2ZSBpdCBoZXJlLgorLy8gQWxzbywgZG8gbm90IGNoYW5nZSB0aGUgbGluZSBudW1iZXJzIHNpbmNlIHRoZSB0ZXN0IHdpbGwgbWFrZSBzdXJlCisvLyB0aGF0IHRoZSB0YWdzIGFyZSBnZW5lcmF0ZWQgaW4gaGFyZGNvZGVkIGxpbmUgbnVtYmVycworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBDb252ZXJ0ZXJTYW1wbGUyIGV4dGVuZHMgVGVzdENhc2UgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDbGFzc0p1bml0KCkgeworICAgIH0KKworCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldENsYXNzSWQoKSB7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNldENsYXNzTmFtZSgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvQ29udmVydGVyU2FtcGxlNC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9Db252ZXJ0ZXJTYW1wbGU0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzYzJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvQ29udmVydGVyU2FtcGxlNC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKw0KKy8qDQorICogQ3JlYXRlZCBvbiAxMi1TZXAtMjAwNiBieSBtaWNoZWIxMA0KKyAqIGl0IGlzIGF0IHRoZSB3cm9uZyBsb2NhdGlvbiwgYnV0IGl0J3MgZWFzaWVyIHRvIGxlYXZlIGl0IGhlcmUuDQorICogQWxzbywgZG8gbm90IGNoYW5nZSB0aGUgbGluZSBudW1iZXJzIHNpbmNlIHRoZSB0ZXN0IHdpbGwgbWFrZSBzdXJlDQorICogdGhhdCB0aGUgdGFncyBhcmUgZ2VuZXJhdGVkIGluIGhhcmRjb2RlZCBsaW5lIG51bWJlcnMNCisgKi8NCisNCisvKioNCisgKiBTYW1wbGUgZmlsZSBmb3IgdGhlIEphdmFkb2N2IGFubm90YXRpb25zIHRvIEphdmEgNSBhbm5vdGF0aW9ucyBjb252ZXJ0ZXIgZm9yIHRoZSBkZWZhdWx0IHBhY2thZ2UNCisgKiBAYXV0aG9yIG1pY2hlYjEwIDEyLVNlcC0yMDA2DQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29udmVydGVyU2FtcGxlNCB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbW1lbnQgbGluZSBzaG91bGQgYmUgcHJlc2VydmVkDQorCSAqIEB0ZXN0bmcuYmVmb3JlLXN1aXRlIGFsd2F5c1J1biA9ICJ0cnVlIg0KKwkgKi8NCisJcHVibGljIHZvaWQgYmVmb3JlU3VpdGVBbHdheXNSdW4oKSB7DQorCQkvLyBXZSBhcmUganVzdCBjaGVja2luZyBhcHByb3ByaWF0ZSBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBib2R5DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcudGVzdA0KKwkgKi8NCisJcHVibGljIHZvaWQgcGxhaW5UZXN0KCkgew0KKwkJLy8gRW1wdHkgYm9keQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAdGVzdG5nLnRlc3QNCisJICogQHRlc3RuZy5leHBlY3RlZC1leGNlcHRpb25zDQorCSAqIHZhbHVlID0gImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBqYXZhLmxhbmcuTnVtYmVyRm9ybWF0RXhjZXB0aW9uIg0KKwkgKi8NCisJcHVibGljIHZvaWQgZXhwZWN0ZWRFeGNlcHRpb25zKCkgew0KKwkJLy8gRW1wdHkgYm9keQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAdGVzdG5nLnRlc3QgZ3JvdXBzID0gImdyb3VwQSBncm91cEIiDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0R3JvdXBzKCkgew0KKwkJLy8gRW1wdHkgYm9keQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAdGVzdG5nLmFmdGVyLW1ldGhvZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7DQorCQkvLyBFbXB0eSBib2R5DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2V5IHNob3VsZCBiZSBwcmVzZXJ2ZWQNCisJICogQGF1dGhvciBUaGUgYXV0aG9yIGlzIGEgc3RhbmRhcmQgdGFnIGFuZCBzaG91bGQgbm90IGJlIHRvdWNoZWQNCisJICogQHRlc3RuZy50ZXN0IGdyb3VwcyA9ICJncm91cEEiDQorCSAqIAkJZGVwZW5kc09uTWV0aG9kcyA9ICJleHBlY3RlZEV4Y2VwdGlvbnMiIHRpbWVPdXQ9IjMwMDAiIHVucmVjb2duaXNlZD0iZnV0dXJlUHJvb2YiDQorCSAqIEB2ZXJzaW9uIGFub3RoZXIgc3RhbmRhcmQgdGFnIHNob3VsZCBub3QgYmUgY2hhbmdlZA0KKwkgKiBAdGVzdG5nLmV4cGVjdGVkLWV4Y2VwdGlvbnMNCisJICogdmFsdWUgPSAiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb24iDQorCSAqDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0RXZlcnl0aGluZygpIHsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQHRlc3RuZy5kYXRhLXByb3ZpZGVyIG5hbWU9InRlc3QxIg0KKwkgKi8NCisJcHVibGljIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcuZmFjdG9yeQ0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQiLCAiZGVwcmVjYXRpb24ifSkNCisJcHVibGljIE9iamVjdFtdIGZhY3RvcnkoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL05vUGFja2FnZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvTm9QYWNrYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGE3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL05vUGFja2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIEZpbGlwcG8gRGlvdGFsZXZpCisgKi8KK3B1YmxpYyBjbGFzcyBOb1BhY2thZ2VUZXN0IHsKKwlwcml2YXRlIGJvb2xlYW4gbV9ydW4gPSBmYWxzZTsKKworCUBUZXN0KGdyb3VwcyA9IHsibm9wYWNrYWdlIn0pCisJcHVibGljIHZvaWQgdGVzdCgpIHsKKwkgICBtX3J1biA9IHRydWU7CisJfQorCisgICBAQWZ0ZXJNZXRob2QoZ3JvdXBzID0geyJub3BhY2thZ2UifSkKKyAgIHB1YmxpYyB2b2lkIGFmdGVyKCkgeworICAgICAgYXNzZXJ0IG1fcnVuIDogInRlc3QgbWV0aG9kIHdhcyBub3QgcnVuIjsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9Bc3NlcnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvQXNzZXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWZiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvQXNzZXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACitwYWNrYWdlIG9yZy50ZXN0bmc7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLlNldHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBc3NlcnRUZXN0IHsNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBudWxsT2JqZWN0QXJyYXlBc3NlcnRFcXVhbHMoKSB7DQorICAgIE9iamVjdFtdIGV4cGVjdGVkPSBudWxsOw0KKyAgICBPYmplY3RbXSBhY3R1YWw9IG51bGw7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbnVsbE9iamVjdEFycmF5QXNzZXJ0Tm9PcmRlcigpIHsNCisgICAgT2JqZWN0W10gZXhwZWN0ZWQ9IG51bGw7DQorICAgIE9iamVjdFtdIGFjdHVhbD0gbnVsbDsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbnVsbENvbGxlY3Rpb25Bc3NlcnRFcXVhbHMoKSB7DQorICAgIENvbGxlY3Rpb24gZXhwZWN0ZWQgPSBudWxsOw0KKyAgICBDb2xsZWN0aW9uIGFjdHVhbCA9IG51bGw7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbnVsbFNldEFzc2VydEVxdWFscygpIHsNCisgICAgU2V0IGV4cGVjdGVkID0gbnVsbDsNCisgICAgU2V0IGFjdHVhbCA9IG51bGw7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbnVsbE1hcEFzc2VydEVxdWFscygpIHsNCisgICAgTWFwIGV4cGVjdGVkID0gbnVsbDsNCisgICAgTWFwIGFjdHVhbCA9IG51bGw7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgc2V0QXNzZXJ0RXF1YWxzKCkgew0KKyAgICBTZXQgZXhwZWN0ZWQgPSBTZXRzLm5ld0hhc2hTZXQoKTsNCisgICAgU2V0IGFjdHVhbCA9IFNldHMubmV3SGFzaFNldCgpOw0KKw0KKyAgICBleHBlY3RlZC5hZGQoMSk7DQorICAgIGV4cGVjdGVkLmFkZCgiYSIpOw0KKyAgICBhY3R1YWwuYWRkKCJhIik7DQorICAgIGFjdHVhbC5hZGQoMSk7DQorDQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbWFwQXNzZXJ0RXF1YWxzKCkgew0KKyAgICBNYXAgZXhwZWN0ZWQgPSBNYXBzLm5ld0hhc2hNYXAoKTsNCisgICAgTWFwIGFjdHVhbCA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKw0KKyAgICBleHBlY3RlZC5wdXQobnVsbCwgImEiKTsNCisgICAgZXhwZWN0ZWQucHV0KCJhIiwgImEiKTsNCisgICAgZXhwZWN0ZWQucHV0KCJiIiwgImMiKTsNCisgICAgYWN0dWFsLnB1dCgiYiIsICJjIik7DQorICAgIGFjdHVhbC5wdXQobnVsbCwgImEiKTsNCisgICAgYWN0dWFsLnB1dCgiYSIsICJhIik7DQorDQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgb25lTnVsbE1hcEFzc2VydEVxdWFscygpIHsNCisgICAgTWFwIGV4cGVjdGVkID0gTWFwcy5uZXdIYXNoTWFwKCk7DQorICAgIE1hcCBhY3R1YWwgPSBudWxsOw0KKyAgICB0cnkgew0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICAgICAgQXNzZXJ0LmZhaWwoIkFzc2VydEVxdWFscyBkaWRuJ3QgZmFpbCIpOw0KKyAgICB9DQorICAgIGNhdGNoIChBc3NlcnRpb25FcnJvciBlcnJvcikgew0KKyAgICAgIC8vZG8gbm90aGluZw0KKyAgICB9DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgb25lTnVsbFNldEFzc2VydEVxdWFscygpIHsNCisgICAgU2V0IGV4cGVjdGVkID0gbnVsbDsNCisgICAgU2V0IGFjdHVhbCA9IFNldHMubmV3SGFzaFNldCgpOw0KKyAgICB0cnkgew0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCk7DQorICAgICAgQXNzZXJ0LmZhaWwoIkFzc2VydEVxdWFscyBkaWRuJ3QgZmFpbCIpOw0KKyAgICB9DQorICAgIGNhdGNoIChBc3NlcnRpb25FcnJvciBlcnJvcikgew0KKyAgICAgIC8vZG8gbm90aGluZw0KKyAgICB9DQorICB9DQorDQorICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsc01hcFNob3VsZEZhaWwoKSB7DQorICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwQWN0dWFsID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sNCisgICAgICBwdXQoImEiLCIxIik7DQorICAgIH19Ow0KKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcEV4cGVjdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sNCisgICAgICBwdXQoImEiLCIxIik7DQorICAgICAgcHV0KCJiIiwiMiIpOw0KKyAgICB9fTsNCisNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtYXBBY3R1YWwsIG1hcEV4cGVjdGVkKTsNCisgIH0NCisNCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQ0KKyAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzU3ltbWV0cmljU2NhbGFyKCkgew0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBBc3ltbWV0cmljKDQyLCAnZCcpLCBuZXcgQ29udHJpdmVkKDQyKSk7DQorICB9DQorDQorICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsc1N5bW1ldHJpY0FycmF5cygpIHsNCisgICAgT2JqZWN0W10gYWN0dWFsID0gezEsIG5ldyBBc3ltbWV0cmljKDQyLCAnZCcpLCAiaW5EYXkifTsNCisgICAgT2JqZWN0W10gZXhwZWN0ZWQgPSB7MSwgbmV3IENvbnRyaXZlZCg0MiksICJpbkRheSJ9Ow0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQpOw0KKyAgfQ0KKw0KKyAgY2xhc3MgQ29udHJpdmVkIHsNCisNCisgICAgaW50IGludGVnZXI7DQorDQorICAgIENvbnRyaXZlZChpbnQgaW50ZWdlcil7DQorICAgICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7DQorICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7DQorICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbnRyaXZlZCkpIHJldHVybiBmYWxzZTsNCisNCisgICAgICBDb250cml2ZWQgY29udHJpdmVkID0gKENvbnRyaXZlZCkgbzsNCisNCisgICAgICBpZiAoaW50ZWdlciAhPSBjb250cml2ZWQuaW50ZWdlcikgcmV0dXJuIGZhbHNlOw0KKw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgIHJldHVybiBpbnRlZ2VyOw0KKyAgICB9DQorICB9DQorDQorICBjbGFzcyBBc3ltbWV0cmljIGV4dGVuZHMgQ29udHJpdmVkIHsNCisNCisgICAgICBjaGFyIGNoYXJhY3RlcjsNCisNCisgICAgICBBc3ltbWV0cmljKGludCBpbnRlZ2VyLCBjaGFyIGNoYXJhY3Rlcikgew0KKyAgICAgICAgICBzdXBlcihpbnRlZ2VyKTsNCisgICAgICAgICAgdGhpcy5jaGFyYWN0ZXIgPSBjaGFyYWN0ZXI7DQorICAgICAgfQ0KKw0KKyAgICAgIEBPdmVycmlkZQ0KKyAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KKyAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEFzeW1tZXRyaWMpKSByZXR1cm4gZmFsc2U7DQorICAgICAgICAgIGlmICghc3VwZXIuZXF1YWxzKG8pKSByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICAgIEFzeW1tZXRyaWMgdGhhdCA9IChBc3ltbWV0cmljKSBvOw0KKw0KKyAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9IHRoYXQuY2hhcmFjdGVyKSByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisNCisgICAgICBAT3ZlcnJpZGUNCisgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsNCisgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoaW50KSBjaGFyYWN0ZXI7DQorICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kSW5zdGFuY2VUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvTWV0aG9kSW5zdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxYmM2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9NZXRob2RJbnN0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDU2NiBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLklDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5JUmV0cnlBbmFseXplcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQorLyoqDQorICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIE1ldGhvZEluc3RhbmNlfS4NCisgKg0KKyAqIEBhdXRob3IgQW5kcmVhcyBLbHV0aA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNZXRob2RJbnN0YW5jZVRlc3Qgew0KKw0KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KKyAgICBuZXcgTWV0aG9kSW5zdGFuY2VUZXN0KCkuc29ydEJ5SW5kZXhTYXRpc2ZpZXNDb250cmFjdCgpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHNvcnRCeUluZGV4U2F0aXNmaWVzQ29udHJhY3QoKSB7DQorDQorICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBlbnRyaWVzIGltcG9zaW5nIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBsaXZlIHN1aXRlLCByZWR1Y2VkIHRvIHRoZQ0KKyAgICAvLyBtaW5pbXVtIHRvIGNyZWF0ZSB0aGUgc2FtZSBjb25kaXRpb24uDQorICAgIExpc3Q8TWV0aG9kSW5zdGFuY2U+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIlN0YXRlVGVzdCIsIDEsICJhQ2F0ZWdvcml6YXRpb24iKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJTdGF0ZVRlc3QiLCAxLCAiYkNhdGVnb3JpemF0aW9uIikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiU3RhdGVUZXN0IiwgMSwgImNDYXRlZ29yaXphdGlvbiIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIlN0YXRlVGVzdCIsIDEsICJkQ2F0ZWdvcml6YXRpb24iKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJTdGF0ZVRlc3QiLCAxLCAiZUNhdGVnb3JpemF0aW9uIikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiU3RhdGVUZXN0IiwgMSwgImZDYXRlZ29yaXphdGlvbiIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIlN0YXR1c1Rlc3QiLCAyLCAiYVN0YXR1cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIkNoYW5nZVRlc3QiLCAzLCAiYUNoYW5nZVRlc3QiKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJDaGFuZ2VUZXN0IiwgMywgImJDaGFuZ2VUZXN0IikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiQ2hhbmdlVGVzdCIsIDMsICJjQ2hhbmdlVGVzdCIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIkNoYW5nZVRlc3QiLCAzLCAiZENoYW5nZVRlc3QiKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJDaGFuZ2VUZXN0IiwgMywgImVDaGFuZ2VUZXN0IikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiQ2hhbmdlVGVzdCIsIDMsICJmQ2hhbmdlVGVzdCIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIkNoYW5nZVRlc3QiLCAzLCAiZ0NoYW5nZVRlc3QiKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJDaGFuZ2VUZXN0IiwgMywgImVDaGFuZ2VUZXN0IikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiQ2hhbmdlVGVzdCIsIDMsICJoQ2hhbmdlVGVzdCIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIkNoYW5nZVRlc3QiLCAzLCAiaUNoYW5nZVRlc3QiKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJJZGVudGlmaWVyQ2xhc3NUZXN0IiwgNCwgImFJZGVudGlmaWVyIikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiSWRlbnRpZmllckNsYXNzVGVzdCIsIDQsICJiSWRlbnRpZmllciIpKTsNCisgICAgbWV0aG9kcy5hZGQoYnVpbGRNZXRob2RJbnN0YW5jZSgidW5pdHRlc3RzIiwgIlN0YXRpc3RpY3NUZXN0IiwgMCwgImFTdGF0aXN0aWNzIikpOw0KKyAgICBtZXRob2RzLmFkZChidWlsZE1ldGhvZEluc3RhbmNlKCJ1bml0dGVzdHMiLCAiU3RhdGlzdGljc1Rlc3QiLCAwLCAiYlN0YXRpc3RpY3MiKSk7DQorICAgIG1ldGhvZHMuYWRkKGJ1aWxkTWV0aG9kSW5zdGFuY2UoInVuaXR0ZXN0cyIsICJTdGF0aXN0aWNzVGVzdCIsIDAsICJjU3RhdGlzdGljcyIpKTsNCisNCisgICAgdHJ5IHsNCisgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1ldGhvZHMsIE1ldGhvZEluc3RhbmNlLlNPUlRfQllfSU5ERVgpOw0KKyAgICB9DQorICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsNCisgICAgICBBc3NlcnQuZmFpbCgiQ29tcGFyaXNvbiBtZXRob2QgdmlvbGF0ZXMgaXRzIGdlbmVyYWwgY29udHJhY3QhIik7DQorICAgIH0NCisgIH0NCisNCisgIHByaXZhdGUgTWV0aG9kSW5zdGFuY2UgYnVpbGRUZXN0TmdGYWN0b3J5TWV0aG9kSW5zdGFuY2UoU3RyaW5nIHhtbFRlc3ROYW1lKSB7DQorICAgIFRlc3RDbGFzc1N0dWIgdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc1N0dWIobmV3IFhtbFRlc3RTdHViKHhtbFRlc3ROYW1lKSwgbnVsbCk7DQorICAgIHJldHVybiBuZXcgTWV0aG9kSW5zdGFuY2UobmV3IFRlc3ROR01ldGhvZFN0dWIobnVsbCwgdGVzdENsYXNzKSk7DQorICB9DQorDQorICBwcml2YXRlIE1ldGhvZEluc3RhbmNlIGJ1aWxkTWV0aG9kSW5zdGFuY2UoU3RyaW5nIHhtbFRlc3ROYW1lLCBTdHJpbmcgeG1sQ2xhc3NOYW1lLCBpbnQgeG1sQ2xhc3NJbmRleCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsNCisgICAgVGVzdENsYXNzU3R1YiB0ZXN0Q2xhc3MgPSBuZXcgVGVzdENsYXNzU3R1YihuZXcgWG1sVGVzdFN0dWIoeG1sVGVzdE5hbWUpLCBuZXcgWG1sQ2xhc3NTdHViKHhtbENsYXNzTmFtZSwgeG1sQ2xhc3NJbmRleCkpOw0KKyAgICByZXR1cm4gbmV3IE1ldGhvZEluc3RhbmNlKG5ldyBUZXN0TkdNZXRob2RTdHViKG1ldGhvZE5hbWUsIHRlc3RDbGFzcykpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBYbWxDbGFzc1N0dWIgZXh0ZW5kcyBYbWxDbGFzcyB7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KKyAgICBwcml2YXRlIGludCBpbmRleDsNCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisNCisgICAgcHVibGljIFhtbENsYXNzU3R1YihTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7DQorICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsNCisgICAgICByZXR1cm4gaW5kZXg7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBMaXN0PFhtbEluY2x1ZGU+IGdldEluY2x1ZGVkTWV0aG9kcygpIHsNCisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorICAgIH0NCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWG1sVGVzdFN0dWIgZXh0ZW5kcyBYbWxUZXN0IHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorDQorICAgIHB1YmxpYyBYbWxUZXN0U3R1YihTdHJpbmcgbmFtZSkgew0KKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xhc3NTdHViIGltcGxlbWVudHMgSVRlc3RDbGFzcyB7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KKw0KKyAgICBwcml2YXRlIFhtbFRlc3QgeG1sVGVzdDsNCisgICAgcHJpdmF0ZSBYbWxDbGFzcyB4bWxDbGFzczsNCisNCisgICAgcHVibGljIFRlc3RDbGFzc1N0dWIoWG1sVGVzdCB4bWxUZXN0LCBYbWxDbGFzcyB4bWxDbGFzcykgew0KKyAgICAgIHRoaXMueG1sVGVzdCA9IHhtbFRlc3Q7DQorICAgICAgdGhpcy54bWxDbGFzcyA9IHhtbENsYXNzOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBYbWxUZXN0IGdldFhtbFRlc3QoKSB7DQorICAgICAgcmV0dXJuIHhtbFRlc3Q7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBYbWxDbGFzcyBnZXRYbWxDbGFzcygpIHsNCisgICAgICByZXR1cm4geG1sQ2xhc3M7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBDbGFzcyBnZXRSZWFsQ2xhc3MoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlKE9iamVjdCBpbnN0YW5jZSkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0SW5zdGFuY2VzKGJvb2xlYW4gcmV1c2UpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGxvbmdbXSBnZXRJbnN0YW5jZUhhc2hDb2RlcygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldFRlc3RNZXRob2RzKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVRlc3RNZXRob2RzKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyVGVzdE1ldGhvZHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlQ2xhc3NNZXRob2RzKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEFmdGVyQ2xhc3NNZXRob2RzKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgSVRlc3ROR01ldGhvZFtdIGdldEJlZm9yZVN1aXRlTWV0aG9kcygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlclN1aXRlTWV0aG9kcygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRCZWZvcmVUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QWZ0ZXJUZXN0Q29uZmlndXJhdGlvbk1ldGhvZHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kW10gZ2V0QmVmb3JlR3JvdXBzTWV0aG9kcygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIElUZXN0TkdNZXRob2RbXSBnZXRBZnRlckdyb3Vwc01ldGhvZHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE5HTWV0aG9kU3R1YiBpbXBsZW1lbnRzIElUZXN0TkdNZXRob2Qgew0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCisgICAgcHJpdmF0ZSBUZXN0Q2xhc3NTdHViIHRlc3RDbGFzc1N0dWI7DQorICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7DQorDQorICAgIHB1YmxpYyBUZXN0TkdNZXRob2RTdHViKFN0cmluZyBtZXRob2ROYW1lLCBUZXN0Q2xhc3NTdHViIHRlc3RDbGFzc1N0dWIpIHsNCisgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOw0KKyAgICAgIHRoaXMudGVzdENsYXNzU3R1YiA9IHRlc3RDbGFzc1N0dWI7DQorDQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kIGNsb25lKCkgew0KKyAgICAgIHJldHVybiAoVGVzdE5HTWV0aG9kU3R1YikgdGhpczsNCisgICAgfTsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBDbGFzcyBnZXRSZWFsQ2xhc3MoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJVGVzdENsYXNzIGdldFRlc3RDbGFzcygpIHsNCisgICAgICByZXR1cm4gdGVzdENsYXNzU3R1YjsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgc2V0VGVzdENsYXNzKElUZXN0Q2xhc3MgY2xzKSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7DQorICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBPYmplY3RbXSBnZXRJbnN0YW5jZXMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5zdGFuY2UoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBsb25nW10gZ2V0SW5zdGFuY2VIYXNoQ29kZXMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRHcm91cHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRHcm91cHNEZXBlbmRlZFVwb24oKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlzc2luZ0dyb3VwKCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRNaXNzaW5nR3JvdXAoU3RyaW5nIGdyb3VwKSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRCZWZvcmVHcm91cHMoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBZnRlckdyb3VwcygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1ldGhvZHNEZXBlbmRlZFVwb24oKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZERlcGVuZGVkVXBvbihTdHJpbmcgbWV0aG9kTmFtZSkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3QoKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTWV0aG9kQ29uZmlndXJhdGlvbigpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlQ2xhc3NDb25maWd1cmF0aW9uKCkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckNsYXNzQ29uZmlndXJhdGlvbigpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlclN1aXRlQ29uZmlndXJhdGlvbigpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyVGVzdENvbmZpZ3VyYXRpb24oKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZUdyb3Vwc0NvbmZpZ3VyYXRpb24oKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyR3JvdXBzQ29uZmlndXJhdGlvbigpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBsb25nIGdldFRpbWVPdXQoKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVPdXQobG9uZyB0aW1lT3V0KSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0SW52b2NhdGlvbkNvdW50KCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldFRvdGFsSW52b2NhdGlvbkNvdW50KCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ291bnQoaW50IGNvdW50KSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgbG9uZyBnZXREYXRlKCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlKGxvbmcgZGF0ZSkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5SdW5Gcm9tQ2xhc3MoSUNsYXNzIHRlc3RDbGFzcykgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gaXNBbHdheXNSdW4oKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldFRocmVhZFBvb2xTaXplKCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRQb29sU2l6ZShpbnQgdGhyZWFkUG9vbFNpemUpIHsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRDdXJyZW50SW52b2NhdGlvbkNvdW50KCkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbnZvY2F0aW9uQ291bnQoKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckludm9jYXRpb25Db3VudChpbnQgbikgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlckludm9jYXRpb25Db3VudCgpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIElSZXRyeUFuYWx5emVyIGdldFJldHJ5QW5hbHl6ZXIoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFJldHJ5QW5hbHl6ZXIoSVJldHJ5QW5hbHl6ZXIgcmV0cnlBbmFseXplcikgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBza2lwRmFpbGVkSW52b2NhdGlvbnMoKSB7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRmFpbGVkSW52b2NhdGlvbnMoYm9vbGVhbiBza2lwKSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBsb25nIGdldEludm9jYXRpb25UaW1lT3V0KCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzKCkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ0RlcGVuZGVuY2llcyhib29sZWFuIGlnbm9yZSkgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRJbnZvY2F0aW9uTnVtYmVycygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbk51bWJlcnMoTGlzdDxJbnRlZ2VyPiBudW1iZXJzKSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGFkZEZhaWxlZEludm9jYXRpb25OdW1iZXIoaW50IG51bWJlcikgew0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRGYWlsZWRJbnZvY2F0aW9uTnVtYmVycygpIHsNCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBYbWxUZXN0IGdldFhtbFRlc3QoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBDb25zdHJ1Y3Rvck9yTWV0aG9kIGdldENvbnN0cnVjdG9yT3JNZXRob2QoKSB7DQorICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbmRNZXRob2RQYXJhbWV0ZXJzKFhtbFRlc3QgdGVzdCkgew0KKyAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9VdGlsc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9VdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2QxMmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL1V0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHMuam9pbjsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgVXRpbHN9LgorICoKKyAqIEBhdXRob3IgVG9tYXMgUG9sbGFrCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlsc1Rlc3QgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSU5WQUxJRF9DSEFSID0gMHhGRkZFOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkVQTEFDRU1FTlRfQ0hBUiA9IDB4RkZGRDsKKworCUBUZXN0CisJcHVibGljIHZvaWQgZXNjYXBlVW5pY29kZSgpIHsKKwkJYXNzZXJ0RXF1YWxzKFV0aWxzLmVzY2FwZVVuaWNvZGUoInRlc3QiKSwgInRlc3QiKTsKKwkJYXNzZXJ0RXF1YWxzKFV0aWxzLmVzY2FwZVVuaWNvZGUoU3RyaW5nLnZhbHVlT2YoSU5WQUxJRF9DSEFSKSksCisJCQkJU3RyaW5nLnZhbHVlT2YoUkVQTEFDRU1FTlRfQ0hBUikpOworCisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFbXB0eVN0cmluZ1doZW5Kb2luaW5nRW1wdHlMaXN0V2l0aEpvaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGVtcHR5TGlzdCA9IGVtcHR5TGlzdCgpOworCQlhc3NlcnRFcXVhbHMoIiIsIGpvaW4oZW1wdHlMaXN0LCAiLCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGpvaW5Ud29TdHJpbmdzV2l0aEpvaW5TdHJpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiB0d29TdHJpbmdzID0gYXNMaXN0KCJvbmUiLCAidHdvIik7CisJCWFzc2VydEVxdWFscygib25lLHR3byIsIFV0aWxzLmpvaW4odHdvU3RyaW5ncywgIiwiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVFbXB0eVN0cmluZ1doZW5Kb2luaW5nRW1wdHlMaXN0V2l0aEpvaW5TdHJpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUxpc3Q8U3RyaW5nPiBlbXB0eUxpc3QgPSBlbXB0eUxpc3QoKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBVdGlscy5qb2luKGVtcHR5TGlzdCwgIiwiKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQWZ0ZXJDbGFzcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQWZ0ZXJDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzAyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvY29uZmxpc3RlbmVyL0ZhaWxpbmdBZnRlckNsYXNzLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmNvbmZsaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UgZG9lcyBYWFgNCisgKi8NCitwdWJsaWMgY2xhc3MgRmFpbGluZ0FmdGVyQ2xhc3Mgew0KKyAgQEFmdGVyQ2xhc3MNCisgIHB1YmxpYyB2b2lkIGZhaWxpbmdBZnRlckNsYXNzKCkgew0KKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQgQEFmdGVyQ2xhc3MgZmFpbHVyZSIpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3RCZWZvcmVGYWlsaW5nQWZ0ZXJDbGFzcygpIHt9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0FmdGVyU3VpdGUuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0FmdGVyU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZhYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQWZ0ZXJTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5jb25mbGlzdGVuZXI7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIEZhaWxpbmdBZnRlclN1aXRlIHsNCisgIEBBZnRlclN1aXRlKGFsd2F5c1J1bj10cnVlKQ0KKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZSgpIHsNCisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZXhjZXB0aW9uIik7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZHVtbXl0ZXN0KCkgew0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvY29uZmxpc3RlbmVyL0ZhaWxpbmdBZnRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0FmdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTU5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvY29uZmxpc3RlbmVyL0ZhaWxpbmdBZnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIG9yZy50ZXN0bmcuaW50ZXJuYWwuY29uZmxpc3RlbmVyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIEZhaWxpbmdBZnRlclRlc3Qgew0KKyAgQEFmdGVyVGVzdChhbHdheXNSdW49dHJ1ZSkNCisgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpIHsNCisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZXhjZXB0aW9uIik7DQorICB9DQorDQorICBAQWZ0ZXJUZXN0DQorICBwdWJsaWMgdm9pZCBza2lwcGVkQWZ0ZXJUZXN0KCkgew0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIGR1bW15dGVzdCgpIHsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQmVmb3JlQ2xhc3MuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkMjkyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZUNsYXNzLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmNvbmZsaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlIGRvZXMgWFhYDQorICovDQorcHVibGljIGNsYXNzIEZhaWxpbmdCZWZvcmVDbGFzcyB7DQorICBAQmVmb3JlQ2xhc3MNCisgIHB1YmxpYyB2b2lkIGZhaWxpbmdCZWZvcmVDbGFzcygpIHsNCisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIEBCZWZvcmVDbGFzcyBmYWlsdXJlIik7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdGVzdEFmdGVyRmFpbGluZ0JlZm9yZUNsYXNzKCkge30NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQmVmb3JlU3VpdGUuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZVN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyOTAyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZVN1aXRlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBvcmcudGVzdG5nLmludGVybmFsLmNvbmZsaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIEZhaWxpbmdCZWZvcmVTdWl0ZSB7DQorICBAQmVmb3JlU3VpdGUNCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlKCkgew0KKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBleGNlcHRpb24iKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBkdW1teXRlc3QoKSB7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9jb25mbGlzdGVuZXIvRmFpbGluZ0JlZm9yZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmNiMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci9GYWlsaW5nQmVmb3JlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5jb25mbGlzdGVuZXI7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIEZhaWxpbmdCZWZvcmVUZXN0IHsNCisgIEBCZWZvcmVTdWl0ZQ0KKyAgcHVibGljIHZvaWQgcGFzc2luZ0JlZm9yZVN1aXRlKCkgew0KKyAgfQ0KKw0KKyAgQEJlZm9yZVRlc3QNCisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7DQorICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IGV4Y2VwdGlvbiIpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIGR1bW15dGVzdCgpIHsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci90ZXN0bmcueG1sIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2NvbmZsaXN0ZW5lci90ZXN0bmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcvaW50ZXJuYWwvY29uZmxpc3RlbmVyL3Rlc3RuZy54bWwKQEAgLTAsMCArMSwzMCBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4NCis8c3VpdGUgbmFtZT0iQ29uZmlndXJhdGlvbiBmYWlsdXJlcyIgdmVyYm9zZT0iMiI+DQorCTwhLS0NCisgIDx0ZXN0IG5hbWU9IlN1aXRlIENvbmZpZ3VyYXRpb24iPg0KKwkJPGNsYXNzZXM+DQorCQkJPGNsYXNzIG5hbWU9Im9yZy50ZXN0bmcuaW50ZXJuYWwuY29uZmxpc3RlbmVyLkZhaWxpbmdCZWZvcmVTdWl0ZSIgLz4NCisJCQk8Y2xhc3MgbmFtZT0ib3JnLnRlc3RuZy5pbnRlcm5hbC5jb25mbGlzdGVuZXIuRmFpbGluZ0FmdGVyU3VpdGUiIC8+DQorCQk8L2NsYXNzZXM+DQorICA8L3Rlc3Q+DQorCS0tPg0KKwk8dGVzdCBuYW1lPSJUZXN0IENvbmZpZ3VyYXRpb24iPg0KKwkJPGNsYXNzZXM+DQorCQkJPGNsYXNzIG5hbWU9Im9yZy50ZXN0bmcuaW50ZXJuYWwuY29uZmxpc3RlbmVyLkZhaWxpbmdCZWZvcmVUZXN0IiAvPg0KKwkJCTxjbGFzcyBuYW1lPSJvcmcudGVzdG5nLmludGVybmFsLmNvbmZsaXN0ZW5lci5GYWlsaW5nQWZ0ZXJUZXN0IiAvPg0KKwkJPC9jbGFzc2VzPg0KKyAgPC90ZXN0Pg0KKwk8dGVzdCBuYW1lPSJDbGFzcyBDb25maWd1cmF0aW9uIj4NCisJCTxjbGFzc2VzPg0KKwkJCTxjbGFzcyBuYW1lPSJvcmcudGVzdG5nLmludGVybmFsLmNvbmZsaXN0ZW5lci5GYWlsaW5nQmVmb3JlQ2xhc3MiIC8+DQorICAgICAgPGNsYXNzIG5hbWU9Im9yZy50ZXN0bmcuaW50ZXJuYWwuY29uZmxpc3RlbmVyLkZhaWxpbmdBZnRlckNsYXNzIiAvPg0KKyAgICA8L2NsYXNzZXM+DQorICA8L3Rlc3Q+DQorICA8IS0tDQorCTx0ZXN0IG5hbWU9IlggQ29uZmlndXJhdGlvbiI+DQorCQk8Y2xhc3Nlcz4NCisJCQk8Y2xhc3MgbmFtZT0ib3JnLnRlc3RuZy5pbnRlcm5hbC5jb25mbGlzdGVuZXIuIiAvPg0KKwkJPC9jbGFzc2VzPg0KKyAgPC90ZXN0Pg0KKwktLT4NCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL2ludGVybmFsL2ludm9rZXJzL0ludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NDkzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9pbnRlcm5hbC9pbnZva2Vycy9JbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2Ugb3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2VyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgSW52b2tlZE1ldGhvZExpc3RlbmVyU3VidHlwZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RGcm9tTGlzdGVuZXJVc2luZ1NpbXBsZUxpc3RlbmVySW5zdGFuY2UoKSB7CisgICAgZmluYWwgSUludm9rZWRNZXRob2RMaXN0ZW5lciBzaW1wbGVMaXN0ZW5lckluc3RhbmNlID0gbmV3IFNpbXBsZUludm9rZWRNZXRob2RMaXN0ZW5lckR1bW15KCk7CisKKyAgICBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlIGxpc3RlbmVyU3VidHlwZSA9CisgICAgICAgIEludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUuZnJvbUxpc3RlbmVyKHNpbXBsZUxpc3RlbmVySW5zdGFuY2UpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsaXN0ZW5lclN1YnR5cGUsIEludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUuU0lNUExFX0xJU1RFTkVSKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RGcm9tTGlzdGVuZXJVc2luZ0V4dGVuZGVkTGlzdGVuZXJJbnN0YW5jZSgpIHsKKyAgICBJSW52b2tlZE1ldGhvZExpc3RlbmVyMiBleHRlbmRlZExpc3RlbmVySW5zdGFuY2UgPSBuZXcgRXh0ZW5kZWRJbnZva2VkTWV0aG9kTGlzdGVuZXJEdW1teSgpOworCisgICAgSW52b2tlZE1ldGhvZExpc3RlbmVyU3VidHlwZSBsaXN0ZW5lclN1YnR5cGUgPQorICAgICAgICBJbnZva2VkTWV0aG9kTGlzdGVuZXJTdWJ0eXBlLmZyb21MaXN0ZW5lcihleHRlbmRlZExpc3RlbmVySW5zdGFuY2UpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsaXN0ZW5lclN1YnR5cGUsIEludm9rZWRNZXRob2RMaXN0ZW5lclN1YnR5cGUuRVhURU5ERURfTElTVEVORVIpOworICB9CisKKyAgc3RhdGljIGNsYXNzIFNpbXBsZUludm9rZWRNZXRob2RMaXN0ZW5lckR1bW15IGltcGxlbWVudHMgSUludm9rZWRNZXRob2RMaXN0ZW5lciB7CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRJbnZva2VkTWV0aG9kTGlzdGVuZXJEdW1teSBpbXBsZW1lbnRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIyIHsKKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZnRlckludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL3JlbW90ZS9zdHJwcm90b2NvbC9UZXN0UmVzdWx0TWVzc2FnZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvVGVzdFJlc3VsdE1lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkYTVjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3RuZy9yZW1vdGUvc3RycHJvdG9jb2wvVGVzdFJlc3VsdE1lc3NhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBvcmcudGVzdG5nLnJlbW90ZS5zdHJwcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVzdWx0TWVzc2FnZVRlc3QgeworCisJcHJpdmF0ZSBUZXN0UmVzdWx0TWVzc2FnZSB0ZXN0UmVzdWx0TWVzc2FnZSA9IG5ldyBUZXN0UmVzdWx0TWVzc2FnZSgwLAorCQkJInN1aXRlTmFtZSIsICJ0ZXN0TmFtZSIsICJjbGFzc05hbWUiLCAibWV0aG9kTmFtZSIsCisJCQkidGVzdERlc2NyaXB0b3IiLCAidGVzdGluc3RhbmNlTmFtZSIsIG5ldyBTdHJpbmdbXSB7fSwgMCwgMCwKKwkJCSJzdGFja1RyYWNlIiwgMSwgMCk7CisKKwlARGF0YVByb3ZpZGVyKG5hbWUgPSAidGVzdEdlbiIpCisJcHJpdmF0ZSBPYmplY3RbXVtdIGdldFAoKSB7CisJCXJldHVybiBuZXcgT2JqZWN0W11bXSB7CisJCQkJeyBudWxsLCBuZXcgQ2xhc3NbXSB7IG51bGwgfSwgQXJyYXlzLmFzTGlzdCgpIH0sCisJCQkJeyBuZXcgT2JqZWN0W10geyBuZXcgYnl0ZVtdIHsgMSB9IH0sCisJCQkJCQluZXcgQ2xhc3NbXSB7IGJ5dGVbXS5jbGFzcyB9LCBBcnJheXMuYXNMaXN0KCJbMV0iKSB9LAorCQkJCXsgbmV3IE9iamVjdFtdIHsgbmV3IHNob3J0W10geyAxIH0gfSwKKwkJCQkJCW5ldyBDbGFzc1tdIHsgc2hvcnRbXS5jbGFzcyB9LCBBcnJheXMuYXNMaXN0KCJbMV0iKSB9LAorCQkJCXsgbmV3IE9iamVjdFtdIHsgbmV3IGxvbmdbXSB7IDEgfSB9LAorCQkJCQkJbmV3IENsYXNzW10geyBsb25nW10uY2xhc3MgfSwgQXJyYXlzLmFzTGlzdCgiWzFdIikgfSwKKwkJCQl7IG5ldyBPYmplY3RbXSB7IG5ldyBpbnRbXSB7IDEsIDIsIDMgfSB9LAorCQkJCQkJbmV3IENsYXNzW10geyBpbnRbXS5jbGFzcyB9LCBBcnJheXMuYXNMaXN0KCJbMSwyLDNdIikgfSwKKwkJCQl7IG5ldyBPYmplY3RbXSB7IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9IH0sCisJCQkJCQluZXcgQ2xhc3NbXSB7IGJvb2xlYW5bXS5jbGFzcyB9LAorCQkJCQkJQXJyYXlzLmFzTGlzdCgiW3RydWUsZmFsc2VdIikgfSwKKwkJCQl7IG5ldyBPYmplY3RbXSB7IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH0gfSwKKwkJCQkJCW5ldyBDbGFzc1tdIHsgaW50W10uY2xhc3MgfSwgQXJyYXlzLmFzTGlzdCgiW2EsYixjXSIpIH0sCisJCQkJeyBuZXcgT2JqZWN0W10geyBuZXcgZmxvYXRbXSB7IDEuMWYsIDIuMmYsIDMuM2YgfSB9LAorCQkJCQkJbmV3IENsYXNzW10geyBmbG9hdFtdLmNsYXNzIH0sCisJCQkJCQlBcnJheXMuYXNMaXN0KCJbMS4xLDIuMiwzLjNdIikgfSwKKwkJCQl7IG5ldyBPYmplY3RbXSB7IG5ldyBkb3VibGVbXSB7IDEuMSwgMi4yLCAzLjMgfSB9LAorCQkJCQkJbmV3IENsYXNzW10geyBkb3VibGVbXS5jbGFzcyB9LAorCQkJCQkJQXJyYXlzLmFzTGlzdCgiWzEuMSwyLjIsMy4zXSIpIH0sCisJCQkJeyBuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0W10geyAidGhpcyBpcyBhIHN0cmluZyIsIGZhbHNlIH0gfSwKKwkJCQkJCW5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBCb29sZWFuLmNsYXNzIH0sCisJCQkJCQlBcnJheXMuYXNMaXN0KCJbdGhpcyBpcyBhIHN0cmluZyxmYWxzZV0iKSB9LAorCQkJCXsgbmV3IE9iamVjdFtdIHsgbmV3IE9iamVjdFtdIHsgbnVsbCwgIiIgfSB9LAorCQkJCQkJbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIEJvb2xlYW4uY2xhc3MgfSwKKwkJCQkJCUFycmF5cy5hc0xpc3QoIltudWxsLFwiXCJdIikgfSwgfTsKKwl9CisKKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAidGVzdEdlbiIpCisJcHVibGljIHZvaWQgdG9TdHJpbmdUZXN0KE9iamVjdFtdIG9iamVjdHMsIENsYXNzPD8+W10gb2JqZWN0Q2xhc3NlcywKKwkJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZFJlc3VsdHMpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSByZXN1bHRzID0gdGVzdFJlc3VsdE1lc3NhZ2UudG9TdHJpbmcob2JqZWN0cywgb2JqZWN0Q2xhc3Nlcyk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChyZXN1bHRzKSwgZXhwZWN0ZWRSZXN1bHRzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0bmcveG1sL1N1aXRlWG1sUGFyc2VyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL3htbC9TdWl0ZVhtbFBhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmFhOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdG5nL3htbC9TdWl0ZVhtbFBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy50ZXN0bmcueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCitpbXBvcnQgc3RhdGljIHRlc3QuU2ltcGxlQmFzZVRlc3QuZ2V0UGF0aFRvUmVzb3VyY2U7CisKK3B1YmxpYyBjbGFzcyBTdWl0ZVhtbFBhcnNlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBQQVJFTlQgPSBuZXcgRmlsZShnZXRQYXRoVG9SZXNvdXJjZSgieG1sIikpOworCisgICAgQERhdGFQcm92aWRlcgorICAgIHByaXZhdGUgc3RhdGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyAiZ29vZFdpdGhEb2N0eXBlLnhtbCIsIHRydWUgfSwKKyAgICAgICAgICAgICAgICB7ICJnb29kV2l0aG91dERvY3R5cGUueG1sIiwgdHJ1ZSB9LAorICAgICAgICAgICAgICAgIHsgImJhZFdpdGhEb2N0eXBlLnhtbCIsIGZhbHNlIH0sIC8vIFRlc3ROR0V4Y2VwdGlvbiAtPiBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHsgImJhZFdpdGhvdXREb2N0eXBlLnhtbCIsIGZhbHNlIH0gLy8gTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZShTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gc2hvdWxkV29yaykgeworICAgICAgICBTdWl0ZVhtbFBhcnNlciBwYXJzZXIgPSBuZXcgU3VpdGVYbWxQYXJzZXIoKTsKKworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFBBUkVOVCwgZmlsZU5hbWUpKSkgeworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGZpbGVOYW1lLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghc2hvdWxkV29yaykgeworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJQYXJzaW5nIG9mICIgKyBmaWxlTmFtZSArICIgaXMgc3VwcG9zZWQgdG8gZmFpbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKHNob3VsZFdvcmspIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUGFyc2luZyBvZiAiICsgZmlsZU5hbWUgKyAiIGlzIHN1cHBvc2VkIHRvIHdvcmsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvQmFzZURpc3RyaWJ1dGVkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0Jhc2VEaXN0cmlidXRlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNmYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0Jhc2VEaXN0cmlidXRlZFRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQmFzZURpc3RyaWJ1dGVkVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX3ZlcmJvc2UgPSBmYWxzZTsKKworICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlUZXN0cyhTdHJpbmcgdGl0bGUsIFN0cmluZ1tdIGV4cCwgTWFwIGZvdW5kKSB7CisgICAgTWFwIGV4cGVjdGVkID0gbmV3IEhhc2hNYXAoKTsKKyAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogZXhwKSB7CisgICAgICBleHBlY3RlZC5wdXQoZWxlbWVudCwgZWxlbWVudCk7CisgICAgfQorCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3VuZC5zaXplKCksIGV4cGVjdGVkLnNpemUoKSwKKyAgICAgICAgIlZlcmlmaWNhdGlvbiBmb3IgIiArIHRpdGxlICsgIiB0ZXN0cyBmYWlsZWQ6Iik7CisKKyAgICBmb3IgKE9iamVjdCBvIDogZXhwZWN0ZWQudmFsdWVzKCkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbzsKKyAgICAgIGlmIChudWxsID09IGZvdW5kLmdldChuYW1lKSkgeworICAgICAgICBkdW1wTWFwKCJFeHBlY3RlZCIsIGV4cGVjdGVkKTsKKyAgICAgICAgZHVtcE1hcCgiRm91bmQiLCBmb3VuZCk7CisgICAgICB9CisKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvdW5kLmdldChuYW1lKSwKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIHRvIGZpbmQgbWV0aG9kICIgKyBuYW1lICsgIiBpbiAiICsgdGl0bGUKKyAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGRpZG4ndCBmaW5kIGl0LiIpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGR1bXBNYXAoU3RyaW5nIHRpdGxlLCBNYXA8PywgPz4gbSkgeworICAgIGlmIChtX3ZlcmJvc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PSAiICsgdGl0bGUpOworICAgICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiBtLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgcHBwKGVudHJ5LmdldEtleSgpICsgIiAgPT4gIiArIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKG1fdmVyYm9zZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQmFzZURpc3RyaWJ1dGVkVGVzdF0gIiArIHMpOworICAgIH0KKyAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9CYXNlTG9nVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0Jhc2VMb2dUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZDhkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9CYXNlTG9nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRlc3RzIHRoYXQgbmVlZCB0byBsb2cgbWV0aG9kcyBhcyB0aGV5IGdldCBjYWxsZWQuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEJhc2VMb2dUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fbG9nOworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBiYygpIHsKKyAgICBtX2xvZyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgIG1fbG9nLmFkZChzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldExvZygpIHsKKyAgICByZXR1cm4gbV9sb2c7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9CYXNlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0Jhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkYzZmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9CYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTM5IEBACitwYWNrYWdlIHRlc3Q7DQorDQorDQoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuSUNsYXNzTGlzdGVuZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSdW5uZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcudGVzdG5nLlN1aXRlUnVubmVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdFJ1bm5lcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuSlVuaXRYTUxSZXBvcnRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuVGVzdEhUTUxSZXBvcnRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbE1ldGhvZFNlbGVjdG9yOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxQYWNrYWdlOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsNCisNCisvKioNCisgKiBCYXNlIGNsYXNzIGZvciB0ZXN0cw0KKyAqDQorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1heSA1LCAyMDA0DQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgQmFzZVRlc3QgZXh0ZW5kcyBCYXNlRGlzdHJpYnV0ZWRUZXN0IHsNCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtX291dHB1dERpcmVjdG9yeT0gInRlc3Qtb3V0cHV0LXRlc3RzIjsNCisNCisgIHByaXZhdGUgWG1sU3VpdGUgbV9zdWl0ZT0gbnVsbDsNCisgIHByaXZhdGUgSVRlc3RSdW5uZXJGYWN0b3J5IG1fdGVzdFJ1bm5lckZhY3Rvcnk7DQorICBwcml2YXRlIElDb25maWd1cmF0aW9uIG1fY29uZmlndXJhdGlvbjsNCisNCisgIHByaXZhdGUgSW50ZWdlciBtX3ZlcmJvc2UgPSBudWxsOw0KKw0KKyAgcHVibGljIEJhc2VUZXN0KCkgew0KKyAgICBtX3Rlc3RSdW5uZXJGYWN0b3J5PSBuZXcgSW50ZXJuYWxUZXN0UnVubmVyRmFjdG9yeSh0aGlzKTsNCisgICAgbV9jb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsNCisgIH0NCisNCisgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsNCisgICAgcmV0dXJuIG1fY29uZmlndXJhdGlvbjsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIHNldERlYnVnKCkgew0KKyAgICBnZXRUZXN0KCkuc2V0VmVyYm9zZSg5KTsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIHNldFBhcmFsbGVsKFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBwYXJhbGxlbCkgew0KKyAgICBnZXRUZXN0KCkuc2V0UGFyYWxsZWwocGFyYWxsZWwpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0VmVyYm9zZShpbnQgbikgew0KKyAgICBtX3ZlcmJvc2UgPSBuOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0VGVzdFRpbWVPdXQobG9uZyBuKSB7DQorICAgICAgZ2V0VGVzdCgpLnNldFRpbWVPdXQobik7DQorICB9DQorDQorICBwcm90ZWN0ZWQgdm9pZCBzZXRTdWl0ZVRpbWVPdXQobG9uZyBuKSB7DQorICAgICAgbV9zdWl0ZS5zZXRUaW1lT3V0KExvbmcudG9TdHJpbmcobikpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0SlVuaXQoYm9vbGVhbiBmKSB7DQorICAgIGdldFRlc3QoKS5zZXRKVW5pdChmKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIHNldFRocmVhZENvdW50KGludCBjb3VudCkgew0KKyAgICBnZXRUZXN0KCkuZ2V0U3VpdGUoKS5zZXRUaHJlYWRDb3VudChjb3VudCk7DQorICB9DQorDQorICBwcml2YXRlIE1hcDxMb25nLCBYbWxUZXN0PiBtX3Rlc3RzPSBuZXcgSGFzaE1hcDw+KCk7DQorICBwcml2YXRlIE1hcDxMb25nLCBNYXA+IG1fcGFzc2VkVGVzdHM9IG5ldyBIYXNoTWFwPD4oKTsNCisgIHByaXZhdGUgTWFwPExvbmcsIE1hcD4gbV9mYWlsZWRUZXN0cz0gbmV3IEhhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBNYXA8TG9uZywgTWFwPiBtX3NraXBwZWRUZXN0cz0gbmV3IEhhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBNYXA8TG9uZywgWG1sVGVzdD4gbV90ZXN0Q29uZmlncz0gbmV3IEhhc2hNYXA8PigpOw0KKyAgcHJpdmF0ZSBNYXA8TG9uZywgTWFwPiBtX3Bhc3NlZENvbmZpZ3M9IG5ldyBIYXNoTWFwPD4oKTsNCisgIHByaXZhdGUgTWFwPExvbmcsIE1hcD4gbV9mYWlsZWRDb25maWdzPSBuZXcgSGFzaE1hcDw+KCk7DQorICBwcml2YXRlIE1hcDxMb25nLCBNYXA+IG1fc2tpcHBlZENvbmZpZ3M9IG5ldyBIYXNoTWFwPD4oKTsNCisgIHByaXZhdGUgTWFwPExvbmcsIE1hcD4gbV9mYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzPSBuZXcgSGFzaE1hcDw+KCk7DQorDQorICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgTGlzdDxJVGVzdFJlc3VsdD4+IGdldFRlc3RzKE1hcDxMb25nLCBNYXA+IG1hcCkgew0KKyAgICBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gcmVzdWx0PSBtYXAuZ2V0KGdldElkKCkpOw0KKyAgICBpZihudWxsID09IHJlc3VsdCkgew0KKyAgICAgIHJlc3VsdD0gbmV3IEhhc2hNYXA8PigpOw0KKyAgICAgIG1hcC5wdXQoZ2V0SWQoKSwgcmVzdWx0KTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIFhtbFRlc3QgZ2V0VGVzdCgpIHsNCisgICAgcmV0dXJuIG1fdGVzdHMuZ2V0KGdldElkKCkpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0VGVzdHMoTWFwPExvbmcsIE1hcD4gbWFwLCBNYXAgbSkgew0KKyAgICBtYXAucHV0KGdldElkKCksIG0pOw0KKyAgfQ0KKw0KKyAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiBnZXRGYWlsZWRUZXN0cygpIHsNCisgICAgcmV0dXJuIGdldFRlc3RzKG1fZmFpbGVkVGVzdHMpOw0KKyAgfQ0KKw0KKyAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiBnZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCkgew0KKyAgICByZXR1cm4gZ2V0VGVzdHMobV9mYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKTsNCisgIH0NCisNCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gZ2V0UGFzc2VkVGVzdHMoKSB7DQorICAgIHJldHVybiBnZXRUZXN0cyhtX3Bhc3NlZFRlc3RzKTsNCisgIH0NCisNCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gZ2V0U2tpcHBlZFRlc3RzKCkgew0KKyAgICByZXR1cm4gZ2V0VGVzdHMobV9za2lwcGVkVGVzdHMpOw0KKyAgfQ0KKw0KKyAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiBnZXRGYWlsZWRDb25maWdzKCkgew0KKyAgICByZXR1cm4gZ2V0VGVzdHMobV9mYWlsZWRDb25maWdzKTsNCisgIH0NCisNCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gZ2V0UGFzc2VkQ29uZmlncygpIHsNCisgICAgcmV0dXJuIGdldFRlc3RzKG1fcGFzc2VkQ29uZmlncyk7DQorICB9DQorDQorICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxJVGVzdFJlc3VsdD4+IGdldFNraXBwZWRDb25maWdzKCkgew0KKyAgICByZXR1cm4gZ2V0VGVzdHMobV9za2lwcGVkQ29uZmlncyk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBzZXRTa2lwcGVkVGVzdHMoTWFwIG0pIHsNCisgICAgc2V0VGVzdHMobV9za2lwcGVkVGVzdHMsIG0pOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0UGFzc2VkVGVzdHMoTWFwIG0pIHsNCisgICAgc2V0VGVzdHMobV9wYXNzZWRUZXN0cywgbSk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBzZXRGYWlsZWRUZXN0cyhNYXAgbSkgew0KKyAgICBzZXRUZXN0cyhtX2ZhaWxlZFRlc3RzLCBtKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMoTWFwIG0pIHsNCisgICAgc2V0VGVzdHMobV9mYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzLCBtKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldFNraXBwZWRDb25maWdzKE1hcCBtKSB7DQorICAgIHNldFRlc3RzKG1fc2tpcHBlZENvbmZpZ3MsIG0pOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0UGFzc2VkQ29uZmlncyhNYXAgbSkgew0KKyAgICBzZXRUZXN0cyhtX3Bhc3NlZENvbmZpZ3MsIG0pOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgc2V0RmFpbGVkQ29uZmlncyhNYXAgbSkgew0KKyAgICBzZXRUZXN0cyhtX2ZhaWxlZENvbmZpZ3MsIG0pOw0KKyAgfQ0KKw0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgew0KKyAgICBhc3NlcnQgbnVsbCAhPSBnZXRUZXN0KCkgOiAiVGVzdCB3YXNuJ3Qgc2V0LCBtYXliZSBAQ29uZmlndXJhdGlvbiBtZXRob2RTZXRVcCgpIHdhcyBuZXZlciBjYWxsZWQiOw0KKyAgICBzZXRQYXNzZWRUZXN0cyhuZXcgSGFzaE1hcCgpKTsNCisgICAgc2V0RmFpbGVkVGVzdHMobmV3IEhhc2hNYXAoKSk7DQorICAgIHNldFNraXBwZWRUZXN0cyhuZXcgSGFzaE1hcCgpKTsNCisgICAgc2V0UGFzc2VkQ29uZmlncyhuZXcgSGFzaE1hcCgpKTsNCisgICAgc2V0RmFpbGVkQ29uZmlncyhuZXcgSGFzaE1hcCgpKTsNCisgICAgc2V0U2tpcHBlZENvbmZpZ3MobmV3IEhhc2hNYXAoKSk7DQorICAgIHNldEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMobmV3IEhhc2hNYXAoKSk7DQorDQorICAgIG1fc3VpdGUuc2V0VmVyYm9zZShtX3ZlcmJvc2UgIT0gbnVsbCA/IG1fdmVyYm9zZSA6IDApOw0KKyAgICBTdWl0ZVJ1bm5lciBzdWl0ZSA9IG5ldyBTdWl0ZVJ1bm5lcihtX2NvbmZpZ3VyYXRpb24sDQorICAgICAgICBtX3N1aXRlLCBtX291dHB1dERpcmVjdG9yeSwgbV90ZXN0UnVubmVyRmFjdG9yeSk7DQorDQorICAgIHN1aXRlLnJ1bigpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kU2VsZWN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgaW50IHByaW9yaXR5KSB7DQorICAgIFhtbE1ldGhvZFNlbGVjdG9yIG1ldGhvZFNlbGVjdG9yPSBuZXcgWG1sTWV0aG9kU2VsZWN0b3IoKTsNCisgICAgbWV0aG9kU2VsZWN0b3Iuc2V0TmFtZShjbGFzc05hbWUpOw0KKyAgICBtZXRob2RTZWxlY3Rvci5zZXRQcmlvcml0eShwcmlvcml0eSk7DQorICAgIGdldFRlc3QoKS5nZXRNZXRob2RTZWxlY3RvcnMoKS5hZGQobWV0aG9kU2VsZWN0b3IpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIFhtbENsYXNzIGFkZENsYXNzKENsYXNzPD8+IGNscykgew0KKyAgICByZXR1cm4gYWRkQ2xhc3MoY2xzLmdldE5hbWUoKSk7DQorICB9DQorDQorICBwcm90ZWN0ZWQgWG1sQ2xhc3MgYWRkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgew0KKyAgICBYbWxDbGFzcyByZXN1bHQ9IG5ldyBYbWxDbGFzcyhjbGFzc05hbWUpOw0KKyAgICBnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpLmFkZChyZXN1bHQpOw0KKw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgc2V0QmVhblNoZWxsRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgew0KKyAgICBnZXRUZXN0KCkuc2V0QmVhblNoZWxsRXhwcmVzc2lvbihleHByZXNzaW9uKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2UoU3RyaW5nIHBrZ05hbWUsIFN0cmluZ1tdIGluY2x1ZGVkLCBTdHJpbmdbXSBleGNsdWRlZCkgew0KKyAgICBYbWxQYWNrYWdlIHBrZz0gbmV3IFhtbFBhY2thZ2UoKTsNCisgICAgcGtnLnNldE5hbWUocGtnTmFtZSk7DQorICAgIHBrZy5nZXRJbmNsdWRlKCkuYWRkQWxsKEFycmF5cy5hc0xpc3QoaW5jbHVkZWQpKTsNCisgICAgcGtnLmdldEV4Y2x1ZGUoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChleGNsdWRlZCkpOw0KKyAgICBnZXRUZXN0KCkuZ2V0U3VpdGUoKS5nZXRYbWxQYWNrYWdlcygpLmFkZChwa2cpOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBYbWxDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgew0KKyAgICBmb3IoWG1sQ2xhc3MgY2wgOiBnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpKSB7DQorICAgICAgaWYoY2wuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7DQorICAgICAgICByZXR1cm4gY2w7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIFhtbENsYXNzIHJlc3VsdD0gYWRkQ2xhc3MoY2xhc3NOYW1lKTsNCisNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVkTWV0aG9kKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtKSB7DQorICAgIFhtbENsYXNzIHhtbENsYXNzPSBmaW5kQ2xhc3MoY2xhc3NOYW1lKTsNCisgICAgeG1sQ2xhc3MuZ2V0SW5jbHVkZWRNZXRob2RzKCkuYWRkKG5ldyBYbWxJbmNsdWRlKG0pKTsNCisgICAgZ2V0VGVzdCgpLmdldFhtbENsYXNzZXMoKS5hZGQoeG1sQ2xhc3MpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkRXhjbHVkZWRNZXRob2QoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG0pIHsNCisgICAgWG1sQ2xhc3MgeG1sQ2xhc3M9IGZpbmRDbGFzcyhjbGFzc05hbWUpOw0KKyAgICB4bWxDbGFzcy5nZXRFeGNsdWRlZE1ldGhvZHMoKS5hZGQobSk7DQorICAgIGdldFRlc3QoKS5nZXRYbWxDbGFzc2VzKCkuYWRkKHhtbENsYXNzKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIGFkZEluY2x1ZGVkR3JvdXAoU3RyaW5nIGcpIHsNCisgICAgZ2V0VGVzdCgpLmFkZEluY2x1ZGVkR3JvdXAoZyk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBhZGRFeGNsdWRlZEdyb3VwKFN0cmluZyBnKSB7DQorICAgIGdldFRlc3QoKS5hZGRFeGNsdWRlZEdyb3VwKGcpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkTWV0YUdyb3VwKFN0cmluZyBtZywgTGlzdDxTdHJpbmc+IGwpIHsNCisgICAgZ2V0VGVzdCgpLmdldE1ldGFHcm91cHMoKS5wdXQobWcsIGwpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkTWV0YUdyb3VwKFN0cmluZyBtZywgU3RyaW5nIG4pIHsNCisgICAgTGlzdDxTdHJpbmc+IGw9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICBsLmFkZChuKTsNCisgICAgYWRkTWV0YUdyb3VwKG1nLCBsKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsNCisgICAgZ2V0VGVzdCgpLmFkZFBhcmFtZXRlcihrZXksIHZhbHVlKTsNCisgIH0NCisNCisvLyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdE1ldGhvZCA9IHRydWUsIGdyb3VwcyA9IHsgImluaXQiLCAiaW5pdFRlc3QifSkNCisgIEBCZWZvcmVNZXRob2QoZ3JvdXBzPSB7ICJpbml0IiwgImluaXRUZXN0IiB9KQ0KKyAgcHVibGljIHZvaWQgbWV0aG9kU2V0VXAoKSB7DQorICAgIG1fc3VpdGU9IG5ldyBYbWxTdWl0ZSgpOw0KKyAgICBtX3N1aXRlLnNldE5hbWUoIkludGVybmFsX3N1aXRlIik7DQorICAgIFhtbFRlc3QgeG1sVGVzdD0gbmV3IFhtbFRlc3QobV9zdWl0ZSk7DQorICAgIHhtbFRlc3Quc2V0TmFtZSgiSW50ZXJuYWxfdGVzdF9mYWlsdXJlc19hcmVfZXhwZWN0ZWQiKTsNCisgICAgbV90ZXN0cy5wdXQoZ2V0SWQoKSwgeG1sVGVzdCk7DQorICB9DQorDQorICBwcml2YXRlIHZvaWQgYWRkVGVzdChNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gdGVzdHMsIElUZXN0UmVzdWx0IHQpIHsNCisgICAgTGlzdDxJVGVzdFJlc3VsdD4gbD0gdGVzdHMuZ2V0KHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsNCisgICAgaWYobnVsbCA9PSBsKSB7DQorICAgICAgbD0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgdGVzdHMucHV0KHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCBsKTsNCisgICAgfQ0KKyAgICBsLmFkZCh0KTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIGFkZFBhc3NlZFRlc3QoSVRlc3RSZXN1bHQgdCkgew0KKyAgICBhZGRUZXN0KGdldFBhc3NlZFRlc3RzKCksIHQpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkRmFpbGVkVGVzdChJVGVzdFJlc3VsdCB0KSB7DQorICAgIGFkZFRlc3QoZ2V0RmFpbGVkVGVzdHMoKSwgdCk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBhZGRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3QoSVRlc3RSZXN1bHQgdCkgew0KKyAgICBhZGRUZXN0KGdldEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlVGVzdHMoKSwgdCk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBhZGRTa2lwcGVkVGVzdChJVGVzdFJlc3VsdCB0KSB7DQorICAgIGFkZFRlc3QoZ2V0U2tpcHBlZFRlc3RzKCksIHQpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkUGFzc2VkQ29uZmlnKElUZXN0UmVzdWx0IHQpIHsNCisgICAgYWRkVGVzdChnZXRQYXNzZWRDb25maWdzKCksIHQpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkRmFpbGVkQ29uZmlnKElUZXN0UmVzdWx0IHQpIHsNCisgICAgYWRkVGVzdChnZXRGYWlsZWRDb25maWdzKCksIHQpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgYWRkU2tpcHBlZENvbmZpZyhJVGVzdFJlc3VsdCB0KSB7DQorICAgIGFkZFRlc3QoZ2V0U2tpcHBlZENvbmZpZ3MoKSwgdCk7DQorICB9DQorDQorICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7DQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VUZXN0ICIgKyBnZXRJZCgpICsgIl0gIiArIHMpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIExvbmcgZ2V0SWQoKSB7DQorICAgIHJldHVybiA0Mkw7DQorLy8gICAgbG9uZyByZXN1bHQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7DQorLy8vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJFVFVSTklORyBJRCAiICsgcmVzdWx0KTsNCisvLyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgcHVibGljIFhtbFN1aXRlIGdldFN1aXRlKCkgew0KKyAgICByZXR1cm4gbV9zdWl0ZTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHNldFN1aXRlKFhtbFN1aXRlIHN1aXRlKSB7DQorICAgIG1fc3VpdGUgPSBzdWl0ZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogVXNlZCBmb3IgaW5zdGFuY2VDb3VudCB0ZXN0aW5nLCB3aGVuIHdlIG5lZWQgdG8gbG9vayBpbnNpZGUgdGhlDQorICAgKiBUZXN0UmVzdWx0IHRvIGNvdW50IHRoZSB2YXJpb3VzIFNVQ0NFU1MvRkFJTC9GQUlMX0JVVF9PSw0KKyAgICovDQorICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZXN1bHRzKE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiB0ZXN0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgew0KKyAgICBpZih0ZXN0cy5zaXplKCkgPiAwKSB7DQorICAgICAgU2V0IGtleXM9IHRlc3RzLmtleVNldCgpOw0KKyAgICAgIE9iamVjdCBmaXJzdEtleT0ga2V5cy5pdGVyYXRvcigpLm5leHQoKTsNCisgICAgICBMaXN0PElUZXN0UmVzdWx0PiBwYXNzZWRSZXN1bHQ9IHRlc3RzLmdldChmaXJzdEtleSk7DQorICAgICAgaW50IG49IHBhc3NlZFJlc3VsdC5zaXplKCk7DQorICAgICAgYXNzZXJ0IG4gPT0gZXhwZWN0ZWQgOiAiRXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiAiICsgbWVzc2FnZSArICIgYnV0IGZvdW5kICIgKyBuOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgIGFzc2VydCBleHBlY3RlZCA9PSAwIDogIkV4cGVjdGVkICIgKyBleHBlY3RlZCArICIgIiArIG1lc3NhZ2UgKyAiIGJ1dCBmb3VuZCAiDQorICAgICAgICArIHRlc3RzLnNpemUoKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgZHVtcFJlc3VsdHMoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIExpc3Q8SVRlc3RSZXN1bHQ+PiB0ZXN0cykgew0KKyAgICBwcHAoIj09PT09PT09PT09PT0gIiArIG5hbWUpOw0KKyAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxJVGVzdFJlc3VsdD4+IGVudHJ5IDogdGVzdHMuZW50cnlTZXQoKSkgew0KKyAgICAgIHBwcCgiVEVTVDoiICsgZW50cnkuZ2V0S2V5KCkpOw0KKyAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IGw9IGVudHJ5LmdldFZhbHVlKCk7DQorICAgICAgZm9yKElUZXN0UmVzdWx0IHRyIDogbCkgew0KKyAgICAgICAgcHBwKCIgICAiICsgdHIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHZlcmlmeUluc3RhbmNlTmFtZXMoU3RyaW5nIHRpdGxlLCBNYXA8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gYWN0dWFsLA0KKyAgICAgIFN0cmluZ1tdIGV4cGVjdGVkKQ0KKyAgew0KKyAgICBMaXN0PFN0cmluZz4gYWN0dWFsTmFtZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsNCisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PElUZXN0UmVzdWx0Pj4gZXMgOiBhY3R1YWwuZW50cnlTZXQoKSkgew0KKyAgICAgIGZvciAoSVRlc3RSZXN1bHQgdHIgOiBlcy5nZXRWYWx1ZSgpKSB7DQorICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSB0ci5nZXRJbnN0YW5jZSgpOw0KKyAgICAgICAgYWN0dWFsTmFtZXMuYWRkKGVzLmdldEtleSgpICsgIiMiICsgKGluc3RhbmNlICE9IG51bGwgPyBpbnN0YW5jZS50b1N0cmluZygpIDogIiIpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoYWN0dWFsTmFtZXMudG9BcnJheSgpLCBleHBlY3RlZCk7DQorICB9DQorDQorICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQYXNzZWRUZXN0cyhTdHJpbmcuLi4gZXhwZWN0ZWRQYXNzZWQpIHsNCisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIGV4cGVjdGVkUGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsNCisgIH0NCisNCisgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUZhaWxlZFRlc3RzKFN0cmluZy4uLiBleHBlY3RlZEZhaWxlZCkgew0KKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZXhwZWN0ZWRGYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgZmlsZW5hbWUgdG8gcGFyc2UNCisgICAgICogQHBhcmFtIHJlZ2V4cCBUaGUgcmVndWxhciBleHByZXNzaW9uDQorICAgICAqIEBwYXJhbSByZXN1bHRMaW5lcyBBbiBvdXQgcGFyYW1ldGVyIHRoYXQgd2lsbCBjb250YWluIGFsbCB0aGUgbGluZXMNCisgICAgICogdGhhdCBtYXRjaGVkIHRoZSByZWdleHANCisgICAgICogQHJldHVybiBBIExpc3Q8SW50ZWdlcj4gY29udGFpbmluZyB0aGUgbGluZXMgb2YgYWxsIHRoZSBtYXRjaGVzDQorICAgICAqDQorICAgICAqIE5vdGUgdGhhdCB0aGUgc2l6ZSgpIG9mIHRoZSByZXR1cm5lZCB2YWx1ZXdpbGwgYWx3YXlzIGJlIGVxdWFsIHRvDQorICAgICAqIHJlc3VsdC5zaXplKCkgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEludGVnZXI+IGdyZXAoRmlsZSBmaWxlTmFtZSwgU3RyaW5nIHJlZ2V4cCwgTGlzdDxTdHJpbmc+IHJlc3VsdExpbmVzKSB7DQorICAgICAgTGlzdDxJbnRlZ2VyPiByZXN1bHRMaW5lTnVtYmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGZyID0gbnVsbDsNCisgICAgICB0cnkgew0KKyAgICAgICAgZnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZU5hbWUpKTsNCisgICAgICAgIFN0cmluZyBsaW5lID0gZnIucmVhZExpbmUoKTsNCisgICAgICAgIGludCBjdXJyZW50TGluZSA9IDA7DQorICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIi4qIiArIHJlZ2V4cCArICIuKiIpOw0KKw0KKyAgICAgICAgd2hpbGUobnVsbCAhPSBsaW5lKSB7DQorICAvLyAgICAgICAgcHBwKCJDT01QQVJJTkcgIiArIHAgKyAiIFRPIEBAQCIgKyBsaW5lICsgIkBAQCIpOw0KKyAgICAgICAgICBpZihwLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7DQorICAgICAgICAgICAgcmVzdWx0TGluZXMuYWRkKGxpbmUpOw0KKyAgICAgICAgICAgIHJlc3VsdExpbmVOdW1iZXJzLmFkZChjdXJyZW50TGluZSk7DQorICAgICAgICAgIH0NCisNCisgICAgICAgICAgbGluZSA9IGZyLnJlYWRMaW5lKCk7DQorICAgICAgICAgIGN1cnJlbnRMaW5lKys7DQorICAgICAgICB9DQorICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KKyAgICAgIH0NCisgICAgICBmaW5hbGx5IHsNCisgICAgICAgIGlmKG51bGwgIT0gZnIpIHsNCisgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBmci5jbG9zZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIHJlc3VsdExpbmVOdW1iZXJzOw0KKw0KKyAgICB9DQorDQorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFRlc3RSdW5uZXJGYWN0b3J5IGltcGxlbWVudHMgSVRlc3RSdW5uZXJGYWN0b3J5IHsNCisgICAgcHJpdmF0ZSBmaW5hbCBCYXNlVGVzdCBtX2Jhc2VUZXN0Ow0KKw0KKyAgICBwdWJsaWMgSW50ZXJuYWxUZXN0UnVubmVyRmFjdG9yeShmaW5hbCBCYXNlVGVzdCBiYXNlVGVzdCkgew0KKyAgICAgIG1fYmFzZVRlc3Q9IGJhc2VUZXN0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy50ZXN0bmcuSVRlc3RSdW5uZXJGYWN0b3J5I25ld1Rlc3RSdW5uZXIob3JnLnRlc3RuZy5JU3VpdGUsIG9yZy50ZXN0bmcueG1sLlhtbFRlc3QpDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFRlc3RSdW5uZXIgbmV3VGVzdFJ1bm5lcihJU3VpdGUgc3VpdGUsIFhtbFRlc3QgdGVzdCwNCisgICAgICAgIENvbGxlY3Rpb248SUludm9rZWRNZXRob2RMaXN0ZW5lcj4gbGlzdGVuZXJzLCBMaXN0PElDbGFzc0xpc3RlbmVyPiBjbGFzc0xpc3RlbmVycykgew0KKyAgICAgIFRlc3RSdW5uZXIgdGVzdFJ1bm5lcj0gbmV3IFRlc3RSdW5uZXIobV9iYXNlVGVzdC5nZXRDb25maWd1cmF0aW9uKCksIHN1aXRlLCB0ZXN0LCBmYWxzZSwNCisgICAgICAgICAgbGlzdGVuZXJzLCBjbGFzc0xpc3RlbmVycyk7DQorDQorICAgICAgdGVzdFJ1bm5lci5hZGRUZXN0TGlzdGVuZXIobmV3IFRlc3RIVE1MUmVwb3J0ZXIoKSk7DQorICAgICAgdGVzdFJ1bm5lci5hZGRUZXN0TGlzdGVuZXIobmV3IEpVbml0WE1MUmVwb3J0ZXIoKSk7DQorICAgICAgdGVzdFJ1bm5lci5hZGRMaXN0ZW5lcihuZXcgVGVzdExpc3RlbmVyKG1fYmFzZVRlc3QpKTsNCisgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsNCisgICAgICAgIGZvciAoSUludm9rZWRNZXRob2RMaXN0ZW5lciBsIDogbGlzdGVuZXJzKSB7DQorICAgICAgICAgIHRlc3RSdW5uZXIuYWRkTGlzdGVuZXIobCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIHJldHVybiB0ZXN0UnVubmVyOw0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqICBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLg0KKw0KKyAgICogIEByZXR1cm4gdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC4NCisgICAqICBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLg0KKyAgICovDQorICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7DQorICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkgew0KKyAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsNCisgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogY2hpbGRyZW4pIHsNCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGVsZW1lbnQpKTsNCisgICAgICAgIGlmICghc3VjY2Vzcykgew0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgbm93IGVtcHR5IHNvIGRlbGV0ZSBpdA0KKyAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOw0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChTdHJpbmcgY2xzLCBTdHJpbmdbXSBwYXNzZWQsIFN0cmluZ1tdIGZhaWxlZCwgU3RyaW5nW10gc2tpcHBlZCkgew0KKyAgICBhZGRDbGFzcyhjbHMpOw0KKyAgICBydW4oKTsNCisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7DQorICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOw0KKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsNCisgIH0NCisNCit9IC8vIEJhc2VUZXN0DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2NsYXNzIFRlc3RMaXN0ZW5lciBleHRlbmRzIFRlc3RMaXN0ZW5lckFkYXB0ZXIgew0KKyAgcHJpdmF0ZSBzdGF0aWMgQmFzZVRlc3QgbV90ZXN0PSBudWxsOw0KKw0KKyAgcHVibGljIFRlc3RMaXN0ZW5lcihCYXNlVGVzdCB0MSkgew0KKyAgICBtX3Rlc3Q9IHQxOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHRyKSB7DQorICAgIG1fdGVzdC5hZGRQYXNzZWRUZXN0KHRyKTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCB0cikgew0KKyAgICBtX3Rlc3QuYWRkRmFpbGVkVGVzdCh0cik7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKElUZXN0UmVzdWx0IHJlc3VsdCkgew0KKyAgICBtX3Rlc3QuYWRkRmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0KHJlc3VsdCk7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgdHIpIHsNCisgICAgbV90ZXN0LmFkZFNraXBwZWRUZXN0KHRyKTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU3VjY2VzcyhJVGVzdFJlc3VsdCB0cikgew0KKyAgICBtX3Rlc3QuYWRkUGFzc2VkQ29uZmlnKHRyKTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uRmFpbHVyZShJVGVzdFJlc3VsdCB0cikgew0KKyAgICBtX3Rlc3QuYWRkRmFpbGVkQ29uZmlnKHRyKTsNCisgIH0NCisNCisgIEBPdmVycmlkZQ0KKyAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU2tpcChJVGVzdFJlc3VsdCB0cikgew0KKyAgICBtX3Rlc3QuYWRkU2tpcHBlZENvbmZpZyh0cik7DQorICB9DQorDQorfSAvLyBUZXN0TGlzdGVuZXINCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvQ2hlY2tTdWl0ZXNJbml0aWFsaXphdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9DaGVja1N1aXRlc0luaXRpYWxpemF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGRlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvQ2hlY2tTdWl0ZXNJbml0aWFsaXphdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBDaGVjayBmb3IgYSBidWcgaW4gaG93IHJlbGF0aXZlIHBhdGhzIGluIHN1aXRlIGZpbGVzIHdlcmUgYmVpbmcgaGFuZGxlZC4KKyAqCisgKiBBbGwgcGF0aHMgd2VyZSBiZWluZyByZXNvbHZlZCB1c2luZyB0aGUgaW5pdGlhbCBzdWl0ZSdzIGxvY2F0aW9uIGFuZCBub3QKKyAqIHRoYXQgb2YgdGhlIGN1cnJlbnQgc3VpdGUgYmVpbmcgcGFyc2VkL3Byb2Nlc3NlZC4KKyAqCisgKiBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgVGVzdE5HIGNhbiBoYW5kbGUgY2FzZXMgd2hlcmUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHNldCBvZgorICogZmlsZXMgKGFsbCBsaW5rZWQgdXNpbmcgcmVsYXRpdmUgcGF0aHMpOgorICoKKyAqIC0gcGFyZW50LXN1aXRlIC0+IFtjaGlsZC1zdWl0ZS0xLCBjaGlsZHJlbi9jaGlsZC1zdWl0ZS0zXQorICogLSBjaGlsZHJlbi9jaGlsZC1zdWl0ZS0zIC0+IFsuLi9jaGlsZC1zdWl0ZS0yLCBjaGlsZC1zdWl0ZS00LCBtb3JlY2hpbGRyZW4vY2hpbGQtc3VpdGUtNV0KKyAqCisgKiBDaGVjayB0aGUgPGNvZGU+Y2hlY2tzdWl0ZXNpbml0aWFsaXphdGlvbjwvY29kZT4gZm9sZGVyIHVuZGVyIHRlc3QgcmVzb3VyY2VzCisgKgorICogQGF1dGhvciBOYWxpbiBNYWthcgorICovCitwdWJsaWMgY2xhc3MgQ2hlY2tTdWl0ZXNJbml0aWFsaXphdGlvblRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgLyoqCisgICAqIENoaWxkIHN1aXRlcyBhbmQgdGVzdHMgd2l0aGluIGRpZmZlcmVudCBzdWl0ZXMgaGF2ZSBzYW1lIG5hbWVzCisgICAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjaGVjaygpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIFN0cmluZyB0ZXN0bmdYbWxQYXRoID0gZ2V0UGF0aFRvUmVzb3VyY2UoImNoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vcGFyZW50LXN1aXRlLnhtbCIpOworICAgIHRuZy5zZXRUZXN0U3VpdGVzKEFycmF5cy5hc0xpc3QodGVzdG5nWG1sUGF0aCkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgNCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0NsYXNzQ29uZmlndXJhdGlvbnMuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9DbGFzc0NvbmZpZ3VyYXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YmJjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9DbGFzc0NvbmZpZ3VyYXRpb25zLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDbGFzc0NvbmZpZ3VyYXRpb25zIHsKKworICBzdGF0aWMgaW50IGJlZm9yZUNvdW50ID0gMDsKKyAgc3RhdGljIGludCBhZnRlckNvdW50ID0gMDsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdENsYXNzKCkgeworICAgICsrYmVmb3JlQ291bnQ7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkBAQEBAQCBiZWZvcmVUZXN0Q2xhc3MgaGFzIGJlZW4gY2FsbGVkICIgKyBiZWZvcmVDb3VudCArICIgdGltZShzKSIpOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgYmVmb3JlQ291bnQgPSAwOworICAgIGFmdGVyQ291bnQgPSAwOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlclRlc3RDbGFzcygpIHsKKyAgICArK2FmdGVyQ291bnQ7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkBAQEBAQEAgYWZ0ZXJUZXN0Q2xhc3MgaGFzIGJlZW4gY2FsbGVkICIgKyBhZnRlckNvdW50ICsgIiB0aW1lKHMpIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0T25lKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0T25lIik7CisgICAgYXNzZXJ0IGJlZm9yZUNvdW50ID09IDE7CisgICAgYXNzZXJ0IGFmdGVyQ291bnQgPT0gMDsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RUd28oKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RUd28iKTsKKyAgICBhc3NlcnQgYmVmb3JlQ291bnQgPT0gMTsKKyAgICBhc3NlcnQgYWZ0ZXJDb3VudCA9PSAwOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFRocmVlKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0VGhyZWUiKTsKKyAgICBhc3NlcnQgYmVmb3JlQ291bnQgPT0gMTsKKyAgICBhc3NlcnQgYWZ0ZXJDb3VudCA9PSAwOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0NvbW1hbmRMaW5lVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0NvbW1hbmRMaW5lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTRlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvQ29tbWFuZExpbmVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LnNhbXBsZS5KVW5pdFNhbXBsZTE7CitpbXBvcnQgdGVzdGhlbHBlci5PdXRwdXREaXJlY3RvcnlQYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVUZXN0IHsKKworICAvKioKKyAgICogVGVzdCAtanVuaXQKKyAgICovCisgIEBUZXN0KGdyb3VwcyA9IHsgImN1cnJlbnQiIH0gKQorICBwdWJsaWMgdm9pZCBqdW5pdFBhcnNpbmcoKSB7CisgICAgU3RyaW5nW10gYXJndiA9IHsKKyAgICAgICItbG9nIiwgIjAiLAorICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAiLWp1bml0IiwKKyAgICAgICItdGVzdGNsYXNzIiwgInRlc3Quc2FtcGxlLkpVbml0U2FtcGxlMSIKKyAgICB9OworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJndiwgdGxhKTsKKworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHBhc3NlZCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpOworICAgIGFzc2VydEVxdWFscyhwYXNzZWQuc2l6ZSgpLCAyKTsKKyAgICBTdHJpbmcgdGVzdDEgPSBwYXNzZWQuZ2V0KDApLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKTsKKyAgICBTdHJpbmcgdGVzdDIgPSBwYXNzZWQuZ2V0KDEpLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKTsKKworICAgIGFzc2VydFRydWUoSlVuaXRTYW1wbGUxLkVYUEVDVEVEMS5lcXVhbHModGVzdDEpICYmIEpVbml0U2FtcGxlMS5FWFBFQ1RFRDIuZXF1YWxzKHRlc3QyKSB8fAorICAgICAgICBKVW5pdFNhbXBsZTEuRVhQRUNURUQxLmVxdWFscyh0ZXN0MikgJiYgSlVuaXRTYW1wbGUxLkVYUEVDVEVEMi5lcXVhbHModGVzdDEpKTsKKyAgICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhlIGFic2VuY2Ugb2YgLWp1bml0CisgICAqLworICBAVGVzdChncm91cHMgPSB7ICJjdXJyZW50IiB9ICkKKyAgcHVibGljIHZvaWQganVuaXRQYXJzaW5nMigpIHsKKyAgICBTdHJpbmdbXSBhcmd2ID0geworICAgICAgIi1sb2ciLCAiMCIsCisgICAgICAiLWQiLCBPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSwKKyAgICAgICItdGVzdGNsYXNzIiwgInRlc3Quc2FtcGxlLkpVbml0U2FtcGxlMSIKKyAgICB9OworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJndiwgdGxhKTsKKworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHBhc3NlZCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpOworICAgIGFzc2VydEVxdWFscyhwYXNzZWQuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZCBsaW5lIFN1aXRlIG5hbWUKKyAgICovCisgIEBUZXN0KGdyb3VwcyA9IHsgImN1cnJlbnQiIH0gKQorICBwdWJsaWMgdm9pZCBzdWl0ZU5hbWVPdmVycmlkZSgpIHsKKyAgICBTdHJpbmcgc3VpdGVOYW1lPSJNeVN1aXRlTmFtZSI7CisgICAgU3RyaW5nW10gYXJndiA9IHsKKyAgICAgICItbG9nIiwgIjAiLAorICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAiLWp1bml0IiwKKyAgICAgICItdGVzdGNsYXNzIiwgInRlc3Quc2FtcGxlLkpVbml0U2FtcGxlMSIsCisgICAgICAiLXN1aXRlbmFtZSIsICJcIiIrc3VpdGVOYW1lKyJcIiIKKyAgICB9OworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJndiwgdGxhKTsKKworICAgIExpc3Q8SVRlc3RDb250ZXh0PiBjb250ZXh0cyA9IHRsYS5nZXRUZXN0Q29udGV4dHMoKTsKKyAgICBhc3NlcnRUcnVlKGNvbnRleHRzLnNpemUoKT4wKTsKKyAgICBmb3IgKElUZXN0Q29udGV4dCBjb250ZXh0OmNvbnRleHRzKSB7CisgICAgCWFzc2VydEVxdWFscyhjb250ZXh0LmdldFN1aXRlKCkuZ2V0TmFtZSgpLHN1aXRlTmFtZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZCBsaW5lIHRlc3QgbmFtZQorICAgKi8KKyAgQFRlc3QoZ3JvdXBzID0geyAiY3VycmVudCIgfSApCisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lT3ZlcnJpZGUoKSB7CisgICAgU3RyaW5nIHRlc3ROYW1lPSJNeSBUZXN0IE5hbWUiOworICAgIFN0cmluZ1tdIGFyZ3YgPSB7CisgICAgICAiLWxvZyIsICIwIiwKKyAgICAgICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgIi1qdW5pdCIsCisgICAgICAiLXRlc3RjbGFzcyIsICJ0ZXN0LnNhbXBsZS5KVW5pdFNhbXBsZTEiLAorICAgICAgIi10ZXN0bmFtZSIsICJcIiIrdGVzdE5hbWUrIlwiIgorICAgIH07CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORy5wcml2YXRlTWFpbihhcmd2LCB0bGEpOworCisgICAgTGlzdDxJVGVzdENvbnRleHQ+IGNvbnRleHRzID0gdGxhLmdldFRlc3RDb250ZXh0cygpOworICAgIGFzc2VydFRydWUoY29udGV4dHMuc2l6ZSgpPjApOworICAgIGZvciAoSVRlc3RDb250ZXh0IGNvbnRleHQ6Y29udGV4dHMpIHsKKyAgICAJYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0TmFtZSgpLHRlc3ROYW1lKTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0VXNlRGVmYXVsdExpc3RlbmVyc0FyZ3VtZW50KCkgeworICAgIFRlc3RORy5wcml2YXRlTWFpbihuZXcgU3RyaW5nW10geworICAgICAgICAiLWxvZyIsICIwIiwgIi11c2VkZWZhdWx0bGlzdGVuZXJzIiwgImZhbHNlIiwgIi10ZXN0Y2xhc3MiLCAidGVzdC5zYW1wbGUuSlVuaXRTYW1wbGUxIgorICAgIH0sIG51bGwpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZFBhcmFtZXRlcigpIHsKKyAgICBTdHJpbmdbXSBhcmd2ID0geworICAgICAgIi1sb2ciLCAiMCIsCisgICAgICAiLWQiLCBPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSwKKyAgICAgICItbWV0aG9kcyIsICJ0ZXN0LnNhbXBsZS5TYW1wbGUyLm1ldGhvZDEsdGVzdC5zYW1wbGUuU2FtcGxlMi5tZXRob2QzIiwKKyAgICB9OworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJndiwgdGxhKTsKKworICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHBhc3NlZCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGFzc2VkLnNpemUoKSwgMik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoKHBhc3NlZC5nZXQoMCkuZ2V0TmFtZSgpLmVxdWFscygibWV0aG9kMSIpICYmCisgICAgICAgIHBhc3NlZC5nZXQoMSkuZ2V0TmFtZSgpLmVxdWFscygibWV0aG9kMyIpKQorICAgICAgICB8fAorICAgICAgICAocGFzc2VkLmdldCgxKS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2QxIikgJiYKKyAgICAgICAgcGFzc2VkLmdldCgwKS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2QzIikpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ29tbWFuZExpbmVUZXN0XSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0NvdW50U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0NvdW50U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzQ0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvQ291bnRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Ta2lwRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBVc2UgdGhpcyB0ZXN0IHRvIHNob3cgcnVuL2ZhaWxlZC9za2lwIHJlc3VsdAorICogZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZXN0bmctNS4xMiBhbmQgdGVzdG5nLTUtMTQKKyAqCisgKiBAYXV0aG9yIENBIFRlY2hub2xvZ2llcworICovCisKKworcHVibGljIGNsYXNzIENvdW50U2FtcGxlVGVzdCB7CisKKyAgICBAVGVzdChncm91cHMgPSB7ImZ1bmN0aW9uYWwifSkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlZEFuZFNraXBwZWQoKSB0aHJvd3MgU2tpcEV4Y2VwdGlvbiB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyB0aGlzIHRlc3QgYWZ0ZXIgaXQgaXMgaW52b2tlZC4iKTsKKyAgICAgICAgdGhyb3cgbmV3IFNraXBFeGNlcHRpb24oIlRoaXMgdGVzdCBpcyBza2lwcGVkIGFmdGVyIGludm9jYXRpb24iKTsKKyAgICB9CisKKyAgICBAVGVzdChncm91cHMgPSB7ImZ1bmN0aW9uYWwifSkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEludm9rZWRBbmRGYWlsZWQoKSB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsaW5nIHRoaXMgdGVzdCBhZnRlciBpdCBpcyBpbnZva2VkLiIpOworICAgICAgICBBc3NlcnQuZmFpbCgiRmFpbGluZyB0aGlzIHRlc3Qgb24gcHVycG9zZSIpOworICAgIH0KKworICAgIEBUZXN0KGdyb3VwcyA9IHsiZnVuY3Rpb25hbCJ9LCBkZXBlbmRzT25NZXRob2RzID0geyJ0ZXN0SW52b2tlZEFuZEZhaWxlZCJ9KQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V2lsbE5vdEJlSW52b2tlZE9ubHlTa2lwcGVkKCkgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhpcyB0ZXN0IHdpbGwgYmUgc2tpcHBlZCwgIiArCisvLyAgICAgICAgICAgICJidXQgbm90IGludm9rZWQgYmVjYXVzZSBpdHMgZGVwZW5kc09uTWV0aG9kIGZhaWxzLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9Db3VudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9Db3VudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU3NTdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0NvdW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlUmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ291bnRUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIk1ha2Ugc3VyZSB0aGF0IHNraXBwZWQgbWV0aG9kcyBhcmUgYWNjdXJhdGVseSBjb3VudGVkIikKKyAgcHVibGljIHZvaWQgc2tpcHBlZE1ldGhvZHNTaG91bGRCZUNvdW50ZWQoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShDb3VudFNhbXBsZVRlc3QuY2xhc3MpOworCisgICAgSVJlcG9ydGVyIHIgPSBuZXcgSVJlcG9ydGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcG9ydChMaXN0PFhtbFN1aXRlPiB4bWxTdWl0ZXMsIExpc3Q8SVN1aXRlPiBzdWl0ZXMsCisgICAgICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgICAgICBmb3IgKElTdWl0ZSBzIDogc3VpdGVzKSB7CisgICAgICAgICAgZm9yIChJU3VpdGVSZXN1bHQgc3IgOiBzLmdldFJlc3VsdHMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgSVRlc3RDb250ZXh0IGN0eCA9IHNyLmdldFRlc3RDb250ZXh0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGN0eC5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICB0bmcuYWRkTGlzdGVuZXIocik7CisgICAgdG5nLnJ1bigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvQ3RvckNhbGxlZE9uY2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9DdG9yQ2FsbGVkT25jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzUyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvQ3RvckNhbGxlZE9uY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogdGhpcyB0ZXN0IHZlcmlmeXMgdGhhdCB0aGUgdGVzdCBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZXhhY3RseSBvbmNlCisgKiByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHRlc3QgbWV0aG9kcyB3ZSBoYXZlLCBzaG93aW5nIHRoYXQgVGVzdE5HCisgKiBzZW1hbnRpY3MgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gSlVuaXQKKyAqLworcHVibGljIGNsYXNzIEN0b3JDYWxsZWRPbmNlIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgaW5zdGFudGlhdGVkID0gMDsKKyAgcHVibGljIEN0b3JDYWxsZWRPbmNlKCkgeworICAgIGluc3RhbnRpYXRlZCsrOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEoKXsKKyAgICBhc3NlcnQgaW5zdGFudGlhdGVkID09IDEgOiAiRXhwZWN0ZWQgMSwgd2FzIGludm9rZWQgIiArIGluc3RhbnRpYXRlZCArICIgdGltZXMiOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKXsKKyAgICBhc3NlcnQgaW5zdGFudGlhdGVkID09IDEgOiAiRXhwZWN0ZWQgMSwgd2FzIGludm9rZWQgIiArIGluc3RhbnRpYXRlZCArICIgdGltZXMiOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDMoKXsKKyAgICBhc3NlcnQgaW5zdGFudGlhdGVkID09IDEgOiAiRXhwZWN0ZWQgMSwgd2FzIGludm9rZWQgIiArIGluc3RhbnRpYXRlZCArICIgdGltZXMiOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgaW5zdGFudGlhdGVkID0gMDsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0R5bmFtaWNHcmFwaFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9EeW5hbWljR3JhcGhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwZTk4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9EeW5hbWljR3JhcGhUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuRHluYW1pY0dyYXBoOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuRHluYW1pY0dyYXBoLlN0YXR1czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBEeW5hbWljR3JhcGhUZXN0IHsKKworICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCBhc3NlcnRGcmVlTm9kZXNFcXVhbHMoRHluYW1pY0dyYXBoPFQ+IGdyYXBoLCBUW10gZXhwZWN0ZWQpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcihncmFwaC5nZXRGcmVlTm9kZXMoKS50b0FycmF5KCksIGV4cGVjdGVkKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgeworICAgIER5bmFtaWNHcmFwaDxTdHJpbmc+IGRnID0gbmV3IER5bmFtaWNHcmFwaDw+KCk7CisgICAgZGcuYWRkTm9kZSgiYTEiKTsKKyAgICBkZy5hZGROb2RlKCJhMiIpOworICAgIGRnLmFkZE5vZGUoImIxIik7CisgICAgZGcuYWRkTm9kZSgiYjIiKTsKKyAgICBkZy5hZGROb2RlKCJjMSIpOworICAgIGRnLmFkZEVkZ2UoImIxIiwgImExIik7CisgICAgZGcuYWRkRWRnZSgiYjEiLCAiYTIiKTsKKyAgICBkZy5hZGRFZGdlKCJiMiIsICJhMSIpOworICAgIGRnLmFkZEVkZ2UoImIyIiwgImEyIik7CisgICAgZGcuYWRkRWRnZSgiYzEiLCAiYjEiKTsKKyAgICBkZy5hZGRFZGdlKCJjMSIsICJiMiIpOworICAgIGRnLmFkZE5vZGUoIngiKTsKKyAgICBkZy5hZGROb2RlKCJ5Iik7CisgICAgTGlzdDxTdHJpbmc+IGZyZWVOb2RlcyA9IGRnLmdldEZyZWVOb2RlcygpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHsiYTEiLCAiYTIiLCAieSIsICJ4In0pOworCisgICAgZGcuc2V0U3RhdHVzKGZyZWVOb2RlcywgU3RhdHVzLlJVTk5JTkcpOworICAgIGRnLnNldFN0YXR1cygiYTEiLCBTdGF0dXMuRklOSVNIRUQpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHt9KTsKKworICAgIGRnLnNldFN0YXR1cygiYTIiLCBTdGF0dXMuRklOSVNIRUQpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHsgImIxIiwgImIyIn0pOworCisgICAgZGcuc2V0U3RhdHVzKCJiMiIsIFN0YXR1cy5SVU5OSU5HKTsKKyAgICBkZy5zZXRTdGF0dXMoImIxIiwgU3RhdHVzLkZJTklTSEVEKTsKKyAgICBhc3NlcnRGcmVlTm9kZXNFcXVhbHMoZGcsIG5ldyBTdHJpbmdbXSB7fSk7CisKKyAgICBkZy5zZXRTdGF0dXMoImIyIiwgU3RhdHVzLkZJTklTSEVEKTsKKyAgICBhc3NlcnRGcmVlTm9kZXNFcXVhbHMoZGcsIG5ldyBTdHJpbmdbXSB7ICJjMSIgfSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICBEeW5hbWljR3JhcGg8U3RyaW5nPiBkZyA9IG5ldyBEeW5hbWljR3JhcGg8PigpOworICAgIGRnLmFkZE5vZGUoImExIik7CisgICAgZGcuYWRkTm9kZSgiYTIiKTsKKyAgICBkZy5hZGROb2RlKCJiMSIpOworICAgIGRnLmFkZEVkZ2UoImIxIiwgImExIik7CisgICAgZGcuYWRkRWRnZSgiYjEiLCAiYTIiKTsKKyAgICBkZy5hZGROb2RlKCJ4Iik7CisgICAgTGlzdDxTdHJpbmc+IGZyZWVOb2RlcyA9IGRnLmdldEZyZWVOb2RlcygpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHsgImExIiwgImEyIiwgIngiIH0pOworCisgICAgZGcuc2V0U3RhdHVzKGZyZWVOb2RlcywgU3RhdHVzLlJVTk5JTkcpOworICAgIGRnLnNldFN0YXR1cygiYTEiLCBTdGF0dXMuRklOSVNIRUQpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHt9KTsKKworICAgIGRnLnNldFN0YXR1cygiYTIiLCBTdGF0dXMuRklOSVNIRUQpOworICAgIGFzc2VydEZyZWVOb2Rlc0VxdWFscyhkZywgbmV3IFN0cmluZ1tdIHsgImIxIiB9KTsKKworICAgIGRnLnNldFN0YXR1cygiYjIiLCBTdGF0dXMuUlVOTklORyk7CisgICAgZGcuc2V0U3RhdHVzKCJiMSIsIFN0YXR1cy5GSU5JU0hFRCk7CisgICAgYXNzZXJ0RnJlZU5vZGVzRXF1YWxzKGRnLCBuZXcgU3RyaW5nW10ge30pOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9FY2xpcHNlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0VjbGlwc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MGRhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9FY2xpcHNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBNYWtlIHN1cmUgdGhhdCB0aGVzZSB0ZXN0IHBhc3Mgd2hlbiBydW4gYnkgdGhlIEVjbGlwc2UgcGx1Zy1pbi4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgeG1sRmlsZVNob3VsZEJlUnVuQXRJdHNQbGFjZUFuZE5vdENvcGllZChJVGVzdENvbnRleHQgY3R4KSB7CisgICAgU3RyaW5nIGZpbGVOYW1lID0gY3R4LmdldFN1aXRlKCkuZ2V0WG1sU3VpdGUoKS5nZXRGaWxlTmFtZSgpLnJlcGxhY2UoIlxcIiwgIi8iKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWxlTmFtZS5jb250YWlucygic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvRXhjbHVkZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0V4Y2x1ZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE2ZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0V4Y2x1ZGUuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBFeGNsdWRlIHsKKyAgcHJpdmF0ZSBib29sZWFuIG1faW5jbHVkZWQxID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2luY2x1ZGVkMiA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9leGNsdWRlZDEgPSB0cnVlOworICBwcml2YXRlIGJvb2xlYW4gbV9leGNsdWRlZDIgPSB0cnVlOworCisgIEBUZXN0KGdyb3VwcyA9IHsgImdyb3VwMSJ9ICkKKyAgcHVibGljIHZvaWQgaW5jbHVkZWQxKCkgeworICAgIHBwcCgiSU5DTFVERUQxIik7CisgICAgbV9pbmNsdWRlZDEgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiZ3JvdXAxIn0gKQorICBwdWJsaWMgdm9pZCBpbmNsdWRlZDIoKSB7CisgICAgcHBwKCJJTkNMVURFRDIiKTsKKyAgICBtX2luY2x1ZGVkMiA9IHRydWU7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJncm91cDEifSApCisgIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkMSgpIHsKKyAgICBwcHAoIkVYQ0xVREVEMSIpOworICAgIG1fZXhjbHVkZWQxID0gZmFsc2U7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJncm91cDEifSApCisgIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkMigpIHsKKyAgICBwcHAoIkVYQ0xVREVEMSIpOworICAgIG1fZXhjbHVkZWQyID0gZmFsc2U7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJncm91cDEiIH0sIGdyb3VwcyA9ICB7Imdyb3VwMiJ9ICkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIHBwcCgiVkVSSUZZIik7CisgICAgYXNzZXJ0IG1faW5jbHVkZWQxICYmIG1faW5jbHVkZWQyICYmIG1fZXhjbHVkZWQxICYmIG1fZXhjbHVkZWQyOgorICAgICAgIlNob3VsZCBhbGwgYmUgdHJ1ZTogIiArIG1faW5jbHVkZWQxICsgIiAiCisgICAgICArIG1faW5jbHVkZWQyICsgIiAiCisgICAgICArIG1fZXhjbHVkZWQxICsgIiAiCisgICAgICArIG1fZXhjbHVkZWQyOworICB9CisKKyAgc3RhdGljIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0V4Y2x1ZGVdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0ZpbGVTdHJpbmdCdWZmZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvRmlsZVN0cmluZ0J1ZmZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlhMWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0ZpbGVTdHJpbmdCdWZmZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcucmVwb3J0ZXJzLkZpbGVTdHJpbmdCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBGaWxlU3RyaW5nQnVmZmVyVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmFzaWMoKSB7CisgICAgeworICAgICAgRmlsZVN0cmluZ0J1ZmZlciBmc2IgPSBuZXcgRmlsZVN0cmluZ0J1ZmZlcig1KTsKKyAgICAgIFN0cmluZyBzID0gIjAxMjM0NTY3ODkiOworICAgICAgU3RyaW5nIHMzID0gcyArIHMgKyBzOworICAKKyAgICAgIGZzYi5hcHBlbmQoczMpOworLy8gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMzLCBmc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgeworICAgICAgRmlsZVN0cmluZ0J1ZmZlciBmc2IgPSBuZXcgRmlsZVN0cmluZ0J1ZmZlcig1KTsKKyAgICAgIFN0cmluZyBzID0gIjAxMjM0NTY3ODkiOworICAgICAgU3RyaW5nIHMzID0gcyArIHMgKyBzOworICAKKyAgICAgIGZzYi5hcHBlbmQocyk7CisgICAgICBmc2IuYXBwZW5kKHMpOworICAgICAgZnNiLmFwcGVuZChzKTsKKy8vICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzMywgZnNiLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0dyYXBoVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0dyYXBoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWY5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvR3JhcGhUZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkdyYXBoOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuVGFyamFuOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEdyYXBoVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc29ydCgpIHsKKyAgICBHcmFwaDxTdHJpbmc+IGcgPSBuZXcgR3JhcGg8PigpOworICAgIGcuYWRkTm9kZSgiMyIpOworICAgIGcuYWRkTm9kZSgiMSIpOworICAgIGcuYWRkTm9kZSgiMi4yIik7CisgICAgZy5hZGROb2RlKCJpbmRlcGVuZGVudCIpOworICAgIGcuYWRkTm9kZSgiMi4xIik7CisgICAgZy5hZGROb2RlKCIyIik7CisKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIzIiwgIjIiKTsKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIzIiwgIjIuMSIpOworICAgIGcuYWRkUHJlZGVjZXNzb3IoIjMiLCAiMi4yIik7CisgICAgZy5hZGRQcmVkZWNlc3NvcigiMiIsICIxIik7CisgICAgZy5hZGRQcmVkZWNlc3NvcigiMi4xIiwgIjEiKTsKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIyLjIiLCAiMSIpOworCisgICAgZy50b3BvbG9naWNhbFNvcnQoKTsKKyAgICBMaXN0PFN0cmluZz4gbCA9IGcuZ2V0U3RyaWN0bHlTb3J0ZWROb2RlcygpOworICAgIGludCBpID0gMDsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiMSIuZXF1YWxzKGwuZ2V0KGkpKSk7CisgICAgaSsrOworICAgIEFzc2VydC5hc3NlcnRUcnVlKCIyIi5lcXVhbHMobC5nZXQoaSkpIHx8ICIyLjEiLmVxdWFscyhsLmdldChpKSkgfHwgIjIuMiIuZXF1YWxzKGwuZ2V0KGkpKSk7CisgICAgaSsrOworICAgIEFzc2VydC5hc3NlcnRUcnVlKCIyIi5lcXVhbHMobC5nZXQoaSkpIHx8ICIyLjEiLmVxdWFscyhsLmdldChpKSkgfHwgIjIuMiIuZXF1YWxzKGwuZ2V0KGkpKSk7CisgICAgaSsrOworICAgIEFzc2VydC5hc3NlcnRUcnVlKCIyIi5lcXVhbHMobC5nZXQoaSkpIHx8ICIyLjEiLmVxdWFscyhsLmdldChpKSkgfHwgIjIuMiIuZXF1YWxzKGwuZ2V0KGkpKSk7CisgICAgaSsrOworICAgIEFzc2VydC5hc3NlcnRUcnVlKCIzIi5lcXVhbHMobC5nZXQoaSkpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKDEgPT0gZy5nZXRJbmRlcGVuZGVudE5vZGVzKCkuc2l6ZSgpKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCBjeWNsZVNob3VsZEZhaWwoKSB7CisgICAgR3JhcGg8U3RyaW5nPiBnID0gY3JlYXRlQ3ljbGljR3JhcGgoKTsKKyAgICBnLnRvcG9sb2dpY2FsU29ydCgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY3ljbGVTaG91bGRCZUNvcnJlY3QoKSB7CisgICAgR3JhcGg8U3RyaW5nPiBnID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgZyA9IGNyZWF0ZUN5Y2xpY0dyYXBoKCk7CisgICAgICBnLnRvcG9sb2dpY2FsU29ydCgpOworICAgIH0KKyAgICBjYXRjaChUZXN0TkdFeGNlcHRpb24gZXgpIHsKKyAgICAgIFRhcmphbjxTdHJpbmc+IHQgPSBuZXcgVGFyamFuPD4oZywgIjEiKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModC5nZXRDeWNsZSgpLnNpemUoKSwgMyk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIEdyYXBoPFN0cmluZz4gY3JlYXRlQ3ljbGljR3JhcGgoKSB7CisgICAgR3JhcGg8U3RyaW5nPiBnID0gbmV3IEdyYXBoPD4oKTsKKyAgICBnLmFkZE5vZGUoIjMiKTsKKyAgICBnLmFkZE5vZGUoIjIiKTsKKyAgICBnLmFkZE5vZGUoIjEiKTsKKworICAgIGcuYWRkUHJlZGVjZXNzb3IoIjMiLCAiMiIpOworICAgIGcuYWRkUHJlZGVjZXNzb3IoIjIiLCAiMSIpOworICAgIGcuYWRkUHJlZGVjZXNzb3IoIjEiLCAiMyIpOworCisgICAgcmV0dXJuIGc7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmaW5kUHJlZGVjZXNzb3JzKCkgeworICAgIEdyYXBoPFN0cmluZz4gZyA9IG5ldyBHcmFwaDw+KCk7CisgICAgZy5hZGROb2RlKCIzIik7CisgICAgZy5hZGROb2RlKCIxIik7CisgICAgZy5hZGROb2RlKCIyLjIiKTsKKyAgICBnLmFkZE5vZGUoImluZGVwZW5kZW50Iik7CisgICAgZy5hZGROb2RlKCIyLjEiKTsKKyAgICBnLmFkZE5vZGUoIjIiKTsKKworICAgIC8vIDEgLT4gIDIuMSwgMi4yLCAyLjMgLS0+IDMKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIzIiwgIjIiKTsKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIzIiwgIjIuMSIpOworICAgIGcuYWRkUHJlZGVjZXNzb3IoIjMiLCAiMi4yIik7CisgICAgZy5hZGRQcmVkZWNlc3NvcigiMiIsICIxIik7CisgICAgZy5hZGRQcmVkZWNlc3NvcigiMi4xIiwgIjEiKTsKKyAgICBnLmFkZFByZWRlY2Vzc29yKCIyLjIiLCAiMSIpOworCisgICAgLy8gSW52b2tlIHNvcnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHNpZGUgZWZmZWN0CisgICAgZy50b3BvbG9naWNhbFNvcnQoKTsKKworICAgIC8vCisgICAgLy8gVGVzdCBmaW5kUHJlZGVjZXNzb3JzCisgICAgLy8KKyAgICB7CisgICAgICBMaXN0PFN0cmluZz4gcHJlZGVjZXNzb3JzID0gZy5maW5kUHJlZGVjZXNzb3JzKCIyIik7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcmVkZWNlc3NvcnMuc2l6ZSgpID09IDEpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJlZGVjZXNzb3JzLmdldCgwKS5lcXVhbHMoIjEiKSk7CisgICAgfQorCisgICAgeworICAgICAgTGlzdDxTdHJpbmc+IHByZWRlY2Vzc29ycyA9IGcuZmluZFByZWRlY2Vzc29ycygiMyIpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcmVkZWNlc3NvcnMuc2l6ZSgpID09IDQpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJlZGVjZXNzb3JzLmdldCgwKS5lcXVhbHMoIjEiKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcmVkZWNlc3NvcnMuZ2V0KDEpLmVxdWFscygiMi4xIikKKyAgICAgICAgfHwgcHJlZGVjZXNzb3JzLmdldCgxKS5lcXVhbHMoIjIuMiIpCisgICAgICAgIHx8IHByZWRlY2Vzc29ycy5nZXQoMSkuZXF1YWxzKCIyIikpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJlZGVjZXNzb3JzLmdldCgyKS5lcXVhbHMoIjIuMSIpCisgICAgICAgIHx8IHByZWRlY2Vzc29ycy5nZXQoMikuZXF1YWxzKCIyLjIiKQorICAgICAgICB8fCBwcmVkZWNlc3NvcnMuZ2V0KDIpLmVxdWFscygiMiIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByZWRlY2Vzc29ycy5nZXQoMykuZXF1YWxzKCIyLjEiKQorICAgICAgICB8fCBwcmVkZWNlc3NvcnMuZ2V0KDMpLmVxdWFscygiMi4yIikKKyAgICAgICAgfHwgcHJlZGVjZXNzb3JzLmdldCgzKS5lcXVhbHMoIjIiKSk7CisgICAgfQorICB9CisKKyAgLy8gVXNpbmcgYW4gZWFybGllciBpbXBsZW1lbnRhdGlvbiBvZiBHcmFwaC5maW5kUHJlY2Vzc29ycywgZmluZGluZworICAvLyBwcmVkZWNlc3NvcnMgaW4gY2VydGFpbiBraW5kcyBvZiBncmFwaHMgd2hlcmUgbWFueSBub2RlcyBoYXZlIHRoZQorICAvLyBzYW1lIHByZWRlY2Vzc29ycyBjb3VsZCBiZSB2ZXJ5IHNsb3csIHNpbmNlIHRoZSBvbGQgaW1wbGVtZW50YXRpb24KKyAgLy8gd291bGQgZXhwbG9yZSB0aGUgc2FtZSBub2RlcyByZXBlYXRlZGx5LiAgVGhpcyBzaXR1YXRpb24gY291bGQKKyAgLy8gaGFwcGVuIHdoZW4gdGVzdCBtZXRob2RzIGFyZSBvcmdhbml6ZWQgaW4gc2V2ZXJhbCBncm91cHMsIHdpdGgKKyAgLy8gZGVwZW5kc09uR3JvdXBzIGFubm90YXRpb25zIHNvIHRoYXQgZWFjaCBtZXRob2QgaW4gb25lIGdyb3VwIGRlcGVuZHMKKyAgLy8gb24gYWxsIG9mIHRoZSBtZXRob2RzIGluIGFub3RoZXIgZ3JvdXAuICBJZiB0aGVyZSB3ZXJlIHNldmVyYWwKKyAgLy8gc3VjaCBncm91cHMgZGVwZW5kaW5nIG9uIGVhY2ggb3RoZXIgaW4gYSBjaGFpbiwgdGhlIGNvbWJpbmF0b3JpY3MKKyAgLy8gb2YgdGhlIG9sZCBtZXRob2QgYmVjYW1lIGV4Y2Vzc2l2ZS4gIFRoaXMgdGVzdCBidWlsZHMgYSA3Mi1ub2RlIGdyYXBoIHRoYXQKKyAgLy8gZW11bGF0ZXMgdGhpcyBzaXR1YXRpb24sIHRoZW4gY2FsbCBHcmFwaC5maW5kUHJlZGVjZXNzb3JzLiAgVGhlIG9sZAorICAvLyBpbXBsZW1lbnRhdGlvbiBydW4gdGhpcyBpbiA3MCsgc2Vjb25kcyBvbiBteSBjb21wdXRlciwgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbgorICAvLyB0YWtlcyBhIGZldyBtaWxsaXNlY29uZHMuICBJbiBwcmFjdGljZSwgd2l0aCBsYXJnZXIgZ3JhcGhzLCB0aGUgZm9ybWVyCisgIC8vIHNsb3duZXNzIGNvdWxkIGdldCB2ZXJ5IGV4dHJlbWUsIHRha2luZyBob3VycyBvciBtb3JlIHRvIGNvbXBsZXRlCisgIC8vIGluIHNvbWUgcmVhbCB1c2VyIHNpdHVhdGlvbnMuCisgIC8vCisgIEBUZXN0KHRpbWVPdXQgPSA1MDAwKSAvLyBJZiB0aGlzIHRha2VzIG1vcmUgdGhhbiA1IHNlY29uZHMgd2UndmUgZGVmaW5pdGVseSByZWdyZXNzZWQuCisgIHB1YmxpYyB2b2lkIGZpbmRQcmVkZWNlc3NvcnNUaW1pbmcoKSB7CisgICAgR3JhcGg8U3RyaW5nPiBnID0gbmV3IEdyYXBoPD4oKTsKKworICAgIGZpbmFsIFN0cmluZyByb290Tm9kZSA9ICJteXJvb3QiOworICAgIGZpbmFsIFN0cmluZyBpbmRlcGVuZGVudE5vZGUgPSAiaW5kZXBlbmRlbnQiOworICAgIGcuYWRkTm9kZShyb290Tm9kZSk7CisgICAgZy5hZGROb2RlKGluZGVwZW5kZW50Tm9kZSk7CisKKyAgICBmaW5hbCBpbnQgbWF4RGVwdGggPSA3OworICAgIGZpbmFsIGludCBub2Rlc1BlckRlcHRoID0gMTA7IC8vIG11c3QgYmUgPCAxMDAKKyAgICAvLworICAgIC8vIEFkZCBtYXhEZXB0aCBncm91cHMgb2YgbmV3IG5vZGVzLCB3aGVyZSBlYWNoIGdyb3VwIGNvbnRhaW5zIG5vZGVzUGVyRGVwdGgKKyAgICAvLyBub2RlcywgYW5kIGVhY2ggbm9kZSBpbiBhIGdyb3VwIGEgZGVwdGggTiBoYXMgZWFjaCBub2RlIGluIHRoZSBncm91cAorICAgIC8vIGF0IGRlcHRoIChOLTEpIGFzIGEgcHJlZGVjZXNzb3IuCisgICAgLy8KKyAgICBmb3IgKGludCBkZXB0aCA9IDE7IGRlcHRoIDw9IG1heERlcHRoOyBkZXB0aCsrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzUGVyRGVwdGg7IGkrKykgeworICAgICAgICBTdHJpbmcgbmV3Tm9kZSA9IFN0cmluZy52YWx1ZU9mKGkgKyAoMTAwICogZGVwdGgpKTsKKyAgICAgICAgZy5hZGROb2RlKG5ld05vZGUpOworICAgICAgICBpZiAoZGVwdGggPT0gMSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbm9kZXNQZXJEZXB0aDsgaisrKSB7CisgICAgICAgICAgU3RyaW5nIHByZXZOb2RlID0gU3RyaW5nLnZhbHVlT2YoaiArICgxMDAgKiAoZGVwdGggLSAxKSkpOworICAgICAgICAgIGcuYWRkUHJlZGVjZXNzb3IobmV3Tm9kZSwgcHJldk5vZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmluYWxseSwgbWFrZSBhbGwgb2YgdGhlIG5vZGVzIGluIHRoZSBncm91cCBhdCBkZXB0aCBtYXhEZXB0aAorICAgIC8vIGJlIHByZWRlY2Vzc29ycyBvZiByb290Tm9kZS4KKyAgICAvLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXNQZXJEZXB0aDsgaSsrKSB7CisgICAgICBTdHJpbmcgbm9kZSA9IFN0cmluZy52YWx1ZU9mKGkgKyAoMTAwICogbWF4RGVwdGgpKTsKKyAgICAgIGcuYWRkUHJlZGVjZXNzb3Iocm9vdE5vZGUsIG5vZGUpOworICAgIH0KKworICAgIC8vIE5vdyB3ZSdyZSBkb25lIGJ1aWxkaW5nIHRoZSBncmFwaCwgd2hpY2ggaGFzIChtYXhEZXB0aCAqIG5vZGVzUGVyRGVwdGgpICsgMgorICAgIC8vIG5vZGVzLiAgcm9vdE5vZGUgaGFzIGFsbCBvZiB0aGUgb3RoZXIgbm9kZXMgZXhjZXB0IGluZGVwZW5kZW50Tm9kZQorICAgIC8vIGFzIHByZWRlY2Vzc29ycy4KKworICAgIC8vCisgICAgLy8gVGVzdCBmaW5kUHJlZGVjZXNzb3JzCisgICAgLy8KKyAgICB7CisgICAgICBMaXN0PFN0cmluZz4gcHJlZGVjZXNzb3JzID0gZy5maW5kUHJlZGVjZXNzb3JzKHJvb3ROb2RlKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByZWRlY2Vzc29ycy5zaXplKCkgPT0gKG1heERlcHRoICogbm9kZXNQZXJEZXB0aCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0luZGl2aWR1YWxNZXRob2RzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0luZGl2aWR1YWxNZXRob2RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGM3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvSW5kaXZpZHVhbE1ldGhvZHNUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRlc3QgdGhhdCBpZiBhbiBpbmRpdmlkdWFsIG1ldGhvZCBpcyBzcGVjaWZpZWQgb24gdGVzdG5nLnhtbCwgdGhlIEBDb25maWd1cmF0aW9uCisgKiBtZXRob2Qgc3RpbGwgcnVucy4KKyAqCisgKiBDcmVhdGVkIG9uIEF1ZyAxLCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgSW5kaXZpZHVhbE1ldGhvZHNUZXN0Cit7CisgICAgcHJpdmF0ZSBib29sZWFuIG1fc2V0VXBDYWxsZWQgPSBmYWxzZTsKKworICAgIEBCZWZvcmVNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpCisgICAgeworICAgICAgICBtX3NldFVwQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoKQorICAgIHsKKyAgICAgICAgLy8gdGhpcyBsaW5lIGNhdXNlcyB0aGUgdGVzdCB0byBmYWlsLCBzaG93aW5nIHRoYXQgc2V0VXAoKSBoYWRuJ3QgYmVlbiBydW4KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobV9zZXRVcENhbGxlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L0ludm9jYXRpb25BbmRTdWNjZXNzUGVyY2VudGFnZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9JbnZvY2F0aW9uQW5kU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNDQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9JbnZvY2F0aW9uQW5kU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHRlc3RzIGludm9jYXRpb25Db3VudCBhbmQgc3VjY2Vzc1BlcmNlbnRhZ2UKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgSW52b2NhdGlvbkFuZFN1Y2Nlc3NQZXJjZW50YWdlVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnZvY2F0aW9uQ291bnQoKSB7CisgICAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuSW52b2NhdGlvbkNvdW50VGVzdCIpOworICAgICAgYWRkSW5jbHVkZWRHcm91cCgiaW52b2NhdGlvbk9ubHkiKTsKKyAgICAgIHJ1bigpOworICAgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAgICJ0ZW5UaW1lc1Nob3VsZFN1Y2NlZWQiLAorICAgICAgfTsKKyAgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgIH07CisgICAgICB2ZXJpZnlSZXN1bHRzKGdldFBhc3NlZFRlc3RzKCksIDEwLCAicGFzc2VkIHRlc3RzIik7CisvLyAgICAgIE1hcCBwYXNzZWRUZXN0cyA9IGdldFBhc3NlZFRlc3RzKCk7CisvLyAgICAgIFNldCBrZXlzID0gcGFzc2VkVGVzdHMua2V5U2V0KCk7CisvLyAgICAgIE9iamVjdCBmaXJzdEtleSA9IGtleXMuaXRlcmF0b3IoKS5uZXh0KCk7CisvLyAgICAgIElUZXN0UmVzdWx0IHBhc3NlZFJlc3VsdCA9IChJVGVzdFJlc3VsdCkgcGFzc2VkVGVzdHMuZ2V0KGZpcnN0S2V5KTsKKy8vICAgICAgaW50IG4gPSBwYXNzZWRSZXN1bHQuZ2V0UGFzc2VkTWV0aG9kcygpLnNpemUoKTsKKy8vICAgICAgYXNzZXJ0IG4gPT0gMTAgOgorLy8gICAgICAgICJFeHBlY3RlZCAxMCB0ZXN0cyB0byBoYXZlIHBhc3NlZCwgYnV0IG9ubHkgZm91bmQgIiArIG47CisgICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIH0KKworICAgLyoqCisgICAgKiBSZXN1bHQgZXhwZWN0ZWQ6CisgICAgKiA4IHBhc3NlZAorICAgICogMiBmYWlsZWQgYnV0IHdpdGhpbiBzdWNjZXNzIHBlcmNlbnRhZ2UKKyAgICAqLworICAgQFRlc3QKKyAgIHB1YmxpYyB2b2lkIHN1Y2Nlc3NQZXJjZW50YWdlVGhhdFN1Y2NlZWRzKCkgeworICAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuSW52b2NhdGlvbkNvdW50VGVzdCIpOworICAgICBhZGRJbmNsdWRlZEdyb3VwKCJzdWNjZXNzUGVyY2VudGFnZVRoYXRTdWNjZWVkc09ubHkiKTsKKyAgICAgcnVuKCk7CisgICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgICJzdWNjZXNzUGVyY2VudGFnZVNob3VsZFN1Y2NlZWQiLAorICAgICB9OworICAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgIH07CisgICAgIFN0cmluZ1tdIGZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlID0geworICAgICAgICAgInN1Y2Nlc3NQZXJjZW50YWdlU2hvdWxkU3VjY2VlZCIsCisgICAgIH07CisgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSIsCisgICAgICAgICBmYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSwgZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpKTsKKyAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworCisgICAgIC8vIFNob3VsZCBoYXZlIDggcGFzc2VkLCAyIGZhaWxlZCBidXQgd2l0aGluIHN1Y2Nlc3MgcGVyY2VudGFnZQorICAgICB2ZXJpZnlSZXN1bHRzKGdldFBhc3NlZFRlc3RzKCksIDgsICJwYXNzZWQgdGVzdHMiKTsKKyAgICAgdmVyaWZ5UmVzdWx0cygKKyAgICAgICBnZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCksIDIsCisgICAgICAgImZhaWxlZF9idXRfd2l0aGluX3N1Y2Nlc3NfcGVyY2VudGFnZV90ZXN0cyIpOworICAgfQorCisgICAvKioKKyAgICAqIFJlc3VsdCBleHBlY3RlZDoKKyAgICAqIDggcGFzc2VkCisgICAgKiAxIGZhaWxlZCBidXQgd2l0aGluIHN1Y2Nlc3MgcGVyY2VudGFnZQorICAgICogMSBmYWlsZWQKKyAgICAqLworICAgQFRlc3QKKyAgIHB1YmxpYyB2b2lkIHN1Y2Nlc3NQZXJjZW50YWdlVGhhdEZhaWxzKCkgeworICAgICBhZGRDbGFzcyh0ZXN0LnNhbXBsZS5JbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzKTsKKyAgICAgYWRkSW5jbHVkZWRHcm91cCgic3VjY2Vzc1BlcmNlbnRhZ2VUaGF0RmFpbHNPbmx5Iik7CisgICAgIHJ1bigpOworICAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICAic3VjY2Vzc1BlcmNlbnRhZ2VTaG91bGRGYWlsIiwKKyAgICAgfTsKKyAgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgICAgInN1Y2Nlc3NQZXJjZW50YWdlU2hvdWxkRmFpbCIsCisgICAgIH07CisgICAgIFN0cmluZ1tdIGZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlID0geworICAgICAgICAgInN1Y2Nlc3NQZXJjZW50YWdlU2hvdWxkRmFpbCIsCisgICAgIH07CisgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSIsCisgICAgICAgICBmYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZSwgZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpKTsKKyAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworCisgICAgIC8vIFNob3VsZCBoYXZlIDggcGFzc2VkLCAyIGZhaWxlZCBidXQgd2l0aGluIHN1Y2Nlc3MgcGVyY2VudGFnZQorICAgICB2ZXJpZnlSZXN1bHRzKGdldFBhc3NlZFRlc3RzKCksIDgsICJwYXNzZWQgdGVzdHMiKTsKKyAgICAgdmVyaWZ5UmVzdWx0cyhnZXRGYWlsZWRUZXN0cygpLCAxLCAiZmFpbGVkIHRlc3RzIik7CisgICAgIHZlcmlmeVJlc3VsdHMoCisgICAgICAgZ2V0RmFpbGVkQnV0V2l0aGluU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0cygpLCAxLAorICAgICAgICJmYWlsZWRfYnV0X3dpdGhpbl9zdWNjZXNzX3BlcmNlbnRhZ2VfdGVzdHMiKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0ludm9jYXRpb25dICIgKyBzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0ludm9rZWRNZXRob2ROYW1lTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY1NmY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L0ludm9rZWRNZXRob2ROYW1lTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vIFRPRE8gcmVwbGFjZSBvdGhlciB0ZXN0IElJbnZva2VkTWV0aG9kTGlzdGVuZXIgYnkgdGhpcyBvbmUKK3B1YmxpYyBjbGFzcyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyIGltcGxlbWVudHMgSUludm9rZWRNZXRob2RMaXN0ZW5lciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gaW52b2tlZE1ldGhvZE5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGZhaWxlZE1ldGhvZE5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHNraXBwZWRNZXRob2ROYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBzdWNjZWVkTWV0aG9kTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYmVmb3JlSW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBpbnZva2VkTWV0aG9kTmFtZXMuYWRkKG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0Q29uc3RydWN0b3JPck1ldGhvZCgpLmdldE5hbWUoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIHN3aXRjaCAodGVzdFJlc3VsdC5nZXRTdGF0dXMoKSkgeworICAgICAgY2FzZSBJVGVzdFJlc3VsdC5GQUlMVVJFOgorICAgICAgICBmYWlsZWRNZXRob2ROYW1lcy5hZGQobWV0aG9kLmdldFRlc3RNZXRob2QoKS5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElUZXN0UmVzdWx0LlNLSVA6CisgICAgICAgIHNraXBwZWRNZXRob2ROYW1lcy5hZGQobWV0aG9kLmdldFRlc3RNZXRob2QoKS5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElUZXN0UmVzdWx0LlNVQ0NFU1M6CisgICAgICAgIHN1Y2NlZWRNZXRob2ROYW1lcy5hZGQobWV0aG9kLmdldFRlc3RNZXRob2QoKS5nZXRDb25zdHJ1Y3Rvck9yTWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnZva2VkTWV0aG9kTmFtZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaW52b2tlZE1ldGhvZE5hbWVzKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmFpbGVkTWV0aG9kTmFtZXMoKSB7CisgICAgcmV0dXJuIGZhaWxlZE1ldGhvZE5hbWVzOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTa2lwcGVkTWV0aG9kTmFtZXMoKSB7CisgICAgcmV0dXJuIHNraXBwZWRNZXRob2ROYW1lczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U3VjY2VlZE1ldGhvZE5hbWVzKCkgeworICAgIHJldHVybiBzdWNjZWVkTWV0aG9kTmFtZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9KVW5pdDRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvSlVuaXQ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDlmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvSlVuaXQ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCB0ZXN0Lmp1bml0NC5KVW5pdDRDaGlsZDsKK2ltcG9ydCB0ZXN0Lmp1bml0NC5KVW5pdDRQYXJhbWV0ZXJpemVkVGVzdDsKK2ltcG9ydCB0ZXN0Lmp1bml0NC5KVW5pdDRTYW1wbGUyOworaW1wb3J0IHRlc3QuanVuaXQ0LkpVbml0NFNhbXBsZVN1aXRlOworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdDRUZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworCisgICAgQEJlZm9yZU1ldGhvZChkZXBlbmRzT25Hcm91cHMgPSB7ImluaXRUZXN0In0pCisgICAgcHVibGljIHZvaWQgaW5pdEpVbml0RmxhZygpIHsKKyAgICAgICAgZ2V0VGVzdCgpLnNldEpVbml0KHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RzKCkgeworICAgICAgICBhZGRDbGFzcygidGVzdC5qdW5pdDQuSlVuaXQ0U2FtcGxlMiIpOworICAgICAgICBhc3NlcnQgZ2V0VGVzdCgpLmlzSlVuaXQoKTsKKworICAgICAgICBydW4oKTsKKyAgICAgICAgU3RyaW5nW10gcGFzc2VkID0gSlVuaXQ0U2FtcGxlMi5FWFBFQ1RFRDsKKyAgICAgICAgU3RyaW5nW10gZmFpbGVkID0gSlVuaXQ0U2FtcGxlMi5GQUlMRUQ7CisgICAgICAgIFN0cmluZ1tdIHNraXBwZWQgPSBKVW5pdDRTYW1wbGUyLlNLSVBQRUQ7CisKKyAgICAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgICAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWl0ZSgpIHsKKyAgICAgICAgYWRkQ2xhc3MoInRlc3QuanVuaXQ0LkpVbml0NFNhbXBsZVN1aXRlIik7CisgICAgICAgIGFzc2VydCBnZXRUZXN0KCkuaXNKVW5pdCgpOworCisgICAgICAgIHJ1bigpOworICAgICAgICBTdHJpbmdbXSBwYXNzZWQgPSBKVW5pdDRTYW1wbGVTdWl0ZS5FWFBFQ1RFRDsKKyAgICAgICAgU3RyaW5nW10gZmFpbGVkID0gSlVuaXQ0U2FtcGxlU3VpdGUuRkFJTEVEOworICAgICAgICBTdHJpbmdbXSBza2lwcGVkID0gSlVuaXQ0U2FtcGxlU3VpdGUuU0tJUFBFRDsKKworICAgICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1aXRlSW5oZXJpdGFuY2UoKSB7CisgICAgICAgIGFkZENsYXNzKCJ0ZXN0Lmp1bml0NC5KVW5pdDRDaGlsZCIpOworICAgICAgICBhc3NlcnQgZ2V0VGVzdCgpLmlzSlVuaXQoKTsKKworICAgICAgICBydW4oKTsKKyAgICAgICAgU3RyaW5nW10gcGFzc2VkID0gSlVuaXQ0Q2hpbGQuRVhQRUNURUQ7CisgICAgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHt9OworICAgICAgICBTdHJpbmdbXSBza2lwcGVkID0ge307CisKKyAgICAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgICAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0SW5oZXJpdGFuY2UoKSB7CisgICAgICAgIGFkZENsYXNzKCJ0ZXN0Lmp1bml0NC5Jbmhlcml0ZWRUZXN0Iik7CisgICAgICAgIGFkZENsYXNzKCJ0ZXN0Lmp1bml0NC5KVW5pdDRTYW1wbGUxIik7CisgICAgICAgIGFzc2VydCBnZXRUZXN0KCkuaXNKVW5pdCgpOworCisgICAgICAgIHJ1bigpOworICAgICAgICBTdHJpbmdbXSBwYXNzZWQgPSB7InQxIiwgInQxIn07CisgICAgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHt9OworICAgICAgICBTdHJpbmdbXSBza2lwcGVkID0ge307CisKKyAgICAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgICAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UGFyYW1ldGVyaXplZCgpIHsKKyAgICAgICAgYWRkQ2xhc3MoInRlc3QuanVuaXQ0LkpVbml0NFBhcmFtZXRlcml6ZWRUZXN0Iik7CisgICAgICAgIGFzc2VydCBnZXRUZXN0KCkuaXNKVW5pdCgpOworCisgICAgICAgIHJ1bigpOworICAgICAgICBTdHJpbmdbXSBwYXNzZWQgPSBKVW5pdDRQYXJhbWV0ZXJpemVkVGVzdC5FWFBFQ1RFRDsKKyAgICAgICAgU3RyaW5nW10gZmFpbGVkID0gSlVuaXQ0UGFyYW1ldGVyaXplZFRlc3QuRkFJTEVEOworICAgICAgICBTdHJpbmdbXSBza2lwcGVkID0gSlVuaXQ0UGFyYW1ldGVyaXplZFRlc3QuU0tJUFBFRDsKKworICAgICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9KVW5pdFRlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvSlVuaXRUZXN0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzcyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvSlVuaXRUZXN0MS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0Lmp1bml0LlNldE5hbWVUZXN0OworaW1wb3J0IHRlc3Quc2FtcGxlLkpVbml0U2FtcGxlMTsKK2ltcG9ydCB0ZXN0LnNhbXBsZS5KVW5pdFNhbXBsZTI7CisKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1heSA1LCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgSlVuaXRUZXN0MSBleHRlbmRzIEJhc2VUZXN0IHsKKyAgQEJlZm9yZU1ldGhvZChkZXBlbmRzT25Hcm91cHMgPSB7ICJpbml0VGVzdCJ9ICkKKyAgcHVibGljIHZvaWQgaW5pdEpVbml0RmxhZygpIHsKKyAgICBnZXRUZXN0KCkuc2V0SlVuaXQodHJ1ZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2RzVGhhdFN0YXJ0V2l0aFRlc3QoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLkpVbml0U2FtcGxlMSIpOworICAgIGFzc2VydCBnZXRUZXN0KCkuaXNKVW5pdCgpOworCisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICBKVW5pdFNhbXBsZTEuRVhQRUNURUQxLCBKVW5pdFNhbXBsZTEuRVhQRUNURUQyCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbWV0aG9kc1dpdGhTZXR1cCgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuSlVuaXRTYW1wbGUyIik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgInRlc3RTYW1wbGUyVGhhdFNldFVwV2FzUnVuIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworCisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U3VpdGUoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLkFsbEpVbml0VGVzdHMiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgIEpVbml0U2FtcGxlMS5FWFBFQ1RFRDEsIC8qSlVuaXRTYW1wbGUxLkVYUEVDVEVEMiwqLworICAgICAgICBKVW5pdFNhbXBsZTIuRVhQRUNURUQsCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LnNhbXBsZS5KVW5pdFNhbXBsZTMiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAidGVzdDEiLCAidGVzdDIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2V0VXBGYWlsaW5nU2hvdWxkQ2F1c2VNZXRob2RzVG9CZVNraXBwZWQoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuanVuaXQuU2V0VXBFeGNlcHRpb25TYW1wbGVUZXN0Iik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgInRlc3RNMSIvKiwgInRlc3RNMSIsICJ0ZWFyRG93biIqLworICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICAgIC8qInRlc3RNMSIsICJ0ZWFyRG93biIqLworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzZXROYW1lU2hvdWxkQmVJbnZva2VkKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0Lmp1bml0LlNldE5hbWVUZXN0Iik7CisgICAgU2V0TmFtZVRlc3QubV9jdG9yQ291bnQgPSAwOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJ0ZXN0Rm9vIiwgInRlc3RCYXIiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTZXROYW1lVGVzdC5tX2N0b3JDb3VudCwgMiwKKyAgICAgICAgIkV4cGVjdGVkIDIgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQsIGZvdW5kICIgKyBTZXROYW1lVGVzdC5tX2N0b3JDb3VudCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbSlVuaXRUZXN0MV0gIiArIHMpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFic3RyYWN0KCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LnNhbXBsZS5KVW5pdFNhbXBsZTQiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAidGVzdFhZIiwgInRlc3RYWSIsICJ0ZXN0WFkiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L01ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFhOTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L01ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LnNhbXBsZS5TYW1wbGUyOworCitwdWJsaWMgY2xhc3MgTWV0aG9kVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSBTYW1wbGUyLmNsYXNzLmdldE5hbWUoKTsKKworICBAVGVzdChncm91cHMgPSB7ICJjdXJyZW50IiB9KQorICBwdWJsaWMgdm9pZCBpbmNsdWRlTWV0aG9kc09ubHkoKSB7CisgICAgYWRkQ2xhc3MoQ0xBU1NfTkFNRSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpLnNpemUoKSwgMSk7CisgICAgYWRkSW5jbHVkZWRNZXRob2QoQ0xBU1NfTkFNRSwgIi4qbWV0aG9kMiIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QyIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiY3VycmVudCIgfSkKKyAgcHVibGljIHZvaWQgZXhjbHVkZU1ldGhvZHNPbmx5KCkgeworICAgIGFkZENsYXNzKENMQVNTX05BTUUpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2V0VGVzdCgpLmdldFhtbENsYXNzZXMoKS5zaXplKCksIDEpOworICAgIGFkZEV4Y2x1ZGVkTWV0aG9kKENMQVNTX05BTUUsICIuKm1ldGhvZDIiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAibWV0aG9kMSIsICJtZXRob2QzIgorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleGNsdWRlUGFja2FnZSgpIHsKKyAgICBhZGRDbGFzcyhDTEFTU19OQU1FKTsKKyAgICBhc3NlcnQgMSA9PSBnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpLnNpemUoKTsKKyAgICBhZGRFeGNsdWRlZE1ldGhvZChDTEFTU19OQU1FLCAiLioiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9NaXNjLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvTWlzYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjhjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvTWlzYy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIE1pc2MgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbWFrZVN1cmVTZXRVcFdpdGhQYXJhbWV0ZXJXaXRoTm9QYXJhbWV0ZXJzRmFpbHMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLlNldFVwV2l0aFBhcmFtZXRlclRlc3QiKTsKKyAgICBzZXRWZXJib3NlKDApOworLy8gICAgc2V0UGFyYWxsZWwoWG1sU3VpdGUuUEFSQUxMRUxfTUVUSE9EUyk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgfTsKKyAgICAgIC8vIEBDb25maWd1cmF0aW9uIGZhaWx1cmVzIGFyZSBub3QgcmVwb3J0ZWQgaW4gdGhlIElUZXN0TGlzdGVuZXIKKyAgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgIH07CisgICAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgICAgICAgICJ0ZXN0IiwKKyAgICAgIH07CisgICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvTmVzdGVkU3RhdGljU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L05lc3RlZFN0YXRpY1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI4NWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L05lc3RlZFN0YXRpY1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBOZXN0ZWRTdGF0aWNTYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICB9CisKKyAgcHVibGljIGNsYXNzIE5lc3RlZCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBuZXN0ZWQoKSB7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvTmVzdGVkU3RhdGljVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L05lc3RlZFN0YXRpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWMxODgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L05lc3RlZFN0YXRpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIE5lc3RlZFN0YXRpY1Rlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbmVzdGVkQ2xhc3NTaG91bGRCZUluY2x1ZGVkKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoTmVzdGVkU3RhdGljU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIFNldDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpIHt7CisgICAgICBhZGQoIm5lc3RlZCIpOworICAgICAgYWRkKCJmIik7CisgICAgfX07CisgICAgU2V0PFN0cmluZz4gYWN0dWFsID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgTGlzdDxJVGVzdFJlc3VsdD4gcGFzc2VkVGVzdHMgPSB0bGEuZ2V0UGFzc2VkVGVzdHMoKTsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHQgOiBwYXNzZWRUZXN0cykgeworICAgICAgYWN0dWFsLmFkZCh0LmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgfQorCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L1BhcmFtZXRlckNvbnN0cnVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1BhcmFtZXRlckNvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvUGFyYW1ldGVyQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGVzdCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBjb25zdHJ1Y3RvcnMKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyQ29uc3RydWN0b3JUZXN0IHsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9zdHJpbmcgPSBudWxsOworICBwcml2YXRlIGludCBtX2ludCA9IC0xOworICBwcml2YXRlIGJvb2xlYW4gbV9ib29sZWFuID0gZmFsc2U7CisgIHByaXZhdGUgYnl0ZSBtX2J5dGUgPSAtMTsKKyAgcHJpdmF0ZSBjaGFyIG1fY2hhciA9IDA7CisgIHByaXZhdGUgZG91YmxlIG1fZG91YmxlID0gMC4wOworICBwcml2YXRlIGZsb2F0IG1fZmxvYXQgPSAwLjBmOworICBwcml2YXRlIGxvbmcgbV9sb25nID0gMDsKKyAgcHJpdmF0ZSBzaG9ydCBtX3Nob3J0ID0gMDsKKworICBAUGFyYW1ldGVycyh7ICJzdHJpbmciLCAiaW50IiwgImJvb2xlYW4iLCAiYnl0ZSIsICJjaGFyIiwgImRvdWJsZSIsCisgICAgICAiZmxvYXQiLCAibG9uZyIsICJzaG9ydCIgIH0pCisgIHB1YmxpYyBQYXJhbWV0ZXJDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIHMsIGludCBpLCBib29sZWFuIGJvLCBieXRlIGIsIGNoYXIgYywKKyAgICAgIGRvdWJsZSBkLCBmbG9hdCBmLCBsb25nIGwsIHNob3J0IHNoKQorICB7CisgICAgbV9zdHJpbmcgPSBzOworICAgIG1faW50ID0gaTsKKyAgICBtX2Jvb2xlYW4gPSBibzsKKyAgICBtX2J5dGUgPSBiOworICAgIG1fY2hhciA9IGM7CisgICAgbV9kb3VibGUgPSBkOworICAgIG1fZmxvYXQgPSBmOworICAgIG1fbG9uZyA9IGw7CisgICAgbV9zaG9ydCA9IHNoOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGFzc2VydEVxdWFscygiQ2VkcmljIiwgbV9zdHJpbmcpOworICAgIGFzc2VydEVxdWFscyg0MiwgbV9pbnQpOworICAgIGFzc2VydFRydWUobV9ib29sZWFuKTsKKyAgICBhc3NlcnRFcXVhbHMoNDMsIG1fYnl0ZSk7CisgICAgYXNzZXJ0RXF1YWxzKCdjJywgbV9jaGFyKTsKKyAgICBhc3NlcnRFcXVhbHMoNDQuMCwgbV9kb3VibGUsIDAuMSk7CisgICAgYXNzZXJ0RXF1YWxzKDQ1LjBmLCBtX2Zsb2F0LCAwLjEpOworICAgIGFzc2VydEVxdWFscyg0NiwgbV9sb25nKTsKKyAgICBhc3NlcnRFcXVhbHMoNDcsIG1fc2hvcnQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9SZXBvcnRlckFwaVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9SZXBvcnRlckFwaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI2ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1JlcG9ydGVyQXBpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIE1ha2Ugc3VyZSB3ZSBkb24ndCByZW1vdmUgcHVibGljIEFQSSdzIGZyb20gUmVwb3J0ZXIuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBSZXBvcnRlckFwaVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RBcGkoKSB7CisgICAgUmVwb3J0ZXIubG9nKCJmb28iKTsKKyAgICBSZXBvcnRlci5sb2coImZvbyIsIGZhbHNlKTsKKyAgICBSZXBvcnRlci5sb2coImZvbyIsIDIpOworICAgIFJlcG9ydGVyLmxvZygiZm9vIiwgMiwgZmFsc2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvUmV0dXJuVmFsdWVTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvUmV0dXJuVmFsdWVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxNTQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9SZXR1cm5WYWx1ZVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXR1cm5WYWx1ZVNhbXBsZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyBpbnQgc2hvdWxkUnVuKCkgeworICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvUmV0dXJuVmFsdWVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvUmV0dXJuVmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlM2FhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9SZXR1cm5WYWx1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgUmV0dXJuVmFsdWVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHByaXZhdGUgWG1sU3VpdGUgbV9zdWl0ZTsKKyAgcHJpdmF0ZSBYbWxUZXN0IG1fdGVzdDsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICBtX3N1aXRlID0gY3JlYXRlWG1sU3VpdGUoInN1aXRlIik7CisgICAgbV90ZXN0ID0gY3JlYXRlWG1sVGVzdChtX3N1aXRlLCAidGVzdCIsIFJldHVyblZhbHVlU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3VpdGVSZXR1cm5WYWx1ZVRlc3RTaG91bGRCZVJ1bigpIHsKKyAgICBtX3N1aXRlLnNldEFsbG93UmV0dXJuVmFsdWVzKHRydWUpOworICAgIHJ1blRlc3QodHJ1ZSk7CisgIH0KKyAgCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN1aXRlUmV0dXJuVmFsdWVUZXN0U2hvdWxkTm90QmVSdW4oKSB7CisgICAgcnVuVGVzdChmYWxzZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVmFsdWVUZXN0U2hvdWxkQmVSdW4oKSB7CisgICAgbV90ZXN0LnNldEFsbG93UmV0dXJuVmFsdWVzKHRydWUpOworICAgIHJ1blRlc3QodHJ1ZSk7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KGJvb2xlYW4gYWxsb3dlZCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3QobV9zdWl0ZSkpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBpZiAoYWxsb3dlZCkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICAgIGFzc2VydFRlc3RSZXN1bHRzRXF1YWwodGxhLmdldFBhc3NlZFRlc3RzKCksIEFycmF5cy5hc0xpc3QoInNob3VsZFJ1biIpKTsKKyAgICB9IGVsc2UgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDApOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICB9CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvU2FtcGxlSW5oZXJpdGFuY2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9TYW1wbGVJbmhlcml0YW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2Q2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvU2FtcGxlSW5oZXJpdGFuY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIHRlc3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3Quc2FtcGxlLkJhc2VTYW1wbGVJbmhlcml0YW5jZTsKKworcHVibGljIGNsYXNzIFNhbXBsZUluaGVyaXRhbmNlIGV4dGVuZHMgQmFzZVNhbXBsZUluaGVyaXRhbmNlIHsKKworICAvLyBUZXN0IGRlcGVuZGVuY3kgb2YgY29uZmlndXJhdGlvbiBtZXRob2RzCisgIEBCZWZvcmVDbGFzcyhncm91cHM9IHsgImNvbmZpZ3VyYXRpb24wIn0pCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb24wKCkgeworICAgIGFkZENvbmZpZ3VyYXRpb24oImNvbmZpZ3VyYXRpb24wIik7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNPTkZJR1VSQVRJT04gMCIpOworICB9CisKKyAgQEJlZm9yZUNsYXNzKGRlcGVuZHNPbkdyb3VwcyA9IHsgImNvbmZpZ3VyYXRpb24xIn0pCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb24yKCkgeworICAgIGFzc2VydCBtX2NvbmZpZ3VyYXRpb25zLnNpemUoKSA9PSAyCisJOiAiRXhwZWN0ZWQgc2l6ZSAyIGZvdW5kICIgKyBtX2NvbmZpZ3VyYXRpb25zLnNpemUoKTsKKyAgICBhc3NlcnQgImNvbmZpZ3VyYXRpb24wIi5lcXVhbHMobV9jb25maWd1cmF0aW9ucy5nZXQoMCkpCisJOiAiRXhwZWN0ZWQgY29uZmlndXJhdGlvbjAgdG8gYmUgcnVuIjsKKyAgICBhc3NlcnQgImNvbmZpZ3VyYXRpb24xIi5lcXVhbHMobV9jb25maWd1cmF0aW9ucy5nZXQoMSkpCisJOiAiRXhwZWN0ZWQgY29uZmlndXJhdGlvbjEgdG8gYmUgcnVuIjsKKyAgICBhZGRDb25maWd1cmF0aW9uKCJjb25maWd1cmF0aW9uMiIpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyAiaW5oZXJpdGVkVGVzdE1ldGhvZCJ9ICkKKyAgcHVibGljIHZvaWQgaW5oZXJpdGVkTWV0aG9kc1dlcmVDYWxsZWRJbk9yZGVyKCkgeworICAgIGFzc2VydCBtX2ludm9rZWRCYXNlTWV0aG9kIDogIkRpZG4ndCBpbnZva2UgdGVzdCBtZXRob2QgaW4gYmFzZSBjbGFzcyI7CisgICAgYXNzZXJ0IG1faW52b2tlZEJhc2VDb25maWd1cmF0aW9uIDogIkRpZG4ndCBpbnZva2UgY29uZmlndXJhdGlvbiBtZXRob2QgaW4gYmFzZSBjbGFzcyI7CisKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25zV2VyZUNhbGxlZEluT3JkZXIoKSB7CisgICAgYXNzZXJ0IG1fY29uZmlndXJhdGlvbnMuc2l6ZSgpID09IDM7CisgICAgYXNzZXJ0ICJjb25maWd1cmF0aW9uMCIuZXF1YWxzKG1fY29uZmlndXJhdGlvbnMuZ2V0KDApKQorCTogIkV4cGVjdGVkIGNvbmZpZ3VyYXRpb24wIHRvIGJlIHJ1biI7CisgICAgYXNzZXJ0ICJjb25maWd1cmF0aW9uMSIuZXF1YWxzKG1fY29uZmlndXJhdGlvbnMuZ2V0KDEpKQorCTogIkV4cGVjdGVkIGNvbmZpZ3VyYXRpb24xIHRvIGJlIHJ1biI7CisgICAgYXNzZXJ0ICJjb25maWd1cmF0aW9uMiIuZXF1YWxzKG1fY29uZmlndXJhdGlvbnMuZ2V0KDIpKQorCTogIkV4cGVjdGVkIGNvbmZpZ3VyYXRpb24xIHRvIGJlIHJ1biI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9TZXJpYWxpemF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1NlcmlhbGl6YXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhOGY3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9TZXJpYWxpemF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdCB7CisKKyAgQFRlc3QoZ3JvdXBzID0gImJyb2tlbiIpCisgIHB1YmxpYyB2b2lkIGlTdWl0ZVNob3VsZEJlU2VyaWFsaXphYmxlKElUZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICBvb3Mud3JpdGVPYmplY3QoY29udGV4dC5nZXRTdWl0ZSgpKTsKKyAgICBvb3MuY2xvc2UoKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgImJyb2tlbiIsICJtYXZlbi1icm9rZW4iIH0pCisgIHB1YmxpYyB2b2lkIHRlc3RuZ01ldGhvZFNob3VsZEJlU2VyaWFsaXphYmxlKElUZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICBvb3Mud3JpdGVPYmplY3QoY29udGV4dC5nZXRBbGxUZXN0TWV0aG9kcygpWzBdKTsKKyAgICBvb3MuY2xvc2UoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L1NpbXBsZUJhc2VUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvU2ltcGxlQmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM3ZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1NpbXBsZUJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5VdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxJbmNsdWRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVCYXNlVGVzdCB7CisgIC8vIFN5c3RlbSBwcm9wZXJ0eSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSByZXNvdXJjZXMgKGUuZy4geG1sIGZpbGVzKSBjYW4gYmUgZm91bmQKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0VTX0RJUiA9ICJ0ZXN0LnJlc291cmNlcy5kaXIiOworCisgIHB1YmxpYyBzdGF0aWMgVGVzdE5HIGNyZWF0ZSgpIHsKKyAgICBUZXN0TkcgcmVzdWx0ID0gbmV3IFRlc3RORygpOworICAgIHJlc3VsdC5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGZhbHNlKTsKKyAgICByZXN1bHQuc2V0VmVyYm9zZSgwKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0TkcgY3JlYXRlKENsYXNzPD8+Li4uIHRlc3RDbGFzc2VzKSB7CisgICAgVGVzdE5HIHJlc3VsdCA9IGNyZWF0ZSgpOworICAgIHJlc3VsdC5zZXRUZXN0Q2xhc3Nlcyh0ZXN0Q2xhc3Nlcyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByb3RlY3RlZCBUZXN0TkcgY3JlYXRlKFhtbFN1aXRlLi4uIHN1aXRlcykgeworICAgIFRlc3RORyByZXN1bHQgPSBjcmVhdGUoKTsKKyAgICByZXN1bHQuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3Qoc3VpdGVzKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByb3RlY3RlZCBUZXN0TkcgY3JlYXRlVGVzdHMoU3RyaW5nIHN1aXRlTmFtZSwgQ2xhc3M8Pz4uLi4gdGVzdENsYXNzZXMpIHsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IGNyZWF0ZVhtbFN1aXRlKHN1aXRlTmFtZSk7CisgICAgaW50IGk9MDsKKyAgICBmb3IgKENsYXNzPD8+IHRlc3RDbGFzcyA6IHRlc3RDbGFzc2VzKSB7CisgICAgICBjcmVhdGVYbWxUZXN0KHN1aXRlLCB0ZXN0Q2xhc3MuZ2V0TmFtZSgpICsgaSwgdGVzdENsYXNzKTsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZShzdWl0ZSk7CisgIH0KKworICBwcm90ZWN0ZWQgWG1sU3VpdGUgY3JlYXRlWG1sU3VpdGUoU3RyaW5nIG5hbWUpIHsKKyAgICBYbWxTdWl0ZSByZXN1bHQgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICByZXN1bHQuc2V0TmFtZShuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJvdGVjdGVkIFhtbFRlc3QgY3JlYXRlWG1sVGVzdChYbWxTdWl0ZSBzdWl0ZSwgU3RyaW5nIG5hbWUsIENsYXNzIGNsYXp6LCBDbGFzcy4uLiBjbGFzc2VzKSB7CisgICAgWG1sVGVzdCByZXN1bHQgPSBuZXcgWG1sVGVzdChzdWl0ZSk7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICByZXN1bHQuc2V0TmFtZShuYW1lKTsKKyAgICBYbWxDbGFzcyB4YyA9IG5ldyBYbWxDbGFzcyhjbGF6ei5nZXROYW1lKCksIGluZGV4KyssIHRydWUgLyogbG9hZCBjbGFzc2VzICovKTsKKyAgICByZXN1bHQuZ2V0WG1sQ2xhc3NlcygpLmFkZCh4Yyk7CisgICAgZm9yIChDbGFzcyBjIDogY2xhc3NlcykgeworICAgICAgeGMgPSBuZXcgWG1sQ2xhc3MoYy5nZXROYW1lKCksIGluZGV4KyssIHRydWUgLyogbG9hZCBjbGFzc2VzICovKTsKKyAgICAgIHJlc3VsdC5nZXRYbWxDbGFzc2VzKCkuYWRkKHhjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJvdGVjdGVkIFhtbFRlc3QgY3JlYXRlWG1sVGVzdChYbWxTdWl0ZSBzdWl0ZSwgU3RyaW5nIG5hbWUsIFN0cmluZy4uLiBjbGFzc2VzKSB7CisgICAgWG1sVGVzdCByZXN1bHQgPSBuZXcgWG1sVGVzdChzdWl0ZSk7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICByZXN1bHQuc2V0TmFtZShuYW1lKTsKKyAgICBmb3IgKFN0cmluZyBjIDogY2xhc3NlcykgeworICAgICAgWG1sQ2xhc3MgeGMgPSBuZXcgWG1sQ2xhc3MoYywgaW5kZXgrKywgdHJ1ZSAvKiBsb2FkIGNsYXNzZXMgKi8pOworICAgICAgcmVzdWx0LmdldFhtbENsYXNzZXMoKS5hZGQoeGMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RzKFhtbENsYXNzIGNscywgU3RyaW5nLi4uIG1ldGhvZHMpIHsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoU3RyaW5nIG0gOiBtZXRob2RzKSB7CisgICAgICBYbWxJbmNsdWRlIGluY2x1ZGUgPSBuZXcgWG1sSW5jbHVkZShtLCBpbmRleCsrKTsKKyAgICAgIGNscy5nZXRJbmNsdWRlZE1ldGhvZHMoKS5hZGQoaW5jbHVkZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aFRvUmVzb3VyY2UoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgU3RyaW5nIHJlc3VsdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShURVNUX1JFU09VUkNFU19ESVIpOworICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3lzdGVtIHByb3BlcnR5ICIgKyBURVNUX1JFU09VUkNFU19ESVIgKyAiIHdhcyBub3QgZGVmaW5lZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGZpbGVOYW1lOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UGFzc2VkVGVzdHMoVGVzdExpc3RlbmVyQWRhcHRlciB0bGEsIFN0cmluZy4uLiBtZXRob2ROYW1lcykgeworICAgIEl0ZXJhdG9yPElUZXN0UmVzdWx0PiBpdCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpLml0ZXJhdG9yKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIG1ldGhvZE5hbWVzLmxlbmd0aCk7CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpdC5uZXh0KCkuZ2V0TmFtZSgpLCBtZXRob2ROYW1lc1tpKytdKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29tcGFyZSBhIGxpc3Qgb2YgSVRlc3RSZXN1bHQgd2l0aCBhIGxpc3Qgb2YgU3RyaW5nIG1ldGhvZCBuYW1lcywKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRUZXN0UmVzdWx0c0VxdWFsKExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMsIExpc3Q8U3RyaW5nPiBtZXRob2RzKSB7CisgICAgTGlzdDxTdHJpbmc+IHJlc3VsdE1ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHIgOiByZXN1bHRzKSB7CisgICAgICByZXN1bHRNZXRob2RzLmFkZChyLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgfQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TWV0aG9kcywgbWV0aG9kcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L1N0YXRpY1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9TdGF0aWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4YjIwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9TdGF0aWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgdXNlZCB0byBjcmVhdGUgYSBTdGFja092ZXJmbG93RXJyb3IuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0aWNUZXN0IHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJTdGF0aWNDbGFzcyBleHRlbmRzIFN0YXRpY1Rlc3QgeworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L1Rlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y4MjVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1Rlc3QxLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0MSBleHRlbmRzIEJhc2VUZXN0IHsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlIHByb3RlY3RlZCBvbiBwdXJwb3NlLCB0byB0ZXN0IHRoYXQKKyAgICogVGVzdE5HIGNhbiBzdGlsbCBpbnN0YW50aWF0ZSB0aGUgY2xhc3MuCisgICAqLworICBUZXN0MSgpIHt9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiY3VycmVudCIgfSkKKyAgcHVibGljIHZvaWQgaW5jbHVkZWRHcm91cHMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLlNhbXBsZTEiKTsKKyAgICBhc3NlcnQgMSA9PSBnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpLnNpemUoKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJvZGQiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAibWV0aG9kMSIsICJtZXRob2QzIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZ3JvdXBzT2ZHcm91cHNTaW1wbGUoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLlNhbXBsZTEiKTsKKyAgICBhc3NlcnQgMSA9PSBnZXRUZXN0KCkuZ2V0WG1sQ2xhc3NlcygpLnNpemUoKTsKKyAgICAvLyBzaG91bGQgbWF0Y2ggYWxsIG1ldGhvZHMgYmVsb25naW5nIHRvIGdyb3VwICJvZGQiIGFuZCAiZXZlbiIKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJldmVub2RkIik7CisgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgbC5hZGQoImV2ZW4iKTsKKyAgICBsLmFkZCgib2RkIik7CisgICAgYWRkTWV0YUdyb3VwKCJldmVub2RkIiwgbCk7CisgICAgcnVuKCk7CisgICBTdHJpbmcgcGFzc2VkW10gPSB7CisgICAgIm1ldGhvZDEiLCAibWV0aG9kMiIsICJtZXRob2QzIiwKKyAgIH07CisgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGdyb3Vwc09mR3JvdXBzV2l0aEluZGlyZWN0aW9ucygpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuU2FtcGxlMSIpOworICAgIGFkZEluY2x1ZGVkR3JvdXAoImFsbCIpOworICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIGwuYWRkKCJtZXRob2RzIik7CisgICAgbC5hZGQoImJyb2tlbiIpOworICAgIGFkZE1ldGFHcm91cCgiYWxsIiwgbCk7CisgICAgbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIGwuYWRkKCJvZGQiKTsKKyAgICBsLmFkZCgiZXZlbiIpOworICAgIGFkZE1ldGFHcm91cCgibWV0aG9kcyIsIGwpOworICAgIGFkZE1ldGFHcm91cCgiYnJva2VuIiwgImJyb2tlbiIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QxIiwgIm1ldGhvZDIiLCAibWV0aG9kMyIsICJicm9rZW4iCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGdyb3Vwc09mR3JvdXBzV2l0aEN5Y2xlKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LnNhbXBsZS5TYW1wbGUxIik7CisgICAgYWRkSW5jbHVkZWRHcm91cCgiYWxsIik7CisgICAgYWRkTWV0YUdyb3VwKCJhbGwiLCAiYWxsMiIpOworICAgIGFkZE1ldGFHcm91cCgiYWxsMiIsICJtZXRob2RzIik7CisgICAgYWRkTWV0YUdyb3VwKCJtZXRob2RzIiwgImFsbCIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QgLy8gKGdyb3VwcyA9IHsgIm9uZSIgfSkKKyAgcHVibGljIHZvaWQgZXhjbHVkZWRHcm91cHMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLlNhbXBsZTEiKTsKKyAgICBhZGRFeGNsdWRlZEdyb3VwKCJvZGQiKTsKKyAgICBydW4oKTsKKyAgIFN0cmluZyBwYXNzZWRbXSA9IHsKKyAgICAibWV0aG9kMiIsCisgICAgImJyb2tlbiIsICJ0aHJvd0V4cGVjdGVkRXhjZXB0aW9uMVNob3VsZFBhc3MiLAorICAgICJ0aHJvd0V4cGVjdGVkRXhjZXB0aW9uMlNob3VsZFBhc3MiCisgICB9OworICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgICAidGhyb3dFeGNlcHRpb25TaG91bGRGYWlsIiwgInZlcmlmeUxhc3ROYW1lU2hvdWxkRmFpbCIKKyAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHJlZ2V4cCgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuU2FtcGxlMSIpOworICAgIC8vIHNob3VsZCBtYXRjaGVzIGFsbCBtZXRob2RzIGJlbG9uZ2luZyB0byBncm91cCAib2RkIgorICAgIGFkZEluY2x1ZGVkR3JvdXAoIm8uKiIpOworICAgIHJ1bigpOworICAgU3RyaW5nIHBhc3NlZFtdID0geworICAgICAgIm1ldGhvZDEiLCAibWV0aG9kMyIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiY3VycmVudG9sZCIgfSkKKyAgcHVibGljIHZvaWQgbG9nZ2VyKCkgeworICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCIiKTsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyBIQU5ETEVSUzoiICsgbG9nZ2VyLmdldEhhbmRsZXJzKCkubGVuZ3RoKTsKKyAgICBmb3IgKEhhbmRsZXIgaGFuZGxlciA6IGxvZ2dlci5nZXRIYW5kbGVycygpKQorICAgIHsKKyAgICAgIGhhbmRsZXIuc2V0TGV2ZWwoTGV2ZWwuV0FSTklORyk7CisgICAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihuZXcgb3JnLnRlc3RuZy5sb2cuVGV4dEZvcm1hdHRlcigpKTsKKyAgICB9CisgICAgbG9nZ2VyLnNldExldmVsKExldmVsLlNFVkVSRSk7CisgIH0KKworICBzdGF0aWMgcHVibGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdDFdICIgKyBzKTsKKyAgfQorCit9IC8vIFRlc3QxCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L1Rlc3QyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFjYzkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L1Rlc3QyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCisvKioKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgTWF5IDUsIDIwMDQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0MiBleHRlbmRzIEJhc2VUZXN0IHsKKyAgcHJpdmF0ZSBib29sZWFuIG1faW5pdGlhbGl6ZWRDb3JyZWN0bHkgPSBmYWxzZTsKKworICBAQ29uZmlndXJhdGlvbihiZWZvcmVUZXN0TWV0aG9kID0gdHJ1ZSkKKy8vICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGNvcnJlY3RTZXR1cCgpIHsKKyAgICBtX2luaXRpYWxpemVkQ29ycmVjdGx5ID0gdHJ1ZTsKKyAgfQorCisgIC8vIFNob3VsZG4ndCBiZSBjYWxsZWQKKyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdE1ldGhvZCA9IHRydWUsIGdyb3VwcyA9ICJleGNsdWRlVGhpc0dyb3VwIikKKy8vICBAQmVmb3JlTWV0aG9kKGdyb3VwcyA9IHsgImV4Y2x1ZGVUaGlzR3JvdXAifSApCisgIHB1YmxpYyB2b2lkIGluY29ycmVjdFNldHVwKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTaG91bGQgbmV2ZXIgYmUgcnVuIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBub0dyb3VwcygpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuU2FtcGxlMSIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QxIiwKKyAgICAgICJtZXRob2QyIiwgIm1ldGhvZDMiLAorICAgICAgImJyb2tlbiIsICJ0aHJvd0V4cGVjdGVkRXhjZXB0aW9uMVNob3VsZFBhc3MiLAorICAgICAgInRocm93RXhwZWN0ZWRFeGNlcHRpb24yU2hvdWxkUGFzcyIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICAgInRocm93RXhjZXB0aW9uU2hvdWxkRmFpbCIsICJ2ZXJpZnlMYXN0TmFtZVNob3VsZEZhaWwiCisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNldFVwV2l0aEdyb3VwcygpIHsKKyAgICBydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2luaXRpYWxpemVkQ29ycmVjdGx5LCAiU2hvdWxkIGhhdmUgcnVuIHRoZSBjb3JyZWN0U2V0dXAgbWV0aG9kIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwYXJ0aWFsR3JvdXBzQ2xhc3MoKSB7CisgICAgYWRkQ2xhc3MoInRlc3Quc2FtcGxlLlBhcnRpYWxHcm91cFRlc3QiKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJjbGFzc0dyb3VwIik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdE1ldGhvZEdyb3VwIiwgInRlc3RDbGFzc0dyb3VwIgorICAgICAgfTsKKyAgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICAgICAidGVzdE1ldGhvZEdyb3VwU2hvdWxkRmFpbCIsICJ0ZXN0Q2xhc3NHcm91cFNob3VsZEZhaWwiCisgICAgICB9OworICAgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKworLy8gICAgICBwcHAoIkBAQEBAQEBAQEBAQEBAQEBAQCBQQVNTRUQgVEVTVFMiKTsKKy8vICAgICAgZm9yIChPYmplY3QgbyA6IGdldFBhc3NlZFRlc3RzKCkudmFsdWVzKCkpIHsKKy8vICAgICAgICBwcHAoIkBAQEBAQEBAQEAgUEFTU0VEOiIgKyBvKTsKKy8vICAgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFydGlhbEdyb3Vwc01ldGhvZCgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zYW1wbGUuUGFydGlhbEdyb3VwVGVzdCIpOworICAgIGFkZEluY2x1ZGVkR3JvdXAoIm1ldGhvZEdyb3VwIik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdE1ldGhvZEdyb3VwIiwKKyAgICAgIH07CisgICAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgICAgICAidGVzdE1ldGhvZEdyb3VwU2hvdWxkRmFpbCIKKyAgICAgIH07CisgICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9UZXN0SGVscGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvVGVzdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmViZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvVGVzdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKK3BhY2thZ2UgdGVzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK3B1YmxpYyBjbGFzcyBUZXN0SGVscGVyIHsKKworICBwdWJsaWMgc3RhdGljIFhtbFN1aXRlIGNyZWF0ZVN1aXRlKFN0cmluZyBjbHMsIFN0cmluZyBzdWl0ZU5hbWUpIHsKKyAgICByZXR1cm4gY3JlYXRlU3VpdGUoY2xzLCBzdWl0ZU5hbWUsICJUbXBUZXN0Iik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFhtbFN1aXRlIGNyZWF0ZVN1aXRlKENsYXNzPD8+IGNscywgU3RyaW5nIHN1aXRlTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZVN1aXRlKGNscy5nZXROYW1lKCksIHN1aXRlTmFtZSwgdGVzdE5hbWUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgWG1sU3VpdGUgY3JlYXRlU3VpdGUoU3RyaW5nIGNscywgU3RyaW5nIHN1aXRlTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgWG1sU3VpdGUgcmVzdWx0ID0gbmV3IFhtbFN1aXRlKCk7CisgICAgcmVzdWx0LnNldE5hbWUoc3VpdGVOYW1lKTsKKworICAgIFhtbFRlc3QgdGVzdCA9IG5ldyBYbWxUZXN0KHJlc3VsdCk7CisgICAgdGVzdC5zZXROYW1lKHRlc3ROYW1lKTsKKyAgICBMaXN0PFhtbENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgY2xhc3Nlcy5hZGQobmV3IFhtbENsYXNzKGNscykpOworICAgIHRlc3Quc2V0WG1sQ2xhc3NlcyhjbGFzc2VzKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3RORyBjcmVhdGVUZXN0TkcoU3RyaW5nIG91dHB1dERpcikgeworICAgIHJldHVybiBjcmVhdGVUZXN0TkcobnVsbCwgb3V0cHV0RGlyKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdE5HIGNyZWF0ZVRlc3RORygpIHsKKyAgICByZXR1cm4gY3JlYXRlVGVzdE5HKG51bGwsIG51bGwpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0TkcgY3JlYXRlVGVzdE5HKFhtbFN1aXRlIHN1aXRlKSB7CisgICAgcmV0dXJuIGNyZWF0ZVRlc3RORyhzdWl0ZSwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdE5HIGNyZWF0ZVRlc3RORyhYbWxTdWl0ZSBzdWl0ZSwgU3RyaW5nIG91dHB1dERpcikgeworICAgIFRlc3RORyByZXN1bHQgPSBuZXcgVGVzdE5HKCk7CisgICAgaWYgKHN1aXRlICE9IG51bGwpIHsKKyAgICAgIExpc3Q8WG1sU3VpdGU+IHN1aXRlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgc3VpdGVzLmFkZChzdWl0ZSk7CisgICAgICByZXN1bHQuc2V0WG1sU3VpdGVzKHN1aXRlcyk7CisgICAgfQorICAgIGlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworICAgICAgb3V0cHV0RGlyID0gY3JlYXRlUmFuZG9tRGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorICAgIHJlc3VsdC5zZXRPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyKTsKKyAgICByZXN1bHQuc2V0VmVyYm9zZSgtMSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVJhbmRvbURpcmVjdG9yeSgpIHsKKyAgICBTdHJpbmcgZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgU3RyaW5nIG5hbWUgPSAidGVzdG5nLXRtcC0iICsgci5uZXh0SW50KCk7CisgICAgRmlsZSByZXN1bHQgPSBuZXcgRmlsZShkaXIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBuYW1lKTsKKyAgICByZXN1bHQuZGVsZXRlT25FeGl0KCk7CisgICAgcmVzdWx0Lm1rZGlycygpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0SGVscGVyXSAiICsgc3RyaW5nKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3Rjb25mbWV0aG9kL0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdGNvbmZtZXRob2QvQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjEwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3Rjb25mbWV0aG9kL0IuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QuYWJzdHJhY3Rjb25mbWV0aG9kOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK2ltcG9ydCB0ZXN0LmFic3RyYWN0Y29uZm1ldGhvZC5mb28uQTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEIgZXh0ZW5kcyBBCit7CisgICBAQmVmb3JlTWV0aG9kKGRlcGVuZHNPbk1ldGhvZHMgPSB7InRlc3RTZXR1cCJ9KQorICAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdJbk1pZGRsZSgpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdGNvbmZtZXRob2QvQy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fic3RyYWN0Y29uZm1ldGhvZC9DLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliNDdlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdGNvbmZtZXRob2QvQy5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC5hYnN0cmFjdGNvbmZtZXRob2Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDIGV4dGVuZHMgQgoreworICAgQE92ZXJyaWRlCisgIEBCZWZvcmVNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHRlc3RTZXR1cCgpIHt9CisKKyAgIEBUZXN0KGRlc2NyaXB0aW9uPSJUZXN0IGRlcGVuZHMgb24gYSBjb25maWcgbWV0aG9kIHRoYXQgaGFzIGltcGxlbWVudHMgYW4gYWJzdHJhY3QgbWV0aG9kcyIpCisgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3Rjb25mbWV0aG9kL2Zvby9BLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3Rjb25mbWV0aG9kL2Zvby9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5YzNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdGNvbmZtZXRob2QvZm9vL0EuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgdGVzdC5hYnN0cmFjdGNvbmZtZXRob2QuZm9vOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQQoreworICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGVzdFNldHVwKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3RtZXRob2RzL0Fic3RyYWN0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fic3RyYWN0bWV0aG9kcy9BYnN0cmFjdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDI2OGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fic3RyYWN0bWV0aG9kcy9BYnN0cmFjdFRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QuYWJzdHJhY3RtZXRob2RzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkFic3RyYWN0IG1ldGhvZHMgZGVmaW5lZCBpbiBhIHN1cGVyY2xhc3Mgc2hvdWxkIGJlIHJ1biIpCisgIHB1YmxpYyB2b2lkIGFic3RyYWN0U2hvdWxkUnVuKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoQ1JVRFRlc3QyLmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3RtZXRob2RzL0NSVURUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWJzdHJhY3RtZXRob2RzL0NSVURUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxZjNkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdG1ldGhvZHMvQ1JVRFRlc3QuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QuYWJzdHJhY3RtZXRob2RzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ1JVRFRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZSgpOworCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAiY3JlYXRlIikKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fic3RyYWN0bWV0aG9kcy9DUlVEVGVzdDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdG1ldGhvZHMvQ1JVRFRlc3QyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzZjZiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hYnN0cmFjdG1ldGhvZHMvQ1JVRFRlc3QyLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0LmFic3RyYWN0bWV0aG9kczsKKworcHVibGljIGNsYXNzIENSVURUZXN0MiBleHRlbmRzIENSVURUZXN0IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY3JlYXRlKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWQoKSB7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2FjY2Vzcy9CYXNlUHJpdmF0ZUFjY2Vzc0NvbmZpZ3VyYXRpb25NZXRob2RzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWNjZXNzL0Jhc2VQcml2YXRlQWNjZXNzQ29uZmlndXJhdGlvbk1ldGhvZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUyZDBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FjY2Vzcy9CYXNlUHJpdmF0ZUFjY2Vzc0NvbmZpZ3VyYXRpb25NZXRob2RzLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LmFjY2VzczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQmFzZVByaXZhdGVBY2Nlc3NDb25maWd1cmF0aW9uTWV0aG9kcyB7CisgIHByb3RlY3RlZCBib29sZWFuIG1fYmFzZVByb3RlY3RlZCA9IGZhbHNlOworICBwcm90ZWN0ZWQgYm9vbGVhbiBtX2Jhc2VEZWZhdWx0ID0gZmFsc2U7CisgIHByb3RlY3RlZCBib29sZWFuIG1fYmFzZVByaXZhdGUgPSB0cnVlOworCisgIEBCZWZvcmVNZXRob2QKKyAgdm9pZCBiYXNlRGVmYXVsdENvbmZCZWZvcmVNZXRob2QoKSB7CisgICAgbV9iYXNlRGVmYXVsdCA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIGJhc2VQcm90ZWN0ZWRDb25mQmVmb3JlTWV0aG9kKCkgeworICAgIG1fYmFzZVByb3RlY3RlZCA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHByaXZhdGUgdm9pZCBiYXNlUHJpdmF0ZUNvbmZCZWZvcmVNZXRob2QoKSB7CisgICAgbV9iYXNlUHJpdmF0ZSA9IGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWNjZXNzL1ByaXZhdGVBY2Nlc3NDb25maWd1cmF0aW9uTWV0aG9kcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FjY2Vzcy9Qcml2YXRlQWNjZXNzQ29uZmlndXJhdGlvbk1ldGhvZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTU0NzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FjY2Vzcy9Qcml2YXRlQWNjZXNzQ29uZmlndXJhdGlvbk1ldGhvZHMuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIHRlc3QuYWNjZXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRlc3QgdGhhdCBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgQENvbmZpZ3VyYXRpb24gbWV0aG9kcyBhcmUgcnVuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFByaXZhdGVBY2Nlc3NDb25maWd1cmF0aW9uTWV0aG9kcworICBleHRlbmRzIEJhc2VQcml2YXRlQWNjZXNzQ29uZmlndXJhdGlvbk1ldGhvZHMKK3sKKyAgcHJpdmF0ZSBib29sZWFuIG1fcHJpdmF0ZSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9kZWZhdWx0ID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3Byb3RlY3RlZCA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9wdWJsaWMgPSBmYWxzZTsKKworICBAQmVmb3JlTWV0aG9kCisgIHByaXZhdGUgdm9pZCBwcml2YXRlQ29uZkJlZm9yZU1ldGhvZCgpIHsKKyAgICBtX3ByaXZhdGUgPSB0cnVlOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICB2b2lkIGRlZmF1bHRDb25mQmVmb3JlTWV0aG9kKCkgeworICAgIG1fZGVmYXVsdCA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHByb3RlY3RlZENvbmZCZWZvcmVNZXRob2QoKSB7CisgICAgbV9wcm90ZWN0ZWQgPSB0cnVlOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBwdWJsaWNDb25mQmVmb3JlTWV0aG9kKCkgeworICAgIG1fcHVibGljID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFsbEFjY2Vzc01vZGlmaWVyc0NvbmZpZ3VyYXRpb24oKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9wcml2YXRlLCAicHJpdmF0ZSBAQ29uZmlndXJhdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fZGVmYXVsdCwgImRlZmF1bHQgQENvbmZpZ3VyYXRpb24gc2hvdWxkIGhhdmUgYmVlbiBydW4iKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3Byb3RlY3RlZCwgInByb3RlY3RlZCBAQ29uZmlndXJhdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fcHVibGljLCAicHVibGljIEBDb25maWd1cmF0aW9uIHNob3VsZCBoYXZlIGJlZW4gcnVuIik7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2Jhc2VQcm90ZWN0ZWQsICJwcm90ZWN0ZWQgYmFzZSBAQ29uZmlndXJhdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmFzZURlZmF1bHQsICJkZWZhdWx0IGJhc2UgQENvbmZpZ3VyYXRpb24gc2hvdWxkIGhhdmUgYmVlbiBydW4iKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2Jhc2VQcml2YXRlLCAicHJpdmF0ZSBiYXNlIEBDb25maWd1cmF0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIHJ1biIpOworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbHdheXNydW4vQWx3YXlzUnVuQWZ0ZXIxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWx3YXlzcnVuL0Fsd2F5c1J1bkFmdGVyMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjBlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWx3YXlzcnVuL0Fsd2F5c1J1bkFmdGVyMS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgdGVzdC5hbHdheXNydW47CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBbHdheXNSdW5BZnRlcjEgeworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fc3VjY2VzcyA9IGZhbHNlOworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcFNob3VsZEZhaWwoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxpbmcgaW4gc2V0VXAiKTsKKyAgfQorCisgIEBBZnRlckNsYXNzKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIG1fc3VjY2VzcyA9IHRydWU7CisgIH0KKworICAvLyBBZGRpbmcgdGhpcyBtZXRob2Qgb3IgQENvbmZpZ3VyYXRpb24gd2lsbCBuZXZlciBiZSBpbnZva2VkCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGR1bW15KCkgeworCisgIH0KKworICBzdGF0aWMgcHVibGljIGJvb2xlYW4gc3VjY2VzcygpIHsKKyAgICByZXR1cm4gbV9zdWNjZXNzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWx3YXlzcnVuL0Fsd2F5c1J1bkFmdGVyMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fsd2F5c3J1bi9BbHdheXNSdW5BZnRlcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEyMzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fsd2F5c3J1bi9BbHdheXNSdW5BZnRlcjIuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIHRlc3QuYWx3YXlzcnVuOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CisKK3B1YmxpYyBjbGFzcyBBbHdheXNSdW5BZnRlcjIgeworCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9zdWNjZXNzID0gdHJ1ZTsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgc2V0VXBTaG91bGRGYWlsKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsaW5nIGluIHNldFVwIik7CisgIH0KKworICAvLyBTaG91bGQgbm90IGJlIHJ1bgorICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBtX3N1Y2Nlc3MgPSBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBzdWNjZXNzKCkgeworICAgIHJldHVybiBtX3N1Y2Nlc3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbHdheXNydW4vQWx3YXlzUnVuQmVmb3JlMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fsd2F5c3J1bi9BbHdheXNSdW5CZWZvcmUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1ZDUzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbHdheXNydW4vQWx3YXlzUnVuQmVmb3JlMS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgdGVzdC5hbHdheXNydW47CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUZXN0cyBhbHdheXNSdW4gb24gYSBiZWZvcmUgQ29uZmlndXJhdGlvbiBtZXRob2QuICBJbnZva2UgdGhpcyB0ZXN0CisgKiBieSBydW5uaW5nIGdyb3VwICJBIgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBAZGF0ZSBNYXIgMTEsIDIwMDYKKyAqLworcHVibGljIGNsYXNzIEFsd2F5c1J1bkJlZm9yZTEgeworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fYmVmb3JlU3VpdGVTdWNjZXNzID0gZmFsc2U7CisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9iZWZvcmVUZXN0U3VjY2VzcyA9IGZhbHNlOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fYmVmb3JlVGVzdENsYXNzU3VjY2VzcyA9IGZhbHNlOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fYmVmb3JlVGVzdE1ldGhvZFN1Y2Nlc3MgPSBmYWxzZTsKKworICBAQmVmb3JlU3VpdGUoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgaW5pdFN1aXRlKCkgeworICAgIG1fYmVmb3JlU3VpdGVTdWNjZXNzID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVUZXN0KGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGluaXRUZXN0KCkgeworICAgIG1fYmVmb3JlVGVzdFN1Y2Nlc3MgPSB0cnVlOworICB9CisKKyAgQEJlZm9yZUNsYXNzKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGluaXRUZXN0Q2xhc3MoKSB7CisgICAgbV9iZWZvcmVUZXN0Q2xhc3NTdWNjZXNzID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgaW5pdFRlc3RNZXRob2QoKSB7CisgICAgbV9iZWZvcmVUZXN0TWV0aG9kU3VjY2VzcyA9IHRydWU7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiQSIpCisgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZVN1aXRlU3VjY2Vzcyk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmVUZXN0U3VjY2Vzcyk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmVUZXN0Q2xhc3NTdWNjZXNzKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZVRlc3RNZXRob2RTdWNjZXNzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdWNjZXNzKCkgeworICAgIHJldHVybiBtX2JlZm9yZVN1aXRlU3VjY2VzcyAmJiBtX2JlZm9yZVRlc3RTdWNjZXNzICYmCisgICAgICBtX2JlZm9yZVRlc3RDbGFzc1N1Y2Nlc3MgJiYgbV9iZWZvcmVUZXN0TWV0aG9kU3VjY2VzczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYWx3YXlzcnVuL0Fsd2F5c1J1blRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbHdheXNydW4vQWx3YXlzUnVuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmQxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYWx3YXlzcnVuL0Fsd2F5c1J1blRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3QuYWx3YXlzcnVuOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKK2ltcG9ydCB0ZXN0aGVscGVyLk91dHB1dERpcmVjdG9yeVBhdGNoOworCitwdWJsaWMgY2xhc3MgQWx3YXlzUnVuVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB3aXRoQWx3YXlzUnVuQWZ0ZXIoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0ZXN0bmcgPSBjcmVhdGUoKTsKKyAgICB0ZXN0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICB0ZXN0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBBbHdheXNSdW5BZnRlcjEuY2xhc3MgfSk7CisgICAgdGVzdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdGVzdG5nLnJ1bigpOworICAgIGFzc2VydFRydWUoQWx3YXlzUnVuQWZ0ZXIxLnN1Y2Nlc3MoKSwgImFmdGVyVGVzdE1ldGhvZCBzaG91bGQgaGF2ZSBydW4iKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHdpdGhvdXRBbHdheXNSdW5BZnRlcigpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HIHRlc3RuZyA9IGNyZWF0ZSgpOworICAgIHRlc3RuZy5zZXRPdXRwdXREaXJlY3RvcnkoT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOworICAgIHRlc3RuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEFsd2F5c1J1bkFmdGVyMi5jbGFzcyB9KTsKKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0ZXN0bmcucnVuKCk7CisgICAgYXNzZXJ0VHJ1ZShBbHdheXNSdW5BZnRlcjIuc3VjY2VzcygpLCAiYWZ0ZXJUZXN0TWV0aG9kIHNob3VsZCBub3QgaGF2ZSBydW4iKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHdpdGhvdXRBbHdheXNSdW5CZWZvcmUoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0ZXN0bmcgPSBjcmVhdGUoKTsKKyAgICB0ZXN0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICB0ZXN0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBBbHdheXNSdW5CZWZvcmUxLmNsYXNzIH0pOworICAgIHRlc3RuZy5zZXRHcm91cHMoIkEiKTsKKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0ZXN0bmcucnVuKCk7CisgICAgYXNzZXJ0VHJ1ZShBbHdheXNSdW5CZWZvcmUxLnN1Y2Nlc3MoKSwgImJlZm9yZSBhbHdheXNSdW4gbWV0aG9kcyBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltBbHdheXNSdW5UZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3NJbnZvY2F0aW9uU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJDbGFzc0ludm9jYXRpb25TYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3M2FlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3NJbnZvY2F0aW9uU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGludm9jYXRpb25Db3VudCA9IDMpCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3NJbnZvY2F0aW9uU2FtcGxlVGVzdCB7CisKKyAgcHVibGljIHZvaWQgZjEoKSB7fQorCisgIHB1YmxpYyB2b2lkIGYyKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3NTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0Fubm90YXRpb25UcmFuc2Zvcm1lckNsYXNzU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjVmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0Fubm90YXRpb25UcmFuc2Zvcm1lckNsYXNzU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyB0ZXN0IHdpbGwgZmFpbCB1bmxlc3MgYSB0aW1lIG91dCB0cmFuc2Zvcm1lcgorICogaXMgYXBwbGllZCB0byBpdC4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICoKKyAqLworQFRlc3QodGltZU91dCA9IDEwMDApCitATGlzdGVuZXJzKE15U3VpdGVMaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVHJhbnNmb3JtZXJDbGFzc1NhbXBsZVRlc3QgeworCisgIHB1YmxpYyB2b2lkIG9uZSgpIHsKKyAgICB0cnkgeworICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOworLy8gICAgICBwcHAoIkZJTklTSEVEIFNMRUVQSU5HIik7CisgICAgfQorICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBoYW5kbGVkKSB7CisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworLy8gICAgICBwcHAoIldBUyBJTlRFUlJVUFRFRCIpOworICAgICAgLy8gaWdub3JlCisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVHJhbnNmb3JtZXJdICIgKyBzdHJpbmcpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVyRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3NjEyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVyRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVHJhbnNmb3JtZXJEYXRhUHJvdmlkZXJTYW1wbGVUZXN0IHsKKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgSW50ZWdlcltdW10geworICAgICAgICBuZXcgSW50ZWdlcltdIHsgNDIgfSwKKyAgICB9OworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRhdGFQcm92aWRlciIpCisgIHB1YmxpYyB2b2lkIGYoSW50ZWdlciBuKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuLCBJbnRlZ2VyLnZhbHVlT2YoNDIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJGYWN0b3J5U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJGYWN0b3J5U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTU2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0Fubm90YXRpb25UcmFuc2Zvcm1lckZhY3RvcnlTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25UcmFuc2Zvcm1lckZhY3RvcnlTYW1wbGVUZXN0IHsKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkYXRhUHJvdmlkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBJbnRlZ2VyW11bXSB7CisgICAgICAgIG5ldyBJbnRlZ2VyW10geyA0MiB9LAorICAgIH07CisgIH0KKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgT2JqZWN0W10gaW5pdChpbnQgbikgeworICAgIHJldHVybiBuZXcgT2JqZWN0W10geworICAgICAgICBuZXcgU2ltcGxlVGVzdChuKQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVySW5UZXN0bmdYbWwuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVySW5UZXN0bmdYbWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRhMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJJblRlc3RuZ1htbC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklBbm5vdGF0aW9uVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRyYW5zZm9ybWVySW5UZXN0bmdYbWwgaW1wbGVtZW50cyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIHsKKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHNob3VsZFJ1bkFmdGVyVHJhbnNmb3JtYXRpb24oKSB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpIHsKKyAgICBhbm5vdGF0aW9uLnNldEVuYWJsZWQodHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVySW52b2NhdGlvbkNvdW50VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJJbnZvY2F0aW9uQ291bnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1NzQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQW5ub3RhdGlvblRyYW5zZm9ybWVySW52b2NhdGlvbkNvdW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklBbm5vdGF0aW9uVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRyYW5zZm9ybWVySW52b2NhdGlvbkNvdW50VGVzdCB7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZvY2F0aW9uQ291bnRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW52b2NhdGlvbkNvdW50OworCisgICAgcHVibGljIEludm9jYXRpb25Db3VudFRyYW5zZm9ybWVyKGludCBpbnZvY2F0aW9uQ291bnQpIHsKKyAgICAgIHRoaXMuaW52b2NhdGlvbkNvdW50ID0gaW52b2NhdGlvbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsIE1ldGhvZCB0ZXN0TWV0aG9kKSB7CisgICAgICBpZiAoImNvbmN1cnJlbmN5VGVzdCIuZXF1YWxzKHRlc3RNZXRob2QuZ2V0TmFtZSgpKSkgeworICAgICAgICBhbm5vdGF0aW9uLnNldEludm9jYXRpb25Db3VudChpbnZvY2F0aW9uQ291bnQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDMpCisgIHB1YmxpYyB2b2lkIGNvbmN1cnJlbmN5VGVzdCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0Fubm90YXRpb25UcmFuc2Zvcm1lclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTMwYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSB0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25UcmFuc2Zvcm1lclNhbXBsZVRlc3QgeworCisgIHByaXZhdGUgaW50IG1fdHdvID0gMDsKKyAgcHJpdmF0ZSBpbnQgbV9maXZlID0gMDsKKyAgcHJpdmF0ZSBpbnQgbV90aHJlZSA9IDA7CisgIHByaXZhdGUgaW50IG1fZm91ciA9IDA7CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gMikKKyAgcHVibGljIHZvaWQgdHdvKCkgeworICAgIG1fdHdvKys7CisgIH0KKworICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSA1KQorICBwdWJsaWMgdm9pZCBmb3VyKCkgeworICAgIG1fZm91cisrOworICB9CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gNSkKKyAgcHVibGljIHZvaWQgdGhyZWUoKSB7CisgICAgbV90aHJlZSsrOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZml2ZSgpIHsKKyAgICBtX2ZpdmUrKzsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7InR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV90d28sIDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV90aHJlZSwgMyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtX2ZvdXIsIDQpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9maXZlLCA1KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0Fubm90YXRpb25UcmFuc2Zvcm1lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAwYTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Bbm5vdGF0aW9uVHJhbnNmb3JtZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNTIgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5pdGVyYWJsZS5FeHRyYWN0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5QYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25UcmFuc2Zvcm1lclRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0cmFjdG9yIE5BTUVfRVhUUkFDVE9SID0gbmV3IEV4dHJhY3RvcjxJVGVzdFJlc3VsdCwgU3RyaW5nPigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3QoSVRlc3RSZXN1bHQgaW5wdXQpIHsKKyAgICAgIHJldHVybiBpbnB1dC5nZXROYW1lKCk7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBNYWtlIHN1cmUgdGhhdCB3aXRob3V0IGEgdHJhbnNmb3JtZXIgaW4gcGxhY2UsIGEgY2xhc3MtbGV2ZWwKKyAgICogYW5ub3RhdGlvbiBpbnZvY2F0aW9uQ291bnQgaXMgY29ycmVjdGx5IHVzZWQuCisgICAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlBbm5vdGF0aW9uV2l0aG91dFRyYW5zZm9ybWVyKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoQW5ub3RhdGlvblRyYW5zZm9ybWVyU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBhc3NlcnRUaGF0KHRsYS5nZXRQYXNzZWRUZXN0cygpKS5leHRyYWN0aW5nKE5BTUVfRVhUUkFDVE9SKQorICAgICAgICAuY29udGFpbnNFeGFjdGx5KAorICAgICAgICAgICAgImZpdmUiLAorICAgICAgICAgICAgImZvdXIiLCAiZm91ciIsICJmb3VyIiwgImZvdXIiLCAiZm91ciIsCisgICAgICAgICAgICAidGhyZWUiLCAidGhyZWUiLCAidGhyZWUiLCAidGhyZWUiLCAidGhyZWUiLAorICAgICAgICAgICAgInR3byIsICJ0d28iCisgICAgICAgICk7CisgICAgYXNzZXJ0VGhhdCh0bGEuZ2V0RmFpbGVkVGVzdHMoKSkuZXh0cmFjdGluZyhOQU1FX0VYVFJBQ1RPUikKKyAgICAgICAgLmNvbnRhaW5zRXhhY3RseSgidmVyaWZ5Iik7CisgIH0KKworICAvKioKKyAgICogVGVzdCBhIHRyYW5zZm9ybWVyIG9uIGEgbWV0aG9kLWxldmVsIEBUZXN0CisgICAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlBbm5vdGF0aW9uVHJhbnNmb3JtZXJNZXRob2QoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShBbm5vdGF0aW9uVHJhbnNmb3JtZXJTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcuc2V0UHJlc2VydmVPcmRlcih0cnVlKTsKKworICAgIE15VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBuZXcgTXlUcmFuc2Zvcm1lcigpOworICAgIHRuZy5zZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpOworCisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworCisgICAgdG5nLnJ1bigpOworCisgICAgYXNzZXJ0VGhhdCh0cmFuc2Zvcm1lci5nZXRNZXRob2ROYW1lcygpKS5jb250YWlucygidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJ2ZXJpZnkiKTsKKworICAgIGFzc2VydFRoYXQodGxhLmdldFBhc3NlZFRlc3RzKCkpLmV4dHJhY3RpbmcoTkFNRV9FWFRSQUNUT1IpCisgICAgICAgIC5jb250YWluc0V4YWN0bHkoCisgICAgICAgICAgICAiZml2ZSIsICJmaXZlIiwgImZpdmUiLCAiZml2ZSIsICJmaXZlIiwKKyAgICAgICAgICAgICJmb3VyIiwgImZvdXIiLCAiZm91ciIsICJmb3VyIiwKKyAgICAgICAgICAgICJ0aHJlZSIsICJ0aHJlZSIsICJ0aHJlZSIsCisgICAgICAgICAgICAidHdvIiwgInR3byIsCisgICAgICAgICAgICAidmVyaWZ5IgorICAgICAgICApOworICAgIGFzc2VydFRoYXQodGxhLmdldEZhaWxlZFRlc3RzKCkpLmlzRW1wdHkoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUFubm90YXRpb25UcmFuc2Zvcm1lckhhc09ubHlPbmVOb25OdWxsQXJndW1lbnQoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShBbm5vdGF0aW9uVHJhbnNmb3JtZXJTYW1wbGVUZXN0LmNsYXNzKTsKKworICAgIE15UGFyYW1UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBNeVBhcmFtVHJhbnNmb3JtZXIoKTsKKyAgICB0bmcuc2V0QW5ub3RhdGlvblRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRoYXQodHJhbnNmb3JtZXIuaXNTdWNjZXNzKCkpLmlzVHJ1ZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5TXlQYXJhbVRyYW5zZm9ybWVyT25seU9uZU5vbk51bGwoKSB7CisgICAgYXNzZXJ0VGhhdChNeVBhcmFtVHJhbnNmb3JtZXIub25seU9uZU5vbk51bGwobnVsbCwgbnVsbCwgbnVsbCkpLmlzRmFsc2UoKTsKKyAgICBhc3NlcnRUaGF0KE15UGFyYW1UcmFuc2Zvcm1lci5vbmx5T25lTm9uTnVsbCgKKyAgICAgICAgTXlQYXJhbVRyYW5zZm9ybWVyLmNsYXNzLCBNeVBhcmFtVHJhbnNmb3JtZXIuY2xhc3MuZ2V0Q29uc3RydWN0b3JzKClbMF0sIG51bGwpKS5pc0ZhbHNlKCk7CisgICAgYXNzZXJ0VGhhdChNeVBhcmFtVHJhbnNmb3JtZXIub25seU9uZU5vbk51bGwoTXlQYXJhbVRyYW5zZm9ybWVyLmNsYXNzLCBudWxsLCBudWxsKSkuaXNUcnVlKCk7CisgIH0KKworICAvKioKKyAgICogV2l0aG91dCBhbiBhbm5vdGF0aW9uIHRyYW5zZm9ybWVyLCB3ZSBzaG91bGQgaGF2ZSB6ZXJvCisgICAqIHBhc3NlZCB0ZXN0cyBhbmQgb25lIGZhaWxlZCB0ZXN0IGNhbGxlZCAib25lIi4KKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUFubm90YXRpb25UcmFuc2Zvcm1lckNsYXNzMigpIHsKKyAgICBydW5UZXN0KG51bGwsIG51bGwsICJvbmUiKTsKKyAgfQorCisgIC8qKgorICAgKiBXaXRoIGFuIGFubm90YXRpb24gdHJhbnNmb3JtZXIsIHdlIHNob3VsZCBoYXZlIG9uZSBwYXNzZWQKKyAgICogdGVzdCBjYWxsZWQgIm9uZSIgYW5kIHplcm8gZmFpbGVkIHRlc3RzLgorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5QW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3MoKSB7CisgICAgcnVuVGVzdChuZXcgTXlUaW1lT3V0VHJhbnNmb3JtZXIoKSwgIm9uZSIsIG51bGwpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoSUFubm90YXRpb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwKKyAgICAgIFN0cmluZyBwYXNzZWROYW1lLCBTdHJpbmcgZmFpbGVkTmFtZSkKKyAgeworICAgIE15U3VpdGVMaXN0ZW5lci50cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICBNeVN1aXRlTGlzdGVuZXIyLnRyaWdnZXJlZCA9IGZhbHNlOworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdG5nLnNldFZlcmJvc2UoMCk7CisgICAgaWYgKHRyYW5zZm9ybWVyICE9IG51bGwpIHsKKyAgICAgIHRuZy5zZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpOworICAgIH0KKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBBbm5vdGF0aW9uVHJhbnNmb3JtZXJDbGFzc1NhbXBsZVRlc3QuY2xhc3N9KTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBMaXN0PElUZXN0UmVzdWx0PiByZXN1bHRzID0KKyAgICAgIHBhc3NlZE5hbWUgIT0gbnVsbCA/IHRsYS5nZXRQYXNzZWRUZXN0cygpIDogdGxhLmdldEZhaWxlZFRlc3RzKCk7CisgICAgU3RyaW5nIG5hbWUgPSBwYXNzZWROYW1lICE9IG51bGwgPyBwYXNzZWROYW1lIDogZmFpbGVkTmFtZTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0cy5zaXplKCksIDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmFtZSwgcmVzdWx0cy5nZXQoMCkuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShNeVN1aXRlTGlzdGVuZXIudHJpZ2dlcmVkKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoTXlTdWl0ZUxpc3RlbmVyMi50cmlnZ2VyZWQpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5TGlzdGVuZXJBbm5vdGF0aW9uVHJhbnNmb3JtZXJDbGFzcygpIHsKKyAgICBNeVN1aXRlTGlzdGVuZXIudHJpZ2dlcmVkID0gZmFsc2U7CisgICAgTXlTdWl0ZUxpc3RlbmVyMi50cmlnZ2VyZWQgPSBmYWxzZTsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5zZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIobmV3IE15TGlzdGVuZXJUcmFuc2Zvcm1lcigpKTsKKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW117QW5ub3RhdGlvblRyYW5zZm9ybWVyQ2xhc3NTYW1wbGVUZXN0LmNsYXNzfSk7CisKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKE15U3VpdGVMaXN0ZW5lci50cmlnZ2VyZWQpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKE15U3VpdGVMaXN0ZW5lcjIudHJpZ2dlcmVkKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUNvbmZpZ3VyYXRpb25UcmFuc2Zvcm1lcigpIHsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIobmV3IENvbmZpZ3VyYXRpb25UcmFuc2Zvcm1lcigpKTsKKyAgICB0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBDb25maWd1cmF0aW9uU2FtcGxlVGVzdC5jbGFzc30pOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ29uZmlndXJhdGlvblNhbXBsZVRlc3QuZ2V0QmVmb3JlKCksICJjb3JyZWN0Iik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEYXRhUHJvdmlkZXJUcmFuc2Zvcm1lcigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldEFubm90YXRpb25UcmFuc2Zvcm1lcihuZXcgRGF0YVByb3ZpZGVyVHJhbnNmb3JtZXIoKSk7CisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgQW5ub3RhdGlvblRyYW5zZm9ybWVyRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5jbGFzc30pOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUZhY3RvcnlUcmFuc2Zvcm1lcigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldEFubm90YXRpb25UcmFuc2Zvcm1lcihuZXcgRmFjdG9yeVRyYW5zZm9ybWVyKCkpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEFubm90YXRpb25UcmFuc2Zvcm1lckZhY3RvcnlTYW1wbGVUZXN0LmNsYXNzfSk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworCisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDEpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiVGVzdCBmb3IgaXNzdWUgIzYwNSIpCisgIHB1YmxpYyB2b2lkIHZlcmlmeUludm9jYXRpb25Db3VudFRyYW5zZm9ybWVyKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBBbm5vdGF0aW9uVHJhbnNmb3JtZXJJbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzIH0pOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAzKTsKKworICAgIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRBbm5vdGF0aW9uVHJhbnNmb3JtZXIobmV3IEFubm90YXRpb25UcmFuc2Zvcm1lckludm9jYXRpb25Db3VudFRlc3QuSW52b2NhdGlvbkNvdW50VHJhbnNmb3JtZXIoNSkpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXXtBbm5vdGF0aW9uVHJhbnNmb3JtZXJJbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzfSk7CisgICAgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCA1KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFubm90YXRpb25UcmFuc2Zvcm1lckluWG1sU2hvdWxkQmVSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgeG1sID0gIjxzdWl0ZSBuYW1lPVwiU2luZ2xlU3VpdGVcIiA+IiArCisgICAgICAgICIgIDxsaXN0ZW5lcnM+IiArCisgICAgICAgICIgICAgPGxpc3RlbmVyIGNsYXNzLW5hbWU9XCJ0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lci5Bbm5vdGF0aW9uVHJhbnNmb3JtZXJJblRlc3RuZ1htbFwiIC8+IiArCisgICAgICAgICIgIDwvbGlzdGVuZXJzPiIgKworICAgICAgICAiICA8dGVzdCBlbmFibGVkPVwidHJ1ZVwiIG5hbWU9XCJTaW5nbGVUZXN0XCI+IiArCisgICAgICAgICIgICAgPGNsYXNzZXM+IiArCisgICAgICAgICIgICAgICA8Y2xhc3MgbmFtZT1cInRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyLkFubm90YXRpb25UcmFuc2Zvcm1lckluVGVzdG5nWG1sXCIgLz4iICsKKyAgICAgICAgIiAgICA8L2NsYXNzZXM+IiArCisgICAgICAgICIgIDwvdGVzdD4iICsKKyAgICAgICAgIjwvc3VpdGU+IgorICAgICAgICA7CisKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwuZ2V0Qnl0ZXMoKSk7CisgICAgQ29sbGVjdGlvbjxYbWxTdWl0ZT4gc3VpdGVzID0gbmV3IFBhcnNlcihpcykucGFyc2UoKTsKKworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3Qoc3VpdGVzLnRvQXJyYXkobmV3IFhtbFN1aXRlWzBdKSkpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0NvbmZpZ3VyYXRpb25TYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0NvbmZpZ3VyYXRpb25TYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYzg3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvQ29uZmlndXJhdGlvblNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2FtcGxlVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtX2JlZm9yZSA9ICJ1bmluaXRpYWxpemVkIjsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7CisgICAgbV9iZWZvcmUgPSAiY29ycmVjdCI7CisgIH0KKworICBAQmVmb3JlTWV0aG9kKGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgdGVzdGluZ0VuYWJsZWRPbkNvbmZpZ3VyYXRpb24oKSB7CisgICAgbV9iZWZvcmUgPSAidGhpcyBtZXRob2QgaXMgbm90IGVuYWJsZWQsIHdlIHNob3VsZCBub3QgYmUgaGVyZSI7CisgIH0KKworICAvLyB3aWxsIGJlIGRpc2FibGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHRyYW5zZm9ybWVyCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlTWV0aG9kKCkgeworICAgIG1fYmVmb3JlID0gImluY29ycmVjdCI7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkge30KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCZWZvcmUoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0NvbmZpZ3VyYXRpb25UcmFuc2Zvcm1lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Db25maWd1cmF0aW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUyNDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9Db25maWd1cmF0aW9uVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklEYXRhUHJvdmlkZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lcjIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgICBpZiAoYW5ub3RhdGlvbi5nZXRCZWZvcmVUZXN0TWV0aG9kKCkpIHsKKyAgICAgIGFubm90YXRpb24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZXRob2QgdGVzdE1ldGhvZCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJRmFjdG9yeUFubm90YXRpb24gYW5ub3RhdGlvbiwgTWV0aG9kIHRlc3RNZXRob2QpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0RhdGFQcm92aWRlclRyYW5zZm9ybWVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0RhdGFQcm92aWRlclRyYW5zZm9ybWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0YjNmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvRGF0YVByb3ZpZGVyVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklEYXRhUHJvdmlkZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJQ29uZmlndXJhdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLAorICAgICAgQ29uc3RydWN0b3IgdGVzdENvbnN0cnVjdG9yLCBNZXRob2QgdGVzdE1ldGhvZCkKKyAgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZXRob2QgdGVzdE1ldGhvZCkgeworICAgIGFubm90YXRpb24uc2V0TmFtZSgiZGF0YVByb3ZpZGVyIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElUZXN0QW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsIE1ldGhvZCB0ZXN0TWV0aG9kKQorICB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElGYWN0b3J5QW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZXRob2QgdGVzdE1ldGhvZCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL0ZhY3RvcnlUcmFuc2Zvcm1lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9GYWN0b3J5VHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjJhZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9GYWN0b3J5VHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklEYXRhUHJvdmlkZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgRmFjdG9yeVRyYW5zZm9ybWVyIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lcjIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSURhdGFQcm92aWRlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTWV0aG9kIHRlc3RNZXRob2QpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSUZhY3RvcnlBbm5vdGF0aW9uIGFubm90YXRpb24sIE1ldGhvZCB0ZXN0TWV0aG9kKSB7CisgICAgYW5ub3RhdGlvbi5zZXREYXRhUHJvdmlkZXIoImRhdGFQcm92aWRlciIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015TGlzdGVuZXJUcmFuc2Zvcm1lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeUxpc3RlbmVyVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDVjYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeUxpc3RlbmVyVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyMzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklDb25maWd1cmF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklEYXRhUHJvdmlkZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUxpc3RlbmVyc0Fubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBNeUxpc3RlbmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyMyB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJTGlzdGVuZXJzQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICBhbm5vdGF0aW9uLnNldFZhbHVlKG5ldyBDbGFzc1tde015U3VpdGVMaXN0ZW5lcjIuY2xhc3N9KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpIHt9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZXRob2QgbWV0aG9kKSB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSUZhY3RvcnlBbm5vdGF0aW9uIGFubm90YXRpb24sIE1ldGhvZCBtZXRob2QpIHt9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLCBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgdGVzdE1ldGhvZCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvTXlQYXJhbVRyYW5zZm9ybWVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015UGFyYW1UcmFuc2Zvcm1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWFkODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015UGFyYW1UcmFuc2Zvcm1lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklBbm5vdGF0aW9uVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBNeVBhcmFtVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblRyYW5zZm9ybWVyIHsKKworICBwcml2YXRlIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLAorICAgICAgQ29uc3RydWN0b3IgdGVzdENvbnN0cnVjdG9yLCBNZXRob2QgdGVzdE1ldGhvZCkgeworICAgIGlmICghb25seU9uZU5vbk51bGwodGVzdENsYXNzLCB0ZXN0Q29uc3RydWN0b3IsIHRlc3RNZXRob2QpKSB7CisgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlPbmVOb25OdWxsKENsYXNzIHRlc3RDbGFzcywgQ29uc3RydWN0b3IgdGVzdENvbnN0cnVjdG9yLCBNZXRob2QgdGVzdE1ldGhvZCkgeworICAgIHJldHVybiAoKHRlc3RDbGFzcyAhPSBudWxsICYmIHRlc3RDb25zdHJ1Y3RvciA9PSBudWxsICYmIHRlc3RNZXRob2QgPT0gbnVsbCkgfHwKKyAgICAgICAgICAgICh0ZXN0Q2xhc3MgPT0gbnVsbCAmJiB0ZXN0Q29uc3RydWN0b3IgIT0gbnVsbCAmJiB0ZXN0TWV0aG9kID09IG51bGwpIHx8CisgICAgICAgICAgICAodGVzdENsYXNzID09IG51bGwgJiYgdGVzdENvbnN0cnVjdG9yID09IG51bGwgJiYgdGVzdE1ldGhvZCAhPSBudWxsKSApOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCkgeworICAgIHJldHVybiBzdWNjZXNzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015U3VpdGVMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeVN1aXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njk4ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeVN1aXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIE15U3VpdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElTdWl0ZUxpc3RlbmVyIHsKKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJpZ2dlcmVkID0gZmFsc2U7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVN1aXRlIHN1aXRlKSB7CisgICAgdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJU3VpdGUgc3VpdGUpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015U3VpdGVMaXN0ZW5lcjIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvTXlTdWl0ZUxpc3RlbmVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzA5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015U3VpdGVMaXN0ZW5lcjIuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIE15U3VpdGVMaXN0ZW5lcjIgaW1wbGVtZW50cyBJU3VpdGVMaXN0ZW5lciB7CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHRyaWdnZXJlZCA9IGZhbHNlOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblN0YXJ0KElTdWl0ZSBzdWl0ZSkgeworICAgIHRyaWdnZXJlZCA9IHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25GaW5pc2goSVN1aXRlIHN1aXRlKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeVRpbWVPdXRUcmFuc2Zvcm1lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9NeVRpbWVPdXRUcmFuc2Zvcm1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015VGltZU91dFRyYW5zZm9ybWVyLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUFubm90YXRpb25UcmFuc2Zvcm1lcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklUZXN0QW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworcHVibGljIGNsYXNzIE15VGltZU91dFRyYW5zZm9ybWVyIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLAorICAgICAgQ29uc3RydWN0b3IgdGVzdENvbnN0cnVjdG9yLCBNZXRob2QgdGVzdE1ldGhvZCkKKyAgeworICAgIGFubm90YXRpb24uc2V0VGltZU91dCg1MDAwKTsgLy8gNSBzZWNvbmRzCisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015VHJhbnNmb3JtZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbm5vdGF0aW9udHJhbnNmb3JtZXIvTXlUcmFuc2Zvcm1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZWVlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL015VHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QuYW5ub3RhdGlvbnRyYW5zZm9ybWVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNeVRyYW5zZm9ybWVyIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbWV0aG9kTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdHJhbnNmb3JtKElUZXN0QW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB0ZXN0Q2xhc3MsCisgICAgICBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsIE1ldGhvZCB0ZXN0TWV0aG9kKSB7CisgICAgYW5ub3RhdGlvbi5zZXRUaW1lT3V0KDEwMDAwKTsKKyAgICBpZiAodGVzdE1ldGhvZCAhPSBudWxsKSB7CisgICAgICBzd2l0Y2ggKHRlc3RNZXRob2QuZ2V0TmFtZSgpKSB7CisgICAgICAgIGNhc2UgInRocmVlIjoKKyAgICAgICAgICBhbm5vdGF0aW9uLnNldEludm9jYXRpb25Db3VudCgzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZm91ciI6CisgICAgICAgICAgYW5ub3RhdGlvbi5zZXRJbnZvY2F0aW9uQ291bnQoNCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImZpdmUiOgorICAgICAgICAgIGFubm90YXRpb24uc2V0SW52b2NhdGlvbkNvdW50KDUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbWV0aG9kTmFtZXMuYWRkKHRlc3RNZXRob2QuZ2V0TmFtZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1ldGhvZE5hbWVzKCkgeworICAgIHJldHVybiBtZXRob2ROYW1lczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9TaW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW5ub3RhdGlvbnRyYW5zZm9ybWVyL1NpbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUzMmMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fubm90YXRpb250cmFuc2Zvcm1lci9TaW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNpbXBsZVRlc3QgeworICBwcml2YXRlIGludCBtX247CisKKyAgcHVibGljIFNpbXBsZVRlc3QoaW50IG4pIHsKKyAgICBtX24gPSBuOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9uLCA0Mik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hbnQvQW50U3lzdGVtUHJvcGVydHlTZXQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbnQvQW50U3lzdGVtUHJvcGVydHlTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ4Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FudC9BbnRTeXN0ZW1Qcm9wZXJ0eVNldC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5hbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRlc3Qgd2hldGhlciBuZXN0ZWQgcHJvcGVydHlzZXRzIGFyZSBwYXNzZWQgcGFzc2VkIGZyb20gdGhlIGFudCB0YXNrLiBFeGVjdXRlZCBieSB0aGUgInJ1bjphbnRwcm9wIiB0YXJnZXQKKyAqIGluIHRlc3QvYnVpbGQueG1sLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnR0b3B3ZWxsc0BnbWFpbC5jb20iPlRvZGQgV2VsbHM8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTeXN0ZW1Qcm9wZXJ0eVNldCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgb3V0cHV0VGVzdFByb3BlcnRpZXMoKQorICB7CisgICAgYXNzZXJ0Tm90TnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkoInN5c3Byb3BzZXQxIiksICJzeXNwcm9wc2V0MSBub3QgZm91bmQiKTsKKyAgICBhc3NlcnRFcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJzeXNwcm9wc2V0MSIpLCAidmFsdWUgMSIsICJXcm9uZyB2YWx1ZSBmb3Igc3lzcHJvcHNldDEiKTsKKworICAgIGFzc2VydE5vdE51bGwoU3lzdGVtLmdldFByb3BlcnR5KCJzeXNwcm9wc2V0MiIpLCAic3lzcHJvcHNldDIgbm90IGZvdW5kIik7CisgICAgYXNzZXJ0RXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3lzcHJvcHNldDIiKSwgInZhbHVlIDIiLCAiV3JvbmcgdmFsdWUgZm9yIHN5c3Byb3BzZXQyIik7CisKKyAgICBhc3NlcnROb3ROdWxsKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3lzcHJvcDEiKSwgInN5c3Byb3AxIG5vdCBmb3VuZCIpOworICAgIGFzc2VydEVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInN5c3Byb3AxIiksICJ2YWx1ZSAzIiwgIldyb25nIHZhbHVlIGZvciBzeXNwcm9wMSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L0RvbnRPdmVycmlkZVN1aXRlTmFtZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbnQvRG9udE92ZXJyaWRlU3VpdGVOYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmUzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L0RvbnRPdmVycmlkZVN1aXRlTmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuYW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIERvbnRPdmVycmlkZVN1aXRlTmFtZVRlc3QgeworCXByaXZhdGUgYm9vbGVhbiBtX3J1biA9IGZhbHNlOworCisJQFRlc3QoZ3JvdXBzID0geyJub3BhY2thZ2UifSkKKwlwdWJsaWMgdm9pZCB0ZXN0KCkgeworCSAgIG1fcnVuID0gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L011bHRpcGxlVGhyZWFkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FudC9NdWx0aXBsZVRocmVhZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YxMWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2FudC9NdWx0aXBsZVRocmVhZFRlc3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorcGFja2FnZSB0ZXN0LmFudDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKy8qKg0KKyAqIFRlc3RzIHRoYXQgbW9yZSB0aGFuIG9uZSB0aHJlYWQgaXMgdXNlZCBmb3IgcnVubmluZyB0ZXN0cw0KKyAqIEBhdXRob3IgbWljaGViMTAgMiBPY3QgMjAwNg0KKyAqDQorICovDQorcHVibGljIGNsYXNzIE11bHRpcGxlVGhyZWFkVGVzdCB7DQorCXB1YmxpYyBzdGF0aWMgU2V0PFRocmVhZD4gX3RocmVhZHM7DQorDQorCUBCZWZvcmVDbGFzcw0KKwlwdWJsaWMgdm9pZCBwcmVwYXJlSGFzaFNldCgpIHsNCisJCV90aHJlYWRzPUNvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldDxUaHJlYWQ+KCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDAwKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDAxKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDAyKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDAzKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA0KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA1KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA2KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA3KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA4KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDA5KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDEwKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDExKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDEyKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDEzKCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE0KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE1KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE2KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE3KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE4KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHJlY29yZFRocmVhZDE5KCkgew0KKwkJX3RocmVhZHMuYWRkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOw0KKwl9DQorDQorCUBBZnRlckNsYXNzDQorCXB1YmxpYyB2b2lkIGNvbmZpcm1NdWx0aXBsZVRocmVhZHMoKSB7DQorCQlBc3NlcnQuYXNzZXJ0VHJ1ZShfdGhyZWFkcy5zaXplKCk+MSwiTW9yZSB0aGFuIG9uZSB0aHJlYWQgc2hvdWxkIGhhdmUgYmVlbiB1c2VkIGZvciBydW5uaW5nIHRoZSB0ZXN0cyAtICIrX3RocmVhZHMuc2l6ZSgpKyIgd2FzIHVzZWQiKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L05vUGFja2FnZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbnQvTm9QYWNrYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGI3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L05vUGFja2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QuYW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBGaWxpcHBvIERpb3RhbGV2aQorICovCitwdWJsaWMgY2xhc3MgTm9QYWNrYWdlVGVzdCB7CisJcHJpdmF0ZSBib29sZWFuIG1fcnVuID0gZmFsc2U7CisKKwlAVGVzdChncm91cHMgPSB7Im5vcGFja2FnZSJ9KQorCXB1YmxpYyB2b2lkIHRlc3QoKSB7CisJICAgbV9ydW4gPSB0cnVlOworCX0KKworICAgQEFmdGVyTWV0aG9kKGdyb3VwcyA9IHsibm9wYWNrYWdlIn0pCisgICBwdWJsaWMgdm9pZCBhZnRlcigpIHsKKyAgICAgIGFzc2VydCBtX3J1biA6ICJ0ZXN0IG1ldGhvZCB3YXMgbm90IHJ1biI7CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L1Rlc3RDb21tYW5kTGluZUFyZ3MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hbnQvVGVzdENvbW1hbmRMaW5lQXJncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWY1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYW50L1Rlc3RDb21tYW5kTGluZUFyZ3MuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3QuYW50OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKKy8qKgorICogVGVzdHMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpbiB7QGxpbmsgVGVzdE5HQ29tbWFuZExpbmVBcmdzfS4KKyAqCisgKiBAYXV0aG9yIGprdWhuZXJ0CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29tbWFuZExpbmVBcmdzCit7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFVuaXhQYXRoUmVzb2x1dGlvbigpCisgIHsKKyAgICBTdHJpbmcgcGF0aCA9ICIvd2VlL3dvbS9mbGliYmxlLnR4dCI7CisKKyAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc3BsaXQoIlsvXFxcXF0iLCAtMSk7CisKKyAgICBhc3NlcnRFcXVhbHMoNCwgc2VnbWVudHMubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoIndlZSIsIHNlZ21lbnRzWzFdKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RET1NQYXRoUmVzb2x1dGlvbigpCisgIHsKKyAgICBTdHJpbmcgcGF0aCA9ICJjOlxcXFxjb21cXHBhbnRzXFx3aWJibGUudHh0IjsKKworICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgiWy9cXFxcXSIsIC0xKTsKKworICAgIGFzc2VydEVxdWFscyg1LCBzZWdtZW50cy5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscygiY29tIiwgc2VnbWVudHNbMl0pOyAvLyBiZWNhdXNlIGM6IGlzIGFjdHVhbGx5IFxcIHdoaWNoIHdpbGwgYmUgc3BsaXQgdHdpY2UKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQYXRoUmVzb2x1dGlvbigpCisgIHsKKyAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgicG9tLnhtbCIpOworCisgICAgYXNzZXJ0IGZpbGUuZXhpc3RzKCk7CisKKyAgICBTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICBhc3NlcnQgcGF0aC5zcGxpdCgiWy9cXFxcXSIsIC0xKS5sZW5ndGggPiAxOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYXNzZXJ0aW9uL0Fzc2VydGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9hc3NlcnRpb24vQXNzZXJ0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmYzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYXNzZXJ0aW9uL0Fzc2VydGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIHRlc3QuYXNzZXJ0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYXNzZXJ0cy5Mb2dnaW5nQXNzZXJ0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIEFzc2VydGlvblRlc3QgeworICBwcml2YXRlIExvZ2dpbmdBc3NlcnQgbV9hc3NlcnQ7CisgIHByaXZhdGUgTXlSYXdBc3NlcnRpb24gcmF3QXNzZXJ0aW9uOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgbV9hc3NlcnQgPSBuZXcgTG9nZ2luZ0Fzc2VydCgpOworICAgIHJhd0Fzc2VydGlvbiA9IG5ldyBNeVJhd0Fzc2VydGlvbigpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgIG1fYXNzZXJ0LmFzc2VydFRydWUoZmFsc2UsICJuZXcgVGVzdE5HIEFzc2VydGlvbiBGYWlsZWQiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIHJhd0Fzc2VydGlvbi5hc3NlcnRUcnVlKHRydWUpOworICAgIHJhd0Fzc2VydGlvbi5teUFzc2VydCgidGVzdCIsIHRydWUsICJSYXcgdGVzdCIpOworCisgICAgYXNzZXJ0VGhhdChyYXdBc3NlcnRpb24uZ2V0TWV0aG9kcygpKQorICAgICAgICAuY29udGFpbnNFeGFjdGx5KCJvbkJlZm9yZUFzc2VydCIsICJvbkFzc2VydFN1Y2Nlc3MiLCAib25BZnRlckFzc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9uQmVmb3JlQXNzZXJ0IiwgIm9uQXNzZXJ0U3VjY2VzcyIsICJvbkFmdGVyQXNzZXJ0Iik7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcywgZXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cCA9ICJSYXcgdGVzdCAuKiIpCisgIHB1YmxpYyB2b2lkIHRlc3QyX2ZhaWxzKCkgeworICAgIHRyeSB7CisgICAgICByYXdBc3NlcnRpb24uYXNzZXJ0VHJ1ZSh0cnVlKTsKKyAgICAgIHJhd0Fzc2VydGlvbi5teUFzc2VydCgidGVzdCIsIGZhbHNlLCAiUmF3IHRlc3QiKTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlcnJvcikgeworCisgICAgICBhc3NlcnRUaGF0KHJhd0Fzc2VydGlvbi5nZXRNZXRob2RzKCkpCisgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseSgib25CZWZvcmVBc3NlcnQiLCAib25Bc3NlcnRTdWNjZXNzIiwgIm9uQWZ0ZXJBc3NlcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uQmVmb3JlQXNzZXJ0IiwgIm9uQXNzZXJ0RmFpbHVyZSIsICJkZXByZWNhdGVkX29uQXNzZXJ0RmFpbHVyZSIsICJvbkFmdGVyQXNzZXJ0Iik7CisKKyAgICAgIHRocm93IGVycm9yOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydGlvbi9NeVJhd0Fzc2VydGlvbi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydGlvbi9NeVJhd0Fzc2VydGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzVkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYXNzZXJ0aW9uL015UmF3QXNzZXJ0aW9uLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSB0ZXN0LmFzc2VydGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYXNzZXJ0cy5Bc3NlcnRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hc3NlcnRzLklBc3NlcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTXlSYXdBc3NlcnRpb24gZXh0ZW5kcyBBc3NlcnRpb24geworCisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Bc3NlcnRTdWNjZXNzKElBc3NlcnQgYXNzZXJ0Q29tbWFuZCkgeworICAgIG1ldGhvZHMuYWRkKCJvbkFzc2VydFN1Y2Nlc3MiKTsKKyAgICBzdXBlci5vbkFzc2VydFN1Y2Nlc3MoYXNzZXJ0Q29tbWFuZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Bc3NlcnRGYWlsdXJlKElBc3NlcnQgYXNzZXJ0Q29tbWFuZCkgeworICAgIG1ldGhvZHMuYWRkKCJkZXByZWNhdGVkX29uQXNzZXJ0RmFpbHVyZSIpOworICAgIHN1cGVyLm9uQXNzZXJ0RmFpbHVyZShhc3NlcnRDb21tYW5kKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkFzc2VydEZhaWx1cmUoSUFzc2VydCBhc3NlcnRDb21tYW5kLCBBc3NlcnRpb25FcnJvciBleCkgeworICAgIG1ldGhvZHMuYWRkKCJvbkFzc2VydEZhaWx1cmUiKTsKKyAgICBzdXBlci5vbkFzc2VydEZhaWx1cmUoYXNzZXJ0Q29tbWFuZCwgZXgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQmVmb3JlQXNzZXJ0KElBc3NlcnQgYXNzZXJ0Q29tbWFuZCkgeworICAgIG1ldGhvZHMuYWRkKCJvbkJlZm9yZUFzc2VydCIpOworICAgIHN1cGVyLm9uQmVmb3JlQXNzZXJ0KGFzc2VydENvbW1hbmQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQWZ0ZXJBc3NlcnQoSUFzc2VydCBhc3NlcnRDb21tYW5kKSB7CisgICAgbWV0aG9kcy5hZGQoIm9uQWZ0ZXJBc3NlcnQiKTsKKyAgICBzdXBlci5vbkFmdGVyQXNzZXJ0KGFzc2VydENvbW1hbmQpOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNZXRob2RzKCkgeworICAgIHJldHVybiBtZXRob2RzOworICB9CisKKyAgcHVibGljIHZvaWQgbXlBc3NlcnQoZmluYWwgU3RyaW5nIGFjdHVhbCwgZmluYWwgYm9vbGVhbiBleHBlY3RlZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBkb0Fzc2VydChuZXcgSUFzc2VydCgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb0Fzc2VydCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoYWN0dWFsLCBtZXNzYWdlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZXhwZWN0ZWQsIG1lc3NhZ2UpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsKCkgeworICAgICAgICByZXR1cm4gYWN0dWFsOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RXhwZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBleHBlY3RlZDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydGlvbi9Tb2Z0QXNzZXJ0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydGlvbi9Tb2Z0QXNzZXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWJhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYXNzZXJ0aW9uL1NvZnRBc3NlcnRUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSB0ZXN0LmFzc2VydGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFzc2VydHMuSUFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFzc2VydHMuU29mdEFzc2VydDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK3B1YmxpYyBjbGFzcyBTb2Z0QXNzZXJ0VGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE9uU3VjY2VlZEFuZEZhaWx1cmVDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb2xsZWN0aW9uPElBc3NlcnQ+IHN1Y2NlZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBmaW5hbCBDb2xsZWN0aW9uPElBc3NlcnQ+IGZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgZmluYWwgU29mdEFzc2VydCBzYSA9IG5ldyBTb2Z0QXNzZXJ0KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkFzc2VydFN1Y2Nlc3MoSUFzc2VydCBhc3NlcnRDb21tYW5kKSB7CisgICAgICAgIHN1Y2NlZWQuYWRkKGFzc2VydENvbW1hbmQpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQXNzZXJ0RmFpbHVyZShJQXNzZXJ0IGFzc2VydENvbW1hbmQsIEFzc2VydGlvbkVycm9yIGV4KSB7CisgICAgICAgIGZhaWx1cmVzLmFkZChhc3NlcnRDb21tYW5kKTsKKyAgICAgIH0KKyAgICB9OworICAgIHNhLmFzc2VydFRydWUodHJ1ZSk7CisgICAgc2EuYXNzZXJ0VHJ1ZShmYWxzZSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdWNjZWVkLnNpemUoKSwgMSwgc3VjY2VlZC50b1N0cmluZygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhaWx1cmVzLnNpemUoKSwgMSwgZmFpbHVyZXMudG9TdHJpbmcoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0QWxsQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbWVzc2FnZSA9ICJNeSBtZXNzYWdlIjsKKyAgICBTb2Z0QXNzZXJ0IHNhID0gbmV3IFNvZnRBc3NlcnQoKTsKKyAgICBzYS5hc3NlcnRUcnVlKHRydWUpOworICAgIHNhLmFzc2VydFRydWUoZmFsc2UsIG1lc3NhZ2UpOworICAgIHRyeSB7CisgICAgICBzYS5hc3NlcnRBbGwoKTsKKyAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisgICAgICBTdHJpbmdbXSBsaW5lcyA9IGUuZ2V0TWVzc2FnZSgpLnNwbGl0KCJccj9cbiIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsaW5lcy5sZW5ndGgsIDIpOworICAgICAgbGluZXNbMV0gPSBsaW5lc1sxXS5yZXBsYWNlRmlyc3QobWVzc2FnZSwgIiIpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGxpbmVzWzFdLmNvbnRhaW5zKG1lc3NhZ2UpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9hc3NlcnR0ZXN0cy9BcnJheUVxdWFsaXR5QXNzZXJ0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydHRlc3RzL0FycmF5RXF1YWxpdHlBc3NlcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4Y2ZmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9hc3NlcnR0ZXN0cy9BcnJheUVxdWFsaXR5QXNzZXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACitwYWNrYWdlIHRlc3QuYXNzZXJ0dGVzdHM7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOw0KK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOw0KKw0KKy8qKg0KKyAqIFRlc3RzIGRpZmZlcmVudCBlcXVhbGl0eSBjYXNlcyBmb3IgbmVzdGVkIGNvbGxlY3Rpb25zDQorICogYW5kIGFycmF5cy4NCisgKi8NCitwdWJsaWMgY2xhc3MgQXJyYXlFcXVhbGl0eUFzc2VydFRlc3Qgew0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCBhcnJheUFzc2VydEVxdWFscygpIHsNCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgaW50W117IDQyIH0sIG5ldyBpbnRbXSB7IDQyIH0sDQorICAgICAgICAgICAgICAgICJhcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUgY29tcGFyZWQgYnkgdmFsdWUgaW4gYXNzZXJ0RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIGFycmF5QXNzZXJ0Tm90RXF1YWxzKCkgew0KKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG5ldyBpbnRbXXsgNDIgfSwgbmV3IGludFtdIHsgNDIgfSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBvZiBwcmltaXRpdmVzIGFyZSBjb21wYXJlZCBieSB2YWx1ZSBpbiBhc3NlcnROb3RFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCBib3hlZEFycmF5QXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyW117IDQyIH0sIG5ldyBJbnRlZ2VyW10geyA0MiB9LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIG9mIHdyYXBwZWQgdmFsdWVzIGFyZSBjb21wYXJlZCBieSB2YWx1ZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYm94ZWRBcnJheUFzc2VydE5vdEVxdWFscygpIHsNCisgICAgICAgIGFzc2VydE5vdEVxdWFscyhuZXcgSW50ZWdlcltdeyA0MiB9LCBuZXcgSW50ZWdlcltdIHsgNDIgfSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBvZiB3cmFwcGVkIHZhbHVlcyBhcmUgY29tcGFyZWQgYnkgdmFsdWUgaW4gYXNzZXJ0Tm90RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgbWl4ZWRBcnJheXNBc3NlcnRFcXVhbHMoKSB7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IGludFtdeyA0MiB9LCBuZXcgSW50ZWdlcltdIHsgNDIgfSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBvZiB3cmFwcGVkIHZhbHVlcyBhcmUgY29tcGFyZWQgYnkgdmFsdWUgaW4gYXNzZXJ0RXF1YWxzIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXJbXXsgNDIgfSwgbmV3IGludFtdIHsgNDIgfSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBvZiB3cmFwcGVkIHZhbHVlcyBhcmUgY29tcGFyZWQgYnkgdmFsdWUgaW4gYXNzZXJ0RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIG1peGVkQXJyYXlzQXNzZXJ0Tm90RXF1YWxzKCkgew0KKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG5ldyBpbnRbXXsgNDIgfSwgbmV3IEludGVnZXJbXSB7IDQyIH0sDQorICAgICAgICAgICAgICAgICJhcnJheXMgb2Ygd3JhcHBlZCB2YWx1ZXMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIGluIGFzc2VydE5vdEVxdWFscyIpOw0KKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG5ldyBJbnRlZ2VyW117IDQyIH0sIG5ldyBpbnRbXSB7IDQyIH0sDQorICAgICAgICAgICAgICAgICJhcnJheXMgb2Ygd3JhcHBlZCB2YWx1ZXMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIGluIGFzc2VydE5vdEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQ0KKyAgICBwdWJsaWMgdm9pZCBhcnJheUluc2lkZUxpc3RBc3NlcnRFcXVhbHMoKSB7DQorICAgICAgICBMaXN0PGludFtdPiBsaXN0ID0gQXJyYXlzLmFzTGlzdCgNCisgICAgICAgICAgICBuZXcgaW50W117IDQyIH0NCisgICAgICAgICk7DQorICAgICAgICBMaXN0PGludFtdPiBsaXN0Q29weSA9IEFycmF5cy5hc0xpc3QoDQorICAgICAgICAgICAgbmV3IGludFtdeyA0MiB9DQorICAgICAgICApOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QsIGxpc3RDb3B5LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIGluc2lkZSBsaXN0cyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIGFycmF5SW5zaWRlTGlzdEFzc2VydE5vdEVxdWFscygpIHsNCisgICAgICAgIExpc3Q8aW50W10+IGxpc3QgPSBBcnJheXMuYXNMaXN0KA0KKyAgICAgICAgICAgIG5ldyBpbnRbXXsgNDIgfQ0KKyAgICAgICAgKTsNCisgICAgICAgIExpc3Q8aW50W10+IGxpc3RDb3B5ID0gQXJyYXlzLmFzTGlzdCgNCisgICAgICAgICAgICBuZXcgaW50W117IDQyIH0NCisgICAgICAgICk7DQorICAgICAgICBhc3NlcnROb3RFcXVhbHMobGlzdCwgbGlzdENvcHksDQorICAgICAgICAgICAgICAgICJhcnJheXMgaW5zaWRlIGxpc3RzIGFyZSBjb21wYXJlZCBieSByZWZlcmVuY2UgaW4gYXNzZXJ0Tm90RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIGFycmF5SW5zaWRlTWFwQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTWFwPFN0cmluZywgaW50W10+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIG1hcC5wdXQoImFycmF5IiwgbmV3IGludFtdeyA0MiB9KTsNCisgICAgICAgIE1hcDxTdHJpbmcsIGludFtdPiBtYXBDb3B5ID0gbmV3IEhhc2hNYXA8PigpOw0KKyAgICAgICAgbWFwQ29weS5wdXQoImFycmF5IiwgbmV3IGludFtdeyA0MiB9KTsNCisNCisgICAgICAgIC8vIGFycmF5cyBpbnNpZGUgbWFwcyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyhNYXAsTWFwKQ0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcCwgbWFwQ29weSk7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIGFycmF5SW5zaWRlTWFwQXNzZXJ0RXF1YWxzV2l0aE1lc3NhZ2UoKSB7DQorICAgICAgICBNYXA8U3RyaW5nLCBpbnRbXT4gbWFwID0gbmV3IEhhc2hNYXA8PigpOw0KKyAgICAgICAgbWFwLnB1dCgiYXJyYXkiLCBuZXcgaW50W117IDQyIH0pOw0KKyAgICAgICAgTWFwPFN0cmluZywgaW50W10+IG1hcENvcHkgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBtYXBDb3B5LnB1dCgiYXJyYXkiLCBuZXcgaW50W117IDQyIH0pOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcCwgbWFwQ29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgbWFwcyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyhNYXAsTWFwLFN0cmluZykiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCBhcnJheUluc2lkZU1hcEFzc2VydE5vdEVxdWFscygpIHsNCisgICAgICAgIE1hcDxTdHJpbmcsIGludFtdPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBtYXAucHV0KCJhcnJheSIsIG5ldyBpbnRbXXsgNDIgfSk7DQorICAgICAgICBNYXA8U3RyaW5nLCBpbnRbXT4gbWFwQ29weSA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIG1hcENvcHkucHV0KCJhcnJheSIsIG5ldyBpbnRbXXsgNDIgfSk7DQorDQorICAgICAgICBhc3NlcnROb3RFcXVhbHMobWFwLCBtYXBDb3B5LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIGluc2lkZSBtYXBzIGFyZSBjb21wYXJlZCBieSByZWZlcmVuY2UgaW4gYXNzZXJ0Tm90RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIGFycmF5SW5zaWRlU2V0QXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgU2V0PGludFtdPiBzZXQgPSBuZXcgSGFzaFNldDw+KCk7DQorICAgICAgICBzZXQuYWRkKG5ldyBpbnRbXXsgNDIgfSk7DQorICAgICAgICBTZXQ8aW50W10+IHNldENvcHkgPSBuZXcgSGFzaFNldDw+KCk7DQorICAgICAgICBzZXRDb3B5LmFkZChuZXcgaW50W117IDQyIH0pOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNldCwgc2V0Q29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgc2V0cyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydE5vdEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIGFycmF5SW5zaWRlU2V0QXNzZXJ0Tm90RXF1YWxzKCkgew0KKyAgICAgICAgU2V0PGludFtdPiBzZXQgPSBuZXcgSGFzaFNldDw+KCk7DQorICAgICAgICBzZXQuYWRkKG5ldyBpbnRbXXsgNDIgfSk7DQorICAgICAgICBTZXQ8aW50W10+IHNldENvcHkgPSBuZXcgSGFzaFNldDw+KCk7DQorICAgICAgICBzZXRDb3B5LmFkZChuZXcgaW50W117IDQyIH0pOw0KKw0KKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKHNldCwgc2V0Q29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgc2V0cyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydE5vdEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQ0KKyAgICBwdWJsaWMgdm9pZCBhcnJheURlZXBJbkxpc3RzQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTGlzdDxMaXN0PGludFtdPj4gbGlzdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQXJyYXlzLmFzTGlzdChuZXcgaW50W117IDQyIH0pKTsNCisgICAgICAgIExpc3Q8TGlzdDxpbnRbXT4+IGxpc3RDb3B5ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KG5ldyBpbnRbXXsgNDIgfSkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QsIGxpc3RDb3B5LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIGluc2lkZSBsaXN0cyB3aGljaCBhcmUgaW5zaWRlIGxpc3RzIHRoZW1zZWx2ZXMgYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYXJyYXlEZWVwSW5NYXBzQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgaW50W10+PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBNYXA8U3RyaW5nLCBpbnRbXT4gaW5uZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBpbm5lck1hcC5wdXQoImFycmF5IiwgbmV3IGludFtdeyA0MiB9KTsNCisgICAgICAgIG1hcC5wdXQoIm1hcCIsIGlubmVyTWFwKTsNCisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIGludFtdPj4gbWFwQ29weSA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIE1hcDxTdHJpbmcsIGludFtdPiBpbm5lck1hcENvcHkgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBpbm5lck1hcENvcHkucHV0KCJhcnJheSIsIG5ldyBpbnRbXXsgNDIgfSk7DQorICAgICAgICBtYXBDb3B5LnB1dCgibWFwIiwgaW5uZXJNYXBDb3B5KTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhtYXAsIG1hcENvcHksDQorICAgICAgICAgICAgICAgICJhcnJheXMgaW5zaWRlIG1hcHMgd2hpY2ggYXJlIGluc2lkZSBtYXBzIHRoZW1zZWx2ZXMgYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYXJyYXlEZWVwSW5MaXN0QW5kTWFwQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBpbnRbXT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgICAgIE1hcDxTdHJpbmcsIGludFtdPiBpbm5lck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIGlubmVyTWFwLnB1dCgiYXJyYXkiLCBuZXcgaW50W117IDQyIH0pOw0KKyAgICAgICAgbGlzdC5hZGQoaW5uZXJNYXApOw0KKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBpbnRbXT4+IGxpc3RDb3B5ID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgICBNYXA8U3RyaW5nLCBpbnRbXT4gaW5uZXJNYXBDb3B5ID0gbmV3IEhhc2hNYXA8PigpOw0KKyAgICAgICAgaW5uZXJNYXBDb3B5LnB1dCgiYXJyYXkiLCBuZXcgaW50W117IDQyIH0pOw0KKyAgICAgICAgbGlzdC5hZGQoaW5uZXJNYXBDb3B5KTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhsaXN0LCBsaXN0Q29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgbWFwcyB3aGljaCBhcmUgaW5zaWRlIGxpc3RzIHRoZW1zZWx2ZXMgYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYXJyYXlEZWVwSW5NYXBBbmRMaXN0QXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxpbnRbXT4+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIG1hcC5wdXQoImxpc3QiLCBBcnJheXMuYXNMaXN0KG5ldyBpbnRbXXsgNDIgfSkpOw0KKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxpbnRbXT4+IG1hcENvcHkgPSBuZXcgSGFzaE1hcDw+KCk7DQorICAgICAgICBtYXBDb3B5LnB1dCgibGlzdCIsIEFycmF5cy5hc0xpc3QobmV3IGludFtdeyA0MiB9KSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMobWFwLCBtYXBDb3B5LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIGluc2lkZSBtYXBzIHdoaWNoIGFyZSBpbnNpZGUgbGlzdHMgdGhlbXNlbHZlcyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQ0KKyAgICBwdWJsaWMgdm9pZCBhcnJheUluc2lkZUl0ZXJhYmxlQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgSXRlcmFibGU8aW50W10+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdCgNCisgICAgICAgICAgICBuZXcgaW50W117IDQyIH0NCisgICAgICAgICk7DQorICAgICAgICBJdGVyYWJsZTxpbnRbXT4gaXRlcmFibGVDb3B5ID0gQXJyYXlzLmFzTGlzdCgNCisgICAgICAgICAgICBuZXcgaW50W117IDQyIH0NCisgICAgICAgICk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoaXRlcmFibGUsIGl0ZXJhYmxlQ29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgSXRlcmFibGVzIGFyZSBjb21wYXJlZCBieSByZWZlcmVuY2UgaW4gYXNzZXJ0RXF1YWxzIik7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpDQorICAgIHB1YmxpYyB2b2lkIGFycmF5RGVlcEluSXRlcmFibGVzQXNzZXJ0RXF1YWxzKCkgew0KKyAgICAgICAgTGlzdDxMaXN0PGludFtdPj4gaXRlcmFibGUgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFycmF5cy5hc0xpc3QobmV3IGludFtdeyA0MiB9KSk7DQorICAgICAgICBMaXN0PExpc3Q8aW50W10+PiBpdGVyYWJsZUNvcHkgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFycmF5cy5hc0xpc3QobmV3IGludFtdeyA0MiB9KSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoaXRlcmFibGUsIGl0ZXJhYmxlQ29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgSXRlcmFibGVzIHdoaWNoIGFyZSBpbnNpZGUgSXRlcmFibGVzIHRoZW1zZWx2ZXMgYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYXJyYXlJbnNpZGVBcnJheUFzc2VydEVxdWFscygpIHsNCisgICAgICAgIGludFtdW10gYXJyYXkgPSBuZXcgaW50W11bXSB7DQorICAgICAgICAgICAgbmV3IGludFtdeyA0MiB9DQorICAgICAgICB9Ow0KKyAgICAgICAgaW50W11bXSBhcnJheUNvcHkgPSBuZXcgaW50W11bXSB7DQorICAgICAgICAgICAgbmV3IGludFtdeyA0MiB9DQorICAgICAgICB9Ow0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LCBhcnJheUNvcHksDQorICAgICAgICAgICAgICAgICJhcnJheXMgaW5zaWRlIGFycmF5cyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQ0KKyAgICBwdWJsaWMgdm9pZCBhcnJheURlZXBJbkFycmF5c0Fzc2VydEVxdWFscygpIHsNCisgICAgICAgIGludFtdW11bXSBhcnJheSA9IG5ldyBpbnRbXVtdW10gew0KKyAgICAgICAgICAgIG5ldyBpbnRbXVtdIHsgbmV3IGludFtdeyA0MiB9IH0NCisgICAgICAgIH07DQorICAgICAgICBpbnRbXVtdW10gYXJyYXlDb3B5ID0gbmV3IGludFtdW11bXSB7DQorICAgICAgICAgICAgbmV3IGludFtdW10geyBuZXcgaW50W117IDQyIH0gfQ0KKyAgICAgICAgfTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhhcnJheSwgYXJyYXlDb3B5LA0KKyAgICAgICAgICAgICAgICAiYXJyYXlzIGluc2lkZSBhcnJheXMgd2hpY2ggYXJlIGluc2lkZSBhcnJheXMgdGhlbXNlbHZlcyBhcmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlIGluIGFzc2VydEVxdWFscyIpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykNCisgICAgcHVibGljIHZvaWQgYXJyYXlEZWVwSW5BcnJheUFuZExpc3RBc3NlcnRFcXVhbHMoKSB7DQorICAgICAgICBMaXN0PGludFtdPltdIGFycmF5ID0gbmV3IExpc3RbXSB7DQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChuZXcgaW50W117IDQyIH0pDQorICAgICAgICB9Ow0KKyAgICAgICAgTGlzdDxpbnRbXT5bXSBhcnJheUNvcHkgPSBuZXcgTGlzdFtdIHsNCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBpbnRbXXsgNDIgfSkNCisgICAgICAgIH07DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXksIGFycmF5Q29weSwNCisgICAgICAgICAgICAgICAgImFycmF5cyBpbnNpZGUgYXJyYXlzIHdoaWNoIGFyZSBpbnNpZGUgYXJyYXlzIHRoZW1zZWx2ZXMgYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZSBpbiBhc3NlcnRFcXVhbHMiKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYXNzZXJ0dGVzdHMvQXNzZXJ0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydHRlc3RzL0Fzc2VydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTkxZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Fzc2VydHRlc3RzL0Fzc2VydFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorcGFja2FnZSB0ZXN0LmFzc2VydHRlc3RzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQuVGhyb3dpbmdSdW5uYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5TZXRzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZXhwZWN0VGhyb3dzOworCitwdWJsaWMgY2xhc3MgQXNzZXJ0VGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbm9PcmRlclN1Y2Nlc3MoKSB7CisgICAgU3RyaW5nW10gcnRvMSA9IHsgImJvb2xlYW4iLCAiQmlnSW50ZWdlciIsICJMaXN0Iix9OworICAgIFN0cmluZ1tdIHJ0bzIgPSB7ICAiTGlzdCIsICJCaWdJbnRlZ2VyIiwgImJvb2xlYW4iLH07CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIocnRvMSwgcnRvMik7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgcHVibGljIHZvaWQgbm9PcmRlckZhaWx1cmUoKSB7CisgICAgU3RyaW5nW10gcnRvMSA9IHsgImEiLCAiYSIsICJiIix9OworICAgIFN0cmluZ1tdIHJ0bzIgPSB7ICAiYSIsICJiIiwgImIiLH07CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIocnRvMSwgcnRvMik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpbnRBcnJheV9Jc3N1ZTQoKSB7CisgICAgaW50W10gaW50QXJyMDAgPSB7MX07CisgICAgaW50W10gaW50QXJyMDEgPSB7MX07CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbnRBcnIwMCwgaW50QXJyMDEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgIHB1YmxpYyB2b2lkIGFycmF5c0ZhaWx1cmVzXzEoKSB7CisgICAgaW50W10gaW50QXJyID0gezEsIDJ9OworICAgIGxvbmdbXSBsb25nQXJyID0gezEsIDJ9OworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW50QXJyLCBsb25nQXJyKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICBwdWJsaWMgdm9pZCBhcnJheXNGYWlsdXJlc18yKCkgeworICAgIGludFtdIGludEFyciA9IHsxLCAyfTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGludEFyciwgKGxvbmcpIDEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgIHB1YmxpYyB2b2lkIGFycmF5c0ZhaWx1cmVzXzMoKSB7CisgICAgbG9uZ1tdIGxvbmdBcnIgPSB7MX07CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygobG9uZykgMSwgbG9uZ0Fycik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzZXRzU3VjY2VzcygpIHsKKyAgICBTZXQ8SW50ZWdlcj4gc2V0MSA9IFNldHMubmV3SGFzaFNldCgpOworICAgIFNldDxJbnRlZ2VyPiBzZXQyID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgICBzZXQxLmFkZCgxKTsKKyAgICBzZXQyLmFkZCgxKTsKKworICAgIHNldDEuYWRkKDMpOworICAgIHNldDIuYWRkKDMpOworCisgICAgc2V0MS5hZGQoMik7CisgICAgc2V0Mi5hZGQoMik7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNldDEsIHNldDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2V0Miwgc2V0MSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgcHVibGljIHZvaWQgZXhwZWN0VGhyb3dzUmVxdWlyZXNBbkV4Y2VwdGlvblRvQmVUaHJvd24oKSB7CisgICAgZXhwZWN0VGhyb3dzKFRocm93YWJsZS5jbGFzcywgbm9uVGhyb3dpbmdSdW5uYWJsZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGV4cGVjdFRocm93c0luY2x1ZGVzQW5JbmZvcm1hdGl2ZURlZmF1bHRNZXNzYWdlKCkgeworICAgIHRyeSB7CisgICAgICBleHBlY3RUaHJvd3MoVGhyb3dhYmxlLmNsYXNzLCBub25UaHJvd2luZ1J1bm5hYmxlKCkpOworICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGV4KSB7CisgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIFRocm93YWJsZSB0byBiZSB0aHJvd24sIGJ1dCBub3RoaW5nIHdhcyB0aHJvd24iLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYWlsKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleHBlY3RUaHJvd3NSZXR1cm5zVGhlU2FtZU9iamVjdFRocm93bigpIHsKKyAgICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKworICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBleHBlY3RUaHJvd3MoVGhyb3dhYmxlLmNsYXNzLCB0aHJvd2luZ1J1bm5hYmxlKG5wZSkpOworCisgICAgYXNzZXJ0U2FtZShucGUsIHRocm93YWJsZSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgcHVibGljIHZvaWQgZXhwZWN0VGhyb3dzRGV0ZWN0c1R5cGVNaXNtYXRjaGVzVmlhRXhwbGljaXRUeXBlSGludCgpIHsKKyAgICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKworICAgIGV4cGVjdFRocm93cyhJT0V4Y2VwdGlvbi5jbGFzcywgdGhyb3dpbmdSdW5uYWJsZShucGUpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGV4cGVjdFRocm93c1dyYXBzQW5kUHJvcGFnYXRlc1VuZXhwZWN0ZWRFeGNlcHRpb25zKCkgeworICAgIE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaW5uZXItbWVzc2FnZSIpOworCisgICAgdHJ5IHsKKyAgICAgIGV4cGVjdFRocm93cyhJT0V4Y2VwdGlvbi5jbGFzcywgdGhyb3dpbmdSdW5uYWJsZShucGUpKTsKKyAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBleCkgeworICAgICAgYXNzZXJ0U2FtZShucGUsIGV4LmdldENhdXNlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJpbm5lci1tZXNzYWdlIiwgZXguZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYWlsKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleHBlY3RUaHJvd3NTdXBwbGllc0FDb2hlcmVudEVycm9yTWVzc2FnZVVwb25UeXBlTWlzbWF0Y2goKSB7CisgICAgTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlID0gbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisKKyAgICB0cnkgeworICAgICAgZXhwZWN0VGhyb3dzKElPRXhjZXB0aW9uLmNsYXNzLCB0aHJvd2luZ1J1bm5hYmxlKG5wZSkpOworICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGVycm9yKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIElPRXhjZXB0aW9uIHRvIGJlIHRocm93biwgYnV0IE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24iLAorICAgICAgICAgICAgICBlcnJvci5nZXRNZXNzYWdlKCkpOworICAgICAgYXNzZXJ0U2FtZShucGUsIGVycm9yLmdldENhdXNlKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYWlsKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUaHJvd2luZ1J1bm5hYmxlIG5vblRocm93aW5nUnVubmFibGUoKSB7CisgICAgcmV0dXJuIG5ldyBUaHJvd2luZ1J1bm5hYmxlKCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRocm93aW5nUnVubmFibGUgdGhyb3dpbmdSdW5uYWJsZShmaW5hbCBUaHJvd2FibGUgdCkgeworICAgIHJldHVybiBuZXcgVGhyb3dpbmdSdW5uYWJsZSgpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0aHJvdyB0OworICAgICAgfQorICAgIH07CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkb3VibGVOYU5Bc3NlcnRpb24oKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEb3VibGUuTmFOLCBEb3VibGUuTmFOLCAwLjApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYXR0cmlidXRlcy9BdHRyaWJ1dGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYXR0cmlidXRlcy9BdHRyaWJ1dGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5ZGQ0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYXR0cmlidXRlcy9BdHRyaWJ1dGVUZXN0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0LmF0dHJpYnV0ZXM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlVGVzdCB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJjKElUZXN0Q29udGV4dCBjdHgpIHsKKyAgICBjdHguc2V0QXR0cmlidXRlKCJ0ZXN0IiwgIjEiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKElUZXN0Q29udGV4dCBjdHgpIHsKKyAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IGN0eC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygidGVzdCIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGN0eC5nZXRBdHRyaWJ1dGUoInRlc3QiKSwgIjEiKTsKKyAgICBPYmplY3QgdiA9IGN0eC5yZW1vdmVBdHRyaWJ1dGUoInRlc3QiKTsKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2KTsKKyAgICBjdHguc2V0QXR0cmlidXRlKCJ0ZXN0MiIsICIyIik7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gImYxIikKKyAgcHVibGljIHZvaWQgZjIoSVRlc3RDb250ZXh0IGN0eCkgeworICAgIFNldDxTdHJpbmc+IG5hbWVzID0gY3R4LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuYW1lcy5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJ0ZXN0MiIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjdHguZ2V0QXR0cmlidXRlKCJ0ZXN0MiIpLmVxdWFscygiMiIpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTAvQnVnOTBUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTAvQnVnOTBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NGJjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5MC9CdWc5MFRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuYnVnOTA7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBCdWc5MFRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvOTAiKQorICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzU2hvdWxkUnVuKCkgeworICAgIFhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiQnVnOTAiKTsKKyAgICBYbWxUZXN0IHQgPSBjcmVhdGVYbWxUZXN0KHMsICJCdWc5MCB0ZXN0IiwgU2FtcGxlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgWG1sQ2xhc3MgYyA9IHQuZ2V0Q2xhc3NlcygpLmdldCgwKTsKKyAgICBjLnNldEluY2x1ZGVkTWV0aG9kcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxJbmNsdWRlKCJ0ZXN0MSIpKSk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzKSk7CisgICAgU2FtcGxlLm1fYWZ0ZXJDbGFzc1dhc1J1biA9IGZhbHNlOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKFNhbXBsZS5tX2FmdGVyQ2xhc3NXYXNSdW4pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTAvU2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTAvU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YjdiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5MC9TYW1wbGUuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QuYnVnOTA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlIHsKKyAgc3RhdGljIGJvb2xlYW4gbV9hZnRlckNsYXNzV2FzUnVuID0gZmFsc2U7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgIH0KKworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICB9CisgIAorICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgIG1fYWZ0ZXJDbGFzc1dhc1J1biA9IHRydWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9CdWc5MlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9CdWc5MlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI3M2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2J1ZzkyL0J1ZzkyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgdGVzdC5idWc5MjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCdWc5MlRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKwlAVGVzdChkZXNjcmlwdGlvbiA9ICJGaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nL2lzc3Vlcy85MiIpCisJcHVibGljIHZvaWQgQmVmb3JlVGVzdFNob3VsZFJ1bk9uY2UoKSB7CisJCVhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiQnVnOTIiKTsKKwkJWG1sVGVzdCB0ID0gY3JlYXRlWG1sVGVzdChzLCAiQnVnOTIgdGVzdCIsIFRlc3RBbHBoYS5jbGFzcy5nZXROYW1lKCksCisJCQkJVGVzdEJyYXZvLmNsYXNzLmdldE5hbWUoKSk7CisJCXMuc2V0VGVzdHMoQXJyYXlzLmFzTGlzdCh0KSk7CisJCVRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKwkJdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKwkJVGVzdEJhc2UuYmVmb3JlVGVzdENvdW50ID0gMDsKKwkJVGVzdEJhc2UuYmVmb3JlVGVzdEFsd2F5c0NvdW50ID0gMDsKKwkJdG5nLnJ1bigpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RCYXNlLmJlZm9yZVRlc3RDb3VudCwgMSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEJhc2UuYmVmb3JlVGVzdEFsd2F5c0NvdW50LCAxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTIvVGVzdEFscGhhLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvYnVnOTIvVGVzdEFscGhhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4YmZjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9UZXN0QWxwaGEuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuYnVnOTI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWxwaGEgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3QxKCkgeworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDIoKSB7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9UZXN0QmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2J1ZzkyL1Rlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxYjI3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9UZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5idWc5MjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RCYXNlIHsKKworCXN0YXRpYyBpbnQgYmVmb3JlVGVzdENvdW50ID0gMDsKKwlzdGF0aWMgaW50IGJlZm9yZVRlc3RBbHdheXNDb3VudCA9IDA7CisKKwlAQmVmb3JlVGVzdAorCXB1YmxpYyB2b2lkIGJhc2VUZXN0QmVmb3JlVGVzdCgpIHsKKwkJYmVmb3JlVGVzdENvdW50Kys7CisJfQorCisJQEJlZm9yZVRlc3QoYWx3YXlzUnVuID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBiYXNlVGVzdEJlZm9yZVRlc3RBbHdheXMoKSB7CisJCWJlZm9yZVRlc3RBbHdheXNDb3VudCsrOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9UZXN0QnJhdm8uamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9idWc5Mi9UZXN0QnJhdm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYxZGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2J1ZzkyL1Rlc3RCcmF2by5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC5idWc5MjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RCcmF2byBleHRlbmRzIFRlc3RCYXNlIHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdDEoKSB7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NsYXNzZ3JvdXAvRmlyc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jbGFzc2dyb3VwL0ZpcnN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyNzNlZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jbGFzc2dyb3VwL0ZpcnN0LmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LmNsYXNzZ3JvdXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGdyb3VwcyA9IHsgImZpcnN0IiB9KQorcHVibGljIGNsYXNzIEZpcnN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX2ZpcnN0MSA9IGZhbHNlOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fZmlyc3QyID0gZmFsc2U7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmlyc3QxKCkgeworICAgIG1fZmlyc3QxID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGZpcnN0MigpIHsKKyAgICBtX2ZpcnN0MiA9IHRydWU7CisgIH0KKworICAgc3RhdGljIGJvb2xlYW4gYWxsUnVuKCkgeworICAgIHJldHVybiBtX2ZpcnN0MSAmJiBtX2ZpcnN0MjsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jbGFzc2dyb3VwL1NlY29uZC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NsYXNzZ3JvdXAvU2Vjb25kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5YzFjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jbGFzc2dyb3VwL1NlY29uZC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5jbGFzc2dyb3VwOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJmaXJzdCIgfSkKK3B1YmxpYyBjbGFzcyBTZWNvbmQgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBhc3NlcnQgRmlyc3QuYWxsUnVuKCkgOiAiTWV0aG9kcyBmb3IgY2xhc3MgRmlyc3Qgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIGZpcnN0LiI7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb21tYW5kbGluZS9Db21tYW5kTGluZU92ZXJyaWRlc1htbC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbW1hbmRsaW5lL0NvbW1hbmRMaW5lT3ZlcnJpZGVzWG1sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMmNhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb21tYW5kbGluZS9Db21tYW5kTGluZU92ZXJyaWRlc1htbC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgdGVzdC5jb21tYW5kbGluZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVPdmVycmlkZXNYbWwgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiU3BlY2lmeWluZyAtZ3JvdXBzIG9uIHRoZSBjb21tYW5kIGxpbmUgc2hvdWxkIG92ZXJyaWRlIHRlc3RuZy54bWwiKQorICBwdWJsaWMgdm9pZCBjb21tYW5kTGluZUdyb3Vwc1Nob3VsZE92ZXJyaWRlWG1sKCkgeworICAgIHJ1blRlc3QoImdvIiwgbnVsbCwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZjIiIH0pKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIlNwZWNpZnlpbmcgLWV4Y2x1ZGVncm91cHMgb24gdGhlIGNvbW1hbmQgbGluZSBzaG91bGQgb3ZlcnJpZGUgdGVzdG5nLnhtbCIpCisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lRXhjbHVkZWRHcm91cHNTaG91bGRPdmVycmlkZVhtbCgpIHsKKyAgICBydW5UZXN0KG51bGwsICJnbyIsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImYxIiB9KSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGRSdW5Cb3RoTWV0aG9kcygpIHsKKyAgICBydW5UZXN0KG51bGwsIG51bGwsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImYxIiwgImYyIiB9KSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuVGVzdChTdHJpbmcgZ3JvdXAsIFN0cmluZyBleGNsdWRlZEdyb3VwcywgTGlzdDxTdHJpbmc+IG1ldGhvZHMpIHsKKyAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIFhtbFRlc3QgdCA9IGNyZWF0ZVhtbFRlc3QocywgIlRlc3QiLCBPdmVycmlkZVNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgaWYgKGdyb3VwICE9IG51bGwpIHRuZy5zZXRHcm91cHMoZ3JvdXApOworICAgIGlmIChleGNsdWRlZEdyb3VwcyAhPSBudWxsKSB0bmcuc2V0RXhjbHVkZWRHcm91cHMoZXhjbHVkZWRHcm91cHMpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChuZXcgWG1sU3VpdGVbXSB7IHMgfSkpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBhc3NlcnRUZXN0UmVzdWx0c0VxdWFsKHRsYS5nZXRQYXNzZWRUZXN0cygpLCBtZXRob2RzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbW1hbmRsaW5lL092ZXJyaWRlU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbW1hbmRsaW5lL092ZXJyaWRlU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZWEzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29tbWFuZGxpbmUvT3ZlcnJpZGVTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LmNvbW1hbmRsaW5lOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVTYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpIHt9CisKKyAgQFRlc3QoZ3JvdXBzID0gImdvIikKKyAgcHVibGljIHZvaWQgZjIoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZmYWlsdXJlL0NsYXNzV2l0aEZhaWxlZEJlZm9yZVN1aXRlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWU5ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZmYWlsdXJlL0NsYXNzV2l0aEZhaWxlZEJlZm9yZVN1aXRlLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LmNvbmZmYWlsdXJlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aEZhaWxlZEJlZm9yZVN1aXRlIHsKKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgc2V0VXBTaG91bGRGYWlsKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsaW5nIGluIHNldFVwIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZmYWlsdXJlL0NsYXNzV2l0aEZhaWxlZEJlZm9yZVN1aXRlVmVyaWZpY2F0aW9uLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlU3VpdGVWZXJpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJhOTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZmYWlsdXJlL0NsYXNzV2l0aEZhaWxlZEJlZm9yZVN1aXRlVmVyaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSB0ZXN0LmNvbmZmYWlsdXJlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVTdWl0ZVZlcmlmaWNhdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX3N1Y2Nlc3MxID0gdHJ1ZTsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX3N1Y2Nlc3MyID0gdHJ1ZTsKKworICAvLyBTaG91bGQgbm90IGJlIHJ1biBiZWNhdXNlIGJlZm9yZVN1aXRlIGZhaWxlZCBvbiB0aGUgb3RoZXIgY2xhc3MKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIG1fc3VjY2VzczEgPSBmYWxzZTsKKyAgfQorCisgIC8vIFNob3VsZCBub3QgYmUgcnVuIGJlY2F1c2UgYmVmb3JlU3VpdGUgZmFpbGVkIG9uIHRoZSBvdGhlciBjbGFzcworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBtX3N1Y2Nlc3MyID0gZmFsc2U7CisgIH0KKworICBzdGF0aWMgcHVibGljIGJvb2xlYW4gc3VjY2VzcygpIHsKKyAgICByZXR1cm4gbV9zdWNjZXNzMSAmJiBtX3N1Y2Nlc3MyOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0YTFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25mZmFpbHVyZS9DbGFzc1dpdGhGYWlsZWRCZWZvcmVUZXN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QuY29uZmZhaWx1cmU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aEZhaWxlZEJlZm9yZVRlc3RDbGFzcyB7CisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcFNob3VsZEZhaWwoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxpbmcgaW4gc2V0VXAiKTsKKyAgfQorCisgIC8vIEFkZGluZyB0aGlzIG1ldGhvZCBvciBAQ29uZmlndXJhdGlvbiB3aWxsIG5ldmVyIGJlIGludm9rZWQKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZHVtbXkoKSB7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzVmVyaWZpY2F0aW9uLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzVmVyaWZpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmZWIxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25mZmFpbHVyZS9DbGFzc1dpdGhGYWlsZWRCZWZvcmVUZXN0Q2xhc3NWZXJpZmljYXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIHRlc3QuY29uZmZhaWx1cmU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVUZXN0Q2xhc3NWZXJpZmljYXRpb24geworCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9zdWNjZXNzMSA9IGZhbHNlOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fc3VjY2VzczIgPSBmYWxzZTsKKworICAvLyBTaG91bGQgYmUgcnVuIGV2ZW4gdGhvdWdoIENsYXNzV2l0aEZhaWxlZEJlZm9yZVRlc3RDbGFzcyBmYWlsZWQgaW4gaXRzIGNvbmZpZ3VyYXRpb24KKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIHNldFVwU2hvdWxkUGFzcygpIHsKKyAgICBtX3N1Y2Nlc3MxID0gdHJ1ZTsKKyAgfQorCisgIC8vIFNob3VsZCBiZSBydW4gZXZlbiB0aG91Z2ggQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzICBmYWlsZWQgaW4gaXRzIGNvbmZpZ3VyYXRpb24KKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgbV9zdWNjZXNzMiA9IHRydWU7CisgIH0KKworICAvLyBBZGRpbmcgdGhpcyBtZXRob2Qgb3IgQENvbmZpZ3VyYXRpb24gd2lsbCBuZXZlciBiZSBpbnZva2VkCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGR1bW15KCkgeworCisgIH0KKworICBzdGF0aWMgcHVibGljIGJvb2xlYW4gc3VjY2VzcygpIHsKKyAgICByZXR1cm4gbV9zdWNjZXNzMSAmJiBtX3N1Y2Nlc3MyOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ29uZmlndXJhdGlvbkZhaWx1cmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25mZmFpbHVyZS9Db25maWd1cmF0aW9uRmFpbHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWE4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmZhaWx1cmUvQ29uZmlndXJhdGlvbkZhaWx1cmUuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3QuY29uZmZhaWx1cmU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0aGVscGVyLk91dHB1dERpcmVjdG9yeVBhdGNoOworCisvKioKKyAqIFRlc3QgdmFyaW91cyBjYXNlcyB3aGVyZSB0aGUgQENvbmZpZ3VyYXRpb24gbWV0aG9kcyBmYWlsCisgKgorICogQ3JlYXRlZCBvbiBKdWwgMjAsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFpbHVyZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdENsYXNzRmFpbHMoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0ZXN0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdGVzdG5nLnNldE91dHB1dERpcmVjdG9yeShPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSk7CisgICAgdGVzdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsKKyAgICAgICAgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlVGVzdENsYXNzLmNsYXNzLAorICAgICAgICBDbGFzc1dpdGhGYWlsZWRCZWZvcmVUZXN0Q2xhc3NWZXJpZmljYXRpb24uY2xhc3MKKyAgICB9KTsKKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0ZXN0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICB0ZXN0bmcucnVuKCk7CisgICAgYXNzZXJ0VHJ1ZShDbGFzc1dpdGhGYWlsZWRCZWZvcmVUZXN0Q2xhc3NWZXJpZmljYXRpb24uc3VjY2VzcygpLAorICAgICAgICAiTm90IGFsbCB0aGUgQENvbmZpZ3VyYXRpb24gbWV0aG9kcyBvZiBSdW4yIHdlcmUgcnVuIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0U3VpdGVGYWlscygpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HIHRlc3RuZyA9IG5ldyBUZXN0TkcoKTsKKyAgICB0ZXN0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICB0ZXN0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVTdWl0ZS5jbGFzcywgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlU3VpdGVWZXJpZmljYXRpb24uY2xhc3MgfSk7CisgICAgdGVzdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdGVzdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdGVzdG5nLnJ1bigpOworICAgIGFzc2VydFRydWUoQ2xhc3NXaXRoRmFpbGVkQmVmb3JlU3VpdGVWZXJpZmljYXRpb24uc3VjY2VzcygpLAorICAgICAgICAiTm8gQENvbmZpZ3VyYXRpb24gbWV0aG9kcyBzaG91bGQgaGF2ZSBydW4iKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQWx3YXlzUnVuVGVzdF0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0OTMxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2UuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK0BUZXN0KGdyb3VwcyA9IHsiYmFzZSJ9KQ0KK3B1YmxpYyBjbGFzcyBCYXNlIHsNCisgIHN0YXRpYyBpbnQgbV9jb3VudDsNCisNCisgIEBCZWZvcmVUZXN0DQorICBwdWJsaWMgdm9pZCBpbml0KCkgew0KKyAgICBtX2NvdW50ID0gMDsNCisgIH0NCisNCisgIEBCZWZvcmVHcm91cHMoZ3JvdXBzID0gImZvbyIpDQorICBwdWJsaWMgdm9pZCBiZWZvcmVHcm91cHMoKSB7DQorICAgIG1fY291bnQrKzsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7DQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VdICIgKyBzKTsNCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmFzZTMuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2UzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5MWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2UzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsKKworcHVibGljIGNsYXNzIEJhc2UzIHsKKworICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlID0gZmFsc2U7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIG1fYmVmb3JlCisgICAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0QmVmb3JlKCkgeworICAgIHJldHVybiBtX2JlZm9yZTsKKyAgfQorCisgIEBCZWZvcmVHcm91cHMoImNnMzQtMSIpCisgIHB1YmxpYyB2b2lkIGFub3RoZXJCZWZvcmUxKCkgeworICAgIGxvZygiYW5vdGhlckJlZm9yZTEiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9iZWZvcmUpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShDb25maWd1cmF0aW9uR3JvdXBzM1NhbXBsZVRlc3QuZ2V0RjEoKSk7CisgICAgbV9iZWZvcmUgPSB0cnVlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgcHBwKHN0cmluZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltCYXNlM10gIiArIHMpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlQmVmb3JlVGVzdE9yZGVyaW5nLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlQmVmb3JlVGVzdE9yZGVyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2ZGFhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2VCZWZvcmVUZXN0T3JkZXJpbmcuamF2YQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgQmFzZUJlZm9yZVRlc3RPcmRlcmluZyB7CisKKyAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgQmVmb3JlVGVzdE9yZGVyaW5nVGVzdC5hZGRUZXN0KHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlR3JvdXBzQVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2VHcm91cHNBU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmNiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlR3JvdXBzQVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBCYXNlR3JvdXBzQVNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlIHsNCisgICBAVGVzdChncm91cHMgPSAiZm9vIikNCisgICBwdWJsaWMgdm9pZCBhKCkgew0KKy8vICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImEiICk7DQorICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlR3JvdXBzQlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0Jhc2VHcm91cHNCU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDVkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlR3JvdXBzQlNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBCYXNlR3JvdXBzQlNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlIHsNCisgICBAVGVzdChncm91cHMgPSAiZm9vIikNCisgICBwdWJsaWMgdm9pZCBiKCkgew0KKy8vICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImIiICk7DQorICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlR3JvdXBzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmFzZUdyb3Vwc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTE5ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmFzZUdyb3Vwc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisvKioNCisgKiBWZXJpZnkgdGhhdCBhIGJhc2UgY2xhc3Mgd2l0aCBhIEJlZm9yZUdyb3VwcyBtZXRob2Qgb25seSBnZXRzIGludm9rZWQNCisgKiBvbmNlLCBubyBtYXR0ZXIgaG93IG1hbnkgc3ViY2xhc3NlcyBpdCBoYXMNCisgKg0KKyAqIENyZWF0ZWQgb24gSmFuIDIzLCAyMDA3DQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBCYXNlR3JvdXBzVGVzdCB7DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNpbmdsZUludm9jYXRpb24oKSB7DQorICAgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsNCisgICAgICB0bmcuc2V0VmVyYm9zZSgwKTsNCisgICAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10gew0KKyAgICAgICAgICBCYXNlR3JvdXBzQVNhbXBsZVRlc3QuY2xhc3MsDQorICAgICAgICAgIEJhc2VHcm91cHNCU2FtcGxlVGVzdC5jbGFzcywNCisgICAgICB9KTsNCisgICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7DQorICAgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7DQorDQorICAgICAgdG5nLnJ1bigpOw0KKw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmFzZS5tX2NvdW50LCAxKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VHcm91cHNUZXN0XSAiICsgcyk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmFzZVN1aXRlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmFzZVN1aXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODA3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CYXNlU3VpdGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBCYXNlU3VpdGVUZXN0IHsNCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxJbnRlZ2VyPiBtX29yZGVyOw0KKw0KKyAgQEJlZm9yZVN1aXRlDQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZVBhcmVudCgpew0KKyAgICBtX29yZGVyID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgIG1fb3JkZXIuYWRkKDEpOw0KKyAgfQ0KKw0KKy8vICBAQWZ0ZXJTdWl0ZQ0KKy8vICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlUGFyZW50KCl7DQorLy8gICAgbV9vcmRlci5hZGQoNSk7DQorLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJBRlRFUiBTVUlURSBQQVJFTlQiKTsNCisvLyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVDbGFzc1RocmVhZEEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZUNsYXNzVGhyZWFkQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDBmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVDbGFzc1RocmVhZEEuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmVmb3JlQ2xhc3NUaHJlYWRBIHsKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgV0hFTjsKKworICAgIEBCZWZvcmVDbGFzcyhhbHdheXNSdW4gPSB0cnVlKQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgV0hFTiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZUNsYXNzVGhyZWFkQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlQ2xhc3NUaHJlYWRCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NDFkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZUNsYXNzVGhyZWFkQi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVDbGFzc1RocmVhZEIgeworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBXSEVOOworCisgICAgQEJlZm9yZUNsYXNzKGFsd2F5c1J1biA9IHRydWUpCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXSEVOID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlQ2xhc3NUaHJlYWRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVDbGFzc1RocmVhZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY1ZGViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlQ2xhc3NUaHJlYWRUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVDbGFzc1RocmVhZFRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3NNZXRob2RzU2hvdWxkUnVuSW5QYXJhbGxlbCgpIHsKKyAgICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShuZXcgQ2xhc3NbXSB7IEJlZm9yZUNsYXNzVGhyZWFkQS5jbGFzcywgQmVmb3JlQ2xhc3NUaHJlYWRCLmNsYXNzIH0pOworICAgICAgICB0bmcuc2V0UGFyYWxsZWwoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk1FVEhPRFMpOworICAgICAgICB0bmcucnVuKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoTWF0aC5hYnMoQmVmb3JlQ2xhc3NUaHJlYWRBLldIRU4gLSBCZWZvcmVDbGFzc1RocmVhZEIuV0hFTikgPCAxMDAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVDbGFzc1dpdGhEaXNhYmxlZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZUNsYXNzV2l0aERpc2FibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2Q1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVDbGFzc1dpdGhEaXNhYmxlZFRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGNsYXNzIEJlZm9yZUNsYXNzV2l0aERpc2FibGVkVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzc1Nob3VsZFJ1bkV2ZW5XaXRoRGlzYWJsZWRNZXRob2RzKCkgeworICAgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKG5ldyBDbGFzc1tdIHsgQ29uZmlndXJhdGlvbkRpc2FibGVkU2FtcGxlVGVzdC5jbGFzcyB9KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKENvbmZpZ3VyYXRpb25EaXNhYmxlZFNhbXBsZVRlc3QubV9hZnRlcldhc1J1bik7CisgICAgICAgIHRuZy5ydW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQ29uZmlndXJhdGlvbkRpc2FibGVkU2FtcGxlVGVzdC5tX2FmdGVyV2FzUnVuKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjEzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQmVmb3JlTWV0aG9kVGVzdCB7CisgIHByaXZhdGUgTWV0aG9kIG1fbWV0aG9kOworICBwcml2YXRlIElUZXN0Q29udGV4dCBtX2NvbnRleHQ7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBiZWZvcmUoTWV0aG9kIG0sIElUZXN0Q29udGV4dCBjdHgpIHsKKyAgICBtX21ldGhvZCA9IG07CisgICAgbV9jb250ZXh0ID0gY3R4OworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbWFpblRlc3QoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtX21ldGhvZC5nZXROYW1lKCksICJtYWluVGVzdCIpOworICAgIElUZXN0TkdNZXRob2RbXSBtZXRob2RzID0gbV9jb250ZXh0LmdldEFsbFRlc3RNZXRob2RzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBtZXRob2RzLmxlbmd0aCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXRob2RzWzBdLmdldE1ldGhvZCgpLmdldE5hbWUoKSwgIm1haW5UZXN0Iik7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlVGVzdE9yZGVyaW5nMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZVRlc3RPcmRlcmluZzFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NTgyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZVRlc3RPcmRlcmluZzFUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmVmb3JlVGVzdE9yZGVyaW5nMVRlc3QgZXh0ZW5kcyBCYXNlQmVmb3JlVGVzdE9yZGVyaW5nIHsKKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBidDEoKSB7CisgICAgbG9nKCJidDEiKTsKKyAgfQorCisgIEBBZnRlclRlc3QKKyAgcHVibGljIHZvaWQgYXQxKCkgeworICAgIGxvZygiYXQxIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpIHsKKyAgICBsb2coImYxIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0JlZm9yZVRlc3RPcmRlcmluZzFUZXN0XSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQmVmb3JlVGVzdE9yZGVyaW5nMlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZVRlc3RPcmRlcmluZzJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzMWZiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZVRlc3RPcmRlcmluZzJUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmVmb3JlVGVzdE9yZGVyaW5nMlRlc3QgZXh0ZW5kcyBCYXNlQmVmb3JlVGVzdE9yZGVyaW5neworCisgIEBCZWZvcmVUZXN0CisgIHB1YmxpYyB2b2lkIGJ0MigpIHsKKyAgICBsb2coImJ0MiIpOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhdDIoKSB7CisgICAgbG9nKCJhdDIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyKCkgeworICAgIGxvZygiZjIiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQmVmb3JlVGVzdE9yZGVyaW5nMlRlc3RdICIgKyBzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVUZXN0T3JkZXJpbmdUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9CZWZvcmVUZXN0T3JkZXJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4NzY1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0JlZm9yZVRlc3RPcmRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCB0ZXN0LlRlc3RIZWxwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVUZXN0T3JkZXJpbmdUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fdGVzdE5hbWVzOworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIG1fdGVzdE5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBhZGRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgeworICAgIG1fdGVzdE5hbWVzLmFkZCh0ZXN0TmFtZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlCZWZvcmVUZXN0T3JkZXJpbmcoKSB7CisKKyAgICBYbWxTdWl0ZSBzID0gbmV3IFhtbFN1aXRlKCk7CisKKyAgICBSZXBvcnRlci5sb2coIkJFRk9SRSIpOworCisgICAgWG1sVGVzdCB0MSA9IG5ldyBYbWxUZXN0KHMpOworICAgIFhtbENsYXNzIGMxID0gbmV3IFhtbENsYXNzKCJ0ZXN0LmNvbmZpZ3VyYXRpb24uQmVmb3JlVGVzdE9yZGVyaW5nMVRlc3QiKTsKKyAgICB0MS5nZXRYbWxDbGFzc2VzKCkuYWRkKGMxKTsKKworICAgIFhtbFRlc3QgdDIgPSBuZXcgWG1sVGVzdChzKTsKKyAgICBYbWxDbGFzcyBjMiA9IG5ldyBYbWxDbGFzcygidGVzdC5jb25maWd1cmF0aW9uLkJlZm9yZVRlc3RPcmRlcmluZzJUZXN0Iik7CisgICAgdDIuZ2V0WG1sQ2xhc3NlcygpLmFkZChjMik7CisKKyAgICBUZXN0TkcgdG5nID0gVGVzdEhlbHBlci5jcmVhdGVUZXN0TkcoKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGwpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChuZXcgWG1sU3VpdGVbXSB7IHMgfSkpOworICAgIHRuZy5ydW4oKTsKKworICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICJidDEiLCAiZjEiLCAiYXQxIiwgImJ0MiIsICJmMiIsICJhdDIiLAorICAgIH0pOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZCwgbV90ZXN0TmFtZXMpOworICB9CisKKworCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQmVmb3JlVGVzdE9yZGVyaW5nVGVzdF0gIiArIHMpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25EaXNhYmxlZFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25EaXNhYmxlZFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJkYTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRpc2FibGVkU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRpc2FibGVkU2FtcGxlVGVzdCB7CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIG1fYWZ0ZXJXYXNSdW47CisKKyAgQEJlZm9yZUNsYXNzKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICBtX2FmdGVyV2FzUnVuID0gZmFsc2U7CisgIH0KKworICBAQWZ0ZXJDbGFzcyhhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlcigpIHsKKyAgICBtX2FmdGVyV2FzUnVuID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkge30KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGYyKCkge30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBCb3RoU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwQm90aFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFjOTcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwQm90aFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckdyb3VwczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Hcm91cEJvdGhTYW1wbGVUZXN0IHsNCisgIHN0YXRpYyBMaXN0PEludGVnZXI+IG1fbGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpKTsNCisNCisgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGFkZFRvTGlzdChJbnRlZ2VyIG4pIHsNCisgICAgbV9saXN0LmFkZChuKTsNCisgIH0NCisNCisgIEBCZWZvcmVHcm91cHMoZ3JvdXBzPXsidHdpY2UifSwgdmFsdWU9eyJ0d2ljZSJ9KQ0KKyAgcHVibGljIHZvaWQgYSgpew0KKyAgICBwcHAoIkJFRk9SRSgpIik7DQorICAgIGFkZFRvTGlzdCgxKTsNCisgIH0NCisNCisgIEBUZXN0KGdyb3Vwcz17InR3aWNlIn0sIGRhdGFQcm92aWRlcj0iTXlEYXRhIiwgaW52b2NhdGlvbkNvdW50ID0gMiwgdGhyZWFkUG9vbFNpemU9MikNCisgIHB1YmxpYyB2b2lkIGIoaW50IGEsIGludCBiKSB7DQorICAgIGFkZFRvTGlzdCgyKTsNCisgICAgcHBwKCJCKCkiICArIGEgKyAiLCIgKyBiKTsNCisgIH0NCisNCisgIEBBZnRlckdyb3Vwcyhncm91cHM9eyJ0d2ljZSJ9LCB2YWx1ZT17InR3aWNlIn0pDQorICBwdWJsaWMgdm9pZCBjKCl7DQorICAgIGFkZFRvTGlzdCgzKTsNCisgICAgcHBwKCJBRlRFUigpIik7DQorICB9DQorDQorICBARGF0YVByb3ZpZGVyKG5hbWU9Ik15RGF0YSIpDQorICBwdWJsaWMgT2JqZWN0W11bXSBpbnB1dCgpew0KKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW117IHsxLDF9LCB7MiwyfSwgezMsM319Ow0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7DQorICAgIGlmIChmYWxzZSkgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0FdICIgKyBzdHJpbmcgKyAiIG9uIFRocmVhZDoiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7DQorICAgIH0NCisgIH0NCisNCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjg2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBEYXRhUHJvdmlkZXJTYW1wbGVUZXN0IHsKKyAgc3RhdGljIExpc3Q8SW50ZWdlcj4gbV9saXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgQEJlZm9yZUdyb3Vwcyhncm91cHM9eyJ0d2ljZSJ9LCB2YWx1ZT17InR3aWNlIn0pCisgIHB1YmxpYyB2b2lkIGEoKXsKKyAgICBwcHAoIkJFRk9SRSgpIik7CisgICAgbV9saXN0LmFkZCgxKTsKKyAgfQorCisgIEBUZXN0KGdyb3Vwcz17InR3aWNlIn0sIGRhdGFQcm92aWRlcj0iTXlEYXRhIikKKyAgcHVibGljIHZvaWQgYihpbnQgYSwgaW50IGIpIHsKKyAgICBtX2xpc3QuYWRkKDIpOworICAgIHBwcCgiQigpIiAgKyBhICsgIiwiICsgYik7CisgIH0KKworICBAQWZ0ZXJHcm91cHMoZ3JvdXBzPXsidHdpY2UifSwgdmFsdWU9eyJ0d2ljZSJ9KQorICBwdWJsaWMgdm9pZCBjKCl7CisgICAgbV9saXN0LmFkZCgzKTsKKyAgICBwcHAoIkFGVEVSKCkiKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZT0iTXlEYXRhIikKKyAgcHVibGljIE9iamVjdFtdW10gaW5wdXQoKXsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW117IHsxLDF9LCB7MiwyfSwgezMsM319OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltBXSAiICsgc3RyaW5nKTsKKyAgICB9CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBJbnZvY2F0aW9uQ291bnRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBJbnZvY2F0aW9uQ291bnRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0MWIzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cEludm9jYXRpb25Db3VudFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Hcm91cEludm9jYXRpb25Db3VudFNhbXBsZVRlc3QgeworICBzdGF0aWMgTGlzdDxJbnRlZ2VyPiBtX2xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAQmVmb3JlR3JvdXBzKGdyb3Vwcz17InR3aWNlIn0sIHZhbHVlPXsidHdpY2UifSkKKyAgcHVibGljIHZvaWQgYSgpeworICAgIHBwcCgiQkVGT1JFKCkiKTsKKyAgICBtX2xpc3QuYWRkKDEpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyJ0d2ljZSJ9LCBpbnZvY2F0aW9uQ291bnQgPSAzKQorICBwdWJsaWMgdm9pZCBiKCkgeworICAgIG1fbGlzdC5hZGQoMik7CisgICAgcHBwKCJCKCkiKTsKKyAgfQorCisgIEBBZnRlckdyb3Vwcyhncm91cHM9eyJ0d2ljZSJ9LCB2YWx1ZT17InR3aWNlIn0pCisgIHB1YmxpYyB2b2lkIGMoKXsKKyAgICBtX2xpc3QuYWRkKDMpOworICAgIHBwcCgiQUZURVIoKSIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltBXSAiICsgc3RyaW5nKTsKKyAgICB9CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzMVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHMxU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjI2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzMVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogU2ltcGxlIGJlZm9yZUdyb3VwcyB0ZXN0OiAgMSBiZWZvcmUgbWV0aG9kIGFuZCAyIHRlc3QgbWV0aG9kCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEBkYXRlIE1hciAzLCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBzMVNhbXBsZVRlc3QgeworICBwcml2YXRlIGJvb2xlYW4gbV9iZWZvcmUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fZjEgPSBmYWxzZTsKKworICBAQmVmb3JlR3JvdXBzKCJjZzEtMSIpCisgIHB1YmxpYyB2b2lkIGJlZm9yZTEoKSB7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYmVmb3JlKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9mMSk7CisgICAgbV9iZWZvcmUgPSB0cnVlOworICAgIGxvZygiYmVmb3JlMSIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnMS1hIikKKyAgcHVibGljIHZvaWQgZmEoKSB7CisgICAgbG9nKCJmYSIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnMS0xIikKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmUpOworICAgIG1fZjEgPSB0cnVlOworICAgIGxvZygiZjEiKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1fbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9IHsiY2cxLWEiLCAiY2cxLTEifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2YxKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICBtX2xpc3QuYWRkKHMpOworICAgIHBwcChzKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0NvbmZpZ3VyYXRpb25Hcm91cHMxU2FtcGxlVGVzdF0gIiArIHMpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzMlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHMyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmY1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzMlNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogYmVmb3JlR3JvdXBzIHRlc3Q6ICBtYWtlIHN1cmUgdGhhdCB0aGUgYmVmb3JlR3JvdXBzIG1ldGhvZCBpcyBpbnZva2VkCisgKiBvbmx5IG9uY2UgZXZlbiBpZiB0d28gdGVzdCBtZXRob2RzIGJlbG9uZyB0byB0aGUgZ3JvdXAKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICogQGRhdGUgTWFyIDMsIDIwMDYKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Hcm91cHMyU2FtcGxlVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9mMSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9nMSA9IGZhbHNlOworCisgIEBCZWZvcmVHcm91cHMoImNnMi0xIikKKyAgcHVibGljIHZvaWQgYmVmb3JlMSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9iZWZvcmUpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtX2YxKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9nMSk7CisgICAgbV9iZWZvcmUgPSB0cnVlOworICAgIGxvZygiYmVmb3JlMSIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnMi1hIikKKyAgcHVibGljIHZvaWQgZmEoKSB7CisgICAgbG9nKCJmYSIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnMi0xIikKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmUpOworICAgIG1fZjEgPSB0cnVlOworICAgIGxvZygiZjEiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJjZzItMSIpCisgIHB1YmxpYyB2b2lkIGcxKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlKTsKKyAgICBtX2cxID0gdHJ1ZTsKKyAgICBsb2coImcxIik7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ImNnMi1hIiwgImNnMi0xIn0pCisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9mMSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9nMSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgbV9saXN0LmFkZChzKTsKKyAgICBwcHAocyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDb25maWd1cmF0aW9uR3JvdXBzMlNhbXBsZVRlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczNTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzM1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMwNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczNTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIGJlZm9yZUdyb3VwcyB0ZXN0OiAgbWFrZSBzdXJlIHRoYXQgaWYgYmVmb3JlIG1ldGhvZHMgYXJlIHNjYXR0ZXJlZCBvbgorICogbW9yZSB0aGFuIG9uZSBjbGFzcywgdGhleSBhcmUgc3RpbGwgdGFrZW4gaW50byBhY2NvdW50CisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEBkYXRlIE1hciAzLCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBzM1NhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlMyB7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZSA9IGZhbHNlOworICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIG1fZjEgPSBmYWxzZTsKKworICBAQmVmb3JlR3JvdXBzKCJjZzM0LTEiKQorICBwdWJsaWMgdm9pZCBiZWZvcmUxKCkgeworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtX2JlZm9yZSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fZjEpOworICAgIG1fYmVmb3JlID0gdHJ1ZTsKKyAgICBsb2coImJlZm9yZTEiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJjZzM0LWEiKQorICBwdWJsaWMgdm9pZCBmYSgpIHsKKyAgICBsb2coImZhIik7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiY2czNC0xIikKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmUpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEJhc2UzLmdldEJlZm9yZSgpKTsKKyAgICBtX2YxID0gdHJ1ZTsKKyAgICBsb2coImYxIik7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ImNnMzQtYSIsICJjZzM0LTEifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCYXNlMy5nZXRCZWZvcmUoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9mMSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgbV9saXN0LmFkZChzKTsKKyAgICBwcHAocyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDb25maWd1cmF0aW9uR3JvdXBzM1NhbXBsZVRlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RjEoKSB7CisgICAgcmV0dXJuIG1fZjE7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzNFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgxMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBTaW1wbGUgYWZ0ZXJHcm91cHMgdGVzdAorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBAZGF0ZSBNYXIgNywgMjAwNgorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkdyb3VwczRTYW1wbGVUZXN0IHsKKworICBwcml2YXRlIGJvb2xlYW4gbV9hZnRlciA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9ydW4gPSBmYWxzZTsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICAgIGxvZygiZiIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnNC0xIikKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIGxvZygicnVuIik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYWZ0ZXIpOworICAgIG1fcnVuID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlckdyb3VwcygiY2c0LTEiKQorICBwdWJsaWMgdm9pZCBhZnRlcjEoKSB7CisgICAgbG9nKCJhZnRlcjEiKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1bik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYWZ0ZXIpOworICAgIG1fYWZ0ZXIgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0gImNnNC0xIikKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGxvZygidmVyaWZ5Iik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9ydW4sICJydW4oKSB3YXNuJ3QgcnVuIik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9hZnRlciwgImFmdGVyMSgpIHdhc24ndCBydW4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgeworICAgIHBwcChzdHJpbmcpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ29uZmlndXJhdGlvbkdyb3VwczRTYW1wbGVUZXN0XSAiICsgcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM1U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmNzI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM1U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogYWZ0ZXJHcm91cHMgdGVzdCB3aXRoIG1vcmUgdGhhbiBvbmUgZ3JvdXAKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICogQGRhdGUgTWFyIDcsIDIwMDYKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Hcm91cHM1U2FtcGxlVGVzdCB7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWZ0ZXIgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fcnVuMSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9ydW4yID0gZmFsc2U7CisgIHByaXZhdGUgaW50IG1fYWZ0ZXJDb3VudCA9IDA7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHsKKyAgICBsb2coImYiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJjZzUtMSIpCisgIHB1YmxpYyB2b2lkIHJ1bjEoKSB7CisgICAgbG9nKCJydW4xIik7CisgICAgaWYgKG1fYWZ0ZXJDb3VudCA9PSAwKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9hZnRlcik7CisgICAgfQorICAgIG1fcnVuMSA9IHRydWU7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiY2c1LTIiKQorICBwdWJsaWMgdm9pZCBydW4yKCkgeworICAgIGxvZygicnVuMiIpOworICAgIGlmIChtX2FmdGVyQ291bnQgPT0gMCkgeworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYWZ0ZXIpOworICAgIH0KKyAgICBtX3J1bjIgPSB0cnVlOworICB9CisKKyAgQEFmdGVyR3JvdXBzKHsgImNnNS0xIiwgImNnNS0yIn0pCisgIHB1YmxpYyB2b2lkIGFmdGVyKCkgeworICAgIGxvZygiYWZ0ZXIiKTsKKyAgICBtX2FmdGVyQ291bnQrKzsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1bjEgfHwgbV9ydW4yKTsKKyAgICBpZiAobV9hZnRlckNvdW50ID09IDApIHsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtX2FmdGVyKTsKKyAgICB9CisgICAgbV9hZnRlciA9IHRydWU7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJjZzUtMSIsICJjZzUtMiIgfSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGxvZygidmVyaWZ5Iik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9ydW4xLCAicnVuMSgpIHdhc24ndCBydW4iKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1bjIsICJydW4yKCkgd2Fzbid0IHJ1biIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYWZ0ZXIsICJhZnRlcjEoKSB3YXNuJ3QgcnVuIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtX2FmdGVyQ291bnQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgcHBwKHN0cmluZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDb25maWd1cmF0aW9uR3JvdXBzNVNhbXBsZVRlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczZTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uR3JvdXBzNlNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFhZmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczZTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBhZnRlckdyb3VwcyB0ZXN0IHdoZW4gdGhlIGdyb3VwIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgbWV0aG9kCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqIEBkYXRlIE1hciA3LCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBzNlNhbXBsZVRlc3QgeworCisgIHByaXZhdGUgYm9vbGVhbiBtX2FmdGVyID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3J1bjEgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fcnVuMiA9IGZhbHNlOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYoKSB7CisgICAgbG9nKCJmIik7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiY2c2LTEiKQorICBwdWJsaWMgdm9pZCBydW4xKCkgeworICAgIGxvZygicnVuMSIpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtX2FmdGVyKTsKKyAgICBtX3J1bjEgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gImNnNi0xIikKKyAgcHVibGljIHZvaWQgcnVuMigpIHsKKyAgICBsb2coInJ1bjIiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9hZnRlcik7CisgICAgbV9ydW4yID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlckdyb3VwcygiY2c2LTEiKQorICBwdWJsaWMgdm9pZCBhZnRlcigpIHsKKyAgICBsb2coImFmdGVyIik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9ydW4xKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1bjIpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtX2FmdGVyKTsKKyAgICBtX2FmdGVyID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9IHsgImNnNi0xIiB9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgbG9nKCJ2ZXJpZnkiKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1bjEsICJydW4xKCkgd2Fzbid0IHJ1biIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fcnVuMiwgInJ1bjIoKSB3YXNuJ3QgcnVuIik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9hZnRlciwgImFmdGVyMSgpIHdhc24ndCBydW4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgeworICAgIHBwcChzdHJpbmcpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ29uZmlndXJhdGlvbkdyb3VwczRTYW1wbGVUZXN0XSAiICsgcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM3U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczdTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4ZTAzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM3U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uR3JvdXBzN1NhbXBsZVRlc3QgeworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX2xvZyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICBAQmVmb3JlR3JvdXBzKHsiQSJ9KQorICAgcHJpdmF0ZSB2b2lkIGluaXRBKCkgeworICAgICBtX2xvZy5hZGQoIjEiKTsKKyAgIH0KKworICAgQFRlc3QoZ3JvdXBzID0geyJBIn0pCisgICBwdWJsaWMgdm9pZCB0ZXN0U29tZXRoaW5nKCkgeworICAgICBtX2xvZy5hZGQoIjIiKTsKKyAgIH0KKworICAgQFRlc3QoZ3JvdXBzID0geyJBIn0pCisgICBwdWJsaWMgdm9pZCB0ZXN0U29tZXRoaW5nTW9yZSgpIHsKKyAgICAgbV9sb2cuYWRkKCIyIik7CisgICB9CisKKyAgIEBBZnRlckdyb3Vwcyh7IkEifSkKKyAgIHByaXZhdGUgdm9pZCBjbGVhblVwQSgpIHsKKyAgICAgbV9sb2cuYWRkKCIzIik7CisgICB9CisKKyAgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9ICJBIikKKyAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMiIsICIzIn0pLCBtX2xvZyk7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM4U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkdyb3VwczhTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwNDljMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Hcm91cHM4U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUnVuIHdpdGggZ3JvdXAgIkEiIGFuZCAiQiIKKyAqIE1ha2Ugc3VyZSB0aGF0IG9ubHkgbWV0aG9kcyBhbmQgY29uZmlndXJhdGlvbnMgYmVsb25naW5nIHRvIHRoYXQgZ3JvdXAKKyAqIGdldCBpbnZva2VkLgorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKiBAZGF0ZSBNYXIgOSwgMjAwNgorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkdyb3VwczhTYW1wbGVUZXN0IHsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbV9sb2cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkdW1teSgpIHsKKyAgICBtX2xvZy5hZGQoInNob3VsZCBub3QgYmUgaW52b2tlZCIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiQSIgfSkKKyAgcHVibGljIHZvaWQgdGVzdFNvbWV0aGluZygpIHsKKyAgICBtX2xvZy5hZGQoIjEiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgIkEiIH0pCisgIHB1YmxpYyB2b2lkIHRlc3RTb21ldGhpbmdNb3JlKCkgeworICAgIG1fbG9nLmFkZCgiMSIpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHByaXZhdGUgdm9pZCBjbGVhblVwRHVtbXkoKSB7CisgICAgbV9sb2cuYWRkKCJzaG91bGQgbm90IGJlIGludm9rZWQiKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZChncm91cHMgPSAiQSIpCisgIHByaXZhdGUgdm9pZCBjbGVhblVwQSgpIHsKKyAgICBtX2xvZy5hZGQoImEiKTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9ICJBIiwgZ3JvdXBzID0gIkIiKQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICIxIiwgImEiLCAiMSIsICJhIiB9KSwKKyAgICAgICAgbV9sb2cpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Jbmhlcml0R3JvdXBzU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkluaGVyaXRHcm91cHNTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZDg3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Jbmhlcml0R3JvdXBzU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHMgPSB7ICJncm91cDEiIH0pCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkluaGVyaXRHcm91cHNTYW1wbGVUZXN0IHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fb2sgPSBmYWxzZTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIG1fb2sgPSB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9vayk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQ29uZmlndXJhdGlvbkluaGVyaXRHcm91cHNTYW1wbGVUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JjM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkxpc3RlbmVyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkxpc3RlbmVyU2FtcGxlVGVzdC5NeVRMQTsKKworQExpc3RlbmVycyhNeVRMQS5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTGlzdGVuZXJTYW1wbGVUZXN0IHsKKyAgc3RhdGljIGJvb2xlYW4gbV9wYXNzZWQgPSBmYWxzZTsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VExBIGV4dGVuZHMgVGVzdExpc3RlbmVyQWRhcHRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uRmFpbHVyZShJVGVzdFJlc3VsdCBpdHIpIHsKKyAgICAgIG1fcGFzc2VkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgbV9wYXNzZWQgPSBmYWxzZTsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTGlzdGVuZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZjVkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTGlzdGVuZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RlbmVyU2hvdWxkQmVDYWxsZWQoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShDb25maWd1cmF0aW9uTGlzdGVuZXJTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQ29uZmlndXJhdGlvbkxpc3RlbmVyU2FtcGxlVGVzdC5tX3Bhc3NlZCk7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKENvbmZpZ3VyYXRpb25MaXN0ZW5lclNhbXBsZVRlc3QubV9wYXNzZWQpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QzNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUZXN0IEBDb25maWd1cmF0aW9uCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25UZXN0IHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlU3VpdGUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWZ0ZXJTdWl0ZSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9iZWZvcmVDbGFzcyA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9hZnRlckNsYXNzID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX2JlZm9yZU1ldGhvZCAgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYWZ0ZXJNZXRob2QgPSBmYWxzZTsKKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGUoKSB7CisgICAgcHBwKCJAQEBAIEJFRk9SRV9TVUlURSIpOworICAgIGFzc2VydCAhIG1fYWZ0ZXJTdWl0ZSA6ICJhZnRlclN1aXRlIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9iZWZvcmVDbGFzcyA6ICJiZWZvcmVDbGFzcyBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJDbGFzcyA6ICJhZnRlckNsYXNzIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9iZWZvcmVNZXRob2Q6ICJiZWZvcmVNZXRob2Qgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyTWV0aG9kOiAiYWZ0ZXJNZXRob2Qgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBtX2JlZm9yZVN1aXRlID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKKyAgICBwcHAoIkBAQEAgQkVGT1JFX0NMQVNTIik7CisgICAgYXNzZXJ0IG1fYmVmb3JlU3VpdGUgOiAiYmVmb3JlU3VpdGUgc2hvdWxkIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyU3VpdGUgOiAiYWZ0ZXJTdWl0ZSBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYmVmb3JlQ2xhc3MgOiAiYmVmb3JlQ2xhc3Mgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyQ2xhc3MgOiAiYWZ0ZXJDbGFzcyBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYmVmb3JlTWV0aG9kOiAiYmVmb3JlTWV0aG9kIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9hZnRlck1ldGhvZDogImFmdGVyTWV0aG9kIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgbV9iZWZvcmVDbGFzcyA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHsKKyAgICBwcHAoIkBAQEAgQkVGT1JFX01FVEhPRCIpOworICAgIGFzc2VydCBtX2JlZm9yZVN1aXRlIDogImJlZm9yZVN1aXRlIHNob3VsZCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0IG1fYmVmb3JlQ2xhc3MgOiAiYmVmb3JlQ2xhc3MgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJTdWl0ZSA6ICJhZnRlclN1aXRlIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9hZnRlckNsYXNzIDogImFmdGVyQ2xhc3Mgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2JlZm9yZU1ldGhvZDogImJlZm9yZU1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJNZXRob2Q6ICJhZnRlck1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIG1fYmVmb3JlTWV0aG9kID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZCgpIHsKKyAgICBwcHAoIkBAQEAgQUZURVJfTUVUSE9EIik7CisgICAgYXNzZXJ0IG1fYmVmb3JlU3VpdGUgOiAiYmVmb3JlU3VpdGUgc2hvdWxkIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgbV9iZWZvcmVDbGFzcyA6ICJiZWZvcmVDbGFzcyBoYXZlIHJ1biI7CisgICAgYXNzZXJ0IG1fYmVmb3JlTWV0aG9kOiAiYmVmb3JlTWV0aG9kIHNob3VsZCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9hZnRlclN1aXRlIDogImFmdGVyU3VpdGUgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyQ2xhc3MgOiAiYWZ0ZXJDbGFzcyBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJNZXRob2Q6ICJhZnRlck1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIG1fYWZ0ZXJNZXRob2QgPSB0cnVlOworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzcygpIHsKKyAgICBwcHAoIkBAQEAgQUZURVJfQ0xBU1MiKTsKKyAgICBhc3NlcnQgbV9iZWZvcmVTdWl0ZSA6ICJiZWZvcmVTdWl0ZSBzaG91bGQgaGF2ZSBydW4iOworICAgIGFzc2VydCBtX2JlZm9yZUNsYXNzIDogImJlZm9yZUNsYXNzIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgbV9iZWZvcmVNZXRob2Q6ICJiZWZvcmVNZXRob2Qgc2hvdWxkIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgbV9hZnRlck1ldGhvZDogImFmdGVyTWV0aG9kIHNob3VsZCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9hZnRlckNsYXNzIDogImFmdGVyQ2xhc3Mgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyU3VpdGUgOiAiYWZ0ZXJTdWl0ZSBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIG1fYWZ0ZXJDbGFzcyA9IHRydWU7CisgIH0KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlKCkgeworICAgIHBwcCgiQEBAQCBBRlRFUl9TVUlURSIpOworICAgIHBwcChtX2JlZm9yZVN1aXRlICsgIiAiICsgbV9iZWZvcmVDbGFzcyArICIgIiArIG1fYmVmb3JlTWV0aG9kCisgICAgICAgICsgIiAiICsgbV9hZnRlck1ldGhvZCArICIgIiArIG1fYWZ0ZXJDbGFzcyArICIgIiArIG1fYWZ0ZXJTdWl0ZSk7CisgICAgYXNzZXJ0IG1fYmVmb3JlU3VpdGUgOiAiYmVmb3JlU3VpdGUgc2hvdWxkIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgbV9iZWZvcmVDbGFzcyA6ICJiZWZvcmVDbGFzcyBoYXZlIHJ1biI7CisgICAgYXNzZXJ0IG1fYmVmb3JlTWV0aG9kOiAiYmVmb3JlTWV0aG9kIHNob3VsZCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0IG1fYWZ0ZXJNZXRob2Q6ICJhZnRlck1ldGhvZCBzaG91bGQgaGF2ZSBydW4iOworICAgIGFzc2VydCBtX2FmdGVyQ2xhc3MgOiAiYWZ0ZXJDbGFzcyBzaG91bGQgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJTdWl0ZSA6ICJhZnRlclN1aXRlIHNob3VsZG4ndCBoYXZlIHJ1biI7CisgICAgbV9hZnRlclN1aXRlID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBwcHAoIkBAQEAgVkVSSUZZIik7CisgICAgYXNzZXJ0IG1fYmVmb3JlU3VpdGUgOiAiYmVmb3JlU3VpdGUgc2hvdWxkIGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgbV9iZWZvcmVDbGFzcyA6ICJiZWZvcmVDbGFzcyBoYXZlIHJ1biI7CisgICAgYXNzZXJ0IG1fYmVmb3JlTWV0aG9kOiAiYmVmb3JlTWV0aG9kIHNob3VsZCBoYXZlIHJ1biI7CisgICAgYXNzZXJ0ICEgbV9hZnRlclN1aXRlIDogImFmdGVyU3VpdGUgc2hvdWxkbid0IGhhdmUgcnVuIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyQ2xhc3MgOiAiYWZ0ZXJDbGFzcyBzaG91bGRuJ3QgaGF2ZSBydW4iOworICAgIGFzc2VydCAhIG1fYWZ0ZXJNZXRob2Q6ICJhZnRlck1ldGhvZCBzaG91bGRuJ3QgaGF2ZSBydW4iOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0NvbmZpZ3VyYXRpb25UZXN0XSAiICsgcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25XaXRoUGFyYW1ldGVycy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbldpdGhQYXJhbWV0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlM2M3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25XaXRoUGFyYW1ldGVycy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uV2l0aFBhcmFtZXRlcnMgeworICBwcml2YXRlIFN0cmluZyBtX3BhcmFtOworCisgIEBQYXJhbWV0ZXJzKHsgInBhcmFtIiB9KQorICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SW5pdChTdHJpbmcgcGFyYW0pIHsKKyAgICBtX3BhcmFtID0gcGFyYW07CisgIH0KKworICBAUGFyYW1ldGVycyh7ICJwYXJhbSIgfSkKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChTdHJpbmcgcGFyYW0pIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG1fcGFyYW0sIHBhcmFtKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9FeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vRXh0ZXJuYWxDb25maWd1cmF0aW9uQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJlYzllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vRXh0ZXJuYWxDb25maWd1cmF0aW9uQ2xhc3MuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKKworCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxDb25maWd1cmF0aW9uQ2xhc3MgeworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc19hZnRlck1ldGhvZDsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHNfYWZ0ZXJDbGFzczsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHNfYWZ0ZXJUZXN0OworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZSgpIHsKKyAgICBNZXRob2RDYWxsT3JkZXJUZXN0LnNfYmVmb3JlU3VpdGUgPSB0cnVlOworICB9CisKKyAgQEFmdGVyU3VpdGUKKyAgcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKKyAgICBzX2FmdGVyTWV0aG9kID0gZmFsc2U7CisgICAgc19hZnRlckNsYXNzID0gZmFsc2U7CisgICAgc19hZnRlclRlc3QgPSBmYWxzZTsKKyAgfQorCisgIEBCZWZvcmVUZXN0CisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisgICAgYXNzZXJ0VHJ1ZShNZXRob2RDYWxsT3JkZXJUZXN0LnNfYmVmb3JlU3VpdGUpOworICAgIGFzc2VydEZhbHNlKE1ldGhvZENhbGxPcmRlclRlc3Quc19iZWZvcmVUZXN0KTsKKyAgICBhc3NlcnRGYWxzZShNZXRob2RDYWxsT3JkZXJUZXN0LnNfYmVmb3JlQ2xhc3MpOworICAgIGFzc2VydEZhbHNlKE1ldGhvZENhbGxPcmRlclRlc3Quc19iZWZvcmVNZXRob2QpOworCisgICAgTWV0aG9kQ2FsbE9yZGVyVGVzdC5zX2JlZm9yZVRlc3QgPSB0cnVlOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgYXNzZXJ0VHJ1ZShzX2FmdGVyTWV0aG9kLCAiYWZ0ZXJUZXN0TWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gcnVuIik7CisgICAgYXNzZXJ0VHJ1ZShzX2FmdGVyQ2xhc3MsICJhZnRlclRlc3RDbGFzcyBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICAgIGFzc2VydEZhbHNlKHNfYWZ0ZXJUZXN0LCAiYWZ0ZXJUZXN0IHNob3VsZCBoYXZlbid0IGJlZW4gcnVuIik7CisgICAgc19hZnRlclRlc3QgPSB0cnVlOworICB9CisKKyAgQEFmdGVyU3VpdGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZSgpIHsKKyAgICBhc3NlcnRUcnVlKHNfYWZ0ZXJNZXRob2QsICJhZnRlclRlc3RNZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBydW4iKTsKKyAgICBhc3NlcnRUcnVlKHNfYWZ0ZXJDbGFzcywgImFmdGVyVGVzdENsYXNzIHNob3VsZCBoYXZlIGJlZW4gcnVuIik7CisgICAgYXNzZXJ0VHJ1ZShzX2FmdGVyVGVzdCwgImFmdGVyVGVzdCBzaG91bGQgaGF2ZSBiZWVuIHJ1biIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Hcm91cHNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9Hcm91cHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5NjE2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL0dyb3Vwc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cHNUZXN0IHsKKworICBwcml2YXRlIFRlc3RORyBtX3Rlc3ROZzsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIG1fdGVzdE5nID0gbmV3IFRlc3RORygpOworICAgIG1fdGVzdE5nLnNldFZlcmJvc2UoMCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEYXRhUHJvdmlkZXJBZnRlckdyb3VwcygpIHsKKyAgICBydW5UZXN0KENvbmZpZ3VyYXRpb25Hcm91cERhdGFQcm92aWRlclNhbXBsZVRlc3QuY2xhc3MsCisgICAgICAgIENvbmZpZ3VyYXRpb25Hcm91cERhdGFQcm92aWRlclNhbXBsZVRlc3QubV9saXN0LAorICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBJbnRlZ2VyW10geworICAgICAgICAgICAgMSwgMiwgMiwgMiwgMworICAgICAgfSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5UGFyYW1ldGVyc0FmdGVyR3JvdXBzKCkgeworICAgIHJ1blRlc3QoQ29uZmlndXJhdGlvbkdyb3VwSW52b2NhdGlvbkNvdW50U2FtcGxlVGVzdC5jbGFzcywKKyAgICAgICAgQ29uZmlndXJhdGlvbkdyb3VwSW52b2NhdGlvbkNvdW50U2FtcGxlVGVzdC5tX2xpc3QsCisgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IEludGVnZXJbXSB7CisgICAgICAgICAgICAxLCAyLCAyLCAyLCAzCisgICAgICB9KSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlCb3RoQWZ0ZXJHcm91cHMoKSB7CisgICAgcnVuVGVzdChDb25maWd1cmF0aW9uR3JvdXBCb3RoU2FtcGxlVGVzdC5jbGFzcywKKyAgICAgICAgQ29uZmlndXJhdGlvbkdyb3VwQm90aFNhbXBsZVRlc3QubV9saXN0LAorICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBJbnRlZ2VyW10geworICAgICAgICAgIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMKKyAgICAgIH0pKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KENsYXNzIGNscywgTGlzdDxJbnRlZ2VyPiBsaXN0LCBMaXN0PEludGVnZXI+IGV4cGVjdGVkKSB7CisgICAgICBtX3Rlc3ROZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7CisgICAgICAgICAgY2xzCisgICAgICB9KTsKKyAgICAgIG1fdGVzdE5nLnJ1bigpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsaXN0LCBleHBlY3RlZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL01ldGhvZENhbGxPcmRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL01ldGhvZENhbGxPcmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNhOTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ2FsbE9yZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgTWV0aG9kQ2FsbE9yZGVyVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzX2JlZm9yZVN1aXRlOworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc19iZWZvcmVUZXN0OworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc19iZWZvcmVDbGFzczsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHNfYmVmb3JlTWV0aG9kOworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVDbGFzcygpIHsKKyAgICBhc3NlcnRUcnVlKHNfYmVmb3JlU3VpdGUpOworICAgIGFzc2VydFRydWUoc19iZWZvcmVUZXN0KTsKKyAgICBhc3NlcnRGYWxzZShzX2JlZm9yZUNsYXNzKTsKKyAgICBhc3NlcnRGYWxzZShzX2JlZm9yZU1ldGhvZCk7CisKKyAgICBzX2JlZm9yZUNsYXNzID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlclN1aXRlCisgIHB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CisgICAgc19iZWZvcmVTdWl0ZSA9IGZhbHNlOworICAgIHNfYmVmb3JlVGVzdCA9IGZhbHNlOworICAgIHNfYmVmb3JlQ2xhc3MgPSBmYWxzZTsKKyAgICBzX2JlZm9yZU1ldGhvZCA9IGZhbHNlOworICB9CisKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHsKKyAgICBhc3NlcnRUcnVlKHNfYmVmb3JlU3VpdGUpOworICAgIGFzc2VydFRydWUoc19iZWZvcmVUZXN0KTsKKyAgICBhc3NlcnRUcnVlKHNfYmVmb3JlQ2xhc3MpOworICAgIGFzc2VydEZhbHNlKHNfYmVmb3JlTWV0aG9kKTsKKyAgICBzX2JlZm9yZU1ldGhvZCA9IHRydWU7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCByZWFsVGVzdCgpIHsKKyAgICBhc3NlcnRUcnVlKHNfYmVmb3JlU3VpdGUpOworICAgIGFzc2VydFRydWUoc19iZWZvcmVUZXN0KTsKKyAgICBhc3NlcnRUcnVlKHNfYmVmb3JlQ2xhc3MpOworICAgIGFzc2VydFRydWUoc19iZWZvcmVNZXRob2QpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFmdGVyTWV0aG9kKCkgeworICAgIGFzc2VydEZhbHNlKEV4dGVybmFsQ29uZmlndXJhdGlvbkNsYXNzLnNfYWZ0ZXJNZXRob2QsICJhZnRlclRlc3RNZXRob2Qgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4iKTsKKyAgICBhc3NlcnRGYWxzZShFeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcy5zX2FmdGVyQ2xhc3MsICJhZnRlclRlc3RDbGFzcyBzaG91bGRuJ3QgaGF2ZSBiZWVuIHJ1biIpOworICAgIGFzc2VydEZhbHNlKEV4dGVybmFsQ29uZmlndXJhdGlvbkNsYXNzLnNfYWZ0ZXJUZXN0LCAiYWZ0ZXJUZXN0IHNob3VsZCBoYXZlbid0IGJlZW4gcnVuIik7CisKKyAgICBFeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcy5zX2FmdGVyTWV0aG9kID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIGFmdGVyQ2xhc3MoKSB7CisgICAgYXNzZXJ0VHJ1ZShFeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcy5zX2FmdGVyTWV0aG9kLCAiYWZ0ZXJUZXN0TWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gcnVuIik7CisgICAgYXNzZXJ0RmFsc2UoRXh0ZXJuYWxDb25maWd1cmF0aW9uQ2xhc3Muc19hZnRlckNsYXNzLCAiYWZ0ZXJUZXN0Q2xhc3Mgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4iKTsKKyAgICBhc3NlcnRGYWxzZShFeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcy5zX2FmdGVyVGVzdCwgImFmdGVyVGVzdCBzaG91bGQgaGF2ZW4ndCBiZWVuIHJ1biIpOworICAgIEV4dGVybmFsQ29uZmlndXJhdGlvbkNsYXNzLnNfYWZ0ZXJDbGFzcyA9IHRydWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL011bHRpcGxlQmVmb3JlR3JvdXBUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9NdWx0aXBsZUJlZm9yZUdyb3VwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9NdWx0aXBsZUJlZm9yZUdyb3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitAVGVzdCggZ3JvdXBzID0gImZvbyIgKQ0KK3B1YmxpYyBjbGFzcyBNdWx0aXBsZUJlZm9yZUdyb3VwVGVzdCB7DQorICBwcml2YXRlIGludCBtX2NvdW50ID0gMDsNCisNCisgIEBCZWZvcmVHcm91cHMoICJmb28iICkNCisgIHB1YmxpYyB2b2lkIGJlZm9yZUdyb3VwcygpIHsNCisgICAgbV9jb3VudCsrOw0KKyAgfQ0KKw0KKyAgQFRlc3QoKQ0KKyAgcHVibGljIHZvaWQgdGVzdCgpIHsNCisgIH0NCisNCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdCIpDQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbV9jb3VudCk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL1JlZmxlY3RNZXRob2RQYXJhbWV0cml6ZWRDb25maWd1cmF0aW9uTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vUmVmbGVjdE1ldGhvZFBhcmFtZXRyaXplZENvbmZpZ3VyYXRpb25NZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViYTkzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL1JlZmxlY3RNZXRob2RQYXJhbWV0cml6ZWRDb25maWd1cmF0aW9uTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFJlZmxlY3RNZXRob2RQYXJhbWV0cml6ZWRDb25maWd1cmF0aW9uTWV0aG9kVGVzdCB7DQorICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbV9iZWZvcmU9IG5ldyBIYXNoTWFwPD4oKTsNCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtX2FmdGVyPSBuZXcgSGFzaE1hcDw+KCk7DQorDQorICBAQmVmb3JlTWV0aG9kDQorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2QoTWV0aG9kIHRvYmVJbnZva2VkVGVzdE1ldGhvZCkgew0KKyAgICBtX2JlZm9yZS5wdXQodG9iZUludm9rZWRUZXN0TWV0aG9kLmdldE5hbWUoKSwgdG9iZUludm9rZWRUZXN0TWV0aG9kLmdldE5hbWUoKSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7fQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkge30NCisNCisgIEBBZnRlck1ldGhvZA0KKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoTWV0aG9kIGludm9rZWRUZXN0TWV0aG9kKSB7DQorICAgIG1fYWZ0ZXIucHV0KGludm9rZWRUZXN0TWV0aG9kLmdldE5hbWUoKSwgaW52b2tlZFRlc3RNZXRob2QuZ2V0TmFtZSgpKTsNCisgIH0NCisNCisgIEBBZnRlckNsYXNzDQorICBwdWJsaWMgdm9pZCBhc3NlcnRCZWZvcmVBZnRlck1ldGhvZHNJbnZvY2F0aW9ucygpIHsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmUuY29udGFpbnNLZXkoInRlc3QxIiksICJAVGVzdCBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBwYXNzZWQgdG8gQEJlZm9yZU1ldGhvZCIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZS5jb250YWluc0tleSgidGVzdDIiKSwgIkBUZXN0IG1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIHBhc3NlZCB0byBAQmVmb3JlTWV0aG9kIik7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYWZ0ZXIuY29udGFpbnNLZXkoInRlc3QxIiksICJAVGVzdCBtZXRob2Qgc2hvdWxkIGhhdmUgYmVlbiBwYXNzZWQgdG8gQEFmdGVyTWV0aG9kIik7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlLmNvbnRhaW5zS2V5KCJ0ZXN0MiIpLCAiQFRlc3QgbWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gcGFzc2VkIHRvIEBBZnRlck1ldGhvZCIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TaW5nbGVDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU2luZ2xlQ29uZmlndXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZiNzFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU2luZ2xlQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJUZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IEBCZWZvcmVUZXN0IGlzIG9ubHkgY2FsbGVkIG9uY2UgaWYgYSBmYWN0b3J5IGlzIHVzZWQKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCA8Y2VkcmljQGJldXN0LmNvbT4KKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUNvbmZpZ3VyYXRpb25UZXN0IHsKKworICBwcml2YXRlIHN0YXRpYyBpbnQgbV9iZWZvcmU7CisKKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIFNpbmdsZUNvbmZpZ3VyYXRpb25UZXN0KGludCBuKSB7CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyA0MiB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyA0MyB9LAorICAgIH07CisgIH0KKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBidCgpIHsKKyAgICBtX2JlZm9yZSsrOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9iZWZvcmUsIDEpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uL1N1aXRlRmFjdG9yeU9uY2VTYW1wbGUxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMWU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMVRlc3QuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFN1aXRlRmFjdG9yeU9uY2VTYW1wbGUxVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgaW50IG1fYmVmb3JlID0gMDsKKyAgcHVibGljIHN0YXRpYyBpbnQgbV9hZnRlciA9IDA7CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGJzKCkgeworICAgIG1fYmVmb3JlKys7CisgIH0KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBhcygpIHsKKyAgICBtX2FmdGVyKys7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBnMSgpIHsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVGYWN0b3J5T25jZVNhbXBsZTJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJmNzdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVGYWN0b3J5T25jZVNhbXBsZTJUZXN0LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBTdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMlRlc3QgeworCisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBmYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBuZXcgU3VpdGVGYWN0b3J5T25jZVNhbXBsZTFUZXN0KCksIG5ldyBTdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMVRlc3QoKSB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TdWl0ZUZhY3RvcnlPbmNlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVGYWN0b3J5T25jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRmMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVGYWN0b3J5T25jZVRlc3QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGNsYXNzIFN1aXRlRmFjdG9yeU9uY2VUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN1aXRlTWV0aG9kc1Nob3VsZE9ubHlSdW5PbmNlKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU3VpdGVGYWN0b3J5T25jZVNhbXBsZTJUZXN0LmNsYXNzKTsKKyAgICBTdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMVRlc3QubV9iZWZvcmUgPSAwOworICAgIFN1aXRlRmFjdG9yeU9uY2VTYW1wbGUxVGVzdC5tX2FmdGVyID0gMDsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFN1aXRlRmFjdG9yeU9uY2VTYW1wbGUxVGVzdC5tX2JlZm9yZSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTdWl0ZUZhY3RvcnlPbmNlU2FtcGxlMVRlc3QubV9hZnRlcik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9TdWl0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDcwYjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vU3VpdGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitwdWJsaWMgY2xhc3MgU3VpdGVUZXN0IGV4dGVuZHMgQmFzZVN1aXRlVGVzdCB7DQorICBAQmVmb3JlU3VpdGUoZGVwZW5kc09uTWV0aG9kcz17ImJlZm9yZVN1aXRlUGFyZW50In0pDQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZUNoaWxkKCl7DQorICAgIG1fb3JkZXIuYWRkKDIpOw0KKyAgfQ0KKw0KKy8vICBAQWZ0ZXJTdWl0ZShkZXBlbmRzT25NZXRob2RzPXsiYWZ0ZXJTdWl0ZVBhcmVudCJ9KQ0KKy8vICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlQ2hpbGQoKXsNCisvLyAgICBtX29yZGVyLmFkZCg0KTsNCisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFGVEVSIFNVSVRFIENISUxEIik7DQorLy8gIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpew0KKyAgICBtX29yZGVyLmFkZCgzKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vVmVyaWZ5U3VpdGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbi9WZXJpZnlTdWl0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg3M2NjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb24vVmVyaWZ5U3VpdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb247DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQorDQorcHVibGljIGNsYXNzIFZlcmlmeVN1aXRlVGVzdCB7DQorDQorICBAQWZ0ZXJTdWl0ZQ0KKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgew0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMSwgMiwgMyksIFN1aXRlVGVzdC5tX29yZGVyKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0NsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZhM2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0NsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZCB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIHNldHVwQ2xhc3NGYWlscygpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggInNldHVwIGNsYXNzIGZhaWwiICk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldHVwTWV0aG9kKCkgeworCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwZGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9DbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0dXBTaG91bGRGYWlsKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsaW5nIGluIHNldFVwIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0NsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlSW52b2NhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUxZWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0NsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlSW52b2NhdGlvbnMuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2RBbmRNdWx0aXBsZUludm9jYXRpb25zIHsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldHVwU2hvdWxkRmFpbCgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGluZyBpbiBzZXRVcCIpOworICB9CisKKyAgQERhdGFQcm92aWRlciggbmFtZSA9ICJkYXRhLnByb3ZpZGVyIiApCisgIHB1YmxpYyBPYmplY3RbXVtdIGRhdGFQcm92aWRlcigpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAiZGF0YTEiIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJkYXRhMiIgfQorICAgIH07CisgIH0KKyAgCisgIEBUZXN0KCBkYXRhUHJvdmlkZXIgPSAiZGF0YS5wcm92aWRlciIgKQorICBwdWJsaWMgdm9pZCB0ZXN0MSggU3RyaW5nIHMgKSB7CisKKyAgfQorICAKKyAgQFRlc3QoIGludm9jYXRpb25Db3VudCA9IDIgKQorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0NsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlVGVzdHMuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9DbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2RBbmRNdWx0aXBsZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlM2YzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9DbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2RBbmRNdWx0aXBsZVRlc3RzLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LmNvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVUZXN0cyB7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXR1cFNob3VsZEZhaWwoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxpbmcgaW4gc2V0VXAiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoU2tpcHBpbmdCZWZvcmVNZXRob2QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9DbGFzc1dpdGhTa2lwcGluZ0JlZm9yZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZWFkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvQ2xhc3NXaXRoU2tpcHBpbmdCZWZvcmVNZXRob2QuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLlNraXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaXRoU2tpcHBpbmdCZWZvcmVNZXRob2QgeworCisgIHByaXZhdGUgaW50IGludm9jYXRpb25zID0gMDsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHsKKyAgICAgIGludm9jYXRpb25zKys7CisgICAgICBpZiAoaW52b2NhdGlvbnMgPT0yKSB7CisgICAgICAgIHRocm93IG5ldyBTa2lwRXhjZXB0aW9uKCJza2lwcGluZyIpOworICAgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7fQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9FeHRlbmRzQ2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9FeHRlbmRzQ2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQyMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0V4dGVuZHNDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEV4dGVuZHNDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZCBleHRlbmRzIENsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgLy8gc2hvdWxkIGJlIHNraXBwZWQsIGJ1dCBCZWZvcmVDbGFzcyBtZXRob2QgYXR0ZW1wdGVkIGFnYWluCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9FeHRlbmRzQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvRXh0ZW5kc0NsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWM2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvRXh0ZW5kc0NsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEV4dGVuZHNDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QgZXh0ZW5kcyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0dXBFeHRlbnNpb24oKSB7CisKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M1M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0ZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZCBleHRlbmRzIENsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kIHsKKyAgQEZhY3RvcnkKKyAgcHVibGljIE9iamVjdFtdIGNyZWF0ZVRlc3RzKCkgeworICAgIE9iamVjdFtdIGluc3RhbmNlcyA9IG5ldyBPYmplY3RbMl07CisgICAgaW5zdGFuY2VzWzBdID0gbmV3IEZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZCgpOworICAgIGluc3RhbmNlc1sxXSA9IG5ldyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QoKTsKKyAgICByZXR1cm4gaW5zdGFuY2VzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kvRmFjdG9yeUNsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0ZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ1ODJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0ZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kIGV4dGVuZHMgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kIHsKKyAgQEZhY3RvcnkKKyAgcHVibGljIE9iamVjdFtdIGNyZWF0ZVRlc3RzKCkgeworICAgIE9iamVjdFtdIGluc3RhbmNlcyA9IG5ldyBPYmplY3RbMl07CisgICAgaW5zdGFuY2VzWzBdID0gbmV3IEZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2QoKTsKKyAgICBpbnN0YW5jZXNbMV0gPSBuZXcgRmFjdG9yeUNsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZCgpOworICAgIHJldHVybiBpbnN0YW5jZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0ZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2RBbmRNdWx0aXBsZUludm9jYXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhZjc2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEZhY3RvcnlDbGFzc1dpdGhGYWlsZWRCZWZvcmVNZXRob2RBbmRNdWx0aXBsZUludm9jYXRpb25zIGV4dGVuZHMgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucyB7CisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGVUZXN0cygpIHsKKyAgICBPYmplY3RbXSBpbnN0YW5jZXMgPSBuZXcgT2JqZWN0WzJdOworICAgIGluc3RhbmNlc1swXSA9IG5ldyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucygpOworICAgIGluc3RhbmNlc1sxXSA9IG5ldyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVJbnZvY2F0aW9ucygpOworICAgIHJldHVybiBpbnN0YW5jZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWlsdXJlUG9saWN5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5L0ZhaWx1cmVQb2xpY3lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlYmRkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS9GYWlsdXJlUG9saWN5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlIHRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3k7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdGhlbHBlci5PdXRwdXREaXJlY3RvcnlQYXRjaDsKKworcHVibGljIGNsYXNzIEZhaWx1cmVQb2xpY3lUZXN0IHsKKworICAvLyBvbmx5IGlmIHRoaXMgaXMgcnVuIGZyb20gYW4geG1sIGZpbGUgdGhhdCBzZXRzIHRoaXMgb24gdGhlIHN1aXRlCisgIEBCZWZvcmVDbGFzcyhlbmFibGVkPWZhbHNlKQorICBwdWJsaWMgdm9pZCBzZXR1cENsYXNzKCBJVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsKKyAgICBhc3NlcnRFcXVhbHModGVzdENvbnRleHQuZ2V0U3VpdGUoKS5nZXRYbWxTdWl0ZSgpLmdldENvbmZpZ0ZhaWx1cmVQb2xpY3koKSwgWG1sU3VpdGUuQ09OVElOVUUpOworICB9CisKKyAgQERhdGFQcm92aWRlciggbmFtZT0iZHAiICkKKyAgcHVibGljIE9iamVjdFtdW10gZ2V0RGF0YSgpIHsKKyAgICBPYmplY3RbXVtdIGRhdGEgPSBuZXcgT2JqZWN0W11bXSB7CisgICAgICAvLyBwYXJhbXMgLSBjb25mRmFpbCwgY29uZlNraXAsIHNraXBlZFRlc3RzCisgICAgICBuZXcgT2JqZWN0W10geyBuZXcgQ2xhc3NbXSB7IENsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kLmNsYXNzIH0sIDEsIDEsIDEgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBDbGFzc1tdIHsgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVUZXN0cy5jbGFzcyB9LCAyLCAwLCAyIH0sCisgICAgICBuZXcgT2JqZWN0W10geyBuZXcgQ2xhc3NbXSB7IENsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlSW52b2NhdGlvbnMuY2xhc3MgfSwgNCwgMCwgNCB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IENsYXNzW10geyBFeHRlbmRzQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kLmNsYXNzIH0sIDIsIDIsIDIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBDbGFzc1tdIHsgQ2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuY2xhc3MgfSwgMSwgMSwgMSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IENsYXNzW10geyBFeHRlbmRzQ2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuY2xhc3MgfSwgMSwgMiwgMiB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IENsYXNzW10geyBDbGFzc1dpdGhGYWlsZWRCZWZvcmVDbGFzc01ldGhvZC5jbGFzcywgRXh0ZW5kc0NsYXNzV2l0aEZhaWxlZEJlZm9yZUNsYXNzTWV0aG9kLmNsYXNzIH0sIDIsIDMsIDMgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBDbGFzc1tdIHsgQ2xhc3NXaXRoU2tpcHBpbmdCZWZvcmVNZXRob2QuY2xhc3MgfSwgMCwgMSwgMSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IENsYXNzW10geyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kLmNsYXNzIH0sIDIsIDAsIDIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBDbGFzc1tdIHsgRmFjdG9yeUNsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlSW52b2NhdGlvbnMuY2xhc3MgfSwgOCwgMCwgOCB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IENsYXNzW10geyBGYWN0b3J5Q2xhc3NXaXRoRmFpbGVkQmVmb3JlQ2xhc3NNZXRob2QuY2xhc3MgfSwgMiwgMiwgMiB9LAorICAgIH07CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBAVGVzdCggZGF0YVByb3ZpZGVyID0gImRwIiApCisgIHB1YmxpYyB2b2lkIGNvbmZGYWlsdXJlVGVzdChDbGFzc1tdIGNsYXNzZXNVbmRlclRlc3QsIGludCBjb25maWd1cmF0aW9uRmFpbHVyZXMsIGludCBjb25maWd1cmF0aW9uU2tpcHMsIGludCBza2lwcGVkVGVzdHMpIHsKKworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcgdGVzdG5nID0gbmV3IFRlc3RORygpOworICAgIHRlc3RuZy5zZXRPdXRwdXREaXJlY3RvcnkoT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOworICAgIHRlc3RuZy5zZXRUZXN0Q2xhc3NlcyhjbGFzc2VzVW5kZXJUZXN0KTsKKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0ZXN0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICB0ZXN0bmcuc2V0Q29uZmlnRmFpbHVyZVBvbGljeShYbWxTdWl0ZS5DT05USU5VRSk7CisgICAgdGVzdG5nLnJ1bigpOworCisgICAgdmVyaWZ5KHRsYSwgY29uZmlndXJhdGlvbkZhaWx1cmVzLCBjb25maWd1cmF0aW9uU2tpcHMsIHNraXBwZWRUZXN0cyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjb21tYW5kTGluZVRlc3RfcG9saWN5QXNTa2lwKCkgeworICAgIFN0cmluZ1tdIGFyZ3YgPSBuZXcgU3RyaW5nW10geyAiLWxvZyIsICIwIiwgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAgICAgICAiLWNvbmZpZ2ZhaWx1cmVwb2xpY3kiLCAic2tpcCIsCisgICAgICAgICAgICAiLXRlc3RjbGFzcyIsICJ0ZXN0LmNvbmZpZ3VyYXRpb25mYWlsdXJlcG9saWN5LkNsYXNzV2l0aEZhaWxlZEJlZm9yZU1ldGhvZEFuZE11bHRpcGxlVGVzdHMiIH07CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORy5wcml2YXRlTWFpbihhcmd2LCB0bGEpOworCisgICAgdmVyaWZ5KHRsYSwgMSwgMSwgMik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjb21tYW5kTGluZVRlc3RfcG9saWN5QXNDb250aW51ZSgpIHsKKyAgICBTdHJpbmdbXSBhcmd2ID0gbmV3IFN0cmluZ1tdIHsgIi1sb2ciLCAiMCIsICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgICAgICAgIi1jb25maWdmYWlsdXJlcG9saWN5IiwgImNvbnRpbnVlIiwKKyAgICAgICAgICAgICItdGVzdGNsYXNzIiwgInRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kuQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVUZXN0cyIgfTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HLnByaXZhdGVNYWluKGFyZ3YsIHRsYSk7CisKKyAgICB2ZXJpZnkodGxhLCAyLCAwLCAyKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lVGVzdFdpdGhYTUxGaWxlX3BvbGljeUFzU2tpcCgpIHsKKyAgICBTdHJpbmdbXSBhcmd2ID0gbmV3IFN0cmluZ1tdIHsgIi1sb2ciLCAiMCIsICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgICAgICAgIi1jb25maWdmYWlsdXJlcG9saWN5IiwgInNraXAiLCAic3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1jb25maWdmYWlsdXJlLnhtbCIgfTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HLnByaXZhdGVNYWluKGFyZ3YsIHRsYSk7CisKKyAgICB2ZXJpZnkodGxhLCAxLCAxLCAyKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lVGVzdFdpdGhYTUxGaWxlX3BvbGljeUFzQ29udGludWUoKSB7CisgICAgU3RyaW5nW10gYXJndiA9IG5ldyBTdHJpbmdbXSB7ICItbG9nIiwgIjAiLCAiLWQiLCBPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICItY29uZmlnZmFpbHVyZXBvbGljeSIsICJjb250aW51ZSIsICJzcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLWNvbmZpZ2ZhaWx1cmUueG1sIiB9OworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJndiwgdGxhKTsKKworICAgIHZlcmlmeSh0bGEsIDIsIDAsIDIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZlcmlmeSggVGVzdExpc3RlbmVyQWRhcHRlciB0bGEsIGludCBjb25maWd1cmF0aW9uRmFpbHVyZXMsIGludCBjb25maWd1cmF0aW9uU2tpcHMsIGludCBza2lwcGVkVGVzdHMgKSB7CisgICAgICBhc3NlcnRFcXVhbHModGxhLmdldENvbmZpZ3VyYXRpb25GYWlsdXJlcygpLnNpemUoKSwgY29uZmlndXJhdGlvbkZhaWx1cmVzLCAid3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMiKTsKKyAgICAgIGFzc2VydEVxdWFscyh0bGEuZ2V0Q29uZmlndXJhdGlvblNraXBzKCkuc2l6ZSgpLCBjb25maWd1cmF0aW9uU2tpcHMsICJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBza2lwcyIpOworICAgICAgYXNzZXJ0RXF1YWxzKHRsYS5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCksIHNraXBwZWRUZXN0cywgIndyb25nIG51bWJlciBvZiBza2lwcGVkIHRlc3RzIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbnZlcnRlci9Db252ZXJ0ZXJTYW1wbGUxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY29udmVydGVyL0NvbnZlcnRlclNhbXBsZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA1OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2NvbnZlcnRlci9Db252ZXJ0ZXJTYW1wbGUxLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LmNvbnZlcnRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitwdWJsaWMgY2xhc3MgQ29udmVydGVyU2FtcGxlMSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2xhc3NKdW5pdCgpIHsKKyAgICB9CisKKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRDbGFzc0lkKCkgeworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTZXRDbGFzc05hbWUoKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL0Fic3RyYWN0R2VuZXJpY1Rlc3RzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL0Fic3RyYWN0R2VuZXJpY1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNzhjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9jeWNsaWMvQWJzdHJhY3RHZW5lcmljVGVzdHMuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuY3ljbGljOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHZW5lcmljVGVzdHMgZXh0ZW5kcyBCYXNlSW50ZWdyYXRpb25UZXN0IHsKKworICAgIEBUZXN0KGdyb3Vwcz0iaW50ZWdyYXRpb24iKQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTb21ldGhpbmcoKSB7CisgICAgICAgIC8vLi4uCisgICAgfQorCisgfQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL0Jhc2VJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9jeWNsaWMvQmFzZUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTViZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL0Jhc2VJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QuY3ljbGljOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJbnRlZ3JhdGlvblRlc3QgeworCisgICAgQEJlZm9yZUNsYXNzKGdyb3Vwcz0iaW50ZWdyYXRpb24iKQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRJbnRlZ3JhdGlvblRlc3RpbmcoKSB7CisgICAgICAgIC8vLi4uCisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzKGdyb3Vwcz0iaW50ZWdyYXRpb24iKQorICAgIHZvaWQgZXhlY3V0ZUJlZm9yZUNsYXNzRGJPcGVyYXRpb25zKCkgeworICAgICAgICAvLy4uLgorICAgIH0KKworIH0KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2N5Y2xpYy9IaWJlcm5hdGVDb25jcmV0ZVRlc3RzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL0hpYmVybmF0ZUNvbmNyZXRlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzAwMTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2N5Y2xpYy9IaWJlcm5hdGVDb25jcmV0ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LmN5Y2xpYzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEhpYmVybmF0ZUNvbmNyZXRlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEdlbmVyaWNUZXN0cyB7CisKKyAgICBAVGVzdChncm91cHM9ImludGVncmF0aW9uIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29tZXRoaW5nRWxzZSgpIHsKKyAgICAgICAgLy8uLi4KKyAgICB9CisKKyB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2N5Y2xpYy9Tb21lQ29uY3JldGVUZXN0cy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2N5Y2xpYy9Tb21lQ29uY3JldGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjdhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvY3ljbGljL1NvbWVDb25jcmV0ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LmN5Y2xpYzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNvbWVDb25jcmV0ZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RHZW5lcmljVGVzdHMgeworCisgICAgQFRlc3QoZ3JvdXBzPSJpbnRlZ3JhdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGVzdFNvbWV0aGluZ0Vsc2UoKSB7CisgICAgICAgIC8vLi4uCisgICAgfQorCisgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvQm9vbGVhblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvQm9vbGVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI5MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Cb29sZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCb29sZWFuVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX2ZhbHNlID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3RydWUgPSBmYWxzZTsKKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiYWxsQm9vbGVhbnMiKQorICBwdWJsaWMgdm9pZCBkb1N0dWZmKGJvb2xlYW4gdCkgeworICAgIGlmICh0KSB7CisgICAgICBtX3RydWUgPSB0cnVlOworICAgIH0KKyAgICBpZiAoISB0KSB7CisgICAgICBtX2ZhbHNlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyJkb1N0dWZmIn0gKQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV90cnVlKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2ZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jvb2xlYW5UZXN0XSAiICsgc3RyaW5nKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJhbGxCb29sZWFucyIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGEoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IHRydWUgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IGZhbHNlIH0sCisgICAgfTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0NsYXNzU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9DbGFzc1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y0Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9DbGFzc1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorcHVibGljIGNsYXNzIENsYXNzU2FtcGxlVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAiYSIgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgImIiIH0sCisgICAgfTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGYoU3RyaW5nIGEpIHsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGcoU3RyaW5nIGEpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0NsYXNzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9DbGFzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmRmNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9DbGFzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIENsYXNzVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgQFRlc3QoZ3JvdXBzID0geyAiY3VycmVudCIgfSkKKyAgcHVibGljIHZvaWQgaW5jbHVkZU1ldGhvZHNPbmx5KCkgeworICAgIGFkZENsYXNzKENsYXNzU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJmIiwgImciCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Db25maWd1cmF0aW9uQW5kRGF0YVByb3ZpZGVyc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvQ29uZmlndXJhdGlvbkFuZERhdGFQcm92aWRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjMzhhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvQ29uZmlndXJhdGlvbkFuZERhdGFQcm92aWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBiZWZvcmUgbWV0aG9kcyBleGNlcHQgYmVmb3JlVGVzdE1ldGhvZCBhcmUgaW52b2tlZAorICogYmVmb3JlIERhdGFQcm92aWRlci4KKyAqCisgKiBDcmVhdGVkIG9uIEphbiAxOSwgMjAwNgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPgorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFuZERhdGFQcm92aWRlcnNUZXN0IHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlU3VpdGUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlVGVzdCA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9iZWZvcmVDbGFzcyA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9iZWZvcmVUZXN0TWV0aG9kID0gZmFsc2U7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInRlc3QxIikKKyAgcHVibGljIE9iamVjdFtdW10gY3JlYXRlRGF0YSgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZVN1aXRlLCAiYmVmb3JlU3VpdGUgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9iZWZvcmVUZXN0LCAiYmVmb3JlVGVzdCBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQiKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2JlZm9yZUNsYXNzLCAiYmVmb3JlQ2xhc3Mgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYmVmb3JlVGVzdE1ldGhvZCwgImJlZm9yZU1ldGhvZCBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnZva2VkIik7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgbmV3IE9iamVjdFtdIHsgIlRlc3QiIH0gfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJ0ZXN0MSIpCisgIHB1YmxpYyB2b2lkIHZlcmlmeU5hbWVzKE9iamVjdCBwKSB7CisgICAgLy8gZG8gbm90aGluZworICB9CisKKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgc2V0VXBTdWl0ZSAoKSB7CisgICAgbV9iZWZvcmVTdWl0ZSAgPSB0cnVlOworICAgIHBwcCgiQkVGT1JFIFNVSVRFIik7CisgIH0KKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBzZXRVcFRlc3QoKSB7CisgICAgbV9iZWZvcmVUZXN0ID0gdHJ1ZTsKKyAgICBwcHAoIkJFRk9SRSBURVNUIik7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgc2V0VXBDbGFzcygpIHsKKyAgICBtX2JlZm9yZUNsYXNzID0gdHJ1ZTsKKyAgICBwcHAoIkJFRk9SRSBURVNUIENMQVNTIik7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIG1fYmVmb3JlVGVzdE1ldGhvZCA9IHRydWU7CisgICAgcHBwKCJCRUZPUkUgVEVTVCBNRVRIT0QiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDb25maWd1cmF0aW9uQW5kRGF0YVByb3ZpZGVyc1Rlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Db25zdHJ1Y3RvckluamVjdGlvblByb3ZpZGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0NvbnN0cnVjdG9ySW5qZWN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYyY2JlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Db25zdHJ1Y3RvckluamVjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVkOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckluamVjdGlvblByb3ZpZGVyIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICBASW5qZWN0CisgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGlvblByb3ZpZGVyKEBOYW1lZCgidGVzdCIpIFN0cmluZyB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJpbmplY3Rpb24iKQorICBwdWJsaWMgT2JqZWN0W11bXSBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgdmFsdWUgfSwKKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0NyZWF0ZURhdGFUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0NyZWF0ZURhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZTRmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvQ3JlYXRlRGF0YVRlc3QuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ3JlYXRlRGF0YVRlc3QgeworCisgIC8qKgorICAgKiBAdGVzdG5nLmRhdGEtcHJvdmlkZXIgbmFtZSA9ICJjcmVhdGUtZGF0YSIKKyAgICovCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJjcmVhdGUtZGF0YSIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZSgpIHsKKyAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBNeU9iamVjdCgpIH0KKyAgICAgICAgIH07CisgIH0KKworICAvKioKKyAgICogQHRlc3RuZy50ZXN0IGRhdGEtcHJvdmlkZXIgPSAiY3JlYXRlLWRhdGEiCisgICAqLworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiY3JlYXRlLWRhdGEiKQorICBwdWJsaWMgdm9pZCB0ZXN0TXlUZXN0KE15T2JqZWN0IG8pIHsKKyAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIG8KKyAgfQorCisKK30KKworY2xhc3MgTXlPYmplY3Qge30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRGF0YVByb3ZpZGVyQXNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0RhdGFQcm92aWRlckFzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjc4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0RhdGFQcm92aWRlckFzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKworLyoqCisgKiBUZXN0IHRoYXQgaWYgYSBjbGFzcyBAVGVzdCBpcyB1c2VkLCB0aGUgQERhdGFQcm92aWRlcgorICogbWV0aG9kIHdvbid0IGJlIGNvbnNpZGVyZWQgYXMgYSB0ZXN0LgorICovCitAVGVzdAorcHVibGljIGNsYXNzIERhdGFQcm92aWRlckFzVGVzdCB7CisKKyAgcHVibGljIHZvaWQgZigpIHsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9EYXRhUHJvdmlkZXJXaXRoRXJyb3IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRGF0YVByb3ZpZGVyV2l0aEVycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiOGM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRGF0YVByb3ZpZGVyV2l0aEVycm9yLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFZsYWRpc2xhdi5SYXNzb2toaW4KKyAqLworcHVibGljIGNsYXNzIERhdGFQcm92aWRlcldpdGhFcnJvciB7CisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJEYXRhIiwgaW52b2NhdGlvbkNvdW50ID0gMikKKyAgcHVibGljIHZvaWQgdGVzdFNob3VsZFNraXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBc3NlcnQuZmFpbCgpOworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gIkRhdGEiLCBpbnZvY2F0aW9uQ291bnQgPSAyLCBzdWNjZXNzUGVyY2VudGFnZSA9IDEwKQorICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkU2tpcEV2ZW5JZlN1Y2Nlc3NQZXJjZW50YWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQXNzZXJ0LmZhaWwoKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJEYXRhIikKKyAgcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIERhdGEoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWwiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9EZXBlbmRlbnRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0RlcGVuZGVudFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI4YTZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9EZXBlbmRlbnRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERlcGVuZGVudFNhbXBsZVRlc3QgeworICBARGF0YVByb3ZpZGVyKG5hbWUgPSAiZGF0YSIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyAib2siIH0sIHsgIm5vdCBvayIgfSwgfTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgImEiIH0sIGRhdGFQcm92aWRlciA9ICJkYXRhIikKKyAgcHVibGljIHZvaWQgbWV0aG9kMShTdHJpbmcgcykgeworICAgICAgaWYgKCEib2siLmVxdWFscyhzKSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvciAiICsgcyk7CisgICAgICB9CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJiIiB9LCBkZXBlbmRzT25Hcm91cHMgPSB7ICJhIiB9KQorICBwdWJsaWMgdm9pZCBtZXRob2QyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9EdXBsaWNhdGVEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0R1cGxpY2F0ZURhdGFQcm92aWRlclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU2OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9EdXBsaWNhdGVEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIER1cGxpY2F0ZURhdGFQcm92aWRlclNhbXBsZVRlc3QgeworCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkdXBsaWNhdGUiKQorICBwdWJsaWMgdm9pZCBmKCkgeworICB9CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gImR1cGxpY2F0ZSIpCisgIHB1YmxpYyBPYmplY3RbXSBkcDEoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbMF1bXTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJkdXBsaWNhdGUiKQorICBwdWJsaWMgT2JqZWN0W10gZHAyKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0WzBdW107CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRXhwbGljaXREYXRhUHJvdmlkZXJOYW1lU2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0V4cGxpY2l0RGF0YVByb3ZpZGVyTmFtZVNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWIxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0V4cGxpY2l0RGF0YVByb3ZpZGVyTmFtZVNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBFeHBsaWNpdERhdGFQcm92aWRlck5hbWVTYW1wbGUgeworCQorCUBUZXN0KGRhdGFQcm92aWRlcj0iZHBfbmFtZSIpCisJcHVibGljIHZvaWQgc2hvdWxkX2ZpbmRfZXhhY3RseV9vbmVfZGF0YV9wcm92aWRlcihpbnQgaSkge30KKwkKKwlARGF0YVByb3ZpZGVyKG5hbWU9ImRwX25hbWUiKQorCU9iamVjdFtdW10gd2hhdGV2ZXJfaW1wbGljaXRfbmFtZSgpIHtyZXR1cm4gbmV3IE9iamVjdFtdW10ge3sxfX07fQorCQorCUBEYXRhUHJvdmlkZXIobmFtZT0id2hhdGV2ZXJfZXhwbGljaXRfbmFtZSIpCisJT2JqZWN0W11bXSBkcF9uYW1lKCkge3JldHVybiBudWxsO30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0V4cGxpY2l0RGF0YVByb3ZpZGVyTmFtZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRXhwbGljaXREYXRhUHJvdmlkZXJOYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTdiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0V4cGxpY2l0RGF0YVByb3ZpZGVyTmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgRXhwbGljaXREYXRhUHJvdmlkZXJOYW1lVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworCUBUZXN0KGRlc2NyaXB0aW9uID0gIlRFU1RORy01NzY6IFByZWZlciBEYXRhUHJvdmlkZXIgZXhwbGljaXQgbmFtZSIpCisJcHVibGljIHZvaWQgc2hvdWxkX3ByZWZlcl9kYXRhUHJvdmlkZXJfZXhwbGljaXRfbmFtZSgpIHsKKwkgICAgVGVzdE5HIHRlc3RuZyA9IGNyZWF0ZShFeHBsaWNpdERhdGFQcm92aWRlck5hbWVTYW1wbGUuY2xhc3MpOworCSAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisJICAgIHRlc3RuZy5hZGRMaXN0ZW5lcih0bGEpOworCSAgICB0ZXN0bmcucnVuKCk7CisJICAgIAorCSAgICBhc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxLCAiQWxsIHRlc3RzIHNob3VsZCBzdWNjZXNzIik7CisJICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsZWREYXRhUHJvdmlkZXJTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRmFpbGVkRGF0YVByb3ZpZGVyU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzNjJkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRmFpbGVkRGF0YVByb3ZpZGVyU2FtcGxlLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhaWxlZERhdGFQcm92aWRlclNhbXBsZSB7CisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBJbnRlZ2VyW11bXSB7CisgICAgICAgIG5ldyBJbnRlZ2VyW10geyAxIH0sCisgICAgICAgIG5ldyBJbnRlZ2VyW10geyAyIH0sCisgICAgICAgIG5ldyBJbnRlZ2VyW10geyAzIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcCIpCisgIHB1YmxpYyB2b2lkIGYoaW50IG4pIHsKKyAgICBGYWlsZWREYXRhUHJvdmlkZXJUZXN0Lm1fdG90YWwgKz0gbjsKKyAgICBpZiAobiA9PSAyKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIikgIDsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsZWREYXRhUHJvdmlkZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxlZERhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBmMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsZWREYXRhUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWREYXRhUHJvdmlkZXJUZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworICBzdGF0aWMgaW50IG1fdG90YWwgPSAwOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICBtX3RvdGFsID0gMDsKKyAgfQorCisgIC8qKgorICAgKiBNYWtlIHN1cmUgdGhhdCBpZiBhIHRlc3QgbWV0aG9kIGZhaWxzIGluIHRoZSBtaWRkbGUgb2YgYSBkYXRhIHByb3ZpZGVyLCB0aGUgcmVzdAorICAgKiBvZiB0aGUgZGF0YSBzZXQgaXMgc3RpbGwgcnVuLgorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYWxsTWV0aG9kc1Nob3VsZEJlSW52b2tlZCgpIHsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEZhaWxlZERhdGFQcm92aWRlclNhbXBsZS5jbGFzcyB9KTsKKyAgICB0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG1fdG90YWwsIDYpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFpbGVkRGF0YVByb3ZpZGVyU2hvdWxkQ2F1c2VTa2lwKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LmRhdGFwcm92aWRlci5EZXBlbmRlbnRTYW1wbGVUZXN0Iik7CisKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAibWV0aG9kMSIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICJtZXRob2QxIgorICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICAgICJtZXRob2QyIgorICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nRGF0YVByb3ZpZGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxpbmdEYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UyZWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nRGF0YVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgRmFpbGluZ0RhdGFQcm92aWRlciB7DQorICBARGF0YVByb3ZpZGVyDQorICBwdWJsaWMgT2JqZWN0W11bXSB0aHJvd3NFeHBlY3RlZEV4Y2VwdGlvbigpIHsNCisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIGV4Y2VwdGlvbiBmcm9tIEBEUCIpOw0KKyAgfQ0KKw0KKyAgQFRlc3QoZGF0YVByb3ZpZGVyPSJ0aHJvd3NFeHBlY3RlZEV4Y2VwdGlvbiIpDQorICBwdWJsaWMgdm9pZCBkcFRocm93aW5nRXhjZXB0aW9uKCkgew0KKyAgICBBc3NlcnQuZmFpbCgiTWV0aG9kIHNob3VsZCBuZXZlciBnZXQgaW52b2tlZCIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxpbmdEYXRhUHJvdmlkZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxpbmdEYXRhUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzMTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRmFpbGluZ0RhdGFQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBGYWlsaW5nRGF0YVByb3ZpZGVyVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsNCisgIHByaXZhdGUgdm9pZCBzaG91bGRTa2lwKENsYXNzIGNscywgU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCkgew0KKyAgICBUZXN0TkcgdGVzdG5nID0gY3JlYXRlKGNscyk7DQorICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsNCisgICAgdGVzdG5nLmFkZExpc3RlbmVyKHRsYSk7DQorICAgIHRlc3RuZy5ydW4oKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpLCBleHBlY3RlZCwgbWVzc2FnZSk7DQorICB9DQorDQorICBAVGVzdChkZXNjcmlwdGlvbiA9ICJURVNUTkctMTQyOiBFeGNlcHRpb25zIGluIERhdGFQcm92aWRlciBhcmUgbm90IHJlcG9ydGVkIGFzIGZhaWxlZCB0ZXN0IikNCisgIHB1YmxpYyB2b2lkIGZhaWxpbmdEYXRhUHJvdmlkZXIoKSB7DQorICAgIHNob3VsZFNraXAoRmFpbGluZ0RhdGFQcm92aWRlci5jbGFzcywgIlRlc3QgbWV0aG9kIHNob3VsZCBiZSBtYXJrZWQgYXMgc2tpcHBlZCIsIDEpOw0KKyAgfQ0KKw0KKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiVEVTVE5HLTQ0NzogQWJvcnQgd2hlbiB0d28gZGF0YSBwcm92aWRlcnMgaGF2ZSB0aGUgc2FtZSBuYW1lIikNCisgIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZURhdGFQcm92aWRlcnMoKSB7DQorICAgIHNob3VsZFNraXAoRHVwbGljYXRlRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5jbGFzcywgIiIsIDEpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIGZhaWxpbmdEYXRhUHJvdmlkZXJBbmRJbnZvY2F0aW9uQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgc2hvdWxkU2tpcChEYXRhUHJvdmlkZXJXaXRoRXJyb3IuY2xhc3MsDQorICAgICAgICAiVGVzdCBzaG91bGQgYmUgc2tpcHBlZCBldmVuIGlmIGludm9jYXRpb24gY291bnRlciBhbmQgc3VjY2VzcyBwZXJjZW50YWdlIHNldCIsIDQpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxpbmdJdGVyYWJsZURhdGFQcm92aWRlci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nSXRlcmFibGVEYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmJjMGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nSXRlcmFibGVEYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgRmFpbGluZ0l0ZXJhYmxlRGF0YVByb3ZpZGVyIHsKKworICBARGF0YVByb3ZpZGVyKG5hbWUgPSAiZHAiKQorICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0W10+IGNyZWF0ZURhdGEoKSB7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxPYmplY3RbXT4oKSB7CisgICAgaW50IGNvdW50PTA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgcmV0dXJuIGNvdW50PDEwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXSBuZXh0KCkgeworICAgICAgaWYgKCsrY291bnQ9PTYpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBjb3VudCB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9CisKKyAgICB9OworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyPSJkcCIpCisgIHB1YmxpYyB2b2lkIGhhcHB5VGVzdChpbnQgY291bnQpIHsKKyAgICAvL3Bhc3MKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nSXRlcmFibGVEYXRhUHJvdmlkZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZhaWxpbmdJdGVyYWJsZURhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNiMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9GYWlsaW5nSXRlcmFibGVEYXRhUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKworLyoqCisgKiBURVNUTkctMjkxOgorICogRXhjZXB0aW9ucyB0aHJvd24gYnkgSXRlcmFibGUgRGF0YVByb3ZpZGVycyBhcmUgbm90IGNhdWdodCwgbm8gZmFpbGVkIHRlc3QgcmVwb3J0ZWQKKyAqLworcHVibGljIGNsYXNzIEZhaWxpbmdJdGVyYWJsZURhdGFQcm92aWRlclRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYWlsaW5nRGF0YVByb3ZpZGVyKCkgeworICAgIFRlc3RORyB0ZXN0bmc9IG5ldyBUZXN0TkcoZmFsc2UpOworICAgIHRlc3RuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7RmFpbGluZ0l0ZXJhYmxlRGF0YVByb3ZpZGVyLmNsYXNzfSk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRlc3RuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRlc3RuZy5zZXRWZXJib3NlKDApOworICAgIHRyeSB7CisgICAgICB0ZXN0bmcucnVuKCk7CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIHRlc3RzIHNob3VsZCBhbHdheXMgYmUgY2F1Z2h0ISIsIGUpOworICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSwgMSwKKyAgICAgICJTaG91bGQgaGF2ZSAxIGZhaWx1cmUgZnJvbSBhIGJhZCBkYXRhLXByb3ZpZGVyIGl0ZXJhdGlvbiIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCA1LAorICAgICAgIlNob3VsZCBoYXZlIDUgcGFzc2VkIHRlc3QgZnJvbSBiZWZvcmUgdGhlIGJhZCBkYXRhLXByb3ZpZGVyIGl0ZXJhdGlvbiIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZpZWxkSW5qZWN0aW9uUHJvdmlkZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvRmllbGRJbmplY3Rpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGM1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0ZpZWxkSW5qZWN0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEZpZWxkSW5qZWN0aW9uUHJvdmlkZXIgeworCisgIEBJbmplY3QgQE5hbWVkKCJ0ZXN0IikKKyAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gImluamVjdGlvbiIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyB2YWx1ZSB9LAorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5kaWNlc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5kaWNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY3MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9JbmRpY2VzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbmRpY2VzVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcihpbmRpY2VzID0geyAwLCAyIH0pCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwMSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgbmV3IE9iamVjdFtdIHsgMSB9LCAgCisgICAgICBuZXcgT2JqZWN0W10geyAyIH0sICAKKyAgICAgIG5ldyBPYmplY3RbXSB7IDMgfSwgIAorICAgIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAxIikKKyAgcHVibGljIHZvaWQgaW5kaWNlc1Nob3VsZFdvcmsoaW50IG4pIHsKKyAgICBpZiAobiA9PSAyKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIGEgMSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0luaGVyaXRhbmNlQVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5oZXJpdGFuY2VBVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDAwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0luaGVyaXRhbmNlQVRlc3QuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBJbmhlcml0YW5jZUFUZXN0IHsKKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJhIn0KKyAgICB9OworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0YW5jZUJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0luaGVyaXRhbmNlQlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0YW5jZUJUZXN0LmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQlRlc3QgZXh0ZW5kcyBJbmhlcml0YW5jZUFUZXN0IHsKKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCBmKFN0cmluZyBzKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5oZXJpdGVkRGF0YVByb3ZpZGVyQmFzZVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5oZXJpdGVkRGF0YVByb3ZpZGVyQmFzZVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM3ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0ZWREYXRhUHJvdmlkZXJCYXNlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLy9AVGVzdChkZXNjcmlwdGlvbiA9ICJwYXJlbnQiKQorQFRlc3QgKGRhdGFQcm92aWRlckNsYXNzPUluaGVyaXRlZERhdGFQcm92aWRlclNhbXBsZTFUZXN0LmNsYXNzKQorcHVibGljIGNsYXNzIEluaGVyaXRlZERhdGFQcm92aWRlckJhc2VTYW1wbGVUZXN0IHsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0ZWREYXRhUHJvdmlkZXJTYW1wbGUxVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0ZWREYXRhUHJvdmlkZXJTYW1wbGUxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjhjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0luaGVyaXRlZERhdGFQcm92aWRlclNhbXBsZTFUZXN0LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgSW5oZXJpdGVkRGF0YVByb3ZpZGVyU2FtcGxlMVRlc3QgeworCisgIEBEYXRhUHJvdmlkZXIKKyAgc3RhdGljIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICBuZXcgT2JqZWN0W10geyAiYSIgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5oZXJpdGVkRGF0YVByb3ZpZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Jbmhlcml0ZWREYXRhUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyYzM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5oZXJpdGVkRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8vQFRlc3QoZGVzY3JpcHRpb24gPSAiY2xhc3MiKQorcHVibGljIGNsYXNzIEluaGVyaXRlZERhdGFQcm92aWRlclRlc3QgZXh0ZW5kcyBJbmhlcml0ZWREYXRhUHJvdmlkZXJCYXNlU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIHZvaWQgZihTdHJpbmcgYSkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0lubmV4aXN0ZW50RGF0YVByb3ZpZGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0lubmV4aXN0ZW50RGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzM2I1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5uZXhpc3RlbnREYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgSW5uZXhpc3RlbnREYXRhUHJvdmlkZXIgew0KKyAgQFRlc3QoZGF0YVByb3ZpZGVyPSJkb2Vzbm90ZXhpc3QiKQ0KKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChTdHJpbmcgcykNCisgIHsNCisgICAgLy8gZG9lc24ndCBtYXR0ZXINCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9JbnN0YW5jZURhdGFQcm92aWRlclNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5zdGFuY2VEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzYjcyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSW5zdGFuY2VEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEluc3RhbmNlRGF0YVByb3ZpZGVyU2FtcGxlVGVzdCB7CisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcCgiREFUQSBQUk9WSURFUiIpOworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgIG5ldyBPYmplY3RbXSB7aGFzaENvZGUoKX0sCisgICAgfTsKKyAgfQorCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KCkgeworICAgIHAoIkJFRk9SRSIpOworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIHZvaWQgZihJbnRlZ2VyIG4pIHsKKyAgICBwKCIgIFBBUkFNOiIgKyBuKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG4sIEludGVnZXIudmFsdWVPZihoYXNoQ29kZSgpKSk7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgcCgiQUZURVIiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaGFzaENvZGUoKSArICIgIiArIHMpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL0luc3RhbmNlRGF0YVByb3ZpZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9JbnN0YW5jZURhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2U3YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9JbnN0YW5jZURhdGFQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCisKK3B1YmxpYyBjbGFzcyBJbnN0YW5jZURhdGFQcm92aWRlclRlc3QgeworCisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7CisgICAgICAgIG5ldyBJbnN0YW5jZURhdGFQcm92aWRlclNhbXBsZVRlc3QoKSwKKyAgICAgICAgbmV3IEluc3RhbmNlRGF0YVByb3ZpZGVyU2FtcGxlVGVzdCgpCisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9JdGVyYWJsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSXRlcmFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjNjNjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvSXRlcmFibGVUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgSXRlcmFibGVUZXN0IHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fb2sxID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX29rMiA9IGZhbHNlOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZOMiA9ICJBbm5lIE1hcmllIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExOMiA9IDM3OworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTjEgPSAiQ2VkcmljIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExOMSA9IDM2OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBEQVRBID0gbmV3IE9iamVjdFtdW10geworICAgIG5ldyBPYmplY3RbXSB7IEZOMSwgTE4xIH0sCisgICAgbmV3IE9iamVjdFtdIHsgRk4yLCBMTjIgfSwKKyAgfTsKKworICAvKioKKyAgICogQHRlc3RuZy5kYXRhLXByb3ZpZGVyIG5hbWU9InRlc3QxIgorICAgKi8KKyAgcHVibGljIEl0ZXJhdG9yIGNyZWF0ZURhdGEoKSB7CisgICAgcmV0dXJuIG5ldyBNeUl0ZXJhdG9yKERBVEEpOworICB9CisKKyAgLyoqCisgICAqIEB0ZXN0bmcudGVzdCBkYXRhUHJvdmlkZXI9InRlc3QxIgorICAgKi8KKyAgcHVibGljIHZvaWQgdmVyaWZ5TmFtZXMoU3RyaW5nIGZpcnN0TmFtZSwgSW50ZWdlciBhZ2UpIHsKKyAgICBpZiAoZmlyc3ROYW1lLmVxdWFscyhGTjEpICYmIGFnZS5lcXVhbHMoTE4xKSkgeworICAgICAgbV9vazEgPSB0cnVlOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeUl0ZXJhdG9yLmdldENvdW50KCksIDEpOworICAgIH0KKyAgICBpZiAoZmlyc3ROYW1lLmVxdWFscyhGTjIpICYmIGFnZS5lcXVhbHMoTE4yKSkgeworICAgICAgbV9vazIgPSB0cnVlOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeUl0ZXJhdG9yLmdldENvdW50KCksIDIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAdGVzdG5nLnRlc3QgZGVwZW5kc09uTWV0aG9kcyA9ICJ2ZXJpZnlOYW1lcyIKKyAgICovCisgIHB1YmxpYyB2b2lkIHZlcmlmeUNvdW50KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fb2sxICYmIG1fb2syKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbSXRlcmFibGVUZXN0XSAiICsgcyk7CisgIH0KK30KKworCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL01ldGhvZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGNlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL01ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgTWV0aG9kVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gImRwMSIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGEoTWV0aG9kIG0pIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0MSIsIG0uZ2V0TmFtZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0LmRhdGFwcm92aWRlci5NZXRob2RUZXN0IiwgbS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJDZWRyaWMiIH0sCisgICAgICBuZXcgT2JqZWN0W10geyAiQWxvaXMiIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcDEiKQorICBwdWJsaWMgdm9pZCB0ZXN0MShTdHJpbmcgcykgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDZWRyaWMiLmVxdWFscyhzKSB8fCAiQWxvaXMiLmVxdWFscyhzKSk7CisgIH0KKworICBwcml2YXRlIGludCBtX3Rlc3QyID0gMDsKKyAgcHJpdmF0ZSBpbnQgbV90ZXN0MyA9IDA7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gImRwMiIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGEyKE1ldGhvZCBtKSB7CisgICAgaWYgKCJ0ZXN0MiIuZXF1YWxzKG0uZ2V0TmFtZSgpKSkgeworICAgICAgbV90ZXN0MisrOworICAgIH0gZWxzZSBpZiAoInRlc3QzIi5lcXVhbHMobS5nZXROYW1lKCkpKSB7CisgICAgICBtX3Rlc3QzKys7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWNlaXZlZCBtZXRob2QgIiArIG0gKyAiLCBleHBlY3RlZCB0ZXN0MiBvciB0ZXN0MyIpOworICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0LmRhdGFwcm92aWRlci5NZXRob2RUZXN0IiwgbS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJDZWRyaWMiIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcDIiKQorICBwdWJsaWMgdm9pZCB0ZXN0MihTdHJpbmcgcykgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDZWRyaWMiLmVxdWFscyhzKSk7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAyIikKKyAgcHVibGljIHZvaWQgdGVzdDMoU3RyaW5nIHMpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2VkcmljIi5lcXVhbHMocykpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsidGVzdDIiLCAidGVzdDMifSkKKyAgcHVibGljIHZvaWQgbXVsdGlwbGVUZXN0TWV0aG9kcygpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG1fdGVzdDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbV90ZXN0Myk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9NeUl0ZXJhdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL015SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg3OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9NeUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworcHVibGljIGNsYXNzIE15SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxPYmplY3RbXT4geworICBwcml2YXRlIHN0YXRpYyBpbnQgbV9jb3VudCA9IDA7CisgIHByaXZhdGUgT2JqZWN0W11bXSBtX2RhdGE7CisKKyAgcHVibGljIE15SXRlcmF0b3IoT2JqZWN0W11bXSBkYXRhKSB7CisgICAgbV9kYXRhID0gZGF0YTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgIHJldHVybiBtX2NvdW50IDwgbV9kYXRhLmxlbmd0aDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0W10gbmV4dCgpIHsKKyAgICBwcHAoIlJFVFVSTklORyBJTkRFWCAiICsgbV9jb3VudCk7CisgICAgcmV0dXJuIG1fZGF0YVttX2NvdW50KytdOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvdW50KCkgeworICAgIHJldHVybiBtX2NvdW50OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltNeUl0ZXJhdG9yXSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Ob25TdGF0aWNQcm92aWRlci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Ob25TdGF0aWNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWIzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL05vblN0YXRpY1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgTm9uU3RhdGljUHJvdmlkZXIgeworCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJleHRlcm5hbCIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAiQ2VkcmljIiB9LAorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvUGFyYWxsZWxEYXRhUHJvdmlkZXIyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9QYXJhbGxlbERhdGFQcm92aWRlcjJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjOWExOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvUGFyYWxsZWxEYXRhUHJvdmlkZXIyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEphY2VrIFB1bHV0IDxqYWNlay5wdWx1dEBnbWFpbC5jb20+CisgKgorICogTWFrZSBzdXJlIHRoaXMgY2xhc3MgY2FuIHJ1biB3aXRob3V0IGNhdXNpbmcgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uLgorICovCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxEYXRhUHJvdmlkZXIyVGVzdCB7CisgIEBEYXRhUHJvdmlkZXIocGFyYWxsZWwgPSB0cnVlKQorICBJdGVyYXRvcjxJbnRlZ2VyW10+IHByb3ZpZGUoKQorICB7CisgICAgZmluYWwgTGlzdDxJbnRlZ2VyW10+IHJldCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgIHJldC5hZGQobmV3IEludGVnZXJbXSB7IGkgfSk7CisgICAgfQorICAgIHJldHVybiByZXQuaXRlcmF0b3IoKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJjbWUiLCBkYXRhUHJvdmlkZXIgPSAicHJvdmlkZSIsIGludm9jYXRpb25Db3VudCA9IDIsIHRocmVhZFBvb2xTaXplID0gMikKKyAgcHVibGljIHZvaWQgY2hlY2tDTUUoZmluYWwgSW50ZWdlciBpKQorICB7CisvLyAgICBSZXBvcnRlci5sb2coIiIgKyBpLCB0cnVlKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvUGFyYWxsZWxEYXRhUHJvdmlkZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1BhcmFsbGVsRGF0YVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjY2RmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1BhcmFsbGVsRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCisvKioKKyAqIERhdGEgcHJvdmlkZXJzIHdlcmUgbm90IHdvcmtpbmcgcHJvcGVybHkgd2l0aCBwYXJhbGxlbD10cnVlCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxEYXRhUHJvdmlkZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworLy8gIHByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlcgorLy8gICAgLmdldExvZ2dlcihTYW1wbGVNZXNzYWdlTG9hZGVyVGVzdDIuY2xhc3MpOworLy8gIC8vIFRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSBkYXRhIHRvIGFueSB0ZXN0IG1ldGhvZCB0aGF0IGRlY2xhcmVzIHRoYXQgaXRzCisgIC8vIERhdGEgUHJvdmlkZXIKKyAgLy8gaXMgbmFtZWQgInRlc3QxIgorICBARGF0YVByb3ZpZGVyKG5hbWUgPSAidGVzdDEiLCBwYXJhbGxlbCA9IHRydWUpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGExKCkgeworICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgeyAiQ2VkcmljIiwgMzZ9LAorICAgICB7ICJBbm5lIiwgMzd9LAorICAgICB7ICJBIiwgMzZ9LAorICAgICB7ICJCIiwgMzd9CisgICB9OworICB9CisgIC8vIFRoaXMgdGVzdCBtZXRob2QgZGVjbGFyZXMgdGhhdCBpdHMgZGF0YSBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIERhdGEKKyAgLy8gUHJvdmlkZXIKKyAgLy8gbmFtZWQgInRlc3QxIgorICBAVGVzdChkYXRhUHJvdmlkZXIgPSAidGVzdDEiLCB0aHJlYWRQb29sU2l6ZSA9IDUpCisgIHB1YmxpYyB2b2lkIHZlcmlmeURhdGExKElUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCwgU3RyaW5nIG4xLCBJbnRlZ2VyIG4yKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGROb3RUaHJvd0NvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShQYXJhbGxlbERhdGFQcm92aWRlcjJUZXN0LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvU2FtcGxlMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvU2FtcGxlMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRiZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9TYW1wbGUxVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGUxVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX29rMSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9vazIgPSBmYWxzZTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk4yID0gIkFubmUgTWFyaWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExOMiA9IDM3OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk4xID0gIkNlZHJpYyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTE4xID0gMzY7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInRlc3QxIikKKyAgcHVibGljIE9iamVjdFtdW10gY3JlYXRlRGF0YSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyBGTjEsIExOMSB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBGTjIsIExOMiB9LAorICAgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJ0ZXN0MSIpCisgIHB1YmxpYyB2b2lkIHZlcmlmeU5hbWVzKFN0cmluZyBmaXJzdE5hbWUsIEludGVnZXIgYWdlKSB7CisgICAgaWYgKGZpcnN0TmFtZS5lcXVhbHMoRk4xKSAmJiBhZ2UuZXF1YWxzKExOMSkpIHsKKyAgICAgIG1fb2sxID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZpcnN0TmFtZS5lcXVhbHMoRk4yKSAmJiBhZ2UuZXF1YWxzKExOMikpIHsKKyAgICAgIG1fb2syID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyJ2ZXJpZnlOYW1lcyJ9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnlDb3VudCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX29rMSAmJiBtX29rMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvU3RhdGljRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9TdGF0aWNEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3OGMyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvU3RhdGljRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5HdWljZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BHdWljZShtb2R1bGVzID0gU3RhdGljRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5JbmplY3Rpb25Qcm92aWRlck1vZHVsZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdGF0aWNEYXRhUHJvdmlkZXJTYW1wbGVUZXN0IHsKKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAic3RhdGljIiwgZGF0YVByb3ZpZGVyQ2xhc3MgPSBTdGF0aWNQcm92aWRlci5jbGFzcykKKyAgcHVibGljIHZvaWQgdmVyaWZ5U3RhdGljKFN0cmluZyBzKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzLCAiQ2VkcmljIik7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZXh0ZXJuYWwiLCBkYXRhUHJvdmlkZXJDbGFzcyA9IE5vblN0YXRpY1Byb3ZpZGVyLmNsYXNzKQorICBwdWJsaWMgdm9pZCB2ZXJpZnlFeHRlcm5hbChTdHJpbmcgcykgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocywgIkNlZHJpYyIpOworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImluamVjdGlvbiIsIGRhdGFQcm92aWRlckNsYXNzID0gRmllbGRJbmplY3Rpb25Qcm92aWRlci5jbGFzcykKKyAgcHVibGljIHZvaWQgdmVyaWZ5RmllbGRJbmplY3Rpb24oU3RyaW5nIHMpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHMsICJDZWRyaWMiKTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJpbmplY3Rpb24iLCBkYXRhUHJvdmlkZXJDbGFzcyA9IENvbnN0cnVjdG9ySW5qZWN0aW9uUHJvdmlkZXIuY2xhc3MpCisgIHB1YmxpYyB2b2lkIHZlcmlmeUNvbnN0cnVjdG9ySW5qZWN0aW9uKFN0cmluZyBzKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzLCAiQ2VkcmljIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGlvblByb3ZpZGVyTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgYmluZChTdHJpbmcuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQoInRlc3QiKSkudG9JbnN0YW5jZSgiQ2VkcmljIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1N0YXRpY1Byb3ZpZGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1N0YXRpY1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwOGVkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvU3RhdGljUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBTdGF0aWNQcm92aWRlciB7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInN0YXRpYyIpCisgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W11bXSBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgIkNlZHJpYyIgfSwKKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1Rlc3RDb250ZXh0U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Q29udGV4dFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk3NDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Q29udGV4dFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIHRlc3QuZGF0YXByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorLyoqDQorICogVGVzdHMgdGhhdCB3aGVuIGEgRGF0YVByb3ZpZGVyIGlzIGRlY2xhcmVkIHdpdGggYW4gSVRlc3RDb250ZXh0LA0KKyAqIHRoaXMgcGFyYW1ldGVyIGlzIGNvcnJlY3RseSBwYXNzZWQuDQorICoNCisgKiBDcmVhdGVkIG9uIERlYyAyOCwgMjAwNg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNlZHJpY0BiZXVzdC5jb20iPkNlZHJpYyBCZXVzdDwvYT4NCisgKi8NCitwdWJsaWMgY2xhc3MgVGVzdENvbnRleHRTYW1wbGVUZXN0IHsNCisNCisgIC8qKg0KKyAgICogQHJldHVybiBBcyBtYW55IHBhcmFtZXRlcnMgYXMgdGhlIG5hbWUgb2YgdGhlIGluY2x1ZGVkIGdyb3VwDQorICAgKi8NCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJ0ZXN0Q29udGV4dCIpDQorICBwdWJsaWMgT2JqZWN0W11bXSBjcmVhdGVDb250ZXh0KElUZXN0Q29udGV4dCBjdHgpIHsNCisvLyAgICBwcHAoIkNPTlRFWFQ6IiArIGN0eCk7DQorICAgIFN0cmluZ1tdIGdyb3VwcyA9IGN0eC5nZXRJbmNsdWRlZEdyb3VwcygpOw0KKw0KKyAgICBpbnQgbiA9IGdyb3Vwcy5sZW5ndGggPiAwID8gbmV3IEludGVnZXIoZ3JvdXBzWzBdKTogMDsNCisgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtuXTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsNCisgICAgICByZXN1bHRbaV0gPSAiZm9vIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10gew0KKyAgICAgICAgbmV3IE9iamVjdFtdIHsgcmVzdWx0IH0sDQorICAgIH07DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgew0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0Q29udGV4dFNhbXBsZVRlc3RdICIgKyBzKTsNCisgIH0NCisNCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJ0ZXN0Q29udGV4dCIsIGdyb3Vwcz0iMTAiKQ0KKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVuKE9iamVjdFtdIG9iamVjdHMpIHsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhvYmplY3RzLmxlbmd0aCwgMTApOw0KKyAgfQ0KKw0KKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gInRlc3RDb250ZXh0IiwgZ3JvdXBzPSI1IikNCisgIHB1YmxpYyB2b2lkIHZlcmlmeUZpdmUoT2JqZWN0W10gb2JqZWN0cykgew0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG9iamVjdHMubGVuZ3RoLCA1KTsNCisgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Q29udGV4dFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVGVzdENvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0OTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVGVzdENvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitwdWJsaWMgY2xhc3MgVGVzdENvbnRleHRUZXN0IHsNCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB2ZXJpZnlUZW4oKSB7DQorICAgIHZlcmlmeSgiMTAiLCAidmVyaWZ5VGVuIiwgMSwgMCk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdmVyaWZ5Rml2ZSgpIHsNCisgICAgdmVyaWZ5KCI1IiwgInZlcmlmeUZpdmUiLCAxLCAwKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB2ZXJpZnlTaXgoKSB7DQorICAgIC8vIE5vdCBpbmNsdWRpbmcgYW55IGdyb3VwLCBzbyB0aGUgdHdvIHRlc3QgbWV0aG9kcyBzaG91bGQgZmFpbA0KKyAgICB2ZXJpZnkobnVsbCwgbnVsbCwgMCwgMik7DQorICB9DQorDQorICBwcml2YXRlIHZvaWQgdmVyaWZ5KFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBwYXNzZWQsIGludCBwYXNzZWRDb3VudCwgaW50IGZhaWxlZENvdW50KSB7DQorICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7DQorICAgIHRuZy5zZXRWZXJib3NlKDApOw0KKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBUZXN0Q29udGV4dFNhbXBsZVRlc3QuY2xhc3MgfSk7DQorICAgIGlmIChncm91cE5hbWUgIT0gbnVsbCkgew0KKyAgICAgIHRuZy5zZXRHcm91cHMoZ3JvdXBOYW1lKTsNCisgICAgfQ0KKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIGFsID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsNCisgICAgdG5nLmFkZExpc3RlbmVyKGFsKTsNCisgICAgdG5nLnJ1bigpOw0KKw0KKyAgICBpZiAocGFzc2VkQ291bnQgPiAwKSB7DQorICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhbC5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgcGFzc2VkQ291bnQpOw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWwuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCkuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCBwYXNzZWQpOw0KKyAgICB9DQorDQorICAgIGlmIChmYWlsZWRDb3VudCA+IDApIHsNCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFsLmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLCBmYWlsZWRDb3VudCk7DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0SW5zdGFuY2VGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1Rlc3RJbnN0YW5jZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTViZTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0SW5zdGFuY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFRlc3RJbnN0YW5jZUZhY3RvcnkgeworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gaW5pdCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKKyAgICAgICAgbmV3IFRlc3RJbnN0YW5jZVRlc3QoMSksCisgICAgICAgIG5ldyBUZXN0SW5zdGFuY2VUZXN0KDIpCisgICAgfTsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVGVzdEluc3RhbmNlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0SW5zdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVGVzdEluc3RhbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0SW5zdGFuY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0SW5zdGFuY2VUZXN0IHsKKworICBwcml2YXRlIGludCBtX247CisgIHByaXZhdGUgc3RhdGljIGludCBtX2luc3RhbmNlQ291bnQgPSAwOworCisgIHB1YmxpYyBUZXN0SW5zdGFuY2VUZXN0KCkge30KKworICBwdWJsaWMgVGVzdEluc3RhbmNlVGVzdChpbnQgbikgeworICAgIHRoaXMubV9uID0gbjsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoTWV0aG9kIG0sIEBUZXN0SW5zdGFuY2UgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgVGVzdEluc3RhbmNlVGVzdCBvMCA9IChUZXN0SW5zdGFuY2VUZXN0KSBpbnN0YW5jZTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvMC5tX24gPT0gMSB8fCBvMC5tX24gPT0gMik7CisgICAgbV9pbnN0YW5jZUNvdW50Kys7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgbmV3IE9iamVjdFtdIHs0Mn0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7NDN9LAorICAgIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCBmKGludCBvKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIltBIG46IiArIG1fbiArICJdIjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQV0gIiArIHMpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Tkc0MTFTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1Rlc3RORzQxMVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQxMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Tkc0MTFTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBVc2VkIGJ5IHtAbGluayBUZXN0Tkc0MTFUZXN0fS4gRG8gbm90IGNoYW5nZSBudW1iZXIgb2YgbWV0aG9kcyBvciBtZXRob2QgbmFtZXMKKyAqIEBhdXRob3IgbnVsbGluCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdE5HNDExU2FtcGxlVGVzdAoreworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfTUFYX0RBVEEgPSAiY2hlY2tNYXhEYXRhIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX01JTl9EQVRBID0gImNoZWNrTWluRGF0YSI7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gQ0hFQ0tfTUFYX0RBVEEpCisgIHB1YmxpYyBPYmplY3RbXVtdIGRhdGFQcm92aWRlckNoZWNrTWF4KCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICB7IDEsIDIsIDMsIDMgfSwKKyAgICB9OworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gdGhpcyB0ZXN0IGRvbid0IG1hdGNoIHRoZSAiICsKKyAgICAgICJvbmVzIHBhc3NlZCBieSBkYXRhIHByb3ZpZGVyIiwgZGF0YVByb3ZpZGVyID0gQ0hFQ0tfTUFYX0RBVEEpCisgIHB1YmxpYyB2b2lkIGNoZWNrTWF4VGVzdChpbnQgbnIxLCBpbnQgbnIyLCBpbnQgZXhwZWN0ZWQpIHsKKyAgICBBc3NlcnQuZmFpbCgiVGhpcyBjb2RlIHNob3VsZG50IGJlIGV4ZWN1dGVkIik7CisgIH0KKworICBARGF0YVByb3ZpZGVyKG5hbWUgPSBDSEVDS19NSU5fREFUQSkKKyAgcHVibGljIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyQ2hlY2tNaW4oKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIHsgMSwgMiwgfSwKKyAgICB9OworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gdGhpcyB0ZXN0IGRvbid0IG1hdGNoIHRoZSAiICsKKyAgICAgICJvbmVzIHBhc3NlZCBieSBkYXRhIHByb3ZpZGVyIiwgZGF0YVByb3ZpZGVyID0gQ0hFQ0tfTUlOX0RBVEEpCisgIHB1YmxpYyB2b2lkIGNoZWNrTWluVGVzdChpbnQgbnIxLCBpbnQgbnIyLCBpbnQgZXhwZWN0ZWQpIHsKKyAgICBBc3NlcnQuZmFpbCgiVGhpcyBjb2RlIHNob3VsZG50IGJlIGV4ZWN1dGVkIik7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJOdW1iZXIgb2YgcGFyYW1ldGVycyB0byB0aGlzIHRlc3QgZG9uJ3QgbWF0Y2ggdGhlICIgKworICAgICAgICAib25lcyBwYXNzZWQgYnkgZGF0YSBwcm92aWRlci4gQnV0IGFuIG9qYmVjdCB3aWxsIGJlIGluamVjdGVkIiwKKyAgICAgICAgZGF0YVByb3ZpZGVyID0gQ0hFQ0tfTUlOX0RBVEEpCisgIHB1YmxpYyB2b2lkIGNoZWNrTWluVGVzdF9pbmplY3Rpb24oaW50IG5yMSwgaW50IG5yMiwgSVRlc3RDb250ZXh0IGN0eCkgeworICAgIGludCByZXN1bHQgPSBNYXRoLm1pbihucjEsIG5yMik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQsIG5yMSk7CisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY3R4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Tkc0MTFUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1Rlc3RORzQxMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTA1NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9UZXN0Tkc0MTFUZXN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitwdWJsaWMgY2xhc3MgVGVzdE5HNDExVGVzdCB7DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgew0KKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOw0KKyAgICB0bmcuc2V0VmVyYm9zZSgwKTsNCisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgVGVzdE5HNDExU2FtcGxlVGVzdC5jbGFzcyB9KTsNCisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBhbCA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7DQorICAgIHRuZy5hZGRMaXN0ZW5lcihhbCk7DQorICAgIHRuZy5ydW4oKTsNCisNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhbC5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMSk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWwuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCkuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAiY2hlY2tNaW5UZXN0X2luamVjdGlvbiIpOw0KKw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFsLmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLCAyKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Vbm5hbWVkRGF0YVByb3ZpZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9Vbm5hbWVkRGF0YVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMWZmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGF0YXByb3ZpZGVyL1VubmFtZWREYXRhUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSB0ZXN0LmRhdGFwcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgVW5uYW1lZERhdGFQcm92aWRlclRlc3Qgew0KKyAgcHJpdmF0ZSBib29sZWFuIG1fZmFsc2UgPSBmYWxzZTsNCisgIHByaXZhdGUgYm9vbGVhbiBtX3RydWUgPSBmYWxzZTsNCisNCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJ1bm5hbWVkRGF0YVByb3ZpZGVyIikNCisgIHB1YmxpYyB2b2lkIGRvU3R1ZmYoYm9vbGVhbiB0KSB7DQorICAgIGlmICh0KSB7DQorICAgICAgbV90cnVlID0gdHJ1ZTsNCisgICAgfQ0KKyAgICBpZiAoISB0KSB7DQorICAgICAgbV9mYWxzZSA9IHRydWU7DQorICAgIH0NCisgIH0NCisNCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ImRvU3R1ZmYifSApDQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fdHJ1ZSk7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fZmFsc2UpOw0KKyAgfQ0KKw0KKyAgQERhdGFQcm92aWRlcg0KKyAgcHVibGljIE9iamVjdFtdW10gdW5uYW1lZERhdGFQcm92aWRlcigpIHsNCisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsNCisgICAgICAgIHtCb29sZWFuLlRSVUV9LA0KKyAgICAgICAge0Jvb2xlYW4uRkFMU0V9DQorICAgIH07DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVmFyQXJnc0RhdGFQcm92aWRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kYXRhcHJvdmlkZXIvVmFyQXJnc0RhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFiMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RhdGFwcm92aWRlci9WYXJBcmdzRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgdGVzdC5kYXRhcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBWYXJBcmdzRGF0YVByb3ZpZGVyVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFMgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkYXRhKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7IFMgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkYXRhIikKKyAgcHVibGljIHZvaWQgdGVzdFdpdGhUd29FbnRyaWVzSW5UZXN0VG9vbFdpbmRvdyhTdHJpbmcuLi4gbykgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobywgUyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQmFzZU9yZGVyTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9CYXNlT3JkZXJNZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5MDc3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQmFzZU9yZGVyTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcworICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBBdWcgMjAsIDIwMDQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlT3JkZXJNZXRob2RUZXN0IHsKKyAgcHJvdGVjdGVkIGJvb2xlYW5bXSBtX2dyb3VwMSA9IHsKKyAgICAgIGZhbHNlLCBmYWxzZQorICB9OworICBwcm90ZWN0ZWQgYm9vbGVhbltdIG1fZ3JvdXAyID0geworICAgICAgZmFsc2UsIGZhbHNlCisgIH07CisgIHByb3RlY3RlZCBib29sZWFuW10gbV9ncm91cDMgPSB7CisgICAgICBmYWxzZQorICB9OworCisgIEBUZXN0KGdyb3VwcyA9IHsgIjIuMCIgfSwgZGVwZW5kc09uR3JvdXBzID0geyAiMS4wIiwgIjEuMSIgfSkKKyAgcHVibGljIHZvaWQgYV9zZWNvbmQwKCkgeworICAgIHZlcmlmeUdyb3VwKDIsIG1fZ3JvdXAxKTsKKyAgICBtX2dyb3VwMlswXSA9IHRydWU7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICIzIiB9LCBkZXBlbmRzT25Hcm91cHMgPSB7ICIyLjAiIH0pCisgIHB1YmxpYyB2b2lkIHRoaXJkMCgpIHsKKyAgICB2ZXJpZnlHcm91cCgzLCBtX2dyb3VwMik7CisgICAgbV9ncm91cDNbMF0gPSB0cnVlOworICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VPcmRlck1ldGhvZFRlc3RdICIgKyBzKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUdyb3VwKGludCBncm91cE51bWJlciwgYm9vbGVhbltdIGdyb3VwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGFzc2VydCBncm91cFtpXSA6ICJFcnJvciB3aGlsZSBydW5uaW5nIGdyb3VwICIgKyBncm91cE51bWJlciArICI6ICIKKyAgICAgICAgKyAiIGluZGV4ICIgKyBpCisgICAgICAgICsgIiBvZiBwcmV2aW91cyBncm91cCBzaG91bGQgaGF2ZSBiZWVuIHJ1biBiZWZvcmUuIjsKKyAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQzEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdlZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DMS5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzPSJncm91cDEiKQorcHVibGljIGNsYXNzIEMxIHsKKworICAgcHVibGljIHZvaWQgZmFpbGluZ1Rlc3QoKSB7CisgICAgICBmYWlsKCJhbHdheXMgZmFpbHMiKTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjIyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0MyLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHM9eyJncm91cDIifSwgZGVwZW5kc09uR3JvdXBzPXsiZ3JvdXAxIn0pCitwdWJsaWMgY2xhc3MgQzIgeworCisgICBwdWJsaWMgdm9pZCBzaG91bGRCZVNraXBwZWQoKSB7CisgICAgICAvLyB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGlzIHRlc3Qgd2lsbCBiZSBTS0lQUEVEIGJlY2F1c2UKKyAgICAgIC8vIGEgdGVzdCBpbiBncm91cDEgZmFpbGVkIGFuZCB3ZSBoYXZlIGEgZGVwZW5kc09uR3JvdXBzPXsiZ3JvdXAxIn0KKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DbGFzc0RlcGVuZHNPbkdyb3Vwcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DbGFzc0RlcGVuZHNPbkdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWFiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0NsYXNzRGVwZW5kc09uR3JvdXBzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKKworcHVibGljIGNsYXNzIENsYXNzRGVwZW5kc09uR3JvdXBzIGV4dGVuZHMgQmFzZVRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEZXBlbmRzT25Hcm91cHMoKSB7CisgICAgIGFkZENsYXNzKHRlc3QuZGVwZW5kZW50LkRpZmZlcmVudENsYXNzRGVwZW5kc09uR3JvdXBzVGVzdDEuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgYWRkQ2xhc3ModGVzdC5kZXBlbmRlbnQuRGlmZmVyZW50Q2xhc3NEZXBlbmRzT25Hcm91cHNUZXN0Mi5jbGFzcy5nZXROYW1lKCkpOworCisgICAgIHJ1bigpOworICAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgICAgICJ0ZXN0MCIKKyAgICAgfTsKKyAgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICAgICAgICJ0ZXN0MSIsICJ0ZXN0MiIKKyAgICAgfTsKKyAgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5R3JvdXBzQWNyb3NzQ2xhc3NlcygpIHsKKyAgICAgYWRkQ2xhc3ModGVzdC5kZXBlbmRlbnQuQzEuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgYWRkQ2xhc3ModGVzdC5kZXBlbmRlbnQuQzIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICBydW4oKTsKKyAgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgICAiZmFpbGluZ1Rlc3QiCisgICAgIH07CisgICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7CisgICAgICAgICAic2hvdWxkQmVTa2lwcGVkIgorICAgICB9OworICAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQ2xhc3NXaWRlMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQ2xhc3NXaWRlMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI5MGZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9DbGFzc1dpZGUxVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaWRlMVRlc3QgeworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fb2sgPSBmYWxzZTsKKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIG1fb2sgPSBmYWxzZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG0xKCkgeworICAgIG1fb2sgPSB0cnVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIG0xV2FzUnVuKCkgeworICAgIHJldHVybiBtX29rOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0NsYXNzV2lkZTJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0NsYXNzV2lkZTJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhNzRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvQ2xhc3NXaWRlMlRlc3QuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaWRlMlRlc3QgeworCisvLyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsibTEiIH0pCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7InRlc3QuZGVwZW5kZW50LkNsYXNzV2lkZTFUZXN0Lm0xIiB9KQorICBwdWJsaWMgdm9pZCBtMigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShDbGFzc1dpZGUxVGVzdC5tMVdhc1J1bigpKTsKKyAgfQorCisvLyAgQFRlc3QKKy8vICBwdWJsaWMgdm9pZCBtMSgpIHsKKy8vCisvLyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcEJ1Z1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwQnVnU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODJiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcEJ1Z1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBEZXBCdWdTYW1wbGVUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fbG9nID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKy8vICAgIHBwcChzKTsKKyAgICBtX2xvZy5hZGQocyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0RlcEJ1Z1NhbXBsZVRlc3RdICIgKyBzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldExvZygpIHsKKyAgICByZXR1cm4gbV9sb2c7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBsb2coInNldHVwIik7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbG9nKCJkZXN0cm95Iik7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInNlbmQiKQorICBwdWJsaWMgdm9pZCBnZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBsb2coImdldCIpOworICB9CisKKyAgcHVibGljIHZvaWQgc2VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGxvZygic2VuZCIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwQnVnVmVyaWZ5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBCdWdWZXJpZnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0MmEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwQnVnVmVyaWZ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIERlcEJ1Z1ZlcmlmeVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBMaXN0PFN0cmluZz4gbG9nID0gRGVwQnVnU2FtcGxlVGVzdC5nZXRMb2coKTsKKyAgICBTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAic2V0dXAiLCAic2VuZCIsICJnZXQiLCAiZGVzdHJveSIKKyAgICB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9nLnNpemUoKTsgaSsrKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCBsb2cuZ2V0KGkpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW5jeUZpeFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW5jeUZpeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJlZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRlbmN5Rml4VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERlcGVuZGVuY3lGaXhUZXN0IHsKKwlAVGVzdChkZXBlbmRzT25NZXRob2RzID0gImhlbGxvV29ybGQiLCBpZ25vcmVNaXNzaW5nRGVwZW5kZW5jaWVzID0gdHJ1ZSkKKwlwdWJsaWMgdm9pZCBkZXBlbmRlbnRPbk5vbkV4aXN0aW5nTWV0aG9kKCkgeworCQlhc3NlcnRUcnVlKHRydWUpOworCX0KKworCUBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAiZGVwZW5kZW50T25Ob25FeGlzdGluZ01ldGhvZCIpCisJcHVibGljIHZvaWQgZGVwZW5kZW50T25FeGlzdGluZ01ldGhvZCgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKwl9CisKKwlAVGVzdChncm91cHMgPSAic2VsZlN1ZmZpY2llbnQiLCBkZXBlbmRzT25Hcm91cHMgPSAibm9uRXhpc3RpbmdHcm91cCIsIGlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXMgPSB0cnVlKQorCXB1YmxpYyB2b2lkIGRlcGVuZGVudE9uTm9uRXhpc3RpbmdHcm91cCgpIHsKKwkJYXNzZXJ0VHJ1ZSh0cnVlKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRlbnRBbHdheXNSdW5UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudEFsd2F5c1J1blRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU3MWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRlbnRBbHdheXNSdW5UZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBEZXBlbmRlbnRBbHdheXNSdW5UZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEZXBlbmRzT25NZXRob2RzQWx3YXlzUnVuKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LmRlcGVuZGVudC5EZXBlbmRlbnRPbk1ldGhvZDFBbHdheXNSdW5TYW1wbGVUZXN0Iik7CisKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJiIiwgInZlcmlmeSIKKyAgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgICAgImEiCisgICAgfTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEZXBlbmRzT25Hcm91cHMxQWx3YXlzUnVuKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LmRlcGVuZGVudC5EZXBlbmRlbnRPbkdyb3VwMUFsd2F5c1J1blNhbXBsZVRlc3QiKTsKKworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgImIiLCAidmVyaWZ5IgorICAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICAiYSIKKyAgICB9OworICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeURlcGVuZHNPbkdyb3VwczJBbHdheXNSdW4oKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuZGVwZW5kZW50LkRlcGVuZGVudE9uR3JvdXAyQWx3YXlzUnVuU2FtcGxlVGVzdCIpOworCisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAiYTIiLCAiYiIsICJ2ZXJpZnkiCisgICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgICJhIgorICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW50T25Hcm91cDFBbHdheXNSdW5TYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uR3JvdXAxQWx3YXlzUnVuU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzVhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uR3JvdXAxQWx3YXlzUnVuU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogYSB3aWxsIGZhaWwgYnV0IGIgc2hvdWxkIHJ1biBhbnl3YXkgYmVjYXVzZSBvZiBhbHdheXNSdW49dHJ1ZQorICoKKyAqIENyZWF0ZWQgb24gTm92IDE4LCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgRGVwZW5kZW50T25Hcm91cDFBbHdheXNSdW5TYW1wbGVUZXN0IHsKKworICBwcml2YXRlIGJvb2xlYW4gbV9vayA9IGZhbHNlOworCisgIEBUZXN0KGdyb3VwcyA9IHsgImdyb3VwLWEifSkKKyAgcHVibGljIHZvaWQgYSgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVm9sdW50YXJ5IGZhaWx1cmUiKTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9IHsiZ3JvdXAtYSJ9LCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiKCkgeworICAgIG1fb2sgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsiYiJ9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9vaywgIm1ldGhvZCBiKCkgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW50T25Hcm91cDJBbHdheXNSdW5TYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uR3JvdXAyQWx3YXlzUnVuU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NWQyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uR3JvdXAyQWx3YXlzUnVuU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogYSB3aWxsIGZhaWwgYnV0IGIgc2hvdWxkIHJ1biBhbnl3YXkgYmVjYXVzZSBvZiBhbHdheXNSdW49dHJ1ZQorICoKKyAqIENyZWF0ZWQgb24gTm92IDE4LCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgRGVwZW5kZW50T25Hcm91cDJBbHdheXNSdW5TYW1wbGVUZXN0IHsKKworICBwcml2YXRlIGJvb2xlYW4gbV9vayA9IGZhbHNlOworCisgIEBUZXN0KGdyb3VwcyA9IHsgImdyb3VwLWEifSkKKyAgcHVibGljIHZvaWQgYSgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVm9sdW50YXJ5IGZhaWx1cmUiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgImdyb3VwLWEifSkKKyAgcHVibGljIHZvaWQgYTIoKSB7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7Imdyb3VwLWEifSwgYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYigpIHsKKyAgICBtX29rID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ImIifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fb2ssICJtZXRob2QgYigpIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uTWV0aG9kMUFsd2F5c1J1blNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW50T25NZXRob2QxQWx3YXlzUnVuU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGE1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudE9uTWV0aG9kMUFsd2F5c1J1blNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIGEgd2lsbCBmYWlsIGJ1dCBiIHNob3VsZCBydW4gYW55d2F5IGJlY2F1c2Ugb2YgYWx3YXlzUnVuPXRydWUKKyAqCisgKiBDcmVhdGVkIG9uIE5vdiAxOCwgMjAwNQorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIERlcGVuZGVudE9uTWV0aG9kMUFsd2F5c1J1blNhbXBsZVRlc3QgeworCisgIHByaXZhdGUgYm9vbGVhbiBtX29rID0gZmFsc2U7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYSgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVm9sdW50YXJ5IGZhaWx1cmUiKTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ImEifSwgYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYigpIHsKKyAgICBtX29rID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ImIifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fb2ssICJtZXRob2QgYigpIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTk0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudFRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRXhwZWN0ZWRFeGNlcHRpb25zOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRGVwZW5kZW50VGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaW1wbGVTa2lwKCkgeworICAgIGFkZENsYXNzKFNhbXBsZURlcGVuZGVudDEuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7fTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7ICJmYWlsIiB9OworICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7ICJzaG91bGRCZVNraXBwZWQiIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkZXBlbmRlbnRNZXRob2RzKCkgeworICAgIGFkZENsYXNzKFNhbXBsZURlcGVuZGVudE1ldGhvZHMuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7ICJvbmVBIiwgIm9uZUIiLCAic2Vjb25kQSIsICJ0aGlyZEEiLCAiY2FuQmVSdW5Bbnl0aW1lIiB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHt9OworICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7fTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGRlcGVuZGVudE1ldGhvZHNXaXRoU2tpcCgpIHsKKyAgICBhZGRDbGFzcyhTYW1wbGVEZXBlbmRlbnRNZXRob2RzNC5jbGFzcy5nZXROYW1lKCkpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsgInN0ZXAxIiwgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7ICJzdGVwMiIsIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsgInN0ZXAzIiB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgQEV4cGVjdGVkRXhjZXB0aW9ucyh7IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uLmNsYXNzIH0pCisgIHB1YmxpYyB2b2lkIGRlcGVuZGVudE1ldGhvZHNXaXRoTm9uRXhpc3RlbnRNZXRob2QoKSB7CisgICAgYWRkQ2xhc3MoU2FtcGxlRGVwZW5kZW50TWV0aG9kczUuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7ICJzdGVwMSIsICJzdGVwMiIgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7fTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0ge307CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBvcmcudGVzdG5nLlRlc3ROR0V4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgZGVwZW5kZW50TWV0aG9kc1dpdGhDeWNsZSgpIHsKKyAgICBhZGRDbGFzcyhTYW1wbGVEZXBlbmRlbnRNZXRob2RzNi5jbGFzcy5nZXROYW1lKCkpOworICAgIHJ1bigpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIGRlcGVuZGVudEdyb3Vwc1dpdGhDeWNsZSgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5kZXBlbmRlbnQuU2FtcGxlRGVwZW5kZW50TWV0aG9kczciKTsKKyAgICBydW4oKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG11bHRpcGxlU2tpcHMoKSB7CisgICAgYWRkQ2xhc3MoTXVsdGlwbGVEZXBlbmRlbnRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geyAiaW5pdCIsIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geyAiZmFpbCIsIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsgInNraXAxIiwgInNraXAyIiB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaW5zdGFuY2VEZXBlbmRlbmNpZXMoKSB7CisgICAgYWRkQ2xhc3MoSW5zdGFuY2VTa2lwU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHJ1bigpOworICAgIHZlcmlmeUluc3RhbmNlTmFtZXMoIlBhc3NlZCIsIGdldFBhc3NlZFRlc3RzKCksCisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJmIzEiLCAiZiMzIiwgImcjMSIsICJnIzMifSk7CisgICAgdmVyaWZ5SW5zdGFuY2VOYW1lcygiRmFpbGVkIiwgZ2V0RmFpbGVkVGVzdHMoKSwKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgImYjMiIgfSk7CisgICAgdmVyaWZ5SW5zdGFuY2VOYW1lcygiU2tpcHBlZCIsIGdldFNraXBwZWRUZXN0cygpLAorICAgICAgICBuZXcgU3RyaW5nW10geyAiZyMiIH0pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZGVwZW5kZW50V2l0aERhdGFQcm92aWRlcigpIHsKKyAgICBUZXN0TkcgdG5nID0gU2ltcGxlQmFzZVRlc3QuY3JlYXRlKERlcGVuZGVudFdpdGhEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcuc2V0R3JvdXBCeUluc3RhbmNlcyh0cnVlKTsKKyAgICBMaXN0PFN0cmluZz4gbG9nID0gRGVwZW5kZW50V2l0aERhdGFQcm92aWRlclNhbXBsZVRlc3QubV9sb2c7CisgICAgbG9nLmNsZWFyKCk7CisgICAgdG5nLnJ1bigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI7IGkgKz0gNCkgeworICAgICAgU3RyaW5nW10gcyA9IGxvZy5nZXQoaSkuc3BsaXQoIiMiKTsKKyAgICAgIFN0cmluZyBpbnN0YW5jZSA9IHNbMV07CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvZy5nZXQoaSksICJwcmVwYXJlIyIgKyBpbnN0YW5jZSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvZy5nZXQoaSArIDEpLCAidGVzdDEjIiArIGluc3RhbmNlKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9nLmdldChpICsgMiksICJ0ZXN0MiMiICsgaW5zdGFuY2UpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2cuZ2V0KGkgKyAzKSwgImNsZWFuIyIgKyBpbnN0YW5jZSk7CisgICAgfQorICB9Cit9IC8vIERlcGVuZGVudFRlc3QKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRlbnRXaXRoRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRlbnRXaXRoRGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTE2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcGVuZGVudFdpdGhEYXRhUHJvdmlkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRGVwZW5kZW50V2l0aERhdGFQcm92aWRlclNhbXBsZVRlc3QKK3sKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gbV9sb2cgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBTdHJpbmcgcGFyYW07CisKKyAgQEZhY3RvcnkoIGRhdGFQcm92aWRlciA9ICJwcm92IiApCisgIHB1YmxpYyBEZXBlbmRlbnRXaXRoRGF0YVByb3ZpZGVyU2FtcGxlVGVzdCggU3RyaW5nIHBhcmFtICkKKyAgeworICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIoIG5hbWUgPSAicHJvdiIgKQorICBwdWJsaWMgc3RhdGljIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyKCkKKyAgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICB7ICJPbmUiIH0sCisgICAgICB7ICJUd28iIH0sCisgICAgICB7ICJUaHJlZSIgfSwKKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgIG1fbG9nLmFkZChzICsgIiMiICsgcGFyYW0pOworICB9CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIHByZXBhcmUoKQorICB7CisgICAgbG9nKCJwcmVwYXJlIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpCisgIHsKKyAgICBsb2coInRlc3QxIik7CisgIH0KKworICBAVGVzdCggZGVwZW5kc09uTWV0aG9kcyA9ICJ0ZXN0MSIgKQorICBwdWJsaWMgdm9pZCB0ZXN0MigpCisgIHsKKyAgICBsb2coInRlc3QyIik7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBjbGVhbigpCisgIHsKKyAgICBsb2coImNsZWFuIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIlsiICsgcGFyYW0gKyAiXSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kc09uUHJvdGVjdGVkTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EZXBlbmRzT25Qcm90ZWN0ZWRNZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmYmIyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwZW5kc09uUHJvdGVjdGVkTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIERlcGVuZHNPblByb3RlY3RlZE1ldGhvZFRlc3Qgew0KKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlMSA9IGZhbHNlOw0KKyAgcHJpdmF0ZSBib29sZWFuIG1fYmVmb3JlMiA9IGZhbHNlOw0KKw0KKyAgQEJlZm9yZU1ldGhvZChkZXBlbmRzT25NZXRob2RzID0geyAiYmVmb3JlMiIgfSkNCisgIHByb3RlY3RlZCB2b2lkIGJlZm9yZSgpIHsNCisgICAgbV9iZWZvcmUxID0gdHJ1ZTsNCisgIH0NCisNCisgIEBCZWZvcmVNZXRob2QNCisgIHByb3RlY3RlZCB2b2lkIGJlZm9yZTIoKSB7DQorICAgIG1fYmVmb3JlMiA9IHRydWU7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdmVyaWZ5QmVmb3JlSW52b2NhdGlvbnMoKSB7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlMSAmJiBtX2JlZm9yZTIsICJQcm90ZWN0ZWQgZGVwZW5kZW50IEBCZWZvcmVNZXRob2RzIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcHRoRGVwZW5kZW5jeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGVwdGhEZXBlbmRlbmN5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDA4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RlcHRoRGVwZW5kZW5jeVRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgRGVwdGhEZXBlbmRlbmN5VGVzdCB7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiMSJ9ICkKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgIjIifSwgZGVwZW5kc09uR3JvdXBzID0geyIxIn0gKQorICBwdWJsaWMgdm9pZCBmMigpIHsKKworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiMyJ9LCBkZXBlbmRzT25Hcm91cHMgPSB7IjIifSApCisgIHB1YmxpYyB2b2lkIGYzKCkgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGlmZmVyZW50Q2xhc3NEZXBlbmRzT25Hcm91cHNUZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EaWZmZXJlbnRDbGFzc0RlcGVuZHNPbkdyb3Vwc1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMDZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvRGlmZmVyZW50Q2xhc3NEZXBlbmRzT25Hcm91cHNUZXN0MS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK3B1YmxpYyBjbGFzcyBEaWZmZXJlbnRDbGFzc0RlcGVuZHNPbkdyb3Vwc1Rlc3QxIHsKKyAgQFRlc3QoZ3JvdXBzID0geyAibWFpbkdyb3VwIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0MCgpIHsKKyAgICBhc3NlcnRUcnVlKDEgPT0gMCk7IC8vIEZvcmNlIGEgZmFpbHVyZQorICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzPSB7Im1haW5Hcm91cCJ9KQorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EaWZmZXJlbnRDbGFzc0RlcGVuZHNPbkdyb3Vwc1Rlc3QyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0RpZmZlcmVudENsYXNzRGVwZW5kc09uR3JvdXBzVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE4MWMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9EaWZmZXJlbnRDbGFzc0RlcGVuZHNPbkdyb3Vwc1Rlc3QyLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK3B1YmxpYyBjbGFzcyBEaWZmZXJlbnRDbGFzc0RlcGVuZHNPbkdyb3Vwc1Rlc3QyIHsKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyAibWFpbkdyb3VwIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9Hcm91cEJ5SW5zdGFuY2VzU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9Hcm91cEJ5SW5zdGFuY2VzU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmI5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0dyb3VwQnlJbnN0YW5jZXNTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR3JvdXBCeUluc3RhbmNlc1NhbXBsZVRlc3QgeworICBwcml2YXRlIFN0cmluZyBtX2NvdW50cnk7CisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fbG9nID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1ldGhvZCwgU3RyaW5nIGNvdW50cnkpIHsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTE9HOiIgKyBtZXRob2QgKyAiIyIgKyBjb3VudHJ5ICsgIiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsKKyAgICBtX2xvZy5hZGQobWV0aG9kICsgIiMiICsgY291bnRyeSk7CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJ1c2EiIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJ1ayIgfSwKKyAgICB9OworICB9CisKKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIEdyb3VwQnlJbnN0YW5jZXNTYW1wbGVUZXN0KFN0cmluZyBjb3VudHJ5KSB7CisgICAgbV9jb3VudHJ5ID0gY291bnRyeTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNpZ25JbigpIHsKKyAgICBsb2coInNpZ25JbiIsIG1fY291bnRyeSk7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInNpZ25JbiIpCisgIHB1YmxpYyB2b2lkIHNpZ25PdXQoKSB7CisgICAgbG9nKCJzaWduT3V0IiwgbV9jb3VudHJ5KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiW0dyb3VwQnlJbnN0YW5jZXNTYW1wbGVUZXN0OiAiICsgbV9jb3VudHJ5ICsgIl0iOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0dyb3VwQnlJbnN0YW5jZXNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0dyb3VwQnlJbnN0YW5jZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZmIzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvR3JvdXBCeUluc3RhbmNlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cEJ5SW5zdGFuY2VzVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkb250R3JvdXBCeUluc3RhbmNlcygpIHsKKyAgICBydW5UZXN0KGZhbHNlKTsKKyAgfQorICAgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCBncm91cEJ5SW5zdGFuY2VzKCkgeworICAgIHJ1blRlc3QodHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuVGVzdChib29sZWFuIGdyb3VwKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShHcm91cEJ5SW5zdGFuY2VzU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgR3JvdXBCeUluc3RhbmNlc1NhbXBsZVRlc3QubV9sb2cgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICB0bmcuc2V0R3JvdXBCeUluc3RhbmNlcyhncm91cCk7CisgICAgdG5nLnJ1bigpOworCisgICAgTGlzdDxTdHJpbmc+IGxvZyA9IEdyb3VwQnlJbnN0YW5jZXNTYW1wbGVUZXN0Lm1fbG9nOworICAgIGludCBpID0gMDsKKyAgICBpZiAoZ3JvdXApIHsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxvZy5nZXQoaSsrKS5zdGFydHNXaXRoKCJzaWduSW4iKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsb2cuZ2V0KGkrKykuc3RhcnRzV2l0aCgic2lnbk91dCIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxvZy5nZXQoaSsrKS5zdGFydHNXaXRoKCJzaWduSW4iKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsb2cuZ2V0KGkrKykuc3RhcnRzV2l0aCgic2lnbk91dCIpKTsKKyAgICB9IGVsc2UgeworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobG9nLmdldChpKyspLnN0YXJ0c1dpdGgoInNpZ25JbiIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxvZy5nZXQoaSsrKS5zdGFydHNXaXRoKCJzaWduSW4iKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsb2cuZ2V0KGkrKykuc3RhcnRzV2l0aCgic2lnbk91dCIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxvZy5nZXQoaSsrKS5zdGFydHNXaXRoKCJzaWduT3V0IikpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uMlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhYWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcGxpY2l0R3JvdXBJbmNsdXNpb24yU2FtcGxlVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX20xLCBtX20yLCBtX20zOworCisgIEBCZWZvcmVDbGFzcyhncm91cHMgPSB7ImcyIn0pCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9tMSA9IG1fbTIgPSBtX20zID0gZmFsc2U7CisgIH0KKworICBAVGVzdCAoZ3JvdXBzID0geyJnMSJ9KQorICBwdWJsaWMgdm9pZCBtMSgpIHsKKyAgICBtX20xID0gdHJ1ZTsKKyB9CisKKyBAVGVzdCAoZ3JvdXBzID0geyJnMSJ9LCBkZXBlbmRzT25NZXRob2RzPSJtMSIpCisgIHB1YmxpYyB2b2lkIG0yKCkgeworICAgICBtX20yID0gdHJ1ZTsKKyB9CisKKyBAVGVzdCAoZ3JvdXBzID0geyJnMiJ9KQorICBwdWJsaWMgdm9pZCBtMygpIHsKKyAgICAgbV9tMyA9IHRydWU7CisgfQorCisgQEFmdGVyQ2xhc3MoZ3JvdXBzID0geyJnMiJ9KQorIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgIEFzc2VydC5hc3NlcnRGYWxzZShtX20xLCAiU2hvdWxkbid0IGhhdmUgaW52b2tlZCBtMSgpIik7CisgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9tMik7CisgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX20zKTsKKyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uM1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjNTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmZjg2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjNTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcGxpY2l0R3JvdXBJbmNsdXNpb24zU2FtcGxlVGVzdCB7CisgQFRlc3QoIGdyb3VwcyA9IHsiaW5jIn0gKQorIHB1YmxpYyB2b2lkIHRlc3QxKCkge30KKworIEBUZXN0KCBncm91cHMgPSB7ImV4YyJ9ICkKKyBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleGNsdWRlIG1lIik7CisgfQorCisgQFRlc3QoIGdyb3VwcyA9IHsiZXhjIn0sIGRlcGVuZHNPbk1ldGhvZHM9eyJ0ZXN0MiJ9ICkKKyBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleGNsdWRlIG1lIik7CisgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uNFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiOWM1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRHcm91cEluY2x1c2lvbjRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcGxpY2l0R3JvdXBJbmNsdXNpb240U2FtcGxlVGVzdCB7CisgIHByaXZhdGUgYm9vbGVhbiBtX20xLCBtX20yLCBtX20zLCBtX200OworCisgIEBCZWZvcmVDbGFzcyhncm91cHMgPSB7ImcyIn0pCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9tMSA9IG1fbTIgPSBtX20zID0gbV9tNCA9IGZhbHNlOworICB9CisKKyAgQFRlc3QgKGdyb3VwcyA9IHsiZzEifSkKKyAgcHVibGljIHZvaWQgbTEoKSB7CisgICAgbV9tMSA9IHRydWU7CisgfQorCisgQFRlc3QgKGdyb3VwcyA9IHsiZzEifSwgZGVwZW5kc09uTWV0aG9kcz0ibTEiKQorICBwdWJsaWMgdm9pZCBtMigpIHsKKyAgICAgbV9tMiA9IHRydWU7CisgfQorCisgQFRlc3QgKGdyb3VwcyA9IHsiZzIifSkKKyAgcHVibGljIHZvaWQgbTMoKSB7CisgICAgIG1fbTMgPSB0cnVlOworIH0KKworIEBUZXN0IChncm91cHMgPSB7ImcyIn0sIGRlcGVuZHNPbk1ldGhvZHM9Im0zIikKKyBwdWJsaWMgdm9pZCBtNCgpIHsKKyAgIG1fbTQgPSB0cnVlOworIH0KKworIEBBZnRlckNsYXNzKGdyb3VwcyA9IHsiZzIifSkKKyBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9tMSwgIlNob3VsZG4ndCBoYXZlIGludm9rZWQgbTEoKSIpOworICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fbTIpOworICAgQXNzZXJ0LmFzc2VydFRydWUobV9tMyk7CisgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX200KTsKKyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWRlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0ltcGxpY2l0R3JvdXBJbmNsdXNpb25TYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcGxpY2l0R3JvdXBJbmNsdXNpb25TYW1wbGVUZXN0IHsKKworICBAVGVzdChncm91cHMgPSAieiIpCisgIHB1YmxpYyB2b2lkIHooKSB7CisKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJhIiwgZGVwZW5kc09uR3JvdXBzID0geyJ6In0pCisgIHB1YmxpYyB2b2lkIGEoKSB7CisKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJiIiwgZGVwZW5kc09uR3JvdXBzID0geyJhIn0pCisgIHB1YmxpYyB2b2lkIGIoKSB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdEdyb3VwSW5jbHVzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODA0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0ltcGxpY2l0R3JvdXBJbmNsdXNpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgSW1wbGljaXRHcm91cEluY2x1c2lvblRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW1wbGljaXRHcm91cEluY2x1c2lvbigpIHsKKyAgICBhZGRDbGFzcygidGVzdC5kZXBlbmRlbnQuSW1wbGljaXRHcm91cEluY2x1c2lvblNhbXBsZVRlc3QiKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJiIik7CisKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJhIiwgImIiLCAieiIKKyAgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlJbXBsaWNpdEdyb3VwSW5jbHVzaW9uMigpIHsKKyAgICBhZGRDbGFzcygidGVzdC5kZXBlbmRlbnQuSW1wbGljaXRHcm91cEluY2x1c2lvbjJTYW1wbGVUZXN0Iik7CisgICAgYWRkSW5jbHVkZWRHcm91cCgiZzIiKTsKKworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgIm0zIgorICAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUltcGxpY2l0R3JvdXBJbmNsdXNpb240KCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LmRlcGVuZGVudC5JbXBsaWNpdEdyb3VwSW5jbHVzaW9uNFNhbXBsZVRlc3QiKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJnMiIpOworCisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAibTMiLCAibTQiCisgICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW1wbGljaXRHcm91cEluY2x1c2lvbjMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuZGVwZW5kZW50LkltcGxpY2l0R3JvdXBJbmNsdXNpb24zU2FtcGxlVGVzdCIpOworICAgIGFkZEluY2x1ZGVkR3JvdXAoImluYyIpOworICAgIGFkZEV4Y2x1ZGVkR3JvdXAoImV4YyIpOworCisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDEiCisgICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW1wbGljaXRNZXRob2RJbmNsdXNpb24oKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuZGVwZW5kZW50LkltcGxpY2l0TWV0aG9kSW5jbHVzaW9uU2FtcGxlVGVzdCIpOworICAgIGFkZEluY2x1ZGVkR3JvdXAoIndpbmRvd3MiKTsKKworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgImEiLCAiYiIKKyAgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbXBsaWNpdE1ldGhvZEluY2x1c2lvblNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRNZXRob2RJbmNsdXNpb25TYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMjk2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvSW1wbGljaXRNZXRob2RJbmNsdXNpb25TYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEltcGxpY2l0TWV0aG9kSW5jbHVzaW9uU2FtcGxlVGVzdCB7CisgIEBUZXN0KGdyb3VwcyA9IHsibGludXgifSkKKyAgcHVibGljIHZvaWQgYSgpIHsKKy8vICAgIHBwcCgiQSIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyJsaW51eCIsICJ3aW5kb3dzIn0gLCBkZXBlbmRzT25NZXRob2RzPXsiYSJ9KQorICBwdWJsaWMgdm9pZCBiKCkgeworLy8gICAgcHBwKCJCIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltJbXBsaWNpdF0gIiArIHN0cmluZyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbnN0YW5jZVNraXBTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L0luc3RhbmNlU2tpcFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhkNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9JbnN0YW5jZVNraXBTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworCisvKioKKyAqIFZlcmlmeSB0aGF0IG9ubHkgaW5zdGFuY2VzIHRoYXQgZmFpbCBjYXVzZSBkZXBlbmRlbmN5IGZhaWx1cmVzLiBJbiBvdGhlciB3b3JkcywKKyAqIHdoZW4gcnVuLCB0aGlzIHRlc3Qgc2hvdWxkIHNob3c6CisgKiBwYXNzZWQgPSBbZiMxIGYjMyBnIzEgZyMzXSwgZmFpbGVkID0gW2YjMl0sIHNraXBwZWQgPSBbZyMyXQorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VTa2lwU2FtcGxlVGVzdCB7CisKKyAgcHJpdmF0ZSBpbnQgbV9uOworICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBtX2xpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgSW5zdGFuY2VTa2lwU2FtcGxlVGVzdChpbnQgbikgeworICAgIG1fbiA9IG47CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAxIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IDIgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgMyB9LAorICAgIH07CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICAgIGlmIChtX24gPT0gMikgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICBsb2coImYiKTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAiZiIpCisgIHB1YmxpYyB2b2lkIGcoKSB7CisgICAgbG9nKCJnIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgbV9saXN0LmFkZChzICsgIiMiICsgbV9uKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiIiArIG1fbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NaXNzaW5nR3JvdXBTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L01pc3NpbmdHcm91cFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2JhNWIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NaXNzaW5nR3JvdXBTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5QYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgTWlzc2luZ0dyb3VwU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyJtaXNzaW5nLWdyb3VwIn0pCisgIHB1YmxpYyB2b2lkIHNob3VsZEJlU2tpcHBlZCgpIHsKKworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyJtaXNzaW5nLWdyb3VwIn0sIGlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXM9dHJ1ZSkKKyAgcHVibGljIHZvaWQgc2hvdWxkTm90QmVTa2lwcGVkKCkgeworCisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIFN0cmluZyB4bWwgPSAiPHN1aXRlIG5hbWU9XCJkZ2ZcIiB2ZXJib3NlPVwiMTBcIj48dGVzdCBuYW1lPVwiZGdmXCI+PGNsYXNzZXM+PGNsYXNzIG5hbWU9XCJ0ZXN0LmRlcGVuZGVudC5NaXNzaW5nR3JvdXBTYW1wbGVUZXN0XCI+PC9jbGFzcz48L2NsYXNzZXM+PC90ZXN0Pjwvc3VpdGU+IjsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oeG1sKTsKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwuZ2V0Qnl0ZXMoKSk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhuZXcgUGFyc2VyKGlzKS5wYXJzZVRvTGlzdCgpKTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvTWlzc2luZ0dyb3VwVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NaXNzaW5nR3JvdXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0NDhmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvTWlzc2luZ0dyb3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgTWlzc2luZ0dyb3VwVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlUaGF0RXhjZXB0aW9uSXNUaHJvd25JZk1pc3NpbmdHcm91cCgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5kZXBlbmRlbnQuTWlzc2luZ0dyb3VwU2FtcGxlVGVzdCIpOworCisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAic2hvdWxkTm90QmVTa2lwcGVkIgorICAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIFN0cmluZ1tdIHNraXBwZWQgPSB7CisgICAgICAic2hvdWxkQmVTa2lwcGVkIgorICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L01pc3NpbmdNZXRob2RTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L01pc3NpbmdNZXRob2RTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2ZTg5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvTWlzc2luZ01ldGhvZFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBNaXNzaW5nTWV0aG9kU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcz0ibWlzc2luZ01ldGhvZCIsIGlnbm9yZU1pc3NpbmdEZXBlbmRlbmNpZXM9dHJ1ZSkKKyAgcHVibGljIHZvaWQgZXhwbGljaXRseUlnbm9yZU1pc3NpbmdNZXRob2QoKSB7CisKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHM9Im1pc3NpbmdNZXRob2QiLCBhbHdheXNSdW49dHJ1ZSkKKyAgcHVibGljIHZvaWQgYWx3YXlzUnVuRGVzcGl0ZU1pc3NpbmdNZXRob2QoKSB7fQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgU3RyaW5nIHhtbCA9ICI8c3VpdGUgbmFtZT1cImRnZlwiIHZlcmJvc2U9XCIxMFwiPjx0ZXN0IG5hbWU9XCJkZ2ZcIj48Y2xhc3Nlcz4iICsKKyAgICAJCSI8Y2xhc3MgbmFtZT1cInRlc3QuZGVwZW5kZW50Lk1pc3NpbmdNZXRob2RTYW1wbGVUZXN0XCIvPiIgKworICAgIAkJIjwvY2xhc3Nlcz48L3Rlc3Q+PC9zdWl0ZT4iOworICAgIFN5c3RlbS5vdXQucHJpbnRsbih4bWwpOworICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbC5nZXRCeXRlcygpKTsKKyAgICB0bmcuc2V0WG1sU3VpdGVzKG5ldyBQYXJzZXIoaXMpLnBhcnNlVG9MaXN0KCkpOworICAgIHRuZy5ydW4oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NaXNzaW5nTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NaXNzaW5nTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjVlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L01pc3NpbmdNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBNaXNzaW5nTWV0aG9kVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlUaGF0RXhjZXB0aW9uSXNUaHJvd25JZk1pc3NpbmdNZXRob2QoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuZGVwZW5kZW50Lk1pc3NpbmdNZXRob2RTYW1wbGVUZXN0Iik7CisKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJleHBsaWNpdGx5SWdub3JlTWlzc2luZ01ldGhvZCIsCisgICAgICAgICJhbHdheXNSdW5EZXNwaXRlTWlzc2luZ01ldGhvZCIKKyAgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCBnZXRTa2lwcGVkVGVzdHMoKSk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L011bHRpR3JvdXAxU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aUdyb3VwMVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWI1OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aUdyb3VwMVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHMgPSB7ICJjaGVja2luIiB9KQorcHVibGljIGNsYXNzIE11bHRpR3JvdXAxU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZ3JvdXBzID0geyJhIn0pCisgIHB1YmxpYyB2b2lkIHRlc3RBKCkgeworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRocm93IG5ldyBFeGNlcHRpb24oImZhaWwiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aUdyb3VwMlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvTXVsdGlHcm91cDJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNzA0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvTXVsdGlHcm91cDJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzID0geyJpbnRlZ3JhdGlvbiJ9LCBkZXBlbmRzT25Hcm91cHMgPSB7ImNoZWNraW4iLCAiYSJ9KQorcHVibGljIGNsYXNzIE11bHRpR3JvdXAyU2FtcGxlVGVzdCB7CisKKyAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aUdyb3VwVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aUdyb3VwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTYwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L011bHRpR3JvdXBUZXN0LmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBNdWx0aUdyb3VwVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5RGVwZW5kc09uTXVsdGlHcm91cHMoKSB7CisgICAgIGFkZENsYXNzKE11bHRpR3JvdXAxU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgICBhZGRDbGFzcyhNdWx0aUdyb3VwMlNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICBydW4oKTsKKyAgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAgInRlc3RBIiwKKyAgICAgIH07CisgICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICAgInRlc3QxIgorICAgICB9OworICAgICBTdHJpbmdbXSBza2lwcGVkID0geworICAgICAgICAgInRlc3QyIgorICAgICB9OworICAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgICAgIHZlcmlmeVRlc3RzKCJTa2lwcGVkIiwgc2tpcHBlZCwgZ2V0U2tpcHBlZFRlc3RzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L011bHRpcGxlRGVwZW5kZW50U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aXBsZURlcGVuZGVudFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRjZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9NdWx0aXBsZURlcGVuZGVudFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgTXVsdGlwbGVEZXBlbmRlbnRTYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpbml0KCkge30KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gImluaXQiKQorICBwdWJsaWMgdm9pZCBmYWlsKCkgeworICAgIEFzc2VydC5mYWlsKCk7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gImZhaWwiKQorICBwdWJsaWMgdm9pZCBza2lwMSgpIHt9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9ICJza2lwMSIpCisgIHB1YmxpYyB2b2lkIHNraXAyKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvT3JkZXJNZXRob2RUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L09yZGVyTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTE4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L09yZGVyTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIHZlcmlmaWVzIHRoYXQgd2hlbiBtZXRob2RzIGhhdmUgZGVwZW5kZW50cywgdGhleSBhcmUgcnVuCisgKiBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgQXVnIDE5LCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgT3JkZXJNZXRob2RUZXN0IGV4dGVuZHMgQmFzZU9yZGVyTWV0aG9kVGVzdCB7CisgIEBUZXN0KGdyb3VwcyA9IHsgIjEuMCIgfSkKKyAgcHVibGljIHZvaWQgel9maXJzdDAoKSB7CisvLyAgICBwcHAoIjEuMCIpOworICAgIG1fZ3JvdXAxWzBdID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgIjIuMSIgfSwgZGVwZW5kc09uR3JvdXBzID0geyAiMS4wIiwgIjEuMSIgfSkKKyAgcHVibGljIHZvaWQgYV9zZWNvbmQxKCkgeworLy8gICAgcHBwKCIyLjEiKTsKKyAgICB2ZXJpZnlHcm91cCgyLCBtX2dyb3VwMSk7CisgICAgbV9ncm91cDJbMV0gPSB0cnVlOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiMS4xIiB9KQorICBwdWJsaWMgdm9pZCB6X3ByZW1pZXJlMSgpIHsKKy8vICAgIHBwcCgiMS4xIik7CisgICAgbV9ncm91cDFbMV0gPSB0cnVlOworICB9CisKKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NEMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TRDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzIyNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TRDIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNEMiB7CisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fbG9nID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAib25lIiB9KQorICBwdWJsaWMgdm9pZCBvbmVBKCkgeworICAgIG1fbG9nLmFkZCgib25lQSIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2FuQmVSdW5Bbnl0aW1lKCkgeworICAgIG1fbG9nLmFkZCgiY2FuQmVSdW5Bbnl0aW1lIik7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJvbmUiIH0gKQorICBwdWJsaWMgdm9pZCBzZWNvbmRBKCkgeworICAgIG1fbG9nLmFkZCgic2Vjb25kQSIpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcz0geyAic2Vjb25kQSIgfSkKKyAgcHVibGljIHZvaWQgdGhpcmRBKCkgeworICAgIG1fbG9nLmFkZCgidGhpcmRBIik7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJvbmUiIH0pCisgIHB1YmxpYyB2b2lkIG9uZUIoKSB7CisgICAgbV9sb2cuYWRkKCJvbmVCIik7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmODVhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50MS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGV4ZXJjaXNlcyBkZXBlbmRlbnQgZ3JvdXBzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyAxOSwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZURlcGVuZGVudDEgeworCisgIEBUZXN0KGdyb3VwcyA9IHsgImZhaWwiIH0pCisgIHB1YmxpYyB2b2lkIGZhaWwoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyAiZmFpbCIgfSkKKyAgcHVibGljIHZvaWQgc2hvdWxkQmVTa2lwcGVkKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudENvbmZpZ3VyYXRpb25NZXRob2RzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudENvbmZpZ3VyYXRpb25NZXRob2RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5YjU1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50Q29uZmlndXJhdGlvbk1ldGhvZHMuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlRGVwZW5kZW50Q29uZmlndXJhdGlvbk1ldGhvZHMgeworICBwcml2YXRlIGJvb2xlYW4gbV9jcmVhdGUgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fZmlyc3QgPSBmYWxzZTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGNyZWF0ZUluc3RhbmNlKCkgeworICAgIG1fY3JlYXRlID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QoZGVwZW5kc09uTWV0aG9kcyA9IHsgImNyZWF0ZUluc3RhbmNlIn0pCisgIHB1YmxpYyB2b2lkIGZpcnN0SW52b2NhdGlvbigpIHsKKyAgICBhc3NlcnQgbV9jcmVhdGUgOiAiY3JlYXRlSW5zdGFuY2UoKSB3YXMgbmV2ZXIgY2FsbGVkIjsKKyAgICBtX2ZpcnN0ID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeURlcGVuZGVudHMoKSB7CisgICAgYXNzZXJ0IG1fY3JlYXRlIDogImNyZWF0ZUluc3RhbmNlKCkgd2FzIG5ldmVyIGNhbGxlZCI7CisgICAgYXNzZXJ0IG1fZmlyc3QgOiAiZmlyc3RJbnZvY2F0aW9uKCkgd2FzIG5ldmVyIGNhbGxlZCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MTU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKKy8qKgorICogVGhpcyBjbGFzcyBleGVyY2lzZXMgZGVwZW5kZW50IG1ldGhvZHMKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgQXVnIDE5LCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlRGVwZW5kZW50TWV0aG9kcyB7CisgIHByaXZhdGUgYm9vbGVhbiBtX29uZUEgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fb25lQiA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9zZWNvbmRBID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3RoaXJkQSA9IGZhbHNlOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG9uZUEoKSB7CisvLyAgICBwcHAoIm9uZUEiKTsKKy8vICAgIGFzc2VydCBmYWxzZSA6ICJURU1QT1JBUlkgRkFJTFVSRSI7CisgICAgYXNzZXJ0ICEgbV9zZWNvbmRBIDogInNlY29uZEEgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4geWV0IjsKKyAgICBtX29uZUEgPSB0cnVlOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2FuQmVSdW5Bbnl0aW1lKCkgeworCisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzPSB7ICJvbmVBIiwgIm9uZUIiIH0pCisgIHB1YmxpYyB2b2lkIHNlY29uZEEoKSB7CisvLyAgICBwcHAoInNlY29uZEEiKTsKKyAgICBhc3NlcnQgbV9vbmVBIDogIm9uZUEgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fb25lQiA6ICJvbmVCIHdhc24ndCBydW4iOworICAgIGFzc2VydCAhIG1fc2Vjb25kQSA6ICJzZWNvbmRBIHNob3VsZG4ndCBoYXZlIGJlZW4gcnVuIHlldCI7CisgICAgbV9zZWNvbmRBID0gdHJ1ZTsKKworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcz0geyAic2Vjb25kQSIgfSkKKyAgcHVibGljIHZvaWQgdGhpcmRBKCkgeworLy8gICAgcHBwKCJ0aGlyZEEiKTsKKyAgICBhc3NlcnQgbV9vbmVBIDogIm9uZUEgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fb25lQiA6ICJvbmVCIHdhc24ndCBydW4iOworICAgIGFzc2VydCBtX3NlY29uZEEgOiAic2Vjb25kQSB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgISBtX3RoaXJkQSA6ICJ0aGlyZEEgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4geWV0IjsKKyAgICBtX3RoaXJkQSA9IHRydWU7CisKK30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBvbmVCKCkgeworLy8gICAgcHBwKCJvbmVCIik7CisgICAgYXNzZXJ0ICEgbV9zZWNvbmRBIDogInNlY29uZEEgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4geWV0IjsKKyAgICBtX29uZUIgPSB0cnVlOworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgYXNzZXJ0IG1fb25lQSA6ICJvbmVBIHdhc24ndCBydW4iOworICAgIGFzc2VydCBtX29uZUIgOiAib25lQiB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgbV9zZWNvbmRBIDogInNlY29uZEEgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fdGhpcmRBIDogInRoaXJkQSB3YXNuJ3QgcnVuIjsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTYW1wbGVEZXBlbmRlbnRNZXRob2RzXSAiICsgcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHMyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmZWM4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kczIuamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgZXhlcmNpc2VzIGRlcGVuZGVudCBtZXRob2RzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyAxOSwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZURlcGVuZGVudE1ldGhvZHMyIHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fb25lQSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9vbmVCID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3NlY29uZEEgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIG1fdGhpcmRBID0gZmFsc2U7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAib25lIiB9KQorICBwdWJsaWMgdm9pZCBvbmVBKCkgeworLy8gICAgcHBwKCJvbmVBIik7CisgICAgYXNzZXJ0ICEgbV9zZWNvbmRBIDogInNlY29uZEEgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4geWV0IjsKKyAgICBtX29uZUEgPSB0cnVlOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2FuQmVSdW5Bbnl0aW1lKCkgeworCisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJvbmUiIH0gKQorICBwdWJsaWMgdm9pZCBzZWNvbmRBKCkgeworLy8gICAgcHBwKCJzZWNvbmRBIik7CisgICAgYXNzZXJ0IG1fb25lQSA6ICJvbmVBIHdhc24ndCBydW4iOworICAgIGFzc2VydCBtX29uZUIgOiAib25lQiB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgISBtX3NlY29uZEEgOiAic2Vjb25kQSBzaG91bGRuJ3QgaGF2ZSBiZWVuIHJ1biB5ZXQiOworICAgIG1fc2Vjb25kQSA9IHRydWU7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzPSB7ICJzZWNvbmRBIiB9KQorICBwdWJsaWMgdm9pZCB0aGlyZEEoKSB7CisvLyAgICBwcHAoInRoaXJkQSIpOworICAgIGFzc2VydCBtX29uZUEgOiAib25lQSB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgbV9vbmVCIDogIm9uZUIgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fc2Vjb25kQSA6ICJzZWNvbmRBIHdhc24ndCBydW4iOworICAgIGFzc2VydCAhIG1fdGhpcmRBIDogInRoaXJkQSBzaG91bGRuJ3QgaGF2ZSBiZWVuIHJ1biB5ZXQiOworICAgIG1fdGhpcmRBID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgIm9uZSIgfSkKKyAgcHVibGljIHZvaWQgb25lQigpIHsKKy8vICAgIHBwcCgib25lQiIpOworICAgIGFzc2VydCAhIG1fc2Vjb25kQSA6ICJzZWNvbmRBIHNob3VsZG4ndCBoYXZlIGJlZW4gcnVuIHlldCI7CisgICAgbV9vbmVCID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIGFzc2VydCBtX29uZUEgOiAib25lQSB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgbV9vbmVCIDogIm9uZUIgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fc2Vjb25kQSA6ICJzZWNvbmRBIHdhc24ndCBydW4iOworICAgIGFzc2VydCBtX3RoaXJkQSA6ICJ0aGlyZEEgd2Fzbid0IHJ1biI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2FtcGxlRGVwZW5kZW50TWV0aG9kc10gIiArIHMpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzMy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2JhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHMzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKKy8qKgorICogVGhpcyBjbGFzcyB0ZXN0cyBvdmVybG9hZGVkIGRlcGVuZGVudCBtZXRob2RzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEF1ZyAxOSwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZURlcGVuZGVudE1ldGhvZHMzIHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fb25lQSA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gbV9vbmVCID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBtX3NlY29uZEEgPSBmYWxzZTsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBvbmUoKSB7CisvLyAgICBwcHAoIm9uZUEiKTsKKyAgICBhc3NlcnQgISBtX3NlY29uZEEgOiAic2Vjb25kQSBzaG91bGRuJ3QgaGF2ZSBiZWVuIHJ1biB5ZXQiOworICAgIG1fb25lQSA9IHRydWU7CisgIH0KKworICBAUGFyYW1ldGVycyh7ICJmb28iIH0pCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG9uZShTdHJpbmcgcykgeworLy8gICAgcHBwKCJvbmVCIik7CisgICAgYXNzZXJ0ICEgbV9zZWNvbmRBIDogInNlY29uZEEgc2hvdWxkbid0IGhhdmUgYmVlbiBydW4geWV0IjsKKyAgICBhc3NlcnQgIkNlZHJpYyIuZXF1YWxzKHMpIDogIkV4cGVjdGVkIHBhcmFtZXRlciB2YWx1ZSBDZWRyaWMgYnV0IGdvdCAiICsgczsKKyAgICBtX29uZUIgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsgIm9uZSIgfSApCisgIHB1YmxpYyB2b2lkIHNlY29uZEEoKSB7CisvLyAgICBwcHAoInNlY29uZEEiKTsKKyAgICBhc3NlcnQgbV9vbmVBIDogIm9uZUEgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fb25lQiA6ICJvbmVCIHdhc24ndCBydW4iOworICAgIGFzc2VydCAhIG1fc2Vjb25kQSA6ICJzZWNvbmRBIHNob3VsZG4ndCBoYXZlIGJlZW4gcnVuIHlldCI7CisgICAgbV9zZWNvbmRBID0gdHJ1ZTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIGFzc2VydCBtX29uZUEgOiAib25lQSB3YXNuJ3QgcnVuIjsKKyAgICBhc3NlcnQgbV9vbmVCIDogIm9uZUIgd2Fzbid0IHJ1biI7CisgICAgYXNzZXJ0IG1fc2Vjb25kQSA6ICJzZWNvbmRBIHdhc24ndCBydW4iOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NhbXBsZURlcGVuZGVudE1ldGhvZHNdICIgKyBzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kczQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kczQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmIwMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzNC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcworICoKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBTYW1wbGVEZXBlbmRlbnRNZXRob2RzNCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3RlcDEoKSB7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyAic3RlcDEiIH0pCisgIHB1YmxpYyB2b2lkIHN0ZXAyKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKGZhbHNlLCAiUHJvYmxlbSBpbiBzdGVwMiIpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsgInN0ZXAyIiB9KQorICBwdWJsaWMgdm9pZCBzdGVwMygpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzNS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRNZXRob2RzNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMWU1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHM1LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZURlcGVuZGVudE1ldGhvZHM1IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzdGVwMSgpIHsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ICJzdGVwMSIsICJibGFibGFibGEiIH0pCisgIHB1YmxpYyB2b2lkIHN0ZXAyKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHM2LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudE1ldGhvZHM2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjNjBkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvU2FtcGxlRGVwZW5kZW50TWV0aG9kczYuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlRGVwZW5kZW50TWV0aG9kczYgeworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyAic3RlcDIiIH0pCisgIHB1YmxpYyB2b2lkIHN0ZXAxKCkgeworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9IHsgInN0ZXAxIiB9KQorICBwdWJsaWMgdm9pZCBzdGVwMigpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1NhbXBsZURlcGVuZGVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU2ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9TYW1wbGVEZXBlbmRlbnRUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGVEZXBlbmRlbnRUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU0QyLmNsYXNzKTsKKyAgICBTRDIubV9sb2cuY2xlYXIoKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBib29sZWFuIG9uZUEgPSBmYWxzZTsKKyAgICBib29sZWFuIG9uZUIgPSBmYWxzZTsKKyAgICBib29sZWFuIHNlY29uZEEgPSBmYWxzZTsKKworICAgIGZvciAoU3RyaW5nIHMgOiBTRDIubV9sb2cpIHsKKyAgICAgIGlmICgib25lQSIuZXF1YWxzKHMpKSB7CisgICAgICAgIG9uZUEgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKCJvbmVCIi5lcXVhbHMocykpIHsKKyAgICAgICAgb25lQiA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoInNlY29uZEEiLmVxdWFscyhzKSkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvbmVBKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob25lQik7CisgICAgICAgIHNlY29uZEEgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKCJ0aGlyZEEiLmVxdWFscyhzKSkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvbmVBKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob25lQik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNlY29uZEEpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9UZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9UZXN0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2E3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L1Rlc3QxLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50OworCitwdWJsaWMgY2xhc3MgVGVzdDEgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L2Z1bmN0aW9uYWxpdHkxL0NvbmZpZy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9mdW5jdGlvbmFsaXR5MS9Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE0ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9mdW5jdGlvbmFsaXR5MS9Db25maWcuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50LmZ1bmN0aW9uYWxpdHkxOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKKworcHVibGljIGNsYXNzIENvbmZpZyB7CisKKyAgIEBCZWZvcmVTdWl0ZSAoZ3JvdXBzID0gIm90aGVyIikKKyAgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlKCl7CisgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCZWZvcmVTdWl0ZSBncm91cCAnb3RoZXInIik7CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L2Z1bmN0aW9uYWxpdHkxL1Rlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L2Z1bmN0aW9uYWxpdHkxL1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNmI1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvZnVuY3Rpb25hbGl0eTEvVGVzdDEuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50LmZ1bmN0aW9uYWxpdHkxOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdCAoZ3JvdXBzID0gInRlc3RzLmZ1bmN0aW9uYWwucGFja2FnZSIpCitwdWJsaWMgY2xhc3MgVGVzdDEgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0MV8xKCl7CisgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IDFfMSIpOworICAgfQorICAgcHVibGljIHZvaWQgdGVzdDFfMigpeworICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAxXzIiKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvZnVuY3Rpb25hbGl0eTEvVGVzdDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQvZnVuY3Rpb25hbGl0eTEvVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ1NTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC9mdW5jdGlvbmFsaXR5MS9UZXN0Mi5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRlbnQuZnVuY3Rpb25hbGl0eTE7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGdyb3VwcyA9ICJ0ZXN0cy5mdW5jdGlvbmFsLnVwbG9hZCIsIGRlcGVuZHNPbkdyb3VwcyA9ICJ0ZXN0cy5mdW5jdGlvbmFsLnBhY2thZ2UiKQorcHVibGljIGNsYXNzIFRlc3QyIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0Ml8xKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAyXzEiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3QyXzIoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IDJfMiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L3htbC9Hcm91cERlcGVuZGVuY3lTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L3htbC9Hcm91cERlcGVuZGVuY3lTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5Nzg5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRlbnQveG1sL0dyb3VwRGVwZW5kZW5jeVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kZW50LnhtbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEdyb3VwRGVwZW5kZW5jeVNhbXBsZVRlc3QgeworCisgIEBUZXN0KGdyb3VwcyA9ICJhIikKKyAgcHVibGljIHZvaWQgYTEoKSB7fQorCisgIEBUZXN0KGdyb3VwcyA9ICJiIikKKyAgcHVibGljIHZvaWQgYjEoKSB7fQorCisgIEBUZXN0KGdyb3VwcyA9ICJjIikKKyAgcHVibGljIHZvaWQgYzEoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC94bWwvR3JvdXBEZXBlbmRlbmN5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZGVudC94bWwvR3JvdXBEZXBlbmRlbmN5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NjAzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kZW50L3htbC9Hcm91cERlcGVuZGVuY3lUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZGVudC54bWw7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR3JvdXBEZXBlbmRlbmN5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImExIiwgImIxIiwgImMxIiB9IH0sCisgICAgICBuZXcgT2JqZWN0W10geyBuZXcgU3RyaW5nW10geyAiYSIsICJjIiwgImIiLCAiYTEiLCAiYzEiLCAiYjEiIH0gfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBTdHJpbmdbXSB7ICJiIiwgImEiLCAiYyIsICJiMSIsICJhMSIsICJjMSIgfSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IFN0cmluZ1tdIHsgImIiLCAiYyIsICJhIiwgImIxIiwgImMxIiwgImExIiB9IH0sCisgICAgICBuZXcgT2JqZWN0W10geyBuZXcgU3RyaW5nW10geyAiYyIsICJiIiwgImEiLCAiYzEiLCAiYjEiLCAiYTEiIH0gfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBTdHJpbmdbXSB7ICJjIiwgImEiLCAiYiIsICJjMSIsICJhMSIsICJiMSIgfSB9LAorICAgIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCB2ZXJpZnlHcm91cFNpbmdsZShTdHJpbmdbXSBhKSB7CisgICAgY29uZmlndXJlR3JvdXAoYSwgZmFsc2UgLyogc2luZ2xlICovKTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcCIpCisgIHB1YmxpYyB2b2lkIHZlcmlmeUdyb3VwTXVsdGkoU3RyaW5nW10gYSkgeworICAgIGNvbmZpZ3VyZUdyb3VwKGEsIHRydWUgLyogbXVsdGkgKi8pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUdyb3VwKFN0cmluZ1tdIGEsIGJvb2xlYW4gbXVsdGkpIHsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IGNyZWF0ZVhtbFN1aXRlKCJEZXBlbmRlbmNpZXMiKTsKKyAgICBYbWxUZXN0IHRlc3QgPQorICAgICAgICBjcmVhdGVYbWxUZXN0KHN1aXRlLCAiRGVwZW5kZW5jeVRlc3QiLCBHcm91cERlcGVuZGVuY3lTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgaWYgKG11bHRpKSB7CisgICAgICB0ZXN0LmFkZFhtbERlcGVuZGVuY3lHcm91cChhWzJdLCBhWzFdICsgIiAiICsgYVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRlc3QuYWRkWG1sRGVwZW5kZW5jeUdyb3VwKGFbMl0sIGFbMV0pOworICAgICAgdGVzdC5hZGRYbWxEZXBlbmRlbmN5R3JvdXAoYVsxXSwgYVswXSk7CisgICAgfQorCisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzdWl0ZSkpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBMaXN0PElUZXN0UmVzdWx0PiB0ID0gdGxhLmdldFBhc3NlZFRlc3RzKCk7CisgICAgU3RyaW5nIG1ldGhvZDIgPSB0LmdldCgyKS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCk7CisgICAgaWYgKG11bHRpKSB7CisgICAgICAvLyBXaGVuIHdlIGhhdmUgImEgZGVwZW5kcyBvbiBncm91cHMgYiBhbmQgYyIsIHRoZSBvbmx5IGNlcnRhaW50eSBpcyB0aGF0ICJhIgorICAgICAgLy8gd2lsbCBiZSBydW4gbGFzdAorICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXRob2QyLCBhWzVdKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0VGVzdFJlc3VsdHNFcXVhbCh0bGEuZ2V0UGFzc2VkVGVzdHMoKSwgQXJyYXlzLmFzTGlzdChhWzNdLCBhWzRdLCBhWzVdKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvRGVwZW5kc09uR3JvdXBzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL0RlcGVuZHNPbkdyb3Vwc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI3ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL0RlcGVuZHNPbkdyb3Vwc1Rlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIHRlc3QuZGVwZW5kc29uZ3JvdXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgRGVwZW5kc09uR3JvdXBzVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2RzU2hvdWxkQmVHcm91cGVkQnlDbGFzc2VzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUobmV3IENsYXNzW10geworICAgICAgICBaZXJvU2FtcGxlVGVzdC5jbGFzcywgRmlyc3RTYW1wbGVUZXN0LmNsYXNzLCBTZWNvbmRTYW1wbGVUZXN0LmNsYXNzCisgICAgfSk7CisKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgInplcm9BIiwgInplcm9CIiwKKyAgICAgICAgImZpcnN0QSIsICJmaXJzdEIiLAorICAgICAgICAic2Vjb25kQSIsICJzZWNvbmRCIgorICAgIH07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgeworICAgICAgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldChpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdFJlc3VsdC5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksIGV4cGVjdGVkW2ldKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9GaXJzdFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9GaXJzdFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIzNTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL0ZpcnN0U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRzb25ncm91cDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzID0geyAiZmlyc3QiIH0sIGRlcGVuZHNPbkdyb3VwcyA9IHsgInplcm8iIH0pCitwdWJsaWMgY2xhc3MgRmlyc3RTYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmaXJzdEEoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpcnN0QSIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmlyc3RCKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJmaXJzdEIiKTsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9TZWNvbmRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvU2Vjb25kU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTBkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvU2Vjb25kU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5kZXBlbmRzb25ncm91cDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzID0geyAic2Vjb25kIiB9LCBkZXBlbmRzT25Hcm91cHMgPSB7ICJ6ZXJvIiB9KQorcHVibGljIGNsYXNzIFNlY29uZFNhbXBsZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNlY29uZEEoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlY29uZEEiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNlY29uZEIoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlY29uZEIiKTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL1Rlc3RGaXh0dXJlMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL1Rlc3RGaXh0dXJlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTIwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvVGVzdEZpeHR1cmUxLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZHNvbmdyb3VwOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0Rml4dHVyZTEgeworICBAQmVmb3JlVGVzdChncm91cHM9eyJ0ZXN0IiwgInRlc3Rncm91cCJ9KQorICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvVGVzdEZpeHR1cmUyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvVGVzdEZpeHR1cmUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3OWQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9UZXN0Rml4dHVyZTIuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZGVwZW5kc29uZ3JvdXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0Rml4dHVyZTIgeworICBAQmVmb3JlVGVzdChncm91cHM9eyJ0ZXN0In0sIGRlcGVuZHNPbkdyb3Vwcz17InRlc3Rncm91cCJ9KQorICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgfQorCisgIEBUZXN0KGdyb3Vwcz17InRlc3QifSkgIC8vQEAKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL1plcm9TYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGVwZW5kc29uZ3JvdXAvWmVyb1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJhMDdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL1plcm9TYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LmRlcGVuZHNvbmdyb3VwOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHMgPSB7ICJ6ZXJvIiB9KQorcHVibGljIGNsYXNzIFplcm9TYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB6ZXJvQSgpIHsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiemVyb0EiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHplcm9CKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJ6ZXJvQiIpOworICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2RlcGVuZHNvbmdyb3VwL3N1aXRlLnhtbCBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9zdWl0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjMTgyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kZXBlbmRzb25ncm91cC9zdWl0ZS54bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KKworPHN1aXRlIG5hbWU9IndlYnB1YmxpYyIgdmVyYm9zZT0iMTAiPgorICAgIDx0ZXN0IG5hbWU9InRlc3QiPgorICAgICAgICA8Z3JvdXBzPgorICAgICAgICAgICAgPHJ1bj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0IiAvPgorICAgICAgICAgICAgPC9ydW4+CisgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAKKyAgICAgICAgPHBhY2thZ2VzPgorICAgICAgICAgICAgPHBhY2thZ2UgbmFtZT0idGVzdC5kZXBlbmRzb25ncm91cCIgLz4KKyAgICAgICAgPC9wYWNrYWdlcz4KKyAgICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kaXN0cmlidXRlZC9EaXN0cmlidXRlZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kaXN0cmlidXRlZC9EaXN0cmlidXRlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEzNjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Rpc3RyaWJ1dGVkL0Rpc3RyaWJ1dGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACitwYWNrYWdlIHRlc3QuZGlzdHJpYnV0ZWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuU3VpdGVEaXNwYXRjaGVyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VEaXN0cmlidXRlZFRlc3Q7CitpbXBvcnQgdGVzdGhlbHBlci5PdXRwdXREaXJlY3RvcnlQYXRjaDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitwdWJsaWMgY2xhc3MgRGlzdHJpYnV0ZWRUZXN0IGV4dGVuZHMgQmFzZURpc3RyaWJ1dGVkVGVzdCB7CisKKyAgcHJpdmF0ZSBMaXN0PFRocmVhZD4gbV9ob3N0VGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgIHByb3RlY3RlZCBUaHJlYWQgc3RhcnRTbGF2ZShmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICBUaHJlYWQgcmVzdWx0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgVGVzdE5HLm1haW4obmV3IFN0cmluZ1tdIHsgIi1zbGF2ZSIsIGZpbGVuYW1lLCAiLWQiLCBPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSB9KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXN1bHQuc2V0TmFtZSgiU2xhdmUtIiArIGZpbGVuYW1lKTsKKyAgICByZXN1bHQuc3RhcnQoKTsKKyAgICBtX2hvc3RUaHJlYWRzLmFkZChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIEZpbGUgY3JlYXRlTWFzdGVyUHJvcGVydGllcyhTdHJpbmcgc3RyYXRlZ3kpCisgIHRocm93cyBJT0V4Y2VwdGlvbgorICB7CisgICAgU3RyaW5nIGZpbGVOYW1lID0gInJlbW90ZSI7CisKKyAgICBGaWxlIHJlc3VsdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUsICIucHJvcGVydGllcyIpOworICAgIHJlc3VsdC5kZWxldGVPbkV4aXQoKTsKKyAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgIHAuc2V0UHJvcGVydHkoInRlc3RuZy5ob3N0cyIsICJsb2NhbGhvc3Q6IiArIG1fcG9ydHNbMF0gKyAiIGxvY2FsaG9zdDoiICsgbV9wb3J0c1sxXSk7CisgICAgcC5zZXRQcm9wZXJ0eSgidGVzdG5nLm1hc3Rlci5zdHJhdGVneSIsIHN0cmF0ZWd5KTsKKyAgICBwLnNldFByb3BlcnR5KCJ0ZXN0bmcudmVyYm9zZSIsICIwIik7CisgICAgcC5zZXRQcm9wZXJ0eSgidGVzdG5nLm1hc3Rlci5hZHB0ZXIiLCAib3JnLnRlc3RuZy5yZW1vdGUuYWRhcHRlci5EZWZhdWx0TWFzdGVydEFkYXB0ZXIiKTsKKyAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlc3VsdCk7CisgICAgcC5zdG9yZShmb3MsICJBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0ZXN0cyIpOworICAgIGZvcy5jbG9zZSgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgRmlsZSBjcmVhdGVTbGF2ZVByb3BlcnRpZXMoU3RyaW5nIHBvcnQpCisgIHRocm93cyBJT0V4Y2VwdGlvbgorICB7CisgICAgU3RyaW5nIGZpbGVOYW1lID0gInJlbW90ZSI7CisKKyAgICBGaWxlIHJlc3VsdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZmlsZU5hbWUsICIucHJvcGVydGllcyIpOworICAgIHJlc3VsdC5kZWxldGVPbkV4aXQoKTsKKyAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgIHAuc2V0UHJvcGVydHkoInRlc3RuZy52ZXJib3NlIiwgIjAiKTsKKyAgICBwLnNldFByb3BlcnR5KCJzbGF2ZS5wb3J0IiwgcG9ydCk7CisgICAgcC5zZXRQcm9wZXJ0eSgidGVzdG5nLnNsYXZlLmFkcHRlciIsICJvcmcudGVzdG5nLnJlbW90ZS5hZGFwdGVyLkRlZmF1bHRXb3JrZXJBZGFwdGVyIik7CisgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZXN1bHQpOworICAgIHAuc3RvcmUoZm9zLCAiQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGVzdHMiKTsKKyAgICBmb3MuY2xvc2UoKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIFhtbFN1aXRlIGNyZWF0ZVN1aXRlKFN0cmluZyBuYW1lLCBDbGFzc1tdIGNsYXNzZXMpIHsKKyAgICBYbWxTdWl0ZSByZXN1bHQgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICByZXN1bHQuc2V0TmFtZShuYW1lKTsKKworICAgIGZvciAoQ2xhc3MgYyA6IGNsYXNzZXMpIHsKKyAgICAgIFhtbFRlc3QgdGVzdDEgPSBuZXcgWG1sVGVzdChyZXN1bHQpOworICAgICAgdGVzdDEuc2V0TmFtZShjLmdldE5hbWUoKSk7CisgICAgICBYbWxDbGFzcyBjbGFzczEgPSBuZXcgWG1sQ2xhc3MoYyk7CisgICAgICB0ZXN0MS5nZXRYbWxDbGFzc2VzKCkuYWRkKGNsYXNzMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisvLyAgQCBDb25maWd1cmF0aW9uKGJlZm9yZVRlc3RDbGFzcyA9IHRydWUpCisgIHByaXZhdGUgdm9pZCBzdGFydFNsYXZlcygpIHRocm93cyBJT0V4Y2VwdGlvbnsKKwkgIGludCBwb3J0ID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoNTAwMDApICsgMjAwMDsKKwkgIG1fcG9ydHMgPSBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQrMSl9OworCisJICBGaWxlIHNsYXZlRmlsZSA9IGNyZWF0ZVNsYXZlUHJvcGVydGllcyhtX3BvcnRzWzBdKTsKKwkgIHN0YXJ0U2xhdmUoIHNsYXZlRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOworCisJICBzbGF2ZUZpbGUgPSBjcmVhdGVTbGF2ZVByb3BlcnRpZXMobV9wb3J0c1sxXSk7CisJICBzdGFydFNsYXZlKCBzbGF2ZUZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gbV9wb3J0cyA9IG5ldyBTdHJpbmdbMl07CisKKyAgcHVibGljIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdHdvSG9zdHMoU3RyaW5nIHN0cmF0ZWd5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdG5nLnNldE91dHB1dERpcmVjdG9yeShPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSk7CisKKyAgICBGaWxlIG1hc3RlckZpbGUgPSBjcmVhdGVNYXN0ZXJQcm9wZXJ0aWVzKHN0cmF0ZWd5KTsKKyAgICB0bmcuc2V0TWFzdGVyKG1hc3RlckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgWG1sU3VpdGUgc3VpdGUgPSBjcmVhdGVTdWl0ZSgiRGlzdHJpYnV0ZWRTdWl0ZTEiLCBuZXcgQ2xhc3NbXSB7IFRlc3QxLmNsYXNzLCBUZXN0Mi5jbGFzcyB9KTsKKyAgICB0bmcuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3QobmV3IFhtbFN1aXRlW10geyBzdWl0ZSB9KSk7CisKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHJlc3VsdCA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHJlc3VsdCk7CisgICAgdG5nLnJ1bigpOworCisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAiZjEiLCAiZjIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7fTsKKyAgICBTdHJpbmdbXSBza2lwcGVkID0ge307CisKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCB0b01hcChyZXN1bHQuZ2V0UGFzc2VkVGVzdHMoKSkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIHRvTWFwKHJlc3VsdC5nZXRGYWlsZWRUZXN0cygpKSk7CisgICAgdmVyaWZ5VGVzdHMoIlNraXBwZWQiLCBza2lwcGVkLCB0b01hcChyZXN1bHQuZ2V0U2tpcHBlZFRlc3RzKCkpKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0d29Ib3N0c1dpdGhUZXN0U3RyYXRlZ3koKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXJ0U2xhdmVzKCk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBsaXN0ZW5lciA9IHR3b0hvc3RzKFN1aXRlRGlzcGF0Y2hlci5TVFJBVEVHWV9URVNUKTsKKworICAgIGJvb2xlYW4gZm91bmQxID0gZmFsc2U7CisgICAgYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKKyAgICBmb3IgKElUZXN0UmVzdWx0IHRyIDogbGlzdGVuZXIuZ2V0UGFzc2VkVGVzdHMoKSkgeworICAgICAgU3RyaW5nIGhvc3QgPSB0ci5nZXRIb3N0KCk7CisgICAgICBpZiAoISBmb3VuZDEpIHsKKyAgICAgICAgZm91bmQxID0gaG9zdC5jb250YWlucyhtX3BvcnRzWzBdKTsKKyAgICAgIH0KKyAgICAgIGlmICghIGZvdW5kMikgeworICAgICAgICBmb3VuZDIgPSBob3N0LmNvbnRhaW5zKG1fcG9ydHNbMV0pOworICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3VuZDEsICJObyB0ZXN0cyByYW4gb24gcG9ydCAiICsgbV9wb3J0c1swXSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZm91bmQyLCAiTm8gdGVzdHMgcmFuIG9uIHBvcnQgIiArIG1fcG9ydHNbMV0pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdHdvSG9zdHNXaXRoU3VpdGVTdHJhdGVneSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnRTbGF2ZXMoKTsKKyAgICB0d29Ib3N0cyhTdWl0ZURpc3BhdGNoZXIuU1RSQVRFR1lfU1VJVEUpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJVGVzdFJlc3VsdD4gdG9NYXAoTGlzdDxJVGVzdFJlc3VsdD4gcmVzdWx0cykgeworICAgIE1hcDxTdHJpbmcsIElUZXN0UmVzdWx0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgZm9yIChJVGVzdFJlc3VsdCB0ciA6IHJlc3VsdHMpIHsKKyAgICAgIHJlc3VsdC5wdXQodHIuZ2V0TmFtZSgpLCB0cik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltEaXN0cmlidXRlZFRlc3RdICIgKyBzdHJpbmcpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9kaXN0cmlidXRlZC9UZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2Rpc3RyaWJ1dGVkL1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYWE0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9kaXN0cmlidXRlZC9UZXN0MS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgdGVzdC5kaXN0cmlidXRlZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3QxIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEoKSB7CisvLyAgICBwcHAoImYxIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdDFdICIgKyBzKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZGlzdHJpYnV0ZWQvVGVzdDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9kaXN0cmlidXRlZC9UZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiN2I2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZGlzdHJpYnV0ZWQvVGVzdDIuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuZGlzdHJpYnV0ZWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0MiB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyKCkgeworLy8gICAgcHBwKCJmMiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3QyXSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvQS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNzlhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvQS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgdGVzdC5lbmFibGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0QSgpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEEyKCkge30KKworICBAVGVzdChlbmFibGVkID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgdGVzdEEzKCkge30KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGVuYWJsZWQgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZUEyKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEJlZm9yZVN1aXRlQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZU5vUnVuQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGVOb1J1bkEyKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRCZWZvcmVTdWl0ZU5vUnVuQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlUnVuQSgpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZVJ1bkEyKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEJlZm9yZVN1aXRlUnVuQSgpIHt9CisKKyAgQEFmdGVyU3VpdGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZUEoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlQTIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRBZnRlclN1aXRlQSgpIHt9CisKKyAgQEFmdGVyU3VpdGUoYWx3YXlzUnVuID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGVOb1J1bkEoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZU5vUnVuQTIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSwgYWx3YXlzUnVuID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQWZ0ZXJTdWl0ZU5vUnVuQSgpIHt9CisKKyAgQEFmdGVyU3VpdGUoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZVJ1bkEoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlUnVuQTIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSwgYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRBZnRlclN1aXRlUnVuQSgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOWM0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0IuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIHRlc3QuZW5hYmxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChlbmFibGVkID0gZmFsc2UpCitwdWJsaWMgY2xhc3MgQiB7CisKKyAgcHVibGljIHZvaWQgdGVzdEIoKSB7fQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCMigpIHt9CisKKyAgQFRlc3QoZW5hYmxlZCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIHRlc3RCMygpIHt9CisKKyAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShlbmFibGVkID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRCZWZvcmVTdWl0ZUIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEJlZm9yZVN1aXRlQjIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQmVmb3JlU3VpdGVCMygpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZU5vUnVuQigpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGVOb1J1bkIyKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRCZWZvcmVTdWl0ZU5vUnVuQigpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlUnVuQigpIHt9CisKKyAgQEJlZm9yZVN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZVJ1bkIyKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEJlZm9yZVN1aXRlUnVuQigpIHt9CisKKyAgQEFmdGVyU3VpdGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZUIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlQjIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRBZnRlclN1aXRlQigpIHt9CisKKyAgQEFmdGVyU3VpdGUoYWx3YXlzUnVuID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGVOb1J1bkIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZU5vUnVuQjIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSwgYWx3YXlzUnVuID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQWZ0ZXJTdWl0ZU5vUnVuQigpIHt9CisKKyAgQEFmdGVyU3VpdGUoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZVJ1bkIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSB0cnVlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlUnVuQjIoKSB7fQorCisgIEBBZnRlclN1aXRlKGVuYWJsZWQgPSBmYWxzZSwgYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRBZnRlclN1aXRlUnVuQigpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjdhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0MuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIHRlc3QuZW5hYmxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIEMgeworCisgIHB1YmxpYyB2b2lkIHRlc3RDKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QzIoKSB7fQorCisgIEBUZXN0KGVuYWJsZWQgPSB0cnVlKQorICBwdWJsaWMgdm9pZCB0ZXN0QzMoKSB7fQorCisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRDKCkge30KKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGVDKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlQzIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQmVmb3JlU3VpdGVDKCkge30KKworICBAQmVmb3JlU3VpdGUoYWx3YXlzUnVuID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlTm9SdW5DKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IHRydWUsIGFsd2F5c1J1biA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZU5vUnVuQzIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShlbmFibGVkID0gZmFsc2UsIGFsd2F5c1J1biA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEJlZm9yZVN1aXRlTm9SdW5DKCkge30KKworICBAQmVmb3JlU3VpdGUoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGVSdW5DKCkge30KKworICBAQmVmb3JlU3VpdGUoZW5hYmxlZCA9IHRydWUsIGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlUnVuQzIoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShlbmFibGVkID0gZmFsc2UsIGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGRpc2FibGVkQmVmb3JlU3VpdGVSdW5DKCkge30KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlQygpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGVDMigpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEFmdGVyU3VpdGVDKCkge30KKworICBAQWZ0ZXJTdWl0ZShhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZU5vUnVuQygpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IHRydWUsIGFsd2F5c1J1biA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlTm9SdW5DMigpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRBZnRlclN1aXRlTm9SdW5DKCkge30KKworICBAQWZ0ZXJTdWl0ZShhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlUnVuQygpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IHRydWUsIGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGVSdW5DMigpIHt9CisKKyAgQEFmdGVyU3VpdGUoZW5hYmxlZCA9IGZhbHNlLCBhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEFmdGVyU3VpdGVSdW5DKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvRW5hYmxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9FbmFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5YjBmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvRW5hYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgdGVzdC5lbmFibGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIEVuYWJsZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZGlzYWJsZWRfbWV0aG9kc19zaG91bGRfbm90X2JlX3J1bigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEEuY2xhc3MsIEIuY2xhc3MsIEMuY2xhc3MpOworICAgIEludm9rZWRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHRuZy5zZXRQcmVzZXJ2ZU9yZGVyKHRydWUpOworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRoYXQobGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZHMoKSkuY29udGFpbnNFeGFjdGx5KAorICAgICAgICAiYmVmb3JlU3VpdGVBIiwgImJlZm9yZVN1aXRlQTIiLCAiYmVmb3JlU3VpdGVOb1J1bkEiLCAiYmVmb3JlU3VpdGVOb1J1bkEyIiwgImJlZm9yZVN1aXRlUnVuQSIsICJiZWZvcmVTdWl0ZVJ1bkEyIiwKKyAgICAgICAgImJlZm9yZVN1aXRlUnVuQiIsICJiZWZvcmVTdWl0ZVJ1bkIyIiwKKyAgICAgICAgImJlZm9yZVN1aXRlQyIsICJiZWZvcmVTdWl0ZUMyIiwgImJlZm9yZVN1aXRlTm9SdW5DIiwgImJlZm9yZVN1aXRlTm9SdW5DMiIsICJiZWZvcmVTdWl0ZVJ1bkMiLCAiYmVmb3JlU3VpdGVSdW5DMiIsCisgICAgICAgICJ0ZXN0QTIiLCAidGVzdEEzIiwgInRlc3RCMiIsICJ0ZXN0QjMiLCAidGVzdEMiLCAidGVzdEMyIiwgInRlc3RDMyIsCisgICAgICAgICJhZnRlclN1aXRlQSIsICJhZnRlclN1aXRlQTIiLCAiYWZ0ZXJTdWl0ZU5vUnVuQSIsICJhZnRlclN1aXRlTm9SdW5BMiIsICJhZnRlclN1aXRlUnVuQSIsICJhZnRlclN1aXRlUnVuQTIiLAorICAgICAgICAiYWZ0ZXJTdWl0ZVJ1bkIiLCAiYWZ0ZXJTdWl0ZVJ1bkIyIiwKKyAgICAgICAgImFmdGVyU3VpdGVDIiwgImFmdGVyU3VpdGVDMiIsICJhZnRlclN1aXRlTm9SdW5DIiwgImFmdGVyU3VpdGVOb1J1bkMyIiwgImFmdGVyU3VpdGVSdW5DIiwgImFmdGVyU3VpdGVSdW5DMiIKKyAgICApOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiaHR0cHM6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmcvaXNzdWVzLzQyMCIpCisgIHB1YmxpYyB2b2lkIGlzc3VlNDIwKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoSXNzdWU0MjBGaXJzdFNhbXBsZS5jbGFzcywgSXNzdWU0MjBTZWNvbmRTYW1wbGUuY2xhc3MpOworICAgIEludm9rZWRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRoYXQobGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZHMoKSkuY29udGFpbnNFeGFjdGx5KAorICAgICAgICAiYWx3YXlzQmVmb3JlU3VpdGUiLCAiYmVmb3JlU3VpdGUiLAorICAgICAgICAidmVyaWZ5U29tZXRoaW5nRmlyc3RTYW1wbGUiLCAidmVyaWZ5U29tZXRoaW5nU2Vjb25kU2FtcGxlIiwKKyAgICAgICAgImFmdGVyU3VpdGUiLCAiYWx3YXlzQWZ0ZXJTdWl0ZSIKKyAgICApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0ludm9rZWRNZXRob2RMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9JbnZva2VkTWV0aG9kTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI2OGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9JbnZva2VkTWV0aG9kTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIHRlc3QuZW5hYmxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEludm9rZWRNZXRob2RMaXN0ZW5lciBpbXBsZW1lbnRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIgeworCisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGludm9rZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgaW52b2tlZE1ldGhvZHMuYWRkKG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZnRlckludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEludm9rZWRNZXRob2RzKCkgeworICAgIHJldHVybiBpbnZva2VkTWV0aG9kczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9Jc3N1ZTQyMEJhc2VUZXN0Q2FzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9Jc3N1ZTQyMEJhc2VUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDVkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZW5hYmxlL0lzc3VlNDIwQmFzZVRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LmVuYWJsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSXNzdWU0MjBCYXNlVGVzdENhc2UgeworCisgIEBCZWZvcmVTdWl0ZShhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgc3RhdGljIHZvaWQgYWx3YXlzQmVmb3JlU3VpdGUoKSB7fQorCisgIEBCZWZvcmVTdWl0ZShhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZVN1aXRlKCkge30KKworICBAQWZ0ZXJTdWl0ZShhbHdheXNSdW4gPSBmYWxzZSkKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyU3VpdGUoKSB7fQorCisgIEBBZnRlclN1aXRlKGFsd2F5c1J1biA9IHRydWUpCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbHdheXNBZnRlclN1aXRlKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvSXNzdWU0MjBGaXJzdFNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9Jc3N1ZTQyMEZpcnN0U2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZWZkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvSXNzdWU0MjBGaXJzdFNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5lbmFibGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGVuYWJsZWQgPSBmYWxzZSkKK3B1YmxpYyBjbGFzcyBJc3N1ZTQyMEZpcnN0U2FtcGxlIGV4dGVuZHMgSXNzdWU0MjBCYXNlVGVzdENhc2UgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeVNvbWV0aGluZ0ZpcnN0U2FtcGxlKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvSXNzdWU0MjBTZWNvbmRTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9lbmFibGUvSXNzdWU0MjBTZWNvbmRTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M2Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2VuYWJsZS9Jc3N1ZTQyMFNlY29uZFNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5lbmFibGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgSXNzdWU0MjBTZWNvbmRTYW1wbGUgZXh0ZW5kcyBJc3N1ZTQyMEJhc2VUZXN0Q2FzZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5U29tZXRoaW5nU2Vjb25kU2FtcGxlKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvRXhwZWN0ZWRFeGNlcHRpb25zVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9FeHBlY3RlZEV4Y2VwdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwNjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvRXhwZWN0ZWRFeGNlcHRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5leHBlY3RlZGV4Y2VwdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgRXhwZWN0ZWRFeGNlcHRpb25zVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleHBlY3RlZEV4Y2VwdGlvbnNEZXByZWNhdGVkU3ludGF4KCkgeworICAgIHJ1blRlc3QoInRlc3QuZXhwZWN0ZWRleGNlcHRpb25zLlNhbXBsZUV4Y2VwdGlvbnMiLAorICAgICAgICBuZXcgU3RyaW5nW10geyAic2hvdWxkUGFzcyIgfSwKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgInNob3VsZEZhaWwxIiwgInNob3VsZEZhaWwyIiwgInNob3VsZEZhaWwzIiB9LAorICAgICAgICBuZXcgU3RyaW5nW10ge30pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZXhwZWN0ZWRFeGNlcHRpb25zKCkgeworICAgIHJ1blRlc3QoInRlc3QuZXhwZWN0ZWRleGNlcHRpb25zLlNhbXBsZUV4Y2VwdGlvbnMyIiwKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgInNob3VsZFBhc3MiLCAic2hvdWxkUGFzczIiLCAic2hvdWxkUGFzczMiLCAic2hvdWxkUGFzczQiIH0sCisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJzaG91bGRGYWlsMSIsICJzaG91bGRGYWlsMiIsICJzaG91bGRGYWlsMyIsICJzaG91bGRGYWlsNCIgfSwKKyAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKyAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9QYXJhbWV0ZXJzRXhjZXB0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9QYXJhbWV0ZXJzRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzRhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZXhwZWN0ZWRleGNlcHRpb25zL1BhcmFtZXRlcnNFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB0ZXN0LmV4cGVjdGVkZXhjZXB0aW9uczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQoraW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFBhcmFtZXRlcnNFeGNlcHRpb25UZXN0IHsNCisgICAgQFRlc3QoZGF0YVByb3ZpZGVyPSJBIikNCisgICAgcHVibGljIHZvaWQgdGVzdEEoRXhjZXB0aW9uIGVycikgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdEEiKTsNCisgICAgfQ0KKw0KKyAgICBARGF0YVByb3ZpZGVyKG5hbWU9IkEiKQ0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0W11bXSBkcCgpIHsNCisgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geyB7bmV3IElPRXhjZXB0aW9uKCksIG5ldyBTQVhFeGNlcHRpb24oKSB9IH07DQorICAgIH0NCisNCisgICAgQEFmdGVyTWV0aG9kDQorICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeShNZXRob2QgbWV0aG9kKSB7DQorICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UsICJmb3JjZWQgZmFpbHVyZSIpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvU2FtcGxlRXhjZXB0aW9ucy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9TYW1wbGVFeGNlcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3MmFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvU2FtcGxlRXhjZXB0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgdGVzdC5leHBlY3RlZGV4Y2VwdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkV4cGVjdGVkRXhjZXB0aW9uczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyB0ZXN0cyBARXhwZWN0ZWRFeGNlcHRpb25zCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZUV4Y2VwdGlvbnMgeworCisgIEBUZXN0CisgIEBFeHBlY3RlZEV4Y2VwdGlvbnMoeyBOdW1iZXJGb3JtYXRFeGNlcHRpb24uY2xhc3N9ICkKKyAgcHVibGljIHZvaWQgc2hvdWxkUGFzcygpIHsKKyAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CisgIH0KKworICBAVGVzdAorICBARXhwZWN0ZWRFeGNlcHRpb25zKHsgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzfSApCisgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwxKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworICBAVGVzdAorICBARXhwZWN0ZWRFeGNlcHRpb25zKHsgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzfSApCisgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwyKCkgeworICB9CisKKyAgQFRlc3QKKyAgQEV4cGVjdGVkRXhjZXB0aW9ucyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCBzaG91bGRGYWlsMygpIHsKKyAgfQorLy8gIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykKKy8vICBwdWJsaWMgdm9pZCB0aHJvd1dyb25nRXhjZXB0aW9uKCkgeworLy8gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKy8vICB9CisKKy8vICBAVGVzdAorLy8gIEBFeHBlY3RlZEV4Y2VwdGlvbnMoeyBGaWxlTm90Rm91bmRFeGNlcHRpb24uY2xhc3MsIElPRXhjZXB0aW9uLmNsYXNzIH0pCisvLyAgcHVibGljIHZvaWQgc2hvdWxkUGFzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKKy8vICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvU2FtcGxlRXhjZXB0aW9uczIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvU2FtcGxlRXhjZXB0aW9uczIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ3YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9TYW1wbGVFeGNlcHRpb25zMi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2UgdGVzdC5leHBlY3RlZGV4Y2VwdGlvbnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyB0ZXN0cyBARXhwZWN0ZWRFeGNlcHRpb25zCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZUV4Y2VwdGlvbnMyIHsKKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uY2xhc3MgKQorICBwdWJsaWMgdm9pZCBzaG91bGRQYXNzKCkgeworICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgc2hvdWxkRmFpbDEoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgc2hvdWxkRmFpbDIoKSB7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uY2xhc3MsCisgICAgICBleHBlY3RlZEV4Y2VwdGlvbnNNZXNzYWdlUmVnRXhwID0gIi4qYm9tYi4qIikKKyAgcHVibGljIHZvaWQgc2hvdWxkUGFzczIoKSB7CisgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGJvbWIgYXQgYWxsIik7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uY2xhc3MsCisgICAgICBleHBlY3RlZEV4Y2VwdGlvbnNNZXNzYWdlUmVnRXhwID0gIi4qYm9tYmMuKiIpCisgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwzKCkgeworICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJvbWIgZm9yIGdvb2QiKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcywgZXhwZWN0ZWRFeGNlcHRpb25zTWVzc2FnZVJlZ0V4cCA9ICIuKiIpCisgIHB1YmxpYyB2b2lkIHNob3VsZFBhc3MzKCkgeworICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24obnVsbCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uY2xhc3MsIGV4cGVjdGVkRXhjZXB0aW9uc01lc3NhZ2VSZWdFeHAgPSAiTXVsdGlsaW5lLioiKQorICBwdWJsaWMgdm9pZCBzaG91bGRQYXNzNCgpIHsKKyAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJNdWx0aWxpbmVcbkV4Y2VwdGlvbiIpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgc2hvdWxkRmFpbDQoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvV3JhcHBlZEV4cGVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2V4cGVjdGVkZXhjZXB0aW9ucy9XcmFwcGVkRXhwZWN0ZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5OTM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9leHBlY3RlZGV4Y2VwdGlvbnMvV3JhcHBlZEV4cGVjdGVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5leHBlY3RlZGV4Y2VwdGlvbnM7CisKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRXhwZWN0ZWRFeGNlcHRpb25zOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFdyYXBwZWRFeHBlY3RlZEV4Y2VwdGlvblRlc3QgeworICBAVGVzdCh0aW1lT3V0ID0gMTAwMEwpCisgIEBFeHBlY3RlZEV4Y2VwdGlvbnMoeyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MgfSkKKyAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXQoKSB7CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwZWN0ZWQgZmFpbHVyZSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9CYWRGYWN0b3J5TWV0aG9kUmV0dXJuVHlwZVNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvQmFkRmFjdG9yeU1ldGhvZFJldHVyblR5cGVTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE1NzkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvQmFkRmFjdG9yeU1ldGhvZFJldHVyblR5cGVTYW1wbGUuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEJhZEZhY3RvcnlNZXRob2RSZXR1cm5UeXBlU2FtcGxlIHsKKworICAgIEBGYWN0b3J5CisgICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlSW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICBuZXcgQmFzZUZhY3RvcnkoNDIpLAorICAgICAgICAgICAgICAgIG5ldyBCYXNlRmFjdG9yeSg0MykKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9CYXNlRmFjdG9yeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvQmFzZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQyZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvQmFzZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEJhc2VGYWN0b3J5IHsKKworICBwcml2YXRlIGludCBtX247CisKKyAgcHVibGljIEJhc2VGYWN0b3J5KGludCBuKSB7CisgICAgbV9uID0gbjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TigpIHsKKyAgICByZXR1cm4gbV9uOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHsKKyAgfQorCisgIC8qKgorICAgKiBAQEAgZm9yIHNvbWUgcmVhc29uLCB0aGUgdGVzdCByZXN1bHRzIGdldCBhZGRlZCBpbiB0aGUgd3Jvbmcgb3JkZXIgaWYKKyAgICogSSBkb24ndCBkZWZpbmUgYSB0b1N0cmluZygpIG1ldGhvZC4gTmVlZCB0byBpbnZlc3RpZ2F0ZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiWyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgIiArIGdldE4oKSArICJdIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRFBDbGFzcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRFBDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmUwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9EUENsYXNzLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKKworcHVibGljIGNsYXNzIERQQ2xhc3MgeworICBARGF0YVByb3ZpZGVyCisgIHN0YXRpYyBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgbmV3IE9iamVjdFtdIHsgNDMgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7IDQ0IH0sCisgICAgfTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9EaXNhYmxlZEZhY3RvcnlTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9EaXNhYmxlZEZhY3RvcnlTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliOGZjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0Rpc2FibGVkRmFjdG9yeVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIERpc2FibGVkRmFjdG9yeVNhbXBsZVRlc3QgeworCisgIEBGYWN0b3J5KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIE9iamVjdFtdIGZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBNeVRlc3QoKSB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9EaXNhYmxlZEZhY3RvcnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9EaXNhYmxlZEZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NTZmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0Rpc2FibGVkRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgRGlzYWJsZWRGYWN0b3J5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkaXNhYmxlZEZhY3RvcnlTaG91bGROb3RSdW4oKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShEaXNhYmxlZEZhY3RvcnlTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFNraXBwZWRUZXN0cygpLnNpemUoKSwgMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5MlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnkyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YmE2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5MlRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworLyoqCisgKiBGYWN0b3J5IHRvIHRlc3QgdGhhdCBzZXRVcCBtZXRob2RzIGFyZSBjb3JyZWN0bHkgaW50ZXJsZWF2ZWQgZXZlbgorICogd2hlbiB3ZSB1c2Ugc2ltaWxhciBpbnN0YW5jZXMgb2YgYSBzYW1lIHRlc3QgY2xhc3MuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEZhY3RvcnkyVGVzdCB7CisKKyAgQEZhY3RvcnkoKQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlT2JqZWN0cygpCisgIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IFNhbXBsZTIoKSwgbmV3IFNhbXBsZTIoKSB9OworICB9CisKKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0ZhY3RvcnlUZXN0XSAiICsgcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5QW5kVGVzdE1ldGhvZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlBbmRUZXN0TWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWQxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5QW5kVGVzdE1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGdyb3VwcyA9IHsgIngiIH0pCitwdWJsaWMgY2xhc3MgRmFjdG9yeUFuZFRlc3RNZXRob2RUZXN0IHsKKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZGF0YSIpCisgIHB1YmxpYyBPYmplY3RbXSBvaE5vKFN0cmluZyBzKSB7CisgICAgcmV0dXJuIG1ha2VOdWxsQXJnVGVzdHMocyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxBcmdzVGVzdCB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBzOworCisgICAgcHVibGljIE51bGxBcmdzVGVzdChTdHJpbmcgcykgeworICAgICAgdGhpcy5zID0gczsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIE9iamVjdFtdIG1ha2VOdWxsQXJnVGVzdHMoU3RyaW5nIHMpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJkYXRhIikKKyAgcHVibGljIE9iamVjdFtdW10gbWFrZURhdGEoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyAiZm9vIiB9IH07CisgIH07Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5QmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU3OTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUJhc2UuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEZhY3RvcnlCYXNlIHsKKworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W10geworICAgICAgbmV3IEZhY3RvcnlCYXNlU2FtcGxlVGVzdCgpCisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUJhc2VTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5QmFzZVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRlODkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUJhc2VTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhY3RvcnlCYXNlU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5Q2hpbGQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlDaGlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZmZkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5Q2hpbGQuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeUNoaWxkIGV4dGVuZHMgRmFjdG9yeUJhc2UgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U4ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5RGF0YVByb3ZpZGVyU2FtcGxlVGVzdCBleHRlbmRzIEJhc2VGYWN0b3J5IHsKKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgRmFjdG9yeURhdGFQcm92aWRlclNhbXBsZVRlc3QoaW50IG4pIHsKKyAgICBzdXBlcihuKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgc3RhdGljIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICBuZXcgT2JqZWN0W10geyA0MSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgNDIgfSwKKyAgICB9OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbRmFjdG9yeURhdGFQcm92aWRlclNhbXBsZVRlc3QgIiArIGdldE4oKSArICJdIjsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Q6IiArIGdldE4oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVFcnJvclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVFcnJvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWMyYjQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclN0YXRpY1NhbXBsZUVycm9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeURhdGFQcm92aWRlclN0YXRpY1NhbXBsZUVycm9yVGVzdCBleHRlbmRzIEJhc2VGYWN0b3J5IHsKKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIEZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVFcnJvclRlc3QoaW50IG4pIHsKKyAgICBzdXBlcihuKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IDQxIH0sCisgICAgICBuZXcgT2JqZWN0W10geyA0MiB9LAorICAgIH07CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclN0YXRpY1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNDk5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5RGF0YVByb3ZpZGVyU3RhdGljU2FtcGxlVGVzdCBleHRlbmRzIEJhc2VGYWN0b3J5IHsKKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZHAiLCBkYXRhUHJvdmlkZXJDbGFzcyA9IERQQ2xhc3MuY2xhc3MpCisgIHB1YmxpYyBGYWN0b3J5RGF0YVByb3ZpZGVyU3RhdGljU2FtcGxlVGVzdChpbnQgbikgeworICAgIHN1cGVyKG4pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RGF0YVByb3ZpZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY5MWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeURhdGFQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5RGF0YVByb3ZpZGVyVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJUZXN0IEBGYWN0b3J5KGRhdGFQcm92aWRlcikgb24gYSBsb2NhbCBzdGF0aWMgZGF0YSBwcm92aWRlciIpCisgIHB1YmxpYyB2b2lkIGZhY3RvcnlXaXRoTG9jYWxEYXRhUHJvdmlkZXIoKSB7CisgICAgcnVuVGVzdChGYWN0b3J5RGF0YVByb3ZpZGVyU2FtcGxlVGVzdC5jbGFzcywgNDEsIDQyKTsKKyAgfQorICAKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiVGVzdCBARmFjdG9yeShkYXRhUHJvdmlkZXIpIG9uIGEgZGF0YSBwcm92aWRlciBpbiBhbm90aGVyIGNsYXNzIikKKyAgcHVibGljIHZvaWQgZmFjdG9yeVdpdGhTdGF0aWNEYXRhUHJvdmlkZXIoKSB7CisgICAgcnVuVGVzdChGYWN0b3J5RGF0YVByb3ZpZGVyU3RhdGljU2FtcGxlVGVzdC5jbGFzcywgNDMsIDQ0KTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIlRlc3QgQEZhY3RvcnkoZGF0YVByb3ZpZGVyKSBvbiBhIG5vbiBzdGF0aWMgZGF0YSBwcm92aWRlciB3aXRoIG5vIGFyZyBjdG9yIikKKyAgcHVibGljIHZvaWQgZmFjdG9yeVdpdGhOb25TdGF0aWNEYXRhUHJvdmlkZXIoKSB7CisgICAgcnVuVGVzdChGYWN0b3J5RGF0YVByb3ZpZGVyV2l0aE5vQXJnQ3RvclNhbXBsZUVycm9yVGVzdC5jbGFzcywgNDUsIDQ2KTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IFRlc3ROR0V4Y2VwdGlvbi5jbGFzcywKKyAgICAgIGRlc2NyaXB0aW9uID0gIlNob3VsZCBmYWlsIGJlY2F1c2UgdGhlIGRhdGEgcHJvdmlkZXIgaXMgbm90IHN0YXRpYyIpCisgIHB1YmxpYyB2b2lkIGZhY3RvcnlXaXRoTm9uU3RhdGljRGF0YVByb3ZpZGVyU2hvdWxkRmFpbCgpIHsKKyAgICBydW5UZXN0KEZhY3RvcnlEYXRhUHJvdmlkZXJTdGF0aWNTYW1wbGVFcnJvclRlc3QuY2xhc3MsIDQzLCA0NCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuVGVzdChDbGFzczw/PiBjbHMsIGludCBuMSwgaW50IG4yKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShjbHMpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMik7CisgICAgSXRlcmF0b3I8SVRlc3RSZXN1bHQ+IGl0ZXJhdG9yID0gdGxhLmdldFBhc3NlZFRlc3RzKCkuaXRlcmF0b3IoKTsKKyAgICBCYXNlRmFjdG9yeSB0MSA9IChCYXNlRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpLmdldEluc3RhbmNlKCk7CisgICAgQmFzZUZhY3RvcnkgdDIgPSAoQmFzZUZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKS5nZXRJbnN0YW5jZSgpOworLy8gICAgQXNzZXJ0LmFzc2VydFRydWUodDEuZ2V0TigpID09IG4xIHx8IHQxLmdldE4oKSA9PSBuMik7CisvLyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0Mi5nZXROKCkgPT0gbjEgfHwgdDIuZ2V0TigpID09IG4yKTsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0czoiICsgdDEuZ2V0TigpICsgIiAiICsgdDIuZ2V0TigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQxLmdldE4oKSwgbjEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModDIuZ2V0TigpLCBuMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlEYXRhUHJvdmlkZXJXaXRoTm9BcmdDdG9yU2FtcGxlRXJyb3JUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RGF0YVByb3ZpZGVyV2l0aE5vQXJnQ3RvclNhbXBsZUVycm9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWM1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RGF0YVByb3ZpZGVyV2l0aE5vQXJnQ3RvclNhbXBsZUVycm9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeURhdGFQcm92aWRlcldpdGhOb0FyZ0N0b3JTYW1wbGVFcnJvclRlc3QgZXh0ZW5kcyBCYXNlRmFjdG9yeSB7CisKKyAgcHVibGljIEZhY3RvcnlEYXRhUHJvdmlkZXJXaXRoTm9BcmdDdG9yU2FtcGxlRXJyb3JUZXN0KCkgeworICAgIHN1cGVyKDApOworICB9CisKKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIEZhY3RvcnlEYXRhUHJvdmlkZXJXaXRoTm9BcmdDdG9yU2FtcGxlRXJyb3JUZXN0KGludCBuKSB7CisgICAgc3VwZXIobik7CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICBuZXcgT2JqZWN0W10geyA0NSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgNDYgfSwKKyAgICB9OworICB9CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiW0ZhY3RvcnlEYXRhUHJvdmlkZXJXaXRoTm9BcmdDdG9yU2FtcGxlRXJyb3JUZXN0ICIgKyBnZXROKCkgKyAiXSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlGYWlsdXJlU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUZhaWx1cmVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwYjk0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlGYWlsdXJlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhY3RvcnlGYWlsdXJlU2FtcGxlVGVzdCB7CisKKyAgQEZhY3RvcnkKKyAgcHVibGljIE9iamVjdFtdIGZhY3RvcnkoKSB7CisgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RmFpbHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlGYWlsdXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDdkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5RmFpbHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5RmFpbHVyZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgIEBUZXN0CisgICBwdWJsaWMgdm9pZCBmYWN0b3J5VGhyb3dpbmdTaG91bGROb3RSdW5UZXN0cygpIHsKKyAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShGYWN0b3J5RmFpbHVyZVNhbXBsZVRlc3QuY2xhc3MpOworCisgICAgIHRyeSB7CisgICAgICAgdG5nLnJ1bigpOworICAgICAgIEFzc2VydC5mYWlsKCk7CisgICAgIH0KKyAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgLy8gc3VjY2VzcworICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW5TZXBhcmF0ZUNsYXNzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW5TZXBhcmF0ZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjZDI3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlJblNlcGFyYXRlQ2xhc3MuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIHRoaXMgaXMgbGlrZSB0aGUgRmFjdG9yeVRlc3QsIGV4Y2VwdCBpdCBjcmVhdGVzIHRlc3QgaW5zdGFuY2VzIGluIGEgc2VwYXJhdGUKKyAqIGNsYXNzIGZyb20gdGhlIHRlc3QgY2xhc3MKKyAqLworcHVibGljIGNsYXNzIEZhY3RvcnlJblNlcGFyYXRlQ2xhc3MgeworICBzdGF0aWMgcHJpdmF0ZSBib29sZWFuIG1fd2FzUnVuID0gZmFsc2U7CisgIHN0YXRpYyBwcml2YXRlIGludCBtX2NoZWNrU3VtID0gMDsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9TdW0oaW50IGkpIHsKKyAgICBtX2NoZWNrU3VtICs9IGk7CisgIH0KKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KCkgeworICAgIG1fd2FzUnVuID0gZmFsc2U7CisgICAgbV9jaGVja1N1bSA9IDA7CisgIH0KKworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlT2JqZWN0cygpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKKyAgICAgIG5ldyBNeVRlc3QoMSksCisgICAgICBuZXcgTXlUZXN0KDIpLAorICAgICAgbmV3IE15VGVzdCgzKSwKKyAgICB9OworICB9CisKKyAgIEBUZXN0KGdyb3VwcyA9ICJ0ZXN0TWV0aG9kT25GYWN0b3J5Q2xhc3MiLCBkZXBlbmRzT25Hcm91cHM9eyJNeVRlc3QifSkKKyAgICBwdWJsaWMgdm9pZCBjaGVja1N1bSgpIHsKKyAgICBtX3dhc1J1biA9IHRydWU7CisgICAgICBhc3NlcnQgKG1fY2hlY2tTdW0gPT0gNikgOgorICAgICAgICAiVGVzdCBpbnN0YW5jZXMgbWFkZSBieSBmYWN0b3J5IGRpZCBub3QgaW52b2tlIHRoZWlyIHRlc3QgbWV0aG9kcyBjb3JyZWN0bHkuICBleHBlY3RlZCA2IGJ1dCBnb3QgIiArIG1fY2hlY2tTdW07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdhc1J1bigpIHsKKyAgICAgIHJldHVybiBtX3dhc1J1bjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlJblN1cGVyQ2xhc3NUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW5TdXBlckNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODBkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW5TdXBlckNsYXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5SW5TdXBlckNsYXNzVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYWN0b3J5SW5TdXBlckNsYXNzU2hvdWxkV29yaygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEZhY3RvcnlDaGlsZC5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUludGVncmF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTQ5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmZhaWxCZWNhdXNlRXhjZXB0aW9uV2FzTm90VGhyb3duOworCitwdWJsaWMgY2xhc3MgRmFjdG9yeUludGVncmF0aW9uVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICAgIEBUZXN0KGRlc2NyaXB0aW9uID0gImh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nL2lzc3Vlcy84NzYiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25XaXRoTm9uU3RhdGljRmFjdG9yeU1ldGhvZCgpIHsKKyAgICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShHaXRIdWI4NzZTYW1wbGUuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG5nLnJ1bigpOworICAgICAgICAgICAgZmFpbEJlY2F1c2VFeGNlcHRpb25XYXNOb3RUaHJvd24oVGVzdE5HRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoVGVzdE5HRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZSkuaGFzTWVzc2FnZSgiXG5DYW4ndCBpbnZva2UgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSB0ZXN0LmZhY3RvcnkuR2l0SHViODc2U2FtcGxlLmNyZWF0ZUluc3RhbmNlcygpOiBlaXRoZXIgbWFrZSBpdCBzdGF0aWMgb3IgYWRkIGEgbm8tYXJncyBjb25zdHJ1Y3RvciB0byB5b3VyIGNsYXNzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNGYWN0b3J5TWV0aG9kU2hvdWxkV29yaygpIHsKKyAgICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShOb25QdWJsaWNGYWN0b3J5TWV0aG9kU2FtcGxlLmNsYXNzKTsKKyAgICAgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgICAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgICAgICB0bmcucnVuKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbldpdGhCYWRGYWN0b3J5TWV0aG9kUmV0dXJuVHlwZSgpIHsKKyAgICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShCYWRGYWN0b3J5TWV0aG9kUmV0dXJuVHlwZVNhbXBsZS5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0bmcucnVuKCk7CisgICAgICAgICAgICBmYWlsQmVjYXVzZUV4Y2VwdGlvbldhc05vdFRocm93bihUZXN0TkdFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB9IGNhdGNoIChUZXN0TkdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChlKS5oYXNNZXNzYWdlKCJcbnRlc3QuZmFjdG9yeS5CYWRGYWN0b3J5TWV0aG9kUmV0dXJuVHlwZVNhbXBsZS5jcmVhdGVJbnN0YW5jZXMgTVVTVCByZXR1cm4gWyBqYXZhLmxhbmcuT2JqZWN0W10gb3Igb3JnLnRlc3RuZy5JSW5zdGFuY2VJbmZvW10gXSBidXQgcmV0dXJucyBqYXZhLmxhbmcuT2JqZWN0Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW50ZXJsZWF2aW5nU2FtcGxlQS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUludGVybGVhdmluZ1NhbXBsZUEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFlY2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUludGVybGVhdmluZ1NhbXBsZUEuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhY3RvcnlJbnRlcmxlYXZpbmdTYW1wbGVBIHsKKyAgcHVibGljIGludCBtX247CisKKyAgcHVibGljIEZhY3RvcnlJbnRlcmxlYXZpbmdTYW1wbGVBKGludCBuKSB7CisgICAgbV9uID0gbjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coSW50ZWdlciBzKSB7CisgICAgRmFjdG9yeUludGVybGVhdmluZ1Rlc3QuTE9HLmFkZChtX24gKiAxMCArIHMpOworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCIgSW5zdGFuY2UgIiArIG1fbiArICIgIiArIHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbQSBuOiIgKyBtX24gKyAiXSI7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgbG9nKDApOworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgYWMoKSB7CisgICAgbG9nKDMpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgbG9nKDEpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjIoKSB7CisgICAgbG9nKDIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlJbnRlcmxlYXZpbmdTYW1wbGVGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW50ZXJsZWF2aW5nU2FtcGxlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTc1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5SW50ZXJsZWF2aW5nU2FtcGxlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5SW50ZXJsZWF2aW5nU2FtcGxlRmFjdG9yeSB7CisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBmYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W10geworICAgICAgICBuZXcgRmFjdG9yeUludGVybGVhdmluZ1NhbXBsZUEoMSksIG5ldyBGYWN0b3J5SW50ZXJsZWF2aW5nU2FtcGxlQSgyKQorICAgIH07CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQigpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJlZm9yZSBCIik7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeUludGVybGVhdmluZ1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlJbnRlcmxlYXZpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhMWFhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlJbnRlcmxlYXZpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEZhY3RvcnlJbnRlcmxlYXZpbmdUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxJbnRlZ2VyPiBMT0cgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2RzU2hvdWxkQmVJbnRlcmxlYXZlZCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEZhY3RvcnlJbnRlcmxlYXZpbmdTYW1wbGVGYWN0b3J5LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisgICAgSW50ZWdlcltdIHZhbGlkMSA9IHsKKyAgICAgICAgMTAsIDExLCAxMiwgMTMsCisgICAgICAgIDIwLCAyMSwgMjIsIDIzLAorICAgIH07CisKKyAgICBJbnRlZ2VyW10gdmFsaWQyID0geworICAgICAgICAyMCwgMjEsIDIyLCAyMywKKyAgICAgICAgMTAsIDExLCAxMiwgMTMsCisgICAgfTsKKyAgICBJbnRlZ2VyW10gbG9nQXJyYXkgPSBMT0cudG9BcnJheShuZXcgSW50ZWdlcltMT0cuc2l6ZSgpXSk7CisgICAgaWYgKCEgbG9nQXJyYXkuZXF1YWxzKHZhbGlkMSkpIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9nQXJyYXksIHZhbGlkMSk7CisgICAgfSBlbHNlIGlmICghIGxvZ0FycmF5LmVxdWFscyh2YWxpZDIpKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obG9nQXJyYXkgKyAiICIgKyB2YWxpZDIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2dBcnJheSwgdmFsaWQyKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlPcmRlck1haW5UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5T3JkZXJNYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzMzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5T3JkZXJNYWluVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeU9yZGVyTWFpblRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFjdG9yaWVzU2hvdWxkQmVJbnZva2VkSW5UaGVPcmRlck9mQ3JlYXRpb24oKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShGYWN0b3J5T3JkZXJUZXN0LmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgTGlzdDxJVGVzdFJlc3VsdD4gcGFzc2VkID0gdGxhLmdldFBhc3NlZFRlc3RzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoKChGYWN0b3J5T3JkZXJTYW1wbGVUZXN0KSBwYXNzZWQuZ2V0KGkpLmdldEluc3RhbmNlKCkpLmdldFZhbHVlKCksIGkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeU9yZGVyU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeU9yZGVyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mzk4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5T3JkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5T3JkZXJTYW1wbGVUZXN0IHsKKworICBpbnQgdmFsdWU7CisKKyAgcHVibGljIEZhY3RvcnlPcmRlclNhbXBsZVRlc3QoaW50IGopIHsKKyAgICB2YWx1ZSA9IGo7CisgICAgbG9nKCJjbGFzc0MgY29uc3RydWN0b3IgIiArIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJbRmFjdG9yeU9yZGVyU2FtcGxlVGVzdF0gIiArIHN0cmluZyk7CisgIH0KKworICBAQmVmb3JlQ2xhc3MoZ3JvdXBzID0geyAiczFkcyIgfSkKKyAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgbG9nKCJjbGFzc0MuQmVmb3JlQ2xhc3MgIiArIHZhbHVlKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgInMxZHMiIH0pCisgIHB1YmxpYyB2b2lkIG1ldGhvZEMxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLyAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgbG9nKCJjbGFzc0MubWV0aG9kQzEgIiArIHZhbHVlKTsKKyAgfQorCisgIEBBZnRlckNsYXNzKGdyb3VwcyA9IHsgInMxZHMiIH0pCisgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisgICAgbG9nKCJjbGFzc0MuQWZ0ZXJDbGFzcyAiICsgdmFsdWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbRmFjdG9yeU9yZGVyU2FtcGxlVGVzdCAiICsgdmFsdWUgKyAiXSI7CisgIH0KKworICBwdWJsaWMgaW50IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlPcmRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlPcmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JjZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeU9yZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeU9yZGVyVGVzdCB7CisKKyAgIHB1YmxpYyBGYWN0b3J5T3JkZXJUZXN0KCkgeworLy8gICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbnNpZGUgdGVzdEZhY3RvcnkgY29uc3RydWN0b3IiKTsKKyAgIH0KKworICAgQEZhY3RvcnkKKyAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gdGVzdEYoKQorICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisvLyAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluc2lkZSBmYWN0b3J5OiAiKTsKKyAgICAgICBpbnQgaSA9IDA7CisgICAgICAgd2hpbGUgKGkgPCA1KSB7CisgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IEZhY3RvcnlPcmRlclNhbXBsZVRlc3QoaSkpOworICAgICAgICAgICBpKys7CisgICAgICAgfQorICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheSgpOworICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NGYzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEZhbHNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlBhcmFtZXRlcnM7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5VGVzdCB7CisgIHN0YXRpYyBib29sZWFuIG1faW52b2tlZCA9IGZhbHNlOworCisgIEBQYXJhbWV0ZXJzKHsgImZhY3RvcnktcGFyYW0iIH0pCisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGVPYmplY3RzKFN0cmluZyBwYXJhbSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGFyYW0sICJGYWN0b3J5UGFyYW0iKTsKKyAgICBhc3NlcnRGYWxzZShtX2ludm9rZWQsICJTaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UiKTsKKyAgICBtX2ludm9rZWQgPSB0cnVlOworCisgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7CisgICAgICAgIG5ldyBGYWN0b3J5VGVzdDIoNDIpLAorICAgICAgICBuZXcgRmFjdG9yeVRlc3QyKDQzKQorICAgIH07CisgIH0KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlKCkgeworICAgIG1faW52b2tlZCA9IGZhbHNlOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVRlc3QyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5VGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThiYTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVRlc3QyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgRmFjdG9yeVRlc3QyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPEludGVnZXIsIEludGVnZXI+IG1fbnVtYmVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgcHJpdmF0ZSBpbnQgbV9udW1iZXI7CisKKyAgcHVibGljIEZhY3RvcnlUZXN0MigpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkbid0IGJlIGludm9rZWQiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTWFwPEludGVnZXIsIEludGVnZXI+IGdldE51bWJlcnMoKSB7CisgICAgcmV0dXJuIG1fbnVtYmVyczsKKyAgfQorCisgIHB1YmxpYyBGYWN0b3J5VGVzdDIoaW50IG4pIHsKKyAgICBtX251bWJlciA9IG47CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJmaXJzdCIgfSkKKyAgcHVibGljIHZvaWQgdGVzdEludCgpIHsKKyAgICBJbnRlZ2VyIG4gPSBtX251bWJlcjsKKyAgICBtX251bWJlcnMucHV0KG4sIG4pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJbRmFjdG9yeVRlc3QyICIgKyBtX251bWJlciArICJdIjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRmFjdG9yeVRlc3QyXSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyZGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXIgeworCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBpbnRbXSB7IDMsIDUgfSB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IGludCBbXSB7IDcsIDkgfSB9LAorICAgIH07CisgIH0KKworICBARmFjdG9yeShkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgT2JqZWN0W10gZmFjdG9yeShpbnRbXSBhcnJheSkgeworICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBmb3IgKGludCBuIDogYXJyYXkpIHsKKyAgICAgIHJlc3VsdC5hZGQobmV3IE9kZFRlc3QobikpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQudG9BcnJheSgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGYWN0b3J5V2l0aERhdGFQcm92aWRlcl0gIiArIHMpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0NjY3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyVGVzdCB7CisKKyAgLyoqCisgICAqIFZlcmlmeSB0aGF0IGEgZmFjdG9yeSBjYW4gcmVjZWl2ZSBhIGRhdGEgcHJvdmlkZXIKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeURhdGFQcm92aWRlcigpIHsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEZhY3RvcnlXaXRoRGF0YVByb3ZpZGVyLmNsYXNzIH0pOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgNCk7CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXJUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNDZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L0ZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEZhbHNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5JSW5zdGFuY2VJbmZvOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLkluc3RhbmNlSW5mbzsKKworcHVibGljIGNsYXNzIEZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdCB7CisgIHN0YXRpYyBib29sZWFuIG1faW52b2tlZCA9IGZhbHNlOworCisgIEBQYXJhbWV0ZXJzKHsgImZhY3RvcnktcGFyYW0iIH0pCisgIEBGYWN0b3J5CisgIHB1YmxpYyBJSW5zdGFuY2VJbmZvW10gY3JlYXRlT2JqZWN0c1dpdGhJbnN0YW5jZUluZm8oU3RyaW5nIHBhcmFtKQorICB7CisgICAgYXNzZXJ0ICJGYWN0b3J5UGFyYW0iLmVxdWFscyhwYXJhbSkgOiAiSW5jb3JyZWN0IHBhcmFtOiAiICsgcGFyYW07CisKKyAgICBhc3NlcnRGYWxzZShtX2ludm9rZWQsICJTaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UiKTsKKyAgICBtX2ludm9rZWQgPSB0cnVlOworCisgICAgcmV0dXJuIG5ldyBJSW5zdGFuY2VJbmZvW10geworICAgICAgICBuZXcgSW5zdGFuY2VJbmZvKEZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdDIuY2xhc3MsCisgICAgICAgICAgICBuZXcgRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0Mig0MikpLAorICAgICAgICBuZXcgSW5zdGFuY2VJbmZvKEZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdDIuY2xhc3MsCisgICAgICAgICAgICBuZXcgRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0Mig0MykpLAorICAgIH07CisgIH0KKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGUoKSB7CisgICAgbV9pbnZva2VkID0gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0ZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdF0gIiArIHMpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0Mi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMGFmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9GYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgY3JlYXRlZCBieSBGYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QyCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdDIgeworICBwcml2YXRlIHN0YXRpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbV9udW1iZXJzID0gbmV3IEhhc2hNYXA8PigpOworICBwcml2YXRlIGludCBtX251bWJlcjsKKworICBwdWJsaWMgRmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0MigpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkbid0IGJlIGludm9rZWQiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTWFwPEludGVnZXIsIEludGVnZXI+IGdldE51bWJlcnMoKSB7CisgICAgcmV0dXJuIG1fbnVtYmVyczsKKyAgfQorCisgIHB1YmxpYyBGYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QyKGludCBuKSB7CisgICAgbV9udW1iZXIgPSBuOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiZmlyc3QiIH0pCisgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB7CisgICAgSW50ZWdlciBuID0gbV9udW1iZXI7CisgICAgbV9udW1iZXJzLnB1dChuLCBuKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRmFjdG9yeVRlc3QyXSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvR2l0SHViODc2U2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9HaXRIdWI4NzZTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAxMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvR2l0SHViODc2U2FtcGxlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgR2l0SHViODc2U2FtcGxlIHsKKworICAgIEBGYWN0b3J5CisgICAgcHVibGljIE9iamVjdFtdIGNyZWF0ZUluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICBuZXcgR2l0SHViODc2U2FtcGxlKG5ldyBEYXRhVGVzdCgiZm9vIiwgdHJ1ZSkpLAorICAgICAgICAgICAgICAgIG5ldyBHaXRIdWI4NzZTYW1wbGUobmV3IERhdGFUZXN0KCJGT08iLCBmYWxzZSkpCisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhVGVzdCBkYXRhVGVzdDsKKworICAgIHB1YmxpYyBHaXRIdWI4NzZTYW1wbGUoRGF0YVRlc3QgZGF0YVRlc3QpIHsKKyAgICAgICAgdGhpcy5kYXRhVGVzdCA9IGRhdGFUZXN0OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgc3dpdGNoIChkYXRhVGVzdC5zKSB7CisgICAgICAgICAgICBjYXNlICJGT08iOgorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShkYXRhVGVzdC5iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgImZvbyI6CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGF0YVRlc3QuYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJVbmtub3duIHZhbHVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERhdGFUZXN0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYjsKKworICAgICAgICBwdWJsaWMgRGF0YVRlc3QoU3RyaW5nIHMsIGJvb2xlYW4gYikgeworICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgICAgIHRoaXMuYiA9IGI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9NeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L015VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWE3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9NeVRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIE15VGVzdCB7CisgIHByaXZhdGUgaW50IGk7CisKKyAgLy8gaW4gdGhpcyB0ZXN0LCBvdXIgZGVmYXVsdCBjb25zdHJ1Y3RvciBzZXRzIHMgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgY2F1c2UgYSBmYWlsdXJlCisgIC8vIHRoZSB2YWxpZCB0ZXN0IGluc3RhbmNlcyBzaG91bGQgY29tZSBmcm9tIHRoZSBmYWN0b3J5CisgIHB1YmxpYyBNeVRlc3QoKSB7CisgICAgaSA9IDA7CisgIH0KKworICBwdWJsaWMgTXlUZXN0KGludCBpKSB7CisgICAgdGhpcy5pID0gaTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJNeVRlc3QiKQorICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKCkgeworICAgIEZhY3RvcnlJblNlcGFyYXRlQ2xhc3MuYWRkVG9TdW0oaSk7CisgICAgLy8gICAgYXNzZXJ0IGkgPiAwIDogIk15VGVzdCB3YXMgbm90IGNvbnN0cnVjdGVkIHdpdGggY29ycmVjdCBwYXJhbXMiOworICAgIGFzc2VydCAoaSAhPSAwKSA6ICJNeSB0ZXN0IHdhcyBub3QgY3JlYXRlZCBieSB0aGUgZmFjdG9yeSI7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSAidGVzdE1ldGhvZE9uRmFjdG9yeUNsYXNzIikKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGhhdFRlc3RNZXRob2RPbkZhY3RvcnlDbGFzc1dhc1J1bigpIHsKKyAgICBhc3NlcnQgRmFjdG9yeUluU2VwYXJhdGVDbGFzcy53YXNSdW4oKSA6ICJUZXN0IG1ldGhvZCBvbiBmYWN0b3J5IGNsYXNzIHdhc24ndCBydW4iOworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9OZXN0ZWRGYWN0b3J5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvTmVzdGVkRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE0M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvTmVzdGVkRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBOZXN0ZWRGYWN0b3J5VGVzdCB7CisgIHByaXZhdGUgaW50IG1fY2FwYWNpdHkgPSAyOworICBwcml2YXRlIGZsb2F0IG1fbG9hZEZhY3RvciA9IDAuNGY7CisKKyAgcHVibGljIGNsYXNzIE5lc3RlZEZhY3RvcnkgeworICAgIEBGYWN0b3J5CisgICAgcHVibGljIE9iamVjdFtdIGNyZWF0ZUluc3RhbmNlcygpIHsKKyAgICAgIHJldHVybiBuZXcgTmVzdGVkRmFjdG9yeVRlc3RbXSB7CisgICAgICAgIG5ldyBOZXN0ZWRGYWN0b3J5VGVzdCgxLCAwLjFmKSwKKyAgICAgICAgbmV3IE5lc3RlZEZhY3RvcnlUZXN0KDEwLCAwLjVmKSwKKyAgICAgIH07CisgICAgfQorICB9OworCisgIHByaXZhdGUgc3RhdGljIGludCBtX2luc3RhbmNlQ291bnQgPSAwOworICBwdWJsaWMgTmVzdGVkRmFjdG9yeVRlc3QoKSB7CisgICAgbV9pbnN0YW5jZUNvdW50Kys7CisgIH0KKworICBwdWJsaWMgTmVzdGVkRmFjdG9yeVRlc3QoaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisgICAgbV9pbnN0YW5jZUNvdW50Kys7CisgICB0aGlzLm1fY2FwYWNpdHk9Y2FwYWNpdHk7CisgICB0aGlzLm1fbG9hZEZhY3Rvcj1sb2FkRmFjdG9yOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIC8vIFNob3VsZCBoYXZlIHRocmVlIGluc3RhbmNlczogIHRoZSBkZWZhdWx0IG9uZSBjcmVhdGVkIGJ5IFRlc3RORworICAgIC8vIGFuZCB0d28gY3JlYXRlZCBieSB0aGUgZmFjdG9yeQorICAgIGFzc2VydEVxdWFscyhtX2luc3RhbmNlQ291bnQsIDMpOworICAgIGFzc2VydFRydWUoKG1fY2FwYWNpdHkgPT0gMSAmJiBtX2xvYWRGYWN0b3IgPT0gMC4xZikgfHwKKyAgICAgICAgbV9jYXBhY2l0eSA9PSAxMCAmJiBtX2xvYWRGYWN0b3IgPT0gMC41Zik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW05lc3RlZEZhY3RvcnlUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L05lc3RlZFN0YXRpY0ZhY3RvcnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9OZXN0ZWRTdGF0aWNGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDJkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9OZXN0ZWRTdGF0aWNGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIE5lc3RlZFN0YXRpY0ZhY3RvcnlUZXN0IHsKKyAgcHJpdmF0ZSBpbnQgbV9jYXBhY2l0eSA9IDI7CisgIHByaXZhdGUgZmxvYXQgbV9sb2FkRmFjdG9yID0gMC40ZjsKKworICBzdGF0aWMgcHVibGljIGNsYXNzIE5lc3RlZFN0YXRpY0ZhY3RvcnkgeworICAgIEBGYWN0b3J5CisgICAgcHVibGljIE9iamVjdFtdIGNyZWF0ZUluc3RhbmNlcygpIHsKKyAgICAgIHJldHVybiBuZXcgTmVzdGVkU3RhdGljRmFjdG9yeVRlc3RbXSB7CisgICAgICAgIG5ldyBOZXN0ZWRTdGF0aWNGYWN0b3J5VGVzdCgxLCAwLjFmKSwKKyAgICAgICAgbmV3IE5lc3RlZFN0YXRpY0ZhY3RvcnlUZXN0KDEwLCAwLjVmKSwKKyAgICAgIH07CisgICAgfQorICB9OworCisgIHByaXZhdGUgc3RhdGljIGludCBtX2luc3RhbmNlQ291bnQgPSAwOworICBwdWJsaWMgTmVzdGVkU3RhdGljRmFjdG9yeVRlc3QoKSB7CisgICAgbV9pbnN0YW5jZUNvdW50Kys7CisgIH0KKworICBwdWJsaWMgTmVzdGVkU3RhdGljRmFjdG9yeVRlc3QoaW50IGNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisgICAgbV9pbnN0YW5jZUNvdW50Kys7CisgICB0aGlzLm1fY2FwYWNpdHk9Y2FwYWNpdHk7CisgICB0aGlzLm1fbG9hZEZhY3Rvcj1sb2FkRmFjdG9yOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIC8vIFNob3VsZCBoYXZlIHRocmVlIGluc3RhbmNlczogIHRoZSBkZWZhdWx0IG9uZSBjcmVhdGVkIGJ5IFRlc3RORworICAgIC8vIGFuZCB0d28gY3JlYXRlZCBieSB0aGUgZmFjdG9yeQorICAgIGFzc2VydEVxdWFscyhtX2luc3RhbmNlQ291bnQsIDIpOworICAgIGFzc2VydFRydWUoKG1fY2FwYWNpdHkgPT0gMSAmJiBtX2xvYWRGYWN0b3IgPT0gMC4xZikgfHwKKyAgICAgICAgbV9jYXBhY2l0eSA9PSAxMCAmJiBtX2xvYWRGYWN0b3IgPT0gMC41Zik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW05lc3RlZFN0YXRpY0ZhY3RvcnlUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L05vblB1YmxpY0ZhY3RvcnlNZXRob2RTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L05vblB1YmxpY0ZhY3RvcnlNZXRob2RTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmViNmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvTm9uUHVibGljRmFjdG9yeU1ldGhvZFNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCitwdWJsaWMgY2xhc3MgTm9uUHVibGljRmFjdG9yeU1ldGhvZFNhbXBsZSB7CisKKyAgICBARmFjdG9yeQorICAgIHByaXZhdGUgT2JqZWN0W10gY3JlYXRlSW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICBuZXcgQmFzZUZhY3RvcnkoNDIpLAorICAgICAgICAgICAgICAgIG5ldyBCYXNlRmFjdG9yeSg0MykKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9PZGRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9PZGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczYzM2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L09kZFRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIE9kZFRlc3QgeworICBwcml2YXRlIGludCBtX247CisKKyAgcHVibGljIE9kZFRlc3QoaW50IG4pIHsKKyAgICBtX24gPSBuOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fbiAlIDIgIT0gMCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW09kZFRlc3RdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvU2FtcGxlMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvU2FtcGxlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTZkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9TYW1wbGUyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3QgdGhhdCBzZXRVcCBtZXRob2RzIGFyZSBjb3JyZWN0bHkgaW50ZXJsZWF2ZWQgZXZlbgorICogd2hlbiB3ZSB1c2Ugc2ltaWxhciBpbnN0YW5jZXMgb2YgYSBzYW1lIHRlc3QgY2xhc3MuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZTIgeworICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gbV9tZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9tZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIHBwcCgiU0VUIFVQIik7CisgICAgbV9tZXRob2RMaXN0LmFkZCgic2V0VXAiKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBwcHAoIlRFQVIgRE9XTiIpOworICAgIG1fbWV0aG9kTGlzdC5hZGQoInRlYXJEb3duIik7CisgIH0KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBhZnRlclN1aXRlKCkgeworICAgIFN0cmluZ1tdIGV4cGVjdGVkU3RyaW5ncyA9IHsKKyAgICAgICAgInNldFVwIiwKKyAgICAgICAgInRlc3RJbnB1dEltYWdlcyIsCisgICAgICAgICJ0ZWFyRG93biIsCisgICAgICAgICJzZXRVcCIsCisgICAgICAgICJ0ZXN0SW5wdXRJbWFnZXMiLAorICAgICAgICAidGVhckRvd24iLAorICAgICAgICAic2V0VXAiLAorICAgICAgICAidGVzdEltYWdlcyIsCisgICAgICAgICJ0ZWFyRG93biIsCisgICAgICAgICJzZXRVcCIsCisgICAgICAgICJ0ZXN0SW1hZ2VzIiwKKyAgICAgICAgInRlYXJEb3duIiwKKyAgICB9OworICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIGZvciAoU3RyaW5nIHMgOiBleHBlY3RlZFN0cmluZ3MpIHsKKyAgICAgIGV4cGVjdGVkLmFkZChzKTsKKyAgICB9CisKKyAgICBwcHAoIk9SREVSIE9GIE1FVEhPRFM6Iik7CisgICAgZm9yIChTdHJpbmcgcyA6IG1fbWV0aG9kTGlzdCkgeworICAgICAgcHBwKCIgICAiICsgcyk7CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKG1fbWV0aG9kTGlzdCwgZXhwZWN0ZWQpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdElucHV0SW1hZ2VzKCkgeworICAgIG1fbWV0aG9kTGlzdC5hZGQoInRlc3RJbnB1dEltYWdlcyIpOworICAgIHBwcCgiVEVTVElOUFVUSU1BR0VTIik7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzPXsidGVzdElucHV0SW1hZ2VzIn0pCisgIHB1YmxpYyB2b2lkIHRlc3RJbWFnZXMoKSB7CisgICAgbV9tZXRob2RMaXN0LmFkZCgidGVzdEltYWdlcyIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NhbXBsZTJdICIgKyBzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L1Rlc3RDbGFzc0Fubm90YXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9UZXN0Q2xhc3NBbm5vdGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9UZXN0Q2xhc3NBbm5vdGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgdGVzdC5mYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogTWFrZSBzdXJlIHRoYXQgQEZhY3RvcnkgbWV0aG9kcyBhcmUgbm90IGNvdW50ZWQgYXMgQFRlc3QgaW4gdGhlCisgKiBwcmVzZW5jZSBvZiBhIGNsYXNzLXNjb3BlZCBAVGVzdCBhbm5vdGF0aW9uLgorICoKKyAqIENyZWF0ZWQgb24gTWFyIDMwLCAyMDA2CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKi8KK0BUZXN0CitwdWJsaWMgY2xhc3MgVGVzdENsYXNzQW5ub3RhdGlvblRlc3QgeworCisgIHByaXZhdGUgaW50IG1fY291bnQ7CisKKyAgQEZhY3RvcnkKKyAgcHVibGljIE9iamVjdFtdIGNyZWF0ZUZpeHR1cmUoKSB7CisgICAgcHBwKCJGQUNUT1JZIik7CisgICAgbV9jb3VudCsrOworICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0KCkgfX07CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T25lKCkgeworICAgIHBwcCgiVEVTVE9ORSIpOworICAgIG1fY291bnQrKzsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBwcHAoIlZFUklGWSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9jb3VudCwgMik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbRmFjdG9yeVRlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvVmVyaWZ5RmFjdG9yeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L1ZlcmlmeUZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjNmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L1ZlcmlmeUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0LmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVmVyaWZ5RmFjdG9yeVRlc3QgeworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJmaXJzdCIgfSApCisgIHB1YmxpYyB2b2lkIG1haW5DaGVjaygpIHsKKyAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbnVtYmVycyA9IEZhY3RvcnlUZXN0Mi5nZXROdW1iZXJzKCk7CisgICAgYXNzZXJ0IG51bGwgIT0gbnVtYmVycy5nZXQoNDIpCisgICAgICA6ICJEaWRuJ3QgZmluZCA0MiI7CisgICAgYXNzZXJ0IG51bGwgIT0gbnVtYmVycy5nZXQoNDMpCisgICAgICA6ICJEaWRuJ3QgZmluZCA0MyI7CisgICAgYXNzZXJ0IDIgPT0gbnVtYmVycy5zaXplKCkKKyAgICAgIDogIkV4cGVjdGVkIDIgbnVtYmVycywgZm91bmQgIiArIChudW1iZXJzLnNpemUoKSk7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9WZXJpZnlGYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L1ZlcmlmeUZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDUyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9WZXJpZnlGYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBWZXJpZnlGYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QgeworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJmaXJzdCIgfSApCisgIHB1YmxpYyB2b2lkIG1haW5DaGVjaygpIHsKKyAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbnVtYmVycyA9IEZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdDIuZ2V0TnVtYmVycygpOworICAgIGFzc2VydCBudWxsICE9IG51bWJlcnMuZ2V0KDQyKQorICAgICAgOiAiRGlkbid0IGZpbmQgNDIiOworICAgIGFzc2VydCBudWxsICE9IG51bWJlcnMuZ2V0KDQzKQorICAgICAgOiAiRGlkbid0IGZpbmQgNDMiOworICAgIGFzc2VydCAyID09IG51bWJlcnMuc2l6ZSgpCisgICAgICA6ICJFeHBlY3RlZCAyIG51bWJlcnMsIGZvdW5kICIgKyAobnVtYmVycy5zaXplKCkpOworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhY3RvcnkvY2xhc3Njb25mL1hDbGFzc09yZGVyV2l0aEZhY3RvcnkuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L2NsYXNzY29uZi9YQ2xhc3NPcmRlcldpdGhGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlYWNiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L2NsYXNzY29uZi9YQ2xhc3NPcmRlcldpdGhGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0LmZhY3RvcnkuY2xhc3Njb25mOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFhDbGFzc09yZGVyV2l0aEZhY3Rvcnkgew0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfTE9HPSAiQlRBQlRBQlRBIjsNCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nQnVmZmVyIExPRz0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKw0KKyAgQEZhY3RvcnkNCisgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGVJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsNCisgICAgICAgICAgICAgIG5ldyBYQ2xhc3NPcmRlclRlc3QoKSwgbmV3IFhDbGFzc09yZGVyVGVzdCgpLCBuZXcgWENsYXNzT3JkZXJUZXN0KCkNCisgICAgICAgICAgfTsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWENsYXNzT3JkZXJUZXN0IHsNCisgICAgQEJlZm9yZUNsYXNzDQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzKCkgew0KKyAgICAgIExPRy5hcHBlbmQoIkIiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQFRlc3Qgdm9pZCB0ZXN0KCkgew0KKyAgICAgIExPRy5hcHBlbmQoIlQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQEFmdGVyQ2xhc3Mgdm9pZCBhZnRlckNsYXNzKCkgew0KKyAgICAgIExPRy5hcHBlbmQoIkEiKTsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9jbGFzc2NvbmYvWENsYXNzT3JkZXJXaXRoRmFjdG9yeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWN0b3J5L2NsYXNzY29uZi9YQ2xhc3NPcmRlcldpdGhGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjY1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFjdG9yeS9jbGFzc2NvbmYvWENsYXNzT3JkZXJXaXRoRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZmFjdG9yeS5jbGFzc2NvbmY7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgWENsYXNzT3JkZXJXaXRoRmFjdG9yeVRlc3Qgew0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3RCZWZvcmVBZnRlckNsYXNzSW52b2NhdGlvbnNXaXRoRmFjdG9yeSgpIHsNCisgICAgVGVzdE5HIHRlc3RuZz0gbmV3IFRlc3RORygpOw0KKyAgICB0ZXN0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10ge1hDbGFzc09yZGVyV2l0aEZhY3RvcnkuY2xhc3N9KTsNCisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOw0KKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsNCisgICAgdGVzdG5nLnNldFZlcmJvc2UoMCk7DQorICAgIHRlc3RuZy5ydW4oKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYQ2xhc3NPcmRlcldpdGhGYWN0b3J5LkxPRy50b1N0cmluZygpLCBYQ2xhc3NPcmRlcldpdGhGYWN0b3J5LkVYUEVDVEVEX0xPRyk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsZWRyZXBvcnRlci9GYWlsZWRSZXBvcnRlcjJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbGVkcmVwb3J0ZXIvRmFpbGVkUmVwb3J0ZXIyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzhjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbGVkcmVwb3J0ZXIvRmFpbGVkUmVwb3J0ZXIyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5mYWlsZWRyZXBvcnRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhaWxlZFJlcG9ydGVyMlNhbXBsZVRlc3QgeworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICBuZXcgT2JqZWN0W10geyAwIH0sCisgICAgICBuZXcgT2JqZWN0W10geyAxIH0sCisgICAgICBuZXcgT2JqZWN0W10geyAyIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcCIpCisgIHB1YmxpYyB2b2lkIGYxKEludGVnZXIgaXApIHsKKyAgICBpZiAoaXAgPT0gMSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsZWRyZXBvcnRlci9GYWlsZWRSZXBvcnRlclNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsZWRyZXBvcnRlci9GYWlsZWRSZXBvcnRlclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2QyZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWxlZHJlcG9ydGVyL0ZhaWxlZFJlcG9ydGVyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5mYWlsZWRyZXBvcnRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuU2tpcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRSZXBvcnRlclNhbXBsZVRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMigpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgdGhyb3cgbmV3IFNraXBFeGNlcHRpb24oIlNraXBwZWQiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYzKCkgeworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsZWRyZXBvcnRlci9GYWlsZWRSZXBvcnRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsZWRyZXBvcnRlci9GYWlsZWRSZXBvcnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFiYjAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWxlZHJlcG9ydGVyL0ZhaWxlZFJlcG9ydGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgdGVzdC5mYWlsZWRyZXBvcnRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRSZXBvcnRlclRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisgIHByaXZhdGUgRmlsZSBtVGVtcERpcmVjdG9yeTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIEZpbGUgc2xhc2hUbXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgIG1UZW1wRGlyZWN0b3J5ID0gbmV3IEZpbGUoc2xhc2hUbXBEaXIsICJ0ZXN0bmctdG1wLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDEwMDApOworICAgIG1UZW1wRGlyZWN0b3J5Lm1rZGlycygpOworICAgIG1UZW1wRGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIGRlbGV0ZURpcihtVGVtcERpcmVjdG9yeSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYWlsZWRBbmRTa2lwcGVkTWV0aG9kc1Nob3VsZEJlSW5jbHVkZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRlc3RGYWlsZWRSZXBvcnRlcihGYWlsZWRSZXBvcnRlclNhbXBsZVRlc3QuY2xhc3MsIG5ldyBTdHJpbmdbXSB7ICJmMSIsICJmMiIgfSwKKyAgICAgICAgIjxpbmNsdWRlIG5hbWU9XCIlc1wiIiArICJcIi8+Iik7ICAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGZhaWxlZE1ldGhvZFdpdGhEYXRhUHJvdmlkZXJTaG91bGRIYXZlSW52b2NhdGlvbk51bWJlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRlc3RGYWlsZWRSZXBvcnRlcihGYWlsZWRSZXBvcnRlcjJTYW1wbGVUZXN0LmNsYXNzLCBuZXcgU3RyaW5nW10geyAiZjEiIH0sCisgICAgICAgICI8aW5jbHVkZSBpbnZvY2F0aW9uTnVtYmVycz1cIjFcIiBuYW1lPVwiJXNcIiIgKyAiXCIvPiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RGYWlsZWRSZXBvcnRlcihDbGFzczw/PiBjbHMsIFN0cmluZ1tdIGV4cGVjdGVkTWV0aG9kcywgU3RyaW5nIGV4cGVjdGVkTGluZSkgeworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgY2xzIH0pOworICAgIHRuZy5zZXRPdXRwdXREaXJlY3RvcnkobVRlbXBEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHRuZy5ydW4oKTsKKworICAgIEZpbGUgZmFpbGVkID0gbmV3IEZpbGUobVRlbXBEaXJlY3RvcnksICJ0ZXN0bmctZmFpbGVkLnhtbCIpOworICAgIGZvciAoU3RyaW5nIHMgOiBleHBlY3RlZE1ldGhvZHMpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRMaW5lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZ3JlcChmYWlsZWQsIGV4cGVjdGVkTGluZS5mb3JtYXQocyksIHJlc3VsdExpbmVzKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgcmVzdWx0TGluZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0Jhc2UwLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvQmFzZTAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTgxYjhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0Jhc2UwLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LmZhaWx1cmVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmFzZTAgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBiYXNlMSgpIHsKKyAgICAgIGFzc2VydCB0cnVlOworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0Jhc2UxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvQmFzZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2JiNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0Jhc2UxLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0LmZhaWx1cmVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmFzZTEgZXh0ZW5kcyBCYXNlMCB7CisgICBAVGVzdAorICAgcHVibGljIHZvaWQgYmFzZTIoKSB7CisgICAgIGFzc2VydCB0cnVlOworICAgfQorCisgICBAVGVzdAorICAgcHVibGljIHZvaWQgZmFpbEZyb21CYXNlKCkgeworICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVk9MVU5UQVJJTFkgRkFJTEVEIik7CisgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0Jhc2VGYWlsdXJlc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsdXJlcy9CYXNlRmFpbHVyZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxODg5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsdXJlcy9CYXNlRmFpbHVyZXNUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSB0ZXN0LmZhaWx1cmVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRmFpbGVkUmVwb3J0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworcHVibGljIGNsYXNzIEJhc2VGYWlsdXJlc1Rlc3QgeworCisvLyAgcHJvdGVjdGVkIFRlc3RORyBydW4oQ2xhc3NbXSBjbGFzc2VzLCBTdHJpbmcgb3V0cHV0RGlyKSB7CisvLyAgICByZXR1cm4gcnVuKG5ldyBUZXN0TkcoKSwgY2xhc3Nlcywgb3V0cHV0RGlyKTsKKy8vICB9CisKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZU5hbWUoKSB7CisgICAgcmV0dXJuICJUbXBTdWl0ZSI7CisgIH0KKworICBwcm90ZWN0ZWQgVGVzdE5HIHJ1bihUZXN0TkcgcmVzdWx0LCBDbGFzc1tdIGNsYXNzZXMsIFN0cmluZyBvdXRwdXREaXIpIHsKKyAgICAgcmVzdWx0LnNldFZlcmJvc2UoMCk7CisgICAgIHJlc3VsdC5zZXRPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyKTsKKyAgICAgcmVzdWx0LnNldFRlc3RDbGFzc2VzKGNsYXNzZXMpOworICAgICByZXN1bHQucnVuKCk7CisKKyAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZgorICAgKiBAcGFyYW0gcmVnZXhwcworICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgY29udGFpbnMgYXQgbGVhc3Qgb25lIG9jY3VycmVuY2Ugb2YgZWFjaCByZWdleHAKKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zUmVndWxhckV4cHJlc3Npb25zKEZpbGUgZiwgU3RyaW5nW10gc3RyUmVnZXhwcykgeworICAgIFBhdHRlcm5bXSBtYXRjaGVycyA9IG5ldyBQYXR0ZXJuW3N0clJlZ2V4cHMubGVuZ3RoXTsKKyAgICBib29sZWFuW10gcmVzdWx0cyA9IG5ldyBib29sZWFuW3N0clJlZ2V4cHMubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0clJlZ2V4cHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIG1hdGNoZXJzW2ldID0gUGF0dGVybi5jb21waWxlKCIuKiIgKyBzdHJSZWdleHBzW2ldICsgIi4qIik7CisgICAgICByZXN1bHRzW2ldID0gZmFsc2U7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmKTsKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKyAgICAgIFN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKKyAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJSZWdleHBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgaWYgKG1hdGNoZXJzW2ldLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICByZXN1bHRzW2ldID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICB9CisgICAgICBmci5jbG9zZSgpOworICAgICAgYnIuY2xvc2UoKTsKKyAgICB9CisgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJvb2xlYW4gcmVzdWx0ID0gcmVzdWx0c1tpXTsKKyAgICAgIGlmICghIHJlc3VsdCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkNvdWxkbid0IGZpbmQgIiArIHN0clJlZ2V4cHNbaV0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KFN0cmluZyBvdXRwdXREaXIsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CisgICAgRmlsZSBmID0gbmV3IEZpbGUob3V0cHV0RGlyICsKKyAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyICsgZ2V0U3VpdGVOYW1lKCkgKworICAgICAgICBGaWxlLnNlcGFyYXRvciArIEZhaWxlZFJlcG9ydGVyLlRFU1ROR19GQUlMRURfWE1MKTsKKyAgICAgYm9vbGVhbiBwYXNzZWQgPSBjb250YWluc1JlZ3VsYXJFeHByZXNzaW9ucyhmLCBleHBlY3RlZCk7CisgICAgIEFzc2VydC5hc3NlcnRUcnVlKHBhc3NlZCk7CisKKyAgICAgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShvdXRwdXREaXIpOworICAgICB0bXBEaXIuZGVsZXRlKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0NoaWxkLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvQ2hpbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2E1NjIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ZhaWx1cmVzL0NoaWxkLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0LmZhaWx1cmVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBCYXNlMSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFzcygpIHsKKyAgICAgIGFzc2VydCB0cnVlOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVk9MVU5UQVJJTFkgRkFJTEVEIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsdXJlcy9EZXBlbmRlbnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvRGVwZW5kZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2RjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvRGVwZW5kZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5mYWlsdXJlczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERlcGVuZGVudFRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkgeworCisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyJmMSJ9LCBkZXBlbmRzT25Hcm91cHMgPSB7ICJmIiB9KQorICBwdWJsaWMgdm9pZCBmMigpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvRmFpbHVyZXNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZmFpbHVyZXMvRmFpbHVyZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlZjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9mYWlsdXJlcy9GYWlsdXJlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIHRlc3QuZmFpbHVyZXM7CisKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IHRlc3QuVGVzdEhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBGYWlsdXJlc1Rlc3QgZXh0ZW5kcyBCYXNlRmFpbHVyZXNUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGRJbmNsdWRlRmFpbGVkTWV0aG9kc0Zyb21CYXNlQ2xhc3MoKSB7CisgICAgWG1sU3VpdGUgc3VpdGUgPSBUZXN0SGVscGVyLmNyZWF0ZVN1aXRlKCJ0ZXN0LmZhaWx1cmVzLkNoaWxkIiwgZ2V0U3VpdGVOYW1lKCkpOworICAgIFRlc3RORyB0bmcgPSBUZXN0SGVscGVyLmNyZWF0ZVRlc3RORyhzdWl0ZSk7CisgICAgdG5nLnJ1bigpOworCisgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAiPGNsYXNzIG5hbWU9XCJ0ZXN0LmZhaWx1cmVzLkNoaWxkXCI+IiwKKyAgICAgICAiPGluY2x1ZGUgbmFtZT1cImZhaWxcIi8+IiwKKyAgICAgICAiPGluY2x1ZGUgbmFtZT1cImZhaWxGcm9tQmFzZVwiLz4iLAorICAgICB9OworCisgICAgIHZlcmlmeShnZXRPdXRwdXREaXIoKSwgZXhwZWN0ZWQpOworICB9CisKKyAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBzaG91bGRJbmNsdWRlRGVwZW5kZW50TWV0aG9kcygpIHsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IFRlc3RIZWxwZXIuY3JlYXRlU3VpdGUoInRlc3QuZmFpbHVyZXMuRGVwZW5kZW50VGVzdCIsIGdldFN1aXRlTmFtZSgpKTsKKyAgICBUZXN0TkcgdG5nID0gVGVzdEhlbHBlci5jcmVhdGVUZXN0Tkcoc3VpdGUpOworICAgIHRuZy5ydW4oKTsKKworICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbmNsdWRlIG5hbWU9XCJmMVwiLz4iLAorICAgICAgICAiPGluY2x1ZGUgbmFtZT1cImYyXCIvPiIKKyAgICAgIH07CisKKyAgICB2ZXJpZnkoZ2V0T3V0cHV0RGlyKCksIGV4cGVjdGVkKTsKKyAgfQorCisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgc2hvdWxkSW5jbHVkZVBhcmFtZXRlcnMoKSB7CisgICAgWG1sU3VpdGUgc3VpdGUgPSBUZXN0SGVscGVyLmNyZWF0ZVN1aXRlKCJ0ZXN0LmZhaWx1cmVzLkNoaWxkIiwgZ2V0U3VpdGVOYW1lKCkpOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgIHBhcmFtcy5wdXQoImZpcnN0LW5hbWUiLCAiQ2VkcmljIik7CisgICAgcGFyYW1zLnB1dCgibGFzdC1uYW1lIiwgIkJldXN0Iik7CisgICAgc3VpdGUuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgVGVzdE5HIHRuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKHN1aXRlKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICI8cGFyYW1ldGVyIG5hbWU9XCJmaXJzdC1uYW1lXCIgdmFsdWU9XCJDZWRyaWNcIi8+IiwKKyAgICAgIH07CisKKyAgICB2ZXJpZnkoZ2V0T3V0cHV0RGlyKCksIGV4cGVjdGVkKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldE91dHB1dERpcigpIHsKKyAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGYWlsdXJlc1Rlc3RdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwYnVnL0dyb3VwQnVnVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwYnVnL0dyb3VwQnVnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDY0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBidWcvR3JvdXBCdWdUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0Lmdyb3VwYnVnOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEdyb3VwQnVnVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhc3NlZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgIEBUZXN0KGdyb3VwcyA9ICJicm9rZW4iLAorICAgICAgZGVzY3JpcHRpb24gPSAiQ29tbWVudCBvdXQgZGVwZW5kc09uR3JvdXBzIGluIElUQ2FzZU9uZSB3aWxsIGZpeCB0aGUgb3JkZXJpbmcsIHRoYXQncyB0aGUgYnVnIikKKyAgcHVibGljIHZvaWQgc2hvdWxkT3JkZXJCeUNsYXNzKCkgeworICAgIHBhc3NlZC5jbGVhcigpOworICAgIGFkZENsYXNzKElUQ2FzZU9uZS5jbGFzcyk7CisgICAgYWRkQ2xhc3MoSVRDYXNlVHdvLmNsYXNzKTsKKyAgICBydW4oKTsKKyAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAib25lMSIsICJvbmUyIiwgInR3bzEiLCAidHdvMiIKKyAgICApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGFzc2VkLCBleHBlY3RlZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGJ1Zy9JVENhc2VPbmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGJ1Zy9JVENhc2VPbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFjNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwYnVnL0lUQ2FzZU9uZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgdGVzdC5ncm91cGJ1ZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIElUQ2FzZU9uZSB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMuYmVmb3JlQ2xhc3MoKVxuIiwgZ2V0Q2xhc3MoKSk7CisgIH0KKworICBAQWZ0ZXJDbGFzcyhhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMuYWZ0ZXJDbGFzcygpXG4iLCBnZXRDbGFzcygpKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJzdGQtb25lIikKKyAgcHVibGljIHZvaWQgb25lMSgpIHsKKyAgICBHcm91cEJ1Z1Rlc3QucGFzc2VkLmFkZCgib25lMSIpOworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMub25lMSgpXG4iLCBnZXRDbGFzcygpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21tZW50aW5nIG91dCBkZXBlbmRzT25Hcm91cHMgZml4ZXMgdGhlIG9yZGVyaW5nLCB0aGF0J3MgdGhlIGJ1Zy4KKyAgICovCisgIEBUZXN0KGdyb3VwcyA9ICJsb2dpYy1vbmUiLCBkZXBlbmRzT25Hcm91cHMgPSAic3RkLW9uZSIpCisgIHB1YmxpYyB2b2lkIG9uZTIoKSB7CisgICAgR3JvdXBCdWdUZXN0LnBhc3NlZC5hZGQoIm9uZTIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50ZigiUlVOICVzLm9uZTIoKVxuIiwgZ2V0Q2xhc3MoKSk7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGJ1Zy9JVENhc2VUd28uamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGJ1Zy9JVENhc2VUd28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzgyYmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwYnVnL0lUQ2FzZVR3by5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdGVzdC5ncm91cGJ1ZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIElUQ2FzZVR3byB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMuYmVmb3JlQ2xhc3MoKVxuIiwgZ2V0Q2xhc3MoKSk7CisgIH0KKworICBAQWZ0ZXJDbGFzcyhhbHdheXNSdW4gPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMuYWZ0ZXJDbGFzcygpXG4iLCBnZXRDbGFzcygpKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJzdGQtdHdvIikKKyAgcHVibGljIHZvaWQgdHdvMSgpIHsKKyAgICBHcm91cEJ1Z1Rlc3QucGFzc2VkLmFkZCgidHdvMSIpOworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJSVU4gJXMudHdvMSgpXG4iLCBnZXRDbGFzcygpKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJsb2dpYy10d28iLCBkZXBlbmRzT25Hcm91cHMgPSAic3RkLXR3byIpCisgIHB1YmxpYyB2b2lkIHR3bzIoKSB7CisgICAgR3JvdXBCdWdUZXN0LnBhc3NlZC5hZGQoInR3bzIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50ZigiUlVOICVzLnR3bzIoKVxuIiwgZ2V0Q2xhc3MoKSk7CisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGludm9jYXRpb24vRHVtbXlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0R1bW15VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTlmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0R1bW15VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgdGVzdC5ncm91cGludm9jYXRpb247DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgRHVtbXlUZXN0IHsNCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IHNfZXh0ZXJuYWxDbGFzc0dyb3Vwcz0gbmV3IEhhc2hNYXA8PigpOw0KKw0KKyAgQFRlc3QoZ3JvdXBzPXsiYSJ9KQ0KKyAgcHVibGljIHZvaWQgdGVzdEEoKSB7DQorICB9DQorDQorICBAVGVzdChncm91cHM9eyJiIn0pDQorICBwdWJsaWMgdm9pZCB0ZXN0QigpIHsNCisgIH0NCisNCisgIEBUZXN0KGdyb3Vwcz17ImEiLCAiYiJ9KQ0KKyAgcHVibGljIHZvaWQgdGVzdEFCKCkgew0KKyAgfQ0KKw0KKyAgQEFmdGVyQ2xhc3MoYWx3YXlzUnVuPXRydWUpDQorICBwdWJsaWMgdm9pZCBjaGVja0ludm9jYXRpb25zKCkgew0KKyAgICBJbnRlZ2VyIGhhc2hDb2RlMT0gc19leHRlcm5hbENsYXNzR3JvdXBzLmdldCgiYmVmb3JlR3JvdXBzIik7DQorICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGhhc2hDb2RlMSwgIkV4dGVybmFsIEBCZWZvcmVHcm91cHMgbm90IGludm9rZWQiKTsNCisgICAgSW50ZWdlciBoYXNoQ29kZTI9IHNfZXh0ZXJuYWxDbGFzc0dyb3Vwcy5nZXQoImFmdGVyR3JvdXBzIik7DQorICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGhhc2hDb2RlMiwgIkV4dGVybmFsIEBBZnRlckdyb3VwcyBub3QgaW52b2tlZCIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGhhc2hDb2RlMSwgaGFzaENvZGUyLCAiRXh0ZXJuYWwgQEJlZm9yZUdyb3VwcyBhbmQgQEFmdGVyR3JvdXBzIHdlcmUgbm90IGludm9rZWQgb24gdGhlIiArDQorICAgICAgICAiIHNhbWUgY2xhc3MgaW5zdGFuY2UiKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQHBhcmFtIHN0cmluZw0KKyAgICogQHBhcmFtIGkNCisgICAqLw0KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlY29yZEludm9jYXRpb24oU3RyaW5nIHN0cmluZywgaW50IGkpIHsNCisgICAgc19leHRlcm5hbENsYXNzR3JvdXBzLnB1dChzdHJpbmcsIGkpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0R1bW15VGVzdDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGludm9jYXRpb24vRHVtbXlUZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzIwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0R1bW15VGVzdDIuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZ3JvdXBpbnZvY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgRHVtbXlUZXN0MiB7DQorICBwcml2YXRlIGJvb2xlYW4gbV9pbnZva2VkPSBmYWxzZTsNCisNCisgIEBUZXN0KGdyb3Vwcz17IkEifSkNCisgIHB1YmxpYyB2b2lkIGR1bW15VGVzdCgpIHsNCisgICAgbV9pbnZva2VkPSB0cnVlOw0KKyAgfQ0KKw0KKyAgQEFmdGVyQ2xhc3MoYWx3YXlzUnVuPXRydWUpDQorICBwdWJsaWMgdm9pZCBjaGVja0ludm9jYXRpb25zKCkgew0KKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9pbnZva2VkLCAiQFRlc3QgbWV0aG9kIGludm9rZWQgZXZlbiBpZiBAQmVmb3JlR3JvdXBzIGZhaWxlZCIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0ZhaWxpbmdCZWZvcmVHcm91cE1ldGhvZC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi9GYWlsaW5nQmVmb3JlR3JvdXBNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTllMzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi9GYWlsaW5nQmVmb3JlR3JvdXBNZXRob2QuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuZ3JvdXBpbnZvY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGYWlsaW5nQmVmb3JlR3JvdXBNZXRob2Qgew0KKyAgQEJlZm9yZUdyb3Vwcyhncm91cHM9eyJBIn0pDQorICBwdWJsaWMgdm9pZCBiZWZvcmVHcm91cEEoKSB7DQorICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsaW5nIEBCZWZvcmVHcm91cHMgYmVmb3JlR3JvdXBBIG1ldGhvZCIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0dyb3VwQ29uZmlndXJhdGlvbi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi9Hcm91cENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWEzNTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi9Hcm91cENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QuZ3JvdXBpbnZvY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHcm91cENvbmZpZ3VyYXRpb24gew0KKyAgQEJlZm9yZUdyb3Vwcyhncm91cHM9eyJhIn0pDQorICBwdWJsaWMgdm9pZCBiZWZvcmVHcm91cHMoKSB7DQorICAgIER1bW15VGVzdC5yZWNvcmRJbnZvY2F0aW9uKCJiZWZvcmVHcm91cHMiLCBoYXNoQ29kZSgpKTsNCisgIH0NCisNCisgIEBBZnRlckdyb3Vwcyhncm91cHM9eyJhIn0pDQorICBwdWJsaWMgdm9pZCBhZnRlckdyb3VwcygpIHsNCisgICAgRHVtbXlUZXN0LnJlY29yZEludm9jYXRpb24oImFmdGVyR3JvdXBzIiwgaGFzaENvZGUoKSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGludm9jYXRpb24vR3JvdXBTdWl0ZVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGludm9jYXRpb24vR3JvdXBTdWl0ZVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjUxYmRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi9Hcm91cFN1aXRlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5ncm91cGludm9jYXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cFN1aXRlU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZ3JvdXBzID0gImEiKQorICBwdWJsaWMgdm9pZCBhKCkge30KKworICBAVGVzdChncm91cHMgPSAiYiIpCisgIHB1YmxpYyB2b2lkIGIoKSB7fQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGMoKSB7fQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0dyb3VwU3VpdGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL0dyb3VwU3VpdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiYTRkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ncm91cGludm9jYXRpb24vR3JvdXBTdWl0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACitwYWNrYWdlIHRlc3QuZ3JvdXBpbnZvY2F0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGVzdCB0aGF0IDxzdWl0ZT4gdGFncyBjYW4gaGF2ZSBncm91cHMuCisgKi8KK0BUZXN0CitwdWJsaWMgY2xhc3MgR3JvdXBTdWl0ZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgcHVibGljIHZvaWQgaW5jbHVkZUZyb21TdWl0ZTAoKSB7CisgICAgcnVuV2l0aFN1aXRlKGcoKSwgZygpLCBnKCJhIiwgImIiLCAiYyIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGluY2x1ZGVGcm9tU3VpdGUxKCkgeworICAgIHJ1bldpdGhTdWl0ZShnKCJhIiksIGcoKSwgZygiYSIpKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgaW5jbHVkZUZyb21TdWl0ZTIoKSB7CisgICAgcnVuV2l0aFN1aXRlKGcoImEiLCAiYiIpLCBnKCksIGcoImEiLCAiYiIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGV4Y2x1ZGVGcm9tU3VpdGUxKCkgeworICAgIHJ1bldpdGhTdWl0ZShnKCksIGcoImEiKSwgZygiYiIsICJjIikpOworICB9CisKKyAgcHVibGljIHZvaWQgZXhjbHVkZUZyb21TdWl0ZTIoKSB7CisgICAgcnVuV2l0aFN1aXRlKGcoKSwgZygiYSIsICJiIiksIGcoImMiKSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJJbmNsdWRlIGluIGJvdGggc3VpdGUgYW5kIHRlc3QiKQorICBwdWJsaWMgdm9pZCBpbmNsdWRlVGVzdEFuZFN1aXRlMSgpIHsKKyAgICBydW5XaXRoU3VpdGUoZygiYSIpLCBnKCksIGcoImIiKSwgZygpLCBnKCJhIiwgImIiKSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJJbmNsdWRlIGluIHN1aXRlLCBleGNsdWRlIGluIHRlc3QiKQorICBwdWJsaWMgdm9pZCBleGNsdWRlVGVzdEFuZFN1aXRlMigpIHsKKyAgICBydW5XaXRoU3VpdGUoZygpLCBnKCJhIiksIGcoKSwgZygiYSIpLCBnKCJiIiwgImMiKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuV2l0aFN1aXRlKFN0cmluZ1tdIHN1aXRlR3JvdXBzLCBTdHJpbmdbXSBleGNsdWRlZFN1aXRlR3JvdXBzLAorICAgICAgU3RyaW5nW10gbWV0aG9kcykgeworICAgIHJ1bldpdGhTdWl0ZShzdWl0ZUdyb3VwcywgZXhjbHVkZWRTdWl0ZUdyb3VwcywgZygpLCBnKCksIG1ldGhvZHMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1bldpdGhTdWl0ZShTdHJpbmdbXSBzdWl0ZUdyb3VwcywgU3RyaW5nW10gZXhjbHVkZWRTdWl0ZUdyb3VwcywKKyAgICAgIFN0cmluZ1tdIHRlc3RHcm91cHMsIFN0cmluZ1tdIGV4Y2x1ZGVkVGVzdEdyb3VwcywKKyAgICAgIFN0cmluZ1tdIG1ldGhvZHMpIHsKKyAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoIkdyb3VwcyIpOworICAgIHMuc2V0SW5jbHVkZWRHcm91cHMoQXJyYXlzLmFzTGlzdChzdWl0ZUdyb3VwcykpOworICAgIHMuc2V0RXhjbHVkZWRHcm91cHMoQXJyYXlzLmFzTGlzdChleGNsdWRlZFN1aXRlR3JvdXBzKSk7CisgICAgWG1sVGVzdCB0ID0gY3JlYXRlWG1sVGVzdChzLCAiR3JvdXBzLXRlc3QiLCBHcm91cFN1aXRlU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHQuc2V0SW5jbHVkZWRHcm91cHMoQXJyYXlzLmFzTGlzdCh0ZXN0R3JvdXBzKSk7CisgICAgdC5zZXRFeGNsdWRlZEdyb3VwcyhBcnJheXMuYXNMaXN0KGV4Y2x1ZGVkVGVzdEdyb3VwcykpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxTdWl0ZVtdIHsgcyB9KSk7CisgICAgdG5nLnJ1bigpOworCisgICAgdmVyaWZ5UGFzc2VkVGVzdHModGxhLCBtZXRob2RzKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gZyhTdHJpbmcuLi4gZ3JvdXBzKSB7CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi90ZXN0bmcueG1sIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2dyb3VwaW52b2NhdGlvbi90ZXN0bmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNGM4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3JvdXBpbnZvY2F0aW9uL3Rlc3RuZy54bWwKQEAgLTAsMCArMSwzMyBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4NCis8c3VpdGUgbmFtZT0iR3JvdXBzIHJ1biIgdmVyYm9zZT0iMiI+CisgIDx0ZXN0IG5hbWU9IkV4dGVybmFsIGdyb3VwIGludm9jYXRpb24iPg0KKwkJPGdyb3Vwcz4NCisJCQk8cnVuPg0KKwkJCQk8aW5jbHVkZSBuYW1lPSJhIiAvPg0KKwkJCTwvcnVuPg0KKwkJPC9ncm91cHM+DQorCQk8Y2xhc3Nlcz4NCisJCQk8Y2xhc3MgbmFtZT0idGVzdC5ncm91cGludm9jYXRpb24uR3JvdXBDb25maWd1cmF0aW9uIiAvPg0KKwkJCTxjbGFzcyBuYW1lPSJ0ZXN0Lmdyb3VwaW52b2NhdGlvbi5EdW1teVRlc3QiIC8+DQorCQk8L2NsYXNzZXM+DQorICA8L3Rlc3Q+DQorCTx0ZXN0IG5hbWU9IkZhaWxpbmcgRXh0ZXJuYWwgQmVmb3JlR3JvdXBzIC0gR3JvdXAgcnVuIj4NCisJCTxncm91cHM+DQorCQkJPHJ1bj4NCisJCQkJPGluY2x1ZGUgbmFtZT0iQSIgLz4NCisJCQk8L3J1bj4NCisJCTwvZ3JvdXBzPg0KKwkJPGNsYXNzZXM+DQorCQkJPGNsYXNzIG5hbWU9InRlc3QuZ3JvdXBpbnZvY2F0aW9uLkZhaWxpbmdCZWZvcmVHcm91cE1ldGhvZCIgLz4NCisJCQk8Y2xhc3MgbmFtZT0idGVzdC5ncm91cGludm9jYXRpb24uRHVtbXlUZXN0MiIgLz4NCisJCTwvY2xhc3Nlcz4NCisgIDwvdGVzdD4NCisJDQorCTx0ZXN0IG5hbWU9IkZhaWxpbmcgRXh0ZXJuYWwgQmVmb3JlR3JvdXBzIC0gTm8gZ3JvdXAgcnVuIj4NCisJCTxjbGFzc2VzPg0KKwkJCTxjbGFzcyBuYW1lPSJ0ZXN0Lmdyb3VwaW52b2NhdGlvbi5GYWlsaW5nQmVmb3JlR3JvdXBNZXRob2QiIC8+DQorCQkJPGNsYXNzIG5hbWU9InRlc3QuZ3JvdXBpbnZvY2F0aW9uLkR1bW15VGVzdDIiIC8+DQorCQk8L2NsYXNzZXM+DQorICA8L3Rlc3Q+DQorPC9zdWl0ZT4NCisNCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvRXhhbXBsZVNpbmdsZXRvbi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0V4YW1wbGVTaW5nbGV0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM3OTFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0V4YW1wbGVTaW5nbGV0b24uamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK3B1YmxpYyBjbGFzcyBFeGFtcGxlU2luZ2xldG9uIGltcGxlbWVudHMgSVNpbmdsZXRvbiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2luZyBzb21ldGhpbmciKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2UxVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU0MTNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlMVRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK0BHdWljZShtb2R1bGVzID0gR3VpY2VFeGFtcGxlTW9kdWxlLmNsYXNzKQorcHVibGljIGNsYXNzIEd1aWNlMVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIHN0YXRpYyBJU2luZ2xldG9uIG1fb2JqZWN0OworCisgIEBJbmplY3QKKyAgSVNpbmdsZXRvbiBtX3NpbmdsZXRvbjsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaW5nbGV0b25TaG91bGRXb3JrKCkgeworICAgIG1fc2luZ2xldG9uLmRvU29tZXRoaW5nKCk7CisgICAgbV9vYmplY3QgPSBtX3NpbmdsZXRvbjsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2UyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUxNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlMlRlc3QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK0BHdWljZShtb2R1bGVzID0gR3VpY2VFeGFtcGxlTW9kdWxlLmNsYXNzKQorcHVibGljIGNsYXNzIEd1aWNlMlRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIHN0YXRpYyBJU2luZ2xldG9uIG1fb2JqZWN0OworCisgIEBJbmplY3QKKyAgSVNpbmdsZXRvbiBtX3NpbmdsZXRvbjsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaW5nbGV0b25TaG91bGRXb3JrKCkgeworICAgIG1fb2JqZWN0ID0gbV9zaW5nbGV0b247CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWJhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VCYXNlLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworCitAR3VpY2UobW9kdWxlcyA9IEd1aWNlRXhhbXBsZU1vZHVsZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBHdWljZUJhc2UgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VFeGFtcGxlTW9kdWxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VFeGFtcGxlTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2YWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZUV4YW1wbGVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworcHVibGljIGNsYXNzIEd1aWNlRXhhbXBsZU1vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShCaW5kZXIgYmluZGVyKSB7CisgICAgYmluZGVyLmJpbmQoSVNpbmdsZXRvbi5jbGFzcykudG8oRXhhbXBsZVNpbmdsZXRvbi5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VJbmhlcml0YW5jZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZUluaGVyaXRhbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzI4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VJbmhlcml0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHdWljZUluaGVyaXRhbmNlVGVzdCBleHRlbmRzIEd1aWNlQmFzZSB7CisKKyAgQEluamVjdAorICBJU2luZ2xldG9uIG1fc2luZ2xldG9uOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNpbmdsZXRvblNob3VsZFdvcmsoKSB7CisgICAgbV9zaW5nbGV0b24uZG9Tb21ldGhpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlTW9kdWxlRmFjdG9yeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZU1vZHVsZUZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZmMzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZU1vZHVsZUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0Lmd1aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5HdWljZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BHdWljZShtb2R1bGVGYWN0b3J5ID0gTW9kdWxlRmFjdG9yeS5jbGFzcykKK3B1YmxpYyBjbGFzcyBHdWljZU1vZHVsZUZhY3RvcnlUZXN0IHsKKworICBASW5qZWN0CisgIElTaW5nbGV0b24gbV9zaW5nbGV0b247CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2luZ2xldG9uU2hvdWxkV29yaygpIHsKKyAgICBtX3NpbmdsZXRvbi5kb1NvbWV0aGluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VOb01vZHVsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZU5vTW9kdWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmQ4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VOb01vZHVsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQEd1aWNlCitwdWJsaWMgY2xhc3MgR3VpY2VOb01vZHVsZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVBhcmVudE1vZHVsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlUGFyZW50TW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkYTg1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVBhcmVudE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKKworcHVibGljIGNsYXNzIEd1aWNlUGFyZW50TW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworCisgIHByaXZhdGUgZmluYWwgSVRlc3RDb250ZXh0IGNvbnRleHQ7CisKKyAgcHVibGljIEd1aWNlUGFyZW50TW9kdWxlKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChNeVNlcnZpY2UuY2xhc3MpLnRvUHJvdmlkZXIoTXlTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOworICAgIGJpbmQoTXlDb250ZXh0LmNsYXNzKS50byhNeUNvbnRleHRJbXBsLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgIGJpbmQoSVRlc3RDb250ZXh0LmNsYXNzKS50b0luc3RhbmNlKGNvbnRleHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VQYXJlbnRNb2R1bGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvR3VpY2VQYXJlbnRNb2R1bGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxYzBkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVBhcmVudE1vZHVsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkd1aWNlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworQFRlc3QKK0BHdWljZShtb2R1bGVzID0gR3VpY2VUZXN0TW9kdWxlLmNsYXNzKQorcHVibGljIGNsYXNzIEd1aWNlUGFyZW50TW9kdWxlVGVzdCB7CisgIEBJbmplY3QKKyAgTXlTZXNzaW9uIG15U2Vzc2lvbjsKKyAgQEluamVjdAorICBNeVNlcnZpY2UgbXlTZXJ2aWNlOworICBASW5qZWN0CisgIElUZXN0Q29udGV4dCBjb250ZXh0OworCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlKCkgeworICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG15U2VydmljZSk7CisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobXlTZXNzaW9uKTsKKyAgICBteVNlcnZpY2Uuc2VydmUobXlTZXNzaW9uKTsKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb250ZXh0KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0TmFtZSgpLCAiR3VpY2UiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0U3VpdGUoKS5nZXROYW1lKCksICJwYXJlbnQtbW9kdWxlLXN1aXRlIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjNhYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGNsYXNzIEd1aWNlVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBndWljZVRlc3QoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShuZXcgQ2xhc3NbXSB7IEd1aWNlMVRlc3QuY2xhc3MsIEd1aWNlMlRlc3QuY2xhc3N9KTsKKyAgICBHdWljZTFUZXN0Lm1fb2JqZWN0ID0gbnVsbDsKKyAgICBHdWljZTJUZXN0Lm1fb2JqZWN0ID0gbnVsbDsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChHdWljZTFUZXN0Lm1fb2JqZWN0KTsKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChHdWljZTJUZXN0Lm1fb2JqZWN0KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEd1aWNlMVRlc3QubV9vYmplY3QsIEd1aWNlMlRlc3QubV9vYmplY3QpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZ3VpY2VXaXRoTm9Nb2R1bGVzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUobmV3IENsYXNzW10geyBHdWljZU5vTW9kdWxlVGVzdC5jbGFzcyB9KTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVRlc3RNb2R1bGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9HdWljZVRlc3RNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ0MDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL0d1aWNlVGVzdE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIEd1aWNlVGVzdE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKyAgcHJpdmF0ZSBmaW5hbCBNeUNvbnRleHQgbXlDb250ZXh0OworCisgIEBJbmplY3QKKyAgR3VpY2VUZXN0TW9kdWxlKE15Q29udGV4dCBteUNvbnRleHQpIHsKKyAgICB0aGlzLm15Q29udGV4dCA9IG15Q29udGV4dDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChNeVNlc3Npb24uY2xhc3MpLnRvSW5zdGFuY2UobXlDb250ZXh0LmdldFNlc3Npb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9JU2luZ2xldG9uLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvSVNpbmdsZXRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDVmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvSVNpbmdsZXRvbi5qYXZhCkBAIC0wLDAgKzEsNiBAQAorcGFja2FnZSB0ZXN0Lmd1aWNlOworCitwdWJsaWMgaW50ZXJmYWNlIElTaW5nbGV0b24geworCisgIHZvaWQgZG9Tb21ldGhpbmcoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9Nb2R1bGVGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTW9kdWxlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2U4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTW9kdWxlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU1vZHVsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBNb2R1bGVGYWN0b3J5IGltcGxlbWVudHMgSU1vZHVsZUZhY3RvcnkgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgTW9kdWxlIGNyZWF0ZU1vZHVsZShJVGVzdENvbnRleHQgY29udGV4dCwgQ2xhc3M8Pz4gdGVzdENsYXNzKSB7CisgICAgU3RyaW5nIHBhcmFtZXRlciA9IGNvbnRleHQuZ2V0Q3VycmVudFhtbFRlc3QoKS5nZXRQYXJhbWV0ZXIoImluamVjdCIpOworICAgIFN0cmluZyBleHBlY3RlZCA9ICJndWljZSI7CisgICAgaWYgKCEgZXhwZWN0ZWQuZXF1YWxzKHBhcmFtZXRlcikpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRlZCBwYXJhbWV0ZXIgdG8gYmUgIiArIGV4cGVjdGVkICsgIiwgZ290ICIgKyBwYXJhbWV0ZXIpOworICAgIH0KKyAgICBpZiAoR3VpY2VNb2R1bGVGYWN0b3J5VGVzdC5jbGFzcyA9PSB0ZXN0Q2xhc3MpIHsKKyAgICAgIHJldHVybiBuZXcgR3VpY2VFeGFtcGxlTW9kdWxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjcmVhdGUgYSBtb2R1bGUgZm9yIGNsYXNzICIgKyB0ZXN0Q2xhc3MpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlDb250ZXh0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3ODM5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9NeUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworcHVibGljIGludGVyZmFjZSBNeUNvbnRleHQgeworCisgIE15U2Vzc2lvbiBnZXRTZXNzaW9uKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlDb250ZXh0SW1wbC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL015Q29udGV4dEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMyMWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL015Q29udGV4dEltcGwuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKKworcHVibGljIGNsYXNzIE15Q29udGV4dEltcGwgaW1wbGVtZW50cyBNeUNvbnRleHQgeworICBwcml2YXRlIGZpbmFsIE15U2Vzc2lvbiBteVNlc3Npb24gPSBuZXcgTXlTZXNzaW9uKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNeVNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKyAgICByZXR1cm4gbXlTZXNzaW9uOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlTZXJ2aWNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ODJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9NeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgdGVzdC5ndWljZTsKKworcHVibGljIGludGVyZmFjZSBNeVNlcnZpY2UgeworCisgIHZvaWQgc2VydmUoTXlTZXNzaW9uIG15U2Vzc2lvbik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlTZXJ2aWNlUHJvdmlkZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ndWljZS9NeVNlcnZpY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OGY4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlTZXJ2aWNlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIE15U2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8TXlTZXJ2aWNlPiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNeVNlcnZpY2UgZ2V0KCkgeworICAgIHJldHVybiBuZXcgTXlTZXJ2aWNlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShNeVNlc3Npb24gbXlTZXNzaW9uKSB7CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL015U2Vzc2lvbi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2d1aWNlL015U2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWM1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvZ3VpY2UvTXlTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIHRlc3QuZ3VpY2U7CisKK3B1YmxpYyBjbGFzcyBNeVNlc3Npb24geworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9CYXNlQ29uZmlndXJhYmxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9CYXNlQ29uZmlndXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YzhhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0Jhc2VDb25maWd1cmFibGUuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZUNvbmZpZ3VyYWJsZSBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgeworICBzdGF0aWMgaW50IG1faG9va0NvdW50ID0gMDsKKyAgc3RhdGljIGJvb2xlYW4gbV9icyA9IGZhbHNlOworICBzdGF0aWMgYm9vbGVhbiBtX2J0ID0gZmFsc2U7CisgIHN0YXRpYyBib29sZWFuIG1fYm0gPSBmYWxzZTsKKyAgc3RhdGljIGJvb2xlYW4gbV9iYyA9IGZhbHNlOworICBzdGF0aWMgU3RyaW5nIG1fbWV0aG9kTmFtZSA9IG51bGw7CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGJzKCkgeworICAgIG1fYnMgPSB0cnVlOworICB9CisKKyAgQEJlZm9yZVRlc3QKKyAgcHVibGljIHZvaWQgYnQoKSB7CisgICAgbV9idCA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJtKE1ldGhvZCBtKSB7CisgICAgbV9ibSA9IHRydWU7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgbV9iYyA9IHRydWU7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svQ29uZmlndXJhYmxlRmFpbHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0NvbmZpZ3VyYWJsZUZhaWx1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3NzFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0NvbmZpZ3VyYWJsZUZhaWx1cmVUZXN0LmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSB0ZXN0Lmhvb2s7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklDb25maWd1cmFibGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJlQ2FsbEJhY2s7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGVzdCBoYXJuZXNzIGZvciB7QGxpbmsgSUNvbmZpZ3VyYWJsZX0KKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZUZhaWx1cmVUZXN0IGV4dGVuZHMgQmFzZUNvbmZpZ3VyYWJsZSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihJQ29uZmlndXJlQ2FsbEJhY2sgY2FsbEJhY2ssIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBtX2hvb2tDb3VudCsrOworICAgIC8vIE5vdCBjYWxsaW5nIHRoZSBjYWxsYmFjaworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaG9va1dhc05vdFJ1bigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobV9iYyk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fYm0pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Db25maWd1cmFibGVMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svQ29uZmlndXJhYmxlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ5ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svQ29uZmlndXJhYmxlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklDb25maWd1cmVDYWxsQmFjazsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKKyAgc3RhdGljIGludCBtX2hvb2tDb3VudCA9IDA7CisgIHN0YXRpYyBTdHJpbmcgbV9tZXRob2ROYW1lOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oSUNvbmZpZ3VyZUNhbGxCYWNrIGNhbGxCYWNrLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgbV9ob29rQ291bnQrKzsKKyAgICBPYmplY3RbXSBwYXJhbWV0ZXJzID0gY2FsbEJhY2suZ2V0UGFyYW1ldGVycygpOworICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgIG1fbWV0aG9kTmFtZSA9ICgoTWV0aG9kKSBwYXJhbWV0ZXJzWzBdKS5nZXROYW1lKCk7CisgICAgfQorICAgIGNhbGxCYWNrLnJ1bkNvbmZpZ3VyYXRpb25NZXRob2QodGVzdFJlc3VsdCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svQ29uZmlndXJhYmxlU3VjY2Vzc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0NvbmZpZ3VyYWJsZVN1Y2Nlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3MzAyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0NvbmZpZ3VyYWJsZVN1Y2Nlc3NUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB0ZXN0Lmhvb2s7CisKK2ltcG9ydCBvcmcudGVzdG5nLklDb25maWd1cmFibGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJlQ2FsbEJhY2s7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKworLyoqCisgKiBUZXN0IGhhcm5lc3MgZm9yIHtAbGluayBJQ29uZmlndXJhYmxlfQorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlU3VjY2Vzc1Rlc3QgZXh0ZW5kcyBCYXNlQ29uZmlndXJhYmxlIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bihJQ29uZmlndXJlQ2FsbEJhY2sgY2FsbEJhY2ssIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBtX2hvb2tDb3VudCsrOworICAgIE9iamVjdFtdIHBhcmFtZXRlcnMgPSBjYWxsQmFjay5nZXRQYXJhbWV0ZXJzKCk7CisgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkgeworICAgICAgbV9tZXRob2ROYW1lID0gKChNZXRob2QpIHBhcmFtZXRlcnNbMF0pLmdldE5hbWUoKTsKKyAgICB9CisgICAgY2FsbEJhY2sucnVuQ29uZmlndXJhdGlvbk1ldGhvZCh0ZXN0UmVzdWx0KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGhvb2tXYXNSdW4oKSB7CisvLyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG1faG9va0NvdW50LCAyKTsKKy8vICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmMpOworLy8gICAgQXNzZXJ0LmFzc2VydFRydWUobV9ibSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0NvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Db25maWd1cmFibGVTdWNjZXNzV2l0aExpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMmYxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Db25maWd1cmFibGVTdWNjZXNzV2l0aExpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgdGVzdC5ob29rOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworQExpc3RlbmVycyhDb25maWd1cmFibGVMaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb25maWd1cmFibGVTdWNjZXNzV2l0aExpc3RlbmVyVGVzdCB7CisgIHN0YXRpYyBib29sZWFuIG1fYm0gPSBmYWxzZTsKKyAgc3RhdGljIGJvb2xlYW4gbV9iYyA9IGZhbHNlOworICBzdGF0aWMgYm9vbGVhbiBtX2J0OworICBzdGF0aWMgYm9vbGVhbiBtX2JzOworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBicygpIHsKKyAgICBtX2JzID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYnQoKSB7CisgICAgbV9idCA9IHRydWU7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJtKE1ldGhvZCBtKSB7CisgICAgbV9ibSA9IHRydWU7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgbV9iYyA9IHRydWU7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBob29rV2FzUnVuKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ29uZmlndXJhYmxlTGlzdGVuZXIubV9ob29rQ291bnQsIDIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmMpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYm0pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rRmFpbHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2tGYWlsdXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzEyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rRmFpbHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUhvb2tDYWxsQmFjazsKK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEhvb2tGYWlsdXJlVGVzdCBpbXBsZW1lbnRzIElIb29rYWJsZSB7CisgIHN0YXRpYyBib29sZWFuIG1faG9vayA9IGZhbHNlOworICBzdGF0aWMgYm9vbGVhbiBtX3Rlc3RXYXNSdW4gPSBmYWxzZTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKElIb29rQ2FsbEJhY2sgY2FsbEJhY2ssIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBtX2hvb2sgPSB0cnVlOworICAgIC8vIE5vdCBpbnZva2luZyB0aGUgY2FsbGJhY2s6ICB0aGUgbWV0aG9kIHNob3VsZCBub3QgYmUgcnVuCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgbV90ZXN0V2FzUnVuID0gdHJ1ZTsKKyAgfQorCisvLyAgQEFmdGVyTWV0aG9kCisvLyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisvLyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2hvb2spOworLy8gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1fdGVzdFdhc1J1bik7CisvLyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0hvb2tGYWlsdXJlVGVzdF0gIiArIHN0cmluZyk7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2tMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTMwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUhvb2tDYWxsQmFjazsKK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworCitwdWJsaWMgY2xhc3MgSG9va0xpc3RlbmVyIGltcGxlbWVudHMgSUhvb2thYmxlIHsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIG1faG9vayA9IGZhbHNlOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oSUhvb2tDYWxsQmFjayBjYWxsQmFjaywgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIG1faG9vayA9IHRydWU7CisgICAgY2FsbEJhY2sucnVuVGVzdE1ldGhvZCh0ZXN0UmVzdWx0KTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2VzczU5OVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2tTdWNjZXNzNTk5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2MyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2VzczU5OVRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUhvb2tDYWxsQmFjazsKK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRlc3QgaGFybmVzcyBmb3Ige0BsaW5rIElIb29rYWJsZX0KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAc2luY2UgQXVnIDAxLCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBIb29rU3VjY2VzczU5OVRlc3QgaW1wbGVtZW50cyBJSG9va2FibGUgeworICBzdGF0aWMgYm9vbGVhbiBtX2hvb2sgPSBmYWxzZTsKKyAgc3RhdGljIGJvb2xlYW4gbV90ZXN0V2FzUnVuID0gZmFsc2U7CisgIHN0YXRpYyBTdHJpbmcgbV9wYXJhbWV0ZXIgPSBudWxsOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oSUhvb2tDYWxsQmFjayBjYWxsQmFjaywgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIG1faG9vayA9IHRydWU7CisgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IGNhbGxCYWNrLmdldFBhcmFtZXRlcnMoKTsKKyAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CisgICAgICBtX3BhcmFtZXRlciA9IHBhcmFtZXRlcnNbMF0udG9TdHJpbmcoKTsKKyAgICB9CisgICAgY2FsbEJhY2sucnVuVGVzdE1ldGhvZCh0ZXN0UmVzdWx0KTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgImZvbyIgfQorICAgIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiLCB0aW1lT3V0ID0gMTAwKQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoU3RyaW5nIG5hbWUpIHsKKyAgICBtX3Rlc3RXYXNSdW4gPSB0cnVlOworICAgIFJlcG9ydGVyLmxvZygib3V0cHV0IGZyb20gaG9vayB0ZXN0LnZlcmlmeSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2Vzczg2MlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2tTdWNjZXNzODYyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmY1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2Vzczg2MlRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuKjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBIb29rU3VjY2Vzczg2MlRlc3QgaW1wbGVtZW50cyBJSG9va2FibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKElIb29rQ2FsbEJhY2sgY2FsbEJhY2ssIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRlc3RSZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0Q29uc3RydWN0b3JPck1ldGhvZCgpLmdldE1ldGhvZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxCYWNrLmdldFBhcmFtZXRlcnMoKS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKClbaV07CisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOYW1lZCkgeworICAgICAgICAgICAgICAgICAgICBOYW1lZCBuYW1lZCA9IChOYW1lZCkgYW5ub3RhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgY2FsbEJhY2suZ2V0UGFyYW1ldGVycygpWzBdID0gY2FsbEJhY2suZ2V0UGFyYW1ldGVycygpWzBdICsgbmFtZWQudmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FsbEJhY2sucnVuVGVzdE1ldGhvZCh0ZXN0UmVzdWx0KTsKKyAgICB9CisKKyAgICBARGF0YVByb3ZpZGVyCisgICAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ImZvbyIsICJ0ZXN0In0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICAgIHB1YmxpYyB2b2lkIHZlcmlmeShATmFtZWQoImJhciIpIFN0cmluZyBiYXIsIFN0cmluZyB0ZXN0KSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYmFyLCAiZm9vYmFyIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdCwgInRlc3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2Vzc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2tTdWNjZXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNWU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2Vzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIHRlc3QuaG9vazsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUhvb2tDYWxsQmFjazsKK2ltcG9ydCBvcmcudGVzdG5nLklIb29rYWJsZTsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRlc3QgaGFybmVzcyBmb3Ige0BsaW5rIElIb29rYWJsZX0KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjZWRyaWNAYmV1c3QuY29tIj5DZWRyaWMgQmV1c3Q8L2E+CisgKiBAc2luY2UgQXVnIDAxLCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBIb29rU3VjY2Vzc1Rlc3QgaW1wbGVtZW50cyBJSG9va2FibGUgeworICBzdGF0aWMgYm9vbGVhbiBtX2hvb2sgPSBmYWxzZTsKKyAgc3RhdGljIGJvb2xlYW4gbV90ZXN0V2FzUnVuID0gZmFsc2U7CisgIHN0YXRpYyBTdHJpbmcgbV9wYXJhbWV0ZXIgPSBudWxsOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oSUhvb2tDYWxsQmFjayBjYWxsQmFjaywgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIG1faG9vayA9IHRydWU7CisgICAgT2JqZWN0W10gcGFyYW1ldGVycyA9IGNhbGxCYWNrLmdldFBhcmFtZXRlcnMoKTsKKyAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7CisgICAgICBtX3BhcmFtZXRlciA9IHBhcmFtZXRlcnNbMF0udG9TdHJpbmcoKTsKKyAgICB9CisgICAgY2FsbEJhY2sucnVuVGVzdE1ldGhvZCh0ZXN0UmVzdWx0KTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgImZvbyIgfQorICAgIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoU3RyaW5nIG5hbWUpIHsKKyAgICBtX3Rlc3RXYXNSdW4gPSB0cnVlOworICAgIFJlcG9ydGVyLmxvZygib3V0cHV0IGZyb20gaG9vayB0ZXN0LnZlcmlmeSIpOworICB9CisKKy8vICBAQWZ0ZXJNZXRob2QKKy8vICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKy8vICAgIEFzc2VydC5hc3NlcnRUcnVlKG1faG9vayk7CisvLyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3Rlc3RXYXNSdW4pOworLy8gIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltIb29rVGVzdF0gIiArIHN0cmluZyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svSG9va1N1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rU3VjY2Vzc1dpdGhMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZmYjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2hvb2svSG9va1N1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0Lmhvb2s7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BMaXN0ZW5lcnMoSG9va0xpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEhvb2tTdWNjZXNzV2l0aExpc3RlbmVyVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKEhvb2tMaXN0ZW5lci5tX2hvb2spOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rYWJsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9ob29rL0hvb2thYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzg3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaG9vay9Ib29rYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorcGFja2FnZSB0ZXN0Lmhvb2s7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCisvKioKKyAqIEJlY2F1c2UgSUhvb2thYmxlIGFuZCBJQ29uZmlndXJhYmxlIGFyZSBnbG9iYWwsIGl0J3Mgc2FmZXIgdG8gcnVuIHRoZW0gaW4gYQorICogc3ViLVRlc3RORyBvYmplY3QsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgcnVuIGZvciB5b3VyIGVudGlyZSB0ZXN0IHN1aXRlLi4uCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEhvb2thYmxlVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJtKCkgeworICAgIEhvb2tTdWNjZXNzVGVzdC5tX2hvb2sgPSBmYWxzZTsKKyAgICBIb29rU3VjY2Vzc1Rlc3QubV90ZXN0V2FzUnVuID0gZmFsc2U7CisgICAgSG9va1N1Y2Nlc3NUZXN0Lm1fcGFyYW1ldGVyID0gbnVsbDsKKyAgICBIb29rU3VjY2VzczU5OVRlc3QubV9ob29rID0gZmFsc2U7CisgICAgSG9va1N1Y2Nlc3M1OTlUZXN0Lm1fdGVzdFdhc1J1biA9IGZhbHNlOworICAgIEhvb2tTdWNjZXNzNTk5VGVzdC5tX3BhcmFtZXRlciA9IG51bGw7CisgICAgSG9va0ZhaWx1cmVUZXN0Lm1faG9vayA9IGZhbHNlOworICAgIEhvb2tGYWlsdXJlVGVzdC5tX3Rlc3RXYXNSdW4gPSBmYWxzZTsKKyAgICBIb29rTGlzdGVuZXIubV9ob29rID0gZmFsc2U7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX2hvb2tDb3VudCA9IDA7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX2JjID0gZmFsc2U7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX2JtID0gZmFsc2U7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX2JzID0gZmFsc2U7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX2J0ID0gZmFsc2U7CisgICAgQmFzZUNvbmZpZ3VyYWJsZS5tX21ldGhvZE5hbWUgPSBudWxsOworICAgIENvbmZpZ3VyYWJsZUxpc3RlbmVyLm1faG9va0NvdW50ID0gMDsKKyAgICBDb25maWd1cmFibGVMaXN0ZW5lci5tX21ldGhvZE5hbWUgPSBudWxsOworICAgIENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0Lm1fYmMgPSBmYWxzZTsKKyAgICBDb25maWd1cmFibGVTdWNjZXNzV2l0aExpc3RlbmVyVGVzdC5tX2JtID0gZmFsc2U7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBob29rU3VjY2VzcygpIHsKKyAgICBhZGRDbGFzcyhIb29rU3VjY2Vzc1Rlc3QuY2xhc3MpOworICAgIHJ1bigpOworCisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIG5ldyBTdHJpbmdbXSB7ICJ2ZXJpZnkiIH0sIGdldFBhc3NlZFRlc3RzKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEhvb2tTdWNjZXNzVGVzdC5tX2hvb2spOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEhvb2tTdWNjZXNzVGVzdC5tX3Rlc3RXYXNSdW4pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSG9va1N1Y2Nlc3NUZXN0Lm1fcGFyYW1ldGVyLCAiZm9vIik7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvNTk5IikKKyAgcHVibGljIHZvaWQgaXNzdWU1OTkoKSB7CisgICAgYWRkQ2xhc3MoSG9va1N1Y2Nlc3M1OTlUZXN0LmNsYXNzKTsKKyAgICBydW4oKTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBuZXcgU3RyaW5nW10geyAidmVyaWZ5IiB9LCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShIb29rU3VjY2VzczU5OVRlc3QubV9ob29rKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShIb29rU3VjY2VzczU5OVRlc3QubV90ZXN0V2FzUnVuKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEhvb2tTdWNjZXNzNTk5VGVzdC5tX3BhcmFtZXRlciwgImZvbyIpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiaHR0cHM6Ly9naXRodWIuY29tL2NiZXVzdC90ZXN0bmcvcHVsbC84NjIiKQorICBwdWJsaWMgdm9pZCBpc3N1ZTg2MigpIHsKKyAgICBhZGRDbGFzcyhIb29rU3VjY2Vzczg2MlRlc3QuY2xhc3MpOworICAgIHJ1bigpOworCisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIG5ldyBTdHJpbmdbXSB7ICJ2ZXJpZnkiIH0sIGdldFBhc3NlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaG9va1N1Y2Nlc3NXaXRoTGlzdGVuZXIoKSB7CisgICAgYWRkQ2xhc3MoSG9va1N1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0LmNsYXNzKTsKKyAgICBydW4oKTsKKworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBuZXcgU3RyaW5nW10geyAidmVyaWZ5IiB9LCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShIb29rTGlzdGVuZXIubV9ob29rKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGhvb2tGYWlsdXJlKCkgeworICAgIGFkZENsYXNzKEhvb2tGYWlsdXJlVGVzdC5jbGFzcyk7CisgICAgcnVuKCk7CisKKyAgICAvLyBUbyBpbnZlc3RpZ2F0ZTogVGVzdE5HIHN0aWxsIHRoaW5rcyB0aGUgdGVzdCBwYXNzZWQgc2luY2UgaXQgY2FuJ3Qga25vdyB3aGV0aGVyCisgICAgLy8gdGhlIGhvb2sgZW5kZWQgdXAgaW52b2tpbmcgdGhlIHRlc3Qgb3Igbm90LgorLy8gICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIG5ldyBTdHJpbmdbXSB7IH0sIGdldFBhc3NlZFRlc3RzKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEhvb2tGYWlsdXJlVGVzdC5tX2hvb2spOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShIb29rRmFpbHVyZVRlc3QubV90ZXN0V2FzUnVuKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYWJsZVN1Y2Nlc3MoKSB7CisgICAgYWRkQ2xhc3MoQ29uZmlndXJhYmxlU3VjY2Vzc1Rlc3QuY2xhc3MpOworICAgIHJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCYXNlQ29uZmlndXJhYmxlLm1faG9va0NvdW50LCA0KTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCYXNlQ29uZmlndXJhYmxlLm1fYmMpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKEJhc2VDb25maWd1cmFibGUubV9ibSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoQmFzZUNvbmZpZ3VyYWJsZS5tX2JzKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCYXNlQ29uZmlndXJhYmxlLm1fYnQpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmFzZUNvbmZpZ3VyYWJsZS5tX21ldGhvZE5hbWUsICJob29rV2FzUnVuIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjb25maWd1cmFibGVTdWNjZXNzV2l0aExpc3RlbmVyKCkgeworICAgIGFkZENsYXNzKENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0LmNsYXNzKTsKKyAgICBydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ29uZmlndXJhYmxlTGlzdGVuZXIubV9ob29rQ291bnQsIDQpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0Lm1fYnMpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0Lm1fYnQpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0Lm1fYmMpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKENvbmZpZ3VyYWJsZVN1Y2Nlc3NXaXRoTGlzdGVuZXJUZXN0Lm1fYm0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ29uZmlndXJhYmxlTGlzdGVuZXIubV9tZXRob2ROYW1lLCAiaG9va1dhc1J1biIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY29uZmlndXJhYmxlRmFpbHVyZSgpIHsKKyAgICBhZGRDbGFzcyhDb25maWd1cmFibGVGYWlsdXJlVGVzdC5jbGFzcyk7CisgICAgcnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJhc2VDb25maWd1cmFibGUubV9ob29rQ291bnQsIDQpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShCYXNlQ29uZmlndXJhYmxlLm1fYmMpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShCYXNlQ29uZmlndXJhYmxlLm1fYm0pOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShCYXNlQ29uZmlndXJhYmxlLm1fYnMpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShCYXNlQ29uZmlndXJhYmxlLm1fYnQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS9CYXNlQ2xhc3NTY29wZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL0Jhc2VDbGFzc1Njb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzNDNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS9CYXNlQ2xhc3NTY29wZS5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSB0ZXN0LmluaGVyaXRhbmNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIEJhc2VDbGFzc1Njb3BlIHsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS9DaGlsZF8xLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvQ2hpbGRfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2Q5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvQ2hpbGRfMS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBDaGlsZF8xIGV4dGVuZHMgWkJhc2VfMCB7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBpbml0RGlhbG9nKCkgeworICAgIG1fbWV0aG9kTGlzdC5hZGQoImluaXREaWFsb2ciKTsKKyAgICBwcHAoIiAgSU5JVCAxIik7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd25EaWFsb2coKSB7CisgICAgbV9tZXRob2RMaXN0LmFkZCgidGVhckRvd25EaWFsb2ciKTsKKyAgICBwcHAoIiAgVEVBUl9ET1dOIDEiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKG1fdmVyYm9zZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQzFdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL0NsYXNzU2NvcGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvQ2xhc3NTY29wZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAyNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL0NsYXNzU2NvcGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LmluaGVyaXRhbmNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NTY29wZVRlc3QgZXh0ZW5kcyBCYXNlQ2xhc3NTY29wZSB7CisKKyAgcHJpdmF0ZSBib29sZWFuIG1fdmVyaWZ5ID0gZmFsc2U7CisKKyAgcHVibGljIHZvaWQgc2V0VmVyaWZ5KCkgeworICAgIG1fdmVyaWZ5ID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAic2V0VmVyaWZ5IikKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fdmVyaWZ5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL0RDaGlsZF8yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvRENoaWxkXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYxNWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL0RDaGlsZF8yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSB0ZXN0LmluaGVyaXRhbmNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogTWFrZSBzdXJlIHRoYXQgY29uZmlndXJhdGlvbiBpbmhlcml0ZWQgbWV0aG9kcyBhcmUgaW52b2tlZCBpbiB0aGUgcmlnaHQKKyAqIG9yZGVyLiAgVGhlIGZ1bm55IG5hbWluZyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2xhc3MgbmFtZXMgZG8gbm90CisgKiBwbGF5IGFueSByb2xlIGluIHRoZSBvcmRlcmluZyBvZiBtZXRob2RzLgorICoKKyAqIENyZWF0ZWQgb24gU2VwIDgsIDIwMDUKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBEQ2hpbGRfMiBleHRlbmRzIENoaWxkXzEgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgaW5pdERpYWxvZzIoKSB7CisgICAgbV9tZXRob2RMaXN0LmFkZCgiaW5pdERpYWxvZzIiKTsKKyAgICBwcHAoIiAgICBJTklUIDIiKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bkRpYWxvZzIoKSB7CisgICAgbV9tZXRob2RMaXN0LmFkZCgidGVhckRvd25EaWFsb2cyIik7CisgICAgcHBwKCIgICAgVEVBUl9ET1dOIDIiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsiYmVmb3JlIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgIG1fbWV0aG9kTGlzdC5hZGQoInRlc3QiKTsKKyAgICBwcHAoIiAgICAgIFRFU1QiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKG1fdmVyYm9zZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRDJdICIgKyBzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS9WZXJpZnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvVmVyaWZ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzNiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvVmVyaWZ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0SlVuaXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBWZXJpZnlUZXN0IHsKKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ImJlZm9yZSJ9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSB7CisgICAgICAiaW5pdEFwcGxpY2F0aW9uIiwKKyAgICAgICJpbml0RGlhbG9nIiwKKyAgICAgICJpbml0RGlhbG9nMiIsCisgICAgICAidGVzdCIsCisgICAgICAidGVhckRvd25EaWFsb2cyIiwKKyAgICAgICJ0ZWFyRG93bkRpYWxvZyIsCisgICAgICAidGVhckRvd25BcHBsaWNhdGlvbiIKKyAgICB9OworCisgICAgaW50IGkgPSAwOworICAgIExpc3Q8U3RyaW5nPiBsID0gWkJhc2VfMC5nZXRNZXRob2RMaXN0KCk7CisgICAgQXNzZXJ0SlVuaXQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgbC5zaXplKCkpOworICAgIGZvciAoU3RyaW5nIHMgOiBsKSB7CisgICAgICBBc3NlcnRKVW5pdC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaSsrXSwgcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltWZXJpZnlUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS9aQmFzZV8wLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvWkJhc2VfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzk5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvWkJhc2VfMC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFpCYXNlXzAgeworICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbV92ZXJib3NlID0gZmFsc2U7CisgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxTdHJpbmc+IG1fbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgIEBCZWZvcmVUZXN0CisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisgICAgbV9tZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGluaXRBcHBsaWNhdGlvbigpIHsKKyAgICBtX21ldGhvZExpc3QuYWRkKCJpbml0QXBwbGljYXRpb24iKTsKKyAgICBwcHAoIklOSVQgMCIpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duQXBwbGljYXRpb24oKSB7CisgICAgbV9tZXRob2RMaXN0LmFkZCgidGVhckRvd25BcHBsaWNhdGlvbiIpOworICAgIHBwcCgiVEVBUiBET1dOIDAiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKG1fdmVyYm9zZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbWjBdICIgKyBzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRNZXRob2RMaXN0KCkgeworICAgIHJldHVybiBtX21ldGhvZExpc3Q7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmcyMzQvQ2hpbGRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nMjM0L0NoaWxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYWJlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nMjM0L0NoaWxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZS50ZXN0bmcyMzQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCitwdWJsaWMgY2xhc3MgQ2hpbGRUZXN0IGV4dGVuZHMgUGFyZW50VGVzdCB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzTWV0aG9kKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKGZhbHNlLCAiVGhpcyBpcyBzbyBzYWQuLi4gSSBtdXN0IHNraXAgYWxsIG15IHRlc3RzIC4uLiIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBvbHltb3JwaGljTWV0aG9kKCkgeworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmcyMzQvUGFyZW50VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzIzNC9QYXJlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ZGRhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmcyMzQvUGFyZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZS50ZXN0bmcyMzQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJlbnRUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleGVjdXRlUG9seW1vcnBoaWNNZXRob2QoKSB7CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwb2x5bW9ycGhpY01ldGhvZCgpOworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nMjM0L1BvbHltb3JwaGljRmFpbHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmcyMzQvUG9seW1vcnBoaWNGYWlsdXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTM5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nMjM0L1BvbHltb3JwaGljRmFpbHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nMjM0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgUG9seW1vcnBoaWNGYWlsdXJlVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzdXBlcmNsYXNzRmFpbHVyZVNob3VsZENhdXNlRmFpbHVyZSgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKENoaWxkVGVzdC5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRlc3RSZXN1bHRzRXF1YWwodGxhLmdldFNraXBwZWRUZXN0cygpLCBBcnJheXMuYXNMaXN0KAorICAgICAgICAicG9seW1vcnBoaWNNZXRob2QiLAorICAgICAgICAiZXhlY3V0ZVBvbHltb3JwaGljTWV0aG9kIikKKyAgICAgICAgKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCB0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL0NsYXNzMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9DbGFzczEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE4NTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9DbGFzczEuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNDcxOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLio7CisKK3B1YmxpYyBjbGFzcyBDbGFzczEgZXh0ZW5kcyBTdXBlckNsYXNzMSB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzMSgpIHsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIGFmdGVyQ2xhc3MxKCkgeworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2RDbGFzczEoKSB7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2RDbGFzczEoKSB7CisgICAgQXNzZXJ0LmZhaWwoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QxXzEoKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MV8yKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL0NsYXNzMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9DbGFzczIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYwMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9DbGFzczIuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNDcxOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgQ2xhc3MyIGV4dGVuZHMgU3VwZXJDbGFzczEgeworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVDbGFzczIoKSB7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzMigpIHsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlTWV0aG9kQ2xhc3MyKCkgeworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFmdGVyTWV0aG9kQ2xhc3MyKCkgeworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdDJfMSgpIHsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyXzIoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvQ2xhc3MzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL0NsYXNzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDk0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL0NsYXNzMy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZS50ZXN0bmc0NzE7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENsYXNzMyBleHRlbmRzIFN1cGVyQ2xhc3MyIHsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3MzKCkgeworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzczMoKSB7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZENsYXNzMygpIHsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZENsYXNzMygpIHsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QzXzEoKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0M18yKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL1N1cGVyQ2xhc3MxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNDcxL1N1cGVyQ2xhc3MxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NWVmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvU3VwZXJDbGFzczEuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNDcxOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKKworcHVibGljIGNsYXNzIFN1cGVyQ2xhc3MxIHsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VwZXJDbGFzczEoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvU3VwZXJDbGFzczIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvU3VwZXJDbGFzczIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FkM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9TdXBlckNsYXNzMi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZS50ZXN0bmc0NzE7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworCitwdWJsaWMgY2xhc3MgU3VwZXJDbGFzczIgeworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVTdXBlckNsYXNzMigpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzQ3MS9UZXN0Tkc0NzEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvVGVzdE5HNDcxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNTE0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc0NzEvVGVzdE5HNDcxLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSB0ZXN0LmluaGVyaXRhbmNlLnRlc3RuZzQ3MTsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lcjsKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIFRlc3RORzQ3MSBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0X2NsYXNzZXNfc2hvdWxkX25vdF9iZV9za2lwcGVkX3doZW5fYV9hZnRlcl9tZXRob2RfZmFpbHMoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShDbGFzczEuY2xhc3MsIENsYXNzMi5jbGFzcywgQ2xhc3MzLmNsYXNzKTsKKyAgICB0bmcuc2V0UHJlc2VydmVPcmRlcih0cnVlKTsKKyAgICB0bmcuc2V0VmVyYm9zZSgxMCk7CisgICAgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnRUaGF0KGxpc3RlbmVyLmdldEZhaWxlZE1ldGhvZE5hbWVzKCkpLmNvbnRhaW5zRXhhY3RseSgiYWZ0ZXJNZXRob2RDbGFzczEiKTsKKyAgICBhc3NlcnRUaGF0KGxpc3RlbmVyLmdldFNraXBwZWRNZXRob2ROYW1lcygpKS5jb250YWluc0V4YWN0bHkoInRlc3QxXzIiKTsKKyAgICBhc3NlcnRUaGF0KGxpc3RlbmVyLmdldFN1Y2NlZWRNZXRob2ROYW1lcygpKS5jb250YWluc0V4YWN0bHkoCisgICAgICAgICJiZWZvcmVTdXBlckNsYXNzMSIsCisgICAgICAgICAgImJlZm9yZUNsYXNzMSIsCisgICAgICAgICAgICAiYmVmb3JlTWV0aG9kQ2xhc3MxIiwgInRlc3QxXzEiLCAvLyAiYWZ0ZXJNZXRob2RDbGFzczEiIGZhaWxlZAorICAgICAgICAgICAgLy8gImJlZm9yZU1ldGhvZENsYXNzMSIsICJ0ZXN0MV8yIiBhbmQgImFmdGVyTWV0aG9kQ2xhc3MxIiBza2lwcGVkCisgICAgICAgICAgICAvLyAiYWZ0ZXJDbGFzczEiIHNraXBwZWQKKyAgICAgICAgImJlZm9yZVN1cGVyQ2xhc3MxIiwKKyAgICAgICAgICAiYmVmb3JlQ2xhc3MyIiwKKyAgICAgICAgICAgICJiZWZvcmVNZXRob2RDbGFzczIiLCAidGVzdDJfMSIsICJhZnRlck1ldGhvZENsYXNzMiIsCisgICAgICAgICAgICAiYmVmb3JlTWV0aG9kQ2xhc3MyIiwgInRlc3QyXzIiLCAiYWZ0ZXJNZXRob2RDbGFzczIiLAorICAgICAgICAgICJhZnRlckNsYXNzMiIsCisgICAgICAgICJiZWZvcmVTdXBlckNsYXNzMiIsCisgICAgICAgICAgImJlZm9yZUNsYXNzMyIsCisgICAgICAgICAgICAiYmVmb3JlTWV0aG9kQ2xhc3MzIiwgInRlc3QzXzEiLCAiYWZ0ZXJNZXRob2RDbGFzczMiLAorICAgICAgICAgICAgImJlZm9yZU1ldGhvZENsYXNzMyIsICJ0ZXN0M18yIiwgImFmdGVyTWV0aG9kQ2xhc3MzIiwKKyAgICAgICAgICAiYWZ0ZXJDbGFzczMiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9BLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNzM5L0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg0Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9BLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0LmluaGVyaXRhbmNlLnRlc3RuZzczOTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQSBleHRlbmRzIEJhc2VDbGFzcyB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzQSgpIHsKKyAgICBBc3NlcnQuZmFpbCgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEEoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc3MzkvQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNWZkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc3MzkvQi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5pbmhlcml0YW5jZS50ZXN0bmc3Mzk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQmFzZUNsYXNzIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QigpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9CYXNlQ2xhc3MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc3MzkvQmFzZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4NmNhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmhlcml0YW5jZS90ZXN0bmc3MzkvQmFzZUNsYXNzLmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNzM5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKKworcHVibGljIGNsYXNzIEJhc2VDbGFzcyB7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUJhc2VDbGFzcygpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5oZXJpdGFuY2UvdGVzdG5nNzM5L1Rlc3RORzczOS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9UZXN0Tkc3MzkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM3ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luaGVyaXRhbmNlL3Rlc3RuZzczOS9UZXN0Tkc3MzkuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIHRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNzM5OworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5JbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyOworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworCitwdWJsaWMgY2xhc3MgVGVzdE5HNzM5IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RfY2xhc3Nlc19zaG91bGRfYmVfc2tpcHBlZF93aGVuX2FfYmVmb3JlX2NsYXNzX2ZhaWxzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoQS5jbGFzcywgQi5jbGFzcyk7CisgICAgdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisgICAgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnRUaGF0KGxpc3RlbmVyLmdldFN1Y2NlZWRNZXRob2ROYW1lcygpKS5jb250YWluc0V4YWN0bHkoImJlZm9yZUJhc2VDbGFzcyIsICJiZWZvcmVCYXNlQ2xhc3MiLCAidGVzdEIiKTsKKyAgICBhc3NlcnRUaGF0KGxpc3RlbmVyLmdldEZhaWxlZE1ldGhvZE5hbWVzKCkpLmNvbnRhaW5zRXhhY3RseSgiYmVmb3JlQ2xhc3NBIik7CisgICAgYXNzZXJ0VGhhdChsaXN0ZW5lci5nZXRTa2lwcGVkTWV0aG9kTmFtZXMoKSkuY29udGFpbnNFeGFjdGx5KCJ0ZXN0QSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdEFmdGVyTWV0aG9kV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdEFmdGVyTWV0aG9kV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3MGFiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvSW5qZWN0QWZ0ZXJNZXRob2RXaXRoVGVzdFJlc3VsdFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIHRlc3QuaW5qZWN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlNraXBFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworcHVibGljIGNsYXNzIEluamVjdEFmdGVyTWV0aG9kV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0IHsKKyAgc3RhdGljIGludCBtX3N1Y2Nlc3M7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFzcygpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2tpcCgpIHsKKyAgICB0aHJvdyBuZXcgU2tpcEV4Y2VwdGlvbigiU2tpcHBlZCIpOworICB9CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9zdWNjZXNzID0gMzsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlKE1ldGhvZCBtLCBJVGVzdFJlc3VsdCByKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJCZWZvcmUgcmVzdWx0OiAiICsgcik7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgYWZ0ZXIoTWV0aG9kIG0sIElUZXN0UmVzdWx0IHIpIHsKKyAgICBTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOworICAgIGlmICgoInBhc3MiLmVxdWFscyhuYW1lKSAmJiByLmdldFN0YXR1cygpID09IElUZXN0UmVzdWx0LlNVQ0NFU1MpCisgICAgICAgIHx8ICgiZmFpbCIuZXF1YWxzKG5hbWUpICYmIHIuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuRkFJTFVSRSkKKyAgICAgICAgfHwgKCJza2lwIi5lcXVhbHMobmFtZSkgJiYgci5nZXRTdGF0dXMoKSA9PSBJVGVzdFJlc3VsdC5TS0lQKSkgeworICAgICAgICAgIG1fc3VjY2Vzcy0tOworICAgICAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvSW5qZWN0QWZ0ZXJNZXRob2RXaXRoVGVzdFJlc3VsdFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvSW5qZWN0QWZ0ZXJNZXRob2RXaXRoVGVzdFJlc3VsdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM0YzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3RBZnRlck1ldGhvZFdpdGhUZXN0UmVzdWx0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5pbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgSW5qZWN0QWZ0ZXJNZXRob2RXaXRoVGVzdFJlc3VsdFRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdFJlc3VsdEluamVjdGlvbigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEluamVjdEFmdGVyTWV0aG9kV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIEluamVjdEFmdGVyTWV0aG9kV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0Lm1fc3VjY2Vzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvSW5qZWN0QmVmb3JlQW5kQWZ0ZXJNZXRob2RzV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdEJlZm9yZUFuZEFmdGVyTWV0aG9kc1dpdGhUZXN0UmVzdWx0U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdEJlZm9yZUFuZEFmdGVyTWV0aG9kc1dpdGhUZXN0UmVzdWx0U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgdGVzdC5pbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuU2tpcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgSW5qZWN0QmVmb3JlQW5kQWZ0ZXJNZXRob2RzV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0IHsKKyAgc3RhdGljIGludCBtX3N1Y2Nlc3M7CisgIHByaXZhdGUgSVRlc3RSZXN1bHQgbV90ZXN0UmVzdWx0OworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhc3MoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtX3Rlc3RSZXN1bHQuZ2V0QXR0cmlidXRlKCJiZWZvcmUiKSwgMTApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2tpcCgpIHsKKyAgICB0aHJvdyBuZXcgU2tpcEV4Y2VwdGlvbigiU2tpcHBlZCIpOworICB9CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9zdWNjZXNzID0gMzsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlKE1ldGhvZCBtLCBJVGVzdFJlc3VsdCByKSB7CisgICAgbV90ZXN0UmVzdWx0ID0gcjsKKyAgICByLnNldEF0dHJpYnV0ZSgiYmVmb3JlIiwgMTApOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFmdGVyKE1ldGhvZCBtLCBJVGVzdFJlc3VsdCByKSB7CisgICAgU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHIsIG1fdGVzdFJlc3VsdCk7CisgICAgaWYgKCgicGFzcyIuZXF1YWxzKG5hbWUpICYmIHIuZ2V0U3RhdHVzKCkgPT0gSVRlc3RSZXN1bHQuU1VDQ0VTUykKKyAgICAgICAgfHwgKCJmYWlsIi5lcXVhbHMobmFtZSkgJiYgci5nZXRTdGF0dXMoKSA9PSBJVGVzdFJlc3VsdC5GQUlMVVJFKQorICAgICAgICB8fCAoInNraXAiLmVxdWFscyhuYW1lKSAmJiByLmdldFN0YXR1cygpID09IElUZXN0UmVzdWx0LlNLSVApKSB7CisgICAgICAgICAgbV9zdWNjZXNzLS07CisgICAgICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3RCZWZvcmVNZXRob2RUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdEJlZm9yZU1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYwMzRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3RCZWZvcmVNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSB0ZXN0LmluamVjdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgSW5qZWN0QmVmb3JlTWV0aG9kVGVzdCB7CisgIHByaXZhdGUgaW50IG1fYmVmb3JlSW5kZXggPSAwOworICBwcml2YXRlIGludCBtX2FmdGVySW5kZXggPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIERBVEEgPSB7CisgICAgICBuZXcgT2JqZWN0W10geyAiYSIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJiIiB9LAorICB9OworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlKE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERBVEFbbV9iZWZvcmVJbmRleF0sIHBhcmFtZXRlcnMpOworICAgIG1fYmVmb3JlSW5kZXgrKzsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlMihPYmplY3RbXSBwYXJhbWV0ZXJzLCBNZXRob2QgbSkgeworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBiZWZvcmUzKE1ldGhvZCBtLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CisgIH0KKworICBARGF0YVByb3ZpZGVyCisgIHB1YmxpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBEQVRBOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFmdGVyKE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERBVEFbbV9hZnRlckluZGV4XSwgcGFyYW1ldGVycyk7CisgICAgbV9hZnRlckluZGV4Kys7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCBmKFN0cmluZyBhKSB7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3REYXRhUHJvdmlkZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdERhdGFQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwZmZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3REYXRhUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSB0ZXN0LmluamVjdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuZGF0YXByb3ZpZGVyLk15SXRlcmF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVGVzdCB0aGF0IGluamVjdGlvbiB3b3JrcyBmb3IgZGF0YSBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIE1hciAzLCAyMDEwCisgKgorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0RGF0YVByb3ZpZGVyVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkcDEoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IDEsICJhIiB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgMiwgImIiIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcDEiLCBlbmFibGVkID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZHBPYmplY3QxKEludGVnZXIgbiwgSVRlc3RDb250ZXh0IGN0eCwgU3RyaW5nIGEpIHsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcDEiLCBlbmFibGVkID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZHBPYmplY3QyKElUZXN0Q29udGV4dCBjdHgsIEludGVnZXIgbiwgU3RyaW5nIGEpIHsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcDEiLCBlbmFibGVkID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgZHBPYmplY3QzKEludGVnZXIgbiwgU3RyaW5nIGEsIElUZXN0Q29udGV4dCBjdHgpIHsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIEl0ZXJhdG9yPE9iamVjdFtdPiBkcDIoKSB7CisgICAgcmV0dXJuIG5ldyBNeUl0ZXJhdG9yKAorICAgIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IDEsICJhIiB9LAorICAgICAgbmV3IE9iamVjdFtdIHsgMiwgImIiIH0sCisgICAgfSk7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAyIiwgZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkcEl0ZXJhdG9yMShJbnRlZ2VyIG4sIElUZXN0Q29udGV4dCBjdHgsIFN0cmluZyBhKSB7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAyIiwgZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkcEl0ZXJhdG9yMihJVGVzdENvbnRleHQgY3R4LCBJbnRlZ2VyIG4sIFN0cmluZyBhKSB7CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAyIiwgZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBkcEl0ZXJhdG9yMyhJbnRlZ2VyIG4sIFN0cmluZyBhLCBJVGVzdENvbnRleHQgY3R4KSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvSW5qZWN0VGVzdENvbnRleHRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdFRlc3RDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjNhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdFRlc3RDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgdGVzdC5pbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIEluamVjdFRlc3RDb250ZXh0VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHZlcmlmeVRlc3RDb250ZXh0SW5qZWN0aW9uKElUZXN0Q29udGV4dCB0YywgWG1sVGVzdCB4bWxUZXN0KSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IFNhbXBsZS5jbGFzcyB9KTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh4bWxUZXN0LmdldE5hbWUoKSwgIkluamVjdGlvbiIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldCgwKS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJmIik7CisgIH0KKworICBAUGFyYW1ldGVycygic3RyaW5nIikKKyAgQFRlc3QoZW5hYmxlZCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGluamVjdGlvbkFuZFBhcmFtZXRlcnMoU3RyaW5nIHMsIElUZXN0Q29udGV4dCBjdHgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3RUZXN0UmVzdWx0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9JbmplY3RUZXN0UmVzdWx0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L0luamVjdFRlc3RSZXN1bHRUZXN0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LmluamVjdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbmplY3RUZXN0UmVzdWx0VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXN0UmVzdWx0SW5qZWN0aW9uKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoSW5qZWN0QmVmb3JlQW5kQWZ0ZXJNZXRob2RzV2l0aFRlc3RSZXN1bHRTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIEluamVjdEJlZm9yZUFuZEFmdGVyTWV0aG9kc1dpdGhUZXN0UmVzdWx0U2FtcGxlVGVzdC5tX3N1Y2Nlc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L05vSW5qZWN0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9Ob0luamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFkNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2luamVjdC9Ob0luamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3QuaW5qZWN0OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Ob0luamVjdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVGVzdCB0aGUgQE5vSW5qZWN0aW9uIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIE5vSW5qZWN0aW9uVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInByb3ZpZGVyIikKKyAgcHVibGljIE9iamVjdFtdW10gcHJvdmlkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyBDQy5jbGFzcy5nZXRNZXRob2QoImYiKSB9IH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAicHJvdmlkZXIiKQorICBwdWJsaWMgdm9pZCB3aXRob3V0SW5qZWN0aW9uKEBOb0luamVjdGlvbiBNZXRob2QgbSkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtLmdldE5hbWUoKSwgImYiKTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJwcm92aWRlciIpCisgIHB1YmxpYyB2b2lkIHdpdGhJbmplY3Rpb24oTWV0aG9kIG0pIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobS5nZXROYW1lKCksICJ3aXRoSW5qZWN0aW9uIik7CisgIH0KK30KKworY2xhc3MgQ0MgeworCisgIHB1YmxpYyB2b2lkIGYoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbmplY3QvU2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L1NhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2EwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW5qZWN0L1NhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5pbmplY3Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKElUZXN0Q29udGV4dCB0YykgeworICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRjKTsKKyAgICBJVGVzdE5HTWV0aG9kW10gYWxsTWV0aG9kcyA9IHRjLmdldEFsbFRlc3RNZXRob2RzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhbGxNZXRob2RzLmxlbmd0aCwgMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhbGxNZXRob2RzWzBdLmdldE1ldGhvZCgpLmdldE5hbWUoKSwiZiIpOworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL0Jhc2VUZXN0Q2xhc3MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL0Jhc2VUZXN0Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBmMTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludGVybGVhdmVkb3JkZXIvQmFzZVRlc3RDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC5pbnRlcmxlYXZlZG9yZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK3B1YmxpYyBjbGFzcyBCYXNlVGVzdENsYXNzIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE9uZSgpIHsKKyAgICBwcHAoInRlc3QxIik7CisgICAgSW50ZXJsZWF2ZWRJbnZvY2F0aW9uVGVzdC5MT0cuYWRkKCJ0ZXN0MSIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFR3bygpIHsKKyAgICBwcHAoInRlc3QyIik7CisgICAgSW50ZXJsZWF2ZWRJbnZvY2F0aW9uVGVzdC5MT0cuYWRkKCJ0ZXN0MiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkudG9TdHJpbmcoKSArICIgIiArIHMpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW50ZXJsZWF2ZWRvcmRlci9JbnRlcmxlYXZlZEludm9jYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW50ZXJsZWF2ZWRvcmRlci9JbnRlcmxlYXZlZEludm9jYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2MDk2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL0ludGVybGVhdmVkSW52b2NhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIHRlc3QuaW50ZXJsZWF2ZWRvcmRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKK2ltcG9ydCB0ZXN0aGVscGVyLk91dHB1dERpcmVjdG9yeVBhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCitwdWJsaWMgY2xhc3MgSW50ZXJsZWF2ZWRJbnZvY2F0aW9uVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gTE9HID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgQEJlZm9yZVRlc3QKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpIHsKKyAgICBMT0cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB2ZXJpZnlJbnZvY2F0aW9uKGludCBudW1iZXIsIExpc3Q8U3RyaW5nPiBsb2csIGludCBpbmRleCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9nLmdldChpbmRleCksICJiZWZvcmVUZXN0Q2hpbGQiICsgbnVtYmVyICsgIkNsYXNzIik7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoKCJ0ZXN0MSIuZXF1YWxzKGxvZy5nZXQoaW5kZXggKyAxKSkgJiYgInRlc3QyIi5lcXVhbHMoTE9HLmdldChpbmRleCArIDIpKSkKKyAgICAgICAgfHwgKCJ0ZXN0MiIuZXF1YWxzKExPRy5nZXQoaW5kZXggKyAxKSkgJiYgInRlc3QxIi5lcXVhbHMoTE9HLmdldChpbmRleCArIDIpKSksCisgICAgICAgICJ0ZXN0IG1ldGhvZHMgd2VyZSBub3QgaW52b2tlZCBjb3JyZWN0bHkiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvZy5nZXQoaW5kZXggKyAzKSwgImFmdGVyVGVzdENoaWxkIiArIG51bWJlciArICJDbGFzcyIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaW52b2NhdGlvbk9yZGVyKCkgeworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcgdGVzdG5nID0gbmV3IFRlc3RORygpOworICAgIHRlc3RuZy5zZXRPdXRwdXREaXJlY3RvcnkoT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOworICAgIHRlc3RuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IFRlc3RDaGlsZDEuY2xhc3MsIFRlc3RDaGlsZDIuY2xhc3MgfSk7CisgICAgdGVzdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdGVzdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdGVzdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhMT0cuc2l6ZSgpLCA4LCBMT0cudG9TdHJpbmcoKSk7CisgICAgaW50IG51bWJlcjEgPSAiYmVmb3JlVGVzdENoaWxkMUNsYXNzIi5lcXVhbHMoTE9HLmdldCgwKSkgPyAxIDogMjsKKyAgICBpbnQgbnVtYmVyMiA9IG51bWJlcjEgPT0gMSA/IDIgOiAxOworICAgIHZlcmlmeUludm9jYXRpb24obnVtYmVyMSwgTE9HLCAwKTsKKyAgICB2ZXJpZnlJbnZvY2F0aW9uKG51bWJlcjIsIExPRywgNCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbSW50ZXJsZWF2ZWRUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL1Rlc3RDaGlsZDEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL1Rlc3RDaGlsZDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY0NzRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludGVybGVhdmVkb3JkZXIvVGVzdENoaWxkMS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC5pbnRlcmxlYXZlZG9yZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CisKKworcHVibGljIGNsYXNzIFRlc3RDaGlsZDEgZXh0ZW5kcyBCYXNlVGVzdENsYXNzIHsKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3RDaGlsZE9uZUNsYXNzKCkgeworICAgIHBwcCgiYmVmb3JlVGVzdENoaWxkMUNsYXNzIik7CisgICAgSW50ZXJsZWF2ZWRJbnZvY2F0aW9uVGVzdC5MT0cuYWRkKCJiZWZvcmVUZXN0Q2hpbGQxQ2xhc3MiKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdENoaWxkT25lQ2xhc3MoKSB7CisgICAgcHBwKCJhZnRlclRlc3RDaGlsZDFDbGFzcyIpOworICAgIEludGVybGVhdmVkSW52b2NhdGlvblRlc3QuTE9HLmFkZCgiYWZ0ZXJUZXN0Q2hpbGQxQ2xhc3MiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3RDaGlsZDFdICIgKyBzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL1Rlc3RDaGlsZDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL1Rlc3RDaGlsZDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzg2YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludGVybGVhdmVkb3JkZXIvVGVzdENoaWxkMi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5pbnRlcmxlYXZlZG9yZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CisKKworcHVibGljIGNsYXNzIFRlc3RDaGlsZDIgZXh0ZW5kcyBCYXNlVGVzdENsYXNzIHsKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3RDaGlsZFR3b0NsYXNzKCkgeworICAgIHBwcCgiYmVmb3JlVGVzdENoaWxkMkNsYXNzIik7CisgICAgSW50ZXJsZWF2ZWRJbnZvY2F0aW9uVGVzdC5MT0cuYWRkKCJiZWZvcmVUZXN0Q2hpbGQyQ2xhc3MiKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdENoaWxkVHdvQ2xhc3MoKSB7CisgICAgcHBwKCJhZnRlclRlc3RDaGlsZDJDbGFzcyIpOworICAgIEludGVybGVhdmVkSW52b2NhdGlvblRlc3QuTE9HLmFkZCgiYWZ0ZXJUZXN0Q2hpbGQyQ2xhc3MiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3RDaGlsZDJdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludGVybGVhdmVkb3JkZXIvdGVzdG5nLW9yZGVyLnhtbCBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL3Rlc3RuZy1vcmRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4M2IzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnRlcmxlYXZlZG9yZGVyL3Rlc3RuZy1vcmRlci54bWwKQEAgLTAsMCArMSwxMSBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KKyAgCis8c3VpdGUgbmFtZT0iT3JkZXIiIHZlcmJvc2U9IjIiIHBhcmFsbGVsPSJmYWxzZSIgYW5ub3RhdGlvbnM9ImphdmFkb2MiPgorCisgIDx0ZXN0IG5hbWU9IlRlc3Qgb3JkZXIgaW52b2NhdGlvbiI+CisgICAgPGNsYXNzZXM+CisgICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW50ZXJsZWF2ZWRvcmRlci5JbnRlcmxlYXZlZEludm9jYXRpb25UZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJCYXNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0RhdGFQcm92aWRlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWRlYTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJCYXNlLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0Lmludm9jYXRpb25jb3VudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERhdGFQcm92aWRlckJhc2UgeworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiZHAiKQorICBwdWJsaWMgdm9pZCBmKEludGVnZXIgbikgeworICB9CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IEludGVnZXJbXVtdIHsKKyAgICAgICAgbmV3IEludGVnZXJbXSB7IDAgfSwKKyAgICAgICAgbmV3IEludGVnZXJbXSB7IDEgfSwKKyAgICAgICAgbmV3IEludGVnZXJbXSB7IDIgfSwKKyAgICB9OworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRGF0YVByb3ZpZGVyRmFsc2VGYWxzZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRGF0YVByb3ZpZGVyRmFsc2VGYWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZiZTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJGYWxzZUZhbHNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5pbnZvY2F0aW9uY291bnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVyRmFsc2VGYWxzZVRlc3QgZXh0ZW5kcyBEYXRhUHJvdmlkZXJCYXNlIHsKKyAgQEJlZm9yZU1ldGhvZChmaXJzdFRpbWVPbmx5ID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZCgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0RhdGFQcm92aWRlckZhbHNlVHJ1ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRGF0YVByb3ZpZGVyRmFsc2VUcnVlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0RhdGFQcm92aWRlckZhbHNlVHJ1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuaW52b2NhdGlvbmNvdW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKKworcHVibGljIGNsYXNzIERhdGFQcm92aWRlckZhbHNlVHJ1ZVRlc3QgZXh0ZW5kcyBEYXRhUHJvdmlkZXJCYXNlIHsKKyAgQEJlZm9yZU1ldGhvZChmaXJzdFRpbWVPbmx5ID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGFmdGVyTWV0aG9kKCkge30KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJUcnVlRmFsc2VUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0RhdGFQcm92aWRlclRydWVGYWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGM4YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJUcnVlRmFsc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lmludm9jYXRpb25jb3VudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBEYXRhUHJvdmlkZXJUcnVlRmFsc2VUZXN0IGV4dGVuZHMgRGF0YVByb3ZpZGVyQmFzZSB7CisgIEBCZWZvcmVNZXRob2QoZmlyc3RUaW1lT25seSA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZCgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0RhdGFQcm92aWRlclRydWVUcnVlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJUcnVlVHJ1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE3MDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9EYXRhUHJvdmlkZXJUcnVlVHJ1ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuaW52b2NhdGlvbmNvdW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKKworcHVibGljIGNsYXNzIERhdGFQcm92aWRlclRydWVUcnVlVGVzdCBleHRlbmRzIERhdGFQcm92aWRlckJhc2UgeworICBAQmVmb3JlTWV0aG9kKGZpcnN0VGltZU9ubHkgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2QoKSB7fQorCisgIEBBZnRlck1ldGhvZChsYXN0VGltZU9ubHkgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZCgpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmFpbGVkSW52b2NhdGlvbkNvdW50LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ZhaWxlZEludm9jYXRpb25Db3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYWIxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ZhaWxlZEludm9jYXRpb25Db3VudC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5pbnZvY2F0aW9uY291bnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZhaWxlZEludm9jYXRpb25Db3VudCB7CisgIGludCBtX2NvdW50OworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBtX2NvdW50ID0gMDsKKyAgfQorCisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDEwKQorICBwdWJsaWMgdm9pZCBmKCkgeworICAgIGlmIChtX2NvdW50KysgPiAzKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ZhaWxlZEludm9jYXRpb25Db3VudDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmFpbGVkSW52b2NhdGlvbkNvdW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODYxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ZhaWxlZEludm9jYXRpb25Db3VudDIuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuaW52b2NhdGlvbmNvdW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRJbnZvY2F0aW9uQ291bnQyIHsKKyAgaW50IG1fY291bnQ7CisgIGludCBtX2NvdW50MjsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgbV9jb3VudCA9IDA7CisgICAgbV9jb3VudDIgPSAwOworICB9CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gMTAsIHNraXBGYWlsZWRJbnZvY2F0aW9ucyA9IHRydWUpCisgIHB1YmxpYyB2b2lkIHNob3VsZFNraXBGcm9tQW5ub3RhdGlvbigpIHsKKyAgICBpZiAobV9jb3VudCsrID4gMykgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSAxMCwgc2tpcEZhaWxlZEludm9jYXRpb25zID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHNob3VsZE5vdFNraXBGcm9tQW5ub3RhdGlvbigpIHsKKyAgICBpZiAobV9jb3VudDIrKyA+IDMpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmFpbGVkSW52b2NhdGlvbkNvdW50VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9GYWlsZWRJbnZvY2F0aW9uQ291bnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzYTlkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmFpbGVkSW52b2NhdGlvbkNvdW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgdGVzdC5pbnZvY2F0aW9uY291bnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgRmFpbGVkSW52b2NhdGlvbkNvdW50VGVzdCB7CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoYm9vbGVhbiBza2lwLAorICAgIGludCBwYXNzZWQsIGludCBmYWlsZWQsIGludCBza2lwcGVkKQorICB7CisgICAgVGVzdE5HIHRlc3RuZyA9IG5ldyBUZXN0TkcoKTsKKyAgICB0ZXN0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICB0ZXN0bmcuc2V0U2tpcEZhaWxlZEludm9jYXRpb25Db3VudHMoc2tpcCk7CisgICAgdGVzdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgRmFpbGVkSW52b2NhdGlvbkNvdW50LmNsYXNzIH0pOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0ZXN0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0ZXN0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgcGFzc2VkKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSwgZmFpbGVkKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCksIHNraXBwZWQpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5R2xvYmFsbHlTaG91bGRTdG9wKCkgeworICAgIHJ1blRlc3QodHJ1ZSwgNCwgMSwgNSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlHbG9iYWxseVNob3VsZE5vdFN0b3AoKSB7CisgICAgcnVuVGVzdChmYWxzZSwgNCwgNiwgMCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlBdHRyaWJ1dGVTaG91bGRTdG9wKCkgeworICAgIFRlc3RORyB0ZXN0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdGVzdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdGVzdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgRmFpbGVkSW52b2NhdGlvbkNvdW50Mi5jbGFzcyB9KTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdGVzdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdGVzdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDgpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLCA3KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCksIDUpOworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmlyc3RBbmRMYXN0VGltZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvRmlyc3RBbmRMYXN0VGltZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDMxYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9GaXJzdEFuZExhc3RUaW1lVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACitwYWNrYWdlIHRlc3QuaW52b2NhdGlvbmNvdW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCB0ZXN0Lkludm9rZWRNZXRob2ROYW1lTGlzdGVuZXI7CitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9uIG9mIEBCZWZvcmVNZXRob2QoZmlyc3RUaW1lT25seSA9IHRydWUvZmFsc2UpIGFuZAorICogQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSA9IHRydWUvZmFsc2UpIHdpdGggaW52b2NhdGlvbiBjb3VudHMgYW5kIGRhdGEKKyAqIHByb3ZpZGVycy4KKyAqIEBhdXRob3IgY2JldXN0QGdvb2dsZS5jb20KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaXJzdEFuZExhc3RUaW1lVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5RGF0YVByb3ZpZGVyRmFsc2VGYWxzZSgpIHsKKyAgICBMaXN0PFN0cmluZz4gaW52b2tlZE1ldGhvZE5hbWVzID0gcnVuKERhdGFQcm92aWRlckZhbHNlRmFsc2VUZXN0LmNsYXNzKTsKKworICAgIGFzc2VydFRoYXQoaW52b2tlZE1ldGhvZE5hbWVzKS5jb250YWluc0V4YWN0bHkoCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5RGF0YVByb3ZpZGVyVHJ1ZUZhbHNlKCkgeworICAgIExpc3Q8U3RyaW5nPiBpbnZva2VkTWV0aG9kTmFtZXMgPSBydW4oRGF0YVByb3ZpZGVyVHJ1ZUZhbHNlVGVzdC5jbGFzcyk7CisKKyAgICBhc3NlcnRUaGF0KGludm9rZWRNZXRob2ROYW1lcykuY29udGFpbnNFeGFjdGx5KAorICAgICAgICAiYmVmb3JlTWV0aG9kIiwgImYiLCAiYWZ0ZXJNZXRob2QiLAorICAgICAgICAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJmIiwgImFmdGVyTWV0aG9kIgorICAgICk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlEYXRhUHJvdmlkZXJGYWxzZVRydWUoKSB7CisgICAgTGlzdDxTdHJpbmc+IGludm9rZWRNZXRob2ROYW1lcyA9IHJ1bihEYXRhUHJvdmlkZXJGYWxzZVRydWVUZXN0LmNsYXNzKTsKKworICAgIGFzc2VydFRoYXQoaW52b2tlZE1ldGhvZE5hbWVzKS5jb250YWluc0V4YWN0bHkoCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5RGF0YVByb3ZpZGVyVHJ1ZVRydWUoKSB7CisgICAgTGlzdDxTdHJpbmc+IGludm9rZWRNZXRob2ROYW1lcyA9IHJ1bihEYXRhUHJvdmlkZXJUcnVlVHJ1ZVRlc3QuY2xhc3MpOworCisgICAgYXNzZXJ0VGhhdChpbnZva2VkTWV0aG9kTmFtZXMpLmNvbnRhaW5zRXhhY3RseSgKKyAgICAgICAgImJlZm9yZU1ldGhvZCIsICJmIiwKKyAgICAgICAgImYiLAorICAgICAgICAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW52b2NhdGlvbkNvdW50RmFsc2VGYWxzZSgpIHsKKyAgICBMaXN0PFN0cmluZz4gaW52b2tlZE1ldGhvZE5hbWVzID0gcnVuKEludm9jYXRpb25Db3VudEZhbHNlRmFsc2VUZXN0LmNsYXNzKTsKKworICAgIGFzc2VydFRoYXQoaW52b2tlZE1ldGhvZE5hbWVzKS5jb250YWluc0V4YWN0bHkoCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW52b2NhdGlvbkNvdW50VHJ1ZUZhbHNlKCkgeworICAgIExpc3Q8U3RyaW5nPiBpbnZva2VkTWV0aG9kTmFtZXMgPSBydW4oSW52b2NhdGlvbkNvdW50VHJ1ZUZhbHNlVGVzdC5jbGFzcyk7CisKKyAgICBhc3NlcnRUaGF0KGludm9rZWRNZXRob2ROYW1lcykuY29udGFpbnNFeGFjdGx5KAorICAgICAgICAiYmVmb3JlTWV0aG9kIiwgImYiLCAiYWZ0ZXJNZXRob2QiLAorICAgICAgICAiZiIsICJhZnRlck1ldGhvZCIsCisgICAgICAgICJmIiwgImFmdGVyTWV0aG9kIgorICAgICk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlJbnZvY2F0aW9uQ291bnRGYWxzZVRydWUoKSB7CisgICAgTGlzdDxTdHJpbmc+IGludm9rZWRNZXRob2ROYW1lcyA9IHJ1bihJbnZvY2F0aW9uQ291bnRGYWxzZVRydWVUZXN0LmNsYXNzKTsKKworICAgIGFzc2VydFRoYXQoaW52b2tlZE1ldGhvZE5hbWVzKS5jb250YWluc0V4YWN0bHkoCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsCisgICAgICAgICJiZWZvcmVNZXRob2QiLCAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW52b2NhdGlvbkNvdW50VHJ1ZVRydWUoKSB7CisgICAgTGlzdDxTdHJpbmc+IGludm9rZWRNZXRob2ROYW1lcyA9IHJ1bihJbnZvY2F0aW9uQ291bnRUcnVlVHJ1ZVRlc3QuY2xhc3MpOworCisgICAgYXNzZXJ0VGhhdChpbnZva2VkTWV0aG9kTmFtZXMpLmNvbnRhaW5zRXhhY3RseSgKKyAgICAgICAgImJlZm9yZU1ldGhvZCIsICJmIiwKKyAgICAgICAgImYiLAorICAgICAgICAiZiIsICJhZnRlck1ldGhvZCIKKyAgICApOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHJ1bihDbGFzczw/PiBjbHMpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKGNscyk7CisgICAgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIHJldHVybiBsaXN0ZW5lci5nZXRJbnZva2VkTWV0aG9kTmFtZXMoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ludm9jYXRpb25CYXNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ludm9jYXRpb25CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MGJmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvSW52b2NhdGlvbkJhc2UuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgdGVzdC5pbnZvY2F0aW9uY291bnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQmFzZSB7CisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDMpCisgIHB1YmxpYyB2b2lkIGYoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvSW52b2NhdGlvbkNvdW50RmFsc2VGYWxzZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvSW52b2NhdGlvbkNvdW50RmFsc2VGYWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI1ZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRGYWxzZUZhbHNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5pbnZvY2F0aW9uY291bnQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitwdWJsaWMgY2xhc3MgSW52b2NhdGlvbkNvdW50RmFsc2VGYWxzZVRlc3QgZXh0ZW5kcyBJbnZvY2F0aW9uQmFzZSB7CisgIEBCZWZvcmVNZXRob2QoZmlyc3RUaW1lT25seSA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2QoKSB7fQorCisgIEBBZnRlck1ldGhvZChsYXN0VGltZU9ubHkgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRGYWxzZVRydWVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ludm9jYXRpb25Db3VudEZhbHNlVHJ1ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUzMDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRGYWxzZVRydWVUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lmludm9jYXRpb25jb3VudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ291bnRGYWxzZVRydWVUZXN0IGV4dGVuZHMgSW52b2NhdGlvbkJhc2UgeworICBAQmVmb3JlTWV0aG9kKGZpcnN0VGltZU9ubHkgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYmVmb3JlTWV0aG9kKCkge30KKworICBAQWZ0ZXJNZXRob2QobGFzdFRpbWVPbmx5ID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRUcnVlRmFsc2VUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2NhdGlvbmNvdW50L0ludm9jYXRpb25Db3VudFRydWVGYWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmE1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRUcnVlRmFsc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lmludm9jYXRpb25jb3VudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ291bnRUcnVlRmFsc2VUZXN0IGV4dGVuZHMgSW52b2NhdGlvbkJhc2UgeworICBAQmVmb3JlTWV0aG9kKGZpcnN0VGltZU9ubHkgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2QoKSB7fQorCisgIEBBZnRlck1ldGhvZChsYXN0VGltZU9ubHkgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9jYXRpb25jb3VudC9JbnZvY2F0aW9uQ291bnRUcnVlVHJ1ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvSW52b2NhdGlvbkNvdW50VHJ1ZVRydWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZvY2F0aW9uY291bnQvSW52b2NhdGlvbkNvdW50VHJ1ZVRydWVUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lmludm9jYXRpb25jb3VudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ291bnRUcnVlVHJ1ZVRlc3QgZXh0ZW5kcyBJbnZvY2F0aW9uQmFzZSB7CisgIEBCZWZvcmVNZXRob2QoZmlyc3RUaW1lT25seSA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kKGxhc3RUaW1lT25seSA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGFmdGVyTWV0aG9kKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvQS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmYWRjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvQS5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CisKK3B1YmxpYyBjbGFzcyBBIHsKKworICBAQmVmb3JlU3VpdGUoYWx3YXlzUnVuPWZhbHNlKQorICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZU1ldGhvZDEoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9CLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2tlZG1ldGhvZGxpc3RlbmVyL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJlYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9CLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChlbmFibGVkPWZhbHNlKQorcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBeworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZU1ldGhvZDIoKSB7fQorCisgIHB1YmxpYyB2b2lkIHNvbWVUZXN0KCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5ODBkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvQmFzZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgdGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNlIHsKKyAgcHJpdmF0ZSBib29sZWFuIG1fZmFpbDsKKworICBwdWJsaWMgQmFzZShib29sZWFuIGZhaWwpIHsKKyAgICBtX2ZhaWwgPSBmYWlsOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBiZWZvcmVNZXRob2QoKSB7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7fQorCisgIEBCZWZvcmVUZXN0CisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7fQorCisgIEBBZnRlclRlc3QKKyAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkge30KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7fQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIGFmdGVyQ2xhc3MoKSB7fQorCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZSgpIHt9CisKKyAgQEFmdGVyU3VpdGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZSgpIHsKKyAgICBpZiAobV9mYWlsKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQWZ0ZXIgU3VpdGUgRkFJTElORyIpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGEoKSB7CisgICAgIGlmIChtX2ZhaWwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlc3QgTWV0aG9kIEZBSUxJTkciKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9DLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2tlZG1ldGhvZGxpc3RlbmVyL0MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzViYTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9DLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBBeworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZU1ldGhvZDMoKSB7fQorCisgIHB1YmxpYyB2b2lkIHNvbWVUZXN0KCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvRmFpbHVyZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9GYWlsdXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4Zjg0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvRmFpbHVyZS5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIEZhaWx1cmUgZXh0ZW5kcyBCYXNlIHsKKyAgcHVibGljIEZhaWx1cmUoKSB7CisgICAgc3VwZXIodHJ1ZSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9JbnZva2VkTWV0aG9kTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvSW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MDE0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvSW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgSW52b2tlZE1ldGhvZExpc3RlbmVyIGltcGxlbWVudHMgSUludm9rZWRNZXRob2RMaXN0ZW5lciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PElJbnZva2VkTWV0aG9kPiBtX21ldGhvZHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYmVmb3JlSW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBtX21ldGhvZHMuYWRkKG1ldGhvZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICB9CisKKyAgcHVibGljIExpc3Q8SUludm9rZWRNZXRob2Q+IGdldEludm9rZWRNZXRob2RzKCkgeworICAgIHJldHVybiBtX21ldGhvZHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9JbnZva2VkTWV0aG9kTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZGJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACitwYWNrYWdlIHRlc3QuaW52b2tlZG1ldGhvZGxpc3RlbmVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBJbnZva2VkTWV0aG9kTGlzdGVuZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuKENsYXNzW10gY2xhc3NlcywgSUludm9rZWRNZXRob2RMaXN0ZW5lciBsKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhjbGFzc2VzKTsKKworICAgIHRuZy5hZGRJbnZva2VkTWV0aG9kTGlzdGVuZXIobCk7CisgICAgdG5nLnJ1bigpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRNZXRob2RDb3VudChNeUxpc3RlbmVyIGwpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGwuZ2V0QmVmb3JlQ291bnQoKSwgOSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmdldEFmdGVyQ291bnQoKSwgOSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB3aXRoU3VjY2VzcygpIHsKKyAgICBNeUxpc3RlbmVyIGwgPSBuZXcgTXlMaXN0ZW5lcigpOworICAgIHJ1bihuZXcgQ2xhc3NbXXtTdWNjZXNzLmNsYXNzfSwgbCk7CisgICAgYXNzZXJ0TWV0aG9kQ291bnQobCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB3aXRoRmFpbHVyZSgpIHsKKyAgICBNeUxpc3RlbmVyIGwgPSBuZXcgTXlMaXN0ZW5lcigpOworICAgIHJ1bihuZXcgQ2xhc3NbXSB7IEZhaWx1cmUuY2xhc3MgfSwgbCk7CisgICAgYXNzZXJ0TWV0aG9kQ291bnQobCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmdldFN1aXRlU3RhdHVzKCksIElUZXN0UmVzdWx0LkZBSUxVUkUpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG51bGwgIT0gbC5nZXRTdWl0ZVRocm93YWJsZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmdldFN1aXRlVGhyb3dhYmxlKCkuZ2V0Q2xhc3MoKSA9PSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobC5nZXRNZXRob2RTdGF0dXMoKSwgSVRlc3RSZXN1bHQuRkFJTFVSRSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobnVsbCAhPSBsLmdldE1ldGhvZFRocm93YWJsZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmdldE1ldGhvZFRocm93YWJsZSgpLmdldENsYXNzKCkgPT0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgfQorCisgIC8qKgorICAgKiBGaXggZm9yOgorICAgKiBodHRwczovL2dpdGh1Yi5jb20vanVoZXJyL3Rlc3RuZy1nb29nbGVjb2RlL2lzc3Vlcy83CisgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWhlcnIvdGVzdG5nLWdvb2dsZWNvZGUvaXNzdWVzLzg2CisgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nL2lzc3Vlcy85MworICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2FtZU1ldGhvZEludm9rZWRNdWx0aXBsZVRpbWVzU2hvdWxkSGF2ZURpZmZlcmVudFRpbWVTdGFtcHMoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShTYW1wbGUuY2xhc3MpOworICAgIEludm9rZWRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHRuZy5ydW4oKTsKKyAgICBMaXN0PElJbnZva2VkTWV0aG9kPiBtID0gbGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZHMoKTsKKyAgICBJSW52b2tlZE1ldGhvZCBiZWZvcmVTdWl0ZSA9IG0uZ2V0KDApOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShiZWZvcmVTdWl0ZS5nZXRUZXN0TWV0aG9kKCkuaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYmVmb3JlU3VpdGUuaXNDb25maWd1cmF0aW9uTWV0aG9kKCkpOworICAgIElJbnZva2VkTWV0aG9kIGFmdGVyMSA9IG0uZ2V0KDIpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFmdGVyMS5nZXRUZXN0TWV0aG9kKCkuaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWZ0ZXIxLmlzQ29uZmlndXJhdGlvbk1ldGhvZCgpKTsKKyAgICBJSW52b2tlZE1ldGhvZCBhZnRlcjIgPSBtLmdldCg0KTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZnRlcjIuZ2V0VGVzdE1ldGhvZCgpLmlzQWZ0ZXJNZXRob2RDb25maWd1cmF0aW9uKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFmdGVyMi5pc0NvbmZpZ3VyYXRpb25NZXRob2QoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWZ0ZXIxLmdldERhdGUoKSAhPSBhZnRlcjIuZ2V0RGF0ZSgpKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIlRlc3QgbWV0aG9kcyB3aXRoIGV4cGVjdGVkIGV4Y2VwdGlvbnMgc2hvdWxkIHNob3cgdXAgYXMgcGFzcyIgKworICAJCSIgaW4gSUludm9rZWRNZXRob2RMaXN0ZW5lcidzIGFmdGVySW52b2NhdGlvbiBtZXRob2QiKQorICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kc1dpdGhFeHBlY3RlZEV4Y2VwdGlvbnNTaG91bGRTaG93VXBBc1Bhc3MoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShTYW1wbGUyLmNsYXNzKTsKKyAgICBTYW1wbGUyLlNhbXBsZTJJbnZva2VkTWV0aG9kTGlzdGVuZXIgbCA9IG5ldyBTYW1wbGUyKCkubmV3IFNhbXBsZTJJbnZva2VkTWV0aG9kTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobCk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobC5pc1N1Y2Nlc3MpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiSW52b2tlZCBtZXRob2QgZG9lcyBub3QgcmVjb2duaXplIGNvbmZpZ3VyYXRpb24gbWV0aG9kIikKKyAgcHVibGljIHZvaWQgaXNzdWU2MjlfSW52b2tlZE1ldGhvZERvZXNOb3RSZWNvZ25pemVDb25maWd1cmF0aW9uTWV0aG9kKCkgeworICAgIEludm9rZWRNZXRob2ROYW1lTGlzdGVuZXIgbCA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgcnVuKG5ldyBDbGFzc1tde1N1Y2Nlc3MuY2xhc3N9LCBsKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobC50ZXN0TWV0aG9kcy5zaXplKCksIDEpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwudGVzdE1ldGhvZHMuY29udGFpbnMoImEiKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGwudGVzdE1ldGhvZHNGcm9tVE0uc2l6ZSgpLCAxKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLnRlc3RNZXRob2RzRnJvbVRNLmNvbnRhaW5zKCJhIikpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmNvbmZpZ3VyYXRpb25NZXRob2RzLnNpemUoKSwgOCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobC5jb25maWd1cmF0aW9uTWV0aG9kcy5jb250YWlucygiYmVmb3JlTWV0aG9kIikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHMuY29udGFpbnMoImFmdGVyTWV0aG9kIikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHMuY29udGFpbnMoImJlZm9yZVRlc3QiKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobC5jb25maWd1cmF0aW9uTWV0aG9kcy5jb250YWlucygiYWZ0ZXJUZXN0IikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHMuY29udGFpbnMoImJlZm9yZUNsYXNzIikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHMuY29udGFpbnMoImFmdGVyQ2xhc3MiKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobC5jb25maWd1cmF0aW9uTWV0aG9kcy5jb250YWlucygiYmVmb3JlU3VpdGUiKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobC5jb25maWd1cmF0aW9uTWV0aG9kcy5jb250YWlucygiYWZ0ZXJTdWl0ZSIpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobC5jb25maWd1cmF0aW9uTWV0aG9kc0Zyb21UTS5zaXplKCksIDgpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHNGcm9tVE0uY29udGFpbnMoImJlZm9yZU1ldGhvZCIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNLmNvbnRhaW5zKCJhZnRlck1ldGhvZCIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNLmNvbnRhaW5zKCJiZWZvcmVUZXN0IikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHNGcm9tVE0uY29udGFpbnMoImFmdGVyVGVzdCIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNLmNvbnRhaW5zKCJiZWZvcmVDbGFzcyIpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsLmNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNLmNvbnRhaW5zKCJhZnRlckNsYXNzIikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHNGcm9tVE0uY29udGFpbnMoImJlZm9yZVN1aXRlIikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGwuY29uZmlndXJhdGlvbk1ldGhvZHNGcm9tVE0uY29udGFpbnMoImFmdGVyU3VpdGUiKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpc3N1ZTg3X21ldGhvZF9vcmRlcm5pbmdfd2l0aF9kaXNhYmxlX3Rlc3RfY2xhc3MoKSB7CisgICAgYXNzZXJ0SXNzdWU4NyhBLmNsYXNzLCBCLmNsYXNzLCBDLmNsYXNzKTsKKyAgICBhc3NlcnRJc3N1ZTg3KEEuY2xhc3MsIEMuY2xhc3MsIEIuY2xhc3MpOworICAgIGFzc2VydElzc3VlODcoQi5jbGFzcywgQS5jbGFzcywgQy5jbGFzcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0SXNzdWU4NyhDbGFzczw/Pi4uLiB0ZXN0cykgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUodGVzdHMpOworICAgIHRuZy5zZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuRkFMU0UpOworICAgIHRuZy5zZXRQcmVzZXJ2ZU9yZGVyKHRydWUpOworICAgIEludm9rZWRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHRuZy5ydW4oKTsKKyAgICBMaXN0PElJbnZva2VkTWV0aG9kPiBtID0gbGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG0uZ2V0KDApLmdldFRlc3RNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJzb21lTWV0aG9kMSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobS5nZXQoMSkuZ2V0VGVzdE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgInNvbWVNZXRob2QzIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtLmdldCgyKS5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAic29tZVRlc3QiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG0uc2l6ZSgpLCAzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9JbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2tlZG1ldGhvZGxpc3RlbmVyL0ludm9rZWRNZXRob2ROYW1lTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTFkZjQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9JbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBpbXBsZW1lbnRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIgeworCisgIGZpbmFsIFNldDxTdHJpbmc+IHRlc3RNZXRob2RzID0gbmV3IEhhc2hTZXQ8PigpOworICBmaW5hbCBTZXQ8U3RyaW5nPiBjb25maWd1cmF0aW9uTWV0aG9kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgZmluYWwgU2V0PFN0cmluZz4gdGVzdE1ldGhvZHNGcm9tVE0gPSBuZXcgSGFzaFNldDw+KCk7CisgIGZpbmFsIFNldDxTdHJpbmc+IGNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNID0gbmV3IEhhc2hTZXQ8PigpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworCisgICAgaWYgKG1ldGhvZC5pc1Rlc3RNZXRob2QoKSkgeworICAgICAgdGVzdE1ldGhvZHMuYWRkKG1ldGhvZE5hbWUpOworICAgIH0KKyAgICBpZiAobWV0aG9kLmlzQ29uZmlndXJhdGlvbk1ldGhvZCgpKSB7CisgICAgICBjb25maWd1cmF0aW9uTWV0aG9kcy5hZGQobWV0aG9kTmFtZSk7CisgICAgfQorICAgIGlmIChtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzVGVzdCgpKSB7CisgICAgICB0ZXN0TWV0aG9kc0Zyb21UTS5hZGQobWV0aG9kTmFtZSk7CisgICAgfQorICAgIGlmIChtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzQmVmb3JlTWV0aG9kQ29uZmlndXJhdGlvbigpIHx8CisgICAgICAgIG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuaXNBZnRlck1ldGhvZENvbmZpZ3VyYXRpb24oKSB8fAorICAgICAgICBtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzQmVmb3JlVGVzdENvbmZpZ3VyYXRpb24oKSB8fAorICAgICAgICBtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzQWZ0ZXJUZXN0Q29uZmlndXJhdGlvbigpIHx8CisgICAgICAgIG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuaXNCZWZvcmVDbGFzc0NvbmZpZ3VyYXRpb24oKSB8fAorICAgICAgICBtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzQWZ0ZXJDbGFzc0NvbmZpZ3VyYXRpb24oKSB8fAorICAgICAgICBtZXRob2QuZ2V0VGVzdE1ldGhvZCgpLmlzQmVmb3JlU3VpdGVDb25maWd1cmF0aW9uKCkgfHwKKyAgICAgICAgbWV0aG9kLmdldFRlc3RNZXRob2QoKS5pc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIGNvbmZpZ3VyYXRpb25NZXRob2RzRnJvbVRNLmFkZChtZXRob2ROYW1lKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvTXlMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9NeUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NzA1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvTXlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgdGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworCitwdWJsaWMgY2xhc3MgTXlMaXN0ZW5lciBpbXBsZW1lbnRzIElJbnZva2VkTWV0aG9kTGlzdGVuZXIgeworICBwcml2YXRlIGludCBtX2JlZm9yZUNvdW50ID0gMDsKKyAgcHJpdmF0ZSBpbnQgbV9hZnRlckNvdW50ID0gMDsKKworICBwcml2YXRlIFRocm93YWJsZSBzdWl0ZVRocm93YWJsZTsKKyAgcHJpdmF0ZSBpbnQgc3VpdGVTdGF0dXMgPSAwOworICBwcml2YXRlIFRocm93YWJsZSBtZXRob2RUaHJvd2FibGU7CisgIHByaXZhdGUgaW50IG1ldGhvZFN0YXR1cyA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBtX2FmdGVyQ291bnQrKzsKKyAgICBpZiAobWV0aG9kLmdldFRlc3RNZXRob2QoKS5pc0FmdGVyU3VpdGVDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgIHN1aXRlU3RhdHVzID0gdGVzdFJlc3VsdC5nZXRTdGF0dXMoKTsKKyAgICAgIHN1aXRlVGhyb3dhYmxlID0gdGVzdFJlc3VsdC5nZXRUaHJvd2FibGUoKTsKKyAgICB9CisgICAgaWYgKG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuaXNUZXN0KCkpIHsKKyAgICAgIG1ldGhvZFN0YXR1cyA9IHRlc3RSZXN1bHQuZ2V0U3RhdHVzKCk7CisgICAgICBtZXRob2RUaHJvd2FibGUgPSB0ZXN0UmVzdWx0LmdldFRocm93YWJsZSgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgIG1fYmVmb3JlQ291bnQrKzsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0QmVmb3JlQ291bnQoKSB7CisgICAgcmV0dXJuIG1fYmVmb3JlQ291bnQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldEFmdGVyQ291bnQoKSB7CisgICAgcmV0dXJuIG1fYWZ0ZXJDb3VudDsKKyAgfQorCisgIHB1YmxpYyBUaHJvd2FibGUgZ2V0U3VpdGVUaHJvd2FibGUoKSB7CisgICAgcmV0dXJuIHN1aXRlVGhyb3dhYmxlOworICB9CisKKyAgcHVibGljIGludCBnZXRTdWl0ZVN0YXR1cygpIHsKKyAgICByZXR1cm4gc3VpdGVTdGF0dXM7CisgIH0KKworICBwdWJsaWMgVGhyb3dhYmxlIGdldE1ldGhvZFRocm93YWJsZSgpIHsKKyAgICByZXR1cm4gbWV0aG9kVGhyb3dhYmxlOworICB9CisKKyAgcHVibGljIGludCBnZXRNZXRob2RTdGF0dXMoKSB7CisgICAgcmV0dXJuIG1ldGhvZFN0YXR1czsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2tlZG1ldGhvZGxpc3RlbmVyL1NhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9TYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE0OGZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9TYW1wbGUuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIHRlc3QuaW52b2tlZG1ldGhvZGxpc3RlbmVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNhbXBsZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdDEoKSB7CisgICAgdHJ5IHsKKyAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGhhbmRsZWQpIHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdDIoKSB7CisgICAgdHJ5IHsKKyAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGhhbmRsZWQpIHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgfQorICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFtKCkge30KKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYnMoKSB7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9TYW1wbGUyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvaW52b2tlZG1ldGhvZGxpc3RlbmVyL1NhbXBsZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZlZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9TYW1wbGUyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlMiB7CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0MSgpIHsKKyAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaHJvdyB0aGlzIGV4Y2VwdGlvbiBvbiBwdXJwb3NlIGluIHRlc3QiKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBTYW1wbGUySW52b2tlZE1ldGhvZExpc3RlbmVyIGltcGxlbWVudHMgSUludm9rZWRNZXRob2RMaXN0ZW5lcgorICB7CisKKyAgICAgYm9vbGVhbiBpc1N1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAvKioKKyAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgKi8KKyAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG0sIElUZXN0UmVzdWx0IHRyKQorICAgICB7CisgICAgICAgIGlzU3VjY2VzcyA9IHRyLmlzU3VjY2VzcygpOworICAgICB9CisKKyAgICAgLyoqCisgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICovCisgICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgYXJnMCwgSVRlc3RSZXN1bHQgYXJnMSkKKyAgICAgeworICAgICAgICAvLyBubyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIHJpZ2h0IG5vdworICAgICB9CisKKyAgICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCkgeworICAgICAgICByZXR1cm4gaXNTdWNjZXNzOworICAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvU3VjY2Vzcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2ludm9rZWRtZXRob2RsaXN0ZW5lci9TdWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhODkwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pbnZva2VkbWV0aG9kbGlzdGVuZXIvU3VjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFN1Y2Nlc3MgZXh0ZW5kcyBCYXNlIHsKKyAgcHVibGljIFN1Y2Nlc3MoKSB7CisgICAgc3VwZXIoZmFsc2UpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9Jc3N1ZTEwN1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9Jc3N1ZTEwN1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzkwYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2lzc3VlMTA3L0lzc3VlMTA3VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgdGVzdC5pc3N1ZTEwNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgVmxhZGlzbGF2LlJhc3Nva2hpbgorICovCitwdWJsaWMgY2xhc3MgSXNzdWUxMDdUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkdJVEhVQi0xMDcsIENoZWNrIHRoYXQgc3VpdGUgcGFyYW1ldGVycyBzZXQgZnJvbSBsaXN0ZW5lciBkb2VzIG5vdCBhZmZlY3RzIHRlc3RzIGNvdW50IikKKyAgcHVibGljIHZvaWQgdGVzdFN1aXRlUGFyYW1ldGVyTW9kaWZpY2F0aW9uRnJvbUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgWG1sU3VpdGUgc3VpdGUgPSBjcmVhdGVYbWxTdWl0ZSgiU2ltcGxlIHN1aXRlIik7CisKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBzdWl0ZS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgcGFyYW1ldGVycy5wdXQoVGVzdFRlc3RuZ0NvdW50ZXIuUEFSQU1FVEVSX05BTUUsICJzb21lIHZhbHVlIHRoYXQgbXVzdCBiZSBvdmVycmlkZW4gaW4gbGlzdGVuZXIiKTsKKyAgICBzdWl0ZS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworCisgICAgcnVuVGVzdChzdWl0ZSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItMTA3LCBDaGVjayB0aGF0IHN1aXRlIHBhcmFtZXRlcnMgbW9kaWZpY2F0aW9uIGZyb20gbGlzdGVuZXIgZG9lcyBub3QgYWZmZWN0cyB0ZXN0cyBjb3VudCIpCisgIHB1YmxpYyB2b2lkIHRlc3RTdWl0ZVBhcmFtZXRlclNldEZyb21MaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFhtbFN1aXRlIHN1aXRlID0gY3JlYXRlWG1sU3VpdGUoIlNpbXBsZSBzdWl0ZSIpOworCisgICAgcnVuVGVzdChzdWl0ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuVGVzdChYbWxTdWl0ZSBzdWl0ZSkgeworICAgIGZpbmFsIFhtbFRlc3QgdGVzdCA9IGNyZWF0ZVhtbFRlc3Qoc3VpdGUsICJTaW1wbGUgVGVzdCIsIFRlc3RUZXN0bmdDb3VudGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgc3VpdGUuc2V0VGVzdHMoQXJyYXlzLmFzTGlzdCh0ZXN0KSk7CisKKyAgICBmaW5hbCBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgZmluYWwgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzdWl0ZSkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9NeVN1aXRlTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9NeVN1aXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZiNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2lzc3VlMTA3L015U3VpdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgdGVzdC5pc3N1ZTEwNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTXlTdWl0ZUxpc3RlbmVyIGltcGxlbWVudHMgSVN1aXRlTGlzdGVuZXIgeworICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJU3VpdGUgc3VpdGUpIHsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVN1aXRlIHN1aXRlKSB7CisgICAgZmluYWwgWG1sU3VpdGUgeG1sU3VpdGUgPSBzdWl0ZS5nZXRYbWxTdWl0ZSgpOworICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHhtbFN1aXRlLmdldFBhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLnB1dChUZXN0VGVzdG5nQ291bnRlci5QQVJBTUVURVJfTkFNRSwgVGVzdFRlc3RuZ0NvdW50ZXIuRVhQRUNURURfVkFMVUUpOworICAgIHhtbFN1aXRlLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9UZXN0VGVzdG5nQ291bnRlci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2lzc3VlMTA3L1Rlc3RUZXN0bmdDb3VudGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNmM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9pc3N1ZTEwNy9UZXN0VGVzdG5nQ291bnRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5pc3N1ZTEwNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQExpc3RlbmVycyhNeVN1aXRlTGlzdGVuZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgVGVzdFRlc3RuZ0NvdW50ZXIgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9OQU1FID0gImtleTEiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9WQUxVRSA9ICJ6enoiOworCisgIEBQYXJhbWV0ZXJzKHtQQVJBTUVURVJfTkFNRX0pCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXIoU3RyaW5nIGtleSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoa2V5LCBFWFBFQ1RFRF9WQUxVRSk7CisgIH0KKworICBAUGFyYW1ldGVycyh7UEFSQU1FVEVSX05BTUV9KQorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyQXNPcHRpb25hbChAT3B0aW9uYWwoIlVua25vd24iKSBTdHJpbmcga2V5KSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhrZXksIEVYUEVDVEVEX1ZBTFVFKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2phcnBhY2thZ2VzL0phclBhY2thZ2VzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2phcnBhY2thZ2VzL0phclBhY2thZ2VzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTY1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvamFycGFja2FnZXMvSmFyUGFja2FnZXNUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSB0ZXN0LmphcnBhY2thZ2VzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBKYXJQYWNrYWdlc1Rlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIHByaXZhdGUgVGVzdExpc3RlbmVyQWRhcHRlciBpbml0KFN0cmluZyBqYXJGaWxlKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIEZpbGUgY3VycmVudERpciA9IG5ldyBGaWxlKCIuIik7CisgICAgU3RyaW5nIHBhdGggPSBjdXJyZW50RGlyLmdldEFic29sdXRlUGF0aCgpOworICAgIGNoYXIgcyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICBwYXRoID0gcGF0aCArIHMgKyAidGVzdCIgKyBzICsgInNyYyIgKyBzICsgInRlc3QiICsgcyArICJqYXJwYWNrYWdlcyIgKyBzOworICAgIFN0cmluZyBmaW5hbFBhdGggPSBwYXRoICsgamFyRmlsZTsKKyAgICB0bmcuc2V0VGVzdEphcihmaW5hbFBhdGgpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgcmVzdWx0ID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIocmVzdWx0KTsKKyAgICB0bmcucnVuKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgamFyV2l0aFRlc3RuZ1htbCgpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IGluaXQoIndpdGh0ZXN0bmd4bWwuamFyIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDIpOworICAgIFN0cmluZyBmaXJzdCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldCgwKS5nZXROYW1lKCk7CisgICAgU3RyaW5nIHNlY29uZCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldCgxKS5nZXROYW1lKCk7CisgICAgYm9vbGVhbiBmVGhlbkcgPSAiZiIuZXF1YWxzKGZpcnN0KSAmJiAiZyIuZXF1YWxzKHNlY29uZCk7CisgICAgYm9vbGVhbiBnVGhlbkYgPSAiZyIuZXF1YWxzKGZpcnN0KSAmJiAiZiIuZXF1YWxzKHNlY29uZCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZlRoZW5HIHx8IGdUaGVuRik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBqYXJXaXRob3V0VGVzdG5nWG1sKCkgeworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gaW5pdCgid2l0aG91dHRlc3RuZ3htbC5qYXIiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMik7CisgICAgU3RyaW5nIGZpcnN0ID0gdGxhLmdldFBhc3NlZFRlc3RzKCkuZ2V0KDApLmdldE5hbWUoKTsKKyAgICBTdHJpbmcgc2Vjb25kID0gdGxhLmdldFBhc3NlZFRlc3RzKCkuZ2V0KDEpLmdldE5hbWUoKTsKKyAgICBib29sZWFuIGZUaGVuRyA9ICJmIi5lcXVhbHMoZmlyc3QpICYmICJnIi5lcXVhbHMoc2Vjb25kKTsKKyAgICBib29sZWFuIGdUaGVuRiA9ICJnIi5lcXVhbHMoZmlyc3QpICYmICJmIi5lcXVhbHMoc2Vjb25kKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmVGhlbkcgfHwgZ1RoZW5GKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2phcnBhY2thZ2VzL3Rlc3RuZy54bWwgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvamFycGFja2FnZXMvdGVzdG5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2phcnBhY2thZ2VzL3Rlc3RuZy54bWwKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvdGVzdG5nLTEuMC5kdGQiID4KKyAgCis8c3VpdGUgbmFtZT0iSmFyUGFja2FnZXNUZXN0U3VpdGUiIHZlcmJvc2U9IjAiPgorICA8dGVzdCBuYW1lPSJKYXJQYWNrYWdlc1Rlc3QiPgorICAgIDxwYWNrYWdlcz4KKyAgICAgIDxwYWNrYWdlIG5hbWU9InRlc3QuamFycGFja2FnZXMudGVzdHMiIC8+CisgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2phcnBhY2thZ2VzL3Rlc3RzL0EuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qYXJwYWNrYWdlcy90ZXN0cy9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMjVjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qYXJwYWNrYWdlcy90ZXN0cy9BLmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHRlc3QuamFycGFja2FnZXMudGVzdHM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qYXJwYWNrYWdlcy90ZXN0cy9CLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvamFycGFja2FnZXMvdGVzdHMvQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTdkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvamFycGFja2FnZXMvdGVzdHMvQi5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LmphcnBhY2thZ2VzLnRlc3RzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQiB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZygpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvamFzb24vTWFpbi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2phc29uL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQzODUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2phc29uL01haW4uamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QuamFzb247DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBNYWluIGV4dGVuZHMgTWFpbkJhc2Ugew0KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIG1fcGFzc2VkID0gZmFsc2U7DQorDQorICBAQWZ0ZXJDbGFzcw0KKyAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzcygpIHsNCisgICAgbV9wYXNzZWQgPSB0cnVlOw0KKyAgfQ0KKw0KKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiVGhpcyB0ZXN0IGlzIHJ1biIpDQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qYXNvbi9NYWluQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2phc29uL01haW5CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxMGRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qYXNvbi9NYWluQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5qYXNvbjsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBNYWluQmFzZSB7DQorDQorICBAVGVzdChkZXNjcmlwdGlvbiA9ICJUaGlzIHRlc3QgaXMgbmV2ZXIgcnVuIGJ1dCBwcmV2ZW50cyBBZnRlckNsYXNzIikNCisgIHB1YmxpYyB2b2lkIGNoZWNrUmVwb3J0c0V4aXN0KCkgew0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvamFzb24vTWFpblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qYXNvbi9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmU2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvamFzb24vTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIHRlc3QuamFzb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBNYWluVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzU2hvdWxkUnVuKCkgeworICAgIFhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiUyIpOworICAgIFhtbFRlc3QgdCA9IGNyZWF0ZVhtbFRlc3QocywgIlQiLCBNYWluLmNsYXNzLmdldE5hbWUoKSk7CisgICAgWG1sQ2xhc3MgYyA9IHQuZ2V0WG1sQ2xhc3NlcygpLmdldCgwKTsKKyAgICBjLmdldEluY2x1ZGVkTWV0aG9kcygpLmFkZChuZXcgWG1sSW5jbHVkZSgidGVzdDEiKSk7CisgICAgdC5zZXRQcmVzZXJ2ZU9yZGVyKCJ0cnVlIik7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChuZXcgWG1sU3VpdGVbXSB7IHMgfSkpOworICAgIE1haW4ubV9wYXNzZWQgPSBmYWxzZTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoTWFpbi5tX3Bhc3NlZCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvQmFzZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9CYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2MwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvQmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQmFzZSBKVW5pdCB0ZXN0IGNhc2UgdG8gdmVyaWZ5IFRlc3RORyBoYW5kbGVzCisgKiBUZXN0Q2FzZSBoaWVyYXJjaGllcyBwcm9wZXJseS4KKyAqCisgKiBAYXV0aG9yIG1wZXJoYW0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIGludCBzZXRVcEludm9rZUNvdW50ID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IHRlYXJEb3duSW52b2tlQ291bnQgPSAwOworCisgIHB1YmxpYyBCYXNlVGVzdChTdHJpbmcgbmFtZSkgeworICAgIHN1cGVyKG5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc2V0VXBJbnZva2VDb3VudCsrOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVhckRvd25JbnZva2VDb3VudCsrOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgdGVzdEEoKTsKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgdGVzdEIoKTsKKworICBwdWJsaWMgc3RhdGljIGludCBnZXRTZXRVcEludm9rZUNvdW50KCkgeworICAgIHJldHVybiBzZXRVcEludm9rZUNvdW50OworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGVhckRvd25JbnZva2VDb3VudCgpIHsKKyAgICByZXR1cm4gdGVhckRvd25JbnZva2VDb3VudDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvSlVuaXRDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9KVW5pdENvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzkyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvSlVuaXRDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworLyoqCisgKiBUZXN0IHRoYXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNvbnN0cnVjdG9ycyBpcyBjYWxsZWQKKyAqCisgKiBDcmVhdGVkIG9uIEF1ZyA5LCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgSlVuaXRDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgc3RhdGljIGludCBtX2NvbnN0cnVjdG9yQ291bnQgPSAwOworICBwcml2YXRlIHN0YXRpYyBpbnQgbV9jcmVhdGVDb3VudCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGludCBtX3F1ZXJ5Q291bnQgPSAwOworCisgIHB1YmxpYyBKVW5pdENvbnN0cnVjdG9yVGVzdCgvKlN0cmluZyBzdHJpbmcgKi8pIHsKKy8vICAgIHN1cGVyKHN0cmluZyk7CisvLyAgICBzZXROYW1lKHN0cmluZyk7CisgICAgcHBwKCJDT05TVFJVQ1RJTkciKTsKKyAgICBtX2NvbnN0cnVjdG9yQ291bnQrKzsKKyAgfQorCisvLyAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisvLyAgICBwcHAoIlRFU1QxIik7CisvLyAgfQorLy8KKy8vICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKy8vICAgIHBwcCgiVEVTVDIiKTsKKy8vICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKKyAgICBwcHAoIlRFU1RfQ1JFQVRFIik7CisgICAgbV9jcmVhdGVDb3VudCsrOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5KCkgeworICAgIHBwcCgiVEVTVF9RVUVSWSIpOworICAgIG1fcXVlcnlDb3VudCsrOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIGFzc2VydEVxdWFscygzLCBtX2NvbnN0cnVjdG9yQ291bnQpOworICAgIGFzc2VydFRydWUoKDEgPT0gbV9jcmVhdGVDb3VudCAmJiAwID09IG1fcXVlcnlDb3VudCkgfHwKKyAgICAgICAgKDAgPT0gbV9jcmVhdGVDb3VudCAmJiAxID09IG1fcXVlcnlDb3VudCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltKVW5pdEhpZXJhcmNoeVRlc3RdICIgKyBzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9KVW5pdEVtcHR5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L0pVbml0RW1wdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1ODRlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9KVW5pdEVtcHR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgSlVuaXRFbXB0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIEpVbml0RW1wdHlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIobmFtZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHMgPSBuZXcgVGVzdFN1aXRlKEpVbml0RW1wdHlUZXN0LmNsYXNzKTsKKyAgICByZXR1cm4gczsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9NYWluU3VpdGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9NYWluU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdiMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L01haW5TdWl0ZS5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBNYWluU3VpdGUgeworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiTWFpblN1aXRlIik7CisKKyAgICBzdWl0ZS5hZGRUZXN0KFN1aXRlMS5zdWl0ZSgpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KFN1aXRlMi5zdWl0ZSgpKTsKKyAgICBzdWl0ZS5hZGRUZXN0KFN1aXRlMy5zdWl0ZSgpKTsKKworICAgIHJldHVybiBzdWl0ZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU2V0TmFtZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9TZXROYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTY5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU2V0TmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU2V0TmFtZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgaW50IG1fY3RvckNvdW50ID0gMDsKKworICBwdWJsaWMgU2V0TmFtZVRlc3QoKSB7CisgICAgcHBwKCJDVE9SIik7CisgICAgbV9jdG9yQ291bnQrKzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgcHBwKCJTRVROQU1FICIgKyBuYW1lKTsKKyAgICBzdXBlci5zZXROYW1lKG5hbWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZvbygpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0Rm9vIiwgZ2V0TmFtZSgpKTsKKyAgICBwcHAoIkZPTyIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJhcigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0QmFyIiwgZ2V0TmFtZSgpKTsKKyAgICBwcHAoIkJBUiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGb29CYXJUZXN0IyIgKyBoYXNoQ29kZSgpICsgIl0gIiArIHN0cmluZyk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1NldFVwRXhjZXB0aW9uU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1NldFVwRXhjZXB0aW9uU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGViZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU2V0VXBFeGNlcHRpb25TYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0Lmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU2V0VXBFeGNlcHRpb25TYW1wbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TTEoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1NldFVwRXhjZXB0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1NldFVwRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU2V0VXBFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0Lmp1bml0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2V0VXBFeGNlcHRpb25UZXN0IGV4dGVuZHMgdGVzdC5CYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2V0VXBGYWlsaW5nU2hvdWxkQ2F1c2VNZXRob2RzVG9CZVNraXBwZWQoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QuanVuaXQuU2V0VXBFeGNlcHRpb25TYW1wbGVUZXN0Iik7CisgICAgc2V0SlVuaXQodHJ1ZSk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgInNldFVwIgorICAgIH07CisgICAgU3RyaW5nW10gc2tpcHBlZCA9IHsKKyAgICAgICJ0ZXN0TTEiLCAidGVhckRvd24iCisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIHNraXBwZWQsIGdldFNraXBwZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1N1aXRlMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1N1aXRlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNzFjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU3VpdGUxLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0Lmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFN1aXRlMSB7CisgIHB1YmxpYyBTdWl0ZTEoU3RyaW5nIHMpIHsKKyAgICAvLyBkdW1teQorICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpVbml0U3VpdGUxIik7CisgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RBYS5jbGFzcyk7CisgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RBYi5jbGFzcyk7CisgICAgcmV0dXJuIHN1aXRlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU3VpdGUyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU3VpdGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2MzcwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9TdWl0ZTIuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgU3VpdGUyIHsKKyAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlN1aXRlMiIpOworICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0QWMuY2xhc3MpOworICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0QWQuY2xhc3MpOworICAgIHN1aXRlLmFkZFRlc3QoU3VpdGUzLnN1aXRlKCkpOworICAgIHJldHVybiBzdWl0ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1N1aXRlMy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1N1aXRlMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzQxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvU3VpdGUzLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFN1aXRlMyB7CisgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJTdWl0ZTMiKTsKKyAgICBzdWl0ZS5hZGRUZXN0KFN1aXRlNC5zdWl0ZSgpKTsKKyAgICByZXR1cm4gc3VpdGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9TdWl0ZTQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9TdWl0ZTQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMxOGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L1N1aXRlNC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBTdWl0ZTQgeworICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiU3VpdGU0Iik7CisgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RBZS5jbGFzcyk7CisgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RBZi5jbGFzcyk7CisgICAgcmV0dXJuIHN1aXRlOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFhLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmZjdmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWEuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWEgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFhMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFiLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwZGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWIuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFiMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFjLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzMDVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWMuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFjMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFkLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2Mzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWQuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFkMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjZmNiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWUuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFlMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFmLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvVGVzdEFmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3NjFkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC9UZXN0QWYuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWYgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdEFmMSgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0FUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0FUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyZmE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC90ZXN0c2V0dXAvQVRlc3QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QuanVuaXQudGVzdHNldHVwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyB2b2lkIHRlc3RJdCgpCisJeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQS50ZXN0SXQoKSIpOworCQlEYXRhIGQgPSBUZXN0U3VpdGVDb250YWluZXJXcmFwcGVyLmdldERhdGEoKTsKKwkJYXNzZXJ0RXF1YWxzKDMsZC5pKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0RhdGEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC90ZXN0c2V0dXAvRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMmY4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0RhdGEuamF2YQpAQCAtMCwwICsxLDYgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdC50ZXN0c2V0dXA7CisKK3B1YmxpYyBjbGFzcyBEYXRhCit7CisJcHVibGljIGludCBpID0gMzsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC90ZXN0c2V0dXAvTGF5ZXJBVGVzdFN1aXRlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0xheWVyQVRlc3RTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzg0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0xheWVyQVRlc3RTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdC50ZXN0c2V0dXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgTGF5ZXJBVGVzdFN1aXRlCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKwl7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoICJMYXllciBBIFRlc3QgU3VpdGUiICk7CisKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKCBBVGVzdC5jbGFzcyApOworCisJCVRlc3RTdWl0ZUNvbnRhaW5lcldyYXBwZXIgd3JhcHBlciA9IG5ldyBUZXN0U3VpdGVDb250YWluZXJXcmFwcGVyKHN1aXRlLCBEYXRhLmNsYXNzKTsKKwkJcmV0dXJuIHdyYXBwZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L3Rlc3RzZXR1cC9Mb2dnaW5nVGVzdFN1aXRlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL0xvZ2dpbmdUZXN0U3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U2MWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0L3Rlc3RzZXR1cC9Mb2dnaW5nVGVzdFN1aXRlLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSB0ZXN0Lmp1bml0LnRlc3RzZXR1cDsKKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIExvZ2dpbmdUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUKK3sKKwlwdWJsaWMgTG9nZ2luZ1Rlc3RTdWl0ZSggU3RyaW5nIHN0cmluZyApCisJeworCQlzdXBlciggc3RyaW5nICk7CisJfQorCisJQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1biggVGVzdFJlc3VsdCByZXN1bHQgKQorCXsKKwkJc3VwZXIucnVuKCByZXN1bHQgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuVGVzdCggVGVzdCB0ZXN0LCBUZXN0UmVzdWx0IHJlc3VsdCApCisJeworCQlzdXBlci5ydW5UZXN0KCB0ZXN0LCByZXN1bHQgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL1Ntb2tlU3VpdGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC90ZXN0c2V0dXAvU21va2VTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzJlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL1Ntb2tlU3VpdGUuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHRlc3QuanVuaXQudGVzdHNldHVwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFNtb2tlU3VpdGUgZXh0ZW5kcyBMb2dnaW5nVGVzdFN1aXRlCit7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQorCXsKKwkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKCBzdWl0ZSgpICk7CisJfQorCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKwl7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoICJTbW9rZSBUZXN0IFN1aXRlIiApOworCisJCXN1aXRlLmFkZFRlc3QoTGF5ZXJBVGVzdFN1aXRlLnN1aXRlKCkpOworCisJCXJldHVybiBzdWl0ZTsKKwl9CisKKy8vCXB1YmxpYyBTbW9rZVN1aXRlKCkKKy8vCXsKKy8vCQl0aGlzKCJTbW9rZVN1aXRlIik7CisvLwl9CisKKwlwdWJsaWMgU21va2VTdWl0ZSggU3RyaW5nIG5hbWUgKQorCXsKKwkJc3VwZXIoIG5hbWUgKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL1Rlc3RTdWl0ZUNvbnRhaW5lcldyYXBwZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdC90ZXN0c2V0dXAvVGVzdFN1aXRlQ29udGFpbmVyV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjkwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQvdGVzdHNldHVwL1Rlc3RTdWl0ZUNvbnRhaW5lcldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIHRlc3QuanVuaXQudGVzdHNldHVwOworCitpbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFRlc3RTdWl0ZUNvbnRhaW5lcldyYXBwZXIgZXh0ZW5kcyBUZXN0U2V0dXAgeworICBwcml2YXRlIHN0YXRpYyBEYXRhIElOU1RBTkNFID0gbnVsbDsKKyAgcHJpdmF0ZSBzdGF0aWMgVGVzdFN1aXRlIF90ZXN0ID0gbnVsbDsKKyAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZGF0YUltcGwgPSBudWxsOworCisgIHB1YmxpYyBUZXN0U3VpdGVDb250YWluZXJXcmFwcGVyKFRlc3RTdWl0ZSB0ZXN0U3VpdGUsIENsYXNzIGRhdGFJbXBsKSB7CisgICAgc3VwZXIodGVzdFN1aXRlKTsKKyAgICBfdGVzdCA9IHRlc3RTdWl0ZTsKKyAgICBUZXN0U3VpdGVDb250YWluZXJXcmFwcGVyLmRhdGFJbXBsID0gZGF0YUltcGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIERhdGEgZ2V0RGF0YSgpIHsKKyAgICByZXR1cm4gSU5TVEFOQ0U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldHVwIik7CisgICAgSU5TVEFOQ0UgPSAoRGF0YSkgZGF0YUltcGwubmV3SW5zdGFuY2UoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVhcmRvd24iKTsKKworICAgIElOU1RBTkNFID0gbnVsbDsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbihfdGVzdC5jb3VudFRlc3RDYXNlcygpICsgIiB0ZXN0IGNhc2VzIGRlZmluZWQgYnkgXCIiCisgICAgICAgICsgX3Rlc3QuZ2V0TmFtZSgpICsgIlwiIHdlcmUgZXhlY3V0ZWQuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSW5oZXJpdGVkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0NC9Jbmhlcml0ZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwYWU3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSW5oZXJpdGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0Lmp1bml0NDsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCitwdWJsaWMgY2xhc3MgSW5oZXJpdGVkVGVzdCBleHRlbmRzIEpVbml0NFNhbXBsZTEgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQ0L0pVbml0NENoaWxkLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQ0L0pVbml0NENoaWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjZDIxNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0Q2hpbGQuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QuanVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7SlVuaXQ0U2FtcGxlMS5jbGFzc30pCitwdWJsaWMgY2xhc3MgSlVuaXQ0Q2hpbGQgZXh0ZW5kcyBKVW5pdDRTYW1wbGVTdWl0ZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFWFBFQ1RFRCA9IHsidDEifTsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0UGFyYW1ldGVyaXplZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0UGFyYW1ldGVyaXplZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTM1YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0NC9KVW5pdDRQYXJhbWV0ZXJpemVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEpVbml0NFBhcmFtZXRlcml6ZWRUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVhQRUNURUQgPSB7InQyWzBdIiwgInQyWzFdIiwgInQ0WzBdIn07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTS0lQUEVEID0geyJ0M1swXSIsICJ0M1sxXSIsICJ0YVswXSIsICJ0YVsxXSJ9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkFJTEVEID0geyJ0NFsxXSIsICJ0ZlswXSIsICJ0ZlsxXSJ9OworCisgICAgcHJpdmF0ZSBpbnQgcGFyYW07CisKKyAgICBAUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10ge3sxfSwgezV9fSk7CisgICAgfQorCisgICAgcHVibGljIEpVbml0NFBhcmFtZXRlcml6ZWRUZXN0KGludCBwYXJhbSkgeworICAgICAgICB0aGlzLnBhcmFtID0gcGFyYW07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0MigpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICBwdWJsaWMgdm9pZCB0MygpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHQ0KCkgeworICAgICAgICBpZiAocGFyYW0gPT0gNSkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoImEgdGVzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZigpIHsKKyAgICAgICAgQXNzZXJ0LmZhaWwoImEgdGVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGEoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQ0L0pVbml0NFNhbXBsZTEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0U2FtcGxlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOGUyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVuaXQ0L0pVbml0NFNhbXBsZTEuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QuanVuaXQ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworcHVibGljIGNsYXNzIEpVbml0NFNhbXBsZTEgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0MSgpIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0U2FtcGxlMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0NC9KVW5pdDRTYW1wbGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwOWY4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0U2FtcGxlMi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCitwdWJsaWMgY2xhc3MgSlVuaXQ0U2FtcGxlMiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVYUEVDVEVEID0geyJ0MiIsICJ0NCJ9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0tJUFBFRCA9IHsidDMiLCAidGEifTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZBSUxFRCA9IHsidGYifTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdDIoKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgcHVibGljIHZvaWQgdDMoKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0NCgpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRmKCkgeworICAgICAgICBBc3NlcnQuZmFpbCgiYSB0ZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0YSgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0U2FtcGxlU3VpdGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9qdW5pdDQvSlVuaXQ0U2FtcGxlU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU5M2IwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1bml0NC9KVW5pdDRTYW1wbGVTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5qdW5pdDQ7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHsKKyAgICBKVW5pdDRTYW1wbGUxLmNsYXNzLAorICAgIEpVbml0NFNhbXBsZTIuY2xhc3MKK30pCitwdWJsaWMgY2xhc3MgSlVuaXQ0U2FtcGxlU3VpdGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFWFBFQ1RFRCA9IHsidDEiLCAidDIiLCAidDQifTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNLSVBQRUQgPSB7InQzIiwgInRhIn07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGQUlMRUQgPSB7InRmIn07Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvanVzdGluL0Jhc2VUZXN0Q2FzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1c3Rpbi9CYXNlVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJhN2NiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2p1c3Rpbi9CYXNlVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIHRlc3QuanVzdGluOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpsZWVAYW50d2Vya3ouY29tIj5KdXN0aW4gTGVlPC9hPiBEYXRlOiBBdWcgMTUsIDIwMDQKKyAqLworQFRlc3QKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVGVzdENhc2UgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFTU1dPUkQgPSAidGVzdFBhc3N3b3JkIjsKKworICAgIHB1YmxpYyBCYXNlVGVzdENhc2UoKSB7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc2V0U2Vzc2lvblVzZXIobnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgeworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVUaW1lRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVVc2VyKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVXNlckdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXNzaW9uVXNlcihPYmplY3QgdXNlcikgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9qdXN0aW4vTW9udGhUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVzdGluL01vbnRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTk0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvanVzdGluL01vbnRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5qdXN0aW47CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogQ3JlYXRlZCBKdWwgMTAsIDIwMDUKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqbGVlQGFudHdlcmt6LmNvbSI+SnVzdGluIExlZTwvYT4KKyAqLworcHVibGljIGNsYXNzIE1vbnRoVGVzdCBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7CisgICAgcHVibGljIE1vbnRoVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTW9udGhUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIEBUZXN0KGdyb3VwcyA9IHsiYmVhbi10ZXN0cyJ9KQorICAgIHB1YmxpYyB2b2lkIGp1bHkyMDA1KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdlZWtlbmREYXkoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0FnZ3JlZ2F0ZVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQWdncmVnYXRlU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjBhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0FnZ3JlZ2F0ZVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitATGlzdGVuZXJzKEwyLmNsYXNzKQorcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlQWdncmVnYXRlIHsKKyAgc3RhdGljIGludCBtX2NvdW50ID0gMDsKKyAgc3RhdGljIHB1YmxpYyB2b2lkIGluY3JlbWVudENvdW50KCkgeworICAgIG1fY291bnQrKzsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQWx0ZXJTdWl0ZUxpc3RlbmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9BbHRlclN1aXRlTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4YmU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQWx0ZXJTdWl0ZUxpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklBbHRlclN1aXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBBbHRlclN1aXRlTGlzdGVuZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJfU1VJVEVfTElTVEVORVIgPSAiQWx0ZXJTdWl0ZUxpc3RlbmVyIjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhlY3V0aW9uTGlzdGVuZXJXaXRoWG1sKCkgeworICAgICAgICBYbWxTdWl0ZSBzdWl0ZSA9IHJ1blRlc3QoQWx0ZXJTdWl0ZUxpc3RlbmVyMVNhbXBsZVRlc3QuY2xhc3MsIEFsdGVyU3VpdGVOYW1lTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdWl0ZS5nZXROYW1lKCksIEFsdGVyU3VpdGVOYW1lTGlzdGVuZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGlvbkxpc3RlbmVyV2l0aG91dExpc3RlbmVyKCkgeworICAgICAgICBYbWxTdWl0ZSBzdWl0ZSA9IHJ1blRlc3QoQWx0ZXJTdWl0ZUxpc3RlbmVyMVNhbXBsZVRlc3QuY2xhc3MsIG51bGwvKkRvbm90IGFkZCB0aGUgbGlzdGVuZXIqLyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3VpdGUuZ2V0TmFtZSgpLCBBTFRFUl9TVUlURV9MSVNURU5FUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRpb25MaXN0ZW5lcldpdGhYbWwyKCkgeworICAgICAgICBYbWxTdWl0ZSBzdWl0ZSA9IHJ1blRlc3QoQWx0ZXJTdWl0ZUxpc3RlbmVyMVNhbXBsZVRlc3QuY2xhc3MsIEFsdGVyWG1sVGVzdHNJblN1aXRlTGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdWl0ZS5nZXRUZXN0cygpLnNpemUoKSwgMik7CisgICAgfQorCisKKyAgICBwcml2YXRlIFhtbFN1aXRlIHJ1blRlc3QoQ2xhc3M8Pz4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGxpc3RlbmVyTmFtZSkgeworICAgICAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoQUxURVJfU1VJVEVfTElTVEVORVIpOworICAgICAgICBjcmVhdGVYbWxUZXN0KHMsICJUZXN0IiwgbGlzdGVuZXJDbGFzcy5nZXROYW1lKCkpOworICAgICAgICBib29sZWFuIGFkZExpc3RlbmVyID0gKGxpc3RlbmVyTmFtZSAhPSBudWxsKTsKKworICAgICAgICBpZiAoYWRkTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHMuYWRkTGlzdGVuZXIobGlzdGVuZXJOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzKSk7CisgICAgICAgIHRuZy5ydW4oKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbHRlclN1aXRlTGlzdGVuZXIxU2FtcGxlVGVzdCB7CisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbHRlclN1aXRlTmFtZUxpc3RlbmVyIGltcGxlbWVudHMgSUFsdGVyU3VpdGVMaXN0ZW5lciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFsdGVyKExpc3Q8WG1sU3VpdGU+IHN1aXRlcykgeworICAgICAgICAgICAgWG1sU3VpdGUgc3VpdGUgPSBzdWl0ZXMuZ2V0KDApOworICAgICAgICAgICAgc3VpdGUuc2V0TmFtZShnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWx0ZXJYbWxUZXN0c0luU3VpdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElBbHRlclN1aXRlTGlzdGVuZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhbHRlcihMaXN0PFhtbFN1aXRlPiBzdWl0ZXMpIHsKKyAgICAgICAgICAgIFhtbFN1aXRlIHN1aXRlID0gc3VpdGVzLmdldCgwKTsKKyAgICAgICAgICAgIExpc3Q8WG1sVGVzdD4gdGVzdHMgPSBzdWl0ZS5nZXRUZXN0cygpOworICAgICAgICAgICAgWG1sVGVzdCB0ZXN0ID0gdGVzdHMuZ2V0KDApOworICAgICAgICAgICAgWG1sVGVzdCBhbm90aGVyVGVzdCA9IG5ldyBYbWxUZXN0KHN1aXRlKTsKKyAgICAgICAgICAgIGFub3RoZXJUZXN0LnNldE5hbWUoImZvbyIpOworICAgICAgICAgICAgYW5vdGhlclRlc3Quc2V0Q2xhc3Nlcyh0ZXN0LmdldENsYXNzZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQmFzZUFnZ3JlZ2F0ZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9CYXNlQWdncmVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiZmM5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQmFzZUFnZ3JlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworCitATGlzdGVuZXJzKEwxLmNsYXNzKQorcHVibGljIGNsYXNzIEJhc2VBZ2dyZWdhdGUgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0Jhc2VMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9CYXNlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4ZmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9CYXNlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBCYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBJVGVzdExpc3RlbmVyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgQWdncmVnYXRlU2FtcGxlVGVzdC5pbmNyZW1lbnRDb3VudCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgY29udGV4dCkgeworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQmFzZVdpdGhMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9CYXNlV2l0aExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkZmE5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQmFzZVdpdGhMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKKworQExpc3RlbmVycyh2YWx1ZSA9IHtMMy5jbGFzcywgU3VpdGVMaXN0ZW5lci5jbGFzcywgTXlJbnZva2VkTWV0aG9kTGlzdGVuZXIuY2xhc3N9KQorY2xhc3MgQmFzZVdpdGhMaXN0ZW5lciB7CisgIHN0YXRpYyBpbnQgbV9jb3VudCA9IDA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluY3JlbWVudENvdW50KCkgeworICAgIG1fY291bnQrKzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9DbGFzc0xpc3RlbmVyU2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NsYXNzTGlzdGVuZXJTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg5OTgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9DbGFzc0xpc3RlbmVyU2FtcGxlLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQExpc3RlbmVycyhNeUNsYXNzTGlzdGVuZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ2xhc3NMaXN0ZW5lclNhbXBsZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdCgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lckZhaWxTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lckZhaWxTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwOTZlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQ29uZmlndXJhdGlvbkxpc3RlbmVyRmFpbFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RlbmVyRmFpbFNhbXBsZVRlc3QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm1TaG91bGRGYWlsKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclNraXBTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclNraXBTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3NmMyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQ29uZmlndXJhdGlvbkxpc3RlbmVyU2tpcFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RlbmVyU2tpcFNhbXBsZVRlc3QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm1TaG91bGRGYWlsKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kKGRlcGVuZHNPbk1ldGhvZHMgPSAiYm1TaG91bGRGYWlsIikKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclN1Y2NlZWRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclN1Y2NlZWRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwNzJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQ29uZmlndXJhdGlvbkxpc3RlbmVyU3VjY2VlZFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RlbmVyU3VjY2VlZFNhbXBsZVRlc3QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm1TaG91bGRTdWNjZWVkKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvQ29uZmlndXJhdGlvbkxpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjE5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0NvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyMjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTGlzdGVuZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHN0YXRpYyBwdWJsaWMgY2xhc3MgQ0wgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkxpc3RlbmVyMiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbV9zdGF0dXMgPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYmVmb3JlQ29uZmlndXJhdGlvbihJVGVzdFJlc3VsdCB0cikgeworICAgICAgbV9zdGF0dXMgKz0gMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25TdWNjZXNzKElUZXN0UmVzdWx0IGl0cikgeworICAgICAgbV9zdGF0dXMgKz0gMzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25GYWlsdXJlKElUZXN0UmVzdWx0IGl0cikgeworICAgICAgbV9zdGF0dXMgKz0gNTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25Ta2lwKElUZXN0UmVzdWx0IGl0cikgeworICAgICAgbV9zdGF0dXMgKz0gNzsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KENsYXNzPD8+IGNscywgaW50IGV4cGVjdGVkKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShjbHMpOworICAgIENMIGxpc3RlbmVyID0gbmV3IENMKCk7CisgICAgQ0wubV9zdGF0dXMgPSAwOworICAgIHRuZy5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDTC5tX3N0YXR1cywgZXhwZWN0ZWQpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2hvdWxkU3VjY2VlZCgpIHsKKyAgICBydW5UZXN0KENvbmZpZ3VyYXRpb25MaXN0ZW5lclN1Y2NlZWRTYW1wbGVUZXN0LmNsYXNzLCAxICsgMyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGRGYWlsKCkgeworICAgIHJ1blRlc3QoQ29uZmlndXJhdGlvbkxpc3RlbmVyRmFpbFNhbXBsZVRlc3QuY2xhc3MsIDEgKyA1KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZFNraXAoKSB7CisgICAgcnVuVGVzdChDb25maWd1cmF0aW9uTGlzdGVuZXJTa2lwU2FtcGxlVGVzdC5jbGFzcywgMSArIDUgKyA3KTsgLy8gZmFpbCArIHNraXAKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9EZXJpdmVkMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9EZXJpdmVkMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDllNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0Rlcml2ZWQxLmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitjbGFzcyBEZXJpdmVkMSBleHRlbmRzIEJhc2VXaXRoTGlzdGVuZXIgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0KCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0Rlcml2ZWQyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0Rlcml2ZWQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjYWFjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvRGVyaXZlZDIuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2NsYXNzIERlcml2ZWQyIGV4dGVuZHMgQmFzZVdpdGhMaXN0ZW5lciB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHMoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvRW5kTWlsbGlzU2hvdWxkTm90QmVaZXJvVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9FbmRNaWxsaXNTaG91bGROb3RCZVplcm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlZWMxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvRW5kTWlsbGlzU2hvdWxkTm90QmVaZXJvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5saXN0ZW5lcnMuRW5kTWlsbGlzU2hvdWxkTm90QmVaZXJvVGVzdC5NeUludm9rZWRNZXRob2RMaXN0ZW5lcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitATGlzdGVuZXJzKE15SW52b2tlZE1ldGhvZExpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEVuZE1pbGxpc1Nob3VsZE5vdEJlWmVyb1Rlc3QgeworICBwcml2YXRlIHN0YXRpYyBsb25nIG1fZW5kOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbnZva2VkTWV0aG9kTGlzdGVuZXIgaW1wbGVtZW50cyBJSW52b2tlZE1ldGhvZExpc3RlbmVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworICAgICAgbV9lbmQgPSB0ZXN0UmVzdWx0LmdldEVuZE1pbGxpcygpOworICAgIH0KKyAgICAKKyAgfQorCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBibSgpIHsKKyAgICBtX2VuZCA9IDA7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpCisgIHsKKyAgICB0cnkgeworICAgICAgVGhyZWFkLnNsZWVwKDEpOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGhhbmRsZWQpIHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgfQorICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTWFrZSBzdXJlIHRoYXQgSVRlc3RSZXN1bHQjZ2V0RW5kTWlsbGlzIGlzIHByb3Blcmx5IHNldCIsCisgICAgICBkZXBlbmRzT25NZXRob2RzID0gImYxIikKKyAgcHVibGljIHZvaWQgZjIoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9lbmQgPiAwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9FeGVjdXRpb25MaXN0ZW5lcjFTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0V4ZWN1dGlvbkxpc3RlbmVyMVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVkMTQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9FeGVjdXRpb25MaXN0ZW5lcjFTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEV4ZWN1dGlvbkxpc3RlbmVyMVNhbXBsZVRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmKCkge30KK30KKworCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0V4ZWN1dGlvbkxpc3RlbmVyMlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvRXhlY3V0aW9uTGlzdGVuZXIyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDM4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0V4ZWN1dGlvbkxpc3RlbmVyMlNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitATGlzdGVuZXJzKEV4ZWN1dGlvbkxpc3RlbmVyVGVzdC5FeGVjdXRpb25MaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBFeGVjdXRpb25MaXN0ZW5lcjJTYW1wbGVUZXN0IHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvRXhlY3V0aW9uTGlzdGVuZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0V4ZWN1dGlvbkxpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Y2I3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0V4ZWN1dGlvbkxpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklFeGVjdXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgRXhlY3V0aW9uTGlzdGVuZXJUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhlY3V0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJRXhlY3V0aW9uTGlzdGVuZXIgeworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtX3N0YXJ0ID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1fZmluaXNoID0gZmFsc2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV4ZWN1dGlvblN0YXJ0KCkgeworICAgICAgbV9zdGFydCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FeGVjdXRpb25GaW5pc2goKSB7CisgICAgICBtX2ZpbmlzaCA9IHRydWU7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZXhlY3V0aW9uTGlzdGVuZXJXaXRoWG1sKCkgeworICAgIHJ1blRlc3QoRXhlY3V0aW9uTGlzdGVuZXIxU2FtcGxlVGVzdC5jbGFzcywgdHJ1ZSAvKiBhZGQgbGlzdGVuZXIgKi8sIHRydWUgLyogc2hvdWxkIHJ1biAqLyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleGVjdXRpb25MaXN0ZW5lcldpdGhvdXRMaXN0ZW5lcigpIHsKKyAgICBydW5UZXN0KEV4ZWN1dGlvbkxpc3RlbmVyMVNhbXBsZVRlc3QuY2xhc3MsIGZhbHNlIC8qIGRvbid0IGFkZCBsaXN0ZW5lciAqLywKKyAgICAgICAgZmFsc2UgLyogc2hvdWxkIG5vdCBydW4gKi8pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZXhlY3V0aW9uTGlzdGVuZXJBbm5vdGF0aW9uKCkgeworICAgIHJ1blRlc3QoRXhlY3V0aW9uTGlzdGVuZXIyU2FtcGxlVGVzdC5jbGFzcywgZmFsc2UgLyogZG9uJ3QgYWRkIGxpc3RlbmVyICovLAorICAgICAgICB0cnVlIC8qIHNob3VsZCBydW4gKi8pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoQ2xhc3M8Pz4gbGlzdGVuZXJDbGFzcywgYm9vbGVhbiBhZGRMaXN0ZW5lciwgYm9vbGVhbiBleHBlY3RlZCkgeworICAgIFhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiRXhlY3V0aW9uTGlzdGVuZXIiKTsKKyAgICBYbWxUZXN0IHQgPSBjcmVhdGVYbWxUZXN0KHMsICJUZXN0IiwgbGlzdGVuZXJDbGFzcy5nZXROYW1lKCkpOworCisgICAgaWYgKGFkZExpc3RlbmVyKSB7CisgICAgICBzLmFkZExpc3RlbmVyKEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3QocykpOworICAgIEV4ZWN1dGlvbkxpc3RlbmVyLm1fc3RhcnQgPSBmYWxzZTsKKyAgICBFeGVjdXRpb25MaXN0ZW5lci5tX2ZpbmlzaCA9IGZhbHNlOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRXhlY3V0aW9uTGlzdGVuZXIubV9zdGFydCwgZXhwZWN0ZWQpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRXhlY3V0aW9uTGlzdGVuZXIubV9maW5pc2gsIGV4cGVjdGVkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9GYWlsaW5nU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9GYWlsaW5nU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTAyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0ZhaWxpbmdTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitATGlzdGVuZXJzKFNpbXBsZUxpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEZhaWxpbmdTYW1wbGVUZXN0IHsKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFtKCkgeworICAgIFNpbXBsZUxpc3RlbmVyLm1fbGlzdC5hZGQoNik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhMSgpIHsKKyAgICBTaW1wbGVMaXN0ZW5lci5tX2xpc3QuYWRkKDQpOworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTcxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0wxLmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitwdWJsaWMgY2xhc3MgTDEgZXh0ZW5kcyBCYXNlTGlzdGVuZXIgeworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODYwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0wyLmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitwdWJsaWMgY2xhc3MgTDIgZXh0ZW5kcyBCYXNlTGlzdGVuZXIgeworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2YyODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0wzLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworCitwdWJsaWMgY2xhc3MgTDMgZXh0ZW5kcyBUZXN0TGlzdGVuZXJBZGFwdGVyIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgIEJhc2VXaXRoTGlzdGVuZXIuaW5jcmVtZW50Q291bnQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0N2ZmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBMTGlzdGVuZXIgaW1wbGVtZW50cyBJSW52b2tlZE1ldGhvZExpc3RlbmVyIHsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGludm9rZWQgPSBmYWxzZTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYmVmb3JlSW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICBpbnZva2VkID0gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZnRlckludm9jYXRpb24oSUludm9rZWRNZXRob2QgbWV0aG9kLCBJVGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTA2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0xTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgTFNhbXBsZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGR1bW15KCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTGlzdGVuZXJBc3NlcnQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTGlzdGVuZXJBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNhZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MaXN0ZW5lckFzc2VydC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdMaXN0ZW5lcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgZmluYWwgY2xhc3MgTGlzdGVuZXJBc3NlcnQgeworCisgICAgcHJpdmF0ZSBMaXN0ZW5lckFzc2VydCgpIHt9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0TGlzdGVuZXJUeXBlKExpc3Q8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lcj4gbGlzdGVuZXJzLCBDbGFzczw/IGV4dGVuZHMgSVRlc3ROR0xpc3RlbmVyPiBjbGF6eikgeworICAgICAgICBmb3IgKElUZXN0TkdMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgaWYgKGNsYXp6LmlzSW5zdGFuY2UobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFzc2VydC5mYWlsKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MaXN0ZW5lckluWG1sVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MaXN0ZW5lckluWG1sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2M2YzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL0xpc3RlbmVySW5YbWxUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgTGlzdGVuZXJJblhtbFRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTWFrZSBzdXJlIHRoYXQgbGlzdGVuZXJzIGRlZmluZWQgaW4gdGVzdG5nLnhtbCBhcmUgaW52b2tlZCIpCisgIHB1YmxpYyB2b2lkIGxpc3RlbmVySW5YbWxTaG91bGRCZUludm9rZWQoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRUZXN0U3VpdGVzKEFycmF5cy5hc0xpc3QoZ2V0UGF0aFRvUmVzb3VyY2UoImxpc3RlbmVyLWluLXhtbC54bWwiKSkpOworICAgIExMaXN0ZW5lci5pbnZva2VkID0gZmFsc2U7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKExMaXN0ZW5lci5pbnZva2VkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9MaXN0ZW5lclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNjU4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTGlzdGVuZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5lbnRyeTsKKworcHVibGljIGNsYXNzIExpc3RlbmVyVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJtKCkgeworICAgIFNpbXBsZUxpc3RlbmVyLm1fbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiRW5zdXJlIHRoYXQgaWYgYSBsaXN0ZW5lciBpcyBwcmVzZW50LCB3ZSBnZXQgdGVzdCgpLCBvblN1Y2Nlc3MoKSwiICsKKyAgCQkiIGFmdGVyTWV0aG9kKCkiKQorICBwdWJsaWMgdm9pZCBsaXN0ZW5lclNob3VsZEJlQ2FsbGVkQmVmb3JlQ29uZmlndXJhdGlvbigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKE9yZGVyZWRMaXN0ZW5lclNhbXBsZVRlc3QuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNpbXBsZUxpc3RlbmVyLm1fbGlzdCwgQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJURVNUTkctNDAwOiBvblRlc3RGYWlsdXJlIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEBBZnRlck1ldGhvZCIpCisgIHB1YmxpYyB2b2lkIGZhaWx1cmVCZWZvcmVBZnRlck1ldGhvZCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEZhaWxpbmdTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVMaXN0ZW5lci5tX2xpc3QsIEFycmF5cy5hc0xpc3QoNCwgNSwgNikpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiSW5oZXJpdGVkIEBMaXN0ZW5lcnMgYW5ub3RhdGlvbnMgc2hvdWxkIGFnZ3JlZ2F0ZSIpCisgIHB1YmxpYyB2b2lkIGFnZ3JlZ2F0ZUxpc3RlbmVycygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEFnZ3JlZ2F0ZVNhbXBsZVRlc3QuY2xhc3MpOworICAgIEFnZ3JlZ2F0ZVNhbXBsZVRlc3QubV9jb3VudCA9IDA7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQWdncmVnYXRlU2FtcGxlVGVzdC5tX2NvdW50LCAyKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIlNob3VsZCBhdHRhY2ggb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgQExpc3RlbmVyIGNsYXNzIHBlciB0ZXN0IikKKyAgcHVibGljIHZvaWQgc2hvdWxkQXR0YWNoT25seU9uZUluc3RhbmNlT2ZUaGVTYW1lTGlzdGVuZXJDbGFzc1BlclRlc3QoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShEZXJpdmVkMS5jbGFzcywgRGVyaXZlZDIuY2xhc3MpOworICAgIEJhc2VXaXRoTGlzdGVuZXIubV9jb3VudCA9IDA7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmFzZVdpdGhMaXN0ZW5lci5tX2NvdW50LCAyKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkBMaXN0ZW5lcnMgd2l0aCBhbiBJU3VpdGVMaXN0ZW5lciIpCisgIHB1YmxpYyB2b2lkIHN1aXRlTGlzdGVuZXJzU2hvdWxkV29yaygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFN1aXRlTGlzdGVuZXJTYW1wbGUuY2xhc3MpOworICAgIFN1aXRlTGlzdGVuZXIuc3RhcnQgPSAwOworICAgIFN1aXRlTGlzdGVuZXIuZmluaXNoID0gMDsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdWl0ZUxpc3RlbmVyLnN0YXJ0LCAxKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN1aXRlTGlzdGVuZXIuZmluaXNoLCAxKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkdJVEhVQi03Njc6IElTdWl0ZUxpc3RlbmVyIGNhbGxlZCB0d2ljZSB3aGVuIEBMaXN0ZW5lcnMiKQorICBwdWJsaWMgdm9pZCBzdWl0ZUxpc3RlbmVySW5MaXN0ZXJuZXJzQW5ub3RhdGlvblNob3VsZEJlUnVuT25jZSgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlVGVzdHMoIlN1aXRlIiwgU3VpdGVMaXN0ZW5lclNhbXBsZTIuY2xhc3MpOworICAgIFN1aXRlTGlzdGVuZXIyLnN0YXJ0ID0gMDsKKyAgICBTdWl0ZUxpc3RlbmVyMi5maW5pc2ggPSAwOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN1aXRlTGlzdGVuZXIyLnN0YXJ0LCAxKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN1aXRlTGlzdGVuZXIyLmZpbmlzaCwgMSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItMTcxIikKKyAgcHVibGljIHZvaWQgc3VpdGVMaXN0ZW5lcnNTaG91bGRCZU9ubHlSdW5PbmNlV2l0aE1hbnlUZXN0cygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlVGVzdHMoInN1aXRlIiwgRGVyaXZlZDEuY2xhc3MsIERlcml2ZWQyLmNsYXNzKTsKKyAgICBTdWl0ZUxpc3RlbmVyLnN0YXJ0ID0gMDsKKyAgICBTdWl0ZUxpc3RlbmVyLmZpbmlzaCA9IDA7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3VpdGVMaXN0ZW5lci5zdGFydCwgMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdWl0ZUxpc3RlbmVyLmZpbmlzaCwgMSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItNzk1IikKKyAgcHVibGljIHZvaWQgc3VpdGVMaXN0ZW5lcnNTaG91bGRCZU9ubHlSdW5PbmNlV2l0aE1hbnlJZGVudGljYWxUZXN0cygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlVGVzdHMoInN1aXRlIiwgRGVyaXZlZDEuY2xhc3MsIERlcml2ZWQxLmNsYXNzKTsKKyAgICBTdWl0ZUxpc3RlbmVyLnN0YXJ0ID0gMDsKKyAgICBTdWl0ZUxpc3RlbmVyLmZpbmlzaCA9IDA7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3VpdGVMaXN0ZW5lci5zdGFydCwgMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdWl0ZUxpc3RlbmVyLmZpbmlzaCwgMSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItMTY5IikKKyAgcHVibGljIHZvaWQgaW52b2tlZE1ldGhvZExpc3RlbmVyc1Nob3VsZEJlT25seVJ1bk9uY2VXaXRoTWFueVRlc3RzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGVUZXN0cygic3VpdGUiLCBEZXJpdmVkMS5jbGFzcywgRGVyaXZlZDIuY2xhc3MpOworICAgIE15SW52b2tlZE1ldGhvZExpc3RlbmVyLmJlZm9yZUludm9jYXRpb24uY2xlYXIoKTsKKyAgICBNeUludm9rZWRNZXRob2RMaXN0ZW5lci5hZnRlckludm9jYXRpb24uY2xlYXIoKTsKKyAgICB0bmcucnVuKCk7CisgICAgYXNzZXJ0VGhhdChNeUludm9rZWRNZXRob2RMaXN0ZW5lci5iZWZvcmVJbnZvY2F0aW9uKS5jb250YWluc09ubHkoCisgICAgICAgICAgICBlbnRyeSgidCIsIDEpLCBlbnRyeSgicyIsIDEpCisgICAgKTsKKyAgICBhc3NlcnRUaGF0KE15SW52b2tlZE1ldGhvZExpc3RlbmVyLmFmdGVySW52b2NhdGlvbikuY29udGFpbnNPbmx5KAorICAgICAgICAgICAgZW50cnkoInQiLCAxKSwgZW50cnkoInMiLCAxKQorICAgICk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItMTU0OiBNZXRob2RJbnRlcmNlcHRvciB3aWxsIGJlIGNhbGxlZCB0d2ljZSIpCisgIHB1YmxpYyB2b2lkIG1ldGhvZEludGVyY2VwdG9yU2hvdWxkQmVSdW5PbmNlKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU3VpdGVMaXN0ZW5lclNhbXBsZS5jbGFzcyk7CisgICAgTXlNZXRob2RJbnRlcmNlcHRvciBpbnRlcmNlcHRvciA9IG5ldyBNeU1ldGhvZEludGVyY2VwdG9yKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGludGVyY2VwdG9yKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbnRlcmNlcHRvci5nZXRDb3VudCgpLCAxKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkdJVEhVQi0zNTY6IEFkZCBsaXN0ZW5lcnMgZm9yIEBCZWZvcmVDbGFzcy9AQWZ0ZXJDbGFzcyIpCisgIHB1YmxpYyB2b2lkIGNsYXNzTGlzdGVuZXJTaG91bGRXb3JrKCkgeworICAgIE15Q2xhc3NMaXN0ZW5lci5iZWZvcmVOYW1lcy5jbGVhcigpOworICAgIE15Q2xhc3NMaXN0ZW5lci5hZnRlck5hbWVzLmNsZWFyKCk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShEZXJpdmVkMS5jbGFzcywgRGVyaXZlZDIuY2xhc3MpOworICAgIE15Q2xhc3NMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNeUNsYXNzTGlzdGVuZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnRUaGF0KE15Q2xhc3NMaXN0ZW5lci5iZWZvcmVOYW1lcykuY29udGFpbnNFeGFjdGx5KCJEZXJpdmVkMSIsICJEZXJpdmVkMiIpOworICAgIGFzc2VydFRoYXQoTXlDbGFzc0xpc3RlbmVyLmFmdGVyTmFtZXMpLmNvbnRhaW5zRXhhY3RseSgiRGVyaXZlZDEiLCAiRGVyaXZlZDIiKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkdJVEhVQi0zNTY6IEFkZCBsaXN0ZW5lcnMgZm9yIEBCZWZvcmVDbGFzcy9AQWZ0ZXJDbGFzcyIpCisgIHB1YmxpYyB2b2lkIGNsYXNzTGlzdGVuZXJTaG91bGRXb3JrRnJvbUFubm90YXRpb24oKSB7CisgICAgTXlDbGFzc0xpc3RlbmVyLmJlZm9yZU5hbWVzLmNsZWFyKCk7CisgICAgTXlDbGFzc0xpc3RlbmVyLmFmdGVyTmFtZXMuY2xlYXIoKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKENsYXNzTGlzdGVuZXJTYW1wbGUuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnRUaGF0KE15Q2xhc3NMaXN0ZW5lci5iZWZvcmVOYW1lcykuY29udGFpbnNFeGFjdGx5KCJDbGFzc0xpc3RlbmVyU2FtcGxlIik7CisgICAgYXNzZXJ0VGhhdChNeUNsYXNzTGlzdGVuZXIuYWZ0ZXJOYW1lcykuY29udGFpbnNFeGFjdGx5KCJDbGFzc0xpc3RlbmVyU2FtcGxlIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvTXlDbGFzc0xpc3RlbmVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL015Q2xhc3NMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjIzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL015Q2xhc3NMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklDbGFzc0xpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZEluc3RhbmNlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDbGFzczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNeUNsYXNzTGlzdGVuZXIgaW1wbGVtZW50cyBJQ2xhc3NMaXN0ZW5lciB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gYmVmb3JlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gYWZ0ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkJlZm9yZUNsYXNzKElUZXN0Q2xhc3MgdGVzdENsYXNzLCBJTWV0aG9kSW5zdGFuY2UgbWkpIHsKKyAgICBiZWZvcmVOYW1lcy5hZGQodGVzdENsYXNzLmdldFJlYWxDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25BZnRlckNsYXNzKElUZXN0Q2xhc3MgdGVzdENsYXNzLCBJTWV0aG9kSW5zdGFuY2UgbWkpIHsKKyAgICBhZnRlck5hbWVzLmFkZCh0ZXN0Q2xhc3MuZ2V0UmVhbENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9NeUludm9rZWRNZXRob2RMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9NeUludm9rZWRNZXRob2RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDE3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL015SW52b2tlZE1ldGhvZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSUludm9rZWRNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTXlJbnZva2VkTWV0aG9kTGlzdGVuZXIgaW1wbGVtZW50cyBJSW52b2tlZE1ldGhvZExpc3RlbmVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gYmVmb3JlSW52b2NhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGFmdGVySW52b2NhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYmVmb3JlSW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICAgICAgaW5jcmVtZW50cyhiZWZvcmVJbnZvY2F0aW9uLCBtZXRob2QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKyAgICAgICAgaW5jcmVtZW50cyhhZnRlckludm9jYXRpb24sIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbmNyZW1lbnRzKE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCwgSUludm9rZWRNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IG1ldGhvZC5nZXRUZXN0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICBJbnRlZ2VyIGNvdW50ID0gbWFwLmdldChzdHJpbmdWYWx1ZSk7CisgICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbWFwLnB1dChzdHJpbmdWYWx1ZSwgY291bnQrMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9NeU1ldGhvZEludGVyY2VwdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL015TWV0aG9kSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE4MDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9NeU1ldGhvZEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZEluc3RhbmNlOworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZEludGVyY2VwdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNeU1ldGhvZEludGVyY2VwdG9yIGltcGxlbWVudHMgSU1ldGhvZEludGVyY2VwdG9yIHsKKworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLCBJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb3VudCsrOworICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9PcmRlcmVkTGlzdGVuZXJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL09yZGVyZWRMaXN0ZW5lclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWQwNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9PcmRlcmVkTGlzdGVuZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworQExpc3RlbmVycyhTaW1wbGVMaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBPcmRlcmVkTGlzdGVuZXJTYW1wbGVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgU2ltcGxlTGlzdGVuZXIubV9saXN0LmFkZCgxKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYoKSB7CisgICAgU2ltcGxlTGlzdGVuZXIubV9saXN0LmFkZCgyKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCBhbSgpIHsKKyAgICBTaW1wbGVMaXN0ZW5lci5tX2xpc3QuYWRkKDQpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0Q29udGV4dExpc3RlbmVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1Jlc3VsdENvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjIxODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1Jlc3VsdENvbnRleHRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKKworcHVibGljIGNsYXNzIFJlc3VsdENvbnRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXN0TGlzdGVuZXIgeworCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250ZXh0UHJvdmlkZWQgPSBmYWxzZTsKKwkKKwlwdWJsaWMgdm9pZCBvblRlc3RTdGFydChJVGVzdFJlc3VsdCByZXN1bHQpIHsKKwkJSVRlc3RDb250ZXh0IGNvbnRleHQgPSByZXN1bHQuZ2V0VGVzdENvbnRleHQoKTsKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJY29udGV4dFByb3ZpZGVkID0gdHJ1ZTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisJfQorCisJcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBvblRlc3RTa2lwcGVkKElUZXN0UmVzdWx0IHJlc3VsdCkgeworCX0KKworCXB1YmxpYyB2b2lkIG9uVGVzdEZhaWxlZEJ1dFdpdGhpblN1Y2Nlc3NQZXJjZW50YWdlKElUZXN0UmVzdWx0IHJlc3VsdCkgeworCX0KKworCXB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgY29udGV4dCkgeworCX0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9SZXN1bHRDb250ZXh0TGlzdGVuZXJTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0Q29udGV4dExpc3RlbmVyU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjOTYzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0Q29udGV4dExpc3RlbmVyU2FtcGxlLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQExpc3RlbmVycyhSZXN1bHRDb250ZXh0TGlzdGVuZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmVzdWx0Q29udGV4dExpc3RlbmVyU2FtcGxlIHsKKwkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGYoKSB7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9SZXN1bHRDb250ZXh0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9SZXN1bHRDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1Jlc3VsdENvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXN1bHRDb250ZXh0VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKwkKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXN1bHRDb250ZXh0KCkgeworCQlUZXN0TkcgdG5nID0gY3JlYXRlKFJlc3VsdENvbnRleHRMaXN0ZW5lclNhbXBsZS5jbGFzcyk7CisJICAgIHRuZy5ydW4oKTsKKwkgICAgQXNzZXJ0LmFzc2VydFRydWUoUmVzdWx0Q29udGV4dExpc3RlbmVyLmNvbnRleHRQcm92aWRlZCwgCisJICAgIAkJIlRlc3QgY29udGV4dCB3YXMgbm90IHByb3ZpZGVkIHRvIHRoZSBsaXN0ZW5lciIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0RW5kTWlsbGlzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9SZXN1bHRFbmRNaWxsaXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2ODdlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0RW5kTWlsbGlzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworaW1wb3J0IHRlc3Quc2FtcGxlLlNhbXBsZTE7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworcHVibGljIGNsYXNzIFJlc3VsdEVuZE1pbGxpc1Rlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZW5kTWlsbGlzU2hvdWxkQmVOb25OdWxsKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU2FtcGxlMS5jbGFzcyk7CisgICAgdG5nLmFkZExpc3RlbmVyKG5ldyBSZXN1bHRMaXN0ZW5lcigpKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShSZXN1bHRMaXN0ZW5lci5tX2VuZCA+IDApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1Jlc3VsdExpc3RlbmVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1Jlc3VsdExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhOWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvUmVzdWx0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDczIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklSZXN1bHRMaXN0ZW5lcjI7CisKK3B1YmxpYyBjbGFzcyBSZXN1bHRMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXN1bHRMaXN0ZW5lcjIgeworCisgIHB1YmxpYyBzdGF0aWMgbG9uZyBtX2VuZCA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0KElUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNvbmZpZ3VyYXRpb24oSVRlc3RSZXN1bHQgdHIpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgIG1fZW5kID0gcmVzdWx0LmdldEVuZE1pbGxpcygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U2tpcHBlZChJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblN0YXJ0KElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25GaW5pc2goSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25TdWNjZXNzKElUZXN0UmVzdWx0IGl0cikgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkZhaWx1cmUoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU2tpcChJVGVzdFJlc3VsdCBpdHIpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TaW1wbGVMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TaW1wbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODZkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1NpbXBsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVMaXN0ZW5lciBleHRlbmRzIFRlc3RMaXN0ZW5lckFkYXB0ZXIgeworICBwdWJsaWMgc3RhdGljIExpc3Q8SW50ZWdlcj4gbV9saXN0OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbV9saXN0LmFkZCgzKTsKKyAgICBzdXBlci5vblRlc3RTdWNjZXNzKHRyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHRyKSB7CisgICAgbV9saXN0LmFkZCg1KTsKKyAgICBzdXBlci5vblRlc3RTdWNjZXNzKHRyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TdWl0ZUFuZENvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVBbmRDb25maWd1cmF0aW9uTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxMzBhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVBbmRDb25maWd1cmF0aW9uTGlzdGVuZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSB0ZXN0Lmxpc3RlbmVyczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0Lmxpc3RlbmVycy5TdWl0ZUFuZENvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QuTXlMaXN0ZW5lcjsKKworLyoqCisgKiBDaGVjayB0aGF0IGlmIGEgbGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkxpc3RlbmVyIGFkZGl0aW9uYWxseSB0bworICogSVN1aXRlTGlzdGVuZXIsIElTdWl0ZUxpc3RlbmVyIGdldHMgaW52b2tlZCBleGFjdGx5IG9uY2UuCisgKgorICogQGF1dGhvciBNaWhhaWxzIFZvbGtvdnMKKyAqLworQExpc3RlbmVycyhNeUxpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFN1aXRlQW5kQ29uZmlndXJhdGlvbkxpc3RlbmVyVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlMaXN0ZW5lciBpbXBsZW1lbnRzIElTdWl0ZUxpc3RlbmVyLCBJQ29uZmlndXJhdGlvbkxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEF0b21pY0ludGVnZXIgc3RhcnRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgcHVibGljIE15TGlzdGVuZXIoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydChJU3VpdGUgc3VpdGUpIHsKKyAgICAgIHN0YXJ0ZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2goSVN1aXRlIHN1aXRlKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU3VjY2VzcyhJVGVzdFJlc3VsdCBpdHIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25GYWlsdXJlKElUZXN0UmVzdWx0IGl0cikgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvblNraXAoSVRlc3RSZXN1bHQgaXRyKSB7CisgICAgfQorCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBib3RoTGlzdGVuZXJzU2hvdWxkUnVuKCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlMaXN0ZW5lci5zdGFydGVkLmdldCgpLCAxLCAiSVN1aXRlTGlzdGVuZXIgd2FzIG5vdCBpbnZva2VkIGV4YWN0bHkgb25jZToiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1N1aXRlQW5kSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TdWl0ZUFuZEludm9rZWRNZXRob2RMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2QxMjMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TdWl0ZUFuZEludm9rZWRNZXRob2RMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JSW52b2tlZE1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLklJbnZva2VkTWV0aG9kTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QubGlzdGVuZXJzLlN1aXRlQW5kSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdC5NeUxpc3RlbmVyOworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IGlmIGEgbGlzdGVuZXIgaW1wbGVtZW50cyBib3RoIElJbnZva2VkTWV0aG9kTGlzdGVuZXIKKyAqIGFuZCBJU3VpdGVMaXN0ZW5lciwgYm90aCBsaXN0ZW5lcnMgZ2V0IGludm9rZWQuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK0BMaXN0ZW5lcnMoTXlMaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdWl0ZUFuZEludm9rZWRNZXRob2RMaXN0ZW5lclRlc3QgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TGlzdGVuZXIgaW1wbGVtZW50cyBJSW52b2tlZE1ldGhvZExpc3RlbmVyLCBJU3VpdGVMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fYmVmb3JlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX3N0YXJ0ID0gZmFsc2U7CisKKyAgICBwdWJsaWMgTXlMaXN0ZW5lcigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICBtX2JlZm9yZSA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWZ0ZXJJbnZvY2F0aW9uKElJbnZva2VkTWV0aG9kIG1ldGhvZCwgSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydChJU3VpdGUgc3VpdGUpIHsKKyAgICAgIG1fc3RhcnQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElTdWl0ZSBzdWl0ZSkgeworICAgIH0KKworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYm90aExpc3RlbmVyc1Nob3VsZFJ1bigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShNeUxpc3RlbmVyLm1fYmVmb3JlLCAiSUludm9rZWRNZXRob2RMaXN0ZW5lciB3YXMgbm90IGludm9rZWQiKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShNeUxpc3RlbmVyLm1fc3RhcnQsICJJU3VpdGVMaXN0ZW5lciB3YXMgbm90IGludm9rZWQiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1N1aXRlTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmVkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1N1aXRlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFN1aXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJU3VpdGVMaXN0ZW5lciB7CisgIHB1YmxpYyBzdGF0aWMgaW50IHN0YXJ0ID0gMDsKKyAgcHVibGljIHN0YXRpYyBpbnQgZmluaXNoID0gMDsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25GaW5pc2goSVN1aXRlIHN1aXRlKSB7CisgICAgZmluaXNoKys7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TdGFydChJU3VpdGUgc3VpdGUpIHsKKyAgICBzdGFydCsrOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lcjIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM3Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TdWl0ZUxpc3RlbmVyMi5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLio7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JVGVzdEFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTdWl0ZUxpc3RlbmVyMiBpbXBsZW1lbnRzIElBbm5vdGF0aW9uVHJhbnNmb3JtZXIsIElJbnZva2VkTWV0aG9kTGlzdGVuZXIsIElUZXN0TGlzdGVuZXIsICBJU3VpdGVMaXN0ZW5lciwgSUV4ZWN1dGlvbkxpc3RlbmVyLCBJTWV0aG9kSW50ZXJjZXB0b3IgeworICAgIHB1YmxpYyBzdGF0aWMgaW50IHN0YXJ0ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGludCBmaW5pc2ggPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2goSVN1aXRlIHN1aXRlKSB7CisgICAgICAgIGZpbmlzaCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVN1aXRlIHN1aXRlKSB7CisgICAgICAgIHN0YXJ0Kys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYmVmb3JlSW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFmdGVySW52b2NhdGlvbihJSW52b2tlZE1ldGhvZCBtZXRob2QsIElUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShJVGVzdEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdGVzdENsYXNzLCBDb25zdHJ1Y3RvciB0ZXN0Q29uc3RydWN0b3IsIE1ldGhvZCB0ZXN0TWV0aG9kKSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV4ZWN1dGlvblN0YXJ0KCkgeworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FeGVjdXRpb25GaW5pc2goKSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGludGVyY2VwdChMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kcywgSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTdWNjZXNzKElUZXN0UmVzdWx0IHJlc3VsdCkgeworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1N1aXRlTGlzdGVuZXJTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lclNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGM3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbGlzdGVuZXJzL1N1aXRlTGlzdGVuZXJTYW1wbGUuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QubGlzdGVuZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitATGlzdGVuZXJzKFN1aXRlTGlzdGVuZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3VpdGVMaXN0ZW5lclNhbXBsZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZvbygpe30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lclNhbXBsZTIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9saXN0ZW5lcnMvU3VpdGVMaXN0ZW5lclNhbXBsZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGVlYjJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L2xpc3RlbmVycy9TdWl0ZUxpc3RlbmVyU2FtcGxlMi5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkxpc3RlbmVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BMaXN0ZW5lcnMoU3VpdGVMaXN0ZW5lcjIuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3VpdGVMaXN0ZW5lclNhbXBsZTIgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmb28oKXt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTUFubm90YXRpb24yU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01Bbm5vdGF0aW9uMlNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdjMjFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01Bbm5vdGF0aW9uMlNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSB0ZXN0Lm1hbm5vdGF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFubm90YXRpb25GaW5kZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBNQW5ub3RhdGlvbjJTYW1wbGVUZXN0IHsKKyAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbiBtX2NvbmZpZ3VyYXRpb24gPSBuZXcgb3JnLnRlc3RuZy5pbnRlcm5hbC5Db25maWd1cmF0aW9uKCk7CisgIHByaXZhdGUgSUFubm90YXRpb25GaW5kZXIgbV9maW5kZXI7CisKKyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdENsYXNzID0gdHJ1ZSwgZW5hYmxlZCA9IHRydWUsIGdyb3Vwcz0iY3VycmVudCIpCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9maW5kZXIgPSBtX2NvbmZpZ3VyYXRpb24uZ2V0QW5ub3RhdGlvbkZpbmRlcigpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdEdyb3Vwc0luaGVyaXRhbmNlKCkKKyAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0My5jbGFzcy5nZXRNZXRob2QoImdyb3VwczEiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3QxID0gKElUZXN0QW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIobmV3IFN0cmluZ1tdIHsgIm1ldGhvZC10ZXN0MyIsICJjaGlsZC1jbGFzcy10ZXN0MyIsICJiYXNlLWNsYXNzIiB9LAorICAgICAgICAgIHRlc3QxLmdldEdyb3VwcygpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QzLmNsYXNzLmdldE1ldGhvZCgiZ3JvdXBzMiIsIG5ldyBDbGFzc1swXSk7CisgICAgICBJVGVzdEFubm90YXRpb24gdGVzdDEgPSAoSVRlc3RBbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcihuZXcgU3RyaW5nW10geyAiY2hpbGQtY2xhc3MtdGVzdDMiLCAiYmFzZS1jbGFzcyIgfSwKKyAgICAgICAgICB0ZXN0MS5nZXRHcm91cHMoKSk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdERlcGVuZHNPbkdyb3Vwc0luaGVyaXRhbmNlKCkKKyAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0My5jbGFzcy5nZXRNZXRob2QoImRlcGVuZHNPbkdyb3VwczEiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3QxID0gKElUZXN0QW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIobmV3IFN0cmluZ1tdIHsgImRvZzIiLCAiZG9nMSIsICJkb2czIiB9LAorICAgICAgICAgIHRlc3QxLmdldERlcGVuZHNPbkdyb3VwcygpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QzLmNsYXNzLmdldE1ldGhvZCgiZGVwZW5kc09uR3JvdXBzMiIsIG5ldyBDbGFzc1swXSk7CisgICAgICBJVGVzdEFubm90YXRpb24gdGVzdDEgPSAoSVRlc3RBbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcihuZXcgU3RyaW5nW10geyAiZG9nMSIsICJkb2czIiB9LAorICAgICAgICAgIHRlc3QxLmdldERlcGVuZHNPbkdyb3VwcygpKTsKKyAgICB9CisKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeVRlc3REZXBlbmRzT25NZXRob2RzSW5oZXJpdGFuY2UoKQorICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICB7CisgICAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QzLmNsYXNzLmdldE1ldGhvZCgiZGVwZW5kc09uTWV0aG9kczEiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3QxID0gKElUZXN0QW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIobmV3IFN0cmluZ1tdIHsgImRvbTIiLCAiZG9tMyIsICJkb20xIiB9LAorICAgICAgICAgIHRlc3QxLmdldERlcGVuZHNPbk1ldGhvZHMoKSk7CisgICAgfQorCisgICAgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0My5jbGFzcy5nZXRNZXRob2QoImRlcGVuZHNPbk1ldGhvZHMyIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0MSA9IChJVGVzdEFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKG5ldyBTdHJpbmdbXSB7ICJkb20xIiwgImRvbTMiIH0sCisgICAgICAgICAgdGVzdDEuZ2V0RGVwZW5kc09uTWV0aG9kcygpKTsKKyAgICB9CisKKyAgfQorCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5Q29uZmlndXJhdGlvbkdyb3Vwc0luaGVyaXRhbmNlKCkKKyAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0My5jbGFzcy5nZXRNZXRob2QoImJlZm9yZVN1aXRlIiwgbmV3IENsYXNzWzBdKTsKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gdGVzdDEgPSAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIobmV3IFN0cmluZ1tdIHsgIm1ldGhvZC10ZXN0MyIsICJjaGlsZC1jbGFzcy10ZXN0MyIsICJiYXNlLWNsYXNzIiB9LAorICAgICAgICB0ZXN0MS5nZXRHcm91cHMoKSk7CisgIH0KKworICBAVGVzdChncm91cHM9ImN1cnJlbnQiKQorICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXN0RW5hYmxlZEluaGVyaXRhbmNlKCkKKyAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0My5jbGFzcy5nZXRNZXRob2QoImVuYWJsZWQxIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0MSA9IChJVGVzdEFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0ZXN0MS5nZXRFbmFibGVkKCkpOworICAgIH0KKworICAgIHsKKyAgICAgIE1ldGhvZCBtZXRob2QgPSBNVGVzdDMuY2xhc3MuZ2V0TWV0aG9kKCJlbmFibGVkMiIsIG5ldyBDbGFzc1swXSk7CisgICAgICBJVGVzdEFubm90YXRpb24gdGVzdDEgPSAoSVRlc3RBbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0MS5nZXRFbmFibGVkKCkpOworICAgIH0KKworICB9CisKKy8vICBAVGVzdChncm91cHMgPSAiY3VycmVudCIpCisvLyAgcHVibGljIHZvaWQgdmVyaWZ5Q2FwdHVyZSgpCisvLyAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorLy8gIHsKKy8vICAgIHsKKy8vICAgICAgTWV0aG9kIG1ldGhvZCA9IE1DaGlsZENhcHR1cmVUZXN0LmNsYXNzLmdldE1ldGhvZCgic2hvdWxkQmVsb25nVG9Hcm91cENoaWxkIiwgbmV3IENsYXNzWzBdKTsKKy8vICAgICAgSVRlc3QgdGVzdDEgPSAoSVRlc3QpIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSVRlc3QuY2xhc3MpOworLy8gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcihuZXcgU3RyaW5nW10geyAiY2hpbGQiIH0sCisvLyAgICAgICAgICB0ZXN0MS5nZXRHcm91cHMoKSk7CisvLyAgICB9CisvLyAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQW5ub3RhdGlvblNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQW5ub3RhdGlvblNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01Bbm5vdGF0aW9uU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACitwYWNrYWdlIHRlc3QubWFubm90YXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JQ29uZmlndXJhdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5JRGF0YVByb3ZpZGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLklFeHBlY3RlZEV4Y2VwdGlvbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSUZhY3RvcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVBhcmFtZXRlcnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLklDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSUFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkZpbmRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLmFubm90YXRpb25zLklCZWZvcmVTdWl0ZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworQFRlc3QoZW5hYmxlZCA9IHRydWUpCitwdWJsaWMgY2xhc3MgTUFubm90YXRpb25TYW1wbGVUZXN0IHsKKyAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbiBtX2NvbmZpZ3VyYXRpb24gPSBuZXcgb3JnLnRlc3RuZy5pbnRlcm5hbC5Db25maWd1cmF0aW9uKCk7CisgIHByaXZhdGUgSUFubm90YXRpb25GaW5kZXIgbV9maW5kZXI7CisKKyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdENsYXNzID0gdHJ1ZSwgZW5hYmxlZCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgbV9maW5kZXIgPSBtX2NvbmZpZ3VyYXRpb24uZ2V0QW5ub3RhdGlvbkZpbmRlcigpOworICB9CisKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdENsYXNzTGV2ZWwoKSB7CisgICAgLy8KKyAgICAvLyBUZXN0cyBvbiBNVGVzdDFTYW1wbGVUZXN0CisgICAgLy8KKyAgICBJVGVzdEFubm90YXRpb24gdGVzdDEgPSAoSVRlc3RBbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihNVGVzdDEuY2xhc3MsIElUZXN0QW5ub3RhdGlvbi5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdDEuZ2V0RW5hYmxlZCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QxLmdldEdyb3VwcygpLCBuZXcgU3RyaW5nW10geyAiZ3JvdXAxIiwgImdyb3VwMiIgfSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdDEuZ2V0QWx3YXlzUnVuKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0UGFyYW1ldGVycygpLCBuZXcgU3RyaW5nW10geyAicGFyYW0xIiwgInBhcmFtMiIgfSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIodGVzdDEuZ2V0RGVwZW5kc09uR3JvdXBzKCksIG5ldyBTdHJpbmdbXSB7ICJkZzEiLCAiZGcyIiB9LCAgImRlcGVuZHMgb24gZ3JvdXBzIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoIHRlc3QxLmdldERlcGVuZHNPbk1ldGhvZHMoKSwgbmV3IFN0cmluZ1tdIHsgImRtMSIsICJkbTIiIH0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0VGltZU91dCgpLCA0Mik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXRJbnZvY2F0aW9uQ291bnQoKSwgNDMpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKSwgNDQpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0VGhyZWFkUG9vbFNpemUoKSwgMyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXREYXRhUHJvdmlkZXIoKSwgImRwIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXREZXNjcmlwdGlvbigpLCAiQ2xhc3MgbGV2ZWwgZGVzY3JpcHRpb24iKTsKKworICAgIC8vCisgICAgLy8gVGVzdHMgb24gTVRlc3QxU2FtcGxlVGVzdCAodGVzdCBkZWZhdWx0cykKKyAgICAvLworICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0MiA9IChJVGVzdEFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKE1UZXN0Mi5jbGFzcywgSVRlc3RBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICAvLyB0ZXN0IGRlZmF1bHQgZm9yIGVuYWJsZWQKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0Mi5nZXRFbmFibGVkKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZSh0ZXN0Mi5nZXRBbHdheXNSdW4oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0Mi5nZXRUaW1lT3V0KCksIDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDIuZ2V0SW52b2NhdGlvbkNvdW50KCksIDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDIuZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKSwgMTAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QyLmdldERhdGFQcm92aWRlcigpLCAiIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB2ZXJpZnlUZXN0TWV0aG9kTGV2ZWwoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgLy8KKyAgICAvLyBUZXN0cyBvbiBNVGVzdDFTYW1wbGVUZXN0CisgICAgLy8KKyAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QxLmNsYXNzLmdldE1ldGhvZCgiZiIsIG5ldyBDbGFzc1swXSk7CisgICAgSVRlc3RBbm5vdGF0aW9uIHRlc3QxID0gKElUZXN0QW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QxLmdldEVuYWJsZWQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIodGVzdDEuZ2V0R3JvdXBzKCksIG5ldyBTdHJpbmdbXSB7ICJncm91cDEiLCAiZ3JvdXAzIiwgImdyb3VwNCIsICJncm91cDIiIH0pOworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QxLmdldEFsd2F5c1J1bigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QxLmdldFBhcmFtZXRlcnMoKSwgbmV3IFN0cmluZ1tdIHsgInBhcmFtMyIsICJwYXJhbTQiIH0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKHRlc3QxLmdldERlcGVuZHNPbkdyb3VwcygpLCBuZXcgU3RyaW5nW10geyAiZGcxIiwgImRnMiIsICJkZzMiLCAiZGc0IiB9KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcih0ZXN0MS5nZXREZXBlbmRzT25NZXRob2RzKCksIG5ldyBTdHJpbmdbXSB7ICJkbTEiLCAiZG0yIiwgImRtMyIsICJkbTQiIH0pOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0VGltZU91dCgpLCAxNDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0SW52b2NhdGlvbkNvdW50KCksIDE0Myk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXRTdWNjZXNzUGVyY2VudGFnZSgpLCA2MSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXREYXRhUHJvdmlkZXIoKSwgImRwMiIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0RGVzY3JpcHRpb24oKSwgIk1ldGhvZCBkZXNjcmlwdGlvbiIpOworICAgIENsYXNzW10gZXhjZXB0aW9ucyA9IHRlc3QxLmdldEV4cGVjdGVkRXhjZXB0aW9ucygpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhjZXB0aW9ucy5sZW5ndGgsIDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhjZXB0aW9uc1swXSwgTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpOworICB9CisKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdENvbnN0cnVjdG9yTGV2ZWwoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgLy8KKyAgICAvLyBUZXN0cyBvbiBNVGVzdDFTYW1wbGVUZXN0CisgICAgLy8KKyAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IE1UZXN0MS5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbMF0pOworICAgIElUZXN0QW5ub3RhdGlvbiB0ZXN0MSA9IChJVGVzdEFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKGNvbnN0cnVjdG9yLCBJVGVzdEFubm90YXRpb24uY2xhc3MpOworICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRlc3QxKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0MS5nZXRFbmFibGVkKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKHRlc3QxLmdldEdyb3VwcygpLCBuZXcgU3RyaW5nW10geyAiZ3JvdXA1IiwgImdyb3VwMSIsICJncm91cDYiLCAiZ3JvdXAyIiB9KTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0MS5nZXRBbHdheXNSdW4oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0ZXN0MS5nZXRQYXJhbWV0ZXJzKCksIG5ldyBTdHJpbmdbXSB7ICJwYXJhbTUiLCAicGFyYW02IiB9KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzTm9PcmRlcih0ZXN0MS5nZXREZXBlbmRzT25Hcm91cHMoKSwgbmV3IFN0cmluZ1tdIHsgImRnMSIsICJkZzIiLCAiZGc1IiwgImRnNiIgfSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIodGVzdDEuZ2V0RGVwZW5kc09uTWV0aG9kcygpLCBuZXcgU3RyaW5nW10geyAiZG0xIiwgImRtMiIsICJkbTUiLCAiZG02IiB9KTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QxLmdldFRpbWVPdXQoKSwgMjQyKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QxLmdldEludm9jYXRpb25Db3VudCgpLCAyNDMpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0U3VjY2Vzc1BlcmNlbnRhZ2UoKSwgNjIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdDEuZ2V0RGF0YVByb3ZpZGVyKCksICJkcDMiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QxLmdldERlc2NyaXB0aW9uKCksICJDb25zdHJ1Y3RvciBkZXNjcmlwdGlvbiIpOworICAgIENsYXNzW10gZXhjZXB0aW9ucyA9IHRlc3QxLmdldEV4cGVjdGVkRXhjZXB0aW9ucygpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhjZXB0aW9ucy5sZW5ndGgsIDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhjZXB0aW9uc1swXSwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeUNvbmZpZ3VyYXRpb25CZWZvcmUoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0MS5jbGFzcy5nZXRNZXRob2QoImJlZm9yZSIsIG5ldyBDbGFzc1swXSk7CisgICAgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb24gPQorICAgICAgKElDb25maWd1cmF0aW9uQW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJQ29uZmlndXJhdGlvbkFubm90YXRpb24uY2xhc3MpOworICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbmZpZ3VyYXRpb24pOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlU3VpdGUoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRCZWZvcmVUZXN0TWV0aG9kKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlVGVzdCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmF0aW9uLmdldEJlZm9yZVRlc3RDbGFzcygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRBZnRlclN1aXRlKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEFmdGVyVGVzdE1ldGhvZCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRBZnRlclRlc3QoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJUZXN0Q2xhc3MoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjb25maWd1cmF0aW9uLmdldEFmdGVyR3JvdXBzKCkubGVuZ3RoKTsKKyAgICBTdHJpbmdbXSBiZyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlR3JvdXBzKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhiZy5sZW5ndGgsIDIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHNOb09yZGVyKGJnLCBuZXcgU3RyaW5nW10geyJiMSIsICJiMiJ9KTsKKworICAgIC8vIERlZmF1bHQgdmFsdWVzCisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRFbmFibGVkKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0SW5oZXJpdEdyb3VwcygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRBbHdheXNSdW4oKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2ZXJpZnlDb25maWd1cmF0aW9uQWZ0ZXIoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0MS5jbGFzcy5nZXRNZXRob2QoImFmdGVyIiwgbmV3IENsYXNzWzBdKTsKKyAgICBJQ29uZmlndXJhdGlvbkFubm90YXRpb24gY29uZmlndXJhdGlvbiA9CisgICAgICAoSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uKSBtX2ZpbmRlci5maW5kQW5ub3RhdGlvbihtZXRob2QsIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29uZmlndXJhdGlvbik7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlU3VpdGUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlVGVzdE1ldGhvZCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRCZWZvcmVUZXN0KCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEJlZm9yZVRlc3RDbGFzcygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmF0aW9uLmdldEFmdGVyU3VpdGUoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRBZnRlclRlc3RNZXRob2QoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRBZnRlclRlc3QoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRBZnRlclRlc3RDbGFzcygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlR3JvdXBzKCkubGVuZ3RoKTsKKyAgICBTdHJpbmdbXSBhZyA9IGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJHcm91cHMoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFnLmxlbmd0aCwgMik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoYWcsIG5ldyBTdHJpbmdbXSB7ImExIiwgImEyIn0pOworCisgICAgLy8gRGVmYXVsdCB2YWx1ZXMKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmF0aW9uLmdldEVuYWJsZWQoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRJbmhlcml0R3JvdXBzKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEFsd2F5c1J1bigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeUNvbmZpZ3VyYXRpb25PdGhlcnMoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0MS5jbGFzcy5nZXRNZXRob2QoIm90aGVyQ29uZmlndXJhdGlvbnMiLCBuZXcgQ2xhc3NbMF0pOworICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uID0KKyAgICAgIChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUNvbmZpZ3VyYXRpb25Bbm5vdGF0aW9uLmNsYXNzKTsKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0aW9uKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRCZWZvcmVTdWl0ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRCZWZvcmVUZXN0TWV0aG9kKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEJlZm9yZVRlc3QoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZ3VyYXRpb24uZ2V0QmVmb3JlVGVzdENsYXNzKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEFmdGVyU3VpdGUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJUZXN0TWV0aG9kKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEFmdGVyVGVzdCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRBZnRlclRlc3RDbGFzcygpKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEVuYWJsZWQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcnMoKSwgbmV3IFN0cmluZ1tdIHsgIm9wYXJhbTEiLCAib3BhcmFtMiIgfSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoY29uZmlndXJhdGlvbi5nZXRHcm91cHMoKSwgbmV3IFN0cmluZ1tdIHsgImdyb3VwMSIsICJvZ3JvdXAxIiwgIm9ncm91cDIiLCAiZ3JvdXAyIiB9LCAiZ3JvdXBzIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoY29uZmlndXJhdGlvbi5nZXREZXBlbmRzT25Hcm91cHMoKSwgbmV3IFN0cmluZ1tdIHsgIm9kZzEiLCAib2RnMiIgfSwgImRlcGVuZHMgb24gZ3JvdXBzIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXIoY29uZmlndXJhdGlvbi5nZXREZXBlbmRzT25NZXRob2RzKCksIG5ldyBTdHJpbmdbXSB7ICJvZG0xIiwgIm9kbTIiIH0sICJkZXBlbmRzIG9uIG1ldGhvZHMiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRJbmhlcml0R3JvdXBzKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0QWx3YXlzUnVuKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvbigpLCAiYmVmb3JlU3VpdGUgZGVzY3JpcHRpb24iKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeURhdGFQcm92aWRlcigpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QxLmNsYXNzLmdldE1ldGhvZCgib3RoZXJDb25maWd1cmF0aW9ucyIsIG5ldyBDbGFzc1swXSk7CisgICAgSURhdGFQcm92aWRlckFubm90YXRpb24gZGF0YVByb3ZpZGVyID0KKyAgICAgIChJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJRGF0YVByb3ZpZGVyQW5ub3RhdGlvbi5jbGFzcyk7CisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGF0YVByb3ZpZGVyKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRhdGFQcm92aWRlci5nZXROYW1lKCksICJkcDQiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeUV4cGVjdGVkRXhjZXB0aW9ucygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QxLmNsYXNzLmdldE1ldGhvZCgib3RoZXJDb25maWd1cmF0aW9ucyIsIG5ldyBDbGFzc1swXSk7CisgICAgSUV4cGVjdGVkRXhjZXB0aW9uc0Fubm90YXRpb24gZXhjZXB0aW9ucz0KKyAgICAgIChJRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJRXhwZWN0ZWRFeGNlcHRpb25zQW5ub3RhdGlvbi5jbGFzcyk7CisKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChleGNlcHRpb25zKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4Y2VwdGlvbnMuZ2V0VmFsdWUoKSwgbmV3IENsYXNzW10geyBNVGVzdDEuY2xhc3MsIE1UZXN0Mi5jbGFzcyB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeUZhY3RvcnkoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICB7CisgICAgTWV0aG9kIG1ldGhvZCA9IE1UZXN0MS5jbGFzcy5nZXRNZXRob2QoImZhY3RvcnkiLCBuZXcgQ2xhc3NbMF0pOworICAgIElGYWN0b3J5QW5ub3RhdGlvbiBmYWN0b3J5PQorICAgICAgKElGYWN0b3J5QW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJRmFjdG9yeUFubm90YXRpb24uY2xhc3MpOworCisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZmFjdG9yeSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWN0b3J5LmdldFBhcmFtZXRlcnMoKSwgbmV3IFN0cmluZ1tdIHsgInBmMSIsICJwZjIiIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgdmVyaWZ5UGFyYW1ldGVycygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QxLmNsYXNzLmdldE1ldGhvZCgicGFyYW1ldGVycyIsIG5ldyBDbGFzc1swXSk7CisgICAgSVBhcmFtZXRlcnNBbm5vdGF0aW9uIHBhcmFtZXRlcnMgPQorICAgICAgKElQYXJhbWV0ZXJzQW5ub3RhdGlvbikgbV9maW5kZXIuZmluZEFubm90YXRpb24obWV0aG9kLCBJUGFyYW1ldGVyc0Fubm90YXRpb24uY2xhc3MpOworCisgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocGFyYW1ldGVycyk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwYXJhbWV0ZXJzLmdldFZhbHVlKCksIG5ldyBTdHJpbmdbXSB7ICJwcDEiLCAicHAyIiwgInBwMyIgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2ZXJpZnlOZXdDb25maWd1cmF0aW9uQmVmb3JlKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24KKyAgeworICAgIE1ldGhvZCBtZXRob2QgPSBNVGVzdDEuY2xhc3MuZ2V0TWV0aG9kKCJuZXdCZWZvcmUiLCBuZXcgQ2xhc3NbMF0pOworICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uID0KKyAgICAgIChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUJlZm9yZVN1aXRlLmNsYXNzKTsKKyAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0aW9uKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmF0aW9uLmdldEJlZm9yZVN1aXRlKCkpOworCisgICAgLy8gRGVmYXVsdCB2YWx1ZXMKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmF0aW9uLmdldEVuYWJsZWQoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRJbmhlcml0R3JvdXBzKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWd1cmF0aW9uLmdldEFsd2F5c1J1bigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZlcmlmeU5ld0NvbmZpZ3VyYXRpb25BZnRlcigpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgIHsKKyAgICBNZXRob2QgbWV0aG9kID0gTVRlc3QxLmNsYXNzLmdldE1ldGhvZCgibmV3QWZ0ZXIiLCBuZXcgQ2xhc3NbMF0pOworICAgIElDb25maWd1cmF0aW9uQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uID0KKyAgICAgIChJQ29uZmlndXJhdGlvbkFubm90YXRpb24pIG1fZmluZGVyLmZpbmRBbm5vdGF0aW9uKG1ldGhvZCwgSUFmdGVyU3VpdGUuY2xhc3MpOworICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbmZpZ3VyYXRpb24pOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0QWZ0ZXJTdWl0ZSgpKTsKKworICAgIC8vIERlZmF1bHQgdmFsdWVzCisgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlndXJhdGlvbi5nZXRFbmFibGVkKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZ3VyYXRpb24uZ2V0SW5oZXJpdEdyb3VwcygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlndXJhdGlvbi5nZXRBbHdheXNSdW4oKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW01Bbm5vdGF0aW9uU2FtcGxlVGVzdF0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTUJhc2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmYzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTUJhc2UuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QubWFubm90YXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGdyb3VwcyA9ICJiYXNlLWNsYXNzIiwgZGVwZW5kc09uR3JvdXBzPSJkb2czIiwgZGVwZW5kc09uTWV0aG9kcz0iZG9tMyIsCisgICAgZW5hYmxlZD10cnVlKQorcHVibGljIGNsYXNzIE1CYXNlIHsKKworICBwdWJsaWMgdm9pZCBiYXNlVGVzdCgpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQmFzZUNhcHR1cmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQmFzZUNhcHR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I4NWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01CYXNlQ2FwdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5tYW5ub3RhdGlvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBNYWtlIHN1cmUgdGhhdCBpZiBhIG1ldGhvZCBpcyBkZWNsYXJlZCBpbiB0aGUgYmFzZSBjbGFzcyBhbmQgYSBjaGlsZCBjbGFzcworICogYWRkcyBhIGNsYXNzLXNjb3BlZCBncm91cCB0byBpdCwgdGhhdCBtZXRob2QgcmVjZWl2ZXMgaXQgYXMgd2VsbC4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICogQGRhdGUgTWFyIDIyLCAyMDA2CisgKi8KK3B1YmxpYyBjbGFzcyBNQmFzZUNhcHR1cmUgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZEJlbG9uZ1RvR3JvdXBDaGlsZCgpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTUNoaWxkQ2FwdHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NQ2hpbGRDYXB0dXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTUNoaWxkQ2FwdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QubWFubm90YXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGdyb3VwcyA9ICJjaGlsZCIpCitwdWJsaWMgY2xhc3MgTUNoaWxkQ2FwdHVyZVRlc3QgZXh0ZW5kcyBNQmFzZUNhcHR1cmUgeworCisgIHB1YmxpYyB2b2lkIGYoKSB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01UZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01UZXN0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjhiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTVRlc3QxLmphdmEKQEAgLTAsMCArMSw4NCBAQAorcGFja2FnZSB0ZXN0Lm1hbm5vdGF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5FeHBlY3RlZEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KGVuYWJsZWQgPSB0cnVlLCBncm91cHMgPSB7Imdyb3VwMSIsICJncm91cDIifSwKKyAgICBhbHdheXNSdW4gPSB0cnVlLCBwYXJhbWV0ZXJzID0geyJwYXJhbTEiLCAicGFyYW0yIn0sCisgICAgZGVwZW5kc09uR3JvdXBzID0geyJkZzEiLCAiZGcyIn0sIGRlcGVuZHNPbk1ldGhvZHMgPSB7ImRtMSIsICJkbTIifSwKKyAgICB0aW1lT3V0ID0gNDIsIGludm9jYXRpb25Db3VudCA9IDQzLCBzdWNjZXNzUGVyY2VudGFnZSA9IDQ0LAorICAgIHRocmVhZFBvb2xTaXplID0gMywKKyAgICBkYXRhUHJvdmlkZXIgPSAiZHAiLCBkZXNjcmlwdGlvbiA9ICJDbGFzcyBsZXZlbCBkZXNjcmlwdGlvbiIpCitwdWJsaWMgY2xhc3MgTVRlc3QxIHsKKworICBAVGVzdChlbmFibGVkID0gdHJ1ZSwgZ3JvdXBzID0geyJncm91cDUiLCAiZ3JvdXA2In0sCisgICAgICBhbHdheXNSdW4gPSB0cnVlLCBwYXJhbWV0ZXJzID0geyJwYXJhbTUiLCAicGFyYW02In0sCisgICAgICBkZXBlbmRzT25Hcm91cHMgPSB7ImRnNSIsICJkZzYifSwgZGVwZW5kc09uTWV0aG9kcyA9IHsiZG01IiwgImRtNiJ9LAorICAgICAgdGltZU91dCA9IDI0MiwgaW52b2NhdGlvbkNvdW50ID0gMjQzLCBzdWNjZXNzUGVyY2VudGFnZSA9IDYyLAorICAgICAgZGF0YVByb3ZpZGVyID0gImRwMyIsIGRlc2NyaXB0aW9uID0gIkNvbnN0cnVjdG9yIGRlc2NyaXB0aW9uIiwKKyAgICAgIGV4cGVjdGVkRXhjZXB0aW9ucyA9IE51bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIE1UZXN0MSgpIHt9CisKKyAgQFRlc3QoZW5hYmxlZCA9IHRydWUsIGdyb3VwcyA9IHsiZ3JvdXAzIiwgImdyb3VwNCJ9LAorICAgICAgYWx3YXlzUnVuID0gdHJ1ZSwgcGFyYW1ldGVycyA9IHsicGFyYW0zIiwgInBhcmFtNCJ9LAorICAgICAgZGVwZW5kc09uR3JvdXBzID0geyJkZzMiLCAiZGc0In0sIGRlcGVuZHNPbk1ldGhvZHMgPSB7ImRtMyIsICJkbTQifSwKKyAgICAgIHRpbWVPdXQgPSAxNDIsIGludm9jYXRpb25Db3VudCA9IDE0Mywgc3VjY2Vzc1BlcmNlbnRhZ2UgPSA2MSwKKyAgICAgIGRhdGFQcm92aWRlciA9ICJkcDIiLCBkZXNjcmlwdGlvbiA9ICJNZXRob2QgZGVzY3JpcHRpb24iLAorICAgICAgZXhwZWN0ZWRFeGNlcHRpb25zID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIGYoKSB7fQorCisgIEBDb25maWd1cmF0aW9uKGJlZm9yZVN1aXRlID0gdHJ1ZSwgYmVmb3JlVGVzdE1ldGhvZCA9IHRydWUsCisgICAgICBiZWZvcmVUZXN0ID0gdHJ1ZSwgYmVmb3JlVGVzdENsYXNzID0gdHJ1ZSwKKyAgICAgIGJlZm9yZUdyb3VwcyA9IHsgImIxIiwgImIyIn0pCisgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHt9CisKKyAgQENvbmZpZ3VyYXRpb24oYWZ0ZXJTdWl0ZSA9IHRydWUsIGFmdGVyVGVzdE1ldGhvZCA9IHRydWUsCisgICAgICBhZnRlclRlc3QgPSB0cnVlLCBhZnRlclRlc3RDbGFzcyA9IHRydWUsCisgICAgICBhZnRlckdyb3VwcyA9IHsiYTEiLCAiYTIifSkKKyAgcHVibGljIHZvaWQgYWZ0ZXIoKSB7fQorCisgIEBDb25maWd1cmF0aW9uKHBhcmFtZXRlcnMgPSB7Im9wYXJhbTEiLCAib3BhcmFtMiJ9LAorICAgICAgZW5hYmxlZCA9IGZhbHNlLCBncm91cHMgPSB7Im9ncm91cDEiLCAib2dyb3VwMiJ9LAorICAgICAgZGVwZW5kc09uR3JvdXBzID0geyJvZGcxIiwib2RnMiJ9LAorICAgICAgZGVwZW5kc09uTWV0aG9kcyA9IHsib2RtMSIsICJvZG0yIn0sIGFsd2F5c1J1biA9IHRydWUsCisgICAgICBpbmhlcml0R3JvdXBzID0gZmFsc2UsCisgICAgICBkZXNjcmlwdGlvbiA9ICJiZWZvcmVTdWl0ZSBkZXNjcmlwdGlvbiIpCisgICBARGF0YVByb3ZpZGVyKG5hbWUgPSAiZHA0IikKKyAgIEBFeHBlY3RlZEV4Y2VwdGlvbnMoe01UZXN0MS5jbGFzcywgTVRlc3QyLmNsYXNzIH0pCisgIHB1YmxpYyB2b2lkIG90aGVyQ29uZmlndXJhdGlvbnMoKSB7fQorCisgIEBGYWN0b3J5KHBhcmFtZXRlcnMgPSB7InBmMSIsICJwZjIifSkKKyAgcHVibGljIHZvaWQgZmFjdG9yeSgpIHt9CisKKyAgQFBhcmFtZXRlcnMoeyJwcDEiLCAicHAyIiwgInBwMyJ9KQorICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJzKCkge30KKworICBAQmVmb3JlU3VpdGUKKyAgQEJlZm9yZVRlc3QKKyAgQEJlZm9yZUdyb3VwcworICBAQmVmb3JlQ2xhc3MKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBuZXdCZWZvcmUoKSB7fQorCisgIEBBZnRlclN1aXRlCisgIEBBZnRlclRlc3QKKyAgQEFmdGVyR3JvdXBzCisgIEBBZnRlckNsYXNzCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCBuZXdBZnRlcigpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NVGVzdDIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdiOWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21hbm5vdGF0aW9uL01UZXN0Mi5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lm1hbm5vdGF0aW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChhbHdheXNSdW4gPSBmYWxzZSkKK3B1YmxpYyBjbGFzcyBNVGVzdDIgeworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTVRlc3QzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWFubm90YXRpb24vTVRlc3QzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNTBjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tYW5ub3RhdGlvbi9NVGVzdDMuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3QubWFubm90YXRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHMgPSAiY2hpbGQtY2xhc3MtdGVzdDMiLCBkZXBlbmRzT25Hcm91cHMgPSAiZG9nMSIsIGRlcGVuZHNPbk1ldGhvZHMgPSAiZG9tMSIpCitwdWJsaWMgY2xhc3MgTVRlc3QzIGV4dGVuZHMgTUJhc2UgeworCisgIEBUZXN0KGdyb3VwcyA9ICJtZXRob2QtdGVzdDMiKQorICBwdWJsaWMgdm9pZCBncm91cHMxKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBncm91cHMyKCkge30KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSAiZG9nMiIpCisgIHB1YmxpYyB2b2lkIGRlcGVuZHNPbkdyb3VwczEoKSB7fQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGRlcGVuZHNPbkdyb3VwczIoKSB7fQorCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAiZG9tMiIpCisgIHB1YmxpYyB2b2lkIGRlcGVuZHNPbk1ldGhvZHMxKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBkZXBlbmRzT25NZXRob2RzMigpIHt9CisKKyAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBlbmFibGVkMSgpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZW5hYmxlZDIoKSB7fQorCisgIEBDb25maWd1cmF0aW9uKGJlZm9yZVN1aXRlID0gdHJ1ZSwgZ3JvdXBzID0gIm1ldGhvZC10ZXN0MyIpCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlKCkgeworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvRmFzdFRlc3RzRmlyc3RJbnRlcmNlcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9GYXN0VGVzdHNGaXJzdEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkNTE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvRmFzdFRlc3RzRmlyc3RJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RpbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBGYXN0VGVzdHNGaXJzdEludGVyY2VwdG9yIGltcGxlbWVudHMgSU1ldGhvZEludGVyY2VwdG9yIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLAorICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQpCisgIHsKKyAgICBMaXN0PElNZXRob2RJbnN0YW5jZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgZm9yIChJTWV0aG9kSW5zdGFuY2UgbSA6IG1ldGhvZHMpIHsKKyAgICAgIFRlc3QgdGVzdCA9IG0uZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihUZXN0LmNsYXNzKTsKKyAgICAgIFNldDxTdHJpbmc+IGdyb3VwcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgIGZvciAoU3RyaW5nIGdyb3VwIDogdGVzdC5ncm91cHMoKSkgeworICAgICAgICBncm91cHMuYWRkKGdyb3VwKTsKKyAgICAgIH0KKyAgICAgIGlmIChncm91cHMuY29udGFpbnMoImZhc3QiKSkgeworICAgICAgICByZXN1bHQuYWRkKDAsIG0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdC5hZGQobSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Gb29UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0Zvb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM1MjAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Gb29UZXN0LmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9yczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZvb1Rlc3QgeworCisgIEBUZXN0KGdyb3VwcyA9ICJmYXN0IikKKyAgcHVibGljIHZvaWQgenp6ZmFzdCgpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2xvdygpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYSgpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0lzc3VlMzkyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0lzc3VlMzkyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0MzkxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvSXNzdWUzOTIuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIElzc3VlMzkyIHsKKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdDIoKSB7fQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0lzc3VlMzkyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Jc3N1ZTM5MlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM3ZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Jc3N1ZTM5MlRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW5zdGFuY2U7CitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHRlc3QuSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lcjsKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIElzc3VlMzkyVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJ0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvMzkyIikKKyAgcHVibGljIHZvaWQgQWZ0ZXJDbGFzc19tZXRob2Rfc2hvdWxkX2JlX2ZpcmVkX3doZW5fSU1ldGhvZEludGVyY2VwdG9yX3JlbW92ZXNfdGVzdF9tZXRob2RzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoSXNzdWUzOTIuY2xhc3MpOworICAgIHRuZy5zZXRNZXRob2RJbnRlcmNlcHRvcihuZXcgSU1ldGhvZEludGVyY2VwdG9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGludGVyY2VwdChMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kcywgSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGluc3RhbmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBpbnN0YW5jZSA6IG1ldGhvZHMpIHsKKyAgICAgICAgICBpZiAoIWluc3RhbmNlLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoInRlc3QxIikpIHsKKyAgICAgICAgICAgIGluc3RhbmNlcy5hZGQoaW5zdGFuY2UpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2VzOworICAgICAgfQorICAgIH0pOworCisgICAgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRoYXQobGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZE5hbWVzKCkpLmNvbnRhaW5zRXhhY3RseSgidGVzdDIiLCAiYWZ0ZXJDbGFzcyIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvSXNzdWU1MjEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvSXNzdWU1MjEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ1OTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Jc3N1ZTUyMS5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RpbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIElzc3VlNTIxIHsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB7fQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QxKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvSXNzdWU1MjFUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0lzc3VlNTIxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0lzc3VlNTIxVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RpbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgdGVzdC5JbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyOworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworCitwdWJsaWMgY2xhc3MgSXNzdWU1MjFUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gInRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9jYmV1c3QvdGVzdG5nL2lzc3Vlcy81MjEiKQorICBwdWJsaWMgdm9pZCBCZWZvcmVDbGFzc19tZXRob2Rfc2hvdWxkX2JlX2ZpcmVkX3doZW5fSU1ldGhvZEludGVyY2VwdG9yX3JlbW92ZXNfdGVzdF9tZXRob2RzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoSXNzdWU1MjEuY2xhc3MpOworICAgIHRuZy5zZXRNZXRob2RJbnRlcmNlcHRvcihuZXcgSU1ldGhvZEludGVyY2VwdG9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGludGVyY2VwdChMaXN0PElNZXRob2RJbnN0YW5jZT4gbWV0aG9kcywgSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGluc3RhbmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBpbnN0YW5jZSA6IG1ldGhvZHMpIHsKKyAgICAgICAgICBpZiAoIWluc3RhbmNlLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoInRlc3QxIikpIHsKKyAgICAgICAgICAgIGluc3RhbmNlcy5hZGQoaW5zdGFuY2UpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2VzOworICAgICAgfQorICAgIH0pOworCisgICAgSW52b2tlZE1ldGhvZE5hbWVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnZva2VkTWV0aG9kTmFtZUxpc3RlbmVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIGFzc2VydFRoYXQobGlzdGVuZXIuZ2V0SW52b2tlZE1ldGhvZE5hbWVzKCkpLmNvbnRhaW5zRXhhY3RseSgiYmVmb3JlQ2xhc3MiLCAidGVzdDIiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL0xvY2tVcEludGVyY2VwdG9yU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Mb2NrVXBJbnRlcmNlcHRvclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNjNDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9Mb2NrVXBJbnRlcmNlcHRvclNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK0BMaXN0ZW5lcnMoe1JlbW92ZUFNZXRob2RJbnRlcmNlcHRvci5jbGFzc30pCitwdWJsaWMgY2xhc3MgTG9ja1VwSW50ZXJjZXB0b3JTYW1wbGVUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb25lKCkgeworICAgICAgICBsb2coIm9uZSIpOworICAgIH0KKyAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHR3bygpIHsKKyAgICAgICAgbG9nKCJ0d28iKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0aHJlZSgpIHsKKyAgICAgICAgbG9nKCJ0aHJlZSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW01JVGVzdF0gIiArIHMpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL01ldGhvZEludGVyY2VwdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9NZXRob2RJbnRlcmNlcHRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU2ZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9NZXRob2RJbnRlcmNlcHRvclRlc3QuamF2YQpAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9yczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5QYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE1ldGhvZEludGVyY2VwdG9yVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBwcml2YXRlIFN0cmluZyBYTUwgPQorICAgICI8IURPQ1RZUEUgc3VpdGUgU1lTVEVNIFwiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvdGVzdG5nLTEuMC5kdGRcIiA+IiArCisgICAgIiIgKworICAgICI8c3VpdGUgbmFtZT1cIlNpbmdsZVwiIHZlcmJvc2U9XCIwXCI+IiArCisgICAgIiIgKworICAgICI8bGlzdGVuZXJzPiIgKworICAgICIgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPVwidGVzdC5tZXRob2RpbnRlcmNlcHRvcnMuTnVsbE1ldGhvZEludGVyY2VwdG9yXCIgLz4iICsKKyAgICAiPC9saXN0ZW5lcnM+IiArCisgICAgIiIgKworICAgICIgIDx0ZXN0IG5hbWU9XCJTaW5nbGVcIiA+IiArCisgICAgIiAgICA8Y2xhc3Nlcz4iICsKKyAgICAiICAgICAgPGNsYXNzIG5hbWU9XCJ0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5Gb29UZXN0XCIgLz4iICsKKyAgICAiICAgICA8L2NsYXNzZXM+IiArCisgICAgIiAgPC90ZXN0PiIgKworICAgICIiICsKKyAgICAiPC9zdWl0ZT4iOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG5vTWV0aG9kc1Nob3VsZFJ1bigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgRm9vVGVzdC5jbGFzcyB9KTsKKyAgICB0ZXN0TnVsbEludGVyY2VwdG9yKHRuZyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdE51bGxJbnRlcmNlcHRvcihUZXN0TkcgdG5nKSB7CisgICAgdG5nLnNldE1ldGhvZEludGVyY2VwdG9yKG5ldyBOdWxsTWV0aG9kSW50ZXJjZXB0b3IoKSk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSwgMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0U2tpcHBlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0ZXN0RmFzdChib29sZWFuIHVzZUludGVyY2VwdG9yKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEZvb1Rlc3QuY2xhc3MgfSk7CisgICAgaWYgKHVzZUludGVyY2VwdG9yKSB7CisgICAgICB0bmcuc2V0TWV0aG9kSW50ZXJjZXB0b3IobmV3IEZhc3RUZXN0c0ZpcnN0SW50ZXJjZXB0b3IoKSk7CisgICAgfQorICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKy8vICAgIHRuZy5zZXRQYXJhbGxlbCgibWV0aG9kcyIpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAzKTsKKyAgICBJVGVzdFJlc3VsdCBmaXJzdCA9IHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldCgwKTsKKworICAgIFN0cmluZyBtZXRob2QgPSAienp6ZmFzdCI7CisgICAgaWYgKHVzZUludGVyY2VwdG9yKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZpcnN0LmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgbWV0aG9kKTsKKyAgICB9IGVsc2UgeworICAgICAgQXNzZXJ0LmFzc2VydE5vdFNhbWUoZmlyc3QuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCBtZXRob2QpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGZhc3RTaG91bGRSdW5GaXJzdCgpIHsKKyAgICB0ZXN0RmFzdCh0cnVlIC8qIHVzZSBpbnRlcmNlcHRvciAqLyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYXN0U2hvdWxkTm90UnVuRmlyc3QoKSB7CisgICAgdGVzdEZhc3QoZmFsc2UgLyogZG9uJ3QgdXNlIGludGVyY2VwdG9yICovKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG51bGxNZXRob2RJbnRlcmNlcHRvcldvcmtzSW5UZXN0bmdYbWwoKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworCisgICAgRmlsZSBmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVzdG5nLXRlc3RzLSIsICIiKTsKKyAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgIEJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGYpKTsKKyAgICBidy53cml0ZShYTUwpOworICAgIGJ3LmNsb3NlKCk7CisKKyAgICB0cnkgeworICAgICAgTGlzdDxYbWxTdWl0ZT4geG1sU3VpdGVzID0gbmV3IFBhcnNlcihmLmdldEFic29sdXRlUGF0aCgpKS5wYXJzZVRvTGlzdCgpOworCisgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgICB0bmcuc2V0WG1sU3VpdGVzKHhtbFN1aXRlcyk7CisgICAgICB0ZXN0TnVsbEludGVyY2VwdG9yKHRuZyk7CisgICAgfQorICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisKKyAgQFRlc3QodGltZU91dCA9IDEwMDApCisgIHB1YmxpYyB2b2lkIHNob3VsZE5vdExvY2tVcFdpdGhJbnRlcmNlcHRvclRoYXRSZW1vdmVzTWV0aG9kcygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKExvY2tVcEludGVyY2VwdG9yU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnNldFBhcmFsbGVsKFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5NRVRIT0RTKTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvTnVsbE1ldGhvZEludGVyY2VwdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL051bGxNZXRob2RJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTM2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL051bGxNZXRob2RJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RpbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBOdWxsTWV0aG9kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBJTWV0aG9kSW50ZXJjZXB0b3IgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SU1ldGhvZEluc3RhbmNlPiBpbnRlcmNlcHQoTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG1ldGhvZHMsIElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL1JlbW92ZUFNZXRob2RJbnRlcmNlcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9SZW1vdmVBTWV0aG9kSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY5ZDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9SZW1vdmVBTWV0aG9kSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW5zdGFuY2U7CitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIGludGVyY2VwdG9yIHRoYXQgcmVtb3ZlcyB0aGUgbWV0aG9kIGNhbGxlZCAidHdvIi4KKyAqLworcHVibGljIGNsYXNzIFJlbW92ZUFNZXRob2RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIElNZXRob2RJbnRlcmNlcHRvciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLCBJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKTsKKyAgICAgIGlmICghbmFtZS5lcXVhbHMoInR3byIpKSB7CisgICAgICAgIHJlc3VsdC5hZGQobWV0aG9kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsb2codGhpcywgbWV0aG9kcywgcmVzdWx0KTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElNZXRob2RJbnRlcmNlcHRvciBsaXN0ZW5lciwgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGlucHV0LAorICAgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG91dHB1dCkgeworICAgIFN0cmluZ0J1aWxkZXIgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQobGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpCisgICAgICAgIC5hcHBlbmQoIiAtIElucHV0OiIpLmFwcGVuZChnZXRNZXRob2ROYW1lcyhpbnB1dCkpLmFwcGVuZCgiICIpLmFwcGVuZChpbnB1dC5zaXplKCkpCisgICAgICAgIC5hcHBlbmQoIiBtZXRob2RzLiIpLmFwcGVuZCgiIE91dHB1dDoiKS5hcHBlbmQoZ2V0TWV0aG9kTmFtZXMob3V0cHV0KSkuYXBwZW5kKCIgIikKKyAgICAgICAgLmFwcGVuZChvdXRwdXQuc2l6ZSgpKS5hcHBlbmQoIiBtZXRob2RzIik7CisgICAgbG9nKG1zZy50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE1ldGhvZE5hbWVzKExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzKSB7CisgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgZm9yIChJTWV0aG9kSW5zdGFuY2UgbSA6IG1ldGhvZHMpIHsKKyAgICAgIG5hbWVzLmFkZChtLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiBuYW1lczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltNSTJdICIgKyBzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvRmlyc3RJbnRlcmNlcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9GaXJzdEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3ODViYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvRmlyc3RJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5tdWx0aXBsZWludGVyY2VwdG9yczsKKworcHVibGljIGNsYXNzIEZpcnN0SW50ZXJjZXB0b3IgZXh0ZW5kcyBNZXRob2ROYW1lRmlsdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIEZpcnN0SW50ZXJjZXB0b3IoKSB7CisgICAgICAgIHN1cGVyKCJhIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9Gb29UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL0Zvb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA1ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9Gb29UZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5tdWx0aXBsZWludGVyY2VwdG9yczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEZvb1Rlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGEoKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBiKCkgeworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYygpIHsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGQoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvTWV0aG9kTmFtZUZpbHRlckludGVyY2VwdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL01ldGhvZE5hbWVGaWx0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDgyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL01ldGhvZE5hbWVGaWx0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RpbnRlcmNlcHRvcnMubXVsdGlwbGVpbnRlcmNlcHRvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kTmFtZUZpbHRlckludGVyY2VwdG9yIGltcGxlbWVudHMgSU1ldGhvZEludGVyY2VwdG9yIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lOworCisgIHByb3RlY3RlZCBNZXRob2ROYW1lRmlsdGVySW50ZXJjZXB0b3IoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLCBJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBtZXRob2RJbnN0YW5jZSA6IG1ldGhvZHMpIHsKKyAgICAgIElUZXN0TkdNZXRob2QgbWV0aG9kID0gbWV0aG9kSW5zdGFuY2UuZ2V0TWV0aG9kKCk7CisgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXRNZXRob2ROYW1lKCk7CisgICAgICBpZiAoIW5hbWUuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgIHJlc3VsdC5hZGQobWV0aG9kSW5zdGFuY2UpOworICAgICAgICBTdHJpbmcgY3VycmVudERlc2NyaXB0aW9uID0gbWV0aG9kLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIGlmIChjdXJyZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgIG1ldGhvZC5zZXREZXNjcmlwdGlvbihtZXRob2ROYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXRob2Quc2V0RGVzY3JpcHRpb24oY3VycmVudERlc2NyaXB0aW9uICsgbWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9NdWx0aXBsZUludGVyY2VwdG9yc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvTXVsdGlwbGVJbnRlcmNlcHRvcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMWU5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvTXVsdGlwbGVJbnRlcmNlcHRvcnNUZXN0LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5tdWx0aXBsZWludGVyY2VwdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgTXVsdGlwbGVJbnRlcmNlcHRvcnNUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW50ZXJjZXB0b3JzKCl7CisgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEZvb1Rlc3QuY2xhc3MpOworICAgICAgdG5nLnNldE1ldGhvZEludGVyY2VwdG9yKG5ldyBGaXJzdEludGVyY2VwdG9yKCkpOworICAgICAgdG5nLnNldE1ldGhvZEludGVyY2VwdG9yKG5ldyBTZWNvbmRJbnRlcmNlcHRvcigpKTsKKyAgICAgIHRuZy5zZXRNZXRob2RJbnRlcmNlcHRvcihuZXcgVGhpcmRJbnRlcmNlcHRvcigpKTsKKyAgICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgICAgdG5nLnJ1bigpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDEpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCkuZ2V0TmFtZSgpLCAiZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW50ZXJjZXB0b3JzV2l0aFByZXNlcnZlT3JkZXIoKSB7CisgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgICB0bmcuc2V0VGVzdFN1aXRlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KAorICAgICAgICAgIGdldFBhdGhUb1Jlc291cmNlKCIvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL211bHRpcGxlLWludGVyY2VwdG9ycy54bWwiKSkpOworICAgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgICB0bmcucnVuKCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLmdldCgwKS5nZXRNZXRob2QoKS5nZXREZXNjcmlwdGlvbigpLCAiYWJjIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9TZWNvbmRJbnRlcmNlcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9TZWNvbmRJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGE0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL1NlY29uZEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzLm11bHRpcGxlaW50ZXJjZXB0b3JzOworCitwdWJsaWMgY2xhc3MgU2Vjb25kSW50ZXJjZXB0b3IgZXh0ZW5kcyBNZXRob2ROYW1lRmlsdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIFNlY29uZEludGVyY2VwdG9yKCkgeworICAgICAgICBzdXBlcigiYiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvVGhpcmRJbnRlcmNlcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9UaGlyZEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlM2E1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RpbnRlcmNlcHRvcnMvbXVsdGlwbGVpbnRlcmNlcHRvcnMvVGhpcmRJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5tdWx0aXBsZWludGVyY2VwdG9yczsKKworcHVibGljIGNsYXNzIFRoaXJkSW50ZXJjZXB0b3IgZXh0ZW5kcyBNZXRob2ROYW1lRmlsdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIFRoaXJkSW50ZXJjZXB0b3IoKSB7CisgICAgICAgIHN1cGVyKCJjIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHMvU2FtcGxlTWV0aG9kMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHMvU2FtcGxlTWV0aG9kMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OGY2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kcy9TYW1wbGVNZXRob2QxLmphdmEKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZHM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRlc3QgaW52b2NhdGlvbiBvZiBtZXRob2RzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFNhbXBsZU1ldGhvZDEgeworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1fb2sxID0gZmFsc2U7CisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9vazIgPSBmYWxzZTsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtX29rMyA9IHRydWU7CisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbV9vazQgPSB0cnVlOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICBtX29rMSA9IGZhbHNlOworICAgIG1fb2syID0gZmFsc2U7CisgICAgbV9vazMgPSB0cnVlOworICAgIG1fb2s0ID0gdHJ1ZTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgInNhbXBsZTEiIH0pCisgIHB1YmxpYyB2b2lkIHNob3VsZFJ1bjEoKSB7CisgICAgbV9vazEgPSB0cnVlOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAic2FtcGxlMSIgfSkKKyAgcHVibGljIHZvaWQgc2hvdWxkUnVuMigpIHsKKyAgICBtX29rMiA9IHRydWU7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGROb3RSdW4xKCkgeworICAgIG1fb2szID0gZmFsc2U7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGROb3RSdW4yKCkgeworICAgIG1fb2s0ID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGFzc2VydCBtX29rMSAmJiBtX29rMiAmJiBtX29rMyAmJiBtX29rNCA6CisgICAgICAiQWxsIGJvb2xlYW5zIHNob3VsZCBiZSB0cnVlOiAiICsgbV9vazEgKyAiICIgKyBtX29rMgorICAgICAgKyAiICIgKyBtX29rMyArICIgIiArIG1fb2s0OworICB9CisgIHN0YXRpYyBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2FtcGxlTWV0aG9kMV0gIiArIHMpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzL1ZlcmlmeU1ldGhvZDEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzL1ZlcmlmeU1ldGhvZDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJmNzEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHMvVmVyaWZ5TWV0aG9kMS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IG1ldGhvZHMgd2VyZSBydW4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJzYW1wbGUxIiB9KQorcHVibGljIGNsYXNzIFZlcmlmeU1ldGhvZDEgeworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIFNhbXBsZU1ldGhvZDEucmVzZXQoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBTYW1wbGVNZXRob2QxLnZlcmlmeSgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvQWxsVGVzdHNNZXRob2RTZWxlY3Rvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9BbGxUZXN0c01ldGhvZFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMWU1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvQWxsVGVzdHNNZXRob2RTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RzZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RTZWxlY3RvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RTZWxlY3RvckNvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0c01ldGhvZFNlbGVjdG9yIGltcGxlbWVudHMgSU1ldGhvZFNlbGVjdG9yIHsKKworICAvKioKKyAgICoKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwNTkxMTcwODI4MDcyNjA4NjhMOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlTWV0aG9kKElNZXRob2RTZWxlY3RvckNvbnRleHQgY29udGV4dCwKKyAgICAgIElUZXN0TkdNZXRob2QgbWV0aG9kLCBib29sZWFuIGlzVGVzdE1ldGhvZCkKKyAgeworICAgIGNvbnRleHQuc2V0U3RvcHBlZCh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTXlNZXRob2RTZWxlY3Rvcl0gIiArIHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFRlc3RNZXRob2RzKExpc3Q8SVRlc3ROR01ldGhvZD4gdGVzdE1ldGhvZHMpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL0JlYW5TaGVsbFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvQmVhblNoZWxsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDE1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL0JlYW5TaGVsbFRlc3QuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIHRlc3QubWV0aG9kc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIEJlYW5TaGVsbFRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgb25seUdyb3VwMSgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5tZXRob2RzZWxlY3RvcnMuU2FtcGxlVGVzdCIpOworICAgIHNldEJlYW5TaGVsbEV4cHJlc3Npb24oImdyb3Vwcy5cbiAgICAgY29udGFpbnNLZXkgICBcdCAgICAoXCJ0ZXN0MVwiKSIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgInRlc3QxIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW01ldGhvZFNlbGVjdG9yVGVzdF0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL0NvbW1hbmRMaW5lVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Db21tYW5kTGluZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU2OTNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Db21tYW5kTGluZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZHNlbGVjdG9yczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQgdGVzdGhlbHBlci5PdXRwdXREaXJlY3RvcnlQYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb21tYW5kTGluZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBBUkdfV0lUSE9VVF9DTEFTU0VTID0KKyAgICBuZXcgU3RyaW5nW117CisgICAgICAiLWxvZyIsICIwIiwKKyAgICAgICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgIi1tZXRob2RzZWxlY3RvcnMiLCAiIiwKKyAgICAgICIiCisgIH07CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBBUkdfV0lUSF9HUk9VUFMgPQorICAgIG5ldyBTdHJpbmdbXXsKKyAgICAgICItbG9nIiwgIjAiLAorICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAiLXRlc3RjbGFzcyIsICJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5TYW1wbGVUZXN0IiwKKyAgICAgICItbWV0aG9kc2VsZWN0b3JzIiwgIiIsCisgICAgICAiLWdyb3VwcyIsICIiCisgIH07CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBBUkdfV0lUSE9VVF9HUk9VUFMgPQorICAgIG5ldyBTdHJpbmdbXXsKKyAgICAgICItbG9nIiwgIjAiLAorICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAiLXRlc3RjbGFzcyIsICJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5TYW1wbGVUZXN0IiwKKyAgICAgICItbWV0aG9kc2VsZWN0b3JzIiwgIiIsCisgIH07CisKKyAgcHJpdmF0ZSBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgIHBwcCgic2V0dXAoKSIpOworICAgIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjb21tYW5kTGluZU5lZ2F0aXZlUHJpb3JpdHlBbGxHcm91cHMoKSB7CisgICAgcHBwKCJjb21tYW5kTGluZU5lZ2F0aXZlUHJpb3JpdHlBbGxHcm91cHMoKSIpOworICAgIEFSR19XSVRIT1VUX0dST1VQU1s3XSA9ICJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5BbGxUZXN0c01ldGhvZFNlbGVjdG9yOi0xIjsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oQVJHX1dJVEhPVVRfR1JPVVBTLCB0bGEpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgInRlc3QxIiwgInRlc3QyIiwgInRlc3QzIgorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgdGxhLmdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIHRsYS5nZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lTmVnYXRpdmVQcmlvcml0eUdyb3VwMigpIHsKKyAgICBwcHAoImNvbW1hbmRMaW5lTmVnYXRpdmVQcmlvcml0eUdyb3VwMigpIik7CisgICAgQVJHX1dJVEhPVVRfR1JPVVBTWzddID0gInRlc3QubWV0aG9kc2VsZWN0b3JzLlRlc3QyTWV0aG9kU2VsZWN0b3I6LTEiOworICAgIFRlc3RORy5wcml2YXRlTWFpbihBUkdfV0lUSE9VVF9HUk9VUFMsIHRsYSk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCB0bGEuZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgdGxhLmdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY29tbWFuZExpbmVMZXNzVGhhblByaW9yaXR5VGVzdDFUZXN0KCkgeworICAgIHBwcCgiY29tbWFuZExpbmVMZXNzVGhhblByaW9yaXR5VGVzdDFUZXN0KCkiKTsKKyAgICBBUkdfV0lUSF9HUk9VUFNbN10gPSAidGVzdC5tZXRob2RzZWxlY3RvcnMuVGVzdDJNZXRob2RTZWxlY3Rvcjo1IjsKKyAgICBBUkdfV0lUSF9HUk9VUFNbOV0gPSAidGVzdDEiOworICAgIFRlc3RORy5wcml2YXRlTWFpbihBUkdfV0lUSF9HUk9VUFMsIHRsYSk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDEiLCAidGVzdDIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCB0bGEuZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgdGxhLmdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY29tbWFuZExpbmVHcmVhdGVyVGhhblByaW9yaXR5VGVzdDFUZXN0MigpIHsKKyAgICBwcHAoImNvbW1hbmRMaW5lR3JlYXRlclRoYW5Qcmlvcml0eVRlc3QxVGVzdDIoKSIpOworICAgIEFSR19XSVRIX0dST1VQU1s3XSA9ICJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5UZXN0Mk1ldGhvZFNlbGVjdG9yOjE1IjsKKyAgICBBUkdfV0lUSF9HUk9VUFNbOV0gPSAidGVzdDEiOworICAgIFRlc3RORy5wcml2YXRlTWFpbihBUkdfV0lUSF9HUk9VUFMsIHRsYSk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCB0bGEuZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgdGxhLmdldEZhaWxlZFRlc3RzKCkpOworICB9CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lTGVzc1RoYW5Qcmlvcml0eUFsbFRlc3RzKCkgeworICAgIHBwcCgiY29tbWFuZExpbmVMZXNzVGhhblByaW9yaXR5QWxsVGVzdHMoKSIpOworICAgIEFSR19XSVRIX0dST1VQU1s3XSA9ICJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5BbGxUZXN0c01ldGhvZFNlbGVjdG9yOjUiOworICAgIEFSR19XSVRIX0dST1VQU1s5XSA9ICJ0ZXN0MSI7CisgICAgVGVzdE5HLnByaXZhdGVNYWluKEFSR19XSVRIX0dST1VQUywgdGxhKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJ0ZXN0MSIsICJ0ZXN0MiIsICJ0ZXN0MyIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIHRsYS5nZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCB0bGEuZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjb21tYW5kTGluZU11bHRpcGxlU2VsZWN0b3JzKCkgeworICAgIHBwcCgiY29tbWFuZExpbmVNdWx0aXBsZVNlbGVjdG9ycygpIik7CisgICAgQVJHX1dJVEhfR1JPVVBTWzddID0gInRlc3QubWV0aG9kc2VsZWN0b3JzLk5vVGVzdFNlbGVjdG9yOjcsdGVzdC5tZXRob2RzZWxlY3RvcnMuVGVzdDJNZXRob2RTZWxlY3Rvcjo1IjsKKyAgICBBUkdfV0lUSF9HUk9VUFNbOV0gPSAidGVzdDEiOworICAgIFRlc3RORy5wcml2YXRlTWFpbihBUkdfV0lUSF9HUk9VUFMsIHRsYSk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDEiLCAidGVzdDIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCB0bGEuZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgdGxhLmdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY29tbWFuZExpbmVOb1Rlc3QxU2VsZWN0b3IoKSB7CisgICAgcHBwKCJjb21tYW5kTGluZU5vVGVzdDFTZWxlY3RvcigpIik7CisgICAgQVJHX1dJVEhPVVRfR1JPVVBTWzddID0gInRlc3QubWV0aG9kc2VsZWN0b3JzLk5vVGVzdDFNZXRob2RTZWxlY3Rvcjo1IjsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oQVJHX1dJVEhPVVRfR1JPVVBTLCB0bGEpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICAgInRlc3QyIiwgInRlc3QzIgorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgdGxhLmdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIHRsYS5nZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbW1hbmRMaW5lVGVzdFdpdGhYbWxGaWxlKCkgeworICAgIHBwcCgiY29tbWFuZExpbmVUZXN0V2l0aFhtbEZpbGUoKSIpOworICAgIEFSR19XSVRIT1VUX0NMQVNTRVNbNV0gPSAidGVzdC5tZXRob2RzZWxlY3RvcnMuTm9UZXN0MU1ldGhvZFNlbGVjdG9yOjUiOworICAgIEFSR19XSVRIT1VUX0NMQVNTRVNbNl0gPSBnZXRQYXRoVG9SZXNvdXJjZSgidGVzdG5nLW1ldGhvZHNlbGVjdG9ycy54bWwiKTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oQVJHX1dJVEhPVVRfQ0xBU1NFUywgdGxhKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJ0ZXN0MiIsICJ0ZXN0MyIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIHRsYS5nZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCB0bGEuZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5VGVzdHMoU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSBleHBlY3RlZCwgTGlzdDxJVGVzdFJlc3VsdD4gZm91bmQpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0TWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIGZvciggSVRlc3RSZXN1bHQgcmVzdWx0IDogZm91bmQgKSB7CisgICAgICByZXN1bHRNZXRob2RzLmFkZCggcmVzdWx0LmdldE5hbWUoKSApOworICAgIH0KKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TWV0aG9kcy5zaXplKCksIGV4cGVjdGVkLmxlbmd0aCwgIndyb25nIG51bWJlciBvZiAiICsgdGl0bGUgKyAiIHRlc3RzIik7CisKKyAgICBmb3IoU3RyaW5nIGUgOiBleHBlY3RlZCkgeworICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0TWV0aG9kcy5jb250YWlucyhlKSwgIkV4cGVjdGVkIHRvIGZpbmQgbWV0aG9kICIgKyBlICsgIiBpbiAiCisgICAgICAgICAgKyB0aXRsZSArICIgYnV0IGRpZG4ndCBmaW5kIGl0LiIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW0NvbW1hbmRMaW5lVGVzdF0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL01ldGhvZFNlbGVjdG9ySW5TdWl0ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvTWV0aG9kU2VsZWN0b3JJblN1aXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjIwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL01ldGhvZFNlbGVjdG9ySW5TdWl0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIHRlc3QubWV0aG9kc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sTWV0aG9kU2VsZWN0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQgdGVzdGhlbHBlci5PdXRwdXREaXJlY3RvcnlQYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNZXRob2RTZWxlY3RvckluU3VpdGVUZXN0ICBleHRlbmRzIFNpbXBsZUJhc2VUZXN0eworCisgIHByaXZhdGUgVGVzdExpc3RlbmVyQWRhcHRlciBtX3RsYTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgIG1fdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHByb2dyYW1tYXRpY1htbFN1aXRlKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IG5ldyBYbWxTdWl0ZSgpOworICAgIFhtbE1ldGhvZFNlbGVjdG9yIG1ldGhvZFNlbGVjdG9yID0gbmV3IFhtbE1ldGhvZFNlbGVjdG9yKCk7CisgICAgbWV0aG9kU2VsZWN0b3Iuc2V0TmFtZSgidGVzdC5tZXRob2RzZWxlY3RvcnMuVGVzdDJNZXRob2RTZWxlY3RvciIpOworICAgIG1ldGhvZFNlbGVjdG9yLnNldFByaW9yaXR5KC0xKTsKKyAgICBMaXN0PFhtbE1ldGhvZFNlbGVjdG9yPiBtZXRob2RTZWxlY3RvcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBtZXRob2RTZWxlY3RvcnMuYWRkKG1ldGhvZFNlbGVjdG9yKTsKKyAgICBzdWl0ZS5zZXRNZXRob2RTZWxlY3RvcnMobWV0aG9kU2VsZWN0b3JzKTsKKyAgICBYbWxUZXN0IHRlc3QgPSBuZXcgWG1sVGVzdChzdWl0ZSk7CisgICAgWG1sQ2xhc3MgdGVzdENsYXNzID0gbmV3IFhtbENsYXNzKHRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QuY2xhc3MpOworICAgIHRlc3Quc2V0WG1sQ2xhc3NlcyhBcnJheXMuYXNMaXN0KHRlc3RDbGFzcykpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzdWl0ZSkpOworICAgIHRuZy5hZGRMaXN0ZW5lcihtX3RsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgdmFsaWRhdGUobmV3IFN0cmluZ1tdIHsgInRlc3QyIiB9KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHhtbFhtbFN1aXRlKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KGdldFBhdGhUb1Jlc291cmNlKCJtZXRob2RzZWxlY3Rvci1pbi14bWwueG1sIikpKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIobV90bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIHZhbGlkYXRlKG5ldyBTdHJpbmdbXSB7ICJ0ZXN0MiIgfSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmaWxlT25Db21tYW5kTGluZSgpIHsKKyAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAgIGdldFBhdGhUb1Jlc291cmNlKCJtZXRob2RzZWxlY3Rvci1pbi14bWwueG1sIikgfTsKKyAgICBUZXN0TkcucHJpdmF0ZU1haW4oYXJncywgbV90bGEpOworCisgICAgdmFsaWRhdGUobmV3IFN0cmluZ1tdIHsgInRlc3QyIiB9KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZShTdHJpbmdbXSBleHBlY3RQYXNzZWQpIHsKKyAgICBMaXN0PElUZXN0UmVzdWx0PiBwYXNzZWQgPSBtX3RsYS5nZXRQYXNzZWRUZXN0cygpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGFzc2VkLnNpemUoKSwgZXhwZWN0UGFzc2VkLmxlbmd0aCk7CisgICAgLy8gZG9pbmcgdGhpcyBpbmRleCBiYXNlZCBpcyBwcm9iYWJseSBub3QgdGhlIGJlc3QKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdFBhc3NlZC5sZW5ndGg7IGkrKykgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwYXNzZWQuZ2V0KGkpLmdldE5hbWUoKSwgZXhwZWN0UGFzc2VkW2ldKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvTWV0aG9kU2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL01ldGhvZFNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDI2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL01ldGhvZFNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RzZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgTWV0aG9kU2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG5lZ2F0aXZlUHJpb3JpdHlBbGxHcm91cHMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiKTsKKyAgICBhZGRNZXRob2RTZWxlY3RvcigidGVzdC5tZXRob2RzZWxlY3RvcnMuQWxsVGVzdHNNZXRob2RTZWxlY3RvciIsIC0xKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJ0ZXN0MSIsICJ0ZXN0MiIsICJ0ZXN0MyIsCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG5lZ2F0aXZlUHJpb3JpdHlHcm91cDIoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiKTsKKyAgICBhZGRNZXRob2RTZWxlY3RvcigidGVzdC5tZXRob2RzZWxlY3RvcnMuVGVzdDJNZXRob2RTZWxlY3RvciIsIC0xKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJ0ZXN0MiIsCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxlc3NUaGFuUHJpb3JpdHlUZXN0MVRlc3QoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJ0ZXN0MSIpOworICAgIGFkZE1ldGhvZFNlbGVjdG9yKCJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5UZXN0Mk1ldGhvZFNlbGVjdG9yIiwgNSk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDEiLCAidGVzdDIiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBncmVhdGVyVGhhblByaW9yaXR5VGVzdDFUZXN0MigpIHsKKyAgICBhZGRDbGFzcygidGVzdC5tZXRob2RzZWxlY3RvcnMuU2FtcGxlVGVzdCIpOworICAgIGFkZEluY2x1ZGVkR3JvdXAoInRlc3QxIik7CisgICAgYWRkTWV0aG9kU2VsZWN0b3IoInRlc3QubWV0aG9kc2VsZWN0b3JzLlRlc3QyTWV0aG9kU2VsZWN0b3IiLCAxNSk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDIiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBsZXNzVGhhblByaW9yaXR5QWxsVGVzdHMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiKTsKKyAgICBhZGRJbmNsdWRlZEdyb3VwKCJ0ZXN0MSIpOworICAgIGFkZE1ldGhvZFNlbGVjdG9yKCJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5BbGxUZXN0c01ldGhvZFNlbGVjdG9yIiwgNSk7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgICAidGVzdDEiLCAidGVzdDIiLCAidGVzdDMiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltNZXRob2RTZWxlY3RvclRlc3RdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Ob1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvTm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMWE4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvTm9UZXN0LmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIHRlc3QubWV0aG9kc2VsZWN0b3JzOw0KKw0KK3B1YmxpYyBAaW50ZXJmYWNlIE5vVGVzdCB7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvTm9UZXN0MU1ldGhvZFNlbGVjdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL05vVGVzdDFNZXRob2RTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDk1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL05vVGVzdDFNZXRob2RTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RzZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RTZWxlY3RvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RTZWxlY3RvckNvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBOb1Rlc3QxTWV0aG9kU2VsZWN0b3IgaW1wbGVtZW50cyBJTWV0aG9kU2VsZWN0b3IgeworCisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjcwNjg2OTQxMDM3MDczMzUyNEw7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVNZXRob2QoSU1ldGhvZFNlbGVjdG9yQ29udGV4dCBjb250ZXh0LAorICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QsIGJvb2xlYW4gaXNUZXN0TWV0aG9kKQorICB7CisgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBtZXRob2QuZ2V0R3JvdXBzKCkpIHsKKyAgICAgIGlmIChncm91cC5lcXVhbHMoInRlc3QxIikpIHsKKyAgICAgICAgcHBwKCBtZXRob2QuZ2V0TWV0aG9kTmFtZSgpICsgIiBpcyBncm91cCB0ZXN0MSwgZG9uJ3QgaW5jbHVkZSIgKTsKKyAgICAgICAgY29udGV4dC5zZXRTdG9wcGVkKHRydWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHBwcCggbWV0aG9kLmdldE1ldGhvZE5hbWUoKSArICIgaXMgbm90IGluIGdyb3VwIHRlc3QxIiApOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFRlc3RNZXRob2RzKExpc3Q8SVRlc3ROR01ldGhvZD4gdGVzdE1ldGhvZHMpIHsKKworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbTm9UZXN0MU1ldGhvZFNlbGVjdG9yXSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Ob1Rlc3RTZWxlY3Rvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Ob1Rlc3RTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWU2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL05vVGVzdFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZHNlbGVjdG9yczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kU2VsZWN0b3I7DQoraW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yQ29udGV4dDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTWV0aG9kOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitwdWJsaWMgY2xhc3MgTm9UZXN0U2VsZWN0b3IgaW1wbGVtZW50cyBJTWV0aG9kU2VsZWN0b3Igew0KKw0KKyAgLyoqDQorICAgKg0KKyAgICovDQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc1MTE5MDU3ODcxMDg0NjQ4N0w7DQorDQorICBAT3ZlcnJpZGUNCisgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVNZXRob2QoSU1ldGhvZFNlbGVjdG9yQ29udGV4dCBjb250ZXh0LA0KKyAgICAgIElUZXN0TkdNZXRob2QgbWV0aG9kLCBib29sZWFuIGlzVGVzdE1ldGhvZCkNCisgIHsNCisgICAgcHBwKCJOT1RFU1QgUkVUVVJOSU5HIEZBTFNFIEZPUiAiICsgbWV0aG9kKTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBzZXRUZXN0TWV0aG9kcyhMaXN0PElUZXN0TkdNZXRob2Q+IHRlc3RNZXRob2RzKSB7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgew0KKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW05vVGVzdFNlbGVjdG9yXSAiICsgcyk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvUHJpb3JpdHlTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1ByaW9yaXR5U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjZiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1ByaW9yaXR5U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5tZXRob2RzZWxlY3RvcnM7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitwdWJsaWMgY2xhc3MgUHJpb3JpdHlTYW1wbGVUZXN0IHsNCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBhbHdheXNSdW4oKSB7DQorICAgIHBwcCgiQUxXQVlTIik7DQorICB9DQorDQorICBAVGVzdA0KKyAgQE5vVGVzdA0KKyAgcHVibGljIHZvaWQgbmV2ZXJSdW4oKSB7DQorICAgIHBwcCgiTkVWRVIiKTsNCisgIH0NCisNCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7DQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1ByaW9yaXR5U2FtcGxlVGVzdF0gIiArIHMpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1ByaW9yaXR5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Qcmlvcml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUzMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9Qcmlvcml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIHRlc3QubWV0aG9kc2VsZWN0b3JzOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitwdWJsaWMgY2xhc3MgUHJpb3JpdHlUZXN0IHsNCisNCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KGludCBwcmlvcml0eSwgU3RyaW5nW10gcGFzc2VkVGVzdHMpIHsNCisgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsNCisgICAgdG5nLnNldFZlcmJvc2UoMCk7DQorICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IFByaW9yaXR5U2FtcGxlVGVzdC5jbGFzcyB9KTsNCisgICAgdG5nLmFkZE1ldGhvZFNlbGVjdG9yKCJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5Ob1Rlc3RTZWxlY3RvciIsIHByaW9yaXR5KTsNCisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOw0KKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsNCisgICAgdG5nLnJ1bigpOw0KKw0KKyAgICBMaXN0PElUZXN0UmVzdWx0PiBwYXNzZWQgPSB0bGEuZ2V0UGFzc2VkVGVzdHMoKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwYXNzZWRUZXN0cy5sZW5ndGgsIHBhc3NlZC5zaXplKCkpOw0KKyAgICBpZiAocGFzc2VkVGVzdHMubGVuZ3RoID09IDEpIHsNCisgICAgICBTdHJpbmcgcGFzc2VkMCA9IHBhc3NlZC5nZXQoMCkuZ2V0TmFtZSgpOw0KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGFzc2VkMCwgcGFzc2VkVGVzdHNbMF0pOw0KKyAgICB9DQorICAgIGlmIChwYXNzZWRUZXN0cy5sZW5ndGggPT0gMikgew0KKyAgICAgIFN0cmluZyBwYXNzZWQwID0gcGFzc2VkLmdldCgwKS5nZXROYW1lKCk7DQorICAgICAgU3RyaW5nIHBhc3NlZDEgPSBwYXNzZWQuZ2V0KDEpLmdldE5hbWUoKTsNCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwYXNzZWQwLmVxdWFscyhwYXNzZWRUZXN0c1swXSkNCisgICAgICAgIHx8IHBhc3NlZDAuZXF1YWxzKHBhc3NlZFRlc3RzWzFdKSk7DQorICAgICAgQXNzZXJ0LmFzc2VydFRydWUocGFzc2VkMS5lcXVhbHMocGFzc2VkVGVzdHNbMF0pDQorICAgICAgICAgIHx8IHBhc3NlZDEuZXF1YWxzKHBhc3NlZFRlc3RzWzFdKSk7DQorDQorICAgIH0NCisgIH0NCisNCisvLyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIG5lZ2F0aXZlUHJpb3JpdHkoKSB7DQorICAgIHJ1blRlc3QoLTUsIG5ldyBTdHJpbmdbXSB7fSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbGVzc1RoYW5UZW5Qcmlvcml0eSgpIHsNCisgICAgcnVuVGVzdCg1LCBuZXcgU3RyaW5nW10geyAiYWx3YXlzUnVuIiB9KTsNCisgIH0NCisNCisvLyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIGdyZWF0ZXJUaGFuVGVuUHJpb3JpdHkoKSB7DQorICAgIHJ1blRlc3QoMTUsIG5ldyBTdHJpbmdbXSB7ICJhbHdheXNSdW4iLCAibmV2ZXJSdW4iIH0pOw0KKyAgfQ0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tZXRob2RzZWxlY3RvcnMvU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODJkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHRlc3QubWV0aG9kc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAidGVzdDEiIH0pCisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgIHBwcCgiVEVTVDEiKTsKKworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAidGVzdDIiIH0pCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIHBwcCgiVEVTVDIiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgInRlc3QzIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICBwcHAoIlRFU1QzIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2FtcGxlVGVzdF0gIiArIHMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9UZXN0Mk1ldGhvZFNlbGVjdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWV0aG9kc2VsZWN0b3JzL1Rlc3QyTWV0aG9kU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTMzMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21ldGhvZHNlbGVjdG9ycy9UZXN0Mk1ldGhvZFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSB0ZXN0Lm1ldGhvZHNlbGVjdG9yczsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yOworaW1wb3J0IG9yZy50ZXN0bmcuSU1ldGhvZFNlbGVjdG9yQ29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRlc3QyTWV0aG9kU2VsZWN0b3IgaW1wbGVtZW50cyBJTWV0aG9kU2VsZWN0b3IgeworCisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDE2NjI0Nzk2ODM5MjY0OTkxMkw7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVNZXRob2QoSU1ldGhvZFNlbGVjdG9yQ29udGV4dCBjb250ZXh0LAorICAgICAgSVRlc3ROR01ldGhvZCBtZXRob2QsIGJvb2xlYW4gaXNUZXN0TWV0aG9kKQorICB7CisgICAgZm9yIChTdHJpbmcgZ3JvdXAgOiBtZXRob2QuZ2V0R3JvdXBzKCkpIHsKKyAgICAgIGlmIChncm91cC5lcXVhbHMoInRlc3QyIikpIHsKKyAgICAgICAgY29udGV4dC5zZXRTdG9wcGVkKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0VGVzdE1ldGhvZHMoTGlzdDxJVGVzdE5HTWV0aG9kPiB0ZXN0TWV0aG9kcykgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9KVW5pdDNUZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL0pVbml0M1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZWIwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9KVW5pdDNUZXN0MS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5taXhlZDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKgorICogQGF1dGhvciBsdWthcworICovCitwdWJsaWMgY2xhc3MgSlVuaXQzVGVzdDEgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgSlVuaXQzVGVzdDEoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEEoKSB7CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL0pVbml0NFRlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWl4ZWQvSlVuaXQ0VGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDk0MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL0pVbml0NFRlc3QxLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0Lm1peGVkOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworcHVibGljIGNsYXNzIEpVbml0NFRlc3QxIHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXRlc3QoKSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJUZXN0KCkgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL01peGVkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL01peGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjRhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbWl4ZWQvTWl4ZWRUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSB0ZXN0Lm1peGVkOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworaW1wb3J0IHRlc3RoZWxwZXIuT3V0cHV0RGlyZWN0b3J5UGF0Y2g7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworcHVibGljIGNsYXNzIE1peGVkVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1peGVkV2l0aEV4Y2x1ZGVkR3JvdXBzKCkgeworICAgICAgICBTdHJpbmdbXSBhcmd2ID0geworICAgICAgICAgICAgICAgICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICItbG9nIiwgIjAiLAorICAgICAgICAgICAgICAgICItbWl4ZWQiLAorICAgICAgICAgICAgICAgICItZ3JvdXBzIiwgInVuaXQiLAorICAgICAgICAgICAgICAgICItZXhjbHVkZWdyb3VwcyIsICJpZ25vcmUiLAorICAgICAgICAgICAgICAgICItdGVzdGNsYXNzIiwgInRlc3QubWl4ZWQuSlVuaXQzVGVzdDEsdGVzdC5taXhlZC5KVW5pdDRUZXN0MSx0ZXN0Lm1peGVkLlRlc3ROR1Rlc3QxLHRlc3QubWl4ZWQuVGVzdE5HR3JvdXBzIgorICAgICAgICB9OworICAgICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgICAgIFRlc3RORy5wcml2YXRlTWFpbihhcmd2LCB0bGEpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCA1KTsgLy8yIGZyb20ganVuaXQzdGVzdDEsIDIgZnJvbSBqdW5pdDR0ZXN0MSwgMCBmcm9tIHRlc3RuZ3Rlc3QxIChubyBncm91cHMpLCAxIGZyb20gdGVzdG5nZ3JvdXBzICgxIGlzIGluY2x1ZGVkLCAxIGlzIGV4Y2x1ZGVkKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSwgMCk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1peGVkQ2xhc3NlcygpIHsKKyAgICAgICAgU3RyaW5nW10gYXJndiA9IHsKKyAgICAgICAgICAgICItZCIsIE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpLAorICAgICAgICAgICAgIi1sb2ciLCAiMCIsCisgICAgICAgICAgICAiLW1peGVkIiwKKyAgICAgICAgICAgICItdGVzdGNsYXNzIiwgInRlc3QubWl4ZWQuSlVuaXQzVGVzdDEsdGVzdC5taXhlZC5KVW5pdDRUZXN0MSx0ZXN0Lm1peGVkLlRlc3ROR1Rlc3QxIgorICAgICAgICB9OworICAgICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgICAgIFRlc3RORy5wcml2YXRlTWFpbihhcmd2LCB0bGEpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCA2KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWl4ZWRNZXRob2RzKCkgeworICAgICAgICBTdHJpbmdbXSBhcmd2ID0geworICAgICAgICAgICAgIi1kIiwgT3V0cHV0RGlyZWN0b3J5UGF0Y2guZ2V0T3V0cHV0RGlyZWN0b3J5KCksCisgICAgICAgICAgICAiLW1peGVkIiwKKyAgICAgICAgICAgICItbG9nIiwgIjAiLAorICAgICAgICAgICAgIi1tZXRob2RzIiwgInRlc3QubWl4ZWQuSlVuaXQzVGVzdDEudGVzdEIsdGVzdC5taXhlZC5KVW5pdDRUZXN0MS5hdGVzdCx0ZXN0Lm1peGVkLlRlc3ROR1Rlc3QxLnRuZ0N1c3RvbVRlc3QxIgorICAgICAgICB9OworICAgICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgICAgIFRlc3RORy5wcml2YXRlTWFpbihhcmd2LCB0bGEpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9UZXN0TkdHcm91cHMuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9UZXN0TkdHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE4YmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL1Rlc3ROR0dyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5taXhlZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzID0geyJ1bml0In0pCitwdWJsaWMgY2xhc3MgVGVzdE5HR3JvdXBzIHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRuZ1Rlc3QxKCkgeworCisgICAgfQorCisgICAgQFRlc3QoZ3JvdXBzID0geyJpZ25vcmUifSkKKyAgICBwdWJsaWMgdm9pZCB0bmdTaG91bGRCZUlnbm9yZWQoKSB7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9UZXN0TkdUZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21peGVkL1Rlc3ROR1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkZWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9taXhlZC9UZXN0TkdUZXN0MS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgdGVzdC5taXhlZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCisvKioKKyAqCisgKiBAYXV0aG9yIGx1a2FzCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0TkdUZXN0MSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRuZ1Rlc3QxKCkgeworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0bmdDdXN0b21UZXN0MSgpIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tb3J0ZW4vU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21vcnRlbi9TYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmMmZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tb3J0ZW4vU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgdGVzdC5tb3J0ZW47CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdCB7CisgICAgcHJpdmF0ZSBpbnQgY2FwYWNpdHkgPSAxMDsKKyAgICBwcml2YXRlIGZsb2F0IGxvYWRGYWN0b3IgPSAwLjNmOworCisgICAgcHVibGljIGNsYXNzIFNhbXBsZVRlc3RUZXN0RmFjdG9yeSB7CisgICAgICBwdWJsaWMgU2FtcGxlVGVzdFRlc3RGYWN0b3J5KCkge30gLy8gQ1RSIG5lY2Vzc2FyeSA/CisgICAgICBARmFjdG9yeSBwdWJsaWMgT2JqZWN0W10gY3JlYXRlSW5zdGFuY2VzKCkgeworICAgICAgcmV0dXJuIG5ldyBTYW1wbGVUZXN0W10geworICAgICAgICBuZXcgU2FtcGxlVGVzdCgxLCAwLjFmKSwKKyAgICAgICAgbmV3IFNhbXBsZVRlc3QoMTAsIDAuNWYpLAorICAgICAgfTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFNhbXBsZVRlc3QoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU2FtcGxlVGVzdChpbnQgY2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCisgICAgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDUkVBVElORyBURVNUIFdJVEggIiArIGNhcGFjaXR5KTsKKyAgICAgdGhpcy5jYXBhY2l0eT1jYXBhY2l0eTsKKyAgICAgdGhpcy5sb2FkRmFjdG9yPWxvYWRGYWN0b3I7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFB1dCgpCisgICAgeworICAgICAgLy9GSVhNRTogVGhpcyB0ZXN0IGRvZXMgbm90aGluZworICAgICAgLy9IYXNoTWFwIGhhc2hUYWJsZSA9IG5ldyBIYXNoTWFwKGNhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKyAgICAgIC8vIC4uLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tb3J0ZW4vU2FtcGxlVGVzdEZhY3RvcnkuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tb3J0ZW4vU2FtcGxlVGVzdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNkNWVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L21vcnRlbi9TYW1wbGVUZXN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC5tb3J0ZW47CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGVUZXN0RmFjdG9yeSB7CisgIHB1YmxpYyBTYW1wbGVUZXN0RmFjdG9yeSgpIHt9IC8vIENUUiBuZWNlc3NhcnkgPworICBARmFjdG9yeSBwdWJsaWMgT2JqZWN0W10gY3JlYXRlSW5zdGFuY2VzKCkgeworICByZXR1cm4gbmV3IFNhbXBsZVRlc3RbXSB7CisgICAgbmV3IFNhbXBsZVRlc3QoMSwgMC4xZiksCisgICAgbmV3IFNhbXBsZVRlc3QoMTAsIDAuNWYpLAorICB9OworICB9Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1Rlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVsdGlwbGUvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE0ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1Rlc3QxLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0Lm11bHRpcGxlOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0MSB7CisgIHByaXZhdGUgc3RhdGljIGludCBtX2NvdW50ID0gMDsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpIHsKKy8vICAgIHBwcCgiSU5WT0tJTkcgZjEgIiArIG1fY291bnQpOworICAgIGFzc2VydFRydWUobV9jb3VudCA8IDEsICJGQUlMSU5HIik7CisgICAgbV9jb3VudCsrOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgeworICAgIG1fY291bnQgPSAwOworICB9CisKKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1Rlc3QxXSAiICsgcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1Rlc3RNdWx0aXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1Rlc3RNdWx0aXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Yjg0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVsdGlwbGUvVGVzdE11bHRpcGxlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSB0ZXN0Lm11bHRpcGxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RNdWx0aXBsZSBleHRlbmRzIEJhc2VUZXN0IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJ0ZXN0Lm11bHRpcGxlLlRoaXNGYWN0b3J5IjsKKworICBAVGVzdChncm91cHMgPSB7ICJjdXJyZW50IiB9KQorICBwdWJsaWMgdm9pZCBtdWx0aXBsZSgpIHsKKyAgICBhZGRDbGFzcyhDTEFTU19OQU1FKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAiZjEiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgImYxIiwiZjEiLCJmMSIsImYxIiwiZjEiLCAiZjEiLCJmMSIsImYxIiwiZjEiLAorICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1RoaXNGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVsdGlwbGUvVGhpc0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZmMzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlL1RoaXNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSB0ZXN0Lm11bHRpcGxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFRoaXNGYWN0b3J5IHsKKworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlKCkgeworICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgcmVzdWx0LmFkZChuZXcgVGVzdDEoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlbGlzdGVuZXJzL1NpbXBsZVJlcG9ydGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVsdGlwbGVsaXN0ZW5lcnMvU2ltcGxlUmVwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNGYxNDBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlbGlzdGVuZXJzL1NpbXBsZVJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSB0ZXN0Lm11bHRpcGxlbGlzdGVuZXJzOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklSZXBvcnRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcuU3VpdGVSdW5uZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5JQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7DQoraW1wb3J0IHRlc3QubGlzdGVuZXJzLkxpc3RlbmVyQXNzZXJ0Ow0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorcHVibGljIGNsYXNzIFNpbXBsZVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyDQorew0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcG9ydChmaW5hbCBMaXN0PFhtbFN1aXRlPiB4bWxTdWl0ZXMsIGZpbmFsIExpc3Q8SVN1aXRlPiBzdWl0ZXMsDQorICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkNCisgIHsNCisgICAgZm9yIChmaW5hbCBJU3VpdGUgaVN1aXRlIDogc3VpdGVzKQ0KKyAgICB7DQorICAgICAgdHJ5DQorICAgICAgew0KKyAgICAgICAgZmluYWwgRmllbGQgZmllbGQgPSBTdWl0ZVJ1bm5lci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJtX2NvbmZpZ3VyYXRpb24iKTsNCisgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQorICAgICAgICBmaW5hbCBJQ29uZmlndXJhdGlvbiBjb25mID0gKElDb25maWd1cmF0aW9uKSBmaWVsZC5nZXQoaVN1aXRlKTsNCisgICAgICAgIExpc3RlbmVyQXNzZXJ0LmFzc2VydExpc3RlbmVyVHlwZShjb25mLmdldENvbmZpZ3VyYXRpb25MaXN0ZW5lcnMoKSwgVGVzdExpc3RlbmVyQWRhcHRlci5jbGFzcyk7DQorICAgICAgfQ0KKyAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkNCisgICAgICB7DQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlbGlzdGVuZXJzL1Rlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVsdGlwbGVsaXN0ZW5lcnMvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDJkMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlbGlzdGVuZXJzL1Rlc3QxLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0Lm11bHRpcGxlbGlzdGVuZXJzOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorQFRlc3QNCitwdWJsaWMgY2xhc3MgVGVzdDENCit7DQorICBwdWJsaWMgdm9pZCB0ZXN0KCkNCisgIHsNCisvLyAgICBSZXBvcnRlci5sb2coInRlc3QxIiwgdHJ1ZSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9tdWx0aXBsZWxpc3RlbmVycy9UZXN0TWFrZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9tdWx0aXBsZWxpc3RlbmVycy9UZXN0TWFrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTc5NWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L211bHRpcGxlbGlzdGVuZXJzL1Rlc3RNYWtlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgdGVzdC5tdWx0aXBsZWxpc3RlbmVyczsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOw0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7DQoraW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorcHVibGljIGNsYXNzIFRlc3RNYWtlcg0KK3sNCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIk1ha2Ugc3VyZSBvbmx5IG9uZSBsaXN0ZW5lciBpcyBjcmVhdGVkIGFuZCBub3QgMl4zIikNCisgIHB1YmxpYyB2b2lkIHJ1bigpDQorICB7DQorICAgIGZpbmFsIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7DQorICAgIHRuZy5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGZhbHNlKTsNCisgICAgdG5nLnNldExpc3RlbmVyQ2xhc3NlcyhBcnJheXMuPENsYXNzPiBhc0xpc3QoVGVzdExpc3RlbmVyQWRhcHRlci5jbGFzcywgU2ltcGxlUmVwb3J0ZXIuY2xhc3MpKTsNCisgICAgZmluYWwgTGlzdDxYbWxTdWl0ZT4gc3VpdGVzID0gY3JlYXRlU3VpdGVzKCk7DQorICAgIHRuZy5zZXRYbWxTdWl0ZXMoc3VpdGVzKTsNCisgICAgdG5nLnNldFZlcmJvc2UoMCk7DQorICAgIHRuZy5ydW4oKTsNCisNCisvLyAgICBSZXBvcnRlci5sb2codG5nLmdldFN1aXRlTGlzdGVuZXJzKCkuc2l6ZSgpICsgIiIsIHRydWUpOw0KKy8vICAgIGZvciAoZmluYWwgWG1sU3VpdGUgeG1sU3VpdGUgOiBzdWl0ZXMpDQorLy8gICAgew0KKy8vICAgICAgUmVwb3J0ZXIubG9nKHhtbFN1aXRlLmdldE5hbWUoKSArICI6ICIgKyB4bWxTdWl0ZS5nZXRMaXN0ZW5lcnMoKS5zaXplKCksIHRydWUpOw0KKy8vICAgIH0NCisgIH0NCisNCisgIHByaXZhdGUgTGlzdDxYbWxTdWl0ZT4gY3JlYXRlU3VpdGVzKCkNCisgIHsNCisgICAgZmluYWwgTGlzdDxYbWxTdWl0ZT4gcmV0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KKyAgICB7DQorICAgICAgcmV0LmFkZChjcmVhdGVTdWl0ZShpKSk7DQorICAgIH0NCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisNCisgIHByaXZhdGUgWG1sU3VpdGUgY3JlYXRlU3VpdGUoZmluYWwgaW50IG5yKQ0KKyAgew0KKyAgICBmaW5hbCBYbWxTdWl0ZSBzdWl0ZSA9IG5ldyBYbWxTdWl0ZSgpOw0KKyAgICBzdWl0ZS5zZXROYW1lKCJTdWl0ZV8iICsgbnIpOw0KKw0KKyAgICBuZXcgWG1sVGVzdChzdWl0ZSkuc2V0WG1sQ2xhc3NlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBYbWxDbGFzcyhUZXN0MS5jbGFzcykpKTsNCisgICAgcmV0dXJuIHN1aXRlOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVzdGFjaGUvTXVzdGFjaGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbXVzdGFjaGUvTXVzdGFjaGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhNDYzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9tdXN0YWNoZS9NdXN0YWNoZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSB0ZXN0Lm11c3RhY2hlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5NYXBzOworaW1wb3J0IG9yZy50ZXN0bmcubXVzdGFjaGUuTXVzdGFjaGU7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgTXVzdGFjaGVUZXN0IHsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG4pIHsKKyAgICAgIG5hbWUgPSBuOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWdlIHsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgQWdlKGludCBhKSB7CisgICAgICB0aGlzLmFnZSA9IGE7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxQZXJzb24+IFBFT1BMRSA9IG5ldyBBcnJheUxpc3Q8PigKKyAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBQZXJzb24oIkNhcmwiKSwgbmV3IFBlcnNvbigiQ2hyaXN0b3BoZXIiKSkpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8QWdlPiBBR0VTID0gbmV3IEFycmF5TGlzdDw+KAorICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IEFnZSg0MiksIG5ldyBBZ2UoNDMpKSk7CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBkcCgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICAvLyBTaW1wbGUKKyAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgIGNyZWF0ZSgib25lIiwgImVsbG8iLCAidHdvIiwgIm9ybGQiKSwKKyAgICAgICAgICAgICJIe3tvbmV9fSBXe3t0d299fSIsCisgICAgICAgICAgICAiSGVsbG8gV29ybGQiCisgICAgICAgIH0sCisgICAgICAgIC8vIE51bGwgY29uZGl0aW9uCisgICAgICAgIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLAorICAgICAgICAgICAgIkV7eyNmb299fXh4eHt7L2Zvb319bGVwaGFudCIsCisgICAgICAgICAgICAiRWxlcGhhbnQiCisgICAgICAgIH0sCisgICAgICAgIC8vIE51bGwgY29uZGl0aW9uIHdpdGggbmV3IGxpbmUKKyAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5TWFwKCksCisgICAgICAgICAgICAiSGVsbG9cbnt7I2Zvb319QFxue3svZm9vfX1Xb3JsZCIsCisgICAgICAgICAgICAiSGVsbG9cbldvcmxkIgorICAgICAgICB9LAorICAgICAgICAvLyBTaW1wbGUgc2NvcGUKKyAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgIGNyZWF0ZSgicGVyc29uIiwgbmV3IFBlcnNvbigiSm9obiIpLCAiZGF5IiwgIk1vbmRheSIpLAorICAgICAgICAgICAgIkhlbGxvIHt7I3BlcnNvbn19e3tuYW1lfX17ey9wZXJzb259fSwge3tkYXl9fSIsCisgICAgICAgICAgICAiSGVsbG8gSm9obiwgTW9uZGF5IgorICAgICAgICB9LAorICAgICAgICAvLyBTY29wZSB3aXRoIHNoYWRvd2luZworICAgICAgICBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgY3JlYXRlKCJwZXJzb24iLCBuZXcgUGVyc29uKCJKb2huIiksICJuYW1lIiwgIkNhcmwiKSwKKyAgICAgICAgICAgICJIZWxsbyB7eyNwZXJzb259fXt7bmFtZX19e3svcGVyc29ufX0sIHt7bmFtZX19IiwKKyAgICAgICAgICAgICJIZWxsbyBKb2huLCBDYXJsIgorICAgICAgICB9LAorICAgICAgICAvLyBUZXN0IGl0ZXJhdGlvbgorICAgICAgICBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgY3JlYXRlKCJwZW9wbGUiLCBQRU9QTEUpLAorICAgICAgICAgICAgIlBlb3BsZTpAe3sjcGVvcGxlfX0te3svcGVvcGxlfX0hIiwKKyAgICAgICAgICAgICJQZW9wbGU6QC0tISIsCisgICAgICAgIH0sCisgICAgICAgIC8vIE5lc3RlZCBzY29wZXMKKyAgICAgICAgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgIGNyZWF0ZSgicGVvcGxlIiwgUEVPUExFLCAiYWdlcyIsIEFHRVMpLAorICAgICAgICAgICAgIjpAe3sjcGVvcGxlfX17e25hbWV9fXt7I2FnZXN9fXt7YWdlfX17ey9hZ2VzfX1Ae3svcGVvcGxlfX0hXyIsCisgICAgICAgICAgICAiOkBDYXJsNDI0M0BDaHJpc3RvcGhlcjQyNDNAIV8iLAorICAgICAgICB9LAorICAgIH07CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlKE9iamVjdC4uLiBvYmplY3RzKSB7CisgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgIHJlc3VsdC5wdXQoKFN0cmluZykgb2JqZWN0c1tpXSwgb2JqZWN0c1tpICsgMV0pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIHZvaWQgcnVuVGVzdChNYXA8U3RyaW5nLCBPYmplY3Q+IG1vZGVsLCBTdHJpbmcgdGVtcGxhdGUsIFN0cmluZyBleHBlY3RlZCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisvLyAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbSh0ZW1wbGF0ZSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgTXVzdGFjaGUoKS5ydW4odGVtcGxhdGUsIG1vZGVsKSwgZXhwZWN0ZWQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9uYW1lL0lUZXN0U2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9JVGVzdFNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGJlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9JVGVzdFNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKK3BhY2thZ2UgdGVzdC5uYW1lOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLy8gRnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zMzQwNDMzNS80MjM0NzI5CitwdWJsaWMgY2xhc3MgSVRlc3RTYW1wbGUgaW1wbGVtZW50cyBJVGVzdCB7CisKKyAgcHVibGljIFRocmVhZExvY2FsPFN0cmluZz4gdGVzdE5hbWUgPSBuZXcgVGhyZWFkTG9jYWw8PigpOworCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJkcCIsIHBhcmFsbGVsID0gdHJ1ZSkKKyAgcHVibGljIE9iamVjdFtdW10gZ2V0VGVzdHMoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtde25ldyBPYmplY3RbXXsidGVzdDEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyJ0ZXN0MiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117InRlc3QzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsidGVzdDQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyJ0ZXN0NSJ9fTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkcCIpCisgIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3ROYW1lLCB0aGlzLnRlc3ROYW1lLmdldCgpKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgaW5pdChPYmplY3RbXSB0ZXN0QXJncykgeworICAgIHRlc3ROYW1lLnNldCgoU3RyaW5nKSB0ZXN0QXJnc1swXSk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd24oT2JqZWN0W10gdGVzdEFyZ3MpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpIHRlc3RBcmdzWzBdLCB0aGlzLnRlc3ROYW1lLmdldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgeworICAgIHJldHVybiB0ZXN0TmFtZS5nZXQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L25hbWUvTmFtZVNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25hbWUvTmFtZVNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzBmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9OYW1lU2FtcGxlLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSB0ZXN0Lm5hbWU7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KHRlc3ROYW1lID0gIk5BTUUiKQorcHVibGljIGNsYXNzIE5hbWVTYW1wbGUgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUodHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9uYW1lL05hbWVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9OYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOThlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9OYW1lVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACitwYWNrYWdlIHRlc3QubmFtZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgTmFtZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaXRlc3RUZXN0KCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU2ltcGxlSVRlc3RTYW1wbGUuY2xhc3MpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGFkYXB0ZXIpOworCisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWRhcHRlci5nZXRGYWlsZWRUZXN0cygpLmlzRW1wdHkoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWRhcHRlci5nZXRTa2lwcGVkVGVzdHMoKS5pc0VtcHR5KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWRhcHRlci5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMSk7CisgICAgSVRlc3RSZXN1bHQgcmVzdWx0ID0gYWRhcHRlci5nZXRQYXNzZWRUZXN0cygpLmdldCgwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJ0ZXN0Iik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TmFtZSgpLCAiTkFNRSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3ROYW1lKCksICJOQU1FIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpdGVzdFRlc3RXaXRoWG1sKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGVUZXN0cygic3VpdGUiLCBTaW1wbGVJVGVzdFNhbXBsZS5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIoYWRhcHRlcik7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEZhaWxlZFRlc3RzKCkuaXNFbXB0eSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldFNraXBwZWRUZXN0cygpLmlzRW1wdHkoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhZGFwdGVyLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgICBJVGVzdFJlc3VsdCByZXN1bHQgPSBhZGFwdGVyLmdldFBhc3NlZFRlc3RzKCkuZ2V0KDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgInRlc3QiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXROYW1lKCksICJOQU1FIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdE5hbWUoKSwgIk5BTUUiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVGVzdCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKE5hbWVTYW1wbGUuY2xhc3MpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKGFkYXB0ZXIpOworCisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWRhcHRlci5nZXRGYWlsZWRUZXN0cygpLmlzRW1wdHkoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWRhcHRlci5nZXRTa2lwcGVkVGVzdHMoKS5pc0VtcHR5KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYWRhcHRlci5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMSk7CisgICAgSVRlc3RSZXN1bHQgcmVzdWx0ID0gYWRhcHRlci5nZXRQYXNzZWRUZXN0cygpLmdldCgwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJ0ZXN0Iik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TmFtZSgpLCAiTkFNRSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3ROYW1lKCksICJOQU1FIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVRlc3RXaXRoWG1sKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGVUZXN0cygic3VpdGUiLCBOYW1lU2FtcGxlLmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcihhZGFwdGVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0RmFpbGVkVGVzdHMoKS5pc0VtcHR5KCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0U2tpcHBlZFRlc3RzKCkuaXNFbXB0eSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDEpOworICAgIElUZXN0UmVzdWx0IHJlc3VsdCA9IGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAidGVzdCIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldE5hbWUoKSwgIk5BTUUiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0TmFtZSgpLCAiTkFNRSIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbm9OYW1lVGVzdCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKE5vTmFtZVNhbXBsZS5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIoYWRhcHRlcik7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEZhaWxlZFRlc3RzKCkuaXNFbXB0eSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldFNraXBwZWRUZXN0cygpLmlzRW1wdHkoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhZGFwdGVyLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgICBJVGVzdFJlc3VsdCByZXN1bHQgPSBhZGFwdGVyLmdldFBhc3NlZFRlc3RzKCkuZ2V0KDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgInRlc3QiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXROYW1lKCksICJ0ZXN0Iik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdE5hbWUoKSwgbnVsbCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBub05hbWVUZXN0V2l0aFhtbCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlVGVzdHMoInN1aXRlIiwgTm9OYW1lU2FtcGxlLmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcihhZGFwdGVyKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0RmFpbGVkVGVzdHMoKS5pc0VtcHR5KCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0U2tpcHBlZFRlc3RzKCkuaXNFbXB0eSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDEpOworICAgIElUZXN0UmVzdWx0IHJlc3VsdCA9IGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAidGVzdCIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0LmdldE5hbWUoKSwgInRlc3QiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0TmFtZSgpLCBudWxsKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNvbXBsZXhJVGVzdFRlc3QoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShJVGVzdFNhbXBsZS5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBhZGFwdGVyID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIoYWRhcHRlcik7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEZhaWxlZFRlc3RzKCkuaXNFbXB0eSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldFNraXBwZWRUZXN0cygpLmlzRW1wdHkoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhZGFwdGVyLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCA1KTsKKyAgICBMaXN0PFN0cmluZz4gdGVzdE5hbWVzID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3QoInRlc3QxIiwgInRlc3QyIiwgInRlc3QzIiwgInRlc3Q0IiwgInRlc3Q1IikpOworICAgIGZvciAoSVRlc3RSZXN1bHQgdGVzdFJlc3VsdCA6IGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKSkgeworICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdE5hbWVzLnJlbW92ZSh0ZXN0UmVzdWx0LmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHRlc3QgbmFtZXMgIiArIGdldE5hbWVzKGFkYXB0ZXIuZ2V0UGFzc2VkVGVzdHMoKSkpOworICAgIH0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3ROYW1lcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKExpc3Q8SVRlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKKyAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4ocmVzdWx0cy5zaXplKCkpOworICAgIGZvciAoSVRlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgbmFtZXMuYWRkKHJlc3VsdC5nZXROYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gbmFtZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9uYW1lL05vTmFtZVNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25hbWUvTm9OYW1lU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkMzk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9uYW1lL05vTmFtZVNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5uYW1lOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgTm9OYW1lU2FtcGxlIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRydWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbmFtZS9TaW1wbGVJVGVzdFNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25hbWUvU2ltcGxlSVRlc3RTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25hbWUvU2ltcGxlSVRlc3RTYW1wbGUuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QubmFtZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2ltcGxlSVRlc3RTYW1wbGUgaW1wbGVtZW50cyBJVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cnVlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgeworICAgIHJldHVybiAiTkFNRSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9uZXN0ZWQvR2FyZlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9uZXN0ZWQvR2FyZlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VhN2VkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25lc3RlZC9HYXJmVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5uZXN0ZWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0Lm5lc3RlZC5mb28uQWNjb3VudFR5cGVFbnVtOworCitAVGVzdChncm91cHMgPSB7ICJ1bml0dGVzdCIgfSwgZW5hYmxlZCA9IHRydWUgKQorcHVibGljIGNsYXNzIEdhcmZUZXN0IHsKKworICBAVGVzdCgpCisgIHB1YmxpYyB2b2lkIHRlc3RHYXJmKCkgeworICAgIEFjY291bnRUeXBlRW51bSBmb28gPSBBY2NvdW50VHlwZUVudW0uQ2xlYXJpbmdNZW1iZXI7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb28sQWNjb3VudFR5cGVFbnVtLkNsZWFyaW5nTWVtYmVyKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvbmVzdGVkL2Zvby9BY2NvdW50VHlwZUVudW0uamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9uZXN0ZWQvZm9vL0FjY291bnRUeXBlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4M2YzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvbmVzdGVkL2Zvby9BY2NvdW50VHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgdGVzdC5uZXN0ZWQuZm9vOworCitwdWJsaWMgY2xhc3MgQWNjb3VudFR5cGVFbnVtIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjY291bnRUeXBlRW51bSBDbGVhcmluZ01lbWJlciA9IG51bGw7CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9uZXN0ZWQyL1RtcEEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9uZXN0ZWQyL1RtcEEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQzNzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L25lc3RlZDIvVG1wQS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5uZXN0ZWQyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVG1wQSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmVzdGVkQVdpdGhUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5lc3RlZEEoKSB7fQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBOZXN0ZWRBV2l0aG91dFRlc3QgeworICAgIHB1YmxpYyBOZXN0ZWRBV2l0aG91dFRlc3QoKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdE5HIHNob3VsZCBub3QgaW5zdGFudGlhdGUgbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXN0ZWRBKCkge30KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXlCYXNlIHt9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBOZXN0ZWRBV2l0aEluaGVyaXRlZFRlc3QgZXh0ZW5kcyBEdW1teUJhc2UgeworICAgIHB1YmxpYyB2b2lkIG5lc3RlZFdpdGhJbmhlcml0ZWRUZXN0KCkge30KKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQmFkTWV0aG9kRmFjdG9yeUZhY3RvcnkuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0JhZE1ldGhvZEZhY3RvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxZjEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0JhZE1ldGhvZEZhY3RvcnlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0Lm9iamVjdGZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLk9iamVjdEZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBIYW5pIFN1bGVpbWFuCisgKiAgICAgICAgIERhdGU6IE1hciA2LCAyMDA3CisgKiAgICAgICAgIFRpbWU6IDU6MDM6MTkgUE0KKyAqLworcHVibGljIGNsYXNzIEJhZE1ldGhvZEZhY3RvcnlGYWN0b3J5Cit7CisgIEBPYmplY3RGYWN0b3J5CisgIHB1YmxpYyBPYmplY3QgY3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgTG9nZ2luZ09iamVjdEZhY3RvcnkoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ2xhc3NPYmplY3RGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9DbGFzc09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQzZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ2xhc3NPYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0Lm9iamVjdGZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLklPYmplY3RGYWN0b3J5MjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCitwdWJsaWMgY2xhc3MgQ2xhc3NPYmplY3RGYWN0b3J5IGltcGxlbWVudHMgSU9iamVjdEZhY3RvcnkyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzczw/PiBjbHMpIHsKKyAgICB0cnkgeworICAgICAgQ29uc3RydWN0b3IgY3RvciA9IGNscy5nZXRDb25zdHJ1Y3RvcnMoKVswXTsKKyAgICAgIHJldHVybiBjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IDQyIH0pOworICAgIH0KKyAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0NsYXNzT2JqZWN0RmFjdG9yeVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0NsYXNzT2JqZWN0RmFjdG9yeVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JkMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ2xhc3NPYmplY3RGYWN0b3J5U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5vYmplY3RmYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2xhc3NPYmplY3RGYWN0b3J5U2FtcGxlVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgaW50IG1fbiA9IDA7CisKKyAgLyoqCisgICAqIFdpbGwgYmUgaW52b2tlZCB3aXRoIDQyIGJ5IHRoZSBmYWN0b3J5LgorICAgKi8KKyAgcHVibGljIENsYXNzT2JqZWN0RmFjdG9yeVNhbXBsZVRlc3QoaW50IG4pIHsKKyAgICBtX24gPSBuOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQyLCBtX24pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Db21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5U2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Db21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5U2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwODc2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0NvbWJpbmVkVGVzdEFuZE9iamVjdEZhY3RvcnlTYW1wbGUuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3Qub2JqZWN0ZmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuSU9iamVjdEZhY3Rvcnk7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuT2JqZWN0RmFjdG9yeTsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsNCisNCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikNCitwdWJsaWMgY2xhc3MgQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVNhbXBsZSBpbXBsZW1lbnRzIElPYmplY3RGYWN0b3J5ew0KKyAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZWQgPSBmYWxzZTsNCisNCisgIEBPYmplY3RGYWN0b3J5IHB1YmxpYyBJT2JqZWN0RmFjdG9yeSBjcmVhdGUoKSB7DQorICAgIHJldHVybiBuZXcgQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVNhbXBsZSgpOw0KKyAgfQ0KKw0KKyAgQFRlc3QgcHVibGljIHZvaWQgaXNDb25maWd1cmVkKCkgew0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWd1cmVkLCAiU2hvdWxkIGhhdmUgYmVlbiBjb25maWd1cmVkIGJ5IG9iamVjdCBmYWN0b3J5Iik7DQorICB9DQorDQorICBAT3ZlcnJpZGUNCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgT2JqZWN0Li4uIHBhcmFtcykgIHsNCisgICAgT2JqZWN0IG87DQorICAgIHRyeSB7DQorICAgICAgbyA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHBhcmFtcyk7DQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQorICAgIH0NCisgICAgaWYgKENvbWJpbmVkVGVzdEFuZE9iamVjdEZhY3RvcnlTYW1wbGUuY2xhc3MuZXF1YWxzKG8uZ2V0Q2xhc3MoKSkpIHsNCisgICAgICBDb21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5U2FtcGxlIHMgPSAoQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVNhbXBsZSkgbzsNCisgICAgICBzLmNvbmZpZ3VyZWQgPSB0cnVlOw0KKyAgICB9DQorICAgIHJldHVybiBvOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Db21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODIxNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIHRlc3Qub2JqZWN0ZmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsNCisNCitwdWJsaWMgY2xhc3MgQ29tYmluZWRUZXN0QW5kT2JqZWN0RmFjdG9yeVRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7DQorICBAVGVzdA0KKyAgdm9pZCBjb21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5KCkgew0KKyAgICBhZGRDbGFzcyhDb21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5U2FtcGxlLmNsYXNzLmdldE5hbWUoKSk7DQorICAgIHJ1bigpOw0KKyAgICB2ZXJpZnlUZXN0cygiU2hvdWxkIGhhdmUgcGFzc2VkIiwgbmV3IFN0cmluZ1tdeyJpc0NvbmZpZ3VyZWQifSwgZ2V0UGFzc2VkVGVzdHMoKSk7DQorICAgIHZlcmlmeVRlc3RzKCJGYWlsdXJlcyIsIG5ldyBTdHJpbmdbMF0sIGdldEZhaWxlZFRlc3RzKCkpOw0KKyAgICB2ZXJpZnlUZXN0cygiU2tpcHBlZCIsIG5ldyBTdHJpbmdbMF0sIGdldFNraXBwZWRUZXN0cygpKTsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsNCisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHtDb21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5U2FtcGxlLmNsYXNzfSk7DQorICAgIHRuZy5zZXRWZXJib3NlKDEwKTsNCisgICAgdG5nLnJ1bigpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Db250ZXh0QXdhcmVGYWN0b3J5RmFjdG9yeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ29udGV4dEF3YXJlRmFjdG9yeUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRmZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvQ29udGV4dEF3YXJlRmFjdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3Qub2JqZWN0ZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5PYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwuT2JqZWN0RmFjdG9yeUltcGw7CisKKy8qKgorICogQGF1dGhvciBIYW5pIFN1bGVpbWFuCisgKiAgICAgICAgIERhdGU6IE1hciA4LCAyMDA3CisgKiAgICAgICAgIFRpbWU6IDEwOjA1OjU1IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZXh0QXdhcmVGYWN0b3J5RmFjdG9yeQoreworICBAT2JqZWN0RmFjdG9yeQorICBwdWJsaWMgSU9iamVjdEZhY3RvcnkgY3JlYXRlKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKKyAgICByZXR1cm4gbmV3IE9iamVjdEZhY3RvcnlJbXBsKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0N1c3RvbUZhY3RvcnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9DdXN0b21GYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9DdXN0b21GYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2UgdGVzdC5vYmplY3RmYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgdGVzdC5UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbiBEYXRlOiBNYXIgNiwgMjAwNyBUaW1lOiAzOjUyOjE5IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21GYWN0b3J5VGVzdCB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlPblRlc3RORygpIHsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IFRlc3RIZWxwZXIuY3JlYXRlU3VpdGUoInRlc3Qub2JqZWN0ZmFjdG9yeS5TaW1wbGUiLCAib2JqZWN0ZmFjdG9yeSIpOworICAgIC8vIHN1aXRlLnNldE9iamVjdEZhY3RvcnkobmV3IExvZ2dpbmdPYmplY3RGYWN0b3J5KCkpOworICAgIFRlc3RORyB0bmcgPSBUZXN0SGVscGVyLmNyZWF0ZVRlc3RORyhzdWl0ZSk7CisgICAgdG5nLnNldE9iamVjdEZhY3RvcnkoTG9nZ2luZ09iamVjdEZhY3RvcnkuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnQgTG9nZ2luZ09iamVjdEZhY3RvcnkuaW52b2tlZCA9PSAxIDogIkxvZ2dpbmcgZmFjdG9yeSBpbnZva2VkICIKKyAgICAgICAgKyBMb2dnaW5nT2JqZWN0RmFjdG9yeS5pbnZva2VkICsgIiB0aW1lcyI7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgcmVzZXRDb3VudCgpIHsKKyAgICBMb2dnaW5nT2JqZWN0RmFjdG9yeS5pbnZva2VkID0gMDsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlPblN1aXRlKCkgeworICAgIFhtbFN1aXRlIHN1aXRlID0gVGVzdEhlbHBlci5jcmVhdGVTdWl0ZSgidGVzdC5vYmplY3RmYWN0b3J5LlNpbXBsZSIsICJvYmplY3RmYWN0b3J5Iik7CisgICAgc3VpdGUuc2V0T2JqZWN0RmFjdG9yeShuZXcgTG9nZ2luZ09iamVjdEZhY3RvcnkoKSk7CisgICAgVGVzdE5HIHRuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKHN1aXRlKTsKKyAgICB0bmcucnVuKCk7CisgICAgYXNzZXJ0IExvZ2dpbmdPYmplY3RGYWN0b3J5Lmludm9rZWQgPT0gMSA6ICJMb2dnaW5nIGZhY3RvcnkgaW52b2tlZCAiCisgICAgICAgICsgTG9nZ2luZ09iamVjdEZhY3RvcnkuaW52b2tlZCArICIgdGltZXMiOworICB9CisKKyAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlLCBkZXNjcmlwdGlvbiA9ICJUaGlzIGJyb2tlIGFmdGVyIEkgbWFkZSB0aGUgY2hhbmdlIHRvIGVuYWJsZSBBYnN0cmFjdFRlc3QiKQorICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5QnlBbm5vdGF0aW9uKCkgeworICAgIFhtbFN1aXRlIHN1aXRlID0gVGVzdEhlbHBlci5jcmVhdGVTdWl0ZSgidGVzdC5vYmplY3RmYWN0b3J5LlNpbXBsZSIsICJvYmplY3RmYWN0b3J5Iik7CisgICAgc3VpdGUuZ2V0VGVzdHMoKS5nZXQoMCkuZ2V0WG1sQ2xhc3NlcygpCisgICAgICAgIC5hZGQobmV3IFhtbENsYXNzKCJ0ZXN0Lm9iamVjdGZhY3RvcnkuTXlGYWN0b3J5RmFjdG9yeSIpKTsKKyAgICBUZXN0TkcgdG5nID0gVGVzdEhlbHBlci5jcmVhdGVUZXN0Tkcoc3VpdGUpOworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnQgTG9nZ2luZ09iamVjdEZhY3RvcnkuaW52b2tlZCA9PSAxIDogIkxvZ2dpbmcgZmFjdG9yeSBpbnZva2VkICIKKyAgICAgICAgKyBMb2dnaW5nT2JqZWN0RmFjdG9yeS5pbnZva2VkICsgIiB0aW1lcyI7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYWN0b3J5UmVjZWl2ZXNDb250ZXh0KCkgeworICAgIFhtbFN1aXRlIHN1aXRlID0gVGVzdEhlbHBlci5jcmVhdGVTdWl0ZSgidGVzdC5vYmplY3RmYWN0b3J5LlNpbXBsZSIsICJvYmplY3RmYWN0b3J5Iik7CisgICAgc3VpdGUuZ2V0VGVzdHMoKS5nZXQoMCkuZ2V0WG1sQ2xhc3NlcygpCisgICAgICAgIC5hZGQobmV3IFhtbENsYXNzKCJ0ZXN0Lm9iamVjdGZhY3RvcnkuQ29udGV4dEF3YXJlRmFjdG9yeUZhY3RvcnkiKSk7CisgICAgVGVzdE5HIHRuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKHN1aXRlKTsKKyAgICB0bmcucnVuKCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBUZXN0TkdFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHNldEludmFsaWRNZXRob2RGYWN0b3J5QnlBbm5vdGF0aW9uKCkgeworICAgIFhtbFN1aXRlIHN1aXRlID0gVGVzdEhlbHBlci5jcmVhdGVTdWl0ZSgidGVzdC5vYmplY3RmYWN0b3J5LlNpbXBsZSIsICJvYmplY3RmYWN0b3J5Iik7CisgICAgc3VpdGUuZ2V0VGVzdHMoKS5nZXQoMCkuZ2V0WG1sQ2xhc3NlcygpCisgICAgICAgIC5hZGQobmV3IFhtbENsYXNzKCJ0ZXN0Lm9iamVjdGZhY3RvcnkuQmFkTWV0aG9kRmFjdG9yeUZhY3RvcnkiKSk7CisgICAgVGVzdE5HIHRuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKHN1aXRlKTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L0xvZ2dpbmdPYmplY3RGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Mb2dnaW5nT2JqZWN0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2Q2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9Mb2dnaW5nT2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC5vYmplY3RmYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC5PYmplY3RGYWN0b3J5SW1wbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCisvKioKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbgorICogICAgICAgICBEYXRlOiBNYXIgNiwgMjAwNworICogICAgICAgICBUaW1lOiAzOjUzOjI4IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnaW5nT2JqZWN0RmFjdG9yeSBleHRlbmRzIE9iamVjdEZhY3RvcnlJbXBsCit7CisgIC8qKgorICAgKgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM5NTA5NjY1MDg2NjcyNzQ4MEw7CisgIHB1YmxpYyBzdGF0aWMgaW50IGludm9rZWQ7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ29uc3RydWN0b3IgY29uc3RydWN0b3IsIE9iamVjdC4uLiBwYXJhbXMpCisgIHsKKyAgICBpbnZva2VkKys7CisgICAgcmV0dXJuIHN1cGVyLm5ld0luc3RhbmNlKGNvbnN0cnVjdG9yLCBwYXJhbXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9NeUZhY3RvcnlGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9NeUZhY3RvcnlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmN2I5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L015RmFjdG9yeUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3Qub2JqZWN0ZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSU9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5PYmplY3RGYWN0b3J5OworCisvKioKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbgorICogICAgICAgICBEYXRlOiBNYXIgNiwgMjAwNworICogICAgICAgICBUaW1lOiA1OjAzOjE5IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBNeUZhY3RvcnlGYWN0b3J5Cit7CisgIEBPYmplY3RGYWN0b3J5CisgIHB1YmxpYyBJT2JqZWN0RmFjdG9yeSBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBMb2dnaW5nT2JqZWN0RmFjdG9yeSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9PYmplY3RGYWN0b3J5MlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L09iamVjdEZhY3RvcnkyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzEzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb2JqZWN0ZmFjdG9yeS9PYmplY3RGYWN0b3J5MlRlc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIHRlc3Qub2JqZWN0ZmFjdG9yeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IHRlc3QuVGVzdEhlbHBlcjsKKworLyoqCisgKiBUZXN0IElPYmplY3RGYWN0b3J5Miwgd2hpY2ggaXMgYW4gb2JqZWN0IGZhY3RvcnkgdGhhdCByZWNlaXZlcyBqdXN0IHRoZSBDbGFzcyBpbiBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5MlRlc3QgeworCisgIHByaXZhdGUgdm9pZCB0ZXN0RmFjdG9yeShib29sZWFuIG9uU3VpdGUpIHsKKyAgICBYbWxTdWl0ZSBzdWl0ZSA9IFRlc3RIZWxwZXIuY3JlYXRlU3VpdGUoQ2xhc3NPYmplY3RGYWN0b3J5U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICJUZXN0IElPYmplY3RGYWN0b3J5MiIpOworICAgIFRlc3RORyB0bmcgPSBUZXN0SGVscGVyLmNyZWF0ZVRlc3RORyhzdWl0ZSk7CisKKyAgICBpZiAob25TdWl0ZSkgc3VpdGUuc2V0T2JqZWN0RmFjdG9yeShuZXcgQ2xhc3NPYmplY3RGYWN0b3J5KCkpOworICAgIGVsc2UgdG5nLnNldE9iamVjdEZhY3RvcnkoQ2xhc3NPYmplY3RGYWN0b3J5LmNsYXNzKTsKKworICAgIENsYXNzT2JqZWN0RmFjdG9yeVNhbXBsZVRlc3QubV9uID0gMDsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDbGFzc09iamVjdEZhY3RvcnlTYW1wbGVUZXN0Lm1fbiwgNDIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFjdG9yeU9uU3VpdGVTaG91bGRXb3JrKCkgeworICAgIHRlc3RGYWN0b3J5KHRydWUgLyogb24gc3VpdGUgb2JqZWN0ICovKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGZhY3RvcnlPblRlc3ROR1Nob3VsZFdvcmsoKSB7CisgICAgdGVzdEZhY3RvcnkoZmFsc2UgLyogb24gVGVzdE5HIG9iamVjdCAqLyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L1NpbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L29iamVjdGZhY3RvcnkvU2ltcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhNTE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9vYmplY3RmYWN0b3J5L1NpbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5vYmplY3RmYWN0b3J5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIEBhdXRob3IgSGFuaSBTdWxlaW1hbgorICogICAgICAgICBEYXRlOiBNYXIgNiwgMjAwNworICogICAgICAgICBUaW1lOiAzOjU2OjU3IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGUKK3sKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZHVtbXkoKSB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L292ZXJyaWRlL092ZXJyaWRlU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L292ZXJyaWRlL092ZXJyaWRlU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGE3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb3ZlcnJpZGUvT3ZlcnJpZGVTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0Lm92ZXJyaWRlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVTYW1wbGVUZXN0IHsKKworICBAVGVzdChncm91cHMgPSAiZ29vZEdyb3VwIikKKyAgcHVibGljIHZvaWQgZ29vZCgpIHsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJiYWRHcm91cCIpCisgIHB1YmxpYyB2b2lkIGJhZCgpIHsKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBoYXBwZW4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L292ZXJyaWRlL092ZXJyaWRlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L292ZXJyaWRlL092ZXJyaWRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTgzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvb3ZlcnJpZGUvT3ZlcnJpZGVUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSB0ZXN0Lm92ZXJyaWRlOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBWZXJpZnkgdGhhdCBjb21tYW5kIGxpbmUgc3dpdGNoZXMgb3ZlcnJpZGUgcGFyYW1ldGVycyBpbiB0ZXN0bmcueG1sLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICovCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KFN0cmluZyBpbmNsdWRlLCBTdHJpbmcgZXhjbHVkZSkgeworICAgIEZpbGUgZiA9IFV0aWxzLmNyZWF0ZVRlbXBGaWxlKAorICAgICAgICAiPHN1aXRlIG5hbWU9XCJTXCI+IgorICAgICAgICArICIgIDx0ZXN0IG5hbWU9XCJUXCI+IgorICAgICAgICArICIgICAgPGNsYXNzZXM+IgorICAgICAgICArICIgICAgICA8Y2xhc3MgbmFtZT1cInRlc3Qub3ZlcnJpZGUuT3ZlcnJpZGVTYW1wbGVUZXN0XCIgLz4iCisgICAgICAgICsgIiAgICA8L2NsYXNzZXM+IgorICAgICAgICArICIgIDwvdGVzdD4iCisgICAgICAgICsgIjwvc3VpdGU+IgorICAgICAgICApOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgaWYgKGluY2x1ZGUgIT0gbnVsbCkgdG5nLnNldEdyb3VwcyhpbmNsdWRlKTsKKyAgICBpZiAoZXhjbHVkZSAhPSBudWxsKSB0bmcuc2V0RXhjbHVkZWRHcm91cHMoZXhjbHVkZSk7CisgICAgdG5nLnNldFRlc3RTdWl0ZXMoQXJyYXlzLmFzTGlzdChmLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDEpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiT3ZlcnJpZGUgLWdyb3VwcyIpCisgIHB1YmxpYyB2b2lkIG92ZXJyaWRlSW5jbHVkZVNob3VsZFdvcmsoKQorICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJ1blRlc3QoImdvb2RHcm91cCIsIG51bGwpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiT3ZlcnJpZGUgLWV4Y2x1ZGVncm91cHMiKQorICBwdWJsaWMgdm9pZCBvdmVycmlkZUV4Y2x1ZGVTaG91bGRXb3JrKCkKKyAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBydW5UZXN0KG51bGwsICJiYWRHcm91cCIpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiT3ZlcnJpZGUgLWdyb3VwcyBhbmQgLWV4Y2x1ZGVncm91cHMiKQorICBwdWJsaWMgdm9pZCBvdmVycmlkZUluY2x1ZGVBbmRFeGNsdWRlU2hvdWxkV29yaygpCisgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcnVuVGVzdCgiZ29vZEdyb3VwIiwgImJhZEdyb3VwIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL0JlZm9yZVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL0JlZm9yZVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdkZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvQmVmb3JlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVTYW1wbGVUZXN0IHsKKyAgIEBCZWZvcmVNZXRob2QKKyAgIEBQYXJhbWV0ZXJzKCJwYXJhbWV0ZXIiKQorICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZU1ldGhvZChTdHJpbmcgcGFyYW1ldGVyKSB7CisgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInBhcmFtZXRlciB2YWx1ZSIsIHBhcmFtZXRlcik7CisgICB9CisKKyAgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJkYXRhUHJvdmlkZXIiKQorICAgcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIGRhdGFQcm92aWRlcigpIHsKKyAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtde3siYWJjIiwgImRlZiJ9fTsKKyAgIH0KKworICAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRhdGFQcm92aWRlciIpCisgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEV4YW1wbGUoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImFiYyIsIGEpOworICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJkZWYiLCBiKTsKKyAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9Jbmhlcml0RnJvbVN1aXRlQ2hpbGQxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9Jbmhlcml0RnJvbVN1aXRlQ2hpbGQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3NWFiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL0luaGVyaXRGcm9tU3VpdGVDaGlsZDEuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIHRlc3QucGFyYW1ldGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuT3B0aW9uYWw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBwYXJhbWV0ZXJzIGZyb20gcGFyZW50IHN1aXRlIGFyZSBwYXNzZWQgb250byB0aGUKKyAqIGNoaWxkIHN1aXRlIChyZWZlcnJlZCBieSA8c3VpdGUtZmlsZT4pCisgKiBAYXV0aG9yIG51bGxpbgorICoKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRGcm9tU3VpdGVDaGlsZDEKK3sKKyAgIEBUZXN0CisgICBAUGFyYW1ldGVycyh7InBhcmFtZXRlcjEiLCAicGFyYW1ldGVyMiIsICJwYXJhbWV0ZXIzIiwgInBhcmFtZXRlcjQifSkKKyAgIHB1YmxpYyB2b2lkIGluaGVyaXRlZHBhcmFtZXRlcihTdHJpbmcgcDEsIFN0cmluZyBwMiwgQE9wdGlvbmFsKCJmb29iYXIiKVN0cmluZyBwMywgU3RyaW5nIHA0KSB7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHAxLCAicDEiKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocDIsICJjMXAyIik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHAzLCAiZm9vYmFyIik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHA0LCAiYzFwNCIpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvSW5oZXJpdEZyb21TdWl0ZUNoaWxkMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvSW5oZXJpdEZyb21TdWl0ZUNoaWxkMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZmFlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9Jbmhlcml0RnJvbVN1aXRlQ2hpbGQyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LnBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgcGFyYW1ldGVycyBmcm9tIHBhcmVudCBzdWl0ZSBhcmUgcGFzc2VkIG9udG8gdGhlCisgKiBjaGlsZCBzdWl0ZSAocmVmZXJyZWQgYnkgPHN1aXRlLWZpbGU+KQorICogQGF1dGhvciBudWxsaW4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbmhlcml0RnJvbVN1aXRlQ2hpbGQyCit7CisgICBAVGVzdAorICAgQFBhcmFtZXRlcnMoeyJwYXJhbWV0ZXIxIiwgInBhcmFtZXRlcjIiLCAicGFyYW1ldGVyMyIsICJwYXJhbWV0ZXI0In0pCisgICBwdWJsaWMgdm9pZCBpbmhlcml0ZWRwYXJhbWV0ZXIoU3RyaW5nIHAxLCBTdHJpbmcgcDIsIFN0cmluZyBwMywgQE9wdGlvbmFsKCJhYmMiKVN0cmluZyBwNCkgeworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwMSwgInAxIik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHAyLCAiYzJwMiIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwMywgImMycDMiKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocDQsICJhYmMiKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL0luaGVyaXRGcm9tU3VpdGVDaGlsZDMuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL0luaGVyaXRGcm9tU3VpdGVDaGlsZDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYxNjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvSW5oZXJpdEZyb21TdWl0ZUNoaWxkMy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBwYXJhbWV0ZXJzIGZyb20gcGFyZW50IHN1aXRlIGFyZSBwYXNzZWQgb250byB0aGUKKyAqIGNoaWxkIHN1aXRlIChyZWZlcnJlZCBieSA8c3VpdGUtZmlsZT4pCisgKiBAYXV0aG9yIG51bGxpbgorICoKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRGcm9tU3VpdGVDaGlsZDMKK3sKKyAgIEBUZXN0CisgICBAUGFyYW1ldGVycyh7InBhcmFtZXRlcjEiLCAicGFyYW1ldGVyMiIsICJwYXJhbWV0ZXIzIiwgInBhcmFtZXRlcjQifSkKKyAgIHB1YmxpYyB2b2lkIGluaGVyaXRlZHBhcmFtZXRlcihTdHJpbmcgcDEsIFN0cmluZyBwMiwgU3RyaW5nIHAzLCBTdHJpbmcgcDQpIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocDEsICJwMSIpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwMiwgImMzcDIiKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocDMsICJjMnAzIik7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHA0LCAiYzNwNCIpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvT3B0aW9uYWxQYXJhbWV0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9PcHRpb25hbFBhcmFtZXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzI3MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvT3B0aW9uYWxQYXJhbWV0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLk9wdGlvbmFsOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKKworcHVibGljIGNsYXNzIE9wdGlvbmFsUGFyYW1ldGVyVGVzdCB7CisKKyAgQFBhcmFtZXRlcnMoIm9wdGlvbmFsIikKKyAgcHVibGljIE9wdGlvbmFsUGFyYW1ldGVyVGVzdChAT3B0aW9uYWwgU3RyaW5nIG9wdGlvbmFsKSB7fQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9PdmVycmlkZTFTYW1wbGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL092ZXJyaWRlMVNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjEzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9PdmVycmlkZTFTYW1wbGUuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIHRlc3QucGFyYW1ldGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgT3ZlcnJpZGUxU2FtcGxlIHsKKworICBAUGFyYW1ldGVycyh7IkluaGVyaXRlZEZyb21TdWl0ZSIsICJJbmhlcml0ZWRGcm9tVGVzdCIsICJJbmhlcml0ZWRGcm9tQ2xhc3MifSkKKyAgcHVibGljIHZvaWQgZyhTdHJpbmcgc3VpdGUsIFN0cmluZyB0ZXN0LCBTdHJpbmcgY2xzKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdWl0ZSwgIkluaGVyaXRlZEZyb21TdWl0ZSIpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdCwgIkluaGVyaXRlZEZyb21UZXN0Iik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjbHMsICJJbmhlcml0ZWRGcm9tQ2xhc3MiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGgoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJoKCkiKTsKKyAgfQorCisgIEBQYXJhbWV0ZXJzKCJhIikKKyAgcHVibGljIHZvaWQgZihTdHJpbmcgcCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocCwgIkNvcnJlY3QiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvUGFyYW1Jbmhlcml0YW5jZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtSW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNDhjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtSW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSB0ZXN0LnBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgUGFyYW1Jbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiV2hlbiB2ZXJib3NlIGlzIHNldCB0byA+MSwgVE5HIHByaW50cyB0ZXN0IHJlc3VsdHMgb24gQ0xJIHdoaWNoIGFyZSBwcmludGVkICIKKyAgICAgICsgInVzaW5nIFN1aXRlUmVzdWx0Q291bnRzLmNhbGN1bGF0ZVJlc3VsdENvdW50cygpLiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0aHJvd2luZyBOUEUgIgorICAgICAgKyAiYmVjYXVzZSBpdCdzIHVuYWJsZSB0byBmaW5kIFN1aXRlUnVubmVyIGluIEhhc2hNYXAsIGJlY2F1c2UgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBpbiAiCisgICAgICArICJTdWl0ZVJ1bm5lciBjaGFuZ2VkIiArICIgZHVyaW5nIGV4ZWN1dGlvbi4gVGhpcyB0ZXN0IG1ha2VzIHN1cmUgd2UgZG9udCBydW4gaW50byBhbnkgTlBFcyIpCisgIHB1YmxpYyB2b2lkIG5vTlBFSW5Db3VudGluZ1Jlc3VsdHMoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KGdldFBhdGhUb1Jlc291cmNlKCJwYXJhbS1pbmhlcml0YW5jZS9wYXJlbnQtc3VpdGUueG1sIikpKTsKKyAgICB0bmcuc2V0VmVyYm9zZSgyKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgUHJpbnRTdHJlYW0gb3V0ID0gU3lzdGVtLm91dDsKKyAgICBQcmludFN0cmVhbSBlcnIgPSBTeXN0ZW0uZXJyOworICAgIHRyeSB7CisgICAgICAvKgorICAgICAgICogQ2hhbmdpbmcgc3lzdGVtIHByaW50IHN0cmVhbXMgc28gdGhhdCBleGNlcHRpb24gb3IgcmVzdWx0cyBzdG10IGlzIG5vdCBsb2dnZWQKKyAgICAgICAqIHdoaWxlIHJ1bm5pbmcgdGVzdCAoYXZvaWQgY29uZnVzaW5nIHBlcnNvbiBydW5uaW5nIHRlc3RzKQorICAgICAgICovCisgICAgICBTeXN0ZW0uc2V0T3V0KG5ldyBQcmludFN0cmVhbShvcykpOworICAgICAgU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3MpKTsKKyAgICAgIHRuZy5ydW4oKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICB0cnkgeworICAgICAgICBvcy5jbG9zZSgpOworICAgICAgfQorICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy9ubyBuZWVkIHRvIGhhbmRsZSB0aGlzCisgICAgICB9CisgICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7CisgICAgICBTeXN0ZW0uc2V0RXJyKGVycik7CisgICAgfQorICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiQ2hlY2tzIHRvIG1ha2Ugc3VyZSBwYXJhbWV0ZXJzIGFyZSBpbmhlcml0ZWQgYW5kIG92ZXJyaWRkZW4gcHJvcGVybHkiKQorICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJJbmhlcml0YW5jZUFuZE92ZXJyaWRpbmcoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0VXNlRGVmYXVsdExpc3RlbmVycyhmYWxzZSk7CisgICAgdG5nLnNldFRlc3RTdWl0ZXMoQXJyYXlzLmFzTGlzdChnZXRQYXRoVG9SZXNvdXJjZSgicGFyYW1ldGVydGVzdC9wYXJlbnQtc3VpdGUueG1sIikpKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9QYXJhbWV0ZXJPdmVycmlkZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtZXRlck92ZXJyaWRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9QYXJhbWV0ZXJPdmVycmlkZVRlc3QuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIHRlc3QucGFyYW1ldGVyczsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sSW5jbHVkZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJPdmVycmlkZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIGVudW0gUyB7CisgICAgRkFJTCwKKyAgICBQQVNTX1RFU1QsCisgICAgUEFTU19DTEFTUywKKyAgICBQQVNTX0lOQ0xVREUsCisgIH07CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlU3VpdGUoKSB7CisgICAgcHJpdmF0ZVRlc3RPdmVycmlkZVN1aXRlKFMuUEFTU19URVNUKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVTdWl0ZU5lZ2F0aXZlKCkgeworICAgIHByaXZhdGVUZXN0T3ZlcnJpZGVTdWl0ZShTLkZBSUwpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2xhc3NPdmVycmlkZVN1aXRlKCkgeworICAgIHByaXZhdGVUZXN0T3ZlcnJpZGVTdWl0ZShTLlBBU1NfQ0xBU1MpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgIHB1YmxpYyB2b2lkIGNsYXNzT3ZlcnJpZGVTdWl0ZU5lZ2F0aXZlKCkgeworICAgIHByaXZhdGVUZXN0T3ZlcnJpZGVTdWl0ZShTLkZBSUwpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgaW5jbHVkZU92ZXJyaWRlQ2xhc3MoKSB7CisgICAgcHJpdmF0ZVRlc3RPdmVycmlkZVN1aXRlKFMuUEFTU19JTkNMVURFKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICBwdWJsaWMgdm9pZCBpbmNsdWRlT3ZlcnJpZGVDbGFzc05lZ2F0aXZlKCkgeworICAgIHByaXZhdGVUZXN0T3ZlcnJpZGVTdWl0ZShTLkZBSUwpOworICB9CisKKyAgcHVibGljIHZvaWQgcHJpdmF0ZVRlc3RPdmVycmlkZVN1aXRlKFMgc3RhdHVzKSB7CisgICAgWG1sU3VpdGUgcyA9IGNyZWF0ZVhtbFN1aXRlKCJzIik7CisgICAgcy5nZXRQYXJhbWV0ZXJzKCkucHV0KCJhIiwgIkluY29ycmVjdCIpOworICAgIHMuZ2V0UGFyYW1ldGVycygpLnB1dCgiSW5oZXJpdGVkRnJvbVN1aXRlIiwgIkluaGVyaXRlZEZyb21TdWl0ZSIpOworICAgIFhtbFRlc3QgdCA9IGNyZWF0ZVhtbFRlc3QocywgInQiKTsKKyAgICB0LmdldExvY2FsUGFyYW1ldGVycygpLnB1dCgiSW5oZXJpdGVkRnJvbVRlc3QiLCAiSW5oZXJpdGVkRnJvbVRlc3QiKTsKKyAgICBpZiAoc3RhdHVzID09IFMuUEFTU19URVNUKSB7CisgICAgICB0LmdldExvY2FsUGFyYW1ldGVycygpLnB1dCgiYSIsICJDb3JyZWN0Iik7CisgICAgfQorCisgICAgeworICAgICAgWG1sQ2xhc3MgYzEgPSBuZXcgWG1sQ2xhc3MoT3ZlcnJpZGUxU2FtcGxlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICBjMS5nZXRMb2NhbFBhcmFtZXRlcnMoKS5wdXQoIkluaGVyaXRlZEZyb21DbGFzcyIsICJJbmhlcml0ZWRGcm9tQ2xhc3MiKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5QQVNTX0NMQVNTKSB7CisgICAgICAgIGMxLmdldExvY2FsUGFyYW1ldGVycygpLnB1dCgiYSIsICJDb3JyZWN0Iik7CisgICAgICB9CisgICAgICB0LmdldFhtbENsYXNzZXMoKS5hZGQoYzEpOworCisgICAgICBmb3IgKFN0cmluZyBtZXRob2QgOiBuZXcgU3RyaW5nW10geyAiZiIsICJnIiB9KSB7CisgICAgICAgIFhtbEluY2x1ZGUgaW5jbHVkZTEgPSBuZXcgWG1sSW5jbHVkZShtZXRob2QpOworICAgICAgICBpZiAoc3RhdHVzID09IFMuUEFTU19JTkNMVURFKSB7CisgICAgICAgICAgaW5jbHVkZTEuZ2V0TG9jYWxQYXJhbWV0ZXJzKCkucHV0KCJhIiwgIkNvcnJlY3QiKTsKKyAgICAgICAgfQorICAgICAgICBpbmNsdWRlMS5zZXRYbWxDbGFzcyhjMSk7CisgICAgICAgIGMxLmdldEluY2x1ZGVkTWV0aG9kcygpLmFkZChpbmNsdWRlMSk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4ocy50b1htbCgpKTsKKy8vICAgIHRuZy5zZXRWZXJib3NlKDEwKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBhc3NlcnRUZXN0UmVzdWx0c0VxdWFsKHRsYS5nZXRQYXNzZWRUZXN0cygpLCBBcnJheXMuYXNMaXN0KCJmIiwgImciKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtZXRlclNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvUGFyYW1ldGVyU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNzM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtZXRlclNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5PcHRpb25hbDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CisKKy8qKgorICogVGhpcyBjbGFzcworICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBKdWwgMjIsIDIwMDQKKyAqCisgKi8KKworcHVibGljIGNsYXNzIFBhcmFtZXRlclNhbXBsZSB7CisKKyAgQFBhcmFtZXRlcnMoeyAiZmlyc3QtbmFtZSIgfSkKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KFN0cmluZyBmaXJzdE5hbWUpIHsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1BhcmFtZXRlclNhbXBsZV0gSW52b2tlZCBiZWZvcmVUZXN0TWV0aG9kIHdpdGg6ICIgKyBmaXJzdE5hbWUpOworICAgIGFzc2VydCAiQ2VkcmljIi5lcXVhbHMoZmlyc3ROYW1lKQorICAgICA6ICJFeHBlY3RlZCBDZWRyaWMsIGdvdCAiICsgZmlyc3ROYW1lOworICB9CisKKworICBAUGFyYW1ldGVycyh7ICJmaXJzdC1uYW1lIiB9KQorICBAVGVzdChncm91cHMgPSB7ICJzaW5nbGVTdHJpbmcifSkKKyAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVN0cmluZyhTdHJpbmcgZmlyc3ROYW1lKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltQYXJhbWV0ZXJTYW1wbGVdIEludm9rZWQgdGVzdFN0cmluZyAiICsgZmlyc3ROYW1lKTsKKyAgICBhc3NlcnQgIkNlZHJpYyIuZXF1YWxzKGZpcnN0TmFtZSk7CisgIH0KKworICBAUGFyYW1ldGVycyh7InRoaXMgcGFyYW1ldGVyIGRvZXNuJ3QgZXhpc3QifSkKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0ZW50UGFyYW1ldGVyKEBPcHRpb25hbCBTdHJpbmcgZm9vKSB7CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgU3RyaW5nIHhtbCA9ICI8c3VpdGUgbmFtZT1cImRnZlwiIHZlcmJvc2U9XCIxMFwiPjxwYXJhbWV0ZXIgbmFtZT1cImZpcnN0LW5hbWVcIiB2YWx1ZT1cIkNlZHJpY1wiIC8+PHRlc3QgbmFtZT1cImRnZlwiPjxjbGFzc2VzPjxjbGFzcyBuYW1lPVwidGVzdC5wYXJhbWV0ZXJzLlBhcmFtZXRlclNhbXBsZVwiPjwvY2xhc3M+PC9jbGFzc2VzPjwvdGVzdD48L3N1aXRlPiI7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHhtbCk7CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sLmdldEJ5dGVzKCkpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMobmV3IFBhcnNlcihpcykucGFyc2VUb0xpc3QoKSk7CisgICAgdG5nLnJ1bigpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtZXRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1BhcmFtZXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUwYjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvUGFyYW1ldGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEp1bCAyMiwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlclRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1BhcmFtZXRlclRlc3RdICIgKyBzKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN0cmluZ1NpbmdsZSgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5wYXJhbWV0ZXJzLlBhcmFtZXRlclNhbXBsZSIpOworICAgIHNldFBhcmFtZXRlcigiZmlyc3QtbmFtZSIsICJDZWRyaWMiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAidGVzdFNpbmdsZVN0cmluZyIsCisgICAgICAidGVzdE5vbkV4aXN0ZW50UGFyYW1ldGVyIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmVmb3JlTWV0aG9kV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgYWRkQ2xhc3MoInRlc3QucGFyYW1ldGVycy5CZWZvcmVTYW1wbGVUZXN0Iik7CisgICAgc2V0UGFyYW1ldGVyKCJwYXJhbWV0ZXIiLCAicGFyYW1ldGVyIHZhbHVlIik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgICAgInRlc3RFeGFtcGxlIiwKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU3ZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdAoreworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmb28oKSB7CisgICAgLy9wdXJwb3NlZnVsbHkgZG9lcyBub3RoaW5nCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1NoYWRvdzFTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9TaGFkb3cxU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGFmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9TaGFkb3cxU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNoYWRvdzFTYW1wbGVUZXN0IHsKKyAgQFBhcmFtZXRlcnMoImEiKQorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MShTdHJpbmcgYSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZpcnN0IiwgYSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvU2hhZG93MlNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1NoYWRvdzJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNWM1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1NoYWRvdzJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0LnBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2hhZG93MlNhbXBsZVRlc3QgeworICBAUGFyYW1ldGVycygiYSIpCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QyKFN0cmluZyBhKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiU2Vjb25kIiwgYSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvU2hhZG93VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvU2hhZG93VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2M0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcGFyYW1ldGVycy9TaGFkb3dUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSB0ZXN0LnBhcmFtZXRlcnM7CisKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgU2hhZG93VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJzU2hvdWxkTm90QmVTaGFkb3dlZCgpIHsKKyAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoInMiKTsKKyAgICBYbWxUZXN0IHQgPSBjcmVhdGVYbWxUZXN0KHMsICJ0Iik7CisKKyAgICB7CisgICAgICBYbWxDbGFzcyBjMSA9IG5ldyBYbWxDbGFzcyhTaGFkb3cxU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlMSA9IG5ldyBYbWxJbmNsdWRlKCJ0ZXN0MSIpOworICAgICAgaW5jbHVkZTEuc2V0WG1sQ2xhc3MoYzEpOworICAgICAgYzEuZ2V0TG9jYWxQYXJhbWV0ZXJzKCkucHV0KCJhIiwgIkZpcnN0Iik7CisgICAgICBjMS5nZXRJbmNsdWRlZE1ldGhvZHMoKS5hZGQoaW5jbHVkZTEpOworICAgICAgdC5nZXRYbWxDbGFzc2VzKCkuYWRkKGMxKTsKKyAgICB9CisKKyAgICB7CisgICAgICBYbWxDbGFzcyBjMiA9IG5ldyBYbWxDbGFzcyhTaGFkb3cyU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgWG1sSW5jbHVkZSBpbmNsdWRlMiA9IG5ldyBYbWxJbmNsdWRlKCJ0ZXN0MiIpOworICAgICAgaW5jbHVkZTIuc2V0WG1sQ2xhc3MoYzIpOworICAgICAgYzIuZ2V0TG9jYWxQYXJhbWV0ZXJzKCkucHV0KCJhIiwgIlNlY29uZCIpOworICAgICAgYzIuZ2V0SW5jbHVkZWRNZXRob2RzKCkuYWRkKGluY2x1ZGUyKTsKKyAgICAgIHQuZ2V0WG1sQ2xhc3NlcygpLmFkZChjMik7CisgICAgfQorCisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzKSk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKHMudG9YbWwoKSk7CisgICAgYXNzZXJ0VGVzdFJlc3VsdHNFcXVhbCh0bGEuZ2V0UGFzc2VkVGVzdHMoKSwgQXJyYXlzLmFzTGlzdCgidGVzdDEiLCAidGVzdDIiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1N1aXRlU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BhcmFtZXRlcnMvU3VpdGVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmYWI2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wYXJhbWV0ZXJzL1N1aXRlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5wYXJhbWV0ZXJzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlBhcmFtZXRlcnM7CisKK3B1YmxpYyBjbGFzcyBTdWl0ZVNhbXBsZVRlc3QgeworCisgIEBQYXJhbWV0ZXJzKHsicGFyYW0ifSkKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIHN1aXRlUGFyYW1ldGVyKFN0cmluZyBzKSB7CisgICAgcHBwKCJQQVJBTToiICsgcyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU3VpdGVTYW1wbGVUZXN0XSAiICsgcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL0NhcHRvci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Bob2xzZXIvQ2FwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViN2M3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL0NhcHRvci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgdGVzdC5waG9sc2VyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cGhvbHNlckB0aG91Z2h0d29ya3MuY29tIj5QYXVsIEhvbHNlcjwvYT4KKyAqIEB2ZXJzaW9uICRJZDogQ2FwdG9yLmphdmEsdiAxLjMgMjAwNC8wOC8yNiAyMjoyNToyMiBjZWRyaWMgRXhwICQKKyAqLworcHVibGljIGNsYXNzIENhcHRvciB7CisgIHByaXZhdGUgc3RhdGljIENhcHRvciBpbnN0YW5jZSA9IG51bGw7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNhcHRpdmVzOworCisgIHB1YmxpYyBzdGF0aWMgQ2FwdG9yIGluc3RhbmNlKCkgeworICAgIGlmIChudWxsID09IGluc3RhbmNlKSB7CisgICAgICBpbnN0YW5jZSA9IG5ldyBDYXB0b3IoKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJAQFBIT0xTRVIgUkVTRVRUSU5HIENBUFRPUiIpOworICAgIGluc3RhbmNlKCkuY2FwdGl2ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNhcHR1cmUoIFN0cmluZyBhU3RyaW5nICkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJAQFBIT0xTRVIgQ0FQVFVSSU5HICIgKyBhU3RyaW5nKTsKKyAgICBjYXB0aXZlcy5hZGQoIGFTdHJpbmcgKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gY2FwdGl2ZXMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIGNhcHRpdmVzICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL0RlbW8uamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL0RlbW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJjYjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Bob2xzZXIvRGVtby5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgdGVzdC5waG9sc2VyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnBob2xzZXJAdGhvdWdodHdvcmtzLmNvbSI+UGF1bCBIb2xzZXI8L2E+CisgKiBAdmVyc2lvbiAkSWQ6IERlbW8uamF2YSx2IDEuNSAyMDA2LzA2LzIyIDEzOjQ1OjAxIGNlZHJpYyBFeHAgJAorICovCitwdWJsaWMgY2xhc3MgRGVtbyB7CisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcEZpeHR1cmUoKSB7CisgICAgQ2FwdG9yLnJlc2V0KCk7CisgICAgQ2FwdG9yLmluc3RhbmNlKCkuY2FwdHVyZSggIkRlbW8uc2V0VXBGaXh0dXJlIiApOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBDYXB0b3IuaW5zdGFuY2UoKS5jYXB0dXJlKCAiRGVtby5zZXRVcCIgKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICBDYXB0b3IuaW5zdGFuY2UoKS5jYXB0dXJlKCAiRGVtby50ZWFyRG93biIgKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duRml4dHVyZSgpIHsKKyAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEZW1vLnNldFVwRml4dHVyZSIsICJEZW1vLnNldFVwIiwgIkRlbW8udGVhckRvd24iIH0pOworICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDYXB0b3IuaW5zdGFuY2UoKS5jYXB0aXZlcygpOworICAgIHZlcmlmeShleHBlY3RlZCwgYWN0dWFsKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkRlbW8uc2V0VXBGaXh0dXJlIiwgIkRlbW8uc2V0VXAiIH0gKTsKKyAgICBmaW5hbCBMaXN0PFN0cmluZz4gYWN0dWFsID0gQ2FwdG9yLmluc3RhbmNlKCkuY2FwdGl2ZXMoKTsKKyAgICB2ZXJpZnkoZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5KExpc3Q8U3RyaW5nPiBleHBlY3RlZCwgTGlzdDxTdHJpbmc+IGFjdHVhbCkgeworICAgIGlmICghIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlxuRXhwZWN0ZWQ6IiArIGR1bXBMaXN0KGV4cGVjdGVkKSArICJcbiAgICAgR290OiIgKyBkdW1wTGlzdChhY3R1YWwpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBkdW1wTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgeworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgZm9yIChTdHJpbmcgbCA6IGxpc3QpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiAiICsgbCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Bob2xzZXIvU2Fib3RldXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL1NhYm90ZXVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzYTU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9waG9sc2VyL1NhYm90ZXVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSB0ZXN0LnBob2xzZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpwaG9sc2VyQHRob3VnaHR3b3Jrcy5jb20iPlBhdWwgSG9sc2VyPC9hPgorICogQHZlcnNpb24gJElkOiBTYWJvdGV1ci5qYXZhLHYgMS40IDIwMDYvMDYvMjIgMTM6NDU6MDEgY2VkcmljIEV4cCAkCisgKi8KK3B1YmxpYyBjbGFzcyBTYWJvdGV1ciB7CisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcEZpeHR1cmUoKSB7CisgICAgQ2FwdG9yLnJlc2V0KCk7CisgICAgQ2FwdG9yLmluc3RhbmNlKCkuY2FwdHVyZSggIlNhYm90ZXVyLnNldFVwRml4dHVyZSIgKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgQ2FwdG9yLmluc3RhbmNlKCkuY2FwdHVyZSggIlNhYm90ZXVyLnNldFVwIiApOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIENhcHRvci5pbnN0YW5jZSgpLmNhcHR1cmUoICJTYWJvdGV1ci50ZWFyRG93biIgKTsKKyAgfQorCisgIEBBZnRlckNsYXNzCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duRml4dHVyZSgpIHsKKyAgICBDYXB0b3IuaW5zdGFuY2UoKS5jYXB0dXJlKCAiU2Fib3RldXIudGVhckRvd25GaXh0dXJlIiApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZ28oKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wa2cvUGFja2FnZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wa2cvUGFja2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y0NmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZy9QYWNrYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACitwYWNrYWdlIHRlc3QucGtnOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworaW1wb3J0IHRlc3QucGtnMi5UZXN0MjsKKy8qKgorICogVGVzdHMgdGhhdCA8cGFja2FnZT4gaW4gdGVzdG5nLnhtbCB3b3Jrcy4KKyAqCisgKiBDcmVhdGVkIG9uIEF1ZyAyLCAyMDA1CisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgUGFja2FnZVRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBOT05fVEVTVF9DT05TVFJVQ1RPUj0gZmFsc2U7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3RyaW5nU2luZ2xlKCkgeworICAgIGFkZFBhY2thZ2UoInRlc3QucGtnMiIsIG5ldyBTdHJpbmdbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QxMSIsICJtZXRob2QxMiIsCisgICAgICAibWV0aG9kMzEiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwYWNrYWdlV2l0aE5vblRlc3RDbGFzc2VzKCkgeworICAgIGFkZFBhY2thZ2UoInRlc3QucGtnMiIsIG5ldyBTdHJpbmdbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgIHJ1bigpOworICAgIGFzc2VydFRydWUoIU5PTl9URVNUX0NPTlNUUlVDVE9SLCBUZXN0Mi5jbGFzcy5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFja2FnZVdpdGhSZWdFeHAxKCkgeworICAgIGFkZFBhY2thZ2UoInRlc3QucGtnMiIsIG5ldyBTdHJpbmdbXSB7ICIuKjEuKiJ9LCBuZXcgU3RyaW5nWzBdKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAibWV0aG9kMTEiLCAibWV0aG9kMTIiLAorICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwYWNrYWdlV2l0aFJlZ0V4cDIoKSB7CisgICAgYWRkUGFja2FnZSgidGVzdC5wa2cyIiwgbmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1tdIHsgIi4qMS4qIn0pOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QzMSIsCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhY2thZ2VXaXRoUmVnRXhwMygpIHsKKyAgICBhZGRQYWNrYWdlKCJ0ZXN0LnBrZzIiLCBuZXcgU3RyaW5nW10geyAiLiozLioifSwgbmV3IFN0cmluZ1tdIHsgIi4qMS4qIn0pOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJtZXRob2QzMSIsCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhY2thZ2VXaXRoUmVnRXhwNCgpIHsKKyAgICBhZGRQYWNrYWdlKCJ0ZXN0LnBrZzIiLCAgbmV3IFN0cmluZ1tdIHsgIi4qMS4qIn0sIG5ldyBTdHJpbmdbXSB7ICIuKjMuKiJ9KTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAibWV0aG9kMTEiLCAibWV0aG9kMTIiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhY2thZ2VXaXRoUmVnRXhwNSgpIHsKKyAgICBhZGRQYWNrYWdlKCJ0ZXN0LnBrZzIiLCAgbmV3IFN0cmluZ1swXSwgbmV3IFN0cmluZ1tdIHsgIlRlc3QuKiJ9KTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGtnMi9UZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTRhODlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDEuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QucGtnMjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3QxIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2QxMSgpIHsKKworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbWV0aG9kMTIoKSB7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGtnMi9UZXN0Mi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFjMmUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDIuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QucGtnMjsKKworaW1wb3J0IHRlc3QucGtnLlBhY2thZ2VUZXN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0MiB7CisgIHByaXZhdGUgVGVzdDIoZmxvYXQgYWZsb2F0KSB7CisgICAgUGFja2FnZVRlc3QuTk9OX1RFU1RfQ09OU1RSVUNUT1I9IHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBub25UZXN0TWV0aG9kKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcGtnMi9UZXN0My5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBiOWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3BrZzIvVGVzdDMuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIHRlc3QucGtnMjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3QzIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2QzMSgpIHsKKworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQUFBLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9BQUEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWMzYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQUFBLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnByZXNlcnZlb3JkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VMb2dUZXN0OworCitwdWJsaWMgY2xhc3MgQUFBIGV4dGVuZHMgQmFzZUxvZ1Rlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGExKCkgeworICAgIGxvZygiQUFBLmExIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhMigpIHsKKyAgICBsb2coIkFBQS5hMiIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYTMoKSB7CisgICAgbG9nKCJBQUEuYTMiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGVmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9CLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnByZXNlcnZlb3JkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VMb2dUZXN0OworCitwdWJsaWMgY2xhc3MgQiBleHRlbmRzIEJhc2VMb2dUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBiMSgpIHsKKyAgICBsb2coIkIuYjEiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGIyKCkgeworICAgIGxvZygiQi5iMiIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYjMoKSB7CisgICAgbG9nKCJCLmIzIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL0MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL0MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM0Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5wcmVzZXJ2ZW9yZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlTG9nVGVzdDsKKworcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBCYXNlTG9nVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYzEoKSB7CisgICAgbG9nKCJDLmMxIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjMigpIHsKKyAgICBsb2coIkMuYzIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGMzKCkgeworICAgIGxvZygiQy5jMyIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9DaHVja1Rlc3QzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9DaHVja1Rlc3QzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRhOWFjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL0NodWNrVGVzdDMuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QucHJlc2VydmVvcmRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENodWNrVGVzdDMgeworCisgICAgQFRlc3QoZ3JvdXBzID0geyJmdW5jdGlvbmFsIn0sIGRlcGVuZHNPbk1ldGhvZHMgPSB7ImMzVGVzdFR3byJ9KQorICAgIHB1YmxpYyB2b2lkIGMzVGVzdFRocmVlKCkgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2h1Y2t0ZXN0MzogdGVzdCB0aHJlZSIpOworICAgIH0KKworICAgIEBUZXN0KGdyb3VwcyA9IHsiZnVuY3Rpb25hbCJ9KQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjM1Rlc3RPbmUoKSB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaHVja3Rlc3QzOiB0ZXN0IG9uZSIpOworICAgIH0KKworICAgIEBUZXN0KGdyb3VwcyA9IHsiZnVuY3Rpb25hbCJ9LCBkZXBlbmRzT25NZXRob2RzID0geyJjM1Rlc3RPbmUifSkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYzNUZXN0VHdvKCkgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2h1Y2t0ZXN0MzogdGVzdCB0d28iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL0NodWNrVGVzdDQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL0NodWNrVGVzdDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDNkYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvQ2h1Y2tUZXN0NC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5wcmVzZXJ2ZW9yZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2h1Y2tUZXN0NCB7CisKKyAgICBAVGVzdChncm91cHMgPSB7ImZ1bmN0aW9uYWwifSwgZGVwZW5kc09uTWV0aG9kcyA9IHsiYzRUZXN0VHdvIn0pCisgICAgcHVibGljIHZvaWQgYzRUZXN0VGhyZWUoKSB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaHVja3Rlc3Q0OiB0ZXN0IHRocmVlIik7CisgICAgfQorCisgICAgQFRlc3QoZ3JvdXBzID0geyJmdW5jdGlvbmFsIn0pCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGM0VGVzdE9uZSgpIHsKKy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNodWNrdGVzdDQ6IHRlc3Qgb25lIik7CisgICAgfQorCisgICAgQFRlc3QoZ3JvdXBzID0geyJmdW5jdGlvbmFsIn0sIGRlcGVuZHNPbk1ldGhvZHMgPSB7ImM0VGVzdE9uZSJ9KQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjNFRlc3RUd28oKSB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaHVja3Rlc3Q0OiB0ZXN0IHR3byIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvRWRuVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvRWRuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmYmNhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9FZG5UZXN0LmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0LnByZXNlcnZlb3JkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0KHNpbmdsZVRocmVhZGVkID0gdHJ1ZSkKK3B1YmxpYyBjbGFzcyBFZG5UZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBlZG4xKCkgeworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZWRuMigpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9QcmVzZXJ2ZU9yZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvUHJlc2VydmVPcmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE2ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvUHJlc2VydmVPcmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSB0ZXN0LnByZXNlcnZlb3JkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VMb2dUZXN0OworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgUHJlc2VydmVPcmRlclRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcHJlc2VydmVDbGFzc09yZGVyKCkgeworICAgIFN0cmluZ1tdW10gdGVzdHMgPSBuZXcgU3RyaW5nW11bXSB7CisgICAgICBuZXcgU3RyaW5nW10geyAiQUFBIiwgIkIiLCAiQyIgfSwKKyAgICAgIG5ldyBTdHJpbmdbXSB7ICJBQUEiLCAiQyIsICJCIiB9LAorICAgICAgbmV3IFN0cmluZ1tdIHsgIkIiLCAiQUFBIiwgIkMiIH0sCisgICAgICBuZXcgU3RyaW5nW10geyAiQiIsICJDIiwgIkFBQSIgfSwKKyAgICAgIG5ldyBTdHJpbmdbXSB7ICJDIiwgIkIiLCAiQUFBIiB9LAorICAgICAgbmV3IFN0cmluZ1tdIHsgIkMiLCAiQUFBIiwgIkIiIH0sCisgICAgfTsKKyAgICBmb3IgKFN0cmluZ1tdIHQgOiB0ZXN0cykgeworICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworLy8gICAgICB0bmcuc2V0VmVyYm9zZSgyKTsKKyAgICAgIFhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiU3VpdGUiKTsKKyAgICAgIFN0cmluZ1tdIGZ1bGxUZXN0TmFtZXMgPSBuZXcgU3RyaW5nW3QubGVuZ3RoXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykgeworICAgICAgICBmdWxsVGVzdE5hbWVzW2ldID0gInRlc3QucHJlc2VydmVvcmRlci4iICsgdFtpXTsKKyAgICAgIH0KKyAgICAgIFhtbFRlc3QgeHQgPSBjcmVhdGVYbWxUZXN0KHMsICJUZXN0IiwgZnVsbFRlc3ROYW1lcyk7CisgICAgICB4dC5zZXRQcmVzZXJ2ZU9yZGVyKCJ0cnVlIik7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzLnRvWG1sKCkpOworICAgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKyAgICAgIHRuZy5ydW4oKTsKKworICAgICAgLy8gMyBtZXRob2RzIHBlciBjbGFzcywgMyBjbGFzc2VzLCBzbyB0aGUgbG9nIHNob3VsZCBjb250YWluIDkgY2FsbHMKKyAgICAgIExpc3Q8U3RyaW5nPiBsb2cgPSBCYXNlTG9nVGVzdC5nZXRMb2coKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobG9nLnNpemUoKSwgOSk7CisKKyAgICAgIC8vIEV2ZXJ5IHNsaWNlIG9mIDMgbG9ncyBzaG91bGQgYmVsb25nIHRvIHRoZSBzYW1lIGNsYXNzIGluIHRoZSBzYW1lCisgICAgICAvLyBvcmRlciBhcyBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZzogIEFBQS5hMSwgQUFBLmEyLCBBQUEuYTMsIEIuYTEsIGV0Yy4uLgorICAgICAgLy8gU2luY2Ugd2UncmUgb25seSB0ZXN0aW5nIGNsYXNzIG9yZGVyaW5nIGluIHRoaXMgdGVzdCwgd2Ugb25seSBtYXRjaAorICAgICAgLy8gYWdhaW5zdCB0aGUgY2xhc3MgbmFtZQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobG9nLmdldChqICsgKDMgKiBpKSkuc3RhcnRzV2l0aCh0W2ldICsgIi4iKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwcmVzZXJ2ZU1ldGhvZE9yZGVyKCkgeworICAgIFN0cmluZ1tdW10gbWV0aG9kcyA9IG5ldyBTdHJpbmdbXVtdIHsKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgImExIiwgImEyIiwgImEzIiB9LAorICAgICAgICBuZXcgU3RyaW5nW10geyAiYTEiLCAiYTMiLCAiYTIiIH0sCisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJhMiIsICJhMSIsICJhMyIgfSwKKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgImEyIiwgImEzIiwgImExIiB9LAorICAgICAgICBuZXcgU3RyaW5nW10geyAiYTMiLCAiYTIiLCAiYTEiIH0sCisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJhMyIsICJhMSIsICJhMiIgfSwKKyAgICB9OworCisgICAgZm9yIChTdHJpbmdbXSBtIDogbWV0aG9kcykgeworICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAvLyAgICAgIHRuZy5zZXRWZXJib3NlKDIpOworICAgICAgWG1sU3VpdGUgcyA9IGNyZWF0ZVhtbFN1aXRlKCJTdWl0ZSIpOworICAgICAgU3RyaW5nIHRlc3ROYW1lID0gInRlc3QucHJlc2VydmVvcmRlci5BQUEiOworICAgICAgWG1sVGVzdCB4dCA9IGNyZWF0ZVhtbFRlc3QocywgIlRlc3QiLCB0ZXN0TmFtZSk7CisgICAgICBhZGRNZXRob2RzKHh0LmdldFhtbENsYXNzZXMoKS5nZXQoMCksIG0pOworICAgICAgeHQuc2V0UHJlc2VydmVPcmRlcigidHJ1ZSIpOworICAvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzLnRvWG1sKCkpOworICAgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKyAgICAgIHRuZy5ydW4oKTsKKworICAgICAgTGlzdDxTdHJpbmc+IGxvZyA9IEJhc2VMb2dUZXN0LmdldExvZygpOworLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4obG9nKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9nLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICghbG9nLmdldChpKS5lbmRzV2l0aChtW2ldKSkgeworICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgIiArIEFycmF5cy5hc0xpc3QobSkgKyAiIGJ1dCBnb3QgIiArIGxvZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBvcmRlclNob3VsZEJlUHJlc2VydmVkV2l0aERlcGVuZGVuY2llcygpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgWG1sU3VpdGUgcyA9IGNyZWF0ZVhtbFN1aXRlKCJQcmVzZXJ2ZU9yZGVyIik7CisgICAgWG1sVGVzdCB0ID0gbmV3IFhtbFRlc3Qocyk7CisgICAgdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcygidGVzdC5wcmVzZXJ2ZW9yZGVyLkNodWNrVGVzdDQiKSk7CisgICAgdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcygidGVzdC5wcmVzZXJ2ZW9yZGVyLkNodWNrVGVzdDMiKSk7CisgICAgdC5zZXRQcmVzZXJ2ZU9yZGVyKCJ0cnVlIik7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgdmVyaWZ5UGFzc2VkVGVzdHModGxhLCAiYzRUZXN0T25lIiwgImM0VGVzdFR3byIsICJjNFRlc3RUaHJlZSIsCisgICAgICAgICJjM1Rlc3RPbmUiLCAiYzNUZXN0VHdvIiwgImMzVGVzdFRocmVlIik7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJwcmVzZXJ2ZS1vcmRlciBvbiBhIGZhY3RvcnkgZG9lc24ndCBjYXVzZSBhbiBOUEUiKQorICBwdWJsaWMgdm9pZCBmYWN0b3J5UHJlc2VydmUoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIFhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiRmFjdG9yeVByZXNlcnZlIik7CisgICAgWG1sVGVzdCB0ID0gbmV3IFhtbFRlc3Qocyk7CisgICAgdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcyhUZXN0Q2xhc3NGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSkpOworICAgIHQuc2V0UHJlc2VydmVPcmRlcigidHJ1ZSIpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzKSk7CisgICAgdG5nLnJ1bigpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9QcmdUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9QcmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjI3MzhhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL1ByZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QucHJlc2VydmVvcmRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3Qoc2luZ2xlVGhyZWFkZWQ9dHJ1ZSkKK3B1YmxpYyBjbGFzcyBQcmdUZXN0IHsKKwkgIEBUZXN0CisJICBwdWJsaWMgdm9pZCBwcmcxKCkgeworCSAgfQorCisJICBAVGVzdAorCSAgcHVibGljIHZvaWQgcHJnMigpIHsKKwkgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9TaWJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9TaWJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRiZWU1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL1NpYlRlc3QuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QucHJlc2VydmVvcmRlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3Qoc2luZ2xlVGhyZWFkZWQgPSB0cnVlKQorcHVibGljIGNsYXNzIFNpYlRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaWIxKCkgeworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9ICJzaWIxIikKKyAgcHVibGljIHZvaWQgc2liMigpIHsKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNpYjIiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9UZXN0Q2xhc3MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmVzZXJ2ZW9yZGVyL1Rlc3RDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9UZXN0Q2xhc3MuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKg0KKyAqIEAoIykgVGVzdENsYXNzLmphdmENCisgKiBDcmVhdGVkOiBBdWcgMTAsIDIwMTENCisgKiBCeTogV29sZmdhbmcgJiBNb25pa2EgQmFsdGVzDQorICogQ29weXJpZ2h0IDIwMTEgV29sZmdhbmcgQmFsdGVzDQorICogV09MRkdBTkcgJiBNT05JS0EgQkFMVEVTIFBST1BSSUVUQVJZL0NPTkZJREVOVElBTC4NCisgKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLg0KKyAqLw0KK3BhY2thZ2UgdGVzdC5wcmVzZXJ2ZW9yZGVyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgV29sZmdhbmcgQmFsdGVzDQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgVGVzdENsYXNzIHsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsOw0KKw0KKyAgICBwdWJsaWMgVGVzdENsYXNzKGZpbmFsIGludCB2YWwpIHsNCisgICAgICAgIHRoaXMudmFsID0gdmFsOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkDQorICAgIGNoZWNrVmFsKCkgew0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGhpcy52YWwgIT0gMCk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvVGVzdENsYXNzRmFjdG9yeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByZXNlcnZlb3JkZXIvVGVzdENsYXNzRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJlc2VydmVvcmRlci9UZXN0Q2xhc3NGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0LnByZXNlcnZlb3JkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q2xhc3NGYWN0b3J5IHsKKworICAgIEBGYWN0b3J5CisgICAgcHVibGljIE9iamVjdFtdIGYoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHJlcyA9IG5ldyBPYmplY3RbNF07CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICByZXNbaS0xXSA9IG5ldyBUZXN0Q2xhc3MoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvQmFzZVNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L0Jhc2VTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzM3MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L0Jhc2VTYW1wbGUuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIHRlc3QucHJpb3JpdHk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK3B1YmxpYyBjbGFzcyBCYXNlU2FtcGxlIHsKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gbV9tZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgcHJvdGVjdGVkIHZvaWQgYWRkKFN0cmluZyBtKSB7CisgICAgU3RyaW5nIHMgPSBtOworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJCYXNlU2FtcGxlIHJlY29yZGluZyAiICsgdGhpcyArICIgIiArIHMpOworICAgIHN5bmNocm9uaXplZChtX21ldGhvZHMpIHsKKyAgICAgIG1fbWV0aG9kcy5hZGQocyk7CisgICAgfQorICB9CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJjKCkgeworICAgIG1fbWV0aG9kcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEoKSB7IGFkZCgiZjEiKTsgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyKCkgeyBhZGQoImYyIik7IH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMygpIHsgYWRkKCJmMyIpOyB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjQoKSB7IGFkZCgiZjQiKTsgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGY1KCkgeyBhZGQoImY1Iik7IH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmNigpIHsgYWRkKCJmNiIpOyB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjcoKSB7IGFkZCgiZjciKTsgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGY4KCkgeyBhZGQoImY4Iik7IH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9Qcmlvcml0eTJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvUHJpb3JpdHkyU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2QzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvUHJpb3JpdHkyU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5wcmlvcml0eTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFByaW9yaXR5MlNhbXBsZVRlc3QgeworICBAVGVzdChwcmlvcml0eSA9IDEpCisgIHB1YmxpYyB2b2lkIGNPbmUoKSB7CisgIH0KKworICBAVGVzdChwcmlvcml0eSA9IDIpCisgIHB1YmxpYyB2b2lkIGJUd28oKSB7CisgIH0KKworICBAVGVzdChwcmlvcml0eSA9IDMpCisgIHB1YmxpYyB2b2lkIGFUaHJlZSgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L1ByaW9yaXR5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L1ByaW9yaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTgwODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvUHJpb3JpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSB0ZXN0LnByaW9yaXR5OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFByaW9yaXR5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBwcml2YXRlIHZvaWQgcnVuVGVzdChDbGFzczw/PiBjbHMsIFN0cmluZyBmaXJzdCwgU3RyaW5nIHNlY29uZCwgYm9vbGVhbiBwYXJhbGxlbCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoY2xzKTsKKyAgICBpZiAocGFyYWxsZWwpIHRuZy5zZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuTUVUSE9EUyk7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmFzZVNhbXBsZS5tX21ldGhvZHMuZ2V0KDApLCBmaXJzdCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCYXNlU2FtcGxlLm1fbWV0aG9kcy5nZXQoMSksIHNlY29uZCk7CisgIH0KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UsIGRlc2NyaXB0aW9uID0gIk1ha2Ugc3VyZSBwcmlvcml0aWVzIHdvcmsgaW4gcGFyYWxsZWwgbW9kZSIpCisgIHB1YmxpYyB2b2lkIHByaW9yaXR5SW5QYXJhbGxlbDEoKSB7CisgICAgcnVuVGVzdChXaXRoUHJpb3JpdHlTYW1wbGVUZXN0LmNsYXNzLCAiZmlyc3QiLCAic2Vjb25kIiwgdHJ1ZSAvKiBwYXJhbGxlbCAqLyk7CisgIH0KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UsIGRlc2NyaXB0aW9uID0gIk1ha2Ugc3VyZSBwcmlvcml0aWVzIHdvcmsgaW4gcGFyYWxsZWwgbW9kZSIpCisgIHB1YmxpYyB2b2lkIHByaW9yaXR5SW5QYXJhbGxlbDIoKSB7CisgICAgcnVuVGVzdChXaXRoUHJpb3JpdHlTYW1wbGUyVGVzdC5jbGFzcywgInNlY29uZCIsICJmaXJzdCIsIHRydWUgLyogcGFyYWxsZWwgKi8pOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTWFrZSBzdXJlIHByaW9yaXRpZXMgd29yayBpbiBzZXF1ZW50aWFsIG1vZGUiKQorICBwdWJsaWMgdm9pZCBwcmlvcml0eUluU2VxdWVudGlhbDEoKSB7CisgICAgcnVuVGVzdChXaXRoUHJpb3JpdHlTYW1wbGVUZXN0LmNsYXNzLCAiZmlyc3QiLCAic2Vjb25kIiwgZmFsc2UgLyogc2VxdWVudGlhbCAqLyk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJNYWtlIHN1cmUgcHJpb3JpdGllcyB3b3JrIGluIHNlcXVlbnRpYWwgbW9kZSIpCisgIHB1YmxpYyB2b2lkIHByaW9yaXR5SW5TZXF1ZW50aWFsMigpIHsKKyAgICBydW5UZXN0KFdpdGhQcmlvcml0eVNhbXBsZTJUZXN0LmNsYXNzLCAic2Vjb25kIiwgImZpcnN0IiwgZmFsc2UgLyogc2VxdWVudGlhbCAqLyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9XaXRoUHJpb3JpdHlTYW1wbGUyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L1dpdGhQcmlvcml0eVNhbXBsZTJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkMjllMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9XaXRoUHJpb3JpdHlTYW1wbGUyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgdGVzdC5wcmlvcml0eTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCitwdWJsaWMgY2xhc3MgV2l0aFByaW9yaXR5U2FtcGxlMlRlc3QgZXh0ZW5kcyBCYXNlU2FtcGxlIHsKKyAgQFRlc3QocHJpb3JpdHkgPSAtMikKKyAgcHVibGljIHZvaWQgZmlyc3QoKSB7CisgICAgYWRkKCJmaXJzdCIpOworICB9CisKKyAgQFRlc3QocHJpb3JpdHkgPSAtMykKKyAgcHVibGljIHZvaWQgc2Vjb25kKCkgeworICAgIGFkZCgic2Vjb25kIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaW9yaXR5L1dpdGhQcmlvcml0eVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9XaXRoUHJpb3JpdHlTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NWNhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9XaXRoUHJpb3JpdHlTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0LnByaW9yaXR5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK3B1YmxpYyBjbGFzcyBXaXRoUHJpb3JpdHlTYW1wbGVUZXN0IGV4dGVuZHMgQmFzZVNhbXBsZSB7CisgIEBUZXN0KHByaW9yaXR5ID0gLTIpCisgIHB1YmxpYyB2b2lkIGZpcnN0KCkgeworICAgIGFkZCgiZmlyc3QiKTsKKyAgfQorCisgIEBUZXN0KHByaW9yaXR5ID0gLTEpCisgIHB1YmxpYyB2b2lkIHNlY29uZCgpIHsKKyAgICBhZGQoInNlY29uZCIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9wcmlvcml0eS9XaXRob3V0UHJpb3JpdHlTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvV2l0aG91dFByaW9yaXR5U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGM1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcHJpb3JpdHkvV2l0aG91dFByaW9yaXR5U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5wcmlvcml0eTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFdpdGhvdXRQcmlvcml0eVNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlU2FtcGxlIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmaXJzdCgpIHsKKyAgICBhZGQoImZpcnN0Iik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzZWNvbmQoKSB7CisgICAgYWRkKCJzZWNvbmQiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ByaXZhdGVtZXRob2QvUHJpdmF0ZU1ldGhvZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcml2YXRlbWV0aG9kL1ByaXZhdGVNZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1ZTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9wcml2YXRlbWV0aG9kL1ByaXZhdGVNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LnByaXZhdGVtZXRob2Q7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKworcHVibGljIGNsYXNzIFByaXZhdGVNZXRob2RUZXN0IHsKKyAgcHVibGljIFByaXZhdGVNZXRob2RUZXN0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgfQorCisgIHByaXZhdGUgaW50IHByaXZhdGVNZXRob2QoKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFByaXZhdGVNZXRob2RJbm5lclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaXZhdGVNZXRob2QoKSB7CisgICAgICBQcml2YXRlTWV0aG9kVGVzdCBwbXQgPSBuZXcgUHJpdmF0ZU1ldGhvZFRlc3QoImFuYW1lIiwgMSk7CisgICAgICBpbnQgcmV0dXJuVmFsdWUgPSBwbXQucHJpdmF0ZU1ldGhvZCgpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJldHVyblZhbHVlLCAxKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL0JlZm9yZVRlc3RGYWlsaW5nVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vQmVmb3JlVGVzdEZhaWxpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhYjRkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL0JlZm9yZVRlc3RGYWlsaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5yZWdyZXNzaW9uOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCZWZvcmVUZXN0RmFpbGluZ1Rlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdEZhaWxpbmdTaG91bGRDYXVzZVNraXBzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoTXlUZXN0bmdUZXN0Mi5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFNraXBwZWRUZXN0cygpLnNpemUoKSwgMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVncmVzc2lvbi9NeVRlc3RuZ1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL015VGVzdG5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTQwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVncmVzc2lvbi9NeVRlc3RuZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QucmVncmVzc2lvbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVUZXN0OworCitwdWJsaWMgY2xhc3MgTXlUZXN0bmdUZXN0IHsKKworICBAQmVmb3JlU3VpdGUoKQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZShJVGVzdENvbnRleHQgdGMpIHRocm93cyBFeGNlcHRpb24geworICB9CisKKyAgQEJlZm9yZVRlc3QoKQorICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KElUZXN0Q29udGV4dCB0YykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiYmFyZmluZyBub3ciKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vTXlUZXN0bmdUZXN0Mi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vTXlUZXN0bmdUZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzE5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVncmVzc2lvbi9NeVRlc3RuZ1Rlc3QyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0LnJlZ3Jlc3Npb247CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIE15VGVzdG5nVGVzdDIgZXh0ZW5kcyBNeVRlc3RuZ1Rlc3QgeworCisgIEBCZWZvcmVDbGFzcygpCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzKElUZXN0Q29udGV4dCB0YykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIH0KKworICBAQmVmb3JlTWV0aG9kKCkKKyAgcHVibGljIHZvaWQgYmVmb3JlTWV0aG9kKElUZXN0Q29udGV4dCB0YykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oImZhaWwgbWUiKTsKKyAgfQorICBAVGVzdCgpCisgIHB1YmxpYyB2b2lkIHRlc3QoSVRlc3RDb250ZXh0IHRjKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL2dyb3Vwc29yZGVyaW5nL0EuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL2dyb3Vwc29yZGVyaW5nL0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWZiZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvQS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nOw0KKw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBCYXNlIHsNCisNCisgIEBUZXN0KGdyb3Vwcz0gImEiKQ0KKyAgcHVibGljIHZvaWQgdGVzdEEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgc19jaGlsZEFXYXNSdW49IHRydWU7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL2dyb3Vwc29yZGVyaW5nL0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZWdyZXNzaW9uL2dyb3Vwc29yZGVyaW5nL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNiOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvQi5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nOw0KKw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBCYXNlIHsNCisNCisgIEBUZXN0KGdyb3Vwcz0gImEiKQ0KKyAgcHVibGljIHZvaWQgdGVzdEIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgQmFzZS5zX2NoaWxkQldhc1J1bj0gdHJ1ZTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDRmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVncmVzc2lvbi9ncm91cHNvcmRlcmluZy9CYXNlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSB0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmc7DQorDQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUdyb3VwczsNCisNCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZSB7DQorICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc19jaGlsZEFXYXNSdW47DQorICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc19jaGlsZEJXYXNSdW47DQorDQorICBAQmVmb3JlR3JvdXBzKHZhbHVlPSAiYSIsIGdyb3Vwcz0gImEiKQ0KKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNsYXNzIGlzICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgQmVmb3JlIGdyb3VwICAiKTsNCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNfY2hpbGRBV2FzUnVuIHx8IHNfY2hpbGRCV2FzUnVuLCAiU3RhdGljIGZpZWxkIHdhcyBub3QgcmVzZXQ6IEBBZnRlckdyb3VwIG1ldGhvZCBub3QgaW52b2tlZCIpOw0KKyAgfQ0KKw0KKyAgQEFmdGVyR3JvdXBzKHZhbHVlPSAiYSIsIGdyb3Vwcz0gImEiKQ0KKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7DQorLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJjbGFzcyBpcyAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIEFmdGVyIGdyb3VwICAiKTsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUoc19jaGlsZEFXYXNSdW4sICJDaGlsZCBBIHdhcyBub3QgcnVuIik7DQorICAgIEFzc2VydC5hc3NlcnRUcnVlKHNfY2hpbGRCV2FzUnVuLCAiQ2hpbGQgQiB3YXMgbm90IHJ1biIpOw0KKyAgICBzX2NoaWxkQVdhc1J1biA9IGZhbHNlOw0KKyAgICBzX2NoaWxkQldhc1J1biA9IGZhbHNlOw0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVncmVzc2lvbi9ncm91cHNvcmRlcmluZy90ZXN0bmcueG1sIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvdGVzdG5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg0ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlZ3Jlc3Npb24vZ3JvdXBzb3JkZXJpbmcvdGVzdG5nLnhtbApAQCAtMCwwICsxLDIxIEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPg0KKzxzdWl0ZSBuYW1lPSJHcm91cHMgb3JkZXJpbmcgcmVncmVzc2lvbiIgdmVyYm9zZT0iMiI+CisgIDx0ZXN0IG5hbWU9IkNsYXNzIFJ1biI+DQorCQk8Y2xhc3Nlcz4NCisJCQk8Y2xhc3MgbmFtZT0idGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkEiIC8+DQorCQkJPGNsYXNzIG5hbWU9InRlc3QucmVncmVzc2lvbi5ncm91cHNvcmRlcmluZy5CIiAvPg0KKwkJPC9jbGFzc2VzPg0KKyAgPC90ZXN0Pg0KKwkNCisJPHRlc3QgbmFtZT0iR3JvdXBzIFJ1biI+DQorCQk8Z3JvdXBzPg0KKwkJCTxydW4+DQorCQkJCTxpbmNsdWRlIG5hbWU9ImEiIC8+DQorCQkJPC9ydW4+DQorCQk8L2dyb3Vwcz4NCisJCTxjbGFzc2VzPg0KKwkJCTxjbGFzcyBuYW1lPSJ0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmcuQSIgLz4NCisJCQk8Y2xhc3MgbmFtZT0idGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkIiIC8+DQorCQk8L2NsYXNzZXM+DQorCTwvdGVzdD4NCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZW1vdGUvUmVtb3RlU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlbW90ZS9SZW1vdGVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZW1vdGUvUmVtb3RlU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5yZW1vdGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVXNlZCBieSBSZW1vdGVUZXN0IHRvIHRlc3QgUmVtb3RlVGVzdE5HLgorICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0IDxjZWRyaWNAYmV1c3QuY29tPgorICoKKyAqLworcHVibGljIGNsYXNzIFJlbW90ZVNhbXBsZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkge30KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMigpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVtb3RlL1JlbW90ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZW1vdGUvUmVtb3RlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTU1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVtb3RlL1JlbW90ZVRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACitwYWNrYWdlIHRlc3QucmVtb3RlOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuUmVtb3RlVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLklNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLklNZXNzYWdlU2VuZGVyOworaW1wb3J0IG9yZy50ZXN0bmcucmVtb3RlLnN0cnByb3RvY29sLk1lc3NhZ2VIdWI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuU2VyaWFsaXplZE1lc3NhZ2VTZW5kZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5yZW1vdGUuc3RycHJvdG9jb2wuU3RyaW5nTWVzc2FnZVNlbmRlcjsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBzaW1wbGUgY2xpZW50IHRoYXQgbGF1bmNoZXMgUmVtb3RlVGVzdE5HIGFuZCB0aGVuIHRhbGtzIHRvIGl0IHZpYSB0aGUKKyAqIHR3byBzdXBwb3J0ZWQgcHJvdG9jb2xzLCBTdHJpbmcgYW5kIFNlcmlhbGl6ZWQuCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworICAvLyBOb3RlOiBkb24ndCB1c2UgdGhlIHBvcnRzIHVzZWQgYnkgdGhlIHBsdWctaW4gb3IgdGhlIFJlbW90ZVRlc3RORyBwcm9jZXNzZXMKKyAgLy8gbGF1bmNoZWQgaW4gdGhpcyB0ZXN0IHdpbGwgaW50ZXJmZXJlIHdpdGggdGhlIHBsdWctaW4uCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1JUMSA9IDEyNDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1JUMiA9IDEyNDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBFWFBFQ1RFRF9NRVNTQUdFUyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHt7CisgICAgYWRkKCJHZW5lcmljTWVzc2FnZSIpOyAvLyBtZXRob2QgYW5kIHRlc3QgY291bnRzCisgICAgYWRkKCJTdWl0ZU1lc3NhZ2UiKTsgIC8vIHN1aXRlIHN0YXJ0ZWQKKyAgICBhZGQoIlRlc3RNZXNzYWdlIik7ICAvLyB0ZXN0IHN0YXJ0ZWQKKyAgICBhZGQoIlRlc3RSZXN1bHRNZXNzYWdlIik7IC8vIHN0YXR1czogc3RhcnRlZAorICAgIGFkZCgiVGVzdFJlc3VsdE1lc3NhZ2UiKTsgLy8gc3RhdHVzOiBzdWNjZXNzCisgICAgYWRkKCJUZXN0UmVzdWx0TWVzc2FnZSIpOyAvLyBzdGF0dXM6IHN0YXJ0ZWQKKyAgICBhZGQoIlRlc3RSZXN1bHRNZXNzYWdlIik7IC8vIHN0YXR1czogc3VjY2VzcworICAgIGFkZCgiVGVzdE1lc3NhZ2UiKTsgLy8gdGVzdCBmaW5pc2hlZAorICAgIGFkZCgiU3VpdGVNZXNzYWdlIik7IC8vIHN1aXRlIGZpbmlzaGVkCisgIH19OworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkKCkgeworICAgIHJ1blRlc3QoIi1zZXJwb3J0IiwgUE9SVDEsIG5ldyBTZXJpYWxpemVkTWVzc2FnZVNlbmRlcigibG9jYWxob3N0IiwgUE9SVDEpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB7CisgICAgcnVuVGVzdCgiLXBvcnQiLCBQT1JUMiwgbmV3IFN0cmluZ01lc3NhZ2VTZW5kZXIoImxvY2FsaG9zdCIsIFBPUlQyKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbGF1bmNoUmVtb3RlVGVzdE5HKGZpbmFsIFN0cmluZyBwb3J0QXJnLCBmaW5hbCBpbnQgcG9ydFZhbHVlKSB7CisgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVtb3RlVGVzdE5HLm1haW4obmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIHBvcnRBcmcsIEludGVnZXIudG9TdHJpbmcocG9ydFZhbHVlKSwgIi1kb250ZXhpdCIsCisgICAgICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgidGVzdG5nLXJlbW90ZS54bWwiKQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9KS5zdGFydCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoU3RyaW5nIGFyZywgaW50IHBvcnRWYWx1ZSwgSU1lc3NhZ2VTZW5kZXIgc21zKSB7CisgICAgcCgiTGF1bmNoaW5nIFJlbW90ZVRlc3RORyBvbiBwb3J0ICIgKyBwb3J0VmFsdWUpOworICAgIGxhdW5jaFJlbW90ZVRlc3RORyhhcmcsIHBvcnRWYWx1ZSk7CisgICAgTWVzc2FnZUh1YiBtaCA9IG5ldyBNZXNzYWdlSHViKHNtcyk7CisgICAgTGlzdDxTdHJpbmc+IHJlY2VpdmVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgdHJ5IHsKKyAgICAgIG1oLmluaXRSZWNlaXZlcigpOworICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IG1oLnJlY2VpdmVNZXNzYWdlKCk7CisgICAgICB3aGlsZSAobWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgIHJlY2VpdmVkLmFkZChtZXNzYWdlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgbWVzc2FnZSA9IG1oLnJlY2VpdmVNZXNzYWdlKCk7CisgICAgICB9CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVjZWl2ZWQsIEVYUEVDVEVEX01FU1NBR0VTKTsKKyAgICB9CisgICAgY2F0Y2goU29ja2V0VGltZW91dEV4Y2VwdGlvbiBleCkgeworICAgICAgQXNzZXJ0LmZhaWwoIlRpbWUgb3V0Iik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltSZW1vdGVUZXN0XSAiICsgcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9BLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzYmM4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL0EuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QucmVwb3J0czsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3Qoc3VpdGVOYW1lID0gIlN1aXRlQS1KREs1IiwgdGVzdE5hbWUgPSAiVGVzdEEtSkRLNSIpCitwdWJsaWMgY2xhc3MgQSB7CisKKyAgcHVibGljIHZvaWQgZigpIHt9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q3NGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvQi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgdGVzdC5yZXBvcnRzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChzdWl0ZU5hbWUgPSAiU3VpdGVCLUpESzUiKQorcHVibGljIGNsYXNzIEIgeworCisgIHB1YmxpYyB2b2lkIGYoKSB7fQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9FbWFpbGFibGVSZXBvcnREcml2ZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL0VtYWlsYWJsZVJlcG9ydERyaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjM4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9FbWFpbGFibGVSZXBvcnREcml2ZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIHRlc3QucmVwb3J0czsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIEdlbmVyYXRlcyBtdWx0aXBsZSBwZXJtdXRhdGlvbnMgb2YgVGVzdE5HIG91dHB1dCB0byBzZWUgaG93IHRoaW5ncyBsb29rIGluIEVtYWlsYWJsZVJlcG9ydGVyLgorICoKKyAqIEBhdXRob3IgUGF1bCBNZW5kZWxzb24KKyAqIEBzaW5jZSA1LjMKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworQFRlc3QKK3B1YmxpYyBjbGFzcyBFbWFpbGFibGVSZXBvcnREcml2ZXIgeworCisgIHB1YmxpYyB2b2lkIGRvRmFpbHVyZVNhbnNMb2coKSB7CisgICAgQXNzZXJ0LmZhaWwoInNob3cgZmFpbHVyZSBpbiByZXBvcnQiKTsKKyAgfQorICBwdWJsaWMgdm9pZCBkb0ZhaWx1cmVOZXN0ZWQoKSB7CisgICAgQXNzZXJ0LmZhaWwoInNob3cgZmFpbHVyZSBpbiByZXBvcnQiLG5ldyBFeGNlcHRpb24oIlJlYWwgY3Vhc2UiKSk7CisgIH0KKyAgcHVibGljIHZvaWQgZG9GYWlsdXJlV2l0aExvZygpIHsKKyAgICBSZXBvcnRlci5sb2coIlByZXBhcmluZyB0byBmYWlsIik7CisgICAgQXNzZXJ0LmZhaWwoInNob3cgZmFpbHVyZSBpbiByZXBvcnQiKTsKKyAgfQorICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnM9e051bWJlckZvcm1hdEV4Y2VwdGlvbi5jbGFzc30pCisgIHB1YmxpYyB2b2lkIGRvRXhwZWN0ZWRFeGNlcHRpb25TYW5zTG9nKCkgeworICAgIFJlcG9ydGVyLmxvZygic3RlcCAxIik7CisgICAgUmVwb3J0ZXIubG9nKCJzdGVwIDIiKTsKKyAgICBJbnRlZ2VyLnBhcnNlSW50KCJCQUQgVEVYVCIpOworICB9CisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucz17TnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzfSkKKyAgcHVibGljIHZvaWQgZG9FeHBlY3RlZEV4Y2VwdGlvbldpdGhMb2coKSB7CisgICAgSW50ZWdlci5wYXJzZUludCgiQkFEIFRFWFQiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9GYWlsZWRSZXBvcnRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL0ZhaWxlZFJlcG9ydGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzliZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9GYWlsZWRSZXBvcnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIHRlc3QucmVwb3J0czsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CitpbXBvcnQgb3JnLnRlc3RuZy5yZXBvcnRlcnMuRmFpbGVkUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRSZXBvcnRlclRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTCA9ICI8c3VpdGUgbmFtZT1cIlN1aXRlXCI+XG4iCisgICAgICArICI8cGFyYW1ldGVyIG5hbWU9XCJuXCIgdmFsdWU9XCI0MlwiLz5cbiIKKyAgICAgICsgIjx0ZXN0IG5hbWU9XCJUZXN0XCI+XG4iCisgICAgICArICI8Y2xhc3Nlcz5cbiIKKyAgICAgICsgIjxwYXJhbWV0ZXIgbmFtZT1cIm9cIiB2YWx1ZT1cIjQzXCIvPlxuIgorICAgICAgKyAiPGNsYXNzIG5hbWU9XCJ0ZXN0LnJlcG9ydHMuRmFpbGVkU2FtcGxlVGVzdFwiPlxuIgorICAgICAgKyAiPHBhcmFtZXRlciBuYW1lPVwicFwiIHZhbHVlPVwiNDRcIi8+XG4iCisgICAgICArICI8L2NsYXNzPiIKKyAgICAgICsgIjwvY2xhc3Nlcz4iCisgICAgICArICI8L3Rlc3Q+PC9zdWl0ZT4iOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGZhaWxlZEZpbGUoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsKKyAgICB0bmcuc2V0VmVyYm9zZSgwKTsKKyAgICBDb2xsZWN0aW9uPFhtbFN1aXRlPiBzdWl0ZXMgPSAKKyAgICAgICAgbmV3IFBhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MLmdldEJ5dGVzKCkpKS5wYXJzZSgpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoTGlzdHMubmV3QXJyYXlMaXN0KHN1aXRlcykpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBGaWxlIGYgPSBuZXcgRmlsZSgiL3RtcCIpOworICAgIHRuZy5zZXRPdXRwdXREaXJlY3RvcnkoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgQ29sbGVjdGlvbjxYbWxTdWl0ZT4gZmFpbGVkU3VpdGVzID0KKyAgICAgICAgbmV3IFBhcnNlcihuZXcgRmlsZShmLCBGYWlsZWRSZXBvcnRlci5URVNUTkdfRkFJTEVEX1hNTCkuZ2V0QWJzb2x1dGVQYXRoKCkpLnBhcnNlKCk7CisgICAgWG1sU3VpdGUgZmFpbGVkU3VpdGUgPSBmYWlsZWRTdWl0ZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDIiLCBmYWlsZWRTdWl0ZS5nZXRQYXJhbWV0ZXIoIm4iKSk7CisKKyAgICBYbWxUZXN0IHRlc3QgPSBmYWlsZWRTdWl0ZS5nZXRUZXN0cygpLmdldCgwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MyIsIHRlc3QuZ2V0UGFyYW1ldGVyKCJvIikpOworCisgICAgWG1sQ2xhc3MgYyA9IHRlc3QuZ2V0Q2xhc3NlcygpLmdldCgwKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0NCIsIGMuZ2V0QWxsUGFyYW1ldGVycygpLmdldCgicCIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvRmFpbGVkU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvRmFpbGVkU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTlhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9GYWlsZWRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnJlcG9ydHM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRTYW1wbGVUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmYWlsZWQoKSB7CisgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxpbmcgaW50ZW50aW9uYWxseSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4ZGQyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL1JlcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorcGFja2FnZSB0ZXN0LnJlcG9ydHM7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuVGVzdEhlbHBlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgUmVwb3J0VGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW5kZXgoKSB7CisgICAgRmlsZSBvdXRwdXREaXIgPSBUZXN0SGVscGVyLmNyZWF0ZVJhbmRvbURpcmVjdG9yeSgpOworCisgICAgU3RyaW5nIHN1aXRlTmFtZSA9ICJWZXJpZnlJbmRleFN1aXRlIjsKKyAgICBTdHJpbmcgdGVzdE5hbWUgPSAiVG1wVGVzdCI7CisgICAgWG1sU3VpdGUgc3VpdGUgPSBUZXN0SGVscGVyLmNyZWF0ZVN1aXRlKHRlc3Quc2ltcGxlLlNpbXBsZVRlc3QuY2xhc3MsIHN1aXRlTmFtZSwgdGVzdE5hbWUpOworCisgICAgVGVzdE5HIHRuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKHN1aXRlLCBvdXRwdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgRmlsZSBmID0gZ2V0SHRtbFJlcG9ydEZpbGUob3V0cHV0RGlyLCBzdWl0ZU5hbWUsIHRlc3ROYW1lKTsKKworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKGYuZXhpc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZGlyZWN0b3J5U2hvdWxkQmVTdWl0ZU5hbWUoKSB7CisgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBUZXN0SGVscGVyLmNyZWF0ZVJhbmRvbURpcmVjdG9yeSgpOworCisgICAgWG1sU3VpdGUgeG1sU3VpdGUgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICBTdHJpbmcgc3VpdGVOYW1lID0gIlJlcG9ydFRlc3RTdWl0ZTEiOworICAgIHhtbFN1aXRlLnNldE5hbWUoc3VpdGVOYW1lKTsKKworICAgIFhtbFRlc3QgeG1sVGVzdCA9IG5ldyBYbWxUZXN0KHhtbFN1aXRlKTsKKyAgICBTdHJpbmcgdGVzdE5hbWUgPSAiVGVzdDEiOworICAgIHhtbFRlc3Quc2V0TmFtZSh0ZXN0TmFtZSk7CisKKyAgICBYbWxUZXN0IHhtbFRlc3QyID0gbmV3IFhtbFRlc3QoeG1sU3VpdGUpOworICAgIFN0cmluZyB0ZXN0TmFtZTIgPSAiVGVzdDIiOworICAgIHhtbFRlc3QyLnNldE5hbWUodGVzdE5hbWUyKTsKKworICAgIFRlc3RORyB0ZXN0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdGVzdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdGVzdG5nLnNldE91dHB1dERpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHRlc3RuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdCh4bWxTdWl0ZSkpOworCisgICAgRmlsZSBmID0gZ2V0SHRtbFJlcG9ydEZpbGUob3V0cHV0RGlyZWN0b3J5LCBzdWl0ZU5hbWUsIHRlc3ROYW1lKTsKKyAgICBGaWxlIGYyID0gZ2V0SHRtbFJlcG9ydEZpbGUob3V0cHV0RGlyZWN0b3J5LCBzdWl0ZU5hbWUsIHRlc3ROYW1lMik7CisKKyAgICB0ZXN0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmLmV4aXN0cygpLCAiRXhwZWN0ZWQgdG8gZmluZCBmaWxlOiIgKyBmKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmMi5leGlzdHMoKSwgIkV4cGVjdGVkIHRvIGZpbmQgZmlsZToiICsgZjIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgb25lRGlyZWN0b3J5UGVyU3VpdGUoKSB7CisgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBUZXN0SGVscGVyLmNyZWF0ZVJhbmRvbURpcmVjdG9yeSgpOworCisgICAgU3RyaW5nIHRlc3ROYW1lID0gIlRtcFRlc3QiOworICAgIFN0cmluZyBzdWl0ZU5hbWVBID0gIlJlcG9ydFN1aXRlQSI7CisgICAgWG1sU3VpdGUgeG1sU3VpdGVBID0gVGVzdEhlbHBlci5jcmVhdGVTdWl0ZSh0ZXN0LnJlcG9ydHMuQS5jbGFzcywgc3VpdGVOYW1lQSwgdGVzdE5hbWUpOworCisgICAgU3RyaW5nIHN1aXRlTmFtZUIgPSAiUmVwb3J0U3VpdGVCIjsKKyAgICBYbWxTdWl0ZSB4bWxTdWl0ZUIgPSBUZXN0SGVscGVyLmNyZWF0ZVN1aXRlKHRlc3QucmVwb3J0cy5CLmNsYXNzLCBzdWl0ZU5hbWVCLCB0ZXN0TmFtZSk7CisKKyAgICBUZXN0TkcgdGVzdG5nID0gVGVzdEhlbHBlci5jcmVhdGVUZXN0TkcoKTsKKyAgICB0ZXN0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KG91dHB1dERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdGVzdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHhtbFN1aXRlQSwgeG1sU3VpdGVCKSk7CisKKyAgICBGaWxlIGYxID0gZ2V0SHRtbFJlcG9ydEZpbGUob3V0cHV0RGlyZWN0b3J5LCBzdWl0ZU5hbWVBLCB0ZXN0TmFtZSk7CisgICAgRmlsZSBmMiA9IGdldEh0bWxSZXBvcnRGaWxlKG91dHB1dERpcmVjdG9yeSwgc3VpdGVOYW1lQiwgdGVzdE5hbWUpOworCisgICAgdGVzdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUoZjEuZXhpc3RzKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKGYyLmV4aXN0cygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0SHRtbFJlcG9ydEZpbGUoRmlsZSBvdXRwdXREaXIsIFN0cmluZyBzdWl0ZU5hbWUsIFN0cmluZyB0ZXN0TmFtZSkgeworICAgIEZpbGUgZiA9IG5ldyBGaWxlKG91dHB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIHN1aXRlTmFtZQorICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yQ2hhciArIHRlc3ROYW1lICsgIi5odG1sIik7CisgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgIGYuZGVsZXRlKCk7CisgICAgfQorICAgIHJldHVybiBmOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2hvdWxkSG9ub3JTdWl0ZU5hbWUoKSB7CisgICAgVGVzdE5HIHRlc3RuZyA9IFRlc3RIZWxwZXIuY3JlYXRlVGVzdE5HKCk7CisgICAgdGVzdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgQS5jbGFzcywgQi5jbGFzcyB9KTsKKyAgICBTdHJpbmcgb3V0cHV0RGlyID0gdGVzdG5nLmdldE91dHB1dERpcmVjdG9yeSgpOworCisgICAgU3RyaW5nIGRpckEgPSBvdXRwdXREaXIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiU3VpdGVBLUpESzUiOworICAgIEZpbGUgZmlsZUEgPSBuZXcgRmlsZShkaXJBKTsKKyAgICBTdHJpbmcgZGlyQiA9IG91dHB1dERpciArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJTdWl0ZUItSkRLNSI7CisgICAgRmlsZSBmaWxlQiA9IG5ldyBGaWxlKGRpckIpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShmaWxlQS5leGlzdHMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGZpbGVCLmV4aXN0cygpKTsKKworICAgIHRlc3RuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKGZpbGVBLmV4aXN0cygpLCBmaWxlQSArICIgd2Fzbid0IGNyZWF0ZWQiKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWxlQi5leGlzdHMoKSwgZmlsZUIgKyAiIHdhc24ndCBjcmVhdGVkIik7CisgIH0KKworICBzdGF0aWMgYm9vbGVhbiBtX3N1Y2Nlc3MgPSBmYWxzZTsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCByZXBvcnRMb2dTaG91bGRCZUF2YWlsYWJsZUV2ZW5XaXRoVGltZU91dCgpIHsKKyAgICBtX3N1Y2Nlc3MgPSBmYWxzZTsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IFJlcG9ydGVyU2FtcGxlVGVzdC5jbGFzcyB9KTsKKworICAgIElUZXN0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCB0cikgeworICAgICAgICBzdXBlci5vblRlc3RTdWNjZXNzKHRyKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG91dHB1dCA9IFJlcG9ydGVyLmdldE91dHB1dCh0cik7CisgICAgICAgIG1fc3VjY2VzcyA9IG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5zaXplKCkgPiAwOworICAgICAgfQorICAgIH07CisgICAgdG5nLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3N1Y2Nlc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRlckxvZ1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL1JlcG9ydGVyTG9nU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDZhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRlckxvZ1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIHRlc3QucmVwb3J0czsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5SZXBvcnRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5yZXBvcnRzLlJlcG9ydGVyTG9nU2FtcGxlVGVzdC5NeVRlc3RMaXN0ZW5lcjsKKworQExpc3RlbmVycyhNeVRlc3RMaXN0ZW5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXBvcnRlckxvZ1NhbXBsZVRlc3QgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGVzdExpc3RlbmVyIGV4dGVuZHMgVGVzdExpc3RlbmVyQWRhcHRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgIFJlcG9ydGVyLmxvZygiTG9nIGZyb20gbGlzdGVuZXIiKTsKKyAgICAgIHN1cGVyLm9uVGVzdFN1Y2Nlc3MocmVzdWx0KTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICBSZXBvcnRlci5sb2coIkxvZyBmcm9tIHRlc3QgbWV0aG9kIik7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRlckxvZ1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL1JlcG9ydGVyTG9nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTg1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRlckxvZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIHRlc3QucmVwb3J0czsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IFJlcG9ydGVyLmxvZygpIGluIGxpc3RlbmVycyBkb24ndCBnZXQgZGlzY2FyZGVkLgorICovCitwdWJsaWMgY2xhc3MgUmVwb3J0ZXJMb2dUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZExvZ0Zyb21MaXN0ZW5lcigpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFJlcG9ydGVyTG9nU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnJ1bigpOworICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBSZXBvcnRlci5nZXRPdXRwdXQoKTsKKyAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IoU3RyaW5nIHMgOiBvdXRwdXQpIHsKKyAgICAgIGlmIChzLmNvbnRhaW5zKCJMb2cgZnJvbSBsaXN0ZW5lciIpKSB7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0LmFzc2VydFRydWUoc3VjY2Vzcyk7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvUmVwb3J0ZXJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmVwb3J0cy9SZXBvcnRlclNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjJmYWZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvUmVwb3J0ZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSB0ZXN0LnJlcG9ydHM7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorLyoqDQorICogUmVncmVzc2lvbiB0ZXN0OiAgaWYgYSB0aW1lT3V0IGlzIHByb3ZpZGVkLCBnZXRSZXBvcnRlcih0ZXN0UmVzdWx0KSByZXR1cm5zDQorICogbnVsbC4NCisgKg0KKyAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDA2DQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y2VkcmljQGJldXN0LmNvbSI+Q2VkcmljIEJldXN0PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBSZXBvcnRlclNhbXBsZVRlc3Qgew0KKw0KKyAgQERhdGFQcm92aWRlcihuYW1lID0gImRwIikNCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZVBhcmFtZXRlcnMoKSB7DQorICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7DQorICAgICAgICBuZXcgT2JqZWN0W10geyAicGFyYW0xIn0sDQorICAgICAgICBuZXcgT2JqZWN0W10geyJwYXJhbTIifQ0KKyAgICB9Ow0KKyAgfQ0KKw0KKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIiwgdGltZU91dCA9IDEwMDAwKQ0KKyAgcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBwKSB7DQorICAgIFJlcG9ydGVyLmxvZygiSU4gVEhFIFJFUE9SVEVSOiAiICsgcCk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL1JlcG9ydGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JlcG9ydHMvUmVwb3J0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ODE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXBvcnRzL1JlcG9ydGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5yZXBvcnRzOworCitpbXBvcnQgb3JnLnRlc3RuZy4qOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BMaXN0ZW5lcnMoUmVwb3J0ZXJUZXN0LmNsYXNzKQorcHVibGljIGNsYXNzIFJlcG9ydGVyVGVzdCBleHRlbmRzIFRlc3RMaXN0ZW5lckFkYXB0ZXIgeworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvblN0YXJ0IChJVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsKKyAgICAgICAgUmVwb3J0ZXIubG9nICgiZm9vIik7CisgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZCgpIHsKKyAgICAgICAgUmVwb3J0ZXIubG9nICgiYmFyIik7IC8vIFRoaXMgbGluZSBpcyByZXF1aXJlZC4gRWxzZSB0aGUgbG9nIHRoYXQgd2FzIHRyaWdnZXJlZCBmcm9tIG9uU3RhcnQoKSB3b3VsZCBuZXZlciBiZQorICAgICAgICAvLyBwZXJzaXN0ZWQgYXQgYWxsLgorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSAoUmVwb3J0ZXIuZ2V0T3V0cHV0ICgpLnNpemUgKCkgPT0gMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvRXZlbnR1YWxTdWNjZXNzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmV0cnlBbmFseXplci9FdmVudHVhbFN1Y2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjUyYzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvRXZlbnR1YWxTdWNjZXNzLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0LnJldHJ5QW5hbHl6ZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworcHVibGljIGNsYXNzIEV2ZW50dWFsU3VjY2VzcyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmFuWWV0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgIEBUZXN0KHJldHJ5QW5hbHl6ZXIgPSBNeVJldHJ5LmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgIGlmICghcmFuWWV0LmdldEFuZFNldCh0cnVlKSkgeworICAgICAgQXNzZXJ0LmZhaWwoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0V4aXRDb2RlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvRXhpdENvZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2N2ZkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0V4aXRDb2RlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdGVzdC5yZXRyeUFuYWx5emVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgRXhpdENvZGVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleGl0c1dpdGhaZXJvT25TdWNjZXNzKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoSW1tZWRpYXRlU3VjY2Vzcy5jbGFzcyk7CisgICAgdG5nLnJ1bigpOworICAgIGFzc2VydEVxdWFscyh0bmcuZ2V0U3RhdHVzKCksIDApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZXhpdHNXaXRoTm9uemVyb09uRmFpbHVyZSgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFBlcnNpc3RlbnRGYWlsdXJlLmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisgICAgYXNzZXJ0VHJ1ZSh0bmcuZ2V0U3RhdHVzKCkgIT0gMCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBleGl0c1dpdGhaZXJvQWZ0ZXJTdWNjZXNzZnVsUmV0cnkoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShFdmVudHVhbFN1Y2Nlc3MuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKyAgICBhc3NlcnRFcXVhbHModG5nLmdldFN0YXR1cygpLCAwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvRmFjdG9yeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThkYzNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0LnJldHJ5QW5hbHl6ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgRmFjdG9yeVRlc3QgaW1wbGVtZW50cyBJVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBpbnQgbV9jb3VudCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIEZhY3RvcnlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQFRlc3QocmV0cnlBbmFseXplciA9IE15UmV0cnkuY2xhc3MpCisgICAgcHVibGljIHZvaWQgc29tZVRlc3QxKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgQ2FsbGVkIDogIiArIHRoaXMubmFtZSk7CisgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKCI1IikpIHsKKyAgICAgICAgICAgIG1fY291bnQrKzsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ltbWVkaWF0ZVN1Y2Nlc3MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ltbWVkaWF0ZVN1Y2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWE0ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvSW1tZWRpYXRlU3VjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LnJldHJ5QW5hbHl6ZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbW1lZGlhdGVTdWNjZXNzIHsKKyAgQFRlc3QocmV0cnlBbmFseXplciA9IE15UmV0cnkuY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ludm9jYXRpb25Db3VudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL0ludm9jYXRpb25Db3VudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY1YmFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvSW52b2NhdGlvbkNvdW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACitwYWNrYWdlIHRlc3QucmV0cnlBbmFseXplcjsNCisNCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsNCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmZhaWw7DQorDQoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLklSZXRyeUFuYWx5emVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db25jdXJyZW50SGFzaE11bHRpc2V0Ow0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpc2V0Ow0KKw0KKy8qKg0KKyAqIHJldHJ5QW5hbHl6ZXIgcGFyYW1ldGVyIHVuaXQgdGVzdHMuDQorICogQGF1dGhvciB0b2NtYW5AZ21haWwuY29tIChKZXJlbWllIExlbmZhbnQtRW5nZWxtYW5uKQ0KKyAqDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIEludm9jYXRpb25Db3VudFRlc3QgaW1wbGVtZW50cyBJUmV0cnlBbmFseXplciB7DQorICBzdGF0aWMgZmluYWwgTXVsdGlzZXQ8U3RyaW5nPiBpbnZvY2F0aW9ucyA9IENvbmN1cnJlbnRIYXNoTXVsdGlzZXQuY3JlYXRlKCk7DQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHJldHJpZXNSZW1haW5pbmcgPSBuZXcgQXRvbWljSW50ZWdlcigxMDApOw0KKw0KKyAgcHJpdmF0ZSBpbnQgcjEgPSAwOw0KKyAgcHJpdmF0ZSBpbnQgcjIgPSAwOw0KKyAgcHJpdmF0ZSBpbnQgcjMgPSAwOw0KKyAgcHJpdmF0ZSBpbnQgcjcgPSAwOw0KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbHVlID0gNDI7DQorDQorICBAVGVzdChyZXRyeUFuYWx5emVyID0gSW52b2NhdGlvbkNvdW50VGVzdC5jbGFzcykNCisgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uV2l0aE5vUmV0cmllcygpIHsNCisgIH0NCisNCisgIEBUZXN0KHJldHJ5QW5hbHl6ZXIgPSBJbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzKQ0KKyAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25XaXRoT25lUmV0cnkoKSB7DQorICAgIGlmIChyMSsrIDwgMSkgew0KKyAgICAgIGZhaWwoKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgQFRlc3QocmV0cnlBbmFseXplciA9IEludm9jYXRpb25Db3VudFRlc3QuY2xhc3MpDQorICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbldpdGhTZXZlblJldHJpZXMoKSB7DQorICAgIGlmIChyNysrIDwgNykgew0KKyAgICAgIGZhaWwoKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgQFRlc3QocmV0cnlBbmFseXplciA9IFRocmVlUmV0cmllcy5jbGFzcywgc3VjY2Vzc1BlcmNlbnRhZ2UgPSAwKQ0KKyAgcHVibGljIHZvaWQgZmFpbEFmdGVyVGhyZWVSZXRyaWVzKCkgew0KKyAgICBmYWlsKCk7DQorICB9DQorDQorICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gew0KKyAgICAgICJ0ZXN0QW5ub3RhdGlvbldpdGhOb1JldHJpZXMiLA0KKyAgICAgICJ0ZXN0QW5ub3RhdGlvbldpdGhPbmVSZXRyeSIsDQorICAgICAgInRlc3RBbm5vdGF0aW9uV2l0aFNldmVuUmV0cmllcyIsDQorICAgICAgImZhaWxBZnRlclRocmVlUmV0cmllcyINCisgIH0sIGFsd2F5c1J1biA9IHRydWUpDQorICBwdWJsaWMgdm9pZCBjaGVja0ludm9jYXRpb25Db3VudHMoKSB7DQorICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9ucy5jb3VudCgidGVzdEFubm90YXRpb25XaXRoTm9SZXRyaWVzIiksIDApOw0KKyAgICBhc3NlcnRFcXVhbHMoaW52b2NhdGlvbnMuY291bnQoInRlc3RBbm5vdGF0aW9uV2l0aE9uZVJldHJ5IiksIDEpOw0KKyAgICBhc3NlcnRFcXVhbHMoaW52b2NhdGlvbnMuY291bnQoInRlc3RBbm5vdGF0aW9uV2l0aFNldmVuUmV0cmllcyIpLCA3KTsNCisgICAgYXNzZXJ0RXF1YWxzKGludm9jYXRpb25zLmNvdW50KCJmYWlsQWZ0ZXJUaHJlZVJldHJpZXMiKSwgNCk7DQorICB9DQorDQorICBARGF0YVByb3ZpZGVyKG5hbWU9ImRhdGFQcm92aWRlciIpDQorICBwcml2YXRlIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyKCkgew0KKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geyB7IDEsIGZhbHNlIH0sIHsgMCwgdHJ1ZSB9LCB7IDAsIHRydWUgfSwNCisgICAgICAgIHsgMSwgZmFsc2UgfSB9Ow0KKyAgfQ0KKw0KKyAgQERhdGFQcm92aWRlcihuYW1lPSJkYXRhUHJvdmlkZXIyIikNCisgIHByaXZhdGUgT2JqZWN0W11bXSBkYXRhUHJvdmlkZXIyKCkgew0KKyAgICB2YWx1ZSA9IDQyOw0KKw0KKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geyB7IHRydWUgfSwgeyB0cnVlIH0gfTsNCisgIH0NCisNCisgIEBUZXN0KHJldHJ5QW5hbHl6ZXIgPSBJbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzLCBkYXRhUHJvdmlkZXIgPSAiZGF0YVByb3ZpZGVyIikNCisgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uV2l0aERhdGFQcm92aWRlcihpbnQgcGFmLCBib29sZWFuIHRlc3QpIHsNCisgICAgaWYgKHBhZiA9PSAxICYmIHRlc3QgPT0gZmFsc2UpIHsNCisgICAgICBpZiAocjIgPj0gMSkgew0KKyAgICAgICAgcjItLTsNCisgICAgICAgIGZhaWwoKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIEBUZXN0KHJldHJ5QW5hbHl6ZXIgPSBJbnZvY2F0aW9uQ291bnRUZXN0LmNsYXNzLCBkYXRhUHJvdmlkZXIgPSAiZGF0YVByb3ZpZGVyMiIpDQorICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbldpdGhEYXRhUHJvdmlkZXJBbmRSZWNyZWF0ZVBhcmFtZXRlcnMoYm9vbGVhbiBkdW1teSkgew0KKyAgICBpZiAocjMgPT0gMSkgew0KKyAgICAgIHRoaXMudmFsdWUgPSAwOw0KKyAgICAgIHIzLS07DQorICAgICAgZmFpbCgpOw0KKyAgICB9IGVsc2UgaWYgKHIzID09IDApIHsNCisgICAgICBhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgNDIpOw0KKyAgICB9DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgd2l0aEZhY3RvcnkoKSB7DQorICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7DQorICAgIHRuZy5zZXRWZXJib3NlKDApOw0KKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBNeUZhY3RvcnkuY2xhc3N9KTsNCisgICAgRmFjdG9yeVRlc3QubV9jb3VudCA9IDA7DQorDQorICAgIHRuZy5ydW4oKTsNCisNCisgICAgYXNzZXJ0RXF1YWxzKEZhY3RvcnlUZXN0Lm1fY291bnQsIDQpOw0KKyAgfQ0KKw0KKyAgQE92ZXJyaWRlDQorICBwdWJsaWMgYm9vbGVhbiByZXRyeShJVGVzdFJlc3VsdCByZXN1bHQpIHsNCisgICAgaW52b2NhdGlvbnMuYWRkKHJlc3VsdC5nZXROYW1lKCkpOw0KKyAgICByZXR1cm4gcmV0cmllc1JlbWFpbmluZy5nZXRBbmREZWNyZW1lbnQoKSA+PSAwOw0KKyAgfQ0KKw0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJlZVJldHJpZXMgaW1wbGVtZW50cyBJUmV0cnlBbmFseXplciB7DQorICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciByZW1haW5pbmdSZXRyaWVzID0gbmV3IEF0b21pY0ludGVnZXIoMyk7DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiByZXRyeShJVGVzdFJlc3VsdCByZXN1bHQpIHsNCisgICAgICBpbnZvY2F0aW9ucy5hZGQocmVzdWx0LmdldE5hbWUoKSk7DQorICAgICAgcmV0dXJuIHJlbWFpbmluZ1JldHJpZXMuZ2V0QW5kRGVjcmVtZW50KCkgPiAwOw0KKyAgICB9DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL015RmFjdG9yeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvTXlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTIwMmE1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL015RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgdGVzdC5yZXRyeUFuYWx5emVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5GYWN0b3J5OworCitwdWJsaWMgY2xhc3MgTXlGYWN0b3J5IHsKKyAgICBARmFjdG9yeQorICAgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGVUZXN0cygpIHsKKyAgICAgICAgaW50IG51bSA9IDEwOworICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W251bV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgIEZhY3RvcnlUZXN0IG9iaiA9IG5ldyBGYWN0b3J5VGVzdCgiVGVzdCIgKyBpKTsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IG9iajsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL015UmV0cnkuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL015UmV0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZGYyZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvTXlSZXRyeS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC5yZXRyeUFuYWx5emVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLnV0aWwuUmV0cnlBbmFseXplckNvdW50OworCitwdWJsaWMgY2xhc3MgTXlSZXRyeSBleHRlbmRzICBSZXRyeUFuYWx5emVyQ291bnQgeworCisJcHVibGljIE15UmV0cnkoKXsKKwkJc2V0Q291bnQoMyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcmV0cnlNZXRob2QoSVRlc3RSZXN1bHQgYXJnMCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3JldHJ5QW5hbHl6ZXIvUGVyc2lzdGVudEZhaWx1cmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL1BlcnNpc3RlbnRGYWlsdXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlNGZiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL1BlcnNpc3RlbnRGYWlsdXJlLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnJldHJ5QW5hbHl6ZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW50RmFpbHVyZSB7CisgIEBUZXN0KHJldHJ5QW5hbHl6ZXIgPSBNeVJldHJ5LmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgIEFzc2VydC5mYWlsKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9yZXRyeUFuYWx5emVyL1JldHJ5QW5hbHl6ZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmV0cnlBbmFseXplci9SZXRyeUFuYWx5emVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlM2ZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvcmV0cnlBbmFseXplci9SZXRyeUFuYWx5emVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgdGVzdC5yZXRyeUFuYWx5emVyOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBSZXRyeUFuYWx5emVyVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZvY2F0aW9uQ291bnRzKCkgeworICAgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKEludm9jYXRpb25Db3VudFRlc3QuY2xhc3MpOworICAgICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworCisgICAgICAgIHRuZy5ydW4oKTsKKworICAgICAgICBhc3NlcnRGYWxzZSh0bmcuaGFzRmFpbHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodG5nLmhhc1NraXAoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5pc0VtcHR5KCkpOworCisgICAgICAgIExpc3Q8SVRlc3RSZXN1bHQ+IGZzcCA9IHRsYS5nZXRGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZVRlc3RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmc3Auc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZzcC5nZXQoMCkuZ2V0TmFtZSgpLCAiZmFpbEFmdGVyVGhyZWVSZXRyaWVzIik7CisKKyAgICAgICAgTGlzdDxJVGVzdFJlc3VsdD4gc2tpcHBlZCA9IHRsYS5nZXRTa2lwcGVkVGVzdHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNraXBwZWQuc2l6ZSgpLCBJbnZvY2F0aW9uQ291bnRUZXN0Lmludm9jYXRpb25zLnNpemUoKSAtIGZzcC5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0FmdGVyQ2xhc3NDYWxsZWRBdEVuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmY4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0FmdGVyQ2xhc3NDYWxsZWRBdEVuZC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgdGVzdC5zYW1wbGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogQ2hlY2sgdG8gc2VlIHRoYXQgQWZ0ZXJDbGFzcyBpcyBjYWxsZWQgb25seSBhdCB0aGUgZW5kIGFuZCB0aGF0IGFmdGVyIG1ldGhvZHMKKyAqIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUgYmVmb3JlIG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBBZnRlckNsYXNzQ2FsbGVkQXRFbmQgZXh0ZW5kcyBCYXNlQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kIHsKKyAgYm9vbGVhbiBtX2JlZm9yZTFDbGFzcyA9IGZhbHNlOworICBib29sZWFuIG1fdGVzdDEgPSBmYWxzZTsKKyAgYm9vbGVhbiBtX3Rlc3QyID0gZmFsc2U7CisgIGJvb2xlYW4gbV90ZXN0MyA9IGZhbHNlOworCisgIEBCZWZvcmVDbGFzcyhncm91cHMgPSB7ICJiZWZvcmUxQ2xhc3MiIH0gKQorICBwdWJsaWMgdm9pZCBiZWZvcmUxQ2xhc3MoKSB7CisgICAgbV9iZWZvcmUxQ2xhc3MgPSB0cnVlOworICB9CisKKyAgQEFmdGVyQ2xhc3MoZ3JvdXBzID0geyAic29tZUdyb3VwIiB9KQorICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgIG1fYWZ0ZXJDbGFzcyA9IHRydWU7CisgICAgYXNzZXJ0IG1fdGVzdDEgJiYgbV90ZXN0MiAmJiBtX3Rlc3QzIDoKKyAgICAgICJPbmUgb2YgdGhlIHRlc3QgbWV0aG9kcyB3YXMgbm90IGludm9rZWQ6ICIgKyBtX3Rlc3QxICsgIiAiICsgbV90ZXN0MiArICIgIiArIG1fdGVzdDM7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJWZXJpZnkgdGhhdCBiZWZvcmVDbGFzcyBhbmQgYWZ0ZXJDbGFzcyBhcmUgY2FsbGVkIGNvcnJlY3RseSIpCisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgIG1fdGVzdDEgPSB0cnVlOworICAgIGFzc2VydCBtX2JlZm9yZTFDbGFzcyA6ICJiZWZvcmVDbGFzcyBjb25maWd1cmF0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBtZXRob2QiOworICAgIGFzc2VydCAhIG1fYWZ0ZXJDbGFzcyA6ICJhZnRlckNsYXNzIGNvbmZpZ3VyYXRpb24gbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSB0ZXN0IG1ldGhvZCI7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICBtX3Rlc3QyID0gdHJ1ZTsKKyAgICBhc3NlcnQgbV9iZWZvcmUxQ2xhc3MgOiAiYmVmb3JlQ2xhc3MgY29uZmlndXJhdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbWV0aG9kIjsKKyAgICBhc3NlcnQgISBtX2FmdGVyQ2xhc3MgOiAiYWZ0ZXJDbGFzcyBjb25maWd1cmF0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgdGVzdCBtZXRob2QiOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgbV90ZXN0MyA9IHRydWU7CisgICAgYXNzZXJ0IG1fYmVmb3JlMUNsYXNzIDogImJlZm9yZUNsYXNzIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG1ldGhvZCI7CisgICAgYXNzZXJ0ICEgbV9hZnRlckNsYXNzIDogImFmdGVyQ2xhc3MgY29uZmlndXJhdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIHRlc3QgbWV0aG9kIjsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9BbGxKVW5pdFRlc3RzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0FsbEpVbml0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA2NTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9BbGxKVW5pdFRlc3RzLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogVGVzdHMgdGhlIHN1aXRlKCkgZnVuY3Rpb25hbGl0eSBvZiBUZXN0TkcKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgTWF5IDUsIDIwMDQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxKVW5pdFRlc3RzIHsKKyAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgIFRlc3RTdWl0ZSBzdWl0ZT0gbmV3IFRlc3RTdWl0ZSgpOworICAgIHN1aXRlLmFkZFRlc3QobmV3IEpVbml0U2FtcGxlMShKVW5pdFNhbXBsZTEuRVhQRUNURUQxKSk7CisgICAgc3VpdGUuYWRkVGVzdChuZXcgSlVuaXRTYW1wbGUyKEpVbml0U2FtcGxlMi5FWFBFQ1RFRCkpOworICAgIHJldHVybiBzdWl0ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9CYXNlQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0Jhc2VBZnRlckNsYXNzQ2FsbGVkQXRFbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFmNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9CYXNlQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKKworcHVibGljIGNsYXNzIEJhc2VBZnRlckNsYXNzQ2FsbGVkQXRFbmQgeworICBwcm90ZWN0ZWQgYm9vbGVhbiBtX2FmdGVyQ2xhc3MgPSBmYWxzZTsKKworICBAQWZ0ZXJDbGFzcyhkZXBlbmRzT25Hcm91cHMgPSB7ICIuKiIgfSkKKyAgcHVibGljIHZvaWQgYmFzZUFmdGVyQ2xhc3MoKSB7CisgICAgYXNzZXJ0IG1fYWZ0ZXJDbGFzcyA6ICJUaGlzIGFmdGVyQ2xhc3MgbWV0aG9kIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIGxhc3QiOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0Jhc2VTYW1wbGUxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0Jhc2VTYW1wbGUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzZVNhbXBsZTEuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3Quc2FtcGxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKKy8qKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEFwciAzMCwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIEJhc2VTYW1wbGUxIHsKKworICBAVGVzdChncm91cHMgPSB7ICJvZGQiIH0pCisgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9CYXNlU2FtcGxlSW5oZXJpdGFuY2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzZVNhbXBsZUluaGVyaXRhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3ZWNlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzZVNhbXBsZUluaGVyaXRhbmNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEFwciAzMCwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIEJhc2VTYW1wbGVJbmhlcml0YW5jZSB7CisKKyAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBtX2NvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlndXJhdGlvbihTdHJpbmcgYykgeworICAgIG1fY29uZmlndXJhdGlvbnMuYWRkKGMpOworICAgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiBtX2ludm9rZWRCYXNlTWV0aG9kID0gZmFsc2U7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiaW5oZXJpdGVkVGVzdE1ldGhvZCIgfSkKKyAgcHVibGljIHZvaWQgYmFzZU1ldGhvZCgpIHsKKyAgICBtX2ludm9rZWRCYXNlTWV0aG9kID0gdHJ1ZTsKKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIG1faW52b2tlZEJhc2VDb25maWd1cmF0aW9uID0gZmFsc2U7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJhc2VDb25maWd1cmF0aW9uKCkgeworICAgIG1faW52b2tlZEJhc2VDb25maWd1cmF0aW9uID0gdHJ1ZTsKKyAgfQorCisgIEBCZWZvcmVDbGFzcyhncm91cHMgPSB7ICJjb25maWd1cmF0aW9uMSIgfSwKKyAgICAgICAgICAgICAgICAgZGVwZW5kc09uR3JvdXBzID0geyAiY29uZmlndXJhdGlvbjAiIH0pCisgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb24xKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJDT05GSUdVUkFUSU9OIDEiKTsKKyAgICBhZGRDb25maWd1cmF0aW9uKCJjb25maWd1cmF0aW9uMSIpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyAiaW5oZXJpdGVkVGVzdE1ldGhvZCIgfSkKKyAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgeworICAgIGFzc2VydCBtX2ludm9rZWRCYXNlTWV0aG9kIDogIkRpZG4ndCBpbnZva2UgdGVzdCBtZXRob2QgaW4gYmFzZSBjbGFzcyI7CisgICAgYXNzZXJ0IG1faW52b2tlZEJhc2VDb25maWd1cmF0aW9uIDogIkRpZG4ndCBpbnZva2UgY29uZmlndXJhdGlvbiBtZXRob2QgaW4gYmFzZSBjbGFzcyI7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9CYXNpYzEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzaWMxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5NDdlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzaWMxLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEJhc2ljMSB7CisgIHN0YXRpYyBwcml2YXRlIGludCBtX2NvdW50ID0gMDsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5jcmVtZW50Q291bnQoKSB7CisgICAgbV9jb3VudCsrOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgcmV0dXJuIG1fY291bnQ7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3RNZXRob2QoKSB7CisgICAgaW5jcmVtZW50Q291bnQoKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgImJhc2ljMSIgfSApCisgIHB1YmxpYyB2b2lkIGJhc2ljMSgpIHsKKyAgICBhc3NlcnQgZ2V0Q291bnQoKSA+IDAgOiAiQ09VTlQgV0FTIE5PVCBJTkNSRU1FTlRFRCI7CisgIH0KKworICBzdGF0aWMgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2ljMV0gIiArIHMpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9CYXNpYzIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzaWMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjY2EyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvQmFzaWMyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNpYzIgeworICBwcml2YXRlIGJvb2xlYW4gbV9iYXNpYzJXYXNSdW4gPSBmYWxzZTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fYWZ0ZXJDbGFzcyA9IDA7CisKKyAgQFRlc3QoZGVwZW5kc09uR3JvdXBzID0geyAiYmFzaWMxIiB9KQorICBwdWJsaWMgdm9pZCBiYXNpYzIoKSB7CisgICAgbV9iYXNpYzJXYXNSdW4gPSB0cnVlOworICAgIGFzc2VydCBCYXNpYzEuZ2V0Q291bnQoKSA+IDAgOiAiQ09VTlQgV0FTIE5PVCBJTkNSRU1FTlRFRCI7CisgIH0KKworICBAQWZ0ZXJUZXN0CisgIHB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CisgICAgbV9iYXNpYzJXYXNSdW4gPSBmYWxzZTsKKyAgICBtX2FmdGVyQ2xhc3MgPSAwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2ljMiAiCisgICAgICAgICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIiBdICIgKyBoYXNoQ29kZSgpICsgIiAiICsgcyk7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBjaGVja1Rlc3RBdENsYXNzTGV2ZWxXYXNSdW4oKSB7CisgICAgbV9hZnRlckNsYXNzKys7CisgICAgYXNzZXJ0IG1fYmFzaWMyV2FzUnVuIDogIkNsYXNzIGFubm90YXRlZCB3aXRoIEBUZXN0IGRpZG4ndCBoYXZlIGl0cyBtZXRob2RzIHJ1bi4iOworICAgIGFzc2VydCAxID09IG1fYWZ0ZXJDbGFzcyA6ICJBZnRlciBjbGFzcyBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCBleGFjdGx5IG9uY2UsIG5vdCAiICsgbV9hZnRlckNsYXNzOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9Db252ZXJ0ZXJTYW1wbGUzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0NvbnZlcnRlclNhbXBsZTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ2MjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9Db252ZXJ0ZXJTYW1wbGUzLmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsNCisNCisvKg0KKyAqIENyZWF0ZWQgb24gMTItU2VwLTIwMDYgYnkgbWljaGViMTANCisgKi8NCisNCisvKioNCisgKiBTYW1wbGUgZmlsZSBmb3IgdGhlIEphdmFkb2MgYW5ub3RhdGlvbnMgdG8gSmF2YSA1IGFubm90YXRpb25zIGNvbnZlcnRlciBmb3IgYSBub24tZGVmYXVsdCBwYWNrYWdlDQorICogQGF1dGhvciBtaWNoZWIxMCAxMi1TZXAtMjAwNg0KKyAqIEB0ZXN0bmcudGVzdA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb252ZXJ0ZXJTYW1wbGUzIHsNCisJLyoqDQorCSAqIFRoaXMgY29tbWVudCBsaW5lIHNob3VsZCBiZSBwcmVzZXJ2ZWQNCisJICogQHRlc3RuZy5iZWZvcmUtc3VpdGUgYWx3YXlzUnVuID0gInRydWUiDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZUFsd2F5c1J1bigpIHsNCisJCS8vIFdlIGFyZSBqdXN0IGNoZWNraW5nIGFwcHJvcHJpYXRlIGFubm90YXRpb25zIGFyZSBhZGRlZCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IGJvZHkNCisJfQ0KKw0KKwkvKioNCisJICogQHRlc3RuZy50ZXN0DQorCSAqLw0KKwlwdWJsaWMgdm9pZCBwbGFpblRlc3QoKSB7DQorCQkvLyBFbXB0eSBib2R5DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcudGVzdA0KKwkgKiBAdGVzdG5nLmV4cGVjdGVkLWV4Y2VwdGlvbnMNCisJICogdmFsdWUgPSAiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb24iDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBleHBlY3RlZEV4Y2VwdGlvbnMoKSB7DQorCQkvLyBFbXB0eSBib2R5DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcudGVzdCBncm91cHMgPSAiZ3JvdXBBIGdyb3VwQiINCisJICovDQorCXB1YmxpYyB2b2lkIHRlc3RHcm91cHMoKSB7DQorCQkvLyBFbXB0eSBib2R5DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcuYWZ0ZXItbWV0aG9kDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZnRlck1ldGhvZCgpIHsNCisJCS8vIEVtcHR5IGJvZHkNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZXkgc2hvdWxkIGJlIHByZXNlcnZlZA0KKwkgKiBAYXV0aG9yIFRoZSBhdXRob3IgaXMgYSBzdGFuZGFyZCB0YWcgYW5kIHNob3VsZCBub3QgYmUgdG91Y2hlZA0KKwkgKiBAdGVzdG5nLnRlc3QgZ3JvdXBzID0gImdyb3VwQSIgYWx3YXlzUnVuPXRydWUNCisJICogCQlkZXBlbmRzT25NZXRob2RzID0gImV4cGVjdGVkRXhjZXB0aW9ucyIgdGltZU91dD0iMzAwMCINCisJICogQHZlcnNpb24gYW5vdGhlciBzdGFuZGFyZCB0YWcgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkDQorCSAqIEB0ZXN0bmcuZXhwZWN0ZWQtZXhjZXB0aW9ucw0KKwkgKiB2YWx1ZSA9ICJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gamF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbiINCisJICogQHRlc3RuZy5wYXJhbWV0ZXJzIHZhbHVlPSJmaXJzdFBhcmFtZXRlciBzZWNvbmRQYXJhbWV0ZXIgdGhpcmRQYXJhbWV0ZXIiDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB0ZXN0RXZlcnl0aGluZygpIHsNCisJCS8vIExvdHMgYW5kIGxvdHMgb2Ygc3R1ZmYNCisJfQ0KKw0KKwkvKioNCisJICogQHRlc3RuZy5kYXRhLXByb3ZpZGVyIG5hbWU9InRlc3QxIg0KKwkgKi8NCisJcHVibGljIE9iamVjdFtdW10gZGF0YVByb3ZpZGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEB0ZXN0bmcuZmFjdG9yeQ0KKwkgKi8NCisJcHVibGljIE9iamVjdFtdIGZhY3RvcnkoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQHRlc3RuZy50ZXN0DQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgVGVzdElubmVyQ2xhc3Mgew0KKwkJcHVibGljIHZvaWQgYmFyZUlubmVyTWV0aG9kKCkgew0KKwkJCS8vIEVtcHR5IGJvZHkNCisJCX0NCisNCisJCS8qKg0KKwkJICogQHRlc3RuZy50ZXN0DQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHRlc3RJbm5lck1ldGhvZCgpIHsNCisJCQkvLyBlbXB0eSBib2R5DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9JbnZvY2F0aW9uQ291bnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0ludm9jYXRpb25Db3VudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTcxOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9JbnZvY2F0aW9uQ291bnRUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRlc3QgaW52b2NhdGlvbkNvdW50VGVzdAorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ291bnRUZXN0IHsKKworICAvLworICAvLyBJbnZvY2F0aW9uIHRlc3QKKyAgLy8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fY291bnQgPSAwOworCisgIEBBZnRlclN1aXRlKGdyb3VwcyA9IHsiaW52b2NhdGlvbk9ubHkifSkKKyAgcHVibGljIHZvaWQgYWZ0ZXJTdWl0ZSgpIHsKKyAgICBtX2NvdW50ID0gMDsKKyAgICBtX2NvdW50MiA9IDA7CisgICAgbV9jb3VudDMgPSAwOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiaW52b2NhdGlvbk9ubHkifSwgaW52b2NhdGlvbkNvdW50ID0gMTAgKQorICBwdWJsaWMgdm9pZCB0ZW5UaW1lc1Nob3VsZFN1Y2NlZWQoKSB7CisgICAgbV9jb3VudCsrOworICB9CisKKyAgLy8KKyAgLy8gSW52b2NhdGlvbiArIFN1Y2Nlc3MgcGVyY2VudGFnZSB0ZXN0CisgIC8vIFRoaXMgbWV0aG9kIHdpbGwgd29yayB0aGUgZmlyc3QgOCB0aW1lcyBhbmQgZmFpbCBhZnRlciB0aGF0LCBidXQgb3ZlcmFsbAorICAvLyB0aGUgdGVzdCBzaG91bGQgc3RpbGwgcGFzcyBiZWNhdXNlIHN1Y2Nlc3NQZXJjZW50YWdlID0gODAKKyAgLy8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG1fY291bnQyID0gMDsKKworICBAVGVzdChncm91cHMgPSB7ICJzdWNjZXNzUGVyY2VudGFnZVRoYXRTdWNjZWVkc09ubHkiIH0sCisgICAgaW52b2NhdGlvbkNvdW50ID0gMTAsIHN1Y2Nlc3NQZXJjZW50YWdlID0gODApCisgIHB1YmxpYyB2b2lkIHN1Y2Nlc3NQZXJjZW50YWdlU2hvdWxkU3VjY2VlZCgpIHsKKyAgICBpZiAobV9jb3VudDIgPj0gOCkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbGxlZCBtb3JlIHRoYW4gZWlnaHQgdGltZXMgOiAiICsgbV9jb3VudDIpOworICAgIH0KKyAgICBtX2NvdW50MisrOworICB9CisKKyAgLy8KKyAgLy8gSW52b2NhdGlvbiArIFN1Y2Nlc3MgcGVyY2VudGFnZSB0ZXN0CisgIC8vIFRoaXMgbWV0aG9kIHdpbGwgd29yayB0aGUgZmlyc3QgOCB0aW1lcyBhbmQgZmFpbCBhZnRlciB0aGF0LiAgT25lIG9mCisgIC8vIHRoZSBmYWlsdXJlcyB3aWxsIGZhbGwgdW5kZXIgdGhlIHBlcmNlbnRhZ2UgdG9sZXJhbmNlIGJ1dCB0aGUgbmV4dCBvbmUKKyAgLy8gd2lsbCBub3QuCisgIC8vCisgIHByaXZhdGUgc3RhdGljIGludCBtX2NvdW50MyA9IDA7CisKKyAgQFRlc3QoZ3JvdXBzID0geyAic3VjY2Vzc1BlcmNlbnRhZ2VUaGF0RmFpbHNPbmx5IiB9LAorICAgIGludm9jYXRpb25Db3VudCA9IDEwLCBzdWNjZXNzUGVyY2VudGFnZSA9IDkwKQorICBwdWJsaWMgdm9pZCBzdWNjZXNzUGVyY2VudGFnZVNob3VsZEZhaWwoKSB7CisgICAgaWYgKG1fY291bnQzPj0gOCkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbGxlZCBtb3JlIHRoYW4gZWlnaHQgdGltZXMgOiAiICsgbV9jb3VudDMpOworICAgIH0KKyAgICBtX2NvdW50MysrOworICB9CisKKyAgQEFmdGVyQ2xhc3MoZ3JvdXBzID0geyAiaW52b2NhdGlvbk9ubHkifSkKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGFzc2VydCAxMCA9PSBtX2NvdW50IDogIk1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQgMTAgdGltZXMgYnV0IHdhcyBpbnZva2VkICIKKyAgICAgICsgbV9jb3VudCArICIgdGltZXMiOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0ludm9jYXRpb25Db3VudF0gIiArIHMpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvSlVuaXRTYW1wbGUxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjhjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgdGVzdC5zYW1wbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcworICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgNSwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIEpVbml0U2FtcGxlMSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBTdHJpbmcgbV9maWVsZCA9IG51bGw7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEMiA9ICJ0ZXN0U2FtcGxlMV8yIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURUQxID0gInRlc3RTYW1wbGUxXzEiOworCisgIHB1YmxpYyBKVW5pdFNhbXBsZTEoKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBKVW5pdFNhbXBsZTEoU3RyaW5nIG4pIHsKKyAgICBzdXBlcihuKTsKKyAgfQorCisgQE92ZXJyaWRlCitwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBtX2ZpZWxkID0gImZvbyI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgbV9maWVsZCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICoKKyAgICoKKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RTYW1wbGUxXzEoKSB7CisvLyAgICBwcHAoIlNhbXBsZSAxXzEiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYW1wbGUxXzIoKSB7CisvLyAgICBwcHAoIlNhbXBsZSAxXzIiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbSlVuaXRTYW1wbGUxXSAiICsgcyk7CisgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvSlVuaXRTYW1wbGUyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljM2FlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgdGVzdC5zYW1wbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBjbGFzcworICoKKyAqIEBhdXRob3IgQ2VkcmljIEJldXN0LCBNYXkgNSwgMjAwNAorICoKKyAqLworcHVibGljIGNsYXNzIEpVbml0U2FtcGxlMiBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURUQgPSAidGVzdFNhbXBsZTJUaGF0U2V0VXBXYXNSdW4iOworICBwcml2YXRlIFN0cmluZyBtX2ZpZWxkID0gbnVsbDsKKworICBwdWJsaWMgSlVuaXRTYW1wbGUyKCkgeworICAgIHN1cGVyKCk7CisgIH0KKworICBwdWJsaWMgSlVuaXRTYW1wbGUyKFN0cmluZyBuKSB7CisgICAgc3VwZXIobik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgbV9maWVsZCA9ICJmb28iOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhbXBsZTJUaGF0U2V0VXBXYXNSdW4oKSB7CisgICAgYXNzZXJ0IG51bGwgIT0gbV9maWVsZCA6ICJzZXRVcCgpIHdhc24ndCBydW4iOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvSlVuaXRTYW1wbGUzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMzMzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL0pVbml0U2FtcGxlMy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5zYW1wbGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHZlcmlmaWVzIHRoYXQgYSBuZXcgaW5zdGFuY2UgaXMgdXNlZCBldmVyeSB0aW1lCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIEpVbml0U2FtcGxlMyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBpbnQgbV9jb3VudCA9IDA7CisKKyAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbV9jb3VudCwgMCk7CisgICAgbV9jb3VudCsrOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbV9jb3VudCwgMCk7CisgICAgbV9jb3VudCsrOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltKVW5pdFNhbXBsZTNdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9KVW5pdFNhbXBsZTQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvSlVuaXRTYW1wbGU0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4NWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvSlVuaXRTYW1wbGU0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgbHVrYXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEpVbml0U2FtcGxlNCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgaW50IGkgPSAwOworCisgICAgcHVibGljIEpVbml0U2FtcGxlNChTdHJpbmcgbmFtZSwgaW50IGkpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHRoaXMuaSA9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFhZKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIDEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgdHMgPSBuZXcgVGVzdFN1aXRlKCJTYW1wbGUgU3VpdGUiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHRzLmFkZFRlc3QobmV3IFQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUIGV4dGVuZHMgSlVuaXRTYW1wbGU0IHsKKworICAgICAgICBwdWJsaWMgVChpbnQgaSkgeworICAgICAgICAgICAgc3VwZXIoInRlc3RYWSIsIGkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9QYXJ0aWFsR3JvdXBUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1BhcnRpYWxHcm91cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNiOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9QYXJ0aWFsR3JvdXBUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgdGVzdHMgZ3JvdXBzIHRoYXQgYXJlIHBhcnRpYWxseSBkZWZpbmVkIGF0IHRoZSBjbGFzcyBsZXZlbAorICogYW5kIHRoZW4gYXVnbWVudGVkIGF0IHRoZSBtZXRob2QgbGV2ZWwuCisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworCitAVGVzdChncm91cHMgPSB7ICJjbGFzc0dyb3VwIiB9KQorcHVibGljIGNsYXNzIFBhcnRpYWxHcm91cFRlc3QgeworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbV9zdWNjZXNzTWV0aG9kID0gZmFsc2U7CisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtX3N1Y2Nlc3NDbGFzcyA9IGZhbHNlOworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIG1fc3VjY2Vzc01ldGhvZCA9IGZhbHNlOworICAgIG1fc3VjY2Vzc0NsYXNzID0gZmFsc2U7CisgIH0KKworICBAVGVzdChncm91cHMgPSB7ICJtZXRob2RHcm91cCIgfSkKKyAgcHVibGljIHZvaWQgdGVzdE1ldGhvZEdyb3VwKCkgeworICAgIG1fc3VjY2Vzc01ldGhvZCA9IHRydWU7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NHcm91cFNob3VsZEZhaWwoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAibWV0aG9kR3JvdXAiIH0pCisgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RHcm91cFNob3VsZEZhaWwoKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENsYXNzR3JvdXAoKSB7CisgICAgbV9zdWNjZXNzQ2xhc3MgPSB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvUGFydGlhbEdyb3VwVmVyaWZpY2F0aW9uLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1BhcnRpYWxHcm91cFZlcmlmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzEwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1BhcnRpYWxHcm91cFZlcmlmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKKworcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHZlcmlmaWVzIHRoZSBQYXJ0aWFsR3JvdXBUZXN0CisgKgorICogQGF1dGhvciBjYmV1c3QKKyAqLworCitwdWJsaWMgY2xhc3MgUGFydGlhbEdyb3VwVmVyaWZpY2F0aW9uIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIGFzc2VydCBQYXJ0aWFsR3JvdXBUZXN0Lm1fc3VjY2Vzc01ldGhvZCAmJiBQYXJ0aWFsR3JvdXBUZXN0Lm1fc3VjY2Vzc0NsYXNzCisgICAgICA6ICJ0ZXN0MSBhbmQgdGVzdDIgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIGJvdGgiOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9SRUFETUUudHh0IGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTk0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyAic2FtcGxlcyI6IFRlc3RORyB0ZXN0cyB0aGF0IGFyZSBub3QgaW52b2tlZCBkaXJlY3RseSBidXQgaW52b2tlZAorcHJvZ3JhbW1hdGljYWxseSBieSB0aGUgcmVhbCB0ZXN0IGNsYXNzZXMgaW4gdGhlIG1haW4gZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TYW1wbGUxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1NhbXBsZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVmYjcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TYW1wbGUxLmphdmEKQEAgLTAsMCArMSw3NiBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5FeHBlY3RlZEV4Y2VwdGlvbnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIENlZHJpYyBCZXVzdCwgQXByIDI2LCAyMDA0CisgKgorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlMSBleHRlbmRzIEJhc2VTYW1wbGUxIHsKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkNsYXNzMSgpIHsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyB2b2lkIHRlYXJEb3duQ2xhc3MyKCkgeworCX0KKworCUBCZWZvcmVNZXRob2QKKwlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KCkgeworCX0KKworCUBBZnRlck1ldGhvZAorCXB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpIHsKKwl9CisKKwlAVGVzdChncm91cHMgPSB7ImV2ZW4ifSkKKwlwdWJsaWMgdm9pZCBtZXRob2QyKCkgeworCX0KKworCUBUZXN0KGdyb3VwcyA9IHsib2RkIn0pCisJcHVibGljIHZvaWQgbWV0aG9kMygpIHsKKwl9CisKKwlAVGVzdChncm91cHMgPSB7Im9kZCJ9LCBlbmFibGVkID0gZmFsc2UpCisJcHVibGljIHZvaWQgb2RkRGlzYWJsZU1ldGhvZCgpIHsKKwl9CisKKwlAVGVzdChncm91cHMgPSB7ImJyb2tlbiJ9KQorCXB1YmxpYyB2b2lkIGJyb2tlbigpIHsKKwl9CisKKwlAVGVzdChncm91cHMgPSB7ImZhaWwifSkKKwlARXhwZWN0ZWRFeGNlcHRpb25zKCB7TnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzLAlBcml0aG1ldGljRXhjZXB0aW9uLmNsYXNzfSkKKwlwdWJsaWMgdm9pZCB0aHJvd0V4cGVjdGVkRXhjZXB0aW9uMVNob3VsZFBhc3MoKSB7CisJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKKwl9CisKKwlAVGVzdChncm91cHMgPSB7ImZhaWwifSkKKwlARXhwZWN0ZWRFeGNlcHRpb25zKCB7TnVtYmVyRm9ybWF0RXhjZXB0aW9uLmNsYXNzLAlBcml0aG1ldGljRXhjZXB0aW9uLmNsYXNzfSkKKwlwdWJsaWMgdm9pZCB0aHJvd0V4cGVjdGVkRXhjZXB0aW9uMlNob3VsZFBhc3MoKSB7CisJCXRocm93IG5ldyBBcml0aG1ldGljRXhjZXB0aW9uKCk7CisJfQorCisJQFRlc3QoZ3JvdXBzID0geyJmYWlsIiwgImJ1ZyJ9KQorCXB1YmxpYyB2b2lkIHRocm93RXhjZXB0aW9uU2hvdWxkRmFpbCgpIHsKKwkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOworCX0KKworCUBUZXN0KGdyb3VwcyA9IHsiYXNzZXJ0In0pCisJcHVibGljIHZvaWQgdmVyaWZ5TGFzdE5hbWVTaG91bGRGYWlsKCkgeworCSAgQXNzZXJ0LmFzc2VydEVxdWFscygiQmV1c3QiLCAiIiwgIkV4cGVjdGVkIG5hbWUgQmV1c3QsIGZvdW5kIGJsYWgiKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIltUZXN0MV0gIiArIHMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TYW1wbGUyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1NhbXBsZTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNlOWVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TYW1wbGUyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QsIEFwciAyNiwgMjAwNAorICoKKyAqLworCitwdWJsaWMgY2xhc3MgU2FtcGxlMiB7CisKKyAgQFRlc3QoZ3JvdXBzID0gImcxIikKKyAgcHVibGljIHZvaWQgbWV0aG9kMSgpIHsKKy8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQEBAQEBAQEBAQEBAQEBAQEBAQCBNRVRIT0QxIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtZXRob2QyKCkgeworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJAQEBAQEBAQEBAQEBAQEBAQEBAIE1FVEhPRDIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIG1ldGhvZDMoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkBAQEBAQEBAQEBAQEBAQEBAQEAgTUVUSE9EMyIpOworICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TY29wZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NhbXBsZS9TY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODY0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1Njb3BlLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnNhbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHRlc3RzIHBhcmFtZXRlIHNjb3Blcy4KKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgU2NvcGUgeworCisgIEBUZXN0KGdyb3VwcyA9IHsgIm91dGVyLWdyb3VwIiB9LCBwYXJhbWV0ZXJzID0geyAicGFyYW1ldGVyIiB9KQorICBwdWJsaWMgdm9pZCBvdXRlckRlcHJlY2F0ZWQoU3RyaW5nIHMpIHsKKyAgICBhc3NlcnQgIm91dCIuZXF1YWxzKHMpCisgICAgICA6ICJFeHBlY3RlZCBvdXQgZ290ICIgKyBzOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0geyAiaW5uZXItZ3JvdXAiIH0sIHBhcmFtZXRlcnMgPSB7ICJwYXJhbWV0ZXIiIH0pCisgIHB1YmxpYyB2b2lkIGlubmVyRGVwcmVjYXRlZChTdHJpbmcgcykgeworICAgIGFzc2VydCAiaW4iLmVxdWFscyhzKQorICAgICAgOiAiRXhwZWN0ZWQgaW4gZ290ICIgKyBzOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1NldFVwV2l0aFBhcmFtZXRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW1wbGUvU2V0VXBXaXRoUGFyYW1ldGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDMwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FtcGxlL1NldFVwV2l0aFBhcmFtZXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3Quc2FtcGxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBmYWlscyBpbiBzZXRVcCBhbmQgc2hvdWxkIHJlc3VsdCBpbiAxIGZhaWx1cmUsIDEgc2tpcAorICoKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBTZXRVcFdpdGhQYXJhbWV0ZXJUZXN0IHsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgc2V0VXAoU3RyaW5nIGJvZ3VzUGFyYW1ldGVyKSB7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9DaGVja1N1aXRlTmFtZXNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FuaXR5Y2hlY2svQ2hlY2tTdWl0ZU5hbWVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Y2MxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FuaXR5Y2hlY2svQ2hlY2tTdWl0ZU5hbWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKK3BhY2thZ2UgdGVzdC5zYW5pdHljaGVjazsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBDaGVja1N1aXRlTmFtZXNUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIC8qKgorICAgKiBDaGlsZCBzdWl0ZXMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNoZWNrQ2hpbGRTdWl0ZXMoKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICBTdHJpbmcgdGVzdG5nWG1sUGF0aCA9IGdldFBhdGhUb1Jlc291cmNlKCJzYW5pdHljaGVjay90ZXN0LXMtYi54bWwiKTsKKyAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KHRlc3RuZ1htbFBhdGgpKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDQpOworICB9CisKKyAgLyoqCisgICAqIENoaWxkIHN1aXRlcyBoYXZlIHNhbWUgbmFtZXMKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNoZWNrQ2hpbGRTdWl0ZXNGYWlscygpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIFN0cmluZyB0ZXN0bmdYbWxQYXRoID0gZ2V0UGF0aFRvUmVzb3VyY2UoInNhbml0eWNoZWNrL3Rlc3Qtcy1hLnhtbCIpOworICAgIHRuZy5zZXRUZXN0U3VpdGVzKEFycmF5cy5hc0xpc3QodGVzdG5nWG1sUGF0aCkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRUZXN0Q29udGV4dHMoKS5nZXQoMCkuZ2V0U3VpdGUoKS5nZXROYW1lKCksICJTYW5pdHlDaGVjayBzdWl0ZXMiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRUZXN0Q29udGV4dHMoKS5nZXQoMSkuZ2V0U3VpdGUoKS5nZXROYW1lKCksICJTYW5pdHlDaGVjayBzdWl0ZXMiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRUZXN0Q29udGV4dHMoKS5nZXQoMikuZ2V0U3VpdGUoKS5nZXROYW1lKCksICJTYW5pdHlDaGVjayBzdWl0ZXMgKDApIik7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0VGVzdENvbnRleHRzKCkuZ2V0KDMpLmdldFN1aXRlKCkuZ2V0TmFtZSgpLCAiU2FuaXR5Q2hlY2sgc3VpdGVzICgwKSIpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrcyB0aGF0IHN1aXRlcyBjcmVhdGVkIHByb2dyYW1tYXRpY2FsbHkgYWxzbyB3b3JrcyBhcyBleHBlY3RlZAorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hlY2tQcm9ncmFtbWF0aWNTdWl0ZXNGYWlscygpIHsKKyAgICBYbWxTdWl0ZSB4bWxTdWl0ZTEgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICB4bWxTdWl0ZTEuc2V0TmFtZSgiU2FuaXR5Q2hlY2tTdWl0ZSIpOworICAgIHsKKyAgICAgIFhtbFRlc3QgcmVzdWx0ID0gbmV3IFhtbFRlc3QoeG1sU3VpdGUxKTsKKyAgICAgIHJlc3VsdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcyhTYW1wbGVUZXN0MS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICB9CisKKyAgICBYbWxTdWl0ZSB4bWxTdWl0ZTIgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICB4bWxTdWl0ZTIuc2V0TmFtZSgiU2FuaXR5Q2hlY2tTdWl0ZSIpOworICAgIHsKKyAgICAgIFhtbFRlc3QgcmVzdWx0ID0gbmV3IFhtbFRlc3QoeG1sU3VpdGUyKTsKKyAgICAgIHJlc3VsdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcyhTYW1wbGVUZXN0Mi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICB9CisKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHhtbFN1aXRlMSwgeG1sU3VpdGUyKSk7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoeG1sU3VpdGUxLmdldE5hbWUoKSwgIlNhbml0eUNoZWNrU3VpdGUiKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHhtbFN1aXRlMi5nZXROYW1lKCksICJTYW5pdHlDaGVja1N1aXRlICgwKSIpOworICB9CisgIAorICBAVGVzdAorICBwdWJsaWMgdm9pZCBjaGVja1htbFN1aXRlQWRkaXRpb24oKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIFN0cmluZyB0ZXN0bmdYbWxQYXRoID0gZ2V0UGF0aFRvUmVzb3VyY2UoInNhbml0eWNoZWNrL3Rlc3Qtcy1iLnhtbCIpOworICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKHRlc3RuZ1htbFBhdGgpOwkKKyAgICB0bmcuc2V0WG1sU3VpdGVzKHBhcnNlci5wYXJzZVRvTGlzdCgpKTsKKyAgICB0bmcuaW5pdGlhbGl6ZVN1aXRlc0FuZEphckZpbGUoKTsJCQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FuaXR5Y2hlY2svQ2hlY2tUZXN0TmFtZXNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2FuaXR5Y2hlY2svQ2hlY2tUZXN0TmFtZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5MjcyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9DaGVja1Rlc3ROYW1lc1Rlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIHRlc3Quc2FuaXR5Y2hlY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIENoZWNrVGVzdE5hbWVzVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICAvKioKKyAgICogQ2hpbGQgc3VpdGVzIGFuZCBzYW1lIHN1aXRlIGhhcyB0d28gdGVzdHMgd2l0aCBzYW1lIG5hbWUKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNoZWNrV2l0aENoaWxkU3VpdGVzKCkgeworICAgIHJ1blN1aXRlKCJzYW5pdHljaGVjay90ZXN0LWEueG1sIik7CisgIH0KKworICAvKioKKyAgICogU2ltcGxlIHN1aXRlIHdpdGggdHdvIHRlc3RzIHdpdGggc2FtZSBuYW1lCisgICAqLworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjaGVja1dpdGhvdXRDaGlsZFN1aXRlcygpIHsKKyAgICBydW5TdWl0ZSgic2FuaXR5Y2hlY2svdGVzdDEueG1sIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcnVuU3VpdGUoU3RyaW5nIHN1aXRlUGF0aCkKKyAgeworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBib29sZWFuIGV4Y2VwdGlvblJhaXNlZCA9IGZhbHNlOworICAgIHRyeSB7CisgICAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgICBTdHJpbmcgdGVzdG5nWG1sUGF0aCA9IGdldFBhdGhUb1Jlc291cmNlKHN1aXRlUGF0aCk7CisgICAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KHRlc3RuZ1htbFBhdGgpKTsKKyAgICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgICAgdG5nLnJ1bigpOworICAgIH0gY2F0Y2ggKFRlc3ROR0V4Y2VwdGlvbiBleCkgeworICAgICAgZXhjZXB0aW9uUmFpc2VkID0gdHJ1ZTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldEZhaWxlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICB9CisgICAgQXNzZXJ0LmFzc2VydFRydWUoZXhjZXB0aW9uUmFpc2VkKTsKKyAgfQorCisgIC8qKgorICAgKiBTaW1wbGUgc3VpdGUgd2l0aCBubyB0d28gdGVzdHMgd2l0aCBzYW1lIG5hbWUKKyAgICovCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNoZWNrTm9FcnJvcigpIHsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgIFN0cmluZyB0ZXN0bmdYbWxQYXRoID0gZ2V0UGF0aFRvUmVzb3VyY2UoInNhbml0eWNoZWNrL3Rlc3QyLnhtbCIpOworICAgIHRuZy5zZXRUZXN0U3VpdGVzKEFycmF5cy5hc0xpc3QodGVzdG5nWG1sUGF0aCkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMik7CisgIH0KKworICAvKioKKyAgICogQ2hpbGQgc3VpdGVzIGFuZCB0ZXN0cyB3aXRoaW4gZGlmZmVyZW50IHN1aXRlcyBoYXZlIHNhbWUgbmFtZXMKKyAgICovCisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgY2hlY2tOb0Vycm9yV3RpaENoaWxkU3VpdGVzKCkgeworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgU3RyaW5nIHRlc3RuZ1htbFBhdGggPSBnZXRQYXRoVG9SZXNvdXJjZSgic2FuaXR5Y2hlY2svdGVzdC1iLnhtbCIpOworICAgIHRuZy5zZXRUZXN0U3VpdGVzKEFycmF5cy5hc0xpc3QodGVzdG5nWG1sUGF0aCkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgNCk7CisgIH0KKworICAvKioKKyAgICogQ2hlY2tzIHRoYXQgc3VpdGVzIGNyZWF0ZWQgcHJvZ3JhbW1hdGljYWxseSBhbHNvIHJ1biBhcyBleHBlY3RlZAorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hlY2tUZXN0TmFtZXNGb3JQcm9ncmFtbWF0aWNTdWl0ZXMoKSB7CisgICAgWG1sU3VpdGUgeG1sU3VpdGUgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICB4bWxTdWl0ZS5zZXROYW1lKCJTYW5pdHlDaGVja1N1aXRlIik7CisgICAgWG1sVGVzdCByZXN1bHQgPSBuZXcgWG1sVGVzdCh4bWxTdWl0ZSk7CisgICAgcmVzdWx0LmdldFhtbENsYXNzZXMoKS5hZGQobmV3IFhtbENsYXNzKFNhbXBsZVRlc3QxLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgIHJlc3VsdCA9IG5ldyBYbWxUZXN0KHhtbFN1aXRlKTsKKyAgICByZXN1bHQuZ2V0WG1sQ2xhc3NlcygpLmFkZChuZXcgWG1sQ2xhc3MoU2FtcGxlVGVzdDIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChuZXcgWG1sU3VpdGVbXSB7IHhtbFN1aXRlIH0pKTsKKyAgICB0bmcucnVuKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0MS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Nhbml0eWNoZWNrL1NhbXBsZVRlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMmY4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0MS5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LnNhbml0eWNoZWNrOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdDEKK3sKKyAgIEBUZXN0KCkKKyAgIHB1YmxpYyB2b2lkIHRlc3QxKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0Mi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Nhbml0eWNoZWNrL1NhbXBsZVRlc3QyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5Zjc3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0Mi5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LnNhbml0eWNoZWNrOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdDIKK3sKKyAgIEBUZXN0KCkKKyAgIHB1YmxpYyB2b2lkIHRlc3QyKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0My5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Nhbml0eWNoZWNrL1NhbXBsZVRlc3QzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZTVkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zYW5pdHljaGVjay9TYW1wbGVUZXN0My5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LnNhbml0eWNoZWNrOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2FtcGxlVGVzdDMKK3sKKyAgIEBUZXN0KCkKKyAgIHB1YmxpYyB2b2lkIHRlc3QzKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zZXJ2aWNlbG9hZGVyL015Q29uZmlndXJhdGlvbkxpc3RlbmVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2VydmljZWxvYWRlci9NeUNvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjJmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2VydmljZWxvYWRlci9NeUNvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC5zZXJ2aWNlbG9hZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQ29uZmlndXJhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBNeUNvbmZpZ3VyYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uTGlzdGVuZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uU3VjY2VzcyhJVGVzdFJlc3VsdCBpdHIpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkZhaWx1cmUoSVRlc3RSZXN1bHQgaXRyKSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25Ta2lwKElUZXN0UmVzdWx0IGl0cikgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NlcnZpY2Vsb2FkZXIvU2VydmljZUxvYWRlclNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zZXJ2aWNlbG9hZGVyL1NlcnZpY2VMb2FkZXJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlOTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zZXJ2aWNlbG9hZGVyL1NlcnZpY2VMb2FkZXJTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSB0ZXN0LnNlcnZpY2Vsb2FkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogRHVtbXkgY2xhc3MgdG8gdGVzdCBTZXJ2aWNlTG9hZGVyCisgKgorICogQGF1dGhvciBDZWRyaWMgQmV1c3QgPGNlZHJpY0BiZXVzdC5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTG9hZGVyU2FtcGxlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2VydmljZWxvYWRlci9TZXJ2aWNlTG9hZGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NlcnZpY2Vsb2FkZXIvU2VydmljZUxvYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNlYzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NlcnZpY2Vsb2FkZXIvU2VydmljZUxvYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHRlc3Quc2VydmljZWxvYWRlcjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworaW1wb3J0IHRlc3QubGlzdGVuZXJzLkxpc3RlbmVyQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgU2VydmljZUxvYWRlclRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2VydmljZUxvYWRlclNob3VsZFdvcmsoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFNlcnZpY2VMb2FkZXJTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJzZXJ2aWNlbG9hZGVyLmphciIpOworICAgIFVSTENsYXNzTG9hZGVyIHVjbCA9IFVSTENsYXNzTG9hZGVyLm5ld0luc3RhbmNlKG5ldyBVUkxbXSB7IHVybCB9KTsKKyAgICB0bmcuc2V0U2VydmljZUxvYWRlckNsYXNzTG9hZGVyKHVjbCk7CisgICAgdG5nLnJ1bigpOworCisgICAgTGlzdGVuZXJBc3NlcnQuYXNzZXJ0TGlzdGVuZXJUeXBlKHRuZy5nZXRTZXJ2aWNlTG9hZGVyTGlzdGVuZXJzKCksIFRtcFN1aXRlTGlzdGVuZXIuY2xhc3MpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2VydmljZUxvYWRlcldpdGhOb0NsYXNzTG9hZGVyKCkgeworICAgIC8vSGVyZSBTZXJ2aWNlTG9hZGVyIGlzIGV4cGVjdGVkIHRvIHJlbHkgb24gdGhlIGN1cnJlbnQgY29udGV4dCBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgc2VydmljZSBsb2FkZXIgZmlsZQorICAgIC8vU2luY2Ugc2VydmljZWxvYWRlci5qYXIgZG9lc24ndCBzZWVtIHRvIGJlIHZpc2libGUgdG8gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29udGV4dHVhbCBjbGFzcyBsb2FkZXIKKyAgICAvL3Jlc29ydGluZyB0byBwdXNoaW5nIGluIGEgY2xhc3MgbG9hZGVyIGludG8gdGhlIGN1cnJlbnQgdGhyZWFkIHRoYXQgY2FuIGxvYWQgdGhlIHJlc291cmNlCisgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgic2VydmljZWxvYWRlci5qYXIiKTsKKyAgICBVUkxDbGFzc0xvYWRlciB1Y2wgPSBVUkxDbGFzc0xvYWRlci5uZXdJbnN0YW5jZShuZXcgVVJMW10geyB1cmwgfSk7CisgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodWNsKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFNlcnZpY2VMb2FkZXJTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBMaXN0ZW5lckFzc2VydC5hc3NlcnRMaXN0ZW5lclR5cGUodG5nLmdldFNlcnZpY2VMb2FkZXJMaXN0ZW5lcnMoKSwgVG1wU3VpdGVMaXN0ZW5lci5jbGFzcyk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJHSVRIVUItNDkxIikKKyAgcHVibGljIHZvaWQgc2VydmljZUxvYWRlclNob3VsZFdvcmtXaXRoQ29uZmlndXJhdGlvbkxpc3RlbmVyKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoU2VydmljZUxvYWRlclNhbXBsZVRlc3QuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgdG5nLmdldFNlcnZpY2VMb2FkZXJMaXN0ZW5lcnMoKS5zaXplKCkpOworICAgIExpc3RlbmVyQXNzZXJ0LmFzc2VydExpc3RlbmVyVHlwZSh0bmcuZ2V0U2VydmljZUxvYWRlckxpc3RlbmVycygpLCBNeUNvbmZpZ3VyYXRpb25MaXN0ZW5lci5jbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zZXJ2aWNlbG9hZGVyL1RtcFN1aXRlTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zZXJ2aWNlbG9hZGVyL1RtcFN1aXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFkMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NlcnZpY2Vsb2FkZXIvVG1wU3VpdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC5zZXJ2aWNlbG9hZGVyOworCitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5JU3VpdGVMaXN0ZW5lcjsKKworcHVibGljIGNsYXNzIFRtcFN1aXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJU3VpdGVMaXN0ZW5lciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJU3VpdGUgc3VpdGUpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblN0YXJ0KElTdWl0ZSBzdWl0ZSkge30KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NpbXBsZS9JbmNsdWRlZEV4Y2x1ZGVkU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NpbXBsZS9JbmNsdWRlZEV4Y2x1ZGVkU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWM3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2ltcGxlL0luY2x1ZGVkRXhjbHVkZWRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSB0ZXN0LnNpbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlZEV4Y2x1ZGVkU2FtcGxlVGVzdCB7CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGJlZm9yZVN1aXRlKCkgeworICAgIFJlcG9ydGVyLmxvZygiYmVmb3JlU3VpdGUiKTsKKyAgfQorCisgIEBCZWZvcmVUZXN0CisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisgICAgUmVwb3J0ZXIubG9nKCJiZWZvcmVUZXN0Iik7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdENsYXNzKCkgeworICAgIFJlcG9ydGVyLmxvZygiYmVmb3JlVGVzdENsYXNzIik7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3RNZXRob2QoKSB7CisgICAgUmVwb3J0ZXIubG9nKCJiZWZvcmVUZXN0TWV0aG9kIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICBSZXBvcnRlci5sb2coIkNoaWxkLnRlc3QxIik7CisgIH0KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIFJlcG9ydGVyLmxvZygiQ2hpbGQudGVzdDIiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJhIikKKyAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgUmVwb3J0ZXIubG9nKCJDaGlsZC50ZXN0MyIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdE5HQnVnXSAiICsgc3RyaW5nKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NpbXBsZS9JbmNsdWRlZEV4Y2x1ZGVkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3NpbXBsZS9JbmNsdWRlZEV4Y2x1ZGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmI3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2ltcGxlL0luY2x1ZGVkRXhjbHVkZWRUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSB0ZXN0LnNpbXBsZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuSVJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3ROR01ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK2ltcG9ydCB0ZXN0aGVscGVyLk91dHB1dERpcmVjdG9yeVBhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlZEV4Y2x1ZGVkVGVzdCB7CisKKyAgcHJpdmF0ZSBUZXN0TkcgbV90bmc7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIG1fdG5nID0gbmV3IFRlc3RORygpOworICAgIG1fdG5nLnNldE91dHB1dERpcmVjdG9yeShPdXRwdXREaXJlY3RvcnlQYXRjaC5nZXRPdXRwdXREaXJlY3RvcnkoKSk7CisgICAgbV90bmcuc2V0VmVyYm9zZSgwKTsKKyAgICBtX3RuZy5zZXRVc2VEZWZhdWx0TGlzdGVuZXJzKGZhbHNlKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIkZpcnN0IHRlc3QgbWV0aG9kIikKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW5jbHVkZWRFeGNsdWRlZENvdW50MSgpIHsKKyAgICBtX3RuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7SW5jbHVkZWRFeGNsdWRlZFNhbXBsZVRlc3QuY2xhc3N9KTsKKyAgICBtX3RuZy5zZXRHcm91cHMoImEiKTsKKyAgICBtX3RuZy5hZGRMaXN0ZW5lcigKKyAgICAgICAgbmV3IE15UmVwb3J0ZXIobmV3IFN0cmluZ1tdIHsgInRlc3QzIiB9LCBuZXcgU3RyaW5nW10geyAidGVzdDEiLCAidGVzdDIifSkpOworICAgIG1fdG5nLnJ1bigpOworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiU2Vjb25kIHRlc3QgbWV0aG9kIikKKyAgcHVibGljIHZvaWQgdmVyaWZ5SW5jbHVkZWRFeGNsdWRlZENvdW50MigpIHsKKyAgICBtX3RuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7SW5jbHVkZWRFeGNsdWRlZFNhbXBsZVRlc3QuY2xhc3N9KTsKKyAgICBtX3RuZy5hZGRMaXN0ZW5lcigKKyAgICAgICAgbmV3IE15UmVwb3J0ZXIoCisgICAgICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICJiZWZvcmVTdWl0ZSIsICJiZWZvcmVUZXN0IiwgImJlZm9yZVRlc3RDbGFzcyIsCisgICAgICAgICAgICAgICAgImJlZm9yZVRlc3RNZXRob2QiLCAidGVzdDEiLCAiYmVmb3JlVGVzdE1ldGhvZCIsICJ0ZXN0MyIKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJ0ZXN0MiJ9KSk7CisgICAgbV90bmcucnVuKCk7CisgIH0KKworfQorCitjbGFzcyBNeVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKKworICBwcml2YXRlIFN0cmluZ1tdIG1faW5jbHVkZWQ7CisgIHByaXZhdGUgU3RyaW5nW10gbV9leGNsdWRlZDsKKworICBwdWJsaWMgTXlSZXBvcnRlcihTdHJpbmdbXSBpbmNsdWRlZCwgU3RyaW5nW10gZXhjbHVkZWQpIHsKKyAgICBtX2luY2x1ZGVkID0gaW5jbHVkZWQ7CisgICAgbV9leGNsdWRlZCA9IGV4Y2x1ZGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUmVwb3J0KExpc3Q8WG1sU3VpdGU+IHhtbFN1aXRlcywgTGlzdDxJU3VpdGU+IHN1aXRlcywgU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3VpdGVzLnNpemUoKSwgMSk7CisgICAgSVN1aXRlIHN1aXRlID0gc3VpdGVzLmdldCgwKTsKKworICAgIHsKKyAgICAgIENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gaW52b2tlZCA9IHN1aXRlLmdldEludm9rZWRNZXRob2RzKCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGludm9rZWQuc2l6ZSgpLCBtX2luY2x1ZGVkLmxlbmd0aCk7CisgICAgICBmb3IgKFN0cmluZyBzIDogbV9pbmNsdWRlZCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb250YWluc01ldGhvZChpbnZva2VkLCBzKSk7CisgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgQ29sbGVjdGlvbjxJVGVzdE5HTWV0aG9kPiBleGNsdWRlZCA9IHN1aXRlLmdldEV4Y2x1ZGVkTWV0aG9kcygpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleGNsdWRlZC5zaXplKCksIG1fZXhjbHVkZWQubGVuZ3RoKTsKKyAgICAgIGZvciAoU3RyaW5nIHMgOiBtX2V4Y2x1ZGVkKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbnRhaW5zTWV0aG9kKGV4Y2x1ZGVkLCBzKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENvbGxlY3Rpb248SVRlc3ROR01ldGhvZD4gaW52b2tlZCwgU3RyaW5nIHN0cmluZykgeworICAgIGZvciAoSVRlc3ROR01ldGhvZCBtIDogaW52b2tlZCkgeworICAgICAgaWYgKG0uZ2V0TWV0aG9kTmFtZSgpLmVxdWFscyhzdHJpbmcpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2ltcGxlL1NpbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zaW1wbGUvU2ltcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MThkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2ltcGxlL1NpbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3Quc2ltcGxlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZigpIHsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZVRlc3RdICIgKyBzdHJpbmcpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvQ29uZmlndXJhdGlvblNraXBwZWRFeGNlcHRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L0NvbmZpZ3VyYXRpb25Ta2lwcGVkRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDQyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L0NvbmZpZ3VyYXRpb25Ta2lwcGVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC5za2lwZXg7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuU2tpcEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2tpcHBlZEV4Y2VwdGlvblRlc3Qgew0KKyAgQEJlZm9yZU1ldGhvZA0KKyAgcHVibGljIHZvaWQgY29uZmlndXJhdGlvbkxldmVsU2tpcEV4Y2VwdGlvbigpIHsNCisgICAgdGhyb3cgbmV3IFNraXBFeGNlcHRpb24oInNvbWUgc2tpcCBtZXNzYWdlIik7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZHVtbXlUZXN0KCkgew0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBBbmRFeHBlY3RlZFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvU2tpcEFuZEV4cGVjdGVkU2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDcwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBBbmRFeHBlY3RlZFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3Quc2tpcGV4OworCitpbXBvcnQgb3JnLnRlc3RuZy5Ta2lwRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNraXBBbmRFeHBlY3RlZFNhbXBsZVRlc3QgeworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgYTIoKSB7CisgICAgdGhyb3cgbmV3IFNraXBFeGNlcHRpb24oInRlc3QiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBBbmRFeHBlY3RlZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvU2tpcEFuZEV4cGVjdGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmFkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBBbmRFeHBlY3RlZFRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3Quc2tpcGV4OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTa2lwQW5kRXhwZWN0ZWRUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZFNraXAoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShTa2lwQW5kRXhwZWN0ZWRTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgdG5nLnJ1bigpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCksIDApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFNraXBwZWRUZXN0cygpLnNpemUoKSwgMSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDApOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBwZWRFeGNlcHRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc2tpcGV4L1NraXBwZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhNzFlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvU2tpcHBlZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3Quc2tpcGV4Ow0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTa2lwcGVkRXhjZXB0aW9uVGVzdCB7DQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgc2tpcHBlZEV4Y2VwdGlvbkluQ29uZmlndXJhdGlvbk1ldGhvZHMoKSB7DQorICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgbGlzdGVuZXI9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7DQorICAgIFRlc3RORyB0ZXN0PSBuZXcgVGVzdE5HKGZhbHNlKTsNCisgICAgdGVzdC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7DQorICAgIHRlc3Quc2V0VmVyYm9zZSgwKTsNCisgICAgdGVzdC5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7Q29uZmlndXJhdGlvblNraXBwZWRFeGNlcHRpb25UZXN0LmNsYXNzfSk7DQorICAgIHRlc3QucnVuKCk7DQorICAgIExpc3Q8SVRlc3RSZXN1bHQ+IGNvbmZTa2lwcz0gbGlzdGVuZXIuZ2V0Q29uZmlndXJhdGlvblNraXBzKCk7DQorICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHRlc3RTa2lwcz0gbGlzdGVuZXIuZ2V0U2tpcHBlZFRlc3RzKCk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdFNraXBzLnNpemUoKSwgMSk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGVzdFNraXBzLmdldCgwKS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJkdW1teVRlc3QiKTsNCisNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb25mU2tpcHMuc2l6ZSgpLCAxKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb25mU2tpcHMuZ2V0KDApLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgImNvbmZpZ3VyYXRpb25MZXZlbFNraXBFeGNlcHRpb24iKTsNCisgIH0NCisNCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBza2lwcGVkRXhjZXB0aW9uSW5UZXN0TWV0aG9kcygpIHsNCisgICAgVGVzdExpc3RlbmVyQWRhcHRlciBsaXN0ZW5lcj0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsNCisgICAgVGVzdE5HIHRlc3Q9IG5ldyBUZXN0TkcoZmFsc2UpOw0KKyAgICB0ZXN0LmFkZExpc3RlbmVyKGxpc3RlbmVyKTsNCisgICAgdGVzdC5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7VGVzdFNraXBwZWRFeGNlcHRpb25UZXN0LmNsYXNzfSk7DQorICAgIHRlc3QucnVuKCk7DQorICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHNraXBzPSBsaXN0ZW5lci5nZXRTa2lwcGVkVGVzdHMoKTsNCisgICAgTGlzdDxJVGVzdFJlc3VsdD4gZmFpbHVyZXM9IGxpc3RlbmVyLmdldEZhaWxlZFRlc3RzKCk7DQorICAgIExpc3Q8SVRlc3RSZXN1bHQ+IHBhc3NlZCA9IGxpc3RlbmVyLmdldFBhc3NlZFRlc3RzKCk7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2tpcHMuc2l6ZSgpLCAxKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWlsdXJlcy5zaXplKCksIDEpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBhc3NlZC5zaXplKCksIDEpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNraXBzLmdldCgwKS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJnZW5lcmljU2tpcEV4Y2VwdGlvbiIpOw0KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhaWx1cmVzLmdldCgwKS5nZXRNZXRob2QoKS5nZXRNZXRob2ROYW1lKCksICJ0aW1lZFNraXBFeGNlcHRpb24iKTsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwYXNzZWQuZ2V0KDApLmdldE1ldGhvZCgpLmdldE1ldGhvZE5hbWUoKSwgImdlbmVyaWNFeHBlY3RlZFNraXBFeGNlcHRpb24iKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3NraXBleC9UZXN0U2tpcHBlZEV4Y2VwdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvVGVzdFNraXBwZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkZjIzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9za2lwZXgvVGVzdFNraXBwZWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSB0ZXN0LnNraXBleDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Ta2lwRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcudGVzdG5nLlRpbWVCb21iU2tpcEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFRlc3RTa2lwcGVkRXhjZXB0aW9uVGVzdCB7DQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZ2VuZXJpY1NraXBFeGNlcHRpb24oKSB7DQorICAgIHRocm93IG5ldyBTa2lwRXhjZXB0aW9uKCJnZW5lcmljU2tpcEV4Y2VwdGlvbiBpcyBza2lwcGVkIGZvciBub3ciKTsNCisgIH0NCisNCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IFNraXBFeGNlcHRpb24uY2xhc3MpDQorICBwdWJsaWMgdm9pZCBnZW5lcmljRXhwZWN0ZWRTa2lwRXhjZXB0aW9uKCkgew0KKyAgICB0aHJvdyBuZXcgU2tpcEV4Y2VwdGlvbigiZ2VuZXJpY0V4cGVjdGVkU2tpcEV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHNraXBwZWQiKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0aW1lZFNraXBFeGNlcHRpb24oKSB7DQorICAgIHRocm93IG5ldyBUaW1lQm9tYlNraXBFeGNlcHRpb24oInRpbWVkU2tpcEV4Y2VwdGlvbiBpcyB0aW1lIGJvbWJlZCIsICIyMDA3LzA0LzEwIik7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0Jhc2UxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9CYXNlMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OThlODkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9CYXNlMS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitwdWJsaWMgY2xhc3MgQmFzZTEgeworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgcHBwKCJCRUZPUkVfQ0xBU1MiKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgcHBwKCJCRUZPUkVfTUVUSE9EIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0YmFzZSgpIHsKKyAgICBwcHAoIlRFU1QgSU4gQkFTRSIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VdICIgKyBzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0Jhc2UyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9CYXNlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWNmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9CYXNlMi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgQmFzZTIgeworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgcHBwKCJCRUZPUkVfQ0xBU1MiKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgcHBwKCJCRUZPUkVfTUVUSE9EIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0YmFzZSgpIHsKKyAgICBwcHAoIlRFU1QgSU4gQkFTRSIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VdICIgKyBzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0Jhc2VTYW1wbGVUZXN0My5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3N1cGVyY2xhc3MvQmFzZVNhbXBsZVRlc3QzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1NzcxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0Jhc2VTYW1wbGVUZXN0My5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQmFzZVNhbXBsZVRlc3QzIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmFzZSgpIHsKKyAgICAgIGFzc2VydCB0cnVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0NoaWxkMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0NoaWxkMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjU3NDMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3N1cGVyY2xhc3MvQ2hpbGQxVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIENoaWxkMVRlc3QgZXh0ZW5kcyBCYXNlMSB7CisgIHB1YmxpYyB2b2lkIHQxKCkgeworICAgIHBwcCgiVDEiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHQyKCkgeworICAgIHBwcCgiVDIiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHQzKCkgeworICAgIHBwcCgiVDMiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDaGlsZF0gIiArIHMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3N1cGVyY2xhc3MvQ2hpbGQyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3N1cGVyY2xhc3MvQ2hpbGQyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODQ4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9DaGlsZDJUZXN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSB0ZXN0LnN1cGVyY2xhc3M7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgQ2hpbGQyVGVzdCBleHRlbmRzIEJhc2UyIHsKKyAgcHVibGljIHZvaWQgdDEoKSB7CisgICAgcHBwKCJUMSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdDIoKSB7CisgICAgcHBwKCJUMiIpOworICB9CisKKyAgcHVibGljIHZvaWQgdDMoKSB7CisgICAgcHBwKCJUMyIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0NoaWxkXSAiICsgcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9DaGlsZFNhbXBsZVRlc3QzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9DaGlsZFNhbXBsZVRlc3QzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmZDg5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL0NoaWxkU2FtcGxlVGVzdDMuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3Quc3VwZXJjbGFzczsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENoaWxkU2FtcGxlVGVzdDMgZXh0ZW5kcyBCYXNlU2FtcGxlVGVzdDMgeworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwYXNzKCkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKHRydWUpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmFpbCgpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmYWxzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL01haW5UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2RhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9NYWluVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIE1haW5UZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGJhc2VNZXRob2RJc0NhbGxlZFdpdGhNZXRob2RUZXN0KCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LnN1cGVyY2xhc3MuQ2hpbGQxVGVzdCIpOworICAgIHJ1bigpOworICAgIFN0cmluZ1tdIHBhc3NlZCA9IHsKKyAgICAgICJ0YmFzZSIsICJ0MSIsICJ0MiIsICJ0MyIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYmFzZU1ldGhvZElzQ2FsbGVkV2l0aENsYXNzVGVzdCgpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zdXBlcmNsYXNzLkNoaWxkMlRlc3QiKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAidGJhc2UiLCAidDEiLCAidDIiLCAidDMiCisgICAgfTsKKyAgICBTdHJpbmdbXSBmYWlsZWQgPSB7CisgICAgfTsKKyAgICB2ZXJpZnlUZXN0cygiUGFzc2VkIiwgcGFzc2VkLCBnZXRQYXNzZWRUZXN0cygpKTsKKyAgICB2ZXJpZnlUZXN0cygiRmFpbGVkIiwgZmFpbGVkLCBnZXRGYWlsZWRUZXN0cygpKTsKKyAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC9zdXBlcmNsYXNzL1Rlc3QzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9UZXN0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTg1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3Qvc3VwZXJjbGFzcy9UZXN0My5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC5zdXBlcmNsYXNzOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3QzIGV4dGVuZHMgQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZEV4Y2x1ZGVCYXNlTWV0aG9kcygpIHsKKyAgICBhZGRDbGFzcygidGVzdC5zdXBlcmNsYXNzLkNoaWxkU2FtcGxlVGVzdDMiKTsKKyAgICBhZGRFeGNsdWRlZE1ldGhvZCgidGVzdC5zdXBlcmNsYXNzLkNoaWxkU2FtcGxlVGVzdDMiLCAicGFzcyIpOworICAgIGFkZEV4Y2x1ZGVkTWV0aG9kKCJ0ZXN0LnN1cGVyY2xhc3MuQ2hpbGRTYW1wbGVUZXN0MyIsICJiYXNlIik7CisgICAgcnVuKCk7CisgICAgU3RyaW5nW10gcGFzc2VkID0geworICAgIH07CisgICAgU3RyaW5nW10gZmFpbGVkID0geworICAgICAgICAiZmFpbCIKKyAgICB9OworICAgIHZlcmlmeVRlc3RzKCJGYWlsZWQiLCBmYWlsZWQsIGdldEZhaWxlZFRlc3RzKCkpOworICAgIHZlcmlmeVRlc3RzKCJQYXNzZWQiLCBwYXNzZWQsIGdldFBhc3NlZFRlc3RzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdDExMS9BYnN0cmFjdFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0MTExL0Fic3RyYWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmRlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdDExMS9BYnN0cmFjdFRlc3QuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIHRlc3QudGVzdDExMTsKKworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdCB7CisKKwlwdWJsaWMgc3RhdGljIGludCBSPTA7CisJCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3QoKSB7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgICAgICBSKys7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3QxMTEvVGVzdDEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0MTExL1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiYjBlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0MTExL1Rlc3QxLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LnRlc3QxMTE7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgVGVzdDEgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBBYnN0cmFjdFRlc3QuUik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmFtZXMvVGVzdE5hbWVzRmVhdHVyZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuYW1lcy9UZXN0TmFtZXNGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiNGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmFtZXMvVGVzdE5hbWVzRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmFtZXM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0TmFtZXNGZWF0dXJlIHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2FtcGxlT3V0cHV0VGVzdDEoKSB7fQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzYW1wbGVPdXRwdXRUZXN0MigpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5hbWVzL1Rlc3ROYW1lc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmFtZXMvVGVzdE5hbWVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2NkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5hbWVzL1Rlc3ROYW1lc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIHRlc3QudGVzdG5hbWVzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgVGVzdE5hbWVzVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tXaXRob3V0Q2hpbGRTdWl0ZXMoKSB7CisgICAgICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICAgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworICAgICAgICB0bmcuc2V0VGVzdE5hbWVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInRlc3RHcm91cDIiKSk7CisgICAgICAgIHRuZy5zZXRUZXN0U3VpdGVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0UGF0aFRvUmVzb3VyY2UoInRlc3RuYW1lcy91cHN0cmVhbS1zdWl0ZS54bWwiKSkpOworICAgICAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICAgICAgdG5nLnJ1bigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSwgMCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAxKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0UGFzc2VkVGVzdHMoKS5nZXQoMCkuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kTmFtZSgpLCAic2FtcGxlT3V0cHV0VGVzdDIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L0ZhaWxpbmdTdWl0ZUZpeHR1cmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDYvRmFpbGluZ1N1aXRlRml4dHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDRkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L0ZhaWxpbmdTdWl0ZUZpeHR1cmUuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHRlc3QudGVzdG5nMTA2Ow0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOw0KKw0KKw0KKy8qKg0KKyAqIFRFU1RORy0xMDY6IGZhaWxpbmcgQEJlZm9yZVN1aXRlIGRvZXNuJ3Qgc2tpcCBhbGwgdGVzdHMNCisgKi8NCitwdWJsaWMgY2xhc3MgRmFpbGluZ1N1aXRlRml4dHVyZSB7DQorICBzdGF0aWMgaW50IHNfaW52b2NhdGlvbnMgPSAwOw0KKw0KKyAgQEJlZm9yZVN1aXRlDQorICBwdWJsaWMgdm9pZCBmYWlsaW5nQmVmb3JlU3VpdGUoKSB7DQorICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDYvVGVzdDEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDYvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE1Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzEwNi9UZXN0MS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcxMDY7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0MSB7DQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgbWV0aG9kMSgpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJtZXRob2QxIik7DQorICAgIEZhaWxpbmdTdWl0ZUZpeHR1cmUuc19pbnZvY2F0aW9ucysrOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L1Rlc3QyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L1Rlc3QyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1YmEwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDYvVGVzdDIuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QudGVzdG5nMTA2Ow0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgVGVzdDIgew0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIG1ldGhvZDIoKSB7DQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kMiIpOw0KKyAgICBGYWlsaW5nU3VpdGVGaXh0dXJlLnNfaW52b2NhdGlvbnMrKzsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBtZXRob2QzKCkgew0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZDMiKTsNCisgICAgRmFpbGluZ1N1aXRlRml4dHVyZS5zX2ludm9jYXRpb25zKys7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDYvVGVzdE5HMTA2LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L1Rlc3RORzEwNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTQ2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTA2L1Rlc3RORzEwNi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcxMDY7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RORzEwNiBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEZhaWxpbmdCZWZvcmVTdWl0ZVNob3VsZFNraXBBbGxUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoIlRFU1RORy0xMDYiKTsKKyAgICBjcmVhdGVYbWxUZXN0KHMsICJteVRlc3QxIiwgRmFpbGluZ1N1aXRlRml4dHVyZS5jbGFzcy5nZXROYW1lKCksIFRlc3QxLmNsYXNzLmdldE5hbWUoKSk7CisgICAgY3JlYXRlWG1sVGVzdChzLCAibXlUZXN0MiIsIFRlc3QxLmNsYXNzLmdldE5hbWUoKSk7CisgICAgY3JlYXRlWG1sVGVzdChzLCAibXlUZXN0MyIsIFRlc3QyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgY3JlYXRlWG1sVGVzdChzLCAibXlUZXN0LWxhc3QiLCBUZXN0Mi5jbGFzcy5nZXROYW1lKCkpOworICAgIHRuZy5zZXRYbWxTdWl0ZXMoQXJyYXlzLmFzTGlzdChzKSk7CisgICAgdG5nLnJ1bigpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRmFpbGluZ1N1aXRlRml4dHVyZS5zX2ludm9jYXRpb25zLCAwLCAiQEJlZm9yZVN1aXRlIGhhcyBmYWlsZWQuIEFsbCB0ZXN0cyBzaG91bGQgYmUgc2tpcHBlZC4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzEwOS9Ta2lwcGVkVGVzdFdpdGhFeHBlY3RlZEV4Y2VwdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDkvU2tpcHBlZFRlc3RXaXRoRXhwZWN0ZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1N2EyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxMDkvU2tpcHBlZFRlc3RXaXRoRXhwZWN0ZWRFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzEwOTsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFNraXBwZWRUZXN0V2l0aEV4cGVjdGVkRXhjZXB0aW9uVGVzdCB7DQorICBAQmVmb3JlQ2xhc3MNCisgIHB1YmxpYyB2b2lkIHNldHVwKCkgew0KKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidGVzdC1leGNlcHRpb24iKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpDQorICB7DQorLy8gICBlbXB0eQ0KKyAgfQ0KKw0KKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zPXtPdXRPZk1lbW9yeUVycm9yLmNsYXNzfSkNCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkNCisgIHsNCisvLyAgZW1wdHkNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE3My9DbGFzc0EuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvQ2xhc3NBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3MDkxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvQ2xhc3NBLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzE3MzsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBDbGFzc0Egew0KKw0KKwlAVGVzdA0KKwlwdWJsaWMgdm9pZCB0ZXN0MSgpIHsNCisJfQ0KKw0KKwlAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3QxIikNCisJcHVibGljIHZvaWQgdGVzdDIoKSB7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE3My9DbGFzc0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvQ2xhc3NCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkYjVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvQ2xhc3NCLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzE3MzsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy4qOw0KKw0KK3B1YmxpYyBjbGFzcyBDbGFzc0Igew0KKwlAVGVzdA0KKwlwdWJsaWMgdm9pZCB0ZXN0WCgpIHsNCisJfQ0KKw0KKwlAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3RYIikNCisJcHVibGljIHZvaWQgdGVzdDIoKSB7DQorCX0NCisNCisJQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9ICJ0ZXN0MiIpDQorCXB1YmxpYyB2b2lkIHRlc3QxKCkgew0KKwl9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvVGVzdE5HMTczVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE3My9UZXN0TkcxNzNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzliMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxNzMvVGVzdE5HMTczVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcxNzM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdFJlc3VsdDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE5HMTczVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgb3JkZXJTaG91bGRCZVByZXNlcnZlZEluTWV0aG9kc1dpdGhTYW1lTmFtZUFuZEluRGlmZmVyZW50Q2xhc3NlcygpIHsKKwkJVGVzdE5HIHRuZyA9IGNyZWF0ZSgpOworCQlYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoIlByZXNlcnZlT3JkZXIiKTsKKwkJWG1sVGVzdCB0ID0gbmV3IFhtbFRlc3Qocyk7CisKKwkJdC5nZXRYbWxDbGFzc2VzKCkuYWRkKG5ldyBYbWxDbGFzcygidGVzdC50ZXN0bmcxNzMuQ2xhc3NBIikpOworCQl0LmdldFhtbENsYXNzZXMoKS5hZGQobmV3IFhtbENsYXNzKCJ0ZXN0LnRlc3RuZzE3My5DbGFzc0IiKSk7CisKKwkJdC5zZXRQcmVzZXJ2ZU9yZGVyKCJ0cnVlIik7CisKKwkJdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKworCQlUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisJCXRuZy5hZGRMaXN0ZW5lcih0bGEpOworCQl0bmcucnVuKCk7CisKKwkJLy8gYnVnCisJCS8vdmVyaWZ5UGFzc2VkVGVzdHModGxhLCAidGVzdDEiLCAidGVzdDIiLCAidGVzdFgiLCAidGVzdDEiLCAidGVzdDIiKTsKKworCQkvLyBQcm9wb3NlZCBmaXgKKwkJdmVyaWZ5UGFzc2VkVGVzdHModGxhLCAidGVzdDEiLCAidGVzdDIiLCAidGVzdFgiLCAidGVzdDIiLCAidGVzdDEiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG9yZGVyU2hvdWxkQmVQcmVzZXJ2ZWRJbk1ldGhvZHNXaXRoU2FtZU5hbWVBbmRJbkRpZmZlcmVudENsYXNzZXNBbmREaWZmZXJlbnRQYWNrYWdlKCkgeworCQlUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisJCVhtbFN1aXRlIHMgPSBjcmVhdGVYbWxTdWl0ZSgiUHJlc2VydmVPcmRlciIpOworCQlYbWxUZXN0IHQgPSBuZXcgWG1sVGVzdChzKTsKKworCQl0LmdldFhtbENsYXNzZXMoKS5hZGQobmV3IFhtbENsYXNzKCJ0ZXN0LnRlc3RuZzE3My5DbGFzc0EiKSk7CisJCXQuZ2V0WG1sQ2xhc3NlcygpLmFkZChuZXcgWG1sQ2xhc3MoInRlc3QudGVzdG5nMTczLmFub3RoZXJwYWNrYWdlLkNsYXNzQyIpKTsKKworCQl0LnNldFByZXNlcnZlT3JkZXIoInRydWUiKTsKKworCQl0bmcuc2V0WG1sU3VpdGVzKEFycmF5cy5hc0xpc3QocykpOworCisJCVRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKwkJdG5nLmFkZExpc3RlbmVyKHRsYSk7CisJCXRuZy5ydW4oKTsKKworCQkvLyBidWcKKwkJLy92ZXJpZnlQYXNzZWRUZXN0cyh0bGEsICJ0ZXN0MSIsICJ0ZXN0MiIsICJ0ZXN0WCIsICJ0ZXN0MSIsICJ0ZXN0MiIpOworCisJCXZlcmlmeVBhc3NlZFRlc3RzKHRsYSwgInRlc3QxIiwgInRlc3QyIiwgInRlc3RYIiwgInRlc3QyIiwgInRlc3QxIik7CisJfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTczL2Fub3RoZXJwYWNrYWdlL0NsYXNzQy5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE3My9hbm90aGVycGFja2FnZS9DbGFzc0MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUxZDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE3My9hbm90aGVycGFja2FnZS9DbGFzc0MuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIHRlc3QudGVzdG5nMTczLmFub3RoZXJwYWNrYWdlOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorcHVibGljIGNsYXNzIENsYXNzQyB7DQorDQorCUBUZXN0DQorCXB1YmxpYyB2b2lkIHRlc3RYKCkgew0KKw0KKwl9DQorDQorCUBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdFgiKQ0KKwlwdWJsaWMgdm9pZCB0ZXN0MigpIHsNCisNCisJfQ0KKw0KKwlAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3QyIikNCisJcHVibGljIHZvaWQgdGVzdDEoKSB7DQorDQorCX0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE5NS9BZnRlck1ldGhvZFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxOTUvQWZ0ZXJNZXRob2RTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNjljMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcxOTUvQWZ0ZXJNZXRob2RTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzE5NTsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVJlc3VsdE1hcDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQWZ0ZXJNZXRob2RTYW1wbGVUZXN0IHsKKyAgc3RhdGljIGJvb2xlYW4gbV9zdWNjZXNzOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhc3MoKSB7CisgIH0KKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICBtX3N1Y2Nlc3MgPSBmYWxzZTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCBhZnRlck1ldGhvZChJVGVzdENvbnRleHQgYywgTWV0aG9kIG0pIHsKKyAgICAgIElSZXN1bHRNYXAgbWFwID0gYy5nZXRQYXNzZWRUZXN0cygpOworICAgICAgbV9zdWNjZXNzID0gbWFwLnNpemUoKSA9PSAxOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMTk1L0FmdGVyTWV0aG9kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE5NS9BZnRlck1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ2NDhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzE5NS9BZnRlck1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIHRlc3QudGVzdG5nMTk1OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIEFmdGVyTWV0aG9kVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dFNob3VsZEJlSW5pdGlhbGl6ZWQoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShBZnRlck1ldGhvZFNhbXBsZVRlc3QuY2xhc3MpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBZnRlck1ldGhvZFNhbXBsZVRlc3QubV9zdWNjZXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI0OS9CLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjQ5L0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJmYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI0OS9CLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzI0OTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBCYXNlIHsKKyAgQE92ZXJyaWRlCisgICBAVGVzdAorICAgcHVibGljIHZvaWQgYigpIHsKKyAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjQ5L0Jhc2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyNDkvQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDU5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjQ5L0Jhc2UuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcyNDk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNlIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYigpIHsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyNDkvVmVyaWZ5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI0OS9WZXJpZnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiNGU4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyNDkvVmVyaWZ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcyNDk7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgVmVyaWZ5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgWG1sU3VpdGUgc3VpdGUgPSBuZXcgWG1sU3VpdGUoKTsKKyAgICBzdWl0ZS5zZXROYW1lKCJTdWl0ZSIpOworCisgICAgWG1sVGVzdCB0ZXN0ID0gbmV3IFhtbFRlc3Qoc3VpdGUpOworICAgIHRlc3Quc2V0TmFtZSgiVGVzdCIpOworICAgIFhtbENsYXNzIGMxID0gbmV3IFhtbENsYXNzKEIuY2xhc3MpOworICAgIGMxLnNldEluY2x1ZGVkTWV0aG9kcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxJbmNsdWRlW10geyBuZXcgWG1sSW5jbHVkZSgiYiIpfSkpOworICAgIFhtbENsYXNzIGMyID0gbmV3IFhtbENsYXNzKEJhc2UuY2xhc3MpOworICAgIGMyLnNldEluY2x1ZGVkTWV0aG9kcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxJbmNsdWRlW10geyBuZXcgWG1sSW5jbHVkZSgiYiIpfSkpOworICAgIHRlc3Quc2V0WG1sQ2xhc3NlcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxDbGFzc1tdIHsgYzEsIGMyIH0pKTsKKworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxTdWl0ZVtdIHsgc3VpdGUgfSkpOworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyODUvQnVnQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI4NS9CdWdCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkY2I0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyODUvQnVnQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmcyODU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BUZXN0KHNlcXVlbnRpYWwgPSB0cnVlKQorcHVibGljIGNsYXNzIEJ1Z0Jhc2UgeworICBzdGF0aWMgU2V0PExvbmc+IG1fdGhyZWFkSWRzOworCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICBtX3RocmVhZElkcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgfQorCisgIHZvaWQgbG9nKGxvbmcgdGhyZWFkSWQpIHsKKyAgICBtX3RocmVhZElkcy5hZGQodGhyZWFkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgZmJhc2UoKSB7CisgICAgbG9nKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI4NS9EZXJpdmVkLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjg1L0Rlcml2ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGEzMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzI4NS9EZXJpdmVkLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzI4NTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIERlcml2ZWQgZXh0ZW5kcyBCdWdCYXNlIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpIHsKKyAgICBsb2coVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyKCkgeworICAgIGxvZyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjg1L1Rlc3RORzI4NVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmcyODUvVGVzdE5HMjg1VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMjg1L1Rlc3RORzI4NVRlc3QuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIHRlc3QudGVzdG5nMjg1OworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RORzI4NVRlc3QgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5QnVnKCkgeworICAgIGFkZENsYXNzKCJ0ZXN0LnRlc3RuZzI4NS5EZXJpdmVkIik7CisgICAgc2V0UGFyYWxsZWwoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk1FVEhPRFMpOworICAgIHNldFRocmVhZENvdW50KDUpOworCisgICAgcnVuKCk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJ1Z0Jhc2UubV90aHJlYWRJZHMuc2l6ZSgpLCAxKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzMxNy9DbGFzc0EuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczMTcvQ2xhc3NBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhhYjY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczMTcvQ2xhc3NBLmphdmEKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzMxNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworCitwdWJsaWMgY2xhc3MgQ2xhc3NBIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVBKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0ic2FtZU5hbWVBIikKKyAgcHVibGljIHZvaWQgdW5pcXVlTmFtZUIoKXsKKyAgICBwcmludE1ldGhvZCgpOworICB9CisgIEBUZXN0IChkZXBlbmRzT25NZXRob2RzPSJ1bmlxdWVOYW1lQiIpCisgIHB1YmxpYyB2b2lkIHVuaXF1ZU5hbWVDKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0idW5pcXVlTmFtZUMiKQorICBwdWJsaWMgdm9pZCB1bmlxdWVOYW1lRCgpeworICAgIHByaW50TWV0aG9kKCk7CisgIH0KKyAgQFRlc3QgKGRlcGVuZHNPbk1ldGhvZHM9InVuaXF1ZU5hbWVEIikKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVFKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0ic2FtZU5hbWVFIikKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVGKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0ic2FtZU5hbWVGIikKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVHKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0ic2FtZU5hbWVHIikKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVIKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG51bGxUZXN0KCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBwcm90ZWN0ZWQgdm9pZCBwcmludE1ldGhvZCgpIHsKKyAgICBTdGFja1RyYWNlRWxlbWVudFtdIHNUcmFjZSA9IG5ldyBFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7CisgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHNUcmFjZVswXS5nZXRDbGFzc05hbWUoKTsKKyAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHNUcmFjZVsxXS5nZXRNZXRob2ROYW1lKCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50ZigiKioqKioqKioqKiogZXhlY3V0aW5nIC0tLSAlcyAlc1xuIiwgY2xhc3NOYW1lLCBtZXRob2ROYW1lKTsKKworICAgIFZlcmlmeVRlc3QubV9tZXRob2RzLmFkZChjbGFzc05hbWUgKyAiLiIgKyBtZXRob2ROYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzMxNy9DbGFzc0IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczMTcvQ2xhc3NCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2E1ZTFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczMTcvQ2xhc3NCLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzMxNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIENsYXNzQiB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNhbWVOYW1lQUEoKXsKKyAgICBwcmludE1ldGhvZCgpOworICB9CisgIEBUZXN0IChkZXBlbmRzT25NZXRob2RzPSJzYW1lTmFtZUFBIikKKyAgcHVibGljIHZvaWQgdW5pcXVlTmFtZUJCKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0idW5pcXVlTmFtZUJCIikKKyAgcHVibGljIHZvaWQgdW5pcXVlTmFtZUNDKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0idW5pcXVlTmFtZUNDIikKKyAgcHVibGljIHZvaWQgdW5pcXVlTmFtZUREKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBAVGVzdCAoZGVwZW5kc09uTWV0aG9kcz0idW5pcXVlTmFtZUREIikKKyAgcHVibGljIHZvaWQgc2FtZU5hbWVFKCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG51bGxUZXN0KCl7CisgICAgcHJpbnRNZXRob2QoKTsKKyAgfQorICBwcm90ZWN0ZWQgdm9pZCBwcmludE1ldGhvZCgpIHsKKyAgICBTdGFja1RyYWNlRWxlbWVudFtdIHNUcmFjZSA9IG5ldyBFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7CisgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHNUcmFjZVswXS5nZXRDbGFzc05hbWUoKTsKKyAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHNUcmFjZVsxXS5nZXRNZXRob2ROYW1lKCk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50ZigiKioqKioqKioqKiogZXhlY3V0aW5nIC0tLSAlcyAlc1xuIiwgY2xhc3NOYW1lLCBtZXRob2ROYW1lKTsKKworICAgIFZlcmlmeVRlc3QubV9tZXRob2RzLmFkZChjbGFzc05hbWUgKyAiLiIgKyBtZXRob2ROYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzMxNy9WZXJpZnlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMzE3L1ZlcmlmeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjQxNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzMxNy9WZXJpZnlUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzMxNzsKKworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVmVyaWZ5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKyAgc3RhdGljIExpc3Q8U3RyaW5nPiBtX21ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICBtX21ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldFRlc3RDbGFzc2VzKG5ldyBDbGFzc1tdIHsgdGVzdC50ZXN0bmczMTcuQ2xhc3NCLmNsYXNzLCB0ZXN0LnRlc3RuZzMxNy5DbGFzc0EuY2xhc3MgfSk7CisgICAgdG5nLnJ1bigpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2RzOiIgKyBtX21ldGhvZHMuc2l6ZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzM3L051bGxQYXJhbWV0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMzcvTnVsbFBhcmFtZXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTAwYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzM3L051bGxQYXJhbWV0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzM3Ow0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcy9pbnRlcmZhY2UNCisgKi8NCitwdWJsaWMgY2xhc3MgTnVsbFBhcmFtZXRlclRlc3Qgew0KKyAgQFRlc3QNCisgIEBQYXJhbWV0ZXJzKHsibm90bnVsbCIsICJudWxsdmFsdWUifSkNCisgIHB1YmxpYyB2b2lkIG51bGxQYXJhbWV0ZXIoU3RyaW5nIG5vdE51bGwsIGludCBtdXN0QmVOdWxsKSB7DQorICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5vdE51bGwsICJub3QgbnVsbCBwYXJhbWV0ZXIgZXhwZWN0ZWQiKTsNCisgICAgQXNzZXJ0LmFzc2VydE51bGwobXVzdEJlTnVsbCwgIm51bGwgcGFyYW1ldGVyIGV4cGVjdGVkIik7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczNy90ZXN0bmctMzcueG1sIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzM3L3Rlc3RuZy0zNy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczNy90ZXN0bmctMzcueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+DQorPHN1aXRlIG5hbWU9IlRFU1RORy0zNyBTdWl0ZSIgdmVyYm9zZT0iMiI+CisgIDx0ZXN0IG5hbWU9IlRFU1RORy01NyI+DQorICAgICAgPHBhcmFtZXRlciBuYW1lPSJub3RudWxsIiB2YWx1ZT0ibnVsbCIvPg0KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibnVsbHZhbHVlIiB2YWx1ZT0iTlVMTCIvPg0KKyAgICAgIDxwYWNrYWdlcz4KKyAgICAgICAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0LnRlc3RuZzM3IiAvPgorICAgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMzg3L0ZhaWxlZERQVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzM4Ny9GYWlsZWREUFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFkZjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzM4Ny9GYWlsZWREUFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIHRlc3QudGVzdG5nMzg3OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiB0ZXN0IGZvciBodHRwOi8vamlyYS5vcGVuc3ltcGhvbnkuY29tL2Jyb3dzZS9URVNUTkctMzg3CisgKiBUaGUgaW52b2NhdGlvbi1udW1iZXJzIGxvZ2ljIGluIGZhaWxlZC54bWwgaXMgd3JvbmcgZm9yIGRhdGFwcm92aWRlciBhbmQgcGFyYWxsZWw9dHJ1ZQorICoKKyAqIFRoZSB0ZXN0IHdpbGwgdGhyb3cgZXhjZXB0aW9uIHdoZW4gbnVtYmVycyBhcmUgcHJpbWUsIHNvIGdldEZhaWxlZEludm9jYXRpb25OdW1iZXJzKCkgc2hvdWxkIGJlIGEgbGlzdCBvZiBwcmltZSBudW1iZXJzLgorICoKKyAqIEBhdXRob3IgZnJleW5hdWQKKyAqLworcHVibGljIGNsYXNzIEZhaWxlZERQVGVzdCB7CisJc3RhdGljIGZpbmFsIExpc3Q8SW50ZWdlcj4gcHJpbWVzID0gQXJyYXlzLmFzTGlzdCgyLCAzLCA1LCA3KTsKKworCS8qKgorCSAqIERQIGdlbmVyYXRpbmcgYWxsIG51bWJlciBmcm9tIDAgdG8gOS4KKwkgKiAqLworCUBEYXRhUHJvdmlkZXIobmFtZSA9ICJEUCIsIHBhcmFsbGVsID0gdHJ1ZSkKKwlwdWJsaWMgSXRlcmF0b3I8SW50ZWdlcltdPiBnZXREYXRhKCkgeworCQlMaXN0PEludGVnZXJbXT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWxpc3QuYWRkKG5ldyBJbnRlZ2VyW10geyBpIH0pOworCQl9CisJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7CisJfQorCisJLyoqCisJICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBmb3IgYSBwcmltZSBudW1iZXIuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdChkYXRhUHJvdmlkZXIgPSAiRFAiLCBncm91cHMgPSB7ICJEUFRlc3QiIH0pCisJcHVibGljIHZvaWQgaXNOb3RQcmltZShJbnRlZ2VyIGkpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJpbWVzLmNvbnRhaW5zKGkpKXsKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oaSsiIGlzIHByaW1lIik7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmczODcvVGVzdE5HMzg3LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMzg3L1Rlc3RORzM4Ny5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjg3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nMzg3L1Rlc3RORzM4Ny5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmczODc7CisKK2ltcG9ydCBvcmcudGVzdG5nLio7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsc05vT3JkZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0TkczODcgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDUwMCkKKyAgcHVibGljIHZvaWQgdGVzdEludm9jYXRpb25Db3VudGVySXNDb3JyZWN0Rm9yTWV0aG9kV2l0aERhdGFQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRlc3RORyB0bmcgPSBjcmVhdGUoRmFpbGVkRFBUZXN0LmNsYXNzKTsKKyAgICB0bmcuc2V0VGhyZWFkQ291bnQoMSk7CisgICAgdG5nLnNldFBhcmFsbGVsKFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5GQUxTRSk7CisgICAgdG5nLnNldFByZXNlcnZlT3JkZXIodHJ1ZSk7CisgICAgZmluYWwgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIElUZXN0TkdNZXRob2QgbWV0aG9kID0gdGxhLmdldFRlc3RDb250ZXh0cygpLmdldCgwKS5nZXRBbGxUZXN0TWV0aG9kcygpWzBdOworCisgICAgTGlzdDxJbnRlZ2VyPiBmYWlsZWQgPSBtZXRob2QuZ2V0RmFpbGVkSW52b2NhdGlvbk51bWJlcnMoKTsKKyAgICBhc3NlcnRFcXVhbHNOb09yZGVyKGZhaWxlZC50b0FycmF5KCksIEZhaWxlZERQVGVzdC5wcmltZXMudG9BcnJheSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU2L1BhcmFsbGVsVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU2L1BhcmFsbGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTA5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nNTYvUGFyYWxsZWxUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSB0ZXN0LnRlc3RuZzU2Ow0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFRlc3Qgew0KKyAgQEJlZm9yZUNsYXNzDQorICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6c2V0dXAiKTsNCisgIH0NCisNCisgIEBBZnRlckNsYXNzDQorICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVhcmRvd24iKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVzdDEiKTsNCisgIH0NCisNCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7InRlc3QxIn0pDQorICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVzdDIiKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVzdDMiKTsNCisgIH0NCisNCisgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7InRlc3QzIn0pDQorICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVzdDQiKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsNCisgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICI6dGVzdDUiKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU2L3Rlc3RuZy01Ni54bWwgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nNTYvdGVzdG5nLTU2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGNmOTJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU2L3Rlc3RuZy01Ni54bWwKQEAgLTAsMCArMSw4IEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPg0KKzxzdWl0ZSBuYW1lPSJURVNUTkctNTYgU3VpdGUiIHZlcmJvc2U9IjMiIHBhcmFsbGVsPSJ0cnVlIiB0aHJlYWQtY291bnQ9IjMiPgorICA8dGVzdCBuYW1lPSJURVNUTkctNTYiPg0KKyAgICAgIDxwYWNrYWdlcz4KKyAgICAgICAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0LnRlc3RuZzU2IiAvPgorICAgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nNTkvVGVzdDEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmc1OS9UZXN0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWQ5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nNTkvVGVzdDEuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QudGVzdG5nNTk7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0MSB7DQorICBwcml2YXRlIGJvb2xlYW4gbV9ydW49IGZhbHNlOw0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3QxKCkgew0KKyAgICBtX3J1bj0gdHJ1ZTsNCisgIH0NCisNCisgIEBBZnRlckNsYXNzDQorICBwdWJsaWMgdm9pZCBjaGVja1dhc1J1bigpIHsNCisgICAgQXNzZXJ0LmFzc2VydFRydWUobV9ydW4sICJ0ZXN0MSgpIHNob3VsZCBoYXZlIGJlZW4gcnVuIGFjY29yZGluZyB0byB0ZXN0bmctNTkueG1sIik7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmc1OS9UZXN0Mi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU5L1Rlc3QyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxODk1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmc1OS9UZXN0Mi5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmc1OTsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MvaW50ZXJmYWNlDQorICovDQorcHVibGljIGNsYXNzIFRlc3QyIHsNCisgIHByaXZhdGUgYm9vbGVhbiBtX3J1bj0gZmFsc2U7DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdGVzdDIoKSB7DQorICAgIG1fcnVuPSB0cnVlOw0KKyAgfQ0KKw0KKyAgQEFmdGVyQ2xhc3MNCisgIHB1YmxpYyB2b2lkIGNoZWNrV2FzUnVuKCkgew0KKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX3J1biwgInRlc3QyKCkgc2hvdWxkIGhhdmUgYmVlbiBydW4gYWNjb3JkaW5nIHRvIHRlc3RuZy01OS54bWwiKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU5L3Rlc3RuZy01OS54bWwgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nNTkvdGVzdG5nLTU5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzU5L3Rlc3RuZy01OS54bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4NCis8c3VpdGUgbmFtZT0iVEVTVE5HLTU5IFN1aXRlIiB2ZXJib3NlPSIzIiA+CisgIDx0ZXN0IG5hbWU9IlRFU1RORy01OSI+CisgICAgICA8Y2xhc3Nlcz4KKyAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmc1OS5UZXN0MSI+CisgICAgICAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdDEiLz4KKyAgICAgICAgICAgICAgPC9tZXRob2RzPgorICAgICAgICAgIDwvY2xhc3M+CisgICAgICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGVzdG5nNTkuVGVzdDIiPgorICAgICAgICAgICAgICA8bWV0aG9kcz4KKyAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3QyIi8+CisgICAgICAgICAgICAgIDwvbWV0aG9kcz4KKyAgICAgICAgICA8L2NsYXNzPgorICAgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmc5My9TaW5nbGVUZXN0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzkzL1NpbmdsZVRlc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkMDNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90ZXN0bmc5My9TaW5nbGVUZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgdGVzdC50ZXN0bmc5MzsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzL2ludGVyZmFjZQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVUZXN0VGVzdCB7DQorICBAQmVmb3JlTWV0aG9kKGdyb3Vwcz17Imdyb3VwMSJ9KQ0KKyAgcHVibGljIHZvaWQgc2hvdWxkUnVuQmVmb3JlKCkgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVucyBiZWZvcmUiKTsNCisgIH0NCisNCisgIEBUZXN0KGdyb3Vwcz17Imdyb3VwMSJ9KQ0KKyAgcHVibGljIHZvaWQgdGhlRmlyc3RBY3R1YWxUZXN0KCkgew0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGZpcnN0IGFjdHVhbCB0ZXN0Iik7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdGhlU2Vjb25kQWN0dWFsVGVzdCgpIHsNCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBzZWNvbmQgYWN0dWFsIHRlc3QiKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzkzL3Rlc3RuZy05My54bWwgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGVzdG5nOTMvdGVzdG5nLTkzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UxOTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Rlc3RuZzkzL3Rlc3RuZy05My54bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4NCis8c3VpdGUgbmFtZT0iQnVndGVzdCIgdmVyYm9zZT0iMSI+DQorICAgIDx0ZXN0IG5hbWU9IlNpbmdsZSB0ZXN0Ij4NCisgICAgICAgIDxncm91cHM+DQorICAgICAgICAgICAgPHJ1bj4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iZ3JvdXAxIi8+DQorICAgICAgICAgICAgPC9ydW4+DQorICAgICAgICA8L2dyb3Vwcz4NCisgICAgICAgIDxjbGFzc2VzPg0KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRlc3RuZzkzLlNpbmdsZVRlc3RUZXN0Ij4NCisgICAgICAgICAgICAgICAgPG1ldGhvZHM+DQorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0aGVGaXJzdEFjdHVhbFRlc3QiLz4NCisgICAgICAgICAgICAgICAgPC9tZXRob2RzPg0KKyAgICAgICAgICAgIDwvY2xhc3M+DQorICAgICAgICA8L2NsYXNzZXM+DQorICAgIDwvdGVzdD4NCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhOTFiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvQi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsNCisNCitwdWJsaWMgY2xhc3MgQiB7DQorICBwdWJsaWMgc3RhdGljIE1hcDxMb25nLCBMb25nPiBtX3RocmVhZElkcyA9IE1hcHMubmV3SGFzaE1hcCgpOw0KKw0KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkgew0KKyAgICBtX3RocmVhZElkcyA9IG5ldyBIYXNoTWFwPD4oKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBmMigpIHsNCisgICAgTG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsNCisgICAgbV90aHJlYWRJZHMucHV0KGlkLCBpZCk7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgew0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltGYWN0b3J5VGVzdF0gIiArIHMpOw0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL0Jhc2VTZXF1ZW50aWFsU2FtcGxlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL0Jhc2VTZXF1ZW50aWFsU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiZGIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvQmFzZVNlcXVlbnRpYWxTYW1wbGUuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIHRlc3QudGhyZWFkOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK3B1YmxpYyBjbGFzcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBwcm90ZWN0ZWQgdm9pZCBhZGRJZChTdHJpbmcgbWV0aG9kLCBsb25nIGlkKSB7DQorICAgIHBwcChtZXRob2QgKyAiIElEOiIgKyBpZCk7DQorICAgIGdldE1hcCgpLnB1dChpZCwgaWQpOw0KKyAgfQ0KKw0KKyAgTWFwIGdldE1hcCgpIHsNCisgICAgTWFwIHJlc3VsdCA9IEhlbHBlci5nZXRNYXAoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KKyAgICBwcHAoIlJFVFVSTklORyBNQVAgIiArIHJlc3VsdCArICIgVEhJUzoiICsgdGhpcyk7DQorDQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICBwcm90ZWN0ZWQgdm9pZCBwcHAoU3RyaW5nIHMpIHsNCisgICAgaWYgKGZhbHNlKSB7DQorICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAiDQorICAgICAgICAgICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIiAiDQorICAgICAgICAgICsgIl0gIiArIHMpOw0KKyAgICB9DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvQmFzZVRocmVhZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvQmFzZVRocmVhZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI0MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9CYXNlVGhyZWFkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLlNldHM7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQmFzZVRocmVhZFRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisgIHN0YXRpYyBwcml2YXRlIFNldDxMb25nPiBtX3RocmVhZElkczsKKyAgc3RhdGljIHByaXZhdGUgTWFwPFN0cmluZywgTG9uZz4gbV9zdWl0ZXNNYXA7CisgIHN0YXRpYyBwcml2YXRlIExpc3Q8U3RyaW5nPiBtX3N0cmluZ3M7CisKKyAgc3RhdGljIHZvaWQgaW5pdFRocmVhZExvZygpIHsKKyAgICBtX3RocmVhZElkcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIG1fc3VpdGVzTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgbV9zdHJpbmdzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBsb2dTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICBzeW5jaHJvbml6ZWQobV9zdHJpbmdzKSB7CisgICAgICBsb2coIkJhc2VUaHJlYWRUZXN0IiwgIkxvZ2dpbmcgc3RyaW5nOiIgKyBzKTsKKyAgICAgIG1fc3RyaW5ncy5hZGQocyk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0U3RyaW5ncygpIHsKKyAgICByZXR1cm4gbV9zdHJpbmdzOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgbG9nQ3VycmVudFRocmVhZCgpIHsKKyAgICBsb2dUaHJlYWQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGxvZ1RocmVhZChsb25nIHRocmVhZElkKSB7CisgICAgc3luY2hyb25pemVkKG1fdGhyZWFkSWRzKSB7CisgICAgICBsb2coIkJhc2VUaHJlYWRUZXN0IiwgIkxvZ2dpbmcgdGhyZWFkOiIgKyB0aHJlYWRJZCk7CisgICAgICBtX3RocmVhZElkcy5hZGQodGhyZWFkSWQpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGxvZ1N1aXRlKFN0cmluZyBzdWl0ZU5hbWUsIGxvbmcgdGltZSkgeworICAgIHN5bmNocm9uaXplZChtX3N1aXRlc01hcCkgeworICAgICAgbV9zdWl0ZXNNYXAucHV0KHN1aXRlTmFtZSwgdGltZSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGludCBnZXRUaHJlYWRDb3VudCgpIHsKKyAgICBzeW5jaHJvbml6ZWQobV90aHJlYWRJZHMpIHsKKyAgICAgIHJldHVybiBtX3RocmVhZElkcy5zaXplKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIE1hcDxTdHJpbmcsIExvbmc+IGdldFN1aXRlc01hcCgpIHsKKyAgICByZXR1cm4gbV9zdWl0ZXNNYXA7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGNscywgU3RyaW5nIHMpIHsKKyAgICBpZiAoZmFsc2UpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWyIgKyBjbHMgKyAiXSB0aHJlYWQ6IiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKQorICAgICAgICAgICsgIiBoYXNoOiIgKyBoYXNoQ29kZSgpICsgIiAiICsgcyk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGhyZWFkcyhpbnQgZXhwZWN0ZWQpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdldFRocmVhZENvdW50KCksIGV4cGVjdGVkLAorICAgICAgICAiUmFuIG9uICIgKyBnZXRUaHJlYWRDb3VudCgpICsgIiB0aHJlYWRzIGluc3RlYWQgb2YgIiArIGV4cGVjdGVkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9EYXRhUHJvdmlkZXJUaHJlYWRQb29sU2l6ZVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMzFhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVTYW1wbGVUZXN0IGV4dGVuZHMgQmFzZVRocmVhZFRlc3QgeworICBAQmVmb3JlQ2xhc3MoYWx3YXlzUnVuID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgbG9nKGdldENsYXNzKCkuZ2V0TmFtZSgpLCAiSW5pdCBsb2cgaWRzIik7CisgICAgaW5pdFRocmVhZExvZygpOworICB9CisKKyAgQERhdGFQcm92aWRlcihwYXJhbGxlbCA9IHRydWUpCisgIHB1YmxpYyBPYmplY3RbXVtdIHBhcmFsbGVsRGF0YVByb3ZpZGVyKCkgeworICAgIHJldHVybiBjcmVhdGVBcnJheSgpOworICB9CisKKyAgQERhdGFQcm92aWRlcgorICBwdWJsaWMgT2JqZWN0W11bXSBzZXF1ZW50aWFsRGF0YVByb3ZpZGVyKCkgeworICAgIHJldHVybiBjcmVhdGVBcnJheSgpOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3RbXVtdIGNyZWF0ZUFycmF5KCkgeworICAgIGludCBpID0gMDsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IGkrKyB9LAorICAgICAgICBuZXcgT2JqZWN0W10geyBpKysgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgaSsrIH0sCisgICAgfTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJzZXF1ZW50aWFsRGF0YVByb3ZpZGVyIiwgZ3JvdXBzID0gInNlcXVlbnRpYWwiKQorICBwdWJsaWMgdm9pZCBmU2VxdWVudGlhbChJbnRlZ2VyIHApIHsKKyAgICBsb25nIG4gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgbG9nKGdldENsYXNzKCkuZ2V0TmFtZSgpLCAiU2VxdWVudGlhbCIpOworICAgIGxvZ1RocmVhZChuKTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJwYXJhbGxlbERhdGFQcm92aWRlciIsIGdyb3VwcyA9ICJwYXJhbGxlbCIpCisgIHB1YmxpYyB2b2lkIGZQYXJhbGxlbChJbnRlZ2VyIHApIHsKKyAgICBsb25nIG4gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgbG9nKGdldENsYXNzKCkuZ2V0TmFtZSgpLCAiUGFyYWxsZWwiKTsKKyAgICBsb2dUaHJlYWQobik7CisgIH0KKworLy8gIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSB7ImYxIn0pCisvLyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworLy8gICAgaW50IGV4cGVjdGVkID0gMzsKKy8vICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV90aHJlYWRJZHMuc2l6ZSgpLCBleHBlY3RlZCwKKy8vICAgICAgICAiU2hvdWxkIGhhdmUgcnVuIG9uICIgKyBleHBlY3RlZCArICIgdGhyZWFkcyBidXQgcmFuIG9uICIgKyBtX3RocmVhZElkcy5zaXplKCkpOworLy8gIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL0RhdGFQcm92aWRlclRocmVhZFBvb2xTaXplVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDgzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL0RhdGFQcm92aWRlclRocmVhZFBvb2xTaXplVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZFVzZURlZmF1bHREYXRhUHJvdmlkZXJUaHJlYWRDb3VudCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKERhdGFQcm92aWRlclRocmVhZFBvb2xTaXplU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnNldEdyb3VwcygicGFyYWxsZWwiKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEYXRhUHJvdmlkZXJUaHJlYWRQb29sU2l6ZVNhbXBsZVRlc3QuZ2V0VGhyZWFkQ291bnQoKSwgMTApOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2hvdWxkTm90VXNlVGhyZWFkc0lmTm90VXNpbmdQYXJhbGxlbCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKERhdGFQcm92aWRlclRocmVhZFBvb2xTaXplU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnNldEdyb3Vwcygic2VxdWVudGlhbCIpOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERhdGFQcm92aWRlclRocmVhZFBvb2xTaXplU2FtcGxlVGVzdC5nZXRUaHJlYWRDb3VudCgpLCAxKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHNob3VsZFVzZVNwZWNpZmllZERhdGFQcm92aWRlclRocmVhZENvdW50KCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoRGF0YVByb3ZpZGVyVGhyZWFkUG9vbFNpemVTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICB0bmcuc2V0R3JvdXBzKCJwYXJhbGxlbCIpOworICAgIHRuZy5zZXREYXRhUHJvdmlkZXJUaHJlYWRDb3VudCgzKTsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEYXRhUHJvdmlkZXJUaHJlYWRQb29sU2l6ZVNhbXBsZVRlc3QuZ2V0VGhyZWFkQ291bnQoKSwgMyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvRmFjdG9yeVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvRmFjdG9yeVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM3NzgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9GYWN0b3J5U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisKK0BUZXN0CitwdWJsaWMgY2xhc3MgRmFjdG9yeVNhbXBsZVRlc3QgeworCisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBpbml0KCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W10geworICAgICAgICBuZXcgQigpLAorICAgICAgICBuZXcgQigpLAorICAgIH07CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9GYWN0b3J5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9GYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjhmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL0ZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5VGVzdCB7CisKKyAgQFRlc3QKKyAgLyoqCisgICAqIEluIG5vbi1wYXJhbGxlbCBtb2RlLCB3ZSBzaG91bGQgb25seSBoYXZlIG9uZSB0aHJlYWQgaWQKKyAgICogZm9yIHRoZSB0d28gbWV0aG9kcyBpbnZva2VkIG9uIEIuCisgICAqLworICBwdWJsaWMgdm9pZCB2ZXJpZnlGYWN0b3J5Tm90UGFyYWxsZWwoKSB7CisgICAgcnVuVGVzdChudWxsLCAxKTsKKyAgfQorCisgIC8qKgorICAgKiBJbiBwYXJhbGxlbCBtb2RlICJtZXRob2RzIiwgd2Ugc2hvdWxkIGhhdmUgYXMgbWFueSB0aHJlYWQgaWQncworICAgKiBhcyB0aGVyZSBhcmUgdGVzdCBtZXRob2RzIG9uIEIgKDIpLgorICAgKi8KKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5RmFjdG9yeVBhcmFsbGVsTWV0aG9kcygpIHsKKyAgICBydW5UZXN0KFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5NRVRIT0RTLCAyKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeUZhY3RvcnlQYXJhbGxlbFRlc3RzKCkgeworICAgIHJ1blRlc3QoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLlRFU1RTLCAxKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBydW5UZXN0KFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBwYXJhbGxlbE1vZGUsIGludCBleHBlY3RlZFRocmVhZElkQ291bnQpIHsKKyAgICBUZXN0TkcgdG5nID0gbmV3IFRlc3RORygpOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXSB7IEZhY3RvcnlTYW1wbGVUZXN0LmNsYXNzfSk7CisgICAgaWYgKHBhcmFsbGVsTW9kZSAhPSBudWxsKSB7CisgICAgICB0bmcuc2V0UGFyYWxsZWwocGFyYWxsZWxNb2RlKTsKKyAgICB9CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworCisgICAgQi5zZXRVcCgpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAyKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEIubV90aHJlYWRJZHMuc2l6ZSgpLCBleHBlY3RlZFRocmVhZElkQ291bnQpOworCisvLyAgICBwcHAoIiMgVEVTVFMgUlVOICIgKyB0bGEuZ2V0UGFzc2VkVGVzdHMoKS5zaXplKCkKKy8vICAgICAgICArICIgSUQ6IiArIEIubV90aHJlYWRJZHMuc2l6ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0ZhY3RvcnlUZXN0XSAiICsgc3RyaW5nKTsKKyAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9IZWxwZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5NDRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvSGVscGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorcHVibGljIGNsYXNzIEhlbHBlciB7DQorICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBNYXA8TG9uZywgTG9uZz4+IG1fbWFwcyA9IG5ldyBIYXNoTWFwPD4oKTsNCisNCisgIHB1YmxpYyBzdGF0aWMgTWFwPExvbmcsIExvbmc+IGdldE1hcChTdHJpbmcgY2xhc3NOYW1lKSB7DQorICAgIHN5bmNocm9uaXplZChtX21hcHMpIHsNCisgICAgICBNYXA8TG9uZywgTG9uZz4gcmVzdWx0ID0gbV9tYXBzLmdldChjbGFzc05hbWUpOw0KKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgew0KKyAgICAgICAgLy8gVE9ETyBhIHN5bmNocm9uaXplZE1hcCB3aWxsIGJyZWFrIE11bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0DQorICAgICAgICAvLyBhIG5vdCBzeW5jaHJvbml6ZWRNYXAgd2lsbCBfX3NvbWV0aW1lc19fIGJyZWFrIFBhcmFsbGVsSVRlc3RUZXN0DQorICAgICAgICAvL3Jlc3VsdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxMb25nLCBMb25nPigpKTsNCisgICAgICAgIHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsNCisgICAgICAgIG1fbWFwcy5wdXQoY2xhc3NOYW1lLCByZXN1bHQpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJQdXR0aW5nIGNsYXNzOiIgKyBjbGFzc05hbWUgKyAiIHJlc3VsdDoiICsgcmVzdWx0KTsNCisNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsNCisgICAgbV9tYXBzID0gbmV3IEhhc2hNYXA8PigpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL011bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL011bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNzc1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvTXVsdGlUaHJlYWRlZERlcGVuZGVudFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTGlzdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE11bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0IHsKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gbV9tZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJjKCkgeworLy8gICAgbG9nKCJiZWZvcmVDbGFzcyIpOworICB9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgYWMoKSB7CisvLyAgICBsb2coImFmdGVyQ2xhc3MiKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisvLyAgICBsb2coImJlZm9yZU1ldGhvZCIpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFtKCkgeworLy8gICAgbG9nKCJhZnRlck1ldGhvZCIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gIjEiKQorICBwdWJsaWMgdm9pZCBhMSgpIHsKKyAgICBsb2dUaHJlYWQoKTsKKyAgICBsb2coImExIik7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiMSIpCisgIHB1YmxpYyB2b2lkIGEyKCkgeworICAgIGxvZ1RocmVhZCgpOworICAgIGxvZygiYTIiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICIxIikKKyAgcHVibGljIHZvaWQgYTMoKSB7CisgICAgbG9nVGhyZWFkKCk7CisgICAgbG9nKCJhMyIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gIjIiLCBkZXBlbmRzT25Hcm91cHMgPSAiMSIpCisgIHB1YmxpYyB2b2lkIGIxKCkgeworICAgIGxvZ1RocmVhZCgpOworICAgIGxvZygiYjEiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICIyIiwgZGVwZW5kc09uR3JvdXBzID0gIjEiKQorICBwdWJsaWMgdm9pZCBiMigpIHsKKyAgICBsb2dUaHJlYWQoKTsKKyAgICBsb2coImIyIik7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiMiIsIGRlcGVuZHNPbkdyb3VwcyA9ICIxIikKKyAgcHVibGljIHZvaWQgYjMoKSB7CisgICAgbG9nVGhyZWFkKCk7CisgICAgbG9nKCJiMyIpOworICB9CisKKyAgQFRlc3QoZ3JvdXBzID0gIjIiLCBkZXBlbmRzT25Hcm91cHMgPSAiMSIpCisgIHB1YmxpYyB2b2lkIGI0KCkgeworICAgIGxvZ1RocmVhZCgpOworICAgIGxvZygiYjQiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICIyIiwgZGVwZW5kc09uR3JvdXBzID0gIjEiKQorICBwdWJsaWMgdm9pZCBiNSgpIHsKKyAgICBsb2dUaHJlYWQoKTsKKyAgICBsb2coImI1Iik7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25Hcm91cHMgPSAiMiIpCisgIHB1YmxpYyB2b2lkIGMxKCkgeworICAgIGxvZ1RocmVhZCgpOworICAgIGxvZygiYzEiKTsKKyAgfQorCisgIEBUZXN0KGRlcGVuZHNPbkdyb3VwcyA9IHsgIjEiIH0pCisgIHB1YmxpYyB2b2lkIGQoKSB7CisgICAgbG9nVGhyZWFkKCk7CisgICAgbG9nKCJkIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB4KCkgeworICAgIGxvZygieCIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgeSgpIHsKKyAgICBsb2coInkiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHooKSB7CisgICAgbG9nKCJ6Iik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0KCkgeworICAgIGxvZygidCIpOworICB9CisKKyAgLy8gIEBUZXN0KGdyb3VwcyA9ICJteXRlc3QiLCBkZXBlbmRzT25NZXRob2RzID0gImciKQorLy8gIHB1YmxpYyB2b2lkIGYoKSB7CisvLyAgfQorLy8KKy8vCisvLyAgQEFmdGVyTWV0aG9kCisvLyAgcHVibGljIHZvaWQgYWZ0ZXIoKSB7CisvLyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2dUaHJlYWQoKSB7CisgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICBIZWxwZXIuZ2V0TWFwKGdldENsYXNzKCkuZ2V0TmFtZSgpKS5wdXQoaWQsIGlkKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgeworICAgIHN5bmNocm9uaXplZChtX21ldGhvZHMpIHsKKyAgICAgIG1fbWV0aG9kcy5hZGQoc3RyaW5nKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9NdWx0aVRocmVhZGVkRGVwZW5kZW50VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9NdWx0aVRocmVhZGVkRGVwZW5kZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Y2ZkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL011bHRpVGhyZWFkZWREZXBlbmRlbnRUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcuY29sbGVjdGlvbnMuTWFwczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IHRlc3QuU2ltcGxlQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVzdCB0aGF0IGNsYXNzZXMgd2l0aCBkZXBlbmRlbnQgbWV0aG9kcyBhcmUgc3RpbGwgcnVuIGluIGRpZmZlcmVudCB0aHJlYWRzCisgKiBhbmQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVRocmVhZGVkRGVwZW5kZW50VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICAvKioKKyAgICogTWFrZSBzdXJlIHRoYXQgdGhlIHRvcG9sb2dpY2FsIG9yZGVyIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBpZgorICAgKiB0aGUgVGVzdE5HIHJ1bm5lciBpcyBjb25maWd1cmVkIHRvIHJ1biBuIHRocmVhZHMsIHRoZSBkZXBlbmRlbnQKKyAgICogbWV0aG9kcyBhcmUgdXNpbmcgdGhlc2UgbiB0aHJlYWRzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydE9yZGVyKExpc3Q8U3RyaW5nPiBtZXRob2RzKSB7CisgICAgTGlzdDxTdHJpbmc+IGV4cGVjdGVkTWV0aG9kcyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICJhMSIsICJhMiIsICJhMyIsICJiMSIsICJiMiIsICJiMyIsICJiNCIsICJiNSIsICJjMSIsICJkIiwgIngiLCAieSIsICJ6IiwgInQiCisgICAgfSk7CisgICAgaW50IHNpemUgPSBleHBlY3RlZE1ldGhvZHMuc2l6ZSgpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobWV0aG9kcy5zaXplKCksIHNpemUpOworICAgIGZvciAoU3RyaW5nIGVtIDogZXhwZWN0ZWRNZXRob2RzKSB7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXRob2RzLmNvbnRhaW5zKGVtKSk7CisgICAgfQorICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoU3RyaW5nIG0gOiBtZXRob2RzKSB7CisgICAgICBtYXAucHV0KG0sIEJvb2xlYW4uVFJVRSk7CisgICAgICBpZiAoImIxIi5lcXVhbHMobSkgfHwgImIyIi5lcXVhbHMobSkgfHwgImIzIi5lcXVhbHMobSkgfHwgImI0Ii5lcXVhbHMobSkgfHwgImI1Ii5lcXVhbHMobSkpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWFwLmdldCgiYTEiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1hcC5nZXQoImEyIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtYXAuZ2V0KCJhMyIpKTsKKyAgICAgIH0KKyAgICAgIGlmICgiZCIuZXF1YWxzKG0pKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1hcC5nZXQoImExIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtYXAuZ2V0KCJhMiIpKTsKKyAgICAgIH0KKyAgICAgIGlmICgiYzEiLmVxdWFscyhtKSkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtYXAuZ2V0KCJiMSIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWFwLmdldCgiYjIiKSk7CisgICAgICB9CisgICAgfQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobWFwLnNpemUoKSwgc2l6ZSk7CisgICAgZm9yIChCb29sZWFuIHZhbCA6IG1hcC52YWx1ZXMoKSkgeworICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmFsKTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MlRocmVhZHMoKSB7CisgICAgdGVzdCgyKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3QzVGhyZWFkcygpIHsKKyAgICB0ZXN0KDMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3QoaW50IHRocmVhZENvdW50KSB7CisgICAgSGVscGVyLnJlc2V0KCk7CisgICAgTXVsdGlUaHJlYWRlZERlcGVuZGVudFNhbXBsZVRlc3QubV9tZXRob2RzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShNdWx0aVRocmVhZGVkRGVwZW5kZW50U2FtcGxlVGVzdC5jbGFzcyk7CisgICAgdG5nLnNldFRocmVhZENvdW50KHRocmVhZENvdW50KTsKKyAgICB0bmcuc2V0UGFyYWxsZWwoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk1FVEhPRFMpOworICAgIE1hcDxMb25nLCBMb25nPiBtYXAgPSBIZWxwZXIuZ2V0TWFwKE11bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgc3luY2hyb25pemVkKG1hcCkgeworICAgICAgdG5nLnJ1bigpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWFwLnNpemUoKSA+IDEsICJNYXAgc2l6ZToiICsgbWFwLnNpemUoKSArICIgZXhwZWN0ZWQgbW9yZSB0aGFuIDEiKTsKKyAgICAgIGFzc2VydE9yZGVyKE11bHRpVGhyZWFkZWREZXBlbmRlbnRTYW1wbGVUZXN0Lm1fbWV0aG9kcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1BhcmFsbGVsU3VpdGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1BhcmFsbGVsU3VpdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwNGE3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvUGFyYWxsZWxTdWl0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdExpc3RlbmVyQWRhcHRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LlNpbXBsZUJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxTdWl0ZVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3VpdGVzU2hvdWxkUnVuSW5QYXJhbGxlbDEoKSB7CisgICAgcnVuVGVzdCg1LCAyLCAyLCBudWxsLCBBcnJheXMuYXNMaXN0KAorICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgic3VpdGUtcGFyYWxsZWwtMS54bWwiKSwKKyAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInN1aXRlLXBhcmFsbGVsLTIueG1sIikpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN1aXRlc1Nob3VsZFJ1bkluUGFyYWxsZWwyKCkgeworICAgIHJ1blRlc3QoNSwgMywgMywgbnVsbCwgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInN1aXRlLXBhcmFsbGVsLTAueG1sIikpKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uID0gIk51bWJlciBvZiB0aHJlYWRzICgyKSBpcyBsZXNzIHRoYW4gbnVtYmVyIG9mIHN1aXRlcyAoMykiKQorICBwdWJsaWMgdm9pZCBzdWl0ZXNTaG91bGRSdW5JblBhcmFsbGVsMygpIHsKKyAgICBmaW5hbCBpbnQgU1VJVEVfVEhSRUFEX1BPT0xfU0laRSA9IDI7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0U3VpdGVUaHJlYWRQb29sU2l6ZShTVUlURV9USFJFQURfUE9PTF9TSVpFKTsKKyAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KGdldFBhdGhUb1Jlc291cmNlKCJzdWl0ZS1wYXJhbGxlbC0wLnhtbCIpKSk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisKKyAgICBCYXNlVGhyZWFkVGVzdC5pbml0VGhyZWFkTG9nKCk7CisgICAgdG5nLnJ1bigpOyAvL1Nob3VsZG4ndCBub3QgZGVhZGxvY2sKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJhc2VUaHJlYWRUZXN0LmdldFRocmVhZENvdW50KCksIFNVSVRFX1RIUkVBRF9QT09MX1NJWkUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoaW50IHN1aXRlVGhyZWFkUG9vbFNpemUsIGludCBleHBlY3RlZFRocmVhZENvdW50LAorICAgICAgICBpbnQgZXhwZWN0ZWRTdWl0ZUNvdW50LCBCb29sZWFuIHJhbmRvbWl6ZVN1aXRlcywgTGlzdDxTdHJpbmc+IHBhdGhzKSB7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICB0bmcuc2V0U3VpdGVUaHJlYWRQb29sU2l6ZShzdWl0ZVRocmVhZFBvb2xTaXplKTsKKyAgICB0bmcuc2V0VGVzdFN1aXRlcyhwYXRocyk7CisgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgaWYgKG51bGwgIT0gcmFuZG9taXplU3VpdGVzKSB7CisgICAgICB0bmcuc2V0UmFuZG9taXplU3VpdGVzKHJhbmRvbWl6ZVN1aXRlcyk7CisgICAgfQorCisgICAgQmFzZVRocmVhZFRlc3QuaW5pdFRocmVhZExvZygpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmFzZVRocmVhZFRlc3QuZ2V0VGhyZWFkQ291bnQoKSwgZXhwZWN0ZWRUaHJlYWRDb3VudCwKKyAgICAgICAgIlRocmVhZCBjb3VudCBleHBlY3RlZDoiICsgZXhwZWN0ZWRUaHJlYWRDb3VudAorICAgICAgICArICIgYWN0dWFsOiIgKyBCYXNlVGhyZWFkVGVzdC5nZXRUaHJlYWRDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJhc2VUaHJlYWRUZXN0LmdldFN1aXRlc01hcCgpLmtleVNldCgpLnNpemUoKSwgZXhwZWN0ZWRTdWl0ZUNvdW50KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN1aXRlc1Nob3VsZFJ1bkluUGFyYWxsZWw0KCkgeworICAgIHJ1blRlc3QoMTAsIDUsIDUsIG51bGwsIEFycmF5cy5hc0xpc3QoCisgICAgICAgIGdldFBhdGhUb1Jlc291cmNlKCJwYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMS54bWwiKSwKKyAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInBhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLnhtbCIpLAorICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgicGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMS54bWwiKSwKKyAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInBhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLTIueG1sIikpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN1aXRlc1Nob3VsZFJ1bkluUGFyYWxsZWw1KCkgeworICAgIHJ1blRlc3QoNSwgNSwgNywgbnVsbCwgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInBhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0wLnhtbCIpKSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJOdW1iZXIgb2YgdGhyZWFkcyAoMikgaXMgbGVzcyB0aGFuIGxldmVsIG9mIHN1aXRlcyAoMykiKQorICBwdWJsaWMgdm9pZCBzdWl0ZXNTaG91bGRSdW5JblBhcmFsbGVsNigpIHsKKyAgICBydW5UZXN0KDIsIDIsIDcsIG51bGwsIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgZ2V0UGF0aFRvUmVzb3VyY2UoInBhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0wLnhtbCIpKSk7CisgIH0KKworICBAVGVzdChkZXNjcmlwdGlvbiA9ICJJZiBzdWl0ZVRocmVhZFBvb2xTaXplIGFuZCByYW5kb21pemVTdWl0ZXMgYXJlIG5vdCBzcGVjaWZpZWQiICsKKyAgCQkiIHN1aXRlcyBzaG91bGQgcnVuIGluIG9yZGVyIHNwZWNpZmllZCBpbiBYTUwiKQorICBwdWJsaWMgdm9pZCBzdWl0ZXNTaG91bGRSdW5Jbk9yZGVyKCkgeworICAgIFRlc3RMaXN0ZW5lckFkYXB0ZXIgdGxhID0gbmV3IFRlc3RMaXN0ZW5lckFkYXB0ZXIoKTsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKCk7CisgICAgdG5nLnNldFRlc3RTdWl0ZXMoQXJyYXlzLmFzTGlzdChnZXRQYXRoVG9SZXNvdXJjZSgic3VpdGUtcGFyYWxsZWwtMC54bWwiKSkpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIEJhc2VUaHJlYWRUZXN0LmluaXRUaHJlYWRMb2coKTsKKyAgICB0bmcucnVuKCk7CisKKyAgICBNYXA8U3RyaW5nLCBMb25nPiBzdWl0ZXNNYXAgPSBCYXNlVGhyZWFkVGVzdC5nZXRTdWl0ZXNNYXAoKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJhc2VUaHJlYWRUZXN0LmdldFRocmVhZENvdW50KCksIDEpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3VpdGVzTWFwLmtleVNldCgpLnNpemUoKSwgMyk7CisKKyAgICBmaW5hbCBTdHJpbmcgU1VJVEVfTkFNRV9QUkVGSVggPSAiU3VpdGUgUGFyYWxsZWwgIjsKKyAgICBpZiAoc3VpdGVzTWFwLmdldChTVUlURV9OQU1FX1BSRUZJWCArIDEpID4gc3VpdGVzTWFwLmdldChTVUlURV9OQU1FX1BSRUZJWCArIDIpKSB7CisgICAgICBBc3NlcnQuZmFpbCgiU3VpdGUgIiArIChTVUlURV9OQU1FX1BSRUZJWCArIDEpICsgIiBzaG91bGQgaGF2ZSBydW4gYmVmb3JlICIKKyAgICAgICAgICArIChTVUlURV9OQU1FX1BSRUZJWCArIDIpKTsKKyAgICB9CisgICAgQXNzZXJ0LmFzc2VydFRydWUoc3VpdGVzTWFwLmdldChTVUlURV9OQU1FX1BSRUZJWCArIDIpCisgICAgICAgICAgPD0gc3VpdGVzTWFwLmdldChTVUlURV9OQU1FX1BSRUZJWCArIDApKTsKKworICB9CisKKyAgQFRlc3QoZGVzY3JpcHRpb24gPSAiTnVtYmVyIG9mIHRocmVhZHMgKDEpIGlzIGxlc3MgdGhhbiBudW1iZXIgb2YgbGV2ZWxzIG9mIHN1aXRlcyAoMikiKQorICBwdWJsaWMgdm9pZCBzdWl0ZXNTaG91bGRSdW4xKCkgeworICAgIHJ1blRlc3QoMSwgMSwgMywgdHJ1ZSwgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgic3VpdGUtcGFyYWxsZWwtMC54bWwiKSkpOworCisvLyAgICBydW5UZXN0KDEsIDEsIDcsIHRydWUsIEFycmF5cy5hc0xpc3QoCisvLyAgICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgicGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTAueG1sIikpKTsKKy8vCisvLyAgICBydW5UZXN0KDIsIDIsIDcsIHRydWUsIEFycmF5cy5hc0xpc3QoCisvLyAgICAgICAgICBnZXRQYXRoVG9SZXNvdXJjZSgicGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTAueG1sIikpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1BhcmFsbGVsVGVzdFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvUGFyYWxsZWxUZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmM2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1BhcmFsbGVsVGVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLkxpc3RzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxUZXN0VGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlQYXJhbGxlbE5vbmUoKSB7CisgICAgdmVyaWZ5RXhwZWN0ZWQoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk5PTkUsIDEpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5UGFyYWxsZWxUZXN0cygpIHsKKyAgICB2ZXJpZnlFeHBlY3RlZChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuVEVTVFMsIDIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5UGFyYWxsZWxNZXRob2RzKCkgeworICAgIHZlcmlmeUV4cGVjdGVkKFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5NRVRIT0RTLCA0KTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeVBhcmFsbGVsQ2xhc3NlcygpIHsKKyAgICB2ZXJpZnlFeHBlY3RlZChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuQ0xBU1NFUywgMik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlQYXJhbGxlbENsYXNzZXNXaXRoRmFjdG9yeSgpIHsKKyAgICB2ZXJpZnlFeHBlY3RlZChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuSU5TVEFOQ0VTLCAyLCBQYXJhbGxlbFdpdGhGYWN0b3J5U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5Tm9uUGFyYWxsZWxDbGFzc2VzV2l0aEZhY3RvcnkoKSB7CisgICAgdmVyaWZ5RXhwZWN0ZWQoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk5PTkUsIDEsIFBhcmFsbGVsV2l0aEZhY3RvcnlTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUzEgPSAidGVzdC50aHJlYWQuVGVzdDFUZXN0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MyID0gInRlc3QudGhyZWFkLlRlc3QyVGVzdCI7CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3QoWG1sU3VpdGUgeG1sU3VpdGUsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICBYbWxUZXN0IHJlc3VsdCA9IG5ldyBYbWxUZXN0KHhtbFN1aXRlKTsKKyAgICBMaXN0PFhtbENsYXNzPiBjbGFzc2VzID0gcmVzdWx0LmdldFhtbENsYXNzZXMoKTsKKyAgICBYbWxDbGFzcyB4bWxDbGFzcyA9IG5ldyBYbWxDbGFzcyhjbGFzc05hbWUpOworICAgIGNsYXNzZXMuYWRkKHhtbENsYXNzKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHBlY3RlZChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgcGFyYWxsZWxNb2RlLCBpbnQgZXhwZWN0ZWRUaHJlYWRDb3VudCkgeworICAgIHZlcmlmeUV4cGVjdGVkKHBhcmFsbGVsTW9kZSwgZXhwZWN0ZWRUaHJlYWRDb3VudCwgQ0xBU1MxLCBDTEFTUzIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4cGVjdGVkKFhtbFN1aXRlLlBhcmFsbGVsTW9kZSBwYXJhbGxlbE1vZGUsIGludCBleHBlY3RlZFRocmVhZENvdW50LAorICAgICAgU3RyaW5nLi4uIGNsYXNzTmFtZXMpIHsKKyAgICBYbWxTdWl0ZSB4bWxTdWl0ZSA9IG5ldyBYbWxTdWl0ZSgpOworICAgIHhtbFN1aXRlLnNldE5hbWUoIlBhcmFsbGVsVGVzdFRlc3QiKTsKKyAgICB4bWxTdWl0ZS5zZXRQYXJhbGxlbChwYXJhbGxlbE1vZGUpOworICAgIGZvciAoU3RyaW5nIGNuIDogY2xhc3NOYW1lcykgeworICAgICAgY3JlYXRlVGVzdCh4bWxTdWl0ZSwgY24pOworICAgIH0KKworICAgIFRlc3RORyB0bmcgPSBuZXcgVGVzdE5HKCk7CisgICAgdG5nLnNldFZlcmJvc2UoMCk7CisgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KG5ldyBYbWxTdWl0ZVtdIHsgeG1sU3VpdGUgfSkpOworCisgICAgSGVscGVyLnJlc2V0KCk7CisKKyAgICB0bmcucnVuKCk7CisKKyAgICBMaXN0PE1hcDxMb25nLCBMb25nPj4gbWFwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoU3RyaW5nIGMgOiBjbGFzc05hbWVzKSB7CisgICAgICBtYXBzLmFkZChIZWxwZXIuZ2V0TWFwKGMpKTsKKyAgICB9OworCisgICAgTWFwPExvbmcsIExvbmc+IG1lcmdlZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBmb3IgKE1hcDxMb25nLCBMb25nPm0gOiBtYXBzKSB7CisgICAgICBtZXJnZWRNYXAucHV0QWxsKG0pOworICAgIH0KKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobWVyZ2VkTWFwLnNpemUoKSwgZXhwZWN0ZWRUaHJlYWRDb3VudCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2VxdWVudGlhbFRlc3RdICIgKyBzKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9QYXJhbGxlbFdpdGhGYWN0b3J5U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9QYXJhbGxlbFdpdGhGYWN0b3J5U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTllNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1BhcmFsbGVsV2l0aEZhY3RvcnlTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFdpdGhGYWN0b3J5U2FtcGxlVGVzdCBleHRlbmRzIEJhc2VTZXF1ZW50aWFsU2FtcGxlIHsKKyAgcHJpdmF0ZSBpbnQgbV9uOworCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIHN0YXRpYyBPYmplY3RbXVtdIGRwKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgIG5ldyBPYmplY3RbXSB7IDQyIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IDQzIH0KKyAgICB9OworICB9CisKKyAgQEZhY3RvcnkoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIFBhcmFsbGVsV2l0aEZhY3RvcnlTYW1wbGVUZXN0KGludCBuKSB7CisgICAgbV9uID0gbjsKKyAgfQorCisKKyAgcHJvdGVjdGVkIGludCBnZXROKCkgeworICAgIHJldHVybiBtX247CisgIH0KKworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkgeworICAgIGFkZElkKCJmMSAiICsgZ2V0TigpLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjIoKSB7CisgICAgYWRkSWQoImYyIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TYW1wbGUxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1NhbXBsZTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY5N2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TYW1wbGUxLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFNhbXBsZTEgZXh0ZW5kcyBCYXNlVGhyZWFkVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgczEoKSB7CisgICAgbG9nVGhyZWFkKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2FtcGxlMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TYW1wbGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjZTEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2FtcGxlMi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGUyIGV4dGVuZHMgQmFzZVRocmVhZFRlc3QgeworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYmVmb3JlKElUZXN0Q29udGV4dCBjdHgpIHsKKyAgICBsb2dTdWl0ZShjdHguZ2V0U3VpdGUoKS5nZXROYW1lKCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHMxKCkgeworICAgIGxvZ1RocmVhZChUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1NlcXVlbnRpYWxTYW1wbGUyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TZXF1ZW50aWFsU2FtcGxlMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRjNWVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TZXF1ZW50aWFsU2FtcGxlMlRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorQFRlc3Qoc2VxdWVudGlhbCA9IHRydWUpDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxTYW1wbGUyVGVzdCBleHRlbmRzIEJhc2VTZXF1ZW50aWFsU2FtcGxlIHsNCisNCisgIHB1YmxpYyB2b2lkIGYxKCkgew0KKyAgICBhZGRJZCgiU2VxdWVudGlhbFNhbXBsZTJUZXN0LmYxKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgZjIoKSB7DQorICAgIGFkZElkKCJTZXF1ZW50aWFsU2FtcGxlMlRlc3QuZjIoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBmMygpIHsNCisgICAgYWRkSWQoIlNlcXVlbnRpYWxTYW1wbGUyVGVzdC5mMygpIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsNCisgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TZXF1ZW50aWFsU2FtcGxlM1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFNhbXBsZTNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4NDRmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFNhbXBsZTNUZXN0LmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsNCisNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KKw0KK0BUZXN0KHNlcXVlbnRpYWwgPSB0cnVlKQ0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsU2FtcGxlM1Rlc3QgZXh0ZW5kcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBwdWJsaWMgdm9pZCBmMSgpIHsNCisgICAgYWRkSWQoIlNlcXVlbnRpYWxTYW1wbGUzVGVzdC5mMSgpIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIGYyKCkgew0KKyAgICBhZGRJZCgiU2VxdWVudGlhbFNhbXBsZTNUZXN0LmYyKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgZjMoKSB7DQorICAgIGFkZElkKCJTZXF1ZW50aWFsU2FtcGxlM1Rlc3QuZjMoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJmNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TZXF1ZW50aWFsU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitAVGVzdChzZXF1ZW50aWFsID0gdHJ1ZSkNCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBwdWJsaWMgdm9pZCBmMSgpIHsNCisgICAgYWRkSWQoIlNlcXVlbnRpYWxTYW1wbGVUZXN0LmYxKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgZjIoKSB7DQorICAgIGFkZElkKCJTZXF1ZW50aWFsU2FtcGxlVGVzdC5mMigpIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIGYzKCkgew0KKyAgICBhZGRJZCgiU2VxdWVudGlhbFNhbXBsZVRlc3QuZjMoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2VxdWVudGlhbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU1OWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TZXF1ZW50aWFsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsNCisNCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxUZXN0IGV4dGVuZHMgQmFzZVRlc3Qgew0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHZlcmlmeVNlcXVlbnRpYWwxKCkgew0KKyAgICB2ZXJpZnlTZXF1ZW50aWFsKDEpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHZlcmlmeVNlcXVlbnRpYWwyKCkgew0KKyAgICB2ZXJpZnlTZXF1ZW50aWFsKDIpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHZlcmlmeVNlcXVlbnRpYWwzKCkgew0KKyAgICB2ZXJpZnlTZXF1ZW50aWFsKDMpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHZlcmlmeVNpbmdsZVRocmVhZGVkMSgpIHsNCisgICAgdmVyaWZ5U2luZ2xlVGhyZWFkZWQoMSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdmVyaWZ5U2luZ2xlVGhyZWFkZWQyKCkgew0KKyAgICB2ZXJpZnlTaW5nbGVUaHJlYWRlZCgyKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB2ZXJpZnlTaW5nbGVUaHJlYWRlZDMoKSB7DQorICAgIHZlcmlmeVNpbmdsZVRocmVhZGVkKDMpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgdmVyaWZ5U2VxdWVudGlhbChpbnQgdGhyZWFkQ291bnQpIHsNCisgICAgcnVuVGVzdCh0aHJlYWRDb3VudCwNCisgICAgICAgIFNlcXVlbnRpYWxTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwNCisgICAgICAgIFNlcXVlbnRpYWxTYW1wbGUyVGVzdC5jbGFzcy5nZXROYW1lKCksDQorICAgICAgICBTZXF1ZW50aWFsU2FtcGxlM1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsNCisgIH0NCisNCisgIHB1YmxpYyB2b2lkIHZlcmlmeVNpbmdsZVRocmVhZGVkKGludCB0aHJlYWRDb3VudCkgew0KKyAgICBydW5UZXN0KHRocmVhZENvdW50LA0KKyAgICAgICAgU2luZ2xlVGhyZWFkZWRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwNCisgICAgICAgIFNpbmdsZVRocmVhZGVkU2FtcGxlMlRlc3QuY2xhc3MuZ2V0TmFtZSgpLA0KKyAgICAgICAgU2luZ2xlVGhyZWFkZWRTYW1wbGUzVGVzdC5jbGFzcy5nZXROYW1lKCkpOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoaW50IHRocmVhZENvdW50LCBTdHJpbmcuLi4gY2xhc3Nlcykgew0KKyAgICBIZWxwZXIucmVzZXQoKTsNCisNCisgICAgZm9yIChTdHJpbmcgYyA6IGNsYXNzZXMpIHsNCisgICAgICBhZGRDbGFzcyhjKTsNCisgICAgfQ0KKyAgICBzZXRQYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUuTUVUSE9EUyk7DQorICAgIHNldFRocmVhZENvdW50KHRocmVhZENvdW50KTsNCisNCisgICAgcnVuKCk7DQorDQorICAgIE1hcDxMb25nLCBMb25nPltdIG1hcHMgPSBuZXcgTWFwW10gew0KKyAgICAgICAgSGVscGVyLmdldE1hcChjbGFzc2VzWzBdKSwNCisgICAgICAgIEhlbHBlci5nZXRNYXAoY2xhc3Nlc1sxXSksDQorICAgICAgICBIZWxwZXIuZ2V0TWFwKGNsYXNzZXNbMl0pLA0KKyAgICB9Ow0KKw0KKyAgICBmb3IoTWFwIG0gOiBtYXBzKSB7DQorICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtLnNpemUoKSwgMSk7DQorICAgIH0NCisNCisgICAgbG9uZ1tdIGlkcyA9IG5ldyBsb25nW10gew0KKyAgICAgICAgICAgIG1hcHNbMF0ua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCksDQorICAgICAgICAgICAgbWFwc1sxXS5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKSwNCisgICAgICAgICAgICBtYXBzWzJdLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpLA0KKyAgICB9Ow0KKyAgICBNYXA8TG9uZywgTG9uZz4gdmVyaWZ5TWFwID0gbmV3IEhhc2hNYXA8PigpOw0KKw0KKyAgICBmb3IgKGxvbmcgaWQgOiBpZHMpIHsNCisgICAgICB2ZXJpZnlNYXAucHV0KGlkLCBpZCk7DQorICAgIH0NCisNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2ZXJpZnlNYXAuc2l6ZSgpLCB0aHJlYWRDb3VudCk7DQorDQorICAgIHBwcCgiQ09VTlQ6IiArIHRocmVhZENvdW50ICArICIgVEhSRUFEIElEJ1M6IiArIGlkc1swXSArICIgIiArIGlkc1sxXSArICIgIiArIGlkc1syXSk7DQorICB9DQorDQorICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgew0KKyAgICBpZiAoZmFsc2UpIHsNCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTZXF1ZW50aWFsVGVzdF0gIiArIHMpOw0KKyAgICB9DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2luZ2xlVGhyZWFkZWRTYW1wbGUyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TaW5nbGVUaHJlYWRlZFNhbXBsZTJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MzFiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2luZ2xlVGhyZWFkZWRTYW1wbGUyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitAVGVzdChzaW5nbGVUaHJlYWRlZCA9IHRydWUpDQorcHVibGljIGNsYXNzIFNpbmdsZVRocmVhZGVkU2FtcGxlMlRlc3QgZXh0ZW5kcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZjEoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZTJUZXN0LmYxKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIGYyKCkgew0KKyAgICBhZGRJZCgiU2luZ2xlVGhyZWFkZWRTYW1wbGUyVGVzdC5mMigpIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpKTsNCisgIH0NCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCBmMygpIHsNCisgICAgYWRkSWQoIlNpbmdsZVRocmVhZGVkU2FtcGxlMlRlc3QuZjMoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2luZ2xlVGhyZWFkZWRTYW1wbGUzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TaW5nbGVUaHJlYWRlZFNhbXBsZTNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhYTUwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU2luZ2xlVGhyZWFkZWRTYW1wbGUzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCisNCitAVGVzdChzaW5nbGVUaHJlYWRlZCA9IHRydWUpDQorcHVibGljIGNsYXNzIFNpbmdsZVRocmVhZGVkU2FtcGxlM1Rlc3QgZXh0ZW5kcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZjEoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZTNUZXN0LmYxKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgQFRlc3QgLy8gKGRlcGVuZHNPbk1ldGhvZHMgPSAiZjEiKQ0KKyAgcHVibGljIHZvaWQgZjIoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZTNUZXN0LmYyKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KKyAgQFRlc3QgLy8gKGRlcGVuZHNPbk1ldGhvZHMgPSAiZjIiKQ0KKyAgcHVibGljIHZvaWQgZjMoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZTNUZXN0LmYzKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOw0KKyAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1NpbmdsZVRocmVhZGVkU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDBkYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQorDQorQFRlc3Qoc2luZ2xlVGhyZWFkZWQgPSB0cnVlKQ0KK3B1YmxpYyBjbGFzcyBTaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlU2VxdWVudGlhbFNhbXBsZSB7DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZjEoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QuZjEoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZjIoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QuZjIoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgZjMoKSB7DQorICAgIGFkZElkKCJTaW5nbGVUaHJlYWRlZFNhbXBsZVRlc3QuZjMoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7DQorICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU3VpdGVUaHJlYWRDb3VudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvU3VpdGVUaHJlYWRDb3VudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZiZmMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9TdWl0ZVRocmVhZENvdW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7DQorDQoraW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0Ow0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7DQoraW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsNCitpbXBvcnQgb3JnLnRlc3RuZy5pbnRlcm5hbC50aHJlYWQuVGhyZWFkVXRpbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCisvKioNCisgKiBUZXN0IGZvciB0ZXN0IGxldmVsIHRocmVhZC1jb3VudC4NCisgKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRoZS5taW5kc3Rvcm1AZ21haWwuY29tIj5BbGV4IFBvcGVzY3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIFN1aXRlVGhyZWFkQ291bnRUZXN0IHsNCisgIHByaXZhdGUgU2V0PFN0cmluZz4gbV90aHJlYWRzPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigpKTsNCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsNCisgICAgbV90aHJlYWRzLmFkZChUaHJlYWRVdGlsLmN1cnJlbnRUaHJlYWRJbmZvKCkpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgew0KKyAgICBtX3RocmVhZHMuYWRkKFRocmVhZFV0aWwuY3VycmVudFRocmVhZEluZm8oKSk7DQorICB9DQorDQorICBAQWZ0ZXJDbGFzcw0KKyAgcHVibGljIHZvaWQgY2hlY2tUaHJlYWRpbmcoKSB7DQorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV90aHJlYWRzLnNpemUoKSwgMiwgIlRlc3Qgc2hvdWxkIHVzZSAyIHRocmVhZHMgKHN1aXRlIGxldmVsKSIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1Rlc3QxVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UZXN0MVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM0MGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UZXN0MVRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdDFUZXN0IGV4dGVuZHMgQmFzZVNlcXVlbnRpYWxTYW1wbGUgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxMSgpIHsKKyAgICBwcHAoImYxMSIpOworICAgIGFkZElkKCJUZXN0MVRlc3QuZjExKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjEyKCkgeworICAgIHBwcCgiZjEyIik7CisgICAgYWRkSWQoIlRlc3QxVGVzdC5mMTIoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1Rlc3QyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UZXN0MlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI5MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UZXN0MlRlc3QuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdDJUZXN0IGV4dGVuZHMgQmFzZVNlcXVlbnRpYWxTYW1wbGUgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyMSgpIHsKKyAgICBwcHAoImYyMSIpOworICAgIGFkZElkKCJUZXN0MlRlc3QuZjIxKCkiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjIyKCkgeworICAgIHBwcCgiZjIyIik7CisgICAgYWRkSWQoIlRlc3QyVGVzdC5mMjIoKSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1Rlc3RUaHJlYWRDb3VudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGVzdFRocmVhZENvdW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjRjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1Rlc3RUaHJlYWRDb3VudFRlc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIHRlc3QudGhyZWFkOw0KKw0KK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsNCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOw0KK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7DQoraW1wb3J0IG9yZy50ZXN0bmcuaW50ZXJuYWwudGhyZWFkLlRocmVhZFV0aWw7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQorLyoqDQorICogVGVzdCBmb3IgdGVzdCBsZXZlbCB0aHJlYWQtY291bnQuDQorICoNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp0aGUubWluZHN0b3JtQGdtYWlsLmNvbSI+QWxleCBQb3Blc2N1PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUZXN0VGhyZWFkQ291bnRUZXN0IHsNCisgIHByaXZhdGUgU2V0PFN0cmluZz4gbV90aHJlYWRzPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigpKTsNCisNCisgIEBUZXN0DQorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsNCisgICAgbV90aHJlYWRzLmFkZChUaHJlYWRVdGlsLmN1cnJlbnRUaHJlYWRJbmZvKCkpOw0KKyAgfQ0KKw0KKyAgQFRlc3QNCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgew0KKyAgICBtX3RocmVhZHMuYWRkKFRocmVhZFV0aWwuY3VycmVudFRocmVhZEluZm8oKSk7DQorICB9DQorDQorICBAVGVzdA0KKyAgcHVibGljIHZvaWQgdGVzdDMoKSB7DQorICAgIG1fdGhyZWFkcy5hZGQoVGhyZWFkVXRpbC5jdXJyZW50VGhyZWFkSW5mbygpKTsNCisgIH0NCisNCisgIEBBZnRlckNsYXNzDQorICBwdWJsaWMgdm9pZCBjaGVja1RocmVhZGluZygpIHsNCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtX3RocmVhZHMuc2l6ZSgpLCAzLCAiVGVzdCBzaG91bGQgdXNlIDMgdGhyZWFkcyIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RocmVhZFBvb2xTYW1wbGVCdWdUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RocmVhZFBvb2xTYW1wbGVCdWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3OTMwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNhbXBsZUJ1Z1Rlc3QuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGhyZWFkUG9vbFNhbXBsZUJ1Z1Rlc3QgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVQgPSA1MDA7CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gMSwgdGhyZWFkUG9vbFNpemUgPSA1KQorICBwdWJsaWMgdm9pZCBzaG91bGRQYXNzMSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVQpOworICB9CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gMiwgdGhyZWFkUG9vbFNpemUgPSA1KQorICBwdWJsaWMgdm9pZCBzaG91bGRQYXNzMigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVQpOworICB9CisKKyAgQFRlc3QodGltZU91dCA9IDEwLCBpbnZvY2F0aW9uQ291bnQgPSAxLCB0aHJlYWRQb29sU2l6ZSA9IDUpCisgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBUaHJlYWQuc2xlZXAoVElNRU9VVCk7CisgIH0KKworICBAVGVzdCh0aW1lT3V0ID0gMTAsIGludm9jYXRpb25Db3VudCA9IDIsIHRocmVhZFBvb2xTaXplID0gNSkKKyAgcHVibGljIHZvaWQgc2hvdWxkRmFpbDIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIFRocmVhZC5zbGVlcChUSU1FT1VUKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UaHJlYWRQb29sU2l6ZUJhc2UuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNpemVCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyMmZkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNpemVCYXNlLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CisKK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sU2l6ZUJhc2UgZXh0ZW5kcyBCYXNlVGhyZWFkVGVzdCB7CisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBsb2coZ2V0Q2xhc3MoKS5nZXROYW1lKCksICJJbml0IGxvZyBpZHMiKTsKKyAgICBpbml0VGhyZWFkTG9nKCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBsb2dUaHJlYWQoKSB7CisgICAgbG9uZyBuID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgIGxvZyhnZXRDbGFzcygpLmdldE5hbWUoKSwgIiIpOworICAgIGxvZ1RocmVhZChuKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RocmVhZFBvb2xTaXplU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UaHJlYWRQb29sU2l6ZVNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY2NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UaHJlYWRQb29sU2l6ZVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGhyZWFkUG9vbFNpemVTYW1wbGVUZXN0IHsKKyAgQFRlc3QodGhyZWFkUG9vbFNpemU9MiwgdGltZU91dD0xMDApCisgIHB1YmxpYyB2b2lkIHdpbGxQYXNzQnVnKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9ueworICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UaHJlYWRQb29sU2l6ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNpemVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyYzczNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNpemVUZXN0LmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0LnRocmVhZDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRocmVhZFBvb2xTaXplVGVzdCBleHRlbmRzIFRocmVhZFBvb2xTaXplQmFzZSB7CisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDUsIHRocmVhZFBvb2xTaXplID0gMykKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgbG9nVGhyZWFkKCk7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyJmMSJ9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgdmVyaWZ5VGhyZWFkcygzKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RocmVhZFBvb2xTaXplV2l0aFRpbWVPdXRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RocmVhZFBvb2xTaXplV2l0aFRpbWVPdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0ODBlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkUG9vbFNpemVXaXRoVGltZU91dFRlc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sU2l6ZVdpdGhUaW1lT3V0VGVzdCBleHRlbmRzIFRocmVhZFBvb2xTaXplQmFzZSB7CisKKyAgQFRlc3QoaW52b2NhdGlvbkNvdW50ID0gNSwgdGhyZWFkUG9vbFNpemUgPSAzLCB0aW1lT3V0ID0gMTAwMCkKKyAgcHVibGljIHZvaWQgZjEoKSB7CisgICAgbG9nVGhyZWFkKCk7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0geyJmMSJ9KQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgdmVyaWZ5VGhyZWFkcygzKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRocmVhZFBvb2xBbmRUaW1lT3V0U2hvdWxkRmFpbCgpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKFRocmVhZFBvb2xTaXplU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgdGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIHRsYS5nZXRGYWlsZWRUZXN0cygpLnNpemUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UaHJlYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlODdhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVGhyZWFkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0LkJhc2VUZXN0OworCitwdWJsaWMgY2xhc3MgVGhyZWFkVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICBAVGVzdChncm91cHMgPSAiYnJva2VuIiwKKyAgICAgIGRlc2NyaXB0aW9uID0gIlRoaXMgY2FuIGJlIGZpeGVkIGJ5IHVzaW5nIHNldHMgaW5zdGVhZCBvZiBsaXN0cyBpbiBEeW5hbWljR3JhcGgsIGJ1dCBtb3JlIGZhaWx1cmVzIGhhcHBlbiB0aGVuIikKKyAgcHVibGljIHZvaWQgdGltZW91dEFuZEludm9jYXRpb25Db3VudFNob3VsZEZhaWwoKSB7CisgICAgYWRkQ2xhc3MoVGhyZWFkUG9vbFNhbXBsZUJ1Z1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBydW4oKTsKKyAgICBTdHJpbmdbXSBwYXNzZWQgPSB7CisgICAgICAgICJzaG91bGRQYXNzMSIsICJzaG91bGRQYXNzMiIKKyAgICB9OworICAgIFN0cmluZ1tdIGZhaWxlZCA9IHsKKyAgICAgICAgInNob3VsZEZhaWwxIiwgInNob3VsZEZhaWwyIgorICAgIH07CisgICAgdmVyaWZ5VGVzdHMoIlBhc3NlZCIsIHBhc3NlZCwgZ2V0UGFzc2VkVGVzdHMoKSk7CisgICAgdmVyaWZ5VGVzdHMoIkZhaWxlZCIsIGZhaWxlZCwgZ2V0RmFpbGVkVGVzdHMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVHJ1ZVBhcmFsbGVsU2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC9UcnVlUGFyYWxsZWxTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4Y2VhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVHJ1ZVBhcmFsbGVsU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2UgdGVzdC50aHJlYWQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitAVGVzdAorcHVibGljIGNsYXNzIFRydWVQYXJhbGxlbFNhbXBsZVRlc3QgZXh0ZW5kcyBCYXNlVGhyZWFkVGVzdCB7CisgIHN0YXRpYyBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgIGxvZ1N0cmluZyhzKTsKKyAgICB0cnkgeworICAgICAgVGhyZWFkLnNsZWVwKHJhbmRvbS5uZXh0SW50KDEwKSk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgIFRocmVhZC55aWVsZCgpOworICAgIH0KKyAgICBsb2dTdHJpbmcocyk7CisgICAgbG9nQ3VycmVudFRocmVhZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgbTEoKSB7CisgICAgbG9nKCJtMSIpOworICB9CisKKyAgcHVibGljIHZvaWQgbTIoKSB7CisgICAgbG9nKCJtMiIpOworICB9CisKKyAgcHVibGljIHZvaWQgbTMoKSB7CisgICAgbG9nKCJtMyIpOworICB9CisKKyAgcHVibGljIHZvaWQgbTQoKSB7CisgICAgbG9nKCJtNCIpOworICB9CisKKyAgcHVibGljIHZvaWQgbTUoKSB7CisgICAgbG9nKCJtNSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RydWVQYXJhbGxlbFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvVHJ1ZVBhcmFsbGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NGM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGhyZWFkL1RydWVQYXJhbGxlbFRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIHRlc3QudGhyZWFkOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgdHJ1bHkgcnVubmluZyBtZXRob2RzIGluIHBhcmFsbGVsLiBUaGUgYmVzdCBJIGNhbiB0aGluaworICogb2YgcmlnaHQgbm93IGlzIHRvIHJ1biB0aGUgdGVzdHMgYSBmZXcgdGltZXMgaW4gYSByb3cgYW5kIHZlcmlmeSB0aGUgb3JkZXJpbmcgaXMgbmV2ZXIKKyAqIHRoZSBzYW1lLgorICovCitwdWJsaWMgY2xhc3MgVHJ1ZVBhcmFsbGVsVGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzaG91bGRSdW5JblBhcmFsbGVsKCkgeworICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSAqIDQ7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBYbWxTdWl0ZSBzID0gY3JlYXRlWG1sU3VpdGUoIlRydWVQYXJhbGxlbCIpOworICAgICAgY3JlYXRlWG1sVGVzdChzLCAiVGVzdCIsIFRydWVQYXJhbGxlbFNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICAgIHMuc2V0UGFyYWxsZWwoWG1sU3VpdGUuUGFyYWxsZWxNb2RlLk1FVEhPRFMpOworICAgICAgdG5nLnNldFhtbFN1aXRlcyhBcnJheXMuYXNMaXN0KHMpKTsKKyAgICAgIEJhc2VUaHJlYWRUZXN0LmluaXRUaHJlYWRMb2coKTsKKyAgICAgIHRuZy5ydW4oKTsKKworICAgICAgLy8gQSBzZXF1ZW50aWFsIHJlc3VsdCB3aWxsIGxvb2sgbGlrZSAibTEgbTEgbTMgbTMgbTIgbTIgbTQgbTQgbTUgbTUiLiBBIHByb3Blcmx5CisgICAgICAvLyBtdWx0aXRocmVhZGVkIHJlc3VsdCB3aWxsIGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1jb25zZWN1dGl2ZSBkaWZmZXJlbnQgcGFpcjoKKyAgICAgIC8vICJtMSBtMSBtMyBtMiBtNCBtNCBtMiBtMyBtNSBtNSIKKyAgICAgIExpc3Q8U3RyaW5nPiBzdHJpbmdzID0gVHJ1ZVBhcmFsbGVsU2FtcGxlVGVzdC5nZXRTdHJpbmdzKCk7CisgICAgICBib29sZWFuIGlpID0gaXNJbnRlcmxlYXZlZChzdHJpbmdzKTsKKyAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIHx8IGlpOworLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5ncyArICIgLT4gIiArIGlpKTsKKyAgICB9CisgICAgQXNzZXJ0LmFzc2VydFRydWUoc3VjY2VzcywgIkNvdWxkbid0IGZpbmQgYW55IGludGVybGVhdmVkIHRlc3QgbWV0aG9kIHJ1biIpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJsZWF2ZWQoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3Muc2l6ZSgpOyBpICs9IDIpIHsKKyAgICAgIGlmICghIHN0cmluZ3MuZ2V0KGkpLmVxdWFscyhzdHJpbmdzLmdldChpICsgMSkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvdGVzdG5nLnhtbCBiL3NyYy90ZXN0L2phdmEvdGVzdC90aHJlYWQvdGVzdG5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzE5ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RocmVhZC90ZXN0bmcueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+DQorPHN1aXRlIG5hbWU9IlRocmVhZCBDb3VudGVycyIgdmVyYm9zZT0iMiIgdGhyZWFkLWNvdW50PSIyIj4NCisgIDx0ZXN0IG5hbWU9IlRlc3QgbGV2ZWwgdGhyZWFkLWNvdW50IiB0aHJlYWQtY291bnQ9IjMiIHBhcmFsbGVsPSJtZXRob2RzIj4NCisgICAgPGNsYXNzZXM+DQorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlRlc3RUaHJlYWRDb3VudFRlc3QiIC8+DQorICAgIDwvY2xhc3Nlcz4NCisgIDwvdGVzdD4NCisgIDx0ZXN0IG5hbWU9IlN1aXRlIGxldmVsIHRocmVhZC1jb3VudCIgcGFyYWxsZWw9Im1ldGhvZHMiPg0KKyAgICA8Y2xhc3Nlcz4NCisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50aHJlYWQuU3VpdGVUaHJlYWRDb3VudFRlc3QiIC8+DQorICAgIDwvY2xhc3Nlcz4NCisgIDwvdGVzdD4NCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L0ludm9jYXRpb25UaW1lT3V0U2FtcGxlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvSW52b2NhdGlvblRpbWVPdXRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjOGYyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L0ludm9jYXRpb25UaW1lT3V0U2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC50aW1lb3V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgSW52b2NhdGlvblRpbWVPdXRTYW1wbGVUZXN0IHsKKworICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSA1LCBpbnZvY2F0aW9uVGltZU91dCA9IDJfMDAwKQorICBwdWJsaWMgdm9pZCBzaG91bGRQYXNzKCkgeworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMjUwKTsKKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBoYW5kbGVkKSB7CisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgIH0KKyAgfQorCisgIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDUsIGludm9jYXRpb25UaW1lT3V0ID0gMV8wMDApCisgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwoKSB7CisgICAgdHJ5IHsKKyAgICAgIFRocmVhZC5zbGVlcCgyNTApOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGhhbmRsZWQpIHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UZXN0VGltZU91dFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L1Rlc3RUaW1lT3V0U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmE1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UZXN0VGltZU91dFNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIHRlc3QudGltZW91dDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RUaW1lT3V0U2FtcGxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRpbWVvdXRUZXN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDJfMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaGFuZGxlZCkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L1RpbWVPdXRGcm9tWG1sVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dEZyb21YbWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNzNlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L1RpbWVPdXRGcm9tWG1sVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgdGVzdC50aW1lb3V0OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlN1aXRlWG1sUGFyc2VyOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbENsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbEluY2x1ZGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sVGVzdDsKKworaW1wb3J0IHRlc3QuQmFzZVRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVGltZU91dEZyb21YbWxUZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworCisgICAgcHJpdmF0ZSB2b2lkIHRpbWVPdXRUZXN0KGJvb2xlYW4gb25TdWl0ZSkgeworICAgICAgICBhZGRDbGFzcyhUZXN0VGltZU91dFNhbXBsZVRlc3QuY2xhc3MpOworICAgICAgICBpZiAob25TdWl0ZSkgeworICAgICAgICAgICAgc2V0U3VpdGVUaW1lT3V0KDFfMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldFRlc3RUaW1lT3V0KDFfMDAwKTsKKyAgICAgICAgfQorICAgICAgICBydW4oKTsKKworICAgICAgICB2ZXJpZnlQYXNzZWRUZXN0cygpOworICAgICAgICB2ZXJpZnlGYWlsZWRUZXN0cygidGltZW91dFRlc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRpbWVPdXRPblN1aXRlVGFnKCkgeworICAgICAgICB0aW1lT3V0VGVzdCh0cnVlIC8qIG9uIHN1aXRlICovKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRpbWVPdXRPblRlc3RUYWcoKSB7CisgICAgICAgIHRpbWVPdXRUZXN0KGZhbHNlIC8qIG9uIHRlc3QgKi8pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9UaW1lT3V0KCkgeworICAgICAgYWRkQ2xhc3MoVGVzdFRpbWVPdXRTYW1wbGVUZXN0LmNsYXNzKTsKKyAgICAgIHJ1bigpOworCisgICAgICB2ZXJpZnlQYXNzZWRUZXN0cygidGltZW91dFRlc3QiKTsKKyAgICAgIHZlcmlmeUZhaWxlZFRlc3RzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0d29EaWZmZXJlbnRUZXN0cygpIHsKKyAgICAgIFhtbFN1aXRlIHJlc3VsdCA9IG5ldyBYbWxTdWl0ZSgpOworICAgICAgcmVzdWx0LnNldE5hbWUoIlN1aXRlIik7CisKKyAgICAgIGNyZWF0ZVhtbFRlc3QocmVzdWx0LCAiV2l0aG91dFRpbWVPdXQiKTsKKyAgICAgIGNyZWF0ZVhtbFRlc3QocmVzdWx0LCAiV2l0aFRpbWVPdXQiKS5zZXRUaW1lT3V0KDFfMDAwKTsKKworICAgICAgc2V0U3VpdGUocmVzdWx0KTsKKyAgICAgIHJ1bigpOworCisgICAgICB2ZXJpZnlQYXNzZWRUZXN0cygidGltZW91dFRlc3QiKTsKKyAgICAgIHZlcmlmeUZhaWxlZFRlc3RzKCJ0aW1lb3V0VGVzdCIpOworICAgIH0KKworICAgIHByaXZhdGUgWG1sVGVzdCBjcmVhdGVYbWxUZXN0KFhtbFN1aXRlIHN1aXRlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBYbWxUZXN0IHJlc3VsdCA9IG5ldyBYbWxUZXN0KHN1aXRlKTsKKyAgICAgICAgcmVzdWx0LnNldE5hbWUobmFtZSk7CisgICAgICAgIExpc3Q8WG1sQ2xhc3M+IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgWG1sQ2xhc3MgY2xzID0gbmV3IFhtbENsYXNzKFRlc3RUaW1lT3V0U2FtcGxlVGVzdC5jbGFzcyk7CisgICAgICAgIGNscy5zZXRJbmNsdWRlZE1ldGhvZHMoCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBYbWxJbmNsdWRlKCJ0aW1lb3V0VGVzdCIpKSk7CisgICAgICAgIGNsYXNzZXMuYWRkKGNscyk7CisgICAgICAgIHJlc3VsdC5zZXRYbWxDbGFzc2VzKGNsYXNzZXMpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0aW1lT3V0SW5QYXJhbGxlbFRlc3RzRnJvbVhtbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgZmlsZSA9ICJzcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9pc3N1ZTU3NS54bWwiOworICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkgeworICAgICAgICBTdWl0ZVhtbFBhcnNlciBzdWl0ZVBhcnNlciA9IG5ldyBTdWl0ZVhtbFBhcnNlcigpOworICAgICAgICBYbWxTdWl0ZSBzdWl0ZSA9IHN1aXRlUGFyc2VyLnBhcnNlKGZpbGUsIHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgIHNldFN1aXRlKHN1aXRlKTsKKyAgICAgICAgcnVuKCk7CisKKyAgICAgICAgdmVyaWZ5UGFzc2VkVGVzdHMoInRpbWVvdXRTaG91bGRQYXNzIik7CisgICAgICAgIHZlcmlmeUZhaWxlZFRlc3RzKCJ0aW1lb3V0U2hvdWxkRmFpbEJ5RXhjZXB0aW9uIiwgInRpbWVvdXRTaG91bGRGYWlsQnlUaW1lT3V0Iik7CisgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dEludGVncmF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dEludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjYyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UaW1lT3V0SW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSB0ZXN0LnRpbWVvdXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IG9yZy50ZXN0bmcueG1sLlhtbFN1aXRlOworCitwdWJsaWMgY2xhc3MgVGltZU91dEludGVncmF0aW9uVGVzdCB7CisKKyAgICBAVGVzdChkZXNjcmlwdGlvbiA9ICJodHRwczovL2dpdGh1Yi5jb20vY2JldXN0L3Rlc3RuZy9pc3N1ZXMvODExIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZU91dFdoZW5QYXJhbGxlbElzVGVzdCgpIHsKKyAgICAgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsKKyAgICAgICAgdG5nLnNldFBhcmFsbGVsKFhtbFN1aXRlLlBhcmFsbGVsTW9kZS5URVNUUyk7CisgICAgICAgIHRuZy5zZXRUZXN0Q2xhc3NlcyhuZXcgQ2xhc3NbXXtUaW1lT3V0V2l0aFBhcmFsbGVsU2FtcGxlLmNsYXNzfSk7CisKKyAgICAgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgICAgICB0bmcuYWRkTGlzdGVuZXIodGxhKTsKKworICAgICAgICB0bmcucnVuKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0bGEuZ2V0RmFpbGVkVGVzdHMoKS5zaXplKCksIDEpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRTa2lwcGVkVGVzdHMoKS5zaXplKCksIDApOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRsYS5nZXRQYXNzZWRUZXN0cygpLnNpemUoKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFNhbXBsZTJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UaW1lT3V0U2FtcGxlMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWVjZGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFNhbXBsZTJUZXN0LmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSB0ZXN0LnRpbWVvdXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGVzdHMgdGltZW91dHMgc2V0IGZyb20gdGVzdG5nLnhtbAorICogQGF1dGhvciBjYmV1c3QKKyAqLworcHVibGljIGNsYXNzIFRpbWVPdXRTYW1wbGUyVGVzdCB7CisKKyAgQFRlc3QodGltZU91dCA9IDFfNTAwKQorICBwdWJsaWMgdm9pZCB0aW1lb3V0U2hvdWxkRmFpbEJ5VGltZU91dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBUaHJlYWQuc2xlZXAoMTBfMDAwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L1RpbWVPdXRTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzYTAzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L1RpbWVPdXRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSB0ZXN0LnRpbWVvdXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyB0ZXN0cyB0aW1lb3V0cworICoKKyAqIEBhdXRob3IgY2JldXN0CisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lT3V0U2FtcGxlVGVzdCB7CisKKyAgQFRlc3QodGltZU91dCA9IDVfMDAwIC8qIDUgc2Vjb25kcyAqLykKKyAgcHVibGljIHZvaWQgdGltZW91dFNob3VsZFBhc3MoKSB7CisgIH0KKworICBAVGVzdCh0aW1lT3V0ID0gNV8wMDAgLyogNSBzZWNvbmRzICovKQorICBwdWJsaWMgdm9pZCB0aW1lb3V0U2hvdWxkRmFpbEJ5RXhjZXB0aW9uKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFWENFUFRJT04gU0hPVUxEIE1BS0UgVEhJUyBNRVRIT0QgRkFJTCIpOworICB9CisKKyAgQFRlc3QodGltZU91dCA9IDFfMDAwIC8qIDEgc2Vjb25kICovKQorICBwdWJsaWMgdm9pZCB0aW1lb3V0U2hvdWxkRmFpbEJ5VGltZU91dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBUaHJlYWQuc2xlZXAoMTBfMDAwIC8qIDEwIHNlY29uZHMgKi8pOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UaW1lT3V0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ1YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIHRlc3QudGltZW91dDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgdGVzdC5CYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFRpbWVPdXRUZXN0IGV4dGVuZHMgQmFzZVRlc3QgeworICBwcml2YXRlIGZpbmFsIGxvbmcgbV9pZDsKKworICBwdWJsaWMgVGltZU91dFRlc3QoKSB7CisgICAgbV9pZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByaXZhdGVUaW1lT3V0VGVzdChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgcGFyYWxsZWwpIHsKKyAgICBhZGRDbGFzcyhUaW1lT3V0U2FtcGxlVGVzdC5jbGFzcyk7CisgICAgaWYgKHBhcmFsbGVsICE9IG51bGwpIHsKKyAgICAgIHNldFBhcmFsbGVsKHBhcmFsbGVsKTsKKyAgICB9CisgICAgcnVuKCk7CisKKyAgICB2ZXJpZnlQYXNzZWRUZXN0cygidGltZW91dFNob3VsZFBhc3MiKTsKKyAgICB2ZXJpZnlGYWlsZWRUZXN0cygidGltZW91dFNob3VsZEZhaWxCeUV4Y2VwdGlvbiIsICJ0aW1lb3V0U2hvdWxkRmFpbEJ5VGltZU91dCIpOworICB9CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInBhcmFsbGVsTW9kZXMiKQorICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0W10+IGNyZWF0ZURhdGEoKSB7CisgICAgZmluYWwgSXRlcmF0b3I8WG1sU3VpdGUuUGFyYWxsZWxNb2RlPiBwYXJhbGxlbE1vZGVzID0gQXJyYXlzLmFzTGlzdChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUudmFsdWVzKCkpLml0ZXJhdG9yKCk7CisgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxPYmplY3RbXT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBwYXJhbGxlbE1vZGVzLmhhc05leHQoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0W10gbmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXXsgcGFyYWxsZWxNb2Rlcy5uZXh0KCkgfTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIik7CisgICAgICB9CisgICAgfTsKKyAgfQorCisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gInBhcmFsbGVsTW9kZXMiKQorICBwdWJsaWMgdm9pZCB0aW1lT3V0SW5QYXJhbGxlbChYbWxTdWl0ZS5QYXJhbGxlbE1vZGUgcGFyYWxsZWxNb2RlKSB7CisgICAgcHJpdmF0ZVRpbWVPdXRUZXN0KHBhcmFsbGVsTW9kZSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0aW1lT3V0SW5Ob25QYXJhbGxlbCgpIHsKKyAgICBwcml2YXRlVGltZU91dFRlc3QobnVsbCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlJbnZvY2F0aW9uVGltZU91dCgpIHsKKyAgICBhZGRDbGFzcyhJbnZvY2F0aW9uVGltZU91dFNhbXBsZVRlc3QuY2xhc3MpOworICAgIHJ1bigpOworICAgIHZlcmlmeVBhc3NlZFRlc3RzKCJzaG91bGRQYXNzIik7CisgICAgdmVyaWZ5RmFpbGVkVGVzdHMoInNob3VsZEZhaWwiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gbV9pZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFdpdGhQYXJhbGxlbFNhbXBsZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvVGltZU91dFdpdGhQYXJhbGxlbFNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZWExODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdGltZW91dC9UaW1lT3V0V2l0aFBhcmFsbGVsU2FtcGxlLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnRpbWVvdXQ7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUaW1lT3V0V2l0aFBhcmFsbGVsU2FtcGxlIHsKKworICAgIEBUZXN0KHRpbWVPdXQgPSAxXzAwMCkKKyAgICBwdWJsaWMgdm9pZCBteVRlc3RNZXRob2QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBUaHJlYWQuc2xlZXAoMV81MDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L2lzc3VlNTc1LnhtbCBiL3NyYy90ZXN0L2phdmEvdGVzdC90aW1lb3V0L2lzc3VlNTc1LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjkxZmNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RpbWVvdXQvaXNzdWU1NzUueG1sCkBAIC0wLDAgKzEsOSBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KKworPHN1aXRlIG5hbWU9IlRlc3RORyB0ZXN0IiBwYXJhbGxlbD0idGVzdHMiPgorICAgIDx0ZXN0IG5hbWU9IlRlc3QgVGVzdE5HIiA+CisgICAgICAgIDxjbGFzc2VzPgorICAgICAgICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGltZW91dC5UaW1lT3V0U2FtcGxlVGVzdCIgLz4KKyAgICAgICAgPC9jbGFzc2VzPgorICAgIDwvdGVzdD4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9BLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzgyZWIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9BLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFzc2VydHMuU29mdEFzc2VydDsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBBIHsKKy8vICBwcml2YXRlIEZsZXhpYmxlQXNzZXJ0IG1fYXNzZXJ0ID0gbmV3IEZsZXhpYmxlQXNzZXJ0KCk7CisgIHByaXZhdGUgU29mdEFzc2VydCBtX2Fzc2VydCA9IG5ldyBTb2Z0QXNzZXJ0KCk7CisvLyAgcHJpdmF0ZSBMb2dnaW5nQXNzZXJ0IG1fYXNzZXJ0ID0gbmV3IExvZ2dpbmdBc3NlcnQoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICBtX2Fzc2VydC5hc3NlcnRUcnVlKHRydWUsICJ0ZXN0MSgpIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICBtX2Fzc2VydC5hc3NlcnRUcnVlKHRydWUsICJ0ZXN0MigpIik7CisgIH0KKworLy8gIEBBZnRlckNsYXNzCisvLyAgcHVibGljIHZvaWQgYWMoKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RzIHJ1biBpbiB0aGlzIGNsYXNzOiIgKyBtX2Fzc2VydC5nZXRNZXNzYWdlcygpKTsKKy8vICB9CisKKyAgcHVibGljIHZvaWQgbXVsdGlwbGUoKSB7CisgICAgbV9hc3NlcnQuYXNzZXJ0VHJ1ZSh0cnVlLCAiU3VjY2VzcyAxIik7CisgICAgbV9hc3NlcnQuYXNzZXJ0VHJ1ZSh0cnVlLCAiU3VjY2VzcyAyIik7CisgICAgbV9hc3NlcnQuYXNzZXJ0VHJ1ZShmYWxzZSwgIkZhaWx1cmUgMSIpOworICAgIG1fYXNzZXJ0LmFzc2VydFRydWUodHJ1ZSwgIlN1Y2Nlc3MgMyIpOworICAgIG1fYXNzZXJ0LmFzc2VydFRydWUoZmFsc2UsICJGYWlsdXJlIDIiKTsKKyAgICBtX2Fzc2VydC5hc3NlcnRBbGwoKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQUEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQUEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTJhYjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9BQS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChzZXF1ZW50aWFsID0gdHJ1ZSkKK3B1YmxpYyBjbGFzcyBBQSB7CisgIHByaXZhdGUgaW50IG1fbjsKKworICBwdWJsaWMgQUEoKSB7fQorCisgIHB1YmxpYyBBQShpbnQgbikgeworICAgIG1fbiA9IG47CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCIgW0FBKCIgKyBtX24gKyAiKSB0aHJlYWQ6IiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdICIgKyBzKTsKKyAgfQorCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7IDQyIH0sCisgICAgfTsKKyAgfQorCisvLyAgQEJlZm9yZUNsYXNzCisvLyAgcHVibGljIHZvaWQgYmMoKSB7CisvLyAgICBsb2coImJlZm9yZUNsYXNzIik7CisvLyAgfQorLy8KKy8vICBAQWZ0ZXJDbGFzcworLy8gIHB1YmxpYyB2b2lkIGFjKCkgeworLy8gICAgbG9nKCJhZnRlckNsYXNzIik7CisvLyAgfQorCisgIEBGYWN0b3J5CisgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBBKCksIG5ldyBBQSgpIH07CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhYXRlc3QxKCkgeworICAgIGxvZygiYWF0ZXN0MSIpOworICB9CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9ICJhYXRlc3QxIikKKyAgcHVibGljIHZvaWQgYWF0ZXN0MigpIHsKKyAgICBsb2coImFhdGVzdDIiKTsKKyAgfQorCisvLyAgQFRlc3QocHJpb3JpdHkgPSAzKQorICBwdWJsaWMgdm9pZCBhdGVzdDMoKSB7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgeworICAgIHJldHVybiAiVGhpcyBpcyB0ZXN0IEEiOworICB9CisKKy8vICBAVGVzdChncm91cHMgPSAibXl0ZXN0IiwgZGVwZW5kc09uTWV0aG9kcyA9ICJnIikKKy8vICBwdWJsaWMgdm9pZCBmKCkgeworLy8gIH0KKy8vCisvLworLy8gIEBBZnRlck1ldGhvZAorLy8gIHB1YmxpYyB2b2lkIGFmdGVyKCkgeworLy8gIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9BRmFjdG9yeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9BRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmE1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0FGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEFGYWN0b3J5IHsKKyAgQEZhY3RvcnkKKyAgcHVibGljIE9iamVjdFtdIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IEEoKSwgbmV3IEFBKCkgfTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0Fubm90YXRpb25UcmFuc2Zvcm1lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9Bbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQ1ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9Bbm5vdGF0aW9uVHJhbnNmb3JtZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5JQW5ub3RhdGlvblRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0UmVzdWx0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuSVRlc3RBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRyYW5zZm9ybWVyCisgIGltcGxlbWVudHMgSUFubm90YXRpb25UcmFuc2Zvcm1lciwgSVRlc3RMaXN0ZW5lcgoreworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oSVRlc3RBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHRlc3RDbGFzcywKKyAgICAgIENvbnN0cnVjdG9yIHRlc3RDb25zdHJ1Y3RvciwgTWV0aG9kIHRlc3RNZXRob2QpCisgIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkZpbmlzaChJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU3RhcnQoSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0Fzc2VydEVxdWFsc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQXNzZXJ0RXF1YWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWJlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0Fzc2VydEVxdWFsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQXNzZXJ0RXF1YWxzVGVzdCB7CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWyIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSAiICsgcyk7CisgIH0KKworICBAVGVzdCh0aHJlYWRQb29sU2l6ZSA9IDMsIGludm9jYXRpb25Db3VudCA9IDYpCisgIHB1YmxpYyB2b2lkIGYxKCkgeworICAgIGxvZygic3RhcnQiKTsKKyAgICB0cnkgeworICAgICAgaW50IHNsZWVwVGltZSA9IG5ldyBSYW5kb20oKS5uZXh0SW50KDUwMCk7CisgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBUaW1lKTsKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2coIiAgKioqIElOVEVSUlVQVEVEIik7CisgICAgfQorICAgIGxvZygiZW5kIik7CisgIH0KKworICBAVGVzdCh0aHJlYWRQb29sU2l6ZSA9IDEwLCBpbnZvY2F0aW9uQ291bnQgPSAxMDAwMCkKKyAgcHVibGljIHZvaWQgdmVyaWZ5TWV0aG9kSXNUaHJlYWRTYWZlKCkgeworLy8gICAgZm9vKCk7CisgIH0KKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInZlcmlmeU1ldGhvZElzVGhyZWFkU2FmZSIpCisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBub3RoaW5nIHdhcyBicm9rZW4KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBTZXQgc2V0MSA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgU2V0IHNldDIgPSBuZXcgSGFzaFNldCgpOworCisgICAgc2V0MS5hZGQoNSk7CisgICAgc2V0Mi5hZGQoNSk7CisKKyAgICBzZXQxLmFkZCg2KTsKKyAgICBzZXQyLmFkZCg2KTsKKworICAgIHNldDEuYWRkKDEpOworICAgIHNldDIuYWRkKDEpOworCisgICAgc2V0MS5hZGQoOSk7CisgICAgc2V0Mi5hZGQoOSk7CisKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldDEgaXM6IiArIHNldDEudG9TdHJpbmcoKSk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXQyIGlzOiIgKyBzZXQyLnRvU3RyaW5nKCkpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJpcyBzZXQxIGVxdWFscyBzZXQyIDoiICsgc2V0MS5lcXVhbHMoc2V0MikpOworCisgICAgdHJ5IHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2V0MSwgc2V0MiwgInNldDEgbXVzdCBlcXVhbHMgd2l0aCBzZXQyIik7CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlZTE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQyB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEcgPSAiZ3JvdXAiOworCisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBibSgpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkIuYm0iKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGJ0ZXN0MSgpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkIuYnRlc3QxIik7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9CTGlzdGVuZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwNDY4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworCitwdWJsaWMgY2xhc3MgQkxpc3RlbmVyIGV4dGVuZHMgVGVzdExpc3RlbmVyQWRhcHRlciB7CisgIHB1YmxpYyBCTGlzdGVuZXIoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJCTGlzdGVuZXIgY3JlYXRlZCIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFN1Y2Nlc3MoSVRlc3RSZXN1bHQgdHIpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MiKTsKKyAgICBzdXBlci5vblRlc3RTdWNjZXNzKHRyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHRyKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIik7CisgICAgc3VwZXIub25UZXN0RmFpbHVyZSh0cik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9CYXNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFjZGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9CYXNlLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCitwdWJsaWMgY2xhc3MgQmFzZSB7CisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgYm0oKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9CZWZvcmVHcm91cFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQmVmb3JlR3JvdXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkYTJhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQmVmb3JlR3JvdXBUZXN0LmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RDb250ZXh0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlR3JvdXBzOworCitwdWJsaWMgY2xhc3MgQmVmb3JlR3JvdXBUZXN0IHsKKworLy8gIExvZ2dlciBsID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5nZXRDbGFzcygpKTsKKworICBAQmVmb3JlR3JvdXBzKGdyb3VwcyA9IHsgIk5ld1VzZXIiIH0sIHZhbHVlID0geyAiTmV3VXNlciIgfSkKKyAgcHVibGljIHZvaWQgcHJlTmV3VXNlcihJVGVzdENvbnRleHQgaXRjKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJCRUZPUkVHUk9VUFMgcGVyZnJvbWluZyBwcmUgZ3JvdXBzIGluaXQiKTsKKy8vICAgIG1faW5qID0gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IEpVbml0TW9kdWxlKCksIG5ldyBSZXF1ZXN0TW9kdWxlKCksCisvLyAgICAgICAgbmV3IEdlbmVyaWNNb2R1bGUoKSwgbmV3IFNlY3VyaXR5TW9kdWxlKCkpOworLy8gICAgaXRjLnNldEF0dHJpYnV0ZSgiaW5qZWN0b3IiLCBtX2luaik7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0MuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNGQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0MuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQyB7CisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgY20oKSB7CisvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkMuY20iKTsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJkYXRhIikKKyAgcHVibGljIHZvaWQgYyhTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYygiICsgcyArICIpIik7CisgIH0KKworICBARGF0YVByb3ZpZGVyKG5hbWUgPSAiZGF0YSIpCisgIHN0YXRpYyBwdWJsaWMgT2JqZWN0W11bXSBkYXRhKCkgeworICAgIHJldHVybiBuZXcgT2JqZWN0W11bXSB7CisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJGb28iIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7ICJCYXIiIH0sCisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9DaGlsZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQ2hpbGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYTcwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQ2hpbGRUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDaGlsZFRlc3QgZXh0ZW5kcyBQYXJlbnRUZXN0IHsKKworICBAQ29uZmlndXJhdGlvbihiZWZvcmVUZXN0TWV0aG9kID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgYnRtMigpIHsKKyAgICBwcHAoIkNISUxEIEJFRk9SRSBURVNUIik7CisgIH0KKworICBAQ29uZmlndXJhdGlvbihhZnRlclRlc3RNZXRob2QgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhdG0yKCkgeworICAgIHBwcCgiQ0hJTEQgQUZURVIgVEVTVCIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHQxKCkgeworICAgIHBwcCgiVEVTVCBDSElMRCIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbUGFyZW50XSAiICsgc3RyaW5nKTsKKyAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9Db25jcmV0ZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQ29uY3JldGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvQ29uY3JldGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb25jcmV0ZVRlc3QgZXh0ZW5kcyBGaXh0dXJhYmxlIHsKKyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdD10cnVlLCBhZnRlckdyb3Vwcz0iZml4dHVyZSIpCisgIHB1YmxpYyB2b2lkIGJlZm9yZUZpeHR1cmUoKSB7CisgICAgcHBwKCJCRUZPUkUiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJmaXh0dXJlIikKKyAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICBwcHAoIlRFU1QiKTsKKyAgfQorCisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltDb25jcmV0ZVRlc3RdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9EYXRhRHJpdmVuVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9EYXRhRHJpdmVuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGRhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0RhdGFEcml2ZW5UZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisKK3B1YmxpYyBjbGFzcyBEYXRhRHJpdmVuVGVzdCB7CisKKyAgQERhdGFQcm92aWRlcihuYW1lID0gInByb3ZpZGVyIikKKyAgcHVibGljIE9iamVjdFtdW10gY3JlYXRlRGF0YSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgIExpc3Q8T2JqZWN0PiB2UmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcC5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoImM6L3QvZGF0YS5wcm9wZXJ0aWVzIikpKTsKKyAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7CisgICAgICB2UmVzdWx0LmFkZChlLm5leHRFbGVtZW50KCkpOworICAgIH0KKworICAgIE9iamVjdFtdW10gcmVzdWx0ID0gbmV3IE9iamVjdFt2UmVzdWx0LnNpemUoKV1bMV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKyAgICAgIHJlc3VsdFtpXSA9IG5ldyBPYmplY3RbXSB7IHZSZXN1bHQuZ2V0KGkpIH07CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJwcm92aWRlciIpCisgIHB1YmxpYyB2b2lkIGZvbyhpbnQgbikgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG4gPiAwKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0V4cG9uZW50VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9FeHBvbmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9FeHBvbmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3Qoc3VpdGVOYW1lID0gIkV4cG9uZW50IHN1aXRlIiwgdGVzdE5hbWUgPSAiRXhwb25lbnQgdGVzdCIpCitwdWJsaWMgY2xhc3MgRXhwb25lbnRUZXN0IHsKKworICAgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJyYW5kb20iKQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdlbmVyYXRlUmFuZG9tRXhwcygpIHsKKyAgICAgIC8vIFRoaXMgYXJyYXkgc2hvdWxkIGJlIGdlbmVyYXRlZCB3aXRoIHJhbmRvbSBudW1iZXJzCisgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAwLjAsIE1hdGguZXhwKDApIH0sCisgICAgICAgIG5ldyBPYmplY3RbXSB7IDEuMCwgTWF0aC5leHAoMSkgfSwKKyAgICAgICAgbmV3IE9iamVjdFtdIHsgMi4wLCBNYXRoLmV4cCgyKSB9LAorICAgICAgfTsKKyAgICB9CisKKyAgICBAQmVmb3JlTWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICBwcHAoIkJFRk9SRSBNRVRIT0QiKTsKKyAgICB9CisKKyAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAicmFuZG9tIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb25lbnQoZG91YmxlIGV4cG9uZW50LCBkb3VibGUgZXhwZWN0ZWQpIHsKKyAgICAgIHBwcCgiQ09NUEFSSU5HICIgKyBteUV4cEZ1bmN0aW9uKGV4cG9uZW50KSArICIgQU5EICIgKyBleHBlY3RlZCk7CisgICAgICBhc3NlcnRFcXVhbHMobXlFeHBGdW5jdGlvbihleHBvbmVudCksIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRXhwb25lbnRUZXN0XSAiICsgcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBkb3VibGUgbXlFeHBGdW5jdGlvbihkb3VibGUgZXhwb25lbnQpIHsKKyAgICAgIHJldHVybiBNYXRoLmV4cChleHBvbmVudCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0ZpeHR1cmFibGUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvRml4dHVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmNkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0ZpeHR1cmFibGUuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Db25maWd1cmF0aW9uOworCitwdWJsaWMgY2xhc3MgRml4dHVyYWJsZSB7CisgIEBDb25maWd1cmF0aW9uKGJlZm9yZVRlc3Q9dHJ1ZSwgZ3JvdXBzPSJmaXh0dXJlIikKKyAgcHVibGljIHZvaWQgc2V0dXBGaXh0dXJlKCkgeworICAgIHBwcCgiU0VUVVAiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbRml4dHVyYWJsZV0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0lnbm9yZVVudGlsLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL0lnbm9yZVVudGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMzRmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvSWdub3JlVW50aWwuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7TUVUSE9ELCBUWVBFLCBDT05TVFJVQ1RPUn0pCitwdWJsaWMgQGludGVyZmFjZSBJZ25vcmVVbnRpbCB7CisKKyAgLyoqCisgICAqIEZvcm1hdDogIGhobW0KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdGltZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9QYXJhbVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjOGUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5EYXRhUHJvdmlkZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgUGFyYW1UZXN0IHsKKworICBAVGVzdChkYXRhUHJvdmlkZXI9ImRwIikKKyAgcHVibGljIHZvaWQgZihTdHJpbmcgcywgaW50IG4pIHsKKy8vICAgIGlmICgiQWxvaXMiLmVxdWFscyhzKSkgYXNzZXJ0IGZhbHNlOworICAgIFJlcG9ydGVyLmxvZygiQ0FMTCAiICsgbik7CisgICAgcHBwKCJURVNUIDogIiArIHMpOworICB9CisKKyAgQERhdGFQcm92aWRlcihuYW1lPSJkcCIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geworICAgICAgICBuZXcgT2JqZWN0W10geyAiQ2VkcmljIiwgMzZ9LAorICAgICAgICBuZXcgT2JqZWN0W10geyJBbG9pcyIsIDM1fSwKKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLmVyci5wcmludGxuKCJbUGFyYW1UZXN0XSAiICsgc3RyaW5nKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1BhcmVudFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUGFyZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjAwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1BhcmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFBhcmVudFRlc3QgeworCisgIEBDb25maWd1cmF0aW9uKGJlZm9yZVRlc3RNZXRob2QgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBidG0xKCkgeworICAgIHBwcCgiUEFSRU5UIEJFRk9SRSBURVNUIik7CisgIH0KKworICBAQ29uZmlndXJhdGlvbihhZnRlclRlc3RNZXRob2QgPSB0cnVlKQorICBwdWJsaWMgdm9pZCBhdG0xKCkgeworICAgIHBwcCgiUEFSRU5UIEFGVEVSIFRFU1QiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHQxKCkgeworICAgIHBwcCgiVEVTVCBQQVJFTlQiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1BhcmVudF0gIiArIHN0cmluZyk7CisgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUmVnaXN0ZXJDb21tYW5kVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9SZWdpc3RlckNvbW1hbmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlM2ZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUmVnaXN0ZXJDb21tYW5kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworQFRlc3QoZ3JvdXBzID0geyAiTmV3VXNlciIgfSkKK3B1YmxpYyBjbGFzcyBSZWdpc3RlckNvbW1hbmRUZXN0IHsKKworLy8gIExvZ2dlciBsID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5nZXRDbGFzcygpKTsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmVmb3JlQ2xhc3MoSVRlc3RDb250ZXh0IGl0YykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQkVGT1JFQ0xBU1MgZ2V0dGluZyBpbmplY3RvciBmcm9tIGNvbnRleHQiKTsKKy8vICAgIG1faW5qID0gKEluamVjdG9yKSBpdGMuZ2V0QXR0cmlidXRlKCJpbmplY3RvciIpOworLy8gICAgbV9pbmouaW5qZWN0TWVtYmVycyh0aGlzKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoSVRlc3RDb250ZXh0IGl0YykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNURVhFQ1VURSBkbyBzb210aGluZyIpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUmV0cnlBbmFseXplci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9SZXRyeUFuYWx5emVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NDEwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvUmV0cnlBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLklSZXRyeUFuYWx5emVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBSZXRyeUFuYWx5emVyIGltcGxlbWVudHMgSVJldHJ5QW5hbHl6ZXIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiByZXRyeShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJldHJ5KCkiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1N0YXRpY0luaXRpYWxpemVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9TdGF0aWNJbml0aWFsaXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVjOThkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9TdGF0aWNJbml0aWFsaXplclRlc3QuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdAorcHVibGljIGNsYXNzIFN0YXRpY0luaXRpYWxpemVyVGVzdCB7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9vKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lKCkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIioqKiogdGVzdE1lICoqKioiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvbygpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGQUlMSU5HIik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvU3ViLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1N1Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NTY2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1N1Yi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChncm91cHMgPSB7InN1YiJ9KQorcHVibGljIGNsYXNzIFN1YiBleHRlbmRzIEJhc2UgeworICBib29sZWFuIG1fYmVmb3JlVGVzdDsKKyAgYm9vbGVhbiBtX2FmdGVyVGVzdDsKKworICAgIEBDb25maWd1cmF0aW9uKGJlZm9yZVRlc3RDbGFzcyA9IHRydWUpCisgICAgcHVibGljIHZvaWQgc3ViU2V0dXAoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3ViIGJlZm9yZSBjbGFzcyIpOworICAgIH0KKworICAgIEBDb25maWd1cmF0aW9uKGFmdGVyVGVzdENsYXNzID0gdHJ1ZSkKKyAgICBwdWJsaWMgdm9pZCBzdWJUZWFyZG93bigpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdWIgYWZ0ZXIgY2xhc3MiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdWJUZXN0KCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJzdWIgdGVzdCIpOworICAgIH0KKworICAgIEBDb25maWd1cmF0aW9uKGFmdGVyU3VpdGUgPSB0cnVlKQorICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1fYmVmb3JlVGVzdCk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtX2FmdGVyVGVzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0MC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0MC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDY0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3QwLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0MCB7CisKKyAgQENvbmZpZ3VyYXRpb24oYmVmb3JlVGVzdCA9IHRydWUpCisgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2V0dXAiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9IHsgIkcwIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdDAudGVzdCIpOworICB9CisKKyAgQENvbmZpZ3VyYXRpb24oYWZ0ZXJUZXN0ID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZWFyRG93biIpOworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3QxLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3QxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlY2Q2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdDEuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitAVGVzdChkZXBlbmRzT25Hcm91cHMgPSB7ICJHMCIgfSkKK3B1YmxpYyBjbGFzcyBUZXN0MSB7CisKKyAgICAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0MS50ZXN0Iik7CisgICAgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0QS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0QS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MThhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RBLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdEEgeworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyB2b2lkIGluc2VydEEoKSB7CisgICAgICAgIC8vIEluc2VydHMgYW4gZW50aXR5ICdBJy4gVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLgorICAgICAgICAvLyBBZnRlciB0aGlzLCB0aGUgZW50aXR5ICdBJyBpcyB0aGUgZmlyc3Qgcm93IG9uIHRoZSB0YWJsZS4KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBKCkgeworICAgICAgICAvLyBDaGVja3MgdGhhdCAnQScgaXMgdGhlIGZpcnN0IHJvdyBvbiB0aGUgdGFibGUsIGFuZCBsb2FkcyBpdC4KKyAgICB9CisKKyAgICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3RHZXRBIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld0FfRGV0YWlsczEoKSB7CisgICAgICAgIC8vIExvYWRzIHRoZSBmaXJzdCByb3cgKGFzc3VtZWQgQSkgYW5kIGNoZWNrcyBzb21lIGRldGFpbHMKKyAgICB9CisKKyAgICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3RHZXRBIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld0FfRGV0YWlsczIoKSB7CisgICAgICAgIC8vIExvYWRzIHRoZSBmaXJzdCByb3cgKGFzc3VtZWQgQSkgYW5kIGNoZWNrcyBzb21lIGRldGFpbHMKKyAgICB9CisKKyAgICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3RHZXRBIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld0FfRGV0YWlsczMoKSB7CisgICAgICAgIC8vIExvYWRzIHRoZSBmaXJzdCByb3cgKGFzc3VtZWQgQSkgYW5kIGNoZWNrcyBzb21lIGRldGFpbHMKKyAgICB9CisKKyAgICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gInRlc3RHZXRBIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld0FfRGV0YWlsczQoKSB7CisgICAgICAgIC8vIExvYWRzIHRoZSBmaXJzdCByb3cgKGFzc3VtZWQgQSkgYW5kIGNoZWNrcyBzb21lIGRldGFpbHMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RCLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZGIzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdEIuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIHRlc3QudG1wOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0QiB7CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QigpIHsKKyAgICAgICAgLy8gSW5zZXJ0cyBhbiBlbnRpdHkgJ0InLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uCisgICAgICAgIC8vIEFmdGVyIHRoaXMsIHRoZSBlbnRpdHkgJ0InIGlzIHRoZSBmaXJzdCByb3cgb24gdGhlIHRhYmxlLgorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEIoKSB7CisgICAgICAgIC8vIENoZWNrcyB0aGF0ICdCJyBpcyB0aGUgZmlyc3Qgcm93IG9uIHRoZSB0YWJsZSwgYW5kIGxvYWRzIGl0LgorICAgIH0KKworICAgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdEdldEIiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3Ql9EZXRhaWxzMSgpIHsKKyAgICAgICAgLy8gTG9hZHMgdGhlIGZpcnN0IHJvdyAoYXNzdW1lZCBCKSBhbmQgY2hlY2tzIHNvbWUgZGV0YWlscworICAgIH0KKworICAgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdEdldEIiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3Ql9EZXRhaWxzMigpIHsKKyAgICAgICAgLy8gTG9hZHMgdGhlIGZpcnN0IHJvdyAoYXNzdW1lZCBCKSBhbmQgY2hlY2tzIHNvbWUgZGV0YWlscworICAgIH0KKworICAgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdEdldEIiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3Ql9EZXRhaWxzMygpIHsKKyAgICAgICAgLy8gTG9hZHMgdGhlIGZpcnN0IHJvdyAoYXNzdW1lZCBCKSBhbmQgY2hlY2tzIHNvbWUgZGV0YWlscworICAgIH0KKworICAgIEBUZXN0KGRlcGVuZHNPbk1ldGhvZHMgPSAidGVzdEdldEIiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3Ql9EZXRhaWxzNCgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdENhc2VGYWN0b3J5LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RDYXNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODY0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RDYXNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkZhY3Rvcnk7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdENhc2VGYWN0b3J5IHsKKyAgY2xhc3MgTXlUZXN0Q2xhc3MgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKKyAgICB9CisgIH0KKworICBARmFjdG9yeQorICBwdWJsaWMgT2JqZWN0W10gY3JlYXRlVGVzdENhc2VzKCkgeworICAgIE9iamVjdFtdIHRlc3RDYXNlcyA9IG5ldyBPYmplY3RbMV07CisgICAgdGVzdENhc2VzWzBdID0gbmV3IE15VGVzdENsYXNzKCkgeworICAgIH07CisgICAgcmV0dXJuIHRlc3RDYXNlczsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdEZpeHR1cmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdEZpeHR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkyZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0Rml4dHVyZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkNvbmZpZ3VyYXRpb247CisKK3B1YmxpYyBjbGFzcyBUZXN0Rml4dHVyZSB7CisKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2xvYmFsQ2FsbFNlcXVlbmNlID0gMDsKKworICBwdWJsaWMgc3RhdGljIGludCBwcmludEdsb2JhbENhbGxTZXF1ZW5jZShTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgIGdsb2JhbENhbGxTZXF1ZW5jZSsrOworICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKioqICIgKyBtZXRob2ROYW1lICsgIjogZ2xvYmFsQ2FsbFNlcXVlbmNlPSIgKyBnbG9iYWxDYWxsU2VxdWVuY2UpOworICAgIHJldHVybiBnbG9iYWxDYWxsU2VxdWVuY2U7CisgIH0KKworICBwdWJsaWMgaW50IGZpeHR1cmVCZWZvcmVUZXN0Q2FsbFNlcXVlbmNlOworCisgIEBDb25maWd1cmF0aW9uKGJlZm9yZVRlc3Q9dHJ1ZSwgZ3JvdXBzPSJmaXh0dXJlIikKKyAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpIHsKKyAgICBmaXh0dXJlQmVmb3JlVGVzdENhbGxTZXF1ZW5jZSA9IHByaW50R2xvYmFsQ2FsbFNlcXVlbmNlKCJUZXN0Rml4dHVyZS5iZWZvcmVUZXN0Iik7CisgIH0KKworICBwdWJsaWMgaW50IGdldFNvbWVSYW5kb21WYWx1ZSgpIHsKKyAgICByZXR1cm4gMjA7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0TkdCdWcuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdE5HQnVnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNjBlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGVzdE5HQnVnLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuUmVwb3J0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE5HQnVnIHsKKy8vICBAQ29uZmlndXJhdGlvbihiZWZvcmVUZXN0TWV0aG9kID0gdHJ1ZSkKKyAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICBwcHAoIkJhc2UuaW5pdCgpIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICBSZXBvcnRlci5sb2coIkNoaWxkLnRlc3QxIik7CisgIH0KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgIFJlcG9ydGVyLmxvZygiQ2hpbGQudGVzdDIiKTsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICJhIikKKyAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgUmVwb3J0ZXIubG9nKCJDaGlsZC50ZXN0MyIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBwcChTdHJpbmcgc3RyaW5nKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVGVzdE5HQnVnXSAiICsgc3RyaW5nKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0X1Rlc3RMaXN0ZW5lckFwcGVuZGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1Rlc3RfVGVzdExpc3RlbmVyQXBwZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJmYWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UZXN0X1Rlc3RMaXN0ZW5lckFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RfVGVzdExpc3RlbmVyQXBwZW5kZXIgeworCisgIEBEYXRhUHJvdmlkZXIobmFtZSA9ICJ0ZXN0MSIpCisgIHB1YmxpYyBPYmplY3RbXVtdIGNyZWF0ZURhdGExKCkgeworLy8gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZW50aW9uYWxseSB0aHJvd24gZXhjZXB0aW9uIik7CisgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsgeyAiQ2VkcmljIiwgMzZ9LCB7IkFubmUiLCAzN30sIH07CisgIH0KKworICBAVGVzdChkYXRhUHJvdmlkZXIgPSAidGVzdDEiKQorICBwdWJsaWMgdm9pZCB2ZXJpZnlEYXRhMShTdHJpbmcgbjEsIEludGVnZXIgbjIpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuMSArICIgIiArIG4yKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9UaW1lQm9tYlRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGltZUJvbWJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZDI3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVGltZUJvbWJUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSB0ZXN0LnRtcDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKK3B1YmxpYyBjbGFzcyBUaW1lQm9tYlRlc3QgeworCisgIEBJZ25vcmVVbnRpbCh0aW1lID0gIjEwMjIiKQorICBAVGVzdAorICBwdWJsaWMgdm9pZCB0aW1lQm9tYigpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICBNZXRob2QgbSA9IFRpbWVCb21iVGVzdC5jbGFzcy5nZXRNZXRob2QoInRpbWVCb21iIiwgbmV3IENsYXNzWzBdKTsKKyAgICBJZ25vcmVVbnRpbCB0ID0gbS5nZXRBbm5vdGF0aW9uKElnbm9yZVVudGlsLmNsYXNzKTsKKyAgICBsb25nIG5vdyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7CisgICAgbG9uZyBsID0gcGFyc2VUaW1lKHQudGltZSgpKTsKKyAgICBwcHAoIklHTk9SRToiICsgKG5vdyA8IGwpKTsKKyAgfQorCisgIHByaXZhdGUgbG9uZyBwYXJzZVRpbWUoU3RyaW5nIHN0cmluZykgeworICAgIGludCBob3VyID0gSW50ZWdlci5wYXJzZUludChzdHJpbmcuc3Vic3RyaW5nKDAsIDIpKTsKKyAgICBpbnQgbWludXRlID0gSW50ZWdlci5wYXJzZUludChzdHJpbmcuc3Vic3RyaW5nKDIpKTsKKyAgICBDYWxlbmRhciByZXN1bHQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgIHJlc3VsdC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpOworICAgIHJlc3VsdC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW51dGUpOworCisgICAgcmV0dXJuIHJlc3VsdC5nZXRUaW1lSW5NaWxsaXMoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcHAoU3RyaW5nIHN0cmluZykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1RpbWVCb21iVGVzdF0gIiArIHN0cmluZyk7CisgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVG1wLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1RtcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Nzc1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL1RtcC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitwdWJsaWMgY2xhc3MgVG1wIHsKKworICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSAxMCwgdGhyZWFkUG9vbFNpemUgPSA1KQorICBwdWJsaWMgdm9pZCBmKCkgeworICAgIHBwcCgiU1RBUlQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgICAgdHJ5IHsKKyAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworICAgICAgVGhyZWFkLnNsZWVwKE1hdGguYWJzKHIubmV4dEludCgpICUgMzAwKSk7CisgICAgfQorICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBoYW5kbGVkKSB7CisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgaGFuZGxlZC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgcHBwKCJFTkQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHBwKFN0cmluZyBzdHJpbmcpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltUbXBdICIgKyBzdHJpbmcpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVG4uamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvVG4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEzMGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9Ubi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgdGVzdC50bXA7CisKK2ltcG9ydCBvcmcudGVzdG5nLlJlcG9ydGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUbiB7CisgIEBUZXN0IChncm91cHMgPSB7ImcxIn0pCisgIHB1YmxpYyB2b2lkIG0xKCkgeworICBTeXN0ZW0ub3V0LnByaW50bG4oIjEiKTsKKyB9CisKKyBAVGVzdCAoZ3JvdXBzID0geyJnMSJ9LCBkZXBlbmRzT25NZXRob2RzPSJtMSIpCisgIHB1YmxpYyB2b2lkIG0yKCkgeworICBTeXN0ZW0ub3V0LnByaW50bG4oIjIiKTsKKyB9CisKKyBAUGFyYW1ldGVycyh2YWx1ZSA9ICJwYXJhbSIpCisgQFRlc3QgKGdyb3VwcyA9IHsiZzIifSkKKyAgcHVibGljIHZvaWQgbTMoU3RyaW5nIHBhcmFtKSB7CisgIFN5c3RlbS5vdXQucHJpbnRsbigiMyIpOworICBSZXBvcnRlci5sb2coIk0zIFdBUyBDQUxMRUQiKTsKKyB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL2IvVG1wQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9iL1RtcEIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ0Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9iL1RtcEIuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QudG1wLmI7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUbXBCIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdG1wYjEoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0bXBiMSIpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9wMS9Db250YWluZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL3AxL0NvbnRhaW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNmZjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9wMS9Db250YWluZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB0ZXN0LnRtcC5wMTsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKKworcHVibGljIGNsYXNzIENvbnRhaW5lclRlc3QgeworCisgICAgQEJlZm9yZVN1aXRlCisgICAgcHVibGljIHZvaWQgc3RhcnR1cCgpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChudWxsKTsKKyAgICB9CisKKyAgICBAQWZ0ZXJTdWl0ZQorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvcDIvU2VydmljZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvcDIvU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDIyY2JkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC9wMi9TZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC50bXAucDI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnRKVW5pdC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgU2VydmljZVRlc3QgeworICBAVGVzdChncm91cHMgPSB7Imdyb3VwMSJ9KQorICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobnVsbCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvdmVyaWZ5L1ZlcmlmeS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC92ZXJpZnkvVmVyaWZ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhZDBjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvdmVyaWZ5L1ZlcmlmeS5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSB0ZXN0LnRtcC52ZXJpZnk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBWZXJpZnkgeworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC92ZXJpZnkvVmVyaWZ5SW50ZXJjZXB0b3IuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvdmVyaWZ5L1ZlcmlmeUludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxNWNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90bXAvdmVyaWZ5L1ZlcmlmeUludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSB0ZXN0LnRtcC52ZXJpZnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnN0YW5jZTsKK2ltcG9ydCBvcmcudGVzdG5nLklNZXRob2RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcudGVzdG5nLklUZXN0TkdNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TkdVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmNvbGxlY3Rpb25zLk1hcHM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBWZXJpZnlJbnRlcmNlcHRvciBpbXBsZW1lbnRzIElNZXRob2RJbnRlcmNlcHRvciB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbWV0aG9kcyByZWNlaXZlZCBpbiBwYXJhbWV0ZXJzIHdpdGggYWxsIG1ldGhvZHMKKyAgICogYW5ub3RhdGVkIHdpdGggQFZlcmlmeSBpbnNlcnRlZCBhZnRlciBlYWNoIG9mIHRoZXNlIHRlc3QgbWV0aG9kcy4KKyAgICoKKyAgICogVGhpcyBoYXBwZW5zIGluIHR3byBzdGVwczoKKyAgICogLSBGaW5kIGFsbCB0aGUgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAVmVyaWZ5IGluIHRoZSBjbGFzc2VzIHRoYXQgY29udGFpbiB0ZXN0IG1ldGhvZHMKKyAgICogLSBJbnNlcnQgdGhlc2UgdmVyaWZ5IG1ldGhvZHMgYWZ0ZXIgZWFjaCBtZXRob2QgcGFzc2VkIGluIHBhcmFtZXRlcgorICAgKiBUaGVzZSBAVmVyaWZ5IG1ldGhvZHMgYXJlIHN0b3JlZCBpbiBhIG1hcCBrZXllZCBieSB0aGUgY2xhc3MgaW4gb3JkZXIgdG8gYXZvaWQgbG9va2luZyB0aGVtCisgICAqIHVwIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGNsYXNzLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PElNZXRob2RJbnN0YW5jZT4gaW50ZXJjZXB0KExpc3Q8SU1ldGhvZEluc3RhbmNlPiBtZXRob2RzLAorICAgICAgSVRlc3RDb250ZXh0IGNvbnRleHQpIHsKKworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBNYXA8Q2xhc3M8Pz4sIExpc3Q8SU1ldGhvZEluc3RhbmNlPj4gdmVyaWZ5TWV0aG9kcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoSU1ldGhvZEluc3RhbmNlIG1pIDogbWV0aG9kcykgeworICAgICAgSVRlc3ROR01ldGhvZCB0bSA9IG1pLmdldE1ldGhvZCgpOworICAgICAgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IHZlcmlmeSA9IHZlcmlmeU1ldGhvZHMuZ2V0KHRtLmdldFJlYWxDbGFzcygpKTsKKyAgICAgIGlmICh2ZXJpZnkgPT0gbnVsbCkgeworICAgICAgICB2ZXJpZnkgPSBmaW5kVmVyaWZ5TWV0aG9kcyh0bS5nZXRSZWFsQ2xhc3MoKSwgdG0pOworICAgICAgfQorICAgICAgcmVzdWx0LmFkZChtaSk7CisgICAgICByZXN1bHQuYWRkQWxsKHZlcmlmeSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGFsbCB0aGUgQFZlcmlmeSBtZXRob2RzIGZvdW5kIG9uIEBjb2Rle3JlYWxDbGFzc30KKyAgICovCisgIHByaXZhdGUgTGlzdDxJTWV0aG9kSW5zdGFuY2U+IGZpbmRWZXJpZnlNZXRob2RzKENsYXNzIHJlYWxDbGFzcywgZmluYWwgSVRlc3ROR01ldGhvZCB0bSkgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBmb3IgKGZpbmFsIE1ldGhvZCBtIDogcmVhbENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICBBbm5vdGF0aW9uIGEgPSBtLmdldEFubm90YXRpb24oVmVyaWZ5LmNsYXNzKTsKKyAgICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgICAgZmluYWwgSVRlc3ROR01ldGhvZCB2bSA9IFRlc3ROR1V0aWxzLmNyZWF0ZUlUZXN0TkdNZXRob2QodG0sIG0pOworICAgICAgICByZXN1bHQuYWRkKG5ldyBJTWV0aG9kSW5zdGFuY2UoKSB7CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0SW5zdGFuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRtLmdldEluc3RhbmNlcygpOworICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBJVGVzdE5HTWV0aG9kIGdldE1ldGhvZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB2bTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhJTWV0aG9kSW5zdGFuY2UgbykgeworICAgICAgICAgICAgaWYgKGdldEluc3RhbmNlcygpWzBdID09IG8uZ2V0SW5zdGFuY2VzKClbMF0pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0bS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC92ZXJpZnkvVmVyaWZ5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RtcC92ZXJpZnkvVmVyaWZ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTBlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdG1wL3ZlcmlmeS9WZXJpZnlUZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LnRtcC52ZXJpZnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBWZXJpZnlUZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMigpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImYyKCkiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZjEoKSIpOworICB9CisKKyAgQFZlcmlmeQorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisvLyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJ2ZXJpZnkoKSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdHJpYW5nbGUvQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBjYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0Jhc2UuamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIHRlc3QudHJpYW5nbGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQmFzZSB7CisgIHByb3RlY3RlZCBib29sZWFuIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZSgpIHsKKyAgICBDb3VudENhbGxzLm51bUNhbGxzID0gMDsKKyAgfQorCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBpbml0QmVmb3JlVGVzdENsYXNzKCkgeworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIH0KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBwb3N0QWZ0ZXJUZXN0Q2xhc3MoKSB7CisgICAgQ291bnRDYWxscy5pbmNyKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHBwcChTdHJpbmcgcykgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0Jhc2VdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0NoZWNrQ291bnQuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC90cmlhbmdsZS9DaGVja0NvdW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjNGFhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC90cmlhbmdsZS9DaGVja0NvdW50LmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSB0ZXN0LnRyaWFuZ2xlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiB0aGlzIHRlc3QgY2hlY2tzIHRoZSBDb3VudENhbGxzJ3Mgc3RhdGljIGNvdW50ZXIgdG8gc2VlIGlmIHdlIGdvdCB0aGUKKyAqIGV4cGVjdGVkIG51bWJlciBvZiBjYWxscworICovCitwdWJsaWMgY2xhc3MgQ2hlY2tDb3VudCB7CisKKyAgQFRlc3QocGFyYW1ldGVycyA9IHsgImV4cGVjdGVkLWNhbGxzIiB9KQorICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDb3VudERlcHJlY2F0ZWQoU3RyaW5nIGV4cGVjdGVkQ2FsbHMpeworICAgIHRyeSB7CisKKyAgICAgIC8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxudGVzdENoZWNrQ291bnQgdGltZSA9ICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICBpbnQgaSA9IEludGVnZXIudmFsdWVPZihleHBlY3RlZENhbGxzKTsKKyAgICAgIGludCBudW1DYWxscyA9ICBDb3VudENhbGxzLmdldE51bUNhbGxzKCk7CisgICAgICBhc3NlcnQgKG51bUNhbGxzID09IGkpICA6ICJDb3VudCBjYWxscyBleHBlY3RlZCAiICsgaSArICIgYnV0IGdvdCAiICsgbnVtQ2FsbHM7CisgICAgfQorICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICBhc3NlcnQgZmFsc2UgOiAiQ291bnRDYWxscyBuZWVkcyBhbiBleHBlY3RlZC1jYWxscyBudW1lcmljIHBhcmFtZXRlciI7CisgICAgfQorICB9CisKKyAgQFBhcmFtZXRlcnMoeyAiZXhwZWN0ZWQtY2FsbHMiIH0pCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0NvdW50KFN0cmluZyBleHBlY3RlZENhbGxzKXsKKyAgICB0cnkgeworCisgICAgICAvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbnRlc3RDaGVja0NvdW50IHRpbWUgPSAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgaW50IGkgPSBJbnRlZ2VyLnZhbHVlT2YoZXhwZWN0ZWRDYWxscyk7CisgICAgICBpbnQgbnVtQ2FsbHMgPSAgQ291bnRDYWxscy5nZXROdW1DYWxscygpOworICAgICAgYXNzZXJ0IChudW1DYWxscyA9PSBpKSAgOiAiQ291bnQgY2FsbHMgZXhwZWN0ZWQgIiArIGkgKyAiIGJ1dCBnb3QgIiArIG51bUNhbGxzOworICAgIH0KKyAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgYXNzZXJ0IGZhbHNlIDogIkNvdW50Q2FsbHMgbmVlZHMgYW4gZXhwZWN0ZWQtY2FsbHMgbnVtZXJpYyBwYXJhbWV0ZXIiOworICAgIH0KKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0NoaWxkMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0NoaWxkMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTE0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdHJpYW5nbGUvQ2hpbGQxLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSB0ZXN0LnRyaWFuZ2xlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQ2hpbGQxIGV4dGVuZHMgQmFzZSB7CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNoaWxkMSgpIHsKKyAgICBhc3NlcnQgbV9pc0luaXRpYWxpemVkIDogIldhc24ndCBpbml0aWFsaXplZCBjb3JyZWN0bHkgIiArIGhhc2hDb2RlKCkgKyAiICIgKyBnZXRDbGFzcygpOworCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjaGlsZDFhKCkgeworICAgIGFzc2VydCBtX2lzSW5pdGlhbGl6ZWQgOiAiV2Fzbid0IGluaXRpYWxpemVkIGNvcnJlY3RseSAiICsgaGFzaENvZGUoKSArICIgIiArIGdldENsYXNzKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0NoaWxkMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3RyaWFuZ2xlL0NoaWxkMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWIxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdHJpYW5nbGUvQ2hpbGQyLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB0ZXN0LnRyaWFuZ2xlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MKKyAqCisgKiBAYXV0aG9yIGNiZXVzdAorICovCitwdWJsaWMgY2xhc3MgQ2hpbGQyIGV4dGVuZHMgQmFzZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hpbGQyKCkgeworICAgIGFzc2VydCBtX2lzSW5pdGlhbGl6ZWQgOiAiV2Fzbid0IGluaXRpYWxpemVkIGNvcnJlY3RseSI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC90cmlhbmdsZS9Db3VudENhbGxzLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdHJpYW5nbGUvQ291bnRDYWxscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDNmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdHJpYW5nbGUvQ291bnRDYWxscy5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgdGVzdC50cmlhbmdsZTsKKworCisvKioKKyAqIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgc29tZXRoaW5nIGlzIGNhbGxlZAorICogdXNlZCB0byBjaGVjayB3aGV0aGVyIGNlcnRhaW4gbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudENhbGxzIHsKKyAgc3RhdGljIGludCBudW1DYWxscyA9IDA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluY3IgKCkgeworICAgIG51bUNhbGxzKys7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBnZXROdW1DYWxscygpIHsKKyAgICByZXR1cm4gbnVtQ2FsbHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9CYXNlQWZ0ZXIuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9CYXNlQWZ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1MGIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL0Jhc2VBZnRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgdGVzdC51bmlxdWVzdWl0ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworCitwdWJsaWMgY2xhc3MgQmFzZUFmdGVyIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgbV9hZnRlckNvdW50ID0gMDsKKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGUoKSB7CisgICAgbV9hZnRlckNvdW50ID0gMDsKKyAgfQorCisgIEBBZnRlclN1aXRlCisgIHB1YmxpYyB2b2lkIGluY3JlbWVudEFmdGVyKCkgeworICAgIG1fYWZ0ZXJDb3VudCsrOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcHAoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltCYXNlQWZ0ZXJdICIgKyBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL0Jhc2VCZWZvcmUuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9CYXNlQmVmb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMjQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9CYXNlQmVmb3JlLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSB0ZXN0LnVuaXF1ZXN1aXRlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CisKK3B1YmxpYyBjbGFzcyBCYXNlQmVmb3JlIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgbV9iZWZvcmVDb3VudCA9IDA7CisgIHB1YmxpYyBzdGF0aWMgaW50IG1fYWZ0ZXJDb3VudCA9IDA7CisKKyAgQEJlZm9yZVN1aXRlCisgIHB1YmxpYyB2b2lkIGluY3JlbWVudEJlZm9yZSgpIHsKKyAgICBtX2JlZm9yZUNvdW50Kys7CisgIH0KKworICBAQWZ0ZXJTdWl0ZQorICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRBZnRlcigpIHsKKyAgICBtX2FmdGVyQ291bnQrKzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHBwKFN0cmluZyBzKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJbQmFzZV0gIiArIHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdW5pcXVlc3VpdGUvVGVzdEFmdGVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdW5pcXVlc3VpdGUvVGVzdEFmdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QWZ0ZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIHRlc3QudW5pcXVlc3VpdGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RORzsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCB0ZXN0aGVscGVyLk91dHB1dERpcmVjdG9yeVBhdGNoOworCitwdWJsaWMgY2xhc3MgVGVzdEFmdGVyIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QWZ0ZXIoKSB7CisgICAgVGVzdE5HIHRuZyA9IG5ldyBUZXN0TkcoKTsKKyAgICB0bmcuc2V0T3V0cHV0RGlyZWN0b3J5KE91dHB1dERpcmVjdG9yeVBhdGNoLmdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICB0bmcuc2V0VGVzdENsYXNzZXMobmV3IENsYXNzW10geyBUZXN0QWZ0ZXIxLmNsYXNzLCBUZXN0QWZ0ZXIyLmNsYXNzIH0pOworICAgIHRuZy5zZXRWZXJib3NlKDApOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJhc2VBZnRlci5tX2FmdGVyQ291bnQsIDEpOworICB9CisKKyAgQEFmdGVyVGVzdAorICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgQmFzZUFmdGVyLm1fYWZ0ZXJDb3VudCA9IDA7CisgICAgQmFzZUJlZm9yZS5tX2JlZm9yZUNvdW50ID0gMDsKKyAgICBCYXNlQmVmb3JlLm1fYWZ0ZXJDb3VudCA9IDA7CisgIH0KK30KKworLy8vLy8KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL1Rlc3RBZnRlcjEuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QWZ0ZXIxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYThhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QWZ0ZXIxLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSB0ZXN0LnVuaXF1ZXN1aXRlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdEFmdGVyMSBleHRlbmRzIEJhc2VBZnRlciB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdW5pcXVlc3VpdGUvVGVzdEFmdGVyMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL1Rlc3RBZnRlcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjczYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL1Rlc3RBZnRlcjIuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIHRlc3QudW5pcXVlc3VpdGU7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWZ0ZXIyIGV4dGVuZHMgQmFzZUFmdGVyIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QmVmb3JlMS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL1Rlc3RCZWZvcmUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1NTMxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QmVmb3JlMS5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC51bmlxdWVzdWl0ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RCZWZvcmUxIGV4dGVuZHMgQmFzZUJlZm9yZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9iZWZvcmVDb3VudCwgMSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QmVmb3JlMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3VuaXF1ZXN1aXRlL1Rlc3RCZWZvcmUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNDU0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC91bmlxdWVzdWl0ZS9UZXN0QmVmb3JlMi5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgdGVzdC51bmlxdWVzdWl0ZTsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RCZWZvcmUyIGV4dGVuZHMgQmFzZUJlZm9yZSB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5KCkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobV9iZWZvcmVDb3VudCwgMSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC92Ni9BLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdjYvQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTRhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdjYvQS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgdGVzdC52NjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyR3JvdXBzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlclN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVHcm91cHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBIHsKKworICBAVGVzdChkZXBlbmRzT25NZXRob2RzID0gImZhMSIpCisgIHB1YmxpYyB2b2lkIGZhMigpIHsKKyAgfQorCisgIEBUZXN0KGdyb3VwcyA9ICIxIikKKyAgcHVibGljIHZvaWQgZmExKCkge30KKworICBAVGVzdCBwdWJsaWMgdm9pZCBmYTMoKSB7fQorCisgIEBCZWZvcmVHcm91cHMoIjEiKQorICBwdWJsaWMgdm9pZCBiZWZvcmVHcm91cHMoKSB7fQorCisgIEBBZnRlckdyb3VwcygiMSIpCisgIHB1YmxpYyB2b2lkIGFmdGVyR3JvdXBzKCkge30KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIGFmdGVyTWV0aG9kKCkge30KKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGUoKSB7fQorCisgIEBBZnRlclN1aXRlCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGUoKSB7fQorCisgIEBCZWZvcmVDbGFzcworICBwdWJsaWMgdm9pZCBiZWZvcmVDbGFzcygpIHt9CisKKyAgQEFmdGVyQ2xhc3MKKyAgcHVibGljIHZvaWQgYWZ0ZXJDbGFzcygpIHt9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdjYvQi5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Y2L0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTczNmViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3Y2L0IuamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIHRlc3QudjY7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlU3VpdGU7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitwdWJsaWMgY2xhc3MgQiB7CisKKyAgQFRlc3QoZGVwZW5kc09uTWV0aG9kcyA9ICJmYjEiKQorICBwdWJsaWMgdm9pZCBmYjIoKSB7CisgIH0KKworICBAVGVzdChncm91cHMgPSAiMSIpCisgIHB1YmxpYyB2b2lkIGZiMSgpIHt9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgZmIzKCkge30KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIGJlZm9yZU1ldGhvZCgpIHt9CisKKyAgQEFmdGVyTWV0aG9kKGdyb3VwcyA9ICIxIikKKyAgcHVibGljIHZvaWQgYWZ0ZXJNZXRob2QoKSB7fQorCisgIEBCZWZvcmVTdWl0ZQorICBwdWJsaWMgdm9pZCBiZWZvcmVTdWl0ZSgpIHt9CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGJlZm9yZUNsYXNzKCkge30KKworICBAQWZ0ZXJDbGFzcworICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkge30KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC92Ni9DLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdjYvQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmY2MxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdjYvQy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgdGVzdC52NjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZVN1aXRlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDIHsKKworICBAQmVmb3JlVGVzdAorICBwdWJsaWMgdm9pZCBiZWZvcmVUZXN0KCkge30KKworICBAQWZ0ZXJUZXN0CisgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpIHt9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZmMxKCkge30KKworICBAQmVmb3JlU3VpdGUKKyAgcHVibGljIHZvaWQgYmVmb3JlU3VpdGUoKSB7fQorCisgIEBBZnRlclN1aXRlCisgIHB1YmxpYyB2b2lkIGFmdGVyU3VpdGUoKSB7fQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmaWVyLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0ZWZjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK0BSZXRlbnRpb24oamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtNRVRIT0QsIFRZUEV9KQorcHVibGljIEBpbnRlcmZhY2UgVmVyaWZpZXIgeworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnkuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSB0ZXN0LnZlcmlmeTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7TUVUSE9ELCBUWVBFfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFZlcmlmeSB7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeTJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeTJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxNmE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5MlNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXJGYWN0b3J5OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuTGlzdGVuZXJzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBJbGx1c3RyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIEBWZXJpZnkvQFZlcmlmaWVyIHRlc3QuCisgKgorICogT25lIG1ldGhvZCBzaG91bGQgYmUgYW5ub3RhdGVkIHdpdGggQFZlcmlmaWVyIGFuZCB0aGVuIGVhY2ggdGVzdCBtZXRob2QKKyAqIGFubm90YXRlZCB3aXRoIEBWZXJpZnkgd2lsbCBiZSBmb2xsb3dlZCB3aXRoIGEgY2FsbCB0byB0aGUgQFZlcmlmaWVyCisgKiBtZXRob2QuCisgKi8KK0BMaXN0ZW5lcnMoVmVyaWZ5VGVzdExpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFZlcmlmeTJTYW1wbGVUZXN0IGltcGxlbWVudHMgSVRlc3ROR0xpc3RlbmVyRmFjdG9yeSB7CisKKyAgcHVibGljIFZlcmlmeTJTYW1wbGVUZXN0KCkge30KKworICBAVmVyaWZ5CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkgeworICAgIGxvZygiZjEiKTsKKyAgfQorCisgIEBWZXJpZnkKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjIoKSB7CisgICAgbG9nKCJmMiIpOworICB9CisKKyAgQFZlcmlmaWVyCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBsb2coIlZlcmlmeWluZyIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaGFzaENvZGUoKSArICIgIiArIHN0cmluZyk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJVGVzdE5HTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoQ2xhc3M8PyBleHRlbmRzIElUZXN0TkdMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgeworICAgIGxvZygiQ3JlYXRpbmcgYSBsaXN0ZW5lciBvZiB0eXBlICIgKyBsaXN0ZW5lckNsYXNzKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnkzQmFzZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnkzQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWJjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeTNCYXNlLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CisKK0BMaXN0ZW5lcnMoVmVyaWZ5VGVzdExpc3RlbmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFZlcmlmeTNCYXNlIHsKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5M1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5M1NhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJhZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnkzU2FtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgdGVzdC52ZXJpZnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IEBMaXN0ZW5lcnMgYW5ub3RhdGlvbnMgY2FuIGNvbWUgZnJvbSBzdXBlcmNsYXNzZXMKKyAqLworcHVibGljIGNsYXNzIFZlcmlmeTNTYW1wbGVUZXN0IGV4dGVuZHMgVmVyaWZ5M0Jhc2UgeworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgYmMoKSB7CisgICAgVmVyaWZ5VGVzdExpc3RlbmVyLm1fY291bnQgPSAwOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeU1ldGhvZEludGVyY2VwdG9yLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeU1ldGhvZEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwMDVjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5TWV0aG9kSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW5zdGFuY2U7CitpbXBvcnQgb3JnLnRlc3RuZy5JTWV0aG9kSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5jb2xsZWN0aW9ucy5MaXN0czsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVmVyaWZ5TWV0aG9kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBJTWV0aG9kSW50ZXJjZXB0b3IgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8SU1ldGhvZEluc3RhbmNlPiBpbnRlcmNlcHQoTGlzdDxJTWV0aG9kSW5zdGFuY2U+IG1ldGhvZHMsCisgICAgICBJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIExpc3Q8SU1ldGhvZEluc3RhbmNlPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBJTWV0aG9kSW5zdGFuY2UgdmVyaWZpZXIgPSBudWxsOworCisgICAgLy8gRG9pbmcgYSBuYWl2ZSBhcHByb2FjaCBoZXJlOiB3ZSBydW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBtZXRob2RzCisgICAgLy8gdHdpY2UsIG9uY2UgdG8gZmluZCB0aGUgdmVyaWZpZXIgYW5kIG9uY2UgbW9yZSB0byBhY3R1YWxseSBjcmVhdGUKKyAgICAvLyB0aGUgcmVzdWx0LiBPYnZpb3VzbHksIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBqdXN0IG9uZSBsb29wCisgICAgZm9yIChJTWV0aG9kSW5zdGFuY2UgbSA6IG1ldGhvZHMpIHsKKyAgICAgIGlmIChtLmdldE1ldGhvZCgpLmdldE1ldGhvZCgpLmdldEFubm90YXRpb24oVmVyaWZpZXIuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgdmVyaWZpZXIgPSBtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIHJlc3VsdCB3aXRoIGVhY2ggQFZlcmlmeSBtZXRob2QgZm9sbG93ZWQgYnkgYSBjYWxsCisgICAgLy8gdG8gdGhlIEBWZXJpZmllciBtZXRob2QKKyAgICBmb3IgKElNZXRob2RJbnN0YW5jZSBtIDogbWV0aG9kcykgeworICAgICAgaWYgKG0gIT0gdmVyaWZpZXIpIHsKKyAgICAgICAgcmVzdWx0LmFkZChtKTsKKyAgICAgIH0KKworICAgICAgaWYgKG0uZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihWZXJpZnkuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgcmVzdWx0LmFkZCh2ZXJpZmllcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnlOb0xpc3RlbmVyc1NhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5Tm9MaXN0ZW5lcnNTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzY2JjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5Tm9MaXN0ZW5lcnNTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSB0ZXN0LnZlcmlmeTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworLyoqCisgKiBTYW1lIGNsYXNzIGFzIFZlcmlmeVNhbXBsZVRlc3QgYnV0IHdpdGhvdXQgdGhlIEBMaXN0ZW5lcnMgYW5ub3RhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFZlcmlmeU5vTGlzdGVuZXJzU2FtcGxlVGVzdCB7CisKKyAgQFZlcmlmeQorICBAVGVzdAorICBwdWJsaWMgdm9pZCBmMSgpIHsKKyAgICBsb2coImYxIik7CisgIH0KKworICBAVmVyaWZ5CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYyKCkgeworICAgIGxvZygiZjIiKTsKKyAgfQorCisgIEBWZXJpZmllcgorICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgbG9nKCJWZXJpZnlpbmciKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHN0cmluZykgeworICAgIGlmIChmYWxzZSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0cmluZyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeVNhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5U2FtcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjBkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeVNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5MaXN0ZW5lcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCisvKioKKyAqIElsbHVzdHJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgQFZlcmlmeS9AVmVyaWZpZXIgdGVzdC4KKyAqCisgKiBPbmUgbWV0aG9kIHNob3VsZCBiZSBhbm5vdGF0ZWQgd2l0aCBAVmVyaWZpZXIgYW5kIHRoZW4gZWFjaCB0ZXN0IG1ldGhvZAorICogYW5ub3RhdGVkIHdpdGggQFZlcmlmeSB3aWxsIGJlIGZvbGxvd2VkIHdpdGggYSBjYWxsIHRvIHRoZSBAVmVyaWZpZXIKKyAqIG1ldGhvZC4KKyAqLworQExpc3RlbmVycyhWZXJpZnlNZXRob2RJbnRlcmNlcHRvci5jbGFzcykKK3B1YmxpYyBjbGFzcyBWZXJpZnlTYW1wbGVUZXN0IHsKKworICBAVmVyaWZ5CisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGYxKCkgeworICAgIGxvZygiZjEiKTsKKyAgfQorCisgIEBWZXJpZnkKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZjIoKSB7CisgICAgbG9nKCJmMiIpOworICB9CisKKyAgQFZlcmlmaWVyCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICBsb2coIlZlcmlmeWluZyIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgaWYgKGZhbHNlKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxODQxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvdGVzdC92ZXJpZnkvVmVyaWZ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgdGVzdC52ZXJpZnk7CisKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLlRlc3RMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0Tkc7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIFZlcmlmeVRlc3QgZXh0ZW5kcyBTaW1wbGVCYXNlVGVzdCB7CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoQ2xhc3M8Pz4gY2xzLCBpbnQgZXhwZWN0ZWQpIHsKKyAgICBUZXN0TkcgdG5nID0gY3JlYXRlKGNscyk7CisgICAgVGVzdExpc3RlbmVyQWRhcHRlciB0bGEgPSBuZXcgVGVzdExpc3RlbmVyQWRhcHRlcigpOworICAgIHRuZy5hZGRMaXN0ZW5lcih0bGEpOworICAgIHRuZy5ydW4oKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCBleHBlY3RlZCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlXaXRoQW5ub3RhdGlvbigpIHsKKyAgICBydW5UZXN0KFZlcmlmeVNhbXBsZVRlc3QuY2xhc3MsIDQpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5V2l0aG91dEFubm90YXRpb24oKSB7CisgICAgcnVuVGVzdChWZXJpZnlOb0xpc3RlbmVyc1NhbXBsZVRlc3QuY2xhc3MsIDMpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdmVyaWZ5VGVzdExpc3RlbmVyKCkgeworICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoVmVyaWZ5MlNhbXBsZVRlc3QuY2xhc3MpOworICAgIFZlcmlmeVRlc3RMaXN0ZW5lci5tX2NvdW50ID0gMDsKKyAgICB0bmcucnVuKCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhWZXJpZnlUZXN0TGlzdGVuZXIubV9jb3VudCwgMSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB2ZXJpZnlCYXNlQ2xhc3NUZXN0TGlzdGVuZXIoKSB7CisgICAgVGVzdE5HIHRuZyA9IGNyZWF0ZShWZXJpZnkzU2FtcGxlVGVzdC5jbGFzcyk7CisgICAgVmVyaWZ5VGVzdExpc3RlbmVyLm1fY291bnQgPSAwOworICAgIHRuZy5ydW4oKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZlcmlmeVRlc3RMaXN0ZW5lci5tX2NvdW50LCAxKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QvdmVyaWZ5L1ZlcmlmeVRlc3RMaXN0ZW5lci5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnlUZXN0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q4NjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3ZlcmlmeS9WZXJpZnlUZXN0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIHRlc3QudmVyaWZ5OworCitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdENvbnRleHQ7CitpbXBvcnQgb3JnLnRlc3RuZy5JVGVzdExpc3RlbmVyOworaW1wb3J0IG9yZy50ZXN0bmcuSVRlc3RSZXN1bHQ7CisKK3B1YmxpYyBjbGFzcyBWZXJpZnlUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBJVGVzdExpc3RlbmVyIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgbV9jb3VudCA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uRmluaXNoKElUZXN0Q29udGV4dCBjb250ZXh0KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TdGFydChJVGVzdENvbnRleHQgY29udGV4dCkgeworICAgIG1fY291bnQrKzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsZWRCdXRXaXRoaW5TdWNjZXNzUGVyY2VudGFnZShJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRlc3RGYWlsdXJlKElUZXN0UmVzdWx0IHJlc3VsdCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGVzdFNraXBwZWQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3RhcnQoSVRlc3RSZXN1bHQgcmVzdWx0KSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UZXN0U3VjY2VzcyhJVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QveG1sL1htbFZlcmlmeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvdGVzdC94bWwvWG1sVmVyaWZ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjRkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL3Rlc3QveG1sL1htbFZlcmlmeVRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIHRlc3QueG1sOworCitpbXBvcnQgb3JnLnRlc3RuZy5Bc3NlcnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5UZXN0TGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HOworaW1wb3J0IG9yZy50ZXN0bmcuVGVzdE5HRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxTdWl0ZTsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5YbWxUZXN0OworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgWG1sVmVyaWZ5VGVzdCBleHRlbmRzIFNpbXBsZUJhc2VUZXN0IHsKKworLy8gIHByaXZhdGUgU3RyaW5nIGdldEZpbmFsUGF0aChTdHJpbmcgZmlsZSkgeworLy8gICAgRmlsZSBjdXJyZW50RGlyID0gbmV3IEZpbGUoIi4iKTsKKy8vICAgIFN0cmluZyBwYXRoID0gY3VycmVudERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKy8vICAgIGNoYXIgcyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKy8vICAgIFN0cmluZyB0ZXN0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmRpciIpOworLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJbWG1sVmVyaWZ5VGVzdF0gdGVzdC5kaXI6IiArIHRlc3REaXIpOworLy8gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodGVzdERpcik7CisvLyAgICBwYXRoID0gcGF0aCArIHMgKyB0ZXN0RGlyICsgczsKKy8vICAgIHJldHVybiBwYXRoICsgZmlsZTsKKy8vICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc2ltcGxlKCkgeworICAgIFhtbFN1aXRlIHN1aXRlID0gbmV3IFhtbFN1aXRlKCk7CisgICAgWG1sVGVzdCB0ZXN0ID0gbmV3IFhtbFRlc3Qoc3VpdGUpOworICAgIFhtbENsYXNzIHhDbGFzcyA9IG5ldyBYbWxDbGFzcyhYbWxWZXJpZnlUZXN0LmNsYXNzKTsKKyAgICB0ZXN0LmdldFhtbENsYXNzZXMoKS5hZGQoeENsYXNzKTsKKyAgICB0ZXN0LmdldEV4Y2x1ZGVkR3JvdXBzKCkuYWRkKCJmYXN0Iik7CisgICAgdGVzdC5zZXRWZXJib3NlKDUpOworCisgICAgc3VpdGUudG9YbWwoKTsKKyAgfQorCisgIEBUZXN0KGRlc2NyaXB0aW9uPSJFbnN1cmUgdGhhdCBUZXN0Tkcgc3RvcHMgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0cyBpZiBzb21lIGNsYXNzIiArCisgICAgICAiIGluY2x1ZGVkIGluIHN1aXRlIGlzIG1pc3NpbmciKQorICBwdWJsaWMgdm9pZCBoYW5kbGVJbnZhbGlkU3VpdGVzKCkgeworICAgICBUZXN0TGlzdGVuZXJBZGFwdGVyIHRsYSA9IG5ldyBUZXN0TGlzdGVuZXJBZGFwdGVyKCk7CisgICAgIHRyeSB7CisgICAgICAgIFRlc3RORyB0bmcgPSBjcmVhdGUoKTsKKyAgICAgICAgU3RyaW5nIHRlc3RuZ1htbFBhdGggPSBnZXRQYXRoVG9SZXNvdXJjZSgic3VpdGUxLnhtbCIpOworICAgICAgICB0bmcuc2V0VGVzdFN1aXRlcyhBcnJheXMuYXNMaXN0KHRlc3RuZ1htbFBhdGgpKTsKKyAgICAgICAgdG5nLmFkZExpc3RlbmVyKHRsYSk7CisgICAgICAgIHRuZy5ydW4oKTsKKyAgICAgfSBjYXRjaCAoVGVzdE5HRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGxhLmdldFBhc3NlZFRlc3RzKCkuc2l6ZSgpLCAwKTsKKyAgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL3Rlc3QveWFtbC9ZYW1sVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3lhbWwvWWFtbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA3ODhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0L3lhbWwvWWFtbFRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIHRlc3QueWFtbDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBvcmcudGVzdG5nLnhtbC5QYXJzZXI7CitpbXBvcnQgb3JnLnRlc3RuZy54bWwuWG1sU3VpdGU7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgdGVzdC5TaW1wbGVCYXNlVGVzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworcHVibGljIGNsYXNzIFlhbWxUZXN0IGV4dGVuZHMgU2ltcGxlQmFzZVRlc3QgeworCisgIEBEYXRhUHJvdmlkZXIKKyAgcHVibGljIE9iamVjdFtdW10gZHAoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtdIHsKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJhMSIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJhMiIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJhMyIgfSwKKyAgICAgIG5ldyBPYmplY3RbXSB7ICJhNCIgfSwKKyAgICB9OworICB9CisKKyAgQFRlc3QoZGF0YVByb3ZpZGVyID0gImRwIikKKyAgcHVibGljIHZvaWQgY29tcGFyZUZpbGVzKFN0cmluZyBuYW1lKQorICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIENvbGxlY3Rpb248WG1sU3VpdGU+IHMxID0KKyAgICAgICAgbmV3IFBhcnNlcihnZXRQYXRoVG9SZXNvdXJjZSgieWFtbCIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUgKyAiLnlhbWwiKSkucGFyc2UoKTsKKyAgICBDb2xsZWN0aW9uPFhtbFN1aXRlPiBzMiA9CisgICAgICAgIG5ldyBQYXJzZXIoZ2V0UGF0aFRvUmVzb3VyY2UoInlhbWwiICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi54bWwiKSkucGFyc2UoKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoczEsIHMyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS90ZXN0aGVscGVyL091dHB1dERpcmVjdG9yeVBhdGNoLmphdmEgYi9zcmMvdGVzdC9qYXZhL3Rlc3RoZWxwZXIvT3V0cHV0RGlyZWN0b3J5UGF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNhZTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS90ZXN0aGVscGVyL091dHB1dERpcmVjdG9yeVBhdGNoLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSB0ZXN0aGVscGVyOworCisvKioKKyAqIDxjb2RlPk91dHB1dERpcmVjdG9yeVBhdGNoPC9jb2RlPiBpcyBhIGhlbHBlciBjbGFzcyB0byBwcm92aWRlIGFuIG91dHB1dCBkaXJlY3RvcnkKKyAqIGZvciBUZXN0TkcgdGVzdHMgdGhhdCBleHBsaWNpdGx5IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUZXN0TkcgYW5kIGRvIG5vdCBrbm93IHRoZQorICogb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgY3F1ZXplbAorICogQHNpbmNlIDQuOAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT3V0cHV0RGlyZWN0b3J5UGF0Y2ggeworCisgIC8qKiBUaGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IG5hbWUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLiBXZSBzaG91bGQgdXNlIHNvbWV0aGluZworICAgKiBkaWZmZXJlbnQgdGhhbiAidGVzdC1vdXRwdXQiIHRvIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeQorICAgKiBoYXMgbm90IGJlZW4gc2V0LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRQVVRfRElSRUNUT1JZID0gInRlc3Qtb3V0cHV0IjsKKworICAvKiogVGhlIG5hbWUgb2YgdGhlIFN5c3RlbSBwcm9wZXJ0eSB1c2VkIHRvIHN0b3JlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0RJUkVDVE9SWV9QUk9QRVJUWV9OQU1FID0gInRlc3RuZy5vdXRwdXREaXIiOworCisgIC8qKgorICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGRpc2FibGUgaW5zdGFudGlhdGlvbi4KKyAgICoKKyAgICogQHNpbmNlIDQuOAorICAgKi8KKyAgcHJpdmF0ZSBPdXRwdXREaXJlY3RvcnlQYXRjaCgpIHsKKyAgICAvLyBIaWRlIGNvbnN0cnVjdG9yCisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgZm9yIHRoZSBjdXJyZW50IHRlc3QuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG91dHB1dCBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGZvciB0aGUgY3VycmVudCB0ZXN0LgorICAgKiBAc2luY2UgNC44CisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgU3RyaW5nIHRtcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShPVVRQVVRfRElSRUNUT1JZX1BST1BFUlRZX05BTUUpOworICAgIGlmICh0bXAgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisvLyAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlN5c3RlbSBwcm9wZXJ0eTogIiArIE9VVFBVVF9ESVJFQ1RPUllfUFJPUEVSVFlfTkFNRQorLy8gICAgICAgICsgIiBoYXMgbm90IGJlZW4gc2V0LiBVc2luZyBkZWZhdWx0IHBhdGg6ICIgKyBERUZBVUxUX09VVFBVVF9ESVJFQ1RPUlkpOworCisvLyAgICBuZXcgVGhyb3dhYmxlKCJTdGFjayBpcyBvbmx5IHRvIGhlbHAgbG9jYXRlIHRoZSBwcm9ibGVtLiBObyBleGNwZXRpb24gdGhyb3duLiIpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICByZXR1cm4gREVGQVVMVF9PVVRQVVRfRElSRUNUT1JZOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXIgYi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcudGVzdG5nLklUZXN0TkdMaXN0ZW5lcgpAQCAtMCwwICsxIEBACit0ZXN0LnNlcnZpY2Vsb2FkZXIuTXlDb25maWd1cmF0aW9uTGlzdGVuZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvYS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiOWVmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9hLnhtbApAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vYmV1c3QuY29tL3Rlc3RuZy90ZXN0bmctMS4wLmR0ZCIgPgorICAKKzxzdWl0ZSBuYW1lPSJBIiB2ZXJib3NlPSIxIiA+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDEiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudG1wLkEiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9iLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9iLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAzNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2IueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL3Rlc3RuZy0xLjAuZHRkIiA+CisgIAorPHN1aXRlIG5hbWU9IkIiIHZlcmJvc2U9IjEiID4KKworICA8dGVzdCBuYW1lPSJUZXN0MSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50bXAuQiIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGQtc3VpdGUxLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkLXN1aXRlMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMmFhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkLXN1aXRlMS54bWwKQEAgLTAsMCArMSw3IEBACis8c3VpdGUgbmFtZT0iQ2hpbGQgU3VpdGUgMSI+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucGFyYW1ldGVycy5TYW1wbGVUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGQtc3VpdGUyLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkLXN1aXRlMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMzc4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkLXN1aXRlMi54bWwKQEAgLTAsMCArMSw3IEBACis8c3VpdGUgbmFtZT0iQ2hpbGQgU3VpdGUgMiI+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucGFyYW1ldGVycy5TYW1wbGVUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGRyZW4vY2hpbGQtc3VpdGUtMy54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvY2hlY2tzdWl0ZXNpbml0aWFsaXphdGlvbi9jaGlsZHJlbi9jaGlsZC1zdWl0ZS0zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE0ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGRyZW4vY2hpbGQtc3VpdGUtMy54bWwKQEAgLTAsMCArMSw4IEBACis8c3VpdGUgbmFtZT0iQ2hpbGQgU3VpdGUgMyI+CisgIDxwYXJhbWV0ZXIgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyIi8+CisgIDxzdWl0ZS1maWxlcz4KKyAgICA8c3VpdGUtZmlsZSBwYXRoPSIuLi9jaGlsZC1zdWl0ZTIueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9ImNoaWxkLXN1aXRlLTQueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Im1vcmVjaGlsZHJlbi9jaGlsZC1zdWl0ZS01LnhtbCIgLz4KKyAgPC9zdWl0ZS1maWxlcz4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGRyZW4vY2hpbGQtc3VpdGUtNC54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvY2hlY2tzdWl0ZXNpbml0aWFsaXphdGlvbi9jaGlsZHJlbi9jaGlsZC1zdWl0ZS00LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUxMWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGRyZW4vY2hpbGQtc3VpdGUtNC54bWwKQEAgLTAsMCArMSw3IEBACis8c3VpdGUgbmFtZT0iQ2hpbGQgU3VpdGUgNCI+CisgIDx0ZXN0IG5hbWU9IlRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucGFyYW1ldGVycy5TYW1wbGVUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkcmVuL21vcmVjaGlsZHJlbi9jaGlsZC1zdWl0ZS01LnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9jaGVja3N1aXRlc2luaXRpYWxpemF0aW9uL2NoaWxkcmVuL21vcmVjaGlsZHJlbi9jaGlsZC1zdWl0ZS01LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFiMTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vY2hpbGRyZW4vbW9yZWNoaWxkcmVuL2NoaWxkLXN1aXRlLTUueG1sCkBAIC0wLDAgKzEsNyBAQAorPHN1aXRlIG5hbWU9IkNoaWxkIFN1aXRlIDUiPgorICA8dGVzdCBuYW1lPSJUZXN0Ij4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuU2FtcGxlVGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvY2hlY2tzdWl0ZXNpbml0aWFsaXphdGlvbi9wYXJlbnQtc3VpdGUueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vcGFyZW50LXN1aXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM5ZThjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NoZWNrc3VpdGVzaW5pdGlhbGl6YXRpb24vcGFyZW50LXN1aXRlLnhtbApAQCAtMCwwICsxLDcgQEAKKzxzdWl0ZSBuYW1lPSJQYXJlbnQgU3VpdGUiPgorICA8cGFyYW1ldGVyIG5hbWU9ImZvbyIgdmFsdWU9ImJhciIvPgorICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9jaGlsZC1zdWl0ZTEueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9ImNoaWxkcmVuL2NoaWxkLXN1aXRlLTMueG1sIiAvPgorICA8L3N1aXRlLWZpbGVzPgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvY3JlYXRlLXNlcnZpY2Vsb2FkZXItamFyLnNoIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NyZWF0ZS1zZXJ2aWNlbG9hZGVyLWphci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBlOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NyZWF0ZS1zZXJ2aWNlbG9hZGVyLWphci5zaApAQCAtMCwwICsxLDEyIEBACisjIFRoaXMgc2NyaXB0IHdpbGwgdXBkYXRlIHNlcnZpY2Vsb2FkZXIuamFyIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFRtcFN1aXRlTGlzdGVuZXIuY2xhc3MsCisjIHdoaWNoIGlzIHVzZWQgYnkgdGVzdC5zZXJ2aWNlbG9hZGVyLlNlcnZpY2VMb2FkZXJUZXN0LgorIyBSdW4gdGhpcyBzY3JpcHQgYWZ0ZXIgYnVpbGRpbmcgVGVzdE5HIGFuZCBpdHMgdGVzdHMgd2l0aCBhbnQKKworaj0ke1BXRH0KK3JtIC1yZiAvdG1wL3NsCitta2RpciAvdG1wL3NsCitjZCAvdG1wL3NsCitqYXIgeHZmICR7an0vc2VydmljZWxvYWRlci5qYXIKK2VjaG8gInRlc3Quc2VydmljZWxvYWRlci5UbXBTdWl0ZUxpc3RlbmVyIiA+TUVUQS1JTkYvc2VydmljZXMvb3JnLnRlc3RuZy5JVGVzdE5HTGlzdGVuZXIKK2NwICR7an0vLi4vLi4vLi4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy90ZXN0L3NlcnZpY2Vsb2FkZXIvVG1wU3VpdGVMaXN0ZW5lci5jbGFzcyB0ZXN0L3RtcAoramFyIGN2ZiAke2p9L3NlcnZpY2Vsb2FkZXIuamFyIC4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9ob3N0cy5wcm9wZXJ0aWVzIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2hvc3RzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxODg4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9ob3N0cy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAordGVzdG5nLmhvc3RzPWxvY2FsaG9zdDo1MTUwCit0ZXN0bmcuc3RyYXRlZ3k9dGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2p1bml0LXN1aXRlLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC1zdWl0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1ZGQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC1zdWl0ZS54bWwKQEAgLTAsMCArMSwxMSBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KKworPHN1aXRlIG5hbWU9IlRlc3RORyBSdW5uaW5nIEp1bml0IFRlc3RzIiB2ZXJib3NlPSIwIj4KKworICA8dGVzdCBuYW1lPSJKdW5pdCB2aWEgVGVzdE5HIFhNTCIganVuaXQ9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuanVuaXQuU2V0TmFtZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvbGlzdGVuZXItaW4teG1sLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9saXN0ZW5lci1pbi14bWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTE4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvbGlzdGVuZXItaW4teG1sLnhtbApAQCAtMCwwICsxLDE2IEBACis8c3VpdGUgbmFtZT0iU2luZ2xlU3VpdGUiIHZlcmJvc2U9IjEiIHBhcmFsbGVsPSJmYWxzZSIgdGhyZWFkLWNvdW50PSI0IgorICAgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIzIj4KKworICA8bGlzdGVuZXJzPgorICAgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPSJ0ZXN0Lmxpc3RlbmVycy5MTGlzdGVuZXIiIC8+CisgIDwvbGlzdGVuZXJzPgorCisgIDx0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24yIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisKKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmxpc3RlbmVycy5MU2FtcGxlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9tdWx0aXBsZS1pbnRlcmNlcHRvcnMueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL21ldGhvZGludGVyY2VwdG9ycy9tdWx0aXBsZWludGVyY2VwdG9ycy9tdWx0aXBsZS1pbnRlcmNlcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTMzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvbWV0aG9kaW50ZXJjZXB0b3JzL211bHRpcGxlaW50ZXJjZXB0b3JzL211bHRpcGxlLWludGVyY2VwdG9ycy54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJNdWx0aXBsZSBpbnRlcmNlcHRvcnMiPgorICAKKyAgICA8bGlzdGVuZXJzPgorICAgICAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0idGVzdC5tZXRob2RpbnRlcmNlcHRvcnMubXVsdGlwbGVpbnRlcmNlcHRvcnMuRmlyc3RJbnRlcmNlcHRvciIvPgorICAgICAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0idGVzdC5tZXRob2RpbnRlcmNlcHRvcnMubXVsdGlwbGVpbnRlcmNlcHRvcnMuU2Vjb25kSW50ZXJjZXB0b3IiLz4KKyAgICAgICAgPGxpc3RlbmVyIGNsYXNzLW5hbWU9InRlc3QubWV0aG9kaW50ZXJjZXB0b3JzLm11bHRpcGxlaW50ZXJjZXB0b3JzLlRoaXJkSW50ZXJjZXB0b3IiLz4KKyAgICA8L2xpc3RlbmVycz4KKyAgCisgICAgPHRlc3QgbmFtZT0iTXVsdGlwbGVJbnRlcmNlcHRvcnM6VGVzdHMiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIj4KKyAgICAgICAgPGNsYXNzZXM+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RpbnRlcmNlcHRvcnMubXVsdGlwbGVpbnRlcmNlcHRvcnMuRm9vVGVzdCIvPgorICAgICAgICA8L2NsYXNzZXM+CisgICAgPC90ZXN0PgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9tZXRob2RzZWxlY3Rvci1pbi14bWwueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL21ldGhvZHNlbGVjdG9yLWluLXhtbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwMDQxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9tZXRob2RzZWxlY3Rvci1pbi14bWwueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxzdWl0ZSBuYW1lPSJTaW5nbGVTdWl0ZSIgdmVyYm9zZT0iMCI+CisgIDxtZXRob2Qtc2VsZWN0b3JzPgorICAgIDxtZXRob2Qtc2VsZWN0b3I+CisgICAgICA8c2VsZWN0b3ItY2xhc3MgbmFtZT0idGVzdC5tZXRob2RzZWxlY3RvcnMuVGVzdDJNZXRob2RTZWxlY3RvciIgcHJpb3JpdHk9Ii0xIiAvPgorICAgIDwvbWV0aG9kLXNlbGVjdG9yPgorICA8L21ldGhvZC1zZWxlY3RvcnM+CisgIAorICA8dGVzdCBuYW1lPSJSZWdyZXNzaW9uMiIgcHJlc2VydmUtb3JkZXI9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYWNrYWdlLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQ3MTEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhY2thZ2UueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL3Rlc3RuZy0xLjAuZHRkIiA+CisgIAorPHN1aXRlIG5hbWU9IlBhY2thZ2UiIHZlcmJvc2U9IjEiIHBhcmFsbGVsPSJmYWxzZSIgdGhyZWFkLWNvdW50PSI0IgorICAgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIzIj4KKworICA8bGlzdGVuZXJzPgorICAgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPSJ0ZXN0LnRtcC5CTGlzdGVuZXIiIC8+CisgIDwvbGlzdGVuZXJzPgorCisgIDx0ZXN0IG5hbWU9IkEiPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJncm91cC1hIiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisgICAgPHBhY2thZ2VzPgorICAgICAgPHBhY2thZ2UgbmFtZT0idGVzdC50bXAuYSIgLz4KKyAgICAgIDxwYWNrYWdlIG5hbWU9InRlc3QudG1wLmIiIC8+CisgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorCis8IS0tIAorICA8dGVzdCBuYW1lPSJCIj4KKyAgICA8cGFja2FnZXM+CisgICAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0LnRtcC5iIiAvPgorICAgIDwvcGFja2FnZXM+CisgIDwvdGVzdD4KKyAtLT4KKyAKKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMC54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDQxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTAueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSBQYXJhbGxlbCAwIj4KKworICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9zdWl0ZS1wYXJhbGxlbC0zLnhtbCIgLz4KKyAgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3N1aXRlLXBhcmFsbGVsLTIueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vc3VpdGUtcGFyYWxsZWwtMS54bWwiIC8+CisgIDwvc3VpdGUtZmlsZXM+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDAiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0xLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMS54bWwKQEAgLTAsMCArMSw4IEBACis8c3VpdGUgbmFtZT0iU3VpdGUgUGFyYWxsZWwgMyI+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDMiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMi0xLnhtbApAQCAtMCwwICsxLDggQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSBQYXJhbGxlbCAyLTEiPgorCisgIDx0ZXN0IG5hbWU9IlRlc3QyLTEiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMi0xLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbGxlbC1zdWl0ZXMvc3VpdGUtcGFyYWxsZWwtMi0yLTEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2ZhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMi0xLnhtbApAQCAtMCwwICsxLDggQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSBQYXJhbGxlbCAyLTItMSI+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDItMi0xIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5TYW1wbGUyIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLTIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLTIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTczOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTItMi54bWwKQEAgLTAsMCArMSwxMiBAQAorPHN1aXRlIG5hbWU9IlN1aXRlIFBhcmFsbGVsIDItMiI+CisKKyAgPHN1aXRlLWZpbGVzPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vc3VpdGUtcGFyYWxsZWwtMi0yLTEueG1sIiAvPgorICA8L3N1aXRlLWZpbGVzPgorCisgIDx0ZXN0IG5hbWU9IlRlc3QyLTIiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlmZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0yLnhtbApAQCAtMCwwICsxLDEzIEBACis8c3VpdGUgbmFtZT0iU3VpdGUgUGFyYWxsZWwgMiI+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDIiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9zdWl0ZS1wYXJhbGxlbC0yLTEueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vc3VpdGUtcGFyYWxsZWwtMi0yLnhtbCIgLz4KKyAgPC9zdWl0ZS1maWxlcz4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYWxsZWwtc3VpdGVzL3N1aXRlLXBhcmFsbGVsLTMueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Y3MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmFsbGVsLXN1aXRlcy9zdWl0ZS1wYXJhbGxlbC0zLnhtbApAQCAtMCwwICsxLDggQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSBQYXJhbGxlbCAxIj4KKworICA8dGVzdCBuYW1lPSJUZXN0MSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50aHJlYWQuU2FtcGxlMiIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbS1pbmhlcml0YW5jZS9jaGlsZC1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW0taW5oZXJpdGFuY2UvY2hpbGQtc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjBjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW0taW5oZXJpdGFuY2UvY2hpbGQtc3VpdGUueG1sCkBAIC0wLDAgKzEsNyBAQAorPHN1aXRlIG5hbWU9IkNoaWxkIFN1aXRlIj4KKyAgPHRlc3QgbmFtZT0iVGVzdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlNhbXBsZVRlc3QiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW0taW5oZXJpdGFuY2UvcGFyZW50LXN1aXRlLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbS1pbmhlcml0YW5jZS9wYXJlbnQtc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjVhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW0taW5oZXJpdGFuY2UvcGFyZW50LXN1aXRlLnhtbApAQCAtMCwwICsxLDYgQEAKKzxzdWl0ZSBuYW1lPSJQYXJlbnQgU3VpdGUiPgorICA8cGFyYW1ldGVyIG5hbWU9ImZvbyIgdmFsdWU9ImJhciIvPgorICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9jaGlsZC1zdWl0ZS54bWwiIC8+CisgIDwvc3VpdGUtZmlsZXM+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbWV0ZXJ0ZXN0L2NoaWxkMS1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDEtc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjVkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDEtc3VpdGUueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxzdWl0ZSBuYW1lPSJJbmhlcml0ZWRQYXJhbWV0ZXJzU3VpdGUgQ2hpbGQxIj4KKworICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcjIiIHZhbHVlPSJjMXAyIi8+CisgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyNCIgdmFsdWU9ImMxcDQiLz4KKyAgPHRlc3QgbmFtZT0iSW5oZXJpdGVkUGFyYW1ldGVyc1Rlc3QgQ2hpbGQxIj4KKyAgICAgIDxjbGFzc2VzPgorICAgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuSW5oZXJpdEZyb21TdWl0ZUNoaWxkMSIgLz4KKyAgICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbWV0ZXJ0ZXN0L2NoaWxkMi1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDItc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDItc3VpdGUueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzxzdWl0ZSBuYW1lPSJJbmhlcml0ZWRQYXJhbWV0ZXJzU3VpdGUgQ2hpbGQyIj4KKworICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcjIiIHZhbHVlPSJjMnAyIi8+CisgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyMyIgdmFsdWU9ImMycDMiLz4KKyAgPHRlc3QgbmFtZT0iSW5oZXJpdGVkUGFyYW1ldGVyc1Rlc3QgQ2hpbGQyIj4KKyAgICAgIDxjbGFzc2VzPgorICAgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuSW5oZXJpdEZyb21TdWl0ZUNoaWxkMiIgLz4KKyAgICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICAKKyAgPHN1aXRlLWZpbGVzPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vY2hpbGQzLXN1aXRlLnhtbCIvPgorICA8L3N1aXRlLWZpbGVzPgorCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbWV0ZXJ0ZXN0L2NoaWxkMy1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDMtc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjdkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9jaGlsZDMtc3VpdGUueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxzdWl0ZSBuYW1lPSJJbmhlcml0ZWRQYXJhbWV0ZXJzU3VpdGUgQ2hpbGQzIj4KKworICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcjIiIHZhbHVlPSJjM3AyIi8+CisgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyNCIgdmFsdWU9ImMzcDQiLz4KKyAgPHRlc3QgbmFtZT0iSW5oZXJpdGVkUGFyYW1ldGVyc1Rlc3QgQ2hpbGQzIj4KKyAgICAgIDxjbGFzc2VzPgorICAgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuSW5oZXJpdEZyb21TdWl0ZUNoaWxkMyIgLz4KKyAgICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJhbWV0ZXJ0ZXN0L3BhcmVudC1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9wYXJlbnQtc3VpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTY3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyYW1ldGVydGVzdC9wYXJlbnQtc3VpdGUueG1sCkBAIC0wLDAgKzEsOSBAQAorPHN1aXRlIG5hbWU9IlBhcmFtZXRlciBJbmhlcml0YW5jZSBUZXN0cyI+CisKKyAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXIxIiB2YWx1ZT0icDEiLz4KKyAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXIyIiB2YWx1ZT0icDIiLz4KKyAgPHN1aXRlLWZpbGVzPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vY2hpbGQxLXN1aXRlLnhtbCIvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vY2hpbGQyLXN1aXRlLnhtbCIvPgorICA8L3N1aXRlLWZpbGVzPgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50LW1vZHVsZS1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50LW1vZHVsZS1zdWl0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlYTA5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnQtbW9kdWxlLXN1aXRlLnhtbApAQCAtMCwwICsxLDkgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+CisKKzxzdWl0ZSBuYW1lPSJwYXJlbnQtbW9kdWxlLXN1aXRlIiBwYXJlbnQtbW9kdWxlPSJ0ZXN0Lmd1aWNlLkd1aWNlUGFyZW50TW9kdWxlIj4KKyAgPHRlc3QgbmFtZT0iR3VpY2UiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZ3VpY2UuR3VpY2VQYXJlbnRNb2R1bGVUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1hLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTk3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1hLnhtbApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c3VpdGUgbmFtZT0iU2FuaXR5Q2hlY2sgdGVzdHMiPgorICAgPHN1aXRlLWZpbGVzPgorICAgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi90ZXN0MS54bWwiLz4KKyAgICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vdGVzdDIueG1sIi8+CisgICA8L3N1aXRlLWZpbGVzPgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LWIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3QtYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkOGFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LWIueG1sCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayB0ZXN0cyI+CisgICA8c3VpdGUtZmlsZXM+CisgICAgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3Rlc3QyLnhtbCIvPgorICAgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi90ZXN0My54bWwiLz4KKyAgIDwvc3VpdGUtZmlsZXM+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3Qtcy0xLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LXMtMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYTJjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LXMtMS54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayBzdWl0ZXMiPgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0cyIgcHJlc2VydmUtb3JkZXI9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FuaXR5Y2hlY2suU2FtcGxlVGVzdDEiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKyAgPHRlc3QgbmFtZT0iU2FuaXR5Q2hlY2s6VGVzdHM6QW5vdGhlciIgcHJlc2VydmUtb3JkZXI9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FuaXR5Y2hlY2suU2FtcGxlVGVzdDMiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLTIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3Qtcy0yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWZhMmMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3Qtcy0yLnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHN1aXRlIG5hbWU9IlNhbml0eUNoZWNrIHN1aXRlcyI+CisgIDx0ZXN0IG5hbWU9IlNhbml0eUNoZWNrOlRlc3RzIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MSIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0czpBbm90aGVyIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MyIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LXMtMy54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLTMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLTMueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c3VpdGUgbmFtZT0iU2FuaXR5Q2hlY2sgc3VpdGVzIDMiPgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0cyIgcHJlc2VydmUtb3JkZXI9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FuaXR5Y2hlY2suU2FtcGxlVGVzdDEiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKyAgPHRlc3QgbmFtZT0iU2FuaXR5Q2hlY2s6VGVzdHM6QW5vdGhlciIgcHJlc2VydmUtb3JkZXI9InRydWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FuaXR5Y2hlY2suU2FtcGxlVGVzdDMiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLWEueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3Qtcy1hLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQ5Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3Qtcy1hLnhtbApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c3VpdGUgbmFtZT0iU2FuaXR5Q2hlY2sgc3VpdGVzIHJvb3QiPgorICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi90ZXN0LXMtMS54bWwiLz4KKyAgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3Rlc3Qtcy0yLnhtbCIvPgorICA8L3N1aXRlLWZpbGVzPgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0LXMtYi54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODg5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc2FuaXR5Y2hlY2svdGVzdC1zLWIueG1sCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayBzdWl0ZXMgcm9vdCI+CisgIDxzdWl0ZS1maWxlcz4KKyAgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3Rlc3Qtcy0yLnhtbCIvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vdGVzdC1zLTMueG1sIi8+CisgIDwvc3VpdGUtZmlsZXM+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3QxLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwMGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0MS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayB0ZXN0cyAxIj4KKyAgPHRlc3QgbmFtZT0iU2FuaXR5Q2hlY2s6VGVzdHMiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbml0eWNoZWNrLlNhbXBsZVRlc3QxIi8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MyIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0czpBbm90aGVyIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MiIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0cyI+CisgICAgPHBhcmFtZXRlciBuYW1lPSJmb28iIHZhbHVlPSJiYXIiLz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbml0eWNoZWNrLlNhbXBsZVRlc3QzIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3QyLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzOWFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0Mi54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayB0ZXN0cyAyIj4KKyAgPHRlc3QgbmFtZT0iU2FuaXR5Q2hlY2s6VGVzdHMiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbml0eWNoZWNrLlNhbXBsZVRlc3QxIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisgIDx0ZXN0IG5hbWU9IlNhbml0eUNoZWNrOlRlc3RzOkFub3RoZXIiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbml0eWNoZWNrLlNhbXBsZVRlc3QzIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Nhbml0eWNoZWNrL3Rlc3QzLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0My54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyYmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zYW5pdHljaGVjay90ZXN0My54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzdWl0ZSBuYW1lPSJTYW5pdHlDaGVjayB0ZXN0cyI+CisgIDx0ZXN0IG5hbWU9IlNhbml0eUNoZWNrOlRlc3RzIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MSIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICA8dGVzdCBuYW1lPSJTYW5pdHlDaGVjazpUZXN0czpBbm90aGVyIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5TYW1wbGVUZXN0MyIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2aWNlbG9hZGVyLmphciBiL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2aWNlbG9hZGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVmY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZpY2Vsb2FkZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZS1wYXJhbGxlbC0wLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZS1wYXJhbGxlbC0wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ0ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlLXBhcmFsbGVsLTAueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSBQYXJhbGxlbCAwIj4KKworICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9zdWl0ZS1wYXJhbGxlbC0xLnhtbCIgLz4KKyAgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3N1aXRlLXBhcmFsbGVsLTIueG1sIiAvPgorICA8L3N1aXRlLWZpbGVzPgorCisgIDx0ZXN0IG5hbWU9IlRlc3QwIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5TYW1wbGUyIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZS1wYXJhbGxlbC0xLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZS1wYXJhbGxlbC0xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Y3MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlLXBhcmFsbGVsLTEueG1sCkBAIC0wLDAgKzEsOCBAQAorPHN1aXRlIG5hbWU9IlN1aXRlIFBhcmFsbGVsIDEiPgorCisgIDx0ZXN0IG5hbWU9IlRlc3QxIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5TYW1wbGUyIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlLXBhcmFsbGVsLTIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlLXBhcmFsbGVsLTIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjY0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvc3VpdGUtcGFyYWxsZWwtMi54bWwKQEAgLTAsMCArMSw4IEBACis8c3VpdGUgbmFtZT0iU3VpdGUgUGFyYWxsZWwgMiI+CisKKyAgPHRlc3QgbmFtZT0iVGVzdDIiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlNhbXBsZTIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvc3VpdGUxLTEueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlMS0xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI2MWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlMS0xLnhtbApAQCAtMCwwICsxLDExIEBACis8c3VpdGUgbmFtZT0iU3VpdGUgMS0xIj4KKworICA8dGVzdCBuYW1lPSJTdWl0ZSAxLTEgVGVzdHMiPgorICAgIDxjbGFzc2VzPgorPCEtLSAKKyAgICAgIDxjbGFzcyBuYW1lPSJmb28uYmFyLk5vbkV4aXN0ZW50Q2xhc3MiLz4KKy0tPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FtcGxlLlNhbXBsZTEiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvc3VpdGUxLTIueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlMS0yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2M1Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlMS0yLnhtbApAQCAtMCwwICsxLDggQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSAxLTIiPgorCisgIDx0ZXN0IG5hbWU9IlN1aXRlIDEtMiBUZXN0cyI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5hc3NlcnR0ZXN0cy5Bc3NlcnRUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZTEueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1aXRlMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4ZDNmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9zdWl0ZTEueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzxzdWl0ZSBuYW1lPSJTdWl0ZSAxIj4KKworICA8dGVzdCBuYW1lPSJTdWl0ZSAxIFRlc3RzIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnhtbC5YbWxWZXJpZnlUZXN0Ij4KKyAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2ltcGxlIi8+CisgICAgICAgICA8L21ldGhvZHM+CisgICAgICA8L2NsYXNzPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICA8c3VpdGUtZmlsZXM+CisgICA8c3VpdGUtZmlsZSBwYXRoPSIuL3N1aXRlMS0xLnhtbCIgLz4KKyAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vc3VpdGUxLTIueG1sIiAvPgorICA8L3N1aXRlLWZpbGVzPgorPC9zdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5hbWVzL21haW4tc3VpdGUueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuYW1lcy9tYWluLXN1aXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ0M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuYW1lcy9tYWluLXN1aXRlLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIG5hbWU9IlN1cmVmaXJlIGRlYnVnIHN1aXRlIj4KKyAgICA8dGVzdCBuYW1lPSJ0ZXN0R3JvdXAxIj4KKyAgICAgICAgPGNsYXNzZXM+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmFtZXMuVGVzdE5hbWVzRmVhdHVyZSI+CisgICAgICAgICAgICAgICAgPG1ldGhvZHM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNhbXBsZU91dHB1dFRlc3QxIi8+CisgICAgICAgICAgICAgICAgPC9tZXRob2RzPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgPC9jbGFzc2VzPgorICAgIDwvdGVzdD4KKyAgICA8dGVzdCBuYW1lPSJ0ZXN0R3JvdXAyIj4KKyAgICAgICAgPGNsYXNzZXM+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmFtZXMuVGVzdE5hbWVzRmVhdHVyZSI+CisgICAgICAgICAgICAgICAgPG1ldGhvZHM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNhbXBsZU91dHB1dFRlc3QyIi8+CisgICAgICAgICAgICAgICAgPC9tZXRob2RzPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgPC9jbGFzc2VzPgorICAgIDwvdGVzdD4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuYW1lcy91cHN0cmVhbS1zdWl0ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5hbWVzL3Vwc3RyZWFtLXN1aXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTcyZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuYW1lcy91cHN0cmVhbS1zdWl0ZS54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KKzxzdWl0ZSBuYW1lPSJQYXJlbnRTdWl0ZSI+CisgICAgPHN1aXRlLWZpbGVzPgorICAgICAgICA8c3VpdGUtZmlsZSBwYXRoPSJtYWluLXN1aXRlLnhtbCIvPgorICAgIDwvc3VpdGUtZmlsZXM+Cis8L3N1aXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctYWxsLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTllMDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1hbGwueG1sCkBAIC0wLDAgKzEsOTkgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+CisKKzxzdWl0ZSBuYW1lPSJUZXN0TkciIHZlcmJvc2U9IjEiIHBhcmFsbGVsPSJmYWxzZSIgdGhyZWFkLWNvdW50PSIyIgorICAgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIzIj4KKworICA8bWV0aG9kLXNlbGVjdG9ycz4KKyAgICA8bWV0aG9kLXNlbGVjdG9yPgorICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Zm9vKCk8L3NjcmlwdD4KKyAgICA8L21ldGhvZC1zZWxlY3Rvcj4KKyAgICA8bWV0aG9kLXNlbGVjdG9yPgorICAgICAgPHNlbGVjdG9yLWNsYXNzIG5hbWU9IlNlbGVjdG9yQ2xhc3MiIHByaW9yaXR5PSIzIiAvPgorICAgIDwvbWV0aG9kLXNlbGVjdG9yPgorICA8L21ldGhvZC1zZWxlY3RvcnM+CisKKyAgPHBhcmFtZXRlciBuYW1lPSJmaXJzdC1uYW1lIiB2YWx1ZT0iQ2VkcmljIiAvPgorICA8cGFyYW1ldGVyIG5hbWU9InN1aXRlUGFyYW1ldGVyIiB2YWx1ZT0ic3VpdGVQYXJhbWV0ZXJWYWx1ZSIgLz4KKworICA8c3VpdGUtZmlsZXM+CisgICAgPHN1aXRlLWZpbGUgcGF0aD0iLi9qdW5pdC1zdWl0ZS54bWwiIC8+CisgIDwvc3VpdGUtZmlsZXM+CisKKyAgPGdyb3Vwcz4KKyAgICA8ZGVmaW5lIG5hbWU9ImJpZ1N1aXRlIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9InN1aXRlMSIgLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9InN1aXRlMiIgLz4KKyAgICA8L2RlZmluZT4KKyAgICA8cnVuPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iZXhjbHVkZVRoaXNHcm91cCIgLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImluY2x1ZGVUaGlzR3JvdXAiIC8+CisgICAgPC9ydW4+Cis8IS0tIAorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICA8Z3JvdXAgbmFtZT0iYSIgZGVwZW5kcy1vbj0iYiIgLz4KKyAgICAgIDxncm91cCBuYW1lPSJjIiBkZXBlbmRzLW9uPSJkIiAvPgorICAgIDwvZGVwZW5kZW5jaWVzPgorIC0tPgorICAgPC9ncm91cHM+CisKKyAgPGxpc3RlbmVycz4KKyAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0iY29tLmJldXN0Lkxpc3RlbmVyMSIgLz4KKyAgICA8bGlzdGVuZXIgY2xhc3MtbmFtZT0iY29tLmJldXN0Lkxpc3RlbmVyMiIgLz4KKyAgPC9saXN0ZW5lcnM+CisKKyAgPHBhY2thZ2VzPgorICAgIDxwYWNrYWdlIG5hbWU9ImNvbS5leGFtcGxlMSIgLz4KKyAgICA8cGFja2FnZSBuYW1lPSJjb20uZXhhbXBsZTIiIC8+CisgIDwvcGFja2FnZXM+CisKKyAgPHRlc3QgbmFtZT0iTm9wYWNrYWdlIiBhbGxvdy1yZXR1cm4tdmFsdWVzPSJ0cnVlIiB0aHJlYWQtY291bnQ9IjQyIj4KKyAgICA8Z3JvdXBzPgorICAgICAgPGRlZmluZSBuYW1lPSJldmVub2RkIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iZXZlbiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib2RkIiAvPgorICAgICAgPC9kZWZpbmU+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJub3BhY2thZ2UiLz4KKyAgICAgIDwvcnVuPgorCSAgICA8ZGVwZW5kZW5jaWVzPgorCSAgICAgIDxncm91cCBuYW1lPSJlIiBkZXBlbmRzLW9uPSJmIiAvPgorCSAgICAgIDxncm91cCBuYW1lPSJnIiBkZXBlbmRzLW9uPSJoIiAvPgorCSAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L2dyb3Vwcz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJOb1BhY2thZ2VUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24xIiA+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxkZWZpbmUgbmFtZT0iZXZlbm9kZCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImV2ZW4iIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9kZCIgLz4KKyAgICAgIDwvZGVmaW5lPgorICAgICAgPHJ1bj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iZXhjbHVkZVRoaXNHcm91cCIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorCisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlBhcmFtZXRlclNhbXBsZSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuUGFyYW1ldGVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LlRlc3QxIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuVGVzdDIiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5DdG9yQ2FsbGVkT25jZSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmV4cGVjdGVkZXhjZXB0aW9ucy5FeHBlY3RlZEV4Y2VwdGlvbnNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYWNjZXNzLlByaXZhdGVBY2Nlc3NDb25maWd1cmF0aW9uTWV0aG9kcyIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmV4cGVjdGVkZXhjZXB0aW9ucy5XcmFwcGVkRXhwZWN0ZWRFeGNlcHRpb25UZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucGFyYW1ldGVycy5PcHRpb25hbFBhcmFtZXRlclRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuUGFyYW1Jbmhlcml0YW5jZVRlc3QiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJCdWcxNzMiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGVzdG5nMTczLlRlc3RORzE3M1Rlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLWFubmNvbnYueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1hbm5jb252LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI1MDlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1hbm5jb252LnhtbApAQCAtMCwwICsxLDE0IEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vYmV1c3QuY29tL3Rlc3RuZy90ZXN0bmctMS4wLmR0ZCIgPgorICAKKzxzdWl0ZSBuYW1lPSJDb252ZXJ0ZXIiIHZlcmJvc2U9IjMiIHBhcmFsbGVsPSJmYWxzZSI+CisgIAorICAgIDx0ZXN0IG5hbWU9IkFubm90YXRpb25Db252ZXJ0ZXIiPgorICAgIDxwYXJhbWV0ZXIgbmFtZT0ic291cmNlLWRpcmVjdG9yeSIgdmFsdWU9InNyYy90ZXN0L3NhbXBsZSIgLz4KKyAgICA8Y2xhc3Nlcz4KKyAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb252ZXJ0ZXIuQW5ub3RhdGlvbkNvbnZlcnRlclRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICAgIDwvdGVzdD4KKworCis8L3N1aXRlPgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLWFudC54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLWFudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctYW50LnhtbApAQCAtMCwwICsxLDEwIEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPg0KKyAgDQorPHN1aXRlIG5hbWU9IlN1aXRlbmFtZSBmcm9tIHhtbCIgdmVyYm9zZT0iMSIgcGFyYWxsZWw9ImZhbHNlIiB0aHJlYWQtY291bnQ9IjIiPg0KKyAgDQorICA8dGVzdCBuYW1lPSJUZXN0TmFtZSI+DQorICAgIDxjbGFzc2VzPg0KKyAgICAgIDxjbGFzcyBuYW1lPSJOb1BhY2thZ2VUZXN0IiAvPg0KKyAgICA8L2NsYXNzZXM+DQorICA8L3Rlc3Q+DQorPC9zdWl0ZT4NCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLWNvbmZpZ2ZhaWx1cmUueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1jb25maWdmYWlsdXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ2YTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1jb25maWdmYWlsdXJlLnhtbApAQCAtMCwwICsxLDkgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+CisKKzxzdWl0ZSBuYW1lPSJUZXN0TkciIHZlcmJvc2U9IjAiPgorICAgIDx0ZXN0IG5hbWU9IkNvbmZpZyBGYWlsdXJlIFBvbGljeSI+CisgICAgICAgIDxjbGFzc2VzPgorICAgICAgICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kuQ2xhc3NXaXRoRmFpbGVkQmVmb3JlTWV0aG9kQW5kTXVsdGlwbGVUZXN0cyIgLz4KKyAgICAgICAgPC9jbGFzc2VzPgorICAgIDwvdGVzdD4KKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLW1ldGhvZHNlbGVjdG9ycy54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLW1ldGhvZHNlbGVjdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0ZDc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctbWV0aG9kc2VsZWN0b3JzLnhtbApAQCAtMCwwICsxLDggQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIj4KKzxzdWl0ZSBuYW1lPSJTYW1wbGUgU3VpdGUiPgorICA8dGVzdCB2ZXJib3NlPSIxIiBuYW1lPSJTYW1wbGUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kc2VsZWN0b3JzLlNhbXBsZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1vdmVycmlkZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLW92ZXJyaWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhkMmNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1vdmVycmlkZS54bWwKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvdGVzdG5nLTEuMC5kdGQiID4KKyAgCis8c3VpdGUgbmFtZT0iSmFyVGVzdFN1aXRlIiB2ZXJib3NlPSIwIj4KKworCisgIDx0ZXN0IG5hbWU9IkphclRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuamFyLkEiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5qYXIuQiIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctcGFja2FnZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLXBhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmY2VlODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLXBhY2thZ2UueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL3Rlc3RuZy0xLjAuZHRkIiA+CisgIAorPHN1aXRlIG5hbWU9IlNpbmdsZVN1aXRlIiB2ZXJib3NlPSIyIiBwYXJhbGxlbD0iZmFsc2UiIHRocmVhZC1jb3VudD0iNCIKKyAgICBkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudD0iMyI+CisKKyAgPHRlc3QgbmFtZT0iTmVzdGVkIiA+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InVuaXR0ZXN0IiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisKKyAgICA8cGFja2FnZXM+CisgICAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0Lm5lc3RlZC4qIi8+CisgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorCis8L3N1aXRlPgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLXJlbW90ZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLXJlbW90ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MDMxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctcmVtb3RlLnhtbApAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vYmV1c3QuY29tL3Rlc3RuZy90ZXN0bmctMS4wLmR0ZCIgPgorICAKKzxzdWl0ZSBuYW1lPSJSZW1vdGUiIHZlcmJvc2U9IjAiPgorCisgIDx0ZXN0IG5hbWU9IlJlbW90ZVRlc3QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucmVtb3RlLlJlbW90ZVNhbXBsZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQ0OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW5nbGUueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL3Rlc3RuZy0xLjAuZHRkIiA+CisgIAorPHN1aXRlIG5hbWU9IlNpbmdsZVN1aXRlIiB2ZXJib3NlPSIyIiBwYXJhbGxlbD0iZmFsc2UiIHRocmVhZC1jb3VudD0iNCIKKyAgICBkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudD0iMyI+CisKKyAgPHBhcmFtZXRlciBuYW1lPSJuIiB2YWx1ZT0iNDIiIC8+CisKKyAgPHRlc3QgbmFtZT0iUmVncmVzc2lvbjIiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIj4KKyAgICA8cGFyYW1ldGVyIG5hbWU9InN0cmluZyIgdmFsdWU9InMiLz4KKworICAgIDxncm91cHM+CisgICAgPC9ncm91cHM+CisKKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1hbm5vdGF0aW9uLk1Bbm5vdGF0aW9uU2FtcGxlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW5nbGUueWFtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiZTYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlLnlhbWwKQEAgLTAsMCArMSwxMiBAQAorbmFtZTogU2luZ2xlU3VpdGUKK3ZlcmJvc2U6IDIKKwordGVzdHM6CisgIC0gbmFtZTogVGVzdDEKKyAgICBleGNsdWRlZEdyb3VwczogWyBleGNsdWRlVGhpc0dyb3VwIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSBuYW1lOiB0ZXN0LmRlcGVuZGVudC54bWwuR3JvdXBEZXBlbmRlbmN5VGVzdAorIyAgICAgICAgaW5jbHVkZWRNZXRob2RzOiBbIGEgXQorIyAgICAgIC0gdGVzdC5UZXN0MgorIyAgICAgIC0gbmFtZTogdGVzdC5Db21tYW5kTGluZVRlc3QKKyMgICAgICAgIGluY2x1ZGVkTWV0aG9kczogWyBqdW5pdFBhcnNpbmcgXQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW5nbGUyLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzOGRjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmctc2luZ2xlMi54bWwKQEAgLTAsMCArMSwyMyBAQAorPHN1aXRlIG5hbWU9IlRpbWVvdXQgVGVzdHMiIHZlcmJvc2U9IjIiPgorCisgIDx0ZXN0IG5hbWU9IlRpbWVvdXRUZXN0IiB0aW1lLW91dD0iMTAwMCI+CisgICAgICA8Y2xhc3Nlcz4KKyAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50aW1lb3V0LlRlc3RUaW1lT3V0U2FtcGxlVGVzdCI+CisgICAgICAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRpbWVvdXRUZXN0Ii8+CisgICAgICAgICAgICAgIDwvbWV0aG9kcz4KKyAgICAgICAgICA8L2NsYXNzPgorICAgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iTm9UaW1lb3V0VGVzdCI+CisgICAgICA8Y2xhc3Nlcz4KKyAgICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50aW1lb3V0LlRlc3RUaW1lT3V0U2FtcGxlVGVzdCI+CisgICAgICAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRpbWVvdXRUZXN0Ii8+CisgICAgICAgICAgICAgIDwvbWV0aG9kcz4KKyAgICAgICAgICA8L2NsYXNzPgorICAgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisgICAgCis8L3N1aXRlPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW5nbGUyLnlhbWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nLXNpbmdsZTIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ1OGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy1zaW5nbGUyLnlhbWwKQEAgLTAsMCArMSw0OCBAQAorbmFtZTogU2luZ2xlU3VpdGUKK3ZlcmJvc2U6IDIKK3BhcmFsbGVsOiBmYWxzZQordGhyZWFkQ291bnQ6IDQKK2RhdGFQcm92aWRlclRocmVhZENvdW50OiAzCisKK3BhY2thZ2VzOgorICAtIG5hbWU6IHRlc3QudGVzdG5nMzU1Lm9yZy5hcGFjaGUudGFwZXN0cnk1CisgICAgaW5jbHVkZTogW0ZvbywgRm9vMl0KKyAgICBleGNsdWRlOiBbQmFyXQorICAtIG5hbWU6IHRlc3QudGVzdG5nMzU1Lm9yZy5hcGFjaGUudGFwZXN0cnk1LmRvbQorCitsaXN0ZW5lcnM6CisgIC0gdGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXIuTXlMaXN0ZW5lcgorCitwYXJhbWV0ZXJzOiB7IG46IDQyLCBwOiAxMCwgczogImEgYiBjIiwgdDogImEsYiIgfQorCittZXRob2RTZWxlY3RvcnM6CisgIC0gY2xhc3NOYW1lOiBvcmcudGVzdG5nLmludGVybmFsLlhtbE1ldGhvZFNlbGVjdG9yCisgICAgcHJpb3JpdHk6IDEKKyAgLSBleHByZXNzaW9uOiBncm91cHMuY29udGFpbnNLZXkoInRlc3QxIikKKyAgICBsYW5ndWFnZTogYmVhbnNoZWxsCisgICAgCit0ZXN0czoKKyAgLSBuYW1lOiBUZXN0MworICAgIGluY2x1ZGVkR3JvdXBzOiBbQSwgQl0KKyAgICBleGNsdWRlZEdyb3VwczogW0MsIERdCisgICAgbWV0YUdyb3VwczogeyBhOiBbIGIsIGRdIH0KKyAgICBwYWNrYWdlczogWyBjb20uZXhhbXBsZTEsIGNvbS5leGFtcGxlMiBdCisgICAgcGFyYW1ldGVyczogeyBuOiA0MywgejogZm9vIH0KKyAgICBtZXRob2RTZWxlY3RvcnM6CisgICAgICAtIGNsYXNzTmFtZTogb3JnLnRlc3RuZy5pbnRlcm5hbC5YbWxNZXRob2RTZWxlY3RvcgorICAgICAgICBwcmlvcml0eTogMQorICAgICAgLSBleHByZXNzaW9uOiBncm91cHMuY29udGFpbnNLZXkoInRlc3QxIikKKyAgICAgICAgbGFuZ3VhZ2U6IGJlYW5zaGVsbAorCisgIC0gbmFtZTogVGVzdDEKKyAgICBjbGFzc2VzOgorICAgICAgLSBuYW1lOiB0ZXN0LnRtcC5BCisgICAgICAgIGluY2x1ZGVkTWV0aG9kczogW3Rlc3QxLCB0ZXN0Ml0KKyAgICAgICAgZXhjbHVkZWRNZXRob2RzOiBbdGVzdDNdCisgICAgICAtIHRlc3QudG1wLkIKKworICAtIG5hbWU6IFRlc3QyCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC50bXAuQgorCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmcueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZWU2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmcueG1sCkBAIC0wLDAgKzEsNzY2IEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPgorCis8c3VpdGUgbmFtZT0iVGVzdE5HIiB2ZXJib3NlPSIxIiBwYXJhbGxlbD0iZmFsc2UiIHRocmVhZC1jb3VudD0iMiIKKyAgICBkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudD0iMyI+CisKKyAgPHN1aXRlLWZpbGVzPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vanVuaXQtc3VpdGUueG1sIiAvPgorICAgIDxzdWl0ZS1maWxlIHBhdGg9Ii4vcGFyZW50LW1vZHVsZS1zdWl0ZS54bWwiIC8+CisgIDwvc3VpdGUtZmlsZXM+CisKKyAgPHRlc3QgbmFtZT0iTm9wYWNrYWdlIj4KKyAgICA8Z3JvdXBzPgorICAgICAgPHJ1bj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ibm9wYWNrYWdlIi8+CisgICAgICA8L3J1bj4KKyAgICA8L2dyb3Vwcz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJOb1BhY2thZ2VUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDxwYXJhbWV0ZXIgbmFtZT0iZmlyc3QtbmFtZSIgdmFsdWU9IkNlZHJpYyIgLz4KKworICA8dGVzdCBuYW1lPSJSZWdyZXNzaW9uMSIgPgorICAgIDxncm91cHM+CisgICAgICA8ZGVmaW5lIG5hbWU9ImV2ZW5vZGQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJldmVuIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvZGQiIC8+CisgICAgICA8L2RlZmluZT4KKyAgICAgIDxydW4+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImV4Y2x1ZGVUaGlzR3JvdXAiIC8+CisgICAgICA8L3J1bj4KKyAgICA8L2dyb3Vwcz4KKworICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucGFyYW1ldGVycy5QYXJhbWV0ZXJTYW1wbGUiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlBhcmFtZXRlclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5UZXN0MSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LlRlc3QyIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuQ3RvckNhbGxlZE9uY2UiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5leHBlY3RlZGV4Y2VwdGlvbnMuRXhwZWN0ZWRFeGNlcHRpb25zVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmFjY2Vzcy5Qcml2YXRlQWNjZXNzQ29uZmlndXJhdGlvbk1ldGhvZHMiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5leHBlY3RlZGV4Y2VwdGlvbnMuV3JhcHBlZEV4cGVjdGVkRXhjZXB0aW9uVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnBhcmFtZXRlcnMuT3B0aW9uYWxQYXJhbWV0ZXJUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlBhcmFtSW5oZXJpdGFuY2VUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iUmVncmVzc2lvbjIiPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJicm9rZW4iIC8+CisgICAgICA8L3J1bj4KKyAgICA8L2dyb3Vwcz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LlRlc3QxIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuTWV0aG9kVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbXBsZS5BZnRlckNsYXNzQ2FsbGVkQXRFbmQiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LkdyYXBoVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuRHluYW1pY0dyYXBoVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucHJpdmF0ZW1ldGhvZC5Qcml2YXRlTWV0aG9kVGVzdCRQcml2YXRlTWV0aG9kSW5uZXJUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tdWx0aXBsZS5UZXN0TXVsdGlwbGUiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LkNsYXNzQ29uZmlndXJhdGlvbnMiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmFsd2F5c3J1bi5BbHdheXNSdW5UZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25mZmFpbHVyZS5Db25maWd1cmF0aW9uRmFpbHVyZSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnN1cGVyY2xhc3MuTWFpblRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zdXBlcmNsYXNzLlRlc3QzIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFpbHVyZXMuRmFpbHVyZXNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWFubm90YXRpb24uTUFubm90YXRpb25TYW1wbGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWFubm90YXRpb24uTUFubm90YXRpb24yU2FtcGxlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5GYWN0b3J5VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5TZXF1ZW50aWFsVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5QYXJhbGxlbFRlc3RUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLkRhdGFQcm92aWRlclRocmVhZFBvb2xTaXplVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5NdWx0aVRocmVhZGVkRGVwZW5kZW50VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5UcnVlUGFyYWxsZWxUZXN0IiAvPgorPCEtLQorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlBhcmFsbGVsU3VpdGVUZXN0Ii8+CistLT4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNpbXBsZS5JbmNsdWRlZEV4Y2x1ZGVkVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnJlcG9ydHMuUmVwb3J0VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmFubm90YXRpb250cmFuc2Zvcm1lci5Bbm5vdGF0aW9uVHJhbnNmb3JtZXJUZXN0IiAvPgorPCEtLSAKKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmphci5KYXJUZXN0IiAvPgorIC0tPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QueG1sLlhtbFZlcmlmeVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXIuSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRlc3RuZzI0OS5WZXJpZnlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmcxOTUuQWZ0ZXJNZXRob2RUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucmVncmVzc2lvbi5CZWZvcmVUZXN0RmFpbGluZ1Rlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRlc3RuZzI4NS5UZXN0TkcyODVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFpbGVkcmVwb3J0ZXIuRmFpbGVkUmVwb3J0ZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYXR0cmlidXRlcy5BdHRyaWJ1dGVUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC52ZXJpZnkuVmVyaWZ5VGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYWJzdHJhY3Rjb25mbWV0aG9kLkMiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wcmVzZXJ2ZW9yZGVyLlByZXNlcnZlT3JkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuU2VyaWFsaXphdGlvblRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5Db3VudFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5yZW1vdGUuUmVtb3RlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LkVjbGlwc2VUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuUmVwb3J0ZXJBcGlUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYWJzdHJhY3RtZXRob2RzLkFic3RyYWN0VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm92ZXJyaWRlLk92ZXJyaWRlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnByaW9yaXR5LlByaW9yaXR5VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lk5lc3RlZFN0YXRpY1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5ncm91cGludm9jYXRpb24uR3JvdXBTdWl0ZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5TdGF0aWNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2VydmljZWxvYWRlci5TZXJ2aWNlTG9hZGVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbW1hbmRsaW5lLkNvbW1hbmRMaW5lT3ZlcnJpZGVzWG1sIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuamFzb24uTWFpblRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5idWc5MC5CdWc5MFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5idWc5Mi5CdWc5MlRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5SZXR1cm5WYWx1ZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5ncm91cGJ1Zy5Hcm91cEJ1Z1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlNoYWRvd1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5wYXJhbWV0ZXJzLlBhcmFtZXRlck92ZXJyaWRlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnJlcG9ydHMuRmFpbGVkUmVwb3J0ZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucmVwb3J0cy5SZXBvcnRlckxvZ1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmczODcuVGVzdE5HMzg3Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iVGhyZWFkcyI+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJyb2tlbiIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLlRocmVhZFBvb2xTaXplVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5UaHJlYWRQb29sU2l6ZVdpdGhUaW1lT3V0VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5UaHJlYWRUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ikxpc3RlbmVycyI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5saXN0ZW5lcnMuRW5kTWlsbGlzU2hvdWxkTm90QmVaZXJvVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubGlzdGVuZXJzLkxpc3RlbmVyVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubGlzdGVuZXJzLlN1aXRlQW5kSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmxpc3RlbmVycy5TdWl0ZUFuZENvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5saXN0ZW5lcnMuTGlzdGVuZXJJblhtbFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5saXN0ZW5lcnMuRXhlY3V0aW9uTGlzdGVuZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubGlzdGVuZXJzLkNvbmZpZ3VyYXRpb25MaXN0ZW5lclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tdWx0aXBsZWxpc3RlbmVycy5UZXN0TWFrZXIiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iSW5qZWN0aW9uIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmluamVjdC5JbmplY3RUZXN0Q29udGV4dFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmluamVjdC5JbmplY3RCZWZvcmVNZXRob2RUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5pbmplY3QuSW5qZWN0VGVzdFJlc3VsdFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5pbmplY3QuSW5qZWN0RGF0YVByb3ZpZGVyVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW5qZWN0Lk5vSW5qZWN0aW9uVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8IS0tICBLZWVwIHRoaXMgaW4gaXRzIG93biA8dGVzdD4gdGFnIC0tPgorICA8dGVzdCBuYW1lPSJCZWZvcmVNZXRob2QiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5CZWZvcmVNZXRob2RUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkJhc2ljIiA+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW1wbGUuQmFzaWMyIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FtcGxlLkJhc2ljMSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lk1pc2MiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iRXhjbHVzaW9uIj4KKyAgICA8Z3JvdXBzPgorICAgICAgPHJ1bj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iZXhjbHVkZVRoaXNHcm91cCIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuVGVzdDIiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iRGVwZW5kZW50cyI+CisgICAgPHBhcmFtZXRlciBuYW1lPSJmb28iIHZhbHVlPSJDZWRyaWMiIC8+CisgICAgPGNsYXNzZXM+Cis8IS0tCisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuTWlzc2luZ0dyb3VwVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5NaXNzaW5nTWV0aG9kVGVzdCIgLz4KKy0tPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50Lk9yZGVyTWV0aG9kVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5EZXBlbmRlbnRUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50LlNhbXBsZURlcGVuZGVudFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuU2FtcGxlRGVwZW5kZW50TWV0aG9kcyIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5TYW1wbGVEZXBlbmRlbnRNZXRob2RzMyIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5TYW1wbGVEZXBlbmRlbnRDb25maWd1cmF0aW9uTWV0aG9kcyIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5DbGFzc0RlcGVuZHNPbkdyb3VwcyIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50LkRlcGVuZGVudEFsd2F5c1J1blRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuTXVsdGlHcm91cFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuSW1wbGljaXRHcm91cEluY2x1c2lvblRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuQ2xhc3NXaWRlMVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuQ2xhc3NXaWRlMlRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRlbnQuRGVwQnVnU2FtcGxlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRlcGVuZGVudC5EZXBCdWdWZXJpZnlUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50LkRlcGVuZHNPblByb3RlY3RlZE1ldGhvZFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kZXBlbmRzb25ncm91cC5EZXBlbmRzT25Hcm91cHNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50Lkdyb3VwQnlJbnN0YW5jZXNUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50LnhtbC5Hcm91cERlcGVuZGVuY3lUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGVwZW5kZW50LkRlcGVuZGVuY3lGaXhUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iSW5oZXJpdGFuY2UiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuU2FtcGxlSW5oZXJpdGFuY2UiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5pbmhlcml0YW5jZS5DbGFzc1Njb3BlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmluaGVyaXRhbmNlLnRlc3RuZzczOS5UZXN0Tkc3MzkiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmluaGVyaXRhbmNlLnRlc3RuZzIzNC5Qb2x5bW9ycGhpY0ZhaWx1cmVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW5oZXJpdGFuY2UudGVzdG5nNDcxLlRlc3RORzQ3MSIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8IS0tIFRlc3Qgc2NvcGVzIC0tPgorCisgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyIiB2YWx1ZT0ib3V0IiAvPgorCisgIDx0ZXN0IG5hbWU9IlRlc3Qgb3V0ZXIgc2NvcGUiPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvdXRlci1ncm91cCIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Quc2FtcGxlLlNjb3BlIiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlRlc3QgaW5uZXIgc2NvcGUiPgorICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyIiB2YWx1ZT0iaW4iIC8+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImlubmVyLWdyb3VwIiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW1wbGUuU2NvcGUiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNhbXBsZS5BZnRlckNsYXNzQ2FsbGVkQXRFbmQiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJUcmlhbmdsZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50cmlhbmdsZS5DaGlsZDEiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50cmlhbmdsZS5DaGlsZDIiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPCEtLSBub3RlIHRoYXQgQ2hlY2tUcmlhbmdlUG9zdCBtdXN0IGJlIHJ1biBzZXF1ZW50aWFsbHkgYWZ0ZXIgVHJpYW5nbGUtLT4KKyAgPHRlc3QgbmFtZT0iQ2hlY2tUcmlhbmdsZVBvc3QiPgorICAgIDxwYXJhbWV0ZXIgbmFtZT0iZXhwZWN0ZWQtY2FsbHMiIHZhbHVlPSIyIiAvPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudHJpYW5nbGUuQ2hlY2tDb3VudCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDwhLS0gVGVzdCB0aGF0IHdlIGNhbiBkZWNsYXJlIGdyb3VwcyBhbmQgZGVwZW5kZW50cyBvbiBjbGFzc2VzIC0tPgorCisgIDx0ZXN0IG5hbWU9IlRlc3QgY2xhc3MgZ3JvdXBzIDEiID4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNsYXNzZ3JvdXAuU2Vjb25kIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY2xhc3Nncm91cC5GaXJzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICAgIDx0ZXN0IG5hbWU9IlRlc3QgY2xhc3MgZ3JvdXBzIDIiID4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNsYXNzZ3JvdXAuRmlyc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jbGFzc2dyb3VwLlNlY29uZCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnktcGFyYW0iIHZhbHVlPSJGYWN0b3J5UGFyYW0iIC8+CisgIDx0ZXN0IG5hbWU9IkZhY3RvcnkiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFjdG9yeS5GYWN0b3J5VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuVmVyaWZ5RmFjdG9yeVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LkZhY3RvcnlJblNlcGFyYXRlQ2xhc3MiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LkZhY3RvcnkyVGVzdCIgLz4KKworICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFjdG9yeS5GYWN0b3J5V2l0aEluc3RhbmNlSW5mb1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LlZlcmlmeUZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuVGVzdENsYXNzQW5ub3RhdGlvblRlc3QiIC8+CisKKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFjdG9yeS5GYWN0b3J5T3JkZXJNYWluVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuRmFjdG9yeUZhaWx1cmVUZXN0IiAvPgorCisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LkZhY3RvcnlJblN1cGVyQ2xhc3NUZXN0IiAvPgorCisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LmNsYXNzY29uZi5YQ2xhc3NPcmRlcldpdGhGYWN0b3J5VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuRmFjdG9yeUludGVybGVhdmluZ1Rlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmZhY3RvcnkuRmFjdG9yeURhdGFQcm92aWRlclRlc3QiLz4KKworICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFjdG9yeS5EaXNhYmxlZEZhY3RvcnlUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWN0b3J5LkZhY3RvcnlBbmRUZXN0TWV0aG9kVGVzdCIgLz4KKworICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZmFjdG9yeS5GYWN0b3J5SW50ZWdyYXRpb25UZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlRpbWVPdXQiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGltZW91dC5UaW1lT3V0VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRpbWVvdXQuVGltZU91dEZyb21YbWxUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50aW1lb3V0LlRpbWVPdXRJbnRlZ3JhdGlvblRlc3QiLz4KKzwhLS0KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRpbWVvdXQuVGltZU91dFRocmVhZExvY2FsU2FtcGxlVGVzdCIvPgorLS0+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iSW52b2NhdGlvbkNvdW50Ij4KKyAgICA8cGFyYW1ldGVyIG5hbWU9ImNvdW50IiB2YWx1ZT0iMTAiIC8+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5JbnZvY2F0aW9uQW5kU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW52b2NhdGlvbmNvdW50LkZhaWxlZEludm9jYXRpb25Db3VudFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5pbnZvY2F0aW9uY291bnQuRmlyc3RBbmRMYXN0VGltZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPCEtLSBUZXN0cyBmb3IgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIG1ldGhvZHMgLS0+CisgIDx0ZXN0IG5hbWU9Ik1ldGhvZDEiPgorICAgIDxjbGFzc2VzPgorICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RzLlNhbXBsZU1ldGhvZDEiPgorICAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2hvdWxkUnVuMSIgLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNob3VsZFJ1bjIiIC8+CisgICAgICAgICAgPC9tZXRob2RzPgorICAgICAgICA8L2NsYXNzPgorICAgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1ldGhvZHMuVmVyaWZ5TWV0aG9kMSIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJNZXRob2QyIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kcy5TYW1wbGVNZXRob2QxIj4KKyAgICAgICAgICA8bWV0aG9kcz4KKyAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9InNob3VsZE5vdFJ1bjEiIC8+CisgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJzaG91bGROb3RSdW4yIiAvPgorICAgICAgICAgIDwvbWV0aG9kcz4KKyAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kcy5WZXJpZnlNZXRob2QxIiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ik1ldGhvZDMiPgorICAgIDxjbGFzc2VzPgorICAgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RzLlNhbXBsZU1ldGhvZDEiPgorICAgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iLipOb3QuKiIgLz4KKyAgICAgICAgICA8L21ldGhvZHM+CisgICAgICAgIDwvY2xhc3M+CisgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1ldGhvZHMuVmVyaWZ5TWV0aG9kMSIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJPYmplY3QgZmFjdG9yeSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5vYmplY3RmYWN0b3J5LkN1c3RvbUZhY3RvcnlUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3Qub2JqZWN0ZmFjdG9yeS5Db21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm9iamVjdGZhY3RvcnkuT2JqZWN0RmFjdG9yeTJUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPCEtLSBUZXN0IHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdG9ycyAtLT4KKyAgPHBhcmFtZXRlciBuYW1lPSJzdHJpbmciIHZhbHVlPSJDZWRyaWMiIC8+CisgIDxwYXJhbWV0ZXIgbmFtZT0iaW50IiB2YWx1ZT0iNDIiIC8+CisgIDxwYXJhbWV0ZXIgbmFtZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiIC8+CisgIDxwYXJhbWV0ZXIgbmFtZT0iYnl0ZSIgdmFsdWU9IjQzIiAvPgorICA8cGFyYW1ldGVyIG5hbWU9ImNoYXIiIHZhbHVlPSJjIiAvPgorICA8cGFyYW1ldGVyIG5hbWU9ImRvdWJsZSIgdmFsdWU9IjQ0LjAiIC8+CisgIDxwYXJhbWV0ZXIgbmFtZT0iZmxvYXQiIHZhbHVlPSI0NS4wIiAvPgorICA8cGFyYW1ldGVyIG5hbWU9ImxvbmciIHZhbHVlPSI0NiIgLz4KKyAgPHBhcmFtZXRlciBuYW1lPSJzaG9ydCIgdmFsdWU9IjQ3IiAvPgorCisgIDx0ZXN0IG5hbWU9IlBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdG9ycyI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5QYXJhbWV0ZXJDb25zdHJ1Y3RvclRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iRXhjbHVkZWQgbWV0aG9kcyIgPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJncm91cDEiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Imdyb3VwMiIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuRXhjbHVkZSI+CisgICAgPG1ldGhvZHM+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iZXhjbHVkZWQxIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImV4Y2x1ZGVkMiIgLz4KKyAgICA8L21ldGhvZHM+CisgICAgICA8L2NsYXNzPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlBhcmFtZXRlcnMgaW4gaW5pdCAxIj4KKyAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtIiB2YWx1ZT0idmFsdWUxIi8+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25XaXRoUGFyYW1ldGVycyIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlBhcmFtZXRlcnMgaW4gaW5pdCAyIj4KKyAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbSIgdmFsdWU9InZhbHVlMiIvPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uV2l0aFBhcmFtZXRlcnMiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJJbmRpdmlkdWFsIG1ldGhvZCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5JbmRpdmlkdWFsTWV0aG9kc1Rlc3QiPgorICAgICAgICA8bWV0aG9kcz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0TWV0aG9kIi8+CisgICAgICAgIDwvbWV0aG9kcz4KKyAgICAgIDwvY2xhc3M+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iTWV0aG9kIGluaGVyaXRhbmNlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmluaGVyaXRhbmNlLkRDaGlsZF8yIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW5oZXJpdGFuY2UuVmVyaWZ5VGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJNZXRob2Qgc2VsZWN0b3JzIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5NZXRob2RTZWxlY3RvclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RzZWxlY3RvcnMuQmVhblNoZWxsVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5Db21tYW5kTGluZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RzZWxlY3RvcnMuTWV0aG9kU2VsZWN0b3JJblN1aXRlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJUZXN0IG9yZGVyIGludm9jYXRpb24iPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW50ZXJsZWF2ZWRvcmRlci5JbnRlcmxlYXZlZEludm9jYXRpb25UZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkRhdGFQcm92aWRlciI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kYXRhcHJvdmlkZXIuU2FtcGxlMVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kYXRhcHJvdmlkZXIuSXRlcmFibGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLkNvbmZpZ3VyYXRpb25BbmREYXRhUHJvdmlkZXJzVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5Cb29sZWFuVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5FeHBsaWNpdERhdGFQcm92aWRlck5hbWVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLk1ldGhvZFRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5TdGF0aWNEYXRhUHJvdmlkZXJTYW1wbGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLlVubmFtZWREYXRhUHJvdmlkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLlRlc3RDb250ZXh0VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5GYWlsaW5nRGF0YVByb3ZpZGVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5EYXRhUHJvdmlkZXJBc1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kYXRhcHJvdmlkZXIuVGVzdEluc3RhbmNlRmFjdG9yeSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5GYWlsZWREYXRhUHJvdmlkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLkluc3RhbmNlRGF0YVByb3ZpZGVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5GYWlsaW5nSXRlcmFibGVEYXRhUHJvdmlkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLkNsYXNzVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmRhdGFwcm92aWRlci5Jbmhlcml0ZWREYXRhUHJvdmlkZXJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLlRlc3RORzQxMVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kYXRhcHJvdmlkZXIuVmFyQXJnc0RhdGFQcm92aWRlclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5kYXRhcHJvdmlkZXIuSW5kaWNlc1Rlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iRFAiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGF0YXByb3ZpZGVyLlBhcmFsbGVsRGF0YVByb3ZpZGVyVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKyAgCisgIDx0ZXN0IG5hbWU9ImJ1ZzExMSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0MTExLlRlc3QxIiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlVuaXF1ZVN1aXRlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnVuaXF1ZXN1aXRlLlRlc3RCZWZvcmUxIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudW5pcXVlc3VpdGUuVGVzdEJlZm9yZTIiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC51bmlxdWVzdWl0ZS5UZXN0QWZ0ZXIiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iSW5oZXJpdEdyb3VwcyI+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Imdyb3VwMSIgLz4KKyAgICAgIDwvcnVuPgorICAgIDwvZ3JvdXBzPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSW5oZXJpdEdyb3Vwc1NhbXBsZVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKzwhLS0KKyAgPHRlc3QgbmFtZT0iRGlzdHJpYnV0ZWQiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZGlzdHJpYnV0ZWQuRGlzdHJpYnV0ZWRUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorLS0+CisKKyAgPHRlc3QgbmFtZT0iTmVzdGVkIiA+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InVuaXR0ZXN0IiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisKKyAgICAgPHBhY2thZ2VzPgorICAgICAgIDxwYWNrYWdlIG5hbWU9InRlc3QubmVzdGVkLioiLz4KKyAgICAgPC9wYWNrYWdlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ikhvb2thYmxlIiA+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5ob29rLkhvb2thYmxlVGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkJlZm9yZUdyb3Vwcy1BZnRlckdyb3Vwcy0xIiA+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHMxU2FtcGxlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkdyb3VwczJTYW1wbGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uR3JvdXBzM1NhbXBsZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHM0U2FtcGxlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkdyb3VwczVTYW1wbGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uR3JvdXBzNlNhbXBsZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHM3U2FtcGxlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJCZWZvcmVHcm91cHMtQWZ0ZXJHcm91cHMtMiIgPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJBIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJCIiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHM4U2FtcGxlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJKVW5pdCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5KVW5pdFRlc3QxIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuQ29tbWFuZExpbmVUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5KVW5pdDRUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDwhLS0gVGVzdE5HIGFudCB0YXNrIHJlbGF0ZWQgdGVzdHMgLS0+CisgIDx0ZXN0IG5hbWU9IkFudC1DbGFzc0ZpbGVSZXNvbHV0aW9uIiA+CisgICAgPGNsYXNzZXM+CisgICAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmFudC5UZXN0Q29tbWFuZExpbmVBcmdzIiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDwhLS0gR3JvdXAgb3JkZXJpbmcgMSAtLT4KKyAgPHRlc3QgbmFtZT0iQ2xhc3MgUnVuIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmcuQSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmcuQiIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8IS0tIEdyb3VwIG9yZGVyaW5nIDIgLS0+CisgIDx0ZXN0IG5hbWU9Ikdyb3VwcyBSdW4iPgorICAgIDxncm91cHM+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhIiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkEiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkIiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iRXh0ZXJuYWwgZ3JvdXAgaW52b2NhdGlvbiI+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxydW4+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImEiIC8+CisgICAgICA8L3J1bj4KKyAgICA8L2dyb3Vwcz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmdyb3VwaW52b2NhdGlvbi5Hcm91cENvbmZpZ3VyYXRpb24iIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5ncm91cGludm9jYXRpb24uRHVtbXlUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlNraXBFeGNlcHRpb25zIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNraXBleC5Ta2lwcGVkRXhjZXB0aW9uVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnNraXBleC5Ta2lwQW5kRXhwZWN0ZWRUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlJldHJ5QW5hbHl6ZXIiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QucmV0cnlBbmFseXplci5SZXRyeUFuYWx5emVyVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnJldHJ5QW5hbHl6ZXIuRXhpdENvZGVUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ik1ldGhvZEludGVyY2VwdG9yIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5NZXRob2RJbnRlcmNlcHRvclRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5tZXRob2RpbnRlcmNlcHRvcnMuSXNzdWUzOTJUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kaW50ZXJjZXB0b3JzLm11bHRpcGxlaW50ZXJjZXB0b3JzLk11bHRpcGxlSW50ZXJjZXB0b3JzVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJBc3NlcnRzIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcudGVzdG5nLkFzc2VydFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5hc3NlcnR0ZXN0cy5Bc3NlcnRUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYXNzZXJ0dGVzdHMuQXJyYXlFcXVhbGl0eUFzc2VydFRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iVXRpbHMiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9Im9yZy50ZXN0bmcuaW50ZXJuYWwuVXRpbHNUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkNvbmZpZ0ZhaWx1cmVQb2xpY3kiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbmZhaWx1cmVwb2xpY3kuRmFpbHVyZVBvbGljeVRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iTmVzdGVkMiI+CisgICAgPHBhY2thZ2VzPgorICAgICAgPHBhY2thZ2UgbmFtZT0idGVzdC5uZXN0ZWQyIiAvPgorICAgIDwvcGFja2FnZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJHdWljZSI+CisgICAgPHBhcmFtZXRlciBuYW1lPSJpbmplY3QiIHZhbHVlPSJndWljZSIgLz4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmd1aWNlLkd1aWNlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmd1aWNlLkd1aWNlSW5oZXJpdGFuY2VUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuZ3VpY2UuR3VpY2VNb2R1bGVGYWN0b3J5VGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJMaXN0ZW5lciBpbnZva2VycyI+CisgICAgPHBhY2thZ2VzPgorICAgICAgPHBhY2thZ2UgbmFtZT0ib3JnLnRlc3RuZy5pbnRlcm5hbC5pbnZva2VycyIvPgorICAgIDwvcGFja2FnZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJZQU1MIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnlhbWwuWWFtbFRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisgIDx0ZXN0IG5hbWU9IlhNTCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0ib3JnLnRlc3RuZy54bWwuU3VpdGVYbWxQYXJzZXJUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IlNhbml0eSBDaGVjayI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5DaGVja1Rlc3ROYW1lc1Rlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5zYW5pdHljaGVjay5DaGVja1N1aXRlTmFtZXNUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5CYXNlR3JvdXBzVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uQmVmb3JlQ2xhc3NUaHJlYWRUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5CZWZvcmVUZXN0T3JkZXJpbmdUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5FeHRlcm5hbENvbmZpZ3VyYXRpb25DbGFzcyIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5Hcm91cHNUZXN0Ii8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLk1ldGhvZENhbGxPcmRlclRlc3QiLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uTXVsdGlwbGVCZWZvcmVHcm91cFRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLlJlZmxlY3RNZXRob2RQYXJhbWV0cml6ZWRDb25maWd1cmF0aW9uTWV0aG9kVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uU3VpdGVGYWN0b3J5T25jZVRlc3QiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5jb25maWd1cmF0aW9uLlN1aXRlVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uVmVyaWZ5U3VpdGVUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29uZmlndXJhdGlvbi5TaW5nbGVDb25maWd1cmF0aW9uVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LmNvbmZpZ3VyYXRpb24uQmVmb3JlQ2xhc3NXaXRoRGlzYWJsZWRUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorICAKKyAgPHRlc3QgbmFtZT0iQnVnMTczIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRlc3RuZzE3My5UZXN0TkcxNzNUZXN0IiAvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ik11c3RhY2hlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lm11c3RhY2hlLk11c3RhY2hlVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworICA8dGVzdCBuYW1lPSJNaXhlZCI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5taXhlZC5NaXhlZFRlc3QiIC8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iSXNzdWUgMTA3Ij4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmlzc3VlMTA3Lklzc3VlMTA3VGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9IkFzc2VydGlvbiI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5hc3NlcnRpb24uQXNzZXJ0aW9uVGVzdCIvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QuYXNzZXJ0aW9uLlNvZnRBc3NlcnRUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iVEVTVE5HLTEwNiI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50ZXN0bmcxMDYuVGVzdE5HMTA2Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+CisKKyAgPHRlc3QgbmFtZT0iQFRlc3QoZW5hYmxlKSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5lbmFibGUuRW5hYmxlVGVzdCIvPgorICAgIDwvY2xhc3Nlcz4KKyAgPC90ZXN0PgorCisgIDx0ZXN0IG5hbWU9Ik5hbWUiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubmFtZS5OYW1lVGVzdCIgLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmcueWFtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmcueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZjOGRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy55YW1sCkBAIC0wLDAgKzEsMzY3IEBACituYW1lOiBUZXN0TkcKK3RocmVhZENvdW50OiAyCitwYXJhbWV0ZXJzOiB7IHNob3J0OiA0NywgcGFyYW1ldGVyOiBvdXQsIGNoYXI6IGMsIGJ5dGU6IDQzLCBmaXJzdC1uYW1lOiBDZWRyaWMsIGludDogNDIsIHN0cmluZzogQ2VkcmljLCBmYWN0b3J5LXBhcmFtOiBGYWN0b3J5UGFyYW0sIGJvb2xlYW46IHRydWUsIGxvbmc6IDQ2LCBkb3VibGU6IDQ0LjAsIGZsb2F0OiA0NS4wIH0KK3Rlc3RzOgorICAtIG5hbWU6IE5vcGFja2FnZQorICAgIGluY2x1ZGVkR3JvdXBzOiBbIG5vcGFja2FnZSBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gTm9QYWNrYWdlVGVzdAorCisgIC0gbmFtZTogUmVncmVzc2lvbjEKKyAgICBleGNsdWRlZEdyb3VwczogWyBleGNsdWRlVGhpc0dyb3VwIF0KKyAgICBtZXRhR3JvdXBzOiB7IGV2ZW5vZGQ6IFsgZXZlbiwgb2RkIF0gIH0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LnBhcmFtZXRlcnMuUGFyYW1ldGVyU2FtcGxlCisgICAgICAtIHRlc3QucGFyYW1ldGVycy5QYXJhbWV0ZXJUZXN0CisgICAgICAtIHRlc3QuVGVzdDEKKyAgICAgIC0gdGVzdC5UZXN0MgorICAgICAgLSB0ZXN0LkN0b3JDYWxsZWRPbmNlCisgICAgICAtIHRlc3QuZXhwZWN0ZWRleGNlcHRpb25zLkV4cGVjdGVkRXhjZXB0aW9uc1Rlc3QKKyAgICAgIC0gdGVzdC5hY2Nlc3MuUHJpdmF0ZUFjY2Vzc0NvbmZpZ3VyYXRpb25NZXRob2RzCisgICAgICAtIHRlc3QuZXhwZWN0ZWRleGNlcHRpb25zLldyYXBwZWRFeHBlY3RlZEV4Y2VwdGlvbgorICAgICAgLSB0ZXN0LnBhcmFtZXRlcnMuT3B0aW9uYWxQYXJhbWV0ZXJUZXN0CisKKyAgLSBuYW1lOiBSZWdyZXNzaW9uMgorICAgIGV4Y2x1ZGVkR3JvdXBzOiBbIGJyb2tlbiBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5UZXN0MQorICAgICAgLSB0ZXN0Lk1ldGhvZFRlc3QKKyAgICAgIC0gdGVzdC5zYW1wbGUuQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kCisgICAgICAtIHRlc3QuR3JhcGhUZXN0CisgICAgICAtIHRlc3QuRHluYW1pY0dyYXBoVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQmFzZUdyb3Vwc1Rlc3QKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkJlZm9yZUNsYXNzVGhyZWFkVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQmVmb3JlVGVzdE9yZGVyaW5nVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblRlc3QKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkV4dGVybmFsQ29uZmlndXJhdGlvbkNsYXNzCisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5Hcm91cHNUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5NZXRob2RDYWxsT3JkZXJUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5NdWx0aXBsZUJlZm9yZUdyb3VwVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uUmVmbGVjdE1ldGhvZFBhcmFtZXRyaXplZENvbmZpZ3VyYXRpb25NZXRob2RUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5TdWl0ZUZhY3RvcnlPbmNlVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uU3VpdGVUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5WZXJpZnlTdWl0ZVRlc3QKKyAgICAgIC0gdGVzdC5wcml2YXRlbWV0aG9kLlByaXZhdGVNZXRob2RUZXN0JFByaXZhdGVNZXRob2RJbm5lclRlc3QKKyAgICAgIC0gdGVzdC5tdWx0aXBsZS5UZXN0TXVsdGlwbGUKKyAgICAgIC0gdGVzdC5DbGFzc0NvbmZpZ3VyYXRpb25zCisgICAgICAtIHRlc3QuYWx3YXlzcnVuLkFsd2F5c1J1blRlc3QKKyAgICAgIC0gdGVzdC5jb25mZmFpbHVyZS5Db25maWd1cmF0aW9uRmFpbHVyZQorICAgICAgLSB0ZXN0LnN1cGVyY2xhc3MuTWFpblRlc3QKKyAgICAgIC0gdGVzdC5zdXBlcmNsYXNzLlRlc3QzCisgICAgICAtIHRlc3QuZmFpbHVyZXMuRmFpbHVyZXNUZXN0CisgICAgICAtIHRlc3QubWFubm90YXRpb24uTUFubm90YXRpb25TYW1wbGVUZXN0CisgICAgICAtIHRlc3QubWFubm90YXRpb24uTUFubm90YXRpb24yU2FtcGxlVGVzdAorICAgICAgLSB0ZXN0LnRocmVhZC5UaHJlYWRQb29sU2l6ZVRlc3QKKyAgICAgIC0gdGVzdC50aHJlYWQuU2VxdWVudGlhbFRlc3QKKyAgICAgIC0gdGVzdC50aHJlYWQuUGFyYWxsZWxUZXN0VGVzdAorICAgICAgLSB0ZXN0LnRocmVhZC5GYWN0b3J5VGVzdAorICAgICAgLSB0ZXN0LnRocmVhZC5EYXRhUHJvdmlkZXJUaHJlYWRQb29sU2l6ZVRlc3QKKyAgICAgIC0gdGVzdC50aHJlYWQuTXVsdGlUaHJlYWRlZERlcGVuZGVudFRlc3QKKyAgICAgIC0gdGVzdC5zaW1wbGUuSW5jbHVkZWRFeGNsdWRlZFRlc3QKKyAgICAgIC0gdGVzdC5yZXBvcnRzLlJlcG9ydFRlc3QKKyAgICAgIC0gdGVzdC5hbm5vdGF0aW9udHJhbnNmb3JtZXIuQW5ub3RhdGlvblRyYW5zZm9ybWVyVGVzdAorICAgICAgLSB0ZXN0Lmphci5KYXJUZXN0CisgICAgICAtIHRlc3QueG1sLlhtbFZlcmlmeVRlc3QKKyAgICAgIC0gdGVzdC5pbnZva2VkbWV0aG9kbGlzdGVuZXIuSW52b2tlZE1ldGhvZExpc3RlbmVyVGVzdAorICAgICAgLSB0ZXN0LnRlc3RuZzI0OS5WZXJpZnlUZXN0CisgICAgICAtIHRlc3QudGVzdG5nMTk1LkFmdGVyTWV0aG9kVGVzdAorICAgICAgLSB0ZXN0LnJlZ3Jlc3Npb24uQmVmb3JlVGVzdEZhaWxpbmdUZXN0CisgICAgICAtIHRlc3QudGVzdG5nMjg1LlRlc3RORzI4NVRlc3QKKyAgICAgIC0gdGVzdC5mYWlsZWRyZXBvcnRlci5GYWlsZWRSZXBvcnRlclRlc3QKKyAgICAgIC0gdGVzdC5hdHRyaWJ1dGVzLkF0dHJpYnV0ZVRlc3QKKyAgICAgIC0gdGVzdC52ZXJpZnkuVmVyaWZ5VGVzdAorICAgICAgLSB0ZXN0LmFic3RyYWN0Y29uZm1ldGhvZC5DCisgICAgICAtIHRlc3QuaXNzdWU3OC5Ob25QdWJsaWNDbGFzc1Rlc3QKKyAgICAgIC0gdGVzdC5saXN0ZW5lcnMuTGlzdGVuZXJUZXN0CisgICAgICAtIHRlc3QucHJlc2VydmVvcmRlci5QcmVzZXJ2ZU9yZGVyVGVzdAorICAgICAgLSB0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0CisKKyAgLSBuYW1lOiBJbmplY3Rpb24KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmluamVjdC5JbmplY3RUZXN0Q29udGV4dFRlc3QKKyAgICAgIC0gdGVzdC5pbmplY3QuSW5qZWN0QmVmb3JlTWV0aG9kVGVzdAorICAgICAgLSB0ZXN0LmluamVjdC5JbmplY3RUZXN0UmVzdWx0VGVzdAorICAgICAgLSB0ZXN0LmluamVjdC5JbmplY3REYXRhUHJvdmlkZXJUZXN0CisgICAgICAtIHRlc3QuaW5qZWN0Lk5vSW5qZWN0aW9uVGVzdAorCisgIC0gbmFtZTogQmVmb3JlTWV0aG9kCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkJlZm9yZU1ldGhvZFRlc3QKKworICAtIG5hbWU6IEZhY3RvcnkgdGVzdHMKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmZhY3RvcnkuY2xhc3Njb25mLlhDbGFzc09yZGVyV2l0aEZhY3RvcnlUZXN0CisgICAgICAtIHRlc3QuZmFjdG9yeS5GYWN0b3J5SW50ZXJsZWF2aW5nVGVzdAorCisgIC0gbmFtZTogQmFzaWMKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LnNhbXBsZS5CYXNpYzIKKyAgICAgIC0gdGVzdC5zYW1wbGUuQmFzaWMxCisgICAgICAtIHRlc3QuTWlzYworCisgIC0gbmFtZTogRXhjbHVzaW9uCisgICAgZXhjbHVkZWRHcm91cHM6IFsgZXhjbHVkZVRoaXNHcm91cCBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5UZXN0MgorCisgIC0gbmFtZTogRGVwZW5kZW50cworICAgIHBhcmFtZXRlcnM6IHsgZm9vOiBDZWRyaWMgfQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuZGVwZW5kZW50Lk1pc3NpbmdHcm91cFRlc3QKKyAgICAgIC0gdGVzdC5kZXBlbmRlbnQuTWlzc2luZ01ldGhvZFRlc3QKKyAgICAgIC0gdGVzdC5kZXBlbmRlbnQuT3JkZXJNZXRob2RUZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50LkRlcGVuZGVudFRlc3QKKyAgICAgIC0gdGVzdC5kZXBlbmRlbnQuU2FtcGxlRGVwZW5kZW50TWV0aG9kcworICAgICAgLSB0ZXN0LmRlcGVuZGVudC5TYW1wbGVEZXBlbmRlbnRNZXRob2RzMgorICAgICAgLSB0ZXN0LmRlcGVuZGVudC5TYW1wbGVEZXBlbmRlbnRNZXRob2RzMworICAgICAgLSB0ZXN0LmRlcGVuZGVudC5TYW1wbGVEZXBlbmRlbnRDb25maWd1cmF0aW9uTWV0aG9kcworICAgICAgLSB0ZXN0LmRlcGVuZGVudC5DbGFzc0RlcGVuZHNPbkdyb3VwcworICAgICAgLSB0ZXN0LmRlcGVuZGVudC5EZXBlbmRlbnRBbHdheXNSdW5UZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50Lk11bHRpR3JvdXBUZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50LkltcGxpY2l0R3JvdXBJbmNsdXNpb25UZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50LkNsYXNzV2lkZTFUZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50LkNsYXNzV2lkZTJUZXN0CisgICAgICAtIHRlc3QuZGVwZW5kZW50LkRlcEJ1Z1NhbXBsZVRlc3QKKyAgICAgIC0gdGVzdC5kZXBlbmRlbnQuRGVwQnVnVmVyaWZ5VGVzdAorICAgICAgLSB0ZXN0LmRlcGVuZGVudC5EZXBlbmRzT25Qcm90ZWN0ZWRNZXRob2RUZXN0CisgICAgICAtIHRlc3QuZGVwZW5kc29uZ3JvdXAuRGVwZW5kc09uR3JvdXBzVGVzdAorCisgIC0gbmFtZTogSW5oZXJpdGFuY2UKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LlNhbXBsZUluaGVyaXRhbmNlCisgICAgICAtIHRlc3QuaW5oZXJpdGFuY2UuQ2xhc3NTY29wZVRlc3QKKworICAtIG5hbWU6IFRlc3Qgb3V0ZXIgc2NvcGUKKyAgICBpbmNsdWRlZEdyb3VwczogWyBvdXRlci1ncm91cCBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5zYW1wbGUuU2NvcGUKKworICAtIG5hbWU6IFRlc3QgaW5uZXIgc2NvcGUKKyAgICBwYXJhbWV0ZXJzOiB7IHBhcmFtZXRlcjogaW4gfQorICAgIGluY2x1ZGVkR3JvdXBzOiBbIGlubmVyLWdyb3VwIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LnNhbXBsZS5TY29wZQorCisgIC0gbmFtZTogQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5zYW1wbGUuQWZ0ZXJDbGFzc0NhbGxlZEF0RW5kCisKKyAgLSBuYW1lOiBUcmlhbmdsZQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QudHJpYW5nbGUuQ2hpbGQxCisgICAgICAtIHRlc3QudHJpYW5nbGUuQ2hpbGQyCisKKyAgLSBuYW1lOiBDaGVja1RyaWFuZ2xlUG9zdAorICAgIHBhcmFtZXRlcnM6IHsgZXhwZWN0ZWQtY2FsbHM6IDIgfQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QudHJpYW5nbGUuQ2hlY2tDb3VudAorCisgIC0gbmFtZTogVGVzdCBjbGFzcyBncm91cHMgMQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuY2xhc3Nncm91cC5TZWNvbmQKKyAgICAgIC0gdGVzdC5jbGFzc2dyb3VwLkZpcnN0CisKKyAgLSBuYW1lOiBUZXN0IGNsYXNzIGdyb3VwcyAyCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5jbGFzc2dyb3VwLkZpcnN0CisgICAgICAtIHRlc3QuY2xhc3Nncm91cC5TZWNvbmQKKworICAtIG5hbWU6IEZhY3RvcnkKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmZhY3RvcnkuRmFjdG9yeVRlc3QKKyAgICAgIC0gdGVzdC5mYWN0b3J5LlZlcmlmeUZhY3RvcnlUZXN0CisgICAgICAtIHRlc3QuZmFjdG9yeS5GYWN0b3J5SW5TZXBhcmF0ZUNsYXNzCisgICAgICAtIHRlc3QuZmFjdG9yeS5GYWN0b3J5MlRlc3QKKyAgICAgIC0gdGVzdC5mYWN0b3J5LkZhY3RvcnlXaXRoSW5zdGFuY2VJbmZvVGVzdAorICAgICAgLSB0ZXN0LmZhY3RvcnkuVmVyaWZ5RmFjdG9yeVdpdGhJbnN0YW5jZUluZm9UZXN0CisgICAgICAtIHRlc3QuZmFjdG9yeS5UZXN0Q2xhc3NBbm5vdGF0aW9uVGVzdAorICAgICAgLSB0ZXN0LmZhY3RvcnkuRmFjdG9yeVdpdGhEYXRhUHJvdmlkZXJUZXN0CisgICAgICAtIHRlc3QuZmFjdG9yeS5GYWN0b3J5T3JkZXJNYWluVGVzdAorICAgICAgLSB0ZXN0LmZhY3RvcnkuRmFjdG9yeUZhaWx1cmVUZXN0CisgICAgICAtIHRlc3QuZmFjdG9yeS5GYWN0b3J5SW5TdXBlckNsYXNzVGVzdAorCisgIC0gbmFtZTogVGltZU91dAorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QudGltZW91dC5UaW1lT3V0VGVzdAorICAgICAgLSB0ZXN0LnRpbWVvdXQuVGltZU91dEZyb21YbWxUZXN0CisKKyAgLSBuYW1lOiBJbnZvY2F0aW9uQ291bnQKKyAgICBwYXJhbWV0ZXJzOiB7IGNvdW50OiAxMCB9CisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5JbnZvY2F0aW9uQW5kU3VjY2Vzc1BlcmNlbnRhZ2VUZXN0CisgICAgICAtIHRlc3QuaW52b2NhdGlvbmNvdW50LkZhaWxlZEludm9jYXRpb25Db3VudFRlc3QKKyAgICAgIC0gdGVzdC5pbnZvY2F0aW9uY291bnQuRmlyc3RBbmRMYXN0VGltZVRlc3QKKworICAtIG5hbWU6IE1ldGhvZDEKKyAgICBjbGFzc2VzOgorICAgICAgLSBuYW1lOiB0ZXN0Lm1ldGhvZHMuU2FtcGxlTWV0aG9kMQorICAgICAgICBpbmNsdWRlZE1ldGhvZHM6CisgICAgICAgICAgLSBzaG91bGRSdW4xCisgICAgICAgICAgLSBzaG91bGRSdW4yCisgICAgICAtIHRlc3QubWV0aG9kcy5WZXJpZnlNZXRob2QxCisKKyAgLSBuYW1lOiBNZXRob2QyCisgICAgY2xhc3NlczoKKyAgICAgIC0gbmFtZTogdGVzdC5tZXRob2RzLlNhbXBsZU1ldGhvZDEKKyAgICAgICAgZXhjbHVkZWRNZXRob2RzOgorICAgICAgICAgIC0gc2hvdWxkTm90UnVuMQorICAgICAgICAgIC0gc2hvdWxkTm90UnVuMgorICAgICAgLSB0ZXN0Lm1ldGhvZHMuVmVyaWZ5TWV0aG9kMQorCisgIC0gbmFtZTogTWV0aG9kMworICAgIGNsYXNzZXM6CisgICAgICAtIG5hbWU6IHRlc3QubWV0aG9kcy5TYW1wbGVNZXRob2QxCisgICAgICAgIGV4Y2x1ZGVkTWV0aG9kczoKKyAgICAgICAgICAtIC4qTm90LioKKyAgICAgIC0gdGVzdC5tZXRob2RzLlZlcmlmeU1ldGhvZDEKKworICAtIG5hbWU6IE9iamVjdCBmYWN0b3J5CisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5vYmplY3RmYWN0b3J5LkN1c3RvbUZhY3RvcnlUZXN0CisgICAgICAtIHRlc3Qub2JqZWN0ZmFjdG9yeS5Db21iaW5lZFRlc3RBbmRPYmplY3RGYWN0b3J5VGVzdAorCisgIC0gbmFtZTogUGFyYW1ldGVycyBmb3IgY29uc3RydWN0b3JzCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5QYXJhbWV0ZXJDb25zdHJ1Y3RvclRlc3QKKworICAtIG5hbWU6IEV4Y2x1ZGVkIG1ldGhvZHMKKyAgICBpbmNsdWRlZEdyb3VwczogWyBncm91cDEsIGdyb3VwMiBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gbmFtZTogdGVzdC5FeGNsdWRlCisgICAgICAgIGV4Y2x1ZGVkTWV0aG9kczoKKyAgICAgICAgICAtIGV4Y2x1ZGVkMQorICAgICAgICAgIC0gZXhjbHVkZWQyCisKKyAgLSBuYW1lOiBQYXJhbWV0ZXJzIGluIGluaXQgMQorICAgIHBhcmFtZXRlcnM6IHsgcGFyYW06IHZhbHVlMSB9CisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25XaXRoUGFyYW1ldGVycworCisgIC0gbmFtZTogUGFyYW1ldGVycyBpbiBpbml0IDIKKyAgICBwYXJhbWV0ZXJzOiB7IHBhcmFtOiB2YWx1ZTIgfQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uV2l0aFBhcmFtZXRlcnMKKworICAtIG5hbWU6IEluZGl2aWR1YWwgbWV0aG9kCisgICAgY2xhc3NlczoKKyAgICAgIC0gbmFtZTogdGVzdC5JbmRpdmlkdWFsTWV0aG9kc1Rlc3QKKyAgICAgICAgaW5jbHVkZWRNZXRob2RzOgorICAgICAgICAgIC0gdGVzdE1ldGhvZAorCisgIC0gbmFtZTogTWV0aG9kIGluaGVyaXRhbmNlCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5pbmhlcml0YW5jZS5EQ2hpbGRfMgorICAgICAgLSB0ZXN0LmluaGVyaXRhbmNlLlZlcmlmeVRlc3QKKworICAtIG5hbWU6IE1ldGhvZCBzZWxlY3RvcnMKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5NZXRob2RTZWxlY3RvclRlc3QKKyAgICAgIC0gdGVzdC5tZXRob2RzZWxlY3RvcnMuQmVhblNoZWxsVGVzdAorICAgICAgLSB0ZXN0Lm1ldGhvZHNlbGVjdG9ycy5Db21tYW5kTGluZVRlc3QKKworICAtIG5hbWU6IFRlc3Qgb3JkZXIgaW52b2NhdGlvbgorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuaW50ZXJsZWF2ZWRvcmRlci5JbnRlcmxlYXZlZEludm9jYXRpb25UZXN0CisKKyAgLSBuYW1lOiBEYXRhUHJvdmlkZXIKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5TYW1wbGUxVGVzdAorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5JdGVyYWJsZVRlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuQ29uZmlndXJhdGlvbkFuZERhdGFQcm92aWRlcnNUZXN0CisgICAgICAtIHRlc3QuZGF0YXByb3ZpZGVyLkJvb2xlYW5UZXN0CisgICAgICAtIHRlc3QuZGF0YXByb3ZpZGVyLk1ldGhvZFRlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuU3RhdGljRGF0YVByb3ZpZGVyU2FtcGxlVGVzdAorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5Vbm5hbWVkRGF0YVByb3ZpZGVyVGVzdAorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5UZXN0Q29udGV4dFRlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuRmFpbGluZ0RhdGFQcm92aWRlclRlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuRGF0YVByb3ZpZGVyQXNUZXN0CisgICAgICAtIHRlc3QuZGF0YXByb3ZpZGVyLlRlc3RJbnN0YW5jZUZhY3RvcnkKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuRmFpbGVkRGF0YVByb3ZpZGVyVGVzdAorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5JbnN0YW5jZURhdGFQcm92aWRlclRlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuRmFpbGluZ0l0ZXJhYmxlRGF0YVByb3ZpZGVyVGVzdAorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5DbGFzc1Rlc3QKKyAgICAgIC0gdGVzdC5kYXRhcHJvdmlkZXIuSW5oZXJpdGVkRGF0YVByb3ZpZGVyVGVzdAorCisgIC0gbmFtZTogRFAKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmRhdGFwcm92aWRlci5QYXJhbGxlbERhdGFQcm92aWRlclRlc3QKKworICAtIG5hbWU6IFVuaXF1ZVN1aXRlCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC51bmlxdWVzdWl0ZS5UZXN0QmVmb3JlMQorICAgICAgLSB0ZXN0LnVuaXF1ZXN1aXRlLlRlc3RCZWZvcmUyCisgICAgICAtIHRlc3QudW5pcXVlc3VpdGUuVGVzdEFmdGVyCisKKyAgLSBuYW1lOiBJbmhlcml0R3JvdXBzCisgICAgaW5jbHVkZWRHcm91cHM6IFsgZ3JvdXAxIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkluaGVyaXRHcm91cHNTYW1wbGVUZXN0CisKKyAgLSBuYW1lOiBOZXN0ZWQKKyAgICBpbmNsdWRlZEdyb3VwczogWyB1bml0dGVzdCBdCisgICAgeG1sUGFja2FnZXM6CisgICAgICAtIG5hbWU6IHRlc3QubmVzdGVkLioKKworICAtIG5hbWU6IEhvb2thYmxlCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5ob29rLkhvb2tTdWNjZXNzVGVzdAorICAgICAgLSB0ZXN0Lmhvb2suSG9va0ZhaWx1cmVUZXN0CisKKyAgLSBuYW1lOiBCZWZvcmVHcm91cHMtQWZ0ZXJHcm91cHMtMQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uR3JvdXBzMVNhbXBsZVRlc3QKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHMyU2FtcGxlVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkdyb3VwczNTYW1wbGVUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uR3JvdXBzNFNhbXBsZVRlc3QKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHM1U2FtcGxlVGVzdAorICAgICAgLSB0ZXN0LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkdyb3VwczZTYW1wbGVUZXN0CisgICAgICAtIHRlc3QuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uR3JvdXBzN1NhbXBsZVRlc3QKKworICAtIG5hbWU6IEJlZm9yZUdyb3Vwcy1BZnRlckdyb3Vwcy0yCisgICAgaW5jbHVkZWRHcm91cHM6IFsgQSwgQiBdCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Hcm91cHM4U2FtcGxlVGVzdAorCisgIC0gbmFtZTogSlVuaXQKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LkpVbml0VGVzdDEKKyAgICAgIC0gdGVzdC5Db21tYW5kTGluZVRlc3QKKworICAtIG5hbWU6IEFudC1DbGFzc0ZpbGVSZXNvbHV0aW9uCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5hbnQuVGVzdENvbW1hbmRMaW5lQXJncworCisgIC0gbmFtZTogQ2xhc3MgUnVuCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkEKKyAgICAgIC0gdGVzdC5yZWdyZXNzaW9uLmdyb3Vwc29yZGVyaW5nLkIKKworICAtIG5hbWU6IEdyb3VwcyBSdW4KKyAgICBpbmNsdWRlZEdyb3VwczogWyBhIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmcuQQorICAgICAgLSB0ZXN0LnJlZ3Jlc3Npb24uZ3JvdXBzb3JkZXJpbmcuQgorCisgIC0gbmFtZTogRXh0ZXJuYWwgZ3JvdXAgaW52b2NhdGlvbgorICAgIGluY2x1ZGVkR3JvdXBzOiBbIGEgXQorICAgIGNsYXNzZXM6CisgICAgICAtIHRlc3QuZ3JvdXBpbnZvY2F0aW9uLkdyb3VwQ29uZmlndXJhdGlvbgorICAgICAgLSB0ZXN0Lmdyb3VwaW52b2NhdGlvbi5EdW1teVRlc3QKKworICAtIG5hbWU6IFNraXBFeGNlcHRpb25zCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5za2lwZXguU2tpcHBlZEV4Y2VwdGlvblRlc3QKKworICAtIG5hbWU6IE1ldGhvZEludGVyY2VwdG9yCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5tZXRob2RpbnRlcmNlcHRvcnMuTWV0aG9kSW50ZXJjZXB0b3JUZXN0CisKKyAgLSBuYW1lOiBBc3NlcnRzCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5hc3NlcnR0ZXN0cy5Bc3NlcnRUZXN0CisKKyAgLSBuYW1lOiBDb25maWdGYWlsdXJlUG9saWN5CisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5jb25maWd1cmF0aW9uZmFpbHVyZXBvbGljeS5GYWlsdXJlUG9saWN5VGVzdAorCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bmdfY29udmVydC54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nX2NvbnZlcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWY4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG5nX2NvbnZlcnQueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly9iZXVzdC5jb20vdGVzdG5nL3Rlc3RuZy0xLjAuZHRkIiA+CisKKzxzdWl0ZSBuYW1lPSJKVW5pdCBDb252ZXJ0IHN1aXRlIiB2ZXJib3NlPSIxIiBwYXJhbGxlbD0iZmFsc2UiIHRocmVhZC1jb3VudD0iMiIgYW5ub3RhdGlvbnM9ImphdmFkb2MiPgorICAgPHBhcmFtZXRlciBuYW1lPSJpbnB1dERpciIgdmFsdWU9Ii4vdGVzdC9zcmMvdGVzdC9jb252ZXJ0Ii8+CisgICA8dGVzdCBuYW1lPSJKVW5pdCBDb252ZXJ0Ij4KKyAgICAgPGNsYXNzZXM+CisgICAgICAgPGNsYXNzIG5hbWU9InRlc3QuY29udmVydC5KVW5pdENvbnZlcnRlclRlc3QiLz4KKyAgICAgPC9jbGFzc2VzPgorICAgPC90ZXN0PgorPC9zdWl0ZT4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy93aXRoLWRpZmZlcmVudC1uYW1lLXRlc3RuZy14bWwuamFyIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGgtZGlmZmVyZW50LW5hbWUtdGVzdG5nLXhtbC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3ZDY5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy93aXRoLWRpZmZlcmVudC1uYW1lLXRlc3RuZy14bWwuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy93aXRob3V0dGVzdG5neG1sLmphciBiL3NyYy90ZXN0L3Jlc291cmNlcy93aXRob3V0dGVzdG5neG1sLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIwM2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGhvdXR0ZXN0bmd4bWwuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy93aXRodGVzdG5neG1sLmphciBiL3NyYy90ZXN0L3Jlc291cmNlcy93aXRodGVzdG5neG1sLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMyZDJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3dpdGh0ZXN0bmd4bWwuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy94bWwvYmFkV2l0aERvY3R5cGUueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3htbC9iYWRXaXRoRG9jdHlwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMTJkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy94bWwvYmFkV2l0aERvY3R5cGUueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBzdWl0ZSBTWVNURU0gImh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkIiA+Cis8U3VpdGUgbmFtZT0iR2l0SHViODA5IiB2ZXJib3NlPSIzIj4KKyAgICA8dGVzdCBuYW1lPSJEZW1vIDEiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIiAvPgorPC9TdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveG1sL2JhZFdpdGhvdXREb2N0eXBlLnhtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy94bWwvYmFkV2l0aG91dERvY3R5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDFjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMveG1sL2JhZFdpdGhvdXREb2N0eXBlLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U3VpdGUgbmFtZT0iR2l0SHViODA5IiB2ZXJib3NlPSIzIj4KKyAgICA8dGVzdCBuYW1lPSJEZW1vIDEiIHByZXNlcnZlLW9yZGVyPSJ0cnVlIiAvPgorPC9TdWl0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveG1sL2dvb2RXaXRoRG9jdHlwZS54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveG1sL2dvb2RXaXRoRG9jdHlwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZDY2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy94bWwvZ29vZFdpdGhEb2N0eXBlLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCIgPgorPHN1aXRlIG5hbWU9IkdpdEh1YjgwOSIgdmVyYm9zZT0iMyI+CisgICAgPHRlc3QgbmFtZT0iRGVtbyAxIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSIgLz4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3htbC9nb29kV2l0aG91dERvY3R5cGUueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3htbC9nb29kV2l0aG91dERvY3R5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDEwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMveG1sL2dvb2RXaXRob3V0RG9jdHlwZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHN1aXRlIG5hbWU9IkdpdEh1YjgwOSIgdmVyYm9zZT0iMyI+CisgICAgPHRlc3QgbmFtZT0iRGVtbyAxIiBwcmVzZXJ2ZS1vcmRlcj0idHJ1ZSIgLz4KKzwvc3VpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTEueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGY3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMS54bWwKQEAgLTAsMCArMSw1NiBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvdGVzdG5nLTEuMC5kdGQiID4KKyAgCis8c3VpdGUgbmFtZT0iU2luZ2xlU3VpdGUiIHZlcmJvc2U9IjIiIHBhcmFsbGVsPSJmYWxzZSIgdGhyZWFkLWNvdW50PSI0IgorICAgIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIzIj4KKworICA8cGFyYW1ldGVyIG5hbWU9Im4iIHZhbHVlPSI0MiIgLz4KKworICA8bGlzdGVuZXJzPgorICAgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPSJ0ZXN0Lm1ldGhvZGludGVyY2VwdG9ycy5GYXN0VGVzdHNGaXJzdEludGVyY2VwdG9yIiAvPgorICAgIDxsaXN0ZW5lciBjbGFzcy1uYW1lPSJ0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lci5NeUxpc3RlbmVyIiAvPgorICA8L2xpc3RlbmVycz4KKworICA8cGFja2FnZXM+CisgICAgPHBhY2thZ2UgbmFtZT0idGVzdC50ZXN0bmczNTUub3JnLmFwYWNoZS50YXBlc3RyeTUiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iRm9vIi8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJGb28yIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJCYXIiLz4KKyAgICA8L3BhY2thZ2U+CisgICAgPHBhY2thZ2UgbmFtZT0idGVzdC50ZXN0bmczNTUub3JnLmFwYWNoZS50YXBlc3RyeTUuZG9tIiAvPgorICA8L3BhY2thZ2VzPgorCisgIDx0ZXN0IG5hbWU9IlJlZ3Jlc3Npb24yIiB2ZXJib3NlPSIyIj4KKyAgICA8cGFyYW1ldGVyIG5hbWU9ImNvdW50IiB2YWx1ZT0iMTAiLz4KKyAgICA8Z3JvdXBzPgorICAgICAgPHJ1bj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnJva2VuIiAvPgorICAgICAgPC9ydW4+CisgICAgPC9ncm91cHM+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5saXN0ZW5lcnMuUmVzdWx0RW5kTWlsbGlzVGVzdCI+Cis8IS0tIAorICAgICAgICA8bWV0aG9kcz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ3aXRoRmFjdG9yeSIgLz4KKyAgICAgICAgPC9tZXRob2RzPgorIC0tPgorICAgICAgIDwvY2xhc3M+Cis8IS0tIAorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubWV0aG9kc2VsZWN0b3JzLkNvbW1hbmRMaW5lVGVzdCI+CisgICAgICAgPGNsYXNzIG5hbWU9InRlc3QuaW5qZWN0Lk5vSW5qZWN0aW9uVGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRtcC5UZXN0RmFjdG9yeSIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRocmVhZC5NdWx0aVRocmVhZGVkRGVwZW5kZW50VGVzdCIgLz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRtcC5CIiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLk11bHRpVGhyZWFkZWREZXBlbmRlbnRUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudGhyZWFkLkZhY3RvcnlUZXN0IiAvPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudG1wLkIiIC8+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC5mYWlsZWRyZXBvcnRlci5GYWlsZWRSZXBvcnRlclRlc3QiIC8+CisgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InZlcmlmeUlQQWRkcmVzcyIgaW52b2NhdGlvbk51bWJlcnM9IjAgMiIgLz4KKyAgICAgICAgPC9tZXRob2RzPgorICAgICAgPC9jbGFzcz4KKyAtLT4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKworPC9zdWl0ZT4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTEueWFtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2ExLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxOWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2ExLnlhbWwKQEAgLTAsMCArMSwyNCBAQAorbmFtZTogU2luZ2xlU3VpdGUKK3ZlcmJvc2U6IDIKK3RocmVhZENvdW50OiA0CitwYXJhbWV0ZXJzOiB7IG46IDQyIH0KK2RhdGFQcm92aWRlclRocmVhZENvdW50OiAzCitwYXJhbGxlbDogZmFsc2UKKworbGlzdGVuZXJzOgorICAtIHRlc3QubWV0aG9kaW50ZXJjZXB0b3JzLkZhc3RUZXN0c0ZpcnN0SW50ZXJjZXB0b3IKKyAgLSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lci5NeUxpc3RlbmVyCisKK3BhY2thZ2VzOgorICAtIG5hbWU6IHRlc3QudGVzdG5nMzU1Lm9yZy5hcGFjaGUudGFwZXN0cnk1CisgICAgaW5jbHVkZTogW0ZvbywgRm9vMl0KKyAgICBleGNsdWRlOiBbQmFyXQorICAtIG5hbWU6IHRlc3QudGVzdG5nMzU1Lm9yZy5hcGFjaGUudGFwZXN0cnk1LmRvbQorCit0ZXN0czoKKyAgLSBuYW1lOiBSZWdyZXNzaW9uMgorICAgIHZlcmJvc2U6IDIKKyAgICBwYXJhbWV0ZXJzOiB7IGNvdW50OiAxMCB9CisgICAgZXhjbHVkZWRHcm91cHM6IFsgYnJva2VuIF0KKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMi54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMDI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EyLnhtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgdGhyZWFkLWNvdW50PSI0IiBjb25maWdmYWlsdXJlcG9saWN5PSJza2lwIiB2ZXJib3NlPSIyIiBuYW1lPSJTaW5nbGVTdWl0ZSIgc2tpcGZhaWxlZGludm9jYXRpb25jb3VudHM9ImZhbHNlIiBwYXJhbGxlbD0iZmFsc2UiIGFubm90YXRpb25zPSJKREsiIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIzIj4KKyAgPHBhcmFtZXRlciBuYW1lPSJuIiB2YWx1ZT0iNDIiLz4KKyAgPHBhcmFtZXRlciBuYW1lPSJwIiB2YWx1ZT0iMTAiLz4KKyAgPHBhcmFtZXRlciBuYW1lPSJzIiB2YWx1ZT0iYSBiIGMiLz4KKyAgPHBhcmFtZXRlciBuYW1lPSJ0IiB2YWx1ZT0iYSxiIi8+CisgIDxsaXN0ZW5lcnM+CisgICAgPGxpc3RlbmVyIGNsYXNzLW5hbWU9InRlc3QuaW52b2tlZG1ldGhvZGxpc3RlbmVyLk15TGlzdGVuZXIiLz4KKyAgPC9saXN0ZW5lcnM+CisgIDxwYWNrYWdlcz4KKyAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0LnRlc3RuZzM1NS5vcmcuYXBhY2hlLnRhcGVzdHJ5NSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJGb28iLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IkZvbzIiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9IkJhciIvPgorICAgIDwvcGFja2FnZT4KKyAgICA8cGFja2FnZSBuYW1lPSJ0ZXN0LnRlc3RuZzM1NS5vcmcuYXBhY2hlLnRhcGVzdHJ5NS5kb20iPgorICAgIDwvcGFja2FnZT4KKyAgPC9wYWNrYWdlcz4KKyAgPG1ldGhvZC1zZWxlY3RvcnM+CisJICA8bWV0aG9kLXNlbGVjdG9yPgorCSAgICA8c2VsZWN0b3ItY2xhc3MgbmFtZT0ib3JnLnRlc3RuZy5pbnRlcm5hbC5YbWxNZXRob2RTZWxlY3RvciIgcHJpb3JpdHk9IjEiLz4KKwkgIDwvbWV0aG9kLXNlbGVjdG9yPgorCSAgPG1ldGhvZC1zZWxlY3Rvcj4KKwkgICAgPHNjcmlwdCBsYW5ndWFnZT0iYmVhbnNoZWxsIj4KKwkgICAgICA8IVtDREFUQVtncm91cHMuY29udGFpbnNLZXkoInRlc3QxIildXT4KKwkgICAgPC9zY3JpcHQ+CisJICA8L21ldGhvZC1zZWxlY3Rvcj4KKyAgPC9tZXRob2Qtc2VsZWN0b3JzPgorICA8dGVzdCB2ZXJib3NlPSIxIiBuYW1lPSJUZXN0MyIganVuaXQ9ImZhbHNlIiBwcmVzZXJ2ZS1vcmRlcj0iZmFsc2UiPgorICAgIDxtZXRob2Qtc2VsZWN0b3JzPgorICAgICAgPG1ldGhvZC1zZWxlY3Rvcj4KKyAgICAgICAgPHNlbGVjdG9yLWNsYXNzIG5hbWU9Im9yZy50ZXN0bmcuaW50ZXJuYWwuWG1sTWV0aG9kU2VsZWN0b3IiIHByaW9yaXR5PSIxIi8+CisgICAgICA8L21ldGhvZC1zZWxlY3Rvcj4KKyAgICAgIDxtZXRob2Qtc2VsZWN0b3I+CisgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImJlYW5zaGVsbCI+CisgICAgICAgICAgPCFbQ0RBVEFbZ3JvdXBzLmNvbnRhaW5zS2V5KCJ0ZXN0MSIpXV0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9tZXRob2Qtc2VsZWN0b3I+CisgICAgPC9tZXRob2Qtc2VsZWN0b3JzPgorICAgIDxwYXJhbWV0ZXIgbmFtZT0ibiIgdmFsdWU9IjQzIi8+CisgICAgPHBhcmFtZXRlciBuYW1lPSJ6IiB2YWx1ZT0iZm9vIi8+CisgICAgPGdyb3Vwcz4KKyAgICAgIDxkZWZpbmUgbmFtZT0iYSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImIiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iZCIvPgorICAgICAgPC9kZWZpbmU+CisgICAgICA8cnVuPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJBIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkIiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iQyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJEIi8+CisgICAgICA8L3J1bj4KKyAgICA8L2dyb3Vwcz4KKyAgICA8cGFja2FnZXM+CisgICAgICA8cGFja2FnZSBuYW1lPSJjb20uZXhhbXBsZTEiPgorICAgICAgPC9wYWNrYWdlPgorICAgICAgPHBhY2thZ2UgbmFtZT0iY29tLmV4YW1wbGUyIj4KKyAgICAgIDwvcGFja2FnZT4KKyAgICA8L3BhY2thZ2VzPgorICA8L3Rlc3Q+CisgIDx0ZXN0IHZlcmJvc2U9IjEiIG5hbWU9IlRlc3QxIiBqdW5pdD0iZmFsc2UiIHByZXNlcnZlLW9yZGVyPSJmYWxzZSI+CisgICAgPGNsYXNzZXM+CisgICAgICA8Y2xhc3MgbmFtZT0idGVzdC50bXAuQSI+CisgICAgICAgIDxtZXRob2RzPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3QxIi8+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdDIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJ0ZXN0MyIvPgorICAgICAgICA8L21ldGhvZHM+CisgICAgICA8L2NsYXNzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QudG1wLkIiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKyAgPHRlc3QgdmVyYm9zZT0iMSIgbmFtZT0iVGVzdDIiIGp1bml0PSJmYWxzZSIgcHJlc2VydmUtb3JkZXI9ImZhbHNlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0LnRtcC5CIi8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMi55YW1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY1ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTIueWFtbApAQCAtMCwwICsxLDQ5IEBACituYW1lOiBTaW5nbGVTdWl0ZQordmVyYm9zZTogMgorcGFyYWxsZWw6IGZhbHNlCit0aHJlYWRDb3VudDogNAorZGF0YVByb3ZpZGVyVGhyZWFkQ291bnQ6IDMKKworcGFja2FnZXM6CisgIC0gbmFtZTogdGVzdC50ZXN0bmczNTUub3JnLmFwYWNoZS50YXBlc3RyeTUKKyAgICBpbmNsdWRlOiBbRm9vLCBGb28yXQorICAgIGV4Y2x1ZGU6IFtCYXJdCisgIC0gbmFtZTogdGVzdC50ZXN0bmczNTUub3JnLmFwYWNoZS50YXBlc3RyeTUuZG9tCisKK2xpc3RlbmVyczoKKyAgLSB0ZXN0Lmludm9rZWRtZXRob2RsaXN0ZW5lci5NeUxpc3RlbmVyCisKK3BhcmFtZXRlcnM6IHsgbjogNDIsIHA6IDEwLCBzOiAiYSBiIGMiLCB0OiAiYSxiIiB9CisKK3Rlc3RzOgorICAtIG5hbWU6IFRlc3QzCisgICAgcHJlc2VydmVPcmRlcjogZmFsc2UKKyAgICBpbmNsdWRlZEdyb3VwczogW0EsIEJdCisgICAgZXhjbHVkZWRHcm91cHM6IFtDLCBEXQorICAgIG1ldGFHcm91cHM6IHsgYTogWyBiLCBkXSB9CisgICAgcGFja2FnZXM6IFsgY29tLmV4YW1wbGUxLCBjb20uZXhhbXBsZTIgXQorICAgIHBhcmFtZXRlcnM6IHsgbjogNDMsIHo6IGZvbyB9CisgICAgbWV0aG9kU2VsZWN0b3JzOgorICAgICAgLSBjbGFzc05hbWU6IG9yZy50ZXN0bmcuaW50ZXJuYWwuWG1sTWV0aG9kU2VsZWN0b3IKKyAgICAgICAgcHJpb3JpdHk6IDEKKyAgICAgIC0gZXhwcmVzc2lvbjogZ3JvdXBzLmNvbnRhaW5zS2V5KCJ0ZXN0MSIpCisgICAgICAgIGxhbmd1YWdlOiBiZWFuc2hlbGwKKworICAtIG5hbWU6IFRlc3QxCisgICAgcHJlc2VydmVPcmRlcjogZmFsc2UKKyAgICBjbGFzc2VzOgorICAgICAgLSBuYW1lOiB0ZXN0LnRtcC5BCisgICAgICAgIGluY2x1ZGVkTWV0aG9kczogW3Rlc3QxLCB0ZXN0Ml0KKyAgICAgICAgZXhjbHVkZWRNZXRob2RzOiBbdGVzdDNdCisgICAgICAtIHRlc3QudG1wLkIKKworICAtIG5hbWU6IFRlc3QyCisgICAgcHJlc2VydmVPcmRlcjogZmFsc2UKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0LnRtcC5CCisKK21ldGhvZFNlbGVjdG9yczoKKyAgLSBjbGFzc05hbWU6IG9yZy50ZXN0bmcuaW50ZXJuYWwuWG1sTWV0aG9kU2VsZWN0b3IKKyAgICBwcmlvcml0eTogMQorICAtIGV4cHJlc3Npb246IGdyb3Vwcy5jb250YWluc0tleSgidGVzdDEiKQorICAgIGxhbmd1YWdlOiBiZWFuc2hlbGwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLWEueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMtYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1YWYwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLWEueG1sCkBAIC0wLDAgKzEsOSBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiPgorPHN1aXRlIHRocmVhZC1jb3VudD0iNSIgY29uZmlnZmFpbHVyZXBvbGljeT0ic2tpcCIgbmFtZT0iYTMtYSIgc2tpcGZhaWxlZGludm9jYXRpb25jb3VudHM9ImZhbHNlIiBhbm5vdGF0aW9ucz0iSkRLIiBkYXRhLXByb3ZpZGVyLXRocmVhZC1jb3VudD0iMTAiPgorICA8dGVzdCB2ZXJib3NlPSIxIiBuYW1lPSJUZXN0LWEzLWEiIGp1bml0PSJmYWxzZSIgcHJlc2VydmUtb3JkZXI9ImZhbHNlIj4KKyAgICA8Y2xhc3Nlcz4KKyAgICAgIDxjbGFzcyBuYW1lPSJ0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0Ii8+CisgICAgPC9jbGFzc2VzPgorICA8L3Rlc3Q+Cis8L3N1aXRlPgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy1hLnlhbWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy1hLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ZmVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLWEueWFtbApAQCAtMCwwICsxLDYgQEAKK25hbWU6IGEzLWEKKwordGVzdHM6CisgIC0gbmFtZTogVGVzdC1hMy1hCisgICAgY2xhc3NlczoKKyAgICAgIC0gdGVzdC5saXN0ZW5lcnMuUmVzdWx0RW5kTWlsbGlzVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMtYi54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy1iLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM2ODRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMtYi54bWwKQEAgLTAsMCArMSw5IEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vdGVzdG5nLm9yZy90ZXN0bmctMS4wLmR0ZCI+Cis8c3VpdGUgdGhyZWFkLWNvdW50PSI1IiBjb25maWdmYWlsdXJlcG9saWN5PSJza2lwIiBuYW1lPSJhMy1iIiBza2lwZmFpbGVkaW52b2NhdGlvbmNvdW50cz0iZmFsc2UiIGFubm90YXRpb25zPSJKREsiIGRhdGEtcHJvdmlkZXItdGhyZWFkLWNvdW50PSIxMCI+CisgIDx0ZXN0IHZlcmJvc2U9IjEiIG5hbWU9IlRlc3QtYTMtYiIganVuaXQ9ImZhbHNlIiBwcmVzZXJ2ZS1vcmRlcj0iZmFsc2UiPgorICAgIDxjbGFzc2VzPgorICAgICAgPGNsYXNzIG5hbWU9InRlc3QubGlzdGVuZXJzLlJlc3VsdEVuZE1pbGxpc1Rlc3QiLz4KKyAgICA8L2NsYXNzZXM+CisgIDwvdGVzdD4KKzwvc3VpdGU+CisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLWIueWFtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLWIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFjMTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMtYi55YW1sCkBAIC0wLDAgKzEsNiBAQAorbmFtZTogYTMtYgorCit0ZXN0czoKKyAgLSBuYW1lOiBUZXN0LWEzLWIKKyAgICBjbGFzc2VzOgorICAgICAgLSB0ZXN0Lmxpc3RlbmVycy5SZXN1bHRFbmRNaWxsaXNUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy54bWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0YTE2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2EzLnhtbApAQCAtMCwwICsxLDEwIEBACis8IURPQ1RZUEUgc3VpdGUgU1lTVEVNICJodHRwOi8vYmV1c3QuY29tL3Rlc3RuZy90ZXN0bmctMS4wLmR0ZCIgPgorICAKKzxzdWl0ZSBuYW1lPSJhMyIgdmVyYm9zZT0iMiI+CisKKwk8c3VpdGUtZmlsZXM+CisJICA8c3VpdGUtZmlsZSBwYXRoPSJhMy1hLnhtbCIgLz4KKwkgIDxzdWl0ZS1maWxlIHBhdGg9ImEzLWIueG1sIiAvPgorCTwvc3VpdGUtZmlsZXM+CisKKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hMy55YW1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwN2JmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTMueWFtbApAQCAtMCwwICsxLDQgQEAKK25hbWU6IGEzCit2ZXJib3NlOiAyCisKK3N1aXRlRmlsZXM6IFsgYTMtYS54bWwsIGEzLWIueG1sIF0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2E0LWEueWFtbCBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2E0LWEueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E4MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTQtYS55YW1sCkBAIC0wLDAgKzEsMyBAQAorbmFtZTogYTQtYQordmVyYm9zZTogMgorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hNC1iLnlhbWwgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hNC1iLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxOTQyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy95YW1sL2E0LWIueWFtbApAQCAtMCwwICsxLDMgQEAKK25hbWU6IGE0LWIKK3ZlcmJvc2U6IDIKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTQueG1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDEzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hNC54bWwKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIHN1aXRlIFNZU1RFTSAiaHR0cDovL2JldXN0LmNvbS90ZXN0bmcvdGVzdG5nLTEuMC5kdGQiID4KKyAgCis8c3VpdGUgbmFtZT0iU2luZ2xlU3VpdGUiIHZlcmJvc2U9IjIiPgorCisJPHN1aXRlLWZpbGVzPgorCSAgPHN1aXRlLWZpbGUgcGF0aD0iYTQtYS55YW1sIiAvPgorCSAgPHN1aXRlLWZpbGUgcGF0aD0iYTQtYi55YW1sIiAvPgorCTwvc3VpdGUtZmlsZXM+CisKKzwvc3VpdGU+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMveWFtbC9hNC55YW1sIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTQueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmEzMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL3lhbWwvYTQueWFtbApAQCAtMCwwICsxLDQgQEAKK25hbWU6IFNpbmdsZVN1aXRlCit2ZXJib3NlOiAyCisKK3N1aXRlRmlsZXM6IFsgYTQtYS55YW1sLCBhNC1iLnlhbWwgXQpkaWZmIC0tZ2l0IGEvdGVzdG5nLTEuMC5kdGQuaHRtbCBiL3Rlc3RuZy0xLjAuZHRkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmEwNDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RuZy0xLjAuZHRkLmh0bWwKQEAgLTAsMCArMSw4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CisKKzxodG1sPgorICA8aGVhZD4KKyAgICA8TUVUQSBIVFRQLUVRVUlWPVJFRlJFU0ggQ09OVEVOVD0iMDsgVVJMPWh0dHA6Ly90ZXN0bmcub3JnL3Rlc3RuZy0xLjAuZHRkLnBocCI+LgorICA8L2hlYWQ+CisKKzxib2R5IC8+CmRpZmYgLS1naXQgYS90ZXN0bmctMS4wLmR0ZC5waHAgYi90ZXN0bmctMS4wLmR0ZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwNTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RuZy0xLjAuZHRkLnBocApAQCAtMCwwICsxLDQ2IEBACis8PworCitwcmludCAnPGh0bWw+PGhlYWQ+PHRpdGxlPlRlc3RORyBEVEQ8L3RpdGxlPgorCisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0idGVzdG5nLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vYmV1c3QuY3NzIiAgLz4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9wcmV0dGlmeS5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJhbm5lci5qcyI+PC9zY3JpcHQ+CisKKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaENvcmUuanMiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2JldXN0LmNvbS9zY3JpcHRzL3NoQnJ1c2hKYXZhLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoWG1sLmpzIj48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9iZXVzdC5jb20vc2NyaXB0cy9zaEJydXNoQmFzaC5qcyI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYmV1c3QuY29tL3NjcmlwdHMvc2hCcnVzaFBsYWluLmpzIj48L3NjcmlwdD4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoQ29yZS5jc3MiLz4KKyAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9iZXVzdC5jb20vc3R5bGVzL3NoVGhlbWVDZWRyaWMuY3NzIi8+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmNvbmZpZy5jbGlwYm9hcmRTd2YgPSAic2NyaXB0cy9jbGlwYm9hcmQuc3dmIjsKKyAgICAgICAgU3ludGF4SGlnaGxpZ2h0ZXIuZGVmYXVsdHNbImd1dHRlciJdID0gZmFsc2U7CisgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmFsbCgpOworICAgICAgPC9zY3JpcHQ+CisKKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgIC8qIFNldCB0aGUgY29tbWFuZC1saW5lIHRhYmxlIG9wdGlvbiBjb2x1bW4gd2lkdGguICovCisgICAgICAgICAgICAjY29tbWFuZC1saW5lIGNvbGdyb3VwLm9wdGlvbiB7CisgICAgICAgICAgICAgICAgIHdpZHRoOiA3ZW07CisgICAgICAgICAgICB9CisgICAgICAgIDwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgxPgorPHAgYWxpZ249ImNlbnRlciI+CitEVEQgZm9yIFRlc3RORworPC9wPgorPC9oMT4KKworPHByZSBjbGFzcz0iYnJ1c2g6IHhtbCI+CisnCis7CisKK3ByaW50KGh0bWxlbnRpdGllcyhmaWxlX2dldF9jb250ZW50cygidGVzdG5nLTEuMC5kdGQiKSkpOworCitwcmludCAiPC9wcmU+IjsKKworPz4KZGlmZiAtLWdpdCBhL3RyYXZpcy5zaCBiL3RyYXZpcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODkxMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJhdmlzLnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgIiRUUkFWSVNfUFVMTF9SRVFVRVNUIiAhPSAiZmFsc2UiIF07IHRoZW4KKyAgaWYgWyAtbiAiJFNPTkFSX0dJVEhVQl9PQVVUSCIgXTsgdGhlbgorICAgIC4vZ3JhZGxldyBzb25hcnF1YmUgXAorICAgICAgLURzb25hci5naXRodWIucHVsbFJlcXVlc3Q9JFRSQVZJU19QVUxMX1JFUVVFU1QgXAorICAgICAgLURzb25hci5naXRodWIub2F1dGg9JFNPTkFSX0dJVEhVQl9PQVVUSCBcCisgIGVsc2UKKyAgICBlY2hvICJObyBvYXV0aCB0b2tlbiBhdmFpbGFibGUiCisgIGZpCitmaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS1iZXVzdC5jb20gYi91cGRhdGUtYmV1c3QuY29tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3MjVlZTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUtYmV1c3QuY29tCkBAIC0wLDAgKzEsMjYgQEAKK3Y9Ni41LjIKK2V2PTUuMTMuMC4zCitERVNUPXRlc3RuZworVEFSR0VUPXRhcmdldAorCitzZXQgLXgKKworaWYgWyAteiAiJHtVfSIgXQordGhlbgorICBlY2hvIFZhcmlhYmxlICIkVSIgaXMgbm90IHNldAorICBleGl0IC0xCitmaQorCitSU1lOQz0icnN5bmMgLS12ZXJib3NlIC0tcHJvZ3Jlc3MgLS1zdGF0cyIKKworJHtSU1lOQ30gJHtUQVJHRVR9L3Rlc3RuZy0ke3Z9LnppcCAke1V9QGJldXN0LmNvbToke0RFU1R9Ciske1JTWU5DfSAtciBzcmMvbWFpbi9yZXNvdXJjZXMvdGVzdG5nLTEuMC5kdGQgdGVzdG5nLTEuMC5kdGQuaHRtbCAke1V9QGJldXN0LmNvbToke0RFU1R9L2RvYworCisjJHtSU1lOQ30gdGVzdG5nLSR7dn0uamFyIHRlc3RuZy0ke3Z9LWJ1bmRsZS5qYXIgdGVzdG5nLSR7dn0uemlwIHRlc3RuZy1lY2xpcHNlLSR7ZXZ9LnppcCAke1V9QGJldXN0LmNvbToke0RFU1R9Cisjc2NwIC1yIGphdmFkb2NzIGRvYy8qLmh0bWwgZG9jLyouY3NzIHNyYy9tYWluL3Jlc291cmNlcy90ZXN0bmctMS4wLmR0ZCB0ZXN0bmctMS4wLmR0ZC5odG1sICR7VX1AYmV1c3QuY29tOiR7REVTVH0KKyNzY3AgZHRkLyogJHtVfUBiZXVzdC5jb206dy9kdGQKKyMoY2Qgfi9qYXZhL2JldXN0LmNvbTsgc2NwIC1yIC4gJHtVfUBiZXVzdC5jb206dy9lY2xpcHNlKQorCisKKyMgc2NwIHRlc3RuZy1lY2xpcHNlLSR7ZXZ9LnppcCBkb2MvZG93bmxvYWQuaHRtbCAke1V9QGJldXN0LmNvbToke0RFU1R9CisKZGlmZiAtLWdpdCBhL3VwbG9hZC1iZXRhIGIvdXBsb2FkLWJldGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTdhNmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3VwbG9hZC1iZXRhCkBAIC0wLDAgKzEsNCBAQAorI3NjcCBgbHMgLXRyICpiZXRhLnppcHx0YWlsIC0xYCBjZWRyaWNAYmV1c3QuY29tOncvdGVzdG5nCitzY3AgYGxzIC10ciB0YXJnZXQvKmJldGEuemlwfHRhaWwgLTFgIGJldXN0OmRvbWFpbnMvdGVzdG5nLm9yZy9odG1sCitzc2ggYmV1c3QgY2F0IHRlc3RuZy9iZXRhL2luZGV4Lmh0bWwKKwpkaWZmIC0tZ2l0IGEvdmVyaWZ5LXJlbGVhc2UgYi92ZXJpZnktcmVsZWFzZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNGI2MzUzCi0tLSAvZGV2L251bGwKKysrIGIvdmVyaWZ5LXJlbGVhc2UKQEAgLTAsMCArMSw0NSBAQAoraWYgWyAkIyAtZXEgMCBdCit0aGVuCisgIGVjaG8gIlNwZWNpZnkgdGhlIHJlbGVhc2UgbnVtYmVyIChlLmcuIDUuMTQuMikiCisgIGV4aXQgLTEKK2ZpCisKK3JlbD10ZXN0bmctJDEKKworIworIyBNYWtlIHN1cmUgdGhhdCBwb20ueG1sIGFuZCBwb20tdGVzdC54bWwgdGVzdCB0aGUgc2FtZSBhbmQgbGF0ZXN0IHZlcnNpb24KKyMKKwordjE9YHBlcmwgLW5lICdCRUdJTnt1bmRlZiAkL307IHByaW50ICIkMSIgaWYgbS8oVGVzdE5HLipcbi4qdmVyc2lvbikvbWcnIHBvbS54bWwgfCBhd2sgLUYgIj4iICd7IHByaW50ICQyIH0nIHwgYXdrIC1GICI8IiAneyBwcmludCAkMSB9J2AKKwordjI9YHBlcmwgLW5lICdCRUdJTnt1bmRlZiAkL307IHByaW50ICIkMSIgaWYgbS8oYXJ0aWZhY3RJZC50ZXN0bmcuKlxuLip2ZXJzaW9uKS9tZycgcG9tLXRlc3QueG1sIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIC1GICI+IiAne3ByaW50ICQyfScgfCBhd2sgLUYgIjwiICd7cHJpbnQgJDF9J2AKKworaWYgWyAkdjEgIT0gJHYyIF0KK3RoZW4KKyAgZWNobyAiVmVyc2lvbnMgb2YgcG9tLnhtbCBhbmQgcG9tLXRlc3QueG1sIGRvIG5vdCBtYXRjaDogJHYxICR2MiIKKyMgIGV4aXQgLTEKK2ZpCisKKyMKKyMgTWF2ZW4KKyMKKworLi9idWlsZC13aXRoLW1hdmVuCisKKyNjZCAkSE9NRS90Cisjcm0gLXJmIHN1cmVmaXJlCisjc3ZuIGNvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbWF2ZW4vc3VyZWZpcmUvdHJ1bmsgc3VyZWZpcmUKKyNjZCBzdXJlZmlyZQorI212biBjbGVhbiBpbnN0YWxsIC1EdGVzdG5nLnZlcnNpb249JDEKKworIworIyBEaXN0cmlidXRpb24KKyMKKworY2QgJEhPTUUvdAorcm0gLWYgKnppcAorcm0gLXJmICRyZWwKK2N1cmwgaHR0cDovL3Rlc3RuZy5vcmcvJHJlbC56aXAgPiRyZWwuemlwCit1bnppcCAkcmVsLnppcAorY2QgJEhPTUUvamF2YS90ZXN0bmcKK2phdmEgLUR0ZXN0LnJlc291cmNlcy5kaXI9JEhPTUUvamF2YS90ZXN0bmcvc3JjL3Rlc3QvcmVzb3VyY2VzIC1jbGFzc3BhdGggJEhPTUUvdC8kcmVsLyRyZWwuamFyOnRhcmdldC90ZXN0LWNsYXNzZXM6bGliL2d1aWNlLTIuMC5qYXIgb3JnLnRlc3RuZy5UZXN0TkcgJEhPTUUvamF2YS90ZXN0bmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3RuZy54bWwKZGlmZiAtLWdpdCBhL3d3dy9pbmRleC5odG1sIGIvd3d3L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZDM1NwotLS0gL2Rldi9udWxsCisrKyBiL3d3dy9pbmRleC5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5EZWZhdWx0IFByb2plY3QgQ29udGVudDwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBwcm9qZWN0IGNvbnRlbnQuCisgIDwvYm9keT4KKzwvaHRtbD4K