<?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>Music Theory Archives - Canton Music Academy</title>
	<atom:link href="https://www.cantonmusicacademy.com/tag/music-theory/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Music Lessons for all ages</description>
	<lastBuildDate>Tue, 13 Oct 2026 16:10:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://www.cantonmusicacademy.com/wp-content/uploads/2023/02/cropped-canton-record-logo-150x150.jpg</url>
	<title>Music Theory Archives - Canton Music Academy</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">222841575</site>	<item>
		<title>How to Read and Use a Circle of Fifths Chart for Music Theory Success</title>
		<link>https://www.cantonmusicacademy.com/circle-of-fifths-chart/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Mon, 14 Jul 2025 20:35:29 +0000</pubDate>
				<category><![CDATA[Music Education]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1650</guid>

					<description><![CDATA[<p>The circle of fifths is a map of every key in music. Tap any key below to see its key signature, its relative major or minor, its closest neighbors and the chords that belong to it, and hear how they sound. Loading the circle of fifths… What Is a Circle of Fifths Chart? A circle...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">How to Read and Use a Circle of Fifths Chart for Music Theory Success</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Circle of Fifths Chart (interactive)
  URL stays the same: /circle-of-fifths-chart/
  WHERE: Posts → edit "How to Read and Use a Circle of Fifths Chart" → delete
  ALL old blocks (including the old chart image and the Random Chord
  Progression Generator code) → add ONE "Custom HTML" block → paste
  everything below → Update → Delete Cache.
  Yoast SEO title:        Interactive Circle of Fifths Chart + Free PDF | Canton Music Academy
  Yoast meta description: Tap any key on our interactive circle of fifths to see its key signature, relative minor and chords, and hear them. Plus a free printable circle of fifths PDF.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-cofgrid{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:20px;align-items:start}
.cmx-circ svg{width:100%;height:auto;display:block}
.cmx-cofsvg .seg{cursor:pointer;transition:fill .15s}
.cmx-cofsvg .seg:hover{fill-opacity:.85;stroke:#0477BF}
.cmx-cofsvg .seg:focus{outline:none;stroke:#F2B233;stroke-width:3}
.cmx-cofsvg .lab{font-family:"CMAcc",Montserrat,Arial,sans-serif}
.cmx-hint{text-align:center;color:var(--mut);font-size:.82rem!important;margin:6px 0 0!important}
.cmx-keypanel .cmx-big{font-size:clamp(1.8rem,4.5vw,2.4rem)}
.cmx-sigrow{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:6px 0 4px}
.cmx-sigrow b{font-size:1.05rem}
.cmx-accs{color:var(--b);font-weight:800;letter-spacing:.04em}
.cmx-staffwrap svg{width:100%;max-width:300px;height:auto;display:block;margin:2px 0 4px}
.cmx-rel{margin:4px 0!important;font-weight:600;color:var(--ink)!important;font-size:.95rem!important}
.cmx-enh{margin:6px 0}
.cmx-btn.sm{padding:7px 14px;min-height:36px;font-size:.82rem}
.cmx-scale{margin:0 0 12px!important;font-size:1.05rem}
.cmx-chordrow{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;margin:0 0 14px}
.cmx-chord{font-family:inherit;display:flex;flex-direction:column;align-items:center;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:8px 2px;cursor:pointer;min-width:0}
.cmx-chord b{font-size:.92rem;color:var(--ink);white-space:nowrap}
.cmx-chord small{font-size:.68rem;color:var(--mut);font-weight:700}
.cmx-chord:hover{border-color:var(--b)}
.cmx-keypanel .cmx-lbl{margin-top:10px}
@media (max-width:700px){
  .cmx-cofgrid{grid-template-columns:1fr}
  .cmx-chordrow{grid-template-columns:repeat(4,1fr)}
}

</style>

<div class="cmx">

<p class="cmx-lead">The circle of fifths is a map of every key in music. Tap any key below to see its key signature, its relative major or minor, its closest neighbors and the chords that belong to it, and hear how they sound.</p>

<div class="cmx-tool" id="cmx-cof"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the circle of fifths…</p></div>

<h2>What Is a Circle of Fifths Chart?</h2>
<p>A circle of fifths chart arranges the 12 keys of Western music in a circle, with each key a perfect fifth away from the next. It&#8217;s one of the most useful visual aids in music theory, giving you a quick reference for:</p>
<ul class="wp-block-list">
  <li>Key signatures (sharps and flats)</li>
  <li>Relative major and minor keys</li>
  <li>Harmonic relationships between keys</li>
  <li>Chord progression possibilities</li>
  <li>Transposing between keys</li>
</ul>
<p>Moving clockwise adds one sharp at a time (C, G, D, A, E, B, F♯), and moving counterclockwise adds one flat at a time (F, B♭, E♭, A♭, D♭, G♭). C major and A minor sit at the top because they have no sharps or flats. At the bottom, three keys have two names that sound the same, like F♯ and G♭.</p>

<h2>How to Read the Circle</h2>
<p><b>Outer ring:</b> major keys. <b>Inner ring:</b> each major key&#8217;s relative minor, which shares the same key signature. <b>Center numbers:</b> how many sharps or flats that key signature has.</p>
<p>The keys on either side of any key are its closest relatives. In C major, F is on one side (the IV chord) and G is on the other (the V chord). Together with their relative minors, those six keys are the ones music most often moves between, and the interactive chart highlights them for whichever key you choose.</p>

<h2>Practical Uses for a Circle of Fifths Chart</h2>
<figure class="wp-block-table"><table><thead><tr><th>Purpose</th><th>How it helps</th></tr></thead><tbody>
<tr><td>Identify key signatures</td><td>Quickly see the sharps or flats in any key</td></tr>
<tr><td>Understand harmony</td><td>Learn which chords naturally fit together</td></tr>
<tr><td>Transpose songs</td><td>Move music to a new key with confidence</td></tr>
<tr><td>Compose music</td><td>Find related keys for smooth key changes</td></tr>
<tr><td>Improvise</td><td>Build progressions from chords in the same key</td></tr>
</tbody></table></figure>

<h2>Why Visual Learners Love the Circle of Fifths</h2>
<p>Music theory can feel abstract when it&#8217;s only explained in words or memorized by rote. The circle of fifths turns key relationships into a picture you can see, and hearing the chords makes it stick. At Canton Music Academy we use it in lessons to help students break down songs, understand scales and intervals, and build theory knowledge that lasts.</p>

<h2>Download Your Free Printable Circle of Fifths Chart</h2>
<p>Want a copy for your practice space or lesson binder? Our clean, easy-to-read circle of fifths PDF highlights C major and A minor and labels the scale degrees, so it&#8217;s great for students, teachers and musicians alike.</p>
<p><a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2025/07/circle-of-5ths.pdf" target="_blank" rel="noopener">⬇ Download the free circle of fifths PDF</a></p>

<h2>Circle of Fifths FAQ</h2>
<details><summary>Why is it called the circle of fifths?</summary><p>Because each key is a perfect fifth above the one before it as you move clockwise. After 12 steps you arrive back where you started, completing the circle.</p></details>
<details><summary>Does the circle of fifths apply to all instruments?</summary><p>Yes. Piano, guitar, brass, woodwinds and voice all use the same keys, so the chart works for any instrument.</p></details>
<details><summary>How is this different from a key signature chart?</summary><p>A key signature chart lists the sharps or flats in each key. The circle of fifths also shows how keys relate to each other, which makes it more useful for harmony, songwriting and transposing.</p></details>
<details><summary>What is a relative minor?</summary><p>Every major key has a relative minor that uses the same notes and key signature. It starts on the 6th note of the major scale; for example, the relative minor of C major is A minor.</p></details>
<details><summary>Is this suitable for beginners?</summary><p>Absolutely. Start by learning the order of sharps and flats, then use the chart to find the chords in songs you&#8217;re learning.</p></details>
<details><summary>Can I use this in my music classroom?</summary><p>Of course. Teachers are welcome to print the PDF and share this page with students.</p></details>

<p>Ready to put keys and chords together? Build and print your own progressions with our free <a href="https://www.cantonmusicacademy.com/chord-progression-builder/">Chord Progression Builder</a>, look up any chord with the <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a>, or work with a teacher in our <a href="https://www.cantonmusicacademy.com/music-lessons-in-canton-mi/">music lessons in Canton</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogSW50ZXJhY3RpdmUgQ2lyY2xlIG9mIEZpZnRocyDigJQgdXNlcyB3aW5kb3cuQ01LICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1jb2YnKTsKICBpZiAoIXJvb3QgfHwgcm9vdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknKSkgcmV0dXJuOwogIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JywgJzEnKTsKICB2YXIgSyA9IHdpbmRvdy5DTUssIGggPSBLLmgsIFMgPSBLLnN2Z0VsOwoKICB2YXIgTUFKID0gWydDJywgJ0cnLCAnRCcsICdBJywgJ0UnLCAnQicsICdGIycsICdEYicsICdBYicsICdFYicsICdCYicsICdGJ107CiAgdmFyIE1BSl9BTFQgPSB7IDU6ICdDYicsIDY6ICdHYicsIDc6ICdDIycgfTsKICB2YXIgTUlOID0gWydBJywgJ0UnLCAnQicsICdGIycsICdDIycsICdHIycsICdEIycsICdCYicsICdGJywgJ0MnLCAnRycsICdEJ107CiAgdmFyIE1JTl9BTFQgPSB7IDU6ICdBYicsIDY6ICdFYicsIDc6ICdBIycgfTsKICB2YXIgU0lHID0geyBDOiAwLCBHOiAxLCBEOiAyLCBBOiAzLCBFOiA0LCBCOiA1LCAnRiMnOiA2LCAnQyMnOiA3LCBGOiAtMSwgQmI6IC0yLCBFYjogLTMsIEFiOiAtNCwgRGI6IC01LCBHYjogLTYsIENiOiAtNyB9OwogIHZhciBTSEFSUFMgPSBbJ0YnLCAnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0InXSwgRkxBVFMgPSBbJ0InLCAnRScsICdBJywgJ0QnLCAnRycsICdDJywgJ0YnXTsKICB2YXIgTUFKX1NDQUxFID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgTUlOX1NDQUxFID0gWzAsIDIsIDMsIDUsIDcsIDgsIDEwXTsKICB2YXIgUk9NX01BSiA9IFsnSScsICdpaScsICdpaWknLCAnSVYnLCAnVicsICd2aScsICd2aWnCsCddLCBST01fTUlOID0gWydpJywgJ2lpwrAnLCAnSUlJJywgJ2l2JywgJ3YnLCAnVkknLCAnVklJJ107CiAgdmFyIHN0YXRlID0geyBpOiAwLCBtb2RlOiAnbWFqb3InLCBhbHQ6IGZhbHNlIH07CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgewogICAgdmFyIG0gPSBsb2NhdGlvbi5oYXNoLm1hdGNoKC9rZXk9KFtBLUddWyNiXT8pKG0_KS8pOwogICAgaWYgKCFtKSByZXR1cm47CiAgICB2YXIgbWlub3IgPSBtWzJdID09PSAnbScsIGxpc3QgPSBtaW5vciA_IE1JTiA6IE1BSiwgYWx0cyA9IG1pbm9yID8gTUlOX0FMVCA6IE1BSl9BTFQ7CiAgICB2YXIgaSA9IGxpc3QuaW5kZXhPZihtWzFdKSwgYWx0ID0gZmFsc2U7CiAgICBpZiAoaSA8IDApIHsgZm9yICh2YXIgayBpbiBhbHRzKSBpZiAoYWx0c1trXSA9PT0gbVsxXSkgeyBpID0gK2s7IGFsdCA9IHRydWU7IH0gfQogICAgaWYgKGkgPj0gMCkgeyBzdGF0ZS5pID0gaTsgc3RhdGUubW9kZSA9IG1pbm9yID8gJ21pbm9yJyA6ICdtYWpvcic7IHN0YXRlLmFsdCA9IGFsdDsgfQogIH0pKCk7CiAgZnVuY3Rpb24gcHJldHR5KG4pIHsgcmV0dXJuIG4ucmVwbGFjZSgnIycsICfima8nKS5yZXBsYWNlKC9iJC8sICfima0nKTsgfQogIGZ1bmN0aW9uIHRvbmljTmFtZSgpIHsKICAgIHZhciBsaXN0ID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSiA6IE1JTiwgYWx0cyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfQUxUIDogTUlOX0FMVDsKICAgIHJldHVybiBzdGF0ZS5hbHQgJiYgYWx0c1tzdGF0ZS5pXSA_IGFsdHNbc3RhdGUuaV0gOiBsaXN0W3N0YXRlLmldOwogIH0KICBmdW5jdGlvbiByZWxNYWpvck5hbWUobWlub3JOYW1lLCBpKSB7IHZhciBhbHQgPSBzdGF0ZS5hbHQgJiYgTUFKX0FMVFtpXTsgcmV0dXJuIGFsdCA_IE1BSl9BTFRbaV0gOiBNQUpbaV07IH0KICBmdW5jdGlvbiBzaWdPZigpIHsKICAgIHZhciBtYWpOYW1lID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IHRvbmljTmFtZSgpIDogKHN0YXRlLmFsdCAmJiBNQUpfQUxUW3N0YXRlLmldID8gTUFKX0FMVFtzdGF0ZS5pXSA6IE1BSltzdGF0ZS5pXSk7CiAgICByZXR1cm4gU0lHW21hak5hbWVdOwogIH0KICBmdW5jdGlvbiBzY2FsZU5vdGVzKCkgewogICAgdmFyIHQgPSBLLnBhcnNlTm90ZSh0b25pY05hbWUoKSksIHNjID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSl9TQ0FMRSA6IE1JTl9TQ0FMRTsKICAgIHJldHVybiBzYy5tYXAoZnVuY3Rpb24gKHMsIGQpIHsgcmV0dXJuIEsuc3BlbGwodC5sICsgZCwgdC5wYyArIHMpOyB9KTsKICB9CiAgZnVuY3Rpb24gY2hvcmRzKCkgewogICAgdmFyIG5zID0gc2NhbGVOb3RlcygpLCBzYyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfU0NBTEUgOiBNSU5fU0NBTEU7CiAgICByZXR1cm4gbnMubWFwKGZ1bmN0aW9uIChuLCBkKSB7CiAgICAgIHZhciB0aGlyZCA9IChzY1soZCArIDIpICUgN10gLSBzY1tkXSArIDEyKSAlIDEyLCBmaWZ0aCA9IChzY1soZCArIDQpICUgN10gLSBzY1tkXSArIDEyKSAlIDEyOwogICAgICB2YXIgcSA9IHRoaXJkID09PSA0ID8gJycgOiBmaWZ0aCA9PT0gNiA_ICfCsCcgOiAnbSc7CiAgICAgIHJldHVybiB7IHJvb3Q6IG4sIG5hbWU6IG4ubmFtZSArIHEsIHJvbWFuOiAoc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IFJPTV9NQUogOiBST01fTUlOKVtkXSwgcGNzOiBbbi5wYywgbnNbKGQgKyAyKSAlIDddLnBjLCBuc1soZCArIDQpICUgN10ucGNdLCB0aGlyZDogdGhpcmQsIGZpZnRoOiBmaWZ0aCB9OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG1pZGlDaG9yZChjKSB7IHZhciByID0gNDggKyBjLnJvb3QucGM7IGlmIChyIDwgNTMpIHIgKz0gMTI7IHJldHVybiBbciwgciArIGMudGhpcmQsIHIgKyBjLmZpZnRoXTsgfQoKICAvKiAtLS0tLS0tLS0tIGNpcmNsZSAtLS0tLS0tLS0tICovCiAgdmFyIENYID0gMjAwLCBDWSA9IDIwMDsKICBmdW5jdGlvbiBhcmMocjEsIHIyLCBhMSwgYTIpIHsKICAgIGZ1bmN0aW9uIHAociwgYSkgeyByZXR1cm4gW0NYICsgciAqIE1hdGguc2luKGEpLCBDWSAtIHIgKiBNYXRoLmNvcyhhKV07IH0KICAgIHZhciBBID0gcChyMiwgYTEpLCBCID0gcChyMiwgYTIpLCBDID0gcChyMSwgYTIpLCBEID0gcChyMSwgYTEpOwogICAgcmV0dXJuICdNJyArIEFbMF0gKyAnICcgKyBBWzFdICsgJyBBJyArIHIyICsgJyAnICsgcjIgKyAnIDAgMCAxICcgKyBCWzBdICsgJyAnICsgQlsxXSArICcgTCcgKyBDWzBdICsgJyAnICsgQ1sxXSArICcgQScgKyByMSArICcgJyArIHIxICsgJyAwIDAgMCAnICsgRFswXSArICcgJyArIERbMV0gKyAnIFonOwogIH0KICBmdW5jdGlvbiBkcmF3Q2lyY2xlKCkgewogICAgdmFyIGVsID0gSy5zdmcoNDAwLCA0MDAsICdjbXgtY29mc3ZnJyk7CiAgICB2YXIgZmFtID0ge307IFtzdGF0ZS5pLCAoc3RhdGUuaSArIDEpICUgMTIsIChzdGF0ZS5pICsgMTEpICUgMTJdLmZvckVhY2goZnVuY3Rpb24gKGspIHsgZmFtW2tdID0gMTsgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHsKICAgICAgdmFyIGExID0gKGkgLSAwLjUpICogTWF0aC5QSSAvIDYsIGEyID0gKGkgKyAwLjUpICogTWF0aC5QSSAvIDYsIG1pZCA9IGkgKiBNYXRoLlBJIC8gNjsKICAgICAgdmFyIHNlbE1haiA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgJiYgaSA9PT0gc3RhdGUuaSwgc2VsTWluID0gc3RhdGUubW9kZSA9PT0gJ21pbm9yJyAmJiBpID09PSBzdGF0ZS5pOwogICAgICAoZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgcG0gPSBTKCdwYXRoJywgeyBkOiBhcmMoMTI4LCAxOTYsIGExLCBhMiksIGZpbGw6IHNlbE1haiA_ICcjMDQ3N0JGJyA6IGZhbVtpXSA_ICcjZDZlYWY4JyA6ICcjZmZmJywgc3Ryb2tlOiAnI2NiZDVlMScsICdzdHJva2Utd2lkdGgnOiAxLjIsICdjbGFzcyc6ICdzZWcnLCB0YWJpbmRleDogMCwgcm9sZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogcHJldHR5KE1BSltpXSkgKyAnIG1ham9yJyB9LCBlbCk7CiAgICAgICAgdmFyIHBuID0gUygncGF0aCcsIHsgZDogYXJjKDc4LCAxMjgsIGExLCBhMiksIGZpbGw6IHNlbE1pbiA_ICcjRjJCMjMzJyA6IGZhbVtpXSA_ICcjZmRmMGNmJyA6ICcjZjhmYWZjJywgc3Ryb2tlOiAnI2NiZDVlMScsICdzdHJva2Utd2lkdGgnOiAxLjIsICdjbGFzcyc6ICdzZWcnLCB0YWJpbmRleDogMCwgcm9sZTogJ2J1dHRvbicsICdhcmlhLWxhYmVsJzogcHJldHR5KE1JTltpXSkgKyAnIG1pbm9yJyB9LCBlbCk7CiAgICAgICAgZnVuY3Rpb24gcGljayhtb2RlKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHN0YXRlLmkgPSBpOyBzdGF0ZS5tb2RlID0gbW9kZTsgc3RhdGUuYWx0ID0gZmFsc2U7IHJlbmRlcigpOyBwbGF5UHJvZyh0cnVlKTsgfTsgfQogICAgICAgIHBtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGljaygnbWFqb3InKSk7IHBuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGljaygnbWlub3InKSk7CiAgICAgICAgW1twbSwgJ21ham9yJ10sIFtwbiwgJ21pbm9yJ11dLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgeFswXS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBwaWNrKHhbMV0pKCk7IH0gfSk7IH0pOwogICAgICB9KShpKTsKICAgICAgdmFyIHIxID0gMTYyLCByMiA9IDEwMywgc3ggPSBNYXRoLnNpbihtaWQpLCBzeSA9IC1NYXRoLmNvcyhtaWQpOwogICAgICB2YXIgbWFqTGFiID0gcHJldHR5KE1BSltpXSkgKyAoTUFKX0FMVFtpXSA_ICcvJyArIHByZXR0eShNQUpfQUxUW2ldKSA6ICcnKTsKICAgICAgUygndGV4dCcsIHsgeDogQ1ggKyByMSAqIHN4LCB5OiBDWSArIHIxICogc3kgKyA2LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IE1BSl9BTFRbaV0gPyAxNSA6IDE5LCAnZm9udC13ZWlnaHQnOiA4MDAsIGZpbGw6IHNlbE1haiA_ICcjZmZmJyA6ICcjMUEyMDJDJywgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnLCAnY2xhc3MnOiAnbGFiJyB9LCBlbCwgbWFqTGFiKTsKICAgICAgdmFyIG1pbkxhYiA9IHByZXR0eShNSU5baV0pLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXi4vLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KSArICdtJzsKICAgICAgaWYgKE1JTl9BTFRbaV0gPT09ICdFYicpIG1pbkxhYiA9ICdE4pmvbS9F4pmtbSc7CiAgICAgIFMoJ3RleHQnLCB7IHg6IENYICsgcjIgKiBzeCwgeTogQ1kgKyByMiAqIHN5ICsgNSwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiBtaW5MYWIubGVuZ3RoID4gNCA_IDEwLjUgOiAxNCwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiBzZWxNaW4gPyAnIzFBMjAyQycgOiAnIzMzNDE1NScsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsIG1pbkxhYik7CiAgICAgIHZhciBzZyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCAtNSwgLTQsIC0zLCAtMiwgLTFdW2ldOwogICAgICBTKCd0ZXh0JywgeyB4OiBDWCArIDY0ICogc3gsIHk6IENZICsgNjQgKiBzeSArIDQsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTAuNSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzk0YTNiOCcsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsIHNnID09PSAwID8gJzAnIDogc2cgPiAwID8gc2cgKyAn4pmvJyA6ICgtc2cpICsgJ-KZrScpOwogICAgfQogICAgUygnY2lyY2xlJywgeyBjeDogQ1gsIGN5OiBDWSwgcjogNDQsIGZpbGw6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICBTKCd0ZXh0JywgeyB4OiBDWCwgeTogQ1kgLSAyLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA4MDAsIGZpbGw6ICcjRjJCMjMzJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsICdDSVJDTEUnKTsKICAgIFMoJ3RleHQnLCB7IHg6IENYLCB5OiBDWSArIDEzLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEwLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjZmZmJywgJ2NsYXNzJzogJ2xhYicgfSwgZWwsICdPRiBGSUZUSFMnKTsKICAgIHJldHVybiBlbDsKICB9CiAgLyogLS0tLS0tLS0tLSBrZXkgc2lnbmF0dXJlIHN0YWZmIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhY2MoZWwsIHgsIHksIHNoYXJwKSB7CiAgICBpZiAoc2hhcnApIHsKICAgICAgUygnbGluZScsIHsgeDE6IHggLSAyLjUsIHkxOiB5IC0gMTAsIHgyOiB4IC0gMi41LCB5MjogeSArIDExLCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEuNCB9LCBlbCk7CiAgICAgIFMoJ2xpbmUnLCB7IHgxOiB4ICsgMi41LCB5MTogeSAtIDExLCB4MjogeCArIDIuNSwgeTI6IHkgKyAxMCwgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAxLjQgfSwgZWwpOwogICAgICBTKCdsaW5lJywgeyB4MTogeCAtIDYsIHkxOiB5IC0gMi41LCB4MjogeCArIDYsIHkyOiB5IC0gNSwgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAzIH0sIGVsKTsKICAgICAgUygnbGluZScsIHsgeDE6IHggLSA2LCB5MTogeSArIDQuNSwgeDI6IHggKyA2LCB5MjogeSArIDIsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMyB9LCBlbCk7CiAgICB9IGVsc2UgewogICAgICBTKCdsaW5lJywgeyB4MTogeCAtIDMsIHkxOiB5IC0gMTYsIHgyOiB4IC0gMywgeTI6IHkgKyA1LCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEuNiB9LCBlbCk7CiAgICAgIFMoJ3BhdGgnLCB7IGQ6ICdNJyArICh4IC0gMykgKyAnICcgKyAoeSAtIDEpICsgJyBDICcgKyAoeCArIDYpICsgJyAnICsgKHkgLSA3KSArICcgJyArICh4ICsgOCkgKyAnICcgKyAoeSArIDEpICsgJyAnICsgKHggLSAzKSArICcgJyArICh5ICsgNSksIGZpbGw6ICdub25lJywgc3Ryb2tlOiAnIzFBMjAyQycsICdzdHJva2Utd2lkdGgnOiAyLjQgfSwgZWwpOwogICAgfQogIH0KICBmdW5jdGlvbiBzdGFmZihzaWcpIHsKICAgIHZhciBlbCA9IEsuc3ZnKDI2MCwgOTYsICdjbXgtc3RhZmYnKSwgdG9wID0gMjQsIGcgPSAxMCwgeDAgPSA4OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIFMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHRvcCArIGkgKiBnLCB4MjogMjUyLCB5MjogdG9wICsgaSAqIGcsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS4yIH0sIGVsKTsKICAgIEsudHJlYmxlQ2xlZihlbCwgeDAgKyA2LCB0b3AgKyAzICogZywgZyk7CiAgICB2YXIgYm90dG9tID0gdG9wICsgNCAqIGcsIHBvc1MgPSBbOCwgNSwgOSwgNiwgMywgNywgNF0sIHBvc0YgPSBbNCwgNywgMywgNiwgMiwgNSwgMV07CiAgICB2YXIgbiA9IE1hdGguYWJzKHNpZyk7CiAgICBmb3IgKHZhciBrID0gMDsgayA8IG47IGsrKykgewogICAgICB2YXIgc3RlcCA9IHNpZyA-IDAgPyBwb3NTW2tdIDogcG9zRltrXTsKICAgICAgYWNjKGVsLCA2NiArIGsgKiAxNiwgYm90dG9tIC0gc3RlcCAqIChnIC8gMikgKyAwLCBzaWcgPiAwKTsKICAgIH0KICAgIHJldHVybiBlbDsKICB9CiAgdmFyIGVscyA9IHt9OwogIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgIHRyeSB7IGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCAnI2tleT0nICsgdG9uaWNOYW1lKCkgKyAoc3RhdGUubW9kZSA9PT0gJ21pbm9yJyA_ICdtJyA6ICcnKSk7IH0gY2F0Y2ggKGUpIHt9CiAgICBlbHMuY2lyYy5pbm5lckhUTUwgPSAnJzsgZWxzLmNpcmMuYXBwZW5kQ2hpbGQoZHJhd0NpcmNsZSgpKTsKICAgIHZhciB0ID0gdG9uaWNOYW1lKCksIHNpZyA9IHNpZ09mKCksIG4gPSBNYXRoLmFicyhzaWcpOwogICAgdmFyIG1hak5hbWUgPSBzdGF0ZS5tb2RlID09PSAnbWFqb3InID8gdCA6IChzdGF0ZS5hbHQgJiYgTUFKX0FMVFtzdGF0ZS5pXSA_IE1BSl9BTFRbc3RhdGUuaV0gOiBNQUpbc3RhdGUuaV0pOwogICAgdmFyIG1pbk5hbWUgPSBzdGF0ZS5tb2RlID09PSAnbWlub3InID8gdCA6IChzdGF0ZS5hbHQgJiYgTUlOX0FMVFtzdGF0ZS5pXSA_IE1JTl9BTFRbc3RhdGUuaV0gOiBNSU5bc3RhdGUuaV0pOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcHJldHR5KHQpICsgKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnIG1ham9yJyA6ICcgbWlub3InKTsKICAgIHZhciBhY2NzID0gc2lnID09PSAwID8gJ05vIHNoYXJwcyBvciBmbGF0cycgOiAoc2lnID4gMCA_IFNIQVJQUy5zbGljZSgwLCBuKS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggKyAn4pmvJzsgfSkgOiBGTEFUUy5zbGljZSgwLCBuKS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggKyAn4pmtJzsgfSkpLmpvaW4oJyAgJyk7CiAgICBlbHMuc2lnLnRleHRDb250ZW50ID0gc2lnID09PSAwID8gJ05vIHNoYXJwcyBvciBmbGF0cycgOiBuICsgKHNpZyA-IDAgPyAobiA-IDEgPyAnIHNoYXJwcycgOiAnIHNoYXJwJykgOiAobiA-IDEgPyAnIGZsYXRzJyA6ICcgZmxhdCcpKTsKICAgIGVscy5hY2NzLnRleHRDb250ZW50ID0gc2lnID09PSAwID8gJycgOiBhY2NzOwogICAgZWxzLnN0YWZmLmlubmVySFRNTCA9ICcnOyBlbHMuc3RhZmYuYXBwZW5kQ2hpbGQoc3RhZmYoc2lnKSk7CiAgICBlbHMucmVsLnRleHRDb250ZW50ID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_ICdSZWxhdGl2ZSBtaW5vcjogJyArIHByZXR0eShtaW5OYW1lKSArICcgbWlub3InIDogJ1JlbGF0aXZlIG1ham9yOiAnICsgcHJldHR5KG1hak5hbWUpICsgJyBtYWpvcic7CiAgICB2YXIgYWx0cyA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUpfQUxUIDogTUlOX0FMVCwgbGlzdCA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBNQUogOiBNSU47CiAgICBlbHMuZW5oLmlubmVySFRNTCA9ICcnOwogICAgaWYgKGFsdHNbc3RhdGUuaV0pIHsKICAgICAgdmFyIG90aGVyID0gc3RhdGUuYWx0ID8gbGlzdFtzdGF0ZS5pXSA6IGFsdHNbc3RhdGUuaV07CiAgICAgIGVscy5lbmguYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gZ2hvc3Qgc20nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHN0YXRlLmFsdCA9ICFzdGF0ZS5hbHQ7IHJlbmRlcigpOyB9IH0sIFsnU2FtZSBzb3VuZCwgb3RoZXIgc3BlbGxpbmc6ICcgKyBwcmV0dHkob3RoZXIpICsgKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnIG1ham9yJyA6ICcgbWlub3InKV0pKTsKICAgIH0KICAgIHZhciB0biA9IEsucGFyc2VOb3RlKHQpLCBJVm4gPSBLLnNwZWxsKHRuLmwgKyAzLCB0bi5wYyArIDUpLm5hbWUsIFZuID0gSy5zcGVsbCh0bi5sICsgNCwgdG4ucGMgKyA3KS5uYW1lOwogICAgdmFyIG5iID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IFtJVm4gKyAnIG1ham9yIChJViknLCBWbiArICcgbWFqb3IgKFYpJ10gOiBbSVZuICsgJyBtaW5vciAoaXYpJywgVm4gKyAnIG1pbm9yICh2KSddOwogICAgZWxzLm5icnMudGV4dENvbnRlbnQgPSAnTmVpZ2hib3JzOiAnICsgbmIuam9pbignIMK3ICcpOwogICAgZWxzLmNob3Jkcy5pbm5lckhUTUwgPSAnJzsKICAgIGNob3JkcygpLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgZWxzLmNob3Jkcy5hcHBlbmRDaGlsZChoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWNob3JkJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBLLnBsYXkobWlkaUNob3JkKGMpLCAnYmxvY2snKTsgfSB9LCBbaCgnYicsIHsgdGV4dDogYy5uYW1lIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogYy5yb21hbiB9KV0pKTsKICAgIH0pOwogICAgZWxzLnNjYWxlLnRleHRDb250ZW50ID0gc2NhbGVOb3RlcygpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5uYW1lOyB9KS5qb2luKCcg4oCTICcpOwogIH0KICBmdW5jdGlvbiBwbGF5U2NhbGUoKSB7CiAgICB2YXIgbnMgPSBzY2FsZU5vdGVzKCksIGJhc2UgPSA2MCArIG5zWzBdLnBjOyBpZiAoYmFzZSA-IDY2KSBiYXNlIC09IDEyOwogICAgdmFyIHNjID0gc3RhdGUubW9kZSA9PT0gJ21ham9yJyA_IE1BSl9TQ0FMRSA6IE1JTl9TQ0FMRTsKICAgIEsucGxheShzYy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGJhc2UgKyB4OyB9KS5jb25jYXQoW2Jhc2UgKyAxMl0pLCAndXAnLCB7IHN0ZXA6IDAuMjgsIGR1cjogMC42IH0pOwogIH0KICBmdW5jdGlvbiBwbGF5UHJvZyhzaG9ydCkgewogICAgdmFyIGNzID0gY2hvcmRzKCksIGFjID0gSy5jdHgoKTsgaWYgKCFhYykgcmV0dXJuOwogICAgdmFyIHNlcSA9IHNob3J0ID8gWzBdIDogKHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyBbMCwgMywgNCwgMF0gOiBbMCwgMywgNCwgMF0pOwogICAgc2VxLmZvckVhY2goZnVuY3Rpb24gKGQsIGspIHsKICAgICAgdmFyIGMgPSBjc1tkXTsKICAgICAgaWYgKCFzaG9ydCAmJiBzdGF0ZS5tb2RlID09PSAnbWlub3InICYmIGQgPT09IDQpIGMgPSB7IHJvb3Q6IGMucm9vdCwgdGhpcmQ6IDQsIGZpZnRoOiA3IH07CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBLLnBsYXkobWlkaUNob3JkKGMpLCAnc3RydW0nKTsgfSwgayAqIDcwMCk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gYnVpbGQoKSB7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgZWxzLmNpcmMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2lyYycgfSk7CiAgICBlbHMudGl0bGUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtYmlnJyB9KTsKICAgIGVscy5zaWcgPSBoKCdiJyk7IGVscy5hY2NzID0gaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1hY2NzJyB9KTsKICAgIGVscy5zdGFmZiA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdGFmZndyYXAnIH0pOwogICAgZWxzLnJlbCA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtcmVsJyB9KTsgZWxzLmVuaCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1lbmgnIH0pOyBlbHMubmJycyA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtcmVsJyB9KTsKICAgIGVscy5jaG9yZHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hvcmRyb3cnIH0pOyBlbHMuc2NhbGUgPSBoKCdiJyk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkIGNteC1jb2ZncmlkJyB9LCBbCiAgICAgIGgoJ2RpdicsIHt9LCBbZWxzLmNpcmMsIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtaGludCcsIHRleHQ6ICdUYXAgdGhlIG91dGVyIHJpbmcgZm9yIG1ham9yIGtleXMsIHRoZSBpbm5lciByaW5nIGZvciBtaW5vciBrZXlzLicgfSldKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWtleXBhbmVsJyB9LCBbCiAgICAgICAgZWxzLnRpdGxlLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zaWdyb3cnIH0sIFtlbHMuc2lnLCBlbHMuYWNjc10pLAogICAgICAgIGVscy5zdGFmZiwgZWxzLnJlbCwgZWxzLmVuaCwgZWxzLm5icnMsCiAgICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnU2NhbGUnIH0pLCBoKCdwJywgeyAnY2xhc3MnOiAnY214LXNjYWxlJyB9LCBbZWxzLnNjYWxlXSksCiAgICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnQ2hvcmRzIGluIHRoaXMga2V5ICh0YXAgdG8gaGVhciknIH0pLCBlbHMuY2hvcmRzLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wbGF5JyB9LCBbCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogcGxheVNjYWxlIH0sIFsn4pa2IFBsYXkgc2NhbGUnXSksCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgcGxheVByb2coZmFsc2UpOyB9IH0sIFtzdGF0ZS5tb2RlID09PSAnbWFqb3InID8gJ0kg4oCTIElWIOKAkyBWIOKAkyBJJyA6ICdpIOKAkyBpdiDigJMgViDigJMgaSddKQogICAgICAgIF0pCiAgICAgIF0pCiAgICBdKSk7CiAgICByZW5kZXIoKTsKICAgIHZhciBvYnMgPSByb290LnF1ZXJ5U2VsZWN0b3IoJy5jbXgtcGxheSAuZ2hvc3QnKTsKICAgIHZhciBvcmlnID0gcmVuZGVyOwogICAgcmVuZGVyID0gZnVuY3Rpb24gKCkgeyBvcmlnKCk7IG9icy50ZXh0Q29udGVudCA9IHN0YXRlLm1vZGUgPT09ICdtYWpvcicgPyAnSSDigJMgSVYg4oCTIFYg4oCTIEknIDogJ2kg4oCTIGl2IOKAkyBWIOKAkyBpJzsgfTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">How to Read and Use a Circle of Fifths Chart for Music Theory Success</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1650</post-id>	</item>
		<item>
		<title>Guitar Music Theory: The 19 Three-Note Pitch Class Sets</title>
		<link>https://www.cantonmusicacademy.com/three-note-pitch-classes/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Sun, 01 Jun 2025 13:10:54 +0000</pubDate>
				<category><![CDATA[Music Lessons]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1510</guid>

					<description><![CDATA[<p>Understanding the foundations of music theory can transform your guitar playing. One of those foundations is the three-note pitch class set: the building block of triads, shell voicings and scale fragments. Pick any of the 19 sets below to see its shape on the pitch-class clock, hear it, transpose it and find it on the...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/three-note-pitch-classes/">Guitar Music Theory: The 19 Three-Note Pitch Class Sets</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Three-Note Pitch Classes (interactive)
  URL stays the same: /three-note-pitch-classes/
  WHERE: Posts → edit the post → delete ALL old blocks (including the old
  image) → add ONE "Custom HTML" block → paste everything below → Update →
  Delete Cache.
  Post title (H1):        Guitar Music Theory: The 19 Three-Note Pitch Class Sets
  Yoast SEO title:        The 19 Three-Note Pitch Class Sets (Interactive) | Canton Music Academy
  Yoast meta description: Every three-note chord fits one of 19 shapes. See, hear and transpose all 19 on a pitch-class clock, find their mirror images and play them on guitar.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-grow{flex:1}
.cmx-step .cmx-chips{margin-left:auto}
.cmx-glbl{margin:12px 0 6px}
.cmx-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:8px}
.cmx-tile{font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:2px;background:#fff;border:1.5px solid var(--line);border-radius:14px;padding:8px 4px 9px;cursor:pointer;min-width:0;text-align:center;transition:all .12s}
.cmx-tile svg{width:52px;height:52px}
.cmx-tile b{font-size:.78rem;line-height:1.2;color:var(--ink)}
.cmx-tile small{font-size:.66rem;color:var(--mut);font-weight:700}
.cmx-tile:hover{border-color:var(--b)}
.cmx-tile.on{background:#eaf4fb;border-color:var(--b);box-shadow:0 0 0 2px var(--b)}
.cmx-tile:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-famnote{margin:4px 0 10px!important;color:var(--mut)!important;font-size:.88rem!important;font-weight:600}
.cmx-fams{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px}
.cmx-fam{border:1.5px dashed var(--line);border-radius:16px;padding:8px}
.cmx-fam.pair{border-color:#c4b5fd;background:#faf7ff}
.cmx-famhead{display:block;font-size:.66rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);margin:0 0 6px 4px}
.cmx-fam.pair .cmx-famhead{color:#7c3aed}
.cmx-famtiles{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.cmx-desc{margin:-6px 0 14px!important;color:var(--ink)!important;font-weight:600;font-size:.98rem!important}
.cmx-clockwrap svg{display:block;width:100%;max-width:300px;height:auto;margin:0 auto}
.cmx-cdot:hover circle{filter:brightness(1.1)}
.cmx-turn{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:6px}
.cmx-turn span{font-size:.74rem;font-weight:700;color:var(--mut)}
.cmx-btn.sm{padding:7px 14px;min-height:36px;font-size:.82rem}
.cmx-facts{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.cmx-fact{background:var(--soft);border-radius:12px;padding:8px 10px}
.cmx-fact span{display:block;font-size:.66rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut)}
.cmx-fact b{font-size:1.02rem}
.cmx-mirror{margin-top:12px;background:#faf7ff;border-left:5px solid #7c3aed;border-radius:14px;padding:12px 16px}
.cmx-mirror p{margin:0 0 8px!important;font-size:.95rem!important}
.cmx-shapes{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:0 0 18px}
.cmx-shape{font-family:inherit;display:flex;flex-direction:column;align-items:center;background:#fff;border:1.5px solid var(--line);border-radius:14px;padding:8px 4px;cursor:pointer;min-width:0}
.cmx-shape:hover{border-color:var(--b)}
.cmx-shape svg{width:100%;max-width:150px;height:auto}
.cmx-shead{font-size:.7rem;font-weight:800;color:var(--ink)}
.cmx-shape small{font-size:.68rem;color:var(--b);font-weight:700}
.cmx-fbhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-byline{color:var(--mut)!important;font-style:italic}
@media (max-width:640px){
  .cmx-tiles{grid-template-columns:repeat(3,1fr);gap:6px}
  .cmx-tile b{font-size:.7rem}
  .cmx-shapes{grid-template-columns:repeat(2,1fr)}
  .cmx-step{flex-wrap:wrap}
  .cmx-step .cmx-chips{margin-left:0;width:100%}
}

</style>

<div class="cmx">

<p class="cmx-lead">Understanding the foundations of music theory can transform your guitar playing. One of those foundations is the three-note pitch class set: the building block of triads, shell voicings and scale fragments. Pick any of the 19 sets below to see its shape on the pitch-class clock, hear it, transpose it and find it on the fretboard.</p>

<div class="cmx-tool" id="cmx-pc"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the pitch class explorer…</p></div>

<h2>What Are Three-Note Pitch Classes?</h2>
<p>A <b>pitch class</b> is every note with the same name, in any octave. Every C on the guitar, from the 5th string, 3rd fret to the 1st string, 8th fret, is the same pitch class. A <b>three-note pitch class set</b> is any group of three different pitch classes, like C, E and G.</p>
<p>Lay the 12 notes around a clock and every three-note set becomes a triangle. Moving the triangle around the clock is <b>transposition</b>: C major becomes D♭ major, D major and so on, but the shape never changes. That&#8217;s why the shape, not the note names, tells you what kind of sound you have.</p>

<h2>Why There Are Exactly 19</h2>
<p>There are 220 ways to choose three notes out of twelve. Group together every set that&#8217;s just a transposition of another and you&#8217;re left with exactly <b>19 unique shapes</b>. Every three-note chord or melody fragment you&#8217;ll ever play is one of them.</p>
<p>Music theorists often go one step further and also treat a set and its <b>mirror image</b> (its inversion) as the same. Flip a major triad upside down and you get a minor triad, so major and minor become one family. Counted that way, the 19 shrink to <b>12 families</b>. Switch the tool to &#8220;Mirror families&#8221; to see the pairs, or tap &#8220;Show mirror&#8221; on the clock.</p>

<h2>The 19 Three-Note Pitch Class Sets</h2>
<figure class="wp-block-table"><table><thead><tr><th>Set</th><th>On C</th><th>Mirror partner</th></tr></thead><tbody>
<tr><td>Major triad (1-3-5)</td><td>C E G</td><td>Minor triad</td></tr>
<tr><td>Minor triad (1-♭3-5)</td><td>C E♭ G</td><td>Major triad</td></tr>
<tr><td>Diminished triad (1-♭3-♭5)</td><td>C E♭ G♭</td><td>Itself</td></tr>
<tr><td>Augmented triad (1-3-♯5)</td><td>C E G♯</td><td>Itself</td></tr>
<tr><td>Suspended 4th (1-4-5)</td><td>C F G</td><td>Itself</td></tr>
<tr><td>Suspended ♭2 (1-♭2-5)</td><td>C D♭ G</td><td>Suspended ♯4</td></tr>
<tr><td>Suspended ♯4 (1-♯4-5)</td><td>C F♯ G</td><td>Suspended ♭2</td></tr>
<tr><td>Major 7 no 5 (1-3-7)</td><td>C E B</td><td>1-3-4</td></tr>
<tr><td>Minor 7 no 5 (1-♭3-♭7)</td><td>C E♭ B♭</td><td>1-♭3-4</td></tr>
<tr><td>Dominant 7 no 5 (1-3-♭7)</td><td>C E B♭</td><td>1-3-♯4</td></tr>
<tr><td>1-3-4 (major scale)</td><td>C E F</td><td>Major 7 no 5</td></tr>
<tr><td>1-♭3-4 (minor scale)</td><td>C E♭ F</td><td>Minor 7 no 5</td></tr>
<tr><td>1-3-♯4 (Lydian)</td><td>C E F♯</td><td>Dominant 7 no 5</td></tr>
<tr><td>1-2-3 (major scale)</td><td>C D E</td><td>Itself</td></tr>
<tr><td>1-2-♭3 (minor scale)</td><td>C D E♭</td><td>1-♭2-♭3</td></tr>
<tr><td>1-♭2-♭3 (Phrygian)</td><td>C D♭ E♭</td><td>1-2-♭3</td></tr>
<tr><td>1-♭2-2 (chromatic)</td><td>C D♭ D</td><td>Itself</td></tr>
<tr><td>1-♭2-3 (Phrygian dominant)</td><td>C D♭ E</td><td>1-♭3-3</td></tr>
<tr><td>1-♭3-3 (blues)</td><td>C E♭ E</td><td>1-♭2-3</td></tr>
</tbody></table></figure>
<p>Some pairs are surprising. A major 7th shell (C E B) and the 1-3-4 fragment (C E F) don&#8217;t look related, but on the clock one is the other flipped over. Try it in the tool.</p>

<h2>Applying Three-Note Pitch Classes to Guitar</h2>
<p>On guitar, any three-note set can be played on three adjacent strings. The tool finds a compact shape on each string set, so you can hear how the same set sounds in different registers. Some examples:</p>
<ul>
<li><b>Major triad (C E G):</b> open position, barre chords or small three-string triads anywhere on the neck.</li>
<li><b>Minor triad (A C E):</b> open A minor or movable shapes.</li>
<li><b>Diminished triad (B D F):</b> a passing chord that builds tension.</li>
<li><b>Dominant 7 no 5 (G B F):</b> the classic jazz and blues shell voicing.</li>
</ul>
<p>Practicing these sets across the fretboard builds a deeper understanding of chord construction and voice leading. Use the fretboard map to see every place the three notes live, and switch between degrees and note names.</p>

<h2>Why This Matters for Guitarists</h2>
<ul>
<li><b>Improvisation:</b> recognize chord tones and target them in your solos.</li>
<li><b>Composition:</b> build progressions and melodies with intentional harmonic color.</li>
<li><b>Harmony:</b> analyze songs and hear what&#8217;s underneath the chord symbols.</li>
</ul>
<p>Knowing that there are only 19 shapes turns the fretboard from a sea of notes into a short list of patterns you can learn, hear and use.</p>

<h2>Pitch Class FAQ</h2>
<details><summary>What is the difference between a pitch and a pitch class?</summary><p>A pitch is one specific note, like middle C. A pitch class is all the C&#8217;s in every octave together. Pitch class sets ignore octave and order, so C E G, E G C and a spread-out C major chord are all the same set.</p></details>
<details><summary>What is a Forte number?</summary><p>Allen Forte catalogued every pitch class set. Three-note sets are numbered 3-1 to 3-12, one per mirror family. &#8220;A&#8221; and &#8220;B&#8221; mark the two mirror images in a pair, so the major triad is 3-11B and the minor triad is 3-11A.</p></details>
<details><summary>What is prime form?</summary><p>Prime form is a set written in its most compact version, starting on 0. Major and minor triads share the prime form (0 3 7), because they belong to the same mirror family.</p></details>
<details><summary>Why are there only 4 augmented triads?</summary><p>The augmented triad splits the octave into three equal major 3rds, so moving it up a major 3rd gives back the same notes. C augmented, E augmented and G♯ augmented all contain C, E and G♯.</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>Keep exploring with our <a href="https://www.cantonmusicacademy.com/chord-calculator/">chord calculator</a>, the <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">interactive circle of fifths</a> and <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">modes</a>. For a full breakdown of scales, chords and theory, see our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Music Theory Guide</a>, or take <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">guitar lessons at Canton Music Academy</a>. Book online in 3 easy steps!</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogVGhyZWUtbm90ZSBwaXRjaCBjbGFzc2VzIOKAlCB0cmljaG9yZCBleHBsb3JlciBvbiBhIHBpdGNoLWNsYXNzIGNsb2NrLiBVc2VzIHdpbmRvdy5DTUsgKi8KKGZ1bmN0aW9uICgpIHsKICAndXNlIHN0cmljdCc7CiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY214LXBjJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JykpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScsICcxJyk7CiAgdmFyIEsgPSB3aW5kb3cuQ01LLCBoID0gSy5oLCBTID0gSy5zdmdFbDsKICB2YXIgR1JPVVBTID0gWydUcmlhZHMnLCAnU3VzcGVuZGVkJywgJzd0aCBzaGVsbHMgKG5vIDV0aCknLCAnU2NhbGUgZnJhZ21lbnRzJ107CiAgLyogdDogW2RlZ3JlZSwgc2VtaXRvbmVzXSBmb3IgdGhlIHR3byBub3RlcyBhYm92ZSB0aGUgcm9vdCAqLwogIHZhciBTRVRTID0gWwogICAgeyBpZDogJ21haicsIG46ICdNYWpvciB0cmlhZCcsIGc6IDAsIHQ6IFtbMywgNF0sIFs1LCA3XV0sIGQ6ICdUaGUgZm91bmRhdGlvbiBvZiBXZXN0ZXJuIGhhcm1vbnk6IGJyaWdodCBhbmQgc3RhYmxlLicgfSwKICAgIHsgaWQ6ICdtaW4nLCBuOiAnTWlub3IgdHJpYWQnLCBnOiAwLCB0OiBbWzMsIDNdLCBbNSwgN11dLCBkOiAnRGFya2VyIGFuZCBtb3JlIGlud2FyZCB0aGFuIG1ham9yLicgfSwKICAgIHsgaWQ6ICdkaW0nLCBuOiAnRGltaW5pc2hlZCB0cmlhZCcsIGc6IDAsIHQ6IFtbMywgM10sIFs1LCA2XV0sIGQ6ICdUd28gc3RhY2tlZCBtaW5vciAzcmRzLiBVbnN0YWJsZSwgaXQgd2FudHMgdG8gcmVzb2x2ZS4nIH0sCiAgICB7IGlkOiAnYXVnJywgbjogJ0F1Z21lbnRlZCB0cmlhZCcsIGc6IDAsIHQ6IFtbMywgNF0sIFs1LCA4XV0sIGQ6ICdUd28gc3RhY2tlZCBtYWpvciAzcmRzIHRoYXQgc3BsaXQgdGhlIG9jdGF2ZSBpbnRvIHRocmVlIGVxdWFsIHBhcnRzLCBzbyB0aGVyZSBhcmUgb25seSA0IGRpZmZlcmVudCBhdWdtZW50ZWQgdHJpYWRzLicgfSwKICAgIHsgaWQ6ICdzdXM0JywgbjogJ1N1c3BlbmRlZCA0dGgnLCBnOiAxLCB0OiBbWzQsIDVdLCBbNSwgN11dLCBkOiAnT3BlbiBhbmQgdW5yZXNvbHZlZC4gU2FtZSBub3RlcyBhcyBhIHN1czIgY2hvcmQgYSA0dGggaGlnaGVyIChDc3VzNCA9IEZzdXMyKS4nIH0sCiAgICB7IGlkOiAnc3VzYjInLCBuOiAnU3VzcGVuZGVkIOKZrTInLCBnOiAxLCB0OiBbWzIsIDFdLCBbNSwgN11dLCBkOiAnRGFyayBhbmQgdGVuc2U7IGhlYXJkIGluIFBocnlnaWFuIHNvdW5kcyBhbmQgbWV0YWwuJyB9LAogICAgeyBpZDogJ3N1cyM0JywgbjogJ1N1c3BlbmRlZCDima80JywgZzogMSwgdDogW1s0LCA2XSwgWzUsIDddXSwgZDogJ0x5ZGlhbiB0ZW5zaW9uOiB0aGUg4pmvNCBydWJzIGFnYWluc3QgdGhlIDV0aC4nIH0sCiAgICB7IGlkOiAnTTdubzUnLCBuOiAnTWFqb3IgNyAobm8gNSknLCBnOiAyLCB0OiBbWzMsIDRdLCBbNywgMTFdXSwgZDogJ0EgamF6eiBzaGVsbCB2b2ljaW5nLiBUaGUgM3JkIGFuZCA3dGggZGVmaW5lIHRoZSBjaG9yZC4nIH0sCiAgICB7IGlkOiAnbTdubzUnLCBuOiAnTWlub3IgNyAobm8gNSknLCBnOiAyLCB0OiBbWzMsIDNdLCBbNywgMTBdXSwgZDogJ1RoZSBtaW5vciA3dGggc2hlbGwgdm9pY2luZy4nIH0sCiAgICB7IGlkOiAnN25vNScsIG46ICdEb21pbmFudCA3IChubyA1KScsIGc6IDIsIHQ6IFtbMywgNF0sIFs3LCAxMF1dLCBkOiAnVGhlIGRvbWluYW50IHNoZWxsLiBJdHMgM3JkIGFuZCDima03IGZvcm0gYSB0cml0b25lIHRoYXQgd2FudHMgdG8gcmVzb2x2ZS4nIH0sCiAgICB7IGlkOiAnMTM0Jywgc3JjOiAnbWFqb3Igc2NhbGUnLCBuOiAnMS0zLTQnLCBnOiAzLCB0OiBbWzMsIDRdLCBbNCwgNV1dLCBkOiAnRnJvbSB0aGUgbWFqb3Igc2NhbGU7IHRoZSAzcmQgYW5kIDR0aCBzaXQgYSBoYWxmIHN0ZXAgYXBhcnQuJyB9LAogICAgeyBpZDogJzFiMzQnLCBzcmM6ICdtaW5vciBzY2FsZScsIG46ICcxLeKZrTMtNCcsIGc6IDMsIHQ6IFtbMywgM10sIFs0LCA1XV0sIGQ6ICdGcm9tIHRoZSBuYXR1cmFsIG1pbm9yIHNjYWxlIGFuZCB0aGUgbWlub3IgcGVudGF0b25pYy4nIH0sCiAgICB7IGlkOiAnMTMjNCcsIHNyYzogJ0x5ZGlhbicsIG46ICcxLTMt4pmvNCcsIGc6IDMsIHQ6IFtbMywgNF0sIFs0LCA2XV0sIGQ6ICdUaGUgTHlkaWFuIHNvdW5kOiBhIG1ham9yIDNyZCBwbHVzIHRoZSByYWlzZWQgNHRoLicgfSwKICAgIHsgaWQ6ICcxMjMnLCBzcmM6ICdtYWpvciBzY2FsZScsIG46ICcxLTItMycsIGc6IDMsIHQ6IFtbMiwgMl0sIFszLCA0XV0sIGQ6ICdUaGUgZmlyc3QgdGhyZWUgbm90ZXMgb2YgdGhlIG1ham9yIHNjYWxlLicgfSwKICAgIHsgaWQ6ICcxMmIzJywgc3JjOiAnbWlub3Igc2NhbGUnLCBuOiAnMS0yLeKZrTMnLCBnOiAzLCB0OiBbWzIsIDJdLCBbMywgM11dLCBkOiAnVGhlIGZpcnN0IHRocmVlIG5vdGVzIG9mIHRoZSBuYXR1cmFsIG1pbm9yIHNjYWxlLicgfSwKICAgIHsgaWQ6ICcxYjJiMycsIHNyYzogJ1BocnlnaWFuJywgbjogJzEt4pmtMi3ima0zJywgZzogMywgdDogW1syLCAxXSwgWzMsIDNdXSwgZDogJ1RoZSBmaXJzdCB0aHJlZSBub3RlcyBvZiB0aGUgUGhyeWdpYW4gbW9kZS4nIH0sCiAgICB7IGlkOiAnMWIyMicsIHNyYzogJ2Nocm9tYXRpYycsIG46ICcxLeKZrTItMicsIGc6IDMsIHQ6IFtbMiwgMV0sIFsyLCAyXV0sIGQ6ICdUaHJlZSBoYWxmIHN0ZXBzIGluIGEgcm93LCB0aGUgdGlnaHRlc3QgY2x1c3RlciBwb3NzaWJsZS4nIH0sCiAgICB7IGlkOiAnMWIyMycsIHNyYzogJ1BocnlnaWFuIGRvbWluYW50JywgbjogJzEt4pmtMi0zJywgZzogMywgdDogW1syLCAxXSwgWzMsIDRdXSwgZDogJ1RoZSBvcGVuaW5nIG9mIHRoZSBQaHJ5Z2lhbiBkb21pbmFudCBhbmQgZG91YmxlIGhhcm1vbmljIHNjYWxlcy4nIH0sCiAgICB7IGlkOiAnMWIzMycsIHNyYzogJ2JsdWVzJywgbjogJzEt4pmtMy0zJywgZzogMywgdDogW1szLCAzXSwgWzMsIDRdXSwgZDogJ01pbm9yIGFuZCBtYWpvciAzcmQgdG9nZXRoZXI6IHRoZSBibHVlc3kg4oCc4pmvOeKAnSBjbGFzaC4nIH0KICBdOwogIHZhciBST09UUyA9IFsnQycsICdEYicsICdEJywgJ0ViJywgJ0UnLCAnRicsICdGIycsICdHJywgJ0FiJywgJ0EnLCAnQmInLCAnQiddOwogIHZhciBDTE9DSyA9IFsnQycsICdE4pmtJywgJ0QnLCAnReKZrScsICdFJywgJ0YnLCAnRuKZrycsICdHJywgJ0Hima0nLCAnQScsICdC4pmtJywgJ0InXTsKICB2YXIgRk9SVEUgPSB7ICcwMTInOiAxLCAnMDEzJzogMiwgJzAxNCc6IDMsICcwMTUnOiA0LCAnMDE2JzogNSwgJzAyNCc6IDYsICcwMjUnOiA3LCAnMDI2JzogOCwgJzAyNyc6IDksICcwMzYnOiAxMCwgJzAzNyc6IDExLCAnMDQ4JzogMTIgfTsKICB2YXIgVFVOID0gSy5UVU5JTkdTLmd1aXRhciwgT1BFTiA9IFsnRScsICdBJywgJ0QnLCAnRycsICdCJywgJ0UnXTsKICB2YXIgUFVSUExFID0gJyM3YzNhZWQnOwoKICBmdW5jdGlvbiBwcmV0dHkobikgeyByZXR1cm4gbi5yZXBsYWNlKCcjJywgJ-KZrycpLnJlcGxhY2UoL2IkLywgJ-KZrScpOyB9CiAgZnVuY3Rpb24gc2VtaXMoc2V0KSB7IHJldHVybiBbMCwgc2V0LnRbMF1bMV0sIHNldC50WzFdWzFdXTsgfQogIGZ1bmN0aW9uIHNldEJ5SWQoaWQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBTRVRTLmxlbmd0aDsgaSsrKSBpZiAoU0VUU1tpXS5pZCA9PT0gaWQpIHJldHVybiBTRVRTW2ldOyByZXR1cm4gU0VUU1swXTsgfQogIGZ1bmN0aW9uIGxuYW1lKHNldCkgeyByZXR1cm4gc2V0Lm4uY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzZXQubi5zbGljZSgxKTsgfQogIGZ1bmN0aW9uIGZvcm11bGEoc2V0KSB7IHJldHVybiBbJzEnXS5jb25jYXQoc2V0LnQubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiBLLmRlZ3JlZUxhYmVsKHhbMF0sIHhbMV0pOyB9KSk7IH0KICAvKiBzaGFwZSBjbGFzcyB1bmRlciB0cmFuc3Bvc2l0aW9uOiBsb3dlc3Qgcm90YXRpb24gc3RhcnRpbmcgYXQgMCAqLwogIGZ1bmN0aW9uIHRuS2V5KHBjcykgewogICAgdmFyIGJlc3QgPSBudWxsOwogICAgcGNzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgdmFyIHggPSBwY3MubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiAocCAtIHQgKyAxMikgJSAxMjsgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pLmpvaW4oJywnKTsKICAgICAgaWYgKGJlc3QgPT09IG51bGwgfHwgeCA8IGJlc3QpIGJlc3QgPSB4OwogICAgfSk7CiAgICByZXR1cm4gYmVzdDsKICB9CiAgZnVuY3Rpb24gbm9ybWFsKHBjcykgewogICAgdmFyIHMgPSBwY3Muc2xpY2UoKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSksIGJlc3QgPSBudWxsOwogICAgZm9yICh2YXIgciA9IDA7IHIgPCAzOyByKyspIHsKICAgICAgdmFyIHJvdCA9IFtzW3JdLCBzWyhyICsgMSkgJSAzXSwgc1sociArIDIpICUgM11dLm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gKHAgLSBzW3JdICsgMTIpICUgMTI7IH0pOwogICAgICBpZiAoIWJlc3QgfHwgcm90WzJdIDwgYmVzdFsyXSB8fCAocm90WzJdID09PSBiZXN0WzJdICYmIHJvdFsxXSA8IGJlc3RbMV0pKSBiZXN0ID0gcm90OwogICAgfQogICAgcmV0dXJuIGJlc3Q7CiAgfQogIGZ1bmN0aW9uIHRoZW9yeShzZXQpIHsKICAgIHZhciBwY3MgPSBzZW1pcyhzZXQpLCBuZiA9IG5vcm1hbChwY3MpLCBuaSA9IG5vcm1hbChwY3MubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiAoMTIgLSBwKSAlIDEyOyB9KSk7CiAgICB2YXIgcHJpbWUgPSBuaVsxXSA8IG5mWzFdID8gbmkgOiBuZiwgc3ltID0gbmYuam9pbigpID09PSBuaS5qb2luKCk7CiAgICB2YXIgbnVtID0gRk9SVEVbcHJpbWUuam9pbignJyldLCBpdiA9IFswLCAwLCAwLCAwLCAwLCAwXTsKICAgIFtbMCwgMV0sIFswLCAyXSwgWzEsIDJdXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IHZhciBkID0gTWF0aC5hYnMocGNzW3BbMF1dIC0gcGNzW3BbMV1dKSAlIDEyOyBpdltNYXRoLm1pbihkLCAxMiAtIGQpIC0gMV0rKzsgfSk7CiAgICByZXR1cm4geyBwcmltZTogcHJpbWUsIGZvcnRlOiAnMy0nICsgbnVtICsgKHN5bSA_ICcnIDogbmYuam9pbigpID09PSBwcmltZS5qb2luKCkgPyAnQScgOiAnQicpLCBmYW1pbHk6IG51bSwgc3ltOiBzeW0sIGl2OiBpdiB9OwogIH0KICAvKiBtaXJyb3IgYXJvdW5kIHRoZSByb290OiB3aGljaCBzZXQgYW5kIHdoaWNoIHJvb3QgZG9lcyB0aGUgZmxpcHBlZCBzaGFwZSBtYWtlPyAqLwogIGZ1bmN0aW9uIG1pcnJvcihzZXQsIHJwYykgewogICAgdmFyIGZsaXAgPSBzZW1pcyhzZXQpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gKHJwYyAtIHggKyAxMikgJSAxMjsgfSksIGtleSA9IHRuS2V5KGZsaXApOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTRVRTLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzbSA9IHNlbWlzKFNFVFNbaV0pOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDEyOyB0KyspIHsKICAgICAgICB2YXIgcGNzID0gc20ubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiAoeCArIHQpICUgMTI7IH0pOwogICAgICAgIGlmICh0bktleShzbSkgPT09IGtleSAmJiBmbGlwLmV2ZXJ5KGZ1bmN0aW9uIChwKSB7IHJldHVybiBwY3MuaW5kZXhPZihwKSA-PSAwOyB9KSkgcmV0dXJuIHsgc2V0OiBTRVRTW2ldLCByb290OiBST09UU1t0XSwgcGNzOiBmbGlwIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIHN0YXRlID0geyBzZXQ6ICdtYWonLCByb290OiAnQycsIHZpZXc6ICd0eXBlJywgbWlyOiBmYWxzZSwgbGFiZWxzOiAnZGVnJyB9OwogIChmdW5jdGlvbiBmcm9tSGFzaCgpIHsKICAgIHZhciBtID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvc2V0PShbXHcjJV0rKS8pLCByID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvcm9vdD0oW0EtR11bI2JdPykvKTsKICAgIGlmIChtKSB7IHZhciBpZCA9IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKTsgaWYgKFNFVFMuc29tZShmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5pZCA9PT0gaWQ7IH0pKSBzdGF0ZS5zZXQgPSBpZDsgfQogICAgaWYgKHIgJiYgUk9PVFMuaW5kZXhPZihyWzFdKSA-PSAwKSBzdGF0ZS5yb290ID0gclsxXTsKICB9KSgpOwoKICBmdW5jdGlvbiBjdXIoKSB7CiAgICB2YXIgc2V0ID0gc2V0QnlJZChzdGF0ZS5zZXQpLCByID0gSy5wYXJzZU5vdGUoc3RhdGUucm9vdCk7CiAgICB2YXIgbm90ZXMgPSBbeyBkZWc6IDEsIHNlbWk6IDAsIGxhYjogJzEnLCBzcDogSy5zcGVsbChyLmwsIHIucGMpIH1dLmNvbmNhdChzZXQudC5tYXAoZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHsgZGVnOiB4WzBdLCBzZW1pOiB4WzFdLCBsYWI6IEsuZGVncmVlTGFiZWwoeFswXSwgeFsxXSksIHNwOiBLLm5vdGVBdChyLCB4WzBdLCB4WzFdKSB9OwogICAgfSkpOwogICAgcmV0dXJuIHsgc2V0OiBzZXQsIHI6IHIsIG5vdGVzOiBub3RlcyB9OwogIH0KICBmdW5jdGlvbiBtaWRpcyhjKSB7IHZhciBiID0gNjAgKyBjLnIucGM7IGlmIChiID4gNjYpIGIgLT0gMTI7IHJldHVybiBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gYiArIG4uc2VtaTsgfSk7IH0KCiAgLyogLS0tLS0tLS0tLSBwaXRjaC1jbGFzcyBjbG9jayAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcHQocGMsIHJhZCwgY3gsIGN5KSB7IHZhciBhID0gKHBjICogMzAgLSA5MCkgKiBNYXRoLlBJIC8gMTgwOyByZXR1cm4gW2N4ICsgcmFkICogTWF0aC5jb3MoYSksIGN5ICsgcmFkICogTWF0aC5zaW4oYSldOyB9CiAgZnVuY3Rpb24gcG9seShwY3MsIHJhZCwgY3gsIGN5KSB7IHJldHVybiBwY3Muc2xpY2UoKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSkubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwdChwLCByYWQsIGN4LCBjeSkuam9pbignLCcpOyB9KS5qb2luKCcgJyk7IH0KICBmdW5jdGlvbiBiaWdDbG9jayhjKSB7CiAgICB2YXIgVyA9IDMwMCwgY3ggPSAxNTAsIGN5ID0gMTUwLCBSID0gMTEyLCBlbCA9IEsuc3ZnKFcsIFcsICdjbXgtY2xvY2snKTsKICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQaXRjaC1jbGFzcyBjbG9jayBzaG93aW5nICcgKyBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5zcC5uYW1lOyB9KS5qb2luKCcsICcpKTsKICAgIFMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IFIsIGZpbGw6ICcjZjdmYmZlJywgc3Ryb2tlOiAnI2UyZThmMCcsICdzdHJva2Utd2lkdGgnOiAyIH0sIGVsKTsKICAgIHZhciBwY3MgPSBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5zcC5wYzsgfSksIG1wY3MgPSBzdGF0ZS5taXIgPyBtaXJyb3IoYy5zZXQsIGMuci5wYykucGNzIDogbnVsbDsKICAgIGlmIChzdGF0ZS5taXIpIHsKICAgICAgdmFyIG0gPSBtaXJyb3IoYy5zZXQsIGMuci5wYyksIGExID0gcHQoYy5yLnBjLCBSICsgMjIsIGN4LCBjeSksIGEyID0gcHQoYy5yLnBjICsgNiwgUiArIDIyLCBjeCwgY3kpOwogICAgICBTKCdsaW5lJywgeyB4MTogYTFbMF0sIHkxOiBhMVsxXSwgeDI6IGEyWzBdLCB5MjogYTJbMV0sIHN0cm9rZTogUFVSUExFLCAnc3Ryb2tlLXdpZHRoJzogMS41LCAnc3Ryb2tlLWRhc2hhcnJheSc6ICc1IDUnIH0sIGVsKTsKICAgICAgUygncG9seWdvbicsIHsgcG9pbnRzOiBwb2x5KG0ucGNzLCBSLCBjeCwgY3kpLCBmaWxsOiAncmdiYSgxMjQsNTgsMjM3LC4xMCknLCBzdHJva2U6IFBVUlBMRSwgJ3N0cm9rZS13aWR0aCc6IDIuNSwgJ3N0cm9rZS1kYXNoYXJyYXknOiAnNyA1JywgJ3N0cm9rZS1saW5lam9pbic6ICdyb3VuZCcgfSwgZWwpOwogICAgICBtLnBjcy5mb3JFYWNoKGZ1bmN0aW9uIChtcCkgeyBpZiAocGNzLmluZGV4T2YobXApIDwgMCkgeyB2YXIgZCA9IHB0KG1wLCBSLCBjeCwgY3kpOyBTKCdjaXJjbGUnLCB7IGN4OiBkWzBdLCBjeTogZFsxXSwgcjogNywgZmlsbDogUFVSUExFLCBzdHJva2U6ICcjZmZmJywgJ3N0cm9rZS13aWR0aCc6IDIgfSwgZWwpOyB9IH0pOwogICAgfQogICAgUygncG9seWdvbicsIHsgcG9pbnRzOiBwb2x5KHBjcywgUiwgY3gsIGN5KSwgZmlsbDogJ3JnYmEoNCwxMTksMTkxLC4xNiknLCBzdHJva2U6ICcjMDQ3N0JGJywgJ3N0cm9rZS13aWR0aCc6IDMsICdzdHJva2UtbGluZWpvaW4nOiAncm91bmQnIH0sIGVsKTsKICAgIC8qIHN0ZXAgc2l6ZXMgb24gZWFjaCBlZGdlICovCiAgICB2YXIgc3J0ID0gcGNzLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pOwogICAgc3J0LmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHsKICAgICAgdmFyIHEgPSBzcnRbKGkgKyAxKSAlIDNdLCBzdGVwID0gKHEgLSBwICsgMTIpICUgMTIsIG1pZCA9IHAgKyBzdGVwIC8gMiwgbHAgPSBwdChtaWQsIFIgLSAyNCwgY3gsIGN5KTsKICAgICAgaWYgKHN0ZXAgPiAwKSBTKCd0ZXh0JywgeyB4OiBscFswXSwgeTogbHBbMV0gKyA0LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA4MDAsIGZpbGw6ICcjMDM1YTkxJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsICcrJyArIHN0ZXApOwogICAgfSk7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDEyOyBwKyspIHsKICAgICAgdmFyIG9uID0gLTE7IGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgeyBpZiAobi5zcC5wYyA9PT0gcCkgb24gPSBpOyB9KTsKICAgICAgdmFyIHEyID0gcHQocCwgUiwgY3gsIGN5KTsKICAgICAgaWYgKG9uIDwgMCkgewogICAgICAgIGlmICghbXBjcyB8fCBtcGNzLmluZGV4T2YocCkgPCAwKSBTKCdjaXJjbGUnLCB7IGN4OiBxMlswXSwgY3k6IHEyWzFdLCByOiA0LCBmaWxsOiAnI2NiZDVlMScgfSwgZWwpOwogICAgICAgIHZhciBscSA9IHB0KHAsIFIgKyAyMiwgY3gsIGN5KTsKICAgICAgICBTKCd0ZXh0JywgeyB4OiBscVswXSwgeTogbHFbMV0gKyA0LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA2MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIENMT0NLW3BdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbiA9IGMubm90ZXNbb25dLCBnID0gUygnZycsIHsgJ2NsYXNzJzogJ2NteC1jZG90JywgJ2RhdGEtaSc6IG9uIH0sIGVsKTsKICAgICAgICBTKCdjaXJjbGUnLCB7IGN4OiBxMlswXSwgY3k6IHEyWzFdLCByOiAxOSwgZmlsbDogb24gPT09IDAgPyAnI0YyQjIzMycgOiAnIzA0NzdCRicsIHN0cm9rZTogJyNmZmYnLCAnc3Ryb2tlLXdpZHRoJzogMyB9LCBnKTsKICAgICAgICBTKCd0ZXh0JywgeyB4OiBxMlswXSwgeTogcTJbMV0gKyA1LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IG4uc3AubmFtZS5sZW5ndGggPiAyID8gMTIgOiAxNCwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBvbiA9PT0gMCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZywgbi5zcC5uYW1lKTsKICAgICAgICBnLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgICAgICAoZnVuY3Rpb24gKGkpIHsgZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttaWRpcyhjdXIoKSlbaV1dLCAnYmxvY2snLCB7IGR1cjogMS4xIH0pOyB9KTsgfSkob24pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWw7CiAgfQogIGZ1bmN0aW9uIG1pbmlDbG9jayhzZXQpIHsKICAgIHZhciBlbCA9IEsuc3ZnKDY0LCA2NCwgJ2NteC1taW5pJyksIHBjcyA9IHNlbWlzKHNldCk7CiAgICBTKCdjaXJjbGUnLCB7IGN4OiAzMiwgY3k6IDMyLCByOiAyNSwgZmlsbDogJyNmZmYnLCBzdHJva2U6ICcjZTJlOGYwJywgJ3N0cm9rZS13aWR0aCc6IDIgfSwgZWwpOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCAxMjsgcCsrKSB7IHZhciBxID0gcHQocCwgMjUsIDMyLCAzMik7IFMoJ2NpcmNsZScsIHsgY3g6IHFbMF0sIGN5OiBxWzFdLCByOiAxLjYsIGZpbGw6ICcjY2JkNWUxJyB9LCBlbCk7IH0KICAgIFMoJ3BvbHlnb24nLCB7IHBvaW50czogcG9seShwY3MsIDI1LCAzMiwgMzIpLCBmaWxsOiAncmdiYSg0LDExOSwxOTEsLjE4KScsIHN0cm9rZTogJyMwNDc3QkYnLCAnc3Ryb2tlLXdpZHRoJzogMi4yLCAnc3Ryb2tlLWxpbmVqb2luJzogJ3JvdW5kJyB9LCBlbCk7CiAgICB2YXIgcjAgPSBwdCgwLCAyNSwgMzIsIDMyKTsgUygnY2lyY2xlJywgeyBjeDogcjBbMF0sIGN5OiByMFsxXSwgcjogNC4yLCBmaWxsOiAnI0YyQjIzMycgfSwgZWwpOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogLS0tLS0tLS0tLSAzLXN0cmluZyBndWl0YXIgc2hhcGVzIC0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzaGFwZShjLCBsb3cpIHsgcmV0dXJuIHNoYXBlU3BhbihjLCBsb3csIDMpIHx8IHNoYXBlU3BhbihjLCBsb3csIDUpOyB9CiAgZnVuY3Rpb24gc2hhcGVTcGFuKGMsIGxvdywgbWF4U3BhbikgewogICAgdmFyIHBjcyA9IGMubm90ZXMubWFwKGZ1bmN0aW9uIChuKSB7IHJldHVybiBuLnNwLnBjOyB9KSwgYmVzdCA9IG51bGw7CiAgICBmdW5jdGlvbiBvcHRzKHMpIHsgdmFyIG8gPSBbXTsgZm9yICh2YXIgZiA9IDA7IGYgPD0gMTU7IGYrKykgaWYgKHBjcy5pbmRleE9mKChUVU5bc10gKyBmKSAlIDEyKSA-PSAwKSBvLnB1c2goZik7IHJldHVybiBvOyB9CiAgICB2YXIgQSA9IG9wdHMobG93KSwgQiA9IG9wdHMobG93ICsgMSksIEMgPSBvcHRzKGxvdyArIDIpOwogICAgQS5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7IEIuZm9yRWFjaChmdW5jdGlvbiAoYikgeyBDLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgdmFyIGZyID0gW2EsIGIsIGRdLCBnb3QgPSBmci5tYXAoZnVuY3Rpb24gKGYsIGkpIHsgcmV0dXJuIChUVU5bbG93ICsgaV0gKyBmKSAlIDEyOyB9KTsKICAgICAgaWYgKGdvdFswXSA9PT0gZ290WzFdIHx8IGdvdFswXSA9PT0gZ290WzJdIHx8IGdvdFsxXSA9PT0gZ290WzJdKSByZXR1cm47CiAgICAgIHZhciBwcmVzc2VkID0gZnIuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID4gMDsgfSksIGxvID0gcHJlc3NlZC5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBwcmVzc2VkKSA6IDAsIGhpID0gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpOwogICAgICB2YXIgc3BhbiA9IGhpIC0gbG87IGlmIChzcGFuID4gbWF4U3BhbikgcmV0dXJuOwogICAgICB2YXIgc2NvcmUgPSBsbyAqIDIgKyBzcGFuICsgKGdvdFswXSA9PT0gYy5yLnBjID8gMCA6IDMpOwogICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyOiBmciwgZ290OiBnb3QgfTsKICAgIH0pOyB9KTsgfSk7CiAgICBpZiAoIWJlc3QpIHJldHVybiBudWxsOwogICAgdmFyIGZyZXRzID0gWy0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdLCBsYWJlbHMgPSBbJycsICcnLCAnJywgJycsICcnLCAnJ10sIHJvb3RJZHggPSAtMSwgbWlkcyA9IFtdOwogICAgYmVzdC5mci5mb3JFYWNoKGZ1bmN0aW9uIChmLCBpKSB7CiAgICAgIHZhciBzID0gbG93ICsgaSwgcGMgPSBiZXN0LmdvdFtpXTsgZnJldHNbc10gPSBmOyBtaWRzLnB1c2goVFVOW3NdICsgZik7CiAgICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyBpZiAobi5zcC5wYyA9PT0gcGMpIGxhYmVsc1tzXSA9IG4ubGFiOyB9KTsKICAgICAgaWYgKHBjID09PSBjLnIucGMpIHJvb3RJZHggPSBzOwogICAgfSk7CiAgICByZXR1cm4geyBmcmV0czogZnJldHMsIGxhYmVsczogbGFiZWxzLCByb290SWR4OiByb290SWR4LCBtaWRpczogbWlkcywgYmFycmU6IG51bGwsIHN0cmV0Y2g6IG1heFNwYW4gPiAzIH07CiAgfQoKICB2YXIgZWxzID0ge307CiAgZnVuY3Rpb24gY2hpcChsYWJlbCwgb24sIGZuLCBjbHMpIHsgcmV0dXJuIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtY2hpcCcgKyAob24gPyAnIG9uJyA6ICcnKSArIChjbHMgPyAnICcgKyBjbHMgOiAnJyksICdhcmlhLXByZXNzZWQnOiBvbiA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZuIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gdGlsZShzZXQpIHsKICAgIHJldHVybiBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LXRpbGUnICsgKHNldC5pZCA9PT0gc3RhdGUuc2V0ID8gJyBvbicgOiAnJyksICdhcmlhLXByZXNzZWQnOiBzZXQuaWQgPT09IHN0YXRlLnNldCA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RhdGUuc2V0ID0gc2V0LmlkOyByZW5kZXIoKTsgfSB9LCBbCiAgICAgIG1pbmlDbG9jayhzZXQpLCBoKCdiJywgeyB0ZXh0OiBzZXQubiB9KSwgaCgnc21hbGwnLCB7IHRleHQ6IHNldC5zcmMgfHwgZm9ybXVsYShzZXQpLmpvaW4oJy0nKSB9KQogICAgXSk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlclRpbGVzKCkgewogICAgZWxzLnRpbGVzLmlubmVySFRNTCA9ICcnOwogICAgaWYgKHN0YXRlLnZpZXcgPT09ICd0eXBlJykgewogICAgICBHUk9VUFMuZm9yRWFjaChmdW5jdGlvbiAoZ24sIGcpIHsKICAgICAgICBlbHMudGlsZXMuYXBwZW5kQ2hpbGQoaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwgY214LWdsYmwnLCB0ZXh0OiBnbiB9KSk7CiAgICAgICAgZWxzLnRpbGVzLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC10aWxlcycgfSwgU0VUUy5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguZyA9PT0gZzsgfSkubWFwKHRpbGUpKSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGZhbSA9IHt9OwogICAgICBTRVRTLmZvckVhY2goZnVuY3Rpb24gKHgpIHsgdmFyIHRoID0gdGhlb3J5KHgpOyAoZmFtW3RoLmZhbWlseV0gPSBmYW1bdGguZmFtaWx5XSB8fCB7IHRoOiB0aCwgc2V0czogW10gfSkuc2V0cy5wdXNoKHgpOyB9KTsKICAgICAgdmFyIGdyaWQgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmFtcycgfSk7CiAgICAgIE9iamVjdC5rZXlzKGZhbSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICB2YXIgZiA9IGZhbVtrXTsKICAgICAgICBncmlkLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYW0nICsgKGYuc2V0cy5sZW5ndGggPiAxID8gJyBwYWlyJyA6ICcnKSB9LCBbCiAgICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWZhbWhlYWQnLCB0ZXh0OiAnRmFtaWx5IDMtJyArIGsgKyAoZi5zZXRzLmxlbmd0aCA-IDEgPyAnIMK3IG1pcnJvciBwYWlyJyA6ICcgwrcgaXRzIG93biBtaXJyb3InKSB9KSwKICAgICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYW10aWxlcycgfSwgZi5zZXRzLm1hcCh0aWxlKSkKICAgICAgICBdKSk7CiAgICAgIH0pOwogICAgICBlbHMudGlsZXMuYXBwZW5kQ2hpbGQoaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1mYW1ub3RlJywgdGV4dDogJzE5IHNldHMsIDEyIGZhbWlsaWVzOiA3IHNldHMgaGF2ZSBhIG1pcnJvci1pbWFnZSBwYXJ0bmVyIGFuZCA1IGFyZSBzeW1tZXRyaWNhbC4nIH0pKTsKICAgICAgZWxzLnRpbGVzLmFwcGVuZENoaWxkKGdyaWQpOwogICAgfQogIH0KICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICB0cnkgeyBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyNzZXQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChzdGF0ZS5zZXQpICsgJyZyb290PScgKyBzdGF0ZS5yb290KTsgfSBjYXRjaCAoZSkge30KICAgIHJlbmRlclRpbGVzKCk7CiAgICBlbHMudmlld3MuaW5uZXJIVE1MID0gJyc7CiAgICBbWyd0eXBlJywgJ0J5IHR5cGUnXSwgWydmYW0nLCAnTWlycm9yIGZhbWlsaWVzJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLnZpZXdzLmFwcGVuZENoaWxkKGNoaXAob1sxXSwgc3RhdGUudmlldyA9PT0gb1swXSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS52aWV3ID0gb1swXTsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CiAgICBlbHMucm9vdHMuaW5uZXJIVE1MID0gJyc7CiAgICBST09UUy5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IGVscy5yb290cy5hcHBlbmRDaGlsZChjaGlwKHByZXR0eShyKSwgciA9PT0gc3RhdGUucm9vdCwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5yb290ID0gcjsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CgogICAgdmFyIGMgPSBjdXIoKSwgdGggPSB0aGVvcnkoYy5zZXQpLCBtID0gbWlycm9yKGMuc2V0LCBjLnIucGMpOwogICAgdmFyIHJuID0gYy5ub3Rlc1swXS5zcC5uYW1lOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcm4gKyAnICcgKyBsbmFtZShjLnNldCk7CiAgICBlbHMuc3ViLnRleHRDb250ZW50ID0gR1JPVVBTW2Muc2V0LmddICsgJyDCtyAnICsgZm9ybXVsYShjLnNldCkuam9pbignIOKAkyAnKTsKICAgIGVscy5kZXNjLnRleHRDb250ZW50ID0gYy5zZXQuZDsKICAgIGVscy5ub3Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgewogICAgICBlbHMubm90ZXMuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LW5vdGUnICsgKGkgPT09IDAgPyAnIHJvb3QnIDogJycpIH0sIFsKICAgICAgICBoKCdiJywgeyB0ZXh0OiBuLnNwLm5hbWUgfSksIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdkZWcnLCB0ZXh0OiBuLmxhYiB9KSwgaCgnc21hbGwnLCB7IHRleHQ6IEsuaW50ZXJ2YWxOYW1lKG4uZGVnLCBuLnNlbWkpIHx8IChuLnNlbWkgKyAnIGhhbGYgc3RlcHMnKSB9KQogICAgICBdKSk7CiAgICB9KTsKICAgIGVscy5jbG9jay5pbm5lckhUTUwgPSAnJzsgZWxzLmNsb2NrLmFwcGVuZENoaWxkKGJpZ0Nsb2NrKGMpKTsKICAgIGVscy5taXJidG4udGV4dENvbnRlbnQgPSBzdGF0ZS5taXIgPyAnSGlkZSBtaXJyb3InIDogJ1Nob3cgbWlycm9yJzsKICAgIGVscy5taXJidG4uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBzdGF0ZS5taXIgPyAndHJ1ZScgOiAnZmFsc2UnKTsKCiAgICB2YXIgc3RlcHMgPSBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5zcC5wYzsgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pOwogICAgdmFyIHN0ID0gc3RlcHMubWFwKGZ1bmN0aW9uIChwLCBpKSB7IHJldHVybiAoc3RlcHNbKGkgKyAxKSAlIDNdIC0gcCArIDEyKSAlIDEyOyB9KTsKICAgIGVscy5mYWN0cy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ1N0ZXBzIGFyb3VuZCB0aGUgY2xvY2snLCBzdC5qb2luKCcgKyAnKSArICcgPSAxMiddLCBbJ1ByaW1lIGZvcm0nLCAnKCcgKyB0aC5wcmltZS5qb2luKCcgJykgKyAnKSddLCBbJ0ZvcnRlIG51bWJlcicsIHRoLmZvcnRlXSwgWydJbnRlcnZhbCB2ZWN0b3InLCAnPCcgKyB0aC5pdi5qb2luKCcnKSArICc-J11dLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgZWxzLmZhY3RzLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYWN0JyB9LCBbaCgnc3BhbicsIHsgdGV4dDogclswXSB9KSwgaCgnYicsIHsgdGV4dDogclsxXSB9KV0pKTsKICAgIH0pOwogICAgdmFyIG9uID0ge30sIGJhc2UgPSBjLnIucGM7IGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyBvbltiYXNlICsgbi5zZW1pXSA9IG4uc3AubmFtZTsgfSk7CiAgICBlbHMua2IuaW5uZXJIVE1MID0gJyc7IGVscy5rYi5hcHBlbmRDaGlsZChLLmtleWJvYXJkKHsgb2N0YXZlczogMiwgb246IG9uLCByb290OiBiYXNlIH0pKTsKCiAgICAvKiBtaXJyb3IgY2FyZCAqLwogICAgdmFyIG1uID0gSy5wYXJzZU5vdGUobS5yb290KSwgbW5hbWUgPSBLLnNwZWxsKG1uLmwsIG1uLnBjKS5uYW1lICsgJyAnICsgbG5hbWUobS5zZXQpOwogICAgdmFyIGZsaXBwZWQgPSBtLnNldC50Lm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gSy5ub3RlQXQobW4sIHhbMF0sIHhbMV0pLm5hbWU7IH0pOwogICAgZWxzLm1pcnJvci5pbm5lckhUTUwgPSAnJzsKICAgIGVscy5taXJyb3IuYXBwZW5kQ2hpbGQoaCgncCcsIHt9LCB0aC5zeW0KICAgICAgPyBbJ0ZsaXAgJywgaCgnYicsIHsgdGV4dDogcm4gKyAnICcgKyBsbmFtZShjLnNldCkgfSksICcgdXBzaWRlIGRvd24gYXJvdW5kICcgKyBybiArICcgYW5kIHlvdSBnZXQgJywgaCgnYicsIHsgdGV4dDogbW5hbWUgfSksICcsIHRoZSBzYW1lIHNoYXBlLiBJdCBpcyAnLCBoKCdiJywgeyB0ZXh0OiAnaXRzIG93biBtaXJyb3IgaW1hZ2UnIH0pLCAnLCBzbyBpdCBjb3VudHMgb25jZSB3aGV0aGVyIG9yIG5vdCB5b3UgYWxsb3cgbWlycm9yaW5nLiddCiAgICAgIDogWydGbGlwICcsIGgoJ2InLCB7IHRleHQ6IHJuICsgJyAnICsgbG5hbWUoYy5zZXQpIH0pLCAnIHVwc2lkZSBkb3duIGFyb3VuZCAnICsgcm4gKyAnIGFuZCB5b3UgZ2V0ICcsIGgoJ2InLCB7IHRleHQ6IG1uYW1lIH0pLCAnICgnICsgW0suc3BlbGwobW4ubCwgbW4ucGMpLm5hbWVdLmNvbmNhdChmbGlwcGVkKS5qb2luKCcgJykgKyAnKS4gVGhlc2UgdHdvIGFyZSAnLCBoKCdiJywgeyB0ZXh0OiAnbWlycm9yIGltYWdlcycgfSksICcuIENvdW50IHRoZW0gYXMgb25lIHNldCBhbmQgdGhlIDE5IHNocmluayB0byAxMiBmYW1pbGllcy4nXSkpOwogICAgaWYgKG0uc2V0LmlkICE9PSBjLnNldC5pZCkgZWxzLm1pcnJvci5hcHBlbmRDaGlsZChoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCBzbScsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RhdGUuc2V0ID0gbS5zZXQuaWQ7IHN0YXRlLnJvb3QgPSBtLnJvb3Q7IHJlbmRlcigpOyB9IH0sIFsnR28gdG8gJyArIG1uYW1lICsgJyDihpInXSkpOwoKICAgIC8qIHNoYXBlcyAqLwogICAgZWxzLnNoYXBlcy5pbm5lckhUTUwgPSAnJzsKICAgIFszLCAyLCAxLCAwXS5mb3JFYWNoKGZ1bmN0aW9uIChsb3cpIHsKICAgICAgdmFyIHYgPSBzaGFwZShjLCBsb3cpOyBpZiAoIXYpIHJldHVybjsKICAgICAgdmFyIG5hbWVzID0gT1BFTi5zbGljZShsb3csIGxvdyArIDMpLmpvaW4oJyAnKTsKICAgICAgZWxzLnNoYXBlcy5hcHBlbmRDaGlsZChoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LXNoYXBlJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBLLnBsYXkodi5taWRpcywgJ3N0cnVtJywgeyBkdXI6IDEuNiB9KTsgfSwgJ2FyaWEtbGFiZWwnOiAnUGxheSB0aGUgc2hhcGUgb24gc3RyaW5ncyAnICsgbmFtZXMgfSwgWwogICAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtc2hlYWQnLCB0ZXh0OiAnU3RyaW5ncyAnICsgKDYgLSBsb3cpICsgJ-KAkycgKyAoNCAtIGxvdykgfSksIEsuY2hvcmREaWFncmFtKHYpLCBoKCdzbWFsbCcsIHsgdGV4dDogdi5zdHJldGNoID8gJ-KWtiB0YXAgdG8gaGVhciAoc3RyZXRjaCknIDogJ-KWtiB0YXAgdG8gaGVhcicgfSkKICAgICAgXSkpOwogICAgfSk7CgogICAgLyogZnJldGJvYXJkIG1hcCAqLwogICAgdmFyIG1hcmtzID0gW107CiAgICBmb3IgKHZhciBzID0gMDsgcyA8IDY7IHMrKykgZm9yICh2YXIgZiA9IDA7IGYgPD0gMTI7IGYrKykgewogICAgICB2YXIgcGMgPSAoVFVOW3NdICsgZikgJSAxMjsKICAgICAgYy5ub3Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgaWYgKG4uc3AucGMgIT09IHBjKSByZXR1cm47CiAgICAgICAgKGZ1bmN0aW9uIChtbSkgeyBtYXJrcy5wdXNoKHsgczogcywgZjogZiwga2luZDogaSA9PT0gMCA_ICdyb290JyA6ICcnLCBsYWJlbDogc3RhdGUubGFiZWxzID09PSAnZGVnJyA_IG4ubGFiIDogbi5zcC5uYW1lLCBjbGljazogZnVuY3Rpb24gKCkgeyBLLnBsYXkoW21tXSwgJ2Jsb2NrJywgeyBkdXI6IDEgfSk7IH0gfSk7IH0pKFRVTltzXSArIGYpOwogICAgICB9KTsKICAgIH0KICAgIGVscy5mYi5pbm5lckhUTUwgPSAnJzsgZWxzLmZiLmFwcGVuZENoaWxkKEsuZnJldGJvYXJkKFRVTiwgbWFya3MsIHsgZnJldHM6IDEyLCBvcGVuTmFtZXM6IE9QRU4gfSkpOwogICAgZWxzLmxhYi5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2RlZycsICdEZWdyZWVzJ10sIFsnbm90ZScsICdOb3RlIG5hbWVzJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLmxhYi5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIHN0YXRlLmxhYmVscyA9PT0gb1swXSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5sYWJlbHMgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICB9CiAgZnVuY3Rpb24gc2hpZnQoZCkgeyB2YXIgaSA9IFJPT1RTLmluZGV4T2Yoc3RhdGUucm9vdCk7IHN0YXRlLnJvb3QgPSBST09UU1soaSArIGQgKyAxMikgJSAxMl07IHJlbmRlcigpOyB2YXIgYyA9IGN1cigpOyBLLnBsYXkobWlkaXMoYyksICdibG9jaycsIHsgZHVyOiAxLjIgfSk7IH0KICBmdW5jdGlvbiBidWlsZCgpIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMudGlsZXMgPSBoKCdkaXYnKTsgZWxzLnZpZXdzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsgZWxzLnJvb3RzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIGVscy50aXRsZSA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1iaWcnIH0pOyBlbHMuc3ViID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXN1YicgfSk7IGVscy5kZXNjID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1kZXNjJyB9KTsKICAgIGVscy5ub3RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1ub3RlcycgfSk7IGVscy5jbG9jayA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jbG9ja3dyYXAnIH0pOwogICAgZWxzLmZhY3RzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZhY3RzJyB9KTsgZWxzLmtiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWtiJyB9KTsKICAgIGVscy5taXJyb3IgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtbWlycm9yJyB9KTsgZWxzLnNoYXBlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zaGFwZXMnIH0pOwogICAgZWxzLmZiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSk7IGVscy5sYWIgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLm1pcmJ0biA9IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGdob3N0IHNtJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBzdGF0ZS5taXIgPSAhc3RhdGUubWlyOyByZW5kZXIoKTsgfSB9KTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQnIH0sIFsKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXN0ZXAnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LW4nLCB0ZXh0OiAnMScgfSksIGgoJ2InLCB7IHRleHQ6ICdQaWNrIG9uZSBvZiB0aGUgMTkgc2V0cycgfSksIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtZ3JvdycgfSksIGVscy52aWV3c10pLAogICAgICBlbHMudGlsZXMsCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdGVwJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1uJywgdGV4dDogJzInIH0pLCBoKCdiJywgeyB0ZXh0OiAnUGljayBhIHJvb3QnIH0pXSksCiAgICAgIGVscy5yb290cwogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCBjbXgtcmVzdWx0JyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1yaGVhZCcgfSwgWwogICAgICAgIGgoJ2RpdicsIHt9LCBbZWxzLnRpdGxlLCBlbHMuc3ViXSksCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBsYXknIH0sIFsKICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGJsdWUnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IEsucGxheShtaWRpcyhjdXIoKSksICdibG9jaycpOyB9IH0sIFsn4pa2IFRvZ2V0aGVyJ10pLAogICAgICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gZ2hvc3QnLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IEsucGxheShtaWRpcyhjdXIoKSksICd1cCcpOyB9IH0sIFsnT25lIGF0IGEgdGltZSddKQogICAgICAgIF0pCiAgICAgIF0pLAogICAgICBlbHMuZGVzYywgZWxzLm5vdGVzLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdmlzJyB9LCBbCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJyB9LCBbCiAgICAgICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcHRvcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1BpdGNoLWNsYXNzIGNsb2NrJyB9KSwgZWxzLm1pcmJ0bl0pLAogICAgICAgICAgZWxzLmNsb2NrLAogICAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXR1cm4nIH0sIFsKICAgICAgICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gZ2hvc3Qgc20nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHNoaWZ0KC0xKTsgfSwgJ2FyaWEtbGFiZWwnOiAnVHJhbnNwb3NlIGRvd24gYSBoYWxmIHN0ZXAnIH0sIFsn4oa6IOKIkjEnXSksCiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IHRleHQ6ICdSb3RhdGUgPSB0cmFuc3Bvc2UnIH0pLAogICAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCBzbScsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc2hpZnQoMSk7IH0sICdhcmlhLWxhYmVsJzogJ1RyYW5zcG9zZSB1cCBhIGhhbGYgc3RlcCcgfSwgWycrMSDihrsnXSkKICAgICAgICAgIF0pCiAgICAgICAgXSksCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnVGhlIG51bWJlcnMnIH0pLCBlbHMuZmFjdHMsIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgc3R5bGU6ICdtYXJnaW4tdG9wOjE0cHgnLCB0ZXh0OiAnS2V5Ym9hcmQnIH0pLCBlbHMua2JdKQogICAgICBdKSwKICAgICAgZWxzLm1pcnJvcgogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgWwogICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdUaHJlZS1zdHJpbmcgZ3VpdGFyIHNoYXBlcycgfSksIGVscy5zaGFwZXMsCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYmhlYWQnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHN0eWxlOiAnbWFyZ2luOjAnLCB0ZXh0OiAnRXZlcnkgcGxhY2UgaXQgbGl2ZXMgb24gdGhlIG5lY2sgKHRhcCBhIG5vdGUpJyB9KSwgZWxzLmxhYl0pLAogICAgICBlbHMuZmIKICAgIF0pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/three-note-pitch-classes/">Guitar Music Theory: The 19 Three-Note Pitch Class Sets</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1510</post-id>	</item>
		<item>
		<title>Scale Degree Functions: Tonic Is Home</title>
		<link>https://www.cantonmusicacademy.com/scale-degree-functions/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Wed, 21 May 2025 01:23:38 +0000</pubDate>
				<category><![CDATA[Music Lessons]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1472</guid>

					<description><![CDATA[<p>If you&#8217;ve ever struggled to make sense of terms like tonic, dominant or submediant, you&#8217;re not alone. These traditional labels for the scale degree functions can feel abstract without a framework. One helpful way to remember them is metaphor: each scale degree is a place you visit in daily life, starting with the idea that...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/scale-degree-functions/">Scale Degree Functions: Tonic Is Home</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Scale Degree Functions (interactive)
  URL stays the same: /scale-degree-functions/
  WHERE: Posts → edit "Scale Degree Functions" → delete ALL old blocks
  (including the old image and table) → add ONE "Custom HTML" block → paste
  everything below → Update → Delete Cache.
  Post title (H1):        Scale Degree Functions: Tonic Is Home
  Yoast SEO title:        Scale Degree Functions Explained (Interactive) | Canton Music Academy
  Yoast meta description: Tonic is home, the dominant is work, the leading tone is the front door. Hear all 7 scale degree functions in any key with our interactive metaphor map.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-ctl{display:flex;flex-wrap:wrap;gap:14px 28px}
.cmx-phead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:0 0 14px}
.cmx-legend{display:flex;flex-wrap:wrap;gap:6px}
.cmx-legend .lg{font-size:.72rem;font-weight:800;border-radius:999px;padding:4px 10px}
.fn-t{--fc:#0477BF;--fb:#eaf4fb}
.fn-p{--fc:#22803f;--fb:#eefaf2}
.fn-d{--fc:#c2410c;--fb:#fff1e6}
.cmx-legend .lg{background:var(--fb);color:var(--fc)}
.cmx-editrow{display:flex;align-items:center;gap:8px}
.cmx-btn.sm{padding:7px 14px;min-height:36px;font-size:.82rem}
.cmx-linkbtn{font-family:inherit;background:none;border:0;color:var(--mut);font-size:.78rem;font-weight:700;text-decoration:underline;cursor:pointer}
.cmx-places{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;margin:0 0 14px}
.cmx-place{position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;gap:3px;background:#fff;border:2px solid var(--fb);border-top:5px solid var(--fc);border-radius:16px;padding:12px 4px 10px;cursor:pointer;transition:transform .12s,box-shadow .12s;min-width:0}
.cmx-place:hover{transform:translateY(-2px);box-shadow:0 8px 18px rgba(26,32,44,.1)}
.cmx-place.sel{background:var(--fb);border-color:var(--fc)}
.cmx-place.lit{transform:translateY(-4px) scale(1.04);box-shadow:0 0 0 3px var(--fc),0 10px 22px rgba(26,32,44,.18);background:var(--fb)}
.cmx-place:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-place .num{position:absolute;top:6px;left:8px;font-size:.72rem;font-weight:800;color:var(--fc)}
.cmx-place .ic{font-size:1.9rem;line-height:1.1}
.cmx-place .pl{font-size:.82rem;line-height:1.15;color:var(--ink);min-height:2.3em;display:flex;align-items:center}
.cmx-place input{font-family:inherit;width:100%;font-size:.75rem;font-weight:700;text-align:center;border:1.5px solid var(--fc);border-radius:8px;padding:4px 2px;min-height:2.3em}
.cmx-place .nm{font-size:.62rem;color:var(--mut);font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.cmx-place .nt{display:flex;align-items:baseline;gap:4px;margin-top:2px}
.cmx-place .nt b{font-size:1.05rem}
.cmx-place .nt span{font-size:.68rem;font-weight:800;color:var(--fc)}
.cmx-place .meter{display:flex;gap:2px;margin-top:4px}
.cmx-place .meter i{width:9px;height:5px;border-radius:2px;background:#e2e8f0}
.cmx-place .meter i.on{background:var(--fc)}
.cmx-hint2{color:var(--mut)!important;text-align:center;margin:4px 0 0!important;font-size:.92rem!important}
.cmx-infocard{background:var(--fb);border-left:5px solid var(--fc);border-radius:14px;padding:14px 18px}
.cmx-infocard .big{font-size:1.25rem;font-weight:800;margin-bottom:4px}
.cmx-infocard p{margin:0 0 4px!important;font-size:.95rem!important}
.cmx-infocard .meta{color:var(--mut)!important;font-size:.88rem!important}
.cmx-trips{display:flex;flex-wrap:wrap;gap:8px}
.cmx-tripline{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:12px 0 0!important;font-size:.9rem!important;min-height:1.5em}
.cmx-tripline .stop{background:var(--soft);border-radius:999px;padding:4px 10px;font-weight:700}
.cmx-tripline .arr{color:var(--mut);font-weight:800}
.cmx-tripline .rn{color:var(--mut);font-weight:700;font-size:.82rem}
.cmx-byline{color:var(--mut)!important;font-style:italic}
@media (max-width:760px){
  .cmx-places{grid-template-columns:repeat(4,1fr)}
}
@media (max-width:480px){
  .cmx-places{grid-template-columns:repeat(2,1fr)}
  .cmx-place{flex-direction:row;flex-wrap:wrap;justify-content:flex-start;text-align:left;padding:10px 10px 10px 30px;gap:2px 8px}
  .cmx-place .ic{font-size:1.4rem}
  .cmx-place .pl{min-height:0;flex:1 1 60%}
  .cmx-place .nm{flex-basis:100%}
}

</style>

<div class="cmx">

<p class="cmx-lead">If you&#8217;ve ever struggled to make sense of terms like <b>tonic</b>, <b>dominant</b> or <b>submediant</b>, you&#8217;re not alone. These traditional labels for the scale degree functions can feel abstract without a framework. One helpful way to remember them is metaphor: each scale degree is a place you visit in daily life, starting with the idea that <b>the tonic is home</b>.</p>

<div class="cmx-tool" id="cmx-sdf"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the scale degree map…</p></div>

<h2>Real-Life Metaphors for Scale Degree Functions</h2>
<figure class="wp-block-table"><table><thead><tr><th>Degree</th><th>Name</th><th>Function</th><th>Place</th></tr></thead><tbody>
<tr><td>1</td><td>Tonic</td><td>The tonal center; where everything begins and ends</td><td>🏠 Home</td></tr>
<tr><td>2</td><td>Supertonic</td><td>Often leads to the dominant; a step on the way</td><td>🛒 Grocery Store</td></tr>
<tr><td>3</td><td>Mediant</td><td>Between tonic and dominant; emotionally neutral</td><td>☕ Café</td></tr>
<tr><td>4</td><td>Subdominant</td><td>Pushes away from tonic; often leads to the dominant</td><td>🏫 School or Gym</td></tr>
<tr><td>5</td><td>Dominant</td><td>Full of tension; needs to resolve to tonic</td><td>💼 Work</td></tr>
<tr><td>6</td><td>Submediant</td><td>Emotional detour; relative minor of the tonic</td><td>🌳 Park</td></tr>
<tr><td>7</td><td>Leading Tone</td><td>Right before home; unstable and wants to resolve</td><td>🚪 Front Door</td></tr>
</tbody></table></figure>

<h2>Why Scale Degree Functions Matter</h2>
<p>In tonal music, scale degrees aren&#8217;t just positions. Each has a function: some pull the listener away from the tonal center, and others bring them back. Understanding these functions gives composers, improvisers and students a clear map of how music creates motion and resolution.</p>
<p>The dominant (5) wants to go home, like leaving work at the end of the day. The leading tone (7) is the front door: you&#8217;re right outside the tonic. The submediant (6) feels like a reflective walk through the park. Tap those places in the map above and listen to how each one pulls toward home.</p>

<h2>The Three Function Groups</h2>
<ul class="wp-block-list">
  <li><b>Home base (tonic):</b> 1, 3 and 6. Stable, restful places where a phrase can settle.</li>
  <li><b>Moving away (predominant):</b> 2 and 4. They lead you out the door and toward tension.</li>
  <li><b>Tension (dominant):</b> 5 and 7. They create the strongest pull back home.</li>
</ul>
<p>Most chord progressions are journeys between these groups: home, out into the world, up to the point of greatest tension, and back home again. Try the &#8220;Take a trip&#8221; buttons to hear progressions like I – IV – V – I as a day out and back.</p>

<h2>A Personal Metaphor (And Yours Might Be Different)</h2>
<p>This location-based system is just one approach. You might come up with your own: a movie plot, characters in a story, or emotional stages. Press <b>&#8220;Make it yours&#8221;</b> in the map to rename each place with your own metaphor. Your browser will remember it.</p>
<p>What matters most is having something that helps you understand what each scale degree does. Whether you&#8217;re analyzing a chord progression or composing a melody, recognizing each degree&#8217;s function will improve your musical decisions.</p>

<h2>Final Thoughts</h2>
<p>Scale degree functions help musicians move beyond numbers and notes. They turn abstract theory into something expressive and memorable, and by giving each degree a familiar, real-world meaning, you&#8217;re more likely to remember how they interact and how to use them.</p>

<h2>Scale Degree FAQ</h2>
<details><summary>What is the difference between a scale degree and a note?</summary><p>A note is a specific pitch, like G. A scale degree is a note&#8217;s position and role within a key. G is degree 5 (the dominant) in C major, but degree 1 (the tonic) in G major.</p></details>
<details><summary>Why is the 7th called the leading tone?</summary><p>Because it sits just a half step below the tonic and &#8220;leads&#8221; the ear strongly back home. In the map, it&#8217;s the front door.</p></details>
<details><summary>Do scale degree functions work in minor keys?</summary><p>Yes. The names and functions are the same; minor keys just change some of the chord qualities. (In natural minor, the 7th is a whole step below the tonic and is called the subtonic.)</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>For more, try the <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">interactive circle of fifths</a> and the <a href="https://www.cantonmusicacademy.com/chord-progression-builder/">Chord Progression Builder</a>, see our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">guitar theory resources</a>, or <a href="https://www.cantonmusicacademy.com/music-lessons-in-canton-mi/">explore lessons at Canton Music Academy</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogU2NhbGUgZGVncmVlIGZ1bmN0aW9ucyDigJQgInBsYWNlcyIgZXhwbG9yZXIuIFVzZXMgd2luZG93LkNNSyAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbXgtc2RmJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JykpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScsICcxJyk7CiAgdmFyIEsgPSB3aW5kb3cuQ01LLCBoID0gSy5oOwogIHZhciBNQUogPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBERUcgPSBbCiAgICB7IG46ICdUb25pYycsIGljOiAn8J-PoCcsIHBsYWNlOiAnSG9tZScsIGZuOiAndCcsIHRlbnNpb246IDAsIHRvOiBudWxsLCBkZXNjOiAnVGhlIHRvbmFsIGNlbnRlciwgd2hlcmUgZXZlcnl0aGluZyBiZWdpbnMgYW5kIGVuZHMuJyB9LAogICAgeyBuOiAnU3VwZXJ0b25pYycsIGljOiAn8J-bkicsIHBsYWNlOiAnR3JvY2VyeSBTdG9yZScsIGZuOiAncCcsIHRlbnNpb246IDIsIHRvOiAwLCBkZXNjOiAnQSBzdGVwIG9uIHRoZSB3YXksIG9mdGVuIGxlYWRpbmcgdG93YXJkIHRoZSBkb21pbmFudC4nIH0sCiAgICB7IG46ICdNZWRpYW50JywgaWM6ICfimJUnLCBwbGFjZTogJ0NhZsOpJywgZm46ICd0JywgdGVuc2lvbjogMSwgdG86IG51bGwsIGRlc2M6ICdCZXR3ZWVuIHRvbmljIGFuZCBkb21pbmFudDsgY2FsbSBhbmQgZW1vdGlvbmFsbHkgbmV1dHJhbC4nIH0sCiAgICB7IG46ICdTdWJkb21pbmFudCcsIGljOiAn8J-PqycsIHBsYWNlOiAnU2Nob29sIG9yIEd5bScsIGZuOiAncCcsIHRlbnNpb246IDIsIHRvOiAyLCBkZXNjOiAnUHVzaGVzIGF3YXkgZnJvbSBob21lLCBvZnRlbiBoZWFkaW5nIHRvIHRoZSBkb21pbmFudC4nIH0sCiAgICB7IG46ICdEb21pbmFudCcsIGljOiAn8J-SvCcsIHBsYWNlOiAnV29yaycsIGZuOiAnZCcsIHRlbnNpb246IDMsIHRvOiAwLCBkZXNjOiAnRnVsbCBvZiB0ZW5zaW9uOyBpdCB3YW50cyB0byByZXNvbHZlIGJhY2sgaG9tZS4nIH0sCiAgICB7IG46ICdTdWJtZWRpYW50JywgaWM6ICfwn4yzJywgcGxhY2U6ICdQYXJrJywgZm46ICd0JywgdGVuc2lvbjogMSwgdG86IDQsIGRlc2M6ICdBbiBlbW90aW9uYWwgZGV0b3VyOyB0aGUgcmVsYXRpdmUgbWlub3Igb2YgaG9tZS4nIH0sCiAgICB7IG46ICdMZWFkaW5nIFRvbmUnLCBpYzogJ_CfmqonLCBwbGFjZTogJ0Zyb250IERvb3InLCBmbjogJ2QnLCB0ZW5zaW9uOiA0LCB0bzogMCwgZGVzYzogJ1JpZ2h0IG91dHNpZGUgaG9tZTsgdW5zdGFibGUgYW5kIGVhZ2VyIHRvIHJlc29sdmUuJyB9CiAgXTsKICB2YXIgRk4gPSB7IHQ6ICdIb21lIGJhc2UgKHRvbmljKScsIHA6ICdNb3ZpbmcgYXdheSAocHJlZG9taW5hbnQpJywgZDogJ1RlbnNpb24gKGRvbWluYW50KScgfTsKICB2YXIgVFJJUFMgPSBbCiAgICB7IG46ICdUaGUgY2xhc3NpYyBkYXknLCBzZXE6IFswLCAzLCA0LCAwXSB9LAogICAgeyBuOiAnUG9wIHNvbmcgZHJpdmUnLCBzZXE6IFswLCA0LCA1LCAzLCAwXSB9LAogICAgeyBuOiAnVGhlIHNjZW5pYyByb3V0ZScsIHNlcTogWzAsIDUsIDEsIDQsIDBdIH0sCiAgICB7IG46ICdDb2ZmZWUgZmlyc3QnLCBzZXE6IFswLCAyLCA1LCAzLCA0LCAwXSB9CiAgXTsKICB2YXIgS0VZUyA9IFsnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0YnLCAnQmInLCAnRWInLCAnQWInLCAnRGInLCAnQicsICdGIyddOwogIHZhciBzdGF0ZSA9IHsga2V5OiAnQycsIG1vZGU6ICdub3RlJywgc2VsOiBudWxsLCBlZGl0OiBmYWxzZSwgbmFtZXM6IG51bGwgfTsKICB0cnkgeyB2YXIgc2F2ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjbXgtc2RmLXBsYWNlcycpIHx8ICdudWxsJyk7IGlmIChzYXZlZCAmJiBzYXZlZC5sZW5ndGggPT09IDcpIHN0YXRlLm5hbWVzID0gc2F2ZWQ7IH0gY2F0Y2ggKGUpIHt9CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgeyB2YXIgbSA9IGxvY2F0aW9uLmhhc2gubWF0Y2goL2tleT0oW0EtR11bI2JdPykvKTsgaWYgKG0gJiYgS0VZUy5pbmRleE9mKG1bMV0pID49IDApIHN0YXRlLmtleSA9IG1bMV07IH0pKCk7CiAgZnVuY3Rpb24gcHJldHR5KG4pIHsgcmV0dXJuIG4ucmVwbGFjZSgnIycsICfima8nKS5yZXBsYWNlKC9iJC8sICfima0nKTsgfQogIGZ1bmN0aW9uIHBsYWNlKGkpIHsgcmV0dXJuIHN0YXRlLm5hbWVzICYmIHN0YXRlLm5hbWVzW2ldID8gc3RhdGUubmFtZXNbaV0gOiBERUdbaV0ucGxhY2U7IH0KICBmdW5jdGlvbiBub3RlcygpIHsgdmFyIHQgPSBLLnBhcnNlTm90ZShzdGF0ZS5rZXkpOyByZXR1cm4gTUFKLm1hcChmdW5jdGlvbiAocywgZCkgeyByZXR1cm4gSy5zcGVsbCh0LmwgKyBkLCB0LnBjICsgcyk7IH0pOyB9CiAgZnVuY3Rpb24gY2hvcmQoZCkgewogICAgdmFyIG5zID0gbm90ZXMoKSwgdGhpcmQgPSAoTUFKWyhkICsgMikgJSA3XSAtIE1BSltkXSArIDEyKSAlIDEyLCBmaWZ0aCA9IChNQUpbKGQgKyA0KSAlIDddIC0gTUFKW2RdICsgMTIpICUgMTI7CiAgICB2YXIgcSA9IHRoaXJkID09PSA0ID8gJycgOiBmaWZ0aCA9PT0gNiA_ICfCsCcgOiAnbSc7CiAgICB2YXIgcm4gPSBbJ0knLCAnaWknLCAnaWlpJywgJ0lWJywgJ1YnLCAndmknLCAndmlpwrAnXVtkXTsKICAgIHZhciBiID0gNDggKyBuc1tkXS5wYzsgaWYgKGIgPCA1MykgYiArPSAxMjsKICAgIHJldHVybiB7IG5hbWU6IG5zW2RdLm5hbWUgKyBxLCBybjogcm4sIG1pZGlzOiBbYiwgYiArIHRoaXJkLCBiICsgZmlmdGhdIH07CiAgfQogIGZ1bmN0aW9uIGJhc2UoKSB7IHZhciBiID0gNjAgKyBLLnBhcnNlTm90ZShzdGF0ZS5rZXkpLnBjOyBpZiAoYiA-IDY2KSBiIC09IDEyOyByZXR1cm4gYjsgfQogIGZ1bmN0aW9uIG5vdGVNaWRpKGQsIG5lYXIpIHsgdmFyIG0gPSBiYXNlKCkgKyBNQUpbZF07IGlmIChuZWFyICE9PSB1bmRlZmluZWQpIHsgd2hpbGUgKG0gLSBuZWFyID4gNikgbSAtPSAxMjsgd2hpbGUgKG5lYXIgLSBtID4gNikgbSArPSAxMjsgfSByZXR1cm4gbTsgfQoKICB2YXIgZWxzID0ge30sIHRpbWVycyA9IFtdOwogIGZ1bmN0aW9uIHN0b3AoKSB7IHRpbWVycy5mb3JFYWNoKGNsZWFyVGltZW91dCk7IHRpbWVycyA9IFtdOyBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmNteC1wbGFjZS5saXQnKSwgZnVuY3Rpb24gKGUpIHsgZS5jbGFzc0xpc3QucmVtb3ZlKCdsaXQnKTsgfSk7IH0KICBmdW5jdGlvbiBsaWdodChkLCBtcywgYXQpIHsKICAgIHRpbWVycy5wdXNoKHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmNteC1wbGFjZS5saXQnKSwgZnVuY3Rpb24gKGUpIHsgZS5jbGFzc0xpc3QucmVtb3ZlKCdsaXQnKTsgfSk7CiAgICAgIHZhciBlbCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNteC1wbGFjZVtkYXRhLWQ9IicgKyBkICsgJyJdJyk7IGlmIChlbCkgZWwuY2xhc3NMaXN0LmFkZCgnbGl0Jyk7CiAgICB9LCBhdCkpOwogICAgdGltZXJzLnB1c2goc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHZhciBlbCA9IHJvb3QucXVlcnlTZWxlY3RvcignLmNteC1wbGFjZVtkYXRhLWQ9IicgKyBkICsgJyJdJyk7IGlmIChlbCkgZWwuY2xhc3NMaXN0LnJlbW92ZSgnbGl0Jyk7IH0sIGF0ICsgbXMpKTsKICB9CiAgZnVuY3Rpb24gdmlzaXQoZCkgewogICAgc3RvcCgpOyBzdGF0ZS5zZWwgPSBkOyByZW5kZXJJbmZvKCk7CiAgICB2YXIgRCA9IERFR1tkXTsKICAgIGlmIChzdGF0ZS5tb2RlID09PSAnbm90ZScpIHsKICAgICAgSy5kcm9uZShiYXNlKCkgLSAxMiwgRC50byA9PT0gbnVsbCA_IDEuOCA6IDIuOCk7CiAgICAgIHZhciBtID0gbm90ZU1pZGkoZCk7CiAgICAgIHRpbWVycy5wdXNoKHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBLLnBsYXkoW21dLCAnYmxvY2snLCB7IGR1cjogMS4xLCB2b2w6IDAuNSB9KTsgfSwgMTUwKSk7IGxpZ2h0KGQsIDEwMDAsIDE1MCk7CiAgICAgIGlmIChELnRvICE9PSBudWxsKSB7IHZhciBtMiA9IG5vdGVNaWRpKEQudG8sIG0pOyB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttMl0sICdibG9jaycsIHsgZHVyOiAxLjMsIHZvbDogMC41IH0pOyB9LCAxMjUwKSk7IGxpZ2h0KEQudG8sIDEyMDAsIDEyNTApOyB9CiAgICB9IGVsc2UgewogICAgICB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KGNob3JkKGQpLm1pZGlzLCAnc3RydW0nLCB7IGR1cjogMS4yIH0pOyB9LCA1MCkpOyBsaWdodChkLCAxMDAwLCA1MCk7CiAgICAgIGlmIChkICE9PSAwKSB7IHZhciBwYXRoID0gZCA9PT0gMSB8fCBkID09PSAzID8gWzQsIDBdIDogWzBdOyBwYXRoLmZvckVhY2goZnVuY3Rpb24gKHgsIGspIHsgdGltZXJzLnB1c2goc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IEsucGxheShjaG9yZCh4KS5taWRpcywgJ3N0cnVtJywgeyBkdXI6IDEuMiB9KTsgfSwgMTAwMCArIGsgKiA5MDApKTsgbGlnaHQoeCwgODUwLCAxMDAwICsgayAqIDkwMCk7IH0pOyB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHRyaXAodCkgewogICAgc3RvcCgpOwogICAgZWxzLnRyaXBsaW5lLmlubmVySFRNTCA9ICcnOwogICAgdC5zZXEuZm9yRWFjaChmdW5jdGlvbiAoZCwgaykgewogICAgICB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KGNob3JkKGQpLm1pZGlzLCAnc3RydW0nLCB7IGR1cjogMS4xIH0pOyB9LCBrICogOTUwKSk7IGxpZ2h0KGQsIDkwMCwgayAqIDk1MCk7CiAgICAgIGVscy50cmlwbGluZS5hcHBlbmRDaGlsZChoKCdzcGFuJywgeyAnY2xhc3MnOiAnc3RvcCcgfSwgW0RFR1tkXS5pYyArICcgJyArIHBsYWNlKGQpXSkpOwogICAgICBpZiAoayA8IHQuc2VxLmxlbmd0aCAtIDEpIGVscy50cmlwbGluZS5hcHBlbmRDaGlsZChoKCdzcGFuJywgeyAnY2xhc3MnOiAnYXJyJywgdGV4dDogJ-KGkicgfSkpOwogICAgfSk7CiAgICBlbHMudHJpcGxpbmUuYXBwZW5kQ2hpbGQoaCgnc3BhbicsIHsgJ2NsYXNzJzogJ3JuJywgdGV4dDogJygnICsgdC5zZXEubWFwKGZ1bmN0aW9uIChkKSB7IHJldHVybiBjaG9yZChkKS5ybjsgfSkuam9pbignIOKAkyAnKSArICcpJyB9KSk7CiAgfQogIGZ1bmN0aW9uIGNoaXAobGFiZWwsIG9uLCBmbiwgY2xzKSB7IHJldHVybiBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWNoaXAnICsgKG9uID8gJyBvbicgOiAnJykgKyAoY2xzID8gJyAnICsgY2xzIDogJycpLCAnYXJpYS1wcmVzc2VkJzogb24gPyAndHJ1ZScgOiAnZmFsc2UnLCBvbmNsaWNrOiBmbiB9LCBbbGFiZWxdKTsgfQogIGZ1bmN0aW9uIHJlbmRlckluZm8oKSB7CiAgICBlbHMuaW5mby5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzdGF0ZS5zZWwgPT09IG51bGwpIHsgZWxzLmluZm8uYXBwZW5kQ2hpbGQoaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1oaW50MicsIHRleHQ6ICdUYXAgYW55IHBsYWNlIHRvIGhlYXIgaXRzIHNjYWxlIGRlZ3JlZSBhbmQgd2hlcmUgaXQgd2FudHMgdG8gZ28uJyB9KSk7IHJldHVybjsgfQogICAgdmFyIGQgPSBzdGF0ZS5zZWwsIEQgPSBERUdbZF0sIG5zID0gbm90ZXMoKSwgYyA9IGNob3JkKGQpOwogICAgZWxzLmluZm8uYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWluZm9jYXJkIGZuLScgKyBELmZuIH0sIFsKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnYmlnJyB9LCBbRC5pYyArICcgJyArIHBsYWNlKGQpXSksCiAgICAgIGgoJ3AnLCB7fSwgW2goJ2InLCB7IHRleHQ6IChkICsgMSkgKyAnIMK3ICcgKyBELm4gfSksICcg4oCUICcgKyBELmRlc2NdKSwKICAgICAgaCgncCcsIHsgJ2NsYXNzJzogJ21ldGEnIH0sIFsnSW4gJyArIHByZXR0eShzdGF0ZS5rZXkpICsgJyBtYWpvcjogbm90ZSAnLCBoKCdiJywgeyB0ZXh0OiBuc1tkXS5uYW1lIH0pLCAnLCBjaG9yZCAnLCBoKCdiJywgeyB0ZXh0OiBjLm5hbWUgKyAnICgnICsgYy5ybiArICcpJyB9KSwgRC50byAhPT0gbnVsbCA_ICcuIFdhbnRzIHRvIG1vdmUgdG8gJyArIChELnRvICsgMSkgKyAnICgnICsgcGxhY2UoRC50bykgKyAnKS4nIDogJy4nXSkKICAgIF0pKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgc3RvcCgpOwogICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsICcja2V5PScgKyBzdGF0ZS5rZXkpOyB9IGNhdGNoIChlKSB7fQogICAgZWxzLmtleXMuaW5uZXJIVE1MID0gJyc7CiAgICBLRVlTLmZvckVhY2goZnVuY3Rpb24gKGspIHsgZWxzLmtleXMuYXBwZW5kQ2hpbGQoY2hpcChwcmV0dHkoayksIGsgPT09IHN0YXRlLmtleSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5rZXkgPSBrOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIGVscy5tb2Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ25vdGUnLCAnSGVhciBub3RlcyddLCBbJ2Nob3JkJywgJ0hlYXIgY2hvcmRzJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLm1vZGVzLmFwcGVuZENoaWxkKGNoaXAob1sxXSwgb1swXSA9PT0gc3RhdGUubW9kZSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5tb2RlID0gb1swXTsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CiAgICB2YXIgbnMgPSBub3RlcygpOwogICAgZWxzLnBsYWNlcy5pbm5lckhUTUwgPSAnJzsKICAgIERFRy5mb3JFYWNoKGZ1bmN0aW9uIChELCBkKSB7CiAgICAgIHZhciBjID0gY2hvcmQoZCksIG5hbWVFbDsKICAgICAgaWYgKHN0YXRlLmVkaXQpIG5hbWVFbCA9IGgoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIHZhbHVlOiBwbGFjZShkKSwgbWF4bGVuZ3RoOiAyMiwgJ2FyaWEtbGFiZWwnOiAnWW91ciBwbGFjZSBmb3IgZGVncmVlICcgKyAoZCArIDEpLCBvbmlucHV0OiBmdW5jdGlvbiAoZSkgeyBpZiAoIXN0YXRlLm5hbWVzKSBzdGF0ZS5uYW1lcyA9IERFRy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHgucGxhY2U7IH0pOyBzdGF0ZS5uYW1lc1tkXSA9IGUudGFyZ2V0LnZhbHVlOyB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY214LXNkZi1wbGFjZXMnLCBKU09OLnN0cmluZ2lmeShzdGF0ZS5uYW1lcykpOyB9IGNhdGNoIChlcikge30gfSwgb25jbGljazogZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSB9KTsKICAgICAgZWxzZSBuYW1lRWwgPSBoKCdiJywgeyAnY2xhc3MnOiAncGwnLCB0ZXh0OiBwbGFjZShkKSB9KTsKICAgICAgdmFyIG1ldGVyID0gaCgnc3BhbicsIHsgJ2NsYXNzJzogJ21ldGVyJywgdGl0bGU6ICdUZW5zaW9uJyB9LCBbMCwgMSwgMiwgM10ubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBoKCdpJywgeyAnY2xhc3MnOiBrIDwgRC50ZW5zaW9uID8gJ29uJyA6ICcnIH0pOyB9KSk7CiAgICAgIGVscy5wbGFjZXMuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBsYWNlIGZuLScgKyBELmZuICsgKHN0YXRlLnNlbCA9PT0gZCA_ICcgc2VsJyA6ICcnKSwgJ2RhdGEtZCc6IGQsIHJvbGU6ICdidXR0b24nLCB0YWJpbmRleDogMCwgb25jbGljazogZnVuY3Rpb24gKCkgeyBpZiAoIXN0YXRlLmVkaXQpIHsgdmlzaXQoZCk7IHJlbmRlcjIoKTsgfSB9LCBvbmtleWRvd246IGZ1bmN0aW9uIChlKSB7IGlmICgoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykgJiYgIXN0YXRlLmVkaXQpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB2aXNpdChkKTsgcmVuZGVyMigpOyB9IH0gfSwgWwogICAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdudW0nLCB0ZXh0OiBkICsgMSB9KSwKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnaWMnLCB0ZXh0OiBELmljIH0pLAogICAgICAgIG5hbWVFbCwKICAgICAgICBoKCdzbWFsbCcsIHsgJ2NsYXNzJzogJ25tJywgdGV4dDogRC5uIH0pLAogICAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdudCcgfSwgW2goJ2InLCB7IHRleHQ6IG5zW2RdLm5hbWUgfSksIGgoJ3NwYW4nLCB7IHRleHQ6IGMucm4gfSldKSwKICAgICAgICBtZXRlcgogICAgICBdKSk7CiAgICB9KTsKICAgIGVscy5lZGl0LnRleHRDb250ZW50ID0gc3RhdGUuZWRpdCA_ICfinJMgRG9uZScgOiAn4pyOIE1ha2UgaXQgeW91cnMnOwogICAgZWxzLnRyaXBzLmlubmVySFRNTCA9ICcnOwogICAgVFJJUFMuZm9yRWFjaChmdW5jdGlvbiAodCkgeyBlbHMudHJpcHMuYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gZ2hvc3Qgc20nLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHRyaXAodCk7IH0gfSwgWyfilrYgJyArIHQubl0pKTsgfSk7CiAgICByZW5kZXJJbmZvKCk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlcjIoKSB7IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuY214LXBsYWNlJyksIGZ1bmN0aW9uIChlKSB7IGUuY2xhc3NMaXN0LnRvZ2dsZSgnc2VsJywgK2UuZ2V0QXR0cmlidXRlKCdkYXRhLWQnKSA9PT0gc3RhdGUuc2VsKTsgfSk7IH0KICBmdW5jdGlvbiBidWlsZCgpIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMua2V5cyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7IGVscy5tb2RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMucGxhY2VzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBsYWNlcycgfSk7IGVscy5pbmZvID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWluZm8nIH0pOwogICAgZWxzLnRyaXBzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXRyaXBzJyB9KTsgZWxzLnRyaXBsaW5lID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC10cmlwbGluZScgfSk7CiAgICBlbHMuZWRpdCA9IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGdob3N0IHNtJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBzdGF0ZS5lZGl0ID0gIXN0YXRlLmVkaXQ7IHJlbmRlcigpOyB9IH0pOwogICAgdmFyIHJlc2V0ID0gaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1saW5rYnRuJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBzdGF0ZS5uYW1lcyA9IG51bGw7IHRyeSB7IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjbXgtc2RmLXBsYWNlcycpOyB9IGNhdGNoIChlKSB7fSByZW5kZXIoKTsgfSB9LCBbJ1Jlc2V0IG5hbWVzJ10pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY3RsJyB9LCBbCiAgICAgICAgaCgnZGl2Jywge30sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdNYWpvciBrZXknIH0pLCBlbHMua2V5c10pLAogICAgICAgIGgoJ2RpdicsIHt9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnVGFwIGEgcGxhY2UgdG8nIH0pLCBlbHMubW9kZXNdKQogICAgICBdKQogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCBjbXgtcmVzdWx0JyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1waGVhZCcgfSwgWwogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1sZWdlbmQnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnbGcgZm4tdCcsIHRleHQ6IEZOLnQgfSksIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdsZyBmbi1wJywgdGV4dDogRk4ucCB9KSwgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2xnIGZuLWQnLCB0ZXh0OiBGTi5kIH0pXSksCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWVkaXRyb3cnIH0sIFtlbHMuZWRpdCwgcmVzZXRdKQogICAgICBdKSwKICAgICAgZWxzLnBsYWNlcywgZWxzLmluZm8sCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgc3R5bGU6ICdtYXJnaW4tdG9wOjE0cHgnLCB0ZXh0OiAnVGFrZSBhIHRyaXAgKGNob3JkIHByb2dyZXNzaW9ucyBhcyBqb3VybmV5cyknIH0pLAogICAgICBlbHMudHJpcHMsIGVscy50cmlwbGluZQogICAgXSkpOwogICAgcmVuZGVyKCk7CiAgfQogIGJ1aWxkKCk7Cn0pKCk7Cg==".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.cantonmusicacademy.com/scale-degree-functions/">Scale Degree Functions: Tonic Is Home</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1472</post-id>	</item>
		<item>
		<title>Songwriting Lessons in Canton, MI</title>
		<link>https://www.cantonmusicacademy.com/songwriting-lessons-canton-mi/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Wed, 14 May 2025 16:01:41 +0000</pubDate>
				<category><![CDATA[Music Lessons]]></category>
		<category><![CDATA[music education]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1432</guid>

					<description><![CDATA[<p>Have a melody stuck in your head, a notebook full of lyrics, or just a feeling you want to turn into a song? Our private songwriting lessons in Canton help you shape rough ideas into finished songs, one-on-one with an instructor experienced in songwriting, recording and music education. Ages 7+Kids, teens &#38; adults 30–60 minWeekly...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/songwriting-lessons-canton-mi/">Songwriting Lessons in Canton, MI</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Songwriting Lessons (merged rewrite)
  URL stays the same: /learn-songwriting-in-canton/
  Replaces BOTH songwriting posts. The other one (/songwriting-lessons-canton-mi/)
  gets a 301 redirect to this URL, then goes to Trash (steps in the install notes).
  WHERE: Posts → edit "Learn Songwriting in Canton" → delete ALL old blocks
  (including the old image) → add ONE "Custom HTML" block → paste everything
  below → Update → Delete Cache.
  Post title (H1):        Songwriting Lessons in Canton, MI
  Yoast SEO title:        Songwriting Lessons in Canton, MI | Canton Music Academy
  Yoast meta description: Private songwriting lessons in Canton, MI for ages 7 to adult. Write lyrics, melodies and chords, finish your songs and record demos. No experience needed.
  Category: Music Lessons. No scripts.
============================================================= -->
<style>
.cms{--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:Montserrat,sans-serif;color:var(--ink)}
.cms *{box-sizing:border-box}
.cms .lead{font-size:1.18rem;line-height:1.7;color:var(--ink)}
.cms .facts{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:6px 0 30px}
.cms .facts div{background:var(--soft);border-radius:16px;padding:14px 12px;text-align:center}
.cms .facts b{display:block;font-size:1.15rem;color:var(--ink)}
.cms .facts span{font-size:.8rem;color:var(--mut);font-weight:600}
.cms .cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:18px 0 10px}
.cms .cards div{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px 18px 16px;box-shadow:0 8px 22px rgba(26,32,44,.05)}
.cms .cards .ic{font-size:1.6rem;line-height:1;display:block;margin-bottom:8px}
.cms .cards b{display:block;margin-bottom:4px;color:var(--ink)}
.cms .cards p{margin:0!important;font-size:.93rem;line-height:1.55;color:var(--mut)}
.cms .steps{counter-reset:s;display:grid;gap:10px;margin:18px 0 10px;padding:0;list-style:none}
.cms .steps li{counter-increment:s;position:relative;background:var(--soft);border-radius:16px;padding:16px 18px 16px 66px;margin:0;line-height:1.55}
.cms .steps li:before{content:counter(s);position:absolute;left:16px;top:14px;width:36px;height:36px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center}
.cms .steps b{display:block;color:var(--ink)}
.cms .who{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 10px;padding:0;list-style:none}
.cms .who li{background:#fff;border:1.5px solid var(--line);border-radius:999px;padding:8px 14px;margin:0;font-weight:600;font-size:.92rem}
.cms .tool{display:flex;gap:18px;align-items:center;background:linear-gradient(135deg,#eaf4fb,#fff8e8);border:1px solid var(--line);border-radius:20px;padding:20px 22px;margin:18px 0 10px}
.cms .tool .ic{font-size:2.2rem;line-height:1;flex:none}
.cms .tool p{margin:0 0 10px!important}
.cms .btn{display:inline-block;border-radius:999px;font-weight:700;padding:12px 22px;text-decoration:none!important;font-size:.95rem}
.cms .btn.blue{background:var(--b);color:#fff!important}
.cms .btn.blue:hover{background:var(--bd)}
.cms .btn.gold{background:var(--gold);color:var(--ink)!important}
.cms .btn.ghost{background:#fff;color:var(--ink)!important;border:1.5px solid var(--line)}
.cms .pairs{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:16px 0 10px}
.cms .pairs a{display:block;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:14px;text-decoration:none!important;color:var(--ink)!important;transition:border-color .15s}
.cms .pairs a:hover{border-color:var(--b)}
.cms .pairs b{display:block}
.cms .pairs span{font-size:.84rem;color:var(--mut)}
.cms details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cms summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cms summary::-webkit-details-marker{display:none}
.cms summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cms details[open] summary:after{content:"–"}
.cms details p{margin:0 0 16px;color:var(--mut)}
.cms .cta{background:linear-gradient(135deg,#1A202C 0%,#12324a 100%);border-radius:24px;padding:30px 28px;color:#fff;margin:30px 0 10px}
.cms .cta h2{color:#fff!important;margin:0 0 8px!important}
.cms .cta p{color:#cbd5e0!important;margin:0 0 18px!important}
.cms .cta .row{display:flex;flex-wrap:wrap;gap:10px 18px;align-items:center}
.cms .cta .ph{color:#fff!important;font-weight:600;text-decoration:none!important}
.cms .byline{color:var(--mut)!important;font-style:italic}
@media (max-width:760px){
  .cms .cards{grid-template-columns:1fr 1fr}
  .cms .pairs{grid-template-columns:1fr 1fr}
}
@media (max-width:520px){
  .cms .facts{grid-template-columns:1fr 1fr}
  .cms .cards{grid-template-columns:1fr}
  .cms .tool{flex-direction:column;align-items:flex-start}
}
</style>

<div class="cms">

<p class="lead">Have a melody stuck in your head, a notebook full of lyrics, or just a feeling you want to turn into a song? Our private songwriting lessons in Canton help you shape rough ideas into finished songs, one-on-one with an instructor experienced in songwriting, recording and music education.</p>

<div class="facts">
  <div><b>Ages 7+</b><span>Kids, teens &amp; adults</span></div>
  <div><b>30–60 min</b><span>Weekly private lessons</span></div>
  <div><b>Any style</b><span>Pop, rock, folk, indie, hip-hop</span></div>
  <div><b>No experience</b><span>Just bring your ideas</span></div>
</div>

<h2>What You&#8217;ll Work On</h2>
<p>Songwriting means different things to different people. Some writers start with words, others with a chord progression or a hook. Every lesson is built around your ideas, and can include:</p>
<div class="cards">
  <div><span class="ic">✍️</span><b>Lyrics &amp; storytelling</b><p>Finding your subject, imagery, rhyme schemes and phrasing that sounds natural when sung.</p></div>
  <div><span class="ic">🎶</span><b>Melody</b><p>Writing hooks people remember and fitting melodies to your words.</p></div>
  <div><span class="ic">🎸</span><b>Chords &amp; harmony</b><p>Choosing progressions that support the mood, with the theory to understand why they work.</p></div>
  <div><span class="ic">🧱</span><b>Song structure</b><p>Verses, choruses, bridges and pre-choruses, and how to build energy across a song.</p></div>
  <div><span class="ic">🔓</span><b>Finishing songs</b><p>Techniques for getting past writer&#8217;s block and turning fragments into complete songs.</p></div>
  <div><span class="ic">🎙️</span><b>Demos &amp; recording</b><p>Capturing ideas with voice memos or simple recording tools, and preparing songs to perform.</p></div>
</div>

<h2>Who Songwriting Lessons Are For</h2>
<p>You don&#8217;t need to sing well or play an instrument to start. If you have ideas, we&#8217;ll help you shape them. Our students include:</p>
<ul class="who">
  <li>Beginners with ideas but no training</li>
  <li>Singers writing their own material</li>
  <li>Guitarists and pianists writing full songs</li>
  <li>Bands and aspiring recording artists</li>
  <li>Kids and teens who love to create</li>
  <li>Anyone who wants to express themselves through music</li>
</ul>
<p>Some students arrive with finished songs and want feedback. Others bring a single line or a melody they&#8217;ve been humming. Both are welcome.</p>

<h2>How a Songwriting Lesson Works</h2>
<ol class="steps">
  <li><b>Start with a quick conversation</b>Call, text or email us about your goals and the music you love, and we&#8217;ll match you with the right teacher from day one.</li>
  <li><b>Bring an idea, or nothing at all</b>A lyric, a riff, a voice memo or just a topic. Your teacher helps you find the strongest part and build from it.</li>
  <li><b>Write between lessons</b>You&#8217;ll leave each lesson with a clear next step: finish a verse, try a new chord progression, rewrite a chorus.</li>
  <li><b>Finish, record and perform</b>As songs come together, you&#8217;ll record simple demos, and you can share your work at our student recitals if you&#8217;d like.</li>
</ol>

<h2>What to Bring</h2>
<p>A notebook or tablet for lyrics, your instrument if you play one (guitar, keyboard, ukulele), a phone for recording ideas, and your imagination. Lessons are relaxed and judgment-free.</p>

<div class="tool">
  <span class="ic">🎹</span>
  <div>
    <p><b>Try our free Chord Progression Builder.</b> Pick a key, build a progression with diatonic, borrowed and secondary dominant chords, hear it, and print a chart with chord diagrams for guitar, ukulele or piano. It&#8217;s a great way to sketch the chords for a new song.</p>
    <a class="btn blue" href="https://www.cantonmusicacademy.com/chord-progression-builder/">Open the Chord Progression Builder</a>
  </div>
</div>

<h2>Lessons That Pair Well With Songwriting</h2>
<div class="pairs">
  <a href="https://www.cantonmusicacademy.com/voice-lessons-in-canton-mi/"><b>🎤 Voice</b><span>Sing your songs with confidence</span></a>
  <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/"><b>🎸 Guitar</b><span>The classic songwriter&#8217;s instrument</span></a>
  <a href="https://www.cantonmusicacademy.com/piano-lessons-in-canton-mi/"><b>🎹 Piano</b><span>Chords and harmony at your fingertips</span></a>
  <a href="https://www.cantonmusicacademy.com/music-production-lessons/"><b>🎚️ Music Production</b><span>Record and produce your songs</span></a>
</div>

<h2>Songwriting Lesson FAQ</h2>
<details><summary>Do I need to sing or play an instrument?</summary><p>No. Many great songwriters started with only lyrics or melodies in their head. Your teacher can help with the musical side, and many students add voice, guitar or piano lessons later.</p></details>
<details><summary>What age can my child start songwriting lessons?</summary><p>We teach songwriting from age 7 through adult. Younger students often start with fun lyric games and simple melodies, while teens and adults dive into structure, harmony and recording.</p></details>
<details><summary>How long are the lessons?</summary><p>Private lessons are 30, 45 or 60 minutes once a week. Beginners and younger students usually start with 30 minutes; writers working on full songs or recording often prefer 45 or 60.</p></details>
<details><summary>Do I need to know music theory?</summary><p>No. You&#8217;ll pick up the theory you need as you go, like how chords work together and why a chorus feels like a lift. It&#8217;s always taught in the context of your own songs.</p></details>
<details><summary>Who owns the songs I write?</summary><p>You do. Your teacher guides and gives feedback, but the songs are yours.</p></details>

<div class="cta">
  <h2>Start Writing Your Songs</h2>
  <p>Not sure where to begin? Reach out and tell us about your goals, and we&#8217;ll match you with the right teacher.</p>
  <div class="row">
    <a class="btn gold" href="https://gpma.pike13.com/appointments/346341">Book a Songwriting Lesson</a>
    <a class="ph" href="tel:7346674983">📞 (734) 667-4983</a>
    <a class="ph" href="https://www.cantonmusicacademy.com/contact-us/">✉️ Contact us</a>
  </div>
</div>

<p class="byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

</div>
<p>The post <a href="https://www.cantonmusicacademy.com/songwriting-lessons-canton-mi/">Songwriting Lessons in Canton, MI</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1432</post-id>	</item>
		<item>
		<title>EADGCF All 4ths Tuning for Guitar</title>
		<link>https://www.cantonmusicacademy.com/eadgcf-all-4ths-tuning-for-guitar/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 02:52:52 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1307</guid>

					<description><![CDATA[<p>EADGCF All 4ths Tuning is an alternate guitar tuning that raises the B and high E strings a half step, so every pair of strings is a perfect 4th apart. Unlike standard tuning (EADGBE), which has a major 3rd between the G and B strings, EADGCF is completely uniform. Compare the two below. Loading the...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/eadgcf-all-4ths-tuning-for-guitar/">EADGCF All 4ths Tuning for Guitar</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: EADGCF All 4ths Tuning for Guitar (interactive)
  URL stays the same: /eadgcf-all-4ths-tuning-for-guitar/
  WHERE: Posts → edit the post → delete ALL old blocks → add ONE "Custom HTML"
  block → paste everything below → Update → Delete Cache.
  Post title (H1):        EADGCF All 4ths Tuning for Guitar
  Yoast SEO title:        EADGCF All 4ths Guitar Tuning (Interactive) + Free PDF | Canton Music Academy
  Yoast meta description: In EADGCF all-4ths tuning every string is a perfect 4th apart, so shapes never change. Compare it with standard tuning on an interactive fretboard.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-tgrid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:18px;align-items:start}
.cmx-tgrid .cmx-big{font-size:clamp(1.5rem,4vw,2.1rem)}
.cmx-sub2{margin:4px 0 0!important;color:var(--mut)!important;font-size:.92rem!important;font-weight:600}
.cmx-tnote{margin:10px 0 14px!important;font-size:.95rem!important;color:var(--ink)!important}
.cmx-strings{display:flex;flex-direction:column;background:var(--soft);border-radius:16px;padding:10px 12px}
.cmx-str{display:grid;grid-template-columns:42px 34px 1fr;align-items:center;gap:8px;background:#fff;border:1.5px solid var(--line);border-radius:10px;padding:6px 10px}
.cmx-str .sn{font-size:.7rem;font-weight:800;color:var(--mut)}
.cmx-str b{font-size:1.1rem}
.cmx-str .rt{font-size:.75rem;font-weight:700;color:var(--mut)}
.cmx-str.chg{border-color:#22803f;background:#f0faf4}
.cmx-str.chg .rt{color:#22803f}
.cmx-int{display:flex;justify-content:flex-start;padding:1px 0 1px 54px}
.cmx-int span{font-size:.62rem;font-weight:800;color:var(--mut);background:#fff;border:1px solid var(--line);border-radius:6px;padding:1px 6px}
.cmx-int.odd span{color:#fff;background:#c2410c;border-color:#c2410c}
.cmx-vrow{margin:0 0 12px}
.cmx-frets .cmx-chip{min-width:38px}
.cmx-chordhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px}
.cmx-big.sm{font-size:1.6rem}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-byline{color:var(--mut)!important;font-style:italic}
.cmx-dl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 20px;background:#fff8e8;border:1px solid #f6dfa6;border-radius:18px;padding:18px 20px;margin:18px 0 24px}
.cmx-dl p{margin:0!important}
.cmx-dl b{display:block;font-size:1.05rem}
.cmx-dl .cmx-btns{display:flex;flex-wrap:wrap;gap:8px}
@media (max-width:700px){.cmx-tgrid{grid-template-columns:1fr}}

</style>

<div class="cmx">

<p class="cmx-lead">EADGCF All 4ths Tuning is an alternate guitar tuning that raises the B and high E strings a half step, so every pair of strings is a perfect 4th apart. Unlike standard tuning (EADGBE), which has a major 3rd between the G and B strings, EADGCF is completely uniform. Compare the two below.</p>

<div class="cmx-tool" id="cmx-tune" data-set="all4ths"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the tuning explorer…</p></div>

<h2>Advantages of EADGCF All 4ths Tuning</h2>
<p>The main benefit is consistency. Because every string follows the same interval pattern, scale and chord shapes are identical across the neck. There&#8217;s no mental adjustment for the B string, a common challenge in standard tuning. Try &#8220;Move a chord shape&#8221; above: in all 4ths the finger pattern is the same on every string set, while in standard it shifts whenever a shape crosses the G and B strings.</p>
<p>Alternate tunings also help you explore sounds and harmonic structures that aren&#8217;t as easy to reach in standard tuning. With an all-4ths system you approach chord voicings and melodic ideas differently, which expands your creativity.</p>

<h2>Challenges of EADGCF Tuning</h2>
<p>EADGCF has its challenges too. Standard tuning remains dominant largely because it&#8217;s ergonomic for chords: it allows comfortable six-string shapes that are hard to reproduce in EADGCF. The high F and low E strings in particular make full chord shapes more complex.</p>
<p>Most guitarists have also internalized standard tuning, so switching is a learning curve. Even so, exploring this tuning can improve your understanding of intervals and scale shapes, and that knowledge carries back to standard and other tunings.</p>

<h2>Why You Should Try EADGCF Tuning</h2>
<p>Experimenting with EADGCF lets you see the fretboard in a new way. Removing the major 3rd gives you a clearer view of scale patterns, intervals and harmonic relationships. Standard tuning will stay popular for its chord voicings and playability, but exploring all 4ths can be an enlightening experience that deepens your understanding of the instrument. Give it a try. It might change the way you see and play the guitar!</p>

<div class="cmx-dl">
  <p><b>Free PDF: EADGCF Tuning Diagrams</b>Fretboard diagrams for all 4ths tuning.</p>
  <a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2025/02/EADGCF-ALL-4th-TUNING.pdf" target="_blank" rel="noopener">⬇ Download the PDF</a>
</div>

<h2>All 4ths Tuning FAQ</h2>
<details><summary>How do I tune to EADGCF?</summary><p>Leave the bottom four strings as they are (E A D G). Tune the B string up a half step to C and the high E string up a half step to F.</p></details>
<details><summary>Can I still play normal chords?</summary><p>Yes, but many open-position and six-string barre shapes change. Three- and four-note voicings on adjacent strings are where all-4ths tuning really shines.</p></details>
<details><summary>Is it the same as bass tuning?</summary><p>Yes, in a way. A 4-string bass is tuned E A D G in 4ths, and all-4ths guitar simply continues that pattern up to C and F.</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>More tunings: <a href="https://www.cantonmusicacademy.com/what-is-the-purpose-of-drop-d-tuning/">Drop D</a> and <a href="https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/">open tuning</a>. For a full breakdown of scales, chords and theory, see our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Music Theory Guide</a>, or take <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">guitar lessons in Canton</a>. <a href="https://www.noteflight.com/" target="_blank" rel="noopener">Noteflight</a> is cloud-based notation software for writing music.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogR3VpdGFyIHR1bmluZyBleHBsb3JlciAoc2hhcmVkIGJ5IERyb3AgRCwgT3BlbiBUdW5pbmcgYW5kIEVBREdDRiBwb3N0cykuIFVzZXMgd2luZG93LkNNSwogICBDb25maWd1cmUgd2l0aCA8ZGl2IGlkPSJjbXgtdHVuZSIgZGF0YS1zZXQ9ImRyb3BkfG9wZW58YWxsNHRocyI-ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC10dW5lJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JykpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScsICcxJyk7CiAgdmFyIEsgPSB3aW5kb3cuQ01LLCBoID0gSy5oOwogIHZhciBTRVQgPSByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1zZXQnKSB8fCAnZHJvcGQnOwogIHZhciBUID0gewogICAgc3RkOiB7IG46ICdTdGFuZGFyZCcsIHNob3J0OiAnRSBBIEQgRyBCIEUnLCBtOiBbNDAsIDQ1LCA1MCwgNTUsIDU5LCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdEJywgJ0cnLCAnQicsICdFJ10gfSwKICAgIGRyb3BkOiB7IG46ICdEcm9wIEQnLCBzaG9ydDogJ0QgQSBEIEcgQiBFJywgbTogWzM4LCA0NSwgNTAsIDU1LCA1OSwgNjRdLCBuYW1lczogWydEJywgJ0EnLCAnRCcsICdHJywgJ0InLCAnRSddLCBrZXk6ICdEJyB9LAogICAgb3Blbkc6IHsgbjogJ09wZW4gRycsIHNob3J0OiAnRCBHIEQgRyBCIEQnLCBtOiBbMzgsIDQzLCA1MCwgNTUsIDU5LCA2Ml0sIG5hbWVzOiBbJ0QnLCAnRycsICdEJywgJ0cnLCAnQicsICdEJ10sIGtleTogJ0cnLCBjaG9yZDogJ0cnIH0sCiAgICBvcGVuRDogeyBuOiAnT3BlbiBEJywgc2hvcnQ6ICdEIEEgRCBG4pmvIEEgRCcsIG06IFszOCwgNDUsIDUwLCA1NCwgNTcsIDYyXSwgbmFtZXM6IFsnRCcsICdBJywgJ0QnLCAnRuKZrycsICdBJywgJ0QnXSwga2V5OiAnRCcsIGNob3JkOiAnRCcgfSwKICAgIG9wZW5FOiB7IG46ICdPcGVuIEUnLCBzaG9ydDogJ0UgQiBFIEfima8gQiBFJywgbTogWzQwLCA0NywgNTIsIDU2LCA1OSwgNjRdLCBuYW1lczogWydFJywgJ0InLCAnRScsICdH4pmvJywgJ0InLCAnRSddLCBrZXk6ICdFJywgY2hvcmQ6ICdFJyB9LAogICAgb3BlbkE6IHsgbjogJ09wZW4gQScsIHNob3J0OiAnRSBBIEUgQSBD4pmvIEUnLCBtOiBbNDAsIDQ1LCA1MiwgNTcsIDYxLCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdFJywgJ0EnLCAnQ-KZrycsICdFJ10sIGtleTogJ0EnLCBjaG9yZDogJ0EnIH0sCiAgICBvcGVuQzogeyBuOiAnT3BlbiBDJywgc2hvcnQ6ICdDIEcgQyBHIEMgRScsIG06IFszNiwgNDMsIDQ4LCA1NSwgNjAsIDY0XSwgbmFtZXM6IFsnQycsICdHJywgJ0MnLCAnRycsICdDJywgJ0UnXSwga2V5OiAnQycsIGNob3JkOiAnQycgfSwKICAgIGFsbDQ6IHsgbjogJ0FsbCA0dGhzIChFQURHQ0YpJywgc2hvcnQ6ICdFIEEgRCBHIEMgRicsIG06IFs0MCwgNDUsIDUwLCA1NSwgNjAsIDY1XSwgbmFtZXM6IFsnRScsICdBJywgJ0QnLCAnRycsICdDJywgJ0YnXSwga2V5OiAnQycgfQogIH07CiAgdmFyIExJU1RTID0geyBkcm9wZDogWydzdGQnLCAnZHJvcGQnXSwgb3BlbjogWydzdGQnLCAnb3BlbkcnLCAnb3BlbkQnLCAnb3BlbkUnLCAnb3BlbkEnLCAnb3BlbkMnXSwgYWxsNHRoczogWydzdGQnLCAnYWxsNCddIH07CiAgdmFyIENIT1JEVEFCID0geyBkcm9wZDogJ09uZS1maW5nZXIgcG93ZXIgY2hvcmRzJywgb3BlbjogJ0JhcnJlID0gbWFqb3IgY2hvcmQnLCBhbGw0dGhzOiAnTW92ZSBhIGNob3JkIHNoYXBlJyB9OwogIHZhciBOQU1FUyA9IFsnQycsICdD4pmvJywgJ0QnLCAnReKZrScsICdFJywgJ0YnLCAnRuKZrycsICdHJywgJ0Hima0nLCAnQScsICdC4pmtJywgJ0InXTsKICB2YXIgS0VZUyA9IFsnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0YnLCAnQmInLCAnRWInXTsKICB2YXIgSU5UID0geyAzOiAnbTMnLCA0OiAnTTMnLCA1OiAnUDQnLCA2OiAnVFQnLCA3OiAnUDUnLCAyOiAnTTInLCA4OiAnbTYnLCA5OiAnTTYnIH07CiAgdmFyIElOVF9MT05HID0geyA0OiAnbWFqb3IgM3JkJywgNTogJ3BlcmZlY3QgNHRoJywgNzogJ3BlcmZlY3QgNXRoJywgMzogJ21pbm9yIDNyZCcsIDI6ICdtYWpvciAybmQnLCA5OiAnbWFqb3IgNnRoJywgODogJ21pbm9yIDZ0aCcgfTsKICB2YXIgbGlzdCA9IExJU1RTW1NFVF0gfHwgTElTVFMuZHJvcGQ7CiAgdmFyIHN0YXRlID0geyB0OiBsaXN0WzFdLCB2aWV3OiAnY2hvcmRzJywga2V5OiBUW2xpc3RbMV1dLmtleSB8fCAnQycsIGZyZXQ6IDUsIHNldDogMCB9OwogIHZhciBTSEFSUEtFWVMgPSB7IEc6IDEsIEQ6IDEsIEE6IDEsIEU6IDEsIEI6IDEgfTsKICBmdW5jdGlvbiByb290U3BlbGwoa2V5TmFtZSwgZiwgcGMpIHsKICAgIHZhciBkZWcgPSB7IDA6IFsxLCAwXSwgNTogWzQsIDVdLCA3OiBbNSwgN10sIDEyOiBbMSwgMF0gfVtmXTsKICAgIGlmIChkZWcpIHJldHVybiBLLm5vdGVBdChLLnBhcnNlTm90ZShrZXlOYW1lKSwgZGVnWzBdLCBkZWdbMV0pOwogICAgdmFyIG9wdHMgPSBbWydDJywgJ0MjJywgJ0QnLCAnRWInLCAnRScsICdGJywgJ0YjJywgJ0cnLCAnQWInLCAnQScsICdCYicsICdCJ11bcGNdLCBbJ0MnLCAnRGInLCAnRCcsICdEIycsICdFJywgJ0YnLCAnR2InLCAnRycsICdHIycsICdBJywgJ0EjJywgJ0InXVtwY11dOwogICAgdmFyIGJlc3QgPSBudWxsLCBicyA9IDk5OwogICAgb3B0cy5mb3JFYWNoKGZ1bmN0aW9uIChubSkgewogICAgICB2YXIgcCA9IEsucGFyc2VOb3RlKG5tKSwgciA9IEsuc3BlbGwocC5sLCBwLnBjKTsKICAgICAgdmFyIHNjID0gTWF0aC5hYnMoci5hKSArIE1hdGguYWJzKEsubm90ZUF0KHIsIDMsIDQpLmEpICsgTWF0aC5hYnMoSy5ub3RlQXQociwgNSwgNykuYSk7CiAgICAgIGlmIChzYyA8IGJzKSB7IGJzID0gc2M7IGJlc3QgPSByOyB9CiAgICB9KTsKICAgIHJldHVybiBiZXN0OwogIH0KICBmdW5jdGlvbiBpbkNob3JkKHJvb3RTcCwgcGMpIHsKICAgIHZhciBpdiA9IChwYyAtIHJvb3RTcC5wYyArIDEyKSAlIDEyLCBkID0geyAwOiAxLCA0OiAzLCAzOiAzLCA3OiA1LCA2OiA1LCA4OiA1IH1baXZdOwogICAgcmV0dXJuIGQgPyBLLm5vdGVBdChyb290U3AsIGQsIGl2KS5uYW1lIDogTkFNRVNbcGNdOwogIH0KICBmdW5jdGlvbiBwcmV0dHkobikgeyByZXR1cm4gbi5yZXBsYWNlKCcjJywgJ-KZrycpLnJlcGxhY2UoL2IkLywgJ-KZrScpOyB9CiAgZnVuY3Rpb24gY2hpcChsYWJlbCwgb24sIGZuLCBjbHMpIHsgcmV0dXJuIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtY2hpcCcgKyAob24gPyAnIG9uJyA6ICcnKSArIChjbHMgPyAnICcgKyBjbHMgOiAnJyksICdhcmlhLXByZXNzZWQnOiBvbiA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZuIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gcmV0dW5lKGkpIHsKICAgIHZhciBkID0gVFtzdGF0ZS50XS5tW2ldIC0gVC5zdGQubVtpXTsKICAgIGlmIChkID09PSAwKSByZXR1cm4gJyc7CiAgICB2YXIgYW10ID0gTWF0aC5hYnMoZCkgPT09IDEgPyAnYSBoYWxmIHN0ZXAnIDogTWF0aC5hYnMoZCkgPT09IDIgPyAnYSB3aG9sZSBzdGVwJyA6IE1hdGguYWJzKGQpICsgJyBoYWxmIHN0ZXBzJzsKICAgIHJldHVybiAoZCA8IDAgPyAn4oaTIGRvd24gJyA6ICfihpEgdXAgJykgKyBhbXQ7CiAgfQogIC8qIG1ham9yIHRyaWFkIChyb290LCAzcmQsIDV0aCkgb24gMyBhZGphY2VudCBzdHJpbmdzLCByb290IG9uIGxvd2VzdCBzdHJpbmcgbmVhciBmcmV0IGYgKi8KICBmdW5jdGlvbiB0cmlhZFNoYXBlKHR1biwgcywgZikgewogICAgdmFyIHIgPSAodHVuW3NdICsgZikgJSAxMiwgd2FudCA9IFtyLCAociArIDQpICUgMTIsIChyICsgNykgJSAxMl0sIG91dCA9IFtmXTsKICAgIGZvciAodmFyIGsgPSAxOyBrIDwgMzsgaysrKSB7CiAgICAgIHZhciBiZXN0ID0gbnVsbDsKICAgICAgZm9yICh2YXIgeCA9IE1hdGgubWF4KDAsIGYgLSA0KTsgeCA8PSBmICsgNTsgeCsrKSBpZiAoKHR1bltzICsga10gKyB4KSAlIDEyID09PSB3YW50W2tdKSB7IGlmIChiZXN0ID09PSBudWxsIHx8IE1hdGguYWJzKHggLSBmKSA8IE1hdGguYWJzKGJlc3QgLSBmKSkgYmVzdCA9IHg7IH0KICAgICAgb3V0LnB1c2goYmVzdCk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICB2YXIgZWxzID0ge307CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgdmFyIHR1biA9IFRbc3RhdGUudF07CiAgICBlbHMudGxpc3QuaW5uZXJIVE1MID0gJyc7CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGspIHsgZWxzLnRsaXN0LmFwcGVuZENoaWxkKGNoaXAoVFtrXS5uLCBrID09PSBzdGF0ZS50LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnQgPSBrOyBpZiAoVFtrXS5rZXkpIHN0YXRlLmtleSA9IFRba10ua2V5OyByZW5kZXIoKTsgfSkpOyB9KTsKICAgIGVscy52aWV3cy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2Nob3JkcycsIENIT1JEVEFCW1NFVF1dLCBbJ3NjYWxlJywgJ1NjYWxlIG9uIHRoZSBmcmV0Ym9hcmQnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMudmlld3MuYXBwZW5kQ2hpbGQoY2hpcChvWzFdLCBvWzBdID09PSBzdGF0ZS52aWV3LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnZpZXcgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIC8vIHN0cmluZyB0YWJsZSAoaGlnaCBFIG9uIHRvcCBsaWtlIGEgZnJldGJvYXJkKQogICAgZWxzLnN0cmluZ3MuaW5uZXJIVE1MID0gJyc7CiAgICBmb3IgKHZhciBpID0gNTsgaSA-PSAwOyBpLS0pIHsKICAgICAgdmFyIHJ0ID0gcmV0dW5lKGkpLCBpdiA9IGkgPCA1ID8gKHR1bi5tW2kgKyAxXSAtIHR1bi5tW2ldKSA6IG51bGw7CiAgICAgIGVscy5zdHJpbmdzLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHInICsgKHJ0ID8gJyBjaGcnIDogJycpIH0sIFsKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnc24nLCB0ZXh0OiAoNiAtIGkpICsgKGkgPT09IDUgPyAnc3QnIDogaSA9PT0gNCA_ICduZCcgOiBpID09PSAzID8gJ3JkJyA6ICd0aCcpIH0pLAogICAgICAgIGgoJ2InLCB7IHRleHQ6IHR1bi5uYW1lc1tpXSB9KSwKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAncnQnLCB0ZXh0OiBydCB8fCAoc3RhdGUudCA9PT0gJ3N0ZCcgPyAnJyA6ICdubyBjaGFuZ2UnKSB9KQogICAgICBdKSk7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIHZhciBnYXAgPSB0dW4ubVtpXSAtIHR1bi5tW2kgLSAxXTsKICAgICAgICBlbHMuc3RyaW5ncy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaW50JyArIChnYXAgIT09IDUgPyAnIG9kZCcgOiAnJykgfSwgW2goJ3NwYW4nLCB7IHRleHQ6IElOVFtnYXBdIHx8IGdhcCArICcgc3QnLCB0aXRsZTogSU5UX0xPTkdbZ2FwXSB8fCAnJyB9KV0pKTsKICAgICAgfQogICAgfQogICAgZWxzLnRuYW1lLnRleHRDb250ZW50ID0gdHVuLm4gKyAnIHR1bmluZyc7CiAgICBlbHMudHNob3J0LnRleHRDb250ZW50ID0gJ0xvdyB0byBoaWdoOiAnICsgdHVuLnNob3J0OwogICAgdmFyIGdhcHMgPSBbXTsgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspIGdhcHMucHVzaCh0dW4ubVtqICsgMV0gLSB0dW4ubVtqXSk7CiAgICBlbHMudG5vdGUudGV4dENvbnRlbnQgPSBTRVQgPT09ICdhbGw0dGhzJyA_IChnYXBzLmV2ZXJ5KGZ1bmN0aW9uIChnKSB7IHJldHVybiBnID09PSA1OyB9KSA_ICdFdmVyeSBwYWlyIG9mIHN0cmluZ3MgaXMgYSBwZXJmZWN0IDR0aCAoUDQpIGFwYXJ0LCBzbyBzaGFwZXMgbmV2ZXIgY2hhbmdlIGZyb20gc3RyaW5nIHRvIHN0cmluZy4nIDogJ05vdGljZSB0aGUgbWFqb3IgM3JkIChNMykgYmV0d2VlbiB0aGUgRyBhbmQgQiBzdHJpbmdzLiBFdmVyeSBzaGFwZSBoYXMgdG8gc2hpZnQgdGhlcmUuJykgOgogICAgICBTRVQgPT09ICdkcm9wZCcgPyAoc3RhdGUudCA9PT0gJ2Ryb3BkJyA_ICdPbmx5IHRoZSA2dGggc3RyaW5nIGNoYW5nZXM6IGRvd24gYSB3aG9sZSBzdGVwIGZyb20gRSB0byBELCBhbiBvY3RhdmUgYmVsb3cgdGhlIDR0aCBzdHJpbmcuJyA6ICdTdGFuZGFyZCB0dW5pbmcuIFN3aXRjaCB0byBEcm9wIEQgdG8gbG93ZXIgdGhlIDZ0aCBzdHJpbmcuJykgOgogICAgICAodHVuLmNob3JkID8gJ1N0cnVtIGFsbCBzaXggb3BlbiBzdHJpbmdzIGFuZCB5b3UgaGVhciBhICcgKyB0dW4uY2hvcmQgKyAnIG1ham9yIGNob3JkLicgOiAnU3RhbmRhcmQgdHVuaW5nLiBQaWNrIGFuIG9wZW4gdHVuaW5nIHRvIGNvbXBhcmUuJyk7CiAgICAvLyB2aWV3CiAgICBlbHMudmlldy5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzdGF0ZS52aWV3ID09PSAnc2NhbGUnKSByZW5kZXJTY2FsZSh0dW4pOyBlbHNlIHJlbmRlckNob3Jkcyh0dW4pOwogIH0KICBmdW5jdGlvbiByZW5kZXJTY2FsZSh0dW4pIHsKICAgIHZhciBrZXlzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIEtFWVMuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBrZXlzLmFwcGVuZENoaWxkKGNoaXAocHJldHR5KGspLCBrID09PSBzdGF0ZS5rZXksIGZ1bmN0aW9uICgpIHsgc3RhdGUua2V5ID0gazsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CiAgICB2YXIgdCA9IEsucGFyc2VOb3RlKHN0YXRlLmtleSksIE1BSiA9IFswLCAyLCA0LCA1LCA3LCA5LCAxMV07CiAgICB2YXIgc2MgPSBNQUoubWFwKGZ1bmN0aW9uICh4LCBkKSB7IHJldHVybiB7IHBjOiAodC5wYyArIHgpICUgMTIsIG5hbWU6IEsuc3BlbGwodC5sICsgZCwgdC5wYyArIHgpLm5hbWUsIHJvb3Q6IGQgPT09IDAgfTsgfSk7CiAgICB2YXIgbWFya3MgPSBbXTsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgNjsgcysrKSBmb3IgKHZhciBmID0gMDsgZiA8PSAxMjsgZisrKSB7CiAgICAgIHZhciBwYyA9ICh0dW4ubVtzXSArIGYpICUgMTI7CiAgICAgIHNjLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgaWYgKG4ucGMgPT09IHBjKSBtYXJrcy5wdXNoKHsgczogcywgZjogZiwga2luZDogbi5yb290ID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogbi5uYW1lLCBjbGljazogdGFwcGVyKHR1bi5tW3NdICsgZikgfSk7IH0pOwogICAgfQogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXZyb3cnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdNYWpvciBrZXknIH0pLCBrZXlzXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSwgW0suZnJldGJvYXJkKHR1bi5tLCBtYXJrcywgeyBmcmV0czogMTIsIG9wZW5OYW1lczogdHVuLm5hbWVzIH0pXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jZG5vdGUnLCB0ZXh0OiBwcmV0dHkoc3RhdGUua2V5KSArICcgbWFqb3Igc2NhbGUgaW4gJyArIHR1bi5uICsgJyB0dW5pbmcgwrcgZ29sZCA9IHJvb3Qgwrcgc3dpdGNoIHR1bmluZ3MgYWJvdmUgdG8gc2VlIGhvdyB0aGUgc2hhcGVzIG1vdmUnIH0pKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyQ2hvcmRzKHR1bikgewogICAgdmFyIGZyZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzIGNteC1mcmV0cycgfSk7CiAgICB2YXIgbWF4RiA9IDEyOwogICAgZm9yICh2YXIgZiA9IDA7IGYgPD0gbWF4RjsgZisrKSAoZnVuY3Rpb24gKGYpIHsgZnJldHMuYXBwZW5kQ2hpbGQoY2hpcChmID09PSAwID8gJ09wZW4nIDogU3RyaW5nKGYpLCBmID09PSBzdGF0ZS5mcmV0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLmZyZXQgPSBmOyByZW5kZXIoKTsgcGxheUN1cigpOyB9LCAnc20nKSk7IH0pKGYpOwogICAgdmFyIG1hcmtzID0gW10sIHRpdGxlID0gJycsIHN1YiA9ICcnLCBub3RlcyA9IFtdOwogICAgaWYgKFNFVCA9PT0gJ2Ryb3BkJykgewogICAgICB2YXIgc3RycyA9IFswLCAxLCAyXSwgZjAgPSBzdGF0ZS5mcmV0OwogICAgICB2YXIgZHNwID0gcm9vdFNwZWxsKCdEJywgZjAsICh0dW4ubVswXSArIGYwKSAlIDEyKTsKICAgICAgc3Rycy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMCwga2luZDogcyA9PT0gMCB8fCBzID09PSAyID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogaW5DaG9yZChkc3AsICh0dW4ubVtzXSArIGYwKSAlIDEyKSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIGYwKTsgfSk7CiAgICAgIHZhciByb290TiA9IGRzcC5uYW1lOwogICAgICBpZiAoc3RhdGUudCA9PT0gJ2Ryb3BkJykgeyB0aXRsZSA9IHJvb3ROICsgJzUnOyBzdWIgPSBmMCA9PT0gMCA_ICdBbGwgdGhyZWUgbG93IHN0cmluZ3Mgb3BlbjogYSBENSBwb3dlciBjaG9yZC4nIDogJ09uZSBmaW5nZXIgYWNyb3NzIHRoZSA2dGgsIDV0aCBhbmQgNHRoIHN0cmluZ3MgYXQgZnJldCAnICsgZjAgKyAnLic7IH0KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHN0ZCA9IFtmMCwgZjAgKyAyLCBmMCArIDJdOyBtYXJrcyA9IFtdOyBub3RlcyA9IFtdOwogICAgICAgIHN0cnMuZm9yRWFjaChmdW5jdGlvbiAocywgaykgeyBtYXJrcy5wdXNoKHsgczogcywgZjogc3RkW2tdLCBraW5kOiBrID09PSAxID8gJ25vdGUnIDogJ3Jvb3QnLCBsYWJlbDogTkFNRVNbKHR1bi5tW3NdICsgc3RkW2tdKSAlIDEyXSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIHN0ZFtrXSk7IH0pOwogICAgICAgIHRpdGxlID0gTkFNRVNbKHR1bi5tWzBdICsgZjApICUgMTJdICsgJzUnOyBzdWIgPSAnSW4gc3RhbmRhcmQgdHVuaW5nIHRoZSBzYW1lIHBvd2VyIGNob3JkIHRha2VzIHR3byBvciB0aHJlZSBmaW5nZXJzIGFjcm9zcyB0d28gZnJldHMuIFN3aXRjaCB0byBEcm9wIEQgdG8gY29tcGFyZS4nOwogICAgICB9CiAgICB9IGVsc2UgaWYgKFNFVCA9PT0gJ29wZW4nKSB7CiAgICAgIGlmICghdHVuLmNob3JkKSB7CiAgICAgICAgdmFyIHNoYXBlcyA9IHsgMDogWzAsIDMsIDIsIDAsIDEsIDBdIH07CiAgICAgICAgdGl0bGUgPSAnUGljayBhbiBvcGVuIHR1bmluZyc7IHN1YiA9ICdJbiBzdGFuZGFyZCB0dW5pbmcsIGJhcnJpbmcgYSBmcmV0IGRvZXMgbm90IG1ha2UgYSBjaG9yZC4gQ2hvb3NlIE9wZW4gRywgRCwgRSwgQSBvciBDIGFib3ZlLic7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGYxID0gc3RhdGUuZnJldCwgcm9vdFBjID0gKEsucGFyc2VOb3RlKHR1bi5jaG9yZCkucGMgKyBmMSkgJSAxMiwgcnNwID0gcm9vdFNwZWxsKHR1bi5jaG9yZCwgZjEsIHJvb3RQYyk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCA2OyBzKyspIHsgdmFyIHBjID0gKHR1bi5tW3NdICsgZjEpICUgMTI7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMSwga2luZDogcGMgPT09IHJvb3RQYyA_ICdyb290JyA6ICdub3RlJywgbGFiZWw6IGluQ2hvcmQocnNwLCBwYykgfSk7IG5vdGVzLnB1c2godHVuLm1bc10gKyBmMSk7IH0KICAgICAgICB2YXIgcm4gPSB7IDA6ICdJJywgNTogJ0lWJywgNzogJ1YnLCAxMjogJ0knIH1bZjFdOwogICAgICAgIHRpdGxlID0gcnNwLm5hbWUgKyAnIG1ham9yJyArIChybiA_ICcgKCcgKyBybiArICcpJyA6ICcnKTsKICAgICAgICBzdWIgPSBmMSA9PT0gMCA_ICdKdXN0IHN0cnVtOiBhbGwgc2l4IG9wZW4gc3RyaW5ncyBtYWtlIHRoZSAnICsgdHVuLmNob3JkICsgJyBjaG9yZC4nIDogJ0JhcnJlIGV2ZXJ5IHN0cmluZyBhdCBmcmV0ICcgKyBmMSArICcuJyArIChybiA_ICcgVGhhdFwncyB0aGUgJyArIHJuICsgJyBjaG9yZCBpbiAnICsgdHVuLmNob3JkICsgJy4nIDogJyBGcmV0cyA1IGFuZCA3IGdpdmUgeW91IHRoZSBJViBhbmQgViBjaG9yZHMuJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBzZXROYW1lcyA9IFsnNnRo4oCTNXRo4oCTNHRoJywgJzV0aOKAkzR0aOKAkzNyZCcsICc0dGjigJMzcmTigJMybmQnLCAnM3Jk4oCTMm5k4oCTMXN0J107CiAgICAgIHZhciBzZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgICAgc2V0TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgeyBzZXRzLmFwcGVuZENoaWxkKGNoaXAobiwgaSA9PT0gc3RhdGUuc2V0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnNldCA9IGk7IHJlbmRlcigpOyBwbGF5Q3VyKCk7IH0sICdzbScpKTsgfSk7CiAgICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC12cm93JyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnU3RyaW5nIHNldCcgfSksIHNldHNdKSk7CiAgICAgIHZhciBzaGFwZUFsbCA9IFtdOwogICAgICBmb3IgKHZhciBrMiA9IDA7IGsyIDwgNDsgazIrKykgc2hhcGVBbGwucHVzaCh0cmlhZFNoYXBlKHR1bi5tLCBrMiwgc3RhdGUuZnJldCkpOwogICAgICB2YXIgc2ggPSBzaGFwZUFsbFtzdGF0ZS5zZXRdOwogICAgICBzaC5mb3JFYWNoKGZ1bmN0aW9uIChmdiwgaykgeyBpZiAoZnYgIT09IG51bGwpIHsgbWFya3MucHVzaCh7IHM6IHN0YXRlLnNldCArIGssIGY6IGZ2LCBraW5kOiBrID09PSAwID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogWydSJywgJzMnLCAnNSddW2tdIH0pOyBub3Rlcy5wdXNoKHR1bi5tW3N0YXRlLnNldCArIGtdICsgZnYpOyB9IH0pOwogICAgICB0aXRsZSA9IE5BTUVTWyh0dW4ubVtzdGF0ZS5zZXRdICsgc3RhdGUuZnJldCkgJSAxMl0gKyAnIG1ham9yIHRyaWFkJzsKICAgICAgdmFyIHJlbCA9IHNoYXBlQWxsLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLSB4WzBdOyB9KS5qb2luKCcsJyk7IH0pOwogICAgICB2YXIgc2FtZSA9IHJlbC5ldmVyeShmdW5jdGlvbiAocikgeyByZXR1cm4gciA9PT0gcmVsWzBdOyB9KTsKICAgICAgc3ViID0gc2FtZSA_ICdUaGUgZmluZ2VyIHBhdHRlcm4gaXMgaWRlbnRpY2FsIG9uIGV2ZXJ5IHN0cmluZyBzZXQuIE5vdGhpbmcgdG8gcmVsZWFybi4nIDogJ1RoZSBwYXR0ZXJuIGNoYW5nZXMgb24gc3RyaW5nIHNldHMgdGhhdCBjcm9zcyB0aGUgR-KAk0Igc3RyaW5nczogJyArIHJlbC5tYXAoZnVuY3Rpb24gKHIsIGkpIHsgcmV0dXJuIHNldE5hbWVzW2ldICsgJyAoJyArIHIuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHYsIGopIHsgcmV0dXJuIGogPyAodiA-PSAwID8gJysnICsgdiA6IHYpIDogJzAnOyB9KS5qb2luKCcgJykgKyAnKSc7IH0pLmpvaW4oJywgJykgKyAnLic7CiAgICB9CiAgICB2YXIgaGVhZCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaG9yZGhlYWQnIH0sIFtoKCdkaXYnLCB7fSwgW2goJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1iaWcgc20nLCB0ZXh0OiB0aXRsZSB9KSwgaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1zdWIyJywgdGV4dDogc3ViIH0pXSksCiAgICAgIG5vdGVzLmxlbmd0aCA_IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGJsdWUnLCBvbmNsaWNrOiBwbGF5Q3VyIH0sIFsn4pa2IFBsYXknXSkgOiBudWxsXSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdnJvdycgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogU0VUID09PSAnYWxsNHRocycgPyAnUm9vdCBmcmV0JyA6ICdGcmV0JyB9KSwgZnJldHNdKSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoZWFkKTsKICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYndyYXAnIH0sIFtLLmZyZXRib2FyZCh0dW4ubSwgbWFya3MsIHsgZnJldHM6IDEyLCBvcGVuTmFtZXM6IHR1bi5uYW1lcyB9KV0pKTsKICAgIGVscy5jdXIgPSBub3RlczsKICB9CiAgZnVuY3Rpb24gcGxheUN1cigpIHsgaWYgKGVscy5jdXIgJiYgZWxzLmN1ci5sZW5ndGgpIEsucGxheShlbHMuY3VyLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pLCAnc3RydW0nLCB7IGR1cjogMS42IH0pOyB9CiAgZnVuY3Rpb24gdGFwcGVyKG0pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDEsIHZvbDogMC41IH0pOyB9OyB9CiAgZnVuY3Rpb24gc3RydW1PcGVuKCkgeyBLLnBsYXkoVFtzdGF0ZS50XS5tLCAnc3RydW0nLCB7IGR1cjogMiB9KTsgfQogIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIGVscy50bGlzdCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7IGVscy52aWV3cyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMuc3RyaW5ncyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHJpbmdzJyB9KTsgZWxzLnRuYW1lID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7IGVscy50c2hvcnQgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXN1YjInIH0pOyBlbHMudG5vdGUgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXRub3RlJyB9KTsKICAgIGVscy52aWV3ID0gaCgnZGl2Jywge30pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1R1bmluZycgfSksIGVscy50bGlzdF0pKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQgY214LXJlc3VsdCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdGdyaWQnIH0sIFsKICAgICAgICBoKCdkaXYnLCB7fSwgW2Vscy50bmFtZSwgZWxzLnRzaG9ydCwgZWxzLnRub3RlLCBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogc3RydW1PcGVuIH0sIFsn4pa2IFN0cnVtIG9wZW4gc3RyaW5ncyddKV0pLAogICAgICAgIGVscy5zdHJpbmdzCiAgICAgIF0pCiAgICBdKSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbZWxzLnZpZXdzLCBoKCdkaXYnLCB7IHN0eWxlOiAnaGVpZ2h0OjEycHgnIH0pLCBlbHMudmlld10pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/eadgcf-all-4ths-tuning-for-guitar/">EADGCF All 4ths Tuning for Guitar</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1307</post-id>	</item>
		<item>
		<title>What Is the Purpose of Drop D Tuning?</title>
		<link>https://www.cantonmusicacademy.com/what-is-the-purpose-of-drop-d-tuning/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Sun, 10 Nov 2024 12:48:35 +0000</pubDate>
				<category><![CDATA[Adult Music Lessons]]></category>
		<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1267</guid>

					<description><![CDATA[<p>If you&#8217;re a guitarist looking to expand your sound, you may wonder: what is the purpose of Drop D tuning? Drop D is a popular alternate tuning that lowers the 6th string from E down to D, giving you new sounds and easier chord shapes. Switch between standard and Drop D below to see and...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/what-is-the-purpose-of-drop-d-tuning/">What Is the Purpose of Drop D Tuning?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: What Is the Purpose of Drop D Tuning? (interactive)
  URL stays the same: /what-is-the-purpose-of-drop-d-tuning/
  WHERE: Posts → edit the post → delete ALL old blocks → add ONE "Custom HTML"
  block → paste everything below → Update → Delete Cache.
  Post title (H1):        What Is the Purpose of Drop D Tuning?
  Yoast SEO title:        What Is Drop D Tuning For? Interactive Guide + PDFs | Canton Music Academy
  Yoast meta description: Drop D lowers the 6th string to D for a fuller sound and one-finger power chords. Compare it with standard tuning on an interactive fretboard and get free PDFs.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-tgrid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:18px;align-items:start}
.cmx-tgrid .cmx-big{font-size:clamp(1.5rem,4vw,2.1rem)}
.cmx-sub2{margin:4px 0 0!important;color:var(--mut)!important;font-size:.92rem!important;font-weight:600}
.cmx-tnote{margin:10px 0 14px!important;font-size:.95rem!important;color:var(--ink)!important}
.cmx-strings{display:flex;flex-direction:column;background:var(--soft);border-radius:16px;padding:10px 12px}
.cmx-str{display:grid;grid-template-columns:42px 34px 1fr;align-items:center;gap:8px;background:#fff;border:1.5px solid var(--line);border-radius:10px;padding:6px 10px}
.cmx-str .sn{font-size:.7rem;font-weight:800;color:var(--mut)}
.cmx-str b{font-size:1.1rem}
.cmx-str .rt{font-size:.75rem;font-weight:700;color:var(--mut)}
.cmx-str.chg{border-color:#22803f;background:#f0faf4}
.cmx-str.chg .rt{color:#22803f}
.cmx-int{display:flex;justify-content:flex-start;padding:1px 0 1px 54px}
.cmx-int span{font-size:.62rem;font-weight:800;color:var(--mut);background:#fff;border:1px solid var(--line);border-radius:6px;padding:1px 6px}
.cmx-int.odd span{color:#fff;background:#c2410c;border-color:#c2410c}
.cmx-vrow{margin:0 0 12px}
.cmx-frets .cmx-chip{min-width:38px}
.cmx-chordhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px}
.cmx-big.sm{font-size:1.6rem}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-byline{color:var(--mut)!important;font-style:italic}
.cmx-dl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 20px;background:#fff8e8;border:1px solid #f6dfa6;border-radius:18px;padding:18px 20px;margin:18px 0 24px}
.cmx-dl p{margin:0!important}
.cmx-dl b{display:block;font-size:1.05rem}
.cmx-dl .cmx-btns{display:flex;flex-wrap:wrap;gap:8px}
@media (max-width:700px){.cmx-tgrid{grid-template-columns:1fr}}

</style>

<div class="cmx">

<p class="cmx-lead">If you&#8217;re a guitarist looking to expand your sound, you may wonder: what is the purpose of Drop D tuning? Drop D is a popular alternate tuning that lowers the 6th string from E down to D, giving you new sounds and easier chord shapes. Switch between standard and Drop D below to see and hear the difference.</p>

<div class="cmx-tool" id="cmx-tune" data-set="dropd"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the tuning explorer…</p></div>

<h2>Fuller Sound for D Chords</h2>
<p>One of the main reasons guitarists choose Drop D is the richer resonance it gives D chords. In standard tuning a D chord doesn&#8217;t use all six strings, but in Drop D the low D on the 6th string adds a full-bodied bass note to both D major and D minor chords. That powerful bass presence gives your music a depth that&#8217;s hard to get in standard tuning.</p>

<h2>Easy Access to Power Chords</h2>
<p>Drop D is also popular for power chords (5 chords). The 6th, 5th and 4th strings form a power chord with just <b>one finger</b>: barre the 5th fret on those three strings for G5, or the 7th fret for A5. That simplicity makes Drop D a favorite in rock and metal. Tap the frets in the tool above to hear each one, then switch to standard to see how many more fingers the same chord needs.</p>

<h2>Adjusting to New Scale Patterns</h2>
<p>Tuning to Drop D changes the note pattern on the 6th string, which affects familiar scale shapes and chord positions. It can feel confusing at first, but with practice Drop D opens creative possibilities standard tuning can&#8217;t offer. Use the &#8220;Scale on the fretboard&#8221; view to compare a scale in both tunings: everything stays the same except the lowest string.</p>

<h2>Navigating the Fretboard in Drop D</h2>
<p>Most of the fretboard stays the same as standard tuning, but the lower 6th string allows creative voicings and deeper bass lines. For example, in D major the open 6th, 5th and 4th strings make a D5 chord, while the open 3rd, 2nd and 1st strings play Em. As you move up the neck, this pattern reveals unique possibilities for chord arrangements and progressions.</p>

<h2>Conclusion: What Is the Purpose of Drop D Tuning?</h2>
<p>The purpose of Drop D tuning is to unlock a fuller sound, easy power chords and new fretboard patterns. By lowering just one string, Drop D expands your musical palette and lets you explore new depths and tones.</p>

<div class="cmx-dl">
  <p><b>Free Drop D PDFs</b>Fretboard diagrams plus D major and D minor sheet music examples.</p>
  <div class="cmx-btns">
    <a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2024/11/Drop-D-Fretboards.pdf" target="_blank" rel="noopener">⬇ Fretboards</a>
    <a class="cmx-btn ghost" href="https://www.cantonmusicacademy.com/wp-content/uploads/2024/11/Drop-D-D-Major-Example.pdf" target="_blank" rel="noopener">D major example</a>
    <a class="cmx-btn ghost" href="https://www.cantonmusicacademy.com/wp-content/uploads/2024/11/Drop-D-D-Minor-Example.pdf" target="_blank" rel="noopener">D minor example</a>
  </div>
</div>

<h2>Drop D FAQ</h2>
<details><summary>How do I tune to Drop D?</summary><p>Lower only the 6th string a whole step, from E to D. Play the open 4th string (D) and tune the 6th string down until it matches, one octave lower.</p></details>
<details><summary>Is Drop D good for beginners?</summary><p>Yes. One-finger power chords are easy to play, and only one string changes, so everything else you know still works.</p></details>
<details><summary>What songs use Drop D?</summary><p>It&#8217;s common in rock, metal and folk. Any song with a big, low D or heavy riffs on the bottom strings is a good candidate.</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>More tunings: <a href="https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/">open tuning</a> and <a href="https://www.cantonmusicacademy.com/eadgcf-all-4ths-tuning-for-guitar/">EADGCF all-4ths tuning</a>. For a full breakdown of scales, chords and theory, see <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">More on Guitar Theory</a>, or take <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">guitar lessons in Canton</a>. Check out and use <a href="https://www.noteflight.com" target="_blank" rel="noopener">Noteflight.com</a> for writing and exploring sheet music online.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogR3VpdGFyIHR1bmluZyBleHBsb3JlciAoc2hhcmVkIGJ5IERyb3AgRCwgT3BlbiBUdW5pbmcgYW5kIEVBREdDRiBwb3N0cykuIFVzZXMgd2luZG93LkNNSwogICBDb25maWd1cmUgd2l0aCA8ZGl2IGlkPSJjbXgtdHVuZSIgZGF0YS1zZXQ9ImRyb3BkfG9wZW58YWxsNHRocyI-ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC10dW5lJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JykpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScsICcxJyk7CiAgdmFyIEsgPSB3aW5kb3cuQ01LLCBoID0gSy5oOwogIHZhciBTRVQgPSByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1zZXQnKSB8fCAnZHJvcGQnOwogIHZhciBUID0gewogICAgc3RkOiB7IG46ICdTdGFuZGFyZCcsIHNob3J0OiAnRSBBIEQgRyBCIEUnLCBtOiBbNDAsIDQ1LCA1MCwgNTUsIDU5LCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdEJywgJ0cnLCAnQicsICdFJ10gfSwKICAgIGRyb3BkOiB7IG46ICdEcm9wIEQnLCBzaG9ydDogJ0QgQSBEIEcgQiBFJywgbTogWzM4LCA0NSwgNTAsIDU1LCA1OSwgNjRdLCBuYW1lczogWydEJywgJ0EnLCAnRCcsICdHJywgJ0InLCAnRSddLCBrZXk6ICdEJyB9LAogICAgb3Blbkc6IHsgbjogJ09wZW4gRycsIHNob3J0OiAnRCBHIEQgRyBCIEQnLCBtOiBbMzgsIDQzLCA1MCwgNTUsIDU5LCA2Ml0sIG5hbWVzOiBbJ0QnLCAnRycsICdEJywgJ0cnLCAnQicsICdEJ10sIGtleTogJ0cnLCBjaG9yZDogJ0cnIH0sCiAgICBvcGVuRDogeyBuOiAnT3BlbiBEJywgc2hvcnQ6ICdEIEEgRCBG4pmvIEEgRCcsIG06IFszOCwgNDUsIDUwLCA1NCwgNTcsIDYyXSwgbmFtZXM6IFsnRCcsICdBJywgJ0QnLCAnRuKZrycsICdBJywgJ0QnXSwga2V5OiAnRCcsIGNob3JkOiAnRCcgfSwKICAgIG9wZW5FOiB7IG46ICdPcGVuIEUnLCBzaG9ydDogJ0UgQiBFIEfima8gQiBFJywgbTogWzQwLCA0NywgNTIsIDU2LCA1OSwgNjRdLCBuYW1lczogWydFJywgJ0InLCAnRScsICdH4pmvJywgJ0InLCAnRSddLCBrZXk6ICdFJywgY2hvcmQ6ICdFJyB9LAogICAgb3BlbkE6IHsgbjogJ09wZW4gQScsIHNob3J0OiAnRSBBIEUgQSBD4pmvIEUnLCBtOiBbNDAsIDQ1LCA1MiwgNTcsIDYxLCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdFJywgJ0EnLCAnQ-KZrycsICdFJ10sIGtleTogJ0EnLCBjaG9yZDogJ0EnIH0sCiAgICBvcGVuQzogeyBuOiAnT3BlbiBDJywgc2hvcnQ6ICdDIEcgQyBHIEMgRScsIG06IFszNiwgNDMsIDQ4LCA1NSwgNjAsIDY0XSwgbmFtZXM6IFsnQycsICdHJywgJ0MnLCAnRycsICdDJywgJ0UnXSwga2V5OiAnQycsIGNob3JkOiAnQycgfSwKICAgIGFsbDQ6IHsgbjogJ0FsbCA0dGhzIChFQURHQ0YpJywgc2hvcnQ6ICdFIEEgRCBHIEMgRicsIG06IFs0MCwgNDUsIDUwLCA1NSwgNjAsIDY1XSwgbmFtZXM6IFsnRScsICdBJywgJ0QnLCAnRycsICdDJywgJ0YnXSwga2V5OiAnQycgfQogIH07CiAgdmFyIExJU1RTID0geyBkcm9wZDogWydzdGQnLCAnZHJvcGQnXSwgb3BlbjogWydzdGQnLCAnb3BlbkcnLCAnb3BlbkQnLCAnb3BlbkUnLCAnb3BlbkEnLCAnb3BlbkMnXSwgYWxsNHRoczogWydzdGQnLCAnYWxsNCddIH07CiAgdmFyIENIT1JEVEFCID0geyBkcm9wZDogJ09uZS1maW5nZXIgcG93ZXIgY2hvcmRzJywgb3BlbjogJ0JhcnJlID0gbWFqb3IgY2hvcmQnLCBhbGw0dGhzOiAnTW92ZSBhIGNob3JkIHNoYXBlJyB9OwogIHZhciBOQU1FUyA9IFsnQycsICdD4pmvJywgJ0QnLCAnReKZrScsICdFJywgJ0YnLCAnRuKZrycsICdHJywgJ0Hima0nLCAnQScsICdC4pmtJywgJ0InXTsKICB2YXIgS0VZUyA9IFsnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0YnLCAnQmInLCAnRWInXTsKICB2YXIgSU5UID0geyAzOiAnbTMnLCA0OiAnTTMnLCA1OiAnUDQnLCA2OiAnVFQnLCA3OiAnUDUnLCAyOiAnTTInLCA4OiAnbTYnLCA5OiAnTTYnIH07CiAgdmFyIElOVF9MT05HID0geyA0OiAnbWFqb3IgM3JkJywgNTogJ3BlcmZlY3QgNHRoJywgNzogJ3BlcmZlY3QgNXRoJywgMzogJ21pbm9yIDNyZCcsIDI6ICdtYWpvciAybmQnLCA5OiAnbWFqb3IgNnRoJywgODogJ21pbm9yIDZ0aCcgfTsKICB2YXIgbGlzdCA9IExJU1RTW1NFVF0gfHwgTElTVFMuZHJvcGQ7CiAgdmFyIHN0YXRlID0geyB0OiBsaXN0WzFdLCB2aWV3OiAnY2hvcmRzJywga2V5OiBUW2xpc3RbMV1dLmtleSB8fCAnQycsIGZyZXQ6IDUsIHNldDogMCB9OwogIHZhciBTSEFSUEtFWVMgPSB7IEc6IDEsIEQ6IDEsIEE6IDEsIEU6IDEsIEI6IDEgfTsKICBmdW5jdGlvbiByb290U3BlbGwoa2V5TmFtZSwgZiwgcGMpIHsKICAgIHZhciBkZWcgPSB7IDA6IFsxLCAwXSwgNTogWzQsIDVdLCA3OiBbNSwgN10sIDEyOiBbMSwgMF0gfVtmXTsKICAgIGlmIChkZWcpIHJldHVybiBLLm5vdGVBdChLLnBhcnNlTm90ZShrZXlOYW1lKSwgZGVnWzBdLCBkZWdbMV0pOwogICAgdmFyIG9wdHMgPSBbWydDJywgJ0MjJywgJ0QnLCAnRWInLCAnRScsICdGJywgJ0YjJywgJ0cnLCAnQWInLCAnQScsICdCYicsICdCJ11bcGNdLCBbJ0MnLCAnRGInLCAnRCcsICdEIycsICdFJywgJ0YnLCAnR2InLCAnRycsICdHIycsICdBJywgJ0EjJywgJ0InXVtwY11dOwogICAgdmFyIGJlc3QgPSBudWxsLCBicyA9IDk5OwogICAgb3B0cy5mb3JFYWNoKGZ1bmN0aW9uIChubSkgewogICAgICB2YXIgcCA9IEsucGFyc2VOb3RlKG5tKSwgciA9IEsuc3BlbGwocC5sLCBwLnBjKTsKICAgICAgdmFyIHNjID0gTWF0aC5hYnMoci5hKSArIE1hdGguYWJzKEsubm90ZUF0KHIsIDMsIDQpLmEpICsgTWF0aC5hYnMoSy5ub3RlQXQociwgNSwgNykuYSk7CiAgICAgIGlmIChzYyA8IGJzKSB7IGJzID0gc2M7IGJlc3QgPSByOyB9CiAgICB9KTsKICAgIHJldHVybiBiZXN0OwogIH0KICBmdW5jdGlvbiBpbkNob3JkKHJvb3RTcCwgcGMpIHsKICAgIHZhciBpdiA9IChwYyAtIHJvb3RTcC5wYyArIDEyKSAlIDEyLCBkID0geyAwOiAxLCA0OiAzLCAzOiAzLCA3OiA1LCA2OiA1LCA4OiA1IH1baXZdOwogICAgcmV0dXJuIGQgPyBLLm5vdGVBdChyb290U3AsIGQsIGl2KS5uYW1lIDogTkFNRVNbcGNdOwogIH0KICBmdW5jdGlvbiBwcmV0dHkobikgeyByZXR1cm4gbi5yZXBsYWNlKCcjJywgJ-KZrycpLnJlcGxhY2UoL2IkLywgJ-KZrScpOyB9CiAgZnVuY3Rpb24gY2hpcChsYWJlbCwgb24sIGZuLCBjbHMpIHsgcmV0dXJuIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtY2hpcCcgKyAob24gPyAnIG9uJyA6ICcnKSArIChjbHMgPyAnICcgKyBjbHMgOiAnJyksICdhcmlhLXByZXNzZWQnOiBvbiA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZuIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gcmV0dW5lKGkpIHsKICAgIHZhciBkID0gVFtzdGF0ZS50XS5tW2ldIC0gVC5zdGQubVtpXTsKICAgIGlmIChkID09PSAwKSByZXR1cm4gJyc7CiAgICB2YXIgYW10ID0gTWF0aC5hYnMoZCkgPT09IDEgPyAnYSBoYWxmIHN0ZXAnIDogTWF0aC5hYnMoZCkgPT09IDIgPyAnYSB3aG9sZSBzdGVwJyA6IE1hdGguYWJzKGQpICsgJyBoYWxmIHN0ZXBzJzsKICAgIHJldHVybiAoZCA8IDAgPyAn4oaTIGRvd24gJyA6ICfihpEgdXAgJykgKyBhbXQ7CiAgfQogIC8qIG1ham9yIHRyaWFkIChyb290LCAzcmQsIDV0aCkgb24gMyBhZGphY2VudCBzdHJpbmdzLCByb290IG9uIGxvd2VzdCBzdHJpbmcgbmVhciBmcmV0IGYgKi8KICBmdW5jdGlvbiB0cmlhZFNoYXBlKHR1biwgcywgZikgewogICAgdmFyIHIgPSAodHVuW3NdICsgZikgJSAxMiwgd2FudCA9IFtyLCAociArIDQpICUgMTIsIChyICsgNykgJSAxMl0sIG91dCA9IFtmXTsKICAgIGZvciAodmFyIGsgPSAxOyBrIDwgMzsgaysrKSB7CiAgICAgIHZhciBiZXN0ID0gbnVsbDsKICAgICAgZm9yICh2YXIgeCA9IE1hdGgubWF4KDAsIGYgLSA0KTsgeCA8PSBmICsgNTsgeCsrKSBpZiAoKHR1bltzICsga10gKyB4KSAlIDEyID09PSB3YW50W2tdKSB7IGlmIChiZXN0ID09PSBudWxsIHx8IE1hdGguYWJzKHggLSBmKSA8IE1hdGguYWJzKGJlc3QgLSBmKSkgYmVzdCA9IHg7IH0KICAgICAgb3V0LnB1c2goYmVzdCk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICB2YXIgZWxzID0ge307CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgdmFyIHR1biA9IFRbc3RhdGUudF07CiAgICBlbHMudGxpc3QuaW5uZXJIVE1MID0gJyc7CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGspIHsgZWxzLnRsaXN0LmFwcGVuZENoaWxkKGNoaXAoVFtrXS5uLCBrID09PSBzdGF0ZS50LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnQgPSBrOyBpZiAoVFtrXS5rZXkpIHN0YXRlLmtleSA9IFRba10ua2V5OyByZW5kZXIoKTsgfSkpOyB9KTsKICAgIGVscy52aWV3cy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2Nob3JkcycsIENIT1JEVEFCW1NFVF1dLCBbJ3NjYWxlJywgJ1NjYWxlIG9uIHRoZSBmcmV0Ym9hcmQnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMudmlld3MuYXBwZW5kQ2hpbGQoY2hpcChvWzFdLCBvWzBdID09PSBzdGF0ZS52aWV3LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnZpZXcgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIC8vIHN0cmluZyB0YWJsZSAoaGlnaCBFIG9uIHRvcCBsaWtlIGEgZnJldGJvYXJkKQogICAgZWxzLnN0cmluZ3MuaW5uZXJIVE1MID0gJyc7CiAgICBmb3IgKHZhciBpID0gNTsgaSA-PSAwOyBpLS0pIHsKICAgICAgdmFyIHJ0ID0gcmV0dW5lKGkpLCBpdiA9IGkgPCA1ID8gKHR1bi5tW2kgKyAxXSAtIHR1bi5tW2ldKSA6IG51bGw7CiAgICAgIGVscy5zdHJpbmdzLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHInICsgKHJ0ID8gJyBjaGcnIDogJycpIH0sIFsKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnc24nLCB0ZXh0OiAoNiAtIGkpICsgKGkgPT09IDUgPyAnc3QnIDogaSA9PT0gNCA_ICduZCcgOiBpID09PSAzID8gJ3JkJyA6ICd0aCcpIH0pLAogICAgICAgIGgoJ2InLCB7IHRleHQ6IHR1bi5uYW1lc1tpXSB9KSwKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAncnQnLCB0ZXh0OiBydCB8fCAoc3RhdGUudCA9PT0gJ3N0ZCcgPyAnJyA6ICdubyBjaGFuZ2UnKSB9KQogICAgICBdKSk7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIHZhciBnYXAgPSB0dW4ubVtpXSAtIHR1bi5tW2kgLSAxXTsKICAgICAgICBlbHMuc3RyaW5ncy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaW50JyArIChnYXAgIT09IDUgPyAnIG9kZCcgOiAnJykgfSwgW2goJ3NwYW4nLCB7IHRleHQ6IElOVFtnYXBdIHx8IGdhcCArICcgc3QnLCB0aXRsZTogSU5UX0xPTkdbZ2FwXSB8fCAnJyB9KV0pKTsKICAgICAgfQogICAgfQogICAgZWxzLnRuYW1lLnRleHRDb250ZW50ID0gdHVuLm4gKyAnIHR1bmluZyc7CiAgICBlbHMudHNob3J0LnRleHRDb250ZW50ID0gJ0xvdyB0byBoaWdoOiAnICsgdHVuLnNob3J0OwogICAgdmFyIGdhcHMgPSBbXTsgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspIGdhcHMucHVzaCh0dW4ubVtqICsgMV0gLSB0dW4ubVtqXSk7CiAgICBlbHMudG5vdGUudGV4dENvbnRlbnQgPSBTRVQgPT09ICdhbGw0dGhzJyA_IChnYXBzLmV2ZXJ5KGZ1bmN0aW9uIChnKSB7IHJldHVybiBnID09PSA1OyB9KSA_ICdFdmVyeSBwYWlyIG9mIHN0cmluZ3MgaXMgYSBwZXJmZWN0IDR0aCAoUDQpIGFwYXJ0LCBzbyBzaGFwZXMgbmV2ZXIgY2hhbmdlIGZyb20gc3RyaW5nIHRvIHN0cmluZy4nIDogJ05vdGljZSB0aGUgbWFqb3IgM3JkIChNMykgYmV0d2VlbiB0aGUgRyBhbmQgQiBzdHJpbmdzLiBFdmVyeSBzaGFwZSBoYXMgdG8gc2hpZnQgdGhlcmUuJykgOgogICAgICBTRVQgPT09ICdkcm9wZCcgPyAoc3RhdGUudCA9PT0gJ2Ryb3BkJyA_ICdPbmx5IHRoZSA2dGggc3RyaW5nIGNoYW5nZXM6IGRvd24gYSB3aG9sZSBzdGVwIGZyb20gRSB0byBELCBhbiBvY3RhdmUgYmVsb3cgdGhlIDR0aCBzdHJpbmcuJyA6ICdTdGFuZGFyZCB0dW5pbmcuIFN3aXRjaCB0byBEcm9wIEQgdG8gbG93ZXIgdGhlIDZ0aCBzdHJpbmcuJykgOgogICAgICAodHVuLmNob3JkID8gJ1N0cnVtIGFsbCBzaXggb3BlbiBzdHJpbmdzIGFuZCB5b3UgaGVhciBhICcgKyB0dW4uY2hvcmQgKyAnIG1ham9yIGNob3JkLicgOiAnU3RhbmRhcmQgdHVuaW5nLiBQaWNrIGFuIG9wZW4gdHVuaW5nIHRvIGNvbXBhcmUuJyk7CiAgICAvLyB2aWV3CiAgICBlbHMudmlldy5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzdGF0ZS52aWV3ID09PSAnc2NhbGUnKSByZW5kZXJTY2FsZSh0dW4pOyBlbHNlIHJlbmRlckNob3Jkcyh0dW4pOwogIH0KICBmdW5jdGlvbiByZW5kZXJTY2FsZSh0dW4pIHsKICAgIHZhciBrZXlzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIEtFWVMuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBrZXlzLmFwcGVuZENoaWxkKGNoaXAocHJldHR5KGspLCBrID09PSBzdGF0ZS5rZXksIGZ1bmN0aW9uICgpIHsgc3RhdGUua2V5ID0gazsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CiAgICB2YXIgdCA9IEsucGFyc2VOb3RlKHN0YXRlLmtleSksIE1BSiA9IFswLCAyLCA0LCA1LCA3LCA5LCAxMV07CiAgICB2YXIgc2MgPSBNQUoubWFwKGZ1bmN0aW9uICh4LCBkKSB7IHJldHVybiB7IHBjOiAodC5wYyArIHgpICUgMTIsIG5hbWU6IEsuc3BlbGwodC5sICsgZCwgdC5wYyArIHgpLm5hbWUsIHJvb3Q6IGQgPT09IDAgfTsgfSk7CiAgICB2YXIgbWFya3MgPSBbXTsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgNjsgcysrKSBmb3IgKHZhciBmID0gMDsgZiA8PSAxMjsgZisrKSB7CiAgICAgIHZhciBwYyA9ICh0dW4ubVtzXSArIGYpICUgMTI7CiAgICAgIHNjLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgaWYgKG4ucGMgPT09IHBjKSBtYXJrcy5wdXNoKHsgczogcywgZjogZiwga2luZDogbi5yb290ID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogbi5uYW1lLCBjbGljazogdGFwcGVyKHR1bi5tW3NdICsgZikgfSk7IH0pOwogICAgfQogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXZyb3cnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdNYWpvciBrZXknIH0pLCBrZXlzXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSwgW0suZnJldGJvYXJkKHR1bi5tLCBtYXJrcywgeyBmcmV0czogMTIsIG9wZW5OYW1lczogdHVuLm5hbWVzIH0pXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jZG5vdGUnLCB0ZXh0OiBwcmV0dHkoc3RhdGUua2V5KSArICcgbWFqb3Igc2NhbGUgaW4gJyArIHR1bi5uICsgJyB0dW5pbmcgwrcgZ29sZCA9IHJvb3Qgwrcgc3dpdGNoIHR1bmluZ3MgYWJvdmUgdG8gc2VlIGhvdyB0aGUgc2hhcGVzIG1vdmUnIH0pKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyQ2hvcmRzKHR1bikgewogICAgdmFyIGZyZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzIGNteC1mcmV0cycgfSk7CiAgICB2YXIgbWF4RiA9IDEyOwogICAgZm9yICh2YXIgZiA9IDA7IGYgPD0gbWF4RjsgZisrKSAoZnVuY3Rpb24gKGYpIHsgZnJldHMuYXBwZW5kQ2hpbGQoY2hpcChmID09PSAwID8gJ09wZW4nIDogU3RyaW5nKGYpLCBmID09PSBzdGF0ZS5mcmV0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLmZyZXQgPSBmOyByZW5kZXIoKTsgcGxheUN1cigpOyB9LCAnc20nKSk7IH0pKGYpOwogICAgdmFyIG1hcmtzID0gW10sIHRpdGxlID0gJycsIHN1YiA9ICcnLCBub3RlcyA9IFtdOwogICAgaWYgKFNFVCA9PT0gJ2Ryb3BkJykgewogICAgICB2YXIgc3RycyA9IFswLCAxLCAyXSwgZjAgPSBzdGF0ZS5mcmV0OwogICAgICB2YXIgZHNwID0gcm9vdFNwZWxsKCdEJywgZjAsICh0dW4ubVswXSArIGYwKSAlIDEyKTsKICAgICAgc3Rycy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMCwga2luZDogcyA9PT0gMCB8fCBzID09PSAyID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogaW5DaG9yZChkc3AsICh0dW4ubVtzXSArIGYwKSAlIDEyKSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIGYwKTsgfSk7CiAgICAgIHZhciByb290TiA9IGRzcC5uYW1lOwogICAgICBpZiAoc3RhdGUudCA9PT0gJ2Ryb3BkJykgeyB0aXRsZSA9IHJvb3ROICsgJzUnOyBzdWIgPSBmMCA9PT0gMCA_ICdBbGwgdGhyZWUgbG93IHN0cmluZ3Mgb3BlbjogYSBENSBwb3dlciBjaG9yZC4nIDogJ09uZSBmaW5nZXIgYWNyb3NzIHRoZSA2dGgsIDV0aCBhbmQgNHRoIHN0cmluZ3MgYXQgZnJldCAnICsgZjAgKyAnLic7IH0KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHN0ZCA9IFtmMCwgZjAgKyAyLCBmMCArIDJdOyBtYXJrcyA9IFtdOyBub3RlcyA9IFtdOwogICAgICAgIHN0cnMuZm9yRWFjaChmdW5jdGlvbiAocywgaykgeyBtYXJrcy5wdXNoKHsgczogcywgZjogc3RkW2tdLCBraW5kOiBrID09PSAxID8gJ25vdGUnIDogJ3Jvb3QnLCBsYWJlbDogTkFNRVNbKHR1bi5tW3NdICsgc3RkW2tdKSAlIDEyXSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIHN0ZFtrXSk7IH0pOwogICAgICAgIHRpdGxlID0gTkFNRVNbKHR1bi5tWzBdICsgZjApICUgMTJdICsgJzUnOyBzdWIgPSAnSW4gc3RhbmRhcmQgdHVuaW5nIHRoZSBzYW1lIHBvd2VyIGNob3JkIHRha2VzIHR3byBvciB0aHJlZSBmaW5nZXJzIGFjcm9zcyB0d28gZnJldHMuIFN3aXRjaCB0byBEcm9wIEQgdG8gY29tcGFyZS4nOwogICAgICB9CiAgICB9IGVsc2UgaWYgKFNFVCA9PT0gJ29wZW4nKSB7CiAgICAgIGlmICghdHVuLmNob3JkKSB7CiAgICAgICAgdmFyIHNoYXBlcyA9IHsgMDogWzAsIDMsIDIsIDAsIDEsIDBdIH07CiAgICAgICAgdGl0bGUgPSAnUGljayBhbiBvcGVuIHR1bmluZyc7IHN1YiA9ICdJbiBzdGFuZGFyZCB0dW5pbmcsIGJhcnJpbmcgYSBmcmV0IGRvZXMgbm90IG1ha2UgYSBjaG9yZC4gQ2hvb3NlIE9wZW4gRywgRCwgRSwgQSBvciBDIGFib3ZlLic7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGYxID0gc3RhdGUuZnJldCwgcm9vdFBjID0gKEsucGFyc2VOb3RlKHR1bi5jaG9yZCkucGMgKyBmMSkgJSAxMiwgcnNwID0gcm9vdFNwZWxsKHR1bi5jaG9yZCwgZjEsIHJvb3RQYyk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCA2OyBzKyspIHsgdmFyIHBjID0gKHR1bi5tW3NdICsgZjEpICUgMTI7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMSwga2luZDogcGMgPT09IHJvb3RQYyA_ICdyb290JyA6ICdub3RlJywgbGFiZWw6IGluQ2hvcmQocnNwLCBwYykgfSk7IG5vdGVzLnB1c2godHVuLm1bc10gKyBmMSk7IH0KICAgICAgICB2YXIgcm4gPSB7IDA6ICdJJywgNTogJ0lWJywgNzogJ1YnLCAxMjogJ0knIH1bZjFdOwogICAgICAgIHRpdGxlID0gcnNwLm5hbWUgKyAnIG1ham9yJyArIChybiA_ICcgKCcgKyBybiArICcpJyA6ICcnKTsKICAgICAgICBzdWIgPSBmMSA9PT0gMCA_ICdKdXN0IHN0cnVtOiBhbGwgc2l4IG9wZW4gc3RyaW5ncyBtYWtlIHRoZSAnICsgdHVuLmNob3JkICsgJyBjaG9yZC4nIDogJ0JhcnJlIGV2ZXJ5IHN0cmluZyBhdCBmcmV0ICcgKyBmMSArICcuJyArIChybiA_ICcgVGhhdFwncyB0aGUgJyArIHJuICsgJyBjaG9yZCBpbiAnICsgdHVuLmNob3JkICsgJy4nIDogJyBGcmV0cyA1IGFuZCA3IGdpdmUgeW91IHRoZSBJViBhbmQgViBjaG9yZHMuJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBzZXROYW1lcyA9IFsnNnRo4oCTNXRo4oCTNHRoJywgJzV0aOKAkzR0aOKAkzNyZCcsICc0dGjigJMzcmTigJMybmQnLCAnM3Jk4oCTMm5k4oCTMXN0J107CiAgICAgIHZhciBzZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgICAgc2V0TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgeyBzZXRzLmFwcGVuZENoaWxkKGNoaXAobiwgaSA9PT0gc3RhdGUuc2V0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnNldCA9IGk7IHJlbmRlcigpOyBwbGF5Q3VyKCk7IH0sICdzbScpKTsgfSk7CiAgICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC12cm93JyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnU3RyaW5nIHNldCcgfSksIHNldHNdKSk7CiAgICAgIHZhciBzaGFwZUFsbCA9IFtdOwogICAgICBmb3IgKHZhciBrMiA9IDA7IGsyIDwgNDsgazIrKykgc2hhcGVBbGwucHVzaCh0cmlhZFNoYXBlKHR1bi5tLCBrMiwgc3RhdGUuZnJldCkpOwogICAgICB2YXIgc2ggPSBzaGFwZUFsbFtzdGF0ZS5zZXRdOwogICAgICBzaC5mb3JFYWNoKGZ1bmN0aW9uIChmdiwgaykgeyBpZiAoZnYgIT09IG51bGwpIHsgbWFya3MucHVzaCh7IHM6IHN0YXRlLnNldCArIGssIGY6IGZ2LCBraW5kOiBrID09PSAwID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogWydSJywgJzMnLCAnNSddW2tdIH0pOyBub3Rlcy5wdXNoKHR1bi5tW3N0YXRlLnNldCArIGtdICsgZnYpOyB9IH0pOwogICAgICB0aXRsZSA9IE5BTUVTWyh0dW4ubVtzdGF0ZS5zZXRdICsgc3RhdGUuZnJldCkgJSAxMl0gKyAnIG1ham9yIHRyaWFkJzsKICAgICAgdmFyIHJlbCA9IHNoYXBlQWxsLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLSB4WzBdOyB9KS5qb2luKCcsJyk7IH0pOwogICAgICB2YXIgc2FtZSA9IHJlbC5ldmVyeShmdW5jdGlvbiAocikgeyByZXR1cm4gciA9PT0gcmVsWzBdOyB9KTsKICAgICAgc3ViID0gc2FtZSA_ICdUaGUgZmluZ2VyIHBhdHRlcm4gaXMgaWRlbnRpY2FsIG9uIGV2ZXJ5IHN0cmluZyBzZXQuIE5vdGhpbmcgdG8gcmVsZWFybi4nIDogJ1RoZSBwYXR0ZXJuIGNoYW5nZXMgb24gc3RyaW5nIHNldHMgdGhhdCBjcm9zcyB0aGUgR-KAk0Igc3RyaW5nczogJyArIHJlbC5tYXAoZnVuY3Rpb24gKHIsIGkpIHsgcmV0dXJuIHNldE5hbWVzW2ldICsgJyAoJyArIHIuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHYsIGopIHsgcmV0dXJuIGogPyAodiA-PSAwID8gJysnICsgdiA6IHYpIDogJzAnOyB9KS5qb2luKCcgJykgKyAnKSc7IH0pLmpvaW4oJywgJykgKyAnLic7CiAgICB9CiAgICB2YXIgaGVhZCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaG9yZGhlYWQnIH0sIFtoKCdkaXYnLCB7fSwgW2goJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1iaWcgc20nLCB0ZXh0OiB0aXRsZSB9KSwgaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1zdWIyJywgdGV4dDogc3ViIH0pXSksCiAgICAgIG5vdGVzLmxlbmd0aCA_IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGJsdWUnLCBvbmNsaWNrOiBwbGF5Q3VyIH0sIFsn4pa2IFBsYXknXSkgOiBudWxsXSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdnJvdycgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogU0VUID09PSAnYWxsNHRocycgPyAnUm9vdCBmcmV0JyA6ICdGcmV0JyB9KSwgZnJldHNdKSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoZWFkKTsKICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYndyYXAnIH0sIFtLLmZyZXRib2FyZCh0dW4ubSwgbWFya3MsIHsgZnJldHM6IDEyLCBvcGVuTmFtZXM6IHR1bi5uYW1lcyB9KV0pKTsKICAgIGVscy5jdXIgPSBub3RlczsKICB9CiAgZnVuY3Rpb24gcGxheUN1cigpIHsgaWYgKGVscy5jdXIgJiYgZWxzLmN1ci5sZW5ndGgpIEsucGxheShlbHMuY3VyLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pLCAnc3RydW0nLCB7IGR1cjogMS42IH0pOyB9CiAgZnVuY3Rpb24gdGFwcGVyKG0pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDEsIHZvbDogMC41IH0pOyB9OyB9CiAgZnVuY3Rpb24gc3RydW1PcGVuKCkgeyBLLnBsYXkoVFtzdGF0ZS50XS5tLCAnc3RydW0nLCB7IGR1cjogMiB9KTsgfQogIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIGVscy50bGlzdCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7IGVscy52aWV3cyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMuc3RyaW5ncyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHJpbmdzJyB9KTsgZWxzLnRuYW1lID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7IGVscy50c2hvcnQgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXN1YjInIH0pOyBlbHMudG5vdGUgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXRub3RlJyB9KTsKICAgIGVscy52aWV3ID0gaCgnZGl2Jywge30pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1R1bmluZycgfSksIGVscy50bGlzdF0pKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQgY214LXJlc3VsdCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdGdyaWQnIH0sIFsKICAgICAgICBoKCdkaXYnLCB7fSwgW2Vscy50bmFtZSwgZWxzLnRzaG9ydCwgZWxzLnRub3RlLCBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogc3RydW1PcGVuIH0sIFsn4pa2IFN0cnVtIG9wZW4gc3RyaW5ncyddKV0pLAogICAgICAgIGVscy5zdHJpbmdzCiAgICAgIF0pCiAgICBdKSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbZWxzLnZpZXdzLCBoKCdkaXYnLCB7IHN0eWxlOiAnaGVpZ2h0OjEycHgnIH0pLCBlbHMudmlld10pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/what-is-the-purpose-of-drop-d-tuning/">What Is the Purpose of Drop D Tuning?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1267</post-id>	</item>
		<item>
		<title>What Is the Formula for the Harmonic Minor Scale?</title>
		<link>https://www.cantonmusicacademy.com/what-is-the-formula-for-the-harmonic-minor-scale/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Tue, 22 Oct 2024 16:38:19 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Music Lessons]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1262</guid>

					<description><![CDATA[<p>The harmonic minor scale is a unique and expressive scale used across classical, jazz and metal. Its secret is one raised note, the 7th, which changes both its sound and its chords. Compare it with the natural and melodic minor scales below, in any key. Loading the scale explorer… The Formula for the Harmonic Minor...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/what-is-the-formula-for-the-harmonic-minor-scale/">What Is the Formula for the Harmonic Minor Scale?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Harmonic Minor Scale (interactive)
  URL stays the same: /what-is-the-formula-for-the-harmonic-minor-scale/
  WHERE: Posts → edit "What Is the Formula for the Harmonic Minor Scale?" →
  delete ALL old blocks (including the separate YouTube embed and PDF image;
  both are built into this block) → add ONE "Custom HTML" block → paste
  everything below → Update → Delete Cache.
  Post title (H1):        What Is the Formula for the Harmonic Minor Scale?
  Yoast SEO title:        Harmonic Minor Scale Formula, Chords & Free PDF | Canton Music Academy
  Yoast meta description: The harmonic minor formula is W–H–W–W–H–W+H–H. Compare it with natural and melodic minor in any key, hear its chords, and get our free 168-page PDF.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}

.cmx-mood{margin:6px 0 14px!important;color:var(--mut)!important;font-size:.95rem!important}
.cmx-hrow{display:flex;align-items:center;gap:4px;margin:0 0 14px;flex-wrap:nowrap}
.cmx-hn{flex:1 1 0;min-width:0;text-align:center;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:8px 2px}
.cmx-hn b{display:block;font-size:1.2rem}
.cmx-hn span{display:inline-block;font-size:.72rem;font-weight:800;color:var(--b);background:var(--soft);border-radius:999px;padding:1px 7px;margin-top:3px}
.cmx-hn.root{border-color:var(--gold);background:#fff8e8}
.cmx-hn.chg{border-color:#22803f;background:#f0faf4}
.cmx-hn.chg span{background:#22803f;color:#fff}
.cmx-step{flex:none;font-size:.62rem;font-weight:800;color:var(--mut);background:var(--soft);border-radius:6px;padding:3px 4px}
.cmx-step.aug{background:#22803f;color:#fff}
.cmx-chhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:4px 0 8px}
.cmx-chhead .cmx-lbl{margin:0}
.cmx-hchords{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin:0 0 12px}
.cmx-hc{font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:2px;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:8px 2px;cursor:pointer;min-width:0;text-align:center}
.cmx-hc b{font-size:.9rem;color:var(--ink);white-space:nowrap}
.cmx-hc small{font-size:.6rem;color:var(--mut);font-weight:600;line-height:1.15}
.cmx-hc small.rn{font-size:.72rem;font-weight:800;color:var(--b)}
.cmx-hc.chg{border-color:#22803f;background:#f0faf4}
.cmx-hc:hover{border-color:var(--b)}
.cmx-fbhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px}
.cmx-swipe{display:none;font-size:.78rem;font-weight:700;color:var(--mut)}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
#cmx-hm .cmx-kb svg{max-width:520px;margin:0 auto}
.cmx-video{position:relative;aspect-ratio:16/9;border-radius:18px;overflow:hidden;background:#000;margin:10px 0 24px}
.cmx-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.cmx-byline{color:var(--mut)!important;font-style:italic}
.cmx-dl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 20px;background:#fff8e8;border:1px solid #f6dfa6;border-radius:18px;padding:18px 20px;margin:18px 0 24px}
.cmx-dl p{margin:0!important}
.cmx-dl b{display:block;font-size:1.05rem}
@media (max-width:820px){.cmx-swipe{display:inline}}
@media (max-width:640px){
  .cmx-hrow{gap:2px}
  .cmx-hn{padding:6px 0;border-radius:9px}
  .cmx-hn b{font-size:.9rem}
  .cmx-hn span{font-size:.58rem;padding:1px 4px}
  .cmx-step{font-size:.5rem;padding:2px 2px}
  .cmx-hchords{grid-template-columns:repeat(4,1fr)}
}

</style>

<div class="cmx">

<p class="cmx-lead">The harmonic minor scale is a unique and expressive scale used across classical, jazz and metal. Its secret is one raised note, the 7th, which changes both its sound and its chords. Compare it with the natural and melodic minor scales below, in any key.</p>

<div class="cmx-tool" id="cmx-hm"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the scale explorer…</p></div>

<h2>The Formula for the Harmonic Minor Scale</h2>
<p>The formula for the harmonic minor scale is:</p>
<p style="font-size:1.25rem"><b>W – H – W – W – H – (W+H) – H</b></p>
<ul class="wp-block-list">
  <li><b>W</b> is a whole step: two frets on the guitar, or two piano keys including black keys</li>
  <li><b>H</b> is a half step: one fret, or one piano key</li>
  <li><b>W+H</b> is a step and a half, also called an <b>augmented second</b></li>
</ul>
<p>The most notable feature is the raised 7th degree, which creates the augmented second between the 6th and 7th notes and gives the scale its distinctive flavor. In A harmonic minor the notes are <b>A – B – C – D – E – F – G♯ – A</b>.</p>

<h2>How Harmonic Minor Differs From Natural Minor</h2>
<p>The natural minor scale (the Aeolian mode) is the 6th mode of the major scale. Its formula is <b>W – H – W – W – H – W – W</b>. The harmonic minor raises the 7th note, creating melodic tension between the 6th and 7th notes. That augmented second doesn&#8217;t exist anywhere in the major scale system, which is what makes harmonic minor such a powerful tool for new sounds.</p>

<h2>The Purpose of Harmonic Minor in Classical Music</h2>
<p>In the natural minor scale, the 7th note is a whole step below the root, which makes the chord on the 5th degree a <b>minor</b> chord. Raising the 7th turns it into a <b>major</b> V chord, creating a much stronger V – i cadence back to the root, which is vital in classical harmony. Press <b>&#8220;Hear why&#8221;</b> in the tool to hear the difference. The raised 7th also turns the chord on the 3rd degree into an augmented triad.</p>

<h2>Chords Built From the Harmonic Minor Scale</h2>
<p>One of the scale&#8217;s most unique features is the variety of 7th chords it creates, a different type on every degree:</p>
<ol class="wp-block-list">
  <li>Minor-major 7th</li>
  <li>Half-diminished 7th (m7♭5)</li>
  <li>Augmented-major 7th</li>
  <li>Minor 7th</li>
  <li>Dominant 7th</li>
  <li>Major 7th</li>
  <li>Fully diminished 7th</li>
</ol>
<p>These chord qualities open up rich, complex progressions, especially in classical and jazz music. Switch the tool to <b>7th chords</b> and tap each one to hear them.</p>

<h2>Creative Uses of the Harmonic Minor Scale</h2>
<p>The raised 7th adds a touch of exotic tension, often heard in Eastern and Middle Eastern music and in the most dramatic moments of classical pieces. Jazz musicians use it for its harmonic richness, and metal guitarists use it for intense, dark melodic lines.</p>

<div class="cmx-dl">
  <p><b>Free 168-page PDF</b>Every mode of all 12 harmonic minor scales, ready to print.</p>
  <a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2024/10/the-harmonic-minor-modes-in-12-keys.pdf" target="_blank" rel="noopener">⬇ Download the PDF</a>
</div>

<h2>Video: Harmonic Minor Scale Modes</h2>
<div class="cmx-video"><iframe src="https://www.youtube.com/embed/-FMaFrAgdFo" title="Harmonic Minor Scale Modes Free PDF Download" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>

<h2>Conclusion: Why Learn the Harmonic Minor Scale?</h2>
<p>So, what is the formula for the harmonic minor scale? It&#8217;s whole, half, whole, whole, half, augmented second, half, defined by its raised 7th degree. That raised 7th produces a major V chord and opens harmonic possibilities that don&#8217;t exist in the natural minor or major scales. Whether you&#8217;re a classical musician, jazz improviser or metal guitarist, it adds a new dimension to your playing.</p>

<h2>Harmonic Minor FAQ</h2>
<details><summary>What is the difference between harmonic and melodic minor?</summary><p>Harmonic minor raises only the 7th. Melodic minor raises both the 6th and 7th going up, which smooths out the augmented 2nd, and traditionally returns to natural minor coming down.</p></details>
<details><summary>Why does G♯ harmonic minor have an F𝄪 (double sharp)?</summary><p>G♯ minor already has F♯ in its key signature, so raising the 7th makes it F double sharp. It sounds like G, but it&#8217;s written as F𝄪 so every letter name appears once.</p></details>
<details><summary>Which chord does harmonic minor work best over?</summary><p>It&#8217;s especially useful over the V7 chord in a minor key (like E7 in A minor), where its raised 7th becomes the chord&#8217;s major 3rd.</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>Explore more: the <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">interactive mode explorer</a>, the <a href="https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/">open tuning guide</a> and our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Music Theory Guide</a>, or take <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">private lessons at Canton Music Academy</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogSGFybW9uaWMgbWlub3IgZXhwbG9yZXIg4oCUIHVzZXMgd2luZG93LkNNSyAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbXgtaG0nKTsKICBpZiAoIXJvb3QgfHwgcm9vdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknKSkgcmV0dXJuOwogIHJvb3Quc2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JywgJzEnKTsKICB2YXIgSyA9IHdpbmRvdy5DTUssIGggPSBLLmg7CiAgdmFyIFRVTiA9IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgT1BFTiA9IFsnRScsICdBJywgJ0QnLCAnRycsICdCJywgJ0UnXTsKICB2YXIgU0NBTEVTID0gewogICAgbmF0dXJhbDogeyBuOiAnTmF0dXJhbCBtaW5vcicsIHM6IFswLCAyLCAzLCA1LCA3LCA4LCAxMF0sIG5vdGU6ICdUaGUgInBsYWluIiBtaW5vciBzY2FsZSAoQWVvbGlhbikuIEl0cyA3dGggaXMgYSB3aG9sZSBzdGVwIGJlbG93IHRoZSByb290LCBzbyBpdHMgdiBjaG9yZCBpcyBtaW5vci4nIH0sCiAgICBoYXJtb25pYzogeyBuOiAnSGFybW9uaWMgbWlub3InLCBzOiBbMCwgMiwgMywgNSwgNywgOCwgMTFdLCBub3RlOiAnVGhlIDd0aCBpcyByYWlzZWQgYSBoYWxmIHN0ZXAuIFRoYXQgY3JlYXRlcyB0aGUgYXVnbWVudGVkIDJuZCAoVytIKSBiZXR3ZWVuIDYgYW5kIDcsIGFuZCBhIG1ham9yIFYgY2hvcmQuJyB9LAogICAgbWVsb2RpYzogeyBuOiAnTWVsb2RpYyBtaW5vcicsIHM6IFswLCAyLCAzLCA1LCA3LCA5LCAxMV0sIG5vdGU6ICdCb3RoIHRoZSA2dGggYW5kIDd0aCBhcmUgcmFpc2VkIChhc2NlbmRpbmcgZm9ybSkuIEl0IHNtb290aHMgb3V0IHRoZSBhdWdtZW50ZWQgMm5kIGZvciBtZWxvZGllcy4nIH0KICB9OwogIHZhciBLRVlTID0gWydBJywgJ0JiJywgJ0InLCAnQycsICdDIycsICdEJywgJ0ViJywgJ0UnLCAnRicsICdGIycsICdHJywgJ0cjJ107CiAgdmFyIFJPTUFOID0gWydpJywgJ2lpJywgJ2lpaScsICdpdicsICd2JywgJ3ZpJywgJ3ZpaSddOwogIHZhciBRNyA9IHsgJzMsNywxMSc6IFsnbShtYWo3KScsICdNaW5vci1tYWpvciA3dGgnXSwgJzMsNiwxMCc6IFsnbTfima01JywgJ0hhbGYtZGltaW5pc2hlZCA3dGgnXSwgJzQsOCwxMSc6IFsnK21hajcnLCAnQXVnbWVudGVkLW1ham9yIDd0aCddLCAnMyw3LDEwJzogWydtNycsICdNaW5vciA3dGgnXSwgJzQsNywxMCc6IFsnNycsICdEb21pbmFudCA3dGgnXSwgJzQsNywxMSc6IFsnbWFqNycsICdNYWpvciA3dGgnXSwgJzMsNiw5JzogWyfCsDcnLCAnRnVsbHkgZGltaW5pc2hlZCA3dGgnXSB9OwogIHZhciBRMyA9IHsgJzMsNyc6IFsnbScsICdNaW5vciddLCAnNCw3JzogWycnLCAnTWFqb3InXSwgJzMsNic6IFsnwrAnLCAnRGltaW5pc2hlZCddLCAnNCw4JzogWycrJywgJ0F1Z21lbnRlZCddIH07CiAgdmFyIHN0YXRlID0geyBrZXk6ICdBJywgc2NhbGU6ICdoYXJtb25pYycsIHNldjogdHJ1ZSwgbGFiZWxzOiAnbm90ZXMnIH07CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgewogICAgdmFyIG0gPSBsb2NhdGlvbi5oYXNoLm1hdGNoKC9rZXk9KFtBLUddWyNiXT8pLShuYXR1cmFsfGhhcm1vbmljfG1lbG9kaWMpLyk7CiAgICBpZiAobSAmJiBLRVlTLmluZGV4T2YobVsxXSkgPj0gMCkgeyBzdGF0ZS5rZXkgPSBtWzFdOyBzdGF0ZS5zY2FsZSA9IG1bMl07IH0KICB9KSgpOwogIGZ1bmN0aW9uIHByZXR0eShuKSB7IHJldHVybiBuLnJlcGxhY2UoJyMnLCAn4pmvJykucmVwbGFjZSgvYiQvLCAn4pmtJyk7IH0KICBmdW5jdGlvbiBub3RlcygpIHsKICAgIHZhciB0ID0gSy5wYXJzZU5vdGUoc3RhdGUua2V5KSwgc2MgPSBTQ0FMRVNbc3RhdGUuc2NhbGVdLnMsIG5hdCA9IFNDQUxFUy5uYXR1cmFsLnM7CiAgICByZXR1cm4gc2MubWFwKGZ1bmN0aW9uICh4LCBkKSB7IHJldHVybiB7IGRlZzogZCArIDEsIHNlbWlzOiB4LCBub3RlOiBLLm5vdGVBdCh0LCBkICsgMSwgeCksIGxhYmVsOiBLLmRlZ3JlZUxhYmVsKGQgKyAxLCB4KSwgY2hhbmdlZDogeCAhPT0gbmF0W2RdIH07IH0pOwogIH0KICBmdW5jdGlvbiBjaG9yZHMoKSB7CiAgICB2YXIgbnMgPSBub3RlcygpLCBzYyA9IFNDQUxFU1tzdGF0ZS5zY2FsZV0uczsKICAgIHJldHVybiBucy5tYXAoZnVuY3Rpb24gKG4sIGQpIHsKICAgICAgdmFyIGl2ID0gWzIsIDQsIDZdLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gKHNjWyhkICsgaykgJSA3XSAtIHNjW2RdICsgMTIpICUgMTI7IH0pOwogICAgICB2YXIgdHJpID0gUTNbaXZbMF0gKyAnLCcgKyBpdlsxXV0sIHNldiA9IFE3W2l2LmpvaW4oJywnKV07CiAgICAgIHZhciB1cCA9IGl2WzBdID09PSA0LCBybiA9IFJPTUFOW2RdOwogICAgICBybiA9IHVwID8gcm4udG9VcHBlckNhc2UoKSA6IHJuOwogICAgICB2YXIgcnN1ZiA9IHN0YXRlLnNldiA_IChpdi5qb2luKCcsJykgPT09ICczLDYsMTAnID8gJ8O4NycgOiBpdi5qb2luKCcsJykgPT09ICczLDYsOScgPyAnwrA3JyA6IGl2LmpvaW4oJywnKSA9PT0gJzQsOCwxMScgPyAnK21hajcnIDogaXYuam9pbignLCcpID09PSAnMyw3LDExJyA_ICcobWFqNyknIDogaXYuam9pbignLCcpID09PSAnNCw3LDExJyA_ICdtYWo3JyA6ICc3JykgOiAodHJpWzBdID09PSAnwrAnID8gJ8KwJyA6IHRyaVswXSA9PT0gJysnID8gJysnIDogJycpOwogICAgICB2YXIgc3ltID0gc3RhdGUuc2V2ID8gc2V2WzBdIDogdHJpWzBdLCBxbiA9IHN0YXRlLnNldiA_IHNldlsxXSA6IHRyaVsxXTsKICAgICAgdmFyIGJhc2UgPSA0OCArIG4ubm90ZS5wYzsgaWYgKGJhc2UgPCA1MikgYmFzZSArPSAxMjsKICAgICAgdmFyIG1pZHMgPSBbMF0uY29uY2F0KHN0YXRlLnNldiA_IGl2IDogaXYuc2xpY2UoMCwgMikpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gYmFzZSArIHg7IH0pOwogICAgICByZXR1cm4geyBuYW1lOiBuLm5vdGUubmFtZSArIHN5bSwgcm9tYW46IHJuICsgcnN1ZiwgcTogcW4sIG1pZGlzOiBtaWRzLCBjaGFuZ2VkOiBbMCwgMiwgNCwgNl0uc29tZShmdW5jdGlvbiAoaykgeyByZXR1cm4gbnNbKGQgKyBrKSAlIDddLmNoYW5nZWQ7IH0pIH07CiAgICB9KTsKICB9CiAgdmFyIGVscyA9IHt9LCB0aW1lcnMgPSBbXTsKICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBvbiwgZm4sIGNscykgeyByZXR1cm4gaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1jaGlwJyArIChvbiA_ICcgb24nIDogJycpICsgKGNscyA_ICcgJyArIGNscyA6ICcnKSwgJ2FyaWEtcHJlc3NlZCc6IG9uID8gJ3RydWUnIDogJ2ZhbHNlJywgb25jbGljazogZm4gfSwgW2xhYmVsXSk7IH0KICBmdW5jdGlvbiBzdGVwTmFtZShkKSB7IHJldHVybiBkID09PSAxID8gJ0gnIDogZCA9PT0gMiA_ICdXJyA6ICdXK0gnOyB9CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgc3RvcCgpOwogICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsICcja2V5PScgKyBzdGF0ZS5rZXkgKyAnLScgKyBzdGF0ZS5zY2FsZSk7IH0gY2F0Y2ggKGUpIHt9CiAgICBlbHMua2V5cy5pbm5lckhUTUwgPSAnJzsKICAgIEtFWVMuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBlbHMua2V5cy5hcHBlbmRDaGlsZChjaGlwKHByZXR0eShrKSwgayA9PT0gc3RhdGUua2V5LCBmdW5jdGlvbiAoKSB7IHN0YXRlLmtleSA9IGs7IHJlbmRlcigpOyB9LCAnc20nKSk7IH0pOwogICAgZWxzLnRhYnMuaW5uZXJIVE1MID0gJyc7CiAgICBbJ25hdHVyYWwnLCAnaGFybW9uaWMnLCAnbWVsb2RpYyddLmZvckVhY2goZnVuY3Rpb24gKGspIHsgZWxzLnRhYnMuYXBwZW5kQ2hpbGQoY2hpcChTQ0FMRVNba10ubiwgayA9PT0gc3RhdGUuc2NhbGUsIGZ1bmN0aW9uICgpIHsgc3RhdGUuc2NhbGUgPSBrOyByZW5kZXIoKTsgfSkpOyB9KTsKICAgIHZhciBucyA9IG5vdGVzKCksIHNjID0gU0NBTEVTW3N0YXRlLnNjYWxlXS5zOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcHJldHR5KHN0YXRlLmtleSkgKyAnICcgKyBTQ0FMRVNbc3RhdGUuc2NhbGVdLm4udG9Mb3dlckNhc2UoKTsKICAgIGVscy5kZXNjLnRleHRDb250ZW50ID0gU0NBTEVTW3N0YXRlLnNjYWxlXS5ub3RlOwogICAgZWxzLnJvdy5pbm5lckhUTUwgPSAnJzsKICAgIG5zLmNvbmNhdChbeyBub3RlOiBuc1swXS5ub3RlLCBsYWJlbDogJzEnLCBkZWc6IDgsIGNoYW5nZWQ6IGZhbHNlIH1dKS5mb3JFYWNoKGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgIGVscy5yb3cuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWhuJyArIChuLmRlZyA9PT0gMSB8fCBuLmRlZyA9PT0gOCA_ICcgcm9vdCcgOiAnJykgKyAobi5jaGFuZ2VkID8gJyBjaGcnIDogJycpIH0sIFtoKCdiJywgeyB0ZXh0OiBuLm5vdGUubmFtZSB9KSwgaCgnc3BhbicsIHsgdGV4dDogbi5sYWJlbCB9KV0pKTsKICAgICAgaWYgKGkgPCA3KSB7CiAgICAgICAgdmFyIGQgPSAoaSA8IDYgPyBzY1tpICsgMV0gOiAxMikgLSBzY1tpXTsKICAgICAgICBlbHMucm93LmFwcGVuZENoaWxkKGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtc3RlcCcgKyAoZCA9PT0gMyA_ICcgYXVnJyA6ICcnKSB9LCBbc3RlcE5hbWUoZCldKSk7CiAgICAgIH0KICAgIH0pOwogICAgZWxzLmZvcm11bGEudGV4dENvbnRlbnQgPSBzYy5tYXAoZnVuY3Rpb24gKHgsIGkpIHsgcmV0dXJuIHN0ZXBOYW1lKChpIDwgNiA_IHNjW2kgKyAxXSA6IDEyKSAtIHgpOyB9KS5qb2luKCcg4oCTICcpOwogICAgZWxzLnNldi5pbm5lckhUTUwgPSAnJzsKICAgIFtbZmFsc2UsICdUcmlhZHMnXSwgW3RydWUsICc3dGggY2hvcmRzJ11dLmZvckVhY2goZnVuY3Rpb24gKG8pIHsgZWxzLnNldi5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIG9bMF0gPT09IHN0YXRlLnNldiwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5zZXYgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIGVscy5jaG9yZHMuaW5uZXJIVE1MID0gJyc7CiAgICBjaG9yZHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGVscy5jaG9yZHMuYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1oYycgKyAoYy5jaGFuZ2VkICYmIHN0YXRlLnNjYWxlICE9PSAnbmF0dXJhbCcgPyAnIGNoZycgOiAnJyksIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RvcCgpOyBLLnBsYXkoYy5taWRpcywgJ3N0cnVtJyk7IH0gfSwgW2goJ3NtYWxsJywgeyAnY2xhc3MnOiAncm4nLCB0ZXh0OiBjLnJvbWFuIH0pLCBoKCdiJywgeyB0ZXh0OiBjLm5hbWUgfSksIGgoJ3NtYWxsJywgeyB0ZXh0OiBjLnEgfSldKSk7CiAgICB9KTsKICAgIHZhciBvbiA9IHt9LCByb290T2ZmID0gbnVsbCwgYWx0SyA9IHt9LCBzdGFydCA9IDQ4OwogICAgbnMuZm9yRWFjaChmdW5jdGlvbiAobikgeyB2YXIgbSA9IDQ4ICsgSy5wYXJzZU5vdGUoc3RhdGUua2V5KS5wYyArIG4uc2VtaXM7IHZhciBsYWIgPSBzdGF0ZS5sYWJlbHMgPT09ICdub3RlcycgPyBuLm5vdGUubmFtZSA6IG4ubGFiZWw7IG9uW20gLSBzdGFydF0gPSBsYWI7IGlmIChuLmRlZyA9PT0gMSkgcm9vdE9mZiA9IG0gLSBzdGFydDsgaWYgKG4uY2hhbmdlZCkgYWx0S1ttIC0gc3RhcnRdID0gMTsgfSk7CiAgICBvbls0OCArIEsucGFyc2VOb3RlKHN0YXRlLmtleSkucGMgKyAxMiAtIHN0YXJ0XSA9IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG5zWzBdLm5vdGUubmFtZSA6ICcxJzsKICAgIGVscy5rYi5pbm5lckhUTUwgPSAnJzsgZWxzLmtiLmFwcGVuZENoaWxkKEsua2V5Ym9hcmQoeyBvY3RhdmVzOiAyLCBvbjogb24sIHJvb3Q6IHJvb3RPZmYsIGFsdDogYWx0SyB9KSk7CiAgICB2YXIgbWFya3MgPSBbXTsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgNjsgcysrKSBmb3IgKHZhciBmID0gMDsgZiA8PSAxMjsgZisrKSB7CiAgICAgIHZhciBwYyA9IChUVU5bc10gKyBmKSAlIDEyOwogICAgICBucy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGlmIChuLm5vdGUucGMgPT09IHBjKSBtYXJrcy5wdXNoKHsgczogcywgZjogZiwga2luZDogbi5kZWcgPT09IDEgPyAncm9vdCcgOiBuLmNoYW5nZWQgPyAnYWx0JyA6ICdub3RlJywgbGFiZWw6IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG4ubm90ZS5uYW1lIDogbi5sYWJlbCwgY2xpY2s6IHRhcChUVU5bc10gKyBmKSB9KTsgfSk7CiAgICB9CiAgICBlbHMuZmIuaW5uZXJIVE1MID0gJyc7IGVscy5mYi5hcHBlbmRDaGlsZChLLmZyZXRib2FyZChUVU4sIG1hcmtzLCB7IGZyZXRzOiAxMiwgb3Blbk5hbWVzOiBPUEVOIH0pKTsKICAgIGVscy5sYWJzLmlubmVySFRNTCA9ICcnOwogICAgW1snbm90ZXMnLCAnTm90ZSBuYW1lcyddLCBbJ2RlZ3JlZXMnLCAnU2NhbGUgZGVncmVlcyddXS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7IGVscy5sYWJzLmFwcGVuZENoaWxkKGNoaXAob1sxXSwgb1swXSA9PT0gc3RhdGUubGFiZWxzLCBmdW5jdGlvbiAoKSB7IHN0YXRlLmxhYmVscyA9IG9bMF07IHJlbmRlcigpOyB9LCAnc20nKSk7IH0pOwogICAgdmFyIFYgPSBuc1s0XS5ub3RlLm5hbWU7CiAgICBlbHMud2h5LnRleHRDb250ZW50ID0gJ0hlYXIgd2h5OiAnICsgViArICdtIOKGkiAnICsgbnNbMF0ubm90ZS5uYW1lICsgJ20sIHRoZW4gJyArIFYgKyAnIOKGkiAnICsgbnNbMF0ubm90ZS5uYW1lICsgJ20nOwogIH0KICBmdW5jdGlvbiB0YXAobSkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyBLLnBsYXkoW21dLCAnYmxvY2snLCB7IGR1cjogMSwgdm9sOiAwLjUgfSk7IH07IH0KICBmdW5jdGlvbiBzdG9wKCkgeyB0aW1lcnMuZm9yRWFjaChjbGVhclRpbWVvdXQpOyB0aW1lcnMgPSBbXTsgfQogIGZ1bmN0aW9uIHBsYXlTY2FsZSgpIHsKICAgIHN0b3AoKTsKICAgIHZhciBzYyA9IFNDQUxFU1tzdGF0ZS5zY2FsZV0ucywgYiA9IDYwICsgSy5wYXJzZU5vdGUoc3RhdGUua2V5KS5wYzsgaWYgKGIgPiA2NikgYiAtPSAxMjsKICAgIHZhciB1cCA9IHNjLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gYiArIHg7IH0pLmNvbmNhdChbYiArIDEyXSk7CiAgICB2YXIgc2VxID0gc3RhdGUuc2NhbGUgPT09ICdtZWxvZGljJyA_IHVwLmNvbmNhdChTQ0FMRVMubmF0dXJhbC5zLnNsaWNlKCkucmV2ZXJzZSgpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gYiArIHg7IH0pKSA6IHVwLmNvbmNhdCh1cC5zbGljZSgwLCAtMSkucmV2ZXJzZSgpKTsKICAgIHNlcS5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRpbWVycy5wdXNoKHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBLLnBsYXkoW21dLCAnYmxvY2snLCB7IGR1cjogMC41NSwgdm9sOiAwLjQyIH0pOyB9LCBpICogMzIwKSk7IH0pOwogIH0KICBmdW5jdGlvbiBwbGF5V2h5KCkgewogICAgc3RvcCgpOwogICAgdmFyIHIgPSBLLnBhcnNlTm90ZShzdGF0ZS5rZXkpLnBjLCBiID0gNDggKyByOyBpZiAoYiA8IDUyKSBiICs9IDEyOwogICAgdmFyIGkgPSBbYiwgYiArIDMsIGIgKyA3XSwgdiA9IFtiIC0gNSwgYiAtIDIsIGIgKyAyXSwgViA9IFtiIC0gNSwgYiAtIDEsIGIgKyAyXTsKICAgIFtbdiwgMF0sIFtpLCA5MDBdLCBbViwgMjMwMF0sIFtpLCAzMjAwXV0uZm9yRWFjaChmdW5jdGlvbiAoeCkgeyB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KHhbMF0sICdzdHJ1bScsIHsgZHVyOiAxLjEgfSk7IH0sIHhbMV0pKTsgfSk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIGVscy5rZXlzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsgZWxzLnRhYnMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLnRpdGxlID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7IGVscy5kZXNjID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1tb29kJyB9KTsKICAgIGVscy5yb3cgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaHJvdycgfSk7IGVscy5mb3JtdWxhID0gaCgnYicpOwogICAgZWxzLnNldiA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7IGVscy5jaG9yZHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaGNob3JkcycgfSk7CiAgICBlbHMua2IgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgta2InIH0pOyBlbHMuZmIgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmJ3cmFwJyB9KTsgZWxzLmxhYnMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLndoeSA9IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGdob3N0Jywgb25jbGljazogcGxheVdoeSB9KTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQnIH0sIFsKICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnTWlub3Iga2V5JyB9KSwgZWxzLmtleXMsCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgc3R5bGU6ICdtYXJnaW4tdG9wOjE0cHgnLCB0ZXh0OiAnU2NhbGUnIH0pLCBlbHMudGFicwogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCBjbXgtcmVzdWx0JyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1yaGVhZCcgfSwgW2goJ2RpdicsIHt9LCBbZWxzLnRpdGxlXSksIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wbGF5JyB9LCBbaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1idG4gYmx1ZScsIG9uY2xpY2s6IHBsYXlTY2FsZSB9LCBbJ-KWtiBQbGF5IHNjYWxlJ10pXSldKSwKICAgICAgZWxzLmRlc2MsIGVscy5yb3csCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mb3JtdWxhJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnRm9ybXVsYScgfSksIGVscy5mb3JtdWxhLCBoKCdzcGFuJywgeyB0ZXh0OiAnVyA9IHdob2xlIHN0ZXAgwrcgSCA9IGhhbGYgc3RlcCDCtyBXK0ggPSBhdWdtZW50ZWQgMm5kJyB9KV0pLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hoZWFkJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnQ2hvcmRzIGJ1aWx0IG9uIGVhY2ggbm90ZSAodGFwIHRvIGhlYXIpJyB9KSwgZWxzLnNldl0pLAogICAgICBlbHMuY2hvcmRzLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcGxheScsIHN0eWxlOiAnbWFyZ2luOjAgMCAxNnB4JyB9LCBbZWxzLndoeV0pLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmJoZWFkJyB9LCBbZWxzLmxhYnMsIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtc3dpcGUnLCB0ZXh0OiAnU3dpcGUgdG8gc2VlIHRoZSB3aG9sZSBuZWNrIOKGkicgfSldKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJywgc3R5bGU6ICdtYXJnaW4tYm90dG9tOjEwcHgnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdQaWFubycgfSksIGVscy5rYl0pLAogICAgICBlbHMuZmIsCiAgICAgIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtY2Rub3RlJywgdGV4dDogJ0dvbGQgPSByb290IMK3IEdyZWVuID0gbm90ZXMgY2hhbmdlZCBmcm9tIG5hdHVyYWwgbWlub3IgwrcgVGFwIGFueSBub3RlIHRvIGhlYXIgaXQnIH0pCiAgICBdKSk7CiAgICByZW5kZXIoKTsKICB9CiAgYnVpbGQoKTsKfSkoKTsK".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/what-is-the-formula-for-the-harmonic-minor-scale/">What Is the Formula for the Harmonic Minor Scale?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1262</post-id>	</item>
		<item>
		<title>Is It Easier to Play Guitar in Open Tuning?</title>
		<link>https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 00:58:47 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Music Lessons]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1255</guid>

					<description><![CDATA[<p>When asking &#8220;Is it easier to play guitar in open tuning?&#8221;, the answer isn&#8217;t as straightforward as you might think. Open tunings set the strings so that, played open, they form a chord, usually a major chord. Try five popular open tunings below and decide for yourself. Loading the tuning explorer… What Is Open Tuning?...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/">Is It Easier to Play Guitar in Open Tuning?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Is It Easier to Play Guitar in Open Tuning? (interactive)
  URL stays the same: /is-it-easier-to-play-guitar-in-open-tuning/
  WHERE: Posts → edit the post → delete ALL old blocks (including the PDF
  file block) → add ONE "Custom HTML" block → paste everything below →
  Update → Delete Cache.
  Post title (H1):        Is It Easier to Play Guitar in Open Tuning?
  Yoast SEO title:        Is Open Tuning Easier? Open G, D, E, A & C Explained | Canton Music Academy
  Yoast meta description: Hear and compare open G, D, E, A and C tunings on an interactive fretboard. See why barring any fret makes a major chord, and get our free open tuning PDF guide.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}
.cmx .wp-block-table{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 0 1.4em;max-width:100%}
@media (max-width:640px){
  .cmx table{font-size:.8rem}
  .cmx th,.cmx td{padding:7px 7px!important}
}

.cmx-tgrid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:18px;align-items:start}
.cmx-tgrid .cmx-big{font-size:clamp(1.5rem,4vw,2.1rem)}
.cmx-sub2{margin:4px 0 0!important;color:var(--mut)!important;font-size:.92rem!important;font-weight:600}
.cmx-tnote{margin:10px 0 14px!important;font-size:.95rem!important;color:var(--ink)!important}
.cmx-strings{display:flex;flex-direction:column;background:var(--soft);border-radius:16px;padding:10px 12px}
.cmx-str{display:grid;grid-template-columns:42px 34px 1fr;align-items:center;gap:8px;background:#fff;border:1.5px solid var(--line);border-radius:10px;padding:6px 10px}
.cmx-str .sn{font-size:.7rem;font-weight:800;color:var(--mut)}
.cmx-str b{font-size:1.1rem}
.cmx-str .rt{font-size:.75rem;font-weight:700;color:var(--mut)}
.cmx-str.chg{border-color:#22803f;background:#f0faf4}
.cmx-str.chg .rt{color:#22803f}
.cmx-int{display:flex;justify-content:flex-start;padding:1px 0 1px 54px}
.cmx-int span{font-size:.62rem;font-weight:800;color:var(--mut);background:#fff;border:1px solid var(--line);border-radius:6px;padding:1px 6px}
.cmx-int.odd span{color:#fff;background:#c2410c;border-color:#c2410c}
.cmx-vrow{margin:0 0 12px}
.cmx-frets .cmx-chip{min-width:38px}
.cmx-chordhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px}
.cmx-big.sm{font-size:1.6rem}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-byline{color:var(--mut)!important;font-style:italic}
.cmx-dl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px 20px;background:#fff8e8;border:1px solid #f6dfa6;border-radius:18px;padding:18px 20px;margin:18px 0 24px}
.cmx-dl p{margin:0!important}
.cmx-dl b{display:block;font-size:1.05rem}
.cmx-dl .cmx-btns{display:flex;flex-wrap:wrap;gap:8px}
@media (max-width:700px){.cmx-tgrid{grid-template-columns:1fr}}

</style>

<div class="cmx">

<p class="cmx-lead">When asking &#8220;Is it easier to play guitar in open tuning?&#8221;, the answer isn&#8217;t as straightforward as you might think. Open tunings set the strings so that, played open, they form a chord, usually a major chord. Try five popular open tunings below and decide for yourself.</p>

<div class="cmx-tool" id="cmx-tune" data-set="open"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the tuning explorer…</p></div>

<h2>What Is Open Tuning?</h2>
<p>In standard tuning, guitarists reach major and minor chords with fingerings that change from chord to chord. Open tuning offers a unique advantage: full chords without complex fingerings. When the guitar is tuned to an open major chord, simply <b>barring the 5th fret</b> forms the IV chord and <b>barring the 7th fret</b> forms the V chord. That makes songs built on those chords much easier to play. Tap frets 5 and 7 in the tool to hear it.</p>
<p>For this article we focus on open tunings that form a major chord: Open G (D G D G B D), Open D (D A D F♯ A D), Open E (E B E G♯ B E), Open A (E A E A C♯ E) and Open C (C G C G C E).</p>

<h2>Is It Easier to Play Guitar in Open Tuning?</h2>
<p>Not for every chord. Minor and diminished chords need more intricate fingerings, because their notes are spread across different frets. So open tuning makes some chords easier and others harder, and progressions outside the major key can take more effort.</p>

<h2>Should Beginners Try Open Tuning?</h2>
<p>It can be a helpful starting point for making pleasing sounds with less effort. But open tunings mean frequent retuning, which raises the risk of breaking strings. The string chart in the tool shows exactly which strings change and by how much. Experimenting with open tunings is a fun way to explore new sounds, even if it isn&#8217;t always easier than standard tuning.</p>

<h2>Conclusion: Is It Easier to Play Guitar in Open Tuning?</h2>
<p>It depends on your goals. Open tuning simplifies some chords and complicates others, but it&#8217;s a creative tool well worth trying.</p>

<div class="cmx-dl">
  <p><b>Free Open Tuning Guide (PDF)</b>Tips for retuning your guitar to open tunings.</p>
  <a class="cmx-btn gold" href="https://www.cantonmusicacademy.com/wp-content/uploads/2024/10/Open-Tuning-Guide.pdf" target="_blank" rel="noopener">⬇ Download the guide</a>
</div>

<h2>Open Tuning FAQ</h2>
<details><summary>Which open tuning should I try first?</summary><p>Open G and Open D are the most popular. Open G only changes three strings from standard tuning, so it&#8217;s quick to try.</p></details>
<details><summary>Will retuning damage my guitar?</summary><p>Not if you retune gradually and don&#8217;t tune strings far above their normal pitch. Tunings like Open E and Open A raise some strings, so they put a bit more tension on the neck and strings.</p></details>
<details><summary>Why are slide guitarists so fond of open tunings?</summary><p>Because a slide lays across every string at one fret, exactly like a barre, and in an open tuning that gives you a full major chord anywhere on the neck.</p></details>

<p class="cmx-byline">by Henry Bahrou – Guitarist, Music Theorist, Music Academy Director</p>

<p>More reading: <a href="https://www.cantonmusicacademy.com/what-is-the-purpose-of-drop-d-tuning/">Drop D tuning</a>, <a href="https://www.cantonmusicacademy.com/eadgcf-all-4ths-tuning-for-guitar/">EADGCF all-4ths tuning</a> and our <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">blog post on modes</a>. See <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">private guitar lessons at Canton Music Academy</a> and <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">more guitar theory info</a>. <a href="https://www.noteflight.com" target="_blank" rel="noopener">Noteflight</a> is great cloud-based notation software for composing and creating exercises.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogR3VpdGFyIHR1bmluZyBleHBsb3JlciAoc2hhcmVkIGJ5IERyb3AgRCwgT3BlbiBUdW5pbmcgYW5kIEVBREdDRiBwb3N0cykuIFVzZXMgd2luZG93LkNNSwogICBDb25maWd1cmUgd2l0aCA8ZGl2IGlkPSJjbXgtdHVuZSIgZGF0YS1zZXQ9ImRyb3BkfG9wZW58YWxsNHRocyI-ICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC10dW5lJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWR5JykpIHJldHVybjsKICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScsICcxJyk7CiAgdmFyIEsgPSB3aW5kb3cuQ01LLCBoID0gSy5oOwogIHZhciBTRVQgPSByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1zZXQnKSB8fCAnZHJvcGQnOwogIHZhciBUID0gewogICAgc3RkOiB7IG46ICdTdGFuZGFyZCcsIHNob3J0OiAnRSBBIEQgRyBCIEUnLCBtOiBbNDAsIDQ1LCA1MCwgNTUsIDU5LCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdEJywgJ0cnLCAnQicsICdFJ10gfSwKICAgIGRyb3BkOiB7IG46ICdEcm9wIEQnLCBzaG9ydDogJ0QgQSBEIEcgQiBFJywgbTogWzM4LCA0NSwgNTAsIDU1LCA1OSwgNjRdLCBuYW1lczogWydEJywgJ0EnLCAnRCcsICdHJywgJ0InLCAnRSddLCBrZXk6ICdEJyB9LAogICAgb3Blbkc6IHsgbjogJ09wZW4gRycsIHNob3J0OiAnRCBHIEQgRyBCIEQnLCBtOiBbMzgsIDQzLCA1MCwgNTUsIDU5LCA2Ml0sIG5hbWVzOiBbJ0QnLCAnRycsICdEJywgJ0cnLCAnQicsICdEJ10sIGtleTogJ0cnLCBjaG9yZDogJ0cnIH0sCiAgICBvcGVuRDogeyBuOiAnT3BlbiBEJywgc2hvcnQ6ICdEIEEgRCBG4pmvIEEgRCcsIG06IFszOCwgNDUsIDUwLCA1NCwgNTcsIDYyXSwgbmFtZXM6IFsnRCcsICdBJywgJ0QnLCAnRuKZrycsICdBJywgJ0QnXSwga2V5OiAnRCcsIGNob3JkOiAnRCcgfSwKICAgIG9wZW5FOiB7IG46ICdPcGVuIEUnLCBzaG9ydDogJ0UgQiBFIEfima8gQiBFJywgbTogWzQwLCA0NywgNTIsIDU2LCA1OSwgNjRdLCBuYW1lczogWydFJywgJ0InLCAnRScsICdH4pmvJywgJ0InLCAnRSddLCBrZXk6ICdFJywgY2hvcmQ6ICdFJyB9LAogICAgb3BlbkE6IHsgbjogJ09wZW4gQScsIHNob3J0OiAnRSBBIEUgQSBD4pmvIEUnLCBtOiBbNDAsIDQ1LCA1MiwgNTcsIDYxLCA2NF0sIG5hbWVzOiBbJ0UnLCAnQScsICdFJywgJ0EnLCAnQ-KZrycsICdFJ10sIGtleTogJ0EnLCBjaG9yZDogJ0EnIH0sCiAgICBvcGVuQzogeyBuOiAnT3BlbiBDJywgc2hvcnQ6ICdDIEcgQyBHIEMgRScsIG06IFszNiwgNDMsIDQ4LCA1NSwgNjAsIDY0XSwgbmFtZXM6IFsnQycsICdHJywgJ0MnLCAnRycsICdDJywgJ0UnXSwga2V5OiAnQycsIGNob3JkOiAnQycgfSwKICAgIGFsbDQ6IHsgbjogJ0FsbCA0dGhzIChFQURHQ0YpJywgc2hvcnQ6ICdFIEEgRCBHIEMgRicsIG06IFs0MCwgNDUsIDUwLCA1NSwgNjAsIDY1XSwgbmFtZXM6IFsnRScsICdBJywgJ0QnLCAnRycsICdDJywgJ0YnXSwga2V5OiAnQycgfQogIH07CiAgdmFyIExJU1RTID0geyBkcm9wZDogWydzdGQnLCAnZHJvcGQnXSwgb3BlbjogWydzdGQnLCAnb3BlbkcnLCAnb3BlbkQnLCAnb3BlbkUnLCAnb3BlbkEnLCAnb3BlbkMnXSwgYWxsNHRoczogWydzdGQnLCAnYWxsNCddIH07CiAgdmFyIENIT1JEVEFCID0geyBkcm9wZDogJ09uZS1maW5nZXIgcG93ZXIgY2hvcmRzJywgb3BlbjogJ0JhcnJlID0gbWFqb3IgY2hvcmQnLCBhbGw0dGhzOiAnTW92ZSBhIGNob3JkIHNoYXBlJyB9OwogIHZhciBOQU1FUyA9IFsnQycsICdD4pmvJywgJ0QnLCAnReKZrScsICdFJywgJ0YnLCAnRuKZrycsICdHJywgJ0Hima0nLCAnQScsICdC4pmtJywgJ0InXTsKICB2YXIgS0VZUyA9IFsnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0YnLCAnQmInLCAnRWInXTsKICB2YXIgSU5UID0geyAzOiAnbTMnLCA0OiAnTTMnLCA1OiAnUDQnLCA2OiAnVFQnLCA3OiAnUDUnLCAyOiAnTTInLCA4OiAnbTYnLCA5OiAnTTYnIH07CiAgdmFyIElOVF9MT05HID0geyA0OiAnbWFqb3IgM3JkJywgNTogJ3BlcmZlY3QgNHRoJywgNzogJ3BlcmZlY3QgNXRoJywgMzogJ21pbm9yIDNyZCcsIDI6ICdtYWpvciAybmQnLCA5OiAnbWFqb3IgNnRoJywgODogJ21pbm9yIDZ0aCcgfTsKICB2YXIgbGlzdCA9IExJU1RTW1NFVF0gfHwgTElTVFMuZHJvcGQ7CiAgdmFyIHN0YXRlID0geyB0OiBsaXN0WzFdLCB2aWV3OiAnY2hvcmRzJywga2V5OiBUW2xpc3RbMV1dLmtleSB8fCAnQycsIGZyZXQ6IDUsIHNldDogMCB9OwogIHZhciBTSEFSUEtFWVMgPSB7IEc6IDEsIEQ6IDEsIEE6IDEsIEU6IDEsIEI6IDEgfTsKICBmdW5jdGlvbiByb290U3BlbGwoa2V5TmFtZSwgZiwgcGMpIHsKICAgIHZhciBkZWcgPSB7IDA6IFsxLCAwXSwgNTogWzQsIDVdLCA3OiBbNSwgN10sIDEyOiBbMSwgMF0gfVtmXTsKICAgIGlmIChkZWcpIHJldHVybiBLLm5vdGVBdChLLnBhcnNlTm90ZShrZXlOYW1lKSwgZGVnWzBdLCBkZWdbMV0pOwogICAgdmFyIG9wdHMgPSBbWydDJywgJ0MjJywgJ0QnLCAnRWInLCAnRScsICdGJywgJ0YjJywgJ0cnLCAnQWInLCAnQScsICdCYicsICdCJ11bcGNdLCBbJ0MnLCAnRGInLCAnRCcsICdEIycsICdFJywgJ0YnLCAnR2InLCAnRycsICdHIycsICdBJywgJ0EjJywgJ0InXVtwY11dOwogICAgdmFyIGJlc3QgPSBudWxsLCBicyA9IDk5OwogICAgb3B0cy5mb3JFYWNoKGZ1bmN0aW9uIChubSkgewogICAgICB2YXIgcCA9IEsucGFyc2VOb3RlKG5tKSwgciA9IEsuc3BlbGwocC5sLCBwLnBjKTsKICAgICAgdmFyIHNjID0gTWF0aC5hYnMoci5hKSArIE1hdGguYWJzKEsubm90ZUF0KHIsIDMsIDQpLmEpICsgTWF0aC5hYnMoSy5ub3RlQXQociwgNSwgNykuYSk7CiAgICAgIGlmIChzYyA8IGJzKSB7IGJzID0gc2M7IGJlc3QgPSByOyB9CiAgICB9KTsKICAgIHJldHVybiBiZXN0OwogIH0KICBmdW5jdGlvbiBpbkNob3JkKHJvb3RTcCwgcGMpIHsKICAgIHZhciBpdiA9IChwYyAtIHJvb3RTcC5wYyArIDEyKSAlIDEyLCBkID0geyAwOiAxLCA0OiAzLCAzOiAzLCA3OiA1LCA2OiA1LCA4OiA1IH1baXZdOwogICAgcmV0dXJuIGQgPyBLLm5vdGVBdChyb290U3AsIGQsIGl2KS5uYW1lIDogTkFNRVNbcGNdOwogIH0KICBmdW5jdGlvbiBwcmV0dHkobikgeyByZXR1cm4gbi5yZXBsYWNlKCcjJywgJ-KZrycpLnJlcGxhY2UoL2IkLywgJ-KZrScpOyB9CiAgZnVuY3Rpb24gY2hpcChsYWJlbCwgb24sIGZuLCBjbHMpIHsgcmV0dXJuIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtY2hpcCcgKyAob24gPyAnIG9uJyA6ICcnKSArIChjbHMgPyAnICcgKyBjbHMgOiAnJyksICdhcmlhLXByZXNzZWQnOiBvbiA_ICd0cnVlJyA6ICdmYWxzZScsIG9uY2xpY2s6IGZuIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gcmV0dW5lKGkpIHsKICAgIHZhciBkID0gVFtzdGF0ZS50XS5tW2ldIC0gVC5zdGQubVtpXTsKICAgIGlmIChkID09PSAwKSByZXR1cm4gJyc7CiAgICB2YXIgYW10ID0gTWF0aC5hYnMoZCkgPT09IDEgPyAnYSBoYWxmIHN0ZXAnIDogTWF0aC5hYnMoZCkgPT09IDIgPyAnYSB3aG9sZSBzdGVwJyA6IE1hdGguYWJzKGQpICsgJyBoYWxmIHN0ZXBzJzsKICAgIHJldHVybiAoZCA8IDAgPyAn4oaTIGRvd24gJyA6ICfihpEgdXAgJykgKyBhbXQ7CiAgfQogIC8qIG1ham9yIHRyaWFkIChyb290LCAzcmQsIDV0aCkgb24gMyBhZGphY2VudCBzdHJpbmdzLCByb290IG9uIGxvd2VzdCBzdHJpbmcgbmVhciBmcmV0IGYgKi8KICBmdW5jdGlvbiB0cmlhZFNoYXBlKHR1biwgcywgZikgewogICAgdmFyIHIgPSAodHVuW3NdICsgZikgJSAxMiwgd2FudCA9IFtyLCAociArIDQpICUgMTIsIChyICsgNykgJSAxMl0sIG91dCA9IFtmXTsKICAgIGZvciAodmFyIGsgPSAxOyBrIDwgMzsgaysrKSB7CiAgICAgIHZhciBiZXN0ID0gbnVsbDsKICAgICAgZm9yICh2YXIgeCA9IE1hdGgubWF4KDAsIGYgLSA0KTsgeCA8PSBmICsgNTsgeCsrKSBpZiAoKHR1bltzICsga10gKyB4KSAlIDEyID09PSB3YW50W2tdKSB7IGlmIChiZXN0ID09PSBudWxsIHx8IE1hdGguYWJzKHggLSBmKSA8IE1hdGguYWJzKGJlc3QgLSBmKSkgYmVzdCA9IHg7IH0KICAgICAgb3V0LnB1c2goYmVzdCk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICB2YXIgZWxzID0ge307CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgdmFyIHR1biA9IFRbc3RhdGUudF07CiAgICBlbHMudGxpc3QuaW5uZXJIVE1MID0gJyc7CiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGspIHsgZWxzLnRsaXN0LmFwcGVuZENoaWxkKGNoaXAoVFtrXS5uLCBrID09PSBzdGF0ZS50LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnQgPSBrOyBpZiAoVFtrXS5rZXkpIHN0YXRlLmtleSA9IFRba10ua2V5OyByZW5kZXIoKTsgfSkpOyB9KTsKICAgIGVscy52aWV3cy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2Nob3JkcycsIENIT1JEVEFCW1NFVF1dLCBbJ3NjYWxlJywgJ1NjYWxlIG9uIHRoZSBmcmV0Ym9hcmQnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMudmlld3MuYXBwZW5kQ2hpbGQoY2hpcChvWzFdLCBvWzBdID09PSBzdGF0ZS52aWV3LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnZpZXcgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIC8vIHN0cmluZyB0YWJsZSAoaGlnaCBFIG9uIHRvcCBsaWtlIGEgZnJldGJvYXJkKQogICAgZWxzLnN0cmluZ3MuaW5uZXJIVE1MID0gJyc7CiAgICBmb3IgKHZhciBpID0gNTsgaSA-PSAwOyBpLS0pIHsKICAgICAgdmFyIHJ0ID0gcmV0dW5lKGkpLCBpdiA9IGkgPCA1ID8gKHR1bi5tW2kgKyAxXSAtIHR1bi5tW2ldKSA6IG51bGw7CiAgICAgIGVscy5zdHJpbmdzLmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHInICsgKHJ0ID8gJyBjaGcnIDogJycpIH0sIFsKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAnc24nLCB0ZXh0OiAoNiAtIGkpICsgKGkgPT09IDUgPyAnc3QnIDogaSA9PT0gNCA_ICduZCcgOiBpID09PSAzID8gJ3JkJyA6ICd0aCcpIH0pLAogICAgICAgIGgoJ2InLCB7IHRleHQ6IHR1bi5uYW1lc1tpXSB9KSwKICAgICAgICBoKCdzcGFuJywgeyAnY2xhc3MnOiAncnQnLCB0ZXh0OiBydCB8fCAoc3RhdGUudCA9PT0gJ3N0ZCcgPyAnJyA6ICdubyBjaGFuZ2UnKSB9KQogICAgICBdKSk7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIHZhciBnYXAgPSB0dW4ubVtpXSAtIHR1bi5tW2kgLSAxXTsKICAgICAgICBlbHMuc3RyaW5ncy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtaW50JyArIChnYXAgIT09IDUgPyAnIG9kZCcgOiAnJykgfSwgW2goJ3NwYW4nLCB7IHRleHQ6IElOVFtnYXBdIHx8IGdhcCArICcgc3QnLCB0aXRsZTogSU5UX0xPTkdbZ2FwXSB8fCAnJyB9KV0pKTsKICAgICAgfQogICAgfQogICAgZWxzLnRuYW1lLnRleHRDb250ZW50ID0gdHVuLm4gKyAnIHR1bmluZyc7CiAgICBlbHMudHNob3J0LnRleHRDb250ZW50ID0gJ0xvdyB0byBoaWdoOiAnICsgdHVuLnNob3J0OwogICAgdmFyIGdhcHMgPSBbXTsgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspIGdhcHMucHVzaCh0dW4ubVtqICsgMV0gLSB0dW4ubVtqXSk7CiAgICBlbHMudG5vdGUudGV4dENvbnRlbnQgPSBTRVQgPT09ICdhbGw0dGhzJyA_IChnYXBzLmV2ZXJ5KGZ1bmN0aW9uIChnKSB7IHJldHVybiBnID09PSA1OyB9KSA_ICdFdmVyeSBwYWlyIG9mIHN0cmluZ3MgaXMgYSBwZXJmZWN0IDR0aCAoUDQpIGFwYXJ0LCBzbyBzaGFwZXMgbmV2ZXIgY2hhbmdlIGZyb20gc3RyaW5nIHRvIHN0cmluZy4nIDogJ05vdGljZSB0aGUgbWFqb3IgM3JkIChNMykgYmV0d2VlbiB0aGUgRyBhbmQgQiBzdHJpbmdzLiBFdmVyeSBzaGFwZSBoYXMgdG8gc2hpZnQgdGhlcmUuJykgOgogICAgICBTRVQgPT09ICdkcm9wZCcgPyAoc3RhdGUudCA9PT0gJ2Ryb3BkJyA_ICdPbmx5IHRoZSA2dGggc3RyaW5nIGNoYW5nZXM6IGRvd24gYSB3aG9sZSBzdGVwIGZyb20gRSB0byBELCBhbiBvY3RhdmUgYmVsb3cgdGhlIDR0aCBzdHJpbmcuJyA6ICdTdGFuZGFyZCB0dW5pbmcuIFN3aXRjaCB0byBEcm9wIEQgdG8gbG93ZXIgdGhlIDZ0aCBzdHJpbmcuJykgOgogICAgICAodHVuLmNob3JkID8gJ1N0cnVtIGFsbCBzaXggb3BlbiBzdHJpbmdzIGFuZCB5b3UgaGVhciBhICcgKyB0dW4uY2hvcmQgKyAnIG1ham9yIGNob3JkLicgOiAnU3RhbmRhcmQgdHVuaW5nLiBQaWNrIGFuIG9wZW4gdHVuaW5nIHRvIGNvbXBhcmUuJyk7CiAgICAvLyB2aWV3CiAgICBlbHMudmlldy5pbm5lckhUTUwgPSAnJzsKICAgIGlmIChzdGF0ZS52aWV3ID09PSAnc2NhbGUnKSByZW5kZXJTY2FsZSh0dW4pOyBlbHNlIHJlbmRlckNob3Jkcyh0dW4pOwogIH0KICBmdW5jdGlvbiByZW5kZXJTY2FsZSh0dW4pIHsKICAgIHZhciBrZXlzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIEtFWVMuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBrZXlzLmFwcGVuZENoaWxkKGNoaXAocHJldHR5KGspLCBrID09PSBzdGF0ZS5rZXksIGZ1bmN0aW9uICgpIHsgc3RhdGUua2V5ID0gazsgcmVuZGVyKCk7IH0sICdzbScpKTsgfSk7CiAgICB2YXIgdCA9IEsucGFyc2VOb3RlKHN0YXRlLmtleSksIE1BSiA9IFswLCAyLCA0LCA1LCA3LCA5LCAxMV07CiAgICB2YXIgc2MgPSBNQUoubWFwKGZ1bmN0aW9uICh4LCBkKSB7IHJldHVybiB7IHBjOiAodC5wYyArIHgpICUgMTIsIG5hbWU6IEsuc3BlbGwodC5sICsgZCwgdC5wYyArIHgpLm5hbWUsIHJvb3Q6IGQgPT09IDAgfTsgfSk7CiAgICB2YXIgbWFya3MgPSBbXTsKICAgIGZvciAodmFyIHMgPSAwOyBzIDwgNjsgcysrKSBmb3IgKHZhciBmID0gMDsgZiA8PSAxMjsgZisrKSB7CiAgICAgIHZhciBwYyA9ICh0dW4ubVtzXSArIGYpICUgMTI7CiAgICAgIHNjLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgaWYgKG4ucGMgPT09IHBjKSBtYXJrcy5wdXNoKHsgczogcywgZjogZiwga2luZDogbi5yb290ID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogbi5uYW1lLCBjbGljazogdGFwcGVyKHR1bi5tW3NdICsgZikgfSk7IH0pOwogICAgfQogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXZyb3cnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdNYWpvciBrZXknIH0pLCBrZXlzXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSwgW0suZnJldGJvYXJkKHR1bi5tLCBtYXJrcywgeyBmcmV0czogMTIsIG9wZW5OYW1lczogdHVuLm5hbWVzIH0pXSkpOwogICAgZWxzLnZpZXcuYXBwZW5kQ2hpbGQoaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jZG5vdGUnLCB0ZXh0OiBwcmV0dHkoc3RhdGUua2V5KSArICcgbWFqb3Igc2NhbGUgaW4gJyArIHR1bi5uICsgJyB0dW5pbmcgwrcgZ29sZCA9IHJvb3Qgwrcgc3dpdGNoIHR1bmluZ3MgYWJvdmUgdG8gc2VlIGhvdyB0aGUgc2hhcGVzIG1vdmUnIH0pKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyQ2hvcmRzKHR1bikgewogICAgdmFyIGZyZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzIGNteC1mcmV0cycgfSk7CiAgICB2YXIgbWF4RiA9IDEyOwogICAgZm9yICh2YXIgZiA9IDA7IGYgPD0gbWF4RjsgZisrKSAoZnVuY3Rpb24gKGYpIHsgZnJldHMuYXBwZW5kQ2hpbGQoY2hpcChmID09PSAwID8gJ09wZW4nIDogU3RyaW5nKGYpLCBmID09PSBzdGF0ZS5mcmV0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLmZyZXQgPSBmOyByZW5kZXIoKTsgcGxheUN1cigpOyB9LCAnc20nKSk7IH0pKGYpOwogICAgdmFyIG1hcmtzID0gW10sIHRpdGxlID0gJycsIHN1YiA9ICcnLCBub3RlcyA9IFtdOwogICAgaWYgKFNFVCA9PT0gJ2Ryb3BkJykgewogICAgICB2YXIgc3RycyA9IFswLCAxLCAyXSwgZjAgPSBzdGF0ZS5mcmV0OwogICAgICB2YXIgZHNwID0gcm9vdFNwZWxsKCdEJywgZjAsICh0dW4ubVswXSArIGYwKSAlIDEyKTsKICAgICAgc3Rycy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMCwga2luZDogcyA9PT0gMCB8fCBzID09PSAyID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogaW5DaG9yZChkc3AsICh0dW4ubVtzXSArIGYwKSAlIDEyKSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIGYwKTsgfSk7CiAgICAgIHZhciByb290TiA9IGRzcC5uYW1lOwogICAgICBpZiAoc3RhdGUudCA9PT0gJ2Ryb3BkJykgeyB0aXRsZSA9IHJvb3ROICsgJzUnOyBzdWIgPSBmMCA9PT0gMCA_ICdBbGwgdGhyZWUgbG93IHN0cmluZ3Mgb3BlbjogYSBENSBwb3dlciBjaG9yZC4nIDogJ09uZSBmaW5nZXIgYWNyb3NzIHRoZSA2dGgsIDV0aCBhbmQgNHRoIHN0cmluZ3MgYXQgZnJldCAnICsgZjAgKyAnLic7IH0KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHN0ZCA9IFtmMCwgZjAgKyAyLCBmMCArIDJdOyBtYXJrcyA9IFtdOyBub3RlcyA9IFtdOwogICAgICAgIHN0cnMuZm9yRWFjaChmdW5jdGlvbiAocywgaykgeyBtYXJrcy5wdXNoKHsgczogcywgZjogc3RkW2tdLCBraW5kOiBrID09PSAxID8gJ25vdGUnIDogJ3Jvb3QnLCBsYWJlbDogTkFNRVNbKHR1bi5tW3NdICsgc3RkW2tdKSAlIDEyXSB9KTsgbm90ZXMucHVzaCh0dW4ubVtzXSArIHN0ZFtrXSk7IH0pOwogICAgICAgIHRpdGxlID0gTkFNRVNbKHR1bi5tWzBdICsgZjApICUgMTJdICsgJzUnOyBzdWIgPSAnSW4gc3RhbmRhcmQgdHVuaW5nIHRoZSBzYW1lIHBvd2VyIGNob3JkIHRha2VzIHR3byBvciB0aHJlZSBmaW5nZXJzIGFjcm9zcyB0d28gZnJldHMuIFN3aXRjaCB0byBEcm9wIEQgdG8gY29tcGFyZS4nOwogICAgICB9CiAgICB9IGVsc2UgaWYgKFNFVCA9PT0gJ29wZW4nKSB7CiAgICAgIGlmICghdHVuLmNob3JkKSB7CiAgICAgICAgdmFyIHNoYXBlcyA9IHsgMDogWzAsIDMsIDIsIDAsIDEsIDBdIH07CiAgICAgICAgdGl0bGUgPSAnUGljayBhbiBvcGVuIHR1bmluZyc7IHN1YiA9ICdJbiBzdGFuZGFyZCB0dW5pbmcsIGJhcnJpbmcgYSBmcmV0IGRvZXMgbm90IG1ha2UgYSBjaG9yZC4gQ2hvb3NlIE9wZW4gRywgRCwgRSwgQSBvciBDIGFib3ZlLic7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGYxID0gc3RhdGUuZnJldCwgcm9vdFBjID0gKEsucGFyc2VOb3RlKHR1bi5jaG9yZCkucGMgKyBmMSkgJSAxMiwgcnNwID0gcm9vdFNwZWxsKHR1bi5jaG9yZCwgZjEsIHJvb3RQYyk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCA2OyBzKyspIHsgdmFyIHBjID0gKHR1bi5tW3NdICsgZjEpICUgMTI7IG1hcmtzLnB1c2goeyBzOiBzLCBmOiBmMSwga2luZDogcGMgPT09IHJvb3RQYyA_ICdyb290JyA6ICdub3RlJywgbGFiZWw6IGluQ2hvcmQocnNwLCBwYykgfSk7IG5vdGVzLnB1c2godHVuLm1bc10gKyBmMSk7IH0KICAgICAgICB2YXIgcm4gPSB7IDA6ICdJJywgNTogJ0lWJywgNzogJ1YnLCAxMjogJ0knIH1bZjFdOwogICAgICAgIHRpdGxlID0gcnNwLm5hbWUgKyAnIG1ham9yJyArIChybiA_ICcgKCcgKyBybiArICcpJyA6ICcnKTsKICAgICAgICBzdWIgPSBmMSA9PT0gMCA_ICdKdXN0IHN0cnVtOiBhbGwgc2l4IG9wZW4gc3RyaW5ncyBtYWtlIHRoZSAnICsgdHVuLmNob3JkICsgJyBjaG9yZC4nIDogJ0JhcnJlIGV2ZXJ5IHN0cmluZyBhdCBmcmV0ICcgKyBmMSArICcuJyArIChybiA_ICcgVGhhdFwncyB0aGUgJyArIHJuICsgJyBjaG9yZCBpbiAnICsgdHVuLmNob3JkICsgJy4nIDogJyBGcmV0cyA1IGFuZCA3IGdpdmUgeW91IHRoZSBJViBhbmQgViBjaG9yZHMuJyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBzZXROYW1lcyA9IFsnNnRo4oCTNXRo4oCTNHRoJywgJzV0aOKAkzR0aOKAkzNyZCcsICc0dGjigJMzcmTigJMybmQnLCAnM3Jk4oCTMm5k4oCTMXN0J107CiAgICAgIHZhciBzZXRzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgICAgc2V0TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgeyBzZXRzLmFwcGVuZENoaWxkKGNoaXAobiwgaSA9PT0gc3RhdGUuc2V0LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnNldCA9IGk7IHJlbmRlcigpOyBwbGF5Q3VyKCk7IH0sICdzbScpKTsgfSk7CiAgICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC12cm93JyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnU3RyaW5nIHNldCcgfSksIHNldHNdKSk7CiAgICAgIHZhciBzaGFwZUFsbCA9IFtdOwogICAgICBmb3IgKHZhciBrMiA9IDA7IGsyIDwgNDsgazIrKykgc2hhcGVBbGwucHVzaCh0cmlhZFNoYXBlKHR1bi5tLCBrMiwgc3RhdGUuZnJldCkpOwogICAgICB2YXIgc2ggPSBzaGFwZUFsbFtzdGF0ZS5zZXRdOwogICAgICBzaC5mb3JFYWNoKGZ1bmN0aW9uIChmdiwgaykgeyBpZiAoZnYgIT09IG51bGwpIHsgbWFya3MucHVzaCh7IHM6IHN0YXRlLnNldCArIGssIGY6IGZ2LCBraW5kOiBrID09PSAwID8gJ3Jvb3QnIDogJ25vdGUnLCBsYWJlbDogWydSJywgJzMnLCAnNSddW2tdIH0pOyBub3Rlcy5wdXNoKHR1bi5tW3N0YXRlLnNldCArIGtdICsgZnYpOyB9IH0pOwogICAgICB0aXRsZSA9IE5BTUVTWyh0dW4ubVtzdGF0ZS5zZXRdICsgc3RhdGUuZnJldCkgJSAxMl0gKyAnIG1ham9yIHRyaWFkJzsKICAgICAgdmFyIHJlbCA9IHNoYXBlQWxsLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgLSB4WzBdOyB9KS5qb2luKCcsJyk7IH0pOwogICAgICB2YXIgc2FtZSA9IHJlbC5ldmVyeShmdW5jdGlvbiAocikgeyByZXR1cm4gciA9PT0gcmVsWzBdOyB9KTsKICAgICAgc3ViID0gc2FtZSA_ICdUaGUgZmluZ2VyIHBhdHRlcm4gaXMgaWRlbnRpY2FsIG9uIGV2ZXJ5IHN0cmluZyBzZXQuIE5vdGhpbmcgdG8gcmVsZWFybi4nIDogJ1RoZSBwYXR0ZXJuIGNoYW5nZXMgb24gc3RyaW5nIHNldHMgdGhhdCBjcm9zcyB0aGUgR-KAk0Igc3RyaW5nczogJyArIHJlbC5tYXAoZnVuY3Rpb24gKHIsIGkpIHsgcmV0dXJuIHNldE5hbWVzW2ldICsgJyAoJyArIHIuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHYsIGopIHsgcmV0dXJuIGogPyAodiA-PSAwID8gJysnICsgdiA6IHYpIDogJzAnOyB9KS5qb2luKCcgJykgKyAnKSc7IH0pLmpvaW4oJywgJykgKyAnLic7CiAgICB9CiAgICB2YXIgaGVhZCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaG9yZGhlYWQnIH0sIFtoKCdkaXYnLCB7fSwgW2goJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1iaWcgc20nLCB0ZXh0OiB0aXRsZSB9KSwgaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1zdWIyJywgdGV4dDogc3ViIH0pXSksCiAgICAgIG5vdGVzLmxlbmd0aCA_IGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGJsdWUnLCBvbmNsaWNrOiBwbGF5Q3VyIH0sIFsn4pa2IFBsYXknXSkgOiBudWxsXSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdnJvdycgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogU0VUID09PSAnYWxsNHRocycgPyAnUm9vdCBmcmV0JyA6ICdGcmV0JyB9KSwgZnJldHNdKSk7CiAgICBlbHMudmlldy5hcHBlbmRDaGlsZChoZWFkKTsKICAgIGVscy52aWV3LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mYndyYXAnIH0sIFtLLmZyZXRib2FyZCh0dW4ubSwgbWFya3MsIHsgZnJldHM6IDEyLCBvcGVuTmFtZXM6IHR1bi5uYW1lcyB9KV0pKTsKICAgIGVscy5jdXIgPSBub3RlczsKICB9CiAgZnVuY3Rpb24gcGxheUN1cigpIHsgaWYgKGVscy5jdXIgJiYgZWxzLmN1ci5sZW5ndGgpIEsucGxheShlbHMuY3VyLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pLCAnc3RydW0nLCB7IGR1cjogMS42IH0pOyB9CiAgZnVuY3Rpb24gdGFwcGVyKG0pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDEsIHZvbDogMC41IH0pOyB9OyB9CiAgZnVuY3Rpb24gc3RydW1PcGVuKCkgeyBLLnBsYXkoVFtzdGF0ZS50XS5tLCAnc3RydW0nLCB7IGR1cjogMiB9KTsgfQogIGZ1bmN0aW9uIGJ1aWxkKCkgewogICAgcm9vdC5pbm5lckhUTUwgPSAnJzsKICAgIGVscy50bGlzdCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7IGVscy52aWV3cyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMuc3RyaW5ncyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1zdHJpbmdzJyB9KTsgZWxzLnRuYW1lID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7IGVscy50c2hvcnQgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXN1YjInIH0pOyBlbHMudG5vdGUgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXRub3RlJyB9KTsKICAgIGVscy52aWV3ID0gaCgnZGl2Jywge30pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1R1bmluZycgfSksIGVscy50bGlzdF0pKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNhcmQgY214LXJlc3VsdCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtdGdyaWQnIH0sIFsKICAgICAgICBoKCdkaXYnLCB7fSwgW2Vscy50bmFtZSwgZWxzLnRzaG9ydCwgZWxzLnRub3RlLCBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogc3RydW1PcGVuIH0sIFsn4pa2IFN0cnVtIG9wZW4gc3RyaW5ncyddKV0pLAogICAgICAgIGVscy5zdHJpbmdzCiAgICAgIF0pCiAgICBdKSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbZWxzLnZpZXdzLCBoKCdkaXYnLCB7IHN0eWxlOiAnaGVpZ2h0OjEycHgnIH0pLCBlbHMudmlld10pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZCgpOwp9KSgpOwo=".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/is-it-easier-to-play-guitar-in-open-tuning/">Is It Easier to Play Guitar in Open Tuning?</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1255</post-id>	</item>
		<item>
		<title>Why Should I Learn Modes? (Interactive Mode Explorer)</title>
		<link>https://www.cantonmusicacademy.com/why-should-i-learn-modes/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Tue, 08 Oct 2024 12:33:17 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Piano]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1197</guid>

					<description><![CDATA[<p>As a guitarist, you&#8217;ve likely heard the term modes thrown around in discussions about theory or improvisation. If you&#8217;re anything like me, when you first encountered modes, it may have felt like a confusing new layer to an already complex subject. But once you hear them, modes become powerful tools that unlock new ways to...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">Why Should I Learn Modes? (Interactive Mode Explorer)</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Why Should I Learn Modes? (interactive)
  URL stays the same: /why-should-i-learn-modes/
  WHERE: Posts → edit "Why Should I Learn Modes?" → delete ALL old blocks
  (including the separate YouTube embed; the video is built into this block)
  → add ONE "Custom HTML" block → paste everything below → Update → Delete Cache.
  Post title (H1):        Why Should I Learn Modes? (Interactive Mode Explorer)
  Yoast SEO title:        Why Learn Modes? Hear All 7 Musical Modes | Canton Music Academy
  Yoast meta description: Hear and see all 7 modes, from bright Lydian to dark Locrian, in any key. Learn each mode's formula, characteristic note and sound on piano and guitar.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}
.cmx a.cmx-btn{text-decoration:none!important}
.cmx a.cmx-btn.gold{color:var(--ink)!important}
.cmx a.cmx-btn.blue{color:#fff!important}

.cmx-modes{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.cmx-mode{font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:2px;background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:9px 4px;cursor:pointer;min-width:0;text-align:center}
.cmx-mode b{font-size:.88rem;color:var(--ink)}
.cmx-mode small{font-size:.62rem;color:var(--mut);font-weight:600;line-height:1.2}
.cmx-mode:hover{border-color:var(--b)}
.cmx-mode.on{background:var(--b);border-color:var(--b)}
.cmx-mode.on b,.cmx-mode.on small{color:#fff}
.cmx-parent{margin:6px 0 0!important;color:var(--mut)!important;font-size:.95rem!important}
.cmx-parent b{color:var(--ink)}
.cmx-mood{margin:0 0 14px!important;font-weight:600;color:var(--ink)!important;font-size:.98rem!important}
.cmx-ladder{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin:0 0 16px}
.cmx-rung{font-family:inherit;border:0;border-radius:8px;padding:8px 2px;font-size:.72rem;font-weight:800;cursor:pointer;opacity:.8;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmx-rung.on{opacity:1;outline:3px solid var(--b);outline-offset:1px}
.cmx-notes-7 .cmx-note{flex:1 1 0;min-width:0;padding:10px 2px;max-width:none}
.cmx-notes-7 .cmx-note b{font-size:1.25rem}
.cmx-note.char{border-color:#22803f;background:#f0faf4}
.cmx-note.char .deg{background:#22803f;color:#fff}
.cmx-charline{margin:0 0 14px!important;font-size:.92rem!important;color:var(--ink)!important}
.cmx-dot{display:inline-block;width:10px;height:10px;border-radius:50%;background:#22803f;margin-right:8px;vertical-align:0}
.cmx-fbhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px}
.cmx-swipe{display:none;font-size:.78rem;font-weight:700;color:var(--mut)}
.cmx-fbwrap{background:#fff;border:1px solid var(--line);padding:6px}
.cmx-video{position:relative;aspect-ratio:16/9;border-radius:18px;overflow:hidden;background:#000;margin:10px 0 24px}
.cmx-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.cmx-byline{color:var(--mut)!important;font-style:italic}
@media (max-width:820px){.cmx-swipe{display:inline}}
@media (max-width:640px){
  .cmx-modes{grid-template-columns:repeat(4,1fr)}
  .cmx-ladder{grid-template-columns:repeat(7,1fr);gap:2px}
  .cmx-rung{font-size:.56rem;padding:7px 0}
  .cmx-notes-7{gap:4px}
  .cmx-notes-7 .cmx-note b{font-size:1rem}
}
#cmx-modes .cmx-kb svg{max-width:520px;margin:0 auto}

</style>

<div class="cmx">

<p class="cmx-lead">As a guitarist, you&#8217;ve likely heard the term <b>modes</b> thrown around in discussions about theory or improvisation. If you&#8217;re anything like me, when you first encountered modes, it may have felt like a confusing new layer to an already complex subject. But once you hear them, modes become powerful tools that unlock new ways to express yourself. Try them below.</p>

<div class="cmx-tool" id="cmx-modes"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the mode explorer…</p></div>

<h2>What Are Modes?</h2>
<p>A mode is a scale created from a parent scale by starting on a different note while keeping the same notes. For example, take the C major scale (C, D, E, F, G, A, B) and start on D, and you get the Dorian mode (D, E, F, G, A, B, C). The same idea applies to all seven modes, each starting on a different degree of the major scale:</p>
<ol class="wp-block-list">
  <li><b>Ionian</b> (the major scale)</li>
  <li><b>Dorian</b></li>
  <li><b>Phrygian</b></li>
  <li><b>Lydian</b></li>
  <li><b>Mixolydian</b></li>
  <li><b>Aeolian</b> (the natural minor scale)</li>
  <li><b>Locrian</b></li>
</ol>
<p>Even though the notes are shared, each mode sounds different because a different note becomes &#8220;home.&#8221; The explorer above lets you hear that by playing each mode over a drone on its root. Listen for the green <b>characteristic note</b>, the one note that gives each mode its personality.</p>

<h2>Why Modes Matter for Musicians</h2>
<h3>Expand your harmonic and melodic vocabulary</h3>
<p>Each mode has its own distinctive sound and mood. Dorian has a jazzy minor feel with a bright 6th, while Phrygian has an exotic, almost Spanish vibe with its flattened 2nd. Learning modes gives you a broader palette for everything from jazz and fusion to rock and metal.</p>
<h3>Improve your soloing</h3>
<p>Many guitarists hit a wall when soloing, defaulting to minor pentatonic or major scale shapes. Modes give you a fresh framework. Over a minor progression, instead of sticking to Aeolian (natural minor), try Dorian for a more colorful sound. Mixolydian is great over dominant 7th chords, giving your playing a bluesy or funky edge.</p>
<h3>Unlock new chord progressions</h3>
<p>Each mode implies a different harmonic landscape. Lydian&#8217;s raised 4th, for example, opens up chord possibilities that sound more unique than standard major and minor progressions.</p>
<h3>Better understand music theory</h3>
<p>Modes are a gateway to deeper theory. Instead of just memorizing patterns on the fretboard, you start to understand how harmony and melody interact, which helps you communicate with other musicians, write more sophisticated music, and even teach.</p>
<h3>Adapt to different genres</h3>
<p>Jazz guitarists frequently use Dorian and Mixolydian. Rock and metal players often reach for Phrygian and Locrian for darker, more aggressive sounds. Knowing modes makes you more versatile in any style.</p>

<h2>Video: Breaking Down the Mode Formula</h2>
<p>Check out my video for a deeper dive into modes and how to start using them in your music today.</p>
<div class="cmx-video"><iframe src="https://www.youtube.com/embed/W4YYO63jEsY" title="Major Scale Modes: Breaking Down the Mode Formula and Why Guitar Players Should Understand Them" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>

<h2>Modes FAQ</h2>
<details><summary>Which mode should I learn first?</summary><p>Start with Dorian and Mixolydian. They&#8217;re each one note away from the minor and major scales you already know, and they&#8217;re used constantly in rock, blues, funk and jazz.</p></details>
<details><summary>Are modes just the major scale starting on a different note?</summary><p>They use the same notes, but what makes a mode is which note feels like home. That&#8217;s why hearing a mode over a drone or a chord on its root is the best way to learn its sound.</p></details>
<details><summary>What&#8217;s the brightest and darkest mode?</summary><p>Lydian is the brightest and Locrian is the darkest. In between, from bright to dark: Ionian, Mixolydian, Dorian, Aeolian and Phrygian.</p></details>
<details><summary>Do modes work on piano and other instruments?</summary><p>Yes. Modes are part of music theory for every instrument; the explorer shows them on both piano and guitar.</p></details>

<p class="cmx-byline">By Henry Bahrou, Guitarist, Music Theorist, Music Academy School Director</p>

<p>Explore <a href="https://www.cantonmusicacademy.com/guitar-lessons-in-canton-mi/">guitar lessons for all ages</a> at Canton Music Academy, try the <a href="https://www.cantonmusicacademy.com/minor-pentatonic-scales/">minor pentatonic fretboard</a> and <a href="https://www.cantonmusicacademy.com/circle-of-fifths-chart/">interactive circle of fifths</a>, or visit our <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Guitar Theory Hub</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290LCBhbHQgPSBvcHRzLmFsdCB8fCB7fTsKICAgIGZ1bmN0aW9uIGtjKG4pIHsgcmV0dXJuIG4gPT09IHJvb3QgPyAnI0YyQjIzMycgOiBhbHRbbl0gPyAnIzIyODAzZicgOiAnIzA0NzdCRic7IH0KICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb2N0OyBvKyspIFdJLmZvckVhY2goZnVuY3Rpb24gKHNlbSwgaSkgewogICAgICB2YXIgbiA9IG8gKiAxMiArIHNlbSwgeCA9IChvICogNyArIGkpICogd3cgKyAwLjUsIGhpdCA9IG9uW25dICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgsIHk6IDAuNSwgd2lkdGg6IHd3LCBoZWlnaHQ6IHdoLCByeDogNCwgZmlsbDogaGl0ID8ga2MobikgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyBrYyhuMikgOiAnIzFBMjAyQycsIHN0cm9rZTogJyMxQTIwMkMnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQyICYmIG9uW24yXSkgcygndGV4dCcsIHsgeDogeDIgKyBidyAvIDIsIHk6IGJoIC0gOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiA5LjUsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbjIgPT09IHJvb3QgPyAnIzFBMjAyQycgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBvbltuMl0pOwogICAgfQogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogZnJldHRlZCBjaG9yZCBkaWFncmFtOiBmcmV0cyBhcnJheSBsb3ctPmhpZ2ggKC0xIG11dGUpLCBsYWJlbHMgb3B0aW9uYWwgKi8KICBmdW5jdGlvbiBmcmV0QmFycmUoZnJldHMpIHsKICAgIHZhciBmciA9IGZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOwogICAgaWYgKCFmci5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIGxvID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpLCBmaXJzdCA9IC0xLCBuID0gMDsKICAgIGZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGYsIGkpIHsgaWYgKGYgPT09IGxvKSB7IG4rKzsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBpOyB9IH0pOwogICAgaWYgKG4gPCAyIHx8IGZyZXRzW2ZyZXRzLmxlbmd0aCAtIDFdICE9PSBsbykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gZmlyc3Q7IGkgPCBmcmV0cy5sZW5ndGg7IGkrKykgaWYgKGZyZXRzW2ldIDwgbG8pIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgZnJldDogbG8sIGZyb206IGZpcnN0IH07CiAgfQogIGZ1bmN0aW9uIGNob3JkRGlhZ3JhbSh2LCBvcHRzKSB7CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBuID0gdiA_IHYuZnJldHMubGVuZ3RoIDogKG9wdHMuc3RyaW5ncyB8fCA2KSwgc3AgPSAyMiwgZnMgPSAyNiwgVyA9IHNwICogKG4gLSAxKSwgcGFkTCA9IDMwLCBwYWRUID0gMzQ7CiAgICB2YXIgZWwgPSBzdmcoVyArIHBhZEwgKyAyNCwgZnMgKiA1ICsgcGFkVCArIDI2LCAnY21rLWNkJyk7CiAgICB2YXIgYmFzZSA9IDE7CiAgICBpZiAodikgeyB2YXIgZnIgPSB2LmZyZXRzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA-IDA7IH0pOyB2YXIgbXggPSBmci5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCBmcikgOiAwOyBpZiAobXggPiA0KSBiYXNlID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpOyB9CiAgICB2YXIgeDAgPSBwYWRMLCB5MCA9IHBhZFQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgcygnbGluZScsIHsgeDE6IHgwICsgaSAqIHNwLCB5MTogeTAsIHgyOiB4MCArIGkgKiBzcCwgeTI6IHkwICsgZnMgKiA1LCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuMyB9LCBlbCk7CiAgICBmb3IgKHZhciBmID0gMDsgZiA8PSA1OyBmKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCwgeTE6IHkwICsgZiAqIGZzLCB4MjogeDAgKyBXLCB5MjogeTAgKyBmICogZnMsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogZiA9PT0gMCAmJiBiYXNlID09PSAxID8gNSA6IDEuMyB9LCBlbCk7CiAgICBpZiAoIXYpIHJldHVybiBlbDsKICAgIGlmIChiYXNlID4gMSkgcygndGV4dCcsIHsgeDogeDAgLSAxMCwgeTogeTAgKyBmcyAqIDAuNjUsICd0ZXh0LWFuY2hvcic6ICdlbmQnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgYmFzZSArICdmcicpOwogICAgdmFyIGJhciA9IHYuYmFycmUgPT09IHVuZGVmaW5lZCA_IGZyZXRCYXJyZSh2LmZyZXRzKSA6IHYuYmFycmU7CiAgICBpZiAoYmFyICYmIGJhci5mcmV0ID4gMCkgeyB2YXIgYnkgPSB5MCArIChiYXIuZnJldCAtIGJhc2UgKyAwLjUpICogZnM7IHMoJ3JlY3QnLCB7IHg6IHgwICsgYmFyLmZyb20gKiBzcCAtIDksIHk6IGJ5IC0gOSwgd2lkdGg6IChuIC0gMSAtIGJhci5mcm9tKSAqIHNwICsgMTgsIGhlaWdodDogMTgsIHJ4OiA5LCBmaWxsOiAnIzFBMjAyQycgfSwgZWwpOyB9CiAgICB2LmZyZXRzLmZvckVhY2goZnVuY3Rpb24gKGZ2LCBpKSB7CiAgICAgIHZhciBjeCA9IHgwICsgaSAqIHNwLCBsYWIgPSB2LmxhYmVscyA_IHYubGFiZWxzW2ldIDogJyc7CiAgICAgIGlmIChmdiA8IDApIHMoJ3RleHQnLCB7IHg6IGN4LCB5OiB5MCAtIDEwLCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDE1LCBmaWxsOiAnIzY0NzQ4YicsICdmb250LWZhbWlseSc6ICdBcmlhbCcgfSwgZWwsICfDlycpOwogICAgICBlbHNlIGlmIChmdiA9PT0gMCkgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiB5MCAtIDE0LCByOiA2LCBmaWxsOiAnbm9uZScsIHN0cm9rZTogJyM2NDc0OGInLCAnc3Ryb2tlLXdpZHRoJzogMS44IH0sIGVsKTsKICAgICAgZWxzZSBpZiAoIShiYXIgJiYgZnYgPT09IGJhci5mcmV0ICYmIGkgPj0gYmFyLmZyb20pKSB7CiAgICAgICAgdmFyIGN5ID0geTAgKyAoZnYgLSBiYXNlICsgMC41KSAqIGZzOwogICAgICAgIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogY3ksIHI6IDkuNSwgZmlsbDogdi5yb290SWR4ID09PSBpID8gJyNGMkIyMzMnIDogJyMxQTIwMkMnIH0sIGVsKTsKICAgICAgfQogICAgICBpZiAobGFiKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgKyBmcyAqIDUgKyAxOCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxMSwgJ2ZvbnQtd2VpZ2h0JzogNzAwLCBmaWxsOiAnIzQ3NTU2OScsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnIH0sIGVsLCBsYWIpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQogIC8qIGdlbmVyaWMgZnJldHRlZCB2b2ljaW5nIHNlYXJjaDogdHVuaW5nID0gbWlkaSBwZXIgc3RyaW5nIGxvdy0-aGlnaCAqLwogIGZ1bmN0aW9uIHNlYXJjaFZvaWNpbmcodHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgZmFsc2UpOwogICAgaWYgKCFyICYmIHR1bmluZy5sZW5ndGggPD0gNCkgciA9IHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgdHJ1ZSk7CiAgICByZXR1cm4gcjsKICB9CiAgZnVuY3Rpb24gc2VhcmNoUGFzcyh0dW5pbmcsIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCBvcHRzLCByZWxheGVkKSB7CiAgICB2YXIgbiA9IHR1bmluZy5sZW5ndGgsIGJlc3QgPSBudWxsLCBmID0gbmV3IEFycmF5KG4pLCBtaW5QbGF5ZWQgPSByZWxheGVkID8gbiAtIDEgOiAob3B0cy5taW5QbGF5ZWQgfHwgTWF0aC5taW4obiwgTWF0aC5tYXgoMywgdG9uZXMubGVuZ3RoKSkpOwogICAgdmFyIGFsbG93TXV0ZSA9IG4gPiA0IHx8IHJlbGF4ZWQ7CiAgICBmb3IgKHZhciBwID0gMDsgcCA8IDExOyBwKyspIHsKICAgICAgdmFyIG9wdHNGID0gYWxsb3dNdXRlID8gWy0xLCAwXSA6IFswXTsKICAgICAgZm9yICh2YXIgayA9IE1hdGgubWF4KDEsIHApOyBrIDw9IHAgKyAzOyBrKyspIG9wdHNGLnB1c2goayk7CiAgICAgIChmdW5jdGlvbiByZWMoaSkgewogICAgICAgIGlmIChpID09PSBuKSB7CiAgICAgICAgICB2YXIgaGF2ZSA9IHt9LCBmciA9IFtdLCBmaXJzdCA9IC0xLCBwbGF5ZWQgPSAwOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHsgaWYgKGZbal0gPCAwKSBjb250aW51ZTsgaWYgKGZpcnN0IDwgMCkgZmlyc3QgPSBqOyBwbGF5ZWQrKzsgaGF2ZVsodHVuaW5nW2pdICsgZltqXSkgJSAxMl0gPSAxOyBpZiAoZltqXSA-IDApIGZyLnB1c2goZltqXSk7IH0KICAgICAgICAgIGlmIChwbGF5ZWQgPCBtaW5QbGF5ZWQpIHJldHVybjsKICAgICAgICAgIGlmIChiYXNzUGMgIT09IG51bGwgJiYgYmFzc1BjICE9PSB1bmRlZmluZWQgJiYgKHR1bmluZ1tmaXJzdF0gKyBmW2ZpcnN0XSkgJSAxMiAhPT0gYmFzc1BjKSByZXR1cm47CiAgICAgICAgICBpZiAoIXJlbGF4ZWQpIGZvciAodmFyIG0gPSBmaXJzdDsgbSA8IG4gLSAxOyBtKyspIGlmIChmW21dIDwgMCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1pc3NpbmcgPSB0b25lcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsgcmV0dXJuICFoYXZlW3RdOyB9KTsKICAgICAgICAgIHZhciBhbGxvd01pc3MgPSB0b25lcy5sZW5ndGggPiBuID8gMiA6IDE7CiAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiBhbGxvd01pc3MpIHJldHVybjsKICAgICAgICAgIGlmIChtaXNzaW5nLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGZpZnRoICYmICEoKHJlbGF4ZWQgfHwgdG9uZXMubGVuZ3RoID4gbikgJiYgeCA9PT0gdG9uZXNbMF0pOyB9KSkgcmV0dXJuOwogICAgICAgICAgdmFyIGhpID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMCwgbG8gPSBmci5sZW5ndGggPyBNYXRoLm1pbi5hcHBseShudWxsLCBmcikgOiAwOwogICAgICAgICAgaWYgKGhpIC0gbG8gPiAzKSByZXR1cm47CiAgICAgICAgICB2YXIgYmFyID0gZnJldEJhcnJlKGYpLCBmaW5nZXJzID0gZnIubGVuZ3RoOwogICAgICAgICAgaWYgKGJhcikgZmluZ2VycyAtPSBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKGZpbmdlcnMgPiA0KSByZXR1cm47CiAgICAgICAgICB2YXIgc2NvcmUgPSBoaSAqIDIgKyAoaGkgLSBsbykgKyBmci5sZW5ndGggKiAwLjMgKyAobiAtIHBsYXllZCkgKiAwLjggKyBtaXNzaW5nLmxlbmd0aCAqIDU7CiAgICAgICAgICBpZiAoIWJlc3QgfHwgc2NvcmUgPCBiZXN0LnNjb3JlKSBiZXN0ID0geyBzY29yZTogc2NvcmUsIGZyZXRzOiBmLnNsaWNlKCksIGJhcnJlOiAoYmFyICYmIGZyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbG87IH0pLmxlbmd0aCA-PSAzKSA_IGJhciA6IG51bGwgfTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvcHRzRi5sZW5ndGg7IG8rKykgewogICAgICAgICAgdmFyIHYgPSBvcHRzRltvXTsKICAgICAgICAgIGlmICh2ID49IDAgJiYgdG9uZXMuaW5kZXhPZigodHVuaW5nW2ldICsgdikgJSAxMikgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGZbaV0gPSB2OyByZWMoaSArIDEpOwogICAgICAgIH0KICAgICAgfSkoMCk7CiAgICB9CiAgICByZXR1cm4gYmVzdDsKICB9CiAgLyogdHJlYmxlIGNsZWYgb3V0bGluZSAoQnJhdnVyYSwgU0lMIE9GTCkgaW4gZm9udCB1bml0czogb3JpZ2luIG9uIHRoZSBHIGxpbmUsIDI1MCB1bml0cyBwZXIgc3RhZmYgc3BhY2UgKi8KICB2YXIgR0NMRUYgPSAnTTU0MS4wIC01OTguMEM1MzkuMCAtNjE1LjAgNTQxLjAgLTYxNi4wIDU1MC4wIC02MjUuMEM3MDYuMCAtNzcwLjAgODI0LjAgLTk1My4wIDgyNC4wIC0xMTc0LjBDODI0LjAgLTEyOTkuMCA3ODkuMCAtMTQyMy4wIDczMC4wIC0xNTA5LjBDNzA4LjAgLTE1NDEuMCA2NzEuMCAtMTU4MS4wIDY1NS4wIC0xNTgxLjBDNjM1LjAgLTE1ODEuMCA1OTAuMCAtMTU0NC4wIDU2Mi4wIC0xNTEyLjBDNDU1LjAgLTEzOTQuMCA0MjAuMCAtMTIxNC4wIDQyMC4wIC0xMDY0LjBDNDIwLjAgLTk4MS4wIDQzMS4wIC04ODcuMCA0NDEuMCAtODI4LjBDNDQ0LjAgLTgxMS4wIDQ0NS4wIC04MDguMCA0MjguMCAtNzkzLjBDMjIwLjAgLTYyMi4wIDAuMCAtNDE2LjAgMC4wIC0xMjUuMEMwLjAgMTI1LjAgMTcxLjAgMzYzLjAgNTI0LjAgMzYzLjBDNTU3LjAgMzYzLjAgNTk1LjAgMzYwLjAgNjI0LjAgMzU0LjBDNjM5LjAgMzUxLjAgNjQyLjAgMzUwLjAgNjQ1LjAgMzY3LjBDNjYyLjAgNDY0LjAgNjg0LjAgNTg5LjAgNjg0LjAgNjU3LjBDNjg0LjAgODcwLjAgNTQwLjAgODk2LjAgNDU1LjAgODk2LjBDMzc3LjAgODk2LjAgMzQwLjAgODczLjAgMzQwLjAgODU0LjBDMzQwLjAgODQ0LjAgMzUzLjAgODQwLjAgMzg2LjAgODI5LjBDNDMxLjAgODE2LjAgNDgyLjAgNzc4LjAgNDgyLjAgNjk0LjBDNDgyLjAgNjE1LjAgNDMyLjAgNTQ3LjAgMzQ0LjAgNTQ3LjBDMjQ4LjAgNTQ3LjAgMTkwLjAgNjI0LjAgMTkwLjAgNzEzLjBDMTkwLjAgODA2LjAgMjQ2LjAgOTQ4LjAgNDY0LjAgOTQ4LjBDNTYwLjAgOTQ4LjAgNzQ3LjAgOTA0LjAgNzQ3LjAgNjYwLjBDNzQ3LjAgNTc3LjAgNzIxLjAgNDQxLjAgNzA2LjAgMzUxLjBDNzAzLjAgMzM0LjAgNzA0LjAgMzM2LjAgNzI0LjAgMzI3LjBDODcwLjAgMjY5LjAgOTY2LjAgMTQ3LjAgOTY2LjAgLTE2LjBDOTY2LjAgLTIwMC4wIDgzMS4wIC0zNjMuMCA2MTkuMCAtMzYzLjBDNTgyLjAgLTM2My4wIDU4Mi4wIC0zNjMuMCA1NzcuMCAtMzg5LjBaTTY3Ny4wIC0xMzU4LjBDNzI0LjAgLTEzNTguMCA3NjMuMCAtMTMxOS4wIDc2My4wIC0xMjQwLjBDNzYzLjAgLTEwODAuMCA2MjYuMCAtOTUwLjAgNTEzLjAgLTg1MS4wQzUwMy4wIC04NDIuMCA0OTcuMCAtODQ0LjAgNDk0LjAgLTg2My4wQzQ4OC4wIC05MDAuMCA0ODUuMCAtOTQ5LjAgNDg1LjAgLTk5NS4wQzQ4NS4wIC0xMjIwLjAgNTg5LjAgLTEzNTguMCA2NzcuMCAtMTM1OC4wWk01MjAuMCAtMzc3LjBDNTI0LjAgLTM1MC4wIDUyNC4wIC0zNTEuMCA0OTguMCAtMzQzLjBDMzcyLjAgLTMwMC4wIDI4OS4wIC0xODYuMCAyODkuMCAtNjMuMEMyODkuMCA2Ni4wIDM1Ny4wIDE1OC4wIDQ1NS4wIDE5Mi4wQzQ2Ny4wIDE5Ni4wIDQ4NC4wIDIwMC4wIDQ5NC4wIDIwMC4wQzUwNS4wIDIwMC4wIDUxMS4wIDE5My4wIDUxMS4wIDE4NC4wQzUxMS4wIDE3NC4wIDUwMC4wIDE3MC4wIDQ5MC4wIDE2Ni4wQzQyOS4wIDE0MC4wIDM4Ni4wIDc4LjAgMzg2LjAgMTIuMEMzODYuMCAtNzEuMCA0NDIuMCAtMTMyLjAgNTMwLjAgLTE1Ny4wQzU1My4wIC0xNjMuMCA1NTYuMCAtMTYxLjAgNTU5LjAgLTE0NS4wTDYzMS4wIDI4NC4wQzYzNC4wIDMwMC4wIDYzMi4wIDMwMC4wIDYxMS4wIDMwNC4wQzU4OC4wIDMwOC4wIDU1OS4wIDMxMS4wIDUzMC4wIDMxMS4wQzI3OC4wIDMxMS4wIDExNS4wIDE3MS4wIDExNS4wIC0yOS4wQzExNS4wIC0xMTQuMCAxMzAuMCAtMjI4LjAgMjQ5LjAgLTM2My4wQzMzNi4wIC00NTkuMCA0MDIuMCAtNTEzLjAgNDY5LjAgLTU2Ny4wQzQ4NC4wIC01NzkuMCA0ODcuMCAtNTc3LjAgNDkwLjAgLTU2Mi4wWk02MTkuMCAtMTQ4LjBDNjE2LjAgLTE2Ni4wIDYxOC4wIC0xNzAuMCA2MzUuMCAtMTY4LjBDNzUyLjAgLTE1OC4wIDg0OC4wIC02MC4wIDg0OC4wIDY2LjBDODQ4LjAgMTU3LjAgNzkzLjAgMjMwLjAgNzEzLjAgMjcxLjBDNjk2LjAgMjc5LjAgNjkzLjAgMjc5LjAgNjkwLjAgMjYyLjBaJzsKICBmdW5jdGlvbiB0cmVibGVDbGVmKHBhcmVudCwgeCwgZ0xpbmVZLCBzcGFjZSkgeyByZXR1cm4gcygncGF0aCcsIHsgZDogR0NMRUYsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgnICsgeCArICcgJyArIGdMaW5lWSArICcpIHNjYWxlKCcgKyAoc3BhY2UgLyAyNTApICsgJyknLCBmaWxsOiAnIzFBMjAyQycgfSwgcGFyZW50KTsgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyb20gPSBvcHRzLmZyb20gfHwgMCwgdG8gPSBvcHRzLnRvICE9PSB1bmRlZmluZWQgPyBvcHRzLnRvIDogKG9wdHMuZnJldHMgfHwgMTUpLCBmcmV0cyA9IHRvIC0gZnJvbTsKICAgIHZhciBuID0gdHVuaW5nLmxlbmd0aCwgZncgPSBvcHRzLmZ3IHx8IChmcmV0cyA8PSA4ID8gNjQgOiA0NiksIHNoID0gb3B0cy5zaCB8fCAoZnJldHMgPD0gOCA_IDM0IDogMjYpLCBwYWRMID0gNDYsIHBhZFQgPSAyMjsKICAgIHZhciBXID0gcGFkTCArIGZyZXRzICogZncgKyAxNiwgSCA9IHBhZFQgKyAobiAtIDEpICogc2ggKyAzNDsKICAgIHZhciBlbCA9IHN2ZyhXLCBILCAnY21rLWZiJyk7CiAgICBmdW5jdGlvbiBYKGYpIHsgcmV0dXJuIHBhZEwgKyAoZiAtIGZyb20gLSAwLjUpICogZnc7IH0KICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPiBmcm9tICYmIGZ4IDw9IHRvKSBzKCdjaXJjbGUnLCB7IGN4OiBYKGZ4KSwgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggLyAyLCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyB9KTsKICAgIGlmICgxMiA-IGZyb20gJiYgMTIgPD0gdG8pIHsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC4yNSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgcygnY2lyY2xlJywgeyBjeDogWCgxMiksIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoICogMC43NSwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfQogICAgZm9yICh2YXIgZngyID0gMDsgZngyIDw9IGZyZXRzOyBmeDIrKykgeyB2YXIgbnV0ID0gZngyID09PSAwICYmIGZyb20gPT09IDA7IHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IG51dCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IG51dCA_IDUgOiAxLjQgfSwgZWwpOyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB2YXIgeSA9IHBhZFQgKyAobiAtIDEgLSBpKSAqIHNoOwogICAgICBzKCdsaW5lJywgeyB4MTogcGFkTCwgeTE6IHksIHgyOiBwYWRMICsgZnJldHMgKiBmdywgeTI6IHksIHN0cm9rZTogJyM4YTdhNjQnLCAnc3Ryb2tlLXdpZHRoJzogMSArIChuIC0gMSAtIGkpICogMC4yNSB9LCBlbCk7CiAgICAgIHZhciBvcGVuID0gc3BlbGwoTEVULmluZGV4T2Yob3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXS5jaGFyQXQoMCkgOiAnQycpLCB0dW5pbmdbaV0pOwogICAgICBzKCd0ZXh0JywgeyB4OiBwYWRMIC0gMTgsIHk6IHkgKyA0LjUsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTMsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb3B0cy5vcGVuTmFtZXMgPyBvcHRzLm9wZW5OYW1lc1tpXSA6IG9wZW4ubmFtZSk7CiAgICB9CiAgICBmb3IgKHZhciBmeDMgPSBmcm9tICsgMTsgZngzIDw9IHRvOyBmeDMrKykgaWYgKGZyZXRzIDw9IDggfHwgWzMsIDUsIDcsIDksIDEyLCAxNV0uaW5kZXhPZihmeDMpID49IDApIHMoJ3RleHQnLCB7IHg6IFgoZngzKSwgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IGZyZXRzIDw9IDggPyA3MDAgOiA0MDAsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICBtYXJrcyA9IChtYXJrcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmYgPT09IDAgPyBmcm9tID09PSAwIDogKG0uZiA-IGZyb20gJiYgbS5mIDw9IHRvKTsgfSk7CiAgICBtYXJrcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciBjeCA9IG0uZiA9PT0gMCA_IHBhZEwgLSAxOCA6IFgobS5mKSwgY3kgPSBwYWRUICsgKG4gLSAxIC0gbS5zKSAqIHNoOwogICAgICB2YXIgZmlsbCA9IG0ua2luZCA9PT0gJ3Jvb3QnID8gJyNGMkIyMzMnIDogbS5raW5kID09PSAnZGltJyA_ICcjZDVkZGU2JyA6IG0ua2luZCA9PT0gJ2FsdCcgPyAnIzIyODAzZicgOiAnIzA0NzdCRic7CiAgICAgIHZhciBnID0gcygnZycsIHsgJ2NsYXNzJzogJ21rJyArIChtLmtpbmQgPT09ICdkaW0nID8gJyBkaW0nIDogJycpLCAnZGF0YS1zJzogbS5zLCAnZGF0YS1mJzogbS5mIH0sIGVsKTsKICAgICAgcygnY2lyY2xlJywgeyBjeDogY3gsIGN5OiBjeSwgcjogZnJldHMgPD0gOCA_IDE0IDogMTEuNSwgZmlsbDogZmlsbCwgc3Ryb2tlOiBtLmYgPT09IDAgPyAnI2ZmZicgOiAnbm9uZScsICdzdHJva2Utd2lkdGgnOiAyIH0sIGcpOwogICAgICBpZiAobS5sYWJlbCkgcygndGV4dCcsIHsgeDogY3gsIHk6IGN5ICsgNCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAobS5sYWJlbC5sZW5ndGggPiAyID8gOC41IDogMTAuNSkgKyAoZnJldHMgPD0gOCA_IDIgOiAwKSwgJ2ZvbnQtd2VpZ2h0JzogODAwLCBmaWxsOiBtLmtpbmQgPT09ICdyb290JyA_ICcjMUEyMDJDJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnIzY0NzQ4YicgOiAnI2ZmZicsICdmb250LWZhbWlseSc6ICdDTUFjYyxNb250c2VycmF0LEFyaWFsLHNhbnMtc2VyaWYnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSwgZywgbS5sYWJlbCk7CiAgICAgIGlmIChtLmNsaWNrKSB7IGcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOyBnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbS5jbGljayk7IH0KICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KCiAgLyogRE9NIGhlbHBlciAqLwogIGZ1bmN0aW9uIGgodGFnLCBhdHRycywga2lkcykgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoYXR0cnMpIGZvciAodmFyIGsgaW4gYXR0cnMpIHsKICAgICAgaWYgKGsgPT09ICd0ZXh0JykgZS50ZXh0Q29udGVudCA9IGF0dHJzW2tdOwogICAgICBlbHNlIGlmIChrLnNsaWNlKDAsIDIpID09PSAnb24nKSBlLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKSwgYXR0cnNba10pOwogICAgICBlbHNlIGlmIChhdHRyc1trXSAhPT0gZmFsc2UgJiYgYXR0cnNba10gIT09IG51bGwgJiYgYXR0cnNba10gIT09IHVuZGVmaW5lZCkgZS5zZXRBdHRyaWJ1dGUoaywgYXR0cnNba10gPT09IHRydWUgPyAnJyA6IGF0dHJzW2tdKTsKICAgIH0KICAgIChraWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBlLmFwcGVuZENoaWxkKHR5cGVvZiBjID09PSAnc3RyaW5nJyA_IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpIDogYyk7IH0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB3aW5kb3cuQ01LID0gewogICAgTEVUOiBMRVQsIE5BVDogTkFULCBwYXJzZU5vdGU6IHBhcnNlTm90ZSwgc3BlbGw6IHNwZWxsLCBhY2NTdHI6IGFjY1N0ciwgbm90ZUF0OiBub3RlQXQsIGRlZ3JlZUxhYmVsOiBkZWdyZWVMYWJlbCwKICAgIGludGVydmFsTmFtZTogaW50ZXJ2YWxOYW1lLCBNQUpfU0VNSTogTUFKX1NFTUksIHBsYXk6IHBsYXksIGRyb25lOiBkcm9uZSwgY3R4OiBjdHgsIHN2Z0VsOiBzLCBzdmc6IHN2ZywKICAgIGtleWJvYXJkOiBrZXlib2FyZCwgY2hvcmREaWFncmFtOiBjaG9yZERpYWdyYW0sIHNlYXJjaFZvaWNpbmc6IHNlYXJjaFZvaWNpbmcsIGZyZXRCYXJyZTogZnJldEJhcnJlLAogICAgVFVOSU5HUzogVFVOSU5HUywgZnJldGJvYXJkOiBmcmV0Ym9hcmQsIGg6IGgsIHRyZWJsZUNsZWY6IHRyZWJsZUNsZWYKICB9Owp9KSgpOwoKLyogTW9kZSBleHBsb3JlciDigJQgdXNlcyB3aW5kb3cuQ01LICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1tb2RlcycpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAnMScpOwogIHZhciBLID0gd2luZG93LkNNSywgaCA9IEsuaDsKICB2YXIgVFVOID0gWzQwLCA0NSwgNTAsIDU1LCA1OSwgNjRdLCBPUEVOID0gWydFJywgJ0EnLCAnRCcsICdHJywgJ0InLCAnRSddOwogIHZhciBNQUogPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBNT0RFUyA9IFsKICAgIHsgbjogJ0lvbmlhbicsIGFsaWFzOiAnTWFqb3Igc2NhbGUnLCBjaDogNywgbW9vZDogJ0JyaWdodCwgaGFwcHkgYW5kIHNldHRsZWQnLCB1c2U6ICdQb3AsIHJvY2ssIGNvdW50cnksIGNsYXNzaWNhbCcsIHdoeTogJ3RoZSBuYXR1cmFsIDd0aCBwdWxscyBzdHJvbmdseSBiYWNrIGhvbWUnIH0sCiAgICB7IG46ICdEb3JpYW4nLCBhbGlhczogJ01pbm9yIHdpdGggYSBuYXR1cmFsIDYnLCBjaDogNiwgbW9vZDogJ01pbm9yLCBidXQgaG9wZWZ1bCBhbmQgYSBsaXR0bGUgamF6enknLCB1c2U6ICdKYXp6LCBmdW5rLCBzb3VsLCBjbGFzc2ljIHJvY2snLCB3aHk6ICd0aGUgbmF0dXJhbCA2dGggYnJpZ2h0ZW5zIGFuIG90aGVyd2lzZSBtaW5vciBzb3VuZCcgfSwKICAgIHsgbjogJ1BocnlnaWFuJywgYWxpYXM6ICdNaW5vciB3aXRoIGEg4pmtMicsIGNoOiAyLCBtb29kOiAnRGFyaywgd2l0aCBhIFNwYW5pc2ggb3IgZmxhbWVuY28gZWRnZScsIHVzZTogJ0ZsYW1lbmNvLCBtZXRhbCwgZmlsbSBtdXNpYycsIHdoeTogJ3RoZSDima0yIHNpdHMgYSBoYWxmIHN0ZXAgYWJvdmUgdGhlIHJvb3QnIH0sCiAgICB7IG46ICdMeWRpYW4nLCBhbGlhczogJ01ham9yIHdpdGggYSDima80JywgY2g6IDQsIG1vb2Q6ICdEcmVhbXksIGZsb2F0aW5nIGFuZCBleHRyYSBicmlnaHQnLCB1c2U6ICdGaWxtIHNjb3JlcywgamF6eiwgcHJvZ3Jlc3NpdmUgcm9jaycsIHdoeTogJ3RoZSDima80IGxpZnRzIHRoZSBtYWpvciBzb3VuZCBldmVuIGhpZ2hlcicgfSwKICAgIHsgbjogJ01peG9seWRpYW4nLCBhbGlhczogJ01ham9yIHdpdGggYSDima03JywgY2g6IDcsIG1vb2Q6ICdNYWpvciB3aXRoIGEgYmx1ZXN5LCBsYWlkLWJhY2sgZWRnZScsIHVzZTogJ0JsdWVzLCByb2NrLCBmdW5rLCBmb2xrJywgd2h5OiAndGhlIOKZrTcgc29mdGVucyB0aGUgcHVsbCBiYWNrIHRvIHRoZSByb290JyB9LAogICAgeyBuOiAnQWVvbGlhbicsIGFsaWFzOiAnTmF0dXJhbCBtaW5vciBzY2FsZScsIGNoOiA2LCBtb29kOiAnU2FkLCBzZXJpb3VzLCB0aGUgY2xhc3NpYyBtaW5vciBzb3VuZCcsIHVzZTogJ1JvY2ssIHBvcCwgY2xhc3NpY2FsLCBtZXRhbCcsIHdoeTogJ3RoZSDima02IGdpdmVzIG1pbm9yIGl0cyBkYXJrZXIgY29sb3InIH0sCiAgICB7IG46ICdMb2NyaWFuJywgYWxpYXM6ICdEaW1pbmlzaGVkLCB3aXRoIGEg4pmtNScsIGNoOiA1LCBtb29kOiAnVW5zdGFibGUsIHRlbnNlIGFuZCB2ZXJ5IGRhcmsnLCB1c2U6ICdNZXRhbCwgamF6eiBvdmVyIG034pmtNSBjaG9yZHMnLCB3aHk6ICd0aGUg4pmtNSBtZWFucyB0aGVyZSBpcyBubyBzdGFibGUgNXRoIGF0IGFsbCcgfQogIF07CiAgdmFyIEJSSUdIVCA9IFszLCAwLCA0LCAxLCA1LCAyLCA2XTsKICB2YXIgUk9PVFMgPSBbJ0MnLCAnRGInLCAnRCcsICdFYicsICdFJywgJ0YnLCAnRiMnLCAnRycsICdBYicsICdBJywgJ0JiJywgJ0InXTsKICB2YXIgRU5IID0geyBEYjogJ0MjJywgRWI6ICdEIycsICdGIyc6ICdHYicsIEFiOiAnRyMnLCBCYjogJ0EjJywgJ0MjJzogJ0RiJywgJ0QjJzogJ0ViJywgR2I6ICdGIycsICdHIyc6ICdBYicsICdBIyc6ICdCYicgfTsKICB2YXIgU1REID0gWydDJywgJ0cnLCAnRCcsICdBJywgJ0UnLCAnQicsICdGIycsICdDIycsICdGJywgJ0JiJywgJ0ViJywgJ0FiJywgJ0RiJywgJ0diJywgJ0NiJ107CiAgdmFyIHN0YXRlID0geyByb290OiAnRCcsIG1vZGU6IDEsIGxhYmVsczogJ25vdGVzJyB9OwogIChmdW5jdGlvbiBmcm9tSGFzaCgpIHsKICAgIHZhciBtID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvbW9kZT0oW0EtR11bI2JdPyktKFx3KykvKTsKICAgIGlmICghbSkgcmV0dXJuOwogICAgdmFyIHIgPSBST09UUy5pbmRleE9mKG1bMV0pID49IDAgPyBtWzFdIDogKEVOSFttWzFdXSAmJiBST09UUy5pbmRleE9mKEVOSFttWzFdXSkgPj0gMCA_IEVOSFttWzFdXSA6IG51bGwpOwogICAgdmFyIG1pID0gTU9ERVMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Lm4udG9Mb3dlckNhc2UoKTsgfSkuaW5kZXhPZihtWzJdLnRvTG93ZXJDYXNlKCkpOwogICAgaWYgKHIpIHN0YXRlLnJvb3QgPSByOyBpZiAobWkgPj0gMCkgc3RhdGUubW9kZSA9IG1pOwogIH0pKCk7CiAgZnVuY3Rpb24gcHJldHR5KG4pIHsgcmV0dXJuIG4ucmVwbGFjZSgnIycsICfima8nKS5yZXBsYWNlKC9iJC8sICfima0nKTsgfQogIGZ1bmN0aW9uIGFzY2lpT2Yoc3ApIHsgcmV0dXJuIEsuTEVUW3NwLmxdICsgKHNwLmEgPiAwID8gbmV3IEFycmF5KHNwLmEgKyAxKS5qb2luKCcjJykgOiBuZXcgQXJyYXkoLXNwLmEgKyAxKS5qb2luKCdiJykpOyB9CiAgZnVuY3Rpb24gc2VtaXMoaSkgeyByZXR1cm4gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gKE1BSlsoaSArIGspICUgN10gLSBNQUpbaV0gKyAxMikgJSAxMjsgfSk7IH0KICBmdW5jdGlvbiBidWlsZChyb290TmFtZSkgewogICAgdmFyIHIgPSBLLnBhcnNlTm90ZShyb290TmFtZSksIGkgPSBzdGF0ZS5tb2RlLCBzbSA9IHNlbWlzKGkpOwogICAgdmFyIHBhcmVudCA9IEsuc3BlbGwoci5sIC0gaSwgci5wYyAtIE1BSltpXSk7CiAgICB2YXIgbm90ZXMgPSBzbS5tYXAoZnVuY3Rpb24gKHMsIGspIHsgcmV0dXJuIHsgZGVnOiBrICsgMSwgc2VtaXM6IHMsIG5vdGU6IEsubm90ZUF0KHIsIGsgKyAxLCBzKSwgbGFiZWw6IEsuZGVncmVlTGFiZWwoayArIDEsIHMpIH07IH0pOwogICAgcmV0dXJuIHsgcjogciwgcm9vdE5hbWU6IHJvb3ROYW1lLCBwYXJlbnQ6IHBhcmVudCwgbm90ZXM6IG5vdGVzLCBzbTogc20gfTsKICB9CiAgZnVuY3Rpb24gY3VycmVudCgpIHsKICAgIHZhciBhID0gYnVpbGQoc3RhdGUucm9vdCk7CiAgICBpZiAoU1RELmluZGV4T2YoYXNjaWlPZihhLnBhcmVudCkpIDwgMCAmJiBFTkhbc3RhdGUucm9vdF0pIHsgdmFyIGIgPSBidWlsZChFTkhbc3RhdGUucm9vdF0pOyBpZiAoU1RELmluZGV4T2YoYXNjaWlPZihiLnBhcmVudCkpID49IDApIHJldHVybiBiOyB9CiAgICByZXR1cm4gYTsKICB9CiAgZnVuY3Rpb24gY2hvcmRPZihjKSB7CiAgICB2YXIgczMgPSBjLnNtWzJdLCBzNSA9IGMuc21bNF0sIHM3ID0gYy5zbVs2XTsKICAgIHZhciBzeW0gPSBzMyA9PT0gNCA_IChzNyA9PT0gMTEgPyAnbWFqNycgOiAnNycpIDogKHM1ID09PSA2ID8gJ2034pmtNScgOiAnbTcnKTsKICAgIHJldHVybiB7IG5hbWU6IGMubm90ZXNbMF0ubm90ZS5uYW1lICsgc3ltLCBtaWRpczogWzAsIDIsIDQsIDZdLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gNDggKyBjLnIucGMgKyBjLnNtW2tdOyB9KSB9OwogIH0KCiAgdmFyIGVscyA9IHt9LCB0aW1lcnMgPSBbXTsKICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBvbiwgZm4sIGNscykgeyByZXR1cm4gaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1jaGlwJyArIChvbiA_ICcgb24nIDogJycpICsgKGNscyA_ICcgJyArIGNscyA6ICcnKSwgJ2FyaWEtcHJlc3NlZCc6IG9uID8gJ3RydWUnIDogJ2ZhbHNlJywgb25jbGljazogZm4gfSwgW2xhYmVsXSk7IH0KICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICBzdG9wKCk7CiAgICB2YXIgYyA9IGN1cnJlbnQoKSwgTSA9IE1PREVTW3N0YXRlLm1vZGVdOwogICAgdHJ5IHsgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsICcjbW9kZT0nICsgYy5yb290TmFtZSArICctJyArIE0ubi50b0xvd2VyQ2FzZSgpKTsgfSBjYXRjaCAoZSkge30KICAgIGVscy5yb290cy5pbm5lckhUTUwgPSAnJzsKICAgIFJPT1RTLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgZWxzLnJvb3RzLmFwcGVuZENoaWxkKGNoaXAocHJldHR5KHIpLCByID09PSBzdGF0ZS5yb290LCBmdW5jdGlvbiAoKSB7IHN0YXRlLnJvb3QgPSByOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIGVscy5tb2Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIE1PREVTLmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsgZWxzLm1vZGVzLmFwcGVuZENoaWxkKGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtbW9kZScgKyAoaSA9PT0gc3RhdGUubW9kZSA_ICcgb24nIDogJycpLCBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7IHN0YXRlLm1vZGUgPSBpOyByZW5kZXIoKTsgfSB9LCBbaCgnYicsIHsgdGV4dDogbS5uIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogbS5hbGlhcyB9KV0pKTsgfSk7CiAgICBlbHMubGFicy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ25vdGVzJywgJ05vdGUgbmFtZXMnXSwgWydkZWdyZWVzJywgJ1NjYWxlIGRlZ3JlZXMnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMubGFicy5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIG9bMF0gPT09IHN0YXRlLmxhYmVscywgZnVuY3Rpb24gKCkgeyBzdGF0ZS5sYWJlbHMgPSBvWzBdOyByZW5kZXIoKTsgfSwgJ3NtJykpOyB9KTsKICAgIHZhciBybiA9IGMubm90ZXNbMF0ubm90ZS5uYW1lOwogICAgZWxzLnRpdGxlLnRleHRDb250ZW50ID0gcm4gKyAnICcgKyBNLm47CiAgICBlbHMucGFyZW50LmlubmVySFRNTCA9ICcnOwogICAgZWxzLnBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnU2FtZSBub3RlcyBhcyAnKSk7CiAgICBlbHMucGFyZW50LmFwcGVuZENoaWxkKGgoJ2InLCB7IHRleHQ6IGMucGFyZW50Lm5hbWUgKyAnIG1ham9yJyB9KSk7CiAgICBlbHMucGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcsIHN0YXJ0aW5nIG9uICcgKyBybiArIChzdGF0ZS5tb2RlID8gJycgOiAnIChpdCBpcyB0aGUgbWFqb3Igc2NhbGUpJykgKyAnLicpKTsKICAgIGVscy5tb29kLnRleHRDb250ZW50ID0gTS5tb29kICsgJy4gVXNlZCBpbjogJyArIE0udXNlICsgJy4nOwogICAgZWxzLmxhZGRlci5pbm5lckhUTUwgPSAnJzsKICAgIEJSSUdIVC5mb3JFYWNoKGZ1bmN0aW9uIChtaSwgaykgewogICAgICB2YXIgdHQgPSBrIC8gNiwgbWl4ID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIE1hdGgucm91bmQoYSArIChiIC0gYSkgKiB0dCk7IH07CiAgICAgIGVscy5sYWRkZXIuYXBwZW5kQ2hpbGQoaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2NteC1ydW5nJyArIChtaSA9PT0gc3RhdGUubW9kZSA_ICcgb24nIDogJycpLCBzdHlsZTogJ2JhY2tncm91bmQ6cmdiKCcgKyBtaXgoMjQyLCAyNikgKyAnLCcgKyBtaXgoMTc4LCAzMikgKyAnLCcgKyBtaXgoNTEsIDQ0KSArICcpO2NvbG9yOicgKyAodHQgPCAwLjQ1ID8gJyMxQTIwMkMnIDogJyNmZmYnKSwgb25jbGljazogZnVuY3Rpb24gKCkgeyBzdGF0ZS5tb2RlID0gbWk7IHJlbmRlcigpOyB9IH0sIFtNT0RFU1ttaV0ubl0pKTsKICAgIH0pOwogICAgZWxzLm5vdGVzLmlubmVySFRNTCA9ICcnOwogICAgYy5ub3Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgIHZhciBpc0NoID0gbi5kZWcgPT09IE0uY2g7CiAgICAgIGVscy5ub3Rlcy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtbm90ZScgKyAobi5kZWcgPT09IDEgPyAnIHJvb3QnIDogJycpICsgKGlzQ2ggPyAnIGNoYXInIDogJycpIH0sIFtoKCdiJywgeyB0ZXh0OiBuLm5vdGUubmFtZSB9KSwgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2RlZycsIHRleHQ6IG4ubGFiZWwgfSldKSk7CiAgICB9KTsKICAgIHZhciBjaG4gPSBjLm5vdGVzW00uY2ggLSAxXTsKICAgIGVscy5jaGFybGluZS5pbm5lckhUTUwgPSAnJzsKICAgIGVscy5jaGFybGluZS5hcHBlbmRDaGlsZChoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWRvdCcgfSkpOwogICAgZWxzLmNoYXJsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdDaGFyYWN0ZXJpc3RpYyBub3RlOiAnKSk7CiAgICBlbHMuY2hhcmxpbmUuYXBwZW5kQ2hpbGQoaCgnYicsIHsgdGV4dDogY2huLmxhYmVsICsgJyAoJyArIGNobi5ub3RlLm5hbWUgKyAnKScgfSkpOwogICAgZWxzLmNoYXJsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcg4oCUICcgKyBNLndoeSArICcuJykpOwogICAgdmFyIGNkID0gY2hvcmRPZihjKTsKICAgIGVscy5jaG9yZEJ0bi50ZXh0Q29udGVudCA9ICfilrYgUGxheSAnICsgY2QubmFtZTsKICAgIGVscy5jb21wYXJlQnRuLnRleHRDb250ZW50ID0gJ0NvbXBhcmUgd2l0aCAnICsgKHJlZklkeCgpID09PSA1ID8gJ25hdHVyYWwgbWlub3InIDogJ21ham9yJyk7CiAgICB2YXIgb24gPSB7fSwgcm9vdE9mZiA9IG51bGwsIHN0YXJ0ID0gNDgsIGFsdEsgPSB7fTsKICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyB2YXIgbSA9IDQ4ICsgYy5yLnBjICsgbi5zZW1pczsgb25bbSAtIHN0YXJ0XSA9IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG4ubm90ZS5uYW1lIDogbi5sYWJlbDsgaWYgKG4uZGVnID09PSAxKSByb290T2ZmID0gbSAtIHN0YXJ0OyBpZiAobi5kZWcgPT09IE0uY2gpIGFsdEtbbSAtIHN0YXJ0XSA9IDE7IH0pOwogICAgb25bNDggKyBjLnIucGMgKyAxMiAtIHN0YXJ0XSA9IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IHJuIDogJzEnOwogICAgZWxzLmtiLmlubmVySFRNTCA9ICcnOyBlbHMua2IuYXBwZW5kQ2hpbGQoSy5rZXlib2FyZCh7IG9jdGF2ZXM6IDIsIG9uOiBvbiwgcm9vdDogcm9vdE9mZiwgYWx0OiBhbHRLIH0pKTsKICAgIHZhciBtYXJrcyA9IFtdOwogICAgZm9yICh2YXIgcyA9IDA7IHMgPCA2OyBzKyspIGZvciAodmFyIGYgPSAwOyBmIDw9IDEyOyBmKyspIHsKICAgICAgdmFyIHBjID0gKFRVTltzXSArIGYpICUgMTI7CiAgICAgIGMubm90ZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyBpZiAobi5ub3RlLnBjID09PSBwYykgbWFya3MucHVzaCh7IHM6IHMsIGY6IGYsIGtpbmQ6IG4uZGVnID09PSAxID8gJ3Jvb3QnIDogbi5kZWcgPT09IE0uY2ggPyAnYWx0JyA6ICdub3RlJywgbGFiZWw6IHN0YXRlLmxhYmVscyA9PT0gJ25vdGVzJyA_IG4ubm90ZS5uYW1lIDogbi5sYWJlbCwgY2xpY2s6IHRhcChUVU5bc10gKyBmLCBzLCBmKSB9KTsgfSk7CiAgICB9CiAgICBlbHMuZmIuaW5uZXJIVE1MID0gJyc7IGVscy5mYi5hcHBlbmRDaGlsZChLLmZyZXRib2FyZChUVU4sIG1hcmtzLCB7IGZyZXRzOiAxMiwgb3Blbk5hbWVzOiBPUEVOIH0pKTsKICB9CiAgZnVuY3Rpb24gdGFwKG0sIHMsIGYpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDEsIHZvbDogMC41IH0pOyB9OyB9CiAgZnVuY3Rpb24gc3RvcCgpIHsgdGltZXJzLmZvckVhY2goY2xlYXJUaW1lb3V0KTsgdGltZXJzID0gW107IH0KICBmdW5jdGlvbiBzY2FsZU1pZGlzKHNtLCByKSB7IHZhciBiID0gNjAgKyByLnBjOyBpZiAoYiA-IDY2KSBiIC09IDEyOyB2YXIgdXAgPSBzbS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGIgKyB4OyB9KS5jb25jYXQoW2IgKyAxMl0pOyByZXR1cm4gdXAuY29uY2F0KHVwLnNsaWNlKDAsIC0xKS5yZXZlcnNlKCkpOyB9CiAgZnVuY3Rpb24gcGxheVNlcShzZXEsIGRlbGF5LCB3aXRoRHJvbmUsIHIpIHsKICAgIHZhciBzdGVwID0gMzMwOwogICAgaWYgKHdpdGhEcm9uZSkgSy5kcm9uZSgzNiArIHIucGMgKyAoci5wYyA-IDcgPyAwIDogMTIpLCAoc2VxLmxlbmd0aCAqIHN0ZXApIC8gMTAwMCArIDAuOCk7CiAgICBzZXEuZm9yRWFjaChmdW5jdGlvbiAobSwgaSkgeyB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgSy5wbGF5KFttXSwgJ2Jsb2NrJywgeyBkdXI6IDAuNTUsIHZvbDogMC40MiB9KTsgfSwgZGVsYXkgKyBpICogc3RlcCkpOyB9KTsKICAgIHJldHVybiBkZWxheSArIHNlcS5sZW5ndGggKiBzdGVwOwogIH0KICBmdW5jdGlvbiBwbGF5TW9kZSgpIHsgc3RvcCgpOyB2YXIgYyA9IGN1cnJlbnQoKTsgcGxheVNlcShzY2FsZU1pZGlzKGMuc20sIGMuciksIDAsIHRydWUsIGMucik7IH0KICBmdW5jdGlvbiByZWZJZHgoKSB7IHZhciBNID0gc3RhdGUubW9kZTsgcmV0dXJuIE0gPT09IDAgPyA1IDogTSA9PT0gNSA_IDAgOiAoWzEsIDIsIDZdLmluZGV4T2YoTSkgPj0gMCA_IDUgOiAwKTsgfQogIGZ1bmN0aW9uIGNvbXBhcmUoKSB7CiAgICBzdG9wKCk7IHZhciBjID0gY3VycmVudCgpOwogICAgdmFyIHJJID0gcmVmSWR4KCk7CiAgICB2YXIgcmVmID0gc2VtaXMockkpOwogICAgdmFyIHVwID0gZnVuY3Rpb24gKHNtKSB7IHZhciBiID0gNjAgKyBjLnIucGM7IGlmIChiID4gNjYpIGIgLT0gMTI7IHJldHVybiBzbS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGIgKyB4OyB9KS5jb25jYXQoW2IgKyAxMl0pOyB9OwogICAgdmFyIHQgPSBwbGF5U2VxKHVwKHJlZiksIDAsIHRydWUsIGMucik7CiAgICB0aW1lcnMucHVzaChzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcGxheVNlcSh1cChjLnNtKSwgMCwgdHJ1ZSwgYy5yKTsgfSwgdCArIDUwMCkpOwogIH0KICBmdW5jdGlvbiBidWlsZDIoKSB7CiAgICByb290LmlubmVySFRNTCA9ICcnOwogICAgZWxzLnJvb3RzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIGVscy5tb2RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1tb2RlcycgfSk7CiAgICBlbHMubGFicyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSk7CiAgICBlbHMudGl0bGUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtYmlnJyB9KTsKICAgIGVscy5wYXJlbnQgPSBoKCdwJywgeyAnY2xhc3MnOiAnY214LXBhcmVudCcgfSk7CiAgICBlbHMubW9vZCA9IGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtbW9vZCcgfSk7CiAgICBlbHMubGFkZGVyID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWxhZGRlcicgfSk7CiAgICBlbHMubm90ZXMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtbm90ZXMgY214LW5vdGVzLTcnIH0pOwogICAgZWxzLmNoYXJsaW5lID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jaGFybGluZScgfSk7CiAgICBlbHMua2IgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgta2InIH0pOwogICAgZWxzLmZiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWZid3JhcCcgfSk7CiAgICBlbHMuY2hvcmRCdG4gPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsgc3RvcCgpOyB2YXIgYyA9IGN1cnJlbnQoKTsgSy5wbGF5KGNob3JkT2YoYykubWlkaXMsICdzdHJ1bScpOyB9IH0pOwogICAgZWxzLmNvbXBhcmVCdG4gPSBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBnaG9zdCcsIG9uY2xpY2s6IGNvbXBhcmUgfSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkJyB9LCBbCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1Jvb3Qgbm90ZScgfSksIGVscy5yb290cywKICAgICAgaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCBzdHlsZTogJ21hcmdpbi10b3A6MTRweCcsIHRleHQ6ICdNb2RlJyB9KSwgZWxzLm1vZGVzCiAgICBdKSk7CiAgICByb290LmFwcGVuZENoaWxkKGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jYXJkIGNteC1yZXN1bHQnIH0sIFsKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXJoZWFkJyB9LCBbaCgnZGl2Jywge30sIFtlbHMudGl0bGUsIGVscy5wYXJlbnRdKSwgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBsYXknIH0sIFtoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogcGxheU1vZGUgfSwgWyfilrYgUGxheSBvdmVyIGRyb25lJ10pXSldKSwKICAgICAgZWxzLm1vb2QsCiAgICAgIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ0JyaWdodGVzdCDihpIgZGFya2VzdCcgfSksIGVscy5sYWRkZXIsCiAgICAgIGVscy5ub3RlcywgZWxzLmNoYXJsaW5lLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcGxheScsIHN0eWxlOiAnbWFyZ2luOjAgMCAxNHB4JyB9LCBbZWxzLmNob3JkQnRuLCBlbHMuY29tcGFyZUJ0bl0pLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtZmJoZWFkJyB9LCBbZWxzLmxhYnMsIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtc3dpcGUnLCB0ZXh0OiAnU3dpcGUgdG8gc2VlIHRoZSB3aG9sZSBuZWNrIOKGkicgfSldKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJywgc3R5bGU6ICdtYXJnaW4tYm90dG9tOjEwcHgnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6ICdQaWFubycgfSksIGVscy5rYl0pLAogICAgICBlbHMuZmIsCiAgICAgIGgoJ3AnLCB7ICdjbGFzcyc6ICdjbXgtY2Rub3RlJywgdGV4dDogJ0dvbGQgPSByb290IMK3IEdyZWVuID0gY2hhcmFjdGVyaXN0aWMgbm90ZSDCtyBUYXAgYW55IG5vdGUgdG8gaGVhciBpdCcgfSkKICAgIF0pKTsKICAgIHJlbmRlcigpOwogIH0KICBidWlsZDIoKTsKfSkoKTsK".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/why-should-i-learn-modes/">Why Should I Learn Modes? (Interactive Mode Explorer)</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1197</post-id>	</item>
		<item>
		<title>Chord Spelling Calculator</title>
		<link>https://www.cantonmusicacademy.com/chord-calculator/</link>
		
		<dc:creator><![CDATA[Canton Music Academy]]></dc:creator>
		<pubDate>Fri, 04 Oct 2024 02:51:20 +0000</pubDate>
				<category><![CDATA[Guitar]]></category>
		<category><![CDATA[Piano]]></category>
		<category><![CDATA[Music Theory]]></category>
		<guid isPermaLink="false">https://www.cantonmusicacademy.com/?p=1181</guid>

					<description><![CDATA[<p>Pick any root note and chord type to see exactly which notes are in the chord, how it&#8217;s built, and how to play it on piano, guitar or ukulele. Tap play to hear it. Loading the chord calculator… How to Use the Chord Spelling Calculator Start by choosing a root note. All 17 note names...</p>
<p>The post <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<!-- ============================================================
  Canton Music Academy — Blog post: Chord Spelling Calculator (interactive)
  URL stays the same: /chord-calculator/
  WHERE: Posts → edit "Chord Spelling Calculator" → delete ALL old blocks
  (including the old calculator code and images) → add ONE "Custom HTML"
  block → paste everything below → Update → Delete Cache.
  Yoast SEO title:        Chord Spelling Calculator: Notes in Any Chord | Canton Music Academy
  Yoast meta description: Free chord spelling calculator. Pick any root and chord type to see the notes,
                          formula and intervals, plus piano, guitar and ukulele shapes you can hear.
  The script is encoded so WordPress can't alter it. Don't edit the long line by hand.
============================================================= -->
<style>
@font-face{font-family:"CMAcc";src:local("Helvetica Neue"),local("Segoe UI Symbol"),local("Arial Unicode MS"),local("DejaVu Sans"),local("Noto Sans Symbols 2");unicode-range:U+266D-266F,U+1D12A-1D12B;font-weight:100 900}
.cmx{--acc:"CMAcc";--b:#0477BF;--bd:#035a91;--ink:#1A202C;--mut:#4a5568;--line:#e2e8f0;--soft:#f3f7fb;--gold:#F2B233;font-family:"CMAcc",Montserrat,Arial,sans-serif;color:var(--ink)}
.cmx *{box-sizing:border-box}
.cmx h2,.cmx h3,.cmx p,.cmx li,.cmx summary,.cmx button{font-family:"CMAcc",Montserrat,Arial,sans-serif!important}
.cmx .cmx-lead{font-size:1.15rem;line-height:1.7;color:var(--ink)}
.cmx-tool{margin:8px 0 34px}
.cmx-card{background:#fff;border:1px solid var(--line);border-radius:22px;padding:22px 22px;margin:0 0 16px;box-shadow:0 10px 28px rgba(26,32,44,.06)}
.cmx-step{display:flex;align-items:center;gap:10px;margin:0 0 12px;font-size:1rem}
.cmx-step:not(:first-child){margin-top:18px}
.cmx-n{width:28px;height:28px;border-radius:50%;background:var(--ink);color:#fff;font-weight:700;font-size:.85rem;display:inline-flex;align-items:center;justify-content:center;flex:none}
.cmx-lbl{display:block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
.cmx-chips{display:flex;flex-wrap:wrap;gap:6px}
.cmx-chip{font-family:inherit;border:1.5px solid var(--line);background:#fff;color:var(--ink);font-weight:700;font-size:.95rem;border-radius:11px;padding:8px 12px;min-width:46px;min-height:42px;cursor:pointer;transition:all .12s;line-height:1.1}
.cmx-chip.sm{font-size:.86rem;padding:7px 11px;min-height:38px}
.cmx-chip:hover{border-color:var(--b);color:var(--b)}
.cmx-chip.on{background:var(--b);border-color:var(--b);color:#fff}
.cmx-chip:focus-visible,.cmx-btn:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.cmx-quals{display:grid;gap:12px}
.cmx-btn{font-family:inherit;display:inline-flex;align-items:center;gap:6px;border:0;border-radius:999px;font-weight:700;font-size:.92rem;padding:11px 18px;cursor:pointer;min-height:44px;text-decoration:none}
.cmx-btn.blue{background:var(--b);color:#fff}
.cmx-btn.blue:hover{background:var(--bd)}
.cmx-btn.gold{background:var(--gold);color:var(--ink)}
.cmx-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}
.cmx-btn.ghost:hover{border-color:var(--b);color:var(--b)}
.cmx-result{background:linear-gradient(180deg,#f7fbfe 0%,#fff 40%)}
.cmx-rhead{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px 20px;margin-bottom:16px}
.cmx-big{font-size:clamp(2.2rem,6vw,3rem);font-weight:800;letter-spacing:-.02em;line-height:1.05;color:var(--ink)}
.cmx-sub{color:var(--mut);font-weight:600;margin-top:4px}
.cmx-play{display:flex;flex-wrap:wrap;gap:8px}
.cmx-notes{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px}
.cmx-note{flex:1 1 92px;max-width:140px;background:#fff;border:1.5px solid var(--line);border-radius:16px;padding:12px 10px;text-align:center}
.cmx-note b{display:block;font-size:1.6rem;line-height:1.1}
.cmx-note .deg{display:inline-block;margin-top:4px;background:var(--soft);color:var(--b);font-weight:800;font-size:.8rem;border-radius:999px;padding:2px 9px}
.cmx-note small{display:block;color:var(--mut);font-size:.72rem;font-weight:600;margin-top:4px}
.cmx-note.root{border-color:var(--gold);background:#fff8e8}
.cmx-note.bass{box-shadow:inset 0 -4px 0 var(--b)}
.cmx-formula{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 14px;padding:12px 14px;background:var(--soft);border-radius:14px;margin:0 0 12px}
.cmx-formula .cmx-lbl{margin:0}
.cmx-formula b{font-size:1.1rem}
.cmx-formula span:last-child{color:var(--mut);font-size:.85rem;font-weight:600}
.cmx-invrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 16px}
.cmx-invrow .cmx-lbl{margin:0}
.cmx-vis{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;align-items:start}
.cmx-panel{border:1px solid var(--line);border-radius:16px;padding:14px;background:#fff;min-width:0}
.cmx-kb svg{width:100%;height:auto;display:block}
.cmx-ptop{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.cmx-cd{display:flex;justify-content:center}
.cmx-cd svg{width:100%;max-width:220px;height:auto}
.cmx-cdnote{text-align:center;color:var(--mut);font-size:.82rem;margin:4px 0 0!important}
.cmx-fbwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:14px}
.cmx-fbwrap svg{display:block;min-width:720px;width:100%;height:auto}
@media (max-width:640px){
  .cmx-card{padding:16px 14px;border-radius:18px}
  .cmx-vis{grid-template-columns:1fr}
  .cmx-chip{min-width:40px;padding:7px 9px;font-size:.88rem}
  .cmx-note{flex:1 1 70px}
  .cmx-note b{font-size:1.3rem}
  .cmx-play{width:100%}
  .cmx-play .cmx-btn{flex:1;justify-content:center}
}
.cmx details{border:1px solid var(--line);border-radius:16px;padding:0 20px;margin:0 0 10px;background:#fff}
.cmx summary{cursor:pointer;font-weight:700;color:var(--ink);padding:16px 28px 16px 0;list-style:none;position:relative}
.cmx summary::-webkit-details-marker{display:none}
.cmx summary:after{content:"+";position:absolute;right:0;top:12px;font-size:1.4rem;color:var(--b)}
.cmx details[open] summary:after{content:"–"}
.cmx details p{margin:0 0 16px;color:var(--mut)}


</style>

<div class="cmx">

<p class="cmx-lead">Pick any root note and chord type to see exactly which notes are in the chord, how it&#8217;s built, and how to play it on piano, guitar or ukulele. Tap play to hear it.</p>

<div class="cmx-tool" id="cmx-chord"><p style="color:#4a5568;text-align:center;padding:30px 0">Loading the chord calculator…</p></div>

<h2>How to Use the Chord Spelling Calculator</h2>
<p>Start by choosing a root note. All 17 note names are here, including sharps and flats like C♯ and D♭, so your chord is always spelled the way you&#8217;d see it written in music. Then choose a chord type: triads, 6th and 7th chords, or extended chords like 9ths, 11ths and 13ths.</p>
<p>The calculator instantly shows the notes in the chord, each note&#8217;s role (root, 3rd, 5th, 7th and so on), the chord formula, and the chord on a piano keyboard and a guitar or ukulele diagram. You can also flip through the inversions to see which note ends up in the bass.</p>
<p>For example, choose <b>A</b> and <b>m7</b> to see that A minor 7th is spelled <b>A – C – E – G</b>, with the formula 1 – ♭3 – 5 – ♭7.</p>

<h2>Why Chord Spelling Matters</h2>
<p>Every chord is built by stacking notes in a pattern above its root. Knowing a chord&#8217;s spelling helps you:</p>
<ul class="wp-block-list">
  <li>Read and write chords correctly in sheet music</li>
  <li>Find new voicings and inversions on your instrument</li>
  <li>Understand why progressions sound the way they do</li>
  <li>Communicate clearly with bandmates and teachers</li>
</ul>
<p>Spelling also follows letter names. A C major chord in the key of D♭ isn&#8217;t spelled with an E♯; a D♭ major chord is D♭ – F – A♭, not C♯ – F – G♯. The calculator always uses the correct letters, which is exactly what music theory exams and lead sheets expect.</p>

<h2>Chord Spelling FAQ</h2>
<details><summary>What&#8217;s the difference between a chord&#8217;s formula and its spelling?</summary><p>The formula is the pattern (like 1 – 3 – 5 for a major chord) and works in every key. The spelling is the actual notes you get when you apply that formula to a specific root, like C – E – G.</p></details>
<details><summary>What is a chord inversion?</summary><p>An inversion is the same chord with a different note in the bass. C major in root position is C – E – G; first inversion puts E on the bottom (C/E), and second inversion puts G on the bottom (C/G).</p></details>
<details><summary>Why does the guitar shape leave out a note on big chords?</summary><p>Chords like 11ths and 13ths have more notes than you can comfortably play, so guitarists usually leave out the 5th (and sometimes other notes). The calculator does the same to give you a playable shape.</p></details>
<details><summary>What does ♭ or ♯ in the formula mean?</summary><p>It compares each note to the major scale. ♭3 means the 3rd is a half step lower than in the major scale, which is what makes a chord minor.</p></details>

<p>Want to put chords together? Try our free <a href="https://www.cantonmusicacademy.com/chord-progression-builder/">Chord Progression Builder</a> to create, hear and print your own progressions. For a full breakdown of scales and chords, see the <a href="https://www.cantonmusicacademy.com/guitar-music-theory-guide/">Music Theory Guide for Guitar</a>, or learn with a teacher in our <a href="https://www.cantonmusicacademy.com/music-lessons-in-canton-mi/">music lessons in Canton</a>.</p>

</div>
<script>(function(){var b="LyogQ2FudG9uIE11c2ljIEFjYWRlbXkg4oCUIHNoYXJlZCB0aGVvcnkga2l0IGZvciBpbnRlcmFjdGl2ZSBwb3N0cy4KICAgQ29uY2F0ZW5hdGVkIGluIGZyb250IG9mIGVhY2ggdG9vbCdzIGFwcC5qcyBieSB0b29scy9idWlsZC1wb3N0LnB5LgogICBFeHBvc2VzIHdpbmRvdy5DTUsuICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh3aW5kb3cuQ01LKSByZXR1cm47CiAgdmFyIExFVCA9IFsnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0EnLCAnQiddOwogIHZhciBOQVQgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdOwogIHZhciBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CgogIGZ1bmN0aW9uIHBhcnNlTm90ZShuKSB7CiAgICBuID0gU3RyaW5nKG4pLnJlcGxhY2UoJ-KZrycsICcjJykucmVwbGFjZSgn4pmtJywgJ2InKTsKICAgIHZhciBsID0gTEVULmluZGV4T2Yobi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSksIGEgPSAwOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuLmxlbmd0aDsgaSsrKSBhICs9IG4uY2hhckF0KGkpID09PSAnIycgPyAxIDogbi5jaGFyQXQoaSkgPT09ICd4JyA_IDIgOiAtMTsKICAgIHJldHVybiB7IGw6IGwsIGE6IGEsIHBjOiAoTkFUW2xdICsgYSArIDEyMCkgJSAxMiB9OwogIH0KICBmdW5jdGlvbiBhY2NTdHIoYSkgeyByZXR1cm4gYSA9PT0gMCA_ICcnIDogYSA9PT0gMSA_ICfima8nIDogYSA9PT0gMiA_ICfwnYSqJyA6IGEgPT09IC0xID8gJ-KZrScgOiBhID09PSAtMiA_ICfwnYSrJyA6ICcnOyB9CiAgZnVuY3Rpb24gYWNjQXNjaWkoYSkgeyByZXR1cm4gYSA-IDAgPyBuZXcgQXJyYXkoYSArIDEpLmpvaW4oJyMnKSA6IG5ldyBBcnJheSgtYSArIDEpLmpvaW4oJ2InKTsgfQogIGZ1bmN0aW9uIHNwZWxsKGwsIHBjKSB7CiAgICBsID0gKChsICUgNykgKyA3KSAlIDc7CiAgICB2YXIgYSA9ICgocGMgLSBOQVRbbF0pICUgMTIgKyAxOCkgJSAxMiAtIDY7CiAgICByZXR1cm4geyBsOiBsLCBhOiBhLCBwYzogKChwYyAlIDEyKSArIDEyKSAlIDEyLCBuYW1lOiBMRVRbbF0gKyBhY2NTdHIoYSksIGFzY2lpOiBMRVRbbF0gKyBhY2NBc2NpaShhKSB9OwogIH0KICAvKiBpbnRlcnZhbCBmcm9tIHJvb3Q6IGRlZ3JlZSBudW1iZXIgKDEuLjEzKSArIHNlbWl0b25lcyAtPiBzcGVsbGVkIG5vdGUgKi8KICBmdW5jdGlvbiBub3RlQXQocm9vdCwgZGVnLCBzZW1pcykgeyByZXR1cm4gc3BlbGwocm9vdC5sICsgKGRlZyAtIDEpLCByb290LnBjICsgc2VtaXMpOyB9CiAgdmFyIE1BSl9TRU1JID0geyAxOiAwLCAyOiAyLCAzOiA0LCA0OiA1LCA1OiA3LCA2OiA5LCA3OiAxMSwgOTogMTQsIDExOiAxNywgMTM6IDIxIH07CiAgZnVuY3Rpb24gZGVncmVlTGFiZWwoZGVnLCBzZW1pcykgewogICAgdmFyIGQgPSBzZW1pcyAtIE1BSl9TRU1JW2RlZ107CiAgICB2YXIgcHJlID0gZCA9PT0gLTIgPyAn8J2EqycgOiBkID09PSAtMSA_ICfima0nIDogZCA9PT0gMSA_ICfima8nIDogZCA9PT0gMiA_ICfwnYSqJyA6ICcnOwogICAgcmV0dXJuIHByZSArIGRlZzsKICB9CiAgdmFyIElOVF9OQU1FUyA9IHsKICAgICcxOjAnOiAnUm9vdCcsICcyOjEnOiAnTWlub3IgMm5kJywgJzI6Mic6ICdNYWpvciAybmQnLCAnMjozJzogJ0F1Z21lbnRlZCAybmQnLCAnMzozJzogJ01pbm9yIDNyZCcsICczOjQnOiAnTWFqb3IgM3JkJywKICAgICc0OjUnOiAnUGVyZmVjdCA0dGgnLCAnNDo2JzogJ0F1Z21lbnRlZCA0dGgnLCAnNTo2JzogJ0RpbWluaXNoZWQgNXRoJywgJzU6Nyc6ICdQZXJmZWN0IDV0aCcsICc1OjgnOiAnQXVnbWVudGVkIDV0aCcsCiAgICAnNjo4JzogJ01pbm9yIDZ0aCcsICc2OjknOiAnTWFqb3IgNnRoJywgJzc6OSc6ICdEaW1pbmlzaGVkIDd0aCcsICc3OjEwJzogJ01pbm9yIDd0aCcsICc3OjExJzogJ01ham9yIDd0aCcsCiAgICAnOToxMyc6ICdNaW5vciA5dGgnLCAnOToxNCc6ICdNYWpvciA5dGgnLCAnOToxNSc6ICdBdWdtZW50ZWQgOXRoJywgJzExOjE3JzogJ1BlcmZlY3QgMTF0aCcsICcxMToxOCc6ICdBdWdtZW50ZWQgMTF0aCcsCiAgICAnMTM6MjAnOiAnTWlub3IgMTN0aCcsICcxMzoyMSc6ICdNYWpvciAxM3RoJwogIH07CiAgZnVuY3Rpb24gaW50ZXJ2YWxOYW1lKGRlZywgc2VtaXMpIHsgcmV0dXJuIElOVF9OQU1FU1tkZWcgKyAnOicgKyBzZW1pc10gfHwgJyc7IH0KCiAgLyogLS0tLS0tLS0tLSBhdWRpbyAtLS0tLS0tLS0tICovCiAgdmFyIEFDID0gbnVsbDsKICBmdW5jdGlvbiBjdHgoKSB7CiAgICBpZiAoIUFDKSB7IHZhciBDID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OyBpZiAoIUMpIHJldHVybiBudWxsOyBBQyA9IG5ldyBDKCk7IH0KICAgIGlmIChBQy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcpIEFDLnJlc3VtZSgpOwogICAgcmV0dXJuIEFDOwogIH0KICBmdW5jdGlvbiBmcmVxKG0pIHsgcmV0dXJuIDQ0MCAqIE1hdGgucG93KDIsIChtIC0gNjkpIC8gMTIpOyB9CiAgZnVuY3Rpb24gdG9uZShhYywgb3V0LCBtLCB0LCBkdXIsIHZvbCwgdHlwZSkgewogICAgdmFyIGcgPSBhYy5jcmVhdGVHYWluKCksIGxwID0gYWMuY3JlYXRlQmlxdWFkRmlsdGVyKCk7CiAgICBscC50eXBlID0gJ2xvd3Bhc3MnOyBscC5mcmVxdWVuY3kudmFsdWUgPSAyNjAwOwogICAgZy5nYWluLnNldFZhbHVlQXRUaW1lKDAuMDAwMSwgdCk7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2b2wsIHQgKyAwLjAxMik7CiAgICBnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgwLjAwMDEsIHQgKyBkdXIpOwogICAgW3R5cGUgfHwgJ3RyaWFuZ2xlJywgJ3NpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0eSwgaykgewogICAgICB2YXIgbyA9IGFjLmNyZWF0ZU9zY2lsbGF0b3IoKTsgby50eXBlID0gdHk7IG8uZnJlcXVlbmN5LnZhbHVlID0gZnJlcShtKTsgby5kZXR1bmUudmFsdWUgPSBrID8gNSA6IC0zOwogICAgICBvLmNvbm5lY3QobHApOyBvLnN0YXJ0KHQpOyBvLnN0b3AodCArIGR1ciArIDAuMDUpOwogICAgfSk7CiAgICBscC5jb25uZWN0KGcpOyBnLmNvbm5lY3Qob3V0KTsKICB9CiAgLyogcGxheSBtaWRpIG5vdGVzOiBtb2RlICdibG9jaycgfCAndXAnIHwgJ3N0cnVtJyAqLwogIGZ1bmN0aW9uIHBsYXkobWlkaXMsIG1vZGUsIG9wdHMpIHsKICAgIHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47CiAgICBvcHRzID0gb3B0cyB8fCB7fTsKICAgIHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC45OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7CiAgICB2YXIgdDAgPSBhYy5jdXJyZW50VGltZSArIDAuMDMsIG4gPSBtaWRpcy5sZW5ndGgsIHZvbCA9IChvcHRzLnZvbCB8fCAwLjUpIC8gTWF0aC5tYXgoMSwgTWF0aC5zcXJ0KG4pKTsKICAgIHZhciBzdGVwID0gbW9kZSA9PT0gJ3VwJyA_IChvcHRzLnN0ZXAgfHwgMC4zMikgOiBtb2RlID09PSAnc3RydW0nID8gMC4wMyA6IDA7CiAgICBtaWRpcy5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7IHRvbmUoYWMsIG91dCwgbSwgdDAgKyBpICogc3RlcCwgbW9kZSA9PT0gJ3VwJyA_IChvcHRzLmR1ciB8fCAwLjkpIDogKG9wdHMuZHVyIHx8IDEuOCksIG1vZGUgPT09ICd1cCcgPyAwLjMyIDogdm9sKTsgfSk7CiAgICByZXR1cm4gdDAgKyAobiAtIDEpICogc3RlcDsKICB9CiAgZnVuY3Rpb24gZHJvbmUobSwgZHVyKSB7IHZhciBhYyA9IGN0eCgpOyBpZiAoIWFjKSByZXR1cm47IHZhciBvdXQgPSBhYy5jcmVhdGVHYWluKCk7IG91dC5nYWluLnZhbHVlID0gMC41OyBvdXQuY29ubmVjdChhYy5kZXN0aW5hdGlvbik7IHRvbmUoYWMsIG91dCwgbSwgYWMuY3VycmVudFRpbWUgKyAwLjAyLCBkdXIgfHwgMi40LCAwLjIyLCAnc2luZScpOyB9CgogIC8qIC0tLS0tLS0tLS0gc3ZnIGhlbHBlcnMgLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHModGFnLCBhdHRycywgcGFyZW50LCB0ZXh0KSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgdGFnKTsKICAgIGZvciAodmFyIGsgaW4gYXR0cnMpIGUuc2V0QXR0cmlidXRlKGssIGF0dHJzW2tdKTsKICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIGUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgaWYgKHBhcmVudCkgcGFyZW50LmFwcGVuZENoaWxkKGUpOwogICAgcmV0dXJuIGU7CiAgfQogIGZ1bmN0aW9uIHN2Zyh3LCBoLCBjbHMpIHsgdmFyIGUgPSBzKCdzdmcnLCB7IHZpZXdCb3g6ICcwIDAgJyArIHcgKyAnICcgKyBoLCAnY2xhc3MnOiBjbHMgfHwgJycsIHJvbGU6ICdpbWcnIH0pOyByZXR1cm4gZTsgfQoKICAvKiBwaWFubyBrZXlib2FyZDogb24gPSB7bWlkaU9mZnNldEZyb21TdGFydDogbGFiZWx9LCBzdGFydCA9IG1pZGkgb2YgZmlyc3QgQyAqLwogIGZ1bmN0aW9uIGtleWJvYXJkKG9wdHMpIHsKICAgIHZhciBvY3QgPSBvcHRzLm9jdGF2ZXMgfHwgMiwgd3cgPSAzMCwgd2ggPSAxMjAsIGJ3ID0gMTgsIGJoID0gNzQ7CiAgICB2YXIgVyA9IG9jdCAqIDcgKiB3dyArIDEsIGVsID0gc3ZnKFcsIHdoICsgMiwgJ2Ntay1rYicpOwogICAgdmFyIFdJID0gWzAsIDIsIDQsIDUsIDcsIDksIDExXSwgQkwgPSB7IDE6IDAsIDM6IDEsIDY6IDMsIDg6IDQsIDEwOiA1IH07CiAgICB2YXIgb24gPSBvcHRzLm9uIHx8IHt9LCByb290ID0gb3B0cy5yb290OwogICAgZm9yICh2YXIgbyA9IDA7IG8gPCBvY3Q7IG8rKykgV0kuZm9yRWFjaChmdW5jdGlvbiAoc2VtLCBpKSB7CiAgICAgIHZhciBuID0gbyAqIDEyICsgc2VtLCB4ID0gKG8gKiA3ICsgaSkgKiB3dyArIDAuNSwgaGl0ID0gb25bbl0gIT09IHVuZGVmaW5lZDsKICAgICAgcygncmVjdCcsIHsgeDogeCwgeTogMC41LCB3aWR0aDogd3csIGhlaWdodDogd2gsIHJ4OiA0LCBmaWxsOiBoaXQgPyAobiA9PT0gcm9vdCA_ICcjRjJCMjMzJyA6ICcjMDQ3N0JGJykgOiAnI2ZmZicsIHN0cm9rZTogJyM5NGEzYjgnLCAnc3Ryb2tlLXdpZHRoJzogMSB9LCBlbCk7CiAgICAgIGlmIChoaXQgJiYgb25bbl0pIHMoJ3RleHQnLCB7IHg6IHggKyB3dyAvIDIsIHk6IHdoIC0gMTIsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTIsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogbiA9PT0gcm9vdCA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9uW25dKTsKICAgIH0pOwogICAgZm9yICh2YXIgbzIgPSAwOyBvMiA8IG9jdDsgbzIrKykgZm9yICh2YXIgc2VtIGluIEJMKSB7CiAgICAgIHZhciBuMiA9IG8yICogMTIgKyAoK3NlbSksIHgyID0gKG8yICogNyArIEJMW3NlbV0gKyAxKSAqIHd3IC0gYncgLyAyICsgMC41LCBoaXQyID0gb25bbjJdICE9PSB1bmRlZmluZWQ7CiAgICAgIHMoJ3JlY3QnLCB7IHg6IHgyLCB5OiAwLjUsIHdpZHRoOiBidywgaGVpZ2h0OiBiaCwgcng6IDMsIGZpbGw6IGhpdDIgPyAobjIgPT09IHJvb3QgPyAnI0YyQjIzMycgOiAnIzA0NzdCRicpIDogJyMxQTIwMkMnLCBzdHJva2U6ICcjMUEyMDJDJywgJ3N0cm9rZS13aWR0aCc6IDEgfSwgZWwpOwogICAgICBpZiAoaGl0MiAmJiBvbltuMl0pIHMoJ3RleHQnLCB7IHg6IHgyICsgYncgLyAyLCB5OiBiaCAtIDgsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogOS41LCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6IG4yID09PSByb290ID8gJyMxQTIwMkMnIDogJyNmZmYnLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgb25bbjJdKTsKICAgIH0KICAgIHJldHVybiBlbDsKICB9CgogIC8qIGZyZXR0ZWQgY2hvcmQgZGlhZ3JhbTogZnJldHMgYXJyYXkgbG93LT5oaWdoICgtMSBtdXRlKSwgbGFiZWxzIG9wdGlvbmFsICovCiAgZnVuY3Rpb24gZnJldEJhcnJlKGZyZXRzKSB7CiAgICB2YXIgZnIgPSBmcmV0cy5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPiAwOyB9KTsKICAgIGlmICghZnIubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBsbyA9IE1hdGgubWluLmFwcGx5KG51bGwsIGZyKSwgZmlyc3QgPSAtMSwgbiA9IDA7CiAgICBmcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmLCBpKSB7IGlmIChmID09PSBsbykgeyBuKys7IGlmIChmaXJzdCA8IDApIGZpcnN0ID0gaTsgfSB9KTsKICAgIGlmIChuIDwgMiB8fCBmcmV0c1tmcmV0cy5sZW5ndGggLSAxXSAhPT0gbG8pIHJldHVybiBudWxsOwogICAgZm9yICh2YXIgaSA9IGZpcnN0OyBpIDwgZnJldHMubGVuZ3RoOyBpKyspIGlmIChmcmV0c1tpXSA8IGxvKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7IGZyZXQ6IGxvLCBmcm9tOiBmaXJzdCB9OwogIH0KICBmdW5jdGlvbiBjaG9yZERpYWdyYW0odiwgb3B0cykgewogICAgb3B0cyA9IG9wdHMgfHwge307CiAgICB2YXIgbiA9IHYgPyB2LmZyZXRzLmxlbmd0aCA6IChvcHRzLnN0cmluZ3MgfHwgNiksIHNwID0gMjIsIGZzID0gMjYsIFcgPSBzcCAqIChuIC0gMSksIHBhZEwgPSAzMCwgcGFkVCA9IDM0OwogICAgdmFyIGVsID0gc3ZnKFcgKyBwYWRMICsgMjQsIGZzICogNSArIHBhZFQgKyAyNiwgJ2Ntay1jZCcpOwogICAgdmFyIGJhc2UgPSAxOwogICAgaWYgKHYpIHsgdmFyIGZyID0gdi5mcmV0cy5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPiAwOyB9KTsgdmFyIG14ID0gZnIubGVuZ3RoID8gTWF0aC5tYXguYXBwbHkobnVsbCwgZnIpIDogMDsgaWYgKG14ID4gNCkgYmFzZSA9IE1hdGgubWluLmFwcGx5KG51bGwsIGZyKTsgfQogICAgdmFyIHgwID0gcGFkTCwgeTAgPSBwYWRUOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHMoJ2xpbmUnLCB7IHgxOiB4MCArIGkgKiBzcCwgeTE6IHkwLCB4MjogeDAgKyBpICogc3AsIHkyOiB5MCArIGZzICogNSwgc3Ryb2tlOiAnIzY0NzQ4YicsICdzdHJva2Utd2lkdGgnOiAxLjMgfSwgZWwpOwogICAgZm9yICh2YXIgZiA9IDA7IGYgPD0gNTsgZisrKSBzKCdsaW5lJywgeyB4MTogeDAsIHkxOiB5MCArIGYgKiBmcywgeDI6IHgwICsgVywgeTI6IHkwICsgZiAqIGZzLCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IGYgPT09IDAgJiYgYmFzZSA9PT0gMSA_IDUgOiAxLjMgfSwgZWwpOwogICAgaWYgKCF2KSByZXR1cm4gZWw7CiAgICBpZiAoYmFzZSA-IDEpIHMoJ3RleHQnLCB7IHg6IHgwIC0gMTAsIHk6IHkwICsgZnMgKiAwLjY1LCAndGV4dC1hbmNob3InOiAnZW5kJywgJ2ZvbnQtc2l6ZSc6IDEyLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjNDc1NTY5JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGJhc2UgKyAnZnInKTsKICAgIHZhciBiYXIgPSB2LmJhcnJlID09PSB1bmRlZmluZWQgPyBmcmV0QmFycmUodi5mcmV0cykgOiB2LmJhcnJlOwogICAgaWYgKGJhciAmJiBiYXIuZnJldCA-IDApIHsgdmFyIGJ5ID0geTAgKyAoYmFyLmZyZXQgLSBiYXNlICsgMC41KSAqIGZzOyBzKCdyZWN0JywgeyB4OiB4MCArIGJhci5mcm9tICogc3AgLSA5LCB5OiBieSAtIDksIHdpZHRoOiAobiAtIDEgLSBiYXIuZnJvbSkgKiBzcCArIDE4LCBoZWlnaHQ6IDE4LCByeDogOSwgZmlsbDogJyMxQTIwMkMnIH0sIGVsKTsgfQogICAgdi5mcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmdiwgaSkgewogICAgICB2YXIgY3ggPSB4MCArIGkgKiBzcCwgbGFiID0gdi5sYWJlbHMgPyB2LmxhYmVsc1tpXSA6ICcnOwogICAgICBpZiAoZnYgPCAwKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogeTAgLSAxMCwgJ3RleHQtYW5jaG9yJzogJ21pZGRsZScsICdmb250LXNpemUnOiAxNSwgZmlsbDogJyM2NDc0OGInLCAnZm9udC1mYW1pbHknOiAnQXJpYWwnIH0sIGVsLCAnw5cnKTsKICAgICAgZWxzZSBpZiAoZnYgPT09IDApIHMoJ2NpcmNsZScsIHsgY3g6IGN4LCBjeTogeTAgLSAxNCwgcjogNiwgZmlsbDogJ25vbmUnLCBzdHJva2U6ICcjNjQ3NDhiJywgJ3N0cm9rZS13aWR0aCc6IDEuOCB9LCBlbCk7CiAgICAgIGVsc2UgaWYgKCEoYmFyICYmIGZ2ID09PSBiYXIuZnJldCAmJiBpID49IGJhci5mcm9tKSkgewogICAgICAgIHZhciBjeSA9IHkwICsgKGZ2IC0gYmFzZSArIDAuNSkgKiBmczsKICAgICAgICBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiA5LjUsIGZpbGw6IHYucm9vdElkeCA9PT0gaSA_ICcjRjJCMjMzJyA6ICcjMUEyMDJDJyB9LCBlbCk7CiAgICAgIH0KICAgICAgaWYgKGxhYikgcygndGV4dCcsIHsgeDogY3gsIHk6IHkwICsgZnMgKiA1ICsgMTgsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsICdmb250LXdlaWdodCc6IDcwMCwgZmlsbDogJyM0NzU1NjknLCAnZm9udC1mYW1pbHknOiAnQ01BY2MsTW9udHNlcnJhdCxBcmlhbCxzYW5zLXNlcmlmJyB9LCBlbCwgbGFiKTsKICAgIH0pOwogICAgcmV0dXJuIGVsOwogIH0KICAvKiBnZW5lcmljIGZyZXR0ZWQgdm9pY2luZyBzZWFyY2g6IHR1bmluZyA9IG1pZGkgcGVyIHN0cmluZyBsb3ctPmhpZ2ggKi8KICBmdW5jdGlvbiBzZWFyY2hWb2ljaW5nKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIHIgPSBzZWFyY2hQYXNzKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMsIGZhbHNlKTsKICAgIGlmICghciAmJiB0dW5pbmcubGVuZ3RoIDw9IDQpIHIgPSBzZWFyY2hQYXNzKHR1bmluZywgdG9uZXMsIGJhc3NQYywgZmlmdGgsIG9wdHMsIHRydWUpOwogICAgcmV0dXJuIHI7CiAgfQogIGZ1bmN0aW9uIHNlYXJjaFBhc3ModHVuaW5nLCB0b25lcywgYmFzc1BjLCBmaWZ0aCwgb3B0cywgcmVsYXhlZCkgewogICAgdmFyIG4gPSB0dW5pbmcubGVuZ3RoLCBiZXN0ID0gbnVsbCwgZiA9IG5ldyBBcnJheShuKSwgbWluUGxheWVkID0gcmVsYXhlZCA_IG4gLSAxIDogKG9wdHMubWluUGxheWVkIHx8IE1hdGgubWluKG4sIE1hdGgubWF4KDMsIHRvbmVzLmxlbmd0aCkpKTsKICAgIHZhciBhbGxvd011dGUgPSBuID4gNCB8fCByZWxheGVkOwogICAgZm9yICh2YXIgcCA9IDA7IHAgPCAxMTsgcCsrKSB7CiAgICAgIHZhciBvcHRzRiA9IGFsbG93TXV0ZSA_IFstMSwgMF0gOiBbMF07CiAgICAgIGZvciAodmFyIGsgPSBNYXRoLm1heCgxLCBwKTsgayA8PSBwICsgMzsgaysrKSBvcHRzRi5wdXNoKGspOwogICAgICAoZnVuY3Rpb24gcmVjKGkpIHsKICAgICAgICBpZiAoaSA9PT0gbikgewogICAgICAgICAgdmFyIGhhdmUgPSB7fSwgZnIgPSBbXSwgZmlyc3QgPSAtMSwgcGxheWVkID0gMDsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7IGlmIChmW2pdIDwgMCkgY29udGludWU7IGlmIChmaXJzdCA8IDApIGZpcnN0ID0gajsgcGxheWVkKys7IGhhdmVbKHR1bmluZ1tqXSArIGZbal0pICUgMTJdID0gMTsgaWYgKGZbal0gPiAwKSBmci5wdXNoKGZbal0pOyB9CiAgICAgICAgICBpZiAocGxheWVkIDwgbWluUGxheWVkKSByZXR1cm47CiAgICAgICAgICBpZiAoYmFzc1BjICE9PSBudWxsICYmIGJhc3NQYyAhPT0gdW5kZWZpbmVkICYmICh0dW5pbmdbZmlyc3RdICsgZltmaXJzdF0pICUgMTIgIT09IGJhc3NQYykgcmV0dXJuOwogICAgICAgICAgaWYgKCFyZWxheGVkKSBmb3IgKHZhciBtID0gZmlyc3Q7IG0gPCBuIC0gMTsgbSsrKSBpZiAoZlttXSA8IDApIHJldHVybjsKICAgICAgICAgIHZhciBtaXNzaW5nID0gdG9uZXMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7IHJldHVybiAhaGF2ZVt0XTsgfSk7CiAgICAgICAgICB2YXIgYWxsb3dNaXNzID0gdG9uZXMubGVuZ3RoID4gbiA_IDIgOiAxOwogICAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gYWxsb3dNaXNzKSByZXR1cm47CiAgICAgICAgICBpZiAobWlzc2luZy5zb21lKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ICE9PSBmaWZ0aCAmJiAhKChyZWxheGVkIHx8IHRvbmVzLmxlbmd0aCA-IG4pICYmIHggPT09IHRvbmVzWzBdKTsgfSkpIHJldHVybjsKICAgICAgICAgIHZhciBoaSA9IGZyLmxlbmd0aCA_IE1hdGgubWF4LmFwcGx5KG51bGwsIGZyKSA6IDAsIGxvID0gZnIubGVuZ3RoID8gTWF0aC5taW4uYXBwbHkobnVsbCwgZnIpIDogMDsKICAgICAgICAgIGlmIChoaSAtIGxvID4gMykgcmV0dXJuOwogICAgICAgICAgdmFyIGJhciA9IGZyZXRCYXJyZShmKSwgZmluZ2VycyA9IGZyLmxlbmd0aDsKICAgICAgICAgIGlmIChiYXIpIGZpbmdlcnMgLT0gZnIuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ID09PSBsbzsgfSkubGVuZ3RoIC0gMTsKICAgICAgICAgIGlmIChmaW5nZXJzID4gNCkgcmV0dXJuOwogICAgICAgICAgdmFyIHNjb3JlID0gaGkgKiAyICsgKGhpIC0gbG8pICsgZnIubGVuZ3RoICogMC4zICsgKG4gLSBwbGF5ZWQpICogMC44ICsgbWlzc2luZy5sZW5ndGggKiA1OwogICAgICAgICAgaWYgKCFiZXN0IHx8IHNjb3JlIDwgYmVzdC5zY29yZSkgYmVzdCA9IHsgc2NvcmU6IHNjb3JlLCBmcmV0czogZi5zbGljZSgpLCBiYXJyZTogKGJhciAmJiBmci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggPT09IGxvOyB9KS5sZW5ndGggPj0gMykgPyBiYXIgOiBudWxsIH07CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgb3B0c0YubGVuZ3RoOyBvKyspIHsKICAgICAgICAgIHZhciB2ID0gb3B0c0Zbb107CiAgICAgICAgICBpZiAodiA-PSAwICYmIHRvbmVzLmluZGV4T2YoKHR1bmluZ1tpXSArIHYpICUgMTIpIDwgMCkgY29udGludWU7CiAgICAgICAgICBmW2ldID0gdjsgcmVjKGkgKyAxKTsKICAgICAgICB9CiAgICAgIH0pKDApOwogICAgfQogICAgcmV0dXJuIGJlc3Q7CiAgfQogIHZhciBUVU5JTkdTID0geyBndWl0YXI6IFs0MCwgNDUsIDUwLCA1NSwgNTksIDY0XSwgdWt1bGVsZTogWzY3LCA2MCwgNjQsIDY5XSB9OwoKICAvKiBmcmV0Ym9hcmQ6IHR1bmluZyBtaWRpIGxvdy0-aGlnaCwgbWFya3M6IFt7cyxmLGxhYmVsLGtpbmR9XSBraW5kOiAncm9vdCd8J25vdGUnfCdkaW0nICovCiAgZnVuY3Rpb24gZnJldGJvYXJkKHR1bmluZywgbWFya3MsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGZyZXRzID0gb3B0cy5mcmV0cyB8fCAxNSwgbiA9IHR1bmluZy5sZW5ndGgsIGZ3ID0gNDYsIHNoID0gMjYsIHBhZEwgPSA0NiwgcGFkVCA9IDIyOwogICAgdmFyIFcgPSBwYWRMICsgZnJldHMgKiBmdyArIDE2LCBIID0gcGFkVCArIChuIC0gMSkgKiBzaCArIDM0OwogICAgdmFyIGVsID0gc3ZnKFcsIEgsICdjbWstZmInKTsKICAgIHMoJ3JlY3QnLCB7IHg6IHBhZEwsIHk6IHBhZFQgLSA4LCB3aWR0aDogZnJldHMgKiBmdywgaGVpZ2h0OiAobiAtIDEpICogc2ggKyAxNiwgcng6IDQsIGZpbGw6ICcjZmJmNmVlJyB9LCBlbCk7CiAgICBbMywgNSwgNywgOSwgMTUsIDE3XS5mb3JFYWNoKGZ1bmN0aW9uIChmeCkgeyBpZiAoZnggPD0gZnJldHMpIHMoJ2NpcmNsZScsIHsgY3g6IHBhZEwgKyAoZnggLSAwLjUpICogZncsIGN5OiBwYWRUICsgKG4gLSAxKSAqIHNoIC8gMiwgcjogNSwgZmlsbDogJyNlN2RjY2InIH0sIGVsKTsgfSk7CiAgICBpZiAoZnJldHMgPj0gMTIpIHsgcygnY2lyY2xlJywgeyBjeDogcGFkTCArIDExLjUgKiBmdywgY3k6IHBhZFQgKyAobiAtIDEpICogc2ggKiAwLjI1LCByOiA1LCBmaWxsOiAnI2U3ZGNjYicgfSwgZWwpOyBzKCdjaXJjbGUnLCB7IGN4OiBwYWRMICsgMTEuNSAqIGZ3LCBjeTogcGFkVCArIChuIC0gMSkgKiBzaCAqIDAuNzUsIHI6IDUsIGZpbGw6ICcjZTdkY2NiJyB9LCBlbCk7IH0KICAgIGZvciAodmFyIGZ4MiA9IDA7IGZ4MiA8PSBmcmV0czsgZngyKyspIHMoJ2xpbmUnLCB7IHgxOiBwYWRMICsgZngyICogZncsIHkxOiBwYWRUIC0gOCwgeDI6IHBhZEwgKyBmeDIgKiBmdywgeTI6IHBhZFQgKyAobiAtIDEpICogc2ggKyA4LCBzdHJva2U6IGZ4MiA9PT0gMCA_ICcjMUEyMDJDJyA6ICcjYjhhOThmJywgJ3N0cm9rZS13aWR0aCc6IGZ4MiA9PT0gMCA_IDUgOiAxLjQgfSwgZWwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIHkgPSBwYWRUICsgKG4gLSAxIC0gaSkgKiBzaDsKICAgICAgcygnbGluZScsIHsgeDE6IHBhZEwsIHkxOiB5LCB4MjogcGFkTCArIGZyZXRzICogZncsIHkyOiB5LCBzdHJva2U6ICcjOGE3YTY0JywgJ3N0cm9rZS13aWR0aCc6IDEgKyAobiAtIDEgLSBpKSAqIDAuMjUgfSwgZWwpOwogICAgICB2YXIgb3BlbiA9IHNwZWxsKExFVC5pbmRleE9mKG9wdHMub3Blbk5hbWVzID8gb3B0cy5vcGVuTmFtZXNbaV0uY2hhckF0KDApIDogJ0MnKSwgdHVuaW5nW2ldKTsKICAgICAgcygndGV4dCcsIHsgeDogcGFkTCAtIDE4LCB5OiB5ICsgNC41LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IDEzLCAnZm9udC13ZWlnaHQnOiA3MDAsIGZpbGw6ICcjNDc1NTY5JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG9wdHMub3Blbk5hbWVzID8gb3B0cy5vcGVuTmFtZXNbaV0gOiBvcGVuLm5hbWUpOwogICAgfQogICAgZm9yICh2YXIgZngzID0gMTsgZngzIDw9IGZyZXRzOyBmeDMrKykgaWYgKFszLCA1LCA3LCA5LCAxMiwgMTVdLmluZGV4T2YoZngzKSA-PSAwKSBzKCd0ZXh0JywgeyB4OiBwYWRMICsgKGZ4MyAtIDAuNSkgKiBmdywgeTogSCAtIDYsICd0ZXh0LWFuY2hvcic6ICdtaWRkbGUnLCAnZm9udC1zaXplJzogMTEsIGZpbGw6ICcjOTRhM2I4JywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIGZ4Myk7CiAgICAobWFya3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgdmFyIGN4ID0gbS5mID09PSAwID8gcGFkTCAtIDE4IDogcGFkTCArIChtLmYgLSAwLjUpICogZncsIGN5ID0gcGFkVCArIChuIC0gMSAtIG0ucykgKiBzaDsKICAgICAgdmFyIGZpbGwgPSBtLmtpbmQgPT09ICdyb290JyA_ICcjRjJCMjMzJyA6IG0ua2luZCA9PT0gJ2RpbScgPyAnI2NiZDVlMScgOiBtLmtpbmQgPT09ICdhbHQnID8gJyMyMjgwM2YnIDogJyMwNDc3QkYnOwogICAgICBpZiAobS5mID09PSAwKSBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiAxMSwgZmlsbDogZmlsbCwgc3Ryb2tlOiAnI2ZmZicsICdzdHJva2Utd2lkdGgnOiAyIH0sIGVsKTsKICAgICAgZWxzZSBzKCdjaXJjbGUnLCB7IGN4OiBjeCwgY3k6IGN5LCByOiAxMSwgZmlsbDogZmlsbCB9LCBlbCk7CiAgICAgIGlmIChtLmxhYmVsKSBzKCd0ZXh0JywgeyB4OiBjeCwgeTogY3kgKyA0LCAndGV4dC1hbmNob3InOiAnbWlkZGxlJywgJ2ZvbnQtc2l6ZSc6IG0ubGFiZWwubGVuZ3RoID4gMiA_IDguNSA6IDEwLjUsICdmb250LXdlaWdodCc6IDgwMCwgZmlsbDogbS5raW5kID09PSAncm9vdCcgfHwgbS5raW5kID09PSAnZGltJyA_ICcjMUEyMDJDJyA6ICcjZmZmJywgJ2ZvbnQtZmFtaWx5JzogJ0NNQWNjLE1vbnRzZXJyYXQsQXJpYWwsc2Fucy1zZXJpZicgfSwgZWwsIG0ubGFiZWwpOwogICAgfSk7CiAgICByZXR1cm4gZWw7CiAgfQoKICAvKiBET00gaGVscGVyICovCiAgZnVuY3Rpb24gaCh0YWcsIGF0dHJzLCBraWRzKSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChhdHRycykgZm9yICh2YXIgayBpbiBhdHRycykgewogICAgICBpZiAoayA9PT0gJ3RleHQnKSBlLnRleHRDb250ZW50ID0gYXR0cnNba107CiAgICAgIGVsc2UgaWYgKGsuc2xpY2UoMCwgMikgPT09ICdvbicpIGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLCBhdHRyc1trXSk7CiAgICAgIGVsc2UgaWYgKGF0dHJzW2tdICE9PSBmYWxzZSAmJiBhdHRyc1trXSAhPT0gbnVsbCAmJiBhdHRyc1trXSAhPT0gdW5kZWZpbmVkKSBlLnNldEF0dHJpYnV0ZShrLCBhdHRyc1trXSA9PT0gdHJ1ZSA_ICcnIDogYXR0cnNba10pOwogICAgfQogICAgKGtpZHMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgaWYgKGMpIGUuYXBwZW5kQ2hpbGQodHlwZW9mIGMgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYykgOiBjKTsgfSk7CiAgICByZXR1cm4gZTsKICB9CgogIHdpbmRvdy5DTUsgPSB7CiAgICBMRVQ6IExFVCwgTkFUOiBOQVQsIHBhcnNlTm90ZTogcGFyc2VOb3RlLCBzcGVsbDogc3BlbGwsIGFjY1N0cjogYWNjU3RyLCBub3RlQXQ6IG5vdGVBdCwgZGVncmVlTGFiZWw6IGRlZ3JlZUxhYmVsLAogICAgaW50ZXJ2YWxOYW1lOiBpbnRlcnZhbE5hbWUsIE1BSl9TRU1JOiBNQUpfU0VNSSwgcGxheTogcGxheSwgZHJvbmU6IGRyb25lLCBjdHg6IGN0eCwgc3ZnRWw6IHMsIHN2Zzogc3ZnLAogICAga2V5Ym9hcmQ6IGtleWJvYXJkLCBjaG9yZERpYWdyYW06IGNob3JkRGlhZ3JhbSwgc2VhcmNoVm9pY2luZzogc2VhcmNoVm9pY2luZywgZnJldEJhcnJlOiBmcmV0QmFycmUsCiAgICBUVU5JTkdTOiBUVU5JTkdTLCBmcmV0Ym9hcmQ6IGZyZXRib2FyZCwgaDogaAogIH07Cn0pKCk7CgovKiBDaG9yZCBTcGVsbGluZyBDYWxjdWxhdG9yIOKAlCB1c2VzIHdpbmRvdy5DTUsgKHRoZW9yeS1raXQpICovCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NteC1jaG9yZCcpOwogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWFkeScpKSByZXR1cm47CiAgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhZHknLCAnMScpOwogIHZhciBLID0gd2luZG93LkNNSywgaCA9IEsuaDsKCiAgdmFyIFJPT1RTID0gWydDJywgJ0MjJywgJ0RiJywgJ0QnLCAnRCMnLCAnRWInLCAnRScsICdGJywgJ0YjJywgJ0diJywgJ0cnLCAnRyMnLCAnQWInLCAnQScsICdBIycsICdCYicsICdCJ107CiAgdmFyIFQgPSBbWzEsIDBdLCBbMywgNF0sIFs1LCA3XV0sIG0gPSBbWzEsIDBdLCBbMywgM10sIFs1LCA3XV0sIGQgPSBbWzEsIDBdLCBbMywgM10sIFs1LCA2XV0sIHM0ID0gW1sxLCAwXSwgWzQsIDVdLCBbNSwgN11dOwogIGZ1bmN0aW9uIGFkZChiYXNlLCBleHRyYSkgeyByZXR1cm4gYmFzZS5jb25jYXQoZXh0cmEpOyB9CiAgdmFyIFEgPSB7CiAgICBtYWo6IHsgc3ltOiAnJywgbmFtZTogJ01ham9yJywgZjogVCB9LAogICAgbWluOiB7IHN5bTogJ20nLCBuYW1lOiAnTWlub3InLCBmOiBtIH0sCiAgICBkaW06IHsgc3ltOiAnwrAnLCBuYW1lOiAnRGltaW5pc2hlZCcsIGY6IGQgfSwKICAgIGF1ZzogeyBzeW06ICcrJywgbmFtZTogJ0F1Z21lbnRlZCcsIGY6IFtbMSwgMF0sIFszLCA0XSwgWzUsIDhdXSB9LAogICAgc3VzMjogeyBzeW06ICdzdXMyJywgbmFtZTogJ1N1c3BlbmRlZCAybmQnLCBmOiBbWzEsIDBdLCBbMiwgMl0sIFs1LCA3XV0gfSwKICAgIHN1czQ6IHsgc3ltOiAnc3VzNCcsIG5hbWU6ICdTdXNwZW5kZWQgNHRoJywgZjogczQgfSwKICAgIHA1OiB7IHN5bTogJzUnLCBuYW1lOiAnUG93ZXIgY2hvcmQnLCBmOiBbWzEsIDBdLCBbNSwgN11dIH0sCiAgICBzaXg6IHsgc3ltOiAnNicsIG5hbWU6ICdNYWpvciA2dGgnLCBmOiBhZGQoVCwgW1s2LCA5XV0pIH0sCiAgICBtNjogeyBzeW06ICdtNicsIG5hbWU6ICdNaW5vciA2dGgnLCBmOiBhZGQobSwgW1s2LCA5XV0pIH0sCiAgICBkb203OiB7IHN5bTogJzcnLCBuYW1lOiAnRG9taW5hbnQgN3RoJywgZjogYWRkKFQsIFtbNywgMTBdXSkgfSwKICAgIG1hajc6IHsgc3ltOiAnbWFqNycsIG5hbWU6ICdNYWpvciA3dGgnLCBmOiBhZGQoVCwgW1s3LCAxMV1dKSB9LAogICAgbTc6IHsgc3ltOiAnbTcnLCBuYW1lOiAnTWlub3IgN3RoJywgZjogYWRkKG0sIFtbNywgMTBdXSkgfSwKICAgIG03YjU6IHsgc3ltOiAnbTfima01JywgbmFtZTogJ0hhbGYtZGltaW5pc2hlZCA3dGgnLCBmOiBhZGQoZCwgW1s3LCAxMF1dKSB9LAogICAgZGltNzogeyBzeW06ICfCsDcnLCBuYW1lOiAnRGltaW5pc2hlZCA3dGgnLCBmOiBhZGQoZCwgW1s3LCA5XV0pIH0sCiAgICBtTTc6IHsgc3ltOiAnbShtYWo3KScsIG5hbWU6ICdNaW5vci1tYWpvciA3dGgnLCBmOiBhZGQobSwgW1s3LCAxMV1dKSB9LAogICAgc3VzNDc6IHsgc3ltOiAnN3N1czQnLCBuYW1lOiAnRG9taW5hbnQgN3RoIHN1czQnLCBmOiBhZGQoczQsIFtbNywgMTBdXSkgfSwKICAgIGFkZDk6IHsgc3ltOiAnYWRkOScsIG5hbWU6ICdBZGRlZCA5dGgnLCBmOiBhZGQoVCwgW1s5LCAxNF1dKSB9LAogICAgbWFkZDk6IHsgc3ltOiAnbShhZGQ5KScsIG5hbWU6ICdNaW5vciBhZGRlZCA5dGgnLCBmOiBhZGQobSwgW1s5LCAxNF1dKSB9LAogICAgbmluZTogeyBzeW06ICc5JywgbmFtZTogJ0RvbWluYW50IDl0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XV0pIH0sCiAgICBtYWo5OiB7IHN5bTogJ21hajknLCBuYW1lOiAnTWFqb3IgOXRoJywgZjogYWRkKFQsIFtbNywgMTFdLCBbOSwgMTRdXSkgfSwKICAgIG05OiB7IHN5bTogJ205JywgbmFtZTogJ01pbm9yIDl0aCcsIGY6IGFkZChtLCBbWzcsIDEwXSwgWzksIDE0XV0pIH0sCiAgICBlbGV2ZW46IHsgc3ltOiAnMTEnLCBuYW1lOiAnRG9taW5hbnQgMTF0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XSwgWzExLCAxN11dKSB9LAogICAgdGhpcnRlZW46IHsgc3ltOiAnMTMnLCBuYW1lOiAnRG9taW5hbnQgMTN0aCcsIGY6IGFkZChULCBbWzcsIDEwXSwgWzksIDE0XSwgWzEzLCAyMV1dKSB9CiAgfTsKICB2YXIgR1JPVVBTID0gWwogICAgWydUcmlhZHMnLCBbJ21haicsICdtaW4nLCAnZGltJywgJ2F1ZycsICdzdXMyJywgJ3N1czQnLCAncDUnXV0sCiAgICBbJzZ0aHMgJiA3dGhzJywgWydzaXgnLCAnbTYnLCAnZG9tNycsICdtYWo3JywgJ203JywgJ203YjUnLCAnZGltNycsICdtTTcnLCAnc3VzNDcnXV0sCiAgICBbJ0V4dGVuZGVkJywgWydhZGQ5JywgJ21hZGQ5JywgJ25pbmUnLCAnbWFqOScsICdtOScsICdlbGV2ZW4nLCAndGhpcnRlZW4nXV0KICBdOwogIHZhciBzdGF0ZSA9IHsgcm9vdDogJ0EnLCBxOiAnbTcnLCBpbnY6IDAsIGluc3Q6ICdndWl0YXInIH07CiAgKGZ1bmN0aW9uIGZyb21IYXNoKCkgewogICAgdmFyIG10ID0gbG9jYXRpb24uaGFzaC5tYXRjaCgvY2hvcmQ9KFtBLUddWyNiXT8pLShcdyspKD86LShcZCkpPy8pOwogICAgaWYgKG10ICYmIFJPT1RTLmluZGV4T2YobXRbMV0pID49IDAgJiYgUVttdFsyXV0pIHsgc3RhdGUucm9vdCA9IG10WzFdOyBzdGF0ZS5xID0gbXRbMl07IHN0YXRlLmludiA9ICsobXRbM10gfHwgMCk7IH0KICB9KSgpOwogIGZ1bmN0aW9uIHByZXR0eShuKSB7IHJldHVybiBuLnJlcGxhY2UoJyMnLCAn4pmvJykucmVwbGFjZSgnYicsICfima0nKTsgfQoKICBmdW5jdGlvbiBjb21wdXRlKCkgewogICAgdmFyIHIgPSBLLnBhcnNlTm90ZShzdGF0ZS5yb290KSwgcSA9IFFbc3RhdGUucV07CiAgICB2YXIgbm90ZXMgPSBxLmYubWFwKGZ1bmN0aW9uIChpdikgewogICAgICB2YXIgbiA9IEsubm90ZUF0KHIsIGl2WzBdLCBpdlsxXSk7CiAgICAgIHJldHVybiB7IGRlZzogaXZbMF0sIHNlbWlzOiBpdlsxXSwgbm90ZTogbiwgbGFiZWw6IEsuZGVncmVlTGFiZWwoaXZbMF0sIGl2WzFdKSwgaW5hbWU6IEsuaW50ZXJ2YWxOYW1lKGl2WzBdLCBpdlsxXSkgfTsKICAgIH0pOwogICAgdmFyIG1heEludiA9IE1hdGgubWluKG5vdGVzLmxlbmd0aCwgNCkgLSAxOwogICAgaWYgKHN0YXRlLnEgPT09ICdwNScpIG1heEludiA9IDE7CiAgICBpZiAoc3RhdGUuaW52ID4gbWF4SW52KSBzdGF0ZS5pbnYgPSAwOwogICAgdmFyIG9yZGVyID0gbm90ZXMuc2xpY2Uoc3RhdGUuaW52KS5jb25jYXQobm90ZXMuc2xpY2UoMCwgc3RhdGUuaW52KSk7CiAgICB2YXIgYmFzcyA9IG9yZGVyWzBdLm5vdGU7CiAgICB2YXIgbmFtZSA9IHByZXR0eShzdGF0ZS5yb290KSArIHEuc3ltICsgKHN0YXRlLmludiA_ICcvJyArIGJhc3MubmFtZSA6ICcnKTsKICAgIHJldHVybiB7IHI6IHIsIHE6IHEsIG5vdGVzOiBub3Rlcywgb3JkZXI6IG9yZGVyLCBiYXNzOiBiYXNzLCBuYW1lOiBuYW1lLCBtYXhJbnY6IG1heEludiB9OwogIH0KICBmdW5jdGlvbiBtaWRpc0ZvcihjKSB7CiAgICB2YXIgYmFzZSA9IDQ4ICsgYy5yLnBjLCBsaXN0ID0gW107CiAgICBjLm5vdGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgbGlzdC5wdXNoKGJhc2UgKyBuLnNlbWlzKTsgfSk7CiAgICB2YXIgaW52ID0gbGlzdC5zbGljZShzdGF0ZS5pbnYpLmNvbmNhdChsaXN0LnNsaWNlKDAsIHN0YXRlLmludikubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ICsgMTI7IH0pKTsKICAgIHdoaWxlIChpbnZbMF0gPj0gNjApIGludiA9IGludi5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggLSAxMjsgfSk7CiAgICByZXR1cm4gaW52OwogIH0KICBmdW5jdGlvbiBmcmV0VG9uZXMoYykgewogICAgdmFyIHQgPSBjLm5vdGVzLnNsaWNlKCk7CiAgICBmdW5jdGlvbiBkcm9wKGRlZykgeyBpZiAodC5sZW5ndGggPiA0KSB0ID0gdC5maWx0ZXIoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4uZGVnICE9PSBkZWc7IH0pOyB9CiAgICBpZiAoc3RhdGUucSA9PT0gJ2VsZXZlbicpIGRyb3AoMyk7CiAgICBkcm9wKDUpOwogICAgaWYgKHN0YXRlLnEgPT09ICd0aGlydGVlbicpIGRyb3AoOSk7CiAgICByZXR1cm4gdC5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4ubm90ZS5wYzsgfSk7CiAgfQogIHZhciB2Y2FjaGUgPSB7fTsKICBmdW5jdGlvbiB2b2ljaW5nKGMsIGluc3QpIHsKICAgIHZhciBrZXkgPSBpbnN0ICsgYy5yLnBjICsgc3RhdGUucSArIHN0YXRlLmludjsKICAgIGlmICh2Y2FjaGVba2V5XSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmNhY2hlW2tleV07CiAgICB2YXIgdG9uZXMgPSBmcmV0VG9uZXMoYyksIGZpZnRoID0gLTE7CiAgICBjLm5vdGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgaWYgKG4uZGVnID09PSA1KSBmaWZ0aCA9IG4ubm90ZS5wYzsgfSk7CiAgICB2YXIgdHVuID0gSy5UVU5JTkdTW2luc3RdOwogICAgdmFyIGJhc3NQYyA9IGluc3QgPT09ICdndWl0YXInID8gYy5iYXNzLnBjIDogbnVsbDsKICAgIGlmIChpbnN0ID09PSAnZ3VpdGFyJyAmJiB0b25lcy5pbmRleE9mKGJhc3NQYykgPCAwKSB0b25lcy5wdXNoKGJhc3NQYyk7CiAgICB2YXIgdiA9IEsuc2VhcmNoVm9pY2luZyh0dW4sIHRvbmVzLCBiYXNzUGMsIGZpZnRoLCB7IG1pblBsYXllZDogaW5zdCA9PT0gJ2d1aXRhcicgPyBNYXRoLm1pbig0LCBNYXRoLm1heCgzLCB0b25lcy5sZW5ndGgpKSA6IDQgfSk7CiAgICBpZiAodikgewogICAgICB2LmxhYmVscyA9IHYuZnJldHMubWFwKGZ1bmN0aW9uIChmLCBpKSB7CiAgICAgICAgaWYgKGYgPCAwKSByZXR1cm4gJyc7CiAgICAgICAgdmFyIHBjID0gKHR1bltpXSArIGYpICUgMTIsIGhpdCA9IG51bGw7CiAgICAgICAgYy5ub3Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGlmIChuLm5vdGUucGMgPT09IHBjKSBoaXQgPSBuOyB9KTsKICAgICAgICByZXR1cm4gaGl0ID8gaGl0Lm5vdGUubmFtZSA6ICcnOwogICAgICB9KTsKICAgICAgdi5yb290SWR4ID0gLTE7CiAgICB9CiAgICB2Y2FjaGVba2V5XSA9IHYgfHwgbnVsbDsKICAgIHJldHVybiB2Y2FjaGVba2V5XTsKICB9CgogIHZhciBlbHMgPSB7fTsKICBmdW5jdGlvbiBjaGlwKGxhYmVsLCBvbiwgb25jbGljaywgY2xzKSB7IHJldHVybiBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWNoaXAnICsgKG9uID8gJyBvbicgOiAnJykgKyAoY2xzID8gJyAnICsgY2xzIDogJycpLCAnYXJpYS1wcmVzc2VkJzogb24gPyAndHJ1ZScgOiAnZmFsc2UnLCBvbmNsaWNrOiBvbmNsaWNrIH0sIFtsYWJlbF0pOyB9CiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgdmFyIGMgPSBjb21wdXRlKCk7CiAgICB0cnkgeyBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgJyNjaG9yZD0nICsgc3RhdGUucm9vdCArICctJyArIHN0YXRlLnEgKyAoc3RhdGUuaW52ID8gJy0nICsgc3RhdGUuaW52IDogJycpKTsgfSBjYXRjaCAoZSkge30KICAgIC8vIHJvb3RzCiAgICBlbHMucm9vdHMuaW5uZXJIVE1MID0gJyc7CiAgICBST09UUy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IGVscy5yb290cy5hcHBlbmRDaGlsZChjaGlwKHByZXR0eShuKSwgbiA9PT0gc3RhdGUucm9vdCwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5yb290ID0gbjsgcmVuZGVyKCk7IHBsYXlDaG9yZCgnYmxvY2snKTsgfSkpOyB9KTsKICAgIGVscy5xdWFscy5pbm5lckhUTUwgPSAnJzsKICAgIEdST1VQUy5mb3JFYWNoKGZ1bmN0aW9uIChnKSB7CiAgICAgIGVscy5xdWFscy5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtcWcnIH0sIFtoKCdzcGFuJywgeyAnY2xhc3MnOiAnY214LWxibCcsIHRleHQ6IGdbMF0gfSksIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jaGlwcycgfSwgZ1sxXS5tYXAoZnVuY3Rpb24gKGspIHsKICAgICAgICByZXR1cm4gY2hpcChRW2tdLnN5bSB8fCAnbWFqJywgayA9PT0gc3RhdGUucSwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5xID0gazsgcmVuZGVyKCk7IHBsYXlDaG9yZCgnYmxvY2snKTsgfSwgJ3NtJyk7CiAgICAgIH0pKV0pKTsKICAgIH0pOwogICAgLy8gcmVzdWx0CiAgICBlbHMubmFtZS50ZXh0Q29udGVudCA9IGMubmFtZTsKICAgIGVscy5xbmFtZS50ZXh0Q29udGVudCA9IHByZXR0eShzdGF0ZS5yb290KSArICcgJyArIGMucS5uYW1lICsgKHN0YXRlLmludiA_ICcgwrcgJyArIFsnJywgJzFzdCcsICcybmQnLCAnM3JkJ11bc3RhdGUuaW52XSArICcgaW52ZXJzaW9uJyA6ICcnKTsKICAgIGVscy5ub3Rlcy5pbm5lckhUTUwgPSAnJzsKICAgIGMub3JkZXIuZm9yRWFjaChmdW5jdGlvbiAobiwgaSkgewogICAgICBlbHMubm90ZXMuYXBwZW5kQ2hpbGQoaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LW5vdGUnICsgKG4uZGVnID09PSAxID8gJyByb290JyA6ICcnKSArIChpID09PSAwID8gJyBiYXNzJyA6ICcnKSB9LCBbCiAgICAgICAgaCgnYicsIHsgdGV4dDogbi5ub3RlLm5hbWUgfSksIGgoJ3NwYW4nLCB7ICdjbGFzcyc6ICdkZWcnLCB0ZXh0OiBuLmxhYmVsIH0pLCBoKCdzbWFsbCcsIHsgdGV4dDogbi5pbmFtZSB9KQogICAgICBdKSk7CiAgICB9KTsKICAgIGVscy5mb3JtdWxhLnRleHRDb250ZW50ID0gYy5ub3Rlcy5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4ubGFiZWw7IH0pLmpvaW4oJyDigJMgJyk7CiAgICB2YXIgc2VtaXMgPSBjLm5vdGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5zZW1pczsgfSk7CiAgICBlbHMuc3RlcHMudGV4dENvbnRlbnQgPSBzZW1pcy5zbGljZSgxKS5tYXAoZnVuY3Rpb24gKHgsIGkpIHsgcmV0dXJuIHggLSBzZW1pc1tpXTsgfSkuam9pbignICsgJykgKyAnIGhhbGYgc3RlcHMnOwogICAgLy8gaW52ZXJzaW9ucwogICAgZWxzLmludi5pbm5lckhUTUwgPSAnJzsKICAgIFsnUm9vdCcsICcxc3QnLCAnMm5kJywgJzNyZCddLnNsaWNlKDAsIGMubWF4SW52ICsgMSkuZm9yRWFjaChmdW5jdGlvbiAobGFiLCBpKSB7IGVscy5pbnYuYXBwZW5kQ2hpbGQoY2hpcChsYWIsIGkgPT09IHN0YXRlLmludiwgZnVuY3Rpb24gKCkgeyBzdGF0ZS5pbnYgPSBpOyByZW5kZXIoKTsgcGxheUNob3JkKCdibG9jaycpOyB9LCAnc20nKSk7IH0pOwogICAgLy8ga2V5Ym9hcmQKICAgIHZhciBtaWRzID0gbWlkaXNGb3IoYyksIHN0YXJ0ID0gNDgsIG9uID0ge30sIHJvb3RPZmYgPSBudWxsOwogICAgdmFyIHRvcCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIG1pZHMpIC0gc3RhcnQ7CiAgICBtaWRzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHsgdmFyIG4gPSBjLm9yZGVyW2ldOyBvblt4IC0gc3RhcnRdID0gbi5ub3RlLm5hbWU7IGlmIChuLmRlZyA9PT0gMSkgcm9vdE9mZiA9IHggLSBzdGFydDsgfSk7CiAgICBlbHMua2IuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMua2IuYXBwZW5kQ2hpbGQoSy5rZXlib2FyZCh7IG9jdGF2ZXM6IHRvcCA-IDIzID8gMyA6IDIsIG9uOiBvbiwgcm9vdDogcm9vdE9mZiB9KSk7CiAgICAvLyBmcmV0dGVkCiAgICBlbHMudGFicy5pbm5lckhUTUwgPSAnJzsKICAgIFtbJ2d1aXRhcicsICdHdWl0YXInXSwgWyd1a3VsZWxlJywgJ1VrdWxlbGUnXV0uZm9yRWFjaChmdW5jdGlvbiAobykgeyBlbHMudGFicy5hcHBlbmRDaGlsZChjaGlwKG9bMV0sIHN0YXRlLmluc3QgPT09IG9bMF0sIGZ1bmN0aW9uICgpIHsgc3RhdGUuaW5zdCA9IG9bMF07IHJlbmRlcigpOyB9LCAnc20nKSk7IH0pOwogICAgdmFyIHYgPSB2b2ljaW5nKGMsIHN0YXRlLmluc3QpOwogICAgZWxzLmNkLmlubmVySFRNTCA9ICcnOwogICAgaWYgKHYpIHsKICAgICAgdi5mcmV0cy5mb3JFYWNoKGZ1bmN0aW9uIChmLCBpKSB7IGlmIChmID49IDAgJiYgdi5yb290SWR4IDwgMCkgeyB2YXIgcGMgPSAoSy5UVU5JTkdTW3N0YXRlLmluc3RdW2ldICsgZikgJSAxMjsgaWYgKHBjID09PSBjLnIucGMpIHYucm9vdElkeCA9IGk7IH0gfSk7CiAgICAgIGVscy5jZC5hcHBlbmRDaGlsZChLLmNob3JkRGlhZ3JhbSh2KSk7CiAgICAgIGVscy5jZG5vdGUudGV4dENvbnRlbnQgPSBzdGF0ZS5pbnN0ID09PSAndWt1bGVsZScgPyAnVWt1bGVsZSBzaGFwZSAoRyBDIEUgQSB0dW5pbmcpJyA6IChzdGF0ZS5pbnYgPyAnTG93ZXN0IG5vdGU6ICcgKyBjLmJhc3MubmFtZSA6ICdPbmUgcGxheWFibGUgc2hhcGUnKTsKICAgIH0gZWxzZSB7CiAgICAgIGVscy5jZC5hcHBlbmRDaGlsZChLLmNob3JkRGlhZ3JhbShudWxsLCB7IHN0cmluZ3M6IHN0YXRlLmluc3QgPT09ICdndWl0YXInID8gNiA6IDQgfSkpOwogICAgICBlbHMuY2Rub3RlLnRleHRDb250ZW50ID0gJ05vIGVhc3kgc2hhcGUgZm9yIHRoaXMgb25lLiBUcnkgcm9vdCBwb3NpdGlvbi4nOwogICAgfQogIH0KICBmdW5jdGlvbiBwbGF5Q2hvcmQobW9kZSkgeyB2YXIgYyA9IGNvbXB1dGUoKTsgSy5wbGF5KG1pZGlzRm9yKGMpLCBtb2RlKTsgfQoKICBmdW5jdGlvbiBidWlsZCgpIHsKICAgIHJvb3QuaW5uZXJIVE1MID0gJyc7CiAgICBlbHMucm9vdHMgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMgcm9vdHMnIH0pOwogICAgZWxzLnF1YWxzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXF1YWxzJyB9KTsKICAgIGVscy5uYW1lID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWJpZycgfSk7CiAgICBlbHMucW5hbWUgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3ViJyB9KTsKICAgIGVscy5ub3RlcyA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1ub3RlcycgfSk7CiAgICBlbHMuZm9ybXVsYSA9IGgoJ2InKTsKICAgIGVscy5zdGVwcyA9IGgoJ3NwYW4nKTsKICAgIGVscy5pbnYgPSBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2hpcHMnIH0pOwogICAgZWxzLmtiID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWtiJyB9KTsKICAgIGVscy50YWJzID0gaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWNoaXBzJyB9KTsKICAgIGVscy5jZCA9IGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1jZCcgfSk7CiAgICBlbHMuY2Rub3RlID0gaCgncCcsIHsgJ2NsYXNzJzogJ2NteC1jZG5vdGUnIH0pOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCcgfSwgWwogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3RlcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbicsIHRleHQ6ICcxJyB9KSwgaCgnYicsIHsgdGV4dDogJ0Nob29zZSBhIHJvb3Qgbm90ZScgfSldKSwKICAgICAgZWxzLnJvb3RzLAogICAgICBoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtc3RlcCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbicsIHRleHQ6ICcyJyB9KSwgaCgnYicsIHsgdGV4dDogJ0Nob29zZSBhIGNob3JkIHR5cGUnIH0pXSksCiAgICAgIGVscy5xdWFscwogICAgXSkpOwogICAgcm9vdC5hcHBlbmRDaGlsZChoKCdkaXYnLCB7ICdjbGFzcyc6ICdjbXgtY2FyZCBjbXgtcmVzdWx0JyB9LCBbCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1yaGVhZCcgfSwgWwogICAgICAgIGgoJ2RpdicsIHt9LCBbZWxzLm5hbWUsIGVscy5xbmFtZV0pLAogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wbGF5JyB9LCBbCiAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnY214LWJ0biBibHVlJywgb25jbGljazogZnVuY3Rpb24gKCkgeyBwbGF5Q2hvcmQoJ2Jsb2NrJyk7IH0gfSwgWyfilrYgUGxheSBjaG9yZCddKSwKICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsICdjbGFzcyc6ICdjbXgtYnRuIGdob3N0Jywgb25jbGljazogZnVuY3Rpb24gKCkgeyBwbGF5Q2hvcmQoJ3VwJyk7IH0gfSwgWydBcnBlZ2dpbyddKQogICAgICAgIF0pCiAgICAgIF0pLAogICAgICBlbHMubm90ZXMsCiAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1mb3JtdWxhJyB9LCBbaCgnc3BhbicsIHsgJ2NsYXNzJzogJ2NteC1sYmwnLCB0ZXh0OiAnRm9ybXVsYScgfSksIGVscy5mb3JtdWxhLCBlbHMuc3RlcHNdKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LWludnJvdycgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ0ludmVyc2lvbicgfSksIGVscy5pbnZdKSwKICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXZpcycgfSwgWwogICAgICAgIGgoJ2RpdicsIHsgJ2NsYXNzJzogJ2NteC1wYW5lbCcgfSwgW2goJ3NwYW4nLCB7ICdjbGFzcyc6ICdjbXgtbGJsJywgdGV4dDogJ1BpYW5vJyB9KSwgZWxzLmtiXSksCiAgICAgICAgaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXBhbmVsJyB9LCBbaCgnZGl2JywgeyAnY2xhc3MnOiAnY214LXB0b3AnIH0sIFtlbHMudGFic10pLCBlbHMuY2QsIGVscy5jZG5vdGVdKQogICAgICBdKQogICAgXSkpOwogICAgcmVuZGVyKCk7CiAgfQogIGJ1aWxkKCk7Cn0pKCk7Cg==".split("-").join("+").split("_").join(String.fromCharCode(47));var s=document.createElement("script");s.text=decodeURIComponent(escape(atob(b)));document.body.appendChild(s);}());</script>
<p>The post <a href="https://www.cantonmusicacademy.com/chord-calculator/">Chord Spelling Calculator</a> appeared first on <a href="https://www.cantonmusicacademy.com">Canton Music Academy</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1181</post-id>	</item>
	</channel>
</rss>
