{"id":31,"date":"2026-05-18T20:12:35","date_gmt":"2026-05-18T20:12:35","guid":{"rendered":"https:\/\/wprecover.cl\/?page_id=31"},"modified":"2026-05-18T21:06:37","modified_gmt":"2026-05-18T21:06:37","slug":"auditor-wpr","status":"publish","type":"page","link":"https:\/\/wprecover.cl\/?page_id=31","title":{"rendered":"Auditor WPR"},"content":{"rendered":"","protected":true},"excerpt":{"rendered":"","protected":true},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"{\"document\":\"AACaAb7+9tget9Cuww\/RiLbyHAL+\/vbYHgS30K7DD\/7+9tgeALfQrsMP\/v722B4EkYi28hz30K7DDwC1xK3SEPfQrsMPAJGItvIct9Cuww\/RiLbyHAH1xK3SEAq30K7DD\/XErdIQAPfQrsMPALXErdIQ99Cuww8Ghf6b4gW+\/vbYHsX+m+IFBv7+9tgeAIX+m+IFt9Cuww\/F\/pviBQZrho8B6IgBgAQCxgQDA6KIAe6IAa6IAeiEAfgDApAKAox+xo4BqPMDAtLuA66IAeyIAQLWBgoCBiRqBlRCngHWAUgsmI4BngPWkgFIAq4Q9BACAQIKSrgQAvwQNra3A4gD3rsDRAKYuAOS\/wwVsAbuBqgGnogBxo8BBgwGQgEAmLgDbSgAwQChCMEAoQDEAKEEIQDBAKEDAADBAKEBIQInAAEAhAGBACcBKAQnACgAIQBEAMQBAAChACEAoQAoACEBoQCoAKEAAAABAAAARADBAMQAqAChASEApwAHACgDJwAoACcAoQGoAIQCqALEAKitkwXlkgVzdGF0ZXZlcnNpb24gICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBpZD0iYXBpS2V5SW5wdXQiIGNsYXNzPSJ3cHItaW5wdXQiIHBsYWNlaG9sZGVyPSJzay1hbnQtYXBpMDMtN1J5dEw2eDMzMUhNOUtiVWpneWFLdlBZWktMY2d4cTEybThHTl9TeUxPWG9faVJEUFFhcEhRSFd4UDIyRTc3Y1VDY21vRzYtbF9JdnMyWlFkeTd0SVEtejM5NmZ3QUEiIHN0eWxlPSJmbGV4OjEiIC8+CnN0YXRldmVyc2lvbnN0YXRldmVyc2lvbmRvY3VtZW50ZGF0ZWRvY3VtZW50c3RhdHVzZG9jdW1lbnR0aXRsZWRvciBkb2N1bWVudGNvbnRlbnRkb2N1bWVudGV4Y2VycHRkb2N1bWVudGF1dGhvcmRvY3VtZW50ZmVhdHVyZWRfbWVkaWFkb2N1bWVudGNvbW1lbnRfc3RhdHVzZG9jdW1lbnRwaW5nX3N0YXR1c2RvY3VtZW50dGVtcGxhdGVkb2N1bWVudG1ldGFmb290bm90ZXNkb2N1bWVudGJsb2Nrc0F1aXRXUFJzdGF0ZXZlcnNpb25kb2N1bWVudHNsdWdzdGF0ZXNhdmVkQXRzdGF0ZXNhdmVkQnk8IS0tIHdwOmh0bWwgLS0+CjxkaXYgaWQ9ImF1ZGl0b3Itd3ByLXJvb3QiIHN0eWxlPSJmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7IG1heC13aWR0aDogOTAwcHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAyMHB4OyBiYWNrZ3JvdW5kOiAjZjBmNGY4OyBtaW4taGVpZ2h0OiAxMDB2aDsiPgoKPHN0eWxlPgogICNhdWRpdG9yLXdwci1yb290ICogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CiAgI2F1ZGl0b3Itd3ByLXJvb3QgaDEgeyBjb2xvcjogIzFhMzY1ZDsgZm9udC1zaXplOiAxLjhlbTsgbWFyZ2luLWJvdHRvbTogNXB4OyB9CiAgI2F1ZGl0b3Itd3ByLXJvb3QgLnN1YnRpdGxlIHsgY29sb3I6ICM0YTU1Njg7IG1hcmdpbi1ib3R0b206IDI1cHg7IGZvbnQtc2l6ZTogMC45NWVtOyB9CiAgLndwci1jYXJkIHsgYmFja2dyb3VuZDogI2ZmZjsgYm9yZGVyLXJhZGl1czogMTJweDsgcGFkZGluZzogMjRweDsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwwLDAsMC4wOCk7IH0KICAud3ByLWNhcmQgaDIgeyBjb2xvcjogIzJkMzc0ODsgZm9udC1zaXplOiAxLjFlbTsgbWFyZ2luOiAwIDAgMTZweCAwOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgfQogIC53cHItaW5wdXQgeyB3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC45NWVtOyB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yczsgfQogIC53cHItaW5wdXQ6Zm9jdXMgeyBvdXRsaW5lOiBub25lOyBib3JkZXItY29sb3I6ICM0Mjk5ZTE7IH0KICAud3ByLWJ0biB7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjk1ZW07IGZvbnQtd2VpZ2h0OiA2MDA7IHRyYW5zaXRpb246IGFsbCAwLjJzOyB9CiAgLndwci1idG4tcHJpbWFyeSB7IGJhY2tncm91bmQ6ICMzMTgyY2U7IGNvbG9yOiB3aGl0ZTsgfQogIC53cHItYnRuLXByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMmI2Y2IwOyB9CiAgLndwci1idG4tcHJpbWFyeTpkaXNhYmxlZCB7IGJhY2tncm91bmQ6ICM5MGNkZjQ7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH0KICAud3ByLWJ0bi1zdWNjZXNzIHsgYmFja2dyb3VuZDogIzM4YTE2OTsgY29sb3I6IHdoaXRlOyB9CiAgLndwci1idG4tc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQ6ICMyNzY3NDk7IH0KICAud3ByLWJ0bi13YSB7IGJhY2tncm91bmQ6ICMyNWQzNjY7IGNvbG9yOiB3aGl0ZTsgfQogIC53cHItYnRuLXdhOmhvdmVyIHsgYmFja2dyb3VuZDogIzEyOGM3ZTsgfQogIC53cHItYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNlNTNlM2U7IGNvbG9yOiB3aGl0ZTsgZm9udC1zaXplOiAwLjhlbTsgcGFkZGluZzogNnB4IDEycHg7IH0KICAud3ByLWJ0bi1kYW5nZXI6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjYzUzMDMwOyB9CiAgLndwci1idG4tc20geyBmb250LXNpemU6IDAuOGVtOyBwYWRkaW5nOiA2cHggMTJweDsgfQogIC53cHItZmxleCB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyB9CiAgLndwci1yZXN1bHQgeyBiYWNrZ3JvdW5kOiAjZjdmYWZjOyBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmc6IDE2cHg7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1zaXplOiAwLjllbTsgbGluZS1oZWlnaHQ6IDEuNjsgbWluLWhlaWdodDogMTAwcHg7IGNvbG9yOiAjMmQzNzQ4OyB9CiAgLndwci1sb2FkaW5nIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBjb2xvcjogIzRhNTU2ODsgZm9udC1zaXplOiAwLjllbTsgfQogIC53cHItc3Bpbm5lciB7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7IGJvcmRlcjogM3B4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci10b3AtY29sb3I6ICMzMTgyY2U7IGJvcmRlci1yYWRpdXM6IDUwJTsgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOyB9CiAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH0KICAud3ByLWhpc3RvcnktaXRlbSB7IGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMTJweCAxNnB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsgfQogIC53cHItaGlzdG9yeS1pdGVtOmhvdmVyIHsgYmFja2dyb3VuZDogI2ViZjhmZjsgfQogIC53cHItaGlzdG9yeS11cmwgeyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzJiNmNiMDsgZm9udC1zaXplOiAwLjllbTsgfQogIC53cHItaGlzdG9yeS1kYXRlIHsgZm9udC1zaXplOiAwLjc1ZW07IGNvbG9yOiAjNzE4MDk2OyBtYXJnaW4tdG9wOiAzcHg7IH0KICAud3ByLWhpc3RvcnktcHJldmlldyB7IGZvbnQtc2l6ZTogMC44MmVtOyBjb2xvcjogIzRhNTU2ODsgbWFyZ2luLXRvcDogNnB4OyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgfQogIC53cHItZW1wdHkgeyBjb2xvcjogI2EwYWVjMDsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4OyBmb250LXNpemU6IDAuOWVtOyB9CiAgLndwci1hcGktcm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgLndwci1hcGktc3RhdHVzIHsgZm9udC1zaXplOiAwLjhlbTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDIwcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IH0KICAud3ByLWFwaS1vayB7IGJhY2tncm91bmQ6ICNjNmY2ZDU7IGNvbG9yOiAjMjc2NzQ5OyB9CiAgLndwci1hcGktbWlzc2luZyB7IGJhY2tncm91bmQ6ICNmZWQ3ZDc7IGNvbG9yOiAjYzUzMDMwOyB9CiAgLndwci10YWcgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQ6ICNlYmY4ZmY7IGNvbG9yOiAjMmI2Y2IwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDJweCA4cHg7IGZvbnQtc2l6ZTogMC43OGVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tcmlnaHQ6IDRweDsgfQogIC53cHItbW9kYWwgeyBkaXNwbGF5OiBub25lOyBwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgbGVmdDogMDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjUpOyB6LWluZGV4OiA5OTk5OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgfQogIC53cHItbW9kYWwuYWN0aXZlIHsgZGlzcGxheTogZmxleDsgfQogIC53cHItbW9kYWwtYm94IHsgYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDEycHg7IHBhZGRpbmc6IDI4cHg7IG1heC13aWR0aDogNjAwcHg7IHdpZHRoOiA5MCU7IG1heC1oZWlnaHQ6IDgwdmg7IG92ZXJmbG93LXk6IGF1dG87IH0KICAud3ByLW1vZGFsLWJveCBoMyB7IG1hcmdpbjogMCAwIDEycHggMDsgY29sb3I6ICMxYTM2NWQ7IH0KICAud3ByLW1vZGFsLXJlc3VsdCB7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1zaXplOiAwLjg4ZW07IGxpbmUtaGVpZ2h0OiAxLjY7IGNvbG9yOiAjMmQzNzQ4OyBiYWNrZ3JvdW5kOiAjZjdmYWZjOyBwYWRkaW5nOiAxNnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyB9CiAgLndwci1tb2RhbC1mb290ZXIgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IG1hcmdpbi10b3A6IDE2cHg7IGZsZXgtd3JhcDogd3JhcDsgfQogIC53cHItY2xvc2UtYnRuIHsgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDsgY29sb3I6ICM0YTU1Njg7IH0KICAud3ByLWNsb3NlLWJ0bjpob3ZlciB7IGJhY2tncm91bmQ6ICNmN2ZhZmM7IH0KICB0ZXh0YXJlYS53cHItaW5wdXQgeyBtaW4taGVpZ2h0OiA4MHB4OyByZXNpemU6IHZlcnRpY2FsOyB9CiAgLndwci1zZWN0aW9uLXRpdGxlIHsgZm9udC1zaXplOiAwLjc4ZW07IGZvbnQtd2VpZ2h0OiA3MDA7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjA1ZW07IGNvbG9yOiAjNzE4MDk2OyBtYXJnaW4tYm90dG9tOiA4cHg7IH0KPC9zdHlsZT4KCjxoMT7wn5SNIEF1ZGl0b3IgV1BSPC9oMT4KPHAgY2xhc3M9InN1YnRpdGxlIj5IZXJyYW1pZW50YSBpbnRlcm5hIGRlIGRpYWduw7NzdGljbyBXb3JkUHJlc3MgwrcgV1BSZWNvdmVyLmNsPC9wPgoKPCEtLSBBUEkgS2V5IENhcmQgLS0+CjxkaXYgY2xhc3M9Indwci1jYXJkIiBpZD0iYXBpLWNhcmQiPgogIDxoMj7wn5SRIEFQSSBLZXkgZGUgQW50aHJvcGljPC9oMj4KICA8ZGl2IGNsYXNzPSJ3cHItYXBpLXJvdyI+CiAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tcHJpbWFyeSIgb25jbGljaz0ic2F2ZUFwaUtleSgpIj5HdWFyZGFyPC9idXR0b24+CiAgICA8c3BhbiBpZD0iYXBpU3RhdHVzIiBjbGFzcz0id3ByLWFwaS1zdGF0dXMgd3ByLWFwaS1taXNzaW5nIj5TaW4gY2xhdmU8L3NwYW4+CiAgPC9kaXY+CiAgPHAgc3R5bGU9ImZvbnQtc2l6ZTowLjc4ZW07IGNvbG9yOiM3MTgwOTY7IG1hcmdpbjogOHB4IDAgMCAwOyI+TGEgY2xhdmUgc2UgZ3VhcmRhIGVuIGxvY2FsU3RvcmFnZSBkZSB0dSBuYXZlZ2Fkb3IgeSBwZXJzaXN0ZSBlbnRyZSBzZXNpb25lcy48L3A+CjwvZGl2PgoKPCEtLSBBbsOhbGlzaXMgQ2FyZCAtLT4KPGRpdiBjbGFzcz0id3ByLWNhcmQiPgogIDxoMj7wn4yQIEFuYWxpemFyIHNpdGlvIFdvcmRQcmVzczwvaDI+CiAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiPlVSTCBkZWwgY2xpZW50ZTwvZGl2PgogIDxkaXYgY2xhc3M9Indwci1mbGV4IiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTRweDsiPgogICAgPGlucHV0IHR5cGU9InVybCIgaWQ9InVybElucHV0IiBjbGFzcz0id3ByLWlucHV0IiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly9zaXRpby1kZWwtY2xpZW50ZS5jbCIgc3R5bGU9ImZsZXg6MSIgb25rZXlwcmVzcz0iaWYoZXZlbnQua2V5PT09J0VudGVyJykgYW5hbGl6YXIoKSIgLz4KICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJhbmFsaXphcigpIiBpZD0iYnRuQW5hbGl6YXIiPvCflI4gQW5hbGl6YXI8L2J1dHRvbj4KICA8L2Rpdj4KCiAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiPkNvbnRleHRvIGFkaWNpb25hbCAob3BjaW9uYWwpPC9kaXY+CiAgPHRleHRhcmVhIGlkPSJjb250ZXh0b0lucHV0IiBjbGFzcz0id3ByLWlucHV0IiBwbGFjZWhvbGRlcj0iRWo6IEVsIGNsaWVudGUgbWUgY29udGFjdMOzIHBvciBXaGF0c0FwcCBkaWNpZW5kbyBxdWUgc3Ugc2l0aW8gbXVlc3RyYSBwYW50YWxsYSBibGFuY2EuIFVzYSBXb3JkUHJlc3MgY29uIFdvb0NvbW1lcmNlLiBIb3N0aW5nIGVuIEhvc3RHYXRvci4iPjwvdGV4dGFyZWE+CgogIDxkaXYgaWQ9ImxvYWRpbmdEaXYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6MTRweDsiPgogICAgPGRpdiBjbGFzcz0id3ByLWxvYWRpbmciPjxkaXYgY2xhc3M9Indwci1zcGlubmVyIj48L2Rpdj4gQW5hbGl6YW5kbyBjb24gQ2xhdWRlLi4uIHBvciBmYXZvciBlc3BlcmEuPC9kaXY+CiAgPC9kaXY+CgogIDxkaXYgaWQ9InJlc3VsdERpdiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsgbWFyZ2luLXRvcDoxNHB4OyI+CiAgICA8ZGl2IGNsYXNzPSJ3cHItc2VjdGlvbi10aXRsZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4OyI+TWVuc2FqZSBnZW5lcmFkbzwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLXJlc3VsdCIgaWQ9InJlc3VsdFRleHQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLWZsZXgiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMnB4OyI+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1zdWNjZXNzIiBvbmNsaWNrPSJjb3BpYXJNZW5zYWplKCkiPvCfk4sgQ29waWFyPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi13YSIgb25jbGljaz0iZW52aWFyV0EoKSI+8J+SrCBFbnZpYXIgcG9yIFdoYXRzQXBwPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IHdwci1idG4tc20iIG9uY2xpY2s9InJlZ2VuZXJhcigpIj7wn5SEIFJlZ2VuZXJhcjwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPCEtLSBIaXN0b3JpYWwgQ2FyZCAtLT4KPGRpdiBjbGFzcz0id3ByLWNhcmQiPgogIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOmNlbnRlcjsgbWFyZ2luLWJvdHRvbToxNHB4OyI+CiAgICA8aDIgc3R5bGU9Im1hcmdpbjowOyI+8J+TiyBIaXN0b3JpYWwgZGUgYW7DoWxpc2lzPC9oMj4KICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1kYW5nZXIgd3ByLWJ0bi1zbSIgb25jbGljaz0ibGltcGlhckhpc3RvcmlhbCgpIj7wn5eR77iPIExpbXBpYXIgdG9kbzwvYnV0dG9uPgogIDwvZGl2PgogIDxkaXYgaWQ9Imhpc3RvcmlhbERpdiI+CiAgICA8cCBjbGFzcz0id3ByLWVtcHR5Ij5Bw7puIG5vIGhheSBhbsOhbGlzaXMgcmVhbGl6YWRvcy48L3A+CiAgPC9kaXY+CjwvZGl2PgoKPCEtLSBNb2RhbCBwYXJhIHZlciBoaXN0b3JpYWwgLS0+CjxkaXYgY2xhc3M9Indwci1tb2RhbCIgaWQ9Imhpc3RvcmlhbE1vZGFsIj4KICA8ZGl2IGNsYXNzPSJ3cHItbW9kYWwtYm94Ij4KICAgIDxoMyBpZD0ibW9kYWxVcmwiPlVSTDwvaDM+CiAgICA8ZGl2IGNsYXNzPSJ3cHItc2VjdGlvbi10aXRsZSIgaWQ9Im1vZGFsRGF0ZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ3cHItbW9kYWwtcmVzdWx0IiBpZD0ibW9kYWxSZXN1bHQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLW1vZGFsLWZvb3RlciI+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1zdWNjZXNzIiBvbmNsaWNrPSJjb3BpYXJEZXNkZU1vZGFsKCkiPvCfk4sgQ29waWFyPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi13YSIgb25jbGljaz0iZW52aWFyV0FNb2RhbCgpIj7wn5KsIFdoYXRzQXBwPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IHdwci1idG4tc20iIG9uY2xpY2s9ImNhcmdhckVuRWRpdG9yKCkiPuKcj++4jyBDYXJnYXIgZW4gZWRpdG9yPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWNsb3NlLWJ0biIgb25jbGljaz0iY2VycmFyTW9kYWwoKSI+4pyVIENlcnJhcjwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KKGZ1bmN0aW9uKCkgewoKICBjb25zdCBTVE9SQUdFX0tFWSA9ICd3cHJfaGlzdG9yaWFsJzsKICBjb25zdCBBUElfS0VZX1NUT1JBR0UgPSAnd3ByX2FwaV9rZXknOwogIGxldCBjdXJyZW50QW5hbHlzaXMgPSBudWxsOwogIGxldCBtb2RhbERhdGEgPSBudWxsOwoKICAvLyBJbmljaWFsaXphcgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsKICAgIGluaXRBcGlLZXkoKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH0pOwogIC8vIFRhbWJpw6luIGVqZWN1dGFyIHNpIGVsIERPTSB5YSBlc3TDoSBsaXN0bwogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnbG9hZGluZycpIHsKICAgIGluaXRBcGlLZXkoKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH0KCiAgZnVuY3Rpb24gaW5pdEFwaUtleSgpIHsKICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQVBJX0tFWV9TVE9SQUdFKTsKICAgIGlmIChzYXZlZCkgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBpS2V5SW5wdXQnKS52YWx1ZSA9IHNhdmVkOwogICAgICB1cGRhdGVBcGlTdGF0dXModHJ1ZSk7CiAgICB9CiAgfQoKICB3aW5kb3cuc2F2ZUFwaUtleSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3Qga2V5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaUtleUlucHV0JykudmFsdWUudHJpbSgpOwogICAgaWYgKCFrZXkpIHsgYWxlcnQoJ1BvciBmYXZvciBpbmdyZXNhIGxhIEFQSSBrZXkuJyk7IHJldHVybjsgfQogICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnc2stYW50LScpKSB7CiAgICAgIGlmICghY29uZmlybSgnTGEgY2xhdmUgbm8gZW1waWV6YSBjb24gInNrLWFudC0iLiDCv0Rlc2VhcyBndWFyZGFybGEgaWd1YWxtZW50ZT8nKSkgcmV0dXJuOwogICAgfQogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQVBJX0tFWV9TVE9SQUdFLCBrZXkpOwogICAgdXBkYXRlQXBpU3RhdHVzKHRydWUpOwogICAgYWxlcnQoJ+KchSBBUEkga2V5IGd1YXJkYWRhIGNvcnJlY3RhbWVudGUuJyk7CiAgfTsKCiAgZnVuY3Rpb24gdXBkYXRlQXBpU3RhdHVzKG9rKSB7CiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGlTdGF0dXMnKTsKICAgIGlmIChvaykgewogICAgICBlbC50ZXh0Q29udGVudCA9ICfinJMgQWN0aXZhJzsKICAgICAgZWwuY2xhc3NOYW1lID0gJ3dwci1hcGktc3RhdHVzIHdwci1hcGktb2snOwogICAgfSBlbHNlIHsKICAgICAgZWwudGV4dENvbnRlbnQgPSAnU2luIGNsYXZlJzsKICAgICAgZWwuY2xhc3NOYW1lID0gJ3dwci1hcGktc3RhdHVzIHdwci1hcGktbWlzc2luZyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRBcGlLZXkoKSB7CiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQVBJX0tFWV9TVE9SQUdFKSB8fCAnJzsKICB9CgogIHdpbmRvdy5hbmFsaXphciA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgY29uc3QgdXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybElucHV0JykudmFsdWUudHJpbSgpOwogICAgY29uc3QgY29udGV4dG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGV4dG9JbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpOwoKICAgIGlmICghdXJsKSB7IGFsZXJ0KCdQb3IgZmF2b3IgaW5ncmVzYSBsYSBVUkwgZGVsIGNsaWVudGUuJyk7IHJldHVybjsgfQogICAgaWYgKCFhcGlLZXkpIHsgYWxlcnQoJ1ByaW1lcm8gZGViZXMgZ3VhcmRhciB0dSBBUEkga2V5IGRlIEFudGhyb3BpYy4nKTsgcmV0dXJuOyB9CgogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkFuYWxpemFyJyk7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmdEaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHREaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgIHRyeSB7CiAgICAgIGNvbnN0IG1lbnNhamUgPSBhd2FpdCBsbGFtYXJDbGF1ZGUodXJsLCBjb250ZXh0bywgYXBpS2V5KTsKICAgICAgY3VycmVudEFuYWx5c2lzID0geyB1cmwsIGNvbnRleHRvLCBtZW5zYWplLCBmZWNoYTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQgPSBtZW5zYWplOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0RGl2Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIGd1YXJkYXJFbkhpc3RvcmlhbChjdXJyZW50QW5hbHlzaXMpOwogICAgICByZW5kZXJIaXN0b3JpYWwoKTsKICAgIH0gY2F0Y2goZXJyKSB7CiAgICAgIGFsZXJ0KCdFcnJvciBhbCBsbGFtYXIgYSBsYSBBUEk6ICcgKyBlcnIubWVzc2FnZSk7CiAgICB9IGZpbmFsbHkgewogICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmdEaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfQogIH07CgogIHdpbmRvdy5yZWdlbmVyYXIgPSBmdW5jdGlvbigpIHsKICAgIHdpbmRvdy5hbmFsaXphcigpOwogIH07CgogIGFzeW5jIGZ1bmN0aW9uIGxsYW1hckNsYXVkZSh1cmwsIGNvbnRleHRvLCBhcGlLZXkpIHsKICAgIGNvbnN0IHByb21wdCA9IGNvbnN0cnVpclByb21wdCh1cmwsIGNvbnRleHRvKTsKICAgIAogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICd4LWFwaS1rZXknOiBhcGlLZXksCiAgICAgICAgJ2FudGhyb3BpYy12ZXJzaW9uJzogJzIwMjMtMDYtMDEnLAogICAgICAgICdhbnRocm9waWMtZGFuZ2Vyb3VzLWRpcmVjdC1icm93c2VyLWFjY2Vzcyc6ICd0cnVlJwogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgbW9kZWw6ICdjbGF1ZGUtb3B1cy00LTUnLAogICAgICAgIG1heF90b2tlbnM6IDEwMjQsCiAgICAgICAgbWVzc2FnZXM6IFt7CiAgICAgICAgICByb2xlOiAndXNlcicsCiAgICAgICAgICBjb250ZW50OiBwcm9tcHQKICAgICAgICB9XQogICAgICB9KQogICAgfSk7CgogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZXJyb3I\/Lm1lc3NhZ2UgfHwgJ0Vycm9yIEhUVFAgJyArIHJlc3BvbnNlLnN0YXR1cyk7CiAgICB9CgogICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgIHJldHVybiBkYXRhLmNvbnRlbnRbMF0udGV4dDsKICB9CgogIGZ1bmN0aW9uIGNvbnN0cnVpclByb21wdCh1cmwsIGNvbnRleHRvKSB7CiAgICByZXR1cm4gYEVyZXMgZWwgYXNpc3RlbnRlIGRlIFdQUmVjb3Zlci5jbCwgdW5hIGFnZW5jaWEgY2hpbGVuYSBlc3BlY2lhbGl6YWRhIGVuIHJlY3VwZXJhY2nDs24geSBtYW50ZW5pbWllbnRvIGRlIHNpdGlvcyBXb3JkUHJlc3MuCgpUdSB0YXJlYTogZ2VuZXJhciB1biBtZW5zYWplIHByb2Zlc2lvbmFsIHkgY2VyY2FubyAoZW4gZXNwYcOxb2wgY2hpbGVubywgZXN0aWxvIFdoYXRzQXBwKSBwYXJhIGVudmlhcmxlIGFsIGR1ZcOxbyBkZWwgc2l0aW8gV29yZFByZXNzICR7dXJsfSwgb2ZyZWNpZW5kbyBsb3Mgc2VydmljaW9zIGRlIGRpYWduw7NzdGljbyB5IHJlY3VwZXJhY2nDs24gZGUgV1BSZWNvdmVyLmNsLgoKRWwgbWVuc2FqZSBkZWJlOgoxLiBTYWx1ZGFyIGRlIGZvcm1hIGFtaWdhYmxlIHkgZGlyZWN0YQoyLiBNb3N0cmFyIHF1ZSBpZGVudGlmaWNhc3RlIGVsIHNpdGlvIHkgc3UgZXN0YWRvIChXb3JkUHJlc3MpCjMuIE1lbmNpb25hciBwb3NpYmxlcyBwcm9ibGVtYXMgY29tdW5lcyBxdWUgcG9kcsOtYW4gZXN0YXIgYWZlY3RhbmRvIHN1IHNpdGlvICh2ZWxvY2lkYWQsIHNlZ3VyaWRhZCwgYWN0dWFsaXphY2lvbmVzLCBlcnJvcmVzLCBldGMuKQo0LiBQcmVzZW50YXIgYnJldmVtZW50ZSBsb3Mgc2VydmljaW9zIGRlIFdQUmVjb3Zlci5jbCAocmVjdXBlcmFjacOzbiBkZSBzaXRpb3MgY2HDrWRvcywgbWFudGVuaW1pZW50bywgb3B0aW1pemFjacOzbiwgc2VndXJpZGFkKQo1LiBJbmNsdWlyIHVuYSBsbGFtYWRhIGEgbGEgYWNjacOzbiBjb25jcmV0YSAoYWdlbmRhciBkaWFnbsOzc3RpY28gZ3JhdHVpdG8sIHJlc3BvbmRlciBhbCBtZW5zYWplKQo2LiBUZW5lciB1biB0b25vIHByb2Zlc2lvbmFsIHBlcm8gY2VyY2Fubywgbm8gZGVtYXNpYWRvIGZvcm1hbCBuaSBjb21lcmNpYWwKNy4gU2VyIGNvbmNpc28gKG3DoXhpbW8gMjAwIHBhbGFicmFzKQo4LiBJbmNsdWlyIGFsIGZpbmFsOiAiV1BSZWNvdmVyLmNsIHwgd3ByZWNvdmVyLmNsIgoKJHtjb250ZXh0byA\/ICdDb250ZXh0byBhZGljaW9uYWwgZGVsIGNsaWVudGU6ICcgKyBjb250ZXh0byA6ICcnfQoKR2VuZXJhIFNPTE8gZWwgbWVuc2FqZSwgc2luIGV4cGxpY2FjaW9uZXMgbmkgY29tZW50YXJpb3MgYWRpY2lvbmFsZXMuIEVsIG1lbnNhamUgZGViZSBlc3RhciBsaXN0byBwYXJhIGNvcGlhciB5IGVudmlhciBwb3IgV2hhdHNBcHAuYDsKICB9CgogIHdpbmRvdy5jb3BpYXJNZW5zYWplID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXh0byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQ7CiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0bykudGhlbigoKSA9PiB7CiAgICAgIGNvbnN0IGJ0biA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc3Qgb3JpZyA9IGJ0bi50ZXh0Q29udGVudDsKICAgICAgYnRuLnRleHRDb250ZW50ID0gJ+KchSBDb3BpYWRvISc7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSBvcmlnOyB9LCAyMDAwKTsKICAgIH0pOwogIH07CgogIHdpbmRvdy5lbnZpYXJXQSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGV4dG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0VGV4dCcpLnRleHRDb250ZW50OwogICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0byk7CiAgICB3aW5kb3cub3BlbignaHR0cHM6Ly93YS5tZS8\/dGV4dD0nICsgZW5jb2RlZCwgJ19ibGFuaycpOwogIH07CgogIC8vIEhpc3RvcmlhbAogIGZ1bmN0aW9uIGdldEhpc3RvcmlhbCgpIHsKICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKSkgfHwgW107IH0KICAgIGNhdGNoKGUpIHsgcmV0dXJuIFtdOyB9CiAgfQoKICBmdW5jdGlvbiBndWFyZGFyRW5IaXN0b3JpYWwoaXRlbSkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgaGlzdC51bnNoaWZ0KGl0ZW0pOwogICAgY29uc3QgbWF4SXRlbXMgPSA1MDsKICAgIGlmIChoaXN0Lmxlbmd0aCA+IG1heEl0ZW1zKSBoaXN0LnNwbGljZShtYXhJdGVtcyk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoaGlzdCkpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVySGlzdG9yaWFsKCkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcmlhbERpdicpOwogICAgaWYgKCFoaXN0Lmxlbmd0aCkgewogICAgICBkaXYuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJ3cHItZW1wdHkiPkHDum4gbm8gaGF5IGFuw6FsaXNpcyByZWFsaXphZG9zLjwvcD4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBkaXYuaW5uZXJIVE1MID0gaGlzdC5tYXAoKGl0ZW0sIGkpID0+IGAKICAgICAgPGRpdiBjbGFzcz0id3ByLWhpc3RvcnktaXRlbSIgb25jbGljaz0idmVySGlzdG9yaWFsKCR7aX0pIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cHItaGlzdG9yeS11cmwiPvCfjJAgJHtpdGVtLnVybH08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cHItaGlzdG9yeS1kYXRlIj4ke2Zvcm1hdEZlY2hhKGl0ZW0uZmVjaGEpfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Indwci1oaXN0b3J5LXByZXZpZXciPiR7aXRlbS5tZW5zYWplLnN1YnN0cmluZygwLCAxMjApfS4uLjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGApLmpvaW4oJycpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0RmVjaGEoaXNvKSB7CiAgICBjb25zdCBkID0gbmV3IERhdGUoaXNvKTsKICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZXMtQ0wnLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJzItZGlnaXQnLCB5ZWFyOiAnbnVtZXJpYycsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSk7CiAgfQoKICB3aW5kb3cudmVySGlzdG9yaWFsID0gZnVuY3Rpb24oaSkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgbW9kYWxEYXRhID0gaGlzdFtpXTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbFVybCcpLnRleHRDb250ZW50ID0gJ\/CfjJAgJyArIG1vZGFsRGF0YS51cmw7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWxEYXRlJykudGV4dENvbnRlbnQgPSBmb3JtYXRGZWNoYShtb2RhbERhdGEuZmVjaGEpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsUmVzdWx0JykudGV4dENvbnRlbnQgPSBtb2RhbERhdGEubWVuc2FqZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxNb2RhbCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIH07CgogIHdpbmRvdy5jZXJyYXJNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcmlhbE1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBtb2RhbERhdGEgPSBudWxsOwogIH07CgogIHdpbmRvdy5jb3BpYXJEZXNkZU1vZGFsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIW1vZGFsRGF0YSkgcmV0dXJuOwogICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQobW9kYWxEYXRhLm1lbnNhamUpLnRoZW4oKCkgPT4gewogICAgICBjb25zdCBidG4gPSBldmVudC50YXJnZXQ7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICfinIUgQ29waWFkbyEnOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ\/Cfk4sgQ29waWFyJzsgfSwgMjAwMCk7CiAgICB9KTsKICB9OwoKICB3aW5kb3cuZW52aWFyV0FNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFtb2RhbERhdGEpIHJldHVybjsKICAgIHdpbmRvdy5vcGVuKCdodHRwczovL3dhLm1lLz90ZXh0PScgKyBlbmNvZGVVUklDb21wb25lbnQobW9kYWxEYXRhLm1lbnNhamUpLCAnX2JsYW5rJyk7CiAgfTsKCiAgd2luZG93LmNhcmdhckVuRWRpdG9yID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIW1vZGFsRGF0YSkgcmV0dXJuOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybElucHV0JykudmFsdWUgPSBtb2RhbERhdGEudXJsOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRleHRvSW5wdXQnKS52YWx1ZSA9IG1vZGFsRGF0YS5jb250ZXh0byB8fCAnJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQgPSBtb2RhbERhdGEubWVuc2FqZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHREaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIGN1cnJlbnRBbmFseXNpcyA9IG1vZGFsRGF0YTsKICAgIGNlcnJhck1vZGFsKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsSW5wdXQnKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKICB9OwoKICB3aW5kb3cubGltcGlhckhpc3RvcmlhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFjb25maXJtKCfCv1NlZ3VybyBxdWUgcXVpZXJlcyBib3JyYXIgdG9kbyBlbCBoaXN0b3JpYWw\/JykpIHJldHVybjsKICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH07CgogIC8vIENlcnJhciBtb2RhbCBhbCBoYWNlciBjbGljayBmdWVyYQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxNb2RhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzKSBjZXJyYXJNb2RhbCgpOwogIH0pOwoKfSkoKTsKPC9zY3JpcHQ+CjwvZGl2Pgo8IS0tIC93cDpodG1sIC0tPnN0YXRldmVyc2lvbmNsaWVudElkaXNWYWxpZG9yaWdpbmFsQ29udGVudG5hbWVhdHRyaWJ1dGVzY29udGVudGlubmVyQmxvY2tzPCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVzIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8dGl0bGU+V1AgUmVwYWlyIFBybyDigJQgQXVkaXRvciBkZSBQcm9zcGVjdG9zPC90aXRsZT4KPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1ETStNb25vOndnaHRANDAwOzUwMCZmYW1pbHk9RnJhdW5jZXM6aXRhbCx3Z2h0QDAsMzAwOzAsNTAwOzAsNzAwOzEsMzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0Ij4KPHN0eWxlPgogIDpyb290IHsKICAgIC0tYmc6ICMwYTBhMGY7CiAgICAtLXN1cmZhY2U6ICMxMzEzMWE7CiAgICAtLXN1cmZhY2UyOiAjMWMxYzI3OwogICAgLS1ib3JkZXI6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNyk7CiAgICAtLWJvcmRlcjI6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNCk7CiAgICAtLXRleHQ6ICNmMGVlZTg7CiAgICAtLW11dGVkOiAjOGI4YTk2OwogICAgLS1hY2NlbnQ6ICM0ZjdmZmY7CiAgICAtLWFjY2VudC1kaW06IHJnYmEoNzksMTI3LDI1NSwwLjEyKTsKICAgIC0tZ3JlZW46ICMyMmM5N2E7CiAgICAtLWdyZWVuLWRpbTogcmdiYSgzNCwyMDEsMTIyLDAuMTIpOwogICAgLS1hbWJlcjogI2Y1YTYyMzsKICAgIC0tYW1iZXItZGltOiByZ2JhKDI0NSwxNjYsMzUsMC4xMik7CiAgICAtLXJlZDogI2ZmNGQ0ZDsKICAgIC0tcmVkLWRpbTogcmdiYSgyNTUsNzcsNzcsMC4xMik7CiAgICAtLXJhZGl1czogMTBweDsKICAgIC0tcmFkaXVzLWxnOiAxNHB4OwogIH0KCiAgKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQoKICBib2R5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtZmFtaWx5OiAnRE0gTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICB9CgogIC8qIEdyaWQgbGF5b3V0ICovCiAgLmxheW91dCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAzMjBweCAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDU2cHggMWZyOwogICAgbWluLWhlaWdodDogMTAwdmg7CiAgfQoKICAvKiBIZWFkZXIgKi8KICAuaGVhZGVyIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICBnYXA6IDE2cHg7CiAgfQogIC5oZWFkZXItbG9nbyB7CiAgICBmb250LWZhbWlseTogJ0ZyYXVuY2VzJywgc2VyaWY7CiAgICBmb250LXNpemU6IDE3cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyZW07CiAgfQogIC5oZWFkZXItbG9nbyBzcGFuIHsgY29sb3I6IHZhcigtLWFjY2VudCk7IH0KICAuaGVhZGVyLXNlcCB7IHdpZHRoOiAxcHg7IGhlaWdodDogMjBweDsgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyMik7IH0KICAuaGVhZGVyLXN1YiB7IGZvbnQtc2l6ZTogMTFweDsgY29sb3I6IHZhcigtLW11dGVkKTsgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQogIC5oZWFkZXItcmlnaHQgeyBtYXJnaW4tbGVmdDogYXV0bzsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyB9CiAgLmFwaS1pbmRpY2F0b3IgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CiAgLmRvdCB7IHdpZHRoOiA3cHg7IGhlaWdodDogN3B4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLWdyZWVuKTsgYW5pbWF0aW9uOiBwdWxzZSAycyBpbmZpbml0ZTsgfQogIEBrZXlmcmFtZXMgcHVsc2UgeyAwJSwxMDAle29wYWNpdHk6MX0gNTAle29wYWNpdHk6MC40fSB9CgogIC8qIFNpZGViYXIgKi8KICAuc2lkZWJhciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwYWRkaW5nOiAyMHB4IDE2cHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDE0cHg7CiAgfQoKICAuc2VjdGlvbi1sYWJlbCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIG1hcmdpbi1ib3R0b206IDZweDsKICB9CgogIGxhYmVsLmZpZWxkLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogIH0KCiAgaW5wdXRbdHlwZT0idGV4dCJdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLCB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcjIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtZmFtaWx5OiAnRE0gTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDlweCAxMXB4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKICB9CiAgaW5wdXQ6Zm9jdXMsIHRleHRhcmVhOmZvY3VzIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9CiAgaW5wdXQ6OnBsYWNlaG9sZGVyLCB0ZXh0YXJlYTo6cGxhY2Vob2xkZXIgeyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CgogIC5jYW5hbC1yb3cgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgZmxleC13cmFwOiB3cmFwOyB9CiAgLmNoaXAgewogICAgcGFkZGluZzogNXB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMDBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcjIpOwogICAgZm9udC1mYW1pbHk6ICdETSBNb25vJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwogIH0KICAuY2hpcDpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLXRleHQpOyB9CiAgLmNoaXAub24geyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjZmZmOyB9CgogIC5zY2FuLWJ0biB7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDExcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOwogICAgZm9udC1mYW1pbHk6ICdETSBNb25vJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMsIHRyYW5zZm9ybSAwLjFzOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICB9CiAgLnNjYW4tYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgb3BhY2l0eTogMC44ODsgfQogIC5zY2FuLWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgeyB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOyB9CiAgLnNjYW4tYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9CgogIC5kaXZpZGVyIHsgaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7IH0KCiAgLyogSGlzdG9yeSAqLwogIC5oaXN0b3J5LWl0ZW0gewogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogIH0KICAuaGlzdG9yeS1pdGVtOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZTIpOyB9CiAgLmhpc3RvcnktZG9tYWluIHsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0tdGV4dCk7IH0KICAuaGlzdG9yeS1tZXRhIHsgZm9udC1zaXplOiAxMHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CiAgLmhpc3Rvcnktc2NvcmUgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgbWFyZ2luLXRvcDogNHB4OyB9CiAgLmhzIHsgZm9udC1zaXplOiAxMHB4OyBwYWRkaW5nOiAxcHggN3B4OyBib3JkZXItcmFkaXVzOiAxMDBweDsgfQogIC5ocy1yIHsgYmFja2dyb3VuZDogdmFyKC0tcmVkLWRpbSk7IGNvbG9yOiB2YXIoLS1yZWQpOyB9CiAgLmhzLWEgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hbWJlci1kaW0pOyBjb2xvcjogdmFyKC0tYW1iZXIpOyB9CiAgLmhzLWcgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ncmVlbi1kaW0pOyBjb2xvcjogdmFyKC0tZ3JlZW4pOyB9CgogIC8qIE1haW4gY29udGVudCAqLwogIC5tYWluIHsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDIwcHg7CiAgfQoKICAvKiBFbXB0eSBzdGF0ZSAqLwogIC5lbXB0eS1zdGF0ZSB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA2MHB4IDIwcHg7CiAgfQogIC5lbXB0eS1pY29uIHsKICAgIHdpZHRoOiA2NHB4OyBoZWlnaHQ6IDY0cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIyKTsKICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZm9udC1zaXplOiAyOHB4OwogIH0KICAuZW1wdHktdGl0bGUgewogICAgZm9udC1mYW1pbHk6ICdGcmF1bmNlcycsIHNlcmlmOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICB9CiAgLmVtcHR5LXN1YiB7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IHZhcigtLW11dGVkKTsgbWF4LXdpZHRoOiAzMjBweDsgbGluZS1oZWlnaHQ6IDEuNzsgfQoKICAvKiBQcm9ncmVzcyAqLwogIC5wcm9ncmVzcy13cmFwIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgZGlzcGxheTogbm9uZTsKICB9CiAgLnByb2dyZXNzLXVybCB7IGZvbnQtc2l6ZTogMTNweDsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDE0cHg7IH0KICAucHJvZy1zdGVwcyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9CiAgLnByb2ctc3RlcC1pdGVtIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBmb250LXNpemU6IDEycHg7IH0KICAuc3RlcC1pY29uIHsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgYm9yZGVyLXJhZGl1czogNTAlOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIyKTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGZvbnQtc2l6ZTogMTBweDsgZmxleC1zaHJpbms6IDA7IH0KICAuc3RlcC1pY29uLmRvbmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ncmVlbik7IGJvcmRlci1jb2xvcjogdmFyKC0tZ3JlZW4pOyBjb2xvcjogI2ZmZjsgfQogIC5zdGVwLWljb24ucnVubmluZyB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGFuaW1hdGlvbjogc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7IH0KICAuc3RlcC1pY29uLnBlbmRpbmcgeyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CiAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH0KICAuc3RlcC1sYWJlbCB7IGNvbG9yOiB2YXIoLS10ZXh0KTsgfQogIC5zdGVwLWxhYmVsLnBlbmRpbmcgeyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CgogIC8qIFN0YXRzICovCiAgLnN0YXRzLXJvdyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsKICAgIGdhcDogMTBweDsKICB9CiAgLnN0YXQtY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOwogICAgcGFkZGluZzogMTRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9CiAgLnN0YXQtbnVtIHsgZm9udC1mYW1pbHk6ICdGcmF1bmNlcycsIHNlcmlmOyBmb250LXNpemU6IDI4cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAxOyBtYXJnaW4tYm90dG9tOiA0cHg7IH0KICAuc3RhdC1sYmwgeyBmb250LXNpemU6IDEwcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjA3ZW07IH0KICAubnVtLXJlZCB7IGNvbG9yOiB2YXIoLS1yZWQpOyB9CiAgLm51bS1hbWJlciB7IGNvbG9yOiB2YXIoLS1hbWJlcik7IH0KICAubnVtLWdyZWVuIHsgY29sb3I6IHZhcigtLWdyZWVuKTsgfQogIC5udW0tYWNjZW50IHsgY29sb3I6IHZhcigtLWFjY2VudCk7IH0KCiAgLyogUGFja2FnZSBiYW5uZXIgKi8KICAucGtnLWJhbm5lciB7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICB9CiAgLnBrZy1zdGFydGVyIHsgYmFja2dyb3VuZDogcmdiYSg3OSwxMjcsMjU1LDAuMSk7IGJvcmRlci1jb2xvcjogcmdiYSg3OSwxMjcsMjU1LDAuMyk7IGNvbG9yOiAjN2FhZGZmOyB9CiAgLnBrZy1ncm93dGggeyBiYWNrZ3JvdW5kOiByZ2JhKDM0LDIwMSwxMjIsMC4xKTsgYm9yZGVyLWNvbG9yOiByZ2JhKDM0LDIwMSwxMjIsMC4zKTsgY29sb3I6ICMyMmM5N2E7IH0KICAucGtnLXNjYWxlIHsgYmFja2dyb3VuZDogcmdiYSgyNDUsMTY2LDM1LDAuMSk7IGJvcmRlci1jb2xvcjogcmdiYSgyNDUsMTY2LDM1LDAuMyk7IGNvbG9yOiAjZjVhNjIzOyB9CiAgLnBrZy1lbGl0ZSB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LDc3LDc3LDAuMSk7IGJvcmRlci1jb2xvcjogcmdiYSgyNTUsNzcsNzcsMC4zKTsgY29sb3I6ICNmZjdhN2E7IH0KCiAgLyogQ2hlY2sgY2FyZHMgKi8KICAuY2hlY2tzLWdyaWQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfQogIC5jaGVjay1jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzOwogIH0KICAuY2hlY2stY2FyZC5lcnIgeyBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXJlZCk7IH0KICAuY2hlY2stY2FyZC53YXJuIHsgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCB2YXIoLS1hbWJlcik7IH0KICAuY2hlY2stY2FyZC5vayB7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tZ3JlZW4pOyB9CiAgLmNoZWNrLWNhcmQuc2tpcCB7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tYm9yZGVyMik7IH0KICAuY2hlY2staGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTFweCAxNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogIH0KICAuY2hlY2staWNvbiB7CiAgICB3aWR0aDogMjZweDsgaGVpZ2h0OiAyNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7IGZsZXgtc2hyaW5rOiAwOwogIH0KICAuY2ktb2sgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ncmVlbi1kaW0pOyBjb2xvcjogdmFyKC0tZ3JlZW4pOyB9CiAgLmNpLXdhcm4geyBiYWNrZ3JvdW5kOiB2YXIoLS1hbWJlci1kaW0pOyBjb2xvcjogdmFyKC0tYW1iZXIpOyB9CiAgLmNpLWVyciB7IGJhY2tncm91bmQ6IHZhcigtLXJlZC1kaW0pOyBjb2xvcjogdmFyKC0tcmVkKTsgfQogIC5jaS1za2lwIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZTIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CiAgLmNoZWNrLXRpdGxlIHsgZmxleDogMTsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tdGV4dCk7IH0KICAuY2hlY2stYmFkZ2UgewogICAgZm9udC1zaXplOiAxMHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiAxMDBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgfQogIC5jYi1vayB7IGJhY2tncm91bmQ6IHZhcigtLWdyZWVuLWRpbSk7IGNvbG9yOiB2YXIoLS1ncmVlbik7IH0KICAuY2Itd2FybiB7IGJhY2tncm91bmQ6IHZhcigtLWFtYmVyLWRpbSk7IGNvbG9yOiB2YXIoLS1hbWJlcik7IH0KICAuY2ItZXJyIHsgYmFja2dyb3VuZDogdmFyKC0tcmVkLWRpbSk7IGNvbG9yOiB2YXIoLS1yZWQpOyB9CiAgLmNiLXNraXAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlMik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0KICAudGFnIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDlweDsgcGFkZGluZzogMXB4IDdweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IG1hcmdpbi1sZWZ0OiA4cHg7IG9wYWNpdHk6IDAuNzsgfQogIC50YWctbW9iaWxlIHsgYmFja2dyb3VuZDogcmdiYSg3OSwxMjcsMjU1LDAuMTUpOyBjb2xvcjogIzdhYWRmZjsgfQogIC50YWctc2VvIHsgYmFja2dyb3VuZDogcmdiYSgzNCwyMDEsMTIyLDAuMTUpOyBjb2xvcjogIzIyYzk3YTsgfQogIC50YWctd29vIHsgYmFja2dyb3VuZDogcmdiYSgyNDUsMTY2LDM1LDAuMTUpOyBjb2xvcjogI2Y1YTYyMzsgfQogIC50YWctc2VnIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsNzcsNzcsMC4xNSk7IGNvbG9yOiAjZmY3YTdhOyB9CiAgLmNoZWNrLWJvZHkgewogICAgcGFkZGluZzogMCAxNHB4IDEycHggNTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgZGlzcGxheTogbm9uZTsKICB9CiAgLmNoZWNrLWJvZHkub3BlbiB7IGRpc3BsYXk6IGJsb2NrOyB9CgogIC8qIE1lc3NhZ2Ugc2VjdGlvbiAqLwogIC5tc2ctc2VjdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICB9CiAgLm1zZy10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UyKTsKICB9CiAgLm1zZy10b3AtbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgfQogIC5tc2ctdGl0bGUgeyBmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiB2YXIoLS10ZXh0KTsgfQogIC5jYW5hbC1iYWRnZSB7IGZvbnQtc2l6ZTogMTBweDsgcGFkZGluZzogMnB4IDlweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgfQogIC5tc2ctYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyB9CiAgLmFjdGlvbi1idG4gewogICAgcGFkZGluZzogNXB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDEwMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyMik7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgICBmb250LWZhbWlseTogJ0RNIE1vbm8nLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDVweDsKICB9CiAgLmFjdGlvbi1idG46aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9CiAgLmFjdGlvbi1idG4ucHJpbWFyeSB7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgY29sb3I6ICNmZmY7IH0KICAuYWN0aW9uLWJ0bi5wcmltYXJ5OmhvdmVyIHsgb3BhY2l0eTogMC44ODsgfQogIC5tc2ctYm9keS1hcmVhIHsKICAgIHBhZGRpbmc6IDE2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS44NTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogIH0KICAubXNnLWZvb3RlciB7CiAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgfQogIC5tc2ctd29yZGNvdW50IHsgZm9udC1zaXplOiAxMHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9CgogIC8qIFNwaW5uZXIgKi8KICAuc3Bpbm5lci1zbSB7CiAgICB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OwogICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpOwogICAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogc3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZTsKICB9CgogIC8qIFRvYXN0ICovCiAgI3RvYXN0IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsgYm90dG9tOiAyNHB4OyByaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcjIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsKICAgIHBhZGRpbmc6IDEwcHggMTZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjI1czsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogOTk5OwogIH0KICAjdG9hc3Quc2hvdyB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfQoKICAvKiBBUEkga2V5IHdhcm5pbmcgKi8KICAuYXBpLXdhcm5pbmcgewogICAgYmFja2dyb3VuZDogdmFyKC0tYW1iZXItZGltKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQ1LDE2NiwzNSwwLjMpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1hbWJlcik7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgZGlzcGxheTogbm9uZTsKICB9CgogIC8qIFNjcm9sbGJhciAqLwogIDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNHB4OyB9CiAgOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9CiAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7IGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcjIpOyBib3JkZXItcmFkaXVzOiAycHg7IH0KCiAgLyogUmVzcG9uc2l2ZSAqLwogIEBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkgewogICAgLmxheW91dCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG87IH0KICAgIC5zaWRlYmFyIHsgYm9yZGVyLXJpZ2h0OiBub25lOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgfQogICAgLnN0YXRzLXJvdyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7IH0KICB9Cjwvc3R5bGU+CjxzdHlsZSBpZD0icHJpbnQtc3R5bGUiPgpAbWVkaWEgcHJpbnQgewogIGJvZHkgPiAqOm5vdCgjcGRmLW92ZXJsYXkpIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CiAgI3BkZi1vdmVybGF5IHsgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7IH0KICBidXR0b24geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KICBAcGFnZSB7IG1hcmdpbjogMTVtbTsgfQp9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cgo8ZGl2IGNsYXNzPSJsYXlvdXQiPgoKICA8IS0tIEhFQURFUiAtLT4KICA8aGVhZGVyIGNsYXNzPSJoZWFkZXIiPgogICAgPGRpdiBjbGFzcz0iaGVhZGVyLWxvZ28iPldQIFJlcGFpciA8c3Bhbj5Qcm88L3NwYW4+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJoZWFkZXItc2VwIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImhlYWRlci1zdWIiPkF1ZGl0b3IgZGUgUHJvc3BlY3RvczwvZGl2PgogICAgPGRpdiBjbGFzcz0iaGVhZGVyLXJpZ2h0Ij4KICAgICAgPGRpdiBjbGFzcz0iYXBpLWluZGljYXRvciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG90IiBpZD0iYXBpLWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYW1iZXIpOyI+PC9kaXY+CiAgICAgICAgPHNwYW4gaWQ9ImFwaS1zdGF0dXMiPkNvbmZpZ3VyYSB0dSBBUEkga2V5PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvaGVhZGVyPgoKICA8IS0tIFNJREVCQVIgLS0+CiAgPGFzaWRlIGNsYXNzPSJzaWRlYmFyIj4KCiAgICA8ZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWxhYmVsIj5BUEkgS2V5IEFudGhyb3BpYzwvZGl2PgogICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGlkPSJhcGkta2V5IiBwbGFjZWhvbGRlcj0ic2stYW50LWFwaTAzLS4uLiIgb25pbnB1dD0iY2hlY2tBcGlLZXkoKSIgLz4KICAgICAgPGRpdiBjbGFzcz0iYXBpLXdhcm5pbmciIGlkPSJhcGktd2FybiI+SW5ncmVzYSB0dSBBUEkga2V5IGRlIEFudGhyb3BpYyBwYXJhIGdlbmVyYXIgbWVuc2FqZXMuIE9idMOpbiB1bmEgZW4gY29uc29sZS5hbnRocm9waWMuY29tPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkaXZpZGVyIj48L2Rpdj4KCiAgICA8ZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWxhYmVsIj5EYXRvcyBkZWwgcHJvc3BlY3RvPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDsiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZpZWxkLWxhYmVsIj5VUkwgZGVsIHNpdGlvPC9sYWJlbD4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6NnB4OyI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idXJsLWluIiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly9nZXJvbGFtby5jbCIgb25pbnB1dD0iZ3VhcmRhckNhbXBvcygpIiBvbmtleWRvd249ImlmKGV2ZW50LmtleT09PSdFbnRlcicpYXV0b2RldGVjdGFyKCkiIHN0eWxlPSJmbGV4OjE7IiAvPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImF1dG9kZXRlY3RhcigpIiBpZD0iYnRuLWF1dG8iIHRpdGxlPSJBdXRvZGV0ZWN0YXIgbm9tYnJlIGRlbCBuZWdvY2lvIiBzdHlsZT0icGFkZGluZzowIDEwcHg7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIyKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyk7Y29sb3I6dmFyKC0tbXV0ZWQpO2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxNnB4O2ZsZXgtc2hyaW5rOjA7dHJhbnNpdGlvbjphbGwgMC4xNXM7IiBvbm1vdXNlb3Zlcj0idGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0ndmFyKC0tYWNjZW50KSc7dGhpcy5zdHlsZS5jb2xvcj0ndmFyKC0tYWNjZW50KSciIG9ubW91c2VvdXQ9InRoaXMuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLWJvcmRlcjIpJzt0aGlzLnN0eWxlLmNvbG9yPSd2YXIoLS1tdXRlZCknIj4KICAgICAgICAgICAgICA8c3ZnIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCIvPjxwb2x5bGluZSBwb2ludHM9IjE3IDggMTIgMyA3IDgiLz48bGluZSB4MT0iMTIiIHkxPSIzIiB4Mj0iMTIiIHkyPSIxNSIvPjwvc3ZnPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBpZD0iYXV0by1zdGF0dXMiIHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXRvcDo0cHg7bWluLWhlaWdodDoxNHB4OyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZmllbGQtbGFiZWwiPk5vbWJyZSBkZWwgY29udGFjdG88L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJub21icmUtaW4iIHBsYWNlaG9sZGVyPSJDbGF1ZGlhIFRvcnJlcyIgb25pbnB1dD0iZ3VhcmRhckNhbXBvcygpIiAvPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZpZWxkLWxhYmVsIj5Ob21icmUgZGVsIG5lZ29jaW88L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJuZWdvY2lvLWluIiBwbGFjZWhvbGRlcj0iR2Vyb2xhbW8gU3BBIiBvbmlucHV0PSJndWFyZGFyQ2FtcG9zKCkiIC8+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1sYWJlbCI+Q2FuYWwgZGVsIG1lbnNhamU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FuYWwtcm93IiBpZD0iY2FuYWwtY2hpcHMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImNoaXAgb24iIGRhdGEtdj0iV2hhdHNBcHAiPldoYXRzQXBwPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2hpcCIgZGF0YS12PSJFbWFpbCI+RW1haWw8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJjaGlwIiBkYXRhLXY9IkxpbmtlZEluIj5MaW5rZWRJbjwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxidXR0b24gY2xhc3M9InNjYW4tYnRuIiBpZD0ic2Nhbi1idG4iIG9uY2xpY2s9ImluaWNpYXJBbmFsaXNpcygpIj4KICAgICAgPHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4Ii8+PHBhdGggZD0ibTIxIDIxLTQuMzUtNC4zNSIvPjwvc3ZnPgogICAgICBBbmFsaXphciB5IGdlbmVyYXIgcmVwb3J0ZQogICAgPC9idXR0b24+CiAgICA8YnV0dG9uIG9uY2xpY2s9Im51ZXZvQ2xpZW50ZSgpIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjlweDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyMik7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpO2ZvbnQtZmFtaWx5OidETSBNb25vJyxtb25vc3BhY2U7Zm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtnYXA6NnB4O3RyYW5zaXRpb246YWxsIDAuMTVzOyIgb25tb3VzZW92ZXI9InRoaXMuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLWFjY2VudCknO3RoaXMuc3R5bGUuY29sb3I9J3ZhcigtLXRleHQpJyIgb25tb3VzZW91dD0idGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0ndmFyKC0tYm9yZGVyMiknO3RoaXMuc3R5bGUuY29sb3I9J3ZhcigtLW11dGVkKSciPgogICAgICA8c3ZnIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48bGluZSB4MT0iMTIiIHkxPSI1IiB4Mj0iMTIiIHkyPSIxOSIvPjxsaW5lIHgxPSI1IiB5MT0iMTIiIHgyPSIxOSIgeTI9IjEyIi8+PC9zdmc+CiAgICAgIE51ZXZvIGNsaWVudGUKICAgIDwvYnV0dG9uPgoKICAgIDxkaXYgY2xhc3M9ImRpdmlkZXIiPjwvZGl2PgoKICAgIDxkaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tbGFiZWwiPkhpc3RvcmlhbDwvZGl2PgogICAgICA8ZGl2IGlkPSJoaXN0b3J5LWxpc3QiIHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo2cHg7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS1tdXRlZCk7Ij5Mb3MgYW7DoWxpc2lzIGFwYXJlY2Vyw6FuIGFxdcOtPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogIDwvYXNpZGU+CgogIDwhLS0gTUFJTiAtLT4KICA8bWFpbiBjbGFzcz0ibWFpbiIgaWQ9Im1haW4tYXJlYSI+CgogICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiIGlkPSJlbXB0eS1zdGF0ZSI+CiAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LWljb24iPvCflI08L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZW1wdHktdGl0bGUiPkxpc3RvIHBhcmEgYW5hbGl6YXI8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3ViIj5JbmdyZXNhIGxhIFVSTCBkZSB1biBzaXRpbyBXb3JkUHJlc3MsIGxvcyBkYXRvcyBkZWwgcHJvc3BlY3RvIHkgaGF6IGNsaWMgZW4gQW5hbGl6YXIuIEVsIHNpc3RlbWEgcmV2aXNhIDcgcHVudG9zIHTDqWNuaWNvcyB5IGdlbmVyYSB1biBtZW5zYWplIGRlIHByb3NwZWNjacOzbiBwZXJzb25hbGl6YWRvLjwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3Mtd3JhcCIgaWQ9InByb2ctd3JhcCI+CiAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLXVybCIgaWQ9InByb2ctdXJsIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icHJvZy1zdGVwcyIgaWQ9InByb2ctc3RlcHMiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0icmVzdWx0cy1hcmVhIiBzdHlsZT0iZGlzcGxheTpub25lO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MTZweDsiPgoKICAgICAgPGRpdiBjbGFzcz0ic3RhdHMtcm93IiBpZD0ic3RhdHMtcm93Ij48L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InBrZy1iYW5uZXIiIGlkPSJwa2ctYmFubmVyIj48L2Rpdj4KCiAgICAgIDxkaXYgaWQ9InNlby1zbmFwc2hvdCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvZGl2PgoKICAgICAgPGRpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWxhYmVsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OyI+UHVudG9zIGFuYWxpemFkb3M8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja3MtZ3JpZCIgaWQ9ImNoZWNrcy1saXN0Ij48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJtc2ctc2VjdGlvbiIgaWQ9Im1zZy1zZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtc2ctdG9wIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1zZy10b3AtbGVmdCI+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3R5bGU9ImNvbG9yOnZhcigtLWFjY2VudCkiPjxwYXRoIGQ9Ik0yMSAxNWEyIDIgMCAwIDEtMiAySDdsLTQgNFY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnoiLz48L3N2Zz4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1zZy10aXRsZSI+TWVuc2FqZSBkZSBwcm9zcGVjY2nDs248L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYW5hbC1iYWRnZSIgaWQ9ImNhbmFsLWJhZGdlIj5XaGF0c0FwcDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibXNnLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBvbmNsaWNrPSJyZWdlbmVyYXJNZW5zYWplKCkiPgogICAgICAgICAgICAgIDxzdmcgd2lkdGg9IjExIiBoZWlnaHQ9IjExIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwb2x5bGluZSBwb2ludHM9IjIzIDQgMjMgMTAgMTcgMTAiLz48cGF0aCBkPSJNMjAuNDkgMTVhOSA5IDAgMSAxLTIuMTItOS4zNkwyMyAxMCIvPjwvc3ZnPgogICAgICAgICAgICAgIFJlZ2VuZXJhcgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biBwcmltYXJ5IiBvbmNsaWNrPSJjb3BpYXJNZW5zYWplKCkiPgogICAgICAgICAgICAgIDxzdmcgd2lkdGg9IjExIiBoZWlnaHQ9IjExIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxyZWN0IHg9IjkiIHk9IjkiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgcng9IjIiIHJ5PSIyIi8+PHBhdGggZD0iTTUgMTVINGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg5YTIgMiAwIDAgMSAyIDJ2MSIvPjwvc3ZnPgogICAgICAgICAgICAgIENvcGlhciBtZW5zYWplCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibXNnLWJvZHktYXJlYSIgaWQ9Im1zZy1ib2R5Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtc2ctZm9vdGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJtc2ctd29yZGNvdW50IiBpZD0id29yZC1jb3VudCI+PC9zcGFuPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biIgb25jbGljaz0iYWJyaXJDb3JyZW8oKSIgaWQ9ImJ0bi1lbWFpbCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICA8c3ZnIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNNCA0aDE2YzEuMSAwIDIgLjkgMiAydjEyYzAgMS4xLS45IDItMiAySDRjLTEuMSAwLTItLjktMi0yVjZjMC0xLjEuOS0yIDItMnoiLz48cG9seWxpbmUgcG9pbnRzPSIyMiw2IDEyLDEzIDIsNiIvPjwvc3ZnPgogICAgICAgICAgICBBYnJpciBlbiBjb3JyZW8KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biIgb25jbGljaz0iYWJyaXJXaGF0c0FwcCgpIiBpZD0iYnRuLXdhIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjExIiBoZWlnaHQ9IjExIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0yMSAxMS41YTguMzggOC4zOCAwIDAgMS0uOSAzLjggOC41IDguNSAwIDAgMS03LjYgNC43IDguMzggOC4zOCAwIDAgMS0zLjgtLjlMMyAyMWwxLjktNS43YTguMzggOC4zOCAwIDAgMS0uOS0zLjggOC41IDguNSAwIDAgMSA0LjctNy42IDguMzggOC4zOCAwIDAgMSAzLjgtLjloLjVhOC40OCA4LjQ4IDAgMCAxIDggOHYuNXoiLz48L3N2Zz4KICAgICAgICAgICAgQWJyaXIgZW4gV2hhdHNBcHAKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biIgb25jbGljaz0iZGVzY2FyZ2FyUERGKCkiIHN0eWxlPSJib3JkZXItY29sb3I6cmdiYSgyNTUsNzcsNzcsMC4zKTtjb2xvcjojZmY3YTdhOyI+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjExIiBoZWlnaHQ9IjExIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0xNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOHoiLz48cG9seWxpbmUgcG9pbnRzPSIxNCAyIDE0IDggMjAgOCIvPjxsaW5lIHgxPSIxMiIgeTE9IjE4IiB4Mj0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSI5IiB5MT0iMTUiIHgyPSIxNSIgeTI9IjE1Ii8+PC9zdmc+CiAgICAgICAgICAgIERlc2NhcmdhciBQREYKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICA8L2Rpdj4KCiAgPC9tYWluPgo8L2Rpdj4KCjxkaXYgaWQ9InRvYXN0Ij48L2Rpdj4KCjxzY3JpcHQ+CmNvbnN0IFBBR0VTUEVFRF9LRVkgPSAnQUl6YVN5RDZkVlBNcVFQTXhtT0E5VnhIa3pFeG1MYk4yWUhfSjZBJzsKbGV0IGNhbmFsID0gJ1doYXRzQXBwJzsKbGV0IGhpc3RvcnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3cHJfaGlzdG9yeScpIHx8ICdbXScpOwpsZXQgbGFzdENoZWNrcyA9IFtdOwpsZXQgbGFzdFVybCA9ICcnOwpsZXQgbGFzdE5vbWJyZSA9ICcnOwpsZXQgbGFzdE5lZ29jaW8gPSAnJzsKCi8vIENhbmFsIGNoaXBzCmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYW5hbC1jaGlwcyAuY2hpcCcpLmZvckVhY2goYyA9PiB7CiAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYW5hbC1jaGlwcyAuY2hpcCcpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC5yZW1vdmUoJ29uJykpOwogICAgYy5jbGFzc0xpc3QuYWRkKCdvbicpOwogICAgY2FuYWwgPSBjLmRhdGFzZXQudjsKICAgIGd1YXJkYXJDYW1wb3MoKTsKICB9KTsKfSk7CgpmdW5jdGlvbiBjaGVja0FwaUtleSgpIHsKICBjb25zdCBrZXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBpLWtleScpLnZhbHVlLnRyaW0oKTsKICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBpLWRvdCcpOwogIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGktc3RhdHVzJyk7CiAgY29uc3Qgd2FybiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGktd2FybicpOwogIGlmIChrZXkuc3RhcnRzV2l0aCgnc2stYW50JykpIHsKICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWdyZWVuKSc7CiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQVBJIGNvbmVjdGFkYSc7CiAgICB3YXJuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgfSBlbHNlIHsKICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFtYmVyKSc7CiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnQVBJIGtleSByZXF1ZXJpZGEnOwogICAgd2Fybi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICB9Cn0KCmZ1bmN0aW9uIHRvYXN0KG1zZykgewogIGNvbnN0IHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9hc3QnKTsKICB0LnRleHRDb250ZW50ID0gbXNnOwogIHQuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogIHNldFRpbWVvdXQoKCkgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JyksIDI1MDApOwp9CgpmdW5jdGlvbiBzZXRTdGVwU3RhdGUoc3RlcHMsIGlkeCwgc3RhdGUpIHsKICBjb25zdCBpY29ucyA9IHsgZG9uZTogJ+KckycsIHJ1bm5pbmc6ICfihrsnLCBwZW5kaW5nOiAnwrcnIH07CiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC0nICsgaWR4KTsKICBpZiAoIWVsKSByZXR1cm47CiAgZWwucXVlcnlTZWxlY3RvcignLnN0ZXAtaWNvbicpLmNsYXNzTmFtZSA9ICdzdGVwLWljb24gJyArIHN0YXRlOwogIGVsLnF1ZXJ5U2VsZWN0b3IoJy5zdGVwLWljb24nKS50ZXh0Q29udGVudCA9IGljb25zW3N0YXRlXTsKICBlbC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1sYWJlbCcpLmNsYXNzTmFtZSA9ICdzdGVwLWxhYmVsJyArIChzdGF0ZSA9PT0gJ3BlbmRpbmcnID8gJyBwZW5kaW5nJyA6ICcnKTsKfQoKY29uc3QgU1RFUFMgPSBbCiAgJ0NvbnN1bHRhbmRvIFBhZ2VTcGVlZCBBUEkgKG1vYmlsZSkuLi4nLAogICdBbmFsaXphbmRvIEhUTUwgeSBtZXRhZGF0b3MuLi4nLAogICdEZXRlY3RhbmRvIFNjaGVtYSwgb2c6aW1hZ2UsIHRlbMOpZm9uby4uLicsCiAgJ0V2YWx1YW5kbyBXb29Db21tZXJjZSB5IHNlZ3VyaWRhZC4uLicsCiAgJ1ZlcmlmaWNhbmRvIGluZGV4YWNpw7NuIEdvb2dsZSwgc2l0ZW1hcCB5IHJvYm90cy50eHQuLi4nLAogICdDYWxjdWxhbmRvIHBhcXVldGUgcmVjb21lbmRhZG8uLi4nLAogICdHZW5lcmFuZG8gbWVuc2FqZSBjb24gSUEuLi4nCl07Cgphc3luYyBmdW5jdGlvbiBpbmljaWFyQW5hbGlzaXMoKSB7CiAgbGV0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS52YWx1ZS50cmltKCk7CiAgaWYgKCF1cmwpIHsgdG9hc3QoJ0luZ3Jlc2EgdW5hIFVSTCBwYXJhIGFuYWxpemFyJyk7IHJldHVybjsgfQogIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGkta2V5JykudmFsdWUudHJpbSgpOwogIGlmICghYXBpS2V5LnN0YXJ0c1dpdGgoJ3NrLWFudCcpKSB7IHRvYXN0KCdJbmdyZXNhIHR1IEFQSSBrZXkgZGUgQW50aHJvcGljIHByaW1lcm8nKTsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaS13YXJuJykuc3R5bGUuZGlzcGxheT0nYmxvY2snOyByZXR1cm47IH0KICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwJykpIHVybCA9ICdodHRwczovLycgKyB1cmw7CgogIGxhc3RVcmwgPSB1cmw7CiAgbGFzdE5vbWJyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub21icmUtaW4nKS52YWx1ZS50cmltKCkgfHwgJ2VsIGVxdWlwbyc7CiAgbGFzdE5lZ29jaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVnb2Npby1pbicpLnZhbHVlLnRyaW0oKSB8fCBuZXcgVVJMKHVybCkuaG9zdG5hbWUucmVwbGFjZSgnd3d3LicsICcnKTsKCiAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjYW4tYnRuJyk7CiAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICBidG4uaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InNwaW5uZXItc20iPjwvZGl2PiBBbmFsaXphbmRvLi4uJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1wdHktc3RhdGUnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzLWFyZWEnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW8tc25hcHNob3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGNvbnN0IHB3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2ctd3JhcCcpOwogIHB3LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9nLXVybCcpLnRleHRDb250ZW50ID0gJ+KGkiAnICsgdXJsOwoKICBjb25zdCBzdGVwc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2ctc3RlcHMnKTsKICBzdGVwc0VsLmlubmVySFRNTCA9IFNURVBTLm1hcCgocywgaSkgPT4gYAogICAgPGRpdiBjbGFzcz0icHJvZy1zdGVwLWl0ZW0iIGlkPSJzdGVwLSR7aX0iPgogICAgICA8ZGl2IGNsYXNzPSJzdGVwLWljb24gcGVuZGluZyI+wrc8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic3RlcC1sYWJlbCBwZW5kaW5nIj4ke3N9PC9kaXY+CiAgICA8L2Rpdj5gKS5qb2luKCcnKTsKCiAgY29uc3QgY2hlY2tzID0gW107CiAgbGV0IHRpdGxlTWF0Y2gsIHRpdGxlVGFnLCB0aXRsZU9rLCB0aXRsZUdlbmVyaWMsIG1ldGFNYXRjaCwgbWV0YURlc2MsIG1ldGFPazsKICBsZXQgaGFzU2l0ZW1hcCA9IGZhbHNlLCBzaXRlbWFwVXJsID0gJyc7CiAgbGV0IHJvYm90c1R4dCA9ICcnLCByb2JvdHNPayA9IGZhbHNlLCByb2JvdHNCbG9ja2luZyA9IGZhbHNlOwogIGxldCBpbmRleFNpZ25hbCA9IG51bGw7CgogIC8vIFN0ZXAgMDogUGFnZVNwZWVkCiAgc2V0U3RlcFN0YXRlKFNURVBTLCAwLCAncnVubmluZycpOwogIGxldCBsY3AgPSBudWxsLCBzY29yZSA9IG51bGw7CiAgdHJ5IHsKICAgIGNvbnN0IHBzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3BhZ2VzcGVlZG9ubGluZS92NS9ydW5QYWdlc3BlZWQ\/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9JnN0cmF0ZWd5PW1vYmlsZSZrZXk9JHtQQUdFU1BFRURfS0VZfWApOwogICAgY29uc3QgcHNkID0gYXdhaXQgcHMuanNvbigpOwogICAgc2NvcmUgPSBNYXRoLnJvdW5kKChwc2QubGlnaHRob3VzZVJlc3VsdD8uY2F0ZWdvcmllcz8ucGVyZm9ybWFuY2U\/LnNjb3JlIHx8IDApICogMTAwKTsKICAgIGNvbnN0IGF1ZGl0cyA9IHBzZC5saWdodGhvdXNlUmVzdWx0Py5hdWRpdHM7CiAgICBsY3AgPSBhdWRpdHM\/LlsnbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50J10\/LmRpc3BsYXlWYWx1ZSB8fCBudWxsOwogICAgY29uc3QgZmNwID0gYXVkaXRzPy5bJ2ZpcnN0LWNvbnRlbnRmdWwtcGFpbnQnXT8uZGlzcGxheVZhbHVlIHx8ICfigJQnOwogICAgY29uc3QgY2xzID0gYXVkaXRzPy5bJ2N1bXVsYXRpdmUtbGF5b3V0LXNoaWZ0J10\/LmRpc3BsYXlWYWx1ZSB8fCAn4oCUJzsKICAgIGNvbnN0IHRidCA9IGF1ZGl0cz8uWyd0b3RhbC1ibG9ja2luZy10aW1lJ10\/LmRpc3BsYXlWYWx1ZSB8fCAn4oCUJzsKICAgIGNvbnN0IGxjcE51bSA9IHBhcnNlRmxvYXQoKGxjcCB8fCAnOTknKS5yZXBsYWNlKC9bXjAtOS5dL2csICcnKSk7CiAgICBjaGVja3MucHVzaCh7CiAgICAgIGtleTogJ2xjcCcsIHRpdGxlOiAnVmVsb2NpZGFkIGRlIGNhcmdhIG1vYmlsZSAoTENQKScsIHRhZzogJ3RhZy1tb2JpbGUnLCB0YWdMYWJlbDogJ01vYmlsZScsCiAgICAgIHN0YXR1czogbGNwTnVtIDw9IDIuNSA\/ICdvaycgOiBsY3BOdW0gPD0gNCA\/ICd3YXJuJyA6ICdlcnInLAogICAgICBkZXRhaWw6IGBMQ1A6ICR7bGNwIHx8ICdObyBkaXNwb25pYmxlJ30gwrcgRkNQOiAke2ZjcH0gwrcgQ0xTOiAke2Nsc30gwrcgVEJUOiAke3RidH0gwrcgU2NvcmUgbW9iaWxlOiAke3Njb3JlfS8xMDBgLAogICAgICBwcm9ibGVtYTogbGNwTnVtID4gMi41ID8gYGVsIHNpdGlvIGNhcmdhIGVuICR7bGNwfSBlbiBtb2JpbGUg4oCUIEdvb2dsZSBwZW5hbGl6YSBzaXRpb3MgY29uIExDUCA+Mi41cyB5IGxvcyB1c3VhcmlvcyBhYmFuZG9uYW5gIDogbnVsbAogICAgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgY2hlY2tzLnB1c2goeyBrZXk6ICdsY3AnLCB0aXRsZTogJ1ZlbG9jaWRhZCBkZSBjYXJnYSBtb2JpbGUgKExDUCknLCB0YWc6ICd0YWctbW9iaWxlJywgdGFnTGFiZWw6ICdNb2JpbGUnLCBzdGF0dXM6ICdza2lwJywgZGV0YWlsOiAnTm8gc2UgcHVkbyBjb25zdWx0YXIgUGFnZVNwZWVkLiBWZXJpZmljYXIgZW4gcGFnZXNwZWVkLndlYi5kZXYgbWFudWFsbWVudGUuJywgcHJvYmxlbWE6IG51bGwgfSk7CiAgfQogIHNldFN0ZXBTdGF0ZShTVEVQUywgMCwgJ2RvbmUnKTsKCiAgLy8gU3RlcCAxLTI6IEhUTUwgYW5hbHlzaXMKICBzZXRTdGVwU3RhdGUoU1RFUFMsIDEsICdydW5uaW5nJyk7CiAgbGV0IGJvZHkgPSAnJzsKICB0cnkgewogICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5hbGxvcmlnaW5zLndpbi9nZXQ\/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YCk7CiAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7CiAgICBib2R5ID0gZC5jb250ZW50cyB8fCAnJzsKICB9IGNhdGNoIChlKSB7IGJvZHkgPSAnJzsgfQogIHNldFN0ZXBTdGF0ZShTVEVQUywgMSwgJ2RvbmUnKTsKCiAgc2V0U3RlcFN0YXRlKFNURVBTLCAyLCAncnVubmluZycpOwoKICAvLyBTY2hlbWEKICBjb25zdCBoYXNTY2hlbWEgPSAvYXBwbGljYXRpb25cL2xkXCtqc29ufGl0ZW10eXBlLipzY2hlbWFcLm9yZy9pLnRlc3QoYm9keSk7CiAgY29uc3Qgc2NoZW1hVHlwZXMgPSBbXTsKICBpZiAoL0xvY2FsQnVzaW5lc3MvaS50ZXN0KGJvZHkpKSBzY2hlbWFUeXBlcy5wdXNoKCdMb2NhbEJ1c2luZXNzJyk7CiAgaWYgKC9Qcm9kdWN0W15zXS9pLnRlc3QoYm9keSkpIHNjaGVtYVR5cGVzLnB1c2goJ1Byb2R1Y3QnKTsKICBpZiAoL0ZBUVBhZ2UvaS50ZXN0KGJvZHkpKSBzY2hlbWFUeXBlcy5wdXNoKCdGQVFQYWdlJyk7CiAgaWYgKC9Pcmdhbml6YXRpb24vaS50ZXN0KGJvZHkpKSBzY2hlbWFUeXBlcy5wdXNoKCdPcmdhbml6YXRpb24nKTsKICBjaGVja3MucHVzaCh7CiAgICBrZXk6ICdzY2hlbWEnLCB0aXRsZTogJ1NjaGVtYSBtYXJrdXAgYWN0aXZvJywgdGFnOiAndGFnLXNlbycsIHRhZ0xhYmVsOiAnU0VPJywKICAgIHN0YXR1czogIWhhc1NjaGVtYSA\/ICdlcnInIDogc2NoZW1hVHlwZXMubGVuZ3RoID49IDIgPyAnb2snIDogJ3dhcm4nLAogICAgZGV0YWlsOiBoYXNTY2hlbWEgPyBgU2NoZW1hIGRldGVjdGFkbzogJHtzY2hlbWFUeXBlcy5sZW5ndGggPiAwID8gc2NoZW1hVHlwZXMuam9pbignLCAnKSA6ICd0aXBvIG5vIGlkZW50aWZpY2Fkbyd9LiBWYWxpZGFyIGVuIHNlYXJjaC5nb29nbGUuY29tL3Rlc3QvcmljaC1yZXN1bHRzLmAgOiAnTm8gc2UgZGV0ZWN0w7MgU2NoZW1hIG1hcmt1cCAoSlNPTi1MRCkgZW4gZWwgc2l0aW8uJywKICAgIHByb2JsZW1hOiAhaGFzU2NoZW1hID8gJ25vIHRpZW5lIFNjaGVtYSBtYXJrdXAg4oCUIHNpbiByaWNoIHNuaXBwZXRzIHBvc2libGVzIGVuIEdvb2dsZSAoUHJvZHVjdCwgTG9jYWxCdXNpbmVzcywgRkFRKScgOiBzY2hlbWFUeXBlcy5sZW5ndGggPCAyID8gYFNjaGVtYSBsaW1pdGFkbyAoJHtzY2hlbWFUeXBlcy5qb2luKCcsICcpIHx8ICdiw6FzaWNvJ30pIOKAlCBmYWx0YW4gdGlwb3MgY2xhdmUgcGFyYSBtw6F4aW1hIHZpc2liaWxpZGFkYCA6IG51bGwKICB9KTsKCiAgLy8gb2c6aW1hZ2UKICBjb25zdCBoYXNPZyA9IC9vZzppbWFnZS9pLnRlc3QoYm9keSk7CiAgY29uc3Qgb2dVcmwgPSAoYm9keS5tYXRjaCgvb2c6aW1hZ2VbXj5dKmNvbnRlbnQ9WyInXShbXiInXSspL2kpIHx8IGJvZHkubWF0Y2goL2NvbnRlbnQ9WyInXShbXiInXSspWyInXVtePl0qb2c6aW1hZ2UvaSkgfHwgW10pWzFdIHx8IG51bGw7CiAgY29uc3QgZ2VuZXJpY09nID0gb2dVcmwgJiYgL2xvZ298ZGVmYXVsdHxwbGFjZWhvbGRlcnxpY29uL2kudGVzdChvZ1VybCk7CiAgY2hlY2tzLnB1c2goewogICAga2V5OiAnb2cnLCB0aXRsZTogJ29nOmltYWdlIGNvbmZpZ3VyYWRhJywgdGFnOiAndGFnLXNlbycsIHRhZ0xhYmVsOiAnU0VPJywKICAgIHN0YXR1czogIWhhc09nID8gJ2VycicgOiBnZW5lcmljT2cgPyAnd2FybicgOiAnb2snLAogICAgZGV0YWlsOiBoYXNPZyA\/IGBvZzppbWFnZTogJHtvZ1VybCA\/IG9nVXJsLnN1YnN0cmluZygwLCA3MCkgKyAnLi4uJyA6ICdVUkwgZGV0ZWN0YWRhJ30ke2dlbmVyaWNPZyA\/ICcgKHB1ZWRlIHNlciBnZW7DqXJpY2EpJyA6ICcnfWAgOiAnTm8gc2UgZGV0ZWN0w7Mgb2c6aW1hZ2Ug4oCUIGVsIHNpdGlvIGFwYXJlY2Ugc2luIGltYWdlbiBhbCBjb21wYXJ0aXIgZW4gcmVkZXMgc29jaWFsZXMuJywKICAgIHByb2JsZW1hOiAhaGFzT2cgPyAnc2luIG9nOmltYWdlIGNvbmZpZ3VyYWRhIOKAlCBhc3BlY3RvIHNpbiBpbWFnZW4gYWwgY29tcGFydGlyIGVuIFdoYXRzQXBwLCByZWRlcyB5IGNvcnJlbycgOiBnZW5lcmljT2cgPyAnbGEgb2c6aW1hZ2UgcGFyZWNlIHNlciBlbCBsb2dvIGdlbsOpcmljbywgbm8gdW5hIGltYWdlbiBhdHJhY3RpdmEgZGVsIG5lZ29jaW8nIDogbnVsbAogIH0pOwoKICAvLyBUZWzDqWZvbm8geSBXaGF0c0FwcAogIGNvbnN0IGhhc1RlbCA9IC9ocmVmPVsiJ110ZWw6L2kudGVzdChib2R5KTsKICBjb25zdCBoYXNXQSA9IC93YVwubWV8YXBpXC53aGF0c2FwcHx3aGF0c2FwcFwuY29tL2kudGVzdChib2R5KTsKICBjaGVja3MucHVzaCh7CiAgICBrZXk6ICd0ZWwnLCB0aXRsZTogJ1RlbMOpZm9ubyB5IFdoYXRzQXBwIGNsaWNrZWFibGVzJywgdGFnOiAndGFnLW1vYmlsZScsIHRhZ0xhYmVsOiAnTW9iaWxlJywKICAgIHN0YXR1czogaGFzVGVsICYmIGhhc1dBID8gJ29rJyA6IGhhc1RlbCB8fCBoYXNXQSA\/ICd3YXJuJyA6ICdlcnInLAogICAgZGV0YWlsOiBgVGVsw6lmb25vIChocmVmPXRlbDopOiAke2hhc1RlbCA\/ICfinJMgRGV0ZWN0YWRvJyA6ICfinJcgTm8gZW5jb250cmFkbyd9IMK3IFdoYXRzQXBwOiAke2hhc1dBID8gJ+KckyBEZXRlY3RhZG8nIDogJ+KclyBObyBlbmNvbnRyYWRvJ31gLAogICAgcHJvYmxlbWE6ICFoYXNUZWwgJiYgIWhhc1dBID8gJ2VsIHRlbMOpZm9ubyB5IFdoYXRzQXBwIG5vIHNvbiBjbGlja2VhYmxlcyDigJQgZGVzZGUgbW9iaWxlIGVsIHVzdWFyaW8gbm8gcHVlZGUgY29udGFjdGFyIGNvbiB1biB0b3F1ZScgOiAhaGFzVGVsID8gJ2VsIHRlbMOpZm9ubyBubyB0aWVuZSBocmVmPXRlbDog4oCUIG5vIGVzIGNsaWNrZWFibGUgZW4gbW9iaWxlJyA6ICFoYXNXQSA\/ICdubyBoYXkgYm90w7NuIGRlIFdoYXRzQXBwIHZpc2libGUgZW4gZWwgc2l0aW8nIDogbnVsbAogIH0pOwogIHNldFN0ZXBTdGF0ZShTVEVQUywgMiwgJ2RvbmUnKTsKCiAgLy8gU3RlcCAzOiBXb29Db21tZXJjZSArIFNlZ3VyaWRhZAogIHNldFN0ZXBTdGF0ZShTVEVQUywgMywgJ3J1bm5pbmcnKTsKCiAgY29uc3QgaXNXb28gPSAvd29vY29tbWVyY2V8XC9zaG9wXC98XC90aWVuZGFcLy9pLnRlc3QoYm9keSk7CiAgY2hlY2tzLnB1c2goewogICAga2V5OiAnd29vJywgdGl0bGU6ICdXb29Db21tZXJjZSB5IGNhdGVnb3LDrWFzIFNFTycsIHRhZzogJ3RhZy13b28nLCB0YWdMYWJlbDogJ1dvb0NvbW1lcmNlJywKICAgIHN0YXR1czogaXNXb28gPyAnd2FybicgOiAnc2tpcCcsCiAgICBkZXRhaWw6IGlzV29vID8gJ1dvb0NvbW1lcmNlIGRldGVjdGFkby4gVmVyaWZpY2FyIG1hbnVhbG1lbnRlOiBzbHVncyBkZSBjYXRlZ29yw61hIGxpbXBpb3MgKC90aWVuZGEvY2F0ZWdvcmlhLyB2cyAvcHJvZHVjdC1jYXRlZ29yeS9jYXQxLykgeSBwcmVjaW9zIGNvbnNpc3RlbnRlcyBlbiBsaXN0YWRvIHZzIHByb2R1Y3RvLicgOiAnV29vQ29tbWVyY2Ugbm8gZGV0ZWN0YWRvIOKAlCBwdWVkZSBzZXIgdW4gc2l0aW8gZGUgc2VydmljaW9zIG8gcmVxdWllcmUgYWNjZXNvIGF1dGVudGljYWRvLicsCiAgICBwcm9ibGVtYTogaXNXb28gPyAnbGFzIGNhdGVnb3LDrWFzIGRlIFdvb0NvbW1lcmNlIHJlcXVpZXJlbiB2ZXJpZmljYWNpw7NuIG1hbnVhbCBkZSBlc3RydWN0dXJhIFNFTyAoc2x1Z3MgeSBjb25zaXN0ZW5jaWEgZGUgcHJlY2lvcyknIDogbnVsbAogIH0pOwoKICBjb25zdCBoYXNXUEdlbiA9IC9nZW5lcmF0b3JbXj5dKldvcmRQcmVzc3xXb3JkUHJlc3NbXj5dKmdlbmVyYXRvci9pLnRlc3QoYm9keSk7CiAgY29uc3Qgd3BWID0gKGJvZHkubWF0Y2goL1dvcmRQcmVzc1xzKihbXGQuXSspL2kpIHx8IFtdKVsxXSB8fCAnJzsKICBjaGVja3MucHVzaCh7CiAgICBrZXk6ICdzZWcnLCB0aXRsZTogJ1ZlcnNpw7NuIFdvcmRQcmVzcyBubyBleHB1ZXN0YScsIHRhZzogJ3RhZy1zZWcnLCB0YWdMYWJlbDogJ1NlZ3VyaWRhZCcsCiAgICBzdGF0dXM6IGhhc1dQR2VuID8gJ2VycicgOiAnb2snLAogICAgZGV0YWlsOiBoYXNXUEdlbiA\/IGBXb3JkUHJlc3MgJHt3cFYgfHwgJ3ZlcnNpw7NuJ30gdmlzaWJsZSBlbiBlbCBjw7NkaWdvIGZ1ZW50ZSDigJQgZmFjaWxpdGEgYXRhcXVlcyBkaXJpZ2lkb3MuYCA6ICdMYSB2ZXJzacOzbiBkZSBXb3JkUHJlc3Mgbm8gZXMgdmlzaWJsZSBlbiBlbCBjw7NkaWdvIGZ1ZW50ZS4gQ29ycmVjdG8uJywKICAgIHByb2JsZW1hOiBoYXNXUEdlbiA\/IGBsYSB2ZXJzacOzbiBkZSBXb3JkUHJlc3MgKCR7d3BWIHx8ICdleHB1ZXN0YSd9KSBhcGFyZWNlIGVuIGVsIGPDs2RpZ28gZnVlbnRlLCBmYWNpbGl0YW5kbyBhdGFxdWVzIGF1dG9tYXRpemFkb3NgIDogbnVsbAogIH0pOwogIHNldFN0ZXBTdGF0ZShTVEVQUywgMywgJ2RvbmUnKTsKCiAgbGFzdENoZWNrcyA9IGNoZWNrczsKCiAgLy8gU3RlcCA0OiBJbmRleGFjacOzbiBHb29nbGUsIHNpdGVtYXAsIHJvYm90cywgdGl0bGUvbWV0YQogIHNldFN0ZXBTdGF0ZShTVEVQUywgNCwgJ3J1bm5pbmcnKTsKCiAgLy8gVGl0bGUgdGFnCiAgdGl0bGVNYXRjaCA9IGJvZHkubWF0Y2goLzx0aXRsZVtePl0qPihbXjxdezEsMTIwfSk8XC90aXRsZT4vaSk7CiAgdGl0bGVUYWcgPSB0aXRsZU1hdGNoID8gdGl0bGVNYXRjaFsxXS50cmltKCkgOiBudWxsOwogIHRpdGxlT2sgPSB0aXRsZVRhZyAmJiB0aXRsZVRhZy5sZW5ndGggPj0gMzAgJiYgdGl0bGVUYWcubGVuZ3RoIDw9IDcwOwogIHRpdGxlR2VuZXJpYyA9IHRpdGxlVGFnICYmIC9qdXN0IGFub3RoZXJ8d29yZHByZXNzfGhvbWV8aW5pY2lvfGJpZW52ZW5pZG8vaS50ZXN0KHRpdGxlVGFnKTsKCiAgLy8gTWV0YSBkZXNjcmlwdGlvbgogIG1ldGFNYXRjaCA9IGJvZHkubWF0Y2goL25hbWU9WyInXWRlc2NyaXB0aW9uWyInXVtePl0qY29udGVudD1bIiddKFteIiddezEsMzAwfSlbIiddL2kpCiAgICB8fCBib2R5Lm1hdGNoKC9jb250ZW50PVsiJ10oW14iJ117MSwzMDB9KVsiJ11bXj5dKm5hbWU9WyInXWRlc2NyaXB0aW9uWyInXS9pKTsKICBtZXRhRGVzYyA9IG1ldGFNYXRjaCA\/IG1ldGFNYXRjaFsxXS50cmltKCkgOiBudWxsOwogIG1ldGFPayA9IG1ldGFEZXNjICYmIG1ldGFEZXNjLmxlbmd0aCA+PSAxMDAgJiYgbWV0YURlc2MubGVuZ3RoIDw9IDE2MDsKCiAgY2hlY2tzLnB1c2goewogICAga2V5OiAndGl0bGUnLCB0aXRsZTogJ1RpdGxlIHRhZyB5IG1ldGEgZGVzY3JpcHRpb24nLCB0YWc6ICd0YWctc2VvJywgdGFnTGFiZWw6ICdTRU8nLAogICAgc3RhdHVzOiAoIXRpdGxlVGFnIHx8IHRpdGxlR2VuZXJpYyB8fCAhbWV0YURlc2MpID8gJ2VycicgOiAoIXRpdGxlT2sgfHwgIW1ldGFPaykgPyAnd2FybicgOiAnb2snLAogICAgZGV0YWlsOiBbCiAgICAgIGBUaXRsZTogJHt0aXRsZVRhZyA\/IGAiJHt0aXRsZVRhZy5zdWJzdHJpbmcoMCw2MCl9JHt0aXRsZVRhZy5sZW5ndGg+NjA\/Jy4uLic6Jyd9IiAoJHt0aXRsZVRhZy5sZW5ndGh9IGNhcmFjdGVyZXMpYCA6ICdObyBkZXRlY3RhZG8nfWAsCiAgICAgIGBNZXRhIGRlc2NyaXB0aW9uOiAke21ldGFEZXNjID8gYCIke21ldGFEZXNjLnN1YnN0cmluZygwLDgwKX0uLi4iICgke21ldGFEZXNjLmxlbmd0aH0gY2FyYWN0ZXJlcylgIDogJ05vIGRldGVjdGFkYSd9YCwKICAgICAgIXRpdGxlT2sgJiYgdGl0bGVUYWcgPyBgVGl0bGUgJHt0aXRsZVRhZy5sZW5ndGggPCAzMCA\/ICdkZW1hc2lhZG8gY29ydG8gKG3DrW4gMzApJyA6ICdkZW1hc2lhZG8gbGFyZ28gKG3DoXggNzApJ30uYCA6ICcnLAogICAgICAhbWV0YU9rICYmIG1ldGFEZXNjID8gYE1ldGEgZGVzY3JpcHRpb24gJHttZXRhRGVzYy5sZW5ndGggPCAxMDAgPyAnZGVtYXNpYWRvIGNvcnRhIChtw61uIDEwMCknIDogJ2RlbWFzaWFkbyBsYXJnYSAobcOheCAxNjApJ30uYCA6ICcnCiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyksCiAgICBwcm9ibGVtYTogIXRpdGxlVGFnID8gJ25vIHRpZW5lIHRpdGxlIHRhZyDigJQgR29vZ2xlIG5vIHNhYmUgZGUgcXXDqSB0cmF0YSBlbCBzaXRpbycKICAgICAgOiB0aXRsZUdlbmVyaWMgPyBgZWwgdGl0bGUgZXMgZ2Vuw6lyaWNvICgiJHt0aXRsZVRhZy5zdWJzdHJpbmcoMCw0MCl9Iikg4oCUIG5vIGFwYXJlY2UgZW4gYsO6c3F1ZWRhcyByZWxldmFudGVzYAogICAgICA6ICFtZXRhRGVzYyA\/ICdzaW4gbWV0YSBkZXNjcmlwdGlvbiDigJQgR29vZ2xlIGdlbmVyYSB1bmEgYWxlYXRvcmlhIHF1ZSByZWR1Y2UgZWwgQ1RSJwogICAgICA6ICghdGl0bGVPayB8fCAhbWV0YU9rKSA\/ICd0aXRsZSBvIG1ldGEgZGVzY3JpcHRpb24gZnVlcmEgZGVsIHJhbmdvIMOzcHRpbW8gcGFyYSBHb29nbGUg4oCUIGFmZWN0YSBDVFIgZW4gU0VSUCcKICAgICAgOiBudWxsCiAgfSk7CgogIC8vIFNpdGVtYXAKICBoYXNTaXRlbWFwID0gZmFsc2U7IHNpdGVtYXBVcmwgPSAnJzsKICB0cnkgewogICAgY29uc3Qgc2l0ZW1hcFRyeSA9IFtgJHt1cmwucmVwbGFjZSgvXC8kLywgJycpfS9zaXRlbWFwLnhtbGAsIGAke3VybC5yZXBsYWNlKC9cLyQvLCAnJyl9L3NpdGVtYXBfaW5kZXgueG1sYF07CiAgICBmb3IgKGNvbnN0IHNtIG9mIHNpdGVtYXBUcnkpIHsKICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5hbGxvcmlnaW5zLndpbi9nZXQ\/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNtKX1gKTsKICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpOwogICAgICBpZiAoZC5jb250ZW50cyAmJiBkLmNvbnRlbnRzLmluY2x1ZGVzKCc8dXJsc2V0JykgfHwgZC5jb250ZW50cyAmJiBkLmNvbnRlbnRzLmluY2x1ZGVzKCc8c2l0ZW1hcGluZGV4JykpIHsKICAgICAgICBoYXNTaXRlbWFwID0gdHJ1ZTsgc2l0ZW1hcFVybCA9IHNtOyBicmVhazsKICAgICAgfQogICAgfQogIH0gY2F0Y2ggKGUpIHsgaGFzU2l0ZW1hcCA9IGZhbHNlOyB9CgogIGNoZWNrcy5wdXNoKHsKICAgIGtleTogJ3NpdGVtYXAnLCB0aXRsZTogJ1NpdGVtYXAgWE1MIGRpc3BvbmlibGUnLCB0YWc6ICd0YWctc2VvJywgdGFnTGFiZWw6ICdTRU8nLAogICAgc3RhdHVzOiBoYXNTaXRlbWFwID8gJ29rJyA6ICdlcnInLAogICAgZGV0YWlsOiBoYXNTaXRlbWFwID8gYFNpdGVtYXAgZW5jb250cmFkbyBlbiAke3NpdGVtYXBVcmx9IOKAlCBHb29nbGUgcHVlZGUgcmFzdHJlYXIgdG9kYXMgbGFzIFVSTHMgZGVsIHNpdGlvLmAgOiAnTm8gc2UgZGV0ZWN0w7Mgc2l0ZW1hcC54bWwgbmkgc2l0ZW1hcF9pbmRleC54bWwg4oCUIEdvb2dsZSBkZXNjdWJyZSBsYXMgcMOhZ2luYXMgcG9yIHJhc3RyZW8gbWFudWFsLCBtw6FzIGxlbnRvIGUgaW5jb21wbGV0by4nLAogICAgcHJvYmxlbWE6ICFoYXNTaXRlbWFwID8gJ3NpbiBzaXRlbWFwLnhtbCDigJQgR29vZ2xlIG5vIHRpZW5lIHVuIG1hcGEgZGUgdG9kYXMgbGFzIHDDoWdpbmFzIGRlbCBzaXRpbywgcGVyZGllbmRvIGluZGV4YWNpw7NuIGRlIHByb2R1Y3RvIHkgY2F0ZWdvcsOtYXMnIDogbnVsbAogIH0pOwoKICAvLyBSb2JvdHMudHh0CiAgcm9ib3RzVHh0ID0gJyc7IHJvYm90c09rID0gZmFsc2U7IHJvYm90c0Jsb2NraW5nID0gZmFsc2U7CiAgdHJ5IHsKICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuYWxsb3JpZ2lucy53aW4vZ2V0P3VybD0ke2VuY29kZVVSSUNvbXBvbmVudCh1cmwucmVwbGFjZSgvXC8kLywgJycpICsgJy9yb2JvdHMudHh0Jyl9YCk7CiAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7CiAgICByb2JvdHNUeHQgPSBkLmNvbnRlbnRzIHx8ICcnOwogICAgcm9ib3RzT2sgPSByb2JvdHNUeHQuaW5jbHVkZXMoJ1VzZXItYWdlbnQnKTsKICAgIHJvYm90c0Jsb2NraW5nID0gL2Rpc2FsbG93OlxzKlwvL2kudGVzdChyb2JvdHNUeHQpICYmICEvZGlzYWxsb3c6XHMqXC93cC1hZG1pbi9pLnRlc3Qocm9ib3RzVHh0KTsKICB9IGNhdGNoIChlKSB7IHJvYm90c09rID0gZmFsc2U7IH0KCiAgY2hlY2tzLnB1c2goewogICAga2V5OiAncm9ib3RzJywgdGl0bGU6ICdSb2JvdHMudHh0IGNvbmZpZ3VyYWRvJywgdGFnOiAndGFnLXNlbycsIHRhZ0xhYmVsOiAnU0VPJywKICAgIHN0YXR1czogIXJvYm90c09rID8gJ3dhcm4nIDogcm9ib3RzQmxvY2tpbmcgPyAnZXJyJyA6ICdvaycsCiAgICBkZXRhaWw6IHJvYm90c09rCiAgICAgID8gYHJvYm90cy50eHQgZGV0ZWN0YWRvLiAke3JvYm90c0Jsb2NraW5nID8gJ+KaoCBQb3NpYmxlIGJsb3F1ZW8gZGUgaW5kZXhhY2nDs24gKERpc2FsbG93OiAvKSDigJQgdmVyaWZpY2FyIG1hbnVhbG1lbnRlLicgOiAnU2luIGJsb3F1ZW9zIGV2aWRlbnRlcyBkZSBpbmRleGFjacOzbi4nfSAke3JvYm90c1R4dC5pbmNsdWRlcygnU2l0ZW1hcDonKSA\/ICdTaXRlbWFwIGRlY2xhcmFkbyBlbiByb2JvdHMudHh0LicgOiAnU2l0ZW1hcCBubyBkZWNsYXJhZG8gZW4gcm9ib3RzLnR4dC4nfWAKICAgICAgOiAnTm8gc2UgZGV0ZWN0w7Mgcm9ib3RzLnR4dCDigJQgR29vZ2xlIG5vIHRpZW5lIGluc3RydWNjaW9uZXMgZGUgcmFzdHJlbyBwYXJhIGVsIHNpdGlvLicsCiAgICBwcm9ibGVtYTogIXJvYm90c09rID8gJ3NpbiByb2JvdHMudHh0IOKAlCBHb29nbGUgcmFzdHJlYSBzaW4gaW5zdHJ1Y2Npb25lcywgcHVlZGUgaW5kZXhhciBww6FnaW5hcyBubyBkZXNlYWRhcyAod3AtYWRtaW4sIGNoZWNrb3V0LCBldGMuKScKICAgICAgOiByb2JvdHNCbG9ja2luZyA\/ICdyb2JvdHMudHh0IHB1ZWRlIGVzdGFyIGJsb3F1ZWFuZG8gbGEgaW5kZXhhY2nDs24gZGVsIHNpdGlvIGNvbXBsZXRvIOKAlCB2ZXJpZmljYXIgdXJnZW50ZScKICAgICAgOiBudWxsCiAgfSk7CgogIC8vIEdvb2dsZSBpbmRleGluZyBzaWduYWwgKHZpYSBhbGxvcmlnaW5zIHNpdGU6IHNlYXJjaCDigJQgbGltaXRlZCBidXQgZnJlZSkKICBpbmRleFNpZ25hbCA9IG51bGw7CiAgdHJ5IHsKICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuYWxsb3JpZ2lucy53aW4vZ2V0P3VybD0ke2VuY29kZVVSSUNvbXBvbmVudCgnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g\/cT1zaXRlOicgKyBuZXcgVVJMKHVybCkuaG9zdG5hbWUpfWApOwogICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpOwogICAgY29uc3QgYyA9IGQuY29udGVudHMgfHwgJyc7CiAgICBjb25zdCBub1Jlc3VsdHMgPSAvbm9ccytyZXN1bHR8bm8gc2VccytlbmNvbnRyfGRpZCBub3QgbWF0Y2gvaS50ZXN0KGMpOwogICAgY29uc3QgaGFzUmVzdWx0cyA9IC9BcHJveGltYWRhbWVudGV8QWJvdXRccytcZHxyZXN1bHRhZG9zL2kudGVzdChjKTsKICAgIGNvbnN0IGNvdW50TWF0Y2ggPSBjLm1hdGNoKC9BcHJveGltYWRhbWVudGVccysoW1xkLC5dKylccytyZXN1bHRhZG8vaSkgfHwgYy5tYXRjaCgvQWJvdXRccysoW1xkLF0rKVxzK3Jlc3VsdC9pKTsKICAgIGluZGV4U2lnbmFsID0geyBub1Jlc3VsdHMsIGhhc1Jlc3VsdHMsIGNvdW50OiBjb3VudE1hdGNoID8gY291bnRNYXRjaFsxXSA6IG51bGwgfTsKICB9IGNhdGNoIChlKSB7IGluZGV4U2lnbmFsID0gbnVsbDsgfQoKICBjaGVja3MucHVzaCh7CiAgICBrZXk6ICdpbmRleCcsIHRpdGxlOiAnU2XDsWFsIGRlIGluZGV4YWNpw7NuIGVuIEdvb2dsZScsIHRhZzogJ3RhZy1zZW8nLCB0YWdMYWJlbDogJ1NFTycsCiAgICBzdGF0dXM6ICFpbmRleFNpZ25hbCA\/ICdza2lwJyA6IGluZGV4U2lnbmFsLm5vUmVzdWx0cyA\/ICdlcnInIDogaW5kZXhTaWduYWwuaGFzUmVzdWx0cyA\/ICdvaycgOiAnd2FybicsCiAgICBkZXRhaWw6ICFpbmRleFNpZ25hbCA\/ICdObyBzZSBwdWRvIGNvbnN1bHRhciBHb29nbGUuIFZlcmlmaWNhciBtYW51YWxtZW50ZSBjb246IHNpdGU6ZG9taW5pby5jbCBlbiBHb29nbGUuJwogICAgICA6IGluZGV4U2lnbmFsLm5vUmVzdWx0cyA\/ICdHb29nbGUgbm8gZGV2dWVsdmUgcmVzdWx0YWRvcyBwYXJhIHNpdGU6ZG9taW5pbyDigJQgZWwgc2l0aW8gcHVlZGUgbm8gZXN0YXIgaW5kZXhhZG8gbyB0ZW5lciBibG9xdWVvIGFjdGl2by4nCiAgICAgIDogaW5kZXhTaWduYWwuaGFzUmVzdWx0cyA\/IGBHb29nbGUgaW5kZXhhIHDDoWdpbmFzIGRlbCBkb21pbmlvJHtpbmRleFNpZ25hbC5jb3VudCA\/IGAgKGFwcm94LiAke2luZGV4U2lnbmFsLmNvdW50fSByZXN1bHRhZG9zKWAgOiAnJ30uIENhbnRpZGFkIGV4YWN0YSB2ZXJpZmljYXIgZW4gR29vZ2xlIFNlYXJjaCBDb25zb2xlLmAKICAgICAgOiAnU2XDsWFsIGRlIGluZGV4YWNpw7NuIG5vIGNvbmNsdXllbnRlLiBWZXJpZmljYXIgY29uIHNpdGU6ZG9taW5pby5jbCBkaXJlY3RhbWVudGUgZW4gR29vZ2xlLicsCiAgICBwcm9ibGVtYTogaW5kZXhTaWduYWw\/Lm5vUmVzdWx0cyA\/ICdubyBhcGFyZWNlIGVuIEdvb2dsZSAoc2l0ZTogbm8gZGV2dWVsdmUgcmVzdWx0YWRvcykg4oCUIGVsIHNpdGlvIGVzdMOhIGludmlzaWJsZSBwYXJhIGLDunNxdWVkYXMgb3Jnw6FuaWNhcycgOiBudWxsCiAgfSk7CgogIHNldFN0ZXBTdGF0ZShTVEVQUywgNCwgJ2RvbmUnKTsKCiAgbGFzdENoZWNrcyA9IGNoZWNrczsKCiAgLy8gU3RlcCA1OiBQYWNrYWdlCiAgc2V0U3RlcFN0YXRlKFNURVBTLCA1LCAncnVubmluZycpOwogIGNvbnN0IGVycnMgPSBjaGVja3MuZmlsdGVyKGMgPT4gYy5zdGF0dXMgPT09ICdlcnInKTsKICBjb25zdCB3YXJucyA9IGNoZWNrcy5maWx0ZXIoYyA9PiBjLnN0YXR1cyA9PT0gJ3dhcm4nKTsKICBjb25zdCBva3MgPSBjaGVja3MuZmlsdGVyKGMgPT4gYy5zdGF0dXMgPT09ICdvaycpOwogIGxldCBwa2csIHBrZ0NsYXNzOwogIGlmIChlcnJzLmxlbmd0aCA+PSA0KSB7IHBrZyA9ICdFbGl0ZSDigJQgZGVzZGUgVVNEIDIuOTkwJzsgcGtnQ2xhc3MgPSAncGtnLWVsaXRlJzsgfQogIGVsc2UgaWYgKGVycnMubGVuZ3RoID49IDMgfHwgKGVycnMubGVuZ3RoID49IDIgJiYgd2FybnMubGVuZ3RoID49IDIpKSB7IHBrZyA9ICdTY2FsZSDigJQgZGVzZGUgVVNEIDEuODkwJzsgcGtnQ2xhc3MgPSAncGtnLXNjYWxlJzsgfQogIGVsc2UgaWYgKGVycnMubGVuZ3RoID49IDIpIHsgcGtnID0gJ0dyb3d0aCDigJQgZGVzZGUgVVNEIDk5MCc7IHBrZ0NsYXNzID0gJ3BrZy1ncm93dGgnOyB9CiAgZWxzZSB7IHBrZyA9ICdTdGFydGVyIOKAlCBkZXNkZSBVU0QgNDkwJzsgcGtnQ2xhc3MgPSAncGtnLXN0YXJ0ZXInOyB9CiAgc2V0U3RlcFN0YXRlKFNURVBTLCA1LCAnZG9uZScpOwoKICAvLyBTdGVwIDY6IEFJIG1lc3NhZ2UKICBzZXRTdGVwU3RhdGUoU1RFUFMsIDYsICdydW5uaW5nJyk7CiAgY29uc3QgbXNnVGV4dCA9IGF3YWl0IGdlbmVyYXJNZW5zYWplSUEoY2hlY2tzLCB1cmwsIGxhc3ROb21icmUsIGxhc3ROZWdvY2lvLCBjYW5hbCwgYXBpS2V5KTsKICBzZXRTdGVwU3RhdGUoU1RFUFMsIDYsICdkb25lJyk7CgogIHB3LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogIC8vIFJlbmRlciBzdGF0cwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1yb3cnKS5pbm5lckhUTUwgPSBgCiAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0YXQtbnVtIG51bS1hY2NlbnQiPiR7Y2hlY2tzLmxlbmd0aH08L2Rpdj48ZGl2IGNsYXNzPSJzdGF0LWxibCI+UHVudG9zIHJldmlzYWRvczwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNsYXNzPSJzdGF0LW51bSBudW0tcmVkIj4ke2VycnMubGVuZ3RofTwvZGl2PjxkaXYgY2xhc3M9InN0YXQtbGJsIj5Qcm9ibGVtYXMgZ3JhdmVzPC9kaXY+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0YXQtbnVtIiBzdHlsZT0iY29sb3I6dmFyKC0tYW1iZXIpOyI+JHt3YXJucy5sZW5ndGh9PC9kaXY+PGRpdiBjbGFzcz0ic3RhdC1sYmwiPkFkdmVydGVuY2lhczwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNsYXNzPSJzdGF0LW51bSBudW0tZ3JlZW4iPiR7b2tzLmxlbmd0aH08L2Rpdj48ZGl2IGNsYXNzPSJzdGF0LWxibCI+U2luIHByb2JsZW1hPC9kaXY+PC9kaXY+CiAgYDsKCiAgLy8gUGFja2FnZSBiYW5uZXIKICBjb25zdCBwYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwa2ctYmFubmVyJyk7CiAgcGIuY2xhc3NOYW1lID0gJ3BrZy1iYW5uZXIgJyArIHBrZ0NsYXNzOwogIHBiLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6Ii8+PC9zdmc+IFBhcXVldGUgcmVjb21lbmRhZG86IDxzdHJvbmc+JHtwa2d9PC9zdHJvbmc+IMK3ICR7ZXJycy5sZW5ndGh9IHByb2JsZW1hKHMpIGdyYXZlKHMpIMK3ICR7d2FybnMubGVuZ3RofSBhZHZlcnRlbmNpYShzKWA7CgogIC8vIFNFTyBWaXNpYmlsaXR5IHNuYXBzaG90CiAgY29uc3QgdGl0bGVDaGsgPSBjaGVja3MuZmluZChjID0+IGMua2V5ID09PSAndGl0bGUnKTsKICBjb25zdCBzaXRlbWFwQ2hrID0gY2hlY2tzLmZpbmQoYyA9PiBjLmtleSA9PT0gJ3NpdGVtYXAnKTsKICBjb25zdCByb2JvdHNDaGsgPSBjaGVja3MuZmluZChjID0+IGMua2V5ID09PSAncm9ib3RzJyk7CiAgY29uc3QgaW5kZXhDaGsgPSBjaGVja3MuZmluZChjID0+IGMua2V5ID09PSAnaW5kZXgnKTsKCiAgY29uc3Qgc25hcHNob3RDb2xvciA9IHsgb2s6ICd2YXIoLS1ncmVlbiknLCB3YXJuOiAndmFyKC0tYW1iZXIpJywgZXJyOiAndmFyKC0tcmVkKScsIHNraXA6ICd2YXIoLS1tdXRlZCknIH07CiAgY29uc3Qgc25hcHNob3RJY29uID0geyBvazogJ+KckycsIHdhcm46ICchJywgZXJyOiAn4pyXJywgc2tpcDogJ+KAlCcgfTsKCiAgY29uc3QgdGl0bGVUYWdEaXNwbGF5ID0gdGl0bGVNYXRjaCA\/IGAiJHt0aXRsZVRhZy5zdWJzdHJpbmcoMCw1NSl9JHt0aXRsZVRhZy5sZW5ndGg+NTU\/J+KApic6Jyd9ImAgOiAnTm8gZGV0ZWN0YWRvJzsKICBjb25zdCBtZXRhRGlzcGxheSA9IG1ldGFEZXNjID8gYCIke21ldGFEZXNjLnN1YnN0cmluZygwLDcwKX3igKYiICgke21ldGFEZXNjLmxlbmd0aH0gY2FyLilgIDogJ05vIGRldGVjdGFkYSc7CgogIGNvbnN0IHNuYXBzaG90SHRtbCA9IGAKICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cy1sZyk7b3ZlcmZsb3c6aGlkZGVuOyI+CiAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOjExcHggMTZweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZTIpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDsiPgogICAgICA8c3ZnIHdpZHRoPSIxMyIgaGVpZ2h0PSIxMyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9InZhcigtLWFjY2VudCkiIHN0cm9rZS13aWR0aD0iMiI+PGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iOCIvPjxwYXRoIGQ9Im0yMSAyMS00LjM1LTQuMzUiLz48L3N2Zz4KICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjp2YXIoLS10ZXh0KTsiPlZpc2liaWxpZGFkIFNFTyDigJQgcmVzdW1lbjwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBzdHlsZT0icGFkZGluZzoxNHB4IDE2cHg7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDoxMnB4OyI+CiAgICAgIDxkaXYgc3R5bGU9ImdyaWQtY29sdW1uOjEvLTE7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDdlbTttYXJnaW4tYm90dG9tOjRweDsiPlRpdGxlIHRhZyBhY3R1YWw8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjoke3RpdGxlVGFnICYmICF0aXRsZUdlbmVyaWMgPyAndmFyKC0tdGV4dCknIDogJ3ZhcigtLXJlZCknfTtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UyKTtwYWRkaW5nOjdweCAxMHB4O2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcjIpOyI+JHt0aXRsZVRhZ0Rpc3BsYXl9PC9kaXY+CiAgICAgICAgJHt0aXRsZVRhZyA\/IGA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXRvcDozcHg7Ij4ke3RpdGxlVGFnLmxlbmd0aH0gY2FyYWN0ZXJlcyDCtyDDs3B0aW1vOiAzMOKAkzcwPC9kaXY+YCA6ICcnfQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iZ3JpZC1jb2x1bW46MS8tMTsiPgogICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOnZhcigtLW11dGVkKTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4wN2VtO21hcmdpbi1ib3R0b206NHB4OyI+TWV0YSBkZXNjcmlwdGlvbiBhY3R1YWw8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjoke21ldGFEZXNjICYmIG1ldGFPayA\/ICd2YXIoLS10ZXh0KScgOiAndmFyKC0tYW1iZXIpJ307YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7cGFkZGluZzo3cHggMTBweDtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIyKTsiPiR7bWV0YURpc3BsYXl9PC9kaXY+CiAgICAgICAgJHttZXRhRGVzYyA\/IGA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXRvcDozcHg7Ij4ke21ldGFEZXNjLmxlbmd0aH0gY2FyYWN0ZXJlcyDCtyDDs3B0aW1vOiAxMDDigJMxNjA8L2Rpdj5gIDogJyd9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7cGFkZGluZzo4cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UyKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIyKTsiPgogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjoke3NuYXBzaG90Q29sb3Jbc2l0ZW1hcENoaz8uc3RhdHVzfHwnc2tpcCddfTtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo1MDA7Ij4ke3NuYXBzaG90SWNvbltzaXRlbWFwQ2hrPy5zdGF0dXN8fCdza2lwJ119PC9zcGFuPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10ZXh0KTsiPlNpdGVtYXAgWE1MPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7Ij4ke2hhc1NpdGVtYXAgPyBzaXRlbWFwVXJsLnNwbGl0KCcvJykucG9wKCkgOiAnTm8gZGV0ZWN0YWRvJ308L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtwYWRkaW5nOjhweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZTIpO2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcjIpOyI+CiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiR7c25hcHNob3RDb2xvcltyb2JvdHNDaGs\/LnN0YXR1c3x8J3NraXAnXX07Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NTAwOyI+JHtzbmFwc2hvdEljb25bcm9ib3RzQ2hrPy5zdGF0dXN8fCdza2lwJ119PC9zcGFuPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10ZXh0KTsiPlJvYm90cy50eHQ8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOnZhcigtLW11dGVkKTsiPiR7cm9ib3RzT2sgPyAocm9ib3RzQmxvY2tpbmcgPyAnUG9zaWJsZSBibG9xdWVvIGFjdGl2bycgOiAnU2luIGJsb3F1ZW9zIGRldGVjdGFkb3MnKSA6ICdObyBlbmNvbnRyYWRvJ308L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc3R5bGU9ImdyaWQtY29sdW1uOjEvLTE7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O3BhZGRpbmc6OHB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyMik7Ij4KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6JHtzbmFwc2hvdENvbG9yW2luZGV4Q2hrPy5zdGF0dXN8fCdza2lwJ119O2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjUwMDsiPiR7c25hcHNob3RJY29uW2luZGV4Q2hrPy5zdGF0dXN8fCdza2lwJ119PC9zcGFuPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10ZXh0KTsiPlNlw7FhbCBpbmRleGFjacOzbiBHb29nbGU8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOnZhcigtLW11dGVkKTsiPiR7aW5kZXhTaWduYWw\/Lm5vUmVzdWx0cyA\/ICdTaW4gcmVzdWx0YWRvcyBlbiBzaXRlOiDigJQgcG9zaWJsZW1lbnRlIG5vIGluZGV4YWRvJyA6IGluZGV4U2lnbmFsPy5oYXNSZXN1bHRzID8gYEluZGV4YWRvJHtpbmRleFNpZ25hbC5jb3VudCA\/ICcgwrcgYXByb3guICcraW5kZXhTaWduYWwuY291bnQrJyBww6FnaW5hcycgOiAnJ31gIDogJ05vIGNvbmNsdXllbnRlIOKAlCB2ZXJpZmljYXIgbWFudWFsbWVudGUnfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9c2l0ZToke25ldyBVUkwodXJsKS5ob3N0bmFtZX0iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0ibWFyZ2luLWxlZnQ6YXV0bztmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS1hY2NlbnQpO3RleHQtZGVjb3JhdGlvbjpub25lO3doaXRlLXNwYWNlOm5vd3JhcDsiPlZlcmlmaWNhciDihpI8L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+YDsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlby1zbmFwc2hvdCcpLmlubmVySFRNTCA9IHNuYXBzaG90SHRtbDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VvLXNuYXBzaG90Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgogIC8vIENoZWNrcyBsaXN0CiAgY29uc3QgaWNvbk1hcCA9IHsgb2s6ICfinJMnLCB3YXJuOiAnIScsIGVycjogJ+KclycsIHNraXA6ICfigJQnIH07CiAgY29uc3QgaWNvbkNscyA9IHsgb2s6ICdjaS1vaycsIHdhcm46ICdjaS13YXJuJywgZXJyOiAnY2ktZXJyJywgc2tpcDogJ2NpLXNraXAnIH07CiAgY29uc3QgYmFkZ2VDbHMgPSB7IG9rOiAnY2Itb2snLCB3YXJuOiAnY2Itd2FybicsIGVycjogJ2NiLWVycicsIHNraXA6ICdjYi1za2lwJyB9OwogIGNvbnN0IGJhZGdlTGJsID0geyBvazogJ09LJywgd2FybjogJ0FkdmVydGVuY2lhJywgZXJyOiAnUHJvYmxlbWEgZ3JhdmUnLCBza2lwOiAnTWFudWFsJyB9OwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hlY2tzLWxpc3QnKS5pbm5lckhUTUwgPSBjaGVja3MubWFwKChjLCBpKSA9PiBgCiAgICA8ZGl2IGNsYXNzPSJjaGVjay1jYXJkICR7Yy5zdGF0dXN9IiBvbmNsaWNrPSJ0b2dnbGVDaGVjaygke2l9KSI+CiAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWhlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2staWNvbiAke2ljb25DbHNbYy5zdGF0dXNdfSI+JHtpY29uTWFwW2Muc3RhdHVzXX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay10aXRsZSI+JHtjLnRpdGxlfTxzcGFuIGNsYXNzPSJ0YWcgJHtjLnRhZ30iPiR7Yy50YWdMYWJlbH08L3NwYW4+PC9kaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrLWJhZGdlICR7YmFkZ2VDbHNbYy5zdGF0dXNdfSI+JHtiYWRnZUxibFtjLnN0YXR1c119PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2hlY2stYm9keSIgaWQ9ImNiLSR7aX0iPiR7Yy5kZXRhaWx9PC9kaXY+CiAgICA8L2Rpdj4KICBgKS5qb2luKCcnKTsKCiAgLy8gTWVzc2FnZQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5hbC1iYWRnZScpLnRleHRDb250ZW50ID0gY2FuYWw7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZy1ib2R5JykudGV4dENvbnRlbnQgPSBtc2dUZXh0OwogIGNvbnN0IHdvcmRzID0gbXNnVGV4dC50cmltKCkuc3BsaXQoL1xzKy8pLmxlbmd0aDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd29yZC1jb3VudCcpLnRleHRDb250ZW50ID0gYCR7d29yZHN9IHBhbGFicmFzIMK3ICR7bXNnVGV4dC5sZW5ndGh9IGNhcmFjdGVyZXNgOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLWVtYWlsJykuc3R5bGUuZGlzcGxheSA9IGNhbmFsID09PSAnRW1haWwnID8gJ2ZsZXgnIDogJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4td2EnKS5zdHlsZS5kaXNwbGF5ID0gY2FuYWwgPT09ICdXaGF0c0FwcCcgPyAnZmxleCcgOiAnbm9uZSc7CgogIGNvbnN0IHJhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMtYXJlYScpOwogIHJhLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CgogIC8vIEhpc3RvcnkKICBjb25zdCBlbnRyeSA9IHsgdXJsLCBub21icmU6IGxhc3ROb21icmUsIG5lZ29jaW86IGxhc3ROZWdvY2lvLCBjYW5hbCwgZXJyQ291bnQ6IGVycnMubGVuZ3RoLCB3YXJuQ291bnQ6IHdhcm5zLmxlbmd0aCwgb2tDb3VudDogb2tzLmxlbmd0aCwgdHM6IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCdlcy1DTCcsIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KSwgbXNnOiBtc2dUZXh0LCBjaGVja3M6IGxhc3RDaGVja3MgfTsKICBoaXN0b3J5LnVuc2hpZnQoZW50cnkpOwogIGlmIChoaXN0b3J5Lmxlbmd0aCA+IDIwKSBoaXN0b3J5LnBvcCgpOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3cHJfaGlzdG9yeScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnkpKTsKICByZW5kZXJIaXN0b3J5KCk7CgogIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogIGJ0bi5pbm5lckhUTUwgPSAnPHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4Ii8+PHBhdGggZD0ibTIxIDIxLTQuMzUtNC4zNSIvPjwvc3ZnPiBBbmFsaXphciB5IGdlbmVyYXIgcmVwb3J0ZSc7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXJNZW5zYWplSUEoY2hlY2tzLCB1cmwsIG5vbWJyZSwgbmVnb2NpbywgY2FuYWwsIGFwaUtleSkgewogIGNvbnN0IGNhbmFsSW5zdHIgPSB7CiAgICAnV2hhdHNBcHAnOiAnbcOheGltbyAxMDAgcGFsYWJyYXMsIHRvbm8gZGlyZWN0byB5IGNlcmNhbm8sIHR1dGVvIG5hdHVyYWwsIHNpbiBhc3VudG8sIHNpbiBzYWx1ZG9zIGdlbsOpcmljb3MnLAogICAgJ0VtYWlsJzogJ23DoXhpbW8gMTUwIHBhbGFicmFzLCBpbmNsdXllIGFsIGluaWNpbyAiQXN1bnRvOiBbdGV4dG8gaW1wYWN0YW50ZV0iLCB0b25vIHByb2Zlc2lvbmFsIGRpcmVjdG8nLAogICAgJ0xpbmtlZEluJzogJ23DoXhpbW8gMTIwIHBhbGFicmFzLCB0b25vIHByb2Zlc2lvbmFsLCBzaW4gdHV0ZW8sIHNpbiBhc3VudG8nCiAgfTsKICBjb25zdCBwcm9ibGVtYXMgPSBjaGVja3MuZmlsdGVyKGMgPT4gYy5wcm9ibGVtYSk7CiAgY29uc3QgcHJvYmxlbWFzVGV4dG8gPSBwcm9ibGVtYXMubGVuZ3RoID4gMAogICAgPyBwcm9ibGVtYXMubWFwKHAgPT4gYC0gJHtwLnByb2JsZW1hfWApLmpvaW4oJ1xuJykKICAgIDogJy0gZWwgc2l0aW8gcGFyZWNlIHNpbiBlcnJvcmVzIGdyYXZlcywgcGVybyBoYXkgb3BvcnR1bmlkYWRlcyBkZSBvcHRpbWl6YWNpw7NuIFNFTyB5IGNvbnZlcnNpw7NuJzsKCiAgLy8g4pSA4pSAIFRvcCAzIGVycm9yZXMgY3LDrXRpY29zIHBhcmEgbWVuc2FqZSB5IFBERiDilIDilIAKICBjb25zdCB0b3AzID0gY2hlY2tzCiAgICAuZmlsdGVyKGMgPT4gYy5zdGF0dXMgPT09ICdlcnInIHx8IGMuc3RhdHVzID09PSAnd2FybicpCiAgICAuc2xpY2UoMCwgMyk7CiAgY29uc3QgdG9wM1RleHRvID0gdG9wMy5sZW5ndGggPiAwCiAgICA\/IHRvcDMubWFwKChwLCBpKSA9PiBgJHtpKzF9LiAke3AucHJvYmxlbWEgfHwgcC50aXRsZX06ICR7cC5kZXRhaWx9YCkuam9pbignXG4nKQogICAgOiAnMS4gVmVsb2NpZGFkIGNyw610aWNhIGVuIG1vYmlsZSDigJQgY2xpZW50ZXMgYWJhbmRvbmFuIGFudGVzIGRlIHZlciBwcmVjaW9zXG4yLiBTaW4gc2NoZW1hIGRlIG5lZ29jaW8g4oCUIEdvb2dsZSBubyBzYWJlIHF1w6kgb2ZyZWNlc1xuMy4gSW3DoWdlbmVzIHNpbiBvcHRpbWl6YXIg4oCUIHDDqXJkaWRhIGRpcmVjdGEgZGUgY29udmVyc2nDs24nOwogIHdpbmRvdy5fbGFzdFRvcDMgPSB0b3AzOwoKICBjb25zdCBwcm9tcHQgPSBgRXJlcyB1biBjb3B5d3JpdGVyIEIyQiBleHBlcnRvIGVuIHZlbnRhcyBkZSBzZXJ2aWNpb3MgV29yZFByZXNzIHBhcmEgZWwgbWVyY2FkbyBjaGlsZW5vLiBFc2NyaWJlcyBtZW5zYWplcyBkaXJlY3RvcyBxdWUgc3VlbmFuIGh1bWFub3MuIE5VTkNBIHVzZXMgImVzcGVybyBxdWUgZXN0w6lzIGJpZW4iLCAibWUgcG9uZ28gZW4gY29udGFjdG8iIG5pIGZyYXNlcyBnZW7DqXJpY2FzLgoKRXNjcmliZSBVTiBtZW5zYWplIGRlIHByb3NwZWNjacOzbiBwYXJhOgotIENhbmFsOiAke2NhbmFsfSAoJHtjYW5hbEluc3RyW2NhbmFsXX0pCi0gQ29udGFjdG86ICR7bm9tYnJlfQotIE5lZ29jaW8vc2l0aW86ICR7bmVnb2Npb30gKCR7dXJsfSkKCkRldGVjdGFtb3MgZXN0YXMgMyBmdWdhcyBkZSBjb252ZXJzacOzbiBlbiBzdSBzaXRpbzoKJHt0b3AzVGV4dG99CgpFc3RydWN0dXJhIG9ibGlnYXRvcmlhOgoxLiBBYnJlIGRpcmVjdG8gY29uIHVuYSBvYnNlcnZhY2nDs24gZXNwZWPDrWZpY2EgZGVsIHNpdGlvIGRlICR7bmVnb2Npb30g4oCUIG5hZGEgZ2Vuw6lyaWNvCjIuIE5vbWJyYSBsYXMgMyBmdWdhcyBlbiBsZW5ndWFqZSBkZSBORUdPQ0lPIChubyB0w6ljbmljbyk6IHF1w6kgZGluZXJvIG8gY2xpZW50ZXMgZXN0w6EgcGVyZGllbmRvIEhPWS4gRWplbXBsbzogbm8gIkxDUCBhbHRvIiBzaW5vICJsb3MgY2xpZW50ZXMgYWJhbmRvbmFuIGFudGVzIGRlIHZlciBzdXMgcHJlY2lvcyIKMy4gUHJlc2VudGEgV1AgUmVwYWlyIFBybyBlbiAyIGzDrW5lYXM6IGF1ZGl0b3LDrWEgKyByZXBhcmFjacOzbiBXb3JkUHJlc3MgY29uIGV2aWRlbmNpYSB0w6ljbmljYS4gQ2FzbyByZWFsIEdsb2JhbEtsaW1hLmNsOiAxNDcgZXJyb3JlcyBlbGltaW5hZG9zLCBkZSAxNiBhIDQzKyBVUkxzIGluZGV4YWRhcywgKzIyJSBjb252ZXJzacOzbiBtb2JpbGUKNC4gQ1RBIGRlIGJham8gY29tcHJvbWlzbzogZGlhZ27Ds3N0aWNvIGdyYXR1aXRvIGNvbiBpbmZvcm1lIHTDqWNuaWNvIGVzY3JpdG8gYWRqdW50bwoKRW50cmVnYSBTT0xPIGVsIG1lbnNhamUgbGlzdG8gcGFyYSBlbnZpYXIuIFNpbiBleHBsaWNhY2lvbmVzLCBzaW4gY29taWxsYXMgZW52b2x2ZW50ZXMuYDsKCiAgdHJ5IHsKICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ3gtYXBpLWtleSc6IGFwaUtleSwgJ2FudGhyb3BpYy12ZXJzaW9uJzogJzIwMjMtMDYtMDEnLCAnYW50aHJvcGljLWRhbmdlcm91cy1kaXJlY3QtYnJvd3Nlci1hY2Nlc3MnOiAndHJ1ZScgfSwKICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtb2RlbDogJ2NsYXVkZS1zb25uZXQtNC0yMDI1MDUxNCcsIG1heF90b2tlbnM6IDEwMDAsIG1lc3NhZ2VzOiBbeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9XSB9KQogICAgfSk7CiAgICBjb25zdCBkID0gYXdhaXQgcmVzcC5qc29uKCk7CiAgICByZXR1cm4gZC5jb250ZW50Py5maW5kKGIgPT4gYi50eXBlID09PSAndGV4dCcpPy50ZXh0IHx8ICdFcnJvciBhbCBnZW5lcmFyIGVsIG1lbnNhamUuIFZlcmlmaWNhIHR1IEFQSSBrZXkuJzsKICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gJ0Vycm9yIGRlIGNvbmV4acOzbiBjb24gbGEgQVBJIGRlIENsYXVkZS4gVmVyaWZpY2EgdHUgQVBJIGtleSB5IGNvbmV4acOzbiBhIGludGVybmV0Lic7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiByZWdlbmVyYXJNZW5zYWplKCkgewogIGlmICghbGFzdFVybCkgcmV0dXJuOwogIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGkta2V5JykudmFsdWUudHJpbSgpOwogIGNvbnN0IG1iID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZy1ib2R5Jyk7CiAgbWIudGV4dENvbnRlbnQgPSAnR2VuZXJhbmRvIG51ZXZvIG1lbnNhamUuLi4nOwogIGNvbnN0IG1zZyA9IGF3YWl0IGdlbmVyYXJNZW5zYWplSUEobGFzdENoZWNrcywgbGFzdFVybCwgbGFzdE5vbWJyZSwgbGFzdE5lZ29jaW8sIGNhbmFsLCBhcGlLZXkpOwogIG1iLnRleHRDb250ZW50ID0gbXNnOwogIGNvbnN0IHdvcmRzID0gbXNnLnRyaW0oKS5zcGxpdCgvXHMrLykubGVuZ3RoOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3b3JkLWNvdW50JykudGV4dENvbnRlbnQgPSBgJHt3b3Jkc30gcGFsYWJyYXMgwrcgJHttc2cubGVuZ3RofSBjYXJhY3RlcmVzYDsKICB0b2FzdCgnTWVuc2FqZSByZWdlbmVyYWRvJyk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZUNoZWNrKGkpIHsKICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYi0nICsgaSk7CiAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpOwp9CgpmdW5jdGlvbiBjb3BpYXJNZW5zYWplKCkgewogIGNvbnN0IHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnLWJvZHknKS50ZXh0Q29udGVudDsKICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0KS50aGVuKCgpID0+IHRvYXN0KCdNZW5zYWplIGNvcGlhZG8gYWwgcG9ydGFwYXBlbGVzIOKckycpKTsKfQoKZnVuY3Rpb24gYWJyaXJDb3JyZW8oKSB7CiAgY29uc3QgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZy1ib2R5JykudGV4dENvbnRlbnQ7CiAgY29uc3QgbGluZXMgPSBtc2cuc3BsaXQoJ1xuJyk7CiAgY29uc3Qgc3ViamVjdCA9IGxpbmVzWzBdLnJlcGxhY2UoL15Bc3VudG86XHMqL2ksICcnKS50cmltKCk7CiAgY29uc3QgYm9keSA9IGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xuJykudHJpbSgpOwogIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYG1haWx0bzo\/c3ViamVjdD0ke2VuY29kZVVSSUNvbXBvbmVudChzdWJqZWN0KX0mYm9keT0ke2VuY29kZVVSSUNvbXBvbmVudChib2R5KX1gOwp9CgpmdW5jdGlvbiBhYnJpcldoYXRzQXBwKCkgewogIGNvbnN0IG1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc2ctYm9keScpLnRleHRDb250ZW50OwogIHdpbmRvdy5vcGVuKGBodHRwczovL3dhLm1lLz90ZXh0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KG1zZyl9YCwgJ19ibGFuaycpOwp9CgpmdW5jdGlvbiByZW5kZXJIaXN0b3J5KCkgewogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcnktbGlzdCcpOwogIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkgewogICAgZWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2NvbG9yOnZhcigtLW11dGVkKTsiPkxvcyBhbsOhbGlzaXMgYXBhcmVjZXLDoW4gYXF1w608L2Rpdj4nOwogICAgcmV0dXJuOwogIH0KICBlbC5pbm5lckhUTUwgPSBoaXN0b3J5LnNsaWNlKDAsIDgpLm1hcCgoaCwgaSkgPT4gYAogICAgPGRpdiBjbGFzcz0iaGlzdG9yeS1pdGVtIiBvbmNsaWNrPSJjYXJnYXJIaXN0b3JpYWwoJHtpfSkiPgogICAgICA8ZGl2IGNsYXNzPSJoaXN0b3J5LWRvbWFpbiI+JHtoLm5lZ29jaW8gfHwgbmV3IFVSTChoLnVybCkuaG9zdG5hbWV9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Imhpc3RvcnktbWV0YSI+JHtoLnRzfSDCtyAke2guY2FuYWx9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Imhpc3Rvcnktc2NvcmUiPgogICAgICAgIDxzcGFuIGNsYXNzPSJocyBocy1yIj4ke2guZXJyQ291bnR9IGVycjwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iaHMgaHMtYSI+JHtoLndhcm5Db3VudH0gd2Fybjwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iaHMgaHMtZyI+JHtoLm9rQ291bnR9IG9rPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGApLmpvaW4oJycpOwp9CgpmdW5jdGlvbiBjYXJnYXJIaXN0b3JpYWwoaSkgewogIGNvbnN0IGggPSBoaXN0b3J5W2ldOwogIC8vIFJlbG9hZCBhbGwgZm9ybSBmaWVsZHMKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLWluJykudmFsdWUgPSBoLnVybCB8fCAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9tYnJlLWluJykudmFsdWUgPSBoLm5vbWJyZSB8fCAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVnb2Npby1pbicpLnZhbHVlID0gaC5uZWdvY2lvIHx8ICcnOwogIC8vIFNldCBjYW5hbCBjaGlwCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhbmFsLWNoaXBzIC5jaGlwJykuZm9yRWFjaChjID0+IHsKICAgIGMuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBjLmRhdGFzZXQudiA9PT0gaC5jYW5hbCk7CiAgfSk7CiAgY2FuYWwgPSBoLmNhbmFsIHx8ICdXaGF0c0FwcCc7CiAgLy8gUmVzdG9yZSBsYXN0IHZhcnMKICBsYXN0VXJsID0gaC51cmwgfHwgJyc7CiAgbGFzdE5vbWJyZSA9IGgubm9tYnJlIHx8ICcnOwogIGxhc3ROZWdvY2lvID0gaC5uZWdvY2lvIHx8ICcnOwogIGxhc3RDaGVja3MgPSBoLmNoZWNrcyB8fCBbXTsKICBndWFyZGFyQ2FtcG9zKCk7CiAgLy8gUmVzdG9yZSByZXN1bHRzIGlmIGF2YWlsYWJsZQogIGlmIChoLm1zZykgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZy1ib2R5JykudGV4dENvbnRlbnQgPSBoLm1zZzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5hbC1iYWRnZScpLnRleHRDb250ZW50ID0gaC5jYW5hbDsKICAgIGNvbnN0IHdvcmRzID0gaC5tc2cudHJpbSgpLnNwbGl0KC9ccysvKS5sZW5ndGg7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd29yZC1jb3VudCcpLnRleHRDb250ZW50ID0gYCR7d29yZHN9IHBhbGFicmFzYDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tZW1haWwnKS5zdHlsZS5kaXNwbGF5ID0gaC5jYW5hbCA9PT0gJ0VtYWlsJyA\/ICdmbGV4JyA6ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4td2EnKS5zdHlsZS5kaXNwbGF5ID0gaC5jYW5hbCA9PT0gJ1doYXRzQXBwJyA\/ICdmbGV4JyA6ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzLWFyZWEnKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtcHR5LXN0YXRlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW8tc25hcHNob3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrcy1saXN0JykuaW5uZXJIVE1MID0gJyc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtcm93JykuaW5uZXJIVE1MID0gJyc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGtnLWJhbm5lcicpLmlubmVySFRNTCA9ICcnOwogIH0KICB0b2FzdCgnUHJvc3BlY3RvIGNhcmdhZG86ICcgKyAoaC5uZWdvY2lvIHx8IGgudXJsKSk7Cn0KCgpmdW5jdGlvbiBkZXNjYXJnYXJQREYoKSB7CiAgY29uc3QgdXJsID0gbGFzdFVybCB8fCAn4oCUJzsKICBjb25zdCBuZWdvY2lvID0gbGFzdE5lZ29jaW8gfHwgJ+KAlCc7CiAgY29uc3Qgbm9tYnJlID0gbGFzdE5vbWJyZSB8fCAn4oCUJzsKICBjb25zdCBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnLWJvZHknKS50ZXh0Q29udGVudCB8fCAnJzsKICBjb25zdCBjYW5hbEFjdHVhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5hbC1iYWRnZScpLnRleHRDb250ZW50IHx8IGNhbmFsOwogIGNvbnN0IHBrZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwa2ctYmFubmVyJykudGV4dENvbnRlbnQudHJpbSgpIHx8ICcnOwogIGNvbnN0IGZlY2hhID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VzLUNMJywge2RheTonMi1kaWdpdCcsIG1vbnRoOidsb25nJywgeWVhcjonbnVtZXJpYyd9KTsKICBjb25zdCBjaGVja3MgPSBsYXN0Q2hlY2tzIHx8IFtdOwogIGNvbnN0IHN0YXR1c0ljb24gPSB7b2s6J+KckycsIHdhcm46J+KaoCcsIGVycjon4pyXJywgc2tpcDon4oCUJ307CiAgY29uc3Qgc3RhdHVzTGFiZWwgPSB7b2s6J1NpbiBwcm9ibGVtYScsIHdhcm46J0FkdmVydGVuY2lhJywgZXJyOidQcm9ibGVtYSBncmF2ZScsIHNraXA6J1ZlcmlmaWNhciBtYW51YWwnfTsKICBjb25zdCBzdGF0dXNDb2xvciA9IHtvazonIzIyYzk3YScsIHdhcm46JyNmMGEwMzAnLCBlcnI6JyNmZjQ1NDUnLCBza2lwOicjN2E3ODg0J307CiAgY29uc3QgZXJycyA9IGNoZWNrcy5maWx0ZXIoYz0+Yy5zdGF0dXM9PT0nZXJyJykubGVuZ3RoOwogIGNvbnN0IHdhcm5zID0gY2hlY2tzLmZpbHRlcihjPT5jLnN0YXR1cz09PSd3YXJuJykubGVuZ3RoOwogIGNvbnN0IG9rcyA9IGNoZWNrcy5maWx0ZXIoYz0+Yy5zdGF0dXM9PT0nb2snKS5sZW5ndGg7CgogIGNvbnN0IGNoZWNrc1Jvd3MgPSBjaGVja3MubWFwKGMgPT4gYAogICAgPHRyPgogICAgICA8dGQgc3R5bGU9InBhZGRpbmc6OXB4IDEycHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U4ZThlODtjb2xvcjoke3N0YXR1c0NvbG9yW2Muc3RhdHVzXX07Zm9udC1zaXplOjE1cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6MzBweDsiPiR7c3RhdHVzSWNvbltjLnN0YXR1c119PC90ZD4KICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOjlweCAxMnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlOGU4ZTg7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzExMTsiPiR7Yy50aXRsZX08L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjojNjY2O21hcmdpbi10b3A6MnB4O2xpbmUtaGVpZ2h0OjEuNDsiPiR7Yy5kZXRhaWx9PC9kaXY+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzo5cHggMTJweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZThlOGU4O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij4KICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHg7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7YmFja2dyb3VuZDoke3N0YXR1c0NvbG9yW2Muc3RhdHVzXX0yMjtjb2xvcjoke3N0YXR1c0NvbG9yW2Muc3RhdHVzXX07Ym9yZGVyOjFweCBzb2xpZCAke3N0YXR1c0NvbG9yW2Muc3RhdHVzXX00NDsiPiR7c3RhdHVzTGFiZWxbYy5zdGF0dXNdfTwvc3Bhbj4KICAgICAgPC90ZD4KICAgIDwvdHI+YCkuam9pbignJyk7CgogIC8vIOKUgOKUgCBDb21wdXRlIHRvcDMgY2FyZHMgZm9yIFBERiDilIDilIAKICBjb25zdCBfdDMgPSAod2luZG93Ll9sYXN0VG9wMyAmJiB3aW5kb3cuX2xhc3RUb3AzLmxlbmd0aCA+IDApCiAgICA\/IHdpbmRvdy5fbGFzdFRvcDMuc2xpY2UoMCwzKQogICAgOiBbCiAgICAgICAge3Byb2JsZW1hOidWZWxvY2lkYWQgY3ImIzIzNzt0aWNhIGVuIG1vYmlsZScsZGV0YWlsOidMb3MgdXN1YXJpb3MgYWJhbmRvbmFuIGFudGVzIGRlIHZlciBwcmVjaW9zIG8gcHJvZHVjdG9zJ30sCiAgICAgICAge3Byb2JsZW1hOidTaW4gU2NoZW1hIGRlIG5lZ29jaW8gbG9jYWwnLGRldGFpbDonR29vZ2xlIG5vIGlkZW50aWZpY2EgcXUmIzIzMzsgb2ZyZWNlIGVsIHNpdGlvJ30sCiAgICAgICAge3Byb2JsZW1hOidJbSYjMjI1O2dlbmVzIHNpbiBvcHRpbWl6YXInLGRldGFpbDonQXVtZW50YW4gZWwgdGllbXBvIGRlIGNhcmdhIHkgcmVkdWNlbiBjb252ZXJzaSYjMjQzO24nfQogICAgICBdOwogIGNvbnN0IHRvcDNDYXJkcyA9IF90My5tYXAoKGUsaSkgPT4gYAogICAgPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6MTRweCAxNnB4O2JvcmRlci1yYWRpdXM6OHB4O2JhY2tncm91bmQ6I2ZmZjVmNTtib3JkZXI6MXB4IHNvbGlkICNmZmNjY2M7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICNlNzRjM2M7Ij4KICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7Z2FwOjEycHg7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MjBweDtmb250LXdlaWdodDo5MDA7Y29sb3I6I2U3NGMzYzttaW4td2lkdGg6MjZweDsiPiR7aSsxfTwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzExMTttYXJnaW4tYm90dG9tOjNweDsiPiR7ZS5wcm9ibGVtYSB8fCBlLnRpdGxlfTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6IzU1NTtsaW5lLWhlaWdodDoxLjU7Ij4ke2UuZGV0YWlsfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PmApLmpvaW4oJycpOwoKICBjb25zdCByZXBvcnRIdG1sID0gYAogICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6R2VvcmdpYSxzZXJpZjttYXgtd2lkdGg6NzIwcHg7bWFyZ2luOjAgYXV0bztjb2xvcjojMTExO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNjsiPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6ZmxleC1zdGFydDtib3JkZXItYm90dG9tOjJweCBzb2xpZCAjMTExO3BhZGRpbmctYm90dG9tOjE2cHg7bWFyZ2luLWJvdHRvbToyNHB4OyI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjkwMDtsZXR0ZXItc3BhY2luZzotMC4wMmVtOyI+V1A8c3BhbiBzdHlsZT0iY29sb3I6IzNkNmZmZjsiPlJlY292ZXI8L3NwYW4+PC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjojNjY2O21hcmdpbi10b3A6MnB4OyI+QXVkaXRvcsOtYSB5IFJlcGFyYWNpw7NuIFdvcmRQcmVzcyDCtyBMQVRBTTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7Zm9udC1zaXplOjExcHg7Y29sb3I6IzY2NjtsaW5lLWhlaWdodDoxLjg7Ij4KICAgICAgICAgIFJlcG9ydGUgZGUgcHJvc3BlY2Npw7NuPGJyPiR7ZmVjaGF9PGJyPldQIFJlcGFpciBQcm8gRnJhbWV3b3JrCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjEwcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMWVtO2NvbG9yOiMzZDZmZmY7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1ib3R0b206MTBweDsiPkRhdG9zIGRlbCBwcm9zcGVjdG88L2Rpdj4KICAgICAgPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW4tYm90dG9tOjI0cHg7Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjUwJTtwYWRkaW5nOjEwcHggMTJweDtiYWNrZ3JvdW5kOiNmNWY1ZjU7Ym9yZGVyLXJhZGl1czo2cHggMCAwIDZweDsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM4ODg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDZlbTsiPkNvbnRhY3RvPC9kaXY+PGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NjAwO21hcmdpbi10b3A6MnB4OyI+JHtub21icmV9PC9kaXY+PC90ZD4KICAgICAgICAgIDx0ZCBzdHlsZT0id2lkdGg6NTAlO3BhZGRpbmc6MTBweCAxMnB4O2JhY2tncm91bmQ6I2Y1ZjVmNTtib3JkZXItcmFkaXVzOjAgNnB4IDZweCAwO2JvcmRlci1sZWZ0OjJweCBzb2xpZCAjZmZmOyI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6Izg4ODt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4wNmVtOyI+TmVnb2NpbzwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tdG9wOjJweDsiPiR7bmVnb2Npb308L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIiBzdHlsZT0icGFkZGluZzo0cHggMDsiPjwvdGQ+PC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgc3R5bGU9InBhZGRpbmc6MTBweCAxMnB4O2JhY2tncm91bmQ6I2Y1ZjVmNTtib3JkZXItcmFkaXVzOjZweDsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM4ODg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDZlbTsiPlVSTCBhbmFsaXphZGE8L2Rpdj48ZGl2IHN0eWxlPSJmb250LXdlaWdodDo2MDA7bWFyZ2luLXRvcDoycHg7Y29sb3I6IzNkNmZmZjsiPiR7dXJsfTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KCiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjFlbTtjb2xvcjojM2Q2ZmZmO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tYm90dG9tOjEwcHg7Ij5SZXN1bWVuIGRlbCBhbsOhbGlzaXM8L2Rpdj4KICAgICAgPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW4tYm90dG9tOjE2cHg7Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTRweDtiYWNrZ3JvdW5kOiNmNWY1ZjU7Ym9yZGVyLXJhZGl1czo2cHg7Ij48ZGl2IHN0eWxlPSJmb250LXNpemU6MjZweDtmb250LXdlaWdodDo5MDA7Y29sb3I6IzNkNmZmZjsiPiR7Y2hlY2tzLmxlbmd0aH08L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjojODg4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjA2ZW07bWFyZ2luLXRvcDozcHg7Ij5SZXZpc2Fkb3M8L2Rpdj48L3RkPgogICAgICAgICAgPHRkIHN0eWxlPSJ3aWR0aDo4cHg7Ij48L3RkPgogICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjE0cHg7YmFja2dyb3VuZDojZmZmMGYwO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29saWQgI2ZmZGRkZDsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToyNnB4O2ZvbnQtd2VpZ2h0OjkwMDtjb2xvcjojZmY0NTQ1OyI+JHtlcnJzfTwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM4ODg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDZlbTttYXJnaW4tdG9wOjNweDsiPlByb2JsZW1hczwvZGl2PjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjhweDsiPjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTRweDtiYWNrZ3JvdW5kOiNmZmZiZjA7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAjZmZlZWJiOyI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjI2cHg7Zm9udC13ZWlnaHQ6OTAwO2NvbG9yOiNmMGEwMzA7Ij4ke3dhcm5zfTwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM4ODg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMDZlbTttYXJnaW4tdG9wOjNweDsiPkFkdmVydGVuY2lhczwvZGl2PjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjhweDsiPjwvdGQ+CiAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTRweDtiYWNrZ3JvdW5kOiNmMGZmZjY7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCAjYmJmMGQ1OyI+PGRpdiBzdHlsZT0iZm9udC1zaXplOjI2cHg7Zm9udC13ZWlnaHQ6OTAwO2NvbG9yOiMyMmM5N2E7Ij4ke29rc308L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjojODg4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzowLjA2ZW07bWFyZ2luLXRvcDozcHg7Ij5TaW4gcHJvYmxlbWE8L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CgogICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNlZmY0ZmY7Ym9yZGVyOjFweCBzb2xpZCAjYzVkNWZmO2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O21hcmdpbi1ib3R0b206MjRweDtmb250LXNpemU6MTNweDtjb2xvcjojMWEzYThmO2ZvbnQtd2VpZ2h0OjYwMDsiPiYjOTYzMzsgJHtwa2d9PC9kaXY+CgogICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjI0cHg7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4xZW07Y29sb3I6I2MwMzkyYjtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbToxMnB4OyI+JiM5ODg4OyAzIEZ1Z2FzIGRlIENvbnZlcnNpJiMyNDM7biBDciYjMjM3O3RpY2FzIERldGVjdGFkYXMmIzg0ODI7PC9kaXY+CiAgICAgICAgJHt0b3AzQ2FyZHN9CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjEwcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjAuMWVtO2NvbG9yOiMzZDZmZmY7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1ib3R0b206MTBweDsiPlB1bnRvcyBhbmFsaXphZG9zPC9kaXY+CiAgICAgIDx0YWJsZSBzdHlsZT0id2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyOjFweCBzb2xpZCAjZThlOGU4O2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjttYXJnaW4tYm90dG9tOjI0cHg7Ij4KICAgICAgICA8dGJvZHk+JHtjaGVja3NSb3dzfTwvdGJvZHk+CiAgICAgIDwvdGFibGU+CgogICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MC4xZW07Y29sb3I6IzNkNmZmZjtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbToxMHB4OyI+TWVuc2FqZSBkZSBwcm9zcGVjY2nDs24gwrcgJHtjYW5hbEFjdHVhbH08L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZjhmOGY4O2JvcmRlcjoxcHggc29saWQgI2U4ZThlODtib3JkZXItbGVmdDozcHggc29saWQgIzNkNmZmZjtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjE4cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS44O2NvbG9yOiMxMTE7bWFyZ2luLWJvdHRvbTozMnB4OyI+JHttc2d9PC9kaXY+CgogICAgICA8ZGl2IHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCAjZThlOGU4O3BhZGRpbmctdG9wOjE0cHg7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiM5OTk7Ij4KICAgICAgICA8c3Bhbj5XUCBSZWNvdmVyIMK3IGNvbnRhY3RvQHdwcmVjb3Zlci5jbCDCtyArNTYgOSA2MjU5IDU3ODM8L3NwYW4+CiAgICAgICAgPHNwYW4+R2VuZXJhZG8gZWwgJHtmZWNoYX0gwrcgVXNvIGludGVybm88L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+YDsKCiAgLy8gQ3JlYXRlIG92ZXJsYXkgaW4gY3VycmVudCBwYWdlCiAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIG92ZXJsYXkuaWQgPSAncGRmLW92ZXJsYXknOwogIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6I2ZmZjt6LWluZGV4Ojk5OTk7b3ZlcmZsb3cteTphdXRvO3BhZGRpbmc6NDBweCAyMHB4Oyc7CgogIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgY2xvc2VCdG4uaW5uZXJIVE1MID0gJ+KclSBDZXJyYXIgdmlzdGEgcHJldmlhJzsKICBjbG9zZUJ0bi5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDoxNnB4O3JpZ2h0OjE2cHg7cGFkZGluZzo4cHggMTZweDtiYWNrZ3JvdW5kOiMxMTE7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjEwMHB4O2ZvbnQtc2l6ZToxMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6MTAwMDA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlOyc7CiAgY2xvc2VCdG4ub25jbGljayA9ICgpID0+IHsgb3ZlcmxheS5yZW1vdmUoKTsgfTsKCiAgY29uc3QgcHJpbnRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICBwcmludEJ0bi5pbm5lckhUTUwgPSAn4qyHIEd1YXJkYXIgY29tbyBQREYnOwogIHByaW50QnRuLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7dG9wOjE2cHg7cmlnaHQ6MTcwcHg7cGFkZGluZzo4cHggMTZweDtiYWNrZ3JvdW5kOiMzZDZmZmY7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjEwMHB4O2ZvbnQtc2l6ZToxMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6MTAwMDA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlOyc7CiAgcHJpbnRCdG4ub25jbGljayA9ICgpID0+IHsgd2luZG93LnByaW50KCk7IH07CgogIG92ZXJsYXkuaW5uZXJIVE1MID0gcmVwb3J0SHRtbDsKICBvdmVybGF5LmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICBvdmVybGF5LmFwcGVuZENoaWxkKHByaW50QnRuKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwogIHRvYXN0KCdWaXN0YSBwcmV2aWEgbGlzdGEg4oCUIGhheiBjbGljIGVuICJHdWFyZGFyIGNvbW8gUERGIicpOwp9Cgphc3luYyBmdW5jdGlvbiBhdXRvZGV0ZWN0YXIoKSB7CiAgbGV0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS52YWx1ZS50cmltKCk7CiAgaWYgKCF1cmwpIHsgdG9hc3QoJ0luZ3Jlc2EgdW5hIFVSTCBwcmltZXJvJyk7IHJldHVybjsgfQogIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkgdXJsID0gJ2h0dHBzOi8vJyArIHVybDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLWluJykudmFsdWUgPSB1cmw7CgogIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tYXV0bycpOwogIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRvLXN0YXR1cycpOwogIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgYnRuLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJ3aWR0aDoxMXB4O2hlaWdodDoxMXB4O2JvcmRlcjoycHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpO2JvcmRlci10b3AtY29sb3I6dmFyKC0tYWNjZW50KTtib3JkZXItcmFkaXVzOjUwJTthbmltYXRpb246c3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZTsiPjwvZGl2Pic7CiAgc3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7CiAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0xleWVuZG8gc2l0aW8uLi4nOwoKICB0cnkgewogICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5hbGxvcmlnaW5zLndpbi9nZXQ\/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YCk7CiAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7CiAgICBjb25zdCBib2R5ID0gZC5jb250ZW50cyB8fCAnJzsKCiAgICAvLyBFeHRyYWN0IGJ1c2luZXNzIG5hbWUg4oCUIHByaW9yaXR5OiBvZzpzaXRlX25hbWUgPiB0aXRsZSA+IGRvbWFpbgogICAgbGV0IG5lZ29jaW8gPSAnJzsKICAgIGxldCB0ZWxlZm9ubyA9ICcnOwogICAgbGV0IGVtYWlsID0gJyc7CiAgICBsZXQgZGVzYyA9ICcnOwoKICAgIC8vIG9nOnNpdGVfbmFtZQogICAgY29uc3Qgb2dTaXRlID0gYm9keS5tYXRjaCgvb2c6c2l0ZV9uYW1lW14+XSpjb250ZW50PVsiJ10oW14iJ117MSw4MH0pWyInXS9pKQogICAgICAgICAgICAgICAgfHwgYm9keS5tYXRjaCgvY29udGVudD1bIiddKFteIiddezEsODB9KVsiJ11bXj5dKm9nOnNpdGVfbmFtZS9pKTsKICAgIGlmIChvZ1NpdGUpIG5lZ29jaW8gPSBvZ1NpdGVbMV0udHJpbSgpOwoKICAgIC8vIG9nOnRpdGxlIGZhbGxiYWNrCiAgICBpZiAoIW5lZ29jaW8pIHsKICAgICAgY29uc3Qgb2dUaXRsZSA9IGJvZHkubWF0Y2goL29nOnRpdGxlW14+XSpjb250ZW50PVsiJ10oW14iJ117MSw4MH0pWyInXS9pKQogICAgICAgICAgICAgICAgICAgfHwgYm9keS5tYXRjaCgvY29udGVudD1bIiddKFteIiddezEsODB9KVsiJ11bXj5dKm9nOnRpdGxlL2kpOwogICAgICBpZiAob2dUaXRsZSkgbmVnb2NpbyA9IG9nVGl0bGVbMV0ucmVwbGFjZSgvXHMqW3xcLeKAk+KAlF0uKiQvLCAnJykudHJpbSgpOwogICAgfQoKICAgIC8vIDx0aXRsZT4gZmFsbGJhY2sKICAgIGlmICghbmVnb2NpbykgewogICAgICBjb25zdCB0aXRsZVRhZyA9IGJvZHkubWF0Y2goLzx0aXRsZVtePl0qPihbXjxdezEsMTAwfSk8XC90aXRsZT4vaSk7CiAgICAgIGlmICh0aXRsZVRhZykgbmVnb2NpbyA9IHRpdGxlVGFnWzFdLnJlcGxhY2UoL1xzKlt8XC3igJPigJRdLiokLywgJycpLnRyaW0oKTsKICAgIH0KCiAgICAvLyBkb21haW4gZmFsbGJhY2sKICAgIGlmICghbmVnb2NpbykgewogICAgICBuZWdvY2lvID0gbmV3IFVSTCh1cmwpLmhvc3RuYW1lLnJlcGxhY2UoJ3d3dy4nLCAnJykuc3BsaXQoJy4nKVswXTsKICAgICAgbmVnb2NpbyA9IG5lZ29jaW8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuZWdvY2lvLnNsaWNlKDEpOwogICAgfQoKICAgIC8vIFBob25lCiAgICBjb25zdCB0ZWxNYXRjaCA9IGJvZHkubWF0Y2goL2hyZWY9WyInXXRlbDooWytcZFxzXC0oKS5dezYsMjB9KVsiJ10vaSk7CiAgICBpZiAodGVsTWF0Y2gpIHRlbGVmb25vID0gdGVsTWF0Y2hbMV0udHJpbSgpOwoKICAgIC8vIEVtYWlsCiAgICBjb25zdCBlbWFpbE1hdGNoID0gYm9keS5tYXRjaCgvaHJlZj1bIiddbWFpbHRvOihbXiInPyZcc117NCw2MH0pWyInXS9pKTsKICAgIGlmIChlbWFpbE1hdGNoKSB7CiAgICAgIGNvbnN0IGVtID0gZW1haWxNYXRjaFsxXTsKICAgICAgaWYgKCFlbS5pbmNsdWRlcygnZWplbXBsbycpICYmICFlbS5pbmNsdWRlcygnZXhhbXBsZScpICYmICFlbS5pbmNsdWRlcygnQHNlbnRyeScpKSBlbWFpbCA9IGVtOwogICAgfQoKICAgIC8vIE1ldGEgZGVzY3JpcHRpb24KICAgIGNvbnN0IG1ldGFEZXNjID0gYm9keS5tYXRjaCgvbmFtZT1bIiddZGVzY3JpcHRpb25bIiddW14+XSpjb250ZW50PVsiJ10oW14iJ117MTAsMjAwfSlbIiddL2kpCiAgICAgICAgICAgICAgICAgIHx8IGJvZHkubWF0Y2goL2NvbnRlbnQ9WyInXShbXiInXXsxMCwyMDB9KVsiJ11bXj5dKm5hbWU9WyInXWRlc2NyaXB0aW9uWyInXS9pKTsKICAgIGlmIChtZXRhRGVzYykgZGVzYyA9IG1ldGFEZXNjWzFdLnRyaW0oKS5zdWJzdHJpbmcoMCwgMTIwKTsKCiAgICAvLyBGaWxsIGZpZWxkcwogICAgaWYgKG5lZ29jaW8pIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lZ29jaW8taW4nKS52YWx1ZSA9IG5lZ29jaW87CiAgICB9CgogICAgLy8gQnVpbGQgc3RhdHVzIG1lc3NhZ2UKICAgIGNvbnN0IGZvdW5kID0gW107CiAgICBpZiAobmVnb2NpbykgZm91bmQucHVzaCgnbmVnb2NpbycpOwogICAgaWYgKHRlbGVmb25vKSBmb3VuZC5wdXNoKCd0ZWw6ICcgKyB0ZWxlZm9ubyk7CiAgICBpZiAoZW1haWwpIGZvdW5kLnB1c2goJ2VtYWlsOiAnICsgZW1haWwpOwoKICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1ncmVlbiknOwogICAgc3RhdHVzLnRleHRDb250ZW50ID0gZm91bmQubGVuZ3RoID4gMAogICAgICA\/ICfinJMgRGV0ZWN0YWRvOiAnICsgZm91bmQuam9pbignIMK3ICcpCiAgICAgIDogJ+KAlCBTaW4gZGF0b3MgYWRpY2lvbmFsZXMgZGV0ZWN0YWRvcyc7CgogICAgLy8gU3RvcmUgZXh0cmEgZm9yIG1lc3NhZ2UgZ2VuZXJhdGlvbgogICAgd2luZG93Ll9hdXRvUGhvbmUgPSB0ZWxlZm9ubzsKICAgIHdpbmRvdy5fYXV0b0VtYWlsID0gZW1haWw7CiAgICB3aW5kb3cuX2F1dG9EZXNjID0gZGVzYzsKCiAgICBndWFyZGFyQ2FtcG9zKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9tYnJlLWluJykuZm9jdXMoKTsKICAgIHRvYXN0KCdEYXRvcyBkZXRlY3RhZG9zIOKAlCBpbmdyZXNhIGVsIG5vbWJyZSBkZWwgY29udGFjdG8nKTsKCiAgfSBjYXRjaChlKSB7CiAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYW1iZXIpJzsKICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICfimqAgTm8gc2UgcHVkbyBsZWVyIGVsIHNpdGlvIOKAlCBpbmdyZXNhIGxvcyBkYXRvcyBtYW51YWxtZW50ZSc7CiAgfQoKICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICBidG4uaW5uZXJIVE1MID0gJzxzdmcgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ii8+PHBvbHlsaW5lIHBvaW50cz0iMTcgOCAxMiAzIDcgOCIvPjxsaW5lIHgxPSIxMiIgeTE9IjMiIHgyPSIxMiIgeTI9IjE1Ii8+PC9zdmc+JzsKfQoKZnVuY3Rpb24gbnVldm9DbGllbnRlKCkgewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub21icmUtaW4nKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZWdvY2lvLWluJykudmFsdWUgPSAnJzsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FuYWwtY2hpcHMgLmNoaXAnKS5mb3JFYWNoKChjLGkpID0+IGMuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBpPT09MCkpOwogIGNhbmFsID0gJ1doYXRzQXBwJzsKICBsYXN0VXJsID0gJyc7IGxhc3ROb21icmUgPSAnJzsgbGFzdE5lZ29jaW8gPSAnJzsgbGFzdENoZWNrcyA9IFtdOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzLWFyZWEnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZW8tc25hcHNob3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbXB0eS1zdGF0ZScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2ctd3JhcCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgZ3VhcmRhckNhbXBvcygpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS5mb2N1cygpOwogIHRvYXN0KCdGb3JtdWxhcmlvIGxpbXBpbyDigJQgbGlzdG8gcGFyYSBudWV2byBjbGllbnRlJyk7Cn0KCmZ1bmN0aW9uIGd1YXJkYXJDYW1wb3MoKSB7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3dwcl9jYW1wb3MnLCBKU09OLnN0cmluZ2lmeSh7CiAgICB1cmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS52YWx1ZSwKICAgIG5vbWJyZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vbWJyZS1pbicpLnZhbHVlLAogICAgbmVnb2NpbzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lZ29jaW8taW4nKS52YWx1ZSwKICAgIGNhbmFsOiBjYW5hbCwKICAgIGFwaUtleTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaS1rZXknKS52YWx1ZQogIH0pKTsKfQoKZnVuY3Rpb24gY2FyZ2FyQ2FtcG9zR3VhcmRhZG9zKCkgewogIHRyeSB7CiAgICBjb25zdCBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dwcl9jYW1wb3MnKSB8fCAne30nKTsKICAgIGlmIChzYXZlZC51cmwpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmwtaW4nKS52YWx1ZSA9IHNhdmVkLnVybDsKICAgIGlmIChzYXZlZC5ub21icmUpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub21icmUtaW4nKS52YWx1ZSA9IHNhdmVkLm5vbWJyZTsKICAgIGlmIChzYXZlZC5uZWdvY2lvKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmVnb2Npby1pbicpLnZhbHVlID0gc2F2ZWQubmVnb2NpbzsKICAgIGlmIChzYXZlZC5hcGlLZXkpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaS1rZXknKS52YWx1ZSA9IHNhdmVkLmFwaUtleTsgY2hlY2tBcGlLZXkoKTsgfQogICAgaWYgKHNhdmVkLmNhbmFsKSB7CiAgICAgIGNhbmFsID0gc2F2ZWQuY2FuYWw7CiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjYW5hbC1jaGlwcyAuY2hpcCcpLmZvckVhY2goYyA9PiBjLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgYy5kYXRhc2V0LnYgPT09IHNhdmVkLmNhbmFsKSk7CiAgICB9CiAgfSBjYXRjaChlKSB7fQp9CgovLyBJbml0CnJlbmRlckhpc3RvcnkoKTsKY2hlY2tBcGlLZXkoKTsKY2FyZ2FyQ2FtcG9zR3VhcmRhZG9zKCk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KICAgICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBpZD0iYXBpLWtleSIgcGxhY2Vob2xkZXI9InNrLWFudC1hcGkwMy03Unl0TDZ4MzMxSE05S2JVamd5YUt2UFlaS0xjZ3hxMTJtOEdOX1N5TE9Yb19pUkRQUWFwSFFIV3hQMjJFNzdjVUNjbW9HNi1sX0l2czJaUWR5N3RJUS16Mzk2ZndBQSIgb25pbnB1dD0iY2hlY2tBcGlLZXkoKSIgLz4KBQeLAwUHBQcIBAgGCAUBAwgHCAcIBggOCA4IC0gBBAkIBkIAAwUHCAQFBwUHhkeAsQEFBwgHDwQKBwuL3AGkAYS+BoADDwEFAAABBwAAAQQAAAEAAAdCAQEAQQAAIAGLA0EHugFBBYsDQQIItwFBAwUKQQUIQQcEEQGvAUEOBRMAfQEKABcAfQF9AHcGY2xvc2VkdwZjbG9zZWR3AHcAEQB3C2F1ZGl0b3Itd3BydwdwdWJsaXNodxMyMDI2LTA1LTE4VDIwOjEyOjM1FQB3JDE5Zjg0NjcyLTdiY2MtNDliNC1hNmYwLTBiNTFiZWM5MWYzN3h38308ZGl2IGlkPSJhdWRpdG9yLXdwci1yb290IiBzdHlsZT0iZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmOyBtYXgtd2lkdGg6IDkwMHB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMjBweDsgYmFja2dyb3VuZDogI2YwZjRmODsgbWluLWhlaWdodDogMTAwdmg7Ij4KCjxzdHlsZT4KICAjYXVkaXRvci13cHItcm9vdCAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICNhdWRpdG9yLXdwci1yb290IGgxIHsgY29sb3I6ICMxYTM2NWQ7IGZvbnQtc2l6ZTogMS44ZW07IG1hcmdpbi1ib3R0b206IDVweDsgfQogICNhdWRpdG9yLXdwci1yb290IC5zdWJ0aXRsZSB7IGNvbG9yOiAjNGE1NTY4OyBtYXJnaW4tYm90dG9tOiAyNXB4OyBmb250LXNpemU6IDAuOTVlbTsgfQogIC53cHItY2FyZCB7IGJhY2tncm91bmQ6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDEycHg7IHBhZGRpbmc6IDI0cHg7IG1hcmdpbi1ib3R0b206IDIwcHg7IGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsMCwwLDAuMDgpOyB9CiAgLndwci1jYXJkIGgyIHsgY29sb3I6ICMyZDM3NDg7IGZvbnQtc2l6ZTogMS4xZW07IG1hcmdpbjogMCAwIDE2cHggMDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IH0KICAud3ByLWlucHV0IHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTRweDsgYm9yZGVyOiAycHggc29saWQgI2UyZThmMDsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuOTVlbTsgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7IH0KICAud3ByLWlucHV0OmZvY3VzIHsgb3V0bGluZTogbm9uZTsgYm9yZGVyLWNvbG9yOiAjNDI5OWUxOyB9CiAgLndwci1idG4geyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC45NWVtOyBmb250LXdlaWdodDogNjAwOyB0cmFuc2l0aW9uOiBhbGwgMC4yczsgfQogIC53cHItYnRuLXByaW1hcnkgeyBiYWNrZ3JvdW5kOiAjMzE4MmNlOyBjb2xvcjogd2hpdGU7IH0KICAud3ByLWJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogIzJiNmNiMDsgfQogIC53cHItYnRuLXByaW1hcnk6ZGlzYWJsZWQgeyBiYWNrZ3JvdW5kOiAjOTBjZGY0OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9CiAgLndwci1idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICMzOGExNjk7IGNvbG9yOiB3aGl0ZTsgfQogIC53cHItYnRuLXN1Y2Nlc3M6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMjc2NzQ5OyB9CiAgLndwci1idG4td2EgeyBiYWNrZ3JvdW5kOiAjMjVkMzY2OyBjb2xvcjogd2hpdGU7IH0KICAud3ByLWJ0bi13YTpob3ZlciB7IGJhY2tncm91bmQ6ICMxMjhjN2U7IH0KICAud3ByLWJ0bi1kYW5nZXIgeyBiYWNrZ3JvdW5kOiAjZTUzZTNlOyBjb2xvcjogd2hpdGU7IGZvbnQtc2l6ZTogMC44ZW07IHBhZGRpbmc6IDZweCAxMnB4OyB9CiAgLndwci1idG4tZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogI2M1MzAzMDsgfQogIC53cHItYnRuLXNtIHsgZm9udC1zaXplOiAwLjhlbTsgcGFkZGluZzogNnB4IDEycHg7IH0KICAud3ByLWZsZXggeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDsgfQogIC53cHItcmVzdWx0IHsgYmFja2dyb3VuZDogI2Y3ZmFmYzsgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiAxNnB4OyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtc2l6ZTogMC45ZW07IGxpbmUtaGVpZ2h0OiAxLjY7IG1pbi1oZWlnaHQ6IDEwMHB4OyBjb2xvcjogIzJkMzc0ODsgfQogIC53cHItbG9hZGluZyB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY29sb3I6ICM0YTU1Njg7IGZvbnQtc2l6ZTogMC45ZW07IH0KICAud3ByLXNwaW5uZXIgeyB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4OyBib3JkZXI6IDNweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItdG9wLWNvbG9yOiAjMzE4MmNlOyBib3JkZXItcmFkaXVzOiA1MCU7IGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsgfQogIEBrZXlmcmFtZXMgc3BpbiB7IHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9CiAgLndwci1oaXN0b3J5LWl0ZW0geyBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmc6IDEycHggMTZweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7IH0KICAud3ByLWhpc3RvcnktaXRlbTpob3ZlciB7IGJhY2tncm91bmQ6ICNlYmY4ZmY7IH0KICAud3ByLWhpc3RvcnktdXJsIHsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMyYjZjYjA7IGZvbnQtc2l6ZTogMC45ZW07IH0KICAud3ByLWhpc3RvcnktZGF0ZSB7IGZvbnQtc2l6ZTogMC43NWVtOyBjb2xvcjogIzcxODA5NjsgbWFyZ2luLXRvcDogM3B4OyB9CiAgLndwci1oaXN0b3J5LXByZXZpZXcgeyBmb250LXNpemU6IDAuODJlbTsgY29sb3I6ICM0YTU1Njg7IG1hcmdpbi10b3A6IDZweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IH0KICAud3ByLWVtcHR5IHsgY29sb3I6ICNhMGFlYzA7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDsgZm9udC1zaXplOiAwLjllbTsgfQogIC53cHItYXBpLXJvdyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfQogIC53cHItYXBpLXN0YXR1cyB7IGZvbnQtc2l6ZTogMC44ZW07IHBhZGRpbmc6IDRweCAxMHB4OyBib3JkZXItcmFkaXVzOiAyMHB4OyBmb250LXdlaWdodDogNjAwOyB9CiAgLndwci1hcGktb2sgeyBiYWNrZ3JvdW5kOiAjYzZmNmQ1OyBjb2xvcjogIzI3Njc0OTsgfQogIC53cHItYXBpLW1pc3NpbmcgeyBiYWNrZ3JvdW5kOiAjZmVkN2Q3OyBjb2xvcjogI2M1MzAzMDsgfQogIC53cHItdGFnIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kOiAjZWJmOGZmOyBjb2xvcjogIzJiNmNiMDsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzhlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLXJpZ2h0OiA0cHg7IH0KICAud3ByLW1vZGFsIHsgZGlzcGxheTogbm9uZTsgcG9zaXRpb246IGZpeGVkOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgei1pbmRleDogOTk5OTsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH0KICAud3ByLW1vZGFsLmFjdGl2ZSB7IGRpc3BsYXk6IGZsZXg7IH0KICAud3ByLW1vZGFsLWJveCB7IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAxMnB4OyBwYWRkaW5nOiAyOHB4OyBtYXgtd2lkdGg6IDYwMHB4OyB3aWR0aDogOTAlOyBtYXgtaGVpZ2h0OiA4MHZoOyBvdmVyZmxvdy15OiBhdXRvOyB9CiAgLndwci1tb2RhbC1ib3ggaDMgeyBtYXJnaW46IDAgMCAxMnB4IDA7IGNvbG9yOiAjMWEzNjVkOyB9CiAgLndwci1tb2RhbC1yZXN1bHQgeyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtc2l6ZTogMC44OGVtOyBsaW5lLWhlaWdodDogMS42OyBjb2xvcjogIzJkMzc0ODsgYmFja2dyb3VuZDogI2Y3ZmFmYzsgcGFkZGluZzogMTZweDsgYm9yZGVyLXJhZGl1czogOHB4OyBtYXgtaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3cteTogYXV0bzsgfQogIC53cHItbW9kYWwtZm9vdGVyIHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBtYXJnaW4tdG9wOiAxNnB4OyBmbGV4LXdyYXA6IHdyYXA7IH0KICAud3ByLWNsb3NlLWJ0biB7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7IGNvbG9yOiAjNGE1NTY4OyB9CiAgLndwci1jbG9zZS1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjZjdmYWZjOyB9CiAgdGV4dGFyZWEud3ByLWlucHV0IHsgbWluLWhlaWdodDogODBweDsgcmVzaXplOiB2ZXJ0aWNhbDsgfQogIC53cHItc2VjdGlvbi10aXRsZSB7IGZvbnQtc2l6ZTogMC43OGVtOyBmb250LXdlaWdodDogNzAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC4wNWVtOyBjb2xvcjogIzcxODA5NjsgbWFyZ2luLWJvdHRvbTogOHB4OyB9Cjwvc3R5bGU+Cgo8aDE+8J+UjSBBdWRpdG9yIFdQUjwvaDE+CjxwIGNsYXNzPSJzdWJ0aXRsZSI+SGVycmFtaWVudGEgaW50ZXJuYSBkZSBkaWFnbsOzc3RpY28gV29yZFByZXNzIMK3IFdQUmVjb3Zlci5jbDwvcD4KCjwhLS0gQVBJIEtleSBDYXJkIC0tPgo8ZGl2IGNsYXNzPSJ3cHItY2FyZCIgaWQ9ImFwaS1jYXJkIj4KICA8aDI+8J+UkSBBUEkgS2V5IGRlIEFudGhyb3BpYzwvaDI+CiAgPGRpdiBjbGFzcz0id3ByLWFwaS1yb3ciPgogICAgPGlucHV0IHR5cGU9InBhc3N3b3JkIiBpZD0iYXBpS2V5SW5wdXQiIGNsYXNzPSJ3cHItaW5wdXQiIHBsYWNlaG9sZGVyPSJzay1hbnQtYXBpMDMtN1J5dEw2eDMzMUhNOUtiVWpneWFLdlBZWktMY2d4cTEybThHTl9TeUxPWG9faVJEUFFhcEhRSFd4UDIyRTc3Y1VDY21vRzYtbF9JdnMyWlFkeTd0SVEtejM5NmZ3QUEiIHN0eWxlPSJmbGV4OjEiIC8+CiAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tcHJpbWFyeSIgb25jbGljaz0ic2F2ZUFwaUtleSgpIj5HdWFyZGFyPC9idXR0b24+CiAgICA8c3BhbiBpZD0iYXBpU3RhdHVzIiBjbGFzcz0id3ByLWFwaS1zdGF0dXMgd3ByLWFwaS1taXNzaW5nIj5TaW4gY2xhdmU8L3NwYW4+CiAgPC9kaXY+CiAgPHAgc3R5bGU9ImZvbnQtc2l6ZTowLjc4ZW07IGNvbG9yOiM3MTgwOTY7IG1hcmdpbjogOHB4IDAgMCAwOyI+TGEgY2xhdmUgc2UgZ3VhcmRhIGVuIGxvY2FsU3RvcmFnZSBkZSB0dSBuYXZlZ2Fkb3IgeSBwZXJzaXN0ZSBlbnRyZSBzZXNpb25lcy48L3A+CjwvZGl2PgoKPCEtLSBBbsOhbGlzaXMgQ2FyZCAtLT4KPGRpdiBjbGFzcz0id3ByLWNhcmQiPgogIDxoMj7wn4yQIEFuYWxpemFyIHNpdGlvIFdvcmRQcmVzczwvaDI+CiAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiPlVSTCBkZWwgY2xpZW50ZTwvZGl2PgogIDxkaXYgY2xhc3M9Indwci1mbGV4IiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTRweDsiPgogICAgPGlucHV0IHR5cGU9InVybCIgaWQ9InVybElucHV0IiBjbGFzcz0id3ByLWlucHV0IiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly9zaXRpby1kZWwtY2xpZW50ZS5jbCIgc3R5bGU9ImZsZXg6MSIgb25rZXlwcmVzcz0iaWYoZXZlbnQua2V5PT09J0VudGVyJykgYW5hbGl6YXIoKSIgLz4KICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJhbmFsaXphcigpIiBpZD0iYnRuQW5hbGl6YXIiPvCflI4gQW5hbGl6YXI8L2J1dHRvbj4KICA8L2Rpdj4KCiAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiPkNvbnRleHRvIGFkaWNpb25hbCAob3BjaW9uYWwpPC9kaXY+CiAgPHRleHRhcmVhIGlkPSJjb250ZXh0b0lucHV0IiBjbGFzcz0id3ByLWlucHV0IiBwbGFjZWhvbGRlcj0iRWo6IEVsIGNsaWVudGUgbWUgY29udGFjdMOzIHBvciBXaGF0c0FwcCBkaWNpZW5kbyBxdWUgc3Ugc2l0aW8gbXVlc3RyYSBwYW50YWxsYSBibGFuY2EuIFVzYSBXb3JkUHJlc3MgY29uIFdvb0NvbW1lcmNlLiBIb3N0aW5nIGVuIEhvc3RHYXRvci4iPjwvdGV4dGFyZWE+CgogIDxkaXYgaWQ9ImxvYWRpbmdEaXYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6MTRweDsiPgogICAgPGRpdiBjbGFzcz0id3ByLWxvYWRpbmciPjxkaXYgY2xhc3M9Indwci1zcGlubmVyIj48L2Rpdj4gQW5hbGl6YW5kbyBjb24gQ2xhdWRlLi4uIHBvciBmYXZvciBlc3BlcmEuPC9kaXY+CiAgPC9kaXY+CgogIDxkaXYgaWQ9InJlc3VsdERpdiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsgbWFyZ2luLXRvcDoxNHB4OyI+CiAgICA8ZGl2IGNsYXNzPSJ3cHItc2VjdGlvbi10aXRsZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4OyI+TWVuc2FqZSBnZW5lcmFkbzwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLXJlc3VsdCIgaWQ9InJlc3VsdFRleHQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLWZsZXgiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMnB4OyI+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1zdWNjZXNzIiBvbmNsaWNrPSJjb3BpYXJNZW5zYWplKCkiPvCfk4sgQ29waWFyPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi13YSIgb25jbGljaz0iZW52aWFyV0EoKSI+8J+SrCBFbnZpYXIgcG9yIFdoYXRzQXBwPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IHdwci1idG4tc20iIG9uY2xpY2s9InJlZ2VuZXJhcigpIj7wn5SEIFJlZ2VuZXJhcjwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPCEtLSBIaXN0b3JpYWwgQ2FyZCAtLT4KPGRpdiBjbGFzcz0id3ByLWNhcmQiPgogIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOmNlbnRlcjsgbWFyZ2luLWJvdHRvbToxNHB4OyI+CiAgICA8aDIgc3R5bGU9Im1hcmdpbjowOyI+8J+TiyBIaXN0b3JpYWwgZGUgYW7DoWxpc2lzPC9oMj4KICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1kYW5nZXIgd3ByLWJ0bi1zbSIgb25jbGljaz0ibGltcGlhckhpc3RvcmlhbCgpIj7wn5eR77iPIExpbXBpYXIgdG9kbzwvYnV0dG9uPgogIDwvZGl2PgogIDxkaXYgaWQ9Imhpc3RvcmlhbERpdiI+CiAgICA8cCBjbGFzcz0id3ByLWVtcHR5Ij5Bw7puIG5vIGhheSBhbsOhbGlzaXMgcmVhbGl6YWRvcy48L3A+CiAgPC9kaXY+CjwvZGl2PgoKPCEtLSBNb2RhbCBwYXJhIHZlciBoaXN0b3JpYWwgLS0+CjxkaXYgY2xhc3M9Indwci1tb2RhbCIgaWQ9Imhpc3RvcmlhbE1vZGFsIj4KICA8ZGl2IGNsYXNzPSJ3cHItbW9kYWwtYm94Ij4KICAgIDxoMyBpZD0ibW9kYWxVcmwiPlVSTDwvaDM+CiAgICA8ZGl2IGNsYXNzPSJ3cHItc2VjdGlvbi10aXRsZSIgaWQ9Im1vZGFsRGF0ZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ3cHItbW9kYWwtcmVzdWx0IiBpZD0ibW9kYWxSZXN1bHQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLW1vZGFsLWZvb3RlciI+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1zdWNjZXNzIiBvbmNsaWNrPSJjb3BpYXJEZXNkZU1vZGFsKCkiPvCfk4sgQ29waWFyPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi13YSIgb25jbGljaz0iZW52aWFyV0FNb2RhbCgpIj7wn5KsIFdoYXRzQXBwPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWJ0bi1wcmltYXJ5IHdwci1idG4tc20iIG9uY2xpY2s9ImNhcmdhckVuRWRpdG9yKCkiPuKcj++4jyBDYXJnYXIgZW4gZWRpdG9yPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9Indwci1idG4gd3ByLWNsb3NlLWJ0biIgb25jbGljaz0iY2VycmFyTW9kYWwoKSI+4pyVIENlcnJhcjwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KKGZ1bmN0aW9uKCkgewoKICBjb25zdCBTVE9SQUdFX0tFWSA9ICd3cHJfaGlzdG9yaWFsJzsKICBjb25zdCBBUElfS0VZX1NUT1JBR0UgPSAnd3ByX2FwaV9rZXknOwogIGxldCBjdXJyZW50QW5hbHlzaXMgPSBudWxsOwogIGxldCBtb2RhbERhdGEgPSBudWxsOwoKICAvLyBJbmljaWFsaXphcgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsKICAgIGluaXRBcGlLZXkoKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH0pOwogIC8vIFRhbWJpw6luIGVqZWN1dGFyIHNpIGVsIERPTSB5YSBlc3TDoSBsaXN0bwogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnbG9hZGluZycpIHsKICAgIGluaXRBcGlLZXkoKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH0KCiAgZnVuY3Rpb24gaW5pdEFwaUtleSgpIHsKICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQVBJX0tFWV9TVE9SQUdFKTsKICAgIGlmIChzYXZlZCkgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBpS2V5SW5wdXQnKS52YWx1ZSA9IHNhdmVkOwogICAgICB1cGRhdGVBcGlTdGF0dXModHJ1ZSk7CiAgICB9CiAgfQoKICB3aW5kb3cuc2F2ZUFwaUtleSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3Qga2V5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaUtleUlucHV0JykudmFsdWUudHJpbSgpOwogICAgaWYgKCFrZXkpIHsgYWxlcnQoJ1BvciBmYXZvciBpbmdyZXNhIGxhIEFQSSBrZXkuJyk7IHJldHVybjsgfQogICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnc2stYW50LScpKSB7CiAgICAgIGlmICghY29uZmlybSgnTGEgY2xhdmUgbm8gZW1waWV6YSBjb24gInNrLWFudC0iLiDCv0Rlc2VhcyBndWFyZGFybGEgaWd1YWxtZW50ZT8nKSkgcmV0dXJuOwogICAgfQogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQVBJX0tFWV9TVE9SQUdFLCBrZXkpOwogICAgdXBkYXRlQXBpU3RhdHVzKHRydWUpOwogICAgYWxlcnQoJ+KchSBBUEkga2V5IGd1YXJkYWRhIGNvcnJlY3RhbWVudGUuJyk7CiAgfTsKCiAgZnVuY3Rpb24gdXBkYXRlQXBpU3RhdHVzKG9rKSB7CiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGlTdGF0dXMnKTsKICAgIGlmIChvaykgewogICAgICBlbC50ZXh0Q29udGVudCA9ICfinJMgQWN0aXZhJzsKICAgICAgZWwuY2xhc3NOYW1lID0gJ3dwci1hcGktc3RhdHVzIHdwci1hcGktb2snOwogICAgfSBlbHNlIHsKICAgICAgZWwudGV4dENvbnRlbnQgPSAnU2luIGNsYXZlJzsKICAgICAgZWwuY2xhc3NOYW1lID0gJ3dwci1hcGktc3RhdHVzIHdwci1hcGktbWlzc2luZyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRBcGlLZXkoKSB7CiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQVBJX0tFWV9TVE9SQUdFKSB8fCAnJzsKICB9CgogIHdpbmRvdy5hbmFsaXphciA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgY29uc3QgdXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybElucHV0JykudmFsdWUudHJpbSgpOwogICAgY29uc3QgY29udGV4dG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGV4dG9JbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgIGNvbnN0IGFwaUtleSA9IGdldEFwaUtleSgpOwoKICAgIGlmICghdXJsKSB7IGFsZXJ0KCdQb3IgZmF2b3IgaW5ncmVzYSBsYSBVUkwgZGVsIGNsaWVudGUuJyk7IHJldHVybjsgfQogICAgaWYgKCFhcGlLZXkpIHsgYWxlcnQoJ1ByaW1lcm8gZGViZXMgZ3VhcmRhciB0dSBBUEkga2V5IGRlIEFudGhyb3BpYy4nKTsgcmV0dXJuOyB9CgogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkFuYWxpemFyJyk7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmdEaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHREaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgIHRyeSB7CiAgICAgIGNvbnN0IG1lbnNhamUgPSBhd2FpdCBsbGFtYXJDbGF1ZGUodXJsLCBjb250ZXh0bywgYXBpS2V5KTsKICAgICAgY3VycmVudEFuYWx5c2lzID0geyB1cmwsIGNvbnRleHRvLCBtZW5zYWplLCBmZWNoYTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQgPSBtZW5zYWplOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0RGl2Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIGd1YXJkYXJFbkhpc3RvcmlhbChjdXJyZW50QW5hbHlzaXMpOwogICAgICByZW5kZXJIaXN0b3JpYWwoKTsKICAgIH0gY2F0Y2goZXJyKSB7CiAgICAgIGFsZXJ0KCdFcnJvciBhbCBsbGFtYXIgYSBsYSBBUEk6ICcgKyBlcnIubWVzc2FnZSk7CiAgICB9IGZpbmFsbHkgewogICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmdEaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfQogIH07CgogIHdpbmRvdy5yZWdlbmVyYXIgPSBmdW5jdGlvbigpIHsKICAgIHdpbmRvdy5hbmFsaXphcigpOwogIH07CgogIGFzeW5jIGZ1bmN0aW9uIGxsYW1hckNsYXVkZSh1cmwsIGNvbnRleHRvLCBhcGlLZXkpIHsKICAgIGNvbnN0IHByb21wdCA9IGNvbnN0cnVpclByb21wdCh1cmwsIGNvbnRleHRvKTsKICAgIAogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHsKICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICd4LWFwaS1rZXknOiBhcGlLZXksCiAgICAgICAgJ2FudGhyb3BpYy12ZXJzaW9uJzogJzIwMjMtMDYtMDEnLAogICAgICAgICdhbnRocm9waWMtZGFuZ2Vyb3VzLWRpcmVjdC1icm93c2VyLWFjY2Vzcyc6ICd0cnVlJwogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgbW9kZWw6ICdjbGF1ZGUtb3B1cy00LTUnLAogICAgICAgIG1heF90b2tlbnM6IDEwMjQsCiAgICAgICAgbWVzc2FnZXM6IFt7CiAgICAgICAgICByb2xlOiAndXNlcicsCiAgICAgICAgICBjb250ZW50OiBwcm9tcHQKICAgICAgICB9XQogICAgICB9KQogICAgfSk7CgogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZXJyb3I\/Lm1lc3NhZ2UgfHwgJ0Vycm9yIEhUVFAgJyArIHJlc3BvbnNlLnN0YXR1cyk7CiAgICB9CgogICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgIHJldHVybiBkYXRhLmNvbnRlbnRbMF0udGV4dDsKICB9CgogIGZ1bmN0aW9uIGNvbnN0cnVpclByb21wdCh1cmwsIGNvbnRleHRvKSB7CiAgICByZXR1cm4gYEVyZXMgZWwgYXNpc3RlbnRlIGRlIFdQUmVjb3Zlci5jbCwgdW5hIGFnZW5jaWEgY2hpbGVuYSBlc3BlY2lhbGl6YWRhIGVuIHJlY3VwZXJhY2nDs24geSBtYW50ZW5pbWllbnRvIGRlIHNpdGlvcyBXb3JkUHJlc3MuCgpUdSB0YXJlYTogZ2VuZXJhciB1biBtZW5zYWplIHByb2Zlc2lvbmFsIHkgY2VyY2FubyAoZW4gZXNwYcOxb2wgY2hpbGVubywgZXN0aWxvIFdoYXRzQXBwKSBwYXJhIGVudmlhcmxlIGFsIGR1ZcOxbyBkZWwgc2l0aW8gV29yZFByZXNzICR7dXJsfSwgb2ZyZWNpZW5kbyBsb3Mgc2VydmljaW9zIGRlIGRpYWduw7NzdGljbyB5IHJlY3VwZXJhY2nDs24gZGUgV1BSZWNvdmVyLmNsLgoKRWwgbWVuc2FqZSBkZWJlOgoxLiBTYWx1ZGFyIGRlIGZvcm1hIGFtaWdhYmxlIHkgZGlyZWN0YQoyLiBNb3N0cmFyIHF1ZSBpZGVudGlmaWNhc3RlIGVsIHNpdGlvIHkgc3UgZXN0YWRvIChXb3JkUHJlc3MpCjMuIE1lbmNpb25hciBwb3NpYmxlcyBwcm9ibGVtYXMgY29tdW5lcyBxdWUgcG9kcsOtYW4gZXN0YXIgYWZlY3RhbmRvIHN1IHNpdGlvICh2ZWxvY2lkYWQsIHNlZ3VyaWRhZCwgYWN0dWFsaXphY2lvbmVzLCBlcnJvcmVzLCBldGMuKQo0LiBQcmVzZW50YXIgYnJldmVtZW50ZSBsb3Mgc2VydmljaW9zIGRlIFdQUmVjb3Zlci5jbCAocmVjdXBlcmFjacOzbiBkZSBzaXRpb3MgY2HDrWRvcywgbWFudGVuaW1pZW50bywgb3B0aW1pemFjacOzbiwgc2VndXJpZGFkKQo1LiBJbmNsdWlyIHVuYSBsbGFtYWRhIGEgbGEgYWNjacOzbiBjb25jcmV0YSAoYWdlbmRhciBkaWFnbsOzc3RpY28gZ3JhdHVpdG8sIHJlc3BvbmRlciBhbCBtZW5zYWplKQo2LiBUZW5lciB1biB0b25vIHByb2Zlc2lvbmFsIHBlcm8gY2VyY2Fubywgbm8gZGVtYXNpYWRvIGZvcm1hbCBuaSBjb21lcmNpYWwKNy4gU2VyIGNvbmNpc28gKG3DoXhpbW8gMjAwIHBhbGFicmFzKQo4LiBJbmNsdWlyIGFsIGZpbmFsOiAiV1BSZWNvdmVyLmNsIHwgd3ByZWNvdmVyLmNsIgoKJHtjb250ZXh0byA\/ICdDb250ZXh0byBhZGljaW9uYWwgZGVsIGNsaWVudGU6ICcgKyBjb250ZXh0byA6ICcnfQoKR2VuZXJhIFNPTE8gZWwgbWVuc2FqZSwgc2luIGV4cGxpY2FjaW9uZXMgbmkgY29tZW50YXJpb3MgYWRpY2lvbmFsZXMuIEVsIG1lbnNhamUgZGViZSBlc3RhciBsaXN0byBwYXJhIGNvcGlhciB5IGVudmlhciBwb3IgV2hhdHNBcHAuYDsKICB9CgogIHdpbmRvdy5jb3BpYXJNZW5zYWplID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXh0byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQ7CiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0bykudGhlbigoKSA9PiB7CiAgICAgIGNvbnN0IGJ0biA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc3Qgb3JpZyA9IGJ0bi50ZXh0Q29udGVudDsKICAgICAgYnRuLnRleHRDb250ZW50ID0gJ+KchSBDb3BpYWRvISc7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSBvcmlnOyB9LCAyMDAwKTsKICAgIH0pOwogIH07CgogIHdpbmRvdy5lbnZpYXJXQSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGV4dG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0VGV4dCcpLnRleHRDb250ZW50OwogICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0byk7CiAgICB3aW5kb3cub3BlbignaHR0cHM6Ly93YS5tZS8\/dGV4dD0nICsgZW5jb2RlZCwgJ19ibGFuaycpOwogIH07CgogIC8vIEhpc3RvcmlhbAogIGZ1bmN0aW9uIGdldEhpc3RvcmlhbCgpIHsKICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKSkgfHwgW107IH0KICAgIGNhdGNoKGUpIHsgcmV0dXJuIFtdOyB9CiAgfQoKICBmdW5jdGlvbiBndWFyZGFyRW5IaXN0b3JpYWwoaXRlbSkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgaGlzdC51bnNoaWZ0KGl0ZW0pOwogICAgY29uc3QgbWF4SXRlbXMgPSA1MDsKICAgIGlmIChoaXN0Lmxlbmd0aCA+IG1heEl0ZW1zKSBoaXN0LnNwbGljZShtYXhJdGVtcyk7CiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoaGlzdCkpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVySGlzdG9yaWFsKCkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcmlhbERpdicpOwogICAgaWYgKCFoaXN0Lmxlbmd0aCkgewogICAgICBkaXYuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJ3cHItZW1wdHkiPkHDum4gbm8gaGF5IGFuw6FsaXNpcyByZWFsaXphZG9zLjwvcD4nOwogICAgICByZXR1cm47CiAgICB9CiAgICBkaXYuaW5uZXJIVE1MID0gaGlzdC5tYXAoKGl0ZW0sIGkpID0+IGAKICAgICAgPGRpdiBjbGFzcz0id3ByLWhpc3RvcnktaXRlbSIgb25jbGljaz0idmVySGlzdG9yaWFsKCR7aX0pIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cHItaGlzdG9yeS11cmwiPvCfjJAgJHtpdGVtLnVybH08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cHItaGlzdG9yeS1kYXRlIj4ke2Zvcm1hdEZlY2hhKGl0ZW0uZmVjaGEpfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Indwci1oaXN0b3J5LXByZXZpZXciPiR7aXRlbS5tZW5zYWplLnN1YnN0cmluZygwLCAxMjApfS4uLjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGApLmpvaW4oJycpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0RmVjaGEoaXNvKSB7CiAgICBjb25zdCBkID0gbmV3IERhdGUoaXNvKTsKICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZXMtQ0wnLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJzItZGlnaXQnLCB5ZWFyOiAnbnVtZXJpYycsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSk7CiAgfQoKICB3aW5kb3cudmVySGlzdG9yaWFsID0gZnVuY3Rpb24oaSkgewogICAgY29uc3QgaGlzdCA9IGdldEhpc3RvcmlhbCgpOwogICAgbW9kYWxEYXRhID0gaGlzdFtpXTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbFVybCcpLnRleHRDb250ZW50ID0gJ\/CfjJAgJyArIG1vZGFsRGF0YS51cmw7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWxEYXRlJykudGV4dENvbnRlbnQgPSBmb3JtYXRGZWNoYShtb2RhbERhdGEuZmVjaGEpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsUmVzdWx0JykudGV4dENvbnRlbnQgPSBtb2RhbERhdGEubWVuc2FqZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxNb2RhbCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIH07CgogIHdpbmRvdy5jZXJyYXJNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpc3RvcmlhbE1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICBtb2RhbERhdGEgPSBudWxsOwogIH07CgogIHdpbmRvdy5jb3BpYXJEZXNkZU1vZGFsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIW1vZGFsRGF0YSkgcmV0dXJuOwogICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQobW9kYWxEYXRhLm1lbnNhamUpLnRoZW4oKCkgPT4gewogICAgICBjb25zdCBidG4gPSBldmVudC50YXJnZXQ7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICfinIUgQ29waWFkbyEnOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ\/Cfk4sgQ29waWFyJzsgfSwgMjAwMCk7CiAgICB9KTsKICB9OwoKICB3aW5kb3cuZW52aWFyV0FNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFtb2RhbERhdGEpIHJldHVybjsKICAgIHdpbmRvdy5vcGVuKCdodHRwczovL3dhLm1lLz90ZXh0PScgKyBlbmNvZGVVUklDb21wb25lbnQobW9kYWxEYXRhLm1lbnNhamUpLCAnX2JsYW5rJyk7CiAgfTsKCiAgd2luZG93LmNhcmdhckVuRWRpdG9yID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIW1vZGFsRGF0YSkgcmV0dXJuOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybElucHV0JykudmFsdWUgPSBtb2RhbERhdGEudXJsOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRleHRvSW5wdXQnKS52YWx1ZSA9IG1vZGFsRGF0YS5jb250ZXh0byB8fCAnJzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRUZXh0JykudGV4dENvbnRlbnQgPSBtb2RhbERhdGEubWVuc2FqZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHREaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIGN1cnJlbnRBbmFseXNpcyA9IG1vZGFsRGF0YTsKICAgIGNlcnJhck1vZGFsKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsSW5wdXQnKS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKICB9OwoKICB3aW5kb3cubGltcGlhckhpc3RvcmlhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFjb25maXJtKCfCv1NlZ3VybyBxdWUgcXVpZXJlcyBib3JyYXIgdG9kbyBlbCBoaXN0b3JpYWw\/JykpIHJldHVybjsKICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZKTsKICAgIHJlbmRlckhpc3RvcmlhbCgpOwogIH07CgogIC8vIENlcnJhciBtb2RhbCBhbCBoYWNlciBjbGljayBmdWVyYQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxNb2RhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzKSBjZXJyYXJNb2RhbCgpOwogIH0pOwoKfSkoKTsKPC9zY3JpcHQ+CjwvZGl2PncJY29yZS9odG1sd\/N9PGRpdiBpZD0iYXVkaXRvci13cHItcm9vdCIgc3R5bGU9ImZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsgbWF4LXdpZHRoOiA5MDBweDsgbWFyZ2luOiAwIGF1dG87IHBhZGRpbmc6IDIwcHg7IGJhY2tncm91bmQ6ICNmMGY0Zjg7IG1pbi1oZWlnaHQ6IDEwMHZoOyI+Cgo8c3R5bGU+CiAgI2F1ZGl0b3Itd3ByLXJvb3QgKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0KICAjYXVkaXRvci13cHItcm9vdCBoMSB7IGNvbG9yOiAjMWEzNjVkOyBmb250LXNpemU6IDEuOGVtOyBtYXJnaW4tYm90dG9tOiA1cHg7IH0KICAjYXVkaXRvci13cHItcm9vdCAuc3VidGl0bGUgeyBjb2xvcjogIzRhNTU2ODsgbWFyZ2luLWJvdHRvbTogMjVweDsgZm9udC1zaXplOiAwLjk1ZW07IH0KICAud3ByLWNhcmQgeyBiYWNrZ3JvdW5kOiAjZmZmOyBib3JkZXItcmFkaXVzOiAxMnB4OyBwYWRkaW5nOiAyNHB4OyBtYXJnaW4tYm90dG9tOiAyMHB4OyBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLDAsMCwwLjA4KTsgfQogIC53cHItY2FyZCBoMiB7IGNvbG9yOiAjMmQzNzQ4OyBmb250LXNpemU6IDEuMWVtOyBtYXJnaW46IDAgMCAxNnB4IDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9CiAgLndwci1pbnB1dCB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlcjogMnB4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjk1ZW07IHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzOyB9CiAgLndwci1pbnB1dDpmb2N1cyB7IG91dGxpbmU6IG5vbmU7IGJvcmRlci1jb2xvcjogIzQyOTllMTsgfQogIC53cHItYnRuIHsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOTVlbTsgZm9udC13ZWlnaHQ6IDYwMDsgdHJhbnNpdGlvbjogYWxsIDAuMnM7IH0KICAud3ByLWJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogIzMxODJjZTsgY29sb3I6IHdoaXRlOyB9CiAgLndwci1idG4tcHJpbWFyeTpob3ZlciB7IGJhY2tncm91bmQ6ICMyYjZjYjA7IH0KICAud3ByLWJ0bi1wcmltYXJ5OmRpc2FibGVkIHsgYmFja2dyb3VuZDogIzkwY2RmNDsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfQogIC53cHItYnRuLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiAjMzhhMTY5OyBjb2xvcjogd2hpdGU7IH0KICAud3ByLWJ0bi1zdWNjZXNzOmhvdmVyIHsgYmFja2dyb3VuZDogIzI3Njc0OTsgfQogIC53cHItYnRuLXdhIHsgYmFja2dyb3VuZDogIzI1ZDM2NjsgY29sb3I6IHdoaXRlOyB9CiAgLndwci1idG4td2E6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMTI4YzdlOyB9CiAgLndwci1idG4tZGFuZ2VyIHsgYmFja2dyb3VuZDogI2U1M2UzZTsgY29sb3I6IHdoaXRlOyBmb250LXNpemU6IDAuOGVtOyBwYWRkaW5nOiA2cHggMTJweDsgfQogIC53cHItYnRuLWRhbmdlcjpob3ZlciB7IGJhY2tncm91bmQ6ICNjNTMwMzA7IH0KICAud3ByLWJ0bi1zbSB7IGZvbnQtc2l6ZTogMC44ZW07IHBhZGRpbmc6IDZweCAxMnB4OyB9CiAgLndwci1mbGV4IHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7IH0KICAud3ByLXJlc3VsdCB7IGJhY2tncm91bmQ6ICNmN2ZhZmM7IGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMTZweDsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LXNpemU6IDAuOWVtOyBsaW5lLWhlaWdodDogMS42OyBtaW4taGVpZ2h0OiAxMDBweDsgY29sb3I6ICMyZDM3NDg7IH0KICAud3ByLWxvYWRpbmcgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGNvbG9yOiAjNGE1NTY4OyBmb250LXNpemU6IDAuOWVtOyB9CiAgLndwci1zcGlubmVyIHsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgYm9yZGVyOiAzcHggc29saWQgI2UyZThmMDsgYm9yZGVyLXRvcC1jb2xvcjogIzMxODJjZTsgYm9yZGVyLXJhZGl1czogNTAlOyBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7IH0KICBAa2V5ZnJhbWVzIHNwaW4geyB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfQogIC53cHItaGlzdG9yeS1pdGVtIHsgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDsgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IG1hcmdpbi1ib3R0b206IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOyB9CiAgLndwci1oaXN0b3J5LWl0ZW06aG92ZXIgeyBiYWNrZ3JvdW5kOiAjZWJmOGZmOyB9CiAgLndwci1oaXN0b3J5LXVybCB7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMmI2Y2IwOyBmb250LXNpemU6IDAuOWVtOyB9CiAgLndwci1oaXN0b3J5LWRhdGUgeyBmb250LXNpemU6IDAuNzVlbTsgY29sb3I6ICM3MTgwOTY7IG1hcmdpbi10b3A6IDNweDsgfQogIC53cHItaGlzdG9yeS1wcmV2aWV3IHsgZm9udC1zaXplOiAwLjgyZW07IGNvbG9yOiAjNGE1NTY4OyBtYXJnaW4tdG9wOiA2cHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9CiAgLndwci1lbXB0eSB7IGNvbG9yOiAjYTBhZWMwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7IGZvbnQtc2l6ZTogMC45ZW07IH0KICAud3ByLWFwaS1yb3cgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KICAud3ByLWFwaS1zdGF0dXMgeyBmb250LXNpemU6IDAuOGVtOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMjBweDsgZm9udC13ZWlnaHQ6IDYwMDsgfQogIC53cHItYXBpLW9rIHsgYmFja2dyb3VuZDogI2M2ZjZkNTsgY29sb3I6ICMyNzY3NDk7IH0KICAud3ByLWFwaS1taXNzaW5nIHsgYmFja2dyb3VuZDogI2ZlZDdkNzsgY29sb3I6ICNjNTMwMzA7IH0KICAud3ByLXRhZyB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZDogI2ViZjhmZjsgY29sb3I6ICMyYjZjYjA7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMnB4IDhweDsgZm9udC1zaXplOiAwLjc4ZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1yaWdodDogNHB4OyB9CiAgLndwci1tb2RhbCB7IGRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNSk7IHotaW5kZXg6IDk5OTk7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyB9CiAgLndwci1tb2RhbC5hY3RpdmUgeyBkaXNwbGF5OiBmbGV4OyB9CiAgLndwci1tb2RhbC1ib3ggeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMTJweDsgcGFkZGluZzogMjhweDsgbWF4LXdpZHRoOiA2MDBweDsgd2lkdGg6IDkwJTsgbWF4LWhlaWdodDogODB2aDsgb3ZlcmZsb3cteTogYXV0bzsgfQogIC53cHItbW9kYWwtYm94IGgzIHsgbWFyZ2luOiAwIDAgMTJweCAwOyBjb2xvcjogIzFhMzY1ZDsgfQogIC53cHItbW9kYWwtcmVzdWx0IHsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LXNpemU6IDAuODhlbTsgbGluZS1oZWlnaHQ6IDEuNjsgY29sb3I6ICMyZDM3NDg7IGJhY2tncm91bmQ6ICNmN2ZhZmM7IHBhZGRpbmc6IDE2cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgbWF4LWhlaWdodDogMzAwcHg7IG92ZXJmbG93LXk6IGF1dG87IH0KICAud3ByLW1vZGFsLWZvb3RlciB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogMTZweDsgZmxleC13cmFwOiB3cmFwOyB9CiAgLndwci1jbG9zZS1idG4geyBiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwOyBjb2xvcjogIzRhNTU2ODsgfQogIC53cHItY2xvc2UtYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogI2Y3ZmFmYzsgfQogIHRleHRhcmVhLndwci1pbnB1dCB7IG1pbi1oZWlnaHQ6IDgwcHg7IHJlc2l6ZTogdmVydGljYWw7IH0KICAud3ByLXNlY3Rpb24tdGl0bGUgeyBmb250LXNpemU6IDAuNzhlbTsgZm9udC13ZWlnaHQ6IDcwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsgY29sb3I6ICM3MTgwOTY7IG1hcmdpbi1ib3R0b206IDhweDsgfQo8L3N0eWxlPgoKPGgxPvCflI0gQXVkaXRvciBXUFI8L2gxPgo8cCBjbGFzcz0ic3VidGl0bGUiPkhlcnJhbWllbnRhIGludGVybmEgZGUgZGlhZ27Ds3N0aWNvIFdvcmRQcmVzcyDCtyBXUFJlY292ZXIuY2w8L3A+Cgo8IS0tIEFQSSBLZXkgQ2FyZCAtLT4KPGRpdiBjbGFzcz0id3ByLWNhcmQiIGlkPSJhcGktY2FyZCI+CiAgPGgyPvCflJEgQVBJIEtleSBkZSBBbnRocm9waWM8L2gyPgogIDxkaXYgY2xhc3M9Indwci1hcGktcm93Ij4KICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgaWQ9ImFwaUtleUlucHV0IiBjbGFzcz0id3ByLWlucHV0IiBwbGFjZWhvbGRlcj0ic2stYW50LWFwaTAzLTdSeXRMNngzMzFITTlLYlVqZ3lhS3ZQWVpLTGNneHExMm04R05fU3lMT1hvX2lSRFBRYXBIUUhXeFAyMkU3N2NVQ2Ntb0c2LWxfSXZzMlpRZHk3dElRLXozOTZmd0FBIiBzdHlsZT0iZmxleDoxIiAvPgogICAgPGJ1dHRvbiBjbGFzcz0id3ByLWJ0biB3cHItYnRuLXByaW1hcnkiIG9uY2xpY2s9InNhdmVBcGlLZXkoKSI+R3VhcmRhcjwvYnV0dG9uPgogICAgPHNwYW4gaWQ9ImFwaVN0YXR1cyIgY2xhc3M9Indwci1hcGktc3RhdHVzIHdwci1hcGktbWlzc2luZyI+U2luIGNsYXZlPC9zcGFuPgogIDwvZGl2PgogIDxwIHN0eWxlPSJmb250LXNpemU6MC43OGVtOyBjb2xvcjojNzE4MDk2OyBtYXJnaW46IDhweCAwIDAgMDsiPkxhIGNsYXZlIHNlIGd1YXJkYSBlbiBsb2NhbFN0b3JhZ2UgZGUgdHUgbmF2ZWdhZG9yIHkgcGVyc2lzdGUgZW50cmUgc2VzaW9uZXMuPC9wPgo8L2Rpdj4KCjwhLS0gQW7DoWxpc2lzIENhcmQgLS0+CjxkaXYgY2xhc3M9Indwci1jYXJkIj4KICA8aDI+8J+MkCBBbmFsaXphciBzaXRpbyBXb3JkUHJlc3M8L2gyPgogIDxkaXYgY2xhc3M9Indwci1zZWN0aW9uLXRpdGxlIj5VUkwgZGVsIGNsaWVudGU8L2Rpdj4KICA8ZGl2IGNsYXNzPSJ3cHItZmxleCIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDE0cHg7Ij4KICAgIDxpbnB1dCB0eXBlPSJ1cmwiIGlkPSJ1cmxJbnB1dCIgY2xhc3M9Indwci1pbnB1dCIgcGxhY2Vob2xkZXI9Imh0dHBzOi8vc2l0aW8tZGVsLWNsaWVudGUuY2wiIHN0eWxlPSJmbGV4OjEiIG9ua2V5cHJlc3M9ImlmKGV2ZW50LmtleT09PSdFbnRlcicpIGFuYWxpemFyKCkiIC8+CiAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tcHJpbWFyeSIgb25jbGljaz0iYW5hbGl6YXIoKSIgaWQ9ImJ0bkFuYWxpemFyIj7wn5SOIEFuYWxpemFyPC9idXR0b24+CiAgPC9kaXY+CgogIDxkaXYgY2xhc3M9Indwci1zZWN0aW9uLXRpdGxlIj5Db250ZXh0byBhZGljaW9uYWwgKG9wY2lvbmFsKTwvZGl2PgogIDx0ZXh0YXJlYSBpZD0iY29udGV4dG9JbnB1dCIgY2xhc3M9Indwci1pbnB1dCIgcGxhY2Vob2xkZXI9IkVqOiBFbCBjbGllbnRlIG1lIGNvbnRhY3TDsyBwb3IgV2hhdHNBcHAgZGljaWVuZG8gcXVlIHN1IHNpdGlvIG11ZXN0cmEgcGFudGFsbGEgYmxhbmNhLiBVc2EgV29yZFByZXNzIGNvbiBXb29Db21tZXJjZS4gSG9zdGluZyBlbiBIb3N0R2F0b3IuIj48L3RleHRhcmVhPgoKICA8ZGl2IGlkPSJsb2FkaW5nRGl2IiBzdHlsZT0iZGlzcGxheTpub25lOyBtYXJnaW4tdG9wOjE0cHg7Ij4KICAgIDxkaXYgY2xhc3M9Indwci1sb2FkaW5nIj48ZGl2IGNsYXNzPSJ3cHItc3Bpbm5lciI+PC9kaXY+IEFuYWxpemFuZG8gY29uIENsYXVkZS4uLiBwb3IgZmF2b3IgZXNwZXJhLjwvZGl2PgogIDwvZGl2PgoKICA8ZGl2IGlkPSJyZXN1bHREaXYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6MTRweDsiPgogICAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPk1lbnNhamUgZ2VuZXJhZG88L2Rpdj4KICAgIDxkaXYgY2xhc3M9Indwci1yZXN1bHQiIGlkPSJyZXN1bHRUZXh0Ij48L2Rpdj4KICAgIDxkaXYgY2xhc3M9Indwci1mbGV4IiBzdHlsZT0ibWFyZ2luLXRvcDogMTJweDsiPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tc3VjY2VzcyIgb25jbGljaz0iY29waWFyTWVuc2FqZSgpIj7wn5OLIENvcGlhcjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4td2EiIG9uY2xpY2s9ImVudmlhcldBKCkiPvCfkqwgRW52aWFyIHBvciBXaGF0c0FwcDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tcHJpbWFyeSB3cHItYnRuLXNtIiBvbmNsaWNrPSJyZWdlbmVyYXIoKSI+8J+UhCBSZWdlbmVyYXI8L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjwhLS0gSGlzdG9yaWFsIENhcmQgLS0+CjxkaXYgY2xhc3M9Indwci1jYXJkIj4KICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczpjZW50ZXI7IG1hcmdpbi1ib3R0b206MTRweDsiPgogICAgPGgyIHN0eWxlPSJtYXJnaW46MDsiPvCfk4sgSGlzdG9yaWFsIGRlIGFuw6FsaXNpczwvaDI+CiAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tZGFuZ2VyIHdwci1idG4tc20iIG9uY2xpY2s9ImxpbXBpYXJIaXN0b3JpYWwoKSI+8J+Xke+4jyBMaW1waWFyIHRvZG88L2J1dHRvbj4KICA8L2Rpdj4KICA8ZGl2IGlkPSJoaXN0b3JpYWxEaXYiPgogICAgPHAgY2xhc3M9Indwci1lbXB0eSI+QcO6biBubyBoYXkgYW7DoWxpc2lzIHJlYWxpemFkb3MuPC9wPgogIDwvZGl2Pgo8L2Rpdj4KCjwhLS0gTW9kYWwgcGFyYSB2ZXIgaGlzdG9yaWFsIC0tPgo8ZGl2IGNsYXNzPSJ3cHItbW9kYWwiIGlkPSJoaXN0b3JpYWxNb2RhbCI+CiAgPGRpdiBjbGFzcz0id3ByLW1vZGFsLWJveCI+CiAgICA8aDMgaWQ9Im1vZGFsVXJsIj5VUkw8L2gzPgogICAgPGRpdiBjbGFzcz0id3ByLXNlY3Rpb24tdGl0bGUiIGlkPSJtb2RhbERhdGUiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0id3ByLW1vZGFsLXJlc3VsdCIgaWQ9Im1vZGFsUmVzdWx0Ij48L2Rpdj4KICAgIDxkaXYgY2xhc3M9Indwci1tb2RhbC1mb290ZXIiPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tc3VjY2VzcyIgb25jbGljaz0iY29waWFyRGVzZGVNb2RhbCgpIj7wn5OLIENvcGlhcjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4td2EiIG9uY2xpY2s9ImVudmlhcldBTW9kYWwoKSI+8J+SrCBXaGF0c0FwcDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1idG4tcHJpbWFyeSB3cHItYnRuLXNtIiBvbmNsaWNrPSJjYXJnYXJFbkVkaXRvcigpIj7inI\/vuI8gQ2FyZ2FyIGVuIGVkaXRvcjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJ3cHItYnRuIHdwci1jbG9zZS1idG4iIG9uY2xpY2s9ImNlcnJhck1vZGFsKCkiPuKclSBDZXJyYXI8L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQ+CihmdW5jdGlvbigpIHsKCiAgY29uc3QgU1RPUkFHRV9LRVkgPSAnd3ByX2hpc3RvcmlhbCc7CiAgY29uc3QgQVBJX0tFWV9TVE9SQUdFID0gJ3dwcl9hcGlfa2V5JzsKICBsZXQgY3VycmVudEFuYWx5c2lzID0gbnVsbDsKICBsZXQgbW9kYWxEYXRhID0gbnVsbDsKCiAgLy8gSW5pY2lhbGl6YXIKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7CiAgICBpbml0QXBpS2V5KCk7CiAgICByZW5kZXJIaXN0b3JpYWwoKTsKICB9KTsKICAvLyBUYW1iacOpbiBlamVjdXRhciBzaSBlbCBET00geWEgZXN0w6EgbGlzdG8KICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7CiAgICBpbml0QXBpS2V5KCk7CiAgICByZW5kZXJIaXN0b3JpYWwoKTsKICB9CgogIGZ1bmN0aW9uIGluaXRBcGlLZXkoKSB7CiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFQSV9LRVlfU1RPUkFHRSk7CiAgICBpZiAoc2F2ZWQpIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwaUtleUlucHV0JykudmFsdWUgPSBzYXZlZDsKICAgICAgdXBkYXRlQXBpU3RhdHVzKHRydWUpOwogICAgfQogIH0KCiAgd2luZG93LnNhdmVBcGlLZXkgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IGtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcGlLZXlJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgIGlmICgha2V5KSB7IGFsZXJ0KCdQb3IgZmF2b3IgaW5ncmVzYSBsYSBBUEkga2V5LicpOyByZXR1cm47IH0KICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoJ3NrLWFudC0nKSkgewogICAgICBpZiAoIWNvbmZpcm0oJ0xhIGNsYXZlIG5vIGVtcGllemEgY29uICJzay1hbnQtIi4gwr9EZXNlYXMgZ3VhcmRhcmxhIGlndWFsbWVudGU\/JykpIHJldHVybjsKICAgIH0KICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFQSV9LRVlfU1RPUkFHRSwga2V5KTsKICAgIHVwZGF0ZUFwaVN0YXR1cyh0cnVlKTsKICAgIGFsZXJ0KCfinIUgQVBJIGtleSBndWFyZGFkYSBjb3JyZWN0YW1lbnRlLicpOwogIH07CgogIGZ1bmN0aW9uIHVwZGF0ZUFwaVN0YXR1cyhvaykgewogICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBpU3RhdHVzJyk7CiAgICBpZiAob2spIHsKICAgICAgZWwudGV4dENvbnRlbnQgPSAn4pyTIEFjdGl2YSc7CiAgICAgIGVsLmNsYXNzTmFtZSA9ICd3cHItYXBpLXN0YXR1cyB3cHItYXBpLW9rJzsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnRleHRDb250ZW50ID0gJ1NpbiBjbGF2ZSc7CiAgICAgIGVsLmNsYXNzTmFtZSA9ICd3cHItYXBpLXN0YXR1cyB3cHItYXBpLW1pc3NpbmcnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0QXBpS2V5KCkgewogICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFQSV9LRVlfU1RPUkFHRSkgfHwgJyc7CiAgfQoKICB3aW5kb3cuYW5hbGl6YXIgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmxJbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgIGNvbnN0IGNvbnRleHRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRleHRvSW5wdXQnKS52YWx1ZS50cmltKCk7CiAgICBjb25zdCBhcGlLZXkgPSBnZXRBcGlLZXkoKTsKCiAgICBpZiAoIXVybCkgeyBhbGVydCgnUG9yIGZhdm9yIGluZ3Jlc2EgbGEgVVJMIGRlbCBjbGllbnRlLicpOyByZXR1cm47IH0KICAgIGlmICghYXBpS2V5KSB7IGFsZXJ0KCdQcmltZXJvIGRlYmVzIGd1YXJkYXIgdHUgQVBJIGtleSBkZSBBbnRocm9waWMuJyk7IHJldHVybjsgfQoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5BbmFsaXphcicpOwogICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nRGl2Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0RGl2Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICB0cnkgewogICAgICBjb25zdCBtZW5zYWplID0gYXdhaXQgbGxhbWFyQ2xhdWRlKHVybCwgY29udGV4dG8sIGFwaUtleSk7CiAgICAgIGN1cnJlbnRBbmFseXNpcyA9IHsgdXJsLCBjb250ZXh0bywgbWVuc2FqZSwgZmVjaGE6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9OwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0VGV4dCcpLnRleHRDb250ZW50ID0gbWVuc2FqZTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdERpdicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICBndWFyZGFyRW5IaXN0b3JpYWwoY3VycmVudEFuYWx5c2lzKTsKICAgICAgcmVuZGVySGlzdG9yaWFsKCk7CiAgICB9IGNhdGNoKGVycikgewogICAgICBhbGVydCgnRXJyb3IgYWwgbGxhbWFyIGEgbGEgQVBJOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgfSBmaW5hbGx5IHsKICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nRGl2Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KICB9OwoKICB3aW5kb3cucmVnZW5lcmFyID0gZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cuYW5hbGl6YXIoKTsKICB9OwoKICBhc3luYyBmdW5jdGlvbiBsbGFtYXJDbGF1ZGUodXJsLCBjb250ZXh0bywgYXBpS2V5KSB7CiAgICBjb25zdCBwcm9tcHQgPSBjb25zdHJ1aXJQcm9tcHQodXJsLCBjb250ZXh0byk7CiAgICAKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMnLCB7CiAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAneC1hcGkta2V5JzogYXBpS2V5LAogICAgICAgICdhbnRocm9waWMtdmVyc2lvbic6ICcyMDIzLTA2LTAxJywKICAgICAgICAnYW50aHJvcGljLWRhbmdlcm91cy1kaXJlY3QtYnJvd3Nlci1hY2Nlc3MnOiAndHJ1ZScKICAgICAgfSwKICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgIG1vZGVsOiAnY2xhdWRlLW9wdXMtNC01JywKICAgICAgICBtYXhfdG9rZW5zOiAxMDI0LAogICAgICAgIG1lc3NhZ2VzOiBbewogICAgICAgICAgcm9sZTogJ3VzZXInLAogICAgICAgICAgY29udGVudDogcHJvbXB0CiAgICAgICAgfV0KICAgICAgfSkKICAgIH0pOwoKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOwogICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBIVFRQICcgKyByZXNwb25zZS5zdGF0dXMpOwogICAgfQoKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICByZXR1cm4gZGF0YS5jb250ZW50WzBdLnRleHQ7CiAgfQoKICBmdW5jdGlvbiBjb25zdHJ1aXJQcm9tcHQodXJsLCBjb250ZXh0bykgewogICAgcmV0dXJuIGBFcmVzIGVsIGFzaXN0ZW50ZSBkZSBXUFJlY292ZXIuY2wsIHVuYSBhZ2VuY2lhIGNoaWxlbmEgZXNwZWNpYWxpemFkYSBlbiByZWN1cGVyYWNpw7NuIHkgbWFudGVuaW1pZW50byBkZSBzaXRpb3MgV29yZFByZXNzLgoKVHUgdGFyZWE6IGdlbmVyYXIgdW4gbWVuc2FqZSBwcm9mZXNpb25hbCB5IGNlcmNhbm8gKGVuIGVzcGHDsW9sIGNoaWxlbm8sIGVzdGlsbyBXaGF0c0FwcCkgcGFyYSBlbnZpYXJsZSBhbCBkdWXDsW8gZGVsIHNpdGlvIFdvcmRQcmVzcyAke3VybH0sIG9mcmVjaWVuZG8gbG9zIHNlcnZpY2lvcyBkZSBkaWFnbsOzc3RpY28geSByZWN1cGVyYWNpw7NuIGRlIFdQUmVjb3Zlci5jbC4KCkVsIG1lbnNhamUgZGViZToKMS4gU2FsdWRhciBkZSBmb3JtYSBhbWlnYWJsZSB5IGRpcmVjdGEKMi4gTW9zdHJhciBxdWUgaWRlbnRpZmljYXN0ZSBlbCBzaXRpbyB5IHN1IGVzdGFkbyAoV29yZFByZXNzKQozLiBNZW5jaW9uYXIgcG9zaWJsZXMgcHJvYmxlbWFzIGNvbXVuZXMgcXVlIHBvZHLDrWFuIGVzdGFyIGFmZWN0YW5kbyBzdSBzaXRpbyAodmVsb2NpZGFkLCBzZWd1cmlkYWQsIGFjdHVhbGl6YWNpb25lcywgZXJyb3JlcywgZXRjLikKNC4gUHJlc2VudGFyIGJyZXZlbWVudGUgbG9zIHNlcnZpY2lvcyBkZSBXUFJlY292ZXIuY2wgKHJlY3VwZXJhY2nDs24gZGUgc2l0aW9zIGNhw61kb3MsIG1hbnRlbmltaWVudG8sIG9wdGltaXphY2nDs24sIHNlZ3VyaWRhZCkKNS4gSW5jbHVpciB1bmEgbGxhbWFkYSBhIGxhIGFjY2nDs24gY29uY3JldGEgKGFnZW5kYXIgZGlhZ27Ds3N0aWNvIGdyYXR1aXRvLCByZXNwb25kZXIgYWwgbWVuc2FqZSkKNi4gVGVuZXIgdW4gdG9ubyBwcm9mZXNpb25hbCBwZXJvIGNlcmNhbm8sIG5vIGRlbWFzaWFkbyBmb3JtYWwgbmkgY29tZXJjaWFsCjcuIFNlciBjb25jaXNvIChtw6F4aW1vIDIwMCBwYWxhYnJhcykKOC4gSW5jbHVpciBhbCBmaW5hbDogIldQUmVjb3Zlci5jbCB8IHdwcmVjb3Zlci5jbCIKCiR7Y29udGV4dG8gPyAnQ29udGV4dG8gYWRpY2lvbmFsIGRlbCBjbGllbnRlOiAnICsgY29udGV4dG8gOiAnJ30KCkdlbmVyYSBTT0xPIGVsIG1lbnNhamUsIHNpbiBleHBsaWNhY2lvbmVzIG5pIGNvbWVudGFyaW9zIGFkaWNpb25hbGVzLiBFbCBtZW5zYWplIGRlYmUgZXN0YXIgbGlzdG8gcGFyYSBjb3BpYXIgeSBlbnZpYXIgcG9yIFdoYXRzQXBwLmA7CiAgfQoKICB3aW5kb3cuY29waWFyTWVuc2FqZSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGV4dG8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0VGV4dCcpLnRleHRDb250ZW50OwogICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dG8pLnRoZW4oKCkgPT4gewogICAgICBjb25zdCBidG4gPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnN0IG9yaWcgPSBidG4udGV4dENvbnRlbnQ7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICfinIUgQ29waWFkbyEnOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gb3JpZzsgfSwgMjAwMCk7CiAgICB9KTsKICB9OwoKICB3aW5kb3cuZW52aWFyV0EgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRleHRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdFRleHQnKS50ZXh0Q29udGVudDsKICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQodGV4dG8pOwogICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vd2EubWUvP3RleHQ9JyArIGVuY29kZWQsICdfYmxhbmsnKTsKICB9OwoKICAvLyBIaXN0b3JpYWwKICBmdW5jdGlvbiBnZXRIaXN0b3JpYWwoKSB7CiAgICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSkpIHx8IFtdOyB9CiAgICBjYXRjaChlKSB7IHJldHVybiBbXTsgfQogIH0KCiAgZnVuY3Rpb24gZ3VhcmRhckVuSGlzdG9yaWFsKGl0ZW0pIHsKICAgIGNvbnN0IGhpc3QgPSBnZXRIaXN0b3JpYWwoKTsKICAgIGhpc3QudW5zaGlmdChpdGVtKTsKICAgIGNvbnN0IG1heEl0ZW1zID0gNTA7CiAgICBpZiAoaGlzdC5sZW5ndGggPiBtYXhJdGVtcykgaGlzdC5zcGxpY2UobWF4SXRlbXMpOwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGhpc3QpKTsKICB9CgogIGZ1bmN0aW9uIHJlbmRlckhpc3RvcmlhbCgpIHsKICAgIGNvbnN0IGhpc3QgPSBnZXRIaXN0b3JpYWwoKTsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxEaXYnKTsKICAgIGlmICghaGlzdC5sZW5ndGgpIHsKICAgICAgZGl2LmlubmVySFRNTCA9ICc8cCBjbGFzcz0id3ByLWVtcHR5Ij5Bw7puIG5vIGhheSBhbsOhbGlzaXMgcmVhbGl6YWRvcy48L3A+JzsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGl2LmlubmVySFRNTCA9IGhpc3QubWFwKChpdGVtLCBpKSA9PiBgCiAgICAgIDxkaXYgY2xhc3M9Indwci1oaXN0b3J5LWl0ZW0iIG9uY2xpY2s9InZlckhpc3RvcmlhbCgke2l9KSI+CiAgICAgICAgPGRpdiBjbGFzcz0id3ByLWhpc3RvcnktdXJsIj7wn4yQICR7aXRlbS51cmx9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0id3ByLWhpc3RvcnktZGF0ZSI+JHtmb3JtYXRGZWNoYShpdGVtLmZlY2hhKX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ3cHItaGlzdG9yeS1wcmV2aWV3Ij4ke2l0ZW0ubWVuc2FqZS5zdWJzdHJpbmcoMCwgMTIwKX0uLi48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgKS5qb2luKCcnKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdEZlY2hhKGlzbykgewogICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7CiAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VzLUNMJywgeyBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICcyLWRpZ2l0JywgeWVhcjogJ251bWVyaWMnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOwogIH0KCiAgd2luZG93LnZlckhpc3RvcmlhbCA9IGZ1bmN0aW9uKGkpIHsKICAgIGNvbnN0IGhpc3QgPSBnZXRIaXN0b3JpYWwoKTsKICAgIG1vZGFsRGF0YSA9IGhpc3RbaV07CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWxVcmwnKS50ZXh0Q29udGVudCA9ICfwn4yQICcgKyBtb2RhbERhdGEudXJsOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsRGF0ZScpLnRleHRDb250ZW50ID0gZm9ybWF0RmVjaGEobW9kYWxEYXRhLmZlY2hhKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbFJlc3VsdCcpLnRleHRDb250ZW50ID0gbW9kYWxEYXRhLm1lbnNhamU7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlzdG9yaWFsTW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICB9OwoKICB3aW5kb3cuY2VycmFyTW9kYWwgPSBmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXN0b3JpYWxNb2RhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgbW9kYWxEYXRhID0gbnVsbDsKICB9OwoKICB3aW5kb3cuY29waWFyRGVzZGVNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFtb2RhbERhdGEpIHJldHVybjsKICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KG1vZGFsRGF0YS5tZW5zYWplKS50aGVuKCgpID0+IHsKICAgICAgY29uc3QgYnRuID0gZXZlbnQudGFyZ2V0OwogICAgICBidG4udGV4dENvbnRlbnQgPSAn4pyFIENvcGlhZG8hJzsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICfwn5OLIENvcGlhcic7IH0sIDIwMDApOwogICAgfSk7CiAgfTsKCiAgd2luZG93LmVudmlhcldBTW9kYWwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghbW9kYWxEYXRhKSByZXR1cm47CiAgICB3aW5kb3cub3BlbignaHR0cHM6Ly93YS5tZS8\/dGV4dD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vZGFsRGF0YS5tZW5zYWplKSwgJ19ibGFuaycpOwogIH07CgogIHdpbmRvdy5jYXJnYXJFbkVkaXRvciA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFtb2RhbERhdGEpIHJldHVybjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmxJbnB1dCcpLnZhbHVlID0gbW9kYWxEYXRhLnVybDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZXh0b0lucHV0JykudmFsdWUgPSBtb2RhbERhdGEuY29udGV4dG8gfHwgJyc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0VGV4dCcpLnRleHRDb250ZW50ID0gbW9kYWxEYXRhLm1lbnNhamU7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0RGl2Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBjdXJyZW50QW5hbHlzaXMgPSBtb2RhbERhdGE7CiAgICBjZXJyYXJNb2RhbCgpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybElucHV0Jykuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7CiAgfTsKCiAgd2luZG93LmxpbXBpYXJIaXN0b3JpYWwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghY29uZmlybSgnwr9TZWd1cm8gcXVlIHF1aWVyZXMgYm9ycmFyIHRvZG8gZWwgaGlzdG9yaWFsPycpKSByZXR1cm47CiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7CiAgICByZW5kZXJIaXN0b3JpYWwoKTsKICB9OwoKICAvLyBDZXJyYXIgbW9kYWwgYWwgaGFjZXIgY2xpY2sgZnVlcmEKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGlzdG9yaWFsTW9kYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcykgY2VycmFyTW9kYWwoKTsKICB9KTsKCn0pKCk7Cjwvc2NyaXB0Pgo8L2Rpdj5\/f3tCeePOj09gAH2F\/pviBX8Fvr+7rA8BAZ4EkYSbuQ4BANACteKWqQgFAAIBBAQJCQAHCLeo1+EHBAABAQIBi30BAYX\/jfECAwAMi25jhJ8DAA==\",\"updateId\":889558053}","footnotes":""},"class_list":["post-31","page","type-page","status-publish","post-password-required"],"_links":{"self":[{"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/pages\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wprecover.cl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=31"}],"version-history":[{"count":8,"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/pages\/31\/revisions"}],"predecessor-version":[{"id":42,"href":"https:\/\/wprecover.cl\/index.php?rest_route=\/wp\/v2\/pages\/31\/revisions\/42"}],"wp:attachment":[{"href":"https:\/\/wprecover.cl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}