A fun Tool i made that can’t get blocked terminal is like ms-dos
data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+RGF0YSBPUzwvdGl0bGU+CjxzdHlsZT4KaHRtbCxib2R5e21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBmMDtmb250LWZhbWlseTptb25vc3BhY2U7b3ZlcmZsb3c6aGlkZGVuO30KaWZyYW1le3Bvc2l0aW9uOmZpeGVkIWltcG9ydGFudDtpbnNldDowIWltcG9ydGFudDt3aWR0aDoxMDB2dyFpbXBvcnRhbnQ7aGVpZ2h0OjEwMHZoIWltcG9ydGFudDtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDoxO30KdGV4dGFyZWF7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDt3aWR0aDoxMDB2dztoZWlnaHQ6MTAwdmg7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDojMTExO2NvbG9yOiMwZjA7cGFkZGluZzoyMHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjE0cHg7ei1pbmRleDoxO30KLmFzY2lpLWlucHV0LXdyYXAgdGV4dGFyZWEsLmI2NC10YXtwb3NpdGlvbjpzdGF0aWMhaW1wb3J0YW50O2luc2V0OmF1dG8haW1wb3J0YW50O3dpZHRoOjEwMCUhaW1wb3J0YW50O2hlaWdodDoxMDAlIWltcG9ydGFudDt6LWluZGV4OmF1dG8haW1wb3J0YW50O30KLnRvb2xiYXJ7cG9zaXRpb246Zml4ZWQ7dG9wOjEwcHg7cmlnaHQ6MTBweDt6LWluZGV4OjEwO30KYnV0dG9ue3BhZGRpbmc6OHB4IDE0cHg7bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxNHB4O2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjIpO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4zKTtmb250LWZhbWlseTptb25vc3BhY2U7fQpidXR0b246aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMjU1LDAsMC4xNSk7Ym9yZGVyLWNvbG9yOiMwZjA7fQoubWVudS1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOiMwMDA7ei1pbmRleDo1O30KLm1lbnUtcGFnZSBoMXtjb2xvcjojMGYwO21hcmdpbi1ib3R0b206MzBweDtmb250LXNpemU6MjhweDt9Ci5tZW51LXBhZ2UgLm1lbnUtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjhweDt3aWR0aDo1MDBweDt9Ci5tZW51LXBhZ2UgYnV0dG9ue2JhY2tncm91bmQ6IzAwMDtjb2xvcjojMGYwO2JvcmRlcjoycHggc29saWQgIzBmMDtwYWRkaW5nOjEycHggMzBweDttYXJnaW46MDtmb250LXNpemU6MTZweDtmb250LWZhbWlseTptb25vc3BhY2U7Y3Vyc29yOnBvaW50ZXI7d2lkdGg6MTAwJTt9Ci5tZW51LXBhZ2UgYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6IzBmMDtjb2xvcjojMDAwO30KLnN0cmVzcy1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOiMwMDA7ei1pbmRleDo1O30KLnN0cmVzcy1wYWdlIGgyLC5zdHJlc3MtcGFnZSBwe2NvbG9yOiMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30KLnRvcGJhcntwb3NpdGlvbjpmaXhlZDt0b3A6LTcwcHg7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7YmFja2dyb3VuZDojMTExO3BhZGRpbmc6OHB4IDEycHg7ZGlzcGxheTpmbGV4O2dhcDo2cHg7dHJhbnNpdGlvbjp0b3AgMC4zcyBlYXNlO3otaW5kZXg6OTk5O2FsaWduLWl0ZW1zOmNlbnRlcjt9Ci50b3BiYXIudmlzaWJsZXt0b3A6NXB4O30KLnRvcGJhciBpbnB1dHt3aWR0aDozMjBweDtwYWRkaW5nOjZweDtiYWNrZ3JvdW5kOiMyMjI7Y29sb3I6IzBmMDtib3JkZXI6MXB4IHNvbGlkICMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30KLmhvdmVyLXpvbmV7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjI1cHg7ei1pbmRleDo5OTg7fQoudXJsLXBhZ2V7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JhY2tncm91bmQ6IzAwMDt6LWluZGV4OjU7fQoudXJsLXBhZ2UtaGVhZGVye3BhZGRpbmc6MjBweCAzMHB4IDA7ZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpjZW50ZXI7fQoudXJsLXBhZ2UtaGVhZGVyIGlucHV0e2ZsZXg6MTttaW4td2lkdGg6MjAwcHg7cGFkZGluZzo4cHg7YmFja2dyb3VuZDojMTExO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCAjMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTRweDt9Ci5iNjQtd3JhcHtwb3NpdGlvbjpmaXhlZDtpbnNldDowO3otaW5kZXg6MTt9Ci5iNjQtdGF7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO2JhY2tncm91bmQ6IzExMTtjb2xvcjojMGYwO3BhZGRpbmc6MjBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxNHB4O3Jlc2l6ZTpub25lO30KLmI2NC10YS5kcmFnLW92ZXJ7YmFja2dyb3VuZDojMGIxYTBiO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgM3B4ICMwZjA7fQouY29weXJpZ2h0e3Bvc2l0aW9uOmZpeGVkO2JvdHRvbToxMHB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2NvbG9yOnJnYmEoMCwyNTUsMCwwLjM1KTtmb250LXNpemU6MTFweDt6LWluZGV4OjIwO3BvaW50ZXItZXZlbnRzOm5vbmU7d2hpdGUtc3BhY2U6bm93cmFwO2xldHRlci1zcGFjaW5nOjFweDt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt9CgovKiBTdGFydHVwIHNjcmVlbiAqLwouc3RhcnR1cC1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOiMwMDA7ei1pbmRleDoxMDA7Z2FwOjQwcHg7fQouc3RhcnR1cC10aXRsZXtjb2xvcjojMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6NDhweDtsZXR0ZXItc3BhY2luZzo4cHg7fQouc3RhcnR1cC1zdWJ0aXRsZXtjb2xvcjojMGEwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTNweDtsZXR0ZXItc3BhY2luZzo0cHg7fQouc3RhcnR1cC1idXR0b25ze2Rpc3BsYXk6ZmxleDtnYXA6MjBweDt9Ci5zdGFydHVwLWJ0bntiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBmMDtib3JkZXI6MnB4IHNvbGlkICMwZjA7cGFkZGluZzoxNnB4IDQ4cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxOHB4O2N1cnNvcjpwb2ludGVyO2xldHRlci1zcGFjaW5nOjNweDt0cmFuc2l0aW9uOmJhY2tncm91bmQgMC4xNXMsY29sb3IgMC4xNXM7fQouc3RhcnR1cC1idG46aG92ZXJ7YmFja2dyb3VuZDojMGYwO2NvbG9yOiMwMDA7fQoKLyogVVJMIExvYWRlciBxdWljay1saW5rcyBkcm9wZG93biAqLwoucWwtd3JhcHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazt9Ci5xbC1idG57cGFkZGluZzo4cHggMTRweDtmb250LXNpemU6MTRweDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC4yKTtjb2xvcjojMGYwO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDI1NSwwLDAuMyk7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO21hcmdpbi1sZWZ0OjA7fQoucWwtYnRuOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDI1NSwwLDAuMTUpO2JvcmRlci1jb2xvcjojMGYwO30KLnFsLWRyb3Bkb3due2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTAwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtiYWNrZ3JvdW5kOiMwYTBhMGE7Ym9yZGVyOjFweCBzb2xpZCAjMGYwO21pbi13aWR0aDoyNjBweDt6LWluZGV4OjIwMDtib3gtc2hhZG93OjAgNHB4IDIwcHggcmdiYSgwLDI1NSwwLDAuMik7bWFyZ2luLXRvcDo0cHg7fQoucWwtZHJvcGRvd24ub3BlbntkaXNwbGF5OmJsb2NrO30KLnFsLWl0ZW17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxNnB4O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzBmMDtib3JkZXI6bm9uZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4xKTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjEzcHg7Y3Vyc29yOnBvaW50ZXI7dGV4dC1hbGlnbjpsZWZ0O2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDt9Ci5xbC1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lO30KLnFsLWl0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMjU1LDAsMC4xMik7Y29sb3I6I2ZmZjt9Ci5xbC1oZWFkZXJ7cGFkZGluZzo2cHggMTZweDtjb2xvcjojMGEwO2ZvbnQtc2l6ZToxMXB4O2xldHRlci1zcGFjaW5nOjJweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4yKTt9CgovKiBEcmF3IGNhbnZhcyAqLwouZHJhdy1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDojMDAwO3otaW5kZXg6NTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO30KLmRyYXctdG9vbGJhcntkaXNwbGF5OmZsZXg7Z2FwOjZweDtwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOiMxMTE7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzBmMDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7fQouZHJhdy10b29sYmFyIGlucHV0W3R5cGU9Y29sb3Jde3dpZHRoOjM2cHg7aGVpZ2h0OjMwcHg7cGFkZGluZzowO2JvcmRlcjoxcHggc29saWQgIzBmMDtiYWNrZ3JvdW5kOiMwMDA7Y3Vyc29yOnBvaW50ZXI7fQouZHJhdy10b29sYmFyIGlucHV0W3R5cGU9cmFuZ2Vde3dpZHRoOjgwcHg7YWNjZW50LWNvbG9yOiMwZjA7fQouZHJhdy10b29sYmFyIHNlbGVjdHtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBmMDtib3JkZXI6MXB4IHNvbGlkICMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3BhZGRpbmc6NHB4O30KLmRyYXctdG9vbGJhciBsYWJlbHtjb2xvcjojMGYwO2ZvbnQtc2l6ZToxMnB4O30KI2RyYXdDYW52YXN7ZmxleDoxO2N1cnNvcjpjcm9zc2hhaXI7ZGlzcGxheTpibG9jazt9CgovKiBQaXhlbCBhcnQgZWRpdG9yICovCi5waXhlbC1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDojMDAwO3otaW5kZXg6NTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO30KLnBpeGVsLXRvb2xiYXJ7ZGlzcGxheTpmbGV4O2dhcDo2cHg7cGFkZGluZzo4cHg7YmFja2dyb3VuZDojMTExO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMwZjA7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO30KLnBpeGVsLXRvb2xiYXIgaW5wdXRbdHlwZT1jb2xvcl17d2lkdGg6MzZweDtoZWlnaHQ6MzBweDtwYWRkaW5nOjA7Ym9yZGVyOjFweCBzb2xpZCAjMGYwO2JhY2tncm91bmQ6IzAwMDtjdXJzb3I6cG9pbnRlcjt9Ci5waXhlbC10b29sYmFyIGxhYmVse2NvbG9yOiMwZjA7Zm9udC1zaXplOjEycHg7fQoucGl4ZWwtdG9vbGJhciBzZWxlY3R7YmFja2dyb3VuZDojMDAwO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCAjMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtwYWRkaW5nOjRweDt9Ci5waXhlbC1jYW52YXMtd3JhcHtmbGV4OjE7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO292ZXJmbG93OmhpZGRlbjt9CiNwaXhlbEdyaWR7ZGlzcGxheTpncmlkO2JvcmRlcjoxcHggc29saWQgIzBmMDtjdXJzb3I6Y3Jvc3NoYWlyO30KLnB4LWNlbGx7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjMGEwYTBhO30KCi8qIEFTQ0lJIGFydCAqLwouYXNjaWktcGFnZXtwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6IzAwMDt6LWluZGV4OjU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt9Ci5hc2NpaS10b29sYmFye2Rpc3BsYXk6ZmxleDtnYXA6NnB4O3BhZGRpbmc6OHB4O2JhY2tncm91bmQ6IzExMTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMGYwO2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjt9Ci5hc2NpaS10b29sYmFyIGxhYmVse2NvbG9yOiMwZjA7Zm9udC1zaXplOjEycHg7fQouYXNjaWktdG9vbGJhciBzZWxlY3R7YmFja2dyb3VuZDojMDAwO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCAjMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtwYWRkaW5nOjRweDt9Ci5hc2NpaS10b29sYmFyIGlucHV0W3R5cGU9cmFuZ2Vde3dpZHRoOjgwcHg7YWNjZW50LWNvbG9yOiMwZjA7fQouYXNjaWktc3BsaXR7ZmxleDoxO2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47fQouYXNjaWktaW5wdXQtd3JhcHtmbGV4OjE7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICMwZjA7fQouYXNjaWktaW5wdXQtd3JhcCB0ZXh0YXJlYXtmbGV4OjE7YmFja2dyb3VuZDojMTExO2NvbG9yOiMwZjA7Ym9yZGVyOm5vbmU7cGFkZGluZzoxMHB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTNweDtyZXNpemU6bm9uZTtvdXRsaW5lOm5vbmU7fQouYXNjaWktb3V0cHV0e2ZsZXg6MTtvdmVyZmxvdzphdXRvO3BhZGRpbmc6MTBweDtmb250LXNpemU6MTBweDtsaW5lLWhlaWdodDoxLjE7d2hpdGUtc3BhY2U6cHJlO2NvbG9yOiMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30KLmFzY2lpLWRyb3AtaGludHtjb2xvcjojMGYwO29wYWNpdHk6MC41O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjBweDtmb250LXNpemU6MTJweDt9CgovKiBIYWNrZXIgdHlwZXIgKi8KLmhhY2tlci1wYWdle3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDojMDAwO3otaW5kZXg6NTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO30KLmhhY2tlci1kaXNwbGF5e2ZsZXg6MTtwYWRkaW5nOjIwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiMwZjA7d2hpdGUtc3BhY2U6cHJlLXdyYXA7d29yZC1icmVhazpicmVhay1hbGw7b3ZlcmZsb3c6YXV0bztsaW5lLWhlaWdodDoxLjU7fQouaGFja2VyLXN0YXR1c3twYWRkaW5nOjZweCAxMnB4O2JhY2tncm91bmQ6IzExMTtib3JkZXItdG9wOjFweCBzb2xpZCAjMGYwO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMwYTA7ZGlzcGxheTpmbGV4O2dhcDoyMHB4O30KCi8qIFRlcm1pbmFsICovCi50ZXJtLXBhZ2V7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOiMwYTBhMGE7ei1pbmRleDo1O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47fQoudGVybS1vdXRwdXR7ZmxleDoxO3BhZGRpbmc6MTRweDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjE0cHg7Y29sb3I6IzBmMDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtvdmVyZmxvdy15OmF1dG87bGluZS1oZWlnaHQ6MS42O30KLnRlcm0taW5wdXQtcm93e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzo2cHggMTRweDtib3JkZXItdG9wOjFweCBzb2xpZCAjMGYwO2JhY2tncm91bmQ6IzAwMDt9Ci50ZXJtLXByb21wdHtjb2xvcjojMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTRweDttYXJnaW4tcmlnaHQ6NnB4O3doaXRlLXNwYWNlOm5vd3JhcDt9Ci50ZXJtLWlucHV0e2ZsZXg6MTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2NvbG9yOiMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxNHB4O291dGxpbmU6bm9uZTt9CgovKiBJbnNwZWN0IG1lbnUgKi8KLmluc3BlY3QtcGFnZXtwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6IzBhMGEwYTt6LWluZGV4OjU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt9Ci5pbnNwZWN0LXRhYnN7ZGlzcGxheTpmbGV4O2JhY2tncm91bmQ6IzExMTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMGYwO30KLmluc3BlY3QtdGFie3BhZGRpbmc6OHB4IDE4cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiMwYTA7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMGYwO2JvcmRlci1ib3R0b206MnB4IHNvbGlkIHRyYW5zcGFyZW50O3VzZXItc2VsZWN0Om5vbmU7fQouaW5zcGVjdC10YWI6aG92ZXJ7Y29sb3I6IzBmMDtiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjA1KTt9Ci5pbnNwZWN0LXRhYi5hY3RpdmV7Y29sb3I6IzBmMDtib3JkZXItYm90dG9tOjJweCBzb2xpZCAjMGYwO2JhY2tncm91bmQ6cmdiYSgwLDI1NSwwLDAuMDgpO30KLmluc3BlY3QtYm9keXtmbGV4OjE7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjt9Ci5pbnNwZWN0LXBhbmVse2Rpc3BsYXk6bm9uZTtmbGV4OjE7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjEycHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiMwZjA7bGluZS1oZWlnaHQ6MS42O30KLmluc3BlY3QtcGFuZWwuYWN0aXZle2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjZweDt9Ci5pbnNwZWN0LXNlY3Rpb257Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4yKTtwYWRkaW5nOjhweCAxMnB4O2JhY2tncm91bmQ6cmdiYSgwLDI1NSwwLDAuMDMpO30KLmluc3BlY3Qtc2VjdGlvbiBoM3ttYXJnaW46MCAwIDZweDtjb2xvcjojMGYwO2ZvbnQtc2l6ZToxM3B4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwyNTUsMCwwLjIpO3BhZGRpbmctYm90dG9tOjRweDt9Ci5pbnNwZWN0LXJvd3tkaXNwbGF5OmZsZXg7Z2FwOjhweDtwYWRkaW5nOjJweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwyNTUsMCwwLjA3KTt9Ci5pbnNwZWN0LWtleXtjb2xvcjojMGEwO21pbi13aWR0aDoyMDBweDtmbGV4LXNocmluazowO30KLmluc3BlY3QtdmFse2NvbG9yOiMwZjA7d29yZC1icmVhazpicmVhay1hbGw7fQouaW5zcGVjdC1jb25zb2xlLW91dHtmbGV4OjE7b3ZlcmZsb3cteTphdXRvO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjY7d2hpdGUtc3BhY2U6cHJlLXdyYXA7fQouaW5zcGVjdC1jb25zb2xlLXJvd3tkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7cGFkZGluZzozcHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4wNik7fQouaW5zcGVjdC1jb25zb2xlLXJvdy5lcnJvciAuaW5zcGVjdC1jb25zb2xlLW1zZ3tjb2xvcjojZjU1O30KLmluc3BlY3QtY29uc29sZS1yb3cud2FybiAuaW5zcGVjdC1jb25zb2xlLW1zZ3tjb2xvcjojZmEwO30KLmluc3BlY3QtY29uc29sZS1yb3cuaW5mbyAuaW5zcGVjdC1jb25zb2xlLW1zZ3tjb2xvcjojNGFmO30KLmluc3BlY3QtY29uc29sZS1sZXZlbHttaW4td2lkdGg6NDBweDtjb2xvcjojMGEwO2ZvbnQtc2l6ZToxMXB4O3BhZGRpbmctdG9wOjJweDt9Ci5pbnNwZWN0LWNvbnNvbGUtbXNne2NvbG9yOiMwZjA7d29yZC1icmVhazpicmVhay1hbGw7fQouaW5zcGVjdC1jb25zb2xlLWlucHV0LXJvd3tkaXNwbGF5OmZsZXg7Z2FwOjZweDtwYWRkaW5nOjZweCAwO2JvcmRlci10b3A6MXB4IHNvbGlkICMwZjA7bWFyZ2luLXRvcDo0cHg7fQouaW5zcGVjdC1jb25zb2xlLWlucHV0e2ZsZXg6MTtiYWNrZ3JvdW5kOiMxMTE7Y29sb3I6IzBmMDtib3JkZXI6MXB4IHNvbGlkICMwZjA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4O3BhZGRpbmc6NHB4IDhweDtvdXRsaW5lOm5vbmU7fQouaW5zcGVjdC1uZXQtcm93e2Rpc3BsYXk6ZmxleDtnYXA6MDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4xKTtwYWRkaW5nOjRweCAwO2ZvbnQtc2l6ZToxMnB4O30KLmluc3BlY3QtbmV0LXJvdzpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjA0KTt9Ci5pbnNwZWN0LW5ldC1zdGF0dXN7bWluLXdpZHRoOjQwcHg7dGV4dC1hbGlnbjpjZW50ZXI7fQouaW5zcGVjdC1uZXQtbWV0aG9ke21pbi13aWR0aDo1NXB4O2NvbG9yOiM0YWY7fQouaW5zcGVjdC1uZXQtdXJse2ZsZXg6MTtjb2xvcjojMGYwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDt9Ci5pbnNwZWN0LW5ldC10eXBle21pbi13aWR0aDo3MHB4O2NvbG9yOiMwYTA7fQouaW5zcGVjdC1uZXQtc2l6ZXttaW4td2lkdGg6NjBweDtjb2xvcjojMGEwO3RleHQtYWxpZ246cmlnaHQ7fQouaW5zcGVjdC1uZXQtdGltZXttaW4td2lkdGg6NjBweDtjb2xvcjojMGEwO3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZy1yaWdodDo2cHg7fQouaW5zcGVjdC1lbC10cmVle2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjg7fQouaW5zcGVjdC1lbC10YWd7Y29sb3I6IzRhZjtjdXJzb3I6cG9pbnRlcjt9Ci5pbnNwZWN0LWVsLXRhZzpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLmluc3BlY3QtZWwtYXR0cntjb2xvcjojZmEwO30KLmluc3BlY3QtZWwtdGV4dHtjb2xvcjojMGEwO30KLmluc3BlY3QtZWwtaW5kZW50e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE2cHg7fQouc3RhdHVzLWRvdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItcmFkaXVzOjUwJTttYXJnaW4tcmlnaHQ6NnB4O30KLnN0YXR1cy1kb3QuZ3JlZW57YmFja2dyb3VuZDojMGYwO2JveC1zaGFkb3c6MCAwIDZweCAjMGYwO30KLnN0YXR1cy1kb3QucmVke2JhY2tncm91bmQ6I2Y1NTtib3gtc2hhZG93OjAgMCA2cHggI2Y1NTt9Ci5zdGF0dXMtZG90LnllbGxvd3tiYWNrZ3JvdW5kOiNmYTA7Ym94LXNoYWRvdzowIDAgNnB4ICNmYTA7fQoKLyogSGlkZSBzY3JvbGxiYXJzIGdsb2JhbGx5ICovCip7c2Nyb2xsYmFyLXdpZHRoOm5vbmU7fQoqOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmU7fQoKLyogQXBwIG92ZXJsYXkgKG5vdGVwYWQsIGNhbGMsIGV4cGxvcmVyKSAqLwouYXBwLW92ZXJsYXl7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC44NSk7ei1pbmRleDo1MDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7fQouYXBwLXdpbmRvd3tiYWNrZ3JvdW5kOiMxMTE7Ym9yZGVyOjJweCBzb2xpZCAjMGYwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JveC1zaGFkb3c6MCAwIDMwcHggcmdiYSgwLDI1NSwwLDAuMyk7fQouYXBwLXRpdGxlYmFye2JhY2tncm91bmQ6IzBmMDtjb2xvcjojMDAwO3BhZGRpbmc6NHB4IDEwcHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6Ym9sZDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO3VzZXItc2VsZWN0Om5vbmU7fQouYXBwLWNsb3Nle2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Y29sb3I6IzAwMDtmb250LXNpemU6MTZweDtjdXJzb3I6cG9pbnRlcjtmb250LWZhbWlseTptb25vc3BhY2U7cGFkZGluZzowIDRweDtmb250LXdlaWdodDpib2xkO21hcmdpbjowO30KLmFwcC1jbG9zZTpob3ZlcntiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBmMDtib3JkZXI6bm9uZTt9Ci5hcHAtbWVudWJhcntiYWNrZ3JvdW5kOiMxYTFhMWE7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzBmMDtkaXNwbGF5OmZsZXg7Z2FwOjA7fQouYXBwLW1lbnViYXIgYnV0dG9ue2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzBmMDtib3JkZXI6bm9uZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMCwyNTUsMCwwLjIpO3BhZGRpbmc6NHB4IDEycHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O2N1cnNvcjpwb2ludGVyO21hcmdpbjowO30KLmFwcC1tZW51YmFyIGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjEpO30KCi8qIE5vdGVwYWQgKi8KLm5vdGVwYWQtd2luZG93e3dpZHRoOjY2MHB4O2hlaWdodDo0MjBweDt9Ci5ub3RlcGFkLXRhe2ZsZXg6MTtiYWNrZ3JvdW5kOiMwYTBhMGE7Y29sb3I6IzBmMDtib3JkZXI6bm9uZTtwYWRkaW5nOjEwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4O3Jlc2l6ZTpub25lO291dGxpbmU6bm9uZTtsaW5lLWhlaWdodDoxLjY7fQoubm90ZXBhZC1zdGF0dXNiYXJ7cGFkZGluZzozcHggOHB4O2JhY2tncm91bmQ6IzFhMWExYTtib3JkZXItdG9wOjFweCBzb2xpZCAjMGYwO2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiMwYTA7ZGlzcGxheTpmbGV4O2dhcDoyMHB4O30KCi8qIENhbGN1bGF0b3IgKi8KLmNhbGMtd2luZG93e3dpZHRoOjI4MHB4O30KLmNhbGMtZGlzcGxheXtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBmMDtmb250LXNpemU6MjJweDt0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6MTBweCAxNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMwZjA7bWluLWhlaWdodDozNnB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtsZXR0ZXItc3BhY2luZzoycHg7dGV4dC1zaGFkb3c6MCAwIDhweCAjMGYwO30KLmNhbGMtZXhwcntiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6IzBhMDtmb250LXNpemU6MTJweDt0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmc6MnB4IDE0cHggNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwyNTUsMCwwLjE1KTttaW4taGVpZ2h0OjE2cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30KLmNhbGMtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LDFmcik7Z2FwOjFweDtiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjIpO2JvcmRlci10b3A6MXB4IHNvbGlkICMwZjA7fQouY2FsYy1idG57YmFja2dyb3VuZDojMDAwO2NvbG9yOiMwZjA7Ym9yZGVyOm5vbmU7cGFkZGluZzoxNHB4IDA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxNXB4O2N1cnNvcjpwb2ludGVyO21hcmdpbjowO3RyYW5zaXRpb246YmFja2dyb3VuZCAwLjFzO30KLmNhbGMtYnRuOmhvdmVye2JhY2tncm91bmQ6IzBmMDtjb2xvcjojMDAwO30KLmNhbGMtYnRuLm9we2NvbG9yOiMwZjA7YmFja2dyb3VuZDojMDAxYTAwO30KLmNhbGMtYnRuLm9wOmhvdmVye2JhY2tncm91bmQ6IzBmMDtjb2xvcjojMDAwO30KLmNhbGMtYnRuLmVxe2JhY2tncm91bmQ6IzAwMzMwMDtjb2xvcjojMGYwO3RleHQtc2hhZG93OjAgMCA2cHggIzBmMDt9Ci5jYWxjLWJ0bi5lcTpob3ZlcntiYWNrZ3JvdW5kOiMwZjA7Y29sb3I6IzAwMDt9Ci5jYWxjLWJ0bi53aWRle2dyaWQtY29sdW1uOnNwYW4gMjt9Ci5jYWxjLWJ0bi5jbGVhcntjb2xvcjojZjU1O30KLmNhbGMtYnRuLmNsZWFyOmhvdmVye2JhY2tncm91bmQ6I2Y1NTtjb2xvcjojMDAwO30KCi8qIEV4cGxvcmVyICovCi5leHBsb3Jlci13aW5kb3d7d2lkdGg6NzAwcHg7aGVpZ2h0OjQ0MHB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47fQouZXhwbG9yZXItdG9vbGJhci1yb3d7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O3BhZGRpbmc6NXB4IDhweDtiYWNrZ3JvdW5kOiMxYTFhMWE7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDI1NSwwLDAuMik7fQouZXhwbG9yZXItYWRkcntmbGV4OjE7YmFja2dyb3VuZDojMGEwYTBhO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC40KTtwYWRkaW5nOjRweCA4cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O291dGxpbmU6bm9uZTt9Ci5leHBsb3Jlci1ib2R5e2ZsZXg6MTtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO30KLmV4cGxvcmVyLXRyZWV7d2lkdGg6MTcwcHg7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMGYwO292ZXJmbG93LXk6YXV0bztwYWRkaW5nOjZweCAwO2ZvbnQtc2l6ZToxMnB4O30KLmV4cGxvcmVyLXRyZWUtaXRlbXtwYWRkaW5nOjRweCAxMHB4O2N1cnNvcjpwb2ludGVyO2NvbG9yOiMwYTA7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO30KLmV4cGxvcmVyLXRyZWUtaXRlbTpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjA3KTtjb2xvcjojMGYwO30KLmV4cGxvcmVyLXRyZWUtaXRlbS5zZWxlY3RlZHtiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjE1KTtjb2xvcjojMGYwO30KLmV4cGxvcmVyLW1haW57ZmxleDoxO292ZXJmbG93LXk6YXV0bztwYWRkaW5nOjhweDt9Ci5leHBsb3Jlci1pdGVtc3tkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDthbGlnbi1jb250ZW50OmZsZXgtc3RhcnQ7fQouZXhwbG9yZXItaXRlbXt3aWR0aDo4MHB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo0cHg7cGFkZGluZzo2cHggNHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7fQouZXhwbG9yZXItaXRlbTpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjA3KTtib3JkZXItY29sb3I6cmdiYSgwLDI1NSwwLDAuMyk7fQouZXhwbG9yZXItaXRlbS5zZWxlY3RlZHtiYWNrZ3JvdW5kOnJnYmEoMCwyNTUsMCwwLjE1KTtib3JkZXItY29sb3I6IzBmMDt9Ci5leHBsb3Jlci1pY29ue2ZvbnQtc2l6ZToyMnB4O2xpbmUtaGVpZ2h0OjE7fQouZXhwbG9yZXItbGFiZWx7Zm9udC1zaXplOjExcHg7Y29sb3I6IzBmMDt0ZXh0LWFsaWduOmNlbnRlcjt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7bGluZS1oZWlnaHQ6MS4zO30KLmV4cGxvcmVyLXN0YXR1c2JhcntwYWRkaW5nOjNweCAxMHB4O2JhY2tncm91bmQ6IzFhMWExYTtib3JkZXItdG9wOjFweCBzb2xpZCAjMGYwO2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiMwYTA7fQoKLyogR2FtZXMgKi8KLmdhbWUtd2luZG93e3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDojMDAwO3otaW5kZXg6NjA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt9Ci5nYW1lLWlubmVye2ZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDowO30KLmdhbWUtY2FudmFzLXdyYXB7ZmxleDoxO3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO30KLmdhbWUtY2FudmFzLXdyYXAgY2FudmFze2Rpc3BsYXk6YmxvY2s7aW1hZ2UtcmVuZGVyaW5nOnBpeGVsYXRlZDtpbWFnZS1yZW5kZXJpbmc6Y3Jpc3AtZWRnZXM7aGVpZ2h0OjEwMCU7d2lkdGg6YXV0bzt9Ci5nYW1lLWluZm97cGFkZGluZzo1cHggMTRweDtiYWNrZ3JvdW5kOiMxMTE7Ym9yZGVyLXRvcDoxcHggc29saWQgIzBmMDtmb250LXNpemU6MTJweDtjb2xvcjojMGEwO2Rpc3BsYXk6ZmxleDtnYXA6MjBweDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC1zaHJpbms6MDt9Ci5nYW1lLWluZm8gc3Bhbntjb2xvcjojMGYwO30KLmdhbWUtZXhpdC1idG57cG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtyaWdodDo4cHg7ei1pbmRleDo1O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjcpO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC40KTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHggMTBweDtjdXJzb3I6cG9pbnRlcjt9Ci5nYW1lLWV4aXQtYnRuOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDI1NSwwLDAuMTUpO2JvcmRlci1jb2xvcjojMGYwO30KCjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CjxzY3JpcHQ+Ci8qIOKUgOKUgCBoZWxwZXJzIOKUgOKUgCAqLwpmdW5jdGlvbiBub3JtYWxpemVVUkwodXJsKXt1cmw9dXJsLnRyaW0oKTtpZighdXJsKXJldHVybiIiO2lmKC9eaHR0cHM/OlwvXC8vaS50ZXN0KHVybCkpcmV0dXJuIHVybDtyZXR1cm4iaHR0cHM6Ly8iK3VybDt9CmZ1bmN0aW9uIGNsZWFyQm9keSgpe2RvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSIiO30KZnVuY3Rpb24gbWFrZUJ0bihsYWJlbCxmbil7Y29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtiLnRleHRDb250ZW50PWxhYmVsO2Iub25jbGljaz1mbjtyZXR1cm4gYjt9CmZ1bmN0aW9uIGFkZENvcHlyaWdodCgpe2NvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5jbGFzc05hbWU9ImNvcHlyaWdodCI7Yy5pbm5lckhUTUw9IiZjb3B5OyAyMDI2ICZtZGFzaDsgSm9uIFN0ZWFybnMiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7fQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpewogICAgaWYoKGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmZS5rZXk9PT0iYSIpewogICAgICBjb25zdCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICAgIGNvbnN0IG9rPXQmJih0LnRhZ05hbWU9PT0iVEVYVEFSRUEifHwodC50YWdOYW1lPT09IklOUFVUIiYmdC50eXBlIT09ImJ1dHRvbiImJnQudHlwZSE9PSJjaGVja2JveCImJnQudHlwZSE9PSJyYWRpbyIpKTsKICAgICAgaWYoIW9rKWUucHJldmVudERlZmF1bHQoKTsKICAgIH0KICB9LHRydWUpOwovKiBXaXJlIEVTQyB0byBnb0JhY2sgd2hlbiBsYXVuY2hlZCBmcm9tIHRlcm1pbmFsLiBSZXR1cm5zIHRydWUgaWYgdGVybWluYWwtbGF1bmNoZWQgKHNraXAgQmFjayBidXR0b24pLiAqLwpmdW5jdGlvbiBiaW5kRXNjSWZUZXJtaW5hbChnb0JhY2spewogIGlmKGdvQmFjayE9PXNob3dUZXJtaW5hbClyZXR1cm4gZmFsc2U7CiAgZnVuY3Rpb24gb25Fc2MoZSl7aWYoZS5rZXk9PT0iRXNjYXBlIil7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25Fc2MpO2dvQmFjaygpO319CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25Fc2MpOwogIHJldHVybiB0cnVlOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgU1RBUlRVUCBTQ1JFRU4g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIHNob3dTdGFydHVwKCl7CiAgY2xlYXJCb2R5KCk7CiAgY29uc3QgcGFnZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtwYWdlLmNsYXNzTmFtZT0ic3RhcnR1cC1wYWdlIjsKICBjb25zdCB0aXRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aXRsZS5jbGFzc05hbWU9InN0YXJ0dXAtdGl0bGUiO3RpdGxlLnRleHRDb250ZW50PSJEQVRBIE9TIjsKICBjb25zdCBzdWI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7c3ViLmNsYXNzTmFtZT0ic3RhcnR1cC1zdWJ0aXRsZSI7c3ViLnRleHRDb250ZW50PSJ2OC4wLjAtZmluYWwiOwogIGNvbnN0IGJ0bnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YnRucy5jbGFzc05hbWU9InN0YXJ0dXAtYnV0dG9ucyI7CiAgY29uc3QgZXpCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7ZXpCdG4uY2xhc3NOYW1lPSJzdGFydHVwLWJ0biI7ZXpCdG4udGV4dENvbnRlbnQ9IkVaLU1PREUiOwogIGV6QnRuLm9uY2xpY2s9c2hvd01lbnU7CiAgY29uc3QgdGVybUJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTt0ZXJtQnRuLmNsYXNzTmFtZT0ic3RhcnR1cC1idG4iO3Rlcm1CdG4udGV4dENvbnRlbnQ9IlRFUk1JTkFMIjsKICB0ZXJtQnRuLm9uY2xpY2s9KCk9PnNob3dUZXJtaW5hbChudWxsKTsKICBidG5zLmFwcGVuZENoaWxkKGV6QnRuKTtidG5zLmFwcGVuZENoaWxkKHRlcm1CdG4pOwogIFt0aXRsZSxzdWIsYnRuc10uZm9yRWFjaChlbD0+cGFnZS5hcHBlbmRDaGlsZChlbCkpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7CiAgYWRkQ29weXJpZ2h0KCk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBJRlJBTUUtQkFTRUQgR0FNRSBMQVVOQ0hFUlMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIHNob3dJZnJhbWVHYW1lKHNyY2RvYyxnb0JhY2ssc2hvd0JhY2spewogIGNsZWFyQm9keSgpOwogIGNvbnN0IGlmcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKICBpZnJhbWUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDt3aWR0aDoxMDB2dztoZWlnaHQ6MTAwdmg7Ym9yZGVyOm5vbmU7ei1pbmRleDoxO2JhY2tncm91bmQ6IzAwMDsiOwogIGlmcmFtZS5zcmNkb2M9c3JjZG9jOwoKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CgogIGlmKHNob3dCYWNrJiZnb0JhY2spewogICAgY29uc3QgYmFja0J0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgIGJhY2tCdG4udGV4dENvbnRlbnQ9IuKGkCBCYWNrIjsKICAgIGJhY2tCdG4uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246Zml4ZWQ7dG9wOjEwcHg7cmlnaHQ6MTBweDt6LWluZGV4OjEwO3BhZGRpbmc6NnB4IDE0cHg7Zm9udC1zaXplOjEzcHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNyk7Y29sb3I6IzBmMDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwyNTUsMCwwLjQpO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTsiOwogICAgYmFja0J0bi5vbm1vdXNlZW50ZXI9KCk9PntiYWNrQnRuLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwyNTUsMCwwLjE1KSI7YmFja0J0bi5zdHlsZS5ib3JkZXJDb2xvcj0iIzBmMCI7fTsKICAgIGJhY2tCdG4ub25tb3VzZWxlYXZlPSgpPT57YmFja0J0bi5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsMCwwLDAuNykiO2JhY2tCdG4uc3R5bGUuYm9yZGVyQ29sb3I9InJnYmEoMCwyNTUsMCwwLjQpIjt9OwogICAgYmFja0J0bi5vbmNsaWNrPSgpPT57aWYoZ29CYWNrKWdvQmFjaygpO307CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tCdG4pOwogIH0KCiAgYWRkQ29weXJpZ2h0KCk7Cn0KCmZ1bmN0aW9uIHNob3dJZnJhbWVHYW1lV2l0aEV4Y2VwdGlvbkJhY2soc3JjZG9jLGdvQmFjayl7CiAgY2xlYXJCb2R5KCk7CiAgY29uc3QgaWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwogIGlmcmFtZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpmaXhlZDtpbnNldDowO3dpZHRoOjEwMHZ3O2hlaWdodDoxMDB2aDtib3JkZXI6bm9uZTt6LWluZGV4OjE7YmFja2dyb3VuZDojMDAwOyI7CgogIC8vIEluamVjdCBhIHBvc3RNZXNzYWdlIGhvb2sgaW50byBzcmNkb2Mgc28gdGhlIGlmcmFtZSBjYW4gc2lnbmFsIHVzIG9uIGV4Y2VwdGlvbgogIGNvbnN0IGluamVjdGVkPXNyY2RvYy5yZXBsYWNlKAogICAgIndpbmRvdy5vbmVycm9yPSgpPT57IiwKICAgICJ3aW5kb3cub25lcnJvcj0oKT0+e3RyeXt3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKCdnYW1lLWV4Y2VwdGlvbicsJyonKTt9Y2F0Y2goZSl7fSIKICApOwogIGlmcmFtZS5zcmNkb2M9aW5qZWN0ZWQ7CgogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvbk1zZyhlKXsKICAgIGlmKGUuZGF0YT09PSJnYW1lLWV4Y2VwdGlvbiIpewogICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsb25Nc2cpOwogICAgICBpZihnb0JhY2spZ29CYWNrKCk7CiAgICB9CiAgfSk7CgogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKICBhZGRDb3B5cmlnaHQoKTsKfQoKZnVuY3Rpb24gc2hvd0Rvb20oZ29CYWNrKXsKICBjb25zdCBzcmNkb2M9YDwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPgo8YmFzZSBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvU3RpbmthbGlzdGljL1VHU0BtYWluL01JU0MvZG9vbS8iPgo8dGl0bGU+RE9PTTwvdGl0bGU+PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGhlaWdodD1kZXZpY2UtaGVpZ2h0LGluaXRpYWwtc2NhbGU9MS4wLG1heGltdW0tc2NhbGU9MS4wLHVzZXItc2NhbGFibGU9MC4wLHZpZXdwb3J0LWZpdD1jb3ZlciI+CjxzdHlsZT4KaHRtbHtoZWlnaHQ6MTAwdmg7fWJvZHl7Y29sb3I6I2NjYztmb250LWZhbWlseTpNb25vc3BhY2U7Zm9udC1zaXplOjE2cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjazttYXJnaW46MDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt9CmNhbnZhc3tvdmVyZmxvdzphdXRvO3dpZHRoOjEwMHZ3O30KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo1NzZweCl7Y2FudmFze2hlaWdodDoxMDB2aDtoZWlnaHQ6MTAwZHZoO319CkBrZXlmcmFtZXMgcGFnZS1sb2FkZXJ7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7fX0KLmluZm8tb3ZlcmxheXt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDttYXJnaW46YXV0bzt3aWR0aDoyMDBweDtoZWlnaHQ6MjAwcHg7ZGlzcGxheTpub25lO30KI3NwaW5uZXJ7Y29udGVudDoiIjtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0OHB4O2hlaWdodDo0OHB4O3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjphdXRvO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO2JvcmRlci10b3A6MnB4IHNvbGlkICMyMjI7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCAjMjIyO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMyMjI7Ym9yZGVyLWxlZnQ6MnB4IHNvbGlkICM4NjdhZTA7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7YW5pbWF0aW9uOnBhZ2UtbG9hZGVyIDEuMXMgaW5maW5pdGUgbGluZWFyO30KYXtjb2xvcjojODY3YWUwO3RleHQtZGVjb3JhdGlvbjpub25lO31hOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQo8L3N0eWxlPjwvaGVhZD48Ym9keT4KPGNhbnZhcyBpZD0iY2FudmFzIiBvbmNvbnRleHRtZW51PSJldmVudC5wcmV2ZW50RGVmYXVsdCgpIj48L2NhbnZhcz4KPGRpdiBjbGFzcz0iaW5mby1vdmVybGF5IiBpZD0ibG9hZGluZyI+PGRpdiBpZD0ic3Bpbm5lciI+PC9kaXY+PGRpdiBpZD0ic3RhdHVzIj5Eb3dubG9hZGluZy4uLjwvZGl2PjxkaXY+PHByb2dyZXNzIHZhbHVlPSIwIiBtYXg9IjEwMCIgaWQ9InByb2dyZXNzIiBoaWRkZW49MT48L3Byb2dyZXNzPjwvZGl2PjwvZGl2Pgo8ZGl2IGNsYXNzPSJpbmZvLW92ZXJsYXkiIGlkPSJzZWxlY3QtdmVyc2lvbiI+PGEgaHJlZj0iIyIgaWQ9ImxvYWQiPkxvYWQ8L2E+PGJyLz5+MTFtYjwvZGl2Pgo8c2NyaXB0Pgp2YXIgbG9hZFNjcmlwdD0oZXYsc3JjKT0+e2V2LnByZXZlbnREZWZhdWx0KCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdC12ZXJzaW9uJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7cy5zZXRBdHRyaWJ1dGUoJ3NyYycsc3JjKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpO307CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3QtdmVyc2lvbicpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKGV2KT0+bG9hZFNjcmlwdChldiwnaW5kZXguanMnKSk7CnZhciBzdGF0dXNFbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKTsKdmFyIHByb2dyZXNzRWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZ3Jlc3MnKTsKdmFyIHNwaW5uZXJFbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGlubmVyJyk7CnZhciBNb2R1bGU9e3ByZVJ1bjpbXSxwb3N0UnVuOltdLHByaW50OmZ1bmN0aW9uKHRleHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl0ZXh0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbignICcpO2NvbnNvbGUubG9nKHRleHQpO30sY2FudmFzOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKSxzZXRTdGF0dXM6KHRleHQpPT57aWYoIU1vZHVsZS5zZXRTdGF0dXMubGFzdCl7TW9kdWxlLnNldFN0YXR1cy5sYXN0PXt0aW1lOkRhdGUubm93KCksdGV4dDonJ307fSBpZih0ZXh0PT09TW9kdWxlLnNldFN0YXR1cy5sYXN0LnRleHQpe3JldHVybjt9IHZhciBtPXRleHQubWF0Y2goLyhbXihdKylcXCgoXFxkKyhcXC5cXGQrKT8pXFwvKFxcL2QrKVxcKS8pO3ZhciBub3c9RGF0ZS5ub3coKTtpZihtJiZub3ctTW9kdWxlLnNldFN0YXR1cy5sYXN0LnRpbWU8MzApe3JldHVybjt9IE1vZHVsZS5zZXRTdGF0dXMubGFzdC50aW1lPW5vdztNb2R1bGUuc2V0U3RhdHVzLmxhc3QudGV4dD10ZXh0O2lmKG0pe3RleHQ9bVsxXTtwcm9ncmVzc0VsZW1lbnQudmFsdWU9cGFyc2VJbnQobVsyXSkqMTAwO3Byb2dyZXNzRWxlbWVudC5tYXg9cGFyc2VJbnQobVs0XSkqMTAwO3Byb2dyZXNzRWxlbWVudC5oaWRkZW49ZmFsc2U7c3Bpbm5lckVsZW1lbnQuaGlkZGVuPWZhbHNlO31lbHNle3Byb2dyZXNzRWxlbWVudC52YWx1ZT1udWxsO3Byb2dyZXNzRWxlbWVudC5tYXg9bnVsbDtwcm9ncmVzc0VsZW1lbnQuaGlkZGVuPXRydWU7aWYoIXRleHQpe3NwaW5uZXJFbGVtZW50LmhpZGRlbj10cnVlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7fX0gc3RhdHVzRWxlbWVudC5pbm5lckhUTUw9dGV4dDt9LHRvdGFsRGVwZW5kZW5jaWVzOjAsbW9uaXRvclJ1bkRlcGVuZGVuY2llczoobGVmdCk9PntNb2R1bGUudG90YWxEZXBlbmRlbmNpZXM9TWF0aC5tYXgoTW9kdWxlLnRvdGFsRGVwZW5kZW5jaWVzLGxlZnQpO01vZHVsZS5zZXRTdGF0dXMobGVmdD8ncHJlcGFyaW5nLi4uICgnKyhNb2R1bGUudG90YWxEZXBlbmRlbmNpZXMtbGVmdCkrJy8nK01vZHVsZS50b3RhbERlcGVuZGVuY2llcysnKSc6J2FsbCBkb3dubG9hZHMgY29tcGxldGUuJyk7fX07Ck1vZHVsZS5zZXRTdGF0dXMoJ2Rvd25sb2FkaW5nLi4uJyk7CndpbmRvdy5vbmVycm9yPSgpPT57TW9kdWxlLnNldFN0YXR1cygnRXhjZXB0aW9uIHRocm93biwgc2VlIEphdmFTY3JpcHQgY29uc29sZScpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJykuc3R5bGUuZGlzcGxheT0nYmxvY2snO3NwaW5uZXJFbGVtZW50LnN0eWxlLmRpc3BsYXk9J25vbmUnO01vZHVsZS5zZXRTdGF0dXM9KHRleHQpPT57aWYodGV4dCl7Y29uc29sZS5lcnJvcignW3Bvc3QtZXhjZXB0aW9uIHN0YXR1c10gJyt0ZXh0KTt9fTt9Owo8XC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD5gOwogIHNob3dJZnJhbWVHYW1lV2l0aEV4Y2VwdGlvbkJhY2soc3JjZG9jLGdvQmFjayk7Cn0KCmZ1bmN0aW9uIHNob3dXb2xmM0QoZ29CYWNrKXsKICBjb25zdCBzcmNkb2M9YDwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPgo8YmFzZSBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvU3RpbmthbGlzdGljL1VHU0BtYWluL01JU0Mvd29sZmVuc3RlaW4vIj4KPHRpdGxlPldvbGZlbnN0ZWluIDNEPC90aXRsZT48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaGVpZ2h0PWRldmljZS1oZWlnaHQsaW5pdGlhbC1zY2FsZT0xLjAsbWF4aW11bS1zY2FsZT0xLjAsdXNlci1zY2FsYWJsZT0wLjAsdmlld3BvcnQtZml0PWNvdmVyIj4KPHN0eWxlPgpodG1se2hlaWdodDoxMDB2aDt9Ym9keXtjb2xvcjojY2NjO2ZvbnQtZmFtaWx5Ok1vbm9zcGFjZTtmb250LXNpemU6MTZweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO21hcmdpbjowO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO30KY2FudmFze292ZXJmbG93OmF1dG87d2lkdGg6MTAwdnc7fQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOjU3NnB4KXtjYW52YXN7aGVpZ2h0OjEwMHZoO2hlaWdodDoxMDBkdmg7fX0KQGtleWZyYW1lcyBwYWdlLWxvYWRlcnswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpO30xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt9fQouaW5mby1vdmVybGF5e3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO21hcmdpbjphdXRvO3dpZHRoOjIwMHB4O2hlaWdodDoyMDBweDtkaXNwbGF5Om5vbmU7fQojc3Bpbm5lcntjb250ZW50OiIiO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjQ4cHg7aGVpZ2h0OjQ4cHg7cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luOmF1dG87dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7Ym9yZGVyLXRvcDoycHggc29saWQgIzIyMjtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICMyMjI7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzIyMjtib3JkZXItbGVmdDoycHggc29saWQgIzg2N2FlMDt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTthbmltYXRpb246cGFnZS1sb2FkZXIgMS4xcyBpbmZpbml0ZSBsaW5lYXI7fQphe2NvbG9yOiM4NjdhZTA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Cjwvc3R5bGU+PC9oZWFkPjxib2R5Pgo8Y2FudmFzIGlkPSJjYW52YXMiIG9uY29udGV4dG1lbnU9ImV2ZW50LnByZXZlbnREZWZhdWx0KCkiPjwvY2FudmFzPgo8ZGl2IGNsYXNzPSJpbmZvLW92ZXJsYXkiIGlkPSJsb2FkaW5nIj48ZGl2IGlkPSJzcGlubmVyIj48L2Rpdj48ZGl2IGlkPSJzdGF0dXMiPkRvd25sb2FkaW5nLi4uPC9kaXY+PGRpdj48cHJvZ3Jlc3MgdmFsdWU9IjAiIG1heD0iMTAwIiBpZD0icHJvZ3Jlc3MiIGhpZGRlbj0xPjwvcHJvZ3Jlc3M+PC9kaXY+PC9kaXY+CjxkaXYgY2xhc3M9ImluZm8tb3ZlcmxheSIgaWQ9InNlbGVjdC12ZXJzaW9uIj48YSBocmVmPSIjIiBpZD0ibG9hZCI+TG9hZDwvYT48YnIvPn4ybWI8L2Rpdj4KPHNjcmlwdD4KdmFyIGxvYWRTY3JpcHQ9KGV2LHNyYyk9Pntldi5wcmV2ZW50RGVmYXVsdCgpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3QtdmVyc2lvbicpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJykuc3R5bGUuZGlzcGxheT0nYmxvY2snO3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO3Muc2V0QXR0cmlidXRlKCdzcmMnLHNyYyk7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTt9Owpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0LXZlcnNpb24nKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLChldik9PmxvYWRTY3JpcHQoZXYsJ2luZGV4LmpzJykpOwp2YXIgc3RhdHVzRWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzJyk7CnZhciBwcm9ncmVzc0VsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dyZXNzJyk7CnZhciBzcGlubmVyRWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Bpbm5lcicpOwp2YXIgTW9kdWxlPXtwcmVSdW46W10scG9zdFJ1bjpbXSxwcmludDpmdW5jdGlvbih0ZXh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpdGV4dD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJyAnKTtjb25zb2xlLmxvZyh0ZXh0KTt9LGNhbnZhczpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyksc2V0U3RhdHVzOih0ZXh0KT0+e2lmKCFNb2R1bGUuc2V0U3RhdHVzLmxhc3Qpe01vZHVsZS5zZXRTdGF0dXMubGFzdD17dGltZTpEYXRlLm5vdygpLHRleHQ6Jyd9O30gaWYodGV4dD09PU1vZHVsZS5zZXRTdGF0dXMubGFzdC50ZXh0KXtyZXR1cm47fSB2YXIgbT10ZXh0Lm1hdGNoKC8oW14oXSspXFwoKFxcZCsoXFwuXFxkKyk/KVxcLyhcXC9kKylcXCkvKTt2YXIgbm93PURhdGUubm93KCk7aWYobSYmbm93LU1vZHVsZS5zZXRTdGF0dXMubGFzdC50aW1lPDMwKXtyZXR1cm47fSBNb2R1bGUuc2V0U3RhdHVzLmxhc3QudGltZT1ub3c7TW9kdWxlLnNldFN0YXR1cy5sYXN0LnRleHQ9dGV4dDtpZihtKXt0ZXh0PW1bMV07cHJvZ3Jlc3NFbGVtZW50LnZhbHVlPXBhcnNlSW50KG1bMl0pKjEwMDtwcm9ncmVzc0VsZW1lbnQubWF4PXBhcnNlSW50KG1bNF0pKjEwMDtwcm9ncmVzc0VsZW1lbnQuaGlkZGVuPWZhbHNlO3NwaW5uZXJFbGVtZW50LmhpZGRlbj1mYWxzZTt9ZWxzZXtwcm9ncmVzc0VsZW1lbnQudmFsdWU9bnVsbDtwcm9ncmVzc0VsZW1lbnQubWF4PW51bGw7cHJvZ3Jlc3NFbGVtZW50LmhpZGRlbj10cnVlO2lmKCF0ZXh0KXtzcGlubmVyRWxlbWVudC5oaWRkZW49dHJ1ZTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO319IHN0YXR1c0VsZW1lbnQuaW5uZXJIVE1MPXRleHQ7fSx0b3RhbERlcGVuZGVuY2llczowLG1vbml0b3JSdW5EZXBlbmRlbmNpZXM6KGxlZnQpPT57TW9kdWxlLnRvdGFsRGVwZW5kZW5jaWVzPU1hdGgubWF4KE1vZHVsZS50b3RhbERlcGVuZGVuY2llcyxsZWZ0KTtNb2R1bGUuc2V0U3RhdHVzKGxlZnQ/J3ByZXBhcmluZy4uLiAoJysoTW9kdWxlLnRvdGFsRGVwZW5kZW5jaWVzLWxlZnQpKycvJytNb2R1bGUudG90YWxEZXBlbmRlbmNpZXMrJyknOidhbGwgZG93bmxvYWRzIGNvbXBsZXRlLicpO319OwpNb2R1bGUuc2V0U3RhdHVzKCdkb3dubG9hZGluZy4uLicpOwp3aW5kb3cub25lcnJvcj0oKT0+e01vZHVsZS5zZXRTdGF0dXMoJ0V4Y2VwdGlvbiB0aHJvd24sIHNlZSBKYXZhU2NyaXB0IGNvbnNvbGUnKTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5PSdub25lJztNb2R1bGUuc2V0U3RhdHVzPSh0ZXh0KT0+e2lmKHRleHQpe2NvbnNvbGUuZXJyb3IoJ1twb3N0LWV4Y2VwdGlvbiBzdGF0dXNdICcrdGV4dCk7fX07fTsKPFwvc2NyaXB0PjwvYm9keT48L2h0bWw+YDsKICBzaG93SWZyYW1lR2FtZVdpdGhFeGNlcHRpb25CYWNrKHNyY2RvYyxnb0JhY2spOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgTUVOVSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KZnVuY3Rpb24gc2hvd01lbnUoKXsKICBjbGVhckJvZHkoKTsKICBjb25zdCBwYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BhZ2UuY2xhc3NOYW1lPSJtZW51LXBhZ2UiOwogIGNvbnN0IGgxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgxIik7aDEudGV4dENvbnRlbnQ9IkVaLU1vZGUiOwogIHBhZ2UuYXBwZW5kQ2hpbGQoaDEpOwoKICBjb25zdCBncmlkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2dyaWQuY2xhc3NOYW1lPSJtZW51LWdyaWQiOwoKICBjb25zdCBhcHBzPVsKICAgIFsiSFRNTCBFZGl0b3IiLCAgICgpPT5zaG93RWRpdG9yKCIiLHNob3dNZW51KV0sCiAgICBbIlVSTCBMb2FkZXIiLCAgICAoKT0+c2hvd1VSTFBhZ2Uoc2hvd01lbnUpXSwKICAgIFsiQmFzZTY0IFRvb2wiLCAgICgpPT5zaG93QmFzZTY0KHNob3dNZW51KV0sCiAgICBbIkNQVSBTdHJlc3MiLCAgICAoKT0+c2hvd1N0cmVzcyhzaG93TWVudSldLAogICAgWyJEcmF3IC8gUGFpbnQiLCAgKCk9PnNob3dEcmF3KHNob3dNZW51KV0sCiAgICBbIlBpeGVsIEFydCIsICAgICAoKT0+c2hvd1BpeGVsQXJ0KHNob3dNZW51KV0sCiAgICBbIkFTQ0lJIEFydCIsICAgICAoKT0+c2hvd0FTQ0lJKHNob3dNZW51KV0sCiAgICBbIkhhY2tlciBUeXBlciIsICAoKT0+c2hvd0hhY2tlclR5cGVyKHNob3dNZW51KV0sCiAgICBbIlRlcm1pbmFsIiwgICAgICAoKT0+c2hvd1Rlcm1pbmFsKHNob3dNZW51KV0sCiAgICBbIkluc3BlY3QiLCAgICAgICBzaG93SW5zcGVjdF0sCiAgICBbIk5vdGVwYWQiLCAgICAgICAoKT0+bGF1bmNoTm90ZXBhZChudWxsLCIiLHNob3dNZW51KV0sCiAgICBbIkNhbGN1bGF0b3IiLCAgICAoKT0+bGF1bmNoQ2FsY3VsYXRvcihzaG93TWVudSldLAogICAgWyJGaWxlIEV4cGxvcmVyIiwgKCk9PmxhdW5jaEV4cGxvcmVyKCJDOlxcVXNlcnNcXGFub255bW91cyIsc2hvd01lbnUpXSwKICBdOwoKICBhcHBzLmZvckVhY2goKFtsLGZdKT0+ewogICAgY29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtiLnRleHRDb250ZW50PWw7Yi5vbmNsaWNrPWY7Z3JpZC5hcHBlbmRDaGlsZChiKTsKICB9KTsKCiAgY29uc3QgZ2FtZXNCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgZ2FtZXNCdG4udGV4dENvbnRlbnQ9IkdhbWVzIjsKICBnYW1lc0J0bi5vbmNsaWNrPXNob3dHYW1lczsKICBncmlkLmFwcGVuZENoaWxkKGdhbWVzQnRuKTsKCiAgcGFnZS5hcHBlbmRDaGlsZChncmlkKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhZ2UpOwogIGFkZENvcHlyaWdodCgpOwp9CgpmdW5jdGlvbiBzaG93R2FtZXMoKXsKICBjbGVhckJvZHkoKTsKICBjb25zdCBwYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BhZ2UuY2xhc3NOYW1lPSJtZW51LXBhZ2UiOwogIGNvbnN0IGgxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgxIik7aDEudGV4dENvbnRlbnQ9IkdhbWVzIjsKICBwYWdlLmFwcGVuZENoaWxkKGgxKTsKCiAgY29uc3QgZ3JpZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtncmlkLmNsYXNzTmFtZT0ibWVudS1ncmlkIjsKCiAgY29uc3QgZ2FtZXM9WwogICAgWyJQb25nIiwgICAgICAgICgpPT5sYXVuY2hQb25nKHNob3dHYW1lcyldLAogICAgWyJUZXRyaXMiLCAgICAgICgpPT5sYXVuY2hUZXRyaXMoc2hvd0dhbWVzKV0sCiAgICBbIk1pbmVzd2VlcGVyIiwgKCk9PmxhdW5jaE1pbmVzd2VlcGVyKHNob3dHYW1lcyldLAogICAgWyJTbmFrZSIsICAgICAgICgpPT5sYXVuY2hTbmFrZShzaG93R2FtZXMpXSwKICAgIFsiQnJlYWtvdXQiLCAgICAoKT0+bGF1bmNoQnJlYWtvdXQoc2hvd0dhbWVzKV0sCiAgICBbIjIwNDgiLCAgICAgICAgKCk9PmxhdW5jaDIwNDgoc2hvd0dhbWVzKV0sCiAgICBbIkRPT00iLCAgICAgICAgKCk9PnNob3dEb29tKHNob3dHYW1lcyldLAogICAgWyJXb2xmZW5zdGVpbiAzRCIsICgpPT5zaG93V29sZjNEKHNob3dHYW1lcyldLAogIF07CgogIGdhbWVzLmZvckVhY2goKFtsLGZdKT0+ewogICAgY29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtiLnRleHRDb250ZW50PWw7Yi5vbmNsaWNrPWY7Z3JpZC5hcHBlbmRDaGlsZChiKTsKICB9KTsKCiAgY29uc3QgYmFja0J0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICBiYWNrQnRuLnRleHRDb250ZW50PSLihpAgQmFjayI7CiAgYmFja0J0bi5zdHlsZS5ncmlkQ29sdW1uPSJzcGFuIDIiOwogIGJhY2tCdG4ub25jbGljaz1zaG93TWVudTsKICBncmlkLmFwcGVuZENoaWxkKGJhY2tCdG4pOwoKICBwYWdlLmFwcGVuZENoaWxkKGdyaWQpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7CiAgYWRkQ29weXJpZ2h0KCk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBPUklHSU5BTCBQQUdFUyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KZnVuY3Rpb24gc2hvd0VkaXRvcihleGlzdGluZ0hUTUwsIGdvQmFjayl7CiAgaWYoIWdvQmFjaylnb0JhY2s9c2hvd01lbnU7CiAgY2xlYXJCb2R5KCk7CiAgY29uc3QgdGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsKICB0YS52YWx1ZT0odHlwZW9mIGV4aXN0aW5nSFRNTD09PSJzdHJpbmciKT9leGlzdGluZ0hUTUw6IiI7CiAgdGEucGxhY2Vob2xkZXI9IldyaXRlIG9yIHBhc3RlIEhUTUwgaGVyZS4uLiI7CiAgY29uc3QgdGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGIuY2xhc3NOYW1lPSJ0b29sYmFyIjsKICBjb25zdCByZW5kZXJCdG49bWFrZUJ0bigiUmVuZGVyIiwoKT0+ewogICAgY29uc3QgaHRtbD10YS52YWx1ZTtjbGVhckJvZHkoKTsKICAgIGNvbnN0IGlmcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtpZnJhbWUuc3JjZG9jPWh0bWw7CiAgICBjb25zdCB0YjI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGIyLmNsYXNzTmFtZT0idG9vbGJhciI7CiAgICB0YjIuYXBwZW5kQ2hpbGQobWFrZUJ0bigiQmFjayB0byBFZGl0b3IiLCgpPT5zaG93RWRpdG9yKGh0bWwsZ29CYWNrKSkpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGIyKTsKICAgIGFkZENvcHlyaWdodCgpOwogIH0pOwogIGNvbnN0IGRsQnRuPW1ha2VCdG4oIkRvd25sb2FkIiwoKT0+e2NvbnN0IGJsb2I9bmV3IEJsb2IoW3RhLnZhbHVlXSx7dHlwZToidGV4dC9odG1sIn0pO2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2EuaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO2EuZG93bmxvYWQ9ImluZGV4Lmh0bWwiO2EuY2xpY2soKTt9KTsKICBjb25zdCB1bEJ0bj1tYWtlQnRuKCJVcGxvYWQiLCgpPT57Y29uc3QgaW5wdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtpbnB1dC50eXBlPSJmaWxlIjtpbnB1dC5hY2NlcHQ9Ii5odG1sLC5odG0iO2lucHV0Lm9uY2hhbmdlPWU9Pntjb25zdCByPW5ldyBGaWxlUmVhZGVyKCk7ci5vbmxvYWQ9KCk9PnRhLnZhbHVlPXIucmVzdWx0O3IucmVhZEFzVGV4dChlLnRhcmdldC5maWxlc1swXSk7fTtpbnB1dC5jbGljaygpO30pOwogIGNvbnN0IGJ0bnM9YmluZEVzY0lmVGVybWluYWwoZ29CYWNrKT9bcmVuZGVyQnRuLGRsQnRuLHVsQnRuXTpbbWFrZUJ0bigiQmFjayIsZ29CYWNrKSxyZW5kZXJCdG4sZGxCdG4sdWxCdG5dOwogIGJ0bnMuZm9yRWFjaChiPT50Yi5hcHBlbmRDaGlsZChiKSk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0Yik7CiAgYWRkQ29weXJpZ2h0KCk7Cn0KCmZ1bmN0aW9uIHNob3dVUkxQYWdlKGdvQmFjayl7CiAgaWYoIWdvQmFjaylnb0JhY2s9c2hvd01lbnU7CiAgY2xlYXJCb2R5KCk7CiAgY29uc3QgcGFnZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtwYWdlLmNsYXNzTmFtZT0idXJsLXBhZ2UiOwogIGNvbnN0IGhkcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoZHIuY2xhc3NOYW1lPSJ1cmwtcGFnZS1oZWFkZXIiOwogIGNvbnN0IGFkZHJJbnB1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2FkZHJJbnB1dC50eXBlPSJ0ZXh0IjthZGRySW5wdXQucGxhY2Vob2xkZXI9Imh0dHBzOi8vLi4uIjsKICBjb25zdCBnb0J0bj1tYWtlQnRuKCJHbyIsKCk9Pntjb25zdCB1PW5vcm1hbGl6ZVVSTChhZGRySW5wdXQudmFsdWUpO2lmKHUpc2hvd1VSTE1vZGUodSxnb0JhY2spO30pOwogIGFkZHJJbnB1dC5vbmtleWRvd249ZT0+e2lmKGUua2V5PT09IkVudGVyIilnb0J0bi5jbGljaygpO307CgogIC8vIOKUgOKUgCBRdWljay1saW5rcyBkcm9wZG93biDilIDilIAKICBjb25zdCBxbExpbmtzPVsKICAgIHtsYWJlbDoiU2xvcGUgT25saW5lIiwgICAgICB1cmw6Imh0dHBzOi8vc2xvcGVvbmxpbmUub25saW5lIiwgICAgICAgc3JjZG9jOm51bGx9LAogICAge2xhYmVsOiJHaXRsYWIgR2FtZXMiLCAgICAgIHVybDoiaHR0cHM6Ly9naXRsYWJnYW1lcy5naXRsYWIuaW8vZ2FtZS8iLCBzcmNkb2M6bnVsbH0sCiAgICB7bGFiZWw6IkdhbWVzTE9MIiwgICAgICB1cmw6Imh0dHBzOi8vZW4uZ2FtZXNsb2wubmV0LyIsIHNyY2RvYzpudWxsfSwKICAgIHtsYWJlbDoiR1gtQ2xpZW50IChNQyAxLjguOCkiLCB1cmw6Imh0dHBzOi8vZ3gtY2xpZW50LnN1cmdlLnNoL0dYLUNsaWVudCUyMFdBU00uaHRtbCIsIHNyY2RvYzpudWxsfSwKICBdOwogIGNvbnN0IHFsV3JhcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtxbFdyYXAuY2xhc3NOYW1lPSJxbC13cmFwIjsKICBjb25zdCBxbEJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtxbEJ0bi5jbGFzc05hbWU9InFsLWJ0biI7cWxCdG4udGV4dENvbnRlbnQ9IuKshyBRdWljayBMaW5rcyI7CiAgY29uc3QgcWxEcm9wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3FsRHJvcC5jbGFzc05hbWU9InFsLWRyb3Bkb3duIjsKICBjb25zdCBxbEhlYWQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cWxIZWFkLmNsYXNzTmFtZT0icWwtaGVhZGVyIjtxbEhlYWQudGV4dENvbnRlbnQ9IlFVSUNLIExJTktTIjsKICBxbERyb3AuYXBwZW5kQ2hpbGQocWxIZWFkKTsKICBxbExpbmtzLmZvckVhY2goKHtsYWJlbCx1cmwsc3JjZG9jfSk9PnsKICAgIGNvbnN0IGl0ZW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7aXRlbS5jbGFzc05hbWU9InFsLWl0ZW0iO2l0ZW0udGV4dENvbnRlbnQ9bGFiZWw7CiAgICBpdGVtLm9uY2xpY2s9KCk9PnsKICAgICAgcWxEcm9wLmNsYXNzTGlzdC5yZW1vdmUoIm9wZW4iKTsKICAgICAgaWYoc3JjZG9jKXtzaG93SWZyYW1lR2FtZShzcmNkb2MsZ29CYWNrLHRydWUpO30KICAgICAgZWxzZXtzaG93VVJMTW9kZSh1cmwsZ29CYWNrKTt9CiAgICB9OwogICAgcWxEcm9wLmFwcGVuZENoaWxkKGl0ZW0pOwogIH0pOwogIHFsQnRuLm9uY2xpY2s9KGUpPT57ZS5zdG9wUHJvcGFnYXRpb24oKTtxbERyb3AuY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpO307CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5xbERyb3AuY2xhc3NMaXN0LnJlbW92ZSgib3BlbiIpKTsKICBxbFdyYXAuYXBwZW5kQ2hpbGQocWxCdG4pO3FsV3JhcC5hcHBlbmRDaGlsZChxbERyb3ApOwoKICBjb25zdCB1cmxCdG5zPWJpbmRFc2NJZlRlcm1pbmFsKGdvQmFjayk/W2FkZHJJbnB1dCxnb0J0bl06W21ha2VCdG4oIkJhY2siLGdvQmFjayksYWRkcklucHV0LGdvQnRuXTsKICB1cmxCdG5zLmZvckVhY2goZWw9Pmhkci5hcHBlbmRDaGlsZChlbCkpOwogIHBhZ2UuYXBwZW5kQ2hpbGQoaGRyKTsKCiAgY29uc3QgcWxSb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgcWxSb3cuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzoxMHB4IDAgMDsiOwogIHFsUm93LmFwcGVuZENoaWxkKHFsV3JhcCk7CiAgcGFnZS5hcHBlbmRDaGlsZChxbFJvdyk7CgogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7CiAgYWRkQ29weXJpZ2h0KCk7Cn0KCmZ1bmN0aW9uIHNob3dVUkxNb2RlKGluaXRpYWxVUkwsZ29CYWNrKXsKICBpZighZ29CYWNrKWdvQmFjaz1zaG93TWVudTsKICBjbGVhckJvZHkoKTsKICBjb25zdCBpZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aWZyYW1lLnNyYz1pbml0aWFsVVJMOwogIGNvbnN0IGhvdmVyWm9uZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtob3ZlclpvbmUuY2xhc3NOYW1lPSJob3Zlci16b25lIjsKICBjb25zdCB0b3BiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dG9wYmFyLmNsYXNzTmFtZT0idG9wYmFyIjsKICBjb25zdCBhZGRyZXNzQmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7YWRkcmVzc0Jhci50eXBlPSJ0ZXh0IjthZGRyZXNzQmFyLnZhbHVlPWluaXRpYWxVUkw7CiAgY29uc3QgZ29CdG49bWFrZUJ0bigiR28iLCgpPT57Y29uc3QgdT1ub3JtYWxpemVVUkwoYWRkcmVzc0Jhci52YWx1ZSk7aWYodSlpZnJhbWUuc3JjPXU7fSk7CiAgYWRkcmVzc0Jhci5vbmtleWRvd249ZT0+e2lmKGUua2V5PT09IkVudGVyIilnb0J0bi5jbGljaygpO307CiAgY29uc3QgYmFja0J0bj1tYWtlQnRuKCJCYWNrIiwoKT0+e3RyeXtpZnJhbWUuY29udGVudFdpbmRvdy5oaXN0b3J5LmJhY2soKTt9Y2F0Y2h7YWxlcnQoIkNyb3NzLW9yaWdpbiByZXN0cmljdGlvbi4iKTt9fSk7CiAgW21ha2VCdG4oIuKshSBMb2FkZXIiLCgpPT5zaG93VVJMUGFnZShnb0JhY2spKSxiYWNrQnRuLGFkZHJlc3NCYXIsZ29CdG5dLmZvckVhY2goZWw9PnRvcGJhci5hcHBlbmRDaGlsZChlbCkpOwogIGxldCBoVCxoVDI7CiAgaG92ZXJab25lLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT5oVD1zZXRUaW1lb3V0KCgpPT50b3BiYXIuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpLDYwMCkpOwogIGhvdmVyWm9uZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoKT0+Y2xlYXJUaW1lb3V0KGhUKSk7CiAgdG9wYmFyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT5jbGVhclRpbWVvdXQoaFQyKSk7CiAgdG9wYmFyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCgpPT5oVDI9c2V0VGltZW91dCgoKT0+dG9wYmFyLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSwzMDApKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3ZlclpvbmUpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9wYmFyKTsKICBhZGRDb3B5cmlnaHQoKTsKfQoKZnVuY3Rpb24gc2hvd0Jhc2U2NChnb0JhY2spewogIGlmKCFnb0JhY2spZ29CYWNrPXNob3dNZW51OwogIGNsZWFyQm9keSgpOwogIGNvbnN0IHdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7d3JhcC5jbGFzc05hbWU9ImI2NC13cmFwIjsKICBjb25zdCB0YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3RhLmNsYXNzTmFtZT0iYjY0LXRhIjsKICB0YS5wbGFjZWhvbGRlcj0iUGFzdGUgdGV4dCAvIEhUTUwgLyBCYXNlNjQgaGVyZSDigJQgb3IgZHJhZyAmIGRyb3AgYW55IGZpbGUgdG8gZW5jb2RlIGl0Li4uIjsKICBmdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpe2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e3RhLnZhbHVlPXIucmVzdWx0LnNwbGl0KCIsIilbMV07fTtyLnJlYWRBc0RhdGFVUkwoZmlsZSk7fQogIHRhLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIixlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO3RhLmNsYXNzTGlzdC5hZGQoImRyYWctb3ZlciIpO30pOwogIHRhLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsKCk9PnRhLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpKTsKICB0YS5hZGRFdmVudExpc3RlbmVyKCJkcm9wIixlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO3RhLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpO2NvbnN0IGY9ZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07aWYoZillbmNvZGVGaWxlKGYpO30pOwogIHdyYXAuYXBwZW5kQ2hpbGQodGEpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQod3JhcCk7CiAgY29uc3QgdGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGIuY2xhc3NOYW1lPSJ0b29sYmFyIjsKICBjb25zdCBlbmNCdG49bWFrZUJ0bigiRW5jb2RlIiwoKT0+e3RyeXt0YS52YWx1ZT1idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0YS52YWx1ZSkpKTt9Y2F0Y2goZSl7YWxlcnQoIkVuY29kZSBmYWlsZWQ6ICIrZS5tZXNzYWdlKTt9fSk7CiAgY29uc3QgZGVjQnRuPW1ha2VCdG4oIkRlY29kZSIsKCk9Pnt0cnl7dGEudmFsdWU9ZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShhdG9iKHRhLnZhbHVlKSkpO31jYXRjaChlKXthbGVydCgiRGVjb2RlIGZhaWxlZDogIitlLm1lc3NhZ2UpO319KTsKICBjb25zdCB1cmlCdG49bWFrZUJ0bigiVVJJIiwoKT0+e3RyeXt0YS52YWx1ZT0iZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGEudmFsdWUpKSk7fWNhdGNoKGUpe2FsZXJ0KCJVUkkgZW5jb2RlIGZhaWxlZDogIitlLm1lc3NhZ2UpO319KTsKICBjb25zdCBjb3B5QnRuPW1ha2VCdG4oIkNvcHkiLCgpPT57bmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGEudmFsdWUpLnRoZW4oKCk9Pntjb3B5QnRuLnRleHRDb250ZW50PSJDb3BpZWQhIjtzZXRUaW1lb3V0KCgpPT5jb3B5QnRuLnRleHRDb250ZW50PSJDb3B5IiwxNTAwKTt9KS5jYXRjaCgoKT0+YWxlcnQoIkNvcHkgZmFpbGVkLiIpKTt9KTsKICBjb25zdCB1bEJ0bj1tYWtlQnRuKCJVcGxvYWQiLCgpPT57Y29uc3QgaW5wdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtpbnB1dC50eXBlPSJmaWxlIjtpbnB1dC5vbmNoYW5nZT1lPT57Y29uc3QgZj1lLnRhcmdldC5maWxlc1swXTtpZihmKWVuY29kZUZpbGUoZik7fTtpbnB1dC5jbGljaygpO30pOwogIGNvbnN0IGRsQnRuPW1ha2VCdG4oIkRvd25sb2FkIiwoKT0+ewogICAgY29uc3QgY29udGVudD10YS52YWx1ZTsKICAgIGlmKCFjb250ZW50KXthbGVydCgiTm90aGluZyB0byBkb3dubG9hZC4iKTtyZXR1cm47fQogICAgY29uc3QgYmxvYj1uZXcgQmxvYihbY29udGVudF0se3R5cGU6InRleHQvcGxhaW4ifSk7CiAgICBjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTthLmRvd25sb2FkPSJiYXNlNjRfb3V0cHV0LnR4dCI7YS5jbGljaygpOwogIH0pOwogIGNvbnN0IGI2NGJ0bnM9YmluZEVzY0lmVGVybWluYWwoZ29CYWNrKT9bZW5jQnRuLGRlY0J0bix1cmlCdG4sY29weUJ0bix1bEJ0bixkbEJ0bl06W21ha2VCdG4oIkJhY2siLGdvQmFjayksZW5jQnRuLGRlY0J0bix1cmlCdG4sY29weUJ0bix1bEJ0bixkbEJ0bl07CiAgYjY0YnRucy5mb3JFYWNoKGI9PnRiLmFwcGVuZENoaWxkKGIpKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRiKTsKICBhZGRDb3B5cmlnaHQoKTsKfQoKbGV0IHN0cmVzc1dvcmtlcnM9W10sc3RyZXNzUnVubmluZz1mYWxzZSx0b3RhbE9wcz0wOwpmdW5jdGlvbiBzaG93U3RyZXNzKGdvQmFjayl7CiAgaWYoIWdvQmFjaylnb0JhY2s9c2hvd01lbnU7CiAgc3RvcFRlc3QoKTtjbGVhckJvZHkoKTsKICBjb25zdCBwYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BhZ2UuY2xhc3NOYW1lPSJzdHJlc3MtcGFnZSI7CiAgY29uc3QgaDI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDIiKTtoMi50ZXh0Q29udGVudD0iQ1BVIFN0cmVzcyBUZXN0IjsKICBjb25zdCB0UD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7dFAudGV4dENvbnRlbnQ9IkxvZ2ljYWwgVGhyZWFkcyBEZXRlY3RlZDogIituYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTsKICBjb25zdCBvUD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7b1AuaW5uZXJIVE1MPSJUb3RhbCBPcGVyYXRpb25zOiA8c3BhbiBpZD0nb3BzJz4wPC9zcGFuPiI7CiAgY29uc3Qgc3RhcnRCdG49bWFrZUJ0bigiU3RhcnQgVGVzdCIsc3RhcnRUZXN0KTsKICBjb25zdCBzdG9wQnRuPW1ha2VCdG4oIlN0b3AgVGVzdCIsc3RvcFRlc3QpOwogIGNvbnN0IHRiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RiLmNsYXNzTmFtZT0idG9vbGJhciI7CiAgaWYoIWJpbmRFc2NJZlRlcm1pbmFsKGdvQmFjaykpdGIuYXBwZW5kQ2hpbGQobWFrZUJ0bigiQmFjayIsKCk9PntzdG9wVGVzdCgpO2dvQmFjaygpO30pKTsKICBbaDIsdFAsb1Asc3RhcnRCdG4sc3RvcEJ0bl0uZm9yRWFjaChlbD0+cGFnZS5hcHBlbmRDaGlsZChlbCkpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0Yik7CiAgYWRkQ29weXJpZ2h0KCk7Cn0KZnVuY3Rpb24gc3RhcnRUZXN0KCl7aWYoc3RyZXNzUnVubmluZylyZXR1cm47c3RyZXNzUnVubmluZz10cnVlO3RvdGFsT3BzPTA7Y29uc3QgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9wcyIpO2lmKGVsKWVsLnRleHRDb250ZW50PSIwIjtmb3IobGV0IGk9MDtpPG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O2krKyl7Y29uc3Qgdz1uZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2BsZXQgb3BzPTA7ZnVuY3Rpb24gaGVhdnlDb21wdXRlKCl7d2hpbGUodHJ1ZSl7Zm9yKGxldCBpPTA7aTwxZTY7aSsrKXtvcHMrPU1hdGguc3FydChpKSpNYXRoLnJhbmRvbSgpO31wb3N0TWVzc2FnZShvcHMpO319aGVhdnlDb21wdXRlKCk7YF0se3R5cGU6J2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnfSkpKTt3Lm9ubWVzc2FnZT0oKT0+e3RvdGFsT3BzKz0xO2NvbnN0IGVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvcHMiKTtpZihlbCllbC50ZXh0Q29udGVudD10b3RhbE9wczt9O3N0cmVzc1dvcmtlcnMucHVzaCh3KTt9fQpmdW5jdGlvbiBzdG9wVGVzdCgpe3N0cmVzc1J1bm5pbmc9ZmFsc2U7c3RyZXNzV29ya2Vycy5mb3JFYWNoKHc9PncudGVybWluYXRlKCkpO3N0cmVzc1dvcmtlcnM9W107fQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIERSQVcgLyBQQUlOVCDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KZnVuY3Rpb24gc2hvd0RyYXcoZ29CYWNrKXsKICBpZighZ29CYWNrKWdvQmFjaz1zaG93TWVudTsKICBjbGVhckJvZHkoKTsKICBjb25zdCBwYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BhZ2UuY2xhc3NOYW1lPSJkcmF3LXBhZ2UiOwoKICBjb25zdCB0Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0Yi5jbGFzc05hbWU9ImRyYXctdG9vbGJhciI7CgogIGNvbnN0IG1lbnVCdG49YmluZEVzY0lmVGVybWluYWwoZ29CYWNrKT9udWxsOm1ha2VCdG4oIkJhY2siLGdvQmFjayk7CgogIGNvbnN0IGNvbG9yUGljaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2NvbG9yUGljay50eXBlPSJjb2xvciI7Y29sb3JQaWNrLnZhbHVlPSIjMDBmZjAwIjsKICBjb25zdCBjb2xvckxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7Y29sb3JMYWJlbC50ZXh0Q29udGVudD0iIENvbG9yICI7CgogIGNvbnN0IHNpemVMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO3NpemVMYWJlbC50ZXh0Q29udGVudD0iIFNpemUgIjsKICBjb25zdCBzaXplUmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtzaXplUmFuZ2UudHlwZT0icmFuZ2UiO3NpemVSYW5nZS5taW49MTtzaXplUmFuZ2UubWF4PTYwO3NpemVSYW5nZS52YWx1ZT04OwogIGNvbnN0IHNpemVWYWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtzaXplVmFsLnRleHRDb250ZW50PSI4IjsKICBzaXplUmFuZ2Uub25pbnB1dD0oKT0+c2l6ZVZhbC50ZXh0Q29udGVudD1zaXplUmFuZ2UudmFsdWU7CgogIGNvbnN0IHRvb2xMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO3Rvb2xMYWJlbC50ZXh0Q29udGVudD0iIFRvb2wgIjsKICBjb25zdCB0b29sU2VsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwogIFsiUGVuIiwiRXJhc2VyIiwiTGluZSIsIlJlY3QiLCJDaXJjbGUiLCJGaWxsIl0uZm9yRWFjaCh0PT57Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtvLnZhbHVlPXQudG9Mb3dlckNhc2UoKTtvLnRleHRDb250ZW50PXQ7dG9vbFNlbC5hcHBlbmRDaGlsZChvKTt9KTsKCiAgY29uc3QgY2xlYXJCdG49bWFrZUJ0bigiQ2xlYXIiLCgpPT57Y3R4LmZpbGxTdHlsZT0iIzAwMCI7Y3R4LmZpbGxSZWN0KDAsMCxjYW52YXMud2lkdGgsY2FudmFzLmhlaWdodCk7fSk7CiAgY29uc3QgZGxCdG49bWFrZUJ0bigiRG93bmxvYWQiLCgpPT57Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7YS5kb3dubG9hZD0iZHJhd2luZy5wbmciO2EuaHJlZj1jYW52YXMudG9EYXRhVVJMKCk7YS5jbGljaygpO30pOwoKICBbbWVudUJ0bixjb2xvckxhYmVsLGNvbG9yUGljayxzaXplTGFiZWwsc2l6ZVJhbmdlLHNpemVWYWwsdG9vbExhYmVsLHRvb2xTZWwsY2xlYXJCdG4sZGxCdG5dLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGVsPT50Yi5hcHBlbmRDaGlsZChlbCkpOwoKICBjb25zdCBjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7Y2FudmFzLmlkPSJkcmF3Q2FudmFzIjsKICBwYWdlLmFwcGVuZENoaWxkKHRiKTtwYWdlLmFwcGVuZENoaWxkKGNhbnZhcyk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYWdlKTsKICBhZGRDb3B5cmlnaHQoKTsKCiAgZnVuY3Rpb24gcmVzaXplKCl7Y2FudmFzLndpZHRoPWNhbnZhcy5vZmZzZXRXaWR0aDtjYW52YXMuaGVpZ2h0PWNhbnZhcy5vZmZzZXRIZWlnaHQ7Y3R4LmZpbGxTdHlsZT0iIzAwMCI7Y3R4LmZpbGxSZWN0KDAsMCxjYW52YXMud2lkdGgsY2FudmFzLmhlaWdodCk7fQogIGNvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICByZXNpemUoKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixyZXNpemUpOwoKICBsZXQgZHJhd2luZz1mYWxzZSxzdGFydFg9MCxzdGFydFk9MCxzbmFwc2hvdD1udWxsOwoKICBmdW5jdGlvbiBnZXRQb3MoZSl7CiAgICBjb25zdCByPWNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGNvbnN0IHNyYz1lLnRvdWNoZXM/ZS50b3VjaGVzWzBdOmU7CiAgICByZXR1cm5bc3JjLmNsaWVudFgtci5sZWZ0LHNyYy5jbGllbnRZLXIudG9wXTsKICB9CgogIGZ1bmN0aW9uIGZsb29kRmlsbCh4LHksZmlsbENvbG9yKXsKICAgIHg9TWF0aC5yb3VuZCh4KTt5PU1hdGgucm91bmQoeSk7CiAgICBjb25zdCBpbWdEYXRhPWN0eC5nZXRJbWFnZURhdGEoMCwwLGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KTsKICAgIGNvbnN0IGRhdGE9aW1nRGF0YS5kYXRhOwogICAgY29uc3QgaWR4PSh5KmNhbnZhcy53aWR0aCt4KSo0OwogICAgY29uc3QgdGFyZ1I9ZGF0YVtpZHhdLHRhcmdHPWRhdGFbaWR4KzFdLHRhcmdCPWRhdGFbaWR4KzJdLHRhcmdBPWRhdGFbaWR4KzNdOwogICAgY29uc3QgZmM9ZmlsbENvbG9yLm1hdGNoKC9cd1x3L2cpLm1hcChoPT5wYXJzZUludChoLDE2KSk7CiAgICBpZihmY1swXT09PXRhcmdSJiZmY1sxXT09PXRhcmdHJiZmY1syXT09PXRhcmdCKXJldHVybjsKICAgIGNvbnN0IHN0YWNrPVtbeCx5XV07CiAgICB3aGlsZShzdGFjay5sZW5ndGgpewogICAgICBjb25zdFtjeCxjeV09c3RhY2sucG9wKCk7CiAgICAgIGNvbnN0IGk9KGN5KmNhbnZhcy53aWR0aCtjeCkqNDsKICAgICAgaWYoY3g8MHx8Y3g+PWNhbnZhcy53aWR0aHx8Y3k8MHx8Y3k+PWNhbnZhcy5oZWlnaHQpY29udGludWU7CiAgICAgIGlmKGRhdGFbaV0hPT10YXJnUnx8ZGF0YVtpKzFdIT09dGFyZ0d8fGRhdGFbaSsyXSE9PXRhcmdCfHxkYXRhW2krM10hPT10YXJnQSljb250aW51ZTsKICAgICAgZGF0YVtpXT1mY1swXTtkYXRhW2krMV09ZmNbMV07ZGF0YVtpKzJdPWZjWzJdO2RhdGFbaSszXT0yNTU7CiAgICAgIHN0YWNrLnB1c2goW2N4KzEsY3ldLFtjeC0xLGN5XSxbY3gsY3krMV0sW2N4LGN5LTFdKTsKICAgIH0KICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwwLDApOwogIH0KCiAgZnVuY3Rpb24gZG93bihlKXsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGNvbnN0W3gseV09Z2V0UG9zKGUpOwogICAgaWYodG9vbFNlbC52YWx1ZT09PSJmaWxsIil7Zmxvb2RGaWxsKHgseSxjb2xvclBpY2sudmFsdWUucmVwbGFjZSgiIyIsIiIpKTtyZXR1cm47fQogICAgZHJhd2luZz10cnVlO3N0YXJ0WD14O3N0YXJ0WT15OwogICAgc25hcHNob3Q9Y3R4LmdldEltYWdlRGF0YSgwLDAsY2FudmFzLndpZHRoLGNhbnZhcy5oZWlnaHQpOwogICAgY3R4LmJlZ2luUGF0aCgpO2N0eC5tb3ZlVG8oeCx5KTsKICB9CiAgZnVuY3Rpb24gbW92ZShlKXsKICAgIGlmKCFkcmF3aW5nKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdFt4LHldPWdldFBvcyhlKTsKICAgIGNvbnN0IHRvb2w9dG9vbFNlbC52YWx1ZTsKICAgIGNvbnN0IHNpemU9cGFyc2VJbnQoc2l6ZVJhbmdlLnZhbHVlKTsKICAgIGN0eC5zdHJva2VTdHlsZT10b29sPT09ImVyYXNlciI/IiMwMDAiOmNvbG9yUGljay52YWx1ZTsKICAgIGN0eC5maWxsU3R5bGU9Y29sb3JQaWNrLnZhbHVlOwogICAgY3R4LmxpbmVXaWR0aD1zaXplO2N0eC5saW5lQ2FwPSJyb3VuZCI7Y3R4LmxpbmVKb2luPSJyb3VuZCI7CiAgICBpZih0b29sPT09InBlbiJ8fHRvb2w9PT0iZXJhc2VyIil7Y3R4LmxpbmVUbyh4LHkpO2N0eC5zdHJva2UoKTtjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbyh4LHkpO30KICAgIGVsc2V7CiAgICAgIGN0eC5wdXRJbWFnZURhdGEoc25hcHNob3QsMCwwKTsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBpZih0b29sPT09ImxpbmUiKXtjdHgubW92ZVRvKHN0YXJ0WCxzdGFydFkpO2N0eC5saW5lVG8oeCx5KTtjdHguc3Ryb2tlKCk7fQogICAgICBlbHNlIGlmKHRvb2w9PT0icmVjdCIpe2N0eC5zdHJva2VSZWN0KHN0YXJ0WCxzdGFydFkseC1zdGFydFgseS1zdGFydFkpO30KICAgICAgZWxzZSBpZih0b29sPT09ImNpcmNsZSIpe2NvbnN0IHJ4PSh4LXN0YXJ0WCkvMixyeT0oeS1zdGFydFkpLzI7Y3R4LmVsbGlwc2Uoc3RhcnRYK3J4LHN0YXJ0WStyeSxNYXRoLmFicyhyeCksTWF0aC5hYnMocnkpLDAsMCxNYXRoLlBJKjIpO2N0eC5zdHJva2UoKTt9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVwKGUpe2UucHJldmVudERlZmF1bHQoKTtkcmF3aW5nPWZhbHNlO30KICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixkb3duKTtjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixtb3ZlKTtjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdXApOwogIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iixkb3duLHtwYXNzaXZlOmZhbHNlfSk7Y2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbW92ZSx7cGFzc2l2ZTpmYWxzZX0pO2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdXAse3Bhc3NpdmU6ZmFsc2V9KTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIFBJWEVMIEFSVCBFRElUT1Ig4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIHNob3dQaXhlbEFydChnb0JhY2spewogIGlmKCFnb0JhY2spZ29CYWNrPXNob3dNZW51OwogIGNsZWFyQm9keSgpOwogIGNvbnN0IHBhZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cGFnZS5jbGFzc05hbWU9InBpeGVsLXBhZ2UiOwogIGNvbnN0IHRiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RiLmNsYXNzTmFtZT0icGl4ZWwtdG9vbGJhciI7CgogIGNvbnN0IGNvbG9yUGljaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2NvbG9yUGljay50eXBlPSJjb2xvciI7Y29sb3JQaWNrLnZhbHVlPSIjMDBmZjAwIjsKICBjb25zdCBjb2xvckxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7Y29sb3JMYWJlbC50ZXh0Q29udGVudD0iIENvbG9yICI7CgogIGNvbnN0IHRvb2xMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO3Rvb2xMYWJlbC50ZXh0Q29udGVudD0iIFRvb2wgIjsKICBjb25zdCB0b29sU2VsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwogIFsiRHJhdyIsIkVyYXNlciIsIkZpbGwiXS5mb3JFYWNoKHQ9Pntjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9dC50b0xvd2VyQ2FzZSgpO28udGV4dENvbnRlbnQ9dDt0b29sU2VsLmFwcGVuZENoaWxkKG8pO30pOwoKICBjb25zdCBzaXplTGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtzaXplTGFiZWwudGV4dENvbnRlbnQ9IiBHcmlkICI7CiAgY29uc3Qgc2l6ZVNlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKICBbOCwxNiwyNCwzMiw0OCw2NF0uZm9yRWFjaChzPT57Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtvLnZhbHVlPXM7by50ZXh0Q29udGVudD1zKyJ4IitzO2lmKHM9PT0xNilvLnNlbGVjdGVkPXRydWU7c2l6ZVNlbC5hcHBlbmRDaGlsZChvKTt9KTsKCiAgY29uc3QgY2xlYXJCdG49bWFrZUJ0bigiQ2xlYXIiLCgpPT5idWlsZEdyaWQoKSk7CiAgY29uc3QgZGxCdG49bWFrZUJ0bigiRG93bmxvYWQiLCgpPT57CiAgICBjb25zdCB0ZW1wQ2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgdGVtcENhbnZhcy53aWR0aD1ncmlkU2l6ZTt0ZW1wQ2FudmFzLmhlaWdodD1ncmlkU2l6ZTsKICAgIGNvbnN0IHRjPXRlbXBDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGNlbGxzLmZvckVhY2goKGNlbGwsaSk9PnsKICAgICAgY29uc3QgeD1pJWdyaWRTaXplLHk9TWF0aC5mbG9vcihpL2dyaWRTaXplKTsKICAgICAgdGMuZmlsbFN0eWxlPWNlbGwuc3R5bGUuYmFja2dyb3VuZENvbG9yfHwiIzAwMDAwMCI7CiAgICAgIHRjLmZpbGxSZWN0KHgseSwxLDEpOwogICAgfSk7CiAgICBjb25zdCBzY2FsZT01MTIvZ3JpZFNpemU7CiAgICBjb25zdCBvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7b3V0LndpZHRoPTUxMjtvdXQuaGVpZ2h0PTUxMjsKICAgIGNvbnN0IG9jPW91dC5nZXRDb250ZXh0KCIyZCIpO29jLmltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZTsKICAgIG9jLmRyYXdJbWFnZSh0ZW1wQ2FudmFzLDAsMCw1MTIsNTEyKTsKICAgIGNvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2EuZG93bmxvYWQ9InBpeGVsX2FydC5wbmciO2EuaHJlZj1vdXQudG9EYXRhVVJMKCk7YS5jbGljaygpOwogIH0pOwoKICBbYmluZEVzY0lmVGVybWluYWwoZ29CYWNrKT9udWxsOm1ha2VCdG4oIkJhY2siLGdvQmFjayksY29sb3JMYWJlbCxjb2xvclBpY2ssdG9vbExhYmVsLHRvb2xTZWwsc2l6ZUxhYmVsLHNpemVTZWwsY2xlYXJCdG4sZGxCdG5dLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGVsPT50Yi5hcHBlbmRDaGlsZChlbCkpOwoKICBjb25zdCB3cmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3dyYXAuY2xhc3NOYW1lPSJwaXhlbC1jYW52YXMtd3JhcCI7CiAgY29uc3QgZ3JpZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtncmlkLmlkPSJwaXhlbEdyaWQiOwogIHdyYXAuYXBwZW5kQ2hpbGQoZ3JpZCk7CgogIHBhZ2UuYXBwZW5kQ2hpbGQodGIpO3BhZ2UuYXBwZW5kQ2hpbGQod3JhcCk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYWdlKTsKICBhZGRDb3B5cmlnaHQoKTsKCiAgbGV0IGdyaWRTaXplPTE2LGNlbGxzPVtdLHBhaW50aW5nPWZhbHNlLGVyYXNpbmc9ZmFsc2U7CgogIGZ1bmN0aW9uIGZpbGxDZWxsKGNlbGwpewogICAgaWYodG9vbFNlbC52YWx1ZT09PSJkcmF3IiljZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jb2xvclBpY2sudmFsdWU7CiAgICBlbHNlIGlmKHRvb2xTZWwudmFsdWU9PT0iZXJhc2VyIiljZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7CiAgfQoKICBmdW5jdGlvbiBmbG9vZEZpbGwoc3RhcnRJZHgsdGFyZ2V0Q29sb3IsZmlsbENvbG9yKXsKICAgIGlmKHRhcmdldENvbG9yPT09ZmlsbENvbG9yKXJldHVybjsKICAgIGNvbnN0IHN0YWNrPVtzdGFydElkeF07CiAgICB3aGlsZShzdGFjay5sZW5ndGgpewogICAgICBjb25zdCBpZHg9c3RhY2sucG9wKCk7CiAgICAgIGlmKGlkeDwwfHxpZHg+PWNlbGxzLmxlbmd0aCljb250aW51ZTsKICAgICAgY29uc3QgYmc9Y2VsbHNbaWR4XS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgIGNvbnN0IGhleD1iZz9yZ2JUb0hleChiZyk6IiMwMDAwMDAiOwogICAgICBpZihoZXgudG9Mb3dlckNhc2UoKSE9PXRhcmdldENvbG9yLnRvTG93ZXJDYXNlKCkpY29udGludWU7CiAgICAgIGNlbGxzW2lkeF0uc3R5bGUuYmFja2dyb3VuZENvbG9yPWZpbGxDb2xvcjsKICAgICAgY29uc3QgeD1pZHglZ3JpZFNpemUseT1NYXRoLmZsb29yKGlkeC9ncmlkU2l6ZSk7CiAgICAgIGlmKHg+MClzdGFjay5wdXNoKGlkeC0xKTtpZih4PGdyaWRTaXplLTEpc3RhY2sucHVzaChpZHgrMSk7CiAgICAgIGlmKHk+MClzdGFjay5wdXNoKGlkeC1ncmlkU2l6ZSk7aWYoeTxncmlkU2l6ZS0xKXN0YWNrLnB1c2goaWR4K2dyaWRTaXplKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJnYlRvSGV4KHJnYil7CiAgICBjb25zdCBtPXJnYi5tYXRjaCgvXGQrL2cpO2lmKCFtKXJldHVybiIjMDAwMDAwIjsKICAgIHJldHVybiIjIittLnNsaWNlKDAsMykubWFwKG49PnBhcnNlSW50KG4pLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRHcmlkKCl7CiAgICBncmlkU2l6ZT1wYXJzZUludChzaXplU2VsLnZhbHVlKTsKICAgIGNvbnN0IGNlbGxQeD1NYXRoLm1pbigxNixNYXRoLmZsb29yKE1hdGgubWluKHdyYXAuY2xpZW50V2lkdGgsd3JhcC5jbGllbnRIZWlnaHQpKjAuOTUvZ3JpZFNpemUpKTsKICAgIGdyaWQuc3R5bGUuZ3JpZFRlbXBsYXRlQ29sdW1ucz1gcmVwZWF0KCR7Z3JpZFNpemV9LCR7Y2VsbFB4fXB4KWA7CiAgICBncmlkLmlubmVySFRNTD0iIjtjZWxscz1bXTsKICAgIGZvcihsZXQgaT0wO2k8Z3JpZFNpemUqZ3JpZFNpemU7aSsrKXsKICAgICAgY29uc3QgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNsYXNzTmFtZT0icHgtY2VsbCI7CiAgICAgIGMuc3R5bGUud2lkdGg9Y2VsbFB4KyJweCI7Yy5zdHlsZS5oZWlnaHQ9Y2VsbFB4KyJweCI7CiAgICAgIGMuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjsKICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGU9PnsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7cGFpbnRpbmc9dHJ1ZTsKICAgICAgICBpZih0b29sU2VsLnZhbHVlPT09ImZpbGwiKXsKICAgICAgICAgIGNvbnN0IGlkeD1jZWxscy5pbmRleE9mKGMpOwogICAgICAgICAgY29uc3QgYmc9Yy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICBjb25zdCBoZXg9Ymc/cmdiVG9IZXgoYmcpOiIjMDAwMDAwIjsKICAgICAgICAgIGZsb29kRmlsbChpZHgsaGV4LGNvbG9yUGljay52YWx1ZSk7CiAgICAgICAgfWVsc2UgZmlsbENlbGwoYyk7CiAgICAgIH0pOwogICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT57aWYocGFpbnRpbmcpZmlsbENlbGwoYyk7fSk7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYyk7Y2VsbHMucHVzaChjKTsKICAgIH0KICB9CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCgpPT5wYWludGluZz1mYWxzZSk7CiAgc2l6ZVNlbC5vbmNoYW5nZT1idWlsZEdyaWQ7CiAgYnVpbGRHcmlkKCk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBBU0NJSSBBUlQgTUFLRVIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCmZ1bmN0aW9uIHNob3dBU0NJSShnb0JhY2spewogIGlmKCFnb0JhY2spZ29CYWNrPXNob3dNZW51OwogIGNsZWFyQm9keSgpOwogIGNvbnN0IHBhZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cGFnZS5jbGFzc05hbWU9ImFzY2lpLXBhZ2UiOwogIGNvbnN0IHRiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RiLmNsYXNzTmFtZT0iYXNjaWktdG9vbGJhciI7CgogIGNvbnN0IGNoYXJzZXRMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO2NoYXJzZXRMYWJlbC50ZXh0Q29udGVudD0iIENoYXJzZXQgIjsKICBjb25zdCBjaGFyc2V0U2VsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwogIFtbIlN0YW5kYXJkIiwiQCUjKis9LTouICJdLFsiQmxvY2tzIiwi4paI4paT4paS4paRICJdLFsiU2ltcGxlIiwiIy4gIl0sWyJCaW5hcnkiLCIwMSAiXV0uZm9yRWFjaCgoW24sdl0pPT57CiAgICBjb25zdCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO28udmFsdWU9djtvLnRleHRDb250ZW50PW47Y2hhcnNldFNlbC5hcHBlbmRDaGlsZChvKTsKICB9KTsKCiAgY29uc3Qgd2lkdGhMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO3dpZHRoTGFiZWwudGV4dENvbnRlbnQ9IiBXaWR0aCAiOwogIGNvbnN0IHdpZHRoUmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt3aWR0aFJhbmdlLnR5cGU9InJhbmdlIjt3aWR0aFJhbmdlLm1pbj0yMDt3aWR0aFJhbmdlLm1heD0yMDA7d2lkdGhSYW5nZS52YWx1ZT04MDsKICBjb25zdCB3aWR0aFZhbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO3dpZHRoVmFsLnRleHRDb250ZW50PSI4MCI7CiAgd2lkdGhSYW5nZS5vbmlucHV0PSgpPT57d2lkdGhWYWwudGV4dENvbnRlbnQ9d2lkdGhSYW5nZS52YWx1ZTtpZihsYXN0SW1nKXJlbmRlckltYWdlKGxhc3RJbWcpO307CgogIGNvbnN0IGludmVydENoaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2ludmVydENoay50eXBlPSJjaGVja2JveCI7CiAgY29uc3QgaW52ZXJ0TGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtpbnZlcnRMYWJlbC50ZXh0Q29udGVudD0iIEludmVydCAiOwoKICBjb25zdCBkbEJ0bj1tYWtlQnRuKCJEb3dubG9hZCIsKCk9PnsKICAgIGNvbnN0IGJsb2I9bmV3IEJsb2IoW291dHB1dERpdi50ZXh0Q29udGVudF0se3R5cGU6InRleHQvcGxhaW4ifSk7CiAgICBjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTthLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTthLmRvd25sb2FkPSJhc2NpaV9hcnQudHh0IjthLmNsaWNrKCk7CiAgfSk7CgogIFtiaW5kRXNjSWZUZXJtaW5hbChnb0JhY2spP251bGw6bWFrZUJ0bigiQmFjayIsZ29CYWNrKSxjaGFyc2V0TGFiZWwsY2hhcnNldFNlbCx3aWR0aExhYmVsLHdpZHRoUmFuZ2Usd2lkdGhWYWwsaW52ZXJ0Q2hrLGludmVydExhYmVsLGRsQnRuXS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChlbD0+dGIuYXBwZW5kQ2hpbGQoZWwpKTsKCiAgY29uc3Qgc3BsaXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7c3BsaXQuY2xhc3NOYW1lPSJhc2NpaS1zcGxpdCI7CgogIGNvbnN0IGlucHV0V3JhcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpbnB1dFdyYXAuY2xhc3NOYW1lPSJhc2NpaS1pbnB1dC13cmFwIjsKICBjb25zdCB0YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3RhLnBsYWNlaG9sZGVyPSJUeXBlIHRleHQgaGVyZSBmb3IgdGV4dC10by1BU0NJSS4uLlxuXG5PciBkcm9wIGFuIGltYWdlIG9udG8gdGhpcyBwYW5lbC4iOwoKICBjb25zdCBoaW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2hpbnQuY2xhc3NOYW1lPSJhc2NpaS1kcm9wLWhpbnQiO2hpbnQudGV4dENvbnRlbnQ9IuKshiBUeXBlIHRleHQgYWJvdmUgIHwgIERyb3AgYW4gaW1hZ2UgYW55d2hlcmUgdG8gY29udmVydCBpdCI7CgogIGlucHV0V3JhcC5hcHBlbmRDaGlsZCh0YSk7aW5wdXRXcmFwLmFwcGVuZENoaWxkKGhpbnQpOwoKICBjb25zdCBvdXRwdXREaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7b3V0cHV0RGl2LmNsYXNzTmFtZT0iYXNjaWktb3V0cHV0IjsKCiAgc3BsaXQuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwKTtzcGxpdC5hcHBlbmRDaGlsZChvdXRwdXREaXYpOwogIHBhZ2UuYXBwZW5kQ2hpbGQodGIpO3BhZ2UuYXBwZW5kQ2hpbGQoc3BsaXQpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7CiAgYWRkQ29weXJpZ2h0KCk7CgogIGNvbnN0IEZPTlQ9WwogICAgWycgJywiICAgICAiXSxbJ0EnLCIwMTExMCAxMDAwMSAxMTExMSAxMDAwMSAxMDAwMSJdLFsnQicsIjExMTEwIDEwMDAxIDExMTEwIDEwMDAxIDExMTEwIl0sCiAgICBbJ0MnLCIwMTExMSAxMDAwMCAxMDAwMCAxMDAwMCAwMTExMSJdLFsnRCcsIjExMTEwIDEwMDAxIDEwMDAxIDEwMDAxIDExMTEwIl0sCiAgICBbJ0UnLCIxMTExMSAxMDAwMCAxMTExMCAxMDAwMCAxMTExMSJdLFsnRicsIjExMTExIDEwMDAwIDExMTEwIDEwMDAwIDEwMDAwIl0sCiAgICBbJ0cnLCIwMTExMSAxMDAwMCAxMDAxMSAxMDAwMSAwMTExMSJdLFsnSCcsIjEwMDAxIDEwMDAxIDExMTExIDEwMDAxIDEwMDAxIl0sCiAgICBbJ0knLCIxMTExMSAwMDEwMCAwMDEwMCAwMDEwMCAxMTExMSJdLFsnSicsIjExMTExIDAwMDEwIDAwMDEwIDEwMDEwIDAxMTAwIl0sCiAgICBbJ0snLCIxMDAwMSAxMDAxMCAxMTEwMCAxMDAxMCAxMDAwMSJdLFsnTCcsIjEwMDAwIDEwMDAwIDEwMDAwIDEwMDAwIDExMTExIl0sCiAgICBbJ00nLCIxMDAwMSAxMTAxMSAxMDEwMSAxMDAwMSAxMDAwMSJdLFsnTicsIjEwMDAxIDExMDAxIDEwMTAxIDEwMDExIDEwMDAxIl0sCiAgICBbJ08nLCIwMTExMCAxMDAwMSAxMDAwMSAxMDAwMSAwMTExMCJdLFsnUCcsIjExMTEwIDEwMDAxIDExMTEwIDEwMDAwIDEwMDAwIl0sCiAgICBbJ1EnLCIwMTExMCAxMDAwMSAxMDAwMSAxMDAxMSAwMTExMSJdLFsnUicsIjExMTEwIDEwMDAxIDExMTEwIDEwMDEwIDEwMDAxIl0sCiAgICBbJ1MnLCIwMTExMSAxMDAwMCAwMTExMCAwMDAwMSAxMTExMCJdLFsnVCcsIjExMTExIDAwMTAwIDAwMTAwIDAwMTAwIDAwMTAwIl0sCiAgICBbJ1UnLCIxMDAwMSAxMDAwMSAxMDAwMSAxMDAwMSAwMTExMCJdLFsnVicsIjEwMDAxIDEwMDAxIDEwMDAxIDAxMDEwIDAwMTAwIl0sCiAgICBbJ1cnLCIxMDAwMSAxMDAwMSAxMDEwMSAxMTAxMSAxMDAwMSJdLFsnWCcsIjEwMDAxIDAxMDEwIDAwMTAwIDAxMDEwIDEwMDAxIl0sCiAgICBbJ1knLCIxMDAwMSAwMTAxMCAwMDEwMCAwMDEwMCAwMDEwMCJdLFsnWicsIjExMTExIDAwMDEwIDAwMTAwIDAxMDAwIDExMTExIl0sCiAgICBbJzAnLCIwMTExMCAxMDAxMSAxMDEwMSAxMTAwMSAwMTExMCJdLFsnMScsIjAwMTAwIDAxMTAwIDAwMTAwIDAwMTAwIDAxMTEwIl0sCiAgICBbJzInLCIwMTExMCAxMDAwMSAwMDExMCAwMTAwMCAxMTExMSJdLFsnMycsIjExMTEwIDAwMDAxIDAwMTEwIDAwMDAxIDExMTEwIl0sCiAgICBbJzQnLCIwMDAxMCAwMDExMCAwMTAxMCAxMTExMSAwMDAxMCJdLFsnNScsIjExMTExIDEwMDAwIDExMTEwIDAwMDAxIDExMTEwIl0sCiAgICBbJzYnLCIwMTExMCAxMDAwMCAxMTExMCAxMDAwMSAwMTExMCJdLFsnNycsIjExMTExIDAwMDAxIDAwMDEwIDAwMTAwIDAwMTAwIl0sCiAgICBbJzgnLCIwMTExMCAxMDAwMSAwMTExMCAxMDAwMSAwMTExMCJdLFsnOScsIjAxMTEwIDEwMDAxIDAxMTExIDAwMDAxIDAxMTEwIl0sCiAgICBbJyEnLCIwMDEwMCAwMDEwMCAwMDEwMCAwMDAwMCAwMDEwMCJdLFsnLicsIjAwMDAwIDAwMDAwIDAwMDAwIDAwMDAwIDAwMTAwIl0sCiAgICBbJywnLCIwMDAwMCAwMDAwMCAwMDAwMCAwMDEwMCAwMTAwMCJdLFsnPycsIjAxMTEwIDEwMDAxIDAwMTEwIDAwMDAwIDAwMTAwIl0sCiAgXTsKICBjb25zdCBmb250TWFwPW5ldyBNYXAoRk9OVCk7CgogIGZ1bmN0aW9uIHRleHRUb0FTQ0lJKHRleHQpewogICAgY29uc3QgY2hhcnM9dGV4dC50b1VwcGVyQ2FzZSgpLnNwbGl0KCIiKTsKICAgIGNvbnN0IHJvd3M9WyIiLCIiLCIiLCIiLCIiXTsKICAgIGNoYXJzLmZvckVhY2goY2g9PnsKICAgICAgY29uc3QgcGF0dGVybj1mb250TWFwLmdldChjaCl8fGZvbnRNYXAuZ2V0KCcgJyl8fFsiICAgICAiLCIgICAgICIsIiAgICAgIiwiICAgICAiLCIgICAgICJdOwogICAgICBjb25zdCBsaW5lcz0odHlwZW9mIHBhdHRlcm49PT0ic3RyaW5nIik/cGF0dGVybi5zcGxpdCgiICIpOlsiICAgICAiLCIgICAgICIsIiAgICAgIiwiICAgICAiLCIgICAgICJdOwogICAgICBmb3IobGV0IHI9MDtyPDU7cisrKXsKICAgICAgICBjb25zdCBsaW5lPShsaW5lc1tyXXx8IiAgICAgIikucmVwbGFjZSgvMC9nLCLilogiKS5yZXBsYWNlKC8xL2csIuKWiCIpLnJlcGxhY2UoLzAvZywiICIpOwogICAgICAgIGNvbnN0IHJhdz1saW5lc1tyXXx8IiAgICAgIjsKICAgICAgICByb3dzW3JdKz1yYXcucmVwbGFjZSgvMS9nLCLilogiKS5yZXBsYWNlKC8wL2csIiAiKSsiICAiOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByb3dzLmpvaW4oIlxuIik7CiAgfQoKICBsZXQgbGFzdEltZz1udWxsOwogIGZ1bmN0aW9uIHJlbmRlckltYWdlKGltZyl7CiAgICBsYXN0SW1nPWltZzsKICAgIGNvbnN0IGNoYXJzZXQ9Y2hhcnNldFNlbC52YWx1ZTsKICAgIGNvbnN0IGNoYXJzPWludmVydENoay5jaGVja2VkP1suLi5jaGFyc2V0XS5yZXZlcnNlKCk6Wy4uLmNoYXJzZXRdOwogICAgY29uc3Qgd2lkdGg9cGFyc2VJbnQod2lkdGhSYW5nZS52YWx1ZSk7CiAgICBjb25zdCByYXRpbz1pbWcuaGVpZ2h0L2ltZy53aWR0aDsKICAgIGNvbnN0IGhlaWdodD1NYXRoLnJvdW5kKHdpZHRoKnJhdGlvKjAuNDUpOwogICAgY29uc3QgdGVtcEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGVtcEMud2lkdGg9d2lkdGg7dGVtcEMuaGVpZ2h0PWhlaWdodDsKICAgIGNvbnN0IHRjPXRlbXBDLmdldENvbnRleHQoIjJkIik7dGMuZHJhd0ltYWdlKGltZywwLDAsd2lkdGgsaGVpZ2h0KTsKICAgIGNvbnN0IGQ9dGMuZ2V0SW1hZ2VEYXRhKDAsMCx3aWR0aCxoZWlnaHQpLmRhdGE7CiAgICBsZXQgb3V0PSIiOwogICAgZm9yKGxldCB5PTA7eTxoZWlnaHQ7eSsrKXsKICAgICAgZm9yKGxldCB4PTA7eDx3aWR0aDt4KyspewogICAgICAgIGNvbnN0IGk9KHkqd2lkdGgreCkqNDsKICAgICAgICBjb25zdCBicmlnaHQ9KGRbaV0qMC4yOTkrZFtpKzFdKjAuNTg3K2RbaSsyXSowLjExNCkvMjU1OwogICAgICAgIGNvbnN0IGlkeD1NYXRoLmZsb29yKGJyaWdodCooY2hhcnMubGVuZ3RoLTEpKTsKICAgICAgICBvdXQrPWNoYXJzW2lkeF07CiAgICAgIH0KICAgICAgb3V0Kz0iXG4iOwogICAgfQogICAgb3V0cHV0RGl2LnRleHRDb250ZW50PW91dDsKICB9CgogIHRhLm9uaW5wdXQ9KCk9PntpZih0YS52YWx1ZS50cmltKCkpe2xhc3RJbWc9bnVsbDtvdXRwdXREaXYudGV4dENvbnRlbnQ9dGV4dFRvQVNDSUkodGEudmFsdWUudHJpbSgpKTt9ZWxzZSBvdXRwdXREaXYudGV4dENvbnRlbnQ9IiI7fTsKICBjaGFyc2V0U2VsLm9uY2hhbmdlPSgpPT57aWYobGFzdEltZylyZW5kZXJJbWFnZShsYXN0SW1nKTt9OwogIGludmVydENoay5vbmNoYW5nZT0oKT0+e2lmKGxhc3RJbWcpcmVuZGVySW1hZ2UobGFzdEltZyk7fTsKCiAgZnVuY3Rpb24gaGFuZGxlSW1hZ2VGaWxlKGZpbGUpewogICAgaWYoIWZpbGV8fCFmaWxlLnR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpcmV0dXJuOwogICAgY29uc3Qgcj1uZXcgRmlsZVJlYWRlcigpOwogICAgci5vbmxvYWQ9ZT0+e2NvbnN0IGltZz1uZXcgSW1hZ2UoKTtpbWcub25sb2FkPSgpPT57dGEudmFsdWU9IiI7cmVuZGVySW1hZ2UoaW1nKTt9O2ltZy5zcmM9ZS50YXJnZXQucmVzdWx0O307CiAgICByLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgfQoKICBwYWdlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIixlPT5lLnByZXZlbnREZWZhdWx0KCkpOwogIHBhZ2UuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsZT0+e2UucHJldmVudERlZmF1bHQoKTtoYW5kbGVJbWFnZUZpbGUoZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF0pO30pOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgSEFDS0VSIFRZUEVSIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBzaG93SGFja2VyVHlwZXIoZ29CYWNrKXsKICBpZighZ29CYWNrKWdvQmFjaz1zaG93TWVudTsKICBjbGVhckJvZHkoKTsKICBjb25zdCBwYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BhZ2UuY2xhc3NOYW1lPSJoYWNrZXItcGFnZSI7CiAgY29uc3QgdGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGIuY2xhc3NOYW1lPSJ0b29sYmFyIjsKCiAgY29uc3QgZnJvbVRlcm1pbmFsPWdvQmFjaz09PXNob3dUZXJtaW5hbDsKICBmdW5jdGlvbiBoYWNrZXJLZXkoZSl7CiAgICBpZihlLmtleT09PSJFc2NhcGUiKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixoYWNrZXJLZXkpO2lmKGZyb21UZXJtaW5hbClnb0JhY2soKTtyZXR1cm47fQogICAgaWYoZS5jdHJsS2V5fHxlLm1ldGFLZXkpcmV0dXJuOwogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAga2V5Q291bnQrKzsKICAgIGZvcihsZXQgaT0wO2k8Y2hhcnNQZXJLZXk7aSsrKXsKICAgICAgaWYoY2hhcklkeD49Y29ycHVzLmxlbmd0aCljaGFySWR4PTA7CiAgICAgIGRpc3BsYXkudGV4dENvbnRlbnQrPWNvcnB1c1tjaGFySWR4KytdOwogICAgfQogICAgZGlzcGxheS5zY3JvbGxUb3A9ZGlzcGxheS5zY3JvbGxIZWlnaHQ7CiAgICBpZihrZXlDb3VudCUyMD09PTApe21vZGVJPShtb2RlSSsxKSVtb2Rlcy5sZW5ndGg7bW9kZVNwYW4udGV4dENvbnRlbnQ9Ik1PREU6ICIrbW9kZXNbbW9kZUldO30KICAgIHVwZGF0ZVN0YXR1cygpOwogIH0KCiAgaWYoIWZyb21UZXJtaW5hbCl0Yi5hcHBlbmRDaGlsZChtYWtlQnRuKCJCYWNrIiwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGhhY2tlcktleSk7Z29CYWNrKCk7fSkpOwogIHRiLmFwcGVuZENoaWxkKG1ha2VCdG4oIkNsZWFyIiwoKT0+e2Rpc3BsYXkudGV4dENvbnRlbnQ9IiI7Y2hhcklkeD0wO2tleUNvdW50PTA7dXBkYXRlU3RhdHVzKCk7fSkpOwoKICBjb25zdCBkaXNwbGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rpc3BsYXkuY2xhc3NOYW1lPSJoYWNrZXItZGlzcGxheSI7CiAgZGlzcGxheS50ZXh0Q29udGVudD0iLy8gU1RBUlQgVFlQSU5HIFRPIEJFR0lOLi4uXG4iOwoKICBjb25zdCBzdGF0dXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7c3RhdHVzLmNsYXNzTmFtZT0iaGFja2VyLXN0YXR1cyI7CiAgY29uc3Qga3NTcGFuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtrc1NwYW4udGV4dENvbnRlbnQ9IktFWVNUUk9LRVM6IDAiOwogIGNvbnN0IGxjU3Bhbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7bGNTcGFuLnRleHRDb250ZW50PSJMSU5FUzogMSI7CiAgY29uc3QgbW9kZVNwYW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO21vZGVTcGFuLnRleHRDb250ZW50PSJNT0RFOiBOT1JNQUwiOwogIFtrc1NwYW4sbGNTcGFuLG1vZGVTcGFuXS5mb3JFYWNoKHM9PnN0YXR1cy5hcHBlbmRDaGlsZChzKSk7CgogIHBhZ2UuYXBwZW5kQ2hpbGQoZGlzcGxheSk7cGFnZS5hcHBlbmRDaGlsZChzdGF0dXMpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0Yik7CiAgYWRkQ29weXJpZ2h0KCk7CgogIGNvbnN0IGNvcnB1cz1gI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNkZWZpbmUgQlVGRkVSX1NJWkUgNDA5NgojZGVmaW5lIE1BWF9DT05OIDEyOAp0eXBlZGVmIHN0cnVjdCB7IGludCBmZDsgY2hhciBidWZbQlVGRkVSX1NJWkVdOyBzaXplX3QgbGVuOyB9IGNvbm5fdDsKc3RhdGljIGNvbm5fdCBwb29sW01BWF9DT05OXTsKc3RhdGljIGludCBwb29sX3N6ID0gMDsKdm9pZCBpbml0X3Bvb2woKSB7IG1lbXNldChwb29sLCAwLCBzaXplb2YocG9vbCkpOyB9CmludCBhZGRfY29ubihpbnQgZmQpIHsgaWYgKHBvb2xfc3ogPj0gTUFYX0NPTk4pIHJldHVybiAtMTsgcG9vbFtwb29sX3N6XS5mZCA9IGZkOyBwb29sX3N6Kys7IHJldHVybiAwOyB9CnZvaWQgcmVtb3ZlX2Nvbm4oaW50IGkpIHsgcG9vbFtpXSA9IHBvb2xbLS1wb29sX3N6XTsgfQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICBpbnQgc3J2ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciA9IHswfTsKICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOyBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoODA4MCk7IGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKICBiaW5kKHNydiwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwogIGxpc3RlbihzcnYsIDEwKTsgaW5pdF9wb29sKCk7CiAgcHJpbnRmKCJTZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQgODA4MFxcbiIpOwogIHdoaWxlICgxKSB7CiAgICBmZF9zZXQgZmRzOyBGRF9aRVJPKCZmZHMpOyBGRF9TRVQoc3J2LCAmZmRzKTsKICAgIGludCBtYXhmZCA9IHNydjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbF9zejsgaSsrKSB7IEZEX1NFVChwb29sW2ldLmZkLCAmZmRzKTsgaWYgKHBvb2xbaV0uZmQgPiBtYXhmZCkgbWF4ZmQgPSBwb29sW2ldLmZkOyB9CiAgICBzZWxlY3QobWF4ZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgIGlmIChGRF9JU1NFVChzcnYsICZmZHMpKSB7IGludCBjbGkgPSBhY2NlcHQoc3J2LCBOVUxMLCBOVUxMKTsgYWRkX2Nvbm4oY2xpKTsgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sX3N6OyBpKyspIHsKICAgICAgaWYgKEZEX0lTU0VUKHBvb2xbaV0uZmQsICZmZHMpKSB7CiAgICAgICAgc3NpemVfdCBuID0gcmVhZChwb29sW2ldLmZkLCBwb29sW2ldLmJ1ZiwgQlVGRkVSX1NJWkUpOwogICAgICAgIGlmIChuIDw9IDApIHsgY2xvc2UocG9vbFtpXS5mZCk7IHJlbW92ZV9jb25uKGktLSk7IH0KICAgICAgICBlbHNlIHsgd3JpdGUocG9vbFtpXS5mZCwgcG9vbFtpXS5idWYsIG4pOyB9CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0KCmltcG9ydCBzdWJwcm9jZXNzLCBvcywgc3lzLCBoYXNobGliLCBiYXNlNjQsIGpzb24sIHRpbWUsIHRocmVhZGluZwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsLCBMaXN0LCBEaWN0CmNsYXNzIE9yY2hlc3RyYXRvcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWdfcGF0aDogc3RyKToKICAgICAgICBzZWxmLmNvbmZpZyA9IGpzb24ubG9hZHMoUGF0aChjb25maWdfcGF0aCkucmVhZF90ZXh0KCkpCiAgICAgICAgc2VsZi53b3JrZXJzOiBMaXN0W3RocmVhZGluZy5UaHJlYWRdID0gW10KICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgIHNlbGYuX3Jlc3VsdHM6IERpY3Rbc3RyLCBieXRlc10gPSB7fQogICAgZGVmIHNwYXduKHNlbGYsIHRhcmdldCwgKmFyZ3MpOgogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl93cmFwLCBhcmdzPSh0YXJnZXQsIGFyZ3MpLCBkYWVtb249VHJ1ZSkKICAgICAgICBzZWxmLndvcmtlcnMuYXBwZW5kKHQpOyB0LnN0YXJ0KCkKICAgIGRlZiBfd3JhcChzZWxmLCBmbiwgYXJncyk6CiAgICAgICAga2V5ID0gaGFzaGxpYi5zaGEyNTYoc3RyKGFyZ3MpLmVuY29kZSgpKS5oZXhkaWdlc3QoKVs6OF0KICAgICAgICByZXN1bHQgPSBmbigqYXJncykKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6IHNlbGYuX3Jlc3VsdHNba2V5XSA9IHJlc3VsdAogICAgZGVmIGpvaW5fYWxsKHNlbGYsIHRpbWVvdXQ9MzApOgogICAgICAgIGZvciB3IGluIHNlbGYud29ya2Vyczogdy5qb2luKHRpbWVvdXQ9dGltZW91dCkKICAgIGRlZiByZXN1bHRzKHNlbGYpOiByZXR1cm4gZGljdChzZWxmLl9yZXN1bHRzKQpkZWYgZW5jb2RlX3BheWxvYWQoZGF0YTogYnl0ZXMpIC0+IHN0cjogcmV0dXJuIGJhc2U2NC5iNjRlbmNvZGUoZGF0YSkuZGVjb2RlKCkKZGVmIGRlY29kZV9wYXlsb2FkKHM6IHN0cikgLT4gYnl0ZXM6IHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKHMuZW5jb2RlKCkpCmRlZiBydW5fY21kKGNtZDogc3RyKSAtPiBieXRlczoKICAgIHAgPSBzdWJwcm9jZXNzLnJ1bihjbWQsIHNoZWxsPVRydWUsIGNhcHR1cmVfb3V0cHV0PVRydWUpCiAgICByZXR1cm4gcC5zdGRvdXQgKyBwLnN0ZGVycgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgb3JjaCA9IE9yY2hlc3RyYXRvcihzeXMuYXJndlsxXSBpZiBsZW4oc3lzLmFyZ3YpPjEgZWxzZSAiY29uZmlnLmpzb24iKQogICAgY21kcyA9IFsidW5hbWUgLWEiLCAiZGYgLWgiLCAicHMgYXV4IiwgIm5ldHN0YXQgLWFuIiwgImxzIC9wcm9jIl0KICAgIGZvciBjIGluIGNtZHM6IG9yY2guc3Bhd24ocnVuX2NtZCwgYykKICAgIG9yY2guam9pbl9hbGwoKQogICAgZm9yIGssdiBpbiBvcmNoLnJlc3VsdHMoKS5pdGVtcygpOiBwcmludChmIlt7a31dIHt2WzoxMjBdfSIpCgpmdW5jdGlvbiBkZWNyeXB0KGNpcGhlcnRleHQsIGtleSkgewogIGNvbnN0IGtleUJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSk7CiAgY29uc3QgZGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShhdG9iKGNpcGhlcnRleHQpLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7CiAgcmV0dXJuIGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCBrZXlCeXRlcywge25hbWU6J0FFUy1HQ00nfSwgZmFsc2UsIFsnZGVjcnlwdCddKQogICAgLnRoZW4oayA9PiBjcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6J0FFUy1HQ00nLCBpdjogZGF0YS5zbGljZSgwLDEyKX0sIGssIGRhdGEuc2xpY2UoMTIpKSkKICAgIC50aGVuKGJ1ZiA9PiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnVmKSk7Cn0KYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmREZWNyeXB0KHVybCwga2V5KSB7CiAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwge2hlYWRlcnM6eydYLUF1dGgnOiBidG9hKGtleSl9fSk7CiAgY29uc3QgY3QgPSBhd2FpdCByZXNwLnRleHQoKTsKICByZXR1cm4gYXdhaXQgZGVjcnlwdChjdCwga2V5KTsKfQpjbGFzcyBFdmVudEJ1cyB7CiAgI2hhbmRsZXJzID0gbmV3IE1hcCgpOwogIG9uKGV2LCBmbikgeyAodGhpcy4jaGFuZGxlcnMuZ2V0KGV2KSA/PyB0aGlzLiNoYW5kbGVycy5zZXQoZXYsW10pLmdldChldikpLnB1c2goZm4pOyByZXR1cm4gdGhpczsgfQogIGVtaXQoZXYsIC4uLmFyZ3MpIHsgKHRoaXMuI2hhbmRsZXJzLmdldChldil8fFtdKS5mb3JFYWNoKGZuPT5mbiguLi5hcmdzKSk7IH0KICBvZmYoZXYsIGZuKSB7IHRoaXMuI2hhbmRsZXJzLnNldChldiwodGhpcy4jaGFuZGxlcnMuZ2V0KGV2KXx8W10pLmZpbHRlcihoPT5oIT09Zm4pKTsgfQp9CmA7CgogIGxldCBjaGFySWR4PTAsa2V5Q291bnQ9MDsKICBjb25zdCBjaGFyc1BlcktleT0zOwoKICBmdW5jdGlvbiB1cGRhdGVTdGF0dXMoKXsKICAgIGtzU3Bhbi50ZXh0Q29udGVudD0iS0VZU1RST0tFUzogIitrZXlDb3VudDsKICAgIGxjU3Bhbi50ZXh0Q29udGVudD0iTElORVM6ICIrZGlzcGxheS50ZXh0Q29udGVudC5zcGxpdCgiXG4iKS5sZW5ndGg7CiAgfQoKICBsZXQgbW9kZVRpbWVyOwogIGNvbnN0IG1vZGVzPVsiTk9STUFMIiwiU1VETyIsIlJPT1QiLCJLRVJORUwiLCJNQVRSSVgiLCJCWVBBU1MiXTsKICBsZXQgbW9kZUk9MDsKCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsaGFja2VyS2V5KTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIEZBS0UgVEVSTUlOQUwgKFdpbmRvd3MgQ01EKSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KZnVuY3Rpb24gbWFrZUdhbWVXaW5kb3codGl0bGUsdyxoLGJ1aWxkRm4sZ29CYWNrKXsKICBjb25zdCBvdmVybGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO292ZXJsYXkuY2xhc3NOYW1lPSJnYW1lLXdpbmRvdyI7CiAgY29uc3QgaW5uZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aW5uZXIuY2xhc3NOYW1lPSJnYW1lLWlubmVyIjsKICBsZXQgY2xlYW51cD1udWxsOwogIGNvbnN0IGNsZWFudXBGbj1idWlsZEZuKGlubmVyLG92ZXJsYXkpOwogIGlmKGNsZWFudXBGbiljbGVhbnVwPWNsZWFudXBGbjsKICBvdmVybGF5LmFwcGVuZENoaWxkKGlubmVyKTsKICBmdW5jdGlvbiBjbG9zZUdhbWUoKXsKICAgIGlmKGNsZWFudXApY2xlYW51cCgpOwogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdmVybGF5KTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uRXNjLHRydWUpOwogICAgaWYodHlwZW9mIGlucCE9PSJ1bmRlZmluZWQiJiZpbnAmJmRvY3VtZW50LmJvZHkuY29udGFpbnMoaW5wKSlpbnAuZm9jdXMoKTsKICB9CiAgaWYoZ29CYWNrKXsKICAgIGNvbnN0IGV4aXRCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7ZXhpdEJ0bi5jbGFzc05hbWU9ImdhbWUtZXhpdC1idG4iO2V4aXRCdG4udGV4dENvbnRlbnQ9IuKclSBFeGl0IjsKICAgIGV4aXRCdG4ub25jbGljaz1jbG9zZUdhbWU7CiAgICBvdmVybGF5LmFwcGVuZENoaWxkKGV4aXRCdG4pOwogIH0KICBmdW5jdGlvbiBvbkVzYyhlKXsKICAgIGlmKGUua2V5PT09IkVzY2FwZSIpewogICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICBjbG9zZUdhbWUoKTsKICAgIH0KICB9CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25Fc2MsdHJ1ZSk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTsKfQoKZnVuY3Rpb24gbGF1bmNoUG9uZyhnb0JhY2spewogIGlmKHR5cGVvZiBwcmludD09PSJmdW5jdGlvbiIpcHJpbnQoIk9wZW5pbmcgUG9uZy4uLiBXL1MgdG8gbW92ZS4gU1BBQ0UgdG8gc3RhcnQuIEVTQyB0byBleGl0LiBGaXJzdCB0byAxMSB3aW5zLiIpOwogIG1ha2VHYW1lV2luZG93KCJQT05HIixudWxsLG51bGwsKHdpbik9PnsKICAgIGNvbnN0IFBXPTE0LEJBTEw9MTAsU1BEPTQ7CiAgICBjb25zdCBpbmZvQmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2luZm9CYXIuY2xhc3NOYW1lPSJnYW1lLWluZm8iOwogICAgaW5mb0Jhci5pbm5lckhUTUw9IjxzcGFuPlcvUzwvc3Bhbj4gUDEgJm5ic3A7IDxzcGFuIGlkPSdwZy1wMmhpbnQnPjxzcGFuPkFJPC9zcGFuPjwvc3Bhbj4gUDIgJm5ic3A7IDxzcGFuPlNQQUNFPC9zcGFuPiBzdGFydC9wYXVzZSAmbmJzcDsgU2NvcmU6IDxzcGFuIGlkPSdwZy1zY29yZSc+MCAtIDA8L3NwYW4+ICZuYnNwOyA8c3BhbiBpZD0ncGctc3RhdHVzJz5QcmVzcyBTUEFDRTwvc3Bhbj4iOwogICAgY29uc3Qgd3JhcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt3cmFwLmNsYXNzTmFtZT0iZ2FtZS1jYW52YXMtd3JhcCI7CiAgICBjb25zdCBjdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoY3YpO3dpbi5hcHBlbmRDaGlsZCh3cmFwKTt3aW4uYXBwZW5kQ2hpbGQoaW5mb0Jhcik7CiAgICBjb25zdCBnPWN2LmdldENvbnRleHQoIjJkIik7CiAgICBjb25zdCBXPTgwMCxIPTUwMDsKICAgIGxldCBQSD04MDsKICAgIGN2LndpZHRoPVc7Y3YuaGVpZ2h0PUg7CiAgICBsZXQgcDF5PUgvMi1QSC8yLHAyeT1ILzItUEgvMjsKICAgIGxldCBieD1XLzIsYnk9SC8yLGJkeD1TUEQsYmR5PVNQRCooTWF0aC5yYW5kb20oKT4wLjU/MTotMSk7CiAgICBsZXQgczE9MCxzMj0wLHJ1bm5pbmc9ZmFsc2UscmFmPW51bGwsdHdvUGxheWVyPWZhbHNlLGdhbWVPdmVyPWZhbHNlLHdpbm5lcj0wOwogICAgY29uc3Qga2V5cz17fTsKICAgIGNvbnN0IFAyS0VZUz1bIkFycm93VXAiLCJBcnJvd0Rvd24iXTsKICAgIGNvbnN0IFAxS0VZUz1bInciLCJXIiwicyIsIlMiXTsKCiAgICBmdW5jdGlvbiBjaGVja1R3b1BsYXllcigpewogICAgICBjb25zdCBwMmFjdGl2ZT1QMktFWVMuc29tZShrPT5rZXlzW2tdKTsKICAgICAgY29uc3QgcDFhY3RpdmU9UDFLRVlTLnNvbWUoaz0+a2V5c1trXSk7CiAgICAgIGlmKCF0d29QbGF5ZXImJnAyYWN0aXZlJiZwMWFjdGl2ZSl7CiAgICAgICAgdHdvUGxheWVyPXRydWU7CiAgICAgICAgY29uc3QgaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGctcDJoaW50Iik7aWYoaCloLmlubmVySFRNTD0iPHNwYW4+4oaR4oaTPC9zcGFuPiI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkcmF3KCl7CiAgICAgIGcuZmlsbFN0eWxlPSIjMDAwIjtnLmZpbGxSZWN0KDAsMCxXLEgpOwogICAgICBnLnNldExpbmVEYXNoKFsxMiwxMl0pO2cuc3Ryb2tlU3R5bGU9InJnYmEoMCwyNTUsMCwwLjIpIjtnLmxpbmVXaWR0aD0yO2cuYmVnaW5QYXRoKCk7Zy5tb3ZlVG8oVy8yLDApO2cubGluZVRvKFcvMixIKTtnLnN0cm9rZSgpO2cuc2V0TGluZURhc2goW10pOwogICAgICBnLmZpbGxTdHlsZT0iIzBmMCI7CiAgICAgIGcuZmlsbFJlY3QoMTYscDF5LFBXLFBIKTtnLmZpbGxSZWN0KFctMTYtUFcscDJ5LFBXLFBIKTsKICAgICAgZy5iZWdpblBhdGgoKTtnLmFyYyhieCxieSxCQUxMLzIsMCxNYXRoLlBJKjIpO2cuZmlsbCgpOwogICAgICBnLmZvbnQ9YGJvbGQgJHtNYXRoLmZsb29yKEgqMC4wOSl9cHggbW9ub3NwYWNlYDtnLnRleHRBbGlnbj0iY2VudGVyIjtnLmZpbGxTdHlsZT0icmdiYSgwLDI1NSwwLDAuMTUpIjsKICAgICAgZy5maWxsVGV4dChzMSxXLzItVyowLjEsSCowLjEyKTtnLmZpbGxUZXh0KHMyLFcvMitXKjAuMSxIKjAuMTIpOwogICAgICBpZihnYW1lT3Zlcil7CiAgICAgICAgZy5maWxsU3R5bGU9InJnYmEoMCwwLDAsMC43NSkiO2cuZmlsbFJlY3QoMCxILzItSCowLjEsVyxIKjAuMik7CiAgICAgICAgZy5maWxsU3R5bGU9IiMwZjAiO2cuZm9udD1gYm9sZCAke01hdGguZmxvb3IoSCowLjA1NSl9cHggbW9ub3NwYWNlYDtnLnRleHRBbGlnbj0iY2VudGVyIjsKICAgICAgICBnLmZpbGxUZXh0KCh3aW5uZXI9PT0xPyJQTEFZRVIgMSI6IlBMQVlFUiAyIikrIiBXSU5TISIsVy8yLEgvMitIKjAuMDEpOwogICAgICAgIGcuZm9udD1gJHtNYXRoLmZsb29yKEgqMC4wMjcpfXB4IG1vbm9zcGFjZWA7CiAgICAgICAgZy5maWxsVGV4dCgiUHJlc3MgUiB0byBwbGF5IGFnYWluIixXLzIsSC8yK0gqMC4wNyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoKXsKICAgICAgaWYoZ2FtZU92ZXIpcmV0dXJuOwogICAgICBjaGVja1R3b1BsYXllcigpOwogICAgICBpZihrZXlzWyJ3Il18fGtleXNbIlciXSlwMXk9TWF0aC5tYXgoMCxwMXktNyk7CiAgICAgIGlmKGtleXNbInMiXXx8a2V5c1siUyJdKXAxeT1NYXRoLm1pbihILVBILHAxeSs3KTsKICAgICAgaWYodHdvUGxheWVyKXsKICAgICAgICBpZihrZXlzWyJBcnJvd1VwIl0pcDJ5PU1hdGgubWF4KDAscDJ5LTcpOwogICAgICAgIGlmKGtleXNbIkFycm93RG93biJdKXAyeT1NYXRoLm1pbihILVBILHAyeSs3KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjZW50ZXI9cDJ5K1BILzI7CiAgICAgICAgaWYoY2VudGVyPGJ5LTQpcDJ5PU1hdGgubWluKEgtUEgscDJ5KzUpO2Vsc2UgaWYoY2VudGVyPmJ5KzQpcDJ5PU1hdGgubWF4KDAscDJ5LTUpOwogICAgICB9CiAgICAgIGJ4Kz1iZHg7YnkrPWJkeTsKICAgICAgaWYoYnk8PUJBTEwvMnx8Ynk+PUgtQkFMTC8yKWJkeSo9LTE7CiAgICAgIGlmKGJ4LUJBTEwvMjw9MzAmJmJ5Pj1wMXkmJmJ5PD1wMXkrUEgpe2JkeD1NYXRoLmFicyhiZHgpO2JkeSs9KGJ5LShwMXkrUEgvMikpKjAuMTt9CiAgICAgIGlmKGJ4K0JBTEwvMj49Vy0zMC1QVyYmYnk+PXAyeSYmYnk8PXAyeStQSCl7YmR4PS1NYXRoLmFicyhiZHgpO2JkeSs9KGJ5LShwMnkrUEgvMikpKjAuMTt9CiAgICAgIGNvbnN0IHNwPU1hdGguc3FydChiZHgqYmR4K2JkeSpiZHkpO2lmKHNwPjEwKXtiZHg9YmR4L3NwKjEwO2JkeT1iZHkvc3AqMTA7fQogICAgICBpZihieDwwKXtzMisrO2NoZWNrV2luKDIpO30KICAgICAgaWYoYng+Vyl7czErKztjaGVja1dpbigxKTt9CiAgICAgIGNvbnN0IHNjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwZy1zY29yZSIpO2lmKHNjKXNjLnRleHRDb250ZW50PXMxKyIgLSAiK3MyOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrV2luKHBsYXllcil7CiAgICAgIGlmKChwbGF5ZXI9PT0xJiZzMT49MTEpfHwocGxheWVyPT09MiYmczI+PTExKSl7CiAgICAgICAgZ2FtZU92ZXI9dHJ1ZTt3aW5uZXI9cGxheWVyO3J1bm5pbmc9ZmFsc2U7CiAgICAgICAgY29uc3Qgc3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBnLXN0YXR1cyIpO2lmKHN0KXN0LnRleHRDb250ZW50PSIiOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc2V0KCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXNldCgpe2J4PVcvMjtieT1ILzI7YmR4PVNQRCooTWF0aC5yYW5kb20oKT4wLjU/MTotMSk7YmR5PVNQRCooTWF0aC5yYW5kb20oKT4wLjU/MTotMSk7cnVubmluZz1mYWxzZTtjb25zdCBzdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGctc3RhdHVzIik7aWYoc3Qpc3QudGV4dENvbnRlbnQ9IlByZXNzIFNQQUNFIjt9CgogICAgZnVuY3Rpb24gbG9vcCgpe2RyYXcoKTtpZihydW5uaW5nKXVwZGF0ZSgpO3JhZj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7fQogICAgbG9vcCgpOwoKICAgIGZ1bmN0aW9uIG9uS2V5KGUpewogICAgICBrZXlzW2Uua2V5XT1lLnR5cGU9PT0ia2V5ZG93biI7CiAgICAgIGlmKGUudHlwZT09PSJrZXlkb3duIil7CiAgICAgICAgaWYoZS5rZXk9PT0iICIpe2UucHJldmVudERlZmF1bHQoKTtpZighZ2FtZU92ZXIpe3J1bm5pbmc9IXJ1bm5pbmc7Y29uc3Qgc3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBnLXN0YXR1cyIpO2lmKHN0KXN0LnRleHRDb250ZW50PXJ1bm5pbmc/IiI6IiI7fTt9CiAgICAgICAgaWYoKGUua2V5PT09InIifHxlLmtleT09PSJSIikmJmdhbWVPdmVyKXtzMT0wO3MyPTA7Z2FtZU92ZXI9ZmFsc2U7d2lubmVyPTA7dHdvUGxheWVyPWZhbHNlO2NvbnN0IGg9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBnLXAyaGludCIpO2lmKGgpaC5pbm5lckhUTUw9IjxzcGFuPkFJPC9zcGFuPiI7cmVzZXQoKTt9CiAgICAgIH0KICAgICAgaWYoWy4uLlAxS0VZUywuLi5QMktFWVMsIiAiXS5pbmNsdWRlcyhlLmtleSkpZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25LZXkpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixvbktleSk7CiAgICByZXR1cm4oKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZik7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25LZXkpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixvbktleSk7fTsKICB9LGdvQmFjayk7Cn0KCmZ1bmN0aW9uIGxhdW5jaFRldHJpcyhnb0JhY2spewogIGlmKHR5cGVvZiBwcmludD09PSJmdW5jdGlvbiIpcHJpbnQoIk9wZW5pbmcgVGV0cmlzLi4uIEFycm93IGtleXMgdG8gbW92ZSwgVXAgdG8gcm90YXRlLCBTcGFjZSB0byBkcm9wLiBFU0MgdG8gZXhpdC4iKTsKICBtYWtlR2FtZVdpbmRvdygiVEVUUklTIixudWxsLG51bGwsKHdpbik9PnsKICAgIGNvbnN0IENPTFM9MTAsUk9XUz0yMCxTWj0zMDsKICAgIGNvbnN0IGluZm9CYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aW5mb0Jhci5jbGFzc05hbWU9ImdhbWUtaW5mbyI7CiAgICBpbmZvQmFyLmlubmVySFRNTD0iPHNwYW4+4oaQ4oaSPC9zcGFuPiBtb3ZlICZuYnNwOyA8c3Bhbj7ihpE8L3NwYW4+IHJvdGF0ZSAmbmJzcDsgPHNwYW4+4oaTPC9zcGFuPiBzb2Z0IGRyb3AgJm5ic3A7IDxzcGFuPlNQQUNFPC9zcGFuPiBoYXJkIGRyb3AgJm5ic3A7IFNjb3JlOiA8c3BhbiBpZD0ndGV0LXNjb3JlJz4wPC9zcGFuPiAmbmJzcDsgTGV2ZWw6IDxzcGFuIGlkPSd0ZXQtbGV2ZWwnPjE8L3NwYW4+IjsKICAgIGNvbnN0IHdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7d3JhcC5jbGFzc05hbWU9ImdhbWUtY2FudmFzLXdyYXAiOwogICAgY29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBjdi53aWR0aD0oQ09MUys1KSpTWjtjdi5oZWlnaHQ9Uk9XUypTWjsKICAgIHdyYXAuYXBwZW5kQ2hpbGQoY3YpO3dpbi5hcHBlbmRDaGlsZCh3cmFwKTt3aW4uYXBwZW5kQ2hpbGQoaW5mb0Jhcik7CiAgICBjb25zdCBnPWN2LmdldENvbnRleHQoIjJkIik7CgogICAgY29uc3QgUElFQ0VTPVsKICAgICAge3M6W1sxLDEsMSwxXV0sYzoiIzBmZiJ9LHtzOltbMSwwXSxbMSwwXSxbMSwxXV0sYzoiI2ZhMCJ9LHtzOltbMCwxXSxbMCwxXSxbMSwxXV0sYzoiIzAwZiJ9LAogICAgICB7czpbWzEsMV0sWzEsMV1dLGM6IiNmZjAifSx7czpbWzAsMSwxXSxbMSwxLDBdXSxjOiIjMGYwIn0se3M6W1sxLDEsMV0sWzAsMSwwXV0sYzoiI2EwZiJ9LAogICAgICB7czpbWzEsMSwwXSxbMCwxLDFdXSxjOiIjZjAwIn0sCiAgICBdOwogICAgZnVuY3Rpb24gcm90YXRlKHMpe3JldHVybiBzWzBdLm1hcCgoXyxpKT0+cy5tYXAocj0+cltpXSkucmV2ZXJzZSgpKTt9CiAgICBsZXQgYm9hcmQ9QXJyYXkuZnJvbSh7bGVuZ3RoOlJPV1N9LCgpPT5BcnJheShDT0xTKS5maWxsKG51bGwpKTsKICAgIGxldCBjdXI9bnVsbCxjdXJYPTAsY3VyWT0wLG5leHQ9bnVsbCxzY29yZT0wLGxldmVsPTEsbGluZXM9MCxnYW1lT3Zlcj1mYWxzZSxwYXVzZWQ9ZmFsc2UsZHJvcFRpbWVyPTAsZHJvcEludGVydmFsPTUwMDsKICAgIGZ1bmN0aW9uIHJhbmRQaWVjZSgpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFBJRUNFU1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqUElFQ0VTLmxlbmd0aCldKSk7fQogICAgZnVuY3Rpb24gc3Bhd24oKXsKICAgICAgY3VyPW5leHR8fHJhbmRQaWVjZSgpO25leHQ9cmFuZFBpZWNlKCk7CiAgICAgIGN1clg9TWF0aC5mbG9vcihDT0xTLzIpLU1hdGguZmxvb3IoY3VyLnNbMF0ubGVuZ3RoLzIpO2N1clk9MDsKICAgICAgaWYoIWNhblBsYWNlKGN1ci5zLGN1clgsY3VyWSkpZ2FtZU92ZXI9dHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhblBsYWNlKHMseCx5KXsKICAgICAgZm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZm9yKGxldCBjPTA7YzxzW3JdLmxlbmd0aDtjKyspewogICAgICAgIGlmKHNbcl1bY10pe2NvbnN0IG54PXgrYyxueT15K3I7aWYobng8MHx8bng+PUNPTFN8fG55Pj1ST1dTKXJldHVybiBmYWxzZTtpZihueT49MCYmYm9hcmRbbnldW254XSlyZXR1cm4gZmFsc2U7fQogICAgICB9cmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBsb2NrKCl7CiAgICAgIGN1ci5zLmZvckVhY2goKHIscmkpPT5yLmZvckVhY2goKHYsY2kpPT57aWYodiYmY3VyWStyaT49MClib2FyZFtjdXJZK3JpXVtjdXJYK2NpXT1jdXIuYzt9KSk7CiAgICAgIGJvYXJkPWJvYXJkLmZpbHRlcihyPT4hci5ldmVyeShjPT5jKSk7CiAgICAgIGNvbnN0IGNsZWFyZWQ9Uk9XUy1ib2FyZC5sZW5ndGg7CiAgICAgIHdoaWxlKGJvYXJkLmxlbmd0aDxST1dTKWJvYXJkLnVuc2hpZnQoQXJyYXkoQ09MUykuZmlsbChudWxsKSk7CiAgICAgIGxpbmVzKz1jbGVhcmVkO3Njb3JlKz1bMCwxMDAsMzAwLDUwMCw4MDBdW2NsZWFyZWRdKmxldmVsOwogICAgICBsZXZlbD1NYXRoLmZsb29yKGxpbmVzLzEwKSsxO2Ryb3BJbnRlcnZhbD1NYXRoLm1heCg4MCw1MDAtbGV2ZWwqNDApOwogICAgICBjb25zdCBzYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV0LXNjb3JlIik7aWYoc2Mpc2MudGV4dENvbnRlbnQ9c2NvcmU7CiAgICAgIGNvbnN0IGx2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXQtbGV2ZWwiKTtpZihsdilsdi50ZXh0Q29udGVudD1sZXZlbDsKICAgICAgc3Bhd24oKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRyYXdCb2FyZCgpewogICAgICBjb25zdCBXPWN2LndpZHRoLEg9Y3YuaGVpZ2h0LFBBTkVMPTUqU1osQlc9Q09MUypTWjsKICAgICAgZy5maWxsU3R5bGU9IiMwMDAiO2cuZmlsbFJlY3QoMCwwLFcsSCk7CiAgICAgIGcuc3Ryb2tlU3R5bGU9InJnYmEoMCwyNTUsMCwwLjA2KSI7Zy5saW5lV2lkdGg9MTsKICAgICAgZm9yKGxldCByPTA7cjxST1dTO3IrKylmb3IobGV0IGM9MDtjPENPTFM7YysrKWcuc3Ryb2tlUmVjdChjKlNaLHIqU1osU1osU1opOwogICAgICBnLnN0cm9rZVN0eWxlPSJyZ2JhKDAsMjU1LDAsMC4zKSI7Zy5iZWdpblBhdGgoKTtnLm1vdmVUbyhCVywwKTtnLmxpbmVUbyhCVyxIKTtnLnN0cm9rZSgpOwogICAgICBib2FyZC5mb3JFYWNoKChyb3cscik9PnJvdy5mb3JFYWNoKChjb2wsYyk9PntpZihjb2wpe2cuZmlsbFN0eWxlPWNvbDtnLmZpbGxSZWN0KGMqU1orMSxyKlNaKzEsU1otMixTWi0yKTt9fSkpOwogICAgICBpZihjdXImJiFnYW1lT3Zlcil7bGV0IGd5PWN1clk7d2hpbGUoY2FuUGxhY2UoY3VyLnMsY3VyWCxneSsxKSlneSsrOwogICAgICAgIGN1ci5zLmZvckVhY2goKHIscmkpPT5yLmZvckVhY2goKHYsY2kpPT57aWYodil7Zy5maWxsU3R5bGU9InJnYmEoMjU1LDI1NSwyNTUsMC4wOCkiO2cuZmlsbFJlY3QoKGN1clgrY2kpKlNaKzEsKGd5K3JpKSpTWisxLFNaLTIsU1otMik7fX0pKTt9CiAgICAgIGlmKGN1ciljdXIucy5mb3JFYWNoKChyLHJpKT0+ci5mb3JFYWNoKCh2LGNpKT0+e2lmKHYpe2cuZmlsbFN0eWxlPWN1ci5jO2cuZmlsbFJlY3QoKGN1clgrY2kpKlNaKzEsKGN1clkrcmkpKlNaKzEsU1otMixTWi0yKTt9fSkpOwogICAgICBnLmZpbGxTdHlsZT0iIzBhMGEwYSI7Zy5maWxsUmVjdChCVysxLDAsUEFORUwtMSxIKTsKICAgICAgY29uc3QgcHg9QlcrUEFORUwvMixmcz1NYXRoLm1heCg5LE1hdGguZmxvb3IoU1oqMC4zOCkpOwogICAgICBnLmZpbGxTdHlsZT0iIzBhMCI7Zy5mb250PWAke2ZzfXB4IG1vbm9zcGFjZWA7Zy50ZXh0QWxpZ249ImNlbnRlciI7Zy5maWxsVGV4dCgiTkVYVCIscHgsU1oqMC44KTsKICAgICAgaWYobmV4dCl7Y29uc3Qgb3g9QlcrTWF0aC5mbG9vcigoUEFORUwtbmV4dC5zWzBdLmxlbmd0aCpTWikvMiksb3k9TWF0aC5mbG9vcihTWioxLjIpOwogICAgICAgIG5leHQucy5mb3JFYWNoKChyLHJpKT0+ci5mb3JFYWNoKCh2LGNpKT0+e2lmKHYpe2cuZmlsbFN0eWxlPW5leHQuYztnLmZpbGxSZWN0KG94K2NpKlNaKzEsb3krcmkqU1orMSxTWi0yLFNaLTIpO319KSk7fQogICAgICBnLmZpbGxTdHlsZT0iIzBhMCI7Zy5mb250PWAke2ZzfXB4IG1vbm9zcGFjZWA7Zy5maWxsVGV4dCgiU0NPUkUiLHB4LEgtU1oqMi40KTsKICAgICAgZy5maWxsU3R5bGU9IiMwZjAiO2cuZm9udD1gYm9sZCAke01hdGguZmxvb3IoZnMqMS4yKX1weCBtb25vc3BhY2VgO2cuZmlsbFRleHQoc2NvcmUscHgsSC1TWioxLjgpOwogICAgICBnLmZpbGxTdHlsZT0iIzBhMCI7Zy5mb250PWAke2ZzfXB4IG1vbm9zcGFjZWA7Zy5maWxsVGV4dCgiTEVWRUwiLHB4LEgtU1oqMS4xKTsKICAgICAgZy5maWxsU3R5bGU9IiMwZjAiO2cuZm9udD1gYm9sZCAke01hdGguZmxvb3IoZnMqMS4yKX1weCBtb25vc3BhY2VgO2cuZmlsbFRleHQobGV2ZWwscHgsSC1TWiowLjUpOwogICAgICBpZihnYW1lT3Zlcil7Zy5maWxsU3R5bGU9InJnYmEoMCwwLDAsMC43NSkiO2cuZmlsbFJlY3QoMCxILzItU1oqMS4yLEJXLFNaKjIuNCk7CiAgICAgICAgZy5maWxsU3R5bGU9IiMwZjAiO2cuZm9udD1gYm9sZCAke01hdGguZmxvb3IoU1oqMC44KX1weCBtb25vc3BhY2VgO2cudGV4dEFsaWduPSJjZW50ZXIiOwogICAgICAgIGcuZmlsbFRleHQoIkdBTUUgT1ZFUiIsQlcvMixILzItU1oqMC4yKTtnLmZvbnQ9YCR7TWF0aC5mbG9vcihTWiowLjUpfXB4IG1vbm9zcGFjZWA7Zy5maWxsVGV4dCgiUHJlc3MgUiB0byByZXN0YXJ0IixCVy8yLEgvMitTWiowLjgpO30KICAgIH0KICAgIGxldCBsYXN0VD0wLHJhZj1udWxsOwogICAgZnVuY3Rpb24gbG9vcCh0KXsKICAgICAgcmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgICAgaWYoIXBhdXNlZCYmIWdhbWVPdmVyKXtkcm9wVGltZXIrPXQtbGFzdFQ7aWYoZHJvcFRpbWVyPj1kcm9wSW50ZXJ2YWwpe2Ryb3BUaW1lcj0wO2lmKGNhblBsYWNlKGN1ci5zLGN1clgsY3VyWSsxKSljdXJZKys7ZWxzZSBsb2NrKCk7fX0KICAgICAgbGFzdFQ9dDtkcmF3Qm9hcmQoKTsKICAgIH0KICAgIHNwYXduKCk7cmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgIGZ1bmN0aW9uIG9uS2V5KGUpewogICAgICBpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhjdikpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTtyZXR1cm47fQogICAgICBpZihlLmtleT09PSJyInx8ZS5rZXk9PT0iUiIpe2JvYXJkPUFycmF5LmZyb20oe2xlbmd0aDpST1dTfSwoKT0+QXJyYXkoQ09MUykuZmlsbChudWxsKSk7c2NvcmU9MDtsZXZlbD0xO2xpbmVzPTA7Z2FtZU92ZXI9ZmFsc2U7ZHJvcEludGVydmFsPTUwMDtjdXI9bnVsbDtuZXh0PW51bGw7c3Bhd24oKTtyZXR1cm47fQogICAgICBpZihnYW1lT3Zlcnx8cGF1c2VkKXJldHVybjsKICAgICAgaWYoZS5rZXk9PT0iQXJyb3dMZWZ0Iil7aWYoY2FuUGxhY2UoY3VyLnMsY3VyWC0xLGN1clkpKWN1clgtLTt9CiAgICAgIGVsc2UgaWYoZS5rZXk9PT0iQXJyb3dSaWdodCIpe2lmKGNhblBsYWNlKGN1ci5zLGN1clgrMSxjdXJZKSljdXJYKys7fQogICAgICBlbHNlIGlmKGUua2V5PT09IkFycm93RG93biIpe2lmKGNhblBsYWNlKGN1ci5zLGN1clgsY3VyWSsxKSl7Y3VyWSsrO3Njb3JlKys7fX0KICAgICAgZWxzZSBpZihlLmtleT09PSJBcnJvd1VwIil7Y29uc3Qgcj1yb3RhdGUoY3VyLnMpO2lmKGNhblBsYWNlKHIsY3VyWCxjdXJZKSljdXIucz1yO30KICAgICAgZWxzZSBpZihlLmtleT09PSIgIil7bGV0IGR5PTA7d2hpbGUoY2FuUGxhY2UoY3VyLnMsY3VyWCxjdXJZK2R5KzEpKWR5Kys7Y3VyWSs9ZHk7c2NvcmUrPWR5KjI7bG9jaygpO30KICAgICAgZWxzZSBpZihlLmtleT09PSJwInx8ZS5rZXk9PT0iUCIpe3BhdXNlZD0hcGF1c2VkO30KICAgICAgaWYoWyJBcnJvd0xlZnQiLCJBcnJvd1JpZ2h0IiwiQXJyb3dEb3duIiwiQXJyb3dVcCIsIiAiXS5pbmNsdWRlcyhlLmtleSkpZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25LZXkpOwogICAgcmV0dXJuKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTt9OwogIH0sZ29CYWNrKTsKfQoKZnVuY3Rpb24gbGF1bmNoTWluZXN3ZWVwZXIoZ29CYWNrKXsKICBpZih0eXBlb2YgcHJpbnQ9PT0iZnVuY3Rpb24iKXByaW50KCJPcGVuaW5nIE1pbmVzd2VlcGVyLi4uIExlZnQtY2xpY2sgdG8gcmV2ZWFsLCBSaWdodC1jbGljayB0byBmbGFnLiBFU0MgdG8gZXhpdC4iKTsKICBtYWtlR2FtZVdpbmRvdygiTUlORVNXRUVQRVIiLG51bGwsbnVsbCwod2luKT0+ewogICAgY29uc3QgQ09MUz0yMCxST1dTPTE2LE1JTkVTPTUwLFNaPTMwOwogICAgY29uc3QgaW5mb0Jhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpbmZvQmFyLmNsYXNzTmFtZT0iZ2FtZS1pbmZvIjsKICAgIGluZm9CYXIuaW5uZXJIVE1MPSJMZWZ0LWNsaWNrOiByZXZlYWwgJm5ic3A7IFJpZ2h0LWNsaWNrOiBmbGFnICZuYnNwOyBNaW5lczogPHNwYW4gaWQ9J21zLW1pbmVzJz41MDwvc3Bhbj4gJm5ic3A7IFRpbWU6IDxzcGFuIGlkPSdtcy10aW1lJz4wPC9zcGFuPnMgJm5ic3A7IDxzcGFuIGlkPSdtcy1zdGF0dXMnPkdvb2QgbHVjayE8L3NwYW4+IjsKICAgIGNvbnN0IHdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7d3JhcC5jbGFzc05hbWU9ImdhbWUtY2FudmFzLXdyYXAiOwogICAgY29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7Y3Yuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjsKICAgIGN2LndpZHRoPUNPTFMqU1o7Y3YuaGVpZ2h0PVJPV1MqU1o7CiAgICB3cmFwLmFwcGVuZENoaWxkKGN2KTt3aW4uYXBwZW5kQ2hpbGQod3JhcCk7d2luLmFwcGVuZENoaWxkKGluZm9CYXIpOwogICAgY29uc3QgZz1jdi5nZXRDb250ZXh0KCIyZCIpOwogICAgbGV0IGJvYXJkPVtdLHJldmVhbGVkPVtdLGZsYWdnZWQ9W10sZmlyc3RDbGljaz10cnVlLGdhbWVPdmVyPWZhbHNlLHdvbj1mYWxzZSx0aW1lcj0wLHRpbWVySXY9bnVsbDsKICAgIGZ1bmN0aW9uIGluaXQoKXsKICAgICAgYm9hcmQ9QXJyYXkuZnJvbSh7bGVuZ3RoOlJPV1N9LCgpPT5BcnJheShDT0xTKS5maWxsKDApKTsKICAgICAgcmV2ZWFsZWQ9QXJyYXkuZnJvbSh7bGVuZ3RoOlJPV1N9LCgpPT5BcnJheShDT0xTKS5maWxsKGZhbHNlKSk7CiAgICAgIGZsYWdnZWQ9QXJyYXkuZnJvbSh7bGVuZ3RoOlJPV1N9LCgpPT5BcnJheShDT0xTKS5maWxsKGZhbHNlKSk7CiAgICAgIGZpcnN0Q2xpY2s9dHJ1ZTtnYW1lT3Zlcj1mYWxzZTt3b249ZmFsc2U7dGltZXI9MDtjbGVhckludGVydmFsKHRpbWVySXYpOwogICAgICBjb25zdCB0bT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibXMtdGltZSIpO2lmKHRtKXRtLnRleHRDb250ZW50PSIwIjsKICAgICAgY29uc3QgbXM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1zLW1pbmVzIik7aWYobXMpbXMudGV4dENvbnRlbnQ9TUlORVM7CiAgICAgIGNvbnN0IHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtcy1zdGF0dXMiKTtpZihzdClzdC50ZXh0Q29udGVudD0iR29vZCBsdWNrISI7CiAgICAgIGRyYXcoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBsYW50TWluZXMoYXZvaWRSLGF2b2lkQyl7CiAgICAgIGxldCBwbGFjZWQ9MDsKICAgICAgd2hpbGUocGxhY2VkPE1JTkVTKXtjb25zdCByPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpST1dTKSxjPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpDT0xTKTsKICAgICAgICBpZigoTWF0aC5hYnMoci1hdm9pZFIpPjF8fE1hdGguYWJzKGMtYXZvaWRDKT4xKSYmYm9hcmRbcl1bY10hPT0tMSl7Ym9hcmRbcl1bY109LTE7cGxhY2VkKys7fX0KICAgICAgZm9yKGxldCByPTA7cjxST1dTO3IrKylmb3IobGV0IGM9MDtjPENPTFM7YysrKXsKICAgICAgICBpZihib2FyZFtyXVtjXT09PS0xKWNvbnRpbnVlO2xldCBuPTA7CiAgICAgICAgZm9yKGxldCBkcj0tMTtkcjw9MTtkcisrKWZvcihsZXQgZGM9LTE7ZGM8PTE7ZGMrKyl7Y29uc3QgbnI9citkcixuYz1jK2RjO2lmKG5yPj0wJiZucjxST1dTJiZuYz49MCYmbmM8Q09MUyYmYm9hcmRbbnJdW25jXT09PS0xKW4rKzt9CiAgICAgICAgYm9hcmRbcl1bY109bjt9CiAgICB9CiAgICBmdW5jdGlvbiByZXZlYWwocixjKXsKICAgICAgaWYocjwwfHxyPj1ST1dTfHxjPDB8fGM+PUNPTFN8fHJldmVhbGVkW3JdW2NdfHxmbGFnZ2VkW3JdW2NdKXJldHVybjsKICAgICAgcmV2ZWFsZWRbcl1bY109dHJ1ZTsKICAgICAgaWYoYm9hcmRbcl1bY109PT0wKWZvcihsZXQgZHI9LTE7ZHI8PTE7ZHIrKylmb3IobGV0IGRjPS0xO2RjPD0xO2RjKyspcmV2ZWFsKHIrZHIsYytkYyk7CiAgICB9CiAgICBmdW5jdGlvbiBjaGVja1dpbigpe2xldCBuPTA7Zm9yKGxldCByPTA7cjxST1dTO3IrKylmb3IobGV0IGM9MDtjPENPTFM7YysrKWlmKCFyZXZlYWxlZFtyXVtjXSluKys7cmV0dXJuIG49PT1NSU5FUzt9CiAgICBjb25zdCBDT0xPUlM9WyIiLCIjNGFmIiwiIzBmMCIsIiNmNTUiLCIjNDRmIiwiI2Y0NCIsIiMwZmYiLCIjYWFhIiwiIzg4OCJdOwogICAgZnVuY3Rpb24gZHJhdygpewogICAgICBjb25zdCBXPWN2LndpZHRoLEg9Y3YuaGVpZ2h0OwogICAgICBnLmZpbGxTdHlsZT0iIzBhMGEwYSI7Zy5maWxsUmVjdCgwLDAsVyxIKTsKICAgICAgZm9yKGxldCByPTA7cjxST1dTO3IrKylmb3IobGV0IGM9MDtjPENPTFM7YysrKXsKICAgICAgICBjb25zdCB4PWMqU1oseT1yKlNaLGZzPU1hdGgubWF4KDgsU1otOCk7CiAgICAgICAgaWYocmV2ZWFsZWRbcl1bY10pewogICAgICAgICAgZy5maWxsU3R5bGU9Ym9hcmRbcl1bY109PT0tMT8iIzMwMCI6IiMxMTEiO2cuZmlsbFJlY3QoeCsxLHkrMSxTWi0yLFNaLTIpOwogICAgICAgICAgaWYoYm9hcmRbcl1bY109PT0tMSl7Zy5mb250PWAke2ZzfXB4IG1vbm9zcGFjZWA7Zy50ZXh0QWxpZ249ImNlbnRlciI7Zy50ZXh0QmFzZWxpbmU9Im1pZGRsZSI7Zy5maWxsVGV4dCgi8J+SoyIseCtTWi8yLHkrU1ovMisxKTt9CiAgICAgICAgICBlbHNlIGlmKGJvYXJkW3JdW2NdPjApe2cuZmlsbFN0eWxlPUNPTE9SU1tib2FyZFtyXVtjXV18fCIjMGYwIjtnLmZvbnQ9YGJvbGQgJHtmc31weCBtb25vc3BhY2VgO2cudGV4dEFsaWduPSJjZW50ZXIiO2cudGV4dEJhc2VsaW5lPSJtaWRkbGUiO2cuZmlsbFRleHQoYm9hcmRbcl1bY10seCtTWi8yLHkrU1ovMik7fQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnLmZpbGxTdHlsZT1nYW1lT3ZlciYmYm9hcmRbcl1bY109PT0tMT8iIzMwMCI6IiMxYTFhMWEiO2cuZmlsbFJlY3QoeCsxLHkrMSxTWi0yLFNaLTIpOwogICAgICAgICAgZy5zdHJva2VTdHlsZT0icmdiYSgwLDI1NSwwLDAuMikiO2cuc3Ryb2tlUmVjdCh4KzEseSsxLFNaLTIsU1otMik7CiAgICAgICAgICBpZihmbGFnZ2VkW3JdW2NdKXtnLmZvbnQ9YCR7ZnN9cHggbW9ub3NwYWNlYDtnLnRleHRBbGlnbj0iY2VudGVyIjtnLnRleHRCYXNlbGluZT0ibWlkZGxlIjtnLmZpbGxUZXh0KCLwn5qpIix4K1NaLzIseStTWi8yKzEpO30KICAgICAgICAgIGVsc2UgaWYoZ2FtZU92ZXImJmJvYXJkW3JdW2NdPT09LTEpe2cuZm9udD1gJHtmc31weCBtb25vc3BhY2VgO2cudGV4dEFsaWduPSJjZW50ZXIiO2cudGV4dEJhc2VsaW5lPSJtaWRkbGUiO2cuZmlsbFRleHQoIvCfkqMiLHgrU1ovMix5K1NaLzIrMSk7fQogICAgICAgIH0KICAgICAgICBnLnN0cm9rZVN0eWxlPSJyZ2JhKDAsMjU1LDAsMC4wNykiO2cuc3Ryb2tlUmVjdCh4LHksU1osU1opOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDZWxsKGUpewogICAgICBjb25zdCByZWN0PWN2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBzY2FsZVg9Y3Yud2lkdGgvcmVjdC53aWR0aCxzY2FsZVk9Y3YuaGVpZ2h0L3JlY3QuaGVpZ2h0OwogICAgICBjb25zdCBjPU1hdGguZmxvb3IoKGUuY2xpZW50WC1yZWN0LmxlZnQpKnNjYWxlWC9TWikscj1NYXRoLmZsb29yKChlLmNsaWVudFktcmVjdC50b3ApKnNjYWxlWS9TWik7CiAgICAgIHJldHVybntyLGN9OwogICAgfQogICAgY3YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGU9PnsKICAgICAgaWYoZ2FtZU92ZXJ8fHdvbilyZXR1cm47CiAgICAgIGNvbnN0e3IsY309Z2V0Q2VsbChlKTtpZihyPDB8fHI+PVJPV1N8fGM8MHx8Yz49Q09MU3x8ZmxhZ2dlZFtyXVtjXSlyZXR1cm47CiAgICAgIGlmKGZpcnN0Q2xpY2spe2ZpcnN0Q2xpY2s9ZmFsc2U7cGxhbnRNaW5lcyhyLGMpO3RpbWVySXY9c2V0SW50ZXJ2YWwoKCk9Pnt0aW1lcisrO2NvbnN0IHRtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtcy10aW1lIik7aWYodG0pdG0udGV4dENvbnRlbnQ9dGltZXI7fSwxMDAwKTt9CiAgICAgIGlmKGJvYXJkW3JdW2NdPT09LTEpe3JldmVhbGVkW3JdW2NdPXRydWU7Z2FtZU92ZXI9dHJ1ZTtjbGVhckludGVydmFsKHRpbWVySXYpO2RyYXcoKTtjb25zdCBzdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibXMtc3RhdHVzIik7aWYoc3Qpc3QudGV4dENvbnRlbnQ9IvCfkqUgQk9PTSEgRG91YmxlLWNsaWNrIHRvIHJlc3RhcnQuIjt9CiAgICAgIGVsc2V7cmV2ZWFsKHIsYyk7ZHJhdygpO2lmKGNoZWNrV2luKCkpe3dvbj10cnVlO2NsZWFySW50ZXJ2YWwodGltZXJJdik7Y29uc3Qgc3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1zLXN0YXR1cyIpO2lmKHN0KXN0LnRleHRDb250ZW50PSLwn46JIFlvdSB3aW4hIFRpbWU6ICIrdGltZXIrInMiO319CiAgICB9KTsKICAgIGN2LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixlPT57CiAgICAgIGUucHJldmVudERlZmF1bHQoKTtpZihnYW1lT3Zlcnx8d29uKXJldHVybjsKICAgICAgY29uc3R7cixjfT1nZXRDZWxsKGUpO2lmKHI8MHx8cj49Uk9XU3x8YzwwfHxjPj1DT0xTfHxyZXZlYWxlZFtyXVtjXSlyZXR1cm47CiAgICAgIGZsYWdnZWRbcl1bY109IWZsYWdnZWRbcl1bY107CiAgICAgIGNvbnN0IG1zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtcy1taW5lcyIpO2lmKG1zKW1zLnRleHRDb250ZW50PU1JTkVTLWZsYWdnZWQuZmxhdCgpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7CiAgICAgIGRyYXcoKTsKICAgIH0pOwogICAgY3YuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLGU9PntpZihnYW1lT3Zlcnx8d29uKWluaXQoKTt9KTsKICAgIGluaXQoKTsKICAgIHJldHVybigpPT57Y2xlYXJJbnRlcnZhbCh0aW1lckl2KTt9OwogIH0sZ29CYWNrKTsKfQoKZnVuY3Rpb24gbGF1bmNoU25ha2UoZ29CYWNrKXsKICBpZih0eXBlb2YgcHJpbnQ9PT0iZnVuY3Rpb24iKXByaW50KCJPcGVuaW5nIFNuYWtlLi4uIEFycm93IGtleXMgdG8gbW92ZS4gU1BBQ0UgdG8gc3RhcnQuIEVTQyB0byBleGl0LiIpOwogIG1ha2VHYW1lV2luZG93KCJTTkFLRSIsbnVsbCxudWxsLCh3aW4pPT57CiAgICBjb25zdCBDT0xTPTMwLFJPV1M9MjIsU1o9MjAsVz1DT0xTKlNaLEg9Uk9XUypTWjsKICAgIGNvbnN0IGluZm9CYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aW5mb0Jhci5jbGFzc05hbWU9ImdhbWUtaW5mbyI7CiAgICBpbmZvQmFyLmlubmVySFRNTD0iPHNwYW4+QXJyb3cga2V5czwvc3Bhbj4gc3RlZXIgJm5ic3A7IDxzcGFuPlNQQUNFPC9zcGFuPiBzdGFydC9wYXVzZSAmbmJzcDsgU2NvcmU6IDxzcGFuIGlkPSdzbi1zY29yZSc+MDwvc3Bhbj4gJm5ic3A7IDxzcGFuIGlkPSdzbi1zdGF0dXMnPlByZXNzIFNQQUNFIHRvIHN0YXJ0PC9zcGFuPiI7CiAgICBjb25zdCB3cmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3dyYXAuY2xhc3NOYW1lPSJnYW1lLWNhbnZhcy13cmFwIjsKICAgIGNvbnN0IGN2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2N2LndpZHRoPVc7Y3YuaGVpZ2h0PUg7CiAgICB3cmFwLmFwcGVuZENoaWxkKGN2KTt3aW4uYXBwZW5kQ2hpbGQod3JhcCk7d2luLmFwcGVuZENoaWxkKGluZm9CYXIpOwogICAgY29uc3QgZz1jdi5nZXRDb250ZXh0KCIyZCIpOwogICAgbGV0IHNuYWtlLGRpcixuZXh0RGlyLGZvb2Qsc2NvcmUscnVubmluZyxnYW1lT3ZlcixyYWYsbGFzdFQ9MCxpbnRlcnZhbD0xMjA7CiAgICBmdW5jdGlvbiByYW5kKG4pe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbik7fQogICAgZnVuY3Rpb24gcGxhY2VGb29kKCl7ZG97Zm9vZD17eDpyYW5kKENPTFMpLHk6cmFuZChST1dTKX07fXdoaWxlKHNuYWtlLnNvbWUocz0+cy54PT09Zm9vZC54JiZzLnk9PT1mb29kLnkpKTt9CiAgICBmdW5jdGlvbiBpbml0KCl7CiAgICAgIHNuYWtlPVt7eDoxNSx5OjExfSx7eDoxNCx5OjExfSx7eDoxMyx5OjExfV07ZGlyPXt4OjEseTowfTtuZXh0RGlyPXt4OjEseTowfTsKICAgICAgc2NvcmU9MDtydW5uaW5nPWZhbHNlO2dhbWVPdmVyPWZhbHNlO2ludGVydmFsPTEyMDtwbGFjZUZvb2QoKTtkcmF3KCk7CiAgICAgIGNvbnN0IHNjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzbi1zY29yZSIpO2lmKHNjKXNjLnRleHRDb250ZW50PTA7CiAgICAgIGNvbnN0IHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzbi1zdGF0dXMiKTtpZihzdClzdC50ZXh0Q29udGVudD0iUHJlc3MgU1BBQ0UgdG8gc3RhcnQiOwogICAgfQogICAgZnVuY3Rpb24gZHJhdygpewogICAgICBnLmZpbGxTdHlsZT0iIzAwMCI7Zy5maWxsUmVjdCgwLDAsVyxIKTsKICAgICAgZy5zdHJva2VTdHlsZT0icmdiYSgwLDI1NSwwLDAuMDUpIjsKICAgICAgZm9yKGxldCByPTA7cjxST1dTO3IrKylmb3IobGV0IGM9MDtjPENPTFM7YysrKWcuc3Ryb2tlUmVjdChjKlNaLHIqU1osU1osU1opOwogICAgICBnLmZpbGxTdHlsZT0iI2Y1NSI7Zy5iZWdpblBhdGgoKTtnLmFyYyhmb29kLngqU1orU1ovMixmb29kLnkqU1orU1ovMixTWi8yLTEsMCxNYXRoLlBJKjIpO2cuZmlsbCgpOwogICAgICBzbmFrZS5mb3JFYWNoKChzLGkpPT57Y29uc3QgYnJpZ2h0PWk9PT0wPzI1NTpNYXRoLm1heCg2MCwyMjAtaSo2KTtnLmZpbGxTdHlsZT1gcmdiKDAsJHticmlnaHR9LDApYDtnLmZpbGxSZWN0KHMueCpTWisxLHMueSpTWisxLFNaLTIsU1otMik7fSk7CiAgICAgIGlmKGdhbWVPdmVyKXsKICAgICAgICBnLmZpbGxTdHlsZT0icmdiYSgwLDAsMCwwLjc1KSI7Zy5maWxsUmVjdCgwLEgvMi1TWioxLjYsVyxTWiozLjIpOwogICAgICAgIGcuZmlsbFN0eWxlPSIjMGYwIjtnLmZvbnQ9YGJvbGQgJHtTWn1weCBtb25vc3BhY2VgO2cudGV4dEFsaWduPSJjZW50ZXIiOwogICAgICAgIGcuZmlsbFRleHQoIkdBTUUgT1ZFUiIsVy8yLEgvMi1TWiowLjQpOwogICAgICAgIGcuZm9udD1gJHtNYXRoLmZsb29yKFNaKjAuNil9cHggbW9ub3NwYWNlYDtnLmZpbGxUZXh0KCJTY29yZTogIitzY29yZSsiICAgUHJlc3MgUiB0byByZXN0YXJ0IixXLzIsSC8yK1NaKjAuOSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXAoKXsKICAgICAgZGlyPW5leHREaXI7Y29uc3QgaGVhZD17eDpzbmFrZVswXS54K2Rpci54LHk6c25ha2VbMF0ueStkaXIueX07CiAgICAgIGlmKGhlYWQueDwwfHxoZWFkLng+PUNPTFN8fGhlYWQueTwwfHxoZWFkLnk+PVJPV1N8fHNuYWtlLnNvbWUocz0+cy54PT09aGVhZC54JiZzLnk9PT1oZWFkLnkpKXsKICAgICAgICBnYW1lT3Zlcj10cnVlO3J1bm5pbmc9ZmFsc2U7ZHJhdygpO2NvbnN0IHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzbi1zdGF0dXMiKTtpZihzdClzdC50ZXh0Q29udGVudD0iR2FtZSBvdmVyISBQcmVzcyBSIjtyZXR1cm47CiAgICAgIH0KICAgICAgc25ha2UudW5zaGlmdChoZWFkKTsKICAgICAgaWYoaGVhZC54PT09Zm9vZC54JiZoZWFkLnk9PT1mb29kLnkpe3Njb3JlKys7aW50ZXJ2YWw9TWF0aC5tYXgoNjAsaW50ZXJ2YWwtMik7cGxhY2VGb29kKCk7Y29uc3Qgc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNuLXNjb3JlIik7aWYoc2Mpc2MudGV4dENvbnRlbnQ9c2NvcmU7fQogICAgICBlbHNlIHNuYWtlLnBvcCgpOwogICAgICBkcmF3KCk7CiAgICB9CiAgICBsZXQgYWNjdW09MDsKICAgIGZ1bmN0aW9uIGxvb3AodCl7cmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTthY2N1bSs9dC1sYXN0VDtsYXN0VD10O2lmKHJ1bm5pbmcmJmFjY3VtPj1pbnRlcnZhbCl7YWNjdW09MDtzdGVwKCk7fWVsc2UgaWYoIWdhbWVPdmVyKWRyYXcoKTt9CiAgICBpbml0KCk7cmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgIGZ1bmN0aW9uIG9uS2V5KGUpewogICAgICBpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhjdikpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTtyZXR1cm47fQogICAgICBpZihlLmtleT09PSJyInx8ZS5rZXk9PT0iUiIpe2luaXQoKTtyZXR1cm47fQogICAgICBpZihlLmtleT09PSIgIil7ZS5wcmV2ZW50RGVmYXVsdCgpO2lmKCFnYW1lT3Zlcil7cnVubmluZz0hcnVubmluZztjb25zdCBzdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic24tc3RhdHVzIik7aWYoc3Qpc3QudGV4dENvbnRlbnQ9cnVubmluZz8iIjoiUGF1c2VkIjt9fQogICAgICBjb25zdCBtYXA9eyJBcnJvd1VwIjp7eDowLHk6LTF9LCJBcnJvd0Rvd24iOnt4OjAseToxfSwiQXJyb3dMZWZ0Ijp7eDotMSx5OjB9LCJBcnJvd1JpZ2h0Ijp7eDoxLHk6MH19OwogICAgICBpZihtYXBbZS5rZXldKXtlLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgbmQ9bWFwW2Uua2V5XTtpZihkaXIueCtuZC54IT09MHx8ZGlyLnkrbmQueSE9PTApbmV4dERpcj1uZDt9CiAgICB9CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixvbktleSk7CiAgICByZXR1cm4oKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZik7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25LZXkpO307CiAgfSxnb0JhY2spOwp9CgpmdW5jdGlvbiBsYXVuY2hCcmVha291dChnb0JhY2spewogIGlmKHR5cGVvZiBwcmludD09PSJmdW5jdGlvbiIpcHJpbnQoIk9wZW5pbmcgQnJlYWtvdXQuLi4gTW91c2Ugb3IgYXJyb3cga2V5cyB0byBtb3ZlIHBhZGRsZS4gU1BBQ0UgdG8gbGF1bmNoLiIpOwogIG1ha2VHYW1lV2luZG93KCJCUkVBS09VVCIsbnVsbCxudWxsLCh3aW4pPT57CiAgICBjb25zdCBST1dTX0I9NSxDT0xTX0I9MTA7CiAgICBjb25zdCBCQ09MT1JTPVsiI2Y1NSIsIiNmYTAiLCIjZmYwIiwiIzBmMCIsIiMwY2YiXTsKICAgIGNvbnN0IGluZm9CYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aW5mb0Jhci5jbGFzc05hbWU9ImdhbWUtaW5mbyI7CiAgICBpbmZvQmFyLmlubmVySFRNTD0iTW91c2UgLyA8c3Bhbj7ihpDihpI8L3NwYW4+IG1vdmUgcGFkZGxlICZuYnNwOyA8c3Bhbj5TUEFDRTwvc3Bhbj4gbGF1bmNoICZuYnNwOyBTY29yZTogPHNwYW4gaWQ9J2JrLXNjb3JlJz4wPC9zcGFuPiAmbmJzcDsgTGl2ZXM6IDxzcGFuIGlkPSdiay1saXZlcyc+Mzwvc3Bhbj4gJm5ic3A7IDxzcGFuIGlkPSdiay1zdGF0dXMnPlByZXNzIFNQQUNFPC9zcGFuPiI7CiAgICBjb25zdCB3cmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3dyYXAuY2xhc3NOYW1lPSJnYW1lLWNhbnZhcy13cmFwIjsKICAgIGNvbnN0IGN2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgY29uc3QgVz04MDAsSD01NjA7CiAgICBjdi53aWR0aD1XO2N2LmhlaWdodD1IOwogICAgd3JhcC5hcHBlbmRDaGlsZChjdik7d2luLmFwcGVuZENoaWxkKHdyYXApO3dpbi5hcHBlbmRDaGlsZChpbmZvQmFyKTsKICAgIGNvbnN0IGc9Y3YuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGNvbnN0IFBXPU1hdGguZmxvb3IoVyowLjEyKSxQSD1NYXRoLmZsb29yKEgqMC4wMjIpLEJBTEw9TWF0aC5mbG9vcihIKjAuMDE2KTsKICAgIGNvbnN0IEJQQUQ9TWF0aC5mbG9vcihXKjAuMDA2KSxCVz1NYXRoLmZsb29yKChXLUJQQUQqKENPTFNfQisxKSkvQ09MU19CKSxCSD1NYXRoLmZsb29yKEgqMC4wNCk7CiAgICBjb25zdCBrZXlzPXt9OwogICAgbGV0IHB4LHB5LGJ4LGJ5LGJkeCxiZHksbGF1bmNoZWQsYnJpY2tzLHNjb3JlLGxpdmVzLGdhbWVPdmVyLHdvbjsKICAgIGZ1bmN0aW9uIGluaXRCcmlja3MoKXsKICAgICAgYnJpY2tzPVtdOwogICAgICBmb3IobGV0IHI9MDtyPFJPV1NfQjtyKyspZm9yKGxldCBjPTA7YzxDT0xTX0I7YysrKQogICAgICAgIGJyaWNrcy5wdXNoKHt4OmMqKEJXK0JQQUQpK0JQQUQseTpyKihCSCtCUEFEKStCUEFEK01hdGguZmxvb3IoSCowLjA4KSx3OkJXLGg6QkgsYWxpdmU6dHJ1ZSxjOkJDT0xPUlNbcl0scm93OnJ9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXQoKXsKICAgICAgcHg9Vy8yLVBXLzI7cHk9SC1NYXRoLmZsb29yKEgqMC4wNSk7Yng9Vy8yO2J5PXB5LUJBTEwtMjsKICAgICAgYmR4PU1hdGguZmxvb3IoVyowLjAwNCkqKE1hdGgucmFuZG9tKCk+MC41PzE6LTEpO2JkeT0tTWF0aC5mbG9vcihIKjAuMDA2KTsKICAgICAgbGF1bmNoZWQ9ZmFsc2U7c2NvcmU9MDtsaXZlcz0zO2dhbWVPdmVyPWZhbHNlO3dvbj1mYWxzZTsKICAgICAgaW5pdEJyaWNrcygpO3VwZGF0ZV9pbmZvKCk7ZHJhdygpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlX2luZm8oKXsKICAgICAgY29uc3Qgc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJrLXNjb3JlIik7aWYoc2Mpc2MudGV4dENvbnRlbnQ9c2NvcmU7CiAgICAgIGNvbnN0IGx2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJiay1saXZlcyIpO2lmKGx2KWx2LnRleHRDb250ZW50PWxpdmVzOwogICAgfQogICAgZnVuY3Rpb24gZHJhdygpewogICAgICBnLmZpbGxTdHlsZT0iIzAwMCI7Zy5maWxsUmVjdCgwLDAsVyxIKTsKICAgICAgYnJpY2tzLmZvckVhY2goYj0+e2lmKCFiLmFsaXZlKXJldHVybjtnLmZpbGxTdHlsZT1iLmM7Zy5maWxsUmVjdChiLngsYi55LGIudyxiLmgpO2cuc3Ryb2tlU3R5bGU9InJnYmEoMCwwLDAsMC4zKSI7Zy5zdHJva2VSZWN0KGIueCxiLnksYi53LGIuaCk7fSk7CiAgICAgIGcuZmlsbFN0eWxlPSIjMGYwIjtnLmZpbGxSZWN0KHB4LHB5LFBXLFBIKTsKICAgICAgZy5iZWdpblBhdGgoKTtnLmFyYyhieCxieSxCQUxMLDAsTWF0aC5QSSoyKTtnLmZpbGwoKTsKICAgICAgaWYoIWxhdW5jaGVkKXtnLmZpbGxTdHlsZT0icmdiYSgwLDI1NSwwLDAuNSkiO2cuZm9udD1gJHtNYXRoLmZsb29yKEgqMC4wMjUpfXB4IG1vbm9zcGFjZWA7Zy50ZXh0QWxpZ249ImNlbnRlciI7Zy5maWxsVGV4dCgiU1BBQ0UgdG8gbGF1bmNoIixXLzIsSC1NYXRoLmZsb29yKEgqMC4wOCkpO30KICAgICAgaWYoZ2FtZU92ZXIpe2cuZmlsbFN0eWxlPSJyZ2JhKDAsMCwwLDAuNzUpIjtnLmZpbGxSZWN0KDAsSC8yLUgqMC4wOCxXLEgqMC4xNik7Zy5maWxsU3R5bGU9IiNmNTUiO2cuZm9udD1gYm9sZCAke01hdGguZmxvb3IoSCowLjA1NSl9cHggbW9ub3NwYWNlYDtnLnRleHRBbGlnbj0iY2VudGVyIjtnLmZpbGxUZXh0KCJHQU1FIE9WRVIiLFcvMixILzItSCowLjAxKTtnLmZvbnQ9YCR7TWF0aC5mbG9vcihIKjAuMDMpfXB4IG1vbm9zcGFjZWA7Zy5maWxsU3R5bGU9IiMwZjAiO2cuZmlsbFRleHQoIlByZXNzIFIgdG8gcmVzdGFydCIsVy8yLEgvMitIKjAuMDYpO30KICAgICAgaWYod29uKXtnLmZpbGxTdHlsZT0icmdiYSgwLDAsMCwwLjc1KSI7Zy5maWxsUmVjdCgwLEgvMi1IKjAuMDgsVyxIKjAuMTYpO2cuZmlsbFN0eWxlPSIjMGYwIjtnLmZvbnQ9YGJvbGQgJHtNYXRoLmZsb29yKEgqMC4wNDUpfXB4IG1vbm9zcGFjZWA7Zy50ZXh0QWxpZ249ImNlbnRlciI7Zy5maWxsVGV4dCgiWU9VIFdJTiEgIFNjb3JlOiAiK3Njb3JlLFcvMixILzItSCowLjAxKTtnLmZvbnQ9YCR7TWF0aC5mbG9vcihIKjAuMDMpfXB4IG1vbm9zcGFjZWA7Zy5maWxsVGV4dCgiUHJlc3MgUiB0byByZXN0YXJ0IixXLzIsSC8yK0gqMC4wNik7fQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlKCl7CiAgICAgIGlmKGtleXNbIkFycm93TGVmdCJdKXB4PU1hdGgubWF4KDAscHgtTWF0aC5mbG9vcihXKjAuMDA5KSk7CiAgICAgIGlmKGtleXNbIkFycm93UmlnaHQiXSlweD1NYXRoLm1pbihXLVBXLHB4K01hdGguZmxvb3IoVyowLjAwOSkpOwogICAgICBpZighbGF1bmNoZWQpe2J4PXB4K1BXLzI7cmV0dXJuO30KICAgICAgYngrPWJkeDtieSs9YmR5OwogICAgICBpZihieDw9QkFMTHx8Yng+PVctQkFMTCliZHgqPS0xOwogICAgICBpZihieTw9QkFMTCliZHk9TWF0aC5hYnMoYmR5KTsKICAgICAgaWYoYnkrQkFMTD49cHkmJmJ5K0JBTEw8PXB5K1BIJiZieD49cHgmJmJ4PD1weCtQVyl7YmR5PS1NYXRoLmFicyhiZHkpO2JkeCs9KGJ4LShweCtQVy8yKSkqMC4wNTt9CiAgICAgIGZvcihjb25zdCBiIG9mIGJyaWNrcyl7CiAgICAgICAgaWYoIWIuYWxpdmUpY29udGludWU7CiAgICAgICAgaWYoYngrQkFMTD5iLngmJmJ4LUJBTEw8Yi54K2IudyYmYnkrQkFMTD5iLnkmJmJ5LUJBTEw8Yi55K2IuaCl7CiAgICAgICAgICBiLmFsaXZlPWZhbHNlO3Njb3JlKz0xMDsKICAgICAgICAgIGNvbnN0IG94PU1hdGgubWluKGJ4K0JBTEwtYi54LGIueCtiLnctKGJ4LUJBTEwpKSxveT1NYXRoLm1pbihieStCQUxMLWIueSxiLnkrYi5oLShieS1CQUxMKSk7CiAgICAgICAgICBpZihveDxveSliZHgqPS0xO2Vsc2UgYmR5Kj0tMTsKICAgICAgICAgIC8vIFJvdyAwID0gZnVydGhlc3QgYmFjayA9IGJpZ2dlc3QgYm9vc3Q7IHJvdyA0ID0gZnJvbnQgPSBubyBib29zdAogICAgICAgICAgY29uc3QgYm9vc3Q9MSsoKFJPV1NfQi0xLWIucm93KS8oUk9XU19CLTEpKSowLjU7CiAgICAgICAgICBjb25zdCBzcD1NYXRoLnNxcnQoYmR4KmJkeCtiZHkqYmR5KTsKICAgICAgICAgIGJkeD1iZHgvc3Aqc3AqYm9vc3Q7YmR5PWJkeS9zcCpzcCpib29zdDsKICAgICAgICAgIHVwZGF0ZV9pbmZvKCk7YnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKCFicmlja3Muc29tZShiPT5iLmFsaXZlKSl7d29uPXRydWU7cmV0dXJuO30KICAgICAgaWYoYnk+SCtCQUxMKXtsaXZlcy0tO3VwZGF0ZV9pbmZvKCk7aWYobGl2ZXM8PTApe2dhbWVPdmVyPXRydWU7fWVsc2V7Yng9cHgrUFcvMjtieT1weS1CQUxMLTI7bGF1bmNoZWQ9ZmFsc2U7fX0KICAgICAgY29uc3Qgc3A9TWF0aC5zcXJ0KGJkeCpiZHgrYmR5KmJkeSksbWF4U3A9TWF0aC5mbG9vcihIKjAuMDIyKTtpZihzcD5tYXhTcCl7YmR4PWJkeC9zcCptYXhTcDtiZHk9YmR5L3NwKm1heFNwO30KICAgIH0KICAgIGxldCByYWYyPW51bGw7CiAgICBmdW5jdGlvbiBsb29wKCl7cmFmMj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7aWYoIWdhbWVPdmVyJiYhd29uKXVwZGF0ZSgpO2RyYXcoKTt9CiAgICBjdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGU9PnsKICAgICAgY29uc3Qgcj1jdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3Qgc2NhbGVYPVcvci53aWR0aDsKICAgICAgcHg9TWF0aC5tYXgoMCxNYXRoLm1pbihXLVBXLChlLmNsaWVudFgtci5sZWZ0KSpzY2FsZVgtUFcvMikpOwogICAgfSk7CiAgICBpbml0KCk7bG9vcCgpOwogICAgZnVuY3Rpb24gb25LZXkoZSl7CiAgICAgIGlmKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGN2KSl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25LZXkpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixvbktleSk7cmV0dXJuO30KICAgICAga2V5c1tlLmtleV09ZS50eXBlPT09ImtleWRvd24iOwogICAgICBpZihlLnR5cGU9PT0ia2V5ZG93biIpewogICAgICAgIGlmKGUua2V5PT09InIifHxlLmtleT09PSJSIilpbml0KCk7CiAgICAgICAgaWYoZS5rZXk9PT0iICImJiFsYXVuY2hlZCYmIWdhbWVPdmVyJiYhd29uKXtlLnByZXZlbnREZWZhdWx0KCk7bGF1bmNoZWQ9dHJ1ZTt9CiAgICAgICAgaWYoWyJBcnJvd0xlZnQiLCJBcnJvd1JpZ2h0IiwiICJdLmluY2x1ZGVzKGUua2V5KSllLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsb25LZXkpOwogICAgcmV0dXJuKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZShyYWYyKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixvbktleSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLG9uS2V5KTt9OwogIH0sZ29CYWNrKTsKfQoKZnVuY3Rpb24gbGF1bmNoMjA0OChnb0JhY2spewogIGlmKHR5cGVvZiBwcmludD09PSJmdW5jdGlvbiIpcHJpbnQoIk9wZW5pbmcgMjA0OC4uLiBBcnJvdyBrZXlzIHRvIHNsaWRlIHRpbGVzLiBSZWFjaCAyMDQ4ISIpOwogIG1ha2VHYW1lV2luZG93KCIyMDQ4IixudWxsLG51bGwsKHdpbik9PnsKICAgIGNvbnN0IFNaPTkwLEdBUD04LE49NCxXPU4qU1orKE4rMSkqR0FQOwogICAgY29uc3QgaW5mb0Jhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpbmZvQmFyLmNsYXNzTmFtZT0iZ2FtZS1pbmZvIjsKICAgIGluZm9CYXIuaW5uZXJIVE1MPSI8c3Bhbj5BcnJvdyBrZXlzPC9zcGFuPiB0byBzbGlkZSAmbmJzcDsgU2NvcmU6IDxzcGFuIGlkPSdnMi1zY29yZSc+MDwvc3Bhbj4gJm5ic3A7IEJlc3Q6IDxzcGFuIGlkPSdnMi1iZXN0Jz4wPC9zcGFuPiAmbmJzcDsgPHNwYW4gaWQ9J2cyLXN0YXR1cyc+PC9zcGFuPiI7CiAgICBjb25zdCB3cmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3dyYXAuY2xhc3NOYW1lPSJnYW1lLWNhbnZhcy13cmFwIjsKICAgIGNvbnN0IGN2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2N2LndpZHRoPVc7Y3YuaGVpZ2h0PVc7CiAgICB3cmFwLmFwcGVuZENoaWxkKGN2KTt3aW4uYXBwZW5kQ2hpbGQod3JhcCk7d2luLmFwcGVuZENoaWxkKGluZm9CYXIpOwogICAgY29uc3QgZz1jdi5nZXRDb250ZXh0KCIyZCIpOwogICAgY29uc3QgVElMRV9DT0xPUlM9ezA6IiMxMTEiLDI6IiMxYTJhMWEiLDQ6IiMxYTNhMWEiLDg6IiMyYTRhMWEiLDE2OiIjM2E1YTFhIiwzMjoiIzBhNGEwYSIsNjQ6IiMwYTZhMGEiLDEyODoiIzBhNWEzYSIsMjU2OiIjMGE0YTVhIiw1MTI6IiMwYTNhNmEiLDEwMjQ6IiMxYTFhOGEiLDIwNDg6IiM0YTBhOGEifTsKICAgIGxldCBib2FyZCxzY29yZSxiZXN0PTAsZ2FtZU92ZXIsd29uOwogICAgZnVuY3Rpb24gbmV3Qm9hcmQoKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOk59LCgpPT5BcnJheShOKS5maWxsKDApKTt9CiAgICBmdW5jdGlvbiBhZGRSYW5kb20oYil7Y29uc3QgZW1wPVtdO2ZvcihsZXQgcj0wO3I8TjtyKyspZm9yKGxldCBjPTA7YzxOO2MrKylpZighYltyXVtjXSllbXAucHVzaChbcixjXSk7aWYoIWVtcC5sZW5ndGgpcmV0dXJuO2NvbnN0W3IsY109ZW1wW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplbXAubGVuZ3RoKV07YltyXVtjXT1NYXRoLnJhbmRvbSgpPDAuOT8yOjQ7fQogICAgZnVuY3Rpb24gaW5pdCgpe2JvYXJkPW5ld0JvYXJkKCk7YWRkUmFuZG9tKGJvYXJkKTthZGRSYW5kb20oYm9hcmQpO3Njb3JlPTA7Z2FtZU92ZXI9ZmFsc2U7d29uPWZhbHNlO3VwZGF0ZV9pbmZvKCk7ZHJhdygpO30KICAgIGZ1bmN0aW9uIHVwZGF0ZV9pbmZvKCl7Y29uc3Qgc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImcyLXNjb3JlIik7aWYoc2Mpc2MudGV4dENvbnRlbnQ9c2NvcmU7Y29uc3QgYmU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImcyLWJlc3QiKTtpZihiZSliZS50ZXh0Q29udGVudD1iZXN0O2NvbnN0IHN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnMi1zdGF0dXMiKTtpZihzdClzdC50ZXh0Q29udGVudD1nYW1lT3Zlcj8iR2FtZSBPdmVyIOKAlCBSIHRvIHJlc3RhcnQiOndvbj8iWW91IHJlYWNoZWQgMjA0OCEiOiIiO30KICAgIGZ1bmN0aW9uIHNsaWRlKHJvdyl7Y29uc3QgYT1yb3cuZmlsdGVyKHY9PnYpO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGgtMTtpKyspe2lmKGFbaV09PT1hW2krMV0pe2FbaV0qPTI7c2NvcmUrPWFbaV07aWYoYVtpXT49MjA0OCl3b249dHJ1ZTthLnNwbGljZShpKzEsMSk7aSsrO319d2hpbGUoYS5sZW5ndGg8TilhLnB1c2goMCk7cmV0dXJuIGE7fQogICAgZnVuY3Rpb24gbW92ZShkaXIpewogICAgICBsZXQgbW92ZWQ9ZmFsc2U7Y29uc3QgcHJldj1ib2FyZC5tYXAocj0+Wy4uLnJdKTsKICAgICAgaWYoZGlyPT09IkFycm93TGVmdCIpe2JvYXJkPWJvYXJkLm1hcChyPT5zbGlkZShyKSk7fQogICAgICBlbHNlIGlmKGRpcj09PSJBcnJvd1JpZ2h0Iil7Ym9hcmQ9Ym9hcmQubWFwKHI9PnNsaWRlKFsuLi5yXS5yZXZlcnNlKCkpLnJldmVyc2UoKSk7fQogICAgICBlbHNlIGlmKGRpcj09PSJBcnJvd1VwIil7Zm9yKGxldCBjPTA7YzxOO2MrKyl7bGV0IGNvbD1ib2FyZC5tYXAocj0+cltjXSk7Y29sPXNsaWRlKGNvbCk7Ym9hcmQuZm9yRWFjaCgocixpKT0+cltjXT1jb2xbaV0pO319CiAgICAgIGVsc2UgaWYoZGlyPT09IkFycm93RG93biIpe2ZvcihsZXQgYz0wO2M8TjtjKyspe2xldCBjb2w9Ym9hcmQubWFwKHI9PnJbY10pLnJldmVyc2UoKTtjb2w9c2xpZGUoY29sKS5yZXZlcnNlKCk7Ym9hcmQuZm9yRWFjaCgocixpKT0+cltjXT1jb2xbaV0pO319CiAgICAgIG1vdmVkPUpTT04uc3RyaW5naWZ5KGJvYXJkKSE9PUpTT04uc3RyaW5naWZ5KHByZXYpOwogICAgICBpZihtb3ZlZCl7YWRkUmFuZG9tKGJvYXJkKTtpZihzY29yZT5iZXN0KWJlc3Q9c2NvcmU7fQogICAgICBpZighYm9hcmQuZmxhdCgpLmluY2x1ZGVzKDApKXtsZXQgY2FuTW92ZT1mYWxzZTtmb3IobGV0IHI9MDtyPE47cisrKWZvcihsZXQgYz0wO2M8TjtjKyspe2lmKHI8Ti0xJiZib2FyZFtyXVtjXT09PWJvYXJkW3IrMV1bY10pY2FuTW92ZT10cnVlO2lmKGM8Ti0xJiZib2FyZFtyXVtjXT09PWJvYXJkW3JdW2MrMV0pY2FuTW92ZT10cnVlO31pZighY2FuTW92ZSlnYW1lT3Zlcj10cnVlO30KICAgICAgdXBkYXRlX2luZm8oKTtkcmF3KCk7CiAgICB9CiAgICBmdW5jdGlvbiBkcmF3KCl7CiAgICAgIGcuZmlsbFN0eWxlPSIjMGEwYTBhIjtnLmZpbGxSZWN0KDAsMCxXLFcpOwogICAgICBmb3IobGV0IHI9MDtyPE47cisrKWZvcihsZXQgYz0wO2M8TjtjKyspewogICAgICAgIGNvbnN0IHg9YyooU1orR0FQKStHQVAseT1yKihTWitHQVApK0dBUCx2PWJvYXJkW3JdW2NdOwogICAgICAgIGcuZmlsbFN0eWxlPVRJTEVfQ09MT1JTW01hdGgubWluKHYsMjA0OCldfHwiIzZhMGFhYSI7CiAgICAgICAgZy5maWxsUmVjdCh4LHksU1osU1opOwogICAgICAgIGlmKHY+MCl7CiAgICAgICAgICBnLmZpbGxTdHlsZT12PD00PyIjMGEwIjp2PD02ND8iIzBmMCI6IiNmZmYiOwogICAgICAgICAgY29uc3QgZnM9djwxMDA/MjY6djwxMDAwPzIwOjE2OwogICAgICAgICAgZy5mb250PWBib2xkICR7ZnN9cHggbW9ub3NwYWNlYDtnLnRleHRBbGlnbj0iY2VudGVyIjtnLnRleHRCYXNlbGluZT0ibWlkZGxlIjsKICAgICAgICAgIGcuZmlsbFRleHQodix4K1NaLzIseStTWi8yKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoZ2FtZU92ZXJ8fHdvbil7Zy5maWxsU3R5bGU9InJnYmEoMCwwLDAsMC42NSkiO2cuZmlsbFJlY3QoMCxXLzItNDAsVyw4MCk7Zy5maWxsU3R5bGU9d29uPyIjMGYwIjoiI2Y1NSI7Zy5mb250PSJib2xkIDIycHggbW9ub3NwYWNlIjtnLnRleHRBbGlnbj0iY2VudGVyIjtnLmZpbGxUZXh0KHdvbj8iWU9VIFdJTiEiOiJHQU1FIE9WRVIiLFcvMixXLzItMTApO2cuZm9udD0iMTNweCBtb25vc3BhY2UiO2cuZmlsbFN0eWxlPSIjMGYwIjtnLmZpbGxUZXh0KCJQcmVzcyBSIHRvIHJlc3RhcnQiLFcvMixXLzIrMTgpO30KICAgIH0KICAgIGluaXQoKTsKICAgIGZ1bmN0aW9uIG9uS2V5KGUpewogICAgICBpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhjdikpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTtyZXR1cm47fQogICAgICBpZihlLmtleT09PSJyInx8ZS5rZXk9PT0iUiIpe2luaXQoKTtyZXR1cm47fQogICAgICBpZihbIkFycm93TGVmdCIsIkFycm93UmlnaHQiLCJBcnJvd1VwIiwiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXtlLnByZXZlbnREZWZhdWx0KCk7aWYoIWdhbWVPdmVyKW1vdmUoZS5rZXkpO30KICAgIH0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG9uS2V5KTsKICAgIHJldHVybigpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixvbktleSk7CiAgfSxnb0JhY2spOwp9CgpmdW5jdGlvbiBtYWtlQXBwT3ZlcmxheSh0aXRsZSx3aWR0aCxoZWlnaHQsYnVpbGRGbil7CiAgY29uc3Qgb3ZlcmxheT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvdmVybGF5LmNsYXNzTmFtZT0iYXBwLW92ZXJsYXkiOwogIGNvbnN0IHdpbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt3aW4uY2xhc3NOYW1lPSJhcHAtd2luZG93IjsKICB3aW4uc3R5bGUud2lkdGg9d2lkdGg7d2luLnN0eWxlLmhlaWdodD1oZWlnaHQ7CiAgY29uc3QgdGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGIuY2xhc3NOYW1lPSJhcHAtdGl0bGViYXIiOwogIGNvbnN0IHRpdGxlU3Bhbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dGl0bGVTcGFuLnRleHRDb250ZW50PXRpdGxlOwogIGNvbnN0IGNsb3NlQnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2Nsb3NlQnRuLmNsYXNzTmFtZT0iYXBwLWNsb3NlIjtjbG9zZUJ0bi50ZXh0Q29udGVudD0i4pyVIjsKICBmdW5jdGlvbiBjbG9zZUFwcCgpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3ZlcmxheSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsb25Fc2MsdHJ1ZSk7aWYodHlwZW9mIGlucCE9PSJ1bmRlZmluZWQiJiZpbnAmJmRvY3VtZW50LmJvZHkuY29udGFpbnMoaW5wKSlpbnAuZm9jdXMoKTt9CiAgY2xvc2VCdG4ub25jbGljaz1jbG9zZUFwcDsKICBmdW5jdGlvbiBvbkVzYyhlKXtpZihlLmtleT09PSJFc2NhcGUiKXtlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO2Nsb3NlQXBwKCk7fX0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixvbkVzYyx0cnVlKTsKICB0Yi5hcHBlbmRDaGlsZCh0aXRsZVNwYW4pO3RiLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICB3aW4uYXBwZW5kQ2hpbGQodGIpOwogIGJ1aWxkRm4od2luLG92ZXJsYXkpOwogIG92ZXJsYXkuYXBwZW5kQ2hpbGQod2luKTsKICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsZT0+e2lmKGUudGFyZ2V0PT09b3ZlcmxheSljbG9zZUFwcCgpO30pOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7Cn0KCmZ1bmN0aW9uIGxhdW5jaE5vdGVwYWQoaW5pdGlhbFBhdGgsaW5pdGlhbENvbnRlbnQsZ29CYWNrKXsKICBpZih0eXBlb2YgcHJpbnQ9PT0iZnVuY3Rpb24iKXByaW50KCJPcGVuaW5nIE5vdGVwYWQuLi4gRVNDIHRvIGV4aXQuIik7CiAgbGV0IGN1cnJlbnRQYXRoPWluaXRpYWxQYXRofHxudWxsOwogIGxldCBjb250ZW50PWluaXRpYWxDb250ZW50fHwiIjsKICBtYWtlR2FtZVdpbmRvdygiTm90ZXBhZCIsbnVsbCxudWxsLCh3aW4pPT57CiAgICBjb25zdCBtZW51YmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO21lbnViYXIuY2xhc3NOYW1lPSJhcHAtbWVudWJhciI7CiAgICBjb25zdCB0YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3RhLmNsYXNzTmFtZT0ibm90ZXBhZC10YSI7dGEudmFsdWU9Y29udGVudDt0YS5zcGVsbGNoZWNrPWZhbHNlOwogICAgY29uc3Qgc3RhdHVzYmFyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3N0YXR1c2Jhci5jbGFzc05hbWU9Im5vdGVwYWQtc3RhdHVzYmFyIjsKICAgIGNvbnN0IHBvc1NwYW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3Bvc1NwYW4udGV4dENvbnRlbnQ9IkxuIDEsIENvbCAxIjsKICAgIGNvbnN0IGxlblNwYW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2xlblNwYW4udGV4dENvbnRlbnQ9Ikxlbmd0aDogMCI7CiAgICBjb25zdCBlbmNTcGFuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtlbmNTcGFuLnRleHRDb250ZW50PSJVVEYtOCI7CiAgICBbcG9zU3BhbixsZW5TcGFuLGVuY1NwYW5dLmZvckVhY2gocz0+c3RhdHVzYmFyLmFwcGVuZENoaWxkKHMpKTsKICAgIGNvbnN0IG5ld0J0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtuZXdCdG4udGV4dENvbnRlbnQ9Ik5ldyI7CiAgICBuZXdCdG4ub25jbGljaz0oKT0+e2lmKHRhLnZhbHVlJiYhY29uZmlybSgiRGlzY2FyZCB1bnNhdmVkIGNoYW5nZXM/IikpcmV0dXJuO3RhLnZhbHVlPSIiO2N1cnJlbnRQYXRoPW51bGw7dXBkYXRlU3RhdHVzKCk7fTsKICAgIGNvbnN0IG9wZW5CdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7b3BlbkJ0bi50ZXh0Q29udGVudD0iT3Blbi4uLiI7CiAgICBvcGVuQnRuLm9uY2xpY2s9KCk9Pntjb25zdCBwaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cGljay50eXBlPSJmaWxlIjtwaWNrLmFjY2VwdD0iLnR4dCwuaHRtbCwuanMsLmNzcywubWQiO3BpY2sub25jaGFuZ2U9ZT0+e2NvbnN0IGY9ZS50YXJnZXQuZmlsZXNbMF07aWYoIWYpcmV0dXJuO2NvbnN0IHI9bmV3IEZpbGVSZWFkZXIoKTtyLm9ubG9hZD0oKT0+e3RhLnZhbHVlPXIucmVzdWx0O2N1cnJlbnRQYXRoPWYubmFtZTt1cGRhdGVTdGF0dXMoKTt9O3IucmVhZEFzVGV4dChmKTt9O3BpY2suY2xpY2soKTt9OwogICAgY29uc3Qgc2F2ZUJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtzYXZlQnRuLnRleHRDb250ZW50PSJTYXZlIjsKICAgIHNhdmVCdG4ub25jbGljaz0oKT0+e2NvbnN0IGZuYW1lPWN1cnJlbnRQYXRofHxwcm9tcHQoIlNhdmUgYXM6IiwidW50aXRsZWQudHh0Iik7aWYoIWZuYW1lKXJldHVybjtjdXJyZW50UGF0aD1mbmFtZTtjb25zdCBibG9iPW5ldyBCbG9iKFt0YS52YWx1ZV0se3R5cGU6InRleHQvcGxhaW4ifSk7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7YS5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7YS5kb3dubG9hZD1mbmFtZTthLmNsaWNrKCk7fTsKICAgIGxldCB3dz10cnVlOwogICAgY29uc3Qgd29yZFdyYXBCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7d29yZFdyYXBCdG4udGV4dENvbnRlbnQ9IldvcmQgV3JhcDogT04iOwogICAgd29yZFdyYXBCdG4ub25jbGljaz0oKT0+e3d3PSF3dzt0YS5zdHlsZS53aGl0ZVNwYWNlPXd3PyJwcmUtd3JhcCI6InByZSI7dGEuc3R5bGUub3ZlcmZsb3dYPXd3PyJoaWRkZW4iOiJhdXRvIjt3b3JkV3JhcEJ0bi50ZXh0Q29udGVudD0iV29yZCBXcmFwOiAiKyh3dz8iT04iOiJPRkYiKTt9OwogICAgY29uc3QgYnRucz1bbmV3QnRuLG9wZW5CdG4sc2F2ZUJ0bix3b3JkV3JhcEJ0bl07CiAgICBpZihnb0JhY2spe2NvbnN0IGJhY2tCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7YmFja0J0bi50ZXh0Q29udGVudD0i4oaQIEJhY2siO2JhY2tCdG4ub25jbGljaz1nb0JhY2s7YnRucy51bnNoaWZ0KGJhY2tCdG4pO30KICAgIGJ0bnMuZm9yRWFjaChiPT5tZW51YmFyLmFwcGVuZENoaWxkKGIpKTsKICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cygpe2NvbnN0IGxpbmVzPXRhLnZhbHVlLnN1YnN0cmluZygwLHRhLnNlbGVjdGlvblN0YXJ0KS5zcGxpdCgiXG4iKTtwb3NTcGFuLnRleHRDb250ZW50PWBMbiAke2xpbmVzLmxlbmd0aH0sIENvbCAke2xpbmVzW2xpbmVzLmxlbmd0aC0xXS5sZW5ndGgrMX1gO2xlblNwYW4udGV4dENvbnRlbnQ9Ikxlbmd0aDogIit0YS52YWx1ZS5sZW5ndGg7fQogICAgdGEub25pbnB1dD11cGRhdGVTdGF0dXM7dGEub25rZXl1cD11cGRhdGVTdGF0dXM7dGEub25jbGljaz11cGRhdGVTdGF0dXM7CiAgICB3aW4uYXBwZW5kQ2hpbGQobWVudWJhcik7d2luLmFwcGVuZENoaWxkKHRhKTt3aW4uYXBwZW5kQ2hpbGQoc3RhdHVzYmFyKTsKICAgIHVwZGF0ZVN0YXR1cygpO3NldFRpbWVvdXQoKCk9PnRhLmZvY3VzKCksNTApOwogIH0pOwp9CgpmdW5jdGlvbiBsYXVuY2hDYWxjdWxhdG9yKGdvQmFjayl7CiAgaWYodHlwZW9mIHByaW50PT09ImZ1bmN0aW9uIilwcmludCgiT3BlbmluZyBDYWxjdWxhdG9yLi4uIEVTQyB0byBleGl0LiIpOwogIG1ha2VHYW1lV2luZG93KCJDYWxjdWxhdG9yIixudWxsLG51bGwsKHdpbik9PnsKICAgIHdpbi5zdHlsZS5kaXNwbGF5PSJmbGV4Ijt3aW4uc3R5bGUuZmxleERpcmVjdGlvbj0iY29sdW1uIjsKICAgIGlmKGdvQmFjayl7Y29uc3QgbWI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bWIuY2xhc3NOYW1lPSJhcHAtbWVudWJhciI7Y29uc3QgYmFja0J0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtiYWNrQnRuLnRleHRDb250ZW50PSLihpAgQmFjayI7YmFja0J0bi5vbmNsaWNrPWdvQmFjazttYi5hcHBlbmRDaGlsZChiYWNrQnRuKTt3aW4uYXBwZW5kQ2hpbGQobWIpO30KICAgIGNvbnN0IGlubmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgaW5uZXIuc3R5bGUuY3NzVGV4dD0iZmxleDoxO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7IjsKICAgIGNvbnN0IGNhbGNXcmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgY2FsY1dyYXAuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDozMjBweDtiYWNrZ3JvdW5kOiMwYTBhMGE7Ym9yZGVyOjFweCBzb2xpZCAjMGYwOyI7CiAgICBsZXQgZGlzcGxheT0iMCIsZXhwcj0iIixqdXN0RXZhbGVkPWZhbHNlOwogICAgY29uc3QgZXhwckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtleHByRGl2LmNsYXNzTmFtZT0iY2FsYy1leHByIjtleHByRGl2LnRleHRDb250ZW50PSIgIjsKICAgIGNvbnN0IGRpc3BEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGlzcERpdi5jbGFzc05hbWU9ImNhbGMtZGlzcGxheSI7ZGlzcERpdi50ZXh0Q29udGVudD0iMCI7CiAgICBjYWxjV3JhcC5hcHBlbmRDaGlsZChleHByRGl2KTtjYWxjV3JhcC5hcHBlbmRDaGlsZChkaXNwRGl2KTsKICAgIGZ1bmN0aW9uIHJlZnJlc2hEaXNwbGF5KCl7ZGlzcERpdi50ZXh0Q29udGVudD1kaXNwbGF5O2V4cHJEaXYudGV4dENvbnRlbnQ9ZXhwcnx8IiAiO30KICAgIGZ1bmN0aW9uIGNhbGNJbnB1dCh2YWwpewogICAgICBpZihqdXN0RXZhbGVkJiYhaXNOYU4odmFsKSl7ZGlzcGxheT0iMCI7ZXhwcj0iIjtqdXN0RXZhbGVkPWZhbHNlO30KICAgICAgaWYoanVzdEV2YWxlZCYmaXNOYU4odmFsKSYmdmFsIT09Ij0iKXtqdXN0RXZhbGVkPWZhbHNlO30KICAgICAgaWYodmFsPT09IkMiKXtkaXNwbGF5PSIwIjtleHByPSIiO2p1c3RFdmFsZWQ9ZmFsc2U7fQogICAgICBlbHNlIGlmKHZhbD09PSJDRSIpe2Rpc3BsYXk9IjAiO30KICAgICAgZWxzZSBpZih2YWw9PT0i4oyrIil7ZGlzcGxheT1kaXNwbGF5Lmxlbmd0aD4xP2Rpc3BsYXkuc2xpY2UoMCwtMSk6IjAiO30KICAgICAgZWxzZSBpZih2YWw9PT0iKy8tIil7ZGlzcGxheT1kaXNwbGF5LnN0YXJ0c1dpdGgoIi0iKT9kaXNwbGF5LnNsaWNlKDEpOiItIitkaXNwbGF5O30KICAgICAgZWxzZSBpZih2YWw9PT0iJSIpe2Rpc3BsYXk9U3RyaW5nKHBhcnNlRmxvYXQoZGlzcGxheSkvMTAwKTt9CiAgICAgIGVsc2UgaWYodmFsPT09Ij0iKXsKICAgICAgICB0cnl7Y29uc3QgZnVsbD1leHByK2Rpc3BsYXk7ZXhwckRpdi50ZXh0Q29udGVudD1mdWxsKyIgPSI7Y29uc3QgcmVzPUZ1bmN0aW9uKCcidXNlIHN0cmljdCI7cmV0dXJuKCcrZnVsbCsnKScpKCk7ZGlzcGxheT1TdHJpbmcocGFyc2VGbG9hdChyZXMudG9GaXhlZCgxMCkpKTtleHByPSIiO2p1c3RFdmFsZWQ9dHJ1ZTt9CiAgICAgICAgY2F0Y2h7ZGlzcGxheT0iRXJyb3IiO30KICAgICAgfQogICAgICBlbHNlIGlmKFsiKyIsIi0iLCLDlyIsIsO3Il0uaW5jbHVkZXModmFsKSl7Y29uc3Qgb3A9dmFsPT09IsOXIj8iKiI6dmFsPT09IsO3Ij8iLyI6dmFsO2V4cHIrPWRpc3BsYXkrb3A7ZGlzcGxheT0iMCI7fQogICAgICBlbHNlIGlmKHZhbD09PSIuIil7aWYoIWRpc3BsYXkuaW5jbHVkZXMoIi4iKSlkaXNwbGF5Kz0iLiI7fQogICAgICBlbHNle2lmKGRpc3BsYXk9PT0iMCJ8fGp1c3RFdmFsZWQpe2Rpc3BsYXk9dmFsO2p1c3RFdmFsZWQ9ZmFsc2U7fWVsc2UgZGlzcGxheSs9dmFsO2lmKGRpc3BsYXkubGVuZ3RoPjEyKWRpc3BsYXk9ZGlzcGxheS5zbGljZSgwLDEyKTt9CiAgICAgIHJlZnJlc2hEaXNwbGF5KCk7CiAgICB9CiAgICBjb25zdCBncmlkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2dyaWQuY2xhc3NOYW1lPSJjYWxjLWdyaWQiOwogICAgW1siQyIsIkNFIiwi4oyrIiwiKy8tIl0sWyI3IiwiOCIsIjkiLCLDtyJdLFsiNCIsIjUiLCI2Iiwiw5ciXSxbIjEiLCIyIiwiMyIsIi0iXSxbIjAiLCIuIiwiJSIsIisiXSxbIj0iXV0uZm9yRWFjaChyb3c9PnJvdy5mb3JFYWNoKGs9PnsKICAgICAgY29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtiLmNsYXNzTmFtZT0iY2FsYy1idG4iO2IudGV4dENvbnRlbnQ9azsKICAgICAgaWYoWyIrIiwiLSIsIsOXIiwiw7ciXS5pbmNsdWRlcyhrKSliLmNsYXNzTGlzdC5hZGQoIm9wIik7CiAgICAgIGlmKGs9PT0iPSIpe2IuY2xhc3NMaXN0LmFkZCgiZXEiKTtiLmNsYXNzTGlzdC5hZGQoIndpZGUiKTtiLnN0eWxlLmdyaWRDb2x1bW49InNwYW4gNCI7fQogICAgICBpZihrPT09IkMifHxrPT09IkNFIiliLmNsYXNzTGlzdC5hZGQoImNsZWFyIik7CiAgICAgIGIub25jbGljaz0oKT0+Y2FsY0lucHV0KGspOwogICAgICBncmlkLmFwcGVuZENoaWxkKGIpOwogICAgfSkpOwogICAgY2FsY1dyYXAuYXBwZW5kQ2hpbGQoZ3JpZCk7aW5uZXIuYXBwZW5kQ2hpbGQoY2FsY1dyYXApO3dpbi5hcHBlbmRDaGlsZChpbm5lcik7CiAgICBmdW5jdGlvbiBjYWxjS2V5KGUpewogICAgICBpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhjYWxjV3JhcCkpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGNhbGNLZXkpO3JldHVybjt9CiAgICAgIGlmKGUua2V5PT09IkVzY2FwZSIpcmV0dXJuOwogICAgICBjb25zdCBtYXA9eyJFbnRlciI6Ij0iLCJCYWNrc3BhY2UiOiLijKsiLCIqIjoiw5ciLCIvIjoiw7cifTsKICAgICAgY29uc3Qgaz1tYXBbZS5rZXldfHxlLmtleTsKICAgICAgaWYoIjAxMjM0NTY3ODkuKy3Dl8O3Q0U94oyrQyIuaW5jbHVkZXMoayl8fGs9PT0iKy8tInx8az09PSIlIil7ZS5wcmV2ZW50RGVmYXVsdCgpO2NhbGNJbnB1dChrKTt9CiAgICB9CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixjYWxjS2V5KTsKICAgIHJlZnJlc2hEaXNwbGF5KCk7CiAgICByZXR1cm4oKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsY2FsY0tleSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGxhdW5jaEV4cGxvcmVyKHN0YXJ0UGF0aCxnb0JhY2spewogIGlmKHR5cGVvZiBwcmludD09PSJmdW5jdGlvbiIpcHJpbnQoIk9wZW5pbmcgRmlsZSBFeHBsb3Jlci4uLiBFU0MgdG8gZXhpdC4iKTsKICBjb25zdCBzdGFydERpcj1zdGFydFBhdGh8fCJDOlxcVXNlcnNcXGFub255bW91cyI7CiAgbGV0IHNlbGVjdGVkUGF0aD1udWxsOwogIG1ha2VHYW1lV2luZG93KCJGaWxlIEV4cGxvcmVyIixudWxsLG51bGwsKHdpbik9PnsKICAgIGNvbnN0IHRvb2xSb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dG9vbFJvdy5jbGFzc05hbWU9ImV4cGxvcmVyLXRvb2xiYXItcm93IjsKICAgIGNvbnN0IGJTdHlsZT0iYmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6MXB4IHNvbGlkICMwZjA7Y29sb3I6IzBmMDtmb250LWZhbWlseTptb25vc3BhY2U7cGFkZGluZzozcHggOHB4O2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxMnB4OyI7CiAgICBjb25zdCBiYWNrQnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2JhY2tCdG4uc3R5bGUuY3NzVGV4dD1iU3R5bGU7YmFja0J0bi50ZXh0Q29udGVudD0i4peAIjsKICAgIGNvbnN0IHVwQnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3VwQnRuLnN0eWxlLmNzc1RleHQ9YlN0eWxlO3VwQnRuLnRleHRDb250ZW50PSLilrIiOwogICAgY29uc3QgYWRkcklucHV0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7YWRkcklucHV0LmNsYXNzTmFtZT0iZXhwbG9yZXItYWRkciI7YWRkcklucHV0LnZhbHVlPXN0YXJ0RGlyOwogICAgY29uc3QgZ29CdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7Z29CdG4uc3R5bGUuY3NzVGV4dD1iU3R5bGU7Z29CdG4udGV4dENvbnRlbnQ9IkdvIjsKICAgIGNvbnN0IHJvd0J0bnM9W2JhY2tCdG4sdXBCdG4sYWRkcklucHV0LGdvQnRuXTsKICAgIGlmKGdvQmFjayl7Y29uc3QgbWVudUJhY2tCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7bWVudUJhY2tCdG4uc3R5bGUuY3NzVGV4dD1iU3R5bGU7bWVudUJhY2tCdG4udGV4dENvbnRlbnQ9IuKGkCBCYWNrIjttZW51QmFja0J0bi5vbmNsaWNrPWdvQmFjaztyb3dCdG5zLnVuc2hpZnQobWVudUJhY2tCdG4pO30KICAgIHJvd0J0bnMuZm9yRWFjaChlbD0+dG9vbFJvdy5hcHBlbmRDaGlsZChlbCkpOwogICAgd2luLmFwcGVuZENoaWxkKHRvb2xSb3cpOwogICAgY29uc3QgYm9keT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtib2R5LmNsYXNzTmFtZT0iZXhwbG9yZXItYm9keSI7CiAgICBjb25zdCB0cmVlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyZWUuY2xhc3NOYW1lPSJleHBsb3Jlci10cmVlIjsKICAgIGNvbnN0IG1haW49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bWFpbi5jbGFzc05hbWU9ImV4cGxvcmVyLW1haW4iOwogICAgY29uc3QgaXRlbXNEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aXRlbXNEaXYuY2xhc3NOYW1lPSJleHBsb3Jlci1pdGVtcyI7CiAgICBtYWluLmFwcGVuZENoaWxkKGl0ZW1zRGl2KTtib2R5LmFwcGVuZENoaWxkKHRyZWUpO2JvZHkuYXBwZW5kQ2hpbGQobWFpbik7CiAgICB3aW4uYXBwZW5kQ2hpbGQoYm9keSk7CiAgICBjb25zdCBzdGF0dXNiYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7c3RhdHVzYmFyLmNsYXNzTmFtZT0iZXhwbG9yZXItc3RhdHVzYmFyIjsKICAgIHdpbi5hcHBlbmRDaGlsZChzdGF0dXNiYXIpOwogICAgbGV0IGhpc3Rvcnk9W10saGlzdElkeD0tMTsKICAgIGZ1bmN0aW9uIGdldEljb24obmFtZSxpc0Rpcil7CiAgICAgIGlmKGlzRGlyKXJldHVybiLwn5OBIjsKICAgICAgaWYobmFtZS5lbmRzV2l0aCgiLmV4ZSIpKXJldHVybiLimpnvuI8iOwogICAgICBpZihuYW1lLmVuZHNXaXRoKCIudHh0IikpcmV0dXJuIvCfk4QiOwogICAgICBpZihuYW1lLmVuZHNXaXRoKCIuaHRtbCIpfHxuYW1lLmVuZHNXaXRoKCIuaHRtIikpcmV0dXJuIvCfjJAiOwogICAgICByZXR1cm4i8J+ThCI7CiAgICB9CiAgICBmdW5jdGlvbiBuYXZpZ2F0ZShwYXRoKXsKICAgICAgY29uc3Qgbm9kZT1nZXRFbnRyeShwYXRoKTsKICAgICAgaWYobm9kZT09PW51bGx8fHR5cGVvZiBub2RlIT09Im9iamVjdCIpe3N0YXR1c2Jhci50ZXh0Q29udGVudD0iQ2Fubm90IGFjY2VzczogIitwYXRoO3JldHVybjt9CiAgICAgIGlmKGhpc3RJZHg8MHx8aGlzdG9yeVtoaXN0SWR4XSE9PXBhdGgpe2hpc3Rvcnk9aGlzdG9yeS5zbGljZSgwLGhpc3RJZHgrMSk7aGlzdG9yeS5wdXNoKHBhdGgpO2hpc3RJZHgrKzt9CiAgICAgIGFkZHJJbnB1dC52YWx1ZT1wYXRoOwogICAgICB0cmVlLmlubmVySFRNTD0iIjsKICAgICAgWyJDOlxcIiwiQzpcXFVzZXJzIiwiQzpcXFVzZXJzXFxhbm9ueW1vdXMiLCJDOlxcVXNlcnNcXGFub255bW91c1xcQXBwcyIsIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxHYW1lcyIsIkM6XFxQcm9ncmFtIEZpbGVzIl0uZm9yRWFjaChwPT57CiAgICAgICAgY29uc3QgaXRlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpdGVtLmNsYXNzTmFtZT0iZXhwbG9yZXItdHJlZS1pdGVtIjsKICAgICAgICBpZihwPT09cGF0aClpdGVtLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIik7CiAgICAgICAgY29uc3QgaWNvbnM9eyJDOlxcIjogICLwn5K+IiwiQzpcXFVzZXJzIjoi8J+RpSIsIkM6XFxVc2Vyc1xcYW5vbnltb3VzIjoi8J+RpCIsIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxBcHBzIjoi8J+boO+4jyIsIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxHYW1lcyI6IvCfjq4iLCJDOlxcUHJvZ3JhbSBGaWxlcyI6IvCfk6YifTsKICAgICAgICBpdGVtLnRleHRDb250ZW50PShpY29uc1twXXx8IvCfk4EiKSsiICIrcC5zcGxpdCgiXFwiKS5wb3AoKTsKICAgICAgICBpdGVtLm9uY2xpY2s9KCk9Pm5hdmlnYXRlKHApO3RyZWUuYXBwZW5kQ2hpbGQoaXRlbSk7CiAgICAgIH0pOwogICAgICBpdGVtc0Rpdi5pbm5lckhUTUw9IiI7c2VsZWN0ZWRQYXRoPW51bGw7CiAgICAgIGNvbnN0IGVudHJpZXM9T2JqZWN0LmVudHJpZXMobm9kZSk7CiAgICAgIGlmKGVudHJpZXMubGVuZ3RoPT09MCl7Y29uc3QgZW1wdHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZW1wdHkuc3R5bGUuY3NzVGV4dD0iY29sb3I6IzBhMDtmb250LXNpemU6MTJweDtwYWRkaW5nOjEwcHg7IjtlbXB0eS50ZXh0Q29udGVudD0iKFRoaXMgZm9sZGVyIGlzIGVtcHR5KSI7aXRlbXNEaXYuYXBwZW5kQ2hpbGQoZW1wdHkpO30KICAgICAgZW50cmllcy5mb3JFYWNoKChbbmFtZSx2YWxdKT0+ewogICAgICAgIGNvbnN0IGlzRGlyPXR5cGVvZiB2YWw9PT0ib2JqZWN0IjsKICAgICAgICBjb25zdCBpdGVtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2l0ZW0uY2xhc3NOYW1lPSJleHBsb3Jlci1pdGVtIjsKICAgICAgICBjb25zdCBpY29uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ljb24uY2xhc3NOYW1lPSJleHBsb3Jlci1pY29uIjtpY29uLnRleHRDb250ZW50PWdldEljb24obmFtZSxpc0Rpcik7CiAgICAgICAgY29uc3QgbGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bGFiZWwuY2xhc3NOYW1lPSJleHBsb3Jlci1sYWJlbCI7bGFiZWwudGV4dENvbnRlbnQ9bmFtZTsKICAgICAgICBpdGVtLmFwcGVuZENoaWxkKGljb24pO2l0ZW0uYXBwZW5kQ2hpbGQobGFiZWwpOwogICAgICAgIGl0ZW0ub25jbGljaz0oKT0+e2l0ZW1zRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIi5leHBsb3Jlci1pdGVtIikuZm9yRWFjaChpPT5pLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIikpO2l0ZW0uY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTtzZWxlY3RlZFBhdGg9cGF0aCsiXFwiK25hbWU7c3RhdHVzYmFyLnRleHRDb250ZW50PWlzRGlyP2AxIGZvbGRlciBzZWxlY3RlZDogJHtuYW1lfWA6YDEgZmlsZSBzZWxlY3RlZDogJHtuYW1lfWA7fTsKICAgICAgICBpdGVtLm9uZGJsY2xpY2s9KCk9PnsKICAgICAgICAgIGlmKGlzRGlyKXtuYXZpZ2F0ZShwYXRoKyJcXCIrbmFtZSk7fQogICAgICAgICAgZWxzZXsKICAgICAgICAgICAgY29uc3QgZnVsbFBhdGg9cGF0aCsiXFwiK25hbWU7Y29uc3Qgbm9kZVZhbD1nZXRFbnRyeShmdWxsUGF0aCl8fHZhbDsKICAgICAgICAgICAgaWYobmFtZS5lbmRzV2l0aCgiLnR4dCIpfHxuYW1lLmVuZHNXaXRoKCIuaHRtbCIpfHxuYW1lLmVuZHNXaXRoKCIuaHRtIil8fG5hbWUuZW5kc1dpdGgoIi5qcyIpfHxuYW1lLmVuZHNXaXRoKCIuY3NzIikpewogICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PmxhdW5jaE5vdGVwYWQobmFtZSx0eXBlb2Ygbm9kZVZhbD09PSJzdHJpbmciJiZub2RlVmFsIT09IihleGVjdXRhYmxlKSI/bm9kZVZhbDoiIiksMTAwKTsKICAgICAgICAgICAgfSBlbHNlIGlmKG5hbWUuZW5kc1dpdGgoIi5leGUiKSl7CiAgICAgICAgICAgICAgY29uc3QgZXhlTWF0Y2g9T2JqZWN0LmtleXMoZXhlY3V0YWJsZXMpLmZpbmQoaz0+ay50b0xvd2VyQ2FzZSgpPT09bmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgICBpZihleGVNYXRjaClzZXRUaW1lb3V0KCgpPT5leGVjdXRhYmxlc1tleGVNYXRjaF0oKSwxMDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpdGVtc0Rpdi5hcHBlbmRDaGlsZChpdGVtKTsKICAgICAgfSk7CiAgICAgIHN0YXR1c2Jhci50ZXh0Q29udGVudD1gJHtlbnRyaWVzLmxlbmd0aH0gaXRlbShzKWA7CiAgICB9CiAgICBiYWNrQnRuLm9uY2xpY2s9KCk9PntpZihoaXN0SWR4PjApe2hpc3RJZHgtLTtuYXZpZ2F0ZShoaXN0b3J5W2hpc3RJZHhdKTtoaXN0b3J5LnBvcCgpO2hpc3RJZHg9TWF0aC5tYXgoMCxoaXN0SWR4KTt9fTsKICAgIHVwQnRuLm9uY2xpY2s9KCk9Pntjb25zdCBwYXJ0cz1hZGRySW5wdXQudmFsdWUuc3BsaXQoIlxcIikuZmlsdGVyKEJvb2xlYW4pO2lmKHBhcnRzLmxlbmd0aD4xKXtwYXJ0cy5wb3AoKTtuYXZpZ2F0ZShwYXJ0cy5qb2luKCJcXCIpKTt9fTsKICAgIGdvQnRuLm9uY2xpY2s9KCk9Pm5hdmlnYXRlKGFkZHJJbnB1dC52YWx1ZS50cmltKCkpOwogICAgYWRkcklucHV0Lm9ua2V5ZG93bj1lPT57aWYoZS5rZXk9PT0iRW50ZXIiKW5hdmlnYXRlKGFkZHJJbnB1dC52YWx1ZS50cmltKCkpO307CiAgICBuYXZpZ2F0ZShzdGFydERpcik7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNob3dUZXJtaW5hbChnb0JhY2spewogIGNsZWFyQm9keSgpOwogIGNvbnN0IHBhZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cGFnZS5jbGFzc05hbWU9InRlcm0tcGFnZSI7CiAgY29uc3Qgb3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO291dC5jbGFzc05hbWU9InRlcm0tb3V0cHV0IjsKCiAgY29uc3QgaW5wdXRSb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aW5wdXRSb3cuY2xhc3NOYW1lPSJ0ZXJtLWlucHV0LXJvdyI7CiAgY29uc3QgcHJvbXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtwcm9tcHQuY2xhc3NOYW1lPSJ0ZXJtLXByb21wdCI7CiAgY29uc3QgaW5wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aW5wLmNsYXNzTmFtZT0idGVybS1pbnB1dCI7aW5wLmF1dG9jb21wbGV0ZT0ib2ZmIjtpbnAuc3BlbGxjaGVjaz1mYWxzZTsKCiAgaW5wdXRSb3cuYXBwZW5kQ2hpbGQocHJvbXB0KTtpbnB1dFJvdy5hcHBlbmRDaGlsZChpbnApOwogIHBhZ2UuYXBwZW5kQ2hpbGQob3V0KTtwYWdlLmFwcGVuZENoaWxkKGlucHV0Um93KTsKCiAgaWYoZ29CYWNrKXsKICAgIGNvbnN0IGJhY2tCdG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICBiYWNrQnRuLnRleHRDb250ZW50PSLihpAgRVotTW9kZSI7CiAgICBiYWNrQnRuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmZpeGVkO3RvcDoxMHB4O3JpZ2h0OjEwcHg7ei1pbmRleDoxMDtwYWRkaW5nOjZweCAxNHB4O2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjIpO2NvbG9yOiMwZjA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4zKTtmb250LWZhbWlseTptb25vc3BhY2U7IjsKICAgIGJhY2tCdG4ub25tb3VzZWVudGVyPSgpPT57YmFja0J0bi5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsMjU1LDAsMC4xNSkiO2JhY2tCdG4uc3R5bGUuYm9yZGVyQ29sb3I9IiMwZjAiO307CiAgICBiYWNrQnRuLm9ubW91c2VsZWF2ZT0oKT0+e2JhY2tCdG4uc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLDAsMCwwLjIpIjtiYWNrQnRuLnN0eWxlLmJvcmRlckNvbG9yPSJyZ2JhKDAsMjU1LDAsMC4zKSI7fTsKICAgIGJhY2tCdG4ub25jbGljaz1nb0JhY2s7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJhY2tCdG4pOwogIH0KCiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYWdlKTsKICBhZGRDb3B5cmlnaHQoKTsKCiAgY29uc3QgZnM9ewogICAgIkM6XFwiOnsKICAgICAgIlVzZXJzIjp7fSwKICAgICAgIldpbmRvd3MiOnt9LAogICAgICAiUHJvZ3JhbSBGaWxlcyI6e30sCiAgICAgICJQcm9ncmFtIEZpbGVzICh4ODYpIjp7fSwKICAgICAgIlByb2dyYW1EYXRhIjp7fSwKICAgICAgIlRlbXAiOnt9CiAgICB9LAogICAgIkM6XFxVc2VycyI6ewogICAgICAiYW5vbnltb3VzIjp7fQogICAgfSwKICAgICJDOlxcVXNlcnNcXGFub255bW91cyI6ewogICAgICAiRGVza3RvcCI6e30sCiAgICAgICJEb2N1bWVudHMiOnt9LAogICAgICAiRG93bmxvYWRzIjp7fSwKICAgICAgIkdhbWVzIjp7fSwKICAgICAgIkFwcHMiOnt9LAogICAgICAibm90ZXBhZC5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAiZXhwbG9yZXIuZXhlIjoiKGV4ZWN1dGFibGUpIiwKICAgICAgInRhc2ttZ3IuZXhlIjoiKGV4ZWN1dGFibGUpIiwKICAgICAgInJlYWRtZS50eHQiOiJEYXRhIE9TIDguMC4wLWZpbmFsIC0gU3lzdGVtIEd1aWRlXHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5XRUxDT01FXHJcbi0tLS0tLS1cclxuRGF0YSBPUyBpcyBhIGJyb3dzZXItYmFzZWQgdGVybWluYWwgZW52aXJvbm1lbnQgd2l0aCBhcHBzLCBnYW1lcyxcclxuYW5kIGEgZnVsbCB2aXJ0dWFsIGZpbGVzeXN0ZW0uIFR5cGUgY29tbWFuZHMgaW4gdGhlIHRlcm1pbmFsIHRvXHJcbm5hdmlnYXRlIGFuZCBsYXVuY2ggcHJvZ3JhbXMuXHJcblxyXG5cclxuVEVSTUlOQUwgQ09NTUFORFNcclxuLS0tLS0tLS0tLS0tLS0tLS1cclxuY2xzICAgICAgICAgIC0gQ2xlYXIgdGhlIHNjcmVlblxyXG5kaXIgICAgICAgICAgLSBMaXN0IGZpbGVzIGluIGN1cnJlbnQgZGlyZWN0b3J5XHJcbmNkIFtmb2xkZXJdICAtIENoYW5nZSBkaXJlY3RvcnkgKGNhc2UtaW5zZW5zaXRpdmUpXHJcbm1kIFtuYW1lXSAgICAtIE1ha2UgYSBuZXcgZm9sZGVyXHJcbnJkIFtuYW1lXSAgICAtIFJlbW92ZSBhIGZvbGRlclxyXG5kZWwgW2ZpbGVdICAgLSBEZWxldGUgYSBmaWxlXHJcbnR5cGUgW2ZpbGVdICAtIFByaW50IGEgZmlsZSdzIGNvbnRlbnRzXHJcbmNvcHkgW2FdIFtiXSAtIENvcHkgYSBmaWxlXHJcbm1vdmUgW2FdIFtiXSAtIE1vdmUgYSBmaWxlXHJcbnJlbiBbYV0gW2JdICAtIFJlbmFtZSBhIGZpbGVcclxuZWNobyBbdGV4dF0gIC0gUHJpbnQgdGV4dCB0byBzY3JlZW5cclxudmVyICAgICAgICAgIC0gU2hvdyBPUyB2ZXJzaW9uXHJcbmRhdGUgLyB0aW1lICAtIFNob3cgY3VycmVudCBkYXRlIG9yIHRpbWVcclxud2hvYW1pICAgICAgIC0gU2hvdyBjdXJyZW50IHVzZXJcclxuaG9zdG5hbWUgICAgIC0gU2hvdyBjb21wdXRlciBuYW1lXHJcbnN5c3RlbWluZm8gICAtIFNob3cgc3lzdGVtIGluZm9ybWF0aW9uXHJcbnRhc2tsaXN0ICAgICAtIExpc3QgcnVubmluZyBwcm9jZXNzZXNcclxuaXBjb25maWcgICAgIC0gU2hvdyBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cclxucGluZyBbaG9zdF0gIC0gUGluZyBhIGhvc3Rcclxuc2V0ICAgICAgICAgIC0gU2hvdyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuaGVscCBbY21kXSAgIC0gR2V0IGhlbHAgb24gYW55IGNvbW1hbmRcclxuZXotbW9kZSAgICAgIC0gT3BlbiBFWi1Nb2RlXHJcblxyXG5cclxuQVBQU1xyXG4tLS0tXHJcbm5vdGVwYWQuZXhlICAtIFRleHQgZWRpdG9yIChFU0MgdG8gY2xvc2UpXHJcbmV4cGxvcmVyLmV4ZSAtIEZpbGUgRXhwbG9yZXIgKEVTQyB0byBjbG9zZSlcclxudGFza21nci5leGUgIC0gVGFzayBNYW5hZ2VyXHJcblxyXG5TbWFsbCBhcHBzIGFyZSBpbiBDOlxcVXNlcnNcXGFub255bW91c1xcQXBwc1xyXG5jZCBBcHBzLCB0aGVuIHR5cGUgdGhlIG5hbWUgdG8gbGF1bmNoOlxyXG5cclxuICBjYWxjLmV4ZSAgICAgICAtIENhbGN1bGF0b3JcclxuICBodG1sZWRpdG9yLmV4ZSAtIEhUTUwgRWRpdG9yIHdpdGggbGl2ZSBwcmV2aWV3XHJcbiAgdXJsbG9hZGVyLmV4ZSAgLSBMb2FkIGFueSBVUkwgaW4gYSBmcmFtZVxyXG4gIGJhc2U2NC5leGUgICAgIC0gQmFzZTY0IGVuY29kZXIvZGVjb2RlclxyXG4gIHN0cmVzcy5leGUgICAgIC0gQ1BVIFN0cmVzcyBUZXN0XHJcbiAgcGFpbnQuZXhlICAgICAgLSBGcmVlaGFuZCBkcmF3aW5nIGNhbnZhc1xyXG4gIHBpeGVsYXJ0LmV4ZSAgIC0gUGl4ZWwgYXJ0IGVkaXRvclxyXG4gIGFzY2lpLmV4ZSAgICAgIC0gSW1hZ2UgdG8gQVNDSUkgYXJ0IGNvbnZlcnRlclxyXG4gIGhhY2tlci5leGUgICAgIC0gSGFja2VyIFR5cGVyXHJcblxyXG5cclxuR0FNRVNcclxuLS0tLS1cclxuR2FtZXMgYXJlIGluIEM6XFxVc2Vyc1xcYW5vbnltb3VzXFxHYW1lc1xyXG4gIGNkIEdhbWVzLCB0aGVuIHR5cGUgdGhlIG5hbWU6XHJcblxyXG4gIHBvbmcgICAgICAgICAtIFcvUyB0byBtb3ZlLCBTUEFDRSB0byBzdGFydFxyXG4gIHRldHJpcyAgICAgICAtIEFycm93IGtleXMsIFNQQUNFIHRvIGhhcmQgZHJvcFxyXG4gIG1pbmVzd2VlcGVyICAtIExlZnQtY2xpY2sgcmV2ZWFsLCByaWdodC1jbGljayBmbGFnXHJcbiAgc25ha2UgICAgICAgIC0gQXJyb3cga2V5cywgU1BBQ0UgdG8gc3RhcnRcclxuICBicmVha291dCAgICAgLSBNb3VzZSBvciBhcnJvdyBrZXlzLCBTUEFDRSB0byBsYXVuY2hcclxuICAyMDQ4ICAgICAgICAgLSBBcnJvdyBrZXlzIHRvIHNsaWRlIHRpbGVzXHJcblxyXG5BbGwgZ2FtZXM6IEVTQyB0byBleGl0LCBSIHRvIHJlc3RhcnQuXHJcblxyXG5cclxuRklMRVNZU1RFTSBMQVlPVVRcclxuLS0tLS0tLS0tLS0tLS0tLS1cclxuQzpcXFxyXG4gIFVzZXJzXFxcclxuICAgIGFub255bW91c1xcICAgICAgIDwtIFlvdXIgaG9tZSBmb2xkZXJcclxuICAgICAgRGVza3RvcFxcXHJcbiAgICAgIERvY3VtZW50c1xcXHJcbiAgICAgIERvd25sb2Fkc1xcXHJcbiAgICAgIEFwcHNcXCAgICAgICAgICA8LSBTbWFsbCBhcHBzXHJcbiAgICAgIEdhbWVzXFwgICAgICAgICA8LSBHYW1lc1xyXG4gIFByb2dyYW0gRmlsZXNcXFxyXG4gICAgR29vZ2xlXFxcclxuICAgICAgQ2hyb21lXFxcclxuXHJcblRpcDogY2QgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgc28gJ2NkIGFwcHMnIHdvcmtzIGZpbmUuXHJcbiIsCiAgICB9LAogICAgIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxEZXNrdG9wIjp7CiAgICAgICJFWi1Nb2RlLmh0bWwiOiIodGhpcyBmaWxlKSIsCiAgICAgICJzaG9ydGN1dC50eHQiOiJUaGlzIGlzIGEgc2hvcnRjdXQuXHJcbiIKICAgIH0sCiAgICAiQzpcXFVzZXJzXFxhbm9ueW1vdXNcXERvY3VtZW50cyI6ewogICAgICAiaG9tZXdvcmsudHh0IjoiTWF0aDogcGcgMzQgZXggMS0xMFxyXG5FbmdsaXNoOiByZWFkIGNoYXB0ZXIgNVxyXG4iLAogICAgICAiZXNzYXkudHh0IjoiTXkgZXNzYXkgZ29lcyBoZXJlLlxyXG4iCiAgICB9LAogICAgIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxEb3dubG9hZHMiOnt9LAogICAgIkM6XFxVc2Vyc1xcYW5vbnltb3VzXFxHYW1lcyI6ewogICAgICAicG9uZy5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAidGV0cmlzLmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICJtaW5lc3dlZXBlci5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAic25ha2UuZXhlIjoiKGV4ZWN1dGFibGUpIiwKICAgICAgImJyZWFrb3V0LmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICIyMDQ4LmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICJkb29tLmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICJ3b2xmM2QuZXhlIjoiKGV4ZWN1dGFibGUpIgogICAgfSwKICAgICJDOlxcVXNlcnNcXGFub255bW91c1xcQXBwcyI6ewogICAgICAiY2FsYy5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAiaHRtbGVkaXRvci5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAidXJsbG9hZGVyLmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICJiYXNlNjQuZXhlIjoiKGV4ZWN1dGFibGUpIiwKICAgICAgInN0cmVzcy5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAicGFpbnQuZXhlIjoiKGV4ZWN1dGFibGUpIiwKICAgICAgInBpeGVsYXJ0LmV4ZSI6IihleGVjdXRhYmxlKSIsCiAgICAgICJhc2NpaS5leGUiOiIoZXhlY3V0YWJsZSkiLAogICAgICAiaGFja2VyLmV4ZSI6IihleGVjdXRhYmxlKSIKICAgIH0sCiAgICAiQzpcXFByb2dyYW0gRmlsZXMiOnsKICAgICAgIkdvb2dsZSI6e30sCiAgICAgICJJbnRlcm5ldCBFeHBsb3JlciI6e30KICAgIH0sCiAgICAiQzpcXFByb2dyYW0gRmlsZXNcXEdvb2dsZSI6ewogICAgICAiQ2hyb21lIjp7fQogICAgfSwKICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcR29vZ2xlXFxDaHJvbWUiOnsKICAgICAgImNocm9tZS5leGUiOiIoZXhlY3V0YWJsZSkiCiAgICB9LAogICAgIkM6XFxUZW1wIjp7fSwKICAgICJDOlxcUHJvZ3JhbURhdGEiOnt9CiAgfTsKCgogIGNvbnN0IGV4ZWN1dGFibGVzPXsKICAgICJjYWxjLmV4ZSI6KCk9PmxhdW5jaENhbGN1bGF0b3IoKSwKICAgICJub3RlcGFkLmV4ZSI6KCk9PmxhdW5jaE5vdGVwYWQobnVsbCwiIiksCiAgICAibXNwYWludC5leGUiOigpPT57cHJpbnQoIk9wZW5pbmcgUGFpbnQuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93RHJhdyhzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJwYWludC5leGUiOigpPT57cHJpbnQoIk9wZW5pbmcgUGFpbnQuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93RHJhdyhzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJleHBsb3Jlci5leGUiOigpPT5sYXVuY2hFeHBsb3JlcigiQzpcXFVzZXJzXFxhbm9ueW1vdXMiKSwKICAgICJjaHJvbWUuZXhlIjooKT0+e3ByaW50KCJHb29nbGUgQ2hyb21lIGlzIGFscmVhZHkgcnVubmluZy4iKTt9LAogICAgImNtZC5leGUiOigpPT57cHJpbnQoIk1pY3Jvc29mdCBXaW5kb3dzIFtWZXJzaW9uIDEwLjAuMTkwNDUuNDg5NF0iKTtwcmludCgiKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4iKTtwcmludCgiIik7cHJpbnQoIllvdSBhcmUgYWxyZWFkeSBpbiBjbWQuZXhlLiIpO30sCiAgICAidGFza21nci5leGUiOigpPT57CiAgICAgIHByaW50KCJXaW5kb3dzIFRhc2sgTWFuYWdlciIpO3ByaW50KCIiKTsKICAgICAgcHJpbnQoIkltYWdlIE5hbWUgICAgICAgICAgICAgICAgICAgICBQSUQgIENQVSAgIE1lbSBVc2FnZSIpOwogICAgICBwcmludCgiPT09PT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PSA9PT09ICA9PT09PT09PT09PT0iKTsKICAgICAgW1siU3lzdGVtIElkbGUgUHJvY2VzcyIsIjAiLCI5OSIsIjI0IEsiXSxbIlN5c3RlbSIsIjQiLCIwIiwiMiwwNDggSyJdLAogICAgICAgWyJzdmNob3N0LmV4ZSIsIjgxMiIsIjAiLCIxOCw0MzIgSyJdLFsiZXhwbG9yZXIuZXhlIiwiMjA0OCIsIjAiLCI1NCwzMjAgSyJdLAogICAgICAgWyJjaHJvbWUuZXhlIiwiMzEyMCIsIjEiLCIyMTAsODQwIEsiXSxbImNtZC5leGUiLCI0MjAwIiwiMCIsIjMsMTIwIEsiXV0KICAgICAgLmZvckVhY2goKFtuLHAsYyxtXSk9PnByaW50KGAke24ucGFkRW5kKDI2KX0ke3AucGFkU3RhcnQoOCl9ICAke2MucGFkU3RhcnQoMyl9JSAgJHttLnBhZFN0YXJ0KDEyKX1gKSk7CiAgICB9LAogICAgImh0bWxlZGl0b3IuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIEhUTUwgRWRpdG9yLi4uIik7c2V0VGltZW91dCgoKT0+c2hvd0VkaXRvcigiIixzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJ1cmxsb2FkZXIuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIFVSTCBMb2FkZXIuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93VVJMUGFnZShzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJiYXNlNjQuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIEJhc2U2NCBUb29sLi4uIik7c2V0VGltZW91dCgoKT0+c2hvd0Jhc2U2NChzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJzdHJlc3MuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIENQVSBTdHJlc3MgVGVzdC4uLiIpO3NldFRpbWVvdXQoKCk9PnNob3dTdHJlc3Moc2hvd1Rlcm1pbmFsKSwxMDApO30sCiAgICAicGl4ZWxhcnQuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIFBpeGVsIEFydCBFZGl0b3IuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93UGl4ZWxBcnQoc2hvd1Rlcm1pbmFsKSwxMDApO30sCiAgICAiYXNjaWkuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIEFTQ0lJIEFydCBNYWtlci4uLiIpO3NldFRpbWVvdXQoKCk9PnNob3dBU0NJSShzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJoYWNrZXIuZXhlIjooKT0+e3ByaW50KCJPcGVuaW5nIEhhY2tlciBUeXBlci4uLiIpO3NldFRpbWVvdXQoKCk9PnNob3dIYWNrZXJUeXBlcihzaG93VGVybWluYWwpLDEwMCk7fSwKICAgICJwb25nLmV4ZSI6KCk9PmxhdW5jaFBvbmcoKSwKICAgICJ0ZXRyaXMuZXhlIjooKT0+bGF1bmNoVGV0cmlzKCksCiAgICAibWluZXN3ZWVwZXIuZXhlIjooKT0+bGF1bmNoTWluZXN3ZWVwZXIoKSwKICAgICJzbmFrZS5leGUiOigpPT5sYXVuY2hTbmFrZSgpLAogICAgImJyZWFrb3V0LmV4ZSI6KCk9PmxhdW5jaEJyZWFrb3V0KCksCiAgICAiMjA0OC5leGUiOigpPT5sYXVuY2gyMDQ4KCksCiAgICAiZG9vbS5leGUiOigpPT57cHJpbnQoIkxvYWRpbmcgRE9PTS4uLiIpO3NldFRpbWVvdXQoKCk9PnNob3dEb29tKHNob3dUZXJtaW5hbCksMTAwKTt9LAogICAgIndvbGYzZC5leGUiOigpPT57cHJpbnQoIkxvYWRpbmcgV29sZmVuc3RlaW4gM0QuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93V29sZjNEKHNob3dUZXJtaW5hbCksMTAwKTt9LAogICAgIkVaLU1vZGUuaHRtbCI6KCk9PntwcmludCgiTGF1bmNoaW5nIEVaLU1vZGUuLi4iKTtzZXRUaW1lb3V0KCgpPT5zaG93TWVudSgpLDMwMCk7fSwKICB9OwoKICBsZXQgdXNlcj0iYW5vbnltb3VzIjsKICBsZXQgY3dkPSJDOlxcVXNlcnNcXGFub255bW91cyI7CiAgbGV0IGhpc3Rvcnk9W10saGlzdElkeD0tMTsKCiAgZnVuY3Rpb24gbm9ybVBhdGgocCl7CiAgICBjb25zdCBwYXJ0cz1wLnJlcGxhY2UoL1wvL2csIlxcIikuc3BsaXQoIlxcIikuZmlsdGVyKCh4LGkpPT54fHxpPT09MCk7CiAgICBjb25zdCBvdXQ9W107CiAgICBmb3IoY29uc3QgcGFydCBvZiBwYXJ0cyl7CiAgICAgIGlmKHBhcnQ9PT0iLiIpY29udGludWU7CiAgICAgIGlmKHBhcnQ9PT0iLi4iKXtpZihvdXQubGVuZ3RoPjEpb3V0LnBvcCgpO30KICAgICAgZWxzZSBvdXQucHVzaChwYXJ0KTsKICAgIH0KICAgIHJldHVybiBvdXQuam9pbigiXFwiKTsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVQYXRoKHApewogICAgaWYoIXApcmV0dXJuIGN3ZDsKICAgIHA9cC50cmltKCkucmVwbGFjZSgvXC8vZywiXFwiKTsKICAgIGlmKC9eW0EtWmEtel06XFwvLnRlc3QocCkpcmV0dXJuIGNhbm9uaWNhbGl6ZVBhdGgobm9ybVBhdGgocCkpOwogICAgcmV0dXJuIGNhbm9uaWNhbGl6ZVBhdGgobm9ybVBhdGgoY3dkKyJcXCIrcCkpOwogIH0KCiAgZnVuY3Rpb24gZ2V0RW50cnkocGF0aCl7CiAgICBpZihwYXRoIGluIGZzKXJldHVybiBmc1twYXRoXTsKICAgIGNvbnN0IGxvd2VyPXBhdGgudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IGtleT1PYmplY3Qua2V5cyhmcykuZmluZChrPT5rLnRvTG93ZXJDYXNlKCk9PT1sb3dlcik7CiAgICByZXR1cm4ga2V5IT09dW5kZWZpbmVkP2ZzW2tleV06bnVsbDsKICB9CgogIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgocGF0aCl7CiAgICBpZihwYXRoIGluIGZzKXJldHVybiBwYXRoOwogICAgY29uc3QgbG93ZXI9cGF0aC50b0xvd2VyQ2FzZSgpOwogICAgY29uc3Qga2V5PU9iamVjdC5rZXlzKGZzKS5maW5kKGs9PmsudG9Mb3dlckNhc2UoKT09PWxvd2VyKTsKICAgIHJldHVybiBrZXkhPT11bmRlZmluZWQ/a2V5OnBhdGg7CiAgfQoKICBmdW5jdGlvbiBnZXRQYXJlbnRDb250ZW50KHBhdGgpewogICAgY29uc3QgcGFydHM9cGF0aC5zcGxpdCgiXFwiKTsKICAgIGNvbnN0IG5hbWU9cGFydHNbcGFydHMubGVuZ3RoLTFdOwogICAgY29uc3QgcGFyZW50PXBhcnRzLnNsaWNlKDAsLTEpLmpvaW4oIlxcIik7CiAgICBjb25zdCBwYXJlbnRPYmo9Z2V0RW50cnkocGFyZW50KTsKICAgIGlmKCFwYXJlbnRPYmopcmV0dXJuIG51bGw7CiAgICBjb25zdCBhY3R1YWxOYW1lPU9iamVjdC5rZXlzKHBhcmVudE9iaikuZmluZChrPT5rLnRvTG93ZXJDYXNlKCk9PT1uYW1lLnRvTG93ZXJDYXNlKCkpfHxuYW1lOwogICAgcmV0dXJue3BhcmVudDpwYXJlbnRPYmosbmFtZTphY3R1YWxOYW1lLHBhcmVudFBhdGg6cGFyZW50fTsKICB9CgogIGZ1bmN0aW9uIHByaW50KHRleHQsY29sb3I9IiIpewogICAgY29uc3QgbGluZXM9KHRleHR8fCIiKS5zcGxpdCgiXG4iKTsKICAgIGxpbmVzLmZvckVhY2gobD0+ewogICAgICBjb25zdCBsaW5lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBpZihjb2xvcilsaW5lLnN0eWxlLmNvbG9yPWNvbG9yOwogICAgICBsaW5lLnRleHRDb250ZW50PWw7CiAgICAgIG91dC5hcHBlbmRDaGlsZChsaW5lKTsKICAgIH0pOwogICAgb3V0LnNjcm9sbFRvcD1vdXQuc2Nyb2xsSGVpZ2h0OwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUHJvbXB0KCl7cHJvbXB0LnRleHRDb250ZW50PWN3ZCsiPiI7fQogIHVwZGF0ZVByb21wdCgpOwoKICBmdW5jdGlvbiBmb3JtYXREaXJFbnRyeShuYW1lLHZhbCl7CiAgICBjb25zdCBub3c9bmV3IERhdGUoKTsKICAgIGNvbnN0IGRhdGU9bm93LnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHttb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iix5ZWFyOiJudW1lcmljIn0pOwogICAgY29uc3QgdGltZT1ub3cudG9Mb2NhbGVUaW1lU3RyaW5nKCJlbi1VUyIse2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsaG91cjEyOnRydWV9KTsKICAgIGNvbnN0IGlzRGlyPXR5cGVvZiB2YWw9PT0ib2JqZWN0IjsKICAgIGlmKGlzRGlyKSByZXR1cm5gJHtkYXRlfSAgJHt0aW1lfSAgICA8RElSPiAgICAgICAgICAke25hbWV9YDsKICAgIGNvbnN0IHNpemU9U3RyaW5nKHR5cGVvZiB2YWw9PT0ic3RyaW5nIj92YWwubGVuZ3RoOjApLnBhZFN0YXJ0KDE0KTsKICAgIHJldHVybmAke2RhdGV9ICAke3RpbWV9ICAgJHtzaXplfSAke25hbWV9YDsKICB9CgogIGZ1bmN0aW9uIHJ1bkNtZChyYXcpewogICAgY29uc3QgdHJpbW1lZD1yYXcudHJpbSgpOwogICAgaWYoIXRyaW1tZWQpe3ByaW50KGN3ZCsiPiIpO3JldHVybjt9CiAgICBoaXN0b3J5LnVuc2hpZnQodHJpbW1lZCk7aGlzdElkeD0tMTsKICAgIHByaW50KGN3ZCsiPiIrdHJpbW1lZCk7CgogICAgY29uc3QgdG9rZW5zPXRyaW1tZWQubWF0Y2goLyg/OlteXHMiXSt8IlteIl0qIikrL2cpfHxbXTsKICAgIGNvbnN0IGNtZD10b2tlbnNbMF0udG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IGFyZ3M9dG9rZW5zLnNsaWNlKDEpLm1hcChhPT5hLnJlcGxhY2UoL14ifCIkL2csIiIpKTsKICAgIGNvbnN0IGFyZ1N0cj1hcmdzLmpvaW4oIiAiKTsKCiAgICBzd2l0Y2goY21kKXsKICAgICAgY2FzZSJjbHMiOgogICAgICAgIG91dC5pbm5lckhUTUw9IiI7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlImRpciI6ewogICAgICAgIGNvbnN0IHRhcmdldD1hcmdzWzBdP3Jlc29sdmVQYXRoKGFyZ3NbMF0pOmN3ZDsKICAgICAgICBjb25zdCBub2RlPWdldEVudHJ5KHRhcmdldCk7CiAgICAgICAgaWYobm9kZT09PW51bGwpe3ByaW50KGAgVm9sdW1lIGluIGRyaXZlIEMgaGFzIG5vIGxhYmVsLmApO3ByaW50KGAgRmlsZSBOb3QgRm91bmRgLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGlmKHR5cGVvZiBub2RlPT09InN0cmluZyIpe3ByaW50KGAgVm9sdW1lIGluIGRyaXZlIEMgaGFzIG5vIGxhYmVsLmApO3ByaW50KGAgRGlyZWN0b3J5IG9mICR7dGFyZ2V0fWApO3ByaW50KCIiKTtwcmludChmb3JtYXREaXJFbnRyeSh0YXJnZXQuc3BsaXQoIlxcIikucG9wKCksbm9kZSkpO2JyZWFrO30KICAgICAgICBjb25zdCBlbnRyaWVzPU9iamVjdC5lbnRyaWVzKG5vZGUpOwogICAgICAgIHByaW50KGAgVm9sdW1lIGluIGRyaXZlIEMgaGFzIG5vIGxhYmVsLmApOwogICAgICAgIHByaW50KGAgVm9sdW1lIFNlcmlhbCBOdW1iZXIgaXMgOEEzRi0xQjJDYCk7CiAgICAgICAgcHJpbnQoIiIpOwogICAgICAgIHByaW50KGAgRGlyZWN0b3J5IG9mICR7dGFyZ2V0fWApOwogICAgICAgIHByaW50KCIiKTsKICAgICAgICBjb25zdCBub3c9bmV3IERhdGUoKTsKICAgICAgICBjb25zdCBkPW5vdy50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7bW9udGg6IjItZGlnaXQiLGRheToiMi1kaWdpdCIseWVhcjoibnVtZXJpYyJ9KTsKICAgICAgICBjb25zdCB0PW5vdy50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIix7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0Iixob3VyMTI6dHJ1ZX0pOwogICAgICAgIHByaW50KGAke2R9ICAke3R9ICAgIDxESVI+ICAgICAgICAgIC5gKTsKICAgICAgICBwcmludChgJHtkfSAgJHt0fSAgICA8RElSPiAgICAgICAgICAuLmApOwogICAgICAgIGVudHJpZXMuZm9yRWFjaCgoW25hbWUsdmFsXSk9PnByaW50KGZvcm1hdERpckVudHJ5KG5hbWUsdmFsKSkpOwogICAgICAgIGNvbnN0IGRpcnM9ZW50cmllcy5maWx0ZXIoKFssdl0pPT50eXBlb2Ygdj09PSJvYmplY3QiKS5sZW5ndGg7CiAgICAgICAgY29uc3QgZmlsZXM9ZW50cmllcy5maWx0ZXIoKFssdl0pPT50eXBlb2Ygdj09PSJzdHJpbmciKS5sZW5ndGg7CiAgICAgICAgcHJpbnQoIiIpOwogICAgICAgIHByaW50KGAgICAgICAgICAgICAgICAke2ZpbGVzfSBGaWxlKHMpYCk7CiAgICAgICAgcHJpbnQoYCAgICAgICAgICAgICAgICR7ZGlycysyfSBEaXIocykgICAxOCw0MzIsMDAwLDAwMCBieXRlcyBmcmVlYCk7CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJjZCI6CiAgICAgIGNhc2UiY2hkaXIiOnsKICAgICAgICBpZighYXJnc1swXSl7cHJpbnQoY3dkKTticmVhazt9CiAgICAgICAgaWYoYXJnc1swXT09PSJcXCIpe2N3ZD0iQzpcXCI7dXBkYXRlUHJvbXB0KCk7YnJlYWs7fQogICAgICAgIGNvbnN0IHRhcmdldD1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBjb25zdCBub2RlPWdldEVudHJ5KHRhcmdldCk7CiAgICAgICAgaWYobm9kZT09PW51bGx8fHR5cGVvZiBub2RlIT09Im9iamVjdCIpewogICAgICAgICAgcHJpbnQoYFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIHBhdGggc3BlY2lmaWVkLmAsIiNmNTUiKTsKICAgICAgICB9ZWxzZXtjd2Q9dGFyZ2V0O3VwZGF0ZVByb21wdCgpO30KICAgICAgICBicmVhazt9CgogICAgICBjYXNlIm1kIjoKICAgICAgY2FzZSJta2RpciI6ewogICAgICAgIGlmKCFhcmdzWzBdKXtwcmludCgiVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBpcyBpbmNvcnJlY3QuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBjb25zdCBucD1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBpZihnZXRFbnRyeShucCkhPT1udWxsKXtwcmludChgQSBzdWJkaXJlY3Rvcnkgb3IgZmlsZSAke2FyZ3NbMF19IGFscmVhZHkgZXhpc3RzLmAsIiNmNTUiKTticmVhazt9CiAgICAgICAgY29uc3QgaW5mbz1nZXRQYXJlbnRDb250ZW50KG5wKTsKICAgICAgICBpZighaW5mbyl7cHJpbnQoIlRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIHBhdGggc3BlY2lmaWVkLiIsIiNmNTUiKTticmVhazt9CiAgICAgICAgaW5mby5wYXJlbnRbaW5mby5uYW1lXT17fTsKICAgICAgICBmc1tucF09e307CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJyZCI6CiAgICAgIGNhc2Uicm1kaXIiOnsKICAgICAgICBpZighYXJnc1swXSl7cHJpbnQoIlRoZSBzeW50YXggb2YgdGhlIGNvbW1hbmQgaXMgaW5jb3JyZWN0LiIsIiNmNTUiKTticmVhazt9CiAgICAgICAgY29uc3QgbnA9cmVzb2x2ZVBhdGgoYXJnc1swXSk7CiAgICAgICAgY29uc3Qgbm9kZT1nZXRFbnRyeShucCk7CiAgICAgICAgaWYobm9kZT09PW51bGwpe3ByaW50KCJUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGlmKHR5cGVvZiBub2RlIT09Im9iamVjdCIpe3ByaW50KCJUaGUgZGlyZWN0b3J5IG5hbWUgaXMgaW52YWxpZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGNvbnN0IGluZm89Z2V0UGFyZW50Q29udGVudChucCk7CiAgICAgICAgaWYoaW5mbylkZWxldGUgaW5mby5wYXJlbnRbaW5mby5uYW1lXTsKICAgICAgICBkZWxldGUgZnNbbnBdOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UiZGVsIjoKICAgICAgY2FzZSJlcmFzZSI6ewogICAgICAgIGlmKCFhcmdzWzBdKXtwcmludCgiVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBpcyBpbmNvcnJlY3QuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBjb25zdCBucD1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBjb25zdCBub2RlPWdldEVudHJ5KG5wKTsKICAgICAgICBjb25zdCBpbmZvPWdldFBhcmVudENvbnRlbnQobnApOwogICAgICAgIGlmKG5vZGU9PT1udWxsfHwhaW5mbyl7cHJpbnQoIkNvdWxkIE5vdCBGaW5kICIrYXJnc1swXSwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBpZih0eXBlb2Ygbm9kZT09PSJvYmplY3QiKXtwcmludCgiQWNjZXNzIGlzIGRlbmllZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGRlbGV0ZSBpbmZvLnBhcmVudFtpbmZvLm5hbWVdOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UidHlwZSI6ewogICAgICAgIGlmKCFhcmdzWzBdKXtwcmludCgiVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBpcyBpbmNvcnJlY3QuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBjb25zdCBucD1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBjb25zdCBub2RlPWdldEVudHJ5KG5wKTsKICAgICAgICBjb25zdCBpbmZvPWdldFBhcmVudENvbnRlbnQobnApOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGU9Z2V0RW50cnkoY3dkKTsKICAgICAgICBjb25zdCBmaWxlQ29udGVudD0ocGFyZW50Tm9kZSYmdHlwZW9mIHBhcmVudE5vZGU9PT0ib2JqZWN0Iik/cGFyZW50Tm9kZVthcmdzWzBdXTp1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgY29udGVudD1ub2RlIT09bnVsbD9ub2RlOmZpbGVDb250ZW50Pz9udWxsOwogICAgICAgIGlmKGNvbnRlbnQ9PT1udWxsKXtwcmludChgVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuYCwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBpZih0eXBlb2YgY29udGVudD09PSJvYmplY3QiKXtwcmludCgiQWNjZXNzIGlzIGRlbmllZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIHByaW50KGNvbnRlbnQ9PT0iKGV4ZWN1dGFibGUpIj8iVGhpcyBpcyBhIGJpbmFyeSBmaWxlLiI6Y29udGVudHx8IiIpOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UiZWNobyI6ewogICAgICAgIGlmKCFhcmdTdHIpe3ByaW50KCJFQ0hPIGlzIG9uLiIpO2JyZWFrO30KICAgICAgICBwcmludChhcmdTdHIpOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UiY29weSI6ewogICAgICAgIGlmKGFyZ3MubGVuZ3RoPDIpe3ByaW50KCJUaGUgc3ludGF4IG9mIHRoZSBjb21tYW5kIGlzIGluY29ycmVjdC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGNvbnN0IHNyYz1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBjb25zdCBkc3Q9cmVzb2x2ZVBhdGgoYXJnc1sxXSk7CiAgICAgICAgY29uc3Qgc3JjTm9kZT1nZXRFbnRyeShzcmMpOwogICAgICAgIGNvbnN0IHNyY1BhcmVudD1nZXRQYXJlbnRDb250ZW50KHNyYyk7CiAgICAgICAgY29uc3QgZHN0UGFyZW50PWdldFBhcmVudENvbnRlbnQoZHN0KTsKICAgICAgICBpZihzcmNOb2RlPT09bnVsbHx8IXNyY1BhcmVudCl7cHJpbnQoIlRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiIsIiNmNTUiKTticmVhazt9CiAgICAgICAgaWYodHlwZW9mIHNyY05vZGU9PT0ib2JqZWN0Iil7cHJpbnQoIkFjY2VzcyBpcyBkZW5pZWQuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBpZighZHN0UGFyZW50KXtwcmludCgiVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgcGF0aCBzcGVjaWZpZWQuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBkc3RQYXJlbnQucGFyZW50W2RzdFBhcmVudC5uYW1lXT1zcmNOb2RlOwogICAgICAgIHByaW50KCIgICAgICAgIDEgZmlsZShzKSBjb3BpZWQuIik7CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJtb3ZlIjp7CiAgICAgICAgaWYoYXJncy5sZW5ndGg8Mil7cHJpbnQoIlRoZSBzeW50YXggb2YgdGhlIGNvbW1hbmQgaXMgaW5jb3JyZWN0LiIsIiNmNTUiKTticmVhazt9CiAgICAgICAgY29uc3Qgc3JjPXJlc29sdmVQYXRoKGFyZ3NbMF0pOwogICAgICAgIGNvbnN0IGRzdD1yZXNvbHZlUGF0aChhcmdzWzFdKTsKICAgICAgICBjb25zdCBzcmNOb2RlPWdldEVudHJ5KHNyYyk7CiAgICAgICAgY29uc3Qgc3JjSW5mbz1nZXRQYXJlbnRDb250ZW50KHNyYyk7CiAgICAgICAgY29uc3QgZHN0UGFyZW50PWdldFBhcmVudENvbnRlbnQoZHN0KTsKICAgICAgICBpZihzcmNOb2RlPT09bnVsbHx8IXNyY0luZm8pe3ByaW50KCJUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGlmKCFkc3RQYXJlbnQpe3ByaW50KCJUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBwYXRoIHNwZWNpZmllZC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGRzdFBhcmVudC5wYXJlbnRbZHN0UGFyZW50Lm5hbWVdPXNyY05vZGU7CiAgICAgICAgZGVsZXRlIHNyY0luZm8ucGFyZW50W3NyY0luZm8ubmFtZV07CiAgICAgICAgaWYodHlwZW9mIHNyY05vZGU9PT0ib2JqZWN0Iil7ZnNbZHN0XT1zcmNOb2RlO2RlbGV0ZSBmc1tzcmNdO30KICAgICAgICBwcmludCgiICAgICAgICAxIGZpbGUocykgbW92ZWQuIik7CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJyZW4iOgogICAgICBjYXNlInJlbmFtZSI6ewogICAgICAgIGlmKGFyZ3MubGVuZ3RoPDIpe3ByaW50KCJUaGUgc3ludGF4IG9mIHRoZSBjb21tYW5kIGlzIGluY29ycmVjdC4iLCIjZjU1Iik7YnJlYWs7fQogICAgICAgIGNvbnN0IHNyYz1yZXNvbHZlUGF0aChhcmdzWzBdKTsKICAgICAgICBjb25zdCBzcmNJbmZvPWdldFBhcmVudENvbnRlbnQoc3JjKTsKICAgICAgICBjb25zdCBzcmNOb2RlPWdldEVudHJ5KHNyYyk7CiAgICAgICAgaWYoIXNyY0luZm98fHNyY05vZGU9PT1udWxsKXtwcmludCgiVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIiwiI2Y1NSIpO2JyZWFrO30KICAgICAgICBzcmNJbmZvLnBhcmVudFthcmdzWzFdXT1zcmNOb2RlOwogICAgICAgIGRlbGV0ZSBzcmNJbmZvLnBhcmVudFtzcmNJbmZvLm5hbWVdOwogICAgICAgIGlmKHR5cGVvZiBzcmNOb2RlPT09Im9iamVjdCIpewogICAgICAgICAgY29uc3QgbmV3UGF0aD1zcmNJbmZvLnBhcmVudFBhdGgrIlxcIithcmdzWzFdOwogICAgICAgICAgZnNbbmV3UGF0aF09c3JjTm9kZTtkZWxldGUgZnNbc3JjXTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJydW4iOgogICAgICBjYXNlInN0YXJ0Ijp7CiAgICAgICAgY29uc3QgdGFyZ2V0PWFyZ3NbMF18fCIiOwogICAgICAgIGNvbnN0IGV4ZU5hbWU9dGFyZ2V0LnNwbGl0KCJcXCIpLnBvcCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgbWF0Y2g9T2JqZWN0LmtleXMoZXhlY3V0YWJsZXMpLmZpbmQoaz0+ay50b0xvd2VyQ2FzZSgpPT09ZXhlTmFtZXx8ay50b0xvd2VyQ2FzZSgpPT09dGFyZ2V0LnRvTG93ZXJDYXNlKCkpOwogICAgICAgIGlmKG1hdGNoKXtleGVjdXRhYmxlc1ttYXRjaF0oKTticmVhazt9CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZT1nZXRFbnRyeShjd2QpOwogICAgICAgIGlmKHBhcmVudE5vZGUmJnR5cGVvZiBwYXJlbnROb2RlPT09Im9iamVjdCImJnBhcmVudE5vZGVbdGFyZ2V0XSl7CiAgICAgICAgICBjb25zdCBleGVNYXRjaD1PYmplY3Qua2V5cyhleGVjdXRhYmxlcykuZmluZChrPT5rLnRvTG93ZXJDYXNlKCk9PT10YXJnZXQudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICBpZihleGVNYXRjaCl7ZXhlY3V0YWJsZXNbZXhlTWF0Y2hdKCk7YnJlYWs7fQogICAgICAgICAgcHJpbnQoYCcke3RhcmdldH0nIGlzIG5vdCByZWNvZ25pemVkIGFzIGFuIGV4ZWN1dGFibGUuYCwiI2Y1NSIpOwogICAgICAgIH1lbHNlewogICAgICAgICAgaWYoIXRhcmdldCl7cHJpbnQoIlRoZSBzeW50YXggb2YgdGhlIGNvbW1hbmQgaXMgaW5jb3JyZWN0LiIsIiNmNTUiKTticmVhazt9CiAgICAgICAgICBwcmludChgJyR7dGFyZ2V0fSc6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLmAsIiNmNTUiKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJ2ZXIiOgogICAgICAgIHByaW50KCIiKTsKICAgICAgICBwcmludCgiRGF0YSBPUyBUZXJtaW5hbCBbVmVyc2lvbiA4LjAuMC1maW5hbF0iKTsKICAgICAgICBwcmludCgiIik7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlImRhdGUiOgogICAgICAgIHByaW50KGBUaGUgY3VycmVudCBkYXRlIGlzOiAke25ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6InNob3J0Iixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iix5ZWFyOiJudW1lcmljIn0pfWApOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSJ0aW1lIjoKICAgICAgICBwcmludChgVGhlIGN1cnJlbnQgdGltZSBpczogJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLHtob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQiLHNlY29uZDoiMi1kaWdpdCIsaG91cjEyOmZhbHNlfSl9YCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIndob2FtaSI6CiAgICAgICAgcHJpbnQoYFNDSE9PTC1QQ1xcYW5vbnltb3VzYCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlImhvc3RuYW1lIjoKICAgICAgICBwcmludCgiU0NIT09MLVBDIik7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlInN5c3RlbWluZm8iOgogICAgICAgIHByaW50KCJIb3N0IE5hbWU6ICAgICAgICAgICAgICAgICBTQ0hPT0wtUEMiKTsKICAgICAgICBwcmludCgiT1MgTmFtZTogICAgICAgICAgICAgICAgICAgRGF0YSBPUyIpOwogICAgICAgIHByaW50KCJPUyBWZXJzaW9uOiAgICAgICAgICAgICAgICA4LjAuMC1maW5hbCBCdWlsZCAxOTA0NSIpOwogICAgICAgIHByaW50KCJTeXN0ZW0gTWFudWZhY3R1cmVyOiAgICAgICBHb29nbGUiKTsKICAgICAgICBwcmludCgiU3lzdGVtIE1vZGVsOiAgICAgICAgICAgICAgQ2hyb21lYm9vayIpOwogICAgICAgIHByaW50KCJTeXN0ZW0gVHlwZTogICAgICAgICAgICAgICB4NjQtYmFzZWQgUEMiKTsKICAgICAgICBwcmludCgiUHJvY2Vzc29yKHMpOiAgICAgICAgICAgICAgSW50ZWwoUikgQ2VsZXJvbihSKSBONDAyMCBAIDEuMTBHSHoiKTsKICAgICAgICBwcmludCgiVG90YWwgUGh5c2ljYWwgTWVtb3J5OiAgICAgNCwwOTYgTUIiKTsKICAgICAgICBwcmludCgiQXZhaWxhYmxlIFBoeXNpY2FsIE1lbW9yeTogMSw4NDIgTUIiKTsKICAgICAgICBwcmludCgiVmlydHVhbCBNZW1vcnk6IE1heCBTaXplOiAgNSwxMjAgTUIiKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UidGFza2xpc3QiOnsKICAgICAgICBwcmludCgiSW1hZ2UgTmFtZSAgICAgICAgICAgICAgICAgICAgIFBJRCBTZXNzaW9uIE5hbWUgICAgICAgIFNlc3Npb24jICAgIE1lbSBVc2FnZSIpOwogICAgICAgIHByaW50KCI9PT09PT09PT09PT09PT09PT09PT09PT09ID09PT09PT09ID09PT09PT09PT09PT09PT0gPT09PT09PT09PT0gPT09PT09PT09PT09Iik7CiAgICAgICAgW1siU3lzdGVtIElkbGUgUHJvY2VzcyIsIjAiLCJTZXJ2aWNlcyIsIjAiLCIyNCBLIl0sCiAgICAgICAgIFsiU3lzdGVtIiwiNCIsIlNlcnZpY2VzIiwiMCIsIjIsMDQ4IEsiXSwKICAgICAgICAgWyJzdmNob3N0LmV4ZSIsIjgxMiIsIlNlcnZpY2VzIiwiMCIsIjE4LDQzMiBLIl0sCiAgICAgICAgIFsiZXhwbG9yZXIuZXhlIiwiMjA0OCIsIkNvbnNvbGUiLCIxIiwiNTQsMzIwIEsiXSwKICAgICAgICAgWyJjaHJvbWUuZXhlIiwiMzEyMCIsIkNvbnNvbGUiLCIxIiwiMjEwLDg0MCBLIl0sCiAgICAgICAgIFsiYXVkaW9kZy5leGUiLCIzMjAwIiwiU2VydmljZXMiLCIwIiwiMTQsMjI4IEsiXSwKICAgICAgICAgWyJjbWQuZXhlIiwiNDIwMCIsIkNvbnNvbGUiLCIxIiwiMywxMjAgSyJdXQogICAgICAgIC5mb3JFYWNoKChbbixwLHMsc24sbV0pPT57CiAgICAgICAgICBwcmludChgJHtuLnBhZEVuZCgyNSl9ICR7cC5wYWRTdGFydCg4KX0gJHtzLnBhZEVuZCgxNil9ICR7c24ucGFkU3RhcnQoMTEpfSAke20ucGFkU3RhcnQoMTIpfWApOwogICAgICAgIH0pOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UiaXBjb25maWciOnsKICAgICAgICBwcmludCgiV2luZG93cyBJUCBDb25maWd1cmF0aW9uIik7cHJpbnQoIiIpOwogICAgICAgIHByaW50KCJFdGhlcm5ldCBhZGFwdGVyIEV0aGVybmV0OiIpO3ByaW50KCIiKTsKICAgICAgICBwcmludCgiICAgQ29ubmVjdGlvbi1zcGVjaWZpYyBETlMgU3VmZml4ICAuIDogc2Nob29sLmxvY2FsIik7CiAgICAgICAgcHJpbnQoIiAgIElQdjQgQWRkcmVzcy4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IDE5Mi4xNjguMS4iK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoyMDArNTApKTsKICAgICAgICBwcmludCgiICAgU3VibmV0IE1hc2sgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogMjU1LjI1NS4yNTUuMCIpOwogICAgICAgIHByaW50KCIgICBEZWZhdWx0IEdhdGV3YXkgLiAuIC4gLiAuIC4gLiAuIC4gOiAxOTIuMTY4LjEuMSIpOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2UicGluZyI6ewogICAgICAgIGNvbnN0IGg9YXJnc1swXXx8ImxvY2FsaG9zdCI7CiAgICAgICAgcHJpbnQoYFxuUGluZ2luZyAke2h9IHdpdGggMzIgYnl0ZXMgb2YgZGF0YTpgKTsKICAgICAgICBjb25zdCB0aW1lcz1bMTIsMTQsMTEsMTNdOwogICAgICAgIGxldCBpPTA7CiAgICAgICAgY29uc3QgaXY9c2V0SW50ZXJ2YWwoKCk9PnsKICAgICAgICAgIGlmKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG91dCkpe2NsZWFySW50ZXJ2YWwoaXYpO3JldHVybjt9CiAgICAgICAgICBwcmludChgUmVwbHkgZnJvbSAke2h9OiBieXRlcz0zMiB0aW1lPSR7dGltZXNbaV19bXMgVFRMPTEyOGApOwogICAgICAgICAgaSsrO2lmKGk+PTQpewogICAgICAgICAgICBjbGVhckludGVydmFsKGl2KTsKICAgICAgICAgICAgcHJpbnQoYFxuUGluZyBzdGF0aXN0aWNzIGZvciAke2h9OmApOwogICAgICAgICAgICBwcmludChgICAgIFBhY2tldHM6IFNlbnQgPSA0LCBSZWNlaXZlZCA9IDQsIExvc3QgPSAwICgwJSBsb3NzKSxgKTsKICAgICAgICAgICAgcHJpbnQoYEFwcHJveGltYXRlIHJvdW5kIHRyaXAgdGltZXMgaW4gbWlsbGktc2Vjb25kczpgKTsKICAgICAgICAgICAgcHJpbnQoYCAgICBNaW5pbXVtID0gMTFtcywgTWF4aW11bSA9IDE0bXMsIEF2ZXJhZ2UgPSAxMm1zYCk7CiAgICAgICAgICB9CiAgICAgICAgfSw1MDApOwogICAgICAgIGJyZWFrO30KCiAgICAgIGNhc2Uic2V0Ijp7CiAgICAgICAgaWYoIWFyZ3NbMF0pewogICAgICAgICAgWyJDT01QVVRFUk5BTUU9U0NIT09MLVBDIiwiT1M9V2luZG93c19OVCIsIlBBVEg9QzpcXFdpbmRvd3NcXFN5c3RlbTMyO0M6XFxXaW5kb3dzIiwKICAgICAgICAgICAiUEFUSEVYVD0uQ09NOy5FWEU7LkJBVDsuQ01EIiwiUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRT1BTUQ2NCIsCiAgICAgICAgICAgIlN5c3RlbURyaXZlPUM6IiwiU3lzdGVtUm9vdD1DOlxcV2luZG93cyIsIlRFTVA9QzpcXFRlbXAiLCJUTVA9QzpcXFRlbXAiLAogICAgICAgICAgICJVU0VSRE9NQUlOPVNDSE9PTC1QQyIsIlVTRVJOQU1FPWFub255bW91cyIsIlVTRVJQUk9GSUxFPUM6XFxVc2Vyc1xcYW5vbnltb3VzIiwKICAgICAgICAgICAiV0lORElSPUM6XFxXaW5kb3dzIl0uZm9yRWFjaChsPT5wcmludChsKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByaW50KGFyZ3NbMF0rIj0iK2FyZ3Muc2xpY2UoMSkuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJwYXRoIjoKICAgICAgICBwcmludCgiUEFUSD1DOlxcV2luZG93c1xcU3lzdGVtMzI7QzpcXFdpbmRvd3M7QzpcXFByb2dyYW0gRmlsZXNcXEdvb2dsZVxcQ2hyb21lIik7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlImhlbHAiOnsKICAgICAgICBjb25zdCBoZWxwRG9jcz17CiAgICAgICAgICAiY2xzIjogICAgICAiQ0xTXG5cbkNsZWFycyB0aGUgdGVybWluYWwgc2NyZWVuLlxuXG5Vc2FnZTogY2xzIiwKICAgICAgICAgICJkaXIiOiAgICAgICJESVIgW3BhdGhdXG5cbkxpc3RzIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeS5cblxuVXNhZ2U6IGRpclxuICAgICAgIGRpciBEb2N1bWVudHMiLAogICAgICAgICAgImNkIjogICAgICAgIkNEIFtwYXRoXVxuXG5DaGFuZ2VzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cblxuVXNhZ2U6IGNkIERvY3VtZW50c1xuICAgICAgIGNkIC4uXG4gICAgICAgY2QgQzpcXFVzZXJzXFxhbm9ueW1vdXMiLAogICAgICAgICAgIm1kIjogICAgICAgIk1EIFtuYW1lXVxuXG5DcmVhdGVzIGEgbmV3IGRpcmVjdG9yeS5cblxuVXNhZ2U6IG1kIG15Zm9sZGVyIiwKICAgICAgICAgICJyZCI6ICAgICAgICJSRCBbbmFtZV1cblxuUmVtb3ZlcyBhbiBlbXB0eSBkaXJlY3RvcnkuXG5cblVzYWdlOiByZCBteWZvbGRlciIsCiAgICAgICAgICAiZGVsIjogICAgICAiREVMIFtmaWxlXVxuXG5EZWxldGVzIGEgZmlsZS5cblxuVXNhZ2U6IGRlbCBub3Rlcy50eHQiLAogICAgICAgICAgInR5cGUiOiAgICAgIlRZUEUgW2ZpbGVdXG5cbkRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBhIHRleHQgZmlsZS5cblxuVXNhZ2U6IHR5cGUgbm90ZXMudHh0IiwKICAgICAgICAgICJjb3B5IjogICAgICJDT1BZIFtzb3VyY2VdIFtkZXN0aW5hdGlvbl1cblxuQ29waWVzIGEgZmlsZS5cblxuVXNhZ2U6IGNvcHkgbm90ZXMudHh0IGJhY2t1cC50eHQiLAogICAgICAgICAgIm1vdmUiOiAgICAgIk1PVkUgW3NvdXJjZV0gW2Rlc3RpbmF0aW9uXVxuXG5Nb3ZlcyBhIGZpbGUuXG5cblVzYWdlOiBtb3ZlIG5vdGVzLnR4dCBEb2N1bWVudHNcXG5vdGVzLnR4dCIsCiAgICAgICAgICAicmVuIjogICAgICAiUkVOIFtvbGRuYW1lXSBbbmV3bmFtZV1cblxuUmVuYW1lcyBhIGZpbGUuXG5cblVzYWdlOiByZW4gbm90ZXMudHh0IG15bm90ZXMudHh0IiwKICAgICAgICAgICJlY2hvIjogICAgICJFQ0hPIFt0ZXh0XVxuXG5QcmludHMgdGV4dCB0byB0aGUgc2NyZWVuLlxuXG5Vc2FnZTogZWNobyBIZWxsbyBXb3JsZCIsCiAgICAgICAgICAicnVuIjogICAgICAiUlVOIFtwcm9ncmFtXVxuXG5SdW5zIGFuIGV4ZWN1dGFibGUuXG5cblVzYWdlOiBydW4gY2FsYy5leGUiLAogICAgICAgICAgInZlciI6ICAgICAgIlZFUlxuXG5EaXNwbGF5cyB0aGUgdGVybWluYWwgdmVyc2lvbi4iLAogICAgICAgICAgImRhdGUiOiAgICAgIkRBVEVcblxuRGlzcGxheXMgdGhlIGN1cnJlbnQgZGF0ZS4iLAogICAgICAgICAgInRpbWUiOiAgICAgIlRJTUVcblxuRGlzcGxheXMgdGhlIGN1cnJlbnQgdGltZS4iLAogICAgICAgICAgIndob2FtaSI6ICAgIldIT0FNSVxuXG5EaXNwbGF5cyB0aGUgY3VycmVudCB1c2VyLiIsCiAgICAgICAgICAiaG9zdG5hbWUiOiAiSE9TVE5BTUVcblxuRGlzcGxheXMgdGhlIGNvbXB1dGVyIG5hbWUuIiwKICAgICAgICAgICJzeXN0ZW1pbmZvIjoiU1lTVEVNSU5GT1xuXG5EaXNwbGF5cyBzeXN0ZW0gaW5mb3JtYXRpb24uIiwKICAgICAgICAgICJ0YXNrbGlzdCI6ICJUQVNLTElTVFxuXG5MaXN0cyBydW5uaW5nIHByb2Nlc3Nlcy4iLAogICAgICAgICAgImlwY29uZmlnIjogIklQQ09ORklHXG5cbkRpc3BsYXlzIG5ldHdvcmsgY29uZmlndXJhdGlvbi4iLAogICAgICAgICAgInBpbmciOiAgICAgIlBJTkcgW2hvc3RdXG5cblBpbmdzIGEgaG9zdC5cblxuVXNhZ2U6IHBpbmcgZ29vZ2xlLmNvbSIsCiAgICAgICAgICAic2V0IjogICAgICAiU0VUXG5cbkRpc3BsYXlzIGVudmlyb25tZW50IHZhcmlhYmxlcy4iLAogICAgICAgICAgImhlbHAiOiAgICAgIkhFTFAgW2NvbW1hbmRdXG5cbkRpc3BsYXlzIGhlbHAuXG5cblVzYWdlOiBoZWxwIGRpciIsCiAgICAgICAgICAiZXotbW9kZSI6ICAiRVotTU9ERVxuXG5PcGVucyBFWi1Nb2RlLiIsCiAgICAgICAgfTsKICAgICAgICBpZihhcmdzWzBdKXsKICAgICAgICAgIGNvbnN0IGtleT1hcmdzWzBdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXC5leGUkLywiIik7CiAgICAgICAgICBpZihoZWxwRG9jc1trZXldKXtwcmludChoZWxwRG9jc1trZXldKTt9CiAgICAgICAgICBlbHNle3ByaW50KGBUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgaGVscCB1dGlsaXR5LmAsIiNmNTUiKTt9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByaW50KCJGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGNvbW1hbmQsIHR5cGUgSEVMUCBjb21tYW5kLW5hbWUiKTsKICAgICAgICAgIHByaW50KCIiKTsKICAgICAgICAgIGNvbnN0IGNvbHM9WyJDTFMiLCJDRCAvIENIRElSIiwiQ09QWSIsIkRBVEUiLCJERUwgLyBFUkFTRSIsIkRJUiIsCiAgICAgICAgICAgICAgICAgICAgICAiRUNITyIsIkhFTFAiLCJIT1NUTkFNRSIsIklQQ09ORklHIiwiTUQgLyBNS0RJUiIsIkVaLU1PREUiLAogICAgICAgICAgICAgICAgICAgICAgIk1PVkUiLCJQQVRIIiwiUElORyIsIlJEIC8gUk1ESVIiLCJSRU4gLyBSRU5BTUUiLCJSVU4gLyBTVEFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAiU0VUIiwiU1lTVEVNSU5GTyIsIlRBU0tMSVNUIiwiVElNRSIsIlRZUEUiLCJWRVIiLCJXSE9BTUkiXTsKICAgICAgICAgIGNvbHMuZm9yRWFjaChjPT5wcmludCgiICAiK2MpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7fQoKICAgICAgY2FzZSJlei1tb2RlIjoKICAgICAgY2FzZSJlem1vZGUiOgogICAgICBjYXNlImV6IG1vZGUiOgogICAgICAgIHNob3dNZW51KCk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IGV4ZU1hdGNoPU9iamVjdC5rZXlzKGV4ZWN1dGFibGVzKS5maW5kKGs9PmsudG9Mb3dlckNhc2UoKT09PWNtZHx8ay50b0xvd2VyQ2FzZSgpPT09Y21kKyIuZXhlIik7CiAgICAgICAgICBpZihleGVNYXRjaCl7ZXhlY3V0YWJsZXNbZXhlTWF0Y2hdKCk7YnJlYWs7fQogICAgICAgICAgY29uc3QgZ2FtZU5hbWVzPVsicG9uZyIsInRldHJpcyIsIm1pbmVzd2VlcGVyIiwic25ha2UiLCJicmVha291dCIsIjIwNDgiLCJkb29tIiwid29sZjNkIl07CiAgICAgICAgICBpZihnYW1lTmFtZXMuaW5jbHVkZXMoY21kKSl7CiAgICAgICAgICAgIHByaW50KGAnJHt0b2tlbnNbMF19JyBpcyBub3QgaW4geW91ciBQQVRILmAsIiNmNTUiKTsKICAgICAgICAgICAgcHJpbnQoYEhpbnQ6IGNkIEM6XFxVc2Vyc1xcYW5vbnltb3VzXFxHYW1lcyAgdGhlbiB0eXBlICR7Y21kfWApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHR4dE5hbWU9Y21kLmVuZHNXaXRoKCIudHh0Iil8fGNtZC5lbmRzV2l0aCgiLmh0bWwiKXx8Y21kLmVuZHNXaXRoKCIuaHRtIik/Y21kOm51bGw7CiAgICAgICAgICBpZih0eHROYW1lKXsKICAgICAgICAgICAgY29uc3QgZmlsZVBhdGg9cmVzb2x2ZVBhdGgodHh0TmFtZSk7CiAgICAgICAgICAgIGNvbnN0IGZpbGVOb2RlPWdldEVudHJ5KGZpbGVQYXRoKTsKICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZT1nZXRFbnRyeShjd2QpOwogICAgICAgICAgICBjb25zdCBjb250ZW50PWZpbGVOb2RlIT09bnVsbD9maWxlTm9kZToocGFyZW50Tm9kZSYmdHlwZW9mIHBhcmVudE5vZGU9PT0ib2JqZWN0Ij9wYXJlbnROb2RlW3R4dE5hbWVdOm51bGwpOwogICAgICAgICAgICBpZihjb250ZW50IT09bnVsbCYmdHlwZW9mIGNvbnRlbnQ9PT0ic3RyaW5nIil7bGF1bmNoTm90ZXBhZCh0eHROYW1lLGNvbnRlbnQpO2JyZWFrO30KICAgICAgICAgIH0KICAgICAgICAgIHByaW50KGAnJHt0b2tlbnNbMF19JyBpcyBub3QgcmVjb2duaXplZCBhcyBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBjb21tYW5kLGApOwogICAgICAgICAgcHJpbnQoYG9wZXJhYmxlIHByb2dyYW0gb3IgYmF0Y2ggZmlsZS5gLCIjZjU1Iik7CiAgICAgICAgfQogICAgfQoKICAgIHByaW50KCIiKTsKICB9CgogIHByaW50KGBEQVRBIE9TIDguMC4wLWZpbmFsYCk7CiAgcHJpbnQoYFR5cGUgJ2hlbHAnIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLmApOwogIHByaW50KGBUeXBlICdlei1tb2RlJyB0byBvcGVuIEVaLU1vZGUuYCk7CiAgcHJpbnQoYGApOwogIHVwZGF0ZVByb21wdCgpOwogIGlucC5mb2N1cygpOwoKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbiB0ZXJtS2V5KGUpewogICAgaWYoZS5rZXk9PT0iQXJyb3dVcCIpe2UucHJldmVudERlZmF1bHQoKTtpZihoaXN0SWR4PGhpc3RvcnkubGVuZ3RoLTEpe2hpc3RJZHgrKztpbnAudmFsdWU9aGlzdG9yeVtoaXN0SWR4XXx8IiI7fX0KICAgIGVsc2UgaWYoZS5rZXk9PT0iQXJyb3dEb3duIil7ZS5wcmV2ZW50RGVmYXVsdCgpO2hpc3RJZHg9TWF0aC5tYXgoLTEsaGlzdElkeC0xKTtpbnAudmFsdWU9aGlzdElkeD49MD9oaXN0b3J5W2hpc3RJZHhdOiIiO30KICB9KTsKCiAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGU9PnsKICAgIGlmKGUua2V5PT09IkVudGVyIil7cnVuQ21kKGlucC52YWx1ZSk7aW5wLnZhbHVlPSIiO30KICB9KTsKCiAgd2luZG93Ll9sYXVuY2hQb25nPWxhdW5jaFBvbmc7CiAgd2luZG93Ll9sYXVuY2hUZXRyaXM9bGF1bmNoVGV0cmlzOwogIHdpbmRvdy5fbGF1bmNoTWluZXN3ZWVwZXI9bGF1bmNoTWluZXN3ZWVwZXI7CiAgd2luZG93Ll9sYXVuY2hTbmFrZT1sYXVuY2hTbmFrZTsKICB3aW5kb3cuX2xhdW5jaEJyZWFrb3V0PWxhdW5jaEJyZWFrb3V0OwogIHdpbmRvdy5fbGF1bmNoMjA0OD1sYXVuY2gyMDQ4OwogIHdpbmRvdy5fbGF1bmNoTm90ZXBhZD1sYXVuY2hOb3RlcGFkOwogIHdpbmRvdy5fbGF1bmNoQ2FsY3VsYXRvcj1sYXVuY2hDYWxjdWxhdG9yOwogIHdpbmRvdy5fbGF1bmNoRXhwbG9yZXI9bGF1bmNoRXhwbG9yZXI7Cn0KCgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgSU5TUEVDVCBNRU5VIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwpmdW5jdGlvbiBzaG93SW5zcGVjdCgpewogIGNsZWFyQm9keSgpOwogIGNvbnN0IHBhZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cGFnZS5jbGFzc05hbWU9Imluc3BlY3QtcGFnZSI7CgogIGNvbnN0IHRhYkJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0YWJCYXIuY2xhc3NOYW1lPSJpbnNwZWN0LXRhYnMiOwoKICBjb25zdCBUQUJTPVsiRWxlbWVudHMiLCJDb25zb2xlIiwiTmV0d29yayIsIlBlcmZvcm1hbmNlIiwiU3RvcmFnZSIsIkluZm8iXTsKICBjb25zdCBwYW5lbHM9e307CiAgY29uc3QgdGFiRWxzPXt9OwoKICBUQUJTLmZvckVhY2gobmFtZT0+ewogICAgY29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0iaW5zcGVjdC10YWIiO3QudGV4dENvbnRlbnQ9bmFtZTsKICAgIGNvbnN0IHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cC5jbGFzc05hbWU9Imluc3BlY3QtcGFuZWwiOwogICAgdGFiRWxzW25hbWVdPXQ7cGFuZWxzW25hbWVdPXA7CiAgICB0YWJCYXIuYXBwZW5kQ2hpbGQodCk7CiAgICB0Lm9uY2xpY2s9KCk9PnN3aXRjaFRhYihuYW1lKTsKICB9KTsKCiAgY29uc3QgbWVudVRhYkJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBtZW51VGFiQnRuLmNsYXNzTmFtZT0iaW5zcGVjdC10YWIiOwogIG1lbnVUYWJCdG4udGV4dENvbnRlbnQ9IuKshSBFWi1Nb2RlIjsKICBtZW51VGFiQnRuLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iOwogIG1lbnVUYWJCdG4uc3R5bGUuY29sb3I9IiMwZjAiOwogIG1lbnVUYWJCdG4ub25jbGljaz1zaG93TWVudTsKICB0YWJCYXIuYXBwZW5kQ2hpbGQobWVudVRhYkJ0bik7CgogIGZ1bmN0aW9uIHN3aXRjaFRhYihuYW1lKXsKICAgIE9iamVjdC52YWx1ZXModGFiRWxzKS5mb3JFYWNoKHQ9PnQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpOwogICAgT2JqZWN0LnZhbHVlcyhwYW5lbHMpLmZvckVhY2gocD0+cC5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSk7CiAgICB0YWJFbHNbbmFtZV0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7CiAgICBwYW5lbHNbbmFtZV0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7CiAgfQoKICBjb25zdCBib2R5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JvZHkuY2xhc3NOYW1lPSJpbnNwZWN0LWJvZHkiOwogIFRBQlMuZm9yRWFjaChuPT5ib2R5LmFwcGVuZENoaWxkKHBhbmVsc1tuXSkpOwogIHBhZ2UuYXBwZW5kQ2hpbGQodGFiQmFyKTtwYWdlLmFwcGVuZENoaWxkKGJvZHkpOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFnZSk7CiAgYWRkQ29weXJpZ2h0KCk7CgogIGZ1bmN0aW9uIGJ1aWxkRWxlbWVudHMoKXsKICAgIGNvbnN0IHA9cGFuZWxzWyJFbGVtZW50cyJdOwogICAgcC5pbm5lckhUTUw9IiI7CiAgICBjb25zdCB0cmVlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyZWUuY2xhc3NOYW1lPSJpbnNwZWN0LWVsLXRyZWUiOwoKICAgIGNvbnN0IGZha2VET009WwogICAgICB7aW5kZW50OjAsaHRtbDonPHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGFnIj4mbHQ7aHRtbCZndDs8L3NwYW4+J30sCiAgICAgIHtpbmRlbnQ6MSxodG1sOic8c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10YWciPiZsdDtoZWFkJmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDoyLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0O21ldGE8L3NwYW4+IDxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLWF0dHIiPmNoYXJzZXQ9PHNwYW4gc3R5bGU9ImNvbG9yOiMwZjAiPiJ1dGYtOCI8L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDoyLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0O3RpdGxlJmd0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10ZXh0Ij5EYXRhIE9TPC9zcGFuPjxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0Oy90aXRsZSZndDs8L3NwYW4+J30sCiAgICAgIHtpbmRlbnQ6MixodG1sOic8c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10YWciPiZsdDtzdHlsZSZndDs8L3NwYW4+PHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGV4dCI+IC4uLiA8L3NwYW4+PHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGFnIj4mbHQ7L3N0eWxlJmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDoxLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0Oy9oZWFkJmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDoxLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0O2JvZHkmZ3Q7PC9zcGFuPid9LAogICAgICB7aW5kZW50OjIsaHRtbDonPHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGFnIj4mbHQ7ZGl2PC9zcGFuPiA8c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC1hdHRyIj5jbGFzcz08c3BhbiBzdHlsZT0iY29sb3I6IzBmMCI+Imluc3BlY3QtcGFnZSI8L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDozLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0O2Rpdjwvc3Bhbj4gPHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtYXR0ciI+Y2xhc3M9PHNwYW4gc3R5bGU9ImNvbG9yOiMwZjAiPiJpbnNwZWN0LXRhYnMiPC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10YWciPiZndDs8L3NwYW4+J30sCiAgICAgIHtpbmRlbnQ6NCxodG1sOic8c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10YWciPiZsdDtkaXY8L3NwYW4+IDxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLWF0dHIiPmNsYXNzPTxzcGFuIHN0eWxlPSJjb2xvcjojMGYwIj4iaW5zcGVjdC10YWIgYWN0aXZlIjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGFnIj4mZ3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRleHQiPkVsZW1lbnRzPC9zcGFuPjxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0Oy9kaXYmZ3Q7PC9zcGFuPid9LAogICAgICB7aW5kZW50OjMsaHRtbDonPHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtdGFnIj4mbHQ7L2RpdiZndDs8L3NwYW4+J30sCiAgICAgIHtpbmRlbnQ6MixodG1sOic8c3BhbiBjbGFzcz0iaW5zcGVjdC1lbC10YWciPiZsdDsvZGl2Jmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDoxLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0Oy9ib2R5Jmd0Ozwvc3Bhbj4nfSwKICAgICAge2luZGVudDowLGh0bWw6JzxzcGFuIGNsYXNzPSJpbnNwZWN0LWVsLXRhZyI+Jmx0Oy9odG1sJmd0Ozwvc3Bhbj4nfSwKICAgIF07CgogICAgZmFrZURPTS5mb3JFYWNoKCh7aW5kZW50LGh0bWx9KT0+ewogICAgICBjb25zdCByb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGxldCBzPSIiO2ZvcihsZXQgaT0wO2k8aW5kZW50O2krKylzKz0nPHNwYW4gY2xhc3M9Imluc3BlY3QtZWwtaW5kZW50Ij48L3NwYW4+JzsKICAgICAgcm93LmlubmVySFRNTD1zK2h0bWw7CiAgICAgIHJvdy5zdHlsZS5wYWRkaW5nTGVmdD0oaW5kZW50KjQpKyJweCI7CiAgICAgIHRyZWUuYXBwZW5kQ2hpbGQocm93KTsKICAgIH0pOwoKICAgIGNvbnN0IHN0eWxlcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHN0eWxlcy5zdHlsZS5jc3NUZXh0PSJib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4yKTttYXJnaW4tdG9wOjEwcHg7cGFkZGluZy10b3A6OHB4O2NvbG9yOiMwYTA7Zm9udC1zaXplOjEycHg7IjsKICAgIHN0eWxlcy5pbm5lckhUTUw9YDxkaXYgc3R5bGU9ImNvbG9yOiMwZjA7bWFyZ2luLWJvdHRvbTo0cHg7Ij5Db21wdXRlZCBTdHlsZXMg4oCUIC5pbnNwZWN0LXBhZ2U8L2Rpdj4KPGRpdj5wb3NpdGlvbjogZml4ZWQ8L2Rpdj48ZGl2Pmluc2V0OiAwPC9kaXY+PGRpdj5iYWNrZ3JvdW5kOiAjMGEwYTBhPC9kaXY+CjxkaXY+ei1pbmRleDogNTwvZGl2PjxkaXY+ZGlzcGxheTogZmxleDwvZGl2PjxkaXY+ZmxleC1kaXJlY3Rpb246IGNvbHVtbjwvZGl2PmA7CiAgICBwLmFwcGVuZENoaWxkKHRyZWUpO3AuYXBwZW5kQ2hpbGQoc3R5bGVzKTsKICB9CgogIGNvbnN0IGNvbnNvbGVMb2dzPVtdOwogIGZ1bmN0aW9uIGJ1aWxkQ29uc29sZSgpewogICAgY29uc3QgcD1wYW5lbHNbIkNvbnNvbGUiXTtwLmlubmVySFRNTD0iIjsKCiAgICBjb25zdCBvdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7b3V0LmNsYXNzTmFtZT0iaW5zcGVjdC1jb25zb2xlLW91dCI7CgogICAgZnVuY3Rpb24gYWRkTG9nKGxldmVsLG1zZyl7CiAgICAgIGNvbnNvbGVMb2dzLnB1c2goe2xldmVsLG1zZyx0aW1lOm5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9KTsKICAgICAgY29uc3Qgcm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Jvdy5jbGFzc05hbWU9YGluc3BlY3QtY29uc29sZS1yb3cgJHtsZXZlbH1gOwogICAgICBjb25zdCBsdmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bHZsLmNsYXNzTmFtZT0iaW5zcGVjdC1jb25zb2xlLWxldmVsIjtsdmwudGV4dENvbnRlbnQ9bGV2ZWwudG9VcHBlckNhc2UoKTsKICAgICAgY29uc3QgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTttLmNsYXNzTmFtZT0iaW5zcGVjdC1jb25zb2xlLW1zZyI7bS50ZXh0Q29udGVudD1tc2c7CiAgICAgIHJvdy5hcHBlbmRDaGlsZChsdmwpO3Jvdy5hcHBlbmRDaGlsZChtKTsKICAgICAgb3V0LmFwcGVuZENoaWxkKHJvdyk7b3V0LnNjcm9sbFRvcD1vdXQuc2Nyb2xsSGVpZ2h0OwogICAgfQoKICAgIGNvbnN0IHNlZWQ9WwogICAgICBbImxvZyIsIkRhdGEgT1MgaW5pdGlhbGl6ZWQiXSxbImluZm8iLCJET00gY29udGVudCBsb2FkZWQgaW4gMTJtcyJdLAogICAgICBbImxvZyIsInNob3dNZW51KCkgY2FsbGVkIl0sWyJ3YXJuIiwibG9jYWxTdG9yYWdlIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0Il0sCiAgICAgIFsibG9nIiwiQ2FudmFzIGNvbnRleHQgYWNxdWlyZWQiXSxbImluZm8iLCJXb3JrZXIgcG9vbCByZWFkeTogIituYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSsiIHRocmVhZHMiXSwKICAgICAgWyJsb2ciLCJFdmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQiXSxbImluZm8iLCJWaWV3cG9ydDogIit3aW5kb3cuaW5uZXJXaWR0aCsieCIrd2luZG93LmlubmVySGVpZ2h0XSwKICAgIF07CiAgICBzZWVkLmZvckVhY2goKFtsLG1dKT0+YWRkTG9nKGwsbSkpOwoKICAgIGNvbnN0IGlucHV0Um93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lucHV0Um93LmNsYXNzTmFtZT0iaW5zcGVjdC1jb25zb2xlLWlucHV0LXJvdyI7CiAgICBjb25zdCBjaGV2cm9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtjaGV2cm9uLnRleHRDb250ZW50PSLigLoiO2NoZXZyb24uc3R5bGUuY3NzVGV4dD0iY29sb3I6IzBmMDtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxO3BhZGRpbmc6MCA2cHg7IjsKICAgIGNvbnN0IGNpbnB1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2NpbnB1dC5jbGFzc05hbWU9Imluc3BlY3QtY29uc29sZS1pbnB1dCI7Y2lucHV0LnBsYWNlaG9sZGVyPSJFbnRlciBKUyBleHByZXNzaW9uLi4uIjsKCiAgICBjaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZT0+ewogICAgICBpZihlLmtleSE9PSJFbnRlciIpcmV0dXJuOwogICAgICBjb25zdCBleHByPWNpbnB1dC52YWx1ZS50cmltKCk7aWYoIWV4cHIpcmV0dXJuOwogICAgICBhZGRMb2coImxvZyIsIuKAuiAiK2V4cHIpOwogICAgICB0cnl7CiAgICAgICAgY29uc3QgcmVzdWx0PWV2YWwoZXhwcik7CiAgICAgICAgYWRkTG9nKCJsb2ciLFN0cmluZyhyZXN1bHQpPT09dW5kZWZpbmVkPyJ1bmRlZmluZWQiOkpTT04uc3RyaW5naWZ5KHJlc3VsdCk/P1N0cmluZyhyZXN1bHQpKTsKICAgICAgfWNhdGNoKGVycil7YWRkTG9nKCJlcnJvciIsZXJyLm1lc3NhZ2UpO30KICAgICAgY2lucHV0LnZhbHVlPSIiOwogICAgfSk7CgogICAgaW5wdXRSb3cuYXBwZW5kQ2hpbGQoY2hldnJvbik7aW5wdXRSb3cuYXBwZW5kQ2hpbGQoY2lucHV0KTsKICAgIHAuYXBwZW5kQ2hpbGQob3V0KTtwLmFwcGVuZENoaWxkKGlucHV0Um93KTsKCiAgICBjb25zdCBsaXZlTWVzc2FnZXM9WwogICAgICBbImxvZyIsIlJlcGFpbnQgdHJpZ2dlcmVkIl0sWyJpbmZvIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIGNhbGxiYWNrIl0sCiAgICAgIFsibG9nIiwiR0MgbWlub3IgY29sbGVjdGlvbiJdLFsibG9nIiwiRXZlbnQ6IG1vdXNlbW92ZSJdLAogICAgICBbIndhcm4iLCJTbG93IHNjcmlwdCBkZXRlY3RlZCAoPjE2bXMpIl0sWyJsb2ciLCJTdG9yYWdlIHF1b3RhIGNoZWNrZWQiXSwKICAgICAgWyJpbmZvIiwiTmF2aWdhdGlvbiBlbnRyeSB1cGRhdGVkIl0sWyJsb2ciLCJXZWIgV29ya2VyIGhlYXJ0YmVhdCJdLAogICAgXTsKICAgIGxldCBsaT0wOwogICAgY29uc3QgdGlja2VyPXNldEludGVydmFsKCgpPT57CiAgICAgIGlmKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG91dCkpe2NsZWFySW50ZXJ2YWwodGlja2VyKTtyZXR1cm47fQogICAgICBhZGRMb2cobGl2ZU1lc3NhZ2VzW2xpJWxpdmVNZXNzYWdlcy5sZW5ndGhdWzBdLGxpdmVNZXNzYWdlc1tsaSVsaXZlTWVzc2FnZXMubGVuZ3RoXVsxXSk7CiAgICAgIGxpKys7CiAgICB9LDM1MDApOwogIH0KCiAgZnVuY3Rpb24gYnVpbGROZXR3b3JrKCl7CiAgICBjb25zdCBwPXBhbmVsc1siTmV0d29yayJdO3AuaW5uZXJIVE1MPSIiOwoKICAgIGNvbnN0IGhlYWRlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGhlYWRlci5zdHlsZS5jc3NUZXh0PSJkaXNwbGF5OmZsZXg7Z2FwOjA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzBmMDtwYWRkaW5nOjRweCAwO2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiMwYTA7bWFyZ2luLWJvdHRvbTo0cHg7IjsKICAgIGhlYWRlci5pbm5lckhUTUw9JzxkaXYgc3R5bGU9Im1pbi13aWR0aDo0MHB4Ij5TdGF0dXM8L2Rpdj48ZGl2IHN0eWxlPSJtaW4td2lkdGg6NTVweCI+TWV0aG9kPC9kaXY+PGRpdiBzdHlsZT0iZmxleDoxIj5VUkw8L2Rpdj48ZGl2IHN0eWxlPSJtaW4td2lkdGg6NzBweCI+VHlwZTwvZGl2PjxkaXYgc3R5bGU9Im1pbi13aWR0aDo2MHB4O3RleHQtYWxpZ246cmlnaHQiPlNpemU8L2Rpdj48ZGl2IHN0eWxlPSJtaW4td2lkdGg6NjBweDt0ZXh0LWFsaWduOnJpZ2h0O3BhZGRpbmctcmlnaHQ6NnB4Ij5UaW1lPC9kaXY+JzsKICAgIHAuYXBwZW5kQ2hpbGQoaGVhZGVyKTsKCiAgICBjb25zdCByZXF1ZXN0cz1bCiAgICAgIHtzdGF0dXM6MjAwLG1ldGhvZDoiR0VUIix1cmw6Imh0dHBzOi8vZGF0YS1vcy5sb2NhbC8iLHR5cGU6ImRvY3VtZW50IixzaXplOiIxNC4yIGtCIix0aW1lOiI0MiBtcyJ9LAogICAgICB7c3RhdHVzOjIwMCxtZXRob2Q6IkdFVCIsdXJsOiJodHRwczovL2RhdGEtb3MubG9jYWwvZmF2aWNvbi5pY28iLHR5cGU6ImltYWdlIixzaXplOiIxLjEga0IiLHRpbWU6IjggbXMifSwKICAgICAge3N0YXR1czozMDQsbWV0aG9kOiJHRVQiLHVybDoiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyIix0eXBlOiJzdHlsZXNoZWV0IixzaXplOiIwIEIiLHRpbWU6IjMxIG1zIn0sCiAgICAgIHtzdGF0dXM6MjAwLG1ldGhvZDoiR0VUIix1cmw6Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbW9ub3NwYWNlQDEuMC9pbmRleC5qcyIsdHlwZToic2NyaXB0IixzaXplOiIyMi44IGtCIix0aW1lOiI4NyBtcyJ9LAogICAgICB7c3RhdHVzOjIwMCxtZXRob2Q6IlBPU1QiLHVybDoiaHR0cHM6Ly9kYXRhLW9zLmxvY2FsL2FwaS9sb2ciLHR5cGU6ImZldGNoIixzaXplOiIxMjggQiIsdGltZToiMTkgbXMifSwKICAgICAge3N0YXR1czo0MDQsbWV0aG9kOiJHRVQiLHVybDoiaHR0cHM6Ly9kYXRhLW9zLmxvY2FsL21hbmlmZXN0Lmpzb24iLHR5cGU6ImZldGNoIixzaXplOiIwIEIiLHRpbWU6IjExIG1zIn0sCiAgICAgIHtzdGF0dXM6MjAwLG1ldGhvZDoiR0VUIix1cmw6Imh0dHBzOi8vZGF0YS1vcy5sb2NhbC93b3JrZXIuanMiLHR5cGU6InNjcmlwdCIsc2l6ZToiMy40IGtCIix0aW1lOiIxNCBtcyJ9LAogICAgICB7c3RhdHVzOjIwNixtZXRob2Q6IkdFVCIsdXJsOiJodHRwczovL2RhdGEtb3MubG9jYWwvYXNzZXRzL2JnLndlYnAiLHR5cGU6ImltYWdlIixzaXplOiI1OC4zIGtCIix0aW1lOiIxMzQgbXMifSwKICAgICAge3N0YXR1czoyMDAsbWV0aG9kOiJPUFRJT05TIix1cmw6Imh0dHBzOi8vZGF0YS1vcy5sb2NhbC9hcGkvcGluZyIsdHlwZToicHJlZmxpZ2h0IixzaXplOiIwIEIiLHRpbWU6IjYgbXMifSwKICAgICAge3N0YXR1czoyMDAsbWV0aG9kOiJHRVQiLHVybDoiaHR0cHM6Ly9kYXRhLW9zLmxvY2FsL2FwaS9waW5nIix0eXBlOiJmZXRjaCIsc2l6ZToiNDQgQiIsdGltZToiMjIgbXMifSwKICAgIF07CgogICAgcmVxdWVzdHMuZm9yRWFjaChyPT57CiAgICAgIGNvbnN0IHJvdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyb3cuY2xhc3NOYW1lPSJpbnNwZWN0LW5ldC1yb3ciOwogICAgICBjb25zdCBzYz1yLnN0YXR1czwzMDA/IiMwZjAiOnIuc3RhdHVzPDQwMD8iI2ZhMCI6IiNmNTUiOwogICAgICByb3cuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJpbnNwZWN0LW5ldC1zdGF0dXMiIHN0eWxlPSJjb2xvcjoke3NjfSI+JHtyLnN0YXR1c308L2Rpdj48ZGl2IGNsYXNzPSJpbnNwZWN0LW5ldC1tZXRob2QiPiR7ci5tZXRob2R9PC9kaXY+PGRpdiBjbGFzcz0iaW5zcGVjdC1uZXQtdXJsIj4ke3IudXJsfTwvZGl2PjxkaXYgY2xhc3M9Imluc3BlY3QtbmV0LXR5cGUiPiR7ci50eXBlfTwvZGl2PjxkaXYgY2xhc3M9Imluc3BlY3QtbmV0LXNpemUiPiR7ci5zaXplfTwvZGl2PjxkaXYgY2xhc3M9Imluc3BlY3QtbmV0LXRpbWUiPiR7ci50aW1lfTwvZGl2PmA7CiAgICAgIHAuYXBwZW5kQ2hpbGQocm93KTsKICAgIH0pOwoKICAgIGNvbnN0IHN1bW1hcnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBzdW1tYXJ5LnN0eWxlLmNzc1RleHQ9Im1hcmdpbi10b3A6MTBweDtwYWRkaW5nLXRvcDo4cHg7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDI1NSwwLDAuMik7Zm9udC1zaXplOjEycHg7Y29sb3I6IzBhMDsiOwogICAgc3VtbWFyeS50ZXh0Q29udGVudD1gJHtyZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIHwgMTAwLjIga0IgdHJhbnNmZXJyZWQgfCBGaW5pc2g6IDEzNCBtcyB8IERPTUNvbnRlbnRMb2FkZWQ6IDQ4IG1zIHwgTG9hZDogMTQxIG1zYDsKICAgIHAuYXBwZW5kQ2hpbGQoc3VtbWFyeSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFBlcmZvcm1hbmNlKCl7CiAgICBjb25zdCBwPXBhbmVsc1siUGVyZm9ybWFuY2UiXTtwLmlubmVySFRNTD0iIjsKCiAgICBjb25zdCBtZXRyaWNzPVsKICAgICAgWyJGQ1AgKEZpcnN0IENvbnRlbnRmdWwgUGFpbnQpIiwiMzggbXMiLCIjMGYwIl0sCiAgICAgIFsiTENQIChMYXJnZXN0IENvbnRlbnRmdWwgUGFpbnQpIiwiOTQgbXMiLCIjMGYwIl0sCiAgICAgIFsiVFRJIChUaW1lIHRvIEludGVyYWN0aXZlKSIsIjEyMSBtcyIsIiMwZjAiXSwKICAgICAgWyJUQlQgKFRvdGFsIEJsb2NraW5nIFRpbWUpIiwiMCBtcyIsIiMwZjAiXSwKICAgICAgWyJDTFMgKEN1bXVsYXRpdmUgTGF5b3V0IFNoaWZ0KSIsIjAuMDAiLCIjMGYwIl0sCiAgICAgIFsiRklEIChGaXJzdCBJbnB1dCBEZWxheSkiLCI8IDEgbXMiLCIjMGYwIl0sCiAgICAgIFsiU2NyaXB0IEV2YWx1YXRpb24iLCIxNCBtcyIsIiMwZjAiXSwKICAgICAgWyJTdHlsZSBSZWNhbGN1bGF0aW9uIiwiMyBtcyIsIiMwZjAiXSwKICAgICAgWyJMYXlvdXQiLCIyIG1zIiwiIzBmMCJdLAogICAgICBbIlBhaW50IiwiMSBtcyIsIiMwZjAiXSwKICAgICAgWyJDb21wb3NpdGUgTGF5ZXJzIiwiMSBtcyIsIiMwZjAiXSwKICAgIF07CgogICAgY29uc3Qgc2VjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3NlYy5jbGFzc05hbWU9Imluc3BlY3Qtc2VjdGlvbiI7CiAgICBjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgzIik7aC50ZXh0Q29udGVudD0iQ29yZSBXZWIgVml0YWxzIjtzZWMuYXBwZW5kQ2hpbGQoaCk7CiAgICBtZXRyaWNzLmZvckVhY2goKFtrLHYsY10pPT57CiAgICAgIGNvbnN0IHJvdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyb3cuY2xhc3NOYW1lPSJpbnNwZWN0LXJvdyI7CiAgICAgIHJvdy5pbm5lckhUTUw9YDxzcGFuIGNsYXNzPSJpbnNwZWN0LWtleSI+JHtrfTwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zcGVjdC12YWwiIHN0eWxlPSJjb2xvcjoke2N9Ij4ke3Z9PC9zcGFuPmA7CiAgICAgIHNlYy5hcHBlbmRDaGlsZChyb3cpOwogICAgfSk7CiAgICBwLmFwcGVuZENoaWxkKHNlYyk7CgogICAgY29uc3QgZnBzU2VjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Zwc1NlYy5jbGFzc05hbWU9Imluc3BlY3Qtc2VjdGlvbiI7CiAgICBjb25zdCBmcHNIPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgzIik7ZnBzSC50ZXh0Q29udGVudD0iTGl2ZSBGcmFtZSBSYXRlIjtmcHNTZWMuYXBwZW5kQ2hpbGQoZnBzSCk7CiAgICBjb25zdCBmcHNSb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZnBzUm93LmNsYXNzTmFtZT0iaW5zcGVjdC1yb3ciOwogICAgY29uc3QgZnBzS2V5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtmcHNLZXkuY2xhc3NOYW1lPSJpbnNwZWN0LWtleSI7ZnBzS2V5LnRleHRDb250ZW50PSJGUFMiOwogICAgY29uc3QgZnBzVmFsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtmcHNWYWwuY2xhc3NOYW1lPSJpbnNwZWN0LXZhbCI7ZnBzVmFsLnRleHRDb250ZW50PSItLSI7CiAgICBmcHNSb3cuYXBwZW5kQ2hpbGQoZnBzS2V5KTtmcHNSb3cuYXBwZW5kQ2hpbGQoZnBzVmFsKTsKICAgIGZwc1NlYy5hcHBlbmRDaGlsZChmcHNSb3cpOwoKICAgIGNvbnN0IG1lbVJvdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTttZW1Sb3cuY2xhc3NOYW1lPSJpbnNwZWN0LXJvdyI7CiAgICBjb25zdCBtZW1LZXk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO21lbUtleS5jbGFzc05hbWU9Imluc3BlY3Qta2V5IjttZW1LZXkudGV4dENvbnRlbnQ9IkpTIEhlYXAiOwogICAgY29uc3QgbWVtVmFsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTttZW1WYWwuY2xhc3NOYW1lPSJpbnNwZWN0LXZhbCI7CiAgICBtZW1WYWwudGV4dENvbnRlbnQ9cGVyZm9ybWFuY2UubWVtb3J5P2AkeyhwZXJmb3JtYW5jZS5tZW1vcnkudXNlZEpTSGVhcFNpemUvMTA0ODU3NikudG9GaXhlZCgxKX0gTUIgLyAkeyhwZXJmb3JtYW5jZS5tZW1vcnkuanNIZWFwU2l6ZUxpbWl0LzEwNDg1NzYpLnRvRml4ZWQoMSl9IE1CYDoiTi9BIjsKICAgIG1lbVJvdy5hcHBlbmRDaGlsZChtZW1LZXkpO21lbVJvdy5hcHBlbmRDaGlsZChtZW1WYWwpOwogICAgZnBzU2VjLmFwcGVuZENoaWxkKG1lbVJvdyk7CgogICAgcC5hcHBlbmRDaGlsZChmcHNTZWMpOwoKICAgIGxldCBsYXN0VD1wZXJmb3JtYW5jZS5ub3coKSxmcmFtZXM9MDsKICAgIGZ1bmN0aW9uIHRpY2sodCl7CiAgICAgIGlmKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGZwc1ZhbCkpcmV0dXJuOwogICAgICBmcmFtZXMrKzsKICAgICAgaWYodC1sYXN0VD49MTAwMCl7ZnBzVmFsLnRleHRDb250ZW50PWZyYW1lcysiIGZwcyI7ZnJhbWVzPTA7bGFzdFQ9dDt9CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKICAgIH0KICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU3RvcmFnZSgpewogICAgY29uc3QgcD1wYW5lbHNbIlN0b3JhZ2UiXTtwLmlubmVySFRNTD0iIjsKCiAgICBjb25zdCBjb29raWVzU2VjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Nvb2tpZXNTZWMuY2xhc3NOYW1lPSJpbnNwZWN0LXNlY3Rpb24iOwogICAgY29uc3QgY2g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDMiKTtjaC50ZXh0Q29udGVudD0iQ29va2llcyI7Y29va2llc1NlYy5hcHBlbmRDaGlsZChjaCk7CiAgICBjb25zdCBmYWtlQ29va2llcz1bCiAgICAgIFsic2Vzc2lvbl9pZCIsImEzZjkyYjFjOGQ0NGU3ZjAiLCJzZXNzaW9uIiwiZGF0YS1vcy5sb2NhbCIsIi8iXSwKICAgICAgWyJ0aGVtZSIsImRhcmsiLCJwZXJzaXN0ZW50IiwiZGF0YS1vcy5sb2NhbCIsIi8iXSwKICAgICAgWyJ1c2VyX3ByZWYiLCJtb25vc3BhY2UlM0ExIiwicGVyc2lzdGVudCIsImRhdGEtb3MubG9jYWwiLCIvIl0sCiAgICBdOwogICAgY29uc3QgY0hlYWRlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjSGVhZGVyLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6ZmxleDtnYXA6OHB4O2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiMwYTA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDI1NSwwLDAuMik7cGFkZGluZy1ib3R0b206NHB4O21hcmdpbi1ib3R0b206NHB4OyI7CiAgICBjSGVhZGVyLmlubmVySFRNTD0iPHNwYW4gc3R5bGU9J2ZsZXg6MSc+TmFtZTwvc3Bhbj48c3BhbiBzdHlsZT0nZmxleDoxJz5WYWx1ZTwvc3Bhbj48c3BhbiBzdHlsZT0nbWluLXdpZHRoOjgwcHgnPlR5cGU8L3NwYW4+PHNwYW4gc3R5bGU9J2ZsZXg6MSc+RG9tYWluPC9zcGFuPjxzcGFuIHN0eWxlPSdtaW4td2lkdGg6NDBweCc+UGF0aDwvc3Bhbj4iOwogICAgY29va2llc1NlYy5hcHBlbmRDaGlsZChjSGVhZGVyKTsKICAgIGZha2VDb29raWVzLmZvckVhY2goKFtuLHYsdCxkLHBhXSk9PnsKICAgICAgY29uc3Qgcm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Jvdy5zdHlsZS5jc3NUZXh0PSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmb250LXNpemU6MTJweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMjU1LDAsMC4wNik7cGFkZGluZzoycHggMDsiOwogICAgICByb3cuaW5uZXJIVE1MPWA8c3BhbiBzdHlsZT0nZmxleDoxO2NvbG9yOiM0YWYnPiR7bn08L3NwYW4+PHNwYW4gc3R5bGU9J2ZsZXg6MSc+JHt2fTwvc3Bhbj48c3BhbiBzdHlsZT0nbWluLXdpZHRoOjgwcHg7Y29sb3I6I2ZhMCc+JHt0fTwvc3Bhbj48c3BhbiBzdHlsZT0nZmxleDoxJz4ke2R9PC9zcGFuPjxzcGFuIHN0eWxlPSdtaW4td2lkdGg6NDBweCc+JHtwYX08L3NwYW4+YDsKICAgICAgY29va2llc1NlYy5hcHBlbmRDaGlsZChyb3cpOwogICAgfSk7CiAgICBwLmFwcGVuZENoaWxkKGNvb2tpZXNTZWMpOwoKICAgIGNvbnN0IGxzU2VjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2xzU2VjLmNsYXNzTmFtZT0iaW5zcGVjdC1zZWN0aW9uIjsKICAgIGNvbnN0IGxzSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMyIpO2xzSC50ZXh0Q29udGVudD0ibG9jYWxTdG9yYWdlIjtsc1NlYy5hcHBlbmRDaGlsZChsc0gpOwogICAgdHJ5ewogICAgICBjb25zdCBrZXlzPU9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSk7CiAgICAgIGlmKGtleXMubGVuZ3RoPT09MCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnN0eWxlLmNvbG9yPSIjMGEwIjtlLnRleHRDb250ZW50PSIoZW1wdHkpIjtsc1NlYy5hcHBlbmRDaGlsZChlKTt9CiAgICAgIGVsc2Uga2V5cy5mb3JFYWNoKGs9PnsKICAgICAgICBjb25zdCByb3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cm93LmNsYXNzTmFtZT0iaW5zcGVjdC1yb3ciOwogICAgICAgIHJvdy5pbm5lckhUTUw9YDxzcGFuIGNsYXNzPSJpbnNwZWN0LWtleSI+JHtrfTwvc3Bhbj48c3BhbiBjbGFzcz0iaW5zcGVjdC12YWwiPiR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oayl9PC9zcGFuPmA7CiAgICAgICAgbHNTZWMuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgfSk7CiAgICB9Y2F0Y2goZSl7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnN0eWxlLmNvbG9yPSIjZjU1IjtkLnRleHRDb250ZW50PSJsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGU6ICIrZS5tZXNzYWdlO2xzU2VjLmFwcGVuZENoaWxkKGQpO30KICAgIHAuYXBwZW5kQ2hpbGQobHNTZWMpOwoKICAgIGNvbnN0IHNzU2VjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3NzU2VjLmNsYXNzTmFtZT0iaW5zcGVjdC1zZWN0aW9uIjsKICAgIGNvbnN0IHNzSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMyIpO3NzSC50ZXh0Q29udGVudD0ic2Vzc2lvblN0b3JhZ2UiO3NzU2VjLmFwcGVuZENoaWxkKHNzSCk7CiAgICB0cnl7CiAgICAgIGNvbnN0IGtleXM9T2JqZWN0LmtleXMoc2Vzc2lvblN0b3JhZ2UpOwogICAgICBpZihrZXlzLmxlbmd0aD09PTApe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS5jb2xvcj0iIzBhMCI7ZS50ZXh0Q29udGVudD0iKGVtcHR5KSI7c3NTZWMuYXBwZW5kQ2hpbGQoZSk7fQogICAgICBlbHNlIGtleXMuZm9yRWFjaChrPT57CiAgICAgICAgY29uc3Qgcm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Jvdy5jbGFzc05hbWU9Imluc3BlY3Qtcm93IjsKICAgICAgICByb3cuaW5uZXJIVE1MPWA8c3BhbiBjbGFzcz0iaW5zcGVjdC1rZXkiPiR7a308L3NwYW4+PHNwYW4gY2xhc3M9Imluc3BlY3QtdmFsIj4ke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oayl9PC9zcGFuPmA7CiAgICAgICAgc3NTZWMuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgfSk7CiAgICB9Y2F0Y2goZSl7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnN0eWxlLmNvbG9yPSIjZjU1IjtkLnRleHRDb250ZW50PSJzZXNzaW9uU3RvcmFnZSB1bmF2YWlsYWJsZTogIitlLm1lc3NhZ2U7c3NTZWMuYXBwZW5kQ2hpbGQoZCk7fQogICAgcC5hcHBlbmRDaGlsZChzc1NlYyk7CiAgfQoKICBmdW5jdGlvbiBidWlsZEluZm8oKXsKICAgIGNvbnN0IHA9cGFuZWxzWyJJbmZvIl07cC5pbm5lckhUTUw9IiI7CgogICAgY29uc3QgbmF2PW5hdmlnYXRvcjtjb25zdCBzY3I9c2NyZWVuOwoKICAgIGNvbnN0IHNlY3Rpb25zPVsKICAgICAgWyJCcm93c2VyIixbCiAgICAgICAgWyJVc2VyIEFnZW50IixuYXYudXNlckFnZW50XSwKICAgICAgICBbIlBsYXRmb3JtIixuYXYucGxhdGZvcm1dLAogICAgICAgIFsiTGFuZ3VhZ2UiLG5hdi5sYW5ndWFnZV0sCiAgICAgICAgWyJMYW5ndWFnZXMiLG5hdi5sYW5ndWFnZXM/LmpvaW4oIiwgIil8fCJOL0EiXSwKICAgICAgICBbIk9ubGluZSIsbmF2Lm9uTGluZT8i4pyTIFllcyI6IuKclyBObyJdLAogICAgICAgIFsiQ29va2llIEVuYWJsZWQiLG5hdi5jb29raWVFbmFibGVkPyLinJMgWWVzIjoi4pyXIE5vIl0sCiAgICAgICAgWyJEbyBOb3QgVHJhY2siLG5hdi5kb05vdFRyYWNrfHwiTi9BIl0sCiAgICAgICAgWyJIYXJkd2FyZSBDb25jdXJyZW5jeSIsbmF2LmhhcmR3YXJlQ29uY3VycmVuY3krIiBjb3JlcyJdLAogICAgICAgIFsiRGV2aWNlIE1lbW9yeSIsKG5hdi5kZXZpY2VNZW1vcnl8fCJOL0EiKSsiIEdCIl0sCiAgICAgIF1dLAogICAgICBbIlNjcmVlbiIsWwogICAgICAgIFsiUmVzb2x1dGlvbiIsc2NyLndpZHRoKyLDlyIrc2NyLmhlaWdodF0sCiAgICAgICAgWyJBdmFpbGFibGUiLHNjci5hdmFpbFdpZHRoKyLDlyIrc2NyLmF2YWlsSGVpZ2h0XSwKICAgICAgICBbIkNvbG9yIERlcHRoIixzY3IuY29sb3JEZXB0aCsiIGJpdCJdLAogICAgICAgIFsiUGl4ZWwgUmF0aW8iLHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKyJ4Il0sCiAgICAgICAgWyJPcmllbnRhdGlvbiIsc2NyLm9yaWVudGF0aW9uPy50eXBlfHwiTi9BIl0sCiAgICAgIF1dLAogICAgICBbIldpbmRvdyIsWwogICAgICAgIFsiSW5uZXIgU2l6ZSIsd2luZG93LmlubmVyV2lkdGgrIsOXIit3aW5kb3cuaW5uZXJIZWlnaHRdLAogICAgICAgIFsiT3V0ZXIgU2l6ZSIsd2luZG93Lm91dGVyV2lkdGgrIsOXIit3aW5kb3cub3V0ZXJIZWlnaHRdLAogICAgICAgIFsiU2Nyb2xsIFgiLHdpbmRvdy5zY3JvbGxYXSwKICAgICAgICBbIlNjcm9sbCBZIix3aW5kb3cuc2Nyb2xsWV0sCiAgICAgICAgWyJMb2NhdGlvbiIsbG9jYXRpb24uaHJlZl0sCiAgICAgICAgWyJQcm90b2NvbCIsbG9jYXRpb24ucHJvdG9jb2xdLAogICAgICBdXSwKICAgICAgWyJQZXJmb3JtYW5jZSIsWwogICAgICAgIFsiTmF2aWdhdGlvbiBTdGFydCIsbmV3IERhdGUocGVyZm9ybWFuY2UudGltZU9yaWdpbikudG9Mb2NhbGVTdHJpbmcoKV0sCiAgICAgICAgWyJQYWdlIExvYWQgVGltZSIsKHBlcmZvcm1hbmNlLm5vdygpKS50b0ZpeGVkKDEpKyIgbXMiXSwKICAgICAgICBbIkpTIEhlYXAgVXNlZCIscGVyZm9ybWFuY2UubWVtb3J5PyhwZXJmb3JtYW5jZS5tZW1vcnkudXNlZEpTSGVhcFNpemUvMTA0ODU3NikudG9GaXhlZCgyKSsiIE1CIjoiTi9BIl0sCiAgICAgICAgWyJKUyBIZWFwIFRvdGFsIixwZXJmb3JtYW5jZS5tZW1vcnk/KHBlcmZvcm1hbmNlLm1lbW9yeS50b3RhbEpTSGVhcFNpemUvMTA0ODU3NikudG9GaXhlZCgyKSsiIE1CIjoiTi9BIl0sCiAgICAgICAgWyJKUyBIZWFwIExpbWl0IixwZXJmb3JtYW5jZS5tZW1vcnk/KHBlcmZvcm1hbmNlLm1lbW9yeS5qc0hlYXBTaXplTGltaXQvMTA0ODU3NikudG9GaXhlZCgyKSsiIE1CIjoiTi9BIl0sCiAgICAgIF1dLAogICAgXTsKCiAgICBzZWN0aW9ucy5mb3JFYWNoKChbdGl0bGUscm93c10pPT57CiAgICAgIGNvbnN0IHNlYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtzZWMuY2xhc3NOYW1lPSJpbnNwZWN0LXNlY3Rpb24iOwogICAgICBjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgzIik7aC50ZXh0Q29udGVudD10aXRsZTtzZWMuYXBwZW5kQ2hpbGQoaCk7CiAgICAgIHJvd3MuZm9yRWFjaCgoW2ssdl0pPT57CiAgICAgICAgY29uc3Qgcm93PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Jvdy5jbGFzc05hbWU9Imluc3BlY3Qtcm93IjsKICAgICAgICByb3cuaW5uZXJIVE1MPWA8c3BhbiBjbGFzcz0iaW5zcGVjdC1rZXkiPiR7a308L3NwYW4+PHNwYW4gY2xhc3M9Imluc3BlY3QtdmFsIj4ke3Z9PC9zcGFuPmA7CiAgICAgICAgc2VjLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgIH0pOwogICAgICBwLmFwcGVuZENoaWxkKHNlYyk7CiAgICB9KTsKICB9CgogIGJ1aWxkRWxlbWVudHMoKTtidWlsZENvbnNvbGUoKTtidWlsZE5ldHdvcmsoKTtidWlsZFBlcmZvcm1hbmNlKCk7YnVpbGRTdG9yYWdlKCk7YnVpbGRJbmZvKCk7CiAgc3dpdGNoVGFiKCJFbGVtZW50cyIpOwp9CgovLyBCb290IGludG8gc3RhcnR1cCBzY3JlZW4Kc2hvd1N0YXJ0dXAoKTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=