From 2f22c23d263c6ef498073de823283d9ace34dd39 Mon Sep 17 00:00:00 2001 From: Sagnik Ganguly Date: Sun, 8 Jan 2023 19:30:27 +0530 Subject: [PATCH] FIXED: Minor bug fixes --- build/config.js | 5 ++- src/addons/SGNAtom/SGNAtom.js | 71 ++++++++++++++++++++++------------- src/js/components/windows.js | 5 ++- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/build/config.js b/build/config.js index f3cc5a6c..2915f821 100644 --- a/build/config.js +++ b/build/config.js @@ -12,7 +12,10 @@ const argv = process.argv, info = require("../package.json"); const args = {}, cdn_dir = "E:\\home\\sgn\\public_html\\cdn\\jquery\\plugins\\SGNetworks\\SGNUIKit\\"; -const SGNUIKitLoader = "LyoNCiAqIENvcHlyaWdodCAoYykgMjAyMiBTR05ldHdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFRoZSBzb2Z0d2FyZSBpcyBhbiBleGNsdXNpdmUgY29weXJpZ2h0IG9mICJTR05ldHdvcmtzIiBhbmQgaXMgcHJvdmlkZWQgYXMgaXMgZXhjbHVzaXZlbHkgd2l0aCBvbmx5ICJVU0FHRSIgYWNjZXNzLiAiTW9kaWZpY2F0aW9uIiwgICJBbHRlcmF0aW9uIiwgIlJlLWRpc3RyaWJ1dGlvbiIgaXMgY29tcGxldGVseSBwcm9oaWJpdGVkLg0KICogVklPTEFUSU5HIFRIRSBBQk9WRSBURVJNUyBJUyBBIFBVTklTSEFCTEUgT0ZGRU5TRSBXSElDSCBNQVkgTEVBRCBUTyBMRUdBTCBDT05TRVFVRU5DRVMuDQogKi8NCg0KY29uc3QgU0dOVUlLaXQgPSB7DQoJaXNSZWFkeTogZmFsc2UsDQoJY29tcG9uZW50czoge30sDQoJb25DaGFuZ2VMaXN0ZW5lcjogW10sDQoJb25SZWFkeUxpc3RlbmVyOiBbXSwNCg0KCS8qKg0KCSAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdENoYW5nZUNhbGxiYWNrDQoJICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSB3aGljaCBpcyBjaGFuZ2VkLg0KCSAqIEBwYXJhbSB7Ym9vbGVhbnxKU09OfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIHdoaWNoIGlzIGNoYW5nZWQuDQoJICogQHBhcmFtIHtKU09OfSBjb21wb25lbnRzIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIGxvYWRlZCA8Yj5TR05VSUtpdDwvYj4gY29tcG9uZW50cywgb3IgYW4gZW1wdHkgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBpZiBubyBjb21wb25lbnRzIGxvYWRlZC4NCgkgKi8NCgkvKioNCgkgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIDxiPlNHTlVJS2l0PC9iPiBpcyByZWFkeS4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdFJlYWR5Q2FsbGJhY2sNCgkgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUmVhZHkgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KDQoJLyoqDQoJICogQWRkIGEgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnQuDQoJICoNCgkgKiBAcGFyYW0ge0pTT059IHZhbHVlIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIHRoZSBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudC4NCgkgKi8NCglzZXQgY29tcG9uZW50KHZhbHVlKSB7DQoJCWlmKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKQ0KCQkJdmFsdWUgPSB7fTsNCgkJT2JqZWN0LmFzc2lnbih0aGlzLmNvbXBvbmVudHMsIHZhbHVlKTsNCg0KCQl0aGlzLm9uQ2hhbmdlTGlzdGVuZXIuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCJjb21wb25lbnRzIiwgdmFsdWUsIHRoaXMuY29tcG9uZW50cykpOw0KCX0sDQoNCgkvKioNCgkgKiBHZXQgdGhlIGxpc3Qgb2YgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnRzLg0KCSAqDQoJICogQHJldHVybiB7b2JqZWN0fSBUaGUgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBvZiBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudHMsIG9yIGFuIGVtcHR5IDxiPjxpPkpTT048L2k+PC9iPiBvYmplY3QgaWYgbm8gY29tcG9uZW50cyBsb2FkZWQuDQoJICovDQoJZ2V0IGNvbXBvbmVudCgpIHsNCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50czsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBzdGF0dXMgb2YgcmVhZGluZXNzIG9mIDxiPlNHTlVJS2l0PC9iPi4NCgkgKg0KCSAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNSZWFkeSBUaGUgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KCXNldCByZWFkeShpc1JlYWR5KSB7DQoJCXRoaXMuaXNSZWFkeSA9IGlzUmVhZHk7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoInJlYWR5IiwgdGhpcy5pc1JlYWR5KSk7DQoNCgkJaWYoaXNSZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihpc1JlYWR5KSk7DQoJfSwNCg0KCS8qKg0KCSAqIEdldCB0aGUgc3RhdHVzIG9mIHJlYWRpbmVzcyBvZiA8Yj5TR05VSUtpdDwvYj4uDQoJICoNCgkgKiBAcmV0dXJuIHtib29sZWFufSA8Yj48aT5UUlVFPC9pPjwvYj4gaWYgPGI+U0dOVUlLaXQ8L2I+IGlzIHJlYWR5LCA8Yj48aT5GQUxTRTwvaT48L2I+IG90aGVyd2lzZS4NCgkgKi8NCglnZXQgcmVhZHkoKSB7DQoJCXJldHVybiB0aGlzLmlzUmVhZHk7DQoJfSwNCg0KCS8qKg0KCSAqIFNldCB0aGUgaGFuZGxlciBmb3IgPGI+U0dOVUlLaXQ8L2I+IDxiPjxpPk9uQ2hhbmdlPC9pPjwvYj4gZXZlbnQsIHdoaWNoIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBwYXJhbSB7U0dOVUlLaXRDaGFuZ2VDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uQ2hhbmdlTGlzdGVuZXI6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5wdXNoKGxpc3RlbmVyKTsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBoYW5kbGVyIGZvciA8Yj5TR05VSUtpdDwvYj4gPGI+PGk+T25SZWFkeTwvaT48L2I+IGV2ZW50LCB3aGljaCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSA8Yj5TR05VSUtpdDwvYj4gaXMgcmVhZHkuDQoJICoNCgkgKiBAcGFyYW0ge1NHTlVJS2l0UmVhZHlDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uUmVhZHlMaXN0ZW5lcjogZnVuY3Rpb24obGlzdGVuZXIpIHsNCgkJdGhpcy5vblJlYWR5TGlzdGVuZXIucHVzaChsaXN0ZW5lcik7DQoNCgkJaWYodGhpcy5yZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcih0aGlzLnJlYWR5KSk7DQoJfSwNCn07DQp3aW5kb3cuU0dOVUlLaXQgPSBTR05VSUtpdDsNCg0KY29uc3QgdW50aWwgPSAocHJlZGljYXRlRm4pID0+IHsNCgljb25zdCBwb2xsID0gKGRvbmUpID0+IChwcmVkaWNhdGVGbigpID8gZG9uZSgpIDogc2V0VGltZW91dCgoKSA9PiBwb2xsKGRvbmUpLCA1MDApKTsNCglyZXR1cm4gbmV3IFByb21pc2UocG9sbCk7DQp9Ow0KDQphc3luYyBmdW5jdGlvbiBwYXVzZSh2KSB7DQoJd2hpbGUodiA8IDEwMCkNCgkJYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTsNCn0NCg0KZnVuY3Rpb24gbG9vcChsaWdodGJveEltYWdlcywgaW5kZXgpIHsNCglpZihpbmRleCA9PT0gbGlnaHRib3hJbWFnZXMubGVuZ3RoKSByZXR1cm47DQoNCglsaWdodGJveEltYWdlc1tpbmRleF0ub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCWNvbnNvbGUubG9nKCJpbWFnZSAiICsgaW5kZXggKyAiIGxvYWRlZC4iKTsNCgkJbG9vcChsaWdodGJveEltYWdlcywgKytpbmRleCk7DQoJfTsNCn0NCg0KKGFzeW5jIGZ1bmN0aW9uKHByZWNhbGxiYWNrKSB7DQoJY29uc3QgdGl0bGUgPSBkb2N1bWVudC50aXRsZTsNCglpZih0aXRsZSAhPT0gdW5kZWZpbmVkKQ0KCQlkb2N1bWVudC50aXRsZSA9ICJMb2FkaW5nLi4uIjsNCg0KCWlmKHdpbmRvdy5qUXVlcnkpDQoJCSQuaG9sZFJlYWR5KHRydWUpOw0KDQoJKCgpID0+IHsNCgkJY29uc3QgY3NzID0gYC8qDQogKiBDb3B5cmlnaHQgKGMpIDIwMjIgU0dOZXR3b3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBUaGUgc29mdHdhcmUgaXMgYW4gZXhjbHVzaXZlIGNvcHlyaWdodCBvZiAiU0dOZXR3b3JrcyIgYW5kIGlzIHByb3ZpZGVkIGFzIGlzIGV4Y2x1c2l2ZWx5IHdpdGggb25seSAiVVNBR0UiIGFjY2Vzcy4gIk1vZGlmaWNhdGlvbiIsICAiQWx0ZXJhdGlvbiIsICJSZS1kaXN0cmlidXRpb24iIGlzIGNvbXBsZXRlbHkgcHJvaGliaXRlZC4NCiAqIFZJT0xBVElORyBUSEUgQUJPVkUgVEVSTVMgSVMgQSBQVU5JU0hBQkxFIE9GRkVOU0UgV0hJQ0ggTUFZIExFQUQgVE8gTEVHQUwgQ09OU0VRVUVOQ0VTLg0KICovDQoNCi5oYXMtcHJlbG9hZGVyLA0KLmhhcy1wcmVsb2FkZXIgKiB7DQpcdC0tc2duLWJhY2tncm91bmQ6ICNmZmY7DQpcdC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoOiA2cHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoOiA0NHB4Ow0KXHQtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQ6IDIycHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbjogMXB4Ow0KXHQtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXM6IDZweDsNCn0NCg0KQG1lZGlhIGFsbCBhbmQgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7DQpcdC5oYXMtcHJlbG9hZGVyLA0KXHQuaGFzLXByZWxvYWRlciAqIHsNClx0LS1zZ24tYmFja2dyb3VuZDogIzAwMDsNClx0fQ0KfQ0KDQpib2R5IHsNClx0bWFyZ2luOiAwOw0KfQ0KDQouc2duLXByZWxvYWRlciB7DQpcdHBhZGRpbmc6IDA7DQpcdHdpZHRoOiAxMDAlOw0KXHRoZWlnaHQ6IDEwMCU7DQpcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNnbi1iYWNrZ3JvdW5kKTsNClx0ZGlzcGxheTogZmxleDsNClx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQpcdGFsaWduLWl0ZW1zOiBjZW50ZXI7DQpcdHBvc2l0aW9uOiBhYnNvbHV0ZTsNClx0ei1pbmRleDogOTk5OTk5Ow0KfQ0KDQoNCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciB7DQpcdHBvc2l0aW9uOiByZWxhdGl2ZTsNClx0ZGlzcGxheTogaW5saW5lLWZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KfQ0KDQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciB7DQpcdGFuaW1hdGlvbjogcm90YXRlIDEwcyBpbmZpbml0ZSBsaW5lYXI7DQpcdHBvc2l0aW9uOiByZWxhdGl2ZTsNClx0ZGlzcGxheTogaW5saW5lLWZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KXHR3aWR0aDogMTAwJTsNClx0aGVpZ2h0OiAxMDAlOw0KfQ0KDQoNCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IGltZyB7DQpcdHdpZHRoOiAxMDAlOw0KXHRoZWlnaHQ6IDEwMCU7DQpcdG1hcmdpbjogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbik7DQpcdGRpc3BsYXk6IGZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KXHRwb3NpdGlvbjogcmVsYXRpdmU7DQpcdHRvcDogNTAlOw0KXHRsZWZ0OiA1MCU7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGltZyB7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSk7DQpcdG1hcmdpbjogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbik7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGkgew0KXHRhbmltYXRpb246IHJvdGF0ZSAzcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4wOSwgMC42LCAwLjgsIDAuMDMpOw0KXHR0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTAwJSAwOw0KXHRwb3NpdGlvbjogYWJzb2x1dGU7DQpcdGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNClx0YWxpZ24taXRlbXM6IGNlbnRlcjsNClx0dG9wOiA1MCU7DQpcdGxlZnQ6IDUwJTsNClx0Ym9yZGVyOiBzb2xpZCB2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpIHRyYW5zcGFyZW50Ow0KXHRib3JkZXItYm90dG9tOiBub25lOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgxKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuMywgMC4xMiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuMywgMC4xMiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjMsIDAuMTIsIDAuMDMpOw0KXHR3aWR0aDogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKTsNClx0aGVpZ2h0OiB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpKTsNClx0Ym9yZGVyLWNvbG9yOiAjMjE3MmI4Ow0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAxKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDEpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgyKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuNiwgMC4yNCwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuNiwgMC4yNCwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjYsIDAuMjQsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSk7DQpcdG1hcmdpbi10b3A6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkpKTsNClx0Ym9yZGVyLWNvbG9yOiAjMThhMzliOw0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgzKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuOSwgMC4zNiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuOSwgMC4zNiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjksIDAuMzYsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKTsNClx0aGVpZ2h0OiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpKSk7DQpcdGJvcmRlci1jb2xvcjogIzgyYzU0NTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMikgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNCkgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjIsIDAuNDgsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjIsIDAuNDgsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS4yLCAwLjQ4LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMyk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMS41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAzKSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAzKSkpOw0KXHRib3JkZXItY29sb3I6ICNmOGI3Mzk7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDMpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDUpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS41LCAwLjYsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjUsIDAuNiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjUsIDAuNiwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDQpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDQpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDQpKSk7DQpcdGJvcmRlci1jb2xvcjogI2YwNjA0NTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA0KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNikgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjgsIDAuNzIsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjgsIDAuNzIsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS44LCAwLjcyLCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNSk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMi41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA1KSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA1KSkpOw0KXHRib3JkZXItY29sb3I6ICNlZDI4NjE7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDUpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNSkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDcpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi4xLCAwLjg0LCAwLjAzKTsNClx0LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi4xLCAwLjg0LCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDIuMSwgMC44NCwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDYpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDMpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDYpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDYpKSk7DQpcdGJvcmRlci1jb2xvcjogI2MxMjY4MDsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNikgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA2KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoOCkgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjQsIDAuOTYsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjQsIDAuOTYsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi40LCAwLjk2LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNyk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMy41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA3KSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA3KSkpOw0KXHRib3JkZXItY29sb3I6ICM1ZDMxOTE7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDcpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQoNCkAtbW96LWtleWZyYW1lcyByb3RhdGUgew0KXHR0byB7DQpcdFx0dHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsNClx0fQ0KfQ0KQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZSB7DQpcdHRvIHsNClx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOw0KXHR9DQp9DQpAa2V5ZnJhbWVzIHJvdGF0ZSB7DQpcdHRvIHsNClx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOw0KXHR9DQp9DQoNCg0KYDsNCgkJY29uc3QgaGVhZCAgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sDQoJCSAgICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsNCg0KCQloZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsNCgkJc3R5bGUudHlwZSA9ICJ0ZXh0L2NzcyI7DQoJCXN0eWxlLmlkID0gInNnbi11aWtpdC1zdHlsZXMiOw0KCQlpZihzdHlsZS5zdHlsZVNoZWV0KSB7DQoJCQkvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBJRTggYW5kIGJlbG93Lg0KCQkJc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzOw0KCQl9IGVsc2Ugew0KCQkJc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7DQoJCX0NCgl9KSgpOw0KCShmdW5jdGlvbigpIHsNCgkJbGV0IHByZWxvYWRlckVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCgkJcHJlbG9hZGVyRWxlbS5jbGFzc05hbWUgPSAic2duLXByZWxvYWRlciI7DQoJCWxldCBwcmVsb2FkZXIgPSBgXHRcdFx0PGRpdiBjbGFzcz0icHJlbG9hZGVyIj5cbmA7DQoJCS8vcHJlbG9hZGVyICs9IGBcdFx0XHRcdDxpbWcgc3JjPSI8Pz0kcHVibGljX2ltZ0Fzc2V0czs/Pmljb25zL3hzbWFsbC5wbmciPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdDxkaXYgY2xhc3M9InNwaW5uZXIiPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdDwvZGl2PlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHQ8L2Rpdj5cbmA7DQoJCXByZWxvYWRlciArPSBgXHRcdDwvZGl2PlxuYDsNCg0KCQlwcmVsb2FkZXJFbGVtLmlubmVySFRNTCA9IHByZWxvYWRlcjsNCg0KCQl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCQlkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSArPSAiIGhhcy1wcmVsb2FkZXIiOw0KCQkJZG9jdW1lbnQuYm9keS5pbnNlcnRCZWZvcmUocHJlbG9hZGVyRWxlbSwgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsNCgkJfTsNCgl9KSgpOw0KDQoJY29uc3QgY3VycmVudFNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9XCJTR05VSUtpdC5sb2FkZXIuanNcIl0iKTsNCgljb25zdCB1cmwgPSBjdXJyZW50U2NyaXB0LnNyYy5zcGxpdCgiLyIpLnNsaWNlKDAsIC0yKS5qb2luKCIvIikgKyAiLyI7DQoJY29uc3QgcHJlbG9hZCA9IFsNCgkJLy8nanMvaTE4bi9TR05pMThuLmpzJw0KCV07DQoNCglsZXQgZmlsZXNsb2FkZWQgPSAwOw0KCWNvbnN0IGZpbGVzdG9sb2FkID0gcHJlbG9hZC5sZW5ndGg7DQoNCglpZihmaWxlc3RvbG9hZCA+IDApIHsNCgkJZm9yKGxldCBpID0gMDsgaSA8IGZpbGVzdG9sb2FkOyBpKyspIHsNCgkJCWNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KCQkJc2NyaXB0LnNyYyA9IHVybCArIHByZWxvYWRbaV07DQoJCQlzY3JpcHQuYXN5bmMgPSBmYWxzZTsNCgkJCXNjcmlwdC5kZWZlciA9IGZhbHNlOw0KCQkJY3VycmVudFNjcmlwdC5hZnRlcihzY3JpcHQpOw0KCQkJaWYoaSA9PT0gMCkNCgkJCQlzY3JpcHQuaWQgPSAic2duLXByZWxvYWQtZW5kIjsNCgkJCXNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQlmaWxlc2xvYWRlZCsrOw0KCQkJCXNjcmlwdC5vbmxvYWQgPSBudWxsOw0KCQkJCWZpbmlzaExvYWQoKTsNCgkJCX07DQoJCX0NCgl9IGVsc2UNCgkJZmluaXNoTG9hZCgpOw0KDQoJYXN5bmMgZnVuY3Rpb24gZmluaXNoTG9hZCgpIHsNCgkJbGV0IHByb2dyZXNzID0gTWF0aC5yb3VuZCgoZmlsZXNsb2FkZWQgKiAxMDApIC8gZmlsZXN0b2xvYWQpIHx8IDEwMDsNCg0KCQlhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsNCgkJCWlmKGZpbGVzbG9hZGVkID49IGZpbGVzdG9sb2FkKSB7DQoJCQkJcmVzb2x2ZSgpOw0KCQkJfQ0KCQl9KS50aGVuKGZ1bmN0aW9uKCkgew0KCQkJLy9pbXBvcnQoJy4vaGVscGVycy9oZWxwZXJzLmpzJyk7DQoJCQkkKCJoZWFkID4gdGl0bGUiKS50ZXh0KHRpdGxlKTsNCgkJCWlmKHR5cGVvZiBwcmVjYWxsYmFjayA9PT0gImZ1bmN0aW9uIiAmJiBwcm9ncmVzcyA9PT0gMTAwKQ0KCQkJCXByZWNhbGxiYWNrKCk7DQoJCX0pOw0KCX0NCn0pKGZ1bmN0aW9uKCkgew0KCShhc3luYyBmdW5jdGlvbihjYWxsYmFjaykgew0KCQljb25zdCBzZ251aWtpdFNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9XCJTR05VSUtpdC5sb2FkZXIuanNcIl0iKTsNCgkJY29uc3QgY3VycmVudFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZ24tcHJlbG9hZC1lbmQiKSB8fCBzZ251aWtpdFNjcmlwdDsNCg0KCQlmdW5jdGlvbiBnZXRTY3JpcHRVUkwoKSB7DQoJCQlyZXR1cm4gc2dudWlraXRTY3JpcHQuc3JjOw0KCQl9DQoNCgkJY29uc3QgdXJsID0gZ2V0U2NyaXB0VVJMKCkuc3BsaXQoIi8iKS5zbGljZSgwLCAtMikuam9pbigiLyIpICsgIi8iOw0KDQoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQlzdGFydExvYWQoKTsNCgkJfSwgNTAwMCk7DQoNCgkJZnVuY3Rpb24gc3RhcnRMb2FkKCkgew0KCQkJY29uc3Qgc2NyaXB0cyA9IFsNCgkJCQkianMvU0dOVUlLaXQuYnVuZGxlLmpzIiwNCgkJCV07DQoJCQljb25zdCBzdHlsZXMgPSBbDQoJCQkJImNzcy9TR05VSUtpdC5idW5kbGUuY3NzIiwNCgkJCV07DQoJCQlsZXQgZmlsZXNsb2FkZWQgPSAwLA0KCQkJICAgIGxhc3RTY3JpcHQgID0gY3VycmVudFNjcmlwdDsNCgkJCWNvbnN0IGZpbGVzdG9sb2FkID0gc2NyaXB0cy5sZW5ndGggKyBzdHlsZXMubGVuZ3RoOw0KDQoJCQlmdW5jdGlvbiBsb2FkU2NyaXB0KGkpIHsNCgkJCQlpZihpID09PSBzY3JpcHRzLmxlbmd0aCkgcmV0dXJuOw0KDQoJCQkJY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7DQoJCQkJc2NyaXB0LnNyYyA9IHVybCArIHNjcmlwdHNbaV07DQoJCQkJc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgew0KCQkJCQlmaWxlc2xvYWRlZCsrOw0KCQkJCQlTR05VSUtpdC5jb21wb25lbnQgPSB7DQoJCQkJCQlpOiBzY3JpcHRzW2ldLA0KCQkJCQl9Ow0KCQkJCQlzY3JpcHQub25sb2FkID0gbnVsbDsNCgkJCQkJLy9jb25zb2xlLmxvZyhgTE9BREVEIFNDUklQVDogJHtzY3JpcHQuc3JjfWAsIGAke2l9LyR7ZmlsZXN0b2xvYWR9YCk7DQoJCQkJCWZpbmlzaExvYWQoKTsNCgkJCQkJbG9hZFNjcmlwdCgrK2kpOw0KCQkJCX07DQoJCQkJbGFzdFNjcmlwdC5hZnRlcihzY3JpcHQpOw0KCQkJCWxhc3RTY3JpcHQgPSBsYXN0U2NyaXB0Lm5leHRFbGVtZW50U2libGluZyB8fCBjdXJyZW50U2NyaXB0Ow0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBsb2FkU3R5bGUoaSkgew0KCQkJCWlmKGkgPT09IHNjcmlwdHMubGVuZ3RoKSByZXR1cm47DQoNCgkJCQljb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsNCgkJCQlzdHlsZS5yZWwgPSAic3R5bGVzaGVldCI7DQoJCQkJc3R5bGUuaHJlZiA9IHVybCArIHN0eWxlc1tpXTsNCgkJCQlzdHlsZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJZmlsZXNsb2FkZWQrKzsNCgkJCQkJc3R5bGUub25sb2FkID0gbnVsbDsNCgkJCQkJZmluaXNoTG9hZCgpOw0KCQkJCQlsb29wKCsraSk7DQoJCQkJfTsNCgkJCQljdXJyZW50U2NyaXB0LmFmdGVyKHN0eWxlKTsNCgkJCX0NCg0KCQkJbG9hZFNjcmlwdCgwKTsNCgkJCWxvYWRTdHlsZSgwKTsNCg0KCQkJYXN5bmMgZnVuY3Rpb24gZmluaXNoTG9hZCgpIHsNCgkJCQljb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoKGZpbGVzbG9hZGVkICogMTAwKSAvIGZpbGVzdG9sb2FkKTsNCg0KCQkJCWlmKHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgew0KCQkJCQljYWxsYmFjayhmaWxlc2xvYWRlZCwgZmlsZXN0b2xvYWQsIHByb2dyZXNzKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9KShhc3luYyBmdW5jdGlvbihsb2FkZWQsIHRvdGFsLCBwcm9ncmVzcykgew0KCQlpZihwcm9ncmVzcyA9PT0gMTAwKSB7DQoJCQkvL2ltcG9ydCgnLi9pMThuL1NHTmkxOG4uanMnKTsNCgkJCS8vaW1wb3J0KCcuL2NvbXBvbmVudHMvY29tcG9uZW50cy5qcycpOw0KCQkJU0dOVUlLaXQucmVhZHkgPSB0cnVlOw0KCQkJd2luZG93LlNHTlVJS2l0UmVhZHkgPSB0cnVlOw0KDQoJCQljb25zdCBsZWZ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic3R5bGVbZGF0YS1ja2U9XCJ0cnVlXCJdIik7DQoJCQlpZihsZWZ0ICE9PSBudWxsKQ0KCQkJCWxlZnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsZWZ0KTsNCg0KCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQkkLmhvbGRSZWFkeShmYWxzZSk7DQoJCQkJalF1ZXJ5LnJlYWR5KCk7DQoNCgkJCQkkKCJib2R5IikuY2hpbGRyZW4oIi5zZ24tcHJlbG9hZGVyIikuZmFkZU91dCgyMDAwLCBmdW5jdGlvbigpIHsNCgkJCQkJJCgiYm9keSIpLmNoaWxkcmVuKCIuc2duLXByZWxvYWRlciIpLnJlbW92ZSgpOw0KCQkJCQkkKCJib2R5IikucmVtb3ZlQ2xhc3MoImhhcy1wcmVsb2FkZXIiKTsNCgkJCQl9KTsNCgkJCX0sIDUwMDApOw0KDQoJCX0NCgl9KTsNCn0pOw0KDQoNCmFzeW5jIGZ1bmN0aW9uIGdldFNHTkkxOG5JbnN0YW5jZShjYWxsYmFjaykgew0KCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQoJCWNvbnN0IHRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCWlmKGNoZWNrSW50ZXJ2YWxIYW5kbGVyKQ0KCQkJCWNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbEhhbmRsZXIpOw0KCQl9LCAxMDAwMCk7DQoNCgkJY29uc3QgY2hlY2tJbnRlcnZhbEhhbmRsZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJCWlmKHdpbmRvdy5TR05VSUtpdFJlYWR5KSB7DQoJCQkJaWYodGltZW91dEhhbmRsZXIpDQoJCQkJCWNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlcik7DQoJCQkJY2xlYXJJbnRlcnZhbChjaGVja0ludGVydmFsSGFuZGxlcik7DQoJCQkJY29uc3QgYyA9IG5ldyBTR05pMThuKCk7DQoNCgkJCQlyZXNvbHZlKGMpOw0KCQkJfQ0KCQl9LCAxMDApOw0KCX0pOw0KfQ0KDQo="; +//const SGNUIKitLoader = "LyoNCiAqIENvcHlyaWdodCAoYykgMjAyMiBTR05ldHdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFRoZSBzb2Z0d2FyZSBpcyBhbiBleGNsdXNpdmUgY29weXJpZ2h0IG9mICJTR05ldHdvcmtzIiBhbmQgaXMgcHJvdmlkZWQgYXMgaXMgZXhjbHVzaXZlbHkgd2l0aCBvbmx5ICJVU0FHRSIgYWNjZXNzLiAiTW9kaWZpY2F0aW9uIiwgICJBbHRlcmF0aW9uIiwgIlJlLWRpc3RyaWJ1dGlvbiIgaXMgY29tcGxldGVseSBwcm9oaWJpdGVkLg0KICogVklPTEFUSU5HIFRIRSBBQk9WRSBURVJNUyBJUyBBIFBVTklTSEFCTEUgT0ZGRU5TRSBXSElDSCBNQVkgTEVBRCBUTyBMRUdBTCBDT05TRVFVRU5DRVMuDQogKi8NCg0KY29uc3QgU0dOVUlLaXQgPSB7DQoJaXNSZWFkeTogZmFsc2UsDQoJY29tcG9uZW50czoge30sDQoJb25DaGFuZ2VMaXN0ZW5lcjogW10sDQoJb25SZWFkeUxpc3RlbmVyOiBbXSwNCg0KCS8qKg0KCSAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdENoYW5nZUNhbGxiYWNrDQoJICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSB3aGljaCBpcyBjaGFuZ2VkLg0KCSAqIEBwYXJhbSB7Ym9vbGVhbnxKU09OfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIHdoaWNoIGlzIGNoYW5nZWQuDQoJICogQHBhcmFtIHtKU09OfSBjb21wb25lbnRzIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIGxvYWRlZCA8Yj5TR05VSUtpdDwvYj4gY29tcG9uZW50cywgb3IgYW4gZW1wdHkgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBpZiBubyBjb21wb25lbnRzIGxvYWRlZC4NCgkgKi8NCgkvKioNCgkgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIDxiPlNHTlVJS2l0PC9iPiBpcyByZWFkeS4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdFJlYWR5Q2FsbGJhY2sNCgkgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUmVhZHkgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KDQoJLyoqDQoJICogQWRkIGEgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnQuDQoJICoNCgkgKiBAcGFyYW0ge0pTT059IHZhbHVlIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIHRoZSBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudC4NCgkgKi8NCglzZXQgY29tcG9uZW50KHZhbHVlKSB7DQoJCWlmKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKQ0KCQkJdmFsdWUgPSB7fTsNCgkJT2JqZWN0LmFzc2lnbih0aGlzLmNvbXBvbmVudHMsIHZhbHVlKTsNCg0KCQl0aGlzLm9uQ2hhbmdlTGlzdGVuZXIuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCJjb21wb25lbnRzIiwgdmFsdWUsIHRoaXMuY29tcG9uZW50cykpOw0KCX0sDQoNCgkvKioNCgkgKiBHZXQgdGhlIGxpc3Qgb2YgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnRzLg0KCSAqDQoJICogQHJldHVybiB7b2JqZWN0fSBUaGUgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBvZiBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudHMsIG9yIGFuIGVtcHR5IDxiPjxpPkpTT048L2k+PC9iPiBvYmplY3QgaWYgbm8gY29tcG9uZW50cyBsb2FkZWQuDQoJICovDQoJZ2V0IGNvbXBvbmVudCgpIHsNCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50czsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBzdGF0dXMgb2YgcmVhZGluZXNzIG9mIDxiPlNHTlVJS2l0PC9iPi4NCgkgKg0KCSAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNSZWFkeSBUaGUgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KCXNldCByZWFkeShpc1JlYWR5KSB7DQoJCXRoaXMuaXNSZWFkeSA9IGlzUmVhZHk7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoInJlYWR5IiwgdGhpcy5pc1JlYWR5KSk7DQoNCgkJaWYoaXNSZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihpc1JlYWR5KSk7DQoJfSwNCg0KCS8qKg0KCSAqIEdldCB0aGUgc3RhdHVzIG9mIHJlYWRpbmVzcyBvZiA8Yj5TR05VSUtpdDwvYj4uDQoJICoNCgkgKiBAcmV0dXJuIHtib29sZWFufSA8Yj48aT5UUlVFPC9pPjwvYj4gaWYgPGI+U0dOVUlLaXQ8L2I+IGlzIHJlYWR5LCA8Yj48aT5GQUxTRTwvaT48L2I+IG90aGVyd2lzZS4NCgkgKi8NCglnZXQgcmVhZHkoKSB7DQoJCXJldHVybiB0aGlzLmlzUmVhZHk7DQoJfSwNCg0KCS8qKg0KCSAqIFNldCB0aGUgaGFuZGxlciBmb3IgPGI+U0dOVUlLaXQ8L2I+IDxiPjxpPk9uQ2hhbmdlPC9pPjwvYj4gZXZlbnQsIHdoaWNoIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBwYXJhbSB7U0dOVUlLaXRDaGFuZ2VDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uQ2hhbmdlTGlzdGVuZXI6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5wdXNoKGxpc3RlbmVyKTsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBoYW5kbGVyIGZvciA8Yj5TR05VSUtpdDwvYj4gPGI+PGk+T25SZWFkeTwvaT48L2I+IGV2ZW50LCB3aGljaCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSA8Yj5TR05VSUtpdDwvYj4gaXMgcmVhZHkuDQoJICoNCgkgKiBAcGFyYW0ge1NHTlVJS2l0UmVhZHlDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uUmVhZHlMaXN0ZW5lcjogZnVuY3Rpb24obGlzdGVuZXIpIHsNCgkJdGhpcy5vblJlYWR5TGlzdGVuZXIucHVzaChsaXN0ZW5lcik7DQoNCgkJaWYodGhpcy5yZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcih0aGlzLnJlYWR5KSk7DQoJfSwNCn07DQp3aW5kb3cuU0dOVUlLaXQgPSBTR05VSUtpdDsNCg0KY29uc3QgdW50aWwgPSAocHJlZGljYXRlRm4pID0+IHsNCgljb25zdCBwb2xsID0gKGRvbmUpID0+IChwcmVkaWNhdGVGbigpID8gZG9uZSgpIDogc2V0VGltZW91dCgoKSA9PiBwb2xsKGRvbmUpLCA1MDApKTsNCglyZXR1cm4gbmV3IFByb21pc2UocG9sbCk7DQp9Ow0KDQphc3luYyBmdW5jdGlvbiBwYXVzZSh2KSB7DQoJd2hpbGUodiA8IDEwMCkNCgkJYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTsNCn0NCg0KZnVuY3Rpb24gbG9vcChsaWdodGJveEltYWdlcywgaW5kZXgpIHsNCglpZihpbmRleCA9PT0gbGlnaHRib3hJbWFnZXMubGVuZ3RoKSByZXR1cm47DQoNCglsaWdodGJveEltYWdlc1tpbmRleF0ub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCWNvbnNvbGUubG9nKCJpbWFnZSAiICsgaW5kZXggKyAiIGxvYWRlZC4iKTsNCgkJbG9vcChsaWdodGJveEltYWdlcywgKytpbmRleCk7DQoJfTsNCn0NCg0KKGFzeW5jIGZ1bmN0aW9uKHByZWNhbGxiYWNrKSB7DQoJY29uc3QgdGl0bGUgPSBkb2N1bWVudC50aXRsZTsNCglpZih0aXRsZSAhPT0gdW5kZWZpbmVkKQ0KCQlkb2N1bWVudC50aXRsZSA9ICJMb2FkaW5nLi4uIjsNCg0KCWlmKHdpbmRvdy5qUXVlcnkpDQoJCSQuaG9sZFJlYWR5KHRydWUpOw0KDQoJKCgpID0+IHsNCgkJY29uc3QgY3NzID0gYC8qDQogKiBDb3B5cmlnaHQgKGMpIDIwMjIgU0dOZXR3b3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBUaGUgc29mdHdhcmUgaXMgYW4gZXhjbHVzaXZlIGNvcHlyaWdodCBvZiAiU0dOZXR3b3JrcyIgYW5kIGlzIHByb3ZpZGVkIGFzIGlzIGV4Y2x1c2l2ZWx5IHdpdGggb25seSAiVVNBR0UiIGFjY2Vzcy4gIk1vZGlmaWNhdGlvbiIsICAiQWx0ZXJhdGlvbiIsICJSZS1kaXN0cmlidXRpb24iIGlzIGNvbXBsZXRlbHkgcHJvaGliaXRlZC4NCiAqIFZJT0xBVElORyBUSEUgQUJPVkUgVEVSTVMgSVMgQSBQVU5JU0hBQkxFIE9GRkVOU0UgV0hJQ0ggTUFZIExFQUQgVE8gTEVHQUwgQ09OU0VRVUVOQ0VTLg0KICovDQoNCi5oYXMtcHJlbG9hZGVyLA0KLmhhcy1wcmVsb2FkZXIgKiB7DQpcdC0tc2duLWJhY2tncm91bmQ6ICNmZmY7DQpcdC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoOiA2cHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoOiA0NHB4Ow0KXHQtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQ6IDIycHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbjogMXB4Ow0KXHQtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXM6IDZweDsNCn0NCg0KQG1lZGlhIGFsbCBhbmQgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7DQpcdC5oYXMtcHJlbG9hZGVyLA0KXHQuaGFzLXByZWxvYWRlciAqIHsNClx0LS1zZ24tYmFja2dyb3VuZDogIzAwMDsNClx0fQ0KfQ0KDQpib2R5IHsNClx0bWFyZ2luOiAwOw0KfQ0KDQouc2duLXByZWxvYWRlciB7DQpcdHBhZGRpbmc6IDA7DQpcdHdpZHRoOiAxMDAlOw0KXHRoZWlnaHQ6IDEwMCU7DQpcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNnbi1iYWNrZ3JvdW5kKTsNClx0ZGlzcGxheTogZmxleDsNClx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQpcdGFsaWduLWl0ZW1zOiBjZW50ZXI7DQpcdHBvc2l0aW9uOiBhYnNvbHV0ZTsNClx0ei1pbmRleDogOTk5OTk5Ow0KfQ0KDQoNCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciB7DQpcdHBvc2l0aW9uOiByZWxhdGl2ZTsNClx0ZGlzcGxheTogaW5saW5lLWZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KfQ0KDQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciB7DQpcdGFuaW1hdGlvbjogcm90YXRlIDEwcyBpbmZpbml0ZSBsaW5lYXI7DQpcdHBvc2l0aW9uOiByZWxhdGl2ZTsNClx0ZGlzcGxheTogaW5saW5lLWZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KXHR3aWR0aDogMTAwJTsNClx0aGVpZ2h0OiAxMDAlOw0KfQ0KDQoNCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IGltZyB7DQpcdHdpZHRoOiAxMDAlOw0KXHRoZWlnaHQ6IDEwMCU7DQpcdG1hcmdpbjogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbik7DQpcdGRpc3BsYXk6IGZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KXHRwb3NpdGlvbjogcmVsYXRpdmU7DQpcdHRvcDogNTAlOw0KXHRsZWZ0OiA1MCU7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGltZyB7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSk7DQpcdG1hcmdpbjogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbik7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGkgew0KXHRhbmltYXRpb246IHJvdGF0ZSAzcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4wOSwgMC42LCAwLjgsIDAuMDMpOw0KXHR0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTAwJSAwOw0KXHRwb3NpdGlvbjogYWJzb2x1dGU7DQpcdGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNClx0YWxpZ24taXRlbXM6IGNlbnRlcjsNClx0dG9wOiA1MCU7DQpcdGxlZnQ6IDUwJTsNClx0Ym9yZGVyOiBzb2xpZCB2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpIHRyYW5zcGFyZW50Ow0KXHRib3JkZXItYm90dG9tOiBub25lOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgxKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuMywgMC4xMiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuMywgMC4xMiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjMsIDAuMTIsIDAuMDMpOw0KXHR3aWR0aDogdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKTsNClx0aGVpZ2h0OiB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpKTsNClx0Ym9yZGVyLWNvbG9yOiAjMjE3MmI4Ow0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAxKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDEpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgyKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuNiwgMC4yNCwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuNiwgMC4yNCwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjYsIDAuMjQsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSk7DQpcdG1hcmdpbi10b3A6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkpKTsNClx0Ym9yZGVyLWNvbG9yOiAjMThhMzliOw0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCgzKSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuOSwgMC4zNiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuOSwgMC4zNiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAwLjksIDAuMzYsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKTsNClx0aGVpZ2h0OiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpKSk7DQpcdGJvcmRlci1jb2xvcjogIzgyYzU0NTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMikgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNCkgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjIsIDAuNDgsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjIsIDAuNDgsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS4yLCAwLjQ4LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMyk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMS41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAzKSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAzKSkpOw0KXHRib3JkZXItY29sb3I6ICNmOGI3Mzk7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDMpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDUpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS41LCAwLjYsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjUsIDAuNiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjUsIDAuNiwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDQpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDQpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDQpKSk7DQpcdGJvcmRlci1jb2xvcjogI2YwNjA0NTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA0KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNikgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjgsIDAuNzIsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjgsIDAuNzIsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMS44LCAwLjcyLCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNSk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMi41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA1KSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA1KSkpOw0KXHRib3JkZXItY29sb3I6ICNlZDI4NjE7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDUpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNSkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDcpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi4xLCAwLjg0LCAwLjAzKTsNClx0LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi4xLCAwLjg0LCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDIuMSwgMC44NCwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDYpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDMpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDYpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDYpKSk7DQpcdGJvcmRlci1jb2xvcjogI2MxMjY4MDsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNikgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA2KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoOCkgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjQsIDAuOTYsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjQsIDAuOTYsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi40LCAwLjk2LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNyk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMy41KTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA3KSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiA3KSkpOw0KXHRib3JkZXItY29sb3I6ICM1ZDMxOTE7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDcpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQoNCkAtbW96LWtleWZyYW1lcyByb3RhdGUgew0KXHR0byB7DQpcdFx0dHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsNClx0fQ0KfQ0KQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZSB7DQpcdHRvIHsNClx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOw0KXHR9DQp9DQpAa2V5ZnJhbWVzIHJvdGF0ZSB7DQpcdHRvIHsNClx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOw0KXHR9DQp9DQoNCg0KYDsNCgkJY29uc3QgaGVhZCAgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sDQoJCSAgICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsNCg0KCQloZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsNCgkJc3R5bGUudHlwZSA9ICJ0ZXh0L2NzcyI7DQoJCXN0eWxlLmlkID0gInNnbi11aWtpdC1zdHlsZXMiOw0KCQlpZihzdHlsZS5zdHlsZVNoZWV0KSB7DQoJCQkvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBJRTggYW5kIGJlbG93Lg0KCQkJc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzOw0KCQl9IGVsc2Ugew0KCQkJc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7DQoJCX0NCgl9KSgpOw0KCShmdW5jdGlvbigpIHsNCgkJbGV0IHByZWxvYWRlckVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCgkJcHJlbG9hZGVyRWxlbS5jbGFzc05hbWUgPSAic2duLXByZWxvYWRlciI7DQoJCWxldCBwcmVsb2FkZXIgPSBgXHRcdFx0PGRpdiBjbGFzcz0icHJlbG9hZGVyIj5cbmA7DQoJCS8vcHJlbG9hZGVyICs9IGBcdFx0XHRcdDxpbWcgc3JjPSI8Pz0kcHVibGljX2ltZ0Fzc2V0czs/Pmljb25zL3hzbWFsbC5wbmciPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdDxkaXYgY2xhc3M9InNwaW5uZXIiPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdDwvZGl2PlxuYDsNCgkJcHJlbG9hZGVyICs9IGBcdFx0XHQ8L2Rpdj5cbmA7DQoJCXByZWxvYWRlciArPSBgXHRcdDwvZGl2PlxuYDsNCg0KCQlwcmVsb2FkZXJFbGVtLmlubmVySFRNTCA9IHByZWxvYWRlcjsNCg0KCQl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCQlkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSArPSAiIGhhcy1wcmVsb2FkZXIiOw0KCQkJZG9jdW1lbnQuYm9keS5pbnNlcnRCZWZvcmUocHJlbG9hZGVyRWxlbSwgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsNCgkJfTsNCgl9KSgpOw0KDQoJY29uc3QgY3VycmVudFNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9XCJTR05VSUtpdC5sb2FkZXIuanNcIl0iKTsNCgljb25zdCB1cmwgPSBjdXJyZW50U2NyaXB0LnNyYy5zcGxpdCgiLyIpLnNsaWNlKDAsIC0yKS5qb2luKCIvIikgKyAiLyI7DQoJY29uc3QgcHJlbG9hZCA9IFsNCgkJLy8nanMvaTE4bi9TR05pMThuLmpzJw0KCV07DQoNCglsZXQgZmlsZXNsb2FkZWQgPSAwOw0KCWNvbnN0IGZpbGVzdG9sb2FkID0gcHJlbG9hZC5sZW5ndGg7DQoNCglpZihmaWxlc3RvbG9hZCA+IDApIHsNCgkJZm9yKGxldCBpID0gMDsgaSA8IGZpbGVzdG9sb2FkOyBpKyspIHsNCgkJCWNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KCQkJc2NyaXB0LnNyYyA9IHVybCArIHByZWxvYWRbaV07DQoJCQlzY3JpcHQuYXN5bmMgPSBmYWxzZTsNCgkJCXNjcmlwdC5kZWZlciA9IGZhbHNlOw0KCQkJY3VycmVudFNjcmlwdC5hZnRlcihzY3JpcHQpOw0KCQkJaWYoaSA9PT0gMCkNCgkJCQlzY3JpcHQuaWQgPSAic2duLXByZWxvYWQtZW5kIjsNCgkJCXNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQlmaWxlc2xvYWRlZCsrOw0KCQkJCXNjcmlwdC5vbmxvYWQgPSBudWxsOw0KCQkJCWZpbmlzaExvYWQoKTsNCgkJCX07DQoJCX0NCgl9IGVsc2UNCgkJZmluaXNoTG9hZCgpOw0KDQoJYXN5bmMgZnVuY3Rpb24gZmluaXNoTG9hZCgpIHsNCgkJbGV0IHByb2dyZXNzID0gTWF0aC5yb3VuZCgoZmlsZXNsb2FkZWQgKiAxMDApIC8gZmlsZXN0b2xvYWQpIHx8IDEwMDsNCg0KCQlhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsNCgkJCWlmKGZpbGVzbG9hZGVkID49IGZpbGVzdG9sb2FkKSB7DQoJCQkJcmVzb2x2ZSgpOw0KCQkJfQ0KCQl9KS50aGVuKGZ1bmN0aW9uKCkgew0KCQkJLy9pbXBvcnQoJy4vaGVscGVycy9oZWxwZXJzLmpzJyk7DQoJCQkkKCJoZWFkID4gdGl0bGUiKS50ZXh0KHRpdGxlKTsNCgkJCWlmKHR5cGVvZiBwcmVjYWxsYmFjayA9PT0gImZ1bmN0aW9uIiAmJiBwcm9ncmVzcyA9PT0gMTAwKQ0KCQkJCXByZWNhbGxiYWNrKCk7DQoJCX0pOw0KCX0NCn0pKGZ1bmN0aW9uKCkgew0KCShhc3luYyBmdW5jdGlvbihjYWxsYmFjaykgew0KCQljb25zdCBzZ251aWtpdFNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9XCJTR05VSUtpdC5sb2FkZXIuanNcIl0iKTsNCgkJY29uc3QgY3VycmVudFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZ24tcHJlbG9hZC1lbmQiKSB8fCBzZ251aWtpdFNjcmlwdDsNCg0KCQlmdW5jdGlvbiBnZXRTY3JpcHRVUkwoKSB7DQoJCQlyZXR1cm4gc2dudWlraXRTY3JpcHQuc3JjOw0KCQl9DQoNCgkJY29uc3QgdXJsID0gZ2V0U2NyaXB0VVJMKCkuc3BsaXQoIi8iKS5zbGljZSgwLCAtMikuam9pbigiLyIpICsgIi8iOw0KDQoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQoJCQlzdGFydExvYWQoKTsNCgkJfSwgNTAwMCk7DQoNCgkJZnVuY3Rpb24gc3RhcnRMb2FkKCkgew0KCQkJY29uc3Qgc2NyaXB0cyA9IFsNCgkJCQkianMvU0dOVUlLaXQuYnVuZGxlLmpzIiwNCgkJCV07DQoJCQljb25zdCBzdHlsZXMgPSBbDQoJCQkJImNzcy9TR05VSUtpdC5idW5kbGUuY3NzIiwNCgkJCV07DQoJCQlsZXQgZmlsZXNsb2FkZWQgPSAwLA0KCQkJICAgIGxhc3RTY3JpcHQgID0gY3VycmVudFNjcmlwdDsNCgkJCWNvbnN0IGZpbGVzdG9sb2FkID0gc2NyaXB0cy5sZW5ndGggKyBzdHlsZXMubGVuZ3RoOw0KDQoJCQlmdW5jdGlvbiBsb2FkU2NyaXB0KGkpIHsNCgkJCQlpZihpID09PSBzY3JpcHRzLmxlbmd0aCkgcmV0dXJuOw0KDQoJCQkJY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7DQoJCQkJc2NyaXB0LnNyYyA9IHVybCArIHNjcmlwdHNbaV07DQoJCQkJc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgew0KCQkJCQlmaWxlc2xvYWRlZCsrOw0KCQkJCQlTR05VSUtpdC5jb21wb25lbnQgPSB7DQoJCQkJCQlpOiBzY3JpcHRzW2ldLA0KCQkJCQl9Ow0KCQkJCQlzY3JpcHQub25sb2FkID0gbnVsbDsNCgkJCQkJLy9jb25zb2xlLmxvZyhgTE9BREVEIFNDUklQVDogJHtzY3JpcHQuc3JjfWAsIGAke2l9LyR7ZmlsZXN0b2xvYWR9YCk7DQoJCQkJCWZpbmlzaExvYWQoKTsNCgkJCQkJbG9hZFNjcmlwdCgrK2kpOw0KCQkJCX07DQoJCQkJbGFzdFNjcmlwdC5hZnRlcihzY3JpcHQpOw0KCQkJCWxhc3RTY3JpcHQgPSBsYXN0U2NyaXB0Lm5leHRFbGVtZW50U2libGluZyB8fCBjdXJyZW50U2NyaXB0Ow0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBsb2FkU3R5bGUoaSkgew0KCQkJCWlmKGkgPT09IHNjcmlwdHMubGVuZ3RoKSByZXR1cm47DQoNCgkJCQljb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsNCgkJCQlzdHlsZS5yZWwgPSAic3R5bGVzaGVldCI7DQoJCQkJc3R5bGUuaHJlZiA9IHVybCArIHN0eWxlc1tpXTsNCgkJCQlzdHlsZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJZmlsZXNsb2FkZWQrKzsNCgkJCQkJc3R5bGUub25sb2FkID0gbnVsbDsNCgkJCQkJZmluaXNoTG9hZCgpOw0KCQkJCQlsb29wKCsraSk7DQoJCQkJfTsNCgkJCQljdXJyZW50U2NyaXB0LmFmdGVyKHN0eWxlKTsNCgkJCX0NCg0KCQkJbG9hZFNjcmlwdCgwKTsNCgkJCWxvYWRTdHlsZSgwKTsNCg0KCQkJYXN5bmMgZnVuY3Rpb24gZmluaXNoTG9hZCgpIHsNCgkJCQljb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoKGZpbGVzbG9hZGVkICogMTAwKSAvIGZpbGVzdG9sb2FkKTsNCg0KCQkJCWlmKHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgew0KCQkJCQljYWxsYmFjayhmaWxlc2xvYWRlZCwgZmlsZXN0b2xvYWQsIHByb2dyZXNzKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9KShhc3luYyBmdW5jdGlvbihsb2FkZWQsIHRvdGFsLCBwcm9ncmVzcykgew0KCQlpZihwcm9ncmVzcyA9PT0gMTAwKSB7DQoJCQkvL2ltcG9ydCgnLi9pMThuL1NHTmkxOG4uanMnKTsNCgkJCS8vaW1wb3J0KCcuL2NvbXBvbmVudHMvY29tcG9uZW50cy5qcycpOw0KCQkJU0dOVUlLaXQucmVhZHkgPSB0cnVlOw0KCQkJd2luZG93LlNHTlVJS2l0UmVhZHkgPSB0cnVlOw0KDQoJCQljb25zdCBsZWZ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic3R5bGVbZGF0YS1ja2U9XCJ0cnVlXCJdIik7DQoJCQlpZihsZWZ0ICE9PSBudWxsKQ0KCQkJCWxlZnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsZWZ0KTsNCg0KCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQkkLmhvbGRSZWFkeShmYWxzZSk7DQoJCQkJalF1ZXJ5LnJlYWR5KCk7DQoNCgkJCQkkKCJib2R5IikuY2hpbGRyZW4oIi5zZ24tcHJlbG9hZGVyIikuZmFkZU91dCgyMDAwLCBmdW5jdGlvbigpIHsNCgkJCQkJJCgiYm9keSIpLmNoaWxkcmVuKCIuc2duLXByZWxvYWRlciIpLnJlbW92ZSgpOw0KCQkJCQkkKCJib2R5IikucmVtb3ZlQ2xhc3MoImhhcy1wcmVsb2FkZXIiKTsNCgkJCQl9KTsNCgkJCX0sIDUwMDApOw0KDQoJCX0NCgl9KTsNCn0pOw0KDQoNCmFzeW5jIGZ1bmN0aW9uIGdldFNHTkkxOG5JbnN0YW5jZShjYWxsYmFjaykgew0KCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQoJCWNvbnN0IHRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCWlmKGNoZWNrSW50ZXJ2YWxIYW5kbGVyKQ0KCQkJCWNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbEhhbmRsZXIpOw0KCQl9LCAxMDAwMCk7DQoNCgkJY29uc3QgY2hlY2tJbnRlcnZhbEhhbmRsZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJCWlmKHdpbmRvdy5TR05VSUtpdFJlYWR5KSB7DQoJCQkJaWYodGltZW91dEhhbmRsZXIpDQoJCQkJCWNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlcik7DQoJCQkJY2xlYXJJbnRlcnZhbChjaGVja0ludGVydmFsSGFuZGxlcik7DQoJCQkJY29uc3QgYyA9IG5ldyBTR05pMThuKCk7DQoNCgkJCQlyZXNvbHZlKGMpOw0KCQkJfQ0KCQl9LCAxMDApOw0KCX0pOw0KfQ0KDQo="; + +const SGNUIKitLoader = "LyoNCiAqIENvcHlyaWdodCAoYykgMjAyMiBTR05ldHdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFRoZSBzb2Z0d2FyZSBpcyBhbiBleGNsdXNpdmUgY29weXJpZ2h0IG9mICJTR05ldHdvcmtzIiBhbmQgaXMgcHJvdmlkZWQgYXMgaXMgZXhjbHVzaXZlbHkgd2l0aCBvbmx5ICJVU0FHRSIgYWNjZXNzLiAiTW9kaWZpY2F0aW9uIiwgICJBbHRlcmF0aW9uIiwgIlJlLWRpc3RyaWJ1dGlvbiIgaXMgY29tcGxldGVseSBwcm9oaWJpdGVkLg0KICogVklPTEFUSU5HIFRIRSBBQk9WRSBURVJNUyBJUyBBIFBVTklTSEFCTEUgT0ZGRU5TRSBXSElDSCBNQVkgTEVBRCBUTyBMRUdBTCBDT05TRVFVRU5DRVMuDQogKi8NCg0KY29uc3QgU0dOVUlLaXQgPSB7DQoJaXNSZWFkeTogZmFsc2UsDQoJY29tcG9uZW50czoge30sDQoJb25DaGFuZ2VMaXN0ZW5lcjogW10sDQoJb25SZWFkeUxpc3RlbmVyOiBbXSwNCg0KCS8qKg0KCSAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdENoYW5nZUNhbGxiYWNrDQoJICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSB3aGljaCBpcyBjaGFuZ2VkLg0KCSAqIEBwYXJhbSB7Ym9vbGVhbnxKU09OfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIHdoaWNoIGlzIGNoYW5nZWQuDQoJICogQHBhcmFtIHtKU09OfSBjb21wb25lbnRzIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIGxvYWRlZCA8Yj5TR05VSUtpdDwvYj4gY29tcG9uZW50cywgb3IgYW4gZW1wdHkgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBpZiBubyBjb21wb25lbnRzIGxvYWRlZC4NCgkgKi8NCgkvKioNCgkgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIDxiPlNHTlVJS2l0PC9iPiBpcyByZWFkeS4NCgkgKg0KCSAqIEBjYWxsYmFjayBTR05VSUtpdFJlYWR5Q2FsbGJhY2sNCgkgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUmVhZHkgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KDQoJLyoqDQoJICogQWRkIGEgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnQuDQoJICoNCgkgKiBAcGFyYW0ge0pTT059IHZhbHVlIFRoZSA8Yj48aT5KU09OPC9pPjwvYj4gb2JqZWN0IG9mIHRoZSBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudC4NCgkgKi8NCglzZXQgY29tcG9uZW50KHZhbHVlKSB7DQoJCWlmKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKQ0KCQkJdmFsdWUgPSB7fTsNCgkJT2JqZWN0LmFzc2lnbih0aGlzLmNvbXBvbmVudHMsIHZhbHVlKTsNCg0KCQl0aGlzLm9uQ2hhbmdlTGlzdGVuZXIuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCJjb21wb25lbnRzIiwgdmFsdWUsIHRoaXMuY29tcG9uZW50cykpOw0KCX0sDQoNCgkvKioNCgkgKiBHZXQgdGhlIGxpc3Qgb2YgbG9hZGVkIDxiPlNHTlVJS2l0PC9iPiBjb21wb25lbnRzLg0KCSAqDQoJICogQHJldHVybiB7b2JqZWN0fSBUaGUgPGI+PGk+SlNPTjwvaT48L2I+IG9iamVjdCBvZiBsb2FkZWQgPGI+U0dOVUlLaXQ8L2I+IGNvbXBvbmVudHMsIG9yIGFuIGVtcHR5IDxiPjxpPkpTT048L2k+PC9iPiBvYmplY3QgaWYgbm8gY29tcG9uZW50cyBsb2FkZWQuDQoJICovDQoJZ2V0IGNvbXBvbmVudCgpIHsNCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50czsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBzdGF0dXMgb2YgcmVhZGluZXNzIG9mIDxiPlNHTlVJS2l0PC9iPi4NCgkgKg0KCSAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNSZWFkeSBUaGUgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3Mgb2YgPGI+U0dOVUlLaXQ8L2I+Lg0KCSAqLw0KCXNldCByZWFkeShpc1JlYWR5KSB7DQoJCXRoaXMuaXNSZWFkeSA9IGlzUmVhZHk7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoInJlYWR5IiwgdGhpcy5pc1JlYWR5KSk7DQoNCgkJaWYoaXNSZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihpc1JlYWR5KSk7DQoJfSwNCg0KCS8qKg0KCSAqIEdldCB0aGUgc3RhdHVzIG9mIHJlYWRpbmVzcyBvZiA8Yj5TR05VSUtpdDwvYj4uDQoJICoNCgkgKiBAcmV0dXJuIHtib29sZWFufSA8Yj48aT5UUlVFPC9pPjwvYj4gaWYgPGI+U0dOVUlLaXQ8L2I+IGlzIHJlYWR5LCA8Yj48aT5GQUxTRTwvaT48L2I+IG90aGVyd2lzZS4NCgkgKi8NCglnZXQgcmVhZHkoKSB7DQoJCXJldHVybiB0aGlzLmlzUmVhZHk7DQoJfSwNCg0KCS8qKg0KCSAqIFNldCB0aGUgaGFuZGxlciBmb3IgPGI+U0dOVUlLaXQ8L2I+IDxiPjxpPk9uQ2hhbmdlPC9pPjwvYj4gZXZlbnQsIHdoaWNoIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgbG9hZGVkL3JlbW92ZWQgb3IgdGhlIHN0YXR1cyBvZiByZWFkaW5lc3MgaXMgY2hhbmdlZC4NCgkgKg0KCSAqIEBwYXJhbSB7U0dOVUlLaXRDaGFuZ2VDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uQ2hhbmdlTGlzdGVuZXI6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7DQoJCXRoaXMub25DaGFuZ2VMaXN0ZW5lci5wdXNoKGxpc3RlbmVyKTsNCgl9LA0KDQoJLyoqDQoJICogU2V0IHRoZSBoYW5kbGVyIGZvciA8Yj5TR05VSUtpdDwvYj4gPGI+PGk+T25SZWFkeTwvaT48L2I+IGV2ZW50LCB3aGljaCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSA8Yj5TR05VSUtpdDwvYj4gaXMgcmVhZHkuDQoJICoNCgkgKiBAcGFyYW0ge1NHTlVJS2l0UmVhZHlDYWxsYmFja31saXN0ZW5lcg0KCSAqLw0KCXNldE9uUmVhZHlMaXN0ZW5lcjogZnVuY3Rpb24obGlzdGVuZXIpIHsNCgkJdGhpcy5vblJlYWR5TGlzdGVuZXIucHVzaChsaXN0ZW5lcik7DQoNCgkJaWYodGhpcy5yZWFkeSkNCgkJCXRoaXMub25SZWFkeUxpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcih0aGlzLnJlYWR5KSk7DQoJfSwNCn07DQp3aW5kb3cuU0dOVUlLaXQgPSBTR05VSUtpdDsNCg0KaWYodHlwZW9mIGpRdWVyeSA9PT0gJ3VuZGVmaW5lZCcpIHsNCgkvKiEgalF1ZXJ5IHYzLjYuMCB8IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovDQoJIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oQyxlKXsidXNlIHN0cmljdCI7dmFyIHQ9W10scj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yscz10LnNsaWNlLGc9dC5mbGF0P2Z1bmN0aW9uKGUpe3JldHVybiB0LmZsYXQuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29uY2F0LmFwcGx5KFtdLGUpfSx1PXQucHVzaCxpPXQuaW5kZXhPZixuPXt9LG89bi50b1N0cmluZyx2PW4uaGFzT3duUHJvcGVydHksYT12LnRvU3RyaW5nLGw9YS5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLml0ZW19LHg9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sRT1DLmRvY3VtZW50LGM9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBiKGUsdCxuKXt2YXIgcixpLG89KG49bnx8RSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsdClmb3IociBpbiBjKShpPXRbcl18fHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShyKSkmJm8uc2V0QXR0cmlidXRlKHIsaSk7bi5oZWFkLmFwcGVuZENoaWxkKG8pLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bltvLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX12YXIgZj0iMy42LjAiLFM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFMuZm4uaW5pdChlLHQpfTtmdW5jdGlvbiBwKGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXcoZSk7cmV0dXJuIW0oZSkmJiF4KGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJjA8dCYmdC0xIGluIGUpfVMuZm49Uy5wcm90b3R5cGU9e2pxdWVyeTpmLGNvbnN0cnVjdG9yOlMsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9zLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PVMubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBTLmVhY2godGhpcyxlKX0sbWFwOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLm1hcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uY2FsbChlLHQsZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLmdyZXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybih0KzEpJTJ9KSl9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLmdyZXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiB0JTJ9KSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKGU8MD90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjaygwPD1uJiZuPHQ/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOnUsc29ydDp0LnNvcnQsc3BsaWNlOnQuc3BsaWNlfSxTLmV4dGVuZD1TLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYobD1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpcj1lW3RdLCJfX3Byb3RvX18iIT09dCYmYSE9PXImJihsJiZyJiYoUy5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KG49YVt0XSxvPWkmJiFBcnJheS5pc0FycmF5KG4pP1tdOml8fFMuaXNQbGFpbk9iamVjdChuKT9uOnt9LGk9ITEsYVt0XT1TLmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sUy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGYrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PW8uY2FsbChlKSkmJighKHQ9cihlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPXYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmYS5jYWxsKG4pPT09bCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlLHQsbil7YihlLHtub25jZTp0JiZ0Lm5vbmNlfSxuKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihwKGUpKXtmb3Iobj1lLmxlbmd0aDtyPG47cisrKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVha31lbHNlIGZvcihyIGluIGUpaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrO3JldHVybiBlfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKHAoT2JqZWN0KGUpKT9TLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTp1LmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6aS5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLGk9MCxvPWUubGVuZ3RoLGE9IW47aTxvO2krKykhdChlW2ldLGkpIT09YSYmci5wdXNoKGVbaV0pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLGE9W107aWYocChlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtyZXR1cm4gZyhhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTLmZuW1N5bWJvbC5pdGVyYXRvcl09dFtTeW1ib2wuaXRlcmF0b3JdKSxTLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7blsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTt2YXIgZD1mdW5jdGlvbihuKXt2YXIgZSxkLGIsbyxpLGgsZixnLHcsdSxsLFQsQyxhLEUsdixzLGMseSxTPSJzaXp6bGUiKzEqbmV3IERhdGUscD1uLmRvY3VtZW50LGs9MCxyPTAsbT11ZSgpLHg9dWUoKSxBPXVlKCksTj11ZSgpLGo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihsPSEwKSwwfSxEPXt9Lmhhc093blByb3BlcnR5LHQ9W10scT10LnBvcCxMPXQucHVzaCxIPXQucHVzaCxPPXQuc2xpY2UsUD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLEk9Iig/OlxcXFxbXFxkYS1mQS1GXXsxLDZ9IitNKyI/fFxcXFxbXlxcclxcblxcZl18W1xcdy1dfFteXDAtXFx4N2ZdKSsiLFc9IlxcWyIrTSsiKigiK0krIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitJKyIpKXwpIitNKyIqXFxdIixGPSI6KCIrSSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrVysiKSopfC4qKVxcKXwpIixCPW5ldyBSZWdFeHAoTSsiKyIsImciKSwkPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksXz1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLHo9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSxVPW5ldyBSZWdFeHAoTSsifD4iKSxYPW5ldyBSZWdFeHAoRiksVj1uZXcgUmVnRXhwKCJeIitJKyIkIiksRz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitJKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0krIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0krInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitXKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrRiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sWT0vSFRNTCQvaSxRPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxLPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZWU9L1srfl0vLHRlPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9IitNKyI/fFxcXFwoW15cXHJcXG5cXGZdKSIsImciKSxuZT1mdW5jdGlvbihlLHQpe3ZhciBuPSIweCIrZS5zbGljZSgxKS02NTUzNjtyZXR1cm4gdHx8KG48MD9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobj4+MTB8NTUyOTYsMTAyMyZufDU2MzIwKSl9LHJlPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLGllPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/IlwwIj09PWU/Ilx1ZmZmZCI6ZS5zbGljZSgwLC0xKSsiXFwiK2UuY2hhckNvZGVBdChlLmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrZX0sb2U9ZnVuY3Rpb24oKXtUKCl9LGFlPWJlKGZ1bmN0aW9uKGUpe3JldHVybiEwPT09ZS5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtILmFwcGx5KHQ9Ty5jYWxsKHAuY2hpbGROb2RlcykscC5jaGlsZE5vZGVzKSx0W3AuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGUpe0g9e2FwcGx5OnQubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7TC5hcHBseShlLE8uY2FsbCh0KSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sZW5ndGgscj0wO3doaWxlKGVbbisrXT10W3IrK10pO2UubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHNlKHQsZSxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGY9ZSYmZS5vd25lckRvY3VtZW50LHA9ZT9lLm5vZGVUeXBlOjk7aWYobj1ufHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09cCYmOSE9PXAmJjExIT09cClyZXR1cm4gbjtpZighciYmKFQoZSksZT1lfHxDLEUpKXtpZigxMSE9PXAmJih1PVouZXhlYyh0KSkpaWYoaT11WzFdKXtpZig5PT09cCl7aWYoIShhPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiBuO2lmKGEuaWQ9PT1pKXJldHVybiBuLnB1c2goYSksbn1lbHNlIGlmKGYmJihhPWYuZ2V0RWxlbWVudEJ5SWQoaSkpJiZ5KGUsYSkmJmEuaWQ9PT1pKXJldHVybiBuLnB1c2goYSksbn1lbHNle2lmKHVbMl0pcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxuO2lmKChpPXVbM10pJiZkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSksbn1pZihkLnFzYSYmIU5bdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PXB8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoYz10LGY9ZSwxPT09cCYmKFUudGVzdCh0KXx8ei50ZXN0KHQpKSl7KGY9ZWUudGVzdCh0KSYmeWUoZS5wYXJlbnROb2RlKXx8ZSk9PT1lJiZkLnNjb3BlfHwoKHM9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP3M9cy5yZXBsYWNlKHJlLGllKTplLnNldEF0dHJpYnV0ZSgiaWQiLHM9UykpLG89KGw9aCh0KSkubGVuZ3RoO3doaWxlKG8tLSlsW29dPShzPyIjIitzOiI6c2NvcGUiKSsiICIreGUobFtvXSk7Yz1sLmpvaW4oIiwiKX10cnl7cmV0dXJuIEguYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7Tih0LCEwKX1maW5hbGx5e3M9PT1TJiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBnKHQucmVwbGFjZSgkLCIkMSIpLGUsbixyKX1mdW5jdGlvbiB1ZSgpe3ZhciByPVtdO3JldHVybiBmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHIucHVzaCh0KyIgIik+Yi5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbci5zaGlmdCgpXSxlW3QrIiAiXT1ufX1mdW5jdGlvbiBsZShlKXtyZXR1cm4gZVtTXT0hMCxlfWZ1bmN0aW9uIGNlKGUpe3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBmZShlLHQpe3ZhciBuPWUuc3BsaXQoInwiKSxyPW4ubGVuZ3RoO3doaWxlKHItLSliLmF0dHJIYW5kbGVbbltyXV09dH1mdW5jdGlvbiBwZShlLHQpe3ZhciBuPXQmJmUscj1uJiYxPT09ZS5ub2RlVHlwZSYmMT09PXQubm9kZVR5cGUmJmUuc291cmNlSW5kZXgtdC5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gZGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGhlKG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT10fHwiYnV0dG9uIj09PXQpJiZlLnR5cGU9PT1ufX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmFlKGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZlKGEpe3JldHVybiBsZShmdW5jdGlvbihvKXtyZXR1cm4gbz0rbyxsZShmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShbXSxlLmxlbmd0aCxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249cltpXV0mJihlW25dPSEodFtuXT1lW25dKSl9KX0pfWZ1bmN0aW9uIHllKGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9Zm9yKGUgaW4gZD1zZS5zdXBwb3J0PXt9LGk9c2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5uYW1lc3BhY2VVUkksbj1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIVkudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxUPXNlLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lP2Uub3duZXJEb2N1bWVudHx8ZTpwO3JldHVybiByIT1DJiY5PT09ci5ub2RlVHlwZSYmci5kb2N1bWVudEVsZW1lbnQmJihhPShDPXIpLmRvY3VtZW50RWxlbWVudCxFPSFpKEMpLHAhPUMmJihuPUMuZGVmYXVsdFZpZXcpJiZuLnRvcCE9PW4mJihuLmFkZEV2ZW50TGlzdGVuZXI/bi5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLG9lLCExKTpuLmF0dGFjaEV2ZW50JiZuLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsb2UpKSxkLnNjb3BlPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBhLmFwcGVuZENoaWxkKGUpLmFwcGVuZENoaWxkKEMuY3JlYXRlRWxlbWVudCgiZGl2IikpLCJ1bmRlZmluZWQiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsJiYhZS5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgZmllbGRzZXQgZGl2IikubGVuZ3RofSksZC5hdHRyaWJ1dGVzPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGQuZ2V0RWxlbWVudHNCeVRhZ05hbWU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoQy5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxkLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9Sy50ZXN0KEMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksZC5nZXRCeUlkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBhLmFwcGVuZENoaWxkKGUpLmlkPVMsIUMuZ2V0RWxlbWVudHNCeU5hbWV8fCFDLmdldEVsZW1lbnRzQnlOYW1lKFMpLmxlbmd0aH0pLGQuZ2V0QnlJZD8oYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbj9bbl06W119fSk6KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciBuPWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIHQmJnQudmFsdWU9PT1ufX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbixyLGksbz10LmdldEVsZW1lbnRCeUlkKGUpO2lmKG8pe2lmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXTtpPXQuZ2V0RWxlbWVudHNCeU5hbWUoZSkscj0wO3doaWxlKG89aVtyKytdKWlmKChuPW8uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxiLmZpbmQuVEFHPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTpkLnFzYT90LnF1ZXJ5U2VsZWN0b3JBbGwoZSk6dm9pZCAwfTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT0wLG89dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZigiKiI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxiLmZpbmQuQ0xBU1M9ZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZFKXJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LHM9W10sdj1bXSwoZC5xc2E9Sy50ZXN0KEMucXVlcnlTZWxlY3RvckFsbCkpJiYoY2UoZnVuY3Rpb24oZSl7dmFyIHQ7YS5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUw9IjxhIGlkPSciK1MrIic+PC9hPjxzZWxlY3QgaWQ9JyIrUysiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZ2LnB1c2goIlsqXiRdPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHx2LnB1c2goIlxcWyIrTSsiKig/OnZhbHVlfCIrUisiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK1MrIi1dIikubGVuZ3RofHx2LnB1c2goIn49IiksKHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxlLmFwcGVuZENoaWxkKHQpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHx2LnB1c2goIlxcWyIrTSsiKm5hbWUiK00rIio9IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrUysiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIlxcXGYiKSx2LnB1c2goIltcXHJcXG5cXGZdIil9KSxjZShmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+Ijt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZ2LnB1c2goIm5hbWUiK00rIipbKl4kfCF+XT89IiksMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLmFwcGVuZENoaWxkKGUpLmRpc2FibGVkPSEwLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHYucHVzaCgiLC4qOiIpfSkpLChkLm1hdGNoZXNTZWxlY3Rvcj1LLnRlc3QoYz1hLm1hdGNoZXN8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1vek1hdGNoZXNTZWxlY3Rvcnx8YS5vTWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmNlKGZ1bmN0aW9uKGUpe2QuZGlzY29ubmVjdGVkTWF0Y2g9Yy5jYWxsKGUsIioiKSxjLmNhbGwoZSwiW3MhPScnXTp4Iikscy5wdXNoKCIhPSIsRil9KSx2PXYubGVuZ3RoJiZuZXcgUmVnRXhwKHYuam9pbigifCIpKSxzPXMubGVuZ3RoJiZuZXcgUmVnRXhwKHMuam9pbigifCIpKSx0PUsudGVzdChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx5PXR8fEsudGVzdChhLmNvbnRhaW5zKT9mdW5jdGlvbihlLHQpe3ZhciBuPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpd2hpbGUodD10LnBhcmVudE5vZGUpaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LGo9dD9mdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7dmFyIG49IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIXQuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIG58fCgxJihuPShlLm93bmVyRG9jdW1lbnR8fGUpPT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhZC5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1uP2U9PUN8fGUub3duZXJEb2N1bWVudD09cCYmeShwLGUpPy0xOnQ9PUN8fHQub3duZXJEb2N1bWVudD09cCYmeShwLHQpPzE6dT9QKHUsZSktUCh1LHQpOjA6NCZuPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09Qz8tMTp0PT1DPzE6aT8tMTpvPzE6dT9QKHUsZSktUCh1LHQpOjA7aWYoaT09PW8pcmV0dXJuIHBlKGUsdCk7bj1lO3doaWxlKG49bi5wYXJlbnROb2RlKWEudW5zaGlmdChuKTtuPXQ7d2hpbGUobj1uLnBhcmVudE5vZGUpcy51bnNoaWZ0KG4pO3doaWxlKGFbcl09PT1zW3JdKXIrKztyZXR1cm4gcj9wZShhW3JdLHNbcl0pOmFbcl09PXA/LTE6c1tyXT09cD8xOjB9KSxDfSxzZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHNlKGUsbnVsbCxudWxsLHQpfSxzZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZihUKGUpLGQubWF0Y2hlc1NlbGVjdG9yJiZFJiYhTlt0KyIgIl0mJighc3x8IXMudGVzdCh0KSkmJighdnx8IXYudGVzdCh0KSkpdHJ5e3ZhciBuPWMuY2FsbChlLHQpO2lmKG58fGQuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChlKXtOKHQsITApfXJldHVybiAwPHNlKHQsQyxudWxsLFtlXSkubGVuZ3RofSxzZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT1DJiZUKGUpLHkoZSx0KX0sc2UuYXR0cj1mdW5jdGlvbihlLHQpeyhlLm93bmVyRG9jdW1lbnR8fGUpIT1DJiZUKGUpO3ZhciBuPWIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLHI9biYmRC5jYWxsKGIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFFKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjpkLmF0dHJpYnV0ZXN8fCFFP2UuZ2V0QXR0cmlidXRlKHQpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0sc2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHJlLGllKX0sc2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxzZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj0wLGk9MDtpZihsPSFkLmRldGVjdER1cGxpY2F0ZXMsdT0hZC5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChqKSxsKXt3aGlsZSh0PWVbaSsrXSl0PT09ZVtpXSYmKHI9bi5wdXNoKGkpKTt3aGlsZShyLS0pZS5zcGxpY2UobltyXSwxKX1yZXR1cm4gdT1udWxsLGV9LG89c2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9byhlKX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1vKHQpO3JldHVybiBufSwoYj1zZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpsZSxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UodGUsbmUpLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKHRlLG5lKSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8c2UuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmc2UuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNl0mJmVbMl07cmV0dXJuIEcuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09ZVs0XXx8ZVs1XXx8IiI6biYmWC50ZXN0KG4pJiYodD1oKG4sITApKSYmKHQ9bi5pbmRleE9mKCIpIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9bVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZtKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKG4scixpKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9c2UuYXR0cihlLG4pO3JldHVybiBudWxsPT10PyIhPSI9PT1yOiFyfHwodCs9IiIsIj0iPT09cj90PT09aToiIT0iPT09cj90IT09aToiXj0iPT09cj9pJiYwPT09dC5pbmRleE9mKGkpOiIqPSI9PT1yP2kmJi0xPHQuaW5kZXhPZihpKToiJD0iPT09cj9pJiZ0LnNsaWNlKC1pLmxlbmd0aCk9PT1pOiJ+PSI9PT1yPy0xPCgiICIrdC5yZXBsYWNlKEIsIiAiKSsiICIpLmluZGV4T2YoaSk6Inw9Ij09PXImJih0PT09aXx8dC5zbGljZSgwLGkubGVuZ3RoKzEpPT09aSsiLSIpKX19LENISUxEOmZ1bmN0aW9uKGgsZSx0LGcsdil7dmFyIHk9Im50aCIhPT1oLnNsaWNlKDAsMyksbT0ibGFzdCIhPT1oLnNsaWNlKC00KSx4PSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1nJiYwPT09dj9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsPXkhPT1tPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsYz1lLnBhcmVudE5vZGUsZj14JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscD0hbiYmIXgsZD0hMTtpZihjKXtpZih5KXt3aGlsZShsKXthPWU7d2hpbGUoYT1hW2xdKWlmKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSlyZXR1cm4hMTt1PWw9Im9ubHkiPT09aCYmIXUmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYodT1bbT9jLmZpcnN0Q2hpbGQ6Yy5sYXN0Q2hpbGRdLG0mJnApe2Q9KHM9KHI9KGk9KG89KGE9YylbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PWsmJnJbMV0pJiZyWzJdLGE9cyYmYy5jaGlsZE5vZGVzW3NdO3doaWxlKGE9KytzJiZhJiZhW2xdfHwoZD1zPTApfHx1LnBvcCgpKWlmKDE9PT1hLm5vZGVUeXBlJiYrK2QmJmE9PT1lKXtpW2hdPVtrLHMsZF07YnJlYWt9fWVsc2UgaWYocCYmKGQ9cz0ocj0oaT0obz0oYT1lKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSksITE9PT1kKXdoaWxlKGE9KytzJiZhJiZhW2xdfHwoZD1zPTApfHx1LnBvcCgpKWlmKCh4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpJiYrK2QmJihwJiYoKGk9KG89YVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXT1bayxkXSksYT09PWUpKWJyZWFrO3JldHVybihkLT12KT09PWd8fGQlZz09MCYmMDw9ZC9nfX19LFBTRVVETzpmdW5jdGlvbihlLG8pe3ZhciB0LGE9Yi5wc2V1ZG9zW2VdfHxiLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8c2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gYVtTXT9hKG8pOjE8YS5sZW5ndGg/KHQ9W2UsZSwiIixvXSxiLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9sZShmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShlLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1QKGUscltpXSldPSEodFtuXT1yW2ldKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUsMCx0KX0pOmF9fSxwc2V1ZG9zOntub3Q6bGUoZnVuY3Rpb24oZSl7dmFyIHI9W10saT1bXSxzPWYoZS5yZXBsYWNlKCQsIiQxIikpO3JldHVybiBzW1NdP2xlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89cyhlLG51bGwscixbXSksYT1lLmxlbmd0aDt3aGlsZShhLS0pKGk9b1thXSkmJihlW2FdPSEodFthXT1pKSl9KTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHJbMF09ZSxzKHIsbnVsbCxuLGkpLHJbMF09bnVsbCwhaS5wb3AoKX19KSxoYXM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAwPHNlKHQsZSkubGVuZ3RofX0pLGNvbnRhaW5zOmxlKGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZSh0ZSxuZSksZnVuY3Rpb24oZSl7cmV0dXJuLTE8KGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCl9fSksbGFuZzpsZShmdW5jdGlvbihuKXtyZXR1cm4gVi50ZXN0KG58fCIiKXx8c2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrbiksbj1uLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIHQ7ZG97aWYodD1FP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4odD10LnRvTG93ZXJDYXNlKCkpPT09bnx8MD09PXQuaW5kZXhPZihuKyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgdD1uLmxvY2F0aW9uJiZuLmxvY2F0aW9uLmhhc2g7cmV0dXJuIHQmJnQuc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09YX0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1DLmFjdGl2ZUVsZW1lbnQmJighQy5oYXNGb2N1c3x8Qy5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpnZSghMSksZGlzYWJsZWQ6Z2UoITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09ZS5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFiLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gSi50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gUS50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2ZShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dmUoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOnZlKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46dmUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6dmUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6dDxuP3Q6bjswPD0tLXI7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19KS5wc2V1ZG9zLm50aD1iLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWIucHNldWRvc1tlXT1kZShlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWIucHNldWRvc1tlXT1oZShlKTtmdW5jdGlvbiBtZSgpe31mdW5jdGlvbiB4ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIGJlKHMsZSx0KXt2YXIgdT1lLmRpcixsPWUubmV4dCxjPWx8fHUsZj10JiYicGFyZW50Tm9kZSI9PT1jLHA9cisrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsdCxuKXt3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpcmV0dXJuIHMoZSx0LG4pO3JldHVybiExfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9W2sscF07aWYobil7d2hpbGUoZT1lW3VdKWlmKCgxPT09ZS5ub2RlVHlwZXx8ZikmJnMoZSx0LG4pKXJldHVybiEwfWVsc2Ugd2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKWlmKGk9KG89ZVtTXXx8KGVbU109e30pKVtlLnVuaXF1ZUlEXXx8KG9bZS51bmlxdWVJRF09e30pLGwmJmw9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3VdfHxlO2Vsc2V7aWYoKHI9aVtjXSkmJnJbMF09PT1rJiZyWzFdPT09cClyZXR1cm4gYVsyXT1yWzJdO2lmKChpW2NdPWEpWzJdPXMoZSx0LG4pKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3ZShpKXtyZXR1cm4gMTxpLmxlbmd0aD9mdW5jdGlvbihlLHQsbil7dmFyIHI9aS5sZW5ndGg7d2hpbGUoci0tKWlmKCFpW3JdKGUsdCxuKSlyZXR1cm4hMTtyZXR1cm4hMH06aVswXX1mdW5jdGlvbiBUZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIENlKGQsaCxnLHYseSxlKXtyZXR1cm4gdiYmIXZbU10mJih2PUNlKHYpKSx5JiYheVtTXSYmKHk9Q2UoeSxlKSksbGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9W10sdT1bXSxsPXQubGVuZ3RoLGM9ZXx8ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylzZShlLHRbcl0sbik7cmV0dXJuIG59KGh8fCIqIixuLm5vZGVUeXBlP1tuXTpuLFtdKSxmPSFkfHwhZSYmaD9jOlRlKGMscyxkLG4scikscD1nP3l8fChlP2Q6bHx8dik/W106dDpmO2lmKGcmJmcoZixwLG4sciksdil7aT1UZShwLHUpLHYoaSxbXSxuLHIpLG89aS5sZW5ndGg7d2hpbGUoby0tKShhPWlbb10pJiYocFt1W29dXT0hKGZbdVtvXV09YSkpfWlmKGUpe2lmKHl8fGQpe2lmKHkpe2k9W10sbz1wLmxlbmd0aDt3aGlsZShvLS0pKGE9cFtvXSkmJmkucHVzaChmW29dPWEpO3kobnVsbCxwPVtdLGkscil9bz1wLmxlbmd0aDt3aGlsZShvLS0pKGE9cFtvXSkmJi0xPChpPXk/UChlLGEpOnNbb10pJiYoZVtpXT0hKHRbaV09YSkpfX1lbHNlIHA9VGUocD09PXQ/cC5zcGxpY2UobCxwLmxlbmd0aCk6cCkseT95KG51bGwsdCxwLHIpOkguYXBwbHkodCxwKX0pfWZ1bmN0aW9uIEVlKGUpe2Zvcih2YXIgaSx0LG4scj1lLmxlbmd0aCxvPWIucmVsYXRpdmVbZVswXS50eXBlXSxhPW98fGIucmVsYXRpdmVbIiAiXSxzPW8/MTowLHU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1pfSxhLCEwKSxsPWJlKGZ1bmN0aW9uKGUpe3JldHVybi0xPFAoaSxlKX0sYSwhMCksYz1bZnVuY3Rpb24oZSx0LG4pe3ZhciByPSFvJiYobnx8dCE9PXcpfHwoKGk9dCkubm9kZVR5cGU/dShlLHQsbik6bChlLHQsbikpO3JldHVybiBpPW51bGwscn1dO3M8cjtzKyspaWYodD1iLnJlbGF0aXZlW2Vbc10udHlwZV0pYz1bYmUod2UoYyksdCldO2Vsc2V7aWYoKHQ9Yi5maWx0ZXJbZVtzXS50eXBlXS5hcHBseShudWxsLGVbc10ubWF0Y2hlcykpW1NdKXtmb3Iobj0rK3M7bjxyO24rKylpZihiLnJlbGF0aXZlW2Vbbl0udHlwZV0pYnJlYWs7cmV0dXJuIENlKDE8cyYmd2UoYyksMTxzJiZ4ZShlLnNsaWNlKDAscy0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbcy0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKCQsIiQxIiksdCxzPG4mJkVlKGUuc2xpY2UocyxuKSksbjxyJiZFZShlPWUuc2xpY2UobikpLG48ciYmeGUoZSkpfWMucHVzaCh0KX1yZXR1cm4gd2UoYyl9cmV0dXJuIG1lLnByb3RvdHlwZT1iLmZpbHRlcnM9Yi5wc2V1ZG9zLGIuc2V0RmlsdGVycz1uZXcgbWUsaD1zZS50b2tlbml6ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw9eFtlKyIgIl07aWYobClyZXR1cm4gdD8wOmwuc2xpY2UoMCk7YT1lLHM9W10sdT1iLnByZUZpbHRlcjt3aGlsZShhKXtmb3IobyBpbiBuJiYhKHI9Xy5leGVjKGEpKXx8KHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSxzLnB1c2goaT1bXSkpLG49ITEsKHI9ei5leGVjKGEpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSgkLCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKSxiLmZpbHRlcikhKHI9R1tvXS5leGVjKGEpKXx8dVtvXSYmIShyPXVbb10ocikpfHwobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6byxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9hLmxlbmd0aDphP3NlLmVycm9yKGUpOngoZSxzKS5zbGljZSgwKX0sZj1zZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4sdix5LG0seCxyLGk9W10sbz1bXSxhPUFbZSsiICJdO2lmKCFhKXt0fHwodD1oKGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSkoYT1FZSh0W25dKSlbU10/aS5wdXNoKGEpOm8ucHVzaChhKTsoYT1BKGUsKHY9byxtPTA8KHk9aSkubGVuZ3RoLHg9MDx2Lmxlbmd0aCxyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHU9MCxsPSIwIixjPWUmJltdLGY9W10scD13LGQ9ZXx8eCYmYi5maW5kLlRBRygiKiIsaSksaD1rKz1udWxsPT1wPzE6TWF0aC5yYW5kb20oKXx8LjEsZz1kLmxlbmd0aDtmb3IoaSYmKHc9dD09Q3x8dHx8aSk7bCE9PWcmJm51bGwhPShvPWRbbF0pO2wrKyl7aWYoeCYmbyl7YT0wLHR8fG8ub3duZXJEb2N1bWVudD09Q3x8KFQobyksbj0hRSk7d2hpbGUocz12W2ErK10paWYocyhvLHR8fEMsbikpe3IucHVzaChvKTticmVha31pJiYoaz1oKX1tJiYoKG89IXMmJm8pJiZ1LS0sZSYmYy5wdXNoKG8pKX1pZih1Kz1sLG0mJmwhPT11KXthPTA7d2hpbGUocz15W2ErK10pcyhjLGYsdCxuKTtpZihlKXtpZigwPHUpd2hpbGUobC0tKWNbbF18fGZbbF18fChmW2xdPXEuY2FsbChyKSk7Zj1UZShmKX1ILmFwcGx5KHIsZiksaSYmIWUmJjA8Zi5sZW5ndGgmJjE8dSt5Lmxlbmd0aCYmc2UudW5pcXVlU29ydChyKX1yZXR1cm4gaSYmKGs9aCx3PXApLGN9LG0/bGUocik6cikpKS5zZWxlY3Rvcj1lfXJldHVybiBhfSxnPXNlLnNlbGVjdD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsYz0hciYmaChlPWwuc2VsZWN0b3J8fGUpO2lmKG49bnx8W10sMT09PWMubGVuZ3RoKXtpZigyPChvPWNbMF09Y1swXS5zbGljZSgwKSkubGVuZ3RoJiYiSUQiPT09KGE9b1swXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJkUmJmIucmVsYXRpdmVbb1sxXS50eXBlXSl7aWYoISh0PShiLmZpbmQuSUQoYS5tYXRjaGVzWzBdLnJlcGxhY2UodGUsbmUpLHQpfHxbXSlbMF0pKXJldHVybiBuO2wmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKG8uc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9Ry5uZWVkc0NvbnRleHQudGVzdChlKT8wOm8ubGVuZ3RoO3doaWxlKGktLSl7aWYoYT1vW2ldLGIucmVsYXRpdmVbcz1hLnR5cGVdKWJyZWFrO2lmKCh1PWIuZmluZFtzXSkmJihyPXUoYS5tYXRjaGVzWzBdLnJlcGxhY2UodGUsbmUpLGVlLnRlc3Qob1swXS50eXBlKSYmeWUodC5wYXJlbnROb2RlKXx8dCkpKXtpZihvLnNwbGljZShpLDEpLCEoZT1yLmxlbmd0aCYmeGUobykpKXJldHVybiBILmFwcGx5KG4sciksbjticmVha319fXJldHVybihsfHxmKGUsYykpKHIsdCwhRSxuLCF0fHxlZS50ZXN0KGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSxufSxkLnNvcnRTdGFibGU9Uy5zcGxpdCgiIikuc29ydChqKS5qb2luKCIiKT09PVMsZC5kZXRlY3REdXBsaWNhdGVzPSEhbCxUKCksZC5zb3J0RGV0YWNoZWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihDLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksY2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8ZmUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLGQuYXR0cmlidXRlcyYmY2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8ZmUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksY2UoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGZlKFIsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksc2V9KEMpO1MuZmluZD1kLFMuZXhwcj1kLnNlbGVjdG9ycyxTLmV4cHJbIjoiXT1TLmV4cHIucHNldWRvcyxTLnVuaXF1ZVNvcnQ9Uy51bmlxdWU9ZC51bmlxdWVTb3J0LFMudGV4dD1kLmdldFRleHQsUy5pc1hNTERvYz1kLmlzWE1MLFMuY29udGFpbnM9ZC5jb250YWlucyxTLmVzY2FwZVNlbGVjdG9yPWQuZXNjYXBlO3ZhciBoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZTKGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sVD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0saz1TLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIEEoZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBOPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSxuLHIpe3JldHVybiBtKG4pP1MuZ3JlcChlLGZ1bmN0aW9uKGUsdCl7cmV0dXJuISFuLmNhbGwoZSx0LGUpIT09cn0pOm4ubm9kZVR5cGU/Uy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1uIT09cn0pOiJzdHJpbmciIT10eXBlb2Ygbj9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4tMTxpLmNhbGwobixlKSE9PXJ9KTpTLmZpbHRlcihuLGUscil9Uy5maWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Uy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTpTLmZpbmQubWF0Y2hlcyhlLFMuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sUy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMubGVuZ3RoLGk9dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIHRoaXMucHVzaFN0YWNrKFMoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKFMuY29udGFpbnMoaVt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0KyspUy5maW5kKGUsaVt0XSxuKTtyZXR1cm4gMTxyP1MudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWoodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJmsudGVzdChlKT9TKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIEQscT0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhTLmZuLmluaXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoIWUpcmV0dXJuIHRoaXM7aWYobj1ufHxELCJzdHJpbmciPT10eXBlb2YgZSl7aWYoIShyPSI8Ij09PWVbMF0mJiI+Ij09PWVbZS5sZW5ndGgtMV0mJjM8PWUubGVuZ3RoP1tudWxsLGUsbnVsbF06cS5leGVjKGUpKXx8IXJbMV0mJnQpcmV0dXJuIXR8fHQuanF1ZXJ5Pyh0fHxuKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihyWzFdKXtpZih0PXQgaW5zdGFuY2VvZiBTP3RbMF06dCxTLm1lcmdlKHRoaXMsUy5wYXJzZUhUTUwoclsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpFLCEwKSksTi50ZXN0KHJbMV0pJiZTLmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdCltKHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGk9RS5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPWksdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6bShlKT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkoZSk6ZShTKTpTLm1ha2VBcnJheShlLHRoaXMpfSkucHJvdG90eXBlPVMuZm4sRD1TKEUpO3ZhciBMPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEg9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gTyhlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9Uy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihlKXt2YXIgdD1TKGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPG47ZSsrKWlmKFMuY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPSJzdHJpbmciIT10eXBlb2YgZSYmUyhlKTtpZighay50ZXN0KGUpKWZvcig7cjxpO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhPy0xPGEuaW5kZXgobik6MT09PW4ubm9kZVR5cGUmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe28ucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soMTxvLmxlbmd0aD9TLnVuaXF1ZVNvcnQobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9pLmNhbGwoUyhlKSx0aGlzWzBdKTppLmNhbGwodGhpcyxlLmpxdWVyeT9lWzBdOmUpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMudW5pcXVlU29ydChTLm1lcmdlKHRoaXMuZ2V0KCksUyhlLHQpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KSxTLmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBPKGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIFQoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmNvbnRlbnREb2N1bWVudCYmcihlLmNvbnRlbnREb2N1bWVudCk/ZS5jb250ZW50RG9jdW1lbnQ6KEEoZSwidGVtcGxhdGUiKSYmKGU9ZS5jb250ZW50fHxlKSxTLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24ocixpKXtTLmZuW3JdPWZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5tYXAodGhpcyxpLGUpO3JldHVybiJVbnRpbCIhPT1yLnNsaWNlKC01KSYmKHQ9ZSksdCYmInN0cmluZyI9PXR5cGVvZiB0JiYobj1TLmZpbHRlcih0LG4pKSwxPHRoaXMubGVuZ3RoJiYoSFtyXXx8Uy51bmlxdWVTb3J0KG4pLEwudGVzdChyKSYmbi5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG4pfX0pO3ZhciBQPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gUihlKXtyZXR1cm4gZX1mdW5jdGlvbiBNKGUpe3Rocm93IGV9ZnVuY3Rpb24gSShlLHQsbixyKXt2YXIgaTt0cnl7ZSYmbShpPWUucHJvbWlzZSk/aS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKTplJiZtKGk9ZS50aGVuKT9pLmNhbGwoZSx0LG4pOnQuYXBwbHkodm9pZCAwLFtlXS5zbGljZShyKSl9Y2F0Y2goZSl7bi5hcHBseSh2b2lkIDAsW2VdKX19Uy5DYWxsYmFja3M9ZnVuY3Rpb24ocil7dmFyIGUsbjtyPSJzdHJpbmciPT10eXBlb2Ygcj8oZT1yLG49e30sUy5lYWNoKGUubWF0Y2goUCl8fFtdLGZ1bmN0aW9uKGUsdCl7blt0XT0hMH0pLG4pOlMuZXh0ZW5kKHt9LHIpO3ZhciBpLHQsbyxhLHM9W10sdT1bXSxsPS0xLGM9ZnVuY3Rpb24oKXtmb3IoYT1hfHxyLm9uY2Usbz1pPSEwO3UubGVuZ3RoO2w9LTEpe3Q9dS5zaGlmdCgpO3doaWxlKCsrbDxzLmxlbmd0aCkhMT09PXNbbF0uYXBwbHkodFswXSx0WzFdKSYmci5zdG9wT25GYWxzZSYmKGw9cy5sZW5ndGgsdD0hMSl9ci5tZW1vcnl8fCh0PSExKSxpPSExLGEmJihzPXQ/W106IiIpfSxmPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gcyYmKHQmJiFpJiYobD1zLmxlbmd0aC0xLHUucHVzaCh0KSksZnVuY3Rpb24gbihlKXtTLmVhY2goZSxmdW5jdGlvbihlLHQpe20odCk/ci51bmlxdWUmJmYuaGFzKHQpfHxzLnB1c2godCk6dCYmdC5sZW5ndGgmJiJzdHJpbmciIT09dyh0KSYmbih0KX0pfShhcmd1bWVudHMpLHQmJiFpJiZjKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBTLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoLTE8KG49Uy5pbkFycmF5KHQscyxuKSkpcy5zcGxpY2UobiwxKSxuPD1sJiZsLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/LTE8Uy5pbkFycmF5KGUscyk6MDxzLmxlbmd0aH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gcyYmKHM9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHM9dD0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFzfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSx0fHxpfHwocz10PSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWF9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGF8fCh0PVtlLCh0PXR8fFtdKS5zbGljZT90LnNsaWNlKCk6dF0sdS5wdXNoKHQpLGl8fGMoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBmLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhb319O3JldHVybiBmfSxTLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIG89W1sibm90aWZ5IiwicHJvZ3Jlc3MiLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLGk9InBlbmRpbmciLGE9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBzLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gYS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHM7cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24ocil7Uy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj1tKGlbdFs0XV0pJiZpW3RbNF1dO3NbdFsxXV0oZnVuY3Rpb24oKXt2YXIgZT1uJiZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZtKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3Moci5ub3RpZnkpLmRvbmUoci5yZXNvbHZlKS5mYWlsKHIucmVqZWN0KTpyW3RbMF0rIldpdGgiXSh0aGlzLG4/W2VdOmFyZ3VtZW50cyl9KX0pLGk9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LG4scil7dmFyIHU9MDtmdW5jdGlvbiBsKGksbyxhLHMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMsZT1mdW5jdGlvbigpe3ZhciBlLHQ7aWYoIShpPHUpKXtpZigoZT1hLmFwcGx5KG4scikpPT09by5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7dD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixtKHQpP3M/dC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpKToodSsrLHQuY2FsbChlLGwodSxvLFIscyksbCh1LG8sTSxzKSxsKHUsbyxSLG8ubm90aWZ5V2l0aCkpKTooYSE9PVImJihuPXZvaWQgMCxyPVtlXSksKHN8fG8ucmVzb2x2ZVdpdGgpKG4scikpfX0sdD1zP2U6ZnVuY3Rpb24oKXt0cnl7ZSgpfWNhdGNoKGUpe1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmUy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsdC5zdGFja1RyYWNlKSx1PD1pKzEmJihhIT09TSYmKG49dm9pZCAwLHI9W2VdKSxvLnJlamVjdFdpdGgobixyKSl9fTtpP3QoKTooUy5EZWZlcnJlZC5nZXRTdGFja0hvb2smJih0LnN0YWNrVHJhY2U9Uy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksQy5zZXRUaW1lb3V0KHQpKX19cmV0dXJuIFMuRGVmZXJyZWQoZnVuY3Rpb24oZSl7b1swXVszXS5hZGQobCgwLGUsbShyKT9yOlIsZS5ub3RpZnlXaXRoKSksb1sxXVszXS5hZGQobCgwLGUsbSh0KT90OlIpKSxvWzJdWzNdLmFkZChsKDAsZSxtKG4pP246TSkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP1MuZXh0ZW5kKGUsYSk6YX19LHM9e307cmV0dXJuIFMuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49dFsyXSxyPXRbNV07YVt0WzFdXT1uLmFkZCxyJiZuLmFkZChmdW5jdGlvbigpe2k9cn0sb1szLWVdWzJdLmRpc2FibGUsb1szLWVdWzNdLmRpc2FibGUsb1swXVsyXS5sb2NrLG9bMF1bM10ubG9jayksbi5hZGQodFszXS5maXJlKSxzW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIHNbdFswXSsiV2l0aCJdKHRoaXM9PT1zP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sc1t0WzBdKyJXaXRoIl09bi5maXJlV2l0aH0pLGEucHJvbWlzZShzKSxlJiZlLmNhbGwocyxzKSxzfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgsdD1uLHI9QXJyYXkodCksaT1zLmNhbGwoYXJndW1lbnRzKSxvPVMuRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyW3RdPXRoaXMsaVt0XT0xPGFyZ3VtZW50cy5sZW5ndGg/cy5jYWxsKGFyZ3VtZW50cyk6ZSwtLW58fG8ucmVzb2x2ZVdpdGgocixpKX19O2lmKG48PTEmJihJKGUsby5kb25lKGEodCkpLnJlc29sdmUsby5yZWplY3QsIW4pLCJwZW5kaW5nIj09PW8uc3RhdGUoKXx8bShpW3RdJiZpW3RdLnRoZW4pKSlyZXR1cm4gby50aGVuKCk7d2hpbGUodC0tKUkoaVt0XSxhKHQpLG8ucmVqZWN0KTtyZXR1cm4gby5wcm9taXNlKCl9fSk7dmFyIFc9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGUsdCl7Qy5jb25zb2xlJiZDLmNvbnNvbGUud2FybiYmZSYmVy50ZXN0KGUubmFtZSkmJkMuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK2UubWVzc2FnZSxlLnN0YWNrLHQpfSxTLnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKGUpe0Muc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX07dmFyIEY9Uy5EZWZlcnJlZCgpO2Z1bmN0aW9uIEIoKXtFLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsQiksUy5yZWFkeSgpfVMuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXtTLnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sUy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLVMucmVhZHlXYWl0OlMuaXNSZWFkeSl8fChTLmlzUmVhZHk9ITApIT09ZSYmMDwtLVMucmVhZHlXYWl0fHxGLnJlc29sdmVXaXRoKEUsW1NdKX19KSxTLnJlYWR5LnRoZW49Ri50aGVuLCJjb21wbGV0ZSI9PT1FLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PUUucmVhZHlTdGF0ZSYmIUUuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP0Muc2V0VGltZW91dChTLnJlYWR5KTooRS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEIpKTt2YXIgJD1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09dyhuKSlmb3IocyBpbiBpPSEwLG4pJChlLHQscyxuW3NdLCEwLG8sYSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYoaT0hMCxtKHIpfHwoYT0hMCksbCYmKGE/KHQuY2FsbChlLHIpLHQ9bnVsbCk6KGw9dCx0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbC5jYWxsKFMoZSksbil9KSksdCkpZm9yKDtzPHU7cysrKXQoZVtzXSxuLGE/cjpyLmNhbGwoZVtzXSxzLHQoZVtzXSxuKSkpO3JldHVybiBpP2U6bD90LmNhbGwoZSk6dT90KGVbMF0sbik6b30sXz0vXi1tcy0vLHo9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gVShlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gWChlKXtyZXR1cm4gZS5yZXBsYWNlKF8sIm1zLSIpLnJlcGxhY2UoeixVKX12YXIgVj1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlfHwhK2Uubm9kZVR5cGV9O2Z1bmN0aW9uIEcoKXt0aGlzLmV4cGFuZG89Uy5leHBhbmRvK0cudWlkKyt9Ry51aWQ9MSxHLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB0fHwodD17fSxWKGUpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dDpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0aGlzLmV4cGFuZG8se3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSkpKSx0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9dGhpcy5jYWNoZShlKTtpZigic3RyaW5nIj09dHlwZW9mIHQpaVtYKHQpXT1uO2Vsc2UgZm9yKHIgaW4gdClpW1gocildPXRbcl07cmV0dXJuIGl9LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuY2FjaGUoZSk6ZVt0aGlzLmV4cGFuZG9dJiZlW3RoaXMuZXhwYW5kb11bWCh0KV19LGFjY2VzczpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PXR8fHQmJiJzdHJpbmciPT10eXBlb2YgdCYmdm9pZCAwPT09bj90aGlzLmdldChlLHQpOih0aGlzLnNldChlLHQsbiksdm9pZCAwIT09bj9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWVbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT10KXtuPSh0PUFycmF5LmlzQXJyYXkodCk/dC5tYXAoWCk6KHQ9WCh0KSlpbiByP1t0XTp0Lm1hdGNoKFApfHxbXSkubGVuZ3RoO3doaWxlKG4tLSlkZWxldGUgclt0W25dXX0odm9pZCAwPT09dHx8Uy5pc0VtcHR5T2JqZWN0KHIpKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgZVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT10JiYhUy5pc0VtcHR5T2JqZWN0KHQpfX07dmFyIFk9bmV3IEcsUT1uZXcgRyxKPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sSz0vW0EtWl0vZztmdW5jdGlvbiBaKGUsdCxuKXt2YXIgcixpO2lmKHZvaWQgMD09PW4mJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoSywiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj0idHJ1ZSI9PT0oaT1uKXx8ImZhbHNlIiE9PWkmJigibnVsbCI9PT1pP251bGw6aT09PStpKyIiPytpOkoudGVzdChpKT9KU09OLnBhcnNlKGkpOmkpfWNhdGNoKGUpe31RLnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1TLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gUS5oYXNEYXRhKGUpfHxZLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBRLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtRLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFkuYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtZLnJlbW92ZShlLHQpfX0pLFMuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKG4sZSl7dmFyIHQscixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1uKXtpZih0aGlzLmxlbmd0aCYmKGk9US5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFZLmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe3Q9YS5sZW5ndGg7d2hpbGUodC0tKWFbdF0mJjA9PT0ocj1hW3RdLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPVgoci5zbGljZSg1KSksWihvLHIsaVtyXSkpO1kuc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXtRLnNldCh0aGlzLG4pfSk6JCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PVEuZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9WihvLG4pKT90OnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnNldCh0aGlzLG4sZSl9KX0sbnVsbCxlLDE8YXJndW1lbnRzLmxlbmd0aCxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5yZW1vdmUodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPVkuZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9WS5hY2Nlc3MoZSx0LFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPVMucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89Uy5fcXVldWVIb29rcyhlLHQpOyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxmdW5jdGlvbigpe1MuZGVxdWV1ZShlLHQpfSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBZLmdldChlLG4pfHxZLmFjY2VzcyhlLG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1kucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9ImZ4IixlLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZT9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09bj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVMucXVldWUodGhpcyx0LG4pO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09ZVswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPVMuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlPWV8fCJmeCI7d2hpbGUoYS0tKShuPVkuZ2V0KG9bYV0sZSsicXVldWVIb29rcyIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9fSk7dmFyIGVlPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLHRlPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitlZSsiKShbYS16JV0qKSQiLCJpIiksbmU9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxyZT1FLmRvY3VtZW50RWxlbWVudCxpZT1mdW5jdGlvbihlKXtyZXR1cm4gUy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9LG9lPXtjb21wb3NlZDohMH07cmUuZ2V0Um9vdE5vZGUmJihpZT1mdW5jdGlvbihlKXtyZXR1cm4gUy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fGUuZ2V0Um9vdE5vZGUob2UpPT09ZS5vd25lckRvY3VtZW50fSk7dmFyIGFlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIm5vbmUiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8IiI9PT1lLnN0eWxlLmRpc3BsYXkmJmllKGUpJiYibm9uZSI9PT1TLmNzcyhlLCJkaXNwbGF5Iil9O2Z1bmN0aW9uIHNlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz1lLm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJnRlLmV4ZWMoUy5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKVMuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixTLnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIHVlPXt9O2Z1bmN0aW9uIGxlKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGEscyx1LGw9W10sYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKykocj1lW2NdKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihsW2NdPVkuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxsW2NdfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9dWVbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PVMuY3NzKG8sImRpc3BsYXkiKSxvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksIm5vbmUiPT09dSYmKHU9ImJsb2NrIiksdWVbc109dSkpKSk6Im5vbmUiIT09biYmKGxbY109Im5vbmUiLFkuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGM9MDtjPGY7YysrKW51bGwhPWxbY10mJihlW2NdLnN0eWxlLmRpc3BsYXk9bFtjXSk7cmV0dXJuIGV9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gbGUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbGUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7YWUodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgY2UsZmUscGU9L14oPzpjaGVja2JveHxyYWRpbykkL2ksZGU9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksaGU9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pO2NlPUUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgiZGl2IikpLChmZT1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksZmUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGZlLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxjZS5hcHBlbmRDaGlsZChmZSkseS5jaGVja0Nsb25lPWNlLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxjZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISFjZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsY2UuaW5uZXJIVE1MPSI8b3B0aW9uPjwvb3B0aW9uPiIseS5vcHRpb249ISFjZS5sYXN0Q2hpbGQ7dmFyIGdlPXt0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gdmUoZSx0KXt2YXIgbjtyZXR1cm4gbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdLHZvaWQgMD09PXR8fHQmJkEoZSx0KT9TLm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHllKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKVkuc2V0KGVbbl0sImdsb2JhbEV2YWwiLCF0fHxZLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfWdlLnRib2R5PWdlLnRmb290PWdlLmNvbGdyb3VwPWdlLmNhcHRpb249Z2UudGhlYWQsZ2UudGg9Z2UudGQseS5vcHRpb258fChnZS5vcHRncm91cD1nZS5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7dmFyIG1lPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHhlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoIm9iamVjdCI9PT13KG8pKVMubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKG1lLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShkZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9Z2Vbc118fGdlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO1MubWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD0iIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmLTE8Uy5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1pZShvKSxhPXZlKGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGwmJnllKGEpLG4pe2M9MDt3aGlsZShvPWFbYysrXSloZS50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9dmFyIGJlPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB3ZSgpe3JldHVybiEwfWZ1bmN0aW9uIFRlKCl7cmV0dXJuITF9ZnVuY3Rpb24gQ2UoZSx0KXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBFLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKT09KCJmb2N1cyI9PT10KX1mdW5jdGlvbiBFZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KUVlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPVRlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiBTKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSxlLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9ZnVuY3Rpb24gU2UoZSxpLG8pe28/KFkuc2V0KGUsaSwhMSksUy5ldmVudC5hZGQoZSxpLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuLHI9WS5nZXQodGhpcyxpKTtpZigxJmUuaXNUcmlnZ2VyJiZ0aGlzW2ldKXtpZihyLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2ldfHx7fSkuZGVsZWdhdGVUeXBlJiZlLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYocj1zLmNhbGwoYXJndW1lbnRzKSxZLnNldCh0aGlzLGksciksdD1vKHRoaXMsaSksdGhpc1tpXSgpLHIhPT0obj1ZLmdldCh0aGlzLGkpKXx8dD9ZLnNldCh0aGlzLGksITEpOm49e30sciE9PW4pcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG4mJm4udmFsdWV9ZWxzZSByLmxlbmd0aCYmKFkuc2V0KHRoaXMsaSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKHJbMF0sUy5FdmVudC5wcm90b3R5cGUpLHIuc2xpY2UoMSksdGhpcyl9KSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09WS5nZXQoZSxpKSYmUy5ldmVudC5hZGQoZSxpLHdlKX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuZ2V0KHQpO2lmKFYodCkpe24uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixpPW8uc2VsZWN0b3IpLGkmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IocmUsaSksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPWJlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPVMuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksUy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuaGFzRGF0YShlKSYmWS5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYoZD1nPShzPWJlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlTLmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmWS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9Uy5ldmVudC5maXgoZSksbD0oWS5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW3UudHlwZV18fFtdLGM9Uy5ldmVudC5zcGVjaWFsW3UudHlwZV18fHt9O2ZvcihzWzBdPXUsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspc1t0XT1hcmd1bWVudHNbdF07aWYodS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHUpKXthPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxzKSkmJiExPT09KHUucmVzdWx0PXIpJiYodS5wcmV2ZW50RGVmYXVsdCgpLHUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyx1KSx1LnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPFMoaSx0aGlzKS5pbmRleChsKTpTLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW1MuZXhwYW5kb10/ZTpuZXcgUy5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmU2UodCwiY2xpY2siLHdlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmU2UodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZZLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxTLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/d2U6VGUsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmUy5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpUZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpUZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpUZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD13ZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD13ZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9d2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDohMH0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBTZSh0aGlzLGUsQ2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFNlKHRoaXMsZSksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlbGVnYXRlVHlwZTp0fX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtTLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8Uy5jb250YWlucyh0aGlzLG4pKXx8KGUudHlwZT1yLm9yaWdUeXBlLHQ9ci5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9aSksdH19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBFZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEVlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLFMoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPVRlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBrZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxBZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxOZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gamUoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmUyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBEZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIHFlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBMZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoWS5oYXNEYXRhKGUpJiYocz1ZLmdldChlKS5ldmVudHMpKWZvcihpIGluIFkucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTtRLmhhc0RhdGEoZSkmJihvPVEuYWNjZXNzKGUpLGE9Uy5leHRlbmQoe30sbyksUS5zZXQodCxhKSl9fWZ1bmN0aW9uIEhlKG4scixpLG8pe3I9ZyhyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmQWUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLEhlKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9eGUocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPVMubWFwKHZlKGUsInNjcmlwdCIpLERlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxxZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFZLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0sbCk6Yih1LnRleHRDb250ZW50LnJlcGxhY2UoTmUsIiIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIE9lKGUsdCxuKXtmb3IodmFyIHIsaT10P1MuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YSh2ZShyKSksci5wYXJlbnROb2RlJiYobiYmaWUocikmJnllKHZlKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz1lLmNsb25lTm9kZSghMCksZj1pZShlKTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fFMuaXNYTUxEb2MoZSkpKWZvcihhPXZlKGMpLHI9MCxpPShvPXZlKGUpKS5sZW5ndGg7cjxpO3IrKylzPW9bcl0sdT1hW3JdLHZvaWQgMCwiaW5wdXQiPT09KGw9dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSYmcGUudGVzdChzLnR5cGUpP3UuY2hlY2tlZD1zLmNoZWNrZWQ6ImlucHV0IiE9PWwmJiJ0ZXh0YXJlYSIhPT1sfHwodS5kZWZhdWx0VmFsdWU9cy5kZWZhdWx0VmFsdWUpO2lmKHQpaWYobilmb3Iobz1vfHx2ZShlKSxhPWF8fHZlKGMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspTGUob1tyXSxhW3JdKTtlbHNlIExlKGUsYyk7cmV0dXJuIDA8KGE9dmUoYywic2NyaXB0IikpLmxlbmd0aCYmeWUoYSwhZiYmdmUoZSwic2NyaXB0IikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Uy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoVihuKSl7aWYodD1uW1kuZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltZLmV4cGFuZG9dPXZvaWQgMH1uW1EuZXhwYW5kb10mJihuW1EuZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gT2UodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBPZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxqZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PWplKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFrZS50ZXN0KGUpJiYhZ2VbKGRlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVMuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YSh2ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiBIZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsbik8MCYmKFMuY2xlYW5EYXRhKHZlKHRoaXMpKSx0JiZ0LnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sbil9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSxhKXtTLmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9UyhlKSxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXQ9bz09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKHJbb10pW2FdKHQpLHUuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFBlPW5ldyBSZWdFeHAoIl4oIitlZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLFJlPWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PUMpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sTWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LEllPW5ldyBSZWdFeHAobmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gV2UoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxSZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fGllKGUpfHwoYT1TLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJlBlLnRlc3QoYSkmJkllLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIEZlKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHJlLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZShsKTtuPSIxJSIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KGwub2Zmc2V0V2lkdGgvMykscmUucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUUuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxyfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksb30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCksbn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxzfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlLHQsbixyO3JldHVybiBudWxsPT1hJiYoZT1FLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksdD1FLmNyZWF0ZUVsZW1lbnQoInRyIiksbj1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGUiLHQuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjFweCBzb2xpZCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjlweCIsbi5zdHlsZS5kaXNwbGF5PSJibG9jayIscmUuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1DLmdldENvbXB1dGVkU3R5bGUodCksYT1wYXJzZUludChyLmhlaWdodCwxMCkrcGFyc2VJbnQoci5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQoci5ib3JkZXJCb3R0b21XaWR0aCwxMCk9PT10Lm9mZnNldEhlaWdodCxyZS5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIEJlPVsiV2Via2l0IiwiTW96IiwibXMiXSwkZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLF9lPXt9O2Z1bmN0aW9uIHplKGUpe3ZhciB0PVMuY3NzUHJvcHNbZV18fF9lW2VdO3JldHVybiB0fHwoZSBpbiAkZT9lOl9lW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49QmUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1CZVtuXSt0KWluICRlKXJldHVybiBlfShlKXx8ZSl9dmFyIFVlPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxYZT0vXi0tLyxWZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sR2U9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIFllKGUsdCxuKXt2YXIgcj10ZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFFlKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKGUsbituZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKGUsInBhZGRpbmciK25lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSk6cys9Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByPVJlKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPVdlKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKFBlLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZBKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrUWUoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9ZnVuY3Rpb24gS2UoZSx0LG4scixpKXtyZXR1cm4gbmV3IEtlLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1XZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPVgodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD16ZShzKSksYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT10ZS5leGVjKG4pKSYmaVsxXSYmKG49c2UoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoUy5jc3NOdW1iZXJbc10/IiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1YKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD16ZShzKSksKGE9Uy5jc3NIb29rc1t0XXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9V2UoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gR2UmJihpPUdlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdSl7Uy5jc3NIb29rc1t1XT17Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0KXJldHVybiFVZS50ZXN0KFMuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/SmUoZSx1LG4pOk1lKGUsVmUsZnVuY3Rpb24oKXtyZXR1cm4gSmUoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1SZShlKSxvPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24sYT0ob3x8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsaSkscz1uP1FlKGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3VbMF0udG9VcHBlckNhc2UoKSt1LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdV0pLVFlKGUsdSwiYm9yZGVyIiwhMSxpKS0uNSkpLHMmJihyPXRlLmV4ZWModCkpJiYicHgiIT09KHJbM118fCJweCIpJiYoZS5zdHlsZVt1XT10LHQ9Uy5jc3MoZSx1KSksWWUoMCx0LHMpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9RmUoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KFdlKGUsIm1hcmdpbkxlZnQiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1NZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oaSxvKXtTLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krbmVbdF0rb109clt0XXx8clt0LTJdfHxyWzBdO3JldHVybiBufX0sIm1hcmdpbiIhPT1pJiYoUy5jc3NIb29rc1tpK29dLnNldD1ZZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1SZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2FdXT1TLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Uy5zdHlsZShlLHQsbik6Uy5jc3MoZSx0KX0sZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9fSksKChTLlR3ZWVuPUtlKS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOktlLGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoUy5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUtlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpLZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1LZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOktlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319KS5pbml0LnByb3RvdHlwZT1LZS5wcm90b3R5cGUsKEtlLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PVMuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtTLmZ4LnN0ZXBbZS5wcm9wXT9TLmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbemUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Uy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0pLnNjcm9sbFRvcD1LZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9S2UucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciBaZSxldCx0dCxudCxydD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8saXQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBvdCgpe2V0JiYoITE9PT1FLmhpZGRlbiYmQy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/Qy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUob3QpOkMuc2V0VGltZW91dChvdCxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gYXQoKXtyZXR1cm4gQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WmU9dm9pZCAwfSksWmU9RGF0ZS5ub3coKX1mdW5jdGlvbiBzdChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpWyJtYXJnaW4iKyhuPW5lW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gdXQoZSx0LG4pe2Zvcih2YXIgcixpPShsdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChsdC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBsdChvLGUsdCl7dmFyIG4sYSxyPTAsaT1sdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPVplfHxhdCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTpaZXx8YXQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPVMuVHdlZW4obyxsLm9wdHMsZSx0LGwub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChuKSxufSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1lP2wudHdlZW5zLmxlbmd0aDowO2lmKGEpcmV0dXJuIHRoaXM7Zm9yKGE9ITA7dDxuO3QrKylsLnR3ZWVuc1t0XS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbCxlXSkpOnMucmVqZWN0V2l0aChvLFtsLGVdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoIWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKGk9dFtyPVgobildLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3I8aTtyKyspaWYobj1sdC5wcmVmaWx0ZXJzW3JdLmNhbGwobCxvLGMsbC5vcHRzKSlyZXR1cm4gbShuLnN0b3ApJiYoUy5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPW4uc3RvcC5iaW5kKG4pKSxuO3JldHVybiBTLm1hcChjLHV0LGwpLG0obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06byxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9Uy5BbmltYXRpb249Uy5leHRlbmQobHQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBzZShuLmVsZW0sZSx0ZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe20oZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goUCk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLGx0LnR3ZWVuZXJzW25dPWx0LnR3ZWVuZXJzW25dfHxbXSxsdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSksdj1ZLmdldChlLCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKGUsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLHQpaWYoaT10W3JdLHJ0LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fFMuc3R5bGUoZSxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KHQpKXx8IVMuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPVkuZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9Uy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihsZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9Uy5jc3MoZSwiZGlzcGxheSIpLGxlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT1TLmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVkuYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih2LmhpZGRlbj0hZyksZyYmbGUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxsZShbZV0pLFkucmVtb3ZlKGUsImZ4c2hvdyIpLGQpUy5zdHlsZShlLHIsZFtyXSl9KSksdT11dChnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/bHQucHJlZmlsdGVycy51bnNoaWZ0KGUpOmx0LnByZWZpbHRlcnMucHVzaChlKX19KSxTLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/Uy5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHxtKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFtKHQpJiZ0fTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihhZSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9Uy5pc0VtcHR5T2JqZWN0KHQpLG89Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWx0KHRoaXMsUy5leHRlbmQoe30sdCksbyk7KGl8fFkuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8ITE9PT1vLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oaSxlLG8pe3ZhciBhPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQobyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPVMudGltZXJzLHI9WS5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmaXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8Uy5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1ZLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLFMucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPVMuZm5bcl07Uy5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHN0KHIsITApLGUsdCxuKX19KSxTLmVhY2goe3NsaWRlRG93bjpzdCgic2hvdyIpLHNsaWRlVXA6c3QoImhpZGUiKSxzbGlkZVRvZ2dsZTpzdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe1MuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49Uy50aW1lcnM7Zm9yKFplPURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksWmU9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe1MudGltZXJzLnB1c2goZSksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXtldHx8KGV0PSEwLG90KCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXtldD1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Uy5meCYmUy5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSx0dD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksbnQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSx0dC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09dHQudmFsdWUseS5vcHRTZWxlY3RlZD1udC5zZWxlY3RlZCwodHQ9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdHQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT10dC52YWx1ZTt2YXIgY3QsZnQ9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP1MucHJvcChlLHQsbik6KDE9PT1vJiZTLmlzWE1MRG9jKGUpfHwoaT1TLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9jdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFApO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGN0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9TLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1mdFt0XXx8Uy5maW5kLmF0dHI7ZnRbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWZ0W29dLGZ0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZnRbb109aSkscn19KTt2YXIgcHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxkdD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gaHQoZSl7cmV0dXJuKGUubWF0Y2goUCl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gZ3QoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gdnQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUCl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxTLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFtlXXx8ZV19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJlMuaXNYTUxEb2MoZSl8fCh0PVMucHJvcEZpeFt0XXx8dCxpPVMucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOnB0LnRlc3QoZS5ub2RlTmFtZSl8fGR0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLGd0KHRoaXMpKSl9KTtpZigoZT12dCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9Z3Qobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK2h0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPWh0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsZ3QodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9dnQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPWd0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIitodChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9aHQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLGd0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49Uyh0aGlzKSxyPXZ0KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPWd0KHRoaXMpKSYmWS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlkuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIitodChndChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB5dD0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsUyh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9Uy5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPVMudmFsSG9va3NbdC50eXBlXXx8Uy52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2UoeXQsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6aHQoUy50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1TKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89Uy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPFMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8Uy5pbkFycmF5KFMoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgbXQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHh0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhbXQudGVzdChkK1MuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTpTLm1ha2VBcnJheSh0LFtlXSksYz1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxtdC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFkuZ2V0KG8sImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZZLmdldChvLCJoYW5kbGUiKSkmJmwuYXBwbHkobyx0KSwobD11JiZvW3VdKSYmbC5hcHBseSYmVihvKSYmKGUucmVzdWx0PWwuYXBwbHkobyx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9ZCxyfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxjLl9kZWZhdWx0JiYhMSE9PWMuX2RlZmF1bHQuYXBwbHkocC5wb3AoKSx0KXx8IVYobil8fHUmJm0obltkXSkmJiF4KG4pJiYoKGE9blt1XSkmJihuW3VdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCx4dCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQseHQpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxhJiYoblt1XT1hKSksZS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe1MuZXZlbnQuc2ltdWxhdGUocixlLnRhcmdldCxTLmV2ZW50LmZpeChlKSl9O1MuZXZlbnQuc3BlY2lhbFtyXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpO3R8fGUuYWRkRXZlbnRMaXN0ZW5lcihuLGksITApLFkuYWNjZXNzKGUsciwodHx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9WS5hY2Nlc3MoZSxyKS0xO3Q/WS5hY2Nlc3MoZSxyLHQpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLCEwKSxZLnJlbW92ZShlLHIpKX19fSk7dmFyIGJ0PUMubG9jYXRpb24sd3Q9e2d1aWQ6RGF0ZS5ub3coKX0sVHQ9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IEMuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt9cmV0dXJuIG49dCYmdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXSx0JiYhbnx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrKG4/Uy5tYXAobi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkuam9pbigiXG4iKTplKSksdH07dmFyIEN0PS9cW1xdJC8sRXQ9L1xyP1xuL2csU3Q9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGt0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBBdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8Q3QudGVzdChuKT9pKG4sdCk6QXQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlBdChuKyJbIit0KyJdIixlW3RdLHIsaSl9Uy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdChlKSlTLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKUF0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/Uy5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJmt0LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFTdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoRXQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKEV0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIE50PS8lMjAvZyxqdD0vIy4qJC8sRHQ9LyhbPyZdKV89W14mXSovLHF0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sTHQ9L14oPzpHRVR8SEVBRCkkLyxIdD0vXlwvXC8vLE90PXt9LFB0PXt9LFJ0PSIqLyIuY29uY2F0KCIqIiksTXQ9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gSXQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUCl8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBXdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1QdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLFMuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uIEZ0KGUsdCl7dmFyIG4scixpPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLGUsciksZX1NdC5ocmVmPWJ0LmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmJ0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoYnQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UnQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0Z0KEZ0KGUsUy5hamF4U2V0dGluZ3MpLHQpOkZ0KFMuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkl0KE90KSxhamF4VHJhbnNwb3J0Okl0KFB0KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9Uy5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/Uyh5KTpTLmV2ZW50LHg9Uy5EZWZlcnJlZCgpLGI9Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9cXQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8YnQuaHJlZikrIiIpLnJlcGxhY2UoSHQsYnQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPU10LnByb3RvY29sKyIvLyIrTXQuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPVMucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxXdChPdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPVMuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFMdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKGp0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShOdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KFR0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKER0LCIkMSIpLG89KFR0LnRlc3QoZik/IiYiOiI/IikrIl89Iit3dC5ndWlkKysrbyksdi51cmw9ZitvKSx2LmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbZl0pLFMuZXRhZ1tmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbZl0pKSwodi5kYXRhJiZ2Lmhhc0NvbnRlbnQmJiExIT09di5jb250ZW50VHlwZXx8dC5jb250ZW50VHlwZSkmJlQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsdi5kYXRhVHlwZXNbMF0mJnYuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0/di5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXSsoIioiIT09di5kYXRhVHlwZXNbMF0/IiwgIitSdCsiOyBxPTAuMDEiOiIiKTp2LmFjY2VwdHNbIioiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT0iYWJvcnQiLGIuYWRkKHYuY29tcGxldGUpLFQuZG9uZSh2LnN1Y2Nlc3MpLFQuZmFpbCh2LmVycm9yKSxjPVd0KFB0LHYsdCxUKSl7aWYoVC5yZWFkeVN0YXRlPTEsZyYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW1Qsdl0pLGgpcmV0dXJuIFQ7di5hc3luYyYmMDx2LnRpbWVvdXQmJihkPUMuc2V0VGltZW91dChmdW5jdGlvbigpe1QuYWJvcnQoInRpbWVvdXQiKX0sdi50aW1lb3V0KSk7dHJ5e2g9ITEsYy5zZW5kKGEsbCl9Y2F0Y2goZSl7aWYoaCl0aHJvdyBlO2woLTEsZSl9fWVsc2UgbCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZDLmNsZWFyVGltZW91dChkKSxjPXZvaWQgMCxwPXJ8fCIiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoIioiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Uy5pbkFycmF5KCJzY3JpcHQiLHYuZGF0YVR5cGVzKSYmUy5pbkFycmF5KCJqc29uIix2LmRhdGFUeXBlcyk8MCYmKHYuY29udmVydGVyc1sidGV4dCBzY3JpcHQiXT1mdW5jdGlvbigpe30pLHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1KyIgIitvXXx8bFsiKiAiK29dKSlmb3IoaSBpbiBsKWlmKChzPWkuc3BsaXQoIiAiKSlbMV09PT1vJiYoYT1sW3UrIiAiK3NbMF1dfHxsWyIqICIrc1swXV0pKXshMD09PWE/YT1sW2ldOiEwIT09bFtpXSYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/ZToiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX0odixzLFQsaSksaT8odi5pZk1vZGlmaWVkJiYoKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW2ZdPXUpLCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsaSl7U1tpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbSh0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sUy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUuaGVhZGVycykiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKSYmKGUuY29udGVudFR5cGU9ZS5oZWFkZXJzW3RdfHwiIil9KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtTLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1TKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gbShuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSx0PWUuY29udGVudHMoKTt0Lmxlbmd0aD90LndyYXBBbGwobik6ZS5hcHBlbmQobil9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgbj1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBCdD17MDoyMDAsMTIyMzoyMDR9LCR0PVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hISR0JiYid2l0aENyZWRlbnRpYWxzImluICR0LHkuYWpheD0kdD0hISR0LFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbihpKXt2YXIgbyxhO2lmKHkuY29yc3x8JHQmJiFpLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnhocigpO2lmKHIub3BlbihpLnR5cGUsaS51cmwsaS5hc3luYyxpLnVzZXJuYW1lLGkucGFzc3dvcmQpLGkueGhyRmllbGRzKWZvcihuIGluIGkueGhyRmllbGRzKXJbbl09aS54aHJGaWVsZHNbbl07Zm9yKG4gaW4gaS5taW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoaS5taW1lVHlwZSksaS5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLGUpci5zZXRSZXF1ZXN0SGVhZGVyKG4sZVtuXSk7bz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtvJiYobz1hPXIub25sb2FkPXIub25lcnJvcj1yLm9uYWJvcnQ9ci5vbnRpbWVvdXQ9ci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9yLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiByLnN0YXR1cz90KDAsImVycm9yIik6dChyLnN0YXR1cyxyLnN0YXR1c1RleHQpOnQoQnRbci5zdGF0dXNdfHxyLnN0YXR1cyxyLnN0YXR1c1RleHQsInRleHQiIT09KHIucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHIucmVzcG9uc2VUZXh0P3tiaW5hcnk6ci5yZXNwb25zZX06e3RleHQ6ci5yZXNwb25zZVRleHR9LHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHIub25sb2FkPW8oKSxhPXIub25lcnJvcj1yLm9udGltZW91dD1vKCJlcnJvciIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJkMuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZ2xvYmFsRXZhbChlKSxlfX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKG4pe3ZhciByLGk7aWYobi5jcm9zc0RvbWFpbnx8bi5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3I9UygiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksRS5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIF90LHp0PVtdLFV0PS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPXp0LnBvcCgpfHxTLmV4cGFuZG8rIl8iK3d0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFV0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVXQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFV0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShUdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8Uy5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MoQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssenQucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKF90PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09X3QuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPU4uZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9eGUoW2VdLHQsbyksbyYmby5sZW5ndGgmJlMobykucmVtb3ZlKCksUy5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxTLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj1odChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmUy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9Uy5jc3MoZSwicG9zaXRpb24iKSxjPVMoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPVMuY3NzKGUsInRvcCIpLHU9Uy5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpjLmNzcyhmKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT1TKGUpLm9mZnNldCgpKS50b3ArPVMuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz1TLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC1TLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtUy5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09Uy5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxyZX0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGkpe3ZhciBvPSJwYWdlWU9mZnNldCI9PT1pO1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoeChlKT9yPWU6OT09PWUubm9kZVR5cGUmJihyPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW4pcmV0dXJuIHI/cltpXTplW3RdO3I/ci5zY3JvbGxUbyhvP3IucGFnZVhPZmZzZXQ6bixvP246ci5wYWdlWU9mZnNldCk6ZVt0XT1ufSx0LGUsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7Uy5jc3NIb29rc1tuXT1GZSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PVdlKGUsbiksUGUudGVzdCh0KT9TKGUpLnBvc2l0aW9uKClbbl0rInB4Ijp0fSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLHMpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpzLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24ocixvKXtTLmZuW29dPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10PyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4geChlKT8wPT09by5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIithXTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09ZS5ub2RlVHlwZT8ocj1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrYV0sclsic2Nyb2xsIithXSxlLmJvZHlbIm9mZnNldCIrYV0sclsib2Zmc2V0IithXSxyWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09bj9TLmNzcyhlLHQsaSk6Uy5zdHlsZShlLHQsbixpKX0scyxuP2U6dm9pZCAwLG4pfX0pfSksUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXtTLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksUy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSxTLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSxuKXtTLmZuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDA8YXJndW1lbnRzLmxlbmd0aD90aGlzLm9uKG4sbnVsbCxlLHQpOnRoaXMudHJpZ2dlcihuKX19KTt2YXIgWHQ9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO1MucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLG0oZSkpcmV0dXJuIHI9cy5jYWxsKGFyZ3VtZW50cywyKSwoaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHR8fHRoaXMsci5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX0pLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8Uy5ndWlkKyssaX0sUy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT9TLnJlYWR5V2FpdCsrOlMucmVhZHkoITApfSxTLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTLnBhcnNlSlNPTj1KU09OLnBhcnNlLFMubm9kZU5hbWU9QSxTLmlzRnVuY3Rpb249bSxTLmlzV2luZG93PXgsUy5jYW1lbENhc2U9WCxTLnR5cGU9dyxTLm5vdz1EYXRlLm5vdyxTLmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD1TLnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LFMudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShYdCwiIil9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBTfSk7dmFyIFZ0PUMualF1ZXJ5LEd0PUMuJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKGUpe3JldHVybiBDLiQ9PT1TJiYoQy4kPUd0KSxlJiZDLmpRdWVyeT09PVMmJihDLmpRdWVyeT1WdCksU30sInVuZGVmaW5lZCI9PXR5cGVvZiBlJiYoQy5qUXVlcnk9Qy4kPVMpLFN9KTsNCn0NCg0KY29uc3QgdW50aWwgPSAocHJlZGljYXRlRm4pID0+IHsNCgljb25zdCBwb2xsID0gKGRvbmUpID0+IChwcmVkaWNhdGVGbigpID8gZG9uZSgpIDogc2V0VGltZW91dCgoKSA9PiBwb2xsKGRvbmUpLCA1MDApKTsNCglyZXR1cm4gbmV3IFByb21pc2UocG9sbCk7DQp9Ow0KDQphc3luYyBmdW5jdGlvbiBwYXVzZSh2KSB7DQoJd2hpbGUodiA8IDEwMCkNCgkJYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTsNCn0NCg0KZnVuY3Rpb24gbG9vcChsaWdodGJveEltYWdlcywgaW5kZXgpIHsNCglpZihpbmRleCA9PT0gbGlnaHRib3hJbWFnZXMubGVuZ3RoKSByZXR1cm47DQoNCglsaWdodGJveEltYWdlc1tpbmRleF0ub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCWNvbnNvbGUubG9nKCJpbWFnZSAiICsgaW5kZXggKyAiIGxvYWRlZC4iKTsNCgkJbG9vcChsaWdodGJveEltYWdlcywgKytpbmRleCk7DQoJfTsNCn0NCg0KOyhmdW5jdGlvbihmYWN0b3J5KSB7DQoJZmFjdG9yeSgkKTsNCn0pKGZ1bmN0aW9uKGpRdWVyeSkgew0KCShhc3luYyBmdW5jdGlvbihwcmVjYWxsYmFjaykgew0KCQljb25zdCB0aXRsZSA9IGRvY3VtZW50LnRpdGxlOw0KCQlpZih0aXRsZSAhPT0gdW5kZWZpbmVkKQ0KCQkJZG9jdW1lbnQudGl0bGUgPSAiTG9hZGluZy4uLiI7DQoNCgkJaWYod2luZG93LmpRdWVyeSkNCgkJCSQuaG9sZFJlYWR5KHRydWUpOw0KDQoJCSgoKSA9PiB7DQoJCQljb25zdCBjc3MgPSBgLyoNCiAqIENvcHlyaWdodCAoYykgMjAyMiBTR05ldHdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFRoZSBzb2Z0d2FyZSBpcyBhbiBleGNsdXNpdmUgY29weXJpZ2h0IG9mICJTR05ldHdvcmtzIiBhbmQgaXMgcHJvdmlkZWQgYXMgaXMgZXhjbHVzaXZlbHkgd2l0aCBvbmx5ICJVU0FHRSIgYWNjZXNzLiAiTW9kaWZpY2F0aW9uIiwgICJBbHRlcmF0aW9uIiwgIlJlLWRpc3RyaWJ1dGlvbiIgaXMgY29tcGxldGVseSBwcm9oaWJpdGVkLg0KICogVklPTEFUSU5HIFRIRSBBQk9WRSBURVJNUyBJUyBBIFBVTklTSEFCTEUgT0ZGRU5TRSBXSElDSCBNQVkgTEVBRCBUTyBMRUdBTCBDT05TRVFVRU5DRVMuDQogKi8NCg0KLmhhcy1wcmVsb2FkZXIsDQouaGFzLXByZWxvYWRlciAqIHsNClx0LS1zZ24tYmFja2dyb3VuZDogI2ZmZjsNClx0LS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGg6IDZweDsNClx0LS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGg6IDQ0cHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodDogMjJweDsNClx0LS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luOiAxcHg7DQpcdC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1czogNnB4Ow0KfQ0KDQpAbWVkaWEgYWxsIGFuZCAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsNClx0Lmhhcy1wcmVsb2FkZXIsDQpcdC5oYXMtcHJlbG9hZGVyICogew0KXHQtLXNnbi1iYWNrZ3JvdW5kOiAjMDAwOw0KXHR9DQp9DQoNCmJvZHkgew0KXHRtYXJnaW46IDA7DQp9DQoNCi5zZ24tcHJlbG9hZGVyIHsNClx0cGFkZGluZzogMDsNClx0d2lkdGg6IDEwMCU7DQpcdGhlaWdodDogMTAwJTsNClx0YmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2duLWJhY2tncm91bmQpOw0KXHRkaXNwbGF5OiBmbGV4Ow0KXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNClx0YWxpZ24taXRlbXM6IGNlbnRlcjsNClx0cG9zaXRpb246IGFic29sdXRlOw0KXHR6LWluZGV4OiA5OTk5OTk7DQp9DQoNCg0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyIHsNClx0cG9zaXRpb246IHJlbGF0aXZlOw0KXHRkaXNwbGF5OiBpbmxpbmUtZmxleDsNClx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQpcdGFsaWduLWl0ZW1zOiBjZW50ZXI7DQp9DQoNCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyIHsNClx0YW5pbWF0aW9uOiByb3RhdGUgMTBzIGluZmluaXRlIGxpbmVhcjsNClx0cG9zaXRpb246IHJlbGF0aXZlOw0KXHRkaXNwbGF5OiBpbmxpbmUtZmxleDsNClx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQpcdGFsaWduLWl0ZW1zOiBjZW50ZXI7DQpcdHdpZHRoOiAxMDAlOw0KXHRoZWlnaHQ6IDEwMCU7DQp9DQoNCg0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gaW1nIHsNClx0d2lkdGg6IDEwMCU7DQpcdGhlaWdodDogMTAwJTsNClx0bWFyZ2luOiB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKTsNClx0ZGlzcGxheTogZmxleDsNClx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQpcdGFsaWduLWl0ZW1zOiBjZW50ZXI7DQpcdHBvc2l0aW9uOiByZWxhdGl2ZTsNClx0dG9wOiA1MCU7DQpcdGxlZnQ6IDUwJTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaW1nIHsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpKTsNClx0bWFyZ2luOiB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaSB7DQpcdGFuaW1hdGlvbjogcm90YXRlIDNzIGluZmluaXRlIGN1YmljLWJlemllcigwLjA5LCAwLjYsIDAuOCwgMC4wMyk7DQpcdHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxMDAlIDA7DQpcdHBvc2l0aW9uOiBhYnNvbHV0ZTsNClx0ZGlzcGxheTogaW5saW5lLWZsZXg7DQpcdGp1c3RpZnktY29udGVudDogY2VudGVyOw0KXHRhbGlnbi1pdGVtczogY2VudGVyOw0KXHR0b3A6IDUwJTsNClx0bGVmdDogNTAlOw0KXHRib3JkZXI6IHNvbGlkIHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgdHJhbnNwYXJlbnQ7DQpcdGJvcmRlci1ib3R0b206IG5vbmU7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDEpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC4zLCAwLjEyLCAwLjAzKTsNClx0LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC4zLCAwLjEyLCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuMywgMC4xMiwgMC4wMyk7DQpcdHdpZHRoOiB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpOw0KXHRoZWlnaHQ6IHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkpOw0KXHRib3JkZXItY29sb3I6ICMyMTcyYjg7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDEpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMSkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDIpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC42LCAwLjI0LCAwLjAzKTsNClx0LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC42LCAwLjI0LCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuNiwgMC4yNCwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpKTsNClx0bWFyZ2luLXRvcDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSkpOw0KXHRtYXJnaW4tbGVmdDogY2FsYygwcHggLSAodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSkpOw0KXHRib3JkZXItY29sb3I6ICMxOGEzOWI7DQpcdGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KXHRib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMikgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQp9DQouc2duLXByZWxvYWRlciA+IC5wcmVsb2FkZXIgPiAuc3Bpbm5lciA+IGk6bnRoLWNoaWxkKDMpIHsNClx0LW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC45LCAwLjM2LCAwLjAzKTsNClx0LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMC45LCAwLjM2LCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDAuOSwgMC4zNiwgMC4wMyk7DQpcdHdpZHRoOiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpOw0KXHRoZWlnaHQ6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLWhlaWdodCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSk7DQpcdG1hcmdpbi10b3A6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikpKTsNClx0Ym9yZGVyLWNvbG9yOiAjODJjNTQ1Ow0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDIpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCg0KSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuMiwgMC40OCwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuMiwgMC40OCwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjIsIDAuNDgsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAzKTsNClx0aGVpZ2h0OiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAxLjUpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDMpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDMpKSk7DQpcdGJvcmRlci1jb2xvcjogI2Y4YjczOTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAzKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNSkgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjUsIDAuNiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuNSwgMC42LCAwLjAzKTsNClx0YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuNSwgMC42LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNCk7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMik7DQpcdG1hcmdpbi10b3A6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogNCkpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogNCkpKTsNClx0Ym9yZGVyLWNvbG9yOiAjZjA2MDQ1Ow0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA0KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDQpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCg2KSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuOCwgMC43MiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDEuOCwgMC43MiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAxLjgsIDAuNzIsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA1KTsNClx0aGVpZ2h0OiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAyLjUpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDUpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDUpKSk7DQpcdGJvcmRlci1jb2xvcjogI2VkMjg2MTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNSkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA1KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCi5zZ24tcHJlbG9hZGVyID4gLnByZWxvYWRlciA+IC5zcGlubmVyID4gaTpudGgtY2hpbGQoNykgew0KXHQtbW96LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjEsIDAuODQsIDAuMDMpOw0KXHQtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjEsIDAuODQsIDAuMDMpOw0KXHRhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wOSwgMi4xLCAwLjg0LCAwLjAzKTsNClx0d2lkdGg6IGNhbGModmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNik7DQpcdGhlaWdodDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogMyk7DQpcdG1hcmdpbi10b3A6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogNikpKTsNClx0bWFyZ2luLWxlZnQ6IGNhbGMoMHB4IC0gKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogNikpKTsNClx0Ym9yZGVyLWNvbG9yOiAjYzEyNjgwOw0KXHRib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA2KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNClx0Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGNhbGMoKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy13aWR0aCkgKyAoKHZhcigtLXNnbi1wcmVsb2FkZXItc3RyaXBlcy13aWR0aCkgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtbWFyZ2luKSkgKiAyKSAqIDYpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXJhZGl1cykpOw0KfQ0KLnNnbi1wcmVsb2FkZXIgPiAucHJlbG9hZGVyID4gLnNwaW5uZXIgPiBpOm50aC1jaGlsZCg4KSB7DQpcdC1tb3otYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDIuNCwgMC45NiwgMC4wMyk7DQpcdC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMDksIDIuNCwgMC45NiwgMC4wMyk7DQpcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjA5LCAyLjQsIDAuOTYsIDAuMDMpOw0KXHR3aWR0aDogY2FsYyh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA3KTsNClx0aGVpZ2h0OiBjYWxjKHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1oZWlnaHQpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiAzLjUpOw0KXHRtYXJnaW4tdG9wOiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDcpKSk7DQpcdG1hcmdpbi1sZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtaGVpZ2h0KSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDcpKSk7DQpcdGJvcmRlci1jb2xvcjogIzVkMzE5MTsNClx0Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygodmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLXdpZHRoKSArICgodmFyKC0tc2duLXByZWxvYWRlci1zdHJpcGVzLXdpZHRoKSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1tYXJnaW4pKSAqIDIpICogNykgKyB2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtcmFkaXVzKSk7DQpcdGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBjYWxjKCh2YXIoLS1zZ24tcHJlbG9hZGVyLWNpcmNsZXMtd2lkdGgpICsgKCh2YXIoLS1zZ24tcHJlbG9hZGVyLXN0cmlwZXMtd2lkdGgpICsgdmFyKC0tc2duLXByZWxvYWRlci1jaXJjbGVzLW1hcmdpbikpICogMikgKiA3KSArIHZhcigtLXNnbi1wcmVsb2FkZXItY2lyY2xlcy1yYWRpdXMpKTsNCn0NCg0KQC1tb3ota2V5ZnJhbWVzIHJvdGF0ZSB7DQpcdHRvIHsNClx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOw0KXHR9DQp9DQpALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlIHsNClx0dG8gew0KXHRcdHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7DQpcdH0NCn0NCkBrZXlmcmFtZXMgcm90YXRlIHsNClx0dG8gew0KXHRcdHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7DQpcdH0NCn0NCg0KDQpgOw0KCQkJY29uc3QgaGVhZCAgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sDQoJCQkgICAgICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7DQoNCgkJCWhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOw0KCQkJc3R5bGUudHlwZSA9ICJ0ZXh0L2NzcyI7DQoJCQlzdHlsZS5pZCA9ICJzZ24tdWlraXQtc3R5bGVzIjsNCgkJCWlmKHN0eWxlLnN0eWxlU2hlZXQpIHsNCgkJCQkvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBJRTggYW5kIGJlbG93Lg0KCQkJCXN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzczsNCgkJCX0gZWxzZSB7DQoJCQkJc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7DQoJCQl9DQoJCX0pKCk7DQoJCShmdW5jdGlvbigpIHsNCgkJCWxldCBwcmVsb2FkZXJFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQlwcmVsb2FkZXJFbGVtLmNsYXNzTmFtZSA9ICJzZ24tcHJlbG9hZGVyIjsNCgkJCWxldCBwcmVsb2FkZXIgPSBgXHRcdFx0PGRpdiBjbGFzcz0icHJlbG9hZGVyIj5cbmA7DQoJCQkvL3ByZWxvYWRlciArPSBgXHRcdFx0XHQ8aW1nIHNyYz0iPD89JHB1YmxpY19pbWdBc3NldHM7Pz5pY29ucy94c21hbGwucG5nIj5cbmA7DQoJCQlwcmVsb2FkZXIgKz0gYFx0XHRcdFx0PGRpdiBjbGFzcz0ic3Bpbm5lciI+XG5gOw0KCQkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJCXByZWxvYWRlciArPSBgXHRcdFx0XHRcdDxpPjwvaT5cbmA7DQoJCQlwcmVsb2FkZXIgKz0gYFx0XHRcdFx0XHQ8aT48L2k+XG5gOw0KCQkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJCXByZWxvYWRlciArPSBgXHRcdFx0XHRcdDxpPjwvaT5cbmA7DQoJCQlwcmVsb2FkZXIgKz0gYFx0XHRcdFx0XHQ8aT48L2k+XG5gOw0KCQkJcHJlbG9hZGVyICs9IGBcdFx0XHRcdFx0PGk+PC9pPlxuYDsNCgkJCXByZWxvYWRlciArPSBgXHRcdFx0XHRcdDxpPjwvaT5cbmA7DQoJCQlwcmVsb2FkZXIgKz0gYFx0XHRcdFx0PC9kaXY+XG5gOw0KCQkJcHJlbG9hZGVyICs9IGBcdFx0XHQ8L2Rpdj5cbmA7DQoJCQlwcmVsb2FkZXIgKz0gYFx0XHQ8L2Rpdj5cbmA7DQoNCgkJCXByZWxvYWRlckVsZW0uaW5uZXJIVE1MID0gcHJlbG9hZGVyOw0KDQoJCQl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCQkJZG9jdW1lbnQuYm9keS5jbGFzc05hbWUgKz0gIiBoYXMtcHJlbG9hZGVyIjsNCgkJCQlkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShwcmVsb2FkZXJFbGVtLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpOw0KCQkJfTsNCgkJfSkoKTsNCg0KCQljb25zdCBjdXJyZW50U2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbc3JjKj1cIlNHTlVJS2l0LmxvYWRlci5qc1wiXSIpOw0KCQljb25zdCB1cmwgPSBjdXJyZW50U2NyaXB0LnNyYy5zcGxpdCgiLyIpLnNsaWNlKDAsIC0yKS5qb2luKCIvIikgKyAiLyI7DQoJCWNvbnN0IHByZWxvYWQgPSBbDQoJCQkvLydqcy9pMThuL1NHTmkxOG4uanMnDQoJCV07DQoNCgkJbGV0IGZpbGVzbG9hZGVkID0gMDsNCgkJY29uc3QgZmlsZXN0b2xvYWQgPSBwcmVsb2FkLmxlbmd0aDsNCg0KCQlpZihmaWxlc3RvbG9hZCA+IDApIHsNCgkJCWZvcihsZXQgaSA9IDA7IGkgPCBmaWxlc3RvbG9hZDsgaSsrKSB7DQoJCQkJY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7DQoJCQkJc2NyaXB0LnNyYyA9IHVybCArIHByZWxvYWRbaV07DQoJCQkJc2NyaXB0LmFzeW5jID0gZmFsc2U7DQoJCQkJc2NyaXB0LmRlZmVyID0gZmFsc2U7DQoJCQkJY3VycmVudFNjcmlwdC5hZnRlcihzY3JpcHQpOw0KCQkJCWlmKGkgPT09IDApDQoJCQkJCXNjcmlwdC5pZCA9ICJzZ24tcHJlbG9hZC1lbmQiOw0KCQkJCXNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJZmlsZXNsb2FkZWQrKzsNCgkJCQkJc2NyaXB0Lm9ubG9hZCA9IG51bGw7DQoJCQkJCWZpbmlzaExvYWQoKTsNCgkJCQl9Ow0KCQkJfQ0KCQl9IGVsc2UNCgkJCWZpbmlzaExvYWQoKTsNCg0KCQlhc3luYyBmdW5jdGlvbiBmaW5pc2hMb2FkKCkgew0KCQkJbGV0IHByb2dyZXNzID0gTWF0aC5yb3VuZCgoZmlsZXNsb2FkZWQgKiAxMDApIC8gZmlsZXN0b2xvYWQpIHx8IDEwMDsNCg0KCQkJYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7DQoJCQkJaWYoZmlsZXNsb2FkZWQgPj0gZmlsZXN0b2xvYWQpIHsNCgkJCQkJcmVzb2x2ZSgpOw0KCQkJCX0NCgkJCX0pLnRoZW4oZnVuY3Rpb24oKSB7DQoJCQkJLy9pbXBvcnQoJy4vaGVscGVycy9oZWxwZXJzLmpzJyk7DQoJCQkJJCgiaGVhZCA+IHRpdGxlIikudGV4dCh0aXRsZSk7DQoJCQkJaWYodHlwZW9mIHByZWNhbGxiYWNrID09PSAiZnVuY3Rpb24iICYmIHByb2dyZXNzID09PSAxMDApDQoJCQkJCXByZWNhbGxiYWNrKCk7DQoJCQl9KTsNCgkJfQ0KCX0pKGZ1bmN0aW9uKCkgew0KCQkoYXN5bmMgZnVuY3Rpb24oY2FsbGJhY2spIHsNCgkJCWNvbnN0IHNnbnVpa2l0U2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbc3JjKj1cIlNHTlVJS2l0LmxvYWRlci5qc1wiXSIpOw0KCQkJY29uc3QgY3VycmVudFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZ24tcHJlbG9hZC1lbmQiKSB8fCBzZ251aWtpdFNjcmlwdDsNCg0KCQkJZnVuY3Rpb24gZ2V0U2NyaXB0VVJMKCkgew0KCQkJCXJldHVybiBzZ251aWtpdFNjcmlwdC5zcmM7DQoJCQl9DQoNCgkJCWNvbnN0IHVybCA9IGdldFNjcmlwdFVSTCgpLnNwbGl0KCIvIikuc2xpY2UoMCwgLTIpLmpvaW4oIi8iKSArICIvIjsNCg0KCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQlzdGFydExvYWQoKTsNCgkJCX0sIDUwMDApOw0KDQoJCQlmdW5jdGlvbiBzdGFydExvYWQoKSB7DQoJCQkJY29uc3Qgc2NyaXB0cyA9IFsNCgkJCQkJImpzL1NHTlVJS2l0LmJ1bmRsZS5qcyIsDQoJCQkJXTsNCgkJCQljb25zdCBzdHlsZXMgPSBbDQoJCQkJCSJjc3MvU0dOVUlLaXQuYnVuZGxlLmNzcyIsDQoJCQkJXTsNCgkJCQlsZXQgZmlsZXNsb2FkZWQgPSAwLA0KCQkJCSAgICBsYXN0U2NyaXB0ICA9IGN1cnJlbnRTY3JpcHQ7DQoJCQkJY29uc3QgZmlsZXN0b2xvYWQgPSBzY3JpcHRzLmxlbmd0aCArIHN0eWxlcy5sZW5ndGg7DQoNCgkJCQlmdW5jdGlvbiBsb2FkU2NyaXB0KGkpIHsNCgkJCQkJaWYoaSA9PT0gc2NyaXB0cy5sZW5ndGgpIHJldHVybjsNCg0KCQkJCQljb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsNCgkJCQkJc2NyaXB0LnNyYyA9IHVybCArIHNjcmlwdHNbaV07DQoJCQkJCXNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkJCWZpbGVzbG9hZGVkKys7DQoJCQkJCQlTR05VSUtpdC5jb21wb25lbnQgPSB7DQoJCQkJCQkJaTogc2NyaXB0c1tpXSwNCgkJCQkJCX07DQoJCQkJCQlzY3JpcHQub25sb2FkID0gbnVsbDsNCgkJCQkJCS8vY29uc29sZS5sb2coYExPQURFRCBTQ1JJUFQ6ICR7c2NyaXB0LnNyY31gLCBgJHtpfS8ke2ZpbGVzdG9sb2FkfWApOw0KCQkJCQkJZmluaXNoTG9hZCgpOw0KCQkJCQkJbG9hZFNjcmlwdCgrK2kpOw0KCQkJCQl9Ow0KCQkJCQlsYXN0U2NyaXB0LmFmdGVyKHNjcmlwdCk7DQoJCQkJCWxhc3RTY3JpcHQgPSBsYXN0U2NyaXB0Lm5leHRFbGVtZW50U2libGluZyB8fCBjdXJyZW50U2NyaXB0Ow0KCQkJCX0NCg0KCQkJCWZ1bmN0aW9uIGxvYWRTdHlsZShpKSB7DQoJCQkJCWlmKGkgPT09IHNjcmlwdHMubGVuZ3RoKSByZXR1cm47DQoNCgkJCQkJY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7DQoJCQkJCXN0eWxlLnJlbCA9ICJzdHlsZXNoZWV0IjsNCgkJCQkJc3R5bGUuaHJlZiA9IHVybCArIHN0eWxlc1tpXTsNCgkJCQkJc3R5bGUub25sb2FkID0gZnVuY3Rpb24oKSB7DQoJCQkJCQlmaWxlc2xvYWRlZCsrOw0KCQkJCQkJc3R5bGUub25sb2FkID0gbnVsbDsNCgkJCQkJCWZpbmlzaExvYWQoKTsNCgkJCQkJCWxvb3AoKytpKTsNCgkJCQkJfTsNCgkJCQkJY3VycmVudFNjcmlwdC5hZnRlcihzdHlsZSk7DQoJCQkJfQ0KDQoJCQkJbG9hZFNjcmlwdCgwKTsNCgkJCQlsb2FkU3R5bGUoMCk7DQoNCgkJCQlhc3luYyBmdW5jdGlvbiBmaW5pc2hMb2FkKCkgew0KCQkJCQljb25zdCBwcm9ncmVzcyA9IE1hdGgucm91bmQoKGZpbGVzbG9hZGVkICogMTAwKSAvIGZpbGVzdG9sb2FkKTsNCg0KCQkJCQlpZih0eXBlb2YgY2FsbGJhY2sgPT09ICJmdW5jdGlvbiIpIHsNCgkJCQkJCWNhbGxiYWNrKGZpbGVzbG9hZGVkLCBmaWxlc3RvbG9hZCwgcHJvZ3Jlc3MpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9KShhc3luYyBmdW5jdGlvbihsb2FkZWQsIHRvdGFsLCBwcm9ncmVzcykgew0KCQkJaWYocHJvZ3Jlc3MgPT09IDEwMCkgew0KCQkJCS8vaW1wb3J0KCcuL2kxOG4vU0dOaTE4bi5qcycpOw0KCQkJCS8vaW1wb3J0KCcuL2NvbXBvbmVudHMvY29tcG9uZW50cy5qcycpOw0KCQkJCVNHTlVJS2l0LnJlYWR5ID0gdHJ1ZTsNCgkJCQl3aW5kb3cuU0dOVUlLaXRSZWFkeSA9IHRydWU7DQoNCgkJCQljb25zdCBsZWZ0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic3R5bGVbZGF0YS1ja2U9XCJ0cnVlXCJdIik7DQoJCQkJaWYobGVmdCAhPT0gbnVsbCkNCgkJCQkJbGVmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxlZnQpOw0KDQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCQkJJC5ob2xkUmVhZHkoZmFsc2UpOw0KCQkJCQlqUXVlcnkucmVhZHkoKTsNCg0KCQkJCQkkKCJib2R5IikuY2hpbGRyZW4oIi5zZ24tcHJlbG9hZGVyIikuZmFkZU91dCgyMDAwLCBmdW5jdGlvbigpIHsNCgkJCQkJCSQoImJvZHkiKS5jaGlsZHJlbigiLnNnbi1wcmVsb2FkZXIiKS5yZW1vdmUoKTsNCgkJCQkJCSQoImJvZHkiKS5yZW1vdmVDbGFzcygiaGFzLXByZWxvYWRlciIpOw0KCQkJCQl9KTsNCgkJCQl9LCA1MDAwKTsNCg0KCQkJfQ0KCQl9KTsNCgl9KTsNCn0pOw0KDQoNCmFzeW5jIGZ1bmN0aW9uIGdldFNHTkkxOG5JbnN0YW5jZShjYWxsYmFjaykgew0KCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQoJCWNvbnN0IHRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCgkJCWlmKGNoZWNrSW50ZXJ2YWxIYW5kbGVyKQ0KCQkJCWNsZWFySW50ZXJ2YWwoY2hlY2tJbnRlcnZhbEhhbmRsZXIpOw0KCQl9LCAxMDAwMCk7DQoNCgkJY29uc3QgY2hlY2tJbnRlcnZhbEhhbmRsZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJCWlmKHdpbmRvdy5TR05VSUtpdFJlYWR5KSB7DQoJCQkJaWYodGltZW91dEhhbmRsZXIpDQoJCQkJCWNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlcik7DQoJCQkJY2xlYXJJbnRlcnZhbChjaGVja0ludGVydmFsSGFuZGxlcik7DQoJCQkJY29uc3QgYyA9IG5ldyBTR05pMThuKCk7DQoNCgkJCQlyZXNvbHZlKGMpOw0KCQkJfQ0KCQl9LCAxMDApOw0KCX0pOw0KfQ0KDQo="; + for(let i = 2; i < argv.length; i++) { const v = argv[i].replace("--", ""); i++; diff --git a/src/addons/SGNAtom/SGNAtom.js b/src/addons/SGNAtom/SGNAtom.js index b466e8ef..30e01eb6 100644 --- a/src/addons/SGNAtom/SGNAtom.js +++ b/src/addons/SGNAtom/SGNAtom.js @@ -446,7 +446,7 @@ class HistoryStack { * * @constructor */ -const SGNAtom = function(elements, options) { +let SGNAtom = function(elements, options) { const plugin = this; /** * This callback is called when a state is changed. @@ -625,17 +625,32 @@ const SGNAtom = function(elements, options) { /*document.onload = function() { new plugin.SGNAtomCore(elements, plugin.settings); }*/ - const core = new plugin.SGNAtomCore(elements, plugin, plugin.settings); - plugin.core = core; - SGNAtomStates.instance = core; - core.setOnCoreReadyListener((isReady) => SGNAtomStates.ready = isReady); - } else { - window.SGNUIKit.setOnReadyListener(() => { + if(!SGNAtomStates.ready) { const core = new plugin.SGNAtomCore(elements, plugin, plugin.settings); plugin.core = core; SGNAtomStates.instance = core; - SGNAtomStates.ready = core.isInitialized(); - }); + core.setOnCoreReadyListener((isReady) => SGNAtomStates.ready = isReady); + } + } else { + const stack = new Error().stack; + //const stacks = stack.split("\n"); + if(stack.indexOf("set ready") !== -1) { + if(!SGNAtomStates.ready) { + const core = new plugin.SGNAtomCore(elements, plugin, plugin.settings); + plugin.core = core; + SGNAtomStates.instance = core; + SGNAtomStates.ready = core.isInitialized(); + } + } else { + if(!SGNAtomStates.ready) { + window.SGNUIKit.setOnReadyListener(() => { + const core = new plugin.SGNAtomCore(elements, plugin, plugin.settings); + plugin.core = core; + SGNAtomStates.instance = core; + SGNAtomStates.ready = core.isInitialized(); + }); + } + } } }; @@ -1270,25 +1285,27 @@ body { const hidePreLoader = (transitive = true, callback) => { const loader = document.querySelector(".sgn-preloader"); - if(transitive) { - instance.fadeIn(PRELOADER_TRANSITION_DURATION); - //console.log(new Error()); - loader.fadeOut(PRELOADER_TRANSITION_DURATION, () => { - loader.remove(); - document.body.classList.remove("has-preloader"); - - if(typeof callback === "function") - callback(); - }); - } else { - instance.fadeIn(0); - loader.fadeOut(0, () => { - loader.remove(); - document.body.classList.remove("has-preloader"); + if(loader !== null && loader.length > 0) { + if(transitive) { + instance.fadeIn(PRELOADER_TRANSITION_DURATION); + //console.log(new Error()); + loader.fadeOut(PRELOADER_TRANSITION_DURATION, () => { + loader.remove(); + document.body.classList.remove("has-preloader"); - if(typeof callback === "function") - callback(); - }); + if(typeof callback === "function") + callback(); + }); + } else { + instance.fadeIn(0); + loader.fadeOut(0, () => { + loader.remove(); + document.body.classList.remove("has-preloader"); + + if(typeof callback === "function") + callback(); + }); + } } }; diff --git a/src/js/components/windows.js b/src/js/components/windows.js index 3d592d15..da495b80 100644 --- a/src/js/components/windows.js +++ b/src/js/components/windows.js @@ -929,7 +929,7 @@ if(typeof jQuery === "undefined") { }; $(function() { - const $windowToggles = $.select($("[sgn-window]"), $("[data-sgn-window]"), $("[data-window]")); + const $windowToggles = $("[sgn-window], [data-sgn-window], [data-window]"); const $windows = $(".sgn-window"); if($windows.length > 0) { @@ -938,6 +938,7 @@ if(typeof jQuery === "undefined") { $this.SGNWindow(); }); } + if($windowToggles.length > 0) { $windowToggles.each(function() { $(this).on("click", function(e) { @@ -956,4 +957,4 @@ if(typeof jQuery === "undefined") { }); return this; -}(window, document, jQuery)); \ No newline at end of file +}(window, document, jQuery));