<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Corporate Media Archive &#8211; Schickler Unternehmensberatung aus Hamburg</title>
	<atom:link href="https://www.schickler.de/category/expertise/corporate-media/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.schickler.de/category/expertise/corporate-media/</link>
	<description></description>
	<lastBuildDate>Tue, 16 Aug 2022 07:46:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Native Advertising – ein Heimspiel für Publisher</title>
		<link>https://www.schickler.de/2019/12/native-advertising-ein-heimspiel-fuer-publisher/</link>
		
		<dc:creator><![CDATA[Christoph Mayer]]></dc:creator>
		<pubDate>Thu, 12 Dec 2019 15:34:26 +0000</pubDate>
				<category><![CDATA[Buchverlage]]></category>
		<category><![CDATA[Corporate Media]]></category>
		<category><![CDATA[Corporate Publishing]]></category>
		<category><![CDATA[E-Business Unternehmen]]></category>
		<category><![CDATA[EINBLICKE]]></category>
		<category><![CDATA[Fachinformationsverlage]]></category>
		<category><![CDATA[TV- und Radiosender]]></category>
		<category><![CDATA[Wachstumsstrategie]]></category>
		<category><![CDATA[Zeitschriftenverlage]]></category>
		<category><![CDATA[Zeitungsverlage]]></category>
		<category><![CDATA[Fachbeiträge]]></category>
		<guid isPermaLink="false">https://www.schickler.de/?p=3644</guid>

					<description><![CDATA[<p>Native Advertising ist kein Neuling im Werbegeschäft. Stark steigende Umsätze im globalen Markt und neue technische Möglichkeiten zeigen aber, dass das Potenzial des Formats noch lange nicht ausgeschöpft ist. Was muss bei der Kreation beachtet werden? Was sind Wachstumsfaktoren? Was macht die Konkurrenz und wie können Kunden speziell für Native Advertising gewonnen werden? Denken  [...]</p>
<p>Der Beitrag <a href="https://www.schickler.de/2019/12/native-advertising-ein-heimspiel-fuer-publisher/">Native Advertising – ein Heimspiel für Publisher</a> erschien zuerst auf <a href="https://www.schickler.de">Schickler Unternehmensberatung aus Hamburg</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-1 nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last green-border rounded-border" style="--awb-padding-top:60px;--awb-padding-right:15px;--awb-padding-bottom:50px;--awb-padding-left:15px;--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-border-color:#e2e2e2;--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;"><div class="fusion-column-wrapper fusion-column-has-shadow fusion-flex-column-wrapper-legacy"><div class="fusion-text fusion-text-1"><p>Native Advertising ist kein Neuling im Werbegeschäft. Stark steigende Umsätze im globalen Markt und neue technische Möglichkeiten zeigen aber, dass das Potenzial des Formats noch lange nicht ausgeschöpft ist.</p>
<p>Was muss bei der Kreation beachtet werden? Was sind Wachstumsfaktoren? Was macht die Konkurrenz und wie können Kunden speziell für Native Advertising gewonnen werden? Denken Sie Native Advertising strategisch weiter, um die gewünschte Performance zu erzielen.</p>
<p>In unserem EINBLICK erfahren Sie, an welchen Stellschrauben Sie drehen können, um den Umsatz im Native Advertising nachhaltig zu steigern.</p>
<p>Interesse geweckt? Dann nehmen Sie unter <a href="mailto:einblick@schickler.de">einblick@schickler.de</a> Kontakt mit unserem Geschäftsführer Hendrik Langen auf, um ein persönliches Exemplar des EINBLICKS zu erhalten (Stichwort &#8222;Native Advertising B2C&#8220;).</p>
</div><div class="fusion-clearfix"></div></div></div></div></div>
<p>Der Beitrag <a href="https://www.schickler.de/2019/12/native-advertising-ein-heimspiel-fuer-publisher/">Native Advertising – ein Heimspiel für Publisher</a> erschien zuerst auf <a href="https://www.schickler.de">Schickler Unternehmensberatung aus Hamburg</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SCHICKLER Media Index: Das geben Unternehmen 2019 für die Medienkanäle TV, Print, Digital &#038; Co aus</title>
		<link>https://www.schickler.de/2019/03/schickler-media-index-das-geben-unternehmen-2019-fuer-die-medienkanaele-tv-print-digital-co-aus/</link>
		
		<dc:creator><![CDATA[SCHICKLER]]></dc:creator>
		<pubDate>Sat, 23 Mar 2019 18:20:44 +0000</pubDate>
				<category><![CDATA[Corporate Media]]></category>
		<category><![CDATA[Corporate Publishing]]></category>
		<category><![CDATA[Digital Fitness]]></category>
		<category><![CDATA[E-Business Unternehmen]]></category>
		<category><![CDATA[Fachinformationsverlage]]></category>
		<category><![CDATA[Marktanalyse]]></category>
		<category><![CDATA[Studien]]></category>
		<category><![CDATA[TV- und Radiosender]]></category>
		<category><![CDATA[Wachstumsstrategie]]></category>
		<category><![CDATA[Zeitschriftenverlage]]></category>
		<category><![CDATA[Zeitungsverlage]]></category>
		<category><![CDATA[Fachbeiträge]]></category>
		<guid isPermaLink="false">https://www.schickler.de/?p=2948</guid>

					<description><![CDATA[<p>Der Werbemarkt wächst weiter – wenn auch etwas schwächer. Das zeigt der SCHICKLER Media Index, eine der umfassendsten Statistiken über den deutschen Werbemarkt. Neben den klassischen Gattungen sind nahezu alle Formen digitaler Werbung enthalten, sowie Messen und Sponsoring. Wir schätzen, dass im Jahr 2018 der Gesamtnettoumsatz um 3,3 Prozent auf fast 47,3 Milliarden Euro  [...]</p>
<p>Der Beitrag <a href="https://www.schickler.de/2019/03/schickler-media-index-das-geben-unternehmen-2019-fuer-die-medienkanaele-tv-print-digital-co-aus/">SCHICKLER Media Index: Das geben Unternehmen 2019 für die Medienkanäle TV, Print, Digital &#038; Co aus</a> erschien zuerst auf <a href="https://www.schickler.de">Schickler Unternehmensberatung aus Hamburg</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-2 nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last green-border rounded-border" style="--awb-padding-top:60px;--awb-padding-right:15px;--awb-padding-bottom:50px;--awb-padding-left:15px;--awb-bg-color:#ffffff;--awb-bg-color-hover:#ffffff;--awb-bg-size:cover;--awb-border-color:#e2e2e2;--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;"><div class="fusion-column-wrapper fusion-column-has-shadow fusion-flex-column-wrapper-legacy"><div class="fusion-text fusion-text-2"><p>Der Werbemarkt wächst weiter – wenn auch etwas schwächer. Das zeigt der SCHICKLER Media Index, eine der umfassendsten Statistiken über den deutschen Werbemarkt. Neben den klassischen Gattungen sind nahezu alle Formen digitaler Werbung enthalten, sowie Messen und Sponsoring.</p>
<p>Wir schätzen, dass im Jahr 2018 der Gesamtnettoumsatz um 3,3 Prozent auf fast 47,3 Milliarden Euro gestiegen ist. In 2019 hält der Trend der letzten Jahre weiter an, auch wenn das Wachstum etwas schwächer ausfallen dürfte.</p>
<p>Ungebremst ist der Trend, dass Unternehmen ihre Budgets in die direkte Kommunikation zu ihren Kunden erhöhen. Dazu gehören alle Wege des Corporate Publishing, insbesondere die digitalen Kanäle. App-Entwicklung, Corporate Social Media, die Erstellung von Corporate Videos und die Weiterentwicklung von Corporate Websites profitieren davon.</p>
<p><script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7CiAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdmFyIHNpemUgPSB7CiAgICAgICAgICAgICAgdzogc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IDAgJiYgc2l6ZS5oID09PSAwKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gbGFzdFNpemUudyAmJiBzaXplLmggPT09IGxhc3RTaXplLmgpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7CiAgICAgICAgICAgIGJpbmRpbmcucmVzaXplKGVsLCBzaXplLncsIHNpemUuaCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICB9OwoKICAgICAgICAgIG9uKHdpbmRvdywgInJlc2l6ZSIsIHJlc2l6ZUhhbmRsZXIpOwoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkKICAgICAgICAgIC8vIGFwcCwgYnV0IHRoZSB3aWRnZXQgaXRzZWxmIGlzIG5vdCBhIFNoaW55IG91dHB1dCwgYnV0CiAgICAgICAgICAvLyByYXRoZXIgYSBzaW1wbGUgc3RhdGljIHdpZGdldC4gT25lIGV4YW1wbGUgb2YgdGhpcyBpcwogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldAogICAgICAgICAgLy8gdGhhdCBpc24ndCBpbiBhIHJlbmRlciBmdW5jdGlvbi4gU2hpbnkgb25seSBrbm93cyB0bwogICAgICAgICAgLy8gY2FsbCByZXNpemUgaGFuZGxlcnMgZm9yIFNoaW55IG91dHB1dHMsIG5vdCBmb3Igc3RhdGljCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuCiAgICAgICAgICBpZiAod2luZG93LmpRdWVyeSkgewogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJoaWRkZW4uaHRtbHdpZGdldHMgaGlkZGVuLmJzLnRhYi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoCiAgICAgICAgICAvLyBmbGlwcyBzbGlkZXMgYmV0d2VlbiBkaXNwbGF5Om5vbmUgYW5kIGRpc3BsYXk6YmxvY2suCiAgICAgICAgICAvLyBJZGVhbGx5IHdlIHdvdWxkIG5vdCBoYXZlIHRvIGhhdmUgaW9zbGlkZS1zcGVjaWZpYyBjb2RlCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LAogICAgICAgICAgLy8gYnV0IHRoZSBybWFya2Rvd24gcGFja2FnZSBqdXN0IHdlbnQgdG8gQ1JBTiBzbyB0aGUKICAgICAgICAgIC8vIHdpbmRvdyB0byBnZXR0aW5nIHRoYXQgZml4ZWQgbWF5IGJlIGxvbmcuCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgLy8gSXQncyBPSyB0byBsaW1pdCB0aGlzIHRvIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIGJlY2F1c2UgaW9zbGlkZXMgaXRzZWxmIG9ubHkgc3VwcG9ydHMKICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWVudGVyIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVsZWF2ZSIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsKICAgICAgICBpZiAoc2NyaXB0RGF0YSkgewogICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHNjcmlwdERhdGEudGV4dENvbnRlbnQgfHwgc2NyaXB0RGF0YS50ZXh0KTsKICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGRhdGEuZXZhbHMgJiYgayA8IGRhdGEuZXZhbHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7CiAgICAgICAgICB9CiAgICAgICAgICBiaW5kaW5nLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGluaXRSZXN1bHQpOwogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKTsKICB9CgogIC8vIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgdG8gcmVuZGVyIHRoZSB3aWRnZXRzLgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSk7CiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgIH0sIGZhbHNlKTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7CiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBhcnJheTsKICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgewogICAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgICByZXR1cm4gcm93W2ldCiAgICAgICAgICB9KQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ld0FycmF5OwogIH07CiAgLy8gU3BsaXQgdmFsdWUgYXQgc3BsaXRDaGFyLCBidXQgYWxsb3cgc3BsaXRDaGFyIHRvIGJlIGVzY2FwZWQKICAvLyB1c2luZyBlc2NhcGVDaGFyLiBBbnkgb3RoZXIgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGVzY2FwZUNoYXIKICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLgogIGZ1bmN0aW9uIHNwbGl0V2l0aEVzY2FwZSh2YWx1ZSwgc3BsaXRDaGFyLCBlc2NhcGVDaGFyKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgIHZhciBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5sZW5ndGg7IHBvcysrKSB7CiAgICAgIGlmICghZXNjYXBlTW9kZSkgewogICAgICAgIGlmICh2YWx1ZVtwb3NdID09PSBzcGxpdENoYXIpIHsKICAgICAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3Bvc10gPT09IGVzY2FwZUNoYXIpIHsKICAgICAgICAgIGVzY2FwZU1vZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UmVzdWx0ICE9PSAiIikgewogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgLy8gRnVuY3Rpb24gYXV0aG9yZWQgYnkgWWlodWkvSkogQWxsYWlyZQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlciA9IGZ1bmN0aW9uKG8sIG1lbWJlcikgewogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQogICAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gIm9iamVjdCIgJiYgcGFydCBpbiBvKSB7CiAgICAgICAgaWYgKGkgPT0gKGwgLSAxKSkgeyAvLyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGVuIGV2YWx1bGF0ZQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikKICAgICAgICAgICAgb1twYXJ0XSA9IGV2YWwoIigiICsgb1twYXJ0XSArICIpIik7CiAgICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIGNvbnRpbnVlIHRvIG5leHQgZW1iZWRkZWQgb2JqZWN0CiAgICAgICAgICBvID0gb1twYXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuCiAgLy8gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub25lLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICByZXR1cm4gZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpOwogIH07CgogIC8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzY29wZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLAogIC8vIGFuZCByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQsIGlmIGFueS4gSWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZQogIC8vIHNlbGVjdG9yLCBvciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gSFRNTFdpZGdldAogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKGVsKTsKICAgIH0KICB9OwoKICAvLyBGaW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQKICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cywgaW4gYW4gYXJyYXkuIElmIGVsZW1lbnRzIHRoYXQKICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBudWxscy4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZEFsbCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBub2RlcyA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0cy5wdXNoKHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShub2Rlc1tpXSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOwogIGZ1bmN0aW9uIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpIHsKICAgIHdoaWxlIChwb3N0UmVuZGVySGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7CiAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgaGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWdpc3RlciB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUKICAvLyBuZXh0IHRpbWUgc3RhdGljIHdpZGdldHMgYXJlIHJlbmRlcmVkLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBwb3N0UmVuZGVySGFuZGxlcnMucHVzaChjYWxsYmFjayk7CiAgfTsKCiAgLy8gVGFrZXMgYSBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbiwgYW5kIHJldHVybnMgYW4KICAvLyBvbGQtc3R5bGUgY2xhc3MtYm91bmQgZGVmaW5pdGlvbi4gVGhpcyBzYXZlcyB1cyBmcm9tIGhhdmluZwogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoCiAgLy8gdHlwZXMgb2YgZGVmaW5pdGlvbnMuCiAgZnVuY3Rpb24gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmbikgewogICAgdmFyIHJlc3VsdCA9IHsKICAgICAgbmFtZTogZGVmbi5uYW1lLAogICAgICB0eXBlOiBkZWZuLnR5cGUsCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGRlZm4uZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyVmFsdWUoeCk7CiAgICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICBpZiAoZGVmbi5maW5kKQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsKICAgIGlmIChkZWZuLnJlbmRlckVycm9yKQogICAgICByZXN1bHQucmVuZGVyRXJyb3IgPSBkZWZuLnJlbmRlckVycm9yOwogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikKICAgICAgcmVzdWx0LmNsZWFyRXJyb3IgPSBkZWZuLmNsZWFyRXJyb3I7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pKCk7Cgo="></script><br />
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAnc3VuZDJiJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIHN1bmJ1cnN0ID0gZDJiLmNoYXJ0U3VuYnVyc3QoKTsNCiAgICAvLyBtYWtlIHRoaXMgcHVibGljbHkgYXZhaWxhYmxlIGZvciBsYXRlciBjdXN0b21pemF0aW9uIGJ5IHVzZXINCiAgICB2YXIgaW5zdGFuY2UgPSB7DQogICAgICBjaGFydDogc3VuYnVyc3QNCiAgICB9Ow0KDQogICAgcmV0dXJuIHsNCg0KICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKHgpIHsNCg0KICAgICAgICB2YXIgY29sb3JzID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MjApOw0KDQogICAgICAgIGlmKHgub3B0aW9ucy5jb2xvcnMgIT09IG51bGwpew0KICAgICAgICAgIC8vIGlmIGFuIGFycmF5IHRoZW4gd2UgYXNzdW1lIHRoZSBjb2xvcnMNCiAgICAgICAgICAvLyAgcmVwcmVzZW50IGFuIGFycmF5IG9mIGhleGFkZWNpbWFsIGNvbG9ycyB0byBiZSB1c2VkDQogICAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh4Lm9wdGlvbnMuY29sb3JzKSkgew0KICAgICAgICAgICAgdHJ5ew0KICAgICAgICAgICAgICBjb2xvcnMucmFuZ2UoeC5vcHRpb25zLmNvbG9ycykNCiAgICAgICAgICAgIH0gY2F0Y2goZSkgew0KDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8gaWYgYW4gb2JqZWN0IHdpdGggcmFuZ2UgdGhlbiB3ZSBhc3N1bWUNCiAgICAgICAgICAvLyAgdGhhdCB0aGlzIGlzIGFuIGFycmF5IG9mIGNvbG9ycyB0byBiZSB1c2VkIGFzIHJhbmdlDQogICAgICAgICAgaWYoeC5vcHRpb25zLmNvbG9ycy5yYW5nZSl7DQogICAgICAgICAgICB0cnl7DQogICAgICAgICAgICAgIGNvbG9ycy5yYW5nZSh4Lm9wdGlvbnMuY29sb3JzLnJhbmdlKQ0KICAgICAgICAgICAgfSBjYXRjaChlKSB7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBpZiBhbiBvYmplY3Qgd2l0aCBkb21haW4gdGhlbiB3ZSBhc3N1bWUNCiAgICAgICAgICAvLyAgdGhhdCB0aGlzIGlzIGFuIGFycmF5IG9mIGNvbG9ycyB0byBiZSB1c2VkIGFzIGRvbWFpbg0KICAgICAgICAgIC8vICBmb3IgbW9yZSBwcmVjaXNlIGNvbnRyb2wgb2YgdGhlIGNvbG9ycyBhc3NpZ25lZA0KICAgICAgICAgIGlmKHgub3B0aW9ucy5jb2xvcnMuZG9tYWluKXsNCiAgICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgY29sb3JzLmRvbWFpbih4Lm9wdGlvbnMuY29sb3JzLmRvbWFpbik7DQogICAgICAgICAgICB9IGNhdGNoKGUpIHsNCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIGlmIGEgZnVuY3Rpb24gdGhlbiBzZXQgdG8gdGhlIGZ1bmN0aW9uDQogICAgICAgICAgaWYodHlwZW9mKHgub3B0aW9ucy5jb2xvcnMpID09PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgICBjb2xvcnMgPSB4Lm9wdGlvbnMuY29sb3JzOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHN1bmJ1cnN0LmNoYXJ0RnJhbWUoKS5zaXplKHtoZWlnaHQ6IGhlaWdodH0pOw0KICAgICAgICBzdW5idXJzdC5sYWJlbChmdW5jdGlvbihkKSB7DQogICAgICAgICAgcmV0dXJuIGQubmFtZTsNCiAgICAgICAgfSk7DQogICAgICAgIHN1bmJ1cnN0LmNvbG9yKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICByZXR1cm4gY29sb3JzLmNhbGwodGhpcywgZC5uYW1lLCBkKTsNCiAgICAgICAgfSk7DQogICAgICAgIHN1bmJ1cnN0LnN1bmJ1cnN0KCkuc2l6ZShmdW5jdGlvbihkKSB7DQogICAgICAgICAgcmV0dXJuIGRbeC5vcHRpb25zLnZhbHVlRmllbGQgfHwgInNpemUiXTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZDMuc2VsZWN0KGVsKS5kYXR1bSh4LmRhdGEpDQogICAgICAgICAgLnRyYW5zaXRpb24oKQ0KICAgICAgICAgIC5jYWxsKHN1bmJ1cnN0KTsNCg0KDQogICAgICAgIC8vIHNldCB1cCBhIGNvbnRhaW5lciBmb3IgdGFza3MgdG8gcGVyZm9ybSBhZnRlciBjb21wbGV0aW9uDQogICAgICAgIC8vICBvbmUgZXhhbXBsZSB3b3VsZCBiZSBhZGQgY2FsbGJhY2tzIGZvciBldmVudCBoYW5kbGluZw0KICAgICAgICAvLyAgc3R5bGluZw0KICAgICAgICBpZiAoISh0eXBlb2YgeC50YXNrcyA9PT0gInVuZGVmaW5lZCIpICl7DQogICAgICAgICAgaWYgKCAodHlwZW9mIHgudGFza3MubGVuZ3RoID09PSAidW5kZWZpbmVkIikgfHwNCiAgICAgICAgICAgKHR5cGVvZiB4LnRhc2tzID09PSAiZnVuY3Rpb24iICkgKSB7DQogICAgICAgICAgICAgLy8gaGFuZGxlIGEgZnVuY3Rpb24gbm90IGVuY2xvc2VkIGluIGFycmF5DQogICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIG9uY2UgdXNpbmcganNvbmxpdGUNCiAgICAgICAgICAgICB4LnRhc2tzID0gW3gudGFza3NdOw0KICAgICAgICAgIH0NCiAgICAgICAgICB4LnRhc2tzLm1hcChmdW5jdGlvbih0KXsNCiAgICAgICAgICAgIC8vIGZvciBlYWNoIHRhc2tzIGNhbGwgdGhlIHRhc2sgd2l0aCBlbCBzdXBwbGllZCBhcyBgdGhpc2ANCiAgICAgICAgICAgIHQuY2FsbCh7ZWw6ZWwseDp4LGluc3RhbmNlOmluc3RhbmNlfSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgfSwNCg0KICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAgICAgc3VuYnVyc3QuY2hhcnRGcmFtZSgpLnNpemUoe2hlaWdodDogaGVpZ2h0fSk7DQogICAgICAgIGQzLnNlbGVjdChlbCkuY2FsbChzdW5idXJzdCk7DQoNCiAgICAgICAgLy8gc2V0IHVwIGEgY29udGFpbmVyIGZvciB0YXNrcyB0byBwZXJmb3JtIGFmdGVyIGNvbXBsZXRpb24NCiAgICAgICAgLy8gIG9uZSBleGFtcGxlIHdvdWxkIGJlIGFkZCBjYWxsYmFja3MgZm9yIGV2ZW50IGhhbmRsaW5nDQogICAgICAgIC8vICBzdHlsaW5nDQogICAgICAgIGlmICghKHR5cGVvZiB4LnRhc2tzID09PSAidW5kZWZpbmVkIikgKXsNCiAgICAgICAgICBpZiAoICh0eXBlb2YgeC50YXNrcy5sZW5ndGggPT09ICJ1bmRlZmluZWQiKSB8fA0KICAgICAgICAgICAodHlwZW9mIHgudGFza3MgPT09ICJmdW5jdGlvbiIgKSApIHsNCiAgICAgICAgICAgICAvLyBoYW5kbGUgYSBmdW5jdGlvbiBub3QgZW5jbG9zZWQgaW4gYXJyYXkNCiAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgb25jZSB1c2luZyBqc29ubGl0ZQ0KICAgICAgICAgICAgIHgudGFza3MgPSBbeC50YXNrc107DQogICAgICAgICAgfQ0KICAgICAgICAgIHgudGFza3MubWFwKGZ1bmN0aW9uKHQpew0KICAgICAgICAgICAgLy8gZm9yIGVhY2ggdGFza3MgY2FsbCB0aGUgdGFzayB3aXRoIGVsIHN1cHBsaWVkIGFzIGB0aGlzYA0KICAgICAgICAgICAgdC5jYWxsKHtlbDplbCx4OngsaW5zdGFuY2U6aW5zdGFuY2V9KTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfSwNCg0KICAgICAgaW5zdGFuY2U6IGluc3RhbmNlDQoNCiAgICB9Ow0KICB9DQp9KTsNCg=="></script><br />
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuMTMuMC4gQ29weXJpZ2h0IDIwMTggTWlrZSBCb3N0b2NrLgooZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0pKHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gbih0KGUpLHIpfX0odCkpLHtsZWZ0OmZ1bmN0aW9uKG4sZSxyLGkpe2ZvcihudWxsPT1yJiYocj0wKSxudWxsPT1pJiYoaT1uLmxlbmd0aCk7cjxpOyl7dmFyIG89citpPj4+MTt0KG5bb10sZSk8MD9yPW8rMTppPW99cmV0dXJuIHJ9LHJpZ2h0OmZ1bmN0aW9uKG4sZSxyLGkpe2ZvcihudWxsPT1yJiYocj0wKSxudWxsPT1pJiYoaT1uLmxlbmd0aCk7cjxpOyl7dmFyIG89citpPj4+MTt0KG5bb10sZSk+MD9pPW86cj1vKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiByKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fWZ1bmN0aW9uIG8odCxuKXt2YXIgZSxyLG89dC5sZW5ndGgsdT0wLGE9LTEsYz0wLHM9MDtpZihudWxsPT1uKWZvcig7KythPG87KWlzTmFOKGU9aSh0W2FdKSl8fChzKz0ocj1lLWMpKihlLShjKz1yLysrdSkpKTtlbHNlIGZvcig7KythPG87KWlzTmFOKGU9aShuKHRbYV0sYSx0KSkpfHwocys9KHI9ZS1jKSooZS0oYys9ci8rK3UpKSk7aWYodT4xKXJldHVybiBzLyh1LTEpfWZ1bmN0aW9uIHUodCxuKXt2YXIgZT1vKHQsbik7cmV0dXJuIGU/TWF0aC5zcXJ0KGUpOmV9ZnVuY3Rpb24gYSh0LG4pe3ZhciBlLHIsaSxvPXQubGVuZ3RoLHU9LTE7aWYobnVsbD09bil7Zm9yKDsrK3U8bzspaWYobnVsbCE9KGU9dFt1XSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT10W3VdKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSl9ZWxzZSBmb3IoOysrdTxvOylpZihudWxsIT0oZT1uKHRbdV0sdSx0KSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT1uKHRbdV0sdSx0KSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpO3JldHVybltyLGldfWZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHModCl7cmV0dXJuIHR9ZnVuY3Rpb24gZih0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb31mdW5jdGlvbiBsKHQsbixlKXt2YXIgcixpLG8sdSxhPS0xO2lmKG49K24sdD0rdCxlPStlLHQ9PT1uJiZlPjApcmV0dXJuW3RdO2lmKChyPW48dCkmJihpPXQsdD1uLG49aSksMD09PSh1PWgodCxuLGUpKXx8IWlzRmluaXRlKHUpKXJldHVybltdO2lmKHU+MClmb3IodD1NYXRoLmNlaWwodC91KSxuPU1hdGguZmxvb3Iobi91KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrYTxpOylvW2FdPSh0K2EpKnU7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqdSksbj1NYXRoLmNlaWwobip1KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrYTxpOylvW2FdPSh0LWEpL3U7cmV0dXJuIHImJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gaCh0LG4sZSl7dmFyIHI9KG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PUhzPzEwOm8+PWpzPzU6bz49WHM/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj1Icz8xMDpvPj1qcz81Om8+PVhzPzI6MSl9ZnVuY3Rpb24gcCh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49SHM/aSo9MTA6bz49anM/aSo9NTpvPj1YcyYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIGQodCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gdih0LG4sZSl7aWYobnVsbD09ZSYmKGU9aSkscj10Lmxlbmd0aCl7aWYoKG49K24pPD0wfHxyPDIpcmV0dXJuK2UodFswXSwwLHQpO2lmKG4+PTEpcmV0dXJuK2UodFtyLTFdLHItMSx0KTt2YXIgcixvPShyLTEpKm4sdT1NYXRoLmZsb29yKG8pLGE9K2UodFt1XSx1LHQpO3JldHVybiBhKygrZSh0W3UrMV0sdSsxLHQpLWEpKihvLXUpfX1mdW5jdGlvbiBnKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPS0xLHU9MDsrK288aTspdSs9dFtvXS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KHUpOy0taT49MDspZm9yKG49KHI9dFtpXSkubGVuZ3RoOy0tbj49MDspZVstLXVdPXJbbl07cmV0dXJuIGV9ZnVuY3Rpb24gXyh0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZyPmUmJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmcj5lJiYocj1lKTtyZXR1cm4gcn1mdW5jdGlvbiB5KHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9Xyh0LG0pLHI9bmV3IEFycmF5KGUpOysrbjxlOylmb3IodmFyIGksbz0tMSx1PXJbbl09bmV3IEFycmF5KGkpOysrbzxpOyl1W29dPXRbb11bbl07cmV0dXJuIHJ9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gdC5sZW5ndGh9ZnVuY3Rpb24geCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBiKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdyh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIE0oKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gVCh0LG4pe2Z1bmN0aW9uIGUoZSl7dmFyIGg9bnVsbD09aT9uLnRpY2tzP24udGlja3MuYXBwbHkobixyKTpuLmRvbWFpbigpOmkscD1udWxsPT1vP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixyKTp4Om8sZD1NYXRoLm1heCh1LDApK2Msdj1uLnJhbmdlKCksZz0rdlswXSsuNSxfPSt2W3YubGVuZ3RoLTFdKy41LHk9KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLG09ZS5zZWxlY3Rpb24/ZS5zZWxlY3Rpb24oKTplLGI9bS5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksdz1tLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSxUPXcuZXhpdCgpLE49dy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLGs9dy5zZWxlY3QoImxpbmUiKSxTPXcuc2VsZWN0KCJ0ZXh0Iik7Yj1iLm1lcmdlKGIuZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpKSx3PXcubWVyZ2UoTiksaz1rLm1lcmdlKE4uYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIoZisiMiIscyp1KSksUz1TLm1lcmdlKE4uYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsIiMwMDAiKS5hdHRyKGYscypkKS5hdHRyKCJkeSIsdD09PSRzPyIwZW0iOnQ9PT1acz8iMC43MWVtIjoiMC4zMmVtIikpLGUhPT1tJiYoYj1iLnRyYW5zaXRpb24oZSksdz13LnRyYW5zaXRpb24oZSksaz1rLnRyYW5zaXRpb24oZSksUz1TLnRyYW5zaXRpb24oZSksVD1ULnRyYW5zaXRpb24oZSkuYXR0cigib3BhY2l0eSIsUXMpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9eSh0KSk/bCh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxOLmF0dHIoIm9wYWNpdHkiLFFzKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIGwobiYmaXNGaW5pdGUobj1uKHQpKT9uOnkodCkpfSkpLFQucmVtb3ZlKCksYi5hdHRyKCJkIix0PT09R3N8fHQ9PVdzPyJNIitzKmErIiwiK2crIkgwLjVWIitfKyJIIitzKmE6Ik0iK2crIiwiK3MqYSsiVjAuNUgiK18rIlYiK3MqYSksdy5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBsKHkodCkpfSksay5hdHRyKGYrIjIiLHMqdSksUy5hdHRyKGYscypkKS50ZXh0KHApLG0uZmlsdGVyKE0pLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1Xcz8ic3RhcnQiOnQ9PT1Hcz8iZW5kIjoibWlkZGxlIiksbS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5fX2F4aXM9eX0pfXZhciByPVtdLGk9bnVsbCxvPW51bGwsdT02LGE9NixjPTMscz10PT09JHN8fHQ9PT1Hcz8tMToxLGY9dD09PUdzfHx0PT09V3M/IngiOiJ5IixsPXQ9PT0kc3x8dD09PVpzP2I6dztyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gcj1Wcy5jYWxsKGFyZ3VtZW50cyksZX0sZS50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/W106VnMuY2FsbCh0KSxlKTpyLnNsaWNlKCl9LGUudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6VnMuY2FsbCh0KSxlKTppJiZpLnNsaWNlKCl9LGUudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LGUpOm99LGUudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9YT0rdCxlKTp1fSxlLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsZSk6dX0sZS50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGUpOmF9LGUudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3QsZSk6Y30sZX1mdW5jdGlvbiBOKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBrKHIpfWZ1bmN0aW9uIGsodCl7dGhpcy5fPXR9ZnVuY3Rpb24gUyh0LG4sZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKHRbcl0ubmFtZT09PW4pe3Rbcl09SnMsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fWZ1bmN0aW9uIEUodCl7dmFyIG49dCs9IiIsZT1uLmluZGV4T2YoIjoiKTtyZXR1cm4gZT49MCYmInhtbG5zIiE9PShuPXQuc2xpY2UoMCxlKSkmJih0PXQuc2xpY2UoZSsxKSksdGYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOnRmW25dLGxvY2FsOnR9OnR9ZnVuY3Rpb24gQSh0KXt2YXIgbj1FKHQpO3JldHVybihuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUtzJiZuLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1Lcz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBDKCl7fWZ1bmN0aW9uIHoodCl7cmV0dXJuIG51bGw9PXQ/QzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIFAoKXtyZXR1cm5bXX1mdW5jdGlvbiBSKHQpe3JldHVybiBudWxsPT10P1A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBMKHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIHEodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gRCh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGE9MCxjPW4ubGVuZ3RoLHM9by5sZW5ndGg7YTxzOysrYSkodT1uW2FdKT8odS5fX2RhdGFfXz1vW2FdLHJbYV09dSk6ZVthXT1uZXcgcSh0LG9bYV0pO2Zvcig7YTxjOysrYSkodT1uW2FdKSYmKGlbYV09dSl9ZnVuY3Rpb24gVSh0LG4sZSxyLGksbyx1KXt2YXIgYSxjLHMsZj17fSxsPW4ubGVuZ3RoLGg9by5sZW5ndGgscD1uZXcgQXJyYXkobCk7Zm9yKGE9MDthPGw7KythKShjPW5bYV0pJiYocFthXT1zPXVmK3UuY2FsbChjLGMuX19kYXRhX18sYSxuKSxzIGluIGY/aVthXT1jOmZbc109Yyk7Zm9yKGE9MDthPGg7KythKShjPWZbcz11Zit1LmNhbGwodCxvW2FdLGEsbyldKT8oclthXT1jLGMuX19kYXRhX189b1thXSxmW3NdPW51bGwpOmVbYV09bmV3IHEodCxvW2FdKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJmZbcFthXV09PT1jJiYoaVthXT1jKX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIEYodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIEkodCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxGKHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIFkodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgSCh0KX1mdW5jdGlvbiBIKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1ZKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZT1CKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5hZGQobltyXSl9ZnVuY3Rpb24gWCh0LG4pe2Zvcih2YXIgZT1CKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gVigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gJCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIFcoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gWigpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIEcoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBRKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSigpe3JldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKCExKSx0aGlzLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBLKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITApLHRoaXMubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIHR0KHQsbixlKXtyZXR1cm4gdD1udCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIG50KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIGV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBydCh0LG4sZSl7dmFyIHI9YWYuaGFzT3duUHJvcGVydHkodC50eXBlKT90dDpudDtyZXR1cm4gZnVuY3Rpb24oaSxvLHUpe3ZhciBhLGM9dGhpcy5fX29uLHM9cihuLG8sdSk7aWYoYylmb3IodmFyIGY9MCxsPWMubGVuZ3RoO2Y8bDsrK2YpaWYoKGE9Y1tmXSkudHlwZT09PXQudHlwZSYmYS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXIsYS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXI9cyxhLmNhcHR1cmU9ZSksdm9pZChhLnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUscyxlKSxhPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOnMsY2FwdHVyZTplfSxjP2MucHVzaChhKTp0aGlzLl9fb249W2FdfX1mdW5jdGlvbiBpdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIG90KHQsbixlKXt2YXIgcj1GKHQpLGk9ci5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2YgaT9pPW5ldyBpKG4sZSk6KGk9ci5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxlPyhpLmluaXRFdmVudChuLGUuYnViYmxlcyxlLmNhbmNlbGFibGUpLGkuZGV0YWlsPWUuZGV0YWlsKTppLmluaXRFdmVudChuLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KGkpfWZ1bmN0aW9uIHV0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIGF0KCl7cmV0dXJuIG5ldyB1dChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLGNmKX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHV0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgdXQoW1t0XV0sY2YpfWZ1bmN0aW9uIHN0KCl7cmV0dXJuIG5ldyBmdH1mdW5jdGlvbiBmdCgpe3RoaXMuXz0iQCIrKCsrc2YpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBsdCgpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9ZnVuY3Rpb24gaHQodCxuKXt2YXIgZT10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIHIueD1uLmNsaWVudFgsci55PW4uY2xpZW50WSxyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bbi5jbGllbnRYLWkubGVmdC10LmNsaWVudExlZnQsbi5jbGllbnRZLWkudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBwdCh0KXt2YXIgbj1sdCgpO3JldHVybiBuLmNoYW5nZWRUb3VjaGVzJiYobj1uLmNoYW5nZWRUb3VjaGVzWzBdKSxodCh0LG4pfWZ1bmN0aW9uIGR0KHQsbixlKXthcmd1bWVudHMubGVuZ3RoPDMmJihlPW4sbj1sdCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIHIsaT0wLG89bj9uLmxlbmd0aDowO2k8bzsrK2kpaWYoKHI9bltpXSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIGh0KHQscik7cmV0dXJuIG51bGx9ZnVuY3Rpb24gdnQoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGd0KCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gX3QodCl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT1jdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLGd0LCEwKTsib25zZWxlY3RzdGFydCJpbiBuP2Uub24oInNlbGVjdHN0YXJ0LmRyYWciLGd0LCEwKToobi5fX25vc2VsZWN0PW4uc3R5bGUuTW96VXNlclNlbGVjdCxuLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiB5dCh0LG4pe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9Y3QodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtuJiYoci5vbigiY2xpY2suZHJhZyIsZ3QsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJjbGljay5kcmFnIixudWxsKX0sMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9ZnVuY3Rpb24gbXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHh0KHQsbixlLHIsaSxvLHUsYSxjLHMpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zdWJqZWN0PWUsdGhpcy5pZGVudGlmaWVyPXIsdGhpcy5hY3RpdmU9aSx0aGlzLng9byx0aGlzLnk9dSx0aGlzLmR4PWEsdGhpcy5keT1jLHRoaXMuXz1zfWZ1bmN0aW9uIGJ0KCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIHd0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBNdChuKXtyZXR1cm4gbnVsbD09bj97eDp0LmV2ZW50LngseTp0LmV2ZW50Lnl9Om59ZnVuY3Rpb24gVHQoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gTnQodCxuLGUpe3QucHJvdG90eXBlPW4ucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj10fWZ1bmN0aW9uIGt0KHQsbil7dmFyIGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfWZ1bmN0aW9uIFN0KCl7fWZ1bmN0aW9uIEV0KHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1wZi5leGVjKHQpKT8obj1wYXJzZUludChuWzFdLDE2KSxuZXcgUnQobj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpKToobj1kZi5leGVjKHQpKT9BdChwYXJzZUludChuWzFdLDE2KSk6KG49dmYuZXhlYyh0KSk/bmV3IFJ0KG5bMV0sblsyXSxuWzNdLDEpOihuPWdmLmV4ZWModCkpP25ldyBSdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCwxKToobj1fZi5leGVjKHQpKT9DdChuWzFdLG5bMl0sblszXSxuWzRdKToobj15Zi5leGVjKHQpKT9DdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCxuWzRdKToobj1tZi5leGVjKHQpKT9MdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLDEpOihuPXhmLmV4ZWModCkpP0x0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsbls0XSk6YmYuaGFzT3duUHJvcGVydHkodCk/QXQoYmZbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBSdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEF0KHQpe3JldHVybiBuZXcgUnQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIEN0KHQsbixlLHIpe3JldHVybiByPD0wJiYodD1uPWU9TmFOKSxuZXcgUnQodCxuLGUscil9ZnVuY3Rpb24genQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBTdHx8KHQ9RXQodCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgUnQodC5yLHQuZyx0LmIsdC5vcGFjaXR5KSk6bmV3IFJ0fWZ1bmN0aW9uIFB0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD96dCh0KTpuZXcgUnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFJ0KHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBMdCh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IER0KHQsbixlLHIpfWZ1bmN0aW9uIHF0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgRHQpcmV0dXJuIG5ldyBEdCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBTdHx8KHQ9RXQodCkpLCF0KXJldHVybiBuZXcgRHQ7aWYodCBpbnN0YW5jZW9mIER0KXJldHVybiB0O3ZhciBuPSh0PXQucmdiKCkpLnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT1NYXRoLm1pbihuLGUsciksbz1NYXRoLm1heChuLGUsciksdT1OYU4sYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PW49PT1vPyhlLXIpL2ErNiooZTxyKTplPT09bz8oci1uKS9hKzI6KG4tZSkvYSs0LGEvPWM8LjU/bytpOjItby1pLHUqPTYwKTphPWM+MCYmYzwxPzA6dSxuZXcgRHQodSxhLGMsdC5vcGFjaXR5KX0odCk6bmV3IER0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBEdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gVXQodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWZ1bmN0aW9uIE90KHQpe2lmKHQgaW5zdGFuY2VvZiBJdClyZXR1cm4gbmV3IEl0KHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIFZ0KXt2YXIgbj10Lmgqd2Y7cmV0dXJuIG5ldyBJdCh0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBSdHx8KHQ9enQodCkpO3ZhciBlPWp0KHQucikscj1qdCh0LmcpLGk9anQodC5iKSxvPVl0KCguNDEyNDU2NCplKy4zNTc1NzYxKnIrLjE4MDQzNzUqaSkvVGYpLHU9WXQoKC4yMTI2NzI5KmUrLjcxNTE1MjIqcisuMDcyMTc1KmkpL05mKTtyZXR1cm4gbmV3IEl0KDExNip1LTE2LDUwMCooby11KSwyMDAqKHUtWXQoKC4wMTkzMzM5KmUrLjExOTE5MipyKy45NTAzMDQxKmkpL2tmKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBGdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/T3QodCk6bmV3IEl0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBJdCh0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gWXQodCl7cmV0dXJuIHQ+Q2Y/TWF0aC5wb3codCwxLzMpOnQvQWYrU2Z9ZnVuY3Rpb24gQnQodCl7cmV0dXJuIHQ+RWY/dCp0KnQ6QWYqKHQtU2YpfWZ1bmN0aW9uIEh0KHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24ganQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gWHQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBWdClyZXR1cm4gbmV3IFZ0KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIEl0fHwodD1PdCh0KSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpNZjtyZXR1cm4gbmV3IFZ0KG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfSh0KTpuZXcgVnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFZ0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiAkdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIFd0KXJldHVybiBuZXcgV3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgUnR8fCh0PXp0KHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oRGYqcitMZipuLXFmKmUpLyhEZitMZi1xZiksbz1yLWksdT0oUmYqKGUtaSktemYqbykvUGYsYT1NYXRoLnNxcnQodSp1K28qbykvKFJmKmkqKDEtaSkpLGM9YT9NYXRoLmF0YW4yKHUsbykqTWYtMTIwOk5hTjtyZXR1cm4gbmV3IFd0KGM8MD9jKzM2MDpjLGEsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgV3QodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFd0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBadCh0LG4sZSxyLGkpe3ZhciBvPXQqdCx1PW8qdDtyZXR1cm4oKDEtMyp0KzMqby11KSpuKyg0LTYqbyszKnUpKmUrKDErMyp0KzMqby0zKnUpKnIrdSppKS82fWZ1bmN0aW9uIEd0KHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sdT1yPjA/dFtyLTFdOjIqaS1vLGE9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBadCgoZS1yL24pKm4sdSxpLG8sYSl9fWZ1bmN0aW9uIFF0KHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sdT10WyhyKzEpJW5dLGE9dFsocisyKSVuXTtyZXR1cm4gWnQoKGUtci9uKSpuLGksbyx1LGEpfX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gS3QodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9LdCh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6SnQoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiBubih0KXtyZXR1cm4gMT09KHQ9K3QpP2VuOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6SnQoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZW4odCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/S3QodCxlKTpKdChpc05hTih0KT9uOnQpfWZ1bmN0aW9uIHJuKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9UHQobltlXSksb1tlXT1yLnJ8fDAsdVtlXT1yLmd8fDAsYVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSx1PXQodSksYT10KGEpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9dSh0KSxyLmI9YSh0KSxyKyIifX19ZnVuY3Rpb24gb24odCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1mbih0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSl1W2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSl1W2VdPW9bZV0odCk7cmV0dXJuIHV9fWZ1bmN0aW9uIHVuKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiBhbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBjbih0LG4pe3ZhciBlLHI9e30saT17fTtudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PW4mJiJvYmplY3QiPT10eXBlb2Ygbnx8KG49e30pO2ZvcihlIGluIG4pZSBpbiB0P3JbZV09Zm4odFtlXSxuW2VdKTppW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlIGluIHIpaVtlXT1yW2VdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBzbih0LG4pe3ZhciBlLHIsaSxvPVZmLmxhc3RJbmRleD0kZi5sYXN0SW5kZXg9MCx1PS0xLGE9W10sYz1bXTtmb3IodCs9IiIsbis9IiI7KGU9VmYuZXhlYyh0KSkmJihyPSRmLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP2FbdV0/YVt1XSs9cjphWysrdV09cjooYVsrK3VdPW51bGwsYy5wdXNoKHtpOnUseDphbihlLHIpfSkpLG89JGYubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLGFbdV0/YVt1XSs9aTphWysrdV09aSksYS5sZW5ndGg8Mj9jWzBdP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19KGNbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShuKToobj1jLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpYVsoZT1jW3JdKS5pXT1lLngodCk7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBmbih0LG4pe3ZhciBlLHI9dHlwZW9mIG47cmV0dXJuIG51bGw9PW58fCJib29sZWFuIj09PXI/SnQobik6KCJudW1iZXIiPT09cj9hbjoic3RyaW5nIj09PXI/KGU9RXQobikpPyhuPWUsSGYpOnNuOm4gaW5zdGFuY2VvZiBFdD9IZjpuIGluc3RhbmNlb2YgRGF0ZT91bjpBcnJheS5pc0FycmF5KG4pP29uOiJmdW5jdGlvbiIhPXR5cGVvZiBuLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9jbjphbikodCxuKX1mdW5jdGlvbiBsbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX1mdW5jdGlvbiBobih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSpXZixza2V3WDpNYXRoLmF0YW4oYykqV2Ysc2NhbGVYOnUsc2NhbGVZOmF9fWZ1bmN0aW9uIHBuKHQsbixlLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLHUpe3ZhciBhPVtdLGM9W107cmV0dXJuIG89dChvKSx1PXQodSksZnVuY3Rpb24odCxyLGksbyx1LGEpe2lmKHQhPT1pfHxyIT09byl7dmFyIGM9dS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLG4sbnVsbCxlKTthLnB1c2goe2k6Yy00LHg6YW4odCxpKX0se2k6Yy0yLHg6YW4ocixvKX0pfWVsc2UoaXx8bykmJnUucHVzaCgidHJhbnNsYXRlKCIraStuK28rZSl9KG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksdS50cmFuc2xhdGVYLHUudHJhbnNsYXRlWSxhLGMpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uPyh0LW4+MTgwP24rPTM2MDpuLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6ZS5wdXNoKGkoZSkrInJvdGF0ZSgiLG51bGwsciktMix4OmFuKHQsbil9KSk6biYmZS5wdXNoKGkoZSkrInJvdGF0ZSgiK24rcil9KG8ucm90YXRlLHUucm90YXRlLGEsYyksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/by5wdXNoKHtpOmUucHVzaChpKGUpKyJza2V3WCgiLG51bGwsciktMix4OmFuKHQsbil9KTpuJiZlLnB1c2goaShlKSsic2tld1goIituK3IpfShvLnNrZXdYLHUuc2tld1gsYSxjKSxmdW5jdGlvbih0LG4sZSxyLG8sdSl7aWYodCE9PWV8fG4hPT1yKXt2YXIgYT1vLnB1c2goaShvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7dS5wdXNoKHtpOmEtNCx4OmFuKHQsZSl9LHtpOmEtMix4OmFuKG4scil9KX1lbHNlIDE9PT1lJiYxPT09cnx8by5wdXNoKGkobykrInNjYWxlKCIrZSsiLCIrcisiKSIpfShvLnNjYWxlWCxvLnNjYWxlWSx1LnNjYWxlWCx1LnNjYWxlWSxhLGMpLG89dT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9Yy5sZW5ndGg7KytlPHI7KWFbKG49Y1tlXSkuaV09bi54KHQpO3JldHVybiBhLmpvaW4oIiIpfX19ZnVuY3Rpb24gZG4odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gdm4odCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sdT10WzJdLGE9blswXSxjPW5bMV0scz1uWzJdLGY9YS1pLGw9Yy1vLGg9ZipmK2wqbDtpZihoPG5sKXI9TWF0aC5sb2cocy91KS9KZixlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqZixvK3QqbCx1Kk1hdGguZXhwKEpmKnQqcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxkPShzKnMtdSp1K3RsKmgpLygyKnUqS2YqcCksdj0ocypzLXUqdS10bCpoKS8oMipzKktmKnApLGc9TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSxfPU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oXy1nKS9KZixlPWZ1bmN0aW9uKHQpe3ZhciBuPXQqcixlPWRuKGcpLGE9dS8oS2YqcCkqKGUqZnVuY3Rpb24odCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfShKZipuK2cpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krYSpmLG8rYSpsLHUqZS9kbihKZipuK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPXF0KG4pKS5oLChlPXF0KGUpKS5oKSxpPWVuKG4ucyxlLnMpLG89ZW4obi5sLGUubCksdT1lbihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiBfbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVh0KG4pKS5oLChlPVh0KGUpKS5oKSxpPWVuKG4uYyxlLmMpLG89ZW4obi5sLGUubCksdT1lbihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiB5bih0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj0kdChuKSkuaCwocj0kdChyKSkuaCksbz1lbihuLnMsci5zKSx1PWVuKG4ubCxyLmwpLGE9ZW4obi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9dShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9YSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9ZnVuY3Rpb24gbW4oKXtyZXR1cm4gcGx8fChnbCh4bikscGw9dmwubm93KCkrZGwpfWZ1bmN0aW9uIHhuKCl7cGw9MH1mdW5jdGlvbiBibigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gd24odCxuLGUpe3ZhciByPW5ldyBibjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIE1uKCl7bW4oKSwrK2NsO2Zvcih2YXIgdCxuPVlmO247KSh0PXBsLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1jbH1mdW5jdGlvbiBUbigpe3BsPShobD12bC5ub3coKSkrZGwsY2w9c2w9MDt0cnl7TW4oKX1maW5hbGx5e2NsPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9WWYscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46WWY9bik7QmY9dCxrbihyKX0oKSxwbD0wfX1mdW5jdGlvbiBObigpe3ZhciB0PXZsLm5vdygpLG49dC1obDtuPmxsJiYoZGwtPW4saGw9dCl9ZnVuY3Rpb24ga24odCl7aWYoIWNsKXtzbCYmKHNsPWNsZWFyVGltZW91dChzbCkpO3QtcGw+MjQ/KHQ8MS8wJiYoc2w9c2V0VGltZW91dChUbix0LXZsLm5vdygpLWRsKSksZmwmJihmbD1jbGVhckludGVydmFsKGZsKSkpOihmbHx8KGhsPXZsLm5vdygpLGZsPXNldEludGVydmFsKE5uLGxsKSksY2w9MSxnbChUbikpfX1mdW5jdGlvbiBTbih0LG4sZSl7dmFyIHI9bmV3IGJuO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9ZnVuY3Rpb24gRW4odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTsoZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIoYyl7dmFyIHMsZixsLGg7aWYoZS5zdGF0ZSE9PXhsKXJldHVybiBvKCk7Zm9yKHMgaW4gYSlpZigoaD1hW3NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09d2wpcmV0dXJuIFNuKHIpO2guc3RhdGU9PT1NbD8oaC5zdGF0ZT1ObCxoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGFbc10pOitzPG4mJihoLnN0YXRlPU5sLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBhW3NdKX1pZihTbihmdW5jdGlvbigpe2Uuc3RhdGU9PT13bCYmKGUuc3RhdGU9TWwsZS50aW1lci5yZXN0YXJ0KGksZS5kZWxheSxlLnRpbWUpLGkoYykpfSksZS5zdGF0ZT1ibCxlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09Ymwpe2ZvcihlLnN0YXRlPXdsLHU9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLHM9MCxmPS0xO3M8bDsrK3MpKGg9ZS50d2VlbltzXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHVbKytmXT1oKTt1Lmxlbmd0aD1mKzF9fWZ1bmN0aW9uIGkobil7Zm9yKHZhciByPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydChvKSxlLnN0YXRlPVRsLDEpLGk9LTEsYT11Lmxlbmd0aDsrK2k8YTspdVtpXS5jYWxsKG51bGwscik7ZS5zdGF0ZT09PVRsJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLG8oKSl9ZnVuY3Rpb24gbygpe2Uuc3RhdGU9TmwsZS50aW1lci5zdG9wKCksZGVsZXRlIGFbbl07Zm9yKHZhciByIGluIGEpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn12YXIgdSxhPXQuX190cmFuc2l0aW9uO2Fbbl09ZSxlLnRpbWVyPXduKGZ1bmN0aW9uKHQpe2Uuc3RhdGU9eGwsZS50aW1lci5yZXN0YXJ0KHIsZS5kZWxheSxlLnRpbWUpLGUuZGVsYXk8PXQmJnIodC1lLmRlbGF5KX0sMCxlLnRpbWUpfSkodCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOl9sLHR3ZWVuOnlsLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOm1sfSl9ZnVuY3Rpb24gQW4odCxuKXt2YXIgZT16bih0LG4pO2lmKGUuc3RhdGU+bWwpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBDbih0LG4pe3ZhciBlPXpuKHQsbik7aWYoZS5zdGF0ZT5ibCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB6bih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIFBuKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sdT0hMDtpZihvKXtuPW51bGw9PW4/bnVsbDpuKyIiO2ZvcihpIGluIG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT5ibCYmZS5zdGF0ZTxUbCxlLnN0YXRlPU5sLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6dT0hMTt1JiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFJuKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9Q24odGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiB6bih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBMbih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/YW46biBpbnN0YW5jZW9mIEV0P0hmOihlPUV0KG4pKT8obj1lLEhmKTpzbikodCxuKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24gRG4odCl7cmV0dXJuIGF0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBVbigpe3JldHVybisrU2x9ZnVuY3Rpb24gT24odCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9ZnVuY3Rpb24gSW4odCl7cmV0dXJuKDEtTWF0aC5jb3MoUGwqdCkpLzJ9ZnVuY3Rpb24gWW4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdygyLDEwKnQtMTApOjItTWF0aC5wb3coMiwxMC0xMCp0KSkvMn1mdW5jdGlvbiBCbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtTWF0aC5zcXJ0KDEtdCp0KTpNYXRoLnNxcnQoMS0odC09MikqdCkrMSkvMn1mdW5jdGlvbiBIbih0KXtyZXR1cm4odD0rdCk8TGw/SGwqdCp0OnQ8RGw/SGwqKHQtPXFsKSp0K1VsOnQ8Rmw/SGwqKHQtPU9sKSp0K0lsOkhsKih0LT1ZbCkqdCtCbH1mdW5jdGlvbiBqbih0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBRbC50aW1lPW1uKCksUWw7cmV0dXJuIGV9ZnVuY3Rpb24gWG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFZuKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiAkbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFduKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIFpuKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIEduKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFFuKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gSm4odCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBLbihuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGEpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtXbigib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIix1aC5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UW4odGhpcykuZXh0ZW50O2N0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbV24oInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsdWguc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiB1aFt0LnR5cGVdfSksdC5lYWNoKHIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcigpe3ZhciB0PWN0KHRoaXMpLG49UW4odGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWgvMjpuWzBdWzBdLWgvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWgvMjpuWzBdWzFdLWgvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0raDpofSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0raDpofSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgbyh0LG4pfWZ1bmN0aW9uIG8odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIHUoKXtmdW5jdGlvbiBlKCl7dmFyIHQ9cHQodyk7IUx8fHh8fGJ8fChNYXRoLmFicyh0WzBdLURbMF0pPk1hdGguYWJzKHRbMV0tRFsxXSk/Yj0hMDp4PSEwKSxEPXQsbT0hMCwkbigpLG8oKX1mdW5jdGlvbiBvKCl7dmFyIHQ7c3dpdGNoKF89RFswXS1xWzBdLHk9RFsxXS1xWzFdLFQpe2Nhc2UgdGg6Y2FzZSBLbDpOJiYoXz1NYXRoLm1heChDLWEsTWF0aC5taW4oUC1wLF8pKSxzPWErXyxkPXArXyksayYmKHk9TWF0aC5tYXgoei1sLE1hdGgubWluKFItdix5KSksaD1sK3ksZz12K3kpO2JyZWFrO2Nhc2Ugbmg6TjwwPyhfPU1hdGgubWF4KEMtYSxNYXRoLm1pbihQLWEsXykpLHM9YStfLGQ9cCk6Tj4wJiYoXz1NYXRoLm1heChDLXAsTWF0aC5taW4oUC1wLF8pKSxzPWEsZD1wK18pLGs8MD8oeT1NYXRoLm1heCh6LWwsTWF0aC5taW4oUi1sLHkpKSxoPWwreSxnPXYpOms+MCYmKHk9TWF0aC5tYXgoei12LE1hdGgubWluKFItdix5KSksaD1sLGc9dit5KTticmVhaztjYXNlIGVoOk4mJihzPU1hdGgubWF4KEMsTWF0aC5taW4oUCxhLV8qTikpLGQ9TWF0aC5tYXgoQyxNYXRoLm1pbihQLHArXypOKSkpLGsmJihoPU1hdGgubWF4KHosTWF0aC5taW4oUixsLXkqaykpLGc9TWF0aC5tYXgoeixNYXRoLm1pbihSLHYreSprKSkpfWQ8cyYmKE4qPS0xLHQ9YSxhPXAscD10LHQ9cyxzPWQsZD10LE0gaW4gYWgmJkYuYXR0cigiY3Vyc29yIix1aFtNPWFoW01dXSkpLGc8aCYmKGsqPS0xLHQ9bCxsPXYsdj10LHQ9aCxoPWcsZz10LE0gaW4gY2gmJkYuYXR0cigiY3Vyc29yIix1aFtNPWNoW01dXSkpLFMuc2VsZWN0aW9uJiYoQT1TLnNlbGVjdGlvbikseCYmKHM9QVswXVswXSxkPUFbMV1bMF0pLGImJihoPUFbMF1bMV0sZz1BWzFdWzFdKSxBWzBdWzBdPT09cyYmQVswXVsxXT09PWgmJkFbMV1bMF09PT1kJiZBWzFdWzFdPT09Z3x8KFMuc2VsZWN0aW9uPVtbcyxoXSxbZCxnXV0sci5jYWxsKHcpLFUuYnJ1c2goKSl9ZnVuY3Rpb24gdSgpe2lmKFZuKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtjJiZjbGVhclRpbWVvdXQoYyksYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yz1udWxsfSw1MDApLE8ub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSB5dCh0LmV2ZW50LnZpZXcsbSksSS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ty5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEYuYXR0cigiY3Vyc29yIix1aC5vdmVybGF5KSxTLnNlbGVjdGlvbiYmKEE9Uy5zZWxlY3Rpb24pLEpuKEEpJiYoUy5zZWxlY3Rpb249bnVsbCxyLmNhbGwodykpLFUuZW5kKCl9aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiAkbigpfWVsc2UgaWYoYylyZXR1cm47aWYoZi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBhLHMsbCxoLHAsZCx2LGcsXyx5LG0seCxiLHc9dGhpcyxNPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsVD0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/TT0ib3ZlcmxheSI6TSk/S2w6dC5ldmVudC5hbHRLZXk/ZWg6bmgsTj1uPT09aWg/bnVsbDpzaFtNXSxrPW49PT1yaD9udWxsOmZoW01dLFM9UW4odyksRT1TLmV4dGVudCxBPVMuc2VsZWN0aW9uLEM9RVswXVswXSx6PUVbMF1bMV0sUD1FWzFdWzBdLFI9RVsxXVsxXSxMPU4mJmsmJnQuZXZlbnQuc2hpZnRLZXkscT1wdCh3KSxEPXEsVT1pKHcsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PU0/Uy5zZWxlY3Rpb249QT1bW2E9bj09PWloP0M6cVswXSxsPW49PT1yaD96OnFbMV1dLFtwPW49PT1paD9QOmEsdj1uPT09cmg/UjpsXV06KGE9QVswXVswXSxsPUFbMF1bMV0scD1BWzFdWzBdLHY9QVsxXVsxXSkscz1hLGg9bCxkPXAsZz12O3ZhciBPPWN0KHcpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLEY9Ty5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIix1aFtNXSk7aWYodC5ldmVudC50b3VjaGVzKU8ub24oInRvdWNobW92ZS5icnVzaCIsZSwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIix1LCEwKTtlbHNle3ZhciBJPWN0KHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGZ1bmN0aW9uKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpMPU4mJms7YnJlYWs7Y2FzZSAxODpUPT09bmgmJihOJiYocD1kLV8qTixhPXMrXypOKSxrJiYodj1nLXkqayxsPWgreSprKSxUPWVoLG8oKSk7YnJlYWs7Y2FzZSAzMjpUIT09bmgmJlQhPT1laHx8KE48MD9wPWQtXzpOPjAmJihhPXMtXyksazwwP3Y9Zy15Oms+MCYmKGw9aC15KSxUPXRoLEYuYXR0cigiY3Vyc29yIix1aC5zZWxlY3Rpb24pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59JG4oKX0sITApLm9uKCJrZXl1cC5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OkwmJih4PWI9TD0hMSxvKCkpO2JyZWFrO2Nhc2UgMTg6VD09PWVoJiYoTjwwP3A9ZDpOPjAmJihhPXMpLGs8MD92PWc6az4wJiYobD1oKSxUPW5oLG8oKSk7YnJlYWs7Y2FzZSAzMjpUPT09dGgmJih0LmV2ZW50LmFsdEtleT8oTiYmKHA9ZC1fKk4sYT1zK18qTiksayYmKHY9Zy15KmssbD1oK3kqayksVD1laCk6KE48MD9wPWQ6Tj4wJiYoYT1zKSxrPDA/dj1nOms+MCYmKGw9aCksVD1uaCksRi5hdHRyKCJjdXJzb3IiLHVoW01dKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufSRuKCl9LCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixlLCEwKS5vbigibW91c2V1cC5icnVzaCIsdSwhMCk7X3QodC5ldmVudC52aWV3KX1WbigpLFBuKHcpLHIuY2FsbCh3KSxVLnN0YXJ0KCl9fWZ1bmN0aW9uIGEoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH12YXIgYyxzPUduLGY9Wm4sbD1OKGUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxoPTY7cmV0dXJuIGUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dS5zZWxlY3Rpb249MT09PXQmJkpuKHMpP251bGw6Zih0KSxyLmNhbGwobyksYS5icnVzaCgpfXZhciBvPXRoaXMsdT1vLl9fYnJ1c2gsYT1pKG8sYXJndW1lbnRzKSxjPXUuc2VsZWN0aW9uLHM9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHUuZXh0ZW50KSxmPWZuKGMscyk7cmV0dXJuIGMmJnM/dDp0KDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLG89dGhpcy5fX2JydXNoLHU9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsdCk6ZSxvLmV4dGVudCksYT1pKHRoaXMsdCkuYmVmb3Jlc3RhcnQoKTtQbih0aGlzKSxvLnNlbGVjdGlvbj1udWxsPT11fHxKbih1KT9udWxsOnUsci5jYWxsKHRoaXMpLGEuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LG8ucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7aXQobmV3IGZ1bmN0aW9uKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9KGUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGwuYXBwbHksbCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxlLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhuKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxlKTpzfSxlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhuKCEhdCksZSk6Zn0sZS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LGUpOmh9LGUub249ZnVuY3Rpb24oKXt2YXIgdD1sLm9uLmFwcGx5KGwsYXJndW1lbnRzKTtyZXR1cm4gdD09PWw/ZTp0fSxlfWZ1bmN0aW9uIHRlKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBuZSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIGVlKCl7cmV0dXJuIG5ldyBuZX1mdW5jdGlvbiByZSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gaWUodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIG9lKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIGFlKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIHNlKHQsbil7dmFyIGU9bmV3IGNlO2lmKHQgaW5zdGFuY2VvZiBjZSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciB1IGluIHQpZS5zZXQodSx0W3VdKTtyZXR1cm4gZX1mdW5jdGlvbiBmZSgpe3JldHVybnt9fWZ1bmN0aW9uIGxlKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gaGUoKXtyZXR1cm4gc2UoKX1mdW5jdGlvbiBwZSh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBkZSgpe31mdW5jdGlvbiB2ZSh0LG4pe3ZhciBlPW5ldyBkZTtpZih0IGluc3RhbmNlb2YgZGUpdC5lYWNoKGZ1bmN0aW9uKHQpe2UuYWRkKHQpfSk7ZWxzZSBpZih0KXt2YXIgcj0tMSxpPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK3I8aTspZS5hZGQodFtyXSk7ZWxzZSBmb3IoOysrcjxpOyllLmFkZChuKHRbcl0scix0KSl9cmV0dXJuIGV9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBfZSh0KXtmdW5jdGlvbiBuKHQsbil7ZnVuY3Rpb24gZSgpe2lmKHMpcmV0dXJuIE1oO2lmKGYpcmV0dXJuIGY9ITEsd2g7dmFyIG4sZSxyPWE7aWYodC5jaGFyQ29kZUF0KHIpPT09VGgpe2Zvcig7YSsrPHUmJnQuY2hhckNvZGVBdChhKSE9PVRofHx0LmNoYXJDb2RlQXQoKythKT09PVRoOyk7cmV0dXJuKG49YSk+PXU/cz0hMDooZT10LmNoYXJDb2RlQXQoYSsrKSk9PT1OaD9mPSEwOmU9PT1raCYmKGY9ITAsdC5jaGFyQ29kZUF0KGEpPT09TmgmJisrYSksdC5zbGljZShyKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPHU7KXtpZigoZT10LmNoYXJDb2RlQXQobj1hKyspKT09PU5oKWY9ITA7ZWxzZSBpZihlPT09a2gpZj0hMCx0LmNoYXJDb2RlQXQoYSk9PT1OaCYmKythO2Vsc2UgaWYoZSE9PW8pY29udGludWU7cmV0dXJuIHQuc2xpY2UocixuKX1yZXR1cm4gcz0hMCx0LnNsaWNlKHIsdSl9dmFyIHIsaT1bXSx1PXQubGVuZ3RoLGE9MCxjPTAscz11PD0wLGY9ITE7Zm9yKHQuY2hhckNvZGVBdCh1LTEpPT09TmgmJi0tdSx0LmNoYXJDb2RlQXQodS0xKT09PWtoJiYtLXU7KHI9ZSgpKSE9PU1oOyl7Zm9yKHZhciBsPVtdO3IhPT13aCYmciE9PU1oOylsLnB1c2gocikscj1lKCk7biYmbnVsbD09KGw9bihsLGMrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAocikuam9pbih0KX1mdW5jdGlvbiByKHQpe3JldHVybiBudWxsPT10PyIiOmkudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXZhciBpPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLG89dC5jaGFyQ29kZUF0KDApO3JldHVybntwYXJzZTpmdW5jdGlvbih0LGUpe3ZhciByLGksbz1uKHQsZnVuY3Rpb24odCxuKXtpZihyKXJldHVybiByKHQsbi0xKTtpPXQscj1lP2Z1bmN0aW9uKHQsbil7dmFyIGU9Z2UodCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxlKTpnZSh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOm4sZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKHIpLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHIoblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGUpLmpvaW4oIlxuIil9fX1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbWUoKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24geGUodCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sdSxhLGMscyxmLGwsaCxwPXQuX3Jvb3QsZD17ZGF0YTpyfSx2PXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWQsdDtmb3IoO3AubGVuZ3RoOylpZigocz1uPj0obz0oditfKS8yKSk/dj1vOl89bywoZj1lPj0odT0oZyt5KS8yKSk/Zz11Onk9dSxpPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gaVtsXT1kLHQ7aWYoYT0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLG49PT1hJiZlPT09YylyZXR1cm4gZC5uZXh0PXAsaT9pW2xdPWQ6dC5fcm9vdD1kLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChzPW4+PShvPSh2K18pLzIpKT92PW86Xz1vLChmPWU+PSh1PShnK3kpLzIpKT9nPXU6eT11fXdoaWxlKChsPWY8PDF8cyk9PShoPShjPj11KTw8MXxhPj1vKSk7cmV0dXJuIGlbaF09cCxpW2xdPWQsdH1mdW5jdGlvbiBiZSh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBUZSh0LG4sZSl7dmFyIHI9bmV3IE5lKG51bGw9PW4/d2U6bixudWxsPT1lP01lOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIE5lKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24ga2UodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufWZ1bmN0aW9uIFNlKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBFZSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gQ2UodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gemUodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBQZSh0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIFJlKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIExlKHQpe3JldHVybih0PVJlKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59ZnVuY3Rpb24gcWUodCxuKXt2YXIgZT1SZSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWZ1bmN0aW9uIERlKHQpe3JldHVybiBuZXcgVWUodCl9ZnVuY3Rpb24gVWUodCl7aWYoIShuPUJoLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG4sZT1uWzFdfHwiICIscj1uWzJdfHwiPiIsaT1uWzNdfHwiLSIsbz1uWzRdfHwiIix1PSEhbls1XSxhPW5bNl0mJituWzZdLGM9ISFuWzddLHM9bls4XSYmK25bOF0uc2xpY2UoMSksZj1uWzldfHwiIjsibiI9PT1mPyhjPSEwLGY9ImciKTpZaFtmXXx8KGY9IiIpLCh1fHwiMCI9PT1lJiYiPSI9PT1yKSYmKHU9ITAsZT0iMCIscj0iPSIpLHRoaXMuZmlsbD1lLHRoaXMuYWxpZ249cix0aGlzLnNpZ249aSx0aGlzLnN5bWJvbD1vLHRoaXMuemVybz11LHRoaXMud2lkdGg9YSx0aGlzLmNvbW1hPWMsdGhpcy5wcmVjaXNpb249cyx0aGlzLnR5cGU9Zn1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBGZSh0KXtmdW5jdGlvbiBuKHQpe2Z1bmN0aW9uIG4odCl7dmFyIG4scix1LGY9Zyx4PV87aWYoImMiPT09dil4PXkodCkreCx0PSIiO2Vsc2V7dmFyIGI9KHQ9K3QpPDA7aWYodD15KE1hdGguYWJzKHQpLGQpLGImJjA9PSt0JiYoYj0hMSksZj0oYj8iKCI9PT1zP3M6Ii0iOiItIj09PXN8fCIoIj09PXM/IiI6cykrZix4PSgicyI9PT12P2poWzgrT2gvM106IiIpK3grKGImJiIoIj09PXM/IikiOiIiKSxtKWZvcihuPS0xLHI9dC5sZW5ndGg7KytuPHI7KWlmKDQ4Pih1PXQuY2hhckNvZGVBdChuKSl8fHU+NTcpe3g9KDQ2PT09dT9pK3Quc2xpY2UobisxKTp0LnNsaWNlKG4pKSt4LHQ9dC5zbGljZSgwLG4pO2JyZWFrfX1wJiYhbCYmKHQ9ZSh0LDEvMCkpO3ZhciB3PWYubGVuZ3RoK3QubGVuZ3RoK3gubGVuZ3RoLE09dzxoP25ldyBBcnJheShoLXcrMSkuam9pbihhKToiIjtzd2l0Y2gocCYmbCYmKHQ9ZShNK3QsTS5sZW5ndGg/aC14Lmxlbmd0aDoxLzApLE09IiIpLGMpe2Nhc2UiPCI6dD1mK3QreCtNO2JyZWFrO2Nhc2UiPSI6dD1mK00rdCt4O2JyZWFrO2Nhc2UiXiI6dD1NLnNsaWNlKDAsdz1NLmxlbmd0aD4+MSkrZit0K3grTS5zbGljZSh3KTticmVhaztkZWZhdWx0OnQ9TStmK3QreH1yZXR1cm4gbyh0KX12YXIgYT0odD1EZSh0KSkuZmlsbCxjPXQuYWxpZ24scz10LnNpZ24sZj10LnN5bWJvbCxsPXQuemVybyxoPXQud2lkdGgscD10LmNvbW1hLGQ9dC5wcmVjaXNpb24sdj10LnR5cGUsZz0iJCI9PT1mP3JbMF06IiMiPT09ZiYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLF89IiQiPT09Zj9yWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIseT1ZaFt2XSxtPSF2fHwvW2RlZmdwcnMlXS8udGVzdCh2KTtyZXR1cm4gZD1udWxsPT1kP3Y/NjoxMjovW2dwcnNdLy50ZXN0KHYpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZCkpLG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbn12YXIgZT10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIpe2Zvcih2YXIgaT1lLmxlbmd0aCxvPVtdLHU9MCxhPXRbMF0sYz0wO2k+MCYmYT4wJiYoYythKzE+ciYmKGE9TWF0aC5tYXgoMSxyLWMpKSxvLnB1c2goZS5zdWJzdHJpbmcoaS09YSxpK2EpKSwhKChjKz1hKzEpPnIpKTspYT10W3U9KHUrMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKG4pfX0odC5ncm91cGluZyx0LnRob3VzYW5kcyk6T2Uscj10LmN1cnJlbmN5LGk9dC5kZWNpbWFsLG89dC5udW1lcmFscz9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19KHQubnVtZXJhbHMpOk9lLHU9dC5wZXJjZW50fHwiJSI7cmV0dXJue2Zvcm1hdDpuLGZvcm1hdFByZWZpeDpmdW5jdGlvbih0LGUpe3ZhciByPW4oKHQ9RGUodCksdC50eXBlPSJmIix0KSksaT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihMZShlKS8zKSkpLG89TWF0aC5wb3coMTAsLWkpLHU9amhbOCtpLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcihvKnQpK3V9fX19ZnVuY3Rpb24gSWUobil7cmV0dXJuIEhoPUZlKG4pLHQuZm9ybWF0PUhoLmZvcm1hdCx0LmZvcm1hdFByZWZpeD1IaC5mb3JtYXRQcmVmaXgsSGh9ZnVuY3Rpb24gWWUodCl7cmV0dXJuIE1hdGgubWF4KDAsLUxlKE1hdGguYWJzKHQpKSl9ZnVuY3Rpb24gQmUodCxuKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihMZShuKS8zKSkpLUxlKE1hdGguYWJzKHQpKSl9ZnVuY3Rpb24gSGUodCxuKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLXQsTWF0aC5tYXgoMCxMZShuKS1MZSh0KSkrMX1mdW5jdGlvbiBqZSgpe3JldHVybiBuZXcgWGV9ZnVuY3Rpb24gWGUoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gVmUodCxuLGUpe3ZhciByPXQucz1uK2UsaT1yLW4sbz1yLWk7dC50PW4tbysoZS1pKX1mdW5jdGlvbiAkZSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9OcDpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIHQ+MT9rcDp0PC0xPy1rcDpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gWmUodCl7cmV0dXJuKHQ9RnAodC8yKSkqdH1mdW5jdGlvbiBHZSgpe31mdW5jdGlvbiBRZSh0LG4pe3QmJmpwLmhhc093blByb3BlcnR5KHQudHlwZSkmJmpwW3QudHlwZV0odCxuKX1mdW5jdGlvbiBKZSh0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBLZSh0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KUplKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB0cih0LG4pe3QmJkhwLmhhc093blByb3BlcnR5KHQudHlwZSk/SHBbdC50eXBlXSh0LG4pOlFlKHQsbil9ZnVuY3Rpb24gbnIoKXskcC5wb2ludD1ycn1mdW5jdGlvbiBlcigpe2lyKFhoLFZoKX1mdW5jdGlvbiBycih0LG4peyRwLnBvaW50PWlyLFhoPXQsVmg9biwkaD10Kj1DcCxXaD1McChuPShuKj1DcCkvMitTcCksWmg9RnAobil9ZnVuY3Rpb24gaXIodCxuKXtuPShuKj1DcCkvMitTcDt2YXIgZT0odCo9Q3ApLSRoLHI9ZT49MD8xOi0xLGk9ciplLG89THAobiksdT1GcChuKSxhPVpoKnUsYz1XaCpvK2EqTHAoaSkscz1hKnIqRnAoaSk7WHAuYWRkKFJwKHMsYykpLCRoPXQsV2g9byxaaD11fWZ1bmN0aW9uIG9yKHQpe3JldHVybltScCh0WzFdLHRbMF0pLFdlKHRbMl0pXX1mdW5jdGlvbiB1cih0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUxwKGUpO3JldHVybltyKkxwKG4pLHIqRnAobiksRnAoZSldfWZ1bmN0aW9uIGFyKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIGNyKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBzcih0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIGZyKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBscih0KXt2YXIgbj1ZcCh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59ZnVuY3Rpb24gaHIodCxuKXtpcC5wdXNoKG9wPVtHaD10LEpoPXRdKSxuPFFoJiYoUWg9biksbj5LaCYmKEtoPW4pfWZ1bmN0aW9uIHByKHQsbil7dmFyIGU9dXIoW3QqQ3AsbipDcF0pO2lmKHJwKXt2YXIgcj1jcihycCxlKSxpPWNyKFtyWzFdLC1yWzBdLDBdLHIpO2xyKGkpLGk9b3IoaSk7dmFyIG8sdT10LXRwLGE9dT4wPzE6LTEsYz1pWzBdKkFwKmEscz16cCh1KT4xODA7c14oYSp0cDxjJiZjPGEqdCk/KG89aVsxXSpBcCk+S2gmJihLaD1vKTooYz0oYyszNjApJTM2MC0xODAsc14oYSp0cDxjJiZjPGEqdCk/KG89LWlbMV0qQXApPFFoJiYoUWg9byk6KG48UWgmJihRaD1uKSxuPktoJiYoS2g9bikpKSxzP3Q8dHA/bXIoR2gsdCk+bXIoR2gsSmgpJiYoSmg9dCk6bXIodCxKaCk+bXIoR2gsSmgpJiYoR2g9dCk6Smg+PUdoPyh0PEdoJiYoR2g9dCksdD5KaCYmKEpoPXQpKTp0PnRwP21yKEdoLHQpPm1yKEdoLEpoKSYmKEpoPXQpOm1yKHQsSmgpPm1yKEdoLEpoKSYmKEdoPXQpfWVsc2UgaXAucHVzaChvcD1bR2g9dCxKaD10XSk7bjxRaCYmKFFoPW4pLG4+S2gmJihLaD1uKSxycD1lLHRwPXR9ZnVuY3Rpb24gZHIoKXtacC5wb2ludD1wcn1mdW5jdGlvbiB2cigpe29wWzBdPUdoLG9wWzFdPUpoLFpwLnBvaW50PWhyLHJwPW51bGx9ZnVuY3Rpb24gZ3IodCxuKXtpZihycCl7dmFyIGU9dC10cDtXcC5hZGQoenAoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBucD10LGVwPW47JHAucG9pbnQodCxuKSxwcih0LG4pfWZ1bmN0aW9uIF9yKCl7JHAubGluZVN0YXJ0KCl9ZnVuY3Rpb24geXIoKXtncihucCxlcCksJHAubGluZUVuZCgpLHpwKFdwKT5NcCYmKEdoPS0oSmg9MTgwKSksb3BbMF09R2gsb3BbMV09SmgscnA9bnVsbH1mdW5jdGlvbiBtcih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24geHIodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIGJyKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn1mdW5jdGlvbiB3cih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKTtNcihlKkxwKHQpLGUqRnAodCksRnAobikpfWZ1bmN0aW9uIE1yKHQsbixlKXtjcCs9KHQtY3ApLysrdXAsc3ArPShuLXNwKS91cCxmcCs9KGUtZnApL3VwfWZ1bmN0aW9uIFRyKCl7R3AucG9pbnQ9TnJ9ZnVuY3Rpb24gTnIodCxuKXt0Kj1DcDt2YXIgZT1McChuKj1DcCk7bXA9ZSpMcCh0KSx4cD1lKkZwKHQpLGJwPUZwKG4pLEdwLnBvaW50PWtyLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiBrcih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKSxyPWUqTHAodCksaT1lKkZwKHQpLG89RnAobiksdT1ScChZcCgodT14cCpvLWJwKmkpKnUrKHU9YnAqci1tcCpvKSp1Kyh1PW1wKmkteHAqcikqdSksbXAqcit4cCppK2JwKm8pO2FwKz11LGxwKz11KihtcCsobXA9cikpLGhwKz11Kih4cCsoeHA9aSkpLHBwKz11KihicCsoYnA9bykpLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiBTcigpe0dwLnBvaW50PXdyfWZ1bmN0aW9uIEVyKCl7R3AucG9pbnQ9Q3J9ZnVuY3Rpb24gQXIoKXt6cihfcCx5cCksR3AucG9pbnQ9d3J9ZnVuY3Rpb24gQ3IodCxuKXtfcD10LHlwPW4sdCo9Q3Asbio9Q3AsR3AucG9pbnQ9enI7dmFyIGU9THAobik7bXA9ZSpMcCh0KSx4cD1lKkZwKHQpLGJwPUZwKG4pLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiB6cih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKSxyPWUqTHAodCksaT1lKkZwKHQpLG89RnAobiksdT14cCpvLWJwKmksYT1icCpyLW1wKm8sYz1tcCppLXhwKnIscz1ZcCh1KnUrYSphK2MqYyksZj1XZShzKSxsPXMmJi1mL3M7ZHArPWwqdSx2cCs9bCphLGdwKz1sKmMsYXArPWYsbHArPWYqKG1wKyhtcD1yKSksaHArPWYqKHhwKyh4cD1pKSkscHArPWYqKGJwKyhicD1vKSksTXIobXAseHAsYnApfWZ1bmN0aW9uIFByKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBScih0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybihlPW4uaW52ZXJ0KGUscikpJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiBMcih0LG4pe3JldHVyblt0Pk5wP3QtRXA6dDwtTnA/dCtFcDp0LG5dfWZ1bmN0aW9uIHFyKHQsbixlKXtyZXR1cm4odCU9RXApP258fGU/UnIoVXIodCksT3IobixlKSk6VXIodCk6bnx8ZT9PcihuLGUpOkxyfWZ1bmN0aW9uIERyKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPk5wP24tRXA6bjwtTnA/bitFcDpuLGVdfX1mdW5jdGlvbiBVcih0KXt2YXIgbj1Ecih0KTtyZXR1cm4gbi5pbnZlcnQ9RHIoLXQpLG59ZnVuY3Rpb24gT3IodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9THAobiksYT1McCh0KSplLGM9RnAodCkqZSxzPUZwKG4pLGY9cypyK2EqaTtyZXR1cm5bUnAoYypvLWYqdSxhKnItcyppKSxXZShmKm8rYyp1KV19dmFyIHI9THAodCksaT1GcCh0KSxvPUxwKG4pLHU9RnAobik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9THAobiksYT1McCh0KSplLGM9RnAodCkqZSxzPUZwKG4pLGY9cypvLWMqdTtyZXR1cm5bUnAoYypvK3MqdSxhKnIrZippKSxXZShmKnItYSppKV19LGV9ZnVuY3Rpb24gRnIodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbj10KG5bMF0qQ3AsblsxXSpDcCksblswXSo9QXAsblsxXSo9QXAsbn1yZXR1cm4gdD1xcih0WzBdKkNwLHRbMV0qQ3AsdC5sZW5ndGg+Mj90WzJdKkNwOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBuPXQuaW52ZXJ0KG5bMF0qQ3AsblsxXSpDcCksblswXSo9QXAsblsxXSo9QXAsbn0sbn1mdW5jdGlvbiBJcih0LG4sZSxyLGksbyl7aWYoZSl7dmFyIHU9THAobiksYT1GcChuKSxjPXIqZTtudWxsPT1pPyhpPW4rcipFcCxvPW4tYy8yKTooaT1Zcih1LGkpLG89WXIodSxvKSwocj4wP2k8bzppPm8pJiYoaSs9cipFcCkpO2Zvcih2YXIgcyxmPWk7cj4wP2Y+bzpmPG87Zi09YylzPW9yKFt1LC1hKkxwKGYpLC1hKkZwKGYpXSksdC5wb2ludChzWzBdLHNbMV0pfX1mdW5jdGlvbiBZcih0LG4peyhuPXVyKG4pKVswXS09dCxscihuKTt2YXIgZT0kZSgtblsxXSk7cmV0dXJuKCgtblsyXTwwPy1lOmUpK0VwLU1wKSVFcH1mdW5jdGlvbiBCcigpe3ZhciB0LG49W107cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sZSl7dC5wdXNoKFtuLGVdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5wdXNoKHQ9W10pfSxsaW5lRW5kOkdlLHJlam9pbjpmdW5jdGlvbigpe24ubGVuZ3RoPjEmJm4ucHVzaChuLnBvcCgpLmNvbmNhdChuLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9bjtyZXR1cm4gbj1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIEhyKHQsbil7cmV0dXJuIHpwKHRbMF0tblswXSk8TXAmJnpwKHRbMV0tblsxXSk8TXB9ZnVuY3Rpb24ganIodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBYcih0LG4sZSxyLGkpe3ZhciBvLHUsYT1bXSxjPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sdT10W25dO2lmKEhyKHIsdSkpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPG47KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7aS5saW5lRW5kKCl9ZWxzZSBhLnB1c2goZT1uZXcganIocix0LG51bGwsITApKSxjLnB1c2goZS5vPW5ldyBqcihyLG51bGwsZSwhMSkpLGEucHVzaChlPW5ldyBqcih1LHQsbnVsbCwhMSkpLGMucHVzaChlLm89bmV3IGpyKHUsbnVsbCxlLCEwKSl9fSksYS5sZW5ndGgpe2ZvcihjLnNvcnQobiksVnIoYSksVnIoYyksbz0wLHU9Yy5sZW5ndGg7bzx1OysrbyljW29dLmU9ZT0hZTtmb3IodmFyIHMsZixsPWFbMF07Oyl7Zm9yKHZhciBoPWwscD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtzPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKHApZm9yKG89MCx1PXMubGVuZ3RoO288dTsrK28paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihwKWZvcihzPWgucC56LG89cy5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9cz0oaD1oLm8pLnoscD0hcH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFZyKHQpe2lmKG49dC5sZW5ndGgpe2Zvcih2YXIgbixlLHI9MCxpPXRbMF07KytyPG47KWkubj1lPXRbcl0sZS5wPWksaT1lO2kubj1lPXRbMF0sZS5wPWl9fWZ1bmN0aW9uICRyKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1bRnAoZSksLUxwKGUpLDBdLG89MCx1PTA7Y2QucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2E8YzsrK2EpaWYoZj0ocz10W2FdKS5sZW5ndGgpZm9yKHZhciBzLGYsbD1zW2YtMV0saD1sWzBdLHA9bFsxXS8yK1NwLGQ9RnAocCksdj1McChwKSxnPTA7ZzxmOysrZyxoPXksZD14LHY9YixsPV8pe3ZhciBfPXNbZ10seT1fWzBdLG09X1sxXS8yK1NwLHg9RnAobSksYj1McChtKSx3PXktaCxNPXc+PTA/MTotMSxUPU0qdyxOPVQ+TnAsaz1kKng7aWYoY2QuYWRkKFJwKGsqTSpGcChUKSx2KmIraypMcChUKSkpLG8rPU4/dytNKkVwOncsTl5oPj1lXnk+PWUpe3ZhciBTPWNyKHVyKGwpLHVyKF8pKTtscihTKTt2YXIgRT1jcihpLFMpO2xyKEUpO3ZhciBBPShOXnc+PTA/LTE6MSkqV2UoRVsyXSk7KHI+QXx8cj09PUEmJihTWzBdfHxTWzFdKSkmJih1Kz1OXnc+PTA/MTotMSl9fXJldHVybihvPC1NcHx8bzxNcCYmY2Q8LU1wKV4xJnV9ZnVuY3Rpb24gV3IodCxuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe2Z1bmN0aW9uIG8obixlKXt0KG4sZSkmJmkucG9pbnQobixlKX1mdW5jdGlvbiB1KHQsbil7di5wb2ludCh0LG4pfWZ1bmN0aW9uIGEoKXt4LnBvaW50PXUsdi5saW5lU3RhcnQoKX1mdW5jdGlvbiBjKCl7eC5wb2ludD1vLHYubGluZUVuZCgpfWZ1bmN0aW9uIHModCxuKXtkLnB1c2goW3Qsbl0pLHkucG9pbnQodCxuKX1mdW5jdGlvbiBmKCl7eS5saW5lU3RhcnQoKSxkPVtdfWZ1bmN0aW9uIGwoKXtzKGRbMF1bMF0sZFswXVsxXSkseS5saW5lRW5kKCk7dmFyIHQsbixlLHIsbz15LmNsZWFuKCksdT1fLnJlc3VsdCgpLGE9dS5sZW5ndGg7aWYoZC5wb3AoKSxoLnB1c2goZCksZD1udWxsLGEpaWYoMSZvKXtpZihlPXVbMF0sKG49ZS5sZW5ndGgtMSk+MCl7Zm9yKG18fChpLnBvbHlnb25TdGFydCgpLG09ITApLGkubGluZVN0YXJ0KCksdD0wO3Q8bjsrK3QpaS5wb2ludCgocj1lW3RdKVswXSxyWzFdKTtpLmxpbmVFbmQoKX19ZWxzZSBhPjEmJjImbyYmdS5wdXNoKHUucG9wKCkuY29uY2F0KHUuc2hpZnQoKSkpLHAucHVzaCh1LmZpbHRlcihacikpfXZhciBoLHAsZCx2PW4oaSksXz1CcigpLHk9bihfKSxtPSExLHg9e3BvaW50Om8sbGluZVN0YXJ0OmEsbGluZUVuZDpjLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9cyx4LmxpbmVTdGFydD1mLHgubGluZUVuZD1sLHA9W10saD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3gucG9pbnQ9byx4LmxpbmVTdGFydD1hLHgubGluZUVuZD1jLHA9ZyhwKTt2YXIgdD0kcihoLHIpO3AubGVuZ3RoPyhtfHwoaS5wb2x5Z29uU3RhcnQoKSxtPSEwKSxYcihwLEdyLHQsZSxpKSk6dCYmKG18fChpLnBvbHlnb25TdGFydCgpLG09ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksbSYmKGkucG9seWdvbkVuZCgpLG09ITEpLHA9aD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19O3JldHVybiB4fX1mdW5jdGlvbiBacih0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBHcih0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS1rcC1NcDprcC10WzFdKS0oKG49bi54KVswXTwwP25bMV0ta3AtTXA6a3AtblsxXSl9ZnVuY3Rpb24gUXIodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBMcCh0KSpMcChuKT5pfWZ1bmN0aW9uIGUodCxuLGUpe3ZhciByPVsxLDAsMF0sbz1jcih1cih0KSx1cihuKSksdT1hcihvLG8pLGE9b1swXSxjPXUtYSphO2lmKCFjKXJldHVybiFlJiZ0O3ZhciBzPWkqdS9jLGY9LWkqYS9jLGw9Y3IocixvKSxoPWZyKHIscyk7c3IoaCxmcihvLGYpKTt2YXIgcD1sLGQ9YXIoaCxwKSx2PWFyKHAscCksZz1kKmQtdiooYXIoaCxoKS0xKTtpZighKGc8MCkpe3ZhciBfPVlwKGcpLHk9ZnIocCwoLWQtXykvdik7aWYoc3IoeSxoKSx5PW9yKHkpLCFlKXJldHVybiB5O3ZhciBtLHg9dFswXSxiPW5bMF0sdz10WzFdLE09blsxXTtiPHgmJihtPXgseD1iLGI9bSk7dmFyIFQ9Yi14LE49enAoVC1OcCk8TXA7aWYoIU4mJk08dyYmKG09dyx3PU0sTT1tKSxOfHxUPE1wP04/dytNPjBeeVsxXTwoenAoeVswXS14KTxNcD93Ok0pOnc8PXlbMV0mJnlbMV08PU06VD5OcF4oeDw9eVswXSYmeVswXTw9Yikpe3ZhciBrPWZyKHAsKC1kK18pL3YpO3JldHVybiBzcihrLGgpLFt5LG9yKGspXX19fWZ1bmN0aW9uIHIobixlKXt2YXIgcj11P3Q6TnAtdCxpPTA7cmV0dXJuIG48LXI/aXw9MTpuPnImJihpfD0yKSxlPC1yP2l8PTQ6ZT5yJiYoaXw9OCksaX12YXIgaT1McCh0KSxvPTYqQ3AsdT1pPjAsYT16cChpKT5NcDtyZXR1cm4gV3IobixmdW5jdGlvbih0KXt2YXIgaSxvLGMscyxmO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtzPWM9ITEsZj0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBwLGQ9W2wsaF0sdj1uKGwsaCksZz11P3Y/MDpyKGwsaCk6dj9yKGwrKGw8MD9OcDotTnApLGgpOjA7aWYoIWkmJihzPWM9dikmJnQubGluZVN0YXJ0KCksdiE9PWMmJighKHA9ZShpLGQpKXx8SHIoaSxwKXx8SHIoZCxwKSkmJihkWzBdKz1NcCxkWzFdKz1NcCx2PW4oZFswXSxkWzFdKSksdiE9PWMpZj0wLHY/KHQubGluZVN0YXJ0KCkscD1lKGQsaSksdC5wb2ludChwWzBdLHBbMV0pKToocD1lKGksZCksdC5wb2ludChwWzBdLHBbMV0pLHQubGluZUVuZCgpKSxpPXA7ZWxzZSBpZihhJiZpJiZ1XnYpe3ZhciBfO2cmb3x8IShfPWUoZCxpLCEwKSl8fChmPTAsdT8odC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSksdC5wb2ludChfWzFdWzBdLF9bMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludChfWzFdWzBdLF9bMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChfWzBdWzBdLF9bMF1bMV0pKSl9IXZ8fGkmJkhyKGksZCl8fHQucG9pbnQoZFswXSxkWzFdKSxpPWQsYz12LG89Z30sbGluZUVuZDpmdW5jdGlvbigpe2MmJnQubGluZUVuZCgpLGk9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gZnwocyYmYyk8PDF9fX0sZnVuY3Rpb24obixlLHIsaSl7SXIoaSx0LG8scixuLGUpfSx1P1swLC10XTpbLU5wLHQtTnBdKX1mdW5jdGlvbiBKcih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKWRve3MucG9pbnQoMD09PWZ8fDM9PT1mP3Q6ZSxmPjE/cjpuKX13aGlsZSgoZj0oZithKzQpJTQpIT09bCk7ZWxzZSBzLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gdShyLGkpe3JldHVybiB6cChyWzBdLXQpPE1wP2k+MD8wOjM6enAoclswXS1lKTxNcD9pPjA/MjoxOnpwKHJbMV0tbik8TXA/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxuKXtyZXR1cm4gYyh0Lngsbi54KX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9dSh0LDEpLHI9dShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbih1KXtmdW5jdGlvbiBjKHQsbil7aSh0LG4pJiZ3LnBvaW50KHQsbil9ZnVuY3Rpb24gcyhvLHUpe3ZhciBhPWkobyx1KTtpZihsJiZoLnB1c2goW28sdV0pLHgpcD1vLGQ9dSx2PWEseD0hMSxhJiYody5saW5lU3RhcnQoKSx3LnBvaW50KG8sdSkpO2Vsc2UgaWYoYSYmbSl3LnBvaW50KG8sdSk7ZWxzZXt2YXIgYz1bXz1NYXRoLm1heChsZCxNYXRoLm1pbihmZCxfKSkseT1NYXRoLm1heChsZCxNYXRoLm1pbihmZCx5KSldLHM9W289TWF0aC5tYXgobGQsTWF0aC5taW4oZmQsbykpLHU9TWF0aC5tYXgobGQsTWF0aC5taW4oZmQsdSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1LGE9dFswXSxjPXRbMV0scz0wLGY9MSxsPW5bMF0tYSxoPW5bMV0tYztpZih1PWUtYSxsfHwhKHU+MCkpe2lmKHUvPWwsbDwwKXtpZih1PHMpcmV0dXJuO3U8ZiYmKGY9dSl9ZWxzZSBpZihsPjApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1pZih1PWktYSxsfHwhKHU8MCkpe2lmKHUvPWwsbDwwKXtpZih1PmYpcmV0dXJuO3U+cyYmKHM9dSl9ZWxzZSBpZihsPjApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1pZih1PXItYyxofHwhKHU+MCkpe2lmKHUvPWgsaDwwKXtpZih1PHMpcmV0dXJuO3U8ZiYmKGY9dSl9ZWxzZSBpZihoPjApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1pZih1PW8tYyxofHwhKHU8MCkpe2lmKHUvPWgsaDwwKXtpZih1PmYpcmV0dXJuO3U+cyYmKHM9dSl9ZWxzZSBpZihoPjApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1yZXR1cm4gcz4wJiYodFswXT1hK3MqbCx0WzFdPWMrcypoKSxmPDEmJihuWzBdPWErZipsLG5bMV09YytmKmgpLCEwfX19fX0oYyxzLHQsbixlLHIpP2EmJih3LmxpbmVTdGFydCgpLHcucG9pbnQobyx1KSxiPSExKToobXx8KHcubGluZVN0YXJ0KCksdy5wb2ludChjWzBdLGNbMV0pKSx3LnBvaW50KHNbMF0sc1sxXSksYXx8dy5saW5lRW5kKCksYj0hMSl9Xz1vLHk9dSxtPWF9dmFyIGYsbCxoLHAsZCx2LF8seSxtLHgsYix3PXUsTT1CcigpLFQ9e3BvaW50OmMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7VC5wb2ludD1zLGwmJmwucHVzaChoPVtdKSx4PSEwLG09ITEsXz15PU5hTn0sbGluZUVuZDpmdW5jdGlvbigpe2YmJihzKHAsZCksdiYmbSYmTS5yZWpvaW4oKSxmLnB1c2goTS5yZXN1bHQoKSkpLFQucG9pbnQ9YyxtJiZ3LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dz1NLGY9W10sbD1bXSxiPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49ZnVuY3Rpb24oKXtmb3IodmFyIG49MCxlPTAsaT1sLmxlbmd0aDtlPGk7KytlKWZvcih2YXIgbyx1LGE9bFtlXSxjPTEscz1hLmxlbmd0aCxmPWFbMF0saD1mWzBdLHA9ZlsxXTtjPHM7KytjKW89aCx1PXAsaD0oZj1hW2NdKVswXSxwPWZbMV0sdTw9cj9wPnImJihoLW8pKihyLXUpPihwLXUpKih0LW8pJiYrK246cDw9ciYmKGgtbykqKHItdSk8KHAtdSkqKHQtbykmJi0tbjtyZXR1cm4gbn0oKSxlPWImJm4saT0oZj1nKGYpKS5sZW5ndGg7KGV8fGkpJiYodS5wb2x5Z29uU3RhcnQoKSxlJiYodS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHUpLHUubGluZUVuZCgpKSxpJiZYcihmLGEsbixvLHUpLHUucG9seWdvbkVuZCgpKSx3PXUsZj1sPWg9bnVsbH19O3JldHVybiBUfX1mdW5jdGlvbiBLcigpe3BkLnBvaW50PXBkLmxpbmVFbmQ9R2V9ZnVuY3Rpb24gdGkodCxuKXtRcD10Kj1DcCxKcD1GcChuKj1DcCksS3A9THAobikscGQucG9pbnQ9bml9ZnVuY3Rpb24gbmkodCxuKXt0Kj1DcDt2YXIgZT1GcChuKj1DcCkscj1McChuKSxpPXpwKHQtUXApLG89THAoaSksdT1yKkZwKGkpLGE9S3AqZS1KcCpyKm8sYz1KcCplK0twKnIqbztoZC5hZGQoUnAoWXAodSp1K2EqYSksYykpLFFwPXQsSnA9ZSxLcD1yfWZ1bmN0aW9uIGVpKHQpe3JldHVybiBoZC5yZXNldCgpLHRyKHQscGQpLCtoZH1mdW5jdGlvbiByaSh0LG4pe3JldHVybiBkZFswXT10LGRkWzFdPW4sZWkodmQpfWZ1bmN0aW9uIGlpKHQsbil7cmV0dXJuISghdHx8IV9kLmhhc093blByb3BlcnR5KHQudHlwZSkpJiZfZFt0LnR5cGVdKHQsbil9ZnVuY3Rpb24gb2kodCxuKXtyZXR1cm4gMD09PXJpKHQsbil9ZnVuY3Rpb24gdWkodCxuKXt2YXIgZT1yaSh0WzBdLHRbMV0pO3JldHVybiByaSh0WzBdLG4pK3JpKG4sdFsxXSk8PWUrTXB9ZnVuY3Rpb24gYWkodCxuKXtyZXR1cm4hISRyKHQubWFwKGNpKSxzaShuKSl9ZnVuY3Rpb24gY2kodCl7cmV0dXJuKHQ9dC5tYXAoc2kpKS5wb3AoKSx0fWZ1bmN0aW9uIHNpKHQpe3JldHVyblt0WzBdKkNwLHRbMV0qQ3BdfWZ1bmN0aW9uIGZpKHQsbixlKXt2YXIgcj1mKHQsbi1NcCxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBsaSh0LG4sZSl7dmFyIHI9Zih0LG4tTXAsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gaGkoKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bigpfX1mdW5jdGlvbiBuKCl7cmV0dXJuIGYocXAoby9fKSpfLGksXykubWFwKHApLmNvbmNhdChmKHFwKHMveSkqeSxjLHkpLm1hcChkKSkuY29uY2F0KGYocXAoci92KSp2LGUsdikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB6cCh0JV8pPk1wfSkubWFwKGwpKS5jb25jYXQoZihxcChhL2cpKmcsdSxnKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHpwKHQleSk+TXB9KS5tYXAoaCkpfXZhciBlLHIsaSxvLHUsYSxjLHMsbCxoLHAsZCx2PTEwLGc9dixfPTkwLHk9MzYwLG09Mi41O3JldHVybiB0LmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSl9LHQub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbcChvKS5jb25jYXQoZChjKS5zbGljZSgxKSxwKGkpLnJldmVyc2UoKS5zbGljZSgxKSxkKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5leHRlbnRNYWpvcihuKS5leHRlbnRNaW5vcihuKTp0LmV4dGVudE1pbm9yKCl9LHQuZXh0ZW50TWFqb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMF0saT0rblsxXVswXSxzPStuWzBdWzFdLGM9K25bMV1bMV0sbz5pJiYobj1vLG89aSxpPW4pLHM+YyYmKG49cyxzPWMsYz1uKSx0LnByZWNpc2lvbihtKSk6W1tvLHNdLFtpLGNdXX0sdC5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rblswXVswXSxlPStuWzFdWzBdLGE9K25bMF1bMV0sdT0rblsxXVsxXSxyPmUmJihuPXIscj1lLGU9biksYT51JiYobj1hLGE9dSx1PW4pLHQucHJlY2lzaW9uKG0pKTpbW3IsYV0sW2UsdV1dfSx0LnN0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5zdGVwTWFqb3Iobikuc3RlcE1pbm9yKG4pOnQuc3RlcE1pbm9yKCl9LHQuc3RlcE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPStuWzBdLHk9K25bMV0sdCk6W18seV19LHQuc3RlcE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PStuWzBdLGc9K25bMV0sdCk6W3YsZ119LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPStuLGw9ZmkoYSx1LDkwKSxoPWxpKHIsZSxtKSxwPWZpKHMsYyw5MCksZD1saShvLGksbSksdCk6bX0sdC5leHRlbnRNYWpvcihbWy0xODAsLTkwK01wXSxbMTgwLDkwLU1wXV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAtTXBdLFsxODAsODArTXBdXSl9ZnVuY3Rpb24gcGkodCl7cmV0dXJuIHR9ZnVuY3Rpb24gZGkoKXt4ZC5wb2ludD12aX1mdW5jdGlvbiB2aSh0LG4pe3hkLnBvaW50PWdpLHRkPWVkPXQsbmQ9cmQ9bn1mdW5jdGlvbiBnaSh0LG4pe21kLmFkZChyZCp0LWVkKm4pLGVkPXQscmQ9bn1mdW5jdGlvbiBfaSgpe2dpKHRkLG5kKX1mdW5jdGlvbiB5aSh0LG4pe2tkKz10LFNkKz1uLCsrRWR9ZnVuY3Rpb24gbWkoKXtxZC5wb2ludD14aX1mdW5jdGlvbiB4aSh0LG4pe3FkLnBvaW50PWJpLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gYmkodCxuKXt2YXIgZT10LXVkLHI9bi1hZCxpPVlwKGUqZStyKnIpO0FkKz1pKih1ZCt0KS8yLENkKz1pKihhZCtuKS8yLHpkKz1pLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gd2koKXtxZC5wb2ludD15aX1mdW5jdGlvbiBNaSgpe3FkLnBvaW50PU5pfWZ1bmN0aW9uIFRpKCl7a2koaWQsb2QpfWZ1bmN0aW9uIE5pKHQsbil7cWQucG9pbnQ9a2kseWkoaWQ9dWQ9dCxvZD1hZD1uKX1mdW5jdGlvbiBraSh0LG4pe3ZhciBlPXQtdWQscj1uLWFkLGk9WXAoZSplK3Iqcik7QWQrPWkqKHVkK3QpLzIsQ2QrPWkqKGFkK24pLzIsemQrPWksUGQrPShpPWFkKnQtdWQqbikqKHVkK3QpLFJkKz1pKihhZCtuKSxMZCs9MyppLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gU2kodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVpKHQsbil7QmQucG9pbnQ9QWksVWQ9RmQ9dCxPZD1JZD1ufWZ1bmN0aW9uIEFpKHQsbil7RmQtPXQsSWQtPW4sWWQuYWRkKFlwKEZkKkZkK0lkKklkKSksRmQ9dCxJZD1ufWZ1bmN0aW9uIENpKCl7dGhpcy5fc3RyaW5nPVtdfWZ1bmN0aW9uIHppKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uIFBpKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgUmk7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIFJpKCl7fWZ1bmN0aW9uIExpKHQsbixlKXt2YXIgcj10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3JldHVybiB0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQobnVsbCksdHIoZSx0LnN0cmVhbShOZCkpLG4oTmQucmVzdWx0KCkpLG51bGwhPXImJnQuY2xpcEV4dGVudChyKSx0fWZ1bmN0aW9uIHFpKHQsbixlKXtyZXR1cm4gTGkodCxmdW5jdGlvbihlKXt2YXIgcj1uWzFdWzBdLW5bMF1bMF0saT1uWzFdWzFdLW5bMF1bMV0sbz1NYXRoLm1pbihyLyhlWzFdWzBdLWVbMF1bMF0pLGkvKGVbMV1bMV0tZVswXVsxXSkpLHU9K25bMF1bMF0rKHItbyooZVsxXVswXStlWzBdWzBdKSkvMixhPStuWzBdWzFdKyhpLW8qKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFt1LGFdKX0sZSl9ZnVuY3Rpb24gRGkodCxuLGUpe3JldHVybiBxaSh0LFtbMCwwXSxuXSxlKX1mdW5jdGlvbiBVaSh0LG4sZSl7cmV0dXJuIExpKHQsZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzBdLWVbMF1bMF0pLG89KHItaSooZVsxXVswXStlWzBdWzBdKSkvMix1PS1pKmVbMF1bMV07dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLHVdKX0sZSl9ZnVuY3Rpb24gT2kodCxuLGUpe3JldHVybiBMaSh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVsxXS1lWzBdWzFdKSxvPS1pKmVbMF1bMF0sdT0oci1pKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyx1XSl9LGUpfWZ1bmN0aW9uIEZpKHQsbil7cmV0dXJuK24/ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHIsaSxvLHUsYSxjLHMsZixsLGgscCxkLHYsZyl7dmFyIF89cy1yLHk9Zi1pLG09XypfK3kqeTtpZihtPjQqbiYmdi0tKXt2YXIgeD11K2gsYj1hK3Asdz1jK2QsTT1ZcCh4KngrYipiK3cqdyksVD1XZSh3Lz1NKSxOPXpwKHpwKHcpLTEpPE1wfHx6cChvLWwpPE1wPyhvK2wpLzI6UnAoYix4KSxrPXQoTixUKSxTPWtbMF0sRT1rWzFdLEE9Uy1yLEM9RS1pLHo9eSpBLV8qQzsoeip6L20+bnx8enAoKF8qQSt5KkMpL20tLjUpPi4zfHx1KmgrYSpwK2MqZDxqZCkmJihlKHIsaSxvLHUsYSxjLFMsRSxOLHgvPU0sYi89TSx3LHYsZyksZy5wb2ludChTLEUpLGUoUyxFLE4seCxiLHcscyxmLGwsaCxwLGQsdixnKSl9fXJldHVybiBmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGkoKXtfPU5hTix3LnBvaW50PW8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKHIsaSl7dmFyIG89dXIoW3IsaV0pLHU9dChyLGkpO2UoXyx5LGcsbSx4LGIsXz11WzBdLHk9dVsxXSxnPXIsbT1vWzBdLHg9b1sxXSxiPW9bMl0sSGQsbiksbi5wb2ludChfLHkpfWZ1bmN0aW9uIHUoKXt3LnBvaW50PXIsbi5saW5lRW5kKCl9ZnVuY3Rpb24gYSgpe2koKSx3LnBvaW50PWMsdy5saW5lRW5kPXN9ZnVuY3Rpb24gYyh0LG4pe28oZj10LG4pLGw9XyxoPXkscD1tLGQ9eCx2PWIsdy5wb2ludD1vfWZ1bmN0aW9uIHMoKXtlKF8seSxnLG0seCxiLGwsaCxmLHAsZCx2LEhkLG4pLHcubGluZUVuZD11LHUoKX12YXIgZixsLGgscCxkLHYsZyxfLHksbSx4LGIsdz17cG9pbnQ6cixsaW5lU3RhcnQ6aSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSx3LmxpbmVTdGFydD1hfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksdy5saW5lU3RhcnQ9aX19O3JldHVybiB3fX0odCxuKTpmdW5jdGlvbih0KXtyZXR1cm4gUGkoe3BvaW50OmZ1bmN0aW9uKG4sZSl7bj10KG4sZSksdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX0odCl9ZnVuY3Rpb24gSWkodCl7cmV0dXJuIFlpKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIFlpKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9cyh0WzBdKkNwLHRbMV0qQ3ApLFt0WzBdKnYrdSxhLXRbMV0qdl19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiB0PW8odCxuKSxbdFswXSp2K3UsYS10WzFdKnZdfWZ1bmN0aW9uIHIoKXtzPVJyKGM9cXIoeCxiLHcpLG8pO3ZhciB0PW8oeSxtKTtyZXR1cm4gdT1nLXRbMF0qdixhPV8rdFsxXSp2LGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIHA9ZD1udWxsLG59dmFyIG8sdSxhLGMscyxmLGwsaCxwLGQsdj0xNTAsZz00ODAsXz0yNTAseT0wLG09MCx4PTAsYj0wLHc9MCxNPW51bGwsVD1zZCxOPW51bGwsaz1waSxTPS41LEU9RmkoZSxTKTtyZXR1cm4gbi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIHAmJmQ9PT10P3A6cD1YZChmdW5jdGlvbih0KXtyZXR1cm4gUGkoe3BvaW50OmZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuLGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLHJbMV0pfX0pfShjKShUKEUoayhkPXQpKSkpKX0sbi5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhUPXQsTT12b2lkIDAsaSgpKTpUfSxuLnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXQsTj1mPWw9aD1udWxsLGkoKSk6a30sbi5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFQ9K3Q/UXIoTT10KkNwKTooTT1udWxsLHNkKSxpKCkpOk0qQXB9LG4uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz1udWxsPT10PyhOPWY9bD1oPW51bGwscGkpOkpyKE49K3RbMF1bMF0sZj0rdFswXVsxXSxsPSt0WzFdWzBdLGg9K3RbMV1bMV0pLGkoKSk6bnVsbD09Tj9udWxsOltbTixmXSxbbCxoXV19LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K3QscigpKTp2fSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rdFswXSxfPSt0WzFdLHIoKSk6W2csX119LG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PXRbMF0lMzYwKkNwLG09dFsxXSUzNjAqQ3AscigpKTpbeSpBcCxtKkFwXX0sbi5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dFswXSUzNjAqQ3AsYj10WzFdJTM2MCpDcCx3PXQubGVuZ3RoPjI/dFsyXSUzNjAqQ3A6MCxyKCkpOlt4KkFwLGIqQXAsdypBcF19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPUZpKGUsUz10KnQpLGkoKSk6WXAoUyl9LG4uZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFpKG4sdCxlKX0sbi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIERpKG4sdCxlKX0sbi5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBVaShuLHQsZSl9LG4uZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9pKG4sdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gbz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLmludmVydD1vLmludmVydCYmZnVuY3Rpb24odCl7cmV0dXJuKHQ9cy5pbnZlcnQoKHRbMF0tdSkvdiwoYS10WzFdKS92KSkmJlt0WzBdKkFwLHRbMV0qQXBdfSxyKCl9fWZ1bmN0aW9uIEJpKHQpe3ZhciBuPTAsZT1OcC8zLHI9WWkodCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKkNwLGU9dFsxXSpDcCk6W24qQXAsZSpBcF19LGl9ZnVuY3Rpb24gSGkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9WXAoby0yKmkqRnAobikpL2k7cmV0dXJuW2UqRnAodCo9aSksdS1lKkxwKHQpXX12YXIgcj1GcCh0KSxpPShyK0ZwKG4pKS8yO2lmKHpwKGkpPE1wKXJldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxGcChuKS9lXX12YXIgZT1McCh0KTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLFdlKG4qZSldfSxufSh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PVlwKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltScCh0LHpwKGUpKS9pKklwKGUpLFdlKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gamkoKXtyZXR1cm4gQmkoSGkpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gWGkoKXtyZXR1cm4gamkoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1McChuKSxpPUxwKGUpLG89dChyKmkpO3JldHVybltvKmkqRnAobiksbypGcChlKV19fWZ1bmN0aW9uICRpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPVlwKG4qbitlKmUpLGk9dChyKSxvPUZwKGkpLHU9THAoaSk7cmV0dXJuW1JwKG4qbyxyKnUpLFdlKHImJmUqby9yKV19fWZ1bmN0aW9uIFdpKHQsbil7cmV0dXJuW3QsVXAoQnAoKGtwK24pLzIpKV19ZnVuY3Rpb24gWmkodCl7ZnVuY3Rpb24gbigpe3ZhciBuPU5wKmEoKSx1PW8oRnIoby5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHMobnVsbD09Zj9bW3VbMF0tbix1WzFdLW5dLFt1WzBdK24sdVsxXStuXV06dD09PVdpP1tbTWF0aC5tYXgodVswXS1uLGYpLGVdLFtNYXRoLm1pbih1WzBdK24sciksaV1dOltbZixNYXRoLm1heCh1WzFdLW4sZSldLFtyLE1hdGgubWluKHVbMV0rbixpKV1dKX12YXIgZSxyLGksbz1JaSh0KSx1PW8uY2VudGVyLGE9by5zY2FsZSxjPW8udHJhbnNsYXRlLHM9by5jbGlwRXh0ZW50LGY9bnVsbDtyZXR1cm4gby5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYSh0KSxuKCkpOmEoKX0sby50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGModCksbigpKTpjKCl9LG8uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLG4oKSk6dSgpfSxvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/Zj1lPXI9aT1udWxsOihmPSt0WzBdWzBdLGU9K3RbMF1bMV0scj0rdFsxXVswXSxpPSt0WzFdWzFdKSxuKCkpOm51bGw9PWY/bnVsbDpbW2YsZV0sW3IsaV1dfSxuKCl9ZnVuY3Rpb24gR2kodCl7cmV0dXJuIEJwKChrcCt0KS8yKX1mdW5jdGlvbiBRaSh0LG4pe2Z1bmN0aW9uIGUodCxuKXtvPjA/bjwta3ArTXAmJihuPS1rcCtNcCk6bj5rcC1NcCYmKG49a3AtTXApO3ZhciBlPW8vT3AoR2kobiksaSk7cmV0dXJuW2UqRnAoaSp0KSxvLWUqTHAoaSp0KV19dmFyIHI9THAodCksaT10PT09bj9GcCh0KTpVcChyL0xwKG4pKS9VcChHaShuKS9HaSh0KSksbz1yKk9wKEdpKHQpLGkpL2k7cmV0dXJuIGk/KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uLHI9SXAoaSkqWXAodCp0K2UqZSk7cmV0dXJuW1JwKHQsenAoZSkpL2kqSXAoZSksMipQcChPcChvL3IsMS9pKSkta3BdfSxlKTpXaX1mdW5jdGlvbiBKaSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIEtpKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPW8tbixyPWkqdDtyZXR1cm5bZSpGcChyKSxvLWUqTHAocildfXZhciByPUxwKHQpLGk9dD09PW4/RnAodCk6KHItTHAobikpLyhuLXQpLG89ci9pK3Q7cmV0dXJuIHpwKGkpPE1wP0ppOihlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bUnAodCx6cChlKSkvaSpJcChlKSxvLUlwKGkpKllwKHQqdCtlKmUpXX0sZSl9ZnVuY3Rpb24gdG8odCxuKXt2YXIgZT1McChuKSxyPUxwKHQpKmU7cmV0dXJuW2UqRnAodCkvcixGcChuKS9yXX1mdW5jdGlvbiBubyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/cGk6UGkoe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIGVvKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBybyh0LG4pe3JldHVybltMcChuKSpGcCh0KSxGcChuKV19ZnVuY3Rpb24gaW8odCxuKXt2YXIgZT1McChuKSxyPTErTHAodCkqZTtyZXR1cm5bZSpGcCh0KS9yLEZwKG4pL3JdfWZ1bmN0aW9uIG9vKHQsbil7cmV0dXJuW1VwKEJwKChrcCtuKS8yKSksLXRdfWZ1bmN0aW9uIHVvKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIGFvKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGNvKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiBzbyh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZvKHQsbil7dmFyIGUscixpLG8sdSxhPW5ldyB2byh0KSxjPSt0LnZhbHVlJiYoYS52YWx1ZT10LnZhbHVlKSxzPVthXTtmb3IobnVsbD09biYmKG49bG8pO2U9cy5wb3AoKTspaWYoYyYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKHU9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheSh1KSxvPXUtMTtvPj0wOy0tbylzLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyB2byhpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gYS5lYWNoQmVmb3JlKHBvKX1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBobyh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gcG8odCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiB2byh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiBnbyh0KXtmb3IodmFyIG4sZSxyPTAsaT0odD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXQubGVuZ3RoO3I7KWU9TWF0aC5yYW5kb20oKSpyLS18MCxuPXRbcl0sdFtyXT10W2VdLHRbZV09bjtyZXR1cm4gdH0oV2QuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJnlvKGUsbik/KytyOihlPWZ1bmN0aW9uKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fSh0WzBdKTtjYXNlIDI6cmV0dXJuIHhvKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBibyh0WzBdLHRbMV0sdFsyXSl9fShvPWZ1bmN0aW9uKHQsbil7dmFyIGUscjtpZihtbyhuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKF9vKG4sdFtlXSkmJm1vKHhvKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihfbyh4byh0W2VdLHRbcl0pLG4pJiZfbyh4byh0W2VdLG4pLHRbcl0pJiZfbyh4byh0W3JdLG4pLHRbZV0pJiZtbyhibyh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9KG8sbikpLHI9MCk7cmV0dXJuIGV9ZnVuY3Rpb24gX28odCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geW8odCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBtbyh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5byh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHhvKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LHU9bi55LGE9bi5yLGM9by1lLHM9dS1yLGY9YS1pLGw9TWF0aC5zcXJ0KGMqYytzKnMpO3JldHVybnt4OihlK28rYy9sKmYpLzIseToocit1K3MvbCpmKS8yLHI6KGwraSthKS8yfX1mdW5jdGlvbiBibyh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLHU9bi54LGE9bi55LGM9bi5yLHM9ZS54LGY9ZS55LGw9ZS5yLGg9ci11LHA9ci1zLGQ9aS1hLHY9aS1mLGc9Yy1vLF89bC1vLHk9cipyK2kqaS1vKm8sbT15LXUqdS1hKmErYypjLHg9eS1zKnMtZipmK2wqbCxiPXAqZC1oKnYsdz0oZCp4LXYqbSkvKDIqYiktcixNPSh2KmctZCpfKS9iLFQ9KHAqbS1oKngpLygyKmIpLWksTj0oaCpfLXAqZykvYixrPU0qTStOKk4tMSxTPTIqKG8rdypNK1QqTiksRT13KncrVCpULW8qbyxBPS0oaz8oUytNYXRoLnNxcnQoUypTLTQqaypFKSkvKDIqayk6RS9TKTtyZXR1cm57eDpyK3crTSpBLHk6aStUK04qQSxyOkF9fWZ1bmN0aW9uIHdvKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz1uLnIrZS5yLHU9dC5yK2UucixhPW4ueC1yLGM9bi55LWkscz1hKmErYypjO2lmKHMpe3ZhciBmPS41KygodSo9dSktKG8qPW8pKS8oMipzKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoodStzKS0odS09cykqdS1vKm8pKS8oMipzKTtlLng9citmKmErbCpjLGUueT1pK2YqYy1sKmF9ZWxzZSBlLng9cit1LGUueT1pfWZ1bmN0aW9uIE1vKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnIrbi5yO3JldHVybiBpKmktMWUtNj5lKmUrcipyfWZ1bmN0aW9uIFRvKHQpe3ZhciBuPXQuXyxlPXQubmV4dC5fLHI9bi5yK2UucixpPShuLngqZS5yK2UueCpuLnIpL3Isbz0obi55KmUucitlLnkqbi5yKS9yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIE5vKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBrbyh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpLG8sdSxhLGMscyxmLGw7aWYobj10WzBdLG4ueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2Uucjt3byhlLG4scj10WzJdKSxuPW5ldyBObyhuKSxlPW5ldyBObyhlKSxyPW5ldyBObyhyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcihhPTM7YTxpOysrYSl7d28obi5fLGUuXyxyPXRbYV0pLHI9bmV3IE5vKHIpLGM9ZS5uZXh0LHM9bi5wcmV2aW91cyxmPWUuXy5yLGw9bi5fLnI7ZG97aWYoZjw9bCl7aWYoTW8oYy5fLHIuXykpe2U9YyxuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS1hO2NvbnRpbnVlIHR9Zis9Yy5fLnIsYz1jLm5leHR9ZWxzZXtpZihNbyhzLl8sci5fKSl7KG49cykubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1sKz1zLl8ucixzPXMucHJldmlvdXN9fXdoaWxlKGMhPT1zLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLG89VG8obik7KHI9ci5uZXh0KSE9PWU7KSh1PVRvKHIpKTxvJiYobj1yLG89dSk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1nbyhuKSxhPTA7YTxpOysrYSluPXRbYV0sbi54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBTbyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRW8oKXtyZXR1cm4gMH1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ28odCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiB6byh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIFBvKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLHU9ci5sZW5ndGgsYT10KGUpKm58fDA7aWYoYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yKz1hO2lmKG89a28ociksYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yLT1hO2Uucj1vK2F9fX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBMbyh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gcW8odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihyLW4pL3QudmFsdWU7KythPGM7KShvPXVbYV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqc31mdW5jdGlvbiBEbyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBVbyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBPbyh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBGbyh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIElvKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gWW8odCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gQm8odCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gSG8odCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBqbyh0LG4sZSxyLGkpe2Zvcih2YXIgbyx1PXQuY2hpbGRyZW4sYT0tMSxjPXUubGVuZ3RoLHM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK2E8YzspKG89dVthXSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpzfWZ1bmN0aW9uIFhvKHQsbixlLHIsaSxvKXtmb3IodmFyIHUsYSxjLHMsZixsLGgscCxkLHYsZyxfPVtdLHk9bi5jaGlsZHJlbixtPTAseD0wLGI9eS5sZW5ndGgsdz1uLnZhbHVlO208Yjspe2M9aS1lLHM9by1yO2Rve2Y9eVt4KytdLnZhbHVlfXdoaWxlKCFmJiZ4PGIpO2ZvcihsPWg9ZixnPWYqZioodj1NYXRoLm1heChzL2MsYy9zKS8odyp0KSksZD1NYXRoLm1heChoL2csZy9sKTt4PGI7Kyt4KXtpZihmKz1hPXlbeF0udmFsdWUsYTxsJiYobD1hKSxhPmgmJihoPWEpLGc9ZipmKnYsKHA9TWF0aC5tYXgoaC9nLGcvbCkpPmQpe2YtPWE7YnJlYWt9ZD1wfV8ucHVzaCh1PXt2YWx1ZTpmLGRpY2U6YzxzLGNoaWxkcmVuOnkuc2xpY2UobSx4KX0pLHUuZGljZT9xbyh1LGUscixpLHc/cis9cypmL3c6byk6am8odSxlLHIsdz9lKz1jKmYvdzppLG8pLHctPWYsbT14fXJldHVybiBffWZ1bmN0aW9uIFZvKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKS0oblsxXS10WzFdKSooZVswXS10WzBdKX1mdW5jdGlvbiAkbyh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBXbyh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1bMCwxXSxyPTIsaT0yO2k8bjsrK2kpe2Zvcig7cj4xJiZWbyh0W2Vbci0yXV0sdFtlW3ItMV1dLHRbaV0pPD0wOyktLXI7ZVtyKytdPWl9cmV0dXJuIGUuc2xpY2UoMCxyKX1mdW5jdGlvbiBabyh0KXt0aGlzLl9zaXplPXQsdGhpcy5fY2FsbD10aGlzLl9lcnJvcj1udWxsLHRoaXMuX3Rhc2tzPVtdLHRoaXMuX2RhdGE9W10sdGhpcy5fd2FpdGluZz10aGlzLl9hY3RpdmU9dGhpcy5fZW5kZWQ9dGhpcy5fc3RhcnQ9MH1mdW5jdGlvbiBHbyh0KXtpZighdC5fc3RhcnQpdHJ5eyhmdW5jdGlvbih0KXtmb3IoO3QuX3N0YXJ0PXQuX3dhaXRpbmcmJnQuX2FjdGl2ZTx0Ll9zaXplOyl7dmFyIG49dC5fZW5kZWQrdC5fYWN0aXZlLGU9dC5fdGFza3Nbbl0scj1lLmxlbmd0aC0xLGk9ZVtyXTtlW3JdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dC5fdGFza3Nbbl0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW25dPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1lP1FvKHQsZSk6KHQuX2RhdGFbbl09cix0Ll93YWl0aW5nP0dvKHQpOkpvKHQpKSkpfX0odCxuKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsZT1pLmFwcGx5KG51bGwsZSksdC5fdGFza3Nbbl0mJih0Ll90YXNrc1tuXT1lfHxldil9fSkodCl9Y2F0Y2gobil7aWYodC5fdGFza3NbdC5fZW5kZWQrdC5fYWN0aXZlLTFdKVFvKHQsbik7ZWxzZSBpZighdC5fZGF0YSl0aHJvdyBufX1mdW5jdGlvbiBRbyh0LG4pe3ZhciBlLHI9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1uLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0tcj49MDspaWYoKGU9dC5fdGFza3Nbcl0pJiYodC5fdGFza3Nbcl09bnVsbCxlLmFib3J0KSl0cnl7ZS5hYm9ydCgpfWNhdGNoKG4pe310Ll9hY3RpdmU9TmFOLEpvKHQpfWZ1bmN0aW9uIEpvKHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBuPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixuKX19ZnVuY3Rpb24gS28odCl7aWYobnVsbD09dCl0PTEvMDtlbHNlIGlmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY29uY3VycmVuY3kiKTtyZXR1cm4gbmV3IFpvKHQpfWZ1bmN0aW9uIHR1KCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9ZnVuY3Rpb24gbnUodCxuKXtmdW5jdGlvbiBlKHQpe3ZhciBuLGU9cy5zdGF0dXM7aWYoIWUmJmZ1bmN0aW9uKHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9KHMpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXtpZihvKXRyeXtuPW8uY2FsbChyLHMpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLHIsdCl9ZWxzZSBuPXM7YS5jYWxsKCJsb2FkIixyLG4pfWVsc2UgYS5jYWxsKCJlcnJvciIscix0KX12YXIgcixpLG8sdSxhPU4oImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGM9c2UoKSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxmPW51bGwsbD1udWxsLGg9MDtpZigidW5kZWZpbmVkIj09dHlwZW9mIFhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj1zLm9udGltZW91dD1lOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3MucmVhZHlTdGF0ZT4zJiZlKHQpfSxzLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIscix0KX0scj17aGVhZGVyOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2MuZ2V0KHQpOihudWxsPT1uP2MucmVtb3ZlKHQpOmMuc2V0KHQsbisiIikscil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLHIpOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LHIpOnV9LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qscik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2Y6KGY9bnVsbD09dD9udWxsOnQrIiIscil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/bDoobD1udWxsPT10P251bGw6dCsiIixyKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxyfSxnZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJHRVQiLHQsbil9LHBvc3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJQT1NUIix0LG4pfSxzZW5kOmZ1bmN0aW9uKG4sZSxvKXtyZXR1cm4gcy5vcGVuKG4sdCwhMCxmLGwpLG51bGw9PWl8fGMuaGFzKCJhY2NlcHQiKXx8Yy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLHMuc2V0UmVxdWVzdEhlYWRlciYmYy5lYWNoKGZ1bmN0aW9uKHQsbil7cy5zZXRSZXF1ZXN0SGVhZGVyKG4sdCl9KSxudWxsIT1pJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZShpKSxudWxsIT11JiYocy5yZXNwb25zZVR5cGU9dSksaD4wJiYocy50aW1lb3V0PWgpLG51bGw9PW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobz1lLGU9bnVsbCksbnVsbCE9byYmMT09PW8ubGVuZ3RoJiYobz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt0KG51bGw9PW4/ZTpudWxsKX19KG8pKSxudWxsIT1vJiZyLm9uKCJlcnJvciIsbykub24oImxvYWQiLGZ1bmN0aW9uKHQpe28obnVsbCx0KX0pLGEuY2FsbCgiYmVmb3Jlc2VuZCIscixzKSxzLnNlbmQobnVsbD09ZT9udWxsOmUpLHJ9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuYWJvcnQoKSxyfSxvbjpmdW5jdGlvbigpe3ZhciB0PWEub24uYXBwbHkoYSxhcmd1bWVudHMpO3JldHVybiB0PT09YT9yOnR9fSxudWxsIT1uKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7cmV0dXJuIHIuZ2V0KG4pfXJldHVybiByfWZ1bmN0aW9uIGV1KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIGk9bnUoZSkubWltZVR5cGUodCkucmVzcG9uc2Uobik7aWYobnVsbCE9cil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK3IpO3JldHVybiBpLmdldChyKX1yZXR1cm4gaX19ZnVuY3Rpb24gcnUodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9cixyPW51bGwpO3ZhciBvPW51KGUpLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUucmVzcG9uc2VUZXh0LG4pfX0obixyPXQpKTpyfSxvLnJvdyhyKSxpP28uZ2V0KGkpOm99fWZ1bmN0aW9uIGl1KHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09eXYpcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPXNlKCkscj1bXSxpPXl2O3JldHVybiB0PW51bGw9PXQ/W106X3YuY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT1zZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1fdi5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGl1KCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gb3UoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxoPXVbci0wXSxwPXVbMS1yXTtuPShwLWgpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksaCs9KHAtaC1uKih0LWMpKSpsLGU9biooMS1jKSxhJiYoaD1NYXRoLnJvdW5kKGgpLGU9TWF0aC5yb3VuZChlKSk7dmFyIGQ9Zih0KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGgrbip0fSk7cmV0dXJuIG8ocj9kLnJldmVyc2UoKTpkKX12YXIgbixlLHI9aXUoKS51bmtub3duKHZvaWQgMCksaT1yLmRvbWFpbixvPXIucmFuZ2UsdT1bMCwxXSxhPSExLGM9MCxzPTAsbD0uNTtyZXR1cm4gZGVsZXRlIHIudW5rbm93bixyLmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaShuKSx0KCkpOmkoKX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1bK25bMF0sK25bMV1dLHQoKSk6dS5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIHU9WytuWzBdLCtuWzFdXSxhPSEwLHQoKX0sci5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHIucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISFuLHQoKSk6YX0sci5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmN9LHIucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdPdXRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6c30sci5hbGlnbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6bH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG91KCkuZG9tYWluKGkoKSkucmFuZ2UodSkucm91bmQoYSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihzKS5hbGlnbihsKX0sdCgpfWZ1bmN0aW9uIHV1KHQpe3ZhciBuPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KG4oKSl9LHR9ZnVuY3Rpb24gYXUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGN1KHQpe3JldHVybit0fWZ1bmN0aW9uIHN1KHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmF1KG4pfWZ1bmN0aW9uIGZ1KHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLHU9blswXSxhPW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksdT1yKGEsdSkpOihpPWUoaSxvKSx1PXIodSxhKSksZnVuY3Rpb24odCl7cmV0dXJuIHUoaSh0KSl9fWZ1bmN0aW9uIGx1KHQsbixlLHIpe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylvW2FdPWUodFthXSx0W2ErMV0pLHVbYV09cihuW2FdLG5bYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPU9zKHQsbiwxLGkpLTE7cmV0dXJuIHVbZV0ob1tlXShuKSl9fWZ1bmN0aW9uIGh1KHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIHB1KHQsbil7ZnVuY3Rpb24gZSgpe3JldHVybiBpPU1hdGgubWluKGEubGVuZ3RoLGMubGVuZ3RoKT4yP2x1OmZ1LG89dT1udWxsLHJ9ZnVuY3Rpb24gcihuKXtyZXR1cm4ob3x8KG89aShhLGMsZj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1uPzA6dD49ZT8xOnIodCl9fX0odCk6dCxzKSkpKCtuKX12YXIgaSxvLHUsYT1tdixjPW12LHM9Zm4sZj0hMTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHV8fCh1PWkoYyxhLHN1LGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD9uOnQ+PTE/ZTpyKHQpfX19KG4pOm4pKSkoK3QpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1ndi5jYWxsKHQsY3UpLGUoKSk6YS5zbGljZSgpfSxyLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPV92LmNhbGwodCksZSgpKTpjLnNsaWNlKCl9LHIucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYz1fdi5jYWxsKHQpLHM9bG4sZSgpfSxyLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSEhdCxlKCkpOmZ9LHIuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxlKCkpOnN9LGUoKX1mdW5jdGlvbiBkdShuKXt2YXIgZT1uLmRvbWFpbjtyZXR1cm4gbi50aWNrcz1mdW5jdGlvbih0KXt2YXIgbj1lKCk7cmV0dXJuIGwoblswXSxuW24ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbihuLGUscil7dmFyIGksbz1uWzBdLHU9bltuLmxlbmd0aC0xXSxhPXAobyx1LG51bGw9PWU/MTA6ZSk7c3dpdGNoKChyPURlKG51bGw9PXI/IixmIjpyKSkudHlwZSl7Y2FzZSJzIjp2YXIgYz1NYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyh1KSk7cmV0dXJuIG51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPUJlKGEsYykpfHwoci5wcmVjaXNpb249aSksdC5mb3JtYXRQcmVmaXgocixjKTtjYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1IZShhLE1hdGgubWF4KE1hdGguYWJzKG8pLE1hdGguYWJzKHUpKSkpfHwoci5wcmVjaXNpb249aS0oImUiPT09ci50eXBlKSk7YnJlYWs7Y2FzZSJmIjpjYXNlIiUiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPVllKGEpKXx8KHIucHJlY2lzaW9uPWktMiooIiUiPT09ci50eXBlKSl9cmV0dXJuIHQuZm9ybWF0KHIpfShlKCksbixyKX0sbi5uaWNlPWZ1bmN0aW9uKHQpe251bGw9PXQmJih0PTEwKTt2YXIgcixpPWUoKSxvPTAsdT1pLmxlbmd0aC0xLGE9aVtvXSxjPWlbdV07cmV0dXJuIGM8YSYmKHI9YSxhPWMsYz1yLHI9byxvPXUsdT1yKSwocj1oKGEsYyx0KSk+MD9yPWgoYT1NYXRoLmZsb29yKGEvcikqcixjPU1hdGguY2VpbChjL3IpKnIsdCk6cjwwJiYocj1oKGE9TWF0aC5jZWlsKGEqcikvcixjPU1hdGguZmxvb3IoYypyKS9yLHQpKSxyPjA/KGlbb109TWF0aC5mbG9vcihhL3IpKnIsaVt1XT1NYXRoLmNlaWwoYy9yKSpyLGUoaSkpOnI8MCYmKGlbb109TWF0aC5jZWlsKGEqcikvcixpW3VdPU1hdGguZmxvb3IoYypyKS9yLGUoaSkpLG59LG59ZnVuY3Rpb24gdnUoKXt2YXIgdD1wdShzdSxhbik7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBodSh0LHZ1KCkpfSxkdSh0KX1mdW5jdGlvbiBndSgpe2Z1bmN0aW9uIHQodCl7cmV0dXJuK3R9dmFyIG49WzAsMV07cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1ndi5jYWxsKGUsY3UpLHQpOm4uc2xpY2UoKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGd1KCkuZG9tYWluKG4pfSxkdSh0KX1mdW5jdGlvbiBfdSh0LG4pe3ZhciBlLHI9MCxpPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W3JdLHU9dFtpXTtyZXR1cm4gdTxvJiYoZT1yLHI9aSxpPWUsZT1vLG89dSx1PWUpLHRbcl09bi5mbG9vcihvKSx0W2ldPW4uY2VpbCh1KSx0fWZ1bmN0aW9uIHl1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06YXUobil9ZnVuY3Rpb24gbXUodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIHh1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBidSh0KXtyZXR1cm4gMTA9PT10P3h1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIHd1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBNdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBUdSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz13dShpKSx1PWJ1KGkpLHIoKVswXTwwJiYobz1NdShvKSx1PU11KHUpKSxlfXZhciBlPXB1KHl1LG11KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz13dSgxMCksdT1idSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKHA9YSxhPWMsYz1wKTt2YXIgcyxmLGgscD1vKGEpLGQ9byhjKSx2PW51bGw9PXQ/MTA6K3QsZz1bXTtpZighKGklMSkmJmQtcDx2KXtpZihwPU1hdGgucm91bmQocCktMSxkPU1hdGgucm91bmQoZCkrMSxhPjApe2Zvcig7cDxkOysrcClmb3IoZj0xLHM9dShwKTtmPGk7KytmKWlmKCEoKGg9cypmKTxhKSl7aWYoaD5jKWJyZWFrO2cucHVzaChoKX19ZWxzZSBmb3IoO3A8ZDsrK3ApZm9yKGY9aS0xLHM9dShwKTtmPj0xOy0tZilpZighKChoPXMqZik8YSkpe2lmKGg+YylicmVhaztnLnB1c2goaCl9fWVsc2UgZz1sKHAsZCxNYXRoLm1pbihkLXAsdikpLm1hcCh1KTtyZXR1cm4gbj9nLnJldmVyc2UoKTpnfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciBhPU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L3UoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9YT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoX3UocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KGUsVHUoKS5iYXNlKGkpKX0sZX1mdW5jdGlvbiBOdSh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24ga3UoKXt2YXIgdD0xLG49cHUoZnVuY3Rpb24obixlKXtyZXR1cm4oZT1OdShlLHQpLShuPU51KG4sdCkpKT9mdW5jdGlvbihyKXtyZXR1cm4oTnUocix0KS1uKS9lfTphdShlKX0sZnVuY3Rpb24obixlKXtyZXR1cm4gZT1OdShlLHQpLShuPU51KG4sdCkpLGZ1bmN0aW9uKHIpe3JldHVybiBOdShuK2UqciwxL3QpfX0pLGU9bi5kb21haW47cmV0dXJuIG4uZXhwb25lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZShlKCkpKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaHUobixrdSgpLmV4cG9uZW50KHQpKX0sZHUobil9ZnVuY3Rpb24gU3UoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9MCxuPU1hdGgubWF4KDEsaS5sZW5ndGgpO2ZvcihvPW5ldyBBcnJheShuLTEpOysrdDxuOylvW3QtMV09dihyLHQvbik7cmV0dXJuIGV9ZnVuY3Rpb24gZSh0KXtpZighaXNOYU4odD0rdCkpcmV0dXJuIGlbT3Mobyx0KV19dmFyIHI9W10saT1bXSxvPVtdO3JldHVybiBlLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1pLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9vW24tMV06clswXSxuPG8ubGVuZ3RoP29bbl06cltyLmxlbmd0aC0xXV19LGUuZG9tYWluPWZ1bmN0aW9uKGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByLnNsaWNlKCk7cj1bXTtmb3IodmFyIGksbz0wLHU9ZS5sZW5ndGg7bzx1OysrbyludWxsPT0oaT1lW29dKXx8aXNOYU4oaT0raSl8fHIucHVzaChpKTtyZXR1cm4gci5zb3J0KG4pLHQoKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1fdi5jYWxsKG4pLHQoKSk6aS5zbGljZSgpfSxlLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBTdSgpLmRvbWFpbihyKS5yYW5nZShpKX0sZX1mdW5jdGlvbiBFdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtPcyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1fdi5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEV1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sZHUodCl9ZnVuY3Rpb24gQXUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbT3Mobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPV92LmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9X3YuY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBBdSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBDdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHUsYT1bXTtpZihlPWkuY2VpbChlKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEoZTxyJiZvPjApKXJldHVybiBhO2Rve2EucHVzaCh1PW5ldyBEYXRlKCtlKSksbihlLG8pLHQoZSl9d2hpbGUodTxlJiZlPHIpO3JldHVybiBhfSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpaWYocjwwKWZvcig7KytyPD0wOylmb3IoO24odCwtMSksIWUodCk7KTtlbHNlIGZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pfSxlJiYoaS5jb3VudD1mdW5jdGlvbihuLHIpe3JldHVybiB4di5zZXRUaW1lKCtuKSxidi5zZXRUaW1lKCtyKSx0KHh2KSx0KGJ2KSxNYXRoLmZsb29yKGUoeHYsYnYpKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKHI/ZnVuY3Rpb24obil7cmV0dXJuIHIobikldD09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT0wfSk6aTpudWxsfSksaX1mdW5jdGlvbiB6dSh0KXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpUdikvTnZ9KX1mdW5jdGlvbiBQdSh0KXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9Odn0pfWZ1bmN0aW9uIFJ1KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBMdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBxdSh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBEdSh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyx1PVtdLGE9LTEsYz0wLHM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrYTxzOykzNz09PXQuY2hhckNvZGVBdChhKSYmKHUucHVzaCh0LnNsaWNlKGMsYSkpLG51bGwhPShpPU1nW3I9dC5jaGFyQXQoKythKV0pP3I9dC5jaGFyQXQoKythKTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSx1LnB1c2gociksYz1hKzEpO3JldHVybiB1LnB1c2godC5zbGljZShjLGEpKSx1LmpvaW4oIiIpfX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpLG8sdT1xdSgxOTAwKTtpZihyKHUsdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gdSlyZXR1cm4gbmV3IERhdGUodS5RKTtpZigicCJpbiB1JiYodS5IPXUuSCUxMisxMip1LnApLCJWImluIHUpe2lmKHUuVjwxfHx1LlY+NTMpcmV0dXJuIG51bGw7InciaW4gdXx8KHUudz0xKSwiWiJpbiB1PyhpPShvPShpPUx1KHF1KHUueSkpKS5nZXRVVENEYXkoKSk+NHx8MD09PW8/b2cuY2VpbChpKTpvZyhpKSxpPWVnLm9mZnNldChpLDcqKHUuVi0xKSksdS55PWkuZ2V0VVRDRnVsbFllYXIoKSx1Lm09aS5nZXRVVENNb250aCgpLHUuZD1pLmdldFVUQ0RhdGUoKSsodS53KzYpJTcpOihpPShvPShpPW4ocXUodS55KSkpLmdldERheSgpKT40fHwwPT09bz9xdi5jZWlsKGkpOnF2KGkpLGk9UHYub2Zmc2V0KGksNyoodS5WLTEpKSx1Lnk9aS5nZXRGdWxsWWVhcigpLHUubT1pLmdldE1vbnRoKCksdS5kPWkuZ2V0RGF0ZSgpKyh1LncrNiklNyl9ZWxzZSgiVyJpbiB1fHwiVSJpbiB1KSYmKCJ3ImluIHV8fCh1Lnc9InUiaW4gdT91LnUlNzoiVyJpbiB1PzE6MCksbz0iWiJpbiB1P0x1KHF1KHUueSkpLmdldFVUQ0RheSgpOm4ocXUodS55KSkuZ2V0RGF5KCksdS5tPTAsdS5kPSJXImluIHU/KHUudys2KSU3KzcqdS5XLShvKzUpJTc6dS53KzcqdS5VLShvKzYpJTcpO3JldHVybiJaImluIHU/KHUuSCs9dS5aLzEwMHwwLHUuTSs9dS5aJTEwMCxMdSh1KSk6bih1KX19ZnVuY3Rpb24gcih0LG4sZSxyKXtmb3IodmFyIGksbyx1PTAsYT1uLmxlbmd0aCxjPWUubGVuZ3RoO3U8YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoMzc9PT0oaT1uLmNoYXJDb2RlQXQodSsrKSkpe2lmKGk9bi5jaGFyQXQodSsrKSwhKG89VFtpIGluIE1nP24uY2hhckF0KHUrKyk6aV0pfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfXZhciBpPXQuZGF0ZVRpbWUsbz10LmRhdGUsdT10LnRpbWUsYT10LnBlcmlvZHMsYz10LmRheXMscz10LnNob3J0RGF5cyxmPXQubW9udGhzLGw9dC5zaG9ydE1vbnRocyxoPUZ1KGEpLHA9SXUoYSksZD1GdShjKSx2PUl1KGMpLGc9RnUocyksXz1JdShzKSx5PUZ1KGYpLG09SXUoZikseD1GdShsKSxiPUl1KGwpLHc9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIHNbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIGNbdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGxbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LmdldE1vbnRoKCldfSxjOm51bGwsZDp1YSxlOnVhLGY6bGEsSDphYSxJOmNhLGo6c2EsTDpmYSxtOmhhLE06cGEscDpmdW5jdGlvbih0KXtyZXR1cm4gYVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpZYSxzOkJhLFM6ZGEsdTp2YSxVOmdhLFY6X2Esdzp5YSxXOm1hLHg6bnVsbCxYOm51bGwseTp4YSxZOmJhLFo6d2EsIiUiOklhfSxNPXthOmZ1bmN0aW9uKHQpe3JldHVybiBzW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6TWEsZTpNYSxmOkVhLEg6VGEsSTpOYSxqOmthLEw6U2EsbTpBYSxNOkNhLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGFbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6WWEsczpCYSxTOnphLHU6UGEsVTpSYSxWOkxhLHc6cWEsVzpEYSx4Om51bGwsWDpudWxsLHk6VWEsWTpPYSxaOkZhLCIlIjpJYX0sVD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Zy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9X1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1kLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz12W3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXguZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPWJbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9eS5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09bVtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gcih0LGksbixlKX0sZDpHdSxlOkd1LGY6ZWEsSDpKdSxJOkp1LGo6UXUsTDpuYSxtOlp1LE06S3UscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9aC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmlhLHM6b2EsUzp0YSx1OkJ1LFU6SHUsVjpqdSx3Oll1LFc6WHUseDpmdW5jdGlvbih0LG4sZSl7cmV0dXJuIHIodCxvLG4sZSl9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiByKHQsdSxuLGUpfSx5OiR1LFk6VnUsWjpXdSwiJSI6cmF9O3JldHVybiB3Lng9bihvLHcpLHcuWD1uKHUsdyksdy5jPW4oaSx3KSxNLng9bihvLE0pLE0uWD1uKHUsTSksTS5jPW4oaSxNKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsdyk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0Kz0iIixSdSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsTSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0LEx1KTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19ZnVuY3Rpb24gVXUodCxuLGUpe3ZhciByPXQ8MD8iLSI6IiIsaT0ocj8tdDp0KSsiIixvPWkubGVuZ3RoO3JldHVybiByKyhvPGU/bmV3IEFycmF5KGUtbysxKS5qb2luKG4pK2k6aSl9ZnVuY3Rpb24gT3UodCl7cmV0dXJuIHQucmVwbGFjZShrZywiXFwkJiIpfWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChPdSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIEl1KHQpe2Zvcih2YXIgbj17fSxlPS0xLHI9dC5sZW5ndGg7KytlPHI7KW5bdFtlXS50b0xvd2VyQ2FzZSgpXT1lO3JldHVybiBufWZ1bmN0aW9uIFl1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC51PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEh1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGp1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5WPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFZ1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uICR1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gV3UodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5aPXJbMV0/MDotKHJbMl0rKHJbM118fCIwMCIpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBadSh0LG4sZSl7dmFyIHI9VGcuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR3UodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUXUodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lm09MCx0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnUodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS3UodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdGEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbmEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZWEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Lkw9TWF0aC5mbG9vcihyWzBdLzFlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPU5nLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gaWEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvYSh0LG4sZSl7dmFyIHI9VGcuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5RPTFlMyorclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1YSh0LG4pe3JldHVybiBVdSh0LmdldERhdGUoKSxuLDIpfWZ1bmN0aW9uIGFhKHQsbil7cmV0dXJuIFV1KHQuZ2V0SG91cnMoKSxuLDIpfWZ1bmN0aW9uIGNhKHQsbil7cmV0dXJuIFV1KHQuZ2V0SG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBzYSh0LG4pe3JldHVybiBVdSgxK1B2LmNvdW50KEd2KHQpLHQpLG4sMyl9ZnVuY3Rpb24gZmEodCxuKXtyZXR1cm4gVXUodC5nZXRNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIGxhKHQsbil7cmV0dXJuIGZhKHQsbikrIjAwMCJ9ZnVuY3Rpb24gaGEodCxuKXtyZXR1cm4gVXUodC5nZXRNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBwYSh0LG4pe3JldHVybiBVdSh0LmdldE1pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIGRhKHQsbil7cmV0dXJuIFV1KHQuZ2V0U2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gdmEodCl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIGdhKHQsbil7cmV0dXJuIFV1KEx2LmNvdW50KEd2KHQpLHQpLG4sMil9ZnVuY3Rpb24gX2EodCxuKXt2YXIgZT10LmdldERheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP092KHQpOk92LmNlaWwodCksVXUoT3YuY291bnQoR3YodCksdCkrKDQ9PT1Hdih0KS5nZXREYXkoKSksbiwyKX1mdW5jdGlvbiB5YSh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBtYSh0LG4pe3JldHVybiBVdShxdi5jb3VudChHdih0KSx0KSxuLDIpfWZ1bmN0aW9uIHhhKHQsbil7cmV0dXJuIFV1KHQuZ2V0RnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBiYSh0LG4pe3JldHVybiBVdSh0LmdldEZ1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gd2EodCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihuPjA/Ii0iOihuKj0tMSwiKyIpKStVdShuLzYwfDAsIjAiLDIpK1V1KG4lNjAsIjAiLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDRGF0ZSgpLG4sMil9ZnVuY3Rpb24gVGEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENIb3VycygpLG4sMil9ZnVuY3Rpb24gTmEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIFV1KDErZWcuY291bnQoeGcodCksdCksbiwzKX1mdW5jdGlvbiBTYSh0LG4pe3JldHVybiBVdSh0LmdldFVUQ01pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gRWEodCxuKXtyZXR1cm4gU2EodCxuKSsiMDAwIn1mdW5jdGlvbiBBYSh0LG4pe3JldHVybiBVdSh0LmdldFVUQ01vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDTWludXRlcygpLG4sMil9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBQYSh0KXt2YXIgbj10LmdldFVUQ0RheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gUmEodCxuKXtyZXR1cm4gVXUoaWcuY291bnQoeGcodCksdCksbiwyKX1mdW5jdGlvbiBMYSh0LG4pe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIHQ9ZT49NHx8MD09PWU/Y2codCk6Y2cuY2VpbCh0KSxVdShjZy5jb3VudCh4Zyh0KSx0KSsoND09PXhnKHQpLmdldFVUQ0RheSgpKSxuLDIpfWZ1bmN0aW9uIHFhKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuIFV1KG9nLmNvdW50KHhnKHQpLHQpLG4sMil9ZnVuY3Rpb24gVWEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIE9hKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDRnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBGYSgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gSWEoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gWWEodCl7cmV0dXJuK3R9ZnVuY3Rpb24gQmEodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBIYShuKXtyZXR1cm4gYmc9RHUobiksdC50aW1lRm9ybWF0PWJnLmZvcm1hdCx0LnRpbWVQYXJzZT1iZy5wYXJzZSx0LnV0Y0Zvcm1hdD1iZy51dGNGb3JtYXQsdC51dGNQYXJzZT1iZy51dGNQYXJzZSxiZ31mdW5jdGlvbiBqYSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gVmEodCxuLHIsaSxvLHUsYSxjLHMpe2Z1bmN0aW9uIGYoZSl7cmV0dXJuKGEoZSk8ZT9nOnUoZSk8ZT9fOm8oZSk8ZT95OmkoZSk8ZT9tOm4oZSk8ZT9yKGUpPGU/eDpiOnQoZSk8ZT93Ok0pKGUpfWZ1bmN0aW9uIGwobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIHU9TWF0aC5hYnMoaS1yKS9uLGE9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KFQsdSk7YT09PVQubGVuZ3RoPyhvPXAoci9EZyxpL0RnLG4pLG49dCk6YT8obz0oYT1UW3UvVFthLTFdWzJdPFRbYV1bMl0vdT9hLTE6YV0pWzFdLG49YVswXSk6KG89TWF0aC5tYXgocChyLGksbiksMSksbj1jKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9dmFyIGg9cHUoc3UsYW4pLGQ9aC5pbnZlcnQsdj1oLmRvbWFpbixnPXMoIi4lTCIpLF89cygiOiVTIikseT1zKCIlSTolTSIpLG09cygiJUkgJXAiKSx4PXMoIiVhICVkIiksYj1zKCIlYiAlZCIpLHc9cygiJUIiKSxNPXMoIiVZIiksVD1bW2EsMSxDZ10sW2EsNSw1KkNnXSxbYSwxNSwxNSpDZ10sW2EsMzAsMzAqQ2ddLFt1LDEsemddLFt1LDUsNSp6Z10sW3UsMTUsMTUqemddLFt1LDMwLDMwKnpnXSxbbywxLFBnXSxbbywzLDMqUGddLFtvLDYsNipQZ10sW28sMTIsMTIqUGddLFtpLDEsUmddLFtpLDIsMipSZ10sW3IsMSxMZ10sW24sMSxxZ10sW24sMywzKnFnXSxbdCwxLERnXV07cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShkKHQpKX0saC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dihndi5jYWxsKHQsWGEpKTp2KCkubWFwKGphKX0saC50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9digpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sdT1vPGk7cmV0dXJuIHUmJihlPWksaT1vLG89ZSksZT1sKHQsaSxvLG4pLGU9ZT9lLnJhbmdlKGksbysxKTpbXSx1P2UucmV2ZXJzZSgpOmV9LGgudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP2Y6cyhuKX0saC5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9digpO3JldHVybih0PWwodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP3YoX3UoZSx0KSk6aH0saC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KGgsVmEodCxuLHIsaSxvLHUsYSxjLHMpKX0saH1mdW5jdGlvbiAkYSh0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiMiK3R9KX1mdW5jdGlvbiBXYSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX1mdW5jdGlvbiBaYSh0KXtmdW5jdGlvbiBuKG4pe3ZhciBvPShuLWUpLyhyLWUpO3JldHVybiB0KGk/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTpvKX12YXIgZT0wLHI9MSxpPSExO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLG4pOltlLHJdfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEhdCxuKTppfSxuLmludGVycG9sYXRvcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBaYSh0KS5kb21haW4oW2Uscl0pLmNsYW1wKGkpfSxkdShuKX1mdW5jdGlvbiBHYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUWEodCl7cmV0dXJuIHQ+PTE/aV86dDw9LTE/LWlfOk1hdGguYXNpbih0KX1mdW5jdGlvbiBKYSh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBLYSh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIG5jKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGVjKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIHJjKHQsbixlLHIsaSxvLHUpe3ZhciBhPXQtZSxjPW4tcixzPSh1P286LW8pL25fKGEqYStjKmMpLGY9cypjLGw9LXMqYSxoPXQrZixwPW4rbCxkPWUrZix2PXIrbCxnPShoK2QpLzIsXz0ocCt2KS8yLHk9ZC1oLG09di1wLHg9eSp5K20qbSxiPWktbyx3PWgqdi1kKnAsTT0obTwwPy0xOjEpKm5fKEpnKDAsYipiKngtdyp3KSksVD0odyptLXkqTSkveCxOPSgtdyp5LW0qTSkveCxrPSh3Km0reSpNKS94LFM9KC13KnkrbSpNKS94LEU9VC1nLEE9Ti1fLEM9ay1nLHo9Uy1fO3JldHVybiBFKkUrQSpBPkMqQyt6KnomJihUPWssTj1TKSx7Y3g6VCxjeTpOLHgwMTotZix5MDE6LWwseDExOlQqKGkvYi0xKSx5MTE6TiooaS9iLTEpfX1mdW5jdGlvbiBpYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIG5ldyBpYyh0KX1mdW5jdGlvbiB1Yyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBhYyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBjYygpe2Z1bmN0aW9uIHQodCl7dmFyIGEsYyxzLGY9dC5sZW5ndGgsbD0hMTtmb3IobnVsbD09aSYmKHU9byhzPWVlKCkpKSxhPTA7YTw9ZjsrK2EpIShhPGYmJnIoYz10W2FdLGEsdCkpPT09bCYmKChsPSFsKT91LmxpbmVTdGFydCgpOnUubGluZUVuZCgpKSxsJiZ1LnBvaW50KCtuKGMsYSx0KSwrZShjLGEsdCkpO2lmKHMpcmV0dXJuIHU9bnVsbCxzKyIifHxudWxsfXZhciBuPXVjLGU9YWMscj1HYSghMCksaT1udWxsLG89b2MsdT1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpHYSgrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOmV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCEhbiksdCk6cn0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLG51bGwhPWkmJih1PW8oaSkpLHQpOm99LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPXU9bnVsbDp1PW8oaT1uKSx0KTppfSx0fWZ1bmN0aW9uIHNjKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixmLGwsaCxwLGQ9dC5sZW5ndGgsdj0hMSxnPW5ldyBBcnJheShkKSxfPW5ldyBBcnJheShkKTtmb3IobnVsbD09YSYmKHM9YyhwPWVlKCkpKSxuPTA7bjw9ZDsrK24pe2lmKCEobjxkJiZ1KGg9dFtuXSxuLHQpKT09PXYpaWYodj0hdilmPW4scy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksbD1uLTE7bD49ZjstLWwpcy5wb2ludChnW2xdLF9bbF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfXYmJihnW25dPStlKGgsbix0KSxfW25dPStpKGgsbix0KSxzLnBvaW50KHI/K3IoaCxuLHQpOmdbbl0sbz8rbyhoLG4sdCk6X1tuXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIG4oKXtyZXR1cm4gY2MoKS5kZWZpbmVkKHUpLmN1cnZlKGMpLmNvbnRleHQoYSl9dmFyIGU9dWMscj1udWxsLGk9R2EoMCksbz1hYyx1PUdhKCEwKSxhPW51bGwsYz1vYyxzPW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSxyPW51bGwsdCk6ZX0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksbz1udWxsLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6b30sdC5saW5lWDA9dC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShpKX0sdC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShvKX0sdC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngocikueShpKX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoISFuKSx0KTp1fSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sbnVsbCE9YSYmKHM9YyhhKSksdCk6Y30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2E9cz1udWxsOnM9YyhhPW4pLHQpOmF9LHR9ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gbGModCl7cmV0dXJuIHR9ZnVuY3Rpb24gaGModCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiBwYyh0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuZXcgaGModChuKSl9cmV0dXJuIG4uX2N1cnZlPXQsbn1mdW5jdGlvbiBkYyh0KXt2YXIgbj10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihwYyh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiB2Yygpe3JldHVybiBkYyhjYygpLmN1cnZlKHVfKSl9ZnVuY3Rpb24gZ2MoKXt2YXIgdD1zYygpLmN1cnZlKHVfKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGRjKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBkYyhyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gZGMoaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGRjKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ocGModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gX2ModCxuKXtyZXR1cm5bKG49K24pKk1hdGguY29zKHQtPU1hdGguUEkvMiksbipNYXRoLnNpbih0KV19ZnVuY3Rpb24geWModCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiB4Yyh0KXtmdW5jdGlvbiBuKCl7dmFyIG4sYT1hXy5jYWxsKGFyZ3VtZW50cyksYz1lLmFwcGx5KHRoaXMsYSkscz1yLmFwcGx5KHRoaXMsYSk7aWYodXx8KHU9bj1lZSgpKSx0KHUsK2kuYXBwbHkodGhpcywoYVswXT1jLGEpKSwrby5hcHBseSh0aGlzLGEpLCtpLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksK28uYXBwbHkodGhpcyxhKSksbilyZXR1cm4gdT1udWxsLG4rIiJ8fG51bGx9dmFyIGU9eWMscj1tYyxpPXVjLG89YWMsdT1udWxsO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6R2EoK3QpLG4pOml9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkdhKCt0KSxuKTpvfSxuLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09dD9udWxsOnQsbik6dX0sbn1mdW5jdGlvbiBiYyh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIHdjKHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gTWModCxuLGUscixpKXt2YXIgbz1fYyhuLGUpLHU9X2MobixlPShlK2kpLzIpLGE9X2MocixlKSxjPV9jKHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8odVswXSx1WzFdLGFbMF0sYVsxXSxjWzBdLGNbMV0pfWZ1bmN0aW9uIFRjKCl7fWZ1bmN0aW9uIE5jKHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBrYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gU2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBBYyh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBrYyh0KSx0aGlzLl9iZXRhPW59ZnVuY3Rpb24gQ2ModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiB6Yyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gUGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIFJjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBMYyh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLHU9dC5feTI7aWYodC5fbDAxX2E+ZV8pe3ZhciBhPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGM9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqYS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9jLGk9KGkqYS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9jfWlmKHQuX2wyM19hPmVfKXt2YXIgcz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxmPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKnMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9mLHU9KHUqcyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL2Z9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLHUsdC5feDIsdC5feTIpfWZ1bmN0aW9uIHFjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gRGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBVYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIE9jKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBGYyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gSWModCxuLGUpe3ZhciByPXQuX3gxLXQuX3gwLGk9bi10Ll94MSxvPSh0Ll95MS10Ll95MCkvKHJ8fGk8MCYmLTApLHU9KGUtdC5feTEpLyhpfHxyPDAmJi0wKSxhPShvKmkrdSpyKS8ocitpKTtyZXR1cm4oRmMobykrRmModSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKHUpLC41Kk1hdGguYWJzKGEpKXx8MH1mdW5jdGlvbiBZYyh0LG4pe3ZhciBlPXQuX3gxLXQuX3gwO3JldHVybiBlPygzKih0Ll95MS10Ll95MCkvZS1uKS8yOm59ZnVuY3Rpb24gQmModCxuLGUpe3ZhciByPXQuX3gwLGk9dC5feTAsbz10Ll94MSx1PXQuX3kxLGE9KG8tcikvMzt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocithLGkrYSpuLG8tYSx1LWEqZSxvLHUpfWZ1bmN0aW9uIEhjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBqYyh0KXt0aGlzLl9jb250ZXh0PW5ldyBYYyh0KX1mdW5jdGlvbiBYYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gVmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uICRjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gV2ModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIFpjKHQsbil7aWYoKGk9dC5sZW5ndGgpPjEpZm9yKHZhciBlLHIsaSxvPTEsdT10W25bMF1dLGE9dS5sZW5ndGg7bzxpOysrbylmb3Iocj11LHU9dFtuW29dXSxlPTA7ZTxhOysrZSl1W2VdWzFdKz11W2VdWzBdPWlzTmFOKHJbZV1bMV0pP3JbZV1bMF06cltlXVsxXX1mdW5jdGlvbiBHYyh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1uZXcgQXJyYXkobik7LS1uPj0wOyllW25dPW47cmV0dXJuIGV9ZnVuY3Rpb24gUWModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiBKYyh0KXt2YXIgbj10Lm1hcChLYyk7cmV0dXJuIEdjKHQpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gblt0XS1uW2VdfSl9ZnVuY3Rpb24gS2ModCl7Zm9yKHZhciBuLGU9MCxyPS0xLGk9dC5sZW5ndGg7KytyPGk7KShuPSt0W3JdWzFdKSYmKGUrPW4pO3JldHVybiBlfWZ1bmN0aW9uIHRzKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBucyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBlcyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBycygpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIGlzKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gb3ModCxuKXt2YXIgZT1uLHI9bi5SLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLlI9ci5MLGUuUiYmKGUuUi5VPWUpLHIuTD1lfWZ1bmN0aW9uIHVzKHQsbil7dmFyIGU9bixyPW4uTCxpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5MPXIuUixlLkwmJihlLkwuVT1lKSxyLlI9ZX1mdW5jdGlvbiBhcyh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gY3ModCxuLGUscil7dmFyIGk9W251bGwsbnVsbF0sbz1EXy5wdXNoKGkpLTE7cmV0dXJuIGkubGVmdD10LGkucmlnaHQ9bixlJiZmcyhpLHQsbixlKSxyJiZmcyhpLG4sdCxyKSxMX1t0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxMX1tuLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxpfWZ1bmN0aW9uIHNzKHQsbixlKXt2YXIgcj1bbixlXTtyZXR1cm4gci5sZWZ0PXQscn1mdW5jdGlvbiBmcyh0LG4sZSxyKXt0WzBdfHx0WzFdP3QubGVmdD09PWU/dFsxXT1yOnRbMF09cjoodFswXT1yLHQubGVmdD1uLHQucmlnaHQ9ZSl9ZnVuY3Rpb24gbHModCxuLGUscixpKXt2YXIgbyx1PXRbMF0sYT10WzFdLGM9dVswXSxzPXVbMV0sZj0wLGw9MSxoPWFbMF0tYyxwPWFbMV0tcztpZihvPW4tYyxofHwhKG8+MCkpe2lmKG8vPWgsaDwwKXtpZihvPGYpcmV0dXJuO288bCYmKGw9byl9ZWxzZSBpZihoPjApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1pZihvPXItYyxofHwhKG88MCkpe2lmKG8vPWgsaDwwKXtpZihvPmwpcmV0dXJuO28+ZiYmKGY9byl9ZWxzZSBpZihoPjApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1pZihvPWUtcyxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPGYpcmV0dXJuO288bCYmKGw9byl9ZWxzZSBpZihwPjApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1pZihvPWktcyxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmwpcmV0dXJuO28+ZiYmKGY9byl9ZWxzZSBpZihwPjApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1yZXR1cm4hKGY+MHx8bDwxKXx8KGY+MCYmKHRbMF09W2MrZipoLHMrZipwXSksbDwxJiYodFsxXT1bYytsKmgscytsKnBdKSwhMCl9fX19fWZ1bmN0aW9uIGhzKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLGc9KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Zy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIHBzKHQsbil7dmFyIGU9dC5zaXRlLHI9bi5sZWZ0LGk9bi5yaWdodDtyZXR1cm4gZT09PWkmJihpPXIscj1lKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KGU9PT1yPyhyPW5bMV0saT1uWzBdKToocj1uWzBdLGk9blsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24gZHModCxuKXtyZXR1cm4gblsrKG4ubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIHZzKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQ9PT10LnNpdGUpXX1mdW5jdGlvbiBncyh0KXt2YXIgbj10LlAsZT10Lk47aWYobiYmZSl7dmFyIHI9bi5zaXRlLGk9dC5zaXRlLG89ZS5zaXRlO2lmKHIhPT1vKXt2YXIgdT1pWzBdLGE9aVsxXSxjPXJbMF0tdSxzPXJbMV0tYSxmPW9bMF0tdSxsPW9bMV0tYSxoPTIqKGMqbC1zKmYpO2lmKCEoaD49LUlfKSl7dmFyIHA9YypjK3MqcyxkPWYqZitsKmwsdj0obCpwLXMqZCkvaCxnPShjKmQtZipwKS9oLF89VV8ucG9wKCl8fG5ldyBmdW5jdGlvbigpe2lzKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH07Xy5hcmM9dCxfLnNpdGU9aSxfLng9dit1LF8ueT0oXy5jeT1nK2EpK01hdGguc3FydCh2KnYrZypnKSx0LmNpcmNsZT1fO2Zvcih2YXIgeT1udWxsLG09cV8uXzttOylpZihfLnk8bS55fHxfLnk9PT1tLnkmJl8ueDw9bS54KXtpZighbS5MKXt5PW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe3k9bTticmVha31tPW0uUn1xXy5pbnNlcnQoeSxfKSx5fHwoUF89Xyl9fX19ZnVuY3Rpb24gX3ModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KFBfPW4uTikscV8ucmVtb3ZlKG4pLFVfLnB1c2gobiksaXMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24geXModCl7dmFyIG49T18ucG9wKCl8fG5ldyBmdW5jdGlvbigpe2lzKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH07cmV0dXJuIG4uc2l0ZT10LG59ZnVuY3Rpb24gbXModCl7X3ModCksUl8ucmVtb3ZlKHQpLE9fLnB1c2godCksaXModCl9ZnVuY3Rpb24geHModCl7dmFyIG49dC5jaXJjbGUsZT1uLngscj1uLmN5LGk9W2Uscl0sbz10LlAsdT10Lk4sYT1bdF07bXModCk7Zm9yKHZhciBjPW87Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8Rl8mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEZfOylvPWMuUCxhLnVuc2hpZnQoYyksbXMoYyksYz1vO2EudW5zaGlmdChjKSxfcyhjKTtmb3IodmFyIHM9dTtzLmNpcmNsZSYmTWF0aC5hYnMoZS1zLmNpcmNsZS54KTxGXyYmTWF0aC5hYnMoci1zLmNpcmNsZS5jeSk8Rl87KXU9cy5OLGEucHVzaChzKSxtcyhzKSxzPXU7YS5wdXNoKHMpLF9zKHMpO3ZhciBmLGw9YS5sZW5ndGg7Zm9yKGY9MTtmPGw7KytmKXM9YVtmXSxjPWFbZi0xXSxmcyhzLmVkZ2UsYy5zaXRlLHMuc2l0ZSxpKTtjPWFbMF0sKHM9YVtsLTFdKS5lZGdlPWNzKGMuc2l0ZSxzLnNpdGUsbnVsbCxpKSxncyhjKSxncyhzKX1mdW5jdGlvbiBicyh0KXtmb3IodmFyIG4sZSxyLGksbz10WzBdLHU9dFsxXSxhPVJfLl87YTspaWYoKHI9d3MoYSx1KS1vKT5GXylhPWEuTDtlbHNle2lmKCEoKGk9by1mdW5jdGlvbih0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiB3cyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9KGEsdSkpPkZfKSl7cj4tRl8/KG49YS5QLGU9YSk6aT4tRl8/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfShmdW5jdGlvbih0KXtMX1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KSh0KTt2YXIgYz15cyh0KTtpZihSXy5pbnNlcnQobixjKSxufHxlKXtpZihuPT09ZSlyZXR1cm4gX3MobiksZT15cyhuLnNpdGUpLFJfLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9Y3Mobi5zaXRlLGMuc2l0ZSksZ3Mobiksdm9pZCBncyhlKTtpZihlKXtfcyhuKSxfcyhlKTt2YXIgcz1uLnNpdGUsZj1zWzBdLGw9c1sxXSxoPXRbMF0tZixwPXRbMV0tbCxkPWUuc2l0ZSx2PWRbMF0tZixnPWRbMV0tbCxfPTIqKGgqZy1wKnYpLHk9aCpoK3AqcCxtPXYqditnKmcseD1bKGcqeS1wKm0pL18rZiwoaCptLXYqeSkvXytsXTtmcyhlLmVkZ2UscyxkLHgpLGMuZWRnZT1jcyhzLHQsbnVsbCx4KSxlLmVkZ2U9Y3ModCxkLG51bGwseCksZ3MobiksZ3MoZSl9ZWxzZSBjLmVkZ2U9Y3Mobi5zaXRlLGMuc2l0ZSl9fWZ1bmN0aW9uIHdzKHQsbil7dmFyIGU9dC5zaXRlLHI9ZVswXSxpPWVbMV0sbz1pLW47aWYoIW8pcmV0dXJuIHI7dmFyIHU9dC5QO2lmKCF1KXJldHVybi0xLzA7dmFyIGE9KGU9dS5zaXRlKVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybih0WzBdLWVbMF0pKihuWzFdLXRbMV0pLSh0WzBdLW5bMF0pKihlWzFdLXRbMV0pfWZ1bmN0aW9uIFRzKHQsbil7cmV0dXJuIG5bMV0tdFsxXXx8blswXS10WzBdfWZ1bmN0aW9uIE5zKHQsbil7dmFyIGUscixpLG89dC5zb3J0KFRzKS5wb3AoKTtmb3IoRF89W10sTF89bmV3IEFycmF5KHQubGVuZ3RoKSxSXz1uZXcgcnMscV89bmV3IHJzOzspaWYoaT1QXyxvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpb1swXT09PWUmJm9bMV09PT1yfHwoYnMobyksZT1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7eHMoaS5hcmMpfWlmKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPUxfLmxlbmd0aDtpPG87KytpKWlmKCh0PUxfW2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09cHModCxEX1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19KCksbil7dmFyIHU9K25bMF1bMF0sYT0rblswXVsxXSxjPStuWzFdWzBdLHM9K25bMV1bMV07KGZ1bmN0aW9uKHQsbixlLHIpe2Zvcih2YXIgaSxvPURfLmxlbmd0aDtvLS07KWhzKGk9RF9bb10sdCxuLGUscikmJmxzKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPkZffHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPkZfKXx8ZGVsZXRlIERfW29dfSkodSxhLGMscyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LGc9TF8ubGVuZ3RoLF89ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89TF9baV0pe2Zvcih1PW8uc2l0ZSxhPShjPW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylEX1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylkPShwPXZzKG8sRF9bY1thXV0pKVswXSx2PXBbMV0sbD0oZj1kcyhvLERfW2NbKythJXNdXSkpWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT5GX3x8TWF0aC5hYnModi1oKT5GXykmJihjLnNwbGljZShhLDAsRF8ucHVzaChzcyh1LHAsTWF0aC5hYnMoZC10KTxGXyYmci12PkZfP1t0LE1hdGguYWJzKGwtdCk8Rl8/aDpyXTpNYXRoLmFicyh2LXIpPEZfJiZlLWQ+Rl8/W01hdGguYWJzKGgtcik8Rl8/bDplLHJdOk1hdGguYWJzKGQtZSk8Rl8mJnYtbj5GXz9bZSxNYXRoLmFicyhsLWUpPEZfP2g6bl06TWF0aC5hYnModi1uKTxGXyYmZC10PkZfP1tNYXRoLmFicyhoLW4pPEZfP2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoXz0hMSl9aWYoXyl7dmFyIHksbSx4LGI9MS8wO2ZvcihpPTAsXz1udWxsO2k8ZzsrK2kpKG89TF9baV0pJiYoeD0oeT0odT1vLnNpdGUpWzBdLXQpKnkrKG09dVsxXS1uKSptKTxiJiYoYj14LF89byk7aWYoXyl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxUPVtlLHJdLE49W2Usbl07Xy5oYWxmZWRnZXMucHVzaChEXy5wdXNoKHNzKHU9Xy5zaXRlLHcsTSkpLTEsRF8ucHVzaChzcyh1LE0sVCkpLTEsRF8ucHVzaChzcyh1LFQsTikpLTEsRF8ucHVzaChzcyh1LE4sdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89TF9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgTF9baV0pfSh1LGEsYyxzKX10aGlzLmVkZ2VzPURfLHRoaXMuY2VsbHM9TF8sUl89cV89RF89TF89bnVsbH1mdW5jdGlvbiBrcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU3ModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIEVzKHQpe3JldHVybiB0Ll9fem9vbXx8WV99ZnVuY3Rpb24gQXMoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIENzKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24genMoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gUHMoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gUnMoKXtyZXR1cm4gdGhpcy5fX3pvb218fFlffWZ1bmN0aW9uIExzKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHFzKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIERzKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sdT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSx1Pm8/KG8rdSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLHUpKX12YXIgVXM9ZShuKSxPcz1Vcy5yaWdodCxGcz1Vcy5sZWZ0LElzPUFycmF5LnByb3RvdHlwZSxZcz1Jcy5zbGljZSxCcz1Jcy5tYXAsSHM9TWF0aC5zcXJ0KDUwKSxqcz1NYXRoLnNxcnQoMTApLFhzPU1hdGguc3FydCgyKSxWcz1BcnJheS5wcm90b3R5cGUuc2xpY2UsJHM9MSxXcz0yLFpzPTMsR3M9NCxRcz0xZS02LEpzPXt2YWx1ZTpmdW5jdGlvbigpe319O2sucHJvdG90eXBlPU4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscj10aGlzLl8saT1mdW5jdGlvbih0LG4pe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9IiIscj10LmluZGV4T2YoIi4iKTtpZihyPj0wJiYoZT10LnNsaWNlKHIrMSksdD10LnNsaWNlKDAscikpLHQmJiFuLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTplfX0pfSh0KyIiLHIpLG89LTEsdT1pLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK288dTspaWYoZT0odD1pW29dKS50eXBlKXJbZV09UyhyW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gcilyW2VdPVMocltlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288dTspaWYoKGU9KHQ9aVtvXSkudHlwZSkmJihlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYoKGU9dFtyXSkubmFtZT09PW4pcmV0dXJuIGUudmFsdWV9KHJbZV0sdC5uYW1lKSkpcmV0dXJuIGV9fSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sbj10aGlzLl87Zm9yKHZhciBlIGluIG4pdFtlXT1uW2VdLnNsaWNlKCk7cmV0dXJuIG5ldyBrKHQpfSxjYWxsOmZ1bmN0aW9uKHQsbil7aWYoKGU9YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgZSxyLGk9bmV3IEFycmF5KGUpLG89MDtvPGU7KytvKWlbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLGU9KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxlOysrbylyW29dLnZhbHVlLmFwcGx5KG4saSl9LGFwcGx5OmZ1bmN0aW9uKHQsbixlKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgcj10aGlzLl9bdF0saT0wLG89ci5sZW5ndGg7aTxvOysraSlyW2ldLnZhbHVlLmFwcGx5KG4sZSl9fTt2YXIgS3M9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHRmPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpLcyx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9LG5mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgZWY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFlZi5tYXRjaGVzKXt2YXIgcmY9ZWYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxlZi5tc01hdGNoZXNTZWxlY3Rvcnx8ZWYubW96TWF0Y2hlc1NlbGVjdG9yfHxlZi5vTWF0Y2hlc1NlbGVjdG9yO25mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByZi5jYWxsKHRoaXMsdCl9fX19dmFyIG9mPW5mO3EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpxLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciB1Zj0iJCI7SC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lcy5pbmRleE9mKHQpO24+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UobiwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBhZj17fTtpZih0LmV2ZW50PW51bGwsInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7Im9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChhZj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KX12YXIgY2Y9W251bGxdO3V0LnByb3RvdHlwZT1hdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnV0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1LGE9bltpXSxjPWEubGVuZ3RoLHM9cltpXT1uZXcgQXJyYXkoYyksZj0wO2Y8YzsrK2YpKG89YVtmXSkmJih1PXQuY2FsbChvLG8uX19kYXRhX18sZixhKSkmJigiX19kYXRhX18iaW4gbyYmKHUuX19kYXRhX189by5fX2RhdGFfXyksc1tmXT11KTtyZXR1cm4gbmV3IHV0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Uih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIHUsYT1uW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpKHU9YVtzXSkmJihyLnB1c2godC5jYWxsKHUsdS5fX2RhdGFfXyxzLGEpKSxpLnB1c2godSkpO3JldHVybiBuZXcgdXQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1vZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgdXQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/VTpELHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSh0KSk7Zm9yKHZhciBvPWkubGVuZ3RoLHU9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLGM9bmV3IEFycmF5KG8pLHM9MDtzPG87KytzKXt2YXIgZj1yW3NdLGw9aVtzXSxoPWwubGVuZ3RoLHA9dC5jYWxsKGYsZiYmZi5fX2RhdGFfXyxzLHIpLGQ9cC5sZW5ndGgsdj1hW3NdPW5ldyBBcnJheShkKSxnPXVbc109bmV3IEFycmF5KGQpO2UoZixsLHYsZyxjW3NdPW5ldyBBcnJheShoKSxwLG4pO2Zvcih2YXIgXyx5LG09MCx4PTA7bTxkOysrbSlpZihfPXZbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoeT1nW3hdKSYmKyt4PGQ7KTtfLl9uZXh0PXl8fG51bGx9fXJldHVybiB1PW5ldyB1dCh1LHIpLHUuX2VudGVyPWEsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1dCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChMKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgdXQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChMKSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IHV0KHUsdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPS0xLGU9dC5sZW5ndGg7KytuPGU7KWZvcih2YXIgcixpPXRbbl0sbz1pLmxlbmd0aC0xLHU9aVtvXTstLW8+PTA7KShyPWlbb10pJiYodSYmdSE9PXIubmV4dFNpYmxpbmcmJnUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocix1KSx1PXIpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9dHx8KHQ9Tyk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIHUsYT1lW29dLGM9YS5sZW5ndGgscz1pW29dPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikodT1hW2ZdKSYmKHNbZl09dSk7cy5zb3J0KG4pfXJldHVybiBuZXcgdXQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciB1PXJbaV07aWYodSlyZXR1cm4gdX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLHU9MCxhPW8ubGVuZ3RoO3U8YTsrK3UpKGk9b1t1XSkmJnQuY2FsbChpLGkuX19kYXRhX18sdSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPUUodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZS5sb2NhbD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fTplLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19OmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19KSh0LG4sbnVsbD09ZT8iIjplKSk6SSh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPVkodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHI9Qih0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9qOlgpKHRoaXMsdCl9fTpuP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2oodGhpcyx0KX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe1godGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9WOigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/JDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goVyl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChaKX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QSh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0saW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBKHQpLHI9bnVsbD09bj9HOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246eihuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goUSl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0s6Sil9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9KHQrIiIpLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP3J0OmV0LG51bGw9PWUmJihlPSExKSxyPTA7cjx1Oysrcil0aGlzLmVhY2goYShvW3JdLG4sZSkpO3JldHVybiB0aGlzfXZhciBhPXRoaXMubm9kZSgpLl9fb247aWYoYSlmb3IodmFyIGMscz0wLGY9YS5sZW5ndGg7czxmOysrcylmb3Iocj0wLGM9YVtzXTtyPHU7KytyKWlmKChpPW9bcl0pLnR5cGU9PT1jLnR5cGUmJmkubmFtZT09PWMubmFtZSlyZXR1cm4gYy52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gb3QodGhpcyx0LG4pfX0pKHQsbikpfX07dmFyIHNmPTA7ZnQucHJvdG90eXBlPXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZnQsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0seHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIGZmPSJcXHMqKFsrLV0/XFxkKylcXHMqIixsZj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixoZj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIscGY9L14jKFswLTlhLWZdezN9KSQvLGRmPS9eIyhbMC05YS1mXXs2fSkkLyx2Zj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZmYsZmYsZmZdKyJcXCkkIiksZ2Y9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2hmLGhmLGhmXSsiXFwpJCIpLF9mPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZmYsZmYsZmYsbGZdKyJcXCkkIikseWY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1toZixoZixoZixsZl0rIlxcKSQiKSxtZj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbbGYsaGYsaGZdKyJcXCkkIikseGY9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tsZixoZixoZixsZl0rIlxcKSQiKSxiZj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtOdChTdCxFdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLE50KFJ0LFB0LGt0KFN0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgUnQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IFJ0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksTnQoRHQscXQsa3QoU3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBEdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBEdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IFJ0KFV0KHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFV0KHQsaSxyKSxVdCh0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgd2Y9TWF0aC5QSS8xODAsTWY9MTgwL01hdGguUEksVGY9Ljk1MDQ3LE5mPTEsa2Y9MS4wODg4MyxTZj00LzI5LEVmPTYvMjksQWY9MypFZipFZixDZj1FZipFZipFZjtOdChJdCxGdCxrdChTdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJdCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEl0KHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIHQ9TmYqQnQodCksbj1UZipCdChuKSxlPWtmKkJ0KGUpLG5ldyBSdChIdCgzLjI0MDQ1NDIqbi0xLjUzNzEzODUqdC0uNDk4NTMxNCplKSxIdCgtLjk2OTI2NipuKzEuODc2MDEwOCp0Ky4wNDE1NTYqZSksSHQoLjA1NTY0MzQqbi0uMjA0MDI1OSp0KzEuMDU3MjI1MiplKSx0aGlzLm9wYWNpdHkpfX0pKSxOdChWdCxYdCxrdChTdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBWdCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFZ0KHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIE90KHRoaXMpLnJnYigpfX0pKTt2YXIgemY9LS4yOTIyNyxQZj0tLjkwNjQ5LFJmPTEuOTcyOTQsTGY9UmYqUGYscWY9MS43ODI3NypSZixEZj0xLjc4Mjc3KnpmLSAtLjE0ODYxKlBmO050KFd0LCR0LGt0KFN0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgV3QodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgV3QodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKndmLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBSdCgyNTUqKG4rZSooLS4xNDg2MSpyKzEuNzgyNzcqaSkpLDI1NSoobitlKih6ZipyK1BmKmkpKSwyNTUqKG4rZSooUmYqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBVZixPZixGZixJZixZZixCZixIZj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxuKXt2YXIgZT1yKCh0PVB0KHQpKS5yLChuPVB0KG4pKS5yKSxpPXIodC5nLG4uZyksbz1yKHQuYixuLmIpLHU9ZW4odC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnI9ZShuKSx0Lmc9aShuKSx0LmI9byhuKSx0Lm9wYWNpdHk9dShuKSx0KyIifX12YXIgcj1ubihuKTtyZXR1cm4gZS5nYW1tYT10LGV9KDEpLGpmPXJuKEd0KSxYZj1ybihRdCksVmY9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLCRmPW5ldyBSZWdFeHAoVmYuc291cmNlLCJnIiksV2Y9MTgwL01hdGguUEksWmY9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX0sR2Y9cG4oZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dD9aZjooVWZ8fChVZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxPZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsRmY9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLFVmLnN0eWxlLnRyYW5zZm9ybT10LHQ9RmYuZ2V0Q29tcHV0ZWRTdHlsZShPZi5hcHBlbmRDaGlsZChVZiksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksT2YucmVtb3ZlQ2hpbGQoVWYpLHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpLGhuKCt0WzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9LCJweCwgIiwicHgpIiwiZGVnKSIpLFFmPXBuKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1pmOihJZnx8KElmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLElmLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1JZi50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT8odD10Lm1hdHJpeCxobih0LmEsdC5iLHQuYyx0LmQsdC5lLHQuZikpOlpmKX0sIiwgIiwiKSIsIikiKSxKZj1NYXRoLlNRUlQyLEtmPTIsdGw9NCxubD0xZS0xMixlbD1nbih0bikscmw9Z24oZW4pLGlsPV9uKHRuKSxvbD1fbihlbiksdWw9eW4odG4pLGFsPXluKGVuKSxjbD0wLHNsPTAsZmw9MCxsbD0xZTMsaGw9MCxwbD0wLGRsPTAsdmw9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsZ2w9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07Ym4ucHJvdG90eXBlPXduLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Ym4scmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP21uKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fEJmPT09dGhpc3x8KEJmP0JmLl9uZXh0PXRoaXM6WWY9dGhpcyxCZj10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLGtuKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGtuKCkpfX07dmFyIF9sPU4oInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikseWw9W10sbWw9MCx4bD0xLGJsPTIsd2w9MyxNbD00LFRsPTUsTmw9NixrbD1hdC5wcm90b3R5cGUuY29uc3RydWN0b3IsU2w9MCxFbD1hdC5wcm90b3R5cGU7cW4ucHJvdG90eXBlPURuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cW4sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eih0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89bmV3IEFycmF5KGkpLHU9MDt1PGk7Kyt1KWZvcih2YXIgYSxjLHM9clt1XSxmPXMubGVuZ3RoLGw9b1t1XT1uZXcgQXJyYXkoZiksaD0wO2g8ZjsrK2gpKGE9c1toXSkmJihjPXQuY2FsbChhLGEuX19kYXRhX18saCxzKSkmJigiX19kYXRhX18iaW4gYSYmKGMuX19kYXRhX189YS5fX2RhdGFfXyksbFtoXT1jLEVuKGxbaF0sbixlLGgsbCx6bihhLGUpKSk7cmV0dXJuIG5ldyBxbihvLHRoaXMuX3BhcmVudHMsbixlKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Uih0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89W10sdT1bXSxhPTA7YTxpOysrYSlmb3IodmFyIGMscz1yW2FdLGY9cy5sZW5ndGgsbD0wO2w8ZjsrK2wpaWYoYz1zW2xdKXtmb3IodmFyIGgscD10LmNhbGwoYyxjLl9fZGF0YV9fLGwscyksZD16bihjLGUpLHY9MCxnPXAubGVuZ3RoO3Y8ZzsrK3YpKGg9cFt2XSkmJkVuKGgsbixlLHYscCxkKTtvLnB1c2gocCksdS5wdXNoKGMpfXJldHVybiBuZXcgcW4obyx1LG4sZSl9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9b2YodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sdT1uW2ldLGE9dS5sZW5ndGgsYz1yW2ldPVtdLHM9MDtzPGE7KytzKShvPXVbc10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IHFuKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IHFuKHUsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrbCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9VW4oKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcylpZih1PWFbc10pe3ZhciBmPXpuKHUsbik7RW4odSx0LGUscyxhLHt0aW1lOmYudGltZStmLmRlbGF5K2YuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpmLmR1cmF0aW9uLGVhc2U6Zi5lYXNlfSl9cmV0dXJuIG5ldyBxbihyLHRoaXMuX3BhcmVudHMsdCxlKX0sY2FsbDpFbC5jYWxsLG5vZGVzOkVsLm5vZGVzLG5vZGU6RWwubm9kZSxzaXplOkVsLnNpemUsZW1wdHk6RWwuZW1wdHksZWFjaDpFbC5lYWNoLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj96bih0aGlzLm5vZGUoKSxlKS5vbi5vbih0KTp0aGlzLmVhY2goZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpe3ZhciBuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYodD10LnNsaWNlKDAsbikpLCF0fHwic3RhcnQiPT09dH0pfShuKT9BbjpDbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1vKHRoaXMsdCksYT11Lm9uO2EhPT1yJiYoaT0ocj1hKS5jb3B5KCkpLm9uKG4sZSksdS5vbj1pfX0oZSx0LG4pKX0sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPUUodCkscj0idHJhbnNmb3JtIj09PWU/UWY6TG47cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/KGUubG9jYWw/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7aWYobnVsbCE9YSlyZXR1cm4odT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTtpZihudWxsIT1hKXJldHVybih1PXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkoZSxyLFJuKHRoaXMsImF0dHIuIit0LG4pKTpudWxsPT1uPyhlLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUpOihlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fSkoZSxyLG4rIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIGU9ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4oZT10aGlzLnR3ZWVuKGUpKSYmZS5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihlLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjt2YXIgcj1FKHQpO3JldHVybiB0aGlzLnR3ZWVuKGUsKHIubG9jYWw/ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX06ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZSh0LHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfSkocixuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9HZjpMbjtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1JKHRoaXMsdCksdT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxJKHRoaXMsdCkpO3JldHVybiBvPT09dT9udWxsOm89PT1lJiZ1PT09cj9pOmk9bihlPW8scj11KX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1JKHRoaXMsdCksYT1lKHRoaXMpO3JldHVybiBudWxsPT1hJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxhPUkodGhpcyx0KSksdT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSl9fSh0LHIsUm4odGhpcywic3R5bGUuIit0LG4pKTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1JKHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oUm4odGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9fSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByLGk9em4odGhpcy5ub2RlKCksZSkudHdlZW4sbz0wLHU9aS5sZW5ndGg7bzx1OysrbylpZigocj1pW29dKS5uYW1lPT09dClyZXR1cm4gci52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQsbil7dmFyIGUscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1Dbih0aGlzLHQpLG89aS50d2VlbjtpZihvIT09ZSlmb3IodmFyIHU9MCxhPShyPWU9bykubGVuZ3RoO3U8YTsrK3UpaWYoclt1XS5uYW1lPT09bil7KHI9ci5zbGljZSgpKS5zcGxpY2UodSwxKTticmVha31pLnR3ZWVuPXJ9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Q24odGhpcyx0KSx1PW8udHdlZW47aWYodSE9PXIpe2k9KHI9dSkuc2xpY2UoKTtmb3IodmFyIGE9e25hbWU6bix2YWx1ZTplfSxjPTAscz1pLmxlbmd0aDtjPHM7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109YTticmVha31jPT09cyYmaS5wdXNoKGEpfW8udHdlZW49aX19KShlLHQsbikpfSxkZWxheTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7QW4odGhpcyx0KS5kZWxheT0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7QW4odGhpcyx0KS5kZWxheT1ufX0pKG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7Q24odGhpcyx0KS5kdXJhdGlvbj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7Q24odGhpcyx0KS5kdXJhdGlvbj1ufX0pKG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtDbih0aGlzLHQpLmVhc2U9bn19KG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmVhc2V9fTt2YXIgQWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxDbD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSx6bD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LG4pOjItTWF0aC5wb3coMi10LG4pKS8yfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxQbD1NYXRoLlBJLFJsPVBsLzIsTGw9NC8xMSxxbD02LzExLERsPTgvMTEsVWw9Ljc1LE9sPTkvMTEsRmw9MTAvMTEsSWw9LjkzNzUsWWw9MjEvMjIsQmw9NjMvNjQsSGw9MS9MbC9MbCxqbD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLFhsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksVmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8MT90KnQqKChuKzEpKnQtbik6KHQtPTIpKnQqKChuKzEpKnQrbikrMikvMn1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLCRsPTIqTWF0aC5QSSxXbD1mdW5jdGlvbiB0KG4sZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0tdCkqTWF0aC5zaW4oKGktdCkvZSl9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz0kbCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSokbCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KDEsLjMpLFpsPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtpKS9lKX12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPSRsKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKiRsKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oMSwuMyksR2w9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvZSkpLzJ9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz0kbCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSokbCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KDEsLjMpLFFsPXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpGbn07YXQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7UG4odGhpcyx0KX0pfSxhdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBxbj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVVuKCksKGU9UWwpLnRpbWU9bW4oKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciB1LGE9cltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiZFbih1LHQsbixzLGEsZXx8am4odSxuKSk7cmV0dXJuIG5ldyBxbihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIEpsPVtudWxsXSxLbD17bmFtZToiZHJhZyJ9LHRoPXtuYW1lOiJzcGFjZSJ9LG5oPXtuYW1lOiJoYW5kbGUifSxlaD17bmFtZToiY2VudGVyIn0scmg9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChXbiksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1t0WzBdLG5bMF1bMV1dLFt0WzFdLG5bMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LGloPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoV24pLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbblswXVswXSx0WzBdXSxbblsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxvaD17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoV24pLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx1aD17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sYWg9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LGNoPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSxzaD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSxmaD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfSxsaD1NYXRoLmNvcyxoaD1NYXRoLnNpbixwaD1NYXRoLlBJLGRoPXBoLzIsdmg9MipwaCxnaD1NYXRoLm1heCxfaD1BcnJheS5wcm90b3R5cGUuc2xpY2UseWg9TWF0aC5QSSxtaD0yKnloLHhoPW1oLTFlLTY7bmUucHJvdG90eXBlPWVlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bmUsbW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K24pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9IlEiKyArdCsiLCIrICtuKyIsIisodGhpcy5feDE9K2UpKyIsIisodGhpcy5feTE9K3IpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArbisiLCIrICtlKyIsIisgK3IrIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsbixlLHIsaSl7dD0rdCxuPStuLGU9K2Uscj0rcixpPStpO3ZhciBvPXRoaXMuX3gxLHU9dGhpcy5feTEsYT1lLXQsYz1yLW4scz1vLXQsZj11LW4sbD1zKnMrZipmO2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZSBpZihsPjFlLTYpaWYoTWF0aC5hYnMoZiphLWMqcyk+MWUtNiYmaSl7dmFyIGg9ZS1vLHA9ci11LGQ9YSphK2MqYyx2PWgqaCtwKnAsZz1NYXRoLnNxcnQoZCksXz1NYXRoLnNxcnQobCkseT1pKk1hdGgudGFuKCh5aC1NYXRoLmFjb3MoKGQrbC12KS8oMipnKl8pKSkvMiksbT15L18seD15L2c7TWF0aC5hYnMobS0xKT4xZS02JiYodGhpcy5fKz0iTCIrKHQrbSpzKSsiLCIrKG4rbSpmKSksdGhpcy5fKz0iQSIraSsiLCIraSsiLDAsMCwiKyArKGYqaD5zKnApKyIsIisodGhpcy5feDE9dCt4KmEpKyIsIisodGhpcy5feTE9bit4KmMpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dD0rdCxuPStuO3ZhciB1PShlPStlKSpNYXRoLmNvcyhyKSxhPWUqTWF0aC5zaW4ociksYz10K3Uscz1uK2EsZj0xXm8sbD1vP3ItaTppLXI7aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2UpO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitjKyIsIitzOihNYXRoLmFicyh0aGlzLl94MS1jKT4xZS02fHxNYXRoLmFicyh0aGlzLl95MS1zKT4xZS02KSYmKHRoaXMuXys9IkwiK2MrIiwiK3MpLGUmJihsPDAmJihsPWwlbWgrbWgpLGw+eGg/dGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0LXUpKyIsIisobi1hKSsiQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0aGlzLl94MT1jKSsiLCIrKHRoaXMuX3kxPXMpOmw+MWUtNiYmKHRoaXMuXys9IkEiK2UrIiwiK2UrIiwwLCIrICsobD49eWgpKyIsIitmKyIsIisodGhpcy5feDE9dCtlKk1hdGguY29zKGkpKSsiLCIrKHRoaXMuX3kxPW4rZSpNYXRoLnNpbihpKSkpKX0scmVjdDpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pKyJoIisgK2UrInYiKyArcisiaCIrLWUrIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTtjZS5wcm90b3R5cGU9c2UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjZSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbIiQiK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPSIkIit0O3JldHVybiBuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2godGhpc1tuXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgYmg9c2UucHJvdG90eXBlO2RlLnByb3RvdHlwZT12ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmRlLGhhczpiaC5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0Kz0iIix0aGlzWyIkIit0XT10LHRoaXN9LHJlbW92ZTpiaC5yZW1vdmUsY2xlYXI6YmguY2xlYXIsdmFsdWVzOmJoLmtleXMsc2l6ZTpiaC5zaXplLGVtcHR5OmJoLmVtcHR5LGVhY2g6YmguZWFjaH07dmFyIHdoPXt9LE1oPXt9LFRoPTM0LE5oPTEwLGtoPTEzLFNoPV9lKCIsIiksRWg9U2gucGFyc2UsQWg9U2gucGFyc2VSb3dzLENoPVNoLmZvcm1hdCx6aD1TaC5mb3JtYXRSb3dzLFBoPV9lKCJcdCIpLFJoPVBoLnBhcnNlLExoPVBoLnBhcnNlUm93cyxxaD1QaC5mb3JtYXQsRGg9UGguZm9ybWF0Um93cyxVaD1UZS5wcm90b3R5cGU9TmUucHJvdG90eXBlO1VoLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IE5lKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1rZShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPWtlKG4pKTtyZXR1cm4gZX0sVWguYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4geGUodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sVWguYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsdT1uZXcgQXJyYXkobyksYT1uZXcgQXJyYXkobyksYz0xLzAscz0xLzAsZj0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KHVbZV09cixhW2VdPWkscjxjJiYoYz1yKSxyPmYmJihmPXIpLGk8cyYmKHM9aSksaT5sJiYobD1pKSk7Zm9yKGY8YyYmKGM9dGhpcy5feDAsZj10aGlzLl94MSksbDxzJiYocz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGMscykuY292ZXIoZixsKSxlPTA7ZTxvOysrZSl4ZSh0aGlzLHVbZV0sYVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sVWguY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxVaC5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LFVoLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sVWguZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLHUsYSxjLHMsZj10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEscD10aGlzLl95MSxkPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmZC5wdXNoKG5ldyBiZSh2LGYsbCxoLHApKSxudWxsPT1lP2U9MS8wOihmPXQtZSxsPW4tZSxoPXQrZSxwPW4rZSxlKj1lKTtjPWQucG9wKCk7KWlmKCEoISh2PWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPnB8fCh1PWMueDEpPGZ8fChhPWMueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgZz0oaSt1KS8yLF89KG8rYSkvMjtkLnB1c2gobmV3IGJlKHZbM10sZyxfLHUsYSksbmV3IGJlKHZbMl0saSxfLGcsYSksbmV3IGJlKHZbMV0sZyxvLHUsXyksbmV3IGJlKHZbMF0saSxvLGcsXykpLChzPShuPj1fKTw8MXx0Pj1nKSYmKGM9ZFtkLmxlbmd0aC0xXSxkW2QubGVuZ3RoLTFdPWRbZC5sZW5ndGgtMS1zXSxkW2QubGVuZ3RoLTEtc109Yyl9ZWxzZXt2YXIgeT10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLG09bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSx4PXkqeSttKm07aWYoeDxlKXt2YXIgYj1NYXRoLnNxcnQoZT14KTtmPXQtYixsPW4tYixoPXQrYixwPW4rYixyPXYuZGF0YX19cmV0dXJuIHJ9LFVoLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKHU9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLHUsYSxjLHMsZixsLGgscD10aGlzLl9yb290LGQ9dGhpcy5feDAsdj10aGlzLl95MCxnPXRoaXMuX3gxLF89dGhpcy5feTE7aWYoIXApcmV0dXJuIHRoaXM7aWYocC5sZW5ndGgpZm9yKDs7KXtpZigocz1vPj0oYT0oZCtnKS8yKSk/ZD1hOmc9YSwoZj11Pj0oYz0oditfKS8yKSk/dj1jOl89YyxuPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gdGhpcztpZighcC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtwLmRhdGEhPT10OylpZihyPXAsIShwPXAubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9cC5uZXh0KSYmZGVsZXRlIHAubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKHA9blswXXx8blsxXXx8blsyXXx8blszXSkmJnA9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFwLmxlbmd0aCYmKGU/ZVtoXT1wOnRoaXMuX3Jvb3Q9cCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sVWgucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sVWgucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxVaC5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LFVoLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhPVtdLGM9dGhpcy5fcm9vdDtmb3IoYyYmYS5wdXNoKG5ldyBiZShjLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj1hLnBvcCgpOylpZighdChjPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSx1PW4ueTEpJiZjLmxlbmd0aCl7dmFyIHM9KHIrbykvMixmPShpK3UpLzI7KGU9Y1szXSkmJmEucHVzaChuZXcgYmUoZSxzLGYsbyx1KSksKGU9Y1syXSkmJmEucHVzaChuZXcgYmUoZSxyLGYscyx1KSksKGU9Y1sxXSkmJmEucHVzaChuZXcgYmUoZSxzLGksbyxmKSksKGU9Y1swXSkmJmEucHVzaChuZXcgYmUoZSxyLGkscyxmKSl9cmV0dXJuIHRoaXN9LFVoLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IGJlKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IGJlKG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IGJlKG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IGJlKG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IGJlKG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LFVoLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxVaC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIE9oLEZoPTEwLEloPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxZaD17IiI6ZnVuY3Rpb24odCxuKXt0OmZvcih2YXIgZSxyPSh0PXQudG9QcmVjaXNpb24obikpLmxlbmd0aCxpPTEsbz0tMTtpPHI7KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOm89ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PW8mJihvPWkpLGU9aTticmVhaztjYXNlImUiOmJyZWFrIHQ7ZGVmYXVsdDpvPjAmJihvPTApfXJldHVybiBvPjA/dC5zbGljZSgwLG8pK3Quc2xpY2UoZSsxKTp0fSwiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiBxZSgxMDAqdCxuKX0scjpxZSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9UmUodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKE9oPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSx1PXIubGVuZ3RoO3JldHVybiBvPT09dT9yOm8+dT9yK25ldyBBcnJheShvLXUrMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrUmUodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sQmg9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2k7RGUucHJvdG90eXBlPVVlLnByb3RvdHlwZSxVZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSt0aGlzLnR5cGV9O3ZhciBIaCxqaD1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07SWUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSksWGUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYZSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe1ZlKHdwLHQsdGhpcy50KSxWZSh0aGlzLHdwLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz13cC50OnRoaXMucz13cC50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBYaCxWaCwkaCxXaCxaaCxHaCxRaCxKaCxLaCx0cCxucCxlcCxycCxpcCxvcCx1cCxhcCxjcCxzcCxmcCxscCxocCxwcCxkcCx2cCxncCxfcCx5cCxtcCx4cCxicCx3cD1uZXcgWGUsTXA9MWUtNixUcD0xZS0xMixOcD1NYXRoLlBJLGtwPU5wLzIsU3A9TnAvNCxFcD0yKk5wLEFwPTE4MC9OcCxDcD1OcC8xODAsenA9TWF0aC5hYnMsUHA9TWF0aC5hdGFuLFJwPU1hdGguYXRhbjIsTHA9TWF0aC5jb3MscXA9TWF0aC5jZWlsLERwPU1hdGguZXhwLFVwPU1hdGgubG9nLE9wPU1hdGgucG93LEZwPU1hdGguc2luLElwPU1hdGguc2lnbnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfSxZcD1NYXRoLnNxcnQsQnA9TWF0aC50YW4sSHA9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtRZSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspUWUoZVtyXS5nZW9tZXRyeSxuKX19LGpwPXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7SmUodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KUplKGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe0tlKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspS2UoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KVFlKGVbcl0sbil9fSxYcD1qZSgpLFZwPWplKCksJHA9e3BvaW50OkdlLGxpbmVTdGFydDpHZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1hwLnJlc2V0KCksJHAubGluZVN0YXJ0PW5yLCRwLmxpbmVFbmQ9ZXJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgdD0rWHA7VnAuYWRkKHQ8MD9FcCt0OnQpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PUdlfSxzcGhlcmU6ZnVuY3Rpb24oKXtWcC5hZGQoRXApfX0sV3A9amUoKSxacD17cG9pbnQ6aHIsbGluZVN0YXJ0OmRyLGxpbmVFbmQ6dnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WnAucG9pbnQ9Z3IsWnAubGluZVN0YXJ0PV9yLFpwLmxpbmVFbmQ9eXIsV3AucmVzZXQoKSwkcC5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpeyRwLnBvbHlnb25FbmQoKSxacC5wb2ludD1ocixacC5saW5lU3RhcnQ9ZHIsWnAubGluZUVuZD12cixYcDwwPyhHaD0tKEpoPTE4MCksUWg9LShLaD05MCkpOldwPk1wP0toPTkwOldwPC1NcCYmKFFoPS05MCksb3BbMF09R2gsb3BbMV09Smh9fSxHcD17c3BoZXJlOkdlLHBvaW50OndyLGxpbmVTdGFydDpUcixsaW5lRW5kOlNyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0dwLmxpbmVTdGFydD1FcixHcC5saW5lRW5kPUFyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7R3AubGluZVN0YXJ0PVRyLEdwLmxpbmVFbmQ9U3J9fTtMci5pbnZlcnQ9THI7dmFyIFFwLEpwLEtwLHRkLG5kLGVkLHJkLGlkLG9kLHVkLGFkLGNkPWplKCksc2Q9V3IoZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24odCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLHUpe3ZhciBhPW8+MD9OcDotTnAsYz16cChvLWUpO3pwKGMtTnApPE1wPyh0LnBvaW50KGUscj0ocit1KS8yPjA/a3A6LWtwKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksdC5wb2ludChvLHIpLG49MCk6aSE9PWEmJmM+PU5wJiYoenAoZS1pKTxNcCYmKGUtPWkqTXApLHpwKG8tYSk8TXAmJihvLT1hKk1wKSxyPWZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sdT1GcCh0LWUpO3JldHVybiB6cCh1KT5NcD9QcCgoRnAobikqKG89THAocikpKkZwKGUpLUZwKHIpKihpPUxwKG4pKSpGcCh0KSkvKGkqbyp1KSk6KG4rcikvMn0oZSxyLG8sdSksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLG49MCksdC5wb2ludChlPW8scj11KSxpPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLW59fX0sZnVuY3Rpb24odCxuLGUscil7dmFyIGk7aWYobnVsbD09dClpPWUqa3Asci5wb2ludCgtTnAsaSksci5wb2ludCgwLGkpLHIucG9pbnQoTnAsaSksci5wb2ludChOcCwwKSxyLnBvaW50KE5wLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLU5wLC1pKSxyLnBvaW50KC1OcCwwKSxyLnBvaW50KC1OcCxpKTtlbHNlIGlmKHpwKHRbMF0tblswXSk+TXApe3ZhciBvPXRbMF08blswXT9OcDotTnA7aT1lKm8vMixyLnBvaW50KC1vLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG8saSl9ZWxzZSByLnBvaW50KG5bMF0sblsxXSl9LFstTnAsLWtwXSksZmQ9MWU5LGxkPS1mZCxoZD1qZSgpLHBkPXtzcGhlcmU6R2UscG9pbnQ6R2UsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7cGQucG9pbnQ9dGkscGQubGluZUVuZD1Lcn0sbGluZUVuZDpHZSxwb2x5Z29uU3RhcnQ6R2UscG9seWdvbkVuZDpHZX0sZGQ9W251bGwsbnVsbF0sdmQ9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmRkfSxnZD17RmVhdHVyZTpmdW5jdGlvbih0LG4pe3JldHVybiBpaSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoaWkoZVtyXS5nZW9tZXRyeSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LF9kPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gb2kodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYob2koZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe3JldHVybiB1aSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKHVpKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYWkodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihhaShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoaWkoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LHlkPWplKCksbWQ9amUoKSx4ZD17cG9pbnQ6R2UsbGluZVN0YXJ0OkdlLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eGQubGluZVN0YXJ0PWRpLHhkLmxpbmVFbmQ9X2l9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt4ZC5saW5lU3RhcnQ9eGQubGluZUVuZD14ZC5wb2ludD1HZSx5ZC5hZGQoenAobWQpKSxtZC5yZXNldCgpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD15ZC8yO3JldHVybiB5ZC5yZXNldCgpLHR9fSxiZD0xLzAsd2Q9YmQsTWQ9LWJkLFRkPU1kLE5kPXtwb2ludDpmdW5jdGlvbih0LG4pe3Q8YmQmJihiZD10KSx0Pk1kJiYoTWQ9dCksbjx3ZCYmKHdkPW4pLG4+VGQmJihUZD1uKX0sbGluZVN0YXJ0OkdlLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OkdlLHBvbHlnb25FbmQ6R2UscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9W1tiZCx3ZF0sW01kLFRkXV07cmV0dXJuIE1kPVRkPS0od2Q9YmQ9MS8wKSx0fX0sa2Q9MCxTZD0wLEVkPTAsQWQ9MCxDZD0wLHpkPTAsUGQ9MCxSZD0wLExkPTAscWQ9e3BvaW50OnlpLGxpbmVTdGFydDptaSxsaW5lRW5kOndpLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FkLmxpbmVTdGFydD1NaSxxZC5saW5lRW5kPVRpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cWQucG9pbnQ9eWkscWQubGluZVN0YXJ0PW1pLHFkLmxpbmVFbmQ9d2l9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PUxkP1tQZC9MZCxSZC9MZF06emQ/W0FkL3pkLENkL3pkXTpFZD9ba2QvRWQsU2QvRWRdOltOYU4sTmFOXTtyZXR1cm4ga2Q9U2Q9RWQ9QWQ9Q2Q9emQ9UGQ9UmQ9TGQ9MCx0fX07U2kucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsbiksdGhpcy5fY29udGV4dC5hcmModCxuLHRoaXMuX3JhZGl1cywwLEVwKX19LHJlc3VsdDpHZX07dmFyIERkLFVkLE9kLEZkLElkLFlkPWplKCksQmQ9e3BvaW50OkdlLGxpbmVTdGFydDpmdW5jdGlvbigpe0JkLnBvaW50PUVpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7RGQmJkFpKFVkLE9kKSxCZC5wb2ludD1HZX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGQ9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtEZD1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rWWQ7cmV0dXJuIFlkLnJlc2V0KCksdH19O0NpLnByb3RvdHlwZT17X3JhZGl1czo0LjUsX2NpcmNsZTp6aSg0LjUpLHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybih0PSt0KSE9PXRoaXMuX3JhZGl1cyYmKHRoaXMuX3JhZGl1cz10LHRoaXMuX2NpcmNsZT1udWxsKSx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9zdHJpbmcucHVzaCgiWiIpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fc3RyaW5nLnB1c2goIkwiLHQsIiwiLG4pO2JyZWFrO2RlZmF1bHQ6bnVsbD09dGhpcy5fY2lyY2xlJiYodGhpcy5fY2lyY2xlPXppKHRoaXMuX3JhZGl1cykpLHRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuLHRoaXMuX2NpcmNsZSl9fSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdHJpbmcubGVuZ3RoKXt2YXIgdD10aGlzLl9zdHJpbmcuam9pbigiIik7cmV0dXJuIHRoaXMuX3N0cmluZz1bXSx0fXJldHVybiBudWxsfX0sUmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSaSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTt2YXIgSGQ9MTYsamQ9THAoMzAqQ3ApLFhkPVBpKHtwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQqQ3AsbipDcCl9fSksVmQ9VmkoZnVuY3Rpb24odCl7cmV0dXJuIFlwKDIvKDErdCkpfSk7VmQuaW52ZXJ0PSRpKGZ1bmN0aW9uKHQpe3JldHVybiAyKldlKHQvMil9KTt2YXIgJGQ9VmkoZnVuY3Rpb24odCl7cmV0dXJuKHQ9JGUodCkpJiZ0L0ZwKHQpfSk7JGQuaW52ZXJ0PSRpKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksV2kuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipQcChEcChuKSkta3BdfSxKaS5pbnZlcnQ9SmksdG8uaW52ZXJ0PSRpKFBwKSxlby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsdT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSt1KiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KnUpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrdSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSp1KSkpfXdoaWxlKHpwKGUpPk1wJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxyby5pbnZlcnQ9JGkoV2UpLGlvLmludmVydD0kaShmdW5jdGlvbih0KXtyZXR1cm4gMipQcCh0KX0pLG9vLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKlBwKERwKHQpKS1rcF19LHZvLnByb3RvdHlwZT1mby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnZvLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHNvKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsdT1bb107ZG97Zm9yKG49dS5yZXZlcnNlKCksdT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXUucHVzaChlW3JdKX13aGlsZSh1Lmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSx1PVtdO2k9by5wb3AoKTspaWYodS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPXUucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZm8odGhpcykuZWFjaEJlZm9yZShobyl9fTt2YXIgV2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLFpkPSIkIixHZD17ZGVwdGg6LTF9LFFkPXt9O0hvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZvLnByb3RvdHlwZSk7dmFyIEpkPSgxK01hdGguc3FydCg1KSkvMixLZD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtYbyhuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oSmQpLHR2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihjPShhPXVbbF0pLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9xbyhhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6am8oYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PVhvKG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oSmQpLG52PVtdLnNsaWNlLGV2PXt9O1pvLnByb3RvdHlwZT1Lby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlpvLGRlZmVyOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJkZWZlciBhZnRlciBhd2FpdCIpO2lmKG51bGwhPXRoaXMuX2Vycm9yKXJldHVybiB0aGlzO3ZhciBuPW52LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBuLnB1c2godCksKyt0aGlzLl93YWl0aW5nLHRoaXMuX3Rhc2tzLnB1c2gobiksR28odGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fZXJyb3ImJlFvKHRoaXMsbmV3IEVycm9yKCJhYm9ydCIpKSx0aGlzfSxhd2FpdDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihuLGUpe3QuYXBwbHkobnVsbCxbbl0uY29uY2F0KGUpKX0sSm8odGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7cmV0dXJuIHRoaXMuX2NhbGw9dCxKbyh0aGlzKSx0aGlzfX07dmFyIHJ2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0dSksaXY9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0dSksb3Y9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9aXYuc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odHUpLHV2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHR1KSxhdj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9dXYuc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odHUpLGN2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHR1KSxzdj1ldSgidGV4dC9odG1sIixmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodC5yZXNwb25zZVRleHQpfSksZnY9ZXUoImFwcGxpY2F0aW9uL2pzb24iLGZ1bmN0aW9uKHQpe3JldHVybiBKU09OLnBhcnNlKHQucmVzcG9uc2VUZXh0KX0pLGx2PWV1KCJ0ZXh0L3BsYWluIixmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNwb25zZVRleHR9KSxodj1ldSgiYXBwbGljYXRpb24veG1sIixmdW5jdGlvbih0KXt2YXIgbj10LnJlc3BvbnNlWE1MO2lmKCFuKXRocm93IG5ldyBFcnJvcigicGFyc2UgZXJyb3IiKTtyZXR1cm4gbn0pLHB2PXJ1KCJ0ZXh0L2NzdiIsRWgpLGR2PXJ1KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIixSaCksdnY9QXJyYXkucHJvdG90eXBlLGd2PXZ2Lm1hcCxfdj12di5zbGljZSx5dj17bmFtZToiaW1wbGljaXQifSxtdj1bMCwxXSx4dj1uZXcgRGF0ZSxidj1uZXcgRGF0ZSx3dj1DdShmdW5jdGlvbigpe30sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3Qrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0pO3d2LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/Q3UoZnVuY3Rpb24obil7bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0sZnVuY3Rpb24obixlKXtuLnNldFRpbWUoK24rZSp0KX0sZnVuY3Rpb24obixlKXtyZXR1cm4oZS1uKS90fSk6d3Y6bnVsbH07dmFyIE12PXd2LnJhbmdlLFR2PTZlNCxOdj02MDQ4ZTUsa3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXRUaW1lKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzFlMypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8xZTN9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLFN2PWt2LnJhbmdlLEV2PUN1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvVHYpKlR2KX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipUdil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVHZ9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLEF2PUV2LnJhbmdlLEN2PUN1KGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpUdiUzNmU1O248MCYmKG4rPTM2ZTUpLHQuc2V0VGltZSgzNmU1Kk1hdGguZmxvb3IoKCt0LW4pLzM2ZTUpK24pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSx6dj1Ddi5yYW5nZSxQdj1DdShmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpUdikvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksUnY9UHYucmFuZ2UsTHY9enUoMCkscXY9enUoMSksRHY9enUoMiksVXY9enUoMyksT3Y9enUoNCksRnY9enUoNSksSXY9enUoNiksWXY9THYucmFuZ2UsQnY9cXYucmFuZ2UsSHY9RHYucmFuZ2UsanY9VXYucmFuZ2UsWHY9T3YucmFuZ2UsVnY9RnYucmFuZ2UsJHY9SXYucmFuZ2UsV3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksWnY9V3YucmFuZ2UsR3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtHdi5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0N1KGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBRdj1Hdi5yYW5nZSxKdj1DdShmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipUdil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVHZ9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLEt2PUp2LnJhbmdlLHRnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLG5nPXRnLnJhbmdlLGVnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLHJnPWVnLnJhbmdlLGlnPVB1KDApLG9nPVB1KDEpLHVnPVB1KDIpLGFnPVB1KDMpLGNnPVB1KDQpLHNnPVB1KDUpLGZnPVB1KDYpLGxnPWlnLnJhbmdlLGhnPW9nLnJhbmdlLHBnPXVnLnJhbmdlLGRnPWFnLnJhbmdlLHZnPWNnLnJhbmdlLGdnPXNnLnJhbmdlLF9nPWZnLnJhbmdlLHlnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLG1nPXlnLnJhbmdlLHhnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7eGcuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9DdShmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgYmcsd2c9eGcucmFuZ2UsTWc9eyItIjoiIixfOiIgIiwwOiIwIn0sVGc9L15ccypcZCsvLE5nPS9eJS8sa2c9L1tcXF4kKis/fFtcXSgpLnt9XS9nO0hhKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIFNnPSIlWS0lbS0lZFQlSDolTTolUy4lTFoiLEVnPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OnQudXRjRm9ybWF0KFNnKSxBZz0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoU2cpLENnPTFlMyx6Zz02MCpDZyxQZz02MCp6ZyxSZz0yNCpQZyxMZz03KlJnLHFnPTMwKlJnLERnPTM2NSpSZyxVZz0kYSgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksT2c9JGEoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLEZnPSRhKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxJZz0kYSgiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IiksWWc9YWwoJHQoMzAwLC41LDApLCR0KC0yNDAsLjUsMSkpLEJnPWFsKCR0KC0xMDAsLjc1LC4zNSksJHQoODAsMS41LC44KSksSGc9YWwoJHQoMjYwLC43NSwuMzUpLCR0KDgwLDEuNSwuOCkpLGpnPSR0KCksWGc9V2EoJGEoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxWZz1XYSgkYSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLCRnPVdhKCRhKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksV2c9V2EoJGEoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKSxaZz1NYXRoLmFicyxHZz1NYXRoLmF0YW4yLFFnPU1hdGguY29zLEpnPU1hdGgubWF4LEtnPU1hdGgubWluLHRfPU1hdGguc2luLG5fPU1hdGguc3FydCxlXz0xZS0xMixyXz1NYXRoLlBJLGlfPXJfLzIsb189MipyXztpYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgdV89cGMob2MpO2hjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGFfPUFycmF5LnByb3RvdHlwZS5zbGljZSxjXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3JfKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsb18pfX0sc189e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sZl89TWF0aC5zcXJ0KDEvMyksbF89MipmXyxoXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL2xfKSxyPWUqZl87dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxwXz1NYXRoLnNpbihyXy8xMCkvTWF0aC5zaW4oNypyXy8xMCksZF89TWF0aC5zaW4ob18vMTApKnBfLHZfPS1NYXRoLmNvcyhvXy8xMCkqcF8sZ189e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqbikscj1kXyplLGk9dl8qZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciB1PW9fKm8vNSxhPU1hdGguY29zKHUpLGM9TWF0aC5zaW4odSk7dC5saW5lVG8oYyplLC1hKmUpLHQubGluZVRvKGEqci1jKmksYypyK2EqaSl9dC5jbG9zZVBhdGgoKX19LF9fPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSx5Xz1NYXRoLnNxcnQoMyksbV89e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqeV8pKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLXlfKmUsLWUpLHQubGluZVRvKHlfKmUsLWUpLHQuY2xvc2VQYXRoKCl9fSx4Xz1NYXRoLnNxcnQoMykvMixiXz0xL01hdGguc3FydCgxMiksd189MyooYl8vMisxKSxNXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3dfKSxyPWUvMixpPWUqYl8sbz1yLHU9ZSpiXytlLGE9LW8sYz11O3QubW92ZVRvKHIsaSksdC5saW5lVG8obyx1KSx0LmxpbmVUbyhhLGMpLHQubGluZVRvKC0uNSpyLXhfKmkseF8qcistLjUqaSksdC5saW5lVG8oLS41Km8teF8qdSx4XypvKy0uNSp1KSx0LmxpbmVUbygtLjUqYS14XypjLHhfKmErLS41KmMpLHQubGluZVRvKC0uNSpyK3hfKmksLS41KmkteF8qciksdC5saW5lVG8oLS41Km8reF8qdSwtLjUqdS14XypvKSx0LmxpbmVUbygtLjUqYSt4XypjLC0uNSpjLXhfKmEpLHQuY2xvc2VQYXRoKCl9fSxUXz1bY18sc18saF8sX18sZ18sbV8sTV9dO2tjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDM6TmModGhpcyx0aGlzLl94MSx0aGlzLl95MSk7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fY29udGV4dC5saW5lVG8oKDUqdGhpcy5feDArdGhpcy5feDEpLzYsKDUqdGhpcy5feTArdGhpcy5feTEpLzYpO2RlZmF1bHQ6TmModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LFNjLnByb3RvdHlwZT17YXJlYVN0YXJ0OlRjLGFyZWFFbmQ6VGMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gyKzIqdGhpcy5feDMpLzMsKHRoaXMuX3kyKzIqdGhpcy5feTMpLzMpLHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MysyKnRoaXMuX3gyKS8zLCh0aGlzLl95MysyKnRoaXMuX3kyKS8zKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDI9dCx0aGlzLl95Mj1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94ND10LHRoaXMuX3k0PW4sdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNiwodGhpcy5feTArNCp0aGlzLl95MStuKS82KTticmVhaztkZWZhdWx0Ok5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxFYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt2YXIgZT0odGhpcy5feDArNCp0aGlzLl94MSt0KS82LHI9KHRoaXMuX3kwKzQqdGhpcy5feTErbikvNjt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKGUscik6dGhpcy5fY29udGV4dC5tb3ZlVG8oZSxyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ok5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxBYy5wcm90b3R5cGU9e2xpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXSx0aGlzLl9iYXNpcy5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGgtMTtpZihlPjApZm9yKHZhciByLGk9dFswXSxvPW5bMF0sdT10W2VdLWksYT1uW2VdLW8sYz0tMTsrK2M8PWU7KXI9Yy9lLHRoaXMuX2Jhc2lzLnBvaW50KHRoaXMuX2JldGEqdFtjXSsoMS10aGlzLl9iZXRhKSooaStyKnUpLHRoaXMuX2JldGEqbltjXSsoMS10aGlzLl9iZXRhKSoobytyKmEpKTt0aGlzLl94PXRoaXMuX3k9bnVsbCx0aGlzLl9iYXNpcy5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIE5fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PW4/bmV3IGtjKHQpOm5ldyBBYyh0LG4pfXJldHVybiBlLmJldGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguODUpO3pjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpDYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6Q2ModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBrXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyB6Yyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtQYy5wcm90b3R5cGU9e2FyZWFTdGFydDpUYyxhcmVhRW5kOlRjLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6Q2ModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBTXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBQYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtSYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpDYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEVfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFJjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO3FjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6TGModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgQV89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBxYyh0LG4pOm5ldyB6Yyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO0RjLnByb3RvdHlwZT17YXJlYVN0YXJ0OlRjLGFyZWFFbmQ6VGMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6TGModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgQ189ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBEYyh0LG4pOm5ldyBQYyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO1VjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpMYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciB6Xz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IFVjKHQsbik6bmV3IFJjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7T2MucHJvdG90eXBlPXthcmVhU3RhcnQ6VGMsYXJlYUVuZDpUYyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxIYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6QmModGhpcyx0aGlzLl90MCxZYyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZih0PSt0LG49K24sdCE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsQmModGhpcyxZYyh0aGlzLGU9SWModGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OkJjKHRoaXMsdGhpcy5fdDAsZT1JYyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChqYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIYy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe0hjLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sWGMucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sVmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9JGModCksaT0kYyhuKSxvPTAsdT0xO3U8ZTsrK28sKyt1KXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbdV0sblt1XSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0sV2MucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0scnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpycyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PWFzKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYob3ModGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsdXModGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYodXModGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsb3ModGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCx1PXQuUjtpZihlPW8/dT9hcyh1KTpvOnUsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJnU/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PXU/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPXUsdS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsb3ModGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCx1cyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxvcyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsdXModGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxvcyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSx1cyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFBfLFJfLExfLHFfLERfLFVfPVtdLE9fPVtdLEZfPTFlLTYsSV89MWUtMTI7TnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpOcyxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZHMobix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyx1LGE9ZS5zaXRlLGM9LTEscz1uW2lbby0xXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0OysrYzxvOyl1PWYsZj0ocz1uW2lbY11dKS5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdCx1JiZmJiZyPHUuaW5kZXgmJnI8Zi5pbmRleCYmTXMoYSx1LGYpPDAmJnQucHVzaChbYS5kYXRhLHUuZGF0YSxmLmRhdGFdKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KX0sZmluZDpmdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz10aGlzLHU9by5fZm91bmR8fDAsYT1vLmNlbGxzLmxlbmd0aDshKGk9by5jZWxsc1t1XSk7KWlmKCsrdT49YSlyZXR1cm4gbnVsbDt2YXIgYz10LWkuc2l0ZVswXSxzPW4taS5zaXRlWzFdLGY9YypjK3Mqcztkb3tpPW8uY2VsbHNbcj11XSx1PW51bGwsaS5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj1vLmVkZ2VzW2VdLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgYz10LWFbMF0scz1uLWFbMV0sbD1jKmMrcypzO2w8ZiYmKGY9bCx1PWEuaW5kZXgpfX0pfXdoaWxlKG51bGwhPT11KTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1lfHxmPD1lKmU/aS5zaXRlOm51bGx9fSxTcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlNzLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyBTcyh0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10JjA9PT1uP3RoaXM6bmV3IFNzKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuaypuKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIFlfPW5ldyBTcygxLDAsMCk7RXMucHJvdG90eXBlPVNzLnByb3RvdHlwZSx0LnZlcnNpb249IjQuMTMuMCIsdC5iaXNlY3Q9T3MsdC5iaXNlY3RSaWdodD1Pcyx0LmJpc2VjdExlZnQ9RnMsdC5hc2NlbmRpbmc9bix0LmJpc2VjdG9yPWUsdC5jcm9zcz1mdW5jdGlvbih0LG4sZSl7dmFyIGksbyx1LGEsYz10Lmxlbmd0aCxzPW4ubGVuZ3RoLGY9bmV3IEFycmF5KGMqcyk7Zm9yKG51bGw9PWUmJihlPXIpLGk9dT0wO2k8YzsrK2kpZm9yKGE9dFtpXSxvPTA7bzxzOysrbywrK3UpZlt1XT1lKGEsbltvXSk7cmV0dXJuIGZ9LHQuZGVzY2VuZGluZz1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0sdC5kZXZpYXRpb249dSx0LmV4dGVudD1hLHQuaGlzdG9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxvLHU9dC5sZW5ndGgsYT1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWFbaV09bih0W2ldLGksdCk7dmFyIGM9ZShhKSxzPWNbMF0sbD1jWzFdLGg9cihhLHMsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9cChzLGwsaCksaD1mKE1hdGguY2VpbChzL2gpKmgsTWF0aC5mbG9vcihsL2gpKmgsaCkpO2Zvcih2YXIgZD1oLmxlbmd0aDtoWzBdPD1zOyloLnNoaWZ0KCksLS1kO2Zvcig7aFtkLTFdPmw7KWgucG9wKCksLS1kO3ZhciB2LGc9bmV3IEFycmF5KGQrMSk7Zm9yKGk9MDtpPD1kOysraSkodj1nW2ldPVtdKS54MD1pPjA/aFtpLTFdOnMsdi54MT1pPGQ/aFtpXTpsO2ZvcihpPTA7aTx1OysraSlzPD0obz1hW2ldKSYmbzw9bCYmZ1tPcyhoLG8sMCxkKV0ucHVzaCh0W2ldKTtyZXR1cm4gZ312YXIgbj1zLGU9YSxyPWQ7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpjKGUpLHQpOm59LHQuZG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246YyhbblswXSxuWzFdXSksdCk6ZX0sdC50aHJlc2hvbGRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QXJyYXkuaXNBcnJheShuKT9jKFlzLmNhbGwobikpOmMobiksdCk6cn0sdH0sdC50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD1Ccy5jYWxsKHQsaSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKHYodCwuNzUpLXYodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqdSh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9ZCx0Lm1heD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZlPnImJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmZT5yJiYocj1lKTtyZXR1cm4gcn0sdC5tZWFuPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10Lmxlbmd0aCxvPXIsdT0tMSxhPTA7aWYobnVsbD09bilmb3IoOysrdTxyOylpc05hTihlPWkodFt1XSkpPy0tbzphKz1lO2Vsc2UgZm9yKDsrK3U8cjspaXNOYU4oZT1pKG4odFt1XSx1LHQpKSk/LS1vOmErPWU7aWYobylyZXR1cm4gYS9vfSx0Lm1lZGlhbj1mdW5jdGlvbih0LGUpe3ZhciByLG89dC5sZW5ndGgsdT0tMSxhPVtdO2lmKG51bGw9PWUpZm9yKDsrK3U8bzspaXNOYU4ocj1pKHRbdV0pKXx8YS5wdXNoKHIpO2Vsc2UgZm9yKDsrK3U8bzspaXNOYU4ocj1pKGUodFt1XSx1LHQpKSl8fGEucHVzaChyKTtyZXR1cm4gdihhLnNvcnQobiksLjUpfSx0Lm1lcmdlPWcsdC5taW49Xyx0LnBhaXJzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49cik7Zm9yKHZhciBlPTAsaT10Lmxlbmd0aC0xLG89dFswXSx1PW5ldyBBcnJheShpPDA/MDppKTtlPGk7KXVbZV09bihvLG89dFsrK2VdKTtyZXR1cm4gdX0sdC5wZXJtdXRlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W25bZV1dO3JldHVybiByfSx0LnF1YW50aWxlPXYsdC5yYW5nZT1mLHQuc2Nhbj1mdW5jdGlvbih0LGUpe2lmKHI9dC5sZW5ndGgpe3ZhciByLGksbz0wLHU9MCxhPXRbdV07Zm9yKG51bGw9PWUmJihlPW4pOysrbzxyOykoZShpPXRbb10sYSk8MHx8MCE9PWUoYSxhKSkmJihhPWksdT1vKTtyZXR1cm4gMD09PWUoYSxhKT91OnZvaWQgMH19LHQuc2h1ZmZsZT1mdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz0obnVsbD09ZT90Lmxlbmd0aDplKS0obj1udWxsPT1uPzA6K24pO287KWk9TWF0aC5yYW5kb20oKSpvLS18MCxyPXRbbytuXSx0W28rbl09dFtpK25dLHRbaStuXT1yO3JldHVybiB0fSx0LnN1bT1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT0tMSxvPTA7aWYobnVsbD09bilmb3IoOysraTxyOykoZT0rdFtpXSkmJihvKz1lKTtlbHNlIGZvcig7KytpPHI7KShlPStuKHRbaV0saSx0KSkmJihvKz1lKTtyZXR1cm4gb30sdC50aWNrcz1sLHQudGlja0luY3JlbWVudD1oLHQudGlja1N0ZXA9cCx0LnRyYW5zcG9zZT15LHQudmFyaWFuY2U9byx0LnppcD1mdW5jdGlvbigpe3JldHVybiB5KGFyZ3VtZW50cyl9LHQuYXhpc1RvcD1mdW5jdGlvbih0KXtyZXR1cm4gVCgkcyx0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFQoV3MsdCl9LHQuYXhpc0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gVChacyx0KX0sdC5heGlzTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gVChHcyx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBLbihvaCl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIEtuKHJoKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gS24oaWgpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYSxjLHMsbCxoPXQubGVuZ3RoLHA9W10sZD1mKGgpLHY9W10sZz1bXSxfPWcuZ3JvdXBzPW5ldyBBcnJheShoKSx5PW5ldyBBcnJheShoKmgpO2ZvcihvPTAscz0tMTsrK3M8aDspe2Zvcih1PTAsbD0tMTsrK2w8aDspdSs9dFtzXVtsXTtwLnB1c2godSksdi5wdXNoKGYoaCkpLG8rPXV9Zm9yKGUmJmQuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKHBbdF0scFtuXSl9KSxyJiZ2LmZvckVhY2goZnVuY3Rpb24obixlKXtuLnNvcnQoZnVuY3Rpb24obixpKXtyZXR1cm4gcih0W2VdW25dLHRbZV1baV0pfSl9KSxjPShvPWdoKDAsdmgtbipoKS9vKT9uOnZoL2gsdT0wLHM9LTE7KytzPGg7KXtmb3IoYT11LGw9LTE7KytsPGg7KXt2YXIgbT1kW3NdLHg9dlttXVtsXSxiPXRbbV1beF0sdz11LE09dSs9YipvO3lbeCpoK21dPXtpbmRleDptLHN1YmluZGV4Ongsc3RhcnRBbmdsZTp3LGVuZEFuZ2xlOk0sdmFsdWU6Yn19X1ttXT17aW5kZXg6bSxzdGFydEFuZ2xlOmEsZW5kQW5nbGU6dSx2YWx1ZTpwW21dfSx1Kz1jfWZvcihzPS0xOysrczxoOylmb3IobD1zLTE7KytsPGg7KXt2YXIgVD15W2wqaCtzXSxOPXlbcypoK2xdOyhULnZhbHVlfHxOLnZhbHVlKSYmZy5wdXNoKFQudmFsdWU8Ti52YWx1ZT97c291cmNlOk4sdGFyZ2V0OlR9Ontzb3VyY2U6VCx0YXJnZXQ6Tn0pfXJldHVybiBpP2cuc29ydChpKTpnfXZhciBuPTAsZT1udWxsLHI9bnVsbCxpPW51bGw7cmV0dXJuIHQucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Z2goMCxlKSx0KTpufSx0LnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LnNvcnRDaG9yZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/aT1udWxsOihpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB0KG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX19KG4pKS5fPW4sdCk6aSYmaS5ffSx0fSx0LnJpYmJvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdCxhPV9oLmNhbGwoYXJndW1lbnRzKSxjPW4uYXBwbHkodGhpcyxhKSxzPWUuYXBwbHkodGhpcyxhKSxmPStyLmFwcGx5KHRoaXMsKGFbMF09YyxhKSksbD1pLmFwcGx5KHRoaXMsYSktZGgsaD1vLmFwcGx5KHRoaXMsYSktZGgscD1mKmxoKGwpLGQ9ZipoaChsKSx2PStyLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksZz1pLmFwcGx5KHRoaXMsYSktZGgsXz1vLmFwcGx5KHRoaXMsYSktZGg7aWYodXx8KHU9dD1lZSgpKSx1Lm1vdmVUbyhwLGQpLHUuYXJjKDAsMCxmLGwsaCksbD09PWcmJmg9PT1ffHwodS5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KmxoKGcpLHYqaGgoZykpLHUuYXJjKDAsMCx2LGcsXykpLHUucXVhZHJhdGljQ3VydmVUbygwLDAscCxkKSx1LmNsb3NlUGF0aCgpLHQpcmV0dXJuIHU9bnVsbCx0KyIifHxudWxsfXZhciBuPXJlLGU9aWUscj1vZSxpPXVlLG89YWUsdT1udWxsO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnRlKCtuKSx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0ZSgrbiksdCk6aX0sdC5lbmRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnRlKCtuKSx0KTpvfSx0LnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQudGFyZ2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PW4/bnVsbDpuLHQpOnV9LHR9LHQubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobixpLHUsYSl7aWYoaT49by5sZW5ndGgpcmV0dXJuIG51bGwhPWUmJm4uc29ydChlKSxudWxsIT1yP3Iobik6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPXNlKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsZmUsbGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLGhlLHBlKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxoZSxwZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sdC5zZXQ9dmUsdC5tYXA9c2UsdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaChlKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHRbZV0pO3JldHVybiBufSx0LmVudHJpZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHtrZXk6ZSx2YWx1ZTp0W2VdfSk7cmV0dXJuIG59LHQuY29sb3I9RXQsdC5yZ2I9UHQsdC5oc2w9cXQsdC5sYWI9RnQsdC5oY2w9WHQsdC5jdWJlaGVsaXg9JHQsdC5kaXNwYXRjaD1OLHQuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLmZpbHRlcihnKS5vbigidG91Y2hzdGFydC5kcmFnIixvKS5vbigidG91Y2htb3ZlLmRyYWciLHUpLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGEpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKCl7aWYoIWgmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj1jKCJtb3VzZSIsZC5hcHBseSh0aGlzLGFyZ3VtZW50cykscHQsdGhpcyxhcmd1bWVudHMpO24mJihjdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsciwhMCkub24oIm1vdXNldXAuZHJhZyIsaSwhMCksX3QodC5ldmVudC52aWV3KSx2dCgpLGw9ITEscz10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFksbigic3RhcnQiKSl9fWZ1bmN0aW9uIHIoKXtpZihndCgpLCFsKXt2YXIgbj10LmV2ZW50LmNsaWVudFgtcyxlPXQuZXZlbnQuY2xpZW50WS1mO2w9bipuK2UqZT54fV8ubW91c2UoImRyYWciKX1mdW5jdGlvbiBpKCl7Y3QodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSx5dCh0LmV2ZW50LnZpZXcsbCksZ3QoKSxfLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBvKCl7aWYocC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmxlbmd0aDtmb3Iobj0wO248bzsrK24pKGU9YyhyW25dLmlkZW50aWZpZXIsaSxkdCx0aGlzLGFyZ3VtZW50cykpJiYodnQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gdSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPV9bcltuXS5pZGVudGlmaWVyXSkmJihndCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKGgmJmNsZWFyVGltZW91dChoKSxoPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoPW51bGx9LDUwMCksbj0wO248aTsrK24pKGU9X1tyW25dLmlkZW50aWZpZXJdKSYmKHZ0KCksZSgiZW5kIikpfWZ1bmN0aW9uIGMoZSxyLGksbyx1KXt2YXIgYSxjLHMsZj1pKHIsZSksbD15LmNvcHkoKTtpZihpdChuZXcgeHQobiwiYmVmb3Jlc3RhcnQiLGEsZSxtLGZbMF0sZlsxXSwwLDAsbCksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXYuYXBwbHkobyx1KSkmJihjPWEueC1mWzBdfHwwLHM9YS55LWZbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQoaCl7dmFyIHAsZD1mO3N3aXRjaChoKXtjYXNlInN0YXJ0IjpfW2VdPXQscD1tKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBfW2VdLC0tbTtjYXNlImRyYWciOmY9aShyLGUpLHA9bX1pdChuZXcgeHQobixoLGEsZSxwLGZbMF0rYyxmWzFdK3MsZlswXS1kWzBdLGZbMV0tZFsxXSxsKSxsLmFwcGx5LGwsW2gsbyx1XSl9fXZhciBzLGYsbCxoLHA9YnQsZD13dCx2PU10LGc9VHQsXz17fSx5PU4oInN0YXJ0IiwiZHJhZyIsImVuZCIpLG09MCx4PTA7cmV0dXJuIG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXQoISF0KSxuKTpwfSxuLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om10KHQpLG4pOmR9LG4uc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om10KHQpLG4pOnZ9LG4udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXQoISF0KSxuKTpnfSxuLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9eS5vbi5hcHBseSh5LGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT15P246dH0sbi5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSh0PSt0KSp0LG4pOk1hdGguc3FydCh4KX0sbn0sdC5kcmFnRGlzYWJsZT1fdCx0LmRyYWdFbmFibGU9eXQsdC5kc3ZGb3JtYXQ9X2UsdC5jc3ZQYXJzZT1FaCx0LmNzdlBhcnNlUm93cz1BaCx0LmNzdkZvcm1hdD1DaCx0LmNzdkZvcm1hdFJvd3M9emgsdC50c3ZQYXJzZT1SaCx0LnRzdlBhcnNlUm93cz1MaCx0LnRzdkZvcm1hdD1xaCx0LnRzdkZvcm1hdFJvd3M9RGgsdC5lYXNlTGluZWFyPWZ1bmN0aW9uKHQpe3JldHVybit0fSx0LmVhc2VRdWFkPU9uLHQuZWFzZVF1YWRJbj1mdW5jdGlvbih0KXtyZXR1cm4gdCp0fSx0LmVhc2VRdWFkT3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSx0LmVhc2VRdWFkSW5PdXQ9T24sdC5lYXNlQ3ViaWM9Rm4sdC5lYXNlQ3ViaWNJbj1mdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LHQuZWFzZUN1YmljT3V0PWZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQrMX0sdC5lYXNlQ3ViaWNJbk91dD1Gbix0LmVhc2VQb2x5PXpsLHQuZWFzZVBvbHlJbj1BbCx0LmVhc2VQb2x5T3V0PUNsLHQuZWFzZVBvbHlJbk91dD16bCx0LmVhc2VTaW49SW4sdC5lYXNlU2luSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpSbCl9LHQuZWFzZVNpbk91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpSbCl9LHQuZWFzZVNpbkluT3V0PUluLHQuZWFzZUV4cD1Zbix0LmVhc2VFeHBJbj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3coMiwxMCp0LTEwKX0sdC5lYXNlRXhwT3V0PWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKnQpfSx0LmVhc2VFeHBJbk91dD1Zbix0LmVhc2VDaXJjbGU9Qm4sdC5lYXNlQ2lyY2xlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sdC5lYXNlQ2lyY2xlT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSx0LmVhc2VDaXJjbGVJbk91dD1Cbix0LmVhc2VCb3VuY2U9SG4sdC5lYXNlQm91bmNlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtSG4oMS10KX0sdC5lYXNlQm91bmNlT3V0PUhuLHQuZWFzZUJvdW5jZUluT3V0PWZ1bmN0aW9uKHQpe3JldHVybigodCo9Mik8PTE/MS1IbigxLXQpOkhuKHQtMSkrMSkvMn0sdC5lYXNlQmFjaz1WbCx0LmVhc2VCYWNrSW49amwsdC5lYXNlQmFja091dD1YbCx0LmVhc2VCYWNrSW5PdXQ9VmwsdC5lYXNlRWxhc3RpYz1abCx0LmVhc2VFbGFzdGljSW49V2wsdC5lYXNlRWxhc3RpY091dD1abCx0LmVhc2VFbGFzdGljSW5PdXQ9R2wsdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZSxpLG89ci5sZW5ndGgsdT0wLGE9MDtmb3IoZT0wO2U8bzsrK2UpdSs9KGk9cltlXSkueCxhKz1pLnk7Zm9yKHU9dS9vLXQsYT1hL28tbixlPTA7ZTxvOysrZSkoaT1yW2VdKS54LT11LGkueS09YX12YXIgcjtyZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dH0sZS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGUpOnR9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxlKTpufSxlfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7Zm9yKHZhciB0LG4scixjLHMsZixsLGg9aS5sZW5ndGgscD0wO3A8YTsrK3ApZm9yKG49VGUoaSxTZSxFZSkudmlzaXRBZnRlcihlKSx0PTA7dDxoOysrdClyPWlbdF0sZj1vW3IuaW5kZXhdLGw9ZipmLGM9ci54K3Iudngscz1yLnkrci52eSxuLnZpc2l0KGZ1bmN0aW9uKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLHA9ZitoO2lmKCFhKXJldHVybiBuPmMrcHx8aTxjLXB8fGU+cytwfHxvPHMtcDtpZihhLmluZGV4PnIuaW5kZXgpe3ZhciBkPWMtYS54LWEudngsdj1zLWEueS1hLnZ5LGc9ZCpkK3YqdjtnPHAqcCYmKDA9PT1kJiYoZD1tZSgpLGcrPWQqZCksMD09PXYmJih2PW1lKCksZys9dip2KSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqdSxyLnZ4Kz0oZCo9ZykqKHA9KGgqPWgpLyhsK2gpKSxyLnZ5Kz0odio9ZykqcCxhLnZ4LT1kKihwPTEtcCksYS52eS09dipwKX19KX1mdW5jdGlvbiBlKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPW9bdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gcigpe2lmKGkpe3ZhciBuLGUscj1pLmxlbmd0aDtmb3Iobz1uZXcgQXJyYXkociksbj0wO248cjsrK24pZT1pW25dLG9bZS5pbmRleF09K3QoZSxuLGkpfX12YXIgaSxvLHU9MSxhPTE7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKG51bGw9PXQ/MTordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQscigpfSxuLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3Qsbik6YX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnllKCtlKSxyKCksbik6dH0sbn0sdC5mb3JjZUxpbms9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuKXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cDsrK2UpZm9yKHZhciBpLGEsYyxmLGwsaCxkLHY9MDt2PHI7Kyt2KWE9KGk9dFt2XSkuc291cmNlLGY9KGM9aS50YXJnZXQpLngrYy52eC1hLngtYS52eHx8bWUoKSxsPWMueStjLnZ5LWEueS1hLnZ5fHxtZSgpLGYqPWg9KChoPU1hdGguc3FydChmKmYrbCpsKSktdVt2XSkvaCpuKm9bdl0sbCo9aCxjLnZ4LT1mKihkPXNbdl0pLGMudnktPWwqZCxhLnZ4Kz1mKihkPTEtZCksYS52eSs9bCpkfWZ1bmN0aW9uIGUoKXtpZihhKXt2YXIgbixlLGw9YS5sZW5ndGgsaD10Lmxlbmd0aCxwPXNlKGEsZik7Zm9yKG49MCxjPW5ldyBBcnJheShsKTtuPGg7KytuKShlPXRbbl0pLmluZGV4PW4sIm9iamVjdCIhPXR5cGVvZiBlLnNvdXJjZSYmKGUuc291cmNlPUNlKHAsZS5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGUudGFyZ2V0JiYoZS50YXJnZXQ9Q2UocCxlLnRhcmdldCkpLGNbZS5zb3VyY2UuaW5kZXhdPShjW2Uuc291cmNlLmluZGV4XXx8MCkrMSxjW2UudGFyZ2V0LmluZGV4XT0oY1tlLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKG49MCxzPW5ldyBBcnJheShoKTtuPGg7KytuKWU9dFtuXSxzW25dPWNbZS5zb3VyY2UuaW5kZXhdLyhjW2Uuc291cmNlLmluZGV4XStjW2UudGFyZ2V0LmluZGV4XSk7bz1uZXcgQXJyYXkoaCkscigpLHU9bmV3IEFycmF5KGgpLGkoKX19ZnVuY3Rpb24gcigpe2lmKGEpZm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKW9bbl09K2wodFtuXSxuLHQpfWZ1bmN0aW9uIGkoKXtpZihhKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX12YXIgbyx1LGEsYyxzLGY9QWUsbD1mdW5jdGlvbih0KXtyZXR1cm4gMS9NYXRoLm1pbihjW3Quc291cmNlLmluZGV4XSxjW3QudGFyZ2V0LmluZGV4XSl9LGg9eWUoMzApLHA9MTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXthPXQsZSgpfSxuLmxpbmtzPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXIsZSgpLG4pOnR9LG4uaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCxuKTpmfSxuLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3Qsbik6cH0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnllKCt0KSxyKCksbik6bH0sbi5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnllKCt0KSxpKCksbik6aH0sbn0sdC5mb3JjZU1hbnlCb2R5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixhPWkubGVuZ3RoLGM9VGUoaSx6ZSxQZSkudmlzaXRBZnRlcihlKTtmb3IodT10LG49MDtuPGE7KytuKW89aVtuXSxjLnZpc2l0KHIpfWZ1bmN0aW9uIG4oKXtpZihpKXt2YXIgdCxuLGU9aS5sZW5ndGg7Zm9yKGE9bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW49aVt0XSxhW24uaW5kZXhdPStjKG4sdCxpKX19ZnVuY3Rpb24gZSh0KXt2YXIgbixlLHIsaSxvLHU9MCxjPTA7aWYodC5sZW5ndGgpe2ZvcihyPWk9bz0wO288NDsrK28pKG49dFtvXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsYys9ZSxyKz1lKm4ueCxpKz1lKm4ueSk7dC54PXIvYyx0Lnk9aS9jfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9YVtuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gcih0LG4sZSxyKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgaT10Lngtby54LGM9dC55LW8ueSxoPXItbixwPWkqaStjKmM7aWYoaCpoL2w8cClyZXR1cm4gcDxmJiYoMD09PWkmJihpPW1lKCkscCs9aSppKSwwPT09YyYmKGM9bWUoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpLG8udngrPWkqdC52YWx1ZSp1L3Asby52eSs9Yyp0LnZhbHVlKnUvcCksITA7aWYoISh0Lmxlbmd0aHx8cD49Zikpeyh0LmRhdGEhPT1vfHx0Lm5leHQpJiYoMD09PWkmJihpPW1lKCkscCs9aSppKSwwPT09YyYmKGM9bWUoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpKTtkb3t0LmRhdGEhPT1vJiYoaD1hW3QuZGF0YS5pbmRleF0qdS9wLG8udngrPWkqaCxvLnZ5Kz1jKmgpfXdoaWxlKHQ9dC5uZXh0KX19dmFyIGksbyx1LGEsYz15ZSgtMzApLHM9MSxmPTEvMCxsPS44MTtyZXR1cm4gdC5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxuKCl9LHQuc3RyZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5ZSgrZSksbigpLHQpOmN9LHQuZGlzdGFuY2VNaW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bipuLHQpOk1hdGguc3FydChzKX0sdC5kaXN0YW5jZU1heD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1uKm4sdCk6TWF0aC5zcXJ0KGYpfSx0LnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4qbix0KTpNYXRoLnNxcnQobCl9LHR9LHQuZm9yY2VSYWRpYWw9ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIodCl7Zm9yKHZhciByPTAsaT1vLmxlbmd0aDtyPGk7KytyKXt2YXIgYz1vW3JdLHM9Yy54LW58fDFlLTYsZj1jLnktZXx8MWUtNixsPU1hdGguc3FydChzKnMrZipmKSxoPShhW3JdLWwpKnVbcl0qdC9sO2MudngrPXMqaCxjLnZ5Kz1mKmh9fWZ1bmN0aW9uIGkoKXtpZihvKXt2YXIgbixlPW8ubGVuZ3RoO2Zvcih1PW5ldyBBcnJheShlKSxhPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilhW25dPSt0KG9bbl0sbixvKSx1W25dPWlzTmFOKGFbbl0pPzA6K2Mob1tuXSxuLG8pfX12YXIgbyx1LGEsYz15ZSguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKCt0KSksbnVsbD09biYmKG49MCksbnVsbD09ZSYmKGU9MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe289dCxpKCl9LHIuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5ZSgrdCksaSgpLHIpOmN9LHIucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246eWUoK24pLGkoKSxyKTp0fSxyLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0sci55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LHIpOmV9LHJ9LHQuZm9yY2VTaW11bGF0aW9uPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtlKCkscC5jYWxsKCJ0aWNrIixvKSx1PGEmJihoLnN0b3AoKSxwLmNhbGwoImVuZCIsbykpfWZ1bmN0aW9uIGUoKXt2YXIgbixlLHI9dC5sZW5ndGg7Zm9yKHUrPShzLXUpKmMsbC5lYWNoKGZ1bmN0aW9uKHQpe3QodSl9KSxuPTA7bjxyOysrbiludWxsPT0oZT10W25dKS5meD9lLngrPWUudngqPWY6KGUueD1lLmZ4LGUudng9MCksbnVsbD09ZS5meT9lLnkrPWUudnkqPWY6KGUueT1lLmZ5LGUudnk9MCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtpZihuPXRbZV0sbi5pbmRleD1lLGlzTmFOKG4ueCl8fGlzTmFOKG4ueSkpe3ZhciBpPUZoKk1hdGguc3FydChlKSxvPWUqSWg7bi54PWkqTWF0aC5jb3Mobyksbi55PWkqTWF0aC5zaW4obyl9KGlzTmFOKG4udngpfHxpc05hTihuLnZ5KSkmJihuLnZ4PW4udnk9MCl9fWZ1bmN0aW9uIGkobil7cmV0dXJuIG4uaW5pdGlhbGl6ZSYmbi5pbml0aWFsaXplKHQpLG59dmFyIG8sdT0xLGE9LjAwMSxjPTEtTWF0aC5wb3coYSwxLzMwMCkscz0wLGY9LjYsbD1zZSgpLGg9d24obikscD1OKCJ0aWNrIiwiZW5kIik7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxyKCksbz17dGljazplLHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5yZXN0YXJ0KG4pLG99LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gaC5zdG9wKCksb30sbm9kZXM6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixyKCksbC5lYWNoKGkpLG8pOnR9LGFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG8pOnV9LGFscGhhTWluOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LG8pOmF9LGFscGhhRGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3Qsbyk6K2N9LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LG8pOnN9LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9MS10LG8pOjEtZn0sZm9yY2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhudWxsPT1uP2wucmVtb3ZlKHQpOmwuc2V0KHQsaShuKSksbyk6bC5nZXQodCl9LGZpbmQ6ZnVuY3Rpb24obixlLHIpe3ZhciBpLG8sdSxhLGMscz0wLGY9dC5sZW5ndGg7Zm9yKG51bGw9PXI/cj0xLzA6cio9cixzPTA7czxmOysrcykodT0oaT1uLShhPXRbc10pLngpKmkrKG89ZS1hLnkpKm8pPHImJihjPWEscj11KTtyZXR1cm4gY30sb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhwLm9uKHQsbiksbyk6cC5vbih0KX19fSx0LmZvcmNlWD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbixlPTAsdT1yLmxlbmd0aDtlPHU7KytlKShuPXJbZV0pLnZ4Kz0ob1tlXS1uLngpKmlbZV0qdH1mdW5jdGlvbiBlKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24paVtuXT1pc05hTihvW25dPSt0KHJbbl0sbixyKSk/MDordShyW25dLG4scil9fXZhciByLGksbyx1PXllKC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eWUobnVsbD09dD8wOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxlKCl9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5ZSgrdCksZSgpLG4pOnV9LG4ueD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOnllKCtyKSxlKCksbik6dH0sbn0sdC5mb3JjZVk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSkobj1yW2VdKS52eSs9KG9bZV0tbi55KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT15ZSguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWUoK3QpLGUoKSxuKTp1fSxuLnk9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjp5ZSgrciksZSgpLG4pOnR9LG59LHQuZm9ybWF0RGVmYXVsdExvY2FsZT1JZSx0LmZvcm1hdExvY2FsZT1GZSx0LmZvcm1hdFNwZWNpZmllcj1EZSx0LnByZWNpc2lvbkZpeGVkPVllLHQucHJlY2lzaW9uUHJlZml4PUJlLHQucHJlY2lzaW9uUm91bmQ9SGUsdC5nZW9BcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBWcC5yZXNldCgpLHRyKHQsJHApLDIqVnB9LHQuZ2VvQm91bmRzPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhO2lmKEtoPUpoPS0oR2g9UWg9MS8wKSxpcD1bXSx0cih0LFpwKSxlPWlwLmxlbmd0aCl7Zm9yKGlwLnNvcnQoeHIpLG49MSxvPVtyPWlwWzBdXTtuPGU7KytuKWJyKHIsKGk9aXBbbl0pWzBdKXx8YnIocixpWzFdKT8obXIoclswXSxpWzFdKT5tcihyWzBdLHJbMV0pJiYoclsxXT1pWzFdKSxtcihpWzBdLHJbMV0pPm1yKHJbMF0sclsxXSkmJihyWzBdPWlbMF0pKTpvLnB1c2gocj1pKTtmb3IodT0tMS8wLG49MCxyPW9bZT1vLmxlbmd0aC0xXTtuPD1lO3I9aSwrK24paT1vW25dLChhPW1yKHJbMV0saVswXSkpPnUmJih1PWEsR2g9aVswXSxKaD1yWzFdKX1yZXR1cm4gaXA9b3A9bnVsbCxHaD09PTEvMHx8UWg9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbR2gsUWhdLFtKaCxLaF1dfSx0Lmdlb0NlbnRyb2lkPWZ1bmN0aW9uKHQpe3VwPWFwPWNwPXNwPWZwPWxwPWhwPXBwPWRwPXZwPWdwPTAsdHIodCxHcCk7dmFyIG49ZHAsZT12cCxyPWdwLGk9bipuK2UqZStyKnI7cmV0dXJuIGk8VHAmJihuPWxwLGU9aHAscj1wcCxhcDxNcCYmKG49Y3AsZT1zcCxyPWZwKSwoaT1uKm4rZSplK3Iqcik8VHApP1tOYU4sTmFOXTpbUnAoZSxuKSpBcCxXZShyL1lwKGkpKSpBcF19LHQuZ2VvQ2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykqQ3AsYz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpDcDtyZXR1cm4gbj1bXSxlPXFyKC10WzBdKkNwLC10WzFdKkNwLDApLmludmVydCxJcih1LGEsYywxKSx0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbbl19LG49ZT1udWxsLHR9dmFyIG4sZSxyPVByKFswLDBdKSxpPVByKDkwKSxvPVByKDYpLHU9e3BvaW50OmZ1bmN0aW9uKHQscil7bi5wdXNoKHQ9ZSh0LHIpKSx0WzBdKj1BcCx0WzFdKj1BcH19O3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlByKFsrblswXSwrblsxXV0pLHQpOnJ9LHQucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UHIoK24pLHQpOml9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UHIoK24pLHQpOm99LHR9LHQuZ2VvQ2xpcEFudGltZXJpZGlhbj1zZCx0Lmdlb0NsaXBDaXJjbGU9UXIsdC5nZW9DbGlwRXh0ZW50PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9MCxpPTAsbz05NjAsdT01MDA7cmV0dXJuIGU9e3N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDp0PUpyKHIsaSxvLHUpKG49ZSl9LGV4dGVudDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rYVswXVswXSxpPSthWzBdWzFdLG89K2FbMV1bMF0sdT0rYVsxXVsxXSx0PW49bnVsbCxlKTpbW3IsaV0sW28sdV1dfX19LHQuZ2VvQ2xpcFJlY3RhbmdsZT1Kcix0Lmdlb0NvbnRhaW5zPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHQmJmdkLmhhc093blByb3BlcnR5KHQudHlwZSk/Z2RbdC50eXBlXTppaSkodCxuKX0sdC5nZW9EaXN0YW5jZT1yaSx0Lmdlb0dyYXRpY3VsZT1oaSx0Lmdlb0dyYXRpY3VsZTEwPWZ1bmN0aW9uKCl7cmV0dXJuIGhpKCkoKX0sdC5nZW9JbnRlcnBvbGF0ZT1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qQ3Ascj10WzFdKkNwLGk9blswXSpDcCxvPW5bMV0qQ3AsdT1McChyKSxhPUZwKHIpLGM9THAobykscz1GcChvKSxmPXUqTHAoZSksbD11KkZwKGUpLGg9YypMcChpKSxwPWMqRnAoaSksZD0yKldlKFlwKFplKG8tcikrdSpjKlplKGktZSkpKSx2PUZwKGQpLGc9ZD9mdW5jdGlvbih0KXt2YXIgbj1GcCh0Kj1kKS92LGU9RnAoZC10KS92LHI9ZSpmK24qaCxpPWUqbCtuKnAsbz1lKmErbipzO3JldHVybltScChpLHIpKkFwLFJwKG8sWXAocipyK2kqaSkpKkFwXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpBcCxyKkFwXX07cmV0dXJuIGcuZGlzdGFuY2U9ZCxnfSx0Lmdlb0xlbmd0aD1laSx0Lmdlb1BhdGg9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0cih0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKHhkKSkseGQucmVzdWx0KCl9LGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKEJkKSksQmQucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0cih0LHIoTmQpKSxOZC5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKHFkKSkscWQucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwscGkpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBDaSk6bmV3IFNpKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LHQuZ2VvQWxiZXJzPVhpLHQuZ2VvQWxiZXJzVXNhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbj10WzBdLGU9dFsxXTtyZXR1cm4gYT1udWxsLGkucG9pbnQobixlKSxhfHwoby5wb2ludChuLGUpLGEpfHwodS5wb2ludChuLGUpLGEpfWZ1bmN0aW9uIG4oKXtyZXR1cm4gZT1yPW51bGwsdH12YXIgZSxyLGksbyx1LGEsYz1YaSgpLHM9amkoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9amkoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksbD17cG9pbnQ6ZnVuY3Rpb24odCxuKXthPVt0LG5dfX07cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBuPWMuc2NhbGUoKSxlPWMudHJhbnNsYXRlKCkscj0odFswXS1lWzBdKS9uLGk9KHRbMV0tZVsxXSkvbjtyZXR1cm4oaT49LjEyJiZpPC4yMzQmJnI+PS0uNDI1JiZyPC0uMjE0P3M6aT49LjE2NiYmaTwuMjM0JiZyPj0tLjIxNCYmcjwtLjExNT9mOmMpLmludmVydCh0KX0sdC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGUmJnI9PT10P2U6ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9LTE7KytpPG47KXRbaV0ucG9pbnQoZSxyKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvbkVuZCgpfX19KFtjLnN0cmVhbShyPXQpLHMuc3RyZWFtKHQpLGYuc3RyZWFtKHQpXSl9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjLnByZWNpc2lvbih0KSxzLnByZWNpc2lvbih0KSxmLnByZWNpc2lvbih0KSxuKCkpOmMucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMuc2NhbGUobikscy5zY2FsZSguMzUqbiksZi5zY2FsZShuKSx0LnRyYW5zbGF0ZShjLnRyYW5zbGF0ZSgpKSk6Yy5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYy50cmFuc2xhdGUoKTt2YXIgZT1jLnNjYWxlKCkscj0rdFswXSxhPSt0WzFdO3JldHVybiBpPWMudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tyLS40NTUqZSxhLS4yMzgqZV0sW3IrLjQ1NSplLGErLjIzOCplXV0pLnN0cmVhbShsKSxvPXMudHJhbnNsYXRlKFtyLS4zMDcqZSxhKy4yMDEqZV0pLmNsaXBFeHRlbnQoW1tyLS40MjUqZStNcCxhKy4xMiplK01wXSxbci0uMjE0KmUtTXAsYSsuMjM0KmUtTXBdXSkuc3RyZWFtKGwpLHU9Zi50cmFuc2xhdGUoW3ItLjIwNSplLGErLjIxMiplXSkuY2xpcEV4dGVudChbW3ItLjIxNCplK01wLGErLjE2NiplK01wXSxbci0uMTE1KmUtTXAsYSsuMjM0KmUtTXBdXSkuc3RyZWFtKGwpLG4oKX0sdC5maXRFeHRlbnQ9ZnVuY3Rpb24obixlKXtyZXR1cm4gcWkodCxuLGUpfSx0LmZpdFNpemU9ZnVuY3Rpb24obixlKXtyZXR1cm4gRGkodCxuLGUpfSx0LmZpdFdpZHRoPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIFVpKHQsbixlKX0sdC5maXRIZWlnaHQ9ZnVuY3Rpb24obixlKXtyZXR1cm4gT2kodCxuLGUpfSx0LnNjYWxlKDEwNzApfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBJaShWZCkuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PVZkLHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWkoJGQpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz0kZCx0Lmdlb0NvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIEJpKFFpKS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfSx0Lmdlb0NvbmljQ29uZm9ybWFsUmF3PVFpLHQuZ2VvQ29uaWNFcXVhbEFyZWE9amksdC5nZW9Db25pY0VxdWFsQXJlYVJhdz1IaSx0Lmdlb0NvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gQmkoS2kpLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9LHQuZ2VvQ29uaWNFcXVpZGlzdGFudFJhdz1LaSx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBJaShKaSkuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9SmksdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBJaSh0bykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz10byx0Lmdlb0lkZW50aXR5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybiBpPW89bnVsbCx1fXZhciBuLGUscixpLG8sdSxhPTEsYz0wLHM9MCxmPTEsbD0xLGg9cGkscD1udWxsLGQ9cGk7cmV0dXJuIHU9e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gaSYmbz09PXQ/aTppPWgoZChvPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9aSxwPW49ZT1yPW51bGwsdCgpKTpkfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PWk/KHA9bj1lPXI9bnVsbCxwaSk6SnIocD0raVswXVswXSxuPStpWzBdWzFdLGU9K2lbMV1bMF0scj0raVsxXVsxXSksdCgpKTpudWxsPT1wP251bGw6W1twLG5dLFtlLHJdXX0sc2NhbGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oKGE9K24pKmYsYSpsLGMscyksdCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oYSpmLGEqbCxjPStuWzBdLHM9K25bMV0pLHQoKSk6W2Msc119LHJlZmxlY3RYOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW5vKGEqKGY9bj8tMToxKSxhKmwsYyxzKSx0KCkpOmY8MH0scmVmbGVjdFk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oYSpmLGEqKGw9bj8tMToxKSxjLHMpLHQoKSk6bDwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gcWkodSx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIERpKHUsdCxuKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gVWkodSx0LG4pfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gT2kodSx0LG4pfX19LHQuZ2VvUHJvamVjdGlvbj1JaSx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVlpLHQuZ2VvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gWmkoV2kpLnNjYWxlKDk2MS9FcCl9LHQuZ2VvTWVyY2F0b3JSYXc9V2ksdC5nZW9OYXR1cmFsRWFydGgxPWZ1bmN0aW9uKCl7cmV0dXJuIElpKGVvKS5zY2FsZSgxNzUuMjk1KX0sdC5nZW9OYXR1cmFsRWFydGgxUmF3PWVvLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIElpKHJvKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK01wKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9cm8sdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIElpKGlvKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9aW8sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1aaShvbyksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdz1vbyx0Lmdlb1JvdGF0aW9uPUZyLHQuZ2VvU3RyZWFtPXRyLHQuZ2VvVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06UGkodCl9fSx0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHU9MDt0LmVhY2hBZnRlcihmdW5jdGlvbih0KXt2YXIgZT10LmNoaWxkcmVuO2U/KHQueD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZWR1Y2UoYW8sMCkvdC5sZW5ndGh9KGUpLHQueT1mdW5jdGlvbih0KXtyZXR1cm4gMSt0LnJlZHVjZShjbywwKX0oZSkpOih0Lng9bz91Kz1uKHQsbyk6MCx0Lnk9MCxvPXQpfSk7dmFyIGE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uWzBdO3JldHVybiB0fSh0KSxjPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9bltuLmxlbmd0aC0xXTtyZXR1cm4gdH0odCkscz1hLngtbihhLGMpLzIsZj1jLngrbihjLGEpLzI7cmV0dXJuIHQuZWFjaEFmdGVyKGk/ZnVuY3Rpb24obil7bi54PShuLngtdC54KSplLG4ueT0odC55LW4ueSkqcn06ZnVuY3Rpb24obil7bi54PShuLngtcykvKGYtcykqZSxuLnk9KDEtKHQueT9uLnkvdC55OjEpKSpyfSl9dmFyIG49dW8sZT0xLHI9MSxpPSExO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rblswXSxyPStuWzFdLHQpOmk/bnVsbDpbZSxyXX0sdC5ub2RlU2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPStuWzBdLHI9K25bMV0sdCk6aT9bZSxyXTpudWxsfSx0fSx0LmhpZXJhcmNoeT1mbyx0LnBhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0Lng9ZS8yLHQueT1yLzIsbj90LmVhY2hCZWZvcmUoem8obikpLmVhY2hBZnRlcihQbyhpLC41KSkuZWFjaEJlZm9yZShSbygxKSk6dC5lYWNoQmVmb3JlKHpvKENvKSkuZWFjaEFmdGVyKFBvKEVvLDEpKS5lYWNoQWZ0ZXIoUG8oaSx0LnIvTWF0aC5taW4oZSxyKSkpLmVhY2hCZWZvcmUoUm8oTWF0aC5taW4oZSxyKS8oMip0LnIpKSksdH12YXIgbj1udWxsLGU9MSxyPTEsaT1FbztyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpTbyh0KX0oZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFvKCtuKSx0KTppfSx0fSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4ga28odCksdH0sdC5wYWNrRW5jbG9zZT1nbyx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG89dC5oZWlnaHQrMTtyZXR1cm4gdC54MD10LnkwPXIsdC54MT1uLHQueTE9ZS9vLHQuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVuJiZxbyhlLGUueDAsdCooZS5kZXB0aCsxKS9uLGUueDEsdCooZS5kZXB0aCsyKS9uKTt2YXIgaT1lLngwLG89ZS55MCx1PWUueDEtcixhPWUueTEtcjt1PGkmJihpPXU9KGkrdSkvMiksYTxvJiYobz1hPShvK2EpLzIpLGUueDA9aSxlLnkwPW8sZS54MT11LGUueTE9YX19KGUsbykpLGkmJnQuZWFjaEJlZm9yZShMbyksdH12YXIgbj0xLGU9MSxyPTAsaT0hMTtyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIW4sdCk6aX0sdC5zaXplPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStyWzBdLGU9K3JbMV0sdCk6W24sZV19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rbix0KTpyfSx0fSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcixpLG8sdSxhLGMscyxmPXQubGVuZ3RoLGw9bmV3IEFycmF5KGYpLGg9e307Zm9yKGk9MDtpPGY7KytpKXI9dFtpXSxhPWxbaV09bmV3IHZvKHIpLG51bGwhPShjPW4ocixpLHQpKSYmKGMrPSIiKSYmKGhbcz1aZCsoYS5pZD1jKV09cyBpbiBoP1FkOmEpO2ZvcihpPTA7aTxmOysraSlpZihhPWxbaV0sbnVsbCE9KGM9ZSh0W2ldLGksdCkpJiYoYys9IiIpKXtpZighKHU9aFtaZCtjXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2MpO2lmKHU9PT1RZCl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitjKTt1LmNoaWxkcmVuP3UuY2hpbGRyZW4ucHVzaChhKTp1LmNoaWxkcmVuPVthXSxhLnBhcmVudD11fWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1hfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PUdkLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1mfSkuZWFjaEJlZm9yZShwbyksby5wYXJlbnQ9bnVsbCxmPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXZhciBuPURvLGU9VW87cmV0dXJuIHQuaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U28oZSksdCk6bn0sdC5wYXJlbnRJZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TbyhuKSx0KTplfSx0fSx0LnRyZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBjPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLHU9bmV3IEhvKHQsMCksYT1bdV07bj1hLnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpYS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgSG8ocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4odS5wYXJlbnQ9bmV3IEhvKG51bGwsMCkpLmNoaWxkcmVuPVt1XSx1fSh0KTtpZihjLmVhY2hBZnRlcihuKSxjLnBhcmVudC5tPS1jLnosYy5lYWNoQmVmb3JlKGUpLGEpdC5lYWNoQmVmb3JlKHIpO2Vsc2V7dmFyIHM9dCxmPXQsbD10O3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8cy54JiYocz10KSx0Lng+Zi54JiYoZj10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9cz09PWY/MTppKHMsZikvMixwPWgtcy54LGQ9by8oZi54K2grcCksdj11LyhsLmRlcHRofHwxKTt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrcCkqZCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIHR9ZnVuY3Rpb24gbih0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5wYXJlbnQuY2hpbGRyZW4scj10Lmk/ZVt0LmktMV06bnVsbDtpZihuKXsoZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KSh0KTt2YXIgbz0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtyPyh0Lno9ci56K2kodC5fLHIuXyksdC5tPXQuei1vKTp0Lno9b31lbHNlIHImJih0Lno9ci56K2kodC5fLHIuXykpO3QucGFyZW50LkE9ZnVuY3Rpb24odCxuLGUpe2lmKG4pe2Zvcih2YXIgcixvPXQsdT10LGE9bixjPW8ucGFyZW50LmNoaWxkcmVuWzBdLHM9by5tLGY9dS5tLGw9YS5tLGg9Yy5tO2E9SW8oYSksbz1GbyhvKSxhJiZvOyljPUZvKGMpLCh1PUlvKHUpKS5hPXQsKHI9YS56K2wtby56LXMraShhLl8sby5fKSk+MCYmKFlvKEJvKGEsdCxlKSx0LHIpLHMrPXIsZis9ciksbCs9YS5tLHMrPW8ubSxoKz1jLm0sZis9dS5tO2EmJiFJbyh1KSYmKHUudD1hLHUubSs9bC1mKSxvJiYhRm8oYykmJihjLnQ9byxjLm0rPXMtaCxlPXQpfXJldHVybiBlfSh0LHIsdC5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gZSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcih0KXt0LngqPW8sdC55PXQuZGVwdGgqdX12YXIgaT1PbyxvPTEsdT0xLGE9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSExLG89K25bMF0sdT0rblsxXSx0KTphP251bGw6W28sdV19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ITAsbz0rblswXSx1PStuWzFdLHQpOmE/W28sdV06bnVsbH0sdH0sdC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1pLHQueTE9byx0LmVhY2hCZWZvcmUobiksdT1bMF0sciYmdC5lYWNoQmVmb3JlKExvKSx0fWZ1bmN0aW9uIG4odCl7dmFyIG49dVt0LmRlcHRoXSxyPXQueDArbixpPXQueTArbixvPXQueDEtbixoPXQueTEtbjtvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLHQueDA9cix0LnkwPWksdC54MT1vLHQueTE9aCx0LmNoaWxkcmVuJiYobj11W3QuZGVwdGgrMV09YSh0KS8yLHIrPWwodCktbixpKz1jKHQpLW4sby09cyh0KS1uLGgtPWYodCktbixvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLGUodCxyLGksbyxoKSl9dmFyIGU9S2Qscj0hMSxpPTEsbz0xLHU9WzBdLGE9RW8sYz1FbyxzPUVvLGY9RW8sbD1FbztyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIW4sdCk6cn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuWzBdLG89K25bMV0sdCk6W2ksb119LHQudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TbyhuKSx0KTplfSx0LnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nSW5uZXIobikucGFkZGluZ091dGVyKG4pOnQucGFkZGluZ0lubmVyKCl9LHQucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmF9LHQucGFkZGluZ091dGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QucGFkZGluZ1RvcChuKS5wYWRkaW5nUmlnaHQobikucGFkZGluZ0JvdHRvbShuKS5wYWRkaW5nTGVmdChuKTp0LnBhZGRpbmdUb3AoKX0sdC5wYWRkaW5nVG9wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmN9LHQucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOnN9LHQucGFkZGluZ0JvdHRvbT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFvKCtuKSx0KTpmfSx0LnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmx9LHR9LHQudHJlZW1hcEJpbmFyeT1mdW5jdGlvbih0LG4sZSxyLGkpe2Z1bmN0aW9uIG8odCxuLGUscixpLHUsYSl7aWYodD49bi0xKXt2YXIgcz1jW3RdO3JldHVybiBzLngwPXIscy55MD1pLHMueDE9dSx2b2lkKHMueTE9YSl9Zm9yKHZhciBsPWZbdF0saD1lLzIrbCxwPXQrMSxkPW4tMTtwPGQ7KXt2YXIgdj1wK2Q+Pj4xO2Zbdl08aD9wPXYrMTpkPXZ9aC1mW3AtMV08ZltwXS1oJiZ0KzE8cCYmLS1wO3ZhciBnPWZbcF0tbCxfPWUtZztpZih1LXI+YS1pKXt2YXIgeT0ocipfK3UqZykvZTtvKHQscCxnLHIsaSx5LGEpLG8ocCxuLF8seSxpLHUsYSl9ZWxzZXt2YXIgbT0oaSpfK2EqZykvZTtvKHQscCxnLHIsaSx1LG0pLG8ocCxuLF8scixtLHUsYSl9fXZhciB1LGEsYz10LmNoaWxkcmVuLHM9Yy5sZW5ndGgsZj1uZXcgQXJyYXkocysxKTtmb3IoZlswXT1hPXU9MDt1PHM7Kyt1KWZbdSsxXT1hKz1jW3VdLnZhbHVlO28oMCxzLHQudmFsdWUsbixlLHIsaSl9LHQudHJlZW1hcERpY2U9cW8sdC50cmVlbWFwU2xpY2U9am8sdC50cmVlbWFwU2xpY2VEaWNlPWZ1bmN0aW9uKHQsbixlLHIsaSl7KDEmdC5kZXB0aD9qbzpxbykodCxuLGUscixpKX0sdC50cmVlbWFwU3F1YXJpZnk9S2QsdC50cmVlbWFwUmVzcXVhcmlmeT10dix0LmludGVycG9sYXRlPWZuLHQuaW50ZXJwb2xhdGVBcnJheT1vbix0LmludGVycG9sYXRlQmFzaXM9R3QsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPVF0LHQuaW50ZXJwb2xhdGVEYXRlPXVuLHQuaW50ZXJwb2xhdGVOdW1iZXI9YW4sdC5pbnRlcnBvbGF0ZU9iamVjdD1jbix0LmludGVycG9sYXRlUm91bmQ9bG4sdC5pbnRlcnBvbGF0ZVN0cmluZz1zbix0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUdmLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UWYsdC5pbnRlcnBvbGF0ZVpvb209dm4sdC5pbnRlcnBvbGF0ZVJnYj1IZix0LmludGVycG9sYXRlUmdiQmFzaXM9amYsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPVhmLHQuaW50ZXJwb2xhdGVIc2w9ZWwsdC5pbnRlcnBvbGF0ZUhzbExvbmc9cmwsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWVuKCh0PUZ0KHQpKS5sLChuPUZ0KG4pKS5sKSxyPWVuKHQuYSxuLmEpLGk9ZW4odC5iLG4uYiksbz1lbih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPWlsLHQuaW50ZXJwb2xhdGVIY2xMb25nPW9sLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9dWwsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9YWwsdC5xdWFudGl6ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZVtyXT10KHIvKG4tMSkpO3JldHVybiBlfSx0LnBhdGg9ZWUsdC5wb2x5Z29uQXJlYT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLG89MDsrK2U8cjspbj1pLGk9dFtlXSxvKz1uWzFdKmlbMF0tblswXSppWzFdO3JldHVybiBvLzJ9LHQucG9seWdvbkNlbnRyb2lkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KCRvKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1XbyhyKSx1PVdvKGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1vWzBdLGE9b1sxXSxjPTA7KytyPGk7KW49dSxlPWEsbi09dT0obz10W3JdKVswXSxlLT1hPW9bMV0sYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSx0LnF1YWR0cmVlPVRlLHQucXVldWU9S28sdC5yYW5kb21Vbmlmb3JtPXJ2LHQucmFuZG9tTm9ybWFsPWl2LHQucmFuZG9tTG9nTm9ybWFsPW92LHQucmFuZG9tQmF0ZXM9YXYsdC5yYW5kb21JcndpbkhhbGw9dXYsdC5yYW5kb21FeHBvbmVudGlhbD1jdix0LnJlcXVlc3Q9bnUsdC5odG1sPXN2LHQuanNvbj1mdix0LnRleHQ9bHYsdC54bWw9aHYsdC5jc3Y9cHYsdC50c3Y9ZHYsdC5zY2FsZUJhbmQ9b3UsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KG91KCkucGFkZGluZ0lubmVyKDEpKX0sdC5zY2FsZUlkZW50aXR5PWd1LHQuc2NhbGVMaW5lYXI9dnUsdC5zY2FsZUxvZz1UdSx0LnNjYWxlT3JkaW5hbD1pdSx0LnNjYWxlSW1wbGljaXQ9eXYsdC5zY2FsZVBvdz1rdSx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBrdSgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPVN1LHQuc2NhbGVRdWFudGl6ZT1FdSx0LnNjYWxlVGhyZXNob2xkPUF1LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKEd2LFd2LEx2LFB2LEN2LEV2LGt2LHd2LHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSx0LnNjYWxlVXRjPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKHhnLHlnLGlnLGVnLHRnLEp2LGt2LHd2LHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHQuc2NoZW1lQ2F0ZWdvcnkxMD1VZyx0LnNjaGVtZUNhdGVnb3J5MjBiPU9nLHQuc2NoZW1lQ2F0ZWdvcnkyMGM9RmcsdC5zY2hlbWVDYXRlZ29yeTIwPUlnLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PVlnLHQuaW50ZXJwb2xhdGVSYWluYm93PWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gamcuaD0zNjAqdC0xMDAsamcucz0xLjUtMS41Km4samcubD0uOC0uOSpuLGpnKyIifSx0LmludGVycG9sYXRlV2FybT1CZyx0LmludGVycG9sYXRlQ29vbD1IZyx0LmludGVycG9sYXRlVmlyaWRpcz1YZyx0LmludGVycG9sYXRlTWFnbWE9VmcsdC5pbnRlcnBvbGF0ZUluZmVybm89JGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT1XZyx0LnNjYWxlU2VxdWVudGlhbD1aYSx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY3QoQSh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9QSx0LmxvY2FsPXN0LHQubWF0Y2hlcj1vZix0Lm1vdXNlPXB0LHQubmFtZXNwYWNlPUUsdC5uYW1lc3BhY2VzPXRmLHQuY2xpZW50UG9pbnQ9aHQsdC5zZWxlY3Q9Y3QsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyB1dChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB1dChbbnVsbD09dD9bXTp0XSxjZil9LHQuc2VsZWN0aW9uPWF0LHQuc2VsZWN0b3I9eix0LnNlbGVjdG9yQWxsPVIsdC5zdHlsZT1JLHQudG91Y2g9ZHQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49bHQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09aHQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9Rix0LmN1c3RvbUV2ZW50PWl0LHQuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHMsZj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1pXyxwPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWlfLGQ9WmcocC1oKSx2PXA+aDtpZihjfHwoYz10PWVlKCkpLGw8ZiYmKHM9bCxsPWYsZj1zKSxsPmVfKWlmKGQ+b18tZV8pYy5tb3ZlVG8obCpRZyhoKSxsKnRfKGgpKSxjLmFyYygwLDAsbCxoLHAsIXYpLGY+ZV8mJihjLm1vdmVUbyhmKlFnKHApLGYqdF8ocCkpLGMuYXJjKDAsMCxmLHAsaCx2KSk7ZWxzZXt2YXIgZyxfLHk9aCxtPXAseD1oLGI9cCx3PWQsTT1kLFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+ZV8mJihpPytpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuXyhmKmYrbCpsKSksaz1LZyhaZyhsLWYpLzIsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxTPWssRT1rO2lmKE4+ZV8pe3ZhciBBPVFhKE4vZip0XyhUKSksQz1RYShOL2wqdF8oVCkpOyh3LT0yKkEpPmVfPyhBKj12PzE6LTEseCs9QSxiLT1BKToodz0wLHg9Yj0oaCtwKS8yKSwoTS09MipDKT5lXz8oQyo9dj8xOi0xLHkrPUMsbS09Qyk6KE09MCx5PW09KGgrcCkvMil9dmFyIHo9bCpRZyh5KSxQPWwqdF8oeSksUj1mKlFnKGIpLEw9Zip0XyhiKTtpZihrPmVfKXt2YXIgcT1sKlFnKG0pLEQ9bCp0XyhtKSxVPWYqUWcoeCksTz1mKnRfKHgpO2lmKGQ8cl8pe3ZhciBGPXc+ZV8/ZnVuY3Rpb24odCxuLGUscixpLG8sdSxhKXt2YXIgYz1lLXQscz1yLW4sZj11LWksbD1hLW8saD0oZioobi1vKS1sKih0LWkpKS8obCpjLWYqcyk7cmV0dXJuW3QraCpjLG4raCpzXX0oeixQLFUsTyxxLEQsUixMKTpbUixMXSxJPXotRlswXSxZPVAtRlsxXSxCPXEtRlswXSxIPUQtRlsxXSxqPTEvdF8oZnVuY3Rpb24odCl7cmV0dXJuIHQ+MT8wOnQ8LTE/cl86TWF0aC5hY29zKHQpfSgoSSpCK1kqSCkvKG5fKEkqSStZKlkpKm5fKEIqQitIKkgpKSkvMiksWD1uXyhGWzBdKkZbMF0rRlsxXSpGWzFdKTtTPUtnKGssKGYtWCkvKGotMSkpLEU9S2coaywobC1YKS8oaisxKSl9fU0+ZV8/RT5lXz8oZz1yYyhVLE8seixQLGwsRSx2KSxfPXJjKHEsRCxSLEwsbCxFLHYpLGMubW92ZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksRTxrP2MuYXJjKGcuY3gsZy5jeSxFLEdnKGcueTAxLGcueDAxKSxHZyhfLnkwMSxfLngwMSksIXYpOihjLmFyYyhnLmN4LGcuY3ksRSxHZyhnLnkwMSxnLngwMSksR2coZy55MTEsZy54MTEpLCF2KSxjLmFyYygwLDAsbCxHZyhnLmN5K2cueTExLGcuY3grZy54MTEpLEdnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIXYpLGMuYXJjKF8uY3gsXy5jeSxFLEdnKF8ueTExLF8ueDExKSxHZyhfLnkwMSxfLngwMSksIXYpKSk6KGMubW92ZVRvKHosUCksYy5hcmMoMCwwLGwseSxtLCF2KSk6Yy5tb3ZlVG8oeixQKSxmPmVfJiZ3PmVfP1M+ZV8/KGc9cmMoUixMLHEsRCxmLC1TLHYpLF89cmMoeixQLFUsTyxmLC1TLHYpLGMubGluZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksUzxrP2MuYXJjKGcuY3gsZy5jeSxTLEdnKGcueTAxLGcueDAxKSxHZyhfLnkwMSxfLngwMSksIXYpOihjLmFyYyhnLmN4LGcuY3ksUyxHZyhnLnkwMSxnLngwMSksR2coZy55MTEsZy54MTEpLCF2KSxjLmFyYygwLDAsZixHZyhnLmN5K2cueTExLGcuY3grZy54MTEpLEdnKF8uY3krXy55MTEsXy5jeCtfLngxMSksdiksYy5hcmMoXy5jeCxfLmN5LFMsR2coXy55MTEsXy54MTEpLEdnKF8ueTAxLF8ueDAxKSwhdikpKTpjLmFyYygwLDAsZixiLHgsdik6Yy5saW5lVG8oUixMKX1lbHNlIGMubW92ZVRvKDAsMCk7aWYoYy5jbG9zZVBhdGgoKSx0KXJldHVybiBjPW51bGwsdCsiInx8bnVsbH12YXIgbj1KYSxlPUthLHI9R2EoMCksaT1udWxsLG89dGMsdT1uYyxhPWVjLGM9bnVsbDtyZXR1cm4gdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1yXy8yO3JldHVybltRZyhyKSp0LHRfKHIpKnRdfSx0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6R2EoK2UpLHQpOm59LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6ZX0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6cn0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOml9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOnV9LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6YX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PW4/bnVsbDpuLHQpOmN9LHR9LHQuYXJlYT1zYyx0LmxpbmU9Y2MsdC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksZz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cyksXz1NYXRoLm1pbihvXyxNYXRoLm1heCgtb18sby5hcHBseSh0aGlzLGFyZ3VtZW50cyktZykpLHk9TWF0aC5taW4oTWF0aC5hYnMoXykvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT15KihfPDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KF8taCptKS9wOjA7YTxoOysrYSxnPWYpYz1kW2FdLGY9ZysoKGw9dltjXSk+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6ZyxlbmRBbmdsZTpmLHBhZEFuZ2xlOnl9O3JldHVybiB2fXZhciBuPWxjLGU9ZmMscj1udWxsLGk9R2EoMCksbz1HYShvXyksdT1HYSgwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkdhKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6dX0sdH0sdC5hcmVhUmFkaWFsPWdjLHQucmFkaWFsQXJlYT1nYyx0LmxpbmVSYWRpYWw9dmMsdC5yYWRpYWxMaW5lPXZjLHQucG9pbnRSYWRpYWw9X2MsdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiB4YyhiYyl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHhjKHdjKX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9eGMoTWMpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0O2lmKHJ8fChyPXQ9ZWUoKSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhyLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdClyZXR1cm4gcj1udWxsLHQrIiJ8fG51bGx9dmFyIG49R2EoY18pLGU9R2EoNjQpLHI9bnVsbDtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6R2EoZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6bix0KTpyfSx0fSx0LnN5bWJvbHM9VF8sdC5zeW1ib2xDaXJjbGU9Y18sdC5zeW1ib2xDcm9zcz1zXyx0LnN5bWJvbERpYW1vbmQ9aF8sdC5zeW1ib2xTcXVhcmU9X18sdC5zeW1ib2xTdGFyPWdfLHQuc3ltYm9sVHJpYW5nbGU9bV8sdC5zeW1ib2xXeWU9TV8sdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgU2ModCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBFYyh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga2ModCl9LHQuY3VydmVCdW5kbGU9Tl8sdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPVNfLHQuY3VydmVDYXJkaW5hbE9wZW49RV8sdC5jdXJ2ZUNhcmRpbmFsPWtfLHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPUNfLHQuY3VydmVDYXRtdWxsUm9tT3Blbj16Xyx0LmN1cnZlQ2F0bXVsbFJvbT1BXyx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgT2ModCl9LHQuY3VydmVMaW5lYXI9b2MsdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEhjKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgamModCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVmModCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgV2ModCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBXYyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFdjKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjPXQubGVuZ3RoLHM9YS5sZW5ndGgsZj1uZXcgQXJyYXkocyk7Zm9yKG89MDtvPHM7KytvKXtmb3IodmFyIGwsaD1hW29dLHA9ZltvXT1uZXcgQXJyYXkoYyksZD0wO2Q8YzsrK2QpcFtkXT1sPVswLCtpKHRbZF0saCxkLHQpXSxsLmRhdGE9dFtkXTtwLmtleT1ofWZvcihvPTAsdT1lKGYpO288czsrK28pZlt1W29dXS5pbmRleD1vO3JldHVybiByKGYsdSksZn12YXIgbj1HYShbXSksZT1HYyxyPVpjLGk9UWM7cmV0dXJuIHQua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkdhKGFfLmNhbGwoZSkpLHQpOm59LHQudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6aX0sdC5vcmRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uP0djOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoYV8uY2FsbChuKSksdCk6ZX0sdC5vZmZzZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9aYzpuLHQpOnJ9LHR9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsdT10WzBdLmxlbmd0aDtvPHU7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9WmModCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigoYT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sdSxhLGM9MCxzPXRbblswXV0ubGVuZ3RoO2M8czsrK2MpZm9yKG89dT0wLGU9MDtlPGE7KytlKShpPShyPXRbbltlXV1bY10pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09dSxyWzBdPXUrPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9WmMsdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1aYyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLHU9MTt1PHI7Kyt1KXtmb3IodmFyIGE9MCxjPTAscz0wO2E8aTsrK2Epe2Zvcih2YXIgZj10W25bYV1dLGw9Zlt1XVsxXXx8MCxoPShsLShmW3UtMV1bMV18fDApKS8yLHA9MDtwPGE7KytwKXt2YXIgZD10W25bcF1dO2grPShkW3VdWzFdfHwwKS0oZFt1LTFdWzFdfHwwKX1jKz1sLHMrPWgqbH1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGMmJihvLT1zL2MpfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sWmModCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1KYyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBKYyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChLYyksbz1HYyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLHU9MCxhPTAsYz1bXSxzPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sdTxhPyh1Kz1pW2VdLGMucHVzaChlKSk6KGErPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSx0LnN0YWNrT3JkZXJOb25lPUdjLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIEdjKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9Q3UsdC50aW1lTWlsbGlzZWNvbmQ9d3YsdC50aW1lTWlsbGlzZWNvbmRzPU12LHQudXRjTWlsbGlzZWNvbmQ9d3YsdC51dGNNaWxsaXNlY29uZHM9TXYsdC50aW1lU2Vjb25kPWt2LHQudGltZVNlY29uZHM9U3YsdC51dGNTZWNvbmQ9a3YsdC51dGNTZWNvbmRzPVN2LHQudGltZU1pbnV0ZT1Fdix0LnRpbWVNaW51dGVzPUF2LHQudGltZUhvdXI9Q3YsdC50aW1lSG91cnM9enYsdC50aW1lRGF5PVB2LHQudGltZURheXM9UnYsdC50aW1lV2Vlaz1Mdix0LnRpbWVXZWVrcz1Zdix0LnRpbWVTdW5kYXk9THYsdC50aW1lU3VuZGF5cz1Zdix0LnRpbWVNb25kYXk9cXYsdC50aW1lTW9uZGF5cz1Cdix0LnRpbWVUdWVzZGF5PUR2LHQudGltZVR1ZXNkYXlzPUh2LHQudGltZVdlZG5lc2RheT1Vdix0LnRpbWVXZWRuZXNkYXlzPWp2LHQudGltZVRodXJzZGF5PU92LHQudGltZVRodXJzZGF5cz1Ydix0LnRpbWVGcmlkYXk9RnYsdC50aW1lRnJpZGF5cz1Wdix0LnRpbWVTYXR1cmRheT1Jdix0LnRpbWVTYXR1cmRheXM9JHYsdC50aW1lTW9udGg9V3YsdC50aW1lTW9udGhzPVp2LHQudGltZVllYXI9R3YsdC50aW1lWWVhcnM9UXYsdC51dGNNaW51dGU9SnYsdC51dGNNaW51dGVzPUt2LHQudXRjSG91cj10Zyx0LnV0Y0hvdXJzPW5nLHQudXRjRGF5PWVnLHQudXRjRGF5cz1yZyx0LnV0Y1dlZWs9aWcsdC51dGNXZWVrcz1sZyx0LnV0Y1N1bmRheT1pZyx0LnV0Y1N1bmRheXM9bGcsdC51dGNNb25kYXk9b2csdC51dGNNb25kYXlzPWhnLHQudXRjVHVlc2RheT11Zyx0LnV0Y1R1ZXNkYXlzPXBnLHQudXRjV2VkbmVzZGF5PWFnLHQudXRjV2VkbmVzZGF5cz1kZyx0LnV0Y1RodXJzZGF5PWNnLHQudXRjVGh1cnNkYXlzPXZnLHQudXRjRnJpZGF5PXNnLHQudXRjRnJpZGF5cz1nZyx0LnV0Y1NhdHVyZGF5PWZnLHQudXRjU2F0dXJkYXlzPV9nLHQudXRjTW9udGg9eWcsdC51dGNNb250aHM9bWcsdC51dGNZZWFyPXhnLHQudXRjWWVhcnM9d2csdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1IYSx0LnRpbWVGb3JtYXRMb2NhbGU9RHUsdC5pc29Gb3JtYXQ9RWcsdC5pc29QYXJzZT1BZyx0Lm5vdz1tbix0LnRpbWVyPXduLHQudGltZXJGbHVzaD1Nbix0LnRpbWVvdXQ9U24sdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGJuLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/bW4oKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyh1KXt1Kz1pLHIucmVzdGFydChvLGkrPW4sZSksdCh1KX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPURuLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKHIgaW4gaSlpZigoZT1pW3JdKS5zdGF0ZT54bCYmZS5uYW1lPT09bilyZXR1cm4gbmV3IHFuKFtbdF1dLEpsLG4sK3IpfXJldHVybiBudWxsfSx0LmludGVycnVwdD1Qbix0LnZvcm9ub2k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBuZXcgTnModC5tYXAoZnVuY3Rpb24ocixpKXt2YXIgbz1bTWF0aC5yb3VuZChuKHIsaSx0KS9GXykqRl8sTWF0aC5yb3VuZChlKHIsaSx0KS9GXykqRl9dO3JldHVybiBvLmluZGV4PWksby5kYXRhPXIsb30pLHIpfXZhciBuPW5zLGU9ZXMscj1udWxsO3JldHVybiB0LnBvbHlnb25zPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnBvbHlnb25zKCl9LHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIHQobikubGlua3MoKX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikudHJpYW5nbGVzKCl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnRzKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0cygrbiksdCk6ZX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbK25bMF1bMF0sK25bMF1bMV1dLFsrblsxXVswXSwrblsxXVsxXV1dLHQpOnImJltbclswXVswXSxyWzBdWzFdXSxbclsxXVswXSxyWzFdWzFdXV19LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1swLDBdLFsrblswXSwrblsxXV1dLHQpOnImJltyWzFdWzBdLXJbMF1bMF0sclsxXVsxXS1yWzBdWzFdXX0sdH0sdC56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LnByb3BlcnR5KCJfX3pvb20iLFJzKS5vbigid2hlZWwuem9vbSIsYykub24oIm1vdXNlZG93bi56b29tIixzKS5vbigiZGJsY2xpY2suem9vbSIsZikuZmlsdGVyKHgpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLGwpLm9uKCJ0b3VjaG1vdmUuem9vbSIsaCkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIscCkuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIGUodCxuKXtyZXR1cm4obj1NYXRoLm1heChiWzBdLE1hdGgubWluKGJbMV0sbikpKT09PXQuaz90Om5ldyBTcyhuLHQueCx0LnkpfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IFNzKHQuayxyLGkpfWZ1bmN0aW9uIGkodCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24gbyh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt1KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3UodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dSh0aGlzLHQpLG89Xy5hcHBseSh0aGlzLHQpLGE9ZXx8aShvKSxjPU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLHM9dGhpcy5fX3pvb20sZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixsPVQocy5pbnZlcnQoYSkuY29uY2F0KGMvcy5rKSxmLmludmVydChhKS5jb25jYXQoYy9mLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1mO2Vsc2V7dmFyIG49bCh0KSxlPWMvblsyXTt0PW5ldyBTcyhlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB1KHQsbil7Zm9yKHZhciBlLHI9MCxpPWsubGVuZ3RoO3I8aTsrK3IpaWYoKGU9a1tyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBhKHQsbil9ZnVuY3Rpb24gYSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1fLmFwcGx5KHQsbil9ZnVuY3Rpb24gYygpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD11KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGk9TWF0aC5tYXgoYlswXSxNYXRoLm1pbihiWzFdLG4uaypNYXRoLnBvdygyLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLG89cHQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09b1swXSYmdC5tb3VzZVswXVsxXT09PW9bMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09bykpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWkpcmV0dXJuO3QubW91c2U9W28sbi5pbnZlcnQobyldLFBuKHRoaXMpLHQuc3RhcnQoKX1DcygpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSxBKSx0Lnpvb20oIm1vdXNlIix5KHIoZShuLGkpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsdykpfX1mdW5jdGlvbiBzKCl7aWYoIXYmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj11KHRoaXMsYXJndW1lbnRzKSxlPWN0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKENzKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC1vLGk9dC5ldmVudC5jbGllbnRZLWE7bi5tb3ZlZD1lKmUraSppPkN9bi56b29tKCJtb3VzZSIseShyKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1wdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LHcpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7ZS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSx5dCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksQ3MoKSxuLmVuZCgpfSwhMCksaT1wdCh0aGlzKSxvPXQuZXZlbnQuY2xpZW50WCxhPXQuZXZlbnQuY2xpZW50WTtfdCh0LmV2ZW50LnZpZXcpLEFzKCksbi5tb3VzZT1baSx0aGlzLl9fem9vbS5pbnZlcnQoaSldLFBuKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gZigpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgaT10aGlzLl9fem9vbSx1PXB0KHRoaXMpLGE9aS5pbnZlcnQodSksYz1pLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6Mikscz15KHIoZShpLGMpLHUsYSksXy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdyk7Q3MoKSxNPjA/Y3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKE0pLmNhbGwobyxzLHUpOmN0KHRoaXMpLmNhbGwobi50cmFuc2Zvcm0scyl9fWZ1bmN0aW9uIGwoKXtpZihnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4sZSxyLGksbz11KHRoaXMsYXJndW1lbnRzKSxhPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1hLmxlbmd0aDtmb3IoQXMoKSxlPTA7ZTxjOysrZSlpPVtpPWR0KHRoaXMsYSwocj1hW2VdKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoaSksci5pZGVudGlmaWVyXSxvLnRvdWNoMD9vLnRvdWNoMXx8KG8udG91Y2gxPWkpOihvLnRvdWNoMD1pLG49ITApO2lmKGQmJihkPWNsZWFyVGltZW91dChkKSwhby50b3VjaDEpKXJldHVybiBvLmVuZCgpLHZvaWQoKGk9Y3QodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtuJiYoZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZD1udWxsfSxFKSxQbih0aGlzKSxvLnN0YXJ0KCkpfX1mdW5jdGlvbiBoKCl7dmFyIG4saSxvLGEsYz11KHRoaXMsYXJndW1lbnRzKSxzPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZj1zLmxlbmd0aDtmb3IoQ3MoKSxkJiYoZD1jbGVhclRpbWVvdXQoZCkpLG49MDtuPGY7KytuKW89ZHQodGhpcyxzLChpPXNbbl0pLmlkZW50aWZpZXIpLGMudG91Y2gwJiZjLnRvdWNoMFsyXT09PWkuaWRlbnRpZmllcj9jLnRvdWNoMFswXT1vOmMudG91Y2gxJiZjLnRvdWNoMVsyXT09PWkuaWRlbnRpZmllciYmKGMudG91Y2gxWzBdPW8pO2lmKGk9Yy50aGF0Ll9fem9vbSxjLnRvdWNoMSl7dmFyIGw9Yy50b3VjaDBbMF0saD1jLnRvdWNoMFsxXSxwPWMudG91Y2gxWzBdLHY9Yy50b3VjaDFbMV0sZz0oZz1wWzBdLWxbMF0pKmcrKGc9cFsxXS1sWzFdKSpnLF89KF89dlswXS1oWzBdKSpfKyhfPXZbMV0taFsxXSkqXztpPWUoaSxNYXRoLnNxcnQoZy9fKSksbz1bKGxbMF0rcFswXSkvMiwobFsxXStwWzFdKS8yXSxhPVsoaFswXSt2WzBdKS8yLChoWzFdK3ZbMV0pLzJdfWVsc2V7aWYoIWMudG91Y2gwKXJldHVybjtvPWMudG91Y2gwWzBdLGE9Yy50b3VjaDBbMV19Yy56b29tKCJ0b3VjaCIseShyKGksbyxhKSxjLmV4dGVudCx3KSl9ZnVuY3Rpb24gcCgpe3ZhciBuLGUscj11KHRoaXMsYXJndW1lbnRzKSxpPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsbz1pLmxlbmd0aDtmb3IoQXMoKSx2JiZjbGVhclRpbWVvdXQodiksdj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dj1udWxsfSxFKSxuPTA7bjxvOysrbillPWlbbl0sci50b3VjaDAmJnIudG91Y2gwWzJdPT09ZS5pZGVudGlmaWVyP2RlbGV0ZSByLnRvdWNoMDpyLnRvdWNoMSYmci50b3VjaDFbMl09PT1lLmlkZW50aWZpZXImJmRlbGV0ZSByLnRvdWNoMTtyLnRvdWNoMSYmIXIudG91Y2gwJiYoci50b3VjaDA9ci50b3VjaDEsZGVsZXRlIHIudG91Y2gxKSxyLnRvdWNoMD9yLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoci50b3VjaDBbMF0pOnIuZW5kKCl9dmFyIGQsdixnPXpzLF89UHMseT1EcyxtPUxzLHg9cXMsYj1bMCwxLzBdLHc9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0sTT0yNTAsVD12bixrPVtdLFM9Tigic3RhcnQiLCJ6b29tIiwiZW5kIiksRT01MDAsQT0xNTAsQz0wO3JldHVybiBuLnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLFJzKSx0IT09ZT9vKHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7dSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0sbi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bi5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSl9KX0sbi5zY2FsZVRvPWZ1bmN0aW9uKHQsbyl7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PV8uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sdT1pKHQpLGE9bi5pbnZlcnQodSksYz0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpvO3JldHVybiB5KHIoZShuLGMpLHUsYSksdCx3KX0pfSxuLnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIHkodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksXy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdyl9KX0sbi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUscil7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PV8uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sbz1pKHQpO3JldHVybiB5KFlfLnRyYW5zbGF0ZShvWzBdLG9bMV0pLnNjYWxlKG4uaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj8tci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LXIpLHQsdyl9KX0sYS5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWsucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihrLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtpdChuZXcgZnVuY3Rpb24odCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX0obix0LHRoaXMudGhhdC5fX3pvb20pLFMuYXBwbHksUyxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxuLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprcygrdCksbik6bX0sbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprcyghIXQpLG4pOmd9LG4udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a3MoISF0KSxuKTp4fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtzKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTpffSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiWzBdPSt0WzBdLGJbMV09K3RbMV0sbik6W2JbMF0sYlsxXV19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3WzBdWzBdPSt0WzBdWzBdLHdbMV1bMF09K3RbMV1bMF0sd1swXVsxXT0rdFswXVsxXSx3WzFdWzFdPSt0WzFdWzFdLG4pOltbd1swXVswXSx3WzBdWzFdXSxbd1sxXVswXSx3WzFdWzFdXV19LG4uY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PXQsbik6eX0sbi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT0rdCxuKTpNfSxuLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhUPXQsbik6VH0sbi5vbj1mdW5jdGlvbigpe3ZhciB0PVMub24uYXBwbHkoUyxhcmd1bWVudHMpO3JldHVybiB0PT09Uz9uOnR9LG4uY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz0odD0rdCkqdCxuKTpNYXRoLnNxcnQoQyl9LG59LHQuem9vbVRyYW5zZm9ybT1Fcyx0Lnpvb21JZGVudGl0eT1ZXyxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs="></script><br />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIChleHBvcnRzLGQzLGQzU3ZnQW5ub3RhdGlvbixkM0ludGVycG9sYXRlUGF0aCxkM1NhbmtleSkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX18kc3R5bGVJbmplY3QoY3NzLCByZXR1cm5WYWx1ZSkgewogICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgfQogICAgY3NzID0gY3NzIHx8ICcnOwogICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CiAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgIAogICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpewogICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7CiAgICB9IGVsc2UgewogICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTsKICAgIH0KICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICB9CiAgX18kc3R5bGVJbmplY3QoIi5kMmItZHJhZ2dhYmxle2N1cnNvcjptb3ZlfS5kMmItdnVlLWNvbnRhaW5lcnt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5kMmItcGllLWNoYXJ0IC5kMmItcGllLWFyYyBwYXRoe3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlOiNmZmZ9LmQyYi1waWUtY2hhcnQgLmQyYi1waWUtYXJjIHRleHR7ZmlsbDojZmZmO2ZvbnQtd2VpZ2h0OjcwMDtwb2ludGVyLWV2ZW50czpub25lO3RleHQtYW5jaG9yOm1pZGRsZX0uZDJiLWF4aXMtd3JhcHBlciAuZDJiLWF4aXMtYmFja2dyb3VuZHtvcGFjaXR5OjB9LmQyYi1jaGFydC1icmVhZGNydW1ic3t3aWR0aDoyMDBweDtwYWRkaW5nLWxlZnQ6MTBweH0uZDJiLXN1bmJ1cnN0LWJyZWFkY3J1bWIgLmQyYi1zdW5idXJzdC1sYWJlbCwuZDJiLXN1bmJ1cnN0LXRvb2x0aXAgLmQyYi1zdW5idXJzdC1sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcn0uZDJiLXN1bmJ1cnN0LWJyZWFkY3J1bWIgLmQyYi1zdW5idXJzdC12YWx1ZSwuZDJiLXN1bmJ1cnN0LXRvb2x0aXAgLmQyYi1zdW5idXJzdC12YWx1ZXtmb250LXNpemU6MTRwdDttYXJnaW4tdG9wOjVweH0uZDJiLXN1bmJ1cnN0LWJyZWFkY3J1bWIgLmQyYi1zdW5idXJzdC1wZXJjZW50e2Zsb2F0OnJpZ2h0fS5kMmItYnJlYWRjcnVtYnM6bm90KC5kMmItdmVydGljYWwpIC5kMmItc3VuYnVyc3QtcGVyY2VudHttYXJnaW4tbGVmdDozMHB4fS5kMmItc3VuYnVyc3QtdG9vbHRpcHt0ZXh0LWFsaWduOmNlbnRlcn0uZDJiLXN1bmJ1cnN0LXRvb2x0aXAgLmQyYi1zdW5idXJzdC1wZXJjZW50e2Rpc3BsYXk6aW5saW5lfS5kMmItc3VuYnVyc3QtdG9vbHRpcCAuZDJiLXN1bmJ1cnN0LXBlcmNlbnQ6YmVmb3Jle2NvbnRlbnQ6XCIoXCJ9LmQyYi1zdW5idXJzdC10b29sdGlwIC5kMmItc3VuYnVyc3QtcGVyY2VudDphZnRlcntjb250ZW50OlwiKVwifS5kMmItc2Fua2V5LWxpbmstYXJyb3d7Zm9udC1zaXplOjEwcHg7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0ycHh9LmQyYi1saW5lLWdyYXBoIC5kMmItbGluZXtzdHJva2Utd2lkdGg6MS41cHg7ZmlsbDpub25lfS5kMmItYXJlYS1ncmFwaCAuZDJiLWFyZWF7c3Ryb2tlOm5vbmU7ZmlsbC1vcGFjaXR5OjAuM30uZDJiLWJveCAuZDJiLWJveC1jZW50ZXIsLmQyYi1ib3ggLmQyYi1ib3gtZGFzaCwuZDJiLWJveCAuZDJiLWJveC1vdXRsaWVyLC5kMmItYm94IC5kMmItYm94LXJlY3R7c3Ryb2tlLXdpZHRoOjEuNXB4fS5kMmItYm94IC5kMmItYm94LXJlY3R7ZmlsbDojZmZmfS5kMmItYm94IC5kMmItYm94LWNlbnRlcntzdHJva2UtZGFzaGFycmF5OjMgM30uZDJiLWJveCAuZDJiLWJveC1sYWJlbHtmaWxsOiM1NTU7Zm9udC1zaXplOjEwcHR9LmQyYi1ib3ggLmQyYi1ib3gtb3V0bGllcntmaWxsOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MC40fVxuLyouZDJiLWJveC1ncmFwaCB7XG4gIC5kMmItYm94LWRhc2gsXG4gIC5kMmItYm94LWNlbnRlcixcbiAgLmQyYi1ib3gtcmVjdCxcbiAgLmQyYi1ib3gtb3V0bGllciB7XG4gICAgc3Ryb2tlLXdpZHRoOiAxLjVweDtcbiAgfVxuXG4gIC5kMmItYm94LXJlY3Qge1xuICAgIGZpbGw6ICNmZmY7XG4gIH1cblxuICAuZDJiLWJveC1jZW50ZXIge1xuICAgIHN0cm9rZS1kYXNoYXJyYXk6IDMgMztcbiAgfVxuXG4gIC5kMmItYm94LWxhYmVsIHtcbiAgICBmaWxsOiAjNTU1O1xuICAgIGZvbnQtc2l6ZTogMTBwdDtcbiAgICBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlO1xuICB9XG5cbiAgLmQyYi1ib3gtb3V0bGllciB7XG4gICAgZmlsbDogbm9uZTtcbiAgICBzdHJva2U6ICM4ODg7XG4gICAgb3BhY2l0eTogMC40O1xuICB9XG59Ki8uZDJiLWJhci1ncmFwaCAuZDJiLWJhci1ncm91cCByZWN0e29wYWNpdHk6MC44fS5kMmItYnViYmxlLXBhY2stZ3JhcGggLmQyYi1idWJibGUtcG9pbnR7b3BhY2l0eTowLjc1fS5kMmItYnViYmxlLXBhY2stZ3JhcGggLmQyYi1idWJibGUtaW5kaWNhdG9yIHJlY3R7ZmlsbC1vcGFjaXR5OjAuMjU7c3Ryb2tlLW9wYWNpdHk6MC45O2N1cnNvcjpwb2ludGVyO3N0cm9rZS13aWR0aDoxcHh9LmQyYi1idWJibGUtcGFjay1ncmFwaCAuZDJiLWJ1YmJsZS1pbmRpY2F0b3IgcmVjdDpob3ZlcntzdHJva2Utd2lkdGg6MnB4fS5kMmItYnViYmxlLXBhY2stZ3JhcGggLmQyYi1idWJibGUtaW5kaWNhdG9yIHBhdGgsLmQyYi1idWJibGUtcGFjay1ncmFwaCAuZDJiLWJ1YmJsZS1pbmRpY2F0b3IgdGV4dHtwb2ludGVyLWV2ZW50czpub25lfS5kMmItcGxhbmUgdGV4dHtmb250LXNpemU6MTBwdH0uZDJiLXBsYW5lIC5kMmIteTItYXhpcyAuZDJiLWF4aXMtbGFiZWwsLmQyYi1wbGFuZSAuZDJiLXktYXhpcyAuZDJiLWF4aXMtbGFiZWx7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfS5kMmItcGxhbmUgLmQyYi15Mi1heGlzIC50aWNrIGxpbmUsLmQyYi1wbGFuZSAuZDJiLXktYXhpcyAudGljayBsaW5le3N0cm9rZS13aWR0aDowLjZweH0uZDJiLXBsYW5lIC5kMmItZ3JpZCAudGljayBsaW5le3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzO3N0cm9rZS13aWR0aDowLjVweDtzdHJva2Utb3BhY2l0eTowLjE1fS5kMmItcGxhbmUgLmQyYi1ncmlkIC50aWNrIHRleHR7ZGlzcGxheTpub25lfS5kMmItcGxhbmUgLmQyYi1heGlzLWxhYmVse2ZpbGw6IzAwMDtmb250LXdlaWdodDo3MDB9LmQyYi1wbGFuZSBwYXRoLmRvbWFpbntzdHJva2Utd2lkdGg6MC40cHg7c3Ryb2tlLW9wYWNpdHk6MC40fS5kMmItc3VuYnVyc3QtYXJje3RyYW5zaXRpb246b3BhY2l0eSAwLjJzLHN0cm9rZS13aWR0aCAwLjJzO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC45O3N0cm9rZS13aWR0aDowLjhweDtzdHJva2U6I2ZmZn0uZDJiLXN1bmJ1cnN0LWFyYy5kMmItdHJhbnNwYXJlbnR7ZmlsbC1vcGFjaXR5OjAuMn0uZDJiLXN1bmJ1cnN0LWxhYmVse2ZvbnQtc2l6ZTo4cHQ7ZmlsbC1vcGFjaXR5OjAuODtwb2ludGVyLWV2ZW50czpub25lO2ZvbnQtZmFtaWx5OmFyaWFsfS5kMmItc3VuYnVyc3QtbGFiZWwuZDJiLXRyYW5zcGFyZW50e2ZpbGwtb3BhY2l0eTowLjJ9LmQyYi1zdW5idXJzdC1jZW50ZXJ7ZmlsbC1vcGFjaXR5OjA7c3Ryb2tlOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LmQyYi1zdW5idXJzdC1hbmNlc3RvcntvcGFjaXR5OjAuNH0uZDJiLXNhbmtleS1saW5rcyBwYXRoe2ZpbGw6bm9uZX0uZDJiLXNhbmtleS1saW5rcyBwYXRoLC5kMmItc2Fua2V5LWxpbmtzIHJlY3R7b3BhY2l0eTowLjR9LmQyYi1zYW5rZXktbGlua3MgcGF0aDpob3ZlciwuZDJiLXNhbmtleS1saW5rcyByZWN0OmhvdmVye29wYWNpdHk6MC42fS5kMmItc2Fua2V5LW5vZGVzIHJlY3R7c3Ryb2tlLXdpZHRoOjAuM3B4O3N0cm9rZTojMDAwO29wYWNpdHk6MC42fS5kMmItc2Fua2V5LW5vZGVzIHJlY3Q6aG92ZXJ7b3BhY2l0eTowLjh9LmQyYi10ZXh0LWFuY2hvci1lbmR7dGV4dC1hbmNob3I6ZW5kfVxuLyouZDJiLXRvb2x0aXAtYXJlYSB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyovLmQyYi10b29sdGlwe3BvaW50ZXItZXZlbnRzOm5vbmU7YmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2JiYjtib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjpmaXhlZDtib3gtc2hhZG93OjBweCAwcHggMnB4ICNjY2M7bWFyZ2luOjB9LmQyYi10b29sdGlwOmJlZm9yZXtsZWZ0OjA7dG9wOjA7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2NvbnRlbnQ6XCJcIn0uZDJiLXRvb2x0aXAtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXA7cGFkZGluZzo2cHggMTBweH0uZDJiLXRvb2x0aXAtdG9wey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTEwMCUpO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXRvcDotMTVweH0uZDJiLXRvb2x0aXAtdG9wOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2xlZnQ6NTAlO3RvcDoxMDAlO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6NnB4IDZweCAwO2JvcmRlci10b3AtY29sb3I6aW5oZXJpdH0uZDJiLXRvb2x0aXAtYm90dG9tey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwwKTttYXJnaW4tbGVmdDowO21hcmdpbi10b3A6MTVweH0uZDJiLXRvb2x0aXAtYm90dG9tOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2xlZnQ6NTAlO3RvcDotNnB4O3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6MCA2cHggNnB4O2JvcmRlci1ib3R0b20tY29sb3I6aW5oZXJpdH0uZDJiLXRvb2x0aXAtcmlnaHR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDAsLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZSgwLC01MCUpO21hcmdpbi1sZWZ0OjE1cHg7bWFyZ2luLXRvcDowfS5kMmItdG9vbHRpcC1yaWdodDpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtsZWZ0Oi02cHg7dG9wOjUwJTt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjZweCA2cHggNnB4IDA7Ym9yZGVyLXJpZ2h0LWNvbG9yOmluaGVyaXR9LmQyYi10b29sdGlwLWxlZnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKC0xMDAlLC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTEwMCUsLTUwJSk7bWFyZ2luLWxlZnQ6LTE1cHg7bWFyZ2luLXRvcDowfS5kMmItdG9vbHRpcC1sZWZ0OmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO2xlZnQ6MTAwJTt0b3A6NTAlO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6NnB4IDAgNnB4IDZweDtib3JkZXItbGVmdC1jb2xvcjppbmhlcml0fVxuLyp9Ki9cbi8qLmQyYi10b29sdGlwLWF4aXMtYXJlYSB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBmb250LWZhbWlseTogJ0FyaWFsJzsqLy5kMmItdG9vbHRpcC1tYXJrZXJ7c3Ryb2tlLXdpZHRoOjJweDtzdHJva2U6I2JiYjtzdHJva2UtZGFzaGFycmF5OjUsNX0uZDJiLXRvb2x0aXAtYXhpc3twb2ludGVyLWV2ZW50czpub25lO2ZvbnQtZmFtaWx5OkFyaWFsO29wYWNpdHk6MC45O3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDpoc2xhKDAsMCUsMTAwJSwuOCk7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNoYWRvdzowcHggMHB4IDJweCAjY2NjfS5kMmItdG9vbHRpcC1heGlzIC5kMmItdG9vbHRpcC10aXRsZXt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kOnJnYmEoMTUwLDE2NSwxNzUsLjgpO3BhZGRpbmc6NXB4IDEwcHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOiNmZmZ9LmQyYi10b29sdGlwLWF4aXMgLmQyYi10b29sdGlwLWNvbnRlbnR7cGFkZGluZzo1cHggMTBweH0uZDJiLXRvb2x0aXAtYXhpcyAuZDJiLXRvb2x0aXAtY29udGVudCAuZDJiLXRvb2x0aXAtcm93e3BhZGRpbmctbGVmdDo1cHg7Ym9yZGVyLWxlZnQtd2lkdGg6M3B4O2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO21hcmdpbi1ib3R0b206NXB4fS5kMmItdG9vbHRpcC1heGlzIC5kMmItdG9vbHRpcC1jb250ZW50IC5kMmItdG9vbHRpcC1yb3c6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjBweH1cbi8qfSovLmQyYi1icmVhZGNydW1ic3tjb2xvcjojNTU1O2ZvbnQtc2l6ZTo5cHQ7Ym94LXNpemluZzpjb250ZW50LWJveH0uZDJiLWJyZWFkY3J1bWJzIC5kMmItYnJlYWRjcnVtYntib3JkZXI6MHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0LXdpZHRoOjhweDtib3JkZXItYm90dG9tLXdpZHRoOjFweDtwYWRkaW5nOjZweCAxM3B4O21hcmdpbi1ib3R0b206MTBweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7cG9zaXRpb246cmVsYXRpdmV9LmQyYi1icmVhZGNydW1icyAuZDJiLWJyZWFkY3J1bWI6Zmlyc3QtY2hpbGQgLmQyYi1icmVhZGNydW1iLWljb246YWZ0ZXIsLmQyYi1icmVhZGNydW1icyAuZDJiLWJyZWFkY3J1bWI6bGFzdC1jaGlsZCAuZDJiLWJyZWFkY3J1bWItaWNvbjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7bGVmdDotMTUuNXB4O3dpZHRoOjEzcHg7aGVpZ2h0OjEzcHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7cGFkZGluZzo1cHg7Ym9yZGVyLXJhZGl1czoxNXB4fS5kMmItYnJlYWRjcnVtYnMgLmQyYi1icmVhZGNydW1iOmZpcnN0LWNoaWxkIC5kMmItYnJlYWRjcnVtYi1pY29uOmFmdGVye2NvbnRlbnQ6XCJcXGYwMTVcIn0uZDJiLWJyZWFkY3J1bWJzIC5kMmItYnJlYWRjcnVtYjpub3QoOmZpcnN0LWNoaWxkKTpsYXN0LWNoaWxkIC5kMmItYnJlYWRjcnVtYi1pY29uOmFmdGVye2NvbnRlbnQ6XCJcXGYyNWFcIn0uZDJiLWJyZWFkY3J1bWJzOm5vdCguZDJiLXZlcnRpY2FsKXt3aGl0ZS1zcGFjZTpub3dyYXB9LmQyYi1icmVhZGNydW1iczpub3QoLmQyYi12ZXJ0aWNhbCkgLmQyYi1icmVhZGNydW1ie2JvcmRlci1yaWdodC13aWR0aDoxcHg7Ym9yZGVyLXRvcC13aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5kMmItYnJlYWRjcnVtYnM6bm90KC5kMmItdmVydGljYWwpIC5kMmItYnJlYWRjcnVtYjpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDoyMHB4fS5kMmItYnJlYWRjcnVtYnM6bm90KC5kMmItdmVydGljYWwpIC5kMmItYnJlYWRjcnVtYjpub3QoOmxhc3QtY2hpbGQpOmFmdGVye3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6NnB4IDAgNnB4IDZweDtib3JkZXItbGVmdC1jb2xvcjppbmhlcml0O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjtjb250ZW50OlwiXCI7dG9wOjUwJTtsZWZ0OjEwMCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0uZDJiLWJyZWFkY3J1bWJzLmQyYi12ZXJ0aWNhbCAuZDJiLWJyZWFkY3J1bWJ7LyomOmFmdGVyIHtcbiAgICAgIHRyaWFuZ2xlOiBwb2ludGluZy1yaWdodDtcbiAgICAgIHdpZHRoOiAxMDBweDtcbiAgICAgIGhlaWdodDogMTAwcHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgei1pbmRleDogMjtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuXG4gICAgICB0b3A6IDEwMCU7XG4gICAgICBsZWZ0OiA1MCU7XG5cbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcblxuICAgIH0qL30uZDJiLWJyZWFkY3J1bWJzLmQyYi12ZXJ0aWNhbCAuZDJiLWJyZWFkY3J1bWI6bm90KDpsYXN0LWNoaWxkKTphZnRlcnt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjZweCA2cHggMDtib3JkZXItdG9wLWNvbG9yOmluaGVyaXQ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2NvbnRlbnQ6XCJcIjt0b3A6MTAwJTtsZWZ0OjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfS5zdHVmZntkaXNwbGF5Om5vbmV9LmQyYi1sZWdlbmR7Y29sb3I6IzU1NTtmb250LXNpemU6OXB0fS5kMmItbGVnZW5kIC5kMmItbGVnZW5kLWl0ZW17Ym9yZGVyOjBweCBzb2xpZCB0cmFuc3BhcmVudDtwYWRkaW5nOjJweDtwYWRkaW5nLWxlZnQ6MThweDtwb3NpdGlvbjpyZWxhdGl2ZTtjdXJzb3I6cG9pbnRlcn0uZDJiLWxlZ2VuZCAuZDJiLWxlZ2VuZC1pdGVtIC5kMmItbGVnZW5kLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO2xlZnQ6N3B4O3dpZHRoOjEycHg7aGVpZ2h0OjEycHh9LmQyYi1sZWdlbmQgLmQyYi1sZWdlbmQtaXRlbSAuZDJiLWxlZ2VuZC1zdmctaWNvbnttYXJnaW4tbGVmdDotNXB4O21hcmdpbi10b3A6LTVweDtwb2ludGVyLWV2ZW50czpub25lfS5kMmItbGVnZW5kIC5kMmItbGVnZW5kLWl0ZW0gLmQyYi1sZWdlbmQtc3ZnLWljb24gcGF0aCwuZDJiLWxlZ2VuZCAuZDJiLWxlZ2VuZC1pdGVtIC5kMmItbGVnZW5kLXN2Zy1pY29uIHRleHR7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7dGV4dC1hbmNob3I6bWlkZGxlO3N0cm9rZS13aWR0aDoxcHg7ZmlsbC1vcGFjaXR5OjAuOH0uZDJiLWxlZ2VuZDpub3QoLmQyYi12ZXJ0aWNhbCkgLmQyYi1sZWdlbmQtaXRlbXtkaXNwbGF5OmlubGluZS1ibG9ja30uZDJiLWxlZ2VuZDpub3QoLmQyYi12ZXJ0aWNhbCkgLmQyYi1sZWdlbmQtaXRlbTpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1yaWdodDoxMHB4fS5kMmItbGVnZW5kOm5vdCguZDJiLXZlcnRpY2FsKSAuZDJiLWxlZ2VuZC1pY29ue21hcmdpbi10b3A6MS41cHh9LmQyYi1jaGFydC1mcmFtZXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlfS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZSwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItY2hhcnQsLmQyYi1jaGFydC1mcmFtZSAuZDJiLWxlZ2VuZC1mcmFtZXtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzphdXRvfS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZSAuZDJiLWJyZWFkY3J1bWJzLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWUgLmQyYi1icmVhZGNydW1ic3twYWRkaW5nLWxlZnQ6MTBweDtwYWRkaW5nLXJpZ2h0OjJweH0uZDJiLWNoYXJ0LWZyYW1lIC5kMmItYnJlYWRjcnVtYnMtZnJhbWU6bm90KC5kMmItdmVydGljYWwpLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWU6bm90KC5kMmItdmVydGljYWwpe292ZXJmbG93LXk6aGlkZGVufS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZTpub3QoLmQyYi12ZXJ0aWNhbCkgLmQyYi1icmVhZGNydW1icywuZDJiLWNoYXJ0LWZyYW1lIC5kMmItYnJlYWRjcnVtYnMtZnJhbWU6bm90KC5kMmItdmVydGljYWwpIC5kMmItbGVnZW5kLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZTpub3QoLmQyYi12ZXJ0aWNhbCkgLmQyYi1sZWdlbmQtaXRlbSwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lOm5vdCguZDJiLXZlcnRpY2FsKSAuZDJiLWJyZWFkY3J1bWJzLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWU6bm90KC5kMmItdmVydGljYWwpIC5kMmItbGVnZW5kLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWU6bm90KC5kMmItdmVydGljYWwpIC5kMmItbGVnZW5kLWl0ZW17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93LXk6aGlkZGVufS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZTpub3QoLmQyYi12ZXJ0aWNhbCkuZDJiLWxlZ2VuZC1mcmFtZSwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lOm5vdCguZDJiLXZlcnRpY2FsKS5kMmItbGVnZW5kLWZyYW1le2hlaWdodDoyMHB4O3RleHQtYWxpZ246Y2VudGVyfS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZTpub3QoLmQyYi12ZXJ0aWNhbCkuZDJiLWJyZWFkY3J1bWJzLWZyYW1lLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWU6bm90KC5kMmItdmVydGljYWwpLmQyYi1icmVhZGNydW1icy1mcmFtZXtoZWlnaHQ6NTVweH0uZDJiLWNoYXJ0LWZyYW1lIC5kMmItYnJlYWRjcnVtYnMtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItYnJlYWRjcnVtYnMtY29udGFpbmVyLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZS5kMmItdmVydGljYWwgLmQyYi1sZWdlbmQtY29udGFpbmVyLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItYnJlYWRjcnVtYnMtY29udGFpbmVyLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItbGVnZW5kLWNvbnRhaW5lcntkaXNwbGF5OnRhYmxlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmQyYi1jaGFydC1mcmFtZSAuZDJiLWJyZWFkY3J1bWJzLWZyYW1lLmQyYi12ZXJ0aWNhbCAuZDJiLWJyZWFkY3J1bWJzLWNvbnRhaW5lciAuZDJiLWxlZ2VuZCwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItYnJlYWRjcnVtYnMtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItbGVnZW5kLWNvbnRhaW5lciAuZDJiLWxlZ2VuZCwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lLmQyYi12ZXJ0aWNhbCAuZDJiLWJyZWFkY3J1bWJzLWNvbnRhaW5lciAuZDJiLWxlZ2VuZCwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lLmQyYi12ZXJ0aWNhbCAuZDJiLWxlZ2VuZC1jb250YWluZXIgLmQyYi1sZWdlbmR7ZGlzcGxheTp0YWJsZS1jZWxsO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZDJiLWNoYXJ0LWZyYW1lIC5kMmItYnJlYWRjcnVtYnMtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItYnJlYWRjcnVtYnMtY29udGFpbmVyIC5kMmItYnJlYWRjcnVtYnMsLmQyYi1jaGFydC1mcmFtZSAuZDJiLWJyZWFkY3J1bWJzLWZyYW1lLmQyYi12ZXJ0aWNhbCAuZDJiLWxlZ2VuZC1jb250YWluZXIgLmQyYi1icmVhZGNydW1icywuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lLmQyYi12ZXJ0aWNhbCAuZDJiLWJyZWFkY3J1bWJzLWNvbnRhaW5lciAuZDJiLWJyZWFkY3J1bWJzLC5kMmItY2hhcnQtZnJhbWUgLmQyYi1sZWdlbmQtZnJhbWUuZDJiLXZlcnRpY2FsIC5kMmItbGVnZW5kLWNvbnRhaW5lciAuZDJiLWJyZWFkY3J1bWJze2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmQyYi1jaGFydC1mcmFtZSAuZDJiLWJyZWFkY3J1bWJzLWZyYW1lLmQyYi12ZXJ0aWNhbC5kMmItYnJlYWRjcnVtYnMtZnJhbWUsLmQyYi1jaGFydC1mcmFtZSAuZDJiLWxlZ2VuZC1mcmFtZS5kMmItdmVydGljYWwuZDJiLWJyZWFkY3J1bWJzLWZyYW1le3dpZHRoOjE4MHB4fS5kMmItY2hhcnQtZnJhbWUgLmQyYi1icmVhZGNydW1icy1mcmFtZS5kMmItdmVydGljYWwuZDJiLWxlZ2VuZC1mcmFtZSwuZDJiLWNoYXJ0LWZyYW1lIC5kMmItbGVnZW5kLWZyYW1lLmQyYi12ZXJ0aWNhbC5kMmItbGVnZW5kLWZyYW1le3dpZHRoOjExMHB4fSIsIHVuZGVmaW5lZCk7CgogIHZhciB2ZXJzaW9uID0gIjAuNS41IjsKCiAgZnVuY3Rpb24gZnVuY3Rvcih2KSB7CiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgPyB2IDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdjsKICAgIH07CiAgfQoKICAvLyBXb3JrIGFyb3VuZCBmb3IgSmF2YVNjcmlwdHMgfHw9IG9wZXJhdG9yLiBPbmx5IG51bGwsIHVuZGVmaW5lZCwgTmFOLCBhbmQgZmFsc2Ugd2lsbCBiZSBjb25zdHJ1ZWQgYXMgZmFsc3kuCgogIGZ1bmN0aW9uIG9yZXEgKCkgewogICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgIH0KCiAgICB2YXIgdmFsID0gYXJnc1swXTsKICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gZmFsc2UpIHZhbCA9IGE7CiAgICB9KTsKICAgIHJldHVybiB2YWw7CiAgfQoKICAvLyBXcmFwcyB0ZXh0IGJhc2VkIG9uIGNoYXJhY3RlciBjb3VudCBhbmQgdGV4dCBhY2Nlc3Nvci4gVGhpcyBtZXRob2QgdXNlcwogIC8vIGQzJ3MgZW50ZXIvdXBkYXRlL2V4aXQgc3RyYXRlZ3kgYXMgdG8gYmUgbGVzcyBkZXN0cnVjdGl2ZSBvbiB0aGUgdGV4dCBjb250ZW50LgogIGZ1bmN0aW9uIHRleHRXcmFwICh0ZXh0KSB7CiAgICB2YXIgZ2V0VGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICB9OwogICAgdmFyIGdldENvdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBJbmZpbml0eTsKICAgIHZhciBnZXRBbmNob3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICdzdGFydCc7CgogICAgZ2V0VGV4dCA9IGZ1bmN0b3IoZ2V0VGV4dCk7CiAgICBnZXRDb3VudCA9IGZ1bmN0b3IoZ2V0Q291bnQpOwogICAgZ2V0QW5jaG9yID0gZnVuY3RvcihnZXRBbmNob3IpOwoKICAgIHRleHQuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICB2YXIgdGV4dCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgIHdvcmRzID0gKCcnICsgZ2V0VGV4dC5jYWxsKHRoaXMsIGQsIGkpKS5zcGxpdCgvXHMrLykucmV2ZXJzZSgpLAogICAgICAgICAgd29yZCA9IHZvaWQgMCwKICAgICAgICAgIGxpbmVzID0gW10sCiAgICAgICAgICBsaW5lID0gW3dvcmRzLnBvcCgpXSwKICAgICAgICAgIGxpbmVIZWlnaHQgPSAxLjEsCiAgICAgICAgICBjb3VudCA9IGdldENvdW50LmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICBhbmNob3IgPSBnZXRBbmNob3IuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICAgIHggPSArdGV4dC5hdHRyKCd4JyksCiAgICAgICAgICB5ID0gK3RleHQuYXR0cigneScpLAogICAgICAgICAgZHkgPSBwYXJzZUZsb2F0KHRleHQuYXR0cignZHknKSkgfHwgMDsKCiAgICAgIC8vIGNsZWFyIHRleHQgaWYgdGhlIHdyYXBwZXIgaXMgYmVpbmcgcnVuIGZvciB0aGUgZmlyc3QgdGltZQogICAgICBpZiAob3JlcSh0ZXh0Lmh0bWwoKSwgJycpLmluZGV4T2YoJ3RzcGFuJykgPT09IC0xKSB0ZXh0LnRleHQoJycpOwoKICAgICAgd29yZCA9IHdvcmRzLnBvcCgpOwogICAgICB3aGlsZSAod29yZCkgewogICAgICAgIGlmIChsaW5lLmpvaW4oJyAnKS5sZW5ndGggKyB3b3JkLmxlbmd0aCA+IGNvdW50KSB7CiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpOwogICAgICAgICAgbGluZSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgbGluZS5wdXNoKHdvcmQpOwogICAgICAgIHdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgfQogICAgICBsaW5lcy5wdXNoKGxpbmUpOwoKICAgICAgdmFyIHRzcGFuID0gdGV4dC5zZWxlY3RBbGwoJ3RzcGFuJykuZGF0YShsaW5lcyksCiAgICAgICAgICBoZWlnaHQgPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0LAogICAgICAgICAgb2Zmc2V0ID0gYW5jaG9yID09PSAnZW5kJyA/IGhlaWdodCA6IGFuY2hvciA9PT0gJ21pZGRsZScgPyBoZWlnaHQgLyAyIDogMDsKCiAgICAgIHRzcGFuLm1lcmdlKHRzcGFuLmVudGVyKCkuYXBwZW5kKCd0c3BhbicpKS50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuam9pbignICcpOwogICAgICB9KS5hdHRyKCd4JywgeCkuYXR0cigneScsIHkpLmF0dHIoJ2R5JywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZHkgKyBpICogbGluZUhlaWdodCAtIG9mZnNldCArICdlbSc7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICAvLyBXcmFwIHRleHQgYmFzZWQgb24gcGl4ZWwgbGVuZ3RoLgogIC8vIFRoaXMgaXNuJ3QgdXNlZCB2ZXJ5IGZyZXF1ZW50bHkgYmVjYXVzZSBpdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBldmVudAogIC8vIHJlYmluZGluZyBuYW1lbHkgZG91YmxlIGNsaWNrIGV2ZW50cy4KICBmdW5jdGlvbiB0ZXh0V3JhcFBYICh0ZXh0KSB7CiAgICB2YXIgd2lkdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IEluZmluaXR5OwoKICAgIHRleHQuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB0ZXh0ID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgd29yZHMgPSB0ZXh0LnRleHQoKS5zcGxpdCgvXHMrLykucmV2ZXJzZSgpLAogICAgICAgICAgd29yZCA9IHZvaWQgMCwKICAgICAgICAgIGxpbmUgPSBbXSwKICAgICAgICAgIGxpbmVOdW1iZXIgPSAwLAogICAgICAgICAgbGluZUhlaWdodCA9IDEuMSwKICAgICAgICAgIC8vIGVtcwogICAgICB5ID0gcGFyc2VGbG9hdCh0ZXh0LmF0dHIoJ3knKSkgfHwgMCwKICAgICAgICAgIGR5ID0gcGFyc2VGbG9hdCh0ZXh0LmF0dHIoJ2R5JykpIHx8IDAsCiAgICAgICAgICB0c3BhbiA9IHRleHQudGV4dChudWxsKS5hcHBlbmQoJ3RzcGFuJykuYXR0cigneCcsIDApLmF0dHIoJ3knLCB5KS5hdHRyKCdkeScsIGR5ICsgJ2VtJyk7CgogICAgICB3b3JkID0gd29yZHMucG9wKCk7CiAgICAgIHdoaWxlICh3b3JkKSB7CiAgICAgICAgbGluZS5wdXNoKHdvcmQpOwogICAgICAgIHRzcGFuLnRleHQobGluZS5qb2luKCcgJykpOwogICAgICAgIGlmICh0c3Bhbi5ub2RlKCkuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkgPiB3aWR0aCkgewogICAgICAgICAgbGluZS5wb3AoKTsKICAgICAgICAgIHRzcGFuLnRleHQobGluZS5qb2luKCcgJykpOwogICAgICAgICAgbGluZSA9IFt3b3JkXTsKICAgICAgICAgIHRzcGFuID0gdGV4dC5hcHBlbmQoJ3RzcGFuJykuYXR0cigneCcsIDApLmF0dHIoJ3knLCB5KS5hdHRyKCdkeScsICsrbGluZU51bWJlciAqIGxpbmVIZWlnaHQgKyBkeSArICdlbScpLnRleHQod29yZCk7CiAgICAgICAgfQogICAgICAgIHdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlbkFyYyAoY29udGV4dCwgYXJjKSB7CiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKGQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbm5lclJhZGl1czogYXJjLmlubmVyUmFkaXVzKCkoZCksCiAgICAgICAgb3V0ZXJSYWRpdXM6IGFyYy5vdXRlclJhZGl1cygpKGQpLAogICAgICAgIHN0YXJ0QW5nbGU6IGFyYy5zdGFydEFuZ2xlKCkoZCksCiAgICAgICAgZW5kQW5nbGU6IGFyYy5lbmRBbmdsZSgpKGQpCiAgICAgIH07CiAgICB9CgogICAgLy8gaWYgY29udGV4dCBpcyBub3QgYSB0cmFuc2l0aW9uIGp1c3QgcmVuZGVyIHRoZSBhcmMgYW5kIHVwZGF0ZSBjdXJyZW50CiAgICBpZiAoIWNvbnRleHQuc2VsZWN0aW9uKSB7CiAgICAgIHJldHVybiBjb250ZXh0LmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHRoaXMuY3VycmVudCA9IGdldFByb3BlcnRpZXMoZCk7CiAgICAgICAgcmV0dXJuIGFyYyhkKTsKICAgICAgfSk7CiAgICB9CgogICAgLy8gaWYgY29udGV4dCBpcyBhIHRyYW5zaXRpb24gdHdlZW4gdGhlICdkJyBhdHRyaWJ1dGUKICAgIGNvbnRleHQuYXR0clR3ZWVuKCdkJywgZnVuY3Rpb24gKGQpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIC8vIG9taXQgZGF0YSBhdHRyaWJ1dGUgaW5jYXNlIG9mIGEgcGllIGNoYXJ0IHdpdGggbmVzdGVkIGFzc29jaWF0aW9ucwogICAgICBkID0gZ2V0UHJvcGVydGllcyhkKTsKICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50IHx8IGQ7CiAgICAgIHZhciBpID0gZDMuaW50ZXJwb2xhdGUodGhpcy5jdXJyZW50LCBkKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgX3RoaXMuY3VycmVudCA9IGkodCk7CiAgICAgICAgcmV0dXJuIGFyYyhfdGhpcy5jdXJyZW50KTsKICAgICAgfTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbnVtYmVyaXplICh4KSB7CiAgICB2YXIgZGVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwOwoKICAgIGlmIChpc05hTih4KSB8fCB4ID09PSBudWxsKSByZXR1cm4gZGVmOwogICAgcmV0dXJuIHg7CiAgfQoKICBmdW5jdGlvbiB0d2Vlbk51bWJlciAoY29udGV4dCkgewogICAgdmFyIG51bWJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9OwogICAgdmFyIGZvcm1hdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9OwoKICAgIG51bWJlciA9IGZ1bmN0b3IobnVtYmVyKTsKCiAgICAvLyBpZiBjb250ZXh0IGlzIG5vdCBhIHRyYW5zaXRpb24ganVzdCByZW5kZXIgdGhlIHRleHQgYW5kIHVwZGF0ZSBjdXJyZW50CiAgICBpZiAoIWNvbnRleHQuc2VsZWN0aW9uKSB7CiAgICAgIHJldHVybiBjb250ZXh0LnRleHQoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICB0aGlzLmN1cnJlbnQgPSBudW1iZXJpemUobnVtYmVyLmNhbGwodGhpcywgZCwgaSkpOwogICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50KTsKICAgICAgfSk7CiAgICB9CgogICAgY29udGV4dC50d2VlbigndGV4dCcsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICB2YXIgdmFsID0gbnVtYmVyaXplKG51bWJlci5jYWxsKHRoaXMsIGQsIGkpKTsKICAgICAgdGhpcy5jdXJyZW50ID0gbnVtYmVyaXplKHRoaXMuY3VycmVudCwgdmFsKTsKICAgICAgdmFyIGludGVycG9sYXRlID0gZDMuaW50ZXJwb2xhdGUodGhpcy5jdXJyZW50LCB2YWwpOwogICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICBfdGhpcy50ZXh0Q29udGVudCA9IGZvcm1hdChfdGhpcy5jdXJyZW50ID0gaW50ZXJwb2xhdGUodCkpOwogICAgICB9OwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlbkNlbnRyb2lkIChjb250ZXh0LCBhcmMpIHsKICAgIHZhciByb3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnJvdGF0ZTsKICAgIH07CgogICAgcm90YXRlID0gZnVuY3Rvcihyb3RhdGUpOwoKICAgIC8vIGdldCBzcGVjaWZpYyBzZXQgb2YgcHJvcGVydGllcyBpbiBjYXNlIG9mIHJlY3Vyc2l2ZQogICAgZnVuY3Rpb24gZ2V0UHJvcGVydGllcyhkKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5uZXJSYWRpdXM6IGFyYy5pbm5lclJhZGl1cygpKGQpLAogICAgICAgIG91dGVyUmFkaXVzOiBhcmMub3V0ZXJSYWRpdXMoKShkKSwKICAgICAgICBzdGFydEFuZ2xlOiBhcmMuc3RhcnRBbmdsZSgpKGQpLAogICAgICAgIGVuZEFuZ2xlOiBhcmMuZW5kQW5nbGUoKShkKSwKICAgICAgICByb3RhdGU6IHJvdGF0ZShkKSB8fCAwCiAgICAgIH07CiAgICB9CgogICAgLy8gaWYgY29udGV4dCBpcyBub3QgYSB0cmFuc2l0aW9uIGp1c3QgcmVuZGVyIHRoZSBjZW50cm9pZCBhbmQgdXBkYXRlIGN1cnJlbnQKICAgIGlmICghY29udGV4dC5zZWxlY3Rpb24pIHsKICAgICAgcmV0dXJuIGNvbnRleHQuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICB0aGlzLmN1cnJlbnQgPSBnZXRQcm9wZXJ0aWVzKGQpOwogICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBhcmMuY2VudHJvaWQodGhpcy5jdXJyZW50KSArICcpJyArICgncm90YXRlKCcgKyB0aGlzLmN1cnJlbnQucm90YXRlICsgJyknKTsKICAgICAgfSk7CiAgICB9CgogICAgY29udGV4dC5hdHRyVHdlZW4oJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICBkID0gZ2V0UHJvcGVydGllcyhkKTsKICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50IHx8IGQ7CiAgICAgIHZhciBpID0gZDMuaW50ZXJwb2xhdGUodGhpcy5jdXJyZW50LCBkKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgX3RoaXMuY3VycmVudCA9IGkodCk7CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGFyYy5jZW50cm9pZChfdGhpcy5jdXJyZW50KSArICcpICcgKyAoJ3JvdGF0ZSgnICsgKF90aGlzLmN1cnJlbnQucm90YXRlIHx8IDApICsgJyknKTsKICAgICAgfTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICAqIGQyYi5tb2RlbEJhc2UoKSByZXR1cm5zIGEgZDJiIGJhc2UgbW9kZWwuCiAgICAqCiAgICAqIG1vZGVsLmludGVyZmFjZSgpIHdpbGwgcmV0dXJuIGEgYmFzZSBpbnRlcmZhY2Ugd2l0aCB2YXJpb3VzIGJ1aWx0IGluCiAgICAqIGdldHRlci9zZXR0ZXIgbWV0aG9kcy4KICAgICogbW9kZWwudmFsdWVzKCkgd2lsbCByZXR1cm4gdGhlIHZhbHVlcyBzZXQgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgogICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBiYXNlIC0gZnVuY3Rpb24gdGhhdCB3aWxsIGFjdCBhcyB0aGUgbW9kZWwgaW50ZXJmYWNlCiAgICAqIEBwYXJhbSB7b2JqZWN0fSAkJCAtIGF0dHJpYnV0ZXMgc2V0IGJ5IGludGVyYWN0aXZlIHdpdGggdGhlIGJhc2UgaW50ZXJmYWNlCiAgICAqIEByZXR1cm4ge09iamVjdH0gbW9kZWwgLSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzCiAgICAqLwoKICBmdW5jdGlvbiBiYXNlKCkgewogICAgdmFyIF9iYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKCiAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgIHZhciAkJCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICB2YXIgcHJvdGVjdCA9IGFyZ3VtZW50c1syXTsKCgogICAgLy8gRGVmaW5lIGFuIGVtaXR0ZXIgdXBkYXRlciB0aGF0IHdpbGwgZmlyZSBldmVudHMgYXJvdW5kIHRoZSBiYXNlIHVwZGF0ZXIKICAgIC8vIGlmICh0eXBlb2YgYmFzZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgLy8gICBiYXNlLmVtaXR0ZXIgPSBmdW5jdGlvbiAoY29udGV4dCkgewogICAgLy8gICAgIGlmIChjb250ZXh0LmRpc3BhdGNoKSBjb250ZXh0LmRpc3BhdGNoKCdiZWZvcmVBcHBseScsIHtidWJibGVzOiB0cnVlfSk7CiAgICAvLyAgICAgYmFzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gICAgIGlmIChjb250ZXh0LmRpc3BhdGNoKSBjb250ZXh0LmRpc3BhdGNoKCdhcHBsaWVkJywge2J1YmJsZXM6IHRydWV9KTsKICAgIC8vICAgfTsKICAgIC8vIH0KCiAgICB2YXIgcHJvcEZuID0gZnVuY3Rpb24gcHJvcEZuKHByb3AsIGNiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuICQkW3Byb3BdOwogICAgICAgIHZhciBvbGQgPSAkJFtwcm9wXTsKICAgICAgICAkJFtwcm9wXSA9IF87CiAgICAgICAgaWYgKGNiKSBjYihfLCBvbGQpOwogICAgICAgIHJldHVybiBfYmFzZTsKICAgICAgfTsKICAgIH07CgogICAgdmFyIHByb3BGbkdldCA9IGZ1bmN0aW9uIHByb3BGbkdldChwcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuICQkW3Byb3BdOwogICAgICB9OwogICAgfTsKCiAgICB2YXIgcHJvcEZuRnVuY3RvciA9IGZ1bmN0aW9uIHByb3BGbkZ1bmN0b3IocHJvcCwgY2IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gJCRbcHJvcF07CiAgICAgICAgdmFyIG9sZCA9ICQkW3Byb3BdOwogICAgICAgICQkW3Byb3BdID0gZnVuY3RvcihfKTsKICAgICAgICBpZiAoY2IpIGNiKCQkW3Byb3BdLCBvbGQpOwogICAgICAgIHJldHVybiBfYmFzZTsKICAgICAgfTsKICAgIH07CgogICAgdmFyIHNjYWxlRm5GdW5jdG9yID0gZnVuY3Rpb24gc2NhbGVGbkZ1bmN0b3IocHJvcCwgY2IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gJCRbcHJvcF07CiAgICAgICAgdmFyIG9sZCA9ICQkW3Byb3BdOwogICAgICAgIGlmIChfICYmIF8uZG9tYWluKSAkJFtwcm9wXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBfOwogICAgICAgIH07ZWxzZSAkJFtwcm9wXSA9IGZ1bmN0b3IoXyk7CiAgICAgICAgaWYgKGNiKSBjYigkJFtwcm9wXSwgb2xkKTsKICAgICAgICByZXR1cm4gX2Jhc2U7CiAgICAgIH07CiAgICB9OwoKICAgIC8qIEJhc2UgTW9kZWwgKi8KICAgIHZhciBtb2RlbCA9IHsKICAgICAgYmFzZTogZnVuY3Rpb24gYmFzZSgpIHsKICAgICAgICByZXR1cm4gX2Jhc2U7CiAgICAgIH0sCiAgICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkgewogICAgICAgIHJldHVybiAkJDsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAgKiBtb2RlbC5yZW1vdmVQcm9wIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3AgICAgLSBwcm9wZXJ0eSBrZXkKICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbW9kZWwgIC0gcmV0dXJucyBtb2RlbCB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nCiAgICAgICAgKi8KICAgICAgcmVtb3ZlUHJvcDogZnVuY3Rpb24gcmVtb3ZlUHJvcChwcm9wKSB7CiAgICAgICAgaWYgKHByb3RlY3QuaW5kZXhPZihwcm9wKSAhPT0gLTEpIHsKICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBDYW5ub3QgcmVtb3ZlICR7cHJvcH0gcHJvcGVydHkgb3IgdmFsdWVgKTsKICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICB9CgogICAgICAgICQkW3Byb3BdID0gbnVsbDsKICAgICAgICBfYmFzZVtwcm9wXSA9IG51bGw7CiAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICB9LAogICAgICAvKioKICAgICAgICAqIG1vZGVsLmFkZFByb3AgYWxsb3dzIG5ldyBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBtb2RlbCBhbmQgYmFzZQogICAgICAgICogaW50ZXJmYWNlLiBJZiB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBkZWZpbmVkIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkLgogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3AgICAgLSBwcm9wZXJ0eSBrZXkKICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSAgIC0gZGVmYXVsdCB2YWx1ZSB0byBzZXQKICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmbiAgICAgIC0gZnVuY3Rpb24gYXMgbmV3IHByb3AgZ2V0dGVyL3NldHRlcgogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGNiICAgICAgLSBjYWxsYmFjayBmdW5jdGlvbiBhZnRlciBwcm9wIGlzIHNldAogICAgICAgICogQHJldHVybiB7T2JqZWN0fSBtb2RlbCAgLSByZXR1cm5zIG1vZGVsIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcKICAgICAgICAqLwogICAgICBhZGRQcm9wOiBmdW5jdGlvbiBhZGRQcm9wKHByb3ApIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CiAgICAgICAgdmFyIGZuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBwcm9wRm4ocHJvcCk7CiAgICAgICAgdmFyIGNiID0gYXJndW1lbnRzWzNdOwoKICAgICAgICBpZiAoJCRbcHJvcF0gfHwgX2Jhc2VbcHJvcF0pIHsKICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYCR7cHJvcH0gcHJvcGVydHkgaXMgYWxyZWFkeSBkZWZpbmVkLmApOwogICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgIH0KICAgICAgICAvLyBhbGxvdyBmb3IgbnVsbDpkZWZhdWx0ICdmbicgaW4gb3JkZXIgdG8gYWNjZXNzIGNhbGxiYWNrCiAgICAgICAgZm4gPSBmbiB8fCBwcm9wRm4ocHJvcCwgY2IpOwoKICAgICAgICBmbih2YWx1ZSk7CgogICAgICAgIF9iYXNlW3Byb3BdID0gZm47CgogICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAgKiBtb2RlbC5hZGRQcm9wR2V0IGlzIHNpbWlsYXIgdG8gYWRkUHJvcCBleGNlcHQgaXQgZG9lc24ndCBhbGxvdyBmb3IgdGhlCiAgICAgICAgKiBwcm9wZXJ0eSB0byBiZSByZXNldCB0aHJvdWdoIHRoZSBBUEkuCiAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gcHJvcCAgICAtIHByb3BlcnR5IGtleQogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlICAgLSBkZWZhdWx0IHZhbHVlIHRvIHNldAogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGZuICAgICAgLSBmdW5jdGlvbiBhcyBuZXcgcHJvcCBnZXR0ZXIKICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbW9kZWwgIC0gcmV0dXJucyBtb2RlbCB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nCiAgICAgICAgKi8KICAgICAgYWRkUHJvcEdldDogZnVuY3Rpb24gYWRkUHJvcEdldChwcm9wKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgICAgIHZhciBmbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogcHJvcEZuR2V0KHByb3ApOwoKICAgICAgICBpZiAoJCRbcHJvcF0gfHwgX2Jhc2VbcHJvcF0pIHsKICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYCR7cHJvcH0gcHJvcGVydHkgaXMgYWxyZWFkeSBkZWZpbmVkLmApOwogICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgIH0KCiAgICAgICAgJCRbcHJvcF0gPSB2YWx1ZTsKICAgICAgICBfYmFzZVtwcm9wXSA9IGZuOwoKICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgICogbW9kZWwuYWRkTWV0aG9kIGFsbG93cyBuZXcgbWV0aG9kcyB0byBiZSBhZGRlZCB0byB0aGUgbW9kZWwgYW5kIGJhc2UKICAgICAgICAqIGludGVyZmFjZS4gSWYgdGhlIG1ldGhvZCBpcyBhbHJlYWR5IGRlZmluZWQgYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQuCiAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gbWV0aG9kICAtIG1ldGhvZCBrZXkKICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmbiAgICAgIC0gbmV3IG1ldGhvZAogICAgICAgICogQHJldHVybiB7T2JqZWN0fSBtb2RlbCAgLSByZXR1cm5zIG1vZGVsIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcKICAgICAgICAqLwogICAgICBhZGRNZXRob2Q6IGZ1bmN0aW9uIGFkZE1ldGhvZChtZXRob2QsIGZuKSB7CiAgICAgICAgaWYgKF9iYXNlW21ldGhvZF0pIHsKICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYCR7bWV0aG9kfSBtZXRob2QgaXMgYWxyZWFkeSBkZWZpbmVkLmApOwogICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgIH0KICAgICAgICBfYmFzZVttZXRob2RdID0gZm47CgogICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAgKiBtb2RlbC5hZGRQcm9wRnVuY3RvciBhbGxvd3MgbmV3IGZ1bmN0b3IgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUKICAgICAgICAqIG1vZGVsIGFuZCBiYXNlIGludGVyZmFjZS4gSWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgZGVmaW5lZCBhbiBlcnJvcgogICAgICAgICogd2lsbCBiZSByYWlzZWQuCiAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gcHJvcCAgICAtIHByb3BlcnR5IGtleQogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlICAgLSBkZWZhdWx0IHZhbHVlIHRvIHNldAogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGZuICAgICAgLSBmdW5jdGlvbiBhcyBuZXcgcHJvcCBnZXR0ZXIvc2V0dGVyCiAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG1vZGVsICAtIHJldHVybnMgbW9kZWwgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZwogICAgICAgICovCiAgICAgIGFkZFByb3BGdW5jdG9yOiBmdW5jdGlvbiBhZGRQcm9wRnVuY3Rvcihwcm9wKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgICAgIHZhciBmbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogcHJvcEZuRnVuY3Rvcihwcm9wKTsKICAgICAgICB2YXIgY2IgPSBhcmd1bWVudHNbM107CgogICAgICAgIGlmICgkJFtwcm9wXSB8fCBfYmFzZVtwcm9wXSkgewogICAgICAgICAgLy8gY29uc29sZS5lcnJvcihgJHtwcm9wfSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGRlZmluZWQuYCk7CiAgICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgICAgfQogICAgICAgIC8vIGFsbG93IGZvciBudWxsOmRlZmF1bHQgJ2ZuJyBpbiBvcmRlciB0byBhY2Nlc3MgY2FsbGJhY2sKICAgICAgICBmbiA9IGZuIHx8IHByb3BGbkZ1bmN0b3IocHJvcCwgY2IpOwoKICAgICAgICBmbih2YWx1ZSk7CgogICAgICAgIF9iYXNlW3Byb3BdID0gZm47CgogICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAgKiBtb2RlbC5hZGRTY2FsZUZ1bmN0b3IgYWxsb3dzIG5ldyBzY2FsZSBmdW5jdG9yIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQKICAgICAgICAqIHRvIHRoZSBtb2RlbCBhbmQgYmFzZSBpbnRlcmZhY2UuIElmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGRlZmluZWQKICAgICAgICAqIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkLgogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3AgICAgLSBwcm9wZXJ0eSBrZXkKICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSAgIC0gZGVmYXVsdCB2YWx1ZSB0byBzZXQKICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmbiAgICAgIC0gZnVuY3Rpb24gYXMgbmV3IHByb3AgZ2V0dGVyL3NldHRlcgogICAgICAgICogQHJldHVybiB7T2JqZWN0fSBtb2RlbCAgLSByZXR1cm5zIG1vZGVsIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcKICAgICAgICAqLwogICAgICBhZGRTY2FsZUZ1bmN0b3I6IGZ1bmN0aW9uIGFkZFNjYWxlRnVuY3Rvcihwcm9wKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgICAgIHZhciBmbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogc2NhbGVGbkZ1bmN0b3IocHJvcCk7CiAgICAgICAgdmFyIGNiID0gYXJndW1lbnRzWzNdOwoKICAgICAgICByZXR1cm4gbW9kZWwuYWRkUHJvcChwcm9wLCB2YWx1ZSwgZm4sIGNiKTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAgKiBtb2RlbC5hZGREaXNwYXRjaCBhbGxvd3MgZGlzcGF0Y2hlciB0byBiZSBhZGRlZCB0byB0aGUgbW9kZWwgYW5kIGJhc2UKICAgICAgICAqIGludGVyZmFjZS4KICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9wICAgIC0gcHJvcGVydHkga2V5CiAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RvcmUgICAtIHN0b3JlIGtleQogICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50cyAgLSBhcnJheSBvZiBldmVudCBrZXlzCiAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG1vZGVsICAtIHJldHVybnMgbW9kZWwgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZwogICAgICAgICovCiAgICAgIGFkZERpc3BhdGNoZXI6IGZ1bmN0aW9uIGFkZERpc3BhdGNoZXIoZXZlbnRzKSB7CiAgICAgICAgdmFyIHByb3AgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdvbic7CiAgICAgICAgdmFyIHN0b3JlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnZGlzcGF0Y2gnOwoKICAgICAgICBpZiAoX2Jhc2VbcHJvcF0pIHsKICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYCR7cHJvcH0gcHJvcGVydHkgaXMgYWxyZWFkeSBkZWZpbmVkLmApOwogICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgIH0KICAgICAgICBpZiAoJCRbc3RvcmVdKSB7CiAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGAke3N0b3JlfSB2YWx1ZSBpcyBhbHJlYWR5IGRlZmluZWQuYCk7CiAgICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgICAgfQoKICAgICAgICBfYmFzZVtwcm9wXSA9IGZ1bmN0aW9uIChrZXksIGZuKSB7CiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICQkW3N0b3JlXTsKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gJCRbc3RvcmVdLm9uKGtleSk7CiAgICAgICAgICAkJFtzdG9yZV0ub24oa2V5LCBmbik7CgogICAgICAgICAgcmV0dXJuIF9iYXNlOwogICAgICAgIH07CgogICAgICAgICQkW3N0b3JlXSA9IGQzLmRpc3BhdGNoLmFwcGx5KF90aGlzLCBldmVudHMpOwoKICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIG1vZGVsOwogIH0KCiAgdmFyIGlzVG91Y2hEZXZpY2UgPSBmdW5jdGlvbiBpc1RvdWNoRGV2aWNlKCkgewogICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7CiAgfTsKCiAgZnVuY3Rpb24gdG9vbHRpcCAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgdG9vbHRpcCA9IGZ1bmN0aW9uIHRvb2x0aXAoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKICAgICAgc2VsZWN0aW9uLm9uKGV2ZW50KCdtb3VzZW92ZXInKSwgbW91c2VvdmVyKS5vbihldmVudCgnbW91c2VvdXQnKSwgbW91c2VvdXQpOwoKICAgICAgaWYgKGlzVG91Y2hEZXZpY2UoKSkgewogICAgICAgIHNlbGVjdGlvbi5vbihldmVudCgnY2xpY2snKSwgbW91c2VvdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbGVjdGlvbi5vbihldmVudCgnbW91c2Vtb3ZlJyksIG1vdXNlbW92ZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0b29sdGlwOwogICAgfTsKCiAgICB2YXIgZ2V0Q29vcmRzID0gZnVuY3Rpb24gZ2V0Q29vcmRzKGQsIGkpIHsKICAgICAgdmFyIGJveCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciBjb29yZHMgPSB7fTsKCiAgICAgIC8vIGNvbnN0cnVjdCBhdCBvYmplY3QsIGlmIG51bGwgYXV0b21hdGljYWxseSBzZXQgaXQgYmFzZWQgb24gY3Vyc29yIGV2ZW50IHBvc2l0aW9uCiAgICAgIHZhciBhdCA9ICgkJC5hdC5jYWxsKHRoaXMsIGQsIGkpIHx8IChkMy5ldmVudC5jbGllbnRYID4gd2luZG93LmlubmVyV2lkdGggLyAyID8gJ2NlbnRlciBsZWZ0JyA6ICdjZW50ZXIgcmlnaHQnKSkuc3BsaXQoJyAnKTsKICAgICAgYXQgPSB7IHg6IGF0WzFdLCB5OiBhdFswXSB9OwoKICAgICAgLy8gc3dpdGNoIGZvciBob3Jpem9udGFsIGNvb3JkaW5hdGUKICAgICAgc3dpdGNoIChhdC54KSB7CiAgICAgICAgY2FzZSAnbGVmdCc6CiAgICAgICAgICBjb29yZHMueCA9IGJveC5sZWZ0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2VudGVyJzoKICAgICAgICAgIGNvb3Jkcy54ID0gYm94LmxlZnQgKyBib3gud2lkdGggLyAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIC8vIHJpZ2h0CiAgICAgICAgICBjb29yZHMueCA9IGJveC5sZWZ0ICsgYm94LndpZHRoOwogICAgICB9CgogICAgICAvLyBzd2l0Y2ggZm9yIHZlcnRpY2FsIGNvb3JkaW5hdGUKICAgICAgc3dpdGNoIChhdC55KSB7CiAgICAgICAgY2FzZSAnYm90dG9tJzoKICAgICAgICAgIGNvb3Jkcy55ID0gYm94LnRvcCArIGJveC5oZWlnaHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdjZW50ZXInOgogICAgICAgICAgY29vcmRzLnkgPSBib3gudG9wICsgYm94LmhlaWdodCAvIDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgLy8gdG9wCiAgICAgICAgICBjb29yZHMueSA9IGJveC50b3A7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvb3JkczsKICAgIH07CgogICAgdmFyIG1vdXNlb3ZlciA9IGZ1bmN0aW9uIG1vdXNlb3ZlcihkLCBpKSB7CiAgICAgIHZhciB0b29sdGlwVXBkYXRlID0gJCQuY29udGFpbmVyLnNlbGVjdEFsbCgnLmQyYi10b29sdGlwJykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBbZF07CiAgICAgIH0pOwoKICAgICAgdmFyIG5ld1Rvb2x0aXAgPSB0b29sdGlwVXBkYXRlLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5zdHlsZSgnb3BhY2l0eScsIDApLmF0dHIoJ2NsYXNzJywgJ2QyYi10b29sdGlwJyk7CgogICAgICBuZXdUb29sdGlwLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLXRvb2x0aXAtY29udGVudCcpOwoKICAgICAgdG9vbHRpcFVwZGF0ZSA9IHRvb2x0aXBVcGRhdGUubWVyZ2UobmV3VG9vbHRpcCk7CgogICAgICB0b29sdGlwVXBkYXRlLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxMDApLnN0eWxlKCdvcGFjaXR5JywgMSk7CgogICAgICAkJC5kaXNwYXRjaC5jYWxsKCdpbnNlcnQnLCB0b29sdGlwVXBkYXRlLCB0aGlzLCBkLCBpKTsKCiAgICAgIG1vdXNlbW92ZS5jYWxsKHRoaXMsIGQsIGkpOwogICAgfTsKCiAgICB2YXIgbW91c2Vtb3ZlID0gZnVuY3Rpb24gbW91c2Vtb3ZlKGQsIGkpIHsKICAgICAgdmFyIGh0bWwgPSAkJC5odG1sLmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICB0YXJnZXQgPSAkJC50YXJnZXQuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICAgIGNvbG9yID0gJCQuY29sb3IuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICAgIHRhcmdldE5vZGUgPSB0YXJnZXQgPyB0YXJnZXQubm9kZSgpIDogdGhpcywKICAgICAgICAgIGNvb3JkcyA9ICQkLmZvbGxvd01vdXNlLmNhbGwodGhpcywgZCwgaSkgPyB7IHg6IGQzLmV2ZW50LmNsaWVudFgsIHk6IGQzLmV2ZW50LmNsaWVudFkgfSA6IGdldENvb3Jkcy5jYWxsKHRhcmdldE5vZGUsIGQsIGkpOwoKICAgICAgLy8gaWYgKCEkJC5jb250YWluZXIuc2VsZWN0QWxsKCcuZDJiLXRvb2x0aXAnKS5zaXplKCkpIHJldHVybiBtb3VzZW92ZXIoZCwgaSk7CgogICAgICB2YXIgdG9vbHRpcFVwZGF0ZSA9ICQkLmNvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItdG9vbHRpcCcpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIHZhciBteSA9ICQkLm15LmNhbGwodGhpcywgZCwgaSkgfHwgKGQzLmV2ZW50LmNsaWVudFggPiB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgPyAnbGVmdCcgOiAncmlnaHQnKTsKCiAgICAgIHRvb2x0aXBVcGRhdGUuYXR0cignY2xhc3MnLCAnZDJiLXRvb2x0aXAgZDJiLXRvb2x0aXAtJyArIG15KS5zdHlsZSgndG9wJywgY29vcmRzLnkgKyAncHgnKS5zdHlsZSgnbGVmdCcsIGNvb3Jkcy54ICsgJ3B4Jykuc3R5bGUoJ2JvcmRlci1jb2xvcicsIGNvbG9yKS5zZWxlY3QoJy5kMmItdG9vbHRpcC1jb250ZW50JykuaHRtbChodG1sKTsKCiAgICAgICQkLmRpc3BhdGNoLmNhbGwoJ21vdmUnLCB0b29sdGlwVXBkYXRlLCB0aGlzLCBkLCBpKTsKICAgIH07CgogICAgdmFyIG1vdXNlb3V0ID0gZnVuY3Rpb24gbW91c2VvdXQoZCwgaSkgewogICAgICB2YXIgdG9vbHRpcFVwZGF0ZSA9ICQkLmNvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItdG9vbHRpcCcpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIHRvb2x0aXBVcGRhdGUudHJhbnNpdGlvbigpLmR1cmF0aW9uKDEwMCkuc3R5bGUoJ29wYWNpdHknLCAwKS5yZW1vdmUoKTsKCiAgICAgICQkLmRpc3BhdGNoLmNhbGwoJ3JlbW92ZScsIHRvb2x0aXBVcGRhdGUsIHRoaXMsIGQsIGkpOwogICAgfTsKCiAgICB2YXIgZXZlbnQgPSBmdW5jdGlvbiBldmVudChsaXN0ZW5lcikgewogICAgICByZXR1cm4gbGlzdGVuZXIgKyAnLmQyYi10b29sdGlwJzsKICAgIH07CgogICAgLyogSW5oZXJpdCBmcm9tIGJhc2UgbW9kZWwgKi8KICAgIGJhc2UodG9vbHRpcCwgJCQpLmFkZFByb3AoJ2NvbnRhaW5lcicsIGQzLnNlbGVjdCgnYm9keScpKSAvLywgbnVsbCwgdXBkYXRlQ29udGFpbmVyKQogICAgLmFkZE1ldGhvZCgnY2xlYXInLCBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICAoY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCkub24oZXZlbnQoJ21vdXNlb3ZlcicpLCBudWxsKS5vbihldmVudCgnbW91c2VvdXQnKSwgbnVsbCkub24oZXZlbnQoJ21vdXNlbW92ZScpLCBudWxsKTsKCiAgICAgIHJldHVybiB0b29sdGlwOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2ZvbGxvd01vdXNlJywgZmFsc2UpLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdteScsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdhdCcsIG51bGwpLmFkZFByb3BGdW5jdG9yKCd0YXJnZXQnLCBudWxsKS5hZGRQcm9wRnVuY3RvcignaHRtbCcsIG51bGwpLmFkZERpc3BhdGNoZXIoWydpbnNlcnQnLCAnbW92ZScsICdyZW1vdmUnXSk7CgogICAgcmV0dXJuIHRvb2x0aXA7CiAgfQoKICBmdW5jdGlvbiB0b29sdGlwQXhpcyAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgdG9vbHRpcCA9IHt9OwoKICAgIC8vIFBvc2l0aW9uIG1hcmtlcnMgcmVsYXRpdmUgdG8gc2VsZWN0ZWQgcG9pbnRzIGFuZCBheGVzCiAgICB2YXIgcG9zaXRpb25NYXJrZXIgPSBmdW5jdGlvbiBwb3NpdGlvbk1hcmtlcihtYXJrZXIsIGluZm8sIHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT09ICd5JykgewogICAgICAgIGlmIChpbmZvLnkgPT09IEluZmluaXR5KSByZXR1cm4gbWFya2VyLnN0eWxlKCdvcGFjaXR5JywgMCk7CiAgICAgICAgbWFya2VyLnN0eWxlKCdvcGFjaXR5JywgMSkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCAnICsgaW5mby55ICsgJyknKS5hdHRyKCd5MScsIDApLmF0dHIoJ3kyJywgMCkuYXR0cigneDEnLCAwKS5hdHRyKCd4MicsICQkLnNpemUud2lkdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpbmZvLnggPT09IEluZmluaXR5KSByZXR1cm4gbWFya2VyLnN0eWxlKCdvcGFjaXR5JywgMCk7CiAgICAgICAgbWFya2VyLnN0eWxlKCdvcGFjaXR5JywgMSkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgaW5mby54ICsgJywgMCknKS5hdHRyKCd4MScsIDApLmF0dHIoJ3gyJywgMCkuYXR0cigneTEnLCAwKS5hdHRyKCd5MicsICQkLnNpemUuaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICAvLyBQb3NpdGlvbiB0b29sdGlwIHJlbGF0aXZlIHRvIHNlbGVjdGVkIHBvaW50cyBhbmQgYXhlcwogICAgdmFyIHBvc2l0aW9uVG9vbHRpcCA9IGZ1bmN0aW9uIHBvc2l0aW9uVG9vbHRpcCh0b29sdGlwLCBpbmZvLCBiYXNlKSB7CiAgICAgIHZhciBub2RlID0gdG9vbHRpcC5ub2RlKCk7CiAgICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgICB2YXIgdG9vbHRpcEJveCA9IHRvb2x0aXAubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB2YXIgeCA9IGJhc2UueCwKICAgICAgICAgIHkgPSBiYXNlLnksCiAgICAgICAgICBwYWQgPSAxMDsKCiAgICAgIGlmICgkJC50cmFja1kpIHsKICAgICAgICBpZiAoaW5mby55ID4gJCQuc2l6ZS5oZWlnaHQgLyAyKSB7CiAgICAgICAgICB5ICs9IGluZm8ueSAtIHBhZCAtIHRvb2x0aXBCb3guaGVpZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB5ICs9IGluZm8ueSArIHBhZDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LmNsaWVudFkgLSBiYXNlLnkgPiAkJC5zaXplLmhlaWdodCAvIDIpIHsKICAgICAgICAgIHkgPSBkMy5ldmVudC5jbGllbnRZIC0gcGFkIC0gdG9vbHRpcEJveC5oZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHkgPSBkMy5ldmVudC5jbGllbnRZICsgcGFkOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCQkLnRyYWNrWCkgewogICAgICAgIGlmIChpbmZvLnggPiAkJC5zaXplLndpZHRoIC8gMikgewogICAgICAgICAgeCArPSBpbmZvLnggLSBwYWQgLSB0b29sdGlwQm94LndpZHRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB4ICs9IGluZm8ueCArIHBhZDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGQzLmV2ZW50LmNsaWVudFggLSBiYXNlLnggPiAkJC5zaXplLndpZHRoIC8gMikgewogICAgICAgICAgeCA9IGQzLmV2ZW50LmNsaWVudFggLSBwYWQgLSB0b29sdGlwQm94LndpZHRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB4ID0gZDMuZXZlbnQuY2xpZW50WCArIHBhZDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHggKz0gd2luZG93LnBhZ2VYT2Zmc2V0OwogICAgICB5ICs9IHdpbmRvdy5wYWdlWU9mZnNldDsKCiAgICAgIHRvb2x0aXAuc3R5bGUoJ2xlZnQnLCB4ICsgJ3B4Jykuc3R5bGUoJ3RvcCcsIHkgKyAncHgnKTsKICAgIH07CgogICAgLy8gUG9wdWxhdGUgdG9vbHRpcCB3aXRoIHBvaW50IHJvd3MKICAgIHZhciBwb3B1bGF0ZVRvb2x0aXAgPSBmdW5jdGlvbiBwb3B1bGF0ZVRvb2x0aXAodG9vbHRpcCwgaW5mbykgewogICAgICB2YXIgdGl0bGUgPSAkJC50aXRsZShpbmZvLnBvaW50cy5tYXAoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5kYXRhOwogICAgICB9KSk7CgogICAgICB0b29sdGlwLnNlbGVjdCgnLmQyYi10b29sdGlwLXRpdGxlJykuc3R5bGUoJ2Rpc3BsYXknLCB0aXRsZSA/ICdibG9jaycgOiAnbm9uZScpLmh0bWwodGl0bGUpOwoKICAgICAgdmFyIGNvbnRlbnQgPSB0b29sdGlwLnNlbGVjdCgnLmQyYi10b29sdGlwLWNvbnRlbnQnKTsKCiAgICAgIHZhciByb3cgPSBjb250ZW50LnNlbGVjdEFsbCgnLmQyYi10b29sdGlwLXJvdycpLmRhdGEoaW5mby5wb2ludHMpOwogICAgICB2YXIgcm93RW50ZXIgPSByb3cuZW50ZXIoKS5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi10b29sdGlwLXJvdycpOwoKICAgICAgcm93LmV4aXQoKS5yZW1vdmUoKTsKCiAgICAgIHJvdyA9IHJvdy5tZXJnZShyb3dFbnRlcikuaHRtbChmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLnJvdzsKICAgICAgfSkuc3R5bGUoJ2JvcmRlci1sZWZ0LWNvbG9yJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5jb2xvciB8fCAndHJhbnNwYXJlbnQnOwogICAgICB9KTsKICAgIH07CgogICAgLy8gRmluZHMgdGhlIHgsIHkgY29vcmRpbmF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb2ludHMgJ2Nsb3Nlc3QnIHRvIHRoZSBjdXJzb3IuCiAgICAvLyBBbHNvIHJldHVybnMgdGhlIHNldCBvZiBwb2ludHMgdGhhdCBtZWV0IHRoZSAnY2xvc2VzdCcgY29uZmlndXJhdGlvbi4KICAgIHZhciBmaW5kUG9pbnRJbmZvID0gZnVuY3Rpb24gZmluZFBvaW50SW5mbyhiYXNlKSB7CiAgICAgIHZhciBjdXJzb3IgPSB7IHg6IGQzLmV2ZW50LmNsaWVudFggLSBiYXNlLngsIHk6IGQzLmV2ZW50LmNsaWVudFkgLSBiYXNlLnkgfTsKICAgICAgdmFyIHggPSBJbmZpbml0eSwKICAgICAgICAgIHkgPSBJbmZpbml0eSwKICAgICAgICAgIHBvaW50cyA9IFtdOwogICAgICBmb3IgKHZhciBncm91cE5hbWUgaW4gZ3JvdXBzKSB7CiAgICAgICAgaWYgKCFncm91cHMuaGFzT3duUHJvcGVydHkoZ3JvdXBOYW1lKSkgY29udGludWU7CiAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzW2dyb3VwTmFtZV07CgogICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGdyYXBoTmFtZSkgewogICAgICAgICAgaWYgKCFncm91cC5oYXNPd25Qcm9wZXJ0eShncmFwaE5hbWUpKSByZXR1cm4gJ2NvbnRpbnVlJzsKICAgICAgICAgIHZhciBncmFwaCA9IGdyb3VwW2dyYXBoTmFtZV07CiAgICAgICAgICB2YXIgbmV3UG9pbnRzID0gW107CiAgICAgICAgICBncmFwaC5jb25maWcuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgIGRhdGE6IGQsCiAgICAgICAgICAgICAgeDogb3JlcShncmFwaC5jb25maWcueChkLCBpKSwgJCQueChkLCBpKSksCiAgICAgICAgICAgICAgeTogb3JlcShncmFwaC5jb25maWcueShkLCBpKSwgJCQueShkLCBpKSksCiAgICAgICAgICAgICAgY29sb3I6IG9yZXEoZ3JhcGguY29uZmlnLmNvbG9yKGQsIGkpLCAkJC5jb2xvcihkLCBpKSksCiAgICAgICAgICAgICAgcm93OiBvcmVxKGdyYXBoLmNvbmZpZy5yb3coZCwgaSksICQkLnJvdyhkLCBpKSkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICgkJC50cmFja1ggJiYgJCQudHJhY2tZKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0ueCA9PT0geCAmJiBpdGVtLnkgPT09IHkpIHJldHVybiBuZXdQb2ludHMucHVzaChpdGVtKTsKCiAgICAgICAgICAgICAgdmFyIG9kID0gTWF0aC5zcXJ0KE1hdGgucG93KHggLSBjdXJzb3IueCwgMikgKyBNYXRoLnBvdyh5IC0gY3Vyc29yLnksIDIpKTsKICAgICAgICAgICAgICB2YXIgbmQgPSBNYXRoLnNxcnQoTWF0aC5wb3coaXRlbS54IC0gY3Vyc29yLngsIDIpICsgTWF0aC5wb3coaXRlbS55IC0gY3Vyc29yLnksIDIpKTsKCiAgICAgICAgICAgICAgaWYgKG5kIDwgb2QgJiYgbmQgPCAkJC50aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgIHggPSBpdGVtLng7CiAgICAgICAgICAgICAgICB5ID0gaXRlbS55OwogICAgICAgICAgICAgICAgcG9pbnRzID0gW107CiAgICAgICAgICAgICAgICBuZXdQb2ludHMgPSBbaXRlbV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCQkLnRyYWNrWCkgewogICAgICAgICAgICAgIGlmIChpdGVtLnggPT09IHgpIHJldHVybiBuZXdQb2ludHMucHVzaChpdGVtKTsKCiAgICAgICAgICAgICAgdmFyIF9vZCA9IE1hdGguYWJzKHggLSBjdXJzb3IueCk7CiAgICAgICAgICAgICAgdmFyIF9uZCA9IE1hdGguYWJzKGl0ZW0ueCAtIGN1cnNvci54KTsKCiAgICAgICAgICAgICAgaWYgKF9uZCA8IF9vZCAmJiBfbmQgPCAkJC50aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgIHggPSBpdGVtLng7CiAgICAgICAgICAgICAgICBwb2ludHMgPSBbXTsKICAgICAgICAgICAgICAgIG5ld1BvaW50cyA9IFtpdGVtXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJCQudHJhY2tZKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0ueSA9PT0geSkgcmV0dXJuIG5ld1BvaW50cy5wdXNoKGl0ZW0pOwoKICAgICAgICAgICAgICB2YXIgX29kMiA9IE1hdGguYWJzKHkgLSBjdXJzb3IueSk7CiAgICAgICAgICAgICAgdmFyIF9uZDIgPSBNYXRoLmFicyhpdGVtLnkgLSBjdXJzb3IueSk7CgogICAgICAgICAgICAgIGlmIChfbmQyIDwgX29kMiAmJiBfbmQyIDwgJCQudGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICB5ID0gaXRlbS55OwogICAgICAgICAgICAgICAgcG9pbnRzID0gW107CiAgICAgICAgICAgICAgICBuZXdQb2ludHMgPSBbaXRlbV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBwb2ludHMgPSBwb2ludHMuY29uY2F0KG5ld1BvaW50cyk7CiAgICAgICAgfTsKCiAgICAgICAgZm9yICh2YXIgZ3JhcGhOYW1lIGluIGdyb3VwKSB7CiAgICAgICAgICB2YXIgX3JldCA9IF9sb29wKGdyYXBoTmFtZSk7CgogICAgICAgICAgaWYgKF9yZXQgPT09ICdjb250aW51ZScpIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcG9pbnRzID0gcG9pbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gZDMuYXNjZW5kaW5nKGEueCwgYi54KSB8fCBkMy5hc2NlbmRpbmcoYS55LCBiLnkpOwogICAgICB9KTsKCiAgICAgIHJldHVybiB7IHg6IHgsIHk6IHksIHBvaW50czogcG9pbnRzIH07CiAgICB9OwoKICAgIC8vIEV4aXQgdG9vbHRpcCBlbGVtZW50LgogICAgdmFyIGV4aXRFbGVtZW50ID0gZnVuY3Rpb24gZXhpdEVsZW1lbnQoZWwpIHsKICAgICAgZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwKS5zdHlsZSgnb3BhY2l0eScsIDApLnJlbW92ZSgpOwogICAgfTsKCiAgICAvLyBFbnRlciB0b29sdGlwIGVsZW1lbnQuCiAgICB2YXIgZW50ZXJFbGVtZW50ID0gZnVuY3Rpb24gZW50ZXJFbGVtZW50KGVsKSB7CiAgICAgIGVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MCkuc3R5bGUoJ29wYWNpdHknLCAxKTsKICAgIH07CgogICAgLy8gRW50ZXIgdG9vbHRpcCBjb21wb25lbnRzLgogICAgdmFyIGVudGVyID0gZnVuY3Rpb24gZW50ZXIoZCwgaSkgewogICAgICB2YXIgbWFya2VyWCA9ICQkLnN2Z0NvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItdG9vbHRpcC1tYXJrZXIteCcpLmRhdGEoJCQudHJhY2tYID8gW3Rvb2x0aXBdIDogW10pOwogICAgICB2YXIgbWFya2VyWEVudGVyID0gbWFya2VyWC5lbnRlcigpLmFwcGVuZCgnbGluZScpLmF0dHIoJ2NsYXNzJywgJ2QyYi10b29sdGlwLW1hcmtlci14IGQyYi10b29sdGlwLW1hcmtlcicpOwoKICAgICAgdmFyIG1hcmtlclkgPSAkJC5zdmdDb250YWluZXIuc2VsZWN0QWxsKCcuZDJiLXRvb2x0aXAtbWFya2VyLXknKS5kYXRhKCQkLnRyYWNrWSA/IFt0b29sdGlwXSA6IFtdKTsKICAgICAgdmFyIG1hcmtlcllFbnRlciA9IG1hcmtlclkuZW50ZXIoKS5hcHBlbmQoJ2xpbmUnKS5hdHRyKCdjbGFzcycsICdkMmItdG9vbHRpcC1tYXJrZXIteSBkMmItdG9vbHRpcC1tYXJrZXInKTsKCiAgICAgIHZhciB0b29sdGlwRWwgPSAkJC5odG1sQ29udGFpbmVyLnNlbGVjdEFsbCgnLmQyYi10b29sdGlwJykuZGF0YShbdG9vbHRpcF0pOwoKICAgICAgdmFyIHRvb2x0aXBFbnRlciA9IHRvb2x0aXBFbC5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLXRvb2x0aXAgZDJiLXRvb2x0aXAtYXhpcycpOwoKICAgICAgdG9vbHRpcEVudGVyLm1lcmdlKHRvb2x0aXBFbCkuY2FsbChlbnRlckVsZW1lbnQpOwogICAgICBtYXJrZXJZLm1lcmdlKG1hcmtlcllFbnRlcikuY2FsbChlbnRlckVsZW1lbnQpOwogICAgICBtYXJrZXJYLm1lcmdlKG1hcmtlclhFbnRlcikuY2FsbChlbnRlckVsZW1lbnQpOwoKICAgICAgdG9vbHRpcEVudGVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLXRvb2x0aXAtdGl0bGUnKTsKICAgICAgdG9vbHRpcEVudGVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLXRvb2x0aXAtY29udGVudCcpOwoKICAgICAgJCQuZGlzcGF0Y2guY2FsbCgnaW5zZXJ0JywgJCQudG9vbHRpcCwgZCwgaSk7CiAgICB9OwoKICAgIC8vIEV4aXQgdG9vbHRpcCBjb21wb25lbnRzLgogICAgdmFyIGV4aXQgPSBmdW5jdGlvbiBleGl0KCkgewogICAgICAkJC5zdmdDb250YWluZXIuc2VsZWN0QWxsKCcuZDJiLXRvb2x0aXAtbWFya2VyLXgnKS5kYXRhKFtdKS5leGl0KCkuY2FsbChleGl0RWxlbWVudCk7CiAgICAgICQkLnN2Z0NvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItdG9vbHRpcC1tYXJrZXIteScpLmRhdGEoW10pLmV4aXQoKS5jYWxsKGV4aXRFbGVtZW50KTsKICAgICAgJCQuaHRtbENvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItdG9vbHRpcCcpLmRhdGEoW10pLmV4aXQoKS5jYWxsKGV4aXRFbGVtZW50KTsKICAgIH07CgogICAgLy8gVHJhY2tlciBtb3VzZW1vdmUgZXZlbnQuCiAgICB2YXIgbW91c2Vtb3ZlID0gZnVuY3Rpb24gbW91c2Vtb3ZlKGQsIGkpIHsKICAgICAgdmFyIGJhc2UgPSAkJC5zdmdDb250YWluZXIuc2VsZWN0QWxsKCcuZDJiLXRvb2x0aXAtYmFzZScpLmRhdGEoW2RdKTsKICAgICAgYmFzZSA9IGJhc2UubWVyZ2UoYmFzZS5lbnRlcigpLmFwcGVuZCgncmVjdCcpLmF0dHIoJ2NsYXNzJywgJ2QyYi10b29sdGlwLWJhc2UnKSk7CiAgICAgIHZhciBiYXNlQm94ID0gYmFzZS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGJhc2VCb3ggPSB7IHg6IGJhc2VCb3gubGVmdCwgeTogYmFzZUJveC50b3AgfTsKCiAgICAgIHZhciBwb2ludEluZm8gPSBmaW5kUG9pbnRJbmZvKGJhc2VCb3gpOwoKICAgICAgaWYgKHBvaW50SW5mby5wb2ludHMubGVuZ3RoKSBlbnRlcigpO2Vsc2UgcmV0dXJuIGV4aXQoKTsKCiAgICAgICQkLnN2Z0NvbnRhaW5lci5zZWxlY3QoJy5kMmItdG9vbHRpcC1tYXJrZXIteCcpLmNhbGwocG9zaXRpb25NYXJrZXIsIHBvaW50SW5mbywgJ3gnKTsKCiAgICAgICQkLnN2Z0NvbnRhaW5lci5zZWxlY3QoJy5kMmItdG9vbHRpcC1tYXJrZXIteScpLmNhbGwocG9zaXRpb25NYXJrZXIsIHBvaW50SW5mbywgJ3knKTsKCiAgICAgICQkLmh0bWxDb250YWluZXIuc2VsZWN0KCcuZDJiLXRvb2x0aXAnKS5jYWxsKHBvcHVsYXRlVG9vbHRpcCwgcG9pbnRJbmZvKS5jYWxsKHBvc2l0aW9uVG9vbHRpcCwgcG9pbnRJbmZvLCBiYXNlQm94KTsKCiAgICAgICQkLmRpc3BhdGNoLmNhbGwoJ21vdmUnLCAkJC50b29sdGlwLCBkLCBpKTsKICAgIH07CgogICAgLy8gVHJhY2tlciBtb3VzZW91dCBldmVudC4KICAgIHZhciBtb3VzZW91dCA9IGZ1bmN0aW9uIG1vdXNlb3V0KGQsIGkpIHsKICAgICAgZXhpdCgpOwoKICAgICAgJCQuZGlzcGF0Y2guY2FsbCgncmVtb3ZlJywgJCQudG9vbHRpcCwgZCwgaSk7CiAgICB9OwoKICAgIC8vIEV2ZW50IGtleSBidWlsZGVyLgogICAgdmFyIGV2ZW50ID0gZnVuY3Rpb24gZXZlbnQobGlzdGVuZXIpIHsKICAgICAgcmV0dXJuIGxpc3RlbmVyICsgJy5kMmItdG9vbHRpcC1heGlzJzsKICAgIH07CgogICAgLy8gdXBkYXRlIG1vdXNlIGV2ZW50IHRyYWNrZXIKICAgIHZhciB1cGRhdGVUcmFja2VyID0gZnVuY3Rpb24gdXBkYXRlVHJhY2tlcihuLCBvKSB7CiAgICAgIGlmIChvKSB7CiAgICAgICAgby5vbihldmVudCgnbW91c2VvdXQnKSwgbnVsbCkub24oZXZlbnQoJ21vdXNlbW92ZScpLCBudWxsKTsKICAgICAgfQogICAgICBpZiAobikgewogICAgICAgIG4ub24oZXZlbnQoJ21vdXNlb3V0JyksIG1vdXNlb3V0KS5vbihldmVudCgnbW91c2Vtb3ZlJyksIG1vdXNlbW92ZSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gc2V0dXAgdG9vbHRpcCBtb2RlbAogICAgYmFzZSh0b29sdGlwLCAkJCkuYWRkUHJvcCgnaHRtbENvbnRhaW5lcicsIGQzLnNlbGVjdCgnYm9keScpKS5hZGRQcm9wKCdzdmdDb250YWluZXInLCBudWxsKS5hZGRQcm9wKCd0cmFja2VyJywgZDMuc2VsZWN0KCdib2R5JyksIG51bGwsIHVwZGF0ZVRyYWNrZXIpLmFkZFByb3AoJ3NpemUnLCB7IGhlaWdodDogMCwgd2lkdGg6IDAgfSkuYWRkUHJvcCgndHJhY2tYJywgdHJ1ZSkuYWRkUHJvcCgndHJhY2tZJywgZmFsc2UpLmFkZFByb3AoJ3RocmVzaG9sZCcsIEluZmluaXR5KS5hZGRNZXRob2QoJ2NsZWFyJywgZnVuY3Rpb24gKGdyb3VwTmFtZSwgZ3JhcGhOYW1lKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSBncm91cHMgPSB7fTtlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBkZWxldGUgZ3JvdXBzW2dyb3VwTmFtZV07ZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSBkZWxldGUgZ3JvdXBzW2dyb3VwTmFtZV1bZ3JhcGhOYW1lXTsKCiAgICAgIHJldHVybiB0b29sdGlwOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3RpdGxlJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3gnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC54OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3knLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2NvbG9yJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3JvdycsIG51bGwpLmFkZERpc3BhdGNoZXIoWydtb3ZlJywgJ2luc2VydCcsICdyZW1vdmUnXSk7CgogICAgLy8gY29uc3RydWN0IGFuIGludGVyZmFjZSBmb3IgZWFjaCBncmFwaCB0aGF0IGlzIGluaXRpYWxpemVkCiAgICB2YXIgZ3JvdXBzID0ge307CiAgICB0b29sdGlwLmdyYXBoID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgZ3JvdXBOYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsOwogICAgICB2YXIgZ3JhcGhOYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOwoKICAgICAgdmFyIGdyYXBocyA9IGdyb3Vwc1tncm91cE5hbWVdID0gZ3JvdXBzW2dyb3VwTmFtZV0gfHwge307CiAgICAgIHZhciBncmFwaCA9IGdyYXBoc1tncmFwaE5hbWVdOwoKICAgICAgaWYgKCFncmFwaCkgewogICAgICAgIGdyYXBoID0gZ3JhcGhzW2dyYXBoTmFtZV0gPSB7IGludGVyZmFjZToge30sIGNvbmZpZzoge30gfTsKICAgICAgICB2YXIgZ3JhcGhNb2RlbCA9IGJhc2UoZ3JhcGguaW50ZXJmYWNlLCBncmFwaC5jb25maWcpOwoKICAgICAgICBncmFwaE1vZGVsLmFkZFByb3AoJ2RhdGEnLCBbXSkuYWRkTWV0aG9kKCdjbGVhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGdyYXBoLmNvbmZpZy5kYXRhID0gW107CiAgICAgICAgICByZXR1cm4gZ3JhcGguaW50ZXJmYWNlOwogICAgICAgIH0pLmFkZE1ldGhvZCgnYWRkUG9pbnQnLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgZ3JhcGguY29uZmlnLmRhdGEucHVzaChwKTsKICAgICAgICAgIHJldHVybiBncmFwaC5pbnRlcmZhY2U7CiAgICAgICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3gnLCBudWxsKS5hZGRQcm9wRnVuY3RvcigneScsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdyb3cnLCBudWxsKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGdyYXBoLmludGVyZmFjZTsKICAgIH07CgogICAgcmV0dXJuIHRvb2x0aXA7CiAgfQoKICAvLyBkMmIuc3RhY2sgd2lsbCBzdGFjayB0aGUgeCBhbmQgeSB2YWx1ZXMgaW4gcGxhY2UgZm9yCiAgLy8gc29tZSBkYXR1bSBhbmQgZDMuc3RhY2sgY29uZmlndXJhdGlvbi4KICBmdW5jdGlvbiBzdGFjayAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgc3RhY2sgPSBmdW5jdGlvbiBzdGFjayhkYXR1bSkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgdmFyIG9yaWdpbmFsID0gZGF0dW07CgogICAgICAvLyBmb3Igc2ltcGxpY2l0eSBtYXAgZGF0dW0gdG8ganVzdCBhcnJheSBvZiB2YWx1ZXMgYXJyYXlzCiAgICAgIGRhdHVtID0gZGF0dW0ubWFwKCQkLnZhbHVlcyk7CgogICAgICAvLyBmb3JtYXQgdmFsdWVzIHRvIGJlIGluIHRoZSBmb3JtCiAgICAgIC8vIFsKICAgICAgLy8gICB7eF8xOiB5XzEsIHhfMjogeV8yLCAuLiB9LAogICAgICAvLyAgIHt4XzE6IHlfMSwgeF8yOiB5XzIsIC4uIH0sCiAgICAgIC8vICAgLi4KICAgICAgLy8gXQogICAgICB2YXIgeHNldCA9IFtdOwoKICAgICAgdmFyIHZhbHMgPSBkYXR1bS5tYXAoZnVuY3Rpb24gKGQpIHsKICAgICAgICB2YXIgbm9kZXMgPSB7fTsKICAgICAgICBkLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHZhciB4ID0gJCQueC5jYWxsKF90aGlzLCBkLCBpKTsKICAgICAgICAgIHhzZXQucHVzaCh4KTsKICAgICAgICAgIG5vZGVzW3hdID0gJCQueS5jYWxsKF90aGlzLCBkLCBpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbm9kZXM7CiAgICAgIH0pOwoKICAgICAgLy8gZmluZCB1bmlxdWUgc2V0IG9mIHggdmFsdWVzCiAgICAgIHhzZXQgPSBkMy5zZXQoeHNldCkudmFsdWVzKCk7CgogICAgICAvLyB2YWx1ZSA9PiBpbmRleCBtYXBwaW5nIG9mIHggdmFsdWVzCiAgICAgIHZhciB4bWFwID0geHNldC5yZWR1Y2UoZnVuY3Rpb24gKG8sIHYsIGkpIHsKICAgICAgICBvW3ZdID0gaTsKICAgICAgICByZXR1cm4gbzsKICAgICAgfSwge30pOwoKICAgICAgLy8gZ3JhcGgga2V5cyAoanVzdCB1c2UgaW5kZXgpCiAgICAgIHZhciBrZXlzID0gZDMucmFuZ2UoMCwgZGF0dW0ubGVuZ3RoKTsKCiAgICAgIC8vIHRyYW5zcG9zZSB2YWx1ZXMgZm9yIGQzLnN0YWNrCiAgICAgIHZhciB0dmFscyA9IHhzZXQubWFwKGZ1bmN0aW9uIChjb2wpIHsKICAgICAgICByZXR1cm4gdmFscy5tYXAoZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgcmV0dXJuIHJvd1tjb2xdIHx8IDA7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgLy8gc3RhY2sgdHJhbnNwb3NlZCB2YWx1ZXMKICAgICAgJCQuc3RhY2sua2V5cyhrZXlzKS52YWx1ZShmdW5jdGlvbiAoZCwgaykgewogICAgICAgIHJldHVybiBkW2tdIHx8IDA7CiAgICAgIH0pOwogICAgICB2YXIgc3RhY2tpbmcgPSAkJC5zdGFjayh0dmFscyk7CgogICAgICAvLyByZWFzc29jaWF0ZSB0aGUgc3RhY2tlZCB2YWx1ZXMgd2l0aCB0aGUgb3JpZ2luYWwgZGF0dW0KICAgICAgZGF0dW0uZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIGQuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpbmQpIHsKICAgICAgICAgIHZhciB4ID0gJCQueC5jYWxsKF90aGlzLCB2YWwsIGluZCk7CiAgICAgICAgICB2YXIgeXMgPSBzdGFja2luZ1tpXVt4bWFwW3hdXTsKICAgICAgICAgICQkLm91dC5jYWxsKF90aGlzLCB2YWwsIHlzWzBdLCB5c1sxXSwgeCk7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgfTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShzdGFjaywgJCQpLmFkZFByb3AoJ3N0YWNrJywgZDMuc3RhY2soKSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3gnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC54OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3knLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfSkuYWRkUHJvcCgnb3V0JywgZnVuY3Rpb24gKGQsIHkwLCB5MSkgewogICAgICBkLnkwID0geTA7CiAgICAgIGQueTEgPSB5MTsKICAgIH0pOwoKICAgIHJldHVybiBzdGFjazsKICB9CgogIGZ1bmN0aW9uIGJyZWFkY3J1bWJzICgpIHsKICAgIHZhciAkJCA9IHt9OwoKICAgIHZhciBicmVhZGNydW1icyA9IGZ1bmN0aW9uIGJyZWFkY3J1bWJzKGNvbnRleHQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICB2YXIgYmNzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1icmVhZGNydW1icycpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIHZhciBiY3NFbnRlciA9IGJjcy5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWJyZWFkY3J1bWJzJyk7CgogICAgICBiY3MgPSBiY3MubWVyZ2UoYmNzRW50ZXIpLmNsYXNzZWQoJ2QyYi12ZXJ0aWNhbCcsICQkLnZlcnRpY2FsKTsKCiAgICAgIHZhciBiYyA9IGJjcy5zZWxlY3RBbGwoJy5kMmItYnJlYWRjcnVtYicpLmRhdGEoJCQudmFsdWVzLCAkJC5rZXkpLAogICAgICAgICAgYmNFeGl0ID0gYmMuZXhpdCgpOwoKICAgICAgdmFyIGJjRW50ZXIgPSBiYy5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWJyZWFkY3J1bWInKS5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgYmNFbnRlci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi1icmVhZGNydW1iLWljb24nKTsKICAgICAgYmNFbnRlci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi1icmVhZGNydW1iLWNvbnRlbnQnKTsKCiAgICAgIGJjID0gYmMubWVyZ2UoYmNFbnRlcikub3JkZXIoKTsKCiAgICAgIGJjLnNlbGVjdCgnLmQyYi1icmVhZGNydW1iLWNvbnRlbnQnKS5odG1sKCQkLmh0bWwpOwoKICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgIGJjID0gYmMudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICBiY0V4aXQgPSBiY0V4aXQudHJhbnNpdGlvbihjb250ZXh0KS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICB9CgogICAgICBiYy5zdHlsZSgnYm9yZGVyLWNvbG9yJywgJCQuY29sb3IpLnN0eWxlKCdvcGFjaXR5JywgMSkuc2VsZWN0KCcuZDJiLWJyZWFkY3J1bWItaWNvbicpLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJCQuY29sb3IpOwoKICAgICAgYmNFeGl0LnJlbW92ZSgpOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdicmVhZGNydW1icy11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIGJyZWFkY3J1bWJzOwogICAgfTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShicmVhZGNydW1icywgJCQpLmFkZFByb3BGdW5jdG9yKCd2YWx1ZXMnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdrZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsICdibHVlJykuYWRkUHJvcEZ1bmN0b3IoJ2h0bWwnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5odG1sOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZlcnRpY2FsJywgdHJ1ZSk7CgogICAgcmV0dXJuIGJyZWFkY3J1bWJzOwogIH0KCiAgdmFyIGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApOwoKICBmdW5jdGlvbiBsZWdlbmQgKCkgewogICAgdmFyICQkID0ge307CgogICAgdmFyIHN5bWJvbCA9IGQzLnN5bWJvbCgpLnNpemUoODApOwoKICAgIHZhciBsZWdlbmQgPSBmdW5jdGlvbiBsZWdlbmQoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHZhciBsZWcgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLWxlZ2VuZCcpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIHZhciBsZWdFbnRlciA9IGxlZy5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWxlZ2VuZCcpOwoKICAgICAgbGVnID0gbGVnLm1lcmdlKGxlZ0VudGVyKS5jbGFzc2VkKCdkMmItdmVydGljYWwnLCAkJC52ZXJ0aWNhbCk7CgogICAgICB2YXIgbGVnSXRlbSA9IGxlZy5zZWxlY3RBbGwoJy5kMmItbGVnZW5kLWl0ZW0nKS5kYXRhKCQkLnZhbHVlcywgJCQua2V5KSwKICAgICAgICAgIGxlZ0l0ZW1FeGl0ID0gbGVnSXRlbS5leGl0KCk7CgogICAgICB2YXIgbGVnSXRlbUVudGVyID0gbGVnSXRlbS5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWxlZ2VuZC1pdGVtJykuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICAgIGxlZ0l0ZW1FbnRlci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi1sZWdlbmQtaWNvbicpOwogICAgICBsZWdJdGVtRW50ZXIuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkMmItbGVnZW5kLWNvbnRlbnQnKTsKCiAgICAgIGxlZ0l0ZW0gPSBsZWdJdGVtLm1lcmdlKGxlZ0l0ZW1FbnRlcikub3JkZXIoKTsKCiAgICAgIGxlZ0l0ZW0uc2VsZWN0KCcuZDJiLWxlZ2VuZC1jb250ZW50JykuaHRtbCgkJC5odG1sKTsKCiAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICBsZWdJdGVtID0gbGVnSXRlbS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIGxlZ0l0ZW1FeGl0ID0gbGVnSXRlbUV4aXQudHJhbnNpdGlvbihjb250ZXh0KS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICB9CgogICAgICBsZWdJdGVtLnN0eWxlKCdvcGFjaXR5JywgMSkuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIC8vIGxlZ2VuZCBpdGVtIGN1c3RvbWl6YXRpb24KICAgICAgICB2YXIgaXRlbSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgY29sb3IgPSAkJC5jb2xvcihkLCBpKSwKICAgICAgICAgICAgZW1wdHkgPSAkJC5lbXB0eShkLCBpKTsKCiAgICAgICAgaXRlbS5zdHlsZSgnYm9yZGVyLWNvbG9yJywgY29sb3IpOwoKICAgICAgICAvLyBsZWdlbmQgaWNvbiBjdXN0b21pemF0aW9uCiAgICAgICAgdmFyIGljb24gPSAkJC5pY29uKGQsIGkpLAogICAgICAgICAgICBpY29uRGl2ID0gaXRlbS5zZWxlY3QoJy5kMmItbGVnZW5kLWljb24nKSwKICAgICAgICAgICAgZmEgPSBbXSwKICAgICAgICAgICAgc2hhcGUgPSBbXSwKICAgICAgICAgICAgcmVjdCA9IGljb25EaXYubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgICAgICAgICBzaXplID0geyB3aWR0aDogcmVjdC53aWR0aCwgaGVpZ2h0OiByZWN0LmhlaWdodCB9LAogICAgICAgICAgICBjZW50ZXIgPSB7IHg6IHNpemUud2lkdGggLyAyLCB5OiBzaXplLmhlaWdodCAvIDIgfTsKCiAgICAgICAgaWYgKHR5cGVvZiBpY29uID09PSAnc3RyaW5nJykgZmEucHVzaChpY29uKTtlbHNlIHNoYXBlLnB1c2goaWNvbik7CgogICAgICAgIHZhciBzdmdJY29uID0gaWNvbkRpdi5zZWxlY3RBbGwoJy5kMmItbGVnZW5kLXN2Zy1pY29uJykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHN2Z0ljb25FbnRlciA9IHN2Z0ljb24uZW50ZXIoKS5hcHBlbmQoJ3N2ZycpOwogICAgICAgIHN2Z0ljb25FbnRlci5hdHRyKCdjbGFzcycsICdkMmItbGVnZW5kLXN2Zy1pY29uJykuYXR0cignd2lkdGgnLCBzaXplLndpZHRoKS5hdHRyKCdoZWlnaHQnLCBzaXplLmhlaWdodCk7CgogICAgICAgIHN2Z0ljb24gPSBzdmdJY29uLm1lcmdlKHN2Z0ljb25FbnRlcik7CgogICAgICAgIHZhciBzdmdGYSA9IHN2Z0ljb24uc2VsZWN0QWxsKCd0ZXh0JykuZGF0YShmYSksCiAgICAgICAgICAgIHN2Z0ZhRW50ZXIgPSBzdmdGYS5lbnRlcigpLmFwcGVuZCgndGV4dCcpOwogICAgICAgIHN2Z0ZhLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICBzdmdGYUVudGVyLmFwcGVuZCgndHNwYW4nKTsKICAgICAgICBzdmdGYSA9IHN2Z0ZhLm1lcmdlKHN2Z0ZhRW50ZXIpOwogICAgICAgIHN2Z0ZhLnN0eWxlKCdzdHJva2UnLCBjb2xvcikuc3R5bGUoJ2ZpbGwnLCBlbXB0eSA/ICd3aGl0ZScgOiBjb2xvcikuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgY2VudGVyLnggKyAnLCcgKyBjZW50ZXIueSAqIDEuNjUgKyAnKScpLnNlbGVjdCgndHNwYW4nKS50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZDsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHN2Z1NoYXBlID0gc3ZnSWNvbi5zZWxlY3RBbGwoJ3BhdGgnKS5kYXRhKHNoYXBlKTsKICAgICAgICBzdmdTaGFwZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgc3ZnU2hhcGUgPSBzdmdTaGFwZS5tZXJnZShzdmdTaGFwZS5lbnRlcigpLmFwcGVuZCgncGF0aCcpKTsKICAgICAgICBzdmdTaGFwZS5zdHlsZSgnc3Ryb2tlJywgY29sb3IpLnN0eWxlKCdmaWxsJywgZW1wdHkgPyAnd2hpdGUnIDogY29sb3IpLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIHN5bWJvbC50eXBlKGQpKCk7CiAgICAgICAgfSkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgY2VudGVyLnggKyAnLCcgKyBjZW50ZXIueSArICcpJyk7CiAgICAgIH0pOwoKICAgICAgLy8gYmluZCBldmVudHMKICAgICAgbGVnLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICB2YXIgYWxsb3dFbXB0aWVkID0gJCQuYWxsb3dFbXB0aWVkKGQsIGkpLAogICAgICAgICAgICBpdGVtcyA9IGQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoJy5kMmItbGVnZW5kLWl0ZW0nKSwKICAgICAgICAgICAgc2V0QWxsRW1wdHkgPSBmdW5jdGlvbiBzZXRBbGxFbXB0eShzdGF0ZSkgewogICAgICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoZGQsIGlpKSB7CiAgICAgICAgICAgICQkLnNldEVtcHR5KGRkLCBpaSwgc3RhdGUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICAgICAgYWxsRW1wdHkgPSBmdW5jdGlvbiBhbGxFbXB0eSgpIHsKICAgICAgICAgIHZhciBhbGxFbXB0eSA9IHRydWU7CgogICAgICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoZGQsIGlpKSB7CiAgICAgICAgICAgIGlmICghJCQuZW1wdHkoZGQsIGlpKSkgYWxsRW1wdHkgPSBmYWxzZTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIHJldHVybiBhbGxFbXB0eTsKICAgICAgICB9LAogICAgICAgICAgICBjbGljayA9IGZ1bmN0aW9uIGNsaWNrKGQsIGkpIHsKICAgICAgICAgICQkLnNldEVtcHR5KGQsIGksICEkJC5lbXB0eShkLCBpKSk7CiAgICAgICAgICBpZiAoIWFsbG93RW1wdGllZCAmJiBhbGxFbXB0eSgpKSBzZXRBbGxFbXB0eShmYWxzZSk7CiAgICAgICAgICBzZWxlY3Rpb24uY2FsbChsZWdlbmQpOwogICAgICAgICAgZDMuc2VsZWN0KHRoaXMucGFyZW50Tm9kZSkuZGlzcGF0Y2goJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KTsKICAgICAgICB9LAogICAgICAgICAgICBkYmxjbGljayA9IGZ1bmN0aW9uIGRibGNsaWNrKGQsIGkpIHsKICAgICAgICAgIHNldEFsbEVtcHR5KHRydWUpOwogICAgICAgICAgJCQuc2V0RW1wdHkoZCwgaSwgZmFsc2UpOwogICAgICAgICAgc2VsZWN0aW9uLmNhbGwobGVnZW5kKTsKICAgICAgICAgIGQzLnNlbGVjdCh0aGlzLnBhcmVudE5vZGUpLmRpc3BhdGNoKCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CiAgICAgICAgfTsKCiAgICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgdmFyIGNsaWNrYWJsZSA9ICQkLmNsaWNrYWJsZShkLCBpKSwKICAgICAgICAgICAgICBkYmxjbGlja2FibGUgPSAkJC5kYmxjbGlja2FibGUoZCwgaSk7CgogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLm9uKCdjbGljaycsIGNsaWNrYWJsZSA/IGNsaWNrIDogbnVsbCkub24oJ2RibGNsaWNrJywgZGJsY2xpY2thYmxlID8gZGJsY2xpY2sgOiBudWxsKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ2xlZ2VuZC11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgbGVnSXRlbUV4aXQucmVtb3ZlKCk7CiAgICB9OwoKICAgIC8qIEluaGVyaXQgZnJvbSBiYXNlIG1vZGVsICovCiAgICBiYXNlKGxlZ2VuZCwgJCQpLmFkZFByb3BGdW5jdG9yKCd2YWx1ZXMnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdrZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmh0bWwpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2h0bWwnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5odG1sOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2ljb24nLCAnXHVGMTExJykuYWRkUHJvcEZ1bmN0b3IoJ3ZlcnRpY2FsJywgZmFsc2UpLmFkZFByb3BGdW5jdG9yKCdhbGxvd0VtcHRpZWQnLCBmYWxzZSkuYWRkUHJvcEZ1bmN0b3IoJ2NsaWNrYWJsZScsIGZhbHNlKS5hZGRQcm9wRnVuY3RvcignZGJsY2xpY2thYmxlJywgZmFsc2UpLmFkZFByb3BGdW5jdG9yKCdlbXB0eScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmVtcHR5OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3NldEVtcHR5JywgZnVuY3Rpb24gKGQsIGksIHN0YXRlKSB7CiAgICAgIHJldHVybiBkLmVtcHR5ID0gc3RhdGU7CiAgICB9KTsKCiAgICByZXR1cm4gbGVnZW5kOwogIH0KCiAgZnVuY3Rpb24gY2hhcnRGcmFtZSAoKSB7CgogICAgLy8gUGFkZGluZyBjYW4gZWl0aGVyIGJlIGEgY29uc3RhbnQgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW55IG9mIHRoZQogICAgLy8gYXR0cmlidXRlcyAobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKS4gY2xlYW5QYWRkaW5nIHJldHVybnMgYW4gb2JqZWN0CiAgICAvLyB3aXRoIChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIGF0dHJpYnV0ZXMuCiAgICBmdW5jdGlvbiBjbGVhblBhZGRpbmcocGFkKSB7CiAgICAgIHZhciBwYWRkaW5nID0geyB0b3A6IDAsIGxlZnQ6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAgfTsKICAgICAgaWYgKHR5cGVvZiBwYWQgPT09ICdudW1iZXInKSByZXR1cm4geyB0b3A6IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCBib3R0b206IHBhZCB9OwogICAgICBbJ3RvcCcsICdib3R0bScsICdyaWdodCcsICdsZWZ0J10uZm9yRWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIGlmIChwYWRbZF0pIHBhZGRpbmdbZF0gPT0gcGFkW2RdOwogICAgICB9KTsKICAgICAgcmV0dXJuIHBhZGRpbmc7CiAgICB9CgogICAgLy8gU2l6ZSBjYW4gY29udGFpbiB3aWR0aCBvciBoZWlnaHQgYXR0aWJ1dGVzLiBJZiBlaXRoZXIgYXJlIHVuc2V0IHRoZQogICAgLy8gc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIGJvdW5kaW5nIGNsaWVudCByZWN0YW5nbGUuCiAgICBmdW5jdGlvbiBjbGVhblNpemUocywgYm94KSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IHMgJiYgcy53aWR0aCA+IDAgPyBzLndpZHRoIDogYm94LndpZHRoLAogICAgICAgIGhlaWdodDogcyAmJiBzLmhlaWdodCA+IDAgPyBzLmhlaWdodCA6IGJveC5oZWlnaHQKICAgICAgfTsKICAgIH0KCiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgY2hhcnRGcmFtZSA9IGZ1bmN0aW9uIGNoYXJ0RnJhbWUoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHZhciBmcmFtZSA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy5kMmItY2hhcnQtZnJhbWUnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgfSksCiAgICAgICAgICBmcmFtZUVudGVyID0gZnJhbWUuZW50ZXIoKS5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi1jaGFydC1mcmFtZScpOwoKICAgICAgZnJhbWUgPSBmcmFtZS5tZXJnZShmcmFtZUVudGVyKTsKCiAgICAgIHNlbGVjdGlvbi5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIGZyYW1lID0gZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgnLmQyYi1jaGFydC1mcmFtZScpLAogICAgICAgICAgICBmcmFtZVVwZGF0ZSA9IGZyYW1lLAogICAgICAgICAgICBwYWRkaW5nID0gY2xlYW5QYWRkaW5nKCQkLnBhZGRpbmcoZCkpLAogICAgICAgICAgICBjaGFydFBhZGRpbmcgPSBjbGVhblBhZGRpbmcoJCQuY2hhcnRQYWRkaW5nKGQpKSwKICAgICAgICAgICAgc2l6ZSA9IGNsZWFuU2l6ZSgkJC5zaXplKGQpLCB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTsKCiAgICAgICAgZW50ZXJVcGRhdGUoZnJhbWUsIGZyYW1lVXBkYXRlLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgZC5zdHlsZSgnd2lkdGgnLCBzaXplLndpZHRoICsgJ3B4Jykuc3R5bGUoJ2hlaWdodCcsIHNpemUuaGVpZ2h0ICsgJ3B4Jyk7CiAgICAgICAgfSk7CgogICAgICAgIHNpemUud2lkdGggLT0gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDsKICAgICAgICBzaXplLmhlaWdodCAtPSBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tOwoKICAgICAgICB2YXIgbGVnZW5kRGF0dW0gPSAkJC5sZWdlbmRFbmFibGVkKGQpID8gW2RdIDogW107CgogICAgICAgIHZhciBsZWdlbmQgPSBmcmFtZS5zZWxlY3RBbGwoJy5kMmItbGVnZW5kLWZyYW1lJykuZGF0YShsZWdlbmREYXR1bSksCiAgICAgICAgICAgIGxlZ2VuZEVudGVyID0gbGVnZW5kLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkMmItbGVnZW5kLWZyYW1lJyksCiAgICAgICAgICAgIGxlZ2VuZEV4aXQgPSBsZWdlbmQuZXhpdCgpOwoKICAgICAgICBsZWdlbmRFeGl0LnJlbW92ZSgpOwoKICAgICAgICBsZWdlbmRFbnRlci5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2QyYi1sZWdlbmQtY29udGFpbmVyJyk7CgogICAgICAgIGxlZ2VuZCA9IGxlZ2VuZC5tZXJnZShsZWdlbmRFbnRlcik7CgogICAgICAgIHZhciBsZWdlbmRVcGRhdGUgPSBsZWdlbmQ7CgogICAgICAgIHZhciBicmVhZGNydW1ic0RhdHVtID0gJCQuYnJlYWRjcnVtYnNFbmFibGVkKGQpID8gW2RdIDogW107CgogICAgICAgIHZhciBicmVhZGNydW1icyA9IGZyYW1lLnNlbGVjdEFsbCgnLmQyYi1icmVhZGNydW1icy1mcmFtZScpLmRhdGEoYnJlYWRjcnVtYnNEYXR1bSksCiAgICAgICAgICAgIGJyZWFkY3J1bWJzRW50ZXIgPSBicmVhZGNydW1icy5lbnRlcigpLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWJyZWFkY3J1bWJzLWZyYW1lJyksCiAgICAgICAgICAgIGJyZWFkY3J1bWJzRXhpdCA9IGJyZWFkY3J1bWJzLmV4aXQoKTsKCiAgICAgICAgYnJlYWRjcnVtYnNFeGl0LnJlbW92ZSgpOwoKICAgICAgICBicmVhZGNydW1ic0VudGVyLmFwcGVuZCgnZGl2JykuYXR0cignY2xhc3MnLCAnZDJiLWJyZWFkY3J1bWJzLWNvbnRhaW5lcicpOwoKICAgICAgICBicmVhZGNydW1icyA9IGJyZWFkY3J1bWJzLm1lcmdlKGJyZWFkY3J1bWJzRW50ZXIpOwoKICAgICAgICB2YXIgYnJlYWRjcnVtYnNVcGRhdGUgPSBicmVhZGNydW1iczsKCiAgICAgICAgdmFyIGNoYXJ0ID0gZnJhbWUuc2VsZWN0QWxsKCcuZDJiLWNoYXJ0JykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgICB9KSwKICAgICAgICAgICAgY2hhcnRFbnRlciA9IGNoYXJ0LmVudGVyKCkuYXBwZW5kKCdzdmcnKS5hdHRyKCdjbGFzcycsICdkMmItY2hhcnQnKTsKCiAgICAgICAgY2hhcnRFbnRlci5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItY2hhcnQtY29udGFpbmVyJyk7CgogICAgICAgIGNoYXJ0ID0gY2hhcnQubWVyZ2UoY2hhcnRFbnRlcik7CgogICAgICAgIHZhciBjaGFydFVwZGF0ZSA9IGNoYXJ0OwoKICAgICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgICBmcmFtZVVwZGF0ZSA9IGZyYW1lVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBsZWdlbmRVcGRhdGUgPSBsZWdlbmRVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIGJyZWFkY3J1bWJzVXBkYXRlID0gYnJlYWRjcnVtYnNVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIGNoYXJ0VXBkYXRlID0gY2hhcnRVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIHBsYWNlQ29tcG9uZW50KGJyZWFkY3J1bWJzLCBicmVhZGNydW1ic0VudGVyLCBicmVhZGNydW1ic1VwZGF0ZSwgJCQuYnJlYWRjcnVtYnNPcmllbnQoZCksIHBhZGRpbmcsIHNpemUpOwogICAgICAgIHBsYWNlQ29tcG9uZW50KGxlZ2VuZCwgbGVnZW5kRW50ZXIsIGxlZ2VuZFVwZGF0ZSwgJCQubGVnZW5kT3JpZW50KGQpLCBwYWRkaW5nLCBzaXplKTsKCiAgICAgICAgZW50ZXJVcGRhdGUoY2hhcnRFbnRlciwgY2hhcnRVcGRhdGUsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICBkLnN0eWxlKCdsZWZ0JywgcGFkZGluZy5sZWZ0ICsgJ3B4Jykuc3R5bGUoJ3RvcCcsIHBhZGRpbmcudG9wICsgJ3B4Jykuc3R5bGUoJ3dpZHRoJywgc2l6ZS53aWR0aCArICdweCcpLnN0eWxlKCdoZWlnaHQnLCBzaXplLmhlaWdodCArICdweCcpOwoKICAgICAgICAgIGQuc2VsZWN0KCcuZDJiLWNoYXJ0LWNvbnRhaW5lcicpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIFtjaGFydFBhZGRpbmcubGVmdCwgY2hhcnRQYWRkaW5nLnRvcF0gKyAnKScpOwogICAgICAgIH0pOwoKICAgICAgICBzaXplLndpZHRoIC09IGNoYXJ0UGFkZGluZy5sZWZ0ICsgY2hhcnRQYWRkaW5nLnJpZ2h0OwogICAgICAgIHNpemUuaGVpZ2h0IC09IGNoYXJ0UGFkZGluZy50b3AgKyBjaGFydFBhZGRpbmcuYm90dG9tOwoKICAgICAgICAvLyBTdG9yZSB0aGUgY2hhcnQgc2l6ZSBvbiB0aGUgbm9kZSBzbyB0aGF0IHRoZSBjaGFydCBpdHNlbGYgY2FuIGdldCB0aGUKICAgICAgICAvLyB0cnVlIHNpemUgaW5zdGVhZCBvZiB0aGUgdHJhbnNpdGlvbmluZyBzaXplLgogICAgICAgIGNoYXJ0LnNlbGVjdCgnLmQyYi1jaGFydC1jb250YWluZXInKS5ub2RlKCkuX19zaXplX18gPSBzaXplOwogICAgICB9KTsKCiAgICAgIHNlbGVjdGlvbi5kaXNwYXRjaCgnY2hhcnQtZnJhbWUtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBjaGFydEZyYW1lOwogICAgfTsKCiAgICBmdW5jdGlvbiBlbnRlclVwZGF0ZShlbnRlciwgdXBkYXRlLCBmbikgewogICAgICBmbihlbnRlcik7CiAgICAgIGZuKHVwZGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGxhY2VDb21wb25lbnQoZWwsIGVudGVyLCB1cGRhdGUsIG9yaWVudCwgcGFkZGluZywgc2l6ZSkgewogICAgICB2YXIgbm9kZSA9IGVsLm5vZGUoKTsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB1cGRhdGUuc3R5bGUoJ3RvcCcsICcnKS5zdHlsZSgnbGVmdCcsICcnKS5zdHlsZSgncmlnaHQnLCAnJykuc3R5bGUoJ2JvdHRvbScsICcnKS5zdHlsZSgnd2lkdGgnLCAnJykuc3R5bGUoJ2hlaWdodCcsICcnKTsKCiAgICAgICAgdmFyIGJveCA9IHZvaWQgMDsKCiAgICAgICAgaWYgKG9yaWVudCA9PT0gJ3JpZ2h0JyB8fCBvcmllbnQgPT09ICdsZWZ0JykgewogICAgICAgICAgZWwuY2xhc3NlZCgnZDJiLXZlcnRpY2FsJywgdHJ1ZSk7CiAgICAgICAgICBib3ggPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKICAgICAgICAgIGVudGVyVXBkYXRlKGVudGVyLCB1cGRhdGUsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGQuc3R5bGUob3JpZW50LCBwYWRkaW5nW29yaWVudF0gKyAncHgnKS5zdHlsZSgndG9wJywgcGFkZGluZy50b3AgKyAncHgnKS5zdHlsZSgnaGVpZ2h0Jywgc2l6ZS5oZWlnaHQgKyAncHgnKTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIHBhZGRpbmdbb3JpZW50XSArPSBib3gud2lkdGg7CiAgICAgICAgICBzaXplLndpZHRoIC09IGJveC53aWR0aDsKICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA9PT0gJ3RvcCcgfHwgb3JpZW50ID09PSAnYm90dG9tJykgewogICAgICAgICAgZWwuY2xhc3NlZCgnZDJiLXZlcnRpY2FsJywgZmFsc2UpOwogICAgICAgICAgYm94ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCiAgICAgICAgICBlbnRlclVwZGF0ZShlbnRlciwgdXBkYXRlLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBkLnN0eWxlKG9yaWVudCwgcGFkZGluZ1tvcmllbnRdICsgJ3B4Jykuc3R5bGUoJ2xlZnQnLCBwYWRkaW5nLmxlZnQgKyAncHgnKS5zdHlsZSgnd2lkdGgnLCBzaXplLndpZHRoICsgJ3B4Jyk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBwYWRkaW5nW29yaWVudF0gKz0gYm94LmhlaWdodDsKICAgICAgICAgIHNpemUuaGVpZ2h0IC09IGJveC5oZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVsLmNsYXNzZWQoJ2QyYi12ZXJ0aWNhbCcsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShjaGFydEZyYW1lLCAkJCkuYWRkUHJvcEZ1bmN0b3IoJ3NpemUnLCBudWxsKS5hZGRQcm9wRnVuY3RvcignbGVnZW5kRW5hYmxlZCcsIHRydWUpLmFkZFByb3BGdW5jdG9yKCdsZWdlbmRPcmllbnQnLCAnYm90dG9tJykuYWRkUHJvcEZ1bmN0b3IoJ2JyZWFkY3J1bWJzRW5hYmxlZCcsIGZhbHNlKS5hZGRQcm9wRnVuY3RvcignYnJlYWRjcnVtYnNPcmllbnQnLCAncmlnaHQnKS5hZGRQcm9wRnVuY3RvcignY2hhcnRQYWRkaW5nJywgMTApLmFkZFByb3BGdW5jdG9yKCdwYWRkaW5nJywgMTApOwoKICAgIHJldHVybiBjaGFydEZyYW1lOwogIH0KCiAgdmFyIGQyYmlkID0gKGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7CiAgfSk7CgogIC8vIFJldHVybnMgdGhlIHNwZWNpZmllZCBvYmplY3QsIG9taXQgdGhlIHByb3BlcnRpZXMgd2l0aCBrZXlzIG1hdGNoaW5nCiAgLy8gdGhvc2UgaW4gdGhlIHNwZWNpZmllZCBrZXlzIGFycmF5LgoKICBmdW5jdGlvbiBvbWl0KG9iaiwga2V5cykgewogICAgdmFyIG5ld09iaiA9IHt9OwogICAgZm9yICh2YXIgayBpbiBvYmopIHsKICAgICAgaWYgKHR5cGVvZiBvYmpba10gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpZiAoa2V5cy5pbmRleE9mKGspIDwgMCkgbmV3T2JqW2tdID0gb2JqW2tdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3T2JqOwogIH0KCiAgdmFyIG51bWJlciA9IChmdW5jdGlvbiAoeCkgewogICAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDsKICB9KTsKCiAgZnVuY3Rpb24gbWVhbihhcnIsIHZhbHVlLCB3ZWlnaHQpIHsKICAgIHZhciB0b3RhbFdlaWdodCA9IDAsCiAgICAgICAgY29udHJpYnV0aW9uID0gMDsKICAgIHdlaWdodCA9IGZ1bmN0b3Iod2VpZ2h0IHx8IDEpOwogICAgdmFsdWUgPSBmdW5jdG9yKHZhbHVlIHx8IGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSk7CiAgICBhcnIuZmlsdGVyKGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiAhaXNOYU4obnVtYmVyKHdlaWdodChhKSkpICYmICFpc05hTihudW1iZXIodmFsdWUoYSkpKTsKICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIHcgPSB3ZWlnaHQoaXRlbSksCiAgICAgICAgICB2ID0gdmFsdWUoaXRlbSk7CiAgICAgIHRvdGFsV2VpZ2h0ICs9IHc7CiAgICAgIGNvbnRyaWJ1dGlvbiArPSB2ICogdzsKICAgIH0pOwogICAgaWYgKGFyci5sZW5ndGggJiYgdG90YWxXZWlnaHQpIHJldHVybiBjb250cmlidXRpb24gLyB0b3RhbFdlaWdodDsKICB9CgogIG1lYW4udGVuZGFuY3kgPSAnbWVhbic7CgogIGZ1bmN0aW9uIG1lZGlhbihhcnIsIHZhbHVlLCB3ZWlnaHQpIHsKICAgIHdlaWdodCA9IGZ1bmN0b3Iod2VpZ2h0IHx8IDEpOwogICAgdmFsdWUgPSBmdW5jdG9yKHZhbHVlIHx8IGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSk7CgogICAgdmFyIG1lZGlhbnMgPSBbXSwKICAgICAgICBtaWRXZWlnaHQ7CgogICAgdmFyIG5ld0FycmF5ID0gYXJyLmZpbHRlcihmdW5jdGlvbiAoYSkgewogICAgICByZXR1cm4gd2VpZ2h0KGEpICE9PSAwICYmICFpc05hTihudW1iZXIod2VpZ2h0KGEpKSkgJiYgIWlzTmFOKG51bWJlcih2YWx1ZShhKSkpOwogICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICByZXR1cm4gZDMuYXNjZW5kaW5nKHZhbHVlKGEpLCB2YWx1ZShiKSk7CiAgICB9KTsKCiAgICBtaWRXZWlnaHQgPSBNYXRoLnJvdW5kKGQzLnN1bShuZXdBcnJheSwgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgcmV0dXJuIHdlaWdodChpdGVtKTsKICAgIH0pIC8gMiAqIDFlMTIpIC8gMWUxMjsKCiAgICB2YXIgY3VycmVudFBvc2l0aW9uID0gMDsKICAgIHZhciBnZXROZXh0ID0gZmFsc2U7CgogICAgbmV3QXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICBpZiAoZ2V0TmV4dCkgewogICAgICAgIG1lZGlhbnMucHVzaCh2YWx1ZShpdGVtKSk7CiAgICAgICAgZ2V0TmV4dCA9IGZhbHNlOwogICAgICB9CgogICAgICBjdXJyZW50UG9zaXRpb24gKz0gd2VpZ2h0KGl0ZW0pOwoKICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA9PT0gbWlkV2VpZ2h0KSB7CiAgICAgICAgbWVkaWFucy5wdXNoKHZhbHVlKGl0ZW0pKTsKICAgICAgICBnZXROZXh0ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA+IG1pZFdlaWdodCAmJiBtZWRpYW5zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIG1lZGlhbnMucHVzaCh2YWx1ZShpdGVtKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChhcnIubGVuZ3RoKSByZXR1cm4gbWVhbihtZWRpYW5zKTsKICB9CgogIG1lZGlhbi50ZW5kYW5jeSA9ICdtZWRpYW4nOwoKICBmdW5jdGlvbiBtb2RlKGFyciwgdmFsdWUsIHdlaWdodCkgewogICAgd2VpZ2h0ID0gZnVuY3Rvcih3ZWlnaHQgfHwgMSk7CiAgICB2YWx1ZSA9IGZ1bmN0b3IodmFsdWUgfHwgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KTsKCiAgICB2YXIgbW9kZXMgPSBbXSwKICAgICAgICBtYXhGcmVxdWVuY3kgPSAwLAogICAgICAgIGZyZXF1ZW5jaWVzID0ge307CgogICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIHZhbCA9IG51bWJlcih2YWx1ZShpdGVtKSk7CiAgICAgIGlmIChpc05hTih2YWx1ZShpdGVtKSkpIHJldHVybjsKICAgICAgZnJlcXVlbmNpZXNbdmFsXSA9IGZyZXF1ZW5jaWVzW3ZhbF0gfHwgMDsKICAgICAgZnJlcXVlbmNpZXNbdmFsXSArPSB3ZWlnaHQoaXRlbSk7CgogICAgICBpZiAoZnJlcXVlbmNpZXNbdmFsXSA+IG1heEZyZXF1ZW5jeSkgewogICAgICAgIG1heEZyZXF1ZW5jeSA9IGZyZXF1ZW5jaWVzW3ZhbHVlKGl0ZW0pXTsKICAgICAgICBtb2RlcyA9IFt2YWx1ZShpdGVtKV07CiAgICAgIH0gZWxzZSBpZiAoZnJlcXVlbmNpZXNbdmFsdWUoaXRlbSldID09IG1heEZyZXF1ZW5jeSkgewogICAgICAgIG1vZGVzLnB1c2godmFsdWUoaXRlbSkpOwogICAgICB9CiAgICB9KTsKCiAgICBpZiAobWF4RnJlcXVlbmN5IDw9IDEgfHwgIW1vZGVzLmxlbmd0aCkgcmV0dXJuIG51bGw7ZWxzZSBpZiAobW9kZXMubGVuZ3RoID09PSAxKSByZXR1cm4gbW9kZXNbMF07ZWxzZSByZXR1cm4gbW9kZXM7CiAgfQoKICBtb2RlLnRlbmRhbmN5ID0gJ21vZGUnOwoKICBmdW5jdGlvbiByYW5nZShhcnIsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGZ1bmN0b3IodmFsdWUgfHwgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KTsKICAgIHZhciBleHRlbnQgPSBkMy5leHRlbnQoYXJyLCB2YWx1ZSk7CiAgICBpZiAoYXJyLmxlbmd0aCkgcmV0dXJuIGV4dGVudFsxXSAtIGV4dGVudFswXTsKICB9CgogIHJhbmdlLnRlbmRhbmN5ID0gJ3JhbmdlJzsKCiAgZnVuY3Rpb24gbWlkcG9pbnQoYXJyLCB2YWx1ZSkgewogICAgdmFsdWUgPSBmdW5jdG9yKHZhbHVlIHx8IGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSk7CiAgICBpZiAoYXJyLmxlbmd0aCkgcmV0dXJuIGQzLm1lYW4oZDMuZXh0ZW50KGFyciwgdmFsdWUpKTsKICB9CgogIG1pZHBvaW50LnRlbmRhbmN5ID0gJ21pZHBvaW50JzsKCiAgZnVuY3Rpb24gdG9EZWdyZWVzIChhbmdsZSkgewogICAgcmV0dXJuIGFuZ2xlICogKDE4MCAvIE1hdGguUEkpOwogIH0KCiAgZnVuY3Rpb24gdG9SYWRpYW5zIChhbmdsZSkgewogICAgcmV0dXJuIGFuZ2xlICogKE1hdGguUEkgLyAxODApOwogIH0KCiAgdmFyIHBpID0gTWF0aC5QSTsKICB2YXIgc3FydDggPSBNYXRoLnNxcnQoOCk7CiAgdmFyIHNxcnQyID0gTWF0aC5zcXJ0KDIpOwoKICB2YXIgbWFycyA9IHsKICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSkgewogICAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gKHBpICsgNSAvIDQpKTsKICAgICAgdmFyIHMgPSAwLjMxMjUgKiByOwogICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5hc2luKDEgLyA0KTsKICAgICAgdmFyIHRoZXRhMiA9IChwaSAvIDIgLSB0aGV0YSkgLyAyOwogICAgICB2YXIgY2lyY2xleCA9IHIgLyBzcXJ0OCAtIHIgKiBNYXRoLmNvcyh0aGV0YTIpOwogICAgICB2YXIgY2lyY2xleSA9IHIgKiBNYXRoLnNpbih0aGV0YTIpOwoKICAgICAgY29udGV4dC5hcmMoY2lyY2xleCwgY2lyY2xleSwgciwgLXRoZXRhMiwgMiAqIHBpIC0gdGhldGEgLSB0aGV0YTIpOwogICAgICBjb250ZXh0LmxpbmVUbyhyICogKDUgLyA0IC0gMSAvIHNxcnQyKSwgLXIgKiAoMSAvIHNxcnQ4ICsgNSAvIDQgLSAxIC8gc3FydDIpKTsKICAgICAgY29udGV4dC5saW5lVG8ociAqICg1IC8gNCAtIDEgLyBzcXJ0MikgLSBzLCAtciAqICgxIC8gc3FydDggKyA1IC8gNCAtIDEgLyBzcXJ0MikpOwogICAgICBjb250ZXh0LmxpbmVUbyhyICogKDUgLyA0IC0gMSAvIHNxcnQyKSAtIHMsIC1yICogKDEgLyBzcXJ0OCArIDcgLyA0IC0gMSAvIHNxcnQyKSk7CiAgICAgIGNvbnRleHQubGluZVRvKHIgKiAoNyAvIDQgLSAxIC8gc3FydDIgKyAxIC8gc3FydDgpLCAtciAqICgxIC8gc3FydDggKyA3IC8gNCAtIDEgLyBzcXJ0MikpOwogICAgICBjb250ZXh0LmxpbmVUbyhyICogKDcgLyA0IC0gMSAvIHNxcnQyICsgMSAvIHNxcnQ4KSwgLXIgKiAoNSAvIDQgLSAxIC8gc3FydDIpICsgcyk7CiAgICAgIGNvbnRleHQubGluZVRvKHIgKiAoNSAvIDQgLSAxIC8gc3FydDIgKyAxIC8gc3FydDgpLCAtciAqICg1IC8gNCAtIDEgLyBzcXJ0MikgKyBzKTsKICAgICAgY29udGV4dC5saW5lVG8ociAqICg1IC8gNCAtIDEgLyBzcXJ0MiArIDEgLyBzcXJ0OCksIC1yICogKDUgLyA0IC0gMSAvIHNxcnQyKSk7CiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB9CiAgfTsKCiAgdmFyIHZlbnVzID0gewogICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplKSB7CiAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyAocGkgKyA1IC8gNCkpOwogICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5hc2luKDEgLyA0KTsKICAgICAgdmFyIGNpcmNsZXkgPSByIC8gNCAtIHIgKiBNYXRoLmNvcyh0aGV0YSAvIDIpOwoKICAgICAgY29udGV4dC5hcmMoMCwgY2lyY2xleSwgciwgLXBpICogMyAvIDIgKyB0aGV0YSAvIDIsIHBpIC8gMiAtIHRoZXRhIC8gMik7CiAgICAgIGNvbnRleHQubGluZVRvKHIgLyA0LCAzICogciAvIDQpOwogICAgICBjb250ZXh0LmxpbmVUbyhyICogMyAvIDQsIDMgKiByIC8gNCk7CiAgICAgIGNvbnRleHQubGluZVRvKHIgKiAzIC8gNCwgNSAqIHIgLyA0KTsKICAgICAgY29udGV4dC5saW5lVG8ociAvIDQsIDUgKiByIC8gNCk7CiAgICAgIGNvbnRleHQubGluZVRvKHIgLyA0LCA3ICogciAvIDQpOwogICAgICBjb250ZXh0LmxpbmVUbygtciAvIDQsIDcgKiByIC8gNCk7CiAgICAgIGNvbnRleHQubGluZVRvKC1yIC8gNCwgNSAqIHIgLyA0KTsKICAgICAgY29udGV4dC5saW5lVG8oLXIgKiAzIC8gNCwgNSAqIHIgLyA0KTsKICAgICAgY29udGV4dC5saW5lVG8oLXIgKiAzIC8gNCwgMyAqIHIgLyA0KTsKICAgICAgY29udGV4dC5saW5lVG8oLXIgLyA0LCAzICogciAvIDQpOwogICAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogICAgfQogIH07CgogIC8vIHBvaW50IHN2ZyBnZW5lcmF0b3IKICBmdW5jdGlvbiBwb2ludCAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICAvKiBVcGRhdGUgRnVuY3Rpb24gKi8KICAgIHZhciBwb2ludCA9IGZ1bmN0aW9uIHBvaW50KGNvbnRleHQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICAvLyBwb2ludCBiYWNrZ3JvdW5kCiAgICAgIHZhciBiYWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgncGF0aC5kMmItcG9pbnQtYmFjaycpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIGJhY2suZW50ZXIoKS5hcHBlbmQoJ3BhdGgnKS5hdHRyKCdjbGFzcycsICdkMmItcG9pbnQtYmFjaycpLmF0dHIoJ2QnLCBzeW1ib2xOb3JtYWwpLnN0eWxlKCdmaWxsLW9wYWNpdHknLCAwKS5zdHlsZSgnc3Ryb2tlJywgJCQuc3Ryb2tlKS5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJCQuc3Ryb2tlV2lkdGgpOwoKICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgIGJhY2sgPSBiYWNrLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgIH0KCiAgICAgIGJhY2suYXR0cignZCcsIHN5bWJvbE5vcm1hbCkuc3R5bGUoJ3N0cm9rZScsICQkLnN0cm9rZSkuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICQkLnN0cm9rZVdpZHRoKTsKCiAgICAgIC8vIHBvaW50IGZvcmVncm91bmQKICAgICAgdmFyIGZyb250ID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgncGF0aC5kMmItcG9pbnQtZnJvbnQnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgfSk7CgogICAgICBmcm9udC5lbnRlcigpLmFwcGVuZCgncGF0aCcpLmF0dHIoJ2NsYXNzJywgJ2QyYi1wb2ludC1mcm9udCcpLmF0dHIoJ2QnLCBzeW1ib2xTbWFsbCkuc3R5bGUoJ29wYWNpdHknLCBmcm9udE9wYWNpdHkpLnN0eWxlKCdmaWxsJywgJCQuZmlsbCkuc3R5bGUoJ3N0cm9rZScsICQkLnN0cm9rZSkuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICQkLnN0cm9rZVdpZHRoKTsKCiAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICBmcm9udCA9IGZyb250LnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgIH0KCiAgICAgIGZyb250LmF0dHIoJ2QnLCBzeW1ib2xTbWFsbCkuc3R5bGUoJ29wYWNpdHknLCBmcm9udE9wYWNpdHkpLnN0eWxlKCdmaWxsJywgJCQuZmlsbCkuc3R5bGUoJ3N0cm9rZScsICQkLnN0cm9rZSkuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICQkLnN0cm9rZVdpZHRoKTsKCiAgICAgIC8vIHNldCBtb3VzZSBldmVudHMgaWYgYWN0aXZlCiAgICAgIHNlbGVjdGlvbi5lYWNoKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgdmFyIGFjdGl2ZSA9ICQkLmFjdGl2ZS5jYWxsKHRoaXMsIGQsIGkpOwogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5vbignbW91c2VvdmVyLmQyYi1wb2ludCcsIGFjdGl2ZSA/IG1vdXNlb3ZlciA6IG51bGwpLm9uKCdtb3VzZW91dC5kMmItcG9pbnQnLCBhY3RpdmUgPyBtb3VzZW91dCA6IG51bGwpOwogICAgICB9KTsKCiAgICAgIHNlbGVjdGlvbi5kaXNwYXRjaCgncG9pbnQtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBwb2ludDsKICAgIH07CgogICAgdmFyIHN5bWJvbCA9IGQzLnN5bWJvbCgpOwoKICAgIC8qIEluaGVyaXQgZnJvbSBiYXNlIG1vZGVsICovCiAgICBiYXNlKHBvaW50LCAkJCkuYWRkUHJvcEZ1bmN0b3IoJ3NpemUnLCAxNTAsIG51bGwsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBzeW1ib2wuc2l6ZShkKTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCd0eXBlJywgZDMuc3ltYm9sQ2lyY2xlLCBudWxsLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gc3ltYm9sLnR5cGUoZCk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignYWN0aXZlJywgZmFsc2UpLmFkZFByb3BGdW5jdG9yKCdlbXB0eScsIGZhbHNlKS5hZGRQcm9wRnVuY3RvcignZmlsbCcsICdzdGVlbGJsdWUnKS5hZGRQcm9wRnVuY3Rvcignc3Ryb2tlJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgcmV0dXJuIGQzLnJnYigkJC5maWxsLmNhbGwodGhpcywgZCwgaSkpLmRhcmtlcigwLjMpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3N0cm9rZVdpZHRoJywgJzFweCcpOwoKICAgIGZ1bmN0aW9uIGZyb250T3BhY2l0eShkLCBpKSB7CiAgICAgIHJldHVybiAkJC5lbXB0eS5jYWxsKHRoaXMsIGQsIGkpID8gMCA6IDE7CiAgICB9CgogICAgZnVuY3Rpb24gc3ltYm9sQmlnKGQsIGkpIHsKICAgICAgdmFyIHNpemUgPSAkJC5zaXplLmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICBlbXB0eSA9ICQkLmVtcHR5LmNhbGwodGhpcywgZCwgaSk7CiAgICAgIHJldHVybiBzeW1ib2wuc2l6ZShlbXB0eSA/IHNpemUgOiAyLjUgKiBzaXplKS5jYWxsKHRoaXMsIGQsIGkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN5bWJvbFNtYWxsKGQsIGkpIHsKICAgICAgdmFyIHNpemUgPSAkJC5zaXplLmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICBlbXB0eSA9ICQkLmVtcHR5LmNhbGwodGhpcywgZCwgaSk7CiAgICAgIHJldHVybiBzeW1ib2wuc2l6ZShlbXB0eSA/IHNpemUgLyAzIDogc2l6ZSkuY2FsbCh0aGlzLCBkLCBpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzeW1ib2xOb3JtYWwoZCwgaSkgewogICAgICB2YXIgc2l6ZSA9ICQkLnNpemUuY2FsbCh0aGlzLCBkLCBpKTsKICAgICAgcmV0dXJuIHN5bWJvbC5zaXplKHNpemUpLmNhbGwodGhpcywgZCwgaSk7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2VvdmVyKGQsIGkpIHsKICAgICAgdmFyIGVtcHR5ID0gJCQuZW1wdHkuY2FsbCh0aGlzLCBkLCBpKTsKCiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoJ3BhdGguZDJiLXBvaW50LWJhY2snKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKS5hdHRyKCdkJywgc3ltYm9sQmlnKTsKCiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoJ3BhdGguZDJiLXBvaW50LWZyb250JykudHJhbnNpdGlvbigpLmR1cmF0aW9uKDEwMCkuc3R5bGUoJ29wYWNpdHknLCBlbXB0eSA/IDAuNSA6IDEpLmF0dHIoJ2QnLCBzeW1ib2xTbWFsbCk7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2VvdXQoZCwgaSkgewogICAgICB2YXIgZW1wdHkgPSAkJC5lbXB0eS5jYWxsKHRoaXMsIGQsIGkpOwoKICAgICAgZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgncGF0aC5kMmItcG9pbnQtYmFjaycpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxMDApLmF0dHIoJ2QnLCBzeW1ib2xOb3JtYWwpOwoKICAgICAgZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgncGF0aC5kMmItcG9pbnQtZnJvbnQnKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKS5zdHlsZSgnb3BhY2l0eScsIGVtcHR5ID8gMCA6IDEpLmF0dHIoJ2QnLCBzeW1ib2xTbWFsbCk7CiAgICB9CgogICAgcmV0dXJuIHBvaW50OwogIH0KCiAgLy8gcGllIHN2ZyBnZW5lcmF0b3IKICBmdW5jdGlvbiBzdmdQaWUgKCkgewoKICAgIHZhciAkJCA9IHt9OwoKICAgIC8qIFVwZGF0ZSBGdW5jdGlvbiAqLwogICAgdmFyIHBpZSA9IGZ1bmN0aW9uIHBpZShjb250ZXh0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0OwoKICAgICAgJCQucGllLnZhbHVlKCQkLnZhbHVlKTsKCiAgICAgICQkLmFyYy5zdGFydEFuZ2xlKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKICAgICAgfSkuZW5kQW5nbGUoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5lbmRBbmdsZTsKICAgICAgfSkucGFkQW5nbGUoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5wYWRBbmdsZTsKICAgICAgfSk7CgogICAgICB2YXIgcGllU3ZnID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1waWUnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFskJC5waWUoJCQudmFsdWVzKGQpKV07CiAgICAgIH0pLAogICAgICAgICAgcGllU3ZnRW50ZXIgPSBwaWVTdmcuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItcGllJyk7CgogICAgICBwaWVTdmcgPSBwaWVTdmcubWVyZ2UocGllU3ZnRW50ZXIpOwoKICAgICAgcGllU3ZnLmVhY2goZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgICAgLy8gc2VsZWN0IGFyYyBncm91cCBhbmQgZ2V0IHRoZWlyIG9sZCBkYXRhCiAgICAgICAgdmFyIGFyYyA9IGVsLnNlbGVjdEFsbCgnLmQyYi1waWUtYXJjJyk7CiAgICAgICAgdmFyIG9sZERhdGEgPSBhcmMuZGF0YSgpOwoKICAgICAgICBhcmMgPSBhcmMuZGF0YSh2YWx1ZXMsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICBkLmtleSA9ICQkLmtleShkLmRhdGEsIGkpOwogICAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICAgIH0pOwoKICAgICAgICB2YXIgYXJjRW50ZXIgPSBhcmMuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItcGllLWFyYycpLAogICAgICAgICAgICBhcmNFeGl0ID0gYXJjLmV4aXQoKSwKICAgICAgICAgICAgYXJjVXBkYXRlID0gYXJjLm1lcmdlKGFyY0VudGVyKS5vcmRlcigpOwoKICAgICAgICBhcmNFbnRlci5hcHBlbmQoJ3BhdGgnKS5hdHRyKCdmaWxsJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHJldHVybiAkJC5jb2xvci5jYWxsKHRoaXMsIGQuZGF0YSwgaSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHJldHJpZXZlIG5ldyBkYXRhCiAgICAgICAgdmFyIG5ld0RhdGEgPSBhcmNVcGRhdGUuZGF0YSgpOwoKICAgICAgICAvLyBmb3IgbmV3IGFyY3MsIGZpbmQgYW5kIHNldCB0aGUgbmVpZ2hib3JpbmcgaW5zZXJ0aW9uIHBvaW50CiAgICAgICAgYXJjRW50ZXIuc2VsZWN0KCdwYXRoJykuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgdGhpcy5jdXJyZW50ID0gZmluZE5laWdoYm9yQXJjKGksIG9sZERhdGEsIG5ld0RhdGEpOwogICAgICAgIH0pOwoKICAgICAgICBhcmNFeGl0LmRhdHVtKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IGZpbmROZWlnaGJvckFyYyhpLCBuZXdEYXRhLCBvbGREYXRhKTsKICAgICAgICAgIGRhdGEuZGF0YSA9IGQuZGF0YTsKICAgICAgICAgIGRhdGEuaW5uZXJSYWRpdXMgPSBkLmlubmVyUmFkaXVzOwogICAgICAgICAgZGF0YS5vdXRlclJhZGl1cyA9IGQub3V0ZXJSYWRpdXM7CiAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gc3RhcnQgdHJhbnNpdGlvbiBmb3IgZXhpdGluZyBhbmQgdXBkYXRpbmcgYXJjcwogICAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICAgIGFyY0V4aXQgPSBhcmNFeGl0LnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBhcmNVcGRhdGUgPSBhcmNVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIC8vIHRyYW5zaXRpb24gYXJjIHBhdGgKICAgICAgICBhcmNVcGRhdGUuc2VsZWN0KCdwYXRoJykuY2FsbCh0d2VlbkFyYywgJCQuYXJjKS5hdHRyKCdmaWxsJywgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHJldHVybiAkJC5jb2xvci5jYWxsKHRoaXMsIGQuZGF0YSwgaSk7CiAgICAgICAgfSk7CgogICAgICAgIGFyY0V4aXQucmVtb3ZlKCkuc2VsZWN0KCdwYXRoJykuY2FsbCh0d2VlbkFyYywgJCQuYXJjKTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ3N2Zy1waWUtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBwaWU7CiAgICB9OwoKICAgIC8qIEluaGVyaXQgZnJvbSBiYXNlIG1vZGVsICovCiAgICBiYXNlKHBpZSwgJCQpLmFkZFByb3AoJ2FyYycsIGQzLmFyYygpKS5hZGRQcm9wKCdwaWUnLCBkMy5waWUoKS5zb3J0KG51bGwpKS5hZGRQcm9wRnVuY3RvcigndmFsdWVzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KS5hZGRQcm9wRnVuY3Rvcigna2V5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigndmFsdWUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC52YWx1ZTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGZpbmROZWlnaGJvckFyYyhpLCBkYXRhMCwgZGF0YTEpIHsKICAgICAgdmFyIHByZWNlZGluZyA9IGZpbmRQcmVjZWRpbmcoaSwgZGF0YTAsIGRhdGExKSwKICAgICAgICAgIGZvbGxvd2luZyA9IGZpbmRGb2xsb3dpbmcoaSwgZGF0YTAsIGRhdGExKTsKICAgICAgaWYgKHByZWNlZGluZykgewogICAgICAgIHJldHVybiB7IHN0YXJ0QW5nbGU6IHByZWNlZGluZy5lbmRBbmdsZSwgZW5kQW5nbGU6IHByZWNlZGluZy5lbmRBbmdsZSB9OwogICAgICB9IGVsc2UgaWYgKGZvbGxvd2luZykgewogICAgICAgIHJldHVybiB7IHN0YXJ0QW5nbGU6IGZvbGxvd2luZy5zdGFydEFuZ2xlLCBlbmRBbmdsZTogZm9sbG93aW5nLnN0YXJ0QW5nbGUgfTsKICAgICAgfQogICAgICByZXR1cm4geyBzdGFydEFuZ2xlOiAwLCBlbmRBbmdsZTogMCB9OwogICAgfQoKICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgaW4gZGF0YTAgdGhhdCBqb2lucyB0aGUgaGlnaGVzdCBwcmVjZWRpbmcgZWxlbWVudCBpbiBkYXRhMS4KICAgIGZ1bmN0aW9uIGZpbmRQcmVjZWRpbmcoaSwgZGF0YTAsIGRhdGExKSB7CiAgICAgIHZhciBtID0gZGF0YTAubGVuZ3RoOwogICAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgICB2YXIgayA9ICQkLmtleShkYXRhMVtpXS5kYXRhLCBpKTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKCQkLmtleShkYXRhMFtqXS5kYXRhLCBqKSA9PT0gaykgcmV0dXJuIGRhdGEwW2pdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgaW4gZGF0YTAgdGhhdCBqb2lucyB0aGUgbG93ZXN0IGZvbGxvd2luZyBlbGVtZW50IGluIGRhdGExLgogICAgZnVuY3Rpb24gZmluZEZvbGxvd2luZyhpLCBkYXRhMCwgZGF0YTEpIHsKICAgICAgdmFyIG4gPSBkYXRhMS5sZW5ndGgsCiAgICAgICAgICBtID0gZGF0YTAubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHZhciBrID0gJCQua2V5KGRhdGExW2ldLmRhdGEsIGkpOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBpZiAoJCQua2V5KGRhdGEwW2pdLmRhdGEsIGopID09PSBrKSByZXR1cm4gZGF0YTBbal07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBpZTsKICB9CgogIGZ1bmN0aW9uIGlzRmluaXRlUGF0aCAocGF0aCkgewogICAgcmV0dXJuICEocGF0aC5pbmRleE9mKCdOYU4nKSA+IC0xIHx8IHBhdGguaW5kZXhPZignSW5pZm5pdHknKSA+IC0xKTsKICB9CgogIHZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIiA/IGZ1bmN0aW9uIChvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqOwogIH0gOiBmdW5jdGlvbiAob2JqKSB7CiAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOwogIH07CgogIHZhciBhc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIEF3YWl0VmFsdWUodmFsdWUpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEFzeW5jR2VuZXJhdG9yKGdlbikgewogICAgICB2YXIgZnJvbnQsIGJhY2s7CgogICAgICBmdW5jdGlvbiBzZW5kKGtleSwgYXJnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgIHZhciByZXF1ZXN0ID0gewogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgYXJnOiBhcmcsCiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsCiAgICAgICAgICAgIHJlamVjdDogcmVqZWN0LAogICAgICAgICAgICBuZXh0OiBudWxsCiAgICAgICAgICB9OwoKICAgICAgICAgIGlmIChiYWNrKSB7CiAgICAgICAgICAgIGJhY2sgPSBiYWNrLm5leHQgPSByZXF1ZXN0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnJvbnQgPSBiYWNrID0gcmVxdWVzdDsKICAgICAgICAgICAgcmVzdW1lKGtleSwgYXJnKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVzdW1lKGtleSwgYXJnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciByZXN1bHQgPSBnZW5ba2V5XShhcmcpOwogICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlOwoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0VmFsdWUpIHsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChhcmcpIHsKICAgICAgICAgICAgICByZXN1bWUoIm5leHQiLCBhcmcpOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKSB7CiAgICAgICAgICAgICAgcmVzdW1lKCJ0aHJvdyIsIGFyZyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0dGxlKHJlc3VsdC5kb25lID8gInJldHVybiIgOiAibm9ybWFsIiwgcmVzdWx0LnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHNldHRsZSgidGhyb3ciLCBlcnIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2V0dGxlKHR5cGUsIHZhbHVlKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJyZXR1cm4iOgogICAgICAgICAgICBmcm9udC5yZXNvbHZlKHsKICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgZG9uZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAidGhyb3ciOgogICAgICAgICAgICBmcm9udC5yZWplY3QodmFsdWUpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBmcm9udC5yZXNvbHZlKHsKICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgZG9uZTogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZnJvbnQgPSBmcm9udC5uZXh0OwoKICAgICAgICBpZiAoZnJvbnQpIHsKICAgICAgICAgIHJlc3VtZShmcm9udC5rZXksIGZyb250LmFyZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJhY2sgPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5faW52b2tlID0gc2VuZDsKCiAgICAgIGlmICh0eXBlb2YgZ2VuLnJldHVybiAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRoaXMucmV0dXJuID0gdW5kZWZpbmVkOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHsKICAgICAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgIH0KCiAgICBBc3luY0dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChhcmcpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZSgibmV4dCIsIGFyZyk7CiAgICB9OwoKICAgIEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChhcmcpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZSgidGhyb3ciLCBhcmcpOwogICAgfTsKCiAgICBBc3luY0dlbmVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKGFyZykgewogICAgICByZXR1cm4gdGhpcy5faW52b2tlKCJyZXR1cm4iLCBhcmcpOwogICAgfTsKCiAgICByZXR1cm4gewogICAgICB3cmFwOiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIG5ldyBBc3luY0dlbmVyYXRvcihmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICB9OwogICAgICB9LAogICAgICBhd2FpdDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBd2FpdFZhbHVlKHZhbHVlKTsKICAgICAgfQogICAgfTsKICB9KCk7CgogIC8vIGNvcHkgZDMuYW5ub3RhdGlvbiBpbnN0YW5jZSBmb3Igc2luZ2xlIHVzZSBjYXNlcwoKICB2YXIgY29weSA9IGZ1bmN0aW9uIGNvcHkoX2Fubm90YXRpb24pIHsKICAgIHJldHVybiBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbigpLmRpc2FibGUoX2Fubm90YXRpb24uZGlzYWJsZSgpKS50ZXh0V3JhcChfYW5ub3RhdGlvbi50ZXh0V3JhcCgpKS5ub3RlUGFkZGluZyhfYW5ub3RhdGlvbi5ub3RlUGFkZGluZygpKS50eXBlKF9hbm5vdGF0aW9uLnR5cGUoKSkuYWNjZXNzb3JzKF9hbm5vdGF0aW9uLmFjY2Vzc29ycygpKS5hY2Nlc3NvcnNJbnZlcnNlKF9hbm5vdGF0aW9uLmFjY2Vzc29yc0ludmVyc2UoKSkuaWRzKF9hbm5vdGF0aW9uLmlkcygpKS5lZGl0TW9kZShfYW5ub3RhdGlvbi5lZGl0TW9kZSgpKS5jb2xsZWN0aW9uKF9hbm5vdGF0aW9uLmNvbGxlY3Rpb24oKSk7CiAgfTsKCiAgLy8gVXBkYXRlIGEgc2V0IG9mIGFubm90YXRpb25zLCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBwb2ludCBvcmllbnRlZCBhbm5vdGF0aW9ucy4gKGUuZy4gbm90IHJlY3RhbmdsZXMgLyB0aHJlc2hvbGRzKQogIC8qKgogICAqIEBwYXJhbSB7ZDMgdHJhbnNpdGlvbiBvciBzZWxlY3Rpb259ICAgIGNvbnRleHQgICAgICAgICAgICAgYW5ub3RhdGlvbiBjb250YWluZXIgY29udGV4dAogICAqIEBwYXJhbSB7ZDMgYW5ub3RhdGlvbn0gICAgICAgICAgICAgICAgIGFubm90YXRpb24gICAgICAgICAgYW5ub3RhdGlvbiBnZW5lcmF0b3IKICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckNsYXNzICAgICAgIGNsYXNzIGJ5IHdoaWNoIHRvIHNlbGVjdCB0aGUgYW5ub3RhdGlvbnMKICAgKiBAcGFyYW0ge2FjY2Vzc29yfSAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhICAgICAgICAgICAgIGdldCBhbm5vdGF0aW9uIGRhdGEgYXJyYXkgZnJvbSBjb250ZXh0IGRhdHVtCiAgICogQHBhcmFtIHthY2Nlc3NvciAoZCwgYSkgPT4ge319ICAgICAgICAgZ2V0Q29sb3IgICAgICAgICAgICBnZXQgYW5ub3RhdGlvbiBjb2xvciBmcm9tIGZyb20gY29udGV4dCBkYXR1bSBhbmQgYW5ub3RhdGlvbiBkYXR1bQogICAqIEBwYXJhbSB7YWNjZXNzb3IgKGQsIGEpID0+IHt9fSAgICAgICAgIGdldFRyYW5zZm9ybSAgICAgICAgZ2V0IGFubm90YXRpb24gdHJhbnNmb3JtIGZyb20gY29udGV4dCBkYXR1bSBhbmQgYW5ub3RhdGlvbiBkYXR1bQogICAqIEBwYXJhbSB7YWNjZXNzb3IgKGQsIGEpID0+IHt9fSAgICAgICAgIGdldFRyYW5zZm9ybUVudGVyICAgZ2V0IGFubm90YXRpb24gZW50cmFuY2UgdHJhbnNmb3JtIGZyb20gY29udGV4dCBkYXR1bSBhbmQgYW5ub3RhdGlvbiBkYXR1bQogICAqLwoKICB2YXIgdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGNvbnRleHQsIGFubm90YXRpb24sIHNlbGVjdG9yQ2xhc3MpIHsKICAgIHZhciBnZXREYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5hbm5vdGF0aW9uID8gW2QuYW5ub3RhdGlvbl0gOiBbXTsKICAgIH07CiAgICB2YXIgZ2V0Q29sb3IgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmNvbG9yOwogICAgfTsKICAgIHZhciBnZXRUcmFuc2Zvcm0gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6ICd0cmFuc2xhdGUoMCwgMCknOwogICAgdmFyIGdldFRyYW5zZm9ybUVudGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgJiYgYXJndW1lbnRzWzZdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNl0gOiAndHJhbnNsYXRlKDAsIDApJzsKCgogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgY29udGV4dC5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgIGRhdGEgPSBmdW5jdG9yKGdldERhdGEpKGQpLAogICAgICAgICAgYW5ub3RhdGlvblN2ZyA9IGVsLnNlbGVjdEFsbCgnZy4nICsgc2VsZWN0b3JDbGFzcykuZGF0YShkYXRhKSwKICAgICAgICAgIGFubm90YXRpb25FbnRlciA9IGFubm90YXRpb25TdmcuZW50ZXIoKS5hcHBlbmQoJ2cnKTsKCiAgICAgIHZhciBhbm5vdGF0aW9uVXBkYXRlID0gYW5ub3RhdGlvblN2Zy5tZXJnZShhbm5vdGF0aW9uRW50ZXIpLAogICAgICAgICAgYW5ub3RhdGlvbkV4aXQgPSBhbm5vdGF0aW9uU3ZnLmV4aXQoKTsKCiAgICAgIGFubm90YXRpb25FbnRlci5hdHRyKCdjbGFzcycsIHNlbGVjdG9yQ2xhc3MpLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0b3IoZ2V0VHJhbnNmb3JtRW50ZXIpKGQsIGEpOwogICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgYS54ID0gMDsKICAgICAgICBhLnkgPSAwOwogICAgICAgIGEuY29sb3IgPSBmdW5jdG9yKGdldENvbG9yKShkLCBhKTsKICAgICAgfSk7CgogICAgICBpZiAoZGF0YS5sZW5ndGggJiYgYW5ub3RhdGlvbikgewogICAgICAgIGFubm90YXRpb25VcGRhdGUuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7CiAgICAgICAgYW5ub3RhdGlvblVwZGF0ZS5jYWxsKGNvcHkoYW5ub3RhdGlvbikuYW5ub3RhdGlvbnMoZGF0YSkpOwogICAgICB9CgogICAgICAvLyBoYW5kbGUgYW5ub3RhdGlvbiB0cmFuc2l0aW9ucyBhbmQgZXhpdGluZwogICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgYW5ub3RhdGlvblVwZGF0ZSA9IGFubm90YXRpb25VcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICBhbm5vdGF0aW9uRXhpdCA9IGFubm90YXRpb25FeGl0LnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgIH0KCiAgICAgIGFubm90YXRpb25VcGRhdGUuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGEpIHsKICAgICAgICByZXR1cm4gZnVuY3RvcihnZXRUcmFuc2Zvcm0pKGQsIGEpOwogICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDEpOwoKICAgICAgYW5ub3RhdGlvbkV4aXQuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGEpIHsKICAgICAgICByZXR1cm4gZnVuY3RvcihnZXRUcmFuc2Zvcm0pKGQsIGEpOwogICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDApLnJlbW92ZSgpOwogICAgfSk7CiAgfTsKCiAgLy8gcXVpY2sgaW1wbGVtZW50YXRpb24gb2Ygc2hhbGxvdyBvYmplY3QgY2xvbmUKCiAgZnVuY3Rpb24gY2xvbmUob2JqKSB7CiAgICBpZiAobnVsbCA9PSBvYmogfHwgIm9iamVjdCIgIT0gKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpKSByZXR1cm4gb2JqOwogICAgdmFyIGNvcHkgPSBvYmouY29uc3RydWN0b3IoKTsKICAgIGZvciAodmFyIGF0dHIgaW4gb2JqKSB7CiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoYXR0cikpIGNvcHlbYXR0cl0gPSBvYmpbYXR0cl07CiAgICB9CiAgICByZXR1cm4gY29weTsKICB9CgogIC8vIFRyYW5zZm9ybSB4LCB5LCB4MiwgeTIgaW50byBkMy5hbm5vdGF0aW9uIHBpeGVsIGF0dHJpYnV0ZXMgYW5kIHVwZGF0ZSBheGlzIGFubm90YXRpb25zIGFjY29yZGluZ2x5CiAgLyoqCiAgICogQHBhcmFtIHtkMyB0cmFuc2l0aW9uIG9yIHNlbGVjdGlvbn0gICAgY29udGV4dCAgICAgICAgICAgICBhbm5vdGF0aW9uIGNvbnRhaW5lciBjb250ZXh0CiAgICogQHBhcmFtIHtkMyBhbm5vdGF0aW9ufSAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiAgICAgICAgICBhbm5vdGF0aW9uIGdlbmVyYXRvcgogICAqIEBwYXJhbSB7YWNjZXNzb3J9ICAgICAgICAgICAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiBkYXRhIGFycmF5CiAgICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzICAgICAgICAgICAgICBhbm5vdGF0aW9uIHNjYWxlcyB7IHgsIHksIHgyLCB5MiB9CiAgICovCgogIHZhciB1cGRhdGVBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIHVwZGF0ZUF4aXMoY29udGV4dCwgYW5ub3RhdGlvbiwgZGF0YSwgc2NhbGVzKSB7CgogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQsCiAgICAgICAgbm9kZSA9IHNlbGVjdGlvbi5ub2RlKCksCiAgICAgICAgcHJlU2NhbGVzID0gbm9kZS5fX3NjYWxlcyB8fCBzY2FsZXM7CgogICAgdmFyIGdldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIGdldFRyYW5zZm9ybShhLCBzY2FsZXMpIHsKICAgICAgdmFyIHggPSBzY2FsZXNbYS54VHlwZV0sCiAgICAgICAgICB5ID0gc2NhbGVzW2EueVR5cGVdLAogICAgICAgICAgeFZhbCA9IGEueCA9PT0gSW5maW5pdHkgPyB4LnJhbmdlKClbMF0gOiB4KGEueCksCiAgICAgICAgICB5VmFsID0gYS55ID09PSBJbmZpbml0eSA/IHkucmFuZ2UoKVswXSA6IHkoYS55KSwKICAgICAgICAgIHgyVmFsID0gYS54MiA9PT0gSW5maW5pdHkgPyB4LnJhbmdlKClbMV0gOiB4KGEueDIpLAogICAgICAgICAgeTJWYWwgPSBhLnkyID09PSBJbmZpbml0eSA/IHkucmFuZ2UoKVsxXSA6IHkoYS55Mik7CgogICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgW2lzTmFOKHgyVmFsKSA/IHhWYWwgOiBNYXRoLm1pbih4VmFsLCB4MlZhbCksIGlzTmFOKHkyVmFsKSA/IHlWYWwgOiBNYXRoLm1pbih5VmFsLCB5MlZhbCldICsgJyknOwogICAgfTsKCiAgICB2YXIgZ2V0U3ViamVjdCA9IGZ1bmN0aW9uIGdldFN1YmplY3QoYSwgc2NhbGVzKSB7CiAgICAgIHZhciBzdWJqZWN0Q29weSA9IGNsb25lKGEuZGF0YS5zdWJqZWN0KSB8fCB7fSwKICAgICAgICAgIHggPSBzY2FsZXNbYS54VHlwZV0sCiAgICAgICAgICB5ID0gc2NhbGVzW2EueVR5cGVdLAogICAgICAgICAgeFZhbCA9IGEueCA9PT0gSW5maW5pdHkgPyB4LnJhbmdlKClbMF0gOiB4KGEueCksCiAgICAgICAgICB5VmFsID0gYS55ID09PSBJbmZpbml0eSA/IHkucmFuZ2UoKVswXSA6IHkoYS55KSwKICAgICAgICAgIHgyVmFsID0gYS54MiA9PT0gSW5maW5pdHkgPyB4LnJhbmdlKClbMV0gOiB4KGEueDIpLAogICAgICAgICAgeTJWYWwgPSBhLnkyID09PSBJbmZpbml0eSA/IHkucmFuZ2UoKVsxXSA6IHkoYS55MiksCiAgICAgICAgICB3aWR0aCA9IGEueDIgPyBNYXRoLmFicyh4VmFsIC0geDJWYWwpIDogMCwKICAgICAgICAgIGhlaWdodCA9IGEueTIgPyBNYXRoLmFicyh5VmFsIC0geTJWYWwpIDogMDsKCiAgICAgIGlmIChhLngyICYmIGEueTIpIHsKICAgICAgICBzdWJqZWN0Q29weS53aWR0aCA9IHdpZHRoOwogICAgICAgIHN1YmplY3RDb3B5LmhlaWdodCA9IGhlaWdodDsKICAgICAgfSBlbHNlIGlmIChhLngyKSB7CiAgICAgICAgc3ViamVjdENvcHkueDEgPSAwOwogICAgICAgIHN1YmplY3RDb3B5LngyID0gd2lkdGg7CiAgICAgIH0gZWxzZSBpZiAoYS55MikgewogICAgICAgIHN1YmplY3RDb3B5LnkxID0gMDsKICAgICAgICBzdWJqZWN0Q29weS55MiA9IGhlaWdodDsKICAgICAgfQoKICAgICAgc3ViamVjdENvcHkuZHggPSBzdWJqZWN0Q29weS5keCAqIHdpZHRoOwogICAgICBzdWJqZWN0Q29weS5keSA9IHN1YmplY3RDb3B5LmR5ICogaGVpZ2h0OwoKICAgICAgcmV0dXJuIHN1YmplY3RDb3B5OwogICAgfTsKCiAgICBub2RlLl9fc2NhbGVzID0gewogICAgICB4OiBzY2FsZXMueC5jb3B5KCksCiAgICAgIHk6IHNjYWxlcy55LmNvcHkoKSwKICAgICAgeDI6IHNjYWxlcy54Mi5jb3B5KCksCiAgICAgIHkyOiBzY2FsZXMueTIuY29weSgpCiAgICB9OwoKICAgIHZhciBhU3ZnID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1heGlzLWFubm90YXRpb24nKS5kYXRhKGRhdGEsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmtleTsKICAgIH0pLAogICAgICAgIGFFbnRlciA9IGFTdmcuZW50ZXIoKS5hcHBlbmQoJ2cnKSwKICAgICAgICBhRXhpdCA9IGFTdmcuZXhpdCgpOwoKICAgIC8vIGNsZWFyIG91dCB0aGUgYW5ub3RhaXRvbiBiZWZvcmUgdXBkYXRpbmcgaW4gY2FzZSBvZiBhIGNoYW5nZSBpbiBhbm5vdGF0aW9uIHR5cGUKICAgIGFTdmcuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7CgogICAgYVN2ZyA9IGFTdmcubWVyZ2UoYUVudGVyKTsKCiAgICBhRW50ZXIuYXR0cignY2xhc3MnLCAnZDJiLWF4aXMtYW5ub3RhdGlvbicpLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm0oYSwgcHJlU2NhbGVzKTsKICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICBhU3ZnID0gYVN2Zy50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICBhRXhpdCA9IGFFeGl0LnRyYW5zaXRpb24oY29udGV4dCk7CiAgICB9CgogICAgYVN2Zy5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoYSkgewogICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtKGEsIHNjYWxlcyk7CiAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDEpOwoKICAgIGFFeGl0LmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm0oYSwgc2NhbGVzKTsKICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMCkucmVtb3ZlKCk7CgogICAgYVN2Zy5lYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgIHZhciBhQ29weSA9IGNsb25lKGEuZGF0YSksCiAgICAgICAgICBhU3ZnID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgYW5ub3RhdGlvbkNvcHkgPSBjb3B5KGFubm90YXRpb24pOwoKICAgICAgYUNvcHkueCA9IDA7CiAgICAgIGFDb3B5LnkgPSAwOwogICAgICBhQ29weS5jb2xvciA9IGEuY29sb3I7CiAgICAgIGFDb3B5LnN1YmplY3QgPSBnZXRTdWJqZWN0KGEsIHNjYWxlcyk7CiAgICAgIGFDb3B5LmR4ID0gKGFDb3B5LnN1YmplY3QuZHggfHwgMCkgKyAoYS5kYXRhLmR4IHx8IDApOwogICAgICBhQ29weS5keSA9IChhQ29weS5zdWJqZWN0LmR5IHx8IDApICsgKGEuZGF0YS5keSB8fCAwKTsKCiAgICAgIC8vIGlmIHRyYW5zaXRpb25pbmcsIGN1c3RvbSB0d2VlbiB0aGUgc3ViamVjdCBjb250ZW50cwogICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgYVN2Zy50cmFuc2l0aW9uKGNvbnRleHQpLnR3ZWVuKCdhbm5vdGF0aW9uLXR3ZWVuJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICB2YXIgaSA9IGQzLmludGVycG9sYXRlT2JqZWN0KHRoaXMuX19zdWJqZWN0IHx8IGdldFN1YmplY3QoYSwgc2NhbGVzKSwgYUNvcHkuc3ViamVjdCk7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgX3RoaXMuX19zdWJqZWN0ID0gYUNvcHkuc3ViamVjdCA9IGkodCk7CiAgICAgICAgICAgIGFDb3B5LmR4ID0gKGFDb3B5LnN1YmplY3QuZHggfHwgMCkgKyAoYS5kYXRhLmR4IHx8IDApOwogICAgICAgICAgICBhQ29weS5keSA9IChhQ29weS5zdWJqZWN0LmR5IHx8IDApICsgKGEuZGF0YS5keSB8fCAwKTsKICAgICAgICAgICAgYVN2Zy5jYWxsKGFubm90YXRpb25Db3B5LmFubm90YXRpb25zKFthQ29weV0pKTsKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYVN2Zy5jYWxsKGFubm90YXRpb25Db3B5LmFubm90YXRpb25zKFthQ29weV0pKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgLy8gbGluZSBzdmcgZ2VuZXJhdG9yCiAgZnVuY3Rpb24gbGluZSQxICgpIHsKICAgIHZhciAkJCA9IHt9OwoKICAgIGZ1bmN0aW9uIGdldEdyYXBocyhkLCBpKSB7CiAgICAgIHZhciBncmFwaHMgPSAkJC5ncmFwaHMoZCwgaSkubWFwKGZ1bmN0aW9uIChncmFwaCwgaSkgewogICAgICAgIHZhciBuZXdHcmFwaCA9IHsKICAgICAgICAgIGRhdGE6IGdyYXBoLAogICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICBhbGlnbjogJCQuYWxpZ24oZ3JhcGgsIGkpLAogICAgICAgICAgdG9vbHRpcEdyYXBoOiAkJC50b29sdGlwR3JhcGgoZ3JhcGgsIGkpLAogICAgICAgICAgc2hpZnQ6ICQkLnNoaWZ0KGdyYXBoLCBpKSwKICAgICAgICAgIHN0YWNrQnk6ICQkLnN0YWNrQnkoZ3JhcGgsIGkpLAogICAgICAgICAga2V5OiAkJC5rZXkoZ3JhcGgsIGkpLAogICAgICAgICAgY29sb3I6ICQkLmNvbG9yKGdyYXBoLCBpKQogICAgICAgIH07CiAgICAgICAgbmV3R3JhcGgudmFsdWVzID0gJCQudmFsdWVzKGdyYXBoLCBpKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICB2YXIgbmV3UG9pbnQgPSB7CiAgICAgICAgICAgIGRhdGE6IHBvaW50LAogICAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgICAgZ3JhcGg6IG5ld0dyYXBoLAogICAgICAgICAgICBrZXk6ICQkLnBrZXkocG9pbnQsIGkpLAogICAgICAgICAgICB4OiAkJC5weChwb2ludCwgaSksCiAgICAgICAgICAgIHk6ICQkLnB5KHBvaW50LCBpKSwKICAgICAgICAgICAgY29sb3I6ICQkLnBjb2xvcihwb2ludCwgaSkgfHwgbmV3R3JhcGguY29sb3IsCiAgICAgICAgICAgIGFubm90YXRpb246ICQkLnBhbm5vdGF0aW9uKHBvaW50LCBpKQogICAgICAgICAgfTsKICAgICAgICAgIC8vIGluaXRpYWxpemUgeSB2YWx1ZXMgKHRoZXNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIHN0YWNrIGlmIHN0YWNraW5nIGFwcGxpZXMpCiAgICAgICAgICBuZXdQb2ludC55MSA9IG5ld1BvaW50Lnk7CiAgICAgICAgICBuZXdQb2ludC55MCA9IDA7CiAgICAgICAgICByZXR1cm4gbmV3UG9pbnQ7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ld0dyYXBoOwogICAgICB9KTsKCiAgICAgIHN0YWNrTmVzdC5lbnRyaWVzKGdyYXBocykuZm9yRWFjaChmdW5jdGlvbiAoc2cpIHsKICAgICAgICBpZiAoc2cudmFsdWVzLmxlbmd0aCA+IDEpIHN0YWNrZXIoc2cudmFsdWVzKTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZ3JhcGhzOwogICAgfQoKICAgIC8qIFVwZGF0ZSBGdW5jdGlvbiAqLwogICAgdmFyIGxpbmUgPSBmdW5jdGlvbiBsaW5lKGNvbnRleHQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICB2YXIgZ3JhcGhzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1saW5lLWdyYXBocycpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIGdyYXBocyA9IGdyYXBocy5tZXJnZShncmFwaHMuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItbGluZS1ncmFwaHMnKSk7CgogICAgICB2YXIgZ3JhcGggPSBncmFwaHMuc2VsZWN0QWxsKCcuZDJiLWxpbmUtZ3JhcGgnKS5kYXRhKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIGdldEdyYXBocyhkLCBpKTsKICAgICAgfSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5rZXk7CiAgICAgIH0pOwoKICAgICAgdmFyIGdyYXBoRW50ZXIgPSBncmFwaC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1saW5lLWdyYXBoIGQyYi1ncmFwaCcpLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICBncmFwaEVudGVyLmFwcGVuZCgncGF0aCcpLmF0dHIoJ2NsYXNzJywgJ2QyYi1saW5lJykuc3R5bGUoJ3N0cm9rZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICAgIH0pLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgIC8vIG9uIGVudGVyZWQgZ3JhcGhzIGluaXRpYWxpemUgd2l0aCB0aGUgcHJlc2VydmVkIHNjYWxlcwogICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkKICAgICAgICB2YXIgZ3JhcGhzTm9kZSA9IHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLAogICAgICAgICAgICB4ID0gZ3JhcGhzTm9kZS5fX3NjYWxlWCwKICAgICAgICAgICAgeSA9IGdyYXBoc05vZGUuX19zY2FsZVk7CgogICAgICAgIHJldHVybiBnZXRQYXRoLmNhbGwodGhpcywgZCwgeCB8fCAkJC54LCB5IHx8ICQkLnkpOwogICAgICB9KTsKCiAgICAgIHZhciBncmFwaFVwZGF0ZSA9IGdyYXBoLm1lcmdlKGdyYXBoRW50ZXIpLm9yZGVyKCksCiAgICAgICAgICBncmFwaEV4aXQgPSBncmFwaC5leGl0KCk7CgogICAgICB2YXIgbGluZVVwZGF0ZSA9IGdyYXBoVXBkYXRlLnNlbGVjdCgnLmQyYi1saW5lJyk7CgogICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgZ3JhcGhVcGRhdGUgPSBncmFwaFVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIGdyYXBoRXhpdCA9IGdyYXBoRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIGxpbmVVcGRhdGUgPSBsaW5lVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CgogICAgICAgIHZhciBsaW5lRXhpdCA9IGdyYXBoRXhpdC5zdHlsZSgnb3BhY2l0eScsIDApLnNlbGVjdCgnLmQyYi1saW5lJyk7CiAgICAgICAgdmFyIHR3ZWVuRCA9IGZ1bmN0aW9uIHR3ZWVuRChkKSB7CiAgICAgICAgICB2YXIgc2V0dXBUb29sdGlwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKCiAgICAgICAgICB2YXIgbWF4WCA9IGQzLm1heChkLnZhbHVlcywgZnVuY3Rpb24gKGRkKSB7CiAgICAgICAgICAgIHJldHVybiBkZC54OwogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgbWluWCA9IGQzLm1pbihkLnZhbHVlcywgZnVuY3Rpb24gKGRkKSB7CiAgICAgICAgICAgIHJldHVybiBkZC54OwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gZDNJbnRlcnBvbGF0ZVBhdGguaW50ZXJwb2xhdGVQYXRoKHRoaXMuZ2V0QXR0cmlidXRlKCdkJyksIGdldFBhdGguY2FsbCh0aGlzLCBkLCAkJC54LCAkJC55LCBzZXR1cFRvb2x0aXApLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICByZXR1cm4gYS54ID09IG1heFggfHwgYS54ID09IG1pblg7CiAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICAvLyB1c2UgZDMtaW50ZXJwb2xhdGUtcGF0aCBpZiBhdmFpbGFibGUKICAgICAgICBpZiAodHlwZW9mIGQzSW50ZXJwb2xhdGVQYXRoLmludGVycG9sYXRlUGF0aCA9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgbGluZUV4aXQuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRQYXRoLmNhbGwodGhpcywgZCwgJCQueCwgJCQueSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGxpbmVVcGRhdGUuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRQYXRoLmNhbGwodGhpcywgZCwgJCQueCwgJCQueSwgdHJ1ZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGluZUV4aXQuYXR0clR3ZWVuKCdkJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIHR3ZWVuRC5jYWxsKHRoaXMsIGQpOwogICAgICAgICAgfSk7CiAgICAgICAgICBsaW5lVXBkYXRlLmF0dHJUd2VlbignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiB0d2VlbkQuY2FsbCh0aGlzLCBkLCB0cnVlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBsaW5lVXBkYXRlLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGdldFBhdGguY2FsbCh0aGlzLCBkLCAkJC54LCAkJC55LCB0cnVlKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZ3JhcGhVcGRhdGUuc3R5bGUoJ29wYWNpdHknLCAxKTsKCiAgICAgIC8vIHVwZGF0ZSBncmFwaCBhbm5vdGF0aW9ucwogICAgICBncmFwaFVwZGF0ZS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIGdyYXBoc05vZGUgPSB0aGlzLnBhcmVudE5vZGUsCiAgICAgICAgICAgIGdyYXBoID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICBhbGlnbiA9IGQuYWxpZ24sCiAgICAgICAgICAgIHggPSBncmFwaHNOb2RlLl9fc2NhbGVYIHx8ICQkLngsCiAgICAgICAgICAgIHkgPSBncmFwaHNOb2RlLl9fc2NhbGVZIHx8ICQkLnksCiAgICAgICAgICAgIGFubm90YXRpb25WYWx1ZXMgPSBkLnZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHsKICAgICAgICAgIHJldHVybiB2LmFubm90YXRpb247CiAgICAgICAgfSk7CgogICAgICAgIHZhciBhID0gZ3JhcGguc2VsZWN0QWxsKCcuZDJiLWxpbmUtYW5ub3RhdGlvbi1ncm91cCcpLmRhdGEoYW5ub3RhdGlvblZhbHVlcywgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgIHJldHVybiB2LmtleTsKICAgICAgICB9KSwKICAgICAgICAgICAgYUVudGVyID0gYS5lbnRlcigpLmFwcGVuZCgnZycpOwoKICAgICAgICBhRW50ZXIuYXR0cignY2xhc3MnLCAnZDJiLWxpbmUtYW5ub3RhdGlvbi1ncm91cCcpLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgKHgodi54KSArIGQuc2hpZnQpICsgJywgJyArIHkodlthbGlnbl0pICsgJyknOwogICAgICAgIH0pOwoKICAgICAgICB2YXIgYVVwZGF0ZSA9IGEubWVyZ2UoYUVudGVyKSwKICAgICAgICAgICAgYUV4aXQgPSBhLmV4aXQoKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgICAgYVVwZGF0ZSA9IGFVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIGFFeGl0ID0gYUV4aXQudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIGFVcGRhdGUuc3R5bGUoJ29wYWNpdHknLCAxKS5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAodikgewogICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArICgkJC54KHYueCkgKyBkLnNoaWZ0KSArICcsICcgKyAkJC55KHZbYWxpZ25dKSArICcpJzsKICAgICAgICB9KS5jYWxsKHVwZGF0ZSwgJCQuYW5ub3RhdGlvbiwgJ2QyYi1saW5lLWFubm90YXRpb24nKTsKCiAgICAgICAgYUV4aXQuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgIC8vIGpvaW4gdGhlIGV4aXRpbmcgYW5ub3RhdGlvbiB3aXRoIHRoZSB2YWx1ZSBpZiBpdCBzdGlsbCBleGlzdHMKICAgICAgICAgIHYgPSBkLnZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKG92KSB7CiAgICAgICAgICAgIHJldHVybiB2LmtleSA9PT0gb3Yua2V5OwogICAgICAgICAgfSlbMF0gfHwgdjsKICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyAoJCQueCh2LngpICsgZC5zaGlmdCkgKyAnLCAnICsgJCQueSh2W2FsaWduXSkgKyAnKSc7CiAgICAgICAgfSkuc3R5bGUoJ29wYWNpdHknLCAwKS5yZW1vdmUoKTsKICAgICAgfSk7CgogICAgICBncmFwaEV4aXQucmVtb3ZlKCkuc2VsZWN0QWxsKCcuZDJiLWxpbmUtYW5ub3RhdGlvbi1ncm91cCcpLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArICgkJC54KHYueCkgKyB2LmdyYXBoLnNoaWZ0KSArICcsICcgKyAkJC55KHZbdi5ncmFwaC5hbGlnbl0pICsgJyknOwogICAgICB9KTsKCiAgICAgIGxpbmVVcGRhdGUuc3R5bGUoJ3N0cm9rZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICAgIH0pOwoKICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHNjYWxlcyBzdGlja3kgb24gdGhlICdncmFwaHMnIG5vZGUKICAgICAgdmFyIHhDb3B5ID0gJCQueC5jb3B5KCksCiAgICAgICAgICB5Q29weSA9ICQkLnkuY29weSgpOwoKICAgICAgZ3JhcGhzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuX19zY2FsZVggPSB4Q29weTsKICAgICAgICB0aGlzLl9fc2NhbGVZID0geUNvcHk7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdzdmctbGluZS11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIGxpbmU7CiAgICB9OwoKICAgIHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aChkLCB4LCB5KSB7CiAgICAgIHZhciBzZXR1cFRvb2x0aXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlOwoKICAgICAgdmFyIHNoaWZ0ID0gZC5zaGlmdDsKICAgICAgaWYgKHNoaWZ0ID09PSBudWxsKSBzaGlmdCA9IHguYmFuZHdpZHRoID8geC5iYW5kd2lkdGgoKSAvIDIgOiAwOwoKICAgICAgaWYgKGQudG9vbHRpcEdyYXBoICYmIHNldHVwVG9vbHRpcCkgZC50b29sdGlwR3JhcGguZGF0YShkLnZhbHVlcykueChmdW5jdGlvbiAoZGQpIHsKICAgICAgICByZXR1cm4geChkZC54KSArIHNoaWZ0OwogICAgICB9KS55KGZ1bmN0aW9uIChkZCkgewogICAgICAgIHJldHVybiB5KGRkW2QuYWxpZ25dKTsKICAgICAgfSkuY29sb3IoZnVuY3Rpb24gKGRkKSB7CiAgICAgICAgcmV0dXJuIGRkLmNvbG9yOwogICAgICB9KTsKCiAgICAgICQkLmxpbmUueChmdW5jdGlvbiAoZGQpIHsKICAgICAgICByZXR1cm4geChkZC54KSArIHNoaWZ0OwogICAgICB9KS55KGZ1bmN0aW9uIChkZCkgewogICAgICAgIHJldHVybiB5KGRkW2QuYWxpZ25dKTsKICAgICAgfSk7CgogICAgICB2YXIgcGF0aCA9ICQkLmxpbmUoZC52YWx1ZXMpOwoKICAgICAgcmV0dXJuIGlzRmluaXRlUGF0aChwYXRoKSA/IHBhdGggOiB0aGlzLmdldEF0dHJpYnV0ZSgnZCcpOwogICAgfTsKCiAgICB2YXIgc3RhY2tlciA9IHN0YWNrKCkudmFsdWVzKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLnkoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLngoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pOwoKICAgIHZhciBzdGFja05lc3QgPSBkMy5uZXN0KCkua2V5KGZ1bmN0aW9uIChkKSB7CiAgICAgIHZhciBrZXkgPSBkLnN0YWNrQnk7CiAgICAgIHJldHVybiBrZXkgIT09IGZhbHNlICYmIGtleSAhPT0gbnVsbCA/IGtleSA6IGQyYmlkKCk7CiAgICB9KTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShsaW5lLCAkJCkuYWRkUHJvcCgnbGluZScsIGQzLmxpbmUoKSkuYWRkUHJvcCgnc3RhY2snLCBzdGFja2VyLnN0YWNrKCksIG51bGwsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBzdGFja2VyLnN0YWNrKGQpOwogICAgfSkuYWRkUHJvcCgneCcsIGQzLnNjYWxlTGluZWFyKCkpLmFkZFByb3AoJ3knLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCdhbm5vdGF0aW9uJywgZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24gPyBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbigpIDogbnVsbCkuYWRkUHJvcEdldCgndHlwZScsICdsaW5lJykuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBocycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkKICAgIC8vIGdyYXBoIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ2FsaWduJywgJ3kxJykuYWRkUHJvcEZ1bmN0b3IoJ3Rvb2x0aXBHcmFwaCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRvb2x0aXBHcmFwaDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzaGlmdCcsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdzdGFja0J5JywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pCiAgICAvLyBwb2ludHMgcHJvcHMKICAgIC5hZGRQcm9wRnVuY3RvcigncHgnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC54OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3B5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwY29sb3InLCBudWxsKS5hZGRQcm9wRnVuY3RvcigncGtleScsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHJldHVybiBpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3Bhbm5vdGF0aW9uJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuYW5ub3RhdGlvbjsKICAgIH0pCiAgICAvLyBtZXRob2RzCiAgICAuYWRkTWV0aG9kKCdnZXRDb21wdXRlZEdyYXBocycsIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgIHJldHVybiAoY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCkuZGF0YSgpLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIHJldHVybiBnZXRHcmFwaHMoZCwgaSk7CiAgICAgIH0pOwogICAgfSkuYWRkTWV0aG9kKCdnZXRWaXNpYmxlUG9pbnRzJywgZnVuY3Rpb24gKGNvbnRleHQpIHsKICAgICAgdmFyIGRhdGEgPSBsaW5lLmdldENvbXB1dGVkR3JhcGhzKGNvbnRleHQpOwogICAgICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24gKGdyYXBocykgewogICAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGdyYXBocy5tYXAoZnVuY3Rpb24gKGdyYXBoKSB7CiAgICAgICAgICByZXR1cm4gZ3JhcGgudmFsdWVzLm1hcChmdW5jdGlvbiAodikgewogICAgICAgICAgICByZXR1cm4geyB4OiB2LngsIHk6IHZbZ3JhcGguYWxpZ25dLCBncmFwaDogZ3JhcGggfTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgICAgfSlbMF07CiAgICB9KTsKCiAgICByZXR1cm4gbGluZTsKICB9CgogIC8vIGxpbmUgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIGFyZWEkMSAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICBmdW5jdGlvbiBnZXRHcmFwaHMoZCwgaSkgewogICAgICB2YXIgZ3JhcGhzID0gJCQuZ3JhcGhzKGQsIGkpLm1hcChmdW5jdGlvbiAoZ3JhcGgsIGkpIHsKICAgICAgICB2YXIgbmV3R3JhcGggPSB7CiAgICAgICAgICBkYXRhOiBncmFwaCwKICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgdG9vbHRpcEdyYXBoOiAkJC50b29sdGlwR3JhcGgoZ3JhcGgsIGkpLAogICAgICAgICAgc2hpZnQ6ICQkLnNoaWZ0KGdyYXBoLCBpKSwKICAgICAgICAgIHN0YWNrQnk6ICQkLnN0YWNrQnkoZ3JhcGgsIGkpLAogICAgICAgICAga2V5OiAkJC5rZXkoZ3JhcGgsIGkpLAogICAgICAgICAgY29sb3I6ICQkLmNvbG9yKGdyYXBoLCBpKQogICAgICAgIH07CiAgICAgICAgbmV3R3JhcGgudmFsdWVzID0gJCQudmFsdWVzKGdyYXBoLCBpKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICB2YXIgbmV3UG9pbnQgPSB7CiAgICAgICAgICAgIGRhdGE6IHBvaW50LAogICAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgICAgZ3JhcGg6IG5ld0dyYXBoLAogICAgICAgICAgICBrZXk6ICQkLnBrZXkocG9pbnQsIGkpLAogICAgICAgICAgICB4OiAkJC5weChwb2ludCwgaSksCiAgICAgICAgICAgIHk6ICQkLnB5KHBvaW50LCBpKSwKICAgICAgICAgICAgeTA6ICQkLnB5MChwb2ludCwgaSksCiAgICAgICAgICAgIGNvbG9yOiAkJC5wY29sb3IocG9pbnQsIGkpIHx8IG5ld0dyYXBoLmNvbG9yLAogICAgICAgICAgICBhbm5vdGF0aW9uczogJCQucGFubm90YXRpb25zKHBvaW50LCBpKQogICAgICAgICAgfTsKICAgICAgICAgIC8vIGluaXRpYWxpemUgeTEgYW5kIHkwICh0aGVzZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBzdGFjayBpZiBzdGFja2luZyBhcHBsaWVzKQogICAgICAgICAgbmV3UG9pbnQueTEgPSBuZXdQb2ludC55OwogICAgICAgICAgbmV3UG9pbnQueTAgPSBvcmVxKG5ld1BvaW50LnkwLCAwKTsKCiAgICAgICAgICByZXR1cm4gbmV3UG9pbnQ7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ld0dyYXBoOwogICAgICB9KTsKCiAgICAgIHN0YWNrTmVzdC5lbnRyaWVzKGdyYXBocykuZm9yRWFjaChmdW5jdGlvbiAoc2cpIHsKICAgICAgICBpZiAoc2cudmFsdWVzLmxlbmd0aCA+IDEpIHN0YWNrZXIoc2cudmFsdWVzKTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZ3JhcGhzOwogICAgfQoKICAgIC8qIFVwZGF0ZSBGdW5jdGlvbiAqLwogICAgdmFyIGFyZWEgPSBmdW5jdGlvbiBhcmVhKGNvbnRleHQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICB2YXIgZ3JhcGhzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1hcmVhLWdyYXBocycpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIGdyYXBocyA9IGdyYXBocy5tZXJnZShncmFwaHMuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXJlYS1ncmFwaHMnKSk7CgogICAgICB2YXIgZ3JhcGggPSBncmFwaHMuc2VsZWN0QWxsKCcuZDJiLWFyZWEtZ3JhcGgnKS5kYXRhKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIGdldEdyYXBocyhkLCBpKTsKICAgICAgfSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5rZXk7CiAgICAgIH0pOwoKICAgICAgdmFyIGdyYXBoRW50ZXIgPSBncmFwaC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1hcmVhLWdyYXBoIGQyYi1ncmFwaCcpLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICBncmFwaEVudGVyLmFwcGVuZCgncGF0aCcpLmF0dHIoJ2NsYXNzJywgJ2QyYi1hcmVhJykuc3R5bGUoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmNvbG9yOwogICAgICB9KS5hdHRyKCdkJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAvLyBvbiBlbnRlcmVkIGdyYXBocyBpbml0aWFsaXplIHdpdGggdGhlIHByZXNlcnZlZCBzY2FsZXMKICAgICAgICAvLyBpZiB0aGVyZSBhcmUgYW55CiAgICAgICAgdmFyIGdyYXBoc05vZGUgPSB0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZSwKICAgICAgICAgICAgeCA9IGdyYXBoc05vZGUuX19zY2FsZVgsCiAgICAgICAgICAgIHkgPSBncmFwaHNOb2RlLl9fc2NhbGVZOwoKICAgICAgICByZXR1cm4gZ2V0UGF0aC5jYWxsKHRoaXMsIGQsIHggfHwgJCQueCwgeSB8fCAkJC55KTsKICAgICAgfSk7CgogICAgICB2YXIgZ3JhcGhVcGRhdGUgPSBncmFwaC5tZXJnZShncmFwaEVudGVyKS5vcmRlcigpLAogICAgICAgICAgZ3JhcGhFeGl0ID0gZ3JhcGguZXhpdCgpOwoKICAgICAgdmFyIGFyZWFVcGRhdGUgPSBncmFwaFVwZGF0ZS5zZWxlY3QoJy5kMmItYXJlYScpOwoKICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgIGdyYXBoVXBkYXRlID0gZ3JhcGhVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICBncmFwaEV4aXQgPSBncmFwaEV4aXQudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICBhcmVhVXBkYXRlID0gYXJlYVVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgICB2YXIgYXJlYUV4aXQgPSBncmFwaEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKS5zZWxlY3QoJy5kMmItYXJlYScpOwogICAgICAgIHZhciB0d2VlbkQgPSBmdW5jdGlvbiB0d2VlbkQoZCkgewogICAgICAgICAgdmFyIHNldHVwVG9vbHRpcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CgogICAgICAgICAgdmFyIG1heFggPSBkMy5tYXgoZC52YWx1ZXMsIGZ1bmN0aW9uIChkZCkgewogICAgICAgICAgICByZXR1cm4gZGQueDsKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIG1pblggPSBkMy5taW4oZC52YWx1ZXMsIGZ1bmN0aW9uIChkZCkgewogICAgICAgICAgICByZXR1cm4gZGQueDsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGQzSW50ZXJwb2xhdGVQYXRoLmludGVycG9sYXRlUGF0aCh0aGlzLmdldEF0dHJpYnV0ZSgnZCcpLCBnZXRQYXRoLmNhbGwodGhpcywgZCwgJCQueCwgJCQueSwgc2V0dXBUb29sdGlwKSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgcmV0dXJuIGEueCA9PSBtYXhYIHx8IGEueCA9PSBtaW5YOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gdXNlIGQzLWludGVycG9sYXRlLXBhdGggaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKHR5cGVvZiBkM0ludGVycG9sYXRlUGF0aC5pbnRlcnBvbGF0ZVBhdGggPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIGFyZWFFeGl0LmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gZ2V0UGF0aC5jYWxsKHRoaXMsIGQsICQkLngsICQkLnkpOwogICAgICAgICAgfSk7CiAgICAgICAgICBhcmVhVXBkYXRlLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gZ2V0UGF0aC5jYWxsKHRoaXMsIGQsICQkLngsICQkLnksIHRydWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFyZWFFeGl0LmF0dHJUd2VlbignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiB0d2VlbkQuY2FsbCh0aGlzLCBkKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYXJlYVVwZGF0ZS5hdHRyVHdlZW4oJ2QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gdHdlZW5ELmNhbGwodGhpcywgZCwgdHJ1ZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJlYVVwZGF0ZS5hdHRyKCdkJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBnZXRQYXRoLmNhbGwodGhpcywgZCwgJCQueCwgJCQueSwgdHJ1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGdyYXBoVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CgogICAgICAvLyB1cGRhdGUgZ3JhcGggYW5ub3RhdGlvbnMKICAgICAgZ3JhcGhVcGRhdGUuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBncmFwaHNOb2RlID0gdGhpcy5wYXJlbnROb2RlLAogICAgICAgICAgICBncmFwaCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgeCA9IGdyYXBoc05vZGUuX19zY2FsZVggfHwgJCQueCwKICAgICAgICAgICAgeSA9IGdyYXBoc05vZGUuX19zY2FsZVkgfHwgJCQueTsKCiAgICAgICAgWyd5MCcsICd5MSddLmZvckVhY2goZnVuY3Rpb24gKGFsaWduKSB7CiAgICAgICAgICB2YXIgYW5ub3RhdGlvblZhbHVlcyA9IGQudmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikgewogICAgICAgICAgICByZXR1cm4gKHYuYW5ub3RhdGlvbnMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgIHJldHVybiBhLmxvY2F0aW9uID09PSBhbGlnbjsKICAgICAgICAgICAgfSkubGVuZ3RoOwogICAgICAgICAgfSk7CgogICAgICAgICAgdmFyIGEgPSBncmFwaC5zZWxlY3RBbGwoJy5kMmItYXJlYS1hbm5vdGF0aW9uLWdyb3VwLScgKyBhbGlnbikuZGF0YShhbm5vdGF0aW9uVmFsdWVzLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICByZXR1cm4gdi5rZXk7CiAgICAgICAgICB9KSwKICAgICAgICAgICAgICBhRW50ZXIgPSBhLmVudGVyKCkuYXBwZW5kKCdnJyk7CgogICAgICAgICAgYUVudGVyLmF0dHIoJ2NsYXNzJywgJ2QyYi1hcmVhLWFubm90YXRpb24tZ3JvdXAtJyArIGFsaWduKS5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgKHgodi54KSArIGQuc2hpZnQpICsgJywgJyArIHkodlthbGlnbl0pICsgJyknOwogICAgICAgICAgfSk7CgogICAgICAgICAgdmFyIGFVcGRhdGUgPSBhLm1lcmdlKGFFbnRlciksCiAgICAgICAgICAgICAgYUV4aXQgPSBhLmV4aXQoKTsKCiAgICAgICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIGFVcGRhdGUgPSBhVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICAgIGFFeGl0ID0gYUV4aXQudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBhVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSkuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArICgkJC54KHYueCkgKyBkLnNoaWZ0KSArICcsICcgKyAkJC55KHZbYWxpZ25dKSArICcpJzsKICAgICAgICAgIH0pLmNhbGwodXBkYXRlLCAkJC5hbm5vdGF0aW9uLCAnZDJiLWFyZWEtYW5ub3RhdGlvbicsIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgIHJldHVybiB2LmFubm90YXRpb25zLmZpbHRlcihmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgIHJldHVybiBhLmxvY2F0aW9uID09PSBhbGlnbjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBhRXhpdC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAvLyBqb2luIHRoZSBleGl0aW5nIGFubm90YXRpb24gd2l0aCB0aGUgdmFsdWUgaWYgaXQgc3RpbGwgZXhpc3RzCiAgICAgICAgICAgIHYgPSBkLnZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKG92KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHYua2V5ID09PSBvdi5rZXk7CiAgICAgICAgICAgIH0pWzBdIHx8IHY7CiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyAoJCQueCh2LngpICsgZC5zaGlmdCkgKyAnLCAnICsgJCQueSh2W2FsaWduXSkgKyAnKSc7CiAgICAgICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDApLnJlbW92ZSgpOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIGdyYXBoRXhpdC5yZW1vdmUoKTsKCiAgICAgIGdyYXBoRXhpdC5zZWxlY3RBbGwoJy5kMmItYXJlYS1hbm5vdGF0aW9uLWdyb3VwLXkwJykuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKHYpIHsKICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgKCQkLngodi54KSArIHYuZ3JhcGguc2hpZnQpICsgJywgJyArICQkLnkodi55MCkgKyAnKSc7CiAgICAgIH0pOwoKICAgICAgZ3JhcGhFeGl0LnNlbGVjdEFsbCgnLmQyYi1hcmVhLWFubm90YXRpb24tZ3JvdXAteTEnKS5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAodikgewogICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyAoJCQueCh2LngpICsgdi5ncmFwaC5zaGlmdCkgKyAnLCAnICsgJCQueSh2LnkxKSArICcpJzsKICAgICAgfSk7CgogICAgICBhcmVhVXBkYXRlLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5jb2xvcjsKICAgICAgfSk7CgogICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc2NhbGVzIHN0aWNreSBvbiB0aGUgJ2dyYXBocycgbm9kZQogICAgICB2YXIgeENvcHkgPSAkJC54LmNvcHkoKSwKICAgICAgICAgIHlDb3B5ID0gJCQueS5jb3B5KCk7CgogICAgICBncmFwaHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fX3NjYWxlWCA9IHhDb3B5OwogICAgICAgIHRoaXMuX19zY2FsZVkgPSB5Q29weTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ3N2Zy1hcmVhLXVwZGF0ZWQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CgogICAgICByZXR1cm4gYXJlYTsKICAgIH07CgogICAgdmFyIGdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKGQsIHgsIHkpIHsKICAgICAgdmFyIHNldHVwVG9vbHRpcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7CgoKICAgICAgdmFyIHNoaWZ0ID0gZC5zaGlmdDsKICAgICAgaWYgKHNoaWZ0ID09PSBudWxsKSBzaGlmdCA9IHguYmFuZHdpZHRoID8geC5iYW5kd2lkdGgoKSAvIDIgOiAwOwoKICAgICAgaWYgKGQudG9vbHRpcEdyYXBoICYmIHNldHVwVG9vbHRpcCkgZC50b29sdGlwR3JhcGguZGF0YShkLnZhbHVlcykueChmdW5jdGlvbiAocCkgewogICAgICAgIHJldHVybiB4KHAueCkgKyBzaGlmdDsKICAgICAgfSkueShmdW5jdGlvbiAocCkgewogICAgICAgIHJldHVybiB5KHAueTEpOwogICAgICB9KS5jb2xvcihmdW5jdGlvbiAocCkgewogICAgICAgIHJldHVybiBwLmNvbG9yOwogICAgICB9KTsKCiAgICAgICQkLmFyZWEueChmdW5jdGlvbiAocCkgewogICAgICAgIHJldHVybiB4KHAueCkgKyBzaGlmdDsKICAgICAgfSkueTAoZnVuY3Rpb24gKHApIHsKICAgICAgICByZXR1cm4geShwLnkwKTsKICAgICAgfSkueTEoZnVuY3Rpb24gKHApIHsKICAgICAgICByZXR1cm4geShwLnkxKTsKICAgICAgfSk7CgogICAgICB2YXIgcGF0aCA9ICQkLmFyZWEoZC52YWx1ZXMpOwoKICAgICAgcmV0dXJuIGlzRmluaXRlUGF0aChwYXRoKSA/IHBhdGggOiB0aGlzLmdldEF0dHJpYnV0ZSgnZCcpOwogICAgfTsKCiAgICB2YXIgc3RhY2tlciA9IHN0YWNrKCkudmFsdWVzKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLnkoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLngoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pOwoKICAgIHZhciBzdGFja05lc3QgPSBkMy5uZXN0KCkua2V5KGZ1bmN0aW9uIChkKSB7CiAgICAgIHZhciBrZXkgPSBkLnN0YWNrQnk7CiAgICAgIHJldHVybiBrZXkgIT09IGZhbHNlICYmIGtleSAhPT0gbnVsbCA/IGtleSA6IGQyYmlkKCk7CiAgICB9KTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShhcmVhLCAkJCkuYWRkUHJvcCgnYXJlYScsIGQzLmFyZWEoKSkuYWRkUHJvcCgnc3RhY2snLCBzdGFja2VyLnN0YWNrKCksIG51bGwsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBzdGFja2VyLnN0YWNrKGQpOwogICAgfSkuYWRkUHJvcCgneCcsIGQzLnNjYWxlTGluZWFyKCkpLmFkZFByb3AoJ3knLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCdhbm5vdGF0aW9uJywgZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24gPyBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbigpIDogbnVsbCkuYWRkUHJvcEdldCgndHlwZScsICdhcmVhJykuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBocycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkKICAgIC8vIGdyYXBoIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ3Rvb2x0aXBHcmFwaCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRvb2x0aXBHcmFwaDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzaGlmdCcsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdzdGFja0J5JywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pCiAgICAvLyBwb2ludHMgcHJvcHMKICAgIC5hZGRQcm9wRnVuY3RvcigncHgnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC54OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3B5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdweTAnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55MDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwY29sb3InLCBudWxsKS5hZGRQcm9wRnVuY3RvcigncGtleScsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHJldHVybiBpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3Bhbm5vdGF0aW9ucycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb25zOwogICAgfSkKICAgIC8vIG1ldGhvZHMKICAgIC5hZGRNZXRob2QoJ2dldENvbXB1dGVkR3JhcGhzJywgZnVuY3Rpb24gKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIChjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0KS5kYXRhKCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIGdldEdyYXBocyhkLCBpKTsKICAgICAgfSk7CiAgICB9KS5hZGRNZXRob2QoJ2dldFZpc2libGVQb2ludHMnLCBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICB2YXIgZGF0YSA9IGFyZWEuZ2V0Q29tcHV0ZWRHcmFwaHMoY29udGV4dCk7CiAgICAgIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbiAoZ3JhcGhzKSB7CiAgICAgICAgdmFyIHkwcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgZ3JhcGhzLm1hcChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgIHJldHVybiBncmFwaC52YWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgIHJldHVybiB7IHg6IHYueCwgeTogdi55MCwgZ3JhcGg6IGdyYXBoIH07CiAgICAgICAgICB9KTsKICAgICAgICB9KSk7CiAgICAgICAgdmFyIHkxcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgZ3JhcGhzLm1hcChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgIHJldHVybiBncmFwaC52YWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgIHJldHVybiB7IHg6IHYueCwgeTogdi55MSwgZ3JhcGg6IGdyYXBoIH07CiAgICAgICAgICB9KTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHkwcy5jb25jYXQoeTFzKTsKICAgICAgfSlbMF07CiAgICB9KTsKCiAgICByZXR1cm4gYXJlYTsKICB9CgogIC8vIHNjYXR0ZXIgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIHNjYXR0ZXIgKCkgewogICAgdmFyICQkID0ge307CgogICAgZnVuY3Rpb24gZ2V0R3JhcGhzKGQsIGkpIHsKICAgICAgdmFyIGdyYXBocyA9ICQkLmdyYXBocyhkLCBpKS5tYXAoZnVuY3Rpb24gKGdyYXBoLCBpKSB7CiAgICAgICAgdmFyIG5ld0dyYXBoID0gewogICAgICAgICAgZGF0YTogZ3JhcGgsCiAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgIGFsaWduOiAkJC5hbGlnbihncmFwaCwgaSksCiAgICAgICAgICB0b29sdGlwR3JhcGg6ICQkLnRvb2x0aXBHcmFwaChncmFwaCwgaSksCiAgICAgICAgICBzaGlmdDogJCQuc2hpZnQoZ3JhcGgsIGkpLAogICAgICAgICAgc3RhY2tCeTogJCQuc3RhY2tCeShncmFwaCwgaSksCiAgICAgICAgICBrZXk6ICQkLmtleShncmFwaCwgaSksCiAgICAgICAgICBjb2xvcjogJCQuY29sb3IoZ3JhcGgsIGkpLAogICAgICAgICAgc3ltYm9sOiAkJC5zeW1ib2woZ3JhcGgsIGkpCiAgICAgICAgfTsKICAgICAgICBuZXdHcmFwaC52YWx1ZXMgPSAkJC52YWx1ZXMoZ3JhcGgsIGkpLm1hcChmdW5jdGlvbiAocG9pbnQsIGkpIHsKICAgICAgICAgIHZhciBuZXdQb2ludCA9IHsKICAgICAgICAgICAgZGF0YTogcG9pbnQsCiAgICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgICBncmFwaDogbmV3R3JhcGgsCiAgICAgICAgICAgIHg6ICQkLnB4KHBvaW50LCBpKSwKICAgICAgICAgICAgeTogJCQucHkocG9pbnQsIGkpLAogICAgICAgICAgICBjb2xvcjogJCQucGNvbG9yKHBvaW50LCBpKSB8fCBuZXdHcmFwaC5jb2xvciwKICAgICAgICAgICAgc3ltYm9sOiAkJC5wc3ltYm9sKHBvaW50LCBpKSB8fCBuZXdHcmFwaC5zeW1ib2wsCiAgICAgICAgICAgIGtleTogJCQucGtleShwb2ludCwgaSksCiAgICAgICAgICAgIHNpemU6ICQkLnBzaXplKHBvaW50LCBpKSwKICAgICAgICAgICAgYW5ub3RhdGlvbjogJCQucGFubm90YXRpb24ocG9pbnQsIGkpCiAgICAgICAgICB9OwogICAgICAgICAgLy8gaW5pdGlhbGl6ZSB5IHZhbHVlcyAodGhlc2Ugd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgc3RhY2sgaWYgc3RhY2tpbmcgYXBwbGllcykKICAgICAgICAgIG5ld1BvaW50LnkxID0gbmV3UG9pbnQueTsKICAgICAgICAgIG5ld1BvaW50LnkwID0gMDsKICAgICAgICAgIHJldHVybiBuZXdQb2ludDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbmV3R3JhcGg7CiAgICAgIH0pOwoKICAgICAgc3RhY2tOZXN0LmVudHJpZXMoZ3JhcGhzKS5mb3JFYWNoKGZ1bmN0aW9uIChzZykgewogICAgICAgIGlmIChzZy52YWx1ZXMubGVuZ3RoID4gMSkgc3RhY2tlcihzZy52YWx1ZXMpOwogICAgICB9KTsKCiAgICAgIHJldHVybiBncmFwaHM7CiAgICB9CgogICAgLyogVXBkYXRlIEZ1bmN0aW9uICovCiAgICB2YXIgc2NhdHRlciA9IGZ1bmN0aW9uIHNjYXR0ZXIoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHZhciBncmFwaHMgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLXNjYXR0ZXItZ3JhcGhzJykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBbZF07CiAgICAgIH0pOwoKICAgICAgZ3JhcGhzID0gZ3JhcGhzLm1lcmdlKGdyYXBocy5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1zY2F0dGVyLWdyYXBocycpKTsKCiAgICAgIHZhciBncmFwaCA9IGdyYXBocy5zZWxlY3RBbGwoJy5kMmItc2NhdHRlci1ncmFwaCcpLmRhdGEoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhzKGQsIGkpOwogICAgICB9LCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmtleTsKICAgICAgfSk7CgogICAgICB2YXIgZ3JhcGhFbnRlciA9IGdyYXBoLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLXNjYXR0ZXItZ3JhcGggZDJiLWdyYXBoJykuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICAgIHZhciBncmFwaFVwZGF0ZSA9IGdyYXBoLm1lcmdlKGdyYXBoRW50ZXIpLm9yZGVyKCksCiAgICAgICAgICBncmFwaEV4aXQgPSBncmFwaC5leGl0KCk7CgogICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgZ3JhcGhVcGRhdGUgPSBncmFwaFVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIGdyYXBoRXhpdCA9IGdyYXBoRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgICBncmFwaEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKQogICAgICAgIC8vIHBvaW50cyBuZWVkcyB0byBiZSB0cmFuc2l0aW9uZWQgdG8gd2hlcmUgdGhlcmUgbmV3IGxvY2F0aW9ucyAid291bGQgYmUiCiAgICAgICAgLy8gaWYgdGhlIGdyYXBocyBoYWQgYmVlbiBpbmNsdWRlZAogICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgeCA9ICQkLngsCiAgICAgICAgICAgICAgeSA9ICQkLnk7CgogICAgICAgICAgdmFyIHBvaW50RXhpdCA9IGVsLnNlbGVjdEFsbCgnLmQyYi1zY2F0dGVyLXBvaW50Jyk7CgogICAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgcG9pbnRFeGl0ID0gcG9pbnRFeGl0LnRyYW5zaXRpb24oY29udGV4dCk7CgogICAgICAgICAgdmFyIHNoaWZ0ID0gZC5zaGlmdDsKICAgICAgICAgIGlmIChzaGlmdCA9PT0gbnVsbCkgc2hpZnQgPSB4LmJhbmR3aWR0aCA/IHguYmFuZHdpZHRoKCkgLyAyIDogMDsKCiAgICAgICAgICBwb2ludEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKS5jYWxsKHBvaW50VHJhbnNmb3JtLCB4LCB5LCBzaGlmdCwgZC5hbGlnbikucmVtb3ZlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGdyYXBoVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CgogICAgICBncmFwaEV4aXQucmVtb3ZlKCk7CgogICAgICBncmFwaFVwZGF0ZS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICB4ID0gJCQueCwKICAgICAgICAgICAgeSA9ICQkLnksCiAgICAgICAgICAgIGdyYXBoc05vZGUgPSB0aGlzLnBhcmVudE5vZGUsCiAgICAgICAgICAgIHByZVggPSBncmFwaHNOb2RlLl9fc2NhbGVYIHx8IHgsCiAgICAgICAgICAgIHByZVkgPSBncmFwaHNOb2RlLl9fc2NhbGVZIHx8IHk7CgogICAgICAgIHZhciBzaGlmdCA9IGQuc2hpZnQ7CiAgICAgICAgaWYgKHNoaWZ0ID09PSBudWxsKSBzaGlmdCA9IHguYmFuZHdpZHRoID8geC5iYW5kd2lkdGgoKSAvIDIgOiAwOwoKICAgICAgICB2YXIgcHJlU2hpZnQgPSBzaGlmdDsKICAgICAgICBpZiAocHJlU2hpZnQgPT09IG51bGwpIHNoaWZ0ID0gcHJlWC5iYW5kd2lkdGggPyBwcmVYLmJhbmR3aWR0aCgpIC8gMiA6IDA7CgogICAgICAgIGlmIChkLnRvb2x0aXBHcmFwaCkgZC50b29sdGlwR3JhcGguZGF0YShkLnZhbHVlcykueChmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuIHgocC54KSArIHNoaWZ0OwogICAgICAgIH0pLnkoZnVuY3Rpb24gKHApIHsKICAgICAgICAgIHJldHVybiB5KHAueSk7CiAgICAgICAgfSkuY29sb3IoZnVuY3Rpb24gKHApIHsKICAgICAgICAgIHJldHVybiBwLmNvbG9yOwogICAgICAgIH0pOwoKICAgICAgICAkJC5wb2ludC5maWxsKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICByZXR1cm4gcC5jb2xvcjsKICAgICAgICB9KS50eXBlKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICByZXR1cm4gcC5zeW1ib2w7CiAgICAgICAgfSkuc2l6ZShmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuIHAuc2l6ZTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHBvaW50ID0gZWwuc2VsZWN0QWxsKCcuZDJiLXNjYXR0ZXItcG9pbnQnKS5kYXRhKGQudmFsdWVzLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuIHAua2V5OwogICAgICAgIH0pOwogICAgICAgIHZhciBwb2ludEVudGVyID0gcG9pbnQuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItc2NhdHRlci1wb2ludCcpOwoKICAgICAgICB2YXIgcG9pbnRVcGRhdGUgPSBwb2ludC5tZXJnZShwb2ludEVudGVyKS5vcmRlcigpLAogICAgICAgICAgICBwb2ludEV4aXQgPSBwb2ludC5leGl0KCk7CgogICAgICAgIC8vIGRlZmluZSB0cmFuc2l0aW9ucyBpZiB0aGUgcGFyZW50IGNvbnRleHQgd2FzIGEgdHJhbnNpdGlvbgogICAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICAgIHBvaW50VXBkYXRlID0gcG9pbnRVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIHBvaW50RXhpdCA9IHBvaW50RXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgYmFuZCBzY2FsZSBpcyB1c2VkIGVudGVyIHBvaW50cyBhdCB0aGVpciBuZXcgbG9jYXRpb24KICAgICAgICBpZiAocHJlWC5iYW5kd2lkdGggfHwgcHJlWS5iYW5kd2lkdGggfHwgeC5iYW5kd2lkdGggfHwgeS5iYW5kd2lkdGgpIHsKICAgICAgICAgIHBvaW50RW50ZXIuY2FsbChwb2ludFRyYW5zZm9ybSwgeCwgeSwgc2hpZnQsIGQuYWxpZ24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwb2ludEVudGVyLmNhbGwocG9pbnRUcmFuc2Zvcm0sIHByZVgsIHByZVksIHByZVNoaWZ0LCBkLmFsaWduKTsKICAgICAgICB9CgogICAgICAgIC8vIGVudGVyIHVwZGF0ZSBleGl0IHBvaW50IGNvbmZpZ3VyYXRpb24KICAgICAgICBwb2ludEVudGVyLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICAgIHBvaW50VXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSkuY2FsbCgkJC5wb2ludCkuY2FsbChwb2ludFRyYW5zZm9ybSwgeCwgeSwgc2hpZnQsIGQuYWxpZ24pOwoKICAgICAgICBwb2ludEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKS5jYWxsKHBvaW50VHJhbnNmb3JtLCB4LCB5LCBzaGlmdCwgZC5hbGlnbikucmVtb3ZlKCk7CgogICAgICAgIC8vIHVwZGF0ZSBhbm5vdGF0aW9ucwogICAgICAgIHVwZGF0ZShwb2ludFVwZGF0ZSwgJCQuYW5ub3RhdGlvbiwgJ2QyYi1zY2F0dGVyLWFubm90YXRpb24nKTsKICAgICAgfSk7CgogICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc2NhbGVzIHN0aWNreSBvbiB0aGUgJ2dyYXBocycgbm9kZQogICAgICBncmFwaHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fX3NjYWxlWCA9ICQkLnguY29weSgpOwogICAgICAgIHRoaXMuX19zY2FsZVkgPSAkJC55LmNvcHkoKTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ3N2Zy1zY2F0dGVyLXVwZGF0ZWQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CgogICAgICByZXR1cm4gc2NhdHRlcjsKICAgIH07CgogICAgZnVuY3Rpb24gcG9pbnRUcmFuc2Zvcm0odHJhbnNpdGlvbiwgeCwgeSwgc2hpZnQsIGFsaWduKSB7CiAgICAgIHRyYW5zaXRpb24uYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKHApIHsKICAgICAgICB2YXIgeVBvcyA9IHkocFthbGlnbl0pLAogICAgICAgICAgICB4UG9zID0geChwLngpICsgc2hpZnQ7CiAgICAgICAgcmV0dXJuIGlzRmluaXRlKHhQb3MpICYmIGlzRmluaXRlKHlQb3MpID8gJ3RyYW5zbGF0ZSgnICsgW3hQb3MsIHlQb3NdICsgJyknIDogdGhpcy5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgc3RhY2tlciA9IHN0YWNrKCkudmFsdWVzKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLnkoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLngoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pOwoKICAgIHZhciBzdGFja05lc3QgPSBkMy5uZXN0KCkua2V5KGZ1bmN0aW9uIChkKSB7CiAgICAgIHZhciBrZXkgPSBkLnN0YWNrQnk7CiAgICAgIHJldHVybiBrZXkgIT09IGZhbHNlICYmIGtleSAhPT0gbnVsbCA/IGtleSA6IGQyYmlkKCk7CiAgICB9KTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShzY2F0dGVyLCAkJCkuYWRkUHJvcCgncG9pbnQnLCBwb2ludCgpLmFjdGl2ZSh0cnVlKSkuYWRkUHJvcCgnc3RhY2snLCBzdGFja2VyLnN0YWNrKCksIG51bGwsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBzdGFja2VyLnN0YWNrKGQpOwogICAgfSkuYWRkUHJvcCgneCcsIGQzLnNjYWxlTGluZWFyKCkpLmFkZFByb3AoJ3knLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCdhbm5vdGF0aW9uJywgZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24gPyBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbigpIDogbnVsbCkuYWRkUHJvcEdldCgndHlwZScsICdzY2F0dGVyJykuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBocycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkKICAgIC8vIGdyYXBoIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ2FsaWduJywgJ3kxJykuYWRkUHJvcEZ1bmN0b3IoJ3Rvb2x0aXBHcmFwaCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRvb2x0aXBHcmFwaDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzaGlmdCcsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdzdGFja0J5JywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzeW1ib2wnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkMy5zeW1ib2xDaXJjbGU7CiAgICB9KQogICAgLy8gcG9pbnRzIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ3B4JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdweScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigncGNvbG9yJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3BzeW1ib2wnLCBudWxsKS5hZGRQcm9wRnVuY3RvcigncGtleScsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHJldHVybiBpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3BzaXplJywgMjUpLmFkZFByb3BGdW5jdG9yKCdwYW5ub3RhdGlvbicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb247CiAgICB9KQogICAgLy8gbWV0aG9kcwogICAgLmFkZE1ldGhvZCgnZ2V0Q29tcHV0ZWRHcmFwaHMnLCBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICByZXR1cm4gKGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQpLmRhdGEoKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhzKGQsIGkpOwogICAgICB9KTsKICAgIH0pLmFkZE1ldGhvZCgnZ2V0VmlzaWJsZVBvaW50cycsIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgIHZhciBkYXRhID0gc2NhdHRlci5nZXRDb21wdXRlZEdyYXBocyhjb250ZXh0KTsKICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uIChncmFwaHMpIHsKICAgICAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBncmFwaHMubWFwKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgICAgcmV0dXJuIGdyYXBoLnZhbHVlcy5tYXAoZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgcmV0dXJuIHsgeDogdi54LCB5OiB2W2dyYXBoLmFsaWduXSwgZ3JhcGg6IGdyYXBoIH07CiAgICAgICAgICB9KTsKICAgICAgICB9KSk7CiAgICAgIH0pWzBdOwogICAgfSk7CgogICAgcmV0dXJuIHNjYXR0ZXI7CiAgfQoKICAvLyBiYXIgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIGJhciAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICBmdW5jdGlvbiBnZXRPcmllbnRNYXAob3JpZW50KSB7CiAgICAgIHJldHVybiBvcmllbnQgPT09ICdob3Jpem9udGFsJyA/IHsgcm90YXRlOiB0cnVlLCBweDogJ3B5JywgcHk6ICdweCcsIHg6ICd5JywgeTogJ3gnLCB3OiAnaGVpZ2h0JywgaDogJ3dpZHRoJyB9IDogeyByb3RhdGU6IGZhbHNlLCBweDogJ3B4JywgcHk6ICdweScsIHg6ICd4JywgeTogJ3knLCB3OiAnd2lkdGgnLCBoOiAnaGVpZ2h0JyB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEdyYXBocyhkLCBpKSB7CiAgICAgIHZhciBvcmllbnRNYXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGdldE9yaWVudE1hcCgkJC5vcmllbnQoZCwgaSkpOwoKCiAgICAgIHZhciBncmFwaHMgPSAkJC5ncmFwaHMoZCwgaSkubWFwKGZ1bmN0aW9uIChncmFwaCwgaSkgewoKICAgICAgICB2YXIgbmV3R3JhcGggPSB7CiAgICAgICAgICBkYXRhOiBncmFwaCwKICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgdG9vbHRpcEdyYXBoOiAkJC50b29sdGlwR3JhcGgoZ3JhcGgsIGkpLAogICAgICAgICAgc2hpZnQ6ICQkLnNoaWZ0KGdyYXBoLCBpKSwKICAgICAgICAgIHN0YWNrQnk6ICQkLnN0YWNrQnkoZ3JhcGgsIGkpLAogICAgICAgICAga2V5OiAkJC5rZXkoZ3JhcGgsIGkpLAogICAgICAgICAgY29sb3I6ICQkLmNvbG9yKGdyYXBoLCBpKQogICAgICAgIH07CiAgICAgICAgbmV3R3JhcGgudmFsdWVzID0gJCQudmFsdWVzKGdyYXBoLCBpKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBkYXRhOiBwb2ludCwKICAgICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICAgIGdyYXBoOiBuZXdHcmFwaCwKICAgICAgICAgICAga2V5OiAkJC5wa2V5KHBvaW50LCBpKSwKICAgICAgICAgICAgeDogJCQucHgocG9pbnQsIGkpLAogICAgICAgICAgICB5OiAkJC5weShwb2ludCwgaSksCiAgICAgICAgICAgIGNlbnRlcmVkOiAkJC5wY2VudGVyZWQocG9pbnQsIGkpLAogICAgICAgICAgICBjb2xvcjogJCQucGNvbG9yKHBvaW50LCBpKSB8fCBuZXdHcmFwaC5jb2xvciwKICAgICAgICAgICAgYW5ub3RhdGlvbjogJCQucGFubm90YXRpb24ocG9pbnQsIGkpCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXdHcmFwaDsKICAgICAgfSk7CgogICAgICBzdGFja2VyLngoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZFtvcmllbnRNYXAueF07CiAgICAgIH0pLnkoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZFtvcmllbnRNYXAueV07CiAgICAgIH0pOwogICAgICBzdGFja05lc3QuZW50cmllcyhncmFwaHMpLmZvckVhY2goZnVuY3Rpb24gKHNnLCBzaSkgewogICAgICAgIHJldHVybiBzdGFja2VyLm91dChidWlsZE91dChzaSkpKHNnLnZhbHVlcyk7CiAgICAgIH0pOwoKICAgICAgbW9kaWZ5QmFzZWxpbmUoZ3JhcGhzLCAkJC5iYXNlbGluZShkLCBpLCBbXS5jb25jYXQuYXBwbHkoW10sIGdyYXBocy5tYXAoZnVuY3Rpb24gKGcpIHsKICAgICAgICByZXR1cm4gZy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICByZXR1cm4gdi5leHRlbnRbMV07CiAgICAgICAgfSk7CiAgICAgIH0pKSkpOwoKICAgICAgcmV0dXJuIGdyYXBoczsKICAgIH0KCiAgICAvKiBVcGRhdGUgRnVuY3Rpb24gKi8KICAgIHZhciBiYXIgPSBmdW5jdGlvbiBiYXIoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHZhciBzY2FsZXMgPSB7IHg6ICQkLngsIHk6ICQkLnkgfTsKICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggc2VsZWN0aW9uIGVsZW1lbnQKICAgICAgc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICB2YXIgb3JpZW50ID0gJCQub3JpZW50KGQsIGkpLAogICAgICAgICAgICBvcmllbnRNYXAgPSBnZXRPcmllbnRNYXAob3JpZW50KSwKICAgICAgICAgICAgZ3JhcGhzID0gZ2V0R3JhcGhzKGQsIGksIG9yaWVudE1hcCksCiAgICAgICAgICAgIHggPSBzY2FsZXNbb3JpZW50TWFwLnhdLmNvcHkoKSwKICAgICAgICAgICAgX3kgPSBzY2FsZXNbb3JpZW50TWFwLnldLmNvcHkoKTsKCiAgICAgICAgdmFyIHBhZGRpbmcgPSAkJC5wYWRkaW5nKGQsIGkpLAogICAgICAgICAgICBncm91cFBhZGRpbmcgPSAkJC5ncm91cFBhZGRpbmcoZCwgaSksCiAgICAgICAgICAgIGJhbmR3aWR0aCA9ICQkLmJhbmR3aWR0aChkLCBpKTsKCiAgICAgICAgYmFuZHdpZHRoID0gKDEgLSBwYWRkaW5nKSAqIG9yZXEoYmFuZHdpZHRoIHx8IGdldEJhbmR3aWR0aCh4LCBncmFwaHMsIG9yaWVudE1hcCkpOwoKICAgICAgICB2YXIgc3RhY2tpbmcgPSBzdGFja05lc3QuZW50cmllcyhncmFwaHMpOwoKICAgICAgICB2YXIgYmFyV2lkdGggPSBiYW5kd2lkdGggLyBNYXRoLm1heCgxLCBzdGFja2luZy5sZW5ndGgpOwoKICAgICAgICBncm91cFBhZGRpbmcgPSBiYXJXaWR0aCAqIGdyb3VwUGFkZGluZzsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbSBzY2FsZXMKICAgICAgICB2YXIgYmFzZSA9IGdldEJhc2VTY2FsZSh4LCBiYW5kd2lkdGgsIGJhcldpZHRoLCBncm91cFBhZGRpbmcpLAogICAgICAgICAgICBleHRlbnQgPSBnZXRFeHRlbnRTY2FsZShfeSk7CgogICAgICAgIGJhcldpZHRoIC09IGdyb3VwUGFkZGluZyAqIDI7CgogICAgICAgIHZhciBncmFwaHNTVkcgPSBkMy5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCcuZDJiLWJhci1ncmFwaHMnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gW2RdOwogICAgICAgIH0pOwoKICAgICAgICBncmFwaHNTVkcgPSBncmFwaHNTVkcubWVyZ2UoZ3JhcGhzU1ZHLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJhci1ncmFwaHMnKSk7CgogICAgICAgIHZhciBncmFwaHNOb2RlID0gZ3JhcGhzU1ZHLm5vZGUoKSwKICAgICAgICAgICAgcHJlQmFzZSA9IGdyYXBoc05vZGUuX19zY2FsZUJhc2UgfHwgYmFzZSwKICAgICAgICAgICAgcHJlWSA9IGdyYXBoc05vZGUuX19zY2FsZVkgfHwgX3ksCiAgICAgICAgICAgIHByZVggPSBncmFwaHNOb2RlLl9fc2NhbGVYIHx8IHgsCiAgICAgICAgICAgIHByZUJhcldpZHRoID0gZ3JhcGhzTm9kZS5fX2JhcldpZHRoIHx8IGJhcldpZHRoOwoKICAgICAgICB2YXIgZ3JhcGggPSBncmFwaHNTVkcuc2VsZWN0QWxsKCcuZDJiLWJhci1ncmFwaCcpLmRhdGEoZ3JhcGhzLnNsaWNlKCkucmV2ZXJzZSgpLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICAgIH0pOwoKICAgICAgICB2YXIgZ3JhcGhFbnRlciA9IGdyYXBoLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJhci1ncmFwaCBkMmItZ3JhcGgnKTsKCiAgICAgICAgdmFyIGdyYXBoVXBkYXRlID0gZ3JhcGgubWVyZ2UoZ3JhcGhFbnRlcikub3JkZXIoKSwKICAgICAgICAgICAgZ3JhcGhFeGl0ID0gZ3JhcGguZXhpdCgpOwoKICAgICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgICBncmFwaFVwZGF0ZSA9IGdyYXBoVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBncmFwaEV4aXQgPSBncmFwaEV4aXQudHJhbnNpdGlvbihjb250ZXh0KTsKCiAgICAgICAgICBncmFwaEV4aXQuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgc2hpZnQgPSBkLnNoaWZ0OwogICAgICAgICAgICBpZiAoc2hpZnQgPT09IG51bGwpIHNoaWZ0ID0geC5iYW5kd2lkdGggPyB4LmJhbmR3aWR0aCgpIC8gMiA6IDA7CgogICAgICAgICAgICB2YXIgYmFyRXhpdCA9IGQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoJy5kMmItYmFyLWdyb3VwJykudHJhbnNpdGlvbihjb250ZXh0KTsKCiAgICAgICAgICAgIGlmIChwcmVYLmJhbmR3aWR0aCB8fCBwcmVZLmJhbmR3aWR0aCB8fCB4LmJhbmR3aWR0aCB8fCBfeS5iYW5kd2lkdGgpIHsKICAgICAgICAgICAgICAvLyBleGl0CiAgICAgICAgICAgICAgYmFyRXhpdC5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIGV4aXQKICAgICAgICAgICAgICBiYXJFeGl0LmNhbGwodXBkYXRlQmFycywgewogICAgICAgICAgICAgICAgb3BhY2l0eTogMCwKICAgICAgICAgICAgICAgIHg6IGZ1bmN0aW9uIHgocG9pbnQpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UocG9pbnQsIHNoaWZ0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB5OiBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gX3koMCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd2lkdGg6IGJhcldpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdyYXBoOiBkLAogICAgICAgICAgICAgICAgb3JpZW50TWFwOiBvcmllbnRNYXAKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBncmFwaEV4aXQucmVtb3ZlKCk7CgogICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBncmFwaCBjb250YWluZXJzCiAgICAgICAgZ3JhcGhVcGRhdGUuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgdmFyIGdyYXBoID0gZDMuc2VsZWN0KHRoaXMpOwoKICAgICAgICAgIHZhciBzaGlmdCA9IGQuc2hpZnQ7CiAgICAgICAgICBpZiAoc2hpZnQgPT09IG51bGwpIHNoaWZ0ID0geC5iYW5kd2lkdGggPyB4LmJhbmR3aWR0aCgpIC8gMiA6IDA7CgogICAgICAgICAgLy8gZW50ZXIgdXBkYXRlIGV4aXQgYmFycwogICAgICAgICAgdmFyIGJhciA9IGdyYXBoLnNlbGVjdEFsbCgnLmQyYi1iYXItZ3JvdXAnKS5kYXRhKGQudmFsdWVzLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICByZXR1cm4gdi5rZXk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBiYXJFbnRlciA9IGJhci5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1iYXItZ3JvdXAnKTsKICAgICAgICAgIGJhckVudGVyLmFwcGVuZCgncmVjdCcpOwogICAgICAgICAgYmFyRW50ZXIuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJhci1hbm5vdGF0aW9uLWdyb3VwJyk7CiAgICAgICAgICB2YXIgYmFyVXBkYXRlID0gYmFyLm1lcmdlKGJhckVudGVyKS5vcmRlcigpLAogICAgICAgICAgICAgIGJhckV4aXQgPSBiYXIuZXhpdCgpOwoKICAgICAgICAgIGlmIChkLnRvb2x0aXBHcmFwaCkgZC50b29sdGlwR3JhcGguZGF0YShkLnZhbHVlcylbb3JpZW50TWFwLnhdKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4geChwb2ludC5iYXNlKSArIHNoaWZ0OwogICAgICAgICAgfSlbb3JpZW50TWFwLnldKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gZXh0ZW50KHBvaW50KVsxXTsKICAgICAgICAgIH0pLmNvbG9yKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gcG9pbnQuY29sb3I7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIGJhclVwZGF0ZSA9IGJhclVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgICAgICBiYXJFeGl0ID0gYmFyRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgICAgfQoKICAgICAgICAgIGJhckVudGVyLmF0dHIoJ2NsYXNzJywgJ2QyYi1iYXItZ3JvdXAnKTsKCiAgICAgICAgICBiYXJFeGl0LnJlbW92ZSgpOwoKICAgICAgICAgIGlmIChwcmVYLmJhbmR3aWR0aCB8fCBwcmVZLmJhbmR3aWR0aCB8fCB4LmJhbmR3aWR0aCB8fCBfeS5iYW5kd2lkdGgpIHsKCiAgICAgICAgICAgIC8vIGVudGVyCiAgICAgICAgICAgIGJhckVudGVyLmNhbGwodXBkYXRlQmFycywgewogICAgICAgICAgICAgIG9wYWNpdHk6IDAsCiAgICAgICAgICAgICAgeDogZnVuY3Rpb24geChwb2ludCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UocG9pbnQsIHNoaWZ0KTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHk6IGZ1bmN0aW9uIHkoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3koMCk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB3aWR0aDogcHJlQmFyV2lkdGgsCiAgICAgICAgICAgICAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGdyYXBoOiBkLAogICAgICAgICAgICAgIG9yaWVudE1hcDogb3JpZW50TWFwCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gZXhpdAogICAgICAgICAgICBiYXJFeGl0LnN0eWxlKCdvcGFjaXR5JywgMCk7CiAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgLy8gZW50ZXIKICAgICAgICAgICAgYmFyRW50ZXIuY2FsbCh1cGRhdGVCYXJzLCB7CiAgICAgICAgICAgICAgb3BhY2l0eTogMCwKICAgICAgICAgICAgICB4OiBmdW5jdGlvbiB4KHBvaW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlQmFzZShwb2ludCwgc2hpZnQpOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgeTogZnVuY3Rpb24geSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcmVZKDApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgd2lkdGg6IHByZUJhcldpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZnVuY3Rpb24gaGVpZ2h0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBncmFwaDogZCwKICAgICAgICAgICAgICBvcmllbnRNYXA6IG9yaWVudE1hcAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIGV4aXQKICAgICAgICAgICAgYmFyRXhpdC5jYWxsKHVwZGF0ZUJhcnMsIHsKICAgICAgICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgICAgICAgIHg6IGZ1bmN0aW9uIHgocG9pbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlKHBvaW50LCBzaGlmdCk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB5OiBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF95KDApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgd2lkdGg6IGJhcldpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZnVuY3Rpb24gaGVpZ2h0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBncmFwaDogZCwKICAgICAgICAgICAgICBvcmllbnRNYXA6IG9yaWVudE1hcAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyB1cGRhdGUKICAgICAgICAgIGJhclVwZGF0ZS5jYWxsKHVwZGF0ZUJhcnMsIHsKICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgeDogZnVuY3Rpb24geChwb2ludCkgewogICAgICAgICAgICAgIHJldHVybiBiYXNlKHBvaW50LCBzaGlmdCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHk6IGZ1bmN0aW9uIHkocG9pbnQpIHsKICAgICAgICAgICAgICByZXR1cm4gZXh0ZW50LnNvcnRlZChwb2ludClbMF07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHdpZHRoOiBiYXJXaWR0aCwKICAgICAgICAgICAgaGVpZ2h0OiBmdW5jdGlvbiBoZWlnaHQoZCkgewogICAgICAgICAgICAgIHJldHVybiBleHRlbnQuc29ydGVkKGQpWzFdIC0gZXh0ZW50LnNvcnRlZChkKVswXTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ3JhcGg6IGQsCiAgICAgICAgICAgIG9yaWVudE1hcDogb3JpZW50TWFwCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHNjYWxlcyBzdGlja3kgb24gdGhlICdncmFwaHMnIG5vZGUKICAgICAgICBncmFwaHNOb2RlLl9fc2NhbGVZID0gX3k7CiAgICAgICAgZ3JhcGhzTm9kZS5fX3NjYWxlWCA9IHg7CiAgICAgICAgZ3JhcGhzTm9kZS5fX3NjYWxlQmFzZSA9IGJhc2U7CiAgICAgICAgZ3JhcGhzTm9kZS5fX2JhcldpZHRoID0gYmFyV2lkdGg7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdzdmctYmFyLXVwZGF0ZWQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CgogICAgICByZXR1cm4gYmFyOwogICAgfTsKCiAgICB2YXIgc3RhY2tlciA9IHN0YWNrKCkudmFsdWVzKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pOwoKICAgIHZhciBzdGFja05lc3QgPSBkMy5uZXN0KCkua2V5KGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnN0YWNrQnk7CiAgICB9KTsKCiAgICAvLyBjdXN0b20gc3RhY2tlciBidWlsZCBvdXQgdGhhdCBzZXBhcmF0ZXMgdGhlIG5lZ2F0aXZlIGFuZCBwb3NzaXRpdmUgYmFycwogICAgZnVuY3Rpb24gYnVpbGRPdXQoc3RhY2tJbmRleCkgewogICAgICB2YXIgb2Zmc2V0cyA9IHt9OwogICAgICByZXR1cm4gZnVuY3Rpb24gKGQsIHkwLCB5MSwgeCkgewogICAgICAgIHZhciBvZmZzZXQgPSBvZmZzZXRzW3hdID0gb2Zmc2V0c1t4XSB8fCBbMCwgMF07CgogICAgICAgIGQuZHkgPSB5MSAtIHkwOwogICAgICAgIGQuc3RhY2tJbmRleCA9IHN0YWNrSW5kZXg7CiAgICAgICAgZC5iYXNlID0geDsKICAgICAgICBpZiAoZC5keSA+IDApIGQuZXh0ZW50ID0gW29mZnNldFswXSwgb2Zmc2V0WzBdICs9IGQuZHldO2Vsc2UgZC5leHRlbnQgPSBbb2Zmc2V0WzFdLCBvZmZzZXRbMV0gKz0gZC5keV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlQmFycyhiYXJzLCBvcHRpb25zKSB7CiAgICAgIGJhcnMuc3R5bGUoJ29wYWNpdHknLCBvcHRpb25zLm9wYWNpdHkpLmNhbGwodHJhbnNmb3JtQmFyLCBvcHRpb25zKS5zZWxlY3QoJ3JlY3QnKS5hdHRyKCdmaWxsJywgZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgcmV0dXJuIHBvaW50LmNvbG9yOwogICAgICB9KS5hdHRyKG9wdGlvbnMub3JpZW50TWFwLncsIG9wdGlvbnMud2lkdGgpLmF0dHIob3B0aW9ucy5vcmllbnRNYXAuaCwgb3B0aW9ucy5oZWlnaHQpOwoKICAgICAgYmFycy5zZWxlY3QoJy5kMmItYmFyLWFubm90YXRpb24tZ3JvdXAnKS5jYWxsKHRyYW5zZm9ybUFubm90YXRpb25Hcm91cCwgb3B0aW9ucykuY2FsbCh1cGRhdGUsICQkLmFubm90YXRpb24sICdkMmItYmFyLWFubm90YXRpb24nKTsKICAgIH0KCiAgICAvLyB0cmFuc2Zvcm0gYmFyIHBvc2l0aW9uCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1CYXIodHJhbnNpdGlvbiwgb3B0aW9ucykgewogICAgICB0cmFuc2l0aW9uLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIHhQb3MgPSBvcHRpb25zW29wdGlvbnMub3JpZW50TWFwLnhdKGQpLAogICAgICAgICAgICB5UG9zID0gb3B0aW9uc1tvcHRpb25zLm9yaWVudE1hcC55XShkKTsKICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgW3hQb3MsIHlQb3NdICsgJyknOwogICAgICB9KTsKICAgIH0KCiAgICAvLyB0cmFuc2Zvcm0gYW5ub3RhdGlvbiBncm91cCBwb3NpdGlvbgogICAgZnVuY3Rpb24gdHJhbnNmb3JtQW5ub3RhdGlvbkdyb3VwKHRyYW5zaXRpb24sIG9wdGlvbnMpIHsKICAgICAgdHJhbnNpdGlvbi5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBwb3MgPSB7IHg6IG9wdGlvbnMud2lkdGggLyAyLCB5OiBkLmV4dGVudFswXSA8IGQuZXh0ZW50WzFdID8gMCA6IG9wdGlvbnMuaGVpZ2h0KGQpIH07CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIFtwb3Nbb3B0aW9ucy5vcmllbnRNYXAueF0sIHBvc1tvcHRpb25zLm9yaWVudE1hcC55XV0gKyAnKSc7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJhc2VTY2FsZSh4LCBiYW5kd2lkdGgsIGJhcldpZHRoLCBncm91cFBhZGRpbmcpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwb2ludCwgc2hpZnQpIHsKICAgICAgICB2YXIgYmFyU2hpZnQgPSBwb2ludC5jZW50ZXJlZCA/IHNoaWZ0IC0gYmFuZHdpZHRoIC8gNCA6IHNoaWZ0IC0gYmFuZHdpZHRoIC8gMiArIHBvaW50LnN0YWNrSW5kZXggKiBiYXJXaWR0aCArIGdyb3VwUGFkZGluZzsKICAgICAgICByZXR1cm4geChwb2ludC5iYXNlKSArIGJhclNoaWZ0OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEV4dGVudFNjYWxlKHkpIHsKICAgICAgdmFyIHNjYWxlID0gZnVuY3Rpb24gc2NhbGUocG9pbnQpIHsKICAgICAgICByZXR1cm4gW3kocG9pbnQuZXh0ZW50WzBdKSwgeShwb2ludC5leHRlbnRbMV0pXTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnNvcnRlZCA9IGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgIHJldHVybiBzY2FsZShwb2ludCkuc2xpY2UoKS5zb3J0KGQzLmFzY2VuZGluZyk7CiAgICAgIH07CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgLy8gZmluZCBjbG9zZXMgbm9uIGVxdWFsIHBvaW50IHBpeGVsIGRpc3RhbmNlIG9uIHRoZSBiYXNlIGF4aXMKICAgIGZ1bmN0aW9uIGdldEJhbmR3aWR0aCh4LCBncmFwaHMsIG9yaWVudE1hcCkgewogICAgICB2YXIgeFZhbHMgPSBbXSwKICAgICAgICAgIGJhbmR3aWR0aCA9IEluZmluaXR5OwogICAgICBncmFwaHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICB2YXIgdmFsdWVzID0gZ3JhcGgudmFsdWVzLAogICAgICAgICAgICByYW5nZSA9IHgucmFuZ2UoKTsKCiAgICAgICAgYmFuZHdpZHRoID0gTWF0aC5taW4oYmFuZHdpZHRoLCBNYXRoLmFicyhyYW5nZVsxXSAtIHJhbmdlWzBdKSk7CgogICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgeFZhbHMucHVzaCh4KHBvaW50W29yaWVudE1hcC54XSkpOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHhWYWxzLnNvcnQoZDMuYXNjZW5kaW5nKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgaWYgKHhWYWxzW2kgKyAxXSA9PT0geFZhbHNbaV0pIGNvbnRpbnVlOwogICAgICAgIGJhbmR3aWR0aCA9IE1hdGgubWluKHhWYWxzW2kgKyAxXSAtIHhWYWxzW2ldLCBiYW5kd2lkdGgpOwogICAgICB9CgogICAgICByZXR1cm4gYmFuZHdpZHRoID09PSBJbmZpbml0eSA/IDAgOiBiYW5kd2lkdGg7CiAgICB9CgogICAgZnVuY3Rpb24gbW9kaWZ5QmFzZWxpbmUoZ3JhcGhzLCBiYXNlbGluZSkgewogICAgICAvLyBpZiBiYXNlbGluZSBpcyBudWxsIGZpbmQgaXQgZHluYW1pY2FsbHkKICAgICAgaWYgKGJhc2VsaW5lID09PSBudWxsKSB7CiAgICAgICAgdmFyIHZhbHVlcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgZ3JhcGhzLm1hcChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQudmFsdWVzOwogICAgICAgIH0pKTsKICAgICAgICB2YXIgcmFuZ2UgPSBkMy5leHRlbnQodmFsdWVzLm1hcChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQuZXh0ZW50WzFdOwogICAgICAgIH0pKTsKCiAgICAgICAgaWYgKHJhbmdlWzFdIDwgMCkgYmFzZWxpbmUgPSByYW5nZVsxXTtlbHNlIGlmIChyYW5nZVswXSA+IDApIGJhc2VsaW5lID0gcmFuZ2VbMF07ZWxzZSBiYXNlbGluZSA9IDA7CiAgICAgIH0KCiAgICAgIGdyYXBocy5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgIGdyYXBoLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlLmV4dGVudFswXSkgPCBNYXRoLmFicyhiYXNlbGluZSkpIHsKICAgICAgICAgICAgdmFsdWUuZXh0ZW50WzBdID0gYmFzZWxpbmU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIC8qIEluaGVyaXQgZnJvbSBiYXNlIG1vZGVsICovCiAgICBiYXNlKGJhciwgJCQpLmFkZFByb3AoJ3gnLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCd5JywgZDMuc2NhbGVMaW5lYXIoKSkuYWRkUHJvcCgnYW5ub3RhdGlvbicsIGQzU3ZnQW5ub3RhdGlvbi5hbm5vdGF0aW9uID8gZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24oKSA6IG51bGwpLmFkZFByb3BHZXQoJ3R5cGUnLCAnYmFyJykuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBocycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3BhZGRpbmcnLCAwLjUpLmFkZFByb3BGdW5jdG9yKCdncm91cFBhZGRpbmcnLCAwKS5hZGRQcm9wRnVuY3RvcignYmFuZHdpZHRoJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2Jhc2VsaW5lJywgMCkKICAgIC8vIGdyYXBoIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ3Rvb2x0aXBHcmFwaCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRvb2x0aXBHcmFwaDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdvcmllbnQnLCAndmVydGljYWwnKS5hZGRQcm9wRnVuY3Rvcignc2hpZnQnLCBudWxsKS5hZGRQcm9wRnVuY3Rvcignc3RhY2tCeScsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHJldHVybiBpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0sIG51bGwpLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pCiAgICAvLyBwb2ludCBwcm9wcwogICAgLmFkZFByb3BGdW5jdG9yKCdweCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLng7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigncHknLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3BjZW50ZXJlZCcsIGZhbHNlKS5hZGRQcm9wRnVuY3RvcigncGNvbG9yJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3BrZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwYW5ub3RhdGlvbicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb247CiAgICB9KQogICAgLy8gbWV0aG9kcwogICAgLmFkZE1ldGhvZCgnZ2V0Q29tcHV0ZWRHcmFwaHMnLCBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICByZXR1cm4gKGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQpLmRhdGEoKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhzKGQsIGkpOwogICAgICB9KTsKICAgIH0pLmFkZE1ldGhvZCgnZ2V0VmlzaWJsZVBvaW50cycsIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgIHJldHVybiAoY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCkuZGF0YSgpLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIHZhciBvcmllbnQgPSAkJC5vcmllbnQoZCwgaSksCiAgICAgICAgICAgIG9yaWVudE1hcCA9IGdldE9yaWVudE1hcChvcmllbnQpLAogICAgICAgICAgICBncmFwaHMgPSBnZXRHcmFwaHMoZCwgaSwgb3JpZW50TWFwKTsKCiAgICAgICAgdmFyIGV4dGVudDAgPSBbXS5jb25jYXQuYXBwbHkoW10sIGdyYXBocy5tYXAoZnVuY3Rpb24gKGdyYXBoKSB7CiAgICAgICAgICByZXR1cm4gZ3JhcGgudmFsdWVzLm1hcChmdW5jdGlvbiAodikgewogICAgICAgICAgICB2YXIgcG9pbnQgPSB7fTsKICAgICAgICAgICAgcG9pbnRbJycgKyBvcmllbnRNYXAueF0gPSB2LmJhc2U7CiAgICAgICAgICAgIHBvaW50WycnICsgb3JpZW50TWFwLnldID0gdi5leHRlbnRbMF07CiAgICAgICAgICAgIHBvaW50LmdyYXBoID0gZ3JhcGg7CiAgICAgICAgICAgIHJldHVybiBwb2ludDsKICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgICAgICB2YXIgZXh0ZW50MSA9IFtdLmNvbmNhdC5hcHBseShbXSwgZ3JhcGhzLm1hcChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgIHJldHVybiBncmFwaC52YWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgIHZhciBwb2ludCA9IHt9OwogICAgICAgICAgICBwb2ludFsnJyArIG9yaWVudE1hcC54XSA9IHYuYmFzZTsKICAgICAgICAgICAgcG9pbnRbJycgKyBvcmllbnRNYXAueV0gPSB2LmV4dGVudFsxXTsKICAgICAgICAgICAgcG9pbnQuZ3JhcGggPSBncmFwaDsKICAgICAgICAgICAgcmV0dXJuIHBvaW50OwogICAgICAgICAgfSk7CiAgICAgICAgfSkpOwoKICAgICAgICByZXR1cm4gZXh0ZW50MC5jb25jYXQoZXh0ZW50MSk7CiAgICAgIH0pWzBdOwogICAgfSk7CgogICAgcmV0dXJuIGJhcjsKICB9CgogIC8vb3JpZ2luYWwgc3RhY2tpbmcgZnVuY3Rpb24sIG1pZ2h0IHJldmVydCB0byB0aGlzIG9uZSBpbnN0ZWFkIG9mIGQzIHN0YWNrIGxheW91dCBpbiB0aGUgZnV0dXJlCiAgLy8gLy8gY3JlYXRlIHN0YWNrIGxheW91dCBiYXNlZCBvbiAkJC5zdGFjayBrZXkgYWNjZXNzb3IKICAvLyBjb25zdCBzdGFja2luZyA9IHN0YWNrTmVzdC5lbnRyaWVzKGRhdGEpOwogIC8vIGNvbnN0IGJhbmR3aWR0aCA9ICgxIC0gJCQucGFkZGluZy5jYWxsKHRoaXMsIGRhdGEsIGkpKSAqICgkJC5iYW5kd2lkdGguY2FsbCh0aGlzLCBkYXRhLCBpKSB8fCBnZXRCYW5kd2lkdGgoZGF0YSwgb3JpZW50KSk7CiAgLy8gY29uc3QgYmFyV2lkdGggPSBiYW5kd2lkdGggLyBzdGFja2luZy5sZW5ndGg7CiAgLy8gY29uc3QgZ3JvdXBQYWRkaW5nID0gYmFyV2lkdGggKiAkJC5ncm91cFBhZGRpbmcuY2FsbCh0aGlzLCBkYXRhLCBpKTsKICAvLwogIC8vIHN0YWNraW5nLmZvckVhY2goKHN0YWNrLCBzdGFja0luZGV4KSA9PiB7CiAgLy8gICAvLyBncm91cCB2YWx1ZXMgaW4gdGhpcyBzdGFjayBieSBwb3NpdGl2ZSAnc3AnIGFuZCBuZWdhdGl2ZSAnc24nIHZhbHVlcwogIC8vICAgY29uc3Qgc3AgPSB7fSwgc24gPSB7fTsKICAvLwogIC8vICAgc3RhY2sudmFsdWVzLmZvckVhY2goKGdyYXBoLCBncmFwaEluZGV4KSA9PiB7CiAgLy8gICAgIGdyYXBoSW5kZXggPSBkYXRhLmluZGV4T2YoZ3JhcGgpOwogIC8vICAgICBjb25zdCB2YWx1ZXMgPSAkJC52YWx1ZXMuY2FsbChkYXRhLCBncmFwaCwgZ3JhcGhJbmRleCksCiAgLy8gICAgICAgICAgIHggPSAkJFtvcmllbnQueF0uY2FsbChkYXRhLCBncmFwaCwgZ3JhcGhJbmRleCksCiAgLy8gICAgICAgICAgIHkgPSAkJFtvcmllbnQueV0uY2FsbChkYXRhLCBncmFwaCwgZ3JhcGhJbmRleCksCiAgLy8gICAgICAgICAgIG9mZnNldCA9ICQkLm9mZnNldC5jYWxsKGRhdGEsIGdyYXBoLCBncmFwaEluZGV4KSB8fCAoeC5yYW5nZUJhbmQpPyB4LnJhbmdlQmFuZCgpIC8gMiA6IDA7CiAgLy8gICAgIHZhbHVlcy5mb3JFYWNoKChkLCBpKSA9PiB7CiAgLy8gICAgICAgY29uc3QgcHggPSAkJFtvcmllbnQucHhdLmNhbGwoZ3JhcGgsIGQsIGkpLAogIC8vICAgICAgICAgICAgIHB5ID0gJCRbb3JpZW50LnB5XS5jYWxsKGdyYXBoLCBkLCBpKSwKICAvLyAgICAgICAgICAgICBiYXJPZmZzZXQgPSBvZmZzZXQgLSBiYW5kd2lkdGggLyAyICsgc3RhY2tJbmRleCAqIGJhcldpZHRoICsgZ3JvdXBQYWRkaW5nOwogIC8vCiAgLy8gICAgICAgZC5iYXNlID0geChweCkgKyBiYXJPZmZzZXQ7CiAgLy8gICAgICAgaWYgKHB5ID4gMCkgZC5leHRlbnQgPSBbeShzcFtweF0gPSBzcFtweF0gfHwgMCksIHkoc3BbcHhdID0gc3BbcHhdICsgcHkpXTsKICAvLyAgICAgICBlbHNlIGQuZXh0ZW50ID0gW3koc25bcHhdID0gc25bcHhdIHx8IDApLCB5KHNuW3B4XSA9IHNuW3B4XSArIHB5KV07CiAgLy8gICAgICAgZC5leHRlbnQuc29ydChkMy5hc2NlbmRpbmcpOwogIC8vICAgICB9KTsKICAvLyAgIH0pOwogIC8vIH0pOwoKICAvLyBjcmVhdGVzIGEgYm94IGFuZCB3aGlza2VyIHNldCBmb3IgYm94IHBsb3RzCgogIC8vIGJveCBzdmcgZ2VuZXJhdG9yCiAgZnVuY3Rpb24gYm94ICgpIHsKICAgIHZhciAkJCA9IHt9OwoKICAgIC8qIFVwZGF0ZSBGdW5jdGlvbiAqLwogICAgdmFyIGJveCA9IGZ1bmN0aW9uIGJveChjb250ZXh0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0LAogICAgICAgICAgc2NhbGUgPSAkJC5zY2FsZSwKICAgICAgICAgIGVudGVyU2NhbGUgPSAkJC5lbnRlclNjYWxlIHx8IHNjYWxlLAogICAgICAgICAgdmFsdWVGb3JtYXQgPSAkJC52YWx1ZUZvcm1hdCwKICAgICAgICAgIHZlcnRpY2FsID0gJCQub3JpZW50ID09PSAndmVydGljYWwnLAogICAgICAgICAgb3JpZW50ID0gdmVydGljYWwgPyB7IHg6ICd4JywgeTogJ3knLCB4MTogJ3gxJywgeDI6ICd4MicsIHkxOiAneTEnLCB5MjogJ3kyJywgd2lkdGg6ICd3aWR0aCcsIGhlaWdodDogJ2hlaWdodCcsIGN4OiAnY3gnLCBjeTogJ2N5JywgdHJhbnNsYXRlOiBmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSkgewogICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHggKyAnLCAnICsgeSArICcpJzsKICAgICAgICB9IH0gOiB7IHg6ICd5JywgeTogJ3gnLCB4MTogJ3kxJywgeDI6ICd5MicsIHkxOiAneDEnLCB5MjogJ3gyJywgd2lkdGg6ICdoZWlnaHQnLCBoZWlnaHQ6ICd3aWR0aCcsIGN4OiAnY3knLCBjeTogJ2N4JywgdHJhbnNsYXRlOiBmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSkgewogICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHkgKyAnLCAnICsgeCArICcpJzsKICAgICAgICB9IH07CgogICAgICAvLyBzZXR1cCBib3gtZ3JvdXAgYW5kIGV4dHJhY3QgYWxsIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzCiAgICAgIHZhciBncm91cCA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy5kMmItYm94JykuZGF0YShmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIGQgPSAkJC5kYXRhKGQsIGkpOwoKICAgICAgICB2YXIgb3V0bGllcnMgPSAkJC5vdXRsaWVycyhkLCBpKSB8fCBbXSwKICAgICAgICAgICAgbWluaW11bSA9ICQkLm1pbmltdW0oZCwgaSksCiAgICAgICAgICAgIG1heGltdW0gPSAkJC5tYXhpbXVtKGQsIGkpOwoKICAgICAgICByZXR1cm4gW3sKICAgICAgICAgIGRhdGE6IGQsCiAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgIG1lZGlhbjogJCQubWVkaWFuKGQsIGkpLAogICAgICAgICAgdXBwZXJRdWFydGlsZTogJCQudXBwZXJRdWFydGlsZShkLCBpKSwKICAgICAgICAgIGxvd2VyUXVhcnRpbGU6ICQkLmxvd2VyUXVhcnRpbGUoZCwgaSksCiAgICAgICAgICBtaW5pbXVtOiBtaW5pbXVtLAogICAgICAgICAgbWF4aW11bTogbWF4aW11bSwKICAgICAgICAgIG91dGxpZXJzOiBvdXRsaWVycywKICAgICAgICAgIG1heE91dGxpZXJzOiBvdXRsaWVycy5maWx0ZXIoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGQgPiBtYXhpbXVtOwogICAgICAgICAgfSksCiAgICAgICAgICBtaW5PdXRsaWVyczogb3V0bGllcnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkIDwgbWluaW11bTsKICAgICAgICAgIH0pLAogICAgICAgICAgY29sb3I6ICQkLmNvbG9yKGQsIGkpLAogICAgICAgICAgd2lkdGg6ICQkLndpZHRoKGQsIGkpLAogICAgICAgICAgYW5ub3RhdGlvbnM6ICQkLmFubm90YXRpb25zKGQsIGkpCiAgICAgICAgfV07CiAgICAgIH0pOwogICAgICB2YXIgZ3JvdXBFbnRlciA9IGdyb3VwLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJveCcpOwogICAgICB2YXIgZ3JvdXBVcGRhdGUgPSBncm91cC5tZXJnZShncm91cEVudGVyKS5vcmRlcigpOwoKICAgICAgLy8gc2V0dXAgYm94LWNlbnRlcgogICAgICB2YXIgY2VudGVyID0gZ3JvdXBVcGRhdGUuc2VsZWN0QWxsKCcuZDJiLWJveC1jZW50ZXInKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgfSk7CiAgICAgIHZhciBjZW50ZXJFbnRlciA9IGNlbnRlci5lbnRlcigpLmFwcGVuZCgnbGluZScpLmF0dHIob3JpZW50LngxLCAwKS5hdHRyKG9yaWVudC54MiwgMCkuYXR0cihvcmllbnQueTEsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGVudGVyU2NhbGUoZC5taW5pbXVtKTsKICAgICAgfSkuYXR0cihvcmllbnQueTIsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGVudGVyU2NhbGUoZC5tYXhpbXVtKTsKICAgICAgfSkuYXR0cignY2xhc3MnLCAnZDJiLWJveC1jZW50ZXInKTsKICAgICAgdmFyIGNlbnRlclVwZGF0ZSA9IGNlbnRlci5tZXJnZShjZW50ZXJFbnRlcik7CgogICAgICAvLyBzZXR1cCBib3gtcmVjdAogICAgICB2YXIgcmVjdCA9IGdyb3VwVXBkYXRlLnNlbGVjdEFsbCgnLmQyYi1ib3gtcmVjdCcpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKICAgICAgdmFyIHJlY3RFbnRlciA9IHJlY3QuZW50ZXIoKS5hcHBlbmQoJ3JlY3QnKS5hdHRyKCdjbGFzcycsICdkMmItYm94LXJlY3QnKS5hdHRyKG9yaWVudC53aWR0aCwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC53aWR0aDsKICAgICAgfSkuYXR0cihvcmllbnQuaGVpZ2h0LCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBNYXRoLmFicyhlbnRlclNjYWxlKGQudXBwZXJRdWFydGlsZSkgLSBlbnRlclNjYWxlKGQubG93ZXJRdWFydGlsZSkpOwogICAgICB9KS5hdHRyKG9yaWVudC54LCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiAtZC53aWR0aCAvIDI7CiAgICAgIH0pLmF0dHIob3JpZW50LnksIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKGVudGVyU2NhbGUoZC51cHBlclF1YXJ0aWxlKSwgZW50ZXJTY2FsZShkLmxvd2VyUXVhcnRpbGUpKTsKICAgICAgfSk7CiAgICAgIHZhciByZWN0VXBkYXRlID0gcmVjdC5tZXJnZShyZWN0RW50ZXIpOwoKICAgICAgLy8gZW50ZXIsIHVwZGF0ZSwgZXhpdCBhbGwgb3V0bGllcnMKICAgICAgWydtYXgnLCAnbWluJ10uZm9yRWFjaChmdW5jdGlvbiAob3V0bGllclR5cGUpIHsKICAgICAgICB2YXIgb3V0bGllciA9IGdyb3VwVXBkYXRlLnNlbGVjdEFsbCgnLmQyYi1ib3gtJyArIG91dGxpZXJUeXBlICsgJy1vdXRsaWVyJykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGRbb3V0bGllclR5cGUgKyAnT3V0bGllcnMnXS5tYXAoZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBvdXRsaWVyOiBvLAogICAgICAgICAgICAgIGJveDogZAogICAgICAgICAgICB9OwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIG91dGxpZXJFbnRlciA9IG91dGxpZXIuZW50ZXIoKS5hcHBlbmQoJ2NpcmNsZScpLnN0eWxlKCdvcGFjaXR5JywgMCkuYXR0cigncicsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5ib3gud2lkdGggLyA1OwogICAgICAgIH0pLmF0dHIob3JpZW50LmN4LCAwKS5hdHRyKG9yaWVudC5jeSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBlbnRlclNjYWxlKGQub3V0bGllcik7CiAgICAgICAgfSkuYXR0cignY2xhc3MnLCAnZDJiLWJveC1vdXRsaWVyIGQyYi1ib3gtJyArIG91dGxpZXJUeXBlICsgJy1vdXRsaWVyJyk7CiAgICAgICAgdmFyIG91dGxpZXJVcGRhdGUgPSBvdXRsaWVyLm1lcmdlKG91dGxpZXJFbnRlciksCiAgICAgICAgICAgIG91dGxpZXJFeGl0ID0gb3V0bGllci5leGl0KCk7CgogICAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICAgIG91dGxpZXJVcGRhdGUgPSBvdXRsaWVyVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBvdXRsaWVyRXhpdCA9IG91dGxpZXJFeGl0LnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICBvdXRsaWVyVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSkuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLmJveC5jb2xvcjsKICAgICAgICB9KS5hdHRyKCdyJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLmJveC53aWR0aCAvIDU7CiAgICAgICAgfSkuYXR0cihvcmllbnQuY3gsIDApLmF0dHIob3JpZW50LmN5LCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIHNjYWxlKGQub3V0bGllcik7CiAgICAgICAgfSk7CgogICAgICAgIG91dGxpZXJFeGl0LmF0dHIob3JpZW50LmN4LCAwKS5hdHRyKG9yaWVudC5jeSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBzY2FsZShkLm91dGxpZXIpOwogICAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMCkucmVtb3ZlKCk7CiAgICAgIH0pOwoKICAgICAgLy8gZW50ZXIsIHVwZGF0ZSBhbGwgZGFzaGVzCiAgICAgIFsnbWF4aW11bScsICdtZWRpYW4nLCAnbWluaW11bSddLmZvckVhY2goZnVuY3Rpb24gKGRhc2hUeXBlKSB7CiAgICAgICAgdmFyIGRhc2ggPSBncm91cFVwZGF0ZS5zZWxlY3RBbGwoJy5kMmItYm94LWRhc2gtJyArIGRhc2hUeXBlKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gW2RdOwogICAgICAgIH0pOwogICAgICAgIHZhciBkYXNoRW50ZXIgPSBkYXNoLmVudGVyKCkuYXBwZW5kKCdsaW5lJykuYXR0cignY2xhc3MnLCAnZDJiLWJveC1kYXNoIGQyYi1ib3gtZGFzaC0nICsgZGFzaFR5cGUpLmF0dHIob3JpZW50LngxLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIC1kLndpZHRoIC8gMjsKICAgICAgICB9KS5hdHRyKG9yaWVudC54MiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLndpZHRoIC8gMjsKICAgICAgICB9KS5hdHRyKG9yaWVudC55MSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBlbnRlclNjYWxlKGRbZGFzaFR5cGVdKTsKICAgICAgICB9KS5hdHRyKG9yaWVudC55MiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBlbnRlclNjYWxlKGRbZGFzaFR5cGVdKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgZGFzaFVwZGF0ZSA9IGRhc2gubWVyZ2UoZGFzaEVudGVyKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgZGFzaFVwZGF0ZSA9IGRhc2hVcGRhdGUudHJhbnNpdGlvbihjb250ZXh0KTsKCiAgICAgICAgZGFzaFVwZGF0ZS5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICAgICAgfSkuYXR0cihvcmllbnQueDEsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gLWQud2lkdGggLyAyOwogICAgICAgIH0pLmF0dHIob3JpZW50LngyLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQud2lkdGggLyAyOwogICAgICAgIH0pLmF0dHIob3JpZW50LnkxLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIHNjYWxlKGRbZGFzaFR5cGVdKTsKICAgICAgICB9KS5hdHRyKG9yaWVudC55MiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBzY2FsZShkW2Rhc2hUeXBlXSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgLy8gZW50ZXIsIHVwZGF0ZSBhbGwgbGFiZWxzIGFuZCBhbm5vdGF0aW9ucwogICAgICBbJ21heGltdW0nLCAndXBwZXJRdWFydGlsZScsICdtZWRpYW4nLCAnbG93ZXJRdWFydGlsZScsICdtaW5pbXVtJ10uZm9yRWFjaChmdW5jdGlvbiAodGV4dFR5cGUsIGkpIHsKICAgICAgICB2YXIgbGFiZWwgPSBncm91cFVwZGF0ZS5zZWxlY3RBbGwoJy5kMmItYm94LWxhYmVsLWdyb3VwLScgKyB0ZXh0VHlwZSkuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgICB9KTsKICAgICAgICB2YXIgbGFiZWxFbnRlciA9IGxhYmVsLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJveC1sYWJlbC1ncm91cCBkMmItYm94LWxhYmVsLWdyb3VwLScgKyB0ZXh0VHlwZSkuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBvcmllbnQudHJhbnNsYXRlKDAsIGVudGVyU2NhbGUoZFt0ZXh0VHlwZV0pKTsKICAgICAgICB9KTsKCiAgICAgICAgbGFiZWxFbnRlci5hcHBlbmQoJ3RleHQnKS5hdHRyKCdjbGFzcycsICdkMmItYm94LWxhYmVsJykuYXR0cihvcmllbnQueCwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiAoMyArIGQud2lkdGggLyAyKSAqIChpICUgMiA9PT0gMCA/IDEgOiAtMSk7CiAgICAgICAgfSkuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSAlIDIgPT09IDAgPyAnc3RhcnQnIDogJ2VuZCcpOwoKICAgICAgICB2YXIgbGFiZWxVcGRhdGUgPSBsYWJlbC5tZXJnZShsYWJlbEVudGVyKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgbGFiZWxVcGRhdGUgPSBsYWJlbFVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgICBsYWJlbFVwZGF0ZS5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIG9yaWVudC50cmFuc2xhdGUoMCwgc2NhbGUoZFt0ZXh0VHlwZV0pKTsKICAgICAgICB9KS5jYWxsKHVwZGF0ZSwgJCQuYW5ub3RhdGlvbiwgJ2QyYi1ib3gtYW5ub3RhdGlvbicsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gKGQuYW5ub3RhdGlvbnMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoYSkgewogICAgICAgICAgICByZXR1cm4gYS5sb2NhdGlvbiA9PT0gdGV4dFR5cGU7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIGxhYmVsVGV4dCA9IGxhYmVsVXBkYXRlLnNlbGVjdCgnLmQyYi1ib3gtbGFiZWwnKS50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVGb3JtYXQoZFt0ZXh0VHlwZV0pOwogICAgICAgIH0pOwoKICAgICAgICBpZiAodmVydGljYWwpIHsKICAgICAgICAgIGxhYmVsVGV4dC5zZWxlY3QoKS5zdHlsZSgndGV4dC1hbmNob3InLCBpICUgMiA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJykuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpLmF0dHIob3JpZW50LngsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiAoMyArIGQud2lkdGggLyAyKSAqIChpICUgMiA9PT0gMCA/IDEgOiAtMSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGFiZWxUZXh0LnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKS5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCBpICUgMiA9PT0gMCA/ICdiYXNlbGluZScgOiAnaGFuZ2luZycpLmF0dHIob3JpZW50LngsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiAoMyArIGQud2lkdGggLyAyKSAqIChpICUgMiA9PT0gMCA/IC0xIDogMSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgIHJlY3RVcGRhdGUgPSByZWN0VXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgY2VudGVyVXBkYXRlID0gY2VudGVyVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgIH0KCiAgICAgIHJlY3RVcGRhdGUuYXR0cihvcmllbnQueCwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gLWQud2lkdGggLyAyOwogICAgICB9KS5hdHRyKG9yaWVudC55LCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBNYXRoLm1pbihzY2FsZShkLnVwcGVyUXVhcnRpbGUpLCBzY2FsZShkLmxvd2VyUXVhcnRpbGUpKTsKICAgICAgfSkuYXR0cihvcmllbnQud2lkdGgsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQud2lkdGg7CiAgICAgIH0pLmF0dHIob3JpZW50LmhlaWdodCwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gTWF0aC5hYnMoc2NhbGUoZC51cHBlclF1YXJ0aWxlKSAtIHNjYWxlKGQubG93ZXJRdWFydGlsZSkpOwogICAgICB9KS5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmNvbG9yOwogICAgICB9KTsKCiAgICAgIGNlbnRlclVwZGF0ZS5hdHRyKG9yaWVudC54MSwgMCkuYXR0cihvcmllbnQueDIsIDApLmF0dHIob3JpZW50LnkxLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBzY2FsZShkLm1pbmltdW0pOwogICAgICB9KS5hdHRyKG9yaWVudC55MiwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gc2NhbGUoZC5tYXhpbXVtKTsKICAgICAgfSkuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5jb2xvcjsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ2JveC11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIGJveDsKICAgIH07CgogICAgLyogSW5oZXJpdCBmcm9tIGJhc2UgbW9kZWwgKi8KICAgIGJhc2UoYm94LCAkJCkuYWRkUHJvcCgnc2NhbGUnLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCdlbnRlclNjYWxlJywgbnVsbCkuYWRkUHJvcCgndmFsdWVGb3JtYXQnLCBkMy5mb3JtYXQoJywnKSkuYWRkUHJvcCgnb3JpZW50JywgJ3ZlcnRpY2FsJykuYWRkUHJvcCgnYW5ub3RhdGlvbicsIGQzU3ZnQW5ub3RhdGlvbi5hbm5vdGF0aW9uID8gZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24oKSA6IG51bGwpLmFkZFByb3BGdW5jdG9yKCdkYXRhJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignbWVkaWFuJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubWVkaWFuOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3VwcGVyUXVhcnRpbGUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC51cHBlclF1YXJ0aWxlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2xvd2VyUXVhcnRpbGUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5sb3dlclF1YXJ0aWxlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ21pbmltdW0nLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5taW5pbXVtOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ21heGltdW0nLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5tYXhpbXVtOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ291dGxpZXJzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQub3V0bGllcnM7CiAgICB9KS5hZGRQcm9wRnVuY3Rvcignd2lkdGgnLCAyMCkuYWRkUHJvcEZ1bmN0b3IoJ2NvbG9yJywgJ3N0ZWVsYmx1ZScpLmFkZFByb3BGdW5jdG9yKCdhbm5vdGF0aW9ucycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb25zOwogICAgfSk7CgogICAgcmV0dXJuIGJveDsKICB9CgogIC8vIGltcG9ydCBpZCBmcm9tICcuLi91dGlsL2lkJzsKCiAgLy8gYm94LXBsb3Qgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIGJveFBsb3QgKCkgewogICAgdmFyICQkID0ge307CgogICAgZnVuY3Rpb24gZ2V0R3JhcGhzKGQsIGkpIHsKICAgICAgdmFyIGdyYXBocyA9ICQkLmdyYXBocyhkLCBpKS5tYXAoZnVuY3Rpb24gKGdyYXBoLCBpKSB7CiAgICAgICAgdmFyIG5ld0dyYXBoID0gewogICAgICAgICAgZGF0YTogZ3JhcGgsCiAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgIHRvb2x0aXBHcmFwaDogJCQudG9vbHRpcEdyYXBoKGdyYXBoLCBpKSwKICAgICAgICAgIHNoaWZ0OiAkJC5zaGlmdChncmFwaCwgaSksCiAgICAgICAgICBrZXk6ICQkLmtleShncmFwaCwgaSksCiAgICAgICAgICBjb2xvcjogJCQuY29sb3IoZ3JhcGgsIGkpLAogICAgICAgICAgb3JpZW50OiAkJC5vcmllbnQoZ3JhcGgsIGkpCiAgICAgICAgfTsKCiAgICAgICAgbmV3R3JhcGgudmFsdWVzID0gJCQudmFsdWVzKGdyYXBoLCBpKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBkYXRhOiBwb2ludCwKICAgICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICAgIGdyYXBoOiBuZXdHcmFwaCwKICAgICAgICAgICAgeDogJCQucHgocG9pbnQsIGkpLAogICAgICAgICAgICB5OiAkJC5weShwb2ludCwgaSksCiAgICAgICAgICAgIGFubm90YXRpb25zOiAkJC5wYW5ub3RhdGlvbnMocG9pbnQsIGkpLAogICAgICAgICAgICBtZWRpYW46ICQkLmJveC5tZWRpYW4oKShwb2ludCwgaSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ld0dyYXBoOwogICAgICB9KTsKCiAgICAgIHJldHVybiBncmFwaHM7CiAgICB9CgogICAgLyogVXBkYXRlIEZ1bmN0aW9uICovCiAgICB2YXIgYm94UGxvdCA9IGZ1bmN0aW9uIGJveFBsb3QoY29udGV4dCkgewogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHZhciBncmFwaHMgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLWJveC1wbG90LWdyYXBocycpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KTsKCiAgICAgIGdyYXBocyA9IGdyYXBocy5tZXJnZShncmFwaHMuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYm94LXBsb3QtZ3JhcGhzJykpOwoKICAgICAgdmFyIGdyYXBoID0gZ3JhcGhzLnNlbGVjdEFsbCgnLmQyYi1ib3gtcGxvdC1ncmFwaCcpLmRhdGEoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhzKGQsIGkpOwogICAgICB9LCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmtleTsKICAgICAgfSk7CgogICAgICB2YXIgZ3JhcGhFbnRlciA9IGdyYXBoLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJveC1wbG90LWdyYXBoIGQyYi1ncmFwaCcpLnN0eWxlKCdvcGFjaXR5JywgMCk7CgogICAgICB2YXIgZ3JhcGhVcGRhdGUgPSBncmFwaC5tZXJnZShncmFwaEVudGVyKS5vcmRlcigpLAogICAgICAgICAgZ3JhcGhFeGl0ID0gZ3JhcGguZXhpdCgpOwoKICAgICAgJCQuYm94LmRhdGEoZnVuY3Rpb24gKHApIHsKICAgICAgICByZXR1cm4gcC5kYXRhOwogICAgICB9KS5hbm5vdGF0aW9uKCQkLmFubm90YXRpb24pLmFubm90YXRpb25zKCQkLnBhbm5vdGF0aW9ucyk7CgogICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgZ3JhcGhVcGRhdGUgPSBncmFwaFVwZGF0ZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIGdyYXBoRXhpdCA9IGdyYXBoRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgICBncmFwaEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKQogICAgICAgIC8vIGJveGVzIG5lZWRzIHRvIGJlIHRyYW5zaXRpb25lZCB0byB3aGVyZSB0aGVpciBuZXcgbG9jYXRpb25zCiAgICAgICAgLy8gIndvdWxkIGJlIiBpZiB0aGUgZ3JhcGhzIGhhZCBiZWVuIGluY2x1ZGVkCiAgICAgICAgLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgICB2ZXJ0aWNhbCA9IGQub3JpZW50ID09PSAndmVydGljYWwnLAogICAgICAgICAgICAgIG9yaWVudCA9IHZlcnRpY2FsID8geyB4OiAneCcsIHk6ICd5JyB9IDogeyB4OiAneScsIHk6ICd4JyB9LAogICAgICAgICAgICAgIHggPSAkJFtvcmllbnQueF0sCiAgICAgICAgICAgICAgeSA9ICQkW29yaWVudC55XTsKCiAgICAgICAgICAkJC5ib3guc2NhbGUoeSkub3JpZW50KGQub3JpZW50KS5jb2xvcihmdW5jdGlvbiAocCwgaSkgewogICAgICAgICAgICByZXR1cm4gJCQucGNvbG9yKHAsIGkpIHx8IGQuY29sb3I7CiAgICAgICAgICB9KTsKCiAgICAgICAgICB2YXIgYm94U3ZnRXhpdCA9IGVsLnNlbGVjdEFsbCgnLmQyYi1ib3gtcGxvdC1ib3gnKTsKCiAgICAgICAgICBpZiAoY29udGV4dCAhPT0gc2VsZWN0aW9uKSBib3hTdmdFeGl0ID0gYm94U3ZnRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAgICAgIHZhciBzaGlmdCA9IGQuc2hpZnQ7CiAgICAgICAgICBpZiAoc2hpZnQgPT09IG51bGwpIHNoaWZ0ID0geC5iYW5kd2lkdGggPyB4LmJhbmR3aWR0aCgpIC8gMiA6IDA7CgogICAgICAgICAgYm94U3ZnRXhpdC5zdHlsZSgnb3BhY2l0eScsIDApLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVCb3goeChwW29yaWVudC54XSkgKyBzaGlmdCwgdmVydGljYWwpOwogICAgICAgICAgfSkuY2FsbCgkJC5ib3gpLnJlbW92ZSgpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBncmFwaFVwZGF0ZS5zdHlsZSgnb3BhY2l0eScsIDEpOwoKICAgICAgZ3JhcGhFeGl0LnJlbW92ZSgpOwoKICAgICAgZ3JhcGhVcGRhdGUuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgdmVydGljYWwgPSBkLm9yaWVudCA9PT0gJ3ZlcnRpY2FsJywKICAgICAgICAgICAgb3JpZW50ID0gdmVydGljYWwgPyB7IHg6ICd4JywgeTogJ3knIH0gOiB7IHg6ICd5JywgeTogJ3gnIH0sCiAgICAgICAgICAgIHggPSAkJFtvcmllbnQueF0sCiAgICAgICAgICAgIHkgPSAkJFtvcmllbnQueV0sCiAgICAgICAgICAgIGdyYXBoc05vZGUgPSB0aGlzLnBhcmVudE5vZGUsCiAgICAgICAgICAgIHByZVNjYWxlcyA9IHsgeDogZ3JhcGhzTm9kZS5fX3NjYWxlWCB8fCB4LCB5OiBncmFwaHNOb2RlLl9fc2NhbGVZIHx8IHkgfSwKICAgICAgICAgICAgcHJlWCA9IHByZVNjYWxlc1tvcmllbnQueF0sCiAgICAgICAgICAgIHByZVkgPSBwcmVTY2FsZXNbb3JpZW50LnldOwoKICAgICAgICB2YXIgc2hpZnQgPSBkLnNoaWZ0OwogICAgICAgIGlmIChzaGlmdCA9PT0gbnVsbCkgc2hpZnQgPSB4LmJhbmR3aWR0aCA/IHguYmFuZHdpZHRoKCkgLyAyIDogMDsKCiAgICAgICAgdmFyIHByZVNoaWZ0ID0gc2hpZnQ7CiAgICAgICAgaWYgKHByZVNoaWZ0ID09PSBudWxsKSBzaGlmdCA9IHByZVguYmFuZHdpZHRoID8gcHJlWC5iYW5kd2lkdGgoKSAvIDIgOiAwOwoKICAgICAgICBpZiAoZC50b29sdGlwR3JhcGgpIGQudG9vbHRpcEdyYXBoLmRhdGEoZC52YWx1ZXMpW29yaWVudC54XShmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuIHgocFtvcmllbnQueF0pICsgc2hpZnQ7CiAgICAgICAgfSlbb3JpZW50LnldKGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICByZXR1cm4geShwLm1lZGlhbik7CiAgICAgICAgfSkuY29sb3IoZnVuY3Rpb24gKHAsIGkpIHsKICAgICAgICAgIHJldHVybiAkJC5wY29sb3IocC5kYXRhLCBpKSB8fCBkLmNvbG9yOwogICAgICAgIH0pOwoKICAgICAgICAkJC5ib3guc2NhbGUoeSkuZW50ZXJTY2FsZShwcmVZKS5vcmllbnQoZC5vcmllbnQpLmNvbG9yKGZ1bmN0aW9uIChwLCBpKSB7CiAgICAgICAgICByZXR1cm4gJCQucGNvbG9yKHAsIGkpIHx8IGQuY29sb3I7CiAgICAgICAgfSk7CgogICAgICAgIHZhciBib3hTdmcgPSBlbC5zZWxlY3RBbGwoJy5kMmItYm94LXBsb3QtYm94JykuZGF0YShkLnZhbHVlcywgJCQucGtleSk7CiAgICAgICAgdmFyIGJveFN2Z0VudGVyID0gYm94U3ZnLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJveC1wbG90LWJveCcpOwoKICAgICAgICB2YXIgYm94U3ZnVXBkYXRlID0gYm94U3ZnLm1lcmdlKGJveFN2Z0VudGVyKS5vcmRlcigpLAogICAgICAgICAgICBib3hTdmdFeGl0ID0gYm94U3ZnLmV4aXQoKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgICAgYm94U3ZnVXBkYXRlID0gYm94U3ZnVXBkYXRlLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBib3hTdmdFeGl0ID0gYm94U3ZnRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgYmFuZCBzY2FsZSBpcyB1c2VkIGVudGVyIGJveGVzIGF0IHRoZWlyIG5ldyBsb2NhdGlvbgogICAgICAgIGlmIChwcmVYLmJhbmR3aWR0aCB8fCBwcmVZLmJhbmR3aWR0aCB8fCB4LmJhbmR3aWR0aCB8fCB5LmJhbmR3aWR0aCkgewogICAgICAgICAgJCQuYm94LmVudGVyU2NhbGUoeSk7CiAgICAgICAgICBib3hTdmdFbnRlci5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlQm94KHgocFtvcmllbnQueF0pICsgc2hpZnQsIHZlcnRpY2FsKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkJC5ib3guZW50ZXJTY2FsZShwcmVZKTsKICAgICAgICAgIGJveFN2Z0VudGVyLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVCb3gocHJlWChwW29yaWVudC54XSkgKyBzaGlmdCwgdmVydGljYWwpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBib3hTdmdFbnRlci5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICBib3hTdmdVcGRhdGUuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVCb3goeChwW29yaWVudC54XSkgKyBzaGlmdCwgdmVydGljYWwpOwogICAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMSkuY2FsbCgkJC5ib3gpOwoKICAgICAgICBib3hTdmdFeGl0LmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlQm94KHgocFtvcmllbnQueF0pICsgc2hpZnQsIHZlcnRpY2FsKTsKICAgICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDApLmNhbGwoJCQuYm94KS5yZW1vdmUoKTsKICAgICAgfSk7CgogICAgICBncmFwaHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fX3NjYWxlWCA9ICQkLnguY29weSgpOwogICAgICAgIHRoaXMuX19zY2FsZVkgPSAkJC55LmNvcHkoKTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ3N2Zy1ib3gtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBib3hQbG90OwogICAgfTsKCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVCb3gocG9zaXRpb24sIHZlcnRpY2FsKSB7CiAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyAodmVydGljYWwgPyBbcG9zaXRpb24sIDBdIDogWzAsIHBvc2l0aW9uXSkgKyAnKSc7CiAgICB9CgogICAgLyogSW5oZXJpdCBmcm9tIGJhc2UgbW9kZWwgKi8KICAgIGJhc2UoYm94UGxvdCwgJCQpLmFkZFByb3AoJ3gnLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCd5JywgZDMuc2NhbGVMaW5lYXIoKSkuYWRkUHJvcCgnYm94JywgYm94KCkpLmFkZFByb3AoJ2Fubm90YXRpb24nLCBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbiA/IGQzU3ZnQW5ub3RhdGlvbi5hbm5vdGF0aW9uKCkgOiBudWxsKS5hZGRQcm9wR2V0KCd0eXBlJywgJ2JveFBsb3QnKS5hZGRQcm9wRnVuY3RvcignZ3JhcGhzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KQogICAgLy8gZ3JhcGggcHJvcHMKICAgIC5hZGRQcm9wRnVuY3RvcigndG9vbHRpcEdyYXBoJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQudG9vbHRpcEdyYXBoOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3NoaWZ0JywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdvcmllbnQnLCAndmVydGljYWwnKQogICAgLy8gcG9pbnRzIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ3B4JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdweScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigncGNvbG9yJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3BrZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwYW5ub3RhdGlvbnMnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5hbm5vdGF0aW9uczsKICAgIH0pCiAgICAvLyBtZXRob2RzCiAgICAuYWRkTWV0aG9kKCdnZXRDb21wdXRlZEdyYXBocycsIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgIHJldHVybiAoY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCkuZGF0YSgpLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIHJldHVybiBnZXRHcmFwaHMoZCwgaSk7CiAgICAgIH0pOwogICAgfSkuYWRkTWV0aG9kKCdnZXRWaXNpYmxlUG9pbnRzJywgZnVuY3Rpb24gKGNvbnRleHQpIHsKICAgICAgdmFyIGRhdGEgPSBib3hQbG90LmdldENvbXB1dGVkR3JhcGhzKGNvbnRleHQpLAogICAgICAgICAgcG9pbnRzID0gW107CiAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGhzKSB7CiAgICAgICAgZ3JhcGhzLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoKSB7CiAgICAgICAgICBncmFwaC52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkgewogICAgICAgICAgICBbJ21heGltdW0nLCAnbWluaW11bScsICd1cHBlclF1YXJ0aWxlJywgJ2xvd2VyUXVhcnRpbGUnLCAnbWVkaWFuJ10uZm9yRWFjaChmdW5jdGlvbiAobWV0cmljKSB7CiAgICAgICAgICAgICAgcG9pbnRzLnB1c2goeyB4OiB2LngsIHk6ICQkLmJveFttZXRyaWNdKCkodi5kYXRhLCBpKSwgZ3JhcGg6IGdyYXBoIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICgkJC5ib3gub3V0bGllcnMoKSh2LmRhdGEsIGkpIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChvdXRsaWVyKSB7CiAgICAgICAgICAgICAgcG9pbnRzLnB1c2goeyB4OiB2LngsIHk6IG91dGxpZXIsIGdyYXBoOiBncmFwaCB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICByZXR1cm4gcG9pbnRzOwogICAgfSk7CgogICAgcmV0dXJuIGJveFBsb3Q7CiAgfQoKICAvLyBidWJibGUgcGFjayBzdmcgZ2VuZXJhdG9yCiAgZnVuY3Rpb24gYnViYmxlUGFjayAoKSB7CiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgaW5kaWNhdG9yU3ltYm9sID0gZDMuc3ltYm9sKCkuc2l6ZSg4MCk7CgogICAgZnVuY3Rpb24gZ2V0UG9pbnQocG9pbnQsIGksIGdyYXBoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogcG9pbnQsCiAgICAgICAgaW5kZXg6IGksCiAgICAgICAgZ3JhcGg6IGdyYXBoLAogICAgICAgIHg6ICQkLnB4KHBvaW50LCBpKSwKICAgICAgICB5OiAkJC5weShwb2ludCwgaSksCiAgICAgICAgY29sb3I6ICQkLnBjb2xvcihwb2ludCwgaSkgfHwgZ3JhcGguY29sb3IsCiAgICAgICAgc3ltYm9sOiAkJC5wc3ltYm9sKHBvaW50LCBpKSB8fCBncmFwaC5zeW1ib2wsCiAgICAgICAga2V5OiAkJC5wa2V5KHBvaW50LCBpKSwKICAgICAgICBzaXplOiAkJC5wc2l6ZShwb2ludCwgaSksCiAgICAgICAgaW5kaWNhdG9yOiAkJC5waW5kaWNhdG9yKHBvaW50LCBpKSwKICAgICAgICBhbm5vdGF0aW9uOiAkJC5wYW5ub3RhdGlvbihwb2ludCwgaSksCiAgICAgICAgY2hpbGRyZW46ICgkJC5wY2hpbGRyZW4ocG9pbnQsIGkpIHx8IFtdKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICByZXR1cm4gZ2V0UG9pbnQocG9pbnQsIGksIGdyYXBoKTsKICAgICAgICB9KQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEdyYXBocyhkLCBpKSB7CiAgICAgIHZhciBncmFwaHMgPSAkJC5ncmFwaHMoZCwgaSkubWFwKGZ1bmN0aW9uIChncmFwaCwgaSkgewoKICAgICAgICB2YXIgbmV3R3JhcGggPSB7CiAgICAgICAgICBkYXRhOiBncmFwaCwKICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgdGVuZGFuY3k6ICQkLnRlbmRhbmN5KGdyYXBoLCBpKSwKICAgICAgICAgIHRvb2x0aXBHcmFwaDogJCQudG9vbHRpcEdyYXBoKGdyYXBoLCBpKSwKICAgICAgICAgIHNoaWZ0OiAkJC5zaGlmdChncmFwaCwgaSksCiAgICAgICAgICBrZXk6ICQkLmtleShncmFwaCwgaSksCiAgICAgICAgICBjb2xvcjogJCQuY29sb3IoZ3JhcGgsIGkpLAogICAgICAgICAgc3ltYm9sOiAkJC5zeW1ib2woZ3JhcGgsIGkpCiAgICAgICAgfTsKCiAgICAgICAgbmV3R3JhcGgudmFsdWVzID0gJCQudmFsdWVzKGdyYXBoLCBpKS5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICByZXR1cm4gZ2V0UG9pbnQocG9pbnQsIGksIG5ld0dyYXBoKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG5ld0dyYXBoOwogICAgICB9KTsKCiAgICAgIGdyYXBocy5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgIHJldHVybiBncmFwaC52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgcmV0dXJuIHNldFN0cnVjdHVyZSh2LCBncmFwaC50ZW5kYW5jeSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGdyYXBoczsKICAgIH0KCiAgICAvLyBidWJibGUgcGFjayB1cGRhdGVyCiAgICAvLyBUaGUgYXV0b0VudGVyIGZsYWcgd2lsbCBkZWNpZGUgd2hldGhlciB0aGUgZW50ZXJpbmcgYnViYmxlcyB3aWxsIHJlbmRlcgogICAgLy8gYXQgdGhlaXIgcmVzcGVjdGl2ZSBsb2NhdGlvbiBvciBpZiB0aGV5IHdpbGwgZXhwYW5kIGZyb20gdGhlaXIgcGFyZW50cwogICAgLy8gbG9jYXRpb24uIFdoZW4gdGhlIGJ1YmJsZVBhY2sgaXMgcmUtcmVuZGVyZWQgdXBvbiBjbGlja2luZwogICAgLy8gb24gYSBwYXJlbnQgYnViYmxlLCB0aGlzIHdpbGwgYmUgY2FsbGVkIHdpdGggYXV0b0VudGVyID0gZmFsc2UgdG8gcHJlc2VydmUKICAgIC8vIHRoZSBmbG93IG9mIGNoaWxkIGJ1YmJsZXMgZmxvd2luZyBmcm9tIHRoZWlyIHBhcmVudHMgbG9jYXRpb24gdG8gdGhlaXIKICAgIC8vIGxvY2F0aW9uLgogICAgdmFyIGJ1YmJsZVBhY2sgPSBmdW5jdGlvbiBidWJibGVQYWNrKGNvbnRleHQpIHsKICAgICAgdmFyIGF1dG9FbnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTsKCiAgICAgIHZhciB0cmFuc2l0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0IDogbnVsbCwKICAgICAgICAgIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICB2YXIgZ3JhcGhzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1idWJibGUtcGFjay1ncmFwaHMnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgfSk7CgogICAgICBncmFwaHMgPSBncmFwaHMubWVyZ2UoZ3JhcGhzLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJ1YmJsZS1wYWNrLWdyYXBocycpKTsKCiAgICAgIHZhciBncmFwaCA9IGdyYXBocy5zZWxlY3RBbGwoJy5kMmItYnViYmxlLXBhY2stZ3JhcGgnKS5kYXRhKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIGdldEdyYXBocyhkLCBpKTsKICAgICAgfSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5rZXk7CiAgICAgIH0pOwoKICAgICAgLy8gZW50ZXIgZ3JhcGgKICAgICAgdmFyIGdyYXBoRW50ZXIgPSBncmFwaC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1idWJibGUtcGFjay1ncmFwaCBkMmItZ3JhcGgnKTsKCiAgICAgIHZhciBncmFwaFVwZGF0ZSA9IGdyYXBoLm1lcmdlKGdyYXBoRW50ZXIpLm9yZGVyKCksCiAgICAgICAgICBncmFwaEV4aXQgPSBncmFwaC5leGl0KCk7CgogICAgICBpZiAodHJhbnNpdGlvbikgewogICAgICAgIGdyYXBoVXBkYXRlID0gZ3JhcGhVcGRhdGUudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICBncmFwaEV4aXQgPSBncmFwaEV4aXQudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgfQoKICAgICAgLy8gdXBkYXRlIGdyYXBoCiAgICAgIGdyYXBoVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CgogICAgICAvLyBleGl0IGdyYXBoCiAgICAgIGdyYXBoRXhpdC5zdHlsZSgnb3BhY2l0eScsIDApLnJlbW92ZSgpOwoKICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggY29udGV4dCBlbGVtZW50CiAgICAgIGNvbnRleHQuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIHZhciBzZWxlY3Rpb24gPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIGR1cmF0aW9uID0gJCQuZHVyYXRpb24oZCwgaSksCiAgICAgICAgICAgIGdyYXBoID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1idWJibGUtcGFjay1ncmFwaCcpLAogICAgICAgICAgICBncmFwaHNOb2RlID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1idWJibGUtcGFjay1ncmFwaHMnKS5ub2RlKCksCiAgICAgICAgICAgIHByZVggPSBncmFwaHNOb2RlLl9fZDJiUHJlc2VydmVTY2FsZVhfXyB8fCAkJC54LAogICAgICAgICAgICBwcmVZID0gZ3JhcGhzTm9kZS5fX2QyYlByZXNlcnZlU2NhbGVZX18gfHwgJCQueTsKCiAgICAgICAgc2VsZWN0aW9uLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBzZWxlY3Rpb24udHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKGJ1YmJsZVBhY2ssIGZhbHNlKTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIG1heFdpZHRoID0gMDsKCiAgICAgICAgLy8gcmVuZGVyIHRoZSBidWJibGUgcGFja3MgZm9yIGVhY2ggZ3JhcGgKICAgICAgICBncmFwaC5lYWNoKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICAgIHhSYW5nZSA9ICQkLngucmFuZ2UoKTsKCiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBNYXRoLmFicyh4UmFuZ2VbMF0gLSB4UmFuZ2VbMV0pKTsKCiAgICAgICAgICB2YXIgc2hpZnQgPSBncmFwaC5zaGlmdDsKICAgICAgICAgIGlmIChzaGlmdCA9PT0gbnVsbCkgc2hpZnQgPSAkJC54LmJhbmR3aWR0aCA/ICQkLnguYmFuZHdpZHRoKCkgLyAyIDogMDsKCiAgICAgICAgICAkJC5wb2ludC5hY3RpdmUoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuICEhZC5jaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgICB9KS5maWxsKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gcG9pbnQuY29sb3I7CiAgICAgICAgICB9KS50eXBlKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gcG9pbnQuc3ltYm9sOwogICAgICAgICAgfSk7CgogICAgICAgICAgdmFyIGFkZFRvb2x0aXBQb2ludCA9IGdyYXBoLnRvb2x0aXBHcmFwaCA/IGdyYXBoLnRvb2x0aXBHcmFwaC5jbGVhcigpLngoZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgIHJldHVybiAkJC54KHBvaW50LngpICsgc2hpZnQ7CiAgICAgICAgICB9KS55KGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gJCQueShwb2ludC55KTsKICAgICAgICAgIH0pLmNvbG9yKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICByZXR1cm4gcG9pbnQuY29sb3I7CiAgICAgICAgICB9KS5hZGRQb2ludCA6IG51bGw7CgogICAgICAgICAgcmVuZGVyUGFja3MoZWwsIGdyYXBoLnZhbHVlcywgdHJhbnNpdGlvbiwgJCQueCwgJCQueSwgcHJlWCwgcHJlWSwgc2hpZnQsIHNlbGVjdGlvbiwgYWRkVG9vbHRpcFBvaW50LCBhdXRvRW50ZXIpOwogICAgICAgIH0pOwogICAgICAgIHBvc2l0aW9uSW5kaWNhdG9ycyhzZWxlY3Rpb24sIG1heFdpZHRoKTsKICAgICAgfSk7CgogICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc2NhbGVzIHN0aWNreSBvbiB0aGUgJ2dyYXBocycgbm9kZQogICAgICBncmFwaHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fX2QyYlByZXNlcnZlU2NhbGVYX18gPSAkJC54LmNvcHkoKTsKICAgICAgICB0aGlzLl9fZDJiUHJlc2VydmVTY2FsZVlfXyA9ICQkLnkuY29weSgpOwogICAgICB9KTsKCiAgICAgIHNlbGVjdGlvbi5kaXNwYXRjaCgnc3ZnLWJ1YmJsZS1wYWNrLXVwZGF0ZWQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CgogICAgICByZXR1cm4gYnViYmxlUGFjazsKICAgIH07CgogICAgLy8gcHJvcGFnYXRlIGV4cGFuZGVkIHN0YXRlIHRvIGNoaWxkIHRyZWUKICAgIGZ1bmN0aW9uIHByb3BhZ2F0ZUV4cGFuZGVkKGRhdGEsIHN0YXRlKSB7CiAgICAgIGRhdGEuZGF0YS5leHBhbmRlZCA9IHN0YXRlOwogICAgICBkYXRhLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUV4cGFuZGVkKGNoaWxkLCBzdGF0ZSk7CiAgICAgIH0pOwogICAgfQoKICAgIC8vIFBvc2l0aW9uIGFsbCBidWJibGUgaW5kaWNhdG9ycyB0byBiZSBuZXh0IHRvIGVhY2ggb3RoZXIuCiAgICBmdW5jdGlvbiBwb3NpdGlvbkluZGljYXRvcnMoc2VsZWN0aW9uLCBtYXhXaWR0aCkgewogICAgICB2YXIgcG9zaXRpb254ID0gNSwKICAgICAgICAgIHBvc2l0aW9ueSA9IDU7CiAgICAgIHNlbGVjdGlvbi5zZWxlY3RBbGwoJy5kMmItYnViYmxlLWluZGljYXRvci5kMmItYWN0aXZlJykuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBib3ggPSB0aGlzLmdldEJCb3goKTsKCiAgICAgICAgaWYgKGJveC53aWR0aCArIHBvc2l0aW9ueCA+IG1heFdpZHRoICYmIHBvc2l0aW9ueCA+IDApIHsKICAgICAgICAgIHBvc2l0aW9ueCA9IDU7CiAgICAgICAgICBwb3NpdGlvbnkgKz0gYm94LmhlaWdodCArIDU7CiAgICAgICAgfQoKICAgICAgICB2YXIgdHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgcG9zaXRpb254ICsgJywgJyArIHBvc2l0aW9ueSArICcpJzsKICAgICAgICBwb3NpdGlvbnggKz0gYm94LndpZHRoICsgNTsKICAgICAgICByZXR1cm4gdHJhbnNsYXRlOwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbmRlcnMgYnViYmxlLgogICAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGVsIC0gYnViYmxlIHBhY2sKICAgICAqIEBwYXJhbSB7ZDMudHJhbnNpdGlvbiBvciBudWxsfSB0cmFucyAtIHRyYW5zaXRpb24gaWYgcHJlc2VudAogICAgICogQHBhcmFtIHtkMy5zY2FsZX0geCAtIHggc2NhbGUKICAgICAqIEBwYXJhbSB7ZDMuc2NhbGV9IHkgLSB5IHNjYWxlCiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2hpZnQgLSBob3Jpem9udGFsIHBpeGVsIHNoaWZ0CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlclBvaW50KGVsLCB0cmFucywgeCwgeSwgc2hpZnQpIHsKICAgICAgZWwuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IGVsLmF0dHIoJ3RyYW5zZm9ybScpOwoKICAgICAgICBpZiAoIXRyYW5zZm9ybSkgewogICAgICAgICAgZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgKHgoZC5wYXJlbnQgPyBkLnBhcmVudC54IDogZC54KSArIHNoaWZ0ICsgJywnKSArICh5KGQucGFyZW50ID8gZC5wYXJlbnQueSA6IGQueSkgKyAnKScpKTsKICAgICAgICB9CgogICAgICAgIGlmIChkLmNoaWxkcmVuLmxlbmd0aCAmJiAhZC5kYXRhLmV4cGFuZGVkKSB7CiAgICAgICAgICBlbC5hdHRyKCdjdXJzb3InLCAncG9pbnRlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmRpc3BhdGNoKCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7CiAgICAgICAgICB9KS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGQuZGF0YS5leHBhbmRlZCA9ICFkLmRhdGEuZXhwYW5kZWQ7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgZWwuYXR0cignY3Vyc29yJywgJycpLm9uKCdjbGljaycsIG51bGwpOwoKICAgICAgICBpZiAodHJhbnMpIGVsID0gZWwudHJhbnNpdGlvbih0cmFucyk7CgogICAgICAgIGlmIChkLmRhdGEuZXhwYW5kZWQpIGVsLnN0eWxlKCdvcGFjaXR5JywgMCkuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7ZWxzZSBlbC5zdHlsZSgnb3BhY2l0eScsIG51bGwpLmNhbGwoJCQucG9pbnQpOwoKICAgICAgICBlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoeChkLngpICsgc2hpZnQpICsgJywgJyArIHkoZC55KSArICcpJyk7CgogICAgICAgIC8vIHVwZGF0ZSBhbm5vdGF0aW9ucwogICAgICAgIHVwZGF0ZShlbCwgJCQuYW5ub3RhdGlvbiwgJ2QyYi1idWJibGUtYW5ub3RhdGlvbicpOwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbmRlcnMgYnViYmxlIGluZGljYXRvci4KICAgICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBlbCAtIGJ1YmJsZSBwYWNrCiAgICAgKiBAcGFyYW0ge2QzLnRyYW5zaXRpb24gb3IgbnVsbH0gdHJhbnMgLSB0cmFuc2l0aW9uIGlmIHByZXNlbnQKICAgICAqIEBwYXJhbSB7ZDMuc2NhbGV9IHggLSB4IHNjYWxlCiAgICAgKiBAcGFyYW0ge2QzLnNjYWxlfSB5IC0geSBzY2FsZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IHNoaWZ0IC0gaG9yaXpvbnRhbCBwaXhlbCBzaGlmdAogICAgICovCiAgICBmdW5jdGlvbiByZW5kZXJJbmRpY2F0b3IoZWwpIHsKICAgICAgZWwuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCdkMmItYWN0aXZlJywgZC5kYXRhLmV4cGFuZGVkKTsKCiAgICAgICAgaWYgKCFkLmRhdGEuZXhwYW5kZWQpIHJldHVybiBlbC5zZWxlY3RBbGwoJ3JlY3QsIHRleHQsIHBhdGgnKS5yZW1vdmUoKTsKCiAgICAgICAgdmFyIHJlY3QgPSBlbC5zZWxlY3QoJ3JlY3QnKSwKICAgICAgICAgICAgdGV4dCA9IGVsLnNlbGVjdCgndGV4dCcpLAogICAgICAgICAgICBwYXRoID0gZWwuc2VsZWN0KCdwYXRoJyk7CiAgICAgICAgaWYgKCFyZWN0LnNpemUoKSkgcmVjdCA9IGVsLmFwcGVuZCgncmVjdCcpOwogICAgICAgIGlmICghdGV4dC5zaXplKCkpIHRleHQgPSBlbC5hcHBlbmQoJ3RleHQnKTsKICAgICAgICBpZiAoIXBhdGguc2l6ZSgpKSBwYXRoID0gZWwuYXBwZW5kKCdwYXRoJyk7CgogICAgICAgIHRleHQudGV4dChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQuaW5kaWNhdG9yLnN1YnN0cmluZygwLCA1KTsKICAgICAgICB9KS5hdHRyKCd4JywgMjApOwogICAgICAgIHZhciB0ZXh0Qm94ID0gdGV4dC5ub2RlKCkuZ2V0QkJveCgpOwogICAgICAgIHRleHQuYXR0cigneScsIHRleHRCb3guaGVpZ2h0IC8gMS4zNSk7CiAgICAgICAgcmVjdC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuZGlzcGF0Y2goJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTsKICAgICAgICB9KS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIGQuZGF0YS5leHBhbmRlZCA9ICFkLmRhdGEuZXhwYW5kZWQ7CiAgICAgICAgICBpZiAoIWQuZGF0YS5leHBhbmRlZCkgcHJvcGFnYXRlRXhwYW5kZWQoZCwgZmFsc2UpOwogICAgICAgIH0pLmF0dHIoJ3dpZHRoJywgdGV4dEJveC53aWR0aCArIDI1KS5hdHRyKCdoZWlnaHQnLCB0ZXh0Qm94LmhlaWdodCkuc3R5bGUoJ2ZpbGwnLCAkJC5wb2ludC5maWxsKCkpLnN0eWxlKCdzdHJva2UnLCAkJC5wb2ludC5zdHJva2UoKSk7CgogICAgICAgIHBhdGguYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gaW5kaWNhdG9yU3ltYm9sLnR5cGUoZC5zeW1ib2wpKCk7CiAgICAgICAgfSkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgxMCwgOS41KScpLnN0eWxlKCdmaWxsJywgJCQucG9pbnQuc3Ryb2tlKCkpOwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbmRlcnMgYnViYmxlIHBhY2tzIHJlY3Vyc2l2ZWx5LgogICAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGVsIC0gcGFja3MgY29udGFpbmVyCiAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIC0gcGFja3MgZGF0YQogICAgICogQHBhcmFtIHtkMy50cmFuc2l0aW9uIG9yIG51bGx9IHRyYW5zIC0gdHJhbnNpdGlvbiBpZiBwcmVzZW50CiAgICAgKiBAcGFyYW0ge2QzLnNjYWxlfSB4IC0geCBzY2FsZQogICAgICogQHBhcmFtIHtkMy5zY2FsZX0geSAtIHkgc2NhbGUKICAgICAqIEBwYXJhbSB7ZDMuc2NhbGV9IHByZVggLSBwZXJ2aW91cyB4IHNjYWxlCiAgICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBwcmVZIC0gcGVydmlvdXMgeSBzY2FsZQogICAgICogQHBhcmFtIHtOdW1iZXJ9IHNoaWZ0IC0gaG9yaXpvbnRhbCBwaXhlbCBzaGlmdAogICAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNoYXJ0IC0gbWFzdGVyIGNoYXJ0IGNvbnRhaW5lcgogICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYWRkVG9vbHRpcFBvaW50IC0gZnVuY3Rpb24gdG8gYXBwZW5kIGEgcG9pbnQgdG8gdGhlIHRvb2x0aXAgY29tcG9uZW50CiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dG9FbnRlciAtIGVudGVyIHBvaW50IGF0IGl0cyBvd24gbG9jYXRpb24gcmF0aGVyIHRoYW4gaXRzIHBhcmVudHMKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZXB0aCAtIGRlcHRoIHRyYWNrZXIKICAgICAqLwogICAgZnVuY3Rpb24gcmVuZGVyUGFja3MoZWwsIGRhdGEsIHRyYW5zLCB4LCB5LCBwcmVYLCBwcmVZLCBzaGlmdCwgY2hhcnQsIGFkZFRvb2x0aXBQb2ludCwgYXV0b0VudGVyKSB7CiAgICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxMSAmJiBhcmd1bWVudHNbMTFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMTFdIDogMDsKCiAgICAgIC8vIHNldCBwYWNrIGRhdGEKICAgICAgdmFyIHBhY2sgPSBlbC5zZWxlY3RBbGwoJy5kMmItYnViYmxlLXBhY2suZDJiLWRlcHRoLScgKyBkZXB0aCkuZGF0YShkYXRhLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmtleTsKICAgICAgfSksCiAgICAgICAgICBwYWNrRW50ZXIgPSBwYWNrLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWJ1YmJsZS1wYWNrIGQyYi1kZXB0aC0nICsgZGVwdGgpLAogICAgICAgICAgcGFja1VwZGF0ZSA9IHBhY2subWVyZ2UocGFja0VudGVyKTsKCiAgICAgIHZhciBwb2ludEVudGVyID0gcGFja0VudGVyLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1idWJibGUtcG9pbnQnKTsKICAgICAgaWYgKGF1dG9FbnRlcikgcmVuZGVyUG9pbnQocG9pbnRFbnRlciwgZmFsc2UsIHByZVgsIHByZVksIHNoaWZ0KTsKICAgICAgcG9pbnRFbnRlci5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICByZW5kZXJQb2ludChwYWNrVXBkYXRlLnNlbGVjdCgnLmQyYi1idWJibGUtcG9pbnQnKSwgdHJhbnMsIHgsIHksIHNoaWZ0KTsKICAgICAgcGFja0VudGVyLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1idWJibGUtaW5kaWNhdG9yJyk7CiAgICAgIHJlbmRlckluZGljYXRvcihwYWNrVXBkYXRlLnNlbGVjdCgnLmQyYi1idWJibGUtaW5kaWNhdG9yJykpOwoKICAgICAgLy8gdXBkYXRlIGNoaWxkcmVuIGJ1YmJsZXMgaWYgZXhwYW5kZWQKICAgICAgcGFja1VwZGF0ZS5lYWNoKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgIHZhciBlbCA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICB2YXIgc3ViUGFja3MgPSBlbC5zZWxlY3RBbGwoJy5kMmItYnViYmxlLXBhY2snKTsKICAgICAgICBzdWJQYWNrcyA9IHRyYW5zID8gc3ViUGFja3MudHJhbnNpdGlvbih0cmFucykgOiBzdWJQYWNrczsKCiAgICAgICAgaWYgKHBvaW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwb2ludC5kYXRhLmV4cGFuZGVkKSB7CiAgICAgICAgICByZW5kZXJQYWNrcyhlbCwgcG9pbnQuY2hpbGRyZW4sIHRyYW5zLCB4LCB5LCBwcmVYLCBwcmVZLCBzaGlmdCwgY2hhcnQsIGFkZFRvb2x0aXBQb2ludCwgYXV0b0VudGVyLCBkZXB0aCArIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoYWRkVG9vbHRpcFBvaW50KSBhZGRUb29sdGlwUG9pbnQocG9pbnQpOwogICAgICAgICAgc3ViUGFja3MucmVtb3ZlKCkuc2VsZWN0KCcuZDJiLWJ1YmJsZS1wb2ludCcpLnN0eWxlKCdvcGFjaXR5JywgMCkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgW3gocG9pbnQueCkgKyBzaGlmdCwgeShwb2ludC55KV0gKyAnKScpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICB2YXIgcGFja0V4aXQgPSBwYWNrLmV4aXQoKTsKICAgICAgaWYgKHRyYW5zKSBwYWNrRXhpdCA9IHBhY2tFeGl0LnRyYW5zaXRpb24odHJhbnMpOwogICAgICBwYWNrRXhpdC5yZW1vdmUoKTsKICAgIH0KCiAgICAvLyBSZWN1cnNpdmVseSBzZXQgdGhlIGRhdGEgc3RydWN0dXJlIHN0YXJ0aW5nIGF0IHJvb3Qgbm9kZSBgZGAKICAgIGZ1bmN0aW9uIHNldFN0cnVjdHVyZShkLCB0ZW5kYW5jeSkgewogICAgICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7CgogICAgICBkLmNoaWxkcmVuID0gZC5jaGlsZHJlbiB8fCBbXTsKICAgICAgZC5sZWF2ZXMgPSBkLmNoaWxkcmVuLmxlbmd0aCA/IFtdIDogW2RdOwogICAgICBkLmRlcHRoID0gZGVwdGg7CiAgICAgIGlmIChkLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIGQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgIHNldFN0cnVjdHVyZShjaGlsZCwgdGVuZGFuY3ksIGRlcHRoICsgMSk7CiAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBkOwogICAgICAgICAgZC5sZWF2ZXMgPSBkLmxlYXZlcy5jb25jYXQoY2hpbGQubGVhdmVzKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZC5zaXplID0gb3JlcShkLnNpemUsIGQzLnN1bShkLmxlYXZlcywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5zaXplOwogICAgICB9KSk7CgogICAgICBkLnggPSBvcmVxKGQueCwgKHRlbmRhbmN5LnggfHwgdGVuZGFuY3kpKGQubGVhdmVzLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLng7CiAgICAgIH0sIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuc2l6ZTsKICAgICAgfSkpOwogICAgICBkLnkgPSBvcmVxKGQueSwgKHRlbmRhbmN5LnkgfHwgdGVuZGFuY3kpKGQubGVhdmVzLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLnk7CiAgICAgIH0sIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuc2l6ZTsKICAgICAgfSkpOwogICAgfQoKICAgIC8qIEluaGVyaXQgZnJvbSBiYXNlIG1vZGVsICovCiAgICBiYXNlKGJ1YmJsZVBhY2ssICQkKS5hZGRQcm9wKCdwb2ludCcsIHBvaW50KCkuc2l6ZShmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5zaXplICogMTAwOwogICAgfSkpLmFkZFByb3AoJ3gnLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCd5JywgZDMuc2NhbGVMaW5lYXIoKSkuYWRkUHJvcCgnYW5ub3RhdGlvbicsIGQzU3ZnQW5ub3RhdGlvbi5hbm5vdGF0aW9uID8gZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24oKSA6IG51bGwpLmFkZFByb3BHZXQoJ3R5cGUnLCAnYnViYmxlUGFjaycpLmFkZFByb3BGdW5jdG9yKCdkdXJhdGlvbicsIDI1MCkuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBocycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkOwogICAgfSkKICAgIC8vIGdyYXBoIHByb3BzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ3RlbmRhbmN5JywgbWVhbiwgZnVuY3Rpb24gKF8pIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gJCQudGVuZGFuY3k7CiAgICAgIGlmIChfICYmIF8udGVuZGFuY3kpICQkLnRlbmRhbmN5ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBfOwogICAgICB9O2Vsc2UgJCQudGVuZGFuY3kgPSBmdW5jdG9yKF8pOwoKICAgICAgcmV0dXJuIGJ1YmJsZVBhY2s7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigndG9vbHRpcEdyYXBoJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQudG9vbHRpcEdyYXBoOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3NoaWZ0JywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ2tleScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3ZhbHVlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnZhbHVlczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcihkLmxhYmVsKTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzeW1ib2wnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkMy5zeW1ib2xDaXJjbGU7CiAgICB9KQogICAgLy8gcG9pbnQgcHJvcHMKICAgIC5hZGRQcm9wRnVuY3RvcigncHgnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC54OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3B5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwc2l6ZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnNpemU7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigncGNoaWxkcmVuJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuY2hpbGRyZW47CiAgICB9KS5hZGRQcm9wRnVuY3RvcigncGNvbG9yJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ3BzeW1ib2wnLCBudWxsKS5hZGRQcm9wRnVuY3RvcigncGluZGljYXRvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3BrZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwYW5ub3RhdGlvbicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb247CiAgICB9KQogICAgLy8gbWV0aG9kcwogICAgLmFkZE1ldGhvZCgnZ2V0Q29tcHV0ZWRHcmFwaHMnLCBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICByZXR1cm4gKGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQpLmRhdGEoKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICByZXR1cm4gZ2V0R3JhcGhzKGQsIGkpOwogICAgICB9KTsKICAgIH0pLmFkZE1ldGhvZCgnZ2V0VmlzaWJsZVBvaW50cycsIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgIHZhciBkYXRhID0gYnViYmxlUGFjay5nZXRDb21wdXRlZEdyYXBocyhjb250ZXh0KTsKCiAgICAgIGZ1bmN0aW9uIGFkZFBvaW50KHBvaW50LCBwb2ludHMsIGdyYXBoKSB7CiAgICAgICAgaWYgKCFwb2ludC5kYXRhLmV4cGFuZGVkKSB7CiAgICAgICAgICBwb2ludHMucHVzaCh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIGdyYXBoOiBncmFwaCB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcG9pbnQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZFBvaW50KHBvaW50LCBwb2ludHMsIGdyYXBoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uIChncmFwaHMpIHsKICAgICAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBncmFwaHMubWFwKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgICAgdmFyIHBvaW50cyA9IFtdOwogICAgICAgICAgZ3JhcGgudmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgIHJldHVybiBhZGRQb2ludChwb2ludCwgcG9pbnRzLCBncmFwaCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBwb2ludHM7CiAgICAgICAgfSkpOwogICAgICB9KVswXTsKICAgIH0pOwoKICAgIHJldHVybiBidWJibGVQYWNrOwogIH0KCiAgLy8gc3VuYnVyc3Qgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIHN2Z1N1bmJ1cnN0ICgpIHsKCiAgICB2YXIgJCQgPSB7fTsKCiAgICB2YXIgYXJjID0gZDMuYXJjKCk7CgogICAgLyogVXBkYXRlIEZ1bmN0aW9uICovCiAgICB2YXIgc3VuYnVyc3QgPSBmdW5jdGlvbiBzdW5idXJzdChjb250ZXh0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0OwoKICAgICAgJCQucGllLnZhbHVlKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQudmFsdWU7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIHpvb21hYmxlID0gJCQuem9vbWFibGUoZCwgaSksCiAgICAgICAgICAgIGhpZ2hsaWdodCA9ICQkLmhpZ2hsaWdodChkLCBpKSwKICAgICAgICAgICAgaW5uZXJSYWRpdXMgPSAkJC5pbm5lclJhZGl1cyhkLCBpKSwKICAgICAgICAgICAgc2hvd0xhYmVscyA9ICQkLnNob3dMYWJlbHMoZCwgaSksCiAgICAgICAgICAgIHJvb3QgPSBnZXRIaWVyYXJjaHkoZCk7CgogICAgICAgIHZhciBzZWxlY3RlZCA9IGdldFNlbGVjdGVkKHJvb3QpOwogICAgICAgIHNldFZpc2liaWxpdHkoc2VsZWN0ZWQsICQkLmRlc2NlbmRhbnRMZXZlbHMoZCwgaSkgKyBzZWxlY3RlZC5kZXB0aCk7CgogICAgICAgIHJvb3QuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHJhZGlpID0gZ2V0UmFkaWkoZCwgaSwgcm9vdCwgc2VsZWN0ZWQpOwoKICAgICAgICB1cGRhdGVOb2Rlcy5jYWxsKHRoaXMsIFtyb290XSwgJ2FyYycsIDAsICQkLnN0YXJ0QW5nbGUoZCwgaSksICQkLmVuZEFuZ2xlKGQsIGkpLCB7CiAgICAgICAgICB0cmFuc2l0aW9uOiBjb250ZXh0ICE9PSBzZWxlY3Rpb24gPyBjb250ZXh0IDogbnVsbCwKICAgICAgICAgIG9sZFJhZGlpOiBvcmVxKHRoaXMuX19yYWRpaSwgcmFkaWkpLAogICAgICAgICAgcmFkaWk6IHJhZGlpLAogICAgICAgICAgem9vbWFibGU6IHpvb21hYmxlCiAgICAgICAgfSk7CgogICAgICAgIHVwZGF0ZU5vZGVzLmNhbGwodGhpcywgc2hvd0xhYmVscyA/IFtyb290XSA6IFtdLCAnbGFiZWwnLCAwLCAkJC5zdGFydEFuZ2xlKGQsIGkpLCAkJC5lbmRBbmdsZShkLCBpKSwgewogICAgICAgICAgdHJhbnNpdGlvbjogY29udGV4dCAhPT0gc2VsZWN0aW9uID8gY29udGV4dCA6IG51bGwsCiAgICAgICAgICBvbGRSYWRpaTogb3JlcSh0aGlzLl9fcmFkaWksIHJhZGlpKSwKICAgICAgICAgIHJhZGlpOiByYWRpaQogICAgICAgIH0pOwoKICAgICAgICAvLyBpbnNlcnQgYSBjZW50ZXIgY2lyY2xlIHRoYXQgaXMgdHJhbnNwYXJlbnQsIGJ1dCB3aGVuZXZlciBpdCBpcyBjbGlja2VkCiAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24ncyBwYXJlbnQKICAgICAgICB2YXIgY2VudGVyID0gZWwuc2VsZWN0QWxsKCcuZDJiLXN1bmJ1cnN0LWNlbnRlcicpOwoKICAgICAgICBjZW50ZXIuZGF0YShbc2VsZWN0ZWRdKS5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAnZDJiLXN1bmJ1cnN0LWNlbnRlcicpLm1lcmdlKGNlbnRlcikuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIDApLmF0dHIoJ3InLCBNYXRoLm1heCgwLCBpbm5lclJhZGl1cykpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICBpZiAoIWQucGFyZW50KSByZXR1cm47CiAgICAgICAgICBkLmRhdGEuc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIGQucGFyZW50LmRhdGEuc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKCQkLmR1cmF0aW9uKGQsIGkpKS5jYWxsKHN1bmJ1cnN0KTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5fX3JhZGlpID0gcmFkaWk7CgogICAgICAgIGVsLnNlbGVjdEFsbCgncGF0aC5kMmItc3VuYnVyc3QtYXJjJykub24oJ2NsaWNrJywgem9vbWFibGUgPyBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgcm9vdC5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkLmRhdGEuc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgICAgbm9kZS5kYXRhLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgIGVsLnRyYW5zaXRpb24oKS5kdXJhdGlvbigkJC5kdXJhdGlvbihkLCBpKSkuY2FsbChzdW5idXJzdCk7CiAgICAgICAgfSA6IG51bGwpLm9uKCdtb3VzZW92ZXInLCBoaWdobGlnaHQgPyBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgdmFyIGFuY2VzdG9ycyA9IG5vZGUuYW5jZXN0b3JzKCk7CgogICAgICAgICAgZWwuc2VsZWN0QWxsKCcuZDJiLXN1bmJ1cnN0LWFyYycpLmNsYXNzZWQoJ2QyYi10cmFuc3BhcmVudCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBhbmNlc3RvcnMuaW5kZXhPZihkKSA9PT0gLTE7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBlbC5zZWxlY3RBbGwoJy5kMmItc3VuYnVyc3QtbGFiZWwnKS5jbGFzc2VkKCdkMmItdHJhbnNwYXJlbnQnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gYW5jZXN0b3JzLmluZGV4T2YoZCkgPT09IC0xOwogICAgICAgICAgfSk7CiAgICAgICAgfSA6IG51bGwpLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGVsLnNlbGVjdEFsbCgnLmQyYi1zdW5idXJzdC1hcmMnKS5jbGFzc2VkKCdkMmItdHJhbnNwYXJlbnQnLCBmYWxzZSk7CiAgICAgICAgICBlbC5zZWxlY3RBbGwoJy5kMmItc3VuYnVyc3QtbGFiZWwnKS5jbGFzc2VkKCdkMmItdHJhbnNwYXJlbnQnLCBmYWxzZSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdzdmctc3VuYnVyc3QtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBzdW5idXJzdDsKICAgIH07CgogICAgLyogSW5oZXJpdCBmcm9tIGJhc2UgbW9kZWwgKi8KICAgIGJhc2Uoc3VuYnVyc3QsICQkKS5hZGRQcm9wKCdwaWUnLCBkMy5waWUoKS5zb3J0KG51bGwpKS5hZGRQcm9wKCdhbmNlc3RvckJhbmRpbmcnLCBkMy5zY2FsZUxpbmVhcigpKS5hZGRQcm9wKCdkZXNjZW5kYW50QmFuZGluZycsIGQzLnNjYWxlUG93KCkuZXhwb25lbnQoMC44NSkpCiAgICAvLyBEYXR1bSBMZXZlbCBBY2Nlc3NvcnMKICAgIC5hZGRQcm9wRnVuY3RvcignZHVyYXRpb24nLCAyNTApLmFkZFByb3BGdW5jdG9yKCdpbm5lclJhZGl1cycsIDMwKS5hZGRQcm9wRnVuY3Rvcignb3V0ZXJSYWRpdXMnLCAyMDApLmFkZFByb3BGdW5jdG9yKCdhbmNlc3RvclBhZGRpbmcnLCAxMCkuYWRkUHJvcEZ1bmN0b3IoJ2FuY2VzdG9yUmF0aW8nLCAwLjIpLmFkZFByb3BGdW5jdG9yKCdkZXNjZW5kYW50TGV2ZWxzJywgSW5maW5pdHkpLmFkZFByb3BGdW5jdG9yKCdzdGFydEFuZ2xlJywgMCkuYWRkUHJvcEZ1bmN0b3IoJ2VuZEFuZ2xlJywgMiAqIE1hdGguUEkpLmFkZFByb3BGdW5jdG9yKCdzaG93TGFiZWxzJywgZmFsc2UpLmFkZFByb3BGdW5jdG9yKCd6b29tYWJsZScsIHRydWUpLmFkZFByb3BGdW5jdG9yKCdoaWdobGlnaHQnLCB0cnVlKQogICAgLy8gTm9kZSBMZXZlbCBBY2Nlc3NvcnMKICAgIC5hZGRQcm9wRnVuY3Rvcigna2V5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuICQkLmxhYmVsKGQpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2xhYmVsJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignY29sb3InLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gY29sb3IoJCQubGFiZWwoZCkpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2NoaWxkcmVuJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuY2hpbGRyZW47CiAgICB9KS5hZGRQcm9wRnVuY3Rvcignc2l6ZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnNpemU7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBnZXRIaWVyYXJjaHkoZCkgewogICAgICAvLyBjb21wdXRlIGEgaGllcmFyY2h5IGJhc2VkIG9uIHRoZSByb290LCBvbmx5IHVzZSBzaXplcyBmb3IgbGVhZiBub2Rlcy4KICAgICAgcmV0dXJuIHVwZGF0ZURlc2NlbmRhbnRzKGQzLmhpZXJhcmNoeShkLCAkJC5jaGlsZHJlbikuc3VtKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIGNoaWxkcmVuID0gJCQuY2hpbGRyZW4oZCk7CiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSByZXR1cm4gJCQuc2l6ZShkKTsKICAgICAgfSkpOwogICAgICAvLyByZXR1cm4gdXBkYXRlRGVzY2VuZGFudHMoZDMuaGllcmFyY2h5KGQsICQkLmNoaWxkcmVuKS5zdW0oJCQuc2l6ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURlc2NlbmRhbnRzKG5vZGUpIHsKICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7CgogICAgICBub2RlLmtleSA9ICQkLmtleShub2RlLmRhdGEsIGkpOwogICAgICBub2RlLmNvbG9yID0gJCQuY29sb3Iobm9kZS5kYXRhLCBpKTsKICAgICAgbm9kZS5sYWJlbCA9ICQkLmxhYmVsKG5vZGUuZGF0YSwgaSk7CiAgICAgIG5vZGUuc2l6ZSA9ICQkLnNpemUobm9kZS5kYXRhLCBpKTsKICAgICAgbm9kZS52YWx1ZSA9IG5vZGUuc2l6ZTsKCiAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgcmV0dXJuOwoKICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKHVwZGF0ZURlc2NlbmRhbnRzKTsKCiAgICAgIG5vZGUudmFsdWUgPSBnZXRWYWx1ZShub2RlKTsKCiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFZhbHVlKG5vZGUpIHsKICAgICAgcmV0dXJuIG9yZXEobm9kZS5zaXplLCBub2RlLmNoaWxkcmVuID8gZDMuc3VtKG5vZGUuY2hpbGRyZW4sIGdldFZhbHVlKSA6IDApOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkKHJvb3QpIHsKICAgICAgdmFyIG5vZGUgPSBudWxsOwoKICAgICAgLy8gZmluZCBzZWxlY3RlZCBub2RlCiAgICAgIHJvb3QuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIGlmIChkLmRhdGEuc2VsZWN0ZWQpIG5vZGUgPSBkOwogICAgICB9KTsKCiAgICAgIC8vIGlmIHNlbGVjdGVkIGlzbid0IGRlZmluZWQgc2V0IGl0IHRvIHRoZSByb290IG5vZGUKICAgICAgaWYgKCFub2RlKSBub2RlID0gcm9vdDsKICAgICAgLy8gaWYgc2VsZWN0ZWQgaXMgYSBsZWFmIChib3R0b20pIG5vZGUgZ2l2ZSBzZWxlY3RlZCB0byB0aGUgcGFyZW50CiAgICAgIC8vIGVsc2UgaWYgKCghbm9kZS5jaGlsZHJlbiB8fCAhbm9kZS5jaGlsZHJlbi5sZW5ndGgpICYmIG5vZGUucGFyZW50KSB7CiAgICAgIC8vICAgbm9kZS5kYXRhLnNlbGVjdGVkID0gZmFsc2U7CiAgICAgIC8vICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICAvLyB9CgogICAgICAvLyBtYWtlIHN1cmUgc2VsZWN0ZWQgZmxhZyBpcyBzdGlsbCBhc3NlcnRlZAogICAgICBub2RlLmRhdGEuc2VsZWN0ZWQgPSB0cnVlOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLy8gc2V0IHZpc2liaWxpdHkgZmxhZyBmb3IgYWxsIG5vZGVzCiAgICBmdW5jdGlvbiBzZXRWaXNpYmlsaXR5KGQsIG1heERlcHRoKSB7CiAgICAgIGQuYW5jZXN0b3JzKCkuY29uY2F0KGQuZGVzY2VuZGFudHMoKSkuZmlsdGVyKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuZGVwdGggPD0gbWF4RGVwdGggJiYgZC52YWx1ZSA+IDA7CiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC52aXNpYmxlID0gdHJ1ZTsKICAgICAgfSk7CiAgICB9CgogICAgLy8gcmV0dXJucyBhIGZ1bmN0aW9uIHVzZWQgdG8gZmluZCB0aGUgaW5uZXIvb3V0ZXIgcmFkaWkgZm9yIGFuIGFyYyBiYXNlZAogICAgLy8gb24gaXQncyBkZXB0aAogICAgZnVuY3Rpb24gZ2V0UmFkaWkoZCwgaSwgcm9vdCwgc2VsZWN0ZWQpIHsKICAgICAgdmFyIGlubmVyUmFkaXVzID0gJCQuaW5uZXJSYWRpdXMoZCwgaSksCiAgICAgICAgICBvdXRlclJhZGl1cyA9ICQkLm91dGVyUmFkaXVzKGQsIGkpLAogICAgICAgICAgYW5jZXN0b3JQYWRkaW5nID0gJCQuYW5jZXN0b3JQYWRkaW5nKGQsIGkpLAogICAgICAgICAgYW5jZXN0b3JSYXRpbyA9ICQkLmFuY2VzdG9yUmF0aW8oZCwgaSk7CgogICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgIHJvb3QuZWFjaChmdW5jdGlvbiAobm9kZSkgewogICAgICAgIGlmIChub2RlLnZpc2libGUpIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgbm9kZS5kZXB0aCk7CiAgICAgIH0pOwoKICAgICAgdmFyIHdpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyAtIGFuY2VzdG9yUGFkZGluZywKICAgICAgICAgIGJyZWFrcG9pbnQgPSBpbm5lclJhZGl1cyArIHdpZHRoICogYW5jZXN0b3JSYXRpbywKCiAgICAgIC8vIHJhZGlpLWlubmVyLXNjYWxlIGlzIHVzZWQgdG8gcG9zaXRpb24gaW5uZXIgYmFuZHMKICAgICAgcmFkaWlJbm5lciA9ICQkLmFuY2VzdG9yQmFuZGluZy5jb3B5KCkucmFuZ2UoW2lubmVyUmFkaXVzLCBicmVha3BvaW50XSkuZG9tYWluKFswLCBzZWxlY3RlZC5kZXB0aCArIDFdKSwKCiAgICAgIC8vIHJhZGlpLW91dGVyLXNjYWxlIGlzIHVzZWQgdG8gcG9zaXRpb24gb3V0ZXIgYmFuZHMKICAgICAgcmFkaWlPdXRlciA9ICQkLmRlc2NlbmRhbnRCYW5kaW5nLmNvcHkoKS5yYW5nZShbYnJlYWtwb2ludCArIGFuY2VzdG9yUGFkZGluZywgb3V0ZXJSYWRpdXNdKS5kb21haW4oW3NlbGVjdGVkLmRlcHRoICsgMSwgaGVpZ2h0ICsgMV0pOwoKICAgICAgLy8gZmV0Y2ggdGhlIHsgaW5uZXIsIG91dGVyIH0gcmFkaWkgZm9yIGFuIGFyYyBiYXNlZCBvbiBpdCdzIGRlcHRoCiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVwdGgpIHsKICAgICAgICB2YXIgc2NhbGUgPSB2b2lkIDA7CiAgICAgICAgaWYgKGRlcHRoIDw9IHNlbGVjdGVkLmRlcHRoKSBzY2FsZSA9IHJhZGlpSW5uZXI7ZWxzZSBzY2FsZSA9IHJhZGlpT3V0ZXI7CiAgICAgICAgcmV0dXJuIHsgaW5uZXI6IHNjYWxlKGRlcHRoKSwgb3V0ZXI6IHNjYWxlKGRlcHRoICsgMSkgfTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uKGNlbnRlckFuZ2xlKSB7CiAgICAgIGlmIChjZW50ZXJBbmdsZSA+IE1hdGguUEkpIHJldHVybiB0b0RlZ3JlZXMoY2VudGVyQW5nbGUpICsgOTA7ZWxzZSByZXR1cm4gdG9EZWdyZWVzKGNlbnRlckFuZ2xlKSAtIDkwOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldExhYmVsT2Zmc2V0KGNlbnRlckFuZ2xlLCByYWRpaSkgewogICAgICB2YXIgb2Zmc2V0ID0gKHJhZGlpLmlubmVyIC0gcmFkaWkub3V0ZXIpIC8gMi4yOwogICAgICBpZiAoY2VudGVyQW5nbGUgPiBNYXRoLlBJKSByZXR1cm4gLW9mZnNldDtlbHNlIHJldHVybiBvZmZzZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0TGFiZWxBbmNob3IoY2VudGVyQW5nbGUpIHsKICAgICAgaWYgKGNlbnRlckFuZ2xlID4gTWF0aC5QSSkgcmV0dXJuICdlbmQnO2Vsc2UgcmV0dXJuICdzdGFydCc7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTm9kZXMobmV3RGF0YSwgdHlwZSwgZGVwdGgsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCB0b29scykgewoKICAgICAgdmFyIHR3ZWVuID0gdHlwZSA9PT0gJ2FyYycgPyB0d2VlbkFyYyA6IHR3ZWVuQ2VudHJvaWQ7CgogICAgICBuZXdEYXRhID0gbmV3RGF0YS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC52aXNpYmxlOwogICAgICB9KTsKCiAgICAgICQkLnBpZS5zdGFydEFuZ2xlKHN0YXJ0QW5nbGUpLmVuZEFuZ2xlKGVuZEFuZ2xlKTsKCiAgICAgICQkLnBpZShuZXdEYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIHJhZGlpID0gdG9vbHMucmFkaWkoZC5kYXRhLmRlcHRoKTsKCiAgICAgICAgZC5kYXRhLnN0YXJ0QW5nbGUgPSBkLnN0YXJ0QW5nbGU7CiAgICAgICAgZC5kYXRhLmVuZEFuZ2xlID0gZC5lbmRBbmdsZTsKICAgICAgICBkLmRhdGEucGFkQW5nbGUgPSBkLnBhZEFuZ2xlOwogICAgICAgIGQuZGF0YS5pbm5lclJhZGl1cyA9IHJhZGlpLmlubmVyOwogICAgICAgIGQuZGF0YS5vdXRlclJhZGl1cyA9IHJhZGlpLm91dGVyOwogICAgICAgIGQuZGF0YS5jZW50ZXJBbmdsZSA9IChkLnN0YXJ0QW5nbGUgKyBkLmVuZEFuZ2xlKSAvIDI7CgogICAgICAgIGQuZGF0YS5yb3RhdGUgPSBnZXRMYWJlbFJvdGF0aW9uKGQuZGF0YS5jZW50ZXJBbmdsZSk7CiAgICAgICAgZC5kYXRhLmxhYmVsT2Zmc2V0ID0gZ2V0TGFiZWxPZmZzZXQoZC5kYXRhLmNlbnRlckFuZ2xlLCByYWRpaSk7CiAgICAgICAgZC5kYXRhLmxhYmVsQW5jaG9yID0gZ2V0TGFiZWxBbmNob3IoZC5kYXRhLmNlbnRlckFuZ2xlKTsKICAgICAgfSk7CgogICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICBsZXZlbENsYXNzID0gJ2QyYi1zdW5idXJzdC1sZXZlbC0nICsgZGVwdGg7CgogICAgICB2YXIgYXJjVXBkYXRlID0gZWwuc2VsZWN0QWxsKCcuZDJiLXN1bmJ1cnN0LScgKyB0eXBlICsgJy1ncm91cC4nICsgbGV2ZWxDbGFzcyk7CgogICAgICB2YXIgb2xkRGF0YSA9IGFyY1VwZGF0ZS5kYXRhKCk7CgogICAgICBhcmNVcGRhdGUgPSBhcmNVcGRhdGUuZGF0YShuZXdEYXRhLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmtleTsKICAgICAgfSk7CgogICAgICB2YXIgYXJjRW50ZXIgPSBhcmNVcGRhdGUuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItc3VuYnVyc3QtJyArIHR5cGUgKyAnLWdyb3VwICcgKyBsZXZlbENsYXNzKSwKICAgICAgICAgIHBhdGhFbnRlciA9IGFyY0VudGVyLmFwcGVuZCh0eXBlID09PSAnYXJjJyA/ICdwYXRoJyA6ICd0ZXh0JykuYXR0cignY2xhc3MnLCAnZDJiLXN1bmJ1cnN0LScgKyB0eXBlICsgJyAnICsgbGV2ZWxDbGFzcykuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgIHZhciByYWRpaSA9IHRvb2xzLm9sZFJhZGlpKGQuZGVwdGgpLAogICAgICAgICAgICBuZWlnaGJvciA9IGQubmVpZ2hib3IgfHwgZmluZE5laWdoYm9yQXJjKGksIG9sZERhdGEsIG5ld0RhdGEpOwoKICAgICAgICB0aGlzLmN1cnJlbnQgPSB7CiAgICAgICAgICBzdGFydEFuZ2xlOiBuZWlnaGJvci5zdGFydEFuZ2xlLAogICAgICAgICAgZW5kQW5nbGU6IG5laWdoYm9yLmVuZEFuZ2xlLAogICAgICAgICAgaW5uZXJSYWRpdXM6IHJhZGlpLmlubmVyLAogICAgICAgICAgb3V0ZXJSYWRpdXM6IHJhZGlpLm91dGVyLAogICAgICAgICAgcm90YXRlOiBnZXRMYWJlbFJvdGF0aW9uKChuZWlnaGJvci5zdGFydEFuZ2xlICsgbmVpZ2hib3IuZW5kQW5nbGUpIC8gMikKICAgICAgICB9OwoKICAgICAgICBpZiAoIWQuY2hpbGRyZW4pIHJldHVybjsKCiAgICAgICAgZC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChkZCkgewogICAgICAgICAgcmV0dXJuIGRkLm5laWdoYm9yID0gbmVpZ2hib3I7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgYXJjRW50ZXIuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLXN1bmJ1cnN0LScgKyB0eXBlICsgJy1jaGlsZHJlbiAnICsgbGV2ZWxDbGFzcyk7CgogICAgICBpZiAodHlwZSA9PT0gJ2FyYycpIHBhdGhFbnRlci5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICAgIH0pO2Vsc2UgcGF0aEVudGVyLnN0eWxlKCdvcGFjaXR5JywgMCkuYXR0cigneScsIDQpOwoKICAgICAgdmFyIGFyY0V4aXQgPSBhcmNVcGRhdGUuZXhpdCgpOwoKICAgICAgYXJjVXBkYXRlID0gYXJjVXBkYXRlLm1lcmdlKGFyY0VudGVyKTsKCiAgICAgIGFyY1VwZGF0ZS5zZWxlY3QoJy5kMmItc3VuYnVyc3QtJyArIHR5cGUgKyAnLicgKyBsZXZlbENsYXNzKS5jbGFzc2VkKCdkMmItc3VuYnVyc3QtYW5jZXN0b3InLCBmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLmRlcHRoIDwgZC5zZWxlY3RlZC5kZXB0aDsKICAgICAgfSk7CgogICAgICBpZiAodG9vbHMudHJhbnNpdGlvbikgewoKICAgICAgICBhcmNFeGl0LmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHZhciBkYXRhID0gZmluZE5laWdoYm9yQXJjKGksIG5ld0RhdGEsIG9sZERhdGEpOwogICAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpOwoKICAgICAgICAgIHZhciBwYXRoRXhpdCA9IGVsLnNlbGVjdEFsbCgnLmQyYi1zdW5idXJzdC0nICsgdHlwZSkuZGF0dW0oZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgdmFyIHJhZGlpID0gdG9vbHMucmFkaWkoZC5kZXB0aCk7CiAgICAgICAgICAgIGQuaW5uZXJSYWRpdXMgPSByYWRpaS5pbm5lcjsKICAgICAgICAgICAgZC5vdXRlclJhZGl1cyA9IHJhZGlpLm91dGVyOwogICAgICAgICAgICBkLnN0YXJ0QW5nbGUgPSBkYXRhLnN0YXJ0QW5nbGU7CiAgICAgICAgICAgIGQuZW5kQW5nbGUgPSBkYXRhLmVuZEFuZ2xlOwogICAgICAgICAgICBkLmNlbnRlckFuZ2xlID0gZGF0YS5jZW50ZXJBbmdsZTsKCiAgICAgICAgICAgIGQucm90YXRlID0gZ2V0TGFiZWxSb3RhdGlvbihkLmNlbnRlckFuZ2xlKTsKICAgICAgICAgICAgZC5sYWJlbE9mZnNldCA9IGdldExhYmVsT2Zmc2V0KGQuY2VudGVyQW5nbGUsIHJhZGlpKTsKCiAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgfSkudHJhbnNpdGlvbih0b29scy50cmFuc2l0aW9uKS5jYWxsKHR3ZWVuLCBhcmMpOwoKICAgICAgICAgIGlmICh0eXBlID09PSAnbGFiZWwnKSB7CiAgICAgICAgICAgIHBhdGhFeGl0LnN0eWxlKCdvcGFjaXR5JywgMCkuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGQubGFiZWxPZmZzZXQ7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBhcmNFeGl0ID0gYXJjRXhpdC50cmFuc2l0aW9uKHRvb2xzLnRyYW5zaXRpb24pOwoKICAgICAgICBhcmNVcGRhdGUgPSBhcmNVcGRhdGUudHJhbnNpdGlvbih0b29scy50cmFuc2l0aW9uKTsKICAgICAgfQoKICAgICAgYXJjRXhpdC5yZW1vdmUoKTsKCiAgICAgIHZhciBwYXRoVXBkYXRlID0gYXJjVXBkYXRlLnNlbGVjdCgnLmQyYi1zdW5idXJzdC0nICsgdHlwZSArICcuJyArIGxldmVsQ2xhc3MpLmNhbGwodHdlZW4sIGFyYyk7CgogICAgICBpZiAodHlwZSA9PT0gJ2FyYycpIHsKICAgICAgICBwYXRoVXBkYXRlLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLmNvbG9yOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHBhdGhVcGRhdGUudGV4dChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQuZGVwdGggPj0gZC5zZWxlY3RlZC5kZXB0aCA/IGQubGFiZWwgOiAnJzsKICAgICAgICB9KS5zdHlsZSgnb3BhY2l0eScsIDEpLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQubGFiZWxPZmZzZXQ7CiAgICAgICAgfSkuc3R5bGUoJ3RleHQtYW5jaG9yJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLmxhYmVsQW5jaG9yOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBhcmNVcGRhdGUuc2VsZWN0KCcuZDJiLXN1bmJ1cnN0LScgKyB0eXBlICsgJy1jaGlsZHJlbi4nICsgbGV2ZWxDbGFzcykuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGQuY2hpbGRyZW4gfHwgW107CiAgICAgICAgdmFyIGNoaWxkcmVuVG90YWwgPSBkMy5zdW0oY2hpbGRyZW4sIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICByZXR1cm4gYy52YWx1ZTsKICAgICAgICB9KTsKICAgICAgICB2YXIgY2hpbGRyZW5FbmRBbmdsZSA9IGQuc3RhcnRBbmdsZSArIChkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlKSAqIGNoaWxkcmVuVG90YWwgLyBkLnZhbHVlOwogICAgICAgIHVwZGF0ZU5vZGVzLmNhbGwodGhpcywgY2hpbGRyZW4sIHR5cGUsIGRlcHRoICsgMSwgZC5zdGFydEFuZ2xlLCBjaGlsZHJlbkVuZEFuZ2xlLCB0b29scyk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmROZWlnaGJvckFyYyhpLCBkYXRhMCwgZGF0YTEpIHsKICAgICAgdmFyIHByZWNlZGluZyA9IGZpbmRQcmVjZWRpbmcoaSwgZGF0YTAsIGRhdGExKSwKICAgICAgICAgIGZvbGxvd2luZyA9IGZpbmRGb2xsb3dpbmcoaSwgZGF0YTAsIGRhdGExKTsKICAgICAgaWYgKHByZWNlZGluZykgewogICAgICAgIHJldHVybiB7IHN0YXJ0QW5nbGU6IHByZWNlZGluZy5lbmRBbmdsZSwgZW5kQW5nbGU6IHByZWNlZGluZy5lbmRBbmdsZSB9OwogICAgICB9IGVsc2UgaWYgKGZvbGxvd2luZykgewogICAgICAgIHJldHVybiB7IHN0YXJ0QW5nbGU6IGZvbGxvd2luZy5zdGFydEFuZ2xlLCBlbmRBbmdsZTogZm9sbG93aW5nLnN0YXJ0QW5nbGUgfTsKICAgICAgfQogICAgICByZXR1cm4geyBzdGFydEFuZ2xlOiAwLCBlbmRBbmdsZTogMCwgY2VudGVyQW5nbGU6IDAgfTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGluIGRhdGEwIHRoYXQgam9pbnMgdGhlIGhpZ2hlc3QgcHJlY2VkaW5nIGVsZW1lbnQgaW4gZGF0YTEuCiAgICBmdW5jdGlvbiBmaW5kUHJlY2VkaW5nKGksIGRhdGEwLCBkYXRhMSkgewogICAgICB2YXIgbSA9IGRhdGEwLmxlbmd0aDsKICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICAgICAgdmFyIGsgPSBkYXRhMVtpXS5rZXk7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmIChkYXRhMFtqXS5rZXkgPT09IGspIHJldHVybiBkYXRhMFtqXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGluIGRhdGEwIHRoYXQgam9pbnMgdGhlIGxvd2VzdCBmb2xsb3dpbmcgZWxlbWVudCBpbiBkYXRhMS4KICAgIGZ1bmN0aW9uIGZpbmRGb2xsb3dpbmcoaSwgZGF0YTAsIGRhdGExKSB7CiAgICAgIHZhciBuID0gZGF0YTEubGVuZ3RoLAogICAgICAgICAgbSA9IGRhdGEwLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICB2YXIgayA9IGRhdGExW2ldLmtleTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKGRhdGEwW2pdLmtleSA9PT0gaykgcmV0dXJuIGRhdGEwW2pdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBzdW5idXJzdDsKICB9CgogIC8vIHNhbmtleSBzdmcgZ2VuZXJhdG9yCiAgZnVuY3Rpb24gc2Fua2V5JDEgKCkgewoKICAgIHZhciAkJCA9IHt9OwoKICAgIC8qIFVwZGF0ZSBGdW5jdGlvbiAqLwogICAgdmFyIHNhbmtleSA9IGZ1bmN0aW9uIHNhbmtleShjb250ZXh0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0OwoKICAgICAgc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKGRhdHVtKSB7CiAgICAgICAgdmFyIHRyYW5zaXRpb24gPSBjb250ZXh0ID09PSBzZWxlY3Rpb24gPyBudWxsIDogY29udGV4dDsKCiAgICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgICBzaXplID0gJCQuc2l6ZShkYXR1bSksCiAgICAgICAgICAgIHNhbmtleUxpbmsgPSBkM1NhbmtleS5zYW5rZXlMaW5rSG9yaXpvbnRhbCgpOwoKICAgICAgICAvLyBtYXAgbm9kZSBkYXRhIHdyYXBwZXIKICAgICAgICB2YXIgbm9kZXNEYXRhID0gJCQubm9kZXMoZGF0dW0pLm1hcChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgdmFyIGtleSA9ICQkLm5vZGVLZXkoZCwgaSk7CgogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgIGxhYmVsOiAkJC5ub2RlTGFiZWwoZCwgaSwga2V5KSwKICAgICAgICAgICAgY29sb3I6ICQkLm5vZGVDb2xvcihkLCBpLCBrZXkpLAogICAgICAgICAgICBkcmFnZ2FibGVYOiAkJC5ub2RlRHJhZ2dhYmxlWChkLCBpKSwKICAgICAgICAgICAgZHJhZ2dhYmxlWTogJCQubm9kZURyYWdnYWJsZVkoZCwgaSksCiAgICAgICAgICAgIHByZXNlcnZlRHJhZ2dpbmc6ICQkLm5vZGVQcmVzZXJ2ZURyYWdnaW5nKGQsIGkpLAogICAgICAgICAgICB3cmFwTGVuZ3RoOiAkJC5ub2RlTGFiZWxXcmFwTGVuZ3RoKGQsIGkpLAogICAgICAgICAgICBkYXRhOiBkLAogICAgICAgICAgICBpbmRleDogaQogICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gbWFwIGxpbmsgZGF0YSB3cmFwcGVyCiAgICAgICAgdmFyIGxpbmtzRGF0YSA9ICQkLmxpbmtzKGRhdHVtKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSAkJC5saW5rU291cmNlKGQsIGkpLAogICAgICAgICAgICAgIHRhcmdldCA9ICQkLmxpbmtUYXJnZXQoZCwgaSk7CgogICAgICAgICAgdmFyIHNvdXJjZUtleSA9ICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzb3VyY2UpKSA9PT0gJ29iamVjdCcgPyAkJC5ub2RlS2V5KHNvdXJjZSkgOiBzb3VyY2UsCiAgICAgICAgICAgICAgdGFyZ2V0S2V5ID0gKHR5cGVvZiB0YXJnZXQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHRhcmdldCkpID09PSAnb2JqZWN0JyA/ICQkLm5vZGVLZXkodGFyZ2V0KSA6IHRhcmdldDsKCiAgICAgICAgICB2YXIga2V5ID0gJCQubGlua0tleShkLCBpLCBzb3VyY2VLZXksIHRhcmdldEtleSk7CgogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc291cmNlS2V5OiBzb3VyY2VLZXksCiAgICAgICAgICAgIHRhcmdldEtleTogdGFyZ2V0S2V5LAogICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAga2V5VHJpbToga2V5LnJlcGxhY2UoLyAvZywgJycpLAogICAgICAgICAgICBzb3VyY2VDb2xvcjogJCQubGlua1NvdXJjZUNvbG9yKGQsIGksIHNvdXJjZUtleSksCiAgICAgICAgICAgIHRhcmdldENvbG9yOiAkJC5saW5rVGFyZ2V0Q29sb3IoZCwgaSwgdGFyZ2V0S2V5KSwKICAgICAgICAgICAgdmFsdWU6ICQkLmxpbmtWYWx1ZShkLCBpKSwKICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsCiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LAogICAgICAgICAgICBkYXRhOiBkLAogICAgICAgICAgICBpbmRleDogaQogICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gY29uZmlnIHNhbmtleQogICAgICAgICQkLnNhbmtleS5zaXplKFtzaXplLndpZHRoLCBzaXplLmhlaWdodF0pLm5vZGVJZChmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICAgIH0pLm5vZGVzKG5vZGVzRGF0YSkubGlua3MobGlua3NEYXRhKTsKCiAgICAgICAgdmFyIG5vZGVXaWR0aCA9ICQkLnNhbmtleS5ub2RlV2lkdGgoKTsKCiAgICAgICAgLy8gZ2V0IHNhbmtleSBncmFwaCBsYXlvdXQgYW5kIGZpbHRlciBvdXQgdGhvc2UgdGhhdCBoYXZlIGEgZmFsc3kgdmFsdWUKICAgICAgICB2YXIgZ3JhcGggPSAkJC5zYW5rZXkubm9kZXMobm9kZXNEYXRhKS5saW5rcyhsaW5rc0RhdGEpKCk7CiAgICAgICAgZ3JhcGgubGlua3MgPSBncmFwaC5saW5rcy5maWx0ZXIoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHJldHVybiAhIW4udmFsdWU7CiAgICAgICAgfSk7CiAgICAgICAgZ3JhcGgubm9kZXMgPSBncmFwaC5ub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHJldHVybiAhIW4udmFsdWU7CiAgICAgICAgfSk7CiAgICAgICAgZ3JhcGggPSAkJC5zYW5rZXkubm9kZXMoZ3JhcGgubm9kZXMpLmxpbmtzKGdyYXBoLmxpbmtzKSgpOwoKICAgICAgICAvLyByZW5kZXIgbGluayBncmFkaWVudHMKICAgICAgICB2YXIgbGlua0RlZnMgPSBlbC5zZWxlY3RBbGwoJy5kMmItc2Fua2V5LWxpbmstZGVmcycpLmRhdGEoW2dyYXBoLmxpbmtzXSksCiAgICAgICAgICAgIGxpbmtzRGVmc0VudGVyID0gbGlua0RlZnMuZW50ZXIoKS5hcHBlbmQoJ2RlZnMnKS5hdHRyKCdjbGFzcycsICdkMmItc2Fua2V5LWxpbmstZGVmcycpOwoKICAgICAgICBsaW5rRGVmcyA9IGxpbmtEZWZzLm1lcmdlKGxpbmtzRGVmc0VudGVyKTsKCiAgICAgICAgdmFyIGxpbmtHcmFkaWVudCA9IGxpbmtEZWZzLnNlbGVjdEFsbCgnLmQyYi1kZWYtZ3JhZGllbnQnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZDsKICAgICAgICB9LCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQua2V5VHJpbTsKICAgICAgICB9KSwKICAgICAgICAgICAgbGlua0dyYWRpZW50RW50ZXIgPSBsaW5rR3JhZGllbnQuZW50ZXIoKS5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JykuYXR0cignY2xhc3MnLCAnZDJiLWRlZi1ncmFkaWVudCcpLAogICAgICAgICAgICBsaW5rR3JhZGllbnRFeGl0ID0gbGlua0dyYWRpZW50LmV4aXQoKTsKCiAgICAgICAgbGlua0dyYWRpZW50RW50ZXIuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnZDJiLWdyYWRpZW50LWZyb20nKS5hdHRyKCdvZmZzZXQnLCAnMCUnKTsKCiAgICAgICAgbGlua0dyYWRpZW50RW50ZXIuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnZDJiLWdyYWRpZW50LXRvJykuYXR0cignb2Zmc2V0JywgJzEwMCUnKTsKCiAgICAgICAgbGlua0dyYWRpZW50ID0gbGlua0dyYWRpZW50Lm1lcmdlKGxpbmtHcmFkaWVudEVudGVyKTsKCiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHsKICAgICAgICAgIGxpbmtHcmFkaWVudEV4aXQgPSBsaW5rR3JhZGllbnRFeGl0LnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgICAgICBsaW5rR3JhZGllbnQgPSBsaW5rR3JhZGllbnQudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICB9CgogICAgICAgIGxpbmtHcmFkaWVudEV4aXQucmVtb3ZlKCk7CgogICAgICAgIGxpbmtHcmFkaWVudC5hdHRyKCdpZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5rZXlUcmltOwogICAgICAgIH0pOwoKICAgICAgICBsaW5rR3JhZGllbnQuc2VsZWN0KCcuZDJiLWdyYWRpZW50LWZyb20nKS5hdHRyKCdzdG9wLWNvbG9yJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkLnNvdXJjZUNvbG9yOwogICAgICAgIH0pOwoKICAgICAgICBsaW5rR3JhZGllbnQuc2VsZWN0KCcuZDJiLWdyYWRpZW50LXRvJykuYXR0cignc3RvcC1jb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC50YXJnZXRDb2xvcjsKICAgICAgICB9KTsKCiAgICAgICAgLy8gcmVuZGVyIGxpbmtzCiAgICAgICAgdmFyIGxpbmtzID0gZWwuc2VsZWN0QWxsKCcuZDJiLXNhbmtleS1saW5rcycpLmRhdGEoW2dyYXBoLmxpbmtzXSksCiAgICAgICAgICAgIGxpbmtzRW50ZXIgPSBsaW5rcy5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1zYW5rZXktbGlua3MnKTsKCiAgICAgICAgbGlua3MgPSBsaW5rcy5tZXJnZShsaW5rc0VudGVyKTsKCiAgICAgICAgdmFyIGxpbmsgPSBsaW5rcy5zZWxlY3RBbGwoJy5kMmItc2Fua2V5LWxpbmsnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZDsKICAgICAgICB9LCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICAgIH0pLAogICAgICAgICAgICBsaW5rRW50ZXIgPSBsaW5rLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLXNhbmtleS1saW5rJyksCiAgICAgICAgICAgIGxpbmtFeGl0ID0gbGluay5leGl0KCk7CgogICAgICAgIHZhciBsaW5rU3RhdGljID0gbGluayA9IGxpbmsubWVyZ2UobGlua0VudGVyKTsKCiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHsKICAgICAgICAgIGxpbmsgPSBsaW5rLnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgICAgICBsaW5rRXhpdCA9IGxpbmtFeGl0LnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgICAgfQoKICAgICAgICAvLyByZW5kZXIgbm9kZXMKICAgICAgICB2YXIgbm9kZXMgPSBlbC5zZWxlY3RBbGwoJy5kMmItc2Fua2V5LW5vZGVzJykuZGF0YShbZ3JhcGgubm9kZXNdKSwKICAgICAgICAgICAgbm9kZXNFbnRlciA9IG5vZGVzLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLXNhbmtleS1ub2RlcycpOwoKICAgICAgICBub2RlcyA9IG5vZGVzLm1lcmdlKG5vZGVzRW50ZXIpOwoKICAgICAgICB2YXIgbm9kZSA9IG5vZGVzLnNlbGVjdEFsbCgnLmQyYi1zYW5rZXktbm9kZScpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBkOwogICAgICAgIH0sIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5rZXk7CiAgICAgICAgfSksCiAgICAgICAgICAgIG5vZGVFbnRlciA9IG5vZGUuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItc2Fua2V5LW5vZGUnKSwKICAgICAgICAgICAgbm9kZUV4aXQgPSBub2RlLmV4aXQoKTsKCiAgICAgICAgdmFyIG5vZGVTdGF0aWMgPSBub2RlID0gbm9kZS5tZXJnZShub2RlRW50ZXIpOwoKICAgICAgICBpZiAodHJhbnNpdGlvbikgewogICAgICAgICAgbm9kZSA9IG5vZGUudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICAgIG5vZGVFeGl0ID0gbm9kZUV4aXQudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldHVwIG5vZGUgZHJhZ2dpbmcgYW5kIHByZXNlcnZlIHByZXZpb3VzIGRyYWdnaW5nCiAgICAgICAgbm9kZS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICBpZiAoZC5kcmFnZ2FibGVYIHx8IGQuZHJhZ2dhYmxlWSkgewogICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgnZDJiLWRyYWdnYWJsZScsIHRydWUpLmNhbGwoZDMuZHJhZygpLm9uKCdkcmFnJywgZHJhZykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoJ2QyYi1kcmFnZ2FibGUnLCBmYWxzZSkub24oJy5kcmFnJywgbnVsbCk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGQucHJlc2VydmVEcmFnZ2luZykgewogICAgICAgICAgICBpZiAodGhpcy5fX2RyYWdYMCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgZC54MCA9IHRoaXMuX19kcmFnWDAgKiBzaXplLndpZHRoOwogICAgICAgICAgICAgIGQueDEgPSBkLngwICsgbm9kZVdpZHRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5fX2RyYWdZMCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IGQueTEgLSBkLnkwOwogICAgICAgICAgICAgIGQueTAgPSB0aGlzLl9fZHJhZ1kwICogc2l6ZS5oZWlnaHQ7CiAgICAgICAgICAgICAgZC55MSA9IGQueTAgKyBoZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJCQuc2Fua2V5LnVwZGF0ZShncmFwaCk7CgogICAgICAgIGxpbmtFbnRlci5zdHlsZSgnb3BhY2l0eScsIDApLmFwcGVuZCgncGF0aCcpLmF0dHIoJ2QnLCBzYW5rZXlMaW5rKS5zdHlsZSgnc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiAndXJsKCMnICsgZC5rZXlUcmltICsgJyknOwogICAgICAgIH0pLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgcmV0dXJuIGQud2lkdGggKyAncHgnOwogICAgICAgIH0pOwoKICAgICAgICBsaW5rRXhpdC5zdHlsZSgnb3BhY2l0eScsIDApLnJlbW92ZSgpOwoKICAgICAgICBub2RlRW50ZXIuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLngwICsgJywgJyArIGQueTAgKyAnKSc7CiAgICAgICAgfSkuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICAgICAgbm9kZUVudGVyLmFwcGVuZCgncmVjdCcpLmF0dHIoJ3dpZHRoJywgTWF0aC5tYXgoMCwgbm9kZVdpZHRoKSkuYXR0cignaGVpZ2h0JywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBkLnkxIC0gZC55MCk7CiAgICAgICAgfSk7CgogICAgICAgIG5vZGVFbnRlci5hcHBlbmQoJ3RleHQnKS5hdHRyKCd4JywgbGFiZWxYKS5hdHRyKCd5JywgbGFiZWxZKTsKCiAgICAgICAgbm9kZUV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKS5yZW1vdmUoKTsKCiAgICAgICAgdXBkYXRlcih0cmFuc2l0aW9uKTsKCiAgICAgICAgZnVuY3Rpb24gbGFiZWxYKGQpIHsKICAgICAgICAgIHJldHVybiBsYWJlbExlZnQoZCkgPyBub2RlV2lkdGggKyA1IDogLTU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsYWJlbExlZnQoZCkgewogICAgICAgICAgcmV0dXJuIGQueDAgPCBzaXplLndpZHRoIC8gMjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxhYmVsWShkKSB7CiAgICAgICAgICByZXR1cm4gNSArIE1hdGgubWF4KDAsIGQueTEgLSBkLnkwKSAvIDI7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmFnKGQpIHsKICAgICAgICAgIGlmIChkLmRyYWdnYWJsZVgpIHsKICAgICAgICAgICAgZC54MCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUud2lkdGggLSBub2RlV2lkdGgsIGQueDAgKyBkMy5ldmVudC5keCkpOwogICAgICAgICAgICBkLngxID0gZC54MCArIG5vZGVXaWR0aDsKICAgICAgICAgICAgdGhpcy5fX2RyYWdYMCA9IGQueDAgLyBzaXplLndpZHRoOyAvLyBzYXZlIGRyYWcgcG9zaXRpb24gYXMgYSBwZXJjZW50IG9mIHRoZSB3aWR0aAogICAgICAgICAgfQogICAgICAgICAgaWYgKGQuZHJhZ2dhYmxlWSkgewogICAgICAgICAgICB2YXIgaGVpZ2h0ID0gZC55MSAtIGQueTA7CiAgICAgICAgICAgIGQueTAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLmhlaWdodCAtIChkLnkxIC0gZC55MCksIGQueTAgKyBkMy5ldmVudC5keSkpOwogICAgICAgICAgICBkLnkxID0gZC55MCArIGhlaWdodDsKICAgICAgICAgICAgdGhpcy5fX2RyYWdZMCA9IGQueTAgLyBzaXplLmhlaWdodDsgLy8gc2F2ZSBkcmFnIHBvc2l0aW9uIGFzIGEgcGVyY2VudCBvZiB0aGUgaGVpZ2h0CiAgICAgICAgICB9CiAgICAgICAgICAkJC5zYW5rZXkudXBkYXRlKGdyYXBoKTsKICAgICAgICAgIHVwZGF0ZXIoKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBhdHRyaWJ1dGVzIG9uIGRlZmluZWQgbm9kZXMgYW5kIGxpbmtzCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlcigpIHsKICAgICAgICAgIHZhciB0cmFuc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTsKCiAgICAgICAgICBub2RlU3RhdGljLnNlbGVjdCgndGV4dCcpLmNsYXNzZWQoJ2QyYi10ZXh0LWFuY2hvci1lbmQnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gIWxhYmVsTGVmdChkKTsKICAgICAgICAgIH0pLmNhbGwodGV4dFdyYXAsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkLmxhYmVsOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGQud3JhcExlbmd0aDsKICAgICAgICAgIH0sICdtaWRkbGUnKTsKCiAgICAgICAgICB2YXIgbCA9IHRyYW5zaXRpb24gPyBsaW5rIDogbGlua1N0YXRpYywKICAgICAgICAgICAgICBuID0gdHJhbnNpdGlvbiA/IG5vZGUgOiBub2RlU3RhdGljOwoKICAgICAgICAgIGwuc3R5bGUoJ29wYWNpdHknLCAxKS5zZWxlY3QoJ3BhdGgnKS5hdHRyKCdkJywgc2Fua2V5TGluaykuc3R5bGUoJ3N0cm9rZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiAndXJsKCMnICsgZC5rZXlUcmltICsgJyknOwogICAgICAgICAgfSkuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkLndpZHRoICsgJ3B4JzsKICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIGZpeCBmb3IgcmVjdGFuZ3VsYXIgbGluayBncmFkaWVudHMKICAgICAgICAgIGwuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgbCA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBkcmF3IGEgcmVjdAogICAgICAgICAgICBpZiAoTWF0aC5hYnMoZC55MSAtIGQueTApIDwgMC4wMDAwMSkgewogICAgICAgICAgICAgIHZhciByZWN0ID0gbC5zZWxlY3RBbGwoJ3JlY3QnKS5kYXRhKFtkXSksCiAgICAgICAgICAgICAgICAgIHJlY3RFbnRlciA9IHJlY3QuZW50ZXIoKS5hcHBlbmQoJ3JlY3QnKSwKICAgICAgICAgICAgICAgICAgd2lkdGggPSBkLnRhcmdldC54MCAtIGQuc291cmNlLngxOwoKICAgICAgICAgICAgICByZWN0ID0gcmVjdC5tZXJnZShyZWN0RW50ZXIpOwoKICAgICAgICAgICAgICBpZiAodHJhbnNpdGlvbikgcmVjdCA9IHJlY3QudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKCiAgICAgICAgICAgICAgcmVjdC5hdHRyKCd4JywgZC5zb3VyY2UueDEgKyBNYXRoLm1pbigwLCB3aWR0aCkpLmF0dHIoJ3knLCBkLnkwIC0gZC53aWR0aCAvIDIpLmF0dHIoJ2hlaWdodCcsIE1hdGgubWF4KDAsIGQud2lkdGgpKS5hdHRyKCd3aWR0aCcsIE1hdGguYWJzKGQudGFyZ2V0LngwIC0gZC5zb3VyY2UueDEpKS5zdHlsZSgnZmlsbCcsICd1cmwoIycgKyBkLmtleVRyaW0gKyAnKScpOwoKICAgICAgICAgICAgICBsLnNlbGVjdCgncGF0aCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsLnNlbGVjdCgncmVjdCcpLnJlbW92ZSgpOwogICAgICAgICAgICAgIGwuc2VsZWN0KCdwYXRoJykuc3R5bGUoJ2Rpc3BsYXknLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIG4uYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQueDAgKyAnLCAnICsgZC55MCArICcpJzsKICAgICAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgMSk7CgogICAgICAgICAgbi5zZWxlY3QoJ3JlY3QnKS5hdHRyKCd3aWR0aCcsIE1hdGgubWF4KDAsIG5vZGVXaWR0aCkpLmF0dHIoJ2hlaWdodCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBkLnkxIC0gZC55MCk7CiAgICAgICAgICB9KS5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHJldHVybiBkLmNvbG9yOwogICAgICAgICAgfSk7CgogICAgICAgICAgbi5zZWxlY3QoJ3RleHQnKS5hdHRyKCd4JywgbGFiZWxYKS5hdHRyKCd5JywgbGFiZWxZKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdzdmctc2Fua2V5LXVwZGF0ZWQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7CgogICAgICByZXR1cm4gc2Fua2V5OwogICAgfTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShzYW5rZXksICQkKS5hZGRQcm9wKCdzYW5rZXknLCBkM1NhbmtleS5zYW5rZXkoKSkuYWRkUHJvcEZ1bmN0b3IoJ3NpemUnLCB7IHdpZHRoOiA5NjAsIGhlaWdodDogNTAwIH0pLmFkZFByb3BGdW5jdG9yKCdub2RlcycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLm5vZGVzOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ25vZGVLZXknLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5uYW1lOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ25vZGVMYWJlbCcsIGZ1bmN0aW9uIChkLCBpLCBrZXkpIHsKICAgICAgcmV0dXJuIGtleTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdub2RlTGFiZWxXcmFwTGVuZ3RoJywgSW5maW5pdHkpLmFkZFByb3BGdW5jdG9yKCdub2RlRHJhZ2dhYmxlWCcsIGZhbHNlKS5hZGRQcm9wRnVuY3Rvcignbm9kZURyYWdnYWJsZVknLCBmYWxzZSkuYWRkUHJvcEZ1bmN0b3IoJ25vZGVQcmVzZXJ2ZURyYWdnaW5nJywgdHJ1ZSkuYWRkUHJvcEZ1bmN0b3IoJ25vZGVDb2xvcicsIGZ1bmN0aW9uIChkLCBpLCBrZXkpIHsKICAgICAgcmV0dXJuIGNvbG9yKGtleSk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignbGlua3MnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5saW5rczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdsaW5rU291cmNlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2xpbmtTb3VyY2VDb2xvcicsIGZ1bmN0aW9uIChkLCBpLCBzb3VyY2VLZXkpIHsKICAgICAgcmV0dXJuIGNvbG9yKHNvdXJjZUtleSk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignbGlua1RhcmdldCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRhcmdldDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdsaW5rVGFyZ2V0Q29sb3InLCBmdW5jdGlvbiAoZCwgaSwgdGFyZ2V0S2V5KSB7CiAgICAgIHJldHVybiBjb2xvcih0YXJnZXRLZXkpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2xpbmtLZXknLCBmdW5jdGlvbiAoZCwgaSwgc291cmNlS2V5LCB0YXJnZXRLZXkpIHsKICAgICAgcmV0dXJuIHNvdXJjZUtleSArICctJyArIHRhcmdldEtleTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdsaW5rVmFsdWUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC52YWx1ZTsKICAgIH0pOwoKICAgIHJldHVybiBzYW5rZXk7CiAgfQoKICAvLyBUT0RPOiBDbGVhbiB1cCB0ZXh0IHdyYXBwaW5nIHdpdGggdHJhbnNpdGlvbiB1ZHBhdGVzCiAgLy8gVE9ETzogQ2xlYW4gdXAgcGxhbmUgYnVpbGQgd29ya2Zsb3cKCiAgLy8gcGxhbmUgc3ZnIGdlbmVyYXRvcgogIGZ1bmN0aW9uIHBsYW5lICgpIHsKCiAgICB2YXIgJCQgPSB7fSwKICAgICAgICBsYWJlbFBhZCA9IDU7CgogICAgLyogVXBkYXRlIEZ1bmN0aW9uICovCiAgICB2YXIgcGxhbmUgPSBmdW5jdGlvbiBwbGFuZShjb250ZXh0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0OwoKICAgICAgc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAvLyBnZXQgcGxhbmUgcHJvcHMKICAgICAgICB2YXIgc2l6ZSA9ICQkLnNpemUuY2FsbCh0aGlzLCBkLCBpKSB8fCB7IHdpZHRoOiA5NjAsIGhlaWdodDogNTAwIH0sCiAgICAgICAgICAgIG1hcmdpbiA9IG1ha2VNYXJnaW4oJCQubWFyZ2luLmNhbGwodGhpcywgZCwgaSkpLAogICAgICAgICAgICB4ID0gJCQueC5jYWxsKHRoaXMsIGQsIGkpLAogICAgICAgICAgICB4MiA9ICQkLngyLmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICAgIHkgPSAkJC55LmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgICAgIHkyID0gJCQueTIuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICAgICAgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIGF4ZXMgPSB7CiAgICAgICAgICB4OiB7IHR5cGU6ICd4JywgZGF0YTogeCB9LAogICAgICAgICAgeDI6IHsgdHlwZTogJ3gyJywgZGF0YTogeDIgfSwKICAgICAgICAgIHk6IHsgdHlwZTogJ3knLCBkYXRhOiB5IH0sCiAgICAgICAgICB5MjogeyB0eXBlOiAneTInLCBkYXRhOiB5MiB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gY2hlY2sgaWYgdXNlciBkZWZpbmVkIHBhZGRpbmcKICAgICAgICB2YXIgcGFkZGluZyA9IG1ha2VQYWRkaW5nKCQkLnBhZGRpbmcuY2FsbCh0aGlzLCBkLCBpKSk7CgogICAgICAgIC8vIGVudGVyIHBsYW5lIHN2ZyBncm91cAogICAgICAgIHZhciBwbGFuZVVwZGF0ZSA9IGVsLnNlbGVjdEFsbCgnLmQyYi1wbGFuZScpLmRhdGEoW2RdKSwKICAgICAgICAgICAgcGxhbmVFbnRlciA9IHBsYW5lVXBkYXRlLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLXBsYW5lJyksCiAgICAgICAgICAgIHBsYW5lID0gcGxhbmVVcGRhdGUubWVyZ2UocGxhbmVFbnRlcik7CgogICAgICAgIHZhciBjbGlwSUQgPSB0aGlzLl9fY2xpcElEID0gdGhpcy5fX2NsaXBJRCB8fCAnZDJiLWNsaXAtcGxhbmUtJyArIGQyYmlkKCk7CgogICAgICAgIHBsYW5lRW50ZXIuYXBwZW5kKCdkZWZzJykuYXBwZW5kKCdjbGlwUGF0aCcpLmF0dHIoJ2lkJywgY2xpcElEKS5hdHRyKCdjbGFzcycsICdkMmItY2xpcC1wbGFuZScpLmFwcGVuZCgncmVjdCcpOwoKICAgICAgICB2YXIgdHJhbnNDdHggPSBjb250ZXh0ICE9PSBzZWxlY3Rpb24gPyBjb250ZXh0IDogbnVsbDsKCiAgICAgICAgc2V0dXBBeGlzKGF4ZXMueCwgaSwgcGxhbmUsIHNpemUud2lkdGgsIHRyYW5zQ3R4KTsKICAgICAgICBzZXR1cEF4aXMoYXhlcy54MiwgaSwgcGxhbmUsIHNpemUud2lkdGgsIHRyYW5zQ3R4KTsKICAgICAgICBzZXR1cEF4aXMoYXhlcy55LCBpLCBwbGFuZSwgc2l6ZS5oZWlnaHQsIHRyYW5zQ3R4KTsKICAgICAgICBzZXR1cEF4aXMoYXhlcy55MiwgaSwgcGxhbmUsIHNpemUuaGVpZ2h0LCB0cmFuc0N0eCk7CgogICAgICAgIC8vIGlmIHBhZGRpbmcgaXMgbm90IHNldCwgZmluZCBpdCBkeW5hbWljYWxseQogICAgICAgIGlmICghcGFkZGluZykgcGFkZGluZyA9IGR5bmFtaWNQYWRkaW5nKGF4ZXMpOwoKICAgICAgICAvLyBkZWZpbmUgcGxhbmUgYm94IHByb3BlcnRpZXMKICAgICAgICB2YXIgcGxhbmVCb3ggPSB7CiAgICAgICAgICB0b3A6IHBhZGRpbmcudG9wICsgbWFyZ2luLnRvcCwKICAgICAgICAgIGJvdHRvbTogcGFkZGluZy5ib3R0b20gKyBtYXJnaW4uYm90dG9tLAogICAgICAgICAgbGVmdDogcGFkZGluZy5sZWZ0ICsgbWFyZ2luLmxlZnQsCiAgICAgICAgICByaWdodDogcGFkZGluZy5yaWdodCArIG1hcmdpbi5yaWdodAogICAgICAgIH07CiAgICAgICAgcGxhbmVCb3gud2lkdGggPSBzaXplLndpZHRoIC0gcGxhbmVCb3gubGVmdCAtIHBsYW5lQm94LnJpZ2h0OwogICAgICAgIHBsYW5lQm94LmhlaWdodCA9IHNpemUuaGVpZ2h0IC0gcGxhbmVCb3gudG9wIC0gcGxhbmVCb3guYm90dG9tOwoKICAgICAgICAvLyBzdG9yZSBwbGFuZSBib3ggb24gdGhlIG5vZGUKICAgICAgICB0aGlzLl9fYm94X18gPSBwbGFuZUJveDsKCiAgICAgICAgaWYgKHRyYW5zQ3R4KSBwbGFuZVVwZGF0ZSA9IHBsYW5lVXBkYXRlLnRyYW5zaXRpb24odHJhbnNDdHgpOwoKICAgICAgICAvLyBwb3NpdGlvbiBwbGFuZQogICAgICAgIHBsYW5lRW50ZXIuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgcGxhbmVCb3gubGVmdCArICcsICcgKyBwbGFuZUJveC50b3AgKyAnKScpOwogICAgICAgIHBsYW5lVXBkYXRlLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHBsYW5lQm94LmxlZnQgKyAnLCAnICsgcGxhbmVCb3gudG9wICsgJyknKTsKCiAgICAgICAgdXBkYXRlQXhpcyhheGVzLngsIHBsYW5lQm94LndpZHRoLCAwLCBwbGFuZUJveC5oZWlnaHQpOwogICAgICAgIHVwZGF0ZUF4aXMoYXhlcy54MiwgcGxhbmVCb3gud2lkdGgsIDAsIDApOwogICAgICAgIHVwZGF0ZUF4aXMoYXhlcy55LCBwbGFuZUJveC5oZWlnaHQsIDAsIDApOwogICAgICAgIHVwZGF0ZUF4aXMoYXhlcy55MiwgcGxhbmVCb3guaGVpZ2h0LCBwbGFuZUJveC53aWR0aCwgMCk7CgogICAgICAgIHVwZGF0ZUdyaWQoYXhlcy54LCBwbGFuZUJveC53aWR0aCwgcGxhbmVCb3guaGVpZ2h0KTsKICAgICAgICB1cGRhdGVHcmlkKGF4ZXMueDIsIHBsYW5lQm94LndpZHRoLCBwbGFuZUJveC5oZWlnaHQpOwogICAgICAgIHVwZGF0ZUdyaWQoYXhlcy55LCBwbGFuZUJveC5oZWlnaHQsIHBsYW5lQm94LndpZHRoKTsKICAgICAgICB1cGRhdGVHcmlkKGF4ZXMueTIsIHBsYW5lQm94LmhlaWdodCwgcGxhbmVCb3gud2lkdGgpOwoKICAgICAgICB1cGRhdGVMYWJlbChheGVzLngsIHBsYW5lQm94LndpZHRoKTsKICAgICAgICB1cGRhdGVMYWJlbChheGVzLngyLCBwbGFuZUJveC53aWR0aCk7CiAgICAgICAgdXBkYXRlTGFiZWwoYXhlcy55LCAtcGxhbmVCb3guaGVpZ2h0KTsKICAgICAgICB1cGRhdGVMYWJlbChheGVzLnkyLCAtcGxhbmVCb3guaGVpZ2h0KTsKCiAgICAgICAgcGxhbmUuc2VsZWN0KCcuZDJiLWNsaXAtcGxhbmUnKS5zZWxlY3QoJ3JlY3QnKS5hdHRyKCd3aWR0aCcsIHBsYW5lQm94LndpZHRoICsgMSkuYXR0cignaGVpZ2h0JywgcGxhbmVCb3guaGVpZ2h0ICsgMSk7CgogICAgICAgIHBsYW5lLnNlbGVjdEFsbCgnLmQyYi1ncmlkJykuYXR0cignY2xpcC1wYXRoJywgJ3VybCgjJyArIGNsaXBJRCArICcpJyk7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdwbGFuZS11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIHBsYW5lOwogICAgfTsKCiAgICAvKiBJbmhlcml0IGZyb20gYmFzZSBtb2RlbCAqLwogICAgYmFzZShwbGFuZSwgJCQpCiAgICAvLyBwbGFuZSBsZXZlbCBmdW5jdG9ycwogICAgLmFkZFByb3BGdW5jdG9yKCdzaXplJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuc2l6ZTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdwYWRkaW5nJywgbnVsbCkuYWRkUHJvcEZ1bmN0b3IoJ21hcmdpbicsIDApLmFkZFByb3BGdW5jdG9yKCd4JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCd4MicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLngyOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3knLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3kyJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueTI7CiAgICB9KQogICAgLy8gYXhpcyBsZXZlbCBmdW5jdG9ycwogICAgLmFkZFByb3BGdW5jdG9yKCdheGlzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuYXhpczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdvcmllbnQnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5vcmllbnQgfHwgJ291dGVyJzsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCd3cmFwTGVuZ3RoJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIG9yZXEoZC53cmFwTGVuZ3RoLCBJbmZpbml0eSk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigndGlja1NpemUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gb3JlcShkLnRpY2tTaXplLCA2KTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzaG93R3JpZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnNob3dHcmlkICE9PSBmYWxzZTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdsYWJlbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2xhYmVsT3JpZW50JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWxPcmllbnQgfHwgJ291dGVyIG1pZGRsZSc7CiAgICB9KQogICAgLy8gTWV0aG9kIHRvIGdldCB0aGUgY29tcHV0ZWQgYm94IG9mIGEgc3BlY2lmaWMgcGxhbmUgY29udGFpbmVyLiBUaGlzCiAgICAvLyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgdGhlIHBsYW5lIGhhcyBiZWVuIHJlbmRlcmVkLiBFaXRoZXIgdGhlCiAgICAvLyBsZWdlbmQgU1ZHIG5vZGUgb3IgYSBkMyBzZWxlY3Rpb24gb2YgdGhlIG5vZGUgbWF5IGJlIHNwZWNpZmllZC4KICAgIC5hZGRNZXRob2QoJ2JveCcsIGZ1bmN0aW9uIChfKSB7CiAgICAgIHZhciBub2RlID0gXy5ub2RlID8gXy5ub2RlKCkgOiBfOwogICAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gbm9kZS5fX2JveF9fOwogICAgfSk7CgogICAgcmV0dXJuIHBsYW5lOwoKICAgIGZ1bmN0aW9uIHNldHVwQXhpcyhheGlzLCBpbmRleCwgcGxhbmUsIGV4dGVudCwgdHJhbnNDdHgpIHsKICAgICAgdmFyIGF4aXNEYXRhID0gW10sCiAgICAgICAgICBncmlkRGF0YSA9IFtdLAogICAgICAgICAgZGF0YSA9IGF4aXMuZGF0YTsKCiAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgc2V0QXhpc0luZm8oYXhpcywgZGF0YSwgaW5kZXgsIHBsYW5lLCBleHRlbnQpOwogICAgICAgIGF4aXNEYXRhID0gW2RhdGFdOwogICAgICAgIGlmIChheGlzLmluZm8uc2hvd0dyaWQpIGdyaWREYXRhID0gW2RhdGFdOwogICAgICB9CgogICAgICAvLyBlbnRlciBuZXcgYXhpcyBjb250YWluZXIKICAgICAgYXhpcy51cGRhdGUgPSBwbGFuZS5zZWxlY3RBbGwoJy5kMmItJyArIGF4aXMudHlwZSArICctYXhpcycpLmRhdGEoYXhpc0RhdGEpOwogICAgICBheGlzLmVudGVyID0gYXhpcy51cGRhdGUuZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcyBkMmItJyArIGF4aXMudHlwZSArICctYXhpcycpOwoKICAgICAgLy8gZW50ZXIgbGFiZWwgY29udGFpbmVyCiAgICAgIGF4aXMubGFiZWxFbnRlciA9IGF4aXMuZW50ZXIuYXBwZW5kKCd0ZXh0JykuYXR0cignY2xhc3MnLCAnZDJiLWF4aXMtbGFiZWwnKTsKCiAgICAgIC8vIG1lcmdlIGF4aXMgc3ZnIGNvbnRhaW5lcgogICAgICBheGlzLnN2ZyA9IGF4aXMuZW50ZXIubWVyZ2UoYXhpcy51cGRhdGUpOwoKICAgICAgLy8gZmV0Y2ggYXhpcyBsYWJlbAogICAgICBheGlzLmxhYmVsID0gYXhpcy5zdmcuc2VsZWN0KCcuZDJiLWF4aXMtbGFiZWwnKTsKCiAgICAgIC8vIGV4aXQgYXhpcwogICAgICBheGlzLnVwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CgogICAgICAvLyBzZXQgYXhpcyBncmlkIGRhdGEKICAgICAgYXhpcy5ncmlkVXBkYXRlID0gcGxhbmUuc2VsZWN0QWxsKCcuZDJiLScgKyBheGlzLnR5cGUgKyAnLWdyaWQnKS5kYXRhKGdyaWREYXRhKTsKCiAgICAgIC8vIGVudGVyIGF4aXMgZ3JpZAogICAgICBheGlzLmdyaWRFbnRlciA9IGF4aXMuZ3JpZFVwZGF0ZS5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1ncmlkIGQyYi0nICsgYXhpcy50eXBlICsgJy1ncmlkJyk7CgogICAgICAvLyBleGl0IGF4aXMgZ3JpZAogICAgICBheGlzLmdyaWRVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwoKICAgICAgLy8gbWVyZ2UgYXhpcyBncmlkCiAgICAgIGF4aXMuZ3JpZCA9IGF4aXMuZ3JpZEVudGVyLm1lcmdlKGF4aXMuZ3JpZFVwZGF0ZSk7CgogICAgICBpZiAodHJhbnNDdHgpIHsKICAgICAgICBheGlzLnN2ZyA9IGF4aXMuc3ZnLnRyYW5zaXRpb24odHJhbnNDdHgpOwogICAgICAgIGF4aXMudXBkYXRlID0gYXhpcy51cGRhdGUudHJhbnNpdGlvbih0cmFuc0N0eCk7CiAgICAgICAgYXhpcy5ncmlkID0gYXhpcy5ncmlkLnRyYW5zaXRpb24odHJhbnNDdHgpOwogICAgICAgIGF4aXMuZ3JpZFVwZGF0ZSA9IGF4aXMuZ3JpZFVwZGF0ZS50cmFuc2l0aW9uKHRyYW5zQ3R4KTsKICAgICAgICBheGlzLmxhYmVsID0gYXhpcy5sYWJlbC50cmFuc2l0aW9uKHRyYW5zQ3R4KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUF4aXMoYXhpcywgZXh0ZW50LCB4LCB5KSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIHNldEF4aXNUaWNrU2l6ZShheGlzKTsKICAgICAgc2V0QXhpc1JhbmdlKGF4aXMsIGV4dGVudCk7CgogICAgICBheGlzLmVudGVyLmNhbGwoYXhpcy5pbmZvLmF4aXMpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHggKyAnLCAnICsgeSArICcpJyk7CiAgICAgIGF4aXMudXBkYXRlLmNhbGwoYXhpcy5pbmZvLmF4aXMpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHggKyAnLCAnICsgeSArICcpJyk7CgogICAgICBheGlzLnN2Zy5jYWxsKHdyYXBUaWNrcywgYXhpcykub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICBheGlzLnN2Zy5jYWxsKHdyYXBUaWNrcywgYXhpcyk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUdyaWQoYXhpcywgZXh0ZW50UmFuZ2UsIGV4dGVudEdyaWQpIHsKICAgICAgaWYgKCFheGlzLmRhdGEpIHJldHVybjsKICAgICAgc2V0R3JpZFRpY2tTaXplKGF4aXMsIGV4dGVudEdyaWQpOwogICAgICBzZXRBeGlzUmFuZ2UoYXhpcywgZXh0ZW50UmFuZ2UpOwoKICAgICAgYXhpcy5ncmlkVXBkYXRlLmNhbGwoYXhpcy5pbmZvLmF4aXMpLnNlbGVjdEFsbCgnLnRpY2sgdGV4dCcpLnJlbW92ZSgpOwoKICAgICAgYXhpcy5ncmlkRW50ZXIuY2FsbChheGlzLmluZm8uYXhpcykuc2VsZWN0QWxsKCcudGljayB0ZXh0JykucmVtb3ZlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTGFiZWwoYXhpcywgZXh0ZW50KSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIGF4aXMubGFiZWxFbnRlci50ZXh0KGF4aXMuaW5mby5sYWJlbCkuYXR0cigneCcsIGxhYmVsWChheGlzLCBleHRlbnQpKS5hdHRyKCd5JywgbGFiZWxZKGF4aXMpKS5hdHRyKCd0ZXh0LWFuY2hvcicsIGxhYmVsQW5jaG9yKGF4aXMpKTsKICAgICAgYXhpcy5sYWJlbC50ZXh0KGF4aXMuaW5mby5sYWJlbCkuYXR0cigneCcsIGxhYmVsWChheGlzLCBleHRlbnQpKS5hdHRyKCd5JywgbGFiZWxZKGF4aXMpKS5hdHRyKCd0ZXh0LWFuY2hvcicsIGxhYmVsQW5jaG9yKGF4aXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRHcmlkVGlja1NpemUoYXhpcywgZXh0ZW50KSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIHN3aXRjaCAoYXhpcy50eXBlKSB7CiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICByZXR1cm4gYXhpcy5pbmZvLmF4aXMudGlja1NpemUoYXhpcy5pbmZvLm9yaWVudCA9PT0gJ2lubmVyJyA/IC1leHRlbnQgOiBleHRlbnQpOwogICAgICAgIGNhc2UgJ3gyJzoKICAgICAgICAgIHJldHVybiBheGlzLmluZm8uYXhpcy50aWNrU2l6ZShheGlzLmluZm8ub3JpZW50ID09PSAnaW5uZXInID8gZXh0ZW50IDogLWV4dGVudCk7CiAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICByZXR1cm4gYXhpcy5pbmZvLmF4aXMudGlja1NpemUoYXhpcy5pbmZvLm9yaWVudCA9PT0gJ2lubmVyJyA/IGV4dGVudCA6IC1leHRlbnQpOwogICAgICAgIGNhc2UgJ3kyJzoKICAgICAgICAgIHJldHVybiBheGlzLmluZm8uYXhpcy50aWNrU2l6ZShheGlzLmluZm8ub3JpZW50ID09PSAnaW5uZXInID8gLWV4dGVudCA6IGV4dGVudCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRBeGlzVGlja1NpemUoYXhpcykgewogICAgICBpZiAoIWF4aXMuZGF0YSkgcmV0dXJuOwogICAgICBheGlzLmluZm8uYXhpcy50aWNrU2l6ZU91dGVyKDApLnRpY2tTaXplSW5uZXIoYXhpcy5pbmZvLnRpY2tTaXplKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRBeGlzUmFuZ2UoYXhpcywgZXh0ZW50KSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIGlmIChbJ3knLCAneTInXS5pbmRleE9mKGF4aXMudHlwZSkgPiAtMSkgewogICAgICAgIGF4aXMuaW5mby5heGlzLnNjYWxlKCkucmFuZ2UoW2V4dGVudCwgMF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGF4aXMuaW5mby5heGlzLnNjYWxlKCkucmFuZ2UoWzAsIGV4dGVudF0pOwogICAgICB9CiAgICB9CgogICAgLy8gaW5zZXJ0IGFuZCByZW1vdmUgZHVtbXkgdGlja3MgYW5kIGxhYmVscyB0byBwYWQgYXhlcyBhY2NvcmRpbmdseQogICAgZnVuY3Rpb24gc2V0QXhpc0luZm8oYXhpcywgZCwgaSwgY29udCwgZXh0ZW50KSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIHZhciBpbmZvID0gYXhpcy5pbmZvID0ge307CgogICAgICBpbmZvLmF4aXMgPSAkJC5heGlzKGQsIGkpOwogICAgICBpbmZvLm9yaWVudCA9ICQkLm9yaWVudChkLCBpKTsKICAgICAgaW5mby53cmFwTGVuZ3RoID0gJCQud3JhcExlbmd0aChkLCBpKTsKICAgICAgaW5mby5sYWJlbCA9IG9yZXEoJCQubGFiZWwoZCwgaSksICcnKTsKICAgICAgaW5mby5sYWJlbE9yaWVudCA9ICQkLmxhYmVsT3JpZW50KGQsIGkpOwogICAgICBpbmZvLnRpY2tTaXplID0gJCQudGlja1NpemUoZCwgaSk7CiAgICAgIGluZm8uc2hvd0dyaWQgPSAkJC5zaG93R3JpZChkLCBpKTsKICAgICAgaW5mby5sYWJlbE9yaWVudDEgPSBpbmZvLmxhYmVsT3JpZW50LnNwbGl0KCcgJylbMF07CiAgICAgIGluZm8ubGFiZWxPcmllbnQyID0gaW5mby5sYWJlbE9yaWVudC5zcGxpdCgnICcpWzFdOwoKICAgICAgaW5mby53cmFwQW5jaG9yID0gd3JhcEFuY2hvcihheGlzKTsKCiAgICAgIHNldEF4aXNUaWNrU2l6ZShheGlzKTsKICAgICAgc2V0QXhpc1JhbmdlKGF4aXMsIGV4dGVudCk7CgogICAgICB2YXIgZHVtbXlBeGlzID0gY29udC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcyBkMmItJyArIGF4aXMudHlwZSArICctYXhpcycpLmNhbGwoaW5mby5heGlzKS5jYWxsKHdyYXBUaWNrcywgYXhpcyk7CiAgICAgIGluZm8uYXhpc0JveCA9IGR1bW15QXhpcy5ub2RlKCkuZ2V0QkJveCgpOwoKICAgICAgdmFyIGR1bW15TGFiZWwgPSBkdW1teUF4aXMuYXBwZW5kKCd0ZXh0JykuYXR0cignY2xhc3MnLCAnZDJiLWF4aXMtbGFiZWwgZDJiLScgKyBheGlzLnR5cGUgKyAnLWxhYmVsJykudGV4dChpbmZvLmxhYmVsKTsKICAgICAgaW5mby5sYWJlbEJveCA9IGR1bW15TGFiZWwubm9kZSgpLmdldEJCb3goKTsKCiAgICAgIGR1bW15QXhpcy5yZW1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsYWJlbEFuY2hvcihheGlzKSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIHZhciBpbmZvID0gYXhpcy5pbmZvLAogICAgICAgICAgdmVydCA9IFsneScsICd5MiddLmluZGV4T2YoYXhpcy50eXBlKSA+IC0xOwogICAgICByZXR1cm4gaW5mby5sYWJlbE9yaWVudDIgPT09ICdzdGFydCcgJiYgdmVydCA/ICdlbmQnIDogaW5mby5sYWJlbE9yaWVudDIgPT09ICdlbmQnICYmICF2ZXJ0ID8gJ2VuZCcgOiBpbmZvLmxhYmVsT3JpZW50MiA9PT0gJ21pZGRsZScgPyAnbWlkZGxlJyA6ICdzdGFydCc7CiAgICB9CgogICAgZnVuY3Rpb24gd3JhcEFuY2hvcihheGlzKSB7CiAgICAgIGlmICghYXhpcy5kYXRhKSByZXR1cm47CiAgICAgIHN3aXRjaCAoYXhpcy50eXBlKSB7CiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICByZXR1cm4gYXhpcy5pbmZvLm9yaWVudCA9PT0gJ2lubmVyJyA/ICdlbmQnIDogJ3N0YXJ0JzsKICAgICAgICBjYXNlICd4Mic6CiAgICAgICAgICByZXR1cm4gYXhpcy5pbmZvLm9yaWVudCA9PT0gJ291dGVyJyA/ICdlbmQnIDogJ3N0YXJ0JzsKICAgICAgICBjYXNlICd5JzoKICAgICAgICBjYXNlICd5Mic6CiAgICAgICAgICByZXR1cm4gJ21pZGRsZSc7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiAnc3RhcnQnOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbGFiZWxZKGF4aXMpIHsKICAgICAgaWYgKCFheGlzLmRhdGEpIHJldHVybjsKICAgICAgdmFyIGluZm8gPSBheGlzLmluZm87CgogICAgICBzd2l0Y2ggKGF4aXMudHlwZSArICcgJyArIGluZm8ub3JpZW50ICsgJyAnICsgaW5mby5sYWJlbE9yaWVudDEpIHsKICAgICAgICBjYXNlICd4IGlubmVyIGlubmVyJzoKICAgICAgICBjYXNlICd4MiBvdXRlciBvdXRlcic6CiAgICAgICAgICByZXR1cm4gLWluZm8uYXhpc0JveC5oZWlnaHQgLSBsYWJlbFBhZDsKICAgICAgICBjYXNlICd4IGlubmVyIG91dGVyJzoKICAgICAgICBjYXNlICd4MiBvdXRlciBpbm5lcic6CiAgICAgICAgICByZXR1cm4gaW5mby5sYWJlbEJveC5oZWlnaHQgKyBsYWJlbFBhZDsKICAgICAgICBjYXNlICd4IG91dGVyIGlubmVyJzoKICAgICAgICBjYXNlICd4MiBpbm5lciBvdXRlcic6CiAgICAgICAgY2FzZSAneSBpbm5lciBvdXRlcic6CiAgICAgICAgY2FzZSAneTIgb3V0ZXIgaW5uZXInOgogICAgICAgICAgcmV0dXJuIC1sYWJlbFBhZDsKICAgICAgICBjYXNlICd4IG91dGVyIG91dGVyJzoKICAgICAgICBjYXNlICd4MiBpbm5lciBpbm5lcic6CiAgICAgICAgICByZXR1cm4gaW5mby5sYWJlbEJveC5oZWlnaHQgKyBpbmZvLmF4aXNCb3guaGVpZ2h0ICsgbGFiZWxQYWQ7CiAgICAgICAgY2FzZSAneSBpbm5lciBpbm5lcic6CiAgICAgICAgY2FzZSAneTIgb3V0ZXIgb3V0ZXInOgogICAgICAgICAgcmV0dXJuIGluZm8ubGFiZWxCb3guaGVpZ2h0ICsgaW5mby5heGlzQm94LndpZHRoICsgbGFiZWxQYWQ7CiAgICAgICAgY2FzZSAneSBvdXRlciBpbm5lcic6CiAgICAgICAgY2FzZSAneTIgaW5uZXIgb3V0ZXInOgogICAgICAgICAgcmV0dXJuIGluZm8ubGFiZWxCb3guaGVpZ2h0ICsgbGFiZWxQYWQ7CiAgICAgICAgY2FzZSAneSBvdXRlciBvdXRlcic6CiAgICAgICAgY2FzZSAneTIgaW5uZXIgaW5uZXInOgogICAgICAgICAgcmV0dXJuIC1pbmZvLmF4aXNCb3gud2lkdGggLSBsYWJlbFBhZDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGxhYmVsWChheGlzLCBleHRlbnQpIHsKICAgICAgaWYgKCFheGlzLmRhdGEpIHJldHVybjsKICAgICAgcmV0dXJuIGF4aXMuaW5mby5sYWJlbE9yaWVudDIgPT09ICdzdGFydCcgPyAwIDogYXhpcy5pbmZvLmxhYmVsT3JpZW50MiA9PT0gJ21pZGRsZScgPyBleHRlbnQgLyAyIDogZXh0ZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGR5bmFtaWNQYWRkaW5nKGF4ZXMpIHsKICAgICAgdmFyIHBhZGRpbmcgPSB7IHRvcDogMCwgbGVmdDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCB9OwoKICAgICAgaWYgKGF4ZXMueC5kYXRhKSB7CiAgICAgICAgaWYgKGF4ZXMueC5pbmZvLm9yaWVudCA9PT0gJ291dGVyJykgcGFkZGluZy5ib3R0b20gKz0gYXhlcy54LmluZm8uYXhpc0JveC5oZWlnaHQ7CiAgICAgICAgaWYgKGF4ZXMueC5pbmZvLmxhYmVsT3JpZW50MSA9PT0gJ291dGVyJykgcGFkZGluZy5ib3R0b20gKz0gYXhlcy54LmluZm8ubGFiZWxCb3guaGVpZ2h0ICsgbGFiZWxQYWQ7CiAgICAgIH0KCiAgICAgIGlmIChheGVzLngyLmRhdGEpIHsKICAgICAgICBpZiAoYXhlcy54Mi5pbmZvLm9yaWVudCA9PT0gJ291dGVyJykgcGFkZGluZy50b3AgKz0gYXhlcy54Mi5pbmZvLmF4aXNCb3guaGVpZ2h0OwogICAgICAgIGlmIChheGVzLngyLmluZm8ubGFiZWxPcmllbnQxID09PSAnb3V0ZXInKSBwYWRkaW5nLnRvcCArPSBheGVzLngyLmluZm8ubGFiZWxCb3guaGVpZ2h0OwogICAgICB9CgogICAgICBpZiAoYXhlcy55LmRhdGEpIHsKICAgICAgICBpZiAoYXhlcy55LmluZm8ub3JpZW50ID09PSAnb3V0ZXInKSBwYWRkaW5nLmxlZnQgKz0gYXhlcy55LmluZm8uYXhpc0JveC53aWR0aDsKICAgICAgICBpZiAoYXhlcy55LmluZm8ubGFiZWxPcmllbnQxID09PSAnb3V0ZXInKSBwYWRkaW5nLmxlZnQgKz0gYXhlcy55LmluZm8ubGFiZWxCb3guaGVpZ2h0OwogICAgICB9CgogICAgICBpZiAoYXhlcy55Mi5kYXRhKSB7CiAgICAgICAgaWYgKGF4ZXMueTIuaW5mby5vcmllbnQgPT09ICdvdXRlcicpIHBhZGRpbmcucmlnaHQgKz0gYXhlcy55Mi5pbmZvLmF4aXNCb3gud2lkdGg7CiAgICAgICAgaWYgKGF4ZXMueTIuaW5mby5sYWJlbE9yaWVudDEgPT09ICdvdXRlcicpIHBhZGRpbmcucmlnaHQgKz0gYXhlcy55Mi5pbmZvLmxhYmVsQm94LmhlaWdodCArIGxhYmVsUGFkOwogICAgICB9CgogICAgICBwYWRkaW5nLnRvcCA9IE1hdGgubWF4KHBhZGRpbmcudG9wLCAxMCk7CiAgICAgIHBhZGRpbmcuYm90dG9tID0gTWF0aC5tYXgocGFkZGluZy5ib3R0b20sIDEwKTsKICAgICAgcGFkZGluZy5sZWZ0ID0gTWF0aC5tYXgocGFkZGluZy5sZWZ0LCAxMCk7CiAgICAgIHBhZGRpbmcucmlnaHQgPSBNYXRoLm1heChwYWRkaW5nLnJpZ2h0LCAxMCk7CgogICAgICByZXR1cm4gcGFkZGluZzsKICAgIH0KCiAgICBmdW5jdGlvbiB3cmFwVGlja3MoZWwsIGF4aXMpIHsKICAgICAgaWYgKCFheGlzLmRhdGEpIHJldHVybjsKICAgICAgdmFyIGxlbmd0aCA9IGF4aXMuaW5mby53cmFwTGVuZ3RoLAogICAgICAgICAgYW5jaG9yID0gYXhpcy5pbmZvLndyYXBBbmNob3I7CiAgICAgIGVsLnNlbGVjdEFsbCgnLnRpY2sgdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB0aWNrID0gZDMuc2VsZWN0KHRoaXMpOwogICAgICAgIGlmIChvcmVxKHRpY2suaHRtbCgpLCAnJykuaW5kZXhPZigndHNwYW4nKSA9PT0gLTEpIHRoaXMuc3RvcmVUZXh0ID0gdGljay50ZXh0KCk7CiAgICAgICAgdGljay50ZXh0KCcnKTsKICAgICAgfSkuY2FsbCh0ZXh0V3JhcCwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0b3JlVGV4dDsKICAgICAgfSwgbGVuZ3RoLCBhbmNob3IpOwogICAgfQoKICAgIC8vIGNyZWF0ZSBwYWRkaW5nIGZyb20gbnVtYmVyIG9yIG9iamVjdAogICAgZnVuY3Rpb24gbWFrZVBhZGRpbmcocCkgewogICAgICByZXR1cm4gdHlwZW9mIHAgPT09ICdudW1iZXInID8geyB0b3A6IHAsIGxlZnQ6IHAsIHJpZ2h0OiBwLCBib3R0b206IHAgfSA6IHA7CiAgICB9CgogICAgLy8gY3JlYXRlIG1hcmdpbiBzYW1lIGFzIHBhZGRpbmcgYnV0IGRlZmF1bHQgYXMgMAogICAgZnVuY3Rpb24gbWFrZU1hcmdpbihtKSB7CiAgICAgIHJldHVybiBtYWtlUGFkZGluZyhtIHx8IDApOwogICAgfQogIH0KCiAgLyoqCiAgICogZDJiLmNoYXJ0UGllKCkgcmV0dXJucyBhIGQyYgogICAqIHBpZSBjaGFydCBnZW5lcmF0b3IKICAgKi8KICBmdW5jdGlvbiBwaWUgKCkgewogICAgdmFyICQkID0ge307CgogICAgdmFyIGNoYXJ0ID0gZnVuY3Rpb24gY2hhcnQoY29udGV4dCkgewogICAgICBjb250ZXh0LmNhbGwoJCQuY2hhcnRGcmFtZSk7CgogICAgICAvLyBtYWtlIHN1cmUgcGllLCBhcmMsIGFuZCBsZWdlbmQgYWNjZXNzb3JzIGFyZSBkZWZpbmVkIHByb3Blcmx5CiAgICAgICQkLnBpZS52YWx1ZSgkJC52YWx1ZSkuY29sb3IoJCQuY29sb3IpLmtleSgkJC5rZXkpOwoKICAgICAgJCQubGVnZW5kLmh0bWwoJCQubGFiZWwpLmtleSgkJC5rZXkpLmNvbG9yKCQkLmNvbG9yKTsKCiAgICAgICQkLnRvb2x0aXAuY29sb3IoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZDMucmdiKCQkLmNvbG9yKGQuZGF0YSkpLmRhcmtlcigwLjMpOwogICAgICB9KTsKCiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0OwoKICAgICAgc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKGRhdHVtKSB7CiAgICAgICAgdXBkYXRlLmNhbGwodGhpcywgZGF0dW0sIGNvbnRleHQgIT09IHNlbGVjdGlvbiA/IGNvbnRleHQgOiBudWxsKTsKICAgICAgfSk7CgogICAgICBzZWxlY3Rpb24uZGlzcGF0Y2goJ2NoYXJ0LXBpZS11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIGNoYXJ0OwogICAgfTsKCiAgICAvLyBwZXJjZW50IGZvcm1hdGVyCiAgICB2YXIgcGVyY2VudCA9IGQzLmZvcm1hdCgnLjAlJyk7CgogICAgLy8gY29uZmlndXJlIG1vZGVsIHByb3BlcnRpZXMKICAgIGJhc2UoY2hhcnQsICQkKS5hZGRQcm9wKCdjaGFydEZyYW1lJywgY2hhcnRGcmFtZSgpLmxlZ2VuZEVuYWJsZWQodHJ1ZSkuYnJlYWRjcnVtYnNFbmFibGVkKGZhbHNlKSkuYWRkUHJvcCgnbGVnZW5kJywgbGVnZW5kKCkuY2xpY2thYmxlKHRydWUpLmRibGNsaWNrYWJsZSh0cnVlKSkuYWRkUHJvcCgna2V5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICB9KS5hZGRQcm9wKCdwaWUnLCBzdmdQaWUoKSkuYWRkUHJvcCgndG9vbHRpcCcsIHRvb2x0aXAoKS5mb2xsb3dNb3VzZSh0cnVlKS5odG1sKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiAnPGI+JyArICQkLmxhYmVsKGQuZGF0YSkgKyAnPC9iPjogJyArICQkLnZhbHVlKGQuZGF0YSkgKyAnICgnICsgcGVyY2VudChkLl9fcGVyY2VudF9fKSArICcpJzsKICAgIH0pKS5hZGRQcm9wRnVuY3RvcigndmFsdWVzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQ7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignZHVyYXRpb24nLCAyNTApLmFkZFByb3BGdW5jdG9yKCdkb251dFJhdGlvJywgMCkuYWRkUHJvcEZ1bmN0b3IoJ2F0JywgJ2NlbnRlciBjZW50ZXInKS5hZGRQcm9wRnVuY3Rvcignc2hvd1BlcmNlbnQnLCBmdW5jdGlvbiAoZCwgdG90YWwpIHsKICAgICAgcmV0dXJuICQkLnZhbHVlKGQpIC8gdG90YWwgPiAwLjAzOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3JhZGl1cycsIGZ1bmN0aW9uIChkLCB3LCBoKSB7CiAgICAgIHJldHVybiBNYXRoLm1pbih3LCBoKSAvIDI7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignY29sb3InLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gY29sb3IoZC5sYWJlbCk7CiAgICB9KS5hZGRQcm9wRnVuY3RvcigndmFsdWUnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC52YWx1ZTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdhcmNMYWJlbCcsIG51bGwpLmFkZFByb3BGdW5jdG9yKCdsYWJlbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSk7CgogICAgLy8gdXBkYXRlIGNoYXJ0CiAgICBmdW5jdGlvbiB1cGRhdGUoZGF0dW0sIHRyYW5zaXRpb24pIHsKICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgc2VsZWN0aW9uID0gZWwuc2VsZWN0KCcuZDJiLWNoYXJ0LWNvbnRhaW5lcicpLAogICAgICAgICAgc2l6ZSA9IHNlbGVjdGlvbi5ub2RlKCkuX19zaXplX18sCiAgICAgICAgICByYWRpdXMgPSAkJC5yYWRpdXMoZGF0dW0sIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KSwKICAgICAgICAgIGRvbnV0UmF0aW8gPSAkJC5kb251dFJhdGlvKGRhdHVtKSwKICAgICAgICAgIGxlZ2VuZEVtcHR5ID0gJCQubGVnZW5kLmVtcHR5KCksCiAgICAgICAgICB2YWx1ZXMgPSAkJC52YWx1ZXMoZGF0dW0pLAogICAgICAgICAgZmlsdGVyZWQgPSB2YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuICFsZWdlbmRFbXB0eShkKTsKICAgICAgfSk7CgogICAgICAkJC5waWUudmFsdWVzKGZpbHRlcmVkKTsKICAgICAgJCQubGVnZW5kLnZhbHVlcyh2YWx1ZXMpOwoKICAgICAgLy8gbGVnZW5kIGZ1bmN0aW9uYWxpdHkKICAgICAgZWwuc2VsZWN0KCcuZDJiLWxlZ2VuZC1jb250YWluZXInKS5jYWxsKCQkLmxlZ2VuZCkub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKCQkLmR1cmF0aW9uKGRhdHVtKSkuY2FsbChjaGFydCk7CiAgICAgIH0pLnNlbGVjdEFsbCgnLmQyYi1sZWdlbmQtaXRlbScpLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZCkgewogICAgICAgIGFyY0dyb3cuY2FsbCh0aGlzLCBlbCwgZCwgMS4wMyk7CiAgICAgIH0pLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgYXJjR3Jvdy5jYWxsKHRoaXMsIGVsLCBkKTsKICAgICAgfSk7CgogICAgICAvLyBnZXQgcGllIHRvdGFsCiAgICAgIHZhciB0b3RhbCA9IGQzLnN1bShmaWx0ZXJlZCwgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gJCQudmFsdWUoZCk7CiAgICAgIH0pOwoKICAgICAgLy8gc2VsZWN0IGFuZCBlbnRlciBwaWUgY2hhcnQgJ2cnIGVsZW1lbnQuCiAgICAgIHZhciBjaGFydEdyb3VwID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1waWUtY2hhcnQnKS5kYXRhKFtmaWx0ZXJlZF0pOwogICAgICB2YXIgY2hhcnRHcm91cEVudGVyID0gY2hhcnRHcm91cC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1waWUtY2hhcnQnKTsKCiAgICAgIGNoYXJ0R3JvdXAgPSBjaGFydEdyb3VwLm1lcmdlKGNoYXJ0R3JvdXBFbnRlcik7CgogICAgICBpZiAodHJhbnNpdGlvbikgY2hhcnRHcm91cCA9IGNoYXJ0R3JvdXAudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKCiAgICAgICQkLnBpZS5hcmMoKS5pbm5lclJhZGl1cyhyYWRpdXMgKiBkb251dFJhdGlvKS5vdXRlclJhZGl1cyhyYWRpdXMpOwoKICAgICAgY2hhcnRHcm91cC5jYWxsKCQkLnBpZSk7CgogICAgICB2YXIgYXJjR3JvdXAgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLXBpZS1hcmMnKS5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgLy8gc3RvcmUgaW5uZXIgYW5kIG91dGVyIHJhZGlpIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBmb3IgaG92ZXIKICAgICAgICAvLyB0cmFuc2l0aW9ucwogICAgICAgIGQuX19pbm5lclJhZGl1c19fID0gcmFkaXVzICogZG9udXRSYXRpbzsKICAgICAgICBkLl9fb3V0ZXJSYWRpdXNfXyA9IHJhZGl1czsKCiAgICAgICAgLy8gc3RvcmUgcGVyY2VudCBmb3IgdXNlIHdpdGggdGhlIHRvb2x0aXAKICAgICAgICBkLl9fcGVyY2VudF9fID0gZC52YWx1ZSAvIHRvdGFsOwogICAgICB9KS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICBhcmNHcm93LmNhbGwodGhpcywgZWwsIGQuZGF0YSwgMS4wMyk7CiAgICAgIH0pLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgYXJjR3Jvdy5jYWxsKHRoaXMsIGVsLCBkLmRhdGEpOwogICAgICB9KS5jYWxsKCQkLnRvb2x0aXApOwoKICAgICAgdmFyIGFyY1BlcmNlbnQgPSBhcmNHcm91cC5zZWxlY3RBbGwoJy5kMmItcGllLWFyYy1wZXJjZW50JykuZGF0YShmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBbZF07CiAgICAgIH0pOwoKICAgICAgYXJjUGVyY2VudC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1waWUtYXJjLXBlcmNlbnQnKS5hcHBlbmQoJ3RleHQnKS5hdHRyKCd5JywgNik7CgogICAgICBhcmNHcm91cC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZWxlbSA9IGQzLnNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgY3VycmVudCA9IGVsZW0uc2VsZWN0KCcuZDJiLXBpZS1hcmMgcGF0aCcpLm5vZGUoKS5jdXJyZW50LAogICAgICAgICAgICBwZXJjZW50R3JvdXAgPSBlbGVtLnNlbGVjdCgnLmQyYi1waWUtYXJjLXBlcmNlbnQnKSwKICAgICAgICAgICAgcGVyY2VudFRleHQgPSBwZXJjZW50R3JvdXAuc2VsZWN0KCd0ZXh0Jykubm9kZSgpOwogICAgICAgIHBlcmNlbnRHcm91cC5ub2RlKCkuY3VycmVudCA9IGN1cnJlbnQ7CiAgICAgICAgcGVyY2VudFRleHQuY3VycmVudCA9IHBlcmNlbnRUZXh0LmN1cnJlbnQgfHwgMDsKICAgICAgfSk7CgogICAgICBpZiAodHJhbnNpdGlvbikgewogICAgICAgIGFyY0dyb3VwID0gYXJjR3JvdXAuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgZC50cmFuc2l0aW9uaW5nID0gdHJ1ZTsKICAgICAgICB9KS50cmFuc2l0aW9uKHRyYW5zaXRpb24pLm9uKCdlbmQnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgZC50cmFuc2l0aW9uaW5nID0gZmFsc2U7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHZhciBhcmNUZXh0ID0gYXJjR3JvdXAuc2VsZWN0KCcuZDJiLXBpZS1hcmMtcGVyY2VudCcpLmNhbGwodHdlZW5DZW50cm9pZCwgJCQucGllLmFyYygpKS5zZWxlY3QoJ3RleHQnKTsKCiAgICAgIGFyY1RleHQuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgIHZhciBhcmNMYWJlbCA9ICQkLmFyY0xhYmVsKGQuZGF0YSk7CiAgICAgICAgdmFyIHRleHQgPSBkMy5zZWxlY3QodGhpcyk7CgogICAgICAgIGlmICh0cmFuc2l0aW9uKSB0ZXh0ID0gdGV4dC50cmFuc2l0aW9uKHRyYW5zaXRpb24pOwoKICAgICAgICAvLyBpZiBhcmMgbGFiZWwgaXMgbm9uLW51bGwgdXNlIHBlcmNlbnRzCiAgICAgICAgaWYgKGFyY0xhYmVsKSB7CiAgICAgICAgICB0ZXh0LnRleHQoYXJjTGFiZWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0LmNhbGwodHdlZW5OdW1iZXIsICQkLnZhbHVlKGQuZGF0YSkgLyB0b3RhbCwgcGVyY2VudCkuc3R5bGUoJ29wYWNpdHknLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICByZXR1cm4gJCQuc2hvd1BlcmNlbnQuY2FsbCh0aGlzLCBkLmRhdGEsIHRvdGFsKSA/IDEgOiAwOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHZhciBjb29yZHMgPSBjaGFydENvb3JkcyhkYXR1bSwgcmFkaXVzLCBzaXplKTsKCiAgICAgIGlmIChpc05hTihjb29yZHMueCkgfHwgaXNOYU4oY29vcmRzLnkpKSByZXR1cm47CgogICAgICBjaGFydEdyb3VwRW50ZXIuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgY29vcmRzLnggKyAnLCAnICsgY29vcmRzLnkgKyAnKScpOwogICAgICBjaGFydEdyb3VwLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIGNvb3Jkcy54ICsgJywgJyArIGNvb3Jkcy55ICsgJyknKTsKICAgIH0KCiAgICAvLyBQb3NpdGlvbiB0aGUgcGllIGNoYXJ0IGFjY29yZGluZyB0byB0aGUgJ2F0JyBzdHJpbmcgKGUuZy4gJ2NlbnRlciBsZWZ0JywKICAgIC8vICd0b3AgY2VudGVyJywgLi4pLiBVbmxlc3MgYXQgaXMgYW4gb2JqZWN0IGxpa2Uge3g6ICwgeTp9LCB0aGVuIHBvc2l0aW9uCiAgICAvLyBhY2NvcmRpbmcgdG8gdGhlc2UgY29vcmRpbmF0ZXMuCiAgICBmdW5jdGlvbiBjaGFydENvb3JkcyhkYXR1bSwgcmFkaXVzLCBzaXplKSB7CiAgICAgIHZhciBjb29yZHMgPSAkJC5hdChkYXR1bSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHJhZGl1cyk7CgogICAgICBpZiAoKHR5cGVvZiBjb29yZHMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNvb3JkcykpICE9PSAnb2JqZWN0JykgewogICAgICAgIGNvb3JkcyA9IGNvb3Jkcy5zcGxpdCgnICcpOwogICAgICAgIHZhciBhdCA9IHsgeDogY29vcmRzWzFdLCB5OiBjb29yZHNbMF0gfTsKICAgICAgICBjb29yZHMgPSB7fTsKICAgICAgICBzd2l0Y2ggKGF0LngpIHsKICAgICAgICAgIGNhc2UgJ2xlZnQnOgogICAgICAgICAgICBjb29yZHMueCA9IHJhZGl1czsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdjZW50ZXInOgogICAgICAgICAgY2FzZSAnbWlkZGxlJzoKICAgICAgICAgICAgY29vcmRzLnggPSBzaXplLndpZHRoIC8gMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdyaWdodCc6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb29yZHMueCA9IHNpemUud2lkdGggLSByYWRpdXM7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKGF0LnkpIHsKICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6CiAgICAgICAgICAgIGNvb3Jkcy55ID0gc2l6ZS5oZWlnaHQgLSByYWRpdXM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnY2VudGVyJzoKICAgICAgICAgIGNhc2UgJ21pZGRsZSc6CiAgICAgICAgICAgIGNvb3Jkcy55ID0gc2l6ZS5oZWlnaHQgLyAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3RvcCc6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb29yZHMueSA9IHJhZGl1czsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBjb29yZHM7CiAgICB9CgogICAgZnVuY3Rpb24gYXJjR3JvdyhlbCwgZCkgewogICAgICB2YXIgbXVsdGlwbGllciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTsKCiAgICAgIHZhciBhcmMgPSAkJC5waWUuYXJjKCk7CiAgICAgIHZhciB0cmFuc2l0aW9uaW5nID0gZmFsc2U7CgogICAgICBhcmMub3V0ZXJSYWRpdXMoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5vdXRlclJhZGl1czsKICAgICAgfSkuaW5uZXJSYWRpdXMoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5pbm5lclJhZGl1czsKICAgICAgfSk7CgogICAgICB2YXIgYXJjU3ZnID0gZWwuc2VsZWN0QWxsKCcuZDJiLXBpZS1hcmMnKS5maWx0ZXIoZnVuY3Rpb24gKGRkKSB7CiAgICAgICAgcmV0dXJuIGRkLmRhdGEgPT09IGQ7CiAgICAgIH0pLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICB0cmFuc2l0aW9uaW5nID0gdHJhbnNpdGlvbmluZyB8fCBkLnRyYW5zaXRpb25pbmc7CiAgICAgICAgZC5vdXRlclJhZGl1cyA9IGQuX19vdXRlclJhZGl1c19fICogbXVsdGlwbGllcjsKICAgICAgICBkLmlubmVyUmFkaXVzID0gZC5fX2lubmVyUmFkaXVzX187CiAgICAgIH0pOwoKICAgICAgaWYgKHRyYW5zaXRpb25pbmcpIHJldHVybjsKCiAgICAgIGFyY1N2Zy5zZWxlY3QoJ3BhdGgnKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMTAwKS5jYWxsKHR3ZWVuQXJjLCBhcmMpOwogICAgfQoKICAgIHJldHVybiBjaGFydDsKICB9CgogIGZ1bmN0aW9uIGF4aXMgKCkgewoKICAgIHZhciAkJCA9IHt9OwoKICAgIHZhciBjaGFydCA9IGZ1bmN0aW9uIGNoYXJ0KGNvbnRleHQpIHsKICAgICAgY29udGV4dC5jYWxsKCQkLmNoYXJ0RnJhbWUpOwoKICAgICAgJCQubGVnZW5kLmVtcHR5KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuZGF0YS5oaWRkZW47CiAgICAgIH0pLnNldEVtcHR5KGZ1bmN0aW9uIChkLCBpLCBzdGF0ZSkgewogICAgICAgIHJldHVybiBkLmRhdGEuaGlkZGVuID0gc3RhdGU7CiAgICAgIH0pLmh0bWwoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5sYWJlbDsKICAgICAgfSkua2V5KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICAgIH0pLmNvbG9yKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICAgIH0pOwoKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICBzZWxlY3Rpb24uZWFjaChmdW5jdGlvbiAoZGF0dW0pIHsKICAgICAgICB1cGRhdGUuY2FsbCh0aGlzLCBkYXR1bSwgY29udGV4dCAhPT0gc2VsZWN0aW9uID8gY29udGV4dCA6IG51bGwpOwogICAgICB9KTsKCiAgICAgIHNlbGVjdGlvbi5kaXNwYXRjaCgnY2hhcnQtYXhpcy11cGRhdGVkJywgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgICAgcmV0dXJuIGNoYXJ0OwogICAgfTsKCiAgICBiYXNlKGNoYXJ0LCAkJCkuYWRkUHJvcCgncGxhbmUnLCBwbGFuZSgpKS5hZGRQcm9wKCdhbm5vdGF0aW9uJywgZDNTdmdBbm5vdGF0aW9uLmFubm90YXRpb24gPyBkM1N2Z0Fubm90YXRpb24uYW5ub3RhdGlvbigpIDogbnVsbCkuYWRkUHJvcCgnY2hhcnRGcmFtZScsIGNoYXJ0RnJhbWUoKS5sZWdlbmRFbmFibGVkKHRydWUpLmJyZWFkY3J1bWJzRW5hYmxlZChmYWxzZSkpLmFkZFByb3AoJ2xlZ2VuZCcsIGxlZ2VuZCgpLmNsaWNrYWJsZSh0cnVlKS5kYmxjbGlja2FibGUodHJ1ZSkpLmFkZFByb3BGdW5jdG9yKCd0b29sdGlwQ29uZmlnJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQudG9vbHRpcENvbmZpZzsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdkdXJhdGlvbicsIDI1MCkuYWRkUHJvcEZ1bmN0b3IoJ3gnLCB7fSkuYWRkUHJvcEZ1bmN0b3IoJ3knLCB7fSkuYWRkUHJvcEZ1bmN0b3IoJ3gyJywge30pLmFkZFByb3BGdW5jdG9yKCd5MicsIHt9KS5hZGRQcm9wRnVuY3RvcignY2xpcFBsYW5lJywgdHJ1ZSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25zJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuYW5ub3RhdGlvbnM7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignZ3JvdXBzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuZ3JvdXBzOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3NldHMnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5zZXRzOwogICAgfSkKICAgIC8vIGdyb3VwIGZ1bmN0b3JzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ2dyb3VwTGFiZWwnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5sYWJlbDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdncm91cENvbG9yJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGNvbG9yKCQkLmdyb3VwTGFiZWwoZCkpOwogICAgfSkKICAgIC8vIHNldCBmdW5jdG9ycwogICAgLmFkZFByb3BGdW5jdG9yKCdzZXRLZXknLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICByZXR1cm4gaTsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzZXRHZW5lcmF0b3JzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuZ2VuZXJhdG9yczsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdzZXRYVHlwZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnhUeXBlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ3NldFlUeXBlJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQueVR5cGU7CiAgICB9KS5hZGRQcm9wRnVuY3Rvcignc2V0R3JhcGhzJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuZ3JhcGhzOwogICAgfSkKICAgIC8vIGdyYXBoIGZ1bmN0b3JzCiAgICAuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBoS2V5JywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQubGFiZWw7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignZ3JhcGhMYWJlbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmxhYmVsOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBoR3JvdXAnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5ncm91cDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdncmFwaENvbG9yJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGNvbG9yKCQkLmdyYXBoTGFiZWwoZCkpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2dyYXBoVG9vbHRpcENvbmZpZycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnRvb2x0aXBDb25maWc7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignZ3JhcGhBbm5vdGF0aW9ucycsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmFubm90YXRpb25zOwogICAgfSkKICAgIC8vIGFubm90YXRpb24gZnVuY3RvcnMKICAgIC5hZGRQcm9wRnVuY3RvcignYW5ub3RhdGlvbktleScsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgIHJldHVybiBpOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25YVHlwZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnhUeXBlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25ZVHlwZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnlUeXBlOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25aJywgZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuejsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdhbm5vdGF0aW9uWCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLng7CiAgICB9KS5hZGRQcm9wRnVuY3RvcignYW5ub3RhdGlvblknLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25YMicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLngyOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25ZMicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLnkyOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2Fubm90YXRpb25Db2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBkLmNvbG9yOwogICAgfSk7CgogICAgZnVuY3Rpb24gdXBkYXRlKGRhdHVtLCB0cmFuc2l0aW9uKSB7CiAgICAgIHZhciBjb250YWluZXIgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICBjaGFydENvbnRhaW5lciA9IGNvbnRhaW5lci5zZWxlY3QoJy5kMmItY2hhcnQtY29udGFpbmVyJyksCiAgICAgICAgICBjaGFydE5vZGUgPSBjaGFydENvbnRhaW5lci5ub2RlKCksCiAgICAgICAgICBsZWdlbmRDb250YWluZXIgPSBjb250YWluZXIuc2VsZWN0KCcuZDJiLWxlZ2VuZC1jb250YWluZXInKSwKICAgICAgICAgIHNpemUgPSBjaGFydENvbnRhaW5lci5ub2RlKCkuX19zaXplX18sCiAgICAgICAgICBzZXRzID0gZ2V0U2V0cyhkYXR1bSksCiAgICAgICAgICBhbGxHcmFwaHMgPSBnZXRBbGxHcmFwaHMoc2V0cyksCiAgICAgICAgICBkdXJhdGlvbiA9ICQkLmR1cmF0aW9uKGRhdHVtKSwKICAgICAgICAgIGdyb3VwcyA9IGdldEdyb3VwcyhkYXR1bSwgc2V0cyksCiAgICAgICAgICBjbGlwUGxhbmUgPSAkJC5jbGlwUGxhbmUoZGF0dW0pOwoKICAgICAgLy8gZGVmaW5lIGNoYXJ0IGxldmVsIGFubm90YXRpb25zCiAgICAgIHZhciBhbm5vdGF0aW9ucyA9ICgkJC5hbm5vdGF0aW9ucyhkYXR1bSkgfHwgW10pLnNsaWNlKCkubWFwKGZ1bmN0aW9uIChhLCBpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGtleTogJCQuYW5ub3RhdGlvbktleShhLCBpKSwKICAgICAgICAgIHhUeXBlOiAkJC5hbm5vdGF0aW9uWFR5cGUoYSkgfHwgJ3gnLAogICAgICAgICAgeVR5cGU6ICQkLmFubm90YXRpb25ZVHlwZShhKSB8fCAneScsCiAgICAgICAgICB6OiAkJC5hbm5vdGF0aW9uWihhKSB8fCAnZnJvbnQnLAogICAgICAgICAgeDogJCQuYW5ub3RhdGlvblgoYSksCiAgICAgICAgICB5OiAkJC5hbm5vdGF0aW9uWShhKSwKICAgICAgICAgIHgyOiAkJC5hbm5vdGF0aW9uWDIoYSksCiAgICAgICAgICB5MjogJCQuYW5ub3RhdGlvblkyKGEpLAogICAgICAgICAgY29sb3I6ICQkLmFubm90YXRpb25Db2xvcihhKSB8fCAnc3RlZWxibHVlJywKICAgICAgICAgIGRhdGE6IGEKICAgICAgICB9OwogICAgICB9KTsKCiAgICAgIHByb3BhZ2F0ZUhpZGRlbihncm91cHMpOwoKICAgICAgLy8gbWFrZSB0b29sdGlwIHN0aWNreSBvbiB0aGUgY2hhcnQgbm9kZSBiZWNhdXNlIHRvb2x0aXBBeGlzIHJlcXVpcmVzCiAgICAgIC8vIG9uZSBpbnN0YW5jZSBwZXIgYXhpc0NoYXJ0CiAgICAgIHZhciB0b29sdGlwID0gY2hhcnROb2RlLnRvb2x0aXAgPSBjaGFydE5vZGUudG9vbHRpcCB8fCB0b29sdGlwQXhpcygpLnRyYWNrWCh0cnVlKS50cmFja1koZmFsc2UpLnRocmVzaG9sZCg1MCk7CgogICAgICB0b29sdGlwLnRpdGxlKGZ1bmN0aW9uIChwb2ludHMpIHsKICAgICAgICByZXR1cm4gJycgKyBvcmVxKHBvaW50c1swXS54LCBwb2ludHNbMF0ueDEsIHBvaW50c1swXS5tZWRpYW4pOwogICAgICB9KS5jbGVhcigpOwoKICAgICAgLy8gdXBkYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAgJCQubGVnZW5kLnZhbHVlcyhncm91cHMpOwogICAgICBsZWdlbmRDb250YWluZXIuY2FsbCgkJC5sZWdlbmQpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoY2hhcnQpOwogICAgICB9KS5zZWxlY3RBbGwoJy5kMmItbGVnZW5kLWl0ZW0nKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gbGVnZW5kTW91c2VvdmVyKGQsIGNoYXJ0Q29udGFpbmVyKTsKICAgICAgfSkub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gbGVnZW5kTW91c2VvdXQoZCwgY2hhcnRDb250YWluZXIpOwogICAgICB9KTsKCiAgICAgIC8vIHVwZGF0ZSBwbGFuZSBkaW1lbnNpb25zLCB3aWR0aCBhbmQgaGVpZ2h0CiAgICAgICQkLnBsYW5lLnNpemUoc2l6ZSk7CgogICAgICB2YXIgcGxhbmUgPSBjaGFydENvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItYXhpcy1wbGFuZScpLmRhdGEoW2RhdHVtXSksCiAgICAgICAgICBwbGFuZVVwZGF0ZSA9IHBsYW5lLAogICAgICAgICAgcGxhbmVFbnRlciA9IHBsYW5lLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWF4aXMtcGxhbmUnKTsKCiAgICAgIHBsYW5lVXBkYXRlID0gcGxhbmUgPSBwbGFuZS5tZXJnZShwbGFuZUVudGVyKTsKCiAgICAgIC8vIGVudGVyIGF4aXMtc2V0IHdyYXBwZXIKICAgICAgdmFyIHdyYXBwZXIgPSBjaGFydENvbnRhaW5lci5zZWxlY3RBbGwoJy5kMmItYXhpcy13cmFwcGVyJykuZGF0YShbZGF0dW1dKSwKICAgICAgICAgIHdyYXBwZXJVcGRhdGUgPSB3cmFwcGVyLAogICAgICAgICAgd3JhcHBlckVudGVyID0gd3JhcHBlci5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1heGlzLXdyYXBwZXInKTsKCiAgICAgIHdyYXBwZXJFbnRlci5hcHBlbmQoJ3JlY3QnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcy1iYWNrZ3JvdW5kJyk7CiAgICAgIHdyYXBwZXJFbnRlci5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcy1iYWNrLWFubm90YXRpb25zJyk7CiAgICAgIHdyYXBwZXJFbnRlci5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcy1zZXRzJyk7CiAgICAgIHdyYXBwZXJFbnRlci5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkMmItYXhpcy1mcm9udC1hbm5vdGF0aW9ucycpOwoKICAgICAgd3JhcHBlclVwZGF0ZSA9IHdyYXBwZXIgPSB3cmFwcGVyLm1lcmdlKHdyYXBwZXJFbnRlcik7CgogICAgICB2YXIgYmFja0Fubm90YXRpb25zVXBkYXRlID0gd3JhcHBlci5zZWxlY3QoJy5kMmItYXhpcy1iYWNrLWFubm90YXRpb25zJyksCiAgICAgICAgICBmcm9udEFubm90YXRpb25zVXBkYXRlID0gd3JhcHBlci5zZWxlY3QoJy5kMmItYXhpcy1mcm9udC1hbm5vdGF0aW9ucycpOwoKICAgICAgLy8gZW50ZXIgYXhpcy1zZXRzCiAgICAgIHZhciBzZXQgPSB3cmFwcGVyLnNlbGVjdCgnLmQyYi1heGlzLXNldHMnKS5zZWxlY3RBbGwoJy5kMmItYXhpcy1zZXQnKS5kYXRhKHNldHMsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQua2V5OwogICAgICB9KSwKICAgICAgICAgIHNldEVudGVyID0gc2V0LmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZDJiLWF4aXMtc2V0JyksCiAgICAgICAgICBzZXRFeGl0ID0gc2V0LmV4aXQoKTsKCiAgICAgIHNldCA9IHNldC5tZXJnZShzZXRFbnRlcikub3JkZXIoKTsKCiAgICAgIC8vIHF1ZXVlIHRyYW5zaXRpb25zIGlmIGNvbnRleHQgaXMgYSB0cmFuc2l0aW9uCiAgICAgIGlmICh0cmFuc2l0aW9uKSB7CiAgICAgICAgc2V0RXhpdCA9IHNldEV4aXQudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICB3cmFwcGVyVXBkYXRlID0gd3JhcHBlclVwZGF0ZS50cmFuc2l0aW9uKHRyYW5zaXRpb24pOwogICAgICAgIHBsYW5lVXBkYXRlID0gcGxhbmVVcGRhdGUudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICBiYWNrQW5ub3RhdGlvbnNVcGRhdGUgPSBiYWNrQW5ub3RhdGlvbnNVcGRhdGUudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgICBmcm9udEFubm90YXRpb25zVXBkYXRlID0gZnJvbnRBbm5vdGF0aW9uc1VwZGF0ZS50cmFuc2l0aW9uKHRyYW5zaXRpb24pOwogICAgICB9CgogICAgICAvLyBpbml0aWFsemUgZ2VuZXJhdG9yIGFuZCB2aXNpYmxlIHBvaW50IHNldHMKICAgICAgdmFyIHZpc2libGUgPSB7CiAgICAgICAgeDogW10sCiAgICAgICAgeDI6IFtdLAogICAgICAgIHk6IFtdLAogICAgICAgIHkyOiBbXQogICAgICB9OwoKICAgICAgc2V0LmVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgIGdyYXBocyA9IHMuZ3JhcGhzLmZpbHRlcihmdW5jdGlvbiAoZykgewogICAgICAgICAgcmV0dXJuICFnLmRhdGEuaGlkZGVuOwogICAgICAgIH0pLAogICAgICAgICAgICBncmFwaHNSYXcgPSBncmFwaHMubWFwKGZ1bmN0aW9uIChnKSB7CiAgICAgICAgICByZXR1cm4gZy5kYXRhOwogICAgICAgIH0pOwoKICAgICAgICAvLyBhZGQgZ3JhcGggYW5ub3RhdGlvbnMgdG8gY2hhcnQgYW5ub3RhdGlvbnMKICAgICAgICBncmFwaHMuZm9yRWFjaChmdW5jdGlvbiAoZykgewogICAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucy5jb25jYXQoZy5hbm5vdGF0aW9ucy5tYXAoZnVuY3Rpb24gKGEsIGkpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBrZXk6IHMua2V5ICsgJy0nICsgZy5rZXkgKyAnLScgKyAkJC5hbm5vdGF0aW9uS2V5KGEsIGkpLAogICAgICAgICAgICAgIHhUeXBlOiBzLnhUeXBlLAogICAgICAgICAgICAgIHlUeXBlOiBzLnlUeXBlLAogICAgICAgICAgICAgIHo6ICQkLmFubm90YXRpb25aKGEpIHx8ICdmcm9udCcsCiAgICAgICAgICAgICAgeDogJCQuYW5ub3RhdGlvblgoYSksCiAgICAgICAgICAgICAgeTogJCQuYW5ub3RhdGlvblkoYSksCiAgICAgICAgICAgICAgeDI6ICQkLmFubm90YXRpb25YMihhKSwKICAgICAgICAgICAgICB5MjogJCQuYW5ub3RhdGlvblkyKGEpLAogICAgICAgICAgICAgIGNvbG9yOiAkJC5hbm5vdGF0aW9uQ29sb3IoYSkgfHwgZy5jb2xvciwKICAgICAgICAgICAgICBkYXRhOiBhLAogICAgICAgICAgICAgIGdyYXBoOiBnLmRhdGEKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pKTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5nZW5VcGRhdGUgPSBlbC5zZWxlY3RBbGwoJy5kMmItZ3JhcGgtZ2VuZXJhdG9yJykuZGF0YShzLmdlbmVyYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCksIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5rZXk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZ2VuRW50ZXIgPSB0aGlzLmdlblVwZGF0ZS5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1ncmFwaC1nZW5lcmF0b3InKS5zdHlsZSgnb3BhY2l0eScsIDApOwoKICAgICAgICB0aGlzLmdlbkV4aXQgPSB0aGlzLmdlblVwZGF0ZS5leGl0KCk7CgogICAgICAgIHRoaXMuZ2VuID0gdGhpcy5nZW5VcGRhdGUubWVyZ2UodGhpcy5nZW5FbnRlcikub3JkZXIoKTsKCiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmdlbi5zaXplKCk7CgogICAgICAgIHRoaXMuZ2VuLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgIHZhciBnZW4gPSBkMy5zZWxlY3QodGhpcyksCiAgICAgICAgICAgICAgdmlzaWJsZVBvaW50cyA9IGQuZ2VuZXJhdG9yLnRvb2x0aXBHcmFwaChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHZhciB0b29sdGlwR3JhcGggPSB0b29sdGlwLmdyYXBoKGQyYmlkKCkpOwoKICAgICAgICAgICAgbWF0Y2hHcmFwaChncmFwaCwgYWxsR3JhcGhzKS50b29sdGlwQ29uZmlnKHRvb2x0aXBHcmFwaCk7CiAgICAgICAgICAgIHJldHVybiB0b29sdGlwR3JhcGg7CiAgICAgICAgICB9KS5jb2xvcihmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoR3JhcGgoZ3JhcGgsIGFsbEdyYXBocykuY29sb3I7CiAgICAgICAgICB9KS5ncmFwaHMoZ3JhcGhzUmF3KS5nZXRWaXNpYmxlUG9pbnRzKGdlbik7CgogICAgICAgICAgaWYgKGQuZ2VuZXJhdG9yLmR1cmF0aW9uKSBkLmdlbmVyYXRvci5kdXJhdGlvbihkdXJhdGlvbik7CgogICAgICAgICAgdmlzaWJsZVBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICB2aXNpYmxlW3MueFR5cGVdLnB1c2gocG9pbnQueCk7CiAgICAgICAgICAgIHZpc2libGVbcy55VHlwZV0ucHVzaChwb2ludC55KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHZhciB4RGF0YSA9ICQkLngoZGF0dW0sIHZpc2libGUueCksCiAgICAgICAgICB5RGF0YSA9ICQkLnkoZGF0dW0sIHZpc2libGUueSksCiAgICAgICAgICB4MkRhdGEgPSAkJC54MihkYXR1bSwgdmlzaWJsZS54MiksCiAgICAgICAgICB5MkRhdGEgPSAkJC55MihkYXR1bSwgdmlzaWJsZS55Mik7CgogICAgICBzZXR1cEF4aXMoeERhdGEsIHZpc2libGUueCwgYXhpc0RlZmF1bHRzLngpOwogICAgICBzZXR1cEF4aXMoeURhdGEsIHZpc2libGUueSwgYXhpc0RlZmF1bHRzLnkpOwogICAgICBzZXR1cEF4aXMoeDJEYXRhLCB2aXNpYmxlLngyLCBheGlzRGVmYXVsdHMueDIpOwogICAgICBzZXR1cEF4aXMoeTJEYXRhLCB2aXNpYmxlLnkyLCBheGlzRGVmYXVsdHMueTIpOwoKICAgICAgJCQucGxhbmUuYXhpcyhmdW5jdGlvbiAoZCkgewogICAgICAgIHJldHVybiBkLl9fYXhpc19fOwogICAgICB9KS54KHhEYXRhLl9fYXhpc19fICYmIHZpc2libGUueC5sZW5ndGggPyB4RGF0YSA6IG51bGwpLnkoeURhdGEuX19heGlzX18gJiYgdmlzaWJsZS55Lmxlbmd0aCA/IHlEYXRhIDogbnVsbCkueDIoeDJEYXRhLl9fYXhpc19fICYmIHZpc2libGUueDIubGVuZ3RoID8geDJEYXRhIDogbnVsbCkueTIoeTJEYXRhLl9fYXhpc19fICYmIHZpc2libGUueTIubGVuZ3RoID8geTJEYXRhIDogbnVsbCk7CgogICAgICAvLyB1cGRhdGUgcGxhbmUKICAgICAgcGxhbmVFbnRlci5jYWxsKCQkLnBsYW5lKTsKICAgICAgcGxhbmVVcGRhdGUuY2FsbCgkJC5wbGFuZSk7CgogICAgICAvLyBhZnRlciBwbGFuZSB1cGRhdGUsIGZldGNoIHBsYW5lIGJveAogICAgICB2YXIgcGxhbmVCb3ggPSAkJC5wbGFuZS5ib3gocGxhbmUpOwoKICAgICAgLy8gYWRkIGNsaXAgcGF0aCBmcm9tIHBsYW5lCiAgICAgIHZhciBwbGFuZUNsaXAgPSAndXJsKCMnICsgcGxhbmUuc2VsZWN0KCcuZDJiLWNsaXAtcGxhbmUnKS5hdHRyKCdpZCcpICsgJyknOwogICAgICB3cmFwcGVyLmF0dHIoJ2NsaXAtcGF0aCcsIGNsaXBQbGFuZSA/IHBsYW5lQ2xpcCA6ICcnKTsKCiAgICAgIC8vIHVwZGF0ZSB0aGUgZ3JhcGhzIHdpdGggdGhlaXIgZ2VuZXJhdG9ycwogICAgICBzZXQuZWFjaChmdW5jdGlvbiAocykgewogICAgICAgIHZhciB4QXhpcyA9IHMueFR5cGUgPT09ICd4MicgPyB4MkRhdGEuX19heGlzX18gOiB4RGF0YS5fX2F4aXNfXywKICAgICAgICAgICAgeUF4aXMgPSBzLnlUeXBlID09PSAneTInID8geTJEYXRhLl9fYXhpc19fIDogeURhdGEuX19heGlzX187CgogICAgICAgIGlmICh0cmFuc2l0aW9uKSB7CiAgICAgICAgICB0aGlzLmdlblVwZGF0ZSA9IHRoaXMuZ2VuVXBkYXRlLnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgICAgICB0aGlzLmdlbkV4aXQgPSB0aGlzLmdlbkV4aXQudHJhbnNpdGlvbih0cmFuc2l0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5nZW5FeGl0LnJlbW92ZSgpOwoKICAgICAgICB0aGlzLmdlbi5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICB2YXIgZWwgPSBkMy5zZWxlY3QodGhpcyk7CiAgICAgICAgICBpZiAodHJhbnNpdGlvbikgZWwgPSBlbC50cmFuc2l0aW9uKHRyYW5zaXRpb24pOwoKICAgICAgICAgIGQuZ2VuZXJhdG9yLngoeEF4aXMuc2NhbGUoKSkueSh5QXhpcy5zY2FsZSgpKTsKCiAgICAgICAgICBlbC5zdHlsZSgnb3BhY2l0eScsIDEpLmNhbGwoZC5nZW5lcmF0b3IpOwogICAgICAgIH0pOwoKICAgICAgICBkMy5zZWxlY3QodGhpcykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBjb250YWluZXIudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKGNoYXJ0KTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICAvLyByZW1haW5pbmcgdHJhbnNpdGlvbnMgYW5kIGV4aXRzCiAgICAgIHNldEV4aXQuc3R5bGUoJ29wYWNpdHknLCAwKS5yZW1vdmUoKTsKCiAgICAgIC8vIHBvc2l0aW9uIHdyYXBwZXIKICAgICAgd3JhcHBlckVudGVyLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHBsYW5lQm94LmxlZnQgKyAnLCAnICsgcGxhbmVCb3gudG9wICsgJyknKS5zZWxlY3QoJ3JlY3QuZDJiLWF4aXMtYmFja2dyb3VuZCcpLmF0dHIoJ2hlaWdodCcsIE1hdGgubWF4KDAsIHBsYW5lQm94LmhlaWdodCkpLmF0dHIoJ3dpZHRoJywgTWF0aC5tYXgoMCwgcGxhbmVCb3gud2lkdGgpKTsKCiAgICAgIHdyYXBwZXJVcGRhdGUuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgcGxhbmVCb3gubGVmdCArICcsICcgKyBwbGFuZUJveC50b3AgKyAnKScpLnNlbGVjdCgncmVjdC5kMmItYXhpcy1iYWNrZ3JvdW5kJykuYXR0cignaGVpZ2h0JywgTWF0aC5tYXgoMCwgcGxhbmVCb3guaGVpZ2h0KSkuYXR0cignd2lkdGgnLCBNYXRoLm1heCgwLCBwbGFuZUJveC53aWR0aCkpOwoKICAgICAgLy8gdXBkYXRlIGFubm90YXRpb25zCgogICAgICBpZiAoJCQuYW5ub3RhdGlvbikgewogICAgICAgIHZhciBhbm5vdGF0aW9uU2NhbGVzID0gewogICAgICAgICAgeDogeERhdGEuX19zY2FsZV9fLAogICAgICAgICAgeTogeURhdGEuX19zY2FsZV9fLAogICAgICAgICAgeDI6IHgyRGF0YS5fX3NjYWxlX18sCiAgICAgICAgICB5MjogeTJEYXRhLl9fc2NhbGVfXwogICAgICAgIH07CgogICAgICAgIGJhY2tBbm5vdGF0aW9uc1VwZGF0ZS5jYWxsKHVwZGF0ZUFubm90YXRpb25zLCAkJC5hbm5vdGF0aW9uLCBhbm5vdGF0aW9ucy5maWx0ZXIoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgIHJldHVybiBhLnogPT09ICdiYWNrJzsKICAgICAgICB9KSwgYW5ub3RhdGlvblNjYWxlcyk7CgogICAgICAgIGZyb250QW5ub3RhdGlvbnNVcGRhdGUuY2FsbCh1cGRhdGVBbm5vdGF0aW9ucywgJCQuYW5ub3RhdGlvbiwgYW5ub3RhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICByZXR1cm4gYS56ID09PSAnZnJvbnQnOwogICAgICAgIH0pLCBhbm5vdGF0aW9uU2NhbGVzKTsKICAgICAgfQoKICAgICAgLy8gY29uZmlndXJlIHRvb2x0aXAKICAgICAgdG9vbHRpcC5yb3coZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgdmFyIGdyYXBoTGFiZWwgPSBtYXRjaEdyYXBoKHBvaW50LmdyYXBoLmRhdGEsIGFsbEdyYXBocykubGFiZWw7CiAgICAgICAgcmV0dXJuIGdyYXBoTGFiZWwgKyAnOiAnICsgb3JlcShwb2ludC55LCBwb2ludC55MSwgcG9pbnQubWVkaWFuKTsKICAgICAgfSk7CgogICAgICAkJC50b29sdGlwQ29uZmlnKHRvb2x0aXApOwogICAgICB0b29sdGlwLnN2Z0NvbnRhaW5lcih3cmFwcGVyKS50cmFja2VyKHdyYXBwZXIpLnNpemUocGxhbmVCb3gpOwogICAgfQoKICAgIC8vIGRlZmF1bHR6IGF4aXMgY29tcG9uZW50cwogICAgdmFyIGJhbmREZWZhdWx0ID0gZDMuc2NhbGVCYW5kKCksCiAgICAgICAgbGluZWFyRGVmYXVsdCA9IGQzLnNjYWxlTGluZWFyKCksCiAgICAgICAgYXhpc0RlZmF1bHRzID0gewogICAgICB4OiB7CiAgICAgICAgYmFuZDogYmFuZERlZmF1bHQuY29weSgpLAogICAgICAgIGxpbmVhcjogbGluZWFyRGVmYXVsdC5jb3B5KCksCiAgICAgICAgYXhpczogZDMuYXhpc0JvdHRvbSgpCiAgICAgIH0sCiAgICAgIHk6IHsKICAgICAgICBiYW5kOiBiYW5kRGVmYXVsdC5jb3B5KCksCiAgICAgICAgbGluZWFyOiBsaW5lYXJEZWZhdWx0LmNvcHkoKSwKICAgICAgICBheGlzOiBkMy5heGlzTGVmdCgpCiAgICAgIH0sCiAgICAgIHgyOiB7CiAgICAgICAgYmFuZDogYmFuZERlZmF1bHQuY29weSgpLAogICAgICAgIGxpbmVhcjogbGluZWFyRGVmYXVsdC5jb3B5KCksCiAgICAgICAgYXhpczogZDMuYXhpc1RvcCgpCiAgICAgIH0sCiAgICAgIHkyOiB7CiAgICAgICAgYmFuZDogYmFuZERlZmF1bHQuY29weSgpLAogICAgICAgIGxpbmVhcjogbGluZWFyRGVmYXVsdC5jb3B5KCksCiAgICAgICAgYXhpczogZDMuYXhpc1JpZ2h0KCkKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRHcm91cHMoZCkgewogICAgICB2YXIgc2V0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZ2V0U2V0cyhkKTsKICAgICAgdmFyIGdyYXBocyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZ2V0QWxsR3JhcGhzKHNldHMpOwoKICAgICAgdmFyIGdyYXBoR3JvdXBzID0gZ3JhcGhzLmZpbHRlcihmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICByZXR1cm4gIWdyYXBoLmdyb3VwOwogICAgICB9KTsKCiAgICAgIGdyYXBoR3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKGcpIHsKICAgICAgICBnLmdyb3VwVHlwZSA9ICdncmFwaCc7CiAgICAgICAgZy5ncm91cEdyYXBocyA9IFtnXTsKICAgICAgfSk7CgogICAgICByZXR1cm4gKCQkLmdyb3VwcyhkKSB8fCBbXSkubWFwKGZ1bmN0aW9uIChncm91cCkgewogICAgICAgIHZhciBuZXdHcm91cCA9IHsKICAgICAgICAgIGdyb3VwVHlwZTogJ2dyb3VwJywKICAgICAgICAgIGRhdGE6IGdyb3VwLAogICAgICAgICAgbGFiZWw6ICQkLmdyb3VwTGFiZWwoZ3JvdXApLAogICAgICAgICAgY29sb3I6ICQkLmdyb3VwQ29sb3IoZ3JvdXApCiAgICAgICAgfTsKCiAgICAgICAgbmV3R3JvdXAuZ3JvdXBHcmFwaHMgPSBncmFwaHMuZmlsdGVyKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgICAgcmV0dXJuIG5ld0dyb3VwLmxhYmVsID09PSBncmFwaC5ncm91cDsKICAgICAgICB9KTsKCiAgICAgICAgbmV3R3JvdXAuZ3JvdXBHcmFwaHMuZm9yRWFjaChmdW5jdGlvbiAoZykgewogICAgICAgICAgZy5jb2xvciA9IG5ld0dyb3VwLmNvbG9yOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gbmV3R3JvdXA7CiAgICAgIH0pLmNvbmNhdChncmFwaEdyb3Vwcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2V0cyhkKSB7CiAgICAgIHJldHVybiAkJC5zZXRzKGQpLm1hcChmdW5jdGlvbiAoc2V0LCBpKSB7CiAgICAgICAgdmFyIGdlbmVyYXRvclR5cGVzID0ge307CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRhdGE6IHNldCwKICAgICAgICAgIGtleTogJCQuc2V0S2V5KHNldCwgaSksCiAgICAgICAgICB4VHlwZTogJCQuc2V0WFR5cGUoc2V0KSB8fCAneCcsCiAgICAgICAgICB5VHlwZTogJCQuc2V0WVR5cGUoc2V0KSB8fCAneScsCiAgICAgICAgICBnZW5lcmF0b3JzOiAkJC5zZXRHZW5lcmF0b3JzKHNldCkubWFwKGZ1bmN0aW9uIChnZW5lcmF0b3IsIGkpIHsKICAgICAgICAgICAgdmFyIHR5cGUgPSBnZW5lcmF0b3IudHlwZSgpOwoKICAgICAgICAgICAgLy8gb25seSBhbm5vdGF0ZSBmaXJzdCBnZW5lcmF0b3IKICAgICAgICAgICAgaWYgKGkgIT09IDApIChnZW5lcmF0b3IucGFubm90YXRpb24gfHwgZ2VuZXJhdG9yLnBhbm5vdGF0aW9ucyB8fCBmdW5jdGlvbiAoKSB7fSkobnVsbCk7CgogICAgICAgICAgICBnZW5lcmF0b3IuYW5ub3RhdGlvbigkJC5hbm5vdGF0aW9uKS5rZXkoJCQuZ3JhcGhLZXkpOwoKICAgICAgICAgICAgZ2VuZXJhdG9yVHlwZXNbdHlwZV0gPSBnZW5lcmF0b3JUeXBlc1t0eXBlXSB8fCAwOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGRhdGE6IGdlbmVyYXRvciwKICAgICAgICAgICAgICBrZXk6IHR5cGUgKyAnLScgKyAoZ2VuZXJhdG9yVHlwZXNbdHlwZV0gKz0gMSksCiAgICAgICAgICAgICAgZ2VuZXJhdG9yOiBnZW5lcmF0b3IKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pLAogICAgICAgICAgZ3JhcGhzOiBnZXRTZXRHcmFwaHMoc2V0KQogICAgICAgIH07CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNldEdyYXBocyhkKSB7CiAgICAgIHJldHVybiAkJC5zZXRHcmFwaHMoZCkubWFwKGZ1bmN0aW9uIChncmFwaCwgaSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBkYXRhOiBncmFwaCwKICAgICAgICAgIGxhYmVsOiAkJC5ncmFwaExhYmVsKGdyYXBoKSB8fCAnJywKICAgICAgICAgIGtleTogJCQuZ3JhcGhLZXkoZ3JhcGgsIGkpLAogICAgICAgICAgY29sb3I6ICQkLmdyYXBoQ29sb3IoZ3JhcGgpLAogICAgICAgICAgZ3JvdXA6ICQkLmdyYXBoR3JvdXAoZ3JhcGgpLAogICAgICAgICAgYW5ub3RhdGlvbnM6ICQkLmdyYXBoQW5ub3RhdGlvbnMoZ3JhcGgpIHx8IFtdLAogICAgICAgICAgdG9vbHRpcENvbmZpZzogJCQuZ3JhcGhUb29sdGlwQ29uZmlnKGdyYXBoKSB8fCBmdW5jdGlvbiAoKSB7fQogICAgICAgIH07CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEFsbEdyYXBocyhzZXRzKSB7CiAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIHNldHMubWFwKGZ1bmN0aW9uIChzZXQpIHsKICAgICAgICByZXR1cm4gc2V0LmdyYXBoczsKICAgICAgfSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BhZ2F0ZUhpZGRlbihncm91cHMpIHsKICAgICAgZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7CiAgICAgICAgZ3JvdXAuZ3JvdXBHcmFwaHMuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGgpIHsKICAgICAgICAgIHJldHVybiBncmFwaC5kYXRhLmhpZGRlbiA9IGdyb3VwLmRhdGEuaGlkZGVuOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsZWdlbmRNb3VzZW92ZXIoZCwgc2VsZWN0aW9uKSB7CiAgICAgIHZhciBncmFwaHMgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLWdyYXBoJyksCiAgICAgICAgICBhbm5vdGF0aW9ucyA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy5kMmItYXhpcy1hbm5vdGF0aW9uJyk7CiAgICAgIGlmICghZC5ncm91cEdyYXBocy5zb21lKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgIHJldHVybiAhZ3JhcGguZGF0YS5oaWRkZW47CiAgICAgIH0pKSByZXR1cm47CiAgICAgIGdyYXBocy5zdHlsZSgnb3BhY2l0eScsIDAuMikuZmlsdGVyKGZ1bmN0aW9uIChncmFwaCkgewogICAgICAgIHJldHVybiBkLmRhdGEgPT09IGdyYXBoLmRhdGEgfHwgKGQuZ3JvdXBHcmFwaHMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5kYXRhOwogICAgICAgIH0pIHx8IFtdKS5pbmRleE9mKGdyYXBoLmRhdGEpID4gLTE7CiAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgJycpOwoKICAgICAgYW5ub3RhdGlvbnMuc3R5bGUoJ29wYWNpdHknLCAwLjIpLmZpbHRlcihmdW5jdGlvbiAoYW5ub3RhdGlvbikgewogICAgICAgIHJldHVybiBkLmRhdGEgPT09IGFubm90YXRpb24uZ3JhcGggfHwgKGQuZ3JvdXBHcmFwaHMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICByZXR1cm4gZC5kYXRhOwogICAgICAgIH0pIHx8IFtdKS5pbmRleE9mKGFubm90YXRpb24uZ3JhcGgpID4gLTE7CiAgICAgIH0pLnN0eWxlKCdvcGFjaXR5JywgJycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlZ2VuZE1vdXNlb3V0KGQsIHNlbGVjdGlvbikgewogICAgICBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLWdyYXBoJykuc3R5bGUoJ29wYWNpdHknLCAxKTsKICAgICAgc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmQyYi1heGlzLWFubm90YXRpb24nKS5zdHlsZSgnb3BhY2l0eScsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGNoR3JhcGgoZ3JhcGgsIGFsbEdyYXBocykgewogICAgICByZXR1cm4gYWxsR3JhcGhzLmZpbHRlcihmdW5jdGlvbiAoZykgewogICAgICAgIHJldHVybiBnLmRhdGEgPT09IGdyYXBoIHx8IGcuZGF0YSA9PT0gZ3JhcGguZGF0YTsKICAgICAgfSlbMF07CiAgICB9CgogICAgZnVuY3Rpb24gc2V0dXBBeGlzKGRhdGEsIHBvaW50cywgZGVmYXVsdHMpIHsKICAgICAgaWYgKCFwb2ludHMubGVuZ3RoKSBkYXRhLmhpZGRlbiA9IHRydWU7CgogICAgICB2YXIgYXhpcyA9IGRhdGEuYXhpcyB8fCBkZWZhdWx0cy5heGlzLAogICAgICAgICAgc2NhbGUgPSBkYXRhLnNjYWxlID8gZGF0YS5zY2FsZS5jb3B5KCkgOiBnZXRTY2FsZShwb2ludHMsIGRlZmF1bHRzKTsKCiAgICAgIHZhciBkb21haW4gPSBzY2FsZS5kb21haW4oKTsKCiAgICAgIGlmICghc2NhbGUuYmFuZHdpZHRoICYmIGRhdGEubGluZWFyUGFkZGluZykgewogICAgICAgIHZhciBkaXN0ID0gZG9tYWluWzFdIC0gZG9tYWluWzBdOwogICAgICAgIGRvbWFpblswXSA9IGRvbWFpblswXSArIGRpc3QgKiBkYXRhLmxpbmVhclBhZGRpbmdbMF07CiAgICAgICAgZG9tYWluWzFdID0gZG9tYWluWzFdICsgZGlzdCAqIGRhdGEubGluZWFyUGFkZGluZ1sxXTsKICAgICAgfQoKICAgICAgc2NhbGUuZG9tYWluKGRvbWFpbik7CiAgICAgIGRhdGEuX19heGlzX18gPSBheGlzLnNjYWxlKHNjYWxlKTsKICAgICAgZGF0YS5fX3NjYWxlX18gPSBzY2FsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTY2FsZShwb2ludHMsIGRlZmF1bHRzKSB7CiAgICAgIHZhciBiYW5kID0gcG9pbnRzLnNvbWUoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gaXNOYU4oZCk7CiAgICAgIH0pLAogICAgICAgICAgZG9tYWluID0gYmFuZCA/IGQzLnNldChwb2ludHMpLnZhbHVlcygpIDogZDMuZXh0ZW50KHBvaW50cykubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIGQgfHwgMDsKICAgICAgfSksCiAgICAgICAgICBzY2FsZSA9IGJhbmQgPyBkZWZhdWx0cy5iYW5kIDogZGVmYXVsdHMubGluZWFyOwoKICAgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOwogICAgfQoKICAgIHJldHVybiBjaGFydDsKICB9CgogIC8qKgogICAqIGQyYi5jaGFydFN1bmJ1cnN0KCkgcmV0dXJucyBhIGQyYgogICAqIHN1bmJ1cnN0IGNoYXJ0IGdlbmVyYXRvcgogICAqLwogIGZ1bmN0aW9uIHN1bmJ1cnN0ICgpIHsKCiAgICB2YXIgJCQgPSB7fTsKCiAgICAvLyBjaGFydCB1cGRhdGVyCiAgICB2YXIgY2hhcnQgPSBmdW5jdGlvbiBjaGFydChjb250ZXh0KSB7CiAgICAgIGNvbnRleHQuY2FsbCgkJC5jaGFydEZyYW1lKTsKCiAgICAgIC8vIGNvbmZpZ3VyZSBzdW5idXJzdAogICAgICAkJC5zdW5idXJzdC5sYWJlbCgkJC5sYWJlbCkuY29sb3IoJCQuY29sb3IpOwogICAgICAvLyBjb25maWd1cmUgYnJlYWRjcnVtYnMKICAgICAgJCQuYnJlYWRjcnVtYnMuY29sb3IoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gJCQuY29sb3IoZC5kYXRhKTsKICAgICAgfSkua2V5KGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0pOwogICAgICAvLyBjb25maWd1cmUgdG9vbHRpcAogICAgICAkJC50b29sdGlwLmNvbG9yKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuICQkLmNvbG9yKGQuZGF0YSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CgogICAgICBzZWxlY3Rpb24uZWFjaChmdW5jdGlvbiAoZGF0dW0pIHsKICAgICAgICB1cGRhdGUuY2FsbCh0aGlzLCBkYXR1bSwgY29udGV4dCAhPT0gc2VsZWN0aW9uID8gY29udGV4dCA6IG51bGwpOwogICAgICB9KTsKCiAgICAgIHNlbGVjdGlvbi5kaXNwYXRjaCgnY2hhcnQtc3VuYnVyc3QtdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBjaGFydDsKICAgIH07CgogICAgLy8gY29uZmlndXJlIGNoYXJ0IHByb3BlcnRpZXMKICAgIGJhc2UoY2hhcnQsICQkKS5hZGRQcm9wKCdjaGFydEZyYW1lJywgY2hhcnRGcmFtZSgpLmxlZ2VuZEVuYWJsZWQoZmFsc2UpLmJyZWFkY3J1bWJzRW5hYmxlZCh0cnVlKSkuYWRkUHJvcCgnc3VuYnVyc3QnLCBzdmdTdW5idXJzdCgpKS5hZGRQcm9wKCdicmVhZGNydW1icycsIGJyZWFkY3J1bWJzKCkuaHRtbChmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gJzxkaXYgY2xhc3MgPSBcJ2QyYi1zdW5idXJzdC1icmVhZGNydW1iXCc+JyArIHRpcFRlbXBsYXRlKGQpICsgJzwvZGl2Pic7CiAgICB9KSkuYWRkUHJvcCgndG9vbHRpcCcsIHRvb2x0aXAoKS5mb2xsb3dNb3VzZSh0cnVlKS5odG1sKGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiAnPGRpdiBjbGFzcyA9IFwnZDJiLXN1bmJ1cnN0LXRvb2x0aXBcJz4nICsgdGlwVGVtcGxhdGUoZCkgKyAnPC9kaXY+JzsKICAgIH0pKS5hZGRQcm9wRnVuY3RvcignbGFiZWwnLCBmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gZC5sYWJlbDsKICAgIH0pLmFkZFByb3BGdW5jdG9yKCdjb2xvcicsIGZ1bmN0aW9uIChkKSB7CiAgICAgIHJldHVybiBjb2xvcigkJC5sYWJlbChkKSk7CiAgICB9KS5hZGRQcm9wRnVuY3Rvcignb3V0ZXJSYWRpdXMnLCBmdW5jdGlvbiAoZCwgdywgaCkgewogICAgICByZXR1cm4gTWF0aC5taW4odywgaCkgLyAyOwogICAgfSkuYWRkUHJvcEZ1bmN0b3IoJ2lubmVyUmFkaXVzJywgZnVuY3Rpb24gKGQsIHcsIGgpIHsKICAgICAgcmV0dXJuIE1hdGgubWluKDUwLCBNYXRoLm1pbih3LCBoKSAvIDQpOwogICAgfSk7CgogICAgLy8gaGVscGVycwogICAgdmFyIGZvcm1hdCA9IGQzLmZvcm1hdCgnLC4wZicpLAogICAgICAgIGZvcm1hdFBlcmNlbnQgPSBkMy5mb3JtYXQoJy4xJScpOwoKICAgIHZhciB0aXBUZW1wbGF0ZSA9IGZ1bmN0aW9uIHRpcFRlbXBsYXRlKGQpIHsKICAgICAgdmFyIHBlcmNlbnQgPSBkLnZhbHVlIC8gZC5zZWxlY3RlZC52YWx1ZTsKICAgICAgdmFyIHBlcmNlbnRUZXh0ID0gcGVyY2VudCA+IDEgPyAnJyA6ICc8ZGl2IGNsYXNzID0gXCdkMmItc3VuYnVyc3QtcGVyY2VudFwnPlxuICAgICAgICAnICsgZm9ybWF0UGVyY2VudChkLnZhbHVlIC8gZC5zZWxlY3RlZC52YWx1ZSkgKyAnXG4gICAgICA8L2Rpdj4nOwoKICAgICAgcmV0dXJuICdcbiAgICAgIDxkaXYgY2xhc3MgPSBcJ2QyYi1zdW5idXJzdC1sYWJlbFwnPlxuICAgICAgICAnICsgJCQubGFiZWwoZC5kYXRhKSArICdcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcyA9IFwnZDJiLXN1bmJ1cnN0LXZhbHVlXCc+XG4gICAgICAgICcgKyBmb3JtYXQoZC52YWx1ZSkgKyAnXG4gICAgICAgICcgKyBwZXJjZW50VGV4dCArICdcbiAgICAgIDwvZGl2PlxuICAgICc7CiAgICB9OwoKICAgIC8vIHVwZGF0ZSBicmVhZGNydW1icwogICAgZnVuY3Rpb24gc2V0QnJlYWRjcnVtYnMoZWwsIGRhdGEpIHsKICAgICAgZWwuc2VsZWN0KCcuZDJiLWJyZWFkY3J1bWJzLWNvbnRhaW5lcicpLmRhdHVtKGRhdGEpLnRyYW5zaXRpb24oJ3N1bmJ1cnN0LWJyZWFkY3J1bWJzJykuZHVyYXRpb24oMTAwKS5jYWxsKCQkLmJyZWFkY3J1bWJzKTsKICAgIH0KCiAgICAvLyBkZWZpbmUgbW91c2VvdmVyIGFuZCBjbGljayBldmVudHMKICAgIGZ1bmN0aW9uIGRlZmluZUV2ZW50cyhlbCkgewogICAgICB2YXIgc3VuYnVyc3RDaGFydCA9IGVsLnNlbGVjdCgnLmQyYi1zdW5idXJzdC1jaGFydCcpLAogICAgICAgICAgcm9vdCA9IGVsLnNlbGVjdEFsbCgnLmQyYi1zdW5idXJzdC1hcmMuZDJiLXN1bmJ1cnN0LWxldmVsLTAnKS5kYXR1bSgpLAogICAgICAgICAgc2VsZWN0ZWQgPSByb290LnNlbGVjdGVkOwoKICAgICAgc2V0QnJlYWRjcnVtYnMoZWwsIFtzZWxlY3RlZF0pOwogICAgICBzdW5idXJzdENoYXJ0LnNlbGVjdEFsbCgnLmQyYi1zdW5idXJzdC1hcmMnKS5jYWxsKCQkLnRvb2x0aXAuY2xlYXIpLmNhbGwoJCQudG9vbHRpcCkub24oJ21vdXNlb3Zlci5icmVhZGNydW1icycsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IGQuYW5jZXN0b3JzKCk7CiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLnNsaWNlKDAsIGFuY2VzdG9ycy5pbmRleE9mKHNlbGVjdGVkKSArIDEpOwogICAgICAgIHNldEJyZWFkY3J1bWJzKGVsLCBhbmNlc3RvcnMucmV2ZXJzZSgpKTsKICAgICAgfSkub24oJ21vdXNlb3V0LmJyZWFkY3J1bWJzJywgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBzZXRCcmVhZGNydW1icyhlbCwgW3NlbGVjdGVkXSk7CiAgICAgIH0pOwoKICAgICAgc3VuYnVyc3RDaGFydC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZUV2ZW50cyhlbCk7CiAgICAgIH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gZGVmaW5lRXZlbnRzKGVsKTsKICAgICAgfSk7CiAgICB9CgogICAgLy8gdXBkYXRlIHN1bmJ1cnN0CiAgICBmdW5jdGlvbiB1cGRhdGUoZGF0dW0sIHRyYW5zaXRpb24pIHsKICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgc2VsZWN0aW9uID0gZWwuc2VsZWN0KCcuZDJiLWNoYXJ0LWNvbnRhaW5lcicpLAogICAgICAgICAgc2l6ZSA9IHNlbGVjdGlvbi5ub2RlKCkuX19zaXplX18sCiAgICAgICAgICB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyBzaXplLndpZHRoIC8gMiArICcsICcgKyBzaXplLmhlaWdodCAvIDIgKyAnKSc7CgogICAgICB2YXIgc3VuYnVyc3RDaGFydCA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy5kMmItc3VuYnVyc3QtY2hhcnQnKS5kYXRhKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgcmV0dXJuIFtkXTsKICAgICAgfSksCiAgICAgICAgICBzdW5idXJzdENoYXJ0RW50ZXIgPSBzdW5idXJzdENoYXJ0LmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgdHJhbnNmb3JtKS5hdHRyKCdjbGFzcycsICdkMmItc3VuYnVyc3QtY2hhcnQnKTsKCiAgICAgIHN1bmJ1cnN0Q2hhcnQgPSBzdW5idXJzdENoYXJ0Lm1lcmdlKHN1bmJ1cnN0Q2hhcnRFbnRlcik7CgogICAgICBpZiAodHJhbnNpdGlvbikgewogICAgICAgIHN1bmJ1cnN0Q2hhcnQgPSBzdW5idXJzdENoYXJ0LnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgIH0KCiAgICAgICQkLnN1bmJ1cnN0Lm91dGVyUmFkaXVzKCQkLm91dGVyUmFkaXVzKGRhdHVtLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCkpLmlubmVyUmFkaXVzKCQkLmlubmVyUmFkaXVzKGRhdHVtLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCkpOwoKICAgICAgc3VuYnVyc3RDaGFydC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pLmNhbGwoJCQuc3VuYnVyc3QpOwoKICAgICAgZGVmaW5lRXZlbnRzKGVsKTsKICAgIH0KCiAgICByZXR1cm4gY2hhcnQ7CiAgfQoKICBmdW5jdGlvbiBzYW5rZXkkMiAoKSB7CgogICAgdmFyICQkID0ge307CgogICAgZnVuY3Rpb24gY2hhcnQoY29udGV4dCkgewogICAgICBjb250ZXh0LmNhbGwoJCQuY2hhcnRGcmFtZSk7CgogICAgICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDsKCiAgICAgIHNlbGVjdGlvbi5lYWNoKGZ1bmN0aW9uIChkYXR1bSkgewogICAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGRhdHVtLCBjb250ZXh0ICE9PSBzZWxlY3Rpb24gPyBjb250ZXh0IDogbnVsbCk7CiAgICAgIH0pOwoKICAgICAgc2VsZWN0aW9uLmRpc3BhdGNoKCdjaGFydC1zYW5rZXktdXBkYXRlZCcsIHsgYnViYmxlczogdHJ1ZSB9KTsKCiAgICAgIHJldHVybiBjaGFydDsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGUoZGF0dW0sIHRyYW5zaXRpb24pIHsKICAgICAgdmFyIGVsID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgc2VsZWN0aW9uID0gZWwuc2VsZWN0KCcuZDJiLWNoYXJ0LWNvbnRhaW5lcicpLAogICAgICAgICAgc2l6ZSA9IHNlbGVjdGlvbi5ub2RlKCkuX19zaXplX187CgogICAgICB2YXIgc2Fua2V5Q2hhcnQgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuZDJiLXNhbmtleS1jaGFydCcpLmRhdGEoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gW2RdOwogICAgICB9KSwKICAgICAgICAgIHNhbmtleUNoYXJ0RW50ZXIgPSBzYW5rZXlDaGFydC5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2QyYi1zYW5rZXktY2hhcnQnKTsKCiAgICAgIHNhbmtleUNoYXJ0ID0gc2Fua2V5Q2hhcnQubWVyZ2Uoc2Fua2V5Q2hhcnRFbnRlcik7CgogICAgICBpZiAodHJhbnNpdGlvbikgewogICAgICAgIHNhbmtleUNoYXJ0ID0gc2Fua2V5Q2hhcnQudHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKICAgICAgfQoKICAgICAgc2Fua2V5Q2hhcnQuY2FsbCgkJC5zYW5rZXkuc2l6ZShzaXplKSk7CgogICAgICBzYW5rZXlDaGFydC5zZWxlY3RBbGwoJy5kMmItc2Fua2V5LWxpbmsnKS5jYWxsKCQkLmxpbmtUb29sdGlwKTsKCiAgICAgIHNhbmtleUNoYXJ0LnNlbGVjdEFsbCgnLmQyYi1zYW5rZXktbm9kZScpLmNhbGwoJCQubm9kZVRvb2x0aXApOwoKICAgICAgcmV0dXJuIGNoYXJ0OwogICAgfQoKICAgIHZhciBkZWZhdWx0Tm9kZVRvb2x0aXAgPSB0b29sdGlwKCkuaHRtbChmdW5jdGlvbiAoZCkgewogICAgICByZXR1cm4gJ1xuICAgICAgICAgIDxiPicgKyBkLmtleSArICc8L2I+OlxuICAgICAgICAgICcgKyBkLnZhbHVlICsgJ1xuICAgICAgICAnOwogICAgfSkuY29sb3IoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuIGQuY29sb3I7CiAgICB9KS5mb2xsb3dNb3VzZSh0cnVlKTsKCiAgICB2YXIgZGVmYXVsdExpbmtUb29sdGlwID0gdG9vbHRpcCgpLmh0bWwoZnVuY3Rpb24gKGQpIHsKICAgICAgcmV0dXJuICdcbiAgICAgICAgICA8Yj4nICsgZC5zb3VyY2Uua2V5ICsgJzwvYj5cbiAgICAgICAgICA8aSBjbGFzcz1cJ2ZhIGZhLWFycm93LXJpZ2h0IGQyYi1zYW5rZXktbGluay1hcnJvd1wnIGFyaWEtaGlkZGVuPVwndHJ1ZVwnPjwvaT5cbiAgICAgICAgICA8Yj4nICsgZC50YXJnZXQua2V5ICsgJzwvYj46XG4gICAgICAgICAgJyArIGQudmFsdWUgKyAnXG4gICAgICAgICc7CiAgICB9KS5jb2xvcignIzQ0NCcpLmZvbGxvd01vdXNlKHRydWUpOwoKICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9kZWwKICAgIGJhc2UoY2hhcnQsICQkKS5hZGRQcm9wKCdjaGFydEZyYW1lJywgY2hhcnRGcmFtZSgpLmxlZ2VuZEVuYWJsZWQoZmFsc2UpLmJyZWFkY3J1bWJzRW5hYmxlZChmYWxzZSkpLmFkZFByb3AoJ3NhbmtleScsIHNhbmtleSQxKCkpLmFkZFByb3AoJ25vZGVUb29sdGlwJywgZGVmYXVsdE5vZGVUb29sdGlwKS5hZGRQcm9wKCdsaW5rVG9vbHRpcCcsIGRlZmF1bHRMaW5rVG9vbHRpcCk7CgogICAgcmV0dXJuIGNoYXJ0OwogIH0KCiAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjsKICBleHBvcnRzLnRleHRXcmFwID0gdGV4dFdyYXA7CiAgZXhwb3J0cy50ZXh0V3JhcFBYID0gdGV4dFdyYXBQWDsKICBleHBvcnRzLnR3ZWVuQXJjID0gdHdlZW5BcmM7CiAgZXhwb3J0cy50d2Vlbk51bWJlciA9IHR3ZWVuTnVtYmVyOwogIGV4cG9ydHMudHdlZW5DZW50cm9pZCA9IHR3ZWVuQ2VudHJvaWQ7CiAgZXhwb3J0cy50b29sdGlwID0gdG9vbHRpcDsKICBleHBvcnRzLnRvb2x0aXBBeGlzID0gdG9vbHRpcEF4aXM7CiAgZXhwb3J0cy5zdGFjayA9IHN0YWNrOwogIGV4cG9ydHMuYnJlYWRjcnVtYnMgPSBicmVhZGNydW1iczsKICBleHBvcnRzLmxlZ2VuZCA9IGxlZ2VuZDsKICBleHBvcnRzLmNoYXJ0RnJhbWUgPSBjaGFydEZyYW1lOwogIGV4cG9ydHMuZGVmYXVsdENvbG9yID0gY29sb3I7CiAgZXhwb3J0cy5pZCA9IGQyYmlkOwogIGV4cG9ydHMuY29sb3IgPSBjb2xvcjsKICBleHBvcnRzLm9taXQgPSBvbWl0OwogIGV4cG9ydHMubWVhbiA9IG1lYW47CiAgZXhwb3J0cy5tZWRpYW4gPSBtZWRpYW47CiAgZXhwb3J0cy5tb2RlID0gbW9kZTsKICBleHBvcnRzLnJhbmdlID0gcmFuZ2U7CiAgZXhwb3J0cy5taWRwb2ludCA9IG1pZHBvaW50OwogIGV4cG9ydHMudG9EZWdyZWVzID0gdG9EZWdyZWVzOwogIGV4cG9ydHMudG9SYWRpYW5zID0gdG9SYWRpYW5zOwogIGV4cG9ydHMubW9kZWxCYXNlID0gYmFzZTsKICBleHBvcnRzLnN5bWJvbE1hcnMgPSBtYXJzOwogIGV4cG9ydHMuc3ltYm9sVmVudXMgPSB2ZW51czsKICBleHBvcnRzLnBvaW50ID0gcG9pbnQ7CiAgZXhwb3J0cy5zdmdQaWUgPSBzdmdQaWU7CiAgZXhwb3J0cy5zdmdMaW5lID0gbGluZSQxOwogIGV4cG9ydHMuc3ZnQXJlYSA9IGFyZWEkMTsKICBleHBvcnRzLnN2Z1NjYXR0ZXIgPSBzY2F0dGVyOwogIGV4cG9ydHMuc3ZnQmFyID0gYmFyOwogIGV4cG9ydHMuc3ZnQm94UGxvdCA9IGJveFBsb3Q7CiAgZXhwb3J0cy5zdmdCdWJibGVQYWNrID0gYnViYmxlUGFjazsKICBleHBvcnRzLnN2Z1N1bmJ1cnN0ID0gc3ZnU3VuYnVyc3Q7CiAgZXhwb3J0cy5zdmdTYW5rZXkgPSBzYW5rZXkkMTsKICBleHBvcnRzLnBsYW5lID0gcGxhbmU7CiAgZXhwb3J0cy5ib3ggPSBib3g7CiAgZXhwb3J0cy5jaGFydFBpZSA9IHBpZTsKICBleHBvcnRzLmNoYXJ0QXhpcyA9IGF4aXM7CiAgZXhwb3J0cy5jaGFydFN1bmJ1cnN0ID0gc3VuYnVyc3Q7CiAgZXhwb3J0cy5jaGFydFNhbmtleSA9IHNhbmtleSQyOwoKfSgodGhpcy5kMmIgPSB0aGlzLmQyYiB8fCB7fSksZDMsZDMsZDMsZDMpKTs="></script></p>
<div id="htmlwidget_container">
<h2 align="left">Werbeumsätze 2019 nach Rubrik</h2>
<div id="htmlwidget-9e34e873def80810773b" class="sund2b html-widget" style="width: 800px; height: 600px;"></div>
<h3>Klicken Sie auf die einzelnen Segmente für eine feinere Betrachtung. Durch Anklicken des grauen Rings gelangen Sie wieder eine Ebene zurück.</h3>
</div>
<p><script type="application/json" data-for="htmlwidget-9e34e873def80810773b"></script><br />
<script type="application/htmlwidget-sizing" data-for="htmlwidget-9e34e873def80810773b"></script></p>
<p>Online-Werbung wächst auch weiter, allerdings langsamer – mit Ausnahme der Werbung auf mobilen Endgeräten. Wir erwarten für mobile Werbung weiterhin ein deutliches Wachstum.</p>
<p>Die Print-Werbeträger entwickeln sich weiterhin rückläufig – wie in den letzten Jahren. Wir erwarten, dass stärkere Investitionen in neue Produkte und in die Vermarktung der Verlage diesen Trend verlangsamen – auch wenn dies noch nicht in diesem Jahr in den Gesamtmarktzahlen zu sehen sein dürfte. Wir sehen vor allem in der Zusammenarbeit mit regionalen Kunden bei einigen regionalen Verlagen schon vielversprechende Wege.</p>
<p>Für den Media Index wertet SCHICKLER zahlreiche Quellen aus. Der Index umfasst die Ausgaben für alle Formen kommerzieller Kommunikation und zeichnet daraus ein Gesamtbild des Marktes.</p>
<p><a href="https://www.horizont.net/medien/nachrichten/exklusive-schickler-auswertung-so-viel-werbegeld-fliesst-2019-in-die-medienkanaele-tv-print-digital--co-173057?utm_medium=Social&utm_source=Twitter#Echobox=1550735059">Mehr zu den Studienergebnissen lesen Sie hier.</a></p>
</div><div class="fusion-clearfix"></div></div></div></div></div>
<p>Der Beitrag <a href="https://www.schickler.de/2019/03/schickler-media-index-das-geben-unternehmen-2019-fuer-die-medienkanaele-tv-print-digital-co-aus/">SCHICKLER Media Index: Das geben Unternehmen 2019 für die Medienkanäle TV, Print, Digital &#038; Co aus</a> erschien zuerst auf <a href="https://www.schickler.de">Schickler Unternehmensberatung aus Hamburg</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
