<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>danfarmer.dev</title>
<link>https://danfarmer.dev/blog.html</link>
<atom:link href="https://danfarmer.dev/blog.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.8.26</generator>
<lastBuildDate>Sun, 14 Jun 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Hello, world</title>
  <link>https://danfarmer.dev/posts/2026-06-14-hello-world/</link>
  <description><![CDATA[ 




<p>First post under the new Quarto + Julia setup. A few smoke tests.</p>
<section id="math" class="level2">
<h2 class="anchored" data-anchor-id="math">Math</h2>
<p>Inline: <img src="https://latex.codecogs.com/png.latex?e%5E%7Bi%5Cpi%7D%20+%201%20=%200">.</p>
<p>Display:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ae%5Ex%20=%20%5Csum_%7Bn=0%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7Bx%5En%7D%7Bn!%7D%0A"></p>
</section>
<section id="a-plot" class="level2">
<h2 class="anchored" data-anchor-id="a-plot">A plot</h2>
<div id="4" class="cell" data-execution_count="1">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb1-1">xs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">range</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>π; length <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>)</span>
<span id="cb1-2">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Figure</span>(size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">700</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">350</span>))</span>
<span id="cb1-3">ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Axis</span>(fig[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>], xlabel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>, ylabel <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sin(x)"</span>)</span>
<span id="cb1-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lines!</span>(ax, xs, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sin</span>.(xs); color <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span>steelblue, linewidth <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb1-5">fig</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="1">
<div><div class="bonito-fragment" id="2d04e41d-1bcf-40e8-a387-9a3031bbfdca" data-jscall-id="root"><div><script src="data:application/javascript;base64,Ly8gZGVuby1mbXQtaWdub3JlLWZpbGUKLy8gZGVuby1saW50LWlnbm9yZS1maWxlCi8vIFRoaXMgY29kZSB3YXMgYnVuZGxlZCB1c2luZyBgZGVubyBidW5kbGVgIGFuZCBpdCdzIG5vdCByZWNvbW1lbmRlZCB0byBlZGl0IGl0IG1hbnVhbGx5Cgp2YXIgRSA9IE9iamVjdC5jcmVhdGU7CnZhciBkID0gT2JqZWN0LmRlZmluZVByb3BlcnR5Owp2YXIgTCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CnZhciBPID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CnZhciBDID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBBID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKdmFyIGsgPSAobiwgZSk9PigpPT4oZSB8fCBuKChlID0gewogICAgICAgICAgICBleHBvcnRzOiB7fQogICAgICAgIH0pLmV4cG9ydHMsIGUpLCBlLmV4cG9ydHMpOwp2YXIgUCA9IChuLCBlLCB0LCBzKT0+ewogICAgaWYgKGUgJiYgdHlwZW9mIGUgPT0gIm9iamVjdCIgfHwgdHlwZW9mIGUgPT0gImZ1bmN0aW9uIikgZm9yIChsZXQgaSBvZiBPKGUpKSFBLmNhbGwobiwgaSkgJiYgaSAhPT0gdCAmJiBkKG4sIGksIHsKICAgICAgICBnZXQ6ICgpPT5lW2ldLAogICAgICAgIGVudW1lcmFibGU6ICEocyA9IEwoZSwgaSkpIHx8IHMuZW51bWVyYWJsZQogICAgfSk7CiAgICByZXR1cm4gbjsKfTsKdmFyIE4gPSAobiwgZSwgdCk9Pih0ID0gbiAhPSBudWxsID8gRShDKG4pKSA6IHt9LCBQKGUgfHwgIW4gfHwgIW4uX19lc01vZHVsZSA/IGQodCwgImRlZmF1bHQiLCB7CiAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgZW51bWVyYWJsZTogITAKICAgIH0pIDogdCwgbikpOwp2YXIgbSA9IGsoKHEsIHgpPT57CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgUyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksIGwgPSAifiI7CiAgICBmdW5jdGlvbiBfKCkge30KICAgIE9iamVjdC5jcmVhdGUgJiYgKF8ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgbmV3IF8oKS5fX3Byb3RvX18gfHwgKGwgPSAhMSkpOwogICAgZnVuY3Rpb24gVChuLCBlLCB0KSB7CiAgICAgICAgdGhpcy5mbiA9IG4sIHRoaXMuY29udGV4dCA9IGUsIHRoaXMub25jZSA9IHQgfHwgITE7CiAgICB9CiAgICBmdW5jdGlvbiB3KG4sIGUsIHQsIHMsIGkpIHsKICAgICAgICBpZiAodHlwZW9mIHQgIT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpOwogICAgICAgIHZhciB1ID0gbmV3IFQodCwgcyB8fCBuLCBpKSwgbyA9IGwgPyBsICsgZSA6IGU7CiAgICAgICAgcmV0dXJuIG4uX2V2ZW50c1tvXSA/IG4uX2V2ZW50c1tvXS5mbiA/IG4uX2V2ZW50c1tvXSA9IFsKICAgICAgICAgICAgbi5fZXZlbnRzW29dLAogICAgICAgICAgICB1CiAgICAgICAgXSA6IG4uX2V2ZW50c1tvXS5wdXNoKHUpIDogKG4uX2V2ZW50c1tvXSA9IHUsIG4uX2V2ZW50c0NvdW50KyspLCBuOwogICAgfQogICAgZnVuY3Rpb24geShuLCBlKSB7CiAgICAgICAgLS1uLl9ldmVudHNDb3VudCA9PT0gMCA/IG4uX2V2ZW50cyA9IG5ldyBfIDogZGVsZXRlIG4uX2V2ZW50c1tlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IF8sIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgIH0KICAgIGMucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZSA9IFtdLCB0LCBzOwogICAgICAgIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIGU7CiAgICAgICAgZm9yKHMgaW4gdCA9IHRoaXMuX2V2ZW50cylTLmNhbGwodCwgcykgJiYgZS5wdXNoKGwgPyBzLnNsaWNlKDEpIDogcyk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBlLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpKSA6IGU7CiAgICB9OwogICAgYy5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciB0ID0gbCA/IGwgKyBlIDogZSwgcyA9IHRoaXMuX2V2ZW50c1t0XTsKICAgICAgICBpZiAoIXMpIHJldHVybiBbXTsKICAgICAgICBpZiAocy5mbikgcmV0dXJuIFsKICAgICAgICAgICAgcy5mbgogICAgICAgIF07CiAgICAgICAgZm9yKHZhciBpID0gMCwgdSA9IHMubGVuZ3RoLCBvID0gbmV3IEFycmF5KHUpOyBpIDwgdTsgaSsrKW9baV0gPSBzW2ldLmZuOwogICAgICAgIHJldHVybiBvOwogICAgfTsKICAgIGMucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIHQgPSBsID8gbCArIGUgOiBlLCBzID0gdGhpcy5fZXZlbnRzW3RdOwogICAgICAgIHJldHVybiBzID8gcy5mbiA/IDEgOiBzLmxlbmd0aCA6IDA7CiAgICB9OwogICAgYy5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGUsIHQsIHMsIGksIHUsIG8pIHsKICAgICAgICB2YXIgYSA9IGwgPyBsICsgZSA6IGU7CiAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbYV0pIHJldHVybiAhMTsKICAgICAgICB2YXIgciA9IHRoaXMuX2V2ZW50c1thXSwgcCA9IGFyZ3VtZW50cy5sZW5ndGgsIGgsIGY7CiAgICAgICAgaWYgKHIuZm4pIHsKICAgICAgICAgICAgc3dpdGNoKHIub25jZSAmJiB0aGlzLnJlbW92ZUxpc3RlbmVyKGUsIHIuZm4sIHZvaWQgMCwgITApLCBwKXsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5mbi5jYWxsKHIuY29udGV4dCksICEwOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZuLmNhbGwoci5jb250ZXh0LCB0KSwgITA7CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm4uY2FsbChyLmNvbnRleHQsIHQsIHMpLCAhMDsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5mbi5jYWxsKHIuY29udGV4dCwgdCwgcywgaSksICEwOwogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZuLmNhbGwoci5jb250ZXh0LCB0LCBzLCBpLCB1KSwgITA7CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm4uY2FsbChyLmNvbnRleHQsIHQsIHMsIGksIHUsIG8pLCAhMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoZiA9IDEsIGggPSBuZXcgQXJyYXkocCAtIDEpOyBmIDwgcDsgZisrKWhbZiAtIDFdID0gYXJndW1lbnRzW2ZdOwogICAgICAgICAgICByLmZuLmFwcGx5KHIuY29udGV4dCwgaCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGIgPSByLmxlbmd0aCwgdjsKICAgICAgICAgICAgZm9yKGYgPSAwOyBmIDwgYjsgZisrKXN3aXRjaChyW2ZdLm9uY2UgJiYgdGhpcy5yZW1vdmVMaXN0ZW5lcihlLCByW2ZdLmZuLCB2b2lkIDAsICEwKSwgcCl7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgcltmXS5mbi5jYWxsKHJbZl0uY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgcltmXS5mbi5jYWxsKHJbZl0uY29udGV4dCwgdCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgcltmXS5mbi5jYWxsKHJbZl0uY29udGV4dCwgdCwgcyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgcltmXS5mbi5jYWxsKHJbZl0uY29udGV4dCwgdCwgcywgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICghaCkgZm9yKHYgPSAxLCBoID0gbmV3IEFycmF5KHAgLSAxKTsgdiA8IHA7IHYrKyloW3YgLSAxXSA9IGFyZ3VtZW50c1t2XTsKICAgICAgICAgICAgICAgICAgICByW2ZdLmZuLmFwcGx5KHJbZl0uY29udGV4dCwgaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICEwOwogICAgfTsKICAgIGMucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZSwgdCwgcykgewogICAgICAgIHJldHVybiB3KHRoaXMsIGUsIHQsIHMsICExKTsKICAgIH07CiAgICBjLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZSwgdCwgcykgewogICAgICAgIHJldHVybiB3KHRoaXMsIGUsIHQsIHMsICEwKTsKICAgIH07CiAgICBjLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGUsIHQsIHMsIGkpIHsKICAgICAgICB2YXIgdSA9IGwgPyBsICsgZSA6IGU7CiAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNbdV0pIHJldHVybiB0aGlzOwogICAgICAgIGlmICghdCkgcmV0dXJuIHkodGhpcywgdSksIHRoaXM7CiAgICAgICAgdmFyIG8gPSB0aGlzLl9ldmVudHNbdV07CiAgICAgICAgaWYgKG8uZm4pIG8uZm4gPT09IHQgJiYgKCFpIHx8IG8ub25jZSkgJiYgKCFzIHx8IG8uY29udGV4dCA9PT0gcykgJiYgeSh0aGlzLCB1KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yKHZhciBhID0gMCwgciA9IFtdLCBwID0gby5sZW5ndGg7IGEgPCBwOyBhKyspKG9bYV0uZm4gIT09IHQgfHwgaSAmJiAhb1thXS5vbmNlIHx8IHMgJiYgb1thXS5jb250ZXh0ICE9PSBzKSAmJiByLnB1c2gob1thXSk7CiAgICAgICAgICAgIHIubGVuZ3RoID8gdGhpcy5fZXZlbnRzW3VdID0gci5sZW5ndGggPT09IDEgPyByWzBdIDogciA6IHkodGhpcywgdSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIGMucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgdDsKICAgICAgICByZXR1cm4gZSA/ICh0ID0gbCA/IGwgKyBlIDogZSwgdGhpcy5fZXZlbnRzW3RdICYmIHkodGhpcywgdCkpIDogKHRoaXMuX2V2ZW50cyA9IG5ldyBfLCB0aGlzLl9ldmVudHNDb3VudCA9IDApLCB0aGlzOwogICAgfTsKICAgIGMucHJvdG90eXBlLm9mZiA9IGMucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwogICAgYy5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBjLnByb3RvdHlwZS5vbjsKICAgIGMucHJlZml4ZWQgPSBsOwogICAgYy5FdmVudEVtaXR0ZXIgPSBjOwogICAgdHlwZW9mIHggPCAidSIgJiYgKHguZXhwb3J0cyA9IGMpOwp9KTsKdmFyIGcgPSBOKG0oKSwgMSk7CmcuZGVmYXVsdDsKdmFyIGV4cG9ydF9FdmVudEVtaXR0ZXIgPSBnLmRlZmF1bHQ7CnZhciB1ID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICBjb25zdHJ1Y3RvcihlKXsKICAgICAgICBzdXBlcihlKSwgdGhpcy5uYW1lID0gIlRpbWVvdXRFcnJvciI7CiAgICB9Cn0sIGQxID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICBjb25zdHJ1Y3RvcihlKXsKICAgICAgICBzdXBlcigpLCB0aGlzLm5hbWUgPSAiQWJvcnRFcnJvciIsIHRoaXMubWVzc2FnZSA9IGU7CiAgICB9Cn0sIEUxID0gKG4pPT5nbG9iYWxUaGlzLkRPTUV4Y2VwdGlvbiA9PT0gdm9pZCAwID8gbmV3IGQxKG4pIDogbmV3IERPTUV4Y2VwdGlvbihuKSwgcCA9IChuKT0+ewogICAgbGV0IGUgPSBuLnJlYXNvbiA9PT0gdm9pZCAwID8gRTEoIlRoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLiIpIDogbi5yZWFzb247CiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IEUxKGUpOwp9OwpmdW5jdGlvbiBUKG4sIGUpIHsKICAgIGxldCB7IG1pbGxpc2Vjb25kczogbyAsIGZhbGxiYWNrOiBmICwgbWVzc2FnZTogYSAsIGN1c3RvbVRpbWVyczogbSA9IHsKICAgICAgICBzZXRUaW1lb3V0LAogICAgICAgIGNsZWFyVGltZW91dAogICAgfSAgfSA9IGUsIGMsIGksIGwgPSBuZXcgUHJvbWlzZSgocywgcik9PnsKICAgICAgICBpZiAodHlwZW9mIG8gIT0gIm51bWJlciIgfHwgTWF0aC5zaWduKG8pICE9PSAxKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYG1pbGxpc2Vjb25kc1xgIHRvIGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBnb3QgXGAke299XGBgKTsKICAgICAgICBpZiAoZS5zaWduYWwpIHsKICAgICAgICAgICAgbGV0IHsgc2lnbmFsOiB0ICB9ID0gZTsKICAgICAgICAgICAgdC5hYm9ydGVkICYmIHIocCh0KSksIGkgPSAoKT0+ewogICAgICAgICAgICAgICAgcihwKHQpKTsKICAgICAgICAgICAgfSwgdC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIGksIHsKICAgICAgICAgICAgICAgIG9uY2U6ICEwCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAobyA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICAgICAgICAgIG4udGhlbihzLCByKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgYiA9IG5ldyB1OwogICAgICAgIGMgPSBtLnNldFRpbWVvdXQuY2FsbCh2b2lkIDAsICgpPT57CiAgICAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHMoZigpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICByKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGVvZiBuLmNhbmNlbCA9PSAiZnVuY3Rpb24iICYmIG4uY2FuY2VsKCksIGEgPT09ICExID8gcygpIDogYSBpbnN0YW5jZW9mIEVycm9yID8gcihhKSA6IChiLm1lc3NhZ2UgPSBhID8/IGBQcm9taXNlIHRpbWVkIG91dCBhZnRlciAke299IG1pbGxpc2Vjb25kc2AsIHIoYikpOwogICAgICAgIH0sIG8pLCAoYXN5bmMgKCk9PnsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHMoYXdhaXQgbik7CiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIHIodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSgpOwogICAgfSkuZmluYWxseSgoKT0+ewogICAgICAgIGwuY2xlYXIoKSwgaSAmJiBlLnNpZ25hbCAmJiBlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGkpOwogICAgfSk7CiAgICByZXR1cm4gbC5jbGVhciA9ICgpPT57CiAgICAgICAgbS5jbGVhclRpbWVvdXQuY2FsbCh2b2lkIDAsIGMpLCBjID0gdm9pZCAwOwogICAgfSwgbDsKfQpmdW5jdGlvbiBhKHUsIHQsIGUpIHsKICAgIGxldCBpID0gMCwgcyA9IHUubGVuZ3RoOwogICAgZm9yKDsgcyA+IDA7KXsKICAgICAgICBsZXQgciA9IE1hdGgudHJ1bmMocyAvIDIpLCBuID0gaSArIHI7CiAgICAgICAgZSh1W25dLCB0KSA8PSAwID8gKGkgPSArK24sIHMgLT0gciArIDEpIDogcyA9IHI7CiAgICB9CiAgICByZXR1cm4gaTsKfQp2YXIgaCA9IGNsYXNzIHsKICAgICN0ID0gW107CiAgICBlbnF1ZXVlKHQsIGUpIHsKICAgICAgICBlID0gewogICAgICAgICAgICBwcmlvcml0eTogMCwKICAgICAgICAgICAgLi4uZQogICAgICAgIH07CiAgICAgICAgbGV0IGkgPSB7CiAgICAgICAgICAgIHByaW9yaXR5OiBlLnByaW9yaXR5LAogICAgICAgICAgICBpZDogZS5pZCwKICAgICAgICAgICAgcnVuOiB0CiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5zaXplID09PSAwIHx8IHRoaXMuI3RbdGhpcy5zaXplIC0gMV0ucHJpb3JpdHkgPj0gZS5wcmlvcml0eSkgewogICAgICAgICAgICB0aGlzLiN0LnB1c2goaSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IHMgPSBhKHRoaXMuI3QsIGksIChyLCBuKT0+bi5wcmlvcml0eSAtIHIucHJpb3JpdHkpOwogICAgICAgIHRoaXMuI3Quc3BsaWNlKHMsIDAsIGkpOwogICAgfQogICAgc2V0UHJpb3JpdHkodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy4jdC5maW5kSW5kZXgoKHIpPT5yLmlkID09PSB0KTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgTm8gcHJvbWlzZSBmdW5jdGlvbiB3aXRoIHRoZSBpZCAiJHt0fSIgZXhpc3RzIGluIHRoZSBxdWV1ZS5gKTsKICAgICAgICBsZXQgW3NdID0gdGhpcy4jdC5zcGxpY2UoaSwgMSk7CiAgICAgICAgdGhpcy5lbnF1ZXVlKHMucnVuLCB7CiAgICAgICAgICAgIHByaW9yaXR5OiBlLAogICAgICAgICAgICBpZDogdAogICAgICAgIH0pOwogICAgfQogICAgZGVxdWV1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jdC5zaGlmdCgpPy5ydW47CiAgICB9CiAgICBmaWx0ZXIodCkgewogICAgICAgIHJldHVybiB0aGlzLiN0LmZpbHRlcigoZSk9PmUucHJpb3JpdHkgPT09IHQucHJpb3JpdHkpLm1hcCgoZSk9PmUucnVuKTsKICAgIH0KICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLiN0Lmxlbmd0aDsKICAgIH0KfTsKdmFyIGwgPSBjbGFzcyBleHRlbmRzIGV4cG9ydF9FdmVudEVtaXR0ZXIgewogICAgI3Q7CiAgICAjaDsKICAgICNuID0gMDsKICAgICNkOwogICAgI3U7CiAgICAjbSA9IDA7CiAgICAjaTsKICAgICNhOwogICAgI2U7CiAgICAjeTsKICAgICNyID0gMDsKICAgICNsOwogICAgI3M7CiAgICAjdjsKICAgICNnID0gMW47CiAgICB0aW1lb3V0OwogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgaWYgKHN1cGVyKCksIHQgPSB7CiAgICAgICAgICAgIGNhcnJ5b3ZlckNvbmN1cnJlbmN5Q291bnQ6ICExLAogICAgICAgICAgICBpbnRlcnZhbENhcDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLAogICAgICAgICAgICBpbnRlcnZhbDogMCwKICAgICAgICAgICAgY29uY3VycmVuY3k6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwKICAgICAgICAgICAgYXV0b1N0YXJ0OiAhMCwKICAgICAgICAgICAgcXVldWVDbGFzczogaCwKICAgICAgICAgICAgLi4udAogICAgICAgIH0sICEodHlwZW9mIHQuaW50ZXJ2YWxDYXAgPT0gIm51bWJlciIgJiYgdC5pbnRlcnZhbENhcCA+PSAxKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXGBpbnRlcnZhbENhcFxgIHRvIGJlIGEgbnVtYmVyIGZyb20gMSBhbmQgdXAsIGdvdCBcYCR7dC5pbnRlcnZhbENhcD8udG9TdHJpbmcoKSA/PyAiIn1cYCAoJHt0eXBlb2YgdC5pbnRlcnZhbENhcH0pYCk7CiAgICAgICAgaWYgKHQuaW50ZXJ2YWwgPT09IHZvaWQgMCB8fCAhKE51bWJlci5pc0Zpbml0ZSh0LmludGVydmFsKSAmJiB0LmludGVydmFsID49IDApKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYGludGVydmFsXGAgdG8gYmUgYSBmaW5pdGUgbnVtYmVyID49IDAsIGdvdCBcYCR7dC5pbnRlcnZhbD8udG9TdHJpbmcoKSA/PyAiIn1cYCAoJHt0eXBlb2YgdC5pbnRlcnZhbH0pYCk7CiAgICAgICAgdGhpcy4jdCA9IHQuY2FycnlvdmVyQ29uY3VycmVuY3lDb3VudCwgdGhpcy4jaCA9IHQuaW50ZXJ2YWxDYXAgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCB0LmludGVydmFsID09PSAwLCB0aGlzLiNkID0gdC5pbnRlcnZhbENhcCwgdGhpcy4jdSA9IHQuaW50ZXJ2YWwsIHRoaXMuI2UgPSBuZXcgdC5xdWV1ZUNsYXNzLCB0aGlzLiN5ID0gdC5xdWV1ZUNsYXNzLCB0aGlzLmNvbmN1cnJlbmN5ID0gdC5jb25jdXJyZW5jeSwgdGhpcy50aW1lb3V0ID0gdC50aW1lb3V0LCB0aGlzLiN2ID0gdC50aHJvd09uVGltZW91dCA9PT0gITAsIHRoaXMuI3MgPSB0LmF1dG9TdGFydCA9PT0gITE7CiAgICB9CiAgICBnZXQgI3AoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2ggfHwgdGhpcy4jbiA8IHRoaXMuI2Q7CiAgICB9CiAgICBnZXQgI1QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI3IgPCB0aGlzLiNsOwogICAgfQogICAgI0MoKSB7CiAgICAgICAgdGhpcy4jci0tLCB0aGlzLiNvKCksIHRoaXMuZW1pdCgibmV4dCIpOwogICAgfQogICAgI0UoKSB7CiAgICAgICAgdGhpcy4jdygpLCB0aGlzLiNJKCksIHRoaXMuI2EgPSB2b2lkIDA7CiAgICB9CiAgICBnZXQgI2IoKSB7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpOwogICAgICAgIGlmICh0aGlzLiNpID09PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IGUgPSB0aGlzLiNtIC0gdDsKICAgICAgICAgICAgaWYgKGUgPCAwKSB0aGlzLiNuID0gdGhpcy4jdCA/IHRoaXMuI3IgOiAwOwogICAgICAgICAgICBlbHNlIHJldHVybiB0aGlzLiNhID09PSB2b2lkIDAgJiYgKHRoaXMuI2EgPSBzZXRUaW1lb3V0KCgpPT57CiAgICAgICAgICAgICAgICB0aGlzLiNFKCk7CiAgICAgICAgICAgIH0sIGUpKSwgITA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhMTsKICAgIH0KICAgICNvKCkgewogICAgICAgIGlmICh0aGlzLiNlLnNpemUgPT09IDApIHJldHVybiB0aGlzLiNpICYmIGNsZWFySW50ZXJ2YWwodGhpcy4jaSksIHRoaXMuI2kgPSB2b2lkIDAsIHRoaXMuZW1pdCgiZW1wdHkiKSwgdGhpcy4jciA9PT0gMCAmJiB0aGlzLmVtaXQoImlkbGUiKSwgITE7CiAgICAgICAgaWYgKCF0aGlzLiNzKSB7CiAgICAgICAgICAgIGxldCB0ID0gIXRoaXMuI2I7CiAgICAgICAgICAgIGlmICh0aGlzLiNwICYmIHRoaXMuI1QpIHsKICAgICAgICAgICAgICAgIGxldCBlID0gdGhpcy4jZS5kZXF1ZXVlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZSA/ICh0aGlzLmVtaXQoImFjdGl2ZSIpLCBlKCksIHQgJiYgdGhpcy4jSSgpLCAhMCkgOiAhMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gITE7CiAgICB9CiAgICAjSSgpIHsKICAgICAgICB0aGlzLiNoIHx8IHRoaXMuI2kgIT09IHZvaWQgMCB8fCAodGhpcy4jaSA9IHNldEludGVydmFsKCgpPT57CiAgICAgICAgICAgIHRoaXMuI3coKTsKICAgICAgICB9LCB0aGlzLiN1KSwgdGhpcy4jbSA9IERhdGUubm93KCkgKyB0aGlzLiN1KTsKICAgIH0KICAgICN3KCkgewogICAgICAgIHRoaXMuI24gPT09IDAgJiYgdGhpcy4jciA9PT0gMCAmJiB0aGlzLiNpICYmIChjbGVhckludGVydmFsKHRoaXMuI2kpLCB0aGlzLiNpID0gdm9pZCAwKSwgdGhpcy4jbiA9IHRoaXMuI3QgPyB0aGlzLiNyIDogMCwgdGhpcy4jYygpOwogICAgfQogICAgI2MoKSB7CiAgICAgICAgZm9yKDsgdGhpcy4jbygpOyk7CiAgICB9CiAgICBnZXQgY29uY3VycmVuY3koKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2w7CiAgICB9CiAgICBzZXQgY29uY3VycmVuY3kodCkgewogICAgICAgIGlmICghKHR5cGVvZiB0ID09ICJudW1iZXIiICYmIHQgPj0gMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxgY29uY3VycmVuY3lcYCB0byBiZSBhIG51bWJlciBmcm9tIDEgYW5kIHVwLCBnb3QgXGAke3R9XGAgKCR7dHlwZW9mIHR9KWApOwogICAgICAgIHRoaXMuI2wgPSB0LCB0aGlzLiNjKCk7CiAgICB9CiAgICBhc3luYyAjeCh0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBpKT0+ewogICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgKCk9PnsKICAgICAgICAgICAgICAgIGkodC5yZWFzb24pOwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBvbmNlOiAhMAogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KICAgIHNldFByaW9yaXR5KHQsIGUpIHsKICAgICAgICB0aGlzLiNlLnNldFByaW9yaXR5KHQsIGUpOwogICAgfQogICAgYXN5bmMgYWRkKHQsIGUgPSB7fSkgewogICAgICAgIHJldHVybiBlLmlkID8/PSAodGhpcy4jZysrKS50b1N0cmluZygpLCBlID0gewogICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsCiAgICAgICAgICAgIHRocm93T25UaW1lb3V0OiB0aGlzLiN2LAogICAgICAgICAgICAuLi5lCiAgICAgICAgfSwgbmV3IFByb21pc2UoKGksIHMpPT57CiAgICAgICAgICAgIHRoaXMuI2UuZW5xdWV1ZShhc3luYyAoKT0+ewogICAgICAgICAgICAgICAgdGhpcy4jcisrLCB0aGlzLiNuKys7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGUuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpOwogICAgICAgICAgICAgICAgICAgIGxldCByID0gdCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZS5zaWduYWwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlLnRpbWVvdXQgJiYgKHIgPSBUKFByb21pc2UucmVzb2x2ZShyKSwgewogICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHM6IGUudGltZW91dAogICAgICAgICAgICAgICAgICAgIH0pKSwgZS5zaWduYWwgJiYgKHIgPSBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgICAgICAgICAgICByLAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN4KGUuc2lnbmFsKQogICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IGF3YWl0IHI7CiAgICAgICAgICAgICAgICAgICAgaShuKSwgdGhpcy5lbWl0KCJjb21wbGV0ZWQiLCBuKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIHUgJiYgIWUudGhyb3dPblRpbWVvdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHMociksIHRoaXMuZW1pdCgiZXJyb3IiLCByKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseXsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNDKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGUpLCB0aGlzLmVtaXQoImFkZCIpLCB0aGlzLiNvKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBhZGRBbGwodCwgZSkgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0Lm1hcChhc3luYyAoaSk9PnRoaXMuYWRkKGksIGUpKSk7CiAgICB9CiAgICBzdGFydCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jcyA/ICh0aGlzLiNzID0gITEsIHRoaXMuI2MoKSwgdGhpcykgOiB0aGlzOwogICAgfQogICAgcGF1c2UoKSB7CiAgICAgICAgdGhpcy4jcyA9ICEwOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy4jZSA9IG5ldyB0aGlzLiN5OwogICAgfQogICAgYXN5bmMgb25FbXB0eSgpIHsKICAgICAgICB0aGlzLiNlLnNpemUgIT09IDAgJiYgYXdhaXQgdGhpcy4jZigiZW1wdHkiKTsKICAgIH0KICAgIGFzeW5jIG9uU2l6ZUxlc3NUaGFuKHQpIHsKICAgICAgICB0aGlzLiNlLnNpemUgPCB0IHx8IGF3YWl0IHRoaXMuI2YoIm5leHQiLCAoKT0+dGhpcy4jZS5zaXplIDwgdCk7CiAgICB9CiAgICBhc3luYyBvbklkbGUoKSB7CiAgICAgICAgdGhpcy4jciA9PT0gMCAmJiB0aGlzLiNlLnNpemUgPT09IDAgfHwgYXdhaXQgdGhpcy4jZigiaWRsZSIpOwogICAgfQogICAgYXN5bmMgI2YodCwgZSkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSk9PnsKICAgICAgICAgICAgbGV0IHMgPSAoKT0+ewogICAgICAgICAgICAgICAgZSAmJiAhZSgpIHx8ICh0aGlzLm9mZih0LCBzKSwgaSgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vbih0LCBzKTsKICAgICAgICB9KTsKICAgIH0KICAgIGdldCBzaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLiNlLnNpemU7CiAgICB9CiAgICBzaXplQnkodCkgewogICAgICAgIHJldHVybiB0aGlzLiNlLmZpbHRlcih0KS5sZW5ndGg7CiAgICB9CiAgICBnZXQgcGVuZGluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy4jcjsKICAgIH0KICAgIGdldCBpc1BhdXNlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jczsKICAgIH0KfTsKZnVuY3Rpb24gdXRmOENvdW50KHN0cikgewogICAgdmFyIHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgICB2YXIgYnl0ZUxlbmd0aCA9IDA7CiAgICB2YXIgcG9zID0gMDsKICAgIHdoaWxlKHBvcyA8IHN0ckxlbmd0aCl7CiAgICAgICAgdmFyIHZhbHVlID0gc3RyLmNoYXJDb2RlQXQocG9zKyspOwogICAgICAgIGlmICgodmFsdWUgJiAweGZmZmZmZjgwKSA9PT0gMCkgewogICAgICAgICAgICBieXRlTGVuZ3RoKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlICYgMHhmZmZmZjgwMCkgPT09IDApIHsKICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAweGQ4MDAgJiYgdmFsdWUgPD0gMHhkYmZmKSB7CiAgICAgICAgICAgICAgICBpZiAocG9zIDwgc3RyTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dHJhID0gc3RyLmNoYXJDb2RlQXQocG9zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGV4dHJhICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICsrcG9zOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgodmFsdWUgJiAweDNmZikgPDwgMTApICsgKGV4dHJhICYgMHgzZmYpICsgMHgxMDAwMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4ZmZmZjAwMDApID09PSAwKSB7CiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYnl0ZUxlbmd0aDsKfQpmdW5jdGlvbiB1dGY4RW5jb2RlSnMoc3RyLCBvdXRwdXQsIG91dHB1dE9mZnNldCkgewogICAgdmFyIHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgICB2YXIgb2Zmc2V0ID0gb3V0cHV0T2Zmc2V0OwogICAgdmFyIHBvcyA9IDA7CiAgICB3aGlsZShwb3MgPCBzdHJMZW5ndGgpewogICAgICAgIHZhciB2YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KHBvcysrKTsKICAgICAgICBpZiAoKHZhbHVlICYgMHhmZmZmZmY4MCkgPT09IDApIHsKICAgICAgICAgICAgb3V0cHV0W29mZnNldCsrXSA9IHZhbHVlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKCh2YWx1ZSAmIDB4ZmZmZmY4MDApID09PSAwKSB7CiAgICAgICAgICAgIG91dHB1dFtvZmZzZXQrK10gPSB2YWx1ZSA+PiA2ICYgMHgxZiB8IDB4YzA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHZhbHVlID49IDB4ZDgwMCAmJiB2YWx1ZSA8PSAweGRiZmYpIHsKICAgICAgICAgICAgICAgIGlmIChwb3MgPCBzdHJMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXh0cmEgPSBzdHIuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgICAgICAgICAgIGlmICgoZXh0cmEgJiAweGZjMDApID09PSAweGRjMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKytwb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4M2ZmKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNmZikgKyAweDEwMDAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKHZhbHVlICYgMHhmZmZmMDAwMCkgPT09IDApIHsKICAgICAgICAgICAgICAgIG91dHB1dFtvZmZzZXQrK10gPSB2YWx1ZSA+PiAxMiAmIDB4MGYgfCAweGUwOwogICAgICAgICAgICAgICAgb3V0cHV0W29mZnNldCsrXSA9IHZhbHVlID4+IDYgJiAweDNmIHwgMHg4MDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG91dHB1dFtvZmZzZXQrK10gPSB2YWx1ZSA+PiAxOCAmIDB4MDcgfCAweGYwOwogICAgICAgICAgICAgICAgb3V0cHV0W29mZnNldCsrXSA9IHZhbHVlID4+IDEyICYgMHgzZiB8IDB4ODA7CiAgICAgICAgICAgICAgICBvdXRwdXRbb2Zmc2V0KytdID0gdmFsdWUgPj4gNiAmIDB4M2YgfCAweDgwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG91dHB1dFtvZmZzZXQrK10gPSB2YWx1ZSAmIDB4M2YgfCAweDgwOwogICAgfQp9CnZhciBzaGFyZWRUZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpOwp2YXIgVEVYVF9FTkNPREVSX1RIUkVTSE9MRCA9IDUwOwpmdW5jdGlvbiB1dGY4RW5jb2RlVEUoc3RyLCBvdXRwdXQsIG91dHB1dE9mZnNldCkgewogICAgc2hhcmVkVGV4dEVuY29kZXIuZW5jb2RlSW50byhzdHIsIG91dHB1dC5zdWJhcnJheShvdXRwdXRPZmZzZXQpKTsKfQpmdW5jdGlvbiB1dGY4RW5jb2RlKHN0ciwgb3V0cHV0LCBvdXRwdXRPZmZzZXQpIHsKICAgIGlmIChzdHIubGVuZ3RoID4gVEVYVF9FTkNPREVSX1RIUkVTSE9MRCkgewogICAgICAgIHV0ZjhFbmNvZGVURShzdHIsIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgdXRmOEVuY29kZUpzKHN0ciwgb3V0cHV0LCBvdXRwdXRPZmZzZXQpOwogICAgfQp9CnZhciBDSFVOS19TSVpFID0gNDA5NjsKZnVuY3Rpb24gdXRmOERlY29kZUpzKGJ5dGVzLCBpbnB1dE9mZnNldCwgYnl0ZUxlbmd0aCkgewogICAgdmFyIG9mZnNldCA9IGlucHV0T2Zmc2V0OwogICAgdmFyIGVuZCA9IG9mZnNldCArIGJ5dGVMZW5ndGg7CiAgICB2YXIgdW5pdHMgPSBbXTsKICAgIHZhciByZXN1bHQgPSAiIjsKICAgIHdoaWxlKG9mZnNldCA8IGVuZCl7CiAgICAgICAgdmFyIGJ5dGUxID0gYnl0ZXNbb2Zmc2V0KytdOwogICAgICAgIGlmICgoYnl0ZTEgJiAweDgwKSA9PT0gMCkgewogICAgICAgICAgICB1bml0cy5wdXNoKGJ5dGUxKTsKICAgICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4ZTApID09PSAweGMwKSB7CiAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW29mZnNldCsrXSAmIDB4M2Y7CiAgICAgICAgICAgIHVuaXRzLnB1c2goKGJ5dGUxICYgMHgxZikgPDwgNiB8IGJ5dGUyKTsKICAgICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4ZjApID09PSAweGUwKSB7CiAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW29mZnNldCsrXSAmIDB4M2Y7CiAgICAgICAgICAgIHZhciBieXRlMyA9IGJ5dGVzW29mZnNldCsrXSAmIDB4M2Y7CiAgICAgICAgICAgIHVuaXRzLnB1c2goKGJ5dGUxICYgMHgxZikgPDwgMTIgfCBieXRlMiA8PCA2IHwgYnl0ZTMpOwogICAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhmOCkgPT09IDB4ZjApIHsKICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbb2Zmc2V0KytdICYgMHgzZjsKICAgICAgICAgICAgdmFyIGJ5dGUzID0gYnl0ZXNbb2Zmc2V0KytdICYgMHgzZjsKICAgICAgICAgICAgdmFyIGJ5dGU0ID0gYnl0ZXNbb2Zmc2V0KytdICYgMHgzZjsKICAgICAgICAgICAgdmFyIHVuaXQgPSAoYnl0ZTEgJiAweDA3KSA8PCAweDEyIHwgYnl0ZTIgPDwgMHgwYyB8IGJ5dGUzIDw8IDB4MDYgfCBieXRlNDsKICAgICAgICAgICAgaWYgKHVuaXQgPiAweGZmZmYpIHsKICAgICAgICAgICAgICAgIHVuaXQgLT0gMHgxMDAwMDsKICAgICAgICAgICAgICAgIHVuaXRzLnB1c2godW5pdCA+Pj4gMTAgJiAweDNmZiB8IDB4ZDgwMCk7CiAgICAgICAgICAgICAgICB1bml0ID0gMHhkYzAwIHwgdW5pdCAmIDB4M2ZmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzLnB1c2godW5pdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdW5pdHMucHVzaChieXRlMSk7CiAgICAgICAgfQogICAgICAgIGlmICh1bml0cy5sZW5ndGggPj0gQ0hVTktfU0laRSkgewogICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHVuaXRzKTsKICAgICAgICAgICAgdW5pdHMubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodW5pdHMubGVuZ3RoID4gMCkgewogICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgdW5pdHMpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgc2hhcmVkVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKdmFyIFRFWFRfREVDT0RFUl9USFJFU0hPTEQgPSAyMDA7CmZ1bmN0aW9uIHV0ZjhEZWNvZGVURChieXRlcywgaW5wdXRPZmZzZXQsIGJ5dGVMZW5ndGgpIHsKICAgIHZhciBzdHJpbmdCeXRlcyA9IGJ5dGVzLnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGJ5dGVMZW5ndGgpOwogICAgcmV0dXJuIHNoYXJlZFRleHREZWNvZGVyLmRlY29kZShzdHJpbmdCeXRlcyk7Cn0KZnVuY3Rpb24gdXRmOERlY29kZShieXRlcywgaW5wdXRPZmZzZXQsIGJ5dGVMZW5ndGgpIHsKICAgIGlmIChieXRlTGVuZ3RoID4gVEVYVF9ERUNPREVSX1RIUkVTSE9MRCkgewogICAgICAgIHJldHVybiB1dGY4RGVjb2RlVEQoYnl0ZXMsIGlucHV0T2Zmc2V0LCBieXRlTGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHV0ZjhEZWNvZGVKcyhieXRlcywgaW5wdXRPZmZzZXQsIGJ5dGVMZW5ndGgpOwogICAgfQp9CnZhciBFeHREYXRhID0gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBFeHREYXRhKHR5cGUsIGRhdGEpIHsKICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB9CiAgICByZXR1cm4gRXh0RGF0YTsKfSgpOwp2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbigpIHsKICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikgewogICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKHsKICAgICAgICAgICAgX19wcm90b19fOiBbXQogICAgICAgIH0pIGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24oZCwgYikgewogICAgICAgICAgICBkLl9fcHJvdG9fXyA9IGI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgICAgIGZvcih2YXIgcCBpbiBiKWlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICB9OwogICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJmdW5jdGlvbiIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICBmdW5jdGlvbiBfXygpIHsKICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7CiAgICAgICAgfQogICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgIH07Cn0oKTsKdmFyIERlY29kZUVycm9yID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICBfX2V4dGVuZHMoRGVjb2RlRXJyb3IsIF9zdXBlcik7CiAgICBmdW5jdGlvbiBEZWNvZGVFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpczsKICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuY3JlYXRlKERlY29kZUVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBwcm90byk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAibmFtZSIsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6IERlY29kZUVycm9yLm5hbWUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICB9CiAgICByZXR1cm4gRGVjb2RlRXJyb3I7Cn0oRXJyb3IpOwp2YXIgVUlOVDMyX01BWCA9IDQyOTQ5NjcyOTU7CmZ1bmN0aW9uIHNldFVpbnQ2NCh2aWV3LCBvZmZzZXQsIHZhbHVlKSB7CiAgICB2YXIgaGlnaCA9IHZhbHVlIC8gNDI5NDk2NzI5NjsKICAgIHZhciBsb3cgPSB2YWx1ZTsKICAgIHZpZXcuc2V0VWludDMyKG9mZnNldCwgaGlnaCk7CiAgICB2aWV3LnNldFVpbnQzMihvZmZzZXQgKyA0LCBsb3cpOwp9CmZ1bmN0aW9uIHNldEludDY0KHZpZXcsIG9mZnNldCwgdmFsdWUpIHsKICAgIHZhciBoaWdoID0gTWF0aC5mbG9vcih2YWx1ZSAvIDQyOTQ5NjcyOTYpOwogICAgdmFyIGxvdyA9IHZhbHVlOwogICAgdmlldy5zZXRVaW50MzIob2Zmc2V0LCBoaWdoKTsKICAgIHZpZXcuc2V0VWludDMyKG9mZnNldCArIDQsIGxvdyk7Cn0KZnVuY3Rpb24gZ2V0SW50NjQodmlldywgb2Zmc2V0KSB7CiAgICB2YXIgaGlnaCA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0KTsKICAgIHZhciBsb3cgPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0KTsKICAgIHJldHVybiBoaWdoICogNDI5NDk2NzI5NiArIGxvdzsKfQpmdW5jdGlvbiBnZXRVaW50NjQodmlldywgb2Zmc2V0KSB7CiAgICB2YXIgaGlnaCA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCk7CiAgICB2YXIgbG93ID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCk7CiAgICByZXR1cm4gaGlnaCAqIDQyOTQ5NjcyOTYgKyBsb3c7Cn0KdmFyIEVYVF9USU1FU1RBTVAgPSAtMTsKdmFyIFRJTUVTVEFNUDMyX01BWF9TRUMgPSAweDEwMDAwMDAwMCAtIDE7CnZhciBUSU1FU1RBTVA2NF9NQVhfU0VDID0gMHg0MDAwMDAwMDAgLSAxOwpmdW5jdGlvbiBlbmNvZGVUaW1lU3BlY1RvVGltZXN0YW1wKF9hKSB7CiAgICB2YXIgc2VjID0gX2Euc2VjLCBuc2VjID0gX2EubnNlYzsKICAgIGlmIChzZWMgPj0gMCAmJiBuc2VjID49IDAgJiYgc2VjIDw9IFRJTUVTVEFNUDY0X01BWF9TRUMpIHsKICAgICAgICBpZiAobnNlYyA9PT0gMCAmJiBzZWMgPD0gVElNRVNUQU1QMzJfTUFYX1NFQykgewogICAgICAgICAgICB2YXIgcnYgPSBuZXcgVWludDhBcnJheSg0KTsKICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcocnYuYnVmZmVyKTsKICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoMCwgc2VjKTsKICAgICAgICAgICAgcmV0dXJuIHJ2OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBzZWNIaWdoID0gc2VjIC8gMHgxMDAwMDAwMDA7CiAgICAgICAgICAgIHZhciBzZWNMb3cgPSBzZWMgJiAweGZmZmZmZmZmOwogICAgICAgICAgICB2YXIgcnYgPSBuZXcgVWludDhBcnJheSg4KTsKICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcocnYuYnVmZmVyKTsKICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoMCwgbnNlYyA8PCAyIHwgc2VjSGlnaCAmIDB4Myk7CiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIHNlY0xvdyk7CiAgICAgICAgICAgIHJldHVybiBydjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHZhciBydiA9IG5ldyBVaW50OEFycmF5KDEyKTsKICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhydi5idWZmZXIpOwogICAgICAgIHZpZXcuc2V0VWludDMyKDAsIG5zZWMpOwogICAgICAgIHNldEludDY0KHZpZXcsIDQsIHNlYyk7CiAgICAgICAgcmV0dXJuIHJ2OwogICAgfQp9CmZ1bmN0aW9uIGVuY29kZURhdGVUb1RpbWVTcGVjKGRhdGUpIHsKICAgIHZhciBtc2VjID0gZGF0ZS5nZXRUaW1lKCk7CiAgICB2YXIgc2VjID0gTWF0aC5mbG9vcihtc2VjIC8gMWUzKTsKICAgIHZhciBuc2VjID0gKG1zZWMgLSBzZWMgKiAxZTMpICogMWU2OwogICAgdmFyIG5zZWNJblNlYyA9IE1hdGguZmxvb3IobnNlYyAvIDFlOSk7CiAgICByZXR1cm4gewogICAgICAgIHNlYzogc2VjICsgbnNlY0luU2VjLAogICAgICAgIG5zZWM6IG5zZWMgLSBuc2VjSW5TZWMgKiAxZTkKICAgIH07Cn0KZnVuY3Rpb24gZW5jb2RlVGltZXN0YW1wRXh0ZW5zaW9uKG9iamVjdCkgewogICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICB2YXIgdGltZVNwZWMgPSBlbmNvZGVEYXRlVG9UaW1lU3BlYyhvYmplY3QpOwogICAgICAgIHJldHVybiBlbmNvZGVUaW1lU3BlY1RvVGltZXN0YW1wKHRpbWVTcGVjKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZnVuY3Rpb24gZGVjb2RlVGltZXN0YW1wVG9UaW1lU3BlYyhkYXRhKSB7CiAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyhkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpOwogICAgc3dpdGNoKGRhdGEuYnl0ZUxlbmd0aCl7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2VjID0gdmlldy5nZXRVaW50MzIoMCk7CiAgICAgICAgICAgICAgICB2YXIgbnNlYyA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNlYzogc2VjLAogICAgICAgICAgICAgICAgICAgIG5zZWM6IG5zZWMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBuc2VjMzBBbmRTZWNIaWdoMiA9IHZpZXcuZ2V0VWludDMyKDApOwogICAgICAgICAgICAgICAgdmFyIHNlY0xvdzMyID0gdmlldy5nZXRVaW50MzIoNCk7CiAgICAgICAgICAgICAgICB2YXIgc2VjID0gKG5zZWMzMEFuZFNlY0hpZ2gyICYgMHgzKSAqIDB4MTAwMDAwMDAwICsgc2VjTG93MzI7CiAgICAgICAgICAgICAgICB2YXIgbnNlYyA9IG5zZWMzMEFuZFNlY0hpZ2gyID4+PiAyOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBzZWM6IHNlYywKICAgICAgICAgICAgICAgICAgICBuc2VjOiBuc2VjCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNlYyA9IGdldEludDY0KHZpZXcsIDQpOwogICAgICAgICAgICAgICAgdmFyIG5zZWMgPSB2aWV3LmdldFVpbnQzMigwKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc2VjOiBzZWMsCiAgICAgICAgICAgICAgICAgICAgbnNlYzogbnNlYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBEZWNvZGVFcnJvcigiVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICIuY29uY2F0KGRhdGEubGVuZ3RoKSk7CiAgICB9Cn0KZnVuY3Rpb24gZGVjb2RlVGltZXN0YW1wRXh0ZW5zaW9uKGRhdGEpIHsKICAgIHZhciB0aW1lU3BlYyA9IGRlY29kZVRpbWVzdGFtcFRvVGltZVNwZWMoZGF0YSk7CiAgICByZXR1cm4gbmV3IERhdGUodGltZVNwZWMuc2VjICogMWUzICsgdGltZVNwZWMubnNlYyAvIDFlNik7Cn0KdmFyIHRpbWVzdGFtcEV4dGVuc2lvbiA9IHsKICAgIHR5cGU6IEVYVF9USU1FU1RBTVAsCiAgICBlbmNvZGU6IGVuY29kZVRpbWVzdGFtcEV4dGVuc2lvbiwKICAgIGRlY29kZTogZGVjb2RlVGltZXN0YW1wRXh0ZW5zaW9uCn07CnZhciBFeHRlbnNpb25Db2RlYyA9IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gRXh0ZW5zaW9uQ29kZWMoKSB7CiAgICAgICAgdGhpcy5idWlsdEluRW5jb2RlcnMgPSBbXTsKICAgICAgICB0aGlzLmJ1aWx0SW5EZWNvZGVycyA9IFtdOwogICAgICAgIHRoaXMuZW5jb2RlcnMgPSBbXTsKICAgICAgICB0aGlzLmRlY29kZXJzID0gW107CiAgICAgICAgdGhpcy5yZWdpc3Rlcih0aW1lc3RhbXBFeHRlbnNpb24pOwogICAgfQogICAgRXh0ZW5zaW9uQ29kZWMucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24oX2EpIHsKICAgICAgICB2YXIgdHlwZSA9IF9hLnR5cGUsIGVuY29kZSA9IF9hLmVuY29kZSwgZGVjb2RlID0gX2EuZGVjb2RlOwogICAgICAgIGlmICh0eXBlID49IDApIHsKICAgICAgICAgICAgdGhpcy5lbmNvZGVyc1t0eXBlXSA9IGVuY29kZTsKICAgICAgICAgICAgdGhpcy5kZWNvZGVyc1t0eXBlXSA9IGRlY29kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgaW5kZXggPSAxICsgdHlwZTsKICAgICAgICAgICAgdGhpcy5idWlsdEluRW5jb2RlcnNbaW5kZXhdID0gZW5jb2RlOwogICAgICAgICAgICB0aGlzLmJ1aWx0SW5EZWNvZGVyc1tpbmRleF0gPSBkZWNvZGU7CiAgICAgICAgfQogICAgfTsKICAgIEV4dGVuc2lvbkNvZGVjLnByb3RvdHlwZS50cnlUb0VuY29kZSA9IGZ1bmN0aW9uKG9iamVjdCwgY29udGV4dCkgewogICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHZhciBlbmNvZGVFeHQgPSB0aGlzLmJ1aWx0SW5FbmNvZGVyc1tpXTsKICAgICAgICAgICAgaWYgKGVuY29kZUV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGVuY29kZUV4dChvYmplY3QsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gLTEgLSBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXh0RGF0YSh0eXBlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5lbmNvZGVycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHZhciBlbmNvZGVFeHQgPSB0aGlzLmVuY29kZXJzW2ldOwogICAgICAgICAgICBpZiAoZW5jb2RlRXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZW5jb2RlRXh0KG9iamVjdCwgY29udGV4dCk7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXh0RGF0YSh0eXBlLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRXh0RGF0YSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICBFeHRlbnNpb25Db2RlYy5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24oZGF0YSwgdHlwZSwgY29udGV4dCkgewogICAgICAgIHZhciBkZWNvZGVFeHQgPSB0eXBlIDwgMCA/IHRoaXMuYnVpbHRJbkRlY29kZXJzWy0xIC0gdHlwZV0gOiB0aGlzLmRlY29kZXJzW3R5cGVdOwogICAgICAgIGlmIChkZWNvZGVFeHQpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZUV4dChkYXRhLCB0eXBlLCBjb250ZXh0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmV3IEV4dERhdGEodHlwZSwgZGF0YSk7CiAgICAgICAgfQogICAgfTsKICAgIEV4dGVuc2lvbkNvZGVjLmRlZmF1bHRDb2RlYyA9IG5ldyBFeHRlbnNpb25Db2RlYygpOwogICAgcmV0dXJuIEV4dGVuc2lvbkNvZGVjOwp9KCk7CmZ1bmN0aW9uIGVuc3VyZVVpbnQ4QXJyYXkoYnVmZmVyKSB7CiAgICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgICAgIHJldHVybiBidWZmZXI7CiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhidWZmZXIpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYnVmZmVyKTsKICAgIH0KfQpmdW5jdGlvbiBjcmVhdGVEYXRhVmlldyhidWZmZXIpIHsKICAgIGlmIChidWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgIHJldHVybiBuZXcgRGF0YVZpZXcoYnVmZmVyKTsKICAgIH0KICAgIHZhciBidWZmZXJWaWV3ID0gZW5zdXJlVWludDhBcnJheShidWZmZXIpOwogICAgcmV0dXJuIG5ldyBEYXRhVmlldyhidWZmZXJWaWV3LmJ1ZmZlciwgYnVmZmVyVmlldy5ieXRlT2Zmc2V0LCBidWZmZXJWaWV3LmJ5dGVMZW5ndGgpOwp9CnZhciBERUZBVUxUX01BWF9ERVBUSCA9IDEwMDsKdmFyIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDIwNDg7CnZhciBFbmNvZGVyID0gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBFbmNvZGVyKG9wdGlvbnMpIHsKICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oOwogICAgICAgIHRoaXMuZXh0ZW5zaW9uQ29kZWMgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZXh0ZW5zaW9uQ29kZWMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IEV4dGVuc2lvbkNvZGVjLmRlZmF1bHRDb2RlYzsKICAgICAgICB0aGlzLmNvbnRleHQgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29udGV4dDsKICAgICAgICB0aGlzLnVzZUJpZ0ludDY0ID0gKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVzZUJpZ0ludDY0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTsKICAgICAgICB0aGlzLm1heERlcHRoID0gKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heERlcHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBERUZBVUxUX01BWF9ERVBUSDsKICAgICAgICB0aGlzLmluaXRpYWxCdWZmZXJTaXplID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmluaXRpYWxCdWZmZXJTaXplKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkU7CiAgICAgICAgdGhpcy5zb3J0S2V5cyA9IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zb3J0S2V5cykgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZmFsc2U7CiAgICAgICAgdGhpcy5mb3JjZUZsb2F0MzIgPSAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZm9yY2VGbG9hdDMyKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBmYWxzZTsKICAgICAgICB0aGlzLmlnbm9yZVVuZGVmaW5lZCA9IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IGZhbHNlOwogICAgICAgIHRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCA9IChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mb3JjZUludGVnZXJUb0Zsb2F0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBmYWxzZTsKICAgICAgICB0aGlzLnBvcyA9IDA7CiAgICAgICAgdGhpcy52aWV3ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSk7CiAgICAgICAgdGhpcy5ieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMudmlldy5idWZmZXIpOwogICAgfQogICAgRW5jb2Rlci5wcm90b3R5cGUucmVpbml0aWFsaXplU3RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnBvcyA9IDA7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlU2hhcmVkUmVmID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpOwogICAgICAgIHRoaXMuZG9FbmNvZGUob2JqZWN0LCAxKTsKICAgICAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheSgwLCB0aGlzLnBvcyk7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpOwogICAgICAgIHRoaXMuZG9FbmNvZGUob2JqZWN0LCAxKTsKICAgICAgICByZXR1cm4gdGhpcy5ieXRlcy5zbGljZSgwLCB0aGlzLnBvcyk7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZG9FbmNvZGUgPSBmdW5jdGlvbihvYmplY3QsIGRlcHRoKSB7CiAgICAgICAgaWYgKGRlcHRoID4gdGhpcy5tYXhEZXB0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggIi5jb25jYXQoZGVwdGgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuZW5jb2RlTmlsKCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgdGhpcy5lbmNvZGVCb29sZWFuKG9iamVjdCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAibnVtYmVyIikgewogICAgICAgICAgICBpZiAoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCkgewogICAgICAgICAgICAgICAgdGhpcy5lbmNvZGVOdW1iZXIob2JqZWN0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChvYmplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAic3RyaW5nIikgewogICAgICAgICAgICB0aGlzLmVuY29kZVN0cmluZyhvYmplY3QpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VCaWdJbnQ2NCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAiYmlnaW50IikgewogICAgICAgICAgICB0aGlzLmVuY29kZUJpZ0ludDY0KG9iamVjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5lbmNvZGVPYmplY3Qob2JqZWN0LCBkZXB0aCk7CiAgICAgICAgfQogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlID0gZnVuY3Rpb24oc2l6ZVRvV3JpdGUpIHsKICAgICAgICB2YXIgcmVxdWlyZWRTaXplID0gdGhpcy5wb3MgKyBzaXplVG9Xcml0ZTsKICAgICAgICBpZiAodGhpcy52aWV3LmJ5dGVMZW5ndGggPCByZXF1aXJlZFNpemUpIHsKICAgICAgICAgICAgdGhpcy5yZXNpemVCdWZmZXIocmVxdWlyZWRTaXplICogMik7CiAgICAgICAgfQogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLnJlc2l6ZUJ1ZmZlciA9IGZ1bmN0aW9uKG5ld1NpemUpIHsKICAgICAgICB2YXIgbmV3QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG5ld1NpemUpOwogICAgICAgIHZhciBuZXdCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcik7CiAgICAgICAgdmFyIG5ld1ZpZXcgPSBuZXcgRGF0YVZpZXcobmV3QnVmZmVyKTsKICAgICAgICBuZXdCeXRlcy5zZXQodGhpcy5ieXRlcyk7CiAgICAgICAgdGhpcy52aWV3ID0gbmV3VmlldzsKICAgICAgICB0aGlzLmJ5dGVzID0gbmV3Qnl0ZXM7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlTmlsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy53cml0ZVU4KDB4YzApOwogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLmVuY29kZUJvb2xlYW4gPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBpZiAob2JqZWN0ID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4YzMpOwogICAgICAgIH0KICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGVOdW1iZXIgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBpZiAoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihvYmplY3QpKSB7CiAgICAgICAgICAgIGlmIChvYmplY3QgPj0gMCkgewogICAgICAgICAgICAgICAgaWYgKG9iamVjdCA8IDB4ODApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVTgob2JqZWN0KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IDwgMHgxMDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjYyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVU4KG9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCA8IDB4MTAwMDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjZCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVUxNihvYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgPCAweDEwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGNlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVTMyKG9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnVzZUJpZ0ludDY0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4Y2YpOwogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVVNjQob2JqZWN0KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmNvZGVOdW1iZXJBc0Zsb2F0KG9iamVjdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ID49IC0weDIwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZTAgfCBvYmplY3QgKyAweDIwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0ID49IC0weDgwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDApOwogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJOChvYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgPj0gLTB4ODAwMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGQxKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSTE2KG9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCA+PSAtMHg4MDAwMDAwMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGQyKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSTMyKG9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnVzZUJpZ0ludDY0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJNjQob2JqZWN0KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmNvZGVOdW1iZXJBc0Zsb2F0KG9iamVjdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQob2JqZWN0KTsKICAgICAgICB9CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlTnVtYmVyQXNGbG9hdCA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIGlmICh0aGlzLmZvcmNlRmxvYXQzMikgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjYSk7CiAgICAgICAgICAgIHRoaXMud3JpdGVGMzIob2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjYik7CiAgICAgICAgICAgIHRoaXMud3JpdGVGNjQob2JqZWN0KTsKICAgICAgICB9CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlQmlnSW50NjQgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBpZiAob2JqZWN0ID49IEJpZ0ludCgwKSkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjZik7CiAgICAgICAgICAgIHRoaXMud3JpdGVCaWdVaW50NjQob2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhkMyk7CiAgICAgICAgICAgIHRoaXMud3JpdGVCaWdJbnQ2NChvYmplY3QpOwogICAgICAgIH0KICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS53cml0ZVN0cmluZ0hlYWRlciA9IGZ1bmN0aW9uKGJ5dGVMZW5ndGgpIHsKICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDMyKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGEwICsgYnl0ZUxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmIChieXRlTGVuZ3RoIDwgMHgxMDApIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDkpOwogICAgICAgICAgICB0aGlzLndyaXRlVTgoYnl0ZUxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmIChieXRlTGVuZ3RoIDwgMHgxMDAwMCkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhkYSk7CiAgICAgICAgICAgIHRoaXMud3JpdGVVMTYoYnl0ZUxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmIChieXRlTGVuZ3RoIDwgMHgxMDAwMDAwMDApIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZGIpOwogICAgICAgICAgICB0aGlzLndyaXRlVTMyKGJ5dGVMZW5ndGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVG9vIGxvbmcgc3RyaW5nOiAiLmNvbmNhdChieXRlTGVuZ3RoLCAiIGJ5dGVzIGluIFVURi04IikpOwogICAgICAgIH0KICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGVTdHJpbmcgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICB2YXIgbWF4SGVhZGVyU2l6ZSA9IDEgKyA0OwogICAgICAgIHZhciBieXRlTGVuZ3RoID0gdXRmOENvdW50KG9iamVjdCk7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShtYXhIZWFkZXJTaXplICsgYnl0ZUxlbmd0aCk7CiAgICAgICAgdGhpcy53cml0ZVN0cmluZ0hlYWRlcihieXRlTGVuZ3RoKTsKICAgICAgICB1dGY4RW5jb2RlKG9iamVjdCwgdGhpcy5ieXRlcywgdGhpcy5wb3MpOwogICAgICAgIHRoaXMucG9zICs9IGJ5dGVMZW5ndGg7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlT2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0LCBkZXB0aCkgewogICAgICAgIHZhciBleHQgPSB0aGlzLmV4dGVuc2lvbkNvZGVjLnRyeVRvRW5jb2RlKG9iamVjdCwgdGhpcy5jb250ZXh0KTsKICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5lbmNvZGVFeHRlbnNpb24oZXh0KTsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgICAgICAgICB0aGlzLmVuY29kZUFycmF5KG9iamVjdCwgZGVwdGgpOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KG9iamVjdCkpIHsKICAgICAgICAgICAgdGhpcy5lbmNvZGVCaW5hcnkob2JqZWN0KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5jb2RlTWFwKG9iamVjdCwgZGVwdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIG9iamVjdDogIi5jb25jYXQoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvYmplY3QpKSk7CiAgICAgICAgfQogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLmVuY29kZUJpbmFyeSA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIHZhciBzaXplID0gb2JqZWN0LmJ5dGVMZW5ndGg7CiAgICAgICAgaWYgKHNpemUgPCAweDEwMCkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjNCk7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOChzaXplKTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAweDEwMDAwKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGM1KTsKICAgICAgICAgICAgdGhpcy53cml0ZVUxNihzaXplKTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAweDEwMDAwMDAwMCkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhjNik7CiAgICAgICAgICAgIHRoaXMud3JpdGVVMzIoc2l6ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbGFyZ2UgYmluYXJ5OiAiLmNvbmNhdChzaXplKSk7CiAgICAgICAgfQogICAgICAgIHZhciBieXRlcyA9IGVuc3VyZVVpbnQ4QXJyYXkob2JqZWN0KTsKICAgICAgICB0aGlzLndyaXRlVThhKGJ5dGVzKTsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGVBcnJheSA9IGZ1bmN0aW9uKG9iamVjdCwgZGVwdGgpIHsKICAgICAgICB2YXIgc2l6ZSA9IG9iamVjdC5sZW5ndGg7CiAgICAgICAgaWYgKHNpemUgPCAxNikgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHg5MCArIHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDB4MTAwMDApIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZGMpOwogICAgICAgICAgICB0aGlzLndyaXRlVTE2KHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDB4MTAwMDAwMDAwKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGRkKTsKICAgICAgICAgICAgdGhpcy53cml0ZVUzMihzaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRvbyBsYXJnZSBhcnJheTogIi5jb25jYXQoc2l6ZSkpOwogICAgICAgIH0KICAgICAgICBmb3IodmFyIF9pID0gMCwgb2JqZWN0XzEgPSBvYmplY3Q7IF9pIDwgb2JqZWN0XzEubGVuZ3RoOyBfaSsrKXsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBvYmplY3RfMVtfaV07CiAgICAgICAgICAgIHRoaXMuZG9FbmNvZGUoaXRlbSwgZGVwdGggKyAxKTsKICAgICAgICB9CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuY291bnRXaXRob3V0VW5kZWZpbmVkID0gZnVuY3Rpb24ob2JqZWN0LCBrZXlzKSB7CiAgICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgICBmb3IodmFyIF9pID0gMCwga2V5c18xID0ga2V5czsgX2kgPCBrZXlzXzEubGVuZ3RoOyBfaSsrKXsKICAgICAgICAgICAgdmFyIGtleSA9IGtleXNfMVtfaV07CiAgICAgICAgICAgIGlmIChvYmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb3VudDsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGVNYXAgPSBmdW5jdGlvbihvYmplY3QsIGRlcHRoKSB7CiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOwogICAgICAgIGlmICh0aGlzLnNvcnRLZXlzKSB7CiAgICAgICAgICAgIGtleXMuc29ydCgpOwogICAgICAgIH0KICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuaWdub3JlVW5kZWZpbmVkID8gdGhpcy5jb3VudFdpdGhvdXRVbmRlZmluZWQob2JqZWN0LCBrZXlzKSA6IGtleXMubGVuZ3RoOwogICAgICAgIGlmIChzaXplIDwgMTYpIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ODAgKyBzaXplKTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAweDEwMDAwKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGRlKTsKICAgICAgICAgICAgdGhpcy53cml0ZVUxNihzaXplKTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAweDEwMDAwMDAwMCkgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhkZik7CiAgICAgICAgICAgIHRoaXMud3JpdGVVMzIoc2l6ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUb28gbGFyZ2UgbWFwIG9iamVjdDogIi5jb25jYXQoc2l6ZSkpOwogICAgICAgIH0KICAgICAgICBmb3IodmFyIF9pID0gMCwga2V5c18yID0ga2V5czsgX2kgPCBrZXlzXzIubGVuZ3RoOyBfaSsrKXsKICAgICAgICAgICAgdmFyIGtleSA9IGtleXNfMltfaV07CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldOwogICAgICAgICAgICBpZiAoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmNvZGVTdHJpbmcoa2V5KTsKICAgICAgICAgICAgICAgIHRoaXMuZG9FbmNvZGUodmFsdWUsIGRlcHRoICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlRXh0ZW5zaW9uID0gZnVuY3Rpb24oZXh0KSB7CiAgICAgICAgdmFyIHNpemUgPSBleHQuZGF0YS5sZW5ndGg7CiAgICAgICAgaWYgKHNpemUgPT09IDEpIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDQpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gMikgewogICAgICAgICAgICB0aGlzLndyaXRlVTgoMHhkNSk7CiAgICAgICAgfSBlbHNlIGlmIChzaXplID09PSA0KSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGQ2KTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT09IDgpIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDcpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gMTYpIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4ZDgpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDB4MTAwKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGM3KTsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDB4MTAwMDApIHsKICAgICAgICAgICAgdGhpcy53cml0ZVU4KDB4YzgpOwogICAgICAgICAgICB0aGlzLndyaXRlVTE2KHNpemUpOwogICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDB4MTAwMDAwMDAwKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVVOCgweGM5KTsKICAgICAgICAgICAgdGhpcy53cml0ZVUzMihzaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRvbyBsYXJnZSBleHRlbnNpb24gb2JqZWN0OiAiLmNvbmNhdChzaXplKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMud3JpdGVJOChleHQudHlwZSk7CiAgICAgICAgdGhpcy53cml0ZVU4YShleHQuZGF0YSk7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUud3JpdGVVOCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKTsKICAgICAgICB0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsIHZhbHVlKTsKICAgICAgICB0aGlzLnBvcysrOwogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLndyaXRlVThhID0gZnVuY3Rpb24odmFsdWVzKSB7CiAgICAgICAgdmFyIHNpemUgPSB2YWx1ZXMubGVuZ3RoOwogICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoc2l6ZSk7CiAgICAgICAgdGhpcy5ieXRlcy5zZXQodmFsdWVzLCB0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gc2l6ZTsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS53cml0ZUk4ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpOwogICAgICAgIHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLCB2YWx1ZSk7CiAgICAgICAgdGhpcy5wb3MrKzsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS53cml0ZVUxNiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKTsKICAgICAgICB0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLCB2YWx1ZSk7CiAgICAgICAgdGhpcy5wb3MgKz0gMjsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKTsKICAgICAgICB0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsIHZhbHVlKTsKICAgICAgICB0aGlzLnBvcyArPSAyOwogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLndyaXRlVTMyID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpOwogICAgICAgIHRoaXMudmlldy5zZXRVaW50MzIodGhpcy5wb3MsIHZhbHVlKTsKICAgICAgICB0aGlzLnBvcyArPSA0OwogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpOwogICAgICAgIHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcywgdmFsdWUpOwogICAgICAgIHRoaXMucG9zICs9IDQ7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUud3JpdGVGMzIgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCk7CiAgICAgICAgdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsIHZhbHVlKTsKICAgICAgICB0aGlzLnBvcyArPSA0OwogICAgfTsKICAgIEVuY29kZXIucHJvdG90eXBlLndyaXRlRjY0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpOwogICAgICAgIHRoaXMudmlldy5zZXRGbG9hdDY0KHRoaXMucG9zLCB2YWx1ZSk7CiAgICAgICAgdGhpcy5wb3MgKz0gODsKICAgIH07CiAgICBFbmNvZGVyLnByb3RvdHlwZS53cml0ZVU2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KTsKICAgICAgICBzZXRVaW50NjQodGhpcy52aWV3LCB0aGlzLnBvcywgdmFsdWUpOwogICAgICAgIHRoaXMucG9zICs9IDg7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCk7CiAgICAgICAgc2V0SW50NjQodGhpcy52aWV3LCB0aGlzLnBvcywgdmFsdWUpOwogICAgICAgIHRoaXMucG9zICs9IDg7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUud3JpdGVCaWdVaW50NjQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCk7CiAgICAgICAgdGhpcy52aWV3LnNldEJpZ1VpbnQ2NCh0aGlzLnBvcywgdmFsdWUpOwogICAgICAgIHRoaXMucG9zICs9IDg7CiAgICB9OwogICAgRW5jb2Rlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KTsKICAgICAgICB0aGlzLnZpZXcuc2V0QmlnSW50NjQodGhpcy5wb3MsIHZhbHVlKTsKICAgICAgICB0aGlzLnBvcyArPSA4OwogICAgfTsKICAgIHJldHVybiBFbmNvZGVyOwp9KCk7CmZ1bmN0aW9uIGVuY29kZSh2YWx1ZSwgb3B0aW9ucykgewogICAgdmFyIGVuY29kZXIgPSBuZXcgRW5jb2RlcihvcHRpb25zKTsKICAgIHJldHVybiBlbmNvZGVyLmVuY29kZVNoYXJlZFJlZih2YWx1ZSk7Cn0KZnVuY3Rpb24gcHJldHR5Qnl0ZShfX2J5dGUpIHsKICAgIHJldHVybiAiIi5jb25jYXQoX19ieXRlIDwgMCA/ICItIiA6ICIiLCAiMHgiKS5jb25jYXQoTWF0aC5hYnMoX19ieXRlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgIjAiKSk7Cn0KdmFyIERFRkFVTFRfTUFYX0tFWV9MRU5HVEggPSAxNjsKdmFyIERFRkFVTFRfTUFYX0xFTkdUSF9QRVJfS0VZID0gMTY7CnZhciBDYWNoZWRLZXlEZWNvZGVyID0gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBDYWNoZWRLZXlEZWNvZGVyKG1heEtleUxlbmd0aCwgbWF4TGVuZ3RoUGVyS2V5KSB7CiAgICAgICAgaWYgKG1heEtleUxlbmd0aCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIG1heEtleUxlbmd0aCA9IERFRkFVTFRfTUFYX0tFWV9MRU5HVEg7CiAgICAgICAgfQogICAgICAgIGlmIChtYXhMZW5ndGhQZXJLZXkgPT09IHZvaWQgMCkgewogICAgICAgICAgICBtYXhMZW5ndGhQZXJLZXkgPSBERUZBVUxUX01BWF9MRU5HVEhfUEVSX0tFWTsKICAgICAgICB9CiAgICAgICAgdGhpcy5tYXhLZXlMZW5ndGggPSBtYXhLZXlMZW5ndGg7CiAgICAgICAgdGhpcy5tYXhMZW5ndGhQZXJLZXkgPSBtYXhMZW5ndGhQZXJLZXk7CiAgICAgICAgdGhpcy5oaXQgPSAwOwogICAgICAgIHRoaXMubWlzcyA9IDA7CiAgICAgICAgdGhpcy5jYWNoZXMgPSBbXTsKICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5tYXhLZXlMZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHRoaXMuY2FjaGVzLnB1c2goW10pOwogICAgICAgIH0KICAgIH0KICAgIENhY2hlZEtleURlY29kZXIucHJvdG90eXBlLmNhbkJlQ2FjaGVkID0gZnVuY3Rpb24oYnl0ZUxlbmd0aCkgewogICAgICAgIHJldHVybiBieXRlTGVuZ3RoID4gMCAmJiBieXRlTGVuZ3RoIDw9IHRoaXMubWF4S2V5TGVuZ3RoOwogICAgfTsKICAgIENhY2hlZEtleURlY29kZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihieXRlcywgaW5wdXRPZmZzZXQsIGJ5dGVMZW5ndGgpIHsKICAgICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuY2FjaGVzW2J5dGVMZW5ndGggLSAxXTsKICAgICAgICBGSU5EX0NIVU5LOiBmb3IodmFyIF9pID0gMCwgcmVjb3Jkc18xID0gcmVjb3JkczsgX2kgPCByZWNvcmRzXzEubGVuZ3RoOyBfaSsrKXsKICAgICAgICAgICAgdmFyIHJlY29yZCA9IHJlY29yZHNfMVtfaV07CiAgICAgICAgICAgIHZhciByZWNvcmRCeXRlcyA9IHJlY29yZC5ieXRlczsKICAgICAgICAgICAgZm9yKHZhciBqID0gMDsgaiA8IGJ5dGVMZW5ndGg7IGorKyl7CiAgICAgICAgICAgICAgICBpZiAocmVjb3JkQnl0ZXNbal0gIT09IGJ5dGVzW2lucHV0T2Zmc2V0ICsgal0pIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGSU5EX0NIVU5LOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWNvcmQuc3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICBDYWNoZWRLZXlEZWNvZGVyLnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uKGJ5dGVzLCB2YWx1ZSkgewogICAgICAgIHZhciByZWNvcmRzID0gdGhpcy5jYWNoZXNbYnl0ZXMubGVuZ3RoIC0gMV07CiAgICAgICAgdmFyIHJlY29yZCA9IHsKICAgICAgICAgICAgYnl0ZXM6IGJ5dGVzLAogICAgICAgICAgICBzdHI6IHZhbHVlCiAgICAgICAgfTsKICAgICAgICBpZiAocmVjb3Jkcy5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGhQZXJLZXkpIHsKICAgICAgICAgICAgcmVjb3Jkc1tNYXRoLnJhbmRvbSgpICogcmVjb3Jkcy5sZW5ndGggfCAwXSA9IHJlY29yZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTsKICAgICAgICB9CiAgICB9OwogICAgQ2FjaGVkS2V5RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24oYnl0ZXMsIGlucHV0T2Zmc2V0LCBieXRlTGVuZ3RoKSB7CiAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gdGhpcy5maW5kKGJ5dGVzLCBpbnB1dE9mZnNldCwgYnl0ZUxlbmd0aCk7CiAgICAgICAgaWYgKGNhY2hlZFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5oaXQrKzsKICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlOwogICAgICAgIH0KICAgICAgICB0aGlzLm1pc3MrKzsKICAgICAgICB2YXIgc3RyID0gdXRmOERlY29kZUpzKGJ5dGVzLCBpbnB1dE9mZnNldCwgYnl0ZUxlbmd0aCk7CiAgICAgICAgdmFyIHNsaWNlZENvcHlPZkJ5dGVzID0gVWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcywgaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgYnl0ZUxlbmd0aCk7CiAgICAgICAgdGhpcy5zdG9yZShzbGljZWRDb3B5T2ZCeXRlcywgc3RyKTsKICAgICAgICByZXR1cm4gc3RyOwogICAgfTsKICAgIHJldHVybiBDYWNoZWRLZXlEZWNvZGVyOwp9KCk7CnZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsKICAgICAgICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7CiAgICAgICAgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9Owp2YXIgX19nZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IgfHwgZnVuY3Rpb24odGhpc0FyZywgYm9keSkgewogICAgdmFyIF8gPSB7CiAgICAgICAgbGFiZWw6IDAsCiAgICAgICAgc2VudDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsKICAgICAgICAgICAgcmV0dXJuIHRbMV07CiAgICAgICAgfSwKICAgICAgICB0cnlzOiBbXSwKICAgICAgICBvcHM6IFtdCiAgICB9LCBmLCB5LCB0LCBnOwogICAgcmV0dXJuIGcgPSB7CiAgICAgICAgbmV4dDogdmVyYigwKSwKICAgICAgICAidGhyb3ciOiB2ZXJiKDEpLAogICAgICAgICJyZXR1cm4iOiB2ZXJiKDIpCiAgICB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ZXAoWwogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgIHYKICAgICAgICAgICAgXSk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHsKICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwogICAgICAgIHdoaWxlKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXyl0cnkgewogICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbCiAgICAgICAgICAgICAgICBvcFswXSAmIDIsCiAgICAgICAgICAgICAgICB0LnZhbHVlCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIHN3aXRjaChvcFswXSl7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgdCA9IG9wOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3BbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICBfLmxhYmVsKys7CiAgICAgICAgICAgICAgICAgICAgeSA9IG9wWzFdOwogICAgICAgICAgICAgICAgICAgIG9wID0gWwogICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgXyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSBvcFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG9wOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IHRbMl07CiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3BzLnB1c2gob3ApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIG9wID0gWwogICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgIGUKICAgICAgICAgICAgXTsKICAgICAgICAgICAgeSA9IDA7CiAgICAgICAgfSBmaW5hbGx5ewogICAgICAgICAgICBmID0gdCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLAogICAgICAgICAgICBkb25lOiB0cnVlCiAgICAgICAgfTsKICAgIH0KfTsKdmFyIF9fYXN5bmNWYWx1ZXMgPSB0aGlzICYmIHRoaXMuX19hc3luY1ZhbHVlcyB8fCBmdW5jdGlvbihvKSB7CiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7CiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSAiZnVuY3Rpb24iID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwgaSk7CiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICBpW25dID0gb1tuXSAmJiBmdW5jdGlvbih2KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgIHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgewogICAgICAgIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgcmVzb2x2ZSh7CiAgICAgICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgICAgIGRvbmU6IGQKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgcmVqZWN0KTsKICAgIH0KfTsKdmFyIF9fYXdhaXQgPSB0aGlzICYmIHRoaXMuX19hd2FpdCB8fCBmdW5jdGlvbih2KSB7CiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTsKfTsKdmFyIF9fYXN5bmNHZW5lcmF0b3IgPSB0aGlzICYmIHRoaXMuX19hc3luY0dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHsKICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTsKICAgIHJldHVybiBpID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciKSwgdmVyYigicmV0dXJuIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LCBpOwogICAgZnVuY3Rpb24gdmVyYihuKSB7CiAgICAgICAgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbih2KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICBxLnB1c2goWwogICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgICAgIGIKICAgICAgICAgICAgICAgIF0pID4gMSB8fCByZXN1bWUobiwgdik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAoZ1tuXSh2KSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZXR0bGUocVswXVszXSwgZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RlcChyKSB7CiAgICAgICAgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7CiAgICB9CiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7CiAgICAgICAgcmVzdW1lKCJuZXh0IiwgdmFsdWUpOwogICAgfQogICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7CiAgICAgICAgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7CiAgICAgICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsKICAgIH0KfTsKdmFyIFNUQVRFX0FSUkFZID0gImFycmF5IjsKdmFyIFNUQVRFX01BUF9LRVkgPSAibWFwX2tleSI7CnZhciBTVEFURV9NQVBfVkFMVUUgPSAibWFwX3ZhbHVlIjsKdmFyIGlzVmFsaWRNYXBLZXlUeXBlID0gZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIGtleSA9PT0gIm51bWJlciI7Cn07CnZhciBIRUFEX0JZVEVfUkVRVUlSRUQgPSAtMTsKdmFyIEVNUFRZX1ZJRVcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDApKTsKdmFyIEVNUFRZX0JZVEVTID0gbmV3IFVpbnQ4QXJyYXkoRU1QVFlfVklFVy5idWZmZXIpOwp0cnkgewogICAgRU1QVFlfVklFVy5nZXRJbnQ4KDApOwp9IGNhdGNoIChlKSB7CiAgICBpZiAoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIik7CiAgICB9Cn0KdmFyIERhdGFWaWV3SW5kZXhPdXRPZkJvdW5kc0Vycm9yID0gUmFuZ2VFcnJvcjsKdmFyIE1PUkVfREFUQSA9IG5ldyBEYXRhVmlld0luZGV4T3V0T2ZCb3VuZHNFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKTsKdmFyIHNoYXJlZENhY2hlZEtleURlY29kZXIgPSBuZXcgQ2FjaGVkS2V5RGVjb2RlcigpOwp2YXIgRGVjb2RlciA9IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gRGVjb2RlcihvcHRpb25zKSB7CiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nOwogICAgICAgIHRoaXMudG90YWxQb3MgPSAwOwogICAgICAgIHRoaXMucG9zID0gMDsKICAgICAgICB0aGlzLnZpZXcgPSBFTVBUWV9WSUVXOwogICAgICAgIHRoaXMuYnl0ZXMgPSBFTVBUWV9CWVRFUzsKICAgICAgICB0aGlzLmhlYWRCeXRlID0gSEVBRF9CWVRFX1JFUVVJUkVEOwogICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICB0aGlzLmV4dGVuc2lvbkNvZGVjID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmV4dGVuc2lvbkNvZGVjKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBFeHRlbnNpb25Db2RlYy5kZWZhdWx0Q29kZWM7CiAgICAgICAgdGhpcy5jb250ZXh0ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbnRleHQ7CiAgICAgICAgdGhpcy51c2VCaWdJbnQ2NCA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51c2VCaWdJbnQ2NCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7CiAgICAgICAgdGhpcy5tYXhTdHJMZW5ndGggPSAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWF4U3RyTGVuZ3RoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBVSU5UMzJfTUFYOwogICAgICAgIHRoaXMubWF4QmluTGVuZ3RoID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heEJpbkxlbmd0aCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogVUlOVDMyX01BWDsKICAgICAgICB0aGlzLm1heEFycmF5TGVuZ3RoID0gKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heEFycmF5TGVuZ3RoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBVSU5UMzJfTUFYOwogICAgICAgIHRoaXMubWF4TWFwTGVuZ3RoID0gKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1heE1hcExlbmd0aCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogVUlOVDMyX01BWDsKICAgICAgICB0aGlzLm1heEV4dExlbmd0aCA9IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tYXhFeHRMZW5ndGgpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IFVJTlQzMl9NQVg7CiAgICAgICAgdGhpcy5rZXlEZWNvZGVyID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5rZXlEZWNvZGVyKSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlEZWNvZGVyIDogc2hhcmVkQ2FjaGVkS2V5RGVjb2RlcjsKICAgIH0KICAgIERlY29kZXIucHJvdG90eXBlLnJlaW5pdGlhbGl6ZVN0YXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50b3RhbFBvcyA9IDA7CiAgICAgICAgdGhpcy5oZWFkQnl0ZSA9IEhFQURfQllURV9SRVFVSVJFRDsKICAgICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuc2V0QnVmZmVyID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgdGhpcy5ieXRlcyA9IGVuc3VyZVVpbnQ4QXJyYXkoYnVmZmVyKTsKICAgICAgICB0aGlzLnZpZXcgPSBjcmVhdGVEYXRhVmlldyh0aGlzLmJ5dGVzKTsKICAgICAgICB0aGlzLnBvcyA9IDA7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuYXBwZW5kQnVmZmVyID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgaWYgKHRoaXMuaGVhZEJ5dGUgPT09IEhFQURfQllURV9SRVFVSVJFRCAmJiAhdGhpcy5oYXNSZW1haW5pbmcoMSkpIHsKICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIoYnVmZmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcmVtYWluaW5nRGF0YSA9IHRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpOwogICAgICAgICAgICB2YXIgbmV3RGF0YSA9IGVuc3VyZVVpbnQ4QXJyYXkoYnVmZmVyKTsKICAgICAgICAgICAgdmFyIG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHJlbWFpbmluZ0RhdGEubGVuZ3RoICsgbmV3RGF0YS5sZW5ndGgpOwogICAgICAgICAgICBuZXdCdWZmZXIuc2V0KHJlbWFpbmluZ0RhdGEpOwogICAgICAgICAgICBuZXdCdWZmZXIuc2V0KG5ld0RhdGEsIHJlbWFpbmluZ0RhdGEubGVuZ3RoKTsKICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIobmV3QnVmZmVyKTsKICAgICAgICB9CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuaGFzUmVtYWluaW5nID0gZnVuY3Rpb24oc2l6ZSkgewogICAgICAgIHJldHVybiB0aGlzLnZpZXcuYnl0ZUxlbmd0aCAtIHRoaXMucG9zID49IHNpemU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuY3JlYXRlRXh0cmFCeXRlRXJyb3IgPSBmdW5jdGlvbihwb3NUb1Nob3cpIHsKICAgICAgICB2YXIgX2EgPSB0aGlzLCB2aWV3ID0gX2EudmlldywgcG9zID0gX2EucG9zOwogICAgICAgIHJldHVybiBuZXcgUmFuZ2VFcnJvcigiRXh0cmEgIi5jb25jYXQodmlldy5ieXRlTGVuZ3RoIC0gcG9zLCAiIG9mICIpLmNvbmNhdCh2aWV3LmJ5dGVMZW5ndGgsICIgYnl0ZShzKSBmb3VuZCBhdCBidWZmZXJbIikuY29uY2F0KHBvc1RvU2hvdywgIl0iKSk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpOwogICAgICAgIHRoaXMuc2V0QnVmZmVyKGJ1ZmZlcik7CiAgICAgICAgdmFyIG9iamVjdCA9IHRoaXMuZG9EZWNvZGVTeW5jKCk7CiAgICAgICAgaWYgKHRoaXMuaGFzUmVtYWluaW5nKDEpKSB7CiAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLmRlY29kZU11bHRpID0gZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9hKSB7CiAgICAgICAgICAgIHN3aXRjaChfYS5sYWJlbCl7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNSZW1haW5pbmcoMSkpIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9EZWNvZGVTeW5jKCkKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLmRlY29kZUFzeW5jID0gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgdmFyIF9hLCBzdHJlYW1fMSwgc3RyZWFtXzFfMTsKICAgICAgICB2YXIgX2IsIGVfMSwgX2MsIF9kOwogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZGVjb2RlZCwgb2JqZWN0LCBidWZmZXIsIGVfMV8xLCBfZSwgaGVhZEJ5dGUsIHBvcywgdG90YWxQb3M7CiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfZikgewogICAgICAgICAgICAgICAgc3dpdGNoKF9mLmxhYmVsKXsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgX2YubGFiZWwgPSAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgX2YudHJ5cy5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRydWUsIHN0cmVhbV8xID0gX19hc3luY1ZhbHVlcyhzdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICAgICBfZi5sYWJlbCA9IDI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV8xLm5leHQoKQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RyZWFtXzFfMSA9IF9mLnNlbnQoKSwgX2IgPSBzdHJlYW1fMV8xLmRvbmUsICFfYikpIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBfZCA9IHN0cmVhbV8xXzEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBfZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQnVmZmVyKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMuZG9EZWNvZGVTeW5jKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIERhdGFWaWV3SW5kZXhPdXRPZkJvdW5kc0Vycm9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxQb3MgKz0gdGhpcy5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBfZi5sYWJlbCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgIGVfMV8xID0gX2Yuc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZV8xXzEKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgX2YudHJ5cy5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghX2EgJiYgIV9iICYmIChfYyA9IHN0cmVhbV8xLnJldHVybikpKSByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYy5jYWxsKHN0cmVhbV8xKQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgX2Yuc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBfZi5sYWJlbCA9IDk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNwogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1JlbWFpbmluZygxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy50b3RhbFBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF9lID0gdGhpcywgaGVhZEJ5dGUgPSBfZS5oZWFkQnl0ZSwgcG9zID0gX2UucG9zLCB0b3RhbFBvcyA9IF9lLnRvdGFsUG9zOwogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAiLmNvbmNhdChwcmV0dHlCeXRlKGhlYWRCeXRlKSwgIiBhdCAiKS5jb25jYXQodG90YWxQb3MsICIgKCIpLmNvbmNhdChwb3MsICIgaW4gdGhlIGN1cnJlbnQgYnVmZmVyKSIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlQXJyYXlTdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVNdWx0aUFzeW5jKHN0cmVhbSwgdHJ1ZSk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlU3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhzdHJlYW0sIGZhbHNlKTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGVNdWx0aUFzeW5jID0gZnVuY3Rpb24oc3RyZWFtLCBpc0FycmF5KSB7CiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiBkZWNvZGVNdWx0aUFzeW5jXzEoKSB7CiAgICAgICAgICAgIHZhciBpc0FycmF5SGVhZGVyUmVxdWlyZWQsIGFycmF5SXRlbXNMZWZ0LCBfYSwgc3RyZWFtXzIsIHN0cmVhbV8yXzEsIGJ1ZmZlciwgZV8yLCBlXzNfMTsKICAgICAgICAgICAgdmFyIF9iLCBlXzMsIF9jLCBfZDsKICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9lKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2goX2UubGFiZWwpewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheUhlYWRlclJlcXVpcmVkID0gaXNBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJdGVtc0xlZnQgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdHJ1ZSwgc3RyZWFtXzIgPSBfX2FzeW5jVmFsdWVzKHN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hd2FpdChzdHJlYW1fMi5uZXh0KCkpCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdHJlYW1fMl8xID0gX2Uuc2VudCgpLCBfYiA9IHN0cmVhbV8yXzEuZG9uZSwgIV9iKSkgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBfZCA9IHN0cmVhbV8yXzEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMwogICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gX2Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5ICYmIGFycmF5SXRlbXNMZWZ0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQnVmZmVyKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5SGVhZGVyUmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5SXRlbXNMZWZ0ID0gdGhpcy5yZWFkQXJyYXlTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5SGVhZGVyUmVxdWlyZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJ1ZSkgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hd2FpdCh0aGlzLmRvRGVjb2RlU3luYygpKQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCkKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tYXJyYXlJdGVtc0xlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNgogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IF9lLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZV8yIGluc3RhbmNlb2YgRGF0YVZpZXdJbmRleE91dE9mQm91bmRzRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXzI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxQb3MgKz0gdGhpcy5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgIGVfM18xID0gX2Uuc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlXzMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZV8zXzEKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCFfYSAmJiAhX2IgJiYgKF9jID0gc3RyZWFtXzIucmV0dXJuKSkpIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2F3YWl0KF9jLmNhbGwoc3RyZWFtXzIpKQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNwogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuZG9EZWNvZGVTeW5jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgREVDT0RFOiB3aGlsZSh0cnVlKXsKICAgICAgICAgICAgdmFyIGhlYWRCeXRlID0gdGhpcy5yZWFkSGVhZEJ5dGUoKTsKICAgICAgICAgICAgdmFyIG9iamVjdCA9IHZvaWQgMDsKICAgICAgICAgICAgaWYgKGhlYWRCeXRlID49IDB4ZTApIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IGhlYWRCeXRlIC0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPCAweGMwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGVhZEJ5dGUgPCAweDgwKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gaGVhZEJ5dGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlIDwgMHg5MCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gaGVhZEJ5dGUgLSAweDgwOwogICAgICAgICAgICAgICAgICAgIGlmIChzaXplICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaE1hcFN0YXRlKHNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIERFQ09ERTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlIDwgMHhhMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gaGVhZEJ5dGUgLSAweDkwOwogICAgICAgICAgICAgICAgICAgIGlmIChzaXplICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaEFycmF5U3RhdGUoc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgREVDT0RFOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGVMZW5ndGggPSBoZWFkQnl0ZSAtIDB4YTA7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVVdGY4U3RyaW5nKGJ5dGVMZW5ndGgsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGMwKSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSBudWxsOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGMyKSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhjMykgewogICAgICAgICAgICAgICAgb2JqZWN0ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhjYSkgewogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5yZWFkRjMyKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4Y2IpIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMucmVhZEY2NCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGNjKSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnJlYWRVOCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGNkKSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnJlYWRVMTYoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhjZSkgewogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5yZWFkVTMyKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4Y2YpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZUJpZ0ludDY0KSB7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5yZWFkVTY0QXNCaWdJbnQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5yZWFkVTY0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4ZDApIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMucmVhZEk4KCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4ZDEpIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMucmVhZEkxNigpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGQyKSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnJlYWRJMzIoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhkMykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlQmlnSW50NjQpIHsKICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnJlYWRJNjRBc0JpZ0ludCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnJlYWRJNjQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhkOSkgewogICAgICAgICAgICAgICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmxvb2tVOCgpOwogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVVdGY4U3RyaW5nKGJ5dGVMZW5ndGgsIDEpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGRhKSB7CiAgICAgICAgICAgICAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMubG9va1UxNigpOwogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVVdGY4U3RyaW5nKGJ5dGVMZW5ndGgsIDIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGRiKSB7CiAgICAgICAgICAgICAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMubG9va1UzMigpOwogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVVdGY4U3RyaW5nKGJ5dGVMZW5ndGgsIDQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGRjKSB7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucmVhZFUxNigpOwogICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hBcnJheVN0YXRlKHNpemUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBERUNPREU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGRkKSB7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucmVhZFUzMigpOwogICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hBcnJheVN0YXRlKHNpemUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBERUNPREU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGRlKSB7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucmVhZFUxNigpOwogICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hNYXBTdGF0ZShzaXplKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgREVDT0RFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhkZikgewogICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLnJlYWRVMzIoKTsKICAgICAgICAgICAgICAgIGlmIChzaXplICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoTWFwU3RhdGUoc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIERFQ09ERTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4YzQpIHsKICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5sb29rVTgoKTsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMuZGVjb2RlQmluYXJ5KHNpemUsIDEpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGM1KSB7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubG9va1UxNigpOwogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVCaW5hcnkoc2l6ZSwgMik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4YzYpIHsKICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5sb29rVTMyKCk7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLmRlY29kZUJpbmFyeShzaXplLCA0KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhkNCkgewogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVFeHRlbnNpb24oMSwgMCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4ZDUpIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsIDApOwogICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRCeXRlID09PSAweGQ2KSB7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLmRlY29kZUV4dGVuc2lvbig0LCAwKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhkNykgewogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVFeHRlbnNpb24oOCwgMCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4ZDgpIHsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LCAwKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhjNykgewogICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLmxvb2tVOCgpOwogICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5kZWNvZGVFeHRlbnNpb24oc2l6ZSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZEJ5dGUgPT09IDB4YzgpIHsKICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5sb29rVTE2KCk7CiAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLmRlY29kZUV4dGVuc2lvbihzaXplLCAyKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkQnl0ZSA9PT0gMHhjOSkgewogICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLmxvb2tVMzIoKTsKICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMuZGVjb2RlRXh0ZW5zaW9uKHNpemUsIDQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlY29kZUVycm9yKCJVbnJlY29nbml6ZWQgdHlwZSBieXRlOiAiLmNvbmNhdChwcmV0dHlCeXRlKGhlYWRCeXRlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgICAgdmFyIHN0YWNrID0gdGhpcy5zdGFjazsKICAgICAgICAgICAgd2hpbGUoc3RhY2subGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS50eXBlID09PSBTVEFURV9BUlJBWSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmFycmF5W3N0YXRlLnBvc2l0aW9uXSA9IG9iamVjdDsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wb3NpdGlvbisrOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUuc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gc3RhdGUuYXJyYXk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgREVDT0RFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUudHlwZSA9PT0gU1RBVEVfTUFQX0tFWSkgewogICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZE1hcEtleVR5cGUob2JqZWN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVjb2RlRXJyb3IoIlRoZSB0eXBlIG9mIGtleSBtdXN0IGJlIHN0cmluZyBvciBudW1iZXIgYnV0ICIgKyB0eXBlb2Ygb2JqZWN0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gIl9fcHJvdG9fXyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlY29kZUVycm9yKCJUaGUga2V5IF9fcHJvdG9fXyBpcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0ZS5rZXkgPSBvYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9IFNUQVRFX01BUF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBERUNPREU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLm1hcFtzdGF0ZS5rZXldID0gb2JqZWN0OwogICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlYWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5yZWFkQ291bnQgPT09IHN0YXRlLnNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHN0YXRlLm1hcDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5rZXkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID0gU1RBVEVfTUFQX0tFWTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgREVDT0RFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICAgIH0KICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5yZWFkSGVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5oZWFkQnl0ZSA9PT0gSEVBRF9CWVRFX1JFUVVJUkVEKSB7CiAgICAgICAgICAgIHRoaXMuaGVhZEJ5dGUgPSB0aGlzLnJlYWRVOCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5oZWFkQnl0ZTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaGVhZEJ5dGUgPSBIRUFEX0JZVEVfUkVRVUlSRUQ7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZEFycmF5U2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBoZWFkQnl0ZSA9IHRoaXMucmVhZEhlYWRCeXRlKCk7CiAgICAgICAgc3dpdGNoKGhlYWRCeXRlKXsKICAgICAgICAgICAgY2FzZSAweGRjOgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFUxNigpOwogICAgICAgICAgICBjYXNlIDB4ZGQ6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkVTMyKCk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRCeXRlIDwgMHhhMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVhZEJ5dGUgLSAweDkwOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZWNvZGVFcnJvcigiVW5yZWNvZ25pemVkIGFycmF5IHR5cGUgYnl0ZTogIi5jb25jYXQocHJldHR5Qnl0ZShoZWFkQnl0ZSkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLnB1c2hNYXBTdGF0ZSA9IGZ1bmN0aW9uKHNpemUpIHsKICAgICAgICBpZiAoc2l6ZSA+IHRoaXMubWF4TWFwTGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBEZWNvZGVFcnJvcigiTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoIi5jb25jYXQoc2l6ZSwgIikgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCIpLmNvbmNhdCh0aGlzLm1heE1hcExlbmd0aCwgIikiKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhY2sucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IFNUQVRFX01BUF9LRVksCiAgICAgICAgICAgIHNpemU6IHNpemUsCiAgICAgICAgICAgIGtleTogbnVsbCwKICAgICAgICAgICAgcmVhZENvdW50OiAwLAogICAgICAgICAgICBtYXA6IHt9CiAgICAgICAgfSk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucHVzaEFycmF5U3RhdGUgPSBmdW5jdGlvbihzaXplKSB7CiAgICAgICAgaWYgKHNpemUgPiB0aGlzLm1heEFycmF5TGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBEZWNvZGVFcnJvcigiTWF4IGxlbmd0aCBleGNlZWRlZDogYXJyYXkgbGVuZ3RoICgiLmNvbmNhdChzaXplLCAiKSA+IG1heEFycmF5TGVuZ3RoICgiKS5jb25jYXQodGhpcy5tYXhBcnJheUxlbmd0aCwgIikiKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhY2sucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IFNUQVRFX0FSUkFZLAogICAgICAgICAgICBzaXplOiBzaXplLAogICAgICAgICAgICBhcnJheTogbmV3IEFycmF5KHNpemUpLAogICAgICAgICAgICBwb3NpdGlvbjogMAogICAgICAgIH0pOwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLmRlY29kZVV0ZjhTdHJpbmcgPSBmdW5jdGlvbihieXRlTGVuZ3RoLCBoZWFkZXJPZmZzZXQpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgaWYgKGJ5dGVMZW5ndGggPiB0aGlzLm1heFN0ckxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRGVjb2RlRXJyb3IoIk1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgiLmNvbmNhdChieXRlTGVuZ3RoLCAiKSA+IG1heFN0ckxlbmd0aCAoIikuY29uY2F0KHRoaXMubWF4U3RyTGVuZ3RoLCAiKSIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuYnl0ZXMuYnl0ZUxlbmd0aCA8IHRoaXMucG9zICsgaGVhZGVyT2Zmc2V0ICsgYnl0ZUxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBNT1JFX0RBVEE7CiAgICAgICAgfQogICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnBvcyArIGhlYWRlck9mZnNldDsKICAgICAgICB2YXIgb2JqZWN0OwogICAgICAgIGlmICh0aGlzLnN0YXRlSXNNYXBLZXkoKSAmJiAoKF9hID0gdGhpcy5rZXlEZWNvZGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FuQmVDYWNoZWQoYnl0ZUxlbmd0aCkpKSB7CiAgICAgICAgICAgIG9iamVjdCA9IHRoaXMua2V5RGVjb2Rlci5kZWNvZGUodGhpcy5ieXRlcywgb2Zmc2V0LCBieXRlTGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvYmplY3QgPSB1dGY4RGVjb2RlKHRoaXMuYnl0ZXMsIG9mZnNldCwgYnl0ZUxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucG9zICs9IGhlYWRlck9mZnNldCArIGJ5dGVMZW5ndGg7CiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5zdGF0ZUlzTWFwS2V5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50eXBlID09PSBTVEFURV9NQVBfS0VZOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZUxlbmd0aCwgaGVhZE9mZnNldCkgewogICAgICAgIGlmIChieXRlTGVuZ3RoID4gdGhpcy5tYXhCaW5MZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERlY29kZUVycm9yKCJNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgiLmNvbmNhdChieXRlTGVuZ3RoLCAiKSA+IG1heEJpbkxlbmd0aCAoIikuY29uY2F0KHRoaXMubWF4QmluTGVuZ3RoLCAiKSIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmhhc1JlbWFpbmluZyhieXRlTGVuZ3RoICsgaGVhZE9mZnNldCkpIHsKICAgICAgICAgICAgdGhyb3cgTU9SRV9EQVRBOwogICAgICAgIH0KICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5wb3MgKyBoZWFkT2Zmc2V0OwogICAgICAgIHZhciBvYmplY3QgPSB0aGlzLmJ5dGVzLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgYnl0ZUxlbmd0aCk7CiAgICAgICAgdGhpcy5wb3MgKz0gaGVhZE9mZnNldCArIGJ5dGVMZW5ndGg7CiAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGVFeHRlbnNpb24gPSBmdW5jdGlvbihzaXplLCBoZWFkT2Zmc2V0KSB7CiAgICAgICAgaWYgKHNpemUgPiB0aGlzLm1heEV4dExlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRGVjb2RlRXJyb3IoIk1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCIuY29uY2F0KHNpemUsICIpID4gbWF4RXh0TGVuZ3RoICgiKS5jb25jYXQodGhpcy5tYXhFeHRMZW5ndGgsICIpIikpOwogICAgICAgIH0KICAgICAgICB2YXIgZXh0VHlwZSA9IHRoaXMudmlldy5nZXRJbnQ4KHRoaXMucG9zICsgaGVhZE9mZnNldCk7CiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRlY29kZUJpbmFyeShzaXplLCBoZWFkT2Zmc2V0ICsgMSk7CiAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uQ29kZWMuZGVjb2RlKGRhdGEsIGV4dFR5cGUsIHRoaXMuY29udGV4dCk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUubG9va1U4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUubG9va1UxNiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5sb29rVTMyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpOwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLnJlYWRVOCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MrKzsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZEk4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldEludDgodGhpcy5wb3MpOwogICAgICAgIHRoaXMucG9zKys7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLnJlYWRVMTYgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKTsKICAgICAgICB0aGlzLnBvcyArPSAyOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldEludDE2KHRoaXMucG9zKTsKICAgICAgICB0aGlzLnBvcyArPSAyOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5yZWFkVTMyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gNDsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmlldy5nZXRJbnQzMih0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gNDsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZFU2NCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IGdldFVpbnQ2NCh0aGlzLnZpZXcsIHRoaXMucG9zKTsKICAgICAgICB0aGlzLnBvcyArPSA4OwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gZ2V0SW50NjQodGhpcy52aWV3LCB0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gODsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZFU2NEFzQmlnSW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldEJpZ1VpbnQ2NCh0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gODsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgRGVjb2Rlci5wcm90b3R5cGUucmVhZEk2NEFzQmlnSW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldEJpZ0ludDY0KHRoaXMucG9zKTsKICAgICAgICB0aGlzLnBvcyArPSA4OwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgICBEZWNvZGVyLnByb3RvdHlwZS5yZWFkRjMyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52aWV3LmdldEZsb2F0MzIodGhpcy5wb3MpOwogICAgICAgIHRoaXMucG9zICs9IDQ7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKICAgIERlY29kZXIucHJvdG90eXBlLnJlYWRGNjQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZpZXcuZ2V0RmxvYXQ2NCh0aGlzLnBvcyk7CiAgICAgICAgdGhpcy5wb3MgKz0gODsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9OwogICAgcmV0dXJuIERlY29kZXI7Cn0oKTsKZnVuY3Rpb24gZGVjb2RlKGJ1ZmZlciwgb3B0aW9ucykgewogICAgdmFyIGRlY29kZXIgPSBuZXcgRGVjb2RlcihvcHRpb25zKTsKICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShidWZmZXIpOwp9CnRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7CiAgICB2YXIgXyA9IHsKICAgICAgICBsYWJlbDogMCwKICAgICAgICBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOwogICAgICAgICAgICByZXR1cm4gdFsxXTsKICAgICAgICB9LAogICAgICAgIHRyeXM6IFtdLAogICAgICAgIG9wczogW10KICAgIH0sIGYsIHksIHQsIGc7CiAgICByZXR1cm4gZyA9IHsKICAgICAgICBuZXh0OiB2ZXJiKDApLAogICAgICAgICJ0aHJvdyI6IHZlcmIoMSksCiAgICAgICAgInJldHVybiI6IHZlcmIoMikKICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfSksIGc7CiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odikgewogICAgICAgICAgICByZXR1cm4gc3RlcChbCiAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgdgogICAgICAgICAgICBdKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKXRyeSB7CiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbInJldHVybiJdIDogb3BbMF0gPyB5WyJ0aHJvdyJdIHx8ICgodCA9IHlbInJldHVybiJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDsKICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFsKICAgICAgICAgICAgICAgIG9wWzBdICYgMiwKICAgICAgICAgICAgICAgIHQudmFsdWUKICAgICAgICAgICAgXTsKICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICB0ID0gb3A7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07CiAgICAgICAgICAgICAgICAgICAgb3AgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgewogICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgb3AgPSBbCiAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgZQogICAgICAgICAgICBdOwogICAgICAgICAgICB5ID0gMDsKICAgICAgICB9IGZpbmFsbHl7CiAgICAgICAgICAgIGYgPSB0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsCiAgICAgICAgICAgIGRvbmU6IHRydWUKICAgICAgICB9OwogICAgfQp9Owp2YXIgX19hd2FpdDEgPSB0aGlzICYmIHRoaXMuX19hd2FpdCB8fCBmdW5jdGlvbih2KSB7CiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQxID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQxKHYpOwp9Owp0aGlzICYmIHRoaXMuX19hc3luY0dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHsKICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTsKICAgIHJldHVybiBpID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciKSwgdmVyYigicmV0dXJuIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LCBpOwogICAgZnVuY3Rpb24gdmVyYihuKSB7CiAgICAgICAgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbih2KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICBxLnB1c2goWwogICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgICAgIGIKICAgICAgICAgICAgICAgIF0pID4gMSB8fCByZXN1bWUobiwgdik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAoZ1tuXSh2KSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZXR0bGUocVswXVszXSwgZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RlcChyKSB7CiAgICAgICAgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQxID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOwogICAgfQogICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgewogICAgICAgIHJlc3VtZSgibmV4dCIsIHZhbHVlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgewogICAgICAgIHJlc3VtZSgidGhyb3ciLCB2YWx1ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgewogICAgICAgIGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7CiAgICB9Cn07CnRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24odGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgewogICAgICAgICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsKICAgICAgICB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07CnRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbih0aGlzQXJnLCBib2R5KSB7CiAgICB2YXIgXyA9IHsKICAgICAgICBsYWJlbDogMCwKICAgICAgICBzZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOwogICAgICAgICAgICByZXR1cm4gdFsxXTsKICAgICAgICB9LAogICAgICAgIHRyeXM6IFtdLAogICAgICAgIG9wczogW10KICAgIH0sIGYsIHksIHQsIGc7CiAgICByZXR1cm4gZyA9IHsKICAgICAgICBuZXh0OiB2ZXJiKDApLAogICAgICAgICJ0aHJvdyI6IHZlcmIoMSksCiAgICAgICAgInJldHVybiI6IHZlcmIoMikKICAgIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfSksIGc7CiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odikgewogICAgICAgICAgICByZXR1cm4gc3RlcChbCiAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgdgogICAgICAgICAgICBdKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKXRyeSB7CiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbInJldHVybiJdIDogb3BbMF0gPyB5WyJ0aHJvdyJdIHx8ICgodCA9IHlbInJldHVybiJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDsKICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFsKICAgICAgICAgICAgICAgIG9wWzBdICYgMiwKICAgICAgICAgICAgICAgIHQudmFsdWUKICAgICAgICAgICAgXTsKICAgICAgICAgICAgc3dpdGNoKG9wWzBdKXsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICB0ID0gb3A7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCsrOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIF8ubGFiZWwrKzsKICAgICAgICAgICAgICAgICAgICB5ID0gb3BbMV07CiAgICAgICAgICAgICAgICAgICAgb3AgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIG9wID0gXy5vcHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgb3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF8ubGFiZWwgPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICB0ID0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgewogICAgICAgICAgICAgICAgICAgICAgICBfLmxhYmVsID0gdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgb3AgPSBbCiAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgZQogICAgICAgICAgICBdOwogICAgICAgICAgICB5ID0gMDsKICAgICAgICB9IGZpbmFsbHl7CiAgICAgICAgICAgIGYgPSB0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsCiAgICAgICAgICAgIGRvbmU6IHRydWUKICAgICAgICB9OwogICAgfQp9OwpmdW5jdGlvbiBfZShlKSB7CiAgICBsZXQgaSA9IGUubGVuZ3RoOwogICAgZm9yKDsgLS1pID49IDA7KWVbaV0gPSAwOwp9CnZhciAkaSA9IDAsIGFpID0gMSwgQ2kgPSAyLCBGaSA9IDMsIE1pID0gMjU4LCBkdCA9IDI5LCBBZSA9IDI1NiwgZ2UgPSBBZSArIDEgKyBkdCwgb2UgPSAzMCwgc3QgPSAxOSwgbmkgPSAyICogZ2UgKyAxLCBRID0gMTUsIEdlID0gMTYsIEhpID0gNywgY3QgPSAyNTYsIGxpID0gMTYsIHJpID0gMTcsIGZpID0gMTgsIGZ0ID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAxLAogICAgMSwKICAgIDEsCiAgICAxLAogICAgMiwKICAgIDIsCiAgICAyLAogICAgMiwKICAgIDMsCiAgICAzLAogICAgMywKICAgIDMsCiAgICA0LAogICAgNCwKICAgIDQsCiAgICA0LAogICAgNSwKICAgIDUsCiAgICA1LAogICAgNSwKICAgIDAKXSksICRlID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDEsCiAgICAxLAogICAgMiwKICAgIDIsCiAgICAzLAogICAgMywKICAgIDQsCiAgICA0LAogICAgNSwKICAgIDUsCiAgICA2LAogICAgNiwKICAgIDcsCiAgICA3LAogICAgOCwKICAgIDgsCiAgICA5LAogICAgOSwKICAgIDEwLAogICAgMTAsCiAgICAxMSwKICAgIDExLAogICAgMTIsCiAgICAxMiwKICAgIDEzLAogICAgMTMKXSksIEJpID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDAsCiAgICAwLAogICAgMCwKICAgIDIsCiAgICAzLAogICAgNwpdKSwgb2kgPSBuZXcgVWludDhBcnJheShbCiAgICAxNiwKICAgIDE3LAogICAgMTgsCiAgICAwLAogICAgOCwKICAgIDcsCiAgICA5LAogICAgNiwKICAgIDEwLAogICAgNSwKICAgIDExLAogICAgNCwKICAgIDEyLAogICAgMywKICAgIDEzLAogICAgMiwKICAgIDE0LAogICAgMSwKICAgIDE1Cl0pLCBLaSA9IDUxMiwgQiA9IG5ldyBBcnJheSgoZ2UgKyAyKSAqIDIpOwpfZShCKTsKdmFyIHVlID0gbmV3IEFycmF5KG9lICogMik7Cl9lKHVlKTsKdmFyIHBlID0gbmV3IEFycmF5KEtpKTsKX2UocGUpOwp2YXIgeGUgPSBuZXcgQXJyYXkoTWkgLSBGaSArIDEpOwpfZSh4ZSk7CnZhciB1dCA9IG5ldyBBcnJheShkdCk7Cl9lKHV0KTsKdmFyIEhlID0gbmV3IEFycmF5KG9lKTsKX2UoSGUpOwpmdW5jdGlvbiBqZShlLCBpLCB0LCBuLCBhKSB7CiAgICB0aGlzLnN0YXRpY190cmVlID0gZSwgdGhpcy5leHRyYV9iaXRzID0gaSwgdGhpcy5leHRyYV9iYXNlID0gdCwgdGhpcy5lbGVtcyA9IG4sIHRoaXMubWF4X2xlbmd0aCA9IGEsIHRoaXMuaGFzX3N0cmVlID0gZSAmJiBlLmxlbmd0aDsKfQp2YXIgX2ksIGhpLCBkaTsKZnVuY3Rpb24gV2UoZSwgaSkgewogICAgdGhpcy5keW5fdHJlZSA9IGUsIHRoaXMubWF4X2NvZGUgPSAwLCB0aGlzLnN0YXRfZGVzYyA9IGk7Cn0KdmFyIHNpID0gKGUpPT5lIDwgMjU2ID8gcGVbZV0gOiBwZVsyNTYgKyAoZSA+Pj4gNyldLCBrZSA9IChlLCBpKT0+ewogICAgZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK10gPSBpICYgMjU1LCBlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXSA9IGkgPj4+IDggJiAyNTU7Cn0sIE4xID0gKGUsIGksIHQpPT57CiAgICBlLmJpX3ZhbGlkID4gR2UgLSB0ID8gKGUuYmlfYnVmIHw9IGkgPDwgZS5iaV92YWxpZCAmIDY1NTM1LCBrZShlLCBlLmJpX2J1ZiksIGUuYmlfYnVmID0gaSA+PiBHZSAtIGUuYmlfdmFsaWQsIGUuYmlfdmFsaWQgKz0gdCAtIEdlKSA6IChlLmJpX2J1ZiB8PSBpIDw8IGUuYmlfdmFsaWQgJiA2NTUzNSwgZS5iaV92YWxpZCArPSB0KTsKfSwgRiA9IChlLCBpLCB0KT0+ewogICAgTjEoZSwgdFtpICogMl0sIHRbaSAqIDIgKyAxXSk7Cn0sIGNpID0gKGUsIGkpPT57CiAgICBsZXQgdCA9IDA7CiAgICBkbyB0IHw9IGUgJiAxLCBlID4+Pj0gMSwgdCA8PD0gMTsKICAgIHdoaWxlICgtLWkgPiAwKQogICAgcmV0dXJuIHQgPj4+IDE7Cn0sIFBpID0gKGUpPT57CiAgICBlLmJpX3ZhbGlkID09PSAxNiA/IChrZShlLCBlLmJpX2J1ZiksIGUuYmlfYnVmID0gMCwgZS5iaV92YWxpZCA9IDApIDogZS5iaV92YWxpZCA+PSA4ICYmIChlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXSA9IGUuYmlfYnVmICYgMjU1LCBlLmJpX2J1ZiA+Pj0gOCwgZS5iaV92YWxpZCAtPSA4KTsKfSwgWGkgPSAoZSwgaSk9PnsKICAgIGxldCB0ID0gaS5keW5fdHJlZSwgbiA9IGkubWF4X2NvZGUsIGEgPSBpLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSwgbCA9IGkuc3RhdF9kZXNjLmhhc19zdHJlZSwgbyA9IGkuc3RhdF9kZXNjLmV4dHJhX2JpdHMsIGYgPSBpLnN0YXRfZGVzYy5leHRyYV9iYXNlLCBjID0gaS5zdGF0X2Rlc2MubWF4X2xlbmd0aCwgciwgXywgRSwgcywgaCwgdSwgbSA9IDA7CiAgICBmb3IocyA9IDA7IHMgPD0gUTsgcysrKWUuYmxfY291bnRbc10gPSAwOwogICAgZm9yKHRbZS5oZWFwW2UuaGVhcF9tYXhdICogMiArIDFdID0gMCwgciA9IGUuaGVhcF9tYXggKyAxOyByIDwgbmk7IHIrKylfID0gZS5oZWFwW3JdLCBzID0gdFt0W18gKiAyICsgMV0gKiAyICsgMV0gKyAxLCBzID4gYyAmJiAocyA9IGMsIG0rKyksIHRbXyAqIDIgKyAxXSA9IHMsICEoXyA+IG4pICYmIChlLmJsX2NvdW50W3NdKyssIGggPSAwLCBfID49IGYgJiYgKGggPSBvW18gLSBmXSksIHUgPSB0W18gKiAyXSwgZS5vcHRfbGVuICs9IHUgKiAocyArIGgpLCBsICYmIChlLnN0YXRpY19sZW4gKz0gdSAqIChhW18gKiAyICsgMV0gKyBoKSkpOwogICAgaWYgKG0gIT09IDApIHsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGZvcihzID0gYyAtIDE7IGUuYmxfY291bnRbc10gPT09IDA7KXMtLTsKICAgICAgICAgICAgZS5ibF9jb3VudFtzXS0tLCBlLmJsX2NvdW50W3MgKyAxXSArPSAyLCBlLmJsX2NvdW50W2NdLS0sIG0gLT0gMjsKICAgICAgICB9d2hpbGUgKG0gPiAwKQogICAgICAgIGZvcihzID0gYzsgcyAhPT0gMDsgcy0tKWZvcihfID0gZS5ibF9jb3VudFtzXTsgXyAhPT0gMDspRSA9IGUuaGVhcFstLXJdLCAhKEUgPiBuKSAmJiAodFtFICogMiArIDFdICE9PSBzICYmIChlLm9wdF9sZW4gKz0gKHMgLSB0W0UgKiAyICsgMV0pICogdFtFICogMl0sIHRbRSAqIDIgKyAxXSA9IHMpLCBfLS0pOwogICAgfQp9LCB1aSA9IChlLCBpLCB0KT0+ewogICAgbGV0IG4gPSBuZXcgQXJyYXkoUSArIDEpLCBhID0gMCwgbCwgbzsKICAgIGZvcihsID0gMTsgbCA8PSBROyBsKyspbltsXSA9IGEgPSBhICsgdFtsIC0gMV0gPDwgMTsKICAgIGZvcihvID0gMDsgbyA8PSBpOyBvKyspewogICAgICAgIGxldCBmID0gZVtvICogMiArIDFdOwogICAgICAgIGYgIT09IDAgJiYgKGVbbyAqIDJdID0gY2kobltmXSsrLCBmKSk7CiAgICB9Cn0sIFlpID0gKCk9PnsKICAgIGxldCBlLCBpLCB0LCBuLCBhLCBsID0gbmV3IEFycmF5KFEgKyAxKTsKICAgIGZvcih0ID0gMCwgbiA9IDA7IG4gPCBkdCAtIDE7IG4rKylmb3IodXRbbl0gPSB0LCBlID0gMDsgZSA8IDEgPDwgZnRbbl07IGUrKyl4ZVt0KytdID0gbjsKICAgIGZvcih4ZVt0IC0gMV0gPSBuLCBhID0gMCwgbiA9IDA7IG4gPCAxNjsgbisrKWZvcihIZVtuXSA9IGEsIGUgPSAwOyBlIDwgMSA8PCAkZVtuXTsgZSsrKXBlW2ErK10gPSBuOwogICAgZm9yKGEgPj49IDc7IG4gPCBvZTsgbisrKWZvcihIZVtuXSA9IGEgPDwgNywgZSA9IDA7IGUgPCAxIDw8ICRlW25dIC0gNzsgZSsrKXBlWzI1NiArIGErK10gPSBuOwogICAgZm9yKGkgPSAwOyBpIDw9IFE7IGkrKylsW2ldID0gMDsKICAgIGZvcihlID0gMDsgZSA8PSAxNDM7KUJbZSAqIDIgKyAxXSA9IDgsIGUrKywgbFs4XSsrOwogICAgZm9yKDsgZSA8PSAyNTU7KUJbZSAqIDIgKyAxXSA9IDksIGUrKywgbFs5XSsrOwogICAgZm9yKDsgZSA8PSAyNzk7KUJbZSAqIDIgKyAxXSA9IDcsIGUrKywgbFs3XSsrOwogICAgZm9yKDsgZSA8PSAyODc7KUJbZSAqIDIgKyAxXSA9IDgsIGUrKywgbFs4XSsrOwogICAgZm9yKHVpKEIsIGdlICsgMSwgbCksIGUgPSAwOyBlIDwgb2U7IGUrKyl1ZVtlICogMiArIDFdID0gNSwgdWVbZSAqIDJdID0gY2koZSwgNSk7CiAgICBfaSA9IG5ldyBqZShCLCBmdCwgQWUgKyAxLCBnZSwgUSksIGhpID0gbmV3IGplKHVlLCAkZSwgMCwgb2UsIFEpLCBkaSA9IG5ldyBqZShuZXcgQXJyYXkoMCksIEJpLCAwLCBzdCwgSGkpOwp9LCBiaSA9IChlKT0+ewogICAgbGV0IGk7CiAgICBmb3IoaSA9IDA7IGkgPCBnZTsgaSsrKWUuZHluX2x0cmVlW2kgKiAyXSA9IDA7CiAgICBmb3IoaSA9IDA7IGkgPCBvZTsgaSsrKWUuZHluX2R0cmVlW2kgKiAyXSA9IDA7CiAgICBmb3IoaSA9IDA7IGkgPCBzdDsgaSsrKWUuYmxfdHJlZVtpICogMl0gPSAwOwogICAgZS5keW5fbHRyZWVbY3QgKiAyXSA9IDEsIGUub3B0X2xlbiA9IGUuc3RhdGljX2xlbiA9IDAsIGUubGFzdF9saXQgPSBlLm1hdGNoZXMgPSAwOwp9LCB3aSA9IChlKT0+ewogICAgZS5iaV92YWxpZCA+IDggPyBrZShlLCBlLmJpX2J1ZikgOiBlLmJpX3ZhbGlkID4gMCAmJiAoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK10gPSBlLmJpX2J1ZiksIGUuYmlfYnVmID0gMCwgZS5iaV92YWxpZCA9IDA7Cn0sIEdpID0gKGUsIGksIHQsIG4pPT57CiAgICB3aShlKSwgbiAmJiAoa2UoZSwgdCksIGtlKGUsIH50KSksIGUucGVuZGluZ19idWYuc2V0KGUud2luZG93LnN1YmFycmF5KGksIGkgKyB0KSwgZS5wZW5kaW5nKSwgZS5wZW5kaW5nICs9IHQ7Cn0sIHh0ID0gKGUsIGksIHQsIG4pPT57CiAgICBsZXQgYSA9IGkgKiAyLCBsID0gdCAqIDI7CiAgICByZXR1cm4gZVthXSA8IGVbbF0gfHwgZVthXSA9PT0gZVtsXSAmJiBuW2ldIDw9IG5bdF07Cn0sIFZlID0gKGUsIGksIHQpPT57CiAgICBsZXQgbiA9IGUuaGVhcFt0XSwgYSA9IHQgPDwgMTsKICAgIGZvcig7IGEgPD0gZS5oZWFwX2xlbiAmJiAoYSA8IGUuaGVhcF9sZW4gJiYgeHQoaSwgZS5oZWFwW2EgKyAxXSwgZS5oZWFwW2FdLCBlLmRlcHRoKSAmJiBhKyssICF4dChpLCBuLCBlLmhlYXBbYV0sIGUuZGVwdGgpKTspZS5oZWFwW3RdID0gZS5oZWFwW2FdLCB0ID0gYSwgYSA8PD0gMTsKICAgIGUuaGVhcFt0XSA9IG47Cn0sIGt0ID0gKGUsIGksIHQpPT57CiAgICBsZXQgbiwgYSwgbCA9IDAsIG8sIGY7CiAgICBpZiAoZS5sYXN0X2xpdCAhPT0gMCkgZG8gbiA9IGUucGVuZGluZ19idWZbZS5kX2J1ZiArIGwgKiAyXSA8PCA4IHwgZS5wZW5kaW5nX2J1ZltlLmRfYnVmICsgbCAqIDIgKyAxXSwgYSA9IGUucGVuZGluZ19idWZbZS5sX2J1ZiArIGxdLCBsKyssIG4gPT09IDAgPyBGKGUsIGEsIGkpIDogKG8gPSB4ZVthXSwgRihlLCBvICsgQWUgKyAxLCBpKSwgZiA9IGZ0W29dLCBmICE9PSAwICYmIChhIC09IHV0W29dLCBOMShlLCBhLCBmKSksIG4tLSwgbyA9IHNpKG4pLCBGKGUsIG8sIHQpLCBmID0gJGVbb10sIGYgIT09IDAgJiYgKG4gLT0gSGVbb10sIE4xKGUsIG4sIGYpKSk7CiAgICB3aGlsZSAobCA8IGUubGFzdF9saXQpCiAgICBGKGUsIGN0LCBpKTsKfSwgb3QgPSAoZSwgaSk9PnsKICAgIGxldCB0ID0gaS5keW5fdHJlZSwgbiA9IGkuc3RhdF9kZXNjLnN0YXRpY190cmVlLCBhID0gaS5zdGF0X2Rlc2MuaGFzX3N0cmVlLCBsID0gaS5zdGF0X2Rlc2MuZWxlbXMsIG8sIGYsIGMgPSAtMSwgcjsKICAgIGZvcihlLmhlYXBfbGVuID0gMCwgZS5oZWFwX21heCA9IG5pLCBvID0gMDsgbyA8IGw7IG8rKyl0W28gKiAyXSAhPT0gMCA/IChlLmhlYXBbKytlLmhlYXBfbGVuXSA9IGMgPSBvLCBlLmRlcHRoW29dID0gMCkgOiB0W28gKiAyICsgMV0gPSAwOwogICAgZm9yKDsgZS5oZWFwX2xlbiA8IDI7KXIgPSBlLmhlYXBbKytlLmhlYXBfbGVuXSA9IGMgPCAyID8gKytjIDogMCwgdFtyICogMl0gPSAxLCBlLmRlcHRoW3JdID0gMCwgZS5vcHRfbGVuLS0sIGEgJiYgKGUuc3RhdGljX2xlbiAtPSBuW3IgKiAyICsgMV0pOwogICAgZm9yKGkubWF4X2NvZGUgPSBjLCBvID0gZS5oZWFwX2xlbiA+PiAxOyBvID49IDE7IG8tLSlWZShlLCB0LCBvKTsKICAgIHIgPSBsOwogICAgZG8gbyA9IGUuaGVhcFsxXSwgZS5oZWFwWzFdID0gZS5oZWFwW2UuaGVhcF9sZW4tLV0sIFZlKGUsIHQsIDEpLCBmID0gZS5oZWFwWzFdLCBlLmhlYXBbLS1lLmhlYXBfbWF4XSA9IG8sIGUuaGVhcFstLWUuaGVhcF9tYXhdID0gZiwgdFtyICogMl0gPSB0W28gKiAyXSArIHRbZiAqIDJdLCBlLmRlcHRoW3JdID0gKGUuZGVwdGhbb10gPj0gZS5kZXB0aFtmXSA/IGUuZGVwdGhbb10gOiBlLmRlcHRoW2ZdKSArIDEsIHRbbyAqIDIgKyAxXSA9IHRbZiAqIDIgKyAxXSA9IHIsIGUuaGVhcFsxXSA9IHIrKywgVmUoZSwgdCwgMSk7CiAgICB3aGlsZSAoZS5oZWFwX2xlbiA+PSAyKQogICAgZS5oZWFwWy0tZS5oZWFwX21heF0gPSBlLmhlYXBbMV0sIFhpKGUsIGkpLCB1aSh0LCBjLCBlLmJsX2NvdW50KTsKfSwgdnQgPSAoZSwgaSwgdCk9PnsKICAgIGxldCBuLCBhID0gLTEsIGwsIG8gPSBpWzAgKiAyICsgMV0sIGYgPSAwLCBjID0gNywgciA9IDQ7CiAgICBmb3IobyA9PT0gMCAmJiAoYyA9IDEzOCwgciA9IDMpLCBpWyh0ICsgMSkgKiAyICsgMV0gPSA2NTUzNSwgbiA9IDA7IG4gPD0gdDsgbisrKWwgPSBvLCBvID0gaVsobiArIDEpICogMiArIDFdLCAhKCsrZiA8IGMgJiYgbCA9PT0gbykgJiYgKGYgPCByID8gZS5ibF90cmVlW2wgKiAyXSArPSBmIDogbCAhPT0gMCA/IChsICE9PSBhICYmIGUuYmxfdHJlZVtsICogMl0rKywgZS5ibF90cmVlW2xpICogMl0rKykgOiBmIDw9IDEwID8gZS5ibF90cmVlW3JpICogMl0rKyA6IGUuYmxfdHJlZVtmaSAqIDJdKyssIGYgPSAwLCBhID0gbCwgbyA9PT0gMCA/IChjID0gMTM4LCByID0gMykgOiBsID09PSBvID8gKGMgPSA2LCByID0gMykgOiAoYyA9IDcsIHIgPSA0KSk7Cn0sIEV0ID0gKGUsIGksIHQpPT57CiAgICBsZXQgbiwgYSA9IC0xLCBsLCBvID0gaVswICogMiArIDFdLCBmID0gMCwgYyA9IDcsIHIgPSA0OwogICAgZm9yKG8gPT09IDAgJiYgKGMgPSAxMzgsIHIgPSAzKSwgbiA9IDA7IG4gPD0gdDsgbisrKWlmIChsID0gbywgbyA9IGlbKG4gKyAxKSAqIDIgKyAxXSwgISgrK2YgPCBjICYmIGwgPT09IG8pKSB7CiAgICAgICAgaWYgKGYgPCByKSBkbyBGKGUsIGwsIGUuYmxfdHJlZSk7CiAgICAgICAgd2hpbGUgKC0tZiAhPT0gMCkKICAgICAgICBlbHNlIGwgIT09IDAgPyAobCAhPT0gYSAmJiAoRihlLCBsLCBlLmJsX3RyZWUpLCBmLS0pLCBGKGUsIGxpLCBlLmJsX3RyZWUpLCBOMShlLCBmIC0gMywgMikpIDogZiA8PSAxMCA/IChGKGUsIHJpLCBlLmJsX3RyZWUpLCBOMShlLCBmIC0gMywgMykpIDogKEYoZSwgZmksIGUuYmxfdHJlZSksIE4xKGUsIGYgLSAxMSwgNykpOwogICAgICAgIGYgPSAwLCBhID0gbCwgbyA9PT0gMCA/IChjID0gMTM4LCByID0gMykgOiBsID09PSBvID8gKGMgPSA2LCByID0gMykgOiAoYyA9IDcsIHIgPSA0KTsKICAgIH0KfSwgamkgPSAoZSk9PnsKICAgIGxldCBpOwogICAgZm9yKHZ0KGUsIGUuZHluX2x0cmVlLCBlLmxfZGVzYy5tYXhfY29kZSksIHZ0KGUsIGUuZHluX2R0cmVlLCBlLmRfZGVzYy5tYXhfY29kZSksIG90KGUsIGUuYmxfZGVzYyksIGkgPSBzdCAtIDE7IGkgPj0gMyAmJiBlLmJsX3RyZWVbb2lbaV0gKiAyICsgMV0gPT09IDA7IGktLSk7CiAgICByZXR1cm4gZS5vcHRfbGVuICs9IDMgKiAoaSArIDEpICsgNSArIDUgKyA0LCBpOwp9LCBXaSA9IChlLCBpLCB0LCBuKT0+ewogICAgbGV0IGE7CiAgICBmb3IoTjEoZSwgaSAtIDI1NywgNSksIE4xKGUsIHQgLSAxLCA1KSwgTjEoZSwgbiAtIDQsIDQpLCBhID0gMDsgYSA8IG47IGErKylOMShlLCBlLmJsX3RyZWVbb2lbYV0gKiAyICsgMV0sIDMpOwogICAgRXQoZSwgZS5keW5fbHRyZWUsIGkgLSAxKSwgRXQoZSwgZS5keW5fZHRyZWUsIHQgLSAxKTsKfSwgVmkgPSAoZSk9PnsKICAgIGxldCBpID0gNDA5MzYyNDQ0NywgdDsKICAgIGZvcih0ID0gMDsgdCA8PSAzMTsgdCsrLCBpID4+Pj0gMSlpZiAoaSAmIDEgJiYgZS5keW5fbHRyZWVbdCAqIDJdICE9PSAwKSByZXR1cm4gMDsKICAgIGlmIChlLmR5bl9sdHJlZVs5ICogMl0gIT09IDAgfHwgZS5keW5fbHRyZWVbMTAgKiAyXSAhPT0gMCB8fCBlLmR5bl9sdHJlZVsxMyAqIDJdICE9PSAwKSByZXR1cm4gMTsKICAgIGZvcih0ID0gMzI7IHQgPCBBZTsgdCsrKWlmIChlLmR5bl9sdHJlZVt0ICogMl0gIT09IDApIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cn0sIHl0ID0gITEsIEppID0gKGUpPT57CiAgICB5dCB8fCAoWWkoKSwgeXQgPSAhMCksIGUubF9kZXNjID0gbmV3IFdlKGUuZHluX2x0cmVlLCBfaSksIGUuZF9kZXNjID0gbmV3IFdlKGUuZHluX2R0cmVlLCBoaSksIGUuYmxfZGVzYyA9IG5ldyBXZShlLmJsX3RyZWUsIGRpKSwgZS5iaV9idWYgPSAwLCBlLmJpX3ZhbGlkID0gMCwgYmkoZSk7Cn0sIGdpID0gKGUsIGksIHQsIG4pPT57CiAgICBOMShlLCAoJGkgPDwgMSkgKyAobiA/IDEgOiAwKSwgMyksIEdpKGUsIGksIHQsICEwKTsKfSwgUWkgPSAoZSk9PnsKICAgIE4xKGUsIGFpIDw8IDEsIDMpLCBGKGUsIGN0LCBCKSwgUGkoZSk7Cn0sIHFpID0gKGUsIGksIHQsIG4pPT57CiAgICBsZXQgYSwgbCwgbyA9IDA7CiAgICBlLmxldmVsID4gMCA/IChlLnN0cm0uZGF0YV90eXBlID09PSAyICYmIChlLnN0cm0uZGF0YV90eXBlID0gVmkoZSkpLCBvdChlLCBlLmxfZGVzYyksIG90KGUsIGUuZF9kZXNjKSwgbyA9IGppKGUpLCBhID0gZS5vcHRfbGVuICsgMyArIDcgPj4+IDMsIGwgPSBlLnN0YXRpY19sZW4gKyAzICsgNyA+Pj4gMywgbCA8PSBhICYmIChhID0gbCkpIDogYSA9IGwgPSB0ICsgNSwgdCArIDQgPD0gYSAmJiBpICE9PSAtMSA/IGdpKGUsIGksIHQsIG4pIDogZS5zdHJhdGVneSA9PT0gNCB8fCBsID09PSBhID8gKE4xKGUsIChhaSA8PCAxKSArIChuID8gMSA6IDApLCAzKSwga3QoZSwgQiwgdWUpKSA6IChOMShlLCAoQ2kgPDwgMSkgKyAobiA/IDEgOiAwKSwgMyksIFdpKGUsIGUubF9kZXNjLm1heF9jb2RlICsgMSwgZS5kX2Rlc2MubWF4X2NvZGUgKyAxLCBvICsgMSksIGt0KGUsIGUuZHluX2x0cmVlLCBlLmR5bl9kdHJlZSkpLCBiaShlKSwgbiAmJiB3aShlKTsKfSwgZWEgPSAoZSwgaSwgdCk9PihlLnBlbmRpbmdfYnVmW2UuZF9idWYgKyBlLmxhc3RfbGl0ICogMl0gPSBpID4+PiA4ICYgMjU1LCBlLnBlbmRpbmdfYnVmW2UuZF9idWYgKyBlLmxhc3RfbGl0ICogMiArIDFdID0gaSAmIDI1NSwgZS5wZW5kaW5nX2J1ZltlLmxfYnVmICsgZS5sYXN0X2xpdF0gPSB0ICYgMjU1LCBlLmxhc3RfbGl0KyssIGkgPT09IDAgPyBlLmR5bl9sdHJlZVt0ICogMl0rKyA6IChlLm1hdGNoZXMrKywgaS0tLCBlLmR5bl9sdHJlZVsoeGVbdF0gKyBBZSArIDEpICogMl0rKywgZS5keW5fZHRyZWVbc2koaSkgKiAyXSsrKSwgZS5sYXN0X2xpdCA9PT0gZS5saXRfYnVmc2l6ZSAtIDEpLCB0YSA9IEppLCBpYSA9IGdpLCBhYSA9IHFpLCBuYSA9IGVhLCBsYSA9IFFpLCByYSA9IHsKICAgIF90cl9pbml0OiB0YSwKICAgIF90cl9zdG9yZWRfYmxvY2s6IGlhLAogICAgX3RyX2ZsdXNoX2Jsb2NrOiBhYSwKICAgIF90cl90YWxseTogbmEsCiAgICBfdHJfYWxpZ246IGxhCn0sIGZhID0gKGUsIGksIHQsIG4pPT57CiAgICBsZXQgYSA9IGUgJiA2NTUzNSB8IDAsIGwgPSBlID4+PiAxNiAmIDY1NTM1IHwgMCwgbyA9IDA7CiAgICBmb3IoOyB0ICE9PSAwOyl7CiAgICAgICAgbyA9IHQgPiAyZTMgPyAyZTMgOiB0LCB0IC09IG87CiAgICAgICAgZG8gYSA9IGEgKyBpW24rK10gfCAwLCBsID0gbCArIGEgfCAwOwogICAgICAgIHdoaWxlICgtLW8pCiAgICAgICAgYSAlPSA2NTUyMSwgbCAlPSA2NTUyMTsKICAgIH0KICAgIHJldHVybiBhIHwgbCA8PCAxNiB8IDA7Cn0sIHZlID0gZmEsIG9hID0gKCk9PnsKICAgIGxldCBlLCBpID0gW107CiAgICBmb3IodmFyIHQgPSAwOyB0IDwgMjU2OyB0KyspewogICAgICAgIGUgPSB0OwogICAgICAgIGZvcih2YXIgbiA9IDA7IG4gPCA4OyBuKyspZSA9IGUgJiAxID8gMzk4ODI5MjM4NCBeIGUgPj4+IDEgOiBlID4+PiAxOwogICAgICAgIGlbdF0gPSBlOwogICAgfQogICAgcmV0dXJuIGk7Cn0sIF9hID0gbmV3IFVpbnQzMkFycmF5KG9hKCkpLCBoYSA9IChlLCBpLCB0LCBuKT0+ewogICAgbGV0IGEgPSBfYSwgbCA9IG4gKyB0OwogICAgZSBePSAtMTsKICAgIGZvcihsZXQgbyA9IG47IG8gPCBsOyBvKyspZSA9IGUgPj4+IDggXiBhWyhlIF4gaVtvXSkgJiAyNTVdOwogICAgcmV0dXJuIGUgXiAtMTsKfSwgSSA9IGhhLCBlZSA9IHsKICAgIDI6ICJuZWVkIGRpY3Rpb25hcnkiLAogICAgMTogInN0cmVhbSBlbmQiLAogICAgMDogIiIsCiAgICAiLTEiOiAiZmlsZSBlcnJvciIsCiAgICAiLTIiOiAic3RyZWFtIGVycm9yIiwKICAgICItMyI6ICJkYXRhIGVycm9yIiwKICAgICItNCI6ICJpbnN1ZmZpY2llbnQgbWVtb3J5IiwKICAgICItNSI6ICJidWZmZXIgZXJyb3IiLAogICAgIi02IjogImluY29tcGF0aWJsZSB2ZXJzaW9uIgp9LCBuZSA9IHsKICAgIFpfTk9fRkxVU0g6IDAsCiAgICBaX1BBUlRJQUxfRkxVU0g6IDEsCiAgICBaX1NZTkNfRkxVU0g6IDIsCiAgICBaX0ZVTExfRkxVU0g6IDMsCiAgICBaX0ZJTklTSDogNCwKICAgIFpfQkxPQ0s6IDUsCiAgICBaX1RSRUVTOiA2LAogICAgWl9PSzogMCwKICAgIFpfU1RSRUFNX0VORDogMSwKICAgIFpfTkVFRF9ESUNUOiAyLAogICAgWl9FUlJOTzogLTEsCiAgICBaX1NUUkVBTV9FUlJPUjogLTIsCiAgICBaX0RBVEFfRVJST1I6IC0zLAogICAgWl9NRU1fRVJST1I6IC00LAogICAgWl9CVUZfRVJST1I6IC01LAogICAgWl9OT19DT01QUkVTU0lPTjogMCwKICAgIFpfQkVTVF9TUEVFRDogMSwKICAgIFpfQkVTVF9DT01QUkVTU0lPTjogOSwKICAgIFpfREVGQVVMVF9DT01QUkVTU0lPTjogLTEsCiAgICBaX0ZJTFRFUkVEOiAxLAogICAgWl9IVUZGTUFOX09OTFk6IDIsCiAgICBaX1JMRTogMywKICAgIFpfRklYRUQ6IDQsCiAgICBaX0RFRkFVTFRfU1RSQVRFR1k6IDAsCiAgICBaX0JJTkFSWTogMCwKICAgIFpfVEVYVDogMSwKICAgIFpfVU5LTk9XTjogMiwKICAgIFpfREVGTEFURUQ6IDgKfSwgeyBfdHJfaW5pdDogZGEgLCBfdHJfc3RvcmVkX2Jsb2NrOiBzYSAsIF90cl9mbHVzaF9ibG9jazogY2EgLCBfdHJfdGFsbHk6IGogLCBfdHJfYWxpZ246IHVhICB9ID0gcmEsIHsgWl9OT19GTFVTSDogbGUgLCBaX1BBUlRJQUxfRkxVU0g6IGJhICwgWl9GVUxMX0ZMVVNIOiB3YSAsIFpfRklOSVNIOiBXICwgWl9CTE9DSzogU3QgLCBaX09LOiBNICwgWl9TVFJFQU1fRU5EOiBBdCAsIFpfU1RSRUFNX0VSUk9SOiBMMSAsIFpfREFUQV9FUlJPUjogZ2EgLCBaX0JVRl9FUlJPUjogSmUgLCBaX0RFRkFVTFRfQ09NUFJFU1NJT046IHBhICwgWl9GSUxURVJFRDogeGEgLCBaX0hVRkZNQU5fT05MWTogSWUgLCBaX1JMRToga2EgLCBaX0ZJWEVEOiB2YSAsIFpfREVGQVVMVF9TVFJBVEVHWTogRWEgLCBaX1VOS05PV046IHlhICwgWl9ERUZMQVRFRDogUGUgIH0gPSBuZSwgU2EgPSA5LCBBYSA9IDE1LCBSYSA9IDgsIHphID0gMjksIFRhID0gMjU2LCBfdCA9IFRhICsgMSArIHphLCBtYSA9IDMwLCBEYSA9IDE5LCBaYSA9IDIgKiBfdCArIDEsIElhID0gMTUsIGsxID0gMywgWSA9IDI1OCwgJCA9IFkgKyBrMSArIDEsIE9hID0gMzIsIFhlID0gNDIsIGh0ID0gNjksIENlID0gNzMsIEZlID0gOTEsIE1lID0gMTAzLCBxID0gMTEzLCBzZSA9IDY2NiwgRCA9IDEsIFJlID0gMiwgdGUgPSAzLCBoZSA9IDQsIE5hID0gMywgRyA9IChlLCBpKT0+KGUubXNnID0gZWVbaV0sIGkpLCBSdCA9IChlKT0+KGUgPDwgMSkgLSAoZSA+IDQgPyA5IDogMCksIFggPSAoZSk9PnsKICAgIGxldCBpID0gZS5sZW5ndGg7CiAgICBmb3IoOyAtLWkgPj0gMDspZVtpXSA9IDA7Cn0sIExhID0gKGUsIGksIHQpPT4oaSA8PCBlLmhhc2hfc2hpZnQgXiB0KSAmIGUuaGFzaF9tYXNrLCBWID0gTGEsIFAxID0gKGUpPT57CiAgICBsZXQgaSA9IGUuc3RhdGUsIHQgPSBpLnBlbmRpbmc7CiAgICB0ID4gZS5hdmFpbF9vdXQgJiYgKHQgPSBlLmF2YWlsX291dCksIHQgIT09IDAgJiYgKGUub3V0cHV0LnNldChpLnBlbmRpbmdfYnVmLnN1YmFycmF5KGkucGVuZGluZ19vdXQsIGkucGVuZGluZ19vdXQgKyB0KSwgZS5uZXh0X291dCksIGUubmV4dF9vdXQgKz0gdCwgaS5wZW5kaW5nX291dCArPSB0LCBlLnRvdGFsX291dCArPSB0LCBlLmF2YWlsX291dCAtPSB0LCBpLnBlbmRpbmcgLT0gdCwgaS5wZW5kaW5nID09PSAwICYmIChpLnBlbmRpbmdfb3V0ID0gMCkpOwp9LCBPMSA9IChlLCBpKT0+ewogICAgY2EoZSwgZS5ibG9ja19zdGFydCA+PSAwID8gZS5ibG9ja19zdGFydCA6IC0xLCBlLnN0cnN0YXJ0IC0gZS5ibG9ja19zdGFydCwgaSksIGUuYmxvY2tfc3RhcnQgPSBlLnN0cnN0YXJ0LCBQMShlLnN0cm0pOwp9LCB5ID0gKGUsIGkpPT57CiAgICBlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXSA9IGk7Cn0sIGRlID0gKGUsIGkpPT57CiAgICBlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXSA9IGkgPj4+IDggJiAyNTUsIGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdID0gaSAmIDI1NTsKfSwgVWEgPSAoZSwgaSwgdCwgbik9PnsKICAgIGxldCBhID0gZS5hdmFpbF9pbjsKICAgIHJldHVybiBhID4gbiAmJiAoYSA9IG4pLCBhID09PSAwID8gMCA6IChlLmF2YWlsX2luIC09IGEsIGkuc2V0KGUuaW5wdXQuc3ViYXJyYXkoZS5uZXh0X2luLCBlLm5leHRfaW4gKyBhKSwgdCksIGUuc3RhdGUud3JhcCA9PT0gMSA/IGUuYWRsZXIgPSB2ZShlLmFkbGVyLCBpLCBhLCB0KSA6IGUuc3RhdGUud3JhcCA9PT0gMiAmJiAoZS5hZGxlciA9IEkoZS5hZGxlciwgaSwgYSwgdCkpLCBlLm5leHRfaW4gKz0gYSwgZS50b3RhbF9pbiArPSBhLCBhKTsKfSwgcGkgPSAoZSwgaSk9PnsKICAgIGxldCB0ID0gZS5tYXhfY2hhaW5fbGVuZ3RoLCBuID0gZS5zdHJzdGFydCwgYSwgbCwgbyA9IGUucHJldl9sZW5ndGgsIGYgPSBlLm5pY2VfbWF0Y2gsIGMgPSBlLnN0cnN0YXJ0ID4gZS53X3NpemUgLSAkID8gZS5zdHJzdGFydCAtIChlLndfc2l6ZSAtICQpIDogMCwgciA9IGUud2luZG93LCBfID0gZS53X21hc2ssIEUgPSBlLnByZXYsIHMgPSBlLnN0cnN0YXJ0ICsgWSwgaCA9IHJbbiArIG8gLSAxXSwgdSA9IHJbbiArIG9dOwogICAgZS5wcmV2X2xlbmd0aCA+PSBlLmdvb2RfbWF0Y2ggJiYgKHQgPj49IDIpLCBmID4gZS5sb29rYWhlYWQgJiYgKGYgPSBlLmxvb2thaGVhZCk7CiAgICBkbyBpZiAoYSA9IGksICEoclthICsgb10gIT09IHUgfHwgclthICsgbyAtIDFdICE9PSBoIHx8IHJbYV0gIT09IHJbbl0gfHwgclsrK2FdICE9PSByW24gKyAxXSkpIHsKICAgICAgICBuICs9IDIsIGErKzsKICAgICAgICBkbyA7CiAgICAgICAgd2hpbGUgKHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIHJbKytuXSA9PT0gclsrK2FdICYmIG4gPCBzKQogICAgICAgIGlmIChsID0gWSAtIChzIC0gbiksIG4gPSBzIC0gWSwgbCA+IG8pIHsKICAgICAgICAgICAgaWYgKGUubWF0Y2hfc3RhcnQgPSBpLCBvID0gbCwgbCA+PSBmKSBicmVhazsKICAgICAgICAgICAgaCA9IHJbbiArIG8gLSAxXSwgdSA9IHJbbiArIG9dOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlICgoaSA9IEVbaSAmIF9dKSA+IGMgJiYgLS10ICE9PSAwKQogICAgcmV0dXJuIG8gPD0gZS5sb29rYWhlYWQgPyBvIDogZS5sb29rYWhlYWQ7Cn0sIGllID0gKGUpPT57CiAgICBsZXQgaSA9IGUud19zaXplLCB0LCBuLCBhLCBsLCBvOwogICAgZG8gewogICAgICAgIGlmIChsID0gZS53aW5kb3dfc2l6ZSAtIGUubG9va2FoZWFkIC0gZS5zdHJzdGFydCwgZS5zdHJzdGFydCA+PSBpICsgKGkgLSAkKSkgewogICAgICAgICAgICBlLndpbmRvdy5zZXQoZS53aW5kb3cuc3ViYXJyYXkoaSwgaSArIGkpLCAwKSwgZS5tYXRjaF9zdGFydCAtPSBpLCBlLnN0cnN0YXJ0IC09IGksIGUuYmxvY2tfc3RhcnQgLT0gaSwgbiA9IGUuaGFzaF9zaXplLCB0ID0gbjsKICAgICAgICAgICAgZG8gYSA9IGUuaGVhZFstLXRdLCBlLmhlYWRbdF0gPSBhID49IGkgPyBhIC0gaSA6IDA7CiAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgIG4gPSBpLCB0ID0gbjsKICAgICAgICAgICAgZG8gYSA9IGUucHJldlstLXRdLCBlLnByZXZbdF0gPSBhID49IGkgPyBhIC0gaSA6IDA7CiAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgIGwgKz0gaTsKICAgICAgICB9CiAgICAgICAgaWYgKGUuc3RybS5hdmFpbF9pbiA9PT0gMCkgYnJlYWs7CiAgICAgICAgaWYgKG4gPSBVYShlLnN0cm0sIGUud2luZG93LCBlLnN0cnN0YXJ0ICsgZS5sb29rYWhlYWQsIGwpLCBlLmxvb2thaGVhZCArPSBuLCBlLmxvb2thaGVhZCArIGUuaW5zZXJ0ID49IGsxKSBmb3IobyA9IGUuc3Ryc3RhcnQgLSBlLmluc2VydCwgZS5pbnNfaCA9IGUud2luZG93W29dLCBlLmluc19oID0gVihlLCBlLmluc19oLCBlLndpbmRvd1tvICsgMV0pOyBlLmluc2VydCAmJiAoZS5pbnNfaCA9IFYoZSwgZS5pbnNfaCwgZS53aW5kb3dbbyArIGsxIC0gMV0pLCBlLnByZXZbbyAmIGUud19tYXNrXSA9IGUuaGVhZFtlLmluc19oXSwgZS5oZWFkW2UuaW5zX2hdID0gbywgbysrLCBlLmluc2VydC0tLCAhKGUubG9va2FoZWFkICsgZS5pbnNlcnQgPCBrMSkpOyk7CiAgICB9d2hpbGUgKGUubG9va2FoZWFkIDwgJCAmJiBlLnN0cm0uYXZhaWxfaW4gIT09IDApCn0sICRhID0gKGUsIGkpPT57CiAgICBsZXQgdCA9IDY1NTM1OwogICAgZm9yKHQgPiBlLnBlbmRpbmdfYnVmX3NpemUgLSA1ICYmICh0ID0gZS5wZW5kaW5nX2J1Zl9zaXplIC0gNSk7Oyl7CiAgICAgICAgaWYgKGUubG9va2FoZWFkIDw9IDEpIHsKICAgICAgICAgICAgaWYgKGllKGUpLCBlLmxvb2thaGVhZCA9PT0gMCAmJiBpID09PSBsZSkgcmV0dXJuIEQ7CiAgICAgICAgICAgIGlmIChlLmxvb2thaGVhZCA9PT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGUuc3Ryc3RhcnQgKz0gZS5sb29rYWhlYWQsIGUubG9va2FoZWFkID0gMDsKICAgICAgICBsZXQgbiA9IGUuYmxvY2tfc3RhcnQgKyB0OwogICAgICAgIGlmICgoZS5zdHJzdGFydCA9PT0gMCB8fCBlLnN0cnN0YXJ0ID49IG4pICYmIChlLmxvb2thaGVhZCA9IGUuc3Ryc3RhcnQgLSBuLCBlLnN0cnN0YXJ0ID0gbiwgTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB8fCBlLnN0cnN0YXJ0IC0gZS5ibG9ja19zdGFydCA+PSBlLndfc2l6ZSAtICQgJiYgKE8xKGUsICExKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCkpIHJldHVybiBEOwogICAgfQogICAgcmV0dXJuIGUuaW5zZXJ0ID0gMCwgaSA9PT0gVyA/IChPMShlLCAhMCksIGUuc3RybS5hdmFpbF9vdXQgPT09IDAgPyB0ZSA6IGhlKSA6IChlLnN0cnN0YXJ0ID4gZS5ibG9ja19zdGFydCAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSwgRCk7Cn0sIFFlID0gKGUsIGkpPT57CiAgICBsZXQgdCwgbjsKICAgIGZvcig7Oyl7CiAgICAgICAgaWYgKGUubG9va2FoZWFkIDwgJCkgewogICAgICAgICAgICBpZiAoaWUoZSksIGUubG9va2FoZWFkIDwgJCAmJiBpID09PSBsZSkgcmV0dXJuIEQ7CiAgICAgICAgICAgIGlmIChlLmxvb2thaGVhZCA9PT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0ID0gMCwgZS5sb29rYWhlYWQgPj0gazEgJiYgKGUuaW5zX2ggPSBWKGUsIGUuaW5zX2gsIGUud2luZG93W2Uuc3Ryc3RhcnQgKyBrMSAtIDFdKSwgdCA9IGUucHJldltlLnN0cnN0YXJ0ICYgZS53X21hc2tdID0gZS5oZWFkW2UuaW5zX2hdLCBlLmhlYWRbZS5pbnNfaF0gPSBlLnN0cnN0YXJ0KSwgdCAhPT0gMCAmJiBlLnN0cnN0YXJ0IC0gdCA8PSBlLndfc2l6ZSAtICQgJiYgKGUubWF0Y2hfbGVuZ3RoID0gcGkoZSwgdCkpLCBlLm1hdGNoX2xlbmd0aCA+PSBrMSkgaWYgKG4gPSBqKGUsIGUuc3Ryc3RhcnQgLSBlLm1hdGNoX3N0YXJ0LCBlLm1hdGNoX2xlbmd0aCAtIGsxKSwgZS5sb29rYWhlYWQgLT0gZS5tYXRjaF9sZW5ndGgsIGUubWF0Y2hfbGVuZ3RoIDw9IGUubWF4X2xhenlfbWF0Y2ggJiYgZS5sb29rYWhlYWQgPj0gazEpIHsKICAgICAgICAgICAgZS5tYXRjaF9sZW5ndGgtLTsKICAgICAgICAgICAgZG8gZS5zdHJzdGFydCsrLCBlLmluc19oID0gVihlLCBlLmluc19oLCBlLndpbmRvd1tlLnN0cnN0YXJ0ICsgazEgLSAxXSksIHQgPSBlLnByZXZbZS5zdHJzdGFydCAmIGUud19tYXNrXSA9IGUuaGVhZFtlLmluc19oXSwgZS5oZWFkW2UuaW5zX2hdID0gZS5zdHJzdGFydDsKICAgICAgICAgICAgd2hpbGUgKC0tZS5tYXRjaF9sZW5ndGggIT09IDApCiAgICAgICAgICAgIGUuc3Ryc3RhcnQrKzsKICAgICAgICB9IGVsc2UgZS5zdHJzdGFydCArPSBlLm1hdGNoX2xlbmd0aCwgZS5tYXRjaF9sZW5ndGggPSAwLCBlLmluc19oID0gZS53aW5kb3dbZS5zdHJzdGFydF0sIGUuaW5zX2ggPSBWKGUsIGUuaW5zX2gsIGUud2luZG93W2Uuc3Ryc3RhcnQgKyAxXSk7CiAgICAgICAgZWxzZSBuID0gaihlLCAwLCBlLndpbmRvd1tlLnN0cnN0YXJ0XSksIGUubG9va2FoZWFkLS0sIGUuc3Ryc3RhcnQrKzsKICAgICAgICBpZiAobiAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSkgcmV0dXJuIEQ7CiAgICB9CiAgICByZXR1cm4gZS5pbnNlcnQgPSBlLnN0cnN0YXJ0IDwgazEgLSAxID8gZS5zdHJzdGFydCA6IGsxIC0gMSwgaSA9PT0gVyA/IChPMShlLCAhMCksIGUuc3RybS5hdmFpbF9vdXQgPT09IDAgPyB0ZSA6IGhlKSA6IGUubGFzdF9saXQgJiYgKE8xKGUsICExKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCkgPyBEIDogUmU7Cn0sIHJlID0gKGUsIGkpPT57CiAgICBsZXQgdCwgbiwgYTsKICAgIGZvcig7Oyl7CiAgICAgICAgaWYgKGUubG9va2FoZWFkIDwgJCkgewogICAgICAgICAgICBpZiAoaWUoZSksIGUubG9va2FoZWFkIDwgJCAmJiBpID09PSBsZSkgcmV0dXJuIEQ7CiAgICAgICAgICAgIGlmIChlLmxvb2thaGVhZCA9PT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0ID0gMCwgZS5sb29rYWhlYWQgPj0gazEgJiYgKGUuaW5zX2ggPSBWKGUsIGUuaW5zX2gsIGUud2luZG93W2Uuc3Ryc3RhcnQgKyBrMSAtIDFdKSwgdCA9IGUucHJldltlLnN0cnN0YXJ0ICYgZS53X21hc2tdID0gZS5oZWFkW2UuaW5zX2hdLCBlLmhlYWRbZS5pbnNfaF0gPSBlLnN0cnN0YXJ0KSwgZS5wcmV2X2xlbmd0aCA9IGUubWF0Y2hfbGVuZ3RoLCBlLnByZXZfbWF0Y2ggPSBlLm1hdGNoX3N0YXJ0LCBlLm1hdGNoX2xlbmd0aCA9IGsxIC0gMSwgdCAhPT0gMCAmJiBlLnByZXZfbGVuZ3RoIDwgZS5tYXhfbGF6eV9tYXRjaCAmJiBlLnN0cnN0YXJ0IC0gdCA8PSBlLndfc2l6ZSAtICQgJiYgKGUubWF0Y2hfbGVuZ3RoID0gcGkoZSwgdCksIGUubWF0Y2hfbGVuZ3RoIDw9IDUgJiYgKGUuc3RyYXRlZ3kgPT09IHhhIHx8IGUubWF0Y2hfbGVuZ3RoID09PSBrMSAmJiBlLnN0cnN0YXJ0IC0gZS5tYXRjaF9zdGFydCA+IDQwOTYpICYmIChlLm1hdGNoX2xlbmd0aCA9IGsxIC0gMSkpLCBlLnByZXZfbGVuZ3RoID49IGsxICYmIGUubWF0Y2hfbGVuZ3RoIDw9IGUucHJldl9sZW5ndGgpIHsKICAgICAgICAgICAgYSA9IGUuc3Ryc3RhcnQgKyBlLmxvb2thaGVhZCAtIGsxLCBuID0gaihlLCBlLnN0cnN0YXJ0IC0gMSAtIGUucHJldl9tYXRjaCwgZS5wcmV2X2xlbmd0aCAtIGsxKSwgZS5sb29rYWhlYWQgLT0gZS5wcmV2X2xlbmd0aCAtIDEsIGUucHJldl9sZW5ndGggLT0gMjsKICAgICAgICAgICAgZG8gKytlLnN0cnN0YXJ0IDw9IGEgJiYgKGUuaW5zX2ggPSBWKGUsIGUuaW5zX2gsIGUud2luZG93W2Uuc3Ryc3RhcnQgKyBrMSAtIDFdKSwgdCA9IGUucHJldltlLnN0cnN0YXJ0ICYgZS53X21hc2tdID0gZS5oZWFkW2UuaW5zX2hdLCBlLmhlYWRbZS5pbnNfaF0gPSBlLnN0cnN0YXJ0KTsKICAgICAgICAgICAgd2hpbGUgKC0tZS5wcmV2X2xlbmd0aCAhPT0gMCkKICAgICAgICAgICAgaWYgKGUubWF0Y2hfYXZhaWxhYmxlID0gMCwgZS5tYXRjaF9sZW5ndGggPSBrMSAtIDEsIGUuc3Ryc3RhcnQrKywgbiAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSkgcmV0dXJuIEQ7CiAgICAgICAgfSBlbHNlIGlmIChlLm1hdGNoX2F2YWlsYWJsZSkgewogICAgICAgICAgICBpZiAobiA9IGooZSwgMCwgZS53aW5kb3dbZS5zdHJzdGFydCAtIDFdKSwgbiAmJiBPMShlLCAhMSksIGUuc3Ryc3RhcnQrKywgZS5sb29rYWhlYWQtLSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCkgcmV0dXJuIEQ7CiAgICAgICAgfSBlbHNlIGUubWF0Y2hfYXZhaWxhYmxlID0gMSwgZS5zdHJzdGFydCsrLCBlLmxvb2thaGVhZC0tOwogICAgfQogICAgcmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlICYmIChuID0gaihlLCAwLCBlLndpbmRvd1tlLnN0cnN0YXJ0IC0gMV0pLCBlLm1hdGNoX2F2YWlsYWJsZSA9IDApLCBlLmluc2VydCA9IGUuc3Ryc3RhcnQgPCBrMSAtIDEgPyBlLnN0cnN0YXJ0IDogazEgLSAxLCBpID09PSBXID8gKE8xKGUsICEwKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCA/IHRlIDogaGUpIDogZS5sYXN0X2xpdCAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IEQgOiBSZTsKfSwgQ2EgPSAoZSwgaSk9PnsKICAgIGxldCB0LCBuLCBhLCBsLCBvID0gZS53aW5kb3c7CiAgICBmb3IoOzspewogICAgICAgIGlmIChlLmxvb2thaGVhZCA8PSBZKSB7CiAgICAgICAgICAgIGlmIChpZShlKSwgZS5sb29rYWhlYWQgPD0gWSAmJiBpID09PSBsZSkgcmV0dXJuIEQ7CiAgICAgICAgICAgIGlmIChlLmxvb2thaGVhZCA9PT0gMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChlLm1hdGNoX2xlbmd0aCA9IDAsIGUubG9va2FoZWFkID49IGsxICYmIGUuc3Ryc3RhcnQgPiAwICYmIChhID0gZS5zdHJzdGFydCAtIDEsIG4gPSBvW2FdLCBuID09PSBvWysrYV0gJiYgbiA9PT0gb1srK2FdICYmIG4gPT09IG9bKythXSkpIHsKICAgICAgICAgICAgbCA9IGUuc3Ryc3RhcnQgKyBZOwogICAgICAgICAgICBkbyA7CiAgICAgICAgICAgIHdoaWxlIChuID09PSBvWysrYV0gJiYgbiA9PT0gb1srK2FdICYmIG4gPT09IG9bKythXSAmJiBuID09PSBvWysrYV0gJiYgbiA9PT0gb1srK2FdICYmIG4gPT09IG9bKythXSAmJiBuID09PSBvWysrYV0gJiYgbiA9PT0gb1srK2FdICYmIGEgPCBsKQogICAgICAgICAgICBlLm1hdGNoX2xlbmd0aCA9IFkgLSAobCAtIGEpLCBlLm1hdGNoX2xlbmd0aCA+IGUubG9va2FoZWFkICYmIChlLm1hdGNoX2xlbmd0aCA9IGUubG9va2FoZWFkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGUubWF0Y2hfbGVuZ3RoID49IGsxID8gKHQgPSBqKGUsIDEsIGUubWF0Y2hfbGVuZ3RoIC0gazEpLCBlLmxvb2thaGVhZCAtPSBlLm1hdGNoX2xlbmd0aCwgZS5zdHJzdGFydCArPSBlLm1hdGNoX2xlbmd0aCwgZS5tYXRjaF9sZW5ndGggPSAwKSA6ICh0ID0gaihlLCAwLCBlLndpbmRvd1tlLnN0cnN0YXJ0XSksIGUubG9va2FoZWFkLS0sIGUuc3Ryc3RhcnQrKyksIHQgJiYgKE8xKGUsICExKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCkpIHJldHVybiBEOwogICAgfQogICAgcmV0dXJuIGUuaW5zZXJ0ID0gMCwgaSA9PT0gVyA/IChPMShlLCAhMCksIGUuc3RybS5hdmFpbF9vdXQgPT09IDAgPyB0ZSA6IGhlKSA6IGUubGFzdF9saXQgJiYgKE8xKGUsICExKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCkgPyBEIDogUmU7Cn0sIEZhID0gKGUsIGkpPT57CiAgICBsZXQgdDsKICAgIGZvcig7Oyl7CiAgICAgICAgaWYgKGUubG9va2FoZWFkID09PSAwICYmIChpZShlKSwgZS5sb29rYWhlYWQgPT09IDApKSB7CiAgICAgICAgICAgIGlmIChpID09PSBsZSkgcmV0dXJuIEQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZS5tYXRjaF9sZW5ndGggPSAwLCB0ID0gaihlLCAwLCBlLndpbmRvd1tlLnN0cnN0YXJ0XSksIGUubG9va2FoZWFkLS0sIGUuc3Ryc3RhcnQrKywgdCAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSkgcmV0dXJuIEQ7CiAgICB9CiAgICByZXR1cm4gZS5pbnNlcnQgPSAwLCBpID09PSBXID8gKE8xKGUsICEwKSwgZS5zdHJtLmF2YWlsX291dCA9PT0gMCA/IHRlIDogaGUpIDogZS5sYXN0X2xpdCAmJiAoTzEoZSwgITEpLCBlLnN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IEQgOiBSZTsKfTsKZnVuY3Rpb24gQzEoZSwgaSwgdCwgbiwgYSkgewogICAgdGhpcy5nb29kX2xlbmd0aCA9IGUsIHRoaXMubWF4X2xhenkgPSBpLCB0aGlzLm5pY2VfbGVuZ3RoID0gdCwgdGhpcy5tYXhfY2hhaW4gPSBuLCB0aGlzLmZ1bmMgPSBhOwp9CnZhciBjZSA9IFsKICAgIG5ldyBDMSgwLCAwLCAwLCAwLCAkYSksCiAgICBuZXcgQzEoNCwgNCwgOCwgNCwgUWUpLAogICAgbmV3IEMxKDQsIDUsIDE2LCA4LCBRZSksCiAgICBuZXcgQzEoNCwgNiwgMzIsIDMyLCBRZSksCiAgICBuZXcgQzEoNCwgNCwgMTYsIDE2LCByZSksCiAgICBuZXcgQzEoOCwgMTYsIDMyLCAzMiwgcmUpLAogICAgbmV3IEMxKDgsIDE2LCAxMjgsIDEyOCwgcmUpLAogICAgbmV3IEMxKDgsIDMyLCAxMjgsIDI1NiwgcmUpLAogICAgbmV3IEMxKDMyLCAxMjgsIDI1OCwgMTAyNCwgcmUpLAogICAgbmV3IEMxKDMyLCAyNTgsIDI1OCwgNDA5NiwgcmUpCl0sIE1hID0gKGUpPT57CiAgICBlLndpbmRvd19zaXplID0gMiAqIGUud19zaXplLCBYKGUuaGVhZCksIGUubWF4X2xhenlfbWF0Y2ggPSBjZVtlLmxldmVsXS5tYXhfbGF6eSwgZS5nb29kX21hdGNoID0gY2VbZS5sZXZlbF0uZ29vZF9sZW5ndGgsIGUubmljZV9tYXRjaCA9IGNlW2UubGV2ZWxdLm5pY2VfbGVuZ3RoLCBlLm1heF9jaGFpbl9sZW5ndGggPSBjZVtlLmxldmVsXS5tYXhfY2hhaW4sIGUuc3Ryc3RhcnQgPSAwLCBlLmJsb2NrX3N0YXJ0ID0gMCwgZS5sb29rYWhlYWQgPSAwLCBlLmluc2VydCA9IDAsIGUubWF0Y2hfbGVuZ3RoID0gZS5wcmV2X2xlbmd0aCA9IGsxIC0gMSwgZS5tYXRjaF9hdmFpbGFibGUgPSAwLCBlLmluc19oID0gMDsKfTsKZnVuY3Rpb24gSGEoKSB7CiAgICB0aGlzLnN0cm0gPSBudWxsLCB0aGlzLnN0YXR1cyA9IDAsIHRoaXMucGVuZGluZ19idWYgPSBudWxsLCB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwLCB0aGlzLnBlbmRpbmdfb3V0ID0gMCwgdGhpcy5wZW5kaW5nID0gMCwgdGhpcy53cmFwID0gMCwgdGhpcy5nemhlYWQgPSBudWxsLCB0aGlzLmd6aW5kZXggPSAwLCB0aGlzLm1ldGhvZCA9IFBlLCB0aGlzLmxhc3RfZmx1c2ggPSAtMSwgdGhpcy53X3NpemUgPSAwLCB0aGlzLndfYml0cyA9IDAsIHRoaXMud19tYXNrID0gMCwgdGhpcy53aW5kb3cgPSBudWxsLCB0aGlzLndpbmRvd19zaXplID0gMCwgdGhpcy5wcmV2ID0gbnVsbCwgdGhpcy5oZWFkID0gbnVsbCwgdGhpcy5pbnNfaCA9IDAsIHRoaXMuaGFzaF9zaXplID0gMCwgdGhpcy5oYXNoX2JpdHMgPSAwLCB0aGlzLmhhc2hfbWFzayA9IDAsIHRoaXMuaGFzaF9zaGlmdCA9IDAsIHRoaXMuYmxvY2tfc3RhcnQgPSAwLCB0aGlzLm1hdGNoX2xlbmd0aCA9IDAsIHRoaXMucHJldl9tYXRjaCA9IDAsIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMCwgdGhpcy5zdHJzdGFydCA9IDAsIHRoaXMubWF0Y2hfc3RhcnQgPSAwLCB0aGlzLmxvb2thaGVhZCA9IDAsIHRoaXMucHJldl9sZW5ndGggPSAwLCB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwLCB0aGlzLm1heF9sYXp5X21hdGNoID0gMCwgdGhpcy5sZXZlbCA9IDAsIHRoaXMuc3RyYXRlZ3kgPSAwLCB0aGlzLmdvb2RfbWF0Y2ggPSAwLCB0aGlzLm5pY2VfbWF0Y2ggPSAwLCB0aGlzLmR5bl9sdHJlZSA9IG5ldyBVaW50MTZBcnJheShaYSAqIDIpLCB0aGlzLmR5bl9kdHJlZSA9IG5ldyBVaW50MTZBcnJheSgoMiAqIG1hICsgMSkgKiAyKSwgdGhpcy5ibF90cmVlID0gbmV3IFVpbnQxNkFycmF5KCgyICogRGEgKyAxKSAqIDIpLCBYKHRoaXMuZHluX2x0cmVlKSwgWCh0aGlzLmR5bl9kdHJlZSksIFgodGhpcy5ibF90cmVlKSwgdGhpcy5sX2Rlc2MgPSBudWxsLCB0aGlzLmRfZGVzYyA9IG51bGwsIHRoaXMuYmxfZGVzYyA9IG51bGwsIHRoaXMuYmxfY291bnQgPSBuZXcgVWludDE2QXJyYXkoSWEgKyAxKSwgdGhpcy5oZWFwID0gbmV3IFVpbnQxNkFycmF5KDIgKiBfdCArIDEpLCBYKHRoaXMuaGVhcCksIHRoaXMuaGVhcF9sZW4gPSAwLCB0aGlzLmhlYXBfbWF4ID0gMCwgdGhpcy5kZXB0aCA9IG5ldyBVaW50MTZBcnJheSgyICogX3QgKyAxKSwgWCh0aGlzLmRlcHRoKSwgdGhpcy5sX2J1ZiA9IDAsIHRoaXMubGl0X2J1ZnNpemUgPSAwLCB0aGlzLmxhc3RfbGl0ID0gMCwgdGhpcy5kX2J1ZiA9IDAsIHRoaXMub3B0X2xlbiA9IDAsIHRoaXMuc3RhdGljX2xlbiA9IDAsIHRoaXMubWF0Y2hlcyA9IDAsIHRoaXMuaW5zZXJ0ID0gMCwgdGhpcy5iaV9idWYgPSAwLCB0aGlzLmJpX3ZhbGlkID0gMDsKfQp2YXIgeGkgPSAoZSk9PnsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSkgcmV0dXJuIEcoZSwgTDEpOwogICAgZS50b3RhbF9pbiA9IGUudG90YWxfb3V0ID0gMCwgZS5kYXRhX3R5cGUgPSB5YTsKICAgIGxldCBpID0gZS5zdGF0ZTsKICAgIHJldHVybiBpLnBlbmRpbmcgPSAwLCBpLnBlbmRpbmdfb3V0ID0gMCwgaS53cmFwIDwgMCAmJiAoaS53cmFwID0gLWkud3JhcCksIGkuc3RhdHVzID0gaS53cmFwID8gWGUgOiBxLCBlLmFkbGVyID0gaS53cmFwID09PSAyID8gMCA6IDEsIGkubGFzdF9mbHVzaCA9IGxlLCBkYShpKSwgTTsKfSwga2kgPSAoZSk9PnsKICAgIGxldCBpID0geGkoZSk7CiAgICByZXR1cm4gaSA9PT0gTSAmJiBNYShlLnN0YXRlKSwgaTsKfSwgQmEgPSAoZSwgaSk9PiFlIHx8ICFlLnN0YXRlIHx8IGUuc3RhdGUud3JhcCAhPT0gMiA/IEwxIDogKGUuc3RhdGUuZ3poZWFkID0gaSwgTSksIHZpID0gKGUsIGksIHQsIG4sIGEsIGwpPT57CiAgICBpZiAoIWUpIHJldHVybiBMMTsKICAgIGxldCBvID0gMTsKICAgIGlmIChpID09PSBwYSAmJiAoaSA9IDYpLCBuIDwgMCA/IChvID0gMCwgbiA9IC1uKSA6IG4gPiAxNSAmJiAobyA9IDIsIG4gLT0gMTYpLCBhIDwgMSB8fCBhID4gU2EgfHwgdCAhPT0gUGUgfHwgbiA8IDggfHwgbiA+IDE1IHx8IGkgPCAwIHx8IGkgPiA5IHx8IGwgPCAwIHx8IGwgPiB2YSkgcmV0dXJuIEcoZSwgTDEpOwogICAgbiA9PT0gOCAmJiAobiA9IDkpOwogICAgbGV0IGYgPSBuZXcgSGE7CiAgICByZXR1cm4gZS5zdGF0ZSA9IGYsIGYuc3RybSA9IGUsIGYud3JhcCA9IG8sIGYuZ3poZWFkID0gbnVsbCwgZi53X2JpdHMgPSBuLCBmLndfc2l6ZSA9IDEgPDwgZi53X2JpdHMsIGYud19tYXNrID0gZi53X3NpemUgLSAxLCBmLmhhc2hfYml0cyA9IGEgKyA3LCBmLmhhc2hfc2l6ZSA9IDEgPDwgZi5oYXNoX2JpdHMsIGYuaGFzaF9tYXNrID0gZi5oYXNoX3NpemUgLSAxLCBmLmhhc2hfc2hpZnQgPSB+figoZi5oYXNoX2JpdHMgKyBrMSAtIDEpIC8gazEpLCBmLndpbmRvdyA9IG5ldyBVaW50OEFycmF5KGYud19zaXplICogMiksIGYuaGVhZCA9IG5ldyBVaW50MTZBcnJheShmLmhhc2hfc2l6ZSksIGYucHJldiA9IG5ldyBVaW50MTZBcnJheShmLndfc2l6ZSksIGYubGl0X2J1ZnNpemUgPSAxIDw8IGEgKyA2LCBmLnBlbmRpbmdfYnVmX3NpemUgPSBmLmxpdF9idWZzaXplICogNCwgZi5wZW5kaW5nX2J1ZiA9IG5ldyBVaW50OEFycmF5KGYucGVuZGluZ19idWZfc2l6ZSksIGYuZF9idWYgPSAxICogZi5saXRfYnVmc2l6ZSwgZi5sX2J1ZiA9ICgxICsgMikgKiBmLmxpdF9idWZzaXplLCBmLmxldmVsID0gaSwgZi5zdHJhdGVneSA9IGwsIGYubWV0aG9kID0gdCwga2koZSk7Cn0sIEthID0gKGUsIGkpPT52aShlLCBpLCBQZSwgQWEsIFJhLCBFYSksIFBhID0gKGUsIGkpPT57CiAgICBsZXQgdCwgbjsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSB8fCBpID4gU3QgfHwgaSA8IDApIHJldHVybiBlID8gRyhlLCBMMSkgOiBMMTsKICAgIGxldCBhID0gZS5zdGF0ZTsKICAgIGlmICghZS5vdXRwdXQgfHwgIWUuaW5wdXQgJiYgZS5hdmFpbF9pbiAhPT0gMCB8fCBhLnN0YXR1cyA9PT0gc2UgJiYgaSAhPT0gVykgcmV0dXJuIEcoZSwgZS5hdmFpbF9vdXQgPT09IDAgPyBKZSA6IEwxKTsKICAgIGEuc3RybSA9IGU7CiAgICBsZXQgbCA9IGEubGFzdF9mbHVzaDsKICAgIGlmIChhLmxhc3RfZmx1c2ggPSBpLCBhLnN0YXR1cyA9PT0gWGUpIGlmIChhLndyYXAgPT09IDIpIGUuYWRsZXIgPSAwLCB5KGEsIDMxKSwgeShhLCAxMzkpLCB5KGEsIDgpLCBhLmd6aGVhZCA/ICh5KGEsIChhLmd6aGVhZC50ZXh0ID8gMSA6IDApICsgKGEuZ3poZWFkLmhjcmMgPyAyIDogMCkgKyAoYS5nemhlYWQuZXh0cmEgPyA0IDogMCkgKyAoYS5nemhlYWQubmFtZSA/IDggOiAwKSArIChhLmd6aGVhZC5jb21tZW50ID8gMTYgOiAwKSksIHkoYSwgYS5nemhlYWQudGltZSAmIDI1NSksIHkoYSwgYS5nemhlYWQudGltZSA+PiA4ICYgMjU1KSwgeShhLCBhLmd6aGVhZC50aW1lID4+IDE2ICYgMjU1KSwgeShhLCBhLmd6aGVhZC50aW1lID4+IDI0ICYgMjU1KSwgeShhLCBhLmxldmVsID09PSA5ID8gMiA6IGEuc3RyYXRlZ3kgPj0gSWUgfHwgYS5sZXZlbCA8IDIgPyA0IDogMCksIHkoYSwgYS5nemhlYWQub3MgJiAyNTUpLCBhLmd6aGVhZC5leHRyYSAmJiBhLmd6aGVhZC5leHRyYS5sZW5ndGggJiYgKHkoYSwgYS5nemhlYWQuZXh0cmEubGVuZ3RoICYgMjU1KSwgeShhLCBhLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCAmIDI1NSkpLCBhLmd6aGVhZC5oY3JjICYmIChlLmFkbGVyID0gSShlLmFkbGVyLCBhLnBlbmRpbmdfYnVmLCBhLnBlbmRpbmcsIDApKSwgYS5nemluZGV4ID0gMCwgYS5zdGF0dXMgPSBodCkgOiAoeShhLCAwKSwgeShhLCAwKSwgeShhLCAwKSwgeShhLCAwKSwgeShhLCAwKSwgeShhLCBhLmxldmVsID09PSA5ID8gMiA6IGEuc3RyYXRlZ3kgPj0gSWUgfHwgYS5sZXZlbCA8IDIgPyA0IDogMCksIHkoYSwgTmEpLCBhLnN0YXR1cyA9IHEpOwogICAgZWxzZSB7CiAgICAgICAgbGV0IG8gPSBQZSArIChhLndfYml0cyAtIDggPDwgNCkgPDwgOCwgZiA9IC0xOwogICAgICAgIGEuc3RyYXRlZ3kgPj0gSWUgfHwgYS5sZXZlbCA8IDIgPyBmID0gMCA6IGEubGV2ZWwgPCA2ID8gZiA9IDEgOiBhLmxldmVsID09PSA2ID8gZiA9IDIgOiBmID0gMywgbyB8PSBmIDw8IDYsIGEuc3Ryc3RhcnQgIT09IDAgJiYgKG8gfD0gT2EpLCBvICs9IDMxIC0gbyAlIDMxLCBhLnN0YXR1cyA9IHEsIGRlKGEsIG8pLCBhLnN0cnN0YXJ0ICE9PSAwICYmIChkZShhLCBlLmFkbGVyID4+PiAxNiksIGRlKGEsIGUuYWRsZXIgJiA2NTUzNSkpLCBlLmFkbGVyID0gMTsKICAgIH0KICAgIGlmIChhLnN0YXR1cyA9PT0gaHQpIGlmIChhLmd6aGVhZC5leHRyYSkgewogICAgICAgIGZvcih0ID0gYS5wZW5kaW5nOyBhLmd6aW5kZXggPCAoYS5nemhlYWQuZXh0cmEubGVuZ3RoICYgNjU1MzUpICYmICEoYS5wZW5kaW5nID09PSBhLnBlbmRpbmdfYnVmX3NpemUgJiYgKGEuZ3poZWFkLmhjcmMgJiYgYS5wZW5kaW5nID4gdCAmJiAoZS5hZGxlciA9IEkoZS5hZGxlciwgYS5wZW5kaW5nX2J1ZiwgYS5wZW5kaW5nIC0gdCwgdCkpLCBQMShlKSwgdCA9IGEucGVuZGluZywgYS5wZW5kaW5nID09PSBhLnBlbmRpbmdfYnVmX3NpemUpKTspeShhLCBhLmd6aGVhZC5leHRyYVthLmd6aW5kZXhdICYgMjU1KSwgYS5nemluZGV4Kys7CiAgICAgICAgYS5nemhlYWQuaGNyYyAmJiBhLnBlbmRpbmcgPiB0ICYmIChlLmFkbGVyID0gSShlLmFkbGVyLCBhLnBlbmRpbmdfYnVmLCBhLnBlbmRpbmcgLSB0LCB0KSksIGEuZ3ppbmRleCA9PT0gYS5nemhlYWQuZXh0cmEubGVuZ3RoICYmIChhLmd6aW5kZXggPSAwLCBhLnN0YXR1cyA9IENlKTsKICAgIH0gZWxzZSBhLnN0YXR1cyA9IENlOwogICAgaWYgKGEuc3RhdHVzID09PSBDZSkgaWYgKGEuZ3poZWFkLm5hbWUpIHsKICAgICAgICB0ID0gYS5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGEucGVuZGluZyA9PT0gYS5wZW5kaW5nX2J1Zl9zaXplICYmIChhLmd6aGVhZC5oY3JjICYmIGEucGVuZGluZyA+IHQgJiYgKGUuYWRsZXIgPSBJKGUuYWRsZXIsIGEucGVuZGluZ19idWYsIGEucGVuZGluZyAtIHQsIHQpKSwgUDEoZSksIHQgPSBhLnBlbmRpbmcsIGEucGVuZGluZyA9PT0gYS5wZW5kaW5nX2J1Zl9zaXplKSkgewogICAgICAgICAgICAgICAgbiA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBhLmd6aW5kZXggPCBhLmd6aGVhZC5uYW1lLmxlbmd0aCA/IG4gPSBhLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoYS5nemluZGV4KyspICYgMjU1IDogbiA9IDAsIHkoYSwgbik7CiAgICAgICAgfXdoaWxlIChuICE9PSAwKQogICAgICAgIGEuZ3poZWFkLmhjcmMgJiYgYS5wZW5kaW5nID4gdCAmJiAoZS5hZGxlciA9IEkoZS5hZGxlciwgYS5wZW5kaW5nX2J1ZiwgYS5wZW5kaW5nIC0gdCwgdCkpLCBuID09PSAwICYmIChhLmd6aW5kZXggPSAwLCBhLnN0YXR1cyA9IEZlKTsKICAgIH0gZWxzZSBhLnN0YXR1cyA9IEZlOwogICAgaWYgKGEuc3RhdHVzID09PSBGZSkgaWYgKGEuZ3poZWFkLmNvbW1lbnQpIHsKICAgICAgICB0ID0gYS5wZW5kaW5nOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGEucGVuZGluZyA9PT0gYS5wZW5kaW5nX2J1Zl9zaXplICYmIChhLmd6aGVhZC5oY3JjICYmIGEucGVuZGluZyA+IHQgJiYgKGUuYWRsZXIgPSBJKGUuYWRsZXIsIGEucGVuZGluZ19idWYsIGEucGVuZGluZyAtIHQsIHQpKSwgUDEoZSksIHQgPSBhLnBlbmRpbmcsIGEucGVuZGluZyA9PT0gYS5wZW5kaW5nX2J1Zl9zaXplKSkgewogICAgICAgICAgICAgICAgbiA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBhLmd6aW5kZXggPCBhLmd6aGVhZC5jb21tZW50Lmxlbmd0aCA/IG4gPSBhLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoYS5nemluZGV4KyspICYgMjU1IDogbiA9IDAsIHkoYSwgbik7CiAgICAgICAgfXdoaWxlIChuICE9PSAwKQogICAgICAgIGEuZ3poZWFkLmhjcmMgJiYgYS5wZW5kaW5nID4gdCAmJiAoZS5hZGxlciA9IEkoZS5hZGxlciwgYS5wZW5kaW5nX2J1ZiwgYS5wZW5kaW5nIC0gdCwgdCkpLCBuID09PSAwICYmIChhLnN0YXR1cyA9IE1lKTsKICAgIH0gZWxzZSBhLnN0YXR1cyA9IE1lOwogICAgaWYgKGEuc3RhdHVzID09PSBNZSAmJiAoYS5nemhlYWQuaGNyYyA/IChhLnBlbmRpbmcgKyAyID4gYS5wZW5kaW5nX2J1Zl9zaXplICYmIFAxKGUpLCBhLnBlbmRpbmcgKyAyIDw9IGEucGVuZGluZ19idWZfc2l6ZSAmJiAoeShhLCBlLmFkbGVyICYgMjU1KSwgeShhLCBlLmFkbGVyID4+IDggJiAyNTUpLCBlLmFkbGVyID0gMCwgYS5zdGF0dXMgPSBxKSkgOiBhLnN0YXR1cyA9IHEpLCBhLnBlbmRpbmcgIT09IDApIHsKICAgICAgICBpZiAoUDEoZSksIGUuYXZhaWxfb3V0ID09PSAwKSByZXR1cm4gYS5sYXN0X2ZsdXNoID0gLTEsIE07CiAgICB9IGVsc2UgaWYgKGUuYXZhaWxfaW4gPT09IDAgJiYgUnQoaSkgPD0gUnQobCkgJiYgaSAhPT0gVykgcmV0dXJuIEcoZSwgSmUpOwogICAgaWYgKGEuc3RhdHVzID09PSBzZSAmJiBlLmF2YWlsX2luICE9PSAwKSByZXR1cm4gRyhlLCBKZSk7CiAgICBpZiAoZS5hdmFpbF9pbiAhPT0gMCB8fCBhLmxvb2thaGVhZCAhPT0gMCB8fCBpICE9PSBsZSAmJiBhLnN0YXR1cyAhPT0gc2UpIHsKICAgICAgICBsZXQgbyA9IGEuc3RyYXRlZ3kgPT09IEllID8gRmEoYSwgaSkgOiBhLnN0cmF0ZWd5ID09PSBrYSA/IENhKGEsIGkpIDogY2VbYS5sZXZlbF0uZnVuYyhhLCBpKTsKICAgICAgICBpZiAoKG8gPT09IHRlIHx8IG8gPT09IGhlKSAmJiAoYS5zdGF0dXMgPSBzZSksIG8gPT09IEQgfHwgbyA9PT0gdGUpIHJldHVybiBlLmF2YWlsX291dCA9PT0gMCAmJiAoYS5sYXN0X2ZsdXNoID0gLTEpLCBNOwogICAgICAgIGlmIChvID09PSBSZSAmJiAoaSA9PT0gYmEgPyB1YShhKSA6IGkgIT09IFN0ICYmIChzYShhLCAwLCAwLCAhMSksIGkgPT09IHdhICYmIChYKGEuaGVhZCksIGEubG9va2FoZWFkID09PSAwICYmIChhLnN0cnN0YXJ0ID0gMCwgYS5ibG9ja19zdGFydCA9IDAsIGEuaW5zZXJ0ID0gMCkpKSwgUDEoZSksIGUuYXZhaWxfb3V0ID09PSAwKSkgcmV0dXJuIGEubGFzdF9mbHVzaCA9IC0xLCBNOwogICAgfQogICAgcmV0dXJuIGkgIT09IFcgPyBNIDogYS53cmFwIDw9IDAgPyBBdCA6IChhLndyYXAgPT09IDIgPyAoeShhLCBlLmFkbGVyICYgMjU1KSwgeShhLCBlLmFkbGVyID4+IDggJiAyNTUpLCB5KGEsIGUuYWRsZXIgPj4gMTYgJiAyNTUpLCB5KGEsIGUuYWRsZXIgPj4gMjQgJiAyNTUpLCB5KGEsIGUudG90YWxfaW4gJiAyNTUpLCB5KGEsIGUudG90YWxfaW4gPj4gOCAmIDI1NSksIHkoYSwgZS50b3RhbF9pbiA+PiAxNiAmIDI1NSksIHkoYSwgZS50b3RhbF9pbiA+PiAyNCAmIDI1NSkpIDogKGRlKGEsIGUuYWRsZXIgPj4+IDE2KSwgZGUoYSwgZS5hZGxlciAmIDY1NTM1KSksIFAxKGUpLCBhLndyYXAgPiAwICYmIChhLndyYXAgPSAtYS53cmFwKSwgYS5wZW5kaW5nICE9PSAwID8gTSA6IEF0KTsKfSwgWGEgPSAoZSk9PnsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSkgcmV0dXJuIEwxOwogICAgbGV0IGkgPSBlLnN0YXRlLnN0YXR1czsKICAgIHJldHVybiBpICE9PSBYZSAmJiBpICE9PSBodCAmJiBpICE9PSBDZSAmJiBpICE9PSBGZSAmJiBpICE9PSBNZSAmJiBpICE9PSBxICYmIGkgIT09IHNlID8gRyhlLCBMMSkgOiAoZS5zdGF0ZSA9IG51bGwsIGkgPT09IHEgPyBHKGUsIGdhKSA6IE0pOwp9LCBZYSA9IChlLCBpKT0+ewogICAgbGV0IHQgPSBpLmxlbmd0aDsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSkgcmV0dXJuIEwxOwogICAgbGV0IG4gPSBlLnN0YXRlLCBhID0gbi53cmFwOwogICAgaWYgKGEgPT09IDIgfHwgYSA9PT0gMSAmJiBuLnN0YXR1cyAhPT0gWGUgfHwgbi5sb29rYWhlYWQpIHJldHVybiBMMTsKICAgIGlmIChhID09PSAxICYmIChlLmFkbGVyID0gdmUoZS5hZGxlciwgaSwgdCwgMCkpLCBuLndyYXAgPSAwLCB0ID49IG4ud19zaXplKSB7CiAgICAgICAgYSA9PT0gMCAmJiAoWChuLmhlYWQpLCBuLnN0cnN0YXJ0ID0gMCwgbi5ibG9ja19zdGFydCA9IDAsIG4uaW5zZXJ0ID0gMCk7CiAgICAgICAgbGV0IGMgPSBuZXcgVWludDhBcnJheShuLndfc2l6ZSk7CiAgICAgICAgYy5zZXQoaS5zdWJhcnJheSh0IC0gbi53X3NpemUsIHQpLCAwKSwgaSA9IGMsIHQgPSBuLndfc2l6ZTsKICAgIH0KICAgIGxldCBsID0gZS5hdmFpbF9pbiwgbyA9IGUubmV4dF9pbiwgZiA9IGUuaW5wdXQ7CiAgICBmb3IoZS5hdmFpbF9pbiA9IHQsIGUubmV4dF9pbiA9IDAsIGUuaW5wdXQgPSBpLCBpZShuKTsgbi5sb29rYWhlYWQgPj0gazE7KXsKICAgICAgICBsZXQgYyA9IG4uc3Ryc3RhcnQsIHIgPSBuLmxvb2thaGVhZCAtIChrMSAtIDEpOwogICAgICAgIGRvIG4uaW5zX2ggPSBWKG4sIG4uaW5zX2gsIG4ud2luZG93W2MgKyBrMSAtIDFdKSwgbi5wcmV2W2MgJiBuLndfbWFza10gPSBuLmhlYWRbbi5pbnNfaF0sIG4uaGVhZFtuLmluc19oXSA9IGMsIGMrKzsKICAgICAgICB3aGlsZSAoLS1yKQogICAgICAgIG4uc3Ryc3RhcnQgPSBjLCBuLmxvb2thaGVhZCA9IGsxIC0gMSwgaWUobik7CiAgICB9CiAgICByZXR1cm4gbi5zdHJzdGFydCArPSBuLmxvb2thaGVhZCwgbi5ibG9ja19zdGFydCA9IG4uc3Ryc3RhcnQsIG4uaW5zZXJ0ID0gbi5sb29rYWhlYWQsIG4ubG9va2FoZWFkID0gMCwgbi5tYXRjaF9sZW5ndGggPSBuLnByZXZfbGVuZ3RoID0gazEgLSAxLCBuLm1hdGNoX2F2YWlsYWJsZSA9IDAsIGUubmV4dF9pbiA9IG8sIGUuaW5wdXQgPSBmLCBlLmF2YWlsX2luID0gbCwgbi53cmFwID0gYSwgTTsKfSwgR2EgPSBLYSwgamEgPSB2aSwgV2EgPSBraSwgVmEgPSB4aSwgSmEgPSBCYSwgUWEgPSBQYSwgcWEgPSBYYSwgZW4gPSBZYSwgdG4gPSAicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSIsIGJlID0gewogICAgZGVmbGF0ZUluaXQ6IEdhLAogICAgZGVmbGF0ZUluaXQyOiBqYSwKICAgIGRlZmxhdGVSZXNldDogV2EsCiAgICBkZWZsYXRlUmVzZXRLZWVwOiBWYSwKICAgIGRlZmxhdGVTZXRIZWFkZXI6IEphLAogICAgZGVmbGF0ZTogUWEsCiAgICBkZWZsYXRlRW5kOiBxYSwKICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5OiBlbiwKICAgIGRlZmxhdGVJbmZvOiB0bgp9LCBhbiA9IChlLCBpKT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGkpLCBubiA9IGZ1bmN0aW9uKGUpIHsKICAgIGxldCBpID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIGZvcig7IGkubGVuZ3RoOyl7CiAgICAgICAgbGV0IHQgPSBpLnNoaWZ0KCk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB0ICE9ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKHQgKyAibXVzdCBiZSBub24tb2JqZWN0Iik7CiAgICAgICAgICAgIGZvcihsZXQgbiBpbiB0KWFuKHQsIG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGU7Cn0sIGxuID0gKGUpPT57CiAgICBsZXQgaSA9IDA7CiAgICBmb3IobGV0IG4gPSAwLCBhID0gZS5sZW5ndGg7IG4gPCBhOyBuKyspaSArPSBlW25dLmxlbmd0aDsKICAgIGxldCB0ID0gbmV3IFVpbnQ4QXJyYXkoaSk7CiAgICBmb3IobGV0IG4gPSAwLCBhID0gMCwgbCA9IGUubGVuZ3RoOyBuIDwgbDsgbisrKXsKICAgICAgICBsZXQgbyA9IGVbbl07CiAgICAgICAgdC5zZXQobywgYSksIGEgKz0gby5sZW5ndGg7CiAgICB9CiAgICByZXR1cm4gdDsKfSwgWWUgPSB7CiAgICBhc3NpZ246IG5uLAogICAgZmxhdHRlbkNodW5rczogbG4KfSwgRWkgPSAhMDsKdHJ5IHsKICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOwp9IGNhdGNoICB7CiAgICBFaSA9ICExOwp9CnZhciBFZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7CmZvcihsZXQgZSA9IDA7IGUgPCAyNTY7IGUrKylFZVtlXSA9IGUgPj0gMjUyID8gNiA6IGUgPj0gMjQ4ID8gNSA6IGUgPj0gMjQwID8gNCA6IGUgPj0gMjI0ID8gMyA6IGUgPj0gMTkyID8gMiA6IDE7CkVlWzI1NF0gPSBFZVsyNTRdID0gMTsKdmFyIHJuID0gKGUpPT57CiAgICBpZiAodHlwZW9mIFRleHRFbmNvZGVyID09ICJmdW5jdGlvbiIgJiYgVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZSkgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKTsKICAgIGxldCBpLCB0LCBuLCBhLCBsLCBvID0gZS5sZW5ndGgsIGYgPSAwOwogICAgZm9yKGEgPSAwOyBhIDwgbzsgYSsrKXQgPSBlLmNoYXJDb2RlQXQoYSksICh0ICYgNjQ1MTIpID09PSA1NTI5NiAmJiBhICsgMSA8IG8gJiYgKG4gPSBlLmNoYXJDb2RlQXQoYSArIDEpLCAobiAmIDY0NTEyKSA9PT0gNTYzMjAgJiYgKHQgPSA2NTUzNiArICh0IC0gNTUyOTYgPDwgMTApICsgKG4gLSA1NjMyMCksIGErKykpLCBmICs9IHQgPCAxMjggPyAxIDogdCA8IDIwNDggPyAyIDogdCA8IDY1NTM2ID8gMyA6IDQ7CiAgICBmb3IoaSA9IG5ldyBVaW50OEFycmF5KGYpLCBsID0gMCwgYSA9IDA7IGwgPCBmOyBhKyspdCA9IGUuY2hhckNvZGVBdChhKSwgKHQgJiA2NDUxMikgPT09IDU1Mjk2ICYmIGEgKyAxIDwgbyAmJiAobiA9IGUuY2hhckNvZGVBdChhICsgMSksIChuICYgNjQ1MTIpID09PSA1NjMyMCAmJiAodCA9IDY1NTM2ICsgKHQgLSA1NTI5NiA8PCAxMCkgKyAobiAtIDU2MzIwKSwgYSsrKSksIHQgPCAxMjggPyBpW2wrK10gPSB0IDogdCA8IDIwNDggPyAoaVtsKytdID0gMTkyIHwgdCA+Pj4gNiwgaVtsKytdID0gMTI4IHwgdCAmIDYzKSA6IHQgPCA2NTUzNiA/IChpW2wrK10gPSAyMjQgfCB0ID4+PiAxMiwgaVtsKytdID0gMTI4IHwgdCA+Pj4gNiAmIDYzLCBpW2wrK10gPSAxMjggfCB0ICYgNjMpIDogKGlbbCsrXSA9IDI0MCB8IHQgPj4+IDE4LCBpW2wrK10gPSAxMjggfCB0ID4+PiAxMiAmIDYzLCBpW2wrK10gPSAxMjggfCB0ID4+PiA2ICYgNjMsIGlbbCsrXSA9IDEyOCB8IHQgJiA2Myk7CiAgICByZXR1cm4gaTsKfSwgZm4gPSAoZSwgaSk9PnsKICAgIGlmIChpIDwgNjU1MzQgJiYgZS5zdWJhcnJheSAmJiBFaSkgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZS5sZW5ndGggPT09IGkgPyBlIDogZS5zdWJhcnJheSgwLCBpKSk7CiAgICBsZXQgdCA9ICIiOwogICAgZm9yKGxldCBuID0gMDsgbiA8IGk7IG4rKyl0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZVtuXSk7CiAgICByZXR1cm4gdDsKfSwgb24gPSAoZSwgaSk9PnsKICAgIGxldCB0ID0gaSB8fCBlLmxlbmd0aDsKICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPT0gImZ1bmN0aW9uIiAmJiBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKSByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGUuc3ViYXJyYXkoMCwgaSkpOwogICAgbGV0IG4sIGEsIGwgPSBuZXcgQXJyYXkodCAqIDIpOwogICAgZm9yKGEgPSAwLCBuID0gMDsgbiA8IHQ7KXsKICAgICAgICBsZXQgbyA9IGVbbisrXTsKICAgICAgICBpZiAobyA8IDEyOCkgewogICAgICAgICAgICBsW2ErK10gPSBvOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbGV0IGYgPSBFZVtvXTsKICAgICAgICBpZiAoZiA+IDQpIHsKICAgICAgICAgICAgbFthKytdID0gNjU1MzMsIG4gKz0gZiAtIDE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmb3IobyAmPSBmID09PSAyID8gMzEgOiBmID09PSAzID8gMTUgOiA3OyBmID4gMSAmJiBuIDwgdDspbyA9IG8gPDwgNiB8IGVbbisrXSAmIDYzLCBmLS07CiAgICAgICAgaWYgKGYgPiAxKSB7CiAgICAgICAgICAgIGxbYSsrXSA9IDY1NTMzOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbyA8IDY1NTM2ID8gbFthKytdID0gbyA6IChvIC09IDY1NTM2LCBsW2ErK10gPSA1NTI5NiB8IG8gPj4gMTAgJiAxMDIzLCBsW2ErK10gPSA1NjMyMCB8IG8gJiAxMDIzKTsKICAgIH0KICAgIHJldHVybiBmbihsLCBhKTsKfSwgX24gPSAoZSwgaSk9PnsKICAgIGkgPSBpIHx8IGUubGVuZ3RoLCBpID4gZS5sZW5ndGggJiYgKGkgPSBlLmxlbmd0aCk7CiAgICBsZXQgdCA9IGkgLSAxOwogICAgZm9yKDsgdCA+PSAwICYmIChlW3RdICYgMTkyKSA9PT0gMTI4Oyl0LS07CiAgICByZXR1cm4gdCA8IDAgfHwgdCA9PT0gMCA/IGkgOiB0ICsgRWVbZVt0XV0gPiBpID8gdCA6IGk7Cn0sIHllID0gewogICAgc3RyaW5nMmJ1Zjogcm4sCiAgICBidWYyc3RyaW5nOiBvbiwKICAgIHV0Zjhib3JkZXI6IF9uCn07CmZ1bmN0aW9uIGhuKCkgewogICAgdGhpcy5pbnB1dCA9IG51bGwsIHRoaXMubmV4dF9pbiA9IDAsIHRoaXMuYXZhaWxfaW4gPSAwLCB0aGlzLnRvdGFsX2luID0gMCwgdGhpcy5vdXRwdXQgPSBudWxsLCB0aGlzLm5leHRfb3V0ID0gMCwgdGhpcy5hdmFpbF9vdXQgPSAwLCB0aGlzLnRvdGFsX291dCA9IDAsIHRoaXMubXNnID0gIiIsIHRoaXMuc3RhdGUgPSBudWxsLCB0aGlzLmRhdGFfdHlwZSA9IDIsIHRoaXMuYWRsZXIgPSAwOwp9CnZhciB5aSA9IGhuLCBTaSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIHsgWl9OT19GTFVTSDogZG4gLCBaX1NZTkNfRkxVU0g6IHNuICwgWl9GVUxMX0ZMVVNIOiBjbiAsIFpfRklOSVNIOiB1biAsIFpfT0s6IEJlICwgWl9TVFJFQU1fRU5EOiBibiAsIFpfREVGQVVMVF9DT01QUkVTU0lPTjogd24gLCBaX0RFRkFVTFRfU1RSQVRFR1k6IGduICwgWl9ERUZMQVRFRDogcG4gIH0gPSBuZTsKZnVuY3Rpb24gemUoZSkgewogICAgdGhpcy5vcHRpb25zID0gWWUuYXNzaWduKHsKICAgICAgICBsZXZlbDogd24sCiAgICAgICAgbWV0aG9kOiBwbiwKICAgICAgICBjaHVua1NpemU6IDE2Mzg0LAogICAgICAgIHdpbmRvd0JpdHM6IDE1LAogICAgICAgIG1lbUxldmVsOiA4LAogICAgICAgIHN0cmF0ZWd5OiBnbgogICAgfSwgZSB8fCB7fSk7CiAgICBsZXQgaSA9IHRoaXMub3B0aW9uczsKICAgIGkucmF3ICYmIGkud2luZG93Qml0cyA+IDAgPyBpLndpbmRvd0JpdHMgPSAtaS53aW5kb3dCaXRzIDogaS5nemlwICYmIGkud2luZG93Qml0cyA+IDAgJiYgaS53aW5kb3dCaXRzIDwgMTYgJiYgKGkud2luZG93Qml0cyArPSAxNiksIHRoaXMuZXJyID0gMCwgdGhpcy5tc2cgPSAiIiwgdGhpcy5lbmRlZCA9ICExLCB0aGlzLmNodW5rcyA9IFtdLCB0aGlzLnN0cm0gPSBuZXcgeWksIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwOwogICAgbGV0IHQgPSBiZS5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLCBpLmxldmVsLCBpLm1ldGhvZCwgaS53aW5kb3dCaXRzLCBpLm1lbUxldmVsLCBpLnN0cmF0ZWd5KTsKICAgIGlmICh0ICE9PSBCZSkgdGhyb3cgbmV3IEVycm9yKGVlW3RdKTsKICAgIGlmIChpLmhlYWRlciAmJiBiZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgaS5oZWFkZXIpLCBpLmRpY3Rpb25hcnkpIHsKICAgICAgICBsZXQgbjsKICAgICAgICBpZiAodHlwZW9mIGkuZGljdGlvbmFyeSA9PSAic3RyaW5nIiA/IG4gPSB5ZS5zdHJpbmcyYnVmKGkuZGljdGlvbmFyeSkgOiBTaS5jYWxsKGkuZGljdGlvbmFyeSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIgPyBuID0gbmV3IFVpbnQ4QXJyYXkoaS5kaWN0aW9uYXJ5KSA6IG4gPSBpLmRpY3Rpb25hcnksIHQgPSBiZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIG4pLCB0ICE9PSBCZSkgdGhyb3cgbmV3IEVycm9yKGVlW3RdKTsKICAgICAgICB0aGlzLl9kaWN0X3NldCA9ICEwOwogICAgfQp9CnplLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZSwgaSkgewogICAgbGV0IHQgPSB0aGlzLnN0cm0sIG4gPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplLCBhLCBsOwogICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybiAhMTsKICAgIGZvcihpID09PSB+fmkgPyBsID0gaSA6IGwgPSBpID09PSAhMCA/IHVuIDogZG4sIHR5cGVvZiBlID09ICJzdHJpbmciID8gdC5pbnB1dCA9IHllLnN0cmluZzJidWYoZSkgOiBTaS5jYWxsKGUpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iID8gdC5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGUpIDogdC5pbnB1dCA9IGUsIHQubmV4dF9pbiA9IDAsIHQuYXZhaWxfaW4gPSB0LmlucHV0Lmxlbmd0aDs7KXsKICAgICAgICBpZiAodC5hdmFpbF9vdXQgPT09IDAgJiYgKHQub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobiksIHQubmV4dF9vdXQgPSAwLCB0LmF2YWlsX291dCA9IG4pLCAobCA9PT0gc24gfHwgbCA9PT0gY24pICYmIHQuYXZhaWxfb3V0IDw9IDYpIHsKICAgICAgICAgICAgdGhpcy5vbkRhdGEodC5vdXRwdXQuc3ViYXJyYXkoMCwgdC5uZXh0X291dCkpLCB0LmF2YWlsX291dCA9IDA7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYSA9IGJlLmRlZmxhdGUodCwgbCksIGEgPT09IGJuKSByZXR1cm4gdC5uZXh0X291dCA+IDAgJiYgdGhpcy5vbkRhdGEodC5vdXRwdXQuc3ViYXJyYXkoMCwgdC5uZXh0X291dCkpLCBhID0gYmUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pLCB0aGlzLm9uRW5kKGEpLCB0aGlzLmVuZGVkID0gITAsIGEgPT09IEJlOwogICAgICAgIGlmICh0LmF2YWlsX291dCA9PT0gMCkgewogICAgICAgICAgICB0aGlzLm9uRGF0YSh0Lm91dHB1dCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAobCA+IDAgJiYgdC5uZXh0X291dCA+IDApIHsKICAgICAgICAgICAgdGhpcy5vbkRhdGEodC5vdXRwdXQuc3ViYXJyYXkoMCwgdC5uZXh0X291dCkpLCB0LmF2YWlsX291dCA9IDA7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodC5hdmFpbF9pbiA9PT0gMCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gITA7Cn07CnplLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmNodW5rcy5wdXNoKGUpOwp9Owp6ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbihlKSB7CiAgICBlID09PSBCZSAmJiAodGhpcy5yZXN1bHQgPSBZZS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksIHRoaXMuY2h1bmtzID0gW10sIHRoaXMuZXJyID0gZSwgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnOwp9OwpmdW5jdGlvbiBidChlLCBpKSB7CiAgICBsZXQgdCA9IG5ldyB6ZShpKTsKICAgIGlmICh0LnB1c2goZSwgITApLCB0LmVycikgdGhyb3cgdC5tc2cgfHwgZWVbdC5lcnJdOwogICAgcmV0dXJuIHQucmVzdWx0Owp9CmZ1bmN0aW9uIHhuKGUsIGkpIHsKICAgIHJldHVybiBpID0gaSB8fCB7fSwgaS5yYXcgPSAhMCwgYnQoZSwgaSk7Cn0KZnVuY3Rpb24ga24oZSwgaSkgewogICAgcmV0dXJuIGkgPSBpIHx8IHt9LCBpLmd6aXAgPSAhMCwgYnQoZSwgaSk7Cn0KdmFyIHZuID0gemUsIEVuID0gYnQsIHluID0geG4sIFNuID0ga24sIEFuID0gbmUsIFJuID0gewogICAgRGVmbGF0ZTogdm4sCiAgICBkZWZsYXRlOiBFbiwKICAgIGRlZmxhdGVSYXc6IHluLAogICAgZ3ppcDogU24sCiAgICBjb25zdGFudHM6IEFuCn0sIE9lID0gMzAsIHpuID0gMTIsIFRuID0gZnVuY3Rpb24oaSwgdCkgewogICAgbGV0IG4sIGEsIGwsIG8sIGYsIGMsIHIsIF8sIEUsIHMsIGgsIHUsIG0sIHYsIHcsIEEsIHgsIGQsIFMsIFosIGIsIHosIFIsIGcsIHAgPSBpLnN0YXRlOwogICAgbiA9IGkubmV4dF9pbiwgUiA9IGkuaW5wdXQsIGEgPSBuICsgKGkuYXZhaWxfaW4gLSA1KSwgbCA9IGkubmV4dF9vdXQsIGcgPSBpLm91dHB1dCwgbyA9IGwgLSAodCAtIGkuYXZhaWxfb3V0KSwgZiA9IGwgKyAoaS5hdmFpbF9vdXQgLSAyNTcpLCBjID0gcC5kbWF4LCByID0gcC53c2l6ZSwgXyA9IHAud2hhdmUsIEUgPSBwLnduZXh0LCBzID0gcC53aW5kb3csIGggPSBwLmhvbGQsIHUgPSBwLmJpdHMsIG0gPSBwLmxlbmNvZGUsIHYgPSBwLmRpc3Rjb2RlLCB3ID0gKDEgPDwgcC5sZW5iaXRzKSAtIDEsIEEgPSAoMSA8PCBwLmRpc3RiaXRzKSAtIDE7CiAgICBlOiBkbyB7CiAgICAgICAgdSA8IDE1ICYmIChoICs9IFJbbisrXSA8PCB1LCB1ICs9IDgsIGggKz0gUltuKytdIDw8IHUsIHUgKz0gOCksIHggPSBtW2ggJiB3XTsKICAgICAgICB0OiBmb3IoOzspewogICAgICAgICAgICBpZiAoZCA9IHggPj4+IDI0LCBoID4+Pj0gZCwgdSAtPSBkLCBkID0geCA+Pj4gMTYgJiAyNTUsIGQgPT09IDApIGdbbCsrXSA9IHggJiA2NTUzNTsKICAgICAgICAgICAgZWxzZSBpZiAoZCAmIDE2KSB7CiAgICAgICAgICAgICAgICBTID0geCAmIDY1NTM1LCBkICY9IDE1LCBkICYmICh1IDwgZCAmJiAoaCArPSBSW24rK10gPDwgdSwgdSArPSA4KSwgUyArPSBoICYgKDEgPDwgZCkgLSAxLCBoID4+Pj0gZCwgdSAtPSBkKSwgdSA8IDE1ICYmIChoICs9IFJbbisrXSA8PCB1LCB1ICs9IDgsIGggKz0gUltuKytdIDw8IHUsIHUgKz0gOCksIHggPSB2W2ggJiBBXTsKICAgICAgICAgICAgICAgIGk6IGZvcig7Oyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQgPSB4ID4+PiAyNCwgaCA+Pj49IGQsIHUgLT0gZCwgZCA9IHggPj4+IDE2ICYgMjU1LCBkICYgMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFogPSB4ICYgNjU1MzUsIGQgJj0gMTUsIHUgPCBkICYmIChoICs9IFJbbisrXSA8PCB1LCB1ICs9IDgsIHUgPCBkICYmIChoICs9IFJbbisrXSA8PCB1LCB1ICs9IDgpKSwgWiArPSBoICYgKDEgPDwgZCkgLSAxLCBaID4gYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLCBwLm1vZGUgPSBPZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj4+PSBkLCB1IC09IGQsIGQgPSBsIC0gbywgWiA+IGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID0gWiAtIGQsIGQgPiBfICYmIHAuc2FuZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIiwgcC5tb2RlID0gT2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gMCwgeiA9IHMsIEUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiArPSByIC0gZCwgZCA8IFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyAtPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyBnW2wrK10gPSBzW2IrK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBsIC0gWiwgeiA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFIDwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICs9IHIgKyBFIC0gZCwgZCAtPSBFLCBkIDwgUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTIC09IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGdbbCsrXSA9IHNbYisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPSAwLCBFIDwgUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IEUsIFMgLT0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGdbbCsrXSA9IHNbYisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gbCAtIFosIHogPSBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiICs9IEUgLSBkLCBkIDwgUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgLT0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyBnW2wrK10gPSBzW2IrK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gbCAtIFosIHogPSBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKDsgUyA+IDI7KWdbbCsrXSA9IHpbYisrXSwgZ1tsKytdID0geltiKytdLCBnW2wrK10gPSB6W2IrK10sIFMgLT0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgJiYgKGdbbCsrXSA9IHpbYisrXSwgUyA+IDEgJiYgKGdbbCsrXSA9IHpbYisrXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGwgLSBaOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gZ1tsKytdID0gZ1tiKytdLCBnW2wrK10gPSBnW2IrK10sIGdbbCsrXSA9IGdbYisrXSwgUyAtPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFMgPiAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUyAmJiAoZ1tsKytdID0gZ1tiKytdLCBTID4gMSAmJiAoZ1tsKytdID0gZ1tiKytdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgJiA2NCkgewogICAgICAgICAgICAgICAgICAgICAgICBpLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCBwLm1vZGUgPSBPZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0gdlsoeCAmIDY1NTM1KSArIChoICYgKDEgPDwgZCkgLSAxKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGQgJiA2NCkgaWYgKGQgJiAzMikgewogICAgICAgICAgICAgICAgcC5tb2RlID0gem47CiAgICAgICAgICAgICAgICBicmVhayBlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaS5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIiwgcC5tb2RlID0gT2U7CiAgICAgICAgICAgICAgICBicmVhayBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgeCA9IG1bKHggJiA2NTUzNSkgKyAoaCAmICgxIDw8IGQpIC0gMSldOwogICAgICAgICAgICAgICAgY29udGludWUgdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9d2hpbGUgKG4gPCBhICYmIGwgPCBmKQogICAgUyA9IHUgPj4gMywgbiAtPSBTLCB1IC09IFMgPDwgMywgaCAmPSAoMSA8PCB1KSAtIDEsIGkubmV4dF9pbiA9IG4sIGkubmV4dF9vdXQgPSBsLCBpLmF2YWlsX2luID0gbiA8IGEgPyA1ICsgKGEgLSBuKSA6IDUgLSAobiAtIGEpLCBpLmF2YWlsX291dCA9IGwgPCBmID8gMjU3ICsgKGYgLSBsKSA6IDI1NyAtIChsIC0gZiksIHAuaG9sZCA9IGgsIHAuYml0cyA9IHU7Cn0sIGZlID0gMTUsIHp0ID0gODUyLCBUdCA9IDU5MiwgbXQgPSAwLCBxZSA9IDEsIER0ID0gMiwgbW4gPSBuZXcgVWludDE2QXJyYXkoWwogICAgMywKICAgIDQsCiAgICA1LAogICAgNiwKICAgIDcsCiAgICA4LAogICAgOSwKICAgIDEwLAogICAgMTEsCiAgICAxMywKICAgIDE1LAogICAgMTcsCiAgICAxOSwKICAgIDIzLAogICAgMjcsCiAgICAzMSwKICAgIDM1LAogICAgNDMsCiAgICA1MSwKICAgIDU5LAogICAgNjcsCiAgICA4MywKICAgIDk5LAogICAgMTE1LAogICAgMTMxLAogICAgMTYzLAogICAgMTk1LAogICAgMjI3LAogICAgMjU4LAogICAgMCwKICAgIDAKXSksIERuID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxNywKICAgIDE3LAogICAgMTgsCiAgICAxOCwKICAgIDE4LAogICAgMTgsCiAgICAxOSwKICAgIDE5LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMCwKICAgIDIwLAogICAgMjEsCiAgICAyMSwKICAgIDIxLAogICAgMjEsCiAgICAxNiwKICAgIDcyLAogICAgNzgKXSksIFpuID0gbmV3IFVpbnQxNkFycmF5KFsKICAgIDEsCiAgICAyLAogICAgMywKICAgIDQsCiAgICA1LAogICAgNywKICAgIDksCiAgICAxMywKICAgIDE3LAogICAgMjUsCiAgICAzMywKICAgIDQ5LAogICAgNjUsCiAgICA5NywKICAgIDEyOSwKICAgIDE5MywKICAgIDI1NywKICAgIDM4NSwKICAgIDUxMywKICAgIDc2OSwKICAgIDEwMjUsCiAgICAxNTM3LAogICAgMjA0OSwKICAgIDMwNzMsCiAgICA0MDk3LAogICAgNjE0NSwKICAgIDgxOTMsCiAgICAxMjI4OSwKICAgIDE2Mzg1LAogICAgMjQ1NzcsCiAgICAwLAogICAgMApdKSwgSW4gPSBuZXcgVWludDhBcnJheShbCiAgICAxNiwKICAgIDE2LAogICAgMTYsCiAgICAxNiwKICAgIDE3LAogICAgMTcsCiAgICAxOCwKICAgIDE4LAogICAgMTksCiAgICAxOSwKICAgIDIwLAogICAgMjAsCiAgICAyMSwKICAgIDIxLAogICAgMjIsCiAgICAyMiwKICAgIDIzLAogICAgMjMsCiAgICAyNCwKICAgIDI0LAogICAgMjUsCiAgICAyNSwKICAgIDI2LAogICAgMjYsCiAgICAyNywKICAgIDI3LAogICAgMjgsCiAgICAyOCwKICAgIDI5LAogICAgMjksCiAgICA2NCwKICAgIDY0Cl0pLCBPbiA9IChlLCBpLCB0LCBuLCBhLCBsLCBvLCBmKT0+ewogICAgbGV0IGMgPSBmLmJpdHMsIHIgPSAwLCBfID0gMCwgRSA9IDAsIHMgPSAwLCBoID0gMCwgdSA9IDAsIG0gPSAwLCB2ID0gMCwgdyA9IDAsIEEgPSAwLCB4LCBkLCBTLCBaLCBiLCB6ID0gbnVsbCwgUiA9IDAsIGcsIHAgPSBuZXcgVWludDE2QXJyYXkoZmUgKyAxKSwgSiA9IG5ldyBVaW50MTZBcnJheShmZSArIDEpLCBtZSA9IG51bGwsIGd0ID0gMCwgcHQsIERlLCBaZTsKICAgIGZvcihyID0gMDsgciA8PSBmZTsgcisrKXBbcl0gPSAwOwogICAgZm9yKF8gPSAwOyBfIDwgbjsgXysrKXBbaVt0ICsgX11dKys7CiAgICBmb3IoaCA9IGMsIHMgPSBmZTsgcyA+PSAxICYmIHBbc10gPT09IDA7IHMtLSk7CiAgICBpZiAoaCA+IHMgJiYgKGggPSBzKSwgcyA9PT0gMCkgcmV0dXJuIGFbbCsrXSA9IDEgPDwgMjQgfCA2NCA8PCAxNiB8IDAsIGFbbCsrXSA9IDEgPDwgMjQgfCA2NCA8PCAxNiB8IDAsIGYuYml0cyA9IDEsIDA7CiAgICBmb3IoRSA9IDE7IEUgPCBzICYmIHBbRV0gPT09IDA7IEUrKyk7CiAgICBmb3IoaCA8IEUgJiYgKGggPSBFKSwgdiA9IDEsIHIgPSAxOyByIDw9IGZlOyByKyspaWYgKHYgPDw9IDEsIHYgLT0gcFtyXSwgdiA8IDApIHJldHVybiAtMTsKICAgIGlmICh2ID4gMCAmJiAoZSA9PT0gbXQgfHwgcyAhPT0gMSkpIHJldHVybiAtMTsKICAgIGZvcihKWzFdID0gMCwgciA9IDE7IHIgPCBmZTsgcisrKUpbciArIDFdID0gSltyXSArIHBbcl07CiAgICBmb3IoXyA9IDA7IF8gPCBuOyBfKyspaVt0ICsgX10gIT09IDAgJiYgKG9bSltpW3QgKyBfXV0rK10gPSBfKTsKICAgIGlmIChlID09PSBtdCA/ICh6ID0gbWUgPSBvLCBnID0gMTkpIDogZSA9PT0gcWUgPyAoeiA9IG1uLCBSIC09IDI1NywgbWUgPSBEbiwgZ3QgLT0gMjU3LCBnID0gMjU2KSA6ICh6ID0gWm4sIG1lID0gSW4sIGcgPSAtMSksIEEgPSAwLCBfID0gMCwgciA9IEUsIGIgPSBsLCB1ID0gaCwgbSA9IDAsIFMgPSAtMSwgdyA9IDEgPDwgaCwgWiA9IHcgLSAxLCBlID09PSBxZSAmJiB3ID4genQgfHwgZSA9PT0gRHQgJiYgdyA+IFR0KSByZXR1cm4gMTsKICAgIGZvcig7Oyl7CiAgICAgICAgcHQgPSByIC0gbSwgb1tfXSA8IGcgPyAoRGUgPSAwLCBaZSA9IG9bX10pIDogb1tfXSA+IGcgPyAoRGUgPSBtZVtndCArIG9bX11dLCBaZSA9IHpbUiArIG9bX11dKSA6IChEZSA9IDMyICsgNjQsIFplID0gMCksIHggPSAxIDw8IHIgLSBtLCBkID0gMSA8PCB1LCBFID0gZDsKICAgICAgICBkbyBkIC09IHgsIGFbYiArIChBID4+IG0pICsgZF0gPSBwdCA8PCAyNCB8IERlIDw8IDE2IHwgWmUgfCAwOwogICAgICAgIHdoaWxlIChkICE9PSAwKQogICAgICAgIGZvcih4ID0gMSA8PCByIC0gMTsgQSAmIHg7KXggPj49IDE7CiAgICAgICAgaWYgKHggIT09IDAgPyAoQSAmPSB4IC0gMSwgQSArPSB4KSA6IEEgPSAwLCBfKyssIC0tcFtyXSA9PT0gMCkgewogICAgICAgICAgICBpZiAociA9PT0gcykgYnJlYWs7CiAgICAgICAgICAgIHIgPSBpW3QgKyBvW19dXTsKICAgICAgICB9CiAgICAgICAgaWYgKHIgPiBoICYmIChBICYgWikgIT09IFMpIHsKICAgICAgICAgICAgZm9yKG0gPT09IDAgJiYgKG0gPSBoKSwgYiArPSBFLCB1ID0gciAtIG0sIHYgPSAxIDw8IHU7IHUgKyBtIDwgcyAmJiAodiAtPSBwW3UgKyBtXSwgISh2IDw9IDApKTspdSsrLCB2IDw8PSAxOwogICAgICAgICAgICBpZiAodyArPSAxIDw8IHUsIGUgPT09IHFlICYmIHcgPiB6dCB8fCBlID09PSBEdCAmJiB3ID4gVHQpIHJldHVybiAxOwogICAgICAgICAgICBTID0gQSAmIFosIGFbU10gPSBoIDw8IDI0IHwgdSA8PCAxNiB8IGIgLSBsIHwgMDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gQSAhPT0gMCAmJiAoYVtiICsgQV0gPSByIC0gbSA8PCAyNCB8IDY0IDw8IDE2IHwgMCksIGYuYml0cyA9IGgsIDA7Cn0sIHdlID0gT24sIE5uID0gMCwgQWkgPSAxLCBSaSA9IDIsIHsgWl9GSU5JU0g6IFp0ICwgWl9CTE9DSzogTG4gLCBaX1RSRUVTOiBOZSAsIFpfT0s6IGFlICwgWl9TVFJFQU1fRU5EOiBVbiAsIFpfTkVFRF9ESUNUOiAkbiAsIFpfU1RSRUFNX0VSUk9SOiBVICwgWl9EQVRBX0VSUk9SOiB6aSAsIFpfTUVNX0VSUk9SOiBUaSAsIFpfQlVGX0VSUk9SOiBDbiAsIFpfREVGTEFURUQ6IEl0ICB9ID0gbmUsIG1pID0gMSwgT3QgPSAyLCBOdCA9IDMsIEx0ID0gNCwgVXQgPSA1LCAkdCA9IDYsIEN0ID0gNywgRnQgPSA4LCBNdCA9IDksIEh0ID0gMTAsIEtlID0gMTEsIEggPSAxMiwgZXQgPSAxMywgQnQgPSAxNCwgdHQgPSAxNSwgS3QgPSAxNiwgUHQgPSAxNywgWHQgPSAxOCwgWXQgPSAxOSwgTGUgPSAyMCwgVWUgPSAyMSwgR3QgPSAyMiwganQgPSAyMywgV3QgPSAyNCwgVnQgPSAyNSwgSnQgPSAyNiwgaXQgPSAyNywgUXQgPSAyOCwgcXQgPSAyOSwgVDEgPSAzMCwgRGkgPSAzMSwgRm4gPSAzMiwgTW4gPSA4NTIsIEhuID0gNTkyLCBCbiA9IDE1LCBLbiA9IEJuLCBlaSA9IChlKT0+KGUgPj4+IDI0ICYgMjU1KSArIChlID4+PiA4ICYgNjUyODApICsgKChlICYgNjUyODApIDw8IDgpICsgKChlICYgMjU1KSA8PCAyNCk7CmZ1bmN0aW9uIFBuKCkgewogICAgdGhpcy5tb2RlID0gMCwgdGhpcy5sYXN0ID0gITEsIHRoaXMud3JhcCA9IDAsIHRoaXMuaGF2ZWRpY3QgPSAhMSwgdGhpcy5mbGFncyA9IDAsIHRoaXMuZG1heCA9IDAsIHRoaXMuY2hlY2sgPSAwLCB0aGlzLnRvdGFsID0gMCwgdGhpcy5oZWFkID0gbnVsbCwgdGhpcy53Yml0cyA9IDAsIHRoaXMud3NpemUgPSAwLCB0aGlzLndoYXZlID0gMCwgdGhpcy53bmV4dCA9IDAsIHRoaXMud2luZG93ID0gbnVsbCwgdGhpcy5ob2xkID0gMCwgdGhpcy5iaXRzID0gMCwgdGhpcy5sZW5ndGggPSAwLCB0aGlzLm9mZnNldCA9IDAsIHRoaXMuZXh0cmEgPSAwLCB0aGlzLmxlbmNvZGUgPSBudWxsLCB0aGlzLmRpc3Rjb2RlID0gbnVsbCwgdGhpcy5sZW5iaXRzID0gMCwgdGhpcy5kaXN0Yml0cyA9IDAsIHRoaXMubmNvZGUgPSAwLCB0aGlzLm5sZW4gPSAwLCB0aGlzLm5kaXN0ID0gMCwgdGhpcy5oYXZlID0gMCwgdGhpcy5uZXh0ID0gbnVsbCwgdGhpcy5sZW5zID0gbmV3IFVpbnQxNkFycmF5KDMyMCksIHRoaXMud29yayA9IG5ldyBVaW50MTZBcnJheSgyODgpLCB0aGlzLmxlbmR5biA9IG51bGwsIHRoaXMuZGlzdGR5biA9IG51bGwsIHRoaXMuc2FuZSA9IDAsIHRoaXMuYmFjayA9IDAsIHRoaXMud2FzID0gMDsKfQp2YXIgWmkgPSAoZSk9PnsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSkgcmV0dXJuIFU7CiAgICBsZXQgaSA9IGUuc3RhdGU7CiAgICByZXR1cm4gZS50b3RhbF9pbiA9IGUudG90YWxfb3V0ID0gaS50b3RhbCA9IDAsIGUubXNnID0gIiIsIGkud3JhcCAmJiAoZS5hZGxlciA9IGkud3JhcCAmIDEpLCBpLm1vZGUgPSBtaSwgaS5sYXN0ID0gMCwgaS5oYXZlZGljdCA9IDAsIGkuZG1heCA9IDMyNzY4LCBpLmhlYWQgPSBudWxsLCBpLmhvbGQgPSAwLCBpLmJpdHMgPSAwLCBpLmxlbmNvZGUgPSBpLmxlbmR5biA9IG5ldyBJbnQzMkFycmF5KE1uKSwgaS5kaXN0Y29kZSA9IGkuZGlzdGR5biA9IG5ldyBJbnQzMkFycmF5KEhuKSwgaS5zYW5lID0gMSwgaS5iYWNrID0gLTEsIGFlOwp9LCBJaSA9IChlKT0+ewogICAgaWYgKCFlIHx8ICFlLnN0YXRlKSByZXR1cm4gVTsKICAgIGxldCBpID0gZS5zdGF0ZTsKICAgIHJldHVybiBpLndzaXplID0gMCwgaS53aGF2ZSA9IDAsIGkud25leHQgPSAwLCBaaShlKTsKfSwgT2kgPSAoZSwgaSk9PnsKICAgIGxldCB0OwogICAgaWYgKCFlIHx8ICFlLnN0YXRlKSByZXR1cm4gVTsKICAgIGxldCBuID0gZS5zdGF0ZTsKICAgIHJldHVybiBpIDwgMCA/ICh0ID0gMCwgaSA9IC1pKSA6ICh0ID0gKGkgPj4gNCkgKyAxLCBpIDwgNDggJiYgKGkgJj0gMTUpKSwgaSAmJiAoaSA8IDggfHwgaSA+IDE1KSA/IFUgOiAobi53aW5kb3cgIT09IG51bGwgJiYgbi53Yml0cyAhPT0gaSAmJiAobi53aW5kb3cgPSBudWxsKSwgbi53cmFwID0gdCwgbi53Yml0cyA9IGksIElpKGUpKTsKfSwgTmkgPSAoZSwgaSk9PnsKICAgIGlmICghZSkgcmV0dXJuIFU7CiAgICBsZXQgdCA9IG5ldyBQbjsKICAgIGUuc3RhdGUgPSB0LCB0LndpbmRvdyA9IG51bGw7CiAgICBsZXQgbiA9IE9pKGUsIGkpOwogICAgcmV0dXJuIG4gIT09IGFlICYmIChlLnN0YXRlID0gbnVsbCksIG47Cn0sIFhuID0gKGUpPT5OaShlLCBLbiksIHRpID0gITAsIGF0LCBudCwgWW4gPSAoZSk9PnsKICAgIGlmICh0aSkgewogICAgICAgIGF0ID0gbmV3IEludDMyQXJyYXkoNTEyKSwgbnQgPSBuZXcgSW50MzJBcnJheSgzMik7CiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIGZvcig7IGkgPCAxNDQ7KWUubGVuc1tpKytdID0gODsKICAgICAgICBmb3IoOyBpIDwgMjU2OyllLmxlbnNbaSsrXSA9IDk7CiAgICAgICAgZm9yKDsgaSA8IDI4MDspZS5sZW5zW2krK10gPSA3OwogICAgICAgIGZvcig7IGkgPCAyODg7KWUubGVuc1tpKytdID0gODsKICAgICAgICBmb3Iod2UoQWksIGUubGVucywgMCwgMjg4LCBhdCwgMCwgZS53b3JrLCB7CiAgICAgICAgICAgIGJpdHM6IDkKICAgICAgICB9KSwgaSA9IDA7IGkgPCAzMjspZS5sZW5zW2krK10gPSA1OwogICAgICAgIHdlKFJpLCBlLmxlbnMsIDAsIDMyLCBudCwgMCwgZS53b3JrLCB7CiAgICAgICAgICAgIGJpdHM6IDUKICAgICAgICB9KSwgdGkgPSAhMTsKICAgIH0KICAgIGUubGVuY29kZSA9IGF0LCBlLmxlbmJpdHMgPSA5LCBlLmRpc3Rjb2RlID0gbnQsIGUuZGlzdGJpdHMgPSA1Owp9LCBMaSA9IChlLCBpLCB0LCBuKT0+ewogICAgbGV0IGEsIGwgPSBlLnN0YXRlOwogICAgcmV0dXJuIGwud2luZG93ID09PSBudWxsICYmIChsLndzaXplID0gMSA8PCBsLndiaXRzLCBsLnduZXh0ID0gMCwgbC53aGF2ZSA9IDAsIGwud2luZG93ID0gbmV3IFVpbnQ4QXJyYXkobC53c2l6ZSkpLCBuID49IGwud3NpemUgPyAobC53aW5kb3cuc2V0KGkuc3ViYXJyYXkodCAtIGwud3NpemUsIHQpLCAwKSwgbC53bmV4dCA9IDAsIGwud2hhdmUgPSBsLndzaXplKSA6IChhID0gbC53c2l6ZSAtIGwud25leHQsIGEgPiBuICYmIChhID0gbiksIGwud2luZG93LnNldChpLnN1YmFycmF5KHQgLSBuLCB0IC0gbiArIGEpLCBsLnduZXh0KSwgbiAtPSBhLCBuID8gKGwud2luZG93LnNldChpLnN1YmFycmF5KHQgLSBuLCB0KSwgMCksIGwud25leHQgPSBuLCBsLndoYXZlID0gbC53c2l6ZSkgOiAobC53bmV4dCArPSBhLCBsLnduZXh0ID09PSBsLndzaXplICYmIChsLnduZXh0ID0gMCksIGwud2hhdmUgPCBsLndzaXplICYmIChsLndoYXZlICs9IGEpKSksIDA7Cn0sIEduID0gKGUsIGkpPT57CiAgICBsZXQgdCwgbiwgYSwgbCwgbywgZiwgYywgciwgXywgRSwgcywgaCwgdSwgbSwgdiA9IDAsIHcsIEEsIHgsIGQsIFMsIFosIGIsIHosIFIgPSBuZXcgVWludDhBcnJheSg0KSwgZywgcCwgSiA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAxNiwKICAgICAgICAxNywKICAgICAgICAxOCwKICAgICAgICAwLAogICAgICAgIDgsCiAgICAgICAgNywKICAgICAgICA5LAogICAgICAgIDYsCiAgICAgICAgMTAsCiAgICAgICAgNSwKICAgICAgICAxMSwKICAgICAgICA0LAogICAgICAgIDEyLAogICAgICAgIDMsCiAgICAgICAgMTMsCiAgICAgICAgMiwKICAgICAgICAxNCwKICAgICAgICAxLAogICAgICAgIDE1CiAgICBdKTsKICAgIGlmICghZSB8fCAhZS5zdGF0ZSB8fCAhZS5vdXRwdXQgfHwgIWUuaW5wdXQgJiYgZS5hdmFpbF9pbiAhPT0gMCkgcmV0dXJuIFU7CiAgICB0ID0gZS5zdGF0ZSwgdC5tb2RlID09PSBIICYmICh0Lm1vZGUgPSBldCksIG8gPSBlLm5leHRfb3V0LCBhID0gZS5vdXRwdXQsIGMgPSBlLmF2YWlsX291dCwgbCA9IGUubmV4dF9pbiwgbiA9IGUuaW5wdXQsIGYgPSBlLmF2YWlsX2luLCByID0gdC5ob2xkLCBfID0gdC5iaXRzLCBFID0gZiwgcyA9IGMsIHogPSBhZTsKICAgIGU6IGZvcig7Oylzd2l0Y2godC5tb2RlKXsKICAgICAgICBjYXNlIG1pOgogICAgICAgICAgICBpZiAodC53cmFwID09PSAwKSB7CiAgICAgICAgICAgICAgICB0Lm1vZGUgPSBldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcig7IF8gPCAxNjspewogICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodC53cmFwICYgMiAmJiByID09PSAzNTYxNSkgewogICAgICAgICAgICAgICAgdC5jaGVjayA9IDAsIFJbMF0gPSByICYgMjU1LCBSWzFdID0gciA+Pj4gOCAmIDI1NSwgdC5jaGVjayA9IEkodC5jaGVjaywgUiwgMiwgMCksIHIgPSAwLCBfID0gMCwgdC5tb2RlID0gT3Q7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodC5mbGFncyA9IDAsIHQuaGVhZCAmJiAodC5oZWFkLmRvbmUgPSAhMSksICEodC53cmFwICYgMSkgfHwgKCgociAmIDI1NSkgPDwgOCkgKyAociA+PiA4KSkgJSAzMSkgewogICAgICAgICAgICAgICAgZS5tc2cgPSAiaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChyICYgMTUpICE9PSBJdCkgewogICAgICAgICAgICAgICAgZS5tc2cgPSAidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyID4+Pj0gNCwgXyAtPSA0LCBiID0gKHIgJiAxNSkgKyA4LCB0LndiaXRzID09PSAwKSB0LndiaXRzID0gYjsKICAgICAgICAgICAgZWxzZSBpZiAoYiA+IHQud2JpdHMpIHsKICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgd2luZG93IHNpemUiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQuZG1heCA9IDEgPDwgdC53Yml0cywgZS5hZGxlciA9IHQuY2hlY2sgPSAxLCB0Lm1vZGUgPSByICYgNTEyID8gSHQgOiBILCByID0gMCwgXyA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT3Q6CiAgICAgICAgICAgIGZvcig7IF8gPCAxNjspewogICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodC5mbGFncyA9IHIsICh0LmZsYWdzICYgMjU1KSAhPT0gSXQpIHsKICAgICAgICAgICAgICAgIGUubXNnID0gInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIiwgdC5tb2RlID0gVDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodC5mbGFncyAmIDU3MzQ0KSB7CiAgICAgICAgICAgICAgICBlLm1zZyA9ICJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQuaGVhZCAmJiAodC5oZWFkLnRleHQgPSByID4+IDggJiAxKSwgdC5mbGFncyAmIDUxMiAmJiAoUlswXSA9IHIgJiAyNTUsIFJbMV0gPSByID4+PiA4ICYgMjU1LCB0LmNoZWNrID0gSSh0LmNoZWNrLCBSLCAyLCAwKSksIHIgPSAwLCBfID0gMCwgdC5tb2RlID0gTnQ7CiAgICAgICAgY2FzZSBOdDoKICAgICAgICAgICAgZm9yKDsgXyA8IDMyOyl7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQuaGVhZCAmJiAodC5oZWFkLnRpbWUgPSByKSwgdC5mbGFncyAmIDUxMiAmJiAoUlswXSA9IHIgJiAyNTUsIFJbMV0gPSByID4+PiA4ICYgMjU1LCBSWzJdID0gciA+Pj4gMTYgJiAyNTUsIFJbM10gPSByID4+PiAyNCAmIDI1NSwgdC5jaGVjayA9IEkodC5jaGVjaywgUiwgNCwgMCkpLCByID0gMCwgXyA9IDAsIHQubW9kZSA9IEx0OwogICAgICAgIGNhc2UgTHQ6CiAgICAgICAgICAgIGZvcig7IF8gPCAxNjspewogICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICB0LmhlYWQgJiYgKHQuaGVhZC54ZmxhZ3MgPSByICYgMjU1LCB0LmhlYWQub3MgPSByID4+IDgpLCB0LmZsYWdzICYgNTEyICYmIChSWzBdID0gciAmIDI1NSwgUlsxXSA9IHIgPj4+IDggJiAyNTUsIHQuY2hlY2sgPSBJKHQuY2hlY2ssIFIsIDIsIDApKSwgciA9IDAsIF8gPSAwLCB0Lm1vZGUgPSBVdDsKICAgICAgICBjYXNlIFV0OgogICAgICAgICAgICBpZiAodC5mbGFncyAmIDEwMjQpIHsKICAgICAgICAgICAgICAgIGZvcig7IF8gPCAxNjspewogICAgICAgICAgICAgICAgICAgIGlmIChmID09PSAwKSBicmVhayBlOwogICAgICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5sZW5ndGggPSByLCB0LmhlYWQgJiYgKHQuaGVhZC5leHRyYV9sZW4gPSByKSwgdC5mbGFncyAmIDUxMiAmJiAoUlswXSA9IHIgJiAyNTUsIFJbMV0gPSByID4+PiA4ICYgMjU1LCB0LmNoZWNrID0gSSh0LmNoZWNrLCBSLCAyLCAwKSksIHIgPSAwLCBfID0gMDsKICAgICAgICAgICAgfSBlbHNlIHQuaGVhZCAmJiAodC5oZWFkLmV4dHJhID0gbnVsbCk7CiAgICAgICAgICAgIHQubW9kZSA9ICR0OwogICAgICAgIGNhc2UgJHQ6CiAgICAgICAgICAgIGlmICh0LmZsYWdzICYgMTAyNCAmJiAoaCA9IHQubGVuZ3RoLCBoID4gZiAmJiAoaCA9IGYpLCBoICYmICh0LmhlYWQgJiYgKGIgPSB0LmhlYWQuZXh0cmFfbGVuIC0gdC5sZW5ndGgsIHQuaGVhZC5leHRyYSB8fCAodC5oZWFkLmV4dHJhID0gbmV3IFVpbnQ4QXJyYXkodC5oZWFkLmV4dHJhX2xlbikpLCB0LmhlYWQuZXh0cmEuc2V0KG4uc3ViYXJyYXkobCwgbCArIGgpLCBiKSksIHQuZmxhZ3MgJiA1MTIgJiYgKHQuY2hlY2sgPSBJKHQuY2hlY2ssIG4sIGgsIGwpKSwgZiAtPSBoLCBsICs9IGgsIHQubGVuZ3RoIC09IGgpLCB0Lmxlbmd0aCkpIGJyZWFrIGU7CiAgICAgICAgICAgIHQubGVuZ3RoID0gMCwgdC5tb2RlID0gQ3Q7CiAgICAgICAgY2FzZSBDdDoKICAgICAgICAgICAgaWYgKHQuZmxhZ3MgJiAyMDQ4KSB7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGggPSAwOwogICAgICAgICAgICAgICAgZG8gYiA9IG5bbCArIGgrK10sIHQuaGVhZCAmJiBiICYmIHQubGVuZ3RoIDwgNjU1MzYgJiYgKHQuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYikpOwogICAgICAgICAgICAgICAgd2hpbGUgKGIgJiYgaCA8IGYpCiAgICAgICAgICAgICAgICBpZiAodC5mbGFncyAmIDUxMiAmJiAodC5jaGVjayA9IEkodC5jaGVjaywgbiwgaCwgbCkpLCBmIC09IGgsIGwgKz0gaCwgYikgYnJlYWsgZTsKICAgICAgICAgICAgfSBlbHNlIHQuaGVhZCAmJiAodC5oZWFkLm5hbWUgPSBudWxsKTsKICAgICAgICAgICAgdC5sZW5ndGggPSAwLCB0Lm1vZGUgPSBGdDsKICAgICAgICBjYXNlIEZ0OgogICAgICAgICAgICBpZiAodC5mbGFncyAmIDQwOTYpIHsKICAgICAgICAgICAgICAgIGlmIChmID09PSAwKSBicmVhayBlOwogICAgICAgICAgICAgICAgaCA9IDA7CiAgICAgICAgICAgICAgICBkbyBiID0gbltsICsgaCsrXSwgdC5oZWFkICYmIGIgJiYgdC5sZW5ndGggPCA2NTUzNiAmJiAodC5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShiKSk7CiAgICAgICAgICAgICAgICB3aGlsZSAoYiAmJiBoIDwgZikKICAgICAgICAgICAgICAgIGlmICh0LmZsYWdzICYgNTEyICYmICh0LmNoZWNrID0gSSh0LmNoZWNrLCBuLCBoLCBsKSksIGYgLT0gaCwgbCArPSBoLCBiKSBicmVhayBlOwogICAgICAgICAgICB9IGVsc2UgdC5oZWFkICYmICh0LmhlYWQuY29tbWVudCA9IG51bGwpOwogICAgICAgICAgICB0Lm1vZGUgPSBNdDsKICAgICAgICBjYXNlIE10OgogICAgICAgICAgICBpZiAodC5mbGFncyAmIDUxMikgewogICAgICAgICAgICAgICAgZm9yKDsgXyA8IDE2Oyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgZi0tLCByICs9IG5bbCsrXSA8PCBfLCBfICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAociAhPT0gKHQuY2hlY2sgJiA2NTUzNSkpIHsKICAgICAgICAgICAgICAgICAgICBlLm1zZyA9ICJoZWFkZXIgY3JjIG1pc21hdGNoIiwgdC5tb2RlID0gVDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByID0gMCwgXyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdC5oZWFkICYmICh0LmhlYWQuaGNyYyA9IHQuZmxhZ3MgPj4gOSAmIDEsIHQuaGVhZC5kb25lID0gITApLCBlLmFkbGVyID0gdC5jaGVjayA9IDAsIHQubW9kZSA9IEg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSHQ6CiAgICAgICAgICAgIGZvcig7IF8gPCAzMjspewogICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBlLmFkbGVyID0gdC5jaGVjayA9IGVpKHIpLCByID0gMCwgXyA9IDAsIHQubW9kZSA9IEtlOwogICAgICAgIGNhc2UgS2U6CiAgICAgICAgICAgIGlmICh0LmhhdmVkaWN0ID09PSAwKSByZXR1cm4gZS5uZXh0X291dCA9IG8sIGUuYXZhaWxfb3V0ID0gYywgZS5uZXh0X2luID0gbCwgZS5hdmFpbF9pbiA9IGYsIHQuaG9sZCA9IHIsIHQuYml0cyA9IF8sICRuOwogICAgICAgICAgICBlLmFkbGVyID0gdC5jaGVjayA9IDEsIHQubW9kZSA9IEg7CiAgICAgICAgY2FzZSBIOgogICAgICAgICAgICBpZiAoaSA9PT0gTG4gfHwgaSA9PT0gTmUpIGJyZWFrIGU7CiAgICAgICAgY2FzZSBldDoKICAgICAgICAgICAgaWYgKHQubGFzdCkgewogICAgICAgICAgICAgICAgciA+Pj49IF8gJiA3LCBfIC09IF8gJiA3LCB0Lm1vZGUgPSBpdDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcig7IF8gPCAzOyl7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN3aXRjaCh0Lmxhc3QgPSByICYgMSwgciA+Pj49IDEsIF8gLT0gMSwgciAmIDMpewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIHQubW9kZSA9IEJ0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGlmIChZbih0KSwgdC5tb2RlID0gTGUsIGkgPT09IE5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIgPj4+PSAyLCBfIC09IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIHQubW9kZSA9IFB0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgYmxvY2sgdHlwZSIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHIgPj4+PSAyLCBfIC09IDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQnQ6CiAgICAgICAgICAgIGZvcihyID4+Pj0gXyAmIDcsIF8gLT0gXyAmIDc7IF8gPCAzMjspewogICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKHIgJiA2NTUzNSkgIT09IChyID4+PiAxNiBeIDY1NTM1KSkgewogICAgICAgICAgICAgICAgZS5tc2cgPSAiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQubGVuZ3RoID0gciAmIDY1NTM1LCByID0gMCwgXyA9IDAsIHQubW9kZSA9IHR0LCBpID09PSBOZSkgYnJlYWsgZTsKICAgICAgICBjYXNlIHR0OgogICAgICAgICAgICB0Lm1vZGUgPSBLdDsKICAgICAgICBjYXNlIEt0OgogICAgICAgICAgICBpZiAoaCA9IHQubGVuZ3RoLCBoKSB7CiAgICAgICAgICAgICAgICBpZiAoaCA+IGYgJiYgKGggPSBmKSwgaCA+IGMgJiYgKGggPSBjKSwgaCA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGEuc2V0KG4uc3ViYXJyYXkobCwgbCArIGgpLCBvKSwgZiAtPSBoLCBsICs9IGgsIGMgLT0gaCwgbyArPSBoLCB0Lmxlbmd0aCAtPSBoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdC5tb2RlID0gSDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQdDoKICAgICAgICAgICAgZm9yKDsgXyA8IDE0Oyl7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0Lm5sZW4gPSAociAmIDMxKSArIDI1NywgciA+Pj49IDUsIF8gLT0gNSwgdC5uZGlzdCA9IChyICYgMzEpICsgMSwgciA+Pj49IDUsIF8gLT0gNSwgdC5uY29kZSA9IChyICYgMTUpICsgNCwgciA+Pj49IDQsIF8gLT0gNCwgdC5ubGVuID4gMjg2IHx8IHQubmRpc3QgPiAzMCkgewogICAgICAgICAgICAgICAgZS5tc2cgPSAidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQuaGF2ZSA9IDAsIHQubW9kZSA9IFh0OwogICAgICAgIGNhc2UgWHQ6CiAgICAgICAgICAgIGZvcig7IHQuaGF2ZSA8IHQubmNvZGU7KXsKICAgICAgICAgICAgICAgIGZvcig7IF8gPCAzOyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgZi0tLCByICs9IG5bbCsrXSA8PCBfLCBfICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmxlbnNbSlt0LmhhdmUrK11dID0gciAmIDcsIHIgPj4+PSAzLCBfIC09IDM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKDsgdC5oYXZlIDwgMTk7KXQubGVuc1tKW3QuaGF2ZSsrXV0gPSAwOwogICAgICAgICAgICBpZiAodC5sZW5jb2RlID0gdC5sZW5keW4sIHQubGVuYml0cyA9IDcsIGcgPSB7CiAgICAgICAgICAgICAgICBiaXRzOiB0LmxlbmJpdHMKICAgICAgICAgICAgfSwgeiA9IHdlKE5uLCB0LmxlbnMsIDAsIDE5LCB0LmxlbmNvZGUsIDAsIHQud29yaywgZyksIHQubGVuYml0cyA9IGcuYml0cywgeikgewogICAgICAgICAgICAgICAgZS5tc2cgPSAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IiwgdC5tb2RlID0gVDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0LmhhdmUgPSAwLCB0Lm1vZGUgPSBZdDsKICAgICAgICBjYXNlIFl0OgogICAgICAgICAgICBmb3IoOyB0LmhhdmUgPCB0Lm5sZW4gKyB0Lm5kaXN0Oyl7CiAgICAgICAgICAgICAgICBmb3IoOyB2ID0gdC5sZW5jb2RlW3IgJiAoMSA8PCB0LmxlbmJpdHMpIC0gMV0sIHcgPSB2ID4+PiAyNCwgQSA9IHYgPj4+IDE2ICYgMjU1LCB4ID0gdiAmIDY1NTM1LCAhKHcgPD0gXyk7KXsKICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh4IDwgMTYpIHIgPj4+PSB3LCBfIC09IHcsIHQubGVuc1t0LmhhdmUrK10gPSB4OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihwID0gdyArIDI7IF8gPCBwOyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4+Pj0gdywgXyAtPSB3LCB0LmhhdmUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0LmxlbnNbdC5oYXZlIC0gMV0sIGggPSAzICsgKHIgJiAzKSwgciA+Pj49IDIsIF8gLT0gMjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPT09IDE3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihwID0gdyArIDM7IF8gPCBwOyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIgPj4+PSB3LCBfIC09IHcsIGIgPSAwLCBoID0gMyArIChyICYgNyksIHIgPj4+PSAzLCBfIC09IDM7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHAgPSB3ICsgNzsgXyA8IHA7KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID09PSAwKSBicmVhayBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0tLCByICs9IG5bbCsrXSA8PCBfLCBfICs9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgciA+Pj49IHcsIF8gLT0gdywgYiA9IDAsIGggPSAxMSArIChyICYgMTI3KSwgciA+Pj49IDcsIF8gLT0gNzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQuaGF2ZSArIGggPiB0Lm5sZW4gKyB0Lm5kaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcig7IGgtLTspdC5sZW5zW3QuaGF2ZSsrXSA9IGI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQubW9kZSA9PT0gVDEpIGJyZWFrOwogICAgICAgICAgICBpZiAodC5sZW5zWzI1Nl0gPT09IDApIHsKICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQubGVuYml0cyA9IDksIGcgPSB7CiAgICAgICAgICAgICAgICBiaXRzOiB0LmxlbmJpdHMKICAgICAgICAgICAgfSwgeiA9IHdlKEFpLCB0LmxlbnMsIDAsIHQubmxlbiwgdC5sZW5jb2RlLCAwLCB0LndvcmssIGcpLCB0LmxlbmJpdHMgPSBnLmJpdHMsIHopIHsKICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQuZGlzdGJpdHMgPSA2LCB0LmRpc3Rjb2RlID0gdC5kaXN0ZHluLCBnID0gewogICAgICAgICAgICAgICAgYml0czogdC5kaXN0Yml0cwogICAgICAgICAgICB9LCB6ID0gd2UoUmksIHQubGVucywgdC5ubGVuLCB0Lm5kaXN0LCB0LmRpc3Rjb2RlLCAwLCB0LndvcmssIGcpLCB0LmRpc3RiaXRzID0gZy5iaXRzLCB6KSB7CiAgICAgICAgICAgICAgICBlLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0Lm1vZGUgPSBMZSwgaSA9PT0gTmUpIGJyZWFrIGU7CiAgICAgICAgY2FzZSBMZToKICAgICAgICAgICAgdC5tb2RlID0gVWU7CiAgICAgICAgY2FzZSBVZToKICAgICAgICAgICAgaWYgKGYgPj0gNiAmJiBjID49IDI1OCkgewogICAgICAgICAgICAgICAgZS5uZXh0X291dCA9IG8sIGUuYXZhaWxfb3V0ID0gYywgZS5uZXh0X2luID0gbCwgZS5hdmFpbF9pbiA9IGYsIHQuaG9sZCA9IHIsIHQuYml0cyA9IF8sIFRuKGUsIHMpLCBvID0gZS5uZXh0X291dCwgYSA9IGUub3V0cHV0LCBjID0gZS5hdmFpbF9vdXQsIGwgPSBlLm5leHRfaW4sIG4gPSBlLmlucHV0LCBmID0gZS5hdmFpbF9pbiwgciA9IHQuaG9sZCwgXyA9IHQuYml0cywgdC5tb2RlID09PSBIICYmICh0LmJhY2sgPSAtMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IodC5iYWNrID0gMDsgdiA9IHQubGVuY29kZVtyICYgKDEgPDwgdC5sZW5iaXRzKSAtIDFdLCB3ID0gdiA+Pj4gMjQsIEEgPSB2ID4+PiAxNiAmIDI1NSwgeCA9IHYgJiA2NTUzNSwgISh3IDw9IF8pOyl7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBICYmICEoQSAmIDI0MCkpIHsKICAgICAgICAgICAgICAgIGZvcihkID0gdywgUyA9IEEsIFogPSB4OyB2ID0gdC5sZW5jb2RlW1ogKyAoKHIgJiAoMSA8PCBkICsgUykgLSAxKSA+PiBkKV0sIHcgPSB2ID4+PiAyNCwgQSA9IHYgPj4+IDE2ICYgMjU1LCB4ID0gdiAmIDY1NTM1LCAhKGQgKyB3IDw9IF8pOyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgZi0tLCByICs9IG5bbCsrXSA8PCBfLCBfICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByID4+Pj0gZCwgXyAtPSBkLCB0LmJhY2sgKz0gZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAociA+Pj49IHcsIF8gLT0gdywgdC5iYWNrICs9IHcsIHQubGVuZ3RoID0geCwgQSA9PT0gMCkgewogICAgICAgICAgICAgICAgdC5tb2RlID0gSnQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQSAmIDMyKSB7CiAgICAgICAgICAgICAgICB0LmJhY2sgPSAtMSwgdC5tb2RlID0gSDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBICYgNjQpIHsKICAgICAgICAgICAgICAgIGUubXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdC5leHRyYSA9IEEgJiAxNSwgdC5tb2RlID0gR3Q7CiAgICAgICAgY2FzZSBHdDoKICAgICAgICAgICAgaWYgKHQuZXh0cmEpIHsKICAgICAgICAgICAgICAgIGZvcihwID0gdC5leHRyYTsgXyA8IHA7KXsKICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQubGVuZ3RoICs9IHIgJiAoMSA8PCB0LmV4dHJhKSAtIDEsIHIgPj4+PSB0LmV4dHJhLCBfIC09IHQuZXh0cmEsIHQuYmFjayArPSB0LmV4dHJhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQud2FzID0gdC5sZW5ndGgsIHQubW9kZSA9IGp0OwogICAgICAgIGNhc2UganQ6CiAgICAgICAgICAgIGZvcig7IHYgPSB0LmRpc3Rjb2RlW3IgJiAoMSA8PCB0LmRpc3RiaXRzKSAtIDFdLCB3ID0gdiA+Pj4gMjQsIEEgPSB2ID4+PiAxNiAmIDI1NSwgeCA9IHYgJiA2NTUzNSwgISh3IDw9IF8pOyl7CiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgIGYtLSwgciArPSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKEEgJiAyNDApKSB7CiAgICAgICAgICAgICAgICBmb3IoZCA9IHcsIFMgPSBBLCBaID0geDsgdiA9IHQuZGlzdGNvZGVbWiArICgociAmICgxIDw8IGQgKyBTKSAtIDEpID4+IGQpXSwgdyA9IHYgPj4+IDI0LCBBID0gdiA+Pj4gMTYgJiAyNTUsIHggPSB2ICYgNjU1MzUsICEoZCArIHcgPD0gXyk7KXsKICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIgPj4+PSBkLCBfIC09IGQsIHQuYmFjayArPSBkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyID4+Pj0gdywgXyAtPSB3LCB0LmJhY2sgKz0gdywgQSAmIDY0KSB7CiAgICAgICAgICAgICAgICBlLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQub2Zmc2V0ID0geCwgdC5leHRyYSA9IEEgJiAxNSwgdC5tb2RlID0gV3Q7CiAgICAgICAgY2FzZSBXdDoKICAgICAgICAgICAgaWYgKHQuZXh0cmEpIHsKICAgICAgICAgICAgICAgIGZvcihwID0gdC5leHRyYTsgXyA8IHA7KXsKICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICBmLS0sIHIgKz0gbltsKytdIDw8IF8sIF8gKz0gODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQub2Zmc2V0ICs9IHIgJiAoMSA8PCB0LmV4dHJhKSAtIDEsIHIgPj4+PSB0LmV4dHJhLCBfIC09IHQuZXh0cmEsIHQuYmFjayArPSB0LmV4dHJhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0Lm9mZnNldCA+IHQuZG1heCkgewogICAgICAgICAgICAgICAgZS5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQubW9kZSA9IFZ0OwogICAgICAgIGNhc2UgVnQ6CiAgICAgICAgICAgIGlmIChjID09PSAwKSBicmVhayBlOwogICAgICAgICAgICBpZiAoaCA9IHMgLSBjLCB0Lm9mZnNldCA+IGgpIHsKICAgICAgICAgICAgICAgIGlmIChoID0gdC5vZmZzZXQgLSBoLCBoID4gdC53aGF2ZSAmJiB0LnNhbmUpIHsKICAgICAgICAgICAgICAgICAgICBlLm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaCA+IHQud25leHQgPyAoaCAtPSB0LnduZXh0LCB1ID0gdC53c2l6ZSAtIGgpIDogdSA9IHQud25leHQgLSBoLCBoID4gdC5sZW5ndGggJiYgKGggPSB0Lmxlbmd0aCksIG0gPSB0LndpbmRvdzsKICAgICAgICAgICAgfSBlbHNlIG0gPSBhLCB1ID0gbyAtIHQub2Zmc2V0LCBoID0gdC5sZW5ndGg7CiAgICAgICAgICAgIGggPiBjICYmIChoID0gYyksIGMgLT0gaCwgdC5sZW5ndGggLT0gaDsKICAgICAgICAgICAgZG8gYVtvKytdID0gbVt1KytdOwogICAgICAgICAgICB3aGlsZSAoLS1oKQogICAgICAgICAgICB0Lmxlbmd0aCA9PT0gMCAmJiAodC5tb2RlID0gVWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEp0OgogICAgICAgICAgICBpZiAoYyA9PT0gMCkgYnJlYWsgZTsKICAgICAgICAgICAgYVtvKytdID0gdC5sZW5ndGgsIGMtLSwgdC5tb2RlID0gVWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgaXQ6CiAgICAgICAgICAgIGlmICh0LndyYXApIHsKICAgICAgICAgICAgICAgIGZvcig7IF8gPCAzMjspewogICAgICAgICAgICAgICAgICAgIGlmIChmID09PSAwKSBicmVhayBlOwogICAgICAgICAgICAgICAgICAgIGYtLSwgciB8PSBuW2wrK10gPDwgXywgXyArPSA4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHMgLT0gYywgZS50b3RhbF9vdXQgKz0gcywgdC50b3RhbCArPSBzLCBzICYmIChlLmFkbGVyID0gdC5jaGVjayA9IHQuZmxhZ3MgPyBJKHQuY2hlY2ssIGEsIHMsIG8gLSBzKSA6IHZlKHQuY2hlY2ssIGEsIHMsIG8gLSBzKSksIHMgPSBjLCAodC5mbGFncyA/IHIgOiBlaShyKSkgIT09IHQuY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICBlLm1zZyA9ICJpbmNvcnJlY3QgZGF0YSBjaGVjayIsIHQubW9kZSA9IFQxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgciA9IDAsIF8gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQubW9kZSA9IFF0OwogICAgICAgIGNhc2UgUXQ6CiAgICAgICAgICAgIGlmICh0LndyYXAgJiYgdC5mbGFncykgewogICAgICAgICAgICAgICAgZm9yKDsgXyA8IDMyOyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT09IDApIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgZi0tLCByICs9IG5bbCsrXSA8PCBfLCBfICs9IDg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAociAhPT0gKHQudG90YWwgJiA0Mjk0OTY3Mjk1KSkgewogICAgICAgICAgICAgICAgICAgIGUubXNnID0gImluY29ycmVjdCBsZW5ndGggY2hlY2siLCB0Lm1vZGUgPSBUMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIgPSAwLCBfID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0Lm1vZGUgPSBxdDsKICAgICAgICBjYXNlIHF0OgogICAgICAgICAgICB6ID0gVW47CiAgICAgICAgICAgIGJyZWFrIGU7CiAgICAgICAgY2FzZSBUMToKICAgICAgICAgICAgeiA9IHppOwogICAgICAgICAgICBicmVhayBlOwogICAgICAgIGNhc2UgRGk6CiAgICAgICAgICAgIHJldHVybiBUaTsKICAgICAgICBjYXNlIEZuOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBVOwogICAgfQogICAgcmV0dXJuIGUubmV4dF9vdXQgPSBvLCBlLmF2YWlsX291dCA9IGMsIGUubmV4dF9pbiA9IGwsIGUuYXZhaWxfaW4gPSBmLCB0LmhvbGQgPSByLCB0LmJpdHMgPSBfLCAodC53c2l6ZSB8fCBzICE9PSBlLmF2YWlsX291dCAmJiB0Lm1vZGUgPCBUMSAmJiAodC5tb2RlIDwgaXQgfHwgaSAhPT0gWnQpKSAmJiBMaShlLCBlLm91dHB1dCwgZS5uZXh0X291dCwgcyAtIGUuYXZhaWxfb3V0KSwgRSAtPSBlLmF2YWlsX2luLCBzIC09IGUuYXZhaWxfb3V0LCBlLnRvdGFsX2luICs9IEUsIGUudG90YWxfb3V0ICs9IHMsIHQudG90YWwgKz0gcywgdC53cmFwICYmIHMgJiYgKGUuYWRsZXIgPSB0LmNoZWNrID0gdC5mbGFncyA/IEkodC5jaGVjaywgYSwgcywgZS5uZXh0X291dCAtIHMpIDogdmUodC5jaGVjaywgYSwgcywgZS5uZXh0X291dCAtIHMpKSwgZS5kYXRhX3R5cGUgPSB0LmJpdHMgKyAodC5sYXN0ID8gNjQgOiAwKSArICh0Lm1vZGUgPT09IEggPyAxMjggOiAwKSArICh0Lm1vZGUgPT09IExlIHx8IHQubW9kZSA9PT0gdHQgPyAyNTYgOiAwKSwgKEUgPT09IDAgJiYgcyA9PT0gMCB8fCBpID09PSBadCkgJiYgeiA9PT0gYWUgJiYgKHogPSBDbiksIHo7Cn0sIGpuID0gKGUpPT57CiAgICBpZiAoIWUgfHwgIWUuc3RhdGUpIHJldHVybiBVOwogICAgbGV0IGkgPSBlLnN0YXRlOwogICAgcmV0dXJuIGkud2luZG93ICYmIChpLndpbmRvdyA9IG51bGwpLCBlLnN0YXRlID0gbnVsbCwgYWU7Cn0sIFduID0gKGUsIGkpPT57CiAgICBpZiAoIWUgfHwgIWUuc3RhdGUpIHJldHVybiBVOwogICAgbGV0IHQgPSBlLnN0YXRlOwogICAgcmV0dXJuIHQud3JhcCAmIDIgPyAodC5oZWFkID0gaSwgaS5kb25lID0gITEsIGFlKSA6IFU7Cn0sIFZuID0gKGUsIGkpPT57CiAgICBsZXQgdCA9IGkubGVuZ3RoLCBuLCBhLCBsOwogICAgcmV0dXJuICFlIHx8ICFlLnN0YXRlIHx8IChuID0gZS5zdGF0ZSwgbi53cmFwICE9PSAwICYmIG4ubW9kZSAhPT0gS2UpID8gVSA6IG4ubW9kZSA9PT0gS2UgJiYgKGEgPSAxLCBhID0gdmUoYSwgaSwgdCwgMCksIGEgIT09IG4uY2hlY2spID8gemkgOiAobCA9IExpKGUsIGksIHQsIHQpLCBsID8gKG4ubW9kZSA9IERpLCBUaSkgOiAobi5oYXZlZGljdCA9IDEsIGFlKSk7Cn0sIEpuID0gSWksIFFuID0gT2ksIHFuID0gWmksIGVsID0gWG4sIHRsID0gTmksIGlsID0gR24sIGFsID0gam4sIG5sID0gV24sIGxsID0gVm4sIHJsID0gInBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkiLCBLID0gewogICAgaW5mbGF0ZVJlc2V0OiBKbiwKICAgIGluZmxhdGVSZXNldDI6IFFuLAogICAgaW5mbGF0ZVJlc2V0S2VlcDogcW4sCiAgICBpbmZsYXRlSW5pdDogZWwsCiAgICBpbmZsYXRlSW5pdDI6IHRsLAogICAgaW5mbGF0ZTogaWwsCiAgICBpbmZsYXRlRW5kOiBhbCwKICAgIGluZmxhdGVHZXRIZWFkZXI6IG5sLAogICAgaW5mbGF0ZVNldERpY3Rpb25hcnk6IGxsLAogICAgaW5mbGF0ZUluZm86IHJsCn07CmZ1bmN0aW9uIGZsKCkgewogICAgdGhpcy50ZXh0ID0gMCwgdGhpcy50aW1lID0gMCwgdGhpcy54ZmxhZ3MgPSAwLCB0aGlzLm9zID0gMCwgdGhpcy5leHRyYSA9IG51bGwsIHRoaXMuZXh0cmFfbGVuID0gMCwgdGhpcy5uYW1lID0gIiIsIHRoaXMuY29tbWVudCA9ICIiLCB0aGlzLmhjcmMgPSAwLCB0aGlzLmRvbmUgPSAhMTsKfQp2YXIgb2wgPSBmbCwgVWkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCB7IFpfTk9fRkxVU0g6IF9sICwgWl9GSU5JU0g6IGhsICwgWl9PSzogU2UgLCBaX1NUUkVBTV9FTkQ6IGx0ICwgWl9ORUVEX0RJQ1Q6IHJ0ICwgWl9TVFJFQU1fRVJST1I6IGRsICwgWl9EQVRBX0VSUk9SOiBpaSAsIFpfTUVNX0VSUk9SOiBzbCAgfSA9IG5lOwpmdW5jdGlvbiBUZShlKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBZZS5hc3NpZ24oewogICAgICAgIGNodW5rU2l6ZTogMTAyNCAqIDY0LAogICAgICAgIHdpbmRvd0JpdHM6IDE1LAogICAgICAgIHRvOiAiIgogICAgfSwgZSB8fCB7fSk7CiAgICBsZXQgaSA9IHRoaXMub3B0aW9uczsKICAgIGkucmF3ICYmIGkud2luZG93Qml0cyA+PSAwICYmIGkud2luZG93Qml0cyA8IDE2ICYmIChpLndpbmRvd0JpdHMgPSAtaS53aW5kb3dCaXRzLCBpLndpbmRvd0JpdHMgPT09IDAgJiYgKGkud2luZG93Qml0cyA9IC0xNSkpLCBpLndpbmRvd0JpdHMgPj0gMCAmJiBpLndpbmRvd0JpdHMgPCAxNiAmJiAhKGUgJiYgZS53aW5kb3dCaXRzKSAmJiAoaS53aW5kb3dCaXRzICs9IDMyKSwgaS53aW5kb3dCaXRzID4gMTUgJiYgaS53aW5kb3dCaXRzIDwgNDggJiYgKGkud2luZG93Qml0cyAmIDE1IHx8IChpLndpbmRvd0JpdHMgfD0gMTUpKSwgdGhpcy5lcnIgPSAwLCB0aGlzLm1zZyA9ICIiLCB0aGlzLmVuZGVkID0gITEsIHRoaXMuY2h1bmtzID0gW10sIHRoaXMuc3RybSA9IG5ldyB5aSwgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7CiAgICBsZXQgdCA9IEsuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSwgaS53aW5kb3dCaXRzKTsKICAgIGlmICh0ICE9PSBTZSkgdGhyb3cgbmV3IEVycm9yKGVlW3RdKTsKICAgIGlmICh0aGlzLmhlYWRlciA9IG5ldyBvbCwgSy5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpLCBpLmRpY3Rpb25hcnkgJiYgKHR5cGVvZiBpLmRpY3Rpb25hcnkgPT0gInN0cmluZyIgPyBpLmRpY3Rpb25hcnkgPSB5ZS5zdHJpbmcyYnVmKGkuZGljdGlvbmFyeSkgOiBVaS5jYWxsKGkuZGljdGlvbmFyeSkgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIgJiYgKGkuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KGkuZGljdGlvbmFyeSkpLCBpLnJhdyAmJiAodCA9IEsuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBpLmRpY3Rpb25hcnkpLCB0ICE9PSBTZSkpKSB0aHJvdyBuZXcgRXJyb3IoZWVbdF0pOwp9ClRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZSwgaSkgewogICAgbGV0IHQgPSB0aGlzLnN0cm0sIG4gPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplLCBhID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnksIGwsIG8sIGY7CiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuICExOwogICAgZm9yKGkgPT09IH5+aSA/IG8gPSBpIDogbyA9IGkgPT09ICEwID8gaGwgOiBfbCwgVWkuY2FsbChlKSA9PT0gIltvYmplY3QgQXJyYXlCdWZmZXJdIiA/IHQuaW5wdXQgPSBuZXcgVWludDhBcnJheShlKSA6IHQuaW5wdXQgPSBlLCB0Lm5leHRfaW4gPSAwLCB0LmF2YWlsX2luID0gdC5pbnB1dC5sZW5ndGg7Oyl7CiAgICAgICAgZm9yKHQuYXZhaWxfb3V0ID09PSAwICYmICh0Lm91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pLCB0Lm5leHRfb3V0ID0gMCwgdC5hdmFpbF9vdXQgPSBuKSwgbCA9IEsuaW5mbGF0ZSh0LCBvKSwgbCA9PT0gcnQgJiYgYSAmJiAobCA9IEsuaW5mbGF0ZVNldERpY3Rpb25hcnkodCwgYSksIGwgPT09IFNlID8gbCA9IEsuaW5mbGF0ZSh0LCBvKSA6IGwgPT09IGlpICYmIChsID0gcnQpKTsgdC5hdmFpbF9pbiA+IDAgJiYgbCA9PT0gbHQgJiYgdC5zdGF0ZS53cmFwID4gMCAmJiBlW3QubmV4dF9pbl0gIT09IDA7KUsuaW5mbGF0ZVJlc2V0KHQpLCBsID0gSy5pbmZsYXRlKHQsIG8pOwogICAgICAgIHN3aXRjaChsKXsKICAgICAgICAgICAgY2FzZSBkbDoKICAgICAgICAgICAgY2FzZSBpaToKICAgICAgICAgICAgY2FzZSBydDoKICAgICAgICAgICAgY2FzZSBzbDoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uRW5kKGwpLCB0aGlzLmVuZGVkID0gITAsICExOwogICAgICAgIH0KICAgICAgICBpZiAoZiA9IHQuYXZhaWxfb3V0LCB0Lm5leHRfb3V0ICYmICh0LmF2YWlsX291dCA9PT0gMCB8fCBsID09PSBsdCkpIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGxldCBjID0geWUudXRmOGJvcmRlcih0Lm91dHB1dCwgdC5uZXh0X291dCksIHIgPSB0Lm5leHRfb3V0IC0gYywgXyA9IHllLmJ1ZjJzdHJpbmcodC5vdXRwdXQsIGMpOwogICAgICAgICAgICB0Lm5leHRfb3V0ID0gciwgdC5hdmFpbF9vdXQgPSBuIC0gciwgciAmJiB0Lm91dHB1dC5zZXQodC5vdXRwdXQuc3ViYXJyYXkoYywgYyArIHIpLCAwKSwgdGhpcy5vbkRhdGEoXyk7CiAgICAgICAgfSBlbHNlIHRoaXMub25EYXRhKHQub3V0cHV0Lmxlbmd0aCA9PT0gdC5uZXh0X291dCA/IHQub3V0cHV0IDogdC5vdXRwdXQuc3ViYXJyYXkoMCwgdC5uZXh0X291dCkpOwogICAgICAgIGlmICghKGwgPT09IFNlICYmIGYgPT09IDApKSB7CiAgICAgICAgICAgIGlmIChsID09PSBsdCkgcmV0dXJuIGwgPSBLLmluZmxhdGVFbmQodGhpcy5zdHJtKSwgdGhpcy5vbkVuZChsKSwgdGhpcy5lbmRlZCA9ICEwLCAhMDsKICAgICAgICAgICAgaWYgKHQuYXZhaWxfaW4gPT09IDApIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAhMDsKfTsKVGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuY2h1bmtzLnB1c2goZSk7Cn07ClRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKGUpIHsKICAgIGUgPT09IFNlICYmICh0aGlzLm9wdGlvbnMudG8gPT09ICJzdHJpbmciID8gdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCIiKSA6IHRoaXMucmVzdWx0ID0gWWUuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLCB0aGlzLmNodW5rcyA9IFtdLCB0aGlzLmVyciA9IGUsIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZzsKfTsKZnVuY3Rpb24gd3QoZSwgaSkgewogICAgbGV0IHQgPSBuZXcgVGUoaSk7CiAgICBpZiAodC5wdXNoKGUpLCB0LmVycikgdGhyb3cgdC5tc2cgfHwgZWVbdC5lcnJdOwogICAgcmV0dXJuIHQucmVzdWx0Owp9CmZ1bmN0aW9uIGNsKGUsIGkpIHsKICAgIHJldHVybiBpID0gaSB8fCB7fSwgaS5yYXcgPSAhMCwgd3QoZSwgaSk7Cn0KdmFyIHVsID0gVGUsIGJsID0gd3QsIHdsID0gY2wsIGdsID0gd3QsIHBsID0gbmUsIHhsID0gewogICAgSW5mbGF0ZTogdWwsCiAgICBpbmZsYXRlOiBibCwKICAgIGluZmxhdGVSYXc6IHdsLAogICAgdW5nemlwOiBnbCwKICAgIGNvbnN0YW50czogcGwKfSwgeyBEZWZsYXRlOiBrbCAsIGRlZmxhdGU6IHZsICwgZGVmbGF0ZVJhdzogRWwgLCBnemlwOiB5bCAgfSA9IFJuLCB7IEluZmxhdGU6IFNsICwgaW5mbGF0ZTogQWwgLCBpbmZsYXRlUmF3OiBSbCAsIHVuZ3ppcDogemwgIH0gPSB4bCwgbWwgPSB2bCwgT2wgPSBBbDsKY29uc3QgVXBkYXRlT2JzZXJ2YWJsZSA9ICIwIjsKY2xhc3MgUmV0YWluIHsKICAgIGNvbnN0cnVjdG9yKHZhbHVlKXsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICB9Cn0KY29uc3QgT25qc0NhbGxiYWNrID0gIjEiOwpjb25zdCBFdmFsSmF2YXNjcmlwdCA9ICIyIjsKY29uc3QgSmF2YXNjcmlwdEVycm9yID0gIjMiOwpjb25zdCBKYXZhc2NyaXB0V2FybmluZyA9ICI0IjsKY29uc3QgUmVnaXN0ZXJPYnNlcnZhYmxlID0gIjUiOwpjb25zdCBKU0RvbmVMb2FkaW5nID0gIjgiOwpjb25zdCBGdXNlZE1lc3NhZ2UgPSAiOSI7CmNvbnN0IENsb3NlU2Vzc2lvbiA9ICIxMCI7CmNvbnN0IFBpbmdQb25nID0gIjExIjsKY29uc3QgVXBkYXRlU2Vzc2lvbiA9ICIxMiI7CmNvbnN0IFBJTkdfSU5URVJWQUwgPSA1MDAwOwpmdW5jdGlvbiBjbGVhbl9zdGFjayhzdGFjaykgewogICAgcmV0dXJuIHN0YWNrLnJlcGxhY2VBbGwoLyhkYXRhOlx3K1wvXHcrO2Jhc2U2NCwpW2EtekEtWjAtOVwrXC89XSs6L2csICIkMTw8QkFTRTY0Pj46Iik7Cn0KY29uc3QgQ29ubmVjdGlvblN0YXR1cyA9IHsKICAgIENPTk5FQ1RJTkc6ICJjb25uZWN0aW5nIiwKICAgIENPTk5FQ1RFRDogImNvbm5lY3RlZCIsCiAgICBESVNDT05ORUNURUQ6ICJkaXNjb25uZWN0ZWQiLAogICAgTk9fQ09OTkVDVElPTjogIm5vX2Nvbm5lY3Rpb24iCn07CmNvbnN0IENPTk5FQ1RJT04gPSB7CiAgICBzZW5kX21lc3NhZ2U6IHVuZGVmaW5lZCwKICAgIHF1ZXVlOiBbXSwKICAgIHN0YXR1czogImNvbm5lY3RpbmciLAogICAgY29tcHJlc3Npb25fZW5hYmxlZDogZmFsc2UsCiAgICBsYXN0UGluZzogRGF0ZS5ub3coKSwKICAgIGluZGljYXRvcjogbnVsbAp9OwpmdW5jdGlvbiByZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcihpbmRpY2F0b3IpIHsKICAgIENPTk5FQ1RJT04uaW5kaWNhdG9yID0gaW5kaWNhdG9yOwogICAgbm90aWZ5X2luZGljYXRvcl9zdGF0dXMoKTsKfQpmdW5jdGlvbiB1bnJlZ2lzdGVyX2Nvbm5lY3Rpb25faW5kaWNhdG9yKCkgewogICAgQ09OTkVDVElPTi5pbmRpY2F0b3IgPSBudWxsOwp9CmZ1bmN0aW9uIHNldF9ub19jb25uZWN0aW9uKCkgewogICAgQ09OTkVDVElPTi5zdGF0dXMgPSAibm9fY29ubmVjdGlvbiI7CiAgICBub3RpZnlfaW5kaWNhdG9yX3N0YXR1cygpOwp9CmZ1bmN0aW9uIG5vdGlmeV9pbmRpY2F0b3Jfc3RhdHVzKCkgewogICAgaWYgKENPTk5FQ1RJT04uaW5kaWNhdG9yICYmIHR5cGVvZiBDT05ORUNUSU9OLmluZGljYXRvci5vblN0YXR1c0NoYW5nZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGxldCBzdGF0dXM7CiAgICAgICAgaWYgKENPTk5FQ1RJT04uc3RhdHVzID09PSAibm9fY29ubmVjdGlvbiIpIHsKICAgICAgICAgICAgc3RhdHVzID0gQ29ubmVjdGlvblN0YXR1cy5OT19DT05ORUNUSU9OOwogICAgICAgIH0gZWxzZSBpZiAoQ09OTkVDVElPTi5zdGF0dXMgPT09ICJvcGVuIikgewogICAgICAgICAgICBzdGF0dXMgPSBDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRDsKICAgICAgICB9IGVsc2UgaWYgKENPTk5FQ1RJT04uc3RhdHVzID09PSAiY29ubmVjdGluZyIpIHsKICAgICAgICAgICAgc3RhdHVzID0gQ29ubmVjdGlvblN0YXR1cy5DT05ORUNUSU5HOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXR1cyA9IENvbm5lY3Rpb25TdGF0dXMuRElTQ09OTkVDVEVEOwogICAgICAgIH0KICAgICAgICBDT05ORUNUSU9OLmluZGljYXRvci5vblN0YXR1c0NoYW5nZShzdGF0dXMpOwogICAgfQp9CmZ1bmN0aW9uIG9uX2Nvbm5lY3Rpb25fY29ubmVjdGluZygpIHsKICAgIENPTk5FQ1RJT04uc3RhdHVzID0gImNvbm5lY3RpbmciOwogICAgbm90aWZ5X2luZGljYXRvcl9zdGF0dXMoKTsKfQpmdW5jdGlvbiBvbl9jb25uZWN0aW9uX29wZW4oc2VuZF9tZXNzYWdlX2NhbGxiYWNrLCBjb21wcmVzc2lvbl9lbmFibGVkLCBlbmFibGVfcGluZ3MgPSB0cnVlKSB7CiAgICBDT05ORUNUSU9OLnNlbmRfbWVzc2FnZSA9IHNlbmRfbWVzc2FnZV9jYWxsYmFjazsKICAgIENPTk5FQ1RJT04uc3RhdHVzID0gIm9wZW4iOwogICAgQ09OTkVDVElPTi5jb21wcmVzc2lvbl9lbmFibGVkID0gY29tcHJlc3Npb25fZW5hYmxlZDsKICAgIG5vdGlmeV9pbmRpY2F0b3Jfc3RhdHVzKCk7CiAgICBDT05ORUNUSU9OLnF1ZXVlLmZvckVhY2goKG1lc3NhZ2UpPT5zZW5kX3RvX2p1bGlhKG1lc3NhZ2UpKTsKICAgIGlmIChlbmFibGVfcGluZ3MpIHsKICAgICAgICBzZW5kX3BpbmdzKCk7CiAgICB9Cn0KZnVuY3Rpb24gb25fY29ubmVjdGlvbl9jbG9zZSgpIHsKICAgIENPTk5FQ1RJT04uc3RhdHVzID0gImNsb3NlZCI7CiAgICBub3RpZnlfaW5kaWNhdG9yX3N0YXR1cygpOwp9CmZ1bmN0aW9uIGNhbl9zZW5kX3RvX2p1bGlhKCkgewogICAgcmV0dXJuIENPTk5FQ1RJT04uc3RhdHVzID09PSAib3BlbiI7Cn0KZnVuY3Rpb24gaXNfanVsaWFfcmVzcG9uc2l2ZSgpIHsKICAgIHJldHVybiBEYXRlLm5vdygpIC0gQ09OTkVDVElPTi5sYXN0UGluZyA8IDIgKiA1MDAwOwp9CmNsYXNzIFVucGFja0NvbnRleHQgewogICAgY29uc3RydWN0b3Ioc2Vzc2lvbl9pZCwgc2Vzc2lvbl9zdGF0dXMpewogICAgICAgIHRoaXMuc2Vzc2lvbl9pZCA9IHNlc3Npb25faWQ7CiAgICAgICAgdGhpcy5zZXNzaW9uX3N0YXR1cyA9IHNlc3Npb25fc3RhdHVzOwogICAgfQp9CmNvbnN0IEVYVEVOU0lPTl9DT0RFQyA9IG5ldyBFeHRlbnNpb25Db2RlYygpOwp3aW5kb3cuRVhURU5TSU9OX0NPREVDID0gRVhURU5TSU9OX0NPREVDOwpmdW5jdGlvbiB1bnBhY2sodWludDhhcnJheSwgY29udGV4dCkgewogICAgcmV0dXJuIGRlY29kZSh1aW50OGFycmF5LCB7CiAgICAgICAgZXh0ZW5zaW9uQ29kZWM6IEVYVEVOU0lPTl9DT0RFQywKICAgICAgICBjb250ZXh0CiAgICB9KTsKfQpmdW5jdGlvbiBwYWNrKG9iamVjdCkgewogICAgcmV0dXJuIGVuY29kZShvYmplY3QsIHsKICAgICAgICBleHRlbnNpb25Db2RlYzogRVhURU5TSU9OX0NPREVDCiAgICB9KTsKfQpmdW5jdGlvbiByZWludGVycHJldF9hcnJheShBcnJheVR5cGUsIHVpbnQ4YXJyYXkpIHsKICAgIGlmIChBcnJheVR5cGUgPT09IFVpbnQ4QXJyYXkpIHsKICAgICAgICByZXR1cm4gdWludDhhcnJheTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYm8gPSB1aW50OGFycmF5LmJ5dGVPZmZzZXQ7CiAgICAgICAgY29uc3QgYnBlID0gQXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgIGNvbnN0IG5ld19hcnJheV9sZW5ndGggPSB1aW50OGFycmF5LmJ5dGVMZW5ndGggLyBicGU7CiAgICAgICAgY29uc3QgYnVmZmVyID0gdWludDhhcnJheS5idWZmZXIuc2xpY2UoYm8sIGJvICsgdWludDhhcnJheS5ieXRlTGVuZ3RoKTsKICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShidWZmZXIsIDAsIG5ld19hcnJheV9sZW5ndGgpOwogICAgfQp9CmZ1bmN0aW9uIHJlZ2lzdGVyX2V4dF9hcnJheSh0eXBlX3RhZywgYXJyYXlfdHlwZSkgewogICAgRVhURU5TSU9OX0NPREVDLnJlZ2lzdGVyKHsKICAgICAgICB0eXBlOiB0eXBlX3RhZywKICAgICAgICBkZWNvZGU6ICh1aW50OGFycmF5KT0+cmVpbnRlcnByZXRfYXJyYXkoYXJyYXlfdHlwZSwgdWludDhhcnJheSksCiAgICAgICAgZW5jb2RlOiAob2JqZWN0KT0+ewogICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgYXJyYXlfdHlwZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG9iamVjdC5idWZmZXIsIG9iamVjdC5ieXRlT2Zmc2V0LCBvYmplY3QuYnl0ZUxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwp9CnJlZ2lzdGVyX2V4dF9hcnJheSgweDExLCBJbnQ4QXJyYXkpOwpyZWdpc3Rlcl9leHRfYXJyYXkoMHgxMiwgVWludDhBcnJheSk7CnJlZ2lzdGVyX2V4dF9hcnJheSgweDEzLCBJbnQxNkFycmF5KTsKcmVnaXN0ZXJfZXh0X2FycmF5KDB4MTQsIFVpbnQxNkFycmF5KTsKcmVnaXN0ZXJfZXh0X2FycmF5KDB4MTUsIEludDMyQXJyYXkpOwpyZWdpc3Rlcl9leHRfYXJyYXkoMHgxNiwgVWludDMyQXJyYXkpOwpyZWdpc3Rlcl9leHRfYXJyYXkoMHgxNywgRmxvYXQzMkFycmF5KTsKcmVnaXN0ZXJfZXh0X2FycmF5KDB4MTgsIEZsb2F0NjRBcnJheSk7CmZ1bmN0aW9uIHJlZ2lzdGVyX2V4dCh0eXBlX3RhZywgZGVjb2RlLCBlbmNvZGUpIHsKICAgIEVYVEVOU0lPTl9DT0RFQy5yZWdpc3Rlcih7CiAgICAgICAgdHlwZTogdHlwZV90YWcsCiAgICAgICAgZGVjb2RlOiAoZGF0YSwgZXh0VHlwZSwgY29udGV4dCk9PmRlY29kZShkYXRhLCBjb250ZXh0KSwKICAgICAgICBlbmNvZGUKICAgIH0pOwp9CmNsYXNzIEpMQXJyYXkgewogICAgY29uc3RydWN0b3Ioc2l6ZSwgYXJyYXkpewogICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CiAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwogICAgfQp9CnJlZ2lzdGVyX2V4dCg5OSwgKHVpbnRfOF9hcnJheSwgY29udGV4dCk9PnsKICAgIGNvbnN0IFtzaXplLCBhcnJheV0gPSB1bnBhY2sodWludF84X2FycmF5LCBjb250ZXh0KTsKICAgIHJldHVybiBuZXcgSkxBcnJheShzaXplLCBhcnJheSk7Cn0sIChvYmplY3QpPT57CiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSkxBcnJheSkgewogICAgICAgIHJldHVybiBwYWNrKFsKICAgICAgICAgICAgb2JqZWN0LnNpemUsCiAgICAgICAgICAgIG9iamVjdC5hcnJheQogICAgICAgIF0pOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfSk7CmNvbnN0IFNFU1NJT05TID0ge307CmNvbnN0IEdMT0JBTF9PQkpFQ1RfQ0FDSEUgPSB7fTsKY29uc3QgT0JKRUNUX0ZSRUVJTkdfTE9DSyA9IG5ldyBsKHsKICAgIGNvbmN1cnJlbmN5OiAxCn0pOwpmdW5jdGlvbiBsb2NrX2xvYWRpbmcoZikgewogICAgT0JKRUNUX0ZSRUVJTkdfTE9DSy5hZGQoZik7Cn0KZnVuY3Rpb24gbG9va3VwX2dsb2JhbF9vYmplY3Qoa2V5KSB7CiAgICBjb25zdCBvYmplY3QgPSBHTE9CQUxfT0JKRUNUX0NBQ0hFW2tleV07CiAgICBpZiAob2JqZWN0KSB7CiAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJldGFpbikgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgfQogICAgfQogICAgY29uc29sZS53YXJuKGBLZXkgJHtrZXl9IG5vdCBmb3VuZCEgJHtvYmplY3R9YCk7CiAgICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBzZW5kX3Bpbmdwb25nKCkgewogICAgc2VuZF90b19qdWxpYSh7CiAgICAgICAgbXNnX3R5cGU6IFBpbmdQb25nCiAgICB9KTsKfQpsZXQgdGltZW91dCA9IG51bGw7CmZ1bmN0aW9uIGlzX3N0aWxsX3JlZmVyZW5jZWQoaWQpIHsKICAgIGZvcihjb25zdCBzZXNzaW9uX2lkIGluIFNFU1NJT05TKXsKICAgICAgICBjb25zdCBbdHJhY2tlZF9vYmplY3RzLCBhbGxvd19kZWxldGVdID0gU0VTU0lPTlNbc2Vzc2lvbl9pZF07CiAgICAgICAgaWYgKGFsbG93X2RlbGV0ZSAmJiB0cmFja2VkX29iamVjdHMuaGFzKGlkKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gZm9yY2VfZnJlZV9vYmplY3QoaWQpIHsKICAgIGZvcihjb25zdCBzZXNzaW9uX2lkIGluIFNFU1NJT05TKXsKICAgICAgICBjb25zdCBbdHJhY2tlZF9vYmplY3RzLCBhbGxvd19kZWxldGVdID0gU0VTU0lPTlNbc2Vzc2lvbl9pZF07CiAgICAgICAgdHJhY2tlZF9vYmplY3RzLmRlbGV0ZShpZCk7CiAgICB9CiAgICBkZWxldGUgR0xPQkFMX09CSkVDVF9DQUNIRVtpZF07Cn0KZnVuY3Rpb24gZnJlZV9vYmplY3QoaWQpIHsKICAgIGNvbnN0IGRhdGEgPSBHTE9CQUxfT0JKRUNUX0NBQ0hFW2lkXTsKICAgIGlmIChkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBQcm9taXNlKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBSZXRhaW4pIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX3N0aWxsX3JlZmVyZW5jZWQoaWQpKSB7CiAgICAgICAgICAgIGRlbGV0ZSBHTE9CQUxfT0JKRUNUX0NBQ0hFW2lkXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oYFRyeWluZyB0byBkZWxldGUgb2JqZWN0ICR7aWR9LCB3aGljaCBpcyBub3QgaW4gZ2xvYmFsIHNlc3Npb24gY2FjaGUuYCk7CiAgICB9CiAgICByZXR1cm47Cn0KbGV0IERFTEVURV9PQlNFUlZFUiA9IHVuZGVmaW5lZDsKZnVuY3Rpb24gdHJhY2tfZGVsZXRlZF9zZXNzaW9ucygpIHsKICAgIGlmICghREVMRVRFX09CU0VSVkVSKSB7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKICAgICAgICAgICAgbGV0IHJlbW92YWxfb2NjdXJlZCA9IGZhbHNlOwogICAgICAgICAgICBjb25zdCB0b19kZWxldGUgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbik9PnsKICAgICAgICAgICAgICAgIG11dGF0aW9uLnJlbW92ZWROb2Rlcy5mb3JFYWNoKCh4KT0+ewogICAgICAgICAgICAgICAgICAgIGlmICh4LmlkIGluIFNFU1NJT05TKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IFNFU1NJT05TW3guaWRdWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAiZGVsZXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fZGVsZXRlLmFkZCh4LmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92YWxfb2NjdXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVtb3ZhbF9vY2N1cmVkKSB7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhTRVNTSU9OUykuZm9yRWFjaCgoaWQpPT57CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gU0VTU0lPTlNbaWRdWzFdOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICJkZWxldGUiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBhZGRpbmcgc2Vzc2lvbiB0byBkZWxldGUgY2FuZGlkYXRlczogJHtpZH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX2RlbGV0ZS5hZGQoaWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9fZGVsZXRlLmZvckVhY2goKGlkKT0+ewogICAgICAgICAgICAgICAgY2xvc2Vfc2Vzc2lvbihpZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHsKICAgICAgICAgICAgYXR0cmlidXRlczogZmFsc2UsCiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogZmFsc2UsCiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUKICAgICAgICB9KTsKICAgICAgICBERUxFVEVfT0JTRVJWRVIgPSBvYnNlcnZlcjsKICAgIH0KfQpmdW5jdGlvbiBzZW5kX3BpbmdzKCkgewogICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwogICAgaWYgKCFjYW5fc2VuZF90b19qdWxpYSgpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc2VuZF9waW5ncG9uZygpOwogICAgdGltZW91dCA9IHNldFRpbWVvdXQoc2VuZF9waW5ncywgUElOR19JTlRFUlZBTCk7Cn0KZnVuY3Rpb24gc2VuZF9lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pIHsKICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7CiAgICBjb25zb2xlLmVycm9yKGV4Y2VwdGlvbik7CiAgICBzZW5kX3RvX2p1bGlhKHsKICAgICAgICBtc2dfdHlwZTogSmF2YXNjcmlwdEVycm9yLAogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgZXhjZXB0aW9uOiBTdHJpbmcoZXhjZXB0aW9uKSwKICAgICAgICBzdGFja3RyYWNlOiBleGNlcHRpb24gPT09IG51bGwgPyAiIiA6IGNsZWFuX3N0YWNrKGV4Y2VwdGlvbi5zdGFjaykKICAgIH0pOwp9CmZ1bmN0aW9uIHNlbmRfZG9uZV9sb2FkaW5nKHNlc3Npb24sIGV4Y2VwdGlvbikgewogICAgc2VuZF90b19qdWxpYSh7CiAgICAgICAgbXNnX3R5cGU6IEpTRG9uZUxvYWRpbmcsCiAgICAgICAgc2Vzc2lvbiwKICAgICAgICBtZXNzYWdlOiAiIiwKICAgICAgICBleGNlcHRpb246IGV4Y2VwdGlvbiA9PT0gbnVsbCA/ICJub3RoaW5nIiA6IFN0cmluZyhleGNlcHRpb24pLAogICAgICAgIHN0YWNrdHJhY2U6IGV4Y2VwdGlvbiA9PT0gbnVsbCA/ICIiIDogY2xlYW5fc3RhY2soZXhjZXB0aW9uLnN0YWNrKQogICAgfSk7Cn0KZnVuY3Rpb24gZG9uZV9pbml0aWFsaXppbmdfc2Vzc2lvbihzZXNzaW9uX2lkKSB7CiAgICBpZiAoIShzZXNzaW9uX2lkIGluIFNFU1NJT05TKSkgewogICAgICAgIGNvbnNvbGUud2FybihgU2Vzc2lvbiAke3Nlc3Npb25faWR9IGdvdCBkZWxldGVkIGJlZm9yZSBkb25lIGluaXRpYWxpemluZyFgKTsKICAgICAgICBzZW5kX2RvbmVfbG9hZGluZyhzZXNzaW9uX2lkLCBuZXcgRXJyb3IoIlNlc3Npb24gZGVsZXRlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIikpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHNlbmRfZG9uZV9sb2FkaW5nKHNlc3Npb25faWQsIG51bGwpOwogICAgaWYgKFNFU1NJT05TW3Nlc3Npb25faWRdWzFdICE9ICJyb290IikgewogICAgICAgIFNFU1NJT05TW3Nlc3Npb25faWRdWzFdID0gImRlbGV0ZSI7CiAgICB9Cn0KZnVuY3Rpb24gaW5pdF9zZXNzaW9uX2Zyb21fbXNncyhzZXNzaW9uX2lkLCBtZXNzYWdlcykgewogICAgdHJ5IHsKICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKHByb2Nlc3NfbWVzc2FnZSk7CiAgICAgICAgZG9uZV9pbml0aWFsaXppbmdfc2Vzc2lvbihzZXNzaW9uX2lkKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgc2VuZF9kb25lX2xvYWRpbmcoc2Vzc2lvbl9pZCwgZXJyb3IpOwogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQp9CnJlZ2lzdGVyX2V4dCgxMDIsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBbaW50ZXJwb2xhdGVkX29iamVjdHMsIHNvdXJjZSwganVsaWFfZmlsZV0gPSB1bnBhY2sodWludF84X2FycmF5LCBjb250ZXh0KTsKICAgIGNvbnN0IGxvb2t1cF9pbnRlcnBvbGF0ZWQgPSAoaWQpPT5pbnRlcnBvbGF0ZWRfb2JqZWN0c1tpZF07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGV2YWxfZnVuYyA9IG5ldyBGdW5jdGlvbigiX19sb29rdXBfaW50ZXJwb2xhdGVkIiwgIkJvbml0byIsIHNvdXJjZSk7CiAgICAgICAgcmV0dXJuICgpPT57CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXZhbF9mdW5jKGxvb2t1cF9pbnRlcnBvbGF0ZWQsIHdpbmRvdy5Cb25pdG8pOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBpbiBjbG9zdXJlIGZyb206ICR7anVsaWFfZmlsZX1gKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTb3VyY2U6YCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzb3VyY2UpOwogICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBpbiBjbG9zdXJlIGZyb206ICR7anVsaWFfZmlsZX1gKTsKICAgICAgICBjb25zb2xlLmxvZyhgU291cmNlOmApOwogICAgICAgIGNvbnNvbGUubG9nKHNvdXJjZSk7CiAgICAgICAgdGhyb3cgZXJyOwogICAgfQp9KTsKZnVuY3Rpb24gZW5jb2RlX2JpbmFyeShkYXRhLCBjb21wcmVzc2lvbl9lbmFibGVkKSB7CiAgICBpZiAoY29tcHJlc3Npb25fZW5hYmxlZCkgewogICAgICAgIHJldHVybiBtbChwYWNrKGRhdGEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhY2soZGF0YSk7CiAgICB9Cn0KZnVuY3Rpb24gc2VuZF90b19qdWxpYShtZXNzYWdlKSB7CiAgICBjb25zdCB7IHNlbmRfbWVzc2FnZSAsIHN0YXR1cyAsIGNvbXByZXNzaW9uX2VuYWJsZWQgIH0gPSBDT05ORUNUSU9OOwogICAgaWYgKHNlbmRfbWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyA9PT0gIm9wZW4iKSB7CiAgICAgICAgc2VuZF9tZXNzYWdlKGVuY29kZV9iaW5hcnkobWVzc2FnZSwgY29tcHJlc3Npb25fZW5hYmxlZCkpOwogICAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICJjb25uZWN0aW5nIikgewogICAgICAgIENPTk5FQ1RJT04ucXVldWUucHVzaChtZXNzYWdlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uc29sZS5sb2coc3RhdHVzKTsKICAgICAgICBjb25zb2xlLmxvZygiVHJ5aW5nIHRvIHNlbmQgbWVzc2FnZXMgd2hpbGUgY29ubmVjdGlvbiBpcyBvZmZsaW5lIik7CiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7CiAgICB9Cn0KY2xhc3MgT2JzZXJ2YWJsZSB7CiAgICAjY2FsbGJhY2tzID0gW107CiAgICBjb25zdHJ1Y3RvcihpZCwgdmFsdWUpewogICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICB9CiAgICBub3RpZnkodmFsdWUsIGRvbnRfbm90aWZ5X2p1bGlhKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuI2NhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjayk9PnsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IGRlcmVnaXN0ZXIgPSBjYWxsYmFjayh2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAoZGVyZWdpc3RlciA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zcGxpY2UodGhpcy4jY2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7CiAgICAgICAgICAgICAgICBzZW5kX2Vycm9yKCJFcnJvciBkdXJpbmcgcnVubmluZyBvbmpzIGNhbGxiYWNrXG4iICsgIkNhbGxiYWNrOlxuIiArIGNhbGxiYWNrLnRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoIWRvbnRfbm90aWZ5X2p1bGlhKSB7CiAgICAgICAgICAgIHNlbmRfdG9fanVsaWEoewogICAgICAgICAgICAgICAgbXNnX3R5cGU6IFVwZGF0ZU9ic2VydmFibGUsCiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCwKICAgICAgICAgICAgICAgIHBheWxvYWQ6IHZhbHVlCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIG9uKGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy4jY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogICAgfQp9CmZ1bmN0aW9uIGNsb3NlX3Nlc3Npb24oc2Vzc2lvbl9pZCkgewogICAgY29uc3Qgc2Vzc2lvbiA9IFNFU1NJT05TW3Nlc3Npb25faWRdOwogICAgaWYgKCFzZXNzaW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJkb3VibGUgZnJlZWluZyBzZXNzaW9uIGZyb20gSlMhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgW3Nlc3Npb25fb2JqZWN0cywgc3RhdHVzXSA9IHNlc3Npb247CiAgICBjb25zdCByb290X25vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXNzaW9uX2lkKTsKICAgIGlmIChyb290X25vZGUpIHsKICAgICAgICByb290X25vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICByb290X25vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyb290X25vZGUpOwogICAgfQogICAgaWYgKHN0YXR1cyA9PT0gImRlbGV0ZSIpIHsKICAgICAgICBzZW5kX2Nsb3NlX3Nlc3Npb24oc2Vzc2lvbl9pZCwgc3RhdHVzKTsKICAgICAgICBTRVNTSU9OU1tzZXNzaW9uX2lkXSA9IFsKICAgICAgICAgICAgc2Vzc2lvbl9vYmplY3RzLAogICAgICAgICAgICBmYWxzZQogICAgICAgIF07CiAgICB9CiAgICByZXR1cm47Cn0KZnVuY3Rpb24gZnJlZV9zZXNzaW9uKHNlc3Npb25faWQpIHsKICAgIGxvY2tfbG9hZGluZygoKT0+ewogICAgICAgIGNvbnN0IHNlc3Npb24gPSBTRVNTSU9OU1tzZXNzaW9uX2lkXTsKICAgICAgICBpZiAoIXNlc3Npb24pIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJkb3VibGUgZnJlZWluZyBzZXNzaW9uIGZyb20gSnVsaWEhIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgW3RyYWNrZWRfb2JqZWN0cywgc3RhdHVzXSA9IHNlc3Npb247CiAgICAgICAgZGVsZXRlIFNFU1NJT05TW3Nlc3Npb25faWRdOwogICAgICAgIHRyYWNrZWRfb2JqZWN0cy5mb3JFYWNoKGZyZWVfb2JqZWN0KTsKICAgICAgICB0cmFja2VkX29iamVjdHMuY2xlYXIoKTsKICAgIH0pOwp9CmZ1bmN0aW9uIG9uX25vZGVfYXZhaWxhYmxlKG5vZGVfaWQsIHRpbWVvdXQsIG1heF90aW1lb3V0ID0gMzAwMDApIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+ewogICAgICAgIGxldCBlbGFwc2VkID0gMDsKICAgICAgICBmdW5jdGlvbiB0ZXN0X25vZGUoY3VycmVudF90aW1lb3V0KSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1qc2NhbGwtaWQ9JyR7bm9kZV9pZH0nXWApOwogICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgcmVzb2x2ZShub2RlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVsYXBzZWQgKz0gY3VycmVudF90aW1lb3V0OwogICAgICAgICAgICAgICAgaWYgKGVsYXBzZWQgPiBtYXhfdGltZW91dCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVvdXQgd2FpdGluZyBmb3IgRE9NIG5vZGUgd2l0aCBkYXRhLWpzY2FsbC1pZD0nJHtub2RlX2lkfScgYWZ0ZXIgJHttYXhfdGltZW91dH1tc2ApKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBuZXdfdGltZW91dCA9IE1hdGgubWluKGN1cnJlbnRfdGltZW91dCAqIDIsIDEwMDApOwogICAgICAgICAgICAgICAgc2V0VGltZW91dCh0ZXN0X25vZGUsIG5ld190aW1lb3V0LCBuZXdfdGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGVzdF9ub2RlKHRpbWVvdXQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdXBkYXRlX29yX3JlcGxhY2Uobm9kZSwgbmV3X2h0bWwsIHJlcGxhY2UpIHsKICAgIGlmIChyZXBsYWNlKSB7CiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdfaHRtbCwgbm9kZSk7CiAgICB9IGVsc2UgewogICAgICAgIHdoaWxlKG5vZGUuY2hpbGRFbGVtZW50Q291bnQgPiAwKXsKICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpOwogICAgICAgIH0KICAgICAgICBub2RlLmFwcGVuZChuZXdfaHRtbCk7CiAgICB9Cn0KZnVuY3Rpb24gZW5zdXJlX3Nlc3Npb25fZXhpc3RzKHNlc3Npb25faWQsIHNlc3Npb25fc3RhdHVzKSB7CiAgICBpZiAoIShzZXNzaW9uX2lkIGluIFNFU1NJT05TKSkgewogICAgICAgIFNFU1NJT05TW3Nlc3Npb25faWRdID0gWwogICAgICAgICAgICBuZXcgU2V0KCksCiAgICAgICAgICAgIHNlc3Npb25fc3RhdHVzCiAgICAgICAgXTsKICAgIH0KfQpmdW5jdGlvbiB1cGRhdGVfc2Vzc2lvbl9kb20obWVzc2FnZSkgewogICAgbG9ja19sb2FkaW5nKCgpPT57CiAgICAgICAgY29uc3QgeyBzZXNzaW9uX2lkICwgc2Vzc2lvbl9zdGF0dXMgLCBtZXNzYWdlcyAsIGh0bWwgLCBkb21fbm9kZV9zZWxlY3RvciAsIHJlcGxhY2UgIH0gPSBtZXNzYWdlOwogICAgICAgIGVuc3VyZV9zZXNzaW9uX2V4aXN0cyhzZXNzaW9uX2lkLCBzZXNzaW9uX3N0YXR1cyB8fCAic3ViIik7CiAgICAgICAgcmV0dXJuIG9uX25vZGVfYXZhaWxhYmxlKGRvbV9ub2RlX3NlbGVjdG9yLCAxKS50aGVuKChkb20pPT57CiAgICAgICAgICAgIHVwZGF0ZV9vcl9yZXBsYWNlKGRvbSwgaHRtbCwgcmVwbGFjZSk7CiAgICAgICAgICAgIGluaXRfc2Vzc2lvbl9mcm9tX21zZ3Moc2Vzc2lvbl9pZCwgbWVzc2FnZXMpOwogICAgICAgIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgICAgc2VuZF9kb25lX2xvYWRpbmcoc2Vzc2lvbl9pZCwgZXJyb3IpOwogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gdHJhY2tfaW5fc2Vzc2lvbihzZXNzaW9uX2lkLCBrZXksIHNlc3Npb25fc3RhdHVzKSB7CiAgICBlbnN1cmVfc2Vzc2lvbl9leGlzdHMoc2Vzc2lvbl9pZCwgc2Vzc2lvbl9zdGF0dXMpOwogICAgY29uc3QgdHJhY2tlZF9vYmplY3RzID0gU0VTU0lPTlNbc2Vzc2lvbl9pZF1bMF07CiAgICB0cmFja2VkX29iamVjdHMuYWRkKGtleSk7CiAgICBpZiAoIShrZXkgaW4gR0xPQkFMX09CSkVDVF9DQUNIRSkpIHsKICAgICAgICBjb25zb2xlLndhcm4oYFRyYWNraW5nT25seTogS2V5ICR7a2V5fSBub3QgZm91bmQgaW4gR0xPQkFMX09CSkVDVF9DQUNIRWApOwogICAgfQp9CmZ1bmN0aW9uIHJlZ2lzdGVyX2luX3Nlc3Npb25fY2FjaGUoc2Vzc2lvbl9pZCwga2V5LCBvYmplY3QsIHNlc3Npb25fc3RhdHVzKSB7CiAgICBlbnN1cmVfc2Vzc2lvbl9leGlzdHMoc2Vzc2lvbl9pZCwgc2Vzc2lvbl9zdGF0dXMpOwogICAgY29uc3QgdHJhY2tlZF9vYmplY3RzID0gU0VTU0lPTlNbc2Vzc2lvbl9pZF1bMF07CiAgICB0cmFja2VkX29iamVjdHMuYWRkKGtleSk7CiAgICBpZiAoIShrZXkgaW4gR0xPQkFMX09CSkVDVF9DQUNIRSkpIHsKICAgICAgICBHTE9CQUxfT0JKRUNUX0NBQ0hFW2tleV0gPSBvYmplY3Q7CiAgICB9Cn0KZnVuY3Rpb24gdXBkYXRlX3Nlc3Npb25fY2FjaGUoc2Vzc2lvbl9pZCwgbmV3X2psX29iamVjdHMsIHNlc3Npb25fc3RhdHVzKSB7CiAgICBmdW5jdGlvbiB1cGRhdGVfY2FjaGUodHJhY2tlZF9vYmplY3RzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCBuZXdfb2JqZWN0XSBvZiBuZXdfamxfb2JqZWN0cyl7CiAgICAgICAgICAgIHRyYWNrZWRfb2JqZWN0cy5hZGQoa2V5KTsKICAgICAgICAgICAgaWYgKCEoa2V5IGluIEdMT0JBTF9PQkpFQ1RfQ0FDSEUpKSB7CiAgICAgICAgICAgICAgICBHTE9CQUxfT0JKRUNUX0NBQ0hFW2tleV0gPSBuZXdfb2JqZWN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY29uc3Qgc2Vzc2lvbiA9IFNFU1NJT05TW3Nlc3Npb25faWRdOwogICAgaWYgKHNlc3Npb24pIHsKICAgICAgICB1cGRhdGVfY2FjaGUoc2Vzc2lvblswXSk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHRyYWNrZWRfaXRlbXMgPSBuZXcgU2V0KCk7CiAgICAgICAgU0VTU0lPTlNbc2Vzc2lvbl9pZF0gPSBbCiAgICAgICAgICAgIHRyYWNrZWRfaXRlbXMsCiAgICAgICAgICAgIHNlc3Npb25fc3RhdHVzCiAgICAgICAgXTsKICAgICAgICB1cGRhdGVfY2FjaGUodHJhY2tlZF9pdGVtcyk7CiAgICB9Cn0KcmVnaXN0ZXJfZXh0KDEwMSwgKHVpbnRfOF9hcnJheSwgY29udGV4dCk9PnsKICAgIGNvbnN0IFtpZCwgdmFsdWVdID0gdW5wYWNrKHVpbnRfOF9hcnJheSwgY29udGV4dCk7CiAgICBjb25zdCBvYnMgPSBuZXcgT2JzZXJ2YWJsZShpZCwgdmFsdWUpOwogICAgcmVnaXN0ZXJfaW5fc2Vzc2lvbl9jYWNoZShjb250ZXh0LnNlc3Npb25faWQsIGlkLCBvYnMsIGNvbnRleHQuc2Vzc2lvbl9zdGF0dXMpOwogICAgcmV0dXJuIG9iczsKfSk7CnJlZ2lzdGVyX2V4dCgxMDMsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCByZWFsX3ZhbHVlID0gdW5wYWNrKHVpbnRfOF9hcnJheSwgY29udGV4dCk7CiAgICBjb25zdCByZXRhaW4gPSBuZXcgUmV0YWluKHJlYWxfdmFsdWUpOwogICAgR0xPQkFMX09CSkVDVF9DQUNIRVtyZWFsX3ZhbHVlLmlkXSA9IHJldGFpbjsKICAgIHJldHVybiByZXRhaW47Cn0pOwpyZWdpc3Rlcl9leHQoMTA0LCAodWludF84X2FycmF5LCBjb250ZXh0KT0+ewogICAgY29uc3Qga2V5ID0gdW5wYWNrKHVpbnRfOF9hcnJheSwgY29udGV4dCk7CiAgICByZXR1cm4gbG9va3VwX2dsb2JhbF9vYmplY3Qoa2V5KTsKfSk7CnJlZ2lzdGVyX2V4dCgxMDksICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBrZXkgPSB1bnBhY2sodWludF84X2FycmF5LCBjb250ZXh0KTsKICAgIHRyYWNrX2luX3Nlc3Npb24oY29udGV4dC5zZXNzaW9uX2lkLCBrZXksIGNvbnRleHQuc2Vzc2lvbl9zdGF0dXMpOwogICAgcmV0dXJuIGxvb2t1cF9nbG9iYWxfb2JqZWN0KGtleSk7Cn0pOwpmdW5jdGlvbiBjcmVhdGVfdGFnKHRhZywgYXR0cmlidXRlcykgewogICAgaWYgKGF0dHJpYnV0ZXMuanVsaWFzdmdub2RlKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCB0YWcpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgfQp9CnJlZ2lzdGVyX2V4dCgxMDUsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBbdGFnLCBjaGlsZHJlbiwgYXR0cmlidXRlc10gPSB1bnBhY2sodWludF84X2FycmF5LCBjb250ZXh0KTsKICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVfdGFnKHRhZywgYXR0cmlidXRlcyk7CiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChrZXkpPT57CiAgICAgICAgaWYgKGtleSA9PSAianVsaWFzdmdub2RlIikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChrZXkgPT0gImNsYXNzIikgewogICAgICAgICAgICBub2RlLmNsYXNzTmFtZSA9IGF0dHJpYnV0ZXNba2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7CiAgICAgICAgfQogICAgfSk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCk9Pm5vZGUuYXBwZW5kKGNoaWxkKSk7CiAgICByZXR1cm4gbm9kZTsKfSk7CnJlZ2lzdGVyX2V4dCgxMDgsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBodG1sID0gdW5wYWNrKHVpbnRfOF9hcnJheSwgY29udGV4dCk7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi5pbm5lckhUTUwgPSBodG1sOwogICAgcmV0dXJuIGRpdjsKfSk7CnJlZ2lzdGVyX2V4dCgxMDYsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBbc2Vzc2lvbl9pZCwgc2Vzc2lvbl9zdGF0dXMsIHBhY2tlZF9vYmplY3RzX2V4dF0gPSBkZWNvZGUodWludF84X2FycmF5KTsKICAgIGVuc3VyZV9zZXNzaW9uX2V4aXN0cyhzZXNzaW9uX2lkLCBzZXNzaW9uX3N0YXR1cyk7CiAgICBjb25zdCBjdHggPSBuZXcgVW5wYWNrQ29udGV4dChzZXNzaW9uX2lkLCBzZXNzaW9uX3N0YXR1cyk7CiAgICB1bnBhY2socGFja2VkX29iamVjdHNfZXh0LmRhdGEsIGN0eCk7CiAgICByZXR1cm4gc2Vzc2lvbl9pZDsKfSk7CnJlZ2lzdGVyX2V4dCgxMDcsICh1aW50XzhfYXJyYXksIGNvbnRleHQpPT57CiAgICBjb25zdCBbc2Vzc2lvbl9pZCwgc2Vzc2lvbl9zdGF0dXMsIHBhY2tlZF9jYWNoZV9leHQsIHBhY2tlZF9kYXRhX2V4dF0gPSBkZWNvZGUodWludF84X2FycmF5KTsKICAgIGNvbnN0IGN0eCA9IG5ldyBVbnBhY2tDb250ZXh0KHNlc3Npb25faWQsIHNlc3Npb25fc3RhdHVzKTsKICAgIGVuc3VyZV9zZXNzaW9uX2V4aXN0cyhzZXNzaW9uX2lkLCBzZXNzaW9uX3N0YXR1cyk7CiAgICB1bnBhY2socGFja2VkX2NhY2hlX2V4dC5kYXRhLCBjdHgpOwogICAgcmV0dXJuIHVucGFjayhwYWNrZWRfZGF0YV9leHQuZGF0YSwgY3R4KTsKfSk7CmZ1bmN0aW9uIGJhc2U2NGVuY29kZShkYXRhX2FzX3VpbnQ4YXJyYXkpIHsKICAgIGNvbnN0IGJhc2U2NF9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT57CiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICByZWFkZXIub25sb2FkID0gKCk9PnsKICAgICAgICAgICAgY29uc3QgbGVuID0gMzc7CiAgICAgICAgICAgIGNvbnN0IGJhc2U2NHVybCA9IHJlYWRlci5yZXN1bHQ7CiAgICAgICAgICAgIHJlc29sdmUoYmFzZTY0dXJsLnNsaWNlKGxlbiwgYmFzZTY0dXJsLmxlbmd0aCkpOwogICAgICAgIH07CiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoWwogICAgICAgICAgICBkYXRhX2FzX3VpbnQ4YXJyYXkKICAgICAgICBdKSk7CiAgICB9KTsKICAgIHJldHVybiBiYXNlNjRfcHJvbWlzZTsKfQpmdW5jdGlvbiBiYXNlNjRkZWNvZGUoYmFzZTY0X3N0cikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+ewogICAgICAgIGZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIiArIGJhc2U2NF9zdHIpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAgICByZXNwb25zZS5hcnJheUJ1ZmZlcigpLnRoZW4oKGFycmF5KT0+ewogICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShhcnJheSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pOwp9CmZ1bmN0aW9uIGRlY29kZV9iYXNlNjRfbWVzc2FnZShiYXNlNjRfc3RyaW5nLCBjb21wcmVzc2lvbl9lbmFibGVkKSB7CiAgICByZXR1cm4gYmFzZTY0ZGVjb2RlKGJhc2U2NF9zdHJpbmcpLnRoZW4oKHgpPT5kZWNvZGVfYmluYXJ5KHgsIGNvbXByZXNzaW9uX2VuYWJsZWQpKTsKfQpmdW5jdGlvbiBkZWNvZGVfYmluYXJ5KGJpbmFyeSwgY29tcHJlc3Npb25fZW5hYmxlZCkgewogICAgcmV0dXJuIHVucGFja19iaW5hcnkoYmluYXJ5LCBjb21wcmVzc2lvbl9lbmFibGVkKTsKfQpmdW5jdGlvbiB1bnBhY2tfYmluYXJ5KGJpbmFyeSwgY29tcHJlc3Npb25fZW5hYmxlZCkgewogICAgaWYgKGNvbXByZXNzaW9uX2VuYWJsZWQpIHsKICAgICAgICByZXR1cm4gdW5wYWNrKE9sKGJpbmFyeSkpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5wYWNrKGJpbmFyeSk7CiAgICB9Cn0KY29uc3QgbW9kID0gewogICAgUmV0YWluOiBSZXRhaW4sCiAgICBiYXNlNjRlbmNvZGU6IGJhc2U2NGVuY29kZSwKICAgIGJhc2U2NGRlY29kZTogYmFzZTY0ZGVjb2RlLAogICAgZGVjb2RlX2Jhc2U2NF9tZXNzYWdlOiBkZWNvZGVfYmFzZTY0X21lc3NhZ2UsCiAgICBkZWNvZGVfYmluYXJ5OiBkZWNvZGVfYmluYXJ5LAogICAgdW5wYWNrX2JpbmFyeTogdW5wYWNrX2JpbmFyeSwKICAgIGVuY29kZV9iaW5hcnk6IGVuY29kZV9iaW5hcnkKfTsKZnVuY3Rpb24gaW5pdF9zZXNzaW9uKHNlc3Npb25faWQsIG1lc3NhZ2VfcHJvbWlzZSwgc2Vzc2lvbl9zdGF0dXMsIGNvbXByZXNzaW9uKSB7CiAgICBTRVNTSU9OU1tzZXNzaW9uX2lkXSA9IFsKICAgICAgICBuZXcgU2V0KCksCiAgICAgICAgc2Vzc2lvbl9zdGF0dXMKICAgIF07CiAgICB0cmFja19kZWxldGVkX3Nlc3Npb25zKCk7CiAgICBsb2NrX2xvYWRpbmcoKCk9PnsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1lc3NhZ2VfcHJvbWlzZSkudGhlbigoYmluYXJ5KT0+ewogICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGJpbmFyeSA/IGRlY29kZV9iaW5hcnkoYmluYXJ5LCBjb21wcmVzc2lvbikgOiBbXTsKICAgICAgICAgICAgaW5pdF9zZXNzaW9uX2Zyb21fbXNncyhzZXNzaW9uX2lkLCBtZXNzYWdlcyk7CiAgICAgICAgfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAgICBzZW5kX2RvbmVfbG9hZGluZyhzZXNzaW9uX2lkLCBlcnJvcik7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9KTsKICAgIH0pOwp9CmNvbnN0IG1vZDEgPSB7CiAgICBTRVNTSU9OUzogU0VTU0lPTlMsCiAgICBHTE9CQUxfT0JKRUNUX0NBQ0hFOiBHTE9CQUxfT0JKRUNUX0NBQ0hFLAogICAgT0JKRUNUX0ZSRUVJTkdfTE9DSzogT0JKRUNUX0ZSRUVJTkdfTE9DSywKICAgIGxvY2tfbG9hZGluZzogbG9ja19sb2FkaW5nLAogICAgbG9va3VwX2dsb2JhbF9vYmplY3Q6IGxvb2t1cF9nbG9iYWxfb2JqZWN0LAogICAgZm9yY2VfZnJlZV9vYmplY3Q6IGZvcmNlX2ZyZWVfb2JqZWN0LAogICAgZnJlZV9vYmplY3Q6IGZyZWVfb2JqZWN0LAogICAgdHJhY2tfZGVsZXRlZF9zZXNzaW9uczogdHJhY2tfZGVsZXRlZF9zZXNzaW9ucywKICAgIGRvbmVfaW5pdGlhbGl6aW5nX3Nlc3Npb246IGRvbmVfaW5pdGlhbGl6aW5nX3Nlc3Npb24sCiAgICBpbml0X3Nlc3Npb246IGluaXRfc2Vzc2lvbiwKICAgIGNsb3NlX3Nlc3Npb246IGNsb3NlX3Nlc3Npb24sCiAgICBmcmVlX3Nlc3Npb246IGZyZWVfc2Vzc2lvbiwKICAgIG9uX25vZGVfYXZhaWxhYmxlOiBvbl9ub2RlX2F2YWlsYWJsZSwKICAgIHVwZGF0ZV9vcl9yZXBsYWNlOiB1cGRhdGVfb3JfcmVwbGFjZSwKICAgIHVwZGF0ZV9zZXNzaW9uX2RvbTogdXBkYXRlX3Nlc3Npb25fZG9tLAogICAgZW5zdXJlX3Nlc3Npb25fZXhpc3RzOiBlbnN1cmVfc2Vzc2lvbl9leGlzdHMsCiAgICB0cmFja19pbl9zZXNzaW9uOiB0cmFja19pbl9zZXNzaW9uLAogICAgcmVnaXN0ZXJfaW5fc2Vzc2lvbl9jYWNoZTogcmVnaXN0ZXJfaW5fc2Vzc2lvbl9jYWNoZSwKICAgIHVwZGF0ZV9zZXNzaW9uX2NhY2hlOiB1cGRhdGVfc2Vzc2lvbl9jYWNoZQp9OwpmdW5jdGlvbiBzZW5kX3dhcm5pbmcobWVzc2FnZSkgewogICAgY29uc29sZS53YXJuKG1lc3NhZ2UpOwogICAgc2VuZF90b19qdWxpYSh7CiAgICAgICAgbXNnX3R5cGU6IEphdmFzY3JpcHRXYXJuaW5nLAogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UKICAgIH0pOwp9CmZ1bmN0aW9uIHNlbmRfY2xvc2Vfc2Vzc2lvbihzZXNzaW9uLCBzdWJzZXNzaW9uKSB7CiAgICBzZW5kX3RvX2p1bGlhKHsKICAgICAgICBtc2dfdHlwZTogQ2xvc2VTZXNzaW9uLAogICAgICAgIHNlc3Npb24sCiAgICAgICAgc3Vic2Vzc2lvbgogICAgfSk7Cn0KZnVuY3Rpb24gcHJvY2Vzc19tZXNzYWdlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgICAgc3dpdGNoKGRhdGEubXNnX3R5cGUpewogICAgICAgICAgICBjYXNlIFVwZGF0ZU9ic2VydmFibGU6CiAgICAgICAgICAgICAgICBsb29rdXBfZ2xvYmFsX29iamVjdChkYXRhLmlkKS5ub3RpZnkoZGF0YS5wYXlsb2FkLCB0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE9uanNDYWxsYmFjazoKICAgICAgICAgICAgICAgIGRhdGEub2JzLm9uKGRhdGEucGF5bG9hZCgpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEV2YWxKYXZhc2NyaXB0OgogICAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBGdXNlZE1lc3NhZ2U6CiAgICAgICAgICAgICAgICBkYXRhLnBheWxvYWQuZm9yRWFjaChwcm9jZXNzX21lc3NhZ2UpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgUGluZ1Bvbmc6CiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJwaW5nIik7CiAgICAgICAgICAgICAgICBDT05ORUNUSU9OLmxhc3RQaW5nID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFVwZGF0ZVNlc3Npb246CiAgICAgICAgICAgICAgICB1cGRhdGVfc2Vzc2lvbl9kb20oZGF0YSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZTogIiArIGRhdGEubXNnX3R5cGUgKyAiLiIpOwogICAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBzZW5kX2Vycm9yKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIG1lc3NhZ2UgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCBlKTsKICAgIH0KfQpjb25zdCBtb2QyID0gewogICAgVXBkYXRlT2JzZXJ2YWJsZTogVXBkYXRlT2JzZXJ2YWJsZSwKICAgIE9uanNDYWxsYmFjazogT25qc0NhbGxiYWNrLAogICAgRXZhbEphdmFzY3JpcHQ6IEV2YWxKYXZhc2NyaXB0LAogICAgSmF2YXNjcmlwdEVycm9yOiBKYXZhc2NyaXB0RXJyb3IsCiAgICBKYXZhc2NyaXB0V2FybmluZzogSmF2YXNjcmlwdFdhcm5pbmcsCiAgICBSZWdpc3Rlck9ic2VydmFibGU6IFJlZ2lzdGVyT2JzZXJ2YWJsZSwKICAgIEpTRG9uZUxvYWRpbmc6IEpTRG9uZUxvYWRpbmcsCiAgICBGdXNlZE1lc3NhZ2U6IEZ1c2VkTWVzc2FnZSwKICAgIENvbm5lY3Rpb25TdGF0dXM6IENvbm5lY3Rpb25TdGF0dXMsCiAgICByZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcjogcmVnaXN0ZXJfY29ubmVjdGlvbl9pbmRpY2F0b3IsCiAgICB1bnJlZ2lzdGVyX2Nvbm5lY3Rpb25faW5kaWNhdG9yOiB1bnJlZ2lzdGVyX2Nvbm5lY3Rpb25faW5kaWNhdG9yLAogICAgc2V0X25vX2Nvbm5lY3Rpb246IHNldF9ub19jb25uZWN0aW9uLAogICAgb25fY29ubmVjdGlvbl9jb25uZWN0aW5nOiBvbl9jb25uZWN0aW9uX2Nvbm5lY3RpbmcsCiAgICBvbl9jb25uZWN0aW9uX29wZW46IG9uX2Nvbm5lY3Rpb25fb3BlbiwKICAgIG9uX2Nvbm5lY3Rpb25fY2xvc2U6IG9uX2Nvbm5lY3Rpb25fY2xvc2UsCiAgICBjYW5fc2VuZF90b19qdWxpYTogY2FuX3NlbmRfdG9fanVsaWEsCiAgICBpc19qdWxpYV9yZXNwb25zaXZlOiBpc19qdWxpYV9yZXNwb25zaXZlLAogICAgc2VuZF90b19qdWxpYTogc2VuZF90b19qdWxpYSwKICAgIHNlbmRfcGluZ3Bvbmc6IHNlbmRfcGluZ3BvbmcsCiAgICBzZW5kX2Vycm9yOiBzZW5kX2Vycm9yLAogICAgc2VuZF93YXJuaW5nOiBzZW5kX3dhcm5pbmcsCiAgICBzZW5kX2RvbmVfbG9hZGluZzogc2VuZF9kb25lX2xvYWRpbmcsCiAgICBzZW5kX2Nsb3NlX3Nlc3Npb246IHNlbmRfY2xvc2Vfc2Vzc2lvbiwKICAgIHByb2Nlc3NfbWVzc2FnZTogcHJvY2Vzc19tZXNzYWdlCn07CmZ1bmN0aW9uIG9uYW55KG9ic2VydmFibGVzLCBmKSB7CiAgICBjb25zdCBjYWxsYmFjayA9ICh4KT0+ZihvYnNlcnZhYmxlcy5tYXAoKHgpPT54LnZhbHVlKSk7CiAgICBvYnNlcnZhYmxlcy5mb3JFYWNoKChvYnMpPT57CiAgICAgICAgb2JzLm9uKGNhbGxiYWNrKTsKICAgIH0pOwp9CmNvbnN0IHsgc2VuZF9lcnJvcjogc2VuZF9lcnJvcjEgLCBzZW5kX3dhcm5pbmc6IHNlbmRfd2FybmluZzEgLCBwcm9jZXNzX21lc3NhZ2U6IHByb2Nlc3NfbWVzc2FnZTEgLCBvbl9jb25uZWN0aW9uX29wZW46IG9uX2Nvbm5lY3Rpb25fb3BlbjEgLCBvbl9jb25uZWN0aW9uX2Nsb3NlOiBvbl9jb25uZWN0aW9uX2Nsb3NlMSAsIG9uX2Nvbm5lY3Rpb25fY29ubmVjdGluZzogb25fY29ubmVjdGlvbl9jb25uZWN0aW5nMSAsIHNlbmRfY2xvc2Vfc2Vzc2lvbjogc2VuZF9jbG9zZV9zZXNzaW9uMSAsIHNlbmRfcGluZ3Bvbmc6IHNlbmRfcGluZ3BvbmcxICwgY2FuX3NlbmRfdG9fanVsaWE6IGNhbl9zZW5kX3RvX2p1bGlhMSAsIHNlbmRfdG9fanVsaWE6IHNlbmRfdG9fanVsaWExICwgcmVnaXN0ZXJfY29ubmVjdGlvbl9pbmRpY2F0b3I6IHJlZ2lzdGVyX2Nvbm5lY3Rpb25faW5kaWNhdG9yMSAsIHVucmVnaXN0ZXJfY29ubmVjdGlvbl9pbmRpY2F0b3I6IHVucmVnaXN0ZXJfY29ubmVjdGlvbl9pbmRpY2F0b3IxICwgc2V0X25vX2Nvbm5lY3Rpb246IHNldF9ub19jb25uZWN0aW9uMSAsIENvbm5lY3Rpb25TdGF0dXM6IENvbm5lY3Rpb25TdGF0dXMxICB9ID0gbW9kMjsKY29uc3QgeyBiYXNlNjRkZWNvZGU6IGJhc2U2NGRlY29kZTEgLCBiYXNlNjRlbmNvZGU6IGJhc2U2NGVuY29kZTEgLCBkZWNvZGVfYmluYXJ5OiBkZWNvZGVfYmluYXJ5MSAsIGVuY29kZV9iaW5hcnk6IGVuY29kZV9iaW5hcnkxICwgZGVjb2RlX2Jhc2U2NF9tZXNzYWdlOiBkZWNvZGVfYmFzZTY0X21lc3NhZ2UxICB9ID0gbW9kOwpjb25zdCB7IGluaXRfc2Vzc2lvbjogaW5pdF9zZXNzaW9uMSAsIGZyZWVfc2Vzc2lvbjogZnJlZV9zZXNzaW9uMSAsIGxvb2t1cF9nbG9iYWxfb2JqZWN0OiBsb29rdXBfZ2xvYmFsX29iamVjdDEgLCB1cGRhdGVfb3JfcmVwbGFjZTogdXBkYXRlX29yX3JlcGxhY2UxICwgbG9ja19sb2FkaW5nOiBsb2NrX2xvYWRpbmcxICwgT0JKRUNUX0ZSRUVJTkdfTE9DSzogT0JKRUNUX0ZSRUVJTkdfTE9DSzEgLCBmcmVlX29iamVjdDogZnJlZV9vYmplY3QxICwgZm9yY2VfZnJlZV9vYmplY3Q6IGZvcmNlX2ZyZWVfb2JqZWN0MSAgfSA9IG1vZDE7CmZ1bmN0aW9uIHVwZGF0ZV9ub2RlX2F0dHJpYnV0ZShub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICBpZiAobm9kZSkgewogICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICJjbGFzcyIpIHsKICAgICAgICAgICAgbm9kZS5jbGFzc05hbWUgPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGVbYXR0cmlidXRlXSAhPSB2YWx1ZSkgewogICAgICAgICAgICBub2RlW2F0dHJpYnV0ZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQpmdW5jdGlvbiB1cGRhdGVfZG9tX25vZGUoZG9tLCBodG1sKSB7CiAgICBpZiAoZG9tKSB7CiAgICAgICAgZG9tLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQpmdW5jdGlvbiBmZXRjaF9iaW5hcnkodXJsKSB7CiAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSFRUUCBlcnJvciwgc3RhdHVzID0gIiArIHJlc3BvbnNlLnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgfSk7Cn0KZnVuY3Rpb24gbG9hZF9zY3JpcHQodXJsLCBnbG9iYWxfbmFtZSkgewogICAgaWYgKHdpbmRvd1tnbG9iYWxfbmFtZV0pIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvd1tnbG9iYWxfbmFtZV0pOwogICAgfQogICAgY29uc3QgZXhpc3Rpbmdfc2NyaXB0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz0iJHt1cmx9Il1gKTsKICAgIGNvbnN0IHNjcmlwdCA9IGV4aXN0aW5nX3NjcmlwdCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+ewogICAgICAgIGNvbnN0IHdhaXRGb3JHbG9iYWwgPSAocmV0cmllcyA9IDAsIG1heFJldHJpZXMgPSAxMCwgZGVsYXkgPSAxMCk9PnsKICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+ewogICAgICAgICAgICAgICAgaWYgKHdpbmRvd1tnbG9iYWxfbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHdpbmRvd1tnbG9iYWxfbmFtZV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRyaWVzIDwgbWF4UmV0cmllcykgewogICAgICAgICAgICAgICAgICAgIHdhaXRGb3JHbG9iYWwocmV0cmllcyArIDEsIG1heFJldHJpZXMsIGRlbGF5ICogMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEdsb2JhbCAnJHtnbG9iYWxfbmFtZX0nIG5vdCBmb3VuZCBhZnRlciBsb2FkaW5nICR7dXJsfSAodHJpZWQgJHttYXhSZXRyaWVzICsgMX0gdGltZXMpYCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBkZWxheSk7CiAgICAgICAgfTsKICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsICgpPT57CiAgICAgICAgICAgIHNjcmlwdC5kYXRhc2V0LmxvYWRlZCA9ICJ0cnVlIjsKICAgICAgICAgICAgd2FpdEZvckdsb2JhbCgpOwogICAgICAgIH0pOwogICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsICgpPT57CiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHNjcmlwdDogJHt1cmx9YCkpOwogICAgICAgIH0pOwogICAgICAgIGlmICghZXhpc3Rpbmdfc2NyaXB0KSB7CiAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB1cmw7CiAgICAgICAgICAgIHNjcmlwdC5kYXRhc2V0LmxvYWRlZCA9ICJmYWxzZSI7CiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgICAgICB9CiAgICB9KTsKfQpmdW5jdGlvbiB0aHJvdHRsZV9mdW5jdGlvbihmdW5jLCBkZWxheSkgewogICAgbGV0IHByZXYgPSAwOwogICAgbGV0IGZ1dHVyZV9pZCA9IHVuZGVmaW5lZDsKICAgIGZ1bmN0aW9uIGlubmVyX3Rocm90dGxlKC4uLmFyZ3MpIHsKICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBpZiAoZnV0dXJlX2lkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGZ1dHVyZV9pZCk7CiAgICAgICAgICAgIGZ1dHVyZV9pZCA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKG5vdyAtIHByZXYgPiBkZWxheSkgewogICAgICAgICAgICBwcmV2ID0gbm93OwogICAgICAgICAgICByZXR1cm4gZnVuYyguLi5hcmdzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmdXR1cmVfaWQgPSBzZXRUaW1lb3V0KCgpPT5pbm5lcl90aHJvdHRsZSguLi5hcmdzKSwgZGVsYXkgLSAobm93IC0gcHJldikgKyAxKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaW5uZXJfdGhyb3R0bGU7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVfc3RhdGVfa2V5KHYpIHsKICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHsKICAgICAgICBpZiAoaXNOYU4odikpIHsKICAgICAgICAgICAgcmV0dXJuICdOYU4nOwogICAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHYpKSB7CiAgICAgICAgICAgIHJldHVybiB2ID4gMCA/ICdJbmZpbml0eScgOiAnLUluZmluaXR5JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgZm9ybWF0dGVkID0gdi50b0ZpeGVkKDYpOwogICAgICAgICAgICBpZiAoZm9ybWF0dGVkLmluY2x1ZGVzKCcuJykpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cLj8wKyQvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHsKICAgICAgICByZXR1cm4gdiA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBTdHJpbmcodik7CiAgICB9Cn0KY29uc3QgQm9uaXRvID0gewogICAgUHJvdG9jb2w6IG1vZCwKICAgIGJhc2U2NGRlY29kZTogYmFzZTY0ZGVjb2RlMSwKICAgIGJhc2U2NGVuY29kZTogYmFzZTY0ZW5jb2RlMSwKICAgIGRlY29kZV9iaW5hcnk6IGRlY29kZV9iaW5hcnkxLAogICAgZW5jb2RlX2JpbmFyeTogZW5jb2RlX2JpbmFyeTEsCiAgICBkZWNvZGVfYmFzZTY0X21lc3NhZ2U6IGRlY29kZV9iYXNlNjRfbWVzc2FnZTEsCiAgICBmZXRjaF9iaW5hcnksCiAgICBsb2FkX3NjcmlwdCwKICAgIENvbm5lY3Rpb246IG1vZDIsCiAgICBzZW5kX2Vycm9yOiBzZW5kX2Vycm9yMSwKICAgIHNlbmRfd2FybmluZzogc2VuZF93YXJuaW5nMSwKICAgIHByb2Nlc3NfbWVzc2FnZTogcHJvY2Vzc19tZXNzYWdlMSwKICAgIG9uX2Nvbm5lY3Rpb25fb3Blbjogb25fY29ubmVjdGlvbl9vcGVuMSwKICAgIG9uX2Nvbm5lY3Rpb25fY2xvc2U6IG9uX2Nvbm5lY3Rpb25fY2xvc2UxLAogICAgb25fY29ubmVjdGlvbl9jb25uZWN0aW5nOiBvbl9jb25uZWN0aW9uX2Nvbm5lY3RpbmcxLAogICAgc2VuZF9jbG9zZV9zZXNzaW9uOiBzZW5kX2Nsb3NlX3Nlc3Npb24xLAogICAgc2VuZF9waW5ncG9uZzogc2VuZF9waW5ncG9uZzEsCiAgICByZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcjogcmVnaXN0ZXJfY29ubmVjdGlvbl9pbmRpY2F0b3IxLAogICAgdW5yZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcjogdW5yZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcjEsCiAgICBzZXRfbm9fY29ubmVjdGlvbjogc2V0X25vX2Nvbm5lY3Rpb24xLAogICAgQ29ubmVjdGlvblN0YXR1czogQ29ubmVjdGlvblN0YXR1czEsCiAgICBTZXNzaW9uczogbW9kMSwKICAgIGluaXRfc2Vzc2lvbjogaW5pdF9zZXNzaW9uMSwKICAgIGZyZWVfc2Vzc2lvbjogZnJlZV9zZXNzaW9uMSwKICAgIGxvY2tfbG9hZGluZzogbG9ja19sb2FkaW5nMSwKICAgIHVwZGF0ZV9ub2RlX2F0dHJpYnV0ZSwKICAgIHVwZGF0ZV9kb21fbm9kZSwKICAgIGxvb2t1cF9nbG9iYWxfb2JqZWN0OiBsb29rdXBfZ2xvYmFsX29iamVjdDEsCiAgICB1cGRhdGVfb3JfcmVwbGFjZTogdXBkYXRlX29yX3JlcGxhY2UxLAogICAgZm9yY2VfZnJlZV9vYmplY3Q6IGZvcmNlX2ZyZWVfb2JqZWN0MSwKICAgIE9CSkVDVF9GUkVFSU5HX0xPQ0s6IE9CSkVDVF9GUkVFSU5HX0xPQ0sxLAogICAgY2FuX3NlbmRfdG9fanVsaWE6IGNhbl9zZW5kX3RvX2p1bGlhMSwKICAgIG9uYW55LAogICAgZnJlZV9vYmplY3Q6IGZyZWVfb2JqZWN0MSwKICAgIHNlbmRfdG9fanVsaWE6IHNlbmRfdG9fanVsaWExLAogICAgdGhyb3R0bGVfZnVuY3Rpb24sCiAgICBnZW5lcmF0ZV9zdGF0ZV9rZXkKfTsKd2luZG93LkJvbml0byA9IEJvbml0bzsKZXhwb3J0IHsgbW9kIGFzIFByb3RvY29sLCBiYXNlNjRkZWNvZGUxIGFzIGJhc2U2NGRlY29kZSwgYmFzZTY0ZW5jb2RlMSBhcyBiYXNlNjRlbmNvZGUsIGRlY29kZV9iaW5hcnkxIGFzIGRlY29kZV9iaW5hcnksIGVuY29kZV9iaW5hcnkxIGFzIGVuY29kZV9iaW5hcnksIGRlY29kZV9iYXNlNjRfbWVzc2FnZTEgYXMgZGVjb2RlX2Jhc2U2NF9tZXNzYWdlLCBmZXRjaF9iaW5hcnkgYXMgZmV0Y2hfYmluYXJ5LCBsb2FkX3NjcmlwdCBhcyBsb2FkX3NjcmlwdCwgbW9kMiBhcyBDb25uZWN0aW9uLCBzZW5kX2Vycm9yMSBhcyBzZW5kX2Vycm9yLCBzZW5kX3dhcm5pbmcxIGFzIHNlbmRfd2FybmluZywgcHJvY2Vzc19tZXNzYWdlMSBhcyBwcm9jZXNzX21lc3NhZ2UsIG9uX2Nvbm5lY3Rpb25fb3BlbjEgYXMgb25fY29ubmVjdGlvbl9vcGVuLCBvbl9jb25uZWN0aW9uX2Nsb3NlMSBhcyBvbl9jb25uZWN0aW9uX2Nsb3NlLCBvbl9jb25uZWN0aW9uX2Nvbm5lY3RpbmcxIGFzIG9uX2Nvbm5lY3Rpb25fY29ubmVjdGluZywgc2VuZF9jbG9zZV9zZXNzaW9uMSBhcyBzZW5kX2Nsb3NlX3Nlc3Npb24sIHNlbmRfcGluZ3BvbmcxIGFzIHNlbmRfcGluZ3BvbmcsIHJlZ2lzdGVyX2Nvbm5lY3Rpb25faW5kaWNhdG9yMSBhcyByZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvciwgdW5yZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvcjEgYXMgdW5yZWdpc3Rlcl9jb25uZWN0aW9uX2luZGljYXRvciwgc2V0X25vX2Nvbm5lY3Rpb24xIGFzIHNldF9ub19jb25uZWN0aW9uLCBDb25uZWN0aW9uU3RhdHVzMSBhcyBDb25uZWN0aW9uU3RhdHVzLCBtb2QxIGFzIFNlc3Npb25zLCBpbml0X3Nlc3Npb24xIGFzIGluaXRfc2Vzc2lvbiwgZnJlZV9zZXNzaW9uMSBhcyBmcmVlX3Nlc3Npb24sIGxvY2tfbG9hZGluZzEgYXMgbG9ja19sb2FkaW5nLCB1cGRhdGVfbm9kZV9hdHRyaWJ1dGUgYXMgdXBkYXRlX25vZGVfYXR0cmlidXRlLCB1cGRhdGVfZG9tX25vZGUgYXMgdXBkYXRlX2RvbV9ub2RlLCBsb29rdXBfZ2xvYmFsX29iamVjdDEgYXMgbG9va3VwX2dsb2JhbF9vYmplY3QsIHVwZGF0ZV9vcl9yZXBsYWNlMSBhcyB1cGRhdGVfb3JfcmVwbGFjZSwgb25hbnkgYXMgb25hbnksIE9CSkVDVF9GUkVFSU5HX0xPQ0sxIGFzIE9CSkVDVF9GUkVFSU5HX0xPQ0ssIGNhbl9zZW5kX3RvX2p1bGlhMSBhcyBjYW5fc2VuZF90b19qdWxpYSwgZnJlZV9vYmplY3QxIGFzIGZyZWVfb2JqZWN0LCBzZW5kX3RvX2p1bGlhMSBhcyBzZW5kX3RvX2p1bGlhLCB0aHJvdHRsZV9mdW5jdGlvbiBhcyB0aHJvdHRsZV9mdW5jdGlvbiB9OwpleHBvcnQgeyBnZW5lcmF0ZV9zdGF0ZV9rZXkgYXMgZ2VuZXJhdGVfc3RhdGVfa2V5IH07Cgo=" type="module"></script><style></style></div><div><script src="data:application/javascript;base64,Qm9uaXRvLmluaXRfc2Vzc2lvbigiMmQwNGU0MWQtMWJjZi00MGU4LWEzODctOWEzMDMxYmJmZGNhIiwgQm9uaXRvLmZldGNoX2JpbmFyeSgnZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LHlBR1lhNVRaSkRKa01EUmxOREZrTFRGaVkyWXROREJsT0MxaE16ZzNMVGxoTXpBek1XSmlabVJqWWFSeWIyOTB4eklTeHk5cWs5a2tNbVF3TkdVME1XUXRNV0pqWmkwME1HVTRMV0V6T0RjdE9XRXpNRE14WW1KbVpHTmhwSEp2YjNUVUVwRElBVE1Ta2NnQkxtdVUyU1F5WkRBMFpUUXhaQzB4WW1ObUxUUXdaVGd0WVRNNE55MDVZVE13TXpGaVltWmtZMkdrY205dmRNY3lFc2N2YXBQWkpESmtNRFJsTkRGa0xURmlZMll0TkRCbE9DMWhNemczTFRsaE16QXpNV0ppWm1SallhUnliMjkwMUJLUXg4b1NncWR3WVhsc2IyRmt4N05tazREWlkybG1JQ2gwZVhCbGIyWWdRbTl1YVhSdklDRTlQU0FuZFc1a1pXWnBibVZrSnlBbUppQkNiMjVwZEc4dWMyVjBYMjV2WDJOdmJtNWxZM1JwYjI0cElIc0tJQ0FnSUVKdmJtbDBieTV6WlhSZmJtOWZZMjl1Ym1WamRHbHZiaWdwT3dwOUN0bEtMMmh2YldVdlpHRnVaaTh1YW5Wc2FXRXZjR0ZqYTJGblpYTXZRbTl1YVhSdkwwOUtWSGxHTDNOeVl5OWpiMjV1WldOMGFXOXVMMjV2TFdOdmJtNWxZM1JwYjI0dWFtdzZNVE9vYlhOblgzUjVjR1doTWc9PScpLCAicm9vdCIsIGZhbHNlKTsK" type="module"></script><div></div></div></div><div class="bonito-fragment" id="87a10ba2-c87f-4a1d-b635-36945bed84a0" data-jscall-id="subsession-application-dom"><div><style></style><style>.wglmakie-spinner {
  left: 50%;
  z-index: 1000;
  height: 40px;
  position: absolute;
  border-radius: 50%;
  border: 4px solid rgba(0, 0, 0, 0.1);
  animation: wglmakie-spin 1.0s linear infinite;
  top: 50%;
  border-top: 4px solid currentColor;
  width: 40px;
  pointer-events: none;
  transform: translate(-50%, -50%);
}
@keyframes wglmakie-spin {
  0% {
    transform: translate(-50%, -50%) rotate(0deg);
  }
  100% {
    transform: translate(-50%, -50%) rotate(360deg);
  }
}
</style><script>// make sure BONITO_IMPORTS is initialized
window.BONITO_IMPORTS = window.BONITO_IMPORTS || {};
BONITO_IMPORTS['363a133e5984b8f3525da6968be11f85c4547a00-WGLMakie.js'] =  import('data:application/javascript;base64,Ly8gZGVuby1mbXQtaWdub3JlLWZpbGUKLy8gZGVuby1saW50LWlnbm9yZS1maWxlCi8vIFRoaXMgY29kZSB3YXMgYnVuZGxlZCB1c2luZyBgZGVubyBidW5kbGVgIGFuZCBpdCdzIG5vdCByZWNvbW1lbmRlZCB0byBlZGl0IGl0IG1hbnVhbGx5Cgp2YXIgdmwgPSAiMTczIiwgRGQgPSB7CiAgICBMRUZUOiAwLAogICAgTUlERExFOiAxLAogICAgUklHSFQ6IDIsCiAgICBST1RBVEU6IDAsCiAgICBET0xMWTogMSwKICAgIFBBTjogMgp9LCBMZCA9IHsKICAgIFJPVEFURTogMCwKICAgIFBBTjogMSwKICAgIERPTExZX1BBTjogMiwKICAgIERPTExZX1JPVEFURTogMwp9LCBVZCA9IDAsIFdkID0gMSwgSGQgPSAyLCBxZCA9IDMsIEdkID0gMCwgWGQgPSAxLCBKZCA9IDIsIFpkID0gMywgZHIgPSAwLCBBbCA9IDEsIFlkID0gMiwgVWwgPSAwLCBlYSA9IDEsICRkID0gMiwgUWQgPSAzLCBqZCA9IDQsIEtkID0gNSwgaWEgPSAxMDAsIHRwID0gMTAxLCBlcCA9IDEwMiwgaXAgPSAxMDMsIHNwID0gMTA0LCBucCA9IDIwMCwgcnAgPSAyMDEsIG9wID0gMjAyLCBhcCA9IDIwMywgc2EgPSAyMDQsIG5hID0gMjA1LCBocCA9IDIwNiwgbHAgPSAyMDcsIGNwID0gMjA4LCB1cCA9IDIwOSwgZHAgPSAyMTAsIHBwID0gMjExLCBmcCA9IDIxMiwgbXAgPSAyMTMsIHlwID0gMjE0LCBncCA9IDAsIHhwID0gMSwgYnAgPSAyLCByYSA9IDMsIHdwID0gNCwgTXAgPSA1LCBfcCA9IDYsIHZwID0gNywgRG8gPSAwLCBBcCA9IDEsIFNwID0gMiwgVHAgPSAwLCBJcCA9IDEsIENwID0gMiwgenAgPSAzLCBGcCA9IDQsIEJwID0gNSwgRXAgPSA2LCBScCA9IDcsIG9hID0gImF0dGFjaGVkIiwgV2wgPSAiZGV0YWNoZWQiLCBMbyA9IDMwMCwgVW8gPSAzMDEsIEhsID0gMzAyLCBxbCA9IDMwMywgR2wgPSAzMDQsIFhsID0gMzA2LCBwciA9IDFlMywgSHQgPSAxMDAxLCBmciA9IDEwMDIsIFV0ID0gMTAwMywgSmwgPSAxMDA0LCBrcCA9IDEwMDQsIFpsID0gMTAwNSwgUHAgPSAxMDA1LCBFdCA9IDEwMDYsIFlsID0gMTAwNywgT3AgPSAxMDA3LCB2biA9IDEwMDgsIE5wID0gMTAwOCwgU2wgPSAxMDA5LCAkbCA9IDEwMTAsIFFsID0gMTAxMSwgamwgPSAxMDEyLCBLbCA9IDEwMTMsIFdvID0gMTAxNCwgcGkgPSAxMDE1LCB0YyA9IDEwMTYsIGVjID0gMTAxNywgaWMgPSAxMDE4LCBzYyA9IDEwMjAsIG5jID0gMzU5MDIsIHJjID0gMTAyMSwgb2MgPSAxMDIyLCBMaSA9IDEwMjMsIGFjID0gMTAyNCwgaGMgPSAxMDI1LCBDbiA9IDEwMjYsIGFhID0gMTAyNywgVGwgPSAxMDI4LCBJbCA9IDEwMjksIGxjID0gMTAzMCwgY2MgPSAxMDMxLCBWcCA9IDEwMzIsIHVjID0gMTAzMywgZGMgPSAzMzc3NiwgcGMgPSAzMzc3NywgZmMgPSAzMzc3OCwgbWMgPSAzMzc3OSwgeWMgPSAzNTg0MCwgZ2MgPSAzNTg0MSwgeGMgPSAzNTg0MiwgYmMgPSAzNTg0Mywgd2MgPSAzNjE5NiwgTWMgPSAzNzQ5MiwgX2MgPSAzNzQ5NiwgdmMgPSAzNzgwOCwgQWMgPSAzNzgwOSwgU2MgPSAzNzgxMCwgVGMgPSAzNzgxMSwgSWMgPSAzNzgxMiwgQ2MgPSAzNzgxMywgemMgPSAzNzgxNCwgRmMgPSAzNzgxNSwgQmMgPSAzNzgxNiwgRWMgPSAzNzgxNywgUmMgPSAzNzgxOCwga2MgPSAzNzgxOSwgUGMgPSAzNzgyMCwgT2MgPSAzNzgyMSwgTmMgPSAzNjQ5MiwgVmMgPSAzNjQ5NCwgRGMgPSAzNjQ5NSwgTGMgPSAzNjI4MywgVWMgPSAzNjI4NCwgV2MgPSAzNjI4NSwgSGMgPSAzNjI4NiwgcWMgPSAyMjAwLCBHYyA9IDIyMDEsIFhjID0gMjIwMiwgR3MgPSAyMzAwLCBtciA9IDIzMDEsIHpuID0gMjMwMiwgaGkgPSAyNDAwLCBsaSA9IDI0MDEsIFhzID0gMjQwMiwgSG8gPSAyNTAwLCBDbCA9IDI1MDEsIERwID0gMCwgTHAgPSAxLCBVcCA9IDIsIEpjID0gMzIwMCwgV3AgPSAzMjAxLCBIcCA9IDMyMDIsIHFwID0gMzIwMywgX2kgPSAwLCBHcCA9IDEsIHpsID0gIiIsIEJ0ID0gInNyZ2IiLCBoYSA9ICJzcmdiLWxpbmVhciIsIGxhID0gImxpbmVhciIsIEZuID0gInNyZ2IiLCBYcCA9IDAsIHFlID0gNzY4MCwgSnAgPSA3NjgxLCBacCA9IDc2ODIsIFlwID0gNzY4MywgJHAgPSAzNDA1NSwgUXAgPSAzNDA1NiwganAgPSA1Mzg2LCBLcCA9IDUxMiwgdGYgPSA1MTMsIGVmID0gNTE0LCBzZiA9IDUxNSwgbmYgPSA1MTYsIHJmID0gNTE3LCBvZiA9IDUxOCwgY2EgPSA1MTksIGFmID0gNTEyLCBoZiA9IDUxMywgbGYgPSA1MTQsIGNmID0gNTE1LCB1ZiA9IDUxNiwgZGYgPSA1MTcsIHBmID0gNTE4LCBmZiA9IDUxOSwgSnMgPSAzNTA0NCwgbWYgPSAzNTA0OCwgeWYgPSAzNTA0MCwgZ2YgPSAzNTA0NSwgeGYgPSAzNTA0OSwgYmYgPSAzNTA0MSwgd2YgPSAzNTA0NiwgTWYgPSAzNTA1MCwgX2YgPSAzNTA0MiwgdmYgPSAiMTAwIiwgQWYgPSAiMzAwIGVzIiwgb2UgPSAyZTMsIFpzID0gMjAwMSwgU2YgPSB7CiAgICBDT01QVVRFOiAiY29tcHV0ZSIsCiAgICBSRU5ERVI6ICJyZW5kZXIiCn0sIHF0ID0gY2xhc3MgewogICAgYWRkRXZlbnRMaXN0ZW5lcih0LCBlKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID09PSB2b2lkIDAgJiYgKHRoaXMuX2xpc3RlbmVycyA9IHt9KTsKICAgICAgICBsZXQgaSA9IHRoaXMuX2xpc3RlbmVyczsKICAgICAgICBpW3RdID09PSB2b2lkIDAgJiYgKGlbdF0gPSBbXSksIGlbdF0uaW5kZXhPZihlKSA9PT0gLTEgJiYgaVt0XS5wdXNoKGUpOwogICAgfQogICAgaGFzRXZlbnRMaXN0ZW5lcih0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLl9saXN0ZW5lcnM7CiAgICAgICAgcmV0dXJuIGkgPT09IHZvaWQgMCA/ICExIDogaVt0XSAhPT0gdm9pZCAwICYmIGlbdF0uaW5kZXhPZihlKSAhPT0gLTE7CiAgICB9CiAgICByZW1vdmVFdmVudExpc3RlbmVyKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuX2xpc3RlbmVyczsKICAgICAgICBpZiAoaSA9PT0gdm9pZCAwKSByZXR1cm47CiAgICAgICAgbGV0IHMgPSBpW3RdOwogICAgICAgIGlmIChzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IG4gPSBzLmluZGV4T2YoZSk7CiAgICAgICAgICAgIG4gIT09IC0xICYmIHMuc3BsaWNlKG4sIDEpOwogICAgICAgIH0KICAgIH0KICAgIGRpc3BhdGNoRXZlbnQodCkgewogICAgICAgIGxldCBlID0gdGhpcy5fbGlzdGVuZXJzOwogICAgICAgIGlmIChlID09PSB2b2lkIDApIHJldHVybjsKICAgICAgICBsZXQgaSA9IGVbdC50eXBlXTsKICAgICAgICBpZiAoaSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHQudGFyZ2V0ID0gdGhpczsKICAgICAgICAgICAgbGV0IHMgPSBpLnNsaWNlKDApOwogICAgICAgICAgICBmb3IobGV0IG4gPSAwLCByID0gcy5sZW5ndGg7IG4gPCByOyBuKyspc1tuXS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICB0LnRhcmdldCA9IG51bGw7CiAgICAgICAgfQogICAgfQp9LCB1dCA9IFsKICAgICIwMCIsCiAgICAiMDEiLAogICAgIjAyIiwKICAgICIwMyIsCiAgICAiMDQiLAogICAgIjA1IiwKICAgICIwNiIsCiAgICAiMDciLAogICAgIjA4IiwKICAgICIwOSIsCiAgICAiMGEiLAogICAgIjBiIiwKICAgICIwYyIsCiAgICAiMGQiLAogICAgIjBlIiwKICAgICIwZiIsCiAgICAiMTAiLAogICAgIjExIiwKICAgICIxMiIsCiAgICAiMTMiLAogICAgIjE0IiwKICAgICIxNSIsCiAgICAiMTYiLAogICAgIjE3IiwKICAgICIxOCIsCiAgICAiMTkiLAogICAgIjFhIiwKICAgICIxYiIsCiAgICAiMWMiLAogICAgIjFkIiwKICAgICIxZSIsCiAgICAiMWYiLAogICAgIjIwIiwKICAgICIyMSIsCiAgICAiMjIiLAogICAgIjIzIiwKICAgICIyNCIsCiAgICAiMjUiLAogICAgIjI2IiwKICAgICIyNyIsCiAgICAiMjgiLAogICAgIjI5IiwKICAgICIyYSIsCiAgICAiMmIiLAogICAgIjJjIiwKICAgICIyZCIsCiAgICAiMmUiLAogICAgIjJmIiwKICAgICIzMCIsCiAgICAiMzEiLAogICAgIjMyIiwKICAgICIzMyIsCiAgICAiMzQiLAogICAgIjM1IiwKICAgICIzNiIsCiAgICAiMzciLAogICAgIjM4IiwKICAgICIzOSIsCiAgICAiM2EiLAogICAgIjNiIiwKICAgICIzYyIsCiAgICAiM2QiLAogICAgIjNlIiwKICAgICIzZiIsCiAgICAiNDAiLAogICAgIjQxIiwKICAgICI0MiIsCiAgICAiNDMiLAogICAgIjQ0IiwKICAgICI0NSIsCiAgICAiNDYiLAogICAgIjQ3IiwKICAgICI0OCIsCiAgICAiNDkiLAogICAgIjRhIiwKICAgICI0YiIsCiAgICAiNGMiLAogICAgIjRkIiwKICAgICI0ZSIsCiAgICAiNGYiLAogICAgIjUwIiwKICAgICI1MSIsCiAgICAiNTIiLAogICAgIjUzIiwKICAgICI1NCIsCiAgICAiNTUiLAogICAgIjU2IiwKICAgICI1NyIsCiAgICAiNTgiLAogICAgIjU5IiwKICAgICI1YSIsCiAgICAiNWIiLAogICAgIjVjIiwKICAgICI1ZCIsCiAgICAiNWUiLAogICAgIjVmIiwKICAgICI2MCIsCiAgICAiNjEiLAogICAgIjYyIiwKICAgICI2MyIsCiAgICAiNjQiLAogICAgIjY1IiwKICAgICI2NiIsCiAgICAiNjciLAogICAgIjY4IiwKICAgICI2OSIsCiAgICAiNmEiLAogICAgIjZiIiwKICAgICI2YyIsCiAgICAiNmQiLAogICAgIjZlIiwKICAgICI2ZiIsCiAgICAiNzAiLAogICAgIjcxIiwKICAgICI3MiIsCiAgICAiNzMiLAogICAgIjc0IiwKICAgICI3NSIsCiAgICAiNzYiLAogICAgIjc3IiwKICAgICI3OCIsCiAgICAiNzkiLAogICAgIjdhIiwKICAgICI3YiIsCiAgICAiN2MiLAogICAgIjdkIiwKICAgICI3ZSIsCiAgICAiN2YiLAogICAgIjgwIiwKICAgICI4MSIsCiAgICAiODIiLAogICAgIjgzIiwKICAgICI4NCIsCiAgICAiODUiLAogICAgIjg2IiwKICAgICI4NyIsCiAgICAiODgiLAogICAgIjg5IiwKICAgICI4YSIsCiAgICAiOGIiLAogICAgIjhjIiwKICAgICI4ZCIsCiAgICAiOGUiLAogICAgIjhmIiwKICAgICI5MCIsCiAgICAiOTEiLAogICAgIjkyIiwKICAgICI5MyIsCiAgICAiOTQiLAogICAgIjk1IiwKICAgICI5NiIsCiAgICAiOTciLAogICAgIjk4IiwKICAgICI5OSIsCiAgICAiOWEiLAogICAgIjliIiwKICAgICI5YyIsCiAgICAiOWQiLAogICAgIjllIiwKICAgICI5ZiIsCiAgICAiYTAiLAogICAgImExIiwKICAgICJhMiIsCiAgICAiYTMiLAogICAgImE0IiwKICAgICJhNSIsCiAgICAiYTYiLAogICAgImE3IiwKICAgICJhOCIsCiAgICAiYTkiLAogICAgImFhIiwKICAgICJhYiIsCiAgICAiYWMiLAogICAgImFkIiwKICAgICJhZSIsCiAgICAiYWYiLAogICAgImIwIiwKICAgICJiMSIsCiAgICAiYjIiLAogICAgImIzIiwKICAgICJiNCIsCiAgICAiYjUiLAogICAgImI2IiwKICAgICJiNyIsCiAgICAiYjgiLAogICAgImI5IiwKICAgICJiYSIsCiAgICAiYmIiLAogICAgImJjIiwKICAgICJiZCIsCiAgICAiYmUiLAogICAgImJmIiwKICAgICJjMCIsCiAgICAiYzEiLAogICAgImMyIiwKICAgICJjMyIsCiAgICAiYzQiLAogICAgImM1IiwKICAgICJjNiIsCiAgICAiYzciLAogICAgImM4IiwKICAgICJjOSIsCiAgICAiY2EiLAogICAgImNiIiwKICAgICJjYyIsCiAgICAiY2QiLAogICAgImNlIiwKICAgICJjZiIsCiAgICAiZDAiLAogICAgImQxIiwKICAgICJkMiIsCiAgICAiZDMiLAogICAgImQ0IiwKICAgICJkNSIsCiAgICAiZDYiLAogICAgImQ3IiwKICAgICJkOCIsCiAgICAiZDkiLAogICAgImRhIiwKICAgICJkYiIsCiAgICAiZGMiLAogICAgImRkIiwKICAgICJkZSIsCiAgICAiZGYiLAogICAgImUwIiwKICAgICJlMSIsCiAgICAiZTIiLAogICAgImUzIiwKICAgICJlNCIsCiAgICAiZTUiLAogICAgImU2IiwKICAgICJlNyIsCiAgICAiZTgiLAogICAgImU5IiwKICAgICJlYSIsCiAgICAiZWIiLAogICAgImVjIiwKICAgICJlZCIsCiAgICAiZWUiLAogICAgImVmIiwKICAgICJmMCIsCiAgICAiZjEiLAogICAgImYyIiwKICAgICJmMyIsCiAgICAiZjQiLAogICAgImY1IiwKICAgICJmNiIsCiAgICAiZjciLAogICAgImY4IiwKICAgICJmOSIsCiAgICAiZmEiLAogICAgImZiIiwKICAgICJmYyIsCiAgICAiZmQiLAogICAgImZlIiwKICAgICJmZiIKXSwgdWEgPSAxMjM0NTY3LCBEZSA9IE1hdGguUEkgLyAxODAsIFVpID0gMTgwIC8gTWF0aC5QSTsKZnVuY3Rpb24gSXQoKSB7CiAgICBsZXQgaCA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMCwgdCA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMCwgZSA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMCwgaSA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMDsKICAgIHJldHVybiAodXRbaCAmIDI1NV0gKyB1dFtoID4+IDggJiAyNTVdICsgdXRbaCA+PiAxNiAmIDI1NV0gKyB1dFtoID4+IDI0ICYgMjU1XSArICItIiArIHV0W3QgJiAyNTVdICsgdXRbdCA+PiA4ICYgMjU1XSArICItIiArIHV0W3QgPj4gMTYgJiAxNSB8IDY0XSArIHV0W3QgPj4gMjQgJiAyNTVdICsgIi0iICsgdXRbZSAmIDYzIHwgMTI4XSArIHV0W2UgPj4gOCAmIDI1NV0gKyAiLSIgKyB1dFtlID4+IDE2ICYgMjU1XSArIHV0W2UgPj4gMjQgJiAyNTVdICsgdXRbaSAmIDI1NV0gKyB1dFtpID4+IDggJiAyNTVdICsgdXRbaSA+PiAxNiAmIDI1NV0gKyB1dFtpID4+IDI0ICYgMjU1XSkudG9Mb3dlckNhc2UoKTsKfQpmdW5jdGlvbiBOKGgsIHQsIGUpIHsKICAgIHJldHVybiBNYXRoLm1heCh0LCBNYXRoLm1pbihlLCBoKSk7Cn0KZnVuY3Rpb24gcW8oaCwgdCkgewogICAgcmV0dXJuIChoICUgdCArIHQpICUgdDsKfQpmdW5jdGlvbiBaYyhoLCB0LCBlLCBpLCBzKSB7CiAgICByZXR1cm4gaSArIChoIC0gdCkgKiAocyAtIGkpIC8gKGUgLSB0KTsKfQpmdW5jdGlvbiBZYyhoLCB0LCBlKSB7CiAgICByZXR1cm4gaCAhPT0gdCA/IChlIC0gaCkgLyAodCAtIGgpIDogMDsKfQpmdW5jdGlvbiBOaShoLCB0LCBlKSB7CiAgICByZXR1cm4gKDEgLSBlKSAqIGggKyBlICogdDsKfQpmdW5jdGlvbiAkYyhoLCB0LCBlLCBpKSB7CiAgICByZXR1cm4gTmkoaCwgdCwgMSAtIE1hdGguZXhwKC1lICogaSkpOwp9CmZ1bmN0aW9uIFFjKGgsIHQgPSAxKSB7CiAgICByZXR1cm4gdCAtIE1hdGguYWJzKHFvKGgsIHQgKiAyKSAtIHQpOwp9CmZ1bmN0aW9uIGpjKGgsIHQsIGUpIHsKICAgIHJldHVybiBoIDw9IHQgPyAwIDogaCA+PSBlID8gMSA6IChoID0gKGggLSB0KSAvIChlIC0gdCksIGggKiBoICogKDMgLSAyICogaCkpOwp9CmZ1bmN0aW9uIEtjKGgsIHQsIGUpIHsKICAgIHJldHVybiBoIDw9IHQgPyAwIDogaCA+PSBlID8gMSA6IChoID0gKGggLSB0KSAvIChlIC0gdCksIGggKiBoICogaCAqIChoICogKGggKiA2IC0gMTUpICsgMTApKTsKfQpmdW5jdGlvbiB0dShoLCB0KSB7CiAgICByZXR1cm4gaCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh0IC0gaCArIDEpKTsKfQpmdW5jdGlvbiBldShoLCB0KSB7CiAgICByZXR1cm4gaCArIE1hdGgucmFuZG9tKCkgKiAodCAtIGgpOwp9CmZ1bmN0aW9uIGl1KGgpIHsKICAgIHJldHVybiBoICogKC41IC0gTWF0aC5yYW5kb20oKSk7Cn0KZnVuY3Rpb24gc3UoaCkgewogICAgaCAhPT0gdm9pZCAwICYmICh1YSA9IGgpOwogICAgbGV0IHQgPSB1YSArPSAxODMxNTY1ODEzOwogICAgcmV0dXJuIHQgPSBNYXRoLmltdWwodCBeIHQgPj4+IDE1LCB0IHwgMSksIHQgXj0gdCArIE1hdGguaW11bCh0IF4gdCA+Pj4gNywgdCB8IDYxKSwgKCh0IF4gdCA+Pj4gMTQpID4+PiAwKSAvIDQyOTQ5NjcyOTY7Cn0KZnVuY3Rpb24gbnUoaCkgewogICAgcmV0dXJuIGggKiBEZTsKfQpmdW5jdGlvbiBydShoKSB7CiAgICByZXR1cm4gaCAqIFVpOwp9CmZ1bmN0aW9uIG91KGgpIHsKICAgIHJldHVybiAoaCAmIGggLSAxKSA9PT0gMCAmJiBoICE9PSAwOwp9CmZ1bmN0aW9uIGF1KGgpIHsKICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2coaCkgLyBNYXRoLkxOMikpOwp9CmZ1bmN0aW9uIGh1KGgpIHsKICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmZsb29yKE1hdGgubG9nKGgpIC8gTWF0aC5MTjIpKTsKfQpmdW5jdGlvbiBsdShoLCB0LCBlLCBpLCBzKSB7CiAgICBsZXQgbiA9IE1hdGguY29zLCByID0gTWF0aC5zaW4sIG8gPSBuKGUgLyAyKSwgYSA9IHIoZSAvIDIpLCBsID0gbigodCArIGkpIC8gMiksIGMgPSByKCh0ICsgaSkgLyAyKSwgdSA9IG4oKHQgLSBpKSAvIDIpLCBkID0gcigodCAtIGkpIC8gMiksIHAgPSBuKChpIC0gdCkgLyAyKSwgZiA9IHIoKGkgLSB0KSAvIDIpOwogICAgc3dpdGNoKHMpewogICAgICAgIGNhc2UgIlhZWCI6CiAgICAgICAgICAgIGguc2V0KG8gKiBjLCBhICogdSwgYSAqIGQsIG8gKiBsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWVpZIjoKICAgICAgICAgICAgaC5zZXQoYSAqIGQsIG8gKiBjLCBhICogdSwgbyAqIGwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJaWFoiOgogICAgICAgICAgICBoLnNldChhICogdSwgYSAqIGQsIG8gKiBjLCBvICogbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlhaWCI6CiAgICAgICAgICAgIGguc2V0KG8gKiBjLCBhICogZiwgYSAqIHAsIG8gKiBsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWVhZIjoKICAgICAgICAgICAgaC5zZXQoYSAqIHAsIG8gKiBjLCBhICogZiwgbyAqIGwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJaWVoiOgogICAgICAgICAgICBoLnNldChhICogZiwgYSAqIHAsIG8gKiBjLCBvICogbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIgKyBzKTsKICAgIH0KfQpmdW5jdGlvbiB4dChoLCB0KSB7CiAgICBzd2l0Y2godC5jb25zdHJ1Y3Rvcil7CiAgICAgICAgY2FzZSBGbG9hdDMyQXJyYXk6CiAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgIGNhc2UgVWludDMyQXJyYXk6CiAgICAgICAgICAgIHJldHVybiBoIC8gNDI5NDk2NzI5NTsKICAgICAgICBjYXNlIFVpbnQxNkFycmF5OgogICAgICAgICAgICByZXR1cm4gaCAvIDY1NTM1OwogICAgICAgIGNhc2UgVWludDhBcnJheToKICAgICAgICAgICAgcmV0dXJuIGggLyAyNTU7CiAgICAgICAgY2FzZSBJbnQzMkFycmF5OgogICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoaCAvIDIxNDc0ODM2NDcsIC0xKTsKICAgICAgICBjYXNlIEludDE2QXJyYXk6CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChoIC8gMzI3NjcsIC0xKTsKICAgICAgICBjYXNlIEludDhBcnJheToKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGggLyAxMjcsIC0xKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIik7CiAgICB9Cn0KZnVuY3Rpb24gVihoLCB0KSB7CiAgICBzd2l0Y2godC5jb25zdHJ1Y3Rvcil7CiAgICAgICAgY2FzZSBGbG9hdDMyQXJyYXk6CiAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgIGNhc2UgVWludDMyQXJyYXk6CiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggKiA0Mjk0OTY3Mjk1KTsKICAgICAgICBjYXNlIFVpbnQxNkFycmF5OgogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoICogNjU1MzUpOwogICAgICAgIGNhc2UgVWludDhBcnJheToKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoaCAqIDI1NSk7CiAgICAgICAgY2FzZSBJbnQzMkFycmF5OgogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoICogMjE0NzQ4MzY0Nyk7CiAgICAgICAgY2FzZSBJbnQxNkFycmF5OgogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoICogMzI3NjcpOwogICAgICAgIGNhc2UgSW50OEFycmF5OgogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoICogMTI3KTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIik7CiAgICB9Cn0KdmFyIFRmID0gewogICAgREVHMlJBRDogRGUsCiAgICBSQUQyREVHOiBVaSwKICAgIGdlbmVyYXRlVVVJRDogSXQsCiAgICBjbGFtcDogTiwKICAgIGV1Y2xpZGVhbk1vZHVsbzogcW8sCiAgICBtYXBMaW5lYXI6IFpjLAogICAgaW52ZXJzZUxlcnA6IFljLAogICAgbGVycDogTmksCiAgICBkYW1wOiAkYywKICAgIHBpbmdwb25nOiBRYywKICAgIHNtb290aHN0ZXA6IGpjLAogICAgc21vb3RoZXJzdGVwOiBLYywKICAgIHJhbmRJbnQ6IHR1LAogICAgcmFuZEZsb2F0OiBldSwKICAgIHJhbmRGbG9hdFNwcmVhZDogaXUsCiAgICBzZWVkZWRSYW5kb206IHN1LAogICAgZGVnVG9SYWQ6IG51LAogICAgcmFkVG9EZWc6IHJ1LAogICAgaXNQb3dlck9mVHdvOiBvdSwKICAgIGNlaWxQb3dlck9mVHdvOiBhdSwKICAgIGZsb29yUG93ZXJPZlR3bzogaHUsCiAgICBzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOiBsdSwKICAgIG5vcm1hbGl6ZTogViwKICAgIGRlbm9ybWFsaXplOiB4dAp9LCBUID0gY2xhc3MgaCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMCwgZSA9IDApewogICAgICAgIGgucHJvdG90eXBlLmlzVmVjdG9yMiA9ICEwLCB0aGlzLnggPSB0LCB0aGlzLnkgPSBlOwogICAgfQogICAgZ2V0IHdpZHRoKCkgewogICAgICAgIHJldHVybiB0aGlzLng7CiAgICB9CiAgICBzZXQgd2lkdGgodCkgewogICAgICAgIHRoaXMueCA9IHQ7CiAgICB9CiAgICBnZXQgaGVpZ2h0KCkgewogICAgICAgIHJldHVybiB0aGlzLnk7CiAgICB9CiAgICBzZXQgaGVpZ2h0KHQpIHsKICAgICAgICB0aGlzLnkgPSB0OwogICAgfQogICAgc2V0KHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpcy55ID0gZSwgdGhpczsKICAgIH0KICAgIHNldFNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQsIHRoaXMueSA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRYKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpczsKICAgIH0KICAgIHNldFkodCkgewogICAgICAgIHJldHVybiB0aGlzLnkgPSB0LCB0aGlzOwogICAgfQogICAgc2V0Q29tcG9uZW50KHQsIGUpIHsKICAgICAgICBzd2l0Y2godCl7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHRoaXMueCA9IGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgdGhpcy55ID0gZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyB0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRDb21wb25lbnQodCkgewogICAgICAgIHN3aXRjaCh0KXsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueDsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiICsgdCk7CiAgICAgICAgfQogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCwgdGhpcy55KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LngsIHRoaXMueSA9IHQueSwgdGhpczsKICAgIH0KICAgIGFkZCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCArPSB0LngsIHRoaXMueSArPSB0LnksIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKz0gdCwgdGhpcy55ICs9IHQsIHRoaXM7CiAgICB9CiAgICBhZGRWZWN0b3JzKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC54ICsgZS54LCB0aGlzLnkgPSB0LnkgKyBlLnksIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsZWRWZWN0b3IodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnggKz0gdC54ICogZSwgdGhpcy55ICs9IHQueSAqIGUsIHRoaXM7CiAgICB9CiAgICBzdWIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggLT0gdC54LCB0aGlzLnkgLT0gdC55LCB0aGlzOwogICAgfQogICAgc3ViU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54IC09IHQsIHRoaXMueSAtPSB0LCB0aGlzOwogICAgfQogICAgc3ViVmVjdG9ycyh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQueCAtIGUueCwgdGhpcy55ID0gdC55IC0gZS55LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdC54LCB0aGlzLnkgKj0gdC55LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHlTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdCwgdGhpcy55ICo9IHQsIHRoaXM7CiAgICB9CiAgICBkaXZpZGUodCkgewogICAgICAgIHJldHVybiB0aGlzLnggLz0gdC54LCB0aGlzLnkgLz0gdC55LCB0aGlzOwogICAgfQogICAgZGl2aWRlU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxIC8gdCk7CiAgICB9CiAgICBhcHBseU1hdHJpeDModCkgewogICAgICAgIGxldCBlID0gdGhpcy54LCBpID0gdGhpcy55LCBzID0gdC5lbGVtZW50czsKICAgICAgICByZXR1cm4gdGhpcy54ID0gc1swXSAqIGUgKyBzWzNdICogaSArIHNbNl0sIHRoaXMueSA9IHNbMV0gKiBlICsgc1s0XSAqIGkgKyBzWzddLCB0aGlzOwogICAgfQogICAgbWluKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5taW4odGhpcy54LCB0LngpLCB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIHQueSksIHRoaXM7CiAgICB9CiAgICBtYXgodCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSBNYXRoLm1heCh0aGlzLngsIHQueCksIHRoaXMueSA9IE1hdGgubWF4KHRoaXMueSwgdC55KSwgdGhpczsKICAgIH0KICAgIGNsYW1wKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTih0aGlzLngsIHQueCwgZS54KSwgdGhpcy55ID0gTih0aGlzLnksIHQueSwgZS55KSwgdGhpczsKICAgIH0KICAgIGNsYW1wU2NhbGFyKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTih0aGlzLngsIHQsIGUpLCB0aGlzLnkgPSBOKHRoaXMueSwgdCwgZSksIHRoaXM7CiAgICB9CiAgICBjbGFtcExlbmd0aCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmxlbmd0aCgpOwogICAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcihpIHx8IDEpLm11bHRpcGx5U2NhbGFyKE4oaSwgdCwgZSkpOwogICAgfQogICAgZmxvb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGguZmxvb3IodGhpcy54KSwgdGhpcy55ID0gTWF0aC5mbG9vcih0aGlzLnkpLCB0aGlzOwogICAgfQogICAgY2VpbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5jZWlsKHRoaXMueCksIHRoaXMueSA9IE1hdGguY2VpbCh0aGlzLnkpLCB0aGlzOwogICAgfQogICAgcm91bmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KSwgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpLCB0aGlzOwogICAgfQogICAgcm91bmRUb1plcm8oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgudHJ1bmModGhpcy54KSwgdGhpcy55ID0gTWF0aC50cnVuYyh0aGlzLnkpLCB0aGlzOwogICAgfQogICAgbmVnYXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSAtdGhpcy54LCB0aGlzLnkgPSAtdGhpcy55LCB0aGlzOwogICAgfQogICAgZG90KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ICogdC54ICsgdGhpcy55ICogdC55OwogICAgfQogICAgY3Jvc3ModCkgewogICAgICAgIHJldHVybiB0aGlzLnggKiB0LnkgLSB0aGlzLnkgKiB0Lng7CiAgICB9CiAgICBsZW5ndGhTcSgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55OwogICAgfQogICAgbGVuZ3RoKCkgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTsKICAgIH0KICAgIG1hbmhhdHRhbkxlbmd0aCgpIHsKICAgICAgICByZXR1cm4gTWF0aC5hYnModGhpcy54KSArIE1hdGguYWJzKHRoaXMueSk7CiAgICB9CiAgICBub3JtYWxpemUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCkgfHwgMSk7CiAgICB9CiAgICBhbmdsZSgpIHsKICAgICAgICByZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LCAtdGhpcy54KSArIE1hdGguUEk7CiAgICB9CiAgICBhbmdsZVRvKHQpIHsKICAgICAgICBsZXQgZSA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkgKiB0Lmxlbmd0aFNxKCkpOwogICAgICAgIGlmIChlID09PSAwKSByZXR1cm4gTWF0aC5QSSAvIDI7CiAgICAgICAgbGV0IGkgPSB0aGlzLmRvdCh0KSAvIGU7CiAgICAgICAgcmV0dXJuIE1hdGguYWNvcyhOKGksIC0xLCAxKSk7CiAgICB9CiAgICBkaXN0YW5jZVRvKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpOwogICAgfQogICAgZGlzdGFuY2VUb1NxdWFyZWQodCkgewogICAgICAgIGxldCBlID0gdGhpcy54IC0gdC54LCBpID0gdGhpcy55IC0gdC55OwogICAgICAgIHJldHVybiBlICogZSArIGkgKiBpOwogICAgfQogICAgbWFuaGF0dGFuRGlzdGFuY2VUbyh0KSB7CiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueCAtIHQueCkgKyBNYXRoLmFicyh0aGlzLnkgLSB0LnkpOwogICAgfQogICAgc2V0TGVuZ3RoKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KTsKICAgIH0KICAgIGxlcnAodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnggKz0gKHQueCAtIHRoaXMueCkgKiBlLCB0aGlzLnkgKz0gKHQueSAtIHRoaXMueSkgKiBlLCB0aGlzOwogICAgfQogICAgbGVycFZlY3RvcnModCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LnggKyAoZS54IC0gdC54KSAqIGksIHRoaXMueSA9IHQueSArIChlLnkgLSB0LnkpICogaSwgdGhpczsKICAgIH0KICAgIGVxdWFscyh0KSB7CiAgICAgICAgcmV0dXJuIHQueCA9PT0gdGhpcy54ICYmIHQueSA9PT0gdGhpcy55OwogICAgfQogICAgZnJvbUFycmF5KHQsIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHRbZV0sIHRoaXMueSA9IHRbZSArIDFdLCB0aGlzOwogICAgfQogICAgdG9BcnJheSh0ID0gW10sIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRbZV0gPSB0aGlzLngsIHRbZSArIDFdID0gdGhpcy55LCB0OwogICAgfQogICAgZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQuZ2V0WChlKSwgdGhpcy55ID0gdC5nZXRZKGUpLCB0aGlzOwogICAgfQogICAgcm90YXRlQXJvdW5kKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IE1hdGguY29zKGUpLCBzID0gTWF0aC5zaW4oZSksIG4gPSB0aGlzLnggLSB0LngsIHIgPSB0aGlzLnkgLSB0Lnk7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IG4gKiBpIC0gciAqIHMgKyB0LngsIHRoaXMueSA9IG4gKiBzICsgciAqIGkgKyB0LnksIHRoaXM7CiAgICB9CiAgICByYW5kb20oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucmFuZG9tKCksIHRoaXMueSA9IE1hdGgucmFuZG9tKCksIHRoaXM7CiAgICB9CiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgeWllbGQgdGhpcy54LCB5aWVsZCB0aGlzLnk7CiAgICB9Cn0sIEd0ID0gY2xhc3MgaCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKXsKICAgICAgICBoLnByb3RvdHlwZS5pc01hdHJpeDMgPSAhMCwgdGhpcy5lbGVtZW50cyA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMQogICAgICAgIF0sIHQgIT09IHZvaWQgMCAmJiB0aGlzLnNldCh0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKTsKICAgIH0KICAgIHNldCh0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmVsZW1lbnRzOwogICAgICAgIHJldHVybiBjWzBdID0gdCwgY1sxXSA9IHMsIGNbMl0gPSBvLCBjWzNdID0gZSwgY1s0XSA9IG4sIGNbNV0gPSBhLCBjWzZdID0gaSwgY1s3XSA9IHIsIGNbOF0gPSBsLCB0aGlzOwogICAgfQogICAgaWRlbnRpdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmVsZW1lbnRzLCBpID0gdC5lbGVtZW50czsKICAgICAgICByZXR1cm4gZVswXSA9IGlbMF0sIGVbMV0gPSBpWzFdLCBlWzJdID0gaVsyXSwgZVszXSA9IGlbM10sIGVbNF0gPSBpWzRdLCBlWzVdID0gaVs1XSwgZVs2XSA9IGlbNl0sIGVbN10gPSBpWzddLCBlWzhdID0gaVs4XSwgdGhpczsKICAgIH0KICAgIGV4dHJhY3RCYXNpcyh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywgMCksIGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywgMSksIGkuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywgMiksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4NCh0KSB7CiAgICAgICAgbGV0IGUgPSB0LmVsZW1lbnRzOwogICAgICAgIHJldHVybiB0aGlzLnNldChlWzBdLCBlWzRdLCBlWzhdLCBlWzFdLCBlWzVdLCBlWzldLCBlWzJdLCBlWzZdLCBlWzEwXSksIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLCB0KTsKICAgIH0KICAgIHByZW11bHRpcGx5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsIHRoaXMpOwogICAgfQogICAgbXVsdGlwbHlNYXRyaWNlcyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0LmVsZW1lbnRzLCBzID0gZS5lbGVtZW50cywgbiA9IHRoaXMuZWxlbWVudHMsIHIgPSBpWzBdLCBvID0gaVszXSwgYSA9IGlbNl0sIGwgPSBpWzFdLCBjID0gaVs0XSwgdSA9IGlbN10sIGQgPSBpWzJdLCBwID0gaVs1XSwgZiA9IGlbOF0sIG0gPSBzWzBdLCB5MSA9IHNbM10sIGcgPSBzWzZdLCB4MSA9IHNbMV0sIGIgPSBzWzRdLCBNID0gc1s3XSwgXyA9IHNbMl0sIHYgPSBzWzVdLCBTID0gc1s4XTsKICAgICAgICByZXR1cm4gblswXSA9IHIgKiBtICsgbyAqIHgxICsgYSAqIF8sIG5bM10gPSByICogeTEgKyBvICogYiArIGEgKiB2LCBuWzZdID0gciAqIGcgKyBvICogTSArIGEgKiBTLCBuWzFdID0gbCAqIG0gKyBjICogeDEgKyB1ICogXywgbls0XSA9IGwgKiB5MSArIGMgKiBiICsgdSAqIHYsIG5bN10gPSBsICogZyArIGMgKiBNICsgdSAqIFMsIG5bMl0gPSBkICogbSArIHAgKiB4MSArIGYgKiBfLCBuWzVdID0gZCAqIHkxICsgcCAqIGIgKyBmICogdiwgbls4XSA9IGQgKiBnICsgcCAqIE0gKyBmICogUywgdGhpczsKICAgIH0KICAgIG11bHRpcGx5U2NhbGFyKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIGVbMF0gKj0gdCwgZVszXSAqPSB0LCBlWzZdICo9IHQsIGVbMV0gKj0gdCwgZVs0XSAqPSB0LCBlWzddICo9IHQsIGVbMl0gKj0gdCwgZVs1XSAqPSB0LCBlWzhdICo9IHQsIHRoaXM7CiAgICB9CiAgICBkZXRlcm1pbmFudCgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuZWxlbWVudHMsIGUgPSB0WzBdLCBpID0gdFsxXSwgcyA9IHRbMl0sIG4gPSB0WzNdLCByID0gdFs0XSwgbyA9IHRbNV0sIGEgPSB0WzZdLCBsID0gdFs3XSwgYyA9IHRbOF07CiAgICAgICAgcmV0dXJuIGUgKiByICogYyAtIGUgKiBvICogbCAtIGkgKiBuICogYyArIGkgKiBvICogYSArIHMgKiBuICogbCAtIHMgKiByICogYTsKICAgIH0KICAgIGludmVydCgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuZWxlbWVudHMsIGUgPSB0WzBdLCBpID0gdFsxXSwgcyA9IHRbMl0sIG4gPSB0WzNdLCByID0gdFs0XSwgbyA9IHRbNV0sIGEgPSB0WzZdLCBsID0gdFs3XSwgYyA9IHRbOF0sIHUgPSBjICogciAtIG8gKiBsLCBkID0gbyAqIGEgLSBjICogbiwgcCA9IGwgKiBuIC0gciAqIGEsIGYgPSBlICogdSArIGkgKiBkICsgcyAqIHA7CiAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiB0aGlzLnNldCgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICBsZXQgbSA9IDEgLyBmOwogICAgICAgIHJldHVybiB0WzBdID0gdSAqIG0sIHRbMV0gPSAocyAqIGwgLSBjICogaSkgKiBtLCB0WzJdID0gKG8gKiBpIC0gcyAqIHIpICogbSwgdFszXSA9IGQgKiBtLCB0WzRdID0gKGMgKiBlIC0gcyAqIGEpICogbSwgdFs1XSA9IChzICogbiAtIG8gKiBlKSAqIG0sIHRbNl0gPSBwICogbSwgdFs3XSA9IChpICogYSAtIGwgKiBlKSAqIG0sIHRbOF0gPSAociAqIGUgLSBpICogbikgKiBtLCB0aGlzOwogICAgfQogICAgdHJhbnNwb3NlKCkgewogICAgICAgIGxldCB0LCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gdCA9IGVbMV0sIGVbMV0gPSBlWzNdLCBlWzNdID0gdCwgdCA9IGVbMl0sIGVbMl0gPSBlWzZdLCBlWzZdID0gdCwgdCA9IGVbNV0sIGVbNV0gPSBlWzddLCBlWzddID0gdCwgdGhpczsKICAgIH0KICAgIGdldE5vcm1hbE1hdHJpeCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCk7CiAgICB9CiAgICB0cmFuc3Bvc2VJbnRvQXJyYXkodCkgewogICAgICAgIGxldCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gdFswXSA9IGVbMF0sIHRbMV0gPSBlWzNdLCB0WzJdID0gZVs2XSwgdFszXSA9IGVbMV0sIHRbNF0gPSBlWzRdLCB0WzVdID0gZVs3XSwgdFs2XSA9IGVbMl0sIHRbN10gPSBlWzVdLCB0WzhdID0gZVs4XSwgdGhpczsKICAgIH0KICAgIHNldFV2VHJhbnNmb3JtKHQsIGUsIGksIHMsIG4sIHIsIG8pIHsKICAgICAgICBsZXQgYSA9IE1hdGguY29zKG4pLCBsID0gTWF0aC5zaW4obik7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KGkgKiBhLCBpICogbCwgLWkgKiAoYSAqIHIgKyBsICogbykgKyByICsgdCwgLXMgKiBsLCBzICogYSwgLXMgKiAoLWwgKiByICsgYSAqIG8pICsgbyArIGUsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgc2NhbGUodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnByZW11bHRpcGx5KEJuLm1ha2VTY2FsZSh0LCBlKSksIHRoaXM7CiAgICB9CiAgICByb3RhdGUodCkgewogICAgICAgIHJldHVybiB0aGlzLnByZW11bHRpcGx5KEJuLm1ha2VSb3RhdGlvbigtdCkpLCB0aGlzOwogICAgfQogICAgdHJhbnNsYXRlKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcmVtdWx0aXBseShCbi5tYWtlVHJhbnNsYXRpb24odCwgZSkpLCB0aGlzOwogICAgfQogICAgbWFrZVRyYW5zbGF0aW9uKHQsIGUpIHsKICAgICAgICByZXR1cm4gdC5pc1ZlY3RvcjIgPyB0aGlzLnNldCgxLCAwLCB0LngsIDAsIDEsIHQueSwgMCwgMCwgMSkgOiB0aGlzLnNldCgxLCAwLCB0LCAwLCAxLCBlLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIG1ha2VSb3RhdGlvbih0KSB7CiAgICAgICAgbGV0IGUgPSBNYXRoLmNvcyh0KSwgaSA9IE1hdGguc2luKHQpOwogICAgICAgIHJldHVybiB0aGlzLnNldChlLCAtaSwgMCwgaSwgZSwgMCwgMCwgMCwgMSksIHRoaXM7CiAgICB9CiAgICBtYWtlU2NhbGUodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnNldCh0LCAwLCAwLCAwLCBlLCAwLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIGVxdWFscyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmVsZW1lbnRzLCBpID0gdC5lbGVtZW50czsKICAgICAgICBmb3IobGV0IHMgPSAwOyBzIDwgOTsgcysrKWlmIChlW3NdICE9PSBpW3NdKSByZXR1cm4gITE7CiAgICAgICAgcmV0dXJuICEwOwogICAgfQogICAgZnJvbUFycmF5KHQsIGUgPSAwKSB7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IDk7IGkrKyl0aGlzLmVsZW1lbnRzW2ldID0gdFtpICsgZV07CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KHQgPSBbXSwgZSA9IDApIHsKICAgICAgICBsZXQgaSA9IHRoaXMuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIHRbZV0gPSBpWzBdLCB0W2UgKyAxXSA9IGlbMV0sIHRbZSArIDJdID0gaVsyXSwgdFtlICsgM10gPSBpWzNdLCB0W2UgKyA0XSA9IGlbNF0sIHRbZSArIDVdID0gaVs1XSwgdFtlICsgNl0gPSBpWzZdLCB0W2UgKyA3XSA9IGlbN10sIHRbZSArIDhdID0gaVs4XSwgdDsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKTsKICAgIH0KfSwgQm4gPSBuZXcgR3Q7CmZ1bmN0aW9uIGN1KGgpIHsKICAgIGZvcihsZXQgdCA9IGgubGVuZ3RoIC0gMTsgdCA+PSAwOyAtLXQpaWYgKGhbdF0gPj0gNjU1MzUpIHJldHVybiAhMDsKICAgIHJldHVybiAhMTsKfQp2YXIgdXUgPSB7CiAgICBJbnQ4QXJyYXksCiAgICBVaW50OEFycmF5LAogICAgVWludDhDbGFtcGVkQXJyYXksCiAgICBJbnQxNkFycmF5LAogICAgVWludDE2QXJyYXksCiAgICBJbnQzMkFycmF5LAogICAgVWludDMyQXJyYXksCiAgICBGbG9hdDMyQXJyYXksCiAgICBGbG9hdDY0QXJyYXkKfTsKZnVuY3Rpb24gY2koaCwgdCkgewogICAgcmV0dXJuIG5ldyB1dVtoXSh0KTsKfQpmdW5jdGlvbiBZcyhoKSB7CiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgaCk7Cn0KZnVuY3Rpb24gSWYoKSB7CiAgICBsZXQgaCA9IFlzKCJjYW52YXMiKTsKICAgIHJldHVybiBoLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siLCBoOwp9CnZhciBkYSA9IHt9OwpmdW5jdGlvbiBDZihoKSB7CiAgICBoIGluIGRhIHx8IChkYVtoXSA9ICEwLCBjb25zb2xlLndhcm4oaCkpOwp9CmZ1bmN0aW9uIHpmKGgsIHQsIGUpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpLCBzKSB7CiAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgc3dpdGNoKGguY2xpZW50V2FpdFN5bmModCwgaC5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwgMCkpewogICAgICAgICAgICAgICAgY2FzZSBoLldBSVRfRkFJTEVEOgogICAgICAgICAgICAgICAgICAgIHMoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgaC5USU1FT1VUX0VYUElSRUQ6CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChuLCBlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQobiwgZSk7CiAgICB9KTsKfQpmdW5jdGlvbiBGZihoKSB7CiAgICBsZXQgdCA9IGguZWxlbWVudHM7CiAgICB0WzJdID0gLjUgKiB0WzJdICsgLjUgKiB0WzNdLCB0WzZdID0gLjUgKiB0WzZdICsgLjUgKiB0WzddLCB0WzEwXSA9IC41ICogdFsxMF0gKyAuNSAqIHRbMTFdLCB0WzE0XSA9IC41ICogdFsxNF0gKyAuNSAqIHRbMTVdOwp9CmZ1bmN0aW9uIEJmKGgpIHsKICAgIGxldCB0ID0gaC5lbGVtZW50czsKICAgIHRbMTFdID09PSAtMSA/ICh0WzEwXSA9IC10WzEwXSAtIDEsIHRbMTRdID0gLXRbMTRdKSA6ICh0WzEwXSA9IC10WzEwXSwgdFsxNF0gPSAtdFsxNF0gKyAxKTsKfQp2YXIgcGEgPSBuZXcgR3QoKS5zZXQoLjQxMjM5MDgsIC4zNTc1ODQzLCAuMTgwNDgwOCwgLjIxMjYzOSwgLjcxNTE2ODcsIC4wNzIxOTIzLCAuMDE5MzMwOCwgLjExOTE5NDgsIC45NTA1MzIyKSwgZmEgPSBuZXcgR3QoKS5zZXQoMy4yNDA5Njk5LCAtMS41MzczODMyLCAtLjQ5ODYxMDgsIC0uOTY5MjQzNiwgMS44NzU5Njc1LCAuMDQxNTU1MSwgLjA1NTYzMDEsIC0uMjAzOTc3LCAxLjA1Njk3MTUpOwpmdW5jdGlvbiBkdSgpIHsKICAgIGxldCBoID0gewogICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgIHdvcmtpbmdDb2xvclNwYWNlOiBoYSwKICAgICAgICBzcGFjZXM6IHt9LAogICAgICAgIGNvbnZlcnQ6IGZ1bmN0aW9uKHMsIG4sIHIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZCA9PT0gITEgfHwgbiA9PT0gciB8fCAhbiB8fCAhciB8fCAodGhpcy5zcGFjZXNbbl0udHJhbnNmZXIgPT09IEZuICYmIChzLnIgPSBhZShzLnIpLCBzLmcgPSBhZShzLmcpLCBzLmIgPSBhZShzLmIpKSwgdGhpcy5zcGFjZXNbbl0ucHJpbWFyaWVzICE9PSB0aGlzLnNwYWNlc1tyXS5wcmltYXJpZXMgJiYgKHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW25dLnRvWFlaKSwgcy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbcl0uZnJvbVhZWikpLCB0aGlzLnNwYWNlc1tyXS50cmFuc2ZlciA9PT0gRm4gJiYgKHMuciA9IGRpKHMuciksIHMuZyA9IGRpKHMuZyksIHMuYiA9IGRpKHMuYikpKSwgczsKICAgICAgICB9LAogICAgICAgIGZyb21Xb3JraW5nQ29sb3JTcGFjZTogZnVuY3Rpb24ocywgbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0KHMsIHRoaXMud29ya2luZ0NvbG9yU3BhY2UsIG4pOwogICAgICAgIH0sCiAgICAgICAgdG9Xb3JraW5nQ29sb3JTcGFjZTogZnVuY3Rpb24ocywgbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0KHMsIG4sIHRoaXMud29ya2luZ0NvbG9yU3BhY2UpOwogICAgICAgIH0sCiAgICAgICAgZ2V0UHJpbWFyaWVzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXM7CiAgICAgICAgfSwKICAgICAgICBnZXRUcmFuc2ZlcjogZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4gcyA9PT0gemwgPyBsYSA6IHRoaXMuc3BhY2VzW3NdLnRyYW5zZmVyOwogICAgICAgIH0sCiAgICAgICAgZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOiBmdW5jdGlvbihzLCBuID0gdGhpcy53b3JraW5nQ29sb3JTcGFjZSkgewogICAgICAgICAgICByZXR1cm4gcy5mcm9tQXJyYXkodGhpcy5zcGFjZXNbbl0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKTsKICAgICAgICB9LAogICAgICAgIGRlZmluZTogZnVuY3Rpb24ocykgewogICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLCBzKTsKICAgICAgICB9LAogICAgICAgIF9nZXRNYXRyaXg6IGZ1bmN0aW9uKHMsIG4sIHIpIHsKICAgICAgICAgICAgcmV0dXJuIHMuY29weSh0aGlzLnNwYWNlc1tuXS50b1hZWikubXVsdGlwbHkodGhpcy5zcGFjZXNbcl0uZnJvbVhZWik7CiAgICAgICAgfSwKICAgICAgICBfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BhY2VzW3NdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U7CiAgICAgICAgfSwKICAgICAgICBfZ2V0VW5wYWNrQ29sb3JTcGFjZTogZnVuY3Rpb24ocyA9IHRoaXMud29ya2luZ0NvbG9yU3BhY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BhY2VzW3NdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2U7CiAgICAgICAgfQogICAgfSwgdCA9IFsKICAgICAgICAuNjQsCiAgICAgICAgLjMzLAogICAgICAgIC4zLAogICAgICAgIC42LAogICAgICAgIC4xNSwKICAgICAgICAuMDYKICAgIF0sIGUgPSBbCiAgICAgICAgLjIxMjYsCiAgICAgICAgLjcxNTIsCiAgICAgICAgLjA3MjIKICAgIF0sIGkgPSBbCiAgICAgICAgLjMxMjcsCiAgICAgICAgLjMyOQogICAgXTsKICAgIHJldHVybiBoLmRlZmluZSh7CiAgICAgICAgW2hhXTogewogICAgICAgICAgICBwcmltYXJpZXM6IHQsCiAgICAgICAgICAgIHdoaXRlUG9pbnQ6IGksCiAgICAgICAgICAgIHRyYW5zZmVyOiBsYSwKICAgICAgICAgICAgdG9YWVo6IHBhLAogICAgICAgICAgICBmcm9tWFlaOiBmYSwKICAgICAgICAgICAgbHVtaW5hbmNlQ29lZmZpY2llbnRzOiBlLAogICAgICAgICAgICB3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzogewogICAgICAgICAgICAgICAgdW5wYWNrQ29sb3JTcGFjZTogQnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzogewogICAgICAgICAgICAgICAgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IEJ0CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFtCdF06IHsKICAgICAgICAgICAgcHJpbWFyaWVzOiB0LAogICAgICAgICAgICB3aGl0ZVBvaW50OiBpLAogICAgICAgICAgICB0cmFuc2ZlcjogRm4sCiAgICAgICAgICAgIHRvWFlaOiBwYSwKICAgICAgICAgICAgZnJvbVhZWjogZmEsCiAgICAgICAgICAgIGx1bWluYW5jZUNvZWZmaWNpZW50czogZSwKICAgICAgICAgICAgb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzogewogICAgICAgICAgICAgICAgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IEJ0CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KSwgaDsKfQp2YXIgVHQgPSBkdSgpOwpmdW5jdGlvbiBhZShoKSB7CiAgICByZXR1cm4gaCA8IC4wNDA0NSA/IGggKiAuMDc3Mzk5MzgwOCA6IE1hdGgucG93KGggKiAuOTQ3ODY3Mjk4NiArIC4wNTIxMzI3MDE0LCAyLjQpOwp9CmZ1bmN0aW9uIGRpKGgpIHsKICAgIHJldHVybiBoIDwgLjAwMzEzMDggPyBoICogMTIuOTIgOiAxLjA1NSAqIE1hdGgucG93KGgsIC40MTY2NikgLSAuMDU1Owp9CnZhciBHZSwgeXIgPSBjbGFzcyB7CiAgICBzdGF0aWMgZ2V0RGF0YVVSTCh0KSB7CiAgICAgICAgaWYgKC9eZGF0YTovaS50ZXN0KHQuc3JjKSB8fCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgPiAidSIpIHJldHVybiB0LnNyYzsKICAgICAgICBsZXQgZTsKICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSBlID0gdDsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR2UgPT09IHZvaWQgMCAmJiAoR2UgPSBZcygiY2FudmFzIikpLCBHZS53aWR0aCA9IHQud2lkdGgsIEdlLmhlaWdodCA9IHQuaGVpZ2h0OwogICAgICAgICAgICBsZXQgaSA9IEdlLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBJbWFnZURhdGEgPyBpLnB1dEltYWdlRGF0YSh0LCAwLCAwKSA6IGkuZHJhd0ltYWdlKHQsIDAsIDAsIHQud2lkdGgsIHQuaGVpZ2h0KSwgZSA9IEdlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZS50b0RhdGFVUkwoImltYWdlL3BuZyIpOwogICAgfQogICAgc3RhdGljIHNSR0JUb0xpbmVhcih0KSB7CiAgICAgICAgaWYgKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IDwgInUiICYmIHQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCA8ICJ1IiAmJiB0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdHlwZW9mIEltYWdlQml0bWFwIDwgInUiICYmIHQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkgewogICAgICAgICAgICBsZXQgZSA9IFlzKCJjYW52YXMiKTsKICAgICAgICAgICAgZS53aWR0aCA9IHQud2lkdGgsIGUuaGVpZ2h0ID0gdC5oZWlnaHQ7CiAgICAgICAgICAgIGxldCBpID0gZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICBpLmRyYXdJbWFnZSh0LCAwLCAwLCB0LndpZHRoLCB0LmhlaWdodCk7CiAgICAgICAgICAgIGxldCBzID0gaS5nZXRJbWFnZURhdGEoMCwgMCwgdC53aWR0aCwgdC5oZWlnaHQpLCBuID0gcy5kYXRhOwogICAgICAgICAgICBmb3IobGV0IHIgPSAwOyByIDwgbi5sZW5ndGg7IHIrKyluW3JdID0gYWUobltyXSAvIDI1NSkgKiAyNTU7CiAgICAgICAgICAgIHJldHVybiBpLnB1dEltYWdlRGF0YShzLCAwLCAwKSwgZTsKICAgICAgICB9IGVsc2UgaWYgKHQuZGF0YSkgewogICAgICAgICAgICBsZXQgZSA9IHQuZGF0YS5zbGljZSgwKTsKICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID8gZVtpXSA9IE1hdGguZmxvb3IoYWUoZVtpXSAvIDI1NSkgKiAyNTUpIDogZVtpXSA9IGFlKGVbaV0pOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZGF0YTogZSwKICAgICAgICAgICAgICAgIHdpZHRoOiB0LndpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiB0LmhlaWdodAogICAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksIHQ7CiAgICB9Cn0sIHB1ID0gMCwgYmUgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbnVsbCl7CiAgICAgICAgdGhpcy5pc1NvdXJjZSA9ICEwLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImlkIiwgewogICAgICAgICAgICB2YWx1ZTogcHUrKwogICAgICAgIH0pLCB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLmRhdGEgPSB0LCB0aGlzLmRhdGFSZWFkeSA9ICEwLCB0aGlzLnZlcnNpb24gPSAwOwogICAgfQogICAgc2V0IG5lZWRzVXBkYXRlKHQpIHsKICAgICAgICB0ID09PSAhMCAmJiB0aGlzLnZlcnNpb24rKzsKICAgIH0KICAgIHRvSlNPTih0KSB7CiAgICAgICAgbGV0IGUgPSB0ID09PSB2b2lkIDAgfHwgdHlwZW9mIHQgPT0gInN0cmluZyI7CiAgICAgICAgaWYgKCFlICYmIHQuaW1hZ2VzW3RoaXMudXVpZF0gIT09IHZvaWQgMCkgcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07CiAgICAgICAgbGV0IGkgPSB7CiAgICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCwKICAgICAgICAgICAgdXJsOiAiIgogICAgICAgIH0sIHMgPSB0aGlzLmRhdGE7CiAgICAgICAgaWYgKHMgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IG47CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHMpKSB7CiAgICAgICAgICAgICAgICBuID0gW107CiAgICAgICAgICAgICAgICBmb3IobGV0IHIgPSAwLCBvID0gcy5sZW5ndGg7IHIgPCBvOyByKyspc1tyXS5pc0RhdGFUZXh0dXJlID8gbi5wdXNoKEVuKHNbcl0uaW1hZ2UpKSA6IG4ucHVzaChFbihzW3JdKSk7CiAgICAgICAgICAgIH0gZWxzZSBuID0gRW4ocyk7CiAgICAgICAgICAgIGkudXJsID0gbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUgfHwgKHQuaW1hZ2VzW3RoaXMudXVpZF0gPSBpKSwgaTsKICAgIH0KfTsKZnVuY3Rpb24gRW4oaCkgewogICAgcmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IDwgInUiICYmIGggaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCA8ICJ1IiAmJiBoIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdHlwZW9mIEltYWdlQml0bWFwIDwgInUiICYmIGggaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCA/IHlyLmdldERhdGFVUkwoaCkgOiBoLmRhdGEgPyB7CiAgICAgICAgZGF0YTogQXJyYXkuZnJvbShoLmRhdGEpLAogICAgICAgIHdpZHRoOiBoLndpZHRoLAogICAgICAgIGhlaWdodDogaC5oZWlnaHQsCiAgICAgICAgdHlwZTogaC5kYXRhLmNvbnN0cnVjdG9yLm5hbWUKICAgIH0gOiAoY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIiksIHt9KTsKfQp2YXIgZnUgPSAwLCBsdCA9IGNsYXNzIGggZXh0ZW5kcyBxdCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gaC5ERUZBVUxUX0lNQUdFLCBlID0gaC5ERUZBVUxUX01BUFBJTkcsIGkgPSBIdCwgcyA9IEh0LCBuID0gRXQsIHIgPSB2biwgbyA9IExpLCBhID0gU2wsIGwgPSBoLkRFRkFVTFRfQU5JU09UUk9QWSwgYyA9IHpsKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzVGV4dHVyZSA9ICEwLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImlkIiwgewogICAgICAgICAgICB2YWx1ZTogZnUrKwogICAgICAgIH0pLCB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLm5hbWUgPSAiIiwgdGhpcy5zb3VyY2UgPSBuZXcgYmUodCksIHRoaXMubWlwbWFwcyA9IFtdLCB0aGlzLm1hcHBpbmcgPSBlLCB0aGlzLmNoYW5uZWwgPSAwLCB0aGlzLndyYXBTID0gaSwgdGhpcy53cmFwVCA9IHMsIHRoaXMubWFnRmlsdGVyID0gbiwgdGhpcy5taW5GaWx0ZXIgPSByLCB0aGlzLmFuaXNvdHJvcHkgPSBsLCB0aGlzLmZvcm1hdCA9IG8sIHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBudWxsLCB0aGlzLnR5cGUgPSBhLCB0aGlzLm9mZnNldCA9IG5ldyBUKDAsIDApLCB0aGlzLnJlcGVhdCA9IG5ldyBUKDEsIDEpLCB0aGlzLmNlbnRlciA9IG5ldyBUKDAsIDApLCB0aGlzLnJvdGF0aW9uID0gMCwgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gITAsIHRoaXMubWF0cml4ID0gbmV3IEd0LCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9ICEwLCB0aGlzLnByZW11bHRpcGx5QWxwaGEgPSAhMSwgdGhpcy5mbGlwWSA9ICEwLCB0aGlzLnVucGFja0FsaWdubWVudCA9IDQsIHRoaXMuY29sb3JTcGFjZSA9IGMsIHRoaXMudXNlckRhdGEgPSB7fSwgdGhpcy52ZXJzaW9uID0gMCwgdGhpcy5vblVwZGF0ZSA9IG51bGwsIHRoaXMucmVuZGVyVGFyZ2V0ID0gbnVsbCwgdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmUgPSAhMSwgdGhpcy5wbXJlbVZlcnNpb24gPSAwOwogICAgfQogICAgZ2V0IGltYWdlKCkgewogICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5kYXRhOwogICAgfQogICAgc2V0IGltYWdlKHQgPSBudWxsKSB7CiAgICAgICAgdGhpcy5zb3VyY2UuZGF0YSA9IHQ7CiAgICB9CiAgICB1cGRhdGVNYXRyaXgoKSB7CiAgICAgICAgdGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSwgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSk7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5zb3VyY2UgPSB0LnNvdXJjZSwgdGhpcy5taXBtYXBzID0gdC5taXBtYXBzLnNsaWNlKDApLCB0aGlzLm1hcHBpbmcgPSB0Lm1hcHBpbmcsIHRoaXMuY2hhbm5lbCA9IHQuY2hhbm5lbCwgdGhpcy53cmFwUyA9IHQud3JhcFMsIHRoaXMud3JhcFQgPSB0LndyYXBULCB0aGlzLm1hZ0ZpbHRlciA9IHQubWFnRmlsdGVyLCB0aGlzLm1pbkZpbHRlciA9IHQubWluRmlsdGVyLCB0aGlzLmFuaXNvdHJvcHkgPSB0LmFuaXNvdHJvcHksIHRoaXMuZm9ybWF0ID0gdC5mb3JtYXQsIHRoaXMuaW50ZXJuYWxGb3JtYXQgPSB0LmludGVybmFsRm9ybWF0LCB0aGlzLnR5cGUgPSB0LnR5cGUsIHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLCB0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSwgdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksIHRoaXMucm90YXRpb24gPSB0LnJvdGF0aW9uLCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0Lm1hdHJpeEF1dG9VcGRhdGUsIHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHQuZ2VuZXJhdGVNaXBtYXBzLCB0aGlzLnByZW11bHRpcGx5QWxwaGEgPSB0LnByZW11bHRpcGx5QWxwaGEsIHRoaXMuZmxpcFkgPSB0LmZsaXBZLCB0aGlzLnVucGFja0FsaWdubWVudCA9IHQudW5wYWNrQWxpZ25tZW50LCB0aGlzLmNvbG9yU3BhY2UgPSB0LmNvbG9yU3BhY2UsIHRoaXMucmVuZGVyVGFyZ2V0ID0gdC5yZW5kZXJUYXJnZXQsIHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdC5pc1JlbmRlclRhcmdldFRleHR1cmUsIHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSwgdGhpcy5uZWVkc1VwZGF0ZSA9ICEwLCB0aGlzOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHQgPT09IHZvaWQgMCB8fCB0eXBlb2YgdCA9PSAic3RyaW5nIjsKICAgICAgICBpZiAoIWUgJiYgdC50ZXh0dXJlc1t0aGlzLnV1aWRdICE9PSB2b2lkIDApIHJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07CiAgICAgICAgbGV0IGkgPSB7CiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uOiA0LjYsCiAgICAgICAgICAgICAgICB0eXBlOiAiVGV4dHVyZSIsCiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICJUZXh0dXJlLnRvSlNPTiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXVpZDogdGhpcy51dWlkLAogICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgIGltYWdlOiB0aGlzLnNvdXJjZS50b0pTT04odCkudXVpZCwKICAgICAgICAgICAgbWFwcGluZzogdGhpcy5tYXBwaW5nLAogICAgICAgICAgICBjaGFubmVsOiB0aGlzLmNoYW5uZWwsCiAgICAgICAgICAgIHJlcGVhdDogWwogICAgICAgICAgICAgICAgdGhpcy5yZXBlYXQueCwKICAgICAgICAgICAgICAgIHRoaXMucmVwZWF0LnkKICAgICAgICAgICAgXSwKICAgICAgICAgICAgb2Zmc2V0OiBbCiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldC54LAogICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQueQogICAgICAgICAgICBdLAogICAgICAgICAgICBjZW50ZXI6IFsKICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyLngsCiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlci55CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICAgICAgICB3cmFwOiBbCiAgICAgICAgICAgICAgICB0aGlzLndyYXBTLAogICAgICAgICAgICAgICAgdGhpcy53cmFwVAogICAgICAgICAgICBdLAogICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZm9ybWF0LAogICAgICAgICAgICBpbnRlcm5hbEZvcm1hdDogdGhpcy5pbnRlcm5hbEZvcm1hdCwKICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLAogICAgICAgICAgICBjb2xvclNwYWNlOiB0aGlzLmNvbG9yU3BhY2UsCiAgICAgICAgICAgIG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsCiAgICAgICAgICAgIG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsCiAgICAgICAgICAgIGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSwKICAgICAgICAgICAgZmxpcFk6IHRoaXMuZmxpcFksCiAgICAgICAgICAgIGdlbmVyYXRlTWlwbWFwczogdGhpcy5nZW5lcmF0ZU1pcG1hcHMsCiAgICAgICAgICAgIHByZW11bHRpcGx5QWxwaGE6IHRoaXMucHJlbXVsdGlwbHlBbHBoYSwKICAgICAgICAgICAgdW5wYWNrQWxpZ25tZW50OiB0aGlzLnVucGFja0FsaWdubWVudAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCA+IDAgJiYgKGkudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhKSwgZSB8fCAodC50ZXh0dXJlc1t0aGlzLnV1aWRdID0gaSksIGk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgIHR5cGU6ICJkaXNwb3NlIgogICAgICAgIH0pOwogICAgfQogICAgdHJhbnNmb3JtVXYodCkgewogICAgICAgIGlmICh0aGlzLm1hcHBpbmcgIT09IExvKSByZXR1cm4gdDsKICAgICAgICBpZiAodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLCB0LnggPCAwIHx8IHQueCA+IDEpIHN3aXRjaCh0aGlzLndyYXBTKXsKICAgICAgICAgICAgY2FzZSBwcjoKICAgICAgICAgICAgICAgIHQueCA9IHQueCAtIE1hdGguZmxvb3IodC54KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEh0OgogICAgICAgICAgICAgICAgdC54ID0gdC54IDwgMCA/IDAgOiAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgZnI6CiAgICAgICAgICAgICAgICBNYXRoLmFicyhNYXRoLmZsb29yKHQueCkgJSAyKSA9PT0gMSA/IHQueCA9IE1hdGguY2VpbCh0LngpIC0gdC54IDogdC54ID0gdC54IC0gTWF0aC5mbG9vcih0LngpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0LnkgPCAwIHx8IHQueSA+IDEpIHN3aXRjaCh0aGlzLndyYXBUKXsKICAgICAgICAgICAgY2FzZSBwcjoKICAgICAgICAgICAgICAgIHQueSA9IHQueSAtIE1hdGguZmxvb3IodC55KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEh0OgogICAgICAgICAgICAgICAgdC55ID0gdC55IDwgMCA/IDAgOiAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgZnI6CiAgICAgICAgICAgICAgICBNYXRoLmFicyhNYXRoLmZsb29yKHQueSkgJSAyKSA9PT0gMSA/IHQueSA9IE1hdGguY2VpbCh0LnkpIC0gdC55IDogdC55ID0gdC55IC0gTWF0aC5mbG9vcih0LnkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmZsaXBZICYmICh0LnkgPSAxIC0gdC55KSwgdDsKICAgIH0KICAgIHNldCBuZWVkc1VwZGF0ZSh0KSB7CiAgICAgICAgdCA9PT0gITAgJiYgKHRoaXMudmVyc2lvbisrLCB0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZSA9ICEwKTsKICAgIH0KICAgIHNldCBuZWVkc1BNUkVNVXBkYXRlKHQpIHsKICAgICAgICB0ID09PSAhMCAmJiB0aGlzLnBtcmVtVmVyc2lvbisrOwogICAgfQp9OwpsdC5ERUZBVUxUX0lNQUdFID0gbnVsbDsKbHQuREVGQVVMVF9NQVBQSU5HID0gTG87Cmx0LkRFRkFVTFRfQU5JU09UUk9QWSA9IDE7CnZhciBvdCA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCA9IDAsIGUgPSAwLCBpID0gMCwgcyA9IDEpewogICAgICAgIGgucHJvdG90eXBlLmlzVmVjdG9yNCA9ICEwLCB0aGlzLnggPSB0LCB0aGlzLnkgPSBlLCB0aGlzLnogPSBpLCB0aGlzLncgPSBzOwogICAgfQogICAgZ2V0IHdpZHRoKCkgewogICAgICAgIHJldHVybiB0aGlzLno7CiAgICB9CiAgICBzZXQgd2lkdGgodCkgewogICAgICAgIHRoaXMueiA9IHQ7CiAgICB9CiAgICBnZXQgaGVpZ2h0KCkgewogICAgICAgIHJldHVybiB0aGlzLnc7CiAgICB9CiAgICBzZXQgaGVpZ2h0KHQpIHsKICAgICAgICB0aGlzLncgPSB0OwogICAgfQogICAgc2V0KHQsIGUsIGksIHMpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpcy55ID0gZSwgdGhpcy56ID0gaSwgdGhpcy53ID0gcywgdGhpczsKICAgIH0KICAgIHNldFNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQsIHRoaXMueSA9IHQsIHRoaXMueiA9IHQsIHRoaXMudyA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRYKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpczsKICAgIH0KICAgIHNldFkodCkgewogICAgICAgIHJldHVybiB0aGlzLnkgPSB0LCB0aGlzOwogICAgfQogICAgc2V0Wih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueiA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRXKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy53ID0gdCwgdGhpczsKICAgIH0KICAgIHNldENvbXBvbmVudCh0LCBlKSB7CiAgICAgICAgc3dpdGNoKHQpewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB0aGlzLnggPSBlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHRoaXMueSA9IGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgdGhpcy56ID0gZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICB0aGlzLncgPSBlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIiArIHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldENvbXBvbmVudCh0KSB7CiAgICAgICAgc3dpdGNoKHQpewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54OwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55OwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56OwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53OwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyB0KTsKICAgICAgICB9CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LngsIHRoaXMueSA9IHQueSwgdGhpcy56ID0gdC56LCB0aGlzLncgPSB0LncgIT09IHZvaWQgMCA/IHQudyA6IDEsIHRoaXM7CiAgICB9CiAgICBhZGQodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKz0gdC54LCB0aGlzLnkgKz0gdC55LCB0aGlzLnogKz0gdC56LCB0aGlzLncgKz0gdC53LCB0aGlzOwogICAgfQogICAgYWRkU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ICs9IHQsIHRoaXMueSArPSB0LCB0aGlzLnogKz0gdCwgdGhpcy53ICs9IHQsIHRoaXM7CiAgICB9CiAgICBhZGRWZWN0b3JzKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC54ICsgZS54LCB0aGlzLnkgPSB0LnkgKyBlLnksIHRoaXMueiA9IHQueiArIGUueiwgdGhpcy53ID0gdC53ICsgZS53LCB0aGlzOwogICAgfQogICAgYWRkU2NhbGVkVmVjdG9yKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ICs9IHQueCAqIGUsIHRoaXMueSArPSB0LnkgKiBlLCB0aGlzLnogKz0gdC56ICogZSwgdGhpcy53ICs9IHQudyAqIGUsIHRoaXM7CiAgICB9CiAgICBzdWIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggLT0gdC54LCB0aGlzLnkgLT0gdC55LCB0aGlzLnogLT0gdC56LCB0aGlzLncgLT0gdC53LCB0aGlzOwogICAgfQogICAgc3ViU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54IC09IHQsIHRoaXMueSAtPSB0LCB0aGlzLnogLT0gdCwgdGhpcy53IC09IHQsIHRoaXM7CiAgICB9CiAgICBzdWJWZWN0b3JzKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC54IC0gZS54LCB0aGlzLnkgPSB0LnkgLSBlLnksIHRoaXMueiA9IHQueiAtIGUueiwgdGhpcy53ID0gdC53IC0gZS53LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdC54LCB0aGlzLnkgKj0gdC55LCB0aGlzLnogKj0gdC56LCB0aGlzLncgKj0gdC53LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHlTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdCwgdGhpcy55ICo9IHQsIHRoaXMueiAqPSB0LCB0aGlzLncgKj0gdCwgdGhpczsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLngsIGkgPSB0aGlzLnksIHMgPSB0aGlzLnosIG4gPSB0aGlzLncsIHIgPSB0LmVsZW1lbnRzOwogICAgICAgIHJldHVybiB0aGlzLnggPSByWzBdICogZSArIHJbNF0gKiBpICsgcls4XSAqIHMgKyByWzEyXSAqIG4sIHRoaXMueSA9IHJbMV0gKiBlICsgcls1XSAqIGkgKyByWzldICogcyArIHJbMTNdICogbiwgdGhpcy56ID0gclsyXSAqIGUgKyByWzZdICogaSArIHJbMTBdICogcyArIHJbMTRdICogbiwgdGhpcy53ID0gclszXSAqIGUgKyByWzddICogaSArIHJbMTFdICogcyArIHJbMTVdICogbiwgdGhpczsKICAgIH0KICAgIGRpdmlkZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCAvPSB0LngsIHRoaXMueSAvPSB0LnksIHRoaXMueiAvPSB0LnosIHRoaXMudyAvPSB0LncsIHRoaXM7CiAgICB9CiAgICBkaXZpZGVTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEgLyB0KTsKICAgIH0KICAgIHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpIHsKICAgICAgICB0aGlzLncgPSAyICogTWF0aC5hY29zKHQudyk7CiAgICAgICAgbGV0IGUgPSBNYXRoLnNxcnQoMSAtIHQudyAqIHQudyk7CiAgICAgICAgcmV0dXJuIGUgPCAxZS00ID8gKHRoaXMueCA9IDEsIHRoaXMueSA9IDAsIHRoaXMueiA9IDApIDogKHRoaXMueCA9IHQueCAvIGUsIHRoaXMueSA9IHQueSAvIGUsIHRoaXMueiA9IHQueiAvIGUpLCB0aGlzOwogICAgfQogICAgc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpIHsKICAgICAgICBsZXQgZSwgaSwgcywgbiwgYSA9IHQuZWxlbWVudHMsIGwgPSBhWzBdLCBjID0gYVs0XSwgdSA9IGFbOF0sIGQgPSBhWzFdLCBwID0gYVs1XSwgZiA9IGFbOV0sIG0gPSBhWzJdLCB5MSA9IGFbNl0sIGcgPSBhWzEwXTsKICAgICAgICBpZiAoTWF0aC5hYnMoYyAtIGQpIDwgLjAxICYmIE1hdGguYWJzKHUgLSBtKSA8IC4wMSAmJiBNYXRoLmFicyhmIC0geTEpIDwgLjAxKSB7CiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjICsgZCkgPCAuMSAmJiBNYXRoLmFicyh1ICsgbSkgPCAuMSAmJiBNYXRoLmFicyhmICsgeTEpIDwgLjEgJiYgTWF0aC5hYnMobCArIHAgKyBnIC0gMykgPCAuMSkgcmV0dXJuIHRoaXMuc2V0KDEsIDAsIDAsIDApLCB0aGlzOwogICAgICAgICAgICBlID0gTWF0aC5QSTsKICAgICAgICAgICAgbGV0IGIgPSAobCArIDEpIC8gMiwgTSA9IChwICsgMSkgLyAyLCBfID0gKGcgKyAxKSAvIDIsIHYgPSAoYyArIGQpIC8gNCwgUyA9ICh1ICsgbSkgLyA0LCBBID0gKGYgKyB5MSkgLyA0OwogICAgICAgICAgICByZXR1cm4gYiA+IE0gJiYgYiA+IF8gPyBiIDwgLjAxID8gKGkgPSAwLCBzID0gLjcwNzEwNjc4MSwgbiA9IC43MDcxMDY3ODEpIDogKGkgPSBNYXRoLnNxcnQoYiksIHMgPSB2IC8gaSwgbiA9IFMgLyBpKSA6IE0gPiBfID8gTSA8IC4wMSA/IChpID0gLjcwNzEwNjc4MSwgcyA9IDAsIG4gPSAuNzA3MTA2NzgxKSA6IChzID0gTWF0aC5zcXJ0KE0pLCBpID0gdiAvIHMsIG4gPSBBIC8gcykgOiBfIDwgLjAxID8gKGkgPSAuNzA3MTA2NzgxLCBzID0gLjcwNzEwNjc4MSwgbiA9IDApIDogKG4gPSBNYXRoLnNxcnQoXyksIGkgPSBTIC8gbiwgcyA9IEEgLyBuKSwgdGhpcy5zZXQoaSwgcywgbiwgZSksIHRoaXM7CiAgICAgICAgfQogICAgICAgIGxldCB4MSA9IE1hdGguc3FydCgoeTEgLSBmKSAqICh5MSAtIGYpICsgKHUgLSBtKSAqICh1IC0gbSkgKyAoZCAtIGMpICogKGQgLSBjKSk7CiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHgxKSA8IC4wMDEgJiYgKHgxID0gMSksIHRoaXMueCA9ICh5MSAtIGYpIC8geDEsIHRoaXMueSA9ICh1IC0gbSkgLyB4MSwgdGhpcy56ID0gKGQgLSBjKSAvIHgxLCB0aGlzLncgPSBNYXRoLmFjb3MoKGwgKyBwICsgZyAtIDEpIC8gMiksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4UG9zaXRpb24odCkgewogICAgICAgIGxldCBlID0gdC5lbGVtZW50czsKICAgICAgICByZXR1cm4gdGhpcy54ID0gZVsxMl0sIHRoaXMueSA9IGVbMTNdLCB0aGlzLnogPSBlWzE0XSwgdGhpcy53ID0gZVsxNV0sIHRoaXM7CiAgICB9CiAgICBtaW4odCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIHQueCksIHRoaXMueSA9IE1hdGgubWluKHRoaXMueSwgdC55KSwgdGhpcy56ID0gTWF0aC5taW4odGhpcy56LCB0LnopLCB0aGlzLncgPSBNYXRoLm1pbih0aGlzLncsIHQudyksIHRoaXM7CiAgICB9CiAgICBtYXgodCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSBNYXRoLm1heCh0aGlzLngsIHQueCksIHRoaXMueSA9IE1hdGgubWF4KHRoaXMueSwgdC55KSwgdGhpcy56ID0gTWF0aC5tYXgodGhpcy56LCB0LnopLCB0aGlzLncgPSBNYXRoLm1heCh0aGlzLncsIHQudyksIHRoaXM7CiAgICB9CiAgICBjbGFtcCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE4odGhpcy54LCB0LngsIGUueCksIHRoaXMueSA9IE4odGhpcy55LCB0LnksIGUueSksIHRoaXMueiA9IE4odGhpcy56LCB0LnosIGUueiksIHRoaXMudyA9IE4odGhpcy53LCB0LncsIGUudyksIHRoaXM7CiAgICB9CiAgICBjbGFtcFNjYWxhcih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE4odGhpcy54LCB0LCBlKSwgdGhpcy55ID0gTih0aGlzLnksIHQsIGUpLCB0aGlzLnogPSBOKHRoaXMueiwgdCwgZSksIHRoaXMudyA9IE4odGhpcy53LCB0LCBlKSwgdGhpczsKICAgIH0KICAgIGNsYW1wTGVuZ3RoKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMubGVuZ3RoKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGkgfHwgMSkubXVsdGlwbHlTY2FsYXIoTihpLCB0LCBlKSk7CiAgICB9CiAgICBmbG9vcigpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5mbG9vcih0aGlzLngpLCB0aGlzLnkgPSBNYXRoLmZsb29yKHRoaXMueSksIHRoaXMueiA9IE1hdGguZmxvb3IodGhpcy56KSwgdGhpcy53ID0gTWF0aC5mbG9vcih0aGlzLncpLCB0aGlzOwogICAgfQogICAgY2VpbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5jZWlsKHRoaXMueCksIHRoaXMueSA9IE1hdGguY2VpbCh0aGlzLnkpLCB0aGlzLnogPSBNYXRoLmNlaWwodGhpcy56KSwgdGhpcy53ID0gTWF0aC5jZWlsKHRoaXMudyksIHRoaXM7CiAgICB9CiAgICByb3VuZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpLCB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSksIHRoaXMueiA9IE1hdGgucm91bmQodGhpcy56KSwgdGhpcy53ID0gTWF0aC5yb3VuZCh0aGlzLncpLCB0aGlzOwogICAgfQogICAgcm91bmRUb1plcm8oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgudHJ1bmModGhpcy54KSwgdGhpcy55ID0gTWF0aC50cnVuYyh0aGlzLnkpLCB0aGlzLnogPSBNYXRoLnRydW5jKHRoaXMueiksIHRoaXMudyA9IE1hdGgudHJ1bmModGhpcy53KSwgdGhpczsKICAgIH0KICAgIG5lZ2F0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gLXRoaXMueCwgdGhpcy55ID0gLXRoaXMueSwgdGhpcy56ID0gLXRoaXMueiwgdGhpcy53ID0gLXRoaXMudywgdGhpczsKICAgIH0KICAgIGRvdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCAqIHQueCArIHRoaXMueSAqIHQueSArIHRoaXMueiAqIHQueiArIHRoaXMudyAqIHQudzsKICAgIH0KICAgIGxlbmd0aFNxKCkgewogICAgICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7CiAgICB9CiAgICBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncpOwogICAgfQogICAgbWFuaGF0dGFuTGVuZ3RoKCkgewogICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLngpICsgTWF0aC5hYnModGhpcy55KSArIE1hdGguYWJzKHRoaXMueikgKyBNYXRoLmFicyh0aGlzLncpOwogICAgfQogICAgbm9ybWFsaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpIHx8IDEpOwogICAgfQogICAgc2V0TGVuZ3RoKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KTsKICAgIH0KICAgIGxlcnAodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnggKz0gKHQueCAtIHRoaXMueCkgKiBlLCB0aGlzLnkgKz0gKHQueSAtIHRoaXMueSkgKiBlLCB0aGlzLnogKz0gKHQueiAtIHRoaXMueikgKiBlLCB0aGlzLncgKz0gKHQudyAtIHRoaXMudykgKiBlLCB0aGlzOwogICAgfQogICAgbGVycFZlY3RvcnModCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LnggKyAoZS54IC0gdC54KSAqIGksIHRoaXMueSA9IHQueSArIChlLnkgLSB0LnkpICogaSwgdGhpcy56ID0gdC56ICsgKGUueiAtIHQueikgKiBpLCB0aGlzLncgPSB0LncgKyAoZS53IC0gdC53KSAqIGksIHRoaXM7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0LnggPT09IHRoaXMueCAmJiB0LnkgPT09IHRoaXMueSAmJiB0LnogPT09IHRoaXMueiAmJiB0LncgPT09IHRoaXMudzsKICAgIH0KICAgIGZyb21BcnJheSh0LCBlID0gMCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0W2VdLCB0aGlzLnkgPSB0W2UgKyAxXSwgdGhpcy56ID0gdFtlICsgMl0sIHRoaXMudyA9IHRbZSArIDNdLCB0aGlzOwogICAgfQogICAgdG9BcnJheSh0ID0gW10sIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRbZV0gPSB0aGlzLngsIHRbZSArIDFdID0gdGhpcy55LCB0W2UgKyAyXSA9IHRoaXMueiwgdFtlICsgM10gPSB0aGlzLncsIHQ7CiAgICB9CiAgICBmcm9tQnVmZmVyQXR0cmlidXRlKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC5nZXRYKGUpLCB0aGlzLnkgPSB0LmdldFkoZSksIHRoaXMueiA9IHQuZ2V0WihlKSwgdGhpcy53ID0gdC5nZXRXKGUpLCB0aGlzOwogICAgfQogICAgcmFuZG9tKCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSBNYXRoLnJhbmRvbSgpLCB0aGlzLnkgPSBNYXRoLnJhbmRvbSgpLCB0aGlzLnogPSBNYXRoLnJhbmRvbSgpLCB0aGlzLncgPSBNYXRoLnJhbmRvbSgpLCB0aGlzOwogICAgfQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgIHlpZWxkIHRoaXMueCwgeWllbGQgdGhpcy55LCB5aWVsZCB0aGlzLnosIHlpZWxkIHRoaXMudzsKICAgIH0KfSwgV2kgPSBjbGFzcyBleHRlbmRzIHF0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMSwgaSA9IHt9KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzUmVuZGVyVGFyZ2V0ID0gITAsIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGUsIHRoaXMuZGVwdGggPSAxLCB0aGlzLnNjaXNzb3IgPSBuZXcgb3QoMCwgMCwgdCwgZSksIHRoaXMuc2Npc3NvclRlc3QgPSAhMSwgdGhpcy52aWV3cG9ydCA9IG5ldyBvdCgwLCAwLCB0LCBlKTsKICAgICAgICBsZXQgcyA9IHsKICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgIGhlaWdodDogZSwKICAgICAgICAgICAgZGVwdGg6IDEKICAgICAgICB9OwogICAgICAgIGkgPSBPYmplY3QuYXNzaWduKHsKICAgICAgICAgICAgZ2VuZXJhdGVNaXBtYXBzOiAhMSwKICAgICAgICAgICAgaW50ZXJuYWxGb3JtYXQ6IG51bGwsCiAgICAgICAgICAgIG1pbkZpbHRlcjogRXQsCiAgICAgICAgICAgIGRlcHRoQnVmZmVyOiAhMCwKICAgICAgICAgICAgc3RlbmNpbEJ1ZmZlcjogITEsCiAgICAgICAgICAgIHJlc29sdmVEZXB0aEJ1ZmZlcjogITAsCiAgICAgICAgICAgIHJlc29sdmVTdGVuY2lsQnVmZmVyOiAhMCwKICAgICAgICAgICAgZGVwdGhUZXh0dXJlOiBudWxsLAogICAgICAgICAgICBzYW1wbGVzOiAwLAogICAgICAgICAgICBjb3VudDogMQogICAgICAgIH0sIGkpOwogICAgICAgIGxldCBuID0gbmV3IGx0KHMsIGkubWFwcGluZywgaS53cmFwUywgaS53cmFwVCwgaS5tYWdGaWx0ZXIsIGkubWluRmlsdGVyLCBpLmZvcm1hdCwgaS50eXBlLCBpLmFuaXNvdHJvcHksIGkuY29sb3JTcGFjZSk7CiAgICAgICAgbi5mbGlwWSA9ICExLCBuLmdlbmVyYXRlTWlwbWFwcyA9IGkuZ2VuZXJhdGVNaXBtYXBzLCBuLmludGVybmFsRm9ybWF0ID0gaS5pbnRlcm5hbEZvcm1hdCwgdGhpcy50ZXh0dXJlcyA9IFtdOwogICAgICAgIGxldCByID0gaS5jb3VudDsKICAgICAgICBmb3IobGV0IG8gPSAwOyBvIDwgcjsgbysrKXRoaXMudGV4dHVyZXNbb10gPSBuLmNsb25lKCksIHRoaXMudGV4dHVyZXNbb10uaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gITAsIHRoaXMudGV4dHVyZXNbb10ucmVuZGVyVGFyZ2V0ID0gdGhpczsKICAgICAgICB0aGlzLmRlcHRoQnVmZmVyID0gaS5kZXB0aEJ1ZmZlciwgdGhpcy5zdGVuY2lsQnVmZmVyID0gaS5zdGVuY2lsQnVmZmVyLCB0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlciA9IGkucmVzb2x2ZURlcHRoQnVmZmVyLCB0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyID0gaS5yZXNvbHZlU3RlbmNpbEJ1ZmZlciwgdGhpcy5fZGVwdGhUZXh0dXJlID0gbnVsbCwgdGhpcy5kZXB0aFRleHR1cmUgPSBpLmRlcHRoVGV4dHVyZSwgdGhpcy5zYW1wbGVzID0gaS5zYW1wbGVzOwogICAgfQogICAgZ2V0IHRleHR1cmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXNbMF07CiAgICB9CiAgICBzZXQgdGV4dHVyZSh0KSB7CiAgICAgICAgdGhpcy50ZXh0dXJlc1swXSA9IHQ7CiAgICB9CiAgICBzZXQgZGVwdGhUZXh0dXJlKHQpIHsKICAgICAgICB0aGlzLl9kZXB0aFRleHR1cmUgIT09IG51bGwgJiYgKHRoaXMuX2RlcHRoVGV4dHVyZS5yZW5kZXJUYXJnZXQgPSBudWxsKSwgdCAhPT0gbnVsbCAmJiAodC5yZW5kZXJUYXJnZXQgPSB0aGlzKSwgdGhpcy5fZGVwdGhUZXh0dXJlID0gdDsKICAgIH0KICAgIGdldCBkZXB0aFRleHR1cmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlcHRoVGV4dHVyZTsKICAgIH0KICAgIHNldFNpemUodCwgZSwgaSA9IDEpIHsKICAgICAgICBpZiAodGhpcy53aWR0aCAhPT0gdCB8fCB0aGlzLmhlaWdodCAhPT0gZSB8fCB0aGlzLmRlcHRoICE9PSBpKSB7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGUsIHRoaXMuZGVwdGggPSBpOwogICAgICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gdGhpcy50ZXh0dXJlcy5sZW5ndGg7IHMgPCBuOyBzKyspdGhpcy50ZXh0dXJlc1tzXS5pbWFnZS53aWR0aCA9IHQsIHRoaXMudGV4dHVyZXNbc10uaW1hZ2UuaGVpZ2h0ID0gZSwgdGhpcy50ZXh0dXJlc1tzXS5pbWFnZS5kZXB0aCA9IGk7CiAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLnZpZXdwb3J0LnNldCgwLCAwLCB0LCBlKSwgdGhpcy5zY2lzc29yLnNldCgwLCAwLCB0LCBlKTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICB0aGlzLndpZHRoID0gdC53aWR0aCwgdGhpcy5oZWlnaHQgPSB0LmhlaWdodCwgdGhpcy5kZXB0aCA9IHQuZGVwdGgsIHRoaXMuc2Npc3Nvci5jb3B5KHQuc2Npc3NvciksIHRoaXMuc2Npc3NvclRlc3QgPSB0LnNjaXNzb3JUZXN0LCB0aGlzLnZpZXdwb3J0LmNvcHkodC52aWV3cG9ydCksIHRoaXMudGV4dHVyZXMubGVuZ3RoID0gMDsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gdC50ZXh0dXJlcy5sZW5ndGg7IGkgPCBzOyBpKyspdGhpcy50ZXh0dXJlc1tpXSA9IHQudGV4dHVyZXNbaV0uY2xvbmUoKSwgdGhpcy50ZXh0dXJlc1tpXS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSAhMCwgdGhpcy50ZXh0dXJlc1tpXS5yZW5kZXJUYXJnZXQgPSB0aGlzOwogICAgICAgIGxldCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdC50ZXh0dXJlLmltYWdlKTsKICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlLnNvdXJjZSA9IG5ldyBiZShlKSwgdGhpcy5kZXB0aEJ1ZmZlciA9IHQuZGVwdGhCdWZmZXIsIHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHQuc3RlbmNpbEJ1ZmZlciwgdGhpcy5yZXNvbHZlRGVwdGhCdWZmZXIgPSB0LnJlc29sdmVEZXB0aEJ1ZmZlciwgdGhpcy5yZXNvbHZlU3RlbmNpbEJ1ZmZlciA9IHQucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsIHQuZGVwdGhUZXh0dXJlICE9PSBudWxsICYmICh0aGlzLmRlcHRoVGV4dHVyZSA9IHQuZGVwdGhUZXh0dXJlLmNsb25lKCkpLCB0aGlzLnNhbXBsZXMgPSB0LnNhbXBsZXMsIHRoaXM7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgIHR5cGU6ICJkaXNwb3NlIgogICAgICAgIH0pOwogICAgfQp9LCBIaSA9IGNsYXNzIGV4dGVuZHMgV2kgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAxLCBpID0ge30pewogICAgICAgIHN1cGVyKHQsIGUsIGkpLCB0aGlzLmlzV2ViR0xSZW5kZXJUYXJnZXQgPSAhMDsKICAgIH0KfSwgJHMgPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBudWxsLCBlID0gMSwgaSA9IDEsIHMgPSAxKXsKICAgICAgICBzdXBlcihudWxsKSwgdGhpcy5pc0RhdGFBcnJheVRleHR1cmUgPSAhMCwgdGhpcy5pbWFnZSA9IHsKICAgICAgICAgICAgZGF0YTogdCwKICAgICAgICAgICAgd2lkdGg6IGUsCiAgICAgICAgICAgIGhlaWdodDogaSwKICAgICAgICAgICAgZGVwdGg6IHMKICAgICAgICB9LCB0aGlzLm1hZ0ZpbHRlciA9IFV0LCB0aGlzLm1pbkZpbHRlciA9IFV0LCB0aGlzLndyYXBSID0gSHQsIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gITEsIHRoaXMuZmxpcFkgPSAhMSwgdGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxLCB0aGlzLmxheWVyVXBkYXRlcyA9IG5ldyBTZXQ7CiAgICB9CiAgICBhZGRMYXllclVwZGF0ZSh0KSB7CiAgICAgICAgdGhpcy5sYXllclVwZGF0ZXMuYWRkKHQpOwogICAgfQogICAgY2xlYXJMYXllclVwZGF0ZXMoKSB7CiAgICAgICAgdGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTsKICAgIH0KfSwgbWEgPSBjbGFzcyBleHRlbmRzIEhpIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMSwgaSA9IDEsIHMgPSB7fSl7CiAgICAgICAgc3VwZXIodCwgZSwgcyksIHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0ID0gITAsIHRoaXMuZGVwdGggPSBpLCB0aGlzLnRleHR1cmUgPSBuZXcgJHMobnVsbCwgdCwgZSwgaSksIHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSAhMDsKICAgIH0KfSwgUXMgPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBudWxsLCBlID0gMSwgaSA9IDEsIHMgPSAxKXsKICAgICAgICBzdXBlcihudWxsKSwgdGhpcy5pc0RhdGEzRFRleHR1cmUgPSAhMCwgdGhpcy5pbWFnZSA9IHsKICAgICAgICAgICAgZGF0YTogdCwKICAgICAgICAgICAgd2lkdGg6IGUsCiAgICAgICAgICAgIGhlaWdodDogaSwKICAgICAgICAgICAgZGVwdGg6IHMKICAgICAgICB9LCB0aGlzLm1hZ0ZpbHRlciA9IFV0LCB0aGlzLm1pbkZpbHRlciA9IFV0LCB0aGlzLndyYXBSID0gSHQsIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gITEsIHRoaXMuZmxpcFkgPSAhMSwgdGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxOwogICAgfQp9LCB5YSA9IGNsYXNzIGV4dGVuZHMgSGkgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAxLCBpID0gMSwgcyA9IHt9KXsKICAgICAgICBzdXBlcih0LCBlLCBzKSwgdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgPSAhMCwgdGhpcy5kZXB0aCA9IGksIHRoaXMudGV4dHVyZSA9IG5ldyBRcyhudWxsLCB0LCBlLCBpKSwgdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9ICEwOwogICAgfQp9LCBidCA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAwLCBlID0gMCwgaSA9IDAsIHMgPSAxKXsKICAgICAgICB0aGlzLmlzUXVhdGVybmlvbiA9ICEwLCB0aGlzLl94ID0gdCwgdGhpcy5feSA9IGUsIHRoaXMuX3ogPSBpLCB0aGlzLl93ID0gczsKICAgIH0KICAgIHN0YXRpYyBzbGVycEZsYXQodCwgZSwgaSwgcywgbiwgciwgbykgewogICAgICAgIGxldCBhID0gaVtzICsgMF0sIGwgPSBpW3MgKyAxXSwgYyA9IGlbcyArIDJdLCB1ID0gaVtzICsgM10sIGQgPSBuW3IgKyAwXSwgcCA9IG5bciArIDFdLCBmID0gbltyICsgMl0sIG0gPSBuW3IgKyAzXTsKICAgICAgICBpZiAobyA9PT0gMCkgewogICAgICAgICAgICB0W2UgKyAwXSA9IGEsIHRbZSArIDFdID0gbCwgdFtlICsgMl0gPSBjLCB0W2UgKyAzXSA9IHU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG8gPT09IDEpIHsKICAgICAgICAgICAgdFtlICsgMF0gPSBkLCB0W2UgKyAxXSA9IHAsIHRbZSArIDJdID0gZiwgdFtlICsgM10gPSBtOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh1ICE9PSBtIHx8IGEgIT09IGQgfHwgbCAhPT0gcCB8fCBjICE9PSBmKSB7CiAgICAgICAgICAgIGxldCB5MSA9IDEgLSBvLCBnID0gYSAqIGQgKyBsICogcCArIGMgKiBmICsgdSAqIG0sIHgxID0gZyA+PSAwID8gMSA6IC0xLCBiID0gMSAtIGcgKiBnOwogICAgICAgICAgICBpZiAoYiA+IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgICAgICAgICBsZXQgXyA9IE1hdGguc3FydChiKSwgdiA9IE1hdGguYXRhbjIoXywgZyAqIHgxKTsKICAgICAgICAgICAgICAgIHkxID0gTWF0aC5zaW4oeTEgKiB2KSAvIF8sIG8gPSBNYXRoLnNpbihvICogdikgLyBfOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBNID0gbyAqIHgxOwogICAgICAgICAgICBpZiAoYSA9IGEgKiB5MSArIGQgKiBNLCBsID0gbCAqIHkxICsgcCAqIE0sIGMgPSBjICogeTEgKyBmICogTSwgdSA9IHUgKiB5MSArIG0gKiBNLCB5MSA9PT0gMSAtIG8pIHsKICAgICAgICAgICAgICAgIGxldCBfID0gMSAvIE1hdGguc3FydChhICogYSArIGwgKiBsICsgYyAqIGMgKyB1ICogdSk7CiAgICAgICAgICAgICAgICBhICo9IF8sIGwgKj0gXywgYyAqPSBfLCB1ICo9IF87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdFtlXSA9IGEsIHRbZSArIDFdID0gbCwgdFtlICsgMl0gPSBjLCB0W2UgKyAzXSA9IHU7CiAgICB9CiAgICBzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCwgZSwgaSwgcywgbiwgcikgewogICAgICAgIGxldCBvID0gaVtzXSwgYSA9IGlbcyArIDFdLCBsID0gaVtzICsgMl0sIGMgPSBpW3MgKyAzXSwgdSA9IG5bcl0sIGQgPSBuW3IgKyAxXSwgcCA9IG5bciArIDJdLCBmID0gbltyICsgM107CiAgICAgICAgcmV0dXJuIHRbZV0gPSBvICogZiArIGMgKiB1ICsgYSAqIHAgLSBsICogZCwgdFtlICsgMV0gPSBhICogZiArIGMgKiBkICsgbCAqIHUgLSBvICogcCwgdFtlICsgMl0gPSBsICogZiArIGMgKiBwICsgbyAqIGQgLSBhICogdSwgdFtlICsgM10gPSBjICogZiAtIG8gKiB1IC0gYSAqIGQgLSBsICogcCwgdDsKICAgIH0KICAgIGdldCB4KCkgewogICAgICAgIHJldHVybiB0aGlzLl94OwogICAgfQogICAgc2V0IHgodCkgewogICAgICAgIHRoaXMuX3ggPSB0LCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBnZXQgeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5feTsKICAgIH0KICAgIHNldCB5KHQpIHsKICAgICAgICB0aGlzLl95ID0gdCwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgZ2V0IHooKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3o7CiAgICB9CiAgICBzZXQgeih0KSB7CiAgICAgICAgdGhpcy5feiA9IHQsIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgIH0KICAgIGdldCB3KCkgewogICAgICAgIHJldHVybiB0aGlzLl93OwogICAgfQogICAgc2V0IHcodCkgewogICAgICAgIHRoaXMuX3cgPSB0LCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBzZXQodCwgZSwgaSwgcykgewogICAgICAgIHJldHVybiB0aGlzLl94ID0gdCwgdGhpcy5feSA9IGUsIHRoaXMuX3ogPSBpLCB0aGlzLl93ID0gcywgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggPSB0LngsIHRoaXMuX3kgPSB0LnksIHRoaXMuX3ogPSB0LnosIHRoaXMuX3cgPSB0LncsIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSwgdGhpczsKICAgIH0KICAgIHNldEZyb21FdWxlcih0LCBlID0gITApIHsKICAgICAgICBsZXQgaSA9IHQuX3gsIHMgPSB0Ll95LCBuID0gdC5feiwgciA9IHQuX29yZGVyLCBvID0gTWF0aC5jb3MsIGEgPSBNYXRoLnNpbiwgbCA9IG8oaSAvIDIpLCBjID0gbyhzIC8gMiksIHUgPSBvKG4gLyAyKSwgZCA9IGEoaSAvIDIpLCBwID0gYShzIC8gMiksIGYgPSBhKG4gLyAyKTsKICAgICAgICBzd2l0Y2gocil7CiAgICAgICAgICAgIGNhc2UgIlhZWiI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1ICsgbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1IC0gZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmICsgZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1IC0gZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIllYWiI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1ICsgbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1IC0gZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmIC0gZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1ICsgZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlpYWSI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1IC0gbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1ICsgZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmICsgZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1IC0gZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlpZWCI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1IC0gbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1ICsgZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmIC0gZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1ICsgZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIllaWCI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1ICsgbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1ICsgZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmIC0gZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1IC0gZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlhaWSI6CiAgICAgICAgICAgICAgICB0aGlzLl94ID0gZCAqIGMgKiB1IC0gbCAqIHAgKiBmLCB0aGlzLl95ID0gbCAqIHAgKiB1IC0gZCAqIGMgKiBmLCB0aGlzLl96ID0gbCAqIGMgKiBmICsgZCAqIHAgKiB1LCB0aGlzLl93ID0gbCAqIGMgKiB1ICsgZCAqIHAgKiBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiICsgcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlID09PSAhMCAmJiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tQXhpc0FuZ2xlKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IGUgLyAyLCBzID0gTWF0aC5zaW4oaSk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggPSB0LnggKiBzLCB0aGlzLl95ID0gdC55ICogcywgdGhpcy5feiA9IHQueiAqIHMsIHRoaXMuX3cgPSBNYXRoLmNvcyhpKSwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpIHsKICAgICAgICBsZXQgZSA9IHQuZWxlbWVudHMsIGkgPSBlWzBdLCBzID0gZVs0XSwgbiA9IGVbOF0sIHIgPSBlWzFdLCBvID0gZVs1XSwgYSA9IGVbOV0sIGwgPSBlWzJdLCBjID0gZVs2XSwgdSA9IGVbMTBdLCBkID0gaSArIG8gKyB1OwogICAgICAgIGlmIChkID4gMCkgewogICAgICAgICAgICBsZXQgcCA9IC41IC8gTWF0aC5zcXJ0KGQgKyAxKTsKICAgICAgICAgICAgdGhpcy5fdyA9IC4yNSAvIHAsIHRoaXMuX3ggPSAoYyAtIGEpICogcCwgdGhpcy5feSA9IChuIC0gbCkgKiBwLCB0aGlzLl96ID0gKHIgLSBzKSAqIHA7CiAgICAgICAgfSBlbHNlIGlmIChpID4gbyAmJiBpID4gdSkgewogICAgICAgICAgICBsZXQgcCA9IDIgKiBNYXRoLnNxcnQoMSArIGkgLSBvIC0gdSk7CiAgICAgICAgICAgIHRoaXMuX3cgPSAoYyAtIGEpIC8gcCwgdGhpcy5feCA9IC4yNSAqIHAsIHRoaXMuX3kgPSAocyArIHIpIC8gcCwgdGhpcy5feiA9IChuICsgbCkgLyBwOwogICAgICAgIH0gZWxzZSBpZiAobyA+IHUpIHsKICAgICAgICAgICAgbGV0IHAgPSAyICogTWF0aC5zcXJ0KDEgKyBvIC0gaSAtIHUpOwogICAgICAgICAgICB0aGlzLl93ID0gKG4gLSBsKSAvIHAsIHRoaXMuX3ggPSAocyArIHIpIC8gcCwgdGhpcy5feSA9IC4yNSAqIHAsIHRoaXMuX3ogPSAoYSArIGMpIC8gcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgcCA9IDIgKiBNYXRoLnNxcnQoMSArIHUgLSBpIC0gbyk7CiAgICAgICAgICAgIHRoaXMuX3cgPSAociAtIHMpIC8gcCwgdGhpcy5feCA9IChuICsgbCkgLyBwLCB0aGlzLl95ID0gKGEgKyBjKSAvIHAsIHRoaXMuX3ogPSAuMjUgKiBwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVVuaXRWZWN0b3JzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHQuZG90KGUpICsgMTsKICAgICAgICByZXR1cm4gaSA8IE51bWJlci5FUFNJTE9OID8gKGkgPSAwLCBNYXRoLmFicyh0LngpID4gTWF0aC5hYnModC56KSA/ICh0aGlzLl94ID0gLXQueSwgdGhpcy5feSA9IHQueCwgdGhpcy5feiA9IDAsIHRoaXMuX3cgPSBpKSA6ICh0aGlzLl94ID0gMCwgdGhpcy5feSA9IC10LnosIHRoaXMuX3ogPSB0LnksIHRoaXMuX3cgPSBpKSkgOiAodGhpcy5feCA9IHQueSAqIGUueiAtIHQueiAqIGUueSwgdGhpcy5feSA9IHQueiAqIGUueCAtIHQueCAqIGUueiwgdGhpcy5feiA9IHQueCAqIGUueSAtIHQueSAqIGUueCwgdGhpcy5fdyA9IGkpLCB0aGlzLm5vcm1hbGl6ZSgpOwogICAgfQogICAgYW5nbGVUbyh0KSB7CiAgICAgICAgcmV0dXJuIDIgKiBNYXRoLmFjb3MoTWF0aC5hYnMoTih0aGlzLmRvdCh0KSwgLTEsIDEpKSk7CiAgICB9CiAgICByb3RhdGVUb3dhcmRzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuYW5nbGVUbyh0KTsKICAgICAgICBpZiAoaSA9PT0gMCkgcmV0dXJuIHRoaXM7CiAgICAgICAgbGV0IHMgPSBNYXRoLm1pbigxLCBlIC8gaSk7CiAgICAgICAgcmV0dXJuIHRoaXMuc2xlcnAodCwgcyksIHRoaXM7CiAgICB9CiAgICBpZGVudGl0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoMCwgMCwgMCwgMSk7CiAgICB9CiAgICBpbnZlcnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKCk7CiAgICB9CiAgICBjb25qdWdhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggKj0gLTEsIHRoaXMuX3kgKj0gLTEsIHRoaXMuX3ogKj0gLTEsIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSwgdGhpczsKICAgIH0KICAgIGRvdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggKiB0Ll94ICsgdGhpcy5feSAqIHQuX3kgKyB0aGlzLl96ICogdC5feiArIHRoaXMuX3cgKiB0Ll93OwogICAgfQogICAgbGVuZ3RoU3EoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93OwogICAgfQogICAgbGVuZ3RoKCkgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cpOwogICAgfQogICAgbm9ybWFsaXplKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5sZW5ndGgoKTsKICAgICAgICByZXR1cm4gdCA9PT0gMCA/ICh0aGlzLl94ID0gMCwgdGhpcy5feSA9IDAsIHRoaXMuX3ogPSAwLCB0aGlzLl93ID0gMSkgOiAodCA9IDEgLyB0LCB0aGlzLl94ID0gdGhpcy5feCAqIHQsIHRoaXMuX3kgPSB0aGlzLl95ICogdCwgdGhpcy5feiA9IHRoaXMuX3ogKiB0LCB0aGlzLl93ID0gdGhpcy5fdyAqIHQpLCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLCB0KTsKICAgIH0KICAgIHByZW11bHRpcGx5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsIHRoaXMpOwogICAgfQogICAgbXVsdGlwbHlRdWF0ZXJuaW9ucyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0Ll94LCBzID0gdC5feSwgbiA9IHQuX3osIHIgPSB0Ll93LCBvID0gZS5feCwgYSA9IGUuX3ksIGwgPSBlLl96LCBjID0gZS5fdzsKICAgICAgICByZXR1cm4gdGhpcy5feCA9IGkgKiBjICsgciAqIG8gKyBzICogbCAtIG4gKiBhLCB0aGlzLl95ID0gcyAqIGMgKyByICogYSArIG4gKiBvIC0gaSAqIGwsIHRoaXMuX3ogPSBuICogYyArIHIgKiBsICsgaSAqIGEgLSBzICogbywgdGhpcy5fdyA9IHIgKiBjIC0gaSAqIG8gLSBzICogYSAtIG4gKiBsLCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICBzbGVycCh0LCBlKSB7CiAgICAgICAgaWYgKGUgPT09IDApIHJldHVybiB0aGlzOwogICAgICAgIGlmIChlID09PSAxKSByZXR1cm4gdGhpcy5jb3B5KHQpOwogICAgICAgIGxldCBpID0gdGhpcy5feCwgcyA9IHRoaXMuX3ksIG4gPSB0aGlzLl96LCByID0gdGhpcy5fdywgbyA9IHIgKiB0Ll93ICsgaSAqIHQuX3ggKyBzICogdC5feSArIG4gKiB0Ll96OwogICAgICAgIGlmIChvIDwgMCA/ICh0aGlzLl93ID0gLXQuX3csIHRoaXMuX3ggPSAtdC5feCwgdGhpcy5feSA9IC10Ll95LCB0aGlzLl96ID0gLXQuX3osIG8gPSAtbykgOiB0aGlzLmNvcHkodCksIG8gPj0gMSkgcmV0dXJuIHRoaXMuX3cgPSByLCB0aGlzLl94ID0gaSwgdGhpcy5feSA9IHMsIHRoaXMuX3ogPSBuLCB0aGlzOwogICAgICAgIGxldCBhID0gMSAtIG8gKiBvOwogICAgICAgIGlmIChhIDw9IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgICAgIGxldCBwID0gMSAtIGU7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ID0gcCAqIHIgKyBlICogdGhpcy5fdywgdGhpcy5feCA9IHAgKiBpICsgZSAqIHRoaXMuX3gsIHRoaXMuX3kgPSBwICogcyArIGUgKiB0aGlzLl95LCB0aGlzLl96ID0gcCAqIG4gKyBlICogdGhpcy5feiwgdGhpcy5ub3JtYWxpemUoKSwgdGhpczsKICAgICAgICB9CiAgICAgICAgbGV0IGwgPSBNYXRoLnNxcnQoYSksIGMgPSBNYXRoLmF0YW4yKGwsIG8pLCB1ID0gTWF0aC5zaW4oKDEgLSBlKSAqIGMpIC8gbCwgZCA9IE1hdGguc2luKGUgKiBjKSAvIGw7CiAgICAgICAgcmV0dXJuIHRoaXMuX3cgPSByICogdSArIHRoaXMuX3cgKiBkLCB0aGlzLl94ID0gaSAqIHUgKyB0aGlzLl94ICogZCwgdGhpcy5feSA9IHMgKiB1ICsgdGhpcy5feSAqIGQsIHRoaXMuX3ogPSBuICogdSArIHRoaXMuX3ogKiBkLCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICBzbGVycFF1YXRlcm5pb25zKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUsIGkpOwogICAgfQogICAgcmFuZG9tKCkgewogICAgICAgIGxldCB0ID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpLCBlID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpLCBpID0gTWF0aC5yYW5kb20oKSwgcyA9IE1hdGguc3FydCgxIC0gaSksIG4gPSBNYXRoLnNxcnQoaSk7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KHMgKiBNYXRoLnNpbih0KSwgcyAqIE1hdGguY29zKHQpLCBuICogTWF0aC5zaW4oZSksIG4gKiBNYXRoLmNvcyhlKSk7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0Ll94ID09PSB0aGlzLl94ICYmIHQuX3kgPT09IHRoaXMuX3kgJiYgdC5feiA9PT0gdGhpcy5feiAmJiB0Ll93ID09PSB0aGlzLl93OwogICAgfQogICAgZnJvbUFycmF5KHQsIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggPSB0W2VdLCB0aGlzLl95ID0gdFtlICsgMV0sIHRoaXMuX3ogPSB0W2UgKyAyXSwgdGhpcy5fdyA9IHRbZSArIDNdLCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KHQgPSBbXSwgZSA9IDApIHsKICAgICAgICByZXR1cm4gdFtlXSA9IHRoaXMuX3gsIHRbZSArIDFdID0gdGhpcy5feSwgdFtlICsgMl0gPSB0aGlzLl96LCB0W2UgKyAzXSA9IHRoaXMuX3csIHQ7CiAgICB9CiAgICBmcm9tQnVmZmVyQXR0cmlidXRlKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5feCA9IHQuZ2V0WChlKSwgdGhpcy5feSA9IHQuZ2V0WShlKSwgdGhpcy5feiA9IHQuZ2V0WihlKSwgdGhpcy5fdyA9IHQuZ2V0VyhlKSwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKTsKICAgIH0KICAgIF9vbkNoYW5nZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSB0LCB0aGlzOwogICAgfQogICAgX29uQ2hhbmdlQ2FsbGJhY2soKSB7fQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgIHlpZWxkIHRoaXMuX3gsIHlpZWxkIHRoaXMuX3ksIHlpZWxkIHRoaXMuX3osIHlpZWxkIHRoaXMuX3c7CiAgICB9Cn0sIHcgPSBjbGFzcyBoIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAwLCBlID0gMCwgaSA9IDApewogICAgICAgIGgucHJvdG90eXBlLmlzVmVjdG9yMyA9ICEwLCB0aGlzLnggPSB0LCB0aGlzLnkgPSBlLCB0aGlzLnogPSBpOwogICAgfQogICAgc2V0KHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gaSA9PT0gdm9pZCAwICYmIChpID0gdGhpcy56KSwgdGhpcy54ID0gdCwgdGhpcy55ID0gZSwgdGhpcy56ID0gaSwgdGhpczsKICAgIH0KICAgIHNldFNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQsIHRoaXMueSA9IHQsIHRoaXMueiA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRYKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpczsKICAgIH0KICAgIHNldFkodCkgewogICAgICAgIHJldHVybiB0aGlzLnkgPSB0LCB0aGlzOwogICAgfQogICAgc2V0Wih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueiA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRDb21wb25lbnQodCwgZSkgewogICAgICAgIHN3aXRjaCh0KXsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgdGhpcy54ID0gZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICB0aGlzLnkgPSBlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHRoaXMueiA9IGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiICsgdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0Q29tcG9uZW50KHQpIHsKICAgICAgICBzd2l0Y2godCl7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLng7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnk7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLno7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIiArIHQpOwogICAgICAgIH0KICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsIHRoaXMueSwgdGhpcy56KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LngsIHRoaXMueSA9IHQueSwgdGhpcy56ID0gdC56LCB0aGlzOwogICAgfQogICAgYWRkKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ICs9IHQueCwgdGhpcy55ICs9IHQueSwgdGhpcy56ICs9IHQueiwgdGhpczsKICAgIH0KICAgIGFkZFNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCArPSB0LCB0aGlzLnkgKz0gdCwgdGhpcy56ICs9IHQsIHRoaXM7CiAgICB9CiAgICBhZGRWZWN0b3JzKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC54ICsgZS54LCB0aGlzLnkgPSB0LnkgKyBlLnksIHRoaXMueiA9IHQueiArIGUueiwgdGhpczsKICAgIH0KICAgIGFkZFNjYWxlZFZlY3Rvcih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCArPSB0LnggKiBlLCB0aGlzLnkgKz0gdC55ICogZSwgdGhpcy56ICs9IHQueiAqIGUsIHRoaXM7CiAgICB9CiAgICBzdWIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggLT0gdC54LCB0aGlzLnkgLT0gdC55LCB0aGlzLnogLT0gdC56LCB0aGlzOwogICAgfQogICAgc3ViU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54IC09IHQsIHRoaXMueSAtPSB0LCB0aGlzLnogLT0gdCwgdGhpczsKICAgIH0KICAgIHN1YlZlY3RvcnModCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0LnggLSBlLngsIHRoaXMueSA9IHQueSAtIGUueSwgdGhpcy56ID0gdC56IC0gZS56LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdC54LCB0aGlzLnkgKj0gdC55LCB0aGlzLnogKj0gdC56LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHlTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLnggKj0gdCwgdGhpcy55ICo9IHQsIHRoaXMueiAqPSB0LCB0aGlzOwogICAgfQogICAgbXVsdGlwbHlWZWN0b3JzKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC54ICogZS54LCB0aGlzLnkgPSB0LnkgKiBlLnksIHRoaXMueiA9IHQueiAqIGUueiwgdGhpczsKICAgIH0KICAgIGFwcGx5RXVsZXIodCkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihnYS5zZXRGcm9tRXVsZXIodCkpOwogICAgfQogICAgYXBwbHlBeGlzQW5nbGUodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihnYS5zZXRGcm9tQXhpc0FuZ2xlKHQsIGUpKTsKICAgIH0KICAgIGFwcGx5TWF0cml4Myh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLngsIGkgPSB0aGlzLnksIHMgPSB0aGlzLnosIG4gPSB0LmVsZW1lbnRzOwogICAgICAgIHJldHVybiB0aGlzLnggPSBuWzBdICogZSArIG5bM10gKiBpICsgbls2XSAqIHMsIHRoaXMueSA9IG5bMV0gKiBlICsgbls0XSAqIGkgKyBuWzddICogcywgdGhpcy56ID0gblsyXSAqIGUgKyBuWzVdICogaSArIG5bOF0gKiBzLCB0aGlzOwogICAgfQogICAgYXBwbHlOb3JtYWxNYXRyaXgodCkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKTsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLngsIGkgPSB0aGlzLnksIHMgPSB0aGlzLnosIG4gPSB0LmVsZW1lbnRzLCByID0gMSAvIChuWzNdICogZSArIG5bN10gKiBpICsgblsxMV0gKiBzICsgblsxNV0pOwogICAgICAgIHJldHVybiB0aGlzLnggPSAoblswXSAqIGUgKyBuWzRdICogaSArIG5bOF0gKiBzICsgblsxMl0pICogciwgdGhpcy55ID0gKG5bMV0gKiBlICsgbls1XSAqIGkgKyBuWzldICogcyArIG5bMTNdKSAqIHIsIHRoaXMueiA9IChuWzJdICogZSArIG5bNl0gKiBpICsgblsxMF0gKiBzICsgblsxNF0pICogciwgdGhpczsKICAgIH0KICAgIGFwcGx5UXVhdGVybmlvbih0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLngsIGkgPSB0aGlzLnksIHMgPSB0aGlzLnosIG4gPSB0LngsIHIgPSB0LnksIG8gPSB0LnosIGEgPSB0LncsIGwgPSAyICogKHIgKiBzIC0gbyAqIGkpLCBjID0gMiAqIChvICogZSAtIG4gKiBzKSwgdSA9IDIgKiAobiAqIGkgLSByICogZSk7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGUgKyBhICogbCArIHIgKiB1IC0gbyAqIGMsIHRoaXMueSA9IGkgKyBhICogYyArIG8gKiBsIC0gbiAqIHUsIHRoaXMueiA9IHMgKyBhICogdSArIG4gKiBjIC0gciAqIGwsIHRoaXM7CiAgICB9CiAgICBwcm9qZWN0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpOwogICAgfQogICAgdW5wcm9qZWN0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpOwogICAgfQogICAgdHJhbnNmb3JtRGlyZWN0aW9uKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMueCwgaSA9IHRoaXMueSwgcyA9IHRoaXMueiwgbiA9IHQuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IG5bMF0gKiBlICsgbls0XSAqIGkgKyBuWzhdICogcywgdGhpcy55ID0gblsxXSAqIGUgKyBuWzVdICogaSArIG5bOV0gKiBzLCB0aGlzLnogPSBuWzJdICogZSArIG5bNl0gKiBpICsgblsxMF0gKiBzLCB0aGlzLm5vcm1hbGl6ZSgpOwogICAgfQogICAgZGl2aWRlKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54IC89IHQueCwgdGhpcy55IC89IHQueSwgdGhpcy56IC89IHQueiwgdGhpczsKICAgIH0KICAgIGRpdmlkZVNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMSAvIHQpOwogICAgfQogICAgbWluKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC5taW4odGhpcy54LCB0LngpLCB0aGlzLnkgPSBNYXRoLm1pbih0aGlzLnksIHQueSksIHRoaXMueiA9IE1hdGgubWluKHRoaXMueiwgdC56KSwgdGhpczsKICAgIH0KICAgIG1heCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgubWF4KHRoaXMueCwgdC54KSwgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCB0LnkpLCB0aGlzLnogPSBNYXRoLm1heCh0aGlzLnosIHQueiksIHRoaXM7CiAgICB9CiAgICBjbGFtcCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE4odGhpcy54LCB0LngsIGUueCksIHRoaXMueSA9IE4odGhpcy55LCB0LnksIGUueSksIHRoaXMueiA9IE4odGhpcy56LCB0LnosIGUueiksIHRoaXM7CiAgICB9CiAgICBjbGFtcFNjYWxhcih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE4odGhpcy54LCB0LCBlKSwgdGhpcy55ID0gTih0aGlzLnksIHQsIGUpLCB0aGlzLnogPSBOKHRoaXMueiwgdCwgZSksIHRoaXM7CiAgICB9CiAgICBjbGFtcExlbmd0aCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmxlbmd0aCgpOwogICAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcihpIHx8IDEpLm11bHRpcGx5U2NhbGFyKE4oaSwgdCwgZSkpOwogICAgfQogICAgZmxvb3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGguZmxvb3IodGhpcy54KSwgdGhpcy55ID0gTWF0aC5mbG9vcih0aGlzLnkpLCB0aGlzLnogPSBNYXRoLmZsb29yKHRoaXMueiksIHRoaXM7CiAgICB9CiAgICBjZWlsKCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSBNYXRoLmNlaWwodGhpcy54KSwgdGhpcy55ID0gTWF0aC5jZWlsKHRoaXMueSksIHRoaXMueiA9IE1hdGguY2VpbCh0aGlzLnopLCB0aGlzOwogICAgfQogICAgcm91bmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KSwgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpLCB0aGlzLnogPSBNYXRoLnJvdW5kKHRoaXMueiksIHRoaXM7CiAgICB9CiAgICByb3VuZFRvWmVybygpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gTWF0aC50cnVuYyh0aGlzLngpLCB0aGlzLnkgPSBNYXRoLnRydW5jKHRoaXMueSksIHRoaXMueiA9IE1hdGgudHJ1bmModGhpcy56KSwgdGhpczsKICAgIH0KICAgIG5lZ2F0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gLXRoaXMueCwgdGhpcy55ID0gLXRoaXMueSwgdGhpcy56ID0gLXRoaXMueiwgdGhpczsKICAgIH0KICAgIGRvdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCAqIHQueCArIHRoaXMueSAqIHQueSArIHRoaXMueiAqIHQuejsKICAgIH0KICAgIGxlbmd0aFNxKCkgewogICAgICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7CiAgICB9CiAgICBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnopOwogICAgfQogICAgbWFuaGF0dGFuTGVuZ3RoKCkgewogICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLngpICsgTWF0aC5hYnModGhpcy55KSArIE1hdGguYWJzKHRoaXMueik7CiAgICB9CiAgICBub3JtYWxpemUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCkgfHwgMSk7CiAgICB9CiAgICBzZXRMZW5ndGgodCkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpOwogICAgfQogICAgbGVycCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCArPSAodC54IC0gdGhpcy54KSAqIGUsIHRoaXMueSArPSAodC55IC0gdGhpcy55KSAqIGUsIHRoaXMueiArPSAodC56IC0gdGhpcy56KSAqIGUsIHRoaXM7CiAgICB9CiAgICBsZXJwVmVjdG9ycyh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQueCArIChlLnggLSB0LngpICogaSwgdGhpcy55ID0gdC55ICsgKGUueSAtIHQueSkgKiBpLCB0aGlzLnogPSB0LnogKyAoZS56IC0gdC56KSAqIGksIHRoaXM7CiAgICB9CiAgICBjcm9zcyh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsIHQpOwogICAgfQogICAgY3Jvc3NWZWN0b3JzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHQueCwgcyA9IHQueSwgbiA9IHQueiwgciA9IGUueCwgbyA9IGUueSwgYSA9IGUuejsKICAgICAgICByZXR1cm4gdGhpcy54ID0gcyAqIGEgLSBuICogbywgdGhpcy55ID0gbiAqIHIgLSBpICogYSwgdGhpcy56ID0gaSAqIG8gLSBzICogciwgdGhpczsKICAgIH0KICAgIHByb2plY3RPblZlY3Rvcih0KSB7CiAgICAgICAgbGV0IGUgPSB0Lmxlbmd0aFNxKCk7CiAgICAgICAgaWYgKGUgPT09IDApIHJldHVybiB0aGlzLnNldCgwLCAwLCAwKTsKICAgICAgICBsZXQgaSA9IHQuZG90KHRoaXMpIC8gZTsKICAgICAgICByZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKGkpOwogICAgfQogICAgcHJvamVjdE9uUGxhbmUodCkgewogICAgICAgIHJldHVybiBSbi5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSwgdGhpcy5zdWIoUm4pOwogICAgfQogICAgcmVmbGVjdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKFJuLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMiAqIHRoaXMuZG90KHQpKSk7CiAgICB9CiAgICBhbmdsZVRvKHQpIHsKICAgICAgICBsZXQgZSA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkgKiB0Lmxlbmd0aFNxKCkpOwogICAgICAgIGlmIChlID09PSAwKSByZXR1cm4gTWF0aC5QSSAvIDI7CiAgICAgICAgbGV0IGkgPSB0aGlzLmRvdCh0KSAvIGU7CiAgICAgICAgcmV0dXJuIE1hdGguYWNvcyhOKGksIC0xLCAxKSk7CiAgICB9CiAgICBkaXN0YW5jZVRvKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpOwogICAgfQogICAgZGlzdGFuY2VUb1NxdWFyZWQodCkgewogICAgICAgIGxldCBlID0gdGhpcy54IC0gdC54LCBpID0gdGhpcy55IC0gdC55LCBzID0gdGhpcy56IC0gdC56OwogICAgICAgIHJldHVybiBlICogZSArIGkgKiBpICsgcyAqIHM7CiAgICB9CiAgICBtYW5oYXR0YW5EaXN0YW5jZVRvKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5hYnModGhpcy54IC0gdC54KSArIE1hdGguYWJzKHRoaXMueSAtIHQueSkgKyBNYXRoLmFicyh0aGlzLnogLSB0LnopOwogICAgfQogICAgc2V0RnJvbVNwaGVyaWNhbCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cywgdC5waGksIHQudGhldGEpOwogICAgfQogICAgc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSBNYXRoLnNpbihlKSAqIHQ7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHMgKiBNYXRoLnNpbihpKSwgdGhpcy55ID0gTWF0aC5jb3MoZSkgKiB0LCB0aGlzLnogPSBzICogTWF0aC5jb3MoaSksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tQ3lsaW5kcmljYWwodCkgewogICAgICAgIHJldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cywgdC50aGV0YSwgdC55KTsKICAgIH0KICAgIHNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQgKiBNYXRoLnNpbihlKSwgdGhpcy55ID0gaSwgdGhpcy56ID0gdCAqIE1hdGguY29zKGUpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpIHsKICAgICAgICBsZXQgZSA9IHQuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IGVbMTJdLCB0aGlzLnkgPSBlWzEzXSwgdGhpcy56ID0gZVsxNF0sIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4U2NhbGUodCkgewogICAgICAgIGxldCBlID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsIDApLmxlbmd0aCgpLCBpID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsIDEpLmxlbmd0aCgpLCBzID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsIDIpLmxlbmd0aCgpOwogICAgICAgIHJldHVybiB0aGlzLnggPSBlLCB0aGlzLnkgPSBpLCB0aGlzLnogPSBzLCB0aGlzOwogICAgfQogICAgc2V0RnJvbU1hdHJpeENvbHVtbih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsIGUgKiA0KTsKICAgIH0KICAgIHNldEZyb21NYXRyaXgzQ29sdW1uKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywgZSAqIDMpOwogICAgfQogICAgc2V0RnJvbUV1bGVyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy54ID0gdC5feCwgdGhpcy55ID0gdC5feSwgdGhpcy56ID0gdC5feiwgdGhpczsKICAgIH0KICAgIHNldEZyb21Db2xvcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQuciwgdGhpcy55ID0gdC5nLCB0aGlzLnogPSB0LmIsIHRoaXM7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0LnggPT09IHRoaXMueCAmJiB0LnkgPT09IHRoaXMueSAmJiB0LnogPT09IHRoaXMuejsKICAgIH0KICAgIGZyb21BcnJheSh0LCBlID0gMCkgewogICAgICAgIHJldHVybiB0aGlzLnggPSB0W2VdLCB0aGlzLnkgPSB0W2UgKyAxXSwgdGhpcy56ID0gdFtlICsgMl0sIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KHQgPSBbXSwgZSA9IDApIHsKICAgICAgICByZXR1cm4gdFtlXSA9IHRoaXMueCwgdFtlICsgMV0gPSB0aGlzLnksIHRbZSArIDJdID0gdGhpcy56LCB0OwogICAgfQogICAgZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IHQuZ2V0WChlKSwgdGhpcy55ID0gdC5nZXRZKGUpLCB0aGlzLnogPSB0LmdldFooZSksIHRoaXM7CiAgICB9CiAgICByYW5kb20oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMueCA9IE1hdGgucmFuZG9tKCksIHRoaXMueSA9IE1hdGgucmFuZG9tKCksIHRoaXMueiA9IE1hdGgucmFuZG9tKCksIHRoaXM7CiAgICB9CiAgICByYW5kb21EaXJlY3Rpb24oKSB7CiAgICAgICAgbGV0IHQgPSBNYXRoLnJhbmRvbSgpICogTWF0aC5QSSAqIDIsIGUgPSBNYXRoLnJhbmRvbSgpICogMiAtIDEsIGkgPSBNYXRoLnNxcnQoMSAtIGUgKiBlKTsKICAgICAgICByZXR1cm4gdGhpcy54ID0gaSAqIE1hdGguY29zKHQpLCB0aGlzLnkgPSBlLCB0aGlzLnogPSBpICogTWF0aC5zaW4odCksIHRoaXM7CiAgICB9CiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgeWllbGQgdGhpcy54LCB5aWVsZCB0aGlzLnksIHlpZWxkIHRoaXMuejsKICAgIH0KfSwgUm4gPSBuZXcgdywgZ2EgPSBuZXcgYnQsIGZ0ID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCA9IG5ldyB3KDEgLyAwLCAxIC8gMCwgMSAvIDApLCBlID0gbmV3IHcoLTEgLyAwLCAtMSAvIDAsIC0xIC8gMCkpewogICAgICAgIHRoaXMuaXNCb3gzID0gITAsIHRoaXMubWluID0gdCwgdGhpcy5tYXggPSBlOwogICAgfQogICAgc2V0KHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5taW4uY29weSh0KSwgdGhpcy5tYXguY29weShlKSwgdGhpczsKICAgIH0KICAgIHNldEZyb21BcnJheSh0KSB7CiAgICAgICAgdGhpcy5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdC5sZW5ndGg7IGUgPCBpOyBlICs9IDMpdGhpcy5leHBhbmRCeVBvaW50KE50LmZyb21BcnJheSh0LCBlKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpIHsKICAgICAgICB0aGlzLm1ha2VFbXB0eSgpOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0LmNvdW50OyBlIDwgaTsgZSsrKXRoaXMuZXhwYW5kQnlQb2ludChOdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsIGUpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21Qb2ludHModCkgewogICAgICAgIHRoaXMubWFrZUVtcHR5KCk7CiAgICAgICAgZm9yKGxldCBlID0gMCwgaSA9IHQubGVuZ3RoOyBlIDwgaTsgZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21DZW50ZXJBbmRTaXplKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IE50LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpOwogICAgICAgIHJldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihpKSwgdGhpcy5tYXguY29weSh0KS5hZGQoaSksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tT2JqZWN0KHQsIGUgPSAhMSkgewogICAgICAgIHJldHVybiB0aGlzLm1ha2VFbXB0eSgpLCB0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsIGUpOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSwgdGhpcy5tYXguY29weSh0Lm1heCksIHRoaXM7CiAgICB9CiAgICBtYWtlRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9IDEgLyAwLCB0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtMSAvIDAsIHRoaXM7CiAgICB9CiAgICBpc0VtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLm1heC54IDwgdGhpcy5taW4ueCB8fCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSB8fCB0aGlzLm1heC56IDwgdGhpcy5taW4uejsKICAgIH0KICAgIGdldENlbnRlcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdC5zZXQoMCwgMCwgMCkgOiB0LmFkZFZlY3RvcnModGhpcy5taW4sIHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSk7CiAgICB9CiAgICBnZXRTaXplKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0LnNldCgwLCAwLCAwKSA6IHQuc3ViVmVjdG9ycyh0aGlzLm1heCwgdGhpcy5taW4pOwogICAgfQogICAgZXhwYW5kQnlQb2ludCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLm1pbih0KSwgdGhpcy5tYXgubWF4KHQpLCB0aGlzOwogICAgfQogICAgZXhwYW5kQnlWZWN0b3IodCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5zdWIodCksIHRoaXMubWF4LmFkZCh0KSwgdGhpczsKICAgIH0KICAgIGV4cGFuZEJ5U2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSwgdGhpcy5tYXguYWRkU2NhbGFyKHQpLCB0aGlzOwogICAgfQogICAgZXhwYW5kQnlPYmplY3QodCwgZSA9ICExKSB7CiAgICAgICAgdC51cGRhdGVXb3JsZE1hdHJpeCghMSwgITEpOwogICAgICAgIGxldCBpID0gdC5nZW9tZXRyeTsKICAgICAgICBpZiAoaSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBuID0gaS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgICAgICAgIGlmIChlID09PSAhMCAmJiBuICE9PSB2b2lkIDAgJiYgdC5pc0luc3RhbmNlZE1lc2ggIT09ICEwKSBmb3IobGV0IHIgPSAwLCBvID0gbi5jb3VudDsgciA8IG87IHIrKyl0LmlzTWVzaCA9PT0gITAgPyB0LmdldFZlcnRleFBvc2l0aW9uKHIsIE50KSA6IE50LmZyb21CdWZmZXJBdHRyaWJ1dGUobiwgciksIE50LmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSwgdGhpcy5leHBhbmRCeVBvaW50KE50KTsKICAgICAgICAgICAgZWxzZSB0LmJvdW5kaW5nQm94ICE9PSB2b2lkIDAgPyAodC5ib3VuZGluZ0JveCA9PT0gbnVsbCAmJiB0LmNvbXB1dGVCb3VuZGluZ0JveCgpLCBzcy5jb3B5KHQuYm91bmRpbmdCb3gpKSA6IChpLmJvdW5kaW5nQm94ID09PSBudWxsICYmIGkuY29tcHV0ZUJvdW5kaW5nQm94KCksIHNzLmNvcHkoaS5ib3VuZGluZ0JveCkpLCBzcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksIHRoaXMudW5pb24oc3MpOwogICAgICAgIH0KICAgICAgICBsZXQgcyA9IHQuY2hpbGRyZW47CiAgICAgICAgZm9yKGxldCBuID0gMCwgciA9IHMubGVuZ3RoOyBuIDwgcjsgbisrKXRoaXMuZXhwYW5kQnlPYmplY3Qoc1tuXSwgZSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb250YWluc1BvaW50KHQpIHsKICAgICAgICByZXR1cm4gdC54ID49IHRoaXMubWluLnggJiYgdC54IDw9IHRoaXMubWF4LnggJiYgdC55ID49IHRoaXMubWluLnkgJiYgdC55IDw9IHRoaXMubWF4LnkgJiYgdC56ID49IHRoaXMubWluLnogJiYgdC56IDw9IHRoaXMubWF4Lno7CiAgICB9CiAgICBjb250YWluc0JveCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLnggPD0gdC5taW4ueCAmJiB0Lm1heC54IDw9IHRoaXMubWF4LnggJiYgdGhpcy5taW4ueSA8PSB0Lm1pbi55ICYmIHQubWF4LnkgPD0gdGhpcy5tYXgueSAmJiB0aGlzLm1pbi56IDw9IHQubWluLnogJiYgdC5tYXgueiA8PSB0aGlzLm1heC56OwogICAgfQogICAgZ2V0UGFyYW1ldGVyKHQsIGUpIHsKICAgICAgICByZXR1cm4gZS5zZXQoKHQueCAtIHRoaXMubWluLngpIC8gKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgKHQueSAtIHRoaXMubWluLnkpIC8gKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSwgKHQueiAtIHRoaXMubWluLnopIC8gKHRoaXMubWF4LnogLSB0aGlzLm1pbi56KSk7CiAgICB9CiAgICBpbnRlcnNlY3RzQm94KHQpIHsKICAgICAgICByZXR1cm4gdC5tYXgueCA+PSB0aGlzLm1pbi54ICYmIHQubWluLnggPD0gdGhpcy5tYXgueCAmJiB0Lm1heC55ID49IHRoaXMubWluLnkgJiYgdC5taW4ueSA8PSB0aGlzLm1heC55ICYmIHQubWF4LnogPj0gdGhpcy5taW4ueiAmJiB0Lm1pbi56IDw9IHRoaXMubWF4Lno7CiAgICB9CiAgICBpbnRlcnNlY3RzU3BoZXJlKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLCBOdCksIE50LmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKSA8PSB0LnJhZGl1cyAqIHQucmFkaXVzOwogICAgfQogICAgaW50ZXJzZWN0c1BsYW5lKHQpIHsKICAgICAgICBsZXQgZSwgaTsKICAgICAgICByZXR1cm4gdC5ub3JtYWwueCA+IDAgPyAoZSA9IHQubm9ybWFsLnggKiB0aGlzLm1pbi54LCBpID0gdC5ub3JtYWwueCAqIHRoaXMubWF4LngpIDogKGUgPSB0Lm5vcm1hbC54ICogdGhpcy5tYXgueCwgaSA9IHQubm9ybWFsLnggKiB0aGlzLm1pbi54KSwgdC5ub3JtYWwueSA+IDAgPyAoZSArPSB0Lm5vcm1hbC55ICogdGhpcy5taW4ueSwgaSArPSB0Lm5vcm1hbC55ICogdGhpcy5tYXgueSkgOiAoZSArPSB0Lm5vcm1hbC55ICogdGhpcy5tYXgueSwgaSArPSB0Lm5vcm1hbC55ICogdGhpcy5taW4ueSksIHQubm9ybWFsLnogPiAwID8gKGUgKz0gdC5ub3JtYWwueiAqIHRoaXMubWluLnosIGkgKz0gdC5ub3JtYWwueiAqIHRoaXMubWF4LnopIDogKGUgKz0gdC5ub3JtYWwueiAqIHRoaXMubWF4LnosIGkgKz0gdC5ub3JtYWwueiAqIHRoaXMubWluLnopLCBlIDw9IC10LmNvbnN0YW50ICYmIGkgPj0gLXQuY29uc3RhbnQ7CiAgICB9CiAgICBpbnRlcnNlY3RzVHJpYW5nbGUodCkgewogICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuICExOwogICAgICAgIHRoaXMuZ2V0Q2VudGVyKEFpKSwgbnMuc3ViVmVjdG9ycyh0aGlzLm1heCwgQWkpLCBYZS5zdWJWZWN0b3JzKHQuYSwgQWkpLCBKZS5zdWJWZWN0b3JzKHQuYiwgQWkpLCBaZS5zdWJWZWN0b3JzKHQuYywgQWkpLCB1ZS5zdWJWZWN0b3JzKEplLCBYZSksIGRlLnN1YlZlY3RvcnMoWmUsIEplKSwgVGUuc3ViVmVjdG9ycyhYZSwgWmUpOwogICAgICAgIGxldCBlID0gWwogICAgICAgICAgICAwLAogICAgICAgICAgICAtdWUueiwKICAgICAgICAgICAgdWUueSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLWRlLnosCiAgICAgICAgICAgIGRlLnksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1UZS56LAogICAgICAgICAgICBUZS55LAogICAgICAgICAgICB1ZS56LAogICAgICAgICAgICAwLAogICAgICAgICAgICAtdWUueCwKICAgICAgICAgICAgZGUueiwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLWRlLngsCiAgICAgICAgICAgIFRlLnosCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1UZS54LAogICAgICAgICAgICAtdWUueSwKICAgICAgICAgICAgdWUueCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLWRlLnksCiAgICAgICAgICAgIGRlLngsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1UZS55LAogICAgICAgICAgICBUZS54LAogICAgICAgICAgICAwCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gIWtuKGUsIFhlLCBKZSwgWmUsIG5zKSB8fCAoZSA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMQogICAgICAgIF0sICFrbihlLCBYZSwgSmUsIFplLCBucykpID8gITEgOiAocnMuY3Jvc3NWZWN0b3JzKHVlLCBkZSksIGUgPSBbCiAgICAgICAgICAgIHJzLngsCiAgICAgICAgICAgIHJzLnksCiAgICAgICAgICAgIHJzLnoKICAgICAgICBdLCBrbihlLCBYZSwgSmUsIFplLCBucykpOwogICAgfQogICAgY2xhbXBQb2ludCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbiwgdGhpcy5tYXgpOwogICAgfQogICAgZGlzdGFuY2VUb1BvaW50KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsIE50KS5kaXN0YW5jZVRvKHQpOwogICAgfQogICAgZ2V0Qm91bmRpbmdTcGhlcmUodCkgewogICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHQubWFrZUVtcHR5KCkgOiAodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLCB0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZShOdCkubGVuZ3RoKCkgKiAuNSksIHQ7CiAgICB9CiAgICBpbnRlcnNlY3QodCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLCB0aGlzLm1heC5taW4odC5tYXgpLCB0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLm1ha2VFbXB0eSgpLCB0aGlzOwogICAgfQogICAgdW5pb24odCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5taW4odC5taW4pLCB0aGlzLm1heC5tYXgodC5tYXgpLCB0aGlzOwogICAgfQogICAgYXBwbHlNYXRyaXg0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0aGlzIDogKGp0WzBdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksIGp0WzFdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksIGp0WzJdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksIGp0WzNdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksIGp0WzRdLnNldCh0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksIGp0WzVdLnNldCh0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksIGp0WzZdLnNldCh0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksIGp0WzddLnNldCh0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksIHRoaXMuc2V0RnJvbVBvaW50cyhqdCksIHRoaXMpOwogICAgfQogICAgdHJhbnNsYXRlKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5taW4uYWRkKHQpLCB0aGlzLm1heC5hZGQodCksIHRoaXM7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pICYmIHQubWF4LmVxdWFscyh0aGlzLm1heCk7CiAgICB9Cn0sIGp0ID0gWwogICAgbmV3IHcsCiAgICBuZXcgdywKICAgIG5ldyB3LAogICAgbmV3IHcsCiAgICBuZXcgdywKICAgIG5ldyB3LAogICAgbmV3IHcsCiAgICBuZXcgdwpdLCBOdCA9IG5ldyB3LCBzcyA9IG5ldyBmdCwgWGUgPSBuZXcgdywgSmUgPSBuZXcgdywgWmUgPSBuZXcgdywgdWUgPSBuZXcgdywgZGUgPSBuZXcgdywgVGUgPSBuZXcgdywgQWkgPSBuZXcgdywgbnMgPSBuZXcgdywgcnMgPSBuZXcgdywgSWUgPSBuZXcgdzsKZnVuY3Rpb24ga24oaCwgdCwgZSwgaSwgcykgewogICAgZm9yKGxldCBuID0gMCwgciA9IGgubGVuZ3RoIC0gMzsgbiA8PSByOyBuICs9IDMpewogICAgICAgIEllLmZyb21BcnJheShoLCBuKTsKICAgICAgICBsZXQgbyA9IHMueCAqIE1hdGguYWJzKEllLngpICsgcy55ICogTWF0aC5hYnMoSWUueSkgKyBzLnogKiBNYXRoLmFicyhJZS56KSwgYSA9IHQuZG90KEllKSwgbCA9IGUuZG90KEllKSwgYyA9IGkuZG90KEllKTsKICAgICAgICBpZiAoTWF0aC5tYXgoLU1hdGgubWF4KGEsIGwsIGMpLCBNYXRoLm1pbihhLCBsLCBjKSkgPiBvKSByZXR1cm4gITE7CiAgICB9CiAgICByZXR1cm4gITA7Cn0KdmFyIG11ID0gbmV3IGZ0LCBTaSA9IG5ldyB3LCBQbiA9IG5ldyB3LCBodCA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgdywgZSA9IC0xKXsKICAgICAgICB0aGlzLmlzU3BoZXJlID0gITAsIHRoaXMuY2VudGVyID0gdCwgdGhpcy5yYWRpdXMgPSBlOwogICAgfQogICAgc2V0KHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSwgdGhpcy5yYWRpdXMgPSBlLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVBvaW50cyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmNlbnRlcjsKICAgICAgICBlICE9PSB2b2lkIDAgPyBpLmNvcHkoZSkgOiBtdS5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihpKTsKICAgICAgICBsZXQgcyA9IDA7CiAgICAgICAgZm9yKGxldCBuID0gMCwgciA9IHQubGVuZ3RoOyBuIDwgcjsgbisrKXMgPSBNYXRoLm1heChzLCBpLmRpc3RhbmNlVG9TcXVhcmVkKHRbbl0pKTsKICAgICAgICByZXR1cm4gdGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQocyksIHRoaXM7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksIHRoaXMucmFkaXVzID0gdC5yYWRpdXMsIHRoaXM7CiAgICB9CiAgICBpc0VtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLnJhZGl1cyA8IDA7CiAgICB9CiAgICBtYWtlRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLCAwLCAwKSwgdGhpcy5yYWRpdXMgPSAtMSwgdGhpczsKICAgIH0KICAgIGNvbnRhaW5zUG9pbnQodCkgewogICAgICAgIHJldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKSA8PSB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzOwogICAgfQogICAgZGlzdGFuY2VUb1BvaW50KHQpIHsKICAgICAgICByZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKSAtIHRoaXMucmFkaXVzOwogICAgfQogICAgaW50ZXJzZWN0c1NwaGVyZSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLnJhZGl1cyArIHQucmFkaXVzOwogICAgICAgIHJldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcikgPD0gZSAqIGU7CiAgICB9CiAgICBpbnRlcnNlY3RzQm94KHQpIHsKICAgICAgICByZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpOwogICAgfQogICAgaW50ZXJzZWN0c1BsYW5lKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKSA8PSB0aGlzLnJhZGl1czsKICAgIH0KICAgIGNsYW1wUG9pbnQodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7CiAgICAgICAgcmV0dXJuIGUuY29weSh0KSwgaSA+IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgJiYgKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSwgZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksIGU7CiAgICB9CiAgICBnZXRCb3VuZGluZ0JveCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gKHQubWFrZUVtcHR5KCksIHQpIDogKHQuc2V0KHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciksIHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLCB0KTsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSwgdGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIHQuZ2V0TWF4U2NhbGVPbkF4aXMoKSwgdGhpczsKICAgIH0KICAgIHRyYW5zbGF0ZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSwgdGhpczsKICAgIH0KICAgIGV4cGFuZEJ5UG9pbnQodCkgewogICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksIHRoaXMucmFkaXVzID0gMCwgdGhpczsKICAgICAgICBTaS5zdWJWZWN0b3JzKHQsIHRoaXMuY2VudGVyKTsKICAgICAgICBsZXQgZSA9IFNpLmxlbmd0aFNxKCk7CiAgICAgICAgaWYgKGUgPiB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzKSB7CiAgICAgICAgICAgIGxldCBpID0gTWF0aC5zcXJ0KGUpLCBzID0gKGkgLSB0aGlzLnJhZGl1cykgKiAuNTsKICAgICAgICAgICAgdGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKFNpLCBzIC8gaSksIHRoaXMucmFkaXVzICs9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdW5pb24odCkgewogICAgICAgIHJldHVybiB0LmlzRW1wdHkoKSA/IHRoaXMgOiB0aGlzLmlzRW1wdHkoKSA/ICh0aGlzLmNvcHkodCksIHRoaXMpIDogKHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcikgPT09ICEwID8gdGhpcy5yYWRpdXMgPSBNYXRoLm1heCh0aGlzLnJhZGl1cywgdC5yYWRpdXMpIDogKFBuLnN1YlZlY3RvcnModC5jZW50ZXIsIHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLCB0aGlzLmV4cGFuZEJ5UG9pbnQoU2kuY29weSh0LmNlbnRlcikuYWRkKFBuKSksIHRoaXMuZXhwYW5kQnlQb2ludChTaS5jb3B5KHQuY2VudGVyKS5zdWIoUG4pKSksIHRoaXMpOwogICAgfQogICAgZXF1YWxzKHQpIHsKICAgICAgICByZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSAmJiB0LnJhZGl1cyA9PT0gdGhpcy5yYWRpdXM7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQp9LCBLdCA9IG5ldyB3LCBPbiA9IG5ldyB3LCBvcyA9IG5ldyB3LCBwZSA9IG5ldyB3LCBObiA9IG5ldyB3LCBhcyA9IG5ldyB3LCBWbiA9IG5ldyB3LCBMZSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgdywgZSA9IG5ldyB3KDAsIDAsIC0xKSl7CiAgICAgICAgdGhpcy5vcmlnaW4gPSB0LCB0aGlzLmRpcmVjdGlvbiA9IGU7CiAgICB9CiAgICBzZXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLCB0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLCB0aGlzOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLCB0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSwgdGhpczsKICAgIH0KICAgIGF0KHQsIGUpIHsKICAgICAgICByZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sIHQpOwogICAgfQogICAgbG9va0F0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLCB0aGlzOwogICAgfQogICAgcmVjYXN0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQsIEt0KSksIHRoaXM7CiAgICB9CiAgICBjbG9zZXN0UG9pbnRUb1BvaW50KHQsIGUpIHsKICAgICAgICBlLnN1YlZlY3RvcnModCwgdGhpcy5vcmlnaW4pOwogICAgICAgIGxldCBpID0gZS5kb3QodGhpcy5kaXJlY3Rpb24pOwogICAgICAgIHJldHVybiBpIDwgMCA/IGUuY29weSh0aGlzLm9yaWdpbikgOiBlLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbiwgaSk7CiAgICB9CiAgICBkaXN0YW5jZVRvUG9pbnQodCkgewogICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSk7CiAgICB9CiAgICBkaXN0YW5jZVNxVG9Qb2ludCh0KSB7CiAgICAgICAgbGV0IGUgPSBLdC5zdWJWZWN0b3JzKHQsIHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pOwogICAgICAgIHJldHVybiBlIDwgMCA/IHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpIDogKEt0LmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbiwgZSksIEt0LmRpc3RhbmNlVG9TcXVhcmVkKHQpKTsKICAgIH0KICAgIGRpc3RhbmNlU3FUb1NlZ21lbnQodCwgZSwgaSwgcykgewogICAgICAgIE9uLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSwgb3MuY29weShlKS5zdWIodCkubm9ybWFsaXplKCksIHBlLmNvcHkodGhpcy5vcmlnaW4pLnN1YihPbik7CiAgICAgICAgbGV0IG4gPSB0LmRpc3RhbmNlVG8oZSkgKiAuNSwgciA9IC10aGlzLmRpcmVjdGlvbi5kb3Qob3MpLCBvID0gcGUuZG90KHRoaXMuZGlyZWN0aW9uKSwgYSA9IC1wZS5kb3Qob3MpLCBsID0gcGUubGVuZ3RoU3EoKSwgYyA9IE1hdGguYWJzKDEgLSByICogciksIHUsIGQsIHAsIGY7CiAgICAgICAgaWYgKGMgPiAwKSBpZiAodSA9IHIgKiBhIC0gbywgZCA9IHIgKiBvIC0gYSwgZiA9IG4gKiBjLCB1ID49IDApIGlmIChkID49IC1mKSBpZiAoZCA8PSBmKSB7CiAgICAgICAgICAgIGxldCBtID0gMSAvIGM7CiAgICAgICAgICAgIHUgKj0gbSwgZCAqPSBtLCBwID0gdSAqICh1ICsgciAqIGQgKyAyICogbykgKyBkICogKHIgKiB1ICsgZCArIDIgKiBhKSArIGw7CiAgICAgICAgfSBlbHNlIGQgPSBuLCB1ID0gTWF0aC5tYXgoMCwgLShyICogZCArIG8pKSwgcCA9IC11ICogdSArIGQgKiAoZCArIDIgKiBhKSArIGw7CiAgICAgICAgZWxzZSBkID0gLW4sIHUgPSBNYXRoLm1heCgwLCAtKHIgKiBkICsgbykpLCBwID0gLXUgKiB1ICsgZCAqIChkICsgMiAqIGEpICsgbDsKICAgICAgICBlbHNlIGQgPD0gLWYgPyAodSA9IE1hdGgubWF4KDAsIC0oLXIgKiBuICsgbykpLCBkID0gdSA+IDAgPyAtbiA6IE1hdGgubWluKE1hdGgubWF4KC1uLCAtYSksIG4pLCBwID0gLXUgKiB1ICsgZCAqIChkICsgMiAqIGEpICsgbCkgOiBkIDw9IGYgPyAodSA9IDAsIGQgPSBNYXRoLm1pbihNYXRoLm1heCgtbiwgLWEpLCBuKSwgcCA9IGQgKiAoZCArIDIgKiBhKSArIGwpIDogKHUgPSBNYXRoLm1heCgwLCAtKHIgKiBuICsgbykpLCBkID0gdSA+IDAgPyBuIDogTWF0aC5taW4oTWF0aC5tYXgoLW4sIC1hKSwgbiksIHAgPSAtdSAqIHUgKyBkICogKGQgKyAyICogYSkgKyBsKTsKICAgICAgICBlbHNlIGQgPSByID4gMCA/IC1uIDogbiwgdSA9IE1hdGgubWF4KDAsIC0ociAqIGQgKyBvKSksIHAgPSAtdSAqIHUgKyBkICogKGQgKyAyICogYSkgKyBsOwogICAgICAgIHJldHVybiBpICYmIGkuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLCB1KSwgcyAmJiBzLmNvcHkoT24pLmFkZFNjYWxlZFZlY3RvcihvcywgZCksIHA7CiAgICB9CiAgICBpbnRlcnNlY3RTcGhlcmUodCwgZSkgewogICAgICAgIEt0LnN1YlZlY3RvcnModC5jZW50ZXIsIHRoaXMub3JpZ2luKTsKICAgICAgICBsZXQgaSA9IEt0LmRvdCh0aGlzLmRpcmVjdGlvbiksIHMgPSBLdC5kb3QoS3QpIC0gaSAqIGksIG4gPSB0LnJhZGl1cyAqIHQucmFkaXVzOwogICAgICAgIGlmIChzID4gbikgcmV0dXJuIG51bGw7CiAgICAgICAgbGV0IHIgPSBNYXRoLnNxcnQobiAtIHMpLCBvID0gaSAtIHIsIGEgPSBpICsgcjsKICAgICAgICByZXR1cm4gYSA8IDAgPyBudWxsIDogbyA8IDAgPyB0aGlzLmF0KGEsIGUpIDogdGhpcy5hdChvLCBlKTsKICAgIH0KICAgIGludGVyc2VjdHNTcGhlcmUodCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKSA8PSB0LnJhZGl1cyAqIHQucmFkaXVzOwogICAgfQogICAgZGlzdGFuY2VUb1BsYW5lKHQpIHsKICAgICAgICBsZXQgZSA9IHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7CiAgICAgICAgaWYgKGUgPT09IDApIHJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbikgPT09IDAgPyAwIDogbnVsbDsKICAgICAgICBsZXQgaSA9IC0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSArIHQuY29uc3RhbnQpIC8gZTsKICAgICAgICByZXR1cm4gaSA+PSAwID8gaSA6IG51bGw7CiAgICB9CiAgICBpbnRlcnNlY3RQbGFuZSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTsKICAgICAgICByZXR1cm4gaSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLmF0KGksIGUpOwogICAgfQogICAgaW50ZXJzZWN0c1BsYW5lKHQpIHsKICAgICAgICBsZXQgZSA9IHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKICAgICAgICByZXR1cm4gZSA9PT0gMCB8fCB0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pICogZSA8IDA7CiAgICB9CiAgICBpbnRlcnNlY3RCb3godCwgZSkgewogICAgICAgIGxldCBpLCBzLCBuLCByLCBvLCBhLCBsID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsIGMgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSwgdSA9IDEgLyB0aGlzLmRpcmVjdGlvbi56LCBkID0gdGhpcy5vcmlnaW47CiAgICAgICAgcmV0dXJuIGwgPj0gMCA/IChpID0gKHQubWluLnggLSBkLngpICogbCwgcyA9ICh0Lm1heC54IC0gZC54KSAqIGwpIDogKGkgPSAodC5tYXgueCAtIGQueCkgKiBsLCBzID0gKHQubWluLnggLSBkLngpICogbCksIGMgPj0gMCA/IChuID0gKHQubWluLnkgLSBkLnkpICogYywgciA9ICh0Lm1heC55IC0gZC55KSAqIGMpIDogKG4gPSAodC5tYXgueSAtIGQueSkgKiBjLCByID0gKHQubWluLnkgLSBkLnkpICogYyksIGkgPiByIHx8IG4gPiBzIHx8ICgobiA+IGkgfHwgaXNOYU4oaSkpICYmIChpID0gbiksIChyIDwgcyB8fCBpc05hTihzKSkgJiYgKHMgPSByKSwgdSA+PSAwID8gKG8gPSAodC5taW4ueiAtIGQueikgKiB1LCBhID0gKHQubWF4LnogLSBkLnopICogdSkgOiAobyA9ICh0Lm1heC56IC0gZC56KSAqIHUsIGEgPSAodC5taW4ueiAtIGQueikgKiB1KSwgaSA+IGEgfHwgbyA+IHMpIHx8ICgobyA+IGkgfHwgaSAhPT0gaSkgJiYgKGkgPSBvKSwgKGEgPCBzIHx8IHMgIT09IHMpICYmIChzID0gYSksIHMgPCAwKSA/IG51bGwgOiB0aGlzLmF0KGkgPj0gMCA/IGkgOiBzLCBlKTsKICAgIH0KICAgIGludGVyc2VjdHNCb3godCkgewogICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdEJveCh0LCBLdCkgIT09IG51bGw7CiAgICB9CiAgICBpbnRlcnNlY3RUcmlhbmdsZSh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgTm4uc3ViVmVjdG9ycyhlLCB0KSwgYXMuc3ViVmVjdG9ycyhpLCB0KSwgVm4uY3Jvc3NWZWN0b3JzKE5uLCBhcyk7CiAgICAgICAgbGV0IHIgPSB0aGlzLmRpcmVjdGlvbi5kb3QoVm4pLCBvOwogICAgICAgIGlmIChyID4gMCkgewogICAgICAgICAgICBpZiAocykgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIG8gPSAxOwogICAgICAgIH0gZWxzZSBpZiAociA8IDApIG8gPSAtMSwgciA9IC1yOwogICAgICAgIGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgcGUuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbiwgdCk7CiAgICAgICAgbGV0IGEgPSBvICogdGhpcy5kaXJlY3Rpb24uZG90KGFzLmNyb3NzVmVjdG9ycyhwZSwgYXMpKTsKICAgICAgICBpZiAoYSA8IDApIHJldHVybiBudWxsOwogICAgICAgIGxldCBsID0gbyAqIHRoaXMuZGlyZWN0aW9uLmRvdChObi5jcm9zcyhwZSkpOwogICAgICAgIGlmIChsIDwgMCB8fCBhICsgbCA+IHIpIHJldHVybiBudWxsOwogICAgICAgIGxldCBjID0gLW8gKiBwZS5kb3QoVm4pOwogICAgICAgIHJldHVybiBjIDwgMCA/IG51bGwgOiB0aGlzLmF0KGMgLyByLCBuKTsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSwgdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLCB0aGlzOwogICAgfQogICAgZXF1YWxzKHQpIHsKICAgICAgICByZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSAmJiB0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KfSwgRCA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcywgbiwgciwgbywgYSwgbCwgYywgdSwgZCwgcCwgZiwgbSwgeTEpewogICAgICAgIGgucHJvdG90eXBlLmlzTWF0cml4NCA9ICEwLCB0aGlzLmVsZW1lbnRzID0gWwogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxCiAgICAgICAgXSwgdCAhPT0gdm9pZCAwICYmIHRoaXMuc2V0KHQsIGUsIGksIHMsIG4sIHIsIG8sIGEsIGwsIGMsIHUsIGQsIHAsIGYsIG0sIHkxKTsKICAgIH0KICAgIHNldCh0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsLCBjLCB1LCBkLCBwLCBmLCBtLCB5MSkgewogICAgICAgIGxldCBnID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gZ1swXSA9IHQsIGdbNF0gPSBlLCBnWzhdID0gaSwgZ1sxMl0gPSBzLCBnWzFdID0gbiwgZ1s1XSA9IHIsIGdbOV0gPSBvLCBnWzEzXSA9IGEsIGdbMl0gPSBsLCBnWzZdID0gYywgZ1sxMF0gPSB1LCBnWzE0XSA9IGQsIGdbM10gPSBwLCBnWzddID0gZiwgZ1sxMV0gPSBtLCBnWzE1XSA9IHkxLCB0aGlzOwogICAgfQogICAgaWRlbnRpdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmVsZW1lbnRzLCBpID0gdC5lbGVtZW50czsKICAgICAgICByZXR1cm4gZVswXSA9IGlbMF0sIGVbMV0gPSBpWzFdLCBlWzJdID0gaVsyXSwgZVszXSA9IGlbM10sIGVbNF0gPSBpWzRdLCBlWzVdID0gaVs1XSwgZVs2XSA9IGlbNl0sIGVbN10gPSBpWzddLCBlWzhdID0gaVs4XSwgZVs5XSA9IGlbOV0sIGVbMTBdID0gaVsxMF0sIGVbMTFdID0gaVsxMV0sIGVbMTJdID0gaVsxMl0sIGVbMTNdID0gaVsxM10sIGVbMTRdID0gaVsxNF0sIGVbMTVdID0gaVsxNV0sIHRoaXM7CiAgICB9CiAgICBjb3B5UG9zaXRpb24odCkgewogICAgICAgIGxldCBlID0gdGhpcy5lbGVtZW50cywgaSA9IHQuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIGVbMTJdID0gaVsxMl0sIGVbMTNdID0gaVsxM10sIGVbMTRdID0gaVsxNF0sIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4Myh0KSB7CiAgICAgICAgbGV0IGUgPSB0LmVsZW1lbnRzOwogICAgICAgIHJldHVybiB0aGlzLnNldChlWzBdLCBlWzNdLCBlWzZdLCAwLCBlWzFdLCBlWzRdLCBlWzddLCAwLCBlWzJdLCBlWzVdLCBlWzhdLCAwLCAwLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIGV4dHJhY3RCYXNpcyh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLCAwKSwgZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsIDEpLCBpLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywgMiksIHRoaXM7CiAgICB9CiAgICBtYWtlQmFzaXModCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnNldCh0LngsIGUueCwgaS54LCAwLCB0LnksIGUueSwgaS55LCAwLCB0LnosIGUueiwgaS56LCAwLCAwLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIGV4dHJhY3RSb3RhdGlvbih0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmVsZW1lbnRzLCBpID0gdC5lbGVtZW50cywgcyA9IDEgLyBZZS5zZXRGcm9tTWF0cml4Q29sdW1uKHQsIDApLmxlbmd0aCgpLCBuID0gMSAvIFllLnNldEZyb21NYXRyaXhDb2x1bW4odCwgMSkubGVuZ3RoKCksIHIgPSAxIC8gWWUuc2V0RnJvbU1hdHJpeENvbHVtbih0LCAyKS5sZW5ndGgoKTsKICAgICAgICByZXR1cm4gZVswXSA9IGlbMF0gKiBzLCBlWzFdID0gaVsxXSAqIHMsIGVbMl0gPSBpWzJdICogcywgZVszXSA9IDAsIGVbNF0gPSBpWzRdICogbiwgZVs1XSA9IGlbNV0gKiBuLCBlWzZdID0gaVs2XSAqIG4sIGVbN10gPSAwLCBlWzhdID0gaVs4XSAqIHIsIGVbOV0gPSBpWzldICogciwgZVsxMF0gPSBpWzEwXSAqIHIsIGVbMTFdID0gMCwgZVsxMl0gPSAwLCBlWzEzXSA9IDAsIGVbMTRdID0gMCwgZVsxNV0gPSAxLCB0aGlzOwogICAgfQogICAgbWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZWxlbWVudHMsIGkgPSB0LngsIHMgPSB0LnksIG4gPSB0LnosIHIgPSBNYXRoLmNvcyhpKSwgbyA9IE1hdGguc2luKGkpLCBhID0gTWF0aC5jb3MocyksIGwgPSBNYXRoLnNpbihzKSwgYyA9IE1hdGguY29zKG4pLCB1ID0gTWF0aC5zaW4obik7CiAgICAgICAgaWYgKHQub3JkZXIgPT09ICJYWVoiKSB7CiAgICAgICAgICAgIGxldCBkID0gciAqIGMsIHAgPSByICogdSwgZiA9IG8gKiBjLCBtID0gbyAqIHU7CiAgICAgICAgICAgIGVbMF0gPSBhICogYywgZVs0XSA9IC1hICogdSwgZVs4XSA9IGwsIGVbMV0gPSBwICsgZiAqIGwsIGVbNV0gPSBkIC0gbSAqIGwsIGVbOV0gPSAtbyAqIGEsIGVbMl0gPSBtIC0gZCAqIGwsIGVbNl0gPSBmICsgcCAqIGwsIGVbMTBdID0gciAqIGE7CiAgICAgICAgfSBlbHNlIGlmICh0Lm9yZGVyID09PSAiWVhaIikgewogICAgICAgICAgICBsZXQgZCA9IGEgKiBjLCBwID0gYSAqIHUsIGYgPSBsICogYywgbSA9IGwgKiB1OwogICAgICAgICAgICBlWzBdID0gZCArIG0gKiBvLCBlWzRdID0gZiAqIG8gLSBwLCBlWzhdID0gciAqIGwsIGVbMV0gPSByICogdSwgZVs1XSA9IHIgKiBjLCBlWzldID0gLW8sIGVbMl0gPSBwICogbyAtIGYsIGVbNl0gPSBtICsgZCAqIG8sIGVbMTBdID0gciAqIGE7CiAgICAgICAgfSBlbHNlIGlmICh0Lm9yZGVyID09PSAiWlhZIikgewogICAgICAgICAgICBsZXQgZCA9IGEgKiBjLCBwID0gYSAqIHUsIGYgPSBsICogYywgbSA9IGwgKiB1OwogICAgICAgICAgICBlWzBdID0gZCAtIG0gKiBvLCBlWzRdID0gLXIgKiB1LCBlWzhdID0gZiArIHAgKiBvLCBlWzFdID0gcCArIGYgKiBvLCBlWzVdID0gciAqIGMsIGVbOV0gPSBtIC0gZCAqIG8sIGVbMl0gPSAtciAqIGwsIGVbNl0gPSBvLCBlWzEwXSA9IHIgKiBhOwogICAgICAgIH0gZWxzZSBpZiAodC5vcmRlciA9PT0gIlpZWCIpIHsKICAgICAgICAgICAgbGV0IGQgPSByICogYywgcCA9IHIgKiB1LCBmID0gbyAqIGMsIG0gPSBvICogdTsKICAgICAgICAgICAgZVswXSA9IGEgKiBjLCBlWzRdID0gZiAqIGwgLSBwLCBlWzhdID0gZCAqIGwgKyBtLCBlWzFdID0gYSAqIHUsIGVbNV0gPSBtICogbCArIGQsIGVbOV0gPSBwICogbCAtIGYsIGVbMl0gPSAtbCwgZVs2XSA9IG8gKiBhLCBlWzEwXSA9IHIgKiBhOwogICAgICAgIH0gZWxzZSBpZiAodC5vcmRlciA9PT0gIllaWCIpIHsKICAgICAgICAgICAgbGV0IGQgPSByICogYSwgcCA9IHIgKiBsLCBmID0gbyAqIGEsIG0gPSBvICogbDsKICAgICAgICAgICAgZVswXSA9IGEgKiBjLCBlWzRdID0gbSAtIGQgKiB1LCBlWzhdID0gZiAqIHUgKyBwLCBlWzFdID0gdSwgZVs1XSA9IHIgKiBjLCBlWzldID0gLW8gKiBjLCBlWzJdID0gLWwgKiBjLCBlWzZdID0gcCAqIHUgKyBmLCBlWzEwXSA9IGQgLSBtICogdTsKICAgICAgICB9IGVsc2UgaWYgKHQub3JkZXIgPT09ICJYWlkiKSB7CiAgICAgICAgICAgIGxldCBkID0gciAqIGEsIHAgPSByICogbCwgZiA9IG8gKiBhLCBtID0gbyAqIGw7CiAgICAgICAgICAgIGVbMF0gPSBhICogYywgZVs0XSA9IC11LCBlWzhdID0gbCAqIGMsIGVbMV0gPSBkICogdSArIG0sIGVbNV0gPSByICogYywgZVs5XSA9IHAgKiB1IC0gZiwgZVsyXSA9IGYgKiB1IC0gcCwgZVs2XSA9IG8gKiBjLCBlWzEwXSA9IG0gKiB1ICsgZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVbM10gPSAwLCBlWzddID0gMCwgZVsxMV0gPSAwLCBlWzEyXSA9IDAsIGVbMTNdID0gMCwgZVsxNF0gPSAwLCBlWzE1XSA9IDEsIHRoaXM7CiAgICB9CiAgICBtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zZSh5dSwgdCwgZ3UpOwogICAgfQogICAgbG9va0F0KHQsIGUsIGkpIHsKICAgICAgICBsZXQgcyA9IHRoaXMuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIEF0LnN1YlZlY3RvcnModCwgZSksIEF0Lmxlbmd0aFNxKCkgPT09IDAgJiYgKEF0LnogPSAxKSwgQXQubm9ybWFsaXplKCksIGZlLmNyb3NzVmVjdG9ycyhpLCBBdCksIGZlLmxlbmd0aFNxKCkgPT09IDAgJiYgKE1hdGguYWJzKGkueikgPT09IDEgPyBBdC54ICs9IDFlLTQgOiBBdC56ICs9IDFlLTQsIEF0Lm5vcm1hbGl6ZSgpLCBmZS5jcm9zc1ZlY3RvcnMoaSwgQXQpKSwgZmUubm9ybWFsaXplKCksIGhzLmNyb3NzVmVjdG9ycyhBdCwgZmUpLCBzWzBdID0gZmUueCwgc1s0XSA9IGhzLngsIHNbOF0gPSBBdC54LCBzWzFdID0gZmUueSwgc1s1XSA9IGhzLnksIHNbOV0gPSBBdC55LCBzWzJdID0gZmUueiwgc1s2XSA9IGhzLnosIHNbMTBdID0gQXQueiwgdGhpczsKICAgIH0KICAgIG11bHRpcGx5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsIHQpOwogICAgfQogICAgcHJlbXVsdGlwbHkodCkgewogICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCwgdGhpcyk7CiAgICB9CiAgICBtdWx0aXBseU1hdHJpY2VzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHQuZWxlbWVudHMsIHMgPSBlLmVsZW1lbnRzLCBuID0gdGhpcy5lbGVtZW50cywgciA9IGlbMF0sIG8gPSBpWzRdLCBhID0gaVs4XSwgbCA9IGlbMTJdLCBjID0gaVsxXSwgdSA9IGlbNV0sIGQgPSBpWzldLCBwID0gaVsxM10sIGYgPSBpWzJdLCBtID0gaVs2XSwgeTEgPSBpWzEwXSwgZyA9IGlbMTRdLCB4MSA9IGlbM10sIGIgPSBpWzddLCBNID0gaVsxMV0sIF8gPSBpWzE1XSwgdiA9IHNbMF0sIFMgPSBzWzRdLCBBID0gc1s4XSwgSSA9IHNbMTJdLCBDID0gc1sxXSwgayA9IHNbNV0sIFUgPSBzWzldLCBXID0gc1sxM10sIEggPSBzWzJdLCBZID0gc1s2XSwgUSA9IHNbMTBdLCB6dCA9IHNbMTRdLCBQdCA9IHNbM10sIGogPSBzWzddLCBzdCA9IHNbMTFdLCBLID0gc1sxNV07CiAgICAgICAgcmV0dXJuIG5bMF0gPSByICogdiArIG8gKiBDICsgYSAqIEggKyBsICogUHQsIG5bNF0gPSByICogUyArIG8gKiBrICsgYSAqIFkgKyBsICogaiwgbls4XSA9IHIgKiBBICsgbyAqIFUgKyBhICogUSArIGwgKiBzdCwgblsxMl0gPSByICogSSArIG8gKiBXICsgYSAqIHp0ICsgbCAqIEssIG5bMV0gPSBjICogdiArIHUgKiBDICsgZCAqIEggKyBwICogUHQsIG5bNV0gPSBjICogUyArIHUgKiBrICsgZCAqIFkgKyBwICogaiwgbls5XSA9IGMgKiBBICsgdSAqIFUgKyBkICogUSArIHAgKiBzdCwgblsxM10gPSBjICogSSArIHUgKiBXICsgZCAqIHp0ICsgcCAqIEssIG5bMl0gPSBmICogdiArIG0gKiBDICsgeTEgKiBIICsgZyAqIFB0LCBuWzZdID0gZiAqIFMgKyBtICogayArIHkxICogWSArIGcgKiBqLCBuWzEwXSA9IGYgKiBBICsgbSAqIFUgKyB5MSAqIFEgKyBnICogc3QsIG5bMTRdID0gZiAqIEkgKyBtICogVyArIHkxICogenQgKyBnICogSywgblszXSA9IHgxICogdiArIGIgKiBDICsgTSAqIEggKyBfICogUHQsIG5bN10gPSB4MSAqIFMgKyBiICogayArIE0gKiBZICsgXyAqIGosIG5bMTFdID0geDEgKiBBICsgYiAqIFUgKyBNICogUSArIF8gKiBzdCwgblsxNV0gPSB4MSAqIEkgKyBiICogVyArIE0gKiB6dCArIF8gKiBLLCB0aGlzOwogICAgfQogICAgbXVsdGlwbHlTY2FsYXIodCkgewogICAgICAgIGxldCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gZVswXSAqPSB0LCBlWzRdICo9IHQsIGVbOF0gKj0gdCwgZVsxMl0gKj0gdCwgZVsxXSAqPSB0LCBlWzVdICo9IHQsIGVbOV0gKj0gdCwgZVsxM10gKj0gdCwgZVsyXSAqPSB0LCBlWzZdICo9IHQsIGVbMTBdICo9IHQsIGVbMTRdICo9IHQsIGVbM10gKj0gdCwgZVs3XSAqPSB0LCBlWzExXSAqPSB0LCBlWzE1XSAqPSB0LCB0aGlzOwogICAgfQogICAgZGV0ZXJtaW5hbnQoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmVsZW1lbnRzLCBlID0gdFswXSwgaSA9IHRbNF0sIHMgPSB0WzhdLCBuID0gdFsxMl0sIHIgPSB0WzFdLCBvID0gdFs1XSwgYSA9IHRbOV0sIGwgPSB0WzEzXSwgYyA9IHRbMl0sIHUgPSB0WzZdLCBkID0gdFsxMF0sIHAgPSB0WzE0XSwgZiA9IHRbM10sIG0gPSB0WzddLCB5MSA9IHRbMTFdLCBnID0gdFsxNV07CiAgICAgICAgcmV0dXJuIGYgKiAoK24gKiBhICogdSAtIHMgKiBsICogdSAtIG4gKiBvICogZCArIGkgKiBsICogZCArIHMgKiBvICogcCAtIGkgKiBhICogcCkgKyBtICogKCtlICogYSAqIHAgLSBlICogbCAqIGQgKyBuICogciAqIGQgLSBzICogciAqIHAgKyBzICogbCAqIGMgLSBuICogYSAqIGMpICsgeTEgKiAoK2UgKiBsICogdSAtIGUgKiBvICogcCAtIG4gKiByICogdSArIGkgKiByICogcCArIG4gKiBvICogYyAtIGkgKiBsICogYykgKyBnICogKC1zICogbyAqIGMgLSBlICogYSAqIHUgKyBlICogbyAqIGQgKyBzICogciAqIHUgLSBpICogciAqIGQgKyBpICogYSAqIGMpOwogICAgfQogICAgdHJhbnNwb3NlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5lbGVtZW50cywgZTsKICAgICAgICByZXR1cm4gZSA9IHRbMV0sIHRbMV0gPSB0WzRdLCB0WzRdID0gZSwgZSA9IHRbMl0sIHRbMl0gPSB0WzhdLCB0WzhdID0gZSwgZSA9IHRbNl0sIHRbNl0gPSB0WzldLCB0WzldID0gZSwgZSA9IHRbM10sIHRbM10gPSB0WzEyXSwgdFsxMl0gPSBlLCBlID0gdFs3XSwgdFs3XSA9IHRbMTNdLCB0WzEzXSA9IGUsIGUgPSB0WzExXSwgdFsxMV0gPSB0WzE0XSwgdFsxNF0gPSBlLCB0aGlzOwogICAgfQogICAgc2V0UG9zaXRpb24odCwgZSwgaSkgewogICAgICAgIGxldCBzID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gdC5pc1ZlY3RvcjMgPyAoc1sxMl0gPSB0LngsIHNbMTNdID0gdC55LCBzWzE0XSA9IHQueikgOiAoc1sxMl0gPSB0LCBzWzEzXSA9IGUsIHNbMTRdID0gaSksIHRoaXM7CiAgICB9CiAgICBpbnZlcnQoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmVsZW1lbnRzLCBlID0gdFswXSwgaSA9IHRbMV0sIHMgPSB0WzJdLCBuID0gdFszXSwgciA9IHRbNF0sIG8gPSB0WzVdLCBhID0gdFs2XSwgbCA9IHRbN10sIGMgPSB0WzhdLCB1ID0gdFs5XSwgZCA9IHRbMTBdLCBwID0gdFsxMV0sIGYgPSB0WzEyXSwgbSA9IHRbMTNdLCB5MSA9IHRbMTRdLCBnID0gdFsxNV0sIHgxID0gdSAqIHkxICogbCAtIG0gKiBkICogbCArIG0gKiBhICogcCAtIG8gKiB5MSAqIHAgLSB1ICogYSAqIGcgKyBvICogZCAqIGcsIGIgPSBmICogZCAqIGwgLSBjICogeTEgKiBsIC0gZiAqIGEgKiBwICsgciAqIHkxICogcCArIGMgKiBhICogZyAtIHIgKiBkICogZywgTSA9IGMgKiBtICogbCAtIGYgKiB1ICogbCArIGYgKiBvICogcCAtIHIgKiBtICogcCAtIGMgKiBvICogZyArIHIgKiB1ICogZywgXyA9IGYgKiB1ICogYSAtIGMgKiBtICogYSAtIGYgKiBvICogZCArIHIgKiBtICogZCArIGMgKiBvICogeTEgLSByICogdSAqIHkxLCB2ID0gZSAqIHgxICsgaSAqIGIgKyBzICogTSArIG4gKiBfOwogICAgICAgIGlmICh2ID09PSAwKSByZXR1cm4gdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgbGV0IFMgPSAxIC8gdjsKICAgICAgICByZXR1cm4gdFswXSA9IHgxICogUywgdFsxXSA9IChtICogZCAqIG4gLSB1ICogeTEgKiBuIC0gbSAqIHMgKiBwICsgaSAqIHkxICogcCArIHUgKiBzICogZyAtIGkgKiBkICogZykgKiBTLCB0WzJdID0gKG8gKiB5MSAqIG4gLSBtICogYSAqIG4gKyBtICogcyAqIGwgLSBpICogeTEgKiBsIC0gbyAqIHMgKiBnICsgaSAqIGEgKiBnKSAqIFMsIHRbM10gPSAodSAqIGEgKiBuIC0gbyAqIGQgKiBuIC0gdSAqIHMgKiBsICsgaSAqIGQgKiBsICsgbyAqIHMgKiBwIC0gaSAqIGEgKiBwKSAqIFMsIHRbNF0gPSBiICogUywgdFs1XSA9IChjICogeTEgKiBuIC0gZiAqIGQgKiBuICsgZiAqIHMgKiBwIC0gZSAqIHkxICogcCAtIGMgKiBzICogZyArIGUgKiBkICogZykgKiBTLCB0WzZdID0gKGYgKiBhICogbiAtIHIgKiB5MSAqIG4gLSBmICogcyAqIGwgKyBlICogeTEgKiBsICsgciAqIHMgKiBnIC0gZSAqIGEgKiBnKSAqIFMsIHRbN10gPSAociAqIGQgKiBuIC0gYyAqIGEgKiBuICsgYyAqIHMgKiBsIC0gZSAqIGQgKiBsIC0gciAqIHMgKiBwICsgZSAqIGEgKiBwKSAqIFMsIHRbOF0gPSBNICogUywgdFs5XSA9IChmICogdSAqIG4gLSBjICogbSAqIG4gLSBmICogaSAqIHAgKyBlICogbSAqIHAgKyBjICogaSAqIGcgLSBlICogdSAqIGcpICogUywgdFsxMF0gPSAociAqIG0gKiBuIC0gZiAqIG8gKiBuICsgZiAqIGkgKiBsIC0gZSAqIG0gKiBsIC0gciAqIGkgKiBnICsgZSAqIG8gKiBnKSAqIFMsIHRbMTFdID0gKGMgKiBvICogbiAtIHIgKiB1ICogbiAtIGMgKiBpICogbCArIGUgKiB1ICogbCArIHIgKiBpICogcCAtIGUgKiBvICogcCkgKiBTLCB0WzEyXSA9IF8gKiBTLCB0WzEzXSA9IChjICogbSAqIHMgLSBmICogdSAqIHMgKyBmICogaSAqIGQgLSBlICogbSAqIGQgLSBjICogaSAqIHkxICsgZSAqIHUgKiB5MSkgKiBTLCB0WzE0XSA9IChmICogbyAqIHMgLSByICogbSAqIHMgLSBmICogaSAqIGEgKyBlICogbSAqIGEgKyByICogaSAqIHkxIC0gZSAqIG8gKiB5MSkgKiBTLCB0WzE1XSA9IChyICogdSAqIHMgLSBjICogbyAqIHMgKyBjICogaSAqIGEgLSBlICogdSAqIGEgLSByICogaSAqIGQgKyBlICogbyAqIGQpICogUywgdGhpczsKICAgIH0KICAgIHNjYWxlKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZWxlbWVudHMsIGkgPSB0LngsIHMgPSB0LnksIG4gPSB0Lno7CiAgICAgICAgcmV0dXJuIGVbMF0gKj0gaSwgZVs0XSAqPSBzLCBlWzhdICo9IG4sIGVbMV0gKj0gaSwgZVs1XSAqPSBzLCBlWzldICo9IG4sIGVbMl0gKj0gaSwgZVs2XSAqPSBzLCBlWzEwXSAqPSBuLCBlWzNdICo9IGksIGVbN10gKj0gcywgZVsxMV0gKj0gbiwgdGhpczsKICAgIH0KICAgIGdldE1heFNjYWxlT25BeGlzKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5lbGVtZW50cywgZSA9IHRbMF0gKiB0WzBdICsgdFsxXSAqIHRbMV0gKyB0WzJdICogdFsyXSwgaSA9IHRbNF0gKiB0WzRdICsgdFs1XSAqIHRbNV0gKyB0WzZdICogdFs2XSwgcyA9IHRbOF0gKiB0WzhdICsgdFs5XSAqIHRbOV0gKyB0WzEwXSAqIHRbMTBdOwogICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoZSwgaSwgcykpOwogICAgfQogICAgbWFrZVRyYW5zbGF0aW9uKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdC5pc1ZlY3RvcjMgPyB0aGlzLnNldCgxLCAwLCAwLCB0LngsIDAsIDEsIDAsIHQueSwgMCwgMCwgMSwgdC56LCAwLCAwLCAwLCAxKSA6IHRoaXMuc2V0KDEsIDAsIDAsIHQsIDAsIDEsIDAsIGUsIDAsIDAsIDEsIGksIDAsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgbWFrZVJvdGF0aW9uWCh0KSB7CiAgICAgICAgbGV0IGUgPSBNYXRoLmNvcyh0KSwgaSA9IE1hdGguc2luKHQpOwogICAgICAgIHJldHVybiB0aGlzLnNldCgxLCAwLCAwLCAwLCAwLCBlLCAtaSwgMCwgMCwgaSwgZSwgMCwgMCwgMCwgMCwgMSksIHRoaXM7CiAgICB9CiAgICBtYWtlUm90YXRpb25ZKHQpIHsKICAgICAgICBsZXQgZSA9IE1hdGguY29zKHQpLCBpID0gTWF0aC5zaW4odCk7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KGUsIDAsIGksIDAsIDAsIDEsIDAsIDAsIC1pLCAwLCBlLCAwLCAwLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIG1ha2VSb3RhdGlvbloodCkgewogICAgICAgIGxldCBlID0gTWF0aC5jb3ModCksIGkgPSBNYXRoLnNpbih0KTsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoZSwgLWksIDAsIDAsIGksIGUsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgbWFrZVJvdGF0aW9uQXhpcyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSBNYXRoLmNvcyhlKSwgcyA9IE1hdGguc2luKGUpLCBuID0gMSAtIGksIHIgPSB0LngsIG8gPSB0LnksIGEgPSB0LnosIGwgPSBuICogciwgYyA9IG4gKiBvOwogICAgICAgIHJldHVybiB0aGlzLnNldChsICogciArIGksIGwgKiBvIC0gcyAqIGEsIGwgKiBhICsgcyAqIG8sIDAsIGwgKiBvICsgcyAqIGEsIGMgKiBvICsgaSwgYyAqIGEgLSBzICogciwgMCwgbCAqIGEgLSBzICogbywgYyAqIGEgKyBzICogciwgbiAqIGEgKiBhICsgaSwgMCwgMCwgMCwgMCwgMSksIHRoaXM7CiAgICB9CiAgICBtYWtlU2NhbGUodCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnNldCh0LCAwLCAwLCAwLCAwLCBlLCAwLCAwLCAwLCAwLCBpLCAwLCAwLCAwLCAwLCAxKSwgdGhpczsKICAgIH0KICAgIG1ha2VTaGVhcih0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KDEsIGksIG4sIDAsIHQsIDEsIHIsIDAsIGUsIHMsIDEsIDAsIDAsIDAsIDAsIDEpLCB0aGlzOwogICAgfQogICAgY29tcG9zZSh0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSB0aGlzLmVsZW1lbnRzLCBuID0gZS5feCwgciA9IGUuX3ksIG8gPSBlLl96LCBhID0gZS5fdywgbCA9IG4gKyBuLCBjID0gciArIHIsIHUgPSBvICsgbywgZCA9IG4gKiBsLCBwID0gbiAqIGMsIGYgPSBuICogdSwgbSA9IHIgKiBjLCB5MSA9IHIgKiB1LCBnID0gbyAqIHUsIHgxID0gYSAqIGwsIGIgPSBhICogYywgTSA9IGEgKiB1LCBfID0gaS54LCB2ID0gaS55LCBTID0gaS56OwogICAgICAgIHJldHVybiBzWzBdID0gKDEgLSAobSArIGcpKSAqIF8sIHNbMV0gPSAocCArIE0pICogXywgc1syXSA9IChmIC0gYikgKiBfLCBzWzNdID0gMCwgc1s0XSA9IChwIC0gTSkgKiB2LCBzWzVdID0gKDEgLSAoZCArIGcpKSAqIHYsIHNbNl0gPSAoeTEgKyB4MSkgKiB2LCBzWzddID0gMCwgc1s4XSA9IChmICsgYikgKiBTLCBzWzldID0gKHkxIC0geDEpICogUywgc1sxMF0gPSAoMSAtIChkICsgbSkpICogUywgc1sxMV0gPSAwLCBzWzEyXSA9IHQueCwgc1sxM10gPSB0LnksIHNbMTRdID0gdC56LCBzWzE1XSA9IDEsIHRoaXM7CiAgICB9CiAgICBkZWNvbXBvc2UodCwgZSwgaSkgewogICAgICAgIGxldCBzID0gdGhpcy5lbGVtZW50cywgbiA9IFllLnNldChzWzBdLCBzWzFdLCBzWzJdKS5sZW5ndGgoKSwgciA9IFllLnNldChzWzRdLCBzWzVdLCBzWzZdKS5sZW5ndGgoKSwgbyA9IFllLnNldChzWzhdLCBzWzldLCBzWzEwXSkubGVuZ3RoKCk7CiAgICAgICAgdGhpcy5kZXRlcm1pbmFudCgpIDwgMCAmJiAobiA9IC1uKSwgdC54ID0gc1sxMl0sIHQueSA9IHNbMTNdLCB0LnogPSBzWzE0XSwgVnQuY29weSh0aGlzKTsKICAgICAgICBsZXQgbCA9IDEgLyBuLCBjID0gMSAvIHIsIHUgPSAxIC8gbzsKICAgICAgICByZXR1cm4gVnQuZWxlbWVudHNbMF0gKj0gbCwgVnQuZWxlbWVudHNbMV0gKj0gbCwgVnQuZWxlbWVudHNbMl0gKj0gbCwgVnQuZWxlbWVudHNbNF0gKj0gYywgVnQuZWxlbWVudHNbNV0gKj0gYywgVnQuZWxlbWVudHNbNl0gKj0gYywgVnQuZWxlbWVudHNbOF0gKj0gdSwgVnQuZWxlbWVudHNbOV0gKj0gdSwgVnQuZWxlbWVudHNbMTBdICo9IHUsIGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KFZ0KSwgaS54ID0gbiwgaS55ID0gciwgaS56ID0gbywgdGhpczsKICAgIH0KICAgIG1ha2VQZXJzcGVjdGl2ZSh0LCBlLCBpLCBzLCBuLCByLCBvID0gb2UpIHsKICAgICAgICBsZXQgYSA9IHRoaXMuZWxlbWVudHMsIGwgPSAyICogbiAvIChlIC0gdCksIGMgPSAyICogbiAvIChpIC0gcyksIHUgPSAoZSArIHQpIC8gKGUgLSB0KSwgZCA9IChpICsgcykgLyAoaSAtIHMpLCBwLCBmOwogICAgICAgIGlmIChvID09PSBvZSkgcCA9IC0ociArIG4pIC8gKHIgLSBuKSwgZiA9IC0yICogciAqIG4gLyAociAtIG4pOwogICAgICAgIGVsc2UgaWYgKG8gPT09IFpzKSBwID0gLXIgLyAociAtIG4pLCBmID0gLXIgKiBuIC8gKHIgLSBuKTsKICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIiArIG8pOwogICAgICAgIHJldHVybiBhWzBdID0gbCwgYVs0XSA9IDAsIGFbOF0gPSB1LCBhWzEyXSA9IDAsIGFbMV0gPSAwLCBhWzVdID0gYywgYVs5XSA9IGQsIGFbMTNdID0gMCwgYVsyXSA9IDAsIGFbNl0gPSAwLCBhWzEwXSA9IHAsIGFbMTRdID0gZiwgYVszXSA9IDAsIGFbN10gPSAwLCBhWzExXSA9IC0xLCBhWzE1XSA9IDAsIHRoaXM7CiAgICB9CiAgICBtYWtlT3J0aG9ncmFwaGljKHQsIGUsIGksIHMsIG4sIHIsIG8gPSBvZSkgewogICAgICAgIGxldCBhID0gdGhpcy5lbGVtZW50cywgbCA9IDEgLyAoZSAtIHQpLCBjID0gMSAvIChpIC0gcyksIHUgPSAxIC8gKHIgLSBuKSwgZCA9IChlICsgdCkgKiBsLCBwID0gKGkgKyBzKSAqIGMsIGYsIG07CiAgICAgICAgaWYgKG8gPT09IG9lKSBmID0gKHIgKyBuKSAqIHUsIG0gPSAtMiAqIHU7CiAgICAgICAgZWxzZSBpZiAobyA9PT0gWnMpIGYgPSBuICogdSwgbSA9IC0xICogdTsKICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIgKyBvKTsKICAgICAgICByZXR1cm4gYVswXSA9IDIgKiBsLCBhWzRdID0gMCwgYVs4XSA9IDAsIGFbMTJdID0gLWQsIGFbMV0gPSAwLCBhWzVdID0gMiAqIGMsIGFbOV0gPSAwLCBhWzEzXSA9IC1wLCBhWzJdID0gMCwgYVs2XSA9IDAsIGFbMTBdID0gbSwgYVsxNF0gPSAtZiwgYVszXSA9IDAsIGFbN10gPSAwLCBhWzExXSA9IDAsIGFbMTVdID0gMSwgdGhpczsKICAgIH0KICAgIGVxdWFscyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmVsZW1lbnRzLCBpID0gdC5lbGVtZW50czsKICAgICAgICBmb3IobGV0IHMgPSAwOyBzIDwgMTY7IHMrKylpZiAoZVtzXSAhPT0gaVtzXSkgcmV0dXJuICExOwogICAgICAgIHJldHVybiAhMDsKICAgIH0KICAgIGZyb21BcnJheSh0LCBlID0gMCkgewogICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKXRoaXMuZWxlbWVudHNbaV0gPSB0W2kgKyBlXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvQXJyYXkodCA9IFtdLCBlID0gMCkgewogICAgICAgIGxldCBpID0gdGhpcy5lbGVtZW50czsKICAgICAgICByZXR1cm4gdFtlXSA9IGlbMF0sIHRbZSArIDFdID0gaVsxXSwgdFtlICsgMl0gPSBpWzJdLCB0W2UgKyAzXSA9IGlbM10sIHRbZSArIDRdID0gaVs0XSwgdFtlICsgNV0gPSBpWzVdLCB0W2UgKyA2XSA9IGlbNl0sIHRbZSArIDddID0gaVs3XSwgdFtlICsgOF0gPSBpWzhdLCB0W2UgKyA5XSA9IGlbOV0sIHRbZSArIDEwXSA9IGlbMTBdLCB0W2UgKyAxMV0gPSBpWzExXSwgdFtlICsgMTJdID0gaVsxMl0sIHRbZSArIDEzXSA9IGlbMTNdLCB0W2UgKyAxNF0gPSBpWzE0XSwgdFtlICsgMTVdID0gaVsxNV0sIHQ7CiAgICB9Cn0sIFllID0gbmV3IHcsIFZ0ID0gbmV3IEQsIHl1ID0gbmV3IHcoMCwgMCwgMCksIGd1ID0gbmV3IHcoMSwgMSwgMSksIGZlID0gbmV3IHcsIGhzID0gbmV3IHcsIEF0ID0gbmV3IHcsIHhhID0gbmV3IEQsIGJhID0gbmV3IGJ0LCBYdCA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCA9IDAsIGUgPSAwLCBpID0gMCwgcyA9IGguREVGQVVMVF9PUkRFUil7CiAgICAgICAgdGhpcy5pc0V1bGVyID0gITAsIHRoaXMuX3ggPSB0LCB0aGlzLl95ID0gZSwgdGhpcy5feiA9IGksIHRoaXMuX29yZGVyID0gczsKICAgIH0KICAgIGdldCB4KCkgewogICAgICAgIHJldHVybiB0aGlzLl94OwogICAgfQogICAgc2V0IHgodCkgewogICAgICAgIHRoaXMuX3ggPSB0LCB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBnZXQgeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5feTsKICAgIH0KICAgIHNldCB5KHQpIHsKICAgICAgICB0aGlzLl95ID0gdCwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgZ2V0IHooKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3o7CiAgICB9CiAgICBzZXQgeih0KSB7CiAgICAgICAgdGhpcy5feiA9IHQsIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgIH0KICAgIGdldCBvcmRlcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fb3JkZXI7CiAgICB9CiAgICBzZXQgb3JkZXIodCkgewogICAgICAgIHRoaXMuX29yZGVyID0gdCwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgc2V0KHQsIGUsIGksIHMgPSB0aGlzLl9vcmRlcikgewogICAgICAgIHJldHVybiB0aGlzLl94ID0gdCwgdGhpcy5feSA9IGUsIHRoaXMuX3ogPSBpLCB0aGlzLl9vcmRlciA9IHMsIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlcik7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5feCA9IHQuX3gsIHRoaXMuX3kgPSB0Ll95LCB0aGlzLl96ID0gdC5feiwgdGhpcy5fb3JkZXIgPSB0Ll9vcmRlciwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsIGUgPSB0aGlzLl9vcmRlciwgaSA9ICEwKSB7CiAgICAgICAgbGV0IHMgPSB0LmVsZW1lbnRzLCBuID0gc1swXSwgciA9IHNbNF0sIG8gPSBzWzhdLCBhID0gc1sxXSwgbCA9IHNbNV0sIGMgPSBzWzldLCB1ID0gc1syXSwgZCA9IHNbNl0sIHAgPSBzWzEwXTsKICAgICAgICBzd2l0Y2goZSl7CiAgICAgICAgICAgIGNhc2UgIlhZWiI6CiAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5hc2luKE4obywgLTEsIDEpKSwgTWF0aC5hYnMobykgPCAuOTk5OTk5OSA/ICh0aGlzLl94ID0gTWF0aC5hdGFuMigtYywgcCksIHRoaXMuX3ogPSBNYXRoLmF0YW4yKC1yLCBuKSkgOiAodGhpcy5feCA9IE1hdGguYXRhbjIoZCwgbCksIHRoaXMuX3ogPSAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJZWFoiOgogICAgICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXNpbigtTihjLCAtMSwgMSkpLCBNYXRoLmFicyhjKSA8IC45OTk5OTk5ID8gKHRoaXMuX3kgPSBNYXRoLmF0YW4yKG8sIHApLCB0aGlzLl96ID0gTWF0aC5hdGFuMihhLCBsKSkgOiAodGhpcy5feSA9IE1hdGguYXRhbjIoLXUsIG4pLCB0aGlzLl96ID0gMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiWlhZIjoKICAgICAgICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLmFzaW4oTihkLCAtMSwgMSkpLCBNYXRoLmFicyhkKSA8IC45OTk5OTk5ID8gKHRoaXMuX3kgPSBNYXRoLmF0YW4yKC11LCBwKSwgdGhpcy5feiA9IE1hdGguYXRhbjIoLXIsIGwpKSA6ICh0aGlzLl95ID0gMCwgdGhpcy5feiA9IE1hdGguYXRhbjIoYSwgbikpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlpZWCI6CiAgICAgICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5hc2luKC1OKHUsIC0xLCAxKSksIE1hdGguYWJzKHUpIDwgLjk5OTk5OTkgPyAodGhpcy5feCA9IE1hdGguYXRhbjIoZCwgcCksIHRoaXMuX3ogPSBNYXRoLmF0YW4yKGEsIG4pKSA6ICh0aGlzLl94ID0gMCwgdGhpcy5feiA9IE1hdGguYXRhbjIoLXIsIGwpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJZWlgiOgogICAgICAgICAgICAgICAgdGhpcy5feiA9IE1hdGguYXNpbihOKGEsIC0xLCAxKSksIE1hdGguYWJzKGEpIDwgLjk5OTk5OTkgPyAodGhpcy5feCA9IE1hdGguYXRhbjIoLWMsIGwpLCB0aGlzLl95ID0gTWF0aC5hdGFuMigtdSwgbikpIDogKHRoaXMuX3ggPSAwLCB0aGlzLl95ID0gTWF0aC5hdGFuMihvLCBwKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiWFpZIjoKICAgICAgICAgICAgICAgIHRoaXMuX3ogPSBNYXRoLmFzaW4oLU4ociwgLTEsIDEpKSwgTWF0aC5hYnMocikgPCAuOTk5OTk5OSA/ICh0aGlzLl94ID0gTWF0aC5hdGFuMihkLCBsKSwgdGhpcy5feSA9IE1hdGguYXRhbjIobywgbikpIDogKHRoaXMuX3ggPSBNYXRoLmF0YW4yKC1jLCBwKSwgdGhpcy5feSA9IDApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIiArIGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fb3JkZXIgPSBlLCBpID09PSAhMCAmJiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tUXVhdGVybmlvbih0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHhhLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLCB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh4YSwgZSwgaSk7CiAgICB9CiAgICBzZXRGcm9tVmVjdG9yMyh0LCBlID0gdGhpcy5fb3JkZXIpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQodC54LCB0LnksIHQueiwgZSk7CiAgICB9CiAgICByZW9yZGVyKHQpIHsKICAgICAgICByZXR1cm4gYmEuc2V0RnJvbUV1bGVyKHRoaXMpLCB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKGJhLCB0KTsKICAgIH0KICAgIGVxdWFscyh0KSB7CiAgICAgICAgcmV0dXJuIHQuX3ggPT09IHRoaXMuX3ggJiYgdC5feSA9PT0gdGhpcy5feSAmJiB0Ll96ID09PSB0aGlzLl96ICYmIHQuX29yZGVyID09PSB0aGlzLl9vcmRlcjsKICAgIH0KICAgIGZyb21BcnJheSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ggPSB0WzBdLCB0aGlzLl95ID0gdFsxXSwgdGhpcy5feiA9IHRbMl0sIHRbM10gIT09IHZvaWQgMCAmJiAodGhpcy5fb3JkZXIgPSB0WzNdKSwgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLCB0aGlzOwogICAgfQogICAgdG9BcnJheSh0ID0gW10sIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRbZV0gPSB0aGlzLl94LCB0W2UgKyAxXSA9IHRoaXMuX3ksIHRbZSArIDJdID0gdGhpcy5feiwgdFtlICsgM10gPSB0aGlzLl9vcmRlciwgdDsKICAgIH0KICAgIF9vbkNoYW5nZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSB0LCB0aGlzOwogICAgfQogICAgX29uQ2hhbmdlQ2FsbGJhY2soKSB7fQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICAgIHlpZWxkIHRoaXMuX3gsIHlpZWxkIHRoaXMuX3ksIHlpZWxkIHRoaXMuX3osIHlpZWxkIHRoaXMuX29yZGVyOwogICAgfQp9OwpYdC5ERUZBVUxUX09SREVSID0gIlhZWiI7CnZhciBqcyA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgdGhpcy5tYXNrID0gMTsKICAgIH0KICAgIHNldCh0KSB7CiAgICAgICAgdGhpcy5tYXNrID0gKDEgPDwgdCB8IDApID4+PiAwOwogICAgfQogICAgZW5hYmxlKHQpIHsKICAgICAgICB0aGlzLm1hc2sgfD0gMSA8PCB0IHwgMDsKICAgIH0KICAgIGVuYWJsZUFsbCgpIHsKICAgICAgICB0aGlzLm1hc2sgPSAtMTsKICAgIH0KICAgIHRvZ2dsZSh0KSB7CiAgICAgICAgdGhpcy5tYXNrIF49IDEgPDwgdCB8IDA7CiAgICB9CiAgICBkaXNhYmxlKHQpIHsKICAgICAgICB0aGlzLm1hc2sgJj0gfigxIDw8IHQgfCAwKTsKICAgIH0KICAgIGRpc2FibGVBbGwoKSB7CiAgICAgICAgdGhpcy5tYXNrID0gMDsKICAgIH0KICAgIHRlc3QodCkgewogICAgICAgIHJldHVybiAodGhpcy5tYXNrICYgdC5tYXNrKSAhPT0gMDsKICAgIH0KICAgIGlzRW5hYmxlZCh0KSB7CiAgICAgICAgcmV0dXJuICh0aGlzLm1hc2sgJiAoMSA8PCB0IHwgMCkpICE9PSAwOwogICAgfQp9LCB4dSA9IDAsIHdhID0gbmV3IHcsICRlID0gbmV3IGJ0LCB0ZSA9IG5ldyBELCBscyA9IG5ldyB3LCBUaSA9IG5ldyB3LCBidSA9IG5ldyB3LCB3dSA9IG5ldyBidCwgTWEgPSBuZXcgdygxLCAwLCAwKSwgX2EgPSBuZXcgdygwLCAxLCAwKSwgdmEgPSBuZXcgdygwLCAwLCAxKSwgQWEgPSB7CiAgICB0eXBlOiAiYWRkZWQiCn0sIE11ID0gewogICAgdHlwZTogInJlbW92ZWQiCn0sIFFlID0gewogICAgdHlwZTogImNoaWxkYWRkZWQiLAogICAgY2hpbGQ6IG51bGwKfSwgRG4gPSB7CiAgICB0eXBlOiAiY2hpbGRyZW1vdmVkIiwKICAgIGNoaWxkOiBudWxsCn0sIEcgPSBjbGFzcyBoIGV4dGVuZHMgcXQgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzT2JqZWN0M0QgPSAhMCwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJpZCIsIHsKICAgICAgICAgICAgdmFsdWU6IHh1KysKICAgICAgICB9KSwgdGhpcy51dWlkID0gSXQoKSwgdGhpcy5uYW1lID0gIiIsIHRoaXMudHlwZSA9ICJPYmplY3QzRCIsIHRoaXMucGFyZW50ID0gbnVsbCwgdGhpcy5jaGlsZHJlbiA9IFtdLCB0aGlzLnVwID0gaC5ERUZBVUxUX1VQLmNsb25lKCk7CiAgICAgICAgbGV0IHQgPSBuZXcgdywgZSA9IG5ldyBYdCwgaSA9IG5ldyBidCwgcyA9IG5ldyB3KDEsIDEsIDEpOwogICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgIGkuc2V0RnJvbUV1bGVyKGUsICExKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgZS5zZXRGcm9tUXVhdGVybmlvbihpLCB2b2lkIDAsICExKTsKICAgICAgICB9CiAgICAgICAgZS5fb25DaGFuZ2UobiksIGkuX29uQ2hhbmdlKHIpLCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7CiAgICAgICAgICAgIHBvc2l0aW9uOiB7CiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgICB9LAogICAgICAgICAgICByb3RhdGlvbjogewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgdmFsdWU6IGUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcXVhdGVybmlvbjogewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgdmFsdWU6IGkKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2NhbGU6IHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgIHZhbHVlOiBzCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1vZGVsVmlld01hdHJpeDogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBECiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5vcm1hbE1hdHJpeDogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgICAgICB9CiAgICAgICAgfSksIHRoaXMubWF0cml4ID0gbmV3IEQsIHRoaXMubWF0cml4V29ybGQgPSBuZXcgRCwgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gaC5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSwgdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPSBoLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLCB0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSAhMSwgdGhpcy5sYXllcnMgPSBuZXcganMsIHRoaXMudmlzaWJsZSA9ICEwLCB0aGlzLmNhc3RTaGFkb3cgPSAhMSwgdGhpcy5yZWNlaXZlU2hhZG93ID0gITEsIHRoaXMuZnJ1c3R1bUN1bGxlZCA9ICEwLCB0aGlzLnJlbmRlck9yZGVyID0gMCwgdGhpcy5hbmltYXRpb25zID0gW10sIHRoaXMudXNlckRhdGEgPSB7fTsKICAgIH0KICAgIG9uQmVmb3JlU2hhZG93KCkge30KICAgIG9uQWZ0ZXJTaGFkb3coKSB7fQogICAgb25CZWZvcmVSZW5kZXIoKSB7fQogICAgb25BZnRlclJlbmRlcigpIHt9CiAgICBhcHBseU1hdHJpeDQodCkgewogICAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSAmJiB0aGlzLnVwZGF0ZU1hdHJpeCgpLCB0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSwgdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSk7CiAgICB9CiAgICBhcHBseVF1YXRlcm5pb24odCkgewogICAgICAgIHJldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksIHRoaXM7CiAgICB9CiAgICBzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCwgZSkgewogICAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsIGUpOwogICAgfQogICAgc2V0Um90YXRpb25Gcm9tRXVsZXIodCkgewogICAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwgITApOwogICAgfQogICAgc2V0Um90YXRpb25Gcm9tTWF0cml4KHQpIHsKICAgICAgICB0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpOwogICAgfQogICAgc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KSB7CiAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLmNvcHkodCk7CiAgICB9CiAgICByb3RhdGVPbkF4aXModCwgZSkgewogICAgICAgIHJldHVybiAkZS5zZXRGcm9tQXhpc0FuZ2xlKHQsIGUpLCB0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoJGUpLCB0aGlzOwogICAgfQogICAgcm90YXRlT25Xb3JsZEF4aXModCwgZSkgewogICAgICAgIHJldHVybiAkZS5zZXRGcm9tQXhpc0FuZ2xlKHQsIGUpLCB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoJGUpLCB0aGlzOwogICAgfQogICAgcm90YXRlWCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm90YXRlT25BeGlzKE1hLCB0KTsKICAgIH0KICAgIHJvdGF0ZVkodCkgewogICAgICAgIHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhfYSwgdCk7CiAgICB9CiAgICByb3RhdGVaKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXModmEsIHQpOwogICAgfQogICAgdHJhbnNsYXRlT25BeGlzKHQsIGUpIHsKICAgICAgICByZXR1cm4gd2EuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSwgdGhpcy5wb3NpdGlvbi5hZGQod2EubXVsdGlwbHlTY2FsYXIoZSkpLCB0aGlzOwogICAgfQogICAgdHJhbnNsYXRlWCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKE1hLCB0KTsKICAgIH0KICAgIHRyYW5zbGF0ZVkodCkgewogICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhfYSwgdCk7CiAgICB9CiAgICB0cmFuc2xhdGVaKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXModmEsIHQpOwogICAgfQogICAgbG9jYWxUb1dvcmxkKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKTsKICAgIH0KICAgIHdvcmxkVG9Mb2NhbCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsICExKSwgdC5hcHBseU1hdHJpeDQodGUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSk7CiAgICB9CiAgICBsb29rQXQodCwgZSwgaSkgewogICAgICAgIHQuaXNWZWN0b3IzID8gbHMuY29weSh0KSA6IGxzLnNldCh0LCBlLCBpKTsKICAgICAgICBsZXQgcyA9IHRoaXMucGFyZW50OwogICAgICAgIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsICExKSwgVGkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLCB0aGlzLmlzQ2FtZXJhIHx8IHRoaXMuaXNMaWdodCA/IHRlLmxvb2tBdChUaSwgbHMsIHRoaXMudXApIDogdGUubG9va0F0KGxzLCBUaSwgdGhpcy51cCksIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodGUpLCBzICYmICh0ZS5leHRyYWN0Um90YXRpb24ocy5tYXRyaXhXb3JsZCksICRlLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0ZSksIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSgkZS5pbnZlcnQoKSkpOwogICAgfQogICAgYWRkKHQpIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgZm9yKGxldCBlID0gMDsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQgPT09IHRoaXMgPyAoY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIiwgdCksIHRoaXMpIDogKHQgJiYgdC5pc09iamVjdDNEID8gKHQucmVtb3ZlRnJvbVBhcmVudCgpLCB0LnBhcmVudCA9IHRoaXMsIHRoaXMuY2hpbGRyZW4ucHVzaCh0KSwgdC5kaXNwYXRjaEV2ZW50KEFhKSwgUWUuY2hpbGQgPSB0LCB0aGlzLmRpc3BhdGNoRXZlbnQoUWUpLCBRZS5jaGlsZCA9IG51bGwpIDogY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsIHQpLCB0aGlzKTsKICAgIH0KICAgIHJlbW92ZSh0KSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2ldKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGxldCBlID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpOwogICAgICAgIHJldHVybiBlICE9PSAtMSAmJiAodC5wYXJlbnQgPSBudWxsLCB0aGlzLmNoaWxkcmVuLnNwbGljZShlLCAxKSwgdC5kaXNwYXRjaEV2ZW50KE11KSwgRG4uY2hpbGQgPSB0LCB0aGlzLmRpc3BhdGNoRXZlbnQoRG4pLCBEbi5jaGlsZCA9IG51bGwpLCB0aGlzOwogICAgfQogICAgcmVtb3ZlRnJvbVBhcmVudCgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMucGFyZW50OwogICAgICAgIHJldHVybiB0ICE9PSBudWxsICYmIHQucmVtb3ZlKHRoaXMpLCB0aGlzOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pOwogICAgfQogICAgYXR0YWNoKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0ZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLCB0LnBhcmVudCAhPT0gbnVsbCAmJiAodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsICExKSwgdGUubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSwgdC5hcHBseU1hdHJpeDQodGUpLCB0LnJlbW92ZUZyb21QYXJlbnQoKSwgdC5wYXJlbnQgPSB0aGlzLCB0aGlzLmNoaWxkcmVuLnB1c2godCksIHQudXBkYXRlV29ybGRNYXRyaXgoITEsICEwKSwgdC5kaXNwYXRjaEV2ZW50KEFhKSwgUWUuY2hpbGQgPSB0LCB0aGlzLmRpc3BhdGNoRXZlbnQoUWUpLCBRZS5jaGlsZCA9IG51bGwsIHRoaXM7CiAgICB9CiAgICBnZXRPYmplY3RCeUlkKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsIHQpOwogICAgfQogICAgZ2V0T2JqZWN0QnlOYW1lKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIiwgdCk7CiAgICB9CiAgICBnZXRPYmplY3RCeVByb3BlcnR5KHQsIGUpIHsKICAgICAgICBpZiAodGhpc1t0XSA9PT0gZSkgcmV0dXJuIHRoaXM7CiAgICAgICAgZm9yKGxldCBpID0gMCwgcyA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgbGV0IHIgPSB0aGlzLmNoaWxkcmVuW2ldLmdldE9iamVjdEJ5UHJvcGVydHkodCwgZSk7CiAgICAgICAgICAgIGlmIChyICE9PSB2b2lkIDApIHJldHVybiByOwogICAgICAgIH0KICAgIH0KICAgIGdldE9iamVjdHNCeVByb3BlcnR5KHQsIGUsIGkgPSBbXSkgewogICAgICAgIHRoaXNbdF0gPT09IGUgJiYgaS5wdXNoKHRoaXMpOwogICAgICAgIGxldCBzID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICBmb3IobGV0IG4gPSAwLCByID0gcy5sZW5ndGg7IG4gPCByOyBuKyspc1tuXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LCBlLCBpKTsKICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIGdldFdvcmxkUG9zaXRpb24odCkgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCAhMSksIHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpOwogICAgfQogICAgZ2V0V29ybGRRdWF0ZXJuaW9uKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShUaSwgdCwgYnUpLCB0OwogICAgfQogICAgZ2V0V29ybGRTY2FsZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsICExKSwgdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVGksIHd1LCB0KSwgdDsKICAgIH0KICAgIGdldFdvcmxkRGlyZWN0aW9uKHQpIHsKICAgICAgICB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCAhMSk7CiAgICAgICAgbGV0IGUgPSB0aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzOwogICAgICAgIHJldHVybiB0LnNldChlWzhdLCBlWzldLCBlWzEwXSkubm9ybWFsaXplKCk7CiAgICB9CiAgICByYXljYXN0KCkge30KICAgIHRyYXZlcnNlKHQpIHsKICAgICAgICB0KHRoaXMpOwogICAgICAgIGxldCBlID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspZVtpXS50cmF2ZXJzZSh0KTsKICAgIH0KICAgIHRyYXZlcnNlVmlzaWJsZSh0KSB7CiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSA9PT0gITEpIHJldHVybjsKICAgICAgICB0KHRoaXMpOwogICAgICAgIGxldCBlID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspZVtpXS50cmF2ZXJzZVZpc2libGUodCk7CiAgICB9CiAgICB0cmF2ZXJzZUFuY2VzdG9ycyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLnBhcmVudDsKICAgICAgICBlICE9PSBudWxsICYmICh0KGUpLCBlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeCgpIHsKICAgICAgICB0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSksIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9ICEwOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQodCkgewogICAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSAmJiB0aGlzLnVwZGF0ZU1hdHJpeCgpLCAodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IHQpICYmICh0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gITAgJiYgKHRoaXMucGFyZW50ID09PSBudWxsID8gdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KSA6IHRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXgpKSwgdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gITEsIHQgPSAhMCk7CiAgICAgICAgbGV0IGUgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSBlLmxlbmd0aDsgaSA8IHM7IGkrKyllW2ldLnVwZGF0ZU1hdHJpeFdvcmxkKHQpOwogICAgfQogICAgdXBkYXRlV29ybGRNYXRyaXgodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5wYXJlbnQ7CiAgICAgICAgaWYgKHQgPT09ICEwICYmIGkgIT09IG51bGwgJiYgaS51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgJiYgdGhpcy51cGRhdGVNYXRyaXgoKSwgdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09ICEwICYmICh0aGlzLnBhcmVudCA9PT0gbnVsbCA/IHRoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCkgOiB0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4KSksIGUgPT09ICEwKSB7CiAgICAgICAgICAgIGxldCBzID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICAgICAgZm9yKGxldCBuID0gMCwgciA9IHMubGVuZ3RoOyBuIDwgcjsgbisrKXNbbl0udXBkYXRlV29ybGRNYXRyaXgoITEsICEwKTsKICAgICAgICB9CiAgICB9CiAgICB0b0pTT04odCkgewogICAgICAgIGxldCBlID0gdCA9PT0gdm9pZCAwIHx8IHR5cGVvZiB0ID09ICJzdHJpbmciLCBpID0ge307CiAgICAgICAgZSAmJiAodCA9IHsKICAgICAgICAgICAgZ2VvbWV0cmllczoge30sCiAgICAgICAgICAgIG1hdGVyaWFsczoge30sCiAgICAgICAgICAgIHRleHR1cmVzOiB7fSwKICAgICAgICAgICAgaW1hZ2VzOiB7fSwKICAgICAgICAgICAgc2hhcGVzOiB7fSwKICAgICAgICAgICAgc2tlbGV0b25zOiB7fSwKICAgICAgICAgICAgYW5pbWF0aW9uczoge30sCiAgICAgICAgICAgIG5vZGVzOiB7fQogICAgICAgIH0sIGkubWV0YWRhdGEgPSB7CiAgICAgICAgICAgIHZlcnNpb246IDQuNiwKICAgICAgICAgICAgdHlwZTogIk9iamVjdCIsCiAgICAgICAgICAgIGdlbmVyYXRvcjogIk9iamVjdDNELnRvSlNPTiIKICAgICAgICB9KTsKICAgICAgICBsZXQgcyA9IHt9OwogICAgICAgIHMudXVpZCA9IHRoaXMudXVpZCwgcy50eXBlID0gdGhpcy50eXBlLCB0aGlzLm5hbWUgIT09ICIiICYmIChzLm5hbWUgPSB0aGlzLm5hbWUpLCB0aGlzLmNhc3RTaGFkb3cgPT09ICEwICYmIChzLmNhc3RTaGFkb3cgPSAhMCksIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gITAgJiYgKHMucmVjZWl2ZVNoYWRvdyA9ICEwKSwgdGhpcy52aXNpYmxlID09PSAhMSAmJiAocy52aXNpYmxlID0gITEpLCB0aGlzLmZydXN0dW1DdWxsZWQgPT09ICExICYmIChzLmZydXN0dW1DdWxsZWQgPSAhMSksIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgJiYgKHMucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyKSwgT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoID4gMCAmJiAocy51c2VyRGF0YSA9IHRoaXMudXNlckRhdGEpLCBzLmxheWVycyA9IHRoaXMubGF5ZXJzLm1hc2ssIHMubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpLCBzLnVwID0gdGhpcy51cC50b0FycmF5KCksIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gITEgJiYgKHMubWF0cml4QXV0b1VwZGF0ZSA9ICExKSwgdGhpcy5pc0luc3RhbmNlZE1lc2ggJiYgKHMudHlwZSA9ICJJbnN0YW5jZWRNZXNoIiwgcy5jb3VudCA9IHRoaXMuY291bnQsIHMuaW5zdGFuY2VNYXRyaXggPSB0aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLCB0aGlzLmluc3RhbmNlQ29sb3IgIT09IG51bGwgJiYgKHMuaW5zdGFuY2VDb2xvciA9IHRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLCB0aGlzLmlzQmF0Y2hlZE1lc2ggJiYgKHMudHlwZSA9ICJCYXRjaGVkTWVzaCIsIHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCwgcy5zb3J0T2JqZWN0cyA9IHRoaXMuc29ydE9iamVjdHMsIHMuZHJhd1JhbmdlcyA9IHRoaXMuX2RyYXdSYW5nZXMsIHMucmVzZXJ2ZWRSYW5nZXMgPSB0aGlzLl9yZXNlcnZlZFJhbmdlcywgcy52aXNpYmlsaXR5ID0gdGhpcy5fdmlzaWJpbGl0eSwgcy5hY3RpdmUgPSB0aGlzLl9hY3RpdmUsIHMuYm91bmRzID0gdGhpcy5fYm91bmRzLm1hcCgobyk9Pih7CiAgICAgICAgICAgICAgICBib3hJbml0aWFsaXplZDogby5ib3hJbml0aWFsaXplZCwKICAgICAgICAgICAgICAgIGJveE1pbjogby5ib3gubWluLnRvQXJyYXkoKSwKICAgICAgICAgICAgICAgIGJveE1heDogby5ib3gubWF4LnRvQXJyYXkoKSwKICAgICAgICAgICAgICAgIHNwaGVyZUluaXRpYWxpemVkOiBvLnNwaGVyZUluaXRpYWxpemVkLAogICAgICAgICAgICAgICAgc3BoZXJlUmFkaXVzOiBvLnNwaGVyZS5yYWRpdXMsCiAgICAgICAgICAgICAgICBzcGhlcmVDZW50ZXI6IG8uc3BoZXJlLmNlbnRlci50b0FycmF5KCkKICAgICAgICAgICAgfSkpLCBzLm1heEluc3RhbmNlQ291bnQgPSB0aGlzLl9tYXhJbnN0YW5jZUNvdW50LCBzLm1heFZlcnRleENvdW50ID0gdGhpcy5fbWF4VmVydGV4Q291bnQsIHMubWF4SW5kZXhDb3VudCA9IHRoaXMuX21heEluZGV4Q291bnQsIHMuZ2VvbWV0cnlJbml0aWFsaXplZCA9IHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQsIHMuZ2VvbWV0cnlDb3VudCA9IHRoaXMuX2dlb21ldHJ5Q291bnQsIHMubWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSwgdGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCAmJiAocy5jb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICYmIChzLmJvdW5kaW5nU3BoZXJlID0gewogICAgICAgICAgICBjZW50ZXI6IHMuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSwKICAgICAgICAgICAgcmFkaXVzOiBzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cwogICAgICAgIH0pLCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICYmIChzLmJvdW5kaW5nQm94ID0gewogICAgICAgICAgICBtaW46IHMuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSwKICAgICAgICAgICAgbWF4OiBzLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCkKICAgICAgICB9KSk7CiAgICAgICAgZnVuY3Rpb24gbihvLCBhKSB7CiAgICAgICAgICAgIHJldHVybiBvW2EudXVpZF0gPT09IHZvaWQgMCAmJiAob1thLnV1aWRdID0gYS50b0pTT04odCkpLCBhLnV1aWQ7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmlzU2NlbmUpIHRoaXMuYmFja2dyb3VuZCAmJiAodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3IgPyBzLmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCkgOiB0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlICYmIChzLmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSwgdGhpcy5lbnZpcm9ubWVudCAmJiB0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSAmJiB0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSAhPT0gITAgJiYgKHMuZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTsKICAgICAgICBlbHNlIGlmICh0aGlzLmlzTWVzaCB8fCB0aGlzLmlzTGluZSB8fCB0aGlzLmlzUG9pbnRzKSB7CiAgICAgICAgICAgIHMuZ2VvbWV0cnkgPSBuKHQuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSk7CiAgICAgICAgICAgIGxldCBvID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzOwogICAgICAgICAgICBpZiAobyAhPT0gdm9pZCAwICYmIG8uc2hhcGVzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIGxldCBhID0gby5zaGFwZXM7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkgZm9yKGxldCBsID0gMCwgYyA9IGEubGVuZ3RoOyBsIDwgYzsgbCsrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IGFbbF07CiAgICAgICAgICAgICAgICAgICAgbih0LnNoYXBlcywgdSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIG4odC5zaGFwZXMsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmlzU2tpbm5lZE1lc2ggJiYgKHMuYmluZE1vZGUgPSB0aGlzLmJpbmRNb2RlLCBzLmJpbmRNYXRyaXggPSB0aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLCB0aGlzLnNrZWxldG9uICE9PSB2b2lkIDAgJiYgKG4odC5za2VsZXRvbnMsIHRoaXMuc2tlbGV0b24pLCBzLnNrZWxldG9uID0gdGhpcy5za2VsZXRvbi51dWlkKSksIHRoaXMubWF0ZXJpYWwgIT09IHZvaWQgMCkgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpIHsKICAgICAgICAgICAgbGV0IG8gPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBhID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBhIDwgbDsgYSsrKW8ucHVzaChuKHQubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsW2FdKSk7CiAgICAgICAgICAgIHMubWF0ZXJpYWwgPSBvOwogICAgICAgIH0gZWxzZSBzLm1hdGVyaWFsID0gbih0Lm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCk7CiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgIGZvcihsZXQgbyA9IDA7IG8gPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgbysrKXMuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW29dLnRvSlNPTih0KS5vYmplY3QpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5hbmltYXRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcy5hbmltYXRpb25zID0gW107CiAgICAgICAgICAgIGZvcihsZXQgbyA9IDA7IG8gPCB0aGlzLmFuaW1hdGlvbnMubGVuZ3RoOyBvKyspewogICAgICAgICAgICAgICAgbGV0IGEgPSB0aGlzLmFuaW1hdGlvbnNbb107CiAgICAgICAgICAgICAgICBzLmFuaW1hdGlvbnMucHVzaChuKHQuYW5pbWF0aW9ucywgYSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgIGxldCBvID0gcih0Lmdlb21ldHJpZXMpLCBhID0gcih0Lm1hdGVyaWFscyksIGwgPSByKHQudGV4dHVyZXMpLCBjID0gcih0LmltYWdlcyksIHUgPSByKHQuc2hhcGVzKSwgZCA9IHIodC5za2VsZXRvbnMpLCBwID0gcih0LmFuaW1hdGlvbnMpLCBmID0gcih0Lm5vZGVzKTsKICAgICAgICAgICAgby5sZW5ndGggPiAwICYmIChpLmdlb21ldHJpZXMgPSBvKSwgYS5sZW5ndGggPiAwICYmIChpLm1hdGVyaWFscyA9IGEpLCBsLmxlbmd0aCA+IDAgJiYgKGkudGV4dHVyZXMgPSBsKSwgYy5sZW5ndGggPiAwICYmIChpLmltYWdlcyA9IGMpLCB1Lmxlbmd0aCA+IDAgJiYgKGkuc2hhcGVzID0gdSksIGQubGVuZ3RoID4gMCAmJiAoaS5za2VsZXRvbnMgPSBkKSwgcC5sZW5ndGggPiAwICYmIChpLmFuaW1hdGlvbnMgPSBwKSwgZi5sZW5ndGggPiAwICYmIChpLm5vZGVzID0gZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpLm9iamVjdCA9IHMsIGk7CiAgICAgICAgZnVuY3Rpb24gcihvKSB7CiAgICAgICAgICAgIGxldCBhID0gW107CiAgICAgICAgICAgIGZvcihsZXQgbCBpbiBvKXsKICAgICAgICAgICAgICAgIGxldCBjID0gb1tsXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjLm1ldGFkYXRhLCBhLnB1c2goYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgfQogICAgfQogICAgY2xvbmUodCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcywgdCk7CiAgICB9CiAgICBjb3B5KHQsIGUgPSAhMCkgewogICAgICAgIGlmICh0aGlzLm5hbWUgPSB0Lm5hbWUsIHRoaXMudXAuY29weSh0LnVwKSwgdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLCB0aGlzLnJvdGF0aW9uLm9yZGVyID0gdC5yb3RhdGlvbi5vcmRlciwgdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSwgdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLCB0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSwgdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0Lm1hdHJpeEF1dG9VcGRhdGUsIHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlID0gdC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHQubWF0cml4V29ybGROZWVkc1VwZGF0ZSwgdGhpcy5sYXllcnMubWFzayA9IHQubGF5ZXJzLm1hc2ssIHRoaXMudmlzaWJsZSA9IHQudmlzaWJsZSwgdGhpcy5jYXN0U2hhZG93ID0gdC5jYXN0U2hhZG93LCB0aGlzLnJlY2VpdmVTaGFkb3cgPSB0LnJlY2VpdmVTaGFkb3csIHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHQuZnJ1c3R1bUN1bGxlZCwgdGhpcy5yZW5kZXJPcmRlciA9IHQucmVuZGVyT3JkZXIsIHRoaXMuYW5pbWF0aW9ucyA9IHQuYW5pbWF0aW9ucy5zbGljZSgpLCB0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksIGUgPT09ICEwKSBmb3IobGV0IGkgPSAwOyBpIDwgdC5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGxldCBzID0gdC5jaGlsZHJlbltpXTsKICAgICAgICAgICAgdGhpcy5hZGQocy5jbG9uZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn07CkcuREVGQVVMVF9VUCA9IG5ldyB3KDAsIDEsIDApOwpHLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFID0gITA7CkcuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUgPSAhMDsKdmFyIER0ID0gbmV3IHcsIGVlID0gbmV3IHcsIExuID0gbmV3IHcsIGllID0gbmV3IHcsIGplID0gbmV3IHcsIEtlID0gbmV3IHcsIFNhID0gbmV3IHcsIFVuID0gbmV3IHcsIFduID0gbmV3IHcsIEhuID0gbmV3IHcsIHFuID0gbmV3IG90LCBHbiA9IG5ldyBvdCwgWG4gPSBuZXcgb3QsIG5lID0gY2xhc3MgaCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IHcsIGUgPSBuZXcgdywgaSA9IG5ldyB3KXsKICAgICAgICB0aGlzLmEgPSB0LCB0aGlzLmIgPSBlLCB0aGlzLmMgPSBpOwogICAgfQogICAgc3RhdGljIGdldE5vcm1hbCh0LCBlLCBpLCBzKSB7CiAgICAgICAgcy5zdWJWZWN0b3JzKGksIGUpLCBEdC5zdWJWZWN0b3JzKHQsIGUpLCBzLmNyb3NzKER0KTsKICAgICAgICBsZXQgbiA9IHMubGVuZ3RoU3EoKTsKICAgICAgICByZXR1cm4gbiA+IDAgPyBzLm11bHRpcGx5U2NhbGFyKDEgLyBNYXRoLnNxcnQobikpIDogcy5zZXQoMCwgMCwgMCk7CiAgICB9CiAgICBzdGF0aWMgZ2V0QmFyeWNvb3JkKHQsIGUsIGksIHMsIG4pIHsKICAgICAgICBEdC5zdWJWZWN0b3JzKHMsIGUpLCBlZS5zdWJWZWN0b3JzKGksIGUpLCBMbi5zdWJWZWN0b3JzKHQsIGUpOwogICAgICAgIGxldCByID0gRHQuZG90KER0KSwgbyA9IER0LmRvdChlZSksIGEgPSBEdC5kb3QoTG4pLCBsID0gZWUuZG90KGVlKSwgYyA9IGVlLmRvdChMbiksIHUgPSByICogbCAtIG8gKiBvOwogICAgICAgIGlmICh1ID09PSAwKSByZXR1cm4gbi5zZXQoMCwgMCwgMCksIG51bGw7CiAgICAgICAgbGV0IGQgPSAxIC8gdSwgcCA9IChsICogYSAtIG8gKiBjKSAqIGQsIGYgPSAociAqIGMgLSBvICogYSkgKiBkOwogICAgICAgIHJldHVybiBuLnNldCgxIC0gcCAtIGYsIGYsIHApOwogICAgfQogICAgc3RhdGljIGNvbnRhaW5zUG9pbnQodCwgZSwgaSwgcykgewogICAgICAgIHJldHVybiB0aGlzLmdldEJhcnljb29yZCh0LCBlLCBpLCBzLCBpZSkgPT09IG51bGwgPyAhMSA6IGllLnggPj0gMCAmJiBpZS55ID49IDAgJiYgaWUueCArIGllLnkgPD0gMTsKICAgIH0KICAgIHN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKHQsIGUsIGksIHMsIG4sIHIsIG8sIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCwgZSwgaSwgcywgaWUpID09PSBudWxsID8gKGEueCA9IDAsIGEueSA9IDAsICJ6IiBpbiBhICYmIChhLnogPSAwKSwgInciIGluIGEgJiYgKGEudyA9IDApLCBudWxsKSA6IChhLnNldFNjYWxhcigwKSwgYS5hZGRTY2FsZWRWZWN0b3IobiwgaWUueCksIGEuYWRkU2NhbGVkVmVjdG9yKHIsIGllLnkpLCBhLmFkZFNjYWxlZFZlY3RvcihvLCBpZS56KSwgYSk7CiAgICB9CiAgICBzdGF0aWMgZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHQsIGUsIGksIHMsIG4sIHIpIHsKICAgICAgICByZXR1cm4gcW4uc2V0U2NhbGFyKDApLCBHbi5zZXRTY2FsYXIoMCksIFhuLnNldFNjYWxhcigwKSwgcW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBlKSwgR24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBpKSwgWG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBzKSwgci5zZXRTY2FsYXIoMCksIHIuYWRkU2NhbGVkVmVjdG9yKHFuLCBuLngpLCByLmFkZFNjYWxlZFZlY3RvcihHbiwgbi55KSwgci5hZGRTY2FsZWRWZWN0b3IoWG4sIG4ueiksIHI7CiAgICB9CiAgICBzdGF0aWMgaXNGcm9udEZhY2luZyh0LCBlLCBpLCBzKSB7CiAgICAgICAgcmV0dXJuIER0LnN1YlZlY3RvcnMoaSwgZSksIGVlLnN1YlZlY3RvcnModCwgZSksIER0LmNyb3NzKGVlKS5kb3QocykgPCAwOwogICAgfQogICAgc2V0KHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5hLmNvcHkodCksIHRoaXMuYi5jb3B5KGUpLCB0aGlzLmMuY29weShpKSwgdGhpczsKICAgIH0KICAgIHNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsIGUsIGksIHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksIHRoaXMuYi5jb3B5KHRbaV0pLCB0aGlzLmMuY29weSh0W3NdKSwgdGhpczsKICAgIH0KICAgIHNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsIGUsIGksIHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodCwgZSksIHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsIGkpLCB0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBzKSwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5hLmNvcHkodC5hKSwgdGhpcy5iLmNvcHkodC5iKSwgdGhpcy5jLmNvcHkodC5jKSwgdGhpczsKICAgIH0KICAgIGdldEFyZWEoKSB7CiAgICAgICAgcmV0dXJuIER0LnN1YlZlY3RvcnModGhpcy5jLCB0aGlzLmIpLCBlZS5zdWJWZWN0b3JzKHRoaXMuYSwgdGhpcy5iKSwgRHQuY3Jvc3MoZWUpLmxlbmd0aCgpICogLjU7CiAgICB9CiAgICBnZXRNaWRwb2ludCh0KSB7CiAgICAgICAgcmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsIHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMSAvIDMpOwogICAgfQogICAgZ2V0Tm9ybWFsKHQpIHsKICAgICAgICByZXR1cm4gaC5nZXROb3JtYWwodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdCk7CiAgICB9CiAgICBnZXRQbGFuZSh0KSB7CiAgICAgICAgcmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMpOwogICAgfQogICAgZ2V0QmFyeWNvb3JkKHQsIGUpIHsKICAgICAgICByZXR1cm4gaC5nZXRCYXJ5Y29vcmQodCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgZSk7CiAgICB9CiAgICBnZXRJbnRlcnBvbGF0aW9uKHQsIGUsIGksIHMsIG4pIHsKICAgICAgICByZXR1cm4gaC5nZXRJbnRlcnBvbGF0aW9uKHQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIGUsIGksIHMsIG4pOwogICAgfQogICAgY29udGFpbnNQb2ludCh0KSB7CiAgICAgICAgcmV0dXJuIGguY29udGFpbnNQb2ludCh0LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jKTsKICAgIH0KICAgIGlzRnJvbnRGYWNpbmcodCkgewogICAgICAgIHJldHVybiBoLmlzRnJvbnRGYWNpbmcodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdCk7CiAgICB9CiAgICBpbnRlcnNlY3RzQm94KHQpIHsKICAgICAgICByZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyk7CiAgICB9CiAgICBjbG9zZXN0UG9pbnRUb1BvaW50KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuYSwgcyA9IHRoaXMuYiwgbiA9IHRoaXMuYywgciwgbzsKICAgICAgICBqZS5zdWJWZWN0b3JzKHMsIGkpLCBLZS5zdWJWZWN0b3JzKG4sIGkpLCBVbi5zdWJWZWN0b3JzKHQsIGkpOwogICAgICAgIGxldCBhID0gamUuZG90KFVuKSwgbCA9IEtlLmRvdChVbik7CiAgICAgICAgaWYgKGEgPD0gMCAmJiBsIDw9IDApIHJldHVybiBlLmNvcHkoaSk7CiAgICAgICAgV24uc3ViVmVjdG9ycyh0LCBzKTsKICAgICAgICBsZXQgYyA9IGplLmRvdChXbiksIHUgPSBLZS5kb3QoV24pOwogICAgICAgIGlmIChjID49IDAgJiYgdSA8PSBjKSByZXR1cm4gZS5jb3B5KHMpOwogICAgICAgIGxldCBkID0gYSAqIHUgLSBjICogbDsKICAgICAgICBpZiAoZCA8PSAwICYmIGEgPj0gMCAmJiBjIDw9IDApIHJldHVybiByID0gYSAvIChhIC0gYyksIGUuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoamUsIHIpOwogICAgICAgIEhuLnN1YlZlY3RvcnModCwgbik7CiAgICAgICAgbGV0IHAgPSBqZS5kb3QoSG4pLCBmID0gS2UuZG90KEhuKTsKICAgICAgICBpZiAoZiA+PSAwICYmIHAgPD0gZikgcmV0dXJuIGUuY29weShuKTsKICAgICAgICBsZXQgbSA9IHAgKiBsIC0gYSAqIGY7CiAgICAgICAgaWYgKG0gPD0gMCAmJiBsID49IDAgJiYgZiA8PSAwKSByZXR1cm4gbyA9IGwgLyAobCAtIGYpLCBlLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKEtlLCBvKTsKICAgICAgICBsZXQgeTEgPSBjICogZiAtIHAgKiB1OwogICAgICAgIGlmICh5MSA8PSAwICYmIHUgLSBjID49IDAgJiYgcCAtIGYgPj0gMCkgcmV0dXJuIFNhLnN1YlZlY3RvcnMobiwgcyksIG8gPSAodSAtIGMpIC8gKHUgLSBjICsgKHAgLSBmKSksIGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoU2EsIG8pOwogICAgICAgIGxldCBnID0gMSAvICh5MSArIG0gKyBkKTsKICAgICAgICByZXR1cm4gciA9IG0gKiBnLCBvID0gZCAqIGcsIGUuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoamUsIHIpLmFkZFNjYWxlZFZlY3RvcihLZSwgbyk7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkgJiYgdC5iLmVxdWFscyh0aGlzLmIpICYmIHQuYy5lcXVhbHModGhpcy5jKTsKICAgIH0KfSwgRmwgPSB7CiAgICBhbGljZWJsdWU6IDE1NzkyMzgzLAogICAgYW50aXF1ZXdoaXRlOiAxNjQ0NDM3NSwKICAgIGFxdWE6IDY1NTM1LAogICAgYXF1YW1hcmluZTogODM4ODU2NCwKICAgIGF6dXJlOiAxNTc5NDE3NSwKICAgIGJlaWdlOiAxNjExOTI2MCwKICAgIGJpc3F1ZTogMTY3NzAyNDQsCiAgICBibGFjazogMCwKICAgIGJsYW5jaGVkYWxtb25kOiAxNjc3MjA0NSwKICAgIGJsdWU6IDI1NSwKICAgIGJsdWV2aW9sZXQ6IDkwNTUyMDIsCiAgICBicm93bjogMTA4MjQyMzQsCiAgICBidXJseXdvb2Q6IDE0NTk2MjMxLAogICAgY2FkZXRibHVlOiA2MjY2NTI4LAogICAgY2hhcnRyZXVzZTogODM4ODM1MiwKICAgIGNob2NvbGF0ZTogMTM3ODk0NzAsCiAgICBjb3JhbDogMTY3NDQyNzIsCiAgICBjb3JuZmxvd2VyYmx1ZTogNjU5MTk4MSwKICAgIGNvcm5zaWxrOiAxNjc3NTM4OCwKICAgIGNyaW1zb246IDE0NDIzMTAwLAogICAgY3lhbjogNjU1MzUsCiAgICBkYXJrYmx1ZTogMTM5LAogICAgZGFya2N5YW46IDM1NzIzLAogICAgZGFya2dvbGRlbnJvZDogMTIwOTI5MzksCiAgICBkYXJrZ3JheTogMTExMTkwMTcsCiAgICBkYXJrZ3JlZW46IDI1NjAwLAogICAgZGFya2dyZXk6IDExMTE5MDE3LAogICAgZGFya2toYWtpOiAxMjQzMzI1OSwKICAgIGRhcmttYWdlbnRhOiA5MTA5NjQzLAogICAgZGFya29saXZlZ3JlZW46IDU1OTc5OTksCiAgICBkYXJrb3JhbmdlOiAxNjc0NzUyMCwKICAgIGRhcmtvcmNoaWQ6IDEwMDQwMDEyLAogICAgZGFya3JlZDogOTEwOTUwNCwKICAgIGRhcmtzYWxtb246IDE1MzA4NDEwLAogICAgZGFya3NlYWdyZWVuOiA5NDE5OTE5LAogICAgZGFya3NsYXRlYmx1ZTogNDczNDM0NywKICAgIGRhcmtzbGF0ZWdyYXk6IDMxMDA0OTUsCiAgICBkYXJrc2xhdGVncmV5OiAzMTAwNDk1LAogICAgZGFya3R1cnF1b2lzZTogNTI5NDUsCiAgICBkYXJrdmlvbGV0OiA5Njk5NTM5LAogICAgZGVlcHBpbms6IDE2NzE2OTQ3LAogICAgZGVlcHNreWJsdWU6IDQ5MTUxLAogICAgZGltZ3JheTogNjkwODI2NSwKICAgIGRpbWdyZXk6IDY5MDgyNjUsCiAgICBkb2RnZXJibHVlOiAyMDAzMTk5LAogICAgZmlyZWJyaWNrOiAxMTY3NDE0NiwKICAgIGZsb3JhbHdoaXRlOiAxNjc3NTkyMCwKICAgIGZvcmVzdGdyZWVuOiAyMjYzODQyLAogICAgZnVjaHNpYTogMTY3MTE5MzUsCiAgICBnYWluc2Jvcm86IDE0NDc0NDYwLAogICAgZ2hvc3R3aGl0ZTogMTYzMTY2NzEsCiAgICBnb2xkOiAxNjc2NjcyMCwKICAgIGdvbGRlbnJvZDogMTQzMjkxMjAsCiAgICBncmF5OiA4NDIxNTA0LAogICAgZ3JlZW46IDMyNzY4LAogICAgZ3JlZW55ZWxsb3c6IDExNDAzMDU1LAogICAgZ3JleTogODQyMTUwNCwKICAgIGhvbmV5ZGV3OiAxNTc5NDE2MCwKICAgIGhvdHBpbms6IDE2NzM4NzQwLAogICAgaW5kaWFucmVkOiAxMzQ1ODUyNCwKICAgIGluZGlnbzogNDkxNTMzMCwKICAgIGl2b3J5OiAxNjc3NzIwMCwKICAgIGtoYWtpOiAxNTc4NzY2MCwKICAgIGxhdmVuZGVyOiAxNTEzMjQxMCwKICAgIGxhdmVuZGVyYmx1c2g6IDE2NzczMzY1LAogICAgbGF3bmdyZWVuOiA4MTkwOTc2LAogICAgbGVtb25jaGlmZm9uOiAxNjc3NTg4NSwKICAgIGxpZ2h0Ymx1ZTogMTEzOTMyNTQsCiAgICBsaWdodGNvcmFsOiAxNTc2MTUzNiwKICAgIGxpZ2h0Y3lhbjogMTQ3NDU1OTksCiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogMTY0NDgyMTAsCiAgICBsaWdodGdyYXk6IDEzODgyMzIzLAogICAgbGlnaHRncmVlbjogOTQ5ODI1NiwKICAgIGxpZ2h0Z3JleTogMTM4ODIzMjMsCiAgICBsaWdodHBpbms6IDE2NzU4NDY1LAogICAgbGlnaHRzYWxtb246IDE2NzUyNzYyLAogICAgbGlnaHRzZWFncmVlbjogMjE0Mjg5MCwKICAgIGxpZ2h0c2t5Ymx1ZTogODkwMDM0NiwKICAgIGxpZ2h0c2xhdGVncmF5OiA3ODMzNzUzLAogICAgbGlnaHRzbGF0ZWdyZXk6IDc4MzM3NTMsCiAgICBsaWdodHN0ZWVsYmx1ZTogMTE1ODQ3MzQsCiAgICBsaWdodHllbGxvdzogMTY3NzcxODQsCiAgICBsaW1lOiA2NTI4MCwKICAgIGxpbWVncmVlbjogMzMyOTMzMCwKICAgIGxpbmVuOiAxNjQ0NTY3MCwKICAgIG1hZ2VudGE6IDE2NzExOTM1LAogICAgbWFyb29uOiA4Mzg4NjA4LAogICAgbWVkaXVtYXF1YW1hcmluZTogNjczNzMyMiwKICAgIG1lZGl1bWJsdWU6IDIwNSwKICAgIG1lZGl1bW9yY2hpZDogMTIyMTE2NjcsCiAgICBtZWRpdW1wdXJwbGU6IDk2NjI2ODMsCiAgICBtZWRpdW1zZWFncmVlbjogMzk3ODA5NywKICAgIG1lZGl1bXNsYXRlYmx1ZTogODA4Nzc5MCwKICAgIG1lZGl1bXNwcmluZ2dyZWVuOiA2NDE1NCwKICAgIG1lZGl1bXR1cnF1b2lzZTogNDc3MjMwMCwKICAgIG1lZGl1bXZpb2xldHJlZDogMTMwNDcxNzMsCiAgICBtaWRuaWdodGJsdWU6IDE2NDQ5MTIsCiAgICBtaW50Y3JlYW06IDE2MTIxODUwLAogICAgbWlzdHlyb3NlOiAxNjc3MDI3MywKICAgIG1vY2Nhc2luOiAxNjc3MDIyOSwKICAgIG5hdmFqb3doaXRlOiAxNjc2ODY4NSwKICAgIG5hdnk6IDEyOCwKICAgIG9sZGxhY2U6IDE2NjQzNTU4LAogICAgb2xpdmU6IDg0MjEzNzYsCiAgICBvbGl2ZWRyYWI6IDcwNDg3MzksCiAgICBvcmFuZ2U6IDE2NzUzOTIwLAogICAgb3JhbmdlcmVkOiAxNjcyOTM0NCwKICAgIG9yY2hpZDogMTQzMTU3MzQsCiAgICBwYWxlZ29sZGVucm9kOiAxNTY1NzEzMCwKICAgIHBhbGVncmVlbjogMTAwMjU4ODAsCiAgICBwYWxldHVycXVvaXNlOiAxMTUyOTk2NiwKICAgIHBhbGV2aW9sZXRyZWQ6IDE0MzgxMjAzLAogICAgcGFwYXlhd2hpcDogMTY3NzMwNzcsCiAgICBwZWFjaHB1ZmY6IDE2NzY3NjczLAogICAgcGVydTogMTM0Njg5OTEsCiAgICBwaW5rOiAxNjc2MTAzNSwKICAgIHBsdW06IDE0NTI0NjM3LAogICAgcG93ZGVyYmx1ZTogMTE1OTE5MTAsCiAgICBwdXJwbGU6IDgzODg3MzYsCiAgICByZWJlY2NhcHVycGxlOiA2Njk3ODgxLAogICAgcmVkOiAxNjcxMTY4MCwKICAgIHJvc3licm93bjogMTIzNTc1MTksCiAgICByb3lhbGJsdWU6IDQyODY5NDUsCiAgICBzYWRkbGVicm93bjogOTEyNzE4NywKICAgIHNhbG1vbjogMTY0MTY4ODIsCiAgICBzYW5keWJyb3duOiAxNjAzMjg2NCwKICAgIHNlYWdyZWVuOiAzMDUwMzI3LAogICAgc2Vhc2hlbGw6IDE2Nzc0NjM4LAogICAgc2llbm5hOiAxMDUwNjc5NywKICAgIHNpbHZlcjogMTI2MzIyNTYsCiAgICBza3libHVlOiA4OTAwMzMxLAogICAgc2xhdGVibHVlOiA2OTcwMDYxLAogICAgc2xhdGVncmF5OiA3MzcyOTQ0LAogICAgc2xhdGVncmV5OiA3MzcyOTQ0LAogICAgc25vdzogMTY3NzU5MzAsCiAgICBzcHJpbmdncmVlbjogNjU0MDcsCiAgICBzdGVlbGJsdWU6IDQ2MjA5ODAsCiAgICB0YW46IDEzODA4NzgwLAogICAgdGVhbDogMzI4OTYsCiAgICB0aGlzdGxlOiAxNDIwNDg4OCwKICAgIHRvbWF0bzogMTY3MzcwOTUsCiAgICB0dXJxdW9pc2U6IDQyNTE4NTYsCiAgICB2aW9sZXQ6IDE1NjMxMDg2LAogICAgd2hlYXQ6IDE2MTEzMzMxLAogICAgd2hpdGU6IDE2Nzc3MjE1LAogICAgd2hpdGVzbW9rZTogMTYxMTkyODUsCiAgICB5ZWxsb3c6IDE2Nzc2OTYwLAogICAgeWVsbG93Z3JlZW46IDEwMTQ1MDc0Cn0sIG1lID0gewogICAgaDogMCwKICAgIHM6IDAsCiAgICBsOiAwCn0sIGNzID0gewogICAgaDogMCwKICAgIHM6IDAsCiAgICBsOiAwCn07CmZ1bmN0aW9uIEpuKGgsIHQsIGUpIHsKICAgIHJldHVybiBlIDwgMCAmJiAoZSArPSAxKSwgZSA+IDEgJiYgKGUgLT0gMSksIGUgPCAxIC8gNiA/IGggKyAodCAtIGgpICogNiAqIGUgOiBlIDwgMSAvIDIgPyB0IDogZSA8IDIgLyAzID8gaCArICh0IC0gaCkgKiA2ICogKDIgLyAzIC0gZSkgOiBoOwp9CnZhciBQID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb2xvciA9ICEwLCB0aGlzLnIgPSAxLCB0aGlzLmcgPSAxLCB0aGlzLmIgPSAxLCB0aGlzLnNldCh0LCBlLCBpKTsKICAgIH0KICAgIHNldCh0LCBlLCBpKSB7CiAgICAgICAgaWYgKGUgPT09IHZvaWQgMCAmJiBpID09PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IHMgPSB0OwogICAgICAgICAgICBzICYmIHMuaXNDb2xvciA/IHRoaXMuY29weShzKSA6IHR5cGVvZiBzID09ICJudW1iZXIiID8gdGhpcy5zZXRIZXgocykgOiB0eXBlb2YgcyA9PSAic3RyaW5nIiAmJiB0aGlzLnNldFN0eWxlKHMpOwogICAgICAgIH0gZWxzZSB0aGlzLnNldFJHQih0LCBlLCBpKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IHQsIHRoaXMuZyA9IHQsIHRoaXMuYiA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRIZXgodCwgZSA9IEJ0KSB7CiAgICAgICAgcmV0dXJuIHQgPSBNYXRoLmZsb29yKHQpLCB0aGlzLnIgPSAodCA+PiAxNiAmIDI1NSkgLyAyNTUsIHRoaXMuZyA9ICh0ID4+IDggJiAyNTUpIC8gMjU1LCB0aGlzLmIgPSAodCAmIDI1NSkgLyAyNTUsIFR0LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcywgZSksIHRoaXM7CiAgICB9CiAgICBzZXRSR0IodCwgZSwgaSwgcyA9IFR0LndvcmtpbmdDb2xvclNwYWNlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IHQsIHRoaXMuZyA9IGUsIHRoaXMuYiA9IGksIFR0LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcywgcyksIHRoaXM7CiAgICB9CiAgICBzZXRIU0wodCwgZSwgaSwgcyA9IFR0LndvcmtpbmdDb2xvclNwYWNlKSB7CiAgICAgICAgaWYgKHQgPSBxbyh0LCAxKSwgZSA9IE4oZSwgMCwgMSksIGkgPSBOKGksIDAsIDEpLCBlID09PSAwKSB0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgbiA9IGkgPD0gLjUgPyBpICogKDEgKyBlKSA6IGkgKyBlIC0gaSAqIGUsIHIgPSAyICogaSAtIG47CiAgICAgICAgICAgIHRoaXMuciA9IEpuKHIsIG4sIHQgKyAxIC8gMyksIHRoaXMuZyA9IEpuKHIsIG4sIHQpLCB0aGlzLmIgPSBKbihyLCBuLCB0IC0gMSAvIDMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gVHQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLCBzKSwgdGhpczsKICAgIH0KICAgIHNldFN0eWxlKHQsIGUgPSBCdCkgewogICAgICAgIGZ1bmN0aW9uIGkobikgewogICAgICAgICAgICBuICE9PSB2b2lkIDAgJiYgcGFyc2VGbG9hdChuKSA8IDEgJiYgY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIgKyB0ICsgIiB3aWxsIGJlIGlnbm9yZWQuIik7CiAgICAgICAgfQogICAgICAgIGxldCBzOwogICAgICAgIGlmIChzID0gL14oXHcrKVwoKFteXCldKilcKS8uZXhlYyh0KSkgewogICAgICAgICAgICBsZXQgbiwgciA9IHNbMV0sIG8gPSBzWzJdOwogICAgICAgICAgICBzd2l0Y2gocil7CiAgICAgICAgICAgICAgICBjYXNlICJyZ2IiOgogICAgICAgICAgICAgICAgY2FzZSAicmdiYSI6CiAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSAvXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKSByZXR1cm4gaShuWzRdKSwgdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LCBwYXJzZUludChuWzFdLCAxMCkpIC8gMjU1LCBNYXRoLm1pbigyNTUsIHBhcnNlSW50KG5bMl0sIDEwKSkgLyAyNTUsIE1hdGgubWluKDI1NSwgcGFyc2VJbnQoblszXSwgMTApKSAvIDI1NSwgZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSAvXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKSByZXR1cm4gaShuWzRdKSwgdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLCBwYXJzZUludChuWzFdLCAxMCkpIC8gMTAwLCBNYXRoLm1pbigxMDAsIHBhcnNlSW50KG5bMl0sIDEwKSkgLyAxMDAsIE1hdGgubWluKDEwMCwgcGFyc2VJbnQoblszXSwgMTApKSAvIDEwMCwgZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJoc2wiOgogICAgICAgICAgICAgICAgY2FzZSAiaHNsYSI6CiAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSAvXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSkgcmV0dXJuIGkobls0XSksIHRoaXMuc2V0SFNMKHBhcnNlRmxvYXQoblsxXSkgLyAzNjAsIHBhcnNlRmxvYXQoblsyXSkgLyAxMDAsIHBhcnNlRmxvYXQoblszXSkgLyAxMDAsIGUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIgKyB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocyA9IC9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSkgewogICAgICAgICAgICBsZXQgbiA9IHNbMV0sIHIgPSBuLmxlbmd0aDsKICAgICAgICAgICAgaWYgKHIgPT09IDMpIHJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChuLmNoYXJBdCgwKSwgMTYpIC8gMTUsIHBhcnNlSW50KG4uY2hhckF0KDEpLCAxNikgLyAxNSwgcGFyc2VJbnQobi5jaGFyQXQoMiksIDE2KSAvIDE1LCBlKTsKICAgICAgICAgICAgaWYgKHIgPT09IDYpIHJldHVybiB0aGlzLnNldEhleChwYXJzZUludChuLCAxNiksIGUpOwogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiICsgdCk7CiAgICAgICAgfSBlbHNlIGlmICh0ICYmIHQubGVuZ3RoID4gMCkgcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsIGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0Q29sb3JOYW1lKHQsIGUgPSBCdCkgewogICAgICAgIGxldCBpID0gRmxbdC50b0xvd2VyQ2FzZSgpXTsKICAgICAgICByZXR1cm4gaSAhPT0gdm9pZCAwID8gdGhpcy5zZXRIZXgoaSwgZSkgOiBjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIgKyB0KSwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnIgPSB0LnIsIHRoaXMuZyA9IHQuZywgdGhpcy5iID0gdC5iLCB0aGlzOwogICAgfQogICAgY29weVNSR0JUb0xpbmVhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IGFlKHQuciksIHRoaXMuZyA9IGFlKHQuZyksIHRoaXMuYiA9IGFlKHQuYiksIHRoaXM7CiAgICB9CiAgICBjb3B5TGluZWFyVG9TUkdCKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yID0gZGkodC5yKSwgdGhpcy5nID0gZGkodC5nKSwgdGhpcy5iID0gZGkodC5iKSwgdGhpczsKICAgIH0KICAgIGNvbnZlcnRTUkdCVG9MaW5lYXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSwgdGhpczsKICAgIH0KICAgIGNvbnZlcnRMaW5lYXJUb1NSR0IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSwgdGhpczsKICAgIH0KICAgIGdldEhleCh0ID0gQnQpIHsKICAgICAgICByZXR1cm4gVHQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKGR0LmNvcHkodGhpcyksIHQpLCBNYXRoLnJvdW5kKE4oZHQuciAqIDI1NSwgMCwgMjU1KSkgKiA2NTUzNiArIE1hdGgucm91bmQoTihkdC5nICogMjU1LCAwLCAyNTUpKSAqIDI1NiArIE1hdGgucm91bmQoTihkdC5iICogMjU1LCAwLCAyNTUpKTsKICAgIH0KICAgIGdldEhleFN0cmluZyh0ID0gQnQpIHsKICAgICAgICByZXR1cm4gKCIwMDAwMDAiICsgdGhpcy5nZXRIZXgodCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7CiAgICB9CiAgICBnZXRIU0wodCwgZSA9IFR0LndvcmtpbmdDb2xvclNwYWNlKSB7CiAgICAgICAgVHQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKGR0LmNvcHkodGhpcyksIGUpOwogICAgICAgIGxldCBpID0gZHQuciwgcyA9IGR0LmcsIG4gPSBkdC5iLCByID0gTWF0aC5tYXgoaSwgcywgbiksIG8gPSBNYXRoLm1pbihpLCBzLCBuKSwgYSwgbCwgYyA9IChvICsgcikgLyAyOwogICAgICAgIGlmIChvID09PSByKSBhID0gMCwgbCA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxldCB1ID0gciAtIG87CiAgICAgICAgICAgIHN3aXRjaChsID0gYyA8PSAuNSA/IHUgLyAociArIG8pIDogdSAvICgyIC0gciAtIG8pLCByKXsKICAgICAgICAgICAgICAgIGNhc2UgaToKICAgICAgICAgICAgICAgICAgICBhID0gKHMgLSBuKSAvIHUgKyAocyA8IG4gPyA2IDogMCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIHM6CiAgICAgICAgICAgICAgICAgICAgYSA9IChuIC0gaSkgLyB1ICsgMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgbjoKICAgICAgICAgICAgICAgICAgICBhID0gKGkgLSBzKSAvIHUgKyA0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGEgLz0gNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQuaCA9IGEsIHQucyA9IGwsIHQubCA9IGMsIHQ7CiAgICB9CiAgICBnZXRSR0IodCwgZSA9IFR0LndvcmtpbmdDb2xvclNwYWNlKSB7CiAgICAgICAgcmV0dXJuIFR0LmZyb21Xb3JraW5nQ29sb3JTcGFjZShkdC5jb3B5KHRoaXMpLCBlKSwgdC5yID0gZHQuciwgdC5nID0gZHQuZywgdC5iID0gZHQuYiwgdDsKICAgIH0KICAgIGdldFN0eWxlKHQgPSBCdCkgewogICAgICAgIFR0LmZyb21Xb3JraW5nQ29sb3JTcGFjZShkdC5jb3B5KHRoaXMpLCB0KTsKICAgICAgICBsZXQgZSA9IGR0LnIsIGkgPSBkdC5nLCBzID0gZHQuYjsKICAgICAgICByZXR1cm4gdCAhPT0gQnQgPyBgY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtpLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgIDogYHJnYigke01hdGgucm91bmQoZSAqIDI1NSl9LCR7TWF0aC5yb3VuZChpICogMjU1KX0sJHtNYXRoLnJvdW5kKHMgKiAyNTUpfSlgOwogICAgfQogICAgb2Zmc2V0SFNMKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRIU0wobWUpLCB0aGlzLnNldEhTTChtZS5oICsgdCwgbWUucyArIGUsIG1lLmwgKyBpKTsKICAgIH0KICAgIGFkZCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciArPSB0LnIsIHRoaXMuZyArPSB0LmcsIHRoaXMuYiArPSB0LmIsIHRoaXM7CiAgICB9CiAgICBhZGRDb2xvcnModCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnIgPSB0LnIgKyBlLnIsIHRoaXMuZyA9IHQuZyArIGUuZywgdGhpcy5iID0gdC5iICsgZS5iLCB0aGlzOwogICAgfQogICAgYWRkU2NhbGFyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yICs9IHQsIHRoaXMuZyArPSB0LCB0aGlzLmIgKz0gdCwgdGhpczsKICAgIH0KICAgIHN1Yih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IE1hdGgubWF4KDAsIHRoaXMuciAtIHQuciksIHRoaXMuZyA9IE1hdGgubWF4KDAsIHRoaXMuZyAtIHQuZyksIHRoaXMuYiA9IE1hdGgubWF4KDAsIHRoaXMuYiAtIHQuYiksIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciAqPSB0LnIsIHRoaXMuZyAqPSB0LmcsIHRoaXMuYiAqPSB0LmIsIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseVNjYWxhcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciAqPSB0LCB0aGlzLmcgKj0gdCwgdGhpcy5iICo9IHQsIHRoaXM7CiAgICB9CiAgICBsZXJwKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yICs9ICh0LnIgLSB0aGlzLnIpICogZSwgdGhpcy5nICs9ICh0LmcgLSB0aGlzLmcpICogZSwgdGhpcy5iICs9ICh0LmIgLSB0aGlzLmIpICogZSwgdGhpczsKICAgIH0KICAgIGxlcnBDb2xvcnModCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnIgPSB0LnIgKyAoZS5yIC0gdC5yKSAqIGksIHRoaXMuZyA9IHQuZyArIChlLmcgLSB0LmcpICogaSwgdGhpcy5iID0gdC5iICsgKGUuYiAtIHQuYikgKiBpLCB0aGlzOwogICAgfQogICAgbGVycEhTTCh0LCBlKSB7CiAgICAgICAgdGhpcy5nZXRIU0wobWUpLCB0LmdldEhTTChjcyk7CiAgICAgICAgbGV0IGkgPSBOaShtZS5oLCBjcy5oLCBlKSwgcyA9IE5pKG1lLnMsIGNzLnMsIGUpLCBuID0gTmkobWUubCwgY3MubCwgZSk7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0SFNMKGksIHMsIG4pLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVZlY3RvcjModCkgewogICAgICAgIHJldHVybiB0aGlzLnIgPSB0LngsIHRoaXMuZyA9IHQueSwgdGhpcy5iID0gdC56LCB0aGlzOwogICAgfQogICAgYXBwbHlNYXRyaXgzKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuciwgaSA9IHRoaXMuZywgcyA9IHRoaXMuYiwgbiA9IHQuZWxlbWVudHM7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IG5bMF0gKiBlICsgblszXSAqIGkgKyBuWzZdICogcywgdGhpcy5nID0gblsxXSAqIGUgKyBuWzRdICogaSArIG5bN10gKiBzLCB0aGlzLmIgPSBuWzJdICogZSArIG5bNV0gKiBpICsgbls4XSAqIHMsIHRoaXM7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0LnIgPT09IHRoaXMuciAmJiB0LmcgPT09IHRoaXMuZyAmJiB0LmIgPT09IHRoaXMuYjsKICAgIH0KICAgIGZyb21BcnJheSh0LCBlID0gMCkgewogICAgICAgIHJldHVybiB0aGlzLnIgPSB0W2VdLCB0aGlzLmcgPSB0W2UgKyAxXSwgdGhpcy5iID0gdFtlICsgMl0sIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KHQgPSBbXSwgZSA9IDApIHsKICAgICAgICByZXR1cm4gdFtlXSA9IHRoaXMuciwgdFtlICsgMV0gPSB0aGlzLmcsIHRbZSArIDJdID0gdGhpcy5iLCB0OwogICAgfQogICAgZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuciA9IHQuZ2V0WChlKSwgdGhpcy5nID0gdC5nZXRZKGUpLCB0aGlzLmIgPSB0LmdldFooZSksIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGV4KCk7CiAgICB9CiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgeWllbGQgdGhpcy5yLCB5aWVsZCB0aGlzLmcsIHlpZWxkIHRoaXMuYjsKICAgIH0KfSwgZHQgPSBuZXcgUDsKUC5OQU1FUyA9IEZsOwp2YXIgX3UgPSAwLCBjdCA9IGNsYXNzIGV4dGVuZHMgcXQgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTWF0ZXJpYWwgPSAhMCwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJpZCIsIHsKICAgICAgICAgICAgdmFsdWU6IF91KysKICAgICAgICB9KSwgdGhpcy51dWlkID0gSXQoKSwgdGhpcy5uYW1lID0gIiIsIHRoaXMudHlwZSA9ICJNYXRlcmlhbCIsIHRoaXMuYmxlbmRpbmcgPSBlYSwgdGhpcy5zaWRlID0gZHIsIHRoaXMudmVydGV4Q29sb3JzID0gITEsIHRoaXMub3BhY2l0eSA9IDEsIHRoaXMudHJhbnNwYXJlbnQgPSAhMSwgdGhpcy5hbHBoYUhhc2ggPSAhMSwgdGhpcy5ibGVuZFNyYyA9IHNhLCB0aGlzLmJsZW5kRHN0ID0gbmEsIHRoaXMuYmxlbmRFcXVhdGlvbiA9IGlhLCB0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsLCB0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsLCB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGwsIHRoaXMuYmxlbmRDb2xvciA9IG5ldyBQKDAsIDAsIDApLCB0aGlzLmJsZW5kQWxwaGEgPSAwLCB0aGlzLmRlcHRoRnVuYyA9IHJhLCB0aGlzLmRlcHRoVGVzdCA9ICEwLCB0aGlzLmRlcHRoV3JpdGUgPSAhMCwgdGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gMjU1LCB0aGlzLnN0ZW5jaWxGdW5jID0gY2EsIHRoaXMuc3RlbmNpbFJlZiA9IDAsIHRoaXMuc3RlbmNpbEZ1bmNNYXNrID0gMjU1LCB0aGlzLnN0ZW5jaWxGYWlsID0gcWUsIHRoaXMuc3RlbmNpbFpGYWlsID0gcWUsIHRoaXMuc3RlbmNpbFpQYXNzID0gcWUsIHRoaXMuc3RlbmNpbFdyaXRlID0gITEsIHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsLCB0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSAhMSwgdGhpcy5jbGlwU2hhZG93cyA9ICExLCB0aGlzLnNoYWRvd1NpZGUgPSBudWxsLCB0aGlzLmNvbG9yV3JpdGUgPSAhMCwgdGhpcy5wcmVjaXNpb24gPSBudWxsLCB0aGlzLnBvbHlnb25PZmZzZXQgPSAhMSwgdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMCwgdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwLCB0aGlzLmRpdGhlcmluZyA9ICExLCB0aGlzLmFscGhhVG9Db3ZlcmFnZSA9ICExLCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9ICExLCB0aGlzLmZvcmNlU2luZ2xlUGFzcyA9ICExLCB0aGlzLnZpc2libGUgPSAhMCwgdGhpcy50b25lTWFwcGVkID0gITAsIHRoaXMudXNlckRhdGEgPSB7fSwgdGhpcy52ZXJzaW9uID0gMCwgdGhpcy5fYWxwaGFUZXN0ID0gMDsKICAgIH0KICAgIGdldCBhbHBoYVRlc3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhVGVzdDsKICAgIH0KICAgIHNldCBhbHBoYVRlc3QodCkgewogICAgICAgIHRoaXMuX2FscGhhVGVzdCA+IDAgIT0gdCA+IDAgJiYgdGhpcy52ZXJzaW9uKyssIHRoaXMuX2FscGhhVGVzdCA9IHQ7CiAgICB9CiAgICBvbkJlZm9yZVJlbmRlcigpIHt9CiAgICBvbkJlZm9yZUNvbXBpbGUoKSB7fQogICAgY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCkgewogICAgICAgIHJldHVybiB0aGlzLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpOwogICAgfQogICAgc2V0VmFsdWVzKHQpIHsKICAgICAgICBpZiAodCAhPT0gdm9pZCAwKSBmb3IobGV0IGUgaW4gdCl7CiAgICAgICAgICAgIGxldCBpID0gdFtlXTsKICAgICAgICAgICAgaWYgKGkgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHMgPSB0aGlzW2VdOwogICAgICAgICAgICBpZiAocyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcyAmJiBzLmlzQ29sb3IgPyBzLnNldChpKSA6IHMgJiYgcy5pc1ZlY3RvcjMgJiYgaSAmJiBpLmlzVmVjdG9yMyA/IHMuY29weShpKSA6IHRoaXNbZV0gPSBpOwogICAgICAgIH0KICAgIH0KICAgIHRvSlNPTih0KSB7CiAgICAgICAgbGV0IGUgPSB0ID09PSB2b2lkIDAgfHwgdHlwZW9mIHQgPT0gInN0cmluZyI7CiAgICAgICAgZSAmJiAodCA9IHsKICAgICAgICAgICAgdGV4dHVyZXM6IHt9LAogICAgICAgICAgICBpbWFnZXM6IHt9CiAgICAgICAgfSk7CiAgICAgICAgbGV0IGkgPSB7CiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uOiA0LjYsCiAgICAgICAgICAgICAgICB0eXBlOiAiTWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAiTWF0ZXJpYWwudG9KU09OIgogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpLnV1aWQgPSB0aGlzLnV1aWQsIGkudHlwZSA9IHRoaXMudHlwZSwgdGhpcy5uYW1lICE9PSAiIiAmJiAoaS5uYW1lID0gdGhpcy5uYW1lKSwgdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgJiYgKGkuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpKSwgdGhpcy5yb3VnaG5lc3MgIT09IHZvaWQgMCAmJiAoaS5yb3VnaG5lc3MgPSB0aGlzLnJvdWdobmVzcyksIHRoaXMubWV0YWxuZXNzICE9PSB2b2lkIDAgJiYgKGkubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3MpLCB0aGlzLnNoZWVuICE9PSB2b2lkIDAgJiYgKGkuc2hlZW4gPSB0aGlzLnNoZWVuKSwgdGhpcy5zaGVlbkNvbG9yICYmIHRoaXMuc2hlZW5Db2xvci5pc0NvbG9yICYmIChpLnNoZWVuQ29sb3IgPSB0aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLCB0aGlzLnNoZWVuUm91Z2huZXNzICE9PSB2b2lkIDAgJiYgKGkuc2hlZW5Sb3VnaG5lc3MgPSB0aGlzLnNoZWVuUm91Z2huZXNzKSwgdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgJiYgKGkuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpKSwgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdm9pZCAwICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgJiYgKGkuZW1pc3NpdmVJbnRlbnNpdHkgPSB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSwgdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgJiYgKGkuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyLmdldEhleCgpKSwgdGhpcy5zcGVjdWxhckludGVuc2l0eSAhPT0gdm9pZCAwICYmIChpLnNwZWN1bGFySW50ZW5zaXR5ID0gdGhpcy5zcGVjdWxhckludGVuc2l0eSksIHRoaXMuc3BlY3VsYXJDb2xvciAmJiB0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciAmJiAoaS5zcGVjdWxhckNvbG9yID0gdGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpKSwgdGhpcy5zaGluaW5lc3MgIT09IHZvaWQgMCAmJiAoaS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcyksIHRoaXMuY2xlYXJjb2F0ICE9PSB2b2lkIDAgJiYgKGkuY2xlYXJjb2F0ID0gdGhpcy5jbGVhcmNvYXQpLCB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdm9pZCAwICYmIChpLmNsZWFyY29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzKSwgdGhpcy5jbGVhcmNvYXRNYXAgJiYgdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlICYmIChpLmNsZWFyY29hdE1hcCA9IHRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgJiYgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlICYmIChpLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgJiYgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlICYmIChpLmNsZWFyY29hdE5vcm1hbE1hcCA9IHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLCBpLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCkpLCB0aGlzLmRpc3BlcnNpb24gIT09IHZvaWQgMCAmJiAoaS5kaXNwZXJzaW9uID0gdGhpcy5kaXNwZXJzaW9uKSwgdGhpcy5pcmlkZXNjZW5jZSAhPT0gdm9pZCAwICYmIChpLmlyaWRlc2NlbmNlID0gdGhpcy5pcmlkZXNjZW5jZSksIHRoaXMuaXJpZGVzY2VuY2VJT1IgIT09IHZvaWQgMCAmJiAoaS5pcmlkZXNjZW5jZUlPUiA9IHRoaXMuaXJpZGVzY2VuY2VJT1IpLCB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgIT09IHZvaWQgMCAmJiAoaS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSwgdGhpcy5pcmlkZXNjZW5jZU1hcCAmJiB0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSAmJiAoaS5pcmlkZXNjZW5jZU1hcCA9IHRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLCB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICYmIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlICYmIChpLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksIHRoaXMuYW5pc290cm9weSAhPT0gdm9pZCAwICYmIChpLmFuaXNvdHJvcHkgPSB0aGlzLmFuaXNvdHJvcHkpLCB0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiAhPT0gdm9pZCAwICYmIChpLmFuaXNvdHJvcHlSb3RhdGlvbiA9IHRoaXMuYW5pc290cm9weVJvdGF0aW9uKSwgdGhpcy5hbmlzb3Ryb3B5TWFwICYmIHRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUgJiYgKGkuYW5pc290cm9weU1hcCA9IHRoaXMuYW5pc290cm9weU1hcC50b0pTT04odCkudXVpZCksIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSAmJiAoaS5tYXAgPSB0aGlzLm1hcC50b0pTT04odCkudXVpZCksIHRoaXMubWF0Y2FwICYmIHRoaXMubWF0Y2FwLmlzVGV4dHVyZSAmJiAoaS5tYXRjYXAgPSB0aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgJiYgKGkuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSAmJiAoaS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKHQpLnV1aWQsIGkubGlnaHRNYXBJbnRlbnNpdHkgPSB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSwgdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSAmJiAoaS5hb01hcCA9IHRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsIGkuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5KSwgdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgJiYgKGkuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04odCkudXVpZCwgaS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZSksIHRoaXMubm9ybWFsTWFwICYmIHRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSAmJiAoaS5ub3JtYWxNYXAgPSB0aGlzLm5vcm1hbE1hcC50b0pTT04odCkudXVpZCwgaS5ub3JtYWxNYXBUeXBlID0gdGhpcy5ub3JtYWxNYXBUeXBlLCBpLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgJiYgKGkuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsIGkuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlLCBpLmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXMpLCB0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUgJiYgKGkucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgJiYgKGkubWV0YWxuZXNzTWFwID0gdGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICYmIChpLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgJiYgKGkuc3BlY3VsYXJNYXAgPSB0aGlzLnNwZWN1bGFyTWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCAmJiB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSAmJiAoaS5zcGVjdWxhckludGVuc2l0eU1hcCA9IHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKHQpLnV1aWQpLCB0aGlzLnNwZWN1bGFyQ29sb3JNYXAgJiYgdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSAmJiAoaS5zcGVjdWxhckNvbG9yTWFwID0gdGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICYmIChpLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTih0KS51dWlkLCB0aGlzLmNvbWJpbmUgIT09IHZvaWQgMCAmJiAoaS5jb21iaW5lID0gdGhpcy5jb21iaW5lKSksIHRoaXMuZW52TWFwUm90YXRpb24gIT09IHZvaWQgMCAmJiAoaS5lbnZNYXBSb3RhdGlvbiA9IHRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSwgdGhpcy5lbnZNYXBJbnRlbnNpdHkgIT09IHZvaWQgMCAmJiAoaS5lbnZNYXBJbnRlbnNpdHkgPSB0aGlzLmVudk1hcEludGVuc2l0eSksIHRoaXMucmVmbGVjdGl2aXR5ICE9PSB2b2lkIDAgJiYgKGkucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHkpLCB0aGlzLnJlZnJhY3Rpb25SYXRpbyAhPT0gdm9pZCAwICYmIChpLnJlZnJhY3Rpb25SYXRpbyA9IHRoaXMucmVmcmFjdGlvblJhdGlvKSwgdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSAmJiAoaS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKHQpLnV1aWQpLCB0aGlzLnRyYW5zbWlzc2lvbiAhPT0gdm9pZCAwICYmIChpLnRyYW5zbWlzc2lvbiA9IHRoaXMudHJhbnNtaXNzaW9uKSwgdGhpcy50cmFuc21pc3Npb25NYXAgJiYgdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlICYmIChpLnRyYW5zbWlzc2lvbk1hcCA9IHRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSwgdGhpcy50aGlja25lc3MgIT09IHZvaWQgMCAmJiAoaS50aGlja25lc3MgPSB0aGlzLnRoaWNrbmVzcyksIHRoaXMudGhpY2tuZXNzTWFwICYmIHRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSAmJiAoaS50aGlja25lc3NNYXAgPSB0aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksIHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSAhPT0gdm9pZCAwICYmIHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSAhPT0gMSAvIDAgJiYgKGkuYXR0ZW51YXRpb25EaXN0YW5jZSA9IHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksIHRoaXMuYXR0ZW51YXRpb25Db2xvciAhPT0gdm9pZCAwICYmIChpLmF0dGVudWF0aW9uQ29sb3IgPSB0aGlzLmF0dGVudWF0aW9uQ29sb3IuZ2V0SGV4KCkpLCB0aGlzLnNpemUgIT09IHZvaWQgMCAmJiAoaS5zaXplID0gdGhpcy5zaXplKSwgdGhpcy5zaGFkb3dTaWRlICE9PSBudWxsICYmIChpLnNoYWRvd1NpZGUgPSB0aGlzLnNoYWRvd1NpZGUpLCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdm9pZCAwICYmIChpLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uKSwgdGhpcy5ibGVuZGluZyAhPT0gZWEgJiYgKGkuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nKSwgdGhpcy5zaWRlICE9PSBkciAmJiAoaS5zaWRlID0gdGhpcy5zaWRlKSwgdGhpcy52ZXJ0ZXhDb2xvcnMgPT09ICEwICYmIChpLnZlcnRleENvbG9ycyA9ICEwKSwgdGhpcy5vcGFjaXR5IDwgMSAmJiAoaS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5KSwgdGhpcy50cmFuc3BhcmVudCA9PT0gITAgJiYgKGkudHJhbnNwYXJlbnQgPSAhMCksIHRoaXMuYmxlbmRTcmMgIT09IHNhICYmIChpLmJsZW5kU3JjID0gdGhpcy5ibGVuZFNyYyksIHRoaXMuYmxlbmREc3QgIT09IG5hICYmIChpLmJsZW5kRHN0ID0gdGhpcy5ibGVuZERzdCksIHRoaXMuYmxlbmRFcXVhdGlvbiAhPT0gaWEgJiYgKGkuYmxlbmRFcXVhdGlvbiA9IHRoaXMuYmxlbmRFcXVhdGlvbiksIHRoaXMuYmxlbmRTcmNBbHBoYSAhPT0gbnVsbCAmJiAoaS5ibGVuZFNyY0FscGhhID0gdGhpcy5ibGVuZFNyY0FscGhhKSwgdGhpcy5ibGVuZERzdEFscGhhICE9PSBudWxsICYmIChpLmJsZW5kRHN0QWxwaGEgPSB0aGlzLmJsZW5kRHN0QWxwaGEpLCB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gbnVsbCAmJiAoaS5ibGVuZEVxdWF0aW9uQWxwaGEgPSB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksIHRoaXMuYmxlbmRDb2xvciAmJiB0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciAmJiAoaS5ibGVuZENvbG9yID0gdGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSwgdGhpcy5ibGVuZEFscGhhICE9PSAwICYmIChpLmJsZW5kQWxwaGEgPSB0aGlzLmJsZW5kQWxwaGEpLCB0aGlzLmRlcHRoRnVuYyAhPT0gcmEgJiYgKGkuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmMpLCB0aGlzLmRlcHRoVGVzdCA9PT0gITEgJiYgKGkuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3QpLCB0aGlzLmRlcHRoV3JpdGUgPT09ICExICYmIChpLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGUpLCB0aGlzLmNvbG9yV3JpdGUgPT09ICExICYmIChpLmNvbG9yV3JpdGUgPSB0aGlzLmNvbG9yV3JpdGUpLCB0aGlzLnN0ZW5jaWxXcml0ZU1hc2sgIT09IDI1NSAmJiAoaS5zdGVuY2lsV3JpdGVNYXNrID0gdGhpcy5zdGVuY2lsV3JpdGVNYXNrKSwgdGhpcy5zdGVuY2lsRnVuYyAhPT0gY2EgJiYgKGkuc3RlbmNpbEZ1bmMgPSB0aGlzLnN0ZW5jaWxGdW5jKSwgdGhpcy5zdGVuY2lsUmVmICE9PSAwICYmIChpLnN0ZW5jaWxSZWYgPSB0aGlzLnN0ZW5jaWxSZWYpLCB0aGlzLnN0ZW5jaWxGdW5jTWFzayAhPT0gMjU1ICYmIChpLnN0ZW5jaWxGdW5jTWFzayA9IHRoaXMuc3RlbmNpbEZ1bmNNYXNrKSwgdGhpcy5zdGVuY2lsRmFpbCAhPT0gcWUgJiYgKGkuc3RlbmNpbEZhaWwgPSB0aGlzLnN0ZW5jaWxGYWlsKSwgdGhpcy5zdGVuY2lsWkZhaWwgIT09IHFlICYmIChpLnN0ZW5jaWxaRmFpbCA9IHRoaXMuc3RlbmNpbFpGYWlsKSwgdGhpcy5zdGVuY2lsWlBhc3MgIT09IHFlICYmIChpLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzKSwgdGhpcy5zdGVuY2lsV3JpdGUgPT09ICEwICYmIChpLnN0ZW5jaWxXcml0ZSA9IHRoaXMuc3RlbmNpbFdyaXRlKSwgdGhpcy5yb3RhdGlvbiAhPT0gdm9pZCAwICYmIHRoaXMucm90YXRpb24gIT09IDAgJiYgKGkucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uKSwgdGhpcy5wb2x5Z29uT2Zmc2V0ID09PSAhMCAmJiAoaS5wb2x5Z29uT2Zmc2V0ID0gITApLCB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IDAgJiYgKGkucG9seWdvbk9mZnNldEZhY3RvciA9IHRoaXMucG9seWdvbk9mZnNldEZhY3RvciksIHRoaXMucG9seWdvbk9mZnNldFVuaXRzICE9PSAwICYmIChpLnBvbHlnb25PZmZzZXRVbml0cyA9IHRoaXMucG9seWdvbk9mZnNldFVuaXRzKSwgdGhpcy5saW5ld2lkdGggIT09IHZvaWQgMCAmJiB0aGlzLmxpbmV3aWR0aCAhPT0gMSAmJiAoaS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aCksIHRoaXMuZGFzaFNpemUgIT09IHZvaWQgMCAmJiAoaS5kYXNoU2l6ZSA9IHRoaXMuZGFzaFNpemUpLCB0aGlzLmdhcFNpemUgIT09IHZvaWQgMCAmJiAoaS5nYXBTaXplID0gdGhpcy5nYXBTaXplKSwgdGhpcy5zY2FsZSAhPT0gdm9pZCAwICYmIChpLnNjYWxlID0gdGhpcy5zY2FsZSksIHRoaXMuZGl0aGVyaW5nID09PSAhMCAmJiAoaS5kaXRoZXJpbmcgPSAhMCksIHRoaXMuYWxwaGFUZXN0ID4gMCAmJiAoaS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdCksIHRoaXMuYWxwaGFIYXNoID09PSAhMCAmJiAoaS5hbHBoYUhhc2ggPSAhMCksIHRoaXMuYWxwaGFUb0NvdmVyYWdlID09PSAhMCAmJiAoaS5hbHBoYVRvQ292ZXJhZ2UgPSAhMCksIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSAhMCAmJiAoaS5wcmVtdWx0aXBsaWVkQWxwaGEgPSAhMCksIHRoaXMuZm9yY2VTaW5nbGVQYXNzID09PSAhMCAmJiAoaS5mb3JjZVNpbmdsZVBhc3MgPSAhMCksIHRoaXMud2lyZWZyYW1lID09PSAhMCAmJiAoaS53aXJlZnJhbWUgPSAhMCksIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSAmJiAoaS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCksIHRoaXMud2lyZWZyYW1lTGluZWNhcCAhPT0gInJvdW5kIiAmJiAoaS53aXJlZnJhbWVMaW5lY2FwID0gdGhpcy53aXJlZnJhbWVMaW5lY2FwKSwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gInJvdW5kIiAmJiAoaS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW4pLCB0aGlzLmZsYXRTaGFkaW5nID09PSAhMCAmJiAoaS5mbGF0U2hhZGluZyA9ICEwKSwgdGhpcy52aXNpYmxlID09PSAhMSAmJiAoaS52aXNpYmxlID0gITEpLCB0aGlzLnRvbmVNYXBwZWQgPT09ICExICYmIChpLnRvbmVNYXBwZWQgPSAhMSksIHRoaXMuZm9nID09PSAhMSAmJiAoaS5mb2cgPSAhMSksIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCA+IDAgJiYgKGkudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhKTsKICAgICAgICBmdW5jdGlvbiBzKG4pIHsKICAgICAgICAgICAgbGV0IHIgPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBvIGluIG4pewogICAgICAgICAgICAgICAgbGV0IGEgPSBuW29dOwogICAgICAgICAgICAgICAgZGVsZXRlIGEubWV0YWRhdGEsIHIucHVzaChhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICB9CiAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgbGV0IG4gPSBzKHQudGV4dHVyZXMpLCByID0gcyh0LmltYWdlcyk7CiAgICAgICAgICAgIG4ubGVuZ3RoID4gMCAmJiAoaS50ZXh0dXJlcyA9IG4pLCByLmxlbmd0aCA+IDAgJiYgKGkuaW1hZ2VzID0gcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5ibGVuZGluZyA9IHQuYmxlbmRpbmcsIHRoaXMuc2lkZSA9IHQuc2lkZSwgdGhpcy52ZXJ0ZXhDb2xvcnMgPSB0LnZlcnRleENvbG9ycywgdGhpcy5vcGFjaXR5ID0gdC5vcGFjaXR5LCB0aGlzLnRyYW5zcGFyZW50ID0gdC50cmFuc3BhcmVudCwgdGhpcy5ibGVuZFNyYyA9IHQuYmxlbmRTcmMsIHRoaXMuYmxlbmREc3QgPSB0LmJsZW5kRHN0LCB0aGlzLmJsZW5kRXF1YXRpb24gPSB0LmJsZW5kRXF1YXRpb24sIHRoaXMuYmxlbmRTcmNBbHBoYSA9IHQuYmxlbmRTcmNBbHBoYSwgdGhpcy5ibGVuZERzdEFscGhhID0gdC5ibGVuZERzdEFscGhhLCB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IHQuYmxlbmRFcXVhdGlvbkFscGhhLCB0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLCB0aGlzLmJsZW5kQWxwaGEgPSB0LmJsZW5kQWxwaGEsIHRoaXMuZGVwdGhGdW5jID0gdC5kZXB0aEZ1bmMsIHRoaXMuZGVwdGhUZXN0ID0gdC5kZXB0aFRlc3QsIHRoaXMuZGVwdGhXcml0ZSA9IHQuZGVwdGhXcml0ZSwgdGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gdC5zdGVuY2lsV3JpdGVNYXNrLCB0aGlzLnN0ZW5jaWxGdW5jID0gdC5zdGVuY2lsRnVuYywgdGhpcy5zdGVuY2lsUmVmID0gdC5zdGVuY2lsUmVmLCB0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IHQuc3RlbmNpbEZ1bmNNYXNrLCB0aGlzLnN0ZW5jaWxGYWlsID0gdC5zdGVuY2lsRmFpbCwgdGhpcy5zdGVuY2lsWkZhaWwgPSB0LnN0ZW5jaWxaRmFpbCwgdGhpcy5zdGVuY2lsWlBhc3MgPSB0LnN0ZW5jaWxaUGFzcywgdGhpcy5zdGVuY2lsV3JpdGUgPSB0LnN0ZW5jaWxXcml0ZTsKICAgICAgICBsZXQgZSA9IHQuY2xpcHBpbmdQbGFuZXMsIGkgPSBudWxsOwogICAgICAgIGlmIChlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBzID0gZS5sZW5ndGg7CiAgICAgICAgICAgIGkgPSBuZXcgQXJyYXkocyk7CiAgICAgICAgICAgIGZvcihsZXQgbiA9IDA7IG4gIT09IHM7ICsrbilpW25dID0gZVtuXS5jbG9uZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcyA9IGksIHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHQuY2xpcEludGVyc2VjdGlvbiwgdGhpcy5jbGlwU2hhZG93cyA9IHQuY2xpcFNoYWRvd3MsIHRoaXMuc2hhZG93U2lkZSA9IHQuc2hhZG93U2lkZSwgdGhpcy5jb2xvcldyaXRlID0gdC5jb2xvcldyaXRlLCB0aGlzLnByZWNpc2lvbiA9IHQucHJlY2lzaW9uLCB0aGlzLnBvbHlnb25PZmZzZXQgPSB0LnBvbHlnb25PZmZzZXQsIHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHQucG9seWdvbk9mZnNldEZhY3RvciwgdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSB0LnBvbHlnb25PZmZzZXRVbml0cywgdGhpcy5kaXRoZXJpbmcgPSB0LmRpdGhlcmluZywgdGhpcy5hbHBoYVRlc3QgPSB0LmFscGhhVGVzdCwgdGhpcy5hbHBoYUhhc2ggPSB0LmFscGhhSGFzaCwgdGhpcy5hbHBoYVRvQ292ZXJhZ2UgPSB0LmFscGhhVG9Db3ZlcmFnZSwgdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0LnByZW11bHRpcGxpZWRBbHBoYSwgdGhpcy5mb3JjZVNpbmdsZVBhc3MgPSB0LmZvcmNlU2luZ2xlUGFzcywgdGhpcy52aXNpYmxlID0gdC52aXNpYmxlLCB0aGlzLnRvbmVNYXBwZWQgPSB0LnRvbmVNYXBwZWQsIHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSwgdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgdHlwZTogImRpc3Bvc2UiCiAgICAgICAgfSk7CiAgICB9CiAgICBzZXQgbmVlZHNVcGRhdGUodCkgewogICAgICAgIHQgPT09ICEwICYmIHRoaXMudmVyc2lvbisrOwogICAgfQogICAgb25CdWlsZCgpIHsKICAgICAgICBjb25zb2xlLndhcm4oIk1hdGVyaWFsOiBvbkJ1aWxkKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKTsKICAgIH0KfSwgX2UgPSBjbGFzcyBleHRlbmRzIGN0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbCA9ICEwLCB0aGlzLnR5cGUgPSAiTWVzaEJhc2ljTWF0ZXJpYWwiLCB0aGlzLmNvbG9yID0gbmV3IFAoMTY3NzcyMTUpLCB0aGlzLm1hcCA9IG51bGwsIHRoaXMubGlnaHRNYXAgPSBudWxsLCB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMSwgdGhpcy5hb01hcCA9IG51bGwsIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLCB0aGlzLnNwZWN1bGFyTWFwID0gbnVsbCwgdGhpcy5hbHBoYU1hcCA9IG51bGwsIHRoaXMuZW52TWFwID0gbnVsbCwgdGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBYdCwgdGhpcy5jb21iaW5lID0gRG8sIHRoaXMucmVmbGVjdGl2aXR5ID0gMSwgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAuOTgsIHRoaXMud2lyZWZyYW1lID0gITEsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMSwgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gInJvdW5kIiwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICJyb3VuZCIsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSwgdGhpcy5tYXAgPSB0Lm1hcCwgdGhpcy5saWdodE1hcCA9IHQubGlnaHRNYXAsIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSB0LmxpZ2h0TWFwSW50ZW5zaXR5LCB0aGlzLmFvTWFwID0gdC5hb01hcCwgdGhpcy5hb01hcEludGVuc2l0eSA9IHQuYW9NYXBJbnRlbnNpdHksIHRoaXMuc3BlY3VsYXJNYXAgPSB0LnNwZWN1bGFyTWFwLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5lbnZNYXAgPSB0LmVudk1hcCwgdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLCB0aGlzLmNvbWJpbmUgPSB0LmNvbWJpbmUsIHRoaXMucmVmbGVjdGl2aXR5ID0gdC5yZWZsZWN0aXZpdHksIHRoaXMucmVmcmFjdGlvblJhdGlvID0gdC5yZWZyYWN0aW9uUmF0aW8sIHRoaXMud2lyZWZyYW1lID0gdC53aXJlZnJhbWUsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHQud2lyZWZyYW1lTGluZWNhcCwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHQud2lyZWZyYW1lTGluZWpvaW4sIHRoaXMuZm9nID0gdC5mb2csIHRoaXM7CiAgICB9Cn0sIHJlID0gdnUoKTsKZnVuY3Rpb24gdnUoKSB7CiAgICBsZXQgaCA9IG5ldyBBcnJheUJ1ZmZlcig0KSwgdCA9IG5ldyBGbG9hdDMyQXJyYXkoaCksIGUgPSBuZXcgVWludDMyQXJyYXkoaCksIGkgPSBuZXcgVWludDMyQXJyYXkoNTEyKSwgcyA9IG5ldyBVaW50MzJBcnJheSg1MTIpOwogICAgZm9yKGxldCBhID0gMDsgYSA8IDI1NjsgKythKXsKICAgICAgICBsZXQgbCA9IGEgLSAxMjc7CiAgICAgICAgbCA8IC0yNyA/IChpW2FdID0gMCwgaVthIHwgMjU2XSA9IDMyNzY4LCBzW2FdID0gMjQsIHNbYSB8IDI1Nl0gPSAyNCkgOiBsIDwgLTE0ID8gKGlbYV0gPSAxMDI0ID4+IC1sIC0gMTQsIGlbYSB8IDI1Nl0gPSAxMDI0ID4+IC1sIC0gMTQgfCAzMjc2OCwgc1thXSA9IC1sIC0gMSwgc1thIHwgMjU2XSA9IC1sIC0gMSkgOiBsIDw9IDE1ID8gKGlbYV0gPSBsICsgMTUgPDwgMTAsIGlbYSB8IDI1Nl0gPSBsICsgMTUgPDwgMTAgfCAzMjc2OCwgc1thXSA9IDEzLCBzW2EgfCAyNTZdID0gMTMpIDogbCA8IDEyOCA/IChpW2FdID0gMzE3NDQsIGlbYSB8IDI1Nl0gPSA2NDUxMiwgc1thXSA9IDI0LCBzW2EgfCAyNTZdID0gMjQpIDogKGlbYV0gPSAzMTc0NCwgaVthIHwgMjU2XSA9IDY0NTEyLCBzW2FdID0gMTMsIHNbYSB8IDI1Nl0gPSAxMyk7CiAgICB9CiAgICBsZXQgbiA9IG5ldyBVaW50MzJBcnJheSgyMDQ4KSwgciA9IG5ldyBVaW50MzJBcnJheSg2NCksIG8gPSBuZXcgVWludDMyQXJyYXkoNjQpOwogICAgZm9yKGxldCBhID0gMTsgYSA8IDEwMjQ7ICsrYSl7CiAgICAgICAgbGV0IGwgPSBhIDw8IDEzLCBjID0gMDsKICAgICAgICBmb3IoOyAhKGwgJiA4Mzg4NjA4KTspbCA8PD0gMSwgYyAtPSA4Mzg4NjA4OwogICAgICAgIGwgJj0gLTgzODg2MDksIGMgKz0gOTQ3OTEyNzA0LCBuW2FdID0gbCB8IGM7CiAgICB9CiAgICBmb3IobGV0IGEgPSAxMDI0OyBhIDwgMjA0ODsgKythKW5bYV0gPSA5Mzk1MjQwOTYgKyAoYSAtIDEwMjQgPDwgMTMpOwogICAgZm9yKGxldCBhID0gMTsgYSA8IDMxOyArK2EpclthXSA9IGEgPDwgMjM7CiAgICByWzMxXSA9IDExOTk1NzA5NDQsIHJbMzJdID0gMjE0NzQ4MzY0ODsKICAgIGZvcihsZXQgYSA9IDMzOyBhIDwgNjM7ICsrYSlyW2FdID0gMjE0NzQ4MzY0OCArIChhIC0gMzIgPDwgMjMpOwogICAgcls2M10gPSAzMzQ3MDU0NTkyOwogICAgZm9yKGxldCBhID0gMTsgYSA8IDY0OyArK2EpYSAhPT0gMzIgJiYgKG9bYV0gPSAxMDI0KTsKICAgIHJldHVybiB7CiAgICAgICAgZmxvYXRWaWV3OiB0LAogICAgICAgIHVpbnQzMlZpZXc6IGUsCiAgICAgICAgYmFzZVRhYmxlOiBpLAogICAgICAgIHNoaWZ0VGFibGU6IHMsCiAgICAgICAgbWFudGlzc2FUYWJsZTogbiwKICAgICAgICBleHBvbmVudFRhYmxlOiByLAogICAgICAgIG9mZnNldFRhYmxlOiBvCiAgICB9Owp9CmZ1bmN0aW9uIF90KGgpIHsKICAgIE1hdGguYWJzKGgpID4gNjU1MDQgJiYgY29uc29sZS53YXJuKCJUSFJFRS5EYXRhVXRpbHMudG9IYWxmRmxvYXQoKTogVmFsdWUgb3V0IG9mIHJhbmdlLiIpLCBoID0gTihoLCAtNjU1MDQsIDY1NTA0KSwgcmUuZmxvYXRWaWV3WzBdID0gaDsKICAgIGxldCB0ID0gcmUudWludDMyVmlld1swXSwgZSA9IHQgPj4gMjMgJiA1MTE7CiAgICByZXR1cm4gcmUuYmFzZVRhYmxlW2VdICsgKCh0ICYgODM4ODYwNykgPj4gcmUuc2hpZnRUYWJsZVtlXSk7Cn0KZnVuY3Rpb24gT2koaCkgewogICAgbGV0IHQgPSBoID4+IDEwOwogICAgcmV0dXJuIHJlLnVpbnQzMlZpZXdbMF0gPSByZS5tYW50aXNzYVRhYmxlW3JlLm9mZnNldFRhYmxlW3RdICsgKGggJiAxMDIzKV0gKyByZS5leHBvbmVudFRhYmxlW3RdLCByZS5mbG9hdFZpZXdbMF07Cn0KdmFyIEVmID0gewogICAgdG9IYWxmRmxvYXQ6IF90LAogICAgZnJvbUhhbGZGbG9hdDogT2kKfSwgbnQgPSBuZXcgdywgdXMgPSBuZXcgVCwgQXUgPSAwLCBaID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSA9ICExKXsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKICAgICAgICB0aGlzLmlzQnVmZmVyQXR0cmlidXRlID0gITAsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7CiAgICAgICAgICAgIHZhbHVlOiBBdSsrCiAgICAgICAgfSksIHRoaXMubmFtZSA9ICIiLCB0aGlzLmFycmF5ID0gdCwgdGhpcy5pdGVtU2l6ZSA9IGUsIHRoaXMuY291bnQgPSB0ICE9PSB2b2lkIDAgPyB0Lmxlbmd0aCAvIGUgOiAwLCB0aGlzLm5vcm1hbGl6ZWQgPSBpLCB0aGlzLnVzYWdlID0gSnMsIHRoaXMudXBkYXRlUmFuZ2VzID0gW10sIHRoaXMuZ3B1VHlwZSA9IHBpLCB0aGlzLnZlcnNpb24gPSAwOwogICAgfQogICAgb25VcGxvYWRDYWxsYmFjaygpIHt9CiAgICBzZXQgbmVlZHNVcGRhdGUodCkgewogICAgICAgIHQgPT09ICEwICYmIHRoaXMudmVyc2lvbisrOwogICAgfQogICAgc2V0VXNhZ2UodCkgewogICAgICAgIHJldHVybiB0aGlzLnVzYWdlID0gdCwgdGhpczsKICAgIH0KICAgIGFkZFVwZGF0ZVJhbmdlKHQsIGUpIHsKICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHsKICAgICAgICAgICAgc3RhcnQ6IHQsCiAgICAgICAgICAgIGNvdW50OiBlCiAgICAgICAgfSk7CiAgICB9CiAgICBjbGVhclVwZGF0ZVJhbmdlcygpIHsKICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGggPSAwOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5hcnJheSA9IG5ldyB0LmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXkpLCB0aGlzLml0ZW1TaXplID0gdC5pdGVtU2l6ZSwgdGhpcy5jb3VudCA9IHQuY291bnQsIHRoaXMubm9ybWFsaXplZCA9IHQubm9ybWFsaXplZCwgdGhpcy51c2FnZSA9IHQudXNhZ2UsIHRoaXMuZ3B1VHlwZSA9IHQuZ3B1VHlwZSwgdGhpczsKICAgIH0KICAgIGNvcHlBdCh0LCBlLCBpKSB7CiAgICAgICAgdCAqPSB0aGlzLml0ZW1TaXplLCBpICo9IGUuaXRlbVNpemU7CiAgICAgICAgZm9yKGxldCBzID0gMCwgbiA9IHRoaXMuaXRlbVNpemU7IHMgPCBuOyBzKyspdGhpcy5hcnJheVt0ICsgc10gPSBlLmFycmF5W2kgKyBzXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNvcHlBcnJheSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLCB0aGlzOwogICAgfQogICAgYXBwbHlNYXRyaXgzKHQpIHsKICAgICAgICBpZiAodGhpcy5pdGVtU2l6ZSA9PT0gMikgZm9yKGxldCBlID0gMCwgaSA9IHRoaXMuY291bnQ7IGUgPCBpOyBlKyspdXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBlKSwgdXMuYXBwbHlNYXRyaXgzKHQpLCB0aGlzLnNldFhZKGUsIHVzLngsIHVzLnkpOwogICAgICAgIGVsc2UgaWYgKHRoaXMuaXRlbVNpemUgPT09IDMpIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLmNvdW50OyBlIDwgaTsgZSsrKW50LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgZSksIG50LmFwcGx5TWF0cml4Myh0KSwgdGhpcy5zZXRYWVooZSwgbnQueCwgbnQueSwgbnQueik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhcHBseU1hdHJpeDQodCkgewogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLmNvdW50OyBlIDwgaTsgZSsrKW50LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgZSksIG50LmFwcGx5TWF0cml4NCh0KSwgdGhpcy5zZXRYWVooZSwgbnQueCwgbnQueSwgbnQueik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhcHBseU5vcm1hbE1hdHJpeCh0KSB7CiAgICAgICAgZm9yKGxldCBlID0gMCwgaSA9IHRoaXMuY291bnQ7IGUgPCBpOyBlKyspbnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBlKSwgbnQuYXBwbHlOb3JtYWxNYXRyaXgodCksIHRoaXMuc2V0WFlaKGUsIG50LngsIG50LnksIG50LnopOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdHJhbnNmb3JtRGlyZWN0aW9uKHQpIHsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdGhpcy5jb3VudDsgZSA8IGk7IGUrKyludC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsIGUpLCBudC50cmFuc2Zvcm1EaXJlY3Rpb24odCksIHRoaXMuc2V0WFlaKGUsIG50LngsIG50LnksIG50LnopOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0KHQsIGUgPSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsIGUpLCB0aGlzOwogICAgfQogICAgZ2V0Q29tcG9uZW50KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyBlXTsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChpID0geHQoaSwgdGhpcy5hcnJheSkpLCBpOwogICAgfQogICAgc2V0Q29tcG9uZW50KHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChpID0gVihpLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyBlXSA9IGksIHRoaXM7CiAgICB9CiAgICBnZXRYKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemVdOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRYKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemVdID0gZSwgdGhpczsKICAgIH0KICAgIGdldFkodCkgewogICAgICAgIGxldCBlID0gdGhpcy5hcnJheVt0ICogdGhpcy5pdGVtU2l6ZSArIDFdOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRZKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyAxXSA9IGUsIHRoaXM7CiAgICB9CiAgICBnZXRaKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyAyXTsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0geHQoZSwgdGhpcy5hcnJheSkpLCBlOwogICAgfQogICAgc2V0Wih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IFYoZSwgdGhpcy5hcnJheSkpLCB0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplICsgMl0gPSBlLCB0aGlzOwogICAgfQogICAgZ2V0Vyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplICsgM107CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IHh0KGUsIHRoaXMuYXJyYXkpKSwgZTsKICAgIH0KICAgIHNldFcodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpKSwgdGhpcy5hcnJheVt0ICogdGhpcy5pdGVtU2l6ZSArIDNdID0gZSwgdGhpczsKICAgIH0KICAgIHNldFhZKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdCAqPSB0aGlzLml0ZW1TaXplLCB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpLCBpID0gVihpLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCArIDBdID0gZSwgdGhpcy5hcnJheVt0ICsgMV0gPSBpLCB0aGlzOwogICAgfQogICAgc2V0WFlaKHQsIGUsIGksIHMpIHsKICAgICAgICByZXR1cm4gdCAqPSB0aGlzLml0ZW1TaXplLCB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpLCBpID0gVihpLCB0aGlzLmFycmF5KSwgcyA9IFYocywgdGhpcy5hcnJheSkpLCB0aGlzLmFycmF5W3QgKyAwXSA9IGUsIHRoaXMuYXJyYXlbdCArIDFdID0gaSwgdGhpcy5hcnJheVt0ICsgMl0gPSBzLCB0aGlzOwogICAgfQogICAgc2V0WFlaVyh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgcmV0dXJuIHQgKj0gdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSwgaSA9IFYoaSwgdGhpcy5hcnJheSksIHMgPSBWKHMsIHRoaXMuYXJyYXkpLCBuID0gVihuLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCArIDBdID0gZSwgdGhpcy5hcnJheVt0ICsgMV0gPSBpLCB0aGlzLmFycmF5W3QgKyAyXSA9IHMsIHRoaXMuYXJyYXlbdCArIDNdID0gbiwgdGhpczsKICAgIH0KICAgIG9uVXBsb2FkKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrID0gdCwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gewogICAgICAgICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSwKICAgICAgICAgICAgdHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAogICAgICAgICAgICBhcnJheTogQXJyYXkuZnJvbSh0aGlzLmFycmF5KSwKICAgICAgICAgICAgbm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lICE9PSAiIiAmJiAodC5uYW1lID0gdGhpcy5uYW1lKSwgdGhpcy51c2FnZSAhPT0gSnMgJiYgKHQudXNhZ2UgPSB0aGlzLnVzYWdlKSwgdDsKICAgIH0KfSwgVGEgPSBjbGFzcyBleHRlbmRzIFogewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgc3VwZXIobmV3IEludDhBcnJheSh0KSwgZSwgaSk7CiAgICB9Cn0sIElhID0gY2xhc3MgZXh0ZW5kcyBaIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKG5ldyBVaW50OEFycmF5KHQpLCBlLCBpKTsKICAgIH0KfSwgQ2EgPSBjbGFzcyBleHRlbmRzIFogewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgc3VwZXIobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpLCBlLCBpKTsKICAgIH0KfSwgemEgPSBjbGFzcyBleHRlbmRzIFogewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgc3VwZXIobmV3IEludDE2QXJyYXkodCksIGUsIGkpOwogICAgfQp9LCBnciA9IGNsYXNzIGV4dGVuZHMgWiB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpKXsKICAgICAgICBzdXBlcihuZXcgVWludDE2QXJyYXkodCksIGUsIGkpOwogICAgfQp9LCBGYSA9IGNsYXNzIGV4dGVuZHMgWiB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpKXsKICAgICAgICBzdXBlcihuZXcgSW50MzJBcnJheSh0KSwgZSwgaSk7CiAgICB9Cn0sIHhyID0gY2xhc3MgZXh0ZW5kcyBaIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKG5ldyBVaW50MzJBcnJheSh0KSwgZSwgaSk7CiAgICB9Cn0sIEJhID0gY2xhc3MgZXh0ZW5kcyBaIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKG5ldyBVaW50MTZBcnJheSh0KSwgZSwgaSksIHRoaXMuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlID0gITA7CiAgICB9CiAgICBnZXRYKHQpIHsKICAgICAgICBsZXQgZSA9IE9pKHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemVdKTsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0geHQoZSwgdGhpcy5hcnJheSkpLCBlOwogICAgfQogICAgc2V0WCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IFYoZSwgdGhpcy5hcnJheSkpLCB0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplXSA9IF90KGUpLCB0aGlzOwogICAgfQogICAgZ2V0WSh0KSB7CiAgICAgICAgbGV0IGUgPSBPaSh0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplICsgMV0pOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRZKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyAxXSA9IF90KGUpLCB0aGlzOwogICAgfQogICAgZ2V0Wih0KSB7CiAgICAgICAgbGV0IGUgPSBPaSh0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplICsgMl0pOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRaKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyAyXSA9IF90KGUpLCB0aGlzOwogICAgfQogICAgZ2V0Vyh0KSB7CiAgICAgICAgbGV0IGUgPSBPaSh0aGlzLmFycmF5W3QgKiB0aGlzLml0ZW1TaXplICsgM10pOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRXKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuYXJyYXlbdCAqIHRoaXMuaXRlbVNpemUgKyAzXSA9IF90KGUpLCB0aGlzOwogICAgfQogICAgc2V0WFkodCwgZSwgaSkgewogICAgICAgIHJldHVybiB0ICo9IHRoaXMuaXRlbVNpemUsIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IFYoZSwgdGhpcy5hcnJheSksIGkgPSBWKGksIHRoaXMuYXJyYXkpKSwgdGhpcy5hcnJheVt0ICsgMF0gPSBfdChlKSwgdGhpcy5hcnJheVt0ICsgMV0gPSBfdChpKSwgdGhpczsKICAgIH0KICAgIHNldFhZWih0LCBlLCBpLCBzKSB7CiAgICAgICAgcmV0dXJuIHQgKj0gdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSwgaSA9IFYoaSwgdGhpcy5hcnJheSksIHMgPSBWKHMsIHRoaXMuYXJyYXkpKSwgdGhpcy5hcnJheVt0ICsgMF0gPSBfdChlKSwgdGhpcy5hcnJheVt0ICsgMV0gPSBfdChpKSwgdGhpcy5hcnJheVt0ICsgMl0gPSBfdChzKSwgdGhpczsKICAgIH0KICAgIHNldFhZWlcodCwgZSwgaSwgcywgbikgewogICAgICAgIHJldHVybiB0ICo9IHRoaXMuaXRlbVNpemUsIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IFYoZSwgdGhpcy5hcnJheSksIGkgPSBWKGksIHRoaXMuYXJyYXkpLCBzID0gVihzLCB0aGlzLmFycmF5KSwgbiA9IFYobiwgdGhpcy5hcnJheSkpLCB0aGlzLmFycmF5W3QgKyAwXSA9IF90KGUpLCB0aGlzLmFycmF5W3QgKyAxXSA9IF90KGkpLCB0aGlzLmFycmF5W3QgKyAyXSA9IF90KHMpLCB0aGlzLmFycmF5W3QgKyAzXSA9IF90KG4pLCB0aGlzOwogICAgfQp9LCBFID0gY2xhc3MgZXh0ZW5kcyBaIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksIGUsIGkpOwogICAgfQp9LCBTdSA9IDAsIEZ0ID0gbmV3IEQsIFpuID0gbmV3IEcsIHRpID0gbmV3IHcsIFN0ID0gbmV3IGZ0LCBJaSA9IG5ldyBmdCwgcnQgPSBuZXcgdywgTCA9IGNsYXNzIGggZXh0ZW5kcyBxdCB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNCdWZmZXJHZW9tZXRyeSA9ICEwLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImlkIiwgewogICAgICAgICAgICB2YWx1ZTogU3UrKwogICAgICAgIH0pLCB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLm5hbWUgPSAiIiwgdGhpcy50eXBlID0gIkJ1ZmZlckdlb21ldHJ5IiwgdGhpcy5pbmRleCA9IG51bGwsIHRoaXMuaW5kaXJlY3QgPSBudWxsLCB0aGlzLmF0dHJpYnV0ZXMgPSB7fSwgdGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fSwgdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9ICExLCB0aGlzLmdyb3VwcyA9IFtdLCB0aGlzLmJvdW5kaW5nQm94ID0gbnVsbCwgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGwsIHRoaXMuZHJhd1JhbmdlID0gewogICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgY291bnQ6IDEgLyAwCiAgICAgICAgfSwgdGhpcy51c2VyRGF0YSA9IHt9OwogICAgfQogICAgZ2V0SW5kZXgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7CiAgICB9CiAgICBzZXRJbmRleCh0KSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0aGlzLmluZGV4ID0gbmV3IChjdSh0KSA/IHhyIDogZ3IpKHQsIDEpIDogdGhpcy5pbmRleCA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRJbmRpcmVjdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaXJlY3QgPSB0LCB0aGlzOwogICAgfQogICAgZ2V0SW5kaXJlY3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaXJlY3Q7CiAgICB9CiAgICBnZXRBdHRyaWJ1dGUodCkgewogICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF07CiAgICB9CiAgICBzZXRBdHRyaWJ1dGUodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0gPSBlLCB0aGlzOwogICAgfQogICAgZGVsZXRlQXR0cmlidXRlKHQpIHsKICAgICAgICByZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XSwgdGhpczsKICAgIH0KICAgIGhhc0F0dHJpYnV0ZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XSAhPT0gdm9pZCAwOwogICAgfQogICAgYWRkR3JvdXAodCwgZSwgaSA9IDApIHsKICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKHsKICAgICAgICAgICAgc3RhcnQ6IHQsCiAgICAgICAgICAgIGNvdW50OiBlLAogICAgICAgICAgICBtYXRlcmlhbEluZGV4OiBpCiAgICAgICAgfSk7CiAgICB9CiAgICBjbGVhckdyb3VwcygpIHsKICAgICAgICB0aGlzLmdyb3VwcyA9IFtdOwogICAgfQogICAgc2V0RHJhd1JhbmdlKHQsIGUpIHsKICAgICAgICB0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHQsIHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gZTsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgICAgZSAhPT0gdm9pZCAwICYmIChlLmFwcGx5TWF0cml4NCh0KSwgZS5uZWVkc1VwZGF0ZSA9ICEwKTsKICAgICAgICBsZXQgaSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CiAgICAgICAgaWYgKGkgIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgbiA9IG5ldyBHdCgpLmdldE5vcm1hbE1hdHJpeCh0KTsKICAgICAgICAgICAgaS5hcHBseU5vcm1hbE1hdHJpeChuKSwgaS5uZWVkc1VwZGF0ZSA9ICEwOwogICAgICAgIH0KICAgICAgICBsZXQgcyA9IHRoaXMuYXR0cmlidXRlcy50YW5nZW50OwogICAgICAgIHJldHVybiBzICE9PSB2b2lkIDAgJiYgKHMudHJhbnNmb3JtRGlyZWN0aW9uKHQpLCBzLm5lZWRzVXBkYXRlID0gITApLCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICYmIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgJiYgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgdGhpczsKICAgIH0KICAgIGFwcGx5UXVhdGVybmlvbih0KSB7CiAgICAgICAgcmV0dXJuIEZ0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLCB0aGlzLmFwcGx5TWF0cml4NChGdCksIHRoaXM7CiAgICB9CiAgICByb3RhdGVYKHQpIHsKICAgICAgICByZXR1cm4gRnQubWFrZVJvdGF0aW9uWCh0KSwgdGhpcy5hcHBseU1hdHJpeDQoRnQpLCB0aGlzOwogICAgfQogICAgcm90YXRlWSh0KSB7CiAgICAgICAgcmV0dXJuIEZ0Lm1ha2VSb3RhdGlvblkodCksIHRoaXMuYXBwbHlNYXRyaXg0KEZ0KSwgdGhpczsKICAgIH0KICAgIHJvdGF0ZVoodCkgewogICAgICAgIHJldHVybiBGdC5tYWtlUm90YXRpb25aKHQpLCB0aGlzLmFwcGx5TWF0cml4NChGdCksIHRoaXM7CiAgICB9CiAgICB0cmFuc2xhdGUodCwgZSwgaSkgewogICAgICAgIHJldHVybiBGdC5tYWtlVHJhbnNsYXRpb24odCwgZSwgaSksIHRoaXMuYXBwbHlNYXRyaXg0KEZ0KSwgdGhpczsKICAgIH0KICAgIHNjYWxlKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gRnQubWFrZVNjYWxlKHQsIGUsIGkpLCB0aGlzLmFwcGx5TWF0cml4NChGdCksIHRoaXM7CiAgICB9CiAgICBsb29rQXQodCkgewogICAgICAgIHJldHVybiBabi5sb29rQXQodCksIFpuLnVwZGF0ZU1hdHJpeCgpLCB0aGlzLmFwcGx5TWF0cml4NChabi5tYXRyaXgpLCB0aGlzOwogICAgfQogICAgY2VudGVyKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLCB0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcih0aSkubmVnYXRlKCksIHRoaXMudHJhbnNsYXRlKHRpLngsIHRpLnksIHRpLnopLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVBvaW50cyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTsKICAgICAgICBpZiAoZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBpID0gW107CiAgICAgICAgICAgIGZvcihsZXQgcyA9IDAsIG4gPSB0Lmxlbmd0aDsgcyA8IG47IHMrKyl7CiAgICAgICAgICAgICAgICBsZXQgciA9IHRbc107CiAgICAgICAgICAgICAgICBpLnB1c2goci54LCByLnksIHIueiB8fCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShpLCAzKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IGkgPSBNYXRoLm1pbih0Lmxlbmd0aCwgZS5jb3VudCk7CiAgICAgICAgICAgIGZvcihsZXQgcyA9IDA7IHMgPCBpOyBzKyspewogICAgICAgICAgICAgICAgbGV0IG4gPSB0W3NdOwogICAgICAgICAgICAgICAgZS5zZXRYWVoocywgbi54LCBuLnksIG4ueiB8fCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0Lmxlbmd0aCA+IGUuY291bnQgJiYgY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4iKSwgZS5uZWVkc1VwZGF0ZSA9ICEwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ0JveCgpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nQm94ID0gbmV3IGZ0KTsKICAgICAgICBsZXQgdCA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbiwgZSA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIGlmICh0ICYmIHQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiIsIHRoaXMpLCB0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgdygtMSAvIDAsIC0xIC8gMCwgLTEgLyAwKSwgbmV3IHcoMSAvIDAsIDEgLyAwLCAxIC8gMCkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSwgZSkgZm9yKGxldCBpID0gMCwgcyA9IGUubGVuZ3RoOyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgICAgIGxldCBuID0gZVtpXTsKICAgICAgICAgICAgICAgIFN0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUobiksIHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAocnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbiwgU3QubWluKSwgdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KHJ0KSwgcnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCwgU3QubWF4KSwgdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KHJ0KSkgOiAodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFN0Lm1pbiksIHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChTdC5tYXgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwogICAgICAgIChpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KSB8fCBpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KSB8fCBpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkgJiYgY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzKTsKICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IGh0KTsKICAgICAgICBsZXQgdCA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbiwgZSA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIGlmICh0ICYmIHQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsIHRoaXMpLCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgdywgMSAvIDApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CiAgICAgICAgICAgIGlmIChTdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLCBlKSBmb3IobGV0IG4gPSAwLCByID0gZS5sZW5ndGg7IG4gPCByOyBuKyspewogICAgICAgICAgICAgICAgbGV0IG8gPSBlW25dOwogICAgICAgICAgICAgICAgSWkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShvKSwgdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA/IChydC5hZGRWZWN0b3JzKFN0Lm1pbiwgSWkubWluKSwgU3QuZXhwYW5kQnlQb2ludChydCksIHJ0LmFkZFZlY3RvcnMoU3QubWF4LCBJaS5tYXgpLCBTdC5leHBhbmRCeVBvaW50KHJ0KSkgOiAoU3QuZXhwYW5kQnlQb2ludChJaS5taW4pLCBTdC5leHBhbmRCeVBvaW50KElpLm1heCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFN0LmdldENlbnRlcihpKTsKICAgICAgICAgICAgbGV0IHMgPSAwOwogICAgICAgICAgICBmb3IobGV0IG4gPSAwLCByID0gdC5jb3VudDsgbiA8IHI7IG4rKylydC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsIG4pLCBzID0gTWF0aC5tYXgocywgaS5kaXN0YW5jZVRvU3F1YXJlZChydCkpOwogICAgICAgICAgICBpZiAoZSkgZm9yKGxldCBuID0gMCwgciA9IGUubGVuZ3RoOyBuIDwgcjsgbisrKXsKICAgICAgICAgICAgICAgIGxldCBvID0gZVtuXSwgYSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7CiAgICAgICAgICAgICAgICBmb3IobGV0IGwgPSAwLCBjID0gby5jb3VudDsgbCA8IGM7IGwrKylydC5mcm9tQnVmZmVyQXR0cmlidXRlKG8sIGwpLCBhICYmICh0aS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsIGwpLCBydC5hZGQodGkpKSwgcyA9IE1hdGgubWF4KHMsIGkuZGlzdGFuY2VUb1NxdWFyZWQocnQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydChzKSwgaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpICYmIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzKTsKICAgICAgICB9CiAgICB9CiAgICBjb21wdXRlVGFuZ2VudHMoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmluZGV4LCBlID0gdGhpcy5hdHRyaWJ1dGVzOwogICAgICAgIGlmICh0ID09PSBudWxsIHx8IGUucG9zaXRpb24gPT09IHZvaWQgMCB8fCBlLm5vcm1hbCA9PT0gdm9pZCAwIHx8IGUudXYgPT09IHZvaWQgMCkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgaSA9IGUucG9zaXRpb24sIHMgPSBlLm5vcm1hbCwgbiA9IGUudXY7CiAgICAgICAgdGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKSA9PT0gITEgJiYgdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLCBuZXcgWihuZXcgRmxvYXQzMkFycmF5KDQgKiBpLmNvdW50KSwgNCkpOwogICAgICAgIGxldCByID0gdGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSwgbyA9IFtdLCBhID0gW107CiAgICAgICAgZm9yKGxldCBBID0gMDsgQSA8IGkuY291bnQ7IEErKylvW0FdID0gbmV3IHcsIGFbQV0gPSBuZXcgdzsKICAgICAgICBsZXQgbCA9IG5ldyB3LCBjID0gbmV3IHcsIHUgPSBuZXcgdywgZCA9IG5ldyBULCBwID0gbmV3IFQsIGYgPSBuZXcgVCwgbSA9IG5ldyB3LCB5MSA9IG5ldyB3OwogICAgICAgIGZ1bmN0aW9uIGcoQSwgSSwgQykgewogICAgICAgICAgICBsLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSwgQSksIGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLCBJKSwgdS5mcm9tQnVmZmVyQXR0cmlidXRlKGksIEMpLCBkLmZyb21CdWZmZXJBdHRyaWJ1dGUobiwgQSksIHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLCBJKSwgZi5mcm9tQnVmZmVyQXR0cmlidXRlKG4sIEMpLCBjLnN1YihsKSwgdS5zdWIobCksIHAuc3ViKGQpLCBmLnN1YihkKTsKICAgICAgICAgICAgbGV0IGsgPSAxIC8gKHAueCAqIGYueSAtIGYueCAqIHAueSk7CiAgICAgICAgICAgIGlzRmluaXRlKGspICYmIChtLmNvcHkoYykubXVsdGlwbHlTY2FsYXIoZi55KS5hZGRTY2FsZWRWZWN0b3IodSwgLXAueSkubXVsdGlwbHlTY2FsYXIoayksIHkxLmNvcHkodSkubXVsdGlwbHlTY2FsYXIocC54KS5hZGRTY2FsZWRWZWN0b3IoYywgLWYueCkubXVsdGlwbHlTY2FsYXIoayksIG9bQV0uYWRkKG0pLCBvW0ldLmFkZChtKSwgb1tDXS5hZGQobSksIGFbQV0uYWRkKHkxKSwgYVtJXS5hZGQoeTEpLCBhW0NdLmFkZCh5MSkpOwogICAgICAgIH0KICAgICAgICBsZXQgeDEgPSB0aGlzLmdyb3VwczsKICAgICAgICB4MS5sZW5ndGggPT09IDAgJiYgKHgxID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICAgIGNvdW50OiB0LmNvdW50CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgICBmb3IobGV0IEEgPSAwLCBJID0geDEubGVuZ3RoOyBBIDwgSTsgKytBKXsKICAgICAgICAgICAgbGV0IEMgPSB4MVtBXSwgayA9IEMuc3RhcnQsIFUgPSBDLmNvdW50OwogICAgICAgICAgICBmb3IobGV0IFcgPSBrLCBIID0gayArIFU7IFcgPCBIOyBXICs9IDMpZyh0LmdldFgoVyArIDApLCB0LmdldFgoVyArIDEpLCB0LmdldFgoVyArIDIpKTsKICAgICAgICB9CiAgICAgICAgbGV0IGIgPSBuZXcgdywgTSA9IG5ldyB3LCBfID0gbmV3IHcsIHYgPSBuZXcgdzsKICAgICAgICBmdW5jdGlvbiBTKEEpIHsKICAgICAgICAgICAgXy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsIEEpLCB2LmNvcHkoXyk7CiAgICAgICAgICAgIGxldCBJID0gb1tBXTsKICAgICAgICAgICAgYi5jb3B5KEkpLCBiLnN1YihfLm11bHRpcGx5U2NhbGFyKF8uZG90KEkpKSkubm9ybWFsaXplKCksIE0uY3Jvc3NWZWN0b3JzKHYsIEkpOwogICAgICAgICAgICBsZXQgayA9IE0uZG90KGFbQV0pIDwgMCA/IC0xIDogMTsKICAgICAgICAgICAgci5zZXRYWVpXKEEsIGIueCwgYi55LCBiLnosIGspOwogICAgICAgIH0KICAgICAgICBmb3IobGV0IEEgPSAwLCBJID0geDEubGVuZ3RoOyBBIDwgSTsgKytBKXsKICAgICAgICAgICAgbGV0IEMgPSB4MVtBXSwgayA9IEMuc3RhcnQsIFUgPSBDLmNvdW50OwogICAgICAgICAgICBmb3IobGV0IFcgPSBrLCBIID0gayArIFU7IFcgPCBIOyBXICs9IDMpUyh0LmdldFgoVyArIDApKSwgUyh0LmdldFgoVyArIDEpKSwgUyh0LmdldFgoVyArIDIpKTsKICAgICAgICB9CiAgICB9CiAgICBjb21wdXRlVmVydGV4Tm9ybWFscygpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuaW5kZXgsIGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTsKICAgICAgICBpZiAoZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpOwogICAgICAgICAgICBpZiAoaSA9PT0gdm9pZCAwKSBpID0gbmV3IFoobmV3IEZsb2F0MzJBcnJheShlLmNvdW50ICogMyksIDMpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgaSk7CiAgICAgICAgICAgIGVsc2UgZm9yKGxldCBkID0gMCwgcCA9IGkuY291bnQ7IGQgPCBwOyBkKyspaS5zZXRYWVooZCwgMCwgMCwgMCk7CiAgICAgICAgICAgIGxldCBzID0gbmV3IHcsIG4gPSBuZXcgdywgciA9IG5ldyB3LCBvID0gbmV3IHcsIGEgPSBuZXcgdywgbCA9IG5ldyB3LCBjID0gbmV3IHcsIHUgPSBuZXcgdzsKICAgICAgICAgICAgaWYgKHQpIGZvcihsZXQgZCA9IDAsIHAgPSB0LmNvdW50OyBkIDwgcDsgZCArPSAzKXsKICAgICAgICAgICAgICAgIGxldCBmID0gdC5nZXRYKGQgKyAwKSwgbSA9IHQuZ2V0WChkICsgMSksIHkxID0gdC5nZXRYKGQgKyAyKTsKICAgICAgICAgICAgICAgIHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLCBmKSwgbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIG0pLCByLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSwgeTEpLCBjLnN1YlZlY3RvcnMociwgbiksIHUuc3ViVmVjdG9ycyhzLCBuKSwgYy5jcm9zcyh1KSwgby5mcm9tQnVmZmVyQXR0cmlidXRlKGksIGYpLCBhLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSwgbSksIGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLCB5MSksIG8uYWRkKGMpLCBhLmFkZChjKSwgbC5hZGQoYyksIGkuc2V0WFlaKGYsIG8ueCwgby55LCBvLnopLCBpLnNldFhZWihtLCBhLngsIGEueSwgYS56KSwgaS5zZXRYWVooeTEsIGwueCwgbC55LCBsLnopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgZm9yKGxldCBkID0gMCwgcCA9IGUuY291bnQ7IGQgPCBwOyBkICs9IDMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIGQgKyAwKSwgbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIGQgKyAxKSwgci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIGQgKyAyKSwgYy5zdWJWZWN0b3JzKHIsIG4pLCB1LnN1YlZlY3RvcnMocywgbiksIGMuY3Jvc3ModSksIGkuc2V0WFlaKGQgKyAwLCBjLngsIGMueSwgYy56KSwgaS5zZXRYWVooZCArIDEsIGMueCwgYy55LCBjLnopLCBpLnNldFhZWihkICsgMiwgYy54LCBjLnksIGMueik7CiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplTm9ybWFscygpLCBpLm5lZWRzVXBkYXRlID0gITA7CiAgICAgICAgfQogICAgfQogICAgbm9ybWFsaXplTm9ybWFscygpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CiAgICAgICAgZm9yKGxldCBlID0gMCwgaSA9IHQuY291bnQ7IGUgPCBpOyBlKyspcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LCBlKSwgcnQubm9ybWFsaXplKCksIHQuc2V0WFlaKGUsIHJ0LngsIHJ0LnksIHJ0LnopOwogICAgfQogICAgdG9Ob25JbmRleGVkKCkgewogICAgICAgIGZ1bmN0aW9uIHQobywgYSkgewogICAgICAgICAgICBsZXQgbCA9IG8uYXJyYXksIGMgPSBvLml0ZW1TaXplLCB1ID0gby5ub3JtYWxpemVkLCBkID0gbmV3IGwuY29uc3RydWN0b3IoYS5sZW5ndGggKiBjKSwgcCA9IDAsIGYgPSAwOwogICAgICAgICAgICBmb3IobGV0IG0gPSAwLCB5MSA9IGEubGVuZ3RoOyBtIDwgeTE7IG0rKyl7CiAgICAgICAgICAgICAgICBvLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPyBwID0gYVttXSAqIG8uZGF0YS5zdHJpZGUgKyBvLm9mZnNldCA6IHAgPSBhW21dICogYzsKICAgICAgICAgICAgICAgIGZvcihsZXQgZyA9IDA7IGcgPCBjOyBnKyspZFtmKytdID0gbFtwKytdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgWihkLCBjLCB1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IG51bGwpIHJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLCB0aGlzOwogICAgICAgIGxldCBlID0gbmV3IGgsIGkgPSB0aGlzLmluZGV4LmFycmF5LCBzID0gdGhpcy5hdHRyaWJ1dGVzOwogICAgICAgIGZvcihsZXQgbyBpbiBzKXsKICAgICAgICAgICAgbGV0IGEgPSBzW29dLCBsID0gdChhLCBpKTsKICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUobywgbCk7CiAgICAgICAgfQogICAgICAgIGxldCBuID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7CiAgICAgICAgZm9yKGxldCBvIGluIG4pewogICAgICAgICAgICBsZXQgYSA9IFtdLCBsID0gbltvXTsKICAgICAgICAgICAgZm9yKGxldCBjID0gMCwgdSA9IGwubGVuZ3RoOyBjIDwgdTsgYysrKXsKICAgICAgICAgICAgICAgIGxldCBkID0gbFtjXSwgcCA9IHQoZCwgaSk7CiAgICAgICAgICAgICAgICBhLnB1c2gocCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZS5tb3JwaEF0dHJpYnV0ZXNbb10gPSBhOwogICAgICAgIH0KICAgICAgICBlLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTsKICAgICAgICBsZXQgciA9IHRoaXMuZ3JvdXBzOwogICAgICAgIGZvcihsZXQgbyA9IDAsIGEgPSByLmxlbmd0aDsgbyA8IGE7IG8rKyl7CiAgICAgICAgICAgIGxldCBsID0gcltvXTsKICAgICAgICAgICAgZS5hZGRHcm91cChsLnN0YXJ0LCBsLmNvdW50LCBsLm1hdGVyaWFsSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHsKICAgICAgICAgICAgbWV0YWRhdGE6IHsKICAgICAgICAgICAgICAgIHZlcnNpb246IDQuNiwKICAgICAgICAgICAgICAgIHR5cGU6ICJCdWZmZXJHZW9tZXRyeSIsCiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICJCdWZmZXJHZW9tZXRyeS50b0pTT04iCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlmICh0LnV1aWQgPSB0aGlzLnV1aWQsIHQudHlwZSA9IHRoaXMudHlwZSwgdGhpcy5uYW1lICE9PSAiIiAmJiAodC5uYW1lID0gdGhpcy5uYW1lKSwgT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoID4gMCAmJiAodC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGEpLCB0aGlzLnBhcmFtZXRlcnMgIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgYSA9IHRoaXMucGFyYW1ldGVyczsKICAgICAgICAgICAgZm9yKGxldCBsIGluIGEpYVtsXSAhPT0gdm9pZCAwICYmICh0W2xdID0gYVtsXSk7CiAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgICAgICB0LmRhdGEgPSB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9CiAgICAgICAgfTsKICAgICAgICBsZXQgZSA9IHRoaXMuaW5kZXg7CiAgICAgICAgZSAhPT0gbnVsbCAmJiAodC5kYXRhLmluZGV4ID0gewogICAgICAgICAgICB0eXBlOiBlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsCiAgICAgICAgICAgIGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KQogICAgICAgIH0pOwogICAgICAgIGxldCBpID0gdGhpcy5hdHRyaWJ1dGVzOwogICAgICAgIGZvcihsZXQgYSBpbiBpKXsKICAgICAgICAgICAgbGV0IGwgPSBpW2FdOwogICAgICAgICAgICB0LmRhdGEuYXR0cmlidXRlc1thXSA9IGwudG9KU09OKHQuZGF0YSk7CiAgICAgICAgfQogICAgICAgIGxldCBzID0ge30sIG4gPSAhMTsKICAgICAgICBmb3IobGV0IGEgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpewogICAgICAgICAgICBsZXQgbCA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzW2FdLCBjID0gW107CiAgICAgICAgICAgIGZvcihsZXQgdSA9IDAsIGQgPSBsLmxlbmd0aDsgdSA8IGQ7IHUrKyl7CiAgICAgICAgICAgICAgICBsZXQgcCA9IGxbdV07CiAgICAgICAgICAgICAgICBjLnB1c2gocC50b0pTT04odC5kYXRhKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYy5sZW5ndGggPiAwICYmIChzW2FdID0gYywgbiA9ICEwKTsKICAgICAgICB9CiAgICAgICAgbiAmJiAodC5kYXRhLm1vcnBoQXR0cmlidXRlcyA9IHMsIHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUpOwogICAgICAgIGxldCByID0gdGhpcy5ncm91cHM7CiAgICAgICAgci5sZW5ndGggPiAwICYmICh0LmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyKSkpOwogICAgICAgIGxldCBvID0gdGhpcy5ib3VuZGluZ1NwaGVyZTsKICAgICAgICByZXR1cm4gbyAhPT0gbnVsbCAmJiAodC5kYXRhLmJvdW5kaW5nU3BoZXJlID0gewogICAgICAgICAgICBjZW50ZXI6IG8uY2VudGVyLnRvQXJyYXkoKSwKICAgICAgICAgICAgcmFkaXVzOiBvLnJhZGl1cwogICAgICAgIH0pLCB0OwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHRoaXMuaW5kZXggPSBudWxsLCB0aGlzLmF0dHJpYnV0ZXMgPSB7fSwgdGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fSwgdGhpcy5ncm91cHMgPSBbXSwgdGhpcy5ib3VuZGluZ0JveCA9IG51bGwsIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgICAgIGxldCBlID0ge307CiAgICAgICAgdGhpcy5uYW1lID0gdC5uYW1lOwogICAgICAgIGxldCBpID0gdC5pbmRleDsKICAgICAgICBpICE9PSBudWxsICYmIHRoaXMuc2V0SW5kZXgoaS5jbG9uZShlKSk7CiAgICAgICAgbGV0IHMgPSB0LmF0dHJpYnV0ZXM7CiAgICAgICAgZm9yKGxldCBsIGluIHMpewogICAgICAgICAgICBsZXQgYyA9IHNbbF07CiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGwsIGMuY2xvbmUoZSkpOwogICAgICAgIH0KICAgICAgICBsZXQgbiA9IHQubW9ycGhBdHRyaWJ1dGVzOwogICAgICAgIGZvcihsZXQgbCBpbiBuKXsKICAgICAgICAgICAgbGV0IGMgPSBbXSwgdSA9IG5bbF07CiAgICAgICAgICAgIGZvcihsZXQgZCA9IDAsIHAgPSB1Lmxlbmd0aDsgZCA8IHA7IGQrKyljLnB1c2godVtkXS5jbG9uZShlKSk7CiAgICAgICAgICAgIHRoaXMubW9ycGhBdHRyaWJ1dGVzW2xdID0gYzsKICAgICAgICB9CiAgICAgICAgdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHQubW9ycGhUYXJnZXRzUmVsYXRpdmU7CiAgICAgICAgbGV0IHIgPSB0Lmdyb3VwczsKICAgICAgICBmb3IobGV0IGwgPSAwLCBjID0gci5sZW5ndGg7IGwgPCBjOyBsKyspewogICAgICAgICAgICBsZXQgdSA9IHJbbF07CiAgICAgICAgICAgIHRoaXMuYWRkR3JvdXAodS5zdGFydCwgdS5jb3VudCwgdS5tYXRlcmlhbEluZGV4KTsKICAgICAgICB9CiAgICAgICAgbGV0IG8gPSB0LmJvdW5kaW5nQm94OwogICAgICAgIG8gIT09IG51bGwgJiYgKHRoaXMuYm91bmRpbmdCb3ggPSBvLmNsb25lKCkpOwogICAgICAgIGxldCBhID0gdC5ib3VuZGluZ1NwaGVyZTsKICAgICAgICByZXR1cm4gYSAhPT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ1NwaGVyZSA9IGEuY2xvbmUoKSksIHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gdC5kcmF3UmFuZ2Uuc3RhcnQsIHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gdC5kcmF3UmFuZ2UuY291bnQsIHRoaXMudXNlckRhdGEgPSB0LnVzZXJEYXRhLCB0aGlzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAiZGlzcG9zZSIKICAgICAgICB9KTsKICAgIH0KfSwgRWEgPSBuZXcgRCwgQ2UgPSBuZXcgTGUsIGRzID0gbmV3IGh0LCBSYSA9IG5ldyB3LCBwcyA9IG5ldyB3LCBmcyA9IG5ldyB3LCBtcyA9IG5ldyB3LCBZbiA9IG5ldyB3LCB5cyA9IG5ldyB3LCBrYSA9IG5ldyB3LCBncyA9IG5ldyB3LCBDdCA9IGNsYXNzIGV4dGVuZHMgRyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IEwsIGUgPSBuZXcgX2UpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNNZXNoID0gITAsIHRoaXMudHlwZSA9ICJNZXNoIiwgdGhpcy5nZW9tZXRyeSA9IHQsIHRoaXMubWF0ZXJpYWwgPSBlLCB0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpOwogICAgfQogICAgY29weSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCwgZSksIHQubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB2b2lkIDAgJiYgKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksIHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICE9PSB2b2lkIDAgJiYgKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdC5tb3JwaFRhcmdldERpY3Rpb25hcnkpKSwgdGhpcy5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCkgPyB0Lm1hdGVyaWFsLnNsaWNlKCkgOiB0Lm1hdGVyaWFsLCB0aGlzLmdlb21ldHJ5ID0gdC5nZW9tZXRyeSwgdGhpczsKICAgIH0KICAgIHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLCBpID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgaWYgKGkubGVuZ3RoID4gMCkgewogICAgICAgICAgICBsZXQgcyA9IGVbaVswXV07CiAgICAgICAgICAgIGlmIChzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW10sIHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307CiAgICAgICAgICAgICAgICBmb3IobGV0IG4gPSAwLCByID0gcy5sZW5ndGg7IG4gPCByOyBuKyspewogICAgICAgICAgICAgICAgICAgIGxldCBvID0gc1tuXS5uYW1lIHx8IFN0cmluZyhuKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLCB0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtvXSA9IG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBnZXRWZXJ0ZXhQb3NpdGlvbih0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmdlb21ldHJ5LCBzID0gaS5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBuID0gaS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sIHIgPSBpLm1vcnBoVGFyZ2V0c1JlbGF0aXZlOwogICAgICAgIGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLCB0KTsKICAgICAgICBsZXQgbyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzOwogICAgICAgIGlmIChuICYmIG8pIHsKICAgICAgICAgICAgeXMuc2V0KDAsIDAsIDApOwogICAgICAgICAgICBmb3IobGV0IGEgPSAwLCBsID0gbi5sZW5ndGg7IGEgPCBsOyBhKyspewogICAgICAgICAgICAgICAgbGV0IGMgPSBvW2FdLCB1ID0gblthXTsKICAgICAgICAgICAgICAgIGMgIT09IDAgJiYgKFluLmZyb21CdWZmZXJBdHRyaWJ1dGUodSwgdCksIHIgPyB5cy5hZGRTY2FsZWRWZWN0b3IoWW4sIGMpIDogeXMuYWRkU2NhbGVkVmVjdG9yKFluLnN1YihlKSwgYykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGUuYWRkKHlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICByYXljYXN0KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuZ2VvbWV0cnksIHMgPSB0aGlzLm1hdGVyaWFsLCBuID0gdGhpcy5tYXRyaXhXb3JsZDsKICAgICAgICBzICE9PSB2b2lkIDAgJiYgKGkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgJiYgaS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgZHMuY29weShpLmJvdW5kaW5nU3BoZXJlKSwgZHMuYXBwbHlNYXRyaXg0KG4pLCBDZS5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwgIShkcy5jb250YWluc1BvaW50KENlLm9yaWdpbikgPT09ICExICYmIChDZS5pbnRlcnNlY3RTcGhlcmUoZHMsIFJhKSA9PT0gbnVsbCB8fCBDZS5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoUmEpID4gKHQuZmFyIC0gdC5uZWFyKSAqKiAyKSkgJiYgKEVhLmNvcHkobikuaW52ZXJ0KCksIENlLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChFYSksICEoaS5ib3VuZGluZ0JveCAhPT0gbnVsbCAmJiBDZS5pbnRlcnNlY3RzQm94KGkuYm91bmRpbmdCb3gpID09PSAhMSkgJiYgdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCwgZSwgQ2UpKSk7CiAgICB9CiAgICBfY29tcHV0ZUludGVyc2VjdGlvbnModCwgZSwgaSkgewogICAgICAgIGxldCBzLCBuID0gdGhpcy5nZW9tZXRyeSwgciA9IHRoaXMubWF0ZXJpYWwsIG8gPSBuLmluZGV4LCBhID0gbi5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBsID0gbi5hdHRyaWJ1dGVzLnV2LCBjID0gbi5hdHRyaWJ1dGVzLnV2MSwgdSA9IG4uYXR0cmlidXRlcy5ub3JtYWwsIGQgPSBuLmdyb3VwcywgcCA9IG4uZHJhd1JhbmdlOwogICAgICAgIGlmIChvICE9PSBudWxsKSBpZiAoQXJyYXkuaXNBcnJheShyKSkgZm9yKGxldCBmID0gMCwgbSA9IGQubGVuZ3RoOyBmIDwgbTsgZisrKXsKICAgICAgICAgICAgbGV0IHkxID0gZFtmXSwgZyA9IHJbeTEubWF0ZXJpYWxJbmRleF0sIHgxID0gTWF0aC5tYXgoeTEuc3RhcnQsIHAuc3RhcnQpLCBiID0gTWF0aC5taW4oby5jb3VudCwgTWF0aC5taW4oeTEuc3RhcnQgKyB5MS5jb3VudCwgcC5zdGFydCArIHAuY291bnQpKTsKICAgICAgICAgICAgZm9yKGxldCBNID0geDEsIF8gPSBiOyBNIDwgXzsgTSArPSAzKXsKICAgICAgICAgICAgICAgIGxldCB2ID0gby5nZXRYKE0pLCBTID0gby5nZXRYKE0gKyAxKSwgQSA9IG8uZ2V0WChNICsgMik7CiAgICAgICAgICAgICAgICBzID0geHModGhpcywgZywgdCwgaSwgbCwgYywgdSwgdiwgUywgQSksIHMgJiYgKHMuZmFjZUluZGV4ID0gTWF0aC5mbG9vcihNIC8gMyksIHMuZmFjZS5tYXRlcmlhbEluZGV4ID0geTEubWF0ZXJpYWxJbmRleCwgZS5wdXNoKHMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGV0IGYgPSBNYXRoLm1heCgwLCBwLnN0YXJ0KSwgbSA9IE1hdGgubWluKG8uY291bnQsIHAuc3RhcnQgKyBwLmNvdW50KTsKICAgICAgICAgICAgZm9yKGxldCB5MSA9IGYsIGcgPSBtOyB5MSA8IGc7IHkxICs9IDMpewogICAgICAgICAgICAgICAgbGV0IHgxID0gby5nZXRYKHkxKSwgYiA9IG8uZ2V0WCh5MSArIDEpLCBNID0gby5nZXRYKHkxICsgMik7CiAgICAgICAgICAgICAgICBzID0geHModGhpcywgciwgdCwgaSwgbCwgYywgdSwgeDEsIGIsIE0pLCBzICYmIChzLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoeTEgLyAzKSwgZS5wdXNoKHMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhICE9PSB2b2lkIDApIGlmIChBcnJheS5pc0FycmF5KHIpKSBmb3IobGV0IGYgPSAwLCBtID0gZC5sZW5ndGg7IGYgPCBtOyBmKyspewogICAgICAgICAgICBsZXQgeTEgPSBkW2ZdLCBnID0gclt5MS5tYXRlcmlhbEluZGV4XSwgeDEgPSBNYXRoLm1heCh5MS5zdGFydCwgcC5zdGFydCksIGIgPSBNYXRoLm1pbihhLmNvdW50LCBNYXRoLm1pbih5MS5zdGFydCArIHkxLmNvdW50LCBwLnN0YXJ0ICsgcC5jb3VudCkpOwogICAgICAgICAgICBmb3IobGV0IE0gPSB4MSwgXyA9IGI7IE0gPCBfOyBNICs9IDMpewogICAgICAgICAgICAgICAgbGV0IHYgPSBNLCBTID0gTSArIDEsIEEgPSBNICsgMjsKICAgICAgICAgICAgICAgIHMgPSB4cyh0aGlzLCBnLCB0LCBpLCBsLCBjLCB1LCB2LCBTLCBBKSwgcyAmJiAocy5mYWNlSW5kZXggPSBNYXRoLmZsb29yKE0gLyAzKSwgcy5mYWNlLm1hdGVyaWFsSW5kZXggPSB5MS5tYXRlcmlhbEluZGV4LCBlLnB1c2gocykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgZiA9IE1hdGgubWF4KDAsIHAuc3RhcnQpLCBtID0gTWF0aC5taW4oYS5jb3VudCwgcC5zdGFydCArIHAuY291bnQpOwogICAgICAgICAgICBmb3IobGV0IHkxID0gZiwgZyA9IG07IHkxIDwgZzsgeTEgKz0gMyl7CiAgICAgICAgICAgICAgICBsZXQgeDEgPSB5MSwgYiA9IHkxICsgMSwgTSA9IHkxICsgMjsKICAgICAgICAgICAgICAgIHMgPSB4cyh0aGlzLCByLCB0LCBpLCBsLCBjLCB1LCB4MSwgYiwgTSksIHMgJiYgKHMuZmFjZUluZGV4ID0gTWF0aC5mbG9vcih5MSAvIDMpLCBlLnB1c2gocykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwpmdW5jdGlvbiBUdShoLCB0LCBlLCBpLCBzLCBuLCByLCBvKSB7CiAgICBsZXQgYTsKICAgIGlmICh0LnNpZGUgPT09IEFsID8gYSA9IGkuaW50ZXJzZWN0VHJpYW5nbGUociwgbiwgcywgITAsIG8pIDogYSA9IGkuaW50ZXJzZWN0VHJpYW5nbGUocywgbiwgciwgdC5zaWRlID09PSBkciwgbyksIGEgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgZ3MuY29weShvKSwgZ3MuYXBwbHlNYXRyaXg0KGgubWF0cml4V29ybGQpOwogICAgbGV0IGwgPSBlLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhncyk7CiAgICByZXR1cm4gbCA8IGUubmVhciB8fCBsID4gZS5mYXIgPyBudWxsIDogewogICAgICAgIGRpc3RhbmNlOiBsLAogICAgICAgIHBvaW50OiBncy5jbG9uZSgpLAogICAgICAgIG9iamVjdDogaAogICAgfTsKfQpmdW5jdGlvbiB4cyhoLCB0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKSB7CiAgICBoLmdldFZlcnRleFBvc2l0aW9uKG8sIHBzKSwgaC5nZXRWZXJ0ZXhQb3NpdGlvbihhLCBmcyksIGguZ2V0VmVydGV4UG9zaXRpb24obCwgbXMpOwogICAgbGV0IGMgPSBUdShoLCB0LCBlLCBpLCBwcywgZnMsIG1zLCBrYSk7CiAgICBpZiAoYykgewogICAgICAgIGxldCB1ID0gbmV3IHc7CiAgICAgICAgbmUuZ2V0QmFyeWNvb3JkKGthLCBwcywgZnMsIG1zLCB1KSwgcyAmJiAoYy51diA9IG5lLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShzLCBvLCBhLCBsLCB1LCBuZXcgVCkpLCBuICYmIChjLnV2MSA9IG5lLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShuLCBvLCBhLCBsLCB1LCBuZXcgVCkpLCByICYmIChjLm5vcm1hbCA9IG5lLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLCBvLCBhLCBsLCB1LCBuZXcgdyksIGMubm9ybWFsLmRvdChpLmRpcmVjdGlvbikgPiAwICYmIGMubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7CiAgICAgICAgbGV0IGQgPSB7CiAgICAgICAgICAgIGE6IG8sCiAgICAgICAgICAgIGI6IGEsCiAgICAgICAgICAgIGM6IGwsCiAgICAgICAgICAgIG5vcm1hbDogbmV3IHcsCiAgICAgICAgICAgIG1hdGVyaWFsSW5kZXg6IDAKICAgICAgICB9OwogICAgICAgIG5lLmdldE5vcm1hbChwcywgZnMsIG1zLCBkLm5vcm1hbCksIGMuZmFjZSA9IGQsIGMuYmFyeWNvb3JkID0gdTsKICAgIH0KICAgIHJldHVybiBjOwp9CnZhciBLcyA9IGNsYXNzIGggZXh0ZW5kcyBMIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMSwgaSA9IDEsIHMgPSAxLCBuID0gMSwgciA9IDEpewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJCb3hHZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgIGhlaWdodDogZSwKICAgICAgICAgICAgZGVwdGg6IGksCiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHMsCiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBuLAogICAgICAgICAgICBkZXB0aFNlZ21lbnRzOiByCiAgICAgICAgfTsKICAgICAgICBsZXQgbyA9IHRoaXM7CiAgICAgICAgcyA9IE1hdGguZmxvb3IocyksIG4gPSBNYXRoLmZsb29yKG4pLCByID0gTWF0aC5mbG9vcihyKTsKICAgICAgICBsZXQgYSA9IFtdLCBsID0gW10sIGMgPSBbXSwgdSA9IFtdLCBkID0gMCwgcCA9IDA7CiAgICAgICAgZigieiIsICJ5IiwgIngiLCAtMSwgLTEsIGksIGUsIHQsIHIsIG4sIDApLCBmKCJ6IiwgInkiLCAieCIsIDEsIC0xLCBpLCBlLCAtdCwgciwgbiwgMSksIGYoIngiLCAieiIsICJ5IiwgMSwgMSwgdCwgaSwgZSwgcywgciwgMiksIGYoIngiLCAieiIsICJ5IiwgMSwgLTEsIHQsIGksIC1lLCBzLCByLCAzKSwgZigieCIsICJ5IiwgInoiLCAxLCAtMSwgdCwgZSwgaSwgcywgbiwgNCksIGYoIngiLCAieSIsICJ6IiwgLTEsIC0xLCB0LCBlLCAtaSwgcywgbiwgNSksIHRoaXMuc2V0SW5kZXgoYSksIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKGwsIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBFKGMsIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEUodSwgMikpOwogICAgICAgIGZ1bmN0aW9uIGYobSwgeTEsIGcsIHgxLCBiLCBNLCBfLCB2LCBTLCBBLCBJKSB7CiAgICAgICAgICAgIGxldCBDID0gTSAvIFMsIGsgPSBfIC8gQSwgVSA9IE0gLyAyLCBXID0gXyAvIDIsIEggPSB2IC8gMiwgWSA9IFMgKyAxLCBRID0gQSArIDEsIHp0ID0gMCwgUHQgPSAwLCBqID0gbmV3IHc7CiAgICAgICAgICAgIGZvcihsZXQgc3QgPSAwOyBzdCA8IFE7IHN0KyspewogICAgICAgICAgICAgICAgbGV0IEsgPSBzdCAqIGsgLSBXOwogICAgICAgICAgICAgICAgZm9yKGxldCBPdCA9IDA7IE90IDwgWTsgT3QrKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IFNlID0gT3QgKiBDIC0gVTsKICAgICAgICAgICAgICAgICAgICBqW21dID0gU2UgKiB4MSwgalt5MV0gPSBLICogYiwgaltnXSA9IEgsIGwucHVzaChqLngsIGoueSwgai56KSwgalttXSA9IDAsIGpbeTFdID0gMCwgaltnXSA9IHYgPiAwID8gMSA6IC0xLCBjLnB1c2goai54LCBqLnksIGoueiksIHUucHVzaChPdCAvIFMpLCB1LnB1c2goMSAtIHN0IC8gQSksIHp0ICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCBzdCA9IDA7IHN0IDwgQTsgc3QrKylmb3IobGV0IEsgPSAwOyBLIDwgUzsgSysrKXsKICAgICAgICAgICAgICAgIGxldCBPdCA9IGQgKyBLICsgWSAqIHN0LCBTZSA9IGQgKyBLICsgWSAqIChzdCArIDEpLCBUbiA9IGQgKyAoSyArIDEpICsgWSAqIChzdCArIDEpLCBlcyA9IGQgKyAoSyArIDEpICsgWSAqIHN0OwogICAgICAgICAgICAgICAgYS5wdXNoKE90LCBTZSwgZXMpLCBhLnB1c2goU2UsIFRuLCBlcyksIFB0ICs9IDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgby5hZGRHcm91cChwLCBQdCwgSSksIHAgKz0gUHQsIGQgKz0genQ7CiAgICAgICAgfQogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHQucGFyYW1ldGVycyksIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LndpZHRoLCB0LmhlaWdodCwgdC5kZXB0aCwgdC53aWR0aFNlZ21lbnRzLCB0LmhlaWdodFNlZ21lbnRzLCB0LmRlcHRoU2VnbWVudHMpOwogICAgfQp9OwpmdW5jdGlvbiBBbihoKSB7CiAgICBsZXQgdCA9IHt9OwogICAgZm9yKGxldCBlIGluIGgpewogICAgICAgIHRbZV0gPSB7fTsKICAgICAgICBmb3IobGV0IGkgaW4gaFtlXSl7CiAgICAgICAgICAgIGxldCBzID0gaFtlXVtpXTsKICAgICAgICAgICAgcyAmJiAocy5pc0NvbG9yIHx8IHMuaXNNYXRyaXgzIHx8IHMuaXNNYXRyaXg0IHx8IHMuaXNWZWN0b3IyIHx8IHMuaXNWZWN0b3IzIHx8IHMuaXNWZWN0b3I0IHx8IHMuaXNUZXh0dXJlIHx8IHMuaXNRdWF0ZXJuaW9uKSA/IHMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID8gKGNvbnNvbGUud2FybigiVW5pZm9ybXNVdGlsczogVGV4dHVyZXMgb2YgcmVuZGVyIHRhcmdldHMgY2Fubm90IGJlIGNsb25lZCB2aWEgY2xvbmVVbmlmb3JtcygpIG9yIG1lcmdlVW5pZm9ybXMoKS4iKSwgdFtlXVtpXSA9IG51bGwpIDogdFtlXVtpXSA9IHMuY2xvbmUoKSA6IEFycmF5LmlzQXJyYXkocykgPyB0W2VdW2ldID0gcy5zbGljZSgpIDogdFtlXVtpXSA9IHM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gSXUoaCkgewogICAgbGV0IHQgPSB7fTsKICAgIGZvcihsZXQgZSA9IDA7IGUgPCBoLmxlbmd0aDsgZSsrKXsKICAgICAgICBsZXQgaSA9IEFuKGhbZV0pOwogICAgICAgIGZvcihsZXQgcyBpbiBpKXRbc10gPSBpW3NdOwogICAgfQogICAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gQ3UoaCkgewogICAgbGV0IHQgPSBbXTsKICAgIGZvcihsZXQgZSA9IDA7IGUgPCBoLmxlbmd0aDsgZSsrKXQucHVzaChoW2VdLmNsb25lKCkpOwogICAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gUmYoaCkgewogICAgbGV0IHQgPSBoLmdldFJlbmRlclRhcmdldCgpOwogICAgcmV0dXJuIHQgPT09IG51bGwgPyBoLm91dHB1dENvbG9yU3BhY2UgOiB0LmlzWFJSZW5kZXJUYXJnZXQgPT09ICEwID8gdC50ZXh0dXJlLmNvbG9yU3BhY2UgOiBUdC53b3JraW5nQ29sb3JTcGFjZTsKfQp2YXIga2YgPSB7CiAgICBjbG9uZTogQW4sCiAgICBtZXJnZTogSXUKfSwgenUgPSBgdm9pZCBtYWluKCkgewoJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCwgRnUgPSBgdm9pZCBtYWluKCkgewoJZ2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7Cn1gLCBxaSA9IGNsYXNzIGV4dGVuZHMgY3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1NoYWRlck1hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJTaGFkZXJNYXRlcmlhbCIsIHRoaXMuZGVmaW5lcyA9IHt9LCB0aGlzLnVuaWZvcm1zID0ge30sIHRoaXMudW5pZm9ybXNHcm91cHMgPSBbXSwgdGhpcy52ZXJ0ZXhTaGFkZXIgPSB6dSwgdGhpcy5mcmFnbWVudFNoYWRlciA9IEZ1LCB0aGlzLmxpbmV3aWR0aCA9IDEsIHRoaXMud2lyZWZyYW1lID0gITEsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMSwgdGhpcy5mb2cgPSAhMSwgdGhpcy5saWdodHMgPSAhMSwgdGhpcy5jbGlwcGluZyA9ICExLCB0aGlzLmZvcmNlU2luZ2xlUGFzcyA9ICEwLCB0aGlzLmV4dGVuc2lvbnMgPSB7CiAgICAgICAgICAgIGNsaXBDdWxsRGlzdGFuY2U6ICExLAogICAgICAgICAgICBtdWx0aURyYXc6ICExCiAgICAgICAgfSwgdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gewogICAgICAgICAgICBjb2xvcjogWwogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHV2OiBbCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMAogICAgICAgICAgICBdLAogICAgICAgICAgICB1djE6IFsKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgIF0KICAgICAgICB9LCB0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB2b2lkIDAsIHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gITEsIHRoaXMuZ2xzbFZlcnNpb24gPSBudWxsLCB0ICE9PSB2b2lkIDAgJiYgdGhpcy5zZXRWYWx1ZXModCk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5mcmFnbWVudFNoYWRlciA9IHQuZnJhZ21lbnRTaGFkZXIsIHRoaXMudmVydGV4U2hhZGVyID0gdC52ZXJ0ZXhTaGFkZXIsIHRoaXMudW5pZm9ybXMgPSBBbih0LnVuaWZvcm1zKSwgdGhpcy51bmlmb3Jtc0dyb3VwcyA9IEN1KHQudW5pZm9ybXNHcm91cHMpLCB0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0LmRlZmluZXMpLCB0aGlzLndpcmVmcmFtZSA9IHQud2lyZWZyYW1lLCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHQud2lyZWZyYW1lTGluZXdpZHRoLCB0aGlzLmZvZyA9IHQuZm9nLCB0aGlzLmxpZ2h0cyA9IHQubGlnaHRzLCB0aGlzLmNsaXBwaW5nID0gdC5jbGlwcGluZywgdGhpcy5leHRlbnNpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdC5leHRlbnNpb25zKSwgdGhpcy5nbHNsVmVyc2lvbiA9IHQuZ2xzbFZlcnNpb24sIHRoaXM7CiAgICB9CiAgICB0b0pTT04odCkgewogICAgICAgIGxldCBlID0gc3VwZXIudG9KU09OKHQpOwogICAgICAgIGUuZ2xzbFZlcnNpb24gPSB0aGlzLmdsc2xWZXJzaW9uLCBlLnVuaWZvcm1zID0ge307CiAgICAgICAgZm9yKGxldCBzIGluIHRoaXMudW5pZm9ybXMpewogICAgICAgICAgICBsZXQgciA9IHRoaXMudW5pZm9ybXNbc10udmFsdWU7CiAgICAgICAgICAgIHIgJiYgci5pc1RleHR1cmUgPyBlLnVuaWZvcm1zW3NdID0gewogICAgICAgICAgICAgICAgdHlwZTogInQiLAogICAgICAgICAgICAgICAgdmFsdWU6IHIudG9KU09OKHQpLnV1aWQKICAgICAgICAgICAgfSA6IHIgJiYgci5pc0NvbG9yID8gZS51bmlmb3Jtc1tzXSA9IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjIiwKICAgICAgICAgICAgICAgIHZhbHVlOiByLmdldEhleCgpCiAgICAgICAgICAgIH0gOiByICYmIHIuaXNWZWN0b3IyID8gZS51bmlmb3Jtc1tzXSA9IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJ2MiIsCiAgICAgICAgICAgICAgICB2YWx1ZTogci50b0FycmF5KCkKICAgICAgICAgICAgfSA6IHIgJiYgci5pc1ZlY3RvcjMgPyBlLnVuaWZvcm1zW3NdID0gewogICAgICAgICAgICAgICAgdHlwZTogInYzIiwKICAgICAgICAgICAgICAgIHZhbHVlOiByLnRvQXJyYXkoKQogICAgICAgICAgICB9IDogciAmJiByLmlzVmVjdG9yNCA/IGUudW5pZm9ybXNbc10gPSB7CiAgICAgICAgICAgICAgICB0eXBlOiAidjQiLAogICAgICAgICAgICAgICAgdmFsdWU6IHIudG9BcnJheSgpCiAgICAgICAgICAgIH0gOiByICYmIHIuaXNNYXRyaXgzID8gZS51bmlmb3Jtc1tzXSA9IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJtMyIsCiAgICAgICAgICAgICAgICB2YWx1ZTogci50b0FycmF5KCkKICAgICAgICAgICAgfSA6IHIgJiYgci5pc01hdHJpeDQgPyBlLnVuaWZvcm1zW3NdID0gewogICAgICAgICAgICAgICAgdHlwZTogIm00IiwKICAgICAgICAgICAgICAgIHZhbHVlOiByLnRvQXJyYXkoKQogICAgICAgICAgICB9IDogZS51bmlmb3Jtc1tzXSA9IHsKICAgICAgICAgICAgICAgIHZhbHVlOiByCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoID4gMCAmJiAoZS5kZWZpbmVzID0gdGhpcy5kZWZpbmVzKSwgZS52ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlciwgZS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXIsIGUubGlnaHRzID0gdGhpcy5saWdodHMsIGUuY2xpcHBpbmcgPSB0aGlzLmNsaXBwaW5nOwogICAgICAgIGxldCBpID0ge307CiAgICAgICAgZm9yKGxldCBzIGluIHRoaXMuZXh0ZW5zaW9ucyl0aGlzLmV4dGVuc2lvbnNbc10gPT09ICEwICYmIChpW3NdID0gITApOwogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpKS5sZW5ndGggPiAwICYmIChlLmV4dGVuc2lvbnMgPSBpKSwgZTsKICAgIH0KfSwgR2kgPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzQ2FtZXJhID0gITAsIHRoaXMudHlwZSA9ICJDYW1lcmEiLCB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBELCB0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgRCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSA9IG5ldyBELCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSBvZTsKICAgIH0KICAgIGNvcHkodCwgZSkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsIGUpLCB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGRJbnZlcnNlKSwgdGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkodC5wcm9qZWN0aW9uTWF0cml4KSwgdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSB0LmNvb3JkaW5hdGVTeXN0ZW0sIHRoaXM7CiAgICB9CiAgICBnZXRXb3JsZERpcmVjdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdvcmxkRGlyZWN0aW9uKHQpLm5lZ2F0ZSgpOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQodCkgewogICAgICAgIHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLCB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpOwogICAgfQogICAgdXBkYXRlV29ybGRNYXRyaXgodCwgZSkgewogICAgICAgIHN1cGVyLnVwZGF0ZVdvcmxkTWF0cml4KHQsIGUpLCB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KfSwgeWUgPSBuZXcgdywgUGEgPSBuZXcgVCwgT2EgPSBuZXcgVCwgdnQgPSBjbGFzcyBleHRlbmRzIEdpIHsKICAgIGNvbnN0cnVjdG9yKHQgPSA1MCwgZSA9IDEsIGkgPSAuMSwgcyA9IDJlMyl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhID0gITAsIHRoaXMudHlwZSA9ICJQZXJzcGVjdGl2ZUNhbWVyYSIsIHRoaXMuZm92ID0gdCwgdGhpcy56b29tID0gMSwgdGhpcy5uZWFyID0gaSwgdGhpcy5mYXIgPSBzLCB0aGlzLmZvY3VzID0gMTAsIHRoaXMuYXNwZWN0ID0gZSwgdGhpcy52aWV3ID0gbnVsbCwgdGhpcy5maWxtR2F1Z2UgPSAzNSwgdGhpcy5maWxtT2Zmc2V0ID0gMCwgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdGhpcy5mb3YgPSB0LmZvdiwgdGhpcy56b29tID0gdC56b29tLCB0aGlzLm5lYXIgPSB0Lm5lYXIsIHRoaXMuZmFyID0gdC5mYXIsIHRoaXMuZm9jdXMgPSB0LmZvY3VzLCB0aGlzLmFzcGVjdCA9IHQuYXNwZWN0LCB0aGlzLnZpZXcgPSB0LnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbih7fSwgdC52aWV3KSwgdGhpcy5maWxtR2F1Z2UgPSB0LmZpbG1HYXVnZSwgdGhpcy5maWxtT2Zmc2V0ID0gdC5maWxtT2Zmc2V0LCB0aGlzOwogICAgfQogICAgc2V0Rm9jYWxMZW5ndGgodCkgewogICAgICAgIGxldCBlID0gLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHQ7CiAgICAgICAgdGhpcy5mb3YgPSBVaSAqIDIgKiBNYXRoLmF0YW4oZSksIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogICAgZ2V0Rm9jYWxMZW5ndGgoKSB7CiAgICAgICAgbGV0IHQgPSBNYXRoLnRhbihEZSAqIC41ICogdGhpcy5mb3YpOwogICAgICAgIHJldHVybiAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdDsKICAgIH0KICAgIGdldEVmZmVjdGl2ZUZPVigpIHsKICAgICAgICByZXR1cm4gVWkgKiAyICogTWF0aC5hdGFuKE1hdGgudGFuKERlICogLjUgKiB0aGlzLmZvdikgLyB0aGlzLnpvb20pOwogICAgfQogICAgZ2V0RmlsbVdpZHRoKCkgewogICAgICAgIHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKHRoaXMuYXNwZWN0LCAxKTsKICAgIH0KICAgIGdldEZpbG1IZWlnaHQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgodGhpcy5hc3BlY3QsIDEpOwogICAgfQogICAgZ2V0Vmlld0JvdW5kcyh0LCBlLCBpKSB7CiAgICAgICAgeWUuc2V0KC0xLCAtMSwgLjUpLmFwcGx5TWF0cml4NCh0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSwgZS5zZXQoeWUueCwgeWUueSkubXVsdGlwbHlTY2FsYXIoLXQgLyB5ZS56KSwgeWUuc2V0KDEsIDEsIC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksIGkuc2V0KHllLngsIHllLnkpLm11bHRpcGx5U2NhbGFyKC10IC8geWUueik7CiAgICB9CiAgICBnZXRWaWV3U2l6ZSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0JvdW5kcyh0LCBQYSwgT2EpLCBlLnN1YlZlY3RvcnMoT2EsIFBhKTsKICAgIH0KICAgIHNldFZpZXdPZmZzZXQodCwgZSwgaSwgcywgbiwgcikgewogICAgICAgIHRoaXMuYXNwZWN0ID0gdCAvIGUsIHRoaXMudmlldyA9PT0gbnVsbCAmJiAodGhpcy52aWV3ID0gewogICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgZnVsbFdpZHRoOiAxLAogICAgICAgICAgICBmdWxsSGVpZ2h0OiAxLAogICAgICAgICAgICBvZmZzZXRYOiAwLAogICAgICAgICAgICBvZmZzZXRZOiAwLAogICAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgICAgaGVpZ2h0OiAxCiAgICAgICAgfSksIHRoaXMudmlldy5lbmFibGVkID0gITAsIHRoaXMudmlldy5mdWxsV2lkdGggPSB0LCB0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGUsIHRoaXMudmlldy5vZmZzZXRYID0gaSwgdGhpcy52aWV3Lm9mZnNldFkgPSBzLCB0aGlzLnZpZXcud2lkdGggPSBuLCB0aGlzLnZpZXcuaGVpZ2h0ID0gciwgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICBjbGVhclZpZXdPZmZzZXQoKSB7CiAgICAgICAgdGhpcy52aWV3ICE9PSBudWxsICYmICh0aGlzLnZpZXcuZW5hYmxlZCA9ICExKSwgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkgewogICAgICAgIGxldCB0ID0gdGhpcy5uZWFyLCBlID0gdCAqIE1hdGgudGFuKERlICogLjUgKiB0aGlzLmZvdikgLyB0aGlzLnpvb20sIGkgPSAyICogZSwgcyA9IHRoaXMuYXNwZWN0ICogaSwgbiA9IC0uNSAqIHMsIHIgPSB0aGlzLnZpZXc7CiAgICAgICAgaWYgKHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCkgewogICAgICAgICAgICBsZXQgYSA9IHIuZnVsbFdpZHRoLCBsID0gci5mdWxsSGVpZ2h0OwogICAgICAgICAgICBuICs9IHIub2Zmc2V0WCAqIHMgLyBhLCBlIC09IHIub2Zmc2V0WSAqIGkgLyBsLCBzICo9IHIud2lkdGggLyBhLCBpICo9IHIuaGVpZ2h0IC8gbDsKICAgICAgICB9CiAgICAgICAgbGV0IG8gPSB0aGlzLmZpbG1PZmZzZXQ7CiAgICAgICAgbyAhPT0gMCAmJiAobiArPSB0ICogbyAvIHRoaXMuZ2V0RmlsbVdpZHRoKCkpLCB0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKG4sIG4gKyBzLCBlLCBlIC0gaSwgdCwgdGhpcy5mYXIsIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksIHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHN1cGVyLnRvSlNPTih0KTsKICAgICAgICByZXR1cm4gZS5vYmplY3QuZm92ID0gdGhpcy5mb3YsIGUub2JqZWN0Lnpvb20gPSB0aGlzLnpvb20sIGUub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXIsIGUub2JqZWN0LmZhciA9IHRoaXMuZmFyLCBlLm9iamVjdC5mb2N1cyA9IHRoaXMuZm9jdXMsIGUub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0LCB0aGlzLnZpZXcgIT09IG51bGwgJiYgKGUub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnZpZXcpKSwgZS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2UsIGUub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQsIGU7CiAgICB9Cn0sIGVpID0gLTkwLCBpaSA9IDEsIGJyID0gY2xhc3MgZXh0ZW5kcyBHIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJDdWJlQ2FtZXJhIiwgdGhpcy5yZW5kZXJUYXJnZXQgPSBpLCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSBudWxsLCB0aGlzLmFjdGl2ZU1pcG1hcExldmVsID0gMDsKICAgICAgICBsZXQgcyA9IG5ldyB2dChlaSwgaWksIHQsIGUpOwogICAgICAgIHMubGF5ZXJzID0gdGhpcy5sYXllcnMsIHRoaXMuYWRkKHMpOwogICAgICAgIGxldCBuID0gbmV3IHZ0KGVpLCBpaSwgdCwgZSk7CiAgICAgICAgbi5sYXllcnMgPSB0aGlzLmxheWVycywgdGhpcy5hZGQobik7CiAgICAgICAgbGV0IHIgPSBuZXcgdnQoZWksIGlpLCB0LCBlKTsKICAgICAgICByLmxheWVycyA9IHRoaXMubGF5ZXJzLCB0aGlzLmFkZChyKTsKICAgICAgICBsZXQgbyA9IG5ldyB2dChlaSwgaWksIHQsIGUpOwogICAgICAgIG8ubGF5ZXJzID0gdGhpcy5sYXllcnMsIHRoaXMuYWRkKG8pOwogICAgICAgIGxldCBhID0gbmV3IHZ0KGVpLCBpaSwgdCwgZSk7CiAgICAgICAgYS5sYXllcnMgPSB0aGlzLmxheWVycywgdGhpcy5hZGQoYSk7CiAgICAgICAgbGV0IGwgPSBuZXcgdnQoZWksIGlpLCB0LCBlKTsKICAgICAgICBsLmxheWVycyA9IHRoaXMubGF5ZXJzLCB0aGlzLmFkZChsKTsKICAgIH0KICAgIHVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0sIGUgPSB0aGlzLmNoaWxkcmVuLmNvbmNhdCgpLCBbaSwgcywgbiwgciwgbywgYV0gPSBlOwogICAgICAgIGZvciAobGV0IGwgb2YgZSl0aGlzLnJlbW92ZShsKTsKICAgICAgICBpZiAodCA9PT0gb2UpIGkudXAuc2V0KDAsIDEsIDApLCBpLmxvb2tBdCgxLCAwLCAwKSwgcy51cC5zZXQoMCwgMSwgMCksIHMubG9va0F0KC0xLCAwLCAwKSwgbi51cC5zZXQoMCwgMCwgLTEpLCBuLmxvb2tBdCgwLCAxLCAwKSwgci51cC5zZXQoMCwgMCwgMSksIHIubG9va0F0KDAsIC0xLCAwKSwgby51cC5zZXQoMCwgMSwgMCksIG8ubG9va0F0KDAsIDAsIDEpLCBhLnVwLnNldCgwLCAxLCAwKSwgYS5sb29rQXQoMCwgMCwgLTEpOwogICAgICAgIGVsc2UgaWYgKHQgPT09IFpzKSBpLnVwLnNldCgwLCAtMSwgMCksIGkubG9va0F0KC0xLCAwLCAwKSwgcy51cC5zZXQoMCwgLTEsIDApLCBzLmxvb2tBdCgxLCAwLCAwKSwgbi51cC5zZXQoMCwgMCwgMSksIG4ubG9va0F0KDAsIDEsIDApLCByLnVwLnNldCgwLCAwLCAtMSksIHIubG9va0F0KDAsIC0xLCAwKSwgby51cC5zZXQoMCwgLTEsIDApLCBvLmxvb2tBdCgwLCAwLCAxKSwgYS51cC5zZXQoMCwgLTEsIDApLCBhLmxvb2tBdCgwLCAwLCAtMSk7CiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkN1YmVDYW1lcmEudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiICsgdCk7CiAgICAgICAgZm9yIChsZXQgbCBvZiBlKXRoaXMuYWRkKGwpLCBsLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CiAgICB9CiAgICB1cGRhdGUodCwgZSkgewogICAgICAgIHRoaXMucGFyZW50ID09PSBudWxsICYmIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTsKICAgICAgICBsZXQgeyByZW5kZXJUYXJnZXQ6IGkgLCBhY3RpdmVNaXBtYXBMZXZlbDogcyAgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5jb29yZGluYXRlU3lzdGVtICE9PSB0LmNvb3JkaW5hdGVTeXN0ZW0gJiYgKHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IHQuY29vcmRpbmF0ZVN5c3RlbSwgdGhpcy51cGRhdGVDb29yZGluYXRlU3lzdGVtKCkpOwogICAgICAgIGxldCBbbiwgciwgbywgYSwgbCwgY10gPSB0aGlzLmNoaWxkcmVuLCB1ID0gdC5nZXRSZW5kZXJUYXJnZXQoKSwgZCA9IHQuZ2V0QWN0aXZlQ3ViZUZhY2UoKSwgcCA9IHQuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSwgZiA9IHQueHIuZW5hYmxlZDsKICAgICAgICB0LnhyLmVuYWJsZWQgPSAhMTsKICAgICAgICBsZXQgbSA9IGkudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7CiAgICAgICAgaS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9ICExLCB0LnNldFJlbmRlclRhcmdldChpLCAwLCBzKSwgdC5yZW5kZXIoZSwgbiksIHQuc2V0UmVuZGVyVGFyZ2V0KGksIDEsIHMpLCB0LnJlbmRlcihlLCByKSwgdC5zZXRSZW5kZXJUYXJnZXQoaSwgMiwgcyksIHQucmVuZGVyKGUsIG8pLCB0LnNldFJlbmRlclRhcmdldChpLCAzLCBzKSwgdC5yZW5kZXIoZSwgYSksIHQuc2V0UmVuZGVyVGFyZ2V0KGksIDQsIHMpLCB0LnJlbmRlcihlLCBsKSwgaS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG0sIHQuc2V0UmVuZGVyVGFyZ2V0KGksIDUsIHMpLCB0LnJlbmRlcihlLCBjKSwgdC5zZXRSZW5kZXJUYXJnZXQodSwgZCwgcCksIHQueHIuZW5hYmxlZCA9IGYsIGkudGV4dHVyZS5uZWVkc1BNUkVNVXBkYXRlID0gITA7CiAgICB9Cn0sIFhpID0gY2xhc3MgZXh0ZW5kcyBsdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsLCBjKXsKICAgICAgICB0ID0gdCAhPT0gdm9pZCAwID8gdCA6IFtdLCBlID0gZSAhPT0gdm9pZCAwID8gZSA6IFVvLCBzdXBlcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsLCBjKSwgdGhpcy5pc0N1YmVUZXh0dXJlID0gITAsIHRoaXMuZmxpcFkgPSAhMTsKICAgIH0KICAgIGdldCBpbWFnZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2U7CiAgICB9CiAgICBzZXQgaW1hZ2VzKHQpIHsKICAgICAgICB0aGlzLmltYWdlID0gdDsKICAgIH0KfSwgTmEgPSBjbGFzcyBleHRlbmRzIEhpIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0ge30pewogICAgICAgIHN1cGVyKHQsIHQsIGUpLCB0aGlzLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID0gITA7CiAgICAgICAgbGV0IGkgPSB7CiAgICAgICAgICAgIHdpZHRoOiB0LAogICAgICAgICAgICBoZWlnaHQ6IHQsCiAgICAgICAgICAgIGRlcHRoOiAxCiAgICAgICAgfSwgcyA9IFsKICAgICAgICAgICAgaSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgaQogICAgICAgIF07CiAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFhpKHMsIGUubWFwcGluZywgZS53cmFwUywgZS53cmFwVCwgZS5tYWdGaWx0ZXIsIGUubWluRmlsdGVyLCBlLmZvcm1hdCwgZS50eXBlLCBlLmFuaXNvdHJvcHksIGUuY29sb3JTcGFjZSksIHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSAhMCwgdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGUuZ2VuZXJhdGVNaXBtYXBzICE9PSB2b2lkIDAgPyBlLmdlbmVyYXRlTWlwbWFwcyA6ICExLCB0aGlzLnRleHR1cmUubWluRmlsdGVyID0gZS5taW5GaWx0ZXIgIT09IHZvaWQgMCA/IGUubWluRmlsdGVyIDogRXQ7CiAgICB9CiAgICBmcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSh0LCBlKSB7CiAgICAgICAgdGhpcy50ZXh0dXJlLnR5cGUgPSBlLnR5cGUsIHRoaXMudGV4dHVyZS5jb2xvclNwYWNlID0gZS5jb2xvclNwYWNlLCB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZS5nZW5lcmF0ZU1pcG1hcHMsIHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBlLm1pbkZpbHRlciwgdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IGUubWFnRmlsdGVyOwogICAgICAgIGxldCBpID0gewogICAgICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICAgICAgdEVxdWlyZWN0OiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBgCgoJCQkJdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKCgkJCQl2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoKCQkJCQlyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTsKCgkJCQl9CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoKCQkJCQkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJCQkJCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCgkJCQl9CgkJCWAsCiAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQkJdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0OwoKCQkJCXZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CgoJCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTsKCgkJCQkJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoKCQkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCgkJCQl9CgkJCWAKICAgICAgICB9LCBzID0gbmV3IEtzKDUsIDUsIDUpLCBuID0gbmV3IHFpKHsKICAgICAgICAgICAgbmFtZTogIkN1YmVtYXBGcm9tRXF1aXJlY3QiLAogICAgICAgICAgICB1bmlmb3JtczogQW4oaS51bmlmb3JtcyksCiAgICAgICAgICAgIHZlcnRleFNoYWRlcjogaS52ZXJ0ZXhTaGFkZXIsCiAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBpLmZyYWdtZW50U2hhZGVyLAogICAgICAgICAgICBzaWRlOiBBbCwKICAgICAgICAgICAgYmxlbmRpbmc6IFVsCiAgICAgICAgfSk7CiAgICAgICAgbi51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSBlOwogICAgICAgIGxldCByID0gbmV3IEN0KHMsIG4pLCBvID0gZS5taW5GaWx0ZXI7CiAgICAgICAgcmV0dXJuIGUubWluRmlsdGVyID09PSB2biAmJiAoZS5taW5GaWx0ZXIgPSBFdCksIG5ldyBicigxLCAxMCwgdGhpcykudXBkYXRlKHQsIHIpLCBlLm1pbkZpbHRlciA9IG8sIHIuZ2VvbWV0cnkuZGlzcG9zZSgpLCByLm1hdGVyaWFsLmRpc3Bvc2UoKSwgdGhpczsKICAgIH0KICAgIGNsZWFyKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHQuZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgICAgICAgZm9yKGxldCByID0gMDsgciA8IDY7IHIrKyl0LnNldFJlbmRlclRhcmdldCh0aGlzLCByKSwgdC5jbGVhcihlLCBpLCBzKTsKICAgICAgICB0LnNldFJlbmRlclRhcmdldChuKTsKICAgIH0KfSwgTmUgPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzR3JvdXAgPSAhMCwgdGhpcy50eXBlID0gIkdyb3VwIjsKICAgIH0KfSwgQnUgPSB7CiAgICB0eXBlOiAibW92ZSIKfSwgVmEgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHRoaXMuX3RhcmdldFJheSA9IG51bGwsIHRoaXMuX2dyaXAgPSBudWxsLCB0aGlzLl9oYW5kID0gbnVsbDsKICAgIH0KICAgIGdldEhhbmRTcGFjZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFuZCA9PT0gbnVsbCAmJiAodGhpcy5faGFuZCA9IG5ldyBOZSwgdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlID0gITEsIHRoaXMuX2hhbmQudmlzaWJsZSA9ICExLCB0aGlzLl9oYW5kLmpvaW50cyA9IHt9LCB0aGlzLl9oYW5kLmlucHV0U3RhdGUgPSB7CiAgICAgICAgICAgIHBpbmNoaW5nOiAhMQogICAgICAgIH0pLCB0aGlzLl9oYW5kOwogICAgfQogICAgZ2V0VGFyZ2V0UmF5U3BhY2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldFJheSA9PT0gbnVsbCAmJiAodGhpcy5fdGFyZ2V0UmF5ID0gbmV3IE5lLCB0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZSA9ICExLCB0aGlzLl90YXJnZXRSYXkudmlzaWJsZSA9ICExLCB0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHkgPSAhMSwgdGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5ID0gbmV3IHcsIHRoaXMuX3RhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHkgPSAhMSwgdGhpcy5fdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eSA9IG5ldyB3KSwgdGhpcy5fdGFyZ2V0UmF5OwogICAgfQogICAgZ2V0R3JpcFNwYWNlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9ncmlwID09PSBudWxsICYmICh0aGlzLl9ncmlwID0gbmV3IE5lLCB0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5fZ3JpcC52aXNpYmxlID0gITEsIHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSAhMSwgdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eSA9IG5ldyB3LCB0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9ICExLCB0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eSA9IG5ldyB3KSwgdGhpcy5fZ3JpcDsKICAgIH0KICAgIGRpc3BhdGNoRXZlbnQodCkgewogICAgICAgIHJldHVybiB0aGlzLl90YXJnZXRSYXkgIT09IG51bGwgJiYgdGhpcy5fdGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQodCksIHRoaXMuX2dyaXAgIT09IG51bGwgJiYgdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLCB0aGlzLl9oYW5kICE9PSBudWxsICYmIHRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudCh0KSwgdGhpczsKICAgIH0KICAgIGNvbm5lY3QodCkgewogICAgICAgIGlmICh0ICYmIHQuaGFuZCkgewogICAgICAgICAgICBsZXQgZSA9IHRoaXMuX2hhbmQ7CiAgICAgICAgICAgIGlmIChlKSBmb3IgKGxldCBpIG9mIHQuaGFuZC52YWx1ZXMoKSl0aGlzLl9nZXRIYW5kSm9pbnQoZSwgaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAiY29ubmVjdGVkIiwKICAgICAgICAgICAgZGF0YTogdAogICAgICAgIH0pLCB0aGlzOwogICAgfQogICAgZGlzY29ubmVjdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgIHR5cGU6ICJkaXNjb25uZWN0ZWQiLAogICAgICAgICAgICBkYXRhOiB0CiAgICAgICAgfSksIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCAmJiAodGhpcy5fdGFyZ2V0UmF5LnZpc2libGUgPSAhMSksIHRoaXMuX2dyaXAgIT09IG51bGwgJiYgKHRoaXMuX2dyaXAudmlzaWJsZSA9ICExKSwgdGhpcy5faGFuZCAhPT0gbnVsbCAmJiAodGhpcy5faGFuZC52aXNpYmxlID0gITEpLCB0aGlzOwogICAgfQogICAgdXBkYXRlKHQsIGUsIGkpIHsKICAgICAgICBsZXQgcyA9IG51bGwsIG4gPSBudWxsLCByID0gbnVsbCwgbyA9IHRoaXMuX3RhcmdldFJheSwgYSA9IHRoaXMuX2dyaXAsIGwgPSB0aGlzLl9oYW5kOwogICAgICAgIGlmICh0ICYmIGUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUgIT09ICJ2aXNpYmxlLWJsdXJyZWQiKSB7CiAgICAgICAgICAgIGlmIChsICYmIHQuaGFuZCkgewogICAgICAgICAgICAgICAgciA9ICEwOwogICAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiB0LmhhbmQudmFsdWVzKCkpewogICAgICAgICAgICAgICAgICAgIGxldCB5MSA9IGUuZ2V0Sm9pbnRQb3NlKG0sIGkpLCBnID0gdGhpcy5fZ2V0SGFuZEpvaW50KGwsIG0pOwogICAgICAgICAgICAgICAgICAgIHkxICE9PSBudWxsICYmIChnLm1hdHJpeC5mcm9tQXJyYXkoeTEudHJhbnNmb3JtLm1hdHJpeCksIGcubWF0cml4LmRlY29tcG9zZShnLnBvc2l0aW9uLCBnLnJvdGF0aW9uLCBnLnNjYWxlKSwgZy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gITAsIGcuam9pbnRSYWRpdXMgPSB5MS5yYWRpdXMpLCBnLnZpc2libGUgPSB5MSAhPT0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBjID0gbC5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXSwgdSA9IGwuam9pbnRzWyJ0aHVtYi10aXAiXSwgZCA9IGMucG9zaXRpb24uZGlzdGFuY2VUbyh1LnBvc2l0aW9uKSwgcCA9IC4wMiwgZiA9IC4wMDU7CiAgICAgICAgICAgICAgICBsLmlucHV0U3RhdGUucGluY2hpbmcgJiYgZCA+IHAgKyBmID8gKGwuaW5wdXRTdGF0ZS5waW5jaGluZyA9ICExLCB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJwaW5jaGVuZCIsCiAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzczogdC5oYW5kZWRuZXNzLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcwogICAgICAgICAgICAgICAgfSkpIDogIWwuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkIDw9IHAgLSBmICYmIChsLmlucHV0U3RhdGUucGluY2hpbmcgPSAhMCwgdGhpcy5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAicGluY2hzdGFydCIsCiAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzczogdC5oYW5kZWRuZXNzLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9IGVsc2UgYSAhPT0gbnVsbCAmJiB0LmdyaXBTcGFjZSAmJiAobiA9IGUuZ2V0UG9zZSh0LmdyaXBTcGFjZSwgaSksIG4gIT09IG51bGwgJiYgKGEubWF0cml4LmZyb21BcnJheShuLnRyYW5zZm9ybS5tYXRyaXgpLCBhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbiwgYS5yb3RhdGlvbiwgYS5zY2FsZSksIGEubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9ICEwLCBuLmxpbmVhclZlbG9jaXR5ID8gKGEuaGFzTGluZWFyVmVsb2NpdHkgPSAhMCwgYS5saW5lYXJWZWxvY2l0eS5jb3B5KG4ubGluZWFyVmVsb2NpdHkpKSA6IGEuaGFzTGluZWFyVmVsb2NpdHkgPSAhMSwgbi5hbmd1bGFyVmVsb2NpdHkgPyAoYS5oYXNBbmd1bGFyVmVsb2NpdHkgPSAhMCwgYS5hbmd1bGFyVmVsb2NpdHkuY29weShuLmFuZ3VsYXJWZWxvY2l0eSkpIDogYS5oYXNBbmd1bGFyVmVsb2NpdHkgPSAhMSkpOwogICAgICAgICAgICBvICE9PSBudWxsICYmIChzID0gZS5nZXRQb3NlKHQudGFyZ2V0UmF5U3BhY2UsIGkpLCBzID09PSBudWxsICYmIG4gIT09IG51bGwgJiYgKHMgPSBuKSwgcyAhPT0gbnVsbCAmJiAoby5tYXRyaXguZnJvbUFycmF5KHMudHJhbnNmb3JtLm1hdHJpeCksIG8ubWF0cml4LmRlY29tcG9zZShvLnBvc2l0aW9uLCBvLnJvdGF0aW9uLCBvLnNjYWxlKSwgby5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gITAsIHMubGluZWFyVmVsb2NpdHkgPyAoby5oYXNMaW5lYXJWZWxvY2l0eSA9ICEwLCBvLmxpbmVhclZlbG9jaXR5LmNvcHkocy5saW5lYXJWZWxvY2l0eSkpIDogby5oYXNMaW5lYXJWZWxvY2l0eSA9ICExLCBzLmFuZ3VsYXJWZWxvY2l0eSA/IChvLmhhc0FuZ3VsYXJWZWxvY2l0eSA9ICEwLCBvLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KHMuYW5ndWxhclZlbG9jaXR5KSkgOiBvLmhhc0FuZ3VsYXJWZWxvY2l0eSA9ICExLCB0aGlzLmRpc3BhdGNoRXZlbnQoQnUpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvICE9PSBudWxsICYmIChvLnZpc2libGUgPSBzICE9PSBudWxsKSwgYSAhPT0gbnVsbCAmJiAoYS52aXNpYmxlID0gbiAhPT0gbnVsbCksIGwgIT09IG51bGwgJiYgKGwudmlzaWJsZSA9IHIgIT09IG51bGwpLCB0aGlzOwogICAgfQogICAgX2dldEhhbmRKb2ludCh0LCBlKSB7CiAgICAgICAgaWYgKHQuam9pbnRzW2Uuam9pbnROYW1lXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBpID0gbmV3IE5lOwogICAgICAgICAgICBpLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgaS52aXNpYmxlID0gITEsIHQuam9pbnRzW2Uuam9pbnROYW1lXSA9IGksIHQuYWRkKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdC5qb2ludHNbZS5qb2ludE5hbWVdOwogICAgfQp9LCB3ciA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCwgZSA9IDI1ZS01KXsKICAgICAgICB0aGlzLmlzRm9nRXhwMiA9ICEwLCB0aGlzLm5hbWUgPSAiIiwgdGhpcy5jb2xvciA9IG5ldyBQKHQpLCB0aGlzLmRlbnNpdHkgPSBlOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHRoaXMuY29sb3IsIHRoaXMuZGVuc2l0eSk7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogIkZvZ0V4cDIiLAogICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAogICAgICAgICAgICBkZW5zaXR5OiB0aGlzLmRlbnNpdHkKICAgICAgICB9OwogICAgfQp9LCBNciA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCwgZSA9IDEsIGkgPSAxZTMpewogICAgICAgIHRoaXMuaXNGb2cgPSAhMCwgdGhpcy5uYW1lID0gIiIsIHRoaXMuY29sb3IgPSBuZXcgUCh0KSwgdGhpcy5uZWFyID0gZSwgdGhpcy5mYXIgPSBpOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHRoaXMuY29sb3IsIHRoaXMubmVhciwgdGhpcy5mYXIpOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6ICJGb2ciLAogICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAogICAgICAgICAgICBuZWFyOiB0aGlzLm5lYXIsCiAgICAgICAgICAgIGZhcjogdGhpcy5mYXIKICAgICAgICB9OwogICAgfQp9LCBfciA9IGNsYXNzIGV4dGVuZHMgRyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNTY2VuZSA9ICEwLCB0aGlzLnR5cGUgPSAiU2NlbmUiLCB0aGlzLmJhY2tncm91bmQgPSBudWxsLCB0aGlzLmVudmlyb25tZW50ID0gbnVsbCwgdGhpcy5mb2cgPSBudWxsLCB0aGlzLmJhY2tncm91bmRCbHVycmluZXNzID0gMCwgdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gMSwgdGhpcy5iYWNrZ3JvdW5kUm90YXRpb24gPSBuZXcgWHQsIHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSAxLCB0aGlzLmVudmlyb25tZW50Um90YXRpb24gPSBuZXcgWHQsIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGwsIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gPCAidSIgJiYgX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIiwgewogICAgICAgICAgICBkZXRhaWw6IHRoaXMKICAgICAgICB9KSk7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdC5iYWNrZ3JvdW5kICE9PSBudWxsICYmICh0aGlzLmJhY2tncm91bmQgPSB0LmJhY2tncm91bmQuY2xvbmUoKSksIHQuZW52aXJvbm1lbnQgIT09IG51bGwgJiYgKHRoaXMuZW52aXJvbm1lbnQgPSB0LmVudmlyb25tZW50LmNsb25lKCkpLCB0LmZvZyAhPT0gbnVsbCAmJiAodGhpcy5mb2cgPSB0LmZvZy5jbG9uZSgpKSwgdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IHQuYmFja2dyb3VuZEJsdXJyaW5lc3MsIHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSA9IHQuYmFja2dyb3VuZEludGVuc2l0eSwgdGhpcy5iYWNrZ3JvdW5kUm90YXRpb24uY29weSh0LmJhY2tncm91bmRSb3RhdGlvbiksIHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSB0LmVudmlyb25tZW50SW50ZW5zaXR5LCB0aGlzLmVudmlyb25tZW50Um90YXRpb24uY29weSh0LmVudmlyb25tZW50Um90YXRpb24pLCB0Lm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgJiYgKHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHQub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKSwgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gdC5tYXRyaXhBdXRvVXBkYXRlLCB0aGlzOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHN1cGVyLnRvSlNPTih0KTsKICAgICAgICByZXR1cm4gdGhpcy5mb2cgIT09IG51bGwgJiYgKGUub2JqZWN0LmZvZyA9IHRoaXMuZm9nLnRvSlNPTigpKSwgdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDAgJiYgKGUub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzID0gdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyksIHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gMSAmJiAoZS5vYmplY3QuYmFja2dyb3VuZEludGVuc2l0eSA9IHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSksIGUub2JqZWN0LmJhY2tncm91bmRSb3RhdGlvbiA9IHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLnRvQXJyYXkoKSwgdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSAhPT0gMSAmJiAoZS5vYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSB0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5KSwgZS5vYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbi50b0FycmF5KCksIGU7CiAgICB9Cn0sIEppID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSl7CiAgICAgICAgdGhpcy5pc0ludGVybGVhdmVkQnVmZmVyID0gITAsIHRoaXMuYXJyYXkgPSB0LCB0aGlzLnN0cmlkZSA9IGUsIHRoaXMuY291bnQgPSB0ICE9PSB2b2lkIDAgPyB0Lmxlbmd0aCAvIGUgOiAwLCB0aGlzLnVzYWdlID0gSnMsIHRoaXMudXBkYXRlUmFuZ2VzID0gW10sIHRoaXMudmVyc2lvbiA9IDAsIHRoaXMudXVpZCA9IEl0KCk7CiAgICB9CiAgICBvblVwbG9hZENhbGxiYWNrKCkge30KICAgIHNldCBuZWVkc1VwZGF0ZSh0KSB7CiAgICAgICAgdCA9PT0gITAgJiYgdGhpcy52ZXJzaW9uKys7CiAgICB9CiAgICBzZXRVc2FnZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudXNhZ2UgPSB0LCB0aGlzOwogICAgfQogICAgYWRkVXBkYXRlUmFuZ2UodCwgZSkgewogICAgICAgIHRoaXMudXBkYXRlUmFuZ2VzLnB1c2goewogICAgICAgICAgICBzdGFydDogdCwKICAgICAgICAgICAgY291bnQ6IGUKICAgICAgICB9KTsKICAgIH0KICAgIGNsZWFyVXBkYXRlUmFuZ2VzKCkgewogICAgICAgIHRoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aCA9IDA7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcnJheSA9IG5ldyB0LmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXkpLCB0aGlzLmNvdW50ID0gdC5jb3VudCwgdGhpcy5zdHJpZGUgPSB0LnN0cmlkZSwgdGhpcy51c2FnZSA9IHQudXNhZ2UsIHRoaXM7CiAgICB9CiAgICBjb3B5QXQodCwgZSwgaSkgewogICAgICAgIHQgKj0gdGhpcy5zdHJpZGUsIGkgKj0gZS5zdHJpZGU7CiAgICAgICAgZm9yKGxldCBzID0gMCwgbiA9IHRoaXMuc3RyaWRlOyBzIDwgbjsgcysrKXRoaXMuYXJyYXlbdCArIHNdID0gZS5hcnJheVtpICsgc107CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXQodCwgZSA9IDApIHsKICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5zZXQodCwgZSksIHRoaXM7CiAgICB9CiAgICBjbG9uZSh0KSB7CiAgICAgICAgdC5hcnJheUJ1ZmZlcnMgPT09IHZvaWQgMCAmJiAodC5hcnJheUJ1ZmZlcnMgPSB7fSksIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID09PSB2b2lkIDAgJiYgKHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID0gSXQoKSksIHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSA9PT0gdm9pZCAwICYmICh0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0gPSB0aGlzLmFycmF5LnNsaWNlKDApLmJ1ZmZlcik7CiAgICAgICAgbGV0IGUgPSBuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0pLCBpID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZSwgdGhpcy5zdHJpZGUpOwogICAgICAgIHJldHVybiBpLnNldFVzYWdlKHRoaXMudXNhZ2UpLCBpOwogICAgfQogICAgb25VcGxvYWQodCkgewogICAgICAgIHJldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSB0LCB0aGlzOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICByZXR1cm4gdC5hcnJheUJ1ZmZlcnMgPT09IHZvaWQgMCAmJiAodC5hcnJheUJ1ZmZlcnMgPSB7fSksIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID09PSB2b2lkIDAgJiYgKHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID0gSXQoKSksIHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSA9PT0gdm9pZCAwICYmICh0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0gPSBBcnJheS5mcm9tKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSwgewogICAgICAgICAgICB1dWlkOiB0aGlzLnV1aWQsCiAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy5hcnJheS5idWZmZXIuX3V1aWQsCiAgICAgICAgICAgIHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSwKICAgICAgICAgICAgc3RyaWRlOiB0aGlzLnN0cmlkZQogICAgICAgIH07CiAgICB9Cn0sIGd0ID0gbmV3IHcsIGZpID0gY2xhc3MgaCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzID0gITEpewogICAgICAgIHRoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9ICEwLCB0aGlzLm5hbWUgPSAiIiwgdGhpcy5kYXRhID0gdCwgdGhpcy5pdGVtU2l6ZSA9IGUsIHRoaXMub2Zmc2V0ID0gaSwgdGhpcy5ub3JtYWxpemVkID0gczsKICAgIH0KICAgIGdldCBjb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvdW50OwogICAgfQogICAgZ2V0IGFycmF5KCkgewogICAgICAgIHJldHVybiB0aGlzLmRhdGEuYXJyYXk7CiAgICB9CiAgICBzZXQgbmVlZHNVcGRhdGUodCkgewogICAgICAgIHRoaXMuZGF0YS5uZWVkc1VwZGF0ZSA9IHQ7CiAgICB9CiAgICBhcHBseU1hdHJpeDQodCkgewogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLmRhdGEuY291bnQ7IGUgPCBpOyBlKyspZ3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBlKSwgZ3QuYXBwbHlNYXRyaXg0KHQpLCB0aGlzLnNldFhZWihlLCBndC54LCBndC55LCBndC56KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFwcGx5Tm9ybWFsTWF0cml4KHQpIHsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdGhpcy5jb3VudDsgZSA8IGk7IGUrKylndC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsIGUpLCBndC5hcHBseU5vcm1hbE1hdHJpeCh0KSwgdGhpcy5zZXRYWVooZSwgZ3QueCwgZ3QueSwgZ3Queik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0cmFuc2Zvcm1EaXJlY3Rpb24odCkgewogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLmNvdW50OyBlIDwgaTsgZSsrKWd0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgZSksIGd0LnRyYW5zZm9ybURpcmVjdGlvbih0KSwgdGhpcy5zZXRYWVooZSwgZ3QueCwgZ3QueSwgZ3Queik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRDb21wb25lbnQodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5hcnJheVt0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgZV07CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoaSA9IHh0KGksIHRoaXMuYXJyYXkpKSwgaTsKICAgIH0KICAgIHNldENvbXBvbmVudCh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoaSA9IFYoaSwgdGhpcy5hcnJheSkpLCB0aGlzLmRhdGEuYXJyYXlbdCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIGVdID0gaSwgdGhpczsKICAgIH0KICAgIHNldFgodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpKSwgdGhpcy5kYXRhLmFycmF5W3QgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXRdID0gZSwgdGhpczsKICAgIH0KICAgIHNldFkodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpKSwgdGhpcy5kYXRhLmFycmF5W3QgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxXSA9IGUsIHRoaXM7CiAgICB9CiAgICBzZXRaKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0gVihlLCB0aGlzLmFycmF5KSksIHRoaXMuZGF0YS5hcnJheVt0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMl0gPSBlLCB0aGlzOwogICAgfQogICAgc2V0Vyh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IFYoZSwgdGhpcy5hcnJheSkpLCB0aGlzLmRhdGEuYXJyYXlbdCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDNdID0gZSwgdGhpczsKICAgIH0KICAgIGdldFgodCkgewogICAgICAgIGxldCBlID0gdGhpcy5kYXRhLmFycmF5W3QgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXRdOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBnZXRZKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZGF0YS5hcnJheVt0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMV07CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZCAmJiAoZSA9IHh0KGUsIHRoaXMuYXJyYXkpKSwgZTsKICAgIH0KICAgIGdldFoodCkgewogICAgICAgIGxldCBlID0gdGhpcy5kYXRhLmFycmF5W3QgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyXTsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkICYmIChlID0geHQoZSwgdGhpcy5hcnJheSkpLCBlOwogICAgfQogICAgZ2V0Vyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmRhdGEuYXJyYXlbdCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDNdOwogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSB4dChlLCB0aGlzLmFycmF5KSksIGU7CiAgICB9CiAgICBzZXRYWSh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHQgPSB0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0LCB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpLCBpID0gVihpLCB0aGlzLmFycmF5KSksIHRoaXMuZGF0YS5hcnJheVt0ICsgMF0gPSBlLCB0aGlzLmRhdGEuYXJyYXlbdCArIDFdID0gaSwgdGhpczsKICAgIH0KICAgIHNldFhZWih0LCBlLCBpLCBzKSB7CiAgICAgICAgcmV0dXJuIHQgPSB0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0LCB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpLCBpID0gVihpLCB0aGlzLmFycmF5KSwgcyA9IFYocywgdGhpcy5hcnJheSkpLCB0aGlzLmRhdGEuYXJyYXlbdCArIDBdID0gZSwgdGhpcy5kYXRhLmFycmF5W3QgKyAxXSA9IGksIHRoaXMuZGF0YS5hcnJheVt0ICsgMl0gPSBzLCB0aGlzOwogICAgfQogICAgc2V0WFlaVyh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgcmV0dXJuIHQgPSB0ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0LCB0aGlzLm5vcm1hbGl6ZWQgJiYgKGUgPSBWKGUsIHRoaXMuYXJyYXkpLCBpID0gVihpLCB0aGlzLmFycmF5KSwgcyA9IFYocywgdGhpcy5hcnJheSksIG4gPSBWKG4sIHRoaXMuYXJyYXkpKSwgdGhpcy5kYXRhLmFycmF5W3QgKyAwXSA9IGUsIHRoaXMuZGF0YS5hcnJheVt0ICsgMV0gPSBpLCB0aGlzLmRhdGEuYXJyYXlbdCArIDJdID0gcywgdGhpcy5kYXRhLmFycmF5W3QgKyAzXSA9IG4sIHRoaXM7CiAgICB9CiAgICBjbG9uZSh0KSB7CiAgICAgICAgaWYgKHQgPT09IHZvaWQgMCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTsKICAgICAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkrKyl7CiAgICAgICAgICAgICAgICBsZXQgcyA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgICAgICAgICBmb3IobGV0IG4gPSAwOyBuIDwgdGhpcy5pdGVtU2l6ZTsgbisrKWUucHVzaCh0aGlzLmRhdGEuYXJyYXlbcyArIG5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFoobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoZSksIHRoaXMuaXRlbVNpemUsIHRoaXMubm9ybWFsaXplZCk7CiAgICAgICAgfSBlbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycyA9PT0gdm9pZCAwICYmICh0LmludGVybGVhdmVkQnVmZmVycyA9IHt9KSwgdC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdID09PSB2b2lkIDAgJiYgKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSA9IHRoaXMuZGF0YS5jbG9uZSh0KSksIG5ldyBoKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMubm9ybWFsaXplZCk7CiAgICB9CiAgICB0b0pTT04odCkgewogICAgICAgIGlmICh0ID09PSB2b2lkIDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnRvSlNPTigpOiBTZXJpYWxpemluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTsKICAgICAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkrKyl7CiAgICAgICAgICAgICAgICBsZXQgcyA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgICAgICAgICBmb3IobGV0IG4gPSAwOyBuIDwgdGhpcy5pdGVtU2l6ZTsgbisrKWUucHVzaCh0aGlzLmRhdGEuYXJyYXlbcyArIG5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuaXRlbVNpemUsCiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsCiAgICAgICAgICAgICAgICBhcnJheTogZSwKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZAogICAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSByZXR1cm4gdC5pbnRlcmxlYXZlZEJ1ZmZlcnMgPT09IHZvaWQgMCAmJiAodC5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fSksIHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSA9PT0gdm9pZCAwICYmICh0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0gPSB0aGlzLmRhdGEudG9KU09OKHQpKSwgewogICAgICAgICAgICBpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiAhMCwKICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuaXRlbVNpemUsCiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YS51dWlkLAogICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LAogICAgICAgICAgICBub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWQKICAgICAgICB9OwogICAgfQp9LCB0biA9IGNsYXNzIGV4dGVuZHMgY3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1Nwcml0ZU1hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJTcHJpdGVNYXRlcmlhbCIsIHRoaXMuY29sb3IgPSBuZXcgUCgxNjc3NzIxNSksIHRoaXMubWFwID0gbnVsbCwgdGhpcy5hbHBoYU1hcCA9IG51bGwsIHRoaXMucm90YXRpb24gPSAwLCB0aGlzLnNpemVBdHRlbnVhdGlvbiA9ICEwLCB0aGlzLnRyYW5zcGFyZW50ID0gITAsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSwgdGhpcy5tYXAgPSB0Lm1hcCwgdGhpcy5hbHBoYU1hcCA9IHQuYWxwaGFNYXAsIHRoaXMucm90YXRpb24gPSB0LnJvdGF0aW9uLCB0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHQuc2l6ZUF0dGVudWF0aW9uLCB0aGlzLmZvZyA9IHQuZm9nLCB0aGlzOwogICAgfQp9LCBzaSwgQ2kgPSBuZXcgdywgbmkgPSBuZXcgdywgcmkgPSBuZXcgdywgb2kgPSBuZXcgVCwgemkgPSBuZXcgVCwgQmwgPSBuZXcgRCwgYnMgPSBuZXcgdywgRmkgPSBuZXcgdywgd3MgPSBuZXcgdywgRGEgPSBuZXcgVCwgJG4gPSBuZXcgVCwgTGEgPSBuZXcgVCwgdnIgPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IodCA9IG5ldyB0bil7CiAgICAgICAgaWYgKHN1cGVyKCksIHRoaXMuaXNTcHJpdGUgPSAhMCwgdGhpcy50eXBlID0gIlNwcml0ZSIsIHNpID09PSB2b2lkIDApIHsKICAgICAgICAgICAgc2kgPSBuZXcgTDsKICAgICAgICAgICAgbGV0IGUgPSBuZXcgRmxvYXQzMkFycmF5KFsKICAgICAgICAgICAgICAgIC0uNSwKICAgICAgICAgICAgICAgIC0uNSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIC41LAogICAgICAgICAgICAgICAgLS41LAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgLjUsCiAgICAgICAgICAgICAgICAuNSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIC0uNSwKICAgICAgICAgICAgICAgIC41LAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgIF0pLCBpID0gbmV3IEppKGUsIDUpOwogICAgICAgICAgICBzaS5zZXRJbmRleChbCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgXSksIHNpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgZmkoaSwgMywgMCwgITEpKSwgc2kuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBmaShpLCAyLCAzLCAhMSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdlb21ldHJ5ID0gc2ksIHRoaXMubWF0ZXJpYWwgPSB0LCB0aGlzLmNlbnRlciA9IG5ldyBUKC41LCAuNSk7CiAgICB9CiAgICByYXljYXN0KHQsIGUpIHsKICAgICAgICB0LmNhbWVyYSA9PT0gbnVsbCAmJiBjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyksIG5pLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKSwgQmwuY29weSh0LmNhbWVyYS5tYXRyaXhXb3JsZCksIHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXModC5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCB0aGlzLm1hdHJpeFdvcmxkKSwgcmkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubW9kZWxWaWV3TWF0cml4KSwgdC5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSAmJiB0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9PT0gITEgJiYgbmkubXVsdGlwbHlTY2FsYXIoLXJpLnopOwogICAgICAgIGxldCBpID0gdGhpcy5tYXRlcmlhbC5yb3RhdGlvbiwgcywgbjsKICAgICAgICBpICE9PSAwICYmIChuID0gTWF0aC5jb3MoaSksIHMgPSBNYXRoLnNpbihpKSk7CiAgICAgICAgbGV0IHIgPSB0aGlzLmNlbnRlcjsKICAgICAgICBNcyhicy5zZXQoLS41LCAtLjUsIDApLCByaSwgciwgbmksIHMsIG4pLCBNcyhGaS5zZXQoLjUsIC0uNSwgMCksIHJpLCByLCBuaSwgcywgbiksIE1zKHdzLnNldCguNSwgLjUsIDApLCByaSwgciwgbmksIHMsIG4pLCBEYS5zZXQoMCwgMCksICRuLnNldCgxLCAwKSwgTGEuc2V0KDEsIDEpOwogICAgICAgIGxldCBvID0gdC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoYnMsIEZpLCB3cywgITEsIENpKTsKICAgICAgICBpZiAobyA9PT0gbnVsbCAmJiAoTXMoRmkuc2V0KC0uNSwgLjUsIDApLCByaSwgciwgbmksIHMsIG4pLCAkbi5zZXQoMCwgMSksIG8gPSB0LnJheS5pbnRlcnNlY3RUcmlhbmdsZShicywgd3MsIEZpLCAhMSwgQ2kpLCBvID09PSBudWxsKSkgcmV0dXJuOwogICAgICAgIGxldCBhID0gdC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oQ2kpOwogICAgICAgIGEgPCB0Lm5lYXIgfHwgYSA+IHQuZmFyIHx8IGUucHVzaCh7CiAgICAgICAgICAgIGRpc3RhbmNlOiBhLAogICAgICAgICAgICBwb2ludDogQ2kuY2xvbmUoKSwKICAgICAgICAgICAgdXY6IG5lLmdldEludGVycG9sYXRpb24oQ2ksIGJzLCBGaSwgd3MsIERhLCAkbiwgTGEsIG5ldyBUKSwKICAgICAgICAgICAgZmFjZTogbnVsbCwKICAgICAgICAgICAgb2JqZWN0OiB0aGlzCiAgICAgICAgfSk7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdC5jZW50ZXIgIT09IHZvaWQgMCAmJiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSwgdGhpcy5tYXRlcmlhbCA9IHQubWF0ZXJpYWwsIHRoaXM7CiAgICB9Cn07CmZ1bmN0aW9uIE1zKGgsIHQsIGUsIGksIHMsIG4pIHsKICAgIG9pLnN1YlZlY3RvcnMoaCwgZSkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShpKSwgcyAhPT0gdm9pZCAwID8gKHppLnggPSBuICogb2kueCAtIHMgKiBvaS55LCB6aS55ID0gcyAqIG9pLnggKyBuICogb2kueSkgOiB6aS5jb3B5KG9pKSwgaC5jb3B5KHQpLCBoLnggKz0gemkueCwgaC55ICs9IHppLnksIGguYXBwbHlNYXRyaXg0KEJsKTsKfQp2YXIgX3MgPSBuZXcgdywgVWEgPSBuZXcgdywgQXIgPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLl9jdXJyZW50TGV2ZWwgPSAwLCB0aGlzLnR5cGUgPSAiTE9EIiwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgICAgICBsZXZlbHM6IHsKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgdmFsdWU6IFtdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlzTE9EOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICAgICAgfQogICAgICAgIH0pLCB0aGlzLmF1dG9VcGRhdGUgPSAhMDsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHN1cGVyLmNvcHkodCwgITEpOwogICAgICAgIGxldCBlID0gdC5sZXZlbHM7CiAgICAgICAgZm9yKGxldCBpID0gMCwgcyA9IGUubGVuZ3RoOyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgbGV0IG4gPSBlW2ldOwogICAgICAgICAgICB0aGlzLmFkZExldmVsKG4ub2JqZWN0LmNsb25lKCksIG4uZGlzdGFuY2UsIG4uaHlzdGVyZXNpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmF1dG9VcGRhdGUgPSB0LmF1dG9VcGRhdGUsIHRoaXM7CiAgICB9CiAgICBhZGRMZXZlbCh0LCBlID0gMCwgaSA9IDApIHsKICAgICAgICBlID0gTWF0aC5hYnMoZSk7CiAgICAgICAgbGV0IHMgPSB0aGlzLmxldmVscywgbjsKICAgICAgICBmb3IobiA9IDA7IG4gPCBzLmxlbmd0aCAmJiAhKGUgPCBzW25dLmRpc3RhbmNlKTsgbisrKTsKICAgICAgICByZXR1cm4gcy5zcGxpY2UobiwgMCwgewogICAgICAgICAgICBkaXN0YW5jZTogZSwKICAgICAgICAgICAgaHlzdGVyZXNpczogaSwKICAgICAgICAgICAgb2JqZWN0OiB0CiAgICAgICAgfSksIHRoaXMuYWRkKHQpLCB0aGlzOwogICAgfQogICAgcmVtb3ZlTGV2ZWwodCkgewogICAgICAgIGxldCBlID0gdGhpcy5sZXZlbHM7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspaWYgKGVbaV0uZGlzdGFuY2UgPT09IHQpIHsKICAgICAgICAgICAgbGV0IHMgPSBlLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHNbMF0ub2JqZWN0KSwgITA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhMTsKICAgIH0KICAgIGdldEN1cnJlbnRMZXZlbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudExldmVsOwogICAgfQogICAgZ2V0T2JqZWN0Rm9yRGlzdGFuY2UodCkgewogICAgICAgIGxldCBlID0gdGhpcy5sZXZlbHM7CiAgICAgICAgaWYgKGUubGVuZ3RoID4gMCkgewogICAgICAgICAgICBsZXQgaSwgczsKICAgICAgICAgICAgZm9yKGkgPSAxLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspewogICAgICAgICAgICAgICAgbGV0IG4gPSBlW2ldLmRpc3RhbmNlOwogICAgICAgICAgICAgICAgaWYgKGVbaV0ub2JqZWN0LnZpc2libGUgJiYgKG4gLT0gbiAqIGVbaV0uaHlzdGVyZXNpcyksIHQgPCBuKSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZVtpIC0gMV0ub2JqZWN0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJheWNhc3QodCwgZSkgewogICAgICAgIGlmICh0aGlzLmxldmVscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIF9zLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgICAgICAgbGV0IHMgPSB0LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhfcyk7CiAgICAgICAgICAgIHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UocykucmF5Y2FzdCh0LCBlKTsKICAgICAgICB9CiAgICB9CiAgICB1cGRhdGUodCkgewogICAgICAgIGxldCBlID0gdGhpcy5sZXZlbHM7CiAgICAgICAgaWYgKGUubGVuZ3RoID4gMSkgewogICAgICAgICAgICBfcy5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCksIFVhLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgICAgICAgbGV0IGkgPSBfcy5kaXN0YW5jZVRvKFVhKSAvIHQuem9vbTsKICAgICAgICAgICAgZVswXS5vYmplY3QudmlzaWJsZSA9ICEwOwogICAgICAgICAgICBsZXQgcywgbjsKICAgICAgICAgICAgZm9yKHMgPSAxLCBuID0gZS5sZW5ndGg7IHMgPCBuOyBzKyspewogICAgICAgICAgICAgICAgbGV0IHIgPSBlW3NdLmRpc3RhbmNlOwogICAgICAgICAgICAgICAgaWYgKGVbc10ub2JqZWN0LnZpc2libGUgJiYgKHIgLT0gciAqIGVbc10uaHlzdGVyZXNpcyksIGkgPj0gcikgZVtzIC0gMV0ub2JqZWN0LnZpc2libGUgPSAhMSwgZVtzXS5vYmplY3QudmlzaWJsZSA9ICEwOwogICAgICAgICAgICAgICAgZWxzZSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IodGhpcy5fY3VycmVudExldmVsID0gcyAtIDE7IHMgPCBuOyBzKyspZVtzXS5vYmplY3QudmlzaWJsZSA9ICExOwogICAgICAgIH0KICAgIH0KICAgIHRvSlNPTih0KSB7CiAgICAgICAgbGV0IGUgPSBzdXBlci50b0pTT04odCk7CiAgICAgICAgdGhpcy5hdXRvVXBkYXRlID09PSAhMSAmJiAoZS5vYmplY3QuYXV0b1VwZGF0ZSA9ICExKSwgZS5vYmplY3QubGV2ZWxzID0gW107CiAgICAgICAgbGV0IGkgPSB0aGlzLmxldmVsczsKICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gaS5sZW5ndGg7IHMgPCBuOyBzKyspewogICAgICAgICAgICBsZXQgciA9IGlbc107CiAgICAgICAgICAgIGUub2JqZWN0LmxldmVscy5wdXNoKHsKICAgICAgICAgICAgICAgIG9iamVjdDogci5vYmplY3QudXVpZCwKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiByLmRpc3RhbmNlLAogICAgICAgICAgICAgICAgaHlzdGVyZXNpczogci5oeXN0ZXJlc2lzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KfSwgV2EgPSBuZXcgdywgSGEgPSBuZXcgb3QsIHFhID0gbmV3IG90LCBFdSA9IG5ldyB3LCBHYSA9IG5ldyBELCB2cyA9IG5ldyB3LCBRbiA9IG5ldyBodCwgWGEgPSBuZXcgRCwgam4gPSBuZXcgTGUsIFNyID0gY2xhc3MgZXh0ZW5kcyBDdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc1NraW5uZWRNZXNoID0gITAsIHRoaXMudHlwZSA9ICJTa2lubmVkTWVzaCIsIHRoaXMuYmluZE1vZGUgPSBvYSwgdGhpcy5iaW5kTWF0cml4ID0gbmV3IEQsIHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgRCwgdGhpcy5ib3VuZGluZ0JveCA9IG51bGwsIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nQm94KCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nQm94ID0gbmV3IGZ0KSwgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsKICAgICAgICBsZXQgZSA9IHQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpOwogICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBlLmNvdW50OyBpKyspdGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbihpLCB2cyksIHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCh2cyk7CiAgICB9CiAgICBjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmdlb21ldHJ5OwogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgJiYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgaHQpLCB0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpOwogICAgICAgIGxldCBlID0gdC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGUuY291bnQ7IGkrKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKGksIHZzKSwgdGhpcy5ib3VuZGluZ1NwaGVyZS5leHBhbmRCeVBvaW50KHZzKTsKICAgIH0KICAgIGNvcHkodCwgZSkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsIGUpLCB0aGlzLmJpbmRNb2RlID0gdC5iaW5kTW9kZSwgdGhpcy5iaW5kTWF0cml4LmNvcHkodC5iaW5kTWF0cml4KSwgdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHQuYmluZE1hdHJpeEludmVyc2UpLCB0aGlzLnNrZWxldG9uID0gdC5za2VsZXRvbiwgdC5ib3VuZGluZ0JveCAhPT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ0JveCA9IHQuYm91bmRpbmdCb3guY2xvbmUoKSksIHQuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgJiYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPSB0LmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLCB0aGlzOwogICAgfQogICAgcmF5Y2FzdCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLm1hdGVyaWFsLCBzID0gdGhpcy5tYXRyaXhXb3JsZDsKICAgICAgICBpICE9PSB2b2lkIDAgJiYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgJiYgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgUW4uY29weSh0aGlzLmJvdW5kaW5nU3BoZXJlKSwgUW4uYXBwbHlNYXRyaXg0KHMpLCB0LnJheS5pbnRlcnNlY3RzU3BoZXJlKFFuKSAhPT0gITEgJiYgKFhhLmNvcHkocykuaW52ZXJ0KCksIGpuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChYYSksICEodGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCAmJiBqbi5pbnRlcnNlY3RzQm94KHRoaXMuYm91bmRpbmdCb3gpID09PSAhMSkgJiYgdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCwgZSwgam4pKSk7CiAgICB9CiAgICBnZXRWZXJ0ZXhQb3NpdGlvbih0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKHQsIGUpLCB0aGlzLmFwcGx5Qm9uZVRyYW5zZm9ybSh0LCBlKSwgZTsKICAgIH0KICAgIGJpbmQodCwgZSkgewogICAgICAgIHRoaXMuc2tlbGV0b24gPSB0LCBlID09PSB2b2lkIDAgJiYgKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLCB0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCksIGUgPSB0aGlzLm1hdHJpeFdvcmxkKSwgdGhpcy5iaW5kTWF0cml4LmNvcHkoZSksIHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weShlKS5pbnZlcnQoKTsKICAgIH0KICAgIHBvc2UoKSB7CiAgICAgICAgdGhpcy5za2VsZXRvbi5wb3NlKCk7CiAgICB9CiAgICBub3JtYWxpemVTa2luV2VpZ2h0cygpIHsKICAgICAgICBsZXQgdCA9IG5ldyBvdCwgZSA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0OwogICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSBlLmNvdW50OyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIGkpOwogICAgICAgICAgICBsZXQgbiA9IDEgLyB0Lm1hbmhhdHRhbkxlbmd0aCgpOwogICAgICAgICAgICBuICE9PSAxIC8gMCA/IHQubXVsdGlwbHlTY2FsYXIobikgOiB0LnNldCgxLCAwLCAwLCAwKSwgZS5zZXRYWVpXKGksIHQueCwgdC55LCB0LnosIHQudyk7CiAgICAgICAgfQogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQodCkgewogICAgICAgIHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLCB0aGlzLmJpbmRNb2RlID09PSBvYSA/IHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSA6IHRoaXMuYmluZE1vZGUgPT09IFdsID8gdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCkgOiBjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIgKyB0aGlzLmJpbmRNb2RlKTsKICAgIH0KICAgIGFwcGx5Qm9uZVRyYW5zZm9ybSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLnNrZWxldG9uLCBzID0gdGhpcy5nZW9tZXRyeTsKICAgICAgICBIYS5mcm9tQnVmZmVyQXR0cmlidXRlKHMuYXR0cmlidXRlcy5za2luSW5kZXgsIHQpLCBxYS5mcm9tQnVmZmVyQXR0cmlidXRlKHMuYXR0cmlidXRlcy5za2luV2VpZ2h0LCB0KSwgV2EuY29weShlKS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4KSwgZS5zZXQoMCwgMCwgMCk7CiAgICAgICAgZm9yKGxldCBuID0gMDsgbiA8IDQ7IG4rKyl7CiAgICAgICAgICAgIGxldCByID0gcWEuZ2V0Q29tcG9uZW50KG4pOwogICAgICAgICAgICBpZiAociAhPT0gMCkgewogICAgICAgICAgICAgICAgbGV0IG8gPSBIYS5nZXRDb21wb25lbnQobik7CiAgICAgICAgICAgICAgICBHYS5tdWx0aXBseU1hdHJpY2VzKGkuYm9uZXNbb10ubWF0cml4V29ybGQsIGkuYm9uZUludmVyc2VzW29dKSwgZS5hZGRTY2FsZWRWZWN0b3IoRXUuY29weShXYSkuYXBwbHlNYXRyaXg0KEdhKSwgcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeEludmVyc2UpOwogICAgfQp9LCBlbiA9IGNsYXNzIGV4dGVuZHMgRyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNCb25lID0gITAsIHRoaXMudHlwZSA9ICJCb25lIjsKICAgIH0KfSwgTHQgPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBudWxsLCBlID0gMSwgaSA9IDEsIHMsIG4sIHIsIG8sIGEsIGwgPSBVdCwgYyA9IFV0LCB1LCBkKXsKICAgICAgICBzdXBlcihudWxsLCByLCBvLCBhLCBsLCBjLCBzLCBuLCB1LCBkKSwgdGhpcy5pc0RhdGFUZXh0dXJlID0gITAsIHRoaXMuaW1hZ2UgPSB7CiAgICAgICAgICAgIGRhdGE6IHQsCiAgICAgICAgICAgIHdpZHRoOiBlLAogICAgICAgICAgICBoZWlnaHQ6IGkKICAgICAgICB9LCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9ICExLCB0aGlzLmZsaXBZID0gITEsIHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTsKICAgIH0KfSwgSmEgPSBuZXcgRCwgUnUgPSBuZXcgRCwgVHIgPSBjbGFzcyBoIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBbXSwgZSA9IFtdKXsKICAgICAgICB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLmJvbmVzID0gdC5zbGljZSgwKSwgdGhpcy5ib25lSW52ZXJzZXMgPSBlLCB0aGlzLmJvbmVNYXRyaWNlcyA9IG51bGwsIHRoaXMuYm9uZVRleHR1cmUgPSBudWxsLCB0aGlzLmluaXQoKTsKICAgIH0KICAgIGluaXQoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmJvbmVzLCBlID0gdGhpcy5ib25lSW52ZXJzZXM7CiAgICAgICAgaWYgKHRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCAqIDE2KSwgZS5sZW5ndGggPT09IDApIHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTsKICAgICAgICBlbHNlIGlmICh0Lmxlbmd0aCAhPT0gZS5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksIHRoaXMuYm9uZUludmVyc2VzID0gW107CiAgICAgICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IHM7IGkrKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBEKTsKICAgICAgICB9CiAgICB9CiAgICBjYWxjdWxhdGVJbnZlcnNlcygpIHsKICAgICAgICB0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGggPSAwOwogICAgICAgIGZvcihsZXQgdCA9IDAsIGUgPSB0aGlzLmJvbmVzLmxlbmd0aDsgdCA8IGU7IHQrKyl7CiAgICAgICAgICAgIGxldCBpID0gbmV3IEQ7CiAgICAgICAgICAgIHRoaXMuYm9uZXNbdF0gJiYgaS5jb3B5KHRoaXMuYm9uZXNbdF0ubWF0cml4V29ybGQpLmludmVydCgpLCB0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGkpOwogICAgICAgIH0KICAgIH0KICAgIHBvc2UoKSB7CiAgICAgICAgZm9yKGxldCB0ID0gMCwgZSA9IHRoaXMuYm9uZXMubGVuZ3RoOyB0IDwgZTsgdCsrKXsKICAgICAgICAgICAgbGV0IGkgPSB0aGlzLmJvbmVzW3RdOwogICAgICAgICAgICBpICYmIGkubWF0cml4V29ybGQuY29weSh0aGlzLmJvbmVJbnZlcnNlc1t0XSkuaW52ZXJ0KCk7CiAgICAgICAgfQogICAgICAgIGZvcihsZXQgdCA9IDAsIGUgPSB0aGlzLmJvbmVzLmxlbmd0aDsgdCA8IGU7IHQrKyl7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5ib25lc1t0XTsKICAgICAgICAgICAgaSAmJiAoaS5wYXJlbnQgJiYgaS5wYXJlbnQuaXNCb25lID8gKGkubWF0cml4LmNvcHkoaS5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLCBpLm1hdHJpeC5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSkgOiBpLm1hdHJpeC5jb3B5KGkubWF0cml4V29ybGQpLCBpLm1hdHJpeC5kZWNvbXBvc2UoaS5wb3NpdGlvbiwgaS5xdWF0ZXJuaW9uLCBpLnNjYWxlKSk7CiAgICAgICAgfQogICAgfQogICAgdXBkYXRlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5ib25lcywgZSA9IHRoaXMuYm9uZUludmVyc2VzLCBpID0gdGhpcy5ib25lTWF0cmljZXMsIHMgPSB0aGlzLmJvbmVUZXh0dXJlOwogICAgICAgIGZvcihsZXQgbiA9IDAsIHIgPSB0Lmxlbmd0aDsgbiA8IHI7IG4rKyl7CiAgICAgICAgICAgIGxldCBvID0gdFtuXSA/IHRbbl0ubWF0cml4V29ybGQgOiBSdTsKICAgICAgICAgICAgSmEubXVsdGlwbHlNYXRyaWNlcyhvLCBlW25dKSwgSmEudG9BcnJheShpLCBuICogMTYpOwogICAgICAgIH0KICAgICAgICBzICE9PSBudWxsICYmIChzLm5lZWRzVXBkYXRlID0gITApOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzKTsKICAgIH0KICAgIGNvbXB1dGVCb25lVGV4dHVyZSgpIHsKICAgICAgICBsZXQgdCA9IE1hdGguc3FydCh0aGlzLmJvbmVzLmxlbmd0aCAqIDQpOwogICAgICAgIHQgPSBNYXRoLmNlaWwodCAvIDQpICogNCwgdCA9IE1hdGgubWF4KHQsIDQpOwogICAgICAgIGxldCBlID0gbmV3IEZsb2F0MzJBcnJheSh0ICogdCAqIDQpOwogICAgICAgIGUuc2V0KHRoaXMuYm9uZU1hdHJpY2VzKTsKICAgICAgICBsZXQgaSA9IG5ldyBMdChlLCB0LCB0LCBMaSwgcGkpOwogICAgICAgIHJldHVybiBpLm5lZWRzVXBkYXRlID0gITAsIHRoaXMuYm9uZU1hdHJpY2VzID0gZSwgdGhpcy5ib25lVGV4dHVyZSA9IGksIHRoaXM7CiAgICB9CiAgICBnZXRCb25lQnlOYW1lKHQpIHsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdGhpcy5ib25lcy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHRoaXMuYm9uZXNbZV07CiAgICAgICAgICAgIGlmIChzLm5hbWUgPT09IHQpIHJldHVybiBzOwogICAgICAgIH0KICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5ib25lVGV4dHVyZSAhPT0gbnVsbCAmJiAodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksIHRoaXMuYm9uZVRleHR1cmUgPSBudWxsKTsKICAgIH0KICAgIGZyb21KU09OKHQsIGUpIHsKICAgICAgICB0aGlzLnV1aWQgPSB0LnV1aWQ7CiAgICAgICAgZm9yKGxldCBpID0gMCwgcyA9IHQuYm9uZXMubGVuZ3RoOyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgbGV0IG4gPSB0LmJvbmVzW2ldLCByID0gZVtuXTsKICAgICAgICAgICAgciA9PT0gdm9pZCAwICYmIChjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiBObyBib25lIGZvdW5kIHdpdGggVVVJRDoiLCBuKSwgciA9IG5ldyBlbiksIHRoaXMuYm9uZXMucHVzaChyKSwgdGhpcy5ib25lSW52ZXJzZXMucHVzaChuZXcgRCgpLmZyb21BcnJheSh0LmJvbmVJbnZlcnNlc1tpXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5pbml0KCksIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSB7CiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uOiA0LjYsCiAgICAgICAgICAgICAgICB0eXBlOiAiU2tlbGV0b24iLAogICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAiU2tlbGV0b24udG9KU09OIgogICAgICAgICAgICB9LAogICAgICAgICAgICBib25lczogW10sCiAgICAgICAgICAgIGJvbmVJbnZlcnNlczogW10KICAgICAgICB9OwogICAgICAgIHQudXVpZCA9IHRoaXMudXVpZDsKICAgICAgICBsZXQgZSA9IHRoaXMuYm9uZXMsIGkgPSB0aGlzLmJvbmVJbnZlcnNlczsKICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gZS5sZW5ndGg7IHMgPCBuOyBzKyspewogICAgICAgICAgICBsZXQgciA9IGVbc107CiAgICAgICAgICAgIHQuYm9uZXMucHVzaChyLnV1aWQpOwogICAgICAgICAgICBsZXQgbyA9IGlbc107CiAgICAgICAgICAgIHQuYm9uZUludmVyc2VzLnB1c2goby50b0FycmF5KCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH0KfSwgVWUgPSBjbGFzcyBleHRlbmRzIFogewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcyA9IDEpewogICAgICAgIHN1cGVyKHQsIGUsIGkpLCB0aGlzLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gITAsIHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHM7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gdC5tZXNoUGVyQXR0cmlidXRlLCB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gc3VwZXIudG9KU09OKCk7CiAgICAgICAgcmV0dXJuIHQubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZSwgdC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9ICEwLCB0OwogICAgfQp9LCBhaSA9IG5ldyBELCBaYSA9IG5ldyBELCBBcyA9IFtdLCBZYSA9IG5ldyBmdCwga3UgPSBuZXcgRCwgQmkgPSBuZXcgQ3QsIEVpID0gbmV3IGh0LCBJciA9IGNsYXNzIGV4dGVuZHMgQ3QgewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuaXNJbnN0YW5jZWRNZXNoID0gITAsIHRoaXMuaW5zdGFuY2VNYXRyaXggPSBuZXcgVWUobmV3IEZsb2F0MzJBcnJheShpICogMTYpLCAxNiksIHRoaXMuaW5zdGFuY2VDb2xvciA9IG51bGwsIHRoaXMubW9ycGhUZXh0dXJlID0gbnVsbCwgdGhpcy5jb3VudCA9IGksIHRoaXMuYm91bmRpbmdCb3ggPSBudWxsLCB0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKICAgICAgICBmb3IobGV0IHMgPSAwOyBzIDwgaTsgcysrKXRoaXMuc2V0TWF0cml4QXQocywga3UpOwogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nQm94KCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZW9tZXRyeSwgZSA9IHRoaXMuY291bnQ7CiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ0JveCA9IG5ldyBmdCksIHQuYm91bmRpbmdCb3ggPT09IG51bGwgJiYgdC5jb21wdXRlQm91bmRpbmdCb3goKSwgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZTsgaSsrKXRoaXMuZ2V0TWF0cml4QXQoaSwgYWkpLCBZYS5jb3B5KHQuYm91bmRpbmdCb3gpLmFwcGx5TWF0cml4NChhaSksIHRoaXMuYm91bmRpbmdCb3gudW5pb24oWWEpOwogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZW9tZXRyeSwgZSA9IHRoaXMuY291bnQ7CiAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBodCksIHQuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgJiYgdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgdGhpcy5ib3VuZGluZ1NwaGVyZS5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZTsgaSsrKXRoaXMuZ2V0TWF0cml4QXQoaSwgYWkpLCBFaS5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChhaSksIHRoaXMuYm91bmRpbmdTcGhlcmUudW5pb24oRWkpOwogICAgfQogICAgY29weSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCwgZSksIHRoaXMuaW5zdGFuY2VNYXRyaXguY29weSh0Lmluc3RhbmNlTWF0cml4KSwgdC5tb3JwaFRleHR1cmUgIT09IG51bGwgJiYgKHRoaXMubW9ycGhUZXh0dXJlID0gdC5tb3JwaFRleHR1cmUuY2xvbmUoKSksIHQuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCAmJiAodGhpcy5pbnN0YW5jZUNvbG9yID0gdC5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLCB0aGlzLmNvdW50ID0gdC5jb3VudCwgdC5ib3VuZGluZ0JveCAhPT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ0JveCA9IHQuYm91bmRpbmdCb3guY2xvbmUoKSksIHQuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgJiYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPSB0LmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLCB0aGlzOwogICAgfQogICAgZ2V0Q29sb3JBdCh0LCBlKSB7CiAgICAgICAgZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCB0ICogMyk7CiAgICB9CiAgICBnZXRNYXRyaXhBdCh0LCBlKSB7CiAgICAgICAgZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwgdCAqIDE2KTsKICAgIH0KICAgIGdldE1vcnBoQXQodCwgZSkgewogICAgICAgIGxldCBpID0gZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMsIHMgPSB0aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhLCBuID0gaS5sZW5ndGggKyAxLCByID0gdCAqIG4gKyAxOwogICAgICAgIGZvcihsZXQgbyA9IDA7IG8gPCBpLmxlbmd0aDsgbysrKWlbb10gPSBzW3IgKyBvXTsKICAgIH0KICAgIHJheWNhc3QodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5tYXRyaXhXb3JsZCwgcyA9IHRoaXMuY291bnQ7CiAgICAgICAgaWYgKEJpLmdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeSwgQmkubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsLCBCaS5tYXRlcmlhbCAhPT0gdm9pZCAwICYmICh0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmIHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksIEVpLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksIEVpLmFwcGx5TWF0cml4NChpKSwgdC5yYXkuaW50ZXJzZWN0c1NwaGVyZShFaSkgIT09ICExKSkgZm9yKGxldCBuID0gMDsgbiA8IHM7IG4rKyl7CiAgICAgICAgICAgIHRoaXMuZ2V0TWF0cml4QXQobiwgYWkpLCBaYS5tdWx0aXBseU1hdHJpY2VzKGksIGFpKSwgQmkubWF0cml4V29ybGQgPSBaYSwgQmkucmF5Y2FzdCh0LCBBcyk7CiAgICAgICAgICAgIGZvcihsZXQgciA9IDAsIG8gPSBBcy5sZW5ndGg7IHIgPCBvOyByKyspewogICAgICAgICAgICAgICAgbGV0IGEgPSBBc1tyXTsKICAgICAgICAgICAgICAgIGEuaW5zdGFuY2VJZCA9IG4sIGEub2JqZWN0ID0gdGhpcywgZS5wdXNoKGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEFzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfQogICAgc2V0Q29sb3JBdCh0LCBlKSB7CiAgICAgICAgdGhpcy5pbnN0YW5jZUNvbG9yID09PSBudWxsICYmICh0aGlzLmluc3RhbmNlQ29sb3IgPSBuZXcgVWUobmV3IEZsb2F0MzJBcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmNvdW50ICogMykuZmlsbCgxKSwgMykpLCBlLnRvQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCB0ICogMyk7CiAgICB9CiAgICBzZXRNYXRyaXhBdCh0LCBlKSB7CiAgICAgICAgZS50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksIHQgKiAxNik7CiAgICB9CiAgICBzZXRNb3JwaEF0KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IGUubW9ycGhUYXJnZXRJbmZsdWVuY2VzLCBzID0gaS5sZW5ndGggKyAxOwogICAgICAgIHRoaXMubW9ycGhUZXh0dXJlID09PSBudWxsICYmICh0aGlzLm1vcnBoVGV4dHVyZSA9IG5ldyBMdChuZXcgRmxvYXQzMkFycmF5KHMgKiB0aGlzLmNvdW50KSwgcywgdGhpcy5jb3VudCwgVGwsIHBpKSk7CiAgICAgICAgbGV0IG4gPSB0aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhLCByID0gMDsKICAgICAgICBmb3IobGV0IGwgPSAwOyBsIDwgaS5sZW5ndGg7IGwrKylyICs9IGlbbF07CiAgICAgICAgbGV0IG8gPSB0aGlzLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID8gMSA6IDEgLSByLCBhID0gcyAqIHQ7CiAgICAgICAgblthXSA9IG8sIG4uc2V0KGksIGEgKyAxKTsKICAgIH0KICAgIHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHt9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAiZGlzcG9zZSIKICAgICAgICB9KSwgdGhpcy5tb3JwaFRleHR1cmUgIT09IG51bGwgJiYgKHRoaXMubW9ycGhUZXh0dXJlLmRpc3Bvc2UoKSwgdGhpcy5tb3JwaFRleHR1cmUgPSBudWxsKSwgdGhpczsKICAgIH0KfSwgS24gPSBuZXcgdywgUHUgPSBuZXcgdywgT3UgPSBuZXcgR3QsIHhlID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCA9IG5ldyB3KDEsIDAsIDApLCBlID0gMCl7CiAgICAgICAgdGhpcy5pc1BsYW5lID0gITAsIHRoaXMubm9ybWFsID0gdCwgdGhpcy5jb25zdGFudCA9IGU7CiAgICB9CiAgICBzZXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLCB0aGlzLmNvbnN0YW50ID0gZSwgdGhpczsKICAgIH0KICAgIHNldENvbXBvbmVudHModCwgZSwgaSwgcykgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbC5zZXQodCwgZSwgaSksIHRoaXMuY29uc3RhbnQgPSBzLCB0aGlzOwogICAgfQogICAgc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLCB0aGlzLmNvbnN0YW50ID0gLWUuZG90KHRoaXMubm9ybWFsKSwgdGhpczsKICAgIH0KICAgIHNldEZyb21Db3BsYW5hclBvaW50cyh0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSBLbi5zdWJWZWN0b3JzKGksIGUpLmNyb3NzKFB1LnN1YlZlY3RvcnModCwgZSkpLm5vcm1hbGl6ZSgpOwogICAgICAgIHJldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHMsIHQpLCB0aGlzOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLCB0aGlzLmNvbnN0YW50ID0gdC5jb25zdGFudCwgdGhpczsKICAgIH0KICAgIG5vcm1hbGl6ZSgpIHsKICAgICAgICBsZXQgdCA9IDEgLyB0aGlzLm5vcm1hbC5sZW5ndGgoKTsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksIHRoaXMuY29uc3RhbnQgKj0gdCwgdGhpczsKICAgIH0KICAgIG5lZ2F0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb25zdGFudCAqPSAtMSwgdGhpcy5ub3JtYWwubmVnYXRlKCksIHRoaXM7CiAgICB9CiAgICBkaXN0YW5jZVRvUG9pbnQodCkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbC5kb3QodCkgKyB0aGlzLmNvbnN0YW50OwogICAgfQogICAgZGlzdGFuY2VUb1NwaGVyZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKSAtIHQucmFkaXVzOwogICAgfQogICAgcHJvamVjdFBvaW50KHQsIGUpIHsKICAgICAgICByZXR1cm4gZS5jb3B5KHQpLmFkZFNjYWxlZFZlY3Rvcih0aGlzLm5vcm1hbCwgLXRoaXMuZGlzdGFuY2VUb1BvaW50KHQpKTsKICAgIH0KICAgIGludGVyc2VjdExpbmUodCwgZSkgewogICAgICAgIGxldCBpID0gdC5kZWx0YShLbiksIHMgPSB0aGlzLm5vcm1hbC5kb3QoaSk7CiAgICAgICAgaWYgKHMgPT09IDApIHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KSA9PT0gMCA/IGUuY29weSh0LnN0YXJ0KSA6IG51bGw7CiAgICAgICAgbGV0IG4gPSAtKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSArIHRoaXMuY29uc3RhbnQpIC8gczsKICAgICAgICByZXR1cm4gbiA8IDAgfHwgbiA+IDEgPyBudWxsIDogZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihpLCBuKTsKICAgIH0KICAgIGludGVyc2VjdHNMaW5lKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLCBpID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpOwogICAgICAgIHJldHVybiBlIDwgMCAmJiBpID4gMCB8fCBpIDwgMCAmJiBlID4gMDsKICAgIH0KICAgIGludGVyc2VjdHNCb3godCkgewogICAgICAgIHJldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKTsKICAgIH0KICAgIGludGVyc2VjdHNTcGhlcmUodCkgewogICAgICAgIHJldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKTsKICAgIH0KICAgIGNvcGxhbmFyUG9pbnQodCkgewogICAgICAgIHJldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KTsKICAgIH0KICAgIGFwcGx5TWF0cml4NCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSBlIHx8IE91LmdldE5vcm1hbE1hdHJpeCh0KSwgcyA9IHRoaXMuY29wbGFuYXJQb2ludChLbikuYXBwbHlNYXRyaXg0KHQpLCBuID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKGkpLm5vcm1hbGl6ZSgpOwogICAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50ID0gLXMuZG90KG4pLCB0aGlzOwogICAgfQogICAgdHJhbnNsYXRlKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb25zdGFudCAtPSB0LmRvdCh0aGlzLm5vcm1hbCksIHRoaXM7CiAgICB9CiAgICBlcXVhbHModCkgewogICAgICAgIHJldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpICYmIHQuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQ7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQp9LCB6ZSA9IG5ldyBodCwgU3MgPSBuZXcgdywgc24gPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IHhlLCBlID0gbmV3IHhlLCBpID0gbmV3IHhlLCBzID0gbmV3IHhlLCBuID0gbmV3IHhlLCByID0gbmV3IHhlKXsKICAgICAgICB0aGlzLnBsYW5lcyA9IFsKICAgICAgICAgICAgdCwKICAgICAgICAgICAgZSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgcywKICAgICAgICAgICAgbiwKICAgICAgICAgICAgcgogICAgICAgIF07CiAgICB9CiAgICBzZXQodCwgZSwgaSwgcywgbiwgcikgewogICAgICAgIGxldCBvID0gdGhpcy5wbGFuZXM7CiAgICAgICAgcmV0dXJuIG9bMF0uY29weSh0KSwgb1sxXS5jb3B5KGUpLCBvWzJdLmNvcHkoaSksIG9bM10uY29weShzKSwgb1s0XS5jb3B5KG4pLCBvWzVdLmNvcHkociksIHRoaXM7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMucGxhbmVzOwogICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCA2OyBpKyspZVtpXS5jb3B5KHQucGxhbmVzW2ldKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHQsIGUgPSBvZSkgewogICAgICAgIGxldCBpID0gdGhpcy5wbGFuZXMsIHMgPSB0LmVsZW1lbnRzLCBuID0gc1swXSwgciA9IHNbMV0sIG8gPSBzWzJdLCBhID0gc1szXSwgbCA9IHNbNF0sIGMgPSBzWzVdLCB1ID0gc1s2XSwgZCA9IHNbN10sIHAgPSBzWzhdLCBmID0gc1s5XSwgbSA9IHNbMTBdLCB5MSA9IHNbMTFdLCBnID0gc1sxMl0sIHgxID0gc1sxM10sIGIgPSBzWzE0XSwgTSA9IHNbMTVdOwogICAgICAgIGlmIChpWzBdLnNldENvbXBvbmVudHMoYSAtIG4sIGQgLSBsLCB5MSAtIHAsIE0gLSBnKS5ub3JtYWxpemUoKSwgaVsxXS5zZXRDb21wb25lbnRzKGEgKyBuLCBkICsgbCwgeTEgKyBwLCBNICsgZykubm9ybWFsaXplKCksIGlbMl0uc2V0Q29tcG9uZW50cyhhICsgciwgZCArIGMsIHkxICsgZiwgTSArIHgxKS5ub3JtYWxpemUoKSwgaVszXS5zZXRDb21wb25lbnRzKGEgLSByLCBkIC0gYywgeTEgLSBmLCBNIC0geDEpLm5vcm1hbGl6ZSgpLCBpWzRdLnNldENvbXBvbmVudHMoYSAtIG8sIGQgLSB1LCB5MSAtIG0sIE0gLSBiKS5ub3JtYWxpemUoKSwgZSA9PT0gb2UpIGlbNV0uc2V0Q29tcG9uZW50cyhhICsgbywgZCArIHUsIHkxICsgbSwgTSArIGIpLm5vcm1hbGl6ZSgpOwogICAgICAgIGVsc2UgaWYgKGUgPT09IFpzKSBpWzVdLnNldENvbXBvbmVudHMobywgdSwgbSwgYikubm9ybWFsaXplKCk7CiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIiArIGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaW50ZXJzZWN0c09iamVjdCh0KSB7CiAgICAgICAgaWYgKHQuYm91bmRpbmdTcGhlcmUgIT09IHZvaWQgMCkgdC5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCAmJiB0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLCB6ZS5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGV0IGUgPSB0Lmdlb21ldHJ5OwogICAgICAgICAgICBlLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmIGUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksIHplLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHplKTsKICAgIH0KICAgIGludGVyc2VjdHNTcHJpdGUodCkgewogICAgICAgIHJldHVybiB6ZS5jZW50ZXIuc2V0KDAsIDAsIDApLCB6ZS5yYWRpdXMgPSAuNzA3MTA2NzgxMTg2NTQ3NiwgemUuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLCB0aGlzLmludGVyc2VjdHNTcGhlcmUoemUpOwogICAgfQogICAgaW50ZXJzZWN0c1NwaGVyZSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLnBsYW5lcywgaSA9IHQuY2VudGVyLCBzID0gLXQucmFkaXVzOwogICAgICAgIGZvcihsZXQgbiA9IDA7IG4gPCA2OyBuKyspaWYgKGVbbl0uZGlzdGFuY2VUb1BvaW50KGkpIDwgcykgcmV0dXJuICExOwogICAgICAgIHJldHVybiAhMDsKICAgIH0KICAgIGludGVyc2VjdHNCb3godCkgewogICAgICAgIGxldCBlID0gdGhpcy5wbGFuZXM7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IDY7IGkrKyl7CiAgICAgICAgICAgIGxldCBzID0gZVtpXTsKICAgICAgICAgICAgaWYgKFNzLnggPSBzLm5vcm1hbC54ID4gMCA/IHQubWF4LnggOiB0Lm1pbi54LCBTcy55ID0gcy5ub3JtYWwueSA+IDAgPyB0Lm1heC55IDogdC5taW4ueSwgU3MueiA9IHMubm9ybWFsLnogPiAwID8gdC5tYXgueiA6IHQubWluLnosIHMuZGlzdGFuY2VUb1BvaW50KFNzKSA8IDApIHJldHVybiAhMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICEwOwogICAgfQogICAgY29udGFpbnNQb2ludCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLnBsYW5lczsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgNjsgaSsrKWlmIChlW2ldLmRpc3RhbmNlVG9Qb2ludCh0KSA8IDApIHJldHVybiAhMTsKICAgICAgICByZXR1cm4gITA7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQp9OwpmdW5jdGlvbiB0cihoLCB0KSB7CiAgICByZXR1cm4gaCAtIHQ7Cn0KZnVuY3Rpb24gTnUoaCwgdCkgewogICAgcmV0dXJuIGgueiAtIHQuejsKfQpmdW5jdGlvbiBWdShoLCB0KSB7CiAgICByZXR1cm4gdC56IC0gaC56Owp9CnZhciBDciA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgdGhpcy5pbmRleCA9IDAsIHRoaXMucG9vbCA9IFtdLCB0aGlzLmxpc3QgPSBbXTsKICAgIH0KICAgIHB1c2godCwgZSwgaSwgcykgewogICAgICAgIGxldCBuID0gdGhpcy5wb29sLCByID0gdGhpcy5saXN0OwogICAgICAgIHRoaXMuaW5kZXggPj0gbi5sZW5ndGggJiYgbi5wdXNoKHsKICAgICAgICAgICAgc3RhcnQ6IC0xLAogICAgICAgICAgICBjb3VudDogLTEsCiAgICAgICAgICAgIHo6IC0xLAogICAgICAgICAgICBpbmRleDogLTEKICAgICAgICB9KTsKICAgICAgICBsZXQgbyA9IG5bdGhpcy5pbmRleF07CiAgICAgICAgci5wdXNoKG8pLCB0aGlzLmluZGV4KyssIG8uc3RhcnQgPSB0LCBvLmNvdW50ID0gZSwgby56ID0gaSwgby5pbmRleCA9IHM7CiAgICB9CiAgICByZXNldCgpIHsKICAgICAgICB0aGlzLmxpc3QubGVuZ3RoID0gMCwgdGhpcy5pbmRleCA9IDA7CiAgICB9Cn0sIE10ID0gbmV3IEQsIER1ID0gbmV3IFAoMSwgMSwgMSksIGVyID0gbmV3IHNuLCBUcyA9IG5ldyBmdCwgRmUgPSBuZXcgaHQsIFJpID0gbmV3IHcsICRhID0gbmV3IHcsIEx1ID0gbmV3IHcsIGlyID0gbmV3IENyLCBwdCA9IG5ldyBDdCwgSXMgPSBbXTsKZnVuY3Rpb24gVXUoaCwgdCwgZSA9IDApIHsKICAgIGxldCBpID0gdC5pdGVtU2l6ZTsKICAgIGlmIChoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfHwgaC5hcnJheS5jb25zdHJ1Y3RvciAhPT0gdC5hcnJheS5jb25zdHJ1Y3RvcikgewogICAgICAgIGxldCBzID0gaC5jb3VudDsKICAgICAgICBmb3IobGV0IG4gPSAwOyBuIDwgczsgbisrKWZvcihsZXQgciA9IDA7IHIgPCBpOyByKyspdC5zZXRDb21wb25lbnQobiArIGUsIHIsIGguZ2V0Q29tcG9uZW50KG4sIHIpKTsKICAgIH0gZWxzZSB0LmFycmF5LnNldChoLmFycmF5LCBlICogaSk7CiAgICB0Lm5lZWRzVXBkYXRlID0gITA7Cn0KZnVuY3Rpb24gQmUoaCwgdCkgewogICAgaWYgKGguY29uc3RydWN0b3IgIT09IHQuY29uc3RydWN0b3IpIHsKICAgICAgICBsZXQgZSA9IE1hdGgubWluKGgubGVuZ3RoLCB0Lmxlbmd0aCk7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGU7IGkrKyl0W2ldID0gaFtpXTsKICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGUgPSBNYXRoLm1pbihoLmxlbmd0aCwgdC5sZW5ndGgpOwogICAgICAgIHQuc2V0KG5ldyBoLmNvbnN0cnVjdG9yKGguYnVmZmVyLCAwLCBlKSk7CiAgICB9Cn0KdmFyIHpyID0gY2xhc3MgZXh0ZW5kcyBDdCB7CiAgICBnZXQgbWF4SW5zdGFuY2VDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWF4SW5zdGFuY2VDb3VudDsKICAgIH0KICAgIGdldCBpbnN0YW5jZUNvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoIC0gdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoOwogICAgfQogICAgZ2V0IHVudXNlZFZlcnRleENvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9tYXhWZXJ0ZXhDb3VudCAtIHRoaXMuX25leHRWZXJ0ZXhTdGFydDsKICAgIH0KICAgIGdldCB1bnVzZWRJbmRleENvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9tYXhJbmRleENvdW50IC0gdGhpcy5fbmV4dEluZGV4U3RhcnQ7CiAgICB9CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpID0gZSAqIDIsIHMpewogICAgICAgIHN1cGVyKG5ldyBMLCBzKSwgdGhpcy5pc0JhdGNoZWRNZXNoID0gITAsIHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9ICEwLCB0aGlzLnNvcnRPYmplY3RzID0gITAsIHRoaXMuYm91bmRpbmdCb3ggPSBudWxsLCB0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbCwgdGhpcy5jdXN0b21Tb3J0ID0gbnVsbCwgdGhpcy5faW5zdGFuY2VJbmZvID0gW10sIHRoaXMuX2dlb21ldHJ5SW5mbyA9IFtdLCB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcyA9IFtdLCB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcyA9IFtdLCB0aGlzLl9uZXh0SW5kZXhTdGFydCA9IDAsIHRoaXMuX25leHRWZXJ0ZXhTdGFydCA9IDAsIHRoaXMuX2dlb21ldHJ5Q291bnQgPSAwLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9ICEwLCB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gITEsIHRoaXMuX21heEluc3RhbmNlQ291bnQgPSB0LCB0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IGUsIHRoaXMuX21heEluZGV4Q291bnQgPSBpLCB0aGlzLl9tdWx0aURyYXdDb3VudHMgPSBuZXcgSW50MzJBcnJheSh0KSwgdGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gbmV3IEludDMyQXJyYXkodCksIHRoaXMuX211bHRpRHJhd0NvdW50ID0gMCwgdGhpcy5fbXVsdGlEcmF3SW5zdGFuY2VzID0gbnVsbCwgdGhpcy5fbWF0cmljZXNUZXh0dXJlID0gbnVsbCwgdGhpcy5faW5kaXJlY3RUZXh0dXJlID0gbnVsbCwgdGhpcy5fY29sb3JzVGV4dHVyZSA9IG51bGwsIHRoaXMuX2luaXRNYXRyaWNlc1RleHR1cmUoKSwgdGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpOwogICAgfQogICAgX2luaXRNYXRyaWNlc1RleHR1cmUoKSB7CiAgICAgICAgbGV0IHQgPSBNYXRoLnNxcnQodGhpcy5fbWF4SW5zdGFuY2VDb3VudCAqIDQpOwogICAgICAgIHQgPSBNYXRoLmNlaWwodCAvIDQpICogNCwgdCA9IE1hdGgubWF4KHQsIDQpOwogICAgICAgIGxldCBlID0gbmV3IEZsb2F0MzJBcnJheSh0ICogdCAqIDQpLCBpID0gbmV3IEx0KGUsIHQsIHQsIExpLCBwaSk7CiAgICAgICAgdGhpcy5fbWF0cmljZXNUZXh0dXJlID0gaTsKICAgIH0KICAgIF9pbml0SW5kaXJlY3RUZXh0dXJlKCkgewogICAgICAgIGxldCB0ID0gTWF0aC5zcXJ0KHRoaXMuX21heEluc3RhbmNlQ291bnQpOwogICAgICAgIHQgPSBNYXRoLmNlaWwodCk7CiAgICAgICAgbGV0IGUgPSBuZXcgVWludDMyQXJyYXkodCAqIHQpLCBpID0gbmV3IEx0KGUsIHQsIHQsIElsLCBXbyk7CiAgICAgICAgdGhpcy5faW5kaXJlY3RUZXh0dXJlID0gaTsKICAgIH0KICAgIF9pbml0Q29sb3JzVGV4dHVyZSgpIHsKICAgICAgICBsZXQgdCA9IE1hdGguc3FydCh0aGlzLl9tYXhJbnN0YW5jZUNvdW50KTsKICAgICAgICB0ID0gTWF0aC5jZWlsKHQpOwogICAgICAgIGxldCBlID0gbmV3IEZsb2F0MzJBcnJheSh0ICogdCAqIDQpLmZpbGwoMSksIGkgPSBuZXcgTHQoZSwgdCwgdCwgTGksIHBpKTsKICAgICAgICBpLmNvbG9yU3BhY2UgPSBUdC53b3JraW5nQ29sb3JTcGFjZSwgdGhpcy5fY29sb3JzVGV4dHVyZSA9IGk7CiAgICB9CiAgICBfaW5pdGlhbGl6ZUdlb21ldHJ5KHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZ2VvbWV0cnksIGkgPSB0aGlzLl9tYXhWZXJ0ZXhDb3VudCwgcyA9IHRoaXMuX21heEluZGV4Q291bnQ7CiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPT09ICExKSB7CiAgICAgICAgICAgIGZvcihsZXQgbiBpbiB0LmF0dHJpYnV0ZXMpewogICAgICAgICAgICAgICAgbGV0IHIgPSB0LmdldEF0dHJpYnV0ZShuKSwgeyBhcnJheTogbyAsIGl0ZW1TaXplOiBhICwgbm9ybWFsaXplZDogbCAgfSA9IHIsIGMgPSBuZXcgby5jb25zdHJ1Y3RvcihpICogYSksIHUgPSBuZXcgWihjLCBhLCBsKTsKICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKG4sIHUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0LmdldEluZGV4KCkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGxldCBuID0gaSA+IDY1NTM1ID8gbmV3IFVpbnQzMkFycmF5KHMpIDogbmV3IFVpbnQxNkFycmF5KHMpOwogICAgICAgICAgICAgICAgZS5zZXRJbmRleChuZXcgWihuLCAxKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9ICEwOwogICAgICAgIH0KICAgIH0KICAgIF92YWxpZGF0ZUdlb21ldHJ5KHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgICAgaWYgKCEhdC5nZXRJbmRleCgpICE9ICEhZS5nZXRJbmRleCgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RIUkVFLkJhdGNoZWRNZXNoOiBBbGwgZ2VvbWV0cmllcyBtdXN0IGNvbnNpc3RlbnRseSBoYXZlICJpbmRleCIuJyk7CiAgICAgICAgZm9yKGxldCBpIGluIGUuYXR0cmlidXRlcyl7CiAgICAgICAgICAgIGlmICghdC5oYXNBdHRyaWJ1dGUoaSkpIHRocm93IG5ldyBFcnJvcihgVEhSRUUuQmF0Y2hlZE1lc2g6IEFkZGVkIGdlb21ldHJ5IG1pc3NpbmcgIiR7aX0iLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29uc2lzdGVudCBhdHRyaWJ1dGVzLmApOwogICAgICAgICAgICBsZXQgcyA9IHQuZ2V0QXR0cmlidXRlKGkpLCBuID0gZS5nZXRBdHRyaWJ1dGUoaSk7CiAgICAgICAgICAgIGlmIChzLml0ZW1TaXplICE9PSBuLml0ZW1TaXplIHx8IHMubm9ybWFsaXplZCAhPT0gbi5ub3JtYWxpemVkKSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBBbGwgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBjb25zaXN0ZW50IGl0ZW1TaXplIGFuZCBub3JtYWxpemVkIHZhbHVlLiIpOwogICAgICAgIH0KICAgIH0KICAgIHZhbGlkYXRlSW5zdGFuY2VJZCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgICAgaWYgKHQgPCAwIHx8IHQgPj0gZS5sZW5ndGggfHwgZVt0XS5hY3RpdmUgPT09ICExKSB0aHJvdyBuZXcgRXJyb3IoYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGluc3RhbmNlSWQgJHt0fS4gSW5zdGFuY2UgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmApOwogICAgfQogICAgdmFsaWRhdGVHZW9tZXRyeUlkKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgICBpZiAodCA8IDAgfHwgdCA+PSBlLmxlbmd0aCB8fCBlW3RdLmFjdGl2ZSA9PT0gITEpIHRocm93IG5ldyBFcnJvcihgVEhSRUUuQmF0Y2hlZE1lc2g6IEludmFsaWQgZ2VvbWV0cnlJZCAke3R9LiBHZW9tZXRyeSBpcyBlaXRoZXIgb3V0IG9mIHJhbmdlIG9yIGhhcyBiZWVuIGRlbGV0ZWQuYCk7CiAgICB9CiAgICBzZXRDdXN0b21Tb3J0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21Tb3J0ID0gdCwgdGhpczsKICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ0JveCgpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nQm94ID0gbmV3IGZ0KTsKICAgICAgICBsZXQgdCA9IHRoaXMuYm91bmRpbmdCb3gsIGUgPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgICAgdC5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspewogICAgICAgICAgICBpZiAoZVtpXS5hY3RpdmUgPT09ICExKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IG4gPSBlW2ldLmdlb21ldHJ5SW5kZXg7CiAgICAgICAgICAgIHRoaXMuZ2V0TWF0cml4QXQoaSwgTXQpLCB0aGlzLmdldEJvdW5kaW5nQm94QXQobiwgVHMpLmFwcGx5TWF0cml4NChNdCksIHQudW5pb24oVHMpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IGh0KTsKICAgICAgICBsZXQgdCA9IHRoaXMuYm91bmRpbmdTcGhlcmUsIGUgPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgICAgdC5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspewogICAgICAgICAgICBpZiAoZVtpXS5hY3RpdmUgPT09ICExKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IG4gPSBlW2ldLmdlb21ldHJ5SW5kZXg7CiAgICAgICAgICAgIHRoaXMuZ2V0TWF0cml4QXQoaSwgTXQpLCB0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQobiwgRmUpLmFwcGx5TWF0cml4NChNdCksIHQudW5pb24oRmUpOwogICAgICAgIH0KICAgIH0KICAgIGFkZEluc3RhbmNlKHQpIHsKICAgICAgICBpZiAodGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aCA+PSB0aGlzLm1heEluc3RhbmNlQ291bnQgJiYgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBNYXhpbXVtIGl0ZW0gY291bnQgcmVhY2hlZC4iKTsKICAgICAgICBsZXQgaSA9IHsKICAgICAgICAgICAgdmlzaWJsZTogITAsCiAgICAgICAgICAgIGFjdGl2ZTogITAsCiAgICAgICAgICAgIGdlb21ldHJ5SW5kZXg6IHQKICAgICAgICB9LCBzID0gbnVsbDsKICAgICAgICB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGggPiAwID8gKHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNvcnQodHIpLCBzID0gdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc2hpZnQoKSwgdGhpcy5faW5zdGFuY2VJbmZvW3NdID0gaSkgOiAocyA9IHRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGgsIHRoaXMuX2luc3RhbmNlSW5mby5wdXNoKGkpKTsKICAgICAgICBsZXQgbiA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZTsKICAgICAgICBNdC5pZGVudGl0eSgpLnRvQXJyYXkobi5pbWFnZS5kYXRhLCBzICogMTYpLCBuLm5lZWRzVXBkYXRlID0gITA7CiAgICAgICAgbGV0IHIgPSB0aGlzLl9jb2xvcnNUZXh0dXJlOwogICAgICAgIHJldHVybiByICYmIChEdS50b0FycmF5KHIuaW1hZ2UuZGF0YSwgcyAqIDQpLCByLm5lZWRzVXBkYXRlID0gITApLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9ICEwLCBzOwogICAgfQogICAgYWRkR2VvbWV0cnkodCwgZSA9IC0xLCBpID0gLTEpIHsKICAgICAgICB0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkodCksIHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkodCk7CiAgICAgICAgbGV0IHMgPSB7CiAgICAgICAgICAgIHZlcnRleFN0YXJ0OiAtMSwKICAgICAgICAgICAgdmVydGV4Q291bnQ6IC0xLAogICAgICAgICAgICByZXNlcnZlZFZlcnRleENvdW50OiAtMSwKICAgICAgICAgICAgaW5kZXhTdGFydDogLTEsCiAgICAgICAgICAgIGluZGV4Q291bnQ6IC0xLAogICAgICAgICAgICByZXNlcnZlZEluZGV4Q291bnQ6IC0xLAogICAgICAgICAgICBzdGFydDogLTEsCiAgICAgICAgICAgIGNvdW50OiAtMSwKICAgICAgICAgICAgYm91bmRpbmdCb3g6IG51bGwsCiAgICAgICAgICAgIGJvdW5kaW5nU3BoZXJlOiBudWxsLAogICAgICAgICAgICBhY3RpdmU6ICEwCiAgICAgICAgfSwgbiA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgICBzLnZlcnRleFN0YXJ0ID0gdGhpcy5fbmV4dFZlcnRleFN0YXJ0LCBzLnJlc2VydmVkVmVydGV4Q291bnQgPSBlID09PSAtMSA/IHQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmNvdW50IDogZTsKICAgICAgICBsZXQgciA9IHQuZ2V0SW5kZXgoKTsKICAgICAgICBpZiAociAhPT0gbnVsbCAmJiAocy5pbmRleFN0YXJ0ID0gdGhpcy5fbmV4dEluZGV4U3RhcnQsIHMucmVzZXJ2ZWRJbmRleENvdW50ID0gaSA9PT0gLTEgPyByLmNvdW50IDogaSksIHMuaW5kZXhTdGFydCAhPT0gLTEgJiYgcy5pbmRleFN0YXJ0ICsgcy5yZXNlcnZlZEluZGV4Q291bnQgPiB0aGlzLl9tYXhJbmRleENvdW50IHx8IHMudmVydGV4U3RhcnQgKyBzLnJlc2VydmVkVmVydGV4Q291bnQgPiB0aGlzLl9tYXhWZXJ0ZXhDb3VudCkgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogUmVzZXJ2ZWQgc3BhY2UgcmVxdWVzdCBleGNlZWRzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplLiIpOwogICAgICAgIGxldCBhOwogICAgICAgIHJldHVybiB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5sZW5ndGggPiAwID8gKHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNvcnQodHIpLCBhID0gdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc2hpZnQoKSwgblthXSA9IHMpIDogKGEgPSB0aGlzLl9nZW9tZXRyeUNvdW50LCB0aGlzLl9nZW9tZXRyeUNvdW50KyssIG4ucHVzaChzKSksIHRoaXMuc2V0R2VvbWV0cnlBdChhLCB0KSwgdGhpcy5fbmV4dEluZGV4U3RhcnQgPSBzLmluZGV4U3RhcnQgKyBzLnJlc2VydmVkSW5kZXhDb3VudCwgdGhpcy5fbmV4dFZlcnRleFN0YXJ0ID0gcy52ZXJ0ZXhTdGFydCArIHMucmVzZXJ2ZWRWZXJ0ZXhDb3VudCwgYTsKICAgIH0KICAgIHNldEdlb21ldHJ5QXQodCwgZSkgewogICAgICAgIGlmICh0ID49IHRoaXMuX2dlb21ldHJ5Q291bnQpIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IE1heGltdW0gZ2VvbWV0cnkgY291bnQgcmVhY2hlZC4iKTsKICAgICAgICB0aGlzLl92YWxpZGF0ZUdlb21ldHJ5KGUpOwogICAgICAgIGxldCBpID0gdGhpcy5nZW9tZXRyeSwgcyA9IGkuZ2V0SW5kZXgoKSAhPT0gbnVsbCwgbiA9IGkuZ2V0SW5kZXgoKSwgciA9IGUuZ2V0SW5kZXgoKSwgbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1t0XTsKICAgICAgICBpZiAocyAmJiByLmNvdW50ID4gby5yZXNlcnZlZEluZGV4Q291bnQgfHwgZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50ID4gby5yZXNlcnZlZFZlcnRleENvdW50KSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSBub3QgbGFyZ2UgZW5vdWdoIGZvciBwcm92aWRlZCBnZW9tZXRyeS4iKTsKICAgICAgICBsZXQgYSA9IG8udmVydGV4U3RhcnQsIGwgPSBvLnJlc2VydmVkVmVydGV4Q291bnQ7CiAgICAgICAgby52ZXJ0ZXhDb3VudCA9IGUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmNvdW50OwogICAgICAgIGZvcihsZXQgYyBpbiBpLmF0dHJpYnV0ZXMpewogICAgICAgICAgICBsZXQgdSA9IGUuZ2V0QXR0cmlidXRlKGMpLCBkID0gaS5nZXRBdHRyaWJ1dGUoYyk7CiAgICAgICAgICAgIFV1KHUsIGQsIGEpOwogICAgICAgICAgICBsZXQgcCA9IHUuaXRlbVNpemU7CiAgICAgICAgICAgIGZvcihsZXQgZiA9IHUuY291bnQsIG0gPSBsOyBmIDwgbTsgZisrKXsKICAgICAgICAgICAgICAgIGxldCB5MSA9IGEgKyBmOwogICAgICAgICAgICAgICAgZm9yKGxldCBnID0gMDsgZyA8IHA7IGcrKylkLnNldENvbXBvbmVudCh5MSwgZywgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZC5uZWVkc1VwZGF0ZSA9ICEwLCBkLmFkZFVwZGF0ZVJhbmdlKGEgKiBwLCBsICogcCk7CiAgICAgICAgfQogICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgIGxldCBjID0gby5pbmRleFN0YXJ0LCB1ID0gby5yZXNlcnZlZEluZGV4Q291bnQ7CiAgICAgICAgICAgIG8uaW5kZXhDb3VudCA9IGUuZ2V0SW5kZXgoKS5jb3VudDsKICAgICAgICAgICAgZm9yKGxldCBkID0gMDsgZCA8IHIuY291bnQ7IGQrKyluLnNldFgoYyArIGQsIGEgKyByLmdldFgoZCkpOwogICAgICAgICAgICBmb3IobGV0IGQgPSByLmNvdW50LCBwID0gdTsgZCA8IHA7IGQrKyluLnNldFgoYyArIGQsIGEpOwogICAgICAgICAgICBuLm5lZWRzVXBkYXRlID0gITAsIG4uYWRkVXBkYXRlUmFuZ2UoYywgby5yZXNlcnZlZEluZGV4Q291bnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gby5zdGFydCA9IHMgPyBvLmluZGV4U3RhcnQgOiBvLnZlcnRleFN0YXJ0LCBvLmNvdW50ID0gcyA/IG8uaW5kZXhDb3VudCA6IG8udmVydGV4Q291bnQsIG8uYm91bmRpbmdCb3ggPSBudWxsLCBlLmJvdW5kaW5nQm94ICE9PSBudWxsICYmIChvLmJvdW5kaW5nQm94ID0gZS5ib3VuZGluZ0JveC5jbG9uZSgpKSwgby5ib3VuZGluZ1NwaGVyZSA9IG51bGwsIGUuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgJiYgKG8uYm91bmRpbmdTcGhlcmUgPSBlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9ICEwLCB0OwogICAgfQogICAgZGVsZXRlR2VvbWV0cnkodCkgewogICAgICAgIGxldCBlID0gdGhpcy5fZ2VvbWV0cnlJbmZvOwogICAgICAgIGlmICh0ID49IGUubGVuZ3RoIHx8IGVbdF0uYWN0aXZlID09PSAhMSkgcmV0dXJuIHRoaXM7CiAgICAgICAgbGV0IGkgPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgICAgZm9yKGxldCBzID0gMCwgbiA9IGkubGVuZ3RoOyBzIDwgbjsgcysrKWlbc10uYWN0aXZlICYmIGlbc10uZ2VvbWV0cnlJbmRleCA9PT0gdCAmJiB0aGlzLmRlbGV0ZUluc3RhbmNlKHMpOwogICAgICAgIHJldHVybiBlW3RdLmFjdGl2ZSA9ICExLCB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5wdXNoKHQpLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9ICEwLCB0aGlzOwogICAgfQogICAgZGVsZXRlSW5zdGFuY2UodCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgdGhpcy5faW5zdGFuY2VJbmZvW3RdLmFjdGl2ZSA9ICExLCB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5wdXNoKHQpLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9ICEwLCB0aGlzOwogICAgfQogICAgb3B0aW1pemUoKSB7CiAgICAgICAgbGV0IHQgPSAwLCBlID0gMCwgaSA9IHRoaXMuX2dlb21ldHJ5SW5mbywgcyA9IGkubWFwKChyLCBvKT0+bykuc29ydCgociwgbyk9Pmlbcl0udmVydGV4U3RhcnQgLSBpW29dLnZlcnRleFN0YXJ0KSwgbiA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgICAgZm9yKGxldCByID0gMCwgbyA9IGkubGVuZ3RoOyByIDwgbzsgcisrKXsKICAgICAgICAgICAgbGV0IGEgPSBzW3JdLCBsID0gaVthXTsKICAgICAgICAgICAgaWYgKGwuYWN0aXZlICE9PSAhMSkgewogICAgICAgICAgICAgICAgaWYgKG4uaW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobC5pbmRleFN0YXJ0ICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7IGluZGV4U3RhcnQ6IGMgLCB2ZXJ0ZXhTdGFydDogdSAsIHJlc2VydmVkSW5kZXhDb3VudDogZCAgfSA9IGwsIHAgPSBuLmluZGV4LCBmID0gcC5hcnJheSwgbSA9IHQgLSB1OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHkxID0gYzsgeTEgPCBjICsgZDsgeTErKylmW3kxXSA9IGZbeTFdICsgbTsKICAgICAgICAgICAgICAgICAgICAgICAgcC5hcnJheS5jb3B5V2l0aGluKGUsIGMsIGMgKyBkKSwgcC5hZGRVcGRhdGVSYW5nZShlLCBkKSwgbC5pbmRleFN0YXJ0ID0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZSArPSBsLnJlc2VydmVkSW5kZXhDb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsLnZlcnRleFN0YXJ0ICE9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHsgdmVydGV4U3RhcnQ6IGMgLCByZXNlcnZlZFZlcnRleENvdW50OiB1ICB9ID0gbCwgZCA9IG4uYXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHAgaW4gZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmID0gZFtwXSwgeyBhcnJheTogbSAsIGl0ZW1TaXplOiB5MSAgfSA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgIG0uY29weVdpdGhpbih0ICogeTEsIGMgKiB5MSwgKGMgKyB1KSAqIHkxKSwgZi5hZGRVcGRhdGVSYW5nZSh0ICogeTEsIHUgKiB5MSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGwudmVydGV4U3RhcnQgPSB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdCArPSBsLnJlc2VydmVkVmVydGV4Q291bnQsIGwuc3RhcnQgPSBuLmluZGV4ID8gbC5pbmRleFN0YXJ0IDogbC52ZXJ0ZXhTdGFydCwgdGhpcy5fbmV4dEluZGV4U3RhcnQgPSBuLmluZGV4ID8gbC5pbmRleFN0YXJ0ICsgbC5yZXNlcnZlZEluZGV4Q291bnQgOiAwLCB0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSBsLnZlcnRleFN0YXJ0ICsgbC5yZXNlcnZlZFZlcnRleENvdW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0Qm91bmRpbmdCb3hBdCh0LCBlKSB7CiAgICAgICAgaWYgKHQgPj0gdGhpcy5fZ2VvbWV0cnlDb3VudCkgcmV0dXJuIG51bGw7CiAgICAgICAgbGV0IGkgPSB0aGlzLmdlb21ldHJ5LCBzID0gdGhpcy5fZ2VvbWV0cnlJbmZvW3RdOwogICAgICAgIGlmIChzLmJvdW5kaW5nQm94ID09PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBuID0gbmV3IGZ0LCByID0gaS5pbmRleCwgbyA9IGkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgICAgICAgZm9yKGxldCBhID0gcy5zdGFydCwgbCA9IHMuc3RhcnQgKyBzLmNvdW50OyBhIDwgbDsgYSsrKXsKICAgICAgICAgICAgICAgIGxldCBjID0gYTsKICAgICAgICAgICAgICAgIHIgJiYgKGMgPSByLmdldFgoYykpLCBuLmV4cGFuZEJ5UG9pbnQoUmkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLCBjKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcy5ib3VuZGluZ0JveCA9IG47CiAgICAgICAgfQogICAgICAgIHJldHVybiBlLmNvcHkocy5ib3VuZGluZ0JveCksIGU7CiAgICB9CiAgICBnZXRCb3VuZGluZ1NwaGVyZUF0KHQsIGUpIHsKICAgICAgICBpZiAodCA+PSB0aGlzLl9nZW9tZXRyeUNvdW50KSByZXR1cm4gbnVsbDsKICAgICAgICBsZXQgaSA9IHRoaXMuZ2VvbWV0cnksIHMgPSB0aGlzLl9nZW9tZXRyeUluZm9bdF07CiAgICAgICAgaWYgKHMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IG4gPSBuZXcgaHQ7CiAgICAgICAgICAgIHRoaXMuZ2V0Qm91bmRpbmdCb3hBdCh0LCBUcyksIFRzLmdldENlbnRlcihuLmNlbnRlcik7CiAgICAgICAgICAgIGxldCByID0gaS5pbmRleCwgbyA9IGkuYXR0cmlidXRlcy5wb3NpdGlvbiwgYSA9IDA7CiAgICAgICAgICAgIGZvcihsZXQgbCA9IHMuc3RhcnQsIGMgPSBzLnN0YXJ0ICsgcy5jb3VudDsgbCA8IGM7IGwrKyl7CiAgICAgICAgICAgICAgICBsZXQgdSA9IGw7CiAgICAgICAgICAgICAgICByICYmICh1ID0gci5nZXRYKHUpKSwgUmkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLCB1KSwgYSA9IE1hdGgubWF4KGEsIG4uY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKFJpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbi5yYWRpdXMgPSBNYXRoLnNxcnQoYSksIHMuYm91bmRpbmdTcGhlcmUgPSBuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZS5jb3B5KHMuYm91bmRpbmdTcGhlcmUpLCBlOwogICAgfQogICAgc2V0TWF0cml4QXQodCwgZSkgewogICAgICAgIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpOwogICAgICAgIGxldCBpID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLCBzID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7CiAgICAgICAgcmV0dXJuIGUudG9BcnJheShzLCB0ICogMTYpLCBpLm5lZWRzVXBkYXRlID0gITAsIHRoaXM7CiAgICB9CiAgICBnZXRNYXRyaXhBdCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpLCBlLmZyb21BcnJheSh0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSwgdCAqIDE2KTsKICAgIH0KICAgIHNldENvbG9yQXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgdGhpcy5fY29sb3JzVGV4dHVyZSA9PT0gbnVsbCAmJiB0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpLCBlLnRvQXJyYXkodGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCB0ICogNCksIHRoaXMuX2NvbG9yc1RleHR1cmUubmVlZHNVcGRhdGUgPSAhMCwgdGhpczsKICAgIH0KICAgIGdldENvbG9yQXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgZS5mcm9tQXJyYXkodGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCB0ICogNCk7CiAgICB9CiAgICBzZXRWaXNpYmxlQXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgdGhpcy5faW5zdGFuY2VJbmZvW3RdLnZpc2libGUgPT09IGUgPyB0aGlzIDogKHRoaXMuX2luc3RhbmNlSW5mb1t0XS52aXNpYmxlID0gZSwgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSAhMCwgdGhpcyk7CiAgICB9CiAgICBnZXRWaXNpYmxlQXQodCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgdGhpcy5faW5zdGFuY2VJbmZvW3RdLnZpc2libGU7CiAgICB9CiAgICBzZXRHZW9tZXRyeUlkQXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSwgdGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoZSksIHRoaXMuX2luc3RhbmNlSW5mb1t0XS5nZW9tZXRyeUluZGV4ID0gZSwgdGhpczsKICAgIH0KICAgIGdldEdlb21ldHJ5SWRBdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpLCB0aGlzLl9pbnN0YW5jZUluZm9bdF0uZ2VvbWV0cnlJbmRleDsKICAgIH0KICAgIGdldEdlb21ldHJ5UmFuZ2VBdCh0LCBlID0ge30pIHsKICAgICAgICB0aGlzLnZhbGlkYXRlR2VvbWV0cnlJZCh0KTsKICAgICAgICBsZXQgaSA9IHRoaXMuX2dlb21ldHJ5SW5mb1t0XTsKICAgICAgICByZXR1cm4gZS52ZXJ0ZXhTdGFydCA9IGkudmVydGV4U3RhcnQsIGUudmVydGV4Q291bnQgPSBpLnZlcnRleENvdW50LCBlLnJlc2VydmVkVmVydGV4Q291bnQgPSBpLnJlc2VydmVkVmVydGV4Q291bnQsIGUuaW5kZXhTdGFydCA9IGkuaW5kZXhTdGFydCwgZS5pbmRleENvdW50ID0gaS5pbmRleENvdW50LCBlLnJlc2VydmVkSW5kZXhDb3VudCA9IGkucmVzZXJ2ZWRJbmRleENvdW50LCBlLnN0YXJ0ID0gaS5zdGFydCwgZS5jb3VudCA9IGkuY291bnQsIGU7CiAgICB9CiAgICBzZXRJbnN0YW5jZUNvdW50KHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLCBpID0gdGhpcy5faW5zdGFuY2VJbmZvOwogICAgICAgIGZvcihlLnNvcnQodHIpOyBlW2UubGVuZ3RoIC0gMV0gPT09IGkubGVuZ3RoOylpLnBvcCgpLCBlLnBvcCgpOwogICAgICAgIGlmICh0IDwgaS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEluc3RhbmNlIGlkcyBvdXRzaWRlIHRoZSByYW5nZSAke3R9IGFyZSBiZWluZyB1c2VkLiBDYW5ub3Qgc2hyaW5rIGluc3RhbmNlIGNvdW50LmApOwogICAgICAgIGxldCBzID0gbmV3IEludDMyQXJyYXkodCksIG4gPSBuZXcgSW50MzJBcnJheSh0KTsKICAgICAgICBCZSh0aGlzLl9tdWx0aURyYXdDb3VudHMsIHMpLCBCZSh0aGlzLl9tdWx0aURyYXdTdGFydHMsIG4pLCB0aGlzLl9tdWx0aURyYXdDb3VudHMgPSBzLCB0aGlzLl9tdWx0aURyYXdTdGFydHMgPSBuLCB0aGlzLl9tYXhJbnN0YW5jZUNvdW50ID0gdDsKICAgICAgICBsZXQgciA9IHRoaXMuX2luZGlyZWN0VGV4dHVyZSwgbyA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZSwgYSA9IHRoaXMuX2NvbG9yc1RleHR1cmU7CiAgICAgICAgci5kaXNwb3NlKCksIHRoaXMuX2luaXRJbmRpcmVjdFRleHR1cmUoKSwgQmUoci5pbWFnZS5kYXRhLCB0aGlzLl9pbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSksIG8uZGlzcG9zZSgpLCB0aGlzLl9pbml0TWF0cmljZXNUZXh0dXJlKCksIEJlKG8uaW1hZ2UuZGF0YSwgdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEpLCBhICYmIChhLmRpc3Bvc2UoKSwgdGhpcy5faW5pdENvbG9yc1RleHR1cmUoKSwgQmUoYS5pbWFnZS5kYXRhLCB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEpKTsKICAgIH0KICAgIHNldEdlb21ldHJ5U2l6ZSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSBbCiAgICAgICAgICAgIC4uLnRoaXMuX2dlb21ldHJ5SW5mbwogICAgICAgIF0uZmlsdGVyKChvKT0+by5hY3RpdmUpOwogICAgICAgIGlmIChNYXRoLm1heCguLi5pLm1hcCgobyk9Pm8udmVydGV4U3RhcnQgKyBvLnJlc2VydmVkVmVydGV4Q291bnQpKSA+IHQpIHRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IHZlcnRleCB2YWx1ZXMgYXJlIGJlaW5nIHVzZWQgb3V0c2lkZSB0aGUgcmFuZ2UgJHtlfS4gQ2Fubm90IHNocmluayBmdXJ0aGVyLmApOwogICAgICAgIGlmICh0aGlzLmdlb21ldHJ5LmluZGV4ICYmIE1hdGgubWF4KC4uLmkubWFwKChhKT0+YS5pbmRleFN0YXJ0ICsgYS5yZXNlcnZlZEluZGV4Q291bnQpKSA+IGUpIHRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IGluZGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAke2V9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCk7CiAgICAgICAgbGV0IG4gPSB0aGlzLmdlb21ldHJ5OwogICAgICAgIG4uZGlzcG9zZSgpLCB0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IHQsIHRoaXMuX21heEluZGV4Q291bnQgPSBlLCB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkICYmICh0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gITEsIHRoaXMuZ2VvbWV0cnkgPSBuZXcgTCwgdGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KG4pKTsKICAgICAgICBsZXQgciA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgICAgbi5pbmRleCAmJiBCZShuLmluZGV4LmFycmF5LCByLmluZGV4LmFycmF5KTsKICAgICAgICBmb3IobGV0IG8gaW4gbi5hdHRyaWJ1dGVzKUJlKG4uYXR0cmlidXRlc1tvXS5hcnJheSwgci5hdHRyaWJ1dGVzW29dLmFycmF5KTsKICAgIH0KICAgIHJheWNhc3QodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5faW5zdGFuY2VJbmZvLCBzID0gdGhpcy5fZ2VvbWV0cnlJbmZvLCBuID0gdGhpcy5tYXRyaXhXb3JsZCwgciA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgICAgcHQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsLCBwdC5nZW9tZXRyeS5pbmRleCA9IHIuaW5kZXgsIHB0Lmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSByLmF0dHJpYnV0ZXMsIHB0Lmdlb21ldHJ5LmJvdW5kaW5nQm94ID09PSBudWxsICYmIChwdC5nZW9tZXRyeS5ib3VuZGluZ0JveCA9IG5ldyBmdCksIHB0Lmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmIChwdC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBodCk7CiAgICAgICAgZm9yKGxldCBvID0gMCwgYSA9IGkubGVuZ3RoOyBvIDwgYTsgbysrKXsKICAgICAgICAgICAgaWYgKCFpW29dLnZpc2libGUgfHwgIWlbb10uYWN0aXZlKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IGwgPSBpW29dLmdlb21ldHJ5SW5kZXgsIGMgPSBzW2xdOwogICAgICAgICAgICBwdC5nZW9tZXRyeS5zZXREcmF3UmFuZ2UoYy5zdGFydCwgYy5jb3VudCksIHRoaXMuZ2V0TWF0cml4QXQobywgcHQubWF0cml4V29ybGQpLnByZW11bHRpcGx5KG4pLCB0aGlzLmdldEJvdW5kaW5nQm94QXQobCwgcHQuZ2VvbWV0cnkuYm91bmRpbmdCb3gpLCB0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQobCwgcHQuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpLCBwdC5yYXljYXN0KHQsIElzKTsKICAgICAgICAgICAgZm9yKGxldCB1ID0gMCwgZCA9IElzLmxlbmd0aDsgdSA8IGQ7IHUrKyl7CiAgICAgICAgICAgICAgICBsZXQgcCA9IElzW3VdOwogICAgICAgICAgICAgICAgcC5vYmplY3QgPSB0aGlzLCBwLmJhdGNoSWQgPSBvLCBlLnB1c2gocCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgSXMubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgcHQubWF0ZXJpYWwgPSBudWxsLCBwdC5nZW9tZXRyeS5pbmRleCA9IG51bGwsIHB0Lmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSB7fSwgcHQuZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKDAsIDEgLyAwKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmdlb21ldHJ5ID0gdC5nZW9tZXRyeS5jbG9uZSgpLCB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0LnBlck9iamVjdEZydXN0dW1DdWxsZWQsIHRoaXMuc29ydE9iamVjdHMgPSB0LnNvcnRPYmplY3RzLCB0aGlzLmJvdW5kaW5nQm94ID0gdC5ib3VuZGluZ0JveCAhPT0gbnVsbCA/IHQuYm91bmRpbmdCb3guY2xvbmUoKSA6IG51bGwsIHRoaXMuYm91bmRpbmdTcGhlcmUgPSB0LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsID8gdC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpIDogbnVsbCwgdGhpcy5fZ2VvbWV0cnlJbmZvID0gdC5fZ2VvbWV0cnlJbmZvLm1hcCgoZSk9Pih7CiAgICAgICAgICAgICAgICAuLi5lLAogICAgICAgICAgICAgICAgYm91bmRpbmdCb3g6IGUuYm91bmRpbmdCb3ggIT09IG51bGwgPyBlLmJvdW5kaW5nQm94LmNsb25lKCkgOiBudWxsLAogICAgICAgICAgICAgICAgYm91bmRpbmdTcGhlcmU6IGUuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgPyBlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkgOiBudWxsCiAgICAgICAgICAgIH0pKSwgdGhpcy5faW5zdGFuY2VJbmZvID0gdC5faW5zdGFuY2VJbmZvLm1hcCgoZSk9Pih7CiAgICAgICAgICAgICAgICAuLi5lCiAgICAgICAgICAgIH0pKSwgdGhpcy5fbWF4SW5zdGFuY2VDb3VudCA9IHQuX21heEluc3RhbmNlQ291bnQsIHRoaXMuX21heFZlcnRleENvdW50ID0gdC5fbWF4VmVydGV4Q291bnQsIHRoaXMuX21heEluZGV4Q291bnQgPSB0Ll9tYXhJbmRleENvdW50LCB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gdC5fZ2VvbWV0cnlJbml0aWFsaXplZCwgdGhpcy5fZ2VvbWV0cnlDb3VudCA9IHQuX2dlb21ldHJ5Q291bnQsIHRoaXMuX211bHRpRHJhd0NvdW50cyA9IHQuX211bHRpRHJhd0NvdW50cy5zbGljZSgpLCB0aGlzLl9tdWx0aURyYXdTdGFydHMgPSB0Ll9tdWx0aURyYXdTdGFydHMuc2xpY2UoKSwgdGhpcy5fbWF0cmljZXNUZXh0dXJlID0gdC5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCksIHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSwgdGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCAmJiAodGhpcy5fY29sb3JzVGV4dHVyZSA9IHQuX2NvbG9yc1RleHR1cmUuY2xvbmUoKSwgdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhID0gdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLnNsaWNlKCkpLCB0aGlzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMuX21hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCksIHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IG51bGwsIHRoaXMuX2luZGlyZWN0VGV4dHVyZS5kaXNwb3NlKCksIHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IG51bGwsIHRoaXMuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgJiYgKHRoaXMuX2NvbG9yc1RleHR1cmUuZGlzcG9zZSgpLCB0aGlzLl9jb2xvcnNUZXh0dXJlID0gbnVsbCksIHRoaXM7CiAgICB9CiAgICBvbkJlZm9yZVJlbmRlcih0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgaWYgKCF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCAmJiAhdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkICYmICF0aGlzLnNvcnRPYmplY3RzKSByZXR1cm47CiAgICAgICAgbGV0IHIgPSBzLmdldEluZGV4KCksIG8gPSByID09PSBudWxsID8gMSA6IHIuYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGEgPSB0aGlzLl9pbnN0YW5jZUluZm8sIGwgPSB0aGlzLl9tdWx0aURyYXdTdGFydHMsIGMgPSB0aGlzLl9tdWx0aURyYXdDb3VudHMsIHUgPSB0aGlzLl9nZW9tZXRyeUluZm8sIGQgPSB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsIHAgPSB0aGlzLl9pbmRpcmVjdFRleHR1cmUsIGYgPSBwLmltYWdlLmRhdGE7CiAgICAgICAgZCAmJiAoTXQubXVsdGlwbHlNYXRyaWNlcyhpLnByb2plY3Rpb25NYXRyaXgsIGkubWF0cml4V29ybGRJbnZlcnNlKS5tdWx0aXBseSh0aGlzLm1hdHJpeFdvcmxkKSwgZXIuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoTXQsIHQuY29vcmRpbmF0ZVN5c3RlbSkpOwogICAgICAgIGxldCBtID0gMDsKICAgICAgICBpZiAodGhpcy5zb3J0T2JqZWN0cykgewogICAgICAgICAgICBNdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLCBSaS5zZXRGcm9tTWF0cml4UG9zaXRpb24oaS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KE10KSwgJGEuc2V0KDAsIDAsIC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oaS5tYXRyaXhXb3JsZCkudHJhbnNmb3JtRGlyZWN0aW9uKE10KTsKICAgICAgICAgICAgZm9yKGxldCB4MSA9IDAsIGIgPSBhLmxlbmd0aDsgeDEgPCBiOyB4MSsrKWlmIChhW3gxXS52aXNpYmxlICYmIGFbeDFdLmFjdGl2ZSkgewogICAgICAgICAgICAgICAgbGV0IE0gPSBhW3gxXS5nZW9tZXRyeUluZGV4OwogICAgICAgICAgICAgICAgdGhpcy5nZXRNYXRyaXhBdCh4MSwgTXQpLCB0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoTSwgRmUpLmFwcGx5TWF0cml4NChNdCk7CiAgICAgICAgICAgICAgICBsZXQgXyA9ICExOwogICAgICAgICAgICAgICAgaWYgKGQgJiYgKF8gPSAhZXIuaW50ZXJzZWN0c1NwaGVyZShGZSkpLCAhXykgewogICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdVtNXSwgUyA9IEx1LnN1YlZlY3RvcnMoRmUuY2VudGVyLCBSaSkuZG90KCRhKTsKICAgICAgICAgICAgICAgICAgICBpci5wdXNoKHYuc3RhcnQsIHYuY291bnQsIFMsIHgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgeTEgPSBpci5saXN0LCBnID0gdGhpcy5jdXN0b21Tb3J0OwogICAgICAgICAgICBnID09PSBudWxsID8geTEuc29ydChuLnRyYW5zcGFyZW50ID8gVnUgOiBOdSkgOiBnLmNhbGwodGhpcywgeTEsIGkpOwogICAgICAgICAgICBmb3IobGV0IHgxID0gMCwgYiA9IHkxLmxlbmd0aDsgeDEgPCBiOyB4MSsrKXsKICAgICAgICAgICAgICAgIGxldCBNID0geTFbeDFdOwogICAgICAgICAgICAgICAgbFttXSA9IE0uc3RhcnQgKiBvLCBjW21dID0gTS5jb3VudCwgZlttXSA9IE0uaW5kZXgsIG0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpci5yZXNldCgpOwogICAgICAgIH0gZWxzZSBmb3IobGV0IHkxID0gMCwgZyA9IGEubGVuZ3RoOyB5MSA8IGc7IHkxKyspaWYgKGFbeTFdLnZpc2libGUgJiYgYVt5MV0uYWN0aXZlKSB7CiAgICAgICAgICAgIGxldCB4MSA9IGFbeTFdLmdlb21ldHJ5SW5kZXgsIGIgPSAhMTsKICAgICAgICAgICAgaWYgKGQgJiYgKHRoaXMuZ2V0TWF0cml4QXQoeTEsIE10KSwgdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KHgxLCBGZSkuYXBwbHlNYXRyaXg0KE10KSwgYiA9ICFlci5pbnRlcnNlY3RzU3BoZXJlKEZlKSksICFiKSB7CiAgICAgICAgICAgICAgICBsZXQgTSA9IHVbeDFdOwogICAgICAgICAgICAgICAgbFttXSA9IE0uc3RhcnQgKiBvLCBjW21dID0gTS5jb3VudCwgZlttXSA9IHkxLCBtKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcC5uZWVkc1VwZGF0ZSA9ICEwLCB0aGlzLl9tdWx0aURyYXdDb3VudCA9IG0sIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gITE7CiAgICB9CiAgICBvbkJlZm9yZVNoYWRvdyh0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgdGhpcy5vbkJlZm9yZVJlbmRlcih0LCBudWxsLCBzLCBuLCByKTsKICAgIH0KfSwgbXQgPSBjbGFzcyBleHRlbmRzIGN0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbCA9ICEwLCB0aGlzLnR5cGUgPSAiTGluZUJhc2ljTWF0ZXJpYWwiLCB0aGlzLmNvbG9yID0gbmV3IFAoMTY3NzcyMTUpLCB0aGlzLm1hcCA9IG51bGwsIHRoaXMubGluZXdpZHRoID0gMSwgdGhpcy5saW5lY2FwID0gInJvdW5kIiwgdGhpcy5saW5lam9pbiA9ICJyb3VuZCIsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSwgdGhpcy5tYXAgPSB0Lm1hcCwgdGhpcy5saW5ld2lkdGggPSB0LmxpbmV3aWR0aCwgdGhpcy5saW5lY2FwID0gdC5saW5lY2FwLCB0aGlzLmxpbmVqb2luID0gdC5saW5lam9pbiwgdGhpcy5mb2cgPSB0LmZvZywgdGhpczsKICAgIH0KfSwgbm4gPSBuZXcgdywgcm4gPSBuZXcgdywgUWEgPSBuZXcgRCwga2kgPSBuZXcgTGUsIENzID0gbmV3IGh0LCBzciA9IG5ldyB3LCBqYSA9IG5ldyB3LCBsZSA9IGNsYXNzIGV4dGVuZHMgRyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IEwsIGUgPSBuZXcgbXQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNMaW5lID0gITAsIHRoaXMudHlwZSA9ICJMaW5lIiwgdGhpcy5nZW9tZXRyeSA9IHQsIHRoaXMubWF0ZXJpYWwgPSBlLCB0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpOwogICAgfQogICAgY29weSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCwgZSksIHRoaXMubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KHQubWF0ZXJpYWwpID8gdC5tYXRlcmlhbC5zbGljZSgpIDogdC5tYXRlcmlhbCwgdGhpcy5nZW9tZXRyeSA9IHQuZ2VvbWV0cnksIHRoaXM7CiAgICB9CiAgICBjb21wdXRlTGluZURpc3RhbmNlcygpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgICAgaWYgKHQuaW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IGUgPSB0LmF0dHJpYnV0ZXMucG9zaXRpb24sIGkgPSBbCiAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZvcihsZXQgcyA9IDEsIG4gPSBlLmNvdW50OyBzIDwgbjsgcysrKW5uLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSwgcyAtIDEpLCBybi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIHMpLCBpW3NdID0gaVtzIC0gMV0sIGlbc10gKz0gbm4uZGlzdGFuY2VUbyhybik7CiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLCBuZXcgRShpLCAxKSk7CiAgICAgICAgfSBlbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByYXljYXN0KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuZ2VvbWV0cnksIHMgPSB0aGlzLm1hdHJpeFdvcmxkLCBuID0gdC5wYXJhbXMuTGluZS50aHJlc2hvbGQsIHIgPSBpLmRyYXdSYW5nZTsKICAgICAgICBpZiAoaS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCAmJiBpLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLCBDcy5jb3B5KGkuYm91bmRpbmdTcGhlcmUpLCBDcy5hcHBseU1hdHJpeDQocyksIENzLnJhZGl1cyArPSBuLCB0LnJheS5pbnRlcnNlY3RzU3BoZXJlKENzKSA9PT0gITEpIHJldHVybjsKICAgICAgICBRYS5jb3B5KHMpLmludmVydCgpLCBraS5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoUWEpOwogICAgICAgIGxldCBvID0gbiAvICgodGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56KSAvIDMpLCBhID0gbyAqIG8sIGwgPSB0aGlzLmlzTGluZVNlZ21lbnRzID8gMiA6IDEsIGMgPSBpLmluZGV4LCBkID0gaS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIGlmIChjICE9PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBwID0gTWF0aC5tYXgoMCwgci5zdGFydCksIGYgPSBNYXRoLm1pbihjLmNvdW50LCByLnN0YXJ0ICsgci5jb3VudCk7CiAgICAgICAgICAgIGZvcihsZXQgbSA9IHAsIHkxID0gZiAtIDE7IG0gPCB5MTsgbSArPSBsKXsKICAgICAgICAgICAgICAgIGxldCBnID0gYy5nZXRYKG0pLCB4MSA9IGMuZ2V0WChtICsgMSksIGIgPSB6cyh0aGlzLCB0LCBraSwgYSwgZywgeDEsIG0pOwogICAgICAgICAgICAgICAgYiAmJiBlLnB1c2goYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTG9vcCkgewogICAgICAgICAgICAgICAgbGV0IG0gPSBjLmdldFgoZiAtIDEpLCB5MSA9IGMuZ2V0WChwKSwgZyA9IHpzKHRoaXMsIHQsIGtpLCBhLCBtLCB5MSwgZiAtIDEpOwogICAgICAgICAgICAgICAgZyAmJiBlLnB1c2goZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgcCA9IE1hdGgubWF4KDAsIHIuc3RhcnQpLCBmID0gTWF0aC5taW4oZC5jb3VudCwgci5zdGFydCArIHIuY291bnQpOwogICAgICAgICAgICBmb3IobGV0IG0gPSBwLCB5MSA9IGYgLSAxOyBtIDwgeTE7IG0gKz0gbCl7CiAgICAgICAgICAgICAgICBsZXQgZyA9IHpzKHRoaXMsIHQsIGtpLCBhLCBtLCBtICsgMSwgbSk7CiAgICAgICAgICAgICAgICBnICYmIGUucHVzaChnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVMb29wKSB7CiAgICAgICAgICAgICAgICBsZXQgbSA9IHpzKHRoaXMsIHQsIGtpLCBhLCBmIC0gMSwgcCwgZiAtIDEpOwogICAgICAgICAgICAgICAgbSAmJiBlLnB1c2gobSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB1cGRhdGVNb3JwaFRhcmdldHMoKSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcywgaSA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgIGlmIChpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IHMgPSBlW2lbMF1dOwogICAgICAgICAgICBpZiAocyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdLCB0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9OwogICAgICAgICAgICAgICAgZm9yKGxldCBuID0gMCwgciA9IHMubGVuZ3RoOyBuIDwgcjsgbisrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgbyA9IHNbbl0ubmFtZSB8fCBTdHJpbmcobik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSwgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbb10gPSBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwpmdW5jdGlvbiB6cyhoLCB0LCBlLCBpLCBzLCBuLCByKSB7CiAgICBsZXQgbyA9IGguZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgIGlmIChubi5mcm9tQnVmZmVyQXR0cmlidXRlKG8sIHMpLCBybi5mcm9tQnVmZmVyQXR0cmlidXRlKG8sIG4pLCBlLmRpc3RhbmNlU3FUb1NlZ21lbnQobm4sIHJuLCBzciwgamEpID4gaSkgcmV0dXJuOwogICAgc3IuYXBwbHlNYXRyaXg0KGgubWF0cml4V29ybGQpOwogICAgbGV0IGwgPSB0LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzcik7CiAgICBpZiAoIShsIDwgdC5uZWFyIHx8IGwgPiB0LmZhcikpIHJldHVybiB7CiAgICAgICAgZGlzdGFuY2U6IGwsCiAgICAgICAgcG9pbnQ6IGphLmNsb25lKCkuYXBwbHlNYXRyaXg0KGgubWF0cml4V29ybGQpLAogICAgICAgIGluZGV4OiByLAogICAgICAgIGZhY2U6IG51bGwsCiAgICAgICAgZmFjZUluZGV4OiBudWxsLAogICAgICAgIGJhcnljb29yZDogbnVsbCwKICAgICAgICBvYmplY3Q6IGgKICAgIH07Cn0KdmFyIEthID0gbmV3IHcsIHRoID0gbmV3IHcsIFd0ID0gY2xhc3MgZXh0ZW5kcyBsZSB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc0xpbmVTZWdtZW50cyA9ICEwLCB0aGlzLnR5cGUgPSAiTGluZVNlZ21lbnRzIjsKICAgIH0KICAgIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgICBpZiAodC5pbmRleCA9PT0gbnVsbCkgewogICAgICAgICAgICBsZXQgZSA9IHQuYXR0cmlidXRlcy5wb3NpdGlvbiwgaSA9IFtdOwogICAgICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gZS5jb3VudDsgcyA8IG47IHMgKz0gMilLYS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIHMpLCB0aC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIHMgKyAxKSwgaVtzXSA9IHMgPT09IDAgPyAwIDogaVtzIC0gMV0sIGlbcyArIDFdID0gaVtzXSArIEthLmRpc3RhbmNlVG8odGgpOwogICAgICAgICAgICB0LnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIiwgbmV3IEUoaSwgMSkpOwogICAgICAgIH0gZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn0sIEZyID0gY2xhc3MgZXh0ZW5kcyBsZSB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc0xpbmVMb29wID0gITAsIHRoaXMudHlwZSA9ICJMaW5lTG9vcCI7CiAgICB9Cn0sIG9uID0gY2xhc3MgZXh0ZW5kcyBjdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzUG9pbnRzTWF0ZXJpYWwgPSAhMCwgdGhpcy50eXBlID0gIlBvaW50c01hdGVyaWFsIiwgdGhpcy5jb2xvciA9IG5ldyBQKDE2Nzc3MjE1KSwgdGhpcy5tYXAgPSBudWxsLCB0aGlzLmFscGhhTWFwID0gbnVsbCwgdGhpcy5zaXplID0gMSwgdGhpcy5zaXplQXR0ZW51YXRpb24gPSAhMCwgdGhpcy5mb2cgPSAhMCwgdGhpcy5zZXRWYWx1ZXModCk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5zaXplID0gdC5zaXplLCB0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHQuc2l6ZUF0dGVudWF0aW9uLCB0aGlzLmZvZyA9IHQuZm9nLCB0aGlzOwogICAgfQp9LCBlaCA9IG5ldyBELCBCciA9IG5ldyBMZSwgRnMgPSBuZXcgaHQsIEJzID0gbmV3IHcsIEVyID0gY2xhc3MgZXh0ZW5kcyBHIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgTCwgZSA9IG5ldyBvbil7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1BvaW50cyA9ICEwLCB0aGlzLnR5cGUgPSAiUG9pbnRzIiwgdGhpcy5nZW9tZXRyeSA9IHQsIHRoaXMubWF0ZXJpYWwgPSBlLCB0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpOwogICAgfQogICAgY29weSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCwgZSksIHRoaXMubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KHQubWF0ZXJpYWwpID8gdC5tYXRlcmlhbC5zbGljZSgpIDogdC5tYXRlcmlhbCwgdGhpcy5nZW9tZXRyeSA9IHQuZ2VvbWV0cnksIHRoaXM7CiAgICB9CiAgICByYXljYXN0KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuZ2VvbWV0cnksIHMgPSB0aGlzLm1hdHJpeFdvcmxkLCBuID0gdC5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCwgciA9IGkuZHJhd1JhbmdlOwogICAgICAgIGlmIChpLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmIGkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksIEZzLmNvcHkoaS5ib3VuZGluZ1NwaGVyZSksIEZzLmFwcGx5TWF0cml4NChzKSwgRnMucmFkaXVzICs9IG4sIHQucmF5LmludGVyc2VjdHNTcGhlcmUoRnMpID09PSAhMSkgcmV0dXJuOwogICAgICAgIGVoLmNvcHkocykuaW52ZXJ0KCksIEJyLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChlaCk7CiAgICAgICAgbGV0IG8gPSBuIC8gKCh0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnopIC8gMyksIGEgPSBvICogbywgbCA9IGkuaW5kZXgsIHUgPSBpLmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgICAgaWYgKGwgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IGQgPSBNYXRoLm1heCgwLCByLnN0YXJ0KSwgcCA9IE1hdGgubWluKGwuY291bnQsIHIuc3RhcnQgKyByLmNvdW50KTsKICAgICAgICAgICAgZm9yKGxldCBmID0gZCwgbSA9IHA7IGYgPCBtOyBmKyspewogICAgICAgICAgICAgICAgbGV0IHkxID0gbC5nZXRYKGYpOwogICAgICAgICAgICAgICAgQnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LCB5MSksIGloKEJzLCB5MSwgYSwgcywgdCwgZSwgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgZCA9IE1hdGgubWF4KDAsIHIuc3RhcnQpLCBwID0gTWF0aC5taW4odS5jb3VudCwgci5zdGFydCArIHIuY291bnQpOwogICAgICAgICAgICBmb3IobGV0IGYgPSBkLCBtID0gcDsgZiA8IG07IGYrKylCcy5mcm9tQnVmZmVyQXR0cmlidXRlKHUsIGYpLCBpaChCcywgZiwgYSwgcywgdCwgZSwgdGhpcyk7CiAgICAgICAgfQogICAgfQogICAgdXBkYXRlTW9ycGhUYXJnZXRzKCkgewogICAgICAgIGxldCBlID0gdGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsIGkgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICBpZiAoaS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxldCBzID0gZVtpWzBdXTsKICAgICAgICAgICAgaWYgKHMgIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXSwgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKICAgICAgICAgICAgICAgIGZvcihsZXQgbiA9IDAsIHIgPSBzLmxlbmd0aDsgbiA8IHI7IG4rKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IG8gPSBzW25dLm5hbWUgfHwgU3RyaW5nKG4pOwogICAgICAgICAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksIHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W29dID0gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfTsKZnVuY3Rpb24gaWgoaCwgdCwgZSwgaSwgcywgbiwgcikgewogICAgbGV0IG8gPSBCci5kaXN0YW5jZVNxVG9Qb2ludChoKTsKICAgIGlmIChvIDwgZSkgewogICAgICAgIGxldCBhID0gbmV3IHc7CiAgICAgICAgQnIuY2xvc2VzdFBvaW50VG9Qb2ludChoLCBhKSwgYS5hcHBseU1hdHJpeDQoaSk7CiAgICAgICAgbGV0IGwgPSBzLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhhKTsKICAgICAgICBpZiAobCA8IHMubmVhciB8fCBsID4gcy5mYXIpIHJldHVybjsKICAgICAgICBuLnB1c2goewogICAgICAgICAgICBkaXN0YW5jZTogbCwKICAgICAgICAgICAgZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KG8pLAogICAgICAgICAgICBwb2ludDogYSwKICAgICAgICAgICAgaW5kZXg6IHQsCiAgICAgICAgICAgIGZhY2U6IG51bGwsCiAgICAgICAgICAgIGZhY2VJbmRleDogbnVsbCwKICAgICAgICAgICAgYmFyeWNvb3JkOiBudWxsLAogICAgICAgICAgICBvYmplY3Q6IHIKICAgICAgICB9KTsKICAgIH0KfQp2YXIgUnIgPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGksIHMsIG4sIHIsIG8sIGEsIGwpewogICAgICAgIHN1cGVyKHQsIGUsIGksIHMsIG4sIHIsIG8sIGEsIGwpLCB0aGlzLmlzVmlkZW9UZXh0dXJlID0gITAsIHRoaXMubWluRmlsdGVyID0gciAhPT0gdm9pZCAwID8gciA6IEV0LCB0aGlzLm1hZ0ZpbHRlciA9IG4gIT09IHZvaWQgMCA/IG4gOiBFdCwgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSAhMTsKICAgICAgICBsZXQgYyA9IHRoaXM7CiAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgYy5uZWVkc1VwZGF0ZSA9ICEwLCB0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2sodSk7CiAgICAgICAgfQogICAgICAgICJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrIiBpbiB0ICYmIHQucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayh1KTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmltYWdlKS5jb3B5KHRoaXMpOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5pbWFnZTsKICAgICAgICAicmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayIgaW4gdCA9PT0gITEgJiYgdC5yZWFkeVN0YXRlID49IHQuSEFWRV9DVVJSRU5UX0RBVEEgJiYgKHRoaXMubmVlZHNVcGRhdGUgPSAhMCk7CiAgICB9Cn0sIHNoID0gY2xhc3MgZXh0ZW5kcyBSciB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhKXsKICAgICAgICBzdXBlcih7fSwgdCwgZSwgaSwgcywgbiwgciwgbywgYSksIHRoaXMuaXNWaWRlb0ZyYW1lVGV4dHVyZSA9ICEwOwogICAgfQogICAgdXBkYXRlKCkge30KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgICBzZXRGcmFtZSh0KSB7CiAgICAgICAgdGhpcy5pbWFnZSA9IHQsIHRoaXMubmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KfSwgbmggPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQsIGUpewogICAgICAgIHN1cGVyKHsKICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgIH0pLCB0aGlzLmlzRnJhbWVidWZmZXJUZXh0dXJlID0gITAsIHRoaXMubWFnRmlsdGVyID0gVXQsIHRoaXMubWluRmlsdGVyID0gVXQsIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gITEsIHRoaXMubmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KfSwgWmkgPSBjbGFzcyBleHRlbmRzIGx0IHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGksIHMsIG4sIHIsIG8sIGEsIGwsIGMsIHUsIGQpewogICAgICAgIHN1cGVyKG51bGwsIHIsIG8sIGEsIGwsIGMsIHMsIG4sIHUsIGQpLCB0aGlzLmlzQ29tcHJlc3NlZFRleHR1cmUgPSAhMCwgdGhpcy5pbWFnZSA9IHsKICAgICAgICAgICAgd2lkdGg6IGUsCiAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgIH0sIHRoaXMubWlwbWFwcyA9IHQsIHRoaXMuZmxpcFkgPSAhMSwgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSAhMTsKICAgIH0KfSwgcmggPSBjbGFzcyBleHRlbmRzIFppIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGksIHMsIG4sIHIpewogICAgICAgIHN1cGVyKHQsIGUsIGksIG4sIHIpLCB0aGlzLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA9ICEwLCB0aGlzLmltYWdlLmRlcHRoID0gcywgdGhpcy53cmFwUiA9IEh0LCB0aGlzLmxheWVyVXBkYXRlcyA9IG5ldyBTZXQ7CiAgICB9CiAgICBhZGRMYXllclVwZGF0ZSh0KSB7CiAgICAgICAgdGhpcy5sYXllclVwZGF0ZXMuYWRkKHQpOwogICAgfQogICAgY2xlYXJMYXllclVwZGF0ZXMoKSB7CiAgICAgICAgdGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTsKICAgIH0KfSwgb2ggPSBjbGFzcyBleHRlbmRzIFppIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKHZvaWQgMCwgdFswXS53aWR0aCwgdFswXS5oZWlnaHQsIGUsIGksIFVvKSwgdGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZSA9ICEwLCB0aGlzLmlzQ3ViZVRleHR1cmUgPSAhMCwgdGhpcy5pbWFnZSA9IHQ7CiAgICB9Cn0sIGFoID0gY2xhc3MgZXh0ZW5kcyBsdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKXsKICAgICAgICBzdXBlcih0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsKSwgdGhpcy5pc0NhbnZhc1RleHR1cmUgPSAhMCwgdGhpcy5uZWVkc1VwZGF0ZSA9ICEwOwogICAgfQp9LCBoaCA9IGNsYXNzIGV4dGVuZHMgbHQgewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcywgbiwgciwgbywgYSwgbCwgYyA9IENuKXsKICAgICAgICBpZiAoYyAhPT0gQ24gJiYgYyAhPT0gYWEpIHRocm93IG5ldyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTsKICAgICAgICBpID09PSB2b2lkIDAgJiYgYyA9PT0gQ24gJiYgKGkgPSBXbyksIGkgPT09IHZvaWQgMCAmJiBjID09PSBhYSAmJiAoaSA9IHNjKSwgc3VwZXIobnVsbCwgcywgbiwgciwgbywgYSwgYywgaSwgbCksIHRoaXMuaXNEZXB0aFRleHR1cmUgPSAhMCwgdGhpcy5pbWFnZSA9IHsKICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgIH0sIHRoaXMubWFnRmlsdGVyID0gbyAhPT0gdm9pZCAwID8gbyA6IFV0LCB0aGlzLm1pbkZpbHRlciA9IGEgIT09IHZvaWQgMCA/IGEgOiBVdCwgdGhpcy5mbGlwWSA9ICExLCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9ICExLCB0aGlzLmNvbXBhcmVGdW5jdGlvbiA9IG51bGw7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5jb21wYXJlRnVuY3Rpb24gPSB0LmNvbXBhcmVGdW5jdGlvbiwgdGhpczsKICAgIH0KICAgIHRvSlNPTih0KSB7CiAgICAgICAgbGV0IGUgPSBzdXBlci50b0pTT04odCk7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUZ1bmN0aW9uICE9PSBudWxsICYmIChlLmNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuY29tcGFyZUZ1bmN0aW9uKSwgZTsKICAgIH0KfSwgUnQgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHRoaXMudHlwZSA9ICJDdXJ2ZSIsIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwOwogICAgfQogICAgZ2V0UG9pbnQoKSB7CiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSwgbnVsbDsKICAgIH0KICAgIGdldFBvaW50QXQodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5nZXRVdG9UbWFwcGluZyh0KTsKICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludChpLCBlKTsKICAgIH0KICAgIGdldFBvaW50cyh0ID0gNSkgewogICAgICAgIGxldCBlID0gW107CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8PSB0OyBpKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQoaSAvIHQpKTsKICAgICAgICByZXR1cm4gZTsKICAgIH0KICAgIGdldFNwYWNlZFBvaW50cyh0ID0gNSkgewogICAgICAgIGxldCBlID0gW107CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8PSB0OyBpKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChpIC8gdCkpOwogICAgICAgIHJldHVybiBlOwogICAgfQogICAgZ2V0TGVuZ3RoKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZXRMZW5ndGhzKCk7CiAgICAgICAgcmV0dXJuIHRbdC5sZW5ndGggLSAxXTsKICAgIH0KICAgIGdldExlbmd0aHModCA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKSB7CiAgICAgICAgaWYgKHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gdCArIDEgJiYgIXRoaXMubmVlZHNVcGRhdGUpIHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RoczsKICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gITE7CiAgICAgICAgbGV0IGUgPSBbXSwgaSwgcyA9IHRoaXMuZ2V0UG9pbnQoMCksIG4gPSAwOwogICAgICAgIGUucHVzaCgwKTsKICAgICAgICBmb3IobGV0IHIgPSAxOyByIDw9IHQ7IHIrKylpID0gdGhpcy5nZXRQb2ludChyIC8gdCksIG4gKz0gaS5kaXN0YW5jZVRvKHMpLCBlLnB1c2gobiksIHMgPSBpOwogICAgICAgIHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGUsIGU7CiAgICB9CiAgICB1cGRhdGVBcmNMZW5ndGhzKCkgewogICAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSAhMCwgdGhpcy5nZXRMZW5ndGhzKCk7CiAgICB9CiAgICBnZXRVdG9UbWFwcGluZyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmdldExlbmd0aHMoKSwgcyA9IDAsIG4gPSBpLmxlbmd0aCwgcjsKICAgICAgICBlID8gciA9IGUgOiByID0gdCAqIGlbbiAtIDFdOwogICAgICAgIGxldCBvID0gMCwgYSA9IG4gLSAxLCBsOwogICAgICAgIGZvcig7IG8gPD0gYTspaWYgKHMgPSBNYXRoLmZsb29yKG8gKyAoYSAtIG8pIC8gMiksIGwgPSBpW3NdIC0gciwgbCA8IDApIG8gPSBzICsgMTsKICAgICAgICBlbHNlIGlmIChsID4gMCkgYSA9IHMgLSAxOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBhID0gczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzID0gYSwgaVtzXSA9PT0gcikgcmV0dXJuIHMgLyAobiAtIDEpOwogICAgICAgIGxldCBjID0gaVtzXSwgZCA9IGlbcyArIDFdIC0gYywgcCA9IChyIC0gYykgLyBkOwogICAgICAgIHJldHVybiAocyArIHApIC8gKG4gLSAxKTsKICAgIH0KICAgIGdldFRhbmdlbnQodCwgZSkgewogICAgICAgIGxldCBzID0gdCAtIDFlLTQsIG4gPSB0ICsgMWUtNDsKICAgICAgICBzIDwgMCAmJiAocyA9IDApLCBuID4gMSAmJiAobiA9IDEpOwogICAgICAgIGxldCByID0gdGhpcy5nZXRQb2ludChzKSwgbyA9IHRoaXMuZ2V0UG9pbnQobiksIGEgPSBlIHx8IChyLmlzVmVjdG9yMiA/IG5ldyBUIDogbmV3IHcpOwogICAgICAgIHJldHVybiBhLmNvcHkobykuc3ViKHIpLm5vcm1hbGl6ZSgpLCBhOwogICAgfQogICAgZ2V0VGFuZ2VudEF0KHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChpLCBlKTsKICAgIH0KICAgIGNvbXB1dGVGcmVuZXRGcmFtZXModCwgZSkgewogICAgICAgIGxldCBpID0gbmV3IHcsIHMgPSBbXSwgbiA9IFtdLCByID0gW10sIG8gPSBuZXcgdywgYSA9IG5ldyBEOwogICAgICAgIGZvcihsZXQgcCA9IDA7IHAgPD0gdDsgcCsrKXsKICAgICAgICAgICAgbGV0IGYgPSBwIC8gdDsKICAgICAgICAgICAgc1twXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KGYsIG5ldyB3KTsKICAgICAgICB9CiAgICAgICAgblswXSA9IG5ldyB3LCByWzBdID0gbmV3IHc7CiAgICAgICAgbGV0IGwgPSBOdW1iZXIuTUFYX1ZBTFVFLCBjID0gTWF0aC5hYnMoc1swXS54KSwgdSA9IE1hdGguYWJzKHNbMF0ueSksIGQgPSBNYXRoLmFicyhzWzBdLnopOwogICAgICAgIGMgPD0gbCAmJiAobCA9IGMsIGkuc2V0KDEsIDAsIDApKSwgdSA8PSBsICYmIChsID0gdSwgaS5zZXQoMCwgMSwgMCkpLCBkIDw9IGwgJiYgaS5zZXQoMCwgMCwgMSksIG8uY3Jvc3NWZWN0b3JzKHNbMF0sIGkpLm5vcm1hbGl6ZSgpLCBuWzBdLmNyb3NzVmVjdG9ycyhzWzBdLCBvKSwgclswXS5jcm9zc1ZlY3RvcnMoc1swXSwgblswXSk7CiAgICAgICAgZm9yKGxldCBwID0gMTsgcCA8PSB0OyBwKyspewogICAgICAgICAgICBpZiAobltwXSA9IG5bcCAtIDFdLmNsb25lKCksIHJbcF0gPSByW3AgLSAxXS5jbG9uZSgpLCBvLmNyb3NzVmVjdG9ycyhzW3AgLSAxXSwgc1twXSksIG8ubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTikgewogICAgICAgICAgICAgICAgby5ub3JtYWxpemUoKTsKICAgICAgICAgICAgICAgIGxldCBmID0gTWF0aC5hY29zKE4oc1twIC0gMV0uZG90KHNbcF0pLCAtMSwgMSkpOwogICAgICAgICAgICAgICAgbltwXS5hcHBseU1hdHJpeDQoYS5tYWtlUm90YXRpb25BeGlzKG8sIGYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByW3BdLmNyb3NzVmVjdG9ycyhzW3BdLCBuW3BdKTsKICAgICAgICB9CiAgICAgICAgaWYgKGUgPT09ICEwKSB7CiAgICAgICAgICAgIGxldCBwID0gTWF0aC5hY29zKE4oblswXS5kb3Qoblt0XSksIC0xLCAxKSk7CiAgICAgICAgICAgIHAgLz0gdCwgc1swXS5kb3Qoby5jcm9zc1ZlY3RvcnMoblswXSwgblt0XSkpID4gMCAmJiAocCA9IC1wKTsKICAgICAgICAgICAgZm9yKGxldCBmID0gMTsgZiA8PSB0OyBmKyspbltmXS5hcHBseU1hdHJpeDQoYS5tYWtlUm90YXRpb25BeGlzKHNbZl0sIHAgKiBmKSksIHJbZl0uY3Jvc3NWZWN0b3JzKHNbZl0sIG5bZl0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0YW5nZW50czogcywKICAgICAgICAgICAgbm9ybWFsczogbiwKICAgICAgICAgICAgYmlub3JtYWxzOiByCiAgICAgICAgfTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0LmFyY0xlbmd0aERpdmlzaW9ucywgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHsKICAgICAgICAgICAgbWV0YWRhdGE6IHsKICAgICAgICAgICAgICAgIHZlcnNpb246IDQuNiwKICAgICAgICAgICAgICAgIHR5cGU6ICJDdXJ2ZSIsCiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICJDdXJ2ZS50b0pTT04iCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLCB0LnR5cGUgPSB0aGlzLnR5cGUsIHQ7CiAgICB9CiAgICBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdC5hcmNMZW5ndGhEaXZpc2lvbnMsIHRoaXM7CiAgICB9Cn0sIFlpID0gY2xhc3MgZXh0ZW5kcyBSdCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMCwgZSA9IDAsIGkgPSAxLCBzID0gMSwgbiA9IDAsIHIgPSBNYXRoLlBJICogMiwgbyA9ICExLCBhID0gMCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc0VsbGlwc2VDdXJ2ZSA9ICEwLCB0aGlzLnR5cGUgPSAiRWxsaXBzZUN1cnZlIiwgdGhpcy5hWCA9IHQsIHRoaXMuYVkgPSBlLCB0aGlzLnhSYWRpdXMgPSBpLCB0aGlzLnlSYWRpdXMgPSBzLCB0aGlzLmFTdGFydEFuZ2xlID0gbiwgdGhpcy5hRW5kQW5nbGUgPSByLCB0aGlzLmFDbG9ja3dpc2UgPSBvLCB0aGlzLmFSb3RhdGlvbiA9IGE7CiAgICB9CiAgICBnZXRQb2ludCh0LCBlID0gbmV3IFQpIHsKICAgICAgICBsZXQgaSA9IGUsIHMgPSBNYXRoLlBJICogMiwgbiA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZSwgciA9IE1hdGguYWJzKG4pIDwgTnVtYmVyLkVQU0lMT047CiAgICAgICAgZm9yKDsgbiA8IDA7KW4gKz0gczsKICAgICAgICBmb3IoOyBuID4gczspbiAtPSBzOwogICAgICAgIG4gPCBOdW1iZXIuRVBTSUxPTiAmJiAociA/IG4gPSAwIDogbiA9IHMpLCB0aGlzLmFDbG9ja3dpc2UgPT09ICEwICYmICFyICYmIChuID09PSBzID8gbiA9IC1zIDogbiA9IG4gLSBzKTsKICAgICAgICBsZXQgbyA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogbiwgYSA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyhvKSwgbCA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbihvKTsKICAgICAgICBpZiAodGhpcy5hUm90YXRpb24gIT09IDApIHsKICAgICAgICAgICAgbGV0IGMgPSBNYXRoLmNvcyh0aGlzLmFSb3RhdGlvbiksIHUgPSBNYXRoLnNpbih0aGlzLmFSb3RhdGlvbiksIGQgPSBhIC0gdGhpcy5hWCwgcCA9IGwgLSB0aGlzLmFZOwogICAgICAgICAgICBhID0gZCAqIGMgLSBwICogdSArIHRoaXMuYVgsIGwgPSBkICogdSArIHAgKiBjICsgdGhpcy5hWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkuc2V0KGEsIGwpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuYVggPSB0LmFYLCB0aGlzLmFZID0gdC5hWSwgdGhpcy54UmFkaXVzID0gdC54UmFkaXVzLCB0aGlzLnlSYWRpdXMgPSB0LnlSYWRpdXMsIHRoaXMuYVN0YXJ0QW5nbGUgPSB0LmFTdGFydEFuZ2xlLCB0aGlzLmFFbmRBbmdsZSA9IHQuYUVuZEFuZ2xlLCB0aGlzLmFDbG9ja3dpc2UgPSB0LmFDbG9ja3dpc2UsIHRoaXMuYVJvdGF0aW9uID0gdC5hUm90YXRpb24sIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICByZXR1cm4gdC5hWCA9IHRoaXMuYVgsIHQuYVkgPSB0aGlzLmFZLCB0LnhSYWRpdXMgPSB0aGlzLnhSYWRpdXMsIHQueVJhZGl1cyA9IHRoaXMueVJhZGl1cywgdC5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUsIHQuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGUsIHQuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZSwgdC5hUm90YXRpb24gPSB0aGlzLmFSb3RhdGlvbiwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMuYVggPSB0LmFYLCB0aGlzLmFZID0gdC5hWSwgdGhpcy54UmFkaXVzID0gdC54UmFkaXVzLCB0aGlzLnlSYWRpdXMgPSB0LnlSYWRpdXMsIHRoaXMuYVN0YXJ0QW5nbGUgPSB0LmFTdGFydEFuZ2xlLCB0aGlzLmFFbmRBbmdsZSA9IHQuYUVuZEFuZ2xlLCB0aGlzLmFDbG9ja3dpc2UgPSB0LmFDbG9ja3dpc2UsIHRoaXMuYVJvdGF0aW9uID0gdC5hUm90YXRpb24sIHRoaXM7CiAgICB9Cn0sIGtyID0gY2xhc3MgZXh0ZW5kcyBZaSB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuLCByKXsKICAgICAgICBzdXBlcih0LCBlLCBpLCBpLCBzLCBuLCByKSwgdGhpcy5pc0FyY0N1cnZlID0gITAsIHRoaXMudHlwZSA9ICJBcmNDdXJ2ZSI7CiAgICB9Cn07CmZ1bmN0aW9uIEdvKCkgewogICAgbGV0IGggPSAwLCB0ID0gMCwgZSA9IDAsIGkgPSAwOwogICAgZnVuY3Rpb24gcyhuLCByLCBvLCBhKSB7CiAgICAgICAgaCA9IG4sIHQgPSBvLCBlID0gLTMgKiBuICsgMyAqIHIgLSAyICogbyAtIGEsIGkgPSAyICogbiAtIDIgKiByICsgbyArIGE7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIGluaXRDYXRtdWxsUm9tOiBmdW5jdGlvbihuLCByLCBvLCBhLCBsKSB7CiAgICAgICAgICAgIHMociwgbywgbCAqIChvIC0gbiksIGwgKiAoYSAtIHIpKTsKICAgICAgICB9LAogICAgICAgIGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24obiwgciwgbywgYSwgbCwgYywgdSkgewogICAgICAgICAgICBsZXQgZCA9IChyIC0gbikgLyBsIC0gKG8gLSBuKSAvIChsICsgYykgKyAobyAtIHIpIC8gYywgcCA9IChvIC0gcikgLyBjIC0gKGEgLSByKSAvIChjICsgdSkgKyAoYSAtIG8pIC8gdTsKICAgICAgICAgICAgZCAqPSBjLCBwICo9IGMsIHMociwgbywgZCwgcCk7CiAgICAgICAgfSwKICAgICAgICBjYWxjOiBmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIGxldCByID0gbiAqIG4sIG8gPSByICogbjsKICAgICAgICAgICAgcmV0dXJuIGggKyB0ICogbiArIGUgKiByICsgaSAqIG87CiAgICAgICAgfQogICAgfTsKfQp2YXIgRXMgPSBuZXcgdywgbnIgPSBuZXcgR28sIHJyID0gbmV3IEdvLCBvciA9IG5ldyBHbywgUHIgPSBjbGFzcyBleHRlbmRzIFJ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBbXSwgZSA9ICExLCBpID0gImNlbnRyaXBldGFsIiwgcyA9IC41KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzQ2F0bXVsbFJvbUN1cnZlMyA9ICEwLCB0aGlzLnR5cGUgPSAiQ2F0bXVsbFJvbUN1cnZlMyIsIHRoaXMucG9pbnRzID0gdCwgdGhpcy5jbG9zZWQgPSBlLCB0aGlzLmN1cnZlVHlwZSA9IGksIHRoaXMudGVuc2lvbiA9IHM7CiAgICB9CiAgICBnZXRQb2ludCh0LCBlID0gbmV3IHcpIHsKICAgICAgICBsZXQgaSA9IGUsIHMgPSB0aGlzLnBvaW50cywgbiA9IHMubGVuZ3RoLCByID0gKG4gLSAodGhpcy5jbG9zZWQgPyAwIDogMSkpICogdCwgbyA9IE1hdGguZmxvb3IociksIGEgPSByIC0gbzsKICAgICAgICB0aGlzLmNsb3NlZCA/IG8gKz0gbyA+IDAgPyAwIDogKE1hdGguZmxvb3IoTWF0aC5hYnMobykgLyBuKSArIDEpICogbiA6IGEgPT09IDAgJiYgbyA9PT0gbiAtIDEgJiYgKG8gPSBuIC0gMiwgYSA9IDEpOwogICAgICAgIGxldCBsLCBjOwogICAgICAgIHRoaXMuY2xvc2VkIHx8IG8gPiAwID8gbCA9IHNbKG8gLSAxKSAlIG5dIDogKEVzLnN1YlZlY3RvcnMoc1swXSwgc1sxXSkuYWRkKHNbMF0pLCBsID0gRXMpOwogICAgICAgIGxldCB1ID0gc1tvICUgbl0sIGQgPSBzWyhvICsgMSkgJSBuXTsKICAgICAgICBpZiAodGhpcy5jbG9zZWQgfHwgbyArIDIgPCBuID8gYyA9IHNbKG8gKyAyKSAlIG5dIDogKEVzLnN1YlZlY3RvcnMoc1tuIC0gMV0sIHNbbiAtIDJdKS5hZGQoc1tuIC0gMV0pLCBjID0gRXMpLCB0aGlzLmN1cnZlVHlwZSA9PT0gImNlbnRyaXBldGFsIiB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gImNob3JkYWwiKSB7CiAgICAgICAgICAgIGxldCBwID0gdGhpcy5jdXJ2ZVR5cGUgPT09ICJjaG9yZGFsIiA/IC41IDogLjI1LCBmID0gTWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSwgcCksIG0gPSBNYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGQpLCBwKSwgeTEgPSBNYXRoLnBvdyhkLmRpc3RhbmNlVG9TcXVhcmVkKGMpLCBwKTsKICAgICAgICAgICAgbSA8IDFlLTQgJiYgKG0gPSAxKSwgZiA8IDFlLTQgJiYgKGYgPSBtKSwgeTEgPCAxZS00ICYmICh5MSA9IG0pLCBuci5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC54LCB1LngsIGQueCwgYy54LCBmLCBtLCB5MSksIHJyLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksIHUueSwgZC55LCBjLnksIGYsIG0sIHkxKSwgb3IuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGwueiwgdS56LCBkLnosIGMueiwgZiwgbSwgeTEpOwogICAgICAgIH0gZWxzZSB0aGlzLmN1cnZlVHlwZSA9PT0gImNhdG11bGxyb20iICYmIChuci5pbml0Q2F0bXVsbFJvbShsLngsIHUueCwgZC54LCBjLngsIHRoaXMudGVuc2lvbiksIHJyLmluaXRDYXRtdWxsUm9tKGwueSwgdS55LCBkLnksIGMueSwgdGhpcy50ZW5zaW9uKSwgb3IuaW5pdENhdG11bGxSb20obC56LCB1LnosIGQueiwgYy56LCB0aGlzLnRlbnNpb24pKTsKICAgICAgICByZXR1cm4gaS5zZXQobnIuY2FsYyhhKSwgcnIuY2FsYyhhKSwgb3IuY2FsYyhhKSksIGk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICBzdXBlci5jb3B5KHQpLCB0aGlzLnBvaW50cyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0LnBvaW50cy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHQucG9pbnRzW2VdOwogICAgICAgICAgICB0aGlzLnBvaW50cy5wdXNoKHMuY2xvbmUoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNsb3NlZCA9IHQuY2xvc2VkLCB0aGlzLmN1cnZlVHlwZSA9IHQuY3VydmVUeXBlLCB0aGlzLnRlbnNpb24gPSB0LnRlbnNpb24sIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICB0LnBvaW50cyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHRoaXMucG9pbnRzW2VdOwogICAgICAgICAgICB0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQuY2xvc2VkID0gdGhpcy5jbG9zZWQsIHQuY3VydmVUeXBlID0gdGhpcy5jdXJ2ZVR5cGUsIHQudGVuc2lvbiA9IHRoaXMudGVuc2lvbiwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICBzdXBlci5mcm9tSlNPTih0KSwgdGhpcy5wb2ludHMgPSBbXTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdC5wb2ludHMubGVuZ3RoOyBlIDwgaTsgZSsrKXsKICAgICAgICAgICAgbGV0IHMgPSB0LnBvaW50c1tlXTsKICAgICAgICAgICAgdGhpcy5wb2ludHMucHVzaChuZXcgdygpLmZyb21BcnJheShzKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNsb3NlZCA9IHQuY2xvc2VkLCB0aGlzLmN1cnZlVHlwZSA9IHQuY3VydmVUeXBlLCB0aGlzLnRlbnNpb24gPSB0LnRlbnNpb24sIHRoaXM7CiAgICB9Cn07CmZ1bmN0aW9uIGxoKGgsIHQsIGUsIGksIHMpIHsKICAgIGxldCBuID0gKGkgLSB0KSAqIC41LCByID0gKHMgLSBlKSAqIC41LCBvID0gaCAqIGgsIGEgPSBoICogbzsKICAgIHJldHVybiAoMiAqIGUgLSAyICogaSArIG4gKyByKSAqIGEgKyAoLTMgKiBlICsgMyAqIGkgLSAyICogbiAtIHIpICogbyArIG4gKiBoICsgZTsKfQpmdW5jdGlvbiBXdShoLCB0KSB7CiAgICBsZXQgZSA9IDEgLSBoOwogICAgcmV0dXJuIGUgKiBlICogdDsKfQpmdW5jdGlvbiBIdShoLCB0KSB7CiAgICByZXR1cm4gMiAqICgxIC0gaCkgKiBoICogdDsKfQpmdW5jdGlvbiBxdShoLCB0KSB7CiAgICByZXR1cm4gaCAqIGggKiB0Owp9CmZ1bmN0aW9uIFZpKGgsIHQsIGUsIGkpIHsKICAgIHJldHVybiBXdShoLCB0KSArIEh1KGgsIGUpICsgcXUoaCwgaSk7Cn0KZnVuY3Rpb24gR3UoaCwgdCkgewogICAgbGV0IGUgPSAxIC0gaDsKICAgIHJldHVybiBlICogZSAqIGUgKiB0Owp9CmZ1bmN0aW9uIFh1KGgsIHQpIHsKICAgIGxldCBlID0gMSAtIGg7CiAgICByZXR1cm4gMyAqIGUgKiBlICogaCAqIHQ7Cn0KZnVuY3Rpb24gSnUoaCwgdCkgewogICAgcmV0dXJuIDMgKiAoMSAtIGgpICogaCAqIGggKiB0Owp9CmZ1bmN0aW9uIFp1KGgsIHQpIHsKICAgIHJldHVybiBoICogaCAqIGggKiB0Owp9CmZ1bmN0aW9uIERpKGgsIHQsIGUsIGksIHMpIHsKICAgIHJldHVybiBHdShoLCB0KSArIFh1KGgsIGUpICsgSnUoaCwgaSkgKyBadShoLCBzKTsKfQp2YXIgYW4gPSBjbGFzcyBleHRlbmRzIFJ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgVCwgZSA9IG5ldyBULCBpID0gbmV3IFQsIHMgPSBuZXcgVCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc0N1YmljQmV6aWVyQ3VydmUgPSAhMCwgdGhpcy50eXBlID0gIkN1YmljQmV6aWVyQ3VydmUiLCB0aGlzLnYwID0gdCwgdGhpcy52MSA9IGUsIHRoaXMudjIgPSBpLCB0aGlzLnYzID0gczsKICAgIH0KICAgIGdldFBvaW50KHQsIGUgPSBuZXcgVCkgewogICAgICAgIGxldCBpID0gZSwgcyA9IHRoaXMudjAsIG4gPSB0aGlzLnYxLCByID0gdGhpcy52MiwgbyA9IHRoaXMudjM7CiAgICAgICAgcmV0dXJuIGkuc2V0KERpKHQsIHMueCwgbi54LCByLngsIG8ueCksIERpKHQsIHMueSwgbi55LCByLnksIG8ueSkpLCBpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMudjAuY29weSh0LnYwKSwgdGhpcy52MS5jb3B5KHQudjEpLCB0aGlzLnYyLmNvcHkodC52MiksIHRoaXMudjMuY29weSh0LnYzKSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpOwogICAgICAgIHJldHVybiB0LnYwID0gdGhpcy52MC50b0FycmF5KCksIHQudjEgPSB0aGlzLnYxLnRvQXJyYXkoKSwgdC52MiA9IHRoaXMudjIudG9BcnJheSgpLCB0LnYzID0gdGhpcy52My50b0FycmF5KCksIHQ7CiAgICB9CiAgICBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLCB0aGlzLnYwLmZyb21BcnJheSh0LnYwKSwgdGhpcy52MS5mcm9tQXJyYXkodC52MSksIHRoaXMudjIuZnJvbUFycmF5KHQudjIpLCB0aGlzLnYzLmZyb21BcnJheSh0LnYzKSwgdGhpczsKICAgIH0KfSwgT3IgPSBjbGFzcyBleHRlbmRzIFJ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgdywgZSA9IG5ldyB3LCBpID0gbmV3IHcsIHMgPSBuZXcgdyl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc0N1YmljQmV6aWVyQ3VydmUzID0gITAsIHRoaXMudHlwZSA9ICJDdWJpY0JlemllckN1cnZlMyIsIHRoaXMudjAgPSB0LCB0aGlzLnYxID0gZSwgdGhpcy52MiA9IGksIHRoaXMudjMgPSBzOwogICAgfQogICAgZ2V0UG9pbnQodCwgZSA9IG5ldyB3KSB7CiAgICAgICAgbGV0IGkgPSBlLCBzID0gdGhpcy52MCwgbiA9IHRoaXMudjEsIHIgPSB0aGlzLnYyLCBvID0gdGhpcy52MzsKICAgICAgICByZXR1cm4gaS5zZXQoRGkodCwgcy54LCBuLngsIHIueCwgby54KSwgRGkodCwgcy55LCBuLnksIHIueSwgby55KSwgRGkodCwgcy56LCBuLnosIHIueiwgby56KSksIGk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy52MC5jb3B5KHQudjApLCB0aGlzLnYxLmNvcHkodC52MSksIHRoaXMudjIuY29weSh0LnYyKSwgdGhpcy52My5jb3B5KHQudjMpLCB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gc3VwZXIudG9KU09OKCk7CiAgICAgICAgcmV0dXJuIHQudjAgPSB0aGlzLnYwLnRvQXJyYXkoKSwgdC52MSA9IHRoaXMudjEudG9BcnJheSgpLCB0LnYyID0gdGhpcy52Mi50b0FycmF5KCksIHQudjMgPSB0aGlzLnYzLnRvQXJyYXkoKSwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMudjAuZnJvbUFycmF5KHQudjApLCB0aGlzLnYxLmZyb21BcnJheSh0LnYxKSwgdGhpcy52Mi5mcm9tQXJyYXkodC52MiksIHRoaXMudjMuZnJvbUFycmF5KHQudjMpLCB0aGlzOwogICAgfQp9LCBobiA9IGNsYXNzIGV4dGVuZHMgUnQgewogICAgY29uc3RydWN0b3IodCA9IG5ldyBULCBlID0gbmV3IFQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNMaW5lQ3VydmUgPSAhMCwgdGhpcy50eXBlID0gIkxpbmVDdXJ2ZSIsIHRoaXMudjEgPSB0LCB0aGlzLnYyID0gZTsKICAgIH0KICAgIGdldFBvaW50KHQsIGUgPSBuZXcgVCkgewogICAgICAgIGxldCBpID0gZTsKICAgICAgICByZXR1cm4gdCA9PT0gMSA/IGkuY29weSh0aGlzLnYyKSA6IChpLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLCBpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksIGk7CiAgICB9CiAgICBnZXRQb2ludEF0KHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludCh0LCBlKTsKICAgIH0KICAgIGdldFRhbmdlbnQodCwgZSA9IG5ldyBUKSB7CiAgICAgICAgcmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLCB0aGlzLnYxKS5ub3JtYWxpemUoKTsKICAgIH0KICAgIGdldFRhbmdlbnRBdCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LCBlKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnYxLmNvcHkodC52MSksIHRoaXMudjIuY29weSh0LnYyKSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpOwogICAgICAgIHJldHVybiB0LnYxID0gdGhpcy52MS50b0FycmF5KCksIHQudjIgPSB0aGlzLnYyLnRvQXJyYXkoKSwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMudjEuZnJvbUFycmF5KHQudjEpLCB0aGlzLnYyLmZyb21BcnJheSh0LnYyKSwgdGhpczsKICAgIH0KfSwgTnIgPSBjbGFzcyBleHRlbmRzIFJ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgdywgZSA9IG5ldyB3KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTGluZUN1cnZlMyA9ICEwLCB0aGlzLnR5cGUgPSAiTGluZUN1cnZlMyIsIHRoaXMudjEgPSB0LCB0aGlzLnYyID0gZTsKICAgIH0KICAgIGdldFBvaW50KHQsIGUgPSBuZXcgdykgewogICAgICAgIGxldCBpID0gZTsKICAgICAgICByZXR1cm4gdCA9PT0gMSA/IGkuY29weSh0aGlzLnYyKSA6IChpLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLCBpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksIGk7CiAgICB9CiAgICBnZXRQb2ludEF0KHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludCh0LCBlKTsKICAgIH0KICAgIGdldFRhbmdlbnQodCwgZSA9IG5ldyB3KSB7CiAgICAgICAgcmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLCB0aGlzLnYxKS5ub3JtYWxpemUoKTsKICAgIH0KICAgIGdldFRhbmdlbnRBdCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LCBlKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnYxLmNvcHkodC52MSksIHRoaXMudjIuY29weSh0LnYyKSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpOwogICAgICAgIHJldHVybiB0LnYxID0gdGhpcy52MS50b0FycmF5KCksIHQudjIgPSB0aGlzLnYyLnRvQXJyYXkoKSwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMudjEuZnJvbUFycmF5KHQudjEpLCB0aGlzLnYyLmZyb21BcnJheSh0LnYyKSwgdGhpczsKICAgIH0KfSwgbG4gPSBjbGFzcyBleHRlbmRzIFJ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgVCwgZSA9IG5ldyBULCBpID0gbmV3IFQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9ICEwLCB0aGlzLnR5cGUgPSAiUXVhZHJhdGljQmV6aWVyQ3VydmUiLCB0aGlzLnYwID0gdCwgdGhpcy52MSA9IGUsIHRoaXMudjIgPSBpOwogICAgfQogICAgZ2V0UG9pbnQodCwgZSA9IG5ldyBUKSB7CiAgICAgICAgbGV0IGkgPSBlLCBzID0gdGhpcy52MCwgbiA9IHRoaXMudjEsIHIgPSB0aGlzLnYyOwogICAgICAgIHJldHVybiBpLnNldChWaSh0LCBzLngsIG4ueCwgci54KSwgVmkodCwgcy55LCBuLnksIHIueSkpLCBpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMudjAuY29weSh0LnYwKSwgdGhpcy52MS5jb3B5KHQudjEpLCB0aGlzLnYyLmNvcHkodC52MiksIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICByZXR1cm4gdC52MCA9IHRoaXMudjAudG9BcnJheSgpLCB0LnYxID0gdGhpcy52MS50b0FycmF5KCksIHQudjIgPSB0aGlzLnYyLnRvQXJyYXkoKSwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMudjAuZnJvbUFycmF5KHQudjApLCB0aGlzLnYxLmZyb21BcnJheSh0LnYxKSwgdGhpcy52Mi5mcm9tQXJyYXkodC52MiksIHRoaXM7CiAgICB9Cn0sIGNuID0gY2xhc3MgZXh0ZW5kcyBSdCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IHcsIGUgPSBuZXcgdywgaSA9IG5ldyB3KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gITAsIHRoaXMudHlwZSA9ICJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCB0aGlzLnYwID0gdCwgdGhpcy52MSA9IGUsIHRoaXMudjIgPSBpOwogICAgfQogICAgZ2V0UG9pbnQodCwgZSA9IG5ldyB3KSB7CiAgICAgICAgbGV0IGkgPSBlLCBzID0gdGhpcy52MCwgbiA9IHRoaXMudjEsIHIgPSB0aGlzLnYyOwogICAgICAgIHJldHVybiBpLnNldChWaSh0LCBzLngsIG4ueCwgci54KSwgVmkodCwgcy55LCBuLnksIHIueSksIFZpKHQsIHMueiwgbi56LCByLnopKSwgaTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnYwLmNvcHkodC52MCksIHRoaXMudjEuY29weSh0LnYxKSwgdGhpcy52Mi5jb3B5KHQudjIpLCB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gc3VwZXIudG9KU09OKCk7CiAgICAgICAgcmV0dXJuIHQudjAgPSB0aGlzLnYwLnRvQXJyYXkoKSwgdC52MSA9IHRoaXMudjEudG9BcnJheSgpLCB0LnYyID0gdGhpcy52Mi50b0FycmF5KCksIHQ7CiAgICB9CiAgICBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLCB0aGlzLnYwLmZyb21BcnJheSh0LnYwKSwgdGhpcy52MS5mcm9tQXJyYXkodC52MSksIHRoaXMudjIuZnJvbUFycmF5KHQudjIpLCB0aGlzOwogICAgfQp9LCB1biA9IGNsYXNzIGV4dGVuZHMgUnQgewogICAgY29uc3RydWN0b3IodCA9IFtdKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzU3BsaW5lQ3VydmUgPSAhMCwgdGhpcy50eXBlID0gIlNwbGluZUN1cnZlIiwgdGhpcy5wb2ludHMgPSB0OwogICAgfQogICAgZ2V0UG9pbnQodCwgZSA9IG5ldyBUKSB7CiAgICAgICAgbGV0IGkgPSBlLCBzID0gdGhpcy5wb2ludHMsIG4gPSAocy5sZW5ndGggLSAxKSAqIHQsIHIgPSBNYXRoLmZsb29yKG4pLCBvID0gbiAtIHIsIGEgPSBzW3IgPT09IDAgPyByIDogciAtIDFdLCBsID0gc1tyXSwgYyA9IHNbciA+IHMubGVuZ3RoIC0gMiA/IHMubGVuZ3RoIC0gMSA6IHIgKyAxXSwgdSA9IHNbciA+IHMubGVuZ3RoIC0gMyA/IHMubGVuZ3RoIC0gMSA6IHIgKyAyXTsKICAgICAgICByZXR1cm4gaS5zZXQobGgobywgYS54LCBsLngsIGMueCwgdS54KSwgbGgobywgYS55LCBsLnksIGMueSwgdS55KSksIGk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICBzdXBlci5jb3B5KHQpLCB0aGlzLnBvaW50cyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0LnBvaW50cy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHQucG9pbnRzW2VdOwogICAgICAgICAgICB0aGlzLnBvaW50cy5wdXNoKHMuY2xvbmUoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gc3VwZXIudG9KU09OKCk7CiAgICAgICAgdC5wb2ludHMgPSBbXTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdGhpcy5wb2ludHMubGVuZ3RoOyBlIDwgaTsgZSsrKXsKICAgICAgICAgICAgbGV0IHMgPSB0aGlzLnBvaW50c1tlXTsKICAgICAgICAgICAgdC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OwogICAgfQogICAgZnJvbUpTT04odCkgewogICAgICAgIHN1cGVyLmZyb21KU09OKHQpLCB0aGlzLnBvaW50cyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0LnBvaW50cy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHQucG9pbnRzW2VdOwogICAgICAgICAgICB0aGlzLnBvaW50cy5wdXNoKG5ldyBUKCkuZnJvbUFycmF5KHMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn0sIGRuID0gT2JqZWN0LmZyZWV6ZSh7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBBcmNDdXJ2ZToga3IsCiAgICBDYXRtdWxsUm9tQ3VydmUzOiBQciwKICAgIEN1YmljQmV6aWVyQ3VydmU6IGFuLAogICAgQ3ViaWNCZXppZXJDdXJ2ZTM6IE9yLAogICAgRWxsaXBzZUN1cnZlOiBZaSwKICAgIExpbmVDdXJ2ZTogaG4sCiAgICBMaW5lQ3VydmUzOiBOciwKICAgIFF1YWRyYXRpY0JlemllckN1cnZlOiBsbiwKICAgIFF1YWRyYXRpY0JlemllckN1cnZlMzogY24sCiAgICBTcGxpbmVDdXJ2ZTogdW4KfSksIFZyID0gY2xhc3MgZXh0ZW5kcyBSdCB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJDdXJ2ZVBhdGgiLCB0aGlzLmN1cnZlcyA9IFtdLCB0aGlzLmF1dG9DbG9zZSA9ICExOwogICAgfQogICAgYWRkKHQpIHsKICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKHQpOwogICAgfQogICAgY2xvc2VQYXRoKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksIGUgPSB0aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGggLSAxXS5nZXRQb2ludCgxKTsKICAgICAgICBpZiAoIXQuZXF1YWxzKGUpKSB7CiAgICAgICAgICAgIGxldCBpID0gdC5pc1ZlY3RvcjIgPT09ICEwID8gIkxpbmVDdXJ2ZSIgOiAiTGluZUN1cnZlMyI7CiAgICAgICAgICAgIHRoaXMuY3VydmVzLnB1c2gobmV3IGRuW2ldKGUsIHQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRQb2ludCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0ICogdGhpcy5nZXRMZW5ndGgoKSwgcyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCksIG4gPSAwOwogICAgICAgIGZvcig7IG4gPCBzLmxlbmd0aDspewogICAgICAgICAgICBpZiAoc1tuXSA+PSBpKSB7CiAgICAgICAgICAgICAgICBsZXQgciA9IHNbbl0gLSBpLCBvID0gdGhpcy5jdXJ2ZXNbbl0sIGEgPSBvLmdldExlbmd0aCgpLCBsID0gYSA9PT0gMCA/IDAgOiAxIC0gciAvIGE7CiAgICAgICAgICAgICAgICByZXR1cm4gby5nZXRQb2ludEF0KGwsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4rKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBnZXRMZW5ndGgoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpOwogICAgICAgIHJldHVybiB0W3QubGVuZ3RoIC0gMV07CiAgICB9CiAgICB1cGRhdGVBcmNMZW5ndGhzKCkgewogICAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSAhMCwgdGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsLCB0aGlzLmdldEN1cnZlTGVuZ3RocygpOwogICAgfQogICAgZ2V0Q3VydmVMZW5ndGhzKCkgewogICAgICAgIGlmICh0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzOwogICAgICAgIGxldCB0ID0gW10sIGUgPSAwOwogICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBzOyBpKyspZSArPSB0aGlzLmN1cnZlc1tpXS5nZXRMZW5ndGgoKSwgdC5wdXNoKGUpOwogICAgICAgIHJldHVybiB0aGlzLmNhY2hlTGVuZ3RocyA9IHQsIHQ7CiAgICB9CiAgICBnZXRTcGFjZWRQb2ludHModCA9IDQwKSB7CiAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDw9IHQ7IGkrKyllLnB1c2godGhpcy5nZXRQb2ludChpIC8gdCkpOwogICAgICAgIHJldHVybiB0aGlzLmF1dG9DbG9zZSAmJiBlLnB1c2goZVswXSksIGU7CiAgICB9CiAgICBnZXRQb2ludHModCA9IDEyKSB7CiAgICAgICAgbGV0IGUgPSBbXSwgaTsKICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gdGhpcy5jdXJ2ZXM7IHMgPCBuLmxlbmd0aDsgcysrKXsKICAgICAgICAgICAgbGV0IHIgPSBuW3NdLCBvID0gci5pc0VsbGlwc2VDdXJ2ZSA/IHQgKiAyIDogci5pc0xpbmVDdXJ2ZSB8fCByLmlzTGluZUN1cnZlMyA/IDEgOiByLmlzU3BsaW5lQ3VydmUgPyB0ICogci5wb2ludHMubGVuZ3RoIDogdCwgYSA9IHIuZ2V0UG9pbnRzKG8pOwogICAgICAgICAgICBmb3IobGV0IGwgPSAwOyBsIDwgYS5sZW5ndGg7IGwrKyl7CiAgICAgICAgICAgICAgICBsZXQgYyA9IGFbbF07CiAgICAgICAgICAgICAgICBpICYmIGkuZXF1YWxzKGMpIHx8IChlLnB1c2goYyksIGkgPSBjKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5hdXRvQ2xvc2UgJiYgZS5sZW5ndGggPiAxICYmICFlW2UubGVuZ3RoIC0gMV0uZXF1YWxzKGVbMF0pICYmIGUucHVzaChlWzBdKSwgZTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHN1cGVyLmNvcHkodCksIHRoaXMuY3VydmVzID0gW107CiAgICAgICAgZm9yKGxldCBlID0gMCwgaSA9IHQuY3VydmVzLmxlbmd0aDsgZSA8IGk7IGUrKyl7CiAgICAgICAgICAgIGxldCBzID0gdC5jdXJ2ZXNbZV07CiAgICAgICAgICAgIHRoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b0Nsb3NlID0gdC5hdXRvQ2xvc2UsIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICB0LmF1dG9DbG9zZSA9IHRoaXMuYXV0b0Nsb3NlLCB0LmN1cnZlcyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHRoaXMuY3VydmVzW2VdOwogICAgICAgICAgICB0LmN1cnZlcy5wdXNoKHMudG9KU09OKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICBzdXBlci5mcm9tSlNPTih0KSwgdGhpcy5hdXRvQ2xvc2UgPSB0LmF1dG9DbG9zZSwgdGhpcy5jdXJ2ZXMgPSBbXTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdC5jdXJ2ZXMubGVuZ3RoOyBlIDwgaTsgZSsrKXsKICAgICAgICAgICAgbGV0IHMgPSB0LmN1cnZlc1tlXTsKICAgICAgICAgICAgdGhpcy5jdXJ2ZXMucHVzaChuZXcgZG5bcy50eXBlXSgpLmZyb21KU09OKHMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn0sIG1pID0gY2xhc3MgZXh0ZW5kcyBWciB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiUGF0aCIsIHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFQsIHQgJiYgdGhpcy5zZXRGcm9tUG9pbnRzKHQpOwogICAgfQogICAgc2V0RnJvbVBvaW50cyh0KSB7CiAgICAgICAgdGhpcy5tb3ZlVG8odFswXS54LCB0WzBdLnkpOwogICAgICAgIGZvcihsZXQgZSA9IDEsIGkgPSB0Lmxlbmd0aDsgZSA8IGk7IGUrKyl0aGlzLmxpbmVUbyh0W2VdLngsIHRbZV0ueSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtb3ZlVG8odCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCwgZSksIHRoaXM7CiAgICB9CiAgICBsaW5lVG8odCwgZSkgewogICAgICAgIGxldCBpID0gbmV3IGhuKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBUKHQsIGUpKTsKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChpKSwgdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsIGUpLCB0aGlzOwogICAgfQogICAgcXVhZHJhdGljQ3VydmVUbyh0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSBuZXcgbG4odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFQodCwgZSksIG5ldyBUKGksIHMpKTsKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSwgdGhpcy5jdXJyZW50UG9pbnQuc2V0KGksIHMpLCB0aGlzOwogICAgfQogICAgYmV6aWVyQ3VydmVUbyh0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgbGV0IG8gPSBuZXcgYW4odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFQodCwgZSksIG5ldyBUKGksIHMpLCBuZXcgVChuLCByKSk7CiAgICAgICAgcmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobyksIHRoaXMuY3VycmVudFBvaW50LnNldChuLCByKSwgdGhpczsKICAgIH0KICAgIHNwbGluZVRocnUodCkgewogICAgICAgIGxldCBlID0gWwogICAgICAgICAgICB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpCiAgICAgICAgXS5jb25jYXQodCksIGkgPSBuZXcgdW4oZSk7CiAgICAgICAgcmV0dXJuIHRoaXMuY3VydmVzLnB1c2goaSksIHRoaXMuY3VycmVudFBvaW50LmNvcHkodFt0Lmxlbmd0aCAtIDFdKSwgdGhpczsKICAgIH0KICAgIGFyYyh0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgbGV0IG8gPSB0aGlzLmN1cnJlbnRQb2ludC54LCBhID0gdGhpcy5jdXJyZW50UG9pbnQueTsKICAgICAgICByZXR1cm4gdGhpcy5hYnNhcmModCArIG8sIGUgKyBhLCBpLCBzLCBuLCByKSwgdGhpczsKICAgIH0KICAgIGFic2FyYyh0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LCBlLCBpLCBpLCBzLCBuLCByKSwgdGhpczsKICAgIH0KICAgIGVsbGlwc2UodCwgZSwgaSwgcywgbiwgciwgbywgYSkgewogICAgICAgIGxldCBsID0gdGhpcy5jdXJyZW50UG9pbnQueCwgYyA9IHRoaXMuY3VycmVudFBvaW50Lnk7CiAgICAgICAgcmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0ICsgbCwgZSArIGMsIGksIHMsIG4sIHIsIG8sIGEpLCB0aGlzOwogICAgfQogICAgYWJzZWxsaXBzZSh0LCBlLCBpLCBzLCBuLCByLCBvLCBhKSB7CiAgICAgICAgbGV0IGwgPSBuZXcgWWkodCwgZSwgaSwgcywgbiwgciwgbywgYSk7CiAgICAgICAgaWYgKHRoaXMuY3VydmVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IHUgPSBsLmdldFBvaW50KDApOwogICAgICAgICAgICB1LmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCkgfHwgdGhpcy5saW5lVG8odS54LCB1LnkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKGwpOwogICAgICAgIGxldCBjID0gbC5nZXRQb2ludCgxKTsKICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShjKSwgdGhpczsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHQuY3VycmVudFBvaW50KSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpOwogICAgICAgIHJldHVybiB0LmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKSwgdDsKICAgIH0KICAgIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUpTT04odCksIHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSh0LmN1cnJlbnRQb2ludCksIHRoaXM7CiAgICB9Cn0sIHBuID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IFsKICAgICAgICBuZXcgVCgwLCAtLjUpLAogICAgICAgIG5ldyBUKC41LCAwKSwKICAgICAgICBuZXcgVCgwLCAuNSkKICAgIF0sIGUgPSAxMiwgaSA9IDAsIHMgPSBNYXRoLlBJICogMil7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIkxhdGhlR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHBvaW50czogdCwKICAgICAgICAgICAgc2VnbWVudHM6IGUsCiAgICAgICAgICAgIHBoaVN0YXJ0OiBpLAogICAgICAgICAgICBwaGlMZW5ndGg6IHMKICAgICAgICB9LCBlID0gTWF0aC5mbG9vcihlKSwgcyA9IE4ocywgMCwgTWF0aC5QSSAqIDIpOwogICAgICAgIGxldCBuID0gW10sIHIgPSBbXSwgbyA9IFtdLCBhID0gW10sIGwgPSBbXSwgYyA9IDEgLyBlLCB1ID0gbmV3IHcsIGQgPSBuZXcgVCwgcCA9IG5ldyB3LCBmID0gbmV3IHcsIG0gPSBuZXcgdywgeTEgPSAwLCBnID0gMDsKICAgICAgICBmb3IobGV0IHgxID0gMDsgeDEgPD0gdC5sZW5ndGggLSAxOyB4MSsrKXN3aXRjaCh4MSl7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHkxID0gdFt4MSArIDFdLnggLSB0W3gxXS54LCBnID0gdFt4MSArIDFdLnkgLSB0W3gxXS55LCBwLnggPSBnICogMSwgcC55ID0gLXkxLCBwLnogPSBnICogMCwgbS5jb3B5KHApLCBwLm5vcm1hbGl6ZSgpLCBhLnB1c2gocC54LCBwLnksIHAueik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0Lmxlbmd0aCAtIDE6CiAgICAgICAgICAgICAgICBhLnB1c2gobS54LCBtLnksIG0ueik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHkxID0gdFt4MSArIDFdLnggLSB0W3gxXS54LCBnID0gdFt4MSArIDFdLnkgLSB0W3gxXS55LCBwLnggPSBnICogMSwgcC55ID0gLXkxLCBwLnogPSBnICogMCwgZi5jb3B5KHApLCBwLnggKz0gbS54LCBwLnkgKz0gbS55LCBwLnogKz0gbS56LCBwLm5vcm1hbGl6ZSgpLCBhLnB1c2gocC54LCBwLnksIHAueiksIG0uY29weShmKTsKICAgICAgICB9CiAgICAgICAgZm9yKGxldCB4MSA9IDA7IHgxIDw9IGU7IHgxKyspewogICAgICAgICAgICBsZXQgYiA9IGkgKyB4MSAqIGMgKiBzLCBNID0gTWF0aC5zaW4oYiksIF8gPSBNYXRoLmNvcyhiKTsKICAgICAgICAgICAgZm9yKGxldCB2ID0gMDsgdiA8PSB0Lmxlbmd0aCAtIDE7IHYrKyl7CiAgICAgICAgICAgICAgICB1LnggPSB0W3ZdLnggKiBNLCB1LnkgPSB0W3ZdLnksIHUueiA9IHRbdl0ueCAqIF8sIHIucHVzaCh1LngsIHUueSwgdS56KSwgZC54ID0geDEgLyBlLCBkLnkgPSB2IC8gKHQubGVuZ3RoIC0gMSksIG8ucHVzaChkLngsIGQueSk7CiAgICAgICAgICAgICAgICBsZXQgUyA9IGFbMyAqIHYgKyAwXSAqIE0sIEEgPSBhWzMgKiB2ICsgMV0sIEkgPSBhWzMgKiB2ICsgMF0gKiBfOwogICAgICAgICAgICAgICAgbC5wdXNoKFMsIEEsIEkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihsZXQgeDEgPSAwOyB4MSA8IGU7IHgxKyspZm9yKGxldCBiID0gMDsgYiA8IHQubGVuZ3RoIC0gMTsgYisrKXsKICAgICAgICAgICAgbGV0IE0gPSBiICsgeDEgKiB0Lmxlbmd0aCwgXyA9IE0sIHYgPSBNICsgdC5sZW5ndGgsIFMgPSBNICsgdC5sZW5ndGggKyAxLCBBID0gTSArIDE7CiAgICAgICAgICAgIG4ucHVzaChfLCB2LCBBKSwgbi5wdXNoKFMsIEEsIHYpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldEluZGV4KG4pLCB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShyLCAzKSksIHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBFKG8sIDIpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBFKGwsIDMpKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0LnBhcmFtZXRlcnMpLCB0aGlzOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gbmV3IGgodC5wb2ludHMsIHQuc2VnbWVudHMsIHQucGhpU3RhcnQsIHQucGhpTGVuZ3RoKTsKICAgIH0KfSwgRHIgPSBjbGFzcyBoIGV4dGVuZHMgcG4gewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAxLCBpID0gNCwgcyA9IDgpewogICAgICAgIGxldCBuID0gbmV3IG1pOwogICAgICAgIG4uYWJzYXJjKDAsIC1lIC8gMiwgdCwgTWF0aC5QSSAqIDEuNSwgMCksIG4uYWJzYXJjKDAsIGUgLyAyLCB0LCAwLCBNYXRoLlBJICogLjUpLCBzdXBlcihuLmdldFBvaW50cyhpKSwgcyksIHRoaXMudHlwZSA9ICJDYXBzdWxlR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1czogdCwKICAgICAgICAgICAgbGVuZ3RoOiBlLAogICAgICAgICAgICBjYXBTZWdtZW50czogaSwKICAgICAgICAgICAgcmFkaWFsU2VnbWVudHM6IHMKICAgICAgICB9OwogICAgfQogICAgc3RhdGljIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gbmV3IGgodC5yYWRpdXMsIHQubGVuZ3RoLCB0LmNhcFNlZ21lbnRzLCB0LnJhZGlhbFNlZ21lbnRzKTsKICAgIH0KfSwgTHIgPSBjbGFzcyBoIGV4dGVuZHMgTCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IDMyLCBpID0gMCwgcyA9IE1hdGguUEkgKiAyKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiQ2lyY2xlR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1czogdCwKICAgICAgICAgICAgc2VnbWVudHM6IGUsCiAgICAgICAgICAgIHRoZXRhU3RhcnQ6IGksCiAgICAgICAgICAgIHRoZXRhTGVuZ3RoOiBzCiAgICAgICAgfSwgZSA9IE1hdGgubWF4KDMsIGUpOwogICAgICAgIGxldCBuID0gW10sIHIgPSBbXSwgbyA9IFtdLCBhID0gW10sIGwgPSBuZXcgdywgYyA9IG5ldyBUOwogICAgICAgIHIucHVzaCgwLCAwLCAwKSwgby5wdXNoKDAsIDAsIDEpLCBhLnB1c2goLjUsIC41KTsKICAgICAgICBmb3IobGV0IHUgPSAwLCBkID0gMzsgdSA8PSBlOyB1KyssIGQgKz0gMyl7CiAgICAgICAgICAgIGxldCBwID0gaSArIHUgLyBlICogczsKICAgICAgICAgICAgbC54ID0gdCAqIE1hdGguY29zKHApLCBsLnkgPSB0ICogTWF0aC5zaW4ocCksIHIucHVzaChsLngsIGwueSwgbC56KSwgby5wdXNoKDAsIDAsIDEpLCBjLnggPSAocltkXSAvIHQgKyAxKSAvIDIsIGMueSA9IChyW2QgKyAxXSAvIHQgKyAxKSAvIDIsIGEucHVzaChjLngsIGMueSk7CiAgICAgICAgfQogICAgICAgIGZvcihsZXQgdSA9IDE7IHUgPD0gZTsgdSsrKW4ucHVzaCh1LCB1ICsgMSwgMCk7CiAgICAgICAgdGhpcy5zZXRJbmRleChuKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUociwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUobywgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShhLCAyKSk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQucmFkaXVzLCB0LnNlZ21lbnRzLCB0LnRoZXRhU3RhcnQsIHQudGhldGFMZW5ndGgpOwogICAgfQp9LCAkaSA9IGNsYXNzIGggZXh0ZW5kcyBMIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMSwgaSA9IDEsIHMgPSAzMiwgbiA9IDEsIHIgPSAhMSwgbyA9IDAsIGEgPSBNYXRoLlBJICogMil7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIkN5bGluZGVyR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1c1RvcDogdCwKICAgICAgICAgICAgcmFkaXVzQm90dG9tOiBlLAogICAgICAgICAgICBoZWlnaHQ6IGksCiAgICAgICAgICAgIHJhZGlhbFNlZ21lbnRzOiBzLAogICAgICAgICAgICBoZWlnaHRTZWdtZW50czogbiwKICAgICAgICAgICAgb3BlbkVuZGVkOiByLAogICAgICAgICAgICB0aGV0YVN0YXJ0OiBvLAogICAgICAgICAgICB0aGV0YUxlbmd0aDogYQogICAgICAgIH07CiAgICAgICAgbGV0IGwgPSB0aGlzOwogICAgICAgIHMgPSBNYXRoLmZsb29yKHMpLCBuID0gTWF0aC5mbG9vcihuKTsKICAgICAgICBsZXQgYyA9IFtdLCB1ID0gW10sIGQgPSBbXSwgcCA9IFtdLCBmID0gMCwgbSA9IFtdLCB5MSA9IGkgLyAyLCBnID0gMDsKICAgICAgICB4MSgpLCByID09PSAhMSAmJiAodCA+IDAgJiYgYighMCksIGUgPiAwICYmIGIoITEpKSwgdGhpcy5zZXRJbmRleChjKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUodSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUoZCwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShwLCAyKSk7CiAgICAgICAgZnVuY3Rpb24geDEoKSB7CiAgICAgICAgICAgIGxldCBNID0gbmV3IHcsIF8gPSBuZXcgdywgdiA9IDAsIFMgPSAoZSAtIHQpIC8gaTsKICAgICAgICAgICAgZm9yKGxldCBBID0gMDsgQSA8PSBuOyBBKyspewogICAgICAgICAgICAgICAgbGV0IEkgPSBbXSwgQyA9IEEgLyBuLCBrID0gQyAqIChlIC0gdCkgKyB0OwogICAgICAgICAgICAgICAgZm9yKGxldCBVID0gMDsgVSA8PSBzOyBVKyspewogICAgICAgICAgICAgICAgICAgIGxldCBXID0gVSAvIHMsIEggPSBXICogYSArIG8sIFkgPSBNYXRoLnNpbihIKSwgUSA9IE1hdGguY29zKEgpOwogICAgICAgICAgICAgICAgICAgIF8ueCA9IGsgKiBZLCBfLnkgPSAtQyAqIGkgKyB5MSwgXy56ID0gayAqIFEsIHUucHVzaChfLngsIF8ueSwgXy56KSwgTS5zZXQoWSwgUywgUSkubm9ybWFsaXplKCksIGQucHVzaChNLngsIE0ueSwgTS56KSwgcC5wdXNoKFcsIDEgLSBDKSwgSS5wdXNoKGYrKyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtLnB1c2goSSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCBBID0gMDsgQSA8IHM7IEErKylmb3IobGV0IEkgPSAwOyBJIDwgbjsgSSsrKXsKICAgICAgICAgICAgICAgIGxldCBDID0gbVtJXVtBXSwgayA9IG1bSSArIDFdW0FdLCBVID0gbVtJICsgMV1bQSArIDFdLCBXID0gbVtJXVtBICsgMV07CiAgICAgICAgICAgICAgICAodCA+IDAgfHwgSSAhPT0gMCkgJiYgKGMucHVzaChDLCBrLCBXKSwgdiArPSAzKSwgKGUgPiAwIHx8IEkgIT09IG4gLSAxKSAmJiAoYy5wdXNoKGssIFUsIFcpLCB2ICs9IDMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGwuYWRkR3JvdXAoZywgdiwgMCksIGcgKz0gdjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYihNKSB7CiAgICAgICAgICAgIGxldCBfID0gZiwgdiA9IG5ldyBULCBTID0gbmV3IHcsIEEgPSAwLCBJID0gTSA9PT0gITAgPyB0IDogZSwgQyA9IE0gPT09ICEwID8gMSA6IC0xOwogICAgICAgICAgICBmb3IobGV0IFUgPSAxOyBVIDw9IHM7IFUrKyl1LnB1c2goMCwgeTEgKiBDLCAwKSwgZC5wdXNoKDAsIEMsIDApLCBwLnB1c2goLjUsIC41KSwgZisrOwogICAgICAgICAgICBsZXQgayA9IGY7CiAgICAgICAgICAgIGZvcihsZXQgVSA9IDA7IFUgPD0gczsgVSsrKXsKICAgICAgICAgICAgICAgIGxldCBIID0gVSAvIHMgKiBhICsgbywgWSA9IE1hdGguY29zKEgpLCBRID0gTWF0aC5zaW4oSCk7CiAgICAgICAgICAgICAgICBTLnggPSBJICogUSwgUy55ID0geTEgKiBDLCBTLnogPSBJICogWSwgdS5wdXNoKFMueCwgUy55LCBTLnopLCBkLnB1c2goMCwgQywgMCksIHYueCA9IFkgKiAuNSArIC41LCB2LnkgPSBRICogLjUgKiBDICsgLjUsIHAucHVzaCh2LngsIHYueSksIGYrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGV0IFUgPSAwOyBVIDwgczsgVSsrKXsKICAgICAgICAgICAgICAgIGxldCBXID0gXyArIFUsIEggPSBrICsgVTsKICAgICAgICAgICAgICAgIE0gPT09ICEwID8gYy5wdXNoKEgsIEggKyAxLCBXKSA6IGMucHVzaChIICsgMSwgSCwgVyksIEEgKz0gMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsLmFkZEdyb3VwKGcsIEEsIE0gPT09ICEwID8gMSA6IDIpLCBnICs9IEE7CiAgICAgICAgfQogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHQucGFyYW1ldGVycyksIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LnJhZGl1c1RvcCwgdC5yYWRpdXNCb3R0b20sIHQuaGVpZ2h0LCB0LnJhZGlhbFNlZ21lbnRzLCB0LmhlaWdodFNlZ21lbnRzLCB0Lm9wZW5FbmRlZCwgdC50aGV0YVN0YXJ0LCB0LnRoZXRhTGVuZ3RoKTsKICAgIH0KfSwgVXIgPSBjbGFzcyBoIGV4dGVuZHMgJGkgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAxLCBpID0gMzIsIHMgPSAxLCBuID0gITEsIHIgPSAwLCBvID0gTWF0aC5QSSAqIDIpewogICAgICAgIHN1cGVyKDAsIHQsIGUsIGksIHMsIG4sIHIsIG8pLCB0aGlzLnR5cGUgPSAiQ29uZUdlb21ldHJ5IiwgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgICAgICByYWRpdXM6IHQsCiAgICAgICAgICAgIGhlaWdodDogZSwKICAgICAgICAgICAgcmFkaWFsU2VnbWVudHM6IGksCiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzLAogICAgICAgICAgICBvcGVuRW5kZWQ6IG4sCiAgICAgICAgICAgIHRoZXRhU3RhcnQ6IHIsCiAgICAgICAgICAgIHRoZXRhTGVuZ3RoOiBvCiAgICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQucmFkaXVzLCB0LmhlaWdodCwgdC5yYWRpYWxTZWdtZW50cywgdC5oZWlnaHRTZWdtZW50cywgdC5vcGVuRW5kZWQsIHQudGhldGFTdGFydCwgdC50aGV0YUxlbmd0aCk7CiAgICB9Cn0sIFdlID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IFtdLCBlID0gW10sIGkgPSAxLCBzID0gMCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIlBvbHloZWRyb25HZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgdmVydGljZXM6IHQsCiAgICAgICAgICAgIGluZGljZXM6IGUsCiAgICAgICAgICAgIHJhZGl1czogaSwKICAgICAgICAgICAgZGV0YWlsOiBzCiAgICAgICAgfTsKICAgICAgICBsZXQgbiA9IFtdLCByID0gW107CiAgICAgICAgbyhzKSwgbChpKSwgYygpLCB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShuLCAzKSksIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgRShuLnNsaWNlKCksIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEUociwgMikpLCBzID09PSAwID8gdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpIDogdGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7CiAgICAgICAgZnVuY3Rpb24gbyh4MSkgewogICAgICAgICAgICBsZXQgYiA9IG5ldyB3LCBNID0gbmV3IHcsIF8gPSBuZXcgdzsKICAgICAgICAgICAgZm9yKGxldCB2ID0gMDsgdiA8IGUubGVuZ3RoOyB2ICs9IDMpcChlW3YgKyAwXSwgYiksIHAoZVt2ICsgMV0sIE0pLCBwKGVbdiArIDJdLCBfKSwgYShiLCBNLCBfLCB4MSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGEoeDEsIGIsIE0sIF8pIHsKICAgICAgICAgICAgbGV0IHYgPSBfICsgMSwgUyA9IFtdOwogICAgICAgICAgICBmb3IobGV0IEEgPSAwOyBBIDw9IHY7IEErKyl7CiAgICAgICAgICAgICAgICBTW0FdID0gW107CiAgICAgICAgICAgICAgICBsZXQgSSA9IHgxLmNsb25lKCkubGVycChNLCBBIC8gdiksIEMgPSBiLmNsb25lKCkubGVycChNLCBBIC8gdiksIGsgPSB2IC0gQTsKICAgICAgICAgICAgICAgIGZvcihsZXQgVSA9IDA7IFUgPD0gazsgVSsrKVUgPT09IDAgJiYgQSA9PT0gdiA/IFNbQV1bVV0gPSBJIDogU1tBXVtVXSA9IEkuY2xvbmUoKS5sZXJwKEMsIFUgLyBrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGV0IEEgPSAwOyBBIDwgdjsgQSsrKWZvcihsZXQgSSA9IDA7IEkgPCAyICogKHYgLSBBKSAtIDE7IEkrKyl7CiAgICAgICAgICAgICAgICBsZXQgQyA9IE1hdGguZmxvb3IoSSAvIDIpOwogICAgICAgICAgICAgICAgSSAlIDIgPT09IDAgPyAoZChTW0FdW0MgKyAxXSksIGQoU1tBICsgMV1bQ10pLCBkKFNbQV1bQ10pKSA6IChkKFNbQV1bQyArIDFdKSwgZChTW0EgKyAxXVtDICsgMV0pLCBkKFNbQSArIDFdW0NdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbCh4MSkgewogICAgICAgICAgICBsZXQgYiA9IG5ldyB3OwogICAgICAgICAgICBmb3IobGV0IE0gPSAwOyBNIDwgbi5sZW5ndGg7IE0gKz0gMyliLnggPSBuW00gKyAwXSwgYi55ID0gbltNICsgMV0sIGIueiA9IG5bTSArIDJdLCBiLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHgxKSwgbltNICsgMF0gPSBiLngsIG5bTSArIDFdID0gYi55LCBuW00gKyAyXSA9IGIuejsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgbGV0IHgxID0gbmV3IHc7CiAgICAgICAgICAgIGZvcihsZXQgYiA9IDA7IGIgPCBuLmxlbmd0aDsgYiArPSAzKXsKICAgICAgICAgICAgICAgIHgxLnggPSBuW2IgKyAwXSwgeDEueSA9IG5bYiArIDFdLCB4MS56ID0gbltiICsgMl07CiAgICAgICAgICAgICAgICBsZXQgTSA9IHkxKHgxKSAvIDIgLyBNYXRoLlBJICsgLjUsIF8gPSBnKHgxKSAvIE1hdGguUEkgKyAuNTsKICAgICAgICAgICAgICAgIHIucHVzaChNLCAxIC0gXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZigpLCB1KCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgIGZvcihsZXQgeDEgPSAwOyB4MSA8IHIubGVuZ3RoOyB4MSArPSA2KXsKICAgICAgICAgICAgICAgIGxldCBiID0gclt4MSArIDBdLCBNID0gclt4MSArIDJdLCBfID0gclt4MSArIDRdLCB2ID0gTWF0aC5tYXgoYiwgTSwgXyksIFMgPSBNYXRoLm1pbihiLCBNLCBfKTsKICAgICAgICAgICAgICAgIHYgPiAuOSAmJiBTIDwgLjEgJiYgKGIgPCAuMiAmJiAoclt4MSArIDBdICs9IDEpLCBNIDwgLjIgJiYgKHJbeDEgKyAyXSArPSAxKSwgXyA8IC4yICYmIChyW3gxICsgNF0gKz0gMSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGQoeDEpIHsKICAgICAgICAgICAgbi5wdXNoKHgxLngsIHgxLnksIHgxLnopOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwKHgxLCBiKSB7CiAgICAgICAgICAgIGxldCBNID0geDEgKiAzOwogICAgICAgICAgICBiLnggPSB0W00gKyAwXSwgYi55ID0gdFtNICsgMV0sIGIueiA9IHRbTSArIDJdOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICBsZXQgeDEgPSBuZXcgdywgYiA9IG5ldyB3LCBNID0gbmV3IHcsIF8gPSBuZXcgdywgdiA9IG5ldyBULCBTID0gbmV3IFQsIEEgPSBuZXcgVDsKICAgICAgICAgICAgZm9yKGxldCBJID0gMCwgQyA9IDA7IEkgPCBuLmxlbmd0aDsgSSArPSA5LCBDICs9IDYpewogICAgICAgICAgICAgICAgeDEuc2V0KG5bSSArIDBdLCBuW0kgKyAxXSwgbltJICsgMl0pLCBiLnNldChuW0kgKyAzXSwgbltJICsgNF0sIG5bSSArIDVdKSwgTS5zZXQobltJICsgNl0sIG5bSSArIDddLCBuW0kgKyA4XSksIHYuc2V0KHJbQyArIDBdLCByW0MgKyAxXSksIFMuc2V0KHJbQyArIDJdLCByW0MgKyAzXSksIEEuc2V0KHJbQyArIDRdLCByW0MgKyA1XSksIF8uY29weSh4MSkuYWRkKGIpLmFkZChNKS5kaXZpZGVTY2FsYXIoMyk7CiAgICAgICAgICAgICAgICBsZXQgayA9IHkxKF8pOwogICAgICAgICAgICAgICAgbSh2LCBDICsgMCwgeDEsIGspLCBtKFMsIEMgKyAyLCBiLCBrKSwgbShBLCBDICsgNCwgTSwgayk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbSh4MSwgYiwgTSwgXykgewogICAgICAgICAgICBfIDwgMCAmJiB4MS54ID09PSAxICYmIChyW2JdID0geDEueCAtIDEpLCBNLnggPT09IDAgJiYgTS56ID09PSAwICYmIChyW2JdID0gXyAvIDIgLyBNYXRoLlBJICsgLjUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB5MSh4MSkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih4MS56LCAteDEueCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGcoeDEpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoLXgxLnksIE1hdGguc3FydCh4MS54ICogeDEueCArIHgxLnogKiB4MS56KSk7CiAgICAgICAgfQogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHQucGFyYW1ldGVycyksIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LnZlcnRpY2VzLCB0LmluZGljZXMsIHQucmFkaXVzLCB0LmRldGFpbHMpOwogICAgfQp9LCBXciA9IGNsYXNzIGggZXh0ZW5kcyBXZSB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IDApewogICAgICAgIGxldCBpID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMiwgcyA9IDEgLyBpLCBuID0gWwogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAxLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtcywKICAgICAgICAgICAgLWksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1zLAogICAgICAgICAgICBpLAogICAgICAgICAgICAwLAogICAgICAgICAgICBzLAogICAgICAgICAgICAtaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgcywKICAgICAgICAgICAgaSwKICAgICAgICAgICAgLXMsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtcywKICAgICAgICAgICAgaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgcywKICAgICAgICAgICAgLWksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIHMsCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtcywKICAgICAgICAgICAgaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLXMsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICBzLAogICAgICAgICAgICBpLAogICAgICAgICAgICAwLAogICAgICAgICAgICBzCiAgICAgICAgXSwgciA9IFsKICAgICAgICAgICAgMywKICAgICAgICAgICAgMTEsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDE1LAogICAgICAgICAgICAzLAogICAgICAgICAgICAxNSwKICAgICAgICAgICAgMTMsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDE5LAogICAgICAgICAgICAxNywKICAgICAgICAgICAgNywKICAgICAgICAgICAgMTcsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDE1LAogICAgICAgICAgICAxNywKICAgICAgICAgICAgNCwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgMTcsCiAgICAgICAgICAgIDgsCiAgICAgICAgICAgIDEwLAogICAgICAgICAgICAxNywKICAgICAgICAgICAgMTAsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDgsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDE2LAogICAgICAgICAgICA4LAogICAgICAgICAgICAxNiwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMTAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxOCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMTgsCiAgICAgICAgICAgIDE2LAogICAgICAgICAgICA2LAogICAgICAgICAgICAxMCwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMTMsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDEzLAogICAgICAgICAgICAxNSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMTYsCiAgICAgICAgICAgIDE4LAogICAgICAgICAgICAyLAogICAgICAgICAgICAxOCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMTMsCiAgICAgICAgICAgIDE4LAogICAgICAgICAgICAxLAogICAgICAgICAgICA5LAogICAgICAgICAgICAxOCwKICAgICAgICAgICAgOSwKICAgICAgICAgICAgMTEsCiAgICAgICAgICAgIDE4LAogICAgICAgICAgICAxMSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMTQsCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICA0LAogICAgICAgICAgICAxMiwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgMTEsCiAgICAgICAgICAgIDksCiAgICAgICAgICAgIDUsCiAgICAgICAgICAgIDExLAogICAgICAgICAgICA1LAogICAgICAgICAgICAxOSwKICAgICAgICAgICAgMTEsCiAgICAgICAgICAgIDE5LAogICAgICAgICAgICA3LAogICAgICAgICAgICAxOSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMTQsCiAgICAgICAgICAgIDE5LAogICAgICAgICAgICAxNCwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMTksCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDE3LAogICAgICAgICAgICAxLAogICAgICAgICAgICAxMiwKICAgICAgICAgICAgMTQsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDE0LAogICAgICAgICAgICA1LAogICAgICAgICAgICAxLAogICAgICAgICAgICA1LAogICAgICAgICAgICA5CiAgICAgICAgXTsKICAgICAgICBzdXBlcihuLCByLCB0LCBlKSwgdGhpcy50eXBlID0gIkRvZGVjYWhlZHJvbkdlb21ldHJ5IiwgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgICAgICByYWRpdXM6IHQsCiAgICAgICAgICAgIGRldGFpbDogZQogICAgICAgIH07CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LnJhZGl1cywgdC5kZXRhaWwpOwogICAgfQp9LCBScyA9IG5ldyB3LCBrcyA9IG5ldyB3LCBhciA9IG5ldyB3LCBQcyA9IG5ldyBuZSwgSHIgPSBjbGFzcyBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IG51bGwsIGUgPSAxKXsKICAgICAgICBpZiAoc3VwZXIoKSwgdGhpcy50eXBlID0gIkVkZ2VzR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIGdlb21ldHJ5OiB0LAogICAgICAgICAgICB0aHJlc2hvbGRBbmdsZTogZQogICAgICAgIH0sIHQgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IHMgPSBNYXRoLnBvdygxMCwgNCksIG4gPSBNYXRoLmNvcyhEZSAqIGUpLCByID0gdC5nZXRJbmRleCgpLCBvID0gdC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksIGEgPSByID8gci5jb3VudCA6IG8uY291bnQsIGwgPSBbCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgXSwgYyA9IFsKICAgICAgICAgICAgICAgICJhIiwKICAgICAgICAgICAgICAgICJiIiwKICAgICAgICAgICAgICAgICJjIgogICAgICAgICAgICBdLCB1ID0gbmV3IEFycmF5KDMpLCBkID0ge30sIHAgPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBmID0gMDsgZiA8IGE7IGYgKz0gMyl7CiAgICAgICAgICAgICAgICByID8gKGxbMF0gPSByLmdldFgoZiksIGxbMV0gPSByLmdldFgoZiArIDEpLCBsWzJdID0gci5nZXRYKGYgKyAyKSkgOiAobFswXSA9IGYsIGxbMV0gPSBmICsgMSwgbFsyXSA9IGYgKyAyKTsKICAgICAgICAgICAgICAgIGxldCB7IGE6IG0gLCBiOiB5MSAsIGM6IGcgIH0gPSBQczsKICAgICAgICAgICAgICAgIGlmIChtLmZyb21CdWZmZXJBdHRyaWJ1dGUobywgbFswXSksIHkxLmZyb21CdWZmZXJBdHRyaWJ1dGUobywgbFsxXSksIGcuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLCBsWzJdKSwgUHMuZ2V0Tm9ybWFsKGFyKSwgdVswXSA9IGAke01hdGgucm91bmQobS54ICogcyl9LCR7TWF0aC5yb3VuZChtLnkgKiBzKX0sJHtNYXRoLnJvdW5kKG0ueiAqIHMpfWAsIHVbMV0gPSBgJHtNYXRoLnJvdW5kKHkxLnggKiBzKX0sJHtNYXRoLnJvdW5kKHkxLnkgKiBzKX0sJHtNYXRoLnJvdW5kKHkxLnogKiBzKX1gLCB1WzJdID0gYCR7TWF0aC5yb3VuZChnLnggKiBzKX0sJHtNYXRoLnJvdW5kKGcueSAqIHMpfSwke01hdGgucm91bmQoZy56ICogcyl9YCwgISh1WzBdID09PSB1WzFdIHx8IHVbMV0gPT09IHVbMl0gfHwgdVsyXSA9PT0gdVswXSkpIGZvcihsZXQgeDEgPSAwOyB4MSA8IDM7IHgxKyspewogICAgICAgICAgICAgICAgICAgIGxldCBiID0gKHgxICsgMSkgJSAzLCBNID0gdVt4MV0sIF8gPSB1W2JdLCB2ID0gUHNbY1t4MV1dLCBTID0gUHNbY1tiXV0sIEEgPSBgJHtNfV8ke199YCwgSSA9IGAke199XyR7TX1gOwogICAgICAgICAgICAgICAgICAgIEkgaW4gZCAmJiBkW0ldID8gKGFyLmRvdChkW0ldLm5vcm1hbCkgPD0gbiAmJiAocC5wdXNoKHYueCwgdi55LCB2LnopLCBwLnB1c2goUy54LCBTLnksIFMueikpLCBkW0ldID0gbnVsbCkgOiBBIGluIGQgfHwgKGRbQV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MDogbFt4MV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MTogbFtiXSwKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsOiBhci5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCBmIGluIGQpaWYgKGRbZl0pIHsKICAgICAgICAgICAgICAgIGxldCB7IGluZGV4MDogbSAsIGluZGV4MTogeTEgIH0gPSBkW2ZdOwogICAgICAgICAgICAgICAgUnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLCBtKSwga3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLCB5MSksIHAucHVzaChScy54LCBScy55LCBScy56KSwgcC5wdXNoKGtzLngsIGtzLnksIGtzLnopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKHAsIDMpKTsKICAgICAgICB9CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KfSwgTWUgPSBjbGFzcyBleHRlbmRzIG1pIHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKHQpLCB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLnR5cGUgPSAiU2hhcGUiLCB0aGlzLmhvbGVzID0gW107CiAgICB9CiAgICBnZXRQb2ludHNIb2xlcyh0KSB7CiAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBzOyBpKyspZVtpXSA9IHRoaXMuaG9sZXNbaV0uZ2V0UG9pbnRzKHQpOwogICAgICAgIHJldHVybiBlOwogICAgfQogICAgZXh0cmFjdFBvaW50cyh0KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2hhcGU6IHRoaXMuZ2V0UG9pbnRzKHQpLAogICAgICAgICAgICBob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyh0KQogICAgICAgIH07CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICBzdXBlci5jb3B5KHQpLCB0aGlzLmhvbGVzID0gW107CiAgICAgICAgZm9yKGxldCBlID0gMCwgaSA9IHQuaG9sZXMubGVuZ3RoOyBlIDwgaTsgZSsrKXsKICAgICAgICAgICAgbGV0IHMgPSB0LmhvbGVzW2VdOwogICAgICAgICAgICB0aGlzLmhvbGVzLnB1c2gocy5jbG9uZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICB0LnV1aWQgPSB0aGlzLnV1aWQsIHQuaG9sZXMgPSBbXTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdGhpcy5ob2xlcy5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgICAgICBsZXQgcyA9IHRoaXMuaG9sZXNbZV07CiAgICAgICAgICAgIHQuaG9sZXMucHVzaChzLnRvSlNPTigpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICBmcm9tSlNPTih0KSB7CiAgICAgICAgc3VwZXIuZnJvbUpTT04odCksIHRoaXMudXVpZCA9IHQudXVpZCwgdGhpcy5ob2xlcyA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDAsIGkgPSB0LmhvbGVzLmxlbmd0aDsgZSA8IGk7IGUrKyl7CiAgICAgICAgICAgIGxldCBzID0gdC5ob2xlc1tlXTsKICAgICAgICAgICAgdGhpcy5ob2xlcy5wdXNoKG5ldyBtaSgpLmZyb21KU09OKHMpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn0sIFl1ID0gewogICAgdHJpYW5ndWxhdGU6IGZ1bmN0aW9uKGgsIHQsIGUgPSAyKSB7CiAgICAgICAgbGV0IGkgPSB0ICYmIHQubGVuZ3RoLCBzID0gaSA/IHRbMF0gKiBlIDogaC5sZW5ndGgsIG4gPSBFbChoLCAwLCBzLCBlLCAhMCksIHIgPSBbXTsKICAgICAgICBpZiAoIW4gfHwgbi5uZXh0ID09PSBuLnByZXYpIHJldHVybiByOwogICAgICAgIGxldCBvLCBhLCBsLCBjLCB1LCBkLCBwOwogICAgICAgIGlmIChpICYmIChuID0gdGQoaCwgdCwgbiwgZSkpLCBoLmxlbmd0aCA+IDgwICogZSkgewogICAgICAgICAgICBvID0gbCA9IGhbMF0sIGEgPSBjID0gaFsxXTsKICAgICAgICAgICAgZm9yKGxldCBmID0gZTsgZiA8IHM7IGYgKz0gZSl1ID0gaFtmXSwgZCA9IGhbZiArIDFdLCB1IDwgbyAmJiAobyA9IHUpLCBkIDwgYSAmJiAoYSA9IGQpLCB1ID4gbCAmJiAobCA9IHUpLCBkID4gYyAmJiAoYyA9IGQpOwogICAgICAgICAgICBwID0gTWF0aC5tYXgobCAtIG8sIGMgLSBhKSwgcCA9IHAgIT09IDAgPyAzMjc2NyAvIHAgOiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUWkobiwgciwgZSwgbywgYSwgcCwgMCksIHI7CiAgICB9Cn07CmZ1bmN0aW9uIEVsKGgsIHQsIGUsIGksIHMpIHsKICAgIGxldCBuLCByOwogICAgaWYgKHMgPT09IHVkKGgsIHQsIGUsIGkpID4gMCkgZm9yKG4gPSB0OyBuIDwgZTsgbiArPSBpKXIgPSBjaChuLCBoW25dLCBoW24gKyAxXSwgcik7CiAgICBlbHNlIGZvcihuID0gZSAtIGk7IG4gPj0gdDsgbiAtPSBpKXIgPSBjaChuLCBoW25dLCBoW24gKyAxXSwgcik7CiAgICByZXR1cm4gciAmJiBTbihyLCByLm5leHQpICYmIChLaShyKSwgciA9IHIubmV4dCksIHI7Cn0KZnVuY3Rpb24gSGUoaCwgdCkgewogICAgaWYgKCFoKSByZXR1cm4gaDsKICAgIHQgfHwgKHQgPSBoKTsKICAgIGxldCBlID0gaCwgaTsKICAgIGRvIGlmIChpID0gITEsICFlLnN0ZWluZXIgJiYgKFNuKGUsIGUubmV4dCkgfHwgJChlLnByZXYsIGUsIGUubmV4dCkgPT09IDApKSB7CiAgICAgICAgaWYgKEtpKGUpLCBlID0gdCA9IGUucHJldiwgZSA9PT0gZS5uZXh0KSBicmVhazsKICAgICAgICBpID0gITA7CiAgICB9IGVsc2UgZSA9IGUubmV4dDsKICAgIHdoaWxlIChpIHx8IGUgIT09IHQpCiAgICByZXR1cm4gdDsKfQpmdW5jdGlvbiBRaShoLCB0LCBlLCBpLCBzLCBuLCByKSB7CiAgICBpZiAoIWgpIHJldHVybjsKICAgICFyICYmIG4gJiYgcmQoaCwgaSwgcywgbik7CiAgICBsZXQgbyA9IGgsIGEsIGw7CiAgICBmb3IoOyBoLnByZXYgIT09IGgubmV4dDspewogICAgICAgIGlmIChhID0gaC5wcmV2LCBsID0gaC5uZXh0LCBuID8gUXUoaCwgaSwgcywgbikgOiAkdShoKSkgewogICAgICAgICAgICB0LnB1c2goYS5pIC8gZSB8IDApLCB0LnB1c2goaC5pIC8gZSB8IDApLCB0LnB1c2gobC5pIC8gZSB8IDApLCBLaShoKSwgaCA9IGwubmV4dCwgbyA9IGwubmV4dDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChoID0gbCwgaCA9PT0gbykgewogICAgICAgICAgICByID8gciA9PT0gMSA/IChoID0ganUoSGUoaCksIHQsIGUpLCBRaShoLCB0LCBlLCBpLCBzLCBuLCAyKSkgOiByID09PSAyICYmIEt1KGgsIHQsIGUsIGksIHMsIG4pIDogUWkoSGUoaCksIHQsIGUsIGksIHMsIG4sIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gJHUoaCkgewogICAgbGV0IHQgPSBoLnByZXYsIGUgPSBoLCBpID0gaC5uZXh0OwogICAgaWYgKCQodCwgZSwgaSkgPj0gMCkgcmV0dXJuICExOwogICAgbGV0IHMgPSB0LngsIG4gPSBlLngsIHIgPSBpLngsIG8gPSB0LnksIGEgPSBlLnksIGwgPSBpLnksIGMgPSBzIDwgbiA/IHMgPCByID8gcyA6IHIgOiBuIDwgciA/IG4gOiByLCB1ID0gbyA8IGEgPyBvIDwgbCA/IG8gOiBsIDogYSA8IGwgPyBhIDogbCwgZCA9IHMgPiBuID8gcyA+IHIgPyBzIDogciA6IG4gPiByID8gbiA6IHIsIHAgPSBvID4gYSA/IG8gPiBsID8gbyA6IGwgOiBhID4gbCA/IGEgOiBsLCBmID0gaS5uZXh0OwogICAgZm9yKDsgZiAhPT0gdDspewogICAgICAgIGlmIChmLnggPj0gYyAmJiBmLnggPD0gZCAmJiBmLnkgPj0gdSAmJiBmLnkgPD0gcCAmJiB1aShzLCBvLCBuLCBhLCByLCBsLCBmLngsIGYueSkgJiYgJChmLnByZXYsIGYsIGYubmV4dCkgPj0gMCkgcmV0dXJuICExOwogICAgICAgIGYgPSBmLm5leHQ7CiAgICB9CiAgICByZXR1cm4gITA7Cn0KZnVuY3Rpb24gUXUoaCwgdCwgZSwgaSkgewogICAgbGV0IHMgPSBoLnByZXYsIG4gPSBoLCByID0gaC5uZXh0OwogICAgaWYgKCQocywgbiwgcikgPj0gMCkgcmV0dXJuICExOwogICAgbGV0IG8gPSBzLngsIGEgPSBuLngsIGwgPSByLngsIGMgPSBzLnksIHUgPSBuLnksIGQgPSByLnksIHAgPSBvIDwgYSA/IG8gPCBsID8gbyA6IGwgOiBhIDwgbCA/IGEgOiBsLCBmID0gYyA8IHUgPyBjIDwgZCA/IGMgOiBkIDogdSA8IGQgPyB1IDogZCwgbSA9IG8gPiBhID8gbyA+IGwgPyBvIDogbCA6IGEgPiBsID8gYSA6IGwsIHkxID0gYyA+IHUgPyBjID4gZCA/IGMgOiBkIDogdSA+IGQgPyB1IDogZCwgZyA9IHFyKHAsIGYsIHQsIGUsIGkpLCB4MSA9IHFyKG0sIHkxLCB0LCBlLCBpKSwgYiA9IGgucHJldlosIE0gPSBoLm5leHRaOwogICAgZm9yKDsgYiAmJiBiLnogPj0gZyAmJiBNICYmIE0ueiA8PSB4MTspewogICAgICAgIGlmIChiLnggPj0gcCAmJiBiLnggPD0gbSAmJiBiLnkgPj0gZiAmJiBiLnkgPD0geTEgJiYgYiAhPT0gcyAmJiBiICE9PSByICYmIHVpKG8sIGMsIGEsIHUsIGwsIGQsIGIueCwgYi55KSAmJiAkKGIucHJldiwgYiwgYi5uZXh0KSA+PSAwIHx8IChiID0gYi5wcmV2WiwgTS54ID49IHAgJiYgTS54IDw9IG0gJiYgTS55ID49IGYgJiYgTS55IDw9IHkxICYmIE0gIT09IHMgJiYgTSAhPT0gciAmJiB1aShvLCBjLCBhLCB1LCBsLCBkLCBNLngsIE0ueSkgJiYgJChNLnByZXYsIE0sIE0ubmV4dCkgPj0gMCkpIHJldHVybiAhMTsKICAgICAgICBNID0gTS5uZXh0WjsKICAgIH0KICAgIGZvcig7IGIgJiYgYi56ID49IGc7KXsKICAgICAgICBpZiAoYi54ID49IHAgJiYgYi54IDw9IG0gJiYgYi55ID49IGYgJiYgYi55IDw9IHkxICYmIGIgIT09IHMgJiYgYiAhPT0gciAmJiB1aShvLCBjLCBhLCB1LCBsLCBkLCBiLngsIGIueSkgJiYgJChiLnByZXYsIGIsIGIubmV4dCkgPj0gMCkgcmV0dXJuICExOwogICAgICAgIGIgPSBiLnByZXZaOwogICAgfQogICAgZm9yKDsgTSAmJiBNLnogPD0geDE7KXsKICAgICAgICBpZiAoTS54ID49IHAgJiYgTS54IDw9IG0gJiYgTS55ID49IGYgJiYgTS55IDw9IHkxICYmIE0gIT09IHMgJiYgTSAhPT0gciAmJiB1aShvLCBjLCBhLCB1LCBsLCBkLCBNLngsIE0ueSkgJiYgJChNLnByZXYsIE0sIE0ubmV4dCkgPj0gMCkgcmV0dXJuICExOwogICAgICAgIE0gPSBNLm5leHRaOwogICAgfQogICAgcmV0dXJuICEwOwp9CmZ1bmN0aW9uIGp1KGgsIHQsIGUpIHsKICAgIGxldCBpID0gaDsKICAgIGRvIHsKICAgICAgICBsZXQgcyA9IGkucHJldiwgbiA9IGkubmV4dC5uZXh0OwogICAgICAgICFTbihzLCBuKSAmJiBSbChzLCBpLCBpLm5leHQsIG4pICYmIGppKHMsIG4pICYmIGppKG4sIHMpICYmICh0LnB1c2gocy5pIC8gZSB8IDApLCB0LnB1c2goaS5pIC8gZSB8IDApLCB0LnB1c2gobi5pIC8gZSB8IDApLCBLaShpKSwgS2koaS5uZXh0KSwgaSA9IGggPSBuKSwgaSA9IGkubmV4dDsKICAgIH13aGlsZSAoaSAhPT0gaCkKICAgIHJldHVybiBIZShpKTsKfQpmdW5jdGlvbiBLdShoLCB0LCBlLCBpLCBzLCBuKSB7CiAgICBsZXQgciA9IGg7CiAgICBkbyB7CiAgICAgICAgbGV0IG8gPSByLm5leHQubmV4dDsKICAgICAgICBmb3IoOyBvICE9PSByLnByZXY7KXsKICAgICAgICAgICAgaWYgKHIuaSAhPT0gby5pICYmIGhkKHIsIG8pKSB7CiAgICAgICAgICAgICAgICBsZXQgYSA9IGtsKHIsIG8pOwogICAgICAgICAgICAgICAgciA9IEhlKHIsIHIubmV4dCksIGEgPSBIZShhLCBhLm5leHQpLCBRaShyLCB0LCBlLCBpLCBzLCBuLCAwKSwgUWkoYSwgdCwgZSwgaSwgcywgbiwgMCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbyA9IG8ubmV4dDsKICAgICAgICB9CiAgICAgICAgciA9IHIubmV4dDsKICAgIH13aGlsZSAociAhPT0gaCkKfQpmdW5jdGlvbiB0ZChoLCB0LCBlLCBpKSB7CiAgICBsZXQgcyA9IFtdLCBuLCByLCBvLCBhLCBsOwogICAgZm9yKG4gPSAwLCByID0gdC5sZW5ndGg7IG4gPCByOyBuKyspbyA9IHRbbl0gKiBpLCBhID0gbiA8IHIgLSAxID8gdFtuICsgMV0gKiBpIDogaC5sZW5ndGgsIGwgPSBFbChoLCBvLCBhLCBpLCAhMSksIGwgPT09IGwubmV4dCAmJiAobC5zdGVpbmVyID0gITApLCBzLnB1c2goYWQobCkpOwogICAgZm9yKHMuc29ydChlZCksIG4gPSAwOyBuIDwgcy5sZW5ndGg7IG4rKyllID0gaWQoc1tuXSwgZSk7CiAgICByZXR1cm4gZTsKfQpmdW5jdGlvbiBlZChoLCB0KSB7CiAgICByZXR1cm4gaC54IC0gdC54Owp9CmZ1bmN0aW9uIGlkKGgsIHQpIHsKICAgIGxldCBlID0gc2QoaCwgdCk7CiAgICBpZiAoIWUpIHJldHVybiB0OwogICAgbGV0IGkgPSBrbChlLCBoKTsKICAgIHJldHVybiBIZShpLCBpLm5leHQpLCBIZShlLCBlLm5leHQpOwp9CmZ1bmN0aW9uIHNkKGgsIHQpIHsKICAgIGxldCBlID0gdCwgaSA9IC0xIC8gMCwgcywgbiA9IGgueCwgciA9IGgueTsKICAgIGRvIHsKICAgICAgICBpZiAociA8PSBlLnkgJiYgciA+PSBlLm5leHQueSAmJiBlLm5leHQueSAhPT0gZS55KSB7CiAgICAgICAgICAgIGxldCBkID0gZS54ICsgKHIgLSBlLnkpICogKGUubmV4dC54IC0gZS54KSAvIChlLm5leHQueSAtIGUueSk7CiAgICAgICAgICAgIGlmIChkIDw9IG4gJiYgZCA+IGkgJiYgKGkgPSBkLCBzID0gZS54IDwgZS5uZXh0LnggPyBlIDogZS5uZXh0LCBkID09PSBuKSkgcmV0dXJuIHM7CiAgICAgICAgfQogICAgICAgIGUgPSBlLm5leHQ7CiAgICB9d2hpbGUgKGUgIT09IHQpCiAgICBpZiAoIXMpIHJldHVybiBudWxsOwogICAgbGV0IG8gPSBzLCBhID0gcy54LCBsID0gcy55LCBjID0gMSAvIDAsIHU7CiAgICBlID0gczsKICAgIGRvIG4gPj0gZS54ICYmIGUueCA+PSBhICYmIG4gIT09IGUueCAmJiB1aShyIDwgbCA/IG4gOiBpLCByLCBhLCBsLCByIDwgbCA/IGkgOiBuLCByLCBlLngsIGUueSkgJiYgKHUgPSBNYXRoLmFicyhyIC0gZS55KSAvIChuIC0gZS54KSwgamkoZSwgaCkgJiYgKHUgPCBjIHx8IHUgPT09IGMgJiYgKGUueCA+IHMueCB8fCBlLnggPT09IHMueCAmJiBuZChzLCBlKSkpICYmIChzID0gZSwgYyA9IHUpKSwgZSA9IGUubmV4dDsKICAgIHdoaWxlIChlICE9PSBvKQogICAgcmV0dXJuIHM7Cn0KZnVuY3Rpb24gbmQoaCwgdCkgewogICAgcmV0dXJuICQoaC5wcmV2LCBoLCB0LnByZXYpIDwgMCAmJiAkKHQubmV4dCwgaCwgaC5uZXh0KSA8IDA7Cn0KZnVuY3Rpb24gcmQoaCwgdCwgZSwgaSkgewogICAgbGV0IHMgPSBoOwogICAgZG8gcy56ID09PSAwICYmIChzLnogPSBxcihzLngsIHMueSwgdCwgZSwgaSkpLCBzLnByZXZaID0gcy5wcmV2LCBzLm5leHRaID0gcy5uZXh0LCBzID0gcy5uZXh0OwogICAgd2hpbGUgKHMgIT09IGgpCiAgICBzLnByZXZaLm5leHRaID0gbnVsbCwgcy5wcmV2WiA9IG51bGwsIG9kKHMpOwp9CmZ1bmN0aW9uIG9kKGgpIHsKICAgIGxldCB0LCBlLCBpLCBzLCBuLCByLCBvLCBhLCBsID0gMTsKICAgIGRvIHsKICAgICAgICBmb3IoZSA9IGgsIGggPSBudWxsLCBuID0gbnVsbCwgciA9IDA7IGU7KXsKICAgICAgICAgICAgZm9yKHIrKywgaSA9IGUsIG8gPSAwLCB0ID0gMDsgdCA8IGwgJiYgKG8rKywgaSA9IGkubmV4dFosICEhaSk7IHQrKyk7CiAgICAgICAgICAgIGZvcihhID0gbDsgbyA+IDAgfHwgYSA+IDAgJiYgaTspbyAhPT0gMCAmJiAoYSA9PT0gMCB8fCAhaSB8fCBlLnogPD0gaS56KSA/IChzID0gZSwgZSA9IGUubmV4dFosIG8tLSkgOiAocyA9IGksIGkgPSBpLm5leHRaLCBhLS0pLCBuID8gbi5uZXh0WiA9IHMgOiBoID0gcywgcy5wcmV2WiA9IG4sIG4gPSBzOwogICAgICAgICAgICBlID0gaTsKICAgICAgICB9CiAgICAgICAgbi5uZXh0WiA9IG51bGwsIGwgKj0gMjsKICAgIH13aGlsZSAociA+IDEpCiAgICByZXR1cm4gaDsKfQpmdW5jdGlvbiBxcihoLCB0LCBlLCBpLCBzKSB7CiAgICByZXR1cm4gaCA9IChoIC0gZSkgKiBzIHwgMCwgdCA9ICh0IC0gaSkgKiBzIHwgMCwgaCA9IChoIHwgaCA8PCA4KSAmIDE2NzExOTM1LCBoID0gKGggfCBoIDw8IDQpICYgMjUyNjQ1MTM1LCBoID0gKGggfCBoIDw8IDIpICYgODU4OTkzNDU5LCBoID0gKGggfCBoIDw8IDEpICYgMTQzMTY1NTc2NSwgdCA9ICh0IHwgdCA8PCA4KSAmIDE2NzExOTM1LCB0ID0gKHQgfCB0IDw8IDQpICYgMjUyNjQ1MTM1LCB0ID0gKHQgfCB0IDw8IDIpICYgODU4OTkzNDU5LCB0ID0gKHQgfCB0IDw8IDEpICYgMTQzMTY1NTc2NSwgaCB8IHQgPDwgMTsKfQpmdW5jdGlvbiBhZChoKSB7CiAgICBsZXQgdCA9IGgsIGUgPSBoOwogICAgZG8gKHQueCA8IGUueCB8fCB0LnggPT09IGUueCAmJiB0LnkgPCBlLnkpICYmIChlID0gdCksIHQgPSB0Lm5leHQ7CiAgICB3aGlsZSAodCAhPT0gaCkKICAgIHJldHVybiBlOwp9CmZ1bmN0aW9uIHVpKGgsIHQsIGUsIGksIHMsIG4sIHIsIG8pIHsKICAgIHJldHVybiAocyAtIHIpICogKHQgLSBvKSA+PSAoaCAtIHIpICogKG4gLSBvKSAmJiAoaCAtIHIpICogKGkgLSBvKSA+PSAoZSAtIHIpICogKHQgLSBvKSAmJiAoZSAtIHIpICogKG4gLSBvKSA+PSAocyAtIHIpICogKGkgLSBvKTsKfQpmdW5jdGlvbiBoZChoLCB0KSB7CiAgICByZXR1cm4gaC5uZXh0LmkgIT09IHQuaSAmJiBoLnByZXYuaSAhPT0gdC5pICYmICFsZChoLCB0KSAmJiAoamkoaCwgdCkgJiYgamkodCwgaCkgJiYgY2QoaCwgdCkgJiYgKCQoaC5wcmV2LCBoLCB0LnByZXYpIHx8ICQoaCwgdC5wcmV2LCB0KSkgfHwgU24oaCwgdCkgJiYgJChoLnByZXYsIGgsIGgubmV4dCkgPiAwICYmICQodC5wcmV2LCB0LCB0Lm5leHQpID4gMCk7Cn0KZnVuY3Rpb24gJChoLCB0LCBlKSB7CiAgICByZXR1cm4gKHQueSAtIGgueSkgKiAoZS54IC0gdC54KSAtICh0LnggLSBoLngpICogKGUueSAtIHQueSk7Cn0KZnVuY3Rpb24gU24oaCwgdCkgewogICAgcmV0dXJuIGgueCA9PT0gdC54ICYmIGgueSA9PT0gdC55Owp9CmZ1bmN0aW9uIFJsKGgsIHQsIGUsIGkpIHsKICAgIGxldCBzID0gTnMoJChoLCB0LCBlKSksIG4gPSBOcygkKGgsIHQsIGkpKSwgciA9IE5zKCQoZSwgaSwgaCkpLCBvID0gTnMoJChlLCBpLCB0KSk7CiAgICByZXR1cm4gISEocyAhPT0gbiAmJiByICE9PSBvIHx8IHMgPT09IDAgJiYgT3MoaCwgZSwgdCkgfHwgbiA9PT0gMCAmJiBPcyhoLCBpLCB0KSB8fCByID09PSAwICYmIE9zKGUsIGgsIGkpIHx8IG8gPT09IDAgJiYgT3MoZSwgdCwgaSkpOwp9CmZ1bmN0aW9uIE9zKGgsIHQsIGUpIHsKICAgIHJldHVybiB0LnggPD0gTWF0aC5tYXgoaC54LCBlLngpICYmIHQueCA+PSBNYXRoLm1pbihoLngsIGUueCkgJiYgdC55IDw9IE1hdGgubWF4KGgueSwgZS55KSAmJiB0LnkgPj0gTWF0aC5taW4oaC55LCBlLnkpOwp9CmZ1bmN0aW9uIE5zKGgpIHsKICAgIHJldHVybiBoID4gMCA/IDEgOiBoIDwgMCA/IC0xIDogMDsKfQpmdW5jdGlvbiBsZChoLCB0KSB7CiAgICBsZXQgZSA9IGg7CiAgICBkbyB7CiAgICAgICAgaWYgKGUuaSAhPT0gaC5pICYmIGUubmV4dC5pICE9PSBoLmkgJiYgZS5pICE9PSB0LmkgJiYgZS5uZXh0LmkgIT09IHQuaSAmJiBSbChlLCBlLm5leHQsIGgsIHQpKSByZXR1cm4gITA7CiAgICAgICAgZSA9IGUubmV4dDsKICAgIH13aGlsZSAoZSAhPT0gaCkKICAgIHJldHVybiAhMTsKfQpmdW5jdGlvbiBqaShoLCB0KSB7CiAgICByZXR1cm4gJChoLnByZXYsIGgsIGgubmV4dCkgPCAwID8gJChoLCB0LCBoLm5leHQpID49IDAgJiYgJChoLCBoLnByZXYsIHQpID49IDAgOiAkKGgsIHQsIGgucHJldikgPCAwIHx8ICQoaCwgaC5uZXh0LCB0KSA8IDA7Cn0KZnVuY3Rpb24gY2QoaCwgdCkgewogICAgbGV0IGUgPSBoLCBpID0gITEsIHMgPSAoaC54ICsgdC54KSAvIDIsIG4gPSAoaC55ICsgdC55KSAvIDI7CiAgICBkbyBlLnkgPiBuICE9IGUubmV4dC55ID4gbiAmJiBlLm5leHQueSAhPT0gZS55ICYmIHMgPCAoZS5uZXh0LnggLSBlLngpICogKG4gLSBlLnkpIC8gKGUubmV4dC55IC0gZS55KSArIGUueCAmJiAoaSA9ICFpKSwgZSA9IGUubmV4dDsKICAgIHdoaWxlIChlICE9PSBoKQogICAgcmV0dXJuIGk7Cn0KZnVuY3Rpb24ga2woaCwgdCkgewogICAgbGV0IGUgPSBuZXcgR3IoaC5pLCBoLngsIGgueSksIGkgPSBuZXcgR3IodC5pLCB0LngsIHQueSksIHMgPSBoLm5leHQsIG4gPSB0LnByZXY7CiAgICByZXR1cm4gaC5uZXh0ID0gdCwgdC5wcmV2ID0gaCwgZS5uZXh0ID0gcywgcy5wcmV2ID0gZSwgaS5uZXh0ID0gZSwgZS5wcmV2ID0gaSwgbi5uZXh0ID0gaSwgaS5wcmV2ID0gbiwgaTsKfQpmdW5jdGlvbiBjaChoLCB0LCBlLCBpKSB7CiAgICBsZXQgcyA9IG5ldyBHcihoLCB0LCBlKTsKICAgIHJldHVybiBpID8gKHMubmV4dCA9IGkubmV4dCwgcy5wcmV2ID0gaSwgaS5uZXh0LnByZXYgPSBzLCBpLm5leHQgPSBzKSA6IChzLnByZXYgPSBzLCBzLm5leHQgPSBzKSwgczsKfQpmdW5jdGlvbiBLaShoKSB7CiAgICBoLm5leHQucHJldiA9IGgucHJldiwgaC5wcmV2Lm5leHQgPSBoLm5leHQsIGgucHJldlogJiYgKGgucHJldloubmV4dFogPSBoLm5leHRaKSwgaC5uZXh0WiAmJiAoaC5uZXh0Wi5wcmV2WiA9IGgucHJldlopOwp9CmZ1bmN0aW9uIEdyKGgsIHQsIGUpIHsKICAgIHRoaXMuaSA9IGgsIHRoaXMueCA9IHQsIHRoaXMueSA9IGUsIHRoaXMucHJldiA9IG51bGwsIHRoaXMubmV4dCA9IG51bGwsIHRoaXMueiA9IDAsIHRoaXMucHJldlogPSBudWxsLCB0aGlzLm5leHRaID0gbnVsbCwgdGhpcy5zdGVpbmVyID0gITE7Cn0KZnVuY3Rpb24gdWQoaCwgdCwgZSwgaSkgewogICAgbGV0IHMgPSAwOwogICAgZm9yKGxldCBuID0gdCwgciA9IGUgLSBpOyBuIDwgZTsgbiArPSBpKXMgKz0gKGhbcl0gLSBoW25dKSAqIChoW24gKyAxXSArIGhbciArIDFdKSwgciA9IG47CiAgICByZXR1cm4gczsKfQp2YXIgaGUgPSBjbGFzcyBoIHsKICAgIHN0YXRpYyBhcmVhKHQpIHsKICAgICAgICBsZXQgZSA9IHQubGVuZ3RoLCBpID0gMDsKICAgICAgICBmb3IobGV0IHMgPSBlIC0gMSwgbiA9IDA7IG4gPCBlOyBzID0gbisrKWkgKz0gdFtzXS54ICogdFtuXS55IC0gdFtuXS54ICogdFtzXS55OwogICAgICAgIHJldHVybiBpICogLjU7CiAgICB9CiAgICBzdGF0aWMgaXNDbG9ja1dpc2UodCkgewogICAgICAgIHJldHVybiBoLmFyZWEodCkgPCAwOwogICAgfQogICAgc3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUodCwgZSkgewogICAgICAgIGxldCBpID0gW10sIHMgPSBbXSwgbiA9IFtdOwogICAgICAgIHVoKHQpLCBkaChpLCB0KTsKICAgICAgICBsZXQgciA9IHQubGVuZ3RoOwogICAgICAgIGUuZm9yRWFjaCh1aCk7CiAgICAgICAgZm9yKGxldCBhID0gMDsgYSA8IGUubGVuZ3RoOyBhKyspcy5wdXNoKHIpLCByICs9IGVbYV0ubGVuZ3RoLCBkaChpLCBlW2FdKTsKICAgICAgICBsZXQgbyA9IFl1LnRyaWFuZ3VsYXRlKGksIHMpOwogICAgICAgIGZvcihsZXQgYSA9IDA7IGEgPCBvLmxlbmd0aDsgYSArPSAzKW4ucHVzaChvLnNsaWNlKGEsIGEgKyAzKSk7CiAgICAgICAgcmV0dXJuIG47CiAgICB9Cn07CmZ1bmN0aW9uIHVoKGgpIHsKICAgIGxldCB0ID0gaC5sZW5ndGg7CiAgICB0ID4gMiAmJiBoW3QgLSAxXS5lcXVhbHMoaFswXSkgJiYgaC5wb3AoKTsKfQpmdW5jdGlvbiBkaChoLCB0KSB7CiAgICBmb3IobGV0IGUgPSAwOyBlIDwgdC5sZW5ndGg7IGUrKyloLnB1c2godFtlXS54KSwgaC5wdXNoKHRbZV0ueSk7Cn0KdmFyIFhyID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IG5ldyBNZShbCiAgICAgICAgbmV3IFQoLjUsIC41KSwKICAgICAgICBuZXcgVCgtLjUsIC41KSwKICAgICAgICBuZXcgVCgtLjUsIC0uNSksCiAgICAgICAgbmV3IFQoLjUsIC0uNSkKICAgIF0pLCBlID0ge30pewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJFeHRydWRlR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHNoYXBlczogdCwKICAgICAgICAgICAgb3B0aW9uczogZQogICAgICAgIH0sIHQgPSBBcnJheS5pc0FycmF5KHQpID8gdCA6IFsKICAgICAgICAgICAgdAogICAgICAgIF07CiAgICAgICAgbGV0IGkgPSB0aGlzLCBzID0gW10sIG4gPSBbXTsKICAgICAgICBmb3IobGV0IG8gPSAwLCBhID0gdC5sZW5ndGg7IG8gPCBhOyBvKyspewogICAgICAgICAgICBsZXQgbCA9IHRbb107CiAgICAgICAgICAgIHIobCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKHMsIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEUobiwgMikpLCB0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7CiAgICAgICAgZnVuY3Rpb24gcihvKSB7CiAgICAgICAgICAgIGxldCBhID0gW10sIGwgPSBlLmN1cnZlU2VnbWVudHMgIT09IHZvaWQgMCA/IGUuY3VydmVTZWdtZW50cyA6IDEyLCBjID0gZS5zdGVwcyAhPT0gdm9pZCAwID8gZS5zdGVwcyA6IDEsIHUgPSBlLmRlcHRoICE9PSB2b2lkIDAgPyBlLmRlcHRoIDogMSwgZCA9IGUuYmV2ZWxFbmFibGVkICE9PSB2b2lkIDAgPyBlLmJldmVsRW5hYmxlZCA6ICEwLCBwID0gZS5iZXZlbFRoaWNrbmVzcyAhPT0gdm9pZCAwID8gZS5iZXZlbFRoaWNrbmVzcyA6IC4yLCBmID0gZS5iZXZlbFNpemUgIT09IHZvaWQgMCA/IGUuYmV2ZWxTaXplIDogcCAtIC4xLCBtID0gZS5iZXZlbE9mZnNldCAhPT0gdm9pZCAwID8gZS5iZXZlbE9mZnNldCA6IDAsIHkxID0gZS5iZXZlbFNlZ21lbnRzICE9PSB2b2lkIDAgPyBlLmJldmVsU2VnbWVudHMgOiAzLCBnID0gZS5leHRydWRlUGF0aCwgeDEgPSBlLlVWR2VuZXJhdG9yICE9PSB2b2lkIDAgPyBlLlVWR2VuZXJhdG9yIDogZGQsIGIsIE0gPSAhMSwgXywgdiwgUywgQTsKICAgICAgICAgICAgZyAmJiAoYiA9IGcuZ2V0U3BhY2VkUG9pbnRzKGMpLCBNID0gITAsIGQgPSAhMSwgXyA9IGcuY29tcHV0ZUZyZW5ldEZyYW1lcyhjLCAhMSksIHYgPSBuZXcgdywgUyA9IG5ldyB3LCBBID0gbmV3IHcpLCBkIHx8ICh5MSA9IDAsIHAgPSAwLCBmID0gMCwgbSA9IDApOwogICAgICAgICAgICBsZXQgSSA9IG8uZXh0cmFjdFBvaW50cyhsKSwgQyA9IEkuc2hhcGUsIGsgPSBJLmhvbGVzOwogICAgICAgICAgICBpZiAoIWhlLmlzQ2xvY2tXaXNlKEMpKSB7CiAgICAgICAgICAgICAgICBDID0gQy5yZXZlcnNlKCk7CiAgICAgICAgICAgICAgICBmb3IobGV0IHogPSAwLCBGID0gay5sZW5ndGg7IHogPCBGOyB6KyspewogICAgICAgICAgICAgICAgICAgIGxldCBCID0ga1t6XTsKICAgICAgICAgICAgICAgICAgICBoZS5pc0Nsb2NrV2lzZShCKSAmJiAoa1t6XSA9IEIucmV2ZXJzZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgVyA9IGhlLnRyaWFuZ3VsYXRlU2hhcGUoQywgayksIEggPSBDOwogICAgICAgICAgICBmb3IobGV0IHogPSAwLCBGID0gay5sZW5ndGg7IHogPCBGOyB6KyspewogICAgICAgICAgICAgICAgbGV0IEIgPSBrW3pdOwogICAgICAgICAgICAgICAgQyA9IEMuY29uY2F0KEIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFkoeiwgRiwgQikgewogICAgICAgICAgICAgICAgcmV0dXJuIEYgfHwgY29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSwgei5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihGLCBCKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgUSA9IEMubGVuZ3RoLCB6dCA9IFcubGVuZ3RoOwogICAgICAgICAgICBmdW5jdGlvbiBQdCh6LCBGLCBCKSB7CiAgICAgICAgICAgICAgICBsZXQgTywgUiwgcSwgWCA9IHoueCAtIEYueCwgdHQgPSB6LnkgLSBGLnksIHl0ID0gQi54IC0gei54LCBhdCA9IEIueSAtIHoueSwgdmkgPSBYICogWCArIHR0ICogdHQsIEluID0gWCAqIGF0IC0gdHQgKiB5dDsKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhJbikgPiBOdW1iZXIuRVBTSUxPTikgewogICAgICAgICAgICAgICAgICAgIGxldCBRdCA9IE1hdGguc3FydCh2aSksICRvID0gTWF0aC5zcXJ0KHl0ICogeXQgKyBhdCAqIGF0KSwgUW8gPSBGLnggLSB0dCAvIFF0LCBqbyA9IEYueSArIFggLyBRdCwgRGwgPSBCLnggLSBhdCAvICRvLCBMbCA9IEIueSArIHl0IC8gJG8sIEtvID0gKChEbCAtIFFvKSAqIGF0IC0gKExsIC0gam8pICogeXQpIC8gKFggKiBhdCAtIHR0ICogeXQpOwogICAgICAgICAgICAgICAgICAgIE8gPSBRbyArIFggKiBLbyAtIHoueCwgUiA9IGpvICsgdHQgKiBLbyAtIHoueTsKICAgICAgICAgICAgICAgICAgICBsZXQgdGEgPSBPICogTyArIFIgKiBSOwogICAgICAgICAgICAgICAgICAgIGlmICh0YSA8PSAyKSByZXR1cm4gbmV3IFQoTywgUik7CiAgICAgICAgICAgICAgICAgICAgcSA9IE1hdGguc3FydCh0YSAvIDIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZXQgUXQgPSAhMTsKICAgICAgICAgICAgICAgICAgICBYID4gTnVtYmVyLkVQU0lMT04gPyB5dCA+IE51bWJlci5FUFNJTE9OICYmIChRdCA9ICEwKSA6IFggPCAtTnVtYmVyLkVQU0lMT04gPyB5dCA8IC1OdW1iZXIuRVBTSUxPTiAmJiAoUXQgPSAhMCkgOiBNYXRoLnNpZ24odHQpID09PSBNYXRoLnNpZ24oYXQpICYmIChRdCA9ICEwKSwgUXQgPyAoTyA9IC10dCwgUiA9IFgsIHEgPSBNYXRoLnNxcnQodmkpKSA6IChPID0gWCwgUiA9IHR0LCBxID0gTWF0aC5zcXJ0KHZpIC8gMikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKE8gLyBxLCBSIC8gcSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGogPSBbXTsKICAgICAgICAgICAgZm9yKGxldCB6ID0gMCwgRiA9IEgubGVuZ3RoLCBCID0gRiAtIDEsIE8gPSB6ICsgMTsgeiA8IEY7IHorKywgQisrLCBPKyspQiA9PT0gRiAmJiAoQiA9IDApLCBPID09PSBGICYmIChPID0gMCksIGpbel0gPSBQdChIW3pdLCBIW0JdLCBIW09dKTsKICAgICAgICAgICAgbGV0IHN0ID0gW10sIEssIE90ID0gai5jb25jYXQoKTsKICAgICAgICAgICAgZm9yKGxldCB6ID0gMCwgRiA9IGsubGVuZ3RoOyB6IDwgRjsgeisrKXsKICAgICAgICAgICAgICAgIGxldCBCID0ga1t6XTsKICAgICAgICAgICAgICAgIEsgPSBbXTsKICAgICAgICAgICAgICAgIGZvcihsZXQgTyA9IDAsIFIgPSBCLmxlbmd0aCwgcSA9IFIgLSAxLCBYID0gTyArIDE7IE8gPCBSOyBPKyssIHErKywgWCsrKXEgPT09IFIgJiYgKHEgPSAwKSwgWCA9PT0gUiAmJiAoWCA9IDApLCBLW09dID0gUHQoQltPXSwgQltxXSwgQltYXSk7CiAgICAgICAgICAgICAgICBzdC5wdXNoKEspLCBPdCA9IE90LmNvbmNhdChLKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGV0IHogPSAwOyB6IDwgeTE7IHorKyl7CiAgICAgICAgICAgICAgICBsZXQgRiA9IHogLyB5MSwgQiA9IHAgKiBNYXRoLmNvcyhGICogTWF0aC5QSSAvIDIpLCBPID0gZiAqIE1hdGguc2luKEYgKiBNYXRoLlBJIC8gMikgKyBtOwogICAgICAgICAgICAgICAgZm9yKGxldCBSID0gMCwgcSA9IEgubGVuZ3RoOyBSIDwgcTsgUisrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgWCA9IFkoSFtSXSwgaltSXSwgTyk7CiAgICAgICAgICAgICAgICAgICAgWnQoWC54LCBYLnksIC1CKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvcihsZXQgUiA9IDAsIHEgPSBrLmxlbmd0aDsgUiA8IHE7IFIrKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IFggPSBrW1JdOwogICAgICAgICAgICAgICAgICAgIEsgPSBzdFtSXTsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHR0ID0gMCwgeXQgPSBYLmxlbmd0aDsgdHQgPCB5dDsgdHQrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdCA9IFkoWFt0dF0sIEtbdHRdLCBPKTsKICAgICAgICAgICAgICAgICAgICAgICAgWnQoYXQueCwgYXQueSwgLUIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgU2UgPSBmICsgbTsKICAgICAgICAgICAgZm9yKGxldCB6ID0gMDsgeiA8IFE7IHorKyl7CiAgICAgICAgICAgICAgICBsZXQgRiA9IGQgPyBZKENbel0sIE90W3pdLCBTZSkgOiBDW3pdOwogICAgICAgICAgICAgICAgTSA/IChTLmNvcHkoXy5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihGLngpLCB2LmNvcHkoXy5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEYueSksIEEuY29weShiWzBdKS5hZGQoUykuYWRkKHYpLCBadChBLngsIEEueSwgQS56KSkgOiBadChGLngsIEYueSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCB6ID0gMTsgeiA8PSBjOyB6KyspZm9yKGxldCBGID0gMDsgRiA8IFE7IEYrKyl7CiAgICAgICAgICAgICAgICBsZXQgQiA9IGQgPyBZKENbRl0sIE90W0ZdLCBTZSkgOiBDW0ZdOwogICAgICAgICAgICAgICAgTSA/IChTLmNvcHkoXy5ub3JtYWxzW3pdKS5tdWx0aXBseVNjYWxhcihCLngpLCB2LmNvcHkoXy5iaW5vcm1hbHNbel0pLm11bHRpcGx5U2NhbGFyKEIueSksIEEuY29weShiW3pdKS5hZGQoUykuYWRkKHYpLCBadChBLngsIEEueSwgQS56KSkgOiBadChCLngsIEIueSwgdSAvIGMgKiB6KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGV0IHogPSB5MSAtIDE7IHogPj0gMDsgei0tKXsKICAgICAgICAgICAgICAgIGxldCBGID0geiAvIHkxLCBCID0gcCAqIE1hdGguY29zKEYgKiBNYXRoLlBJIC8gMiksIE8gPSBmICogTWF0aC5zaW4oRiAqIE1hdGguUEkgLyAyKSArIG07CiAgICAgICAgICAgICAgICBmb3IobGV0IFIgPSAwLCBxID0gSC5sZW5ndGg7IFIgPCBxOyBSKyspewogICAgICAgICAgICAgICAgICAgIGxldCBYID0gWShIW1JdLCBqW1JdLCBPKTsKICAgICAgICAgICAgICAgICAgICBadChYLngsIFgueSwgdSArIEIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGxldCBSID0gMCwgcSA9IGsubGVuZ3RoOyBSIDwgcTsgUisrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgWCA9IGtbUl07CiAgICAgICAgICAgICAgICAgICAgSyA9IHN0W1JdOwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdHQgPSAwLCB5dCA9IFgubGVuZ3RoOyB0dCA8IHl0OyB0dCsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0ID0gWShYW3R0XSwgS1t0dF0sIE8pOwogICAgICAgICAgICAgICAgICAgICAgICBNID8gWnQoYXQueCwgYXQueSArIGJbYyAtIDFdLnksIGJbYyAtIDFdLnggKyBCKSA6IFp0KGF0LngsIGF0LnksIHUgKyBCKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVG4oKSwgZXMoKTsKICAgICAgICAgICAgZnVuY3Rpb24gVG4oKSB7CiAgICAgICAgICAgICAgICBsZXQgeiA9IHMubGVuZ3RoIC8gMzsKICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IEYgPSAwLCBCID0gUSAqIEY7CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBPID0gMDsgTyA8IHp0OyBPKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgUiA9IFdbT107CiAgICAgICAgICAgICAgICAgICAgICAgIGlzKFJbMl0gKyBCLCBSWzFdICsgQiwgUlswXSArIEIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGID0gYyArIHkxICogMiwgQiA9IFEgKiBGOwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgTyA9IDA7IE8gPCB6dDsgTysrKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFIgPSBXW09dOwogICAgICAgICAgICAgICAgICAgICAgICBpcyhSWzBdICsgQiwgUlsxXSArIEIsIFJbMl0gKyBCKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgRiA9IDA7IEYgPCB6dDsgRisrKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IEIgPSBXW0ZdOwogICAgICAgICAgICAgICAgICAgICAgICBpcyhCWzJdLCBCWzFdLCBCWzBdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBGID0gMDsgRiA8IHp0OyBGKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgQiA9IFdbRl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlzKEJbMF0gKyBRICogYywgQlsxXSArIFEgKiBjLCBCWzJdICsgUSAqIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkuYWRkR3JvdXAoeiwgcy5sZW5ndGggLyAzIC0geiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXMoKSB7CiAgICAgICAgICAgICAgICBsZXQgeiA9IHMubGVuZ3RoIC8gMywgRiA9IDA7CiAgICAgICAgICAgICAgICBZbyhILCBGKSwgRiArPSBILmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvcihsZXQgQiA9IDAsIE8gPSBrLmxlbmd0aDsgQiA8IE87IEIrKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IFIgPSBrW0JdOwogICAgICAgICAgICAgICAgICAgIFlvKFIsIEYpLCBGICs9IFIubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaS5hZGRHcm91cCh6LCBzLmxlbmd0aCAvIDMgLSB6LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBZbyh6LCBGKSB7CiAgICAgICAgICAgICAgICBsZXQgQiA9IHoubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yKDsgLS1CID49IDA7KXsKICAgICAgICAgICAgICAgICAgICBsZXQgTyA9IEIsIFIgPSBCIC0gMTsKICAgICAgICAgICAgICAgICAgICBSIDwgMCAmJiAoUiA9IHoubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBxID0gMCwgWCA9IGMgKyB5MSAqIDI7IHEgPCBYOyBxKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHQgPSBRICogcSwgeXQgPSBRICogKHEgKyAxKSwgYXQgPSBGICsgTyArIHR0LCB2aSA9IEYgKyBSICsgdHQsIEluID0gRiArIFIgKyB5dCwgUXQgPSBGICsgTyArIHl0OwogICAgICAgICAgICAgICAgICAgICAgICBWbChhdCwgdmksIEluLCBRdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFp0KHosIEYsIEIpIHsKICAgICAgICAgICAgICAgIGEucHVzaCh6KSwgYS5wdXNoKEYpLCBhLnB1c2goQik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXMoeiwgRiwgQikgewogICAgICAgICAgICAgICAgWXQoeiksIFl0KEYpLCBZdChCKTsKICAgICAgICAgICAgICAgIGxldCBPID0gcy5sZW5ndGggLyAzLCBSID0geDEuZ2VuZXJhdGVUb3BVVihpLCBzLCBPIC0gMywgTyAtIDIsIE8gLSAxKTsKICAgICAgICAgICAgICAgICR0KFJbMF0pLCAkdChSWzFdKSwgJHQoUlsyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVmwoeiwgRiwgQiwgTykgewogICAgICAgICAgICAgICAgWXQoeiksIFl0KEYpLCBZdChPKSwgWXQoRiksIFl0KEIpLCBZdChPKTsKICAgICAgICAgICAgICAgIGxldCBSID0gcy5sZW5ndGggLyAzLCBxID0geDEuZ2VuZXJhdGVTaWRlV2FsbFVWKGksIHMsIFIgLSA2LCBSIC0gMywgUiAtIDIsIFIgLSAxKTsKICAgICAgICAgICAgICAgICR0KHFbMF0pLCAkdChxWzFdKSwgJHQocVszXSksICR0KHFbMV0pLCAkdChxWzJdKSwgJHQocVszXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gWXQoeikgewogICAgICAgICAgICAgICAgcy5wdXNoKGFbeiAqIDMgKyAwXSksIHMucHVzaChhW3ogKiAzICsgMV0pLCBzLnB1c2goYVt6ICogMyArIDJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiAkdCh6KSB7CiAgICAgICAgICAgICAgICBuLnB1c2goei54KSwgbi5wdXNoKHoueSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpLCBlID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywgaSA9IHRoaXMucGFyYW1ldGVycy5vcHRpb25zOwogICAgICAgIHJldHVybiBwZChlLCBpLCB0KTsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0LCBlKSB7CiAgICAgICAgbGV0IGkgPSBbXTsKICAgICAgICBmb3IobGV0IG4gPSAwLCByID0gdC5zaGFwZXMubGVuZ3RoOyBuIDwgcjsgbisrKXsKICAgICAgICAgICAgbGV0IG8gPSBlW3Quc2hhcGVzW25dXTsKICAgICAgICAgICAgaS5wdXNoKG8pOwogICAgICAgIH0KICAgICAgICBsZXQgcyA9IHQub3B0aW9ucy5leHRydWRlUGF0aDsKICAgICAgICByZXR1cm4gcyAhPT0gdm9pZCAwICYmICh0Lm9wdGlvbnMuZXh0cnVkZVBhdGggPSBuZXcgZG5bcy50eXBlXSgpLmZyb21KU09OKHMpKSwgbmV3IGgoaSwgdC5vcHRpb25zKTsKICAgIH0KfSwgZGQgPSB7CiAgICBnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbihoLCB0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSB0W2UgKiAzXSwgciA9IHRbZSAqIDMgKyAxXSwgbyA9IHRbaSAqIDNdLCBhID0gdFtpICogMyArIDFdLCBsID0gdFtzICogM10sIGMgPSB0W3MgKiAzICsgMV07CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgbmV3IFQobiwgciksCiAgICAgICAgICAgIG5ldyBUKG8sIGEpLAogICAgICAgICAgICBuZXcgVChsLCBjKQogICAgICAgIF07CiAgICB9LAogICAgZ2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbihoLCB0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgbGV0IHIgPSB0W2UgKiAzXSwgbyA9IHRbZSAqIDMgKyAxXSwgYSA9IHRbZSAqIDMgKyAyXSwgbCA9IHRbaSAqIDNdLCBjID0gdFtpICogMyArIDFdLCB1ID0gdFtpICogMyArIDJdLCBkID0gdFtzICogM10sIHAgPSB0W3MgKiAzICsgMV0sIGYgPSB0W3MgKiAzICsgMl0sIG0gPSB0W24gKiAzXSwgeTEgPSB0W24gKiAzICsgMV0sIGcgPSB0W24gKiAzICsgMl07CiAgICAgICAgcmV0dXJuIE1hdGguYWJzKG8gLSBjKSA8IE1hdGguYWJzKHIgLSBsKSA/IFsKICAgICAgICAgICAgbmV3IFQociwgMSAtIGEpLAogICAgICAgICAgICBuZXcgVChsLCAxIC0gdSksCiAgICAgICAgICAgIG5ldyBUKGQsIDEgLSBmKSwKICAgICAgICAgICAgbmV3IFQobSwgMSAtIGcpCiAgICAgICAgXSA6IFsKICAgICAgICAgICAgbmV3IFQobywgMSAtIGEpLAogICAgICAgICAgICBuZXcgVChjLCAxIC0gdSksCiAgICAgICAgICAgIG5ldyBUKHAsIDEgLSBmKSwKICAgICAgICAgICAgbmV3IFQoeTEsIDEgLSBnKQogICAgICAgIF07CiAgICB9Cn07CmZ1bmN0aW9uIHBkKGgsIHQsIGUpIHsKICAgIGlmIChlLnNoYXBlcyA9IFtdLCBBcnJheS5pc0FycmF5KGgpKSBmb3IobGV0IGkgPSAwLCBzID0gaC5sZW5ndGg7IGkgPCBzOyBpKyspewogICAgICAgIGxldCBuID0gaFtpXTsKICAgICAgICBlLnNoYXBlcy5wdXNoKG4udXVpZCk7CiAgICB9CiAgICBlbHNlIGUuc2hhcGVzLnB1c2goaC51dWlkKTsKICAgIHJldHVybiBlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0KSwgdC5leHRydWRlUGF0aCAhPT0gdm9pZCAwICYmIChlLm9wdGlvbnMuZXh0cnVkZVBhdGggPSB0LmV4dHJ1ZGVQYXRoLnRvSlNPTigpKSwgZTsKfQp2YXIgSnIgPSBjbGFzcyBoIGV4dGVuZHMgV2UgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAwKXsKICAgICAgICBsZXQgaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDIsIHMgPSBbCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICBpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICBpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLWksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAtaSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC1pLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLWksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEKICAgICAgICBdLCBuID0gWwogICAgICAgICAgICAwLAogICAgICAgICAgICAxMSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgNywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNywKICAgICAgICAgICAgMTAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEwLAogICAgICAgICAgICAxMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgOSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMTEsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDExLAogICAgICAgICAgICAxMCwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMTAsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDgsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDksCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDgsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDgsCiAgICAgICAgICAgIDksCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDksCiAgICAgICAgICAgIDUsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDExLAogICAgICAgICAgICA2LAogICAgICAgICAgICAyLAogICAgICAgICAgICAxMCwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgNywKICAgICAgICAgICAgOSwKICAgICAgICAgICAgOCwKICAgICAgICAgICAgMQogICAgICAgIF07CiAgICAgICAgc3VwZXIocywgbiwgdCwgZSksIHRoaXMudHlwZSA9ICJJY29zYWhlZHJvbkdlb21ldHJ5IiwgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgICAgICByYWRpdXM6IHQsCiAgICAgICAgICAgIGRldGFpbDogZQogICAgICAgIH07CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LnJhZGl1cywgdC5kZXRhaWwpOwogICAgfQp9LCBmbiA9IGNsYXNzIGggZXh0ZW5kcyBXZSB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IDApewogICAgICAgIGxldCBpID0gWwogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC0xCiAgICAgICAgXSwgcyA9IFsKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMywKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMgogICAgICAgIF07CiAgICAgICAgc3VwZXIoaSwgcywgdCwgZSksIHRoaXMudHlwZSA9ICJPY3RhaGVkcm9uR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1czogdCwKICAgICAgICAgICAgZGV0YWlsOiBlCiAgICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQucmFkaXVzLCB0LmRldGFpbCk7CiAgICB9Cn0sIFpyID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAxLCBpID0gMSwgcyA9IDEpewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJQbGFuZUdlb21ldHJ5IiwgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgaGVpZ2h0OiBlLAogICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiBpLAogICAgICAgICAgICBoZWlnaHRTZWdtZW50czogcwogICAgICAgIH07CiAgICAgICAgbGV0IG4gPSB0IC8gMiwgciA9IGUgLyAyLCBvID0gTWF0aC5mbG9vcihpKSwgYSA9IE1hdGguZmxvb3IocyksIGwgPSBvICsgMSwgYyA9IGEgKyAxLCB1ID0gdCAvIG8sIGQgPSBlIC8gYSwgcCA9IFtdLCBmID0gW10sIG0gPSBbXSwgeTEgPSBbXTsKICAgICAgICBmb3IobGV0IGcgPSAwOyBnIDwgYzsgZysrKXsKICAgICAgICAgICAgbGV0IHgxID0gZyAqIGQgLSByOwogICAgICAgICAgICBmb3IobGV0IGIgPSAwOyBiIDwgbDsgYisrKXsKICAgICAgICAgICAgICAgIGxldCBNID0gYiAqIHUgLSBuOwogICAgICAgICAgICAgICAgZi5wdXNoKE0sIC14MSwgMCksIG0ucHVzaCgwLCAwLCAxKSwgeTEucHVzaChiIC8gbyksIHkxLnB1c2goMSAtIGcgLyBhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IobGV0IGcgPSAwOyBnIDwgYTsgZysrKWZvcihsZXQgeDEgPSAwOyB4MSA8IG87IHgxKyspewogICAgICAgICAgICBsZXQgYiA9IHgxICsgbCAqIGcsIE0gPSB4MSArIGwgKiAoZyArIDEpLCBfID0geDEgKyAxICsgbCAqIChnICsgMSksIHYgPSB4MSArIDEgKyBsICogZzsKICAgICAgICAgICAgcC5wdXNoKGIsIE0sIHYpLCBwLnB1c2goTSwgXywgdik7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0SW5kZXgocCksIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKGYsIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBFKG0sIDMpKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEUoeTEsIDIpKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0LnBhcmFtZXRlcnMpLCB0aGlzOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gbmV3IGgodC53aWR0aCwgdC5oZWlnaHQsIHQud2lkdGhTZWdtZW50cywgdC5oZWlnaHRTZWdtZW50cyk7CiAgICB9Cn0sIFlyID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IC41LCBlID0gMSwgaSA9IDMyLCBzID0gMSwgbiA9IDAsIHIgPSBNYXRoLlBJICogMil7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIlJpbmdHZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgaW5uZXJSYWRpdXM6IHQsCiAgICAgICAgICAgIG91dGVyUmFkaXVzOiBlLAogICAgICAgICAgICB0aGV0YVNlZ21lbnRzOiBpLAogICAgICAgICAgICBwaGlTZWdtZW50czogcywKICAgICAgICAgICAgdGhldGFTdGFydDogbiwKICAgICAgICAgICAgdGhldGFMZW5ndGg6IHIKICAgICAgICB9LCBpID0gTWF0aC5tYXgoMywgaSksIHMgPSBNYXRoLm1heCgxLCBzKTsKICAgICAgICBsZXQgbyA9IFtdLCBhID0gW10sIGwgPSBbXSwgYyA9IFtdLCB1ID0gdCwgZCA9IChlIC0gdCkgLyBzLCBwID0gbmV3IHcsIGYgPSBuZXcgVDsKICAgICAgICBmb3IobGV0IG0gPSAwOyBtIDw9IHM7IG0rKyl7CiAgICAgICAgICAgIGZvcihsZXQgeTEgPSAwOyB5MSA8PSBpOyB5MSsrKXsKICAgICAgICAgICAgICAgIGxldCBnID0gbiArIHkxIC8gaSAqIHI7CiAgICAgICAgICAgICAgICBwLnggPSB1ICogTWF0aC5jb3MoZyksIHAueSA9IHUgKiBNYXRoLnNpbihnKSwgYS5wdXNoKHAueCwgcC55LCBwLnopLCBsLnB1c2goMCwgMCwgMSksIGYueCA9IChwLnggLyBlICsgMSkgLyAyLCBmLnkgPSAocC55IC8gZSArIDEpIC8gMiwgYy5wdXNoKGYueCwgZi55KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1ICs9IGQ7CiAgICAgICAgfQogICAgICAgIGZvcihsZXQgbSA9IDA7IG0gPCBzOyBtKyspewogICAgICAgICAgICBsZXQgeTEgPSBtICogKGkgKyAxKTsKICAgICAgICAgICAgZm9yKGxldCBnID0gMDsgZyA8IGk7IGcrKyl7CiAgICAgICAgICAgICAgICBsZXQgeDEgPSBnICsgeTEsIGIgPSB4MSwgTSA9IHgxICsgaSArIDEsIF8gPSB4MSArIGkgKyAyLCB2ID0geDEgKyAxOwogICAgICAgICAgICAgICAgby5wdXNoKGIsIE0sIHYpLCBvLnB1c2goTSwgXywgdik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRJbmRleChvKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoYSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUobCwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShjLCAyKSk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQuaW5uZXJSYWRpdXMsIHQub3V0ZXJSYWRpdXMsIHQudGhldGFTZWdtZW50cywgdC5waGlTZWdtZW50cywgdC50aGV0YVN0YXJ0LCB0LnRoZXRhTGVuZ3RoKTsKICAgIH0KfSwgJHIgPSBjbGFzcyBoIGV4dGVuZHMgTCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IE1lKFsKICAgICAgICBuZXcgVCgwLCAuNSksCiAgICAgICAgbmV3IFQoLS41LCAtLjUpLAogICAgICAgIG5ldyBUKC41LCAtLjUpCiAgICBdKSwgZSA9IDEyKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiU2hhcGVHZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgc2hhcGVzOiB0LAogICAgICAgICAgICBjdXJ2ZVNlZ21lbnRzOiBlCiAgICAgICAgfTsKICAgICAgICBsZXQgaSA9IFtdLCBzID0gW10sIG4gPSBbXSwgciA9IFtdLCBvID0gMCwgYSA9IDA7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkgPT09ICExKSBsKHQpOwogICAgICAgIGVsc2UgZm9yKGxldCBjID0gMDsgYyA8IHQubGVuZ3RoOyBjKyspbCh0W2NdKSwgdGhpcy5hZGRHcm91cChvLCBhLCBjKSwgbyArPSBhLCBhID0gMDsKICAgICAgICB0aGlzLnNldEluZGV4KGkpLCB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShzLCAzKSksIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgRShuLCAzKSksIHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBFKHIsIDIpKTsKICAgICAgICBmdW5jdGlvbiBsKGMpIHsKICAgICAgICAgICAgbGV0IHUgPSBzLmxlbmd0aCAvIDMsIGQgPSBjLmV4dHJhY3RQb2ludHMoZSksIHAgPSBkLnNoYXBlLCBmID0gZC5ob2xlczsKICAgICAgICAgICAgaGUuaXNDbG9ja1dpc2UocCkgPT09ICExICYmIChwID0gcC5yZXZlcnNlKCkpOwogICAgICAgICAgICBmb3IobGV0IHkxID0gMCwgZyA9IGYubGVuZ3RoOyB5MSA8IGc7IHkxKyspewogICAgICAgICAgICAgICAgbGV0IHgxID0gZlt5MV07CiAgICAgICAgICAgICAgICBoZS5pc0Nsb2NrV2lzZSh4MSkgPT09ICEwICYmIChmW3kxXSA9IHgxLnJldmVyc2UoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG0gPSBoZS50cmlhbmd1bGF0ZVNoYXBlKHAsIGYpOwogICAgICAgICAgICBmb3IobGV0IHkxID0gMCwgZyA9IGYubGVuZ3RoOyB5MSA8IGc7IHkxKyspewogICAgICAgICAgICAgICAgbGV0IHgxID0gZlt5MV07CiAgICAgICAgICAgICAgICBwID0gcC5jb25jYXQoeDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcihsZXQgeTEgPSAwLCBnID0gcC5sZW5ndGg7IHkxIDwgZzsgeTErKyl7CiAgICAgICAgICAgICAgICBsZXQgeDEgPSBwW3kxXTsKICAgICAgICAgICAgICAgIHMucHVzaCh4MS54LCB4MS55LCAwKSwgbi5wdXNoKDAsIDAsIDEpLCByLnB1c2goeDEueCwgeDEueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCB5MSA9IDAsIGcgPSBtLmxlbmd0aDsgeTEgPCBnOyB5MSsrKXsKICAgICAgICAgICAgICAgIGxldCB4MSA9IG1beTFdLCBiID0geDFbMF0gKyB1LCBNID0geDFbMV0gKyB1LCBfID0geDFbMl0gKyB1OwogICAgICAgICAgICAgICAgaS5wdXNoKGIsIE0sIF8pLCBhICs9IDM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHN1cGVyLnRvSlNPTigpLCBlID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlczsKICAgICAgICByZXR1cm4gZmQoZSwgdCk7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCwgZSkgewogICAgICAgIGxldCBpID0gW107CiAgICAgICAgZm9yKGxldCBzID0gMCwgbiA9IHQuc2hhcGVzLmxlbmd0aDsgcyA8IG47IHMrKyl7CiAgICAgICAgICAgIGxldCByID0gZVt0LnNoYXBlc1tzXV07CiAgICAgICAgICAgIGkucHVzaChyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBoKGksIHQuY3VydmVTZWdtZW50cyk7CiAgICB9Cn07CmZ1bmN0aW9uIGZkKGgsIHQpIHsKICAgIGlmICh0LnNoYXBlcyA9IFtdLCBBcnJheS5pc0FycmF5KGgpKSBmb3IobGV0IGUgPSAwLCBpID0gaC5sZW5ndGg7IGUgPCBpOyBlKyspewogICAgICAgIGxldCBzID0gaFtlXTsKICAgICAgICB0LnNoYXBlcy5wdXNoKHMudXVpZCk7CiAgICB9CiAgICBlbHNlIHQuc2hhcGVzLnB1c2goaC51dWlkKTsKICAgIHJldHVybiB0Owp9CnZhciBtbiA9IGNsYXNzIGggZXh0ZW5kcyBMIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMzIsIGkgPSAxNiwgcyA9IDAsIG4gPSBNYXRoLlBJICogMiwgciA9IDAsIG8gPSBNYXRoLlBJKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiU3BoZXJlR2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1czogdCwKICAgICAgICAgICAgd2lkdGhTZWdtZW50czogZSwKICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGksCiAgICAgICAgICAgIHBoaVN0YXJ0OiBzLAogICAgICAgICAgICBwaGlMZW5ndGg6IG4sCiAgICAgICAgICAgIHRoZXRhU3RhcnQ6IHIsCiAgICAgICAgICAgIHRoZXRhTGVuZ3RoOiBvCiAgICAgICAgfSwgZSA9IE1hdGgubWF4KDMsIE1hdGguZmxvb3IoZSkpLCBpID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihpKSk7CiAgICAgICAgbGV0IGEgPSBNYXRoLm1pbihyICsgbywgTWF0aC5QSSksIGwgPSAwLCBjID0gW10sIHUgPSBuZXcgdywgZCA9IG5ldyB3LCBwID0gW10sIGYgPSBbXSwgbSA9IFtdLCB5MSA9IFtdOwogICAgICAgIGZvcihsZXQgZyA9IDA7IGcgPD0gaTsgZysrKXsKICAgICAgICAgICAgbGV0IHgxID0gW10sIGIgPSBnIC8gaSwgTSA9IDA7CiAgICAgICAgICAgIGcgPT09IDAgJiYgciA9PT0gMCA/IE0gPSAuNSAvIGUgOiBnID09PSBpICYmIGEgPT09IE1hdGguUEkgJiYgKE0gPSAtLjUgLyBlKTsKICAgICAgICAgICAgZm9yKGxldCBfID0gMDsgXyA8PSBlOyBfKyspewogICAgICAgICAgICAgICAgbGV0IHYgPSBfIC8gZTsKICAgICAgICAgICAgICAgIHUueCA9IC10ICogTWF0aC5jb3MocyArIHYgKiBuKSAqIE1hdGguc2luKHIgKyBiICogbyksIHUueSA9IHQgKiBNYXRoLmNvcyhyICsgYiAqIG8pLCB1LnogPSB0ICogTWF0aC5zaW4ocyArIHYgKiBuKSAqIE1hdGguc2luKHIgKyBiICogbyksIGYucHVzaCh1LngsIHUueSwgdS56KSwgZC5jb3B5KHUpLm5vcm1hbGl6ZSgpLCBtLnB1c2goZC54LCBkLnksIGQueiksIHkxLnB1c2godiArIE0sIDEgLSBiKSwgeDEucHVzaChsKyspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGMucHVzaCh4MSk7CiAgICAgICAgfQogICAgICAgIGZvcihsZXQgZyA9IDA7IGcgPCBpOyBnKyspZm9yKGxldCB4MSA9IDA7IHgxIDwgZTsgeDErKyl7CiAgICAgICAgICAgIGxldCBiID0gY1tnXVt4MSArIDFdLCBNID0gY1tnXVt4MV0sIF8gPSBjW2cgKyAxXVt4MV0sIHYgPSBjW2cgKyAxXVt4MSArIDFdOwogICAgICAgICAgICAoZyAhPT0gMCB8fCByID4gMCkgJiYgcC5wdXNoKGIsIE0sIHYpLCAoZyAhPT0gaSAtIDEgfHwgYSA8IE1hdGguUEkpICYmIHAucHVzaChNLCBfLCB2KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRJbmRleChwKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoZiwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUobSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRSh5MSwgMikpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHQucGFyYW1ldGVycyksIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaCh0LnJhZGl1cywgdC53aWR0aFNlZ21lbnRzLCB0LmhlaWdodFNlZ21lbnRzLCB0LnBoaVN0YXJ0LCB0LnBoaUxlbmd0aCwgdC50aGV0YVN0YXJ0LCB0LnRoZXRhTGVuZ3RoKTsKICAgIH0KfSwgUXIgPSBjbGFzcyBoIGV4dGVuZHMgV2UgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAwKXsKICAgICAgICBsZXQgaSA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAxLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMQogICAgICAgIF0sIHMgPSBbCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDEKICAgICAgICBdOwogICAgICAgIHN1cGVyKGksIHMsIHQsIGUpLCB0aGlzLnR5cGUgPSAiVGV0cmFoZWRyb25HZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgcmFkaXVzOiB0LAogICAgICAgICAgICBkZXRhaWw6IGUKICAgICAgICB9OwogICAgfQogICAgc3RhdGljIGZyb21KU09OKHQpIHsKICAgICAgICByZXR1cm4gbmV3IGgodC5yYWRpdXMsIHQuZGV0YWlsKTsKICAgIH0KfSwganIgPSBjbGFzcyBoIGV4dGVuZHMgTCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IC40LCBpID0gMTIsIHMgPSA0OCwgbiA9IE1hdGguUEkgKiAyKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiVG9ydXNHZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgcmFkaXVzOiB0LAogICAgICAgICAgICB0dWJlOiBlLAogICAgICAgICAgICByYWRpYWxTZWdtZW50czogaSwKICAgICAgICAgICAgdHVidWxhclNlZ21lbnRzOiBzLAogICAgICAgICAgICBhcmM6IG4KICAgICAgICB9LCBpID0gTWF0aC5mbG9vcihpKSwgcyA9IE1hdGguZmxvb3Iocyk7CiAgICAgICAgbGV0IHIgPSBbXSwgbyA9IFtdLCBhID0gW10sIGwgPSBbXSwgYyA9IG5ldyB3LCB1ID0gbmV3IHcsIGQgPSBuZXcgdzsKICAgICAgICBmb3IobGV0IHAgPSAwOyBwIDw9IGk7IHArKylmb3IobGV0IGYgPSAwOyBmIDw9IHM7IGYrKyl7CiAgICAgICAgICAgIGxldCBtID0gZiAvIHMgKiBuLCB5MSA9IHAgLyBpICogTWF0aC5QSSAqIDI7CiAgICAgICAgICAgIHUueCA9ICh0ICsgZSAqIE1hdGguY29zKHkxKSkgKiBNYXRoLmNvcyhtKSwgdS55ID0gKHQgKyBlICogTWF0aC5jb3MoeTEpKSAqIE1hdGguc2luKG0pLCB1LnogPSBlICogTWF0aC5zaW4oeTEpLCBvLnB1c2godS54LCB1LnksIHUueiksIGMueCA9IHQgKiBNYXRoLmNvcyhtKSwgYy55ID0gdCAqIE1hdGguc2luKG0pLCBkLnN1YlZlY3RvcnModSwgYykubm9ybWFsaXplKCksIGEucHVzaChkLngsIGQueSwgZC56KSwgbC5wdXNoKGYgLyBzKSwgbC5wdXNoKHAgLyBpKTsKICAgICAgICB9CiAgICAgICAgZm9yKGxldCBwID0gMTsgcCA8PSBpOyBwKyspZm9yKGxldCBmID0gMTsgZiA8PSBzOyBmKyspewogICAgICAgICAgICBsZXQgbSA9IChzICsgMSkgKiBwICsgZiAtIDEsIHkxID0gKHMgKyAxKSAqIChwIC0gMSkgKyBmIC0gMSwgZyA9IChzICsgMSkgKiAocCAtIDEpICsgZiwgeDEgPSAocyArIDEpICogcCArIGY7CiAgICAgICAgICAgIHIucHVzaChtLCB5MSwgeDEpLCByLnB1c2goeTEsIGcsIHgxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRJbmRleChyKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUobywgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUoYSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShsLCAyKSk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQucmFkaXVzLCB0LnR1YmUsIHQucmFkaWFsU2VnbWVudHMsIHQudHVidWxhclNlZ21lbnRzLCB0LmFyYyk7CiAgICB9Cn0sIEtyID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAuNCwgaSA9IDY0LCBzID0gOCwgbiA9IDIsIHIgPSAzKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiVG9ydXNLbm90R2VvbWV0cnkiLCB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgICAgIHJhZGl1czogdCwKICAgICAgICAgICAgdHViZTogZSwKICAgICAgICAgICAgdHVidWxhclNlZ21lbnRzOiBpLAogICAgICAgICAgICByYWRpYWxTZWdtZW50czogcywKICAgICAgICAgICAgcDogbiwKICAgICAgICAgICAgcTogcgogICAgICAgIH0sIGkgPSBNYXRoLmZsb29yKGkpLCBzID0gTWF0aC5mbG9vcihzKTsKICAgICAgICBsZXQgbyA9IFtdLCBhID0gW10sIGwgPSBbXSwgYyA9IFtdLCB1ID0gbmV3IHcsIGQgPSBuZXcgdywgcCA9IG5ldyB3LCBmID0gbmV3IHcsIG0gPSBuZXcgdywgeTEgPSBuZXcgdywgZyA9IG5ldyB3OwogICAgICAgIGZvcihsZXQgYiA9IDA7IGIgPD0gaTsgKytiKXsKICAgICAgICAgICAgbGV0IE0gPSBiIC8gaSAqIG4gKiBNYXRoLlBJICogMjsKICAgICAgICAgICAgeDEoTSwgbiwgciwgdCwgcCksIHgxKE0gKyAuMDEsIG4sIHIsIHQsIGYpLCB5MS5zdWJWZWN0b3JzKGYsIHApLCBnLmFkZFZlY3RvcnMoZiwgcCksIG0uY3Jvc3NWZWN0b3JzKHkxLCBnKSwgZy5jcm9zc1ZlY3RvcnMobSwgeTEpLCBtLm5vcm1hbGl6ZSgpLCBnLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICBmb3IobGV0IF8gPSAwOyBfIDw9IHM7ICsrXyl7CiAgICAgICAgICAgICAgICBsZXQgdiA9IF8gLyBzICogTWF0aC5QSSAqIDIsIFMgPSAtZSAqIE1hdGguY29zKHYpLCBBID0gZSAqIE1hdGguc2luKHYpOwogICAgICAgICAgICAgICAgdS54ID0gcC54ICsgKFMgKiBnLnggKyBBICogbS54KSwgdS55ID0gcC55ICsgKFMgKiBnLnkgKyBBICogbS55KSwgdS56ID0gcC56ICsgKFMgKiBnLnogKyBBICogbS56KSwgYS5wdXNoKHUueCwgdS55LCB1LnopLCBkLnN1YlZlY3RvcnModSwgcCkubm9ybWFsaXplKCksIGwucHVzaChkLngsIGQueSwgZC56KSwgYy5wdXNoKGIgLyBpKSwgYy5wdXNoKF8gLyBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IobGV0IGIgPSAxOyBiIDw9IGk7IGIrKylmb3IobGV0IE0gPSAxOyBNIDw9IHM7IE0rKyl7CiAgICAgICAgICAgIGxldCBfID0gKHMgKyAxKSAqIChiIC0gMSkgKyAoTSAtIDEpLCB2ID0gKHMgKyAxKSAqIGIgKyAoTSAtIDEpLCBTID0gKHMgKyAxKSAqIGIgKyBNLCBBID0gKHMgKyAxKSAqIChiIC0gMSkgKyBNOwogICAgICAgICAgICBvLnB1c2goXywgdiwgQSksIG8ucHVzaCh2LCBTLCBBKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRJbmRleChvKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoYSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUobCwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShjLCAyKSk7CiAgICAgICAgZnVuY3Rpb24geDEoYiwgTSwgXywgdiwgUykgewogICAgICAgICAgICBsZXQgQSA9IE1hdGguY29zKGIpLCBJID0gTWF0aC5zaW4oYiksIEMgPSBfIC8gTSAqIGIsIGsgPSBNYXRoLmNvcyhDKTsKICAgICAgICAgICAgUy54ID0gdiAqICgyICsgaykgKiAuNSAqIEEsIFMueSA9IHYgKiAoMiArIGspICogSSAqIC41LCBTLnogPSB2ICogTWF0aC5zaW4oQykgKiAuNTsKICAgICAgICB9CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdC5wYXJhbWV0ZXJzKSwgdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBoKHQucmFkaXVzLCB0LnR1YmUsIHQudHVidWxhclNlZ21lbnRzLCB0LnJhZGlhbFNlZ21lbnRzLCB0LnAsIHQucSk7CiAgICB9Cn0sIHRvID0gY2xhc3MgaCBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IodCA9IG5ldyBjbihuZXcgdygtMSwgLTEsIDApLCBuZXcgdygtMSwgMSwgMCksIG5ldyB3KDEsIDEsIDApKSwgZSA9IDY0LCBpID0gMSwgcyA9IDgsIG4gPSAhMSl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIlR1YmVHZW9tZXRyeSIsIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICAgICAgcGF0aDogdCwKICAgICAgICAgICAgdHVidWxhclNlZ21lbnRzOiBlLAogICAgICAgICAgICByYWRpdXM6IGksCiAgICAgICAgICAgIHJhZGlhbFNlZ21lbnRzOiBzLAogICAgICAgICAgICBjbG9zZWQ6IG4KICAgICAgICB9OwogICAgICAgIGxldCByID0gdC5jb21wdXRlRnJlbmV0RnJhbWVzKGUsIG4pOwogICAgICAgIHRoaXMudGFuZ2VudHMgPSByLnRhbmdlbnRzLCB0aGlzLm5vcm1hbHMgPSByLm5vcm1hbHMsIHRoaXMuYmlub3JtYWxzID0gci5iaW5vcm1hbHM7CiAgICAgICAgbGV0IG8gPSBuZXcgdywgYSA9IG5ldyB3LCBsID0gbmV3IFQsIGMgPSBuZXcgdywgdSA9IFtdLCBkID0gW10sIHAgPSBbXSwgZiA9IFtdOwogICAgICAgIG0oKSwgdGhpcy5zZXRJbmRleChmKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUodSwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEUoZCwgMykpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRShwLCAyKSk7CiAgICAgICAgZnVuY3Rpb24gbSgpIHsKICAgICAgICAgICAgZm9yKGxldCBiID0gMDsgYiA8IGU7IGIrKyl5MShiKTsKICAgICAgICAgICAgeTEobiA9PT0gITEgPyBlIDogMCksIHgxKCksIGcoKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24geTEoYikgewogICAgICAgICAgICBjID0gdC5nZXRQb2ludEF0KGIgLyBlLCBjKTsKICAgICAgICAgICAgbGV0IE0gPSByLm5vcm1hbHNbYl0sIF8gPSByLmJpbm9ybWFsc1tiXTsKICAgICAgICAgICAgZm9yKGxldCB2ID0gMDsgdiA8PSBzOyB2KyspewogICAgICAgICAgICAgICAgbGV0IFMgPSB2IC8gcyAqIE1hdGguUEkgKiAyLCBBID0gTWF0aC5zaW4oUyksIEkgPSAtTWF0aC5jb3MoUyk7CiAgICAgICAgICAgICAgICBhLnggPSBJICogTS54ICsgQSAqIF8ueCwgYS55ID0gSSAqIE0ueSArIEEgKiBfLnksIGEueiA9IEkgKiBNLnogKyBBICogXy56LCBhLm5vcm1hbGl6ZSgpLCBkLnB1c2goYS54LCBhLnksIGEueiksIG8ueCA9IGMueCArIGkgKiBhLngsIG8ueSA9IGMueSArIGkgKiBhLnksIG8ueiA9IGMueiArIGkgKiBhLnosIHUucHVzaChvLngsIG8ueSwgby56KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnKCkgewogICAgICAgICAgICBmb3IobGV0IGIgPSAxOyBiIDw9IGU7IGIrKylmb3IobGV0IE0gPSAxOyBNIDw9IHM7IE0rKyl7CiAgICAgICAgICAgICAgICBsZXQgXyA9IChzICsgMSkgKiAoYiAtIDEpICsgKE0gLSAxKSwgdiA9IChzICsgMSkgKiBiICsgKE0gLSAxKSwgUyA9IChzICsgMSkgKiBiICsgTSwgQSA9IChzICsgMSkgKiAoYiAtIDEpICsgTTsKICAgICAgICAgICAgICAgIGYucHVzaChfLCB2LCBBKSwgZi5wdXNoKHYsIFMsIEEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHgxKCkgewogICAgICAgICAgICBmb3IobGV0IGIgPSAwOyBiIDw9IGU7IGIrKylmb3IobGV0IE0gPSAwOyBNIDw9IHM7IE0rKylsLnggPSBiIC8gZSwgbC55ID0gTSAvIHMsIHAucHVzaChsLngsIGwueSk7CiAgICAgICAgfQogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHQucGFyYW1ldGVycyksIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgICAgbGV0IHQgPSBzdXBlci50b0pTT04oKTsKICAgICAgICByZXR1cm4gdC5wYXRoID0gdGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCksIHQ7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04odCkgewogICAgICAgIHJldHVybiBuZXcgaChuZXcgZG5bdC5wYXRoLnR5cGVdKCkuZnJvbUpTT04odC5wYXRoKSwgdC50dWJ1bGFyU2VnbWVudHMsIHQucmFkaXVzLCB0LnJhZGlhbFNlZ21lbnRzLCB0LmNsb3NlZCk7CiAgICB9Cn0sIGVvID0gY2xhc3MgZXh0ZW5kcyBMIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBudWxsKXsKICAgICAgICBpZiAoc3VwZXIoKSwgdGhpcy50eXBlID0gIldpcmVmcmFtZUdlb21ldHJ5IiwgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgICAgICBnZW9tZXRyeTogdAogICAgICAgIH0sIHQgIT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IGUgPSBbXSwgaSA9IG5ldyBTZXQsIHMgPSBuZXcgdywgbiA9IG5ldyB3OwogICAgICAgICAgICBpZiAodC5pbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGV0IHIgPSB0LmF0dHJpYnV0ZXMucG9zaXRpb24sIG8gPSB0LmluZGV4LCBhID0gdC5ncm91cHM7CiAgICAgICAgICAgICAgICBhLmxlbmd0aCA9PT0gMCAmJiAoYSA9IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogby5jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxJbmRleDogMAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZm9yKGxldCBsID0gMCwgYyA9IGEubGVuZ3RoOyBsIDwgYzsgKytsKXsKICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IGFbbF0sIGQgPSB1LnN0YXJ0LCBwID0gdS5jb3VudDsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGYgPSBkLCBtID0gZCArIHA7IGYgPCBtOyBmICs9IDMpZm9yKGxldCB5MSA9IDA7IHkxIDwgMzsgeTErKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnID0gby5nZXRYKGYgKyB5MSksIHgxID0gby5nZXRYKGYgKyAoeTEgKyAxKSAlIDMpOwogICAgICAgICAgICAgICAgICAgICAgICBzLmZyb21CdWZmZXJBdHRyaWJ1dGUociwgZyksIG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLCB4MSksIHBoKHMsIG4sIGkpID09PSAhMCAmJiAoZS5wdXNoKHMueCwgcy55LCBzLnopLCBlLnB1c2gobi54LCBuLnksIG4ueikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxldCByID0gdC5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgICAgICAgICAgZm9yKGxldCBvID0gMCwgYSA9IHIuY291bnQgLyAzOyBvIDwgYTsgbysrKWZvcihsZXQgbCA9IDA7IGwgPCAzOyBsKyspewogICAgICAgICAgICAgICAgICAgIGxldCBjID0gMyAqIG8gKyBsLCB1ID0gMyAqIG8gKyAobCArIDEpICUgMzsKICAgICAgICAgICAgICAgICAgICBzLmZyb21CdWZmZXJBdHRyaWJ1dGUociwgYyksIG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLCB1KSwgcGgocywgbiwgaSkgPT09ICEwICYmIChlLnB1c2gocy54LCBzLnksIHMueiksIGUucHVzaChuLngsIG4ueSwgbi56KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoZSwgMykpOwogICAgICAgIH0KICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0LnBhcmFtZXRlcnMpLCB0aGlzOwogICAgfQp9OwpmdW5jdGlvbiBwaChoLCB0LCBlKSB7CiAgICBsZXQgaSA9IGAke2gueH0sJHtoLnl9LCR7aC56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWAsIHMgPSBgJHt0Lnh9LCR7dC55fSwke3Quen0tJHtoLnh9LCR7aC55fSwke2guen1gOwogICAgcmV0dXJuIGUuaGFzKGkpID09PSAhMCB8fCBlLmhhcyhzKSA9PT0gITAgPyAhMSA6IChlLmFkZChpKSwgZS5hZGQocyksICEwKTsKfQp2YXIgZmggPSBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIEJveEdlb21ldHJ5OiBLcywKICAgIENhcHN1bGVHZW9tZXRyeTogRHIsCiAgICBDaXJjbGVHZW9tZXRyeTogTHIsCiAgICBDb25lR2VvbWV0cnk6IFVyLAogICAgQ3lsaW5kZXJHZW9tZXRyeTogJGksCiAgICBEb2RlY2FoZWRyb25HZW9tZXRyeTogV3IsCiAgICBFZGdlc0dlb21ldHJ5OiBIciwKICAgIEV4dHJ1ZGVHZW9tZXRyeTogWHIsCiAgICBJY29zYWhlZHJvbkdlb21ldHJ5OiBKciwKICAgIExhdGhlR2VvbWV0cnk6IHBuLAogICAgT2N0YWhlZHJvbkdlb21ldHJ5OiBmbiwKICAgIFBsYW5lR2VvbWV0cnk6IFpyLAogICAgUG9seWhlZHJvbkdlb21ldHJ5OiBXZSwKICAgIFJpbmdHZW9tZXRyeTogWXIsCiAgICBTaGFwZUdlb21ldHJ5OiAkciwKICAgIFNwaGVyZUdlb21ldHJ5OiBtbiwKICAgIFRldHJhaGVkcm9uR2VvbWV0cnk6IFFyLAogICAgVG9ydXNHZW9tZXRyeToganIsCiAgICBUb3J1c0tub3RHZW9tZXRyeTogS3IsCiAgICBUdWJlR2VvbWV0cnk6IHRvLAogICAgV2lyZWZyYW1lR2VvbWV0cnk6IGVvCn0pLCBpbyA9IGNsYXNzIGV4dGVuZHMgY3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1NoYWRvd01hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJTaGFkb3dNYXRlcmlhbCIsIHRoaXMuY29sb3IgPSBuZXcgUCgwKSwgdGhpcy50cmFuc3BhcmVudCA9ICEwLCB0aGlzLmZvZyA9ICEwLCB0aGlzLnNldFZhbHVlcyh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksIHRoaXMuZm9nID0gdC5mb2csIHRoaXM7CiAgICB9Cn0sIHNvID0gY2xhc3MgZXh0ZW5kcyBxaSB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcih0KSwgdGhpcy5pc1Jhd1NoYWRlck1hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJSYXdTaGFkZXJNYXRlcmlhbCI7CiAgICB9Cn0sIHluID0gY2xhc3MgZXh0ZW5kcyBjdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSAhMCwgdGhpcy50eXBlID0gIk1lc2hTdGFuZGFyZE1hdGVyaWFsIiwgdGhpcy5kZWZpbmVzID0gewogICAgICAgICAgICBTVEFOREFSRDogIiIKICAgICAgICB9LCB0aGlzLmNvbG9yID0gbmV3IFAoMTY3NzcyMTUpLCB0aGlzLnJvdWdobmVzcyA9IDEsIHRoaXMubWV0YWxuZXNzID0gMCwgdGhpcy5tYXAgPSBudWxsLCB0aGlzLmxpZ2h0TWFwID0gbnVsbCwgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEsIHRoaXMuYW9NYXAgPSBudWxsLCB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMSwgdGhpcy5lbWlzc2l2ZSA9IG5ldyBQKDApLCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMSwgdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGwsIHRoaXMuYnVtcE1hcCA9IG51bGwsIHRoaXMuYnVtcFNjYWxlID0gMSwgdGhpcy5ub3JtYWxNYXAgPSBudWxsLCB0aGlzLm5vcm1hbE1hcFR5cGUgPSBfaSwgdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBUKDEsIDEpLCB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGwsIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxLCB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwLCB0aGlzLnJvdWdobmVzc01hcCA9IG51bGwsIHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbCwgdGhpcy5hbHBoYU1hcCA9IG51bGwsIHRoaXMuZW52TWFwID0gbnVsbCwgdGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBYdCwgdGhpcy5lbnZNYXBJbnRlbnNpdHkgPSAxLCB0aGlzLndpcmVmcmFtZSA9ICExLCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDEsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICJyb3VuZCIsIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAicm91bmQiLCB0aGlzLmZsYXRTaGFkaW5nID0gITEsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuZGVmaW5lcyA9IHsKICAgICAgICAgICAgU1RBTkRBUkQ6ICIiCiAgICAgICAgfSwgdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLCB0aGlzLnJvdWdobmVzcyA9IHQucm91Z2huZXNzLCB0aGlzLm1ldGFsbmVzcyA9IHQubWV0YWxuZXNzLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmxpZ2h0TWFwID0gdC5saWdodE1hcCwgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHQubGlnaHRNYXBJbnRlbnNpdHksIHRoaXMuYW9NYXAgPSB0LmFvTWFwLCB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gdC5hb01hcEludGVuc2l0eSwgdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLCB0aGlzLmVtaXNzaXZlTWFwID0gdC5lbWlzc2l2ZU1hcCwgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHQuZW1pc3NpdmVJbnRlbnNpdHksIHRoaXMuYnVtcE1hcCA9IHQuYnVtcE1hcCwgdGhpcy5idW1wU2NhbGUgPSB0LmJ1bXBTY2FsZSwgdGhpcy5ub3JtYWxNYXAgPSB0Lm5vcm1hbE1hcCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gdC5ub3JtYWxNYXBUeXBlLCB0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gdC5kaXNwbGFjZW1lbnRNYXAsIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSB0LmRpc3BsYWNlbWVudFNjYWxlLCB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSB0LmRpc3BsYWNlbWVudEJpYXMsIHRoaXMucm91Z2huZXNzTWFwID0gdC5yb3VnaG5lc3NNYXAsIHRoaXMubWV0YWxuZXNzTWFwID0gdC5tZXRhbG5lc3NNYXAsIHRoaXMuYWxwaGFNYXAgPSB0LmFscGhhTWFwLCB0aGlzLmVudk1hcCA9IHQuZW52TWFwLCB0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksIHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gdC5lbnZNYXBJbnRlbnNpdHksIHRoaXMud2lyZWZyYW1lID0gdC53aXJlZnJhbWUsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHQud2lyZWZyYW1lTGluZWNhcCwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHQud2lyZWZyYW1lTGluZWpvaW4sIHRoaXMuZmxhdFNoYWRpbmcgPSB0LmZsYXRTaGFkaW5nLCB0aGlzLmZvZyA9IHQuZm9nLCB0aGlzOwogICAgfQp9LCBubyA9IGNsYXNzIGV4dGVuZHMgeW4gewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gITAsIHRoaXMuZGVmaW5lcyA9IHsKICAgICAgICAgICAgU1RBTkRBUkQ6ICIiLAogICAgICAgICAgICBQSFlTSUNBTDogIiIKICAgICAgICB9LCB0aGlzLnR5cGUgPSAiTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCB0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiA9IDAsIHRoaXMuYW5pc290cm9weU1hcCA9IG51bGwsIHRoaXMuY2xlYXJjb2F0TWFwID0gbnVsbCwgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSAwLCB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IG51bGwsIHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVCgxLCAxKSwgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBudWxsLCB0aGlzLmlvciA9IDEuNSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJyZWZsZWN0aXZpdHkiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTigyLjUgKiAodGhpcy5pb3IgLSAxKSAvICh0aGlzLmlvciArIDEpLCAwLCAxKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlvciA9ICgxICsgLjQgKiBlKSAvICgxIC0gLjQgKiBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pLCB0aGlzLmlyaWRlc2NlbmNlTWFwID0gbnVsbCwgdGhpcy5pcmlkZXNjZW5jZUlPUiA9IDEuMywgdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gWwogICAgICAgICAgICAxMDAsCiAgICAgICAgICAgIDQwMAogICAgICAgIF0sIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSBudWxsLCB0aGlzLnNoZWVuQ29sb3IgPSBuZXcgUCgwKSwgdGhpcy5zaGVlbkNvbG9yTWFwID0gbnVsbCwgdGhpcy5zaGVlblJvdWdobmVzcyA9IDEsIHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAgPSBudWxsLCB0aGlzLnRyYW5zbWlzc2lvbk1hcCA9IG51bGwsIHRoaXMudGhpY2tuZXNzID0gMCwgdGhpcy50aGlja25lc3NNYXAgPSBudWxsLCB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgPSAxIC8gMCwgdGhpcy5hdHRlbnVhdGlvbkNvbG9yID0gbmV3IFAoMSwgMSwgMSksIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgPSAxLCB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gbnVsbCwgdGhpcy5zcGVjdWxhckNvbG9yID0gbmV3IFAoMSwgMSwgMSksIHRoaXMuc3BlY3VsYXJDb2xvck1hcCA9IG51bGwsIHRoaXMuX2FuaXNvdHJvcHkgPSAwLCB0aGlzLl9jbGVhcmNvYXQgPSAwLCB0aGlzLl9kaXNwZXJzaW9uID0gMCwgdGhpcy5faXJpZGVzY2VuY2UgPSAwLCB0aGlzLl9zaGVlbiA9IDAsIHRoaXMuX3RyYW5zbWlzc2lvbiA9IDAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgZ2V0IGFuaXNvdHJvcHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FuaXNvdHJvcHk7CiAgICB9CiAgICBzZXQgYW5pc290cm9weSh0KSB7CiAgICAgICAgdGhpcy5fYW5pc290cm9weSA+IDAgIT0gdCA+IDAgJiYgdGhpcy52ZXJzaW9uKyssIHRoaXMuX2FuaXNvdHJvcHkgPSB0OwogICAgfQogICAgZ2V0IGNsZWFyY29hdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2xlYXJjb2F0OwogICAgfQogICAgc2V0IGNsZWFyY29hdCh0KSB7CiAgICAgICAgdGhpcy5fY2xlYXJjb2F0ID4gMCAhPSB0ID4gMCAmJiB0aGlzLnZlcnNpb24rKywgdGhpcy5fY2xlYXJjb2F0ID0gdDsKICAgIH0KICAgIGdldCBpcmlkZXNjZW5jZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXJpZGVzY2VuY2U7CiAgICB9CiAgICBzZXQgaXJpZGVzY2VuY2UodCkgewogICAgICAgIHRoaXMuX2lyaWRlc2NlbmNlID4gMCAhPSB0ID4gMCAmJiB0aGlzLnZlcnNpb24rKywgdGhpcy5faXJpZGVzY2VuY2UgPSB0OwogICAgfQogICAgZ2V0IGRpc3BlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BlcnNpb247CiAgICB9CiAgICBzZXQgZGlzcGVyc2lvbih0KSB7CiAgICAgICAgdGhpcy5fZGlzcGVyc2lvbiA+IDAgIT0gdCA+IDAgJiYgdGhpcy52ZXJzaW9uKyssIHRoaXMuX2Rpc3BlcnNpb24gPSB0OwogICAgfQogICAgZ2V0IHNoZWVuKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zaGVlbjsKICAgIH0KICAgIHNldCBzaGVlbih0KSB7CiAgICAgICAgdGhpcy5fc2hlZW4gPiAwICE9IHQgPiAwICYmIHRoaXMudmVyc2lvbisrLCB0aGlzLl9zaGVlbiA9IHQ7CiAgICB9CiAgICBnZXQgdHJhbnNtaXNzaW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl90cmFuc21pc3Npb247CiAgICB9CiAgICBzZXQgdHJhbnNtaXNzaW9uKHQpIHsKICAgICAgICB0aGlzLl90cmFuc21pc3Npb24gPiAwICE9IHQgPiAwICYmIHRoaXMudmVyc2lvbisrLCB0aGlzLl90cmFuc21pc3Npb24gPSB0OwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuZGVmaW5lcyA9IHsKICAgICAgICAgICAgU1RBTkRBUkQ6ICIiLAogICAgICAgICAgICBQSFlTSUNBTDogIiIKICAgICAgICB9LCB0aGlzLmFuaXNvdHJvcHkgPSB0LmFuaXNvdHJvcHksIHRoaXMuYW5pc290cm9weVJvdGF0aW9uID0gdC5hbmlzb3Ryb3B5Um90YXRpb24sIHRoaXMuYW5pc290cm9weU1hcCA9IHQuYW5pc290cm9weU1hcCwgdGhpcy5jbGVhcmNvYXQgPSB0LmNsZWFyY29hdCwgdGhpcy5jbGVhcmNvYXRNYXAgPSB0LmNsZWFyY29hdE1hcCwgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSB0LmNsZWFyY29hdFJvdWdobmVzcywgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSB0LmNsZWFyY29hdFJvdWdobmVzc01hcCwgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSB0LmNsZWFyY29hdE5vcm1hbE1hcCwgdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLCB0aGlzLmRpc3BlcnNpb24gPSB0LmRpc3BlcnNpb24sIHRoaXMuaW9yID0gdC5pb3IsIHRoaXMuaXJpZGVzY2VuY2UgPSB0LmlyaWRlc2NlbmNlLCB0aGlzLmlyaWRlc2NlbmNlTWFwID0gdC5pcmlkZXNjZW5jZU1hcCwgdGhpcy5pcmlkZXNjZW5jZUlPUiA9IHQuaXJpZGVzY2VuY2VJT1IsIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IFsKICAgICAgICAgICAgLi4udC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlCiAgICAgICAgXSwgdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHRoaXMuc2hlZW4gPSB0LnNoZWVuLCB0aGlzLnNoZWVuQ29sb3IuY29weSh0LnNoZWVuQ29sb3IpLCB0aGlzLnNoZWVuQ29sb3JNYXAgPSB0LnNoZWVuQ29sb3JNYXAsIHRoaXMuc2hlZW5Sb3VnaG5lc3MgPSB0LnNoZWVuUm91Z2huZXNzLCB0aGlzLnNoZWVuUm91Z2huZXNzTWFwID0gdC5zaGVlblJvdWdobmVzc01hcCwgdGhpcy50cmFuc21pc3Npb24gPSB0LnRyYW5zbWlzc2lvbiwgdGhpcy50cmFuc21pc3Npb25NYXAgPSB0LnRyYW5zbWlzc2lvbk1hcCwgdGhpcy50aGlja25lc3MgPSB0LnRoaWNrbmVzcywgdGhpcy50aGlja25lc3NNYXAgPSB0LnRoaWNrbmVzc01hcCwgdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlID0gdC5hdHRlbnVhdGlvbkRpc3RhbmNlLCB0aGlzLmF0dGVudWF0aW9uQ29sb3IuY29weSh0LmF0dGVudWF0aW9uQ29sb3IpLCB0aGlzLnNwZWN1bGFySW50ZW5zaXR5ID0gdC5zcGVjdWxhckludGVuc2l0eSwgdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCA9IHQuc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHRoaXMuc3BlY3VsYXJDb2xvci5jb3B5KHQuc3BlY3VsYXJDb2xvciksIHRoaXMuc3BlY3VsYXJDb2xvck1hcCA9IHQuc3BlY3VsYXJDb2xvck1hcCwgdGhpczsKICAgIH0KfSwgcm8gPSBjbGFzcyBleHRlbmRzIGN0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbCA9ICEwLCB0aGlzLnR5cGUgPSAiTWVzaFBob25nTWF0ZXJpYWwiLCB0aGlzLmNvbG9yID0gbmV3IFAoMTY3NzcyMTUpLCB0aGlzLnNwZWN1bGFyID0gbmV3IFAoMTExODQ4MSksIHRoaXMuc2hpbmluZXNzID0gMzAsIHRoaXMubWFwID0gbnVsbCwgdGhpcy5saWdodE1hcCA9IG51bGwsIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLCB0aGlzLmFvTWFwID0gbnVsbCwgdGhpcy5hb01hcEludGVuc2l0eSA9IDEsIHRoaXMuZW1pc3NpdmUgPSBuZXcgUCgwKSwgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEsIHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsLCB0aGlzLmJ1bXBNYXAgPSBudWxsLCB0aGlzLmJ1bXBTY2FsZSA9IDEsIHRoaXMubm9ybWFsTWFwID0gbnVsbCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gX2ksIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVCgxLCAxKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMCwgdGhpcy5zcGVjdWxhck1hcCA9IG51bGwsIHRoaXMuYWxwaGFNYXAgPSBudWxsLCB0aGlzLmVudk1hcCA9IG51bGwsIHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgWHQsIHRoaXMuY29tYmluZSA9IERvLCB0aGlzLnJlZmxlY3Rpdml0eSA9IDEsIHRoaXMucmVmcmFjdGlvblJhdGlvID0gLjk4LCB0aGlzLndpcmVmcmFtZSA9ICExLCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDEsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICJyb3VuZCIsIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAicm91bmQiLCB0aGlzLmZsYXRTaGFkaW5nID0gITEsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSwgdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLCB0aGlzLnNoaW5pbmVzcyA9IHQuc2hpbmluZXNzLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmxpZ2h0TWFwID0gdC5saWdodE1hcCwgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHQubGlnaHRNYXBJbnRlbnNpdHksIHRoaXMuYW9NYXAgPSB0LmFvTWFwLCB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gdC5hb01hcEludGVuc2l0eSwgdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLCB0aGlzLmVtaXNzaXZlTWFwID0gdC5lbWlzc2l2ZU1hcCwgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHQuZW1pc3NpdmVJbnRlbnNpdHksIHRoaXMuYnVtcE1hcCA9IHQuYnVtcE1hcCwgdGhpcy5idW1wU2NhbGUgPSB0LmJ1bXBTY2FsZSwgdGhpcy5ub3JtYWxNYXAgPSB0Lm5vcm1hbE1hcCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gdC5ub3JtYWxNYXBUeXBlLCB0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gdC5kaXNwbGFjZW1lbnRNYXAsIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSB0LmRpc3BsYWNlbWVudFNjYWxlLCB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSB0LmRpc3BsYWNlbWVudEJpYXMsIHRoaXMuc3BlY3VsYXJNYXAgPSB0LnNwZWN1bGFyTWFwLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5lbnZNYXAgPSB0LmVudk1hcCwgdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLCB0aGlzLmNvbWJpbmUgPSB0LmNvbWJpbmUsIHRoaXMucmVmbGVjdGl2aXR5ID0gdC5yZWZsZWN0aXZpdHksIHRoaXMucmVmcmFjdGlvblJhdGlvID0gdC5yZWZyYWN0aW9uUmF0aW8sIHRoaXMud2lyZWZyYW1lID0gdC53aXJlZnJhbWUsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHQud2lyZWZyYW1lTGluZWNhcCwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHQud2lyZWZyYW1lTGluZWpvaW4sIHRoaXMuZmxhdFNoYWRpbmcgPSB0LmZsYXRTaGFkaW5nLCB0aGlzLmZvZyA9IHQuZm9nLCB0aGlzOwogICAgfQp9LCBvbyA9IGNsYXNzIGV4dGVuZHMgY3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc01lc2hUb29uTWF0ZXJpYWwgPSAhMCwgdGhpcy5kZWZpbmVzID0gewogICAgICAgICAgICBUT09OOiAiIgogICAgICAgIH0sIHRoaXMudHlwZSA9ICJNZXNoVG9vbk1hdGVyaWFsIiwgdGhpcy5jb2xvciA9IG5ldyBQKDE2Nzc3MjE1KSwgdGhpcy5tYXAgPSBudWxsLCB0aGlzLmdyYWRpZW50TWFwID0gbnVsbCwgdGhpcy5saWdodE1hcCA9IG51bGwsIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLCB0aGlzLmFvTWFwID0gbnVsbCwgdGhpcy5hb01hcEludGVuc2l0eSA9IDEsIHRoaXMuZW1pc3NpdmUgPSBuZXcgUCgwKSwgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEsIHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsLCB0aGlzLmJ1bXBNYXAgPSBudWxsLCB0aGlzLmJ1bXBTY2FsZSA9IDEsIHRoaXMubm9ybWFsTWFwID0gbnVsbCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gX2ksIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVCgxLCAxKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMCwgdGhpcy5hbHBoYU1hcCA9IG51bGwsIHRoaXMud2lyZWZyYW1lID0gITEsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMSwgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gInJvdW5kIiwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICJyb3VuZCIsIHRoaXMuZm9nID0gITAsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSwgdGhpcy5tYXAgPSB0Lm1hcCwgdGhpcy5ncmFkaWVudE1hcCA9IHQuZ3JhZGllbnRNYXAsIHRoaXMubGlnaHRNYXAgPSB0LmxpZ2h0TWFwLCB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdC5saWdodE1hcEludGVuc2l0eSwgdGhpcy5hb01hcCA9IHQuYW9NYXAsIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSB0LmFvTWFwSW50ZW5zaXR5LCB0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksIHRoaXMuZW1pc3NpdmVNYXAgPSB0LmVtaXNzaXZlTWFwLCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gdC5lbWlzc2l2ZUludGVuc2l0eSwgdGhpcy5idW1wTWFwID0gdC5idW1wTWFwLCB0aGlzLmJ1bXBTY2FsZSA9IHQuYnVtcFNjYWxlLCB0aGlzLm5vcm1hbE1hcCA9IHQubm9ybWFsTWFwLCB0aGlzLm5vcm1hbE1hcFR5cGUgPSB0Lm5vcm1hbE1hcFR5cGUsIHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSB0LmRpc3BsYWNlbWVudE1hcCwgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHQuZGlzcGxhY2VtZW50U2NhbGUsIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHQuZGlzcGxhY2VtZW50QmlhcywgdGhpcy5hbHBoYU1hcCA9IHQuYWxwaGFNYXAsIHRoaXMud2lyZWZyYW1lID0gdC53aXJlZnJhbWUsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgsIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHQud2lyZWZyYW1lTGluZWNhcCwgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHQud2lyZWZyYW1lTGluZWpvaW4sIHRoaXMuZm9nID0gdC5mb2csIHRoaXM7CiAgICB9Cn0sIGFvID0gY2xhc3MgZXh0ZW5kcyBjdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJNZXNoTm9ybWFsTWF0ZXJpYWwiLCB0aGlzLmJ1bXBNYXAgPSBudWxsLCB0aGlzLmJ1bXBTY2FsZSA9IDEsIHRoaXMubm9ybWFsTWFwID0gbnVsbCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gX2ksIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVCgxLCAxKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMCwgdGhpcy53aXJlZnJhbWUgPSAhMSwgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxLCB0aGlzLmZsYXRTaGFkaW5nID0gITEsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuYnVtcE1hcCA9IHQuYnVtcE1hcCwgdGhpcy5idW1wU2NhbGUgPSB0LmJ1bXBTY2FsZSwgdGhpcy5ub3JtYWxNYXAgPSB0Lm5vcm1hbE1hcCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gdC5ub3JtYWxNYXBUeXBlLCB0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gdC5kaXNwbGFjZW1lbnRNYXAsIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSB0LmRpc3BsYWNlbWVudFNjYWxlLCB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSB0LmRpc3BsYWNlbWVudEJpYXMsIHRoaXMud2lyZWZyYW1lID0gdC53aXJlZnJhbWUsIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgsIHRoaXMuZmxhdFNoYWRpbmcgPSB0LmZsYXRTaGFkaW5nLCB0aGlzOwogICAgfQp9LCBobyA9IGNsYXNzIGV4dGVuZHMgY3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSAhMCwgdGhpcy50eXBlID0gIk1lc2hMYW1iZXJ0TWF0ZXJpYWwiLCB0aGlzLmNvbG9yID0gbmV3IFAoMTY3NzcyMTUpLCB0aGlzLm1hcCA9IG51bGwsIHRoaXMubGlnaHRNYXAgPSBudWxsLCB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMSwgdGhpcy5hb01hcCA9IG51bGwsIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLCB0aGlzLmVtaXNzaXZlID0gbmV3IFAoMCksIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLCB0aGlzLmVtaXNzaXZlTWFwID0gbnVsbCwgdGhpcy5idW1wTWFwID0gbnVsbCwgdGhpcy5idW1wU2NhbGUgPSAxLCB0aGlzLm5vcm1hbE1hcCA9IG51bGwsIHRoaXMubm9ybWFsTWFwVHlwZSA9IF9pLCB0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFQoMSwgMSksIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbCwgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDEsIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDAsIHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsLCB0aGlzLmFscGhhTWFwID0gbnVsbCwgdGhpcy5lbnZNYXAgPSBudWxsLCB0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IFh0LCB0aGlzLmNvbWJpbmUgPSBEbywgdGhpcy5yZWZsZWN0aXZpdHkgPSAxLCB0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IC45OCwgdGhpcy53aXJlZnJhbWUgPSAhMSwgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxLCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAicm91bmQiLCB0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gInJvdW5kIiwgdGhpcy5mbGF0U2hhZGluZyA9ICExLCB0aGlzLmZvZyA9ICEwLCB0aGlzLnNldFZhbHVlcyh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksIHRoaXMubWFwID0gdC5tYXAsIHRoaXMubGlnaHRNYXAgPSB0LmxpZ2h0TWFwLCB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdC5saWdodE1hcEludGVuc2l0eSwgdGhpcy5hb01hcCA9IHQuYW9NYXAsIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSB0LmFvTWFwSW50ZW5zaXR5LCB0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksIHRoaXMuZW1pc3NpdmVNYXAgPSB0LmVtaXNzaXZlTWFwLCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gdC5lbWlzc2l2ZUludGVuc2l0eSwgdGhpcy5idW1wTWFwID0gdC5idW1wTWFwLCB0aGlzLmJ1bXBTY2FsZSA9IHQuYnVtcFNjYWxlLCB0aGlzLm5vcm1hbE1hcCA9IHQubm9ybWFsTWFwLCB0aGlzLm5vcm1hbE1hcFR5cGUgPSB0Lm5vcm1hbE1hcFR5cGUsIHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSB0LmRpc3BsYWNlbWVudE1hcCwgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHQuZGlzcGxhY2VtZW50U2NhbGUsIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHQuZGlzcGxhY2VtZW50QmlhcywgdGhpcy5zcGVjdWxhck1hcCA9IHQuc3BlY3VsYXJNYXAsIHRoaXMuYWxwaGFNYXAgPSB0LmFscGhhTWFwLCB0aGlzLmVudk1hcCA9IHQuZW52TWFwLCB0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksIHRoaXMuY29tYmluZSA9IHQuY29tYmluZSwgdGhpcy5yZWZsZWN0aXZpdHkgPSB0LnJlZmxlY3Rpdml0eSwgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSB0LnJlZnJhY3Rpb25SYXRpbywgdGhpcy53aXJlZnJhbWUgPSB0LndpcmVmcmFtZSwgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSB0LndpcmVmcmFtZUxpbmV3aWR0aCwgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gdC53aXJlZnJhbWVMaW5lY2FwLCB0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gdC53aXJlZnJhbWVMaW5lam9pbiwgdGhpcy5mbGF0U2hhZGluZyA9IHQuZmxhdFNoYWRpbmcsIHRoaXMuZm9nID0gdC5mb2csIHRoaXM7CiAgICB9Cn0sIGxvID0gY2xhc3MgZXh0ZW5kcyBjdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSAhMCwgdGhpcy50eXBlID0gIk1lc2hEZXB0aE1hdGVyaWFsIiwgdGhpcy5kZXB0aFBhY2tpbmcgPSBKYywgdGhpcy5tYXAgPSBudWxsLCB0aGlzLmFscGhhTWFwID0gbnVsbCwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMCwgdGhpcy53aXJlZnJhbWUgPSAhMSwgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxLCB0aGlzLnNldFZhbHVlcyh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmRlcHRoUGFja2luZyA9IHQuZGVwdGhQYWNraW5nLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSB0LmRpc3BsYWNlbWVudE1hcCwgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHQuZGlzcGxhY2VtZW50U2NhbGUsIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHQuZGlzcGxhY2VtZW50QmlhcywgdGhpcy53aXJlZnJhbWUgPSB0LndpcmVmcmFtZSwgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSB0LndpcmVmcmFtZUxpbmV3aWR0aCwgdGhpczsKICAgIH0KfSwgY28gPSBjbGFzcyBleHRlbmRzIGN0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9ICEwLCB0aGlzLnR5cGUgPSAiTWVzaERpc3RhbmNlTWF0ZXJpYWwiLCB0aGlzLm1hcCA9IG51bGwsIHRoaXMuYWxwaGFNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGwsIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxLCB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwLCB0aGlzLnNldFZhbHVlcyh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSB0LmRpc3BsYWNlbWVudE1hcCwgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHQuZGlzcGxhY2VtZW50U2NhbGUsIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHQuZGlzcGxhY2VtZW50QmlhcywgdGhpczsKICAgIH0KfSwgdW8gPSBjbGFzcyBleHRlbmRzIGN0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgPSAhMCwgdGhpcy5kZWZpbmVzID0gewogICAgICAgICAgICBNQVRDQVA6ICIiCiAgICAgICAgfSwgdGhpcy50eXBlID0gIk1lc2hNYXRjYXBNYXRlcmlhbCIsIHRoaXMuY29sb3IgPSBuZXcgUCgxNjc3NzIxNSksIHRoaXMubWF0Y2FwID0gbnVsbCwgdGhpcy5tYXAgPSBudWxsLCB0aGlzLmJ1bXBNYXAgPSBudWxsLCB0aGlzLmJ1bXBTY2FsZSA9IDEsIHRoaXMubm9ybWFsTWFwID0gbnVsbCwgdGhpcy5ub3JtYWxNYXBUeXBlID0gX2ksIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVCgxLCAxKSwgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMCwgdGhpcy5hbHBoYU1hcCA9IG51bGwsIHRoaXMuZmxhdFNoYWRpbmcgPSAhMSwgdGhpcy5mb2cgPSAhMCwgdGhpcy5zZXRWYWx1ZXModCk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5kZWZpbmVzID0gewogICAgICAgICAgICBNQVRDQVA6ICIiCiAgICAgICAgfSwgdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLCB0aGlzLm1hdGNhcCA9IHQubWF0Y2FwLCB0aGlzLm1hcCA9IHQubWFwLCB0aGlzLmJ1bXBNYXAgPSB0LmJ1bXBNYXAsIHRoaXMuYnVtcFNjYWxlID0gdC5idW1wU2NhbGUsIHRoaXMubm9ybWFsTWFwID0gdC5ub3JtYWxNYXAsIHRoaXMubm9ybWFsTWFwVHlwZSA9IHQubm9ybWFsTWFwVHlwZSwgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLCB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHQuZGlzcGxhY2VtZW50TWFwLCB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gdC5kaXNwbGFjZW1lbnRTY2FsZSwgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gdC5kaXNwbGFjZW1lbnRCaWFzLCB0aGlzLmFscGhhTWFwID0gdC5hbHBoYU1hcCwgdGhpcy5mbGF0U2hhZGluZyA9IHQuZmxhdFNoYWRpbmcsIHRoaXMuZm9nID0gdC5mb2csIHRoaXM7CiAgICB9Cn0sIHBvID0gY2xhc3MgZXh0ZW5kcyBtdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsID0gITAsIHRoaXMudHlwZSA9ICJMaW5lRGFzaGVkTWF0ZXJpYWwiLCB0aGlzLnNjYWxlID0gMSwgdGhpcy5kYXNoU2l6ZSA9IDMsIHRoaXMuZ2FwU2l6ZSA9IDEsIHRoaXMuc2V0VmFsdWVzKHQpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCksIHRoaXMuc2NhbGUgPSB0LnNjYWxlLCB0aGlzLmRhc2hTaXplID0gdC5kYXNoU2l6ZSwgdGhpcy5nYXBTaXplID0gdC5nYXBTaXplLCB0aGlzOwogICAgfQp9OwpmdW5jdGlvbiBWZShoLCB0LCBlKSB7CiAgICByZXR1cm4gIWggfHwgIWUgJiYgaC5jb25zdHJ1Y3RvciA9PT0gdCA/IGggOiB0eXBlb2YgdC5CWVRFU19QRVJfRUxFTUVOVCA9PSAibnVtYmVyIiA/IG5ldyB0KGgpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaCk7Cn0KZnVuY3Rpb24gUGwoaCkgewogICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhoKSAmJiAhKGggaW5zdGFuY2VvZiBEYXRhVmlldyk7Cn0KZnVuY3Rpb24gT2woaCkgewogICAgZnVuY3Rpb24gdChzLCBuKSB7CiAgICAgICAgcmV0dXJuIGhbc10gLSBoW25dOwogICAgfQogICAgbGV0IGUgPSBoLmxlbmd0aCwgaSA9IG5ldyBBcnJheShlKTsKICAgIGZvcihsZXQgcyA9IDA7IHMgIT09IGU7ICsrcylpW3NdID0gczsKICAgIHJldHVybiBpLnNvcnQodCksIGk7Cn0KZnVuY3Rpb24gZm8oaCwgdCwgZSkgewogICAgbGV0IGkgPSBoLmxlbmd0aCwgcyA9IG5ldyBoLmNvbnN0cnVjdG9yKGkpOwogICAgZm9yKGxldCBuID0gMCwgciA9IDA7IHIgIT09IGk7ICsrbil7CiAgICAgICAgbGV0IG8gPSBlW25dICogdDsKICAgICAgICBmb3IobGV0IGEgPSAwOyBhICE9PSB0OyArK2Epc1tyKytdID0gaFtvICsgYV07CiAgICB9CiAgICByZXR1cm4gczsKfQpmdW5jdGlvbiBYbyhoLCB0LCBlLCBpKSB7CiAgICBsZXQgcyA9IDEsIG4gPSBoWzBdOwogICAgZm9yKDsgbiAhPT0gdm9pZCAwICYmIG5baV0gPT09IHZvaWQgMDspbiA9IGhbcysrXTsKICAgIGlmIChuID09PSB2b2lkIDApIHJldHVybjsKICAgIGxldCByID0gbltpXTsKICAgIGlmIChyICE9PSB2b2lkIDApIGlmIChBcnJheS5pc0FycmF5KHIpKSBkbyByID0gbltpXSwgciAhPT0gdm9pZCAwICYmICh0LnB1c2gobi50aW1lKSwgZS5wdXNoLmFwcGx5KGUsIHIpKSwgbiA9IGhbcysrXTsKICAgIHdoaWxlIChuICE9PSB2b2lkIDApCiAgICBlbHNlIGlmIChyLnRvQXJyYXkgIT09IHZvaWQgMCkgZG8gciA9IG5baV0sIHIgIT09IHZvaWQgMCAmJiAodC5wdXNoKG4udGltZSksIHIudG9BcnJheShlLCBlLmxlbmd0aCkpLCBuID0gaFtzKytdOwogICAgd2hpbGUgKG4gIT09IHZvaWQgMCkKICAgIGVsc2UgZG8gciA9IG5baV0sIHIgIT09IHZvaWQgMCAmJiAodC5wdXNoKG4udGltZSksIGUucHVzaChyKSksIG4gPSBoW3MrK107CiAgICB3aGlsZSAobiAhPT0gdm9pZCAwKQp9CmZ1bmN0aW9uIG1kKGgsIHQsIGUsIGksIHMgPSAzMCkgewogICAgbGV0IG4gPSBoLmNsb25lKCk7CiAgICBuLm5hbWUgPSB0OwogICAgbGV0IHIgPSBbXTsKICAgIGZvcihsZXQgYSA9IDA7IGEgPCBuLnRyYWNrcy5sZW5ndGg7ICsrYSl7CiAgICAgICAgbGV0IGwgPSBuLnRyYWNrc1thXSwgYyA9IGwuZ2V0VmFsdWVTaXplKCksIHUgPSBbXSwgZCA9IFtdOwogICAgICAgIGZvcihsZXQgcCA9IDA7IHAgPCBsLnRpbWVzLmxlbmd0aDsgKytwKXsKICAgICAgICAgICAgbGV0IGYgPSBsLnRpbWVzW3BdICogczsKICAgICAgICAgICAgaWYgKCEoZiA8IGUgfHwgZiA+PSBpKSkgewogICAgICAgICAgICAgICAgdS5wdXNoKGwudGltZXNbcF0pOwogICAgICAgICAgICAgICAgZm9yKGxldCBtID0gMDsgbSA8IGM7ICsrbSlkLnB1c2gobC52YWx1ZXNbcCAqIGMgKyBtXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdS5sZW5ndGggIT09IDAgJiYgKGwudGltZXMgPSBWZSh1LCBsLnRpbWVzLmNvbnN0cnVjdG9yKSwgbC52YWx1ZXMgPSBWZShkLCBsLnZhbHVlcy5jb25zdHJ1Y3RvciksIHIucHVzaChsKSk7CiAgICB9CiAgICBuLnRyYWNrcyA9IHI7CiAgICBsZXQgbyA9IDEgLyAwOwogICAgZm9yKGxldCBhID0gMDsgYSA8IG4udHJhY2tzLmxlbmd0aDsgKythKW8gPiBuLnRyYWNrc1thXS50aW1lc1swXSAmJiAobyA9IG4udHJhY2tzW2FdLnRpbWVzWzBdKTsKICAgIGZvcihsZXQgYSA9IDA7IGEgPCBuLnRyYWNrcy5sZW5ndGg7ICsrYSluLnRyYWNrc1thXS5zaGlmdCgtMSAqIG8pOwogICAgcmV0dXJuIG4ucmVzZXREdXJhdGlvbigpLCBuOwp9CmZ1bmN0aW9uIHlkKGgsIHQgPSAwLCBlID0gaCwgaSA9IDMwKSB7CiAgICBpIDw9IDAgJiYgKGkgPSAzMCk7CiAgICBsZXQgcyA9IGUudHJhY2tzLmxlbmd0aCwgbiA9IHQgLyBpOwogICAgZm9yKGxldCByID0gMDsgciA8IHM7ICsrcil7CiAgICAgICAgbGV0IG8gPSBlLnRyYWNrc1tyXSwgYSA9IG8uVmFsdWVUeXBlTmFtZTsKICAgICAgICBpZiAoYSA9PT0gImJvb2wiIHx8IGEgPT09ICJzdHJpbmciKSBjb250aW51ZTsKICAgICAgICBsZXQgbCA9IGgudHJhY2tzLmZpbmQoZnVuY3Rpb24oZykgewogICAgICAgICAgICByZXR1cm4gZy5uYW1lID09PSBvLm5hbWUgJiYgZy5WYWx1ZVR5cGVOYW1lID09PSBhOwogICAgICAgIH0pOwogICAgICAgIGlmIChsID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICAgIGxldCBjID0gMCwgdSA9IG8uZ2V0VmFsdWVTaXplKCk7CiAgICAgICAgby5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSAmJiAoYyA9IHUgLyAzKTsKICAgICAgICBsZXQgZCA9IDAsIHAgPSBsLmdldFZhbHVlU2l6ZSgpOwogICAgICAgIGwuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgJiYgKGQgPSBwIC8gMyk7CiAgICAgICAgbGV0IGYgPSBvLnRpbWVzLmxlbmd0aCAtIDEsIG07CiAgICAgICAgaWYgKG4gPD0gby50aW1lc1swXSkgewogICAgICAgICAgICBsZXQgZyA9IGMsIHgxID0gdSAtIGM7CiAgICAgICAgICAgIG0gPSBvLnZhbHVlcy5zbGljZShnLCB4MSk7CiAgICAgICAgfSBlbHNlIGlmIChuID49IG8udGltZXNbZl0pIHsKICAgICAgICAgICAgbGV0IGcgPSBmICogdSArIGMsIHgxID0gZyArIHUgLSBjOwogICAgICAgICAgICBtID0gby52YWx1ZXMuc2xpY2UoZywgeDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBnID0gby5jcmVhdGVJbnRlcnBvbGFudCgpLCB4MSA9IGMsIGIgPSB1IC0gYzsKICAgICAgICAgICAgZy5ldmFsdWF0ZShuKSwgbSA9IGcucmVzdWx0QnVmZmVyLnNsaWNlKHgxLCBiKTsKICAgICAgICB9CiAgICAgICAgYSA9PT0gInF1YXRlcm5pb24iICYmIG5ldyBidCgpLmZyb21BcnJheShtKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KG0pOwogICAgICAgIGxldCB5MSA9IGwudGltZXMubGVuZ3RoOwogICAgICAgIGZvcihsZXQgZyA9IDA7IGcgPCB5MTsgKytnKXsKICAgICAgICAgICAgbGV0IHgxID0gZyAqIHAgKyBkOwogICAgICAgICAgICBpZiAoYSA9PT0gInF1YXRlcm5pb24iKSBidC5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChsLnZhbHVlcywgeDEsIG0sIDAsIGwudmFsdWVzLCB4MSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IGIgPSBwIC0gZCAqIDI7CiAgICAgICAgICAgICAgICBmb3IobGV0IE0gPSAwOyBNIDwgYjsgKytNKWwudmFsdWVzW3gxICsgTV0gLT0gbVtNXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBoLmJsZW5kTW9kZSA9IENsLCBoOwp9CnZhciBQZiA9IHsKICAgIGNvbnZlcnRBcnJheTogVmUsCiAgICBpc1R5cGVkQXJyYXk6IFBsLAogICAgZ2V0S2V5ZnJhbWVPcmRlcjogT2wsCiAgICBzb3J0ZWRBcnJheTogZm8sCiAgICBmbGF0dGVuSlNPTjogWG8sCiAgICBzdWJjbGlwOiBtZCwKICAgIG1ha2VDbGlwQWRkaXRpdmU6IHlkCn0sIHlpID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcyl7CiAgICAgICAgdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSB0LCB0aGlzLl9jYWNoZWRJbmRleCA9IDAsIHRoaXMucmVzdWx0QnVmZmVyID0gcyAhPT0gdm9pZCAwID8gcyA6IG5ldyBlLmNvbnN0cnVjdG9yKGkpLCB0aGlzLnNhbXBsZVZhbHVlcyA9IGUsIHRoaXMudmFsdWVTaXplID0gaSwgdGhpcy5zZXR0aW5ncyA9IG51bGwsIHRoaXMuRGVmYXVsdFNldHRpbmdzXyA9IHt9OwogICAgfQogICAgZXZhbHVhdGUodCkgewogICAgICAgIGxldCBlID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsIGkgPSB0aGlzLl9jYWNoZWRJbmRleCwgcyA9IGVbaV0sIG4gPSBlW2kgLSAxXTsKICAgICAgICB0OiB7CiAgICAgICAgICAgIGU6IHsKICAgICAgICAgICAgICAgIGxldCByOwogICAgICAgICAgICAgICAgaTogewogICAgICAgICAgICAgICAgICAgIHM6IGlmICghKHQgPCBzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IG8gPSBpICsgMjs7KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8IG4pIGJyZWFrIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSBlLmxlbmd0aCwgdGhpcy5fY2FjaGVkSW5kZXggPSBpLCB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oaSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IG8pIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSBzLCBzID0gZVsrK2ldLCB0IDwgcykgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByID0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKHQgPj0gbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG8gPSBlWzFdOwogICAgICAgICAgICAgICAgICAgICAgICB0IDwgbyAmJiAoaSA9IDIsIG4gPSBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBhID0gaSAtIDI7Oyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PT0gdm9pZCAwKSByZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXggPSAwLCB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gYSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9IG4sIG4gPSBlWy0taSAtIDFdLCB0ID49IG4pIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgciA9IGksIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhayB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKDsgaSA8IHI7KXsKICAgICAgICAgICAgICAgICAgICBsZXQgbyA9IGkgKyByID4+PiAxOwogICAgICAgICAgICAgICAgICAgIHQgPCBlW29dID8gciA9IG8gOiBpID0gbyArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocyA9IGVbaV0sIG4gPSBlW2kgLSAxXSwgbiA9PT0gdm9pZCAwKSByZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXggPSAwLCB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7CiAgICAgICAgICAgICAgICBpZiAocyA9PT0gdm9pZCAwKSByZXR1cm4gaSA9IGUubGVuZ3RoLCB0aGlzLl9jYWNoZWRJbmRleCA9IGksIHRoaXMuY29weVNhbXBsZVZhbHVlXyhpIC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2FjaGVkSW5kZXggPSBpLCB0aGlzLmludGVydmFsQ2hhbmdlZF8oaSwgbiwgcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlXyhpLCBuLCB0LCBzKTsKICAgIH0KICAgIGdldFNldHRpbmdzXygpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187CiAgICB9CiAgICBjb3B5U2FtcGxlVmFsdWVfKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMucmVzdWx0QnVmZmVyLCBpID0gdGhpcy5zYW1wbGVWYWx1ZXMsIHMgPSB0aGlzLnZhbHVlU2l6ZSwgbiA9IHQgKiBzOwogICAgICAgIGZvcihsZXQgciA9IDA7IHIgIT09IHM7ICsrcillW3JdID0gaVtuICsgcl07CiAgICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBpbnRlcnBvbGF0ZV8oKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpOwogICAgfQogICAgaW50ZXJ2YWxDaGFuZ2VkXygpIHt9Cn0sIG1vID0gY2xhc3MgZXh0ZW5kcyB5aSB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzKXsKICAgICAgICBzdXBlcih0LCBlLCBpLCBzKSwgdGhpcy5fd2VpZ2h0UHJldiA9IC0wLCB0aGlzLl9vZmZzZXRQcmV2ID0gLTAsIHRoaXMuX3dlaWdodE5leHQgPSAtMCwgdGhpcy5fb2Zmc2V0TmV4dCA9IC0wLCB0aGlzLkRlZmF1bHRTZXR0aW5nc18gPSB7CiAgICAgICAgICAgIGVuZGluZ1N0YXJ0OiBoaSwKICAgICAgICAgICAgZW5kaW5nRW5kOiBoaQogICAgICAgIH07CiAgICB9CiAgICBpbnRlcnZhbENoYW5nZWRfKHQsIGUsIGkpIHsKICAgICAgICBsZXQgcyA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLCBuID0gdCAtIDIsIHIgPSB0ICsgMSwgbyA9IHNbbl0sIGEgPSBzW3JdOwogICAgICAgIGlmIChvID09PSB2b2lkIDApIHN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXsKICAgICAgICAgICAgY2FzZSBsaToKICAgICAgICAgICAgICAgIG4gPSB0LCBvID0gMiAqIGUgLSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgWHM6CiAgICAgICAgICAgICAgICBuID0gcy5sZW5ndGggLSAyLCBvID0gZSArIHNbbl0gLSBzW24gKyAxXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbiA9IHQsIG8gPSBpOwogICAgICAgIH0KICAgICAgICBpZiAoYSA9PT0gdm9pZCAwKSBzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpewogICAgICAgICAgICBjYXNlIGxpOgogICAgICAgICAgICAgICAgciA9IHQsIGEgPSAyICogaSAtIGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBYczoKICAgICAgICAgICAgICAgIHIgPSAxLCBhID0gaSArIHNbMV0gLSBzWzBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByID0gdCAtIDEsIGEgPSBlOwogICAgICAgIH0KICAgICAgICBsZXQgbCA9IChpIC0gZSkgKiAuNSwgYyA9IHRoaXMudmFsdWVTaXplOwogICAgICAgIHRoaXMuX3dlaWdodFByZXYgPSBsIC8gKGUgLSBvKSwgdGhpcy5fd2VpZ2h0TmV4dCA9IGwgLyAoYSAtIGkpLCB0aGlzLl9vZmZzZXRQcmV2ID0gbiAqIGMsIHRoaXMuX29mZnNldE5leHQgPSByICogYzsKICAgIH0KICAgIGludGVycG9sYXRlXyh0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSB0aGlzLnJlc3VsdEJ1ZmZlciwgciA9IHRoaXMuc2FtcGxlVmFsdWVzLCBvID0gdGhpcy52YWx1ZVNpemUsIGEgPSB0ICogbywgbCA9IGEgLSBvLCBjID0gdGhpcy5fb2Zmc2V0UHJldiwgdSA9IHRoaXMuX29mZnNldE5leHQsIGQgPSB0aGlzLl93ZWlnaHRQcmV2LCBwID0gdGhpcy5fd2VpZ2h0TmV4dCwgZiA9IChpIC0gZSkgLyAocyAtIGUpLCBtID0gZiAqIGYsIHkxID0gbSAqIGYsIGcgPSAtZCAqIHkxICsgMiAqIGQgKiBtIC0gZCAqIGYsIHgxID0gKDEgKyBkKSAqIHkxICsgKC0xLjUgLSAyICogZCkgKiBtICsgKC0uNSArIGQpICogZiArIDEsIGIgPSAoLTEgLSBwKSAqIHkxICsgKDEuNSArIHApICogbSArIC41ICogZiwgTSA9IHAgKiB5MSAtIHAgKiBtOwogICAgICAgIGZvcihsZXQgXyA9IDA7IF8gIT09IG87ICsrXyluW19dID0gZyAqIHJbYyArIF9dICsgeDEgKiByW2wgKyBfXSArIGIgKiByW2EgKyBfXSArIE0gKiByW3UgKyBfXTsKICAgICAgICByZXR1cm4gbjsKICAgIH0KfSwgZ24gPSBjbGFzcyBleHRlbmRzIHlpIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGksIHMpewogICAgICAgIHN1cGVyKHQsIGUsIGksIHMpOwogICAgfQogICAgaW50ZXJwb2xhdGVfKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHRoaXMucmVzdWx0QnVmZmVyLCByID0gdGhpcy5zYW1wbGVWYWx1ZXMsIG8gPSB0aGlzLnZhbHVlU2l6ZSwgYSA9IHQgKiBvLCBsID0gYSAtIG8sIGMgPSAoaSAtIGUpIC8gKHMgLSBlKSwgdSA9IDEgLSBjOwogICAgICAgIGZvcihsZXQgZCA9IDA7IGQgIT09IG87ICsrZCluW2RdID0gcltsICsgZF0gKiB1ICsgclthICsgZF0gKiBjOwogICAgICAgIHJldHVybiBuOwogICAgfQp9LCB5byA9IGNsYXNzIGV4dGVuZHMgeWkgewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcyl7CiAgICAgICAgc3VwZXIodCwgZSwgaSwgcyk7CiAgICB9CiAgICBpbnRlcnBvbGF0ZV8odCkgewogICAgICAgIHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8odCAtIDEpOwogICAgfQp9LCBrdCA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGksIHMpewogICAgICAgIGlmICh0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKICAgICAgICBpZiAoZSA9PT0gdm9pZCAwIHx8IGUubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiICsgdCk7CiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy50aW1lcyA9IFZlKGUsIHRoaXMuVGltZUJ1ZmZlclR5cGUpLCB0aGlzLnZhbHVlcyA9IFZlKGksIHRoaXMuVmFsdWVCdWZmZXJUeXBlKSwgdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHMgfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbik7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHQuY29uc3RydWN0b3IsIGk7CiAgICAgICAgaWYgKGUudG9KU09OICE9PSB0aGlzLnRvSlNPTikgaSA9IGUudG9KU09OKHQpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpID0gewogICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLAogICAgICAgICAgICAgICAgdGltZXM6IFZlKHQudGltZXMsIEFycmF5KSwKICAgICAgICAgICAgICAgIHZhbHVlczogVmUodC52YWx1ZXMsIEFycmF5KQogICAgICAgICAgICB9OwogICAgICAgICAgICBsZXQgcyA9IHQuZ2V0SW50ZXJwb2xhdGlvbigpOwogICAgICAgICAgICBzICE9PSB0LkRlZmF1bHRJbnRlcnBvbGF0aW9uICYmIChpLmludGVycG9sYXRpb24gPSBzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkudHlwZSA9IHQuVmFsdWVUeXBlTmFtZSwgaTsKICAgIH0KICAgIEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKHQpIHsKICAgICAgICByZXR1cm4gbmV3IHlvKHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCB0KTsKICAgIH0KICAgIEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBnbih0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgdCk7CiAgICB9CiAgICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCkgewogICAgICAgIHJldHVybiBuZXcgbW8odGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHQpOwogICAgfQogICAgc2V0SW50ZXJwb2xhdGlvbih0KSB7CiAgICAgICAgbGV0IGU7CiAgICAgICAgc3dpdGNoKHQpewogICAgICAgICAgICBjYXNlIEdzOgogICAgICAgICAgICAgICAgZSA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBtcjoKICAgICAgICAgICAgICAgIGUgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHpuOgogICAgICAgICAgICAgICAgZSA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IGkgPSAidW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIiArIHRoaXMuVmFsdWVUeXBlTmFtZSArICIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIiArIHRoaXMubmFtZTsKICAgICAgICAgICAgaWYgKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHZvaWQgMCkgaWYgKHQgIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pIHRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTsKICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoaSk7CiAgICAgICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IiwgaSksIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZSwgdGhpczsKICAgIH0KICAgIGdldEludGVycG9sYXRpb24oKSB7CiAgICAgICAgc3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpewogICAgICAgICAgICBjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6CiAgICAgICAgICAgICAgICByZXR1cm4gR3M7CiAgICAgICAgICAgIGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6CiAgICAgICAgICAgICAgICByZXR1cm4gbXI7CiAgICAgICAgICAgIGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6CiAgICAgICAgICAgICAgICByZXR1cm4gem47CiAgICAgICAgfQogICAgfQogICAgZ2V0VmFsdWVTaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDsKICAgIH0KICAgIHNoaWZ0KHQpIHsKICAgICAgICBpZiAodCAhPT0gMCkgewogICAgICAgICAgICBsZXQgZSA9IHRoaXMudGltZXM7CiAgICAgICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSBlLmxlbmd0aDsgaSAhPT0gczsgKytpKWVbaV0gKz0gdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzY2FsZSh0KSB7CiAgICAgICAgaWYgKHQgIT09IDEpIHsKICAgICAgICAgICAgbGV0IGUgPSB0aGlzLnRpbWVzOwogICAgICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgIT09IHM7ICsraSllW2ldICo9IHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdHJpbSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLnRpbWVzLCBzID0gaS5sZW5ndGgsIG4gPSAwLCByID0gcyAtIDE7CiAgICAgICAgZm9yKDsgbiAhPT0gcyAmJiBpW25dIDwgdDspKytuOwogICAgICAgIGZvcig7IHIgIT09IC0xICYmIGlbcl0gPiBlOyktLXI7CiAgICAgICAgaWYgKCsrciwgbiAhPT0gMCB8fCByICE9PSBzKSB7CiAgICAgICAgICAgIG4gPj0gciAmJiAociA9IE1hdGgubWF4KHIsIDEpLCBuID0gciAtIDEpOwogICAgICAgICAgICBsZXQgbyA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7CiAgICAgICAgICAgIHRoaXMudGltZXMgPSBpLnNsaWNlKG4sIHIpLCB0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzLnNsaWNlKG4gKiBvLCByICogbyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdmFsaWRhdGUoKSB7CiAgICAgICAgbGV0IHQgPSAhMCwgZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7CiAgICAgICAgZSAtIE1hdGguZmxvb3IoZSkgIT09IDAgJiYgKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLCB0aGlzKSwgdCA9ICExKTsKICAgICAgICBsZXQgaSA9IHRoaXMudGltZXMsIHMgPSB0aGlzLnZhbHVlcywgbiA9IGkubGVuZ3RoOwogICAgICAgIG4gPT09IDAgJiYgKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsIHRoaXMpLCB0ID0gITEpOwogICAgICAgIGxldCByID0gbnVsbDsKICAgICAgICBmb3IobGV0IG8gPSAwOyBvICE9PSBuOyBvKyspewogICAgICAgICAgICBsZXQgYSA9IGlbb107CiAgICAgICAgICAgIGlmICh0eXBlb2YgYSA9PSAibnVtYmVyIiAmJiBpc05hTihhKSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwgdGhpcywgbywgYSksIHQgPSAhMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyICE9PSBudWxsICYmIHIgPiBhKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLCB0aGlzLCBvLCBhLCByKSwgdCA9ICExOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgciA9IGE7CiAgICAgICAgfQogICAgICAgIGlmIChzICE9PSB2b2lkIDAgJiYgUGwocykpIGZvcihsZXQgbyA9IDAsIGEgPSBzLmxlbmd0aDsgbyAhPT0gYTsgKytvKXsKICAgICAgICAgICAgbGV0IGwgPSBzW29dOwogICAgICAgICAgICBpZiAoaXNOYU4obCkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLCB0aGlzLCBvLCBsKSwgdCA9ICExOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICBvcHRpbWl6ZSgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMudGltZXMuc2xpY2UoKSwgZSA9IHRoaXMudmFsdWVzLnNsaWNlKCksIGkgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLCBzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IHpuLCBuID0gdC5sZW5ndGggLSAxLCByID0gMTsKICAgICAgICBmb3IobGV0IG8gPSAxOyBvIDwgbjsgKytvKXsKICAgICAgICAgICAgbGV0IGEgPSAhMSwgbCA9IHRbb10sIGMgPSB0W28gKyAxXTsKICAgICAgICAgICAgaWYgKGwgIT09IGMgJiYgKG8gIT09IDEgfHwgbCAhPT0gdFswXSkpIGlmIChzKSBhID0gITA7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IHUgPSBvICogaSwgZCA9IHUgLSBpLCBwID0gdSArIGk7CiAgICAgICAgICAgICAgICBmb3IobGV0IGYgPSAwOyBmICE9PSBpOyArK2YpewogICAgICAgICAgICAgICAgICAgIGxldCBtID0gZVt1ICsgZl07CiAgICAgICAgICAgICAgICAgICAgaWYgKG0gIT09IGVbZCArIGZdIHx8IG0gIT09IGVbcCArIGZdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICBpZiAobyAhPT0gcikgewogICAgICAgICAgICAgICAgICAgIHRbcl0gPSB0W29dOwogICAgICAgICAgICAgICAgICAgIGxldCB1ID0gbyAqIGksIGQgPSByICogaTsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHAgPSAwOyBwICE9PSBpOyArK3ApZVtkICsgcF0gPSBlW3UgKyBwXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICsrcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobiA+IDApIHsKICAgICAgICAgICAgdFtyXSA9IHRbbl07CiAgICAgICAgICAgIGZvcihsZXQgbyA9IG4gKiBpLCBhID0gciAqIGksIGwgPSAwOyBsICE9PSBpOyArK2wpZVthICsgbF0gPSBlW28gKyBsXTsKICAgICAgICAgICAgKytyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gciAhPT0gdC5sZW5ndGggPyAodGhpcy50aW1lcyA9IHQuc2xpY2UoMCwgciksIHRoaXMudmFsdWVzID0gZS5zbGljZSgwLCByICogaSkpIDogKHRoaXMudGltZXMgPSB0LCB0aGlzLnZhbHVlcyA9IGUpLCB0aGlzOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLnRpbWVzLnNsaWNlKCksIGUgPSB0aGlzLnZhbHVlcy5zbGljZSgpLCBpID0gdGhpcy5jb25zdHJ1Y3RvciwgcyA9IG5ldyBpKHRoaXMubmFtZSwgdCwgZSk7CiAgICAgICAgcmV0dXJuIHMuY3JlYXRlSW50ZXJwb2xhbnQgPSB0aGlzLmNyZWF0ZUludGVycG9sYW50LCBzOwogICAgfQp9OwprdC5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7Cmt0LnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7Cmt0LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IG1yOwp2YXIgdmUgPSBjbGFzcyBleHRlbmRzIGt0IHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKHQsIGUsIGkpOwogICAgfQp9Owp2ZS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICJib29sIjsKdmUucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZSA9IEFycmF5Owp2ZS5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBHczsKdmUucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciA9IHZvaWQgMDsKdmUucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHZvaWQgMDsKdmFyIHhuID0gY2xhc3MgZXh0ZW5kcyBrdCB7Cn07CnhuLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gImNvbG9yIjsKdmFyIGdpID0gY2xhc3MgZXh0ZW5kcyBrdCB7Cn07CmdpLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gIm51bWJlciI7CnZhciBnbyA9IGNsYXNzIGV4dGVuZHMgeWkgewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcyl7CiAgICAgICAgc3VwZXIodCwgZSwgaSwgcyk7CiAgICB9CiAgICBpbnRlcnBvbGF0ZV8odCwgZSwgaSwgcykgewogICAgICAgIGxldCBuID0gdGhpcy5yZXN1bHRCdWZmZXIsIHIgPSB0aGlzLnNhbXBsZVZhbHVlcywgbyA9IHRoaXMudmFsdWVTaXplLCBhID0gKGkgLSBlKSAvIChzIC0gZSksIGwgPSB0ICogbzsKICAgICAgICBmb3IobGV0IGMgPSBsICsgbzsgbCAhPT0gYzsgbCArPSA0KWJ0LnNsZXJwRmxhdChuLCAwLCByLCBsIC0gbywgciwgbCwgYSk7CiAgICAgICAgcmV0dXJuIG47CiAgICB9Cn0sIHhpID0gY2xhc3MgZXh0ZW5kcyBrdCB7CiAgICBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIodCkgewogICAgICAgIHJldHVybiBuZXcgZ28odGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHQpOwogICAgfQp9Owp4aS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICJxdWF0ZXJuaW9uIjsKeGkucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHZvaWQgMDsKdmFyIEFlID0gY2xhc3MgZXh0ZW5kcyBrdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpKXsKICAgICAgICBzdXBlcih0LCBlLCBpKTsKICAgIH0KfTsKQWUucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAic3RyaW5nIjsKQWUucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZSA9IEFycmF5OwpBZS5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBHczsKQWUucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciA9IHZvaWQgMDsKQWUucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHZvaWQgMDsKdmFyIGJpID0gY2xhc3MgZXh0ZW5kcyBrdCB7Cn07CmJpLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gInZlY3RvciI7CnZhciB3aSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAiIiwgZSA9IC0xLCBpID0gW10sIHMgPSBIbyl7CiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy50cmFja3MgPSBpLCB0aGlzLmR1cmF0aW9uID0gZSwgdGhpcy5ibGVuZE1vZGUgPSBzLCB0aGlzLnV1aWQgPSBJdCgpLCB0aGlzLmR1cmF0aW9uIDwgMCAmJiB0aGlzLnJlc2V0RHVyYXRpb24oKTsKICAgIH0KICAgIHN0YXRpYyBwYXJzZSh0KSB7CiAgICAgICAgbGV0IGUgPSBbXSwgaSA9IHQudHJhY2tzLCBzID0gMSAvICh0LmZwcyB8fCAxKTsKICAgICAgICBmb3IobGV0IHIgPSAwLCBvID0gaS5sZW5ndGg7IHIgIT09IG87ICsrcillLnB1c2goeGQoaVtyXSkuc2NhbGUocykpOwogICAgICAgIGxldCBuID0gbmV3IHRoaXModC5uYW1lLCB0LmR1cmF0aW9uLCBlLCB0LmJsZW5kTW9kZSk7CiAgICAgICAgcmV0dXJuIG4udXVpZCA9IHQudXVpZCwgbjsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04odCkgewogICAgICAgIGxldCBlID0gW10sIGkgPSB0LnRyYWNrcywgcyA9IHsKICAgICAgICAgICAgbmFtZTogdC5uYW1lLAogICAgICAgICAgICBkdXJhdGlvbjogdC5kdXJhdGlvbiwKICAgICAgICAgICAgdHJhY2tzOiBlLAogICAgICAgICAgICB1dWlkOiB0LnV1aWQsCiAgICAgICAgICAgIGJsZW5kTW9kZTogdC5ibGVuZE1vZGUKICAgICAgICB9OwogICAgICAgIGZvcihsZXQgbiA9IDAsIHIgPSBpLmxlbmd0aDsgbiAhPT0gcjsgKytuKWUucHVzaChrdC50b0pTT04oaVtuXSkpOwogICAgICAgIHJldHVybiBzOwogICAgfQogICAgc3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IGUubGVuZ3RoLCByID0gW107CiAgICAgICAgZm9yKGxldCBvID0gMDsgbyA8IG47IG8rKyl7CiAgICAgICAgICAgIGxldCBhID0gW10sIGwgPSBbXTsKICAgICAgICAgICAgYS5wdXNoKChvICsgbiAtIDEpICUgbiwgbywgKG8gKyAxKSAlIG4pLCBsLnB1c2goMCwgMSwgMCk7CiAgICAgICAgICAgIGxldCBjID0gT2woYSk7CiAgICAgICAgICAgIGEgPSBmbyhhLCAxLCBjKSwgbCA9IGZvKGwsIDEsIGMpLCAhcyAmJiBhWzBdID09PSAwICYmIChhLnB1c2gobiksIGwucHVzaChsWzBdKSksIHIucHVzaChuZXcgZ2koIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIiArIGVbb10ubmFtZSArICJdIiwgYSwgbCkuc2NhbGUoMSAvIGkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHQsIC0xLCByKTsKICAgIH0KICAgIHN0YXRpYyBmaW5kQnlOYW1lKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHQ7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQpKSB7CiAgICAgICAgICAgIGxldCBzID0gdDsKICAgICAgICAgICAgaSA9IHMuZ2VvbWV0cnkgJiYgcy5nZW9tZXRyeS5hbmltYXRpb25zIHx8IHMuYW5pbWF0aW9uczsKICAgICAgICB9CiAgICAgICAgZm9yKGxldCBzID0gMDsgcyA8IGkubGVuZ3RoOyBzKyspaWYgKGlbc10ubmFtZSA9PT0gZSkgcmV0dXJuIGlbc107CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBzdGF0aWMgQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXModCwgZSwgaSkgewogICAgICAgIGxldCBzID0ge30sIG4gPSAvXihbXHctXSo/KShbXGRdKykkLzsKICAgICAgICBmb3IobGV0IG8gPSAwLCBhID0gdC5sZW5ndGg7IG8gPCBhOyBvKyspewogICAgICAgICAgICBsZXQgbCA9IHRbb10sIGMgPSBsLm5hbWUubWF0Y2gobik7CiAgICAgICAgICAgIGlmIChjICYmIGMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgbGV0IHUgPSBjWzFdLCBkID0gc1t1XTsKICAgICAgICAgICAgICAgIGQgfHwgKHNbdV0gPSBkID0gW10pLCBkLnB1c2gobCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHIgPSBbXTsKICAgICAgICBmb3IobGV0IG8gaW4gcylyLnB1c2godGhpcy5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShvLCBzW29dLCBlLCBpKSk7CiAgICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBzdGF0aWMgcGFyc2VBbmltYXRpb24odCwgZSkgewogICAgICAgIGlmICghdCkgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuIiksIG51bGw7CiAgICAgICAgbGV0IGkgPSBmdW5jdGlvbih1LCBkLCBwLCBmLCBtKSB7CiAgICAgICAgICAgIGlmIChwLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICAgICAgbGV0IHkxID0gW10sIGcgPSBbXTsKICAgICAgICAgICAgICAgIFhvKHAsIHkxLCBnLCBmKSwgeTEubGVuZ3RoICE9PSAwICYmIG0ucHVzaChuZXcgdShkLCB5MSwgZykpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgcyA9IFtdLCBuID0gdC5uYW1lIHx8ICJkZWZhdWx0IiwgciA9IHQuZnBzIHx8IDMwLCBvID0gdC5ibGVuZE1vZGUsIGEgPSB0Lmxlbmd0aCB8fCAtMSwgbCA9IHQuaGllcmFyY2h5IHx8IFtdOwogICAgICAgIGZvcihsZXQgdSA9IDA7IHUgPCBsLmxlbmd0aDsgdSsrKXsKICAgICAgICAgICAgbGV0IGQgPSBsW3VdLmtleXM7CiAgICAgICAgICAgIGlmICghKCFkIHx8IGQubGVuZ3RoID09PSAwKSkgaWYgKGRbMF0ubW9ycGhUYXJnZXRzKSB7CiAgICAgICAgICAgICAgICBsZXQgcCA9IHt9LCBmOwogICAgICAgICAgICAgICAgZm9yKGYgPSAwOyBmIDwgZC5sZW5ndGg7IGYrKylpZiAoZFtmXS5tb3JwaFRhcmdldHMpIGZvcihsZXQgbSA9IDA7IG0gPCBkW2ZdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0rKylwW2RbZl0ubW9ycGhUYXJnZXRzW21dXSA9IC0xOwogICAgICAgICAgICAgICAgZm9yKGxldCBtIGluIHApewogICAgICAgICAgICAgICAgICAgIGxldCB5MSA9IFtdLCBnID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB4MSA9IDA7IHgxICE9PSBkW2ZdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsreDEpewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYiA9IGRbZl07CiAgICAgICAgICAgICAgICAgICAgICAgIHkxLnB1c2goYi50aW1lKSwgZy5wdXNoKGIubW9ycGhUYXJnZXQgPT09IG0gPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHMucHVzaChuZXcgZ2koIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiICsgbSArICJdIiwgeTEsIGcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEgPSBwLmxlbmd0aCAqIHI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZXQgcCA9ICIuYm9uZXNbIiArIGVbdV0ubmFtZSArICJdIjsKICAgICAgICAgICAgICAgIGkoYmksIHAgKyAiLnBvc2l0aW9uIiwgZCwgInBvcyIsIHMpLCBpKHhpLCBwICsgIi5xdWF0ZXJuaW9uIiwgZCwgInJvdCIsIHMpLCBpKGJpLCBwICsgIi5zY2FsZSIsIGQsICJzY2wiLCBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcy5sZW5ndGggPT09IDAgPyBudWxsIDogbmV3IHRoaXMobiwgYSwgcywgbyk7CiAgICB9CiAgICByZXNldER1cmF0aW9uKCkgewogICAgICAgIGxldCB0ID0gdGhpcy50cmFja3MsIGUgPSAwOwogICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSB0Lmxlbmd0aDsgaSAhPT0gczsgKytpKXsKICAgICAgICAgICAgbGV0IG4gPSB0aGlzLnRyYWNrc1tpXTsKICAgICAgICAgICAgZSA9IE1hdGgubWF4KGUsIG4udGltZXNbbi50aW1lcy5sZW5ndGggLSAxXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uID0gZSwgdGhpczsKICAgIH0KICAgIHRyaW0oKSB7CiAgICAgICAgZm9yKGxldCB0ID0gMDsgdCA8IHRoaXMudHJhY2tzLmxlbmd0aDsgdCsrKXRoaXMudHJhY2tzW3RdLnRyaW0oMCwgdGhpcy5kdXJhdGlvbik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB2YWxpZGF0ZSgpIHsKICAgICAgICBsZXQgdCA9ICEwOwogICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGUrKyl0ID0gdCAmJiB0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpOwogICAgICAgIHJldHVybiB0OwogICAgfQogICAgb3B0aW1pemUoKSB7CiAgICAgICAgZm9yKGxldCB0ID0gMDsgdCA8IHRoaXMudHJhY2tzLmxlbmd0aDsgdCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICBsZXQgdCA9IFtdOwogICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGUrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSwgdGhpcy5kdXJhdGlvbiwgdCwgdGhpcy5ibGVuZE1vZGUpOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKTsKICAgIH0KfTsKZnVuY3Rpb24gZ2QoaCkgewogICAgc3dpdGNoKGgudG9Mb3dlckNhc2UoKSl7CiAgICAgICAgY2FzZSAic2NhbGFyIjoKICAgICAgICBjYXNlICJkb3VibGUiOgogICAgICAgIGNhc2UgImZsb2F0IjoKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgIGNhc2UgImludGVnZXIiOgogICAgICAgICAgICByZXR1cm4gZ2k7CiAgICAgICAgY2FzZSAidmVjdG9yIjoKICAgICAgICBjYXNlICJ2ZWN0b3IyIjoKICAgICAgICBjYXNlICJ2ZWN0b3IzIjoKICAgICAgICBjYXNlICJ2ZWN0b3I0IjoKICAgICAgICAgICAgcmV0dXJuIGJpOwogICAgICAgIGNhc2UgImNvbG9yIjoKICAgICAgICAgICAgcmV0dXJuIHhuOwogICAgICAgIGNhc2UgInF1YXRlcm5pb24iOgogICAgICAgICAgICByZXR1cm4geGk7CiAgICAgICAgY2FzZSAiYm9vbCI6CiAgICAgICAgY2FzZSAiYm9vbGVhbiI6CiAgICAgICAgICAgIHJldHVybiB2ZTsKICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICByZXR1cm4gQWU7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFVuc3VwcG9ydGVkIHR5cGVOYW1lOiAiICsgaCk7Cn0KZnVuY3Rpb24geGQoaCkgewogICAgaWYgKGgudHlwZSA9PT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7CiAgICBsZXQgdCA9IGdkKGgudHlwZSk7CiAgICBpZiAoaC50aW1lcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgbGV0IGUgPSBbXSwgaSA9IFtdOwogICAgICAgIFhvKGgua2V5cywgZSwgaSwgInZhbHVlIiksIGgudGltZXMgPSBlLCBoLnZhbHVlcyA9IGk7CiAgICB9CiAgICByZXR1cm4gdC5wYXJzZSAhPT0gdm9pZCAwID8gdC5wYXJzZShoKSA6IG5ldyB0KGgubmFtZSwgaC50aW1lcywgaC52YWx1ZXMsIGguaW50ZXJwb2xhdGlvbik7Cn0KdmFyIHdlID0gewogICAgZW5hYmxlZDogITEsCiAgICBmaWxlczoge30sCiAgICBhZGQ6IGZ1bmN0aW9uKGgsIHQpIHsKICAgICAgICB0aGlzLmVuYWJsZWQgIT09ICExICYmICh0aGlzLmZpbGVzW2hdID0gdCk7CiAgICB9LAogICAgZ2V0OiBmdW5jdGlvbihoKSB7CiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZCAhPT0gITEpIHJldHVybiB0aGlzLmZpbGVzW2hdOwogICAgfSwKICAgIHJlbW92ZTogZnVuY3Rpb24oaCkgewogICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2hdOwogICAgfSwKICAgIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmZpbGVzID0ge307CiAgICB9Cn0sIGJuID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgbGV0IHMgPSB0aGlzLCBuID0gITEsIHIgPSAwLCBvID0gMCwgYSwgbCA9IFtdOwogICAgICAgIHRoaXMub25TdGFydCA9IHZvaWQgMCwgdGhpcy5vbkxvYWQgPSB0LCB0aGlzLm9uUHJvZ3Jlc3MgPSBlLCB0aGlzLm9uRXJyb3IgPSBpLCB0aGlzLml0ZW1TdGFydCA9IGZ1bmN0aW9uKGMpIHsKICAgICAgICAgICAgbysrLCBuID09PSAhMSAmJiBzLm9uU3RhcnQgIT09IHZvaWQgMCAmJiBzLm9uU3RhcnQoYywgciwgbyksIG4gPSAhMDsKICAgICAgICB9LCB0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgICAgIHIrKywgcy5vblByb2dyZXNzICE9PSB2b2lkIDAgJiYgcy5vblByb2dyZXNzKGMsIHIsIG8pLCByID09PSBvICYmIChuID0gITEsIHMub25Mb2FkICE9PSB2b2lkIDAgJiYgcy5vbkxvYWQoKSk7CiAgICAgICAgfSwgdGhpcy5pdGVtRXJyb3IgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgICAgIHMub25FcnJvciAhPT0gdm9pZCAwICYmIHMub25FcnJvcihjKTsKICAgICAgICB9LCB0aGlzLnJlc29sdmVVUkwgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgICAgIHJldHVybiBhID8gYShjKSA6IGM7CiAgICAgICAgfSwgdGhpcy5zZXRVUkxNb2RpZmllciA9IGZ1bmN0aW9uKGMpIHsKICAgICAgICAgICAgcmV0dXJuIGEgPSBjLCB0aGlzOwogICAgICAgIH0sIHRoaXMuYWRkSGFuZGxlciA9IGZ1bmN0aW9uKGMsIHUpIHsKICAgICAgICAgICAgcmV0dXJuIGwucHVzaChjLCB1KSwgdGhpczsKICAgICAgICB9LCB0aGlzLnJlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgICAgIGxldCB1ID0gbC5pbmRleE9mKGMpOwogICAgICAgICAgICByZXR1cm4gdSAhPT0gLTEgJiYgbC5zcGxpY2UodSwgMiksIHRoaXM7CiAgICAgICAgfSwgdGhpcy5nZXRIYW5kbGVyID0gZnVuY3Rpb24oYykgewogICAgICAgICAgICBmb3IobGV0IHUgPSAwLCBkID0gbC5sZW5ndGg7IHUgPCBkOyB1ICs9IDIpewogICAgICAgICAgICAgICAgbGV0IHAgPSBsW3VdLCBmID0gbFt1ICsgMV07CiAgICAgICAgICAgICAgICBpZiAocC5nbG9iYWwgJiYgKHAubGFzdEluZGV4ID0gMCksIHAudGVzdChjKSkgcmV0dXJuIGY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKICAgIH0KfSwgYmQgPSBuZXcgYm4sIHd0ID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgdGhpcy5tYW5hZ2VyID0gdCAhPT0gdm9pZCAwID8gdCA6IGJkLCB0aGlzLmNyb3NzT3JpZ2luID0gImFub255bW91cyIsIHRoaXMud2l0aENyZWRlbnRpYWxzID0gITEsIHRoaXMucGF0aCA9ICIiLCB0aGlzLnJlc291cmNlUGF0aCA9ICIiLCB0aGlzLnJlcXVlc3RIZWFkZXIgPSB7fTsKICAgIH0KICAgIGxvYWQoKSB7fQogICAgbG9hZEFzeW5jKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsIG4pIHsKICAgICAgICAgICAgaS5sb2FkKHQsIHMsIGUsIG4pOwogICAgICAgIH0pOwogICAgfQogICAgcGFyc2UoKSB7fQogICAgc2V0Q3Jvc3NPcmlnaW4odCkgewogICAgICAgIHJldHVybiB0aGlzLmNyb3NzT3JpZ2luID0gdCwgdGhpczsKICAgIH0KICAgIHNldFdpdGhDcmVkZW50aWFscyh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMud2l0aENyZWRlbnRpYWxzID0gdCwgdGhpczsKICAgIH0KICAgIHNldFBhdGgodCkgewogICAgICAgIHJldHVybiB0aGlzLnBhdGggPSB0LCB0aGlzOwogICAgfQogICAgc2V0UmVzb3VyY2VQYXRoKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVBhdGggPSB0LCB0aGlzOwogICAgfQogICAgc2V0UmVxdWVzdEhlYWRlcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlciA9IHQsIHRoaXM7CiAgICB9Cn07Cnd0LkRFRkFVTFRfTUFURVJJQUxfTkFNRSA9ICJfX0RFRkFVTFQiOwp2YXIgc2UgPSB7fSwgeG8gPSBjbGFzcyBleHRlbmRzIEVycm9yIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUpewogICAgICAgIHN1cGVyKHQpLCB0aGlzLnJlc3BvbnNlID0gZTsKICAgIH0KfSwgSnQgPSBjbGFzcyBleHRlbmRzIHd0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKHQpOwogICAgfQogICAgbG9hZCh0LCBlLCBpLCBzKSB7CiAgICAgICAgdCA9PT0gdm9pZCAwICYmICh0ID0gIiIpLCB0aGlzLnBhdGggIT09IHZvaWQgMCAmJiAodCA9IHRoaXMucGF0aCArIHQpLCB0ID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7CiAgICAgICAgbGV0IG4gPSB3ZS5nZXQodCk7CiAgICAgICAgaWYgKG4gIT09IHZvaWQgMCkgcmV0dXJuIHRoaXMubWFuYWdlci5pdGVtU3RhcnQodCksIHNldFRpbWVvdXQoKCk9PnsKICAgICAgICAgICAgZSAmJiBlKG4pLCB0aGlzLm1hbmFnZXIuaXRlbUVuZCh0KTsKICAgICAgICB9LCAwKSwgbjsKICAgICAgICBpZiAoc2VbdF0gIT09IHZvaWQgMCkgewogICAgICAgICAgICBzZVt0XS5wdXNoKHsKICAgICAgICAgICAgICAgIG9uTG9hZDogZSwKICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IGksCiAgICAgICAgICAgICAgICBvbkVycm9yOiBzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlW3RdID0gW10sIHNlW3RdLnB1c2goewogICAgICAgICAgICBvbkxvYWQ6IGUsCiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IGksCiAgICAgICAgICAgIG9uRXJyb3I6IHMKICAgICAgICB9KTsKICAgICAgICBsZXQgciA9IG5ldyBSZXF1ZXN0KHQsIHsKICAgICAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSwKICAgICAgICAgICAgY3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzID8gImluY2x1ZGUiIDogInNhbWUtb3JpZ2luIgogICAgICAgIH0pLCBvID0gdGhpcy5taW1lVHlwZSwgYSA9IHRoaXMucmVzcG9uc2VUeXBlOwogICAgICAgIGZldGNoKHIpLnRoZW4oKGwpPT57CiAgICAgICAgICAgIGlmIChsLnN0YXR1cyA9PT0gMjAwIHx8IGwuc3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAobC5zdGF0dXMgPT09IDAgJiYgY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLCB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPiAidSIgfHwgbC5ib2R5ID09PSB2b2lkIDAgfHwgbC5ib2R5LmdldFJlYWRlciA9PT0gdm9pZCAwKSByZXR1cm4gbDsKICAgICAgICAgICAgICAgIGxldCBjID0gc2VbdF0sIHUgPSBsLmJvZHkuZ2V0UmVhZGVyKCksIGQgPSBsLmhlYWRlcnMuZ2V0KCJYLUZpbGUtU2l6ZSIpIHx8IGwuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIiksIHAgPSBkID8gcGFyc2VJbnQoZCkgOiAwLCBmID0gcCAhPT0gMCwgbSA9IDAsIHkxID0gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgICAgICAgICAgICAgICBzdGFydCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICB4MSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4MSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucmVhZCgpLnRoZW4oKHsgZG9uZTogYiAsIHZhbHVlOiBNICB9KT0+ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKSBnLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gKz0gTS5ieXRlTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgXyA9IG5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB2ID0gMCwgUyA9IGMubGVuZ3RoOyB2IDwgUzsgdisrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBBID0gY1t2XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEub25Qcm9ncmVzcyAmJiBBLm9uUHJvZ3Jlc3MoXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5lbnF1ZXVlKE0pLCB4MSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIChiKT0+ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZXJyb3IoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh5MSk7CiAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgeG8oYGZldGNoIGZvciAiJHtsLnVybH0iIHJlc3BvbmRlZCB3aXRoICR7bC5zdGF0dXN9OiAke2wuc3RhdHVzVGV4dH1gLCBsKTsKICAgICAgICB9KS50aGVuKChsKT0+ewogICAgICAgICAgICBzd2l0Y2goYSl7CiAgICAgICAgICAgICAgICBjYXNlICJhcnJheWJ1ZmZlciI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgICAgICAgIGNhc2UgImJsb2IiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmJsb2IoKTsKICAgICAgICAgICAgICAgIGNhc2UgImRvY3VtZW50IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC50ZXh0KCkudGhlbigoYyk9Pm5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYywgbykpOwogICAgICAgICAgICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuanNvbigpOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAobyA9PT0gdm9pZCAwKSByZXR1cm4gbC50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IC9jaGFyc2V0PSI/KFteOyJcc10qKSI/L2kuZXhlYyhvKSwgZCA9IHUgJiYgdVsxXSA/IHVbMV0udG9Mb3dlckNhc2UoKSA6IHZvaWQgMCwgcCA9IG5ldyBUZXh0RGVjb2RlcihkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuYXJyYXlCdWZmZXIoKS50aGVuKChmKT0+cC5kZWNvZGUoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pLnRoZW4oKGwpPT57CiAgICAgICAgICAgIHdlLmFkZCh0LCBsKTsKICAgICAgICAgICAgbGV0IGMgPSBzZVt0XTsKICAgICAgICAgICAgZGVsZXRlIHNlW3RdOwogICAgICAgICAgICBmb3IobGV0IHUgPSAwLCBkID0gYy5sZW5ndGg7IHUgPCBkOyB1KyspewogICAgICAgICAgICAgICAgbGV0IHAgPSBjW3VdOwogICAgICAgICAgICAgICAgcC5vbkxvYWQgJiYgcC5vbkxvYWQobCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KS5jYXRjaCgobCk9PnsKICAgICAgICAgICAgbGV0IGMgPSBzZVt0XTsKICAgICAgICAgICAgaWYgKGMgPT09IHZvaWQgMCkgdGhyb3cgdGhpcy5tYW5hZ2VyLml0ZW1FcnJvcih0KSwgbDsKICAgICAgICAgICAgZGVsZXRlIHNlW3RdOwogICAgICAgICAgICBmb3IobGV0IHUgPSAwLCBkID0gYy5sZW5ndGg7IHUgPCBkOyB1KyspewogICAgICAgICAgICAgICAgbGV0IHAgPSBjW3VdOwogICAgICAgICAgICAgICAgcC5vbkVycm9yICYmIHAub25FcnJvcihsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1hbmFnZXIuaXRlbUVycm9yKHQpOwogICAgICAgIH0pLmZpbmFsbHkoKCk9PnsKICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLml0ZW1FbmQodCk7CiAgICAgICAgfSksIHRoaXMubWFuYWdlci5pdGVtU3RhcnQodCk7CiAgICB9CiAgICBzZXRSZXNwb25zZVR5cGUodCkgewogICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVHlwZSA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRNaW1lVHlwZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWltZVR5cGUgPSB0LCB0aGlzOwogICAgfQp9LCBtaCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHRoaXMsIHIgPSBuZXcgSnQodGhpcy5tYW5hZ2VyKTsKICAgICAgICByLnNldFBhdGgodGhpcy5wYXRoKSwgci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksIHIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSwgci5sb2FkKHQsIGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGUobi5wYXJzZShKU09OLnBhcnNlKG8pKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgIHMgPyBzKGEpIDogY29uc29sZS5lcnJvcihhKSwgbi5tYW5hZ2VyLml0ZW1FcnJvcih0KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGksIHMpOwogICAgfQogICAgcGFyc2UodCkgewogICAgICAgIGxldCBlID0gW107CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspewogICAgICAgICAgICBsZXQgcyA9IHdpLnBhcnNlKHRbaV0pOwogICAgICAgICAgICBlLnB1c2gocyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQp9LCB5aCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHRoaXMsIHIgPSBbXSwgbyA9IG5ldyBaaSwgYSA9IG5ldyBKdCh0aGlzLm1hbmFnZXIpOwogICAgICAgIGEuc2V0UGF0aCh0aGlzLnBhdGgpLCBhLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSwgYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksIGEuc2V0V2l0aENyZWRlbnRpYWxzKG4ud2l0aENyZWRlbnRpYWxzKTsKICAgICAgICBsZXQgbCA9IDA7CiAgICAgICAgZnVuY3Rpb24gYyh1KSB7CiAgICAgICAgICAgIGEubG9hZCh0W3VdLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBsZXQgcCA9IG4ucGFyc2UoZCwgITApOwogICAgICAgICAgICAgICAgclt1XSA9IHsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogcC53aWR0aCwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHAuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdDogcC5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgbWlwbWFwczogcC5taXBtYXBzCiAgICAgICAgICAgICAgICB9LCBsICs9IDEsIGwgPT09IDYgJiYgKHAubWlwbWFwQ291bnQgPT09IDEgJiYgKG8ubWluRmlsdGVyID0gRXQpLCBvLmltYWdlID0gciwgby5mb3JtYXQgPSBwLmZvcm1hdCwgby5uZWVkc1VwZGF0ZSA9ICEwLCBlICYmIGUobykpOwogICAgICAgICAgICB9LCBpLCBzKTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIGZvcihsZXQgdSA9IDAsIGQgPSB0Lmxlbmd0aDsgdSA8IGQ7ICsrdSljKHUpOwogICAgICAgIGVsc2UgYS5sb2FkKHQsIGZ1bmN0aW9uKHUpIHsKICAgICAgICAgICAgbGV0IGQgPSBuLnBhcnNlKHUsICEwKTsKICAgICAgICAgICAgaWYgKGQuaXNDdWJlbWFwKSB7CiAgICAgICAgICAgICAgICBsZXQgcCA9IGQubWlwbWFwcy5sZW5ndGggLyBkLm1pcG1hcENvdW50OwogICAgICAgICAgICAgICAgZm9yKGxldCBmID0gMDsgZiA8IHA7IGYrKyl7CiAgICAgICAgICAgICAgICAgICAgcltmXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbWlwbWFwczogW10KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgbSA9IDA7IG0gPCBkLm1pcG1hcENvdW50OyBtKyspcltmXS5taXBtYXBzLnB1c2goZC5taXBtYXBzW2YgKiBkLm1pcG1hcENvdW50ICsgbV0pLCByW2ZdLmZvcm1hdCA9IGQuZm9ybWF0LCByW2ZdLndpZHRoID0gZC53aWR0aCwgcltmXS5oZWlnaHQgPSBkLmhlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8uaW1hZ2UgPSByOwogICAgICAgICAgICB9IGVsc2Ugby5pbWFnZS53aWR0aCA9IGQud2lkdGgsIG8uaW1hZ2UuaGVpZ2h0ID0gZC5oZWlnaHQsIG8ubWlwbWFwcyA9IGQubWlwbWFwczsKICAgICAgICAgICAgZC5taXBtYXBDb3VudCA9PT0gMSAmJiAoby5taW5GaWx0ZXIgPSBFdCksIG8uZm9ybWF0ID0gZC5mb3JtYXQsIG8ubmVlZHNVcGRhdGUgPSAhMCwgZSAmJiBlKG8pOwogICAgICAgIH0sIGksIHMpOwogICAgICAgIHJldHVybiBvOwogICAgfQp9LCBNaSA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICB0aGlzLnBhdGggIT09IHZvaWQgMCAmJiAodCA9IHRoaXMucGF0aCArIHQpLCB0ID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7CiAgICAgICAgbGV0IG4gPSB0aGlzLCByID0gd2UuZ2V0KHQpOwogICAgICAgIGlmIChyICE9PSB2b2lkIDApIHJldHVybiBuLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBlICYmIGUociksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgIH0sIDApLCByOwogICAgICAgIGxldCBvID0gWXMoImltZyIpOwogICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgIGMoKSwgd2UuYWRkKHQsIHRoaXMpLCBlICYmIGUodGhpcyksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsKHUpIHsKICAgICAgICAgICAgYygpLCBzICYmIHModSksIG4ubWFuYWdlci5pdGVtRXJyb3IodCksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICBvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLCBhLCAhMSksIG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBsLCAhMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhLCAhMSksIG8uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBsLCAhMSksIHQuc2xpY2UoMCwgNSkgIT09ICJkYXRhOiIgJiYgdGhpcy5jcm9zc09yaWdpbiAhPT0gdm9pZCAwICYmIChvLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbiksIG4ubWFuYWdlci5pdGVtU3RhcnQodCksIG8uc3JjID0gdCwgbzsKICAgIH0KfSwgZ2ggPSBjbGFzcyBleHRlbmRzIHd0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKHQpOwogICAgfQogICAgbG9hZCh0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSBuZXcgWGk7CiAgICAgICAgbi5jb2xvclNwYWNlID0gQnQ7CiAgICAgICAgbGV0IHIgPSBuZXcgTWkodGhpcy5tYW5hZ2VyKTsKICAgICAgICByLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLCByLnNldFBhdGgodGhpcy5wYXRoKTsKICAgICAgICBsZXQgbyA9IDA7CiAgICAgICAgZnVuY3Rpb24gYShsKSB7CiAgICAgICAgICAgIHIubG9hZCh0W2xdLCBmdW5jdGlvbihjKSB7CiAgICAgICAgICAgICAgICBuLmltYWdlc1tsXSA9IGMsIG8rKywgbyA9PT0gNiAmJiAobi5uZWVkc1VwZGF0ZSA9ICEwLCBlICYmIGUobikpOwogICAgICAgICAgICB9LCB2b2lkIDAsIHMpOwogICAgICAgIH0KICAgICAgICBmb3IobGV0IGwgPSAwOyBsIDwgdC5sZW5ndGg7ICsrbClhKGwpOwogICAgICAgIHJldHVybiBuOwogICAgfQp9LCB4aCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHRoaXMsIHIgPSBuZXcgTHQsIG8gPSBuZXcgSnQodGhpcy5tYW5hZ2VyKTsKICAgICAgICByZXR1cm4gby5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksIG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLCBvLnNldFBhdGgodGhpcy5wYXRoKSwgby5zZXRXaXRoQ3JlZGVudGlhbHMobi53aXRoQ3JlZGVudGlhbHMpLCBvLmxvYWQodCwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICBsZXQgbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGwgPSBuLnBhcnNlKGEpOwogICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICBpZiAocyAhPT0gdm9pZCAwKSBzKGMpOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihjKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbC5pbWFnZSAhPT0gdm9pZCAwID8gci5pbWFnZSA9IGwuaW1hZ2UgOiBsLmRhdGEgIT09IHZvaWQgMCAmJiAoci5pbWFnZS53aWR0aCA9IGwud2lkdGgsIHIuaW1hZ2UuaGVpZ2h0ID0gbC5oZWlnaHQsIHIuaW1hZ2UuZGF0YSA9IGwuZGF0YSksIHIud3JhcFMgPSBsLndyYXBTICE9PSB2b2lkIDAgPyBsLndyYXBTIDogSHQsIHIud3JhcFQgPSBsLndyYXBUICE9PSB2b2lkIDAgPyBsLndyYXBUIDogSHQsIHIubWFnRmlsdGVyID0gbC5tYWdGaWx0ZXIgIT09IHZvaWQgMCA/IGwubWFnRmlsdGVyIDogRXQsIHIubWluRmlsdGVyID0gbC5taW5GaWx0ZXIgIT09IHZvaWQgMCA/IGwubWluRmlsdGVyIDogRXQsIHIuYW5pc290cm9weSA9IGwuYW5pc290cm9weSAhPT0gdm9pZCAwID8gbC5hbmlzb3Ryb3B5IDogMSwgbC5jb2xvclNwYWNlICE9PSB2b2lkIDAgJiYgKHIuY29sb3JTcGFjZSA9IGwuY29sb3JTcGFjZSksIGwuZmxpcFkgIT09IHZvaWQgMCAmJiAoci5mbGlwWSA9IGwuZmxpcFkpLCBsLmZvcm1hdCAhPT0gdm9pZCAwICYmIChyLmZvcm1hdCA9IGwuZm9ybWF0KSwgbC50eXBlICE9PSB2b2lkIDAgJiYgKHIudHlwZSA9IGwudHlwZSksIGwubWlwbWFwcyAhPT0gdm9pZCAwICYmIChyLm1pcG1hcHMgPSBsLm1pcG1hcHMsIHIubWluRmlsdGVyID0gdm4pLCBsLm1pcG1hcENvdW50ID09PSAxICYmIChyLm1pbkZpbHRlciA9IEV0KSwgbC5nZW5lcmF0ZU1pcG1hcHMgIT09IHZvaWQgMCAmJiAoci5nZW5lcmF0ZU1pcG1hcHMgPSBsLmdlbmVyYXRlTWlwbWFwcyksIHIubmVlZHNVcGRhdGUgPSAhMCwgZSAmJiBlKHIsIGwpOwogICAgICAgIH0sIGksIHMpLCByOwogICAgfQp9LCBiaCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IG5ldyBsdCwgciA9IG5ldyBNaSh0aGlzLm1hbmFnZXIpOwogICAgICAgIHJldHVybiByLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLCByLnNldFBhdGgodGhpcy5wYXRoKSwgci5sb2FkKHQsIGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgbi5pbWFnZSA9IG8sIG4ubmVlZHNVcGRhdGUgPSAhMCwgZSAhPT0gdm9pZCAwICYmIGUobik7CiAgICAgICAgfSwgaSwgcyksIG47CiAgICB9Cn0sIGNlID0gY2xhc3MgZXh0ZW5kcyBHIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUgPSAxKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzTGlnaHQgPSAhMCwgdGhpcy50eXBlID0gIkxpZ2h0IiwgdGhpcy5jb2xvciA9IG5ldyBQKHQpLCB0aGlzLmludGVuc2l0eSA9IGU7CiAgICB9CiAgICBkaXNwb3NlKCkge30KICAgIGNvcHkodCwgZSkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsIGUpLCB0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksIHRoaXMuaW50ZW5zaXR5ID0gdC5pbnRlbnNpdHksIHRoaXM7CiAgICB9CiAgICB0b0pTT04odCkgewogICAgICAgIGxldCBlID0gc3VwZXIudG9KU09OKHQpOwogICAgICAgIHJldHVybiBlLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCksIGUub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5LCB0aGlzLmdyb3VuZENvbG9yICE9PSB2b2lkIDAgJiYgKGUub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSksIHRoaXMuZGlzdGFuY2UgIT09IHZvaWQgMCAmJiAoZS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKSwgdGhpcy5hbmdsZSAhPT0gdm9pZCAwICYmIChlLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGUpLCB0aGlzLmRlY2F5ICE9PSB2b2lkIDAgJiYgKGUub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheSksIHRoaXMucGVudW1icmEgIT09IHZvaWQgMCAmJiAoZS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhKSwgdGhpcy5zaGFkb3cgIT09IHZvaWQgMCAmJiAoZS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCkpLCB0aGlzLnRhcmdldCAhPT0gdm9pZCAwICYmIChlLm9iamVjdC50YXJnZXQgPSB0aGlzLnRhcmdldC51dWlkKSwgZTsKICAgIH0KfSwgYm8gPSBjbGFzcyBleHRlbmRzIGNlIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKHQsIGkpLCB0aGlzLmlzSGVtaXNwaGVyZUxpZ2h0ID0gITAsIHRoaXMudHlwZSA9ICJIZW1pc3BoZXJlTGlnaHQiLCB0aGlzLnBvc2l0aW9uLmNvcHkoRy5ERUZBVUxUX1VQKSwgdGhpcy51cGRhdGVNYXRyaXgoKSwgdGhpcy5ncm91bmRDb2xvciA9IG5ldyBQKGUpOwogICAgfQogICAgY29weSh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmNvcHkodCwgZSksIHRoaXMuZ3JvdW5kQ29sb3IuY29weSh0Lmdyb3VuZENvbG9yKSwgdGhpczsKICAgIH0KfSwgaHIgPSBuZXcgRCwgd2ggPSBuZXcgdywgTWggPSBuZXcgdywgdHMgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICB0aGlzLmNhbWVyYSA9IHQsIHRoaXMuaW50ZW5zaXR5ID0gMSwgdGhpcy5iaWFzID0gMCwgdGhpcy5ub3JtYWxCaWFzID0gMCwgdGhpcy5yYWRpdXMgPSAxLCB0aGlzLmJsdXJTYW1wbGVzID0gOCwgdGhpcy5tYXBTaXplID0gbmV3IFQoNTEyLCA1MTIpLCB0aGlzLm1hcCA9IG51bGwsIHRoaXMubWFwUGFzcyA9IG51bGwsIHRoaXMubWF0cml4ID0gbmV3IEQsIHRoaXMuYXV0b1VwZGF0ZSA9ICEwLCB0aGlzLm5lZWRzVXBkYXRlID0gITEsIHRoaXMuX2ZydXN0dW0gPSBuZXcgc24sIHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBUKDEsIDEpLCB0aGlzLl92aWV3cG9ydENvdW50ID0gMSwgdGhpcy5fdmlld3BvcnRzID0gWwogICAgICAgICAgICBuZXcgb3QoMCwgMCwgMSwgMSkKICAgICAgICBdOwogICAgfQogICAgZ2V0Vmlld3BvcnRDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudDsKICAgIH0KICAgIGdldEZydXN0dW0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZydXN0dW07CiAgICB9CiAgICB1cGRhdGVNYXRyaWNlcyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmNhbWVyYSwgaSA9IHRoaXMubWF0cml4OwogICAgICAgIHdoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSwgZS5wb3NpdGlvbi5jb3B5KHdoKSwgTWguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSwgZS5sb29rQXQoTWgpLCBlLnVwZGF0ZU1hdHJpeFdvcmxkKCksIGhyLm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LCBlLm1hdHJpeFdvcmxkSW52ZXJzZSksIHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoaHIpLCBpLnNldCguNSwgMCwgMCwgLjUsIDAsIC41LCAwLCAuNSwgMCwgMCwgLjUsIC41LCAwLCAwLCAwLCAxKSwgaS5tdWx0aXBseShocik7CiAgICB9CiAgICBnZXRWaWV3cG9ydCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1t0XTsKICAgIH0KICAgIGdldEZyYW1lRXh0ZW50cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLm1hcCAmJiB0aGlzLm1hcC5kaXNwb3NlKCksIHRoaXMubWFwUGFzcyAmJiB0aGlzLm1hcFBhc3MuZGlzcG9zZSgpOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2FtZXJhID0gdC5jYW1lcmEuY2xvbmUoKSwgdGhpcy5pbnRlbnNpdHkgPSB0LmludGVuc2l0eSwgdGhpcy5iaWFzID0gdC5iaWFzLCB0aGlzLnJhZGl1cyA9IHQucmFkaXVzLCB0aGlzLm1hcFNpemUuY29weSh0Lm1hcFNpemUpLCB0aGlzOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgICBsZXQgdCA9IHt9OwogICAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAhPT0gMSAmJiAodC5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eSksIHRoaXMuYmlhcyAhPT0gMCAmJiAodC5iaWFzID0gdGhpcy5iaWFzKSwgdGhpcy5ub3JtYWxCaWFzICE9PSAwICYmICh0Lm5vcm1hbEJpYXMgPSB0aGlzLm5vcm1hbEJpYXMpLCB0aGlzLnJhZGl1cyAhPT0gMSAmJiAodC5yYWRpdXMgPSB0aGlzLnJhZGl1cyksICh0aGlzLm1hcFNpemUueCAhPT0gNTEyIHx8IHRoaXMubWFwU2l6ZS55ICE9PSA1MTIpICYmICh0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpKSwgdC5jYW1lcmEgPSB0aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCwgZGVsZXRlIHQuY2FtZXJhLm1hdHJpeCwgdDsKICAgIH0KfSwgd28gPSBjbGFzcyBleHRlbmRzIHRzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgc3VwZXIobmV3IHZ0KDUwLCAxLCAuNSwgNTAwKSksIHRoaXMuaXNTcG90TGlnaHRTaGFkb3cgPSAhMCwgdGhpcy5mb2N1cyA9IDE7CiAgICB9CiAgICB1cGRhdGVNYXRyaWNlcyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLmNhbWVyYSwgaSA9IFVpICogMiAqIHQuYW5nbGUgKiB0aGlzLmZvY3VzLCBzID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodCwgbiA9IHQuZGlzdGFuY2UgfHwgZS5mYXI7CiAgICAgICAgKGkgIT09IGUuZm92IHx8IHMgIT09IGUuYXNwZWN0IHx8IG4gIT09IGUuZmFyKSAmJiAoZS5mb3YgPSBpLCBlLmFzcGVjdCA9IHMsIGUuZmFyID0gbiwgZS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLCBzdXBlci51cGRhdGVNYXRyaWNlcyh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLmZvY3VzID0gdC5mb2N1cywgdGhpczsKICAgIH0KfSwgTW8gPSBjbGFzcyBleHRlbmRzIGNlIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkgPSAwLCBzID0gTWF0aC5QSSAvIDMsIG4gPSAwLCByID0gMil7CiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuaXNTcG90TGlnaHQgPSAhMCwgdGhpcy50eXBlID0gIlNwb3RMaWdodCIsIHRoaXMucG9zaXRpb24uY29weShHLkRFRkFVTFRfVVApLCB0aGlzLnVwZGF0ZU1hdHJpeCgpLCB0aGlzLnRhcmdldCA9IG5ldyBHLCB0aGlzLmRpc3RhbmNlID0gaSwgdGhpcy5hbmdsZSA9IHMsIHRoaXMucGVudW1icmEgPSBuLCB0aGlzLmRlY2F5ID0gciwgdGhpcy5tYXAgPSBudWxsLCB0aGlzLnNoYWRvdyA9IG5ldyB3bzsKICAgIH0KICAgIGdldCBwb3dlcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiBNYXRoLlBJOwogICAgfQogICAgc2V0IHBvd2VyKHQpIHsKICAgICAgICB0aGlzLmludGVuc2l0eSA9IHQgLyBNYXRoLlBJOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLnNoYWRvdy5kaXNwb3NlKCk7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdGhpcy5kaXN0YW5jZSA9IHQuZGlzdGFuY2UsIHRoaXMuYW5nbGUgPSB0LmFuZ2xlLCB0aGlzLnBlbnVtYnJhID0gdC5wZW51bWJyYSwgdGhpcy5kZWNheSA9IHQuZGVjYXksIHRoaXMudGFyZ2V0ID0gdC50YXJnZXQuY2xvbmUoKSwgdGhpcy5zaGFkb3cgPSB0LnNoYWRvdy5jbG9uZSgpLCB0aGlzOwogICAgfQp9LCBfaCA9IG5ldyBELCBQaSA9IG5ldyB3LCBsciA9IG5ldyB3LCBfbyA9IGNsYXNzIGV4dGVuZHMgdHMgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcihuZXcgdnQoOTAsIDEsIC41LCA1MDApKSwgdGhpcy5pc1BvaW50TGlnaHRTaGFkb3cgPSAhMCwgdGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFQoNCwgMiksIHRoaXMuX3ZpZXdwb3J0Q291bnQgPSA2LCB0aGlzLl92aWV3cG9ydHMgPSBbCiAgICAgICAgICAgIG5ldyBvdCgyLCAxLCAxLCAxKSwKICAgICAgICAgICAgbmV3IG90KDAsIDEsIDEsIDEpLAogICAgICAgICAgICBuZXcgb3QoMywgMSwgMSwgMSksCiAgICAgICAgICAgIG5ldyBvdCgxLCAxLCAxLCAxKSwKICAgICAgICAgICAgbmV3IG90KDMsIDAsIDEsIDEpLAogICAgICAgICAgICBuZXcgb3QoMSwgMCwgMSwgMSkKICAgICAgICBdLCB0aGlzLl9jdWJlRGlyZWN0aW9ucyA9IFsKICAgICAgICAgICAgbmV3IHcoMSwgMCwgMCksCiAgICAgICAgICAgIG5ldyB3KC0xLCAwLCAwKSwKICAgICAgICAgICAgbmV3IHcoMCwgMCwgMSksCiAgICAgICAgICAgIG5ldyB3KDAsIDAsIC0xKSwKICAgICAgICAgICAgbmV3IHcoMCwgMSwgMCksCiAgICAgICAgICAgIG5ldyB3KDAsIC0xLCAwKQogICAgICAgIF0sIHRoaXMuX2N1YmVVcHMgPSBbCiAgICAgICAgICAgIG5ldyB3KDAsIDEsIDApLAogICAgICAgICAgICBuZXcgdygwLCAxLCAwKSwKICAgICAgICAgICAgbmV3IHcoMCwgMSwgMCksCiAgICAgICAgICAgIG5ldyB3KDAsIDEsIDApLAogICAgICAgICAgICBuZXcgdygwLCAwLCAxKSwKICAgICAgICAgICAgbmV3IHcoMCwgMCwgLTEpCiAgICAgICAgXTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpY2VzKHQsIGUgPSAwKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmNhbWVyYSwgcyA9IHRoaXMubWF0cml4LCBuID0gdC5kaXN0YW5jZSB8fCBpLmZhcjsKICAgICAgICBuICE9PSBpLmZhciAmJiAoaS5mYXIgPSBuLCBpLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksIFBpLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSwgaS5wb3NpdGlvbi5jb3B5KFBpKSwgbHIuY29weShpLnBvc2l0aW9uKSwgbHIuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSwgaS51cC5jb3B5KHRoaXMuX2N1YmVVcHNbZV0pLCBpLmxvb2tBdChsciksIGkudXBkYXRlTWF0cml4V29ybGQoKSwgcy5tYWtlVHJhbnNsYXRpb24oLVBpLngsIC1QaS55LCAtUGkueiksIF9oLm11bHRpcGx5TWF0cmljZXMoaS5wcm9qZWN0aW9uTWF0cml4LCBpLm1hdHJpeFdvcmxkSW52ZXJzZSksIHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoX2gpOwogICAgfQp9LCB2byA9IGNsYXNzIGV4dGVuZHMgY2UgewogICAgY29uc3RydWN0b3IodCwgZSwgaSA9IDAsIHMgPSAyKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc1BvaW50TGlnaHQgPSAhMCwgdGhpcy50eXBlID0gIlBvaW50TGlnaHQiLCB0aGlzLmRpc3RhbmNlID0gaSwgdGhpcy5kZWNheSA9IHMsIHRoaXMuc2hhZG93ID0gbmV3IF9vOwogICAgfQogICAgZ2V0IHBvd2VyKCkgewogICAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJOwogICAgfQogICAgc2V0IHBvd2VyKHQpIHsKICAgICAgICB0aGlzLmludGVuc2l0eSA9IHQgLyAoNCAqIE1hdGguUEkpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLnNoYWRvdy5kaXNwb3NlKCk7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdGhpcy5kaXN0YW5jZSA9IHQuZGlzdGFuY2UsIHRoaXMuZGVjYXkgPSB0LmRlY2F5LCB0aGlzLnNoYWRvdyA9IHQuc2hhZG93LmNsb25lKCksIHRoaXM7CiAgICB9Cn0sIHduID0gY2xhc3MgZXh0ZW5kcyBHaSB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gLTEsIGUgPSAxLCBpID0gMSwgcyA9IC0xLCBuID0gLjEsIHIgPSAyZTMpewogICAgICAgIHN1cGVyKCksIHRoaXMuaXNPcnRob2dyYXBoaWNDYW1lcmEgPSAhMCwgdGhpcy50eXBlID0gIk9ydGhvZ3JhcGhpY0NhbWVyYSIsIHRoaXMuem9vbSA9IDEsIHRoaXMudmlldyA9IG51bGwsIHRoaXMubGVmdCA9IHQsIHRoaXMucmlnaHQgPSBlLCB0aGlzLnRvcCA9IGksIHRoaXMuYm90dG9tID0gcywgdGhpcy5uZWFyID0gbiwgdGhpcy5mYXIgPSByLCB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIH0KICAgIGNvcHkodCwgZSkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsIGUpLCB0aGlzLmxlZnQgPSB0LmxlZnQsIHRoaXMucmlnaHQgPSB0LnJpZ2h0LCB0aGlzLnRvcCA9IHQudG9wLCB0aGlzLmJvdHRvbSA9IHQuYm90dG9tLCB0aGlzLm5lYXIgPSB0Lm5lYXIsIHRoaXMuZmFyID0gdC5mYXIsIHRoaXMuem9vbSA9IHQuem9vbSwgdGhpcy52aWV3ID0gdC52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oe30sIHQudmlldyksIHRoaXM7CiAgICB9CiAgICBzZXRWaWV3T2Zmc2V0KHQsIGUsIGksIHMsIG4sIHIpIHsKICAgICAgICB0aGlzLnZpZXcgPT09IG51bGwgJiYgKHRoaXMudmlldyA9IHsKICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgIGZ1bGxXaWR0aDogMSwKICAgICAgICAgICAgZnVsbEhlaWdodDogMSwKICAgICAgICAgICAgb2Zmc2V0WDogMCwKICAgICAgICAgICAgb2Zmc2V0WTogMCwKICAgICAgICAgICAgd2lkdGg6IDEsCiAgICAgICAgICAgIGhlaWdodDogMQogICAgICAgIH0pLCB0aGlzLnZpZXcuZW5hYmxlZCA9ICEwLCB0aGlzLnZpZXcuZnVsbFdpZHRoID0gdCwgdGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBlLCB0aGlzLnZpZXcub2Zmc2V0WCA9IGksIHRoaXMudmlldy5vZmZzZXRZID0gcywgdGhpcy52aWV3LndpZHRoID0gbiwgdGhpcy52aWV3LmhlaWdodCA9IHIsIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogICAgY2xlYXJWaWV3T2Zmc2V0KCkgewogICAgICAgIHRoaXMudmlldyAhPT0gbnVsbCAmJiAodGhpcy52aWV3LmVuYWJsZWQgPSAhMSksIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpIHsKICAgICAgICBsZXQgdCA9ICh0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0KSAvICgyICogdGhpcy56b29tKSwgZSA9ICh0aGlzLnRvcCAtIHRoaXMuYm90dG9tKSAvICgyICogdGhpcy56b29tKSwgaSA9ICh0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0KSAvIDIsIHMgPSAodGhpcy50b3AgKyB0aGlzLmJvdHRvbSkgLyAyLCBuID0gaSAtIHQsIHIgPSBpICsgdCwgbyA9IHMgKyBlLCBhID0gcyAtIGU7CiAgICAgICAgaWYgKHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCkgewogICAgICAgICAgICBsZXQgbCA9ICh0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0KSAvIHRoaXMudmlldy5mdWxsV2lkdGggLyB0aGlzLnpvb20sIGMgPSAodGhpcy50b3AgLSB0aGlzLmJvdHRvbSkgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAvIHRoaXMuem9vbTsKICAgICAgICAgICAgbiArPSBsICogdGhpcy52aWV3Lm9mZnNldFgsIHIgPSBuICsgbCAqIHRoaXMudmlldy53aWR0aCwgbyAtPSBjICogdGhpcy52aWV3Lm9mZnNldFksIGEgPSBvIC0gYyAqIHRoaXMudmlldy5oZWlnaHQ7CiAgICAgICAgfQogICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKG4sIHIsIG8sIGEsIHRoaXMubmVhciwgdGhpcy5mYXIsIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksIHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHN1cGVyLnRvSlNPTih0KTsKICAgICAgICByZXR1cm4gZS5vYmplY3Quem9vbSA9IHRoaXMuem9vbSwgZS5vYmplY3QubGVmdCA9IHRoaXMubGVmdCwgZS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0LCBlLm9iamVjdC50b3AgPSB0aGlzLnRvcCwgZS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b20sIGUub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXIsIGUub2JqZWN0LmZhciA9IHRoaXMuZmFyLCB0aGlzLnZpZXcgIT09IG51bGwgJiYgKGUub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnZpZXcpKSwgZTsKICAgIH0KfSwgQW8gPSBjbGFzcyBleHRlbmRzIHRzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgc3VwZXIobmV3IHduKC01LCA1LCA1LCAtNSwgLjUsIDUwMCkpLCB0aGlzLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9ICEwOwogICAgfQp9LCBTbyA9IGNsYXNzIGV4dGVuZHMgY2UgewogICAgY29uc3RydWN0b3IodCwgZSl7CiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0ID0gITAsIHRoaXMudHlwZSA9ICJEaXJlY3Rpb25hbExpZ2h0IiwgdGhpcy5wb3NpdGlvbi5jb3B5KEcuREVGQVVMVF9VUCksIHRoaXMudXBkYXRlTWF0cml4KCksIHRoaXMudGFyZ2V0ID0gbmV3IEcsIHRoaXMuc2hhZG93ID0gbmV3IEFvOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLnNoYWRvdy5kaXNwb3NlKCk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy50YXJnZXQgPSB0LnRhcmdldC5jbG9uZSgpLCB0aGlzLnNoYWRvdyA9IHQuc2hhZG93LmNsb25lKCksIHRoaXM7CiAgICB9Cn0sIFRvID0gY2xhc3MgZXh0ZW5kcyBjZSB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc0FtYmllbnRMaWdodCA9ICEwLCB0aGlzLnR5cGUgPSAiQW1iaWVudExpZ2h0IjsKICAgIH0KfSwgSW8gPSBjbGFzcyBleHRlbmRzIGNlIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkgPSAxMCwgcyA9IDEwKXsKICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5pc1JlY3RBcmVhTGlnaHQgPSAhMCwgdGhpcy50eXBlID0gIlJlY3RBcmVhTGlnaHQiLCB0aGlzLndpZHRoID0gaSwgdGhpcy5oZWlnaHQgPSBzOwogICAgfQogICAgZ2V0IHBvd2VyKCkgewogICAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAqIHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIE1hdGguUEk7CiAgICB9CiAgICBzZXQgcG93ZXIodCkgewogICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gdCAvICh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiBNYXRoLlBJKTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLndpZHRoID0gdC53aWR0aCwgdGhpcy5oZWlnaHQgPSB0LmhlaWdodCwgdGhpczsKICAgIH0KICAgIHRvSlNPTih0KSB7CiAgICAgICAgbGV0IGUgPSBzdXBlci50b0pTT04odCk7CiAgICAgICAgcmV0dXJuIGUub2JqZWN0LndpZHRoID0gdGhpcy53aWR0aCwgZS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQsIGU7CiAgICB9Cn0sIENvID0gY2xhc3MgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICB0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMyA9ICEwLCB0aGlzLmNvZWZmaWNpZW50cyA9IFtdOwogICAgICAgIGZvcihsZXQgdCA9IDA7IHQgPCA5OyB0KyspdGhpcy5jb2VmZmljaWVudHMucHVzaChuZXcgdyk7CiAgICB9CiAgICBzZXQodCkgewogICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCA5OyBlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uY29weSh0W2VdKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHplcm8oKSB7CiAgICAgICAgZm9yKGxldCB0ID0gMDsgdCA8IDk7IHQrKyl0aGlzLmNvZWZmaWNpZW50c1t0XS5zZXQoMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRBdCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0LngsIHMgPSB0LnksIG4gPSB0LnosIHIgPSB0aGlzLmNvZWZmaWNpZW50czsKICAgICAgICByZXR1cm4gZS5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpLCBlLmFkZFNjYWxlZFZlY3RvcihyWzFdLCAuNDg4NjAzICogcyksIGUuYWRkU2NhbGVkVmVjdG9yKHJbMl0sIC40ODg2MDMgKiBuKSwgZS5hZGRTY2FsZWRWZWN0b3IoclszXSwgLjQ4ODYwMyAqIGkpLCBlLmFkZFNjYWxlZFZlY3RvcihyWzRdLCAxLjA5MjU0OCAqIChpICogcykpLCBlLmFkZFNjYWxlZFZlY3RvcihyWzVdLCAxLjA5MjU0OCAqIChzICogbikpLCBlLmFkZFNjYWxlZFZlY3RvcihyWzZdLCAuMzE1MzkyICogKDMgKiBuICogbiAtIDEpKSwgZS5hZGRTY2FsZWRWZWN0b3Iocls3XSwgMS4wOTI1NDggKiAoaSAqIG4pKSwgZS5hZGRTY2FsZWRWZWN0b3Iocls4XSwgLjU0NjI3NCAqIChpICogaSAtIHMgKiBzKSksIGU7CiAgICB9CiAgICBnZXRJcnJhZGlhbmNlQXQodCwgZSkgewogICAgICAgIGxldCBpID0gdC54LCBzID0gdC55LCBuID0gdC56LCByID0gdGhpcy5jb2VmZmljaWVudHM7CiAgICAgICAgcmV0dXJuIGUuY29weShyWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSwgZS5hZGRTY2FsZWRWZWN0b3IoclsxXSwgMiAqIC41MTE2NjQgKiBzKSwgZS5hZGRTY2FsZWRWZWN0b3IoclsyXSwgMiAqIC41MTE2NjQgKiBuKSwgZS5hZGRTY2FsZWRWZWN0b3IoclszXSwgMiAqIC41MTE2NjQgKiBpKSwgZS5hZGRTY2FsZWRWZWN0b3Iocls0XSwgMiAqIC40MjkwNDMgKiBpICogcyksIGUuYWRkU2NhbGVkVmVjdG9yKHJbNV0sIDIgKiAuNDI5MDQzICogcyAqIG4pLCBlLmFkZFNjYWxlZFZlY3RvcihyWzZdLCAuNzQzMTI1ICogbiAqIG4gLSAuMjQ3NzA4KSwgZS5hZGRTY2FsZWRWZWN0b3Iocls3XSwgMiAqIC40MjkwNDMgKiBpICogbiksIGUuYWRkU2NhbGVkVmVjdG9yKHJbOF0sIC40MjkwNDMgKiAoaSAqIGkgLSBzICogcykpLCBlOwogICAgfQogICAgYWRkKHQpIHsKICAgICAgICBmb3IobGV0IGUgPSAwOyBlIDwgOTsgZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmFkZCh0LmNvZWZmaWNpZW50c1tlXSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsZWRTSCh0LCBlKSB7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IDk7IGkrKyl0aGlzLmNvZWZmaWNpZW50c1tpXS5hZGRTY2FsZWRWZWN0b3IodC5jb2VmZmljaWVudHNbaV0sIGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2NhbGUodCkgewogICAgICAgIGZvcihsZXQgZSA9IDA7IGUgPCA5OyBlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubXVsdGlwbHlTY2FsYXIodCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsZXJwKHQsIGUpIHsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgOTsgaSsrKXRoaXMuY29lZmZpY2llbnRzW2ldLmxlcnAodC5jb2VmZmljaWVudHNbaV0sIGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZXF1YWxzKHQpIHsKICAgICAgICBmb3IobGV0IGUgPSAwOyBlIDwgOTsgZSsrKWlmICghdGhpcy5jb2VmZmljaWVudHNbZV0uZXF1YWxzKHQuY29lZmZpY2llbnRzW2VdKSkgcmV0dXJuICExOwogICAgICAgIHJldHVybiAhMDsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnNldCh0LmNvZWZmaWNpZW50cyk7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQogICAgZnJvbUFycmF5KHQsIGUgPSAwKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmNvZWZmaWNpZW50czsKICAgICAgICBmb3IobGV0IHMgPSAwOyBzIDwgOTsgcysrKWlbc10uZnJvbUFycmF5KHQsIGUgKyBzICogMyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KHQgPSBbXSwgZSA9IDApIHsKICAgICAgICBsZXQgaSA9IHRoaXMuY29lZmZpY2llbnRzOwogICAgICAgIGZvcihsZXQgcyA9IDA7IHMgPCA5OyBzKyspaVtzXS50b0FycmF5KHQsIGUgKyBzICogMyk7CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICBzdGF0aWMgZ2V0QmFzaXNBdCh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0LngsIHMgPSB0LnksIG4gPSB0Lno7CiAgICAgICAgZVswXSA9IC4yODIwOTUsIGVbMV0gPSAuNDg4NjAzICogcywgZVsyXSA9IC40ODg2MDMgKiBuLCBlWzNdID0gLjQ4ODYwMyAqIGksIGVbNF0gPSAxLjA5MjU0OCAqIGkgKiBzLCBlWzVdID0gMS4wOTI1NDggKiBzICogbiwgZVs2XSA9IC4zMTUzOTIgKiAoMyAqIG4gKiBuIC0gMSksIGVbN10gPSAxLjA5MjU0OCAqIGkgKiBuLCBlWzhdID0gLjU0NjI3NCAqIChpICogaSAtIHMgKiBzKTsKICAgIH0KfSwgem8gPSBjbGFzcyBleHRlbmRzIGNlIHsKICAgIGNvbnN0cnVjdG9yKHQgPSBuZXcgQ28sIGUgPSAxKXsKICAgICAgICBzdXBlcih2b2lkIDAsIGUpLCB0aGlzLmlzTGlnaHRQcm9iZSA9ICEwLCB0aGlzLnNoID0gdDsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLnNoLmNvcHkodC5zaCksIHRoaXM7CiAgICB9CiAgICBmcm9tSlNPTih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5ID0gdC5pbnRlbnNpdHksIHRoaXMuc2guZnJvbUFycmF5KHQuc2gpLCB0aGlzOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHN1cGVyLnRvSlNPTih0KTsKICAgICAgICByZXR1cm4gZS5vYmplY3Quc2ggPSB0aGlzLnNoLnRvQXJyYXkoKSwgZTsKICAgIH0KfSwgRm8gPSBjbGFzcyBoIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCksIHRoaXMudGV4dHVyZXMgPSB7fTsKICAgIH0KICAgIGxvYWQodCwgZSwgaSwgcykgewogICAgICAgIGxldCBuID0gdGhpcywgciA9IG5ldyBKdChuLm1hbmFnZXIpOwogICAgICAgIHIuc2V0UGF0aChuLnBhdGgpLCByLnNldFJlcXVlc3RIZWFkZXIobi5yZXF1ZXN0SGVhZGVyKSwgci5zZXRXaXRoQ3JlZGVudGlhbHMobi53aXRoQ3JlZGVudGlhbHMpLCByLmxvYWQodCwgZnVuY3Rpb24obykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZShuLnBhcnNlKEpTT04ucGFyc2UobykpKTsKICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgcyA/IHMoYSkgOiBjb25zb2xlLmVycm9yKGEpLCBuLm1hbmFnZXIuaXRlbUVycm9yKHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgaSwgcyk7CiAgICB9CiAgICBwYXJzZSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLnRleHR1cmVzOwogICAgICAgIGZ1bmN0aW9uIGkobikgewogICAgICAgICAgICByZXR1cm4gZVtuXSA9PT0gdm9pZCAwICYmIGNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIiwgbiksIGVbbl07CiAgICAgICAgfQogICAgICAgIGxldCBzID0gdGhpcy5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQudHlwZSk7CiAgICAgICAgaWYgKHQudXVpZCAhPT0gdm9pZCAwICYmIChzLnV1aWQgPSB0LnV1aWQpLCB0Lm5hbWUgIT09IHZvaWQgMCAmJiAocy5uYW1lID0gdC5uYW1lKSwgdC5jb2xvciAhPT0gdm9pZCAwICYmIHMuY29sb3IgIT09IHZvaWQgMCAmJiBzLmNvbG9yLnNldEhleCh0LmNvbG9yKSwgdC5yb3VnaG5lc3MgIT09IHZvaWQgMCAmJiAocy5yb3VnaG5lc3MgPSB0LnJvdWdobmVzcyksIHQubWV0YWxuZXNzICE9PSB2b2lkIDAgJiYgKHMubWV0YWxuZXNzID0gdC5tZXRhbG5lc3MpLCB0LnNoZWVuICE9PSB2b2lkIDAgJiYgKHMuc2hlZW4gPSB0LnNoZWVuKSwgdC5zaGVlbkNvbG9yICE9PSB2b2lkIDAgJiYgKHMuc2hlZW5Db2xvciA9IG5ldyBQKCkuc2V0SGV4KHQuc2hlZW5Db2xvcikpLCB0LnNoZWVuUm91Z2huZXNzICE9PSB2b2lkIDAgJiYgKHMuc2hlZW5Sb3VnaG5lc3MgPSB0LnNoZWVuUm91Z2huZXNzKSwgdC5lbWlzc2l2ZSAhPT0gdm9pZCAwICYmIHMuZW1pc3NpdmUgIT09IHZvaWQgMCAmJiBzLmVtaXNzaXZlLnNldEhleCh0LmVtaXNzaXZlKSwgdC5zcGVjdWxhciAhPT0gdm9pZCAwICYmIHMuc3BlY3VsYXIgIT09IHZvaWQgMCAmJiBzLnNwZWN1bGFyLnNldEhleCh0LnNwZWN1bGFyKSwgdC5zcGVjdWxhckludGVuc2l0eSAhPT0gdm9pZCAwICYmIChzLnNwZWN1bGFySW50ZW5zaXR5ID0gdC5zcGVjdWxhckludGVuc2l0eSksIHQuc3BlY3VsYXJDb2xvciAhPT0gdm9pZCAwICYmIHMuc3BlY3VsYXJDb2xvciAhPT0gdm9pZCAwICYmIHMuc3BlY3VsYXJDb2xvci5zZXRIZXgodC5zcGVjdWxhckNvbG9yKSwgdC5zaGluaW5lc3MgIT09IHZvaWQgMCAmJiAocy5zaGluaW5lc3MgPSB0LnNoaW5pbmVzcyksIHQuY2xlYXJjb2F0ICE9PSB2b2lkIDAgJiYgKHMuY2xlYXJjb2F0ID0gdC5jbGVhcmNvYXQpLCB0LmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdm9pZCAwICYmIChzLmNsZWFyY29hdFJvdWdobmVzcyA9IHQuY2xlYXJjb2F0Um91Z2huZXNzKSwgdC5kaXNwZXJzaW9uICE9PSB2b2lkIDAgJiYgKHMuZGlzcGVyc2lvbiA9IHQuZGlzcGVyc2lvbiksIHQuaXJpZGVzY2VuY2UgIT09IHZvaWQgMCAmJiAocy5pcmlkZXNjZW5jZSA9IHQuaXJpZGVzY2VuY2UpLCB0LmlyaWRlc2NlbmNlSU9SICE9PSB2b2lkIDAgJiYgKHMuaXJpZGVzY2VuY2VJT1IgPSB0LmlyaWRlc2NlbmNlSU9SKSwgdC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICE9PSB2b2lkIDAgJiYgKHMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IHQuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksIHQudHJhbnNtaXNzaW9uICE9PSB2b2lkIDAgJiYgKHMudHJhbnNtaXNzaW9uID0gdC50cmFuc21pc3Npb24pLCB0LnRoaWNrbmVzcyAhPT0gdm9pZCAwICYmIChzLnRoaWNrbmVzcyA9IHQudGhpY2tuZXNzKSwgdC5hdHRlbnVhdGlvbkRpc3RhbmNlICE9PSB2b2lkIDAgJiYgKHMuYXR0ZW51YXRpb25EaXN0YW5jZSA9IHQuYXR0ZW51YXRpb25EaXN0YW5jZSksIHQuYXR0ZW51YXRpb25Db2xvciAhPT0gdm9pZCAwICYmIHMuYXR0ZW51YXRpb25Db2xvciAhPT0gdm9pZCAwICYmIHMuYXR0ZW51YXRpb25Db2xvci5zZXRIZXgodC5hdHRlbnVhdGlvbkNvbG9yKSwgdC5hbmlzb3Ryb3B5ICE9PSB2b2lkIDAgJiYgKHMuYW5pc290cm9weSA9IHQuYW5pc290cm9weSksIHQuYW5pc290cm9weVJvdGF0aW9uICE9PSB2b2lkIDAgJiYgKHMuYW5pc290cm9weVJvdGF0aW9uID0gdC5hbmlzb3Ryb3B5Um90YXRpb24pLCB0LmZvZyAhPT0gdm9pZCAwICYmIChzLmZvZyA9IHQuZm9nKSwgdC5mbGF0U2hhZGluZyAhPT0gdm9pZCAwICYmIChzLmZsYXRTaGFkaW5nID0gdC5mbGF0U2hhZGluZyksIHQuYmxlbmRpbmcgIT09IHZvaWQgMCAmJiAocy5ibGVuZGluZyA9IHQuYmxlbmRpbmcpLCB0LmNvbWJpbmUgIT09IHZvaWQgMCAmJiAocy5jb21iaW5lID0gdC5jb21iaW5lKSwgdC5zaWRlICE9PSB2b2lkIDAgJiYgKHMuc2lkZSA9IHQuc2lkZSksIHQuc2hhZG93U2lkZSAhPT0gdm9pZCAwICYmIChzLnNoYWRvd1NpZGUgPSB0LnNoYWRvd1NpZGUpLCB0Lm9wYWNpdHkgIT09IHZvaWQgMCAmJiAocy5vcGFjaXR5ID0gdC5vcGFjaXR5KSwgdC50cmFuc3BhcmVudCAhPT0gdm9pZCAwICYmIChzLnRyYW5zcGFyZW50ID0gdC50cmFuc3BhcmVudCksIHQuYWxwaGFUZXN0ICE9PSB2b2lkIDAgJiYgKHMuYWxwaGFUZXN0ID0gdC5hbHBoYVRlc3QpLCB0LmFscGhhSGFzaCAhPT0gdm9pZCAwICYmIChzLmFscGhhSGFzaCA9IHQuYWxwaGFIYXNoKSwgdC5kZXB0aEZ1bmMgIT09IHZvaWQgMCAmJiAocy5kZXB0aEZ1bmMgPSB0LmRlcHRoRnVuYyksIHQuZGVwdGhUZXN0ICE9PSB2b2lkIDAgJiYgKHMuZGVwdGhUZXN0ID0gdC5kZXB0aFRlc3QpLCB0LmRlcHRoV3JpdGUgIT09IHZvaWQgMCAmJiAocy5kZXB0aFdyaXRlID0gdC5kZXB0aFdyaXRlKSwgdC5jb2xvcldyaXRlICE9PSB2b2lkIDAgJiYgKHMuY29sb3JXcml0ZSA9IHQuY29sb3JXcml0ZSksIHQuYmxlbmRTcmMgIT09IHZvaWQgMCAmJiAocy5ibGVuZFNyYyA9IHQuYmxlbmRTcmMpLCB0LmJsZW5kRHN0ICE9PSB2b2lkIDAgJiYgKHMuYmxlbmREc3QgPSB0LmJsZW5kRHN0KSwgdC5ibGVuZEVxdWF0aW9uICE9PSB2b2lkIDAgJiYgKHMuYmxlbmRFcXVhdGlvbiA9IHQuYmxlbmRFcXVhdGlvbiksIHQuYmxlbmRTcmNBbHBoYSAhPT0gdm9pZCAwICYmIChzLmJsZW5kU3JjQWxwaGEgPSB0LmJsZW5kU3JjQWxwaGEpLCB0LmJsZW5kRHN0QWxwaGEgIT09IHZvaWQgMCAmJiAocy5ibGVuZERzdEFscGhhID0gdC5ibGVuZERzdEFscGhhKSwgdC5ibGVuZEVxdWF0aW9uQWxwaGEgIT09IHZvaWQgMCAmJiAocy5ibGVuZEVxdWF0aW9uQWxwaGEgPSB0LmJsZW5kRXF1YXRpb25BbHBoYSksIHQuYmxlbmRDb2xvciAhPT0gdm9pZCAwICYmIHMuYmxlbmRDb2xvciAhPT0gdm9pZCAwICYmIHMuYmxlbmRDb2xvci5zZXRIZXgodC5ibGVuZENvbG9yKSwgdC5ibGVuZEFscGhhICE9PSB2b2lkIDAgJiYgKHMuYmxlbmRBbHBoYSA9IHQuYmxlbmRBbHBoYSksIHQuc3RlbmNpbFdyaXRlTWFzayAhPT0gdm9pZCAwICYmIChzLnN0ZW5jaWxXcml0ZU1hc2sgPSB0LnN0ZW5jaWxXcml0ZU1hc2spLCB0LnN0ZW5jaWxGdW5jICE9PSB2b2lkIDAgJiYgKHMuc3RlbmNpbEZ1bmMgPSB0LnN0ZW5jaWxGdW5jKSwgdC5zdGVuY2lsUmVmICE9PSB2b2lkIDAgJiYgKHMuc3RlbmNpbFJlZiA9IHQuc3RlbmNpbFJlZiksIHQuc3RlbmNpbEZ1bmNNYXNrICE9PSB2b2lkIDAgJiYgKHMuc3RlbmNpbEZ1bmNNYXNrID0gdC5zdGVuY2lsRnVuY01hc2spLCB0LnN0ZW5jaWxGYWlsICE9PSB2b2lkIDAgJiYgKHMuc3RlbmNpbEZhaWwgPSB0LnN0ZW5jaWxGYWlsKSwgdC5zdGVuY2lsWkZhaWwgIT09IHZvaWQgMCAmJiAocy5zdGVuY2lsWkZhaWwgPSB0LnN0ZW5jaWxaRmFpbCksIHQuc3RlbmNpbFpQYXNzICE9PSB2b2lkIDAgJiYgKHMuc3RlbmNpbFpQYXNzID0gdC5zdGVuY2lsWlBhc3MpLCB0LnN0ZW5jaWxXcml0ZSAhPT0gdm9pZCAwICYmIChzLnN0ZW5jaWxXcml0ZSA9IHQuc3RlbmNpbFdyaXRlKSwgdC53aXJlZnJhbWUgIT09IHZvaWQgMCAmJiAocy53aXJlZnJhbWUgPSB0LndpcmVmcmFtZSksIHQud2lyZWZyYW1lTGluZXdpZHRoICE9PSB2b2lkIDAgJiYgKHMud2lyZWZyYW1lTGluZXdpZHRoID0gdC53aXJlZnJhbWVMaW5ld2lkdGgpLCB0LndpcmVmcmFtZUxpbmVjYXAgIT09IHZvaWQgMCAmJiAocy53aXJlZnJhbWVMaW5lY2FwID0gdC53aXJlZnJhbWVMaW5lY2FwKSwgdC53aXJlZnJhbWVMaW5lam9pbiAhPT0gdm9pZCAwICYmIChzLndpcmVmcmFtZUxpbmVqb2luID0gdC53aXJlZnJhbWVMaW5lam9pbiksIHQucm90YXRpb24gIT09IHZvaWQgMCAmJiAocy5yb3RhdGlvbiA9IHQucm90YXRpb24pLCB0LmxpbmV3aWR0aCAhPT0gdm9pZCAwICYmIChzLmxpbmV3aWR0aCA9IHQubGluZXdpZHRoKSwgdC5kYXNoU2l6ZSAhPT0gdm9pZCAwICYmIChzLmRhc2hTaXplID0gdC5kYXNoU2l6ZSksIHQuZ2FwU2l6ZSAhPT0gdm9pZCAwICYmIChzLmdhcFNpemUgPSB0LmdhcFNpemUpLCB0LnNjYWxlICE9PSB2b2lkIDAgJiYgKHMuc2NhbGUgPSB0LnNjYWxlKSwgdC5wb2x5Z29uT2Zmc2V0ICE9PSB2b2lkIDAgJiYgKHMucG9seWdvbk9mZnNldCA9IHQucG9seWdvbk9mZnNldCksIHQucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdm9pZCAwICYmIChzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSB0LnBvbHlnb25PZmZzZXRGYWN0b3IpLCB0LnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdm9pZCAwICYmIChzLnBvbHlnb25PZmZzZXRVbml0cyA9IHQucG9seWdvbk9mZnNldFVuaXRzKSwgdC5kaXRoZXJpbmcgIT09IHZvaWQgMCAmJiAocy5kaXRoZXJpbmcgPSB0LmRpdGhlcmluZyksIHQuYWxwaGFUb0NvdmVyYWdlICE9PSB2b2lkIDAgJiYgKHMuYWxwaGFUb0NvdmVyYWdlID0gdC5hbHBoYVRvQ292ZXJhZ2UpLCB0LnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdm9pZCAwICYmIChzLnByZW11bHRpcGxpZWRBbHBoYSA9IHQucHJlbXVsdGlwbGllZEFscGhhKSwgdC5mb3JjZVNpbmdsZVBhc3MgIT09IHZvaWQgMCAmJiAocy5mb3JjZVNpbmdsZVBhc3MgPSB0LmZvcmNlU2luZ2xlUGFzcyksIHQudmlzaWJsZSAhPT0gdm9pZCAwICYmIChzLnZpc2libGUgPSB0LnZpc2libGUpLCB0LnRvbmVNYXBwZWQgIT09IHZvaWQgMCAmJiAocy50b25lTWFwcGVkID0gdC50b25lTWFwcGVkKSwgdC51c2VyRGF0YSAhPT0gdm9pZCAwICYmIChzLnVzZXJEYXRhID0gdC51c2VyRGF0YSksIHQudmVydGV4Q29sb3JzICE9PSB2b2lkIDAgJiYgKHR5cGVvZiB0LnZlcnRleENvbG9ycyA9PSAibnVtYmVyIiA/IHMudmVydGV4Q29sb3JzID0gdC52ZXJ0ZXhDb2xvcnMgPiAwIDogcy52ZXJ0ZXhDb2xvcnMgPSB0LnZlcnRleENvbG9ycyksIHQudW5pZm9ybXMgIT09IHZvaWQgMCkgZm9yKGxldCBuIGluIHQudW5pZm9ybXMpewogICAgICAgICAgICBsZXQgciA9IHQudW5pZm9ybXNbbl07CiAgICAgICAgICAgIHN3aXRjaChzLnVuaWZvcm1zW25dID0ge30sIHIudHlwZSl7CiAgICAgICAgICAgICAgICBjYXNlICJ0IjoKICAgICAgICAgICAgICAgICAgICBzLnVuaWZvcm1zW25dLnZhbHVlID0gaShyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImMiOgogICAgICAgICAgICAgICAgICAgIHMudW5pZm9ybXNbbl0udmFsdWUgPSBuZXcgUCgpLnNldEhleChyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInYyIjoKICAgICAgICAgICAgICAgICAgICBzLnVuaWZvcm1zW25dLnZhbHVlID0gbmV3IFQoKS5mcm9tQXJyYXkoci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ2MyI6CiAgICAgICAgICAgICAgICAgICAgcy51bmlmb3Jtc1tuXS52YWx1ZSA9IG5ldyB3KCkuZnJvbUFycmF5KHIudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAidjQiOgogICAgICAgICAgICAgICAgICAgIHMudW5pZm9ybXNbbl0udmFsdWUgPSBuZXcgb3QoKS5mcm9tQXJyYXkoci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJtMyI6CiAgICAgICAgICAgICAgICAgICAgcy51bmlmb3Jtc1tuXS52YWx1ZSA9IG5ldyBHdCgpLmZyb21BcnJheShyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIm00IjoKICAgICAgICAgICAgICAgICAgICBzLnVuaWZvcm1zW25dLnZhbHVlID0gbmV3IEQoKS5mcm9tQXJyYXkoci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHMudW5pZm9ybXNbbl0udmFsdWUgPSByLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0LmRlZmluZXMgIT09IHZvaWQgMCAmJiAocy5kZWZpbmVzID0gdC5kZWZpbmVzKSwgdC52ZXJ0ZXhTaGFkZXIgIT09IHZvaWQgMCAmJiAocy52ZXJ0ZXhTaGFkZXIgPSB0LnZlcnRleFNoYWRlciksIHQuZnJhZ21lbnRTaGFkZXIgIT09IHZvaWQgMCAmJiAocy5mcmFnbWVudFNoYWRlciA9IHQuZnJhZ21lbnRTaGFkZXIpLCB0Lmdsc2xWZXJzaW9uICE9PSB2b2lkIDAgJiYgKHMuZ2xzbFZlcnNpb24gPSB0Lmdsc2xWZXJzaW9uKSwgdC5leHRlbnNpb25zICE9PSB2b2lkIDApIGZvcihsZXQgbiBpbiB0LmV4dGVuc2lvbnMpcy5leHRlbnNpb25zW25dID0gdC5leHRlbnNpb25zW25dOwogICAgICAgIGlmICh0LmxpZ2h0cyAhPT0gdm9pZCAwICYmIChzLmxpZ2h0cyA9IHQubGlnaHRzKSwgdC5jbGlwcGluZyAhPT0gdm9pZCAwICYmIChzLmNsaXBwaW5nID0gdC5jbGlwcGluZyksIHQuc2l6ZSAhPT0gdm9pZCAwICYmIChzLnNpemUgPSB0LnNpemUpLCB0LnNpemVBdHRlbnVhdGlvbiAhPT0gdm9pZCAwICYmIChzLnNpemVBdHRlbnVhdGlvbiA9IHQuc2l6ZUF0dGVudWF0aW9uKSwgdC5tYXAgIT09IHZvaWQgMCAmJiAocy5tYXAgPSBpKHQubWFwKSksIHQubWF0Y2FwICE9PSB2b2lkIDAgJiYgKHMubWF0Y2FwID0gaSh0Lm1hdGNhcCkpLCB0LmFscGhhTWFwICE9PSB2b2lkIDAgJiYgKHMuYWxwaGFNYXAgPSBpKHQuYWxwaGFNYXApKSwgdC5idW1wTWFwICE9PSB2b2lkIDAgJiYgKHMuYnVtcE1hcCA9IGkodC5idW1wTWFwKSksIHQuYnVtcFNjYWxlICE9PSB2b2lkIDAgJiYgKHMuYnVtcFNjYWxlID0gdC5idW1wU2NhbGUpLCB0Lm5vcm1hbE1hcCAhPT0gdm9pZCAwICYmIChzLm5vcm1hbE1hcCA9IGkodC5ub3JtYWxNYXApKSwgdC5ub3JtYWxNYXBUeXBlICE9PSB2b2lkIDAgJiYgKHMubm9ybWFsTWFwVHlwZSA9IHQubm9ybWFsTWFwVHlwZSksIHQubm9ybWFsU2NhbGUgIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgbiA9IHQubm9ybWFsU2NhbGU7CiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkobikgPT09ICExICYmIChuID0gWwogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgIG4KICAgICAgICAgICAgXSksIHMubm9ybWFsU2NhbGUgPSBuZXcgVCgpLmZyb21BcnJheShuKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQuZGlzcGxhY2VtZW50TWFwICE9PSB2b2lkIDAgJiYgKHMuZGlzcGxhY2VtZW50TWFwID0gaSh0LmRpc3BsYWNlbWVudE1hcCkpLCB0LmRpc3BsYWNlbWVudFNjYWxlICE9PSB2b2lkIDAgJiYgKHMuZGlzcGxhY2VtZW50U2NhbGUgPSB0LmRpc3BsYWNlbWVudFNjYWxlKSwgdC5kaXNwbGFjZW1lbnRCaWFzICE9PSB2b2lkIDAgJiYgKHMuZGlzcGxhY2VtZW50QmlhcyA9IHQuZGlzcGxhY2VtZW50QmlhcyksIHQucm91Z2huZXNzTWFwICE9PSB2b2lkIDAgJiYgKHMucm91Z2huZXNzTWFwID0gaSh0LnJvdWdobmVzc01hcCkpLCB0Lm1ldGFsbmVzc01hcCAhPT0gdm9pZCAwICYmIChzLm1ldGFsbmVzc01hcCA9IGkodC5tZXRhbG5lc3NNYXApKSwgdC5lbWlzc2l2ZU1hcCAhPT0gdm9pZCAwICYmIChzLmVtaXNzaXZlTWFwID0gaSh0LmVtaXNzaXZlTWFwKSksIHQuZW1pc3NpdmVJbnRlbnNpdHkgIT09IHZvaWQgMCAmJiAocy5lbWlzc2l2ZUludGVuc2l0eSA9IHQuZW1pc3NpdmVJbnRlbnNpdHkpLCB0LnNwZWN1bGFyTWFwICE9PSB2b2lkIDAgJiYgKHMuc3BlY3VsYXJNYXAgPSBpKHQuc3BlY3VsYXJNYXApKSwgdC5zcGVjdWxhckludGVuc2l0eU1hcCAhPT0gdm9pZCAwICYmIChzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gaSh0LnNwZWN1bGFySW50ZW5zaXR5TWFwKSksIHQuc3BlY3VsYXJDb2xvck1hcCAhPT0gdm9pZCAwICYmIChzLnNwZWN1bGFyQ29sb3JNYXAgPSBpKHQuc3BlY3VsYXJDb2xvck1hcCkpLCB0LmVudk1hcCAhPT0gdm9pZCAwICYmIChzLmVudk1hcCA9IGkodC5lbnZNYXApKSwgdC5lbnZNYXBSb3RhdGlvbiAhPT0gdm9pZCAwICYmIHMuZW52TWFwUm90YXRpb24uZnJvbUFycmF5KHQuZW52TWFwUm90YXRpb24pLCB0LmVudk1hcEludGVuc2l0eSAhPT0gdm9pZCAwICYmIChzLmVudk1hcEludGVuc2l0eSA9IHQuZW52TWFwSW50ZW5zaXR5KSwgdC5yZWZsZWN0aXZpdHkgIT09IHZvaWQgMCAmJiAocy5yZWZsZWN0aXZpdHkgPSB0LnJlZmxlY3Rpdml0eSksIHQucmVmcmFjdGlvblJhdGlvICE9PSB2b2lkIDAgJiYgKHMucmVmcmFjdGlvblJhdGlvID0gdC5yZWZyYWN0aW9uUmF0aW8pLCB0LmxpZ2h0TWFwICE9PSB2b2lkIDAgJiYgKHMubGlnaHRNYXAgPSBpKHQubGlnaHRNYXApKSwgdC5saWdodE1hcEludGVuc2l0eSAhPT0gdm9pZCAwICYmIChzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdC5saWdodE1hcEludGVuc2l0eSksIHQuYW9NYXAgIT09IHZvaWQgMCAmJiAocy5hb01hcCA9IGkodC5hb01hcCkpLCB0LmFvTWFwSW50ZW5zaXR5ICE9PSB2b2lkIDAgJiYgKHMuYW9NYXBJbnRlbnNpdHkgPSB0LmFvTWFwSW50ZW5zaXR5KSwgdC5ncmFkaWVudE1hcCAhPT0gdm9pZCAwICYmIChzLmdyYWRpZW50TWFwID0gaSh0LmdyYWRpZW50TWFwKSksIHQuY2xlYXJjb2F0TWFwICE9PSB2b2lkIDAgJiYgKHMuY2xlYXJjb2F0TWFwID0gaSh0LmNsZWFyY29hdE1hcCkpLCB0LmNsZWFyY29hdFJvdWdobmVzc01hcCAhPT0gdm9pZCAwICYmIChzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IGkodC5jbGVhcmNvYXRSb3VnaG5lc3NNYXApKSwgdC5jbGVhcmNvYXROb3JtYWxNYXAgIT09IHZvaWQgMCAmJiAocy5jbGVhcmNvYXROb3JtYWxNYXAgPSBpKHQuY2xlYXJjb2F0Tm9ybWFsTWFwKSksIHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgIT09IHZvaWQgMCAmJiAocy5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBUKCkuZnJvbUFycmF5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKSwgdC5pcmlkZXNjZW5jZU1hcCAhPT0gdm9pZCAwICYmIChzLmlyaWRlc2NlbmNlTWFwID0gaSh0LmlyaWRlc2NlbmNlTWFwKSksIHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgIT09IHZvaWQgMCAmJiAocy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IGkodC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCkpLCB0LnRyYW5zbWlzc2lvbk1hcCAhPT0gdm9pZCAwICYmIChzLnRyYW5zbWlzc2lvbk1hcCA9IGkodC50cmFuc21pc3Npb25NYXApKSwgdC50aGlja25lc3NNYXAgIT09IHZvaWQgMCAmJiAocy50aGlja25lc3NNYXAgPSBpKHQudGhpY2tuZXNzTWFwKSksIHQuYW5pc290cm9weU1hcCAhPT0gdm9pZCAwICYmIChzLmFuaXNvdHJvcHlNYXAgPSBpKHQuYW5pc290cm9weU1hcCkpLCB0LnNoZWVuQ29sb3JNYXAgIT09IHZvaWQgMCAmJiAocy5zaGVlbkNvbG9yTWFwID0gaSh0LnNoZWVuQ29sb3JNYXApKSwgdC5zaGVlblJvdWdobmVzc01hcCAhPT0gdm9pZCAwICYmIChzLnNoZWVuUm91Z2huZXNzTWFwID0gaSh0LnNoZWVuUm91Z2huZXNzTWFwKSksIHM7CiAgICB9CiAgICBzZXRUZXh0dXJlcyh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXMgPSB0LCB0aGlzOwogICAgfQogICAgY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KSB7CiAgICAgICAgcmV0dXJuIGguY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KTsKICAgIH0KICAgIHN0YXRpYyBjcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQpIHsKICAgICAgICBsZXQgZSA9IHsKICAgICAgICAgICAgU2hhZG93TWF0ZXJpYWw6IGlvLAogICAgICAgICAgICBTcHJpdGVNYXRlcmlhbDogdG4sCiAgICAgICAgICAgIFJhd1NoYWRlck1hdGVyaWFsOiBzbywKICAgICAgICAgICAgU2hhZGVyTWF0ZXJpYWw6IHFpLAogICAgICAgICAgICBQb2ludHNNYXRlcmlhbDogb24sCiAgICAgICAgICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsOiBubywKICAgICAgICAgICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWw6IHluLAogICAgICAgICAgICBNZXNoUGhvbmdNYXRlcmlhbDogcm8sCiAgICAgICAgICAgIE1lc2hUb29uTWF0ZXJpYWw6IG9vLAogICAgICAgICAgICBNZXNoTm9ybWFsTWF0ZXJpYWw6IGFvLAogICAgICAgICAgICBNZXNoTGFtYmVydE1hdGVyaWFsOiBobywKICAgICAgICAgICAgTWVzaERlcHRoTWF0ZXJpYWw6IGxvLAogICAgICAgICAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbDogY28sCiAgICAgICAgICAgIE1lc2hCYXNpY01hdGVyaWFsOiBfZSwKICAgICAgICAgICAgTWVzaE1hdGNhcE1hdGVyaWFsOiB1bywKICAgICAgICAgICAgTGluZURhc2hlZE1hdGVyaWFsOiBwbywKICAgICAgICAgICAgTGluZUJhc2ljTWF0ZXJpYWw6IG10LAogICAgICAgICAgICBNYXRlcmlhbDogY3QKICAgICAgICB9OwogICAgICAgIHJldHVybiBuZXcgZVt0XTsKICAgIH0KfSwgTW4gPSBjbGFzcyB7CiAgICBzdGF0aWMgZGVjb2RlVGV4dCh0KSB7CiAgICAgICAgaWYgKGNvbnNvbGUud2FybigiVEhSRUUuTG9hZGVyVXRpbHM6IGRlY29kZVRleHQoKSBoYXMgYmVlbiBkZXByZWNhdGVkIHdpdGggcjE2NSBhbmQgd2lsbCBiZSByZW1vdmVkIHdpdGggcjE3NS4gVXNlIFRleHREZWNvZGVyIGluc3RlYWQuIiksIHR5cGVvZiBUZXh0RGVjb2RlciA8ICJ1IikgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KTsKICAgICAgICBsZXQgZSA9ICIiOwogICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSB0Lmxlbmd0aDsgaSA8IHM7IGkrKyllICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodFtpXSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpOwogICAgICAgIH0gY2F0Y2ggIHsKICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgfQogICAgfQogICAgc3RhdGljIGV4dHJhY3RVcmxCYXNlKHQpIHsKICAgICAgICBsZXQgZSA9IHQubGFzdEluZGV4T2YoIi8iKTsKICAgICAgICByZXR1cm4gZSA9PT0gLTEgPyAiLi8iIDogdC5zbGljZSgwLCBlICsgMSk7CiAgICB9CiAgICBzdGF0aWMgcmVzb2x2ZVVSTCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ICE9ICJzdHJpbmciIHx8IHQgPT09ICIiID8gIiIgOiAoL15odHRwcz86XC9cLy9pLnRlc3QoZSkgJiYgL15cLy8udGVzdCh0KSAmJiAoZSA9IGUucmVwbGFjZSgvKF5odHRwcz86XC9cL1teXC9dKykuKi9pLCAiJDEiKSksIC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KHQpIHx8IC9eZGF0YTouKiwuKiQvaS50ZXN0KHQpIHx8IC9eYmxvYjouKiQvaS50ZXN0KHQpID8gdCA6IGUgKyB0KTsKICAgIH0KfSwgQm8gPSBjbGFzcyBleHRlbmRzIEwgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSAhMCwgdGhpcy50eXBlID0gIkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IiwgdGhpcy5pbnN0YW5jZUNvdW50ID0gMSAvIDA7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0KSwgdGhpcy5pbnN0YW5jZUNvdW50ID0gdC5pbnN0YW5jZUNvdW50LCB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICAgIGxldCB0ID0gc3VwZXIudG9KU09OKCk7CiAgICAgICAgcmV0dXJuIHQuaW5zdGFuY2VDb3VudCA9IHRoaXMuaW5zdGFuY2VDb3VudCwgdC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID0gITAsIHQ7CiAgICB9Cn0sIEVvID0gY2xhc3MgZXh0ZW5kcyB3dCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcih0KTsKICAgIH0KICAgIGxvYWQodCwgZSwgaSwgcykgewogICAgICAgIGxldCBuID0gdGhpcywgciA9IG5ldyBKdChuLm1hbmFnZXIpOwogICAgICAgIHIuc2V0UGF0aChuLnBhdGgpLCByLnNldFJlcXVlc3RIZWFkZXIobi5yZXF1ZXN0SGVhZGVyKSwgci5zZXRXaXRoQ3JlZGVudGlhbHMobi53aXRoQ3JlZGVudGlhbHMpLCByLmxvYWQodCwgZnVuY3Rpb24obykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZShuLnBhcnNlKEpTT04ucGFyc2UobykpKTsKICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgcyA/IHMoYSkgOiBjb25zb2xlLmVycm9yKGEpLCBuLm1hbmFnZXIuaXRlbUVycm9yKHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgaSwgcyk7CiAgICB9CiAgICBwYXJzZSh0KSB7CiAgICAgICAgbGV0IGUgPSB7fSwgaSA9IHt9OwogICAgICAgIGZ1bmN0aW9uIHMocCwgZikgewogICAgICAgICAgICBpZiAoZVtmXSAhPT0gdm9pZCAwKSByZXR1cm4gZVtmXTsKICAgICAgICAgICAgbGV0IHkxID0gcC5pbnRlcmxlYXZlZEJ1ZmZlcnNbZl0sIGcgPSBuKHAsIHkxLmJ1ZmZlciksIHgxID0gY2koeTEudHlwZSwgZyksIGIgPSBuZXcgSmkoeDEsIHkxLnN0cmlkZSk7CiAgICAgICAgICAgIHJldHVybiBiLnV1aWQgPSB5MS51dWlkLCBlW2ZdID0gYiwgYjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbihwLCBmKSB7CiAgICAgICAgICAgIGlmIChpW2ZdICE9PSB2b2lkIDApIHJldHVybiBpW2ZdOwogICAgICAgICAgICBsZXQgeTEgPSBwLmFycmF5QnVmZmVyc1tmXSwgZyA9IG5ldyBVaW50MzJBcnJheSh5MSkuYnVmZmVyOwogICAgICAgICAgICByZXR1cm4gaVtmXSA9IGcsIGc7CiAgICAgICAgfQogICAgICAgIGxldCByID0gdC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID8gbmV3IEJvIDogbmV3IEwsIG8gPSB0LmRhdGEuaW5kZXg7CiAgICAgICAgaWYgKG8gIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgcCA9IGNpKG8udHlwZSwgby5hcnJheSk7CiAgICAgICAgICAgIHIuc2V0SW5kZXgobmV3IFoocCwgMSkpOwogICAgICAgIH0KICAgICAgICBsZXQgYSA9IHQuZGF0YS5hdHRyaWJ1dGVzOwogICAgICAgIGZvcihsZXQgcCBpbiBhKXsKICAgICAgICAgICAgbGV0IGYgPSBhW3BdLCBtOwogICAgICAgICAgICBpZiAoZi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICBsZXQgeTEgPSBzKHQuZGF0YSwgZi5kYXRhKTsKICAgICAgICAgICAgICAgIG0gPSBuZXcgZmkoeTEsIGYuaXRlbVNpemUsIGYub2Zmc2V0LCBmLm5vcm1hbGl6ZWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbGV0IHkxID0gY2koZi50eXBlLCBmLmFycmF5KSwgZyA9IGYuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPyBVZSA6IFo7CiAgICAgICAgICAgICAgICBtID0gbmV3IGcoeTEsIGYuaXRlbVNpemUsIGYubm9ybWFsaXplZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZi5uYW1lICE9PSB2b2lkIDAgJiYgKG0ubmFtZSA9IGYubmFtZSksIGYudXNhZ2UgIT09IHZvaWQgMCAmJiBtLnNldFVzYWdlKGYudXNhZ2UpLCByLnNldEF0dHJpYnV0ZShwLCBtKTsKICAgICAgICB9CiAgICAgICAgbGV0IGwgPSB0LmRhdGEubW9ycGhBdHRyaWJ1dGVzOwogICAgICAgIGlmIChsKSBmb3IobGV0IHAgaW4gbCl7CiAgICAgICAgICAgIGxldCBmID0gbFtwXSwgbSA9IFtdOwogICAgICAgICAgICBmb3IobGV0IHkxID0gMCwgZyA9IGYubGVuZ3RoOyB5MSA8IGc7IHkxKyspewogICAgICAgICAgICAgICAgbGV0IHgxID0gZlt5MV0sIGI7CiAgICAgICAgICAgICAgICBpZiAoeDEuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICAgICAgICAgIGxldCBNID0gcyh0LmRhdGEsIHgxLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIGIgPSBuZXcgZmkoTSwgeDEuaXRlbVNpemUsIHgxLm9mZnNldCwgeDEubm9ybWFsaXplZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCBNID0gY2koeDEudHlwZSwgeDEuYXJyYXkpOwogICAgICAgICAgICAgICAgICAgIGIgPSBuZXcgWihNLCB4MS5pdGVtU2l6ZSwgeDEubm9ybWFsaXplZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4MS5uYW1lICE9PSB2b2lkIDAgJiYgKGIubmFtZSA9IHgxLm5hbWUpLCBtLnB1c2goYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgci5tb3JwaEF0dHJpYnV0ZXNbcF0gPSBtOwogICAgICAgIH0KICAgICAgICB0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmUgJiYgKHIubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSAhMCk7CiAgICAgICAgbGV0IHUgPSB0LmRhdGEuZ3JvdXBzIHx8IHQuZGF0YS5kcmF3Y2FsbHMgfHwgdC5kYXRhLm9mZnNldHM7CiAgICAgICAgaWYgKHUgIT09IHZvaWQgMCkgZm9yKGxldCBwID0gMCwgZiA9IHUubGVuZ3RoOyBwICE9PSBmOyArK3ApewogICAgICAgICAgICBsZXQgbSA9IHVbcF07CiAgICAgICAgICAgIHIuYWRkR3JvdXAobS5zdGFydCwgbS5jb3VudCwgbS5tYXRlcmlhbEluZGV4KTsKICAgICAgICB9CiAgICAgICAgbGV0IGQgPSB0LmRhdGEuYm91bmRpbmdTcGhlcmU7CiAgICAgICAgaWYgKGQgIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgcCA9IG5ldyB3OwogICAgICAgICAgICBkLmNlbnRlciAhPT0gdm9pZCAwICYmIHAuZnJvbUFycmF5KGQuY2VudGVyKSwgci5ib3VuZGluZ1NwaGVyZSA9IG5ldyBodChwLCBkLnJhZGl1cyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Lm5hbWUgJiYgKHIubmFtZSA9IHQubmFtZSksIHQudXNlckRhdGEgJiYgKHIudXNlckRhdGEgPSB0LnVzZXJEYXRhKSwgcjsKICAgIH0KfSwgdmggPSBjbGFzcyBleHRlbmRzIHd0IHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKHQpOwogICAgfQogICAgbG9hZCh0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSB0aGlzLCByID0gdGhpcy5wYXRoID09PSAiIiA/IE1uLmV4dHJhY3RVcmxCYXNlKHQpIDogdGhpcy5wYXRoOwogICAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcjsKICAgICAgICBsZXQgbyA9IG5ldyBKdCh0aGlzLm1hbmFnZXIpOwogICAgICAgIG8uc2V0UGF0aCh0aGlzLnBhdGgpLCBvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSwgby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLCBvLmxvYWQodCwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICBsZXQgbCA9IG51bGw7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsID0gSlNPTi5wYXJzZShhKTsKICAgICAgICAgICAgfSBjYXRjaCAodSkgewogICAgICAgICAgICAgICAgcyAhPT0gdm9pZCAwICYmIHModSksIGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIiArIHQgKyAiLiIsIHUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGMgPSBsLm1ldGFkYXRhOwogICAgICAgICAgICBpZiAoYyA9PT0gdm9pZCAwIHx8IGMudHlwZSA9PT0gdm9pZCAwIHx8IGMudHlwZS50b0xvd2VyQ2FzZSgpID09PSAiZ2VvbWV0cnkiKSB7CiAgICAgICAgICAgICAgICBzICE9PSB2b2lkIDAgJiYgcyhuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiICsgdCkpLCBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIiArIHQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4ucGFyc2UobCwgZSk7CiAgICAgICAgfSwgaSwgcyk7CiAgICB9CiAgICBhc3luYyBsb2FkQXN5bmModCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcywgcyA9IHRoaXMucGF0aCA9PT0gIiIgPyBNbi5leHRyYWN0VXJsQmFzZSh0KSA6IHRoaXMucGF0aDsKICAgICAgICB0aGlzLnJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoIHx8IHM7CiAgICAgICAgbGV0IG4gPSBuZXcgSnQodGhpcy5tYW5hZ2VyKTsKICAgICAgICBuLnNldFBhdGgodGhpcy5wYXRoKSwgbi5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksIG4uc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTsKICAgICAgICBsZXQgciA9IGF3YWl0IG4ubG9hZEFzeW5jKHQsIGUpLCBvID0gSlNPTi5wYXJzZShyKSwgYSA9IG8ubWV0YWRhdGE7CiAgICAgICAgaWYgKGEgPT09IHZvaWQgMCB8fCBhLnR5cGUgPT09IHZvaWQgMCB8fCBhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gImdlb21ldHJ5IikgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIiArIHQpOwogICAgICAgIHJldHVybiBhd2FpdCBpLnBhcnNlQXN5bmMobyk7CiAgICB9CiAgICBwYXJzZSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucyh0LmFuaW1hdGlvbnMpLCBzID0gdGhpcy5wYXJzZVNoYXBlcyh0LnNoYXBlcyksIG4gPSB0aGlzLnBhcnNlR2VvbWV0cmllcyh0Lmdlb21ldHJpZXMsIHMpLCByID0gdGhpcy5wYXJzZUltYWdlcyh0LmltYWdlcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGUgIT09IHZvaWQgMCAmJiBlKGwpOwogICAgICAgIH0pLCBvID0gdGhpcy5wYXJzZVRleHR1cmVzKHQudGV4dHVyZXMsIHIpLCBhID0gdGhpcy5wYXJzZU1hdGVyaWFscyh0Lm1hdGVyaWFscywgbyksIGwgPSB0aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LCBuLCBhLCBvLCBpKSwgYyA9IHRoaXMucGFyc2VTa2VsZXRvbnModC5za2VsZXRvbnMsIGwpOwogICAgICAgIGlmICh0aGlzLmJpbmRTa2VsZXRvbnMobCwgYyksIHRoaXMuYmluZExpZ2h0VGFyZ2V0cyhsKSwgZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCB1ID0gITE7CiAgICAgICAgICAgIGZvcihsZXQgZCBpbiByKWlmIChyW2RdLmRhdGEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICB1ID0gITA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB1ID09PSAhMSAmJiBlKGwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbDsKICAgIH0KICAgIGFzeW5jIHBhcnNlQXN5bmModCkgewogICAgICAgIGxldCBlID0gdGhpcy5wYXJzZUFuaW1hdGlvbnModC5hbmltYXRpb25zKSwgaSA9IHRoaXMucGFyc2VTaGFwZXModC5zaGFwZXMpLCBzID0gdGhpcy5wYXJzZUdlb21ldHJpZXModC5nZW9tZXRyaWVzLCBpKSwgbiA9IGF3YWl0IHRoaXMucGFyc2VJbWFnZXNBc3luYyh0LmltYWdlcyksIHIgPSB0aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcywgbiksIG8gPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKHQubWF0ZXJpYWxzLCByKSwgYSA9IHRoaXMucGFyc2VPYmplY3QodC5vYmplY3QsIHMsIG8sIHIsIGUpLCBsID0gdGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucywgYSk7CiAgICAgICAgcmV0dXJuIHRoaXMuYmluZFNrZWxldG9ucyhhLCBsKSwgdGhpcy5iaW5kTGlnaHRUYXJnZXRzKGEpLCBhOwogICAgfQogICAgcGFyc2VTaGFwZXModCkgewogICAgICAgIGxldCBlID0ge307CiAgICAgICAgaWYgKHQgIT09IHZvaWQgMCkgZm9yKGxldCBpID0gMCwgcyA9IHQubGVuZ3RoOyBpIDwgczsgaSsrKXsKICAgICAgICAgICAgbGV0IG4gPSBuZXcgTWUoKS5mcm9tSlNPTih0W2ldKTsKICAgICAgICAgICAgZVtuLnV1aWRdID0gbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBwYXJzZVNrZWxldG9ucyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB7fSwgcyA9IHt9OwogICAgICAgIGlmIChlLnRyYXZlcnNlKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgbi5pc0JvbmUgJiYgKHNbbi51dWlkXSA9IG4pOwogICAgICAgIH0pLCB0ICE9PSB2b2lkIDApIGZvcihsZXQgbiA9IDAsIHIgPSB0Lmxlbmd0aDsgbiA8IHI7IG4rKyl7CiAgICAgICAgICAgIGxldCBvID0gbmV3IFRyKCkuZnJvbUpTT04odFtuXSwgcyk7CiAgICAgICAgICAgIGlbby51dWlkXSA9IG87CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgfQogICAgcGFyc2VHZW9tZXRyaWVzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHt9OwogICAgICAgIGlmICh0ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IHMgPSBuZXcgRW87CiAgICAgICAgICAgIGZvcihsZXQgbiA9IDAsIHIgPSB0Lmxlbmd0aDsgbiA8IHI7IG4rKyl7CiAgICAgICAgICAgICAgICBsZXQgbywgYSA9IHRbbl07CiAgICAgICAgICAgICAgICBzd2l0Y2goYS50eXBlKXsKICAgICAgICAgICAgICAgICAgICBjYXNlICJCdWZmZXJHZW9tZXRyeSI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOgogICAgICAgICAgICAgICAgICAgICAgICBvID0gcy5wYXJzZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgYS50eXBlIGluIGZoID8gbyA9IGZoW2EudHlwZV0uZnJvbUpTT04oYSwgZSkgOiBjb25zb2xlLndhcm4oYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJHthLnR5cGV9ImApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgby51dWlkID0gYS51dWlkLCBhLm5hbWUgIT09IHZvaWQgMCAmJiAoby5uYW1lID0gYS5uYW1lKSwgYS51c2VyRGF0YSAhPT0gdm9pZCAwICYmIChvLnVzZXJEYXRhID0gYS51c2VyRGF0YSksIGlbYS51dWlkXSA9IG87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICB9CiAgICBwYXJzZU1hdGVyaWFscyh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB7fSwgcyA9IHt9OwogICAgICAgIGlmICh0ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IG4gPSBuZXcgRm87CiAgICAgICAgICAgIG4uc2V0VGV4dHVyZXMoZSk7CiAgICAgICAgICAgIGZvcihsZXQgciA9IDAsIG8gPSB0Lmxlbmd0aDsgciA8IG87IHIrKyl7CiAgICAgICAgICAgICAgICBsZXQgYSA9IHRbcl07CiAgICAgICAgICAgICAgICBpW2EudXVpZF0gPT09IHZvaWQgMCAmJiAoaVthLnV1aWRdID0gbi5wYXJzZShhKSksIHNbYS51dWlkXSA9IGlbYS51dWlkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgIH0KICAgIHBhcnNlQW5pbWF0aW9ucyh0KSB7CiAgICAgICAgbGV0IGUgPSB7fTsKICAgICAgICBpZiAodCAhPT0gdm9pZCAwKSBmb3IobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGxldCBzID0gdFtpXSwgbiA9IHdpLnBhcnNlKHMpOwogICAgICAgICAgICBlW24udXVpZF0gPSBuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KICAgIHBhcnNlSW1hZ2VzKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMsIHMgPSB7fSwgbjsKICAgICAgICBmdW5jdGlvbiByKGEpIHsKICAgICAgICAgICAgcmV0dXJuIGkubWFuYWdlci5pdGVtU3RhcnQoYSksIG4ubG9hZChhLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGkubWFuYWdlci5pdGVtRW5kKGEpOwogICAgICAgICAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaS5tYW5hZ2VyLml0ZW1FcnJvcihhKSwgaS5tYW5hZ2VyLml0ZW1FbmQoYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvKGEpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBhID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBsZXQgbCA9IGEsIGMgPSAvXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChsKSA/IGwgOiBpLnJlc291cmNlUGF0aCArIGw7CiAgICAgICAgICAgICAgICByZXR1cm4gcihjKTsKICAgICAgICAgICAgfSBlbHNlIHJldHVybiBhLmRhdGEgPyB7CiAgICAgICAgICAgICAgICBkYXRhOiBjaShhLnR5cGUsIGEuZGF0YSksCiAgICAgICAgICAgICAgICB3aWR0aDogYS53aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogYS5oZWlnaHQKICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0ICE9PSB2b2lkIDAgJiYgdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxldCBhID0gbmV3IGJuKGUpOwogICAgICAgICAgICBuID0gbmV3IE1pKGEpLCBuLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pOwogICAgICAgICAgICBmb3IobGV0IGwgPSAwLCBjID0gdC5sZW5ndGg7IGwgPCBjOyBsKyspewogICAgICAgICAgICAgICAgbGV0IHUgPSB0W2xdLCBkID0gdS51cmw7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBwID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBmID0gMCwgbSA9IGQubGVuZ3RoOyBmIDwgbTsgZisrKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHkxID0gZFtmXSwgZyA9IG8oeTEpOwogICAgICAgICAgICAgICAgICAgICAgICBnICE9PSBudWxsICYmIChnIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCA/IHAucHVzaChnKSA6IHAucHVzaChuZXcgTHQoZy5kYXRhLCBnLndpZHRoLCBnLmhlaWdodCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc1t1LnV1aWRdID0gbmV3IGJlKHApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IG8odS51cmwpOwogICAgICAgICAgICAgICAgICAgIHNbdS51dWlkXSA9IG5ldyBiZShwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgIH0KICAgIGFzeW5jIHBhcnNlSW1hZ2VzQXN5bmModCkgewogICAgICAgIGxldCBlID0gdGhpcywgaSA9IHt9LCBzOwogICAgICAgIGFzeW5jIGZ1bmN0aW9uIG4ocikgewogICAgICAgICAgICBpZiAodHlwZW9mIHIgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGxldCBvID0gciwgYSA9IC9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KG8pID8gbyA6IGUucmVzb3VyY2VQYXRoICsgbzsKICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBzLmxvYWRBc3luYyhhKTsKICAgICAgICAgICAgfSBlbHNlIHJldHVybiByLmRhdGEgPyB7CiAgICAgICAgICAgICAgICBkYXRhOiBjaShyLnR5cGUsIHIuZGF0YSksCiAgICAgICAgICAgICAgICB3aWR0aDogci53aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogci5oZWlnaHQKICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0ICE9PSB2b2lkIDAgJiYgdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHMgPSBuZXcgTWkodGhpcy5tYW5hZ2VyKSwgcy5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKICAgICAgICAgICAgZm9yKGxldCByID0gMCwgbyA9IHQubGVuZ3RoOyByIDwgbzsgcisrKXsKICAgICAgICAgICAgICAgIGxldCBhID0gdFtyXSwgbCA9IGEudXJsOwogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobCkpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdSA9IDAsIGQgPSBsLmxlbmd0aDsgdSA8IGQ7IHUrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwID0gbFt1XSwgZiA9IGF3YWl0IG4ocCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgIT09IG51bGwgJiYgKGYgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ID8gYy5wdXNoKGYpIDogYy5wdXNoKG5ldyBMdChmLmRhdGEsIGYud2lkdGgsIGYuaGVpZ2h0KSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpW2EudXVpZF0gPSBuZXcgYmUoYyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCBjID0gYXdhaXQgbihhLnVybCk7CiAgICAgICAgICAgICAgICAgICAgaVthLnV1aWRdID0gbmV3IGJlKGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgfQogICAgcGFyc2VUZXh0dXJlcyh0LCBlKSB7CiAgICAgICAgZnVuY3Rpb24gaShuLCByKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgbiA9PSAibnVtYmVyIiA/IG4gOiAoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsIG4pLCByW25dKTsKICAgICAgICB9CiAgICAgICAgbGV0IHMgPSB7fTsKICAgICAgICBpZiAodCAhPT0gdm9pZCAwKSBmb3IobGV0IG4gPSAwLCByID0gdC5sZW5ndGg7IG4gPCByOyBuKyspewogICAgICAgICAgICBsZXQgbyA9IHRbbl07CiAgICAgICAgICAgIG8uaW1hZ2UgPT09IHZvaWQgMCAmJiBjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9yJywgby51dWlkKSwgZVtvLmltYWdlXSA9PT0gdm9pZCAwICYmIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UiLCBvLmltYWdlKTsKICAgICAgICAgICAgbGV0IGEgPSBlW28uaW1hZ2VdLCBsID0gYS5kYXRhLCBjOwogICAgICAgICAgICBBcnJheS5pc0FycmF5KGwpID8gKGMgPSBuZXcgWGksIGwubGVuZ3RoID09PSA2ICYmIChjLm5lZWRzVXBkYXRlID0gITApKSA6IChsICYmIGwuZGF0YSA/IGMgPSBuZXcgTHQgOiBjID0gbmV3IGx0LCBsICYmIChjLm5lZWRzVXBkYXRlID0gITApKSwgYy5zb3VyY2UgPSBhLCBjLnV1aWQgPSBvLnV1aWQsIG8ubmFtZSAhPT0gdm9pZCAwICYmIChjLm5hbWUgPSBvLm5hbWUpLCBvLm1hcHBpbmcgIT09IHZvaWQgMCAmJiAoYy5tYXBwaW5nID0gaShvLm1hcHBpbmcsIHdkKSksIG8uY2hhbm5lbCAhPT0gdm9pZCAwICYmIChjLmNoYW5uZWwgPSBvLmNoYW5uZWwpLCBvLm9mZnNldCAhPT0gdm9pZCAwICYmIGMub2Zmc2V0LmZyb21BcnJheShvLm9mZnNldCksIG8ucmVwZWF0ICE9PSB2b2lkIDAgJiYgYy5yZXBlYXQuZnJvbUFycmF5KG8ucmVwZWF0KSwgby5jZW50ZXIgIT09IHZvaWQgMCAmJiBjLmNlbnRlci5mcm9tQXJyYXkoby5jZW50ZXIpLCBvLnJvdGF0aW9uICE9PSB2b2lkIDAgJiYgKGMucm90YXRpb24gPSBvLnJvdGF0aW9uKSwgby53cmFwICE9PSB2b2lkIDAgJiYgKGMud3JhcFMgPSBpKG8ud3JhcFswXSwgQWgpLCBjLndyYXBUID0gaShvLndyYXBbMV0sIEFoKSksIG8uZm9ybWF0ICE9PSB2b2lkIDAgJiYgKGMuZm9ybWF0ID0gby5mb3JtYXQpLCBvLmludGVybmFsRm9ybWF0ICE9PSB2b2lkIDAgJiYgKGMuaW50ZXJuYWxGb3JtYXQgPSBvLmludGVybmFsRm9ybWF0KSwgby50eXBlICE9PSB2b2lkIDAgJiYgKGMudHlwZSA9IG8udHlwZSksIG8uY29sb3JTcGFjZSAhPT0gdm9pZCAwICYmIChjLmNvbG9yU3BhY2UgPSBvLmNvbG9yU3BhY2UpLCBvLm1pbkZpbHRlciAhPT0gdm9pZCAwICYmIChjLm1pbkZpbHRlciA9IGkoby5taW5GaWx0ZXIsIFNoKSksIG8ubWFnRmlsdGVyICE9PSB2b2lkIDAgJiYgKGMubWFnRmlsdGVyID0gaShvLm1hZ0ZpbHRlciwgU2gpKSwgby5hbmlzb3Ryb3B5ICE9PSB2b2lkIDAgJiYgKGMuYW5pc290cm9weSA9IG8uYW5pc290cm9weSksIG8uZmxpcFkgIT09IHZvaWQgMCAmJiAoYy5mbGlwWSA9IG8uZmxpcFkpLCBvLmdlbmVyYXRlTWlwbWFwcyAhPT0gdm9pZCAwICYmIChjLmdlbmVyYXRlTWlwbWFwcyA9IG8uZ2VuZXJhdGVNaXBtYXBzKSwgby5wcmVtdWx0aXBseUFscGhhICE9PSB2b2lkIDAgJiYgKGMucHJlbXVsdGlwbHlBbHBoYSA9IG8ucHJlbXVsdGlwbHlBbHBoYSksIG8udW5wYWNrQWxpZ25tZW50ICE9PSB2b2lkIDAgJiYgKGMudW5wYWNrQWxpZ25tZW50ID0gby51bnBhY2tBbGlnbm1lbnQpLCBvLmNvbXBhcmVGdW5jdGlvbiAhPT0gdm9pZCAwICYmIChjLmNvbXBhcmVGdW5jdGlvbiA9IG8uY29tcGFyZUZ1bmN0aW9uKSwgby51c2VyRGF0YSAhPT0gdm9pZCAwICYmIChjLnVzZXJEYXRhID0gby51c2VyRGF0YSksIHNbby51dWlkXSA9IGM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgfQogICAgcGFyc2VPYmplY3QodCwgZSwgaSwgcywgbikgewogICAgICAgIGxldCByOwogICAgICAgIGZ1bmN0aW9uIG8oZCkgewogICAgICAgICAgICByZXR1cm4gZVtkXSA9PT0gdm9pZCAwICYmIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLCBkKSwgZVtkXTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYShkKSB7CiAgICAgICAgICAgIGlmIChkICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGQpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGYgPSAwLCBtID0gZC5sZW5ndGg7IGYgPCBtOyBmKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeTEgPSBkW2ZdOwogICAgICAgICAgICAgICAgICAgICAgICBpW3kxXSA9PT0gdm9pZCAwICYmIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLCB5MSksIHAucHVzaChpW3kxXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGlbZF0gPT09IHZvaWQgMCAmJiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIiwgZCksIGlbZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbChkKSB7CiAgICAgICAgICAgIHJldHVybiBzW2RdID09PSB2b2lkIDAgJiYgY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIiwgZCksIHNbZF07CiAgICAgICAgfQogICAgICAgIGxldCBjLCB1OwogICAgICAgIHN3aXRjaCh0LnR5cGUpewogICAgICAgICAgICBjYXNlICJTY2VuZSI6CiAgICAgICAgICAgICAgICByID0gbmV3IF9yLCB0LmJhY2tncm91bmQgIT09IHZvaWQgMCAmJiAoTnVtYmVyLmlzSW50ZWdlcih0LmJhY2tncm91bmQpID8gci5iYWNrZ3JvdW5kID0gbmV3IFAodC5iYWNrZ3JvdW5kKSA6IHIuYmFja2dyb3VuZCA9IGwodC5iYWNrZ3JvdW5kKSksIHQuZW52aXJvbm1lbnQgIT09IHZvaWQgMCAmJiAoci5lbnZpcm9ubWVudCA9IGwodC5lbnZpcm9ubWVudCkpLCB0LmZvZyAhPT0gdm9pZCAwICYmICh0LmZvZy50eXBlID09PSAiRm9nIiA/IHIuZm9nID0gbmV3IE1yKHQuZm9nLmNvbG9yLCB0LmZvZy5uZWFyLCB0LmZvZy5mYXIpIDogdC5mb2cudHlwZSA9PT0gIkZvZ0V4cDIiICYmIChyLmZvZyA9IG5ldyB3cih0LmZvZy5jb2xvciwgdC5mb2cuZGVuc2l0eSkpLCB0LmZvZy5uYW1lICE9PSAiIiAmJiAoci5mb2cubmFtZSA9IHQuZm9nLm5hbWUpKSwgdC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyAhPT0gdm9pZCAwICYmIChyLmJhY2tncm91bmRCbHVycmluZXNzID0gdC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyksIHQuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gdm9pZCAwICYmIChyLmJhY2tncm91bmRJbnRlbnNpdHkgPSB0LmJhY2tncm91bmRJbnRlbnNpdHkpLCB0LmJhY2tncm91bmRSb3RhdGlvbiAhPT0gdm9pZCAwICYmIHIuYmFja2dyb3VuZFJvdGF0aW9uLmZyb21BcnJheSh0LmJhY2tncm91bmRSb3RhdGlvbiksIHQuZW52aXJvbm1lbnRJbnRlbnNpdHkgIT09IHZvaWQgMCAmJiAoci5lbnZpcm9ubWVudEludGVuc2l0eSA9IHQuZW52aXJvbm1lbnRJbnRlbnNpdHkpLCB0LmVudmlyb25tZW50Um90YXRpb24gIT09IHZvaWQgMCAmJiByLmVudmlyb25tZW50Um90YXRpb24uZnJvbUFycmF5KHQuZW52aXJvbm1lbnRSb3RhdGlvbik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiUGVyc3BlY3RpdmVDYW1lcmEiOgogICAgICAgICAgICAgICAgciA9IG5ldyB2dCh0LmZvdiwgdC5hc3BlY3QsIHQubmVhciwgdC5mYXIpLCB0LmZvY3VzICE9PSB2b2lkIDAgJiYgKHIuZm9jdXMgPSB0LmZvY3VzKSwgdC56b29tICE9PSB2b2lkIDAgJiYgKHIuem9vbSA9IHQuem9vbSksIHQuZmlsbUdhdWdlICE9PSB2b2lkIDAgJiYgKHIuZmlsbUdhdWdlID0gdC5maWxtR2F1Z2UpLCB0LmZpbG1PZmZzZXQgIT09IHZvaWQgMCAmJiAoci5maWxtT2Zmc2V0ID0gdC5maWxtT2Zmc2V0KSwgdC52aWV3ICE9PSB2b2lkIDAgJiYgKHIudmlldyA9IE9iamVjdC5hc3NpZ24oe30sIHQudmlldykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIk9ydGhvZ3JhcGhpY0NhbWVyYSI6CiAgICAgICAgICAgICAgICByID0gbmV3IHduKHQubGVmdCwgdC5yaWdodCwgdC50b3AsIHQuYm90dG9tLCB0Lm5lYXIsIHQuZmFyKSwgdC56b29tICE9PSB2b2lkIDAgJiYgKHIuem9vbSA9IHQuem9vbSksIHQudmlldyAhPT0gdm9pZCAwICYmIChyLnZpZXcgPSBPYmplY3QuYXNzaWduKHt9LCB0LnZpZXcpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJBbWJpZW50TGlnaHQiOgogICAgICAgICAgICAgICAgciA9IG5ldyBUbyh0LmNvbG9yLCB0LmludGVuc2l0eSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6CiAgICAgICAgICAgICAgICByID0gbmV3IFNvKHQuY29sb3IsIHQuaW50ZW5zaXR5KSwgci50YXJnZXQgPSB0LnRhcmdldCB8fCAiIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgICAgICAgIHIgPSBuZXcgdm8odC5jb2xvciwgdC5pbnRlbnNpdHksIHQuZGlzdGFuY2UsIHQuZGVjYXkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlJlY3RBcmVhTGlnaHQiOgogICAgICAgICAgICAgICAgciA9IG5ldyBJbyh0LmNvbG9yLCB0LmludGVuc2l0eSwgdC53aWR0aCwgdC5oZWlnaHQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIlNwb3RMaWdodCI6CiAgICAgICAgICAgICAgICByID0gbmV3IE1vKHQuY29sb3IsIHQuaW50ZW5zaXR5LCB0LmRpc3RhbmNlLCB0LmFuZ2xlLCB0LnBlbnVtYnJhLCB0LmRlY2F5KSwgci50YXJnZXQgPSB0LnRhcmdldCB8fCAiIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJIZW1pc3BoZXJlTGlnaHQiOgogICAgICAgICAgICAgICAgciA9IG5ldyBibyh0LmNvbG9yLCB0Lmdyb3VuZENvbG9yLCB0LmludGVuc2l0eSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiTGlnaHRQcm9iZSI6CiAgICAgICAgICAgICAgICByID0gbmV3IHpvKCkuZnJvbUpTT04odCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU2tpbm5lZE1lc2giOgogICAgICAgICAgICAgICAgYyA9IG8odC5nZW9tZXRyeSksIHUgPSBhKHQubWF0ZXJpYWwpLCByID0gbmV3IFNyKGMsIHUpLCB0LmJpbmRNb2RlICE9PSB2b2lkIDAgJiYgKHIuYmluZE1vZGUgPSB0LmJpbmRNb2RlKSwgdC5iaW5kTWF0cml4ICE9PSB2b2lkIDAgJiYgci5iaW5kTWF0cml4LmZyb21BcnJheSh0LmJpbmRNYXRyaXgpLCB0LnNrZWxldG9uICE9PSB2b2lkIDAgJiYgKHIuc2tlbGV0b24gPSB0LnNrZWxldG9uKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJNZXNoIjoKICAgICAgICAgICAgICAgIGMgPSBvKHQuZ2VvbWV0cnkpLCB1ID0gYSh0Lm1hdGVyaWFsKSwgciA9IG5ldyBDdChjLCB1KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJJbnN0YW5jZWRNZXNoIjoKICAgICAgICAgICAgICAgIGMgPSBvKHQuZ2VvbWV0cnkpLCB1ID0gYSh0Lm1hdGVyaWFsKTsKICAgICAgICAgICAgICAgIGxldCBkID0gdC5jb3VudCwgcCA9IHQuaW5zdGFuY2VNYXRyaXgsIGYgPSB0Lmluc3RhbmNlQ29sb3I7CiAgICAgICAgICAgICAgICByID0gbmV3IElyKGMsIHUsIGQpLCByLmluc3RhbmNlTWF0cml4ID0gbmV3IFVlKG5ldyBGbG9hdDMyQXJyYXkocC5hcnJheSksIDE2KSwgZiAhPT0gdm9pZCAwICYmIChyLmluc3RhbmNlQ29sb3IgPSBuZXcgVWUobmV3IEZsb2F0MzJBcnJheShmLmFycmF5KSwgZi5pdGVtU2l6ZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIkJhdGNoZWRNZXNoIjoKICAgICAgICAgICAgICAgIGMgPSBvKHQuZ2VvbWV0cnkpLCB1ID0gYSh0Lm1hdGVyaWFsKSwgciA9IG5ldyB6cih0Lm1heEluc3RhbmNlQ291bnQsIHQubWF4VmVydGV4Q291bnQsIHQubWF4SW5kZXhDb3VudCwgdSksIHIuZ2VvbWV0cnkgPSBjLCByLnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0LnBlck9iamVjdEZydXN0dW1DdWxsZWQsIHIuc29ydE9iamVjdHMgPSB0LnNvcnRPYmplY3RzLCByLl9kcmF3UmFuZ2VzID0gdC5kcmF3UmFuZ2VzLCByLl9yZXNlcnZlZFJhbmdlcyA9IHQucmVzZXJ2ZWRSYW5nZXMsIHIuX3Zpc2liaWxpdHkgPSB0LnZpc2liaWxpdHksIHIuX2FjdGl2ZSA9IHQuYWN0aXZlLCByLl9ib3VuZHMgPSB0LmJvdW5kcy5tYXAoKG0pPT57CiAgICAgICAgICAgICAgICAgICAgbGV0IHkxID0gbmV3IGZ0OwogICAgICAgICAgICAgICAgICAgIHkxLm1pbi5mcm9tQXJyYXkobS5ib3hNaW4pLCB5MS5tYXguZnJvbUFycmF5KG0uYm94TWF4KTsKICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IG5ldyBodDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5yYWRpdXMgPSBtLnNwaGVyZVJhZGl1cywgZy5jZW50ZXIuZnJvbUFycmF5KG0uc3BoZXJlQ2VudGVyKSwgewogICAgICAgICAgICAgICAgICAgICAgICBib3hJbml0aWFsaXplZDogbS5ib3hJbml0aWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgYm94OiB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgc3BoZXJlSW5pdGlhbGl6ZWQ6IG0uc3BoZXJlSW5pdGlhbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNwaGVyZTogZwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSwgci5fbWF4SW5zdGFuY2VDb3VudCA9IHQubWF4SW5zdGFuY2VDb3VudCwgci5fbWF4VmVydGV4Q291bnQgPSB0Lm1heFZlcnRleENvdW50LCByLl9tYXhJbmRleENvdW50ID0gdC5tYXhJbmRleENvdW50LCByLl9nZW9tZXRyeUluaXRpYWxpemVkID0gdC5nZW9tZXRyeUluaXRpYWxpemVkLCByLl9nZW9tZXRyeUNvdW50ID0gdC5nZW9tZXRyeUNvdW50LCByLl9tYXRyaWNlc1RleHR1cmUgPSBsKHQubWF0cmljZXNUZXh0dXJlLnV1aWQpLCB0LmNvbG9yc1RleHR1cmUgIT09IHZvaWQgMCAmJiAoci5fY29sb3JzVGV4dHVyZSA9IGwodC5jb2xvcnNUZXh0dXJlLnV1aWQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJMT0QiOgogICAgICAgICAgICAgICAgciA9IG5ldyBBcjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJMaW5lIjoKICAgICAgICAgICAgICAgIHIgPSBuZXcgbGUobyh0Lmdlb21ldHJ5KSwgYSh0Lm1hdGVyaWFsKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiTGluZUxvb3AiOgogICAgICAgICAgICAgICAgciA9IG5ldyBGcihvKHQuZ2VvbWV0cnkpLCBhKHQubWF0ZXJpYWwpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJMaW5lU2VnbWVudHMiOgogICAgICAgICAgICAgICAgciA9IG5ldyBXdChvKHQuZ2VvbWV0cnkpLCBhKHQubWF0ZXJpYWwpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJQb2ludENsb3VkIjoKICAgICAgICAgICAgY2FzZSAiUG9pbnRzIjoKICAgICAgICAgICAgICAgIHIgPSBuZXcgRXIobyh0Lmdlb21ldHJ5KSwgYSh0Lm1hdGVyaWFsKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU3ByaXRlIjoKICAgICAgICAgICAgICAgIHIgPSBuZXcgdnIoYSh0Lm1hdGVyaWFsKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiR3JvdXAiOgogICAgICAgICAgICAgICAgciA9IG5ldyBOZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJCb25lIjoKICAgICAgICAgICAgICAgIHIgPSBuZXcgZW47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHIgPSBuZXcgRzsKICAgICAgICB9CiAgICAgICAgaWYgKHIudXVpZCA9IHQudXVpZCwgdC5uYW1lICE9PSB2b2lkIDAgJiYgKHIubmFtZSA9IHQubmFtZSksIHQubWF0cml4ICE9PSB2b2lkIDAgPyAoci5tYXRyaXguZnJvbUFycmF5KHQubWF0cml4KSwgdC5tYXRyaXhBdXRvVXBkYXRlICE9PSB2b2lkIDAgJiYgKHIubWF0cml4QXV0b1VwZGF0ZSA9IHQubWF0cml4QXV0b1VwZGF0ZSksIHIubWF0cml4QXV0b1VwZGF0ZSAmJiByLm1hdHJpeC5kZWNvbXBvc2Uoci5wb3NpdGlvbiwgci5xdWF0ZXJuaW9uLCByLnNjYWxlKSkgOiAodC5wb3NpdGlvbiAhPT0gdm9pZCAwICYmIHIucG9zaXRpb24uZnJvbUFycmF5KHQucG9zaXRpb24pLCB0LnJvdGF0aW9uICE9PSB2b2lkIDAgJiYgci5yb3RhdGlvbi5mcm9tQXJyYXkodC5yb3RhdGlvbiksIHQucXVhdGVybmlvbiAhPT0gdm9pZCAwICYmIHIucXVhdGVybmlvbi5mcm9tQXJyYXkodC5xdWF0ZXJuaW9uKSwgdC5zY2FsZSAhPT0gdm9pZCAwICYmIHIuc2NhbGUuZnJvbUFycmF5KHQuc2NhbGUpKSwgdC51cCAhPT0gdm9pZCAwICYmIHIudXAuZnJvbUFycmF5KHQudXApLCB0LmNhc3RTaGFkb3cgIT09IHZvaWQgMCAmJiAoci5jYXN0U2hhZG93ID0gdC5jYXN0U2hhZG93KSwgdC5yZWNlaXZlU2hhZG93ICE9PSB2b2lkIDAgJiYgKHIucmVjZWl2ZVNoYWRvdyA9IHQucmVjZWl2ZVNoYWRvdyksIHQuc2hhZG93ICYmICh0LnNoYWRvdy5pbnRlbnNpdHkgIT09IHZvaWQgMCAmJiAoci5zaGFkb3cuaW50ZW5zaXR5ID0gdC5zaGFkb3cuaW50ZW5zaXR5KSwgdC5zaGFkb3cuYmlhcyAhPT0gdm9pZCAwICYmIChyLnNoYWRvdy5iaWFzID0gdC5zaGFkb3cuYmlhcyksIHQuc2hhZG93Lm5vcm1hbEJpYXMgIT09IHZvaWQgMCAmJiAoci5zaGFkb3cubm9ybWFsQmlhcyA9IHQuc2hhZG93Lm5vcm1hbEJpYXMpLCB0LnNoYWRvdy5yYWRpdXMgIT09IHZvaWQgMCAmJiAoci5zaGFkb3cucmFkaXVzID0gdC5zaGFkb3cucmFkaXVzKSwgdC5zaGFkb3cubWFwU2l6ZSAhPT0gdm9pZCAwICYmIHIuc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KHQuc2hhZG93Lm1hcFNpemUpLCB0LnNoYWRvdy5jYW1lcmEgIT09IHZvaWQgMCAmJiAoci5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCh0LnNoYWRvdy5jYW1lcmEpKSksIHQudmlzaWJsZSAhPT0gdm9pZCAwICYmIChyLnZpc2libGUgPSB0LnZpc2libGUpLCB0LmZydXN0dW1DdWxsZWQgIT09IHZvaWQgMCAmJiAoci5mcnVzdHVtQ3VsbGVkID0gdC5mcnVzdHVtQ3VsbGVkKSwgdC5yZW5kZXJPcmRlciAhPT0gdm9pZCAwICYmIChyLnJlbmRlck9yZGVyID0gdC5yZW5kZXJPcmRlciksIHQudXNlckRhdGEgIT09IHZvaWQgMCAmJiAoci51c2VyRGF0YSA9IHQudXNlckRhdGEpLCB0LmxheWVycyAhPT0gdm9pZCAwICYmIChyLmxheWVycy5tYXNrID0gdC5sYXllcnMpLCB0LmNoaWxkcmVuICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IGQgPSB0LmNoaWxkcmVuOwogICAgICAgICAgICBmb3IobGV0IHAgPSAwOyBwIDwgZC5sZW5ndGg7IHArKylyLmFkZCh0aGlzLnBhcnNlT2JqZWN0KGRbcF0sIGUsIGksIHMsIG4pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHQuYW5pbWF0aW9ucyAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBkID0gdC5hbmltYXRpb25zOwogICAgICAgICAgICBmb3IobGV0IHAgPSAwOyBwIDwgZC5sZW5ndGg7IHArKyl7CiAgICAgICAgICAgICAgICBsZXQgZiA9IGRbcF07CiAgICAgICAgICAgICAgICByLmFuaW1hdGlvbnMucHVzaChuW2ZdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodC50eXBlID09PSAiTE9EIikgewogICAgICAgICAgICB0LmF1dG9VcGRhdGUgIT09IHZvaWQgMCAmJiAoci5hdXRvVXBkYXRlID0gdC5hdXRvVXBkYXRlKTsKICAgICAgICAgICAgbGV0IGQgPSB0LmxldmVsczsKICAgICAgICAgICAgZm9yKGxldCBwID0gMDsgcCA8IGQubGVuZ3RoOyBwKyspewogICAgICAgICAgICAgICAgbGV0IGYgPSBkW3BdLCBtID0gci5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIiwgZi5vYmplY3QpOwogICAgICAgICAgICAgICAgbSAhPT0gdm9pZCAwICYmIHIuYWRkTGV2ZWwobSwgZi5kaXN0YW5jZSwgZi5oeXN0ZXJlc2lzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcjsKICAgIH0KICAgIGJpbmRTa2VsZXRvbnModCwgZSkgewogICAgICAgIE9iamVjdC5rZXlzKGUpLmxlbmd0aCAhPT0gMCAmJiB0LnRyYXZlcnNlKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgaWYgKGkuaXNTa2lubmVkTWVzaCA9PT0gITAgJiYgaS5za2VsZXRvbiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBsZXQgcyA9IGVbaS5za2VsZXRvbl07CiAgICAgICAgICAgICAgICBzID09PSB2b2lkIDAgPyBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOiIsIGkuc2tlbGV0b24pIDogaS5iaW5kKHMsIGkuYmluZE1hdHJpeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGJpbmRMaWdodFRhcmdldHModCkgewogICAgICAgIHQudHJhdmVyc2UoZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS5pc0RpcmVjdGlvbmFsTGlnaHQgfHwgZS5pc1Nwb3RMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IGkgPSBlLnRhcmdldCwgcyA9IHQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsIGkpOwogICAgICAgICAgICAgICAgcyAhPT0gdm9pZCAwID8gZS50YXJnZXQgPSBzIDogZS50YXJnZXQgPSBuZXcgRzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQp9LCB3ZCA9IHsKICAgIFVWTWFwcGluZzogTG8sCiAgICBDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IFVvLAogICAgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBIbCwKICAgIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBxbCwKICAgIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBHbCwKICAgIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBYbAp9LCBBaCA9IHsKICAgIFJlcGVhdFdyYXBwaW5nOiBwciwKICAgIENsYW1wVG9FZGdlV3JhcHBpbmc6IEh0LAogICAgTWlycm9yZWRSZXBlYXRXcmFwcGluZzogZnIKfSwgU2ggPSB7CiAgICBOZWFyZXN0RmlsdGVyOiBVdCwKICAgIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiBKbCwKICAgIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXI6IFpsLAogICAgTGluZWFyRmlsdGVyOiBFdCwKICAgIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6IFlsLAogICAgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiB2bgp9LCBUaCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCksIHRoaXMuaXNJbWFnZUJpdG1hcExvYWRlciA9ICEwLCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPiAidSIgJiYgY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLCB0eXBlb2YgZmV0Y2ggPiAidSIgJiYgY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLiIpLCB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICAgIHByZW11bHRpcGx5QWxwaGE6ICJub25lIgogICAgICAgIH07CiAgICB9CiAgICBzZXRPcHRpb25zKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zID0gdCwgdGhpczsKICAgIH0KICAgIGxvYWQodCwgZSwgaSwgcykgewogICAgICAgIHQgPT09IHZvaWQgMCAmJiAodCA9ICIiKSwgdGhpcy5wYXRoICE9PSB2b2lkIDAgJiYgKHQgPSB0aGlzLnBhdGggKyB0KSwgdCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpOwogICAgICAgIGxldCBuID0gdGhpcywgciA9IHdlLmdldCh0KTsKICAgICAgICBpZiAociAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmIChuLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLCByLnRoZW4pIHsKICAgICAgICAgICAgICAgIHIudGhlbigobCk9PnsKICAgICAgICAgICAgICAgICAgICBlICYmIGUobCksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgICAgICAgICAgfSkuY2F0Y2goKGwpPT57CiAgICAgICAgICAgICAgICAgICAgcyAmJiBzKGwpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBlICYmIGUociksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgICAgICB9LCAwKSwgcjsKICAgICAgICB9CiAgICAgICAgbGV0IG8gPSB7fTsKICAgICAgICBvLmNyZWRlbnRpYWxzID0gdGhpcy5jcm9zc09yaWdpbiA9PT0gImFub255bW91cyIgPyAic2FtZS1vcmlnaW4iIDogImluY2x1ZGUiLCBvLmhlYWRlcnMgPSB0aGlzLnJlcXVlc3RIZWFkZXI7CiAgICAgICAgbGV0IGEgPSBmZXRjaCh0LCBvKS50aGVuKGZ1bmN0aW9uKGwpIHsKICAgICAgICAgICAgcmV0dXJuIGwuYmxvYigpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24obCkgewogICAgICAgICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobCwgT2JqZWN0LmFzc2lnbihuLm9wdGlvbnMsIHsKICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VDb252ZXJzaW9uOiAibm9uZSIKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24obCkgewogICAgICAgICAgICByZXR1cm4gd2UuYWRkKHQsIGwpLCBlICYmIGUobCksIG4ubWFuYWdlci5pdGVtRW5kKHQpLCBsOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGwpIHsKICAgICAgICAgICAgcyAmJiBzKGwpLCB3ZS5yZW1vdmUodCksIG4ubWFuYWdlci5pdGVtRXJyb3IodCksIG4ubWFuYWdlci5pdGVtRW5kKHQpOwogICAgICAgIH0pOwogICAgICAgIHdlLmFkZCh0LCBhKSwgbi5tYW5hZ2VyLml0ZW1TdGFydCh0KTsKICAgIH0KfSwgVnMsIF9uID0gY2xhc3MgewogICAgc3RhdGljIGdldENvbnRleHQoKSB7CiAgICAgICAgcmV0dXJuIFZzID09PSB2b2lkIDAgJiYgKFZzID0gbmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKSwgVnM7CiAgICB9CiAgICBzdGF0aWMgc2V0Q29udGV4dCh0KSB7CiAgICAgICAgVnMgPSB0OwogICAgfQp9LCBJaCA9IGNsYXNzIGV4dGVuZHMgd3QgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIodCk7CiAgICB9CiAgICBsb2FkKHQsIGUsIGksIHMpIHsKICAgICAgICBsZXQgbiA9IHRoaXMsIHIgPSBuZXcgSnQodGhpcy5tYW5hZ2VyKTsKICAgICAgICByLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSwgci5zZXRQYXRoKHRoaXMucGF0aCksIHIuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLCByLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksIHIubG9hZCh0LCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgbCA9IGEuc2xpY2UoMCk7CiAgICAgICAgICAgICAgICBfbi5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKGwsIGZ1bmN0aW9uKHUpIHsKICAgICAgICAgICAgICAgICAgICBlKHUpOwogICAgICAgICAgICAgICAgfSkuY2F0Y2gobyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgICAgIG8obCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBpLCBzKTsKICAgICAgICBmdW5jdGlvbiBvKGEpIHsKICAgICAgICAgICAgcyA/IHMoYSkgOiBjb25zb2xlLmVycm9yKGEpLCBuLm1hbmFnZXIuaXRlbUVycm9yKHQpOwogICAgICAgIH0KICAgIH0KfSwgQ2ggPSBuZXcgRCwgemggPSBuZXcgRCwgRWUgPSBuZXcgRCwgRmggPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHRoaXMudHlwZSA9ICJTdGVyZW9DYW1lcmEiLCB0aGlzLmFzcGVjdCA9IDEsIHRoaXMuZXllU2VwID0gLjA2NCwgdGhpcy5jYW1lcmFMID0gbmV3IHZ0LCB0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKSwgdGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5jYW1lcmFSID0gbmV3IHZ0LCB0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSgyKSwgdGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5fY2FjaGUgPSB7CiAgICAgICAgICAgIGZvY3VzOiBudWxsLAogICAgICAgICAgICBmb3Y6IG51bGwsCiAgICAgICAgICAgIGFzcGVjdDogbnVsbCwKICAgICAgICAgICAgbmVhcjogbnVsbCwKICAgICAgICAgICAgZmFyOiBudWxsLAogICAgICAgICAgICB6b29tOiBudWxsLAogICAgICAgICAgICBleWVTZXA6IG51bGwKICAgICAgICB9OwogICAgfQogICAgdXBkYXRlKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuX2NhY2hlOwogICAgICAgIGlmIChlLmZvY3VzICE9PSB0LmZvY3VzIHx8IGUuZm92ICE9PSB0LmZvdiB8fCBlLmFzcGVjdCAhPT0gdC5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBlLm5lYXIgIT09IHQubmVhciB8fCBlLmZhciAhPT0gdC5mYXIgfHwgZS56b29tICE9PSB0Lnpvb20gfHwgZS5leWVTZXAgIT09IHRoaXMuZXllU2VwKSB7CiAgICAgICAgICAgIGUuZm9jdXMgPSB0LmZvY3VzLCBlLmZvdiA9IHQuZm92LCBlLmFzcGVjdCA9IHQuYXNwZWN0ICogdGhpcy5hc3BlY3QsIGUubmVhciA9IHQubmVhciwgZS5mYXIgPSB0LmZhciwgZS56b29tID0gdC56b29tLCBlLmV5ZVNlcCA9IHRoaXMuZXllU2VwLCBFZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCk7CiAgICAgICAgICAgIGxldCBzID0gZS5leWVTZXAgLyAyLCBuID0gcyAqIGUubmVhciAvIGUuZm9jdXMsIHIgPSBlLm5lYXIgKiBNYXRoLnRhbihEZSAqIGUuZm92ICogLjUpIC8gZS56b29tLCBvLCBhOwogICAgICAgICAgICB6aC5lbGVtZW50c1sxMl0gPSAtcywgQ2guZWxlbWVudHNbMTJdID0gcywgbyA9IC1yICogZS5hc3BlY3QgKyBuLCBhID0gciAqIGUuYXNwZWN0ICsgbiwgRWUuZWxlbWVudHNbMF0gPSAyICogZS5uZWFyIC8gKGEgLSBvKSwgRWUuZWxlbWVudHNbOF0gPSAoYSArIG8pIC8gKGEgLSBvKSwgdGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weShFZSksIG8gPSAtciAqIGUuYXNwZWN0IC0gbiwgYSA9IHIgKiBlLmFzcGVjdCAtIG4sIEVlLmVsZW1lbnRzWzBdID0gMiAqIGUubmVhciAvIChhIC0gbyksIEVlLmVsZW1lbnRzWzhdID0gKGEgKyBvKSAvIChhIC0gbyksIHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoRWUpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKS5tdWx0aXBseSh6aCksIHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLm11bHRpcGx5KENoKTsKICAgIH0KfSwgQmggPSBjbGFzcyBleHRlbmRzIHZ0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSBbXSl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc0FycmF5Q2FtZXJhID0gITAsIHRoaXMuY2FtZXJhcyA9IHQsIHRoaXMuaW5kZXggPSAwOwogICAgfQp9LCBSbyA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAhMCl7CiAgICAgICAgdGhpcy5hdXRvU3RhcnQgPSB0LCB0aGlzLnN0YXJ0VGltZSA9IDAsIHRoaXMub2xkVGltZSA9IDAsIHRoaXMuZWxhcHNlZFRpbWUgPSAwLCB0aGlzLnJ1bm5pbmcgPSAhMTsKICAgIH0KICAgIHN0YXJ0KCkgewogICAgICAgIHRoaXMuc3RhcnRUaW1lID0gRWgoKSwgdGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWUsIHRoaXMuZWxhcHNlZFRpbWUgPSAwLCB0aGlzLnJ1bm5pbmcgPSAhMDsKICAgIH0KICAgIHN0b3AoKSB7CiAgICAgICAgdGhpcy5nZXRFbGFwc2VkVGltZSgpLCB0aGlzLnJ1bm5pbmcgPSAhMSwgdGhpcy5hdXRvU3RhcnQgPSAhMTsKICAgIH0KICAgIGdldEVsYXBzZWRUaW1lKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldERlbHRhKCksIHRoaXMuZWxhcHNlZFRpbWU7CiAgICB9CiAgICBnZXREZWx0YSgpIHsKICAgICAgICBsZXQgdCA9IDA7CiAgICAgICAgaWYgKHRoaXMuYXV0b1N0YXJ0ICYmICF0aGlzLnJ1bm5pbmcpIHJldHVybiB0aGlzLnN0YXJ0KCksIDA7CiAgICAgICAgaWYgKHRoaXMucnVubmluZykgewogICAgICAgICAgICBsZXQgZSA9IEVoKCk7CiAgICAgICAgICAgIHQgPSAoZSAtIHRoaXMub2xkVGltZSkgLyAxZTMsIHRoaXMub2xkVGltZSA9IGUsIHRoaXMuZWxhcHNlZFRpbWUgKz0gdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9Cn07CmZ1bmN0aW9uIEVoKCkgewogICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwp9CnZhciBSZSA9IG5ldyB3LCBSaCA9IG5ldyBidCwgTWQgPSBuZXcgdywga2UgPSBuZXcgdywga2ggPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSAiQXVkaW9MaXN0ZW5lciIsIHRoaXMuY29udGV4dCA9IF9uLmdldENvbnRleHQoKSwgdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSwgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSwgdGhpcy5maWx0ZXIgPSBudWxsLCB0aGlzLnRpbWVEZWx0YSA9IDAsIHRoaXMuX2Nsb2NrID0gbmV3IFJvOwogICAgfQogICAgZ2V0SW5wdXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2FpbjsKICAgIH0KICAgIHJlbW92ZUZpbHRlcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIgIT09IG51bGwgJiYgKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSwgdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLCB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLCB0aGlzLmZpbHRlciA9IG51bGwpLCB0aGlzOwogICAgfQogICAgZ2V0RmlsdGVyKCkgewogICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjsKICAgIH0KICAgIHNldEZpbHRlcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyICE9PSBudWxsID8gKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSwgdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKSA6IHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksIHRoaXMuZmlsdGVyID0gdCwgdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLCB0aGlzLmZpbHRlci5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksIHRoaXM7CiAgICB9CiAgICBnZXRNYXN0ZXJWb2x1bWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwogICAgfQogICAgc2V0TWFzdGVyVm9sdW1lKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKHQsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgLjAxKSwgdGhpczsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKHQpIHsKICAgICAgICBzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KTsKICAgICAgICBsZXQgZSA9IHRoaXMuY29udGV4dC5saXN0ZW5lciwgaSA9IHRoaXMudXA7CiAgICAgICAgaWYgKHRoaXMudGltZURlbHRhID0gdGhpcy5fY2xvY2suZ2V0RGVsdGEoKSwgdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoUmUsIFJoLCBNZCksIGtlLnNldCgwLCAwLCAtMSkuYXBwbHlRdWF0ZXJuaW9uKFJoKSwgZS5wb3NpdGlvblgpIHsKICAgICAgICAgICAgbGV0IHMgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLnRpbWVEZWx0YTsKICAgICAgICAgICAgZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUmUueCwgcyksIGUucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFJlLnksIHMpLCBlLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShSZS56LCBzKSwgZS5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS54LCBzKSwgZS5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS55LCBzKSwgZS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS56LCBzKSwgZS51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaS54LCBzKSwgZS51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaS55LCBzKSwgZS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaS56LCBzKTsKICAgICAgICB9IGVsc2UgZS5zZXRQb3NpdGlvbihSZS54LCBSZS55LCBSZS56KSwgZS5zZXRPcmllbnRhdGlvbihrZS54LCBrZS55LCBrZS56LCBpLngsIGkueSwgaS56KTsKICAgIH0KfSwga28gPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gIkF1ZGlvIiwgdGhpcy5saXN0ZW5lciA9IHQsIHRoaXMuY29udGV4dCA9IHQuY29udGV4dCwgdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSwgdGhpcy5nYWluLmNvbm5lY3QodC5nZXRJbnB1dCgpKSwgdGhpcy5hdXRvcGxheSA9ICExLCB0aGlzLmJ1ZmZlciA9IG51bGwsIHRoaXMuZGV0dW5lID0gMCwgdGhpcy5sb29wID0gITEsIHRoaXMubG9vcFN0YXJ0ID0gMCwgdGhpcy5sb29wRW5kID0gMCwgdGhpcy5vZmZzZXQgPSAwLCB0aGlzLmR1cmF0aW9uID0gdm9pZCAwLCB0aGlzLnBsYXliYWNrUmF0ZSA9IDEsIHRoaXMuaXNQbGF5aW5nID0gITEsIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gITAsIHRoaXMuc291cmNlID0gbnVsbCwgdGhpcy5zb3VyY2VUeXBlID0gImVtcHR5IiwgdGhpcy5fc3RhcnRlZEF0ID0gMCwgdGhpcy5fcHJvZ3Jlc3MgPSAwLCB0aGlzLl9jb25uZWN0ZWQgPSAhMSwgdGhpcy5maWx0ZXJzID0gW107CiAgICB9CiAgICBnZXRPdXRwdXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2FpbjsKICAgIH0KICAgIHNldE5vZGVTb3VyY2UodCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9ICExLCB0aGlzLnNvdXJjZVR5cGUgPSAiYXVkaW9Ob2RlIiwgdGhpcy5zb3VyY2UgPSB0LCB0aGlzLmNvbm5lY3QoKSwgdGhpczsKICAgIH0KICAgIHNldE1lZGlhRWxlbWVudFNvdXJjZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gITEsIHRoaXMuc291cmNlVHlwZSA9ICJtZWRpYU5vZGUiLCB0aGlzLnNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UodCksIHRoaXMuY29ubmVjdCgpLCB0aGlzOwogICAgfQogICAgc2V0TWVkaWFTdHJlYW1Tb3VyY2UodCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9ICExLCB0aGlzLnNvdXJjZVR5cGUgPSAibWVkaWFTdHJlYW1Ob2RlIiwgdGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksIHRoaXMuY29ubmVjdCgpLCB0aGlzOwogICAgfQogICAgc2V0QnVmZmVyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPSB0LCB0aGlzLnNvdXJjZVR5cGUgPSAiYnVmZmVyIiwgdGhpcy5hdXRvcGxheSAmJiB0aGlzLnBsYXkoKSwgdGhpczsKICAgIH0KICAgIHBsYXkodCA9IDApIHsKICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgPT09ICEwKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09ICExKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc3RhcnRlZEF0ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdDsKICAgICAgICBsZXQgZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTsKICAgICAgICByZXR1cm4gZS5idWZmZXIgPSB0aGlzLmJ1ZmZlciwgZS5sb29wID0gdGhpcy5sb29wLCBlLmxvb3BTdGFydCA9IHRoaXMubG9vcFN0YXJ0LCBlLmxvb3BFbmQgPSB0aGlzLmxvb3BFbmQsIGUub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKHRoaXMpLCBlLnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCwgdGhpcy5fcHJvZ3Jlc3MgKyB0aGlzLm9mZnNldCwgdGhpcy5kdXJhdGlvbiksIHRoaXMuaXNQbGF5aW5nID0gITAsIHRoaXMuc291cmNlID0gZSwgdGhpcy5zZXREZXR1bmUodGhpcy5kZXR1bmUpLCB0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSksIHRoaXMuY29ubmVjdCgpOwogICAgfQogICAgcGF1c2UoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSAhMSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmlzUGxheWluZyA9PT0gITAgJiYgKHRoaXMuX3Byb2dyZXNzICs9IE1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZSAtIHRoaXMuX3N0YXJ0ZWRBdCwgMCkgKiB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5sb29wID09PSAhMCAmJiAodGhpcy5fcHJvZ3Jlc3MgPSB0aGlzLl9wcm9ncmVzcyAlICh0aGlzLmR1cmF0aW9uIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksIHRoaXMuc291cmNlLnN0b3AoKSwgdGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGwsIHRoaXMuaXNQbGF5aW5nID0gITEpLCB0aGlzOwogICAgfQogICAgc3RvcCh0ID0gMCkgewogICAgICAgIGlmICh0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gITEpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3MgPSAwLCB0aGlzLnNvdXJjZSAhPT0gbnVsbCAmJiAodGhpcy5zb3VyY2Uuc3RvcCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0KSwgdGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGwpLCB0aGlzLmlzUGxheWluZyA9ICExLCB0aGlzOwogICAgfQogICAgY29ubmVjdCgpIHsKICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pOwogICAgICAgICAgICBmb3IobGV0IHQgPSAxLCBlID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgdCA8IGU7IHQrKyl0aGlzLmZpbHRlcnNbdCAtIDFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTsKICAgICAgICAgICAgdGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGggLSAxXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpOwogICAgICAgIH0gZWxzZSB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpOwogICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0ZWQgPSAhMCwgdGhpczsKICAgIH0KICAgIGRpc2Nvbm5lY3QoKSB7CiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZCAhPT0gITEpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7CiAgICAgICAgICAgICAgICBmb3IobGV0IHQgPSAxLCBlID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgdCA8IGU7IHQrKyl0aGlzLmZpbHRlcnNbdCAtIDFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTsKICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTsKICAgICAgICAgICAgfSBlbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0ZWQgPSAhMSwgdGhpczsKICAgICAgICB9CiAgICB9CiAgICBnZXRGaWx0ZXJzKCkgewogICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnM7CiAgICB9CiAgICBzZXRGaWx0ZXJzKHQpIHsKICAgICAgICByZXR1cm4gdCB8fCAodCA9IFtdKSwgdGhpcy5fY29ubmVjdGVkID09PSAhMCA/ICh0aGlzLmRpc2Nvbm5lY3QoKSwgdGhpcy5maWx0ZXJzID0gdC5zbGljZSgpLCB0aGlzLmNvbm5lY3QoKSkgOiB0aGlzLmZpbHRlcnMgPSB0LnNsaWNlKCksIHRoaXM7CiAgICB9CiAgICBzZXREZXR1bmUodCkgewogICAgICAgIHJldHVybiB0aGlzLmRldHVuZSA9IHQsIHRoaXMuaXNQbGF5aW5nID09PSAhMCAmJiB0aGlzLnNvdXJjZS5kZXR1bmUgIT09IHZvaWQgMCAmJiB0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIC4wMSksIHRoaXM7CiAgICB9CiAgICBnZXREZXR1bmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGV0dW5lOwogICAgfQogICAgZ2V0RmlsdGVyKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXTsKICAgIH0KICAgIHNldEZpbHRlcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RmlsdGVycyh0ID8gWwogICAgICAgICAgICB0CiAgICAgICAgXSA6IFtdKTsKICAgIH0KICAgIHNldFBsYXliYWNrUmF0ZSh0KSB7CiAgICAgICAgaWYgKHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSAhMSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZSA9IHQsIHRoaXMuaXNQbGF5aW5nID09PSAhMCAmJiB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIC4wMSksIHRoaXM7CiAgICB9CiAgICBnZXRQbGF5YmFja1JhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlOwogICAgfQogICAgb25FbmRlZCgpIHsKICAgICAgICB0aGlzLmlzUGxheWluZyA9ICExLCB0aGlzLl9wcm9ncmVzcyA9IDA7CiAgICB9CiAgICBnZXRMb29wKCkgewogICAgICAgIHJldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gITEgPyAoY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKSwgITEpIDogdGhpcy5sb29wOwogICAgfQogICAgc2V0TG9vcCh0KSB7CiAgICAgICAgaWYgKHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSAhMSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxvb3AgPSB0LCB0aGlzLmlzUGxheWluZyA9PT0gITAgJiYgKHRoaXMuc291cmNlLmxvb3AgPSB0aGlzLmxvb3ApLCB0aGlzOwogICAgfQogICAgc2V0TG9vcFN0YXJ0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb29wU3RhcnQgPSB0LCB0aGlzOwogICAgfQogICAgc2V0TG9vcEVuZCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9vcEVuZCA9IHQsIHRoaXM7CiAgICB9CiAgICBnZXRWb2x1bWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwogICAgfQogICAgc2V0Vm9sdW1lKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKHQsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgLjAxKSwgdGhpczsKICAgIH0KICAgIGNvcHkodCwgZSkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsIGUpLCB0LnNvdXJjZVR5cGUgIT09ICJidWZmZXIiID8gKGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIHNvdXJjZSB0eXBlIGNhbm5vdCBiZSBjb3BpZWQuIiksIHRoaXMpIDogKHRoaXMuYXV0b3BsYXkgPSB0LmF1dG9wbGF5LCB0aGlzLmJ1ZmZlciA9IHQuYnVmZmVyLCB0aGlzLmRldHVuZSA9IHQuZGV0dW5lLCB0aGlzLmxvb3AgPSB0Lmxvb3AsIHRoaXMubG9vcFN0YXJ0ID0gdC5sb29wU3RhcnQsIHRoaXMubG9vcEVuZCA9IHQubG9vcEVuZCwgdGhpcy5vZmZzZXQgPSB0Lm9mZnNldCwgdGhpcy5kdXJhdGlvbiA9IHQuZHVyYXRpb24sIHRoaXMucGxheWJhY2tSYXRlID0gdC5wbGF5YmFja1JhdGUsIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdC5oYXNQbGF5YmFja0NvbnRyb2wsIHRoaXMuc291cmNlVHlwZSA9IHQuc291cmNlVHlwZSwgdGhpcy5maWx0ZXJzID0gdC5maWx0ZXJzLnNsaWNlKCksIHRoaXMpOwogICAgfQogICAgY2xvbmUodCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmxpc3RlbmVyKS5jb3B5KHRoaXMsIHQpOwogICAgfQp9LCBQZSA9IG5ldyB3LCBQaCA9IG5ldyBidCwgX2QgPSBuZXcgdywgT2UgPSBuZXcgdywgT2ggPSBjbGFzcyBleHRlbmRzIGtvIHsKICAgIGNvbnN0cnVjdG9yKHQpewogICAgICAgIHN1cGVyKHQpLCB0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKSwgdGhpcy5wYW5uZXIucGFubmluZ01vZGVsID0gIkhSVEYiLCB0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbik7CiAgICB9CiAgICBjb25uZWN0KCkgewogICAgICAgIHN1cGVyLmNvbm5lY3QoKSwgdGhpcy5wYW5uZXIuY29ubmVjdCh0aGlzLmdhaW4pOwogICAgfQogICAgZGlzY29ubmVjdCgpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0KCksIHRoaXMucGFubmVyLmRpc2Nvbm5lY3QodGhpcy5nYWluKTsKICAgIH0KICAgIGdldE91dHB1dCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5wYW5uZXI7CiAgICB9CiAgICBnZXRSZWZEaXN0YW5jZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7CiAgICB9CiAgICBzZXRSZWZEaXN0YW5jZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdCwgdGhpczsKICAgIH0KICAgIGdldFJvbGxvZmZGYWN0b3IoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7CiAgICB9CiAgICBzZXRSb2xsb2ZmRmFjdG9yKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHQsIHRoaXM7CiAgICB9CiAgICBnZXREaXN0YW5jZU1vZGVsKCkgewogICAgICAgIHJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsOwogICAgfQogICAgc2V0RGlzdGFuY2VNb2RlbCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWwgPSB0LCB0aGlzOwogICAgfQogICAgZ2V0TWF4RGlzdGFuY2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlOwogICAgfQogICAgc2V0TWF4RGlzdGFuY2UodCkgewogICAgICAgIHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXREaXJlY3Rpb25hbENvbmUodCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZSA9IHQsIHRoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlID0gZSwgdGhpcy5wYW5uZXIuY29uZU91dGVyR2FpbiA9IGksIHRoaXM7CiAgICB9CiAgICB1cGRhdGVNYXRyaXhXb3JsZCh0KSB7CiAgICAgICAgaWYgKHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gITAgJiYgdGhpcy5pc1BsYXlpbmcgPT09ICExKSByZXR1cm47CiAgICAgICAgdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoUGUsIFBoLCBfZCksIE9lLnNldCgwLCAwLCAxKS5hcHBseVF1YXRlcm5pb24oUGgpOwogICAgICAgIGxldCBlID0gdGhpcy5wYW5uZXI7CiAgICAgICAgaWYgKGUucG9zaXRpb25YKSB7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7CiAgICAgICAgICAgIGUucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFBlLngsIGkpLCBlLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShQZS55LCBpKSwgZS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUGUueiwgaSksIGUub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKE9lLngsIGkpLCBlLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShPZS55LCBpKSwgZS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoT2UueiwgaSk7CiAgICAgICAgfSBlbHNlIGUuc2V0UG9zaXRpb24oUGUueCwgUGUueSwgUGUueiksIGUuc2V0T3JpZW50YXRpb24oT2UueCwgT2UueSwgT2Uueik7CiAgICB9Cn0sIE5oID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSA9IDIwNDgpewogICAgICAgIHRoaXMuYW5hbHlzZXIgPSB0LmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSwgdGhpcy5hbmFseXNlci5mZnRTaXplID0gZSwgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCksIHQuZ2V0T3V0cHV0KCkuY29ubmVjdCh0aGlzLmFuYWx5c2VyKTsKICAgIH0KICAgIGdldEZyZXF1ZW5jeURhdGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKSwgdGhpcy5kYXRhOwogICAgfQogICAgZ2V0QXZlcmFnZUZyZXF1ZW5jeSgpIHsKICAgICAgICBsZXQgdCA9IDAsIGUgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKyl0ICs9IGVbaV07CiAgICAgICAgcmV0dXJuIHQgLyBlLmxlbmd0aDsKICAgIH0KfSwgUG8gPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpKXsKICAgICAgICB0aGlzLmJpbmRpbmcgPSB0LCB0aGlzLnZhbHVlU2l6ZSA9IGk7CiAgICAgICAgbGV0IHMsIG4sIHI7CiAgICAgICAgc3dpdGNoKGUpewogICAgICAgICAgICBjYXNlICJxdWF0ZXJuaW9uIjoKICAgICAgICAgICAgICAgIHMgPSB0aGlzLl9zbGVycCwgbiA9IHRoaXMuX3NsZXJwQWRkaXRpdmUsIHIgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbiwgdGhpcy5idWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KGkgKiA2KSwgdGhpcy5fd29ya0luZGV4ID0gNTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICBjYXNlICJib29sIjoKICAgICAgICAgICAgICAgIHMgPSB0aGlzLl9zZWxlY3QsIG4gPSB0aGlzLl9zZWxlY3QsIHIgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIsIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGkgKiA1KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcyA9IHRoaXMuX2xlcnAsIG4gPSB0aGlzLl9sZXJwQWRkaXRpdmUsIHIgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYywgdGhpcy5idWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KGkgKiA1KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gcywgdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUgPSBuLCB0aGlzLl9zZXRJZGVudGl0eSA9IHIsIHRoaXMuX29yaWdJbmRleCA9IDMsIHRoaXMuX2FkZEluZGV4ID0gNCwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMCwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwLCB0aGlzLnVzZUNvdW50ID0gMCwgdGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7CiAgICB9CiAgICBhY2N1bXVsYXRlKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuYnVmZmVyLCBzID0gdGhpcy52YWx1ZVNpemUsIG4gPSB0ICogcyArIHMsIHIgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7CiAgICAgICAgaWYgKHIgPT09IDApIHsKICAgICAgICAgICAgZm9yKGxldCBvID0gMDsgbyAhPT0gczsgKytvKWlbbiArIG9dID0gaVtvXTsKICAgICAgICAgICAgciA9IGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgciArPSBlOwogICAgICAgICAgICBsZXQgbyA9IGUgLyByOwogICAgICAgICAgICB0aGlzLl9taXhCdWZmZXJSZWdpb24oaSwgbiwgMCwgbywgcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IHI7CiAgICB9CiAgICBhY2N1bXVsYXRlQWRkaXRpdmUodCkgewogICAgICAgIGxldCBlID0gdGhpcy5idWZmZXIsIGkgPSB0aGlzLnZhbHVlU2l6ZSwgcyA9IGkgKiB0aGlzLl9hZGRJbmRleDsKICAgICAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9PT0gMCAmJiB0aGlzLl9zZXRJZGVudGl0eSgpLCB0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShlLCBzLCAwLCB0LCBpKSwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgKz0gdDsKICAgIH0KICAgIGFwcGx5KHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMudmFsdWVTaXplLCBpID0gdGhpcy5idWZmZXIsIHMgPSB0ICogZSArIGUsIG4gPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsIHIgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSwgbyA9IHRoaXMuYmluZGluZzsKICAgICAgICBpZiAodGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMCwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwLCBuIDwgMSkgewogICAgICAgICAgICBsZXQgYSA9IGUgKiB0aGlzLl9vcmlnSW5kZXg7CiAgICAgICAgICAgIHRoaXMuX21peEJ1ZmZlclJlZ2lvbihpLCBzLCBhLCAxIC0gbiwgZSk7CiAgICAgICAgfQogICAgICAgIHIgPiAwICYmIHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKGksIHMsIHRoaXMuX2FkZEluZGV4ICogZSwgMSwgZSk7CiAgICAgICAgZm9yKGxldCBhID0gZSwgbCA9IGUgKyBlOyBhICE9PSBsOyArK2EpaWYgKGlbYV0gIT09IGlbYSArIGVdKSB7CiAgICAgICAgICAgIG8uc2V0VmFsdWUoaSwgcyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHNhdmVPcmlnaW5hbFN0YXRlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5iaW5kaW5nLCBlID0gdGhpcy5idWZmZXIsIGkgPSB0aGlzLnZhbHVlU2l6ZSwgcyA9IGkgKiB0aGlzLl9vcmlnSW5kZXg7CiAgICAgICAgdC5nZXRWYWx1ZShlLCBzKTsKICAgICAgICBmb3IobGV0IG4gPSBpLCByID0gczsgbiAhPT0gcjsgKytuKWVbbl0gPSBlW3MgKyBuICUgaV07CiAgICAgICAgdGhpcy5fc2V0SWRlbnRpdHkoKSwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMCwgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwOwogICAgfQogICAgcmVzdG9yZU9yaWdpbmFsU3RhdGUoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7CiAgICAgICAgdGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLCB0KTsKICAgIH0KICAgIF9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemUsIGUgPSB0ICsgdGhpcy52YWx1ZVNpemU7CiAgICAgICAgZm9yKGxldCBpID0gdDsgaSA8IGU7IGkrKyl0aGlzLmJ1ZmZlcltpXSA9IDA7CiAgICB9CiAgICBfc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKSB7CiAgICAgICAgdGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKSwgdGhpcy5idWZmZXJbdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZSArIDNdID0gMTsKICAgIH0KICAgIF9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLl9vcmlnSW5kZXggKiB0aGlzLnZhbHVlU2l6ZSwgZSA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemU7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVTaXplOyBpKyspdGhpcy5idWZmZXJbZSArIGldID0gdGhpcy5idWZmZXJbdCArIGldOwogICAgfQogICAgX3NlbGVjdCh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgaWYgKHMgPj0gLjUpIGZvcihsZXQgciA9IDA7IHIgIT09IG47ICsrcil0W2UgKyByXSA9IHRbaSArIHJdOwogICAgfQogICAgX3NsZXJwKHQsIGUsIGksIHMpIHsKICAgICAgICBidC5zbGVycEZsYXQodCwgZSwgdCwgZSwgdCwgaSwgcyk7CiAgICB9CiAgICBfc2xlcnBBZGRpdGl2ZSh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgbGV0IHIgPSB0aGlzLl93b3JrSW5kZXggKiBuOwogICAgICAgIGJ0Lm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsIHIsIHQsIGUsIHQsIGkpLCBidC5zbGVycEZsYXQodCwgZSwgdCwgZSwgdCwgciwgcyk7CiAgICB9CiAgICBfbGVycCh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgbGV0IHIgPSAxIC0gczsKICAgICAgICBmb3IobGV0IG8gPSAwOyBvICE9PSBuOyArK28pewogICAgICAgICAgICBsZXQgYSA9IGUgKyBvOwogICAgICAgICAgICB0W2FdID0gdFthXSAqIHIgKyB0W2kgKyBvXSAqIHM7CiAgICAgICAgfQogICAgfQogICAgX2xlcnBBZGRpdGl2ZSh0LCBlLCBpLCBzLCBuKSB7CiAgICAgICAgZm9yKGxldCByID0gMDsgciAhPT0gbjsgKytyKXsKICAgICAgICAgICAgbGV0IG8gPSBlICsgcjsKICAgICAgICAgICAgdFtvXSA9IHRbb10gKyB0W2kgKyByXSAqIHM7CiAgICAgICAgfQogICAgfQp9LCBKbyA9ICJcXFtcXF1cXC46XFwvIiwgdmQgPSBuZXcgUmVnRXhwKCJbIiArIEpvICsgIl0iLCAiZyIpLCBabyA9ICJbXiIgKyBKbyArICJdIiwgQWQgPSAiW14iICsgSm8ucmVwbGFjZSgiXFwuIiwgIiIpICsgIl0iLCBTZCA9IC8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsIFpvKSwgVGQgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIiwgQWQpLCBJZCA9IC8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCBabyksIENkID0gL1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCBabyksIHpkID0gbmV3IFJlZ0V4cCgiXiIgKyBTZCArIFRkICsgSWQgKyBDZCArICIkIiksIEZkID0gWwogICAgIm1hdGVyaWFsIiwKICAgICJtYXRlcmlhbHMiLAogICAgImJvbmVzIiwKICAgICJtYXAiCl0sIE9vID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSl7CiAgICAgICAgbGV0IHMgPSBpIHx8IEoucGFyc2VUcmFja05hbWUoZSk7CiAgICAgICAgdGhpcy5fdGFyZ2V0R3JvdXAgPSB0LCB0aGlzLl9iaW5kaW5ncyA9IHQuc3Vic2NyaWJlXyhlLCBzKTsKICAgIH0KICAgIGdldFZhbHVlKHQsIGUpIHsKICAgICAgICB0aGlzLmJpbmQoKTsKICAgICAgICBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgcyA9IHRoaXMuX2JpbmRpbmdzW2ldOwogICAgICAgIHMgIT09IHZvaWQgMCAmJiBzLmdldFZhbHVlKHQsIGUpOwogICAgfQogICAgc2V0VmFsdWUodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5fYmluZGluZ3M7CiAgICAgICAgZm9yKGxldCBzID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gaS5sZW5ndGg7IHMgIT09IG47ICsrcylpW3NdLnNldFZhbHVlKHQsIGUpOwogICAgfQogICAgYmluZCgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX2JpbmRpbmdzOwogICAgICAgIGZvcihsZXQgZSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgaSA9IHQubGVuZ3RoOyBlICE9PSBpOyArK2UpdFtlXS5iaW5kKCk7CiAgICB9CiAgICB1bmJpbmQoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLl9iaW5kaW5nczsKICAgICAgICBmb3IobGV0IGUgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIGkgPSB0Lmxlbmd0aDsgZSAhPT0gaTsgKytlKXRbZV0udW5iaW5kKCk7CiAgICB9Cn0sIEogPSBjbGFzcyBoIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHRoaXMucGF0aCA9IGUsIHRoaXMucGFyc2VkUGF0aCA9IGkgfHwgaC5wYXJzZVRyYWNrTmFtZShlKSwgdGhpcy5ub2RlID0gaC5maW5kTm9kZSh0LCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpLCB0aGlzLnJvb3ROb2RlID0gdCwgdGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQsIHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kOwogICAgfQogICAgc3RhdGljIGNyZWF0ZSh0LCBlLCBpKSB7CiAgICAgICAgcmV0dXJuIHQgJiYgdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwID8gbmV3IGguQ29tcG9zaXRlKHQsIGUsIGkpIDogbmV3IGgodCwgZSwgaSk7CiAgICB9CiAgICBzdGF0aWMgc2FuaXRpemVOb2RlTmFtZSh0KSB7CiAgICAgICAgcmV0dXJuIHQucmVwbGFjZSgvXHMvZywgIl8iKS5yZXBsYWNlKHZkLCAiIik7CiAgICB9CiAgICBzdGF0aWMgcGFyc2VUcmFja05hbWUodCkgewogICAgICAgIGxldCBlID0gemQuZXhlYyh0KTsKICAgICAgICBpZiAoZSA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICIgKyB0KTsKICAgICAgICBsZXQgaSA9IHsKICAgICAgICAgICAgbm9kZU5hbWU6IGVbMl0sCiAgICAgICAgICAgIG9iamVjdE5hbWU6IGVbM10sCiAgICAgICAgICAgIG9iamVjdEluZGV4OiBlWzRdLAogICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGVbNV0sCiAgICAgICAgICAgIHByb3BlcnR5SW5kZXg6IGVbNl0KICAgICAgICB9LCBzID0gaS5ub2RlTmFtZSAmJiBpLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgaWYgKHMgIT09IHZvaWQgMCAmJiBzICE9PSAtMSkgewogICAgICAgICAgICBsZXQgbiA9IGkubm9kZU5hbWUuc3Vic3RyaW5nKHMgKyAxKTsKICAgICAgICAgICAgRmQuaW5kZXhPZihuKSAhPT0gLTEgJiYgKGkubm9kZU5hbWUgPSBpLm5vZGVOYW1lLnN1YnN0cmluZygwLCBzKSwgaS5vYmplY3ROYW1lID0gbik7CiAgICAgICAgfQogICAgICAgIGlmIChpLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCBpLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIiArIHQpOwogICAgICAgIHJldHVybiBpOwogICAgfQogICAgc3RhdGljIGZpbmROb2RlKHQsIGUpIHsKICAgICAgICBpZiAoZSA9PT0gdm9pZCAwIHx8IGUgPT09ICIiIHx8IGUgPT09ICIuIiB8fCBlID09PSAtMSB8fCBlID09PSB0Lm5hbWUgfHwgZSA9PT0gdC51dWlkKSByZXR1cm4gdDsKICAgICAgICBpZiAodC5za2VsZXRvbikgewogICAgICAgICAgICBsZXQgaSA9IHQuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShlKTsKICAgICAgICAgICAgaWYgKGkgIT09IHZvaWQgMCkgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICAgIGlmICh0LmNoaWxkcmVuKSB7CiAgICAgICAgICAgIGxldCBpID0gZnVuY3Rpb24obikgewogICAgICAgICAgICAgICAgZm9yKGxldCByID0gMDsgciA8IG4ubGVuZ3RoOyByKyspewogICAgICAgICAgICAgICAgICAgIGxldCBvID0gbltyXTsKICAgICAgICAgICAgICAgICAgICBpZiAoby5uYW1lID09PSBlIHx8IG8udXVpZCA9PT0gZSkgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBpKG8uY2hpbGRyZW4pOwogICAgICAgICAgICAgICAgICAgIGlmIChhKSByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9LCBzID0gaSh0LmNoaWxkcmVuKTsKICAgICAgICAgICAgaWYgKHMpIHJldHVybiBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIF9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpIHt9CiAgICBfc2V0VmFsdWVfdW5hdmFpbGFibGUoKSB7fQogICAgX2dldFZhbHVlX2RpcmVjdCh0LCBlKSB7CiAgICAgICAgdFtlXSA9IHRoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXTsKICAgIH0KICAgIF9nZXRWYWx1ZV9hcnJheSh0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CiAgICAgICAgZm9yKGxldCBzID0gMCwgbiA9IGkubGVuZ3RoOyBzICE9PSBuOyArK3MpdFtlKytdID0gaVtzXTsKICAgIH0KICAgIF9nZXRWYWx1ZV9hcnJheUVsZW1lbnQodCwgZSkgewogICAgICAgIHRbZV0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XTsKICAgIH0KICAgIF9nZXRWYWx1ZV90b0FycmF5KHQsIGUpIHsKICAgICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSh0LCBlKTsKICAgIH0KICAgIF9zZXRWYWx1ZV9kaXJlY3QodCwgZSkgewogICAgICAgIHRoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXSA9IHRbZV07CiAgICB9CiAgICBfc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKHQsIGUpIHsKICAgICAgICB0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gPSB0W2VdLCB0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9ICEwOwogICAgfQogICAgX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsIGUpIHsKICAgICAgICB0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gPSB0W2VdLCB0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gITA7CiAgICB9CiAgICBfc2V0VmFsdWVfYXJyYXkodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwogICAgICAgIGZvcihsZXQgcyA9IDAsIG4gPSBpLmxlbmd0aDsgcyAhPT0gbjsgKytzKWlbc10gPSB0W2UrK107CiAgICB9CiAgICBfc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUodCwgZSkgewogICAgICAgIGxldCBpID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwogICAgICAgIGZvcihsZXQgcyA9IDAsIG4gPSBpLmxlbmd0aDsgcyAhPT0gbjsgKytzKWlbc10gPSB0W2UrK107CiAgICAgICAgdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KICAgIF9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKICAgICAgICBmb3IobGV0IHMgPSAwLCBuID0gaS5sZW5ndGg7IHMgIT09IG47ICsrcylpW3NdID0gdFtlKytdOwogICAgICAgIHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KICAgIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnQodCwgZSkgewogICAgICAgIHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdID0gdFtlXTsKICAgIH0KICAgIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUodCwgZSkgewogICAgICAgIHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdID0gdFtlXSwgdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KICAgIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LCBlKSB7CiAgICAgICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF0gPSB0W2VdLCB0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gITA7CiAgICB9CiAgICBfc2V0VmFsdWVfZnJvbUFycmF5KHQsIGUpIHsKICAgICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsIGUpOwogICAgfQogICAgX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSh0LCBlKSB7CiAgICAgICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LCBlKSwgdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSAhMDsKICAgIH0KICAgIF9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LCBlKSB7CiAgICAgICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LCBlKSwgdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9ICEwOwogICAgfQogICAgX2dldFZhbHVlX3VuYm91bmQodCwgZSkgewogICAgICAgIHRoaXMuYmluZCgpLCB0aGlzLmdldFZhbHVlKHQsIGUpOwogICAgfQogICAgX3NldFZhbHVlX3VuYm91bmQodCwgZSkgewogICAgICAgIHRoaXMuYmluZCgpLCB0aGlzLnNldFZhbHVlKHQsIGUpOwogICAgfQogICAgYmluZCgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMubm9kZSwgZSA9IHRoaXMucGFyc2VkUGF0aCwgaSA9IGUub2JqZWN0TmFtZSwgcyA9IGUucHJvcGVydHlOYW1lLCBuID0gZS5wcm9wZXJ0eUluZGV4OwogICAgICAgIGlmICh0IHx8ICh0ID0gaC5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLCBlLm5vZGVOYW1lKSwgdGhpcy5ub2RlID0gdCksIHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZSwgdGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlLCAhdCkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLlByb3BlcnR5QmluZGluZzogTm8gdGFyZ2V0IG5vZGUgZm91bmQgZm9yIHRyYWNrOiAiICsgdGhpcy5wYXRoICsgIi4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaSkgewogICAgICAgICAgICBsZXQgbCA9IGUub2JqZWN0SW5kZXg7CiAgICAgICAgICAgIHN3aXRjaChpKXsKICAgICAgICAgICAgICAgIGNhc2UgIm1hdGVyaWFscyI6CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0Lm1hdGVyaWFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdC5tYXRlcmlhbC5tYXRlcmlhbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ID0gdC5tYXRlcmlhbC5tYXRlcmlhbHM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJib25lcyI6CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0LnNrZWxldG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSB0LnNrZWxldG9uLmJvbmVzOwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgYyA9IDA7IGMgPCB0Lmxlbmd0aDsgYysrKWlmICh0W2NdLm5hbWUgPT09IGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIm1hcCI6CiAgICAgICAgICAgICAgICAgICAgaWYgKCJtYXAiIGluIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQubWFwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0Lm1hdGVyaWFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdC5tYXRlcmlhbC5tYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWFwIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hcC4iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ID0gdC5tYXRlcmlhbC5tYXA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICh0W2ldID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ID0gdFtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBpZiAodFtsXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLiIsIHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQgPSB0W2xdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCByID0gdFtzXTsKICAgICAgICBpZiAociA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCBsID0gZS5ub2RlTmFtZTsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIiArIGwgKyAiLiIgKyBzICsgIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIsIHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBvID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7CiAgICAgICAgdGhpcy50YXJnZXRPYmplY3QgPSB0LCB0LmlzTWF0ZXJpYWwgPT09ICEwID8gbyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZSA6IHQuaXNPYmplY3QzRCA9PT0gITAgJiYgKG8gPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7CiAgICAgICAgbGV0IGEgPSB0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDsKICAgICAgICBpZiAobiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmIChzID09PSAibW9ycGhUYXJnZXRJbmZsdWVuY2VzIikgewogICAgICAgICAgICAgICAgaWYgKCF0Lmdlb21ldHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuXSAhPT0gdm9pZCAwICYmIChuID0gdC5tb3JwaFRhcmdldERpY3Rpb25hcnlbbl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGEgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudCwgdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gciwgdGhpcy5wcm9wZXJ0eUluZGV4ID0gbjsKICAgICAgICB9IGVsc2Ugci5mcm9tQXJyYXkgIT09IHZvaWQgMCAmJiByLnRvQXJyYXkgIT09IHZvaWQgMCA/IChhID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSwgdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gcikgOiBBcnJheS5pc0FycmF5KHIpID8gKGEgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LCB0aGlzLnJlc29sdmVkUHJvcGVydHkgPSByKSA6IHRoaXMucHJvcGVydHlOYW1lID0gczsKICAgICAgICB0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2FdLCB0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1thXVtvXTsKICAgIH0KICAgIHVuYmluZCgpIHsKICAgICAgICB0aGlzLm5vZGUgPSBudWxsLCB0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCwgdGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7CiAgICB9Cn07CkouQ29tcG9zaXRlID0gT287CkoucHJvdG90eXBlLkJpbmRpbmdUeXBlID0gewogICAgRGlyZWN0OiAwLAogICAgRW50aXJlQXJyYXk6IDEsCiAgICBBcnJheUVsZW1lbnQ6IDIsCiAgICBIYXNGcm9tVG9BcnJheTogMwp9OwpKLnByb3RvdHlwZS5WZXJzaW9uaW5nID0gewogICAgTm9uZTogMCwKICAgIE5lZWRzVXBkYXRlOiAxLAogICAgTWF0cml4V29ybGROZWVkc1VwZGF0ZTogMgp9OwpKLnByb3RvdHlwZS5HZXR0ZXJCeUJpbmRpbmdUeXBlID0gWwogICAgSi5wcm90b3R5cGUuX2dldFZhbHVlX2RpcmVjdCwKICAgIEoucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSwKICAgIEoucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsCiAgICBKLnByb3RvdHlwZS5fZ2V0VmFsdWVfdG9BcnJheQpdOwpKLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyA9IFsKICAgIFsKICAgICAgICBKLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LAogICAgICAgIEoucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUsCiAgICAgICAgSi5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlCiAgICBdLAogICAgWwogICAgICAgIEoucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSwKICAgICAgICBKLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsCiAgICAgICAgSi5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUKICAgIF0sCiAgICBbCiAgICAgICAgSi5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudCwKICAgICAgICBKLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLAogICAgICAgIEoucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZQogICAgXSwKICAgIFsKICAgICAgICBKLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LAogICAgICAgIEoucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUsCiAgICAgICAgSi5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlCiAgICBdCl07CnZhciBWaCA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgdGhpcy5pc0FuaW1hdGlvbk9iamVjdEdyb3VwID0gITAsIHRoaXMudXVpZCA9IEl0KCksIHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7CiAgICAgICAgbGV0IHQgPSB7fTsKICAgICAgICB0aGlzLl9pbmRpY2VzQnlVVUlEID0gdDsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gczsgKytpKXRbYXJndW1lbnRzW2ldLnV1aWRdID0gaTsKICAgICAgICB0aGlzLl9wYXRocyA9IFtdLCB0aGlzLl9wYXJzZWRQYXRocyA9IFtdLCB0aGlzLl9iaW5kaW5ncyA9IFtdLCB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsKICAgICAgICBsZXQgZSA9IHRoaXM7CiAgICAgICAgdGhpcy5zdGF0cyA9IHsKICAgICAgICAgICAgb2JqZWN0czogewogICAgICAgICAgICAgICAgZ2V0IHRvdGFsICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fb2JqZWN0cy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IGluVXNlICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b3RhbCAtIGUubkNhY2hlZE9iamVjdHNfOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQgYmluZGluZ3NQZXJPYmplY3QgKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGUuX2JpbmRpbmdzLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBhZGQoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLl9vYmplY3RzLCBlID0gdGhpcy5faW5kaWNlc0J5VVVJRCwgaSA9IHRoaXMuX3BhdGhzLCBzID0gdGhpcy5fcGFyc2VkUGF0aHMsIG4gPSB0aGlzLl9iaW5kaW5ncywgciA9IG4ubGVuZ3RoLCBvLCBhID0gdC5sZW5ndGgsIGwgPSB0aGlzLm5DYWNoZWRPYmplY3RzXzsKICAgICAgICBmb3IobGV0IGMgPSAwLCB1ID0gYXJndW1lbnRzLmxlbmd0aDsgYyAhPT0gdTsgKytjKXsKICAgICAgICAgICAgbGV0IGQgPSBhcmd1bWVudHNbY10sIHAgPSBkLnV1aWQsIGYgPSBlW3BdOwogICAgICAgICAgICBpZiAoZiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBmID0gYSsrLCBlW3BdID0gZiwgdC5wdXNoKGQpOwogICAgICAgICAgICAgICAgZm9yKGxldCBtID0gMCwgeTEgPSByOyBtICE9PSB5MTsgKyttKW5bbV0ucHVzaChuZXcgSihkLCBpW21dLCBzW21dKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZiA8IGwpIHsKICAgICAgICAgICAgICAgIG8gPSB0W2ZdOwogICAgICAgICAgICAgICAgbGV0IG0gPSAtLWwsIHkxID0gdFttXTsKICAgICAgICAgICAgICAgIGVbeTEudXVpZF0gPSBmLCB0W2ZdID0geTEsIGVbcF0gPSBtLCB0W21dID0gZDsKICAgICAgICAgICAgICAgIGZvcihsZXQgZyA9IDAsIHgxID0gcjsgZyAhPT0geDE7ICsrZyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IGIgPSBuW2ddLCBNID0gYlttXSwgXyA9IGJbZl07CiAgICAgICAgICAgICAgICAgICAgYltmXSA9IE0sIF8gPT09IHZvaWQgMCAmJiAoXyA9IG5ldyBKKGQsIGlbZ10sIHNbZ10pKSwgYlttXSA9IF87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB0W2ZdICE9PSBvICYmIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuIik7CiAgICAgICAgfQogICAgICAgIHRoaXMubkNhY2hlZE9iamVjdHNfID0gbDsKICAgIH0KICAgIHJlbW92ZSgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX29iamVjdHMsIGUgPSB0aGlzLl9pbmRpY2VzQnlVVUlELCBpID0gdGhpcy5fYmluZGluZ3MsIHMgPSBpLmxlbmd0aCwgbiA9IHRoaXMubkNhY2hlZE9iamVjdHNfOwogICAgICAgIGZvcihsZXQgciA9IDAsIG8gPSBhcmd1bWVudHMubGVuZ3RoOyByICE9PSBvOyArK3IpewogICAgICAgICAgICBsZXQgYSA9IGFyZ3VtZW50c1tyXSwgbCA9IGEudXVpZCwgYyA9IGVbbF07CiAgICAgICAgICAgIGlmIChjICE9PSB2b2lkIDAgJiYgYyA+PSBuKSB7CiAgICAgICAgICAgICAgICBsZXQgdSA9IG4rKywgZCA9IHRbdV07CiAgICAgICAgICAgICAgICBlW2QudXVpZF0gPSBjLCB0W2NdID0gZCwgZVtsXSA9IHUsIHRbdV0gPSBhOwogICAgICAgICAgICAgICAgZm9yKGxldCBwID0gMCwgZiA9IHM7IHAgIT09IGY7ICsrcCl7CiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBpW3BdLCB5MSA9IG1bdV0sIGcgPSBtW2NdOwogICAgICAgICAgICAgICAgICAgIG1bY10gPSB5MSwgbVt1XSA9IGc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuOwogICAgfQogICAgdW5jYWNoZSgpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX29iamVjdHMsIGUgPSB0aGlzLl9pbmRpY2VzQnlVVUlELCBpID0gdGhpcy5fYmluZGluZ3MsIHMgPSBpLmxlbmd0aCwgbiA9IHRoaXMubkNhY2hlZE9iamVjdHNfLCByID0gdC5sZW5ndGg7CiAgICAgICAgZm9yKGxldCBvID0gMCwgYSA9IGFyZ3VtZW50cy5sZW5ndGg7IG8gIT09IGE7ICsrbyl7CiAgICAgICAgICAgIGxldCBsID0gYXJndW1lbnRzW29dLCBjID0gbC51dWlkLCB1ID0gZVtjXTsKICAgICAgICAgICAgaWYgKHUgIT09IHZvaWQgMCkgaWYgKGRlbGV0ZSBlW2NdLCB1IDwgbikgewogICAgICAgICAgICAgICAgbGV0IGQgPSAtLW4sIHAgPSB0W2RdLCBmID0gLS1yLCBtID0gdFtmXTsKICAgICAgICAgICAgICAgIGVbcC51dWlkXSA9IHUsIHRbdV0gPSBwLCBlW20udXVpZF0gPSBkLCB0W2RdID0gbSwgdC5wb3AoKTsKICAgICAgICAgICAgICAgIGZvcihsZXQgeTEgPSAwLCBnID0gczsgeTEgIT09IGc7ICsreTEpewogICAgICAgICAgICAgICAgICAgIGxldCB4MSA9IGlbeTFdLCBiID0geDFbZF0sIE0gPSB4MVtmXTsKICAgICAgICAgICAgICAgICAgICB4MVt1XSA9IGIsIHgxW2RdID0gTSwgeDEucG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZXQgZCA9IC0tciwgcCA9IHRbZF07CiAgICAgICAgICAgICAgICBkID4gMCAmJiAoZVtwLnV1aWRdID0gdSksIHRbdV0gPSBwLCB0LnBvcCgpOwogICAgICAgICAgICAgICAgZm9yKGxldCBmID0gMCwgbSA9IHM7IGYgIT09IG07ICsrZil7CiAgICAgICAgICAgICAgICAgICAgbGV0IHkxID0gaVtmXTsKICAgICAgICAgICAgICAgICAgICB5MVt1XSA9IHkxW2RdLCB5MS5wb3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG47CiAgICB9CiAgICBzdWJzY3JpYmVfKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCwgcyA9IGlbdF0sIG4gPSB0aGlzLl9iaW5kaW5nczsKICAgICAgICBpZiAocyAhPT0gdm9pZCAwKSByZXR1cm4gbltzXTsKICAgICAgICBsZXQgciA9IHRoaXMuX3BhdGhzLCBvID0gdGhpcy5fcGFyc2VkUGF0aHMsIGEgPSB0aGlzLl9vYmplY3RzLCBsID0gYS5sZW5ndGgsIGMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywgdSA9IG5ldyBBcnJheShsKTsKICAgICAgICBzID0gbi5sZW5ndGgsIGlbdF0gPSBzLCByLnB1c2godCksIG8ucHVzaChlKSwgbi5wdXNoKHUpOwogICAgICAgIGZvcihsZXQgZCA9IGMsIHAgPSBhLmxlbmd0aDsgZCAhPT0gcDsgKytkKXsKICAgICAgICAgICAgbGV0IGYgPSBhW2RdOwogICAgICAgICAgICB1W2RdID0gbmV3IEooZiwgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1OwogICAgfQogICAgdW5zdWJzY3JpYmVfKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCwgaSA9IGVbdF07CiAgICAgICAgaWYgKGkgIT09IHZvaWQgMCkgewogICAgICAgICAgICBsZXQgcyA9IHRoaXMuX3BhdGhzLCBuID0gdGhpcy5fcGFyc2VkUGF0aHMsIHIgPSB0aGlzLl9iaW5kaW5ncywgbyA9IHIubGVuZ3RoIC0gMSwgYSA9IHJbb10sIGwgPSB0W29dOwogICAgICAgICAgICBlW2xdID0gaSwgcltpXSA9IGEsIHIucG9wKCksIG5baV0gPSBuW29dLCBuLnBvcCgpLCBzW2ldID0gc1tvXSwgcy5wb3AoKTsKICAgICAgICB9CiAgICB9Cn0sIE5vID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCwgZSwgaSA9IG51bGwsIHMgPSBlLmJsZW5kTW9kZSl7CiAgICAgICAgdGhpcy5fbWl4ZXIgPSB0LCB0aGlzLl9jbGlwID0gZSwgdGhpcy5fbG9jYWxSb290ID0gaSwgdGhpcy5ibGVuZE1vZGUgPSBzOwogICAgICAgIGxldCBuID0gZS50cmFja3MsIHIgPSBuLmxlbmd0aCwgbyA9IG5ldyBBcnJheShyKSwgYSA9IHsKICAgICAgICAgICAgZW5kaW5nU3RhcnQ6IGhpLAogICAgICAgICAgICBlbmRpbmdFbmQ6IGhpCiAgICAgICAgfTsKICAgICAgICBmb3IobGV0IGwgPSAwOyBsICE9PSByOyArK2wpewogICAgICAgICAgICBsZXQgYyA9IG5bbF0uY3JlYXRlSW50ZXJwb2xhbnQobnVsbCk7CiAgICAgICAgICAgIG9bbF0gPSBjLCBjLnNldHRpbmdzID0gYTsKICAgICAgICB9CiAgICAgICAgdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGEsIHRoaXMuX2ludGVycG9sYW50cyA9IG8sIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkociksIHRoaXMuX2NhY2hlSW5kZXggPSBudWxsLCB0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbCwgdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsLCB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGwsIHRoaXMubG9vcCA9IEdjLCB0aGlzLl9sb29wQ291bnQgPSAtMSwgdGhpcy5fc3RhcnRUaW1lID0gbnVsbCwgdGhpcy50aW1lID0gMCwgdGhpcy50aW1lU2NhbGUgPSAxLCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSAxLCB0aGlzLndlaWdodCA9IDEsIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDEsIHRoaXMucmVwZXRpdGlvbnMgPSAxIC8gMCwgdGhpcy5wYXVzZWQgPSAhMSwgdGhpcy5lbmFibGVkID0gITAsIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgPSAhMSwgdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID0gITAsIHRoaXMuemVyb1Nsb3BlQXRFbmQgPSAhMDsKICAgIH0KICAgIHBsYXkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKSwgdGhpczsKICAgIH0KICAgIHN0b3AoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKHRoaXMpLCB0aGlzLnJlc2V0KCk7CiAgICB9CiAgICByZXNldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgPSAhMSwgdGhpcy5lbmFibGVkID0gITAsIHRoaXMudGltZSA9IDAsIHRoaXMuX2xvb3BDb3VudCA9IC0xLCB0aGlzLl9zdGFydFRpbWUgPSBudWxsLCB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpOwogICAgfQogICAgaXNSdW5uaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmIHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyk7CiAgICB9CiAgICBpc1NjaGVkdWxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpOwogICAgfQogICAgc3RhcnRBdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0VGltZSA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRMb29wKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb29wID0gdCwgdGhpcy5yZXBldGl0aW9ucyA9IGUsIHRoaXM7CiAgICB9CiAgICBzZXRFZmZlY3RpdmVXZWlnaHQodCkgewogICAgICAgIHJldHVybiB0aGlzLndlaWdodCA9IHQsIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHQgOiAwLCB0aGlzLnN0b3BGYWRpbmcoKTsKICAgIH0KICAgIGdldEVmZmVjdGl2ZVdlaWdodCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0OwogICAgfQogICAgZmFkZUluKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwgMCwgMSk7CiAgICB9CiAgICBmYWRlT3V0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwgMSwgMCk7CiAgICB9CiAgICBjcm9zc0ZhZGVGcm9tKHQsIGUsIGkpIHsKICAgICAgICBpZiAodC5mYWRlT3V0KGUpLCB0aGlzLmZhZGVJbihlKSwgaSkgewogICAgICAgICAgICBsZXQgcyA9IHRoaXMuX2NsaXAuZHVyYXRpb24sIG4gPSB0Ll9jbGlwLmR1cmF0aW9uLCByID0gbiAvIHMsIG8gPSBzIC8gbjsKICAgICAgICAgICAgdC53YXJwKDEsIHIsIGUpLCB0aGlzLndhcnAobywgMSwgZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY3Jvc3NGYWRlVG8odCwgZSwgaSkgewogICAgICAgIHJldHVybiB0LmNyb3NzRmFkZUZyb20odGhpcywgZSwgaSk7CiAgICB9CiAgICBzdG9wRmFkaW5nKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CiAgICAgICAgcmV0dXJuIHQgIT09IG51bGwgJiYgKHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbCwgdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpKSwgdGhpczsKICAgIH0KICAgIHNldEVmZmVjdGl2ZVRpbWVTY2FsZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGltZVNjYWxlID0gdCwgdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDogdCwgdGhpcy5zdG9wV2FycGluZygpOwogICAgfQogICAgZ2V0RWZmZWN0aXZlVGltZVNjYWxlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU7CiAgICB9CiAgICBzZXREdXJhdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIHQsIHRoaXMuc3RvcFdhcnBpbmcoKTsKICAgIH0KICAgIHN5bmNXaXRoKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy50aW1lID0gdC50aW1lLCB0aGlzLnRpbWVTY2FsZSA9IHQudGltZVNjYWxlLCB0aGlzLnN0b3BXYXJwaW5nKCk7CiAgICB9CiAgICBoYWx0KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy53YXJwKHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgdCk7CiAgICB9CiAgICB3YXJwKHQsIGUsIGkpIHsKICAgICAgICBsZXQgcyA9IHRoaXMuX21peGVyLCBuID0gcy50aW1lLCByID0gdGhpcy50aW1lU2NhbGUsIG8gPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDsKICAgICAgICBvID09PSBudWxsICYmIChvID0gcy5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLCB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG8pOwogICAgICAgIGxldCBhID0gby5wYXJhbWV0ZXJQb3NpdGlvbnMsIGwgPSBvLnNhbXBsZVZhbHVlczsKICAgICAgICByZXR1cm4gYVswXSA9IG4sIGFbMV0gPSBuICsgaSwgbFswXSA9IHQgLyByLCBsWzFdID0gZSAvIHIsIHRoaXM7CiAgICB9CiAgICBzdG9wV2FycGluZygpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OwogICAgICAgIHJldHVybiB0ICE9PSBudWxsICYmICh0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGwsIHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksIHRoaXM7CiAgICB9CiAgICBnZXRNaXhlcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbWl4ZXI7CiAgICB9CiAgICBnZXRDbGlwKCkgewogICAgICAgIHJldHVybiB0aGlzLl9jbGlwOwogICAgfQogICAgZ2V0Um9vdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290OwogICAgfQogICAgX3VwZGF0ZSh0LCBlLCBpLCBzKSB7CiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlV2VpZ2h0KHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBuID0gdGhpcy5fc3RhcnRUaW1lOwogICAgICAgIGlmIChuICE9PSBudWxsKSB7CiAgICAgICAgICAgIGxldCBhID0gKHQgLSBuKSAqIGk7CiAgICAgICAgICAgIGEgPCAwIHx8IGkgPT09IDAgPyBlID0gMCA6ICh0aGlzLl9zdGFydFRpbWUgPSBudWxsLCBlID0gaSAqIGEpOwogICAgICAgIH0KICAgICAgICBlICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSh0KTsKICAgICAgICBsZXQgciA9IHRoaXMuX3VwZGF0ZVRpbWUoZSksIG8gPSB0aGlzLl91cGRhdGVXZWlnaHQodCk7CiAgICAgICAgaWYgKG8gPiAwKSB7CiAgICAgICAgICAgIGxldCBhID0gdGhpcy5faW50ZXJwb2xhbnRzLCBsID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsKICAgICAgICAgICAgc3dpdGNoKHRoaXMuYmxlbmRNb2RlKXsKICAgICAgICAgICAgICAgIGNhc2UgQ2w6CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBjID0gMCwgdSA9IGEubGVuZ3RoOyBjICE9PSB1OyArK2MpYVtjXS5ldmFsdWF0ZShyKSwgbFtjXS5hY2N1bXVsYXRlQWRkaXRpdmUobyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEhvOgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGMgPSAwLCB1ID0gYS5sZW5ndGg7IGMgIT09IHU7ICsrYylhW2NdLmV2YWx1YXRlKHIpLCBsW2NdLmFjY3VtdWxhdGUocywgbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBfdXBkYXRlV2VpZ2h0KHQpIHsKICAgICAgICBsZXQgZSA9IDA7CiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZCkgewogICAgICAgICAgICBlID0gdGhpcy53ZWlnaHQ7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CiAgICAgICAgICAgIGlmIChpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsZXQgcyA9IGkuZXZhbHVhdGUodClbMF07CiAgICAgICAgICAgICAgICBlICo9IHMsIHQgPiBpLnBhcmFtZXRlclBvc2l0aW9uc1sxXSAmJiAodGhpcy5zdG9wRmFkaW5nKCksIHMgPT09IDAgJiYgKHRoaXMuZW5hYmxlZCA9ICExKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IGUsIGU7CiAgICB9CiAgICBfdXBkYXRlVGltZVNjYWxlKHQpIHsKICAgICAgICBsZXQgZSA9IDA7CiAgICAgICAgaWYgKCF0aGlzLnBhdXNlZCkgewogICAgICAgICAgICBlID0gdGhpcy50aW1lU2NhbGU7CiAgICAgICAgICAgIGxldCBpID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7CiAgICAgICAgICAgIGlmIChpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsZXQgcyA9IGkuZXZhbHVhdGUodClbMF07CiAgICAgICAgICAgICAgICBlICo9IHMsIHQgPiBpLnBhcmFtZXRlclBvc2l0aW9uc1sxXSAmJiAodGhpcy5zdG9wV2FycGluZygpLCBlID09PSAwID8gdGhpcy5wYXVzZWQgPSAhMCA6IHRoaXMudGltZVNjYWxlID0gZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IGUsIGU7CiAgICB9CiAgICBfdXBkYXRlVGltZSh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9jbGlwLmR1cmF0aW9uLCBpID0gdGhpcy5sb29wLCBzID0gdGhpcy50aW1lICsgdCwgbiA9IHRoaXMuX2xvb3BDb3VudCwgciA9IGkgPT09IFhjOwogICAgICAgIGlmICh0ID09PSAwKSByZXR1cm4gbiA9PT0gLTEgPyBzIDogciAmJiAobiAmIDEpID09PSAxID8gZSAtIHMgOiBzOwogICAgICAgIGlmIChpID09PSBxYykgewogICAgICAgICAgICBuID09PSAtMSAmJiAodGhpcy5fbG9vcENvdW50ID0gMCwgdGhpcy5fc2V0RW5kaW5ncyghMCwgITAsICExKSk7CiAgICAgICAgICAgIHQ6IHsKICAgICAgICAgICAgICAgIGlmIChzID49IGUpIHMgPSBlOwogICAgICAgICAgICAgICAgZWxzZSBpZiAocyA8IDApIHMgPSAwOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lID0gczsKICAgICAgICAgICAgICAgICAgICBicmVhayB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCA/IHRoaXMucGF1c2VkID0gITAgOiB0aGlzLmVuYWJsZWQgPSAhMSwgdGhpcy50aW1lID0gcywgdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogImZpbmlzaGVkIiwKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiB0IDwgMCA/IC0xIDogMQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobiA9PT0gLTEgJiYgKHQgPj0gMCA/IChuID0gMCwgdGhpcy5fc2V0RW5kaW5ncyghMCwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcikpIDogdGhpcy5fc2V0RW5kaW5ncyh0aGlzLnJlcGV0aXRpb25zID09PSAwLCAhMCwgcikpLCBzID49IGUgfHwgcyA8IDApIHsKICAgICAgICAgICAgICAgIGxldCBvID0gTWF0aC5mbG9vcihzIC8gZSk7CiAgICAgICAgICAgICAgICBzIC09IGUgKiBvLCBuICs9IE1hdGguYWJzKG8pOwogICAgICAgICAgICAgICAgbGV0IGEgPSB0aGlzLnJlcGV0aXRpb25zIC0gbjsKICAgICAgICAgICAgICAgIGlmIChhIDw9IDApIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgPyB0aGlzLnBhdXNlZCA9ICEwIDogdGhpcy5lbmFibGVkID0gITEsIHMgPSB0ID4gMCA/IGUgOiAwLCB0aGlzLnRpbWUgPSBzLCB0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZmluaXNoZWQiLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcywKICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHQgPiAwID8gMSA6IC0xCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChhID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsID0gdCA8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldEVuZGluZ3MobCwgIWwsIHIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLl9zZXRFbmRpbmdzKCExLCAhMSwgcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9vcENvdW50ID0gbiwgdGhpcy50aW1lID0gcywgdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJsb29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBsb29wRGVsdGE6IG8KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHRoaXMudGltZSA9IHM7CiAgICAgICAgICAgIGlmIChyICYmIChuICYgMSkgPT09IDEpIHJldHVybiBlIC0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICBfc2V0RW5kaW5ncyh0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzOwogICAgICAgIGkgPyAocy5lbmRpbmdTdGFydCA9IGxpLCBzLmVuZGluZ0VuZCA9IGxpKSA6ICh0ID8gcy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IGxpIDogaGkgOiBzLmVuZGluZ1N0YXJ0ID0gWHMsIGUgPyBzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBsaSA6IGhpIDogcy5lbmRpbmdFbmQgPSBYcyk7CiAgICB9CiAgICBfc2NoZWR1bGVGYWRpbmcodCwgZSwgaSkgewogICAgICAgIGxldCBzID0gdGhpcy5fbWl4ZXIsIG4gPSBzLnRpbWUsIHIgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDsKICAgICAgICByID09PSBudWxsICYmIChyID0gcy5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLCB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IHIpOwogICAgICAgIGxldCBvID0gci5wYXJhbWV0ZXJQb3NpdGlvbnMsIGEgPSByLnNhbXBsZVZhbHVlczsKICAgICAgICByZXR1cm4gb1swXSA9IG4sIGFbMF0gPSBlLCBvWzFdID0gbiArIHQsIGFbMV0gPSBpLCB0aGlzOwogICAgfQp9LCBCZCA9IG5ldyBGbG9hdDMyQXJyYXkoMSksIERoID0gY2xhc3MgZXh0ZW5kcyBxdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBzdXBlcigpLCB0aGlzLl9yb290ID0gdCwgdGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKSwgdGhpcy5fYWNjdUluZGV4ID0gMCwgdGhpcy50aW1lID0gMCwgdGhpcy50aW1lU2NhbGUgPSAxOwogICAgfQogICAgX2JpbmRBY3Rpb24odCwgZSkgewogICAgICAgIGxldCBpID0gdC5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsIHMgPSB0Ll9jbGlwLnRyYWNrcywgbiA9IHMubGVuZ3RoLCByID0gdC5fcHJvcGVydHlCaW5kaW5ncywgbyA9IHQuX2ludGVycG9sYW50cywgYSA9IGkudXVpZCwgbCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwgYyA9IGxbYV07CiAgICAgICAgYyA9PT0gdm9pZCAwICYmIChjID0ge30sIGxbYV0gPSBjKTsKICAgICAgICBmb3IobGV0IHUgPSAwOyB1ICE9PSBuOyArK3UpewogICAgICAgICAgICBsZXQgZCA9IHNbdV0sIHAgPSBkLm5hbWUsIGYgPSBjW3BdOwogICAgICAgICAgICBpZiAoZiAhPT0gdm9pZCAwKSArK2YucmVmZXJlbmNlQ291bnQsIHJbdV0gPSBmOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChmID0gclt1XSwgZiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgZi5fY2FjaGVJbmRleCA9PT0gbnVsbCAmJiAoKytmLnJlZmVyZW5jZUNvdW50LCB0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoZiwgYSwgcCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG0gPSBlICYmIGUuX3Byb3BlcnR5QmluZGluZ3NbdV0uYmluZGluZy5wYXJzZWRQYXRoOwogICAgICAgICAgICAgICAgZiA9IG5ldyBQbyhKLmNyZWF0ZShpLCBwLCBtKSwgZC5WYWx1ZVR5cGVOYW1lLCBkLmdldFZhbHVlU2l6ZSgpKSwgKytmLnJlZmVyZW5jZUNvdW50LCB0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoZiwgYSwgcCksIHJbdV0gPSBmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9bdV0ucmVzdWx0QnVmZmVyID0gZi5idWZmZXI7CiAgICAgICAgfQogICAgfQogICAgX2FjdGl2YXRlQWN0aW9uKHQpIHsKICAgICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKSB7CiAgICAgICAgICAgIGlmICh0Ll9jYWNoZUluZGV4ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsZXQgaSA9ICh0Ll9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCkudXVpZCwgcyA9IHQuX2NsaXAudXVpZCwgbiA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbc107CiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kQWN0aW9uKHQsIG4gJiYgbi5rbm93bkFjdGlvbnNbMF0pLCB0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbih0LCBzLCBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZSA9IHQuX3Byb3BlcnR5QmluZGluZ3M7CiAgICAgICAgICAgIGZvcihsZXQgaSA9IDAsIHMgPSBlLmxlbmd0aDsgaSAhPT0gczsgKytpKXsKICAgICAgICAgICAgICAgIGxldCBuID0gZVtpXTsKICAgICAgICAgICAgICAgIG4udXNlQ291bnQrKyA9PT0gMCAmJiAodGhpcy5fbGVuZEJpbmRpbmcobiksIG4uc2F2ZU9yaWdpbmFsU3RhdGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbGVuZEFjdGlvbih0KTsKICAgICAgICB9CiAgICB9CiAgICBfZGVhY3RpdmF0ZUFjdGlvbih0KSB7CiAgICAgICAgaWYgKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKSB7CiAgICAgICAgICAgIGxldCBlID0gdC5fcHJvcGVydHlCaW5kaW5nczsKICAgICAgICAgICAgZm9yKGxldCBpID0gMCwgcyA9IGUubGVuZ3RoOyBpICE9PSBzOyArK2kpewogICAgICAgICAgICAgICAgbGV0IG4gPSBlW2ldOwogICAgICAgICAgICAgICAgLS1uLnVzZUNvdW50ID09PSAwICYmIChuLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksIHRoaXMuX3Rha2VCYWNrQmluZGluZyhuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGFrZUJhY2tBY3Rpb24odCk7CiAgICAgICAgfQogICAgfQogICAgX2luaXRNZW1vcnlNYW5hZ2VyKCkgewogICAgICAgIHRoaXMuX2FjdGlvbnMgPSBbXSwgdGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwLCB0aGlzLl9hY3Rpb25zQnlDbGlwID0ge30sIHRoaXMuX2JpbmRpbmdzID0gW10sIHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDAsIHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9LCB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW10sIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDsKICAgICAgICBsZXQgdCA9IHRoaXM7CiAgICAgICAgdGhpcy5zdGF0cyA9IHsKICAgICAgICAgICAgYWN0aW9uczogewogICAgICAgICAgICAgICAgZ2V0IHRvdGFsICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fYWN0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IGluVXNlICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJpbmRpbmdzOiB7CiAgICAgICAgICAgICAgICBnZXQgdG90YWwgKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9iaW5kaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IGluVXNlICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fbkFjdGl2ZUJpbmRpbmdzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjb250cm9sSW50ZXJwb2xhbnRzOiB7CiAgICAgICAgICAgICAgICBnZXQgdG90YWwgKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQgaW5Vc2UgKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9uQWN0aXZlQ29udHJvbEludGVycG9sYW50czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBfaXNBY3RpdmVBY3Rpb24odCkgewogICAgICAgIGxldCBlID0gdC5fY2FjaGVJbmRleDsKICAgICAgICByZXR1cm4gZSAhPT0gbnVsbCAmJiBlIDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7CiAgICB9CiAgICBfYWRkSW5hY3RpdmVBY3Rpb24odCwgZSwgaSkgewogICAgICAgIGxldCBzID0gdGhpcy5fYWN0aW9ucywgbiA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsIHIgPSBuW2VdOwogICAgICAgIGlmIChyID09PSB2b2lkIDApIHIgPSB7CiAgICAgICAgICAgIGtub3duQWN0aW9uczogWwogICAgICAgICAgICAgICAgdAogICAgICAgICAgICBdLAogICAgICAgICAgICBhY3Rpb25CeVJvb3Q6IHt9CiAgICAgICAgfSwgdC5fYnlDbGlwQ2FjaGVJbmRleCA9IDAsIG5bZV0gPSByOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgbyA9IHIua25vd25BY3Rpb25zOwogICAgICAgICAgICB0Ll9ieUNsaXBDYWNoZUluZGV4ID0gby5sZW5ndGgsIG8ucHVzaCh0KTsKICAgICAgICB9CiAgICAgICAgdC5fY2FjaGVJbmRleCA9IHMubGVuZ3RoLCBzLnB1c2godCksIHIuYWN0aW9uQnlSb290W2ldID0gdDsKICAgIH0KICAgIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbih0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9hY3Rpb25zLCBpID0gZVtlLmxlbmd0aCAtIDFdLCBzID0gdC5fY2FjaGVJbmRleDsKICAgICAgICBpLl9jYWNoZUluZGV4ID0gcywgZVtzXSA9IGksIGUucG9wKCksIHQuX2NhY2hlSW5kZXggPSBudWxsOwogICAgICAgIGxldCBuID0gdC5fY2xpcC51dWlkLCByID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwgbyA9IHJbbl0sIGEgPSBvLmtub3duQWN0aW9ucywgbCA9IGFbYS5sZW5ndGggLSAxXSwgYyA9IHQuX2J5Q2xpcENhY2hlSW5kZXg7CiAgICAgICAgbC5fYnlDbGlwQ2FjaGVJbmRleCA9IGMsIGFbY10gPSBsLCBhLnBvcCgpLCB0Ll9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKICAgICAgICBsZXQgdSA9IG8uYWN0aW9uQnlSb290LCBkID0gKHQuX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290KS51dWlkOwogICAgICAgIGRlbGV0ZSB1W2RdLCBhLmxlbmd0aCA9PT0gMCAmJiBkZWxldGUgcltuXSwgdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih0KTsKICAgIH0KICAgIF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpIHsKICAgICAgICBsZXQgZSA9IHQuX3Byb3BlcnR5QmluZGluZ3M7CiAgICAgICAgZm9yKGxldCBpID0gMCwgcyA9IGUubGVuZ3RoOyBpICE9PSBzOyArK2kpewogICAgICAgICAgICBsZXQgbiA9IGVbaV07CiAgICAgICAgICAgIC0tbi5yZWZlcmVuY2VDb3VudCA9PT0gMCAmJiB0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcobik7CiAgICAgICAgfQogICAgfQogICAgX2xlbmRBY3Rpb24odCkgewogICAgICAgIGxldCBlID0gdGhpcy5fYWN0aW9ucywgaSA9IHQuX2NhY2hlSW5kZXgsIHMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucysrLCBuID0gZVtzXTsKICAgICAgICB0Ll9jYWNoZUluZGV4ID0gcywgZVtzXSA9IHQsIG4uX2NhY2hlSW5kZXggPSBpLCBlW2ldID0gbjsKICAgIH0KICAgIF90YWtlQmFja0FjdGlvbih0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9hY3Rpb25zLCBpID0gdC5fY2FjaGVJbmRleCwgcyA9IC0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMsIG4gPSBlW3NdOwogICAgICAgIHQuX2NhY2hlSW5kZXggPSBzLCBlW3NdID0gdCwgbi5fY2FjaGVJbmRleCA9IGksIGVbaV0gPSBuOwogICAgfQogICAgX2FkZEluYWN0aXZlQmluZGluZyh0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsIG4gPSB0aGlzLl9iaW5kaW5ncywgciA9IHNbZV07CiAgICAgICAgciA9PT0gdm9pZCAwICYmIChyID0ge30sIHNbZV0gPSByKSwgcltpXSA9IHQsIHQuX2NhY2hlSW5kZXggPSBuLmxlbmd0aCwgbi5wdXNoKHQpOwogICAgfQogICAgX3JlbW92ZUluYWN0aXZlQmluZGluZyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9iaW5kaW5ncywgaSA9IHQuYmluZGluZywgcyA9IGkucm9vdE5vZGUudXVpZCwgbiA9IGkucGF0aCwgciA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwgbyA9IHJbc10sIGEgPSBlW2UubGVuZ3RoIC0gMV0sIGwgPSB0Ll9jYWNoZUluZGV4OwogICAgICAgIGEuX2NhY2hlSW5kZXggPSBsLCBlW2xdID0gYSwgZS5wb3AoKSwgZGVsZXRlIG9bbl0sIE9iamVjdC5rZXlzKG8pLmxlbmd0aCA9PT0gMCAmJiBkZWxldGUgcltzXTsKICAgIH0KICAgIF9sZW5kQmluZGluZyh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9iaW5kaW5ncywgaSA9IHQuX2NhY2hlSW5kZXgsIHMgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MrKywgbiA9IGVbc107CiAgICAgICAgdC5fY2FjaGVJbmRleCA9IHMsIGVbc10gPSB0LCBuLl9jYWNoZUluZGV4ID0gaSwgZVtpXSA9IG47CiAgICB9CiAgICBfdGFrZUJhY2tCaW5kaW5nKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuX2JpbmRpbmdzLCBpID0gdC5fY2FjaGVJbmRleCwgcyA9IC0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLCBuID0gZVtzXTsKICAgICAgICB0Ll9jYWNoZUluZGV4ID0gcywgZVtzXSA9IHQsIG4uX2NhY2hlSW5kZXggPSBpLCBlW2ldID0gbjsKICAgIH0KICAgIF9sZW5kQ29udHJvbEludGVycG9sYW50KCkgewogICAgICAgIGxldCB0ID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cywgZSA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzKyssIGkgPSB0W2VdOwogICAgICAgIHJldHVybiBpID09PSB2b2lkIDAgJiYgKGkgPSBuZXcgZ24obmV3IEZsb2F0MzJBcnJheSgyKSwgbmV3IEZsb2F0MzJBcnJheSgyKSwgMSwgQmQpLCBpLl9fY2FjaGVJbmRleCA9IGUsIHRbZV0gPSBpKSwgaTsKICAgIH0KICAgIF90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSB7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLCBpID0gdC5fX2NhY2hlSW5kZXgsIHMgPSAtLXRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLCBuID0gZVtzXTsKICAgICAgICB0Ll9fY2FjaGVJbmRleCA9IHMsIGVbc10gPSB0LCBuLl9fY2FjaGVJbmRleCA9IGksIGVbaV0gPSBuOwogICAgfQogICAgY2xpcEFjdGlvbih0LCBlLCBpKSB7CiAgICAgICAgbGV0IHMgPSBlIHx8IHRoaXMuX3Jvb3QsIG4gPSBzLnV1aWQsIHIgPSB0eXBlb2YgdCA9PSAic3RyaW5nIiA/IHdpLmZpbmRCeU5hbWUocywgdCkgOiB0LCBvID0gciAhPT0gbnVsbCA/IHIudXVpZCA6IHQsIGEgPSB0aGlzLl9hY3Rpb25zQnlDbGlwW29dLCBsID0gbnVsbDsKICAgICAgICBpZiAoaSA9PT0gdm9pZCAwICYmIChyICE9PSBudWxsID8gaSA9IHIuYmxlbmRNb2RlIDogaSA9IEhvKSwgYSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxldCB1ID0gYS5hY3Rpb25CeVJvb3Rbbl07CiAgICAgICAgICAgIGlmICh1ICE9PSB2b2lkIDAgJiYgdS5ibGVuZE1vZGUgPT09IGkpIHJldHVybiB1OwogICAgICAgICAgICBsID0gYS5rbm93bkFjdGlvbnNbMF0sIHIgPT09IG51bGwgJiYgKHIgPSBsLl9jbGlwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHIgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIGxldCBjID0gbmV3IE5vKHRoaXMsIHIsIGUsIGkpOwogICAgICAgIHJldHVybiB0aGlzLl9iaW5kQWN0aW9uKGMsIGwpLCB0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLCBvLCBuKSwgYzsKICAgIH0KICAgIGV4aXN0aW5nQWN0aW9uKHQsIGUpIHsKICAgICAgICBsZXQgaSA9IGUgfHwgdGhpcy5fcm9vdCwgcyA9IGkudXVpZCwgbiA9IHR5cGVvZiB0ID09ICJzdHJpbmciID8gd2kuZmluZEJ5TmFtZShpLCB0KSA6IHQsIHIgPSBuID8gbi51dWlkIDogdCwgbyA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbcl07CiAgICAgICAgcmV0dXJuIG8gIT09IHZvaWQgMCAmJiBvLmFjdGlvbkJ5Um9vdFtzXSB8fCBudWxsOwogICAgfQogICAgc3RvcEFsbEFjdGlvbigpIHsKICAgICAgICBsZXQgdCA9IHRoaXMuX2FjdGlvbnMsIGUgPSB0aGlzLl9uQWN0aXZlQWN0aW9uczsKICAgICAgICBmb3IobGV0IGkgPSBlIC0gMTsgaSA+PSAwOyAtLWkpdFtpXS5zdG9wKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB1cGRhdGUodCkgewogICAgICAgIHQgKj0gdGhpcy50aW1lU2NhbGU7CiAgICAgICAgbGV0IGUgPSB0aGlzLl9hY3Rpb25zLCBpID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsIHMgPSB0aGlzLnRpbWUgKz0gdCwgbiA9IE1hdGguc2lnbih0KSwgciA9IHRoaXMuX2FjY3VJbmRleCBePSAxOwogICAgICAgIGZvcihsZXQgbCA9IDA7IGwgIT09IGk7ICsrbCllW2xdLl91cGRhdGUocywgdCwgbiwgcik7CiAgICAgICAgbGV0IG8gPSB0aGlzLl9iaW5kaW5ncywgYSA9IHRoaXMuX25BY3RpdmVCaW5kaW5nczsKICAgICAgICBmb3IobGV0IGwgPSAwOyBsICE9PSBhOyArK2wpb1tsXS5hcHBseShyKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFRpbWUodCkgewogICAgICAgIHRoaXMudGltZSA9IDA7CiAgICAgICAgZm9yKGxldCBlID0gMDsgZSA8IHRoaXMuX2FjdGlvbnMubGVuZ3RoOyBlKyspdGhpcy5fYWN0aW9uc1tlXS50aW1lID0gMDsKICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUodCk7CiAgICB9CiAgICBnZXRSb290KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yb290OwogICAgfQogICAgdW5jYWNoZUNsaXAodCkgewogICAgICAgIGxldCBlID0gdGhpcy5fYWN0aW9ucywgaSA9IHQudXVpZCwgcyA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsIG4gPSBzW2ldOwogICAgICAgIGlmIChuICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IHIgPSBuLmtub3duQWN0aW9uczsKICAgICAgICAgICAgZm9yKGxldCBvID0gMCwgYSA9IHIubGVuZ3RoOyBvICE9PSBhOyArK28pewogICAgICAgICAgICAgICAgbGV0IGwgPSByW29dOwogICAgICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihsKTsKICAgICAgICAgICAgICAgIGxldCBjID0gbC5fY2FjaGVJbmRleCwgdSA9IGVbZS5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGwuX2NhY2hlSW5kZXggPSBudWxsLCBsLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbCwgdS5fY2FjaGVJbmRleCA9IGMsIGVbY10gPSB1LCBlLnBvcCgpLCB0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlbGV0ZSBzW2ldOwogICAgICAgIH0KICAgIH0KICAgIHVuY2FjaGVSb290KHQpIHsKICAgICAgICBsZXQgZSA9IHQudXVpZCwgaSA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7CiAgICAgICAgZm9yKGxldCByIGluIGkpewogICAgICAgICAgICBsZXQgbyA9IGlbcl0uYWN0aW9uQnlSb290LCBhID0gb1tlXTsKICAgICAgICAgICAgYSAhPT0gdm9pZCAwICYmICh0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGEpLCB0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhKSk7CiAgICAgICAgfQogICAgICAgIGxldCBzID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLCBuID0gc1tlXTsKICAgICAgICBpZiAobiAhPT0gdm9pZCAwKSBmb3IobGV0IHIgaW4gbil7CiAgICAgICAgICAgIGxldCBvID0gbltyXTsKICAgICAgICAgICAgby5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLCB0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcobyk7CiAgICAgICAgfQogICAgfQogICAgdW5jYWNoZUFjdGlvbih0LCBlKSB7CiAgICAgICAgbGV0IGkgPSB0aGlzLmV4aXN0aW5nQWN0aW9uKHQsIGUpOwogICAgICAgIGkgIT09IG51bGwgJiYgKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oaSksIHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGkpKTsKICAgIH0KfSwgTGggPSBjbGFzcyBleHRlbmRzIFdpIHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxLCBlID0gMSwgaSA9IDEsIHMgPSB7fSl7CiAgICAgICAgc3VwZXIodCwgZSwgcyksIHRoaXMuaXNSZW5kZXJUYXJnZXQzRCA9ICEwLCB0aGlzLmRlcHRoID0gaSwgdGhpcy50ZXh0dXJlID0gbmV3IFFzKG51bGwsIHQsIGUsIGkpLCB0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gITA7CiAgICB9Cn0sIFVoID0gY2xhc3MgZXh0ZW5kcyBXaSB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IDEsIGkgPSAxLCBzID0ge30pewogICAgICAgIHN1cGVyKHQsIGUsIHMpLCB0aGlzLmlzUmVuZGVyVGFyZ2V0QXJyYXkgPSAhMCwgdGhpcy5kZXB0aCA9IGksIHRoaXMudGV4dHVyZSA9IG5ldyAkcyhudWxsLCB0LCBlLCBpKSwgdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9ICEwOwogICAgfQp9LCBXaCA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCl7CiAgICAgICAgdGhpcy52YWx1ZSA9IHQ7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IGgodGhpcy52YWx1ZS5jbG9uZSA9PT0gdm9pZCAwID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSk7CiAgICB9Cn0sIEVkID0gMCwgSGggPSBjbGFzcyBleHRlbmRzIHF0IHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5pc1VuaWZvcm1zR3JvdXAgPSAhMCwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJpZCIsIHsKICAgICAgICAgICAgdmFsdWU6IEVkKysKICAgICAgICB9KSwgdGhpcy5uYW1lID0gIiIsIHRoaXMudXNhZ2UgPSBKcywgdGhpcy51bmlmb3JtcyA9IFtdOwogICAgfQogICAgYWRkKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKHQpLCB0aGlzOwogICAgfQogICAgcmVtb3ZlKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMudW5pZm9ybXMuaW5kZXhPZih0KTsKICAgICAgICByZXR1cm4gZSAhPT0gLTEgJiYgdGhpcy51bmlmb3Jtcy5zcGxpY2UoZSwgMSksIHRoaXM7CiAgICB9CiAgICBzZXROYW1lKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID0gdCwgdGhpczsKICAgIH0KICAgIHNldFVzYWdlKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy51c2FnZSA9IHQsIHRoaXM7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAiZGlzcG9zZSIKICAgICAgICB9KSwgdGhpczsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy51c2FnZSA9IHQudXNhZ2U7CiAgICAgICAgbGV0IGUgPSB0LnVuaWZvcm1zOwogICAgICAgIHRoaXMudW5pZm9ybXMubGVuZ3RoID0gMDsKICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5sZW5ndGg7IGkgPCBzOyBpKyspewogICAgICAgICAgICBsZXQgbiA9IEFycmF5LmlzQXJyYXkoZVtpXSkgPyBlW2ldIDogWwogICAgICAgICAgICAgICAgZVtpXQogICAgICAgICAgICBdOwogICAgICAgICAgICBmb3IobGV0IHIgPSAwOyByIDwgbi5sZW5ndGg7IHIrKyl0aGlzLnVuaWZvcm1zLnB1c2gobltyXS5jbG9uZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQp9LCBxaCA9IGNsYXNzIGV4dGVuZHMgSmkgewogICAgY29uc3RydWN0b3IodCwgZSwgaSA9IDEpewogICAgICAgIHN1cGVyKHQsIGUpLCB0aGlzLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPSAhMCwgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gaTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQpLCB0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSB0Lm1lc2hQZXJBdHRyaWJ1dGUsIHRoaXM7CiAgICB9CiAgICBjbG9uZSh0KSB7CiAgICAgICAgbGV0IGUgPSBzdXBlci5jbG9uZSh0KTsKICAgICAgICByZXR1cm4gZS5tZXNoUGVyQXR0cmlidXRlID0gdGhpcy5tZXNoUGVyQXR0cmlidXRlLCBlOwogICAgfQogICAgdG9KU09OKHQpIHsKICAgICAgICBsZXQgZSA9IHN1cGVyLnRvSlNPTih0KTsKICAgICAgICByZXR1cm4gZS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gITAsIGUubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZSwgZTsKICAgIH0KfSwgR2ggPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpLCBzLCBuKXsKICAgICAgICB0aGlzLmlzR0xCdWZmZXJBdHRyaWJ1dGUgPSAhMCwgdGhpcy5uYW1lID0gIiIsIHRoaXMuYnVmZmVyID0gdCwgdGhpcy50eXBlID0gZSwgdGhpcy5pdGVtU2l6ZSA9IGksIHRoaXMuZWxlbWVudFNpemUgPSBzLCB0aGlzLmNvdW50ID0gbiwgdGhpcy52ZXJzaW9uID0gMDsKICAgIH0KICAgIHNldCBuZWVkc1VwZGF0ZSh0KSB7CiAgICAgICAgdCA9PT0gITAgJiYgdGhpcy52ZXJzaW9uKys7CiAgICB9CiAgICBzZXRCdWZmZXIodCkgewogICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IHQsIHRoaXM7CiAgICB9CiAgICBzZXRUeXBlKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy50eXBlID0gdCwgdGhpcy5lbGVtZW50U2l6ZSA9IGUsIHRoaXM7CiAgICB9CiAgICBzZXRJdGVtU2l6ZSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVNpemUgPSB0LCB0aGlzOwogICAgfQogICAgc2V0Q291bnQodCkgewogICAgICAgIHJldHVybiB0aGlzLmNvdW50ID0gdCwgdGhpczsKICAgIH0KfSwgWGggPSBuZXcgRCwgSmggPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpID0gMCwgcyA9IDEgLyAwKXsKICAgICAgICB0aGlzLnJheSA9IG5ldyBMZSh0LCBlKSwgdGhpcy5uZWFyID0gaSwgdGhpcy5mYXIgPSBzLCB0aGlzLmNhbWVyYSA9IG51bGwsIHRoaXMubGF5ZXJzID0gbmV3IGpzLCB0aGlzLnBhcmFtcyA9IHsKICAgICAgICAgICAgTWVzaDoge30sCiAgICAgICAgICAgIExpbmU6IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBMT0Q6IHt9LAogICAgICAgICAgICBQb2ludHM6IHsKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBTcHJpdGU6IHt9CiAgICAgICAgfTsKICAgIH0KICAgIHNldCh0LCBlKSB7CiAgICAgICAgdGhpcy5yYXkuc2V0KHQsIGUpOwogICAgfQogICAgc2V0RnJvbUNhbWVyYSh0LCBlKSB7CiAgICAgICAgZS5pc1BlcnNwZWN0aXZlQ2FtZXJhID8gKHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksIHRoaXMucmF5LmRpcmVjdGlvbi5zZXQodC54LCB0LnksIC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksIHRoaXMuY2FtZXJhID0gZSkgOiBlLmlzT3J0aG9ncmFwaGljQ2FtZXJhID8gKHRoaXMucmF5Lm9yaWdpbi5zZXQodC54LCB0LnksIChlLm5lYXIgKyBlLmZhcikgLyAoZS5uZWFyIC0gZS5mYXIpKS51bnByb2plY3QoZSksIHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwgMCwgLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSwgdGhpcy5jYW1lcmEgPSBlKSA6IGNvbnNvbGUuZXJyb3IoIlRIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGU6ICIgKyBlLnR5cGUpOwogICAgfQogICAgc2V0RnJvbVhSQ29udHJvbGxlcih0KSB7CiAgICAgICAgcmV0dXJuIFhoLmlkZW50aXR5KCkuZXh0cmFjdFJvdGF0aW9uKHQubWF0cml4V29ybGQpLCB0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLCB0aGlzLnJheS5kaXJlY3Rpb24uc2V0KDAsIDAsIC0xKS5hcHBseU1hdHJpeDQoWGgpLCB0aGlzOwogICAgfQogICAgaW50ZXJzZWN0T2JqZWN0KHQsIGUgPSAhMCwgaSA9IFtdKSB7CiAgICAgICAgcmV0dXJuIFZvKHQsIHRoaXMsIGksIGUpLCBpLnNvcnQoWmgpLCBpOwogICAgfQogICAgaW50ZXJzZWN0T2JqZWN0cyh0LCBlID0gITAsIGkgPSBbXSkgewogICAgICAgIGZvcihsZXQgcyA9IDAsIG4gPSB0Lmxlbmd0aDsgcyA8IG47IHMrKylWbyh0W3NdLCB0aGlzLCBpLCBlKTsKICAgICAgICByZXR1cm4gaS5zb3J0KFpoKSwgaTsKICAgIH0KfTsKZnVuY3Rpb24gWmgoaCwgdCkgewogICAgcmV0dXJuIGguZGlzdGFuY2UgLSB0LmRpc3RhbmNlOwp9CmZ1bmN0aW9uIFZvKGgsIHQsIGUsIGkpIHsKICAgIGxldCBzID0gITA7CiAgICBpZiAoaC5sYXllcnMudGVzdCh0LmxheWVycykgJiYgaC5yYXljYXN0KHQsIGUpID09PSAhMSAmJiAocyA9ICExKSwgcyA9PT0gITAgJiYgaSA9PT0gITApIHsKICAgICAgICBsZXQgbiA9IGguY2hpbGRyZW47CiAgICAgICAgZm9yKGxldCByID0gMCwgbyA9IG4ubGVuZ3RoOyByIDwgbzsgcisrKVZvKG5bcl0sIHQsIGUsICEwKTsKICAgIH0KfQp2YXIgWWggPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMSwgZSA9IDAsIGkgPSAwKXsKICAgICAgICByZXR1cm4gdGhpcy5yYWRpdXMgPSB0LCB0aGlzLnBoaSA9IGUsIHRoaXMudGhldGEgPSBpLCB0aGlzOwogICAgfQogICAgc2V0KHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYWRpdXMgPSB0LCB0aGlzLnBoaSA9IGUsIHRoaXMudGhldGEgPSBpLCB0aGlzOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmFkaXVzID0gdC5yYWRpdXMsIHRoaXMucGhpID0gdC5waGksIHRoaXMudGhldGEgPSB0LnRoZXRhLCB0aGlzOwogICAgfQogICAgbWFrZVNhZmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGhpID0gTih0aGlzLnBoaSwgMWUtNiwgTWF0aC5QSSAtIDFlLTYpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVZlY3RvcjModCkgewogICAgICAgIHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LCB0LnksIHQueik7CiAgICB9CiAgICBzZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsIGUsIGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQodCAqIHQgKyBlICogZSArIGkgKiBpKSwgdGhpcy5yYWRpdXMgPT09IDAgPyAodGhpcy50aGV0YSA9IDAsIHRoaXMucGhpID0gMCkgOiAodGhpcy50aGV0YSA9IE1hdGguYXRhbjIodCwgaSksIHRoaXMucGhpID0gTWF0aC5hY29zKE4oZSAvIHRoaXMucmFkaXVzLCAtMSwgMSkpKSwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9Cn0sICRoID0gY2xhc3MgewogICAgY29uc3RydWN0b3IodCA9IDEsIGUgPSAwLCBpID0gMCl7CiAgICAgICAgcmV0dXJuIHRoaXMucmFkaXVzID0gdCwgdGhpcy50aGV0YSA9IGUsIHRoaXMueSA9IGksIHRoaXM7CiAgICB9CiAgICBzZXQodCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnJhZGl1cyA9IHQsIHRoaXMudGhldGEgPSBlLCB0aGlzLnkgPSBpLCB0aGlzOwogICAgfQogICAgY29weSh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmFkaXVzID0gdC5yYWRpdXMsIHRoaXMudGhldGEgPSB0LnRoZXRhLCB0aGlzLnkgPSB0LnksIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tVmVjdG9yMyh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh0LngsIHQueSwgdC56KTsKICAgIH0KICAgIHNldEZyb21DYXJ0ZXNpYW5Db29yZHModCwgZSwgaSkgewogICAgICAgIHJldHVybiB0aGlzLnJhZGl1cyA9IE1hdGguc3FydCh0ICogdCArIGkgKiBpKSwgdGhpcy50aGV0YSA9IE1hdGguYXRhbjIodCwgaSksIHRoaXMueSA9IGUsIHRoaXM7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQp9LCBRaCA9IGNsYXNzIGggewogICAgY29uc3RydWN0b3IodCwgZSwgaSwgcyl7CiAgICAgICAgaC5wcm90b3R5cGUuaXNNYXRyaXgyID0gITAsIHRoaXMuZWxlbWVudHMgPSBbCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEKICAgICAgICBdLCB0ICE9PSB2b2lkIDAgJiYgdGhpcy5zZXQodCwgZSwgaSwgcyk7CiAgICB9CiAgICBpZGVudGl0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoMSwgMCwgMCwgMSksIHRoaXM7CiAgICB9CiAgICBmcm9tQXJyYXkodCwgZSA9IDApIHsKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgNDsgaSsrKXRoaXMuZWxlbWVudHNbaV0gPSB0W2kgKyBlXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldCh0LCBlLCBpLCBzKSB7CiAgICAgICAgbGV0IG4gPSB0aGlzLmVsZW1lbnRzOwogICAgICAgIHJldHVybiBuWzBdID0gdCwgblsyXSA9IGUsIG5bMV0gPSBpLCBuWzNdID0gcywgdGhpczsKICAgIH0KfSwgamggPSBuZXcgVCwgS2ggPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IFQoMSAvIDAsIDEgLyAwKSwgZSA9IG5ldyBUKC0xIC8gMCwgLTEgLyAwKSl7CiAgICAgICAgdGhpcy5pc0JveDIgPSAhMCwgdGhpcy5taW4gPSB0LCB0aGlzLm1heCA9IGU7CiAgICB9CiAgICBzZXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5jb3B5KHQpLCB0aGlzLm1heC5jb3B5KGUpLCB0aGlzOwogICAgfQogICAgc2V0RnJvbVBvaW50cyh0KSB7CiAgICAgICAgdGhpcy5tYWtlRW1wdHkoKTsKICAgICAgICBmb3IobGV0IGUgPSAwLCBpID0gdC5sZW5ndGg7IGUgPCBpOyBlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RnJvbUNlbnRlckFuZFNpemUodCwgZSkgewogICAgICAgIGxldCBpID0gamguY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKGkpLCB0aGlzLm1heC5jb3B5KHQpLmFkZChpKSwgdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgICBjb3B5KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksIHRoaXMubWF4LmNvcHkodC5tYXgpLCB0aGlzOwogICAgfQogICAgbWFrZUVtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IDEgLyAwLCB0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0xIC8gMCwgdGhpczsKICAgIH0KICAgIGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWF4LnggPCB0aGlzLm1pbi54IHx8IHRoaXMubWF4LnkgPCB0aGlzLm1pbi55OwogICAgfQogICAgZ2V0Q2VudGVyKHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0LnNldCgwLCAwKSA6IHQuYWRkVmVjdG9ycyh0aGlzLm1pbiwgdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KTsKICAgIH0KICAgIGdldFNpemUodCkgewogICAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHQuc2V0KDAsIDApIDogdC5zdWJWZWN0b3JzKHRoaXMubWF4LCB0aGlzLm1pbik7CiAgICB9CiAgICBleHBhbmRCeVBvaW50KHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5taW4ubWluKHQpLCB0aGlzLm1heC5tYXgodCksIHRoaXM7CiAgICB9CiAgICBleHBhbmRCeVZlY3Rvcih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLnN1Yih0KSwgdGhpcy5tYXguYWRkKHQpLCB0aGlzOwogICAgfQogICAgZXhwYW5kQnlTY2FsYXIodCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLCB0aGlzLm1heC5hZGRTY2FsYXIodCksIHRoaXM7CiAgICB9CiAgICBjb250YWluc1BvaW50KHQpIHsKICAgICAgICByZXR1cm4gdC54ID49IHRoaXMubWluLnggJiYgdC54IDw9IHRoaXMubWF4LnggJiYgdC55ID49IHRoaXMubWluLnkgJiYgdC55IDw9IHRoaXMubWF4Lnk7CiAgICB9CiAgICBjb250YWluc0JveCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLnggPD0gdC5taW4ueCAmJiB0Lm1heC54IDw9IHRoaXMubWF4LnggJiYgdGhpcy5taW4ueSA8PSB0Lm1pbi55ICYmIHQubWF4LnkgPD0gdGhpcy5tYXgueTsKICAgIH0KICAgIGdldFBhcmFtZXRlcih0LCBlKSB7CiAgICAgICAgcmV0dXJuIGUuc2V0KCh0LnggLSB0aGlzLm1pbi54KSAvICh0aGlzLm1heC54IC0gdGhpcy5taW4ueCksICh0LnkgLSB0aGlzLm1pbi55KSAvICh0aGlzLm1heC55IC0gdGhpcy5taW4ueSkpOwogICAgfQogICAgaW50ZXJzZWN0c0JveCh0KSB7CiAgICAgICAgcmV0dXJuIHQubWF4LnggPj0gdGhpcy5taW4ueCAmJiB0Lm1pbi54IDw9IHRoaXMubWF4LnggJiYgdC5tYXgueSA+PSB0aGlzLm1pbi55ICYmIHQubWluLnkgPD0gdGhpcy5tYXgueTsKICAgIH0KICAgIGNsYW1wUG9pbnQodCwgZSkgewogICAgICAgIHJldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sIHRoaXMubWF4KTsKICAgIH0KICAgIGRpc3RhbmNlVG9Qb2ludCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LCBqaCkuZGlzdGFuY2VUbyh0KTsKICAgIH0KICAgIGludGVyc2VjdCh0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksIHRoaXMubWF4Lm1pbih0Lm1heCksIHRoaXMuaXNFbXB0eSgpICYmIHRoaXMubWFrZUVtcHR5KCksIHRoaXM7CiAgICB9CiAgICB1bmlvbih0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksIHRoaXMubWF4Lm1heCh0Lm1heCksIHRoaXM7CiAgICB9CiAgICB0cmFuc2xhdGUodCkgewogICAgICAgIHJldHVybiB0aGlzLm1pbi5hZGQodCksIHRoaXMubWF4LmFkZCh0KSwgdGhpczsKICAgIH0KICAgIGVxdWFscyh0KSB7CiAgICAgICAgcmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikgJiYgdC5tYXguZXF1YWxzKHRoaXMubWF4KTsKICAgIH0KfSwgdGwgPSBuZXcgdywgRHMgPSBuZXcgdywgZWwgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gbmV3IHcsIGUgPSBuZXcgdyl7CiAgICAgICAgdGhpcy5zdGFydCA9IHQsIHRoaXMuZW5kID0gZTsKICAgIH0KICAgIHNldCh0LCBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSwgdGhpcy5lbmQuY29weShlKSwgdGhpczsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksIHRoaXMuZW5kLmNvcHkodC5lbmQpLCB0aGlzOwogICAgfQogICAgZ2V0Q2VudGVyKHQpIHsKICAgICAgICByZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSk7CiAgICB9CiAgICBkZWx0YSh0KSB7CiAgICAgICAgcmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCwgdGhpcy5zdGFydCk7CiAgICB9CiAgICBkaXN0YW5jZVNxKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKTsKICAgIH0KICAgIGRpc3RhbmNlKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpOwogICAgfQogICAgYXQodCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KTsKICAgIH0KICAgIGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCwgZSkgewogICAgICAgIHRsLnN1YlZlY3RvcnModCwgdGhpcy5zdGFydCksIERzLnN1YlZlY3RvcnModGhpcy5lbmQsIHRoaXMuc3RhcnQpOwogICAgICAgIGxldCBpID0gRHMuZG90KERzKSwgbiA9IERzLmRvdCh0bCkgLyBpOwogICAgICAgIHJldHVybiBlICYmIChuID0gTihuLCAwLCAxKSksIG47CiAgICB9CiAgICBjbG9zZXN0UG9pbnRUb1BvaW50KHQsIGUsIGkpIHsKICAgICAgICBsZXQgcyA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LCBlKTsKICAgICAgICByZXR1cm4gdGhpcy5kZWx0YShpKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCk7CiAgICB9CiAgICBhcHBseU1hdHJpeDQodCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSwgdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLCB0aGlzOwogICAgfQogICAgZXF1YWxzKHQpIHsKICAgICAgICByZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkgJiYgdC5lbmQuZXF1YWxzKHRoaXMuZW5kKTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9Cn0sIGlsID0gbmV3IHcsIHNsID0gY2xhc3MgZXh0ZW5kcyBHIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUpewogICAgICAgIHN1cGVyKCksIHRoaXMubGlnaHQgPSB0LCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5jb2xvciA9IGUsIHRoaXMudHlwZSA9ICJTcG90TGlnaHRIZWxwZXIiOwogICAgICAgIGxldCBpID0gbmV3IEwsIHMgPSBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMQogICAgICAgIF07CiAgICAgICAgZm9yKGxldCByID0gMCwgbyA9IDEsIGEgPSAzMjsgciA8IGE7IHIrKywgbysrKXsKICAgICAgICAgICAgbGV0IGwgPSByIC8gYSAqIE1hdGguUEkgKiAyLCBjID0gbyAvIGEgKiBNYXRoLlBJICogMjsKICAgICAgICAgICAgcy5wdXNoKE1hdGguY29zKGwpLCBNYXRoLnNpbihsKSwgMSwgTWF0aC5jb3MoYyksIE1hdGguc2luKGMpLCAxKTsKICAgICAgICB9CiAgICAgICAgaS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUocywgMykpOwogICAgICAgIGxldCBuID0gbmV3IG10KHsKICAgICAgICAgICAgZm9nOiAhMSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KTsKICAgICAgICB0aGlzLmNvbmUgPSBuZXcgV3QoaSwgbiksIHRoaXMuYWRkKHRoaXMuY29uZSksIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgICAgdGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0aGlzLnBhcmVudCA/ICh0aGlzLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCksIHRoaXMubWF0cml4LmNvcHkodGhpcy5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHRoaXMubGlnaHQubWF0cml4V29ybGQpKSA6IHRoaXMubWF0cml4LmNvcHkodGhpcy5saWdodC5tYXRyaXhXb3JsZCksIHRoaXMubWF0cml4V29ybGQuY29weSh0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTsKICAgICAgICBsZXQgdCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMWUzLCBlID0gdCAqIE1hdGgudGFuKHRoaXMubGlnaHQuYW5nbGUpOwogICAgICAgIHRoaXMuY29uZS5zY2FsZS5zZXQoZSwgZSwgdCksIGlsLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksIHRoaXMuY29uZS5sb29rQXQoaWwpLCB0aGlzLmNvbG9yICE9PSB2b2lkIDAgPyB0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpIDogdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcik7CiAgICB9Cn0sIGdlID0gbmV3IHcsIExzID0gbmV3IEQsIGNyID0gbmV3IEQsIG5sID0gY2xhc3MgZXh0ZW5kcyBXdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBsZXQgZSA9IE5sKHQpLCBpID0gbmV3IEwsIHMgPSBbXSwgbiA9IFtdLCByID0gbmV3IFAoMCwgMCwgMSksIG8gPSBuZXcgUCgwLCAxLCAwKTsKICAgICAgICBmb3IobGV0IGwgPSAwOyBsIDwgZS5sZW5ndGg7IGwrKyl7CiAgICAgICAgICAgIGxldCBjID0gZVtsXTsKICAgICAgICAgICAgYy5wYXJlbnQgJiYgYy5wYXJlbnQuaXNCb25lICYmIChzLnB1c2goMCwgMCwgMCksIHMucHVzaCgwLCAwLCAwKSwgbi5wdXNoKHIuciwgci5nLCByLmIpLCBuLnB1c2goby5yLCBvLmcsIG8uYikpOwogICAgICAgIH0KICAgICAgICBpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShzLCAzKSksIGkuc2V0QXR0cmlidXRlKCJjb2xvciIsIG5ldyBFKG4sIDMpKTsKICAgICAgICBsZXQgYSA9IG5ldyBtdCh7CiAgICAgICAgICAgIHZlcnRleENvbG9yczogITAsCiAgICAgICAgICAgIGRlcHRoVGVzdDogITEsCiAgICAgICAgICAgIGRlcHRoV3JpdGU6ICExLAogICAgICAgICAgICB0b25lTWFwcGVkOiAhMSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQ6ICEwCiAgICAgICAgfSk7CiAgICAgICAgc3VwZXIoaSwgYSksIHRoaXMuaXNTa2VsZXRvbkhlbHBlciA9ICEwLCB0aGlzLnR5cGUgPSAiU2tlbGV0b25IZWxwZXIiLCB0aGlzLnJvb3QgPSB0LCB0aGlzLmJvbmVzID0gZSwgdGhpcy5tYXRyaXggPSB0Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSAhMTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKHQpIHsKICAgICAgICBsZXQgZSA9IHRoaXMuYm9uZXMsIGkgPSB0aGlzLmdlb21ldHJ5LCBzID0gaS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgICAgY3IuY29weSh0aGlzLnJvb3QubWF0cml4V29ybGQpLmludmVydCgpOwogICAgICAgIGZvcihsZXQgbiA9IDAsIHIgPSAwOyBuIDwgZS5sZW5ndGg7IG4rKyl7CiAgICAgICAgICAgIGxldCBvID0gZVtuXTsKICAgICAgICAgICAgby5wYXJlbnQgJiYgby5wYXJlbnQuaXNCb25lICYmIChMcy5tdWx0aXBseU1hdHJpY2VzKGNyLCBvLm1hdHJpeFdvcmxkKSwgZ2Uuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKExzKSwgcy5zZXRYWVoociwgZ2UueCwgZ2UueSwgZ2UueiksIExzLm11bHRpcGx5TWF0cmljZXMoY3IsIG8ucGFyZW50Lm1hdHJpeFdvcmxkKSwgZ2Uuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKExzKSwgcy5zZXRYWVoociArIDEsIGdlLngsIGdlLnksIGdlLnopLCByICs9IDIpOwogICAgICAgIH0KICAgICAgICBpLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZSA9ICEwLCBzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KTsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQp9OwpmdW5jdGlvbiBObChoKSB7CiAgICBsZXQgdCA9IFtdOwogICAgaC5pc0JvbmUgPT09ICEwICYmIHQucHVzaChoKTsKICAgIGZvcihsZXQgZSA9IDA7IGUgPCBoLmNoaWxkcmVuLmxlbmd0aDsgZSsrKXQucHVzaC5hcHBseSh0LCBObChoLmNoaWxkcmVuW2VdKSk7CiAgICByZXR1cm4gdDsKfQp2YXIgcmwgPSBjbGFzcyBleHRlbmRzIEN0IHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIGxldCBzID0gbmV3IG1uKGUsIDQsIDIpLCBuID0gbmV3IF9lKHsKICAgICAgICAgICAgd2lyZWZyYW1lOiAhMCwKICAgICAgICAgICAgZm9nOiAhMSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KTsKICAgICAgICBzdXBlcihzLCBuKSwgdGhpcy5saWdodCA9IHQsIHRoaXMuY29sb3IgPSBpLCB0aGlzLnR5cGUgPSAiUG9pbnRMaWdodEhlbHBlciIsIHRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gITEsIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLCB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KICAgIHVwZGF0ZSgpIHsKICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCAhMSksIHRoaXMuY29sb3IgIT09IHZvaWQgMCA/IHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpIDogdGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpOwogICAgfQp9LCBSZCA9IG5ldyB3LCBvbCA9IG5ldyBQLCBhbCA9IG5ldyBQLCBobCA9IGNsYXNzIGV4dGVuZHMgRyB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBpKXsKICAgICAgICBzdXBlcigpLCB0aGlzLmxpZ2h0ID0gdCwgdGhpcy5tYXRyaXggPSB0Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5jb2xvciA9IGksIHRoaXMudHlwZSA9ICJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiOwogICAgICAgIGxldCBzID0gbmV3IGZuKGUpOwogICAgICAgIHMucm90YXRlWShNYXRoLlBJICogLjUpLCB0aGlzLm1hdGVyaWFsID0gbmV3IF9lKHsKICAgICAgICAgICAgd2lyZWZyYW1lOiAhMCwKICAgICAgICAgICAgZm9nOiAhMSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KSwgdGhpcy5jb2xvciA9PT0gdm9pZCAwICYmICh0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9ICEwKTsKICAgICAgICBsZXQgbiA9IHMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLCByID0gbmV3IEZsb2F0MzJBcnJheShuLmNvdW50ICogMyk7CiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IFoociwgMykpLCB0aGlzLmFkZChuZXcgQ3QocywgdGhpcy5tYXRlcmlhbCkpLCB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLmNoaWxkcmVuWzBdOwogICAgICAgIGlmICh0aGlzLmNvbG9yICE9PSB2b2lkIDApIHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgZSA9IHQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpOwogICAgICAgICAgICBvbC5jb3B5KHRoaXMubGlnaHQuY29sb3IpLCBhbC5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpOwogICAgICAgICAgICBmb3IobGV0IGkgPSAwLCBzID0gZS5jb3VudDsgaSA8IHM7IGkrKyl7CiAgICAgICAgICAgICAgICBsZXQgbiA9IGkgPCBzIC8gMiA/IG9sIDogYWw7CiAgICAgICAgICAgICAgICBlLnNldFhZWihpLCBuLnIsIG4uZywgbi5iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlLm5lZWRzVXBkYXRlID0gITA7CiAgICAgICAgfQogICAgICAgIHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsICExKSwgdC5sb29rQXQoUmQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKTsKICAgIH0KfSwgbGwgPSBjbGFzcyBleHRlbmRzIFd0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxMCwgZSA9IDEwLCBpID0gNDQ3MzkyNCwgcyA9IDg5NDc4NDgpewogICAgICAgIGkgPSBuZXcgUChpKSwgcyA9IG5ldyBQKHMpOwogICAgICAgIGxldCBuID0gZSAvIDIsIHIgPSB0IC8gZSwgbyA9IHQgLyAyLCBhID0gW10sIGwgPSBbXTsKICAgICAgICBmb3IobGV0IGQgPSAwLCBwID0gMCwgZiA9IC1vOyBkIDw9IGU7IGQrKywgZiArPSByKXsKICAgICAgICAgICAgYS5wdXNoKC1vLCAwLCBmLCBvLCAwLCBmKSwgYS5wdXNoKGYsIDAsIC1vLCBmLCAwLCBvKTsKICAgICAgICAgICAgbGV0IG0gPSBkID09PSBuID8gaSA6IHM7CiAgICAgICAgICAgIG0udG9BcnJheShsLCBwKSwgcCArPSAzLCBtLnRvQXJyYXkobCwgcCksIHAgKz0gMywgbS50b0FycmF5KGwsIHApLCBwICs9IDMsIG0udG9BcnJheShsLCBwKSwgcCArPSAzOwogICAgICAgIH0KICAgICAgICBsZXQgYyA9IG5ldyBMOwogICAgICAgIGMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKGEsIDMpKSwgYy5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEUobCwgMykpOwogICAgICAgIGxldCB1ID0gbmV3IG10KHsKICAgICAgICAgICAgdmVydGV4Q29sb3JzOiAhMCwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KTsKICAgICAgICBzdXBlcihjLCB1KSwgdGhpcy50eXBlID0gIkdyaWRIZWxwZXIiOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9Cn0sIGNsID0gY2xhc3MgZXh0ZW5kcyBXdCB7CiAgICBjb25zdHJ1Y3Rvcih0ID0gMTAsIGUgPSAxNiwgaSA9IDgsIHMgPSA2NCwgbiA9IDQ0NzM5MjQsIHIgPSA4OTQ3ODQ4KXsKICAgICAgICBuID0gbmV3IFAobiksIHIgPSBuZXcgUChyKTsKICAgICAgICBsZXQgbyA9IFtdLCBhID0gW107CiAgICAgICAgaWYgKGUgPiAxKSBmb3IobGV0IHUgPSAwOyB1IDwgZTsgdSsrKXsKICAgICAgICAgICAgbGV0IGQgPSB1IC8gZSAqIChNYXRoLlBJICogMiksIHAgPSBNYXRoLnNpbihkKSAqIHQsIGYgPSBNYXRoLmNvcyhkKSAqIHQ7CiAgICAgICAgICAgIG8ucHVzaCgwLCAwLCAwKSwgby5wdXNoKHAsIDAsIGYpOwogICAgICAgICAgICBsZXQgbSA9IHUgJiAxID8gbiA6IHI7CiAgICAgICAgICAgIGEucHVzaChtLnIsIG0uZywgbS5iKSwgYS5wdXNoKG0uciwgbS5nLCBtLmIpOwogICAgICAgIH0KICAgICAgICBmb3IobGV0IHUgPSAwOyB1IDwgaTsgdSsrKXsKICAgICAgICAgICAgbGV0IGQgPSB1ICYgMSA/IG4gOiByLCBwID0gdCAtIHQgLyBpICogdTsKICAgICAgICAgICAgZm9yKGxldCBmID0gMDsgZiA8IHM7IGYrKyl7CiAgICAgICAgICAgICAgICBsZXQgbSA9IGYgLyBzICogKE1hdGguUEkgKiAyKSwgeTEgPSBNYXRoLnNpbihtKSAqIHAsIGcgPSBNYXRoLmNvcyhtKSAqIHA7CiAgICAgICAgICAgICAgICBvLnB1c2goeTEsIDAsIGcpLCBhLnB1c2goZC5yLCBkLmcsIGQuYiksIG0gPSAoZiArIDEpIC8gcyAqIChNYXRoLlBJICogMiksIHkxID0gTWF0aC5zaW4obSkgKiBwLCBnID0gTWF0aC5jb3MobSkgKiBwLCBvLnB1c2goeTEsIDAsIGcpLCBhLnB1c2goZC5yLCBkLmcsIGQuYik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGwgPSBuZXcgTDsKICAgICAgICBsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShvLCAzKSksIGwuc2V0QXR0cmlidXRlKCJjb2xvciIsIG5ldyBFKGEsIDMpKTsKICAgICAgICBsZXQgYyA9IG5ldyBtdCh7CiAgICAgICAgICAgIHZlcnRleENvbG9yczogITAsCiAgICAgICAgICAgIHRvbmVNYXBwZWQ6ICExCiAgICAgICAgfSk7CiAgICAgICAgc3VwZXIobCwgYyksIHRoaXMudHlwZSA9ICJQb2xhckdyaWRIZWxwZXIiOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9Cn0sIHVsID0gbmV3IHcsIFVzID0gbmV3IHcsIGRsID0gbmV3IHcsIHBsID0gY2xhc3MgZXh0ZW5kcyBHIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUsIGkpewogICAgICAgIHN1cGVyKCksIHRoaXMubGlnaHQgPSB0LCB0aGlzLm1hdHJpeCA9IHQubWF0cml4V29ybGQsIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9ICExLCB0aGlzLmNvbG9yID0gaSwgdGhpcy50eXBlID0gIkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIiLCBlID09PSB2b2lkIDAgJiYgKGUgPSAxKTsKICAgICAgICBsZXQgcyA9IG5ldyBMOwogICAgICAgIHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKFsKICAgICAgICAgICAgLWUsCiAgICAgICAgICAgIGUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGUsCiAgICAgICAgICAgIGUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGUsCiAgICAgICAgICAgIC1lLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtZSwKICAgICAgICAgICAgLWUsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC1lLAogICAgICAgICAgICBlLAogICAgICAgICAgICAwCiAgICAgICAgXSwgMykpOwogICAgICAgIGxldCBuID0gbmV3IG10KHsKICAgICAgICAgICAgZm9nOiAhMSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KTsKICAgICAgICB0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgbGUocywgbiksIHRoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSksIHMgPSBuZXcgTCwgcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoWwogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxCiAgICAgICAgXSwgMykpLCB0aGlzLnRhcmdldExpbmUgPSBuZXcgbGUocywgbiksIHRoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSksIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMubGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksIHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgICAgdGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwgITEpLCB1bC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksIFVzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksIGRsLnN1YlZlY3RvcnMoVXMsIHVsKSwgdGhpcy5saWdodFBsYW5lLmxvb2tBdChVcyksIHRoaXMuY29sb3IgIT09IHZvaWQgMCA/ICh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLCB0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpKSA6ICh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSwgdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikpLCB0aGlzLnRhcmdldExpbmUubG9va0F0KFVzKSwgdGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSBkbC5sZW5ndGgoKTsKICAgIH0KfSwgV3MgPSBuZXcgdywgZXQgPSBuZXcgR2ksIGZsID0gY2xhc3MgZXh0ZW5kcyBXdCB7CiAgICBjb25zdHJ1Y3Rvcih0KXsKICAgICAgICBsZXQgZSA9IG5ldyBMLCBpID0gbmV3IG10KHsKICAgICAgICAgICAgY29sb3I6IDE2Nzc3MjE1LAogICAgICAgICAgICB2ZXJ0ZXhDb2xvcnM6ICEwLAogICAgICAgICAgICB0b25lTWFwcGVkOiAhMQogICAgICAgIH0pLCBzID0gW10sIG4gPSBbXSwgciA9IHt9OwogICAgICAgIG8oIm4xIiwgIm4yIiksIG8oIm4yIiwgIm40IiksIG8oIm40IiwgIm4zIiksIG8oIm4zIiwgIm4xIiksIG8oImYxIiwgImYyIiksIG8oImYyIiwgImY0IiksIG8oImY0IiwgImYzIiksIG8oImYzIiwgImYxIiksIG8oIm4xIiwgImYxIiksIG8oIm4yIiwgImYyIiksIG8oIm4zIiwgImYzIiksIG8oIm40IiwgImY0IiksIG8oInAiLCAibjEiKSwgbygicCIsICJuMiIpLCBvKCJwIiwgIm4zIiksIG8oInAiLCAibjQiKSwgbygidTEiLCAidTIiKSwgbygidTIiLCAidTMiKSwgbygidTMiLCAidTEiKSwgbygiYyIsICJ0IiksIG8oInAiLCAiYyIpLCBvKCJjbjEiLCAiY24yIiksIG8oImNuMyIsICJjbjQiKSwgbygiY2YxIiwgImNmMiIpLCBvKCJjZjMiLCAiY2Y0Iik7CiAgICAgICAgZnVuY3Rpb24gbyhmLCBtKSB7CiAgICAgICAgICAgIGEoZiksIGEobSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGEoZikgewogICAgICAgICAgICBzLnB1c2goMCwgMCwgMCksIG4ucHVzaCgwLCAwLCAwKSwgcltmXSA9PT0gdm9pZCAwICYmIChyW2ZdID0gW10pLCByW2ZdLnB1c2gocy5sZW5ndGggLyAzIC0gMSk7CiAgICAgICAgfQogICAgICAgIGUuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKHMsIDMpKSwgZS5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEUobiwgMykpLCBzdXBlcihlLCBpKSwgdGhpcy50eXBlID0gIkNhbWVyYUhlbHBlciIsIHRoaXMuY2FtZXJhID0gdCwgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCAmJiB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksIHRoaXMubWF0cml4ID0gdC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gITEsIHRoaXMucG9pbnRNYXAgPSByLCB0aGlzLnVwZGF0ZSgpOwogICAgICAgIGxldCBsID0gbmV3IFAoMTY3NTUyMDApLCBjID0gbmV3IFAoMTY3MTE2ODApLCB1ID0gbmV3IFAoNDM3NzUpLCBkID0gbmV3IFAoMTY3NzcyMTUpLCBwID0gbmV3IFAoMzM1NTQ0Myk7CiAgICAgICAgdGhpcy5zZXRDb2xvcnMobCwgYywgdSwgZCwgcCk7CiAgICB9CiAgICBzZXRDb2xvcnModCwgZSwgaSwgcywgbikgewogICAgICAgIGxldCBvID0gdGhpcy5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7CiAgICAgICAgby5zZXRYWVooMCwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDEsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigyLCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMywgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDQsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWig1LCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooNiwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDcsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWig4LCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooOSwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDEwLCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMTEsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigxMiwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDEzLCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMTQsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigxNSwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDE2LCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMTcsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigxOCwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDE5LCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMjAsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigyMSwgdC5yLCB0LmcsIHQuYiksIG8uc2V0WFlaKDIyLCB0LnIsIHQuZywgdC5iKSwgby5zZXRYWVooMjMsIHQuciwgdC5nLCB0LmIpLCBvLnNldFhZWigyNCwgZS5yLCBlLmcsIGUuYiksIG8uc2V0WFlaKDI1LCBlLnIsIGUuZywgZS5iKSwgby5zZXRYWVooMjYsIGUuciwgZS5nLCBlLmIpLCBvLnNldFhZWigyNywgZS5yLCBlLmcsIGUuYiksIG8uc2V0WFlaKDI4LCBlLnIsIGUuZywgZS5iKSwgby5zZXRYWVooMjksIGUuciwgZS5nLCBlLmIpLCBvLnNldFhZWigzMCwgZS5yLCBlLmcsIGUuYiksIG8uc2V0WFlaKDMxLCBlLnIsIGUuZywgZS5iKSwgby5zZXRYWVooMzIsIGkuciwgaS5nLCBpLmIpLCBvLnNldFhZWigzMywgaS5yLCBpLmcsIGkuYiksIG8uc2V0WFlaKDM0LCBpLnIsIGkuZywgaS5iKSwgby5zZXRYWVooMzUsIGkuciwgaS5nLCBpLmIpLCBvLnNldFhZWigzNiwgaS5yLCBpLmcsIGkuYiksIG8uc2V0WFlaKDM3LCBpLnIsIGkuZywgaS5iKSwgby5zZXRYWVooMzgsIHMuciwgcy5nLCBzLmIpLCBvLnNldFhZWigzOSwgcy5yLCBzLmcsIHMuYiksIG8uc2V0WFlaKDQwLCBuLnIsIG4uZywgbi5iKSwgby5zZXRYWVooNDEsIG4uciwgbi5nLCBuLmIpLCBvLnNldFhZWig0Miwgbi5yLCBuLmcsIG4uYiksIG8uc2V0WFlaKDQzLCBuLnIsIG4uZywgbi5iKSwgby5zZXRYWVooNDQsIG4uciwgbi5nLCBuLmIpLCBvLnNldFhZWig0NSwgbi5yLCBuLmcsIG4uYiksIG8uc2V0WFlaKDQ2LCBuLnIsIG4uZywgbi5iKSwgby5zZXRYWVooNDcsIG4uciwgbi5nLCBuLmIpLCBvLnNldFhZWig0OCwgbi5yLCBuLmcsIG4uYiksIG8uc2V0WFlaKDQ5LCBuLnIsIG4uZywgbi5iKSwgby5uZWVkc1VwZGF0ZSA9ICEwOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICAgIGxldCB0ID0gdGhpcy5nZW9tZXRyeSwgZSA9IHRoaXMucG9pbnRNYXAsIGkgPSAxLCBzID0gMTsKICAgICAgICBldC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTsKICAgICAgICBsZXQgbiA9IHRoaXMuY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW0gPT09IG9lID8gLTEgOiAwOwogICAgICAgIGl0KCJjIiwgZSwgdCwgZXQsIDAsIDAsIG4pLCBpdCgidCIsIGUsIHQsIGV0LCAwLCAwLCAxKSwgaXQoIm4xIiwgZSwgdCwgZXQsIC1pLCAtcywgbiksIGl0KCJuMiIsIGUsIHQsIGV0LCBpLCAtcywgbiksIGl0KCJuMyIsIGUsIHQsIGV0LCAtaSwgcywgbiksIGl0KCJuNCIsIGUsIHQsIGV0LCBpLCBzLCBuKSwgaXQoImYxIiwgZSwgdCwgZXQsIC1pLCAtcywgMSksIGl0KCJmMiIsIGUsIHQsIGV0LCBpLCAtcywgMSksIGl0KCJmMyIsIGUsIHQsIGV0LCAtaSwgcywgMSksIGl0KCJmNCIsIGUsIHQsIGV0LCBpLCBzLCAxKSwgaXQoInUxIiwgZSwgdCwgZXQsIGkgKiAuNywgcyAqIDEuMSwgbiksIGl0KCJ1MiIsIGUsIHQsIGV0LCAtaSAqIC43LCBzICogMS4xLCBuKSwgaXQoInUzIiwgZSwgdCwgZXQsIDAsIHMgKiAyLCBuKSwgaXQoImNmMSIsIGUsIHQsIGV0LCAtaSwgMCwgMSksIGl0KCJjZjIiLCBlLCB0LCBldCwgaSwgMCwgMSksIGl0KCJjZjMiLCBlLCB0LCBldCwgMCwgLXMsIDEpLCBpdCgiY2Y0IiwgZSwgdCwgZXQsIDAsIHMsIDEpLCBpdCgiY24xIiwgZSwgdCwgZXQsIC1pLCAwLCBuKSwgaXQoImNuMiIsIGUsIHQsIGV0LCBpLCAwLCBuKSwgaXQoImNuMyIsIGUsIHQsIGV0LCAwLCAtcywgbiksIGl0KCJjbjQiLCBlLCB0LCBldCwgMCwgcywgbiksIHQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlID0gITA7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLCB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KfTsKZnVuY3Rpb24gaXQoaCwgdCwgZSwgaSwgcywgbiwgcikgewogICAgV3Muc2V0KHMsIG4sIHIpLnVucHJvamVjdChpKTsKICAgIGxldCBvID0gdFtoXTsKICAgIGlmIChvICE9PSB2b2lkIDApIHsKICAgICAgICBsZXQgYSA9IGUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpOwogICAgICAgIGZvcihsZXQgbCA9IDAsIGMgPSBvLmxlbmd0aDsgbCA8IGM7IGwrKylhLnNldFhZWihvW2xdLCBXcy54LCBXcy55LCBXcy56KTsKICAgIH0KfQp2YXIgSHMgPSBuZXcgZnQsIG1sID0gY2xhc3MgZXh0ZW5kcyBXdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gMTY3NzY5NjApewogICAgICAgIGxldCBpID0gbmV3IFVpbnQxNkFycmF5KFsKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgMywKICAgICAgICAgICAgMywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgNywKICAgICAgICAgICAgNywKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgNSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgNiwKICAgICAgICAgICAgMywKICAgICAgICAgICAgNwogICAgICAgIF0pLCBzID0gbmV3IEZsb2F0MzJBcnJheSg4ICogMyksIG4gPSBuZXcgTDsKICAgICAgICBuLnNldEluZGV4KG5ldyBaKGksIDEpKSwgbi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IFoocywgMykpLCBzdXBlcihuLCBuZXcgbXQoewogICAgICAgICAgICBjb2xvcjogZSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KSksIHRoaXMub2JqZWN0ID0gdCwgdGhpcy50eXBlID0gIkJveEhlbHBlciIsIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9ICExLCB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgdXBkYXRlKHQpIHsKICAgICAgICBpZiAodCAhPT0gdm9pZCAwICYmIGNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIiksIHRoaXMub2JqZWN0ICE9PSB2b2lkIDAgJiYgSHMuc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCksIEhzLmlzRW1wdHkoKSkgcmV0dXJuOwogICAgICAgIGxldCBlID0gSHMubWluLCBpID0gSHMubWF4LCBzID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBuID0gcy5hcnJheTsKICAgICAgICBuWzBdID0gaS54LCBuWzFdID0gaS55LCBuWzJdID0gaS56LCBuWzNdID0gZS54LCBuWzRdID0gaS55LCBuWzVdID0gaS56LCBuWzZdID0gZS54LCBuWzddID0gZS55LCBuWzhdID0gaS56LCBuWzldID0gaS54LCBuWzEwXSA9IGUueSwgblsxMV0gPSBpLnosIG5bMTJdID0gaS54LCBuWzEzXSA9IGkueSwgblsxNF0gPSBlLnosIG5bMTVdID0gZS54LCBuWzE2XSA9IGkueSwgblsxN10gPSBlLnosIG5bMThdID0gZS54LCBuWzE5XSA9IGUueSwgblsyMF0gPSBlLnosIG5bMjFdID0gaS54LCBuWzIyXSA9IGUueSwgblsyM10gPSBlLnosIHMubmVlZHNVcGRhdGUgPSAhMCwgdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgIH0KICAgIHNldEZyb21PYmplY3QodCkgewogICAgICAgIHJldHVybiB0aGlzLm9iamVjdCA9IHQsIHRoaXMudXBkYXRlKCksIHRoaXM7CiAgICB9CiAgICBjb3B5KHQsIGUpIHsKICAgICAgICByZXR1cm4gc3VwZXIuY29weSh0LCBlKSwgdGhpcy5vYmplY3QgPSB0Lm9iamVjdCwgdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQp9LCB5bCA9IGNsYXNzIGV4dGVuZHMgV3QgewogICAgY29uc3RydWN0b3IodCwgZSA9IDE2Nzc2OTYwKXsKICAgICAgICBsZXQgaSA9IG5ldyBVaW50MTZBcnJheShbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDUsCiAgICAgICAgICAgIDUsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDcsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDUsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIDYsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgIDcKICAgICAgICBdKSwgcyA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMQogICAgICAgIF0sIG4gPSBuZXcgTDsKICAgICAgICBuLnNldEluZGV4KG5ldyBaKGksIDEpKSwgbi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUocywgMykpLCBzdXBlcihuLCBuZXcgbXQoewogICAgICAgICAgICBjb2xvcjogZSwKICAgICAgICAgICAgdG9uZU1hcHBlZDogITEKICAgICAgICB9KSksIHRoaXMuYm94ID0gdCwgdGhpcy50eXBlID0gIkJveDNIZWxwZXIiLCB0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQodCkgewogICAgICAgIGxldCBlID0gdGhpcy5ib3g7CiAgICAgICAgZS5pc0VtcHR5KCkgfHwgKGUuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLCBlLmdldFNpemUodGhpcy5zY2FsZSksIHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoLjUpLCBzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLCB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KfSwgZ2wgPSBjbGFzcyBleHRlbmRzIGxlIHsKICAgIGNvbnN0cnVjdG9yKHQsIGUgPSAxLCBpID0gMTY3NzY5NjApewogICAgICAgIGxldCBzID0gaSwgbiA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwCiAgICAgICAgXSwgciA9IG5ldyBMOwogICAgICAgIHIuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBFKG4sIDMpKSwgci5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgc3VwZXIociwgbmV3IG10KHsKICAgICAgICAgICAgY29sb3I6IHMsCiAgICAgICAgICAgIHRvbmVNYXBwZWQ6ICExCiAgICAgICAgfSkpLCB0aGlzLnR5cGUgPSAiUGxhbmVIZWxwZXIiLCB0aGlzLnBsYW5lID0gdCwgdGhpcy5zaXplID0gZTsKICAgICAgICBsZXQgbyA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgMAogICAgICAgIF0sIGEgPSBuZXcgTDsKICAgICAgICBhLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShvLCAzKSksIGEuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksIHRoaXMuYWRkKG5ldyBDdChhLCBuZXcgX2UoewogICAgICAgICAgICBjb2xvcjogcywKICAgICAgICAgICAgb3BhY2l0eTogLjIsCiAgICAgICAgICAgIHRyYW5zcGFyZW50OiAhMCwKICAgICAgICAgICAgZGVwdGhXcml0ZTogITEsCiAgICAgICAgICAgIHRvbmVNYXBwZWQ6ICExCiAgICAgICAgfSkpKTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKHQpIHsKICAgICAgICB0aGlzLnBvc2l0aW9uLnNldCgwLCAwLCAwKSwgdGhpcy5zY2FsZS5zZXQoLjUgKiB0aGlzLnNpemUsIC41ICogdGhpcy5zaXplLCAxKSwgdGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpLCB0aGlzLnRyYW5zbGF0ZVooLXRoaXMucGxhbmUuY29uc3RhbnQpLCBzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KTsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpLCB0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9Cn0sIHhsID0gbmV3IHcsIHFzLCB1ciwgYmwgPSBjbGFzcyBleHRlbmRzIEcgewogICAgY29uc3RydWN0b3IodCA9IG5ldyB3KDAsIDAsIDEpLCBlID0gbmV3IHcoMCwgMCwgMCksIGkgPSAxLCBzID0gMTY3NzY5NjAsIG4gPSBpICogLjIsIHIgPSBuICogLjIpewogICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9ICJBcnJvd0hlbHBlciIsIHFzID09PSB2b2lkIDAgJiYgKHFzID0gbmV3IEwsIHFzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRShbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAKICAgICAgICBdLCAzKSksIHVyID0gbmV3ICRpKDAsIC41LCAxLCA1LCAxKSwgdXIudHJhbnNsYXRlKDAsIC0uNSwgMCkpLCB0aGlzLnBvc2l0aW9uLmNvcHkoZSksIHRoaXMubGluZSA9IG5ldyBsZShxcywgbmV3IG10KHsKICAgICAgICAgICAgY29sb3I6IHMsCiAgICAgICAgICAgIHRvbmVNYXBwZWQ6ICExCiAgICAgICAgfSkpLCB0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9ICExLCB0aGlzLmFkZCh0aGlzLmxpbmUpLCB0aGlzLmNvbmUgPSBuZXcgQ3QodXIsIG5ldyBfZSh7CiAgICAgICAgICAgIGNvbG9yOiBzLAogICAgICAgICAgICB0b25lTWFwcGVkOiAhMQogICAgICAgIH0pKSwgdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSAhMSwgdGhpcy5hZGQodGhpcy5jb25lKSwgdGhpcy5zZXREaXJlY3Rpb24odCksIHRoaXMuc2V0TGVuZ3RoKGksIG4sIHIpOwogICAgfQogICAgc2V0RGlyZWN0aW9uKHQpIHsKICAgICAgICBpZiAodC55ID4gLjk5OTk5KSB0aGlzLnF1YXRlcm5pb24uc2V0KDAsIDAsIDAsIDEpOwogICAgICAgIGVsc2UgaWYgKHQueSA8IC0uOTk5OTkpIHRoaXMucXVhdGVybmlvbi5zZXQoMSwgMCwgMCwgMCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHhsLnNldCh0LnosIDAsIC10LngpLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICBsZXQgZSA9IE1hdGguYWNvcyh0LnkpOwogICAgICAgICAgICB0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh4bCwgZSk7CiAgICAgICAgfQogICAgfQogICAgc2V0TGVuZ3RoKHQsIGUgPSB0ICogLjIsIGkgPSBlICogLjIpIHsKICAgICAgICB0aGlzLmxpbmUuc2NhbGUuc2V0KDEsIE1hdGgubWF4KDFlLTQsIHQgLSBlKSwgMSksIHRoaXMubGluZS51cGRhdGVNYXRyaXgoKSwgdGhpcy5jb25lLnNjYWxlLnNldChpLCBlLCBpKSwgdGhpcy5jb25lLnBvc2l0aW9uLnkgPSB0LCB0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7CiAgICB9CiAgICBzZXRDb2xvcih0KSB7CiAgICAgICAgdGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0KSwgdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0KTsKICAgIH0KICAgIGNvcHkodCkgewogICAgICAgIHJldHVybiBzdXBlci5jb3B5KHQsICExKSwgdGhpcy5saW5lLmNvcHkodC5saW5lKSwgdGhpcy5jb25lLmNvcHkodC5jb25lKSwgdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5saW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSwgdGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSwgdGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KfSwgd2wgPSBjbGFzcyBleHRlbmRzIFd0IHsKICAgIGNvbnN0cnVjdG9yKHQgPSAxKXsKICAgICAgICBsZXQgZSA9IFsKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgdAogICAgICAgIF0sIGkgPSBbCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIC42LAogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxLAogICAgICAgICAgICAwLAogICAgICAgICAgICAuNiwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgLjYsCiAgICAgICAgICAgIDEKICAgICAgICBdLCBzID0gbmV3IEw7CiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEUoZSwgMykpLCBzLnNldEF0dHJpYnV0ZSgiY29sb3IiLCBuZXcgRShpLCAzKSk7CiAgICAgICAgbGV0IG4gPSBuZXcgbXQoewogICAgICAgICAgICB2ZXJ0ZXhDb2xvcnM6ICEwLAogICAgICAgICAgICB0b25lTWFwcGVkOiAhMQogICAgICAgIH0pOwogICAgICAgIHN1cGVyKHMsIG4pLCB0aGlzLnR5cGUgPSAiQXhlc0hlbHBlciI7CiAgICB9CiAgICBzZXRDb2xvcnModCwgZSwgaSkgewogICAgICAgIGxldCBzID0gbmV3IFAsIG4gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuYXJyYXk7CiAgICAgICAgcmV0dXJuIHMuc2V0KHQpLCBzLnRvQXJyYXkobiwgMCksIHMudG9BcnJheShuLCAzKSwgcy5zZXQoZSksIHMudG9BcnJheShuLCA2KSwgcy50b0FycmF5KG4sIDkpLCBzLnNldChpKSwgcy50b0FycmF5KG4sIDEyKSwgcy50b0FycmF5KG4sIDE1KSwgdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLm5lZWRzVXBkYXRlID0gITAsIHRoaXM7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLCB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KfSwgTWwgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3RvcigpewogICAgICAgIHRoaXMudHlwZSA9ICJTaGFwZVBhdGgiLCB0aGlzLmNvbG9yID0gbmV3IFAsIHRoaXMuc3ViUGF0aHMgPSBbXSwgdGhpcy5jdXJyZW50UGF0aCA9IG51bGw7CiAgICB9CiAgICBtb3ZlVG8odCwgZSkgewogICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYXRoID0gbmV3IG1pLCB0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCksIHRoaXMuY3VycmVudFBhdGgubW92ZVRvKHQsIGUpLCB0aGlzOwogICAgfQogICAgbGluZVRvKHQsIGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5saW5lVG8odCwgZSksIHRoaXM7CiAgICB9CiAgICBxdWFkcmF0aWNDdXJ2ZVRvKHQsIGUsIGksIHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHQsIGUsIGksIHMpLCB0aGlzOwogICAgfQogICAgYmV6aWVyQ3VydmVUbyh0LCBlLCBpLCBzLCBuLCByKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyh0LCBlLCBpLCBzLCBuLCByKSwgdGhpczsKICAgIH0KICAgIHNwbGluZVRocnUodCkgewogICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUodCksIHRoaXM7CiAgICB9CiAgICB0b1NoYXBlcyh0KSB7CiAgICAgICAgZnVuY3Rpb24gZShnKSB7CiAgICAgICAgICAgIGxldCB4MSA9IFtdOwogICAgICAgICAgICBmb3IobGV0IGIgPSAwLCBNID0gZy5sZW5ndGg7IGIgPCBNOyBiKyspewogICAgICAgICAgICAgICAgbGV0IF8gPSBnW2JdLCB2ID0gbmV3IE1lOwogICAgICAgICAgICAgICAgdi5jdXJ2ZXMgPSBfLmN1cnZlcywgeDEucHVzaCh2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geDE7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGkoZywgeDEpIHsKICAgICAgICAgICAgbGV0IGIgPSB4MS5sZW5ndGgsIE0gPSAhMTsKICAgICAgICAgICAgZm9yKGxldCBfID0gYiAtIDEsIHYgPSAwOyB2IDwgYjsgXyA9IHYrKyl7CiAgICAgICAgICAgICAgICBsZXQgUyA9IHgxW19dLCBBID0geDFbdl0sIEkgPSBBLnggLSBTLngsIEMgPSBBLnkgLSBTLnk7CiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoQykgPiBOdW1iZXIuRVBTSUxPTikgewogICAgICAgICAgICAgICAgICAgIGlmIChDIDwgMCAmJiAoUyA9IHgxW3ZdLCBJID0gLUksIEEgPSB4MVtfXSwgQyA9IC1DKSwgZy55IDwgUy55IHx8IGcueSA+IEEueSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGcueSA9PT0gUy55KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLnggPT09IFMueCkgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrID0gQyAqIChnLnggLSBTLngpIC0gSSAqIChnLnkgLSBTLnkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gMCkgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA8IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICBNID0gIU07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZy55ICE9PSBTLnkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBLnggPD0gZy54ICYmIGcueCA8PSBTLnggfHwgUy54IDw9IGcueCAmJiBnLnggPD0gQS54KSByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE07CiAgICAgICAgfQogICAgICAgIGxldCBzID0gaGUuaXNDbG9ja1dpc2UsIG4gPSB0aGlzLnN1YlBhdGhzOwogICAgICAgIGlmIChuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOwogICAgICAgIGxldCByLCBvLCBhLCBsID0gW107CiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSByZXR1cm4gbyA9IG5bMF0sIGEgPSBuZXcgTWUsIGEuY3VydmVzID0gby5jdXJ2ZXMsIGwucHVzaChhKSwgbDsKICAgICAgICBsZXQgYyA9ICFzKG5bMF0uZ2V0UG9pbnRzKCkpOwogICAgICAgIGMgPSB0ID8gIWMgOiBjOwogICAgICAgIGxldCB1ID0gW10sIGQgPSBbXSwgcCA9IFtdLCBmID0gMCwgbTsKICAgICAgICBkW2ZdID0gdm9pZCAwLCBwW2ZdID0gW107CiAgICAgICAgZm9yKGxldCBnID0gMCwgeDEgPSBuLmxlbmd0aDsgZyA8IHgxOyBnKyspbyA9IG5bZ10sIG0gPSBvLmdldFBvaW50cygpLCByID0gcyhtKSwgciA9IHQgPyAhciA6IHIsIHIgPyAoIWMgJiYgZFtmXSAmJiBmKyssIGRbZl0gPSB7CiAgICAgICAgICAgIHM6IG5ldyBNZSwKICAgICAgICAgICAgcDogbQogICAgICAgIH0sIGRbZl0ucy5jdXJ2ZXMgPSBvLmN1cnZlcywgYyAmJiBmKyssIHBbZl0gPSBbXSkgOiBwW2ZdLnB1c2goewogICAgICAgICAgICBoOiBvLAogICAgICAgICAgICBwOiBtWzBdCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFkWzBdKSByZXR1cm4gZShuKTsKICAgICAgICBpZiAoZC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIGxldCBnID0gITEsIHgxID0gMDsKICAgICAgICAgICAgZm9yKGxldCBiID0gMCwgTSA9IGQubGVuZ3RoOyBiIDwgTTsgYisrKXVbYl0gPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBiID0gMCwgTSA9IGQubGVuZ3RoOyBiIDwgTTsgYisrKXsKICAgICAgICAgICAgICAgIGxldCBfID0gcFtiXTsKICAgICAgICAgICAgICAgIGZvcihsZXQgdiA9IDA7IHYgPCBfLmxlbmd0aDsgdisrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgUyA9IF9bdl0sIEEgPSAhMDsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IEkgPSAwOyBJIDwgZC5sZW5ndGg7IEkrKylpKFMucCwgZFtJXS5wKSAmJiAoYiAhPT0gSSAmJiB4MSsrLCBBID8gKEEgPSAhMSwgdVtJXS5wdXNoKFMpKSA6IGcgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgQSAmJiB1W2JdLnB1c2goUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeDEgPiAwICYmIGcgPT09ICExICYmIChwID0gdSk7CiAgICAgICAgfQogICAgICAgIGxldCB5MTsKICAgICAgICBmb3IobGV0IGcgPSAwLCB4MSA9IGQubGVuZ3RoOyBnIDwgeDE7IGcrKyl7CiAgICAgICAgICAgIGEgPSBkW2ddLnMsIGwucHVzaChhKSwgeTEgPSBwW2ddOwogICAgICAgICAgICBmb3IobGV0IGIgPSAwLCBNID0geTEubGVuZ3RoOyBiIDwgTTsgYisrKWEuaG9sZXMucHVzaCh5MVtiXS5oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGw7CiAgICB9Cn0sIF9sID0gY2xhc3MgZXh0ZW5kcyBxdCB7CiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gbnVsbCl7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5vYmplY3QgPSB0LCB0aGlzLmRvbUVsZW1lbnQgPSBlLCB0aGlzLmVuYWJsZWQgPSAhMCwgdGhpcy5zdGF0ZSA9IC0xLCB0aGlzLmtleXMgPSB7fSwgdGhpcy5tb3VzZUJ1dHRvbnMgPSB7CiAgICAgICAgICAgIExFRlQ6IG51bGwsCiAgICAgICAgICAgIE1JRERMRTogbnVsbCwKICAgICAgICAgICAgUklHSFQ6IG51bGwKICAgICAgICB9LCB0aGlzLnRvdWNoZXMgPSB7CiAgICAgICAgICAgIE9ORTogbnVsbCwKICAgICAgICAgICAgVFdPOiBudWxsCiAgICAgICAgfTsKICAgIH0KICAgIGNvbm5lY3QoKSB7fQogICAgZGlzY29ubmVjdCgpIHt9CiAgICBkaXNwb3NlKCkge30KICAgIHVwZGF0ZSgpIHt9Cn07CmZ1bmN0aW9uIGtkKGgsIHQpIHsKICAgIGxldCBlID0gaC5pbWFnZSAmJiBoLmltYWdlLndpZHRoID8gaC5pbWFnZS53aWR0aCAvIGguaW1hZ2UuaGVpZ2h0IDogMTsKICAgIHJldHVybiBlID4gdCA/IChoLnJlcGVhdC54ID0gMSwgaC5yZXBlYXQueSA9IGUgLyB0LCBoLm9mZnNldC54ID0gMCwgaC5vZmZzZXQueSA9ICgxIC0gaC5yZXBlYXQueSkgLyAyKSA6IChoLnJlcGVhdC54ID0gdCAvIGUsIGgucmVwZWF0LnkgPSAxLCBoLm9mZnNldC54ID0gKDEgLSBoLnJlcGVhdC54KSAvIDIsIGgub2Zmc2V0LnkgPSAwKSwgaDsKfQpmdW5jdGlvbiBQZChoLCB0KSB7CiAgICBsZXQgZSA9IGguaW1hZ2UgJiYgaC5pbWFnZS53aWR0aCA/IGguaW1hZ2Uud2lkdGggLyBoLmltYWdlLmhlaWdodCA6IDE7CiAgICByZXR1cm4gZSA+IHQgPyAoaC5yZXBlYXQueCA9IHQgLyBlLCBoLnJlcGVhdC55ID0gMSwgaC5vZmZzZXQueCA9ICgxIC0gaC5yZXBlYXQueCkgLyAyLCBoLm9mZnNldC55ID0gMCkgOiAoaC5yZXBlYXQueCA9IDEsIGgucmVwZWF0LnkgPSBlIC8gdCwgaC5vZmZzZXQueCA9IDAsIGgub2Zmc2V0LnkgPSAoMSAtIGgucmVwZWF0LnkpIC8gMiksIGg7Cn0KZnVuY3Rpb24gT2QoaCkgewogICAgcmV0dXJuIGgucmVwZWF0LnggPSAxLCBoLnJlcGVhdC55ID0gMSwgaC5vZmZzZXQueCA9IDAsIGgub2Zmc2V0LnkgPSAwLCBoOwp9CmZ1bmN0aW9uIE5kKGgsIHQsIGUsIGkpIHsKICAgIGxldCBzID0gVmQoaSk7CiAgICBzd2l0Y2goZSl7CiAgICAgICAgY2FzZSByYzoKICAgICAgICAgICAgcmV0dXJuIGggKiB0OwogICAgICAgIGNhc2UgYWM6CiAgICAgICAgICAgIHJldHVybiBoICogdDsKICAgICAgICBjYXNlIGhjOgogICAgICAgICAgICByZXR1cm4gaCAqIHQgKiAyOwogICAgICAgIGNhc2UgVGw6CiAgICAgICAgICAgIHJldHVybiBoICogdCAvIHMuY29tcG9uZW50cyAqIHMuYnl0ZUxlbmd0aDsKICAgICAgICBjYXNlIElsOgogICAgICAgICAgICByZXR1cm4gaCAqIHQgLyBzLmNvbXBvbmVudHMgKiBzLmJ5dGVMZW5ndGg7CiAgICAgICAgY2FzZSBsYzoKICAgICAgICAgICAgcmV0dXJuIGggKiB0ICogMiAvIHMuY29tcG9uZW50cyAqIHMuYnl0ZUxlbmd0aDsKICAgICAgICBjYXNlIGNjOgogICAgICAgICAgICByZXR1cm4gaCAqIHQgKiAyIC8gcy5jb21wb25lbnRzICogcy5ieXRlTGVuZ3RoOwogICAgICAgIGNhc2Ugb2M6CiAgICAgICAgICAgIHJldHVybiBoICogdCAqIDMgLyBzLmNvbXBvbmVudHMgKiBzLmJ5dGVMZW5ndGg7CiAgICAgICAgY2FzZSBMaToKICAgICAgICAgICAgcmV0dXJuIGggKiB0ICogNCAvIHMuY29tcG9uZW50cyAqIHMuYnl0ZUxlbmd0aDsKICAgICAgICBjYXNlIHVjOgogICAgICAgICAgICByZXR1cm4gaCAqIHQgKiA0IC8gcy5jb21wb25lbnRzICogcy5ieXRlTGVuZ3RoOwogICAgICAgIGNhc2UgZGM6CiAgICAgICAgY2FzZSBwYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyAzKSAvIDQpICogTWF0aC5mbG9vcigodCArIDMpIC8gNCkgKiA4OwogICAgICAgIGNhc2UgZmM6CiAgICAgICAgY2FzZSBtYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyAzKSAvIDQpICogTWF0aC5mbG9vcigodCArIDMpIC8gNCkgKiAxNjsKICAgICAgICBjYXNlIGdjOgogICAgICAgIGNhc2UgYmM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChoLCAxNikgKiBNYXRoLm1heCh0LCA4KSAvIDQ7CiAgICAgICAgY2FzZSB5YzoKICAgICAgICBjYXNlIHhjOgogICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoaCwgOCkgKiBNYXRoLm1heCh0LCA4KSAvIDI7CiAgICAgICAgY2FzZSB3YzoKICAgICAgICBjYXNlIE1jOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoaCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKCh0ICsgMykgLyA0KSAqIDg7CiAgICAgICAgY2FzZSBfYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyAzKSAvIDQpICogTWF0aC5mbG9vcigodCArIDMpIC8gNCkgKiAxNjsKICAgICAgICBjYXNlIHZjOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoaCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKCh0ICsgMykgLyA0KSAqIDE2OwogICAgICAgIGNhc2UgQWM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKChoICsgNCkgLyA1KSAqIE1hdGguZmxvb3IoKHQgKyAzKSAvIDQpICogMTY7CiAgICAgICAgY2FzZSBTYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA0KSAvIDUpICogTWF0aC5mbG9vcigodCArIDQpIC8gNSkgKiAxNjsKICAgICAgICBjYXNlIFRjOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoaCArIDUpIC8gNikgKiBNYXRoLmZsb29yKCh0ICsgNCkgLyA1KSAqIDE2OwogICAgICAgIGNhc2UgSWM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKChoICsgNSkgLyA2KSAqIE1hdGguZmxvb3IoKHQgKyA1KSAvIDYpICogMTY7CiAgICAgICAgY2FzZSBDYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA3KSAvIDgpICogTWF0aC5mbG9vcigodCArIDQpIC8gNSkgKiAxNjsKICAgICAgICBjYXNlIHpjOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoaCArIDcpIC8gOCkgKiBNYXRoLmZsb29yKCh0ICsgNSkgLyA2KSAqIDE2OwogICAgICAgIGNhc2UgRmM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKChoICsgNykgLyA4KSAqIE1hdGguZmxvb3IoKHQgKyA3KSAvIDgpICogMTY7CiAgICAgICAgY2FzZSBCYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKHQgKyA0KSAvIDUpICogMTY7CiAgICAgICAgY2FzZSBFYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKHQgKyA1KSAvIDYpICogMTY7CiAgICAgICAgY2FzZSBSYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKHQgKyA3KSAvIDgpICogMTY7CiAgICAgICAgY2FzZSBrYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKHQgKyA5KSAvIDEwKSAqIDE2OwogICAgICAgIGNhc2UgUGM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKChoICsgMTEpIC8gMTIpICogTWF0aC5mbG9vcigodCArIDkpIC8gMTApICogMTY7CiAgICAgICAgY2FzZSBPYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGggKyAxMSkgLyAxMikgKiBNYXRoLmZsb29yKCh0ICsgMTEpIC8gMTIpICogMTY7CiAgICAgICAgY2FzZSBOYzoKICAgICAgICBjYXNlIFZjOgogICAgICAgIGNhc2UgRGM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoaCAvIDQpICogTWF0aC5jZWlsKHQgLyA0KSAqIDE2OwogICAgICAgIGNhc2UgTGM6CiAgICAgICAgY2FzZSBVYzoKICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChoIC8gNCkgKiBNYXRoLmNlaWwodCAvIDQpICogODsKICAgICAgICBjYXNlIFdjOgogICAgICAgIGNhc2UgSGM6CiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoaCAvIDQpICogTWF0aC5jZWlsKHQgLyA0KSAqIDE2OwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIHRleHR1cmUgYnl0ZSBsZW5ndGggZm9yICR7ZX0gZm9ybWF0LmApOwp9CmZ1bmN0aW9uIFZkKGgpIHsKICAgIHN3aXRjaChoKXsKICAgICAgICBjYXNlIFNsOgogICAgICAgIGNhc2UgJGw6CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiAxLAogICAgICAgICAgICAgICAgY29tcG9uZW50czogMQogICAgICAgICAgICB9OwogICAgICAgIGNhc2Ugamw6CiAgICAgICAgY2FzZSBRbDoKICAgICAgICBjYXNlIHRjOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogMiwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IDEKICAgICAgICAgICAgfTsKICAgICAgICBjYXNlIGVjOgogICAgICAgIGNhc2UgaWM6CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiAyLAogICAgICAgICAgICAgICAgY29tcG9uZW50czogNAogICAgICAgICAgICB9OwogICAgICAgIGNhc2UgV286CiAgICAgICAgY2FzZSBLbDoKICAgICAgICBjYXNlIHBpOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogNCwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IDEKICAgICAgICAgICAgfTsKICAgICAgICBjYXNlIG5jOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogNCwKICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IDMKICAgICAgICAgICAgfTsKICAgIH0KICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHR5cGUgJHtofS5gKTsKfQp2YXIgT2YgPSB7CiAgICBjb250YWluOiBrZCwKICAgIGNvdmVyOiBQZCwKICAgIGZpbGw6IE9kLAogICAgZ2V0Qnl0ZUxlbmd0aDogTmQKfTsKdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyA8ICJ1IiAmJiBfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIiwgewogICAgZGV0YWlsOiB7CiAgICAgICAgcmV2aXNpb246IHZsCiAgICB9Cn0pKTsKdHlwZW9mIHdpbmRvdyA8ICJ1IiAmJiAod2luZG93Ll9fVEhSRUVfXyA/IGNvbnNvbGUud2FybigiV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLiIpIDogd2luZG93Ll9fVEhSRUVfXyA9IHZsKTsKZnVuY3Rpb24gYnIxKCkgewogICAgbGV0IGUgPSBudWxsLCBuID0gITEsIHQgPSBudWxsLCBpID0gbnVsbDsKICAgIGZ1bmN0aW9uIGMocywgaCkgewogICAgICAgIHQocywgaCksIGkgPSBlLnJlcXVlc3RBbmltYXRpb25GcmFtZShjKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBuICE9PSAhMCAmJiB0ICE9PSBudWxsICYmIChpID0gZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYyksIG4gPSAhMCk7CiAgICAgICAgfSwKICAgICAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZS5jYW5jZWxBbmltYXRpb25GcmFtZShpKSwgbiA9ICExOwogICAgICAgIH0sCiAgICAgICAgc2V0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24ocykgewogICAgICAgICAgICB0ID0gczsKICAgICAgICB9LAogICAgICAgIHNldENvbnRleHQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgZSA9IHM7CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiB1bzEoZSkgewogICAgbGV0IG4gPSBuZXcgV2Vha01hcDsKICAgIGZ1bmN0aW9uIHQoZCwgSSkgewogICAgICAgIGxldCBUID0gZC5hcnJheSwgQyA9IGQudXNhZ2UsIFIgPSBULmJ5dGVMZW5ndGgsIFMgPSBlLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgIGUuYmluZEJ1ZmZlcihJLCBTKSwgZS5idWZmZXJEYXRhKEksIFQsIEMpLCBkLm9uVXBsb2FkQ2FsbGJhY2soKTsKICAgICAgICBsZXQgeDE7CiAgICAgICAgaWYgKFQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHgxID0gZS5GTE9BVDsKICAgICAgICBlbHNlIGlmIChUIGluc3RhbmNlb2YgVWludDE2QXJyYXkpIGQuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlID8geDEgPSBlLkhBTEZfRkxPQVQgOiB4MSA9IGUuVU5TSUdORURfU0hPUlQ7CiAgICAgICAgZWxzZSBpZiAoVCBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHgxID0gZS5TSE9SVDsKICAgICAgICBlbHNlIGlmIChUIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHgxID0gZS5VTlNJR05FRF9JTlQ7CiAgICAgICAgZWxzZSBpZiAoVCBpbnN0YW5jZW9mIEludDMyQXJyYXkpIHgxID0gZS5JTlQ7CiAgICAgICAgZWxzZSBpZiAoVCBpbnN0YW5jZW9mIEludDhBcnJheSkgeDEgPSBlLkJZVEU7CiAgICAgICAgZWxzZSBpZiAoVCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHgxID0gZS5VTlNJR05FRF9CWVRFOwogICAgICAgIGVsc2UgaWYgKFQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkgeDEgPSBlLlVOU0lHTkVEX0JZVEU7CiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgYnVmZmVyIGRhdGEgZm9ybWF0OiAiICsgVCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYnVmZmVyOiBTLAogICAgICAgICAgICB0eXBlOiB4MSwKICAgICAgICAgICAgYnl0ZXNQZXJFbGVtZW50OiBULkJZVEVTX1BFUl9FTEVNRU5ULAogICAgICAgICAgICB2ZXJzaW9uOiBkLnZlcnNpb24sCiAgICAgICAgICAgIHNpemU6IFIKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gaShkLCBJLCBUKSB7CiAgICAgICAgbGV0IEMgPSBJLmFycmF5LCBSID0gSS51cGRhdGVSYW5nZXM7CiAgICAgICAgaWYgKGUuYmluZEJ1ZmZlcihULCBkKSwgUi5sZW5ndGggPT09IDApIGUuYnVmZmVyU3ViRGF0YShULCAwLCBDKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUi5zb3J0KCh4MSwgTyk9PngxLnN0YXJ0IC0gTy5zdGFydCk7CiAgICAgICAgICAgIGxldCBTID0gMDsKICAgICAgICAgICAgZm9yKGxldCB4MSA9IDE7IHgxIDwgUi5sZW5ndGg7IHgxKyspewogICAgICAgICAgICAgICAgbGV0IE8gPSBSW1NdLCBMID0gUlt4MV07CiAgICAgICAgICAgICAgICBMLnN0YXJ0IDw9IE8uc3RhcnQgKyBPLmNvdW50ICsgMSA/IE8uY291bnQgPSBNYXRoLm1heChPLmNvdW50LCBMLnN0YXJ0ICsgTC5jb3VudCAtIE8uc3RhcnQpIDogKCsrUywgUltTXSA9IEwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFIubGVuZ3RoID0gUyArIDE7CiAgICAgICAgICAgIGZvcihsZXQgeDEgPSAwLCBPID0gUi5sZW5ndGg7IHgxIDwgTzsgeDErKyl7CiAgICAgICAgICAgICAgICBsZXQgTCA9IFJbeDFdOwogICAgICAgICAgICAgICAgZS5idWZmZXJTdWJEYXRhKFQsIEwuc3RhcnQgKiBDLkJZVEVTX1BFUl9FTEVNRU5ULCBDLCBMLnN0YXJ0LCBMLmNvdW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBJLmNsZWFyVXBkYXRlUmFuZ2VzKCk7CiAgICAgICAgfQogICAgICAgIEkub25VcGxvYWRDYWxsYmFjaygpOwogICAgfQogICAgZnVuY3Rpb24gYyhkKSB7CiAgICAgICAgcmV0dXJuIGQuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSAmJiAoZCA9IGQuZGF0YSksIG4uZ2V0KGQpOwogICAgfQogICAgZnVuY3Rpb24gcyhkKSB7CiAgICAgICAgZC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICYmIChkID0gZC5kYXRhKTsKICAgICAgICBsZXQgSSA9IG4uZ2V0KGQpOwogICAgICAgIEkgJiYgKGUuZGVsZXRlQnVmZmVyKEkuYnVmZmVyKSwgbi5kZWxldGUoZCkpOwogICAgfQogICAgZnVuY3Rpb24gaChkLCBJKSB7CiAgICAgICAgaWYgKGQuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSAmJiAoZCA9IGQuZGF0YSksIGQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICBsZXQgQyA9IG4uZ2V0KGQpOwogICAgICAgICAgICAoIUMgfHwgQy52ZXJzaW9uIDwgZC52ZXJzaW9uKSAmJiBuLnNldChkLCB7CiAgICAgICAgICAgICAgICBidWZmZXI6IGQuYnVmZmVyLAogICAgICAgICAgICAgICAgdHlwZTogZC50eXBlLAogICAgICAgICAgICAgICAgYnl0ZXNQZXJFbGVtZW50OiBkLmVsZW1lbnRTaXplLAogICAgICAgICAgICAgICAgdmVyc2lvbjogZC52ZXJzaW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBUID0gbi5nZXQoZCk7CiAgICAgICAgaWYgKFQgPT09IHZvaWQgMCkgbi5zZXQoZCwgdChkLCBJKSk7CiAgICAgICAgZWxzZSBpZiAoVC52ZXJzaW9uIDwgZC52ZXJzaW9uKSB7CiAgICAgICAgICAgIGlmIChULnNpemUgIT09IGQuYXJyYXkuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlJ3MgYXJyYXkgYnVmZmVyIGRvZXMgbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBzaXplLiBSZXNpemluZyBidWZmZXIgYXR0cmlidXRlcyBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgICAgICBpKFQuYnVmZmVyLCBkLCBJKSwgVC52ZXJzaW9uID0gZC52ZXJzaW9uOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgZ2V0OiBjLAogICAgICAgIHJlbW92ZTogcywKICAgICAgICB1cGRhdGU6IGgKICAgIH07Cn0KdmFyIHBvMSA9IGAjaWZkZWYgVVNFX0FMUEhBSEFTSAoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGdldEFscGhhSGFzaFRocmVzaG9sZCggdlBvc2l0aW9uICkgKSBkaXNjYXJkOwojZW5kaWZgLCBobzEgPSBgI2lmZGVmIFVTRV9BTFBIQUhBU0gKCWNvbnN0IGZsb2F0IEFMUEhBX0hBU0hfU0NBTEUgPSAwLjA1OwoJZmxvYXQgaGFzaDJEKCB2ZWMyIHZhbHVlICkgewoJCXJldHVybiBmcmFjdCggMS4wZTQgKiBzaW4oIDE3LjAgKiB2YWx1ZS54ICsgMC4xICogdmFsdWUueSApICogKCAwLjEgKyBhYnMoIHNpbiggMTMuMCAqIHZhbHVlLnkgKyB2YWx1ZS54ICkgKSApICk7Cgl9CglmbG9hdCBoYXNoM0QoIHZlYzMgdmFsdWUgKSB7CgkJcmV0dXJuIGhhc2gyRCggdmVjMiggaGFzaDJEKCB2YWx1ZS54eSApLCB2YWx1ZS56ICkgKTsKCX0KCWZsb2F0IGdldEFscGhhSGFzaFRocmVzaG9sZCggdmVjMyBwb3NpdGlvbiApIHsKCQlmbG9hdCBtYXhEZXJpdiA9IG1heCgKCQkJbGVuZ3RoKCBkRmR4KCBwb3NpdGlvbi54eXogKSApLAoJCQlsZW5ndGgoIGRGZHkoIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IHBpeFNjYWxlID0gMS4wIC8gKCBBTFBIQV9IQVNIX1NDQUxFICogbWF4RGVyaXYgKTsKCQl2ZWMyIHBpeFNjYWxlcyA9IHZlYzIoCgkJCWV4cDIoIGZsb29yKCBsb2cyKCBwaXhTY2FsZSApICkgKSwKCQkJZXhwMiggY2VpbCggbG9nMiggcGl4U2NhbGUgKSApICkKCQkpOwoJCXZlYzIgYWxwaGEgPSB2ZWMyKAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueCAqIHBvc2l0aW9uLnh5eiApICksCgkJCWhhc2gzRCggZmxvb3IoIHBpeFNjYWxlcy55ICogcG9zaXRpb24ueHl6ICkgKQoJCSk7CgkJZmxvYXQgbGVycEZhY3RvciA9IGZyYWN0KCBsb2cyKCBwaXhTY2FsZSApICk7CgkJZmxvYXQgeCA9ICggMS4wIC0gbGVycEZhY3RvciApICogYWxwaGEueCArIGxlcnBGYWN0b3IgKiBhbHBoYS55OwoJCWZsb2F0IGEgPSBtaW4oIGxlcnBGYWN0b3IsIDEuMCAtIGxlcnBGYWN0b3IgKTsKCQl2ZWMzIGNhc2VzID0gdmVjMygKCQkJeCAqIHggLyAoIDIuMCAqIGEgKiAoIDEuMCAtIGEgKSApLAoJCQkoIHggLSAwLjUgKiBhICkgLyAoIDEuMCAtIGEgKSwKCQkJMS4wIC0gKCAoIDEuMCAtIHggKSAqICggMS4wIC0geCApIC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSApCgkJKTsKCQlmbG9hdCB0aHJlc2hvbGQgPSAoIHggPCAoIDEuMCAtIGEgKSApCgkJCT8gKCAoIHggPCBhICkgPyBjYXNlcy54IDogY2FzZXMueSApCgkJCTogY2FzZXMuejsKCQlyZXR1cm4gY2xhbXAoIHRocmVzaG9sZCAsIDEuMGUtNiwgMS4wICk7Cgl9CiNlbmRpZmAsIG1vMSA9IGAjaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7CiNlbmRpZmAsIF9vMSA9IGAjaWZkZWYgVVNFX0FMUEhBTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDsKI2VuZGlmYCwgdm8xID0gYCNpZmRlZiBVU0VfQUxQSEFURVNUCgkjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0UKCWRpZmZ1c2VDb2xvci5hID0gc21vb3Roc3RlcCggYWxwaGFUZXN0LCBhbHBoYVRlc3QgKyBmd2lkdGgoIGRpZmZ1c2VDb2xvci5hICksIGRpZmZ1c2VDb2xvci5hICk7CglpZiAoIGRpZmZ1c2VDb2xvci5hID09IDAuMCApIGRpc2NhcmQ7CgkjZWxzZQoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7CgkjZW5kaWYKI2VuZGlmYCwgZ28xID0gYCNpZmRlZiBVU0VfQUxQSEFURVNUCgl1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsKI2VuZGlmYCwgU28xID0gYCNpZmRlZiBVU0VfQU9NQVAKCWZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZBb01hcFV2ICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUICkgCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggVVNFX1NIRUVOICkgCgkJc2hlZW5TcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKQoJCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLCBFbzEgPSBgI2lmZGVmIFVTRV9BT01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7Cgl1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5OwojZW5kaWZgLCBNbzEgPSBgI2lmZGVmIFVTRV9CQVRDSElORwoJI2lmICEgZGVmaW5lZCggR0xfQU5HTEVfbXVsdGlfZHJhdyApCgkjZGVmaW5lIGdsX0RyYXdJRCBfZ2xfRHJhd0lECgl1bmlmb3JtIGludCBfZ2xfRHJhd0lEOwoJI2VuZGlmCgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7Cgl1bmlmb3JtIGhpZ2hwIHVzYW1wbGVyMkQgYmF0Y2hpbmdJZFRleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KCWZsb2F0IGdldEluZGlyZWN0SW5kZXgoIGNvbnN0IGluIGludCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nSWRUZXh0dXJlLCAwICkueDsKCQlpbnQgeCA9IGkgJSBzaXplOwoJCWludCB5ID0gaSAvIHNpemU7CgkJcmV0dXJuIGZsb2F0KCB0ZXhlbEZldGNoKCBiYXRjaGluZ0lkVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnIgKTsKCX0KI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXVuaWZvcm0gc2FtcGxlcjJEIGJhdGNoaW5nQ29sb3JUZXh0dXJlOwoJdmVjMyBnZXRCYXRjaGluZ0NvbG9yKCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nQ29sb3JUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApOwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggYmF0Y2hpbmdDb2xvclRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKS5yZ2I7Cgl9CiNlbmRpZmAsIFRvMSA9IGAjaWZkZWYgVVNFX0JBVENISU5HCgltYXQ0IGJhdGNoaW5nTWF0cml4ID0gZ2V0QmF0Y2hpbmdNYXRyaXgoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7CiNlbmRpZmAsIHhvMSA9IGB2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsKI2lmZGVmIFVTRV9BTFBIQUhBU0gKCXZQb3NpdGlvbiA9IHZlYzMoIHBvc2l0aW9uICk7CiNlbmRpZmAsIEFvMSA9IGB2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7CiNlbmRpZmAsIFJvMSA9IGBmbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkgewoJcmV0dXJuIDAuMjU7Cn0KZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkgewoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7Cn0KdmVjMyBCUkRGX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkgewoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7Cgl2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIDEuMCwgZG90VkggKTsKCWZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7CglmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7CglyZXR1cm4gRiAqICggRyAqIEQgKTsKfSAvLyB2YWxpZGF0ZWRgLCBDbzEgPSBgI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJY29uc3QgbWF0MyBYWVpfVE9fUkVDNzA5ID0gbWF0MygKCQkgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LAoJCS0xLjUzNzEzODUsICAxLjg3NjAxMDgsIC0wLjIwNDAyNTksCgkJLTAuNDk4NTMxNCwgIDAuMDQxNTU2MCwgIDEuMDU3MjI1MgoJKTsKCXZlYzMgRnJlc25lbDBUb0lvciggdmVjMyBmcmVzbmVsMCApIHsKCQl2ZWMzIHNxcnRGMCA9IHNxcnQoIGZyZXNuZWwwICk7CgkJcmV0dXJuICggdmVjMyggMS4wICkgKyBzcXJ0RjAgKSAvICggdmVjMyggMS4wICkgLSBzcXJ0RjAgKTsKCX0KCXZlYzMgSW9yVG9GcmVzbmVsMCggdmVjMyB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7CgkJcmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSB2ZWMzKCBpbmNpZGVudElvciApICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgdmVjMyggaW5jaWRlbnRJb3IgKSApICk7Cgl9CglmbG9hdCBJb3JUb0ZyZXNuZWwwKCBmbG9hdCB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7CgkJcmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvciApIC8gKCB0cmFuc21pdHRlZElvciArIGluY2lkZW50SW9yICkpOwoJfQoJdmVjMyBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0IE9QRCwgdmVjMyBzaGlmdCApIHsKCQlmbG9hdCBwaGFzZSA9IDIuMCAqIFBJICogT1BEICogMS4wZS05OwoJCXZlYzMgdmFsID0gdmVjMyggNS40ODU2ZS0xMywgNC40MjAxZS0xMywgNS4yNDgxZS0xMyApOwoJCXZlYzMgcG9zID0gdmVjMyggMS42ODEwZSswNiwgMS43OTUzZSswNiwgMi4yMDg0ZSswNiApOwoJCXZlYzMgdmFyID0gdmVjMyggNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSApOwoJCXZlYzMgeHl6ID0gdmFsICogc3FydCggMi4wICogUEkgKiB2YXIgKSAqIGNvcyggcG9zICogcGhhc2UgKyBzaGlmdCApICogZXhwKCAtIHBvdzIoIHBoYXNlICkgKiB2YXIgKTsKCQl4eXoueCArPSA5Ljc0NzBlLTE0ICogc3FydCggMi4wICogUEkgKiA0LjUyODJlKzA5ICkgKiBjb3MoIDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WyAwIF0gKSAqIGV4cCggLSA0LjUyODJlKzA5ICogcG93MiggcGhhc2UgKSApOwoJCXh5eiAvPSAxLjA2ODVlLTc7CgkJdmVjMyByZ2IgPSBYWVpfVE9fUkVDNzA5ICogeHl6OwoJCXJldHVybiByZ2I7Cgl9Cgl2ZWMzIGV2YWxJcmlkZXNjZW5jZSggZmxvYXQgb3V0c2lkZUlPUiwgZmxvYXQgZXRhMiwgZmxvYXQgY29zVGhldGExLCBmbG9hdCB0aGluRmlsbVRoaWNrbmVzcywgdmVjMyBiYXNlRjAgKSB7CgkJdmVjMyBJOwoJCWZsb2F0IGlyaWRlc2NlbmNlSU9SID0gbWl4KCBvdXRzaWRlSU9SLCBldGEyLCBzbW9vdGhzdGVwKCAwLjAsIDAuMDMsIHRoaW5GaWxtVGhpY2tuZXNzICkgKTsKCQlmbG9hdCBzaW5UaGV0YTJTcSA9IHBvdzIoIG91dHNpZGVJT1IgLyBpcmlkZXNjZW5jZUlPUiApICogKCAxLjAgLSBwb3cyKCBjb3NUaGV0YTEgKSApOwoJCWZsb2F0IGNvc1RoZXRhMlNxID0gMS4wIC0gc2luVGhldGEyU3E7CgkJaWYgKCBjb3NUaGV0YTJTcSA8IDAuMCApIHsKCQkJcmV0dXJuIHZlYzMoIDEuMCApOwoJCX0KCQlmbG9hdCBjb3NUaGV0YTIgPSBzcXJ0KCBjb3NUaGV0YTJTcSApOwoJCWZsb2F0IFIwID0gSW9yVG9GcmVzbmVsMCggaXJpZGVzY2VuY2VJT1IsIG91dHNpZGVJT1IgKTsKCQlmbG9hdCBSMTIgPSBGX1NjaGxpY2soIFIwLCAxLjAsIGNvc1RoZXRhMSApOwoJCWZsb2F0IFQxMjEgPSAxLjAgLSBSMTI7CgkJZmxvYXQgcGhpMTIgPSAwLjA7CgkJaWYgKCBpcmlkZXNjZW5jZUlPUiA8IG91dHNpZGVJT1IgKSBwaGkxMiA9IFBJOwoJCWZsb2F0IHBoaTIxID0gUEkgLSBwaGkxMjsKCQl2ZWMzIGJhc2VJT1IgPSBGcmVzbmVsMFRvSW9yKCBjbGFtcCggYmFzZUYwLCAwLjAsIDAuOTk5OSApICk7CQl2ZWMzIFIxID0gSW9yVG9GcmVzbmVsMCggYmFzZUlPUiwgaXJpZGVzY2VuY2VJT1IgKTsKCQl2ZWMzIFIyMyA9IEZfU2NobGljayggUjEsIDEuMCwgY29zVGhldGEyICk7CgkJdmVjMyBwaGkyMyA9IHZlYzMoIDAuMCApOwoJCWlmICggYmFzZUlPUlsgMCBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMCBdID0gUEk7CgkJaWYgKCBiYXNlSU9SWyAxIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAxIF0gPSBQSTsKCQlpZiAoIGJhc2VJT1JbIDIgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDIgXSA9IFBJOwoJCWZsb2F0IE9QRCA9IDIuMCAqIGlyaWRlc2NlbmNlSU9SICogdGhpbkZpbG1UaGlja25lc3MgKiBjb3NUaGV0YTI7CgkJdmVjMyBwaGkgPSB2ZWMzKCBwaGkyMSApICsgcGhpMjM7CgkJdmVjMyBSMTIzID0gY2xhbXAoIFIxMiAqIFIyMywgMWUtNSwgMC45OTk5ICk7CgkJdmVjMyByMTIzID0gc3FydCggUjEyMyApOwoJCXZlYzMgUnMgPSBwb3cyKCBUMTIxICkgKiBSMjMgLyAoIHZlYzMoIDEuMCApIC0gUjEyMyApOwoJCXZlYzMgQzAgPSBSMTIgKyBSczsKCQlJID0gQzA7CgkJdmVjMyBDbSA9IFJzIC0gVDEyMTsKCQlmb3IgKCBpbnQgbSA9IDE7IG0gPD0gMjsgKysgbSApIHsKCQkJQ20gKj0gcjEyMzsKCQkJdmVjMyBTbSA9IDIuMCAqIGV2YWxTZW5zaXRpdml0eSggZmxvYXQoIG0gKSAqIE9QRCwgZmxvYXQoIG0gKSAqIHBoaSApOwoJCQlJICs9IENtICogU207CgkJfQoJCXJldHVybiBtYXgoIEksIHZlYzMoIDAuMCApICk7Cgl9CiNlbmRpZmAsIGJvMSA9IGAjaWZkZWYgVVNFX0JVTVBNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7Cgl1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTsKCXZlYzIgZEhkeHlfZndkKCkgewoJCXZlYzIgZFNUZHggPSBkRmR4KCB2QnVtcE1hcFV2ICk7CgkJdmVjMiBkU1RkeSA9IGRGZHkoIHZCdW1wTWFwVXYgKTsKCQlmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKS54OwoJCWZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiArIGRTVGR4ICkueCAtIEhsbDsKCQlmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeSApLnggLSBIbGw7CgkJcmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7Cgl9Cgl2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5LCBmbG9hdCBmYWNlRGlyZWN0aW9uICkgewoJCXZlYzMgdlNpZ21hWCA9IG5vcm1hbGl6ZSggZEZkeCggc3VyZl9wb3MueHl6ICkgKTsKCQl2ZWMzIHZTaWdtYVkgPSBub3JtYWxpemUoIGRGZHkoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2TiA9IHN1cmZfbm9ybTsKCQl2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7CgkJdmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApOwoJCWZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICkgKiBmYWNlRGlyZWN0aW9uOwoJCXZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApOwoJCXJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTsKCX0KI2VuZGlmYCwgUG8xID0gYCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdmVjNCBwbGFuZTsKCSNpZmRlZiBBTFBIQV9UT19DT1ZFUkFHRQoJCWZsb2F0IGRpc3RhbmNlVG9QbGFuZSwgZGlzdGFuY2VHcmFkaWVudDsKCQlmbG9hdCBjbGlwT3BhY2l0eSA9IDEuMDsKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJCWRpc3RhbmNlVG9QbGFuZSA9IC0gZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSArIHBsYW5lLnc7CgkJCWRpc3RhbmNlR3JhZGllbnQgPSBmd2lkdGgoIGRpc3RhbmNlVG9QbGFuZSApIC8gMi4wOwoJCQljbGlwT3BhY2l0eSAqPSBzbW9vdGhzdGVwKCAtIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlVG9QbGFuZSApOwoJCQlpZiAoIGNsaXBPcGFjaXR5ID09IDAuMCApIGRpc2NhcmQ7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJI2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVMKCQkJZmxvYXQgdW5pb25DbGlwT3BhY2l0eSA9IDEuMDsKCQkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCQlmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJCQlkaXN0YW5jZVRvUGxhbmUgPSAtIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgKyBwbGFuZS53OwoJCQkJZGlzdGFuY2VHcmFkaWVudCA9IGZ3aWR0aCggZGlzdGFuY2VUb1BsYW5lICkgLyAyLjA7CgkJCQl1bmlvbkNsaXBPcGFjaXR5ICo9IDEuMCAtIHNtb290aHN0ZXAoIC0gZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VUb1BsYW5lICk7CgkJCX0KCQkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkJY2xpcE9wYWNpdHkgKj0gMS4wIC0gdW5pb25DbGlwT3BhY2l0eTsKCQkjZW5kaWYKCQlkaWZmdXNlQ29sb3IuYSAqPSBjbGlwT3BhY2l0eTsKCQlpZiAoIGRpZmZ1c2VDb2xvci5hID09IDAuMCApIGRpc2NhcmQ7CgkjZWxzZQoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJaWYgKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJI2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVMKCQkJYm9vbCBjbGlwcGVkID0gdHJ1ZTsKCQkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCQlmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJCQljbGlwcGVkID0gKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7CgkJCX0KCQkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkJaWYgKCBjbGlwcGVkICkgZGlzY2FyZDsKCQkjZW5kaWYKCSNlbmRpZgojZW5kaWZgLCBMbzEgPSBgI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKCXVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdOwojZW5kaWZgLCBVbzEgPSBgI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKI2VuZGlmYCwgRG8xID0gYCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdkNsaXBQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CiNlbmRpZmAsIHdvMSA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCWRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCglkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjsKI2VuZGlmYCwgSW8xID0gYCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJdmFyeWluZyB2ZWM0IHZDb2xvcjsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCXZhcnlpbmcgdmVjMyB2Q29sb3I7CiNlbmRpZmAsIHlvMSA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZhcnlpbmcgdmVjNCB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0JBVENISU5HX0NPTE9SICkKCXZhcnlpbmcgdmVjMyB2Q29sb3I7CiNlbmRpZmAsIE5vMSA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZDb2xvciA9IHZlYzQoIDEuMCApOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApCgl2Q29sb3IgPSB2ZWMzKCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQ09MT1IKCXZDb2xvciAqPSBjb2xvcjsKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUgoJdkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXZlYzMgYmF0Y2hpbmdDb2xvciA9IGdldEJhdGNoaW5nQ29sb3IoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7Cgl2Q29sb3IueHl6ICo9IGJhdGNoaW5nQ29sb3IueHl6OwojZW5kaWZgLCBPbzEgPSBgI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7CglyZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7Cn0KdmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHsKCWZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41OwoJZmxvYXQgdiA9IGFzaW4oIGNsYW1wKCBkaXIueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41OwoJcmV0dXJuIHZlYzIoIHUsIHYgKTsKfQp2ZWMzIEJSREZfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjsKfQp2ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0KZmxvYXQgRl9TY2hsaWNrKCBjb25zdCBpbiBmbG9hdCBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0gLy8gdmFsaWRhdGVkYCwgRm8xID0gYCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjAKCSNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjAKCWZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkgewoJCXZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTsKCQlmbG9hdCBmYWNlID0gLSAxLjA7CgkJaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkgewoJCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfSBlbHNlIHsKCQkJaWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55ICkKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDsKCQkJZWxzZQoJCQkJZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wOwoJCX0KCQlyZXR1cm4gZmFjZTsKCX0KCXZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkgewoJCXZlYzIgdXY7CgkJaWYgKCBmYWNlID09IDAuMCApIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9CgkJcmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTsKCX0KCXZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7CgkJZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTsKCQltaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7CgkJZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTsKCQloaWdocCB2ZWMyIHV2ID0gZ2V0VVYoIGRpcmVjdGlvbiwgZmFjZSApICogKCBmYWNlU2l6ZSAtIDIuMCApICsgMS4wOwoJCWlmICggZmFjZSA+IDIuMCApIHsKCQkJdXYueSArPSBmYWNlU2l6ZTsKCQkJZmFjZSAtPSAzLjA7CgkJfQoJCXV2LnggKz0gZmFjZSAqIGZhY2VTaXplOwoJCXV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplOwoJCXV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTsKCQl1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDsKCQl1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7CgkJI2lmZGVmIHRleHR1cmUyREdyYWRFWFQKCQkJcmV0dXJuIHRleHR1cmUyREdyYWRFWFQoIGVudk1hcCwgdXYsIHZlYzIoIDAuMCApLCB2ZWMyKCAwLjAgKSApLnJnYjsKCQkjZWxzZQoJCQlyZXR1cm4gdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkucmdiOwoJCSNlbmRpZgoJfQoJI2RlZmluZSBjdWJlVVZfcjAgMS4wCgkjZGVmaW5lIGN1YmVVVl9tMCAtIDIuMAoJI2RlZmluZSBjdWJlVVZfcjEgMC44CgkjZGVmaW5lIGN1YmVVVl9tMSAtIDEuMAoJI2RlZmluZSBjdWJlVVZfcjQgMC40CgkjZGVmaW5lIGN1YmVVVl9tNCAyLjAKCSNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1CgkjZGVmaW5lIGN1YmVVVl9tNSAzLjAKCSNkZWZpbmUgY3ViZVVWX3I2IDAuMjEKCSNkZWZpbmUgY3ViZVVWX202IDQuMAoJZmxvYXQgcm91Z2huZXNzVG9NaXAoIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSAwLjA7CgkJaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTEgLSBjdWJlVVZfbTAgKSAvICggY3ViZVVWX3IwIC0gY3ViZVVWX3IxICkgKyBjdWJlVVZfbTA7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNCApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xOwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjUgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I0IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNSAtIGN1YmVVVl9tNCApIC8gKCBjdWJlVVZfcjQgLSBjdWJlVVZfcjUgKSArIGN1YmVVVl9tNDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yNSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTYgLSBjdWJlVVZfbTUgKSAvICggY3ViZVVWX3I1IC0gY3ViZVVWX3I2ICkgKyBjdWJlVVZfbTU7CgkJfSBlbHNlIHsKCQkJbWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7CQl9CgkJcmV0dXJuIG1pcDsKCX0KCXZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBjdWJlVVZfbTAsIENVQkVVVl9NQVhfTUlQICk7CgkJZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTsKCQlmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7CgkJdmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApOwoJCWlmICggbWlwRiA9PSAwLjAgKSB7CgkJCXJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApOwoJCX0gZWxzZSB7CgkJCXZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTsKCQkJcmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7CgkJfQoJfQojZW5kaWZgLCBCbzEgPSBgdmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG9iamVjdE5vcm1hbDsKI2lmZGVmIFVTRV9UQU5HRU5UCgl2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9IG9iamVjdFRhbmdlbnQ7CiNlbmRpZgojaWZkZWYgVVNFX0JBVENISU5HCgltYXQzIGJtID0gbWF0MyggYmF0Y2hpbmdNYXRyaXggKTsKCXRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggYm1bIDAgXSwgYm1bIDAgXSApLCBkb3QoIGJtWyAxIF0sIGJtWyAxIF0gKSwgZG90KCBibVsgMiBdLCBibVsgMiBdICkgKTsKCXRyYW5zZm9ybWVkTm9ybWFsID0gYm0gKiB0cmFuc2Zvcm1lZE5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IGJtICogdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW1hdDMgaW0gPSBtYXQzKCBpbnN0YW5jZU1hdHJpeCApOwoJdHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBpbVsgMCBdLCBpbVsgMCBdICksIGRvdCggaW1bIDEgXSwgaW1bIDEgXSApLCBkb3QoIGltWyAyIF0sIGltWyAyIF0gKSApOwoJdHJhbnNmb3JtZWROb3JtYWwgPSBpbSAqIHRyYW5zZm9ybWVkTm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gaW0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmCnRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7CiNpZmRlZiBGTElQX1NJREVECgl0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7CiNlbmRpZgojaWZkZWYgVVNFX1RBTkdFTlQKCXRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWRUYW5nZW50LCAwLjAgKSApLnh5ejsKCSNpZmRlZiBGTElQX1NJREVECgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCwgR28xID0gYCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7Cgl1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlOwoJdW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzOwojZW5kaWZgLCBIbzEgPSBgI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2RGlzcGxhY2VtZW50TWFwVXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7CiNlbmRpZmAsIFZvMSA9IGAjaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2RW1pc3NpdmVNYXBVdiApOwoJI2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFX0VNSVNTSVZFCgkJZW1pc3NpdmVDb2xvciA9IHNSR0JUcmFuc2ZlckVPVEYoIGVtaXNzaXZlQ29sb3IgKTsKCSNlbmRpZgoJdG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiOwojZW5kaWZgLCBrbzEgPSBgI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7CiNlbmRpZmAsIHpvMSA9ICJnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLCBXbzEgPSBgdmVjNCBMaW5lYXJUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmFsdWU7Cn0KdmVjNCBzUkdCVHJhbnNmZXJFT1RGKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApOwp9CnZlYzQgc1JHQlRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTsKfWAsIFhvMSA9IGAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCXZlYzMgY2FtZXJhVG9GcmFnOwoJCWlmICggaXNPcnRob2dyYXBoaWMgKSB7CgkJCWNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7CgkJfQoJCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCQkjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTgoJCQl2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7CgkJI2Vsc2UKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZWxzZQoJCXZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0OwoJI2VuZGlmCgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApOwoJI2Vsc2UKCQl2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7CgkjZW5kaWYKCSNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkKCQlvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7CgkjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYICkKCQlvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKQoJCW91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTsKCSNlbmRpZgojZW5kaWZgLCBZbyA9IGAjaWZkZWYgVVNFX0VOVk1BUAoJdW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7Cgl1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7Cgl1bmlmb3JtIG1hdDMgZW52TWFwUm90YXRpb247CgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwOwoJI2Vsc2UKCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgkjZW5kaWYKCQojZW5kaWZgLCBxbzEgPSBgI2lmZGVmIFVTRV9FTlZNQVAKCXVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5OwoJI2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApCgkJI2RlZmluZSBFTlZfV09STERQT1MKCSNlbmRpZgoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCQl1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbzsKCSNlbHNlCgkJdmFyeWluZyB2ZWMzIHZSZWZsZWN0OwoJI2VuZGlmCiNlbmRpZmAsIEtvID0gYCNpZmRlZiBVU0VfRU5WTUFQCgkjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBMQU1CRVJUICkKCQkjZGVmaW5lIEVOVl9XT1JMRFBPUwoJI2VuZGlmCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJCgkJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwoJI2Vsc2UKCQl2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZW5kaWYKI2VuZGlmYCwgJG8gPSBgI2lmZGVmIFVTRV9FTlZNQVAKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6OwoJI2Vsc2UKCQl2ZWMzIGNhbWVyYVRvVmVydGV4OwoJCWlmICggaXNPcnRob2dyYXBoaWMgKSB7CgkJCWNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTsKCQl9IGVsc2UgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApOwoJCX0KCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTsKCQkjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTgoJCQl2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApOwoJCSNlbHNlCgkJCXZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTsKCQkjZW5kaWYKCSNlbmRpZgojZW5kaWZgLCBabzEgPSBgI2lmZGVmIFVTRV9GT0cKCXZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OwojZW5kaWZgLCBRbyA9IGAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAsIEpvMSA9IGAjaWZkZWYgVVNFX0ZPRwoJI2lmZGVmIEZPR19FWFAyCgkJZmxvYXQgZm9nRmFjdG9yID0gMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogdkZvZ0RlcHRoICogdkZvZ0RlcHRoICk7CgkjZWxzZQoJCWZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgdkZvZ0RlcHRoICk7CgkjZW5kaWYKCWdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTsKI2VuZGlmYCwgam8gPSBgI2lmZGVmIFVTRV9GT0cKCXVuaWZvcm0gdmVjMyBmb2dDb2xvcjsKCXZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoOwoJI2lmZGVmIEZPR19FWFAyCgkJdW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OwoJI2Vsc2UKCQl1bmlmb3JtIGZsb2F0IGZvZ05lYXI7CgkJdW5pZm9ybSBmbG9hdCBmb2dGYXI7CgkjZW5kaWYKI2VuZGlmYCwgZXMgPSBgI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7CiNlbmRpZgp2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7CglmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApOwoJdmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTsKCSNpZmRlZiBVU0VfR1JBRElFTlRNQVAKCQlyZXR1cm4gdmVjMyggdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yICk7CgkjZWxzZQoJCXZlYzIgZncgPSBmd2lkdGgoIGNvb3JkICkgKiAwLjU7CgkJcmV0dXJuIG1peCggdmVjMyggMC43ICksIHZlYzMoIDEuMCApLCBzbW9vdGhzdGVwKCAwLjcgLSBmdy54LCAwLjcgKyBmdy54LCBjb29yZC54ICkgKTsKCSNlbmRpZgp9YCwgdHMxID0gYCNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwOwoJdW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTsKI2VuZGlmYCwgbnMxID0gYExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsKbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7YCwgaXMgPSBgdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBMYW1iZXJ0TWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9MYW1iZXJ0KCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfTGFtYmVydAojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnRgLCByczEgPSBgdW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7CnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjsKI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJdW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTsKI2VuZGlmCnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7CglmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoJdmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7CglyZXR1cm4gcmVzdWx0Owp9CnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApOwoJcmV0dXJuIGlycmFkaWFuY2U7Cn0KdmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkgewoJdmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQpmbG9hdCBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHsKCWZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTsKCWlmICggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7CgkJZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7Cgl9CglyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmOwp9CmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgY29uZUNvc2luZSwgY29uc3QgaW4gZmxvYXQgcGVudW1icmFDb3NpbmUsIGNvbnN0IGluIGZsb2F0IGFuZ2xlQ29zaW5lICkgewoJcmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NpbmUsIHBlbnVtYnJhQ29zaW5lLCBhbmdsZUNvc2luZSApOwp9CiNpZiBOVU1fRElSX0xJR0hUUyA+IDAKCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJfTsKCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTsKCXZvaWQgZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJbGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uOwoJCWxpZ2h0LnZpc2libGUgPSB0cnVlOwoJfQojZW5kaWYKI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwCglzdHJ1Y3QgUG9pbnRMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJfTsKCXVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdOwoJdm9pZCBnZXRQb2ludExpZ2h0SW5mbyggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCXZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApOwoJCWZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTsKCQlsaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7CgkJbGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApOwoJCWxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7Cgl9CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRTID4gMAoJc3RydWN0IFNwb3RMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJCWZsb2F0IGNvbmVDb3M7CgkJZmxvYXQgcGVudW1icmFDb3M7Cgl9OwoJdW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07Cgl2b2lkIGdldFNwb3RMaWdodEluZm8oIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJdmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjsKCQlsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTsKCQlmbG9hdCBhbmdsZUNvcyA9IGRvdCggbGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgc3BvdEF0dGVudWF0aW9uID0gZ2V0U3BvdEF0dGVudWF0aW9uKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApOwoJCWlmICggc3BvdEF0dGVudWF0aW9uID4gMC4wICkgewoJCQlmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7CgkJCWxpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yICogc3BvdEF0dGVudWF0aW9uOwoJCQlsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApOwoJCQlsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApOwoJCX0gZWxzZSB7CgkJCWxpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7CgkJCWxpZ2h0LnZpc2libGUgPSBmYWxzZTsKCQl9Cgl9CiNlbmRpZgojaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwCglzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7CgkJdmVjMyBjb2xvcjsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgaGFsZldpZHRoOwoJCXZlYzMgaGFsZkhlaWdodDsKCX07Cgl1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTsJdW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7Cgl1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07CiNlbmRpZgojaWYgTlVNX0hFTUlfTElHSFRTID4gMAoJc3RydWN0IEhlbWlzcGhlcmVMaWdodCB7CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBza3lDb2xvcjsKCQl2ZWMzIGdyb3VuZENvbG9yOwoJfTsKCXVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdOwoJdmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCQlmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTsKCQl2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApOwoJCXJldHVybiBpcnJhZGlhbmNlOwoJfQojZW5kaWZgLCBhczEgPSBgI2lmZGVmIFVTRV9FTlZNQVAKCXZlYzMgZ2V0SUJMSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJCQl2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHdvcmxkTm9ybWFsLCAxLjAgKTsKCQkJcmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5OwoJCSNlbHNlCgkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkjZW5kaWYKCX0KCXZlYzMgZ2V0SUJMUmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCQkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJCQl2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtIHZpZXdEaXIsIG5vcm1hbCApOwoJCQlyZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApOwoJCQlyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApOwoJCQl2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApOwoJCQlyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5OwoJCSNlbHNlCgkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkjZW5kaWYKCX0KCSNpZmRlZiBVU0VfQU5JU09UUk9QWQoJCXZlYzMgZ2V0SUJMQW5pc290cm9weVJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgYml0YW5nZW50LCBjb25zdCBpbiBmbG9hdCBhbmlzb3Ryb3B5ICkgewoJCQkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJCQkJdmVjMyBiZW50Tm9ybWFsID0gY3Jvc3MoIGJpdGFuZ2VudCwgdmlld0RpciApOwoJCQkJYmVudE5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGJlbnROb3JtYWwsIGJpdGFuZ2VudCApICk7CgkJCQliZW50Tm9ybWFsID0gbm9ybWFsaXplKCBtaXgoIGJlbnROb3JtYWwsIG5vcm1hbCwgcG93MiggcG93MiggMS4wIC0gYW5pc290cm9weSAqICggMS4wIC0gcm91Z2huZXNzICkgKSApICkgKTsKCQkJCXJldHVybiBnZXRJQkxSYWRpYW5jZSggdmlld0RpciwgYmVudE5vcm1hbCwgcm91Z2huZXNzICk7CgkJCSNlbHNlCgkJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJCSNlbmRpZgoJCX0KCSNlbmRpZgojZW5kaWZgLCBvczEgPSBgVG9vbk1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO2AsIHNzMSA9IGB2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKc3RydWN0IFRvb25NYXRlcmlhbCB7Cgl2ZWMzIGRpZmZ1c2VDb2xvcjsKfTsKdm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfVG9vbgojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX1Rvb25gLCBjczEgPSBgQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiOwptYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXI7Cm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzOwptYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtgLCBsczEgPSBgdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7Cgl2ZWMzIHNwZWN1bGFyQ29sb3I7CglmbG9hdCBzcGVjdWxhclNoaW5pbmVzczsKCWZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7Cn07CnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJdmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9CbGlublBob25nKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfQmxpbm5QaG9uZwojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdgLCBmczEgPSBgUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7CnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIG5vblBlcnR1cmJlZE5vcm1hbCApICksIGFicyggZEZkeSggbm9uUGVydHVyYmVkTm9ybWFsICkgKSApOwpmbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5yb3VnaG5lc3MsIDEuMCApOwojaWZkZWYgSU9SCgltYXRlcmlhbC5pb3IgPSBpb3I7CgkjaWZkZWYgVVNFX1NQRUNVTEFSCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSBzcGVjdWxhckludGVuc2l0eTsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yOwoJCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQkJc3BlY3VsYXJDb2xvckZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFyQ29sb3JNYXAsIHZTcGVjdWxhckNvbG9yTWFwVXYgKS5yZ2I7CgkJI2VuZGlmCgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCQkJc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgKS5hOwoJCSNlbmRpZgoJCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTsKCSNlbHNlCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSAxLjA7CgkJdmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gdmVjMyggMS4wICk7CgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CgkjZW5kaWYKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CiNlbHNlCgltYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApOwoJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJbWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0OwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gY2xlYXJjb2F0Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0RjAgPSB2ZWMzKCAwLjA0ICk7CgltYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJCW1hdGVyaWFsLmNsZWFyY29hdCAqPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE1hcCwgdkNsZWFyY29hdE1hcFV2ICkueDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgKS55OwoJI2VuZGlmCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7CW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1heCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA1MjUgKTsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJbWF0ZXJpYWwuZGlzcGVyc2lvbiA9IGRpc3BlcnNpb247CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFCgltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlOwoJbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IgPSBpcmlkZXNjZW5jZUlPUjsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSAqPSB0ZXh0dXJlMkQoIGlyaWRlc2NlbmNlTWFwLCB2SXJpZGVzY2VuY2VNYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSAoaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtIC0gaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtKSAqIHRleHR1cmUyRCggaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ICkuZyArIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCSNlbHNlCgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSBpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW07CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU4KCW1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbkNvbG9yOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCW1hdGVyaWFsLnNoZWVuQ29sb3IgKj0gdGV4dHVyZTJEKCBzaGVlbkNvbG9yTWFwLCB2U2hlZW5Db2xvck1hcFV2ICkucmdiOwoJI2VuZGlmCgltYXRlcmlhbC5zaGVlblJvdWdobmVzcyA9IGNsYW1wKCBzaGVlblJvdWdobmVzcywgMC4wNywgMS4wICk7CgkjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICo9IHRleHR1cmUyRCggc2hlZW5Sb3VnaG5lc3NNYXAsIHZTaGVlblJvdWdobmVzc01hcFV2ICkuYTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQltYXQyIGFuaXNvdHJvcHlNYXQgPSBtYXQyKCBhbmlzb3Ryb3B5VmVjdG9yLngsIGFuaXNvdHJvcHlWZWN0b3IueSwgLSBhbmlzb3Ryb3B5VmVjdG9yLnksIGFuaXNvdHJvcHlWZWN0b3IueCApOwoJCXZlYzMgYW5pc290cm9weVBvbGFyID0gdGV4dHVyZTJEKCBhbmlzb3Ryb3B5TWFwLCB2QW5pc290cm9weU1hcFV2ICkucmdiOwoJCXZlYzIgYW5pc290cm9weVYgPSBhbmlzb3Ryb3B5TWF0ICogbm9ybWFsaXplKCAyLjAgKiBhbmlzb3Ryb3B5UG9sYXIucmcgLSB2ZWMyKCAxLjAgKSApICogYW5pc290cm9weVBvbGFyLmI7CgkjZWxzZQoJCXZlYzIgYW5pc290cm9weVYgPSBhbmlzb3Ryb3B5VmVjdG9yOwoJI2VuZGlmCgltYXRlcmlhbC5hbmlzb3Ryb3B5ID0gbGVuZ3RoKCBhbmlzb3Ryb3B5ViApOwoJaWYoIG1hdGVyaWFsLmFuaXNvdHJvcHkgPT0gMC4wICkgewoJCWFuaXNvdHJvcHlWID0gdmVjMiggMS4wLCAwLjAgKTsKCX0gZWxzZSB7CgkJYW5pc290cm9weVYgLz0gbWF0ZXJpYWwuYW5pc290cm9weTsKCQltYXRlcmlhbC5hbmlzb3Ryb3B5ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCX0KCW1hdGVyaWFsLmFscGhhVCA9IG1peCggcG93MiggbWF0ZXJpYWwucm91Z2huZXNzICksIDEuMCwgcG93MiggbWF0ZXJpYWwuYW5pc290cm9weSApICk7CgltYXRlcmlhbC5hbmlzb3Ryb3B5VCA9IHRiblsgMCBdICogYW5pc290cm9weVYueCArIHRiblsgMSBdICogYW5pc290cm9weVYueTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlCID0gdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi54IC0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi55OwojZW5kaWZgLCBkczEgPSBgc3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7CglmbG9hdCByb3VnaG5lc3M7Cgl2ZWMzIHNwZWN1bGFyQ29sb3I7CglmbG9hdCBzcGVjdWxhckY5MDsKCWZsb2F0IGRpc3BlcnNpb247CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWZsb2F0IGNsZWFyY29hdDsKCQlmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7CgkJdmVjMyBjbGVhcmNvYXRGMDsKCQlmbG9hdCBjbGVhcmNvYXRGOTA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlmbG9hdCBpcmlkZXNjZW5jZTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUjsKCQlmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzczsKCQl2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDsKCQl2ZWMzIGlyaWRlc2NlbmNlRjA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQl2ZWMzIHNoZWVuQ29sb3I7CgkJZmxvYXQgc2hlZW5Sb3VnaG5lc3M7CgkjZW5kaWYKCSNpZmRlZiBJT1IKCQlmbG9hdCBpb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgkJZmxvYXQgdHJhbnNtaXNzaW9uOwoJCWZsb2F0IHRyYW5zbWlzc2lvbkFscGhhOwoJCWZsb2F0IHRoaWNrbmVzczsKCQlmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCXZlYzMgYXR0ZW51YXRpb25Db2xvcjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgYW5pc290cm9weTsKCQlmbG9hdCBhbHBoYVQ7CgkJdmVjMyBhbmlzb3Ryb3B5VDsKCQl2ZWMzIGFuaXNvdHJvcHlCOwoJI2VuZGlmCn07CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgc2hlZW5TcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoMC4wICk7CnZlYzMgU2NobGlja190b19GMCggY29uc3QgaW4gdmVjMyBmLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewogICAgZmxvYXQgeCA9IGNsYW1wKCAxLjAgLSBkb3RWSCwgMC4wLCAxLjAgKTsKICAgIGZsb2F0IHgyID0geCAqIHg7CiAgICBmbG9hdCB4NSA9IGNsYW1wKCB4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkgKTsKICAgIHJldHVybiAoIGYgLSB2ZWMzKCBmOTAgKSAqIHg1ICkgLyAoIDEuMCAtIHg1ICk7Cn0KZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApOwoJZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApOwoJcmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApOwp9CmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7CglmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTsKfQojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCWZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdFRWLCBjb25zdCBpbiBmbG9hdCBkb3RCViwgY29uc3QgaW4gZmxvYXQgZG90VEwsIGNvbnN0IGluIGZsb2F0IGRvdEJMLCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7CgkJZmxvYXQgZ3YgPSBkb3ROTCAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VFYsIGFscGhhQiAqIGRvdEJWLCBkb3ROViApICk7CgkJZmxvYXQgZ2wgPSBkb3ROViAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VEwsIGFscGhhQiAqIGRvdEJMLCBkb3ROTCApICk7CgkJZmxvYXQgdiA9IDAuNSAvICggZ3YgKyBnbCApOwoJCXJldHVybiBzYXR1cmF0ZSh2KTsKCX0KCWZsb2F0IERfR0dYX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90TkgsIGNvbnN0IGluIGZsb2F0IGRvdFRILCBjb25zdCBpbiBmbG9hdCBkb3RCSCApIHsKCQlmbG9hdCBhMiA9IGFscGhhVCAqIGFscGhhQjsKCQloaWdocCB2ZWMzIHYgPSB2ZWMzKCBhbHBoYUIgKiBkb3RUSCwgYWxwaGFUICogZG90QkgsIGEyICogZG90TkggKTsKCQloaWdocCBmbG9hdCB2MiA9IGRvdCggdiwgdiApOwoJCWZsb2F0IHcyID0gYTIgLyB2MjsKCQlyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyICogcG93MiAoIHcyICk7Cgl9CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdmVjMyBCUkRGX0dHWF9DbGVhcmNvYXQoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwpIHsKCQl2ZWMzIGYwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjA7CgkJZmxvYXQgZjkwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjkwOwoJCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzczsKCQlmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CgkJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCQlmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CgkJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7CgkJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJCXJldHVybiBGICogKCBWICogRCApOwoJfQojZW5kaWYKdmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCApIHsKCXZlYzMgZjAgPSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yOwoJZmxvYXQgZjkwID0gbWF0ZXJpYWwuc3BlY3VsYXJGOTA7CglmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CglmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCUYgPSBtaXgoIEYsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgZG90VEwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBsaWdodERpciApOwoJCWZsb2F0IGRvdFRWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgdmlld0RpciApOwoJCWZsb2F0IGRvdFRIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgaGFsZkRpciApOwoJCWZsb2F0IGRvdEJMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RCViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RCSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGhhbGZEaXIgKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3RUViwgZG90QlYsIGRvdFRMLCBkb3RCTCwgZG90TlYsIGRvdE5MICk7CgkJZmxvYXQgRCA9IERfR0dYX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3ROSCwgZG90VEgsIGRvdEJIICk7CgkjZWxzZQoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJI2VuZGlmCglyZXR1cm4gRiAqICggViAqIEQgKTsKfQp2ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDsKCWNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFOwoJY29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7Cgl2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7Cgl1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7CglyZXR1cm4gdXY7Cn0KZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7CglmbG9hdCBsID0gbGVuZ3RoKCBmICk7CglyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7Cn0KdmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7CglmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTsKCWZsb2F0IHkgPSBhYnMoIHggKTsKCWZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7CglmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5OwoJZmxvYXQgdiA9IGEgLyBiOwoJZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2OwoJcmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhOwp9CnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkgewoJdmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTsKCXZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApOwoJaWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTsKCXZlYzMgVDEsIFQyOwoJVDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTsKCVQyID0gLSBjcm9zcyggTiwgVDEgKTsKCW1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7Cgl2ZWMzIGNvb3Jkc1sgNCBdOwoJY29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTsKCWNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7Cgljb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApOwoJY29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTsKCWNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApOwoJY29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7Cgljb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTsKCWNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApOwoJdmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7CglmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTsKCXJldHVybiB2ZWMzKCByZXN1bHQgKTsKfQojaWYgZGVmaW5lZCggVVNFX1NIRUVOICkKZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCWZsb2F0IGludkFscGhhID0gMS4wIC8gYWxwaGE7CglmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7CglmbG9hdCBzaW4yaCA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApOwoJcmV0dXJuICggMi4wICsgaW52QWxwaGEgKSAqIHBvdyggc2luMmgsIGludkFscGhhICogMC41ICkgLyAoIDIuMCAqIFBJICk7Cn0KZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7CglyZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTsKfQp2ZWMzIEJSREZfU2hlZW4oIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIHZlYzMgc2hlZW5Db2xvciwgY29uc3QgaW4gZmxvYXQgc2hlZW5Sb3VnaG5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IEQgPSBEX0NoYXJsaWUoIHNoZWVuUm91Z2huZXNzLCBkb3ROSCApOwoJZmxvYXQgViA9IFZfTmV1YmVsdCggZG90TlYsIGRvdE5MICk7CglyZXR1cm4gc2hlZW5Db2xvciAqICggRCAqIFYgKTsKfQojZW5kaWYKZmxvYXQgSUJMU2hlZW5CUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzczsKCWZsb2F0IGEgPSByb3VnaG5lc3MgPCAwLjI1ID8gLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1LjkgOiAtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTU7CglmbG9hdCBiID0gcm91Z2huZXNzIDwgMC4yNSA/IDQ0LjAgKiByMiAtIDIzLjcgKiByb3VnaG5lc3MgKyAzLjI2IDogMS45NyAqIHIyIC0gMy4yNyAqIHJvdWdobmVzcyArIDAuNzI7CglmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTsKCXJldHVybiBzYXR1cmF0ZSggREcgKiBSRUNJUFJPQ0FMX1BJICk7Cn0KdmVjMiBERkdBcHByb3goIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApOwoJY29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7Cgl2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxOwoJZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7Cgl2ZWMyIGZhYiA9IHZlYzIoIC0gMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7CglyZXR1cm4gZmFiOwp9CnZlYzMgRW52aXJvbm1lbnRCUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgl2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCXJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55Owp9CiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IGlyaWRlc2NlbmNlLCBjb25zdCBpbiB2ZWMzIGlyaWRlc2NlbmNlRjAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHsKI2Vsc2UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbmRpZgoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJdmVjMyBGciA9IG1peCggc3BlY3VsYXJDb2xvciwgaXJpZGVzY2VuY2VGMCwgaXJpZGVzY2VuY2UgKTsKCSNlbHNlCgkJdmVjMyBGciA9IHNwZWN1bGFyQ29sb3I7CgkjZW5kaWYKCXZlYzMgRnNzRXNzID0gRnIgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7CglmbG9hdCBFc3MgPSBmYWIueCArIGZhYi55OwoJZmxvYXQgRW1zID0gMS4wIC0gRXNzOwoJdmVjMyBGYXZnID0gRnIgKyAoIDEuMCAtIEZyICkgKiAwLjA0NzYxOTsJdmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7CglzaW5nbGVTY2F0dGVyICs9IEZzc0VzczsKCW11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7Cn0KI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJdm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CgkJdmVjMyBub3JtYWwgPSBnZW9tZXRyeU5vcm1hbDsKCQl2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeVZpZXdEaXI7CgkJdmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5UG9zaXRpb247CgkJdmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7CgkJdmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CgkJdmVjMyByZWN0Q29vcmRzWyA0IF07CgkJcmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwkJcmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwoJCXJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJdmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCQl2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTsKCQl2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTsKCQltYXQzIG1JbnYgPSBtYXQzKAoJCQl2ZWMzKCB0MS54LCAwLCB0MS55ICksCgkJCXZlYzMoICAgIDAsIDEsICAgIDAgKSwKCQkJdmVjMyggdDEueiwgMCwgdDEudyApCgkJKTsKCQl2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApOwoJCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTsKCX0KI2VuZGlmCnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROTGNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7CgkJdmVjMyBjY0lycmFkaWFuY2UgPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7CgkJY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgKz0gY2NJcnJhZGlhbmNlICogQlJERl9HR1hfQ2xlYXJjb2F0KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFyRGlyZWN0ICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0dHWCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbCApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLnNoZWVuQ29sb3IgKiBJQkxTaGVlbkJSREYoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXZlYzMgc2luZ2xlU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApOwoJdmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTsKCSNlbHNlCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZyggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZW5kaWYKCXZlYzMgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZzsKCXZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gbWF4KCBtYXgoIHRvdGFsU2NhdHRlcmluZy5yLCB0b3RhbFNjYXR0ZXJpbmcuZyApLCB0b3RhbFNjYXR0ZXJpbmcuYiApICk7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZzsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X1BoeXNpY2FsCiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhCQlSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbAojZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXIJCVJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwKZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJcmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTsKfWAsIHVzMSA9IGAKdmVjMyBnZW9tZXRyeVBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uOwp2ZWMzIGdlb21ldHJ5Tm9ybWFsID0gbm9ybWFsOwp2ZWMzIGdlb21ldHJ5Vmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApOwp2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gdmVjMyggMC4wICk7CiNpZmRlZiBVU0VfQ0xFQVJDT0FUCglnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCWlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wOwoJfSBlbHNlIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IHNhdHVyYXRlKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSApOwoJfQoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApOwoJfQojZW5kaWYKSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDsKI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJUG9pbnRMaWdodCBwb2ludExpZ2h0OwoJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCVBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTsKCQlnZXRQb2ludExpZ2h0SW5mbyggcG9pbnRMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTICkKCQlwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93QmlhcywgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglTcG90TGlnaHQgc3BvdExpZ2h0OwoJdmVjNCBzcG90Q29sb3I7Cgl2ZWMzIHNwb3RMaWdodENvb3JkOwoJYm9vbCBpblNwb3RMaWdodE1hcDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7CgkjZW5kaWYKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHsKCQlzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07CgkJZ2V0U3BvdExpZ2h0SW5mbyggc3BvdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYCgkJI2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBOVU1fU1BPVF9MSUdIVF9NQVBTCgkJI2Vsc2UKCQkjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2VuZGlmCgkJI2lmICggU1BPVF9MSUdIVF9NQVBfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9NQVBTICkKCQkJc3BvdExpZ2h0Q29vcmQgPSB2U3BvdExpZ2h0Q29vcmRbIGkgXS54eXogLyB2U3BvdExpZ2h0Q29vcmRbIGkgXS53OwoJCQlpblNwb3RMaWdodE1hcCA9IGFsbCggbGVzc1RoYW4oIGFicyggc3BvdExpZ2h0Q29vcmQgKiAyLiAtIDEuICksIHZlYzMoIDEuMCApICkgKTsKCQkJc3BvdENvbG9yID0gdGV4dHVyZTJEKCBzcG90TGlnaHRNYXBbIFNQT1RfTElHSFRfTUFQX0lOREVYIF0sIHNwb3RMaWdodENvb3JkLnh5ICk7CgkJCWRpcmVjdExpZ2h0LmNvbG9yID0gaW5TcG90TGlnaHRNYXAgPyBkaXJlY3RMaWdodC5jb2xvciAqIHNwb3RDb2xvci5yZ2IgOiBkaXJlY3RMaWdodC5jb2xvcjsKCQkjZW5kaWYKCQkjdW5kZWYgU1BPVF9MSUdIVF9NQVBfSU5ERVgKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCXNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBzcG90TGlnaHRTaGFkb3cuc2hhZG93Qmlhcywgc3BvdExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0ICkKCURpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTsKCQlnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggZGlyZWN0aW9uYWxMaWdodCwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApCgkJZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCwgcHMxID0gYCNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKQoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJdmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5OwoJCWlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgkJaWJsSXJyYWRpYW5jZSArPSBnZXRJQkxJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCApOwoJI2VuZGlmCiNlbmRpZgojaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJcmFkaWFuY2UgKz0gZ2V0SUJMQW5pc290cm9weVJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICk7CgkjZWxzZQoJCXJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQljbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRJQkxSYWRpYW5jZSggZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKI2VuZGlmYCwgaHMxID0gYCNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKQoJUkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZgojaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCglSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKI2VuZGlmYCwgbXMxID0gYCNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKQoJZ2xfRnJhZ0RlcHRoID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41OwojZW5kaWZgLCBfczEgPSBgI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApCgl1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7Cgl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7Cgl2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlOwojZW5kaWZgLCB2czEgPSBgI2lmZGVmIFVTRV9MT0dERVBUSEJVRgoJdmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoOwoJdmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTsKI2VuZGlmYCwgZ3MxID0gYCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCXZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53OwoJdklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7CiNlbmRpZmAsIFNzMSA9IGAjaWZkZWYgVVNFX01BUAoJdmVjNCBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZNYXBVdiApOwoJI2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFCgkJc2FtcGxlZERpZmZ1c2VDb2xvciA9IHNSR0JUcmFuc2ZlckVPVEYoIHNhbXBsZWREaWZmdXNlQ29sb3IgKTsKCSNlbmRpZgoJZGlmZnVzZUNvbG9yICo9IHNhbXBsZWREaWZmdXNlQ29sb3I7CiNlbmRpZmAsIEVzMSA9IGAjaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWFwOwojZW5kaWZgLCBNczEgPSBgI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKQoJI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJCXZlYzIgdXYgPSB2VXY7CgkjZWxzZQoJCXZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5OwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX01BUAoJZGlmZnVzZUNvbG9yICo9IHRleHR1cmUyRCggbWFwLCB1diApOwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nOwojZW5kaWZgLCBUczEgPSBgI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2Vsc2UKCSNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkKCQl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtYXA7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDsKI2VuZGlmYCwgeHMxID0gYGZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzczsKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdk1ldGFsbmVzc01hcFV2ICk7CgltZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjsKI2VuZGlmYCwgQXMxID0gYCNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7CiNlbmRpZmAsIFJzMSA9IGAjaWZkZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgKCWZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CglmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgPSB0ZXhlbEZldGNoKCBtb3JwaFRleHR1cmUsIGl2ZWMyKCAwLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCW1vcnBoVGFyZ2V0SW5mbHVlbmNlc1tpXSA9ICB0ZXhlbEZldGNoKCBtb3JwaFRleHR1cmUsIGl2ZWMyKCBpICsgMSwgZ2xfSW5zdGFuY2VJRCApLCAwICkucjsKCX0KI2VuZGlmYCwgQ3MxID0gYCNpZiBkZWZpbmVkKCBVU0VfTU9SUEhDT0xPUlMgKQoJdkNvbG9yICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCWZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHsKCQkjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQkjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHZDb2xvciArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDIgKS5yZ2IgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQkjZW5kaWYKCX0KI2VuZGlmYCwgYnMxID0gYCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgb2JqZWN0Tm9ybWFsICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMSApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJfQojZW5kaWZgLCBQczEgPSBgI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMKCSNpZm5kZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CgkjZW5kaWYKCXVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgbW9ycGhUYXJnZXRzVGV4dHVyZTsKCXVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7Cgl2ZWM0IGdldE1vcnBoKCBjb25zdCBpbiBpbnQgdmVydGV4SW5kZXgsIGNvbnN0IGluIGludCBtb3JwaFRhcmdldEluZGV4LCBjb25zdCBpbiBpbnQgb2Zmc2V0ICkgewoJCWludCB0ZXhlbEluZGV4ID0gdmVydGV4SW5kZXggKiBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgKyBvZmZzZXQ7CgkJaW50IHkgPSB0ZXhlbEluZGV4IC8gbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQlpbnQgeCA9IHRleGVsSW5kZXggLSB5ICogbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQlpdmVjMyBtb3JwaFVWID0gaXZlYzMoIHgsIHksIG1vcnBoVGFyZ2V0SW5kZXggKTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApOwoJfQojZW5kaWZgLCBMczEgPSBgI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMKCXRyYW5zZm9ybWVkICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCWZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHsKCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHRyYW5zZm9ybWVkICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMCApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJfQojZW5kaWZgLCBVczEgPSBgZmxvYXQgZmFjZURpcmVjdGlvbiA9IGdsX0Zyb250RmFjaW5nID8gMS4wIDogLSAxLjA7CiNpZmRlZiBGTEFUX1NIQURFRAoJdmVjMyBmZHggPSBkRmR4KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIGZkeSA9IGRGZHkoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApOwojZWxzZQoJdmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTsKCSNpZmRlZiBET1VCTEVfU0lERUQKCQlub3JtYWwgKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibiA9IG1hdDMoIG5vcm1hbGl6ZSggdlRhbmdlbnQgKSwgbm9ybWFsaXplKCB2Qml0YW5nZW50ICksIG5vcm1hbCApOwoJI2Vsc2UKCQltYXQzIHRibiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsCgkJI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKQoJCQl2Tm9ybWFsTWFwVXYKCQkjZWxpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApCgkJCXZDbGVhcmNvYXROb3JtYWxNYXBVdgoJCSNlbHNlCgkJCXZVdgoJCSNlbmRpZgoJCSk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym5bMF0gKj0gZmFjZURpcmVjdGlvbjsKCQl0Ym5bMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibjIgPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4yID0gZ2V0VGFuZ2VudEZyYW1lKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym4yWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuMlsxXSAqPSBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCiNlbmRpZgp2ZWMzIG5vblBlcnR1cmJlZE5vcm1hbCA9IG5vcm1hbDtgLCBEczEgPSBgI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCW5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgkjaWZkZWYgRkxJUF9TSURFRAoJCW5vcm1hbCA9IC0gbm9ybWFsOwoJI2VuZGlmCgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjsKCSNlbmRpZgoJbm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTsKI2VsaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCW1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7Cglub3JtYWwgPSBub3JtYWxpemUoIHRibiAqIG1hcE4gKTsKI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKQoJbm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7CiNlbmRpZmAsIHdzMSA9IGAjaWZuZGVmIEZMQVRfU0hBREVECgl2YXJ5aW5nIHZlYzMgdk5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXZhcnlpbmcgdmVjMyB2VGFuZ2VudDsKCQl2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDsKCSNlbmRpZgojZW5kaWZgLCBJczEgPSBgI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCwgeXMxID0gYCNpZm5kZWYgRkxBVF9TSEFERUQKCXZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7CgkJdkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTsKCSNlbmRpZgojZW5kaWZgLCBOczEgPSBgI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDsKCXVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OwojZW5kaWYKI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApICkKCW1hdDMgZ2V0VGFuZ2VudEZyYW1lKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIHV2ICkgewoJCXZlYzMgcTAgPSBkRmR4KCBleWVfcG9zLnh5eiApOwoJCXZlYzMgcTEgPSBkRmR5KCBleWVfcG9zLnh5eiApOwoJCXZlYzIgc3QwID0gZEZkeCggdXYuc3QgKTsKCQl2ZWMyIHN0MSA9IGRGZHkoIHV2LnN0ICk7CgkJdmVjMyBOID0gc3VyZl9ub3JtOwoJCXZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7CgkJdmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTsKCQl2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54OwoJCXZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7CgkJZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTsKCQlmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogaW52ZXJzZXNxcnQoIGRldCApOwoJCXJldHVybiBtYXQzKCBUICogc2NhbGUsIEIgKiBzY2FsZSwgTiApOwoJfQojZW5kaWZgLCBPczEgPSBgI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gbm9uUGVydHVyYmVkTm9ybWFsOwojZW5kaWZgLCBGczEgPSBgI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJY2xlYXJjb2F0TWFwTi54eSAqPSBjbGVhcmNvYXROb3JtYWxTY2FsZTsKCWNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuMiAqIGNsZWFyY29hdE1hcE4gKTsKI2VuZGlmYCwgQnMxID0gYCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDsKCXVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwOwojZW5kaWZgLCBHczEgPSBgI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VNYXA7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7CiNlbmRpZmAsIEhzMSA9IGAjaWZkZWYgT1BBUVVFCmRpZmZ1c2VDb2xvci5hID0gMS4wOwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGE7CiNlbmRpZgpnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO2AsIFZzMSA9IGB2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CglyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTsKfQp2ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHsKCXJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wOwp9CmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlID0gMjU1LiAvIDI1Ni47Y29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47CmNvbnN0IGZsb2F0IEludjI1NSA9IDEuIC8gMjU1LjsKY29uc3QgdmVjNCBQYWNrRmFjdG9ycyA9IHZlYzQoIDEuMCwgMjU2LjAsIDI1Ni4wICogMjU2LjAsIDI1Ni4wICogMjU2LjAgKiAyNTYuMCApOwpjb25zdCB2ZWMyIFVucGFja0ZhY3RvcnMyID0gdmVjMiggVW5wYWNrRG93bnNjYWxlLCAxLjAgLyBQYWNrRmFjdG9ycy5nICk7CmNvbnN0IHZlYzMgVW5wYWNrRmFjdG9yczMgPSB2ZWMzKCBVbnBhY2tEb3duc2NhbGUgLyBQYWNrRmFjdG9ycy5yZywgMS4wIC8gUGFja0ZhY3RvcnMuYiApOwpjb25zdCB2ZWM0IFVucGFja0ZhY3RvcnM0ID0gdmVjNCggVW5wYWNrRG93bnNjYWxlIC8gUGFja0ZhY3RvcnMucmdiLCAxLjAgLyBQYWNrRmFjdG9ycy5hICk7CnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkgewoJaWYoIHYgPD0gMC4wICkKCQlyZXR1cm4gdmVjNCggMC4sIDAuLCAwLiwgMC4gKTsKCWlmKCB2ID49IDEuMCApCgkJcmV0dXJuIHZlYzQoIDEuLCAxLiwgMS4sIDEuICk7CglmbG9hdCB2dWY7CglmbG9hdCBhZiA9IG1vZGYoIHYgKiBQYWNrRmFjdG9ycy5hLCB2dWYgKTsKCWZsb2F0IGJmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApOwoJZmxvYXQgZ2YgPSBtb2RmKCB2dWYgKiBTaGlmdFJpZ2h0OCwgdnVmICk7CglyZXR1cm4gdmVjNCggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiAqIFBhY2tVcHNjYWxlLCBhZiApOwp9CnZlYzMgcGFja0RlcHRoVG9SR0IoIGNvbnN0IGluIGZsb2F0IHYgKSB7CglpZiggdiA8PSAwLjAgKQoJCXJldHVybiB2ZWMzKCAwLiwgMC4sIDAuICk7CglpZiggdiA+PSAxLjAgKQoJCXJldHVybiB2ZWMzKCAxLiwgMS4sIDEuICk7CglmbG9hdCB2dWY7CglmbG9hdCBiZiA9IG1vZGYoIHYgKiBQYWNrRmFjdG9ycy5iLCB2dWYgKTsKCWZsb2F0IGdmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApOwoJcmV0dXJuIHZlYzMoIHZ1ZiAqIEludjI1NSwgZ2YgKiBQYWNrVXBzY2FsZSwgYmYgKTsKfQp2ZWMyIHBhY2tEZXB0aFRvUkcoIGNvbnN0IGluIGZsb2F0IHYgKSB7CglpZiggdiA8PSAwLjAgKQoJCXJldHVybiB2ZWMyKCAwLiwgMC4gKTsKCWlmKCB2ID49IDEuMCApCgkJcmV0dXJuIHZlYzIoIDEuLCAxLiApOwoJZmxvYXQgdnVmOwoJZmxvYXQgZ2YgPSBtb2RmKCB2ICogMjU2LiwgdnVmICk7CglyZXR1cm4gdmVjMiggdnVmICogSW52MjU1LCBnZiApOwp9CmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7CglyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzNCApOwp9CmZsb2F0IHVucGFja1JHQlRvRGVwdGgoIGNvbnN0IGluIHZlYzMgdiApIHsKCXJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMzICk7Cn0KZmxvYXQgdW5wYWNrUkdUb0RlcHRoKCBjb25zdCBpbiB2ZWMyIHYgKSB7CglyZXR1cm4gdi5yICogVW5wYWNrRmFjdG9yczIuciArIHYuZyAqIFVucGFja0ZhY3RvcnMyLmc7Cn0KdmVjNCBwYWNrMkhhbGZUb1JHQkEoIGNvbnN0IGluIHZlYzIgdiApIHsKCXZlYzQgciA9IHZlYzQoIHYueCwgZnJhY3QoIHYueCAqIDI1NS4wICksIHYueSwgZnJhY3QoIHYueSAqIDI1NS4wICkgKTsKCXJldHVybiB2ZWM0KCByLnggLSByLnkgLyAyNTUuMCwgci55LCByLnogLSByLncgLyAyNTUuMCwgci53ICk7Cn0KdmVjMiB1bnBhY2tSR0JBVG8ySGFsZiggY29uc3QgaW4gdmVjNCB2ICkgewoJcmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7Cn0KZmxvYXQgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTsKfQpmbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gZGVwdGggKiAoIG5lYXIgLSBmYXIgKSAtIG5lYXI7Cn0KZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCAoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogdmlld1ogKTsKfQpmbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgZGVwdGgsIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBkZXB0aCAtIGZhciApOwp9YCwga3MxID0gYCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLCB6czEgPSBgdmVjNCBtdlBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwojaWZkZWYgVVNFX0JBVENISU5HCgltdlBvc2l0aW9uID0gYmF0Y2hpbmdNYXRyaXggKiBtdlBvc2l0aW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgltdlBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiBtdlBvc2l0aW9uOwojZW5kaWYKbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIG12UG9zaXRpb247CmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247YCwgV3MxID0gYCNpZmRlZiBESVRIRVJJTkcKCWdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTsKI2VuZGlmYCwgWHMxID0gYCNpZmRlZiBESVRIRVJJTkcKCXZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkgewoJCWZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTsKCQl2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApOwoJCWRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7CgkJcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjsKCX0KI2VuZGlmYCwgWXMxID0gYGZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzczsKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlJvdWdobmVzc01hcFV2ICk7Cglyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZzsKI2VuZGlmYCwgcXMxID0gYCNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7CiNlbmRpZmAsIEtzMSA9IGAjaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBTcG90TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCglmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkgewoJCXJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApOwoJfQoJdmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7CgkJcmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApOwoJfQoJZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7CgkJZmxvYXQgb2NjbHVzaW9uID0gMS4wOwoJCXZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7CgkJZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTsKCQlpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkgewoJCQlmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7CgkJCWZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7CgkJCWZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7CQkJc29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7CQkJb2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7CgkJfQoJCXJldHVybiBvY2NsdXNpb247Cgl9CglmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53OwoJCXNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhczsKCQlib29sIGluRnJ1c3R1bSA9IHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wOwoJCWJvb2wgZnJ1c3R1bVRlc3QgPSBpbkZydXN0dW0gJiYgc2hhZG93Q29vcmQueiA8PSAxLjA7CgkJaWYgKCBmcnVzdHVtVGVzdCApIHsKCQkjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MiA9IGR4MCAvIDIuMDsKCQkJZmxvYXQgZHkyID0gZHkwIC8gMi4wOwoJCQlmbG9hdCBkeDMgPSBkeDEgLyAyLjA7CgkJCWZsb2F0IGR5MyA9IGR5MSAvIDIuMDsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56ICkKCQkJKSAqICggMS4wIC8gMTcuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4ID0gdGV4ZWxTaXplLng7CgkJCWZsb2F0IGR5ID0gdGV4ZWxTaXplLnk7CgkJCXZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTsKCQkJdmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApOwoJCQl1diAtPSBmICogdGV4ZWxTaXplOwoJCQlzaGFkb3cgPSAoCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdGV4ZWxTaXplLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi54ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi55ICkgKwoJCQkJbWl4KCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIGYueCApLAoJCQkJCSBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgZi55ICkKCQkJKSAqICggMS4wIC8gOS4wICk7CgkJI2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJc2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7CgkJI2Vsc2UKCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbmRpZgoJCX0KCQlyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7Cgl9Cgl2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7CgkJdmVjMyBhYnNWID0gYWJzKCB2ICk7CgkJZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7CgkJYWJzViAqPSBzY2FsZVRvQ3ViZTsKCQl2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7CgkJdmVjMiBwbGFuYXIgPSB2Lnh5OwoJCWZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7CgkJZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsOwoJCWlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHsKCQkJaWYgKCB2LnogPiAwLjAgKQoJCQkJcGxhbmFyLnggPSA0LjAgLSB2Lng7CgkJfSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTsKCQkJcGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YOwoJCX0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7CgkJCWZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7CgkJCXBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7CgkJCXBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7CgkJfQoJCXJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTsKCX0KCWZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6OwoJCQoJCWZsb2F0IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCA9IGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICk7CgkJaWYgKCBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFGYXIgPD0gMC4wICYmIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgPj0gMC4wICkgewoJCQlmbG9hdCBkcCA9ICggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7CQkJZHAgKz0gc2hhZG93QmlhczsKCQkJdmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTsKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTsKCQkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJCXZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTsKCQkJCXNoYWRvdyA9ICgKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwICkKCQkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCQkjZWxzZQoJCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTsKCQkJI2VuZGlmCgkJfQoJCXJldHVybiBtaXgoIDEuMCwgc2hhZG93LCBzaGFkb3dJbnRlbnNpdHkgKTsKCX0KI2VuZGlmYCwgJHMxID0gYCNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl1bmlmb3JtIG1hdDQgc3BvdExpZ2h0TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTsKCXZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMAoJCXN0cnVjdCBTcG90TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYUZhcjsKCQl9OwoJCXVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgojZW5kaWZgLCBaczEgPSBgI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAgKSApIHx8ICggTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMCApCgl2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzQgc2hhZG93V29ybGRQb3NpdGlvbjsKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApOwoJCQl2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7CgkJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBwb2ludExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTsKCQkJdlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfQ09PUkRTOyBpICsrICkgewoJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uOwoJCSNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJCXNoYWRvd1dvcmxkUG9zaXRpb24ueHl6ICs9IHNoYWRvd1dvcmxkTm9ybWFsICogc3BvdExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXM7CgkJI2VuZGlmCgkJdlNwb3RMaWdodENvb3JkWyBpIF0gPSBzcG90TGlnaHRNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWZgLCBRczEgPSBgZmxvYXQgZ2V0U2hhZG93TWFzaygpIHsKCWZsb2F0IHNoYWRvdyA9IDEuMDsKCSNpZmRlZiBVU0VfU0hBRE9XTUFQCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCWRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCXNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjZW5kaWYKCXJldHVybiBzaGFkb3c7Cn1gLCBKczEgPSBgI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBib25lTWF0WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7CgltYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTsKCW1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApOwoJbWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7CiNlbmRpZmAsIGpzMSA9IGAjaWZkZWYgVVNFX1NLSU5OSU5HCgl1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDsKCXVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTsKCXVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlOwoJbWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJvbmVUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApICogNDsKCQlpbnQgeCA9IGogJSBzaXplOwoJCWludCB5ID0gaiAvIHNpemU7CgkJdmVjNCB2MSA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICk7CgkJdmVjNCB2MiA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAyLCB5ICksIDAgKTsKCQl2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMywgeSApLCAwICk7CgkJcmV0dXJuIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7Cgl9CiNlbmRpZmAsIGVjMSA9IGAjaWZkZWYgVVNFX1NLSU5OSU5HCgl2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwoJdmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7Cglza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDsKCXNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55OwoJc2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7Cglza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudzsKCXRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7CiNlbmRpZmAsIHRjMSA9IGAjaWZkZWYgVVNFX1NLSU5OSU5HCgltYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC53ICogYm9uZU1hdFc7Cglza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDsKCW9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6OwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJb2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejsKCSNlbmRpZgojZW5kaWZgLCBuYzEgPSBgZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlNwZWN1bGFyTWFwVXYgKTsKCXNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7CiNlbHNlCglzcGVjdWxhclN0cmVuZ3RoID0gMS4wOwojZW5kaWZgLCBpYzEgPSBgI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7CiNlbmRpZmAsIHJjMSA9IGAjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HICkKCWdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApOwojZW5kaWZgLCBhYzEgPSBgI2lmbmRlZiBzYXR1cmF0ZQojZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wICkKI2VuZGlmCnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTsKdmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCXJldHVybiBzYXR1cmF0ZSggdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yICk7Cn0KdmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApOwp9CnZlYzMgQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7CglyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApOwp9CnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7Cgl2ZWMzIGEgPSB2ICogKCB2ICsgMC4wMjQ1Nzg2ICkgLSAwLjAwMDA5MDUzNzsKCXZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7CglyZXR1cm4gYSAvIGI7Cn0KdmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoCgkJdmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLAkJdmVjMyggMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyApLAoJCXZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKQoJKTsKCWNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoCgkJdmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLAkJdmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLAoJCXZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKQoJKTsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7Cgljb2xvciA9IEFDRVNJbnB1dE1hdCAqIGNvbG9yOwoJY29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7Cgljb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgKTsKfQpjb25zdCBtYXQzIExJTkVBUl9SRUMyMDIwX1RPX0xJTkVBUl9TUkdCID0gbWF0MygKCXZlYzMoIDEuNjYwNSwgLSAwLjEyNDYsIC0gMC4wMTgyICksCgl2ZWMzKCAtIDAuNTg3NiwgMS4xMzI5LCAtIDAuMTAwNiApLAoJdmVjMyggLSAwLjA3MjgsIC0gMC4wMDgzLCAxLjExODcgKQopOwpjb25zdCBtYXQzIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9SRUMyMDIwID0gbWF0MygKCXZlYzMoIDAuNjI3NCwgMC4wNjkxLCAwLjAxNjQgKSwKCXZlYzMoIDAuMzI5MywgMC45MTk1LCAwLjA4ODAgKSwKCXZlYzMoIDAuMDQzMywgMC4wMTEzLCAwLjg5NTYgKQopOwp2ZWMzIGFneERlZmF1bHRDb250cmFzdEFwcHJveCggdmVjMyB4ICkgewoJdmVjMyB4MiA9IHggKiB4OwoJdmVjMyB4NCA9IHgyICogeDI7CglyZXR1cm4gKyAxNS41ICogeDQgKiB4MgoJCS0gNDAuMTQgKiB4NCAqIHgKCQkrIDMxLjk2ICogeDQKCQktIDYuODY4ICogeDIgKiB4CgkJKyAwLjQyOTggKiB4MgoJCSsgMC4xMTkxICogeAoJCS0gMC4wMDIzMjsKfQp2ZWMzIEFnWFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29uc3QgbWF0MyBBZ1hJbnNldE1hdHJpeCA9IG1hdDMoCgkJdmVjMyggMC44NTY2MjcxNTMzMTU5ODMsIDAuMTM3MzE4OTcyOTI5ODQ3LCAwLjExMTg5ODIxMjk5OTk1ICksCgkJdmVjMyggMC4wOTUxMjEyNDA1MzgxNTg4LCAwLjc2MTI0MTk5MDYwMjU5MSwgMC4wNzY3OTk0MTg2MDMxOTAzICksCgkJdmVjMyggMC4wNDgyNTE2MDYxNDU4NTgzLCAwLjEwMTQzOTAzNjQ2NzU2MiwgMC44MTEzMDIzNjgzOTY4NTkgKQoJKTsKCWNvbnN0IG1hdDMgQWdYT3V0c2V0TWF0cml4ID0gbWF0MygKCQl2ZWMzKCAxLjEyNzEwMDU4MTgxNDQzNjgsIC0gMC4xNDEzMjk3NjM0OTg0MzgzLCAtIDAuMTQxMzI5NzYzNDk4NDM4MjYgKSwKCQl2ZWMzKCAtIDAuMTEwNjA2NjQzMDk2NjAzMjMsIDEuMTU3ODIzNzAyMjE2MjcyLCAtIDAuMTEwNjA2NjQzMDk2NjAyOTQgKSwKCQl2ZWMzKCAtIDAuMDE2NDkzOTM4NzE3ODM0NTczLCAtIDAuMDE2NDkzOTM4NzE3ODM0MjU3LCAxLjI1MTkzNjQwNjU5NTA0MDUgKQoJKTsKCWNvbnN0IGZsb2F0IEFneE1pbkV2ID0gLSAxMi40NzM5MzsJY29uc3QgZmxvYXQgQWd4TWF4RXYgPSA0LjAyNjA2OTsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7Cgljb2xvciA9IExJTkVBUl9TUkdCX1RPX0xJTkVBUl9SRUMyMDIwICogY29sb3I7Cgljb2xvciA9IEFnWEluc2V0TWF0cml4ICogY29sb3I7Cgljb2xvciA9IG1heCggY29sb3IsIDFlLTEwICk7CWNvbG9yID0gbG9nMiggY29sb3IgKTsKCWNvbG9yID0gKCBjb2xvciAtIEFneE1pbkV2ICkgLyAoIEFneE1heEV2IC0gQWd4TWluRXYgKTsKCWNvbG9yID0gY2xhbXAoIGNvbG9yLCAwLjAsIDEuMCApOwoJY29sb3IgPSBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIGNvbG9yICk7Cgljb2xvciA9IEFnWE91dHNldE1hdHJpeCAqIGNvbG9yOwoJY29sb3IgPSBwb3coIG1heCggdmVjMyggMC4wICksIGNvbG9yICksIHZlYzMoIDIuMiApICk7Cgljb2xvciA9IExJTkVBUl9SRUMyMDIwX1RPX0xJTkVBUl9TUkdCICogY29sb3I7Cgljb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTsKCXJldHVybiBjb2xvcjsKfQp2ZWMzIE5ldXRyYWxUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbnN0IGZsb2F0IFN0YXJ0Q29tcHJlc3Npb24gPSAwLjggLSAwLjA0OwoJY29uc3QgZmxvYXQgRGVzYXR1cmF0aW9uID0gMC4xNTsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7CglmbG9hdCB4ID0gbWluKCBjb2xvci5yLCBtaW4oIGNvbG9yLmcsIGNvbG9yLmIgKSApOwoJZmxvYXQgb2Zmc2V0ID0geCA8IDAuMDggPyB4IC0gNi4yNSAqIHggKiB4IDogMC4wNDsKCWNvbG9yIC09IG9mZnNldDsKCWZsb2F0IHBlYWsgPSBtYXgoIGNvbG9yLnIsIG1heCggY29sb3IuZywgY29sb3IuYiApICk7CglpZiAoIHBlYWsgPCBTdGFydENvbXByZXNzaW9uICkgcmV0dXJuIGNvbG9yOwoJZmxvYXQgZCA9IDEuIC0gU3RhcnRDb21wcmVzc2lvbjsKCWZsb2F0IG5ld1BlYWsgPSAxLiAtIGQgKiBkIC8gKCBwZWFrICsgZCAtIFN0YXJ0Q29tcHJlc3Npb24gKTsKCWNvbG9yICo9IG5ld1BlYWsgLyBwZWFrOwoJZmxvYXQgZyA9IDEuIC0gMS4gLyAoIERlc2F0dXJhdGlvbiAqICggcGVhayAtIG5ld1BlYWsgKSArIDEuICk7CglyZXR1cm4gbWl4KCBjb2xvciwgdmVjMyggbmV3UGVhayApLCBnICk7Cn0KdmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9YCwgb2MxID0gYCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgltYXRlcmlhbC50cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb247CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IDEuMDsKCW1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzczsKCW1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciA9IGF0dGVudWF0aW9uQ29sb3I7CgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJCW1hdGVyaWFsLnRyYW5zbWlzc2lvbiAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlRyYW5zbWlzc2lvbk1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC50aGlja25lc3MgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZUaGlja25lc3NNYXBVdiApLmc7CgkjZW5kaWYKCXZlYzMgcG9zID0gdldvcmxkUG9zaXRpb247Cgl2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7Cgl2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzQgdHJhbnNtaXR0ZWQgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKAoJCW4sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwKCQlwb3MsIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5kaXNwZXJzaW9uLCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcywKCQltYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlICk7CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IG1peCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEsIHRyYW5zbWl0dGVkLmEsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwoJdG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWl0dGVkLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7CiNlbmRpZmAsIHNjMSA9IGAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247Cgl1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczsKCXVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCXVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwOwoJI2VuZGlmCgl1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7Cgl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwOwoJdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OwoJdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Cgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CglmbG9hdCB3MCggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSBhICsgMy4wICkgLSAzLjAgKSArIDEuMCApOwoJfQoJZmxvYXQgdzEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7Cgl9CglmbG9hdCB3MiggZmxvYXQgYSApewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MyggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqIGEgKiBhICk7Cgl9CglmbG9hdCBnMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzAoIGEgKSArIHcxKCBhICk7Cgl9CglmbG9hdCBnMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7Cgl9CglmbG9hdCBoMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApOwoJfQoJZmxvYXQgaDEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7Cgl9Cgl2ZWM0IGJpY3ViaWMoIHNhbXBsZXIyRCB0ZXgsIHZlYzIgdXYsIHZlYzQgdGV4ZWxTaXplLCBmbG9hdCBsb2QgKSB7CgkJdXYgPSB1diAqIHRleGVsU2l6ZS56dyArIDAuNTsKCQl2ZWMyIGl1diA9IGZsb29yKCB1diApOwoJCXZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7CgkJZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7CgkJZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7CgkJZmxvYXQgaDB4ID0gaDAoIGZ1di54ICk7CgkJZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7CgkJZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7CgkJZmxvYXQgaDF5ID0gaDEoIGZ1di55ICk7CgkJdmVjMiBwMCA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMyA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQlyZXR1cm4gZzAoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDAsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMSwgbG9kICkgKSArCgkJCWcxKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAyLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDMsIGxvZCApICk7Cgl9Cgl2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkgewoJCXZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7CgkJdmVjMiBjTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCArIDEuMCApICkgKTsKCQl2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7CgkJdmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplOwoJCXZlYzQgZlNhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBmTG9kU2l6ZUludiwgZkxvZFNpemUgKSwgZmxvb3IoIGxvZCApICk7CgkJdmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApOwoJCXJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApOwoJfQoJdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHsKCQl2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTsKCQl2ZWMzIG1vZGVsU2NhbGU7CgkJbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTsKCX0KCWZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCXJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApOwoJfQoJdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHsKCQlmbG9hdCBsb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApOwoJCXJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTsKCX0KCXZlYzMgdm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTsKCQkJdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOwkJCXJldHVybiB0cmFuc21pdHRhbmNlOwoJCX0KCX0KCXZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsCgkJY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCwKCQljb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgZGlzcGVyc2lvbiwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsCgkJY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgewoJCXZlYzQgdHJhbnNtaXR0ZWRMaWdodDsKCQl2ZWMzIHRyYW5zbWl0dGFuY2U7CgkJI2lmZGVmIFVTRV9ESVNQRVJTSU9OCgkJCWZsb2F0IGhhbGZTcHJlYWQgPSAoIGlvciAtIDEuMCApICogMC4wMjUgKiBkaXNwZXJzaW9uOwoJCQl2ZWMzIGlvcnMgPSB2ZWMzKCBpb3IgLSBoYWxmU3ByZWFkLCBpb3IsIGlvciArIGhhbGZTcHJlYWQgKTsKCQkJZm9yICggaW50IGkgPSAwOyBpIDwgMzsgaSArKyApIHsKCQkJCXZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvcnNbIGkgXSwgbW9kZWxNYXRyaXggKTsKCQkJCXZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5OwoJCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQkJdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7CgkJCQlyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDsKCQkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQkJdmVjNCB0cmFuc21pc3Npb25TYW1wbGUgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yc1sgaSBdICk7CgkJCQl0cmFuc21pdHRlZExpZ2h0WyBpIF0gPSB0cmFuc21pc3Npb25TYW1wbGVbIGkgXTsKCQkJCXRyYW5zbWl0dGVkTGlnaHQuYSArPSB0cmFuc21pc3Npb25TYW1wbGUuYTsKCQkJCXRyYW5zbWl0dGFuY2VbIGkgXSA9IGRpZmZ1c2VDb2xvclsgaSBdICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKVsgaSBdOwoJCQl9CgkJCXRyYW5zbWl0dGVkTGlnaHQuYSAvPSAzLjA7CgkJI2Vsc2UKCQkJdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApOwoJCQl2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTsKCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQl2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudzsKCQkJcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7CgkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQl0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApOwoJCQl0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTsKCQkjZW5kaWYKCQl2ZWMzIGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UgKiB0cmFuc21pdHRlZExpZ2h0LnJnYjsKCQl2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTsKCQlmbG9hdCB0cmFuc21pdHRhbmNlRmFjdG9yID0gKCB0cmFuc21pdHRhbmNlLnIgKyB0cmFuc21pdHRhbmNlLmcgKyB0cmFuc21pdHRhbmNlLmIgKSAvIDMuMDsKCQlyZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IsIDEuMCAtICggMS4wIC0gdHJhbnNtaXR0ZWRMaWdodC5hICkgKiB0cmFuc21pdHRhbmNlRmFjdG9yICk7Cgl9CiNlbmRpZmAsIGNjMSA9IGAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2YXJ5aW5nIHZlYzIgdk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdmFyeWluZyB2ZWMyIHZBb01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsIGxjMSA9IGAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIG1hdDMgbWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gbWF0MyBhbHBoYU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gbWF0MyBsaWdodE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gbWF0MyBhb01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdW5pZm9ybSBtYXQzIGJ1bXBNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIG1hdDMgZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZEaXNwbGFjZW1lbnRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gbWF0MyBlbWlzc2l2ZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIG1hdDMgbWV0YWxuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgcm91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdW5pZm9ybSBtYXQzIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsIGZjMSA9IGAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdlV2ID0gdmVjMyggdXYsIDEgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2TWFwVXYgPSAoIG1hcFRyYW5zZm9ybSAqIHZlYzMoIE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl2QWxwaGFNYXBVdiA9ICggYWxwaGFNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTFBIQU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0xJR0hUTUFQCgl2TGlnaHRNYXBVdiA9ICggbGlnaHRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBMSUdIVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FPTUFQCgl2QW9NYXBVdiA9ICggYW9NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBT01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0JVTVBNQVAKCXZCdW1wTWFwVXYgPSAoIGJ1bXBNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBCVU1QTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2Tm9ybWFsTWFwVXYgPSAoIG5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIE5PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdkRpc3BsYWNlbWVudE1hcFV2ID0gKCBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBESVNQTEFDRU1FTlRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdkVtaXNzaXZlTWFwVXYgPSAoIGVtaXNzaXZlTWFwVHJhbnNmb3JtICogdmVjMyggRU1JU1NJVkVNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZNZXRhbG5lc3NNYXBVdiA9ICggbWV0YWxuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggTUVUQUxORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl2Um91Z2huZXNzTWFwVXYgPSAoIHJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFJPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZBbmlzb3Ryb3B5TWFwVXYgPSAoIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTklTT1RST1BZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl2Q2xlYXJjb2F0TWFwVXYgPSAoIGNsZWFyY29hdE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZDbGVhcmNvYXROb3JtYWxNYXBVdiA9ICggY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX05PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA9ICggY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2SXJpZGVzY2VuY2VNYXBVdiA9ICggaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgPSAoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCXZTaGVlbkNvbG9yTWFwVXYgPSAoIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdlNoZWVuUm91Z2huZXNzTWFwVXYgPSAoIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZTcGVjdWxhck1hcFV2ID0gKCBzcGVjdWxhck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCXZTcGVjdWxhckNvbG9yTWFwVXYgPSAoIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgPSAoIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl2VHJhbnNtaXNzaW9uTWFwVXYgPSAoIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSAqIHZlYzMoIFRSQU5TTUlTU0lPTk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdlRoaWNrbmVzc01hcFV2ID0gKCB0aGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUSElDS05FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWZgLCBkYzEgPSBgI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9UUkFOU01JU1NJT04gKSB8fCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CgkjaWZkZWYgVVNFX0JBVENISU5HCgkJd29ybGRQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgkJd29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjsKI2VuZGlmYCwgdWMxID0gYHZhcnlpbmcgdmVjMiB2VXY7CnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKdm9pZCBtYWluKCkgewoJdlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7Cn1gLCBwYzEgPSBgdW5pZm9ybSBzYW1wbGVyMkQgdDJEOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnZhcnlpbmcgdmVjMiB2VXY7CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQl0ZXhDb2xvciA9IHZlYzQoIG1peCggcG93KCB0ZXhDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdGV4Q29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB0ZXhDb2xvci5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdGV4Q29sb3IudyApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLCBoYzEgPSBgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsKfWAsIG1jMSA9IGAjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CiNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwojZW5kaWYKdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRCbHVycmluZXNzOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnVuaWZvcm0gbWF0MyBiYWNrZ3JvdW5kUm90YXRpb247CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZXb3JsZERpcmVjdGlvbiwgYmFja2dyb3VuZEJsdXJyaW5lc3MgKTsKCSNlbHNlCgkJdmVjNCB0ZXhDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLCBfYzEgPSBgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsKfWAsIHZjMSA9IGB1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlOwp1bmlmb3JtIGZsb2F0IHRGbGlwOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCWdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsIGdjMSA9IGAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2SGlnaFByZWNpc2lvblpXID0gZ2xfUG9zaXRpb24uenc7Cn1gLCBTYzEgPSBgI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTsKCSNlbmRpZgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41OwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxCgkJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7CgkjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDIKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHQiggZnJhZ0Nvb3JkWiApLCAxLjAgKTsKCSNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMwoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tEZXB0aFRvUkcoIGZyYWdDb29yZFogKSwgMC4wLCAxLjAgKTsKCSNlbmRpZgp9YCwgRWMxID0gYCNkZWZpbmUgRElTVEFOQ0UKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6Owp9YCwgTWMxID0gYCNkZWZpbmUgRElTVEFOQ0UKdW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uOwp1bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTsKdW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTsKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbiAoKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCWZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTsKCWRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTsKCWRpc3QgPSBzYXR1cmF0ZSggZGlzdCApOwoJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7Cn1gLCBUYzEgPSBgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+Cn1gLCB4YzEgPSBgdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7Cgl2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7CglnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCwgQWMxID0gYHVuaWZvcm0gZmxvYXQgc2NhbGU7CmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7CnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7Cgl2TGluZURpc3RhbmNlID0gc2NhbGUgKiBsaW5lRGlzdGFuY2U7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCBSYzEgPSBgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTsKdW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7CnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJaWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7CgkJZGlzY2FyZDsKCX0KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50Pgp9YCwgQ2MxID0gYCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpZiBkZWZpbmVkICggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQgKCBVU0VfU0tJTk5JTkcgKQoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCwgYmMxID0gYHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTsKCSNpZmRlZiBVU0VfTElHSFRNQVAKCQl2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApOwoJCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5ICogUkVDSVBST0NBTF9QSTsKCSNlbHNlCgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApOwoJI2VuZGlmCgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjsKCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgUGMxID0gYCNkZWZpbmUgTEFNQkVSVAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIExjMSA9IGAjZGVmaW5lIExBTUJFUlQKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTsKCXZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPgoJI2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgVWMxID0gYCNkZWZpbmUgTUFUQ0FQCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKfWAsIERjMSA9IGAjZGVmaW5lIE1BVENBUAp1bmlmb3JtIHZlYzMgZGlmZnVzZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5Owp1bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7CnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+Cgl2ZWMzIHZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTsKCXZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7Cgl2ZWMyIHV2ID0gdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7CgkjaWZkZWYgVVNFX01BVENBUAoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTsKCSNlbHNlCgkJdmVjNCBtYXRjYXBDb2xvciA9IHZlYzQoIHZlYzMoIG1peCggMC4yLCAwLjgsIHV2LnkgKSApLCAxLjAgKTsKCSNlbmRpZgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLCB3YzEgPSBgI2RlZmluZSBOT1JNQUwKI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2VuZGlmCiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CiNlbmRpZgp9YCwgSWMxID0gYCNkZWZpbmUgTk9STUFMCnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2VuZGlmCiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBkaWZmdXNlQ29sb3IuYSApOwoJI2lmZGVmIE9QQVFVRQoJCWdsX0ZyYWdDb2xvci5hID0gMS4wOwoJI2VuZGlmCn1gLCB5YzEgPSBgI2RlZmluZSBQSE9ORwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIE5jMSA9IGAjZGVmaW5lIFBIT05HCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gdmVjMyBzcGVjdWxhcjsKdW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPgoJI2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgT2MxID0gYCNkZWZpbmUgU1RBTkRBUkQKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KCXZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7CiNlbmRpZgp9YCwgRmMxID0gYCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJdW5pZm9ybSBmbG9hdCBkaXNwZXJzaW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VJT1I7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJdW5pZm9ybSB2ZWMzIHNoZWVuQ29sb3I7Cgl1bmlmb3JtIGZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuQ29sb3JNYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Sb3VnaG5lc3NNYXA7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJdW5pZm9ybSB2ZWMyIGFuaXNvdHJvcHlWZWN0b3I7CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBhbmlzb3Ryb3B5TWFwOwoJI2VuZGlmCiNlbmRpZgp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX2ZyYWdtZW50PgojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8aXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCXZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjsKCSNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2lmZGVmIFVTRV9TSEVFTgoJCWZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApOwoJCW91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhckRpcmVjdCArIHNoZWVuU3BlY3VsYXJJbmRpcmVjdDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROVmNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJdmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyAoIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICsgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCApICogbWF0ZXJpYWwuY2xlYXJjb2F0OwoJI2VuZGlmCgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgQmMxID0gYCNkZWZpbmUgVE9PTgp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCBHYzEgPSBgI2RlZmluZSBUT09OCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsIEhjMSA9IGB1bmlmb3JtIGZsb2F0IHNpemU7CnVuaWZvcm0gZmxvYXQgc2NhbGU7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CiNpZmRlZiBVU0VfUE9JTlRTX1VWCgl2YXJ5aW5nIHZlYzIgdlV2OwoJdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwojZW5kaWYKdm9pZCBtYWluKCkgewoJI2lmZGVmIFVTRV9QT0lOVFNfVVYKCQl2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5OwoJI2VuZGlmCgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb2ludFNpemUgPSBzaXplOwoJI2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT04KCQlib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7CgkJaWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICo9ICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApOwoJI2VuZGlmCgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCBWYzEgPSBgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsIGtjMSA9IGAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCB6YzEgPSBgdW5pZm9ybSB2ZWMzIGNvbG9yOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWAsIFdjMSA9IGB1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOwp1bmlmb3JtIHZlYzIgY2VudGVyOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCXZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeFsgMyBdOwoJdmVjMiBzY2FsZSA9IHZlYzIoIGxlbmd0aCggbW9kZWxNYXRyaXhbIDAgXS54eXogKSwgbGVuZ3RoKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT04KCQlib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7CgkJaWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7CgkjZW5kaWYKCXZlYzIgYWxpZ25lZFBvc2l0aW9uID0gKCBwb3NpdGlvbi54eSAtICggY2VudGVyIC0gdmVjMiggMC41ICkgKSApICogc2NhbGU7Cgl2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsKCXJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCXJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCW12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uOwoJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCwgWGMxID0gYHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWAsIFBlMSA9IHsKICAgIGFscGhhaGFzaF9mcmFnbWVudDogcG8xLAogICAgYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ6IGhvMSwKICAgIGFscGhhbWFwX2ZyYWdtZW50OiBtbzEsCiAgICBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBfbzEsCiAgICBhbHBoYXRlc3RfZnJhZ21lbnQ6IHZvMSwKICAgIGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50OiBnbzEsCiAgICBhb21hcF9mcmFnbWVudDogU28xLAogICAgYW9tYXBfcGFyc19mcmFnbWVudDogRW8xLAogICAgYmF0Y2hpbmdfcGFyc192ZXJ0ZXg6IE1vMSwKICAgIGJhdGNoaW5nX3ZlcnRleDogVG8xLAogICAgYmVnaW5fdmVydGV4OiB4bzEsCiAgICBiZWdpbm5vcm1hbF92ZXJ0ZXg6IEFvMSwKICAgIGJzZGZzOiBSbzEsCiAgICBpcmlkZXNjZW5jZV9mcmFnbWVudDogQ28xLAogICAgYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiBibzEsCiAgICBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IFBvMSwKICAgIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBMbzEsCiAgICBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IFVvMSwKICAgIGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IERvMSwKICAgIGNvbG9yX2ZyYWdtZW50OiB3bzEsCiAgICBjb2xvcl9wYXJzX2ZyYWdtZW50OiBJbzEsCiAgICBjb2xvcl9wYXJzX3ZlcnRleDogeW8xLAogICAgY29sb3JfdmVydGV4OiBObzEsCiAgICBjb21tb246IE9vMSwKICAgIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogRm8xLAogICAgZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6IEJvMSwKICAgIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogR28xLAogICAgZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogSG8xLAogICAgZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IFZvMSwKICAgIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGtvMSwKICAgIGNvbG9yc3BhY2VfZnJhZ21lbnQ6IHpvMSwKICAgIGNvbG9yc3BhY2VfcGFyc19mcmFnbWVudDogV28xLAogICAgZW52bWFwX2ZyYWdtZW50OiBYbzEsCiAgICBlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IFlvLAogICAgZW52bWFwX3BhcnNfZnJhZ21lbnQ6IHFvMSwKICAgIGVudm1hcF9wYXJzX3ZlcnRleDogS28sCiAgICBlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogYXMxLAogICAgZW52bWFwX3ZlcnRleDogJG8sCiAgICBmb2dfdmVydGV4OiBabzEsCiAgICBmb2dfcGFyc192ZXJ0ZXg6IFFvLAogICAgZm9nX2ZyYWdtZW50OiBKbzEsCiAgICBmb2dfcGFyc19mcmFnbWVudDogam8sCiAgICBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiBlcywKICAgIGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IHRzMSwKICAgIGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50OiBuczEsCiAgICBsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50OiBpcywKICAgIGxpZ2h0c19wYXJzX2JlZ2luOiByczEsCiAgICBsaWdodHNfdG9vbl9mcmFnbWVudDogb3MxLAogICAgbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudDogc3MxLAogICAgbGlnaHRzX3Bob25nX2ZyYWdtZW50OiBjczEsCiAgICBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbHMxLAogICAgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBmczEsCiAgICBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogZHMxLAogICAgbGlnaHRzX2ZyYWdtZW50X2JlZ2luOiB1czEsCiAgICBsaWdodHNfZnJhZ21lbnRfbWFwczogcHMxLAogICAgbGlnaHRzX2ZyYWdtZW50X2VuZDogaHMxLAogICAgbG9nZGVwdGhidWZfZnJhZ21lbnQ6IG1zMSwKICAgIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IF9zMSwKICAgIGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiB2czEsCiAgICBsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGdzMSwKICAgIG1hcF9mcmFnbWVudDogU3MxLAogICAgbWFwX3BhcnNfZnJhZ21lbnQ6IEVzMSwKICAgIG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogTXMxLAogICAgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IFRzMSwKICAgIG1ldGFsbmVzc21hcF9mcmFnbWVudDogeHMxLAogICAgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IEFzMSwKICAgIG1vcnBoaW5zdGFuY2VfdmVydGV4OiBSczEsCiAgICBtb3JwaGNvbG9yX3ZlcnRleDogQ3MxLAogICAgbW9ycGhub3JtYWxfdmVydGV4OiBiczEsCiAgICBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogUHMxLAogICAgbW9ycGh0YXJnZXRfdmVydGV4OiBMczEsCiAgICBub3JtYWxfZnJhZ21lbnRfYmVnaW46IFVzMSwKICAgIG5vcm1hbF9mcmFnbWVudF9tYXBzOiBEczEsCiAgICBub3JtYWxfcGFyc19mcmFnbWVudDogd3MxLAogICAgbm9ybWFsX3BhcnNfdmVydGV4OiBJczEsCiAgICBub3JtYWxfdmVydGV4OiB5czEsCiAgICBub3JtYWxtYXBfcGFyc19mcmFnbWVudDogTnMxLAogICAgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjogT3MxLAogICAgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiBGczEsCiAgICBjbGVhcmNvYXRfcGFyc19mcmFnbWVudDogQnMxLAogICAgaXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudDogR3MxLAogICAgb3BhcXVlX2ZyYWdtZW50OiBIczEsCiAgICBwYWNraW5nOiBWczEsCiAgICBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBrczEsCiAgICBwcm9qZWN0X3ZlcnRleDogenMxLAogICAgZGl0aGVyaW5nX2ZyYWdtZW50OiBXczEsCiAgICBkaXRoZXJpbmdfcGFyc19mcmFnbWVudDogWHMxLAogICAgcm91Z2huZXNzbWFwX2ZyYWdtZW50OiBZczEsCiAgICByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcXMxLAogICAgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IEtzMSwKICAgIHNoYWRvd21hcF9wYXJzX3ZlcnRleDogJHMxLAogICAgc2hhZG93bWFwX3ZlcnRleDogWnMxLAogICAgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBRczEsCiAgICBza2luYmFzZV92ZXJ0ZXg6IEpzMSwKICAgIHNraW5uaW5nX3BhcnNfdmVydGV4OiBqczEsCiAgICBza2lubmluZ192ZXJ0ZXg6IGVjMSwKICAgIHNraW5ub3JtYWxfdmVydGV4OiB0YzEsCiAgICBzcGVjdWxhcm1hcF9mcmFnbWVudDogbmMxLAogICAgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogaWMxLAogICAgdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHJjMSwKICAgIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IGFjMSwKICAgIHRyYW5zbWlzc2lvbl9mcmFnbWVudDogb2MxLAogICAgdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6IHNjMSwKICAgIHV2X3BhcnNfZnJhZ21lbnQ6IGNjMSwKICAgIHV2X3BhcnNfdmVydGV4OiBsYzEsCiAgICB1dl92ZXJ0ZXg6IGZjMSwKICAgIHdvcmxkcG9zX3ZlcnRleDogZGMxLAogICAgYmFja2dyb3VuZF92ZXJ0OiB1YzEsCiAgICBiYWNrZ3JvdW5kX2ZyYWc6IHBjMSwKICAgIGJhY2tncm91bmRDdWJlX3ZlcnQ6IGhjMSwKICAgIGJhY2tncm91bmRDdWJlX2ZyYWc6IG1jMSwKICAgIGN1YmVfdmVydDogX2MxLAogICAgY3ViZV9mcmFnOiB2YzEsCiAgICBkZXB0aF92ZXJ0OiBnYzEsCiAgICBkZXB0aF9mcmFnOiBTYzEsCiAgICBkaXN0YW5jZVJHQkFfdmVydDogRWMxLAogICAgZGlzdGFuY2VSR0JBX2ZyYWc6IE1jMSwKICAgIGVxdWlyZWN0X3ZlcnQ6IFRjMSwKICAgIGVxdWlyZWN0X2ZyYWc6IHhjMSwKICAgIGxpbmVkYXNoZWRfdmVydDogQWMxLAogICAgbGluZWRhc2hlZF9mcmFnOiBSYzEsCiAgICBtZXNoYmFzaWNfdmVydDogQ2MxLAogICAgbWVzaGJhc2ljX2ZyYWc6IGJjMSwKICAgIG1lc2hsYW1iZXJ0X3ZlcnQ6IFBjMSwKICAgIG1lc2hsYW1iZXJ0X2ZyYWc6IExjMSwKICAgIG1lc2htYXRjYXBfdmVydDogVWMxLAogICAgbWVzaG1hdGNhcF9mcmFnOiBEYzEsCiAgICBtZXNobm9ybWFsX3ZlcnQ6IHdjMSwKICAgIG1lc2hub3JtYWxfZnJhZzogSWMxLAogICAgbWVzaHBob25nX3ZlcnQ6IHljMSwKICAgIG1lc2hwaG9uZ19mcmFnOiBOYzEsCiAgICBtZXNocGh5c2ljYWxfdmVydDogT2MxLAogICAgbWVzaHBoeXNpY2FsX2ZyYWc6IEZjMSwKICAgIG1lc2h0b29uX3ZlcnQ6IEJjMSwKICAgIG1lc2h0b29uX2ZyYWc6IEdjMSwKICAgIHBvaW50c192ZXJ0OiBIYzEsCiAgICBwb2ludHNfZnJhZzogVmMxLAogICAgc2hhZG93X3ZlcnQ6IGtjMSwKICAgIHNoYWRvd19mcmFnOiB6YzEsCiAgICBzcHJpdGVfdmVydDogV2MxLAogICAgc3ByaXRlX2ZyYWc6IFhjMQp9LCBlZTEgPSB7CiAgICBjb21tb246IHsKICAgICAgICBkaWZmdXNlOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgxNjc3NzIxNSkKICAgICAgICB9LAogICAgICAgIG9wYWNpdHk6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9LAogICAgICAgIG1hcDogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgbWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICB9LAogICAgICAgIGFscGhhTWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBhbHBoYU1hcFRyYW5zZm9ybTogewogICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgfSwKICAgICAgICBhbHBoYVRlc3Q6IHsKICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICB9CiAgICB9LAogICAgc3BlY3VsYXJtYXA6IHsKICAgICAgICBzcGVjdWxhck1hcDogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgc3BlY3VsYXJNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0KICAgIH0sCiAgICBlbnZtYXA6IHsKICAgICAgICBlbnZNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9LAogICAgICAgIGVudk1hcFJvdGF0aW9uOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICB9LAogICAgICAgIGZsaXBFbnZNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IC0xCiAgICAgICAgfSwKICAgICAgICByZWZsZWN0aXZpdHk6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9LAogICAgICAgIGlvcjogewogICAgICAgICAgICB2YWx1ZTogMS41CiAgICAgICAgfSwKICAgICAgICByZWZyYWN0aW9uUmF0aW86IHsKICAgICAgICAgICAgdmFsdWU6IC45OAogICAgICAgIH0KICAgIH0sCiAgICBhb21hcDogewogICAgICAgIGFvTWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBhb01hcEludGVuc2l0eTogewogICAgICAgICAgICB2YWx1ZTogMQogICAgICAgIH0sCiAgICAgICAgYW9NYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0KICAgIH0sCiAgICBsaWdodG1hcDogewogICAgICAgIGxpZ2h0TWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBsaWdodE1hcEludGVuc2l0eTogewogICAgICAgICAgICB2YWx1ZTogMQogICAgICAgIH0sCiAgICAgICAgbGlnaHRNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0KICAgIH0sCiAgICBidW1wbWFwOiB7CiAgICAgICAgYnVtcE1hcDogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgYnVtcE1hcFRyYW5zZm9ybTogewogICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgfSwKICAgICAgICBidW1wU2NhbGU6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9CiAgICB9LAogICAgbm9ybWFsbWFwOiB7CiAgICAgICAgbm9ybWFsTWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBub3JtYWxNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0sCiAgICAgICAgbm9ybWFsU2NhbGU6IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBUKDEsIDEpCiAgICAgICAgfQogICAgfSwKICAgIGRpc3BsYWNlbWVudG1hcDogewogICAgICAgIGRpc3BsYWNlbWVudE1hcDogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICB9LAogICAgICAgIGRpc3BsYWNlbWVudFNjYWxlOiB7CiAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgfSwKICAgICAgICBkaXNwbGFjZW1lbnRCaWFzOiB7CiAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgfQogICAgfSwKICAgIGVtaXNzaXZlbWFwOiB7CiAgICAgICAgZW1pc3NpdmVNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9LAogICAgICAgIGVtaXNzaXZlTWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICB9CiAgICB9LAogICAgbWV0YWxuZXNzbWFwOiB7CiAgICAgICAgbWV0YWxuZXNzTWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBtZXRhbG5lc3NNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0KICAgIH0sCiAgICByb3VnaG5lc3NtYXA6IHsKICAgICAgICByb3VnaG5lc3NNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9LAogICAgICAgIHJvdWdobmVzc01hcFRyYW5zZm9ybTogewogICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgfQogICAgfSwKICAgIGdyYWRpZW50bWFwOiB7CiAgICAgICAgZ3JhZGllbnRNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9CiAgICB9LAogICAgZm9nOiB7CiAgICAgICAgZm9nRGVuc2l0eTogewogICAgICAgICAgICB2YWx1ZTogMjVlLTUKICAgICAgICB9LAogICAgICAgIGZvZ05lYXI6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9LAogICAgICAgIGZvZ0ZhcjogewogICAgICAgICAgICB2YWx1ZTogMmUzCiAgICAgICAgfSwKICAgICAgICBmb2dDb2xvcjogewogICAgICAgICAgICB2YWx1ZTogbmV3IFAoMTY3NzcyMTUpCiAgICAgICAgfQogICAgfSwKICAgIGxpZ2h0czogewogICAgICAgIGFtYmllbnRMaWdodENvbG9yOiB7CiAgICAgICAgICAgIHZhbHVlOiBbXQogICAgICAgIH0sCiAgICAgICAgbGlnaHRQcm9iZTogewogICAgICAgICAgICB2YWx1ZTogW10KICAgICAgICB9LAogICAgICAgIGRpcmVjdGlvbmFsTGlnaHRzOiB7CiAgICAgICAgICAgIHZhbHVlOiBbXSwKICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiB7fSwKICAgICAgICAgICAgICAgIGNvbG9yOiB7fQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBkaXJlY3Rpb25hbExpZ2h0U2hhZG93czogewogICAgICAgICAgICB2YWx1ZTogW10sCiAgICAgICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgIHNoYWRvd0ludGVuc2l0eTogMSwKICAgICAgICAgICAgICAgIHNoYWRvd0JpYXM6IHt9LAogICAgICAgICAgICAgICAgc2hhZG93Tm9ybWFsQmlhczoge30sCiAgICAgICAgICAgICAgICBzaGFkb3dSYWRpdXM6IHt9LAogICAgICAgICAgICAgICAgc2hhZG93TWFwU2l6ZToge30KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsKICAgICAgICAgICAgdmFsdWU6IFtdCiAgICAgICAgfSwKICAgICAgICBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogewogICAgICAgICAgICB2YWx1ZTogW10KICAgICAgICB9LAogICAgICAgIHNwb3RMaWdodHM6IHsKICAgICAgICAgICAgdmFsdWU6IFtdLAogICAgICAgICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICBjb2xvcjoge30sCiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge30sCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHt9LAogICAgICAgICAgICAgICAgZGlzdGFuY2U6IHt9LAogICAgICAgICAgICAgICAgY29uZUNvczoge30sCiAgICAgICAgICAgICAgICBwZW51bWJyYUNvczoge30sCiAgICAgICAgICAgICAgICBkZWNheToge30KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgc3BvdExpZ2h0U2hhZG93czogewogICAgICAgICAgICB2YWx1ZTogW10sCiAgICAgICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgIHNoYWRvd0ludGVuc2l0eTogMSwKICAgICAgICAgICAgICAgIHNoYWRvd0JpYXM6IHt9LAogICAgICAgICAgICAgICAgc2hhZG93Tm9ybWFsQmlhczoge30sCiAgICAgICAgICAgICAgICBzaGFkb3dSYWRpdXM6IHt9LAogICAgICAgICAgICAgICAgc2hhZG93TWFwU2l6ZToge30KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgc3BvdExpZ2h0TWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBbXQogICAgICAgIH0sCiAgICAgICAgc3BvdFNoYWRvd01hcDogewogICAgICAgICAgICB2YWx1ZTogW10KICAgICAgICB9LAogICAgICAgIHNwb3RMaWdodE1hdHJpeDogewogICAgICAgICAgICB2YWx1ZTogW10KICAgICAgICB9LAogICAgICAgIHBvaW50TGlnaHRzOiB7CiAgICAgICAgICAgIHZhbHVlOiBbXSwKICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgICAgY29sb3I6IHt9LAogICAgICAgICAgICAgICAgcG9zaXRpb246IHt9LAogICAgICAgICAgICAgICAgZGVjYXk6IHt9LAogICAgICAgICAgICAgICAgZGlzdGFuY2U6IHt9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHBvaW50TGlnaHRTaGFkb3dzOiB7CiAgICAgICAgICAgIHZhbHVlOiBbXSwKICAgICAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgICAgICAgc2hhZG93SW50ZW5zaXR5OiAxLAogICAgICAgICAgICAgICAgc2hhZG93Qmlhczoge30sCiAgICAgICAgICAgICAgICBzaGFkb3dOb3JtYWxCaWFzOiB7fSwKICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czoge30sCiAgICAgICAgICAgICAgICBzaGFkb3dNYXBTaXplOiB7fSwKICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYU5lYXI6IHt9LAogICAgICAgICAgICAgICAgc2hhZG93Q2FtZXJhRmFyOiB7fQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBwb2ludFNoYWRvd01hcDogewogICAgICAgICAgICB2YWx1ZTogW10KICAgICAgICB9LAogICAgICAgIHBvaW50U2hhZG93TWF0cml4OiB7CiAgICAgICAgICAgIHZhbHVlOiBbXQogICAgICAgIH0sCiAgICAgICAgaGVtaXNwaGVyZUxpZ2h0czogewogICAgICAgICAgICB2YWx1ZTogW10sCiAgICAgICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjoge30sCiAgICAgICAgICAgICAgICBza3lDb2xvcjoge30sCiAgICAgICAgICAgICAgICBncm91bmRDb2xvcjoge30KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcmVjdEFyZWFMaWdodHM6IHsKICAgICAgICAgICAgdmFsdWU6IFtdLAogICAgICAgICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICBjb2xvcjoge30sCiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge30sCiAgICAgICAgICAgICAgICB3aWR0aDoge30sCiAgICAgICAgICAgICAgICBoZWlnaHQ6IHt9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGx0Y18xOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBsdGNfMjogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0KICAgIH0sCiAgICBwb2ludHM6IHsKICAgICAgICBkaWZmdXNlOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgxNjc3NzIxNSkKICAgICAgICB9LAogICAgICAgIG9wYWNpdHk6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9LAogICAgICAgIHNpemU6IHsKICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICB9LAogICAgICAgIHNjYWxlOiB7CiAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgfSwKICAgICAgICBtYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9LAogICAgICAgIGFscGhhTWFwOiB7CiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgfSwKICAgICAgICBhbHBoYU1hcFRyYW5zZm9ybTogewogICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgfSwKICAgICAgICBhbHBoYVRlc3Q6IHsKICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICB9LAogICAgICAgIHV2VHJhbnNmb3JtOiB7CiAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICB9CiAgICB9LAogICAgc3ByaXRlOiB7CiAgICAgICAgZGlmZnVzZTogewogICAgICAgICAgICB2YWx1ZTogbmV3IFAoMTY3NzcyMTUpCiAgICAgICAgfSwKICAgICAgICBvcGFjaXR5OiB7CiAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgfSwKICAgICAgICBjZW50ZXI6IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBUKC41LCAuNSkKICAgICAgICB9LAogICAgICAgIHJvdGF0aW9uOiB7CiAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgfSwKICAgICAgICBtYXA6IHsKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICB9LAogICAgICAgIG1hcFRyYW5zZm9ybTogewogICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgfSwKICAgICAgICBhbHBoYU1hcDogewogICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgIH0sCiAgICAgICAgYWxwaGFNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgIH0sCiAgICAgICAgYWxwaGFUZXN0OiB7CiAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgfQogICAgfQp9LCBndDEgPSB7CiAgICBiYXNpYzogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5zcGVjdWxhcm1hcCwKICAgICAgICAgICAgZWUxLmVudm1hcCwKICAgICAgICAgICAgZWUxLmFvbWFwLAogICAgICAgICAgICBlZTEubGlnaHRtYXAsCiAgICAgICAgICAgIGVlMS5mb2cKICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5tZXNoYmFzaWNfdmVydCwKICAgICAgICBmcmFnbWVudFNoYWRlcjogUGUxLm1lc2hiYXNpY19mcmFnCiAgICB9LAogICAgbGFtYmVydDogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5zcGVjdWxhcm1hcCwKICAgICAgICAgICAgZWUxLmVudm1hcCwKICAgICAgICAgICAgZWUxLmFvbWFwLAogICAgICAgICAgICBlZTEubGlnaHRtYXAsCiAgICAgICAgICAgIGVlMS5lbWlzc2l2ZW1hcCwKICAgICAgICAgICAgZWUxLmJ1bXBtYXAsCiAgICAgICAgICAgIGVlMS5ub3JtYWxtYXAsCiAgICAgICAgICAgIGVlMS5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgICAgIGVlMS5mb2csCiAgICAgICAgICAgIGVlMS5saWdodHMsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVtaXNzaXZlOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBQKDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5tZXNobGFtYmVydF92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEubWVzaGxhbWJlcnRfZnJhZwogICAgfSwKICAgIHBob25nOiB7CiAgICAgICAgdW5pZm9ybXM6IEl1KFsKICAgICAgICAgICAgZWUxLmNvbW1vbiwKICAgICAgICAgICAgZWUxLnNwZWN1bGFybWFwLAogICAgICAgICAgICBlZTEuZW52bWFwLAogICAgICAgICAgICBlZTEuYW9tYXAsCiAgICAgICAgICAgIGVlMS5saWdodG1hcCwKICAgICAgICAgICAgZWUxLmVtaXNzaXZlbWFwLAogICAgICAgICAgICBlZTEuYnVtcG1hcCwKICAgICAgICAgICAgZWUxLm5vcm1hbG1hcCwKICAgICAgICAgICAgZWUxLmRpc3BsYWNlbWVudG1hcCwKICAgICAgICAgICAgZWUxLmZvZywKICAgICAgICAgICAgZWUxLmxpZ2h0cywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZW1pc3NpdmU6IHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IFAoMCkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzcGVjdWxhcjogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgxMTE4NDgxKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNoaW5pbmVzczogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAzMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSksCiAgICAgICAgdmVydGV4U2hhZGVyOiBQZTEubWVzaHBob25nX3ZlcnQsCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFBlMS5tZXNocGhvbmdfZnJhZwogICAgfSwKICAgIHN0YW5kYXJkOiB7CiAgICAgICAgdW5pZm9ybXM6IEl1KFsKICAgICAgICAgICAgZWUxLmNvbW1vbiwKICAgICAgICAgICAgZWUxLmVudm1hcCwKICAgICAgICAgICAgZWUxLmFvbWFwLAogICAgICAgICAgICBlZTEubGlnaHRtYXAsCiAgICAgICAgICAgIGVlMS5lbWlzc2l2ZW1hcCwKICAgICAgICAgICAgZWUxLmJ1bXBtYXAsCiAgICAgICAgICAgIGVlMS5ub3JtYWxtYXAsCiAgICAgICAgICAgIGVlMS5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgICAgIGVlMS5yb3VnaG5lc3NtYXAsCiAgICAgICAgICAgIGVlMS5tZXRhbG5lc3NtYXAsCiAgICAgICAgICAgIGVlMS5mb2csCiAgICAgICAgICAgIGVlMS5saWdodHMsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVtaXNzaXZlOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBQKDApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcm91Z2huZXNzOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVudk1hcEludGVuc2l0eTogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5tZXNocGh5c2ljYWxfdmVydCwKICAgICAgICBmcmFnbWVudFNoYWRlcjogUGUxLm1lc2hwaHlzaWNhbF9mcmFnCiAgICB9LAogICAgdG9vbjogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5hb21hcCwKICAgICAgICAgICAgZWUxLmxpZ2h0bWFwLAogICAgICAgICAgICBlZTEuZW1pc3NpdmVtYXAsCiAgICAgICAgICAgIGVlMS5idW1wbWFwLAogICAgICAgICAgICBlZTEubm9ybWFsbWFwLAogICAgICAgICAgICBlZTEuZGlzcGxhY2VtZW50bWFwLAogICAgICAgICAgICBlZTEuZ3JhZGllbnRtYXAsCiAgICAgICAgICAgIGVlMS5mb2csCiAgICAgICAgICAgIGVlMS5saWdodHMsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVtaXNzaXZlOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBQKDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5tZXNodG9vbl92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEubWVzaHRvb25fZnJhZwogICAgfSwKICAgIG1hdGNhcDogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5idW1wbWFwLAogICAgICAgICAgICBlZTEubm9ybWFsbWFwLAogICAgICAgICAgICBlZTEuZGlzcGxhY2VtZW50bWFwLAogICAgICAgICAgICBlZTEuZm9nLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtYXRjYXA6IHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSksCiAgICAgICAgdmVydGV4U2hhZGVyOiBQZTEubWVzaG1hdGNhcF92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEubWVzaG1hdGNhcF9mcmFnCiAgICB9LAogICAgcG9pbnRzOiB7CiAgICAgICAgdW5pZm9ybXM6IEl1KFsKICAgICAgICAgICAgZWUxLnBvaW50cywKICAgICAgICAgICAgZWUxLmZvZwogICAgICAgIF0pLAogICAgICAgIHZlcnRleFNoYWRlcjogUGUxLnBvaW50c192ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEucG9pbnRzX2ZyYWcKICAgIH0sCiAgICBkYXNoZWQ6IHsKICAgICAgICB1bmlmb3JtczogSXUoWwogICAgICAgICAgICBlZTEuY29tbW9uLAogICAgICAgICAgICBlZTEuZm9nLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzY2FsZTogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGFzaFNpemU6IHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5saW5lZGFzaGVkX3ZlcnQsCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFBlMS5saW5lZGFzaGVkX2ZyYWcKICAgIH0sCiAgICBkZXB0aDogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5kaXNwbGFjZW1lbnRtYXAKICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5kZXB0aF92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEuZGVwdGhfZnJhZwogICAgfSwKICAgIG5vcm1hbDogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5idW1wbWFwLAogICAgICAgICAgICBlZTEubm9ybWFsbWFwLAogICAgICAgICAgICBlZTEuZGlzcGxhY2VtZW50bWFwLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcGFjaXR5OiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIF0pLAogICAgICAgIHZlcnRleFNoYWRlcjogUGUxLm1lc2hub3JtYWxfdmVydCwKICAgICAgICBmcmFnbWVudFNoYWRlcjogUGUxLm1lc2hub3JtYWxfZnJhZwogICAgfSwKICAgIHNwcml0ZTogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5zcHJpdGUsCiAgICAgICAgICAgIGVlMS5mb2cKICAgICAgICBdKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5zcHJpdGVfdmVydCwKICAgICAgICBmcmFnbWVudFNoYWRlcjogUGUxLnNwcml0ZV9mcmFnCiAgICB9LAogICAgYmFja2dyb3VuZDogewogICAgICAgIHVuaWZvcm1zOiB7CiAgICAgICAgICAgIHV2VHJhbnNmb3JtOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHQyRDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFja2dyb3VuZEludGVuc2l0eTogewogICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdmVydGV4U2hhZGVyOiBQZTEuYmFja2dyb3VuZF92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEuYmFja2dyb3VuZF9mcmFnCiAgICB9LAogICAgYmFja2dyb3VuZEN1YmU6IHsKICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICBlbnZNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZsaXBFbnZNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAtMQogICAgICAgICAgICB9LAogICAgICAgICAgICBiYWNrZ3JvdW5kQmx1cnJpbmVzczogewogICAgICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFja2dyb3VuZEludGVuc2l0eTogewogICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFja2dyb3VuZFJvdGF0aW9uOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHZlcnRleFNoYWRlcjogUGUxLmJhY2tncm91bmRDdWJlX3ZlcnQsCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFBlMS5iYWNrZ3JvdW5kQ3ViZV9mcmFnCiAgICB9LAogICAgY3ViZTogewogICAgICAgIHVuaWZvcm1zOiB7CiAgICAgICAgICAgIHRDdWJlOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICB0RmxpcDogewogICAgICAgICAgICAgICAgdmFsdWU6IC0xCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wYWNpdHk6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHZlcnRleFNoYWRlcjogUGUxLmN1YmVfdmVydCwKICAgICAgICBmcmFnbWVudFNoYWRlcjogUGUxLmN1YmVfZnJhZwogICAgfSwKICAgIGVxdWlyZWN0OiB7CiAgICAgICAgdW5pZm9ybXM6IHsKICAgICAgICAgICAgdEVxdWlyZWN0OiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBlMS5lcXVpcmVjdF92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEuZXF1aXJlY3RfZnJhZwogICAgfSwKICAgIGRpc3RhbmNlUkdCQTogewogICAgICAgIHVuaWZvcm1zOiBJdShbCiAgICAgICAgICAgIGVlMS5jb21tb24sCiAgICAgICAgICAgIGVlMS5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlZmVyZW5jZVBvc2l0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ldyB3CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbmVhckRpc3RhbmNlOiB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDEKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmYXJEaXN0YW5jZTogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxZTMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIF0pLAogICAgICAgIHZlcnRleFNoYWRlcjogUGUxLmRpc3RhbmNlUkdCQV92ZXJ0LAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBQZTEuZGlzdGFuY2VSR0JBX2ZyYWcKICAgIH0sCiAgICBzaGFkb3c6IHsKICAgICAgICB1bmlmb3JtczogSXUoWwogICAgICAgICAgICBlZTEubGlnaHRzLAogICAgICAgICAgICBlZTEuZm9nLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb2xvcjogewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgwKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9wYWNpdHk6IHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSksCiAgICAgICAgdmVydGV4U2hhZGVyOiBQZTEuc2hhZG93X3ZlcnQsCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IFBlMS5zaGFkb3dfZnJhZwogICAgfQp9OwpndDEucGh5c2ljYWwgPSB7CiAgICB1bmlmb3JtczogSXUoWwogICAgICAgIGd0MS5zdGFuZGFyZC51bmlmb3JtcywKICAgICAgICB7CiAgICAgICAgICAgIGNsZWFyY29hdDogewogICAgICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xlYXJjb2F0TWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICBjbGVhcmNvYXRNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xlYXJjb2F0Tm9ybWFsTWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICBjbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xlYXJjb2F0Tm9ybWFsU2NhbGU6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgVCgxLCAxKQogICAgICAgICAgICB9LAogICAgICAgICAgICBjbGVhcmNvYXRSb3VnaG5lc3M6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsZWFyY29hdFJvdWdobmVzc01hcDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRpc3BlcnNpb246IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlyaWRlc2NlbmNlOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgICB9LAogICAgICAgICAgICBpcmlkZXNjZW5jZU1hcDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXJpZGVzY2VuY2VJT1I6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAxLjMKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMTAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTogewogICAgICAgICAgICAgICAgdmFsdWU6IDQwMAogICAgICAgICAgICB9LAogICAgICAgICAgICBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2hlZW46IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNoZWVuQ29sb3I6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgwKQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaGVlbkNvbG9yTWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNoZWVuUm91Z2huZXNzOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaGVlblJvdWdobmVzc01hcDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdHJhbnNtaXNzaW9uOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgICB9LAogICAgICAgICAgICB0cmFuc21pc3Npb25NYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBHdAogICAgICAgICAgICB9LAogICAgICAgICAgICB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBUCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRoaWNrbmVzczogewogICAgICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGhpY2tuZXNzTWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICB0aGlja25lc3NNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXR0ZW51YXRpb25EaXN0YW5jZTogewogICAgICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXR0ZW51YXRpb25Db2xvcjogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBQKDApCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNwZWN1bGFyQ29sb3I6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgUCgxLCAxLCAxKQogICAgICAgICAgICB9LAogICAgICAgICAgICBzcGVjdWxhckNvbG9yTWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICBzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IEd0CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNwZWN1bGFySW50ZW5zaXR5OiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBzcGVjdWxhckludGVuc2l0eU1hcDogewogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYW5pc290cm9weVZlY3RvcjogewogICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBUCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFuaXNvdHJvcHlNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm06IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgR3QKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIF0pLAogICAgdmVydGV4U2hhZGVyOiBQZTEubWVzaHBoeXNpY2FsX3ZlcnQsCiAgICBmcmFnbWVudFNoYWRlcjogUGUxLm1lc2hwaHlzaWNhbF9mcmFnCn07CnZhciBhbjEgPSB7CiAgICByOiAwLAogICAgYjogMCwKICAgIGc6IDAKfSwgYnQxID0gbmV3IFh0LCBZYzEgPSBuZXcgRDsKZnVuY3Rpb24gcWMxKGUsIG4sIHQsIGksIGMsIHMsIGgpIHsKICAgIGxldCBkID0gbmV3IFAoMCksIEkgPSBzID09PSAhMCA/IDAgOiAxLCBULCBDLCBSID0gbnVsbCwgUyA9IDAsIHgxID0gbnVsbDsKICAgIGZ1bmN0aW9uIE8oTSkgewogICAgICAgIGxldCBfID0gTS5pc1NjZW5lID09PSAhMCA/IE0uYmFja2dyb3VuZCA6IG51bGw7CiAgICAgICAgcmV0dXJuIF8gJiYgXy5pc1RleHR1cmUgJiYgKF8gPSAoTS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDAgPyB0IDogbikuZ2V0KF8pKSwgXzsKICAgIH0KICAgIGZ1bmN0aW9uIEwoTSkgewogICAgICAgIGxldCBfID0gITEsIEggPSBPKE0pOwogICAgICAgIEggPT09IG51bGwgPyByKGQsIEkpIDogSCAmJiBILmlzQ29sb3IgJiYgKHIoSCwgMSksIF8gPSAhMCk7CiAgICAgICAgbGV0IFAgPSBlLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7CiAgICAgICAgUCA9PT0gImFkZGl0aXZlIiA/IGkuYnVmZmVycy5jb2xvci5zZXRDbGVhcigwLCAwLCAwLCAxLCBoKSA6IFAgPT09ICJhbHBoYS1ibGVuZCIgJiYgaS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsIDAsIDAsIDAsIGgpLCAoZS5hdXRvQ2xlYXIgfHwgXykgJiYgKGkuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSwgaS5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLCBpLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCksIGUuY2xlYXIoZS5hdXRvQ2xlYXJDb2xvciwgZS5hdXRvQ2xlYXJEZXB0aCwgZS5hdXRvQ2xlYXJTdGVuY2lsKSk7CiAgICB9CiAgICBmdW5jdGlvbiBsKE0sIF8pIHsKICAgICAgICBsZXQgSCA9IE8oXyk7CiAgICAgICAgSCAmJiAoSC5pc0N1YmVUZXh0dXJlIHx8IEgubWFwcGluZyA9PT0gWGwpID8gKEMgPT09IHZvaWQgMCAmJiAoQyA9IG5ldyBDdChuZXcgS3MoMSwgMSwgMSksIG5ldyBxaSh7CiAgICAgICAgICAgIG5hbWU6ICJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIiwKICAgICAgICAgICAgdW5pZm9ybXM6IEFuKGd0MS5iYWNrZ3JvdW5kQ3ViZS51bmlmb3JtcyksCiAgICAgICAgICAgIHZlcnRleFNoYWRlcjogZ3QxLmJhY2tncm91bmRDdWJlLnZlcnRleFNoYWRlciwKICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6IGd0MS5iYWNrZ3JvdW5kQ3ViZS5mcmFnbWVudFNoYWRlciwKICAgICAgICAgICAgc2lkZTogQWwsCiAgICAgICAgICAgIGRlcHRoVGVzdDogITEsCiAgICAgICAgICAgIGRlcHRoV3JpdGU6ICExLAogICAgICAgICAgICBmb2c6ICExCiAgICAgICAgfSkpLCBDLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIiksIEMuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJ1diIpLCBDLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24oUCwgeTEsIEIpIHsKICAgICAgICAgICAgdGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oQi5tYXRyaXhXb3JsZCk7CiAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KEMubWF0ZXJpYWwsICJlbnZNYXAiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwgYy51cGRhdGUoQykpLCBidDEuY29weShfLmJhY2tncm91bmRSb3RhdGlvbiksIGJ0MS54ICo9IC0xLCBidDEueSAqPSAtMSwgYnQxLnogKj0gLTEsIEguaXNDdWJlVGV4dHVyZSAmJiBILmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gITEgJiYgKGJ0MS55ICo9IC0xLCBidDEueiAqPSAtMSksIEMubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlID0gSCwgQy5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gSC5pc0N1YmVUZXh0dXJlICYmIEguaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSAhMSA/IC0xIDogMSwgQy5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcy52YWx1ZSA9IF8uYmFja2dyb3VuZEJsdXJyaW5lc3MsIEMubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZSA9IF8uYmFja2dyb3VuZEludGVuc2l0eSwgQy5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoWWMxLm1ha2VSb3RhdGlvbkZyb21FdWxlcihidDEpKSwgQy5tYXRlcmlhbC50b25lTWFwcGVkID0gVHQuZ2V0VHJhbnNmZXIoSC5jb2xvclNwYWNlKSAhPT0gRm4sIChSICE9PSBIIHx8IFMgIT09IEgudmVyc2lvbiB8fCB4MSAhPT0gZS50b25lTWFwcGluZykgJiYgKEMubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSAhMCwgUiA9IEgsIFMgPSBILnZlcnNpb24sIHgxID0gZS50b25lTWFwcGluZyksIEMubGF5ZXJzLmVuYWJsZUFsbCgpLCBNLnVuc2hpZnQoQywgQy5nZW9tZXRyeSwgQy5tYXRlcmlhbCwgMCwgMCwgbnVsbCkpIDogSCAmJiBILmlzVGV4dHVyZSAmJiAoVCA9PT0gdm9pZCAwICYmIChUID0gbmV3IEN0KG5ldyBacigyLCAyKSwgbmV3IHFpKHsKICAgICAgICAgICAgbmFtZTogIkJhY2tncm91bmRNYXRlcmlhbCIsCiAgICAgICAgICAgIHVuaWZvcm1zOiBBbihndDEuYmFja2dyb3VuZC51bmlmb3JtcyksCiAgICAgICAgICAgIHZlcnRleFNoYWRlcjogZ3QxLmJhY2tncm91bmQudmVydGV4U2hhZGVyLAogICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogZ3QxLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsCiAgICAgICAgICAgIHNpZGU6IGRyLAogICAgICAgICAgICBkZXB0aFRlc3Q6ICExLAogICAgICAgICAgICBkZXB0aFdyaXRlOiAhMSwKICAgICAgICAgICAgZm9nOiAhMQogICAgICAgIH0pKSwgVC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoVC5tYXRlcmlhbCwgIm1hcCIsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pLCBjLnVwZGF0ZShUKSksIFQubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlID0gSCwgVC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlID0gXy5iYWNrZ3JvdW5kSW50ZW5zaXR5LCBULm1hdGVyaWFsLnRvbmVNYXBwZWQgPSBUdC5nZXRUcmFuc2ZlcihILmNvbG9yU3BhY2UpICE9PSBGbiwgSC5tYXRyaXhBdXRvVXBkYXRlID09PSAhMCAmJiBILnVwZGF0ZU1hdHJpeCgpLCBULm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoSC5tYXRyaXgpLCAoUiAhPT0gSCB8fCBTICE9PSBILnZlcnNpb24gfHwgeDEgIT09IGUudG9uZU1hcHBpbmcpICYmIChULm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gITAsIFIgPSBILCBTID0gSC52ZXJzaW9uLCB4MSA9IGUudG9uZU1hcHBpbmcpLCBULmxheWVycy5lbmFibGVBbGwoKSwgTS51bnNoaWZ0KFQsIFQuZ2VvbWV0cnksIFQubWF0ZXJpYWwsIDAsIDAsIG51bGwpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHIoTSwgXykgewogICAgICAgIE0uZ2V0UkdCKGFuMSwgUmYoZSkpLCBpLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoYW4xLnIsIGFuMS5nLCBhbjEuYiwgXywgaCk7CiAgICB9CiAgICBmdW5jdGlvbiB3KCkgewogICAgICAgIEMgIT09IHZvaWQgMCAmJiAoQy5nZW9tZXRyeS5kaXNwb3NlKCksIEMubWF0ZXJpYWwuZGlzcG9zZSgpLCBDID0gdm9pZCAwKSwgVCAhPT0gdm9pZCAwICYmIChULmdlb21ldHJ5LmRpc3Bvc2UoKSwgVC5tYXRlcmlhbC5kaXNwb3NlKCksIFQgPSB2b2lkIDApOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDbGVhckNvbG9yOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgfSwKICAgICAgICBzZXRDbGVhckNvbG9yOiBmdW5jdGlvbihNLCBfID0gMSkgewogICAgICAgICAgICBkLnNldChNKSwgSSA9IF8sIHIoZCwgSSk7CiAgICAgICAgfSwKICAgICAgICBnZXRDbGVhckFscGhhOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEk7CiAgICAgICAgfSwKICAgICAgICBzZXRDbGVhckFscGhhOiBmdW5jdGlvbihNKSB7CiAgICAgICAgICAgIEkgPSBNLCByKGQsIEkpOwogICAgICAgIH0sCiAgICAgICAgcmVuZGVyOiBMLAogICAgICAgIGFkZFRvUmVuZGVyTGlzdDogbCwKICAgICAgICBkaXNwb3NlOiB3CiAgICB9Owp9CmZ1bmN0aW9uIEtjMShlLCBuKSB7CiAgICBsZXQgdCA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX1ZFUlRFWF9BVFRSSUJTKSwgaSA9IHt9LCBjID0gUyhudWxsKSwgcyA9IGMsIGggPSAhMTsKICAgIGZ1bmN0aW9uIGQoZiwgQSwgcSwgViwgWSkgewogICAgICAgIGxldCBRID0gITEsIHogPSBSKFYsIHEsIEEpOwogICAgICAgIHMgIT09IHogJiYgKHMgPSB6LCBUKHMub2JqZWN0KSksIFEgPSB4MShmLCBWLCBxLCBZKSwgUSAmJiBPKGYsIFYsIHEsIFkpLCBZICE9PSBudWxsICYmIG4udXBkYXRlKFksIGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIpLCAoUSB8fCBoKSAmJiAoaCA9ICExLCBfKGYsIEEsIHEsIFYpLCBZICE9PSBudWxsICYmIGUuYmluZEJ1ZmZlcihlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuLmdldChZKS5idWZmZXIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIEkoKSB7CiAgICAgICAgcmV0dXJuIGUuY3JlYXRlVmVydGV4QXJyYXkoKTsKICAgIH0KICAgIGZ1bmN0aW9uIFQoZikgewogICAgICAgIHJldHVybiBlLmJpbmRWZXJ0ZXhBcnJheShmKTsKICAgIH0KICAgIGZ1bmN0aW9uIEMoZikgewogICAgICAgIHJldHVybiBlLmRlbGV0ZVZlcnRleEFycmF5KGYpOwogICAgfQogICAgZnVuY3Rpb24gUihmLCBBLCBxKSB7CiAgICAgICAgbGV0IFYgPSBxLndpcmVmcmFtZSA9PT0gITAsIFkgPSBpW2YuaWRdOwogICAgICAgIFkgPT09IHZvaWQgMCAmJiAoWSA9IHt9LCBpW2YuaWRdID0gWSk7CiAgICAgICAgbGV0IFEgPSBZW0EuaWRdOwogICAgICAgIFEgPT09IHZvaWQgMCAmJiAoUSA9IHt9LCBZW0EuaWRdID0gUSk7CiAgICAgICAgbGV0IHogPSBRW1ZdOwogICAgICAgIHJldHVybiB6ID09PSB2b2lkIDAgJiYgKHogPSBTKEkoKSksIFFbVl0gPSB6KSwgejsKICAgIH0KICAgIGZ1bmN0aW9uIFMoZikgewogICAgICAgIGxldCBBID0gW10sIHEgPSBbXSwgViA9IFtdOwogICAgICAgIGZvcihsZXQgWSA9IDA7IFkgPCB0OyBZKyspQVtZXSA9IDAsIHFbWV0gPSAwLCBWW1ldID0gMDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBnZW9tZXRyeTogbnVsbCwKICAgICAgICAgICAgcHJvZ3JhbTogbnVsbCwKICAgICAgICAgICAgd2lyZWZyYW1lOiAhMSwKICAgICAgICAgICAgbmV3QXR0cmlidXRlczogQSwKICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZXM6IHEsCiAgICAgICAgICAgIGF0dHJpYnV0ZURpdmlzb3JzOiBWLAogICAgICAgICAgICBvYmplY3Q6IGYsCiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LAogICAgICAgICAgICBpbmRleDogbnVsbAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB4MShmLCBBLCBxLCBWKSB7CiAgICAgICAgbGV0IFkgPSBzLmF0dHJpYnV0ZXMsIFEgPSBBLmF0dHJpYnV0ZXMsIHogPSAwLCBqID0gcS5nZXRBdHRyaWJ1dGVzKCk7CiAgICAgICAgZm9yKGxldCBGIGluIGopaWYgKGpbRl0ubG9jYXRpb24gPj0gMCkgewogICAgICAgICAgICBsZXQgTWUgPSBZW0ZdLCBMZSA9IFFbRl07CiAgICAgICAgICAgIGlmIChMZSA9PT0gdm9pZCAwICYmIChGID09PSAiaW5zdGFuY2VNYXRyaXgiICYmIGYuaW5zdGFuY2VNYXRyaXggJiYgKExlID0gZi5pbnN0YW5jZU1hdHJpeCksIEYgPT09ICJpbnN0YW5jZUNvbG9yIiAmJiBmLmluc3RhbmNlQ29sb3IgJiYgKExlID0gZi5pbnN0YW5jZUNvbG9yKSksIE1lID09PSB2b2lkIDAgfHwgTWUuYXR0cmlidXRlICE9PSBMZSB8fCBMZSAmJiBNZS5kYXRhICE9PSBMZS5kYXRhKSByZXR1cm4gITA7CiAgICAgICAgICAgIHorKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHMuYXR0cmlidXRlc051bSAhPT0geiB8fCBzLmluZGV4ICE9PSBWOwogICAgfQogICAgZnVuY3Rpb24gTyhmLCBBLCBxLCBWKSB7CiAgICAgICAgbGV0IFkgPSB7fSwgUSA9IEEuYXR0cmlidXRlcywgeiA9IDAsIGogPSBxLmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICBmb3IobGV0IEYgaW4gailpZiAoaltGXS5sb2NhdGlvbiA+PSAwKSB7CiAgICAgICAgICAgIGxldCBNZSA9IFFbRl07CiAgICAgICAgICAgIE1lID09PSB2b2lkIDAgJiYgKEYgPT09ICJpbnN0YW5jZU1hdHJpeCIgJiYgZi5pbnN0YW5jZU1hdHJpeCAmJiAoTWUgPSBmLmluc3RhbmNlTWF0cml4KSwgRiA9PT0gImluc3RhbmNlQ29sb3IiICYmIGYuaW5zdGFuY2VDb2xvciAmJiAoTWUgPSBmLmluc3RhbmNlQ29sb3IpKTsKICAgICAgICAgICAgbGV0IExlID0ge307CiAgICAgICAgICAgIExlLmF0dHJpYnV0ZSA9IE1lLCBNZSAmJiBNZS5kYXRhICYmIChMZS5kYXRhID0gTWUuZGF0YSksIFlbRl0gPSBMZSwgeisrOwogICAgICAgIH0KICAgICAgICBzLmF0dHJpYnV0ZXMgPSBZLCBzLmF0dHJpYnV0ZXNOdW0gPSB6LCBzLmluZGV4ID0gVjsKICAgIH0KICAgIGZ1bmN0aW9uIEwoKSB7CiAgICAgICAgbGV0IGYgPSBzLm5ld0F0dHJpYnV0ZXM7CiAgICAgICAgZm9yKGxldCBBID0gMCwgcSA9IGYubGVuZ3RoOyBBIDwgcTsgQSsrKWZbQV0gPSAwOwogICAgfQogICAgZnVuY3Rpb24gbChmKSB7CiAgICAgICAgcihmLCAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIHIoZiwgQSkgewogICAgICAgIGxldCBxID0gcy5uZXdBdHRyaWJ1dGVzLCBWID0gcy5lbmFibGVkQXR0cmlidXRlcywgWSA9IHMuYXR0cmlidXRlRGl2aXNvcnM7CiAgICAgICAgcVtmXSA9IDEsIFZbZl0gPT09IDAgJiYgKGUuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZiksIFZbZl0gPSAxKSwgWVtmXSAhPT0gQSAmJiAoZS52ZXJ0ZXhBdHRyaWJEaXZpc29yKGYsIEEpLCBZW2ZdID0gQSk7CiAgICB9CiAgICBmdW5jdGlvbiB3KCkgewogICAgICAgIGxldCBmID0gcy5uZXdBdHRyaWJ1dGVzLCBBID0gcy5lbmFibGVkQXR0cmlidXRlczsKICAgICAgICBmb3IobGV0IHEgPSAwLCBWID0gQS5sZW5ndGg7IHEgPCBWOyBxKyspQVtxXSAhPT0gZltxXSAmJiAoZS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocSksIEFbcV0gPSAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIE0oZiwgQSwgcSwgViwgWSwgUSwgeikgewogICAgICAgIHogPT09ICEwID8gZS52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihmLCBBLCBxLCBZLCBRKSA6IGUudmVydGV4QXR0cmliUG9pbnRlcihmLCBBLCBxLCBWLCBZLCBRKTsKICAgIH0KICAgIGZ1bmN0aW9uIF8oZiwgQSwgcSwgVikgewogICAgICAgIEwoKTsKICAgICAgICBsZXQgWSA9IFYuYXR0cmlidXRlcywgUSA9IHEuZ2V0QXR0cmlidXRlcygpLCB6ID0gQS5kZWZhdWx0QXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvcihsZXQgaiBpbiBRKXsKICAgICAgICAgICAgbGV0IEYgPSBRW2pdOwogICAgICAgICAgICBpZiAoRi5sb2NhdGlvbiA+PSAwKSB7CiAgICAgICAgICAgICAgICBsZXQgbWUgPSBZW2pdOwogICAgICAgICAgICAgICAgaWYgKG1lID09PSB2b2lkIDAgJiYgKGogPT09ICJpbnN0YW5jZU1hdHJpeCIgJiYgZi5pbnN0YW5jZU1hdHJpeCAmJiAobWUgPSBmLmluc3RhbmNlTWF0cml4KSwgaiA9PT0gImluc3RhbmNlQ29sb3IiICYmIGYuaW5zdGFuY2VDb2xvciAmJiAobWUgPSBmLmluc3RhbmNlQ29sb3IpKSwgbWUgIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgICAgIGxldCBNZSA9IG1lLm5vcm1hbGl6ZWQsIExlID0gbWUuaXRlbVNpemUsIEdlID0gbi5nZXQobWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChHZSA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBsZXQgWmUgPSBHZS5idWZmZXIsIGsgPSBHZS50eXBlLCBKID0gR2UuYnl0ZXNQZXJFbGVtZW50LCB1ZSA9IGsgPT09IGUuSU5UIHx8IGsgPT09IGUuVU5TSUdORURfSU5UIHx8IG1lLmdwdVR5cGUgPT09IEtsOwogICAgICAgICAgICAgICAgICAgIGlmIChtZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZSA9IG1lLmRhdGEsIEVlID0gaWUuc3RyaWRlLCBCZSA9IG1lLm9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGllLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgVGUgPSAwOyBUZSA8IEYubG9jYXRpb25TaXplOyBUZSsrKXIoRi5sb2NhdGlvbiArIFRlLCBpZS5tZXNoUGVyQXR0cmlidXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXNJbnN0YW5jZWRNZXNoICE9PSAhMCAmJiBWLl9tYXhJbnN0YW5jZUNvdW50ID09PSB2b2lkIDAgJiYgKFYuX21heEluc3RhbmNlQ291bnQgPSBpZS5tZXNoUGVyQXR0cmlidXRlICogaWUuY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZm9yKGxldCBUZSA9IDA7IFRlIDwgRi5sb2NhdGlvblNpemU7IFRlKyspbChGLmxvY2F0aW9uICsgVGUpOwogICAgICAgICAgICAgICAgICAgICAgICBlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsIFplKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBUZSA9IDA7IFRlIDwgRi5sb2NhdGlvblNpemU7IFRlKyspTShGLmxvY2F0aW9uICsgVGUsIExlIC8gRi5sb2NhdGlvblNpemUsIGssIE1lLCBFZSAqIEosIChCZSArIExlIC8gRi5sb2NhdGlvblNpemUgKiBUZSkgKiBKLCB1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGllID0gMDsgaWUgPCBGLmxvY2F0aW9uU2l6ZTsgaWUrKylyKEYubG9jYXRpb24gKyBpZSwgbWUubWVzaFBlckF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmlzSW5zdGFuY2VkTWVzaCAhPT0gITAgJiYgVi5fbWF4SW5zdGFuY2VDb3VudCA9PT0gdm9pZCAwICYmIChWLl9tYXhJbnN0YW5jZUNvdW50ID0gbWUubWVzaFBlckF0dHJpYnV0ZSAqIG1lLmNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGZvcihsZXQgaWUgPSAwOyBpZSA8IEYubG9jYXRpb25TaXplOyBpZSsrKWwoRi5sb2NhdGlvbiArIGllKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLCBaZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaWUgPSAwOyBpZSA8IEYubG9jYXRpb25TaXplOyBpZSsrKU0oRi5sb2NhdGlvbiArIGllLCBMZSAvIEYubG9jYXRpb25TaXplLCBrLCBNZSwgTGUgKiBKLCBMZSAvIEYubG9jYXRpb25TaXplICogaWUgKiBKLCB1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh6ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgICBsZXQgTWUgPSB6W2pdOwogICAgICAgICAgICAgICAgICAgIGlmIChNZSAhPT0gdm9pZCAwKSBzd2l0Y2goTWUubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS52ZXJ0ZXhBdHRyaWIyZnYoRi5sb2NhdGlvbiwgTWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudmVydGV4QXR0cmliM2Z2KEYubG9jYXRpb24sIE1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnZlcnRleEF0dHJpYjRmdihGLmxvY2F0aW9uLCBNZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudmVydGV4QXR0cmliMWZ2KEYubG9jYXRpb24sIE1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdygpOwogICAgfQogICAgZnVuY3Rpb24gSCgpIHsKICAgICAgICBCKCk7CiAgICAgICAgZm9yKGxldCBmIGluIGkpewogICAgICAgICAgICBsZXQgQSA9IGlbZl07CiAgICAgICAgICAgIGZvcihsZXQgcSBpbiBBKXsKICAgICAgICAgICAgICAgIGxldCBWID0gQVtxXTsKICAgICAgICAgICAgICAgIGZvcihsZXQgWSBpbiBWKUMoVltZXS5vYmplY3QpLCBkZWxldGUgVltZXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBBW3FdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlbGV0ZSBpW2ZdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIFAoZikgewogICAgICAgIGlmIChpW2YuaWRdID09PSB2b2lkIDApIHJldHVybjsKICAgICAgICBsZXQgQSA9IGlbZi5pZF07CiAgICAgICAgZm9yKGxldCBxIGluIEEpewogICAgICAgICAgICBsZXQgViA9IEFbcV07CiAgICAgICAgICAgIGZvcihsZXQgWSBpbiBWKUMoVltZXS5vYmplY3QpLCBkZWxldGUgVltZXTsKICAgICAgICAgICAgZGVsZXRlIEFbcV07CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBpW2YuaWRdOwogICAgfQogICAgZnVuY3Rpb24geTEoZikgewogICAgICAgIGZvcihsZXQgQSBpbiBpKXsKICAgICAgICAgICAgbGV0IHEgPSBpW0FdOwogICAgICAgICAgICBpZiAocVtmLmlkXSA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgICAgICAgbGV0IFYgPSBxW2YuaWRdOwogICAgICAgICAgICBmb3IobGV0IFkgaW4gVilDKFZbWV0ub2JqZWN0KSwgZGVsZXRlIFZbWV07CiAgICAgICAgICAgIGRlbGV0ZSBxW2YuaWRdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIEIoKSB7CiAgICAgICAgcCgpLCBoID0gITAsIHMgIT09IGMgJiYgKHMgPSBjLCBUKHMub2JqZWN0KSk7CiAgICB9CiAgICBmdW5jdGlvbiBwKCkgewogICAgICAgIGMuZ2VvbWV0cnkgPSBudWxsLCBjLnByb2dyYW0gPSBudWxsLCBjLndpcmVmcmFtZSA9ICExOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzZXR1cDogZCwKICAgICAgICByZXNldDogQiwKICAgICAgICByZXNldERlZmF1bHRTdGF0ZTogcCwKICAgICAgICBkaXNwb3NlOiBILAogICAgICAgIHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OiBQLAogICAgICAgIHJlbGVhc2VTdGF0ZXNPZlByb2dyYW06IHkxLAogICAgICAgIGluaXRBdHRyaWJ1dGVzOiBMLAogICAgICAgIGVuYWJsZUF0dHJpYnV0ZTogbCwKICAgICAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlczogdwogICAgfTsKfQpmdW5jdGlvbiAkYzEoZSwgbiwgdCkgewogICAgbGV0IGk7CiAgICBmdW5jdGlvbiBjKFQpIHsKICAgICAgICBpID0gVDsKICAgIH0KICAgIGZ1bmN0aW9uIHMoVCwgQykgewogICAgICAgIGUuZHJhd0FycmF5cyhpLCBULCBDKSwgdC51cGRhdGUoQywgaSwgMSk7CiAgICB9CiAgICBmdW5jdGlvbiBoKFQsIEMsIFIpIHsKICAgICAgICBSICE9PSAwICYmIChlLmRyYXdBcnJheXNJbnN0YW5jZWQoaSwgVCwgQywgUiksIHQudXBkYXRlKEMsIGksIFIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGQoVCwgQywgUikgewogICAgICAgIGlmIChSID09PSAwKSByZXR1cm47CiAgICAgICAgbi5nZXQoIldFQkdMX211bHRpX2RyYXciKS5tdWx0aURyYXdBcnJheXNXRUJHTChpLCBULCAwLCBDLCAwLCBSKTsKICAgICAgICBsZXQgeDEgPSAwOwogICAgICAgIGZvcihsZXQgTyA9IDA7IE8gPCBSOyBPKyspeDEgKz0gQ1tPXTsKICAgICAgICB0LnVwZGF0ZSh4MSwgaSwgMSk7CiAgICB9CiAgICBmdW5jdGlvbiBJKFQsIEMsIFIsIFMpIHsKICAgICAgICBpZiAoUiA9PT0gMCkgcmV0dXJuOwogICAgICAgIGxldCB4MSA9IG4uZ2V0KCJXRUJHTF9tdWx0aV9kcmF3Iik7CiAgICAgICAgaWYgKHgxID09PSBudWxsKSBmb3IobGV0IE8gPSAwOyBPIDwgVC5sZW5ndGg7IE8rKyloKFRbT10sIENbT10sIFNbT10pOwogICAgICAgIGVsc2UgewogICAgICAgICAgICB4MS5tdWx0aURyYXdBcnJheXNJbnN0YW5jZWRXRUJHTChpLCBULCAwLCBDLCAwLCBTLCAwLCBSKTsKICAgICAgICAgICAgbGV0IE8gPSAwOwogICAgICAgICAgICBmb3IobGV0IEwgPSAwOyBMIDwgUjsgTCsrKU8gKz0gQ1tMXSAqIFNbTF07CiAgICAgICAgICAgIHQudXBkYXRlKE8sIGksIDEpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMuc2V0TW9kZSA9IGMsIHRoaXMucmVuZGVyID0gcywgdGhpcy5yZW5kZXJJbnN0YW5jZXMgPSBoLCB0aGlzLnJlbmRlck11bHRpRHJhdyA9IGQsIHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzID0gSTsKfQpmdW5jdGlvbiBaYzEoZSwgbiwgdCwgaSkgewogICAgbGV0IGM7CiAgICBmdW5jdGlvbiBzKCkgewogICAgICAgIGlmIChjICE9PSB2b2lkIDApIHJldHVybiBjOwogICAgICAgIGlmIChuLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikgPT09ICEwKSB7CiAgICAgICAgICAgIGxldCB5MSA9IG4uZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTsKICAgICAgICAgICAgYyA9IGUuZ2V0UGFyYW1ldGVyKHkxLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk7CiAgICAgICAgfSBlbHNlIGMgPSAwOwogICAgICAgIHJldHVybiBjOwogICAgfQogICAgZnVuY3Rpb24gaCh5MSkgewogICAgICAgIHJldHVybiAhKHkxICE9PSBMaSAmJiBpLmNvbnZlcnQoeTEpICE9PSBlLmdldFBhcmFtZXRlcihlLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkKHkxKSB7CiAgICAgICAgbGV0IEIgPSB5MSA9PT0gdGMgJiYgKG4uaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSB8fCBuLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKTsKICAgICAgICByZXR1cm4gISh5MSAhPT0gU2wgJiYgaS5jb252ZXJ0KHkxKSAhPT0gZS5nZXRQYXJhbWV0ZXIoZS5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUpICYmIHkxICE9PSBwaSAmJiAhQik7CiAgICB9CiAgICBmdW5jdGlvbiBJKHkxKSB7CiAgICAgICAgaWYgKHkxID09PSAiaGlnaHAiKSB7CiAgICAgICAgICAgIGlmIChlLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChlLlZFUlRFWF9TSEFERVIsIGUuSElHSF9GTE9BVCkucHJlY2lzaW9uID4gMCAmJiBlLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChlLkZSQUdNRU5UX1NIQURFUiwgZS5ISUdIX0ZMT0FUKS5wcmVjaXNpb24gPiAwKSByZXR1cm4gImhpZ2hwIjsKICAgICAgICAgICAgeTEgPSAibWVkaXVtcCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB5MSA9PT0gIm1lZGl1bXAiICYmIGUuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KGUuVkVSVEVYX1NIQURFUiwgZS5NRURJVU1fRkxPQVQpLnByZWNpc2lvbiA+IDAgJiYgZS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoZS5GUkFHTUVOVF9TSEFERVIsIGUuTUVESVVNX0ZMT0FUKS5wcmVjaXNpb24gPiAwID8gIm1lZGl1bXAiIDogImxvd3AiOwogICAgfQogICAgbGV0IFQgPSB0LnByZWNpc2lvbiAhPT0gdm9pZCAwID8gdC5wcmVjaXNpb24gOiAiaGlnaHAiLCBDID0gSShUKTsKICAgIEMgIT09IFQgJiYgKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLCBULCAibm90IHN1cHBvcnRlZCwgdXNpbmciLCBDLCAiaW5zdGVhZC4iKSwgVCA9IEMpOwogICAgbGV0IFIgPSB0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09ICEwLCBTID0gdC5yZXZlcnNlRGVwdGhCdWZmZXIgPT09ICEwICYmIG4uaGFzKCJFWFRfY2xpcF9jb250cm9sIiksIHgxID0gZS5nZXRQYXJhbWV0ZXIoZS5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyksIE8gPSBlLmdldFBhcmFtZXRlcihlLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyksIEwgPSBlLmdldFBhcmFtZXRlcihlLk1BWF9URVhUVVJFX1NJWkUpLCBsID0gZS5nZXRQYXJhbWV0ZXIoZS5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFKSwgciA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX1ZFUlRFWF9BVFRSSUJTKSwgdyA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMpLCBNID0gZS5nZXRQYXJhbWV0ZXIoZS5NQVhfVkFSWUlOR19WRUNUT1JTKSwgXyA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyksIEggPSBPID4gMCwgUCA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX1NBTVBMRVMpOwogICAgcmV0dXJuIHsKICAgICAgICBpc1dlYkdMMjogITAsCiAgICAgICAgZ2V0TWF4QW5pc290cm9weTogcywKICAgICAgICBnZXRNYXhQcmVjaXNpb246IEksCiAgICAgICAgdGV4dHVyZUZvcm1hdFJlYWRhYmxlOiBoLAogICAgICAgIHRleHR1cmVUeXBlUmVhZGFibGU6IGQsCiAgICAgICAgcHJlY2lzaW9uOiBULAogICAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IFIsCiAgICAgICAgcmV2ZXJzZURlcHRoQnVmZmVyOiBTLAogICAgICAgIG1heFRleHR1cmVzOiB4MSwKICAgICAgICBtYXhWZXJ0ZXhUZXh0dXJlczogTywKICAgICAgICBtYXhUZXh0dXJlU2l6ZTogTCwKICAgICAgICBtYXhDdWJlbWFwU2l6ZTogbCwKICAgICAgICBtYXhBdHRyaWJ1dGVzOiByLAogICAgICAgIG1heFZlcnRleFVuaWZvcm1zOiB3LAogICAgICAgIG1heFZhcnlpbmdzOiBNLAogICAgICAgIG1heEZyYWdtZW50VW5pZm9ybXM6IF8sCiAgICAgICAgdmVydGV4VGV4dHVyZXM6IEgsCiAgICAgICAgbWF4U2FtcGxlczogUAogICAgfTsKfQpmdW5jdGlvbiBRYzEoZSkgewogICAgbGV0IG4gPSB0aGlzLCB0ID0gbnVsbCwgaSA9IDAsIGMgPSAhMSwgcyA9ICExLCBoID0gbmV3IHhlLCBkID0gbmV3IEd0LCBJID0gewogICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgIG5lZWRzVXBkYXRlOiAhMQogICAgfTsKICAgIHRoaXMudW5pZm9ybSA9IEksIHRoaXMubnVtUGxhbmVzID0gMCwgdGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwLCB0aGlzLmluaXQgPSBmdW5jdGlvbihSLCBTKSB7CiAgICAgICAgbGV0IHgxID0gUi5sZW5ndGggIT09IDAgfHwgUyB8fCBpICE9PSAwIHx8IGM7CiAgICAgICAgcmV0dXJuIGMgPSBTLCBpID0gUi5sZW5ndGgsIHgxOwogICAgfSwgdGhpcy5iZWdpblNoYWRvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICBzID0gITAsIEMobnVsbCk7CiAgICB9LCB0aGlzLmVuZFNoYWRvd3MgPSBmdW5jdGlvbigpIHsKICAgICAgICBzID0gITE7CiAgICB9LCB0aGlzLnNldEdsb2JhbFN0YXRlID0gZnVuY3Rpb24oUiwgUykgewogICAgICAgIHQgPSBDKFIsIFMsIDApOwogICAgfSwgdGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uKFIsIFMsIHgxKSB7CiAgICAgICAgbGV0IE8gPSBSLmNsaXBwaW5nUGxhbmVzLCBMID0gUi5jbGlwSW50ZXJzZWN0aW9uLCBsID0gUi5jbGlwU2hhZG93cywgciA9IGUuZ2V0KFIpOwogICAgICAgIGlmICghYyB8fCBPID09PSBudWxsIHx8IE8ubGVuZ3RoID09PSAwIHx8IHMgJiYgIWwpIHMgPyBDKG51bGwpIDogVCgpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgdyA9IHMgPyAwIDogaSwgTSA9IHcgKiA0LCBfID0gci5jbGlwcGluZ1N0YXRlIHx8IG51bGw7CiAgICAgICAgICAgIEkudmFsdWUgPSBfLCBfID0gQyhPLCBTLCBNLCB4MSk7CiAgICAgICAgICAgIGZvcihsZXQgSCA9IDA7IEggIT09IE07ICsrSClfW0hdID0gdFtIXTsKICAgICAgICAgICAgci5jbGlwcGluZ1N0YXRlID0gXywgdGhpcy5udW1JbnRlcnNlY3Rpb24gPSBMID8gdGhpcy5udW1QbGFuZXMgOiAwLCB0aGlzLm51bVBsYW5lcyArPSB3OwogICAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBUKCkgewogICAgICAgIEkudmFsdWUgIT09IHQgJiYgKEkudmFsdWUgPSB0LCBJLm5lZWRzVXBkYXRlID0gaSA+IDApLCBuLm51bVBsYW5lcyA9IGksIG4ubnVtSW50ZXJzZWN0aW9uID0gMDsKICAgIH0KICAgIGZ1bmN0aW9uIEMoUiwgUywgeDEsIE8pIHsKICAgICAgICBsZXQgTCA9IFIgIT09IG51bGwgPyBSLmxlbmd0aCA6IDAsIGwgPSBudWxsOwogICAgICAgIGlmIChMICE9PSAwKSB7CiAgICAgICAgICAgIGlmIChsID0gSS52YWx1ZSwgTyAhPT0gITAgfHwgbCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGV0IHIgPSB4MSArIEwgKiA0LCB3ID0gUy5tYXRyaXhXb3JsZEludmVyc2U7CiAgICAgICAgICAgICAgICBkLmdldE5vcm1hbE1hdHJpeCh3KSwgKGwgPT09IG51bGwgfHwgbC5sZW5ndGggPCByKSAmJiAobCA9IG5ldyBGbG9hdDMyQXJyYXkocikpOwogICAgICAgICAgICAgICAgZm9yKGxldCBNID0gMCwgXyA9IHgxOyBNICE9PSBMOyArK00sIF8gKz0gNCloLmNvcHkoUltNXSkuYXBwbHlNYXRyaXg0KHcsIGQpLCBoLm5vcm1hbC50b0FycmF5KGwsIF8pLCBsW18gKyAzXSA9IGguY29uc3RhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgSS52YWx1ZSA9IGwsIEkubmVlZHNVcGRhdGUgPSAhMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4ubnVtUGxhbmVzID0gTCwgbi5udW1JbnRlcnNlY3Rpb24gPSAwLCBsOwogICAgfQp9CmZ1bmN0aW9uIEpjMShlKSB7CiAgICBsZXQgbiA9IG5ldyBXZWFrTWFwOwogICAgZnVuY3Rpb24gdChoLCBkKSB7CiAgICAgICAgcmV0dXJuIGQgPT09IHFsID8gaC5tYXBwaW5nID0gVW8gOiBkID09PSBHbCAmJiAoaC5tYXBwaW5nID0gSGwpLCBoOwogICAgfQogICAgZnVuY3Rpb24gaShoKSB7CiAgICAgICAgaWYgKGggJiYgaC5pc1RleHR1cmUpIHsKICAgICAgICAgICAgbGV0IGQgPSBoLm1hcHBpbmc7CiAgICAgICAgICAgIGlmIChkID09PSBxbCB8fCBkID09PSBHbCkgaWYgKG4uaGFzKGgpKSB7CiAgICAgICAgICAgICAgICBsZXQgSSA9IG4uZ2V0KGgpLnRleHR1cmU7CiAgICAgICAgICAgICAgICByZXR1cm4gdChJLCBoLm1hcHBpbmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbGV0IEkgPSBoLmltYWdlOwogICAgICAgICAgICAgICAgaWYgKEkgJiYgSS5oZWlnaHQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBuZXcgTmEoSS5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBULmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKGUsIGgpLCBuLnNldChoLCBUKSwgaC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgYyksIHQoVC50ZXh0dXJlLCBoLm1hcHBpbmcpOwogICAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBoOwogICAgfQogICAgZnVuY3Rpb24gYyhoKSB7CiAgICAgICAgbGV0IGQgPSBoLnRhcmdldDsKICAgICAgICBkLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBjKTsKICAgICAgICBsZXQgSSA9IG4uZ2V0KGQpOwogICAgICAgIEkgIT09IHZvaWQgMCAmJiAobi5kZWxldGUoZCksIEkuZGlzcG9zZSgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgbiA9IG5ldyBXZWFrTWFwOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IGksCiAgICAgICAgZGlzcG9zZTogcwogICAgfTsKfQp2YXIgSHQxID0gNCwgR2kxID0gWwogICAgLjEyNSwKICAgIC4yMTUsCiAgICAuMzUsCiAgICAuNDQ2LAogICAgLjUyNiwKICAgIC41ODIKXSwgVXQxID0gMjAsIFBuMSA9IG5ldyB3biwgSGkxID0gbmV3IFAsIExuMSA9IG51bGwsIFVuMSA9IDAsIERuMSA9IDAsIHduMSA9ICExLCBMdDEgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyLCBPdCA9IDEgLyBMdDEsIFZpMSA9IFsKICAgIG5ldyB3KC1MdDEsIE90LCAwKSwKICAgIG5ldyB3KEx0MSwgT3QsIDApLAogICAgbmV3IHcoLU90LCAwLCBMdDEpLAogICAgbmV3IHcoT3QsIDAsIEx0MSksCiAgICBuZXcgdygwLCBMdDEsIC1PdCksCiAgICBuZXcgdygwLCBMdDEsIE90KSwKICAgIG5ldyB3KC0xLCAxLCAtMSksCiAgICBuZXcgdygxLCAxLCAtMSksCiAgICBuZXcgdygtMSwgMSwgMSksCiAgICBuZXcgdygxLCAxLCAxKQpdLCBobjEgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3RvcihuKXsKICAgICAgICB0aGlzLl9yZW5kZXJlciA9IG4sIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbCwgdGhpcy5fbG9kTWF4ID0gMCwgdGhpcy5fY3ViZVNpemUgPSAwLCB0aGlzLl9sb2RQbGFuZXMgPSBbXSwgdGhpcy5fc2l6ZUxvZHMgPSBbXSwgdGhpcy5fc2lnbWFzID0gW10sIHRoaXMuX2JsdXJNYXRlcmlhbCA9IG51bGwsIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9IG51bGwsIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBudWxsLCB0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fYmx1ck1hdGVyaWFsKTsKICAgIH0KICAgIGZyb21TY2VuZShuLCB0ID0gMCwgaSA9IC4xLCBjID0gMTAwKSB7CiAgICAgICAgTG4xID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCksIFVuMSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksIERuMSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCksIHduMSA9IHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQsIHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSAhMSwgdGhpcy5fc2V0U2l6ZSgyNTYpOwogICAgICAgIGxldCBzID0gdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7CiAgICAgICAgcmV0dXJuIHMuZGVwdGhCdWZmZXIgPSAhMCwgdGhpcy5fc2NlbmVUb0N1YmVVVihuLCBpLCBjLCBzKSwgdCA+IDAgJiYgdGhpcy5fYmx1cihzLCAwLCAwLCB0KSwgdGhpcy5fYXBwbHlQTVJFTShzKSwgdGhpcy5fY2xlYW51cChzKSwgczsKICAgIH0KICAgIGZyb21FcXVpcmVjdGFuZ3VsYXIobiwgdCA9IG51bGwpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUobiwgdCk7CiAgICB9CiAgICBmcm9tQ3ViZW1hcChuLCB0ID0gbnVsbCkgewogICAgICAgIHJldHVybiB0aGlzLl9mcm9tVGV4dHVyZShuLCB0KTsKICAgIH0KICAgIGNvbXBpbGVDdWJlbWFwU2hhZGVyKCkgewogICAgICAgIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9PT0gbnVsbCAmJiAodGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gV2kxKCksIHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwpKTsKICAgIH0KICAgIGNvbXBpbGVFcXVpcmVjdGFuZ3VsYXJTaGFkZXIoKSB7CiAgICAgICAgdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCAmJiAodGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IHppMSgpLCB0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fZXF1aXJlY3RNYXRlcmlhbCkpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLl9kaXNwb3NlKCksIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCAhPT0gbnVsbCAmJiB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwuZGlzcG9zZSgpLCB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsICE9PSBudWxsICYmIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogICAgX3NldFNpemUobikgewogICAgICAgIHRoaXMuX2xvZE1heCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKG4pKSwgdGhpcy5fY3ViZVNpemUgPSBNYXRoLnBvdygyLCB0aGlzLl9sb2RNYXgpOwogICAgfQogICAgX2Rpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5fYmx1ck1hdGVyaWFsICE9PSBudWxsICYmIHRoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCksIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ICE9PSBudWxsICYmIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTsKICAgICAgICBmb3IobGV0IG4gPSAwOyBuIDwgdGhpcy5fbG9kUGxhbmVzLmxlbmd0aDsgbisrKXRoaXMuX2xvZFBsYW5lc1tuXS5kaXNwb3NlKCk7CiAgICB9CiAgICBfY2xlYW51cChuKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KExuMSwgVW4xLCBEbjEpLCB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gd24xLCBuLnNjaXNzb3JUZXN0ID0gITEsIG9uMShuLCAwLCAwLCBuLndpZHRoLCBuLmhlaWdodCk7CiAgICB9CiAgICBfZnJvbVRleHR1cmUobiwgdCkgewogICAgICAgIG4ubWFwcGluZyA9PT0gVW8gfHwgbi5tYXBwaW5nID09PSBIbCA/IHRoaXMuX3NldFNpemUobi5pbWFnZS5sZW5ndGggPT09IDAgPyAxNiA6IG4uaW1hZ2VbMF0ud2lkdGggfHwgbi5pbWFnZVswXS5pbWFnZS53aWR0aCkgOiB0aGlzLl9zZXRTaXplKG4uaW1hZ2Uud2lkdGggLyA0KSwgTG4xID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCksIFVuMSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksIERuMSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCksIHduMSA9IHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQsIHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSAhMTsKICAgICAgICBsZXQgaSA9IHQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVihuLCBpKSwgdGhpcy5fYXBwbHlQTVJFTShpKSwgdGhpcy5fY2xlYW51cChpKSwgaTsKICAgIH0KICAgIF9hbGxvY2F0ZVRhcmdldHMoKSB7CiAgICAgICAgbGV0IG4gPSAzICogTWF0aC5tYXgodGhpcy5fY3ViZVNpemUsIDExMiksIHQgPSA0ICogdGhpcy5fY3ViZVNpemUsIGkgPSB7CiAgICAgICAgICAgIG1hZ0ZpbHRlcjogRXQsCiAgICAgICAgICAgIG1pbkZpbHRlcjogRXQsCiAgICAgICAgICAgIGdlbmVyYXRlTWlwbWFwczogITEsCiAgICAgICAgICAgIHR5cGU6IHRjLAogICAgICAgICAgICBmb3JtYXQ6IExpLAogICAgICAgICAgICBjb2xvclNwYWNlOiBoYSwKICAgICAgICAgICAgZGVwdGhCdWZmZXI6ICExCiAgICAgICAgfSwgYyA9IGtpMShuLCB0LCBpKTsKICAgICAgICBpZiAodGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPT09IG51bGwgfHwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQud2lkdGggIT09IG4gfHwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuaGVpZ2h0ICE9PSB0KSB7CiAgICAgICAgICAgIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ICE9PSBudWxsICYmIHRoaXMuX2Rpc3Bvc2UoKSwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSBraTEobiwgdCwgaSk7CiAgICAgICAgICAgIGxldCB7IF9sb2RNYXg6IHMgIH0gPSB0aGlzOwogICAgICAgICAgICAoeyBzaXplTG9kczogdGhpcy5fc2l6ZUxvZHMgLCBsb2RQbGFuZXM6IHRoaXMuX2xvZFBsYW5lcyAsIHNpZ21hczogdGhpcy5fc2lnbWFzICB9ID0gamMxKHMpKSwgdGhpcy5fYmx1ck1hdGVyaWFsID0gZWwxKHMsIG4sIHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYzsKICAgIH0KICAgIF9jb21waWxlTWF0ZXJpYWwobikgewogICAgICAgIGxldCB0ID0gbmV3IEN0KHRoaXMuX2xvZFBsYW5lc1swXSwgbik7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIuY29tcGlsZSh0LCBQbjEpOwogICAgfQogICAgX3NjZW5lVG9DdWJlVVYobiwgdCwgaSwgYykgewogICAgICAgIGxldCBkID0gbmV3IHZ0KDkwLCAxLCB0LCBpKSwgSSA9IFsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEKICAgICAgICBdLCBUID0gWwogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xCiAgICAgICAgXSwgQyA9IHRoaXMuX3JlbmRlcmVyLCBSID0gQy5hdXRvQ2xlYXIsIFMgPSBDLnRvbmVNYXBwaW5nOwogICAgICAgIEMuZ2V0Q2xlYXJDb2xvcihIaTEpLCBDLnRvbmVNYXBwaW5nID0gVHAsIEMuYXV0b0NsZWFyID0gITE7CiAgICAgICAgbGV0IHgxID0gbmV3IF9lKHsKICAgICAgICAgICAgbmFtZTogIlBNUkVNLkJhY2tncm91bmQiLAogICAgICAgICAgICBzaWRlOiBBbCwKICAgICAgICAgICAgZGVwdGhXcml0ZTogITEsCiAgICAgICAgICAgIGRlcHRoVGVzdDogITEKICAgICAgICB9KSwgTyA9IG5ldyBDdChuZXcgS3MsIHgxKSwgTCA9ICExLCBsID0gbi5iYWNrZ3JvdW5kOwogICAgICAgIGwgPyBsLmlzQ29sb3IgJiYgKHgxLmNvbG9yLmNvcHkobCksIG4uYmFja2dyb3VuZCA9IG51bGwsIEwgPSAhMCkgOiAoeDEuY29sb3IuY29weShIaTEpLCBMID0gITApOwogICAgICAgIGZvcihsZXQgciA9IDA7IHIgPCA2OyByKyspewogICAgICAgICAgICBsZXQgdyA9IHIgJSAzOwogICAgICAgICAgICB3ID09PSAwID8gKGQudXAuc2V0KDAsIElbcl0sIDApLCBkLmxvb2tBdChUW3JdLCAwLCAwKSkgOiB3ID09PSAxID8gKGQudXAuc2V0KDAsIDAsIElbcl0pLCBkLmxvb2tBdCgwLCBUW3JdLCAwKSkgOiAoZC51cC5zZXQoMCwgSVtyXSwgMCksIGQubG9va0F0KDAsIDAsIFRbcl0pKTsKICAgICAgICAgICAgbGV0IE0gPSB0aGlzLl9jdWJlU2l6ZTsKICAgICAgICAgICAgb24xKGMsIHcgKiBNLCByID4gMiA/IE0gOiAwLCBNLCBNKSwgQy5zZXRSZW5kZXJUYXJnZXQoYyksIEwgJiYgQy5yZW5kZXIoTywgZCksIEMucmVuZGVyKG4sIGQpOwogICAgICAgIH0KICAgICAgICBPLmdlb21ldHJ5LmRpc3Bvc2UoKSwgTy5tYXRlcmlhbC5kaXNwb3NlKCksIEMudG9uZU1hcHBpbmcgPSBTLCBDLmF1dG9DbGVhciA9IFIsIG4uYmFja2dyb3VuZCA9IGw7CiAgICB9CiAgICBfdGV4dHVyZVRvQ3ViZVVWKG4sIHQpIHsKICAgICAgICBsZXQgaSA9IHRoaXMuX3JlbmRlcmVyLCBjID0gbi5tYXBwaW5nID09PSBVbyB8fCBuLm1hcHBpbmcgPT09IEhsOwogICAgICAgIGMgPyAodGhpcy5fY3ViZW1hcE1hdGVyaWFsID09PSBudWxsICYmICh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBXaTEoKSksIHRoaXMuX2N1YmVtYXBNYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gbi5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09ICExID8gLTEgOiAxKSA6IHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPT09IG51bGwgJiYgKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSB6aTEoKSk7CiAgICAgICAgbGV0IHMgPSBjID8gdGhpcy5fY3ViZW1hcE1hdGVyaWFsIDogdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCwgaCA9IG5ldyBDdCh0aGlzLl9sb2RQbGFuZXNbMF0sIHMpLCBkID0gcy51bmlmb3JtczsKICAgICAgICBkLmVudk1hcC52YWx1ZSA9IG47CiAgICAgICAgbGV0IEkgPSB0aGlzLl9jdWJlU2l6ZTsKICAgICAgICBvbjEodCwgMCwgMCwgMyAqIEksIDIgKiBJKSwgaS5zZXRSZW5kZXJUYXJnZXQodCksIGkucmVuZGVyKGgsIFBuMSk7CiAgICB9CiAgICBfYXBwbHlQTVJFTShuKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzLl9yZW5kZXJlciwgaSA9IHQuYXV0b0NsZWFyOwogICAgICAgIHQuYXV0b0NsZWFyID0gITE7CiAgICAgICAgbGV0IGMgPSB0aGlzLl9sb2RQbGFuZXMubGVuZ3RoOwogICAgICAgIGZvcihsZXQgcyA9IDE7IHMgPCBjOyBzKyspewogICAgICAgICAgICBsZXQgaCA9IE1hdGguc3FydCh0aGlzLl9zaWdtYXNbc10gKiB0aGlzLl9zaWdtYXNbc10gLSB0aGlzLl9zaWdtYXNbcyAtIDFdICogdGhpcy5fc2lnbWFzW3MgLSAxXSksIGQgPSBWaTFbKGMgLSBzIC0gMSkgJSBWaTEubGVuZ3RoXTsKICAgICAgICAgICAgdGhpcy5fYmx1cihuLCBzIC0gMSwgcywgaCwgZCk7CiAgICAgICAgfQogICAgICAgIHQuYXV0b0NsZWFyID0gaTsKICAgIH0KICAgIF9ibHVyKG4sIHQsIGksIGMsIHMpIHsKICAgICAgICBsZXQgaCA9IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0OwogICAgICAgIHRoaXMuX2hhbGZCbHVyKG4sIGgsIHQsIGksIGMsICJsYXRpdHVkaW5hbCIsIHMpLCB0aGlzLl9oYWxmQmx1cihoLCBuLCBpLCBpLCBjLCAibG9uZ2l0dWRpbmFsIiwgcyk7CiAgICB9CiAgICBfaGFsZkJsdXIobiwgdCwgaSwgYywgcywgaCwgZCkgewogICAgICAgIGxldCBJID0gdGhpcy5fcmVuZGVyZXIsIFQgPSB0aGlzLl9ibHVyTWF0ZXJpYWw7CiAgICAgICAgaCAhPT0gImxhdGl0dWRpbmFsIiAmJiBoICE9PSAibG9uZ2l0dWRpbmFsIiAmJiBjb25zb2xlLmVycm9yKCJibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhIik7CiAgICAgICAgbGV0IEMgPSAzLCBSID0gbmV3IEN0KHRoaXMuX2xvZFBsYW5lc1tjXSwgVCksIFMgPSBULnVuaWZvcm1zLCB4MSA9IHRoaXMuX3NpemVMb2RzW2ldIC0gMSwgTyA9IGlzRmluaXRlKHMpID8gTWF0aC5QSSAvICgyICogeDEpIDogMiAqIE1hdGguUEkgLyAoMiAqIFV0MSAtIDEpLCBMID0gcyAvIE8sIGwgPSBpc0Zpbml0ZShzKSA/IDEgKyBNYXRoLmZsb29yKEMgKiBMKSA6IFV0MTsKICAgICAgICBsID4gVXQxICYmIGNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3N9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7bH0gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke1V0MX1gKTsKICAgICAgICBsZXQgciA9IFtdLCB3ID0gMDsKICAgICAgICBmb3IobGV0IHkxID0gMDsgeTEgPCBVdDE7ICsreTEpewogICAgICAgICAgICBsZXQgQiA9IHkxIC8gTCwgcCA9IE1hdGguZXhwKC1CICogQiAvIDIpOwogICAgICAgICAgICByLnB1c2gocCksIHkxID09PSAwID8gdyArPSBwIDogeTEgPCBsICYmICh3ICs9IDIgKiBwKTsKICAgICAgICB9CiAgICAgICAgZm9yKGxldCB5MSA9IDA7IHkxIDwgci5sZW5ndGg7IHkxKyspclt5MV0gPSByW3kxXSAvIHc7CiAgICAgICAgUy5lbnZNYXAudmFsdWUgPSBuLnRleHR1cmUsIFMuc2FtcGxlcy52YWx1ZSA9IGwsIFMud2VpZ2h0cy52YWx1ZSA9IHIsIFMubGF0aXR1ZGluYWwudmFsdWUgPSBoID09PSAibGF0aXR1ZGluYWwiLCBkICYmIChTLnBvbGVBeGlzLnZhbHVlID0gZCk7CiAgICAgICAgbGV0IHsgX2xvZE1heDogTSAgfSA9IHRoaXM7CiAgICAgICAgUy5kVGhldGEudmFsdWUgPSBPLCBTLm1pcEludC52YWx1ZSA9IE0gLSBpOwogICAgICAgIGxldCBfID0gdGhpcy5fc2l6ZUxvZHNbY10sIEggPSAzICogXyAqIChjID4gTSAtIEh0MSA/IGMgLSBNICsgSHQxIDogMCksIFAgPSA0ICogKHRoaXMuX2N1YmVTaXplIC0gXyk7CiAgICAgICAgb24xKHQsIEgsIFAsIDMgKiBfLCAyICogXyksIEkuc2V0UmVuZGVyVGFyZ2V0KHQpLCBJLnJlbmRlcihSLCBQbjEpOwogICAgfQp9OwpmdW5jdGlvbiBqYzEoZSkgewogICAgbGV0IG4gPSBbXSwgdCA9IFtdLCBpID0gW10sIGMgPSBlLCBzID0gZSAtIEh0MSArIDEgKyBHaTEubGVuZ3RoOwogICAgZm9yKGxldCBoID0gMDsgaCA8IHM7IGgrKyl7CiAgICAgICAgbGV0IGQgPSBNYXRoLnBvdygyLCBjKTsKICAgICAgICB0LnB1c2goZCk7CiAgICAgICAgbGV0IEkgPSAxIC8gZDsKICAgICAgICBoID4gZSAtIEh0MSA/IEkgPSBHaTFbaCAtIGUgKyBIdDEgLSAxXSA6IGggPT09IDAgJiYgKEkgPSAwKSwgaS5wdXNoKEkpOwogICAgICAgIGxldCBUID0gMSAvIChkIC0gMiksIEMgPSAtVCwgUiA9IDEgKyBULCBTID0gWwogICAgICAgICAgICBDLAogICAgICAgICAgICBDLAogICAgICAgICAgICBSLAogICAgICAgICAgICBDLAogICAgICAgICAgICBSLAogICAgICAgICAgICBSLAogICAgICAgICAgICBDLAogICAgICAgICAgICBDLAogICAgICAgICAgICBSLAogICAgICAgICAgICBSLAogICAgICAgICAgICBDLAogICAgICAgICAgICBSCiAgICAgICAgXSwgeDEgPSA2LCBPID0gNiwgTDEgPSAzLCBsID0gMiwgciA9IDEsIHcgPSBuZXcgRmxvYXQzMkFycmF5KEwxICogTyAqIHgxKSwgTSA9IG5ldyBGbG9hdDMyQXJyYXkobCAqIE8gKiB4MSksIF8gPSBuZXcgRmxvYXQzMkFycmF5KHIgKiBPICogeDEpOwogICAgICAgIGZvcihsZXQgUCA9IDA7IFAgPCB4MTsgUCsrKXsKICAgICAgICAgICAgbGV0IHkxID0gUCAlIDMgKiAyIC8gMyAtIDEsIEIgPSBQID4gMiA/IDAgOiAtMSwgcCA9IFsKICAgICAgICAgICAgICAgIHkxLAogICAgICAgICAgICAgICAgQiwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICB5MSArIDIgLyAzLAogICAgICAgICAgICAgICAgQiwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICB5MSArIDIgLyAzLAogICAgICAgICAgICAgICAgQiArIDEsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgeTEsCiAgICAgICAgICAgICAgICBCLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIHkxICsgMiAvIDMsCiAgICAgICAgICAgICAgICBCICsgMSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICB5MSwKICAgICAgICAgICAgICAgIEIgKyAxLAogICAgICAgICAgICAgICAgMAogICAgICAgICAgICBdOwogICAgICAgICAgICB3LnNldChwLCBMMSAqIE8gKiBQKSwgTS5zZXQoUywgbCAqIE8gKiBQKTsKICAgICAgICAgICAgbGV0IGYgPSBbCiAgICAgICAgICAgICAgICBQLAogICAgICAgICAgICAgICAgUCwKICAgICAgICAgICAgICAgIFAsCiAgICAgICAgICAgICAgICBQLAogICAgICAgICAgICAgICAgUCwKICAgICAgICAgICAgICAgIFAKICAgICAgICAgICAgXTsKICAgICAgICAgICAgXy5zZXQoZiwgciAqIE8gKiBQKTsKICAgICAgICB9CiAgICAgICAgbGV0IEggPSBuZXcgTDsKICAgICAgICBILnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgWih3LCBMMSkpLCBILnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgWihNLCBsKSksIEguc2V0QXR0cmlidXRlKCJmYWNlSW5kZXgiLCBuZXcgWihfLCByKSksIG4ucHVzaChIKSwgYyA+IEh0MSAmJiBjLS07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIGxvZFBsYW5lczogbiwKICAgICAgICBzaXplTG9kczogdCwKICAgICAgICBzaWdtYXM6IGkKICAgIH07Cn0KZnVuY3Rpb24ga2kxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gbmV3IEhpKGUsIG4sIHQpOwogICAgcmV0dXJuIGkudGV4dHVyZS5tYXBwaW5nID0gWGwsIGkudGV4dHVyZS5uYW1lID0gIlBNUkVNLmN1YmVVdiIsIGkuc2Npc3NvclRlc3QgPSAhMCwgaTsKfQpmdW5jdGlvbiBvbjEoZSwgbiwgdCwgaSwgYykgewogICAgZS52aWV3cG9ydC5zZXQobiwgdCwgaSwgYyksIGUuc2Npc3Nvci5zZXQobiwgdCwgaSwgYyk7Cn0KZnVuY3Rpb24gZWwxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gbmV3IEZsb2F0MzJBcnJheShVdDEpLCBjID0gbmV3IHcoMCwgMSwgMCk7CiAgICByZXR1cm4gbmV3IHFpKHsKICAgICAgICBuYW1lOiAiU3BoZXJpY2FsR2F1c3NpYW5CbHVyIiwKICAgICAgICBkZWZpbmVzOiB7CiAgICAgICAgICAgIG46IFV0MSwKICAgICAgICAgICAgQ1VCRVVWX1RFWEVMX1dJRFRIOiAxIC8gbiwKICAgICAgICAgICAgQ1VCRVVWX1RFWEVMX0hFSUdIVDogMSAvIHQsCiAgICAgICAgICAgIENVQkVVVl9NQVhfTUlQOiBgJHtlfS4wYAogICAgICAgIH0sCiAgICAgICAgdW5pZm9ybXM6IHsKICAgICAgICAgICAgZW52TWFwOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICBzYW1wbGVzOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMQogICAgICAgICAgICB9LAogICAgICAgICAgICB3ZWlnaHRzOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogaQogICAgICAgICAgICB9LAogICAgICAgICAgICBsYXRpdHVkaW5hbDogewogICAgICAgICAgICAgICAgdmFsdWU6ICExCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRUaGV0YTogewogICAgICAgICAgICAgICAgdmFsdWU6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbWlwSW50OiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgICB9LAogICAgICAgICAgICBwb2xlQXhpczogewogICAgICAgICAgICAgICAgdmFsdWU6IGMKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdmVydGV4U2hhZGVyOiBKbjEoKSwKICAgICAgICBmcmFnbWVudFNoYWRlcjogYAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwoJCQl1bmlmb3JtIGludCBzYW1wbGVzOwoJCQl1bmlmb3JtIGZsb2F0IHdlaWdodHNbIG4gXTsKCQkJdW5pZm9ybSBib29sIGxhdGl0dWRpbmFsOwoJCQl1bmlmb3JtIGZsb2F0IGRUaGV0YTsKCQkJdW5pZm9ybSBmbG9hdCBtaXBJbnQ7CgkJCXVuaWZvcm0gdmVjMyBwb2xlQXhpczsKCgkJCSNkZWZpbmUgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJCQkjaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PgoKCQkJdmVjMyBnZXRTYW1wbGUoIGZsb2F0IHRoZXRhLCB2ZWMzIGF4aXMgKSB7CgoJCQkJZmxvYXQgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7CgkJCQkvLyBSb2RyaWd1ZXMnIGF4aXMtYW5nbGUgcm90YXRpb24KCQkJCXZlYzMgc2FtcGxlRGlyZWN0aW9uID0gdk91dHB1dERpcmVjdGlvbiAqIGNvc1RoZXRhCgkJCQkJKyBjcm9zcyggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogc2luKCB0aGV0YSApCgkJCQkJKyBheGlzICogZG90KCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiAoIDEuMCAtIGNvc1RoZXRhICk7CgoJCQkJcmV0dXJuIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpcmVjdGlvbiwgbWlwSW50ICk7CgoJCQl9CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJdmVjMyBheGlzID0gbGF0aXR1ZGluYWwgPyBwb2xlQXhpcyA6IGNyb3NzKCBwb2xlQXhpcywgdk91dHB1dERpcmVjdGlvbiApOwoKCQkJCWlmICggYWxsKCBlcXVhbCggYXhpcywgdmVjMyggMC4wICkgKSApICkgewoKCQkJCQlheGlzID0gdmVjMyggdk91dHB1dERpcmVjdGlvbi56LCAwLjAsIC0gdk91dHB1dERpcmVjdGlvbi54ICk7CgoJCQkJfQoKCQkJCWF4aXMgPSBub3JtYWxpemUoIGF4aXMgKTsKCgkJCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKCQkJCWdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgMCBdICogZ2V0U2FtcGxlKCAwLjAsIGF4aXMgKTsKCgkJCQlmb3IgKCBpbnQgaSA9IDE7IGkgPCBuOyBpKysgKSB7CgoJCQkJCWlmICggaSA+PSBzYW1wbGVzICkgewoKCQkJCQkJYnJlYWs7CgoJCQkJCX0KCgkJCQkJZmxvYXQgdGhldGEgPSBkVGhldGEgKiBmbG9hdCggaSApOwoJCQkJCWdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCAtMS4wICogdGhldGEsIGF4aXMgKTsKCQkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggdGhldGEsIGF4aXMgKTsKCgkJCQl9CgoJCQl9CgkJYCwKICAgICAgICBibGVuZGluZzogVWwsCiAgICAgICAgZGVwdGhUZXN0OiAhMSwKICAgICAgICBkZXB0aFdyaXRlOiAhMQogICAgfSk7Cn0KZnVuY3Rpb24gemkxKCkgewogICAgcmV0dXJuIG5ldyBxaSh7CiAgICAgICAgbmFtZTogIkVxdWlyZWN0YW5ndWxhclRvQ3ViZVVWIiwKICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICBlbnZNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHZlcnRleFNoYWRlcjogSm4xKCksCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IGAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCgkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJdmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTsKCQkJCXZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCB0ZXh0dXJlMkQgKCBlbnZNYXAsIHV2ICkucmdiLCAxLjAgKTsKCgkJCX0KCQlgLAogICAgICAgIGJsZW5kaW5nOiBVbCwKICAgICAgICBkZXB0aFRlc3Q6ICExLAogICAgICAgIGRlcHRoV3JpdGU6ICExCiAgICB9KTsKfQpmdW5jdGlvbiBXaTEoKSB7CiAgICByZXR1cm4gbmV3IHFpKHsKICAgICAgICBuYW1lOiAiQ3ViZW1hcFRvQ3ViZVVWIiwKICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICBlbnZNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZsaXBFbnZNYXA6IHsKICAgICAgICAgICAgICAgIHZhbHVlOiAtMQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IEpuMSgpLAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKCgkJCXZvaWQgbWFpbigpIHsKCgkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKTsKCgkJCX0KCQlgLAogICAgICAgIGJsZW5kaW5nOiBVbCwKICAgICAgICBkZXB0aFRlc3Q6ICExLAogICAgICAgIGRlcHRoV3JpdGU6ICExCiAgICB9KTsKfQpmdW5jdGlvbiBKbjEoKSB7CiAgICByZXR1cm4gYAoKCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCWF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7CgoJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uCgkJdmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7CgoJCQl1diA9IDIuMCAqIHV2IC0gMS4wOwoKCQkJdmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7CgoJCQlpZiAoIGZhY2UgPT0gMC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkgewoKCQkJCWRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgegoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsKCQkJCWRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkgewoKCQkJCWRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgegoKCQkJfQoKCQkJcmV0dXJuIGRpcmVjdGlvbjsKCgkJfQoKCQl2b2lkIG1haW4oKSB7CgoJCQl2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7CgkJCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKCQl9CglgOwp9CmZ1bmN0aW9uIHRsMShlKSB7CiAgICBsZXQgbiA9IG5ldyBXZWFrTWFwLCB0ID0gbnVsbDsKICAgIGZ1bmN0aW9uIGkoZCkgewogICAgICAgIGlmIChkICYmIGQuaXNUZXh0dXJlKSB7CiAgICAgICAgICAgIGxldCBJID0gZC5tYXBwaW5nLCBUID0gSSA9PT0gcWwgfHwgSSA9PT0gR2wsIEMgPSBJID09PSBVbyB8fCBJID09PSBIbDsKICAgICAgICAgICAgaWYgKFQgfHwgQykgewogICAgICAgICAgICAgICAgbGV0IFIgPSBuLmdldChkKSwgUyA9IFIgIT09IHZvaWQgMCA/IFIudGV4dHVyZS5wbXJlbVZlcnNpb24gOiAwOwogICAgICAgICAgICAgICAgaWYgKGQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICYmIGQucG1yZW1WZXJzaW9uICE9PSBTKSByZXR1cm4gdCA9PT0gbnVsbCAmJiAodCA9IG5ldyBobjEoZSkpLCBSID0gVCA/IHQuZnJvbUVxdWlyZWN0YW5ndWxhcihkLCBSKSA6IHQuZnJvbUN1YmVtYXAoZCwgUiksIFIudGV4dHVyZS5wbXJlbVZlcnNpb24gPSBkLnBtcmVtVmVyc2lvbiwgbi5zZXQoZCwgUiksIFIudGV4dHVyZTsKICAgICAgICAgICAgICAgIGlmIChSICE9PSB2b2lkIDApIHJldHVybiBSLnRleHR1cmU7CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHgxID0gZC5pbWFnZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVCAmJiB4MSAmJiB4MS5oZWlnaHQgPiAwIHx8IEMgJiYgeDEgJiYgYyh4MSkgPyAodCA9PT0gbnVsbCAmJiAodCA9IG5ldyBobjEoZSkpLCBSID0gVCA/IHQuZnJvbUVxdWlyZWN0YW5ndWxhcihkKSA6IHQuZnJvbUN1YmVtYXAoZCksIFIudGV4dHVyZS5wbXJlbVZlcnNpb24gPSBkLnBtcmVtVmVyc2lvbiwgbi5zZXQoZCwgUiksIGQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIHMpLCBSLnRleHR1cmUpIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZDsKICAgIH0KICAgIGZ1bmN0aW9uIGMoZCkgewogICAgICAgIGxldCBJID0gMCwgVCA9IDY7CiAgICAgICAgZm9yKGxldCBDID0gMDsgQyA8IFQ7IEMrKylkW0NdICE9PSB2b2lkIDAgJiYgSSsrOwogICAgICAgIHJldHVybiBJID09PSBUOwogICAgfQogICAgZnVuY3Rpb24gcyhkKSB7CiAgICAgICAgbGV0IEkgPSBkLnRhcmdldDsKICAgICAgICBJLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBzKTsKICAgICAgICBsZXQgVCA9IG4uZ2V0KEkpOwogICAgICAgIFQgIT09IHZvaWQgMCAmJiAobi5kZWxldGUoSSksIFQuZGlzcG9zZSgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgbiA9IG5ldyBXZWFrTWFwLCB0ICE9PSBudWxsICYmICh0LmRpc3Bvc2UoKSwgdCA9IG51bGwpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IGksCiAgICAgICAgZGlzcG9zZTogaAogICAgfTsKfQpmdW5jdGlvbiBubDEoZSkgewogICAgbGV0IG4gPSB7fTsKICAgIGZ1bmN0aW9uIHQoaSkgewogICAgICAgIGlmIChuW2ldICE9PSB2b2lkIDApIHJldHVybiBuW2ldOwogICAgICAgIGxldCBjOwogICAgICAgIHN3aXRjaChpKXsKICAgICAgICAgICAgY2FzZSAiV0VCR0xfZGVwdGhfdGV4dHVyZSI6CiAgICAgICAgICAgICAgICBjID0gZS5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKSB8fCBlLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKSB8fCBlLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOgogICAgICAgICAgICAgICAgYyA9IGUuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSB8fCBlLmdldEV4dGVuc2lvbigiTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpIHx8IGUuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOgogICAgICAgICAgICAgICAgYyA9IGUuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpIHx8IGUuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSB8fCBlLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjoKICAgICAgICAgICAgICAgIGMgPSBlLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIikgfHwgZS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYyA9IGUuZ2V0RXh0ZW5zaW9uKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbltpXSA9IGMsIGM7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIGhhczogZnVuY3Rpb24oaSkgewogICAgICAgICAgICByZXR1cm4gdChpKSAhPT0gbnVsbDsKICAgICAgICB9LAogICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksIHQoIldFQkdMX2NsaXBfY3VsbF9kaXN0YW5jZSIpLCB0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSwgdCgiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IiksIHQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpLCB0KCJXRUJHTF9yZW5kZXJfc2hhcmVkX2V4cG9uZW50Iik7CiAgICAgICAgfSwKICAgICAgICBnZXQ6IGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgbGV0IGMgPSB0KGkpOwogICAgICAgICAgICByZXR1cm4gYyA9PT0gbnVsbCAmJiBDZigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIiArIGkgKyAiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpLCBjOwogICAgICAgIH0KICAgIH07Cn0KZnVuY3Rpb24gaWwxKGUsIG4sIHQsIGkpIHsKICAgIGxldCBjID0ge30sIHMgPSBuZXcgV2Vha01hcDsKICAgIGZ1bmN0aW9uIGgoUikgewogICAgICAgIGxldCBTID0gUi50YXJnZXQ7CiAgICAgICAgUy5pbmRleCAhPT0gbnVsbCAmJiBuLnJlbW92ZShTLmluZGV4KTsKICAgICAgICBmb3IobGV0IE8gaW4gUy5hdHRyaWJ1dGVzKW4ucmVtb3ZlKFMuYXR0cmlidXRlc1tPXSk7CiAgICAgICAgUy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgaCksIGRlbGV0ZSBjW1MuaWRdOwogICAgICAgIGxldCB4MSA9IHMuZ2V0KFMpOwogICAgICAgIHgxICYmIChuLnJlbW92ZSh4MSksIHMuZGVsZXRlKFMpKSwgaS5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeShTKSwgUy5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID09PSAhMCAmJiBkZWxldGUgUy5fbWF4SW5zdGFuY2VDb3VudCwgdC5tZW1vcnkuZ2VvbWV0cmllcy0tOwogICAgfQogICAgZnVuY3Rpb24gZChSLCBTKSB7CiAgICAgICAgcmV0dXJuIGNbUy5pZF0gPT09ICEwIHx8IChTLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBoKSwgY1tTLmlkXSA9ICEwLCB0Lm1lbW9yeS5nZW9tZXRyaWVzKyspLCBTOwogICAgfQogICAgZnVuY3Rpb24gSShSKSB7CiAgICAgICAgbGV0IFMgPSBSLmF0dHJpYnV0ZXM7CiAgICAgICAgZm9yKGxldCB4MSBpbiBTKW4udXBkYXRlKFNbeDFdLCBlLkFSUkFZX0JVRkZFUik7CiAgICB9CiAgICBmdW5jdGlvbiBUKFIpIHsKICAgICAgICBsZXQgUyA9IFtdLCB4MSA9IFIuaW5kZXgsIE8gPSBSLmF0dHJpYnV0ZXMucG9zaXRpb24sIEwgPSAwOwogICAgICAgIGlmICh4MSAhPT0gbnVsbCkgewogICAgICAgICAgICBsZXQgdyA9IHgxLmFycmF5OwogICAgICAgICAgICBMID0geDEudmVyc2lvbjsKICAgICAgICAgICAgZm9yKGxldCBNID0gMCwgXyA9IHcubGVuZ3RoOyBNIDwgXzsgTSArPSAzKXsKICAgICAgICAgICAgICAgIGxldCBIID0gd1tNICsgMF0sIFAgPSB3W00gKyAxXSwgeTEgPSB3W00gKyAyXTsKICAgICAgICAgICAgICAgIFMucHVzaChILCBQLCBQLCB5MSwgeTEsIEgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChPICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgbGV0IHcgPSBPLmFycmF5OwogICAgICAgICAgICBMID0gTy52ZXJzaW9uOwogICAgICAgICAgICBmb3IobGV0IE0gPSAwLCBfID0gdy5sZW5ndGggLyAzIC0gMTsgTSA8IF87IE0gKz0gMyl7CiAgICAgICAgICAgICAgICBsZXQgSCA9IE0gKyAwLCBQID0gTSArIDEsIHkxID0gTSArIDI7CiAgICAgICAgICAgICAgICBTLnB1c2goSCwgUCwgUCwgeTEsIHkxLCBIKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSByZXR1cm47CiAgICAgICAgbGV0IGwgPSBuZXcgKGN1KFMpID8geHIgOiBncikoUywgMSk7CiAgICAgICAgbC52ZXJzaW9uID0gTDsKICAgICAgICBsZXQgciA9IHMuZ2V0KFIpOwogICAgICAgIHIgJiYgbi5yZW1vdmUociksIHMuc2V0KFIsIGwpOwogICAgfQogICAgZnVuY3Rpb24gQyhSKSB7CiAgICAgICAgbGV0IFMgPSBzLmdldChSKTsKICAgICAgICBpZiAoUykgewogICAgICAgICAgICBsZXQgeDEgPSBSLmluZGV4OwogICAgICAgICAgICB4MSAhPT0gbnVsbCAmJiBTLnZlcnNpb24gPCB4MS52ZXJzaW9uICYmIFQoUik7CiAgICAgICAgfSBlbHNlIFQoUik7CiAgICAgICAgcmV0dXJuIHMuZ2V0KFIpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IGQsCiAgICAgICAgdXBkYXRlOiBJLAogICAgICAgIGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogQwogICAgfTsKfQpmdW5jdGlvbiBybDEoZSwgbiwgdCkgewogICAgbGV0IGk7CiAgICBmdW5jdGlvbiBjKFMpIHsKICAgICAgICBpID0gUzsKICAgIH0KICAgIGxldCBzLCBoOwogICAgZnVuY3Rpb24gZChTKSB7CiAgICAgICAgcyA9IFMudHlwZSwgaCA9IFMuYnl0ZXNQZXJFbGVtZW50OwogICAgfQogICAgZnVuY3Rpb24gSShTLCB4MSkgewogICAgICAgIGUuZHJhd0VsZW1lbnRzKGksIHgxLCBzLCBTICogaCksIHQudXBkYXRlKHgxLCBpLCAxKTsKICAgIH0KICAgIGZ1bmN0aW9uIFQoUywgeDEsIE8pIHsKICAgICAgICBPICE9PSAwICYmIChlLmRyYXdFbGVtZW50c0luc3RhbmNlZChpLCB4MSwgcywgUyAqIGgsIE8pLCB0LnVwZGF0ZSh4MSwgaSwgTykpOwogICAgfQogICAgZnVuY3Rpb24gQyhTLCB4MSwgTykgewogICAgICAgIGlmIChPID09PSAwKSByZXR1cm47CiAgICAgICAgbi5nZXQoIldFQkdMX211bHRpX2RyYXciKS5tdWx0aURyYXdFbGVtZW50c1dFQkdMKGksIHgxLCAwLCBzLCBTLCAwLCBPKTsKICAgICAgICBsZXQgbCA9IDA7CiAgICAgICAgZm9yKGxldCByID0gMDsgciA8IE87IHIrKylsICs9IHgxW3JdOwogICAgICAgIHQudXBkYXRlKGwsIGksIDEpOwogICAgfQogICAgZnVuY3Rpb24gUihTLCB4MSwgTywgTCkgewogICAgICAgIGlmIChPID09PSAwKSByZXR1cm47CiAgICAgICAgbGV0IGwgPSBuLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpOwogICAgICAgIGlmIChsID09PSBudWxsKSBmb3IobGV0IHIgPSAwOyByIDwgUy5sZW5ndGg7IHIrKylUKFNbcl0gLyBoLCB4MVtyXSwgTFtyXSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGwubXVsdGlEcmF3RWxlbWVudHNJbnN0YW5jZWRXRUJHTChpLCB4MSwgMCwgcywgUywgMCwgTCwgMCwgTyk7CiAgICAgICAgICAgIGxldCByID0gMDsKICAgICAgICAgICAgZm9yKGxldCB3ID0gMDsgdyA8IE87IHcrKylyICs9IHgxW3ddICogTFt3XTsKICAgICAgICAgICAgdC51cGRhdGUociwgaSwgMSk7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5zZXRNb2RlID0gYywgdGhpcy5zZXRJbmRleCA9IGQsIHRoaXMucmVuZGVyID0gSSwgdGhpcy5yZW5kZXJJbnN0YW5jZXMgPSBULCB0aGlzLnJlbmRlck11bHRpRHJhdyA9IEMsIHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzID0gUjsKfQpmdW5jdGlvbiBhbDEoZSkgewogICAgbGV0IG4gPSB7CiAgICAgICAgZ2VvbWV0cmllczogMCwKICAgICAgICB0ZXh0dXJlczogMAogICAgfSwgdCA9IHsKICAgICAgICBmcmFtZTogMCwKICAgICAgICBjYWxsczogMCwKICAgICAgICB0cmlhbmdsZXM6IDAsCiAgICAgICAgcG9pbnRzOiAwLAogICAgICAgIGxpbmVzOiAwCiAgICB9OwogICAgZnVuY3Rpb24gaShzLCBoLCBkKSB7CiAgICAgICAgc3dpdGNoKHQuY2FsbHMrKywgaCl7CiAgICAgICAgICAgIGNhc2UgZS5UUklBTkdMRVM6CiAgICAgICAgICAgICAgICB0LnRyaWFuZ2xlcyArPSBkICogKHMgLyAzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGUuTElORVM6CiAgICAgICAgICAgICAgICB0LmxpbmVzICs9IGQgKiAocyAvIDIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgZS5MSU5FX1NUUklQOgogICAgICAgICAgICAgICAgdC5saW5lcyArPSBkICogKHMgLSAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGUuTElORV9MT09QOgogICAgICAgICAgICAgICAgdC5saW5lcyArPSBkICogczsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGUuUE9JTlRTOgogICAgICAgICAgICAgICAgdC5wb2ludHMgKz0gZCAqIHM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6IiwgaCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjKCkgewogICAgICAgIHQuY2FsbHMgPSAwLCB0LnRyaWFuZ2xlcyA9IDAsIHQucG9pbnRzID0gMCwgdC5saW5lcyA9IDA7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIG1lbW9yeTogbiwKICAgICAgICByZW5kZXI6IHQsCiAgICAgICAgcHJvZ3JhbXM6IG51bGwsCiAgICAgICAgYXV0b1Jlc2V0OiAhMCwKICAgICAgICByZXNldDogYywKICAgICAgICB1cGRhdGU6IGkKICAgIH07Cn0KZnVuY3Rpb24gb2wxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gbmV3IFdlYWtNYXAsIGMgPSBuZXcgb3Q7CiAgICBmdW5jdGlvbiBzKGgsIGQsIEkpIHsKICAgICAgICBsZXQgVDEgPSBoLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcywgQyA9IGQubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IGQubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBkLm1vcnBoQXR0cmlidXRlcy5jb2xvciwgUiA9IEMgIT09IHZvaWQgMCA/IEMubGVuZ3RoIDogMCwgUyA9IGkuZ2V0KGQpOwogICAgICAgIGlmIChTID09PSB2b2lkIDAgfHwgUy5jb3VudCAhPT0gUikgewogICAgICAgICAgICBsZXQgcCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgeTEuZGlzcG9zZSgpLCBpLmRlbGV0ZShkKSwgZC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgcCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFMgIT09IHZvaWQgMCAmJiBTLnRleHR1cmUuZGlzcG9zZSgpOwogICAgICAgICAgICBsZXQgeDEgPSBkLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdm9pZCAwLCBPID0gZC5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB2b2lkIDAsIEwgPSBkLm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdm9pZCAwLCBsID0gZC5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgW10sIHIgPSBkLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgW10sIHcgPSBkLm1vcnBoQXR0cmlidXRlcy5jb2xvciB8fCBbXSwgTSA9IDA7CiAgICAgICAgICAgIHgxID09PSAhMCAmJiAoTSA9IDEpLCBPID09PSAhMCAmJiAoTSA9IDIpLCBMID09PSAhMCAmJiAoTSA9IDMpOwogICAgICAgICAgICBsZXQgXyA9IGQuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCAqIE0sIEggPSAxOwogICAgICAgICAgICBfID4gbi5tYXhUZXh0dXJlU2l6ZSAmJiAoSCA9IE1hdGguY2VpbChfIC8gbi5tYXhUZXh0dXJlU2l6ZSksIF8gPSBuLm1heFRleHR1cmVTaXplKTsKICAgICAgICAgICAgbGV0IFAgPSBuZXcgRmxvYXQzMkFycmF5KF8gKiBIICogNCAqIFIpLCB5MSA9IG5ldyAkcyhQLCBfLCBILCBSKTsKICAgICAgICAgICAgeTEudHlwZSA9IHBpLCB5MS5uZWVkc1VwZGF0ZSA9ICEwOwogICAgICAgICAgICBsZXQgQiA9IE0gKiA0OwogICAgICAgICAgICBmb3IobGV0IGYgPSAwOyBmIDwgUjsgZisrKXsKICAgICAgICAgICAgICAgIGxldCBBID0gbFtmXSwgcSA9IHJbZl0sIFYgPSB3W2ZdLCBZID0gXyAqIEggKiA0ICogZjsKICAgICAgICAgICAgICAgIGZvcihsZXQgUSA9IDA7IFEgPCBBLmNvdW50OyBRKyspewogICAgICAgICAgICAgICAgICAgIGxldCB6ID0gUSAqIEI7CiAgICAgICAgICAgICAgICAgICAgeDEgPT09ICEwICYmIChjLmZyb21CdWZmZXJBdHRyaWJ1dGUoQSwgUSksIFBbWSArIHogKyAwXSA9IGMueCwgUFtZICsgeiArIDFdID0gYy55LCBQW1kgKyB6ICsgMl0gPSBjLnosIFBbWSArIHogKyAzXSA9IDApLCBPID09PSAhMCAmJiAoYy5mcm9tQnVmZmVyQXR0cmlidXRlKHEsIFEpLCBQW1kgKyB6ICsgNF0gPSBjLngsIFBbWSArIHogKyA1XSA9IGMueSwgUFtZICsgeiArIDZdID0gYy56LCBQW1kgKyB6ICsgN10gPSAwKSwgTCA9PT0gITAgJiYgKGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShWLCBRKSwgUFtZICsgeiArIDhdID0gYy54LCBQW1kgKyB6ICsgOV0gPSBjLnksIFBbWSArIHogKyAxMF0gPSBjLnosIFBbWSArIHogKyAxMV0gPSBWLml0ZW1TaXplID09PSA0ID8gYy53IDogMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUyA9IHsKICAgICAgICAgICAgICAgIGNvdW50OiBSLAogICAgICAgICAgICAgICAgdGV4dHVyZTogeTEsCiAgICAgICAgICAgICAgICBzaXplOiBuZXcgVChfLCBIKQogICAgICAgICAgICB9LCBpLnNldChkLCBTKSwgZC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgcCk7CiAgICAgICAgfQogICAgICAgIGlmIChoLmlzSW5zdGFuY2VkTWVzaCA9PT0gITAgJiYgaC5tb3JwaFRleHR1cmUgIT09IG51bGwpIEkuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShlLCAibW9ycGhUZXh0dXJlIiwgaC5tb3JwaFRleHR1cmUsIHQpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgeDEgPSAwOwogICAgICAgICAgICBmb3IobGV0IEwgPSAwOyBMIDwgVDEubGVuZ3RoOyBMKyspeDEgKz0gVDFbTF07CiAgICAgICAgICAgIGxldCBPID0gZC5tb3JwaFRhcmdldHNSZWxhdGl2ZSA/IDEgOiAxIC0geDE7CiAgICAgICAgICAgIEkuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShlLCAibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIiwgTyksIEkuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShlLCAibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiwgVDEpOwogICAgICAgIH0KICAgICAgICBJLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoZSwgIm1vcnBoVGFyZ2V0c1RleHR1cmUiLCBTLnRleHR1cmUsIHQpLCBJLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoZSwgIm1vcnBoVGFyZ2V0c1RleHR1cmVTaXplIiwgUy5zaXplKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgdXBkYXRlOiBzCiAgICB9Owp9CmZ1bmN0aW9uIHNsMShlLCBuLCB0LCBpKSB7CiAgICBsZXQgYyA9IG5ldyBXZWFrTWFwOwogICAgZnVuY3Rpb24gcyhJKSB7CiAgICAgICAgbGV0IFQgPSBpLnJlbmRlci5mcmFtZSwgQyA9IEkuZ2VvbWV0cnksIFIgPSBuLmdldChJLCBDKTsKICAgICAgICBpZiAoYy5nZXQoUikgIT09IFQgJiYgKG4udXBkYXRlKFIpLCBjLnNldChSLCBUKSksIEkuaXNJbnN0YW5jZWRNZXNoICYmIChJLmhhc0V2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBkKSA9PT0gITEgJiYgSS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgZCksIGMuZ2V0KEkpICE9PSBUICYmICh0LnVwZGF0ZShJLmluc3RhbmNlTWF0cml4LCBlLkFSUkFZX0JVRkZFUiksIEkuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCAmJiB0LnVwZGF0ZShJLmluc3RhbmNlQ29sb3IsIGUuQVJSQVlfQlVGRkVSKSwgYy5zZXQoSSwgVCkpKSwgSS5pc1NraW5uZWRNZXNoKSB7CiAgICAgICAgICAgIGxldCBTID0gSS5za2VsZXRvbjsKICAgICAgICAgICAgYy5nZXQoUykgIT09IFQgJiYgKFMudXBkYXRlKCksIGMuc2V0KFMsIFQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFI7CiAgICB9CiAgICBmdW5jdGlvbiBoKCkgewogICAgICAgIGMgPSBuZXcgV2Vha01hcDsKICAgIH0KICAgIGZ1bmN0aW9uIGQoSSkgewogICAgICAgIGxldCBUID0gSS50YXJnZXQ7CiAgICAgICAgVC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgZCksIHQucmVtb3ZlKFQuaW5zdGFuY2VNYXRyaXgpLCBULmluc3RhbmNlQ29sb3IgIT09IG51bGwgJiYgdC5yZW1vdmUoVC5pbnN0YW5jZUNvbG9yKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgdXBkYXRlOiBzLAogICAgICAgIGRpc3Bvc2U6IGgKICAgIH07Cn0KdmFyIFByMSA9IG5ldyBsdCwgWGkxID0gbmV3IGhoKDEsIDEpLCBMcjEgPSBuZXcgJHMsIFVyMSA9IG5ldyBRcywgRHIxID0gbmV3IFhpLCBZaTEgPSBbXSwgcWkxID0gW10sIEtpMSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpLCAkaTEgPSBuZXcgRmxvYXQzMkFycmF5KDkpLCBaaTEgPSBuZXcgRmxvYXQzMkFycmF5KDQpOwpmdW5jdGlvbiBYdDEoZSwgbiwgdCkgewogICAgbGV0IGkgPSBlWzBdOwogICAgaWYgKGkgPD0gMCB8fCBpID4gMCkgcmV0dXJuIGU7CiAgICBsZXQgYyA9IG4gKiB0LCBzID0gWWkxW2NdOwogICAgaWYgKHMgPT09IHZvaWQgMCAmJiAocyA9IG5ldyBGbG9hdDMyQXJyYXkoYyksIFlpMVtjXSA9IHMpLCBuICE9PSAwKSB7CiAgICAgICAgaS50b0FycmF5KHMsIDApOwogICAgICAgIGZvcihsZXQgaCA9IDEsIGQgPSAwOyBoICE9PSBuOyArK2gpZCArPSB0LCBlW2hdLnRvQXJyYXkocywgZCk7CiAgICB9CiAgICByZXR1cm4gczsKfQpmdW5jdGlvbiBudDEoZSwgbikgewogICAgaWYgKGUubGVuZ3RoICE9PSBuLmxlbmd0aCkgcmV0dXJuICExOwogICAgZm9yKGxldCB0ID0gMCwgaSA9IGUubGVuZ3RoOyB0IDwgaTsgdCsrKWlmIChlW3RdICE9PSBuW3RdKSByZXR1cm4gITE7CiAgICByZXR1cm4gITA7Cn0KZnVuY3Rpb24gaXQxKGUsIG4pIHsKICAgIGZvcihsZXQgdCA9IDAsIGkgPSBuLmxlbmd0aDsgdCA8IGk7IHQrKyllW3RdID0gblt0XTsKfQpmdW5jdGlvbiBnbjEoZSwgbikgewogICAgbGV0IHQgPSBxaTFbbl07CiAgICB0ID09PSB2b2lkIDAgJiYgKHQgPSBuZXcgSW50MzJBcnJheShuKSwgcWkxW25dID0gdCk7CiAgICBmb3IobGV0IGkgPSAwOyBpICE9PSBuOyArK2kpdFtpXSA9IGUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpOwogICAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gY2wxKGUsIG4pIHsKICAgIGxldCB0ID0gdGhpcy5jYWNoZTsKICAgIHRbMF0gIT09IG4gJiYgKGUudW5pZm9ybTFmKHRoaXMuYWRkciwgbiksIHRbMF0gPSBuKTsKfQpmdW5jdGlvbiBsbDEoZSwgbikgewogICAgbGV0IHQgPSB0aGlzLmNhY2hlOwogICAgaWYgKG4ueCAhPT0gdm9pZCAwKSAodFswXSAhPT0gbi54IHx8IHRbMV0gIT09IG4ueSkgJiYgKGUudW5pZm9ybTJmKHRoaXMuYWRkciwgbi54LCBuLnkpLCB0WzBdID0gbi54LCB0WzFdID0gbi55KTsKICAgIGVsc2UgewogICAgICAgIGlmIChudDEodCwgbikpIHJldHVybjsKICAgICAgICBlLnVuaWZvcm0yZnYodGhpcy5hZGRyLCBuKSwgaXQxKHQsIG4pOwogICAgfQp9CmZ1bmN0aW9uIGZsMShlLCBuKSB7CiAgICBsZXQgdCA9IHRoaXMuY2FjaGU7CiAgICBpZiAobi54ICE9PSB2b2lkIDApICh0WzBdICE9PSBuLnggfHwgdFsxXSAhPT0gbi55IHx8IHRbMl0gIT09IG4ueikgJiYgKGUudW5pZm9ybTNmKHRoaXMuYWRkciwgbi54LCBuLnksIG4ueiksIHRbMF0gPSBuLngsIHRbMV0gPSBuLnksIHRbMl0gPSBuLnopOwogICAgZWxzZSBpZiAobi5yICE9PSB2b2lkIDApICh0WzBdICE9PSBuLnIgfHwgdFsxXSAhPT0gbi5nIHx8IHRbMl0gIT09IG4uYikgJiYgKGUudW5pZm9ybTNmKHRoaXMuYWRkciwgbi5yLCBuLmcsIG4uYiksIHRbMF0gPSBuLnIsIHRbMV0gPSBuLmcsIHRbMl0gPSBuLmIpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKG50MSh0LCBuKSkgcmV0dXJuOwogICAgICAgIGUudW5pZm9ybTNmdih0aGlzLmFkZHIsIG4pLCBpdDEodCwgbik7CiAgICB9Cn0KZnVuY3Rpb24gZGwxKGUsIG4pIHsKICAgIGxldCB0ID0gdGhpcy5jYWNoZTsKICAgIGlmIChuLnggIT09IHZvaWQgMCkgKHRbMF0gIT09IG4ueCB8fCB0WzFdICE9PSBuLnkgfHwgdFsyXSAhPT0gbi56IHx8IHRbM10gIT09IG4udykgJiYgKGUudW5pZm9ybTRmKHRoaXMuYWRkciwgbi54LCBuLnksIG4ueiwgbi53KSwgdFswXSA9IG4ueCwgdFsxXSA9IG4ueSwgdFsyXSA9IG4ueiwgdFszXSA9IG4udyk7CiAgICBlbHNlIHsKICAgICAgICBpZiAobnQxKHQsIG4pKSByZXR1cm47CiAgICAgICAgZS51bmlmb3JtNGZ2KHRoaXMuYWRkciwgbiksIGl0MSh0LCBuKTsKICAgIH0KfQpmdW5jdGlvbiB1bDEoZSwgbikgewogICAgbGV0IHQgPSB0aGlzLmNhY2hlLCBpID0gbi5lbGVtZW50czsKICAgIGlmIChpID09PSB2b2lkIDApIHsKICAgICAgICBpZiAobnQxKHQsIG4pKSByZXR1cm47CiAgICAgICAgZS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwgITEsIG4pLCBpdDEodCwgbik7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChudDEodCwgaSkpIHJldHVybjsKICAgICAgICBaaTEuc2V0KGkpLCBlLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCAhMSwgWmkxKSwgaXQxKHQsIGkpOwogICAgfQp9CmZ1bmN0aW9uIHBsMShlLCBuKSB7CiAgICBsZXQgdCA9IHRoaXMuY2FjaGUsIGkgPSBuLmVsZW1lbnRzOwogICAgaWYgKGkgPT09IHZvaWQgMCkgewogICAgICAgIGlmIChudDEodCwgbikpIHJldHVybjsKICAgICAgICBlLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCAhMSwgbiksIGl0MSh0LCBuKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG50MSh0LCBpKSkgcmV0dXJuOwogICAgICAgICRpMS5zZXQoaSksIGUudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsICExLCAkaTEpLCBpdDEodCwgaSk7CiAgICB9Cn0KZnVuY3Rpb24gaGwxKGUsIG4pIHsKICAgIGxldCB0ID0gdGhpcy5jYWNoZSwgaSA9IG4uZWxlbWVudHM7CiAgICBpZiAoaSA9PT0gdm9pZCAwKSB7CiAgICAgICAgaWYgKG50MSh0LCBuKSkgcmV0dXJuOwogICAgICAgIGUudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsICExLCBuKSwgaXQxKHQsIG4pOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAobnQxKHQsIGkpKSByZXR1cm47CiAgICAgICAgS2kxLnNldChpKSwgZS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwgITEsIEtpMSksIGl0MSh0LCBpKTsKICAgIH0KfQpmdW5jdGlvbiBtbDEoZSwgbikgewogICAgbGV0IHQgPSB0aGlzLmNhY2hlOwogICAgdFswXSAhPT0gbiAmJiAoZS51bmlmb3JtMWkodGhpcy5hZGRyLCBuKSwgdFswXSA9IG4pOwp9CmZ1bmN0aW9uIF9sMShlLCBuKSB7CiAgICBsZXQgdCA9IHRoaXMuY2FjaGU7CiAgICBpZiAobi54ICE9PSB2b2lkIDApICh0WzBdICE9PSBuLnggfHwgdFsxXSAhPT0gbi55KSAmJiAoZS51bmlmb3JtMmkodGhpcy5hZGRyLCBuLngsIG4ueSksIHRbMF0gPSBuLngsIHRbMV0gPSBuLnkpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKG50MSh0LCBuKSkgcmV0dXJuOwogICAgICAgIGUudW5pZm9ybTJpdih0aGlzLmFkZHIsIG4pLCBpdDEodCwgbik7CiAgICB9Cn0KZnVuY3Rpb24gdmwxKGUsIG4pIHsKICAgIGxldCB0ID0gdGhpcy5jYWNoZTsKICAgIGlmIChuLnggIT09IHZvaWQgMCkgKHRbMF0gIT09IG4ueCB8fCB0WzFdICE9PSBuLnkgfHwgdFsyXSAhPT0gbi56KSAmJiAoZS51bmlmb3JtM2kodGhpcy5hZGRyLCBuLngsIG4ueSwgbi56KSwgdFswXSA9IG4ueCwgdFsxXSA9IG4ueSwgdFsyXSA9IG4ueik7CiAgICBlbHNlIHsKICAgICAgICBpZiAobnQxKHQsIG4pKSByZXR1cm47CiAgICAgICAgZS51bmlmb3JtM2l2KHRoaXMuYWRkciwgbiksIGl0MSh0LCBuKTsKICAgIH0KfQpmdW5jdGlvbiBnbDEoZSwgbikgewogICAgbGV0IHQgPSB0aGlzLmNhY2hlOwogICAgaWYgKG4ueCAhPT0gdm9pZCAwKSAodFswXSAhPT0gbi54IHx8IHRbMV0gIT09IG4ueSB8fCB0WzJdICE9PSBuLnogfHwgdFszXSAhPT0gbi53KSAmJiAoZS51bmlmb3JtNGkodGhpcy5hZGRyLCBuLngsIG4ueSwgbi56LCBuLncpLCB0WzBdID0gbi54LCB0WzFdID0gbi55LCB0WzJdID0gbi56LCB0WzNdID0gbi53KTsKICAgIGVsc2UgewogICAgICAgIGlmIChudDEodCwgbikpIHJldHVybjsKICAgICAgICBlLnVuaWZvcm00aXYodGhpcy5hZGRyLCBuKSwgaXQxKHQsIG4pOwogICAgfQp9CmZ1bmN0aW9uIFNsMShlLCBuKSB7CiAgICBsZXQgdCA9IHRoaXMuY2FjaGU7CiAgICB0WzBdICE9PSBuICYmIChlLnVuaWZvcm0xdWkodGhpcy5hZGRyLCBuKSwgdFswXSA9IG4pOwp9CmZ1bmN0aW9uIEVsMShlLCBuKSB7CiAgICBsZXQgdCA9IHRoaXMuY2FjaGU7CiAgICBpZiAobi54ICE9PSB2b2lkIDApICh0WzBdICE9PSBuLnggfHwgdFsxXSAhPT0gbi55KSAmJiAoZS51bmlmb3JtMnVpKHRoaXMuYWRkciwgbi54LCBuLnkpLCB0WzBdID0gbi54LCB0WzFdID0gbi55KTsKICAgIGVsc2UgewogICAgICAgIGlmIChudDEodCwgbikpIHJldHVybjsKICAgICAgICBlLnVuaWZvcm0ydWl2KHRoaXMuYWRkciwgbiksIGl0MSh0LCBuKTsKICAgIH0KfQpmdW5jdGlvbiBNbDEoZSwgbikgewogICAgbGV0IHQgPSB0aGlzLmNhY2hlOwogICAgaWYgKG4ueCAhPT0gdm9pZCAwKSAodFswXSAhPT0gbi54IHx8IHRbMV0gIT09IG4ueSB8fCB0WzJdICE9PSBuLnopICYmIChlLnVuaWZvcm0zdWkodGhpcy5hZGRyLCBuLngsIG4ueSwgbi56KSwgdFswXSA9IG4ueCwgdFsxXSA9IG4ueSwgdFsyXSA9IG4ueik7CiAgICBlbHNlIHsKICAgICAgICBpZiAobnQxKHQsIG4pKSByZXR1cm47CiAgICAgICAgZS51bmlmb3JtM3Vpdih0aGlzLmFkZHIsIG4pLCBpdDEodCwgbik7CiAgICB9Cn0KZnVuY3Rpb24gVGwxKGUsIG4pIHsKICAgIGxldCB0ID0gdGhpcy5jYWNoZTsKICAgIGlmIChuLnggIT09IHZvaWQgMCkgKHRbMF0gIT09IG4ueCB8fCB0WzFdICE9PSBuLnkgfHwgdFsyXSAhPT0gbi56IHx8IHRbM10gIT09IG4udykgJiYgKGUudW5pZm9ybTR1aSh0aGlzLmFkZHIsIG4ueCwgbi55LCBuLnosIG4udyksIHRbMF0gPSBuLngsIHRbMV0gPSBuLnksIHRbMl0gPSBuLnosIHRbM10gPSBuLncpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKG50MSh0LCBuKSkgcmV0dXJuOwogICAgICAgIGUudW5pZm9ybTR1aXYodGhpcy5hZGRyLCBuKSwgaXQxKHQsIG4pOwogICAgfQp9CmZ1bmN0aW9uIHhsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSB0LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKICAgIGlbMF0gIT09IGMgJiYgKGUudW5pZm9ybTFpKHRoaXMuYWRkciwgYyksIGlbMF0gPSBjKTsKICAgIGxldCBzOwogICAgdGhpcy50eXBlID09PSBlLlNBTVBMRVJfMkRfU0hBRE9XID8gKFhpMS5jb21wYXJlRnVuY3Rpb24gPSBjZiwgcyA9IFhpMSkgOiBzID0gUHIxLCB0LnNldFRleHR1cmUyRChuIHx8IHMsIGMpOwp9CmZ1bmN0aW9uIEFsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSB0LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKICAgIGlbMF0gIT09IGMgJiYgKGUudW5pZm9ybTFpKHRoaXMuYWRkciwgYyksIGlbMF0gPSBjKSwgdC5zZXRUZXh0dXJlM0QobiB8fCBVcjEsIGMpOwp9CmZ1bmN0aW9uIFJsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSB0LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKICAgIGlbMF0gIT09IGMgJiYgKGUudW5pZm9ybTFpKHRoaXMuYWRkciwgYyksIGlbMF0gPSBjKSwgdC5zZXRUZXh0dXJlQ3ViZShuIHx8IERyMSwgYyk7Cn0KZnVuY3Rpb24gQ2wxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gdGhpcy5jYWNoZSwgYyA9IHQuYWxsb2NhdGVUZXh0dXJlVW5pdCgpOwogICAgaVswXSAhPT0gYyAmJiAoZS51bmlmb3JtMWkodGhpcy5hZGRyLCBjKSwgaVswXSA9IGMpLCB0LnNldFRleHR1cmUyREFycmF5KG4gfHwgTHIxLCBjKTsKfQpmdW5jdGlvbiBibDEoZSkgewogICAgc3dpdGNoKGUpewogICAgICAgIGNhc2UgNTEyNjoKICAgICAgICAgICAgcmV0dXJuIGNsMTsKICAgICAgICBjYXNlIDM1NjY0OgogICAgICAgICAgICByZXR1cm4gbGwxOwogICAgICAgIGNhc2UgMzU2NjU6CiAgICAgICAgICAgIHJldHVybiBmbDE7CiAgICAgICAgY2FzZSAzNTY2NjoKICAgICAgICAgICAgcmV0dXJuIGRsMTsKICAgICAgICBjYXNlIDM1Njc0OgogICAgICAgICAgICByZXR1cm4gdWwxOwogICAgICAgIGNhc2UgMzU2NzU6CiAgICAgICAgICAgIHJldHVybiBwbDE7CiAgICAgICAgY2FzZSAzNTY3NjoKICAgICAgICAgICAgcmV0dXJuIGhsMTsKICAgICAgICBjYXNlIDUxMjQ6CiAgICAgICAgY2FzZSAzNTY3MDoKICAgICAgICAgICAgcmV0dXJuIG1sMTsKICAgICAgICBjYXNlIDM1NjY3OgogICAgICAgIGNhc2UgMzU2NzE6CiAgICAgICAgICAgIHJldHVybiBfbDE7CiAgICAgICAgY2FzZSAzNTY2ODoKICAgICAgICBjYXNlIDM1NjcyOgogICAgICAgICAgICByZXR1cm4gdmwxOwogICAgICAgIGNhc2UgMzU2Njk6CiAgICAgICAgY2FzZSAzNTY3MzoKICAgICAgICAgICAgcmV0dXJuIGdsMTsKICAgICAgICBjYXNlIDUxMjU6CiAgICAgICAgICAgIHJldHVybiBTbDE7CiAgICAgICAgY2FzZSAzNjI5NDoKICAgICAgICAgICAgcmV0dXJuIEVsMTsKICAgICAgICBjYXNlIDM2Mjk1OgogICAgICAgICAgICByZXR1cm4gTWwxOwogICAgICAgIGNhc2UgMzYyOTY6CiAgICAgICAgICAgIHJldHVybiBUbDE7CiAgICAgICAgY2FzZSAzNTY3ODoKICAgICAgICBjYXNlIDM2MTk4OgogICAgICAgIGNhc2UgMzYyOTg6CiAgICAgICAgY2FzZSAzNjMwNjoKICAgICAgICBjYXNlIDM1NjgyOgogICAgICAgICAgICByZXR1cm4geGwxOwogICAgICAgIGNhc2UgMzU2Nzk6CiAgICAgICAgY2FzZSAzNjI5OToKICAgICAgICBjYXNlIDM2MzA3OgogICAgICAgICAgICByZXR1cm4gQWwxOwogICAgICAgIGNhc2UgMzU2ODA6CiAgICAgICAgY2FzZSAzNjMwMDoKICAgICAgICBjYXNlIDM2MzA4OgogICAgICAgIGNhc2UgMzYyOTM6CiAgICAgICAgICAgIHJldHVybiBSbDE7CiAgICAgICAgY2FzZSAzNjI4OToKICAgICAgICBjYXNlIDM2MzAzOgogICAgICAgIGNhc2UgMzYzMTE6CiAgICAgICAgY2FzZSAzNjI5MjoKICAgICAgICAgICAgcmV0dXJuIENsMTsKICAgIH0KfQpmdW5jdGlvbiBQbDEoZSwgbikgewogICAgZS51bmlmb3JtMWZ2KHRoaXMuYWRkciwgbik7Cn0KZnVuY3Rpb24gTGwoZSwgbikgewogICAgbGV0IHQgPSBYdDEobiwgdGhpcy5zaXplLCAyKTsKICAgIGUudW5pZm9ybTJmdih0aGlzLmFkZHIsIHQpOwp9CmZ1bmN0aW9uIFVsMShlLCBuKSB7CiAgICBsZXQgdCA9IFh0MShuLCB0aGlzLnNpemUsIDMpOwogICAgZS51bmlmb3JtM2Z2KHRoaXMuYWRkciwgdCk7Cn0KZnVuY3Rpb24gRGwoZSwgbikgewogICAgbGV0IHQgPSBYdDEobiwgdGhpcy5zaXplLCA0KTsKICAgIGUudW5pZm9ybTRmdih0aGlzLmFkZHIsIHQpOwp9CmZ1bmN0aW9uIHdsMShlLCBuKSB7CiAgICBsZXQgdCA9IFh0MShuLCB0aGlzLnNpemUsIDQpOwogICAgZS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwgITEsIHQpOwp9CmZ1bmN0aW9uIElsMShlLCBuKSB7CiAgICBsZXQgdCA9IFh0MShuLCB0aGlzLnNpemUsIDkpOwogICAgZS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwgITEsIHQpOwp9CmZ1bmN0aW9uIHlsMShlLCBuKSB7CiAgICBsZXQgdCA9IFh0MShuLCB0aGlzLnNpemUsIDE2KTsKICAgIGUudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsICExLCB0KTsKfQpmdW5jdGlvbiBObDEoZSwgbikgewogICAgZS51bmlmb3JtMWl2KHRoaXMuYWRkciwgbik7Cn0KZnVuY3Rpb24gT2wxKGUsIG4pIHsKICAgIGUudW5pZm9ybTJpdih0aGlzLmFkZHIsIG4pOwp9CmZ1bmN0aW9uIEZsMShlLCBuKSB7CiAgICBlLnVuaWZvcm0zaXYodGhpcy5hZGRyLCBuKTsKfQpmdW5jdGlvbiBCbDEoZSwgbikgewogICAgZS51bmlmb3JtNGl2KHRoaXMuYWRkciwgbik7Cn0KZnVuY3Rpb24gR2wxKGUsIG4pIHsKICAgIGUudW5pZm9ybTF1aXYodGhpcy5hZGRyLCBuKTsKfQpmdW5jdGlvbiBIbDEoZSwgbikgewogICAgZS51bmlmb3JtMnVpdih0aGlzLmFkZHIsIG4pOwp9CmZ1bmN0aW9uIFZsKGUsIG4pIHsKICAgIGUudW5pZm9ybTN1aXYodGhpcy5hZGRyLCBuKTsKfQpmdW5jdGlvbiBrbDEoZSwgbikgewogICAgZS51bmlmb3JtNHVpdih0aGlzLmFkZHIsIG4pOwp9CmZ1bmN0aW9uIHpsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSBuLmxlbmd0aCwgcyA9IGduMSh0LCBjKTsKICAgIG50MShpLCBzKSB8fCAoZS51bmlmb3JtMWl2KHRoaXMuYWRkciwgcyksIGl0MShpLCBzKSk7CiAgICBmb3IobGV0IGggPSAwOyBoICE9PSBjOyArK2gpdC5zZXRUZXh0dXJlMkQobltoXSB8fCBQcjEsIHNbaF0pOwp9CmZ1bmN0aW9uIFdsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSBuLmxlbmd0aCwgcyA9IGduMSh0LCBjKTsKICAgIG50MShpLCBzKSB8fCAoZS51bmlmb3JtMWl2KHRoaXMuYWRkciwgcyksIGl0MShpLCBzKSk7CiAgICBmb3IobGV0IGggPSAwOyBoICE9PSBjOyArK2gpdC5zZXRUZXh0dXJlM0QobltoXSB8fCBVcjEsIHNbaF0pOwp9CmZ1bmN0aW9uIFhsMShlLCBuLCB0KSB7CiAgICBsZXQgaSA9IHRoaXMuY2FjaGUsIGMgPSBuLmxlbmd0aCwgcyA9IGduMSh0LCBjKTsKICAgIG50MShpLCBzKSB8fCAoZS51bmlmb3JtMWl2KHRoaXMuYWRkciwgcyksIGl0MShpLCBzKSk7CiAgICBmb3IobGV0IGggPSAwOyBoICE9PSBjOyArK2gpdC5zZXRUZXh0dXJlQ3ViZShuW2hdIHx8IERyMSwgc1toXSk7Cn0KZnVuY3Rpb24gWWwxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gdGhpcy5jYWNoZSwgYyA9IG4ubGVuZ3RoLCBzID0gZ24xKHQsIGMpOwogICAgbnQxKGksIHMpIHx8IChlLnVuaWZvcm0xaXYodGhpcy5hZGRyLCBzKSwgaXQxKGksIHMpKTsKICAgIGZvcihsZXQgaCA9IDA7IGggIT09IGM7ICsraCl0LnNldFRleHR1cmUyREFycmF5KG5baF0gfHwgTHIxLCBzW2hdKTsKfQpmdW5jdGlvbiBxbDEoZSkgewogICAgc3dpdGNoKGUpewogICAgICAgIGNhc2UgNTEyNjoKICAgICAgICAgICAgcmV0dXJuIFBsMTsKICAgICAgICBjYXNlIDM1NjY0OgogICAgICAgICAgICByZXR1cm4gTGw7CiAgICAgICAgY2FzZSAzNTY2NToKICAgICAgICAgICAgcmV0dXJuIFVsMTsKICAgICAgICBjYXNlIDM1NjY2OgogICAgICAgICAgICByZXR1cm4gRGw7CiAgICAgICAgY2FzZSAzNTY3NDoKICAgICAgICAgICAgcmV0dXJuIHdsMTsKICAgICAgICBjYXNlIDM1Njc1OgogICAgICAgICAgICByZXR1cm4gSWwxOwogICAgICAgIGNhc2UgMzU2NzY6CiAgICAgICAgICAgIHJldHVybiB5bDE7CiAgICAgICAgY2FzZSA1MTI0OgogICAgICAgIGNhc2UgMzU2NzA6CiAgICAgICAgICAgIHJldHVybiBObDE7CiAgICAgICAgY2FzZSAzNTY2NzoKICAgICAgICBjYXNlIDM1NjcxOgogICAgICAgICAgICByZXR1cm4gT2wxOwogICAgICAgIGNhc2UgMzU2Njg6CiAgICAgICAgY2FzZSAzNTY3MjoKICAgICAgICAgICAgcmV0dXJuIEZsMTsKICAgICAgICBjYXNlIDM1NjY5OgogICAgICAgIGNhc2UgMzU2NzM6CiAgICAgICAgICAgIHJldHVybiBCbDE7CiAgICAgICAgY2FzZSA1MTI1OgogICAgICAgICAgICByZXR1cm4gR2wxOwogICAgICAgIGNhc2UgMzYyOTQ6CiAgICAgICAgICAgIHJldHVybiBIbDE7CiAgICAgICAgY2FzZSAzNjI5NToKICAgICAgICAgICAgcmV0dXJuIFZsOwogICAgICAgIGNhc2UgMzYyOTY6CiAgICAgICAgICAgIHJldHVybiBrbDE7CiAgICAgICAgY2FzZSAzNTY3ODoKICAgICAgICBjYXNlIDM2MTk4OgogICAgICAgIGNhc2UgMzYyOTg6CiAgICAgICAgY2FzZSAzNjMwNjoKICAgICAgICBjYXNlIDM1NjgyOgogICAgICAgICAgICByZXR1cm4gemwxOwogICAgICAgIGNhc2UgMzU2Nzk6CiAgICAgICAgY2FzZSAzNjI5OToKICAgICAgICBjYXNlIDM2MzA3OgogICAgICAgICAgICByZXR1cm4gV2wxOwogICAgICAgIGNhc2UgMzU2ODA6CiAgICAgICAgY2FzZSAzNjMwMDoKICAgICAgICBjYXNlIDM2MzA4OgogICAgICAgIGNhc2UgMzYyOTM6CiAgICAgICAgICAgIHJldHVybiBYbDE7CiAgICAgICAgY2FzZSAzNjI4OToKICAgICAgICBjYXNlIDM2MzAzOgogICAgICAgIGNhc2UgMzYzMTE6CiAgICAgICAgY2FzZSAzNjI5MjoKICAgICAgICAgICAgcmV0dXJuIFlsMTsKICAgIH0KfQp2YXIgem4xID0gY2xhc3MgewogICAgY29uc3RydWN0b3IobiwgdCwgaSl7CiAgICAgICAgdGhpcy5pZCA9IG4sIHRoaXMuYWRkciA9IGksIHRoaXMuY2FjaGUgPSBbXSwgdGhpcy50eXBlID0gdC50eXBlLCB0aGlzLnNldFZhbHVlID0gYmwxKHQudHlwZSk7CiAgICB9Cn0sIFduMSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKG4sIHQsIGkpewogICAgICAgIHRoaXMuaWQgPSBuLCB0aGlzLmFkZHIgPSBpLCB0aGlzLmNhY2hlID0gW10sIHRoaXMudHlwZSA9IHQudHlwZSwgdGhpcy5zaXplID0gdC5zaXplLCB0aGlzLnNldFZhbHVlID0gcWwxKHQudHlwZSk7CiAgICB9Cn0sIFhuMSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKG4pewogICAgICAgIHRoaXMuaWQgPSBuLCB0aGlzLnNlcSA9IFtdLCB0aGlzLm1hcCA9IHt9OwogICAgfQogICAgc2V0VmFsdWUobiwgdCwgaSkgewogICAgICAgIGxldCBjID0gdGhpcy5zZXE7CiAgICAgICAgZm9yKGxldCBzID0gMCwgaCA9IGMubGVuZ3RoOyBzICE9PSBoOyArK3MpewogICAgICAgICAgICBsZXQgZCA9IGNbc107CiAgICAgICAgICAgIGQuc2V0VmFsdWUobiwgdFtkLmlkXSwgaSk7CiAgICAgICAgfQogICAgfQp9LCBJbiA9IC8oXHcrKShcXSk/KFxbfFwuKT8vZzsKZnVuY3Rpb24gUWkxKGUsIG4pIHsKICAgIGUuc2VxLnB1c2gobiksIGUubWFwW24uaWRdID0gbjsKfQpmdW5jdGlvbiBLbDEoZSwgbiwgdCkgewogICAgbGV0IGkgPSBlLm5hbWUsIGMgPSBpLmxlbmd0aDsKICAgIGZvcihJbi5sYXN0SW5kZXggPSAwOzspewogICAgICAgIGxldCBzID0gSW4uZXhlYyhpKSwgaCA9IEluLmxhc3RJbmRleCwgZCA9IHNbMV0sIEkgPSBzWzJdID09PSAiXSIsIFQgPSBzWzNdOwogICAgICAgIGlmIChJICYmIChkID0gZCB8IDApLCBUID09PSB2b2lkIDAgfHwgVCA9PT0gIlsiICYmIGggKyAyID09PSBjKSB7CiAgICAgICAgICAgIFFpMSh0LCBUID09PSB2b2lkIDAgPyBuZXcgem4xKGQsIGUsIG4pIDogbmV3IFduMShkLCBlLCBuKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBSID0gdC5tYXBbZF07CiAgICAgICAgICAgIFIgPT09IHZvaWQgMCAmJiAoUiA9IG5ldyBYbjEoZCksIFFpMSh0LCBSKSksIHQgPSBSOwogICAgICAgIH0KICAgIH0KfQp2YXIgVnQxID0gY2xhc3MgewogICAgY29uc3RydWN0b3IobiwgdCl7CiAgICAgICAgdGhpcy5zZXEgPSBbXSwgdGhpcy5tYXAgPSB7fTsKICAgICAgICBsZXQgaSA9IG4uZ2V0UHJvZ3JhbVBhcmFtZXRlcih0LCBuLkFDVElWRV9VTklGT1JNUyk7CiAgICAgICAgZm9yKGxldCBjID0gMDsgYyA8IGk7ICsrYyl7CiAgICAgICAgICAgIGxldCBzID0gbi5nZXRBY3RpdmVVbmlmb3JtKHQsIGMpLCBoID0gbi5nZXRVbmlmb3JtTG9jYXRpb24odCwgcy5uYW1lKTsKICAgICAgICAgICAgS2wxKHMsIGgsIHRoaXMpOwogICAgICAgIH0KICAgIH0KICAgIHNldFZhbHVlKG4sIHQsIGksIGMpIHsKICAgICAgICBsZXQgcyA9IHRoaXMubWFwW3RdOwogICAgICAgIHMgIT09IHZvaWQgMCAmJiBzLnNldFZhbHVlKG4sIGksIGMpOwogICAgfQogICAgc2V0T3B0aW9uYWwobiwgdCwgaSkgewogICAgICAgIGxldCBjID0gdFtpXTsKICAgICAgICBjICE9PSB2b2lkIDAgJiYgdGhpcy5zZXRWYWx1ZShuLCBpLCBjKTsKICAgIH0KICAgIHN0YXRpYyB1cGxvYWQobiwgdCwgaSwgYykgewogICAgICAgIGZvcihsZXQgcyA9IDAsIGggPSB0Lmxlbmd0aDsgcyAhPT0gaDsgKytzKXsKICAgICAgICAgICAgbGV0IGQgPSB0W3NdLCBJID0gaVtkLmlkXTsKICAgICAgICAgICAgSS5uZWVkc1VwZGF0ZSAhPT0gITEgJiYgZC5zZXRWYWx1ZShuLCBJLnZhbHVlLCBjKTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgc2VxV2l0aFZhbHVlKG4sIHQpIHsKICAgICAgICBsZXQgaSA9IFtdOwogICAgICAgIGZvcihsZXQgYyA9IDAsIHMgPSBuLmxlbmd0aDsgYyAhPT0gczsgKytjKXsKICAgICAgICAgICAgbGV0IGggPSBuW2NdOwogICAgICAgICAgICBoLmlkIGluIHQgJiYgaS5wdXNoKGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgIH0KfTsKZnVuY3Rpb24gSmkxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gZS5jcmVhdGVTaGFkZXIobik7CiAgICByZXR1cm4gZS5zaGFkZXJTb3VyY2UoaSwgdCksIGUuY29tcGlsZVNoYWRlcihpKSwgaTsKfQp2YXIgJGwxID0gMzcyOTcsIFpsMSA9IDA7CmZ1bmN0aW9uIFFsMShlLCBuKSB7CiAgICBsZXQgdCA9IGUuc3BsaXQoYApgKSwgaSA9IFtdLCBjID0gTWF0aC5tYXgobiAtIDYsIDApLCBzID0gTWF0aC5taW4obiArIDYsIHQubGVuZ3RoKTsKICAgIGZvcihsZXQgaCA9IGM7IGggPCBzOyBoKyspewogICAgICAgIGxldCBkID0gaCArIDE7CiAgICAgICAgaS5wdXNoKGAke2QgPT09IG4gPyAiPiIgOiAiICJ9ICR7ZH06ICR7dFtoXX1gKTsKICAgIH0KICAgIHJldHVybiBpLmpvaW4oYApgKTsKfQp2YXIgamkxID0gbmV3IEd0OwpmdW5jdGlvbiBKbDEoZSkgewogICAgVHQuX2dldE1hdHJpeChqaTEsIFR0LndvcmtpbmdDb2xvclNwYWNlLCBlKTsKICAgIGxldCBuID0gYG1hdDMoICR7amkxLmVsZW1lbnRzLm1hcCgodCk9PnQudG9GaXhlZCg0KSl9IClgOwogICAgc3dpdGNoKFR0LmdldFRyYW5zZmVyKGUpKXsKICAgICAgICBjYXNlIGxhOgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICJMaW5lYXJUcmFuc2Zlck9FVEYiCiAgICAgICAgICAgIF07CiAgICAgICAgY2FzZSBGbjoKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAic1JHQlRyYW5zZmVyT0VURiIKICAgICAgICAgICAgXTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIGNvbG9yIHNwYWNlOiAiLCBlKSwgWwogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICJMaW5lYXJUcmFuc2Zlck9FVEYiCiAgICAgICAgICAgIF07CiAgICB9Cn0KZnVuY3Rpb24gZXIxKGUsIG4sIHQpIHsKICAgIGxldCBpID0gZS5nZXRTaGFkZXJQYXJhbWV0ZXIobiwgZS5DT01QSUxFX1NUQVRVUyksIGMgPSBlLmdldFNoYWRlckluZm9Mb2cobikudHJpbSgpOwogICAgaWYgKGkgJiYgYyA9PT0gIiIpIHJldHVybiAiIjsKICAgIGxldCBzID0gL0VSUk9SOiAwOihcZCspLy5leGVjKGMpOwogICAgaWYgKHMpIHsKICAgICAgICBsZXQgaCA9IHBhcnNlSW50KHNbMV0pOwogICAgICAgIHJldHVybiB0LnRvVXBwZXJDYXNlKCkgKyBgCgpgICsgYyArIGAKCmAgKyBRbDEoZS5nZXRTaGFkZXJTb3VyY2UobiksIGgpOwogICAgfSBlbHNlIHJldHVybiBjOwp9CmZ1bmN0aW9uIGpsMShlLCBuKSB7CiAgICBsZXQgdCA9IEpsMShuKTsKICAgIHJldHVybiBbCiAgICAgICAgYHZlYzQgJHtlfSggdmVjNCB2YWx1ZSApIHtgLAogICAgICAgIGAJcmV0dXJuICR7dFsxXX0oIHZlYzQoIHZhbHVlLnJnYiAqICR7dFswXX0sIHZhbHVlLmEgKSApO2AsCiAgICAgICAgIn0iCiAgICBdLmpvaW4oYApgKTsKfQpmdW5jdGlvbiBlZjEoZSwgbikgewogICAgbGV0IHQ7CiAgICBzd2l0Y2gobil7CiAgICAgICAgY2FzZSBJcDoKICAgICAgICAgICAgdCA9ICJMaW5lYXIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENwOgogICAgICAgICAgICB0ID0gIlJlaW5oYXJkIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSB6cDoKICAgICAgICAgICAgdCA9ICJDaW5lb24iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEZwOgogICAgICAgICAgICB0ID0gIkFDRVNGaWxtaWMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVwOgogICAgICAgICAgICB0ID0gIkFnWCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUnA6CiAgICAgICAgICAgIHQgPSAiTmV1dHJhbCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQnA6CiAgICAgICAgICAgIHQgPSAiQ3VzdG9tIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsIG4pLCB0ID0gIkxpbmVhciI7CiAgICB9CiAgICByZXR1cm4gInZlYzMgIiArIGUgKyAiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIiArIHQgKyAiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0iOwp9CnZhciBzbjEgPSBuZXcgdzsKZnVuY3Rpb24gdGYxKCkgewogICAgVHQuZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzKHNuMSk7CiAgICBsZXQgZSA9IHNuMS54LnRvRml4ZWQoNCksIG4gPSBzbjEueS50b0ZpeGVkKDQpLCB0ID0gc24xLnoudG9GaXhlZCg0KTsKICAgIHJldHVybiBbCiAgICAgICAgImZsb2F0IGx1bWluYW5jZSggY29uc3QgaW4gdmVjMyByZ2IgKSB7IiwKICAgICAgICBgCWNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoICR7ZX0sICR7bn0sICR7dH0gKTtgLAogICAgICAgICIJcmV0dXJuIGRvdCggd2VpZ2h0cywgcmdiICk7IiwKICAgICAgICAifSIKICAgIF0uam9pbihgCmApOwp9CmZ1bmN0aW9uIG5mMShlKSB7CiAgICByZXR1cm4gWwogICAgICAgIGUuZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZSA/ICIjZXh0ZW5zaW9uIEdMX0FOR0xFX2NsaXBfY3VsbF9kaXN0YW5jZSA6IHJlcXVpcmUiIDogIiIsCiAgICAgICAgZS5leHRlbnNpb25NdWx0aURyYXcgPyAiI2V4dGVuc2lvbiBHTF9BTkdMRV9tdWx0aV9kcmF3IDogcmVxdWlyZSIgOiAiIgogICAgXS5maWx0ZXIoJHQpLmpvaW4oYApgKTsKfQpmdW5jdGlvbiByZjEoZSkgewogICAgbGV0IG4gPSBbXTsKICAgIGZvcihsZXQgdCBpbiBlKXsKICAgICAgICBsZXQgaSA9IGVbdF07CiAgICAgICAgaSAhPT0gITEgJiYgbi5wdXNoKCIjZGVmaW5lICIgKyB0ICsgIiAiICsgaSk7CiAgICB9CiAgICByZXR1cm4gbi5qb2luKGAKYCk7Cn0KZnVuY3Rpb24gYWYxKGUsIG4pIHsKICAgIGxldCB0ID0ge30sIGkgPSBlLmdldFByb2dyYW1QYXJhbWV0ZXIobiwgZS5BQ1RJVkVfQVRUUklCVVRFUyk7CiAgICBmb3IobGV0IGMgPSAwOyBjIDwgaTsgYysrKXsKICAgICAgICBsZXQgcyA9IGUuZ2V0QWN0aXZlQXR0cmliKG4sIGMpLCBoID0gcy5uYW1lLCBkID0gMTsKICAgICAgICBzLnR5cGUgPT09IGUuRkxPQVRfTUFUMiAmJiAoZCA9IDIpLCBzLnR5cGUgPT09IGUuRkxPQVRfTUFUMyAmJiAoZCA9IDMpLCBzLnR5cGUgPT09IGUuRkxPQVRfTUFUNCAmJiAoZCA9IDQpLCB0W2hdID0gewogICAgICAgICAgICB0eXBlOiBzLnR5cGUsCiAgICAgICAgICAgIGxvY2F0aW9uOiBlLmdldEF0dHJpYkxvY2F0aW9uKG4sIGgpLAogICAgICAgICAgICBsb2NhdGlvblNpemU6IGQKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHQ7Cn0KZnVuY3Rpb24gJHQoZSkgewogICAgcmV0dXJuIGUgIT09ICIiOwp9CmZ1bmN0aW9uIHRyMShlLCBuKSB7CiAgICBsZXQgdCA9IG4ubnVtU3BvdExpZ2h0U2hhZG93cyArIG4ubnVtU3BvdExpZ2h0TWFwcyAtIG4ubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOwogICAgcmV0dXJuIGUucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZywgbi5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLCBuLm51bVNwb3RMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX01BUFMvZywgbi5udW1TcG90TGlnaHRNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZywgdCkucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgbi5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLCBuLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZywgbi5udW1IZW1pTGlnaHRzKS5yZXBsYWNlKC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgbi5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1NfV0lUSF9NQVBTL2csIG4ubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csIG4ubnVtU3BvdExpZ2h0U2hhZG93cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgbi5udW1Qb2ludExpZ2h0U2hhZG93cyk7Cn0KZnVuY3Rpb24gbnIxKGUsIG4pIHsKICAgIHJldHVybiBlLnJlcGxhY2UoL05VTV9DTElQUElOR19QTEFORVMvZywgbi5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csIG4ubnVtQ2xpcHBpbmdQbGFuZXMgLSBuLm51bUNsaXBJbnRlcnNlY3Rpb24pOwp9CnZhciBvZjEgPSAvXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtOwpmdW5jdGlvbiBZbjEoZSkgewogICAgcmV0dXJuIGUucmVwbGFjZShvZjEsIGNmMSk7Cn0KdmFyIHNmMSA9IG5ldyBNYXA7CmZ1bmN0aW9uIGNmMShlLCBuKSB7CiAgICBsZXQgdCA9IFBlMVtuXTsKICAgIGlmICh0ID09PSB2b2lkIDApIHsKICAgICAgICBsZXQgaSA9IHNmMS5nZXQobik7CiAgICAgICAgaWYgKGkgIT09IHZvaWQgMCkgdCA9IFBlMVtpXSwgY29uc29sZS53YXJuKCdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgIiVzIiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgIiVzIiBpbnN0ZWFkLicsIG4sIGkpOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCIgKyBuICsgIj4iKTsKICAgIH0KICAgIHJldHVybiBZbjEodCk7Cn0KdmFyIGxmMSA9IC8jcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHMrZm9yXHMqXChccyppbnRccytpXHMqPVxzKihcZCspXHMqO1xzKmlccyo8XHMqKFxkKylccyo7XHMqaVxzKlwrXCtccypcKVxzKnsoW1xzXFNdKz8pfVxzKyNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kL2c7CmZ1bmN0aW9uIGlyMShlKSB7CiAgICByZXR1cm4gZS5yZXBsYWNlKGxmMSwgZmYxKTsKfQpmdW5jdGlvbiBmZjEoZSwgbiwgdCwgaSkgewogICAgbGV0IGMgPSAiIjsKICAgIGZvcihsZXQgcyA9IHBhcnNlSW50KG4pOyBzIDwgcGFyc2VJbnQodCk7IHMrKyljICs9IGkucmVwbGFjZSgvXFtccyppXHMqXF0vZywgIlsgIiArIHMgKyAiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2csIHMpOwogICAgcmV0dXJuIGM7Cn0KZnVuY3Rpb24gcnIxKGUpIHsKICAgIGxldCBuID0gYHByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBmbG9hdDsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBpbnQ7CglwcmVjaXNpb24gJHtlLnByZWNpc2lvbn0gc2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7ZS5wcmVjaXNpb259IHNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7ZS5wcmVjaXNpb259IHNhbXBsZXIzRDsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheTsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBzYW1wbGVyMkRTaGFkb3c7CglwcmVjaXNpb24gJHtlLnByZWNpc2lvbn0gc2FtcGxlckN1YmVTaGFkb3c7CglwcmVjaXNpb24gJHtlLnByZWNpc2lvbn0gc2FtcGxlcjJEQXJyYXlTaGFkb3c7CglwcmVjaXNpb24gJHtlLnByZWNpc2lvbn0gaXNhbXBsZXIyRDsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBpc2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7ZS5wcmVjaXNpb259IGlzYW1wbGVyQ3ViZTsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSBpc2FtcGxlcjJEQXJyYXk7CglwcmVjaXNpb24gJHtlLnByZWNpc2lvbn0gdXNhbXBsZXIyRDsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSB1c2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7ZS5wcmVjaXNpb259IHVzYW1wbGVyQ3ViZTsKCXByZWNpc2lvbiAke2UucHJlY2lzaW9ufSB1c2FtcGxlcjJEQXJyYXk7CglgOwogICAgcmV0dXJuIGUucHJlY2lzaW9uID09PSAiaGlnaHAiID8gbiArPSBgCiNkZWZpbmUgSElHSF9QUkVDSVNJT05gIDogZS5wcmVjaXNpb24gPT09ICJtZWRpdW1wIiA/IG4gKz0gYAojZGVmaW5lIE1FRElVTV9QUkVDSVNJT05gIDogZS5wcmVjaXNpb24gPT09ICJsb3dwIiAmJiAobiArPSBgCiNkZWZpbmUgTE9XX1BSRUNJU0lPTmApLCBuOwp9CmZ1bmN0aW9uIGRmMShlKSB7CiAgICBsZXQgbiA9ICJTSEFET1dNQVBfVFlQRV9CQVNJQyI7CiAgICByZXR1cm4gZS5zaGFkb3dNYXBUeXBlID09PSBYZCA/IG4gPSAiU0hBRE9XTUFQX1RZUEVfUENGIiA6IGUuc2hhZG93TWFwVHlwZSA9PT0gSmQgPyBuID0gIlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIiA6IGUuc2hhZG93TWFwVHlwZSA9PT0gWmQgJiYgKG4gPSAiU0hBRE9XTUFQX1RZUEVfVlNNIiksIG47Cn0KZnVuY3Rpb24gdWYxKGUpIHsKICAgIGxldCBuID0gIkVOVk1BUF9UWVBFX0NVQkUiOwogICAgaWYgKGUuZW52TWFwKSBzd2l0Y2goZS5lbnZNYXBNb2RlKXsKICAgICAgICBjYXNlIFVvOgogICAgICAgIGNhc2UgSGw6CiAgICAgICAgICAgIG4gPSAiRU5WTUFQX1RZUEVfQ1VCRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWGw6CiAgICAgICAgICAgIG4gPSAiRU5WTUFQX1RZUEVfQ1VCRV9VViI7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIG47Cn0KZnVuY3Rpb24gcGYxKGUpIHsKICAgIGxldCBuID0gIkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iOwogICAgaWYgKGUuZW52TWFwKSBzd2l0Y2goZS5lbnZNYXBNb2RlKXsKICAgICAgICBjYXNlIEhsOgogICAgICAgICAgICBuID0gIkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04iOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBuOwp9CmZ1bmN0aW9uIGhmMShlKSB7CiAgICBsZXQgbiA9ICJFTlZNQVBfQkxFTkRJTkdfTk9ORSI7CiAgICBpZiAoZS5lbnZNYXApIHN3aXRjaChlLmNvbWJpbmUpewogICAgICAgIGNhc2UgRG86CiAgICAgICAgICAgIG4gPSAiRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBcDoKICAgICAgICAgICAgbiA9ICJFTlZNQVBfQkxFTkRJTkdfTUlYIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTcDoKICAgICAgICAgICAgbiA9ICJFTlZNQVBfQkxFTkRJTkdfQUREIjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gbjsKfQpmdW5jdGlvbiBtZjEoZSkgewogICAgbGV0IG4gPSBlLmVudk1hcEN1YmVVVkhlaWdodDsKICAgIGlmIChuID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGxldCB0ID0gTWF0aC5sb2cyKG4pIC0gMiwgaSA9IDEgLyBuOwogICAgcmV0dXJuIHsKICAgICAgICB0ZXhlbFdpZHRoOiAxIC8gKDMgKiBNYXRoLm1heChNYXRoLnBvdygyLCB0KSwgNyAqIDE2KSksCiAgICAgICAgdGV4ZWxIZWlnaHQ6IGksCiAgICAgICAgbWF4TWlwOiB0CiAgICB9Owp9CmZ1bmN0aW9uIF9mMShlLCBuLCB0LCBpKSB7CiAgICBsZXQgYyA9IGUuZ2V0Q29udGV4dCgpLCBzID0gdC5kZWZpbmVzLCBoID0gdC52ZXJ0ZXhTaGFkZXIsIGQgPSB0LmZyYWdtZW50U2hhZGVyLCBJID0gZGYxKHQpLCBUID0gdWYxKHQpLCBDID0gcGYxKHQpLCBSID0gaGYxKHQpLCBTID0gbWYxKHQpLCB4MSA9IG5mMSh0KSwgTyA9IHJmMShzKSwgTCA9IGMuY3JlYXRlUHJvZ3JhbSgpLCBsLCByLCB3ID0gdC5nbHNsVmVyc2lvbiA/ICIjdmVyc2lvbiAiICsgdC5nbHNsVmVyc2lvbiArIGAKYCA6ICIiOwogICAgdC5pc1Jhd1NoYWRlck1hdGVyaWFsID8gKGwgPSBbCiAgICAgICAgIiNkZWZpbmUgU0hBREVSX1RZUEUgIiArIHQuc2hhZGVyVHlwZSwKICAgICAgICAiI2RlZmluZSBTSEFERVJfTkFNRSAiICsgdC5zaGFkZXJOYW1lLAogICAgICAgIE8KICAgIF0uZmlsdGVyKCR0KS5qb2luKGAKYCksIGwubGVuZ3RoID4gMCAmJiAobCArPSBgCmApLCByID0gWwogICAgICAgICIjZGVmaW5lIFNIQURFUl9UWVBFICIgKyB0LnNoYWRlclR5cGUsCiAgICAgICAgIiNkZWZpbmUgU0hBREVSX05BTUUgIiArIHQuc2hhZGVyTmFtZSwKICAgICAgICBPCiAgICBdLmZpbHRlcigkdCkuam9pbihgCmApLCByLmxlbmd0aCA+IDAgJiYgKHIgKz0gYApgKSkgOiAobCA9IFsKICAgICAgICBycjEodCksCiAgICAgICAgIiNkZWZpbmUgU0hBREVSX1RZUEUgIiArIHQuc2hhZGVyVHlwZSwKICAgICAgICAiI2RlZmluZSBTSEFERVJfTkFNRSAiICsgdC5zaGFkZXJOYW1lLAogICAgICAgIE8sCiAgICAgICAgdC5leHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlID8gIiNkZWZpbmUgVVNFX0NMSVBfRElTVEFOQ0UiIDogIiIsCiAgICAgICAgdC5iYXRjaGluZyA/ICIjZGVmaW5lIFVTRV9CQVRDSElORyIgOiAiIiwKICAgICAgICB0LmJhdGNoaW5nQ29sb3IgPyAiI2RlZmluZSBVU0VfQkFUQ0hJTkdfQ09MT1IiIDogIiIsCiAgICAgICAgdC5pbnN0YW5jaW5nID8gIiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciIDogIiIsCiAgICAgICAgdC5pbnN0YW5jaW5nQ29sb3IgPyAiI2RlZmluZSBVU0VfSU5TVEFOQ0lOR19DT0xPUiIgOiAiIiwKICAgICAgICB0Lmluc3RhbmNpbmdNb3JwaCA/ICIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX01PUlBIIiA6ICIiLAogICAgICAgIHQudXNlRm9nICYmIHQuZm9nID8gIiNkZWZpbmUgVVNFX0ZPRyIgOiAiIiwKICAgICAgICB0LnVzZUZvZyAmJiB0LmZvZ0V4cDIgPyAiI2RlZmluZSBGT0dfRVhQMiIgOiAiIiwKICAgICAgICB0Lm1hcCA/ICIjZGVmaW5lIFVTRV9NQVAiIDogIiIsCiAgICAgICAgdC5lbnZNYXAgPyAiI2RlZmluZSBVU0VfRU5WTUFQIiA6ICIiLAogICAgICAgIHQuZW52TWFwID8gIiNkZWZpbmUgIiArIEMgOiAiIiwKICAgICAgICB0LmxpZ2h0TWFwID8gIiNkZWZpbmUgVVNFX0xJR0hUTUFQIiA6ICIiLAogICAgICAgIHQuYW9NYXAgPyAiI2RlZmluZSBVU0VfQU9NQVAiIDogIiIsCiAgICAgICAgdC5idW1wTWFwID8gIiNkZWZpbmUgVVNFX0JVTVBNQVAiIDogIiIsCiAgICAgICAgdC5ub3JtYWxNYXAgPyAiI2RlZmluZSBVU0VfTk9STUFMTUFQIiA6ICIiLAogICAgICAgIHQubm9ybWFsTWFwT2JqZWN0U3BhY2UgPyAiI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIiA6ICIiLAogICAgICAgIHQubm9ybWFsTWFwVGFuZ2VudFNwYWNlID8gIiNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UiIDogIiIsCiAgICAgICAgdC5kaXNwbGFjZW1lbnRNYXAgPyAiI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIiA6ICIiLAogICAgICAgIHQuZW1pc3NpdmVNYXAgPyAiI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiIDogIiIsCiAgICAgICAgdC5hbmlzb3Ryb3B5ID8gIiNkZWZpbmUgVVNFX0FOSVNPVFJPUFkiIDogIiIsCiAgICAgICAgdC5hbmlzb3Ryb3B5TWFwID8gIiNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAiIDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXRNYXAgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIiA6ICIiLAogICAgICAgIHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gIiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiIDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXROb3JtYWxNYXAgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCIgOiAiIiwKICAgICAgICB0LmlyaWRlc2NlbmNlTWFwID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIiA6ICIiLAogICAgICAgIHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPyAiI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQIiA6ICIiLAogICAgICAgIHQuc3BlY3VsYXJNYXAgPyAiI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiIDogIiIsCiAgICAgICAgdC5zcGVjdWxhckNvbG9yTWFwID8gIiNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQIiA6ICIiLAogICAgICAgIHQuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPyAiI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQIiA6ICIiLAogICAgICAgIHQucm91Z2huZXNzTWFwID8gIiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCIgOiAiIiwKICAgICAgICB0Lm1ldGFsbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiIDogIiIsCiAgICAgICAgdC5hbHBoYU1hcCA/ICIjZGVmaW5lIFVTRV9BTFBIQU1BUCIgOiAiIiwKICAgICAgICB0LmFscGhhSGFzaCA/ICIjZGVmaW5lIFVTRV9BTFBIQUhBU0giIDogIiIsCiAgICAgICAgdC50cmFuc21pc3Npb24gPyAiI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIiA6ICIiLAogICAgICAgIHQudHJhbnNtaXNzaW9uTWFwID8gIiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCIgOiAiIiwKICAgICAgICB0LnRoaWNrbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiIDogIiIsCiAgICAgICAgdC5zaGVlbkNvbG9yTWFwID8gIiNkZWZpbmUgVVNFX1NIRUVOX0NPTE9STUFQIiA6ICIiLAogICAgICAgIHQuc2hlZW5Sb3VnaG5lc3NNYXAgPyAiI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICAgIHQubWFwVXYgPyAiI2RlZmluZSBNQVBfVVYgIiArIHQubWFwVXYgOiAiIiwKICAgICAgICB0LmFscGhhTWFwVXYgPyAiI2RlZmluZSBBTFBIQU1BUF9VViAiICsgdC5hbHBoYU1hcFV2IDogIiIsCiAgICAgICAgdC5saWdodE1hcFV2ID8gIiNkZWZpbmUgTElHSFRNQVBfVVYgIiArIHQubGlnaHRNYXBVdiA6ICIiLAogICAgICAgIHQuYW9NYXBVdiA/ICIjZGVmaW5lIEFPTUFQX1VWICIgKyB0LmFvTWFwVXYgOiAiIiwKICAgICAgICB0LmVtaXNzaXZlTWFwVXYgPyAiI2RlZmluZSBFTUlTU0lWRU1BUF9VViAiICsgdC5lbWlzc2l2ZU1hcFV2IDogIiIsCiAgICAgICAgdC5idW1wTWFwVXYgPyAiI2RlZmluZSBCVU1QTUFQX1VWICIgKyB0LmJ1bXBNYXBVdiA6ICIiLAogICAgICAgIHQubm9ybWFsTWFwVXYgPyAiI2RlZmluZSBOT1JNQUxNQVBfVVYgIiArIHQubm9ybWFsTWFwVXYgOiAiIiwKICAgICAgICB0LmRpc3BsYWNlbWVudE1hcFV2ID8gIiNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICIgKyB0LmRpc3BsYWNlbWVudE1hcFV2IDogIiIsCiAgICAgICAgdC5tZXRhbG5lc3NNYXBVdiA/ICIjZGVmaW5lIE1FVEFMTkVTU01BUF9VViAiICsgdC5tZXRhbG5lc3NNYXBVdiA6ICIiLAogICAgICAgIHQucm91Z2huZXNzTWFwVXYgPyAiI2RlZmluZSBST1VHSE5FU1NNQVBfVVYgIiArIHQucm91Z2huZXNzTWFwVXYgOiAiIiwKICAgICAgICB0LmFuaXNvdHJvcHlNYXBVdiA/ICIjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgIiArIHQuYW5pc290cm9weU1hcFV2IDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXRNYXBVdiA/ICIjZGVmaW5lIENMRUFSQ09BVE1BUF9VViAiICsgdC5jbGVhcmNvYXRNYXBVdiA6ICIiLAogICAgICAgIHQuY2xlYXJjb2F0Tm9ybWFsTWFwVXYgPyAiI2RlZmluZSBDTEVBUkNPQVRfTk9STUFMTUFQX1VWICIgKyB0LmNsZWFyY29hdE5vcm1hbE1hcFV2IDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA/ICIjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgIiArIHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgOiAiIiwKICAgICAgICB0LmlyaWRlc2NlbmNlTWFwVXYgPyAiI2RlZmluZSBJUklERVNDRU5DRU1BUF9VViAiICsgdC5pcmlkZXNjZW5jZU1hcFV2IDogIiIsCiAgICAgICAgdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ID8gIiNkZWZpbmUgSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWICIgKyB0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgOiAiIiwKICAgICAgICB0LnNoZWVuQ29sb3JNYXBVdiA/ICIjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICIgKyB0LnNoZWVuQ29sb3JNYXBVdiA6ICIiLAogICAgICAgIHQuc2hlZW5Sb3VnaG5lc3NNYXBVdiA/ICIjZGVmaW5lIFNIRUVOX1JPVUdITkVTU01BUF9VViAiICsgdC5zaGVlblJvdWdobmVzc01hcFV2IDogIiIsCiAgICAgICAgdC5zcGVjdWxhck1hcFV2ID8gIiNkZWZpbmUgU1BFQ1VMQVJNQVBfVVYgIiArIHQuc3BlY3VsYXJNYXBVdiA6ICIiLAogICAgICAgIHQuc3BlY3VsYXJDb2xvck1hcFV2ID8gIiNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgIiArIHQuc3BlY3VsYXJDb2xvck1hcFV2IDogIiIsCiAgICAgICAgdC5zcGVjdWxhckludGVuc2l0eU1hcFV2ID8gIiNkZWZpbmUgU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWICIgKyB0LnNwZWN1bGFySW50ZW5zaXR5TWFwVXYgOiAiIiwKICAgICAgICB0LnRyYW5zbWlzc2lvbk1hcFV2ID8gIiNkZWZpbmUgVFJBTlNNSVNTSU9OTUFQX1VWICIgKyB0LnRyYW5zbWlzc2lvbk1hcFV2IDogIiIsCiAgICAgICAgdC50aGlja25lc3NNYXBVdiA/ICIjZGVmaW5lIFRISUNLTkVTU01BUF9VViAiICsgdC50aGlja25lc3NNYXBVdiA6ICIiLAogICAgICAgIHQudmVydGV4VGFuZ2VudHMgJiYgdC5mbGF0U2hhZGluZyA9PT0gITEgPyAiI2RlZmluZSBVU0VfVEFOR0VOVCIgOiAiIiwKICAgICAgICB0LnZlcnRleENvbG9ycyA/ICIjZGVmaW5lIFVTRV9DT0xPUiIgOiAiIiwKICAgICAgICB0LnZlcnRleEFscGhhcyA/ICIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSIgOiAiIiwKICAgICAgICB0LnZlcnRleFV2MXMgPyAiI2RlZmluZSBVU0VfVVYxIiA6ICIiLAogICAgICAgIHQudmVydGV4VXYycyA/ICIjZGVmaW5lIFVTRV9VVjIiIDogIiIsCiAgICAgICAgdC52ZXJ0ZXhVdjNzID8gIiNkZWZpbmUgVVNFX1VWMyIgOiAiIiwKICAgICAgICB0LnBvaW50c1V2cyA/ICIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiIDogIiIsCiAgICAgICAgdC5mbGF0U2hhZGluZyA/ICIjZGVmaW5lIEZMQVRfU0hBREVEIiA6ICIiLAogICAgICAgIHQuc2tpbm5pbmcgPyAiI2RlZmluZSBVU0VfU0tJTk5JTkciIDogIiIsCiAgICAgICAgdC5tb3JwaFRhcmdldHMgPyAiI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIiA6ICIiLAogICAgICAgIHQubW9ycGhOb3JtYWxzICYmIHQuZmxhdFNoYWRpbmcgPT09ICExID8gIiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyIgOiAiIiwKICAgICAgICB0Lm1vcnBoQ29sb3JzID8gIiNkZWZpbmUgVVNFX01PUlBIQ09MT1JTIiA6ICIiLAogICAgICAgIHQubW9ycGhUYXJnZXRzQ291bnQgPiAwID8gIiNkZWZpbmUgTU9SUEhUQVJHRVRTX1RFWFRVUkVfU1RSSURFICIgKyB0Lm1vcnBoVGV4dHVyZVN0cmlkZSA6ICIiLAogICAgICAgIHQubW9ycGhUYXJnZXRzQ291bnQgPiAwID8gIiNkZWZpbmUgTU9SUEhUQVJHRVRTX0NPVU5UICIgKyB0Lm1vcnBoVGFyZ2V0c0NvdW50IDogIiIsCiAgICAgICAgdC5kb3VibGVTaWRlZCA/ICIjZGVmaW5lIERPVUJMRV9TSURFRCIgOiAiIiwKICAgICAgICB0LmZsaXBTaWRlZCA/ICIjZGVmaW5lIEZMSVBfU0lERUQiIDogIiIsCiAgICAgICAgdC5zaGFkb3dNYXBFbmFibGVkID8gIiNkZWZpbmUgVVNFX1NIQURPV01BUCIgOiAiIiwKICAgICAgICB0LnNoYWRvd01hcEVuYWJsZWQgPyAiI2RlZmluZSAiICsgSSA6ICIiLAogICAgICAgIHQuc2l6ZUF0dGVudWF0aW9uID8gIiNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTiIgOiAiIiwKICAgICAgICB0Lm51bUxpZ2h0UHJvYmVzID4gMCA/ICIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiIDogIiIsCiAgICAgICAgdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gIiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIiA6ICIiLAogICAgICAgIHQucmV2ZXJzZURlcHRoQnVmZmVyID8gIiNkZWZpbmUgVVNFX1JFVkVSU0VERVBUSEJVRiIgOiAiIiwKICAgICAgICAidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsCiAgICAgICAgInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKICAgICAgICAidW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7IiwKICAgICAgICAidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwKICAgICAgICAidW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsiLAogICAgICAgICJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwKICAgICAgICAidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsCiAgICAgICAgIiNpZmRlZiBVU0VfSU5TVEFOQ0lORyIsCiAgICAgICAgIglhdHRyaWJ1dGUgbWF0NCBpbnN0YW5jZU1hdHJpeDsiLAogICAgICAgICIjZW5kaWYiLAogICAgICAgICIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IiLAogICAgICAgICIJYXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsiLAogICAgICAgICIjZW5kaWYiLAogICAgICAgICIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgiLAogICAgICAgICIJdW5pZm9ybSBzYW1wbGVyMkQgbW9ycGhUZXh0dXJlOyIsCiAgICAgICAgIiNlbmRpZiIsCiAgICAgICAgImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsCiAgICAgICAgImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLAogICAgICAgICJhdHRyaWJ1dGUgdmVjMiB1djsiLAogICAgICAgICIjaWZkZWYgVVNFX1VWMSIsCiAgICAgICAgIglhdHRyaWJ1dGUgdmVjMiB1djE7IiwKICAgICAgICAiI2VuZGlmIiwKICAgICAgICAiI2lmZGVmIFVTRV9VVjIiLAogICAgICAgICIJYXR0cmlidXRlIHZlYzIgdXYyOyIsCiAgICAgICAgIiNlbmRpZiIsCiAgICAgICAgIiNpZmRlZiBVU0VfVVYzIiwKICAgICAgICAiCWF0dHJpYnV0ZSB2ZWMyIHV2MzsiLAogICAgICAgICIjZW5kaWYiLAogICAgICAgICIjaWZkZWYgVVNFX1RBTkdFTlQiLAogICAgICAgICIJYXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLAogICAgICAgICIjZW5kaWYiLAogICAgICAgICIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLAogICAgICAgICIJYXR0cmlidXRlIHZlYzQgY29sb3I7IiwKICAgICAgICAiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLAogICAgICAgICIJYXR0cmlidXRlIHZlYzMgY29sb3I7IiwKICAgICAgICAiI2VuZGlmIiwKICAgICAgICAiI2lmZGVmIFVTRV9TS0lOTklORyIsCiAgICAgICAgIglhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwKICAgICAgICAiCWF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwKICAgICAgICAiI2VuZGlmIiwKICAgICAgICBgCmAKICAgIF0uZmlsdGVyKCR0KS5qb2luKGAKYCksIHIgPSBbCiAgICAgICAgcnIxKHQpLAogICAgICAgICIjZGVmaW5lIFNIQURFUl9UWVBFICIgKyB0LnNoYWRlclR5cGUsCiAgICAgICAgIiNkZWZpbmUgU0hBREVSX05BTUUgIiArIHQuc2hhZGVyTmFtZSwKICAgICAgICBPLAogICAgICAgIHQudXNlRm9nICYmIHQuZm9nID8gIiNkZWZpbmUgVVNFX0ZPRyIgOiAiIiwKICAgICAgICB0LnVzZUZvZyAmJiB0LmZvZ0V4cDIgPyAiI2RlZmluZSBGT0dfRVhQMiIgOiAiIiwKICAgICAgICB0LmFscGhhVG9Db3ZlcmFnZSA/ICIjZGVmaW5lIEFMUEhBX1RPX0NPVkVSQUdFIiA6ICIiLAogICAgICAgIHQubWFwID8gIiNkZWZpbmUgVVNFX01BUCIgOiAiIiwKICAgICAgICB0Lm1hdGNhcCA/ICIjZGVmaW5lIFVTRV9NQVRDQVAiIDogIiIsCiAgICAgICAgdC5lbnZNYXAgPyAiI2RlZmluZSBVU0VfRU5WTUFQIiA6ICIiLAogICAgICAgIHQuZW52TWFwID8gIiNkZWZpbmUgIiArIFQgOiAiIiwKICAgICAgICB0LmVudk1hcCA/ICIjZGVmaW5lICIgKyBDIDogIiIsCiAgICAgICAgdC5lbnZNYXAgPyAiI2RlZmluZSAiICsgUiA6ICIiLAogICAgICAgIFMgPyAiI2RlZmluZSBDVUJFVVZfVEVYRUxfV0lEVEggIiArIFMudGV4ZWxXaWR0aCA6ICIiLAogICAgICAgIFMgPyAiI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICIgKyBTLnRleGVsSGVpZ2h0IDogIiIsCiAgICAgICAgUyA/ICIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIgKyBTLm1heE1pcCArICIuMCIgOiAiIiwKICAgICAgICB0LmxpZ2h0TWFwID8gIiNkZWZpbmUgVVNFX0xJR0hUTUFQIiA6ICIiLAogICAgICAgIHQuYW9NYXAgPyAiI2RlZmluZSBVU0VfQU9NQVAiIDogIiIsCiAgICAgICAgdC5idW1wTWFwID8gIiNkZWZpbmUgVVNFX0JVTVBNQVAiIDogIiIsCiAgICAgICAgdC5ub3JtYWxNYXAgPyAiI2RlZmluZSBVU0VfTk9STUFMTUFQIiA6ICIiLAogICAgICAgIHQubm9ybWFsTWFwT2JqZWN0U3BhY2UgPyAiI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIiA6ICIiLAogICAgICAgIHQubm9ybWFsTWFwVGFuZ2VudFNwYWNlID8gIiNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UiIDogIiIsCiAgICAgICAgdC5lbWlzc2l2ZU1hcCA/ICIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCIgOiAiIiwKICAgICAgICB0LmFuaXNvdHJvcHkgPyAiI2RlZmluZSBVU0VfQU5JU09UUk9QWSIgOiAiIiwKICAgICAgICB0LmFuaXNvdHJvcHlNYXAgPyAiI2RlZmluZSBVU0VfQU5JU09UUk9QWU1BUCIgOiAiIiwKICAgICAgICB0LmNsZWFyY29hdCA/ICIjZGVmaW5lIFVTRV9DTEVBUkNPQVQiIDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXRNYXAgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIiA6ICIiLAogICAgICAgIHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gIiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiIDogIiIsCiAgICAgICAgdC5jbGVhcmNvYXROb3JtYWxNYXAgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCIgOiAiIiwKICAgICAgICB0LmRpc3BlcnNpb24gPyAiI2RlZmluZSBVU0VfRElTUEVSU0lPTiIgOiAiIiwKICAgICAgICB0LmlyaWRlc2NlbmNlID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFIiA6ICIiLAogICAgICAgIHQuaXJpZGVzY2VuY2VNYXAgPyAiI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAiIDogIiIsCiAgICAgICAgdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAiIDogIiIsCiAgICAgICAgdC5zcGVjdWxhck1hcCA/ICIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCIgOiAiIiwKICAgICAgICB0LnNwZWN1bGFyQ29sb3JNYXAgPyAiI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAiIDogIiIsCiAgICAgICAgdC5zcGVjdWxhckludGVuc2l0eU1hcCA/ICIjZGVmaW5lIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAiIDogIiIsCiAgICAgICAgdC5yb3VnaG5lc3NNYXAgPyAiI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICAgIHQubWV0YWxuZXNzTWFwID8gIiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCIgOiAiIiwKICAgICAgICB0LmFscGhhTWFwID8gIiNkZWZpbmUgVVNFX0FMUEhBTUFQIiA6ICIiLAogICAgICAgIHQuYWxwaGFUZXN0ID8gIiNkZWZpbmUgVVNFX0FMUEhBVEVTVCIgOiAiIiwKICAgICAgICB0LmFscGhhSGFzaCA/ICIjZGVmaW5lIFVTRV9BTFBIQUhBU0giIDogIiIsCiAgICAgICAgdC5zaGVlbiA/ICIjZGVmaW5lIFVTRV9TSEVFTiIgOiAiIiwKICAgICAgICB0LnNoZWVuQ29sb3JNYXAgPyAiI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiIDogIiIsCiAgICAgICAgdC5zaGVlblJvdWdobmVzc01hcCA/ICIjZGVmaW5lIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAiIDogIiIsCiAgICAgICAgdC50cmFuc21pc3Npb24gPyAiI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIiA6ICIiLAogICAgICAgIHQudHJhbnNtaXNzaW9uTWFwID8gIiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCIgOiAiIiwKICAgICAgICB0LnRoaWNrbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiIDogIiIsCiAgICAgICAgdC52ZXJ0ZXhUYW5nZW50cyAmJiB0LmZsYXRTaGFkaW5nID09PSAhMSA/ICIjZGVmaW5lIFVTRV9UQU5HRU5UIiA6ICIiLAogICAgICAgIHQudmVydGV4Q29sb3JzIHx8IHQuaW5zdGFuY2luZ0NvbG9yIHx8IHQuYmF0Y2hpbmdDb2xvciA/ICIjZGVmaW5lIFVTRV9DT0xPUiIgOiAiIiwKICAgICAgICB0LnZlcnRleEFscGhhcyA/ICIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSIgOiAiIiwKICAgICAgICB0LnZlcnRleFV2MXMgPyAiI2RlZmluZSBVU0VfVVYxIiA6ICIiLAogICAgICAgIHQudmVydGV4VXYycyA/ICIjZGVmaW5lIFVTRV9VVjIiIDogIiIsCiAgICAgICAgdC52ZXJ0ZXhVdjNzID8gIiNkZWZpbmUgVVNFX1VWMyIgOiAiIiwKICAgICAgICB0LnBvaW50c1V2cyA/ICIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiIDogIiIsCiAgICAgICAgdC5ncmFkaWVudE1hcCA/ICIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCIgOiAiIiwKICAgICAgICB0LmZsYXRTaGFkaW5nID8gIiNkZWZpbmUgRkxBVF9TSEFERUQiIDogIiIsCiAgICAgICAgdC5kb3VibGVTaWRlZCA/ICIjZGVmaW5lIERPVUJMRV9TSURFRCIgOiAiIiwKICAgICAgICB0LmZsaXBTaWRlZCA/ICIjZGVmaW5lIEZMSVBfU0lERUQiIDogIiIsCiAgICAgICAgdC5zaGFkb3dNYXBFbmFibGVkID8gIiNkZWZpbmUgVVNFX1NIQURPV01BUCIgOiAiIiwKICAgICAgICB0LnNoYWRvd01hcEVuYWJsZWQgPyAiI2RlZmluZSAiICsgSSA6ICIiLAogICAgICAgIHQucHJlbXVsdGlwbGllZEFscGhhID8gIiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSIgOiAiIiwKICAgICAgICB0Lm51bUxpZ2h0UHJvYmVzID4gMCA/ICIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiIDogIiIsCiAgICAgICAgdC5kZWNvZGVWaWRlb1RleHR1cmUgPyAiI2RlZmluZSBERUNPREVfVklERU9fVEVYVFVSRSIgOiAiIiwKICAgICAgICB0LmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlID8gIiNkZWZpbmUgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkUiIDogIiIsCiAgICAgICAgdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gIiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIiA6ICIiLAogICAgICAgIHQucmV2ZXJzZURlcHRoQnVmZmVyID8gIiNkZWZpbmUgVVNFX1JFVkVSU0VERVBUSEJVRiIgOiAiIiwKICAgICAgICAidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwKICAgICAgICAidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsCiAgICAgICAgInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLAogICAgICAgIHQudG9uZU1hcHBpbmcgIT09IFRwID8gIiNkZWZpbmUgVE9ORV9NQVBQSU5HIiA6ICIiLAogICAgICAgIHQudG9uZU1hcHBpbmcgIT09IFRwID8gUGUxLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgOiAiIiwKICAgICAgICB0LnRvbmVNYXBwaW5nICE9PSBUcCA/IGVmMSgidG9uZU1hcHBpbmciLCB0LnRvbmVNYXBwaW5nKSA6ICIiLAogICAgICAgIHQuZGl0aGVyaW5nID8gIiNkZWZpbmUgRElUSEVSSU5HIiA6ICIiLAogICAgICAgIHQub3BhcXVlID8gIiNkZWZpbmUgT1BBUVVFIiA6ICIiLAogICAgICAgIFBlMS5jb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQsCiAgICAgICAgamwxKCJsaW5lYXJUb091dHB1dFRleGVsIiwgdC5vdXRwdXRDb2xvclNwYWNlKSwKICAgICAgICB0ZjEoKSwKICAgICAgICB0LnVzZURlcHRoUGFja2luZyA/ICIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIiArIHQuZGVwdGhQYWNraW5nIDogIiIsCiAgICAgICAgYApgCiAgICBdLmZpbHRlcigkdCkuam9pbihgCmApKSwgaCA9IFluMShoKSwgaCA9IHRyMShoLCB0KSwgaCA9IG5yMShoLCB0KSwgZCA9IFluMShkKSwgZCA9IHRyMShkLCB0KSwgZCA9IG5yMShkLCB0KSwgaCA9IGlyMShoKSwgZCA9IGlyMShkKSwgdC5pc1Jhd1NoYWRlck1hdGVyaWFsICE9PSAhMCAmJiAodyA9IGAjdmVyc2lvbiAzMDAgZXMKYCwgbCA9IFsKICAgICAgICB4MSwKICAgICAgICAiI2RlZmluZSBhdHRyaWJ1dGUgaW4iLAogICAgICAgICIjZGVmaW5lIHZhcnlpbmcgb3V0IiwKICAgICAgICAiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIKICAgIF0uam9pbihgCmApICsgYApgICsgbCwgciA9IFsKICAgICAgICAiI2RlZmluZSB2YXJ5aW5nIGluIiwKICAgICAgICB0Lmdsc2xWZXJzaW9uID09PSBBZiA/ICIiIDogImxheW91dChsb2NhdGlvbiA9IDApIG91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLAogICAgICAgIHQuZ2xzbFZlcnNpb24gPT09IEFmID8gIiIgOiAiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwKICAgICAgICAiI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoIiwKICAgICAgICAiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIsCiAgICAgICAgIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsCiAgICAgICAgIiNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaiIsCiAgICAgICAgIiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QiLAogICAgICAgICIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLAogICAgICAgICIjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QiLAogICAgICAgICIjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQiLAogICAgICAgICIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsCiAgICAgICAgIiNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkIgogICAgXS5qb2luKGAKYCkgKyBgCmAgKyByKTsKICAgIGxldCBNID0gdyArIGwgKyBoLCBfID0gdyArIHIgKyBkLCBIID0gSmkxKGMsIGMuVkVSVEVYX1NIQURFUiwgTSksIFAgPSBKaTEoYywgYy5GUkFHTUVOVF9TSEFERVIsIF8pOwogICAgYy5hdHRhY2hTaGFkZXIoTCwgSCksIGMuYXR0YWNoU2hhZGVyKEwsIFApLCB0LmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHZvaWQgMCA/IGMuYmluZEF0dHJpYkxvY2F0aW9uKEwsIDAsIHQuaW5kZXgwQXR0cmlidXRlTmFtZSkgOiB0Lm1vcnBoVGFyZ2V0cyA9PT0gITAgJiYgYy5iaW5kQXR0cmliTG9jYXRpb24oTCwgMCwgInBvc2l0aW9uIiksIGMubGlua1Byb2dyYW0oTCk7CiAgICBmdW5jdGlvbiB5MShBKSB7CiAgICAgICAgaWYgKGUuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMpIHsKICAgICAgICAgICAgbGV0IHEgPSBjLmdldFByb2dyYW1JbmZvTG9nKEwpLnRyaW0oKSwgViA9IGMuZ2V0U2hhZGVySW5mb0xvZyhIKS50cmltKCksIFkgPSBjLmdldFNoYWRlckluZm9Mb2coUCkudHJpbSgpLCBRID0gITAsIHogPSAhMDsKICAgICAgICAgICAgaWYgKGMuZ2V0UHJvZ3JhbVBhcmFtZXRlcihMLCBjLkxJTktfU1RBVFVTKSA9PT0gITEpIGlmIChRID0gITEsIHR5cGVvZiBlLmRlYnVnLm9uU2hhZGVyRXJyb3IgPT0gImZ1bmN0aW9uIikgZS5kZWJ1Zy5vblNoYWRlckVycm9yKGMsIEwsIEgsIFApOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxldCBqID0gZXIxKGMsIEgsICJ2ZXJ0ZXgiKSwgRiA9IGVyMShjLCBQLCAiZnJhZ21lbnQiKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICIgKyBjLmdldEVycm9yKCkgKyAiIC0gVkFMSURBVEVfU1RBVFVTICIgKyBjLmdldFByb2dyYW1QYXJhbWV0ZXIoTCwgYy5WQUxJREFURV9TVEFUVVMpICsgYAoKTWF0ZXJpYWwgTmFtZTogYCArIEEubmFtZSArIGAKTWF0ZXJpYWwgVHlwZTogYCArIEEudHlwZSArIGAKClByb2dyYW0gSW5mbyBMb2c6IGAgKyBxICsgYApgICsgaiArIGAKYCArIEYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgcSAhPT0gIiIgPyBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogUHJvZ3JhbSBJbmZvIExvZzoiLCBxKSA6IChWID09PSAiIiB8fCBZID09PSAiIikgJiYgKHogPSAhMSk7CiAgICAgICAgICAgIHogJiYgKEEuZGlhZ25vc3RpY3MgPSB7CiAgICAgICAgICAgICAgICBydW5uYWJsZTogUSwKICAgICAgICAgICAgICAgIHByb2dyYW1Mb2c6IHEsCiAgICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHsKICAgICAgICAgICAgICAgICAgICBsb2c6IFYsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXI6IHsKICAgICAgICAgICAgICAgICAgICBsb2c6IFksCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiByCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjLmRlbGV0ZVNoYWRlcihIKSwgYy5kZWxldGVTaGFkZXIoUCksIEIgPSBuZXcgVnQxKGMsIEwpLCBwID0gYWYxKGMsIEwpOwogICAgfQogICAgbGV0IEI7CiAgICB0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIEIgPT09IHZvaWQgMCAmJiB5MSh0aGlzKSwgQjsKICAgIH07CiAgICBsZXQgcDsKICAgIHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBwID09PSB2b2lkIDAgJiYgeTEodGhpcyksIHA7CiAgICB9OwogICAgbGV0IGYgPSB0LnJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlID09PSAhMTsKICAgIHJldHVybiB0aGlzLmlzUmVhZHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZiA9PT0gITEgJiYgKGYgPSBjLmdldFByb2dyYW1QYXJhbWV0ZXIoTCwgJGwxKSksIGY7CiAgICB9LCB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKICAgICAgICBpLnJlbGVhc2VTdGF0ZXNPZlByb2dyYW0odGhpcyksIGMuZGVsZXRlUHJvZ3JhbShMKSwgdGhpcy5wcm9ncmFtID0gdm9pZCAwOwogICAgfSwgdGhpcy50eXBlID0gdC5zaGFkZXJUeXBlLCB0aGlzLm5hbWUgPSB0LnNoYWRlck5hbWUsIHRoaXMuaWQgPSBabDErKywgdGhpcy5jYWNoZUtleSA9IG4sIHRoaXMudXNlZFRpbWVzID0gMSwgdGhpcy5wcm9ncmFtID0gTCwgdGhpcy52ZXJ0ZXhTaGFkZXIgPSBILCB0aGlzLmZyYWdtZW50U2hhZGVyID0gUCwgdGhpczsKfQp2YXIgdmYxID0gMCwgcW4xID0gY2xhc3MgewogICAgY29uc3RydWN0b3IoKXsKICAgICAgICB0aGlzLnNoYWRlckNhY2hlID0gbmV3IE1hcCwgdGhpcy5tYXRlcmlhbENhY2hlID0gbmV3IE1hcDsKICAgIH0KICAgIHVwZGF0ZShuKSB7CiAgICAgICAgbGV0IHQgPSBuLnZlcnRleFNoYWRlciwgaSA9IG4uZnJhZ21lbnRTaGFkZXIsIGMgPSB0aGlzLl9nZXRTaGFkZXJTdGFnZSh0KSwgcyA9IHRoaXMuX2dldFNoYWRlclN0YWdlKGkpLCBoID0gdGhpcy5fZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbChuKTsKICAgICAgICByZXR1cm4gaC5oYXMoYykgPT09ICExICYmIChoLmFkZChjKSwgYy51c2VkVGltZXMrKyksIGguaGFzKHMpID09PSAhMSAmJiAoaC5hZGQocyksIHMudXNlZFRpbWVzKyspLCB0aGlzOwogICAgfQogICAgcmVtb3ZlKG4pIHsKICAgICAgICBsZXQgdCA9IHRoaXMubWF0ZXJpYWxDYWNoZS5nZXQobik7CiAgICAgICAgZm9yIChsZXQgaSBvZiB0KWkudXNlZFRpbWVzLS0sIGkudXNlZFRpbWVzID09PSAwICYmIHRoaXMuc2hhZGVyQ2FjaGUuZGVsZXRlKGkuY29kZSk7CiAgICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUobiksIHRoaXM7CiAgICB9CiAgICBnZXRWZXJ0ZXhTaGFkZXJJRChuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKG4udmVydGV4U2hhZGVyKS5pZDsKICAgIH0KICAgIGdldEZyYWdtZW50U2hhZGVySUQobikgewogICAgICAgIHJldHVybiB0aGlzLl9nZXRTaGFkZXJTdGFnZShuLmZyYWdtZW50U2hhZGVyKS5pZDsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5zaGFkZXJDYWNoZS5jbGVhcigpLCB0aGlzLm1hdGVyaWFsQ2FjaGUuY2xlYXIoKTsKICAgIH0KICAgIF9nZXRTaGFkZXJDYWNoZUZvck1hdGVyaWFsKG4pIHsKICAgICAgICBsZXQgdCA9IHRoaXMubWF0ZXJpYWxDYWNoZSwgaSA9IHQuZ2V0KG4pOwogICAgICAgIHJldHVybiBpID09PSB2b2lkIDAgJiYgKGkgPSBuZXcgU2V0LCB0LnNldChuLCBpKSksIGk7CiAgICB9CiAgICBfZ2V0U2hhZGVyU3RhZ2UobikgewogICAgICAgIGxldCB0ID0gdGhpcy5zaGFkZXJDYWNoZSwgaSA9IHQuZ2V0KG4pOwogICAgICAgIHJldHVybiBpID09PSB2b2lkIDAgJiYgKGkgPSBuZXcgS24xKG4pLCB0LnNldChuLCBpKSksIGk7CiAgICB9Cn0sIEtuMSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKG4pewogICAgICAgIHRoaXMuaWQgPSB2ZjErKywgdGhpcy5jb2RlID0gbiwgdGhpcy51c2VkVGltZXMgPSAwOwogICAgfQp9OwpmdW5jdGlvbiBnZjEoZSwgbiwgdCwgaSwgYywgcywgaCkgewogICAgbGV0IGQgPSBuZXcganMsIEkgPSBuZXcgcW4xLCBUID0gbmV3IFNldCwgQyA9IFtdLCBSID0gYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLCBTID0gYy52ZXJ0ZXhUZXh0dXJlcywgeDEgPSBjLnByZWNpc2lvbiwgTyA9IHsKICAgICAgICBNZXNoRGVwdGhNYXRlcmlhbDogImRlcHRoIiwKICAgICAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbDogImRpc3RhbmNlUkdCQSIsCiAgICAgICAgTWVzaE5vcm1hbE1hdGVyaWFsOiAibm9ybWFsIiwKICAgICAgICBNZXNoQmFzaWNNYXRlcmlhbDogImJhc2ljIiwKICAgICAgICBNZXNoTGFtYmVydE1hdGVyaWFsOiAibGFtYmVydCIsCiAgICAgICAgTWVzaFBob25nTWF0ZXJpYWw6ICJwaG9uZyIsCiAgICAgICAgTWVzaFRvb25NYXRlcmlhbDogInRvb24iLAogICAgICAgIE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAicGh5c2ljYWwiLAogICAgICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAicGh5c2ljYWwiLAogICAgICAgIE1lc2hNYXRjYXBNYXRlcmlhbDogIm1hdGNhcCIsCiAgICAgICAgTGluZUJhc2ljTWF0ZXJpYWw6ICJiYXNpYyIsCiAgICAgICAgTGluZURhc2hlZE1hdGVyaWFsOiAiZGFzaGVkIiwKICAgICAgICBQb2ludHNNYXRlcmlhbDogInBvaW50cyIsCiAgICAgICAgU2hhZG93TWF0ZXJpYWw6ICJzaGFkb3ciLAogICAgICAgIFNwcml0ZU1hdGVyaWFsOiAic3ByaXRlIgogICAgfTsKICAgIGZ1bmN0aW9uIEwocCkgewogICAgICAgIHJldHVybiBULmFkZChwKSwgcCA9PT0gMCA/ICJ1diIgOiBgdXYke3B9YDsKICAgIH0KICAgIGZ1bmN0aW9uIGwocCwgZiwgQSwgcSwgVikgewogICAgICAgIGxldCBZID0gcS5mb2csIFEgPSBWLmdlb21ldHJ5LCB6ID0gcC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gcS5lbnZpcm9ubWVudCA6IG51bGwsIGogPSAocC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gdCA6IG4pLmdldChwLmVudk1hcCB8fCB6KSwgRiA9IGogJiYgai5tYXBwaW5nID09PSBYbCA/IGouaW1hZ2UuaGVpZ2h0IDogbnVsbCwgbWUgPSBPW3AudHlwZV07CiAgICAgICAgcC5wcmVjaXNpb24gIT09IG51bGwgJiYgKHgxID0gYy5nZXRNYXhQcmVjaXNpb24ocC5wcmVjaXNpb24pLCB4MSAhPT0gcC5wcmVjaXNpb24gJiYgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLCBwLnByZWNpc2lvbiwgIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIiwgeDEsICJpbnN0ZWFkLiIpKTsKICAgICAgICBsZXQgTWUgPSBRLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiB8fCBRLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgUS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IsIExlID0gTWUgIT09IHZvaWQgMCA/IE1lLmxlbmd0aCA6IDAsIEdlID0gMDsKICAgICAgICBRLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdm9pZCAwICYmIChHZSA9IDEpLCBRLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHZvaWQgMCAmJiAoR2UgPSAyKSwgUS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHZvaWQgMCAmJiAoR2UgPSAzKTsKICAgICAgICBsZXQgWmUsIGssIEosIHVlOwogICAgICAgIGlmIChtZSkgewogICAgICAgICAgICBsZXQga2UgPSBndDFbbWVdOwogICAgICAgICAgICBaZSA9IGtlLnZlcnRleFNoYWRlciwgayA9IGtlLmZyYWdtZW50U2hhZGVyOwogICAgICAgIH0gZWxzZSBaZSA9IHAudmVydGV4U2hhZGVyLCBrID0gcC5mcmFnbWVudFNoYWRlciwgSS51cGRhdGUocCksIEogPSBJLmdldFZlcnRleFNoYWRlcklEKHApLCB1ZSA9IEkuZ2V0RnJhZ21lbnRTaGFkZXJJRChwKTsKICAgICAgICBsZXQgaWUgPSBlLmdldFJlbmRlclRhcmdldCgpLCBFZSA9IGUuc3RhdGUuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpLCBCZSA9IFYuaXNJbnN0YW5jZWRNZXNoID09PSAhMCwgVGUgPSBWLmlzQmF0Y2hlZE1lc2ggPT09ICEwLCBqZSA9ICEhcC5tYXAsICRlID0gISFwLm1hdGNhcCwgVWUgPSAhIWosIG0gPSAhIXAuYW9NYXAsIHV0ID0gISFwLmxpZ2h0TWFwLCBEZSA9ICEhcC5idW1wTWFwLCB3ZSA9ICEhcC5ub3JtYWxNYXAsIF9lID0gISFwLmRpc3BsYWNlbWVudE1hcCwgWGUgPSAhIXAuZW1pc3NpdmVNYXAsIGhlID0gISFwLm1ldGFsbmVzc01hcCwgdSA9ICEhcC5yb3VnaG5lc3NNYXAsIGEgPSBwLmFuaXNvdHJvcHkgPiAwLCBiID0gcC5jbGVhcmNvYXQgPiAwLCBXID0gcC5kaXNwZXJzaW9uID4gMCwgSyA9IHAuaXJpZGVzY2VuY2UgPiAwLCBHID0gcC5zaGVlbiA+IDAsIHBlID0gcC50cmFuc21pc3Npb24gPiAwLCByZSA9IGEgJiYgISFwLmFuaXNvdHJvcHlNYXAsIGNlID0gYiAmJiAhIXAuY2xlYXJjb2F0TWFwLCB5ZSA9IGIgJiYgISFwLmNsZWFyY29hdE5vcm1hbE1hcCwgWiA9IGIgJiYgISFwLmNsZWFyY29hdFJvdWdobmVzc01hcCwgbGUgPSBLICYmICEhcC5pcmlkZXNjZW5jZU1hcCwgU2UgPSBLICYmICEhcC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgeGUgPSBHICYmICEhcC5zaGVlbkNvbG9yTWFwLCBmZSA9IEcgJiYgISFwLnNoZWVuUm91Z2huZXNzTWFwLCBJZSA9ICEhcC5zcGVjdWxhck1hcCwgYmUgPSAhIXAuc3BlY3VsYXJDb2xvck1hcCwgemUgPSAhIXAuc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHYgPSBwZSAmJiAhIXAudHJhbnNtaXNzaW9uTWFwLCB0ZSA9IHBlICYmICEhcC50aGlja25lc3NNYXAsIE4gPSAhIXAuZ3JhZGllbnRNYXAsIFggPSAhIXAuYWxwaGFNYXAsIG9lID0gcC5hbHBoYVRlc3QgPiAwLCBhZSA9ICEhcC5hbHBoYUhhc2gsIENlID0gISFwLmV4dGVuc2lvbnMsIFFlID0gVHA7CiAgICAgICAgcC50b25lTWFwcGVkICYmIChpZSA9PT0gbnVsbCB8fCBpZS5pc1hSUmVuZGVyVGFyZ2V0ID09PSAhMCkgJiYgKFFlID0gZS50b25lTWFwcGluZyk7CiAgICAgICAgbGV0IGF0ID0gewogICAgICAgICAgICBzaGFkZXJJRDogbWUsCiAgICAgICAgICAgIHNoYWRlclR5cGU6IHAudHlwZSwKICAgICAgICAgICAgc2hhZGVyTmFtZTogcC5uYW1lLAogICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFplLAogICAgICAgICAgICBmcmFnbWVudFNoYWRlcjogaywKICAgICAgICAgICAgZGVmaW5lczogcC5kZWZpbmVzLAogICAgICAgICAgICBjdXN0b21WZXJ0ZXhTaGFkZXJJRDogSiwKICAgICAgICAgICAgY3VzdG9tRnJhZ21lbnRTaGFkZXJJRDogdWUsCiAgICAgICAgICAgIGlzUmF3U2hhZGVyTWF0ZXJpYWw6IHAuaXNSYXdTaGFkZXJNYXRlcmlhbCA9PT0gITAsCiAgICAgICAgICAgIGdsc2xWZXJzaW9uOiBwLmdsc2xWZXJzaW9uLAogICAgICAgICAgICBwcmVjaXNpb246IHgxLAogICAgICAgICAgICBiYXRjaGluZzogVGUsCiAgICAgICAgICAgIGJhdGNoaW5nQ29sb3I6IFRlICYmIFYuX2NvbG9yc1RleHR1cmUgIT09IG51bGwsCiAgICAgICAgICAgIGluc3RhbmNpbmc6IEJlLAogICAgICAgICAgICBpbnN0YW5jaW5nQ29sb3I6IEJlICYmIFYuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCwKICAgICAgICAgICAgaW5zdGFuY2luZ01vcnBoOiBCZSAmJiBWLm1vcnBoVGV4dHVyZSAhPT0gbnVsbCwKICAgICAgICAgICAgc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogUywKICAgICAgICAgICAgb3V0cHV0Q29sb3JTcGFjZTogaWUgPT09IG51bGwgPyBlLm91dHB1dENvbG9yU3BhY2UgOiBpZS5pc1hSUmVuZGVyVGFyZ2V0ID09PSAhMCA/IGllLnRleHR1cmUuY29sb3JTcGFjZSA6IGhhLAogICAgICAgICAgICBhbHBoYVRvQ292ZXJhZ2U6ICEhcC5hbHBoYVRvQ292ZXJhZ2UsCiAgICAgICAgICAgIG1hcDogamUsCiAgICAgICAgICAgIG1hdGNhcDogJGUsCiAgICAgICAgICAgIGVudk1hcDogVWUsCiAgICAgICAgICAgIGVudk1hcE1vZGU6IFVlICYmIGoubWFwcGluZywKICAgICAgICAgICAgZW52TWFwQ3ViZVVWSGVpZ2h0OiBGLAogICAgICAgICAgICBhb01hcDogbSwKICAgICAgICAgICAgbGlnaHRNYXA6IHV0LAogICAgICAgICAgICBidW1wTWFwOiBEZSwKICAgICAgICAgICAgbm9ybWFsTWFwOiB3ZSwKICAgICAgICAgICAgZGlzcGxhY2VtZW50TWFwOiBTICYmIF9lLAogICAgICAgICAgICBlbWlzc2l2ZU1hcDogWGUsCiAgICAgICAgICAgIG5vcm1hbE1hcE9iamVjdFNwYWNlOiB3ZSAmJiBwLm5vcm1hbE1hcFR5cGUgPT09IEdwLAogICAgICAgICAgICBub3JtYWxNYXBUYW5nZW50U3BhY2U6IHdlICYmIHAubm9ybWFsTWFwVHlwZSA9PT0gX2ksCiAgICAgICAgICAgIG1ldGFsbmVzc01hcDogaGUsCiAgICAgICAgICAgIHJvdWdobmVzc01hcDogdSwKICAgICAgICAgICAgYW5pc290cm9weTogYSwKICAgICAgICAgICAgYW5pc290cm9weU1hcDogcmUsCiAgICAgICAgICAgIGNsZWFyY29hdDogYiwKICAgICAgICAgICAgY2xlYXJjb2F0TWFwOiBjZSwKICAgICAgICAgICAgY2xlYXJjb2F0Tm9ybWFsTWFwOiB5ZSwKICAgICAgICAgICAgY2xlYXJjb2F0Um91Z2huZXNzTWFwOiBaLAogICAgICAgICAgICBkaXNwZXJzaW9uOiBXLAogICAgICAgICAgICBpcmlkZXNjZW5jZTogSywKICAgICAgICAgICAgaXJpZGVzY2VuY2VNYXA6IGxlLAogICAgICAgICAgICBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDogU2UsCiAgICAgICAgICAgIHNoZWVuOiBHLAogICAgICAgICAgICBzaGVlbkNvbG9yTWFwOiB4ZSwKICAgICAgICAgICAgc2hlZW5Sb3VnaG5lc3NNYXA6IGZlLAogICAgICAgICAgICBzcGVjdWxhck1hcDogSWUsCiAgICAgICAgICAgIHNwZWN1bGFyQ29sb3JNYXA6IGJlLAogICAgICAgICAgICBzcGVjdWxhckludGVuc2l0eU1hcDogemUsCiAgICAgICAgICAgIHRyYW5zbWlzc2lvbjogcGUsCiAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1hcDogdiwKICAgICAgICAgICAgdGhpY2tuZXNzTWFwOiB0ZSwKICAgICAgICAgICAgZ3JhZGllbnRNYXA6IE4sCiAgICAgICAgICAgIG9wYXF1ZTogcC50cmFuc3BhcmVudCA9PT0gITEgJiYgcC5ibGVuZGluZyA9PT0gZWEgJiYgcC5hbHBoYVRvQ292ZXJhZ2UgPT09ICExLAogICAgICAgICAgICBhbHBoYU1hcDogWCwKICAgICAgICAgICAgYWxwaGFUZXN0OiBvZSwKICAgICAgICAgICAgYWxwaGFIYXNoOiBhZSwKICAgICAgICAgICAgY29tYmluZTogcC5jb21iaW5lLAogICAgICAgICAgICBtYXBVdjogamUgJiYgTChwLm1hcC5jaGFubmVsKSwKICAgICAgICAgICAgYW9NYXBVdjogbSAmJiBMKHAuYW9NYXAuY2hhbm5lbCksCiAgICAgICAgICAgIGxpZ2h0TWFwVXY6IHV0ICYmIEwocC5saWdodE1hcC5jaGFubmVsKSwKICAgICAgICAgICAgYnVtcE1hcFV2OiBEZSAmJiBMKHAuYnVtcE1hcC5jaGFubmVsKSwKICAgICAgICAgICAgbm9ybWFsTWFwVXY6IHdlICYmIEwocC5ub3JtYWxNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIGRpc3BsYWNlbWVudE1hcFV2OiBfZSAmJiBMKHAuZGlzcGxhY2VtZW50TWFwLmNoYW5uZWwpLAogICAgICAgICAgICBlbWlzc2l2ZU1hcFV2OiBYZSAmJiBMKHAuZW1pc3NpdmVNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIG1ldGFsbmVzc01hcFV2OiBoZSAmJiBMKHAubWV0YWxuZXNzTWFwLmNoYW5uZWwpLAogICAgICAgICAgICByb3VnaG5lc3NNYXBVdjogdSAmJiBMKHAucm91Z2huZXNzTWFwLmNoYW5uZWwpLAogICAgICAgICAgICBhbmlzb3Ryb3B5TWFwVXY6IHJlICYmIEwocC5hbmlzb3Ryb3B5TWFwLmNoYW5uZWwpLAogICAgICAgICAgICBjbGVhcmNvYXRNYXBVdjogY2UgJiYgTChwLmNsZWFyY29hdE1hcC5jaGFubmVsKSwKICAgICAgICAgICAgY2xlYXJjb2F0Tm9ybWFsTWFwVXY6IHllICYmIEwocC5jbGVhcmNvYXROb3JtYWxNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIGNsZWFyY29hdFJvdWdobmVzc01hcFV2OiBaICYmIEwocC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIGlyaWRlc2NlbmNlTWFwVXY6IGxlICYmIEwocC5pcmlkZXNjZW5jZU1hcC5jaGFubmVsKSwKICAgICAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjogU2UgJiYgTChwLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmNoYW5uZWwpLAogICAgICAgICAgICBzaGVlbkNvbG9yTWFwVXY6IHhlICYmIEwocC5zaGVlbkNvbG9yTWFwLmNoYW5uZWwpLAogICAgICAgICAgICBzaGVlblJvdWdobmVzc01hcFV2OiBmZSAmJiBMKHAuc2hlZW5Sb3VnaG5lc3NNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIHNwZWN1bGFyTWFwVXY6IEllICYmIEwocC5zcGVjdWxhck1hcC5jaGFubmVsKSwKICAgICAgICAgICAgc3BlY3VsYXJDb2xvck1hcFV2OiBiZSAmJiBMKHAuc3BlY3VsYXJDb2xvck1hcC5jaGFubmVsKSwKICAgICAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHlNYXBVdjogemUgJiYgTChwLnNwZWN1bGFySW50ZW5zaXR5TWFwLmNoYW5uZWwpLAogICAgICAgICAgICB0cmFuc21pc3Npb25NYXBVdjogdiAmJiBMKHAudHJhbnNtaXNzaW9uTWFwLmNoYW5uZWwpLAogICAgICAgICAgICB0aGlja25lc3NNYXBVdjogdGUgJiYgTChwLnRoaWNrbmVzc01hcC5jaGFubmVsKSwKICAgICAgICAgICAgYWxwaGFNYXBVdjogWCAmJiBMKHAuYWxwaGFNYXAuY2hhbm5lbCksCiAgICAgICAgICAgIHZlcnRleFRhbmdlbnRzOiAhIVEuYXR0cmlidXRlcy50YW5nZW50ICYmICh3ZSB8fCBhKSwKICAgICAgICAgICAgdmVydGV4Q29sb3JzOiBwLnZlcnRleENvbG9ycywKICAgICAgICAgICAgdmVydGV4QWxwaGFzOiBwLnZlcnRleENvbG9ycyA9PT0gITAgJiYgISFRLmF0dHJpYnV0ZXMuY29sb3IgJiYgUS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplID09PSA0LAogICAgICAgICAgICBwb2ludHNVdnM6IFYuaXNQb2ludHMgPT09ICEwICYmICEhUS5hdHRyaWJ1dGVzLnV2ICYmIChqZSB8fCBYKSwKICAgICAgICAgICAgZm9nOiAhIVksCiAgICAgICAgICAgIHVzZUZvZzogcC5mb2cgPT09ICEwLAogICAgICAgICAgICBmb2dFeHAyOiAhIVkgJiYgWS5pc0ZvZ0V4cDIsCiAgICAgICAgICAgIGZsYXRTaGFkaW5nOiBwLmZsYXRTaGFkaW5nID09PSAhMCwKICAgICAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBwLnNpemVBdHRlbnVhdGlvbiA9PT0gITAsCiAgICAgICAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IFIsCiAgICAgICAgICAgIHJldmVyc2VEZXB0aEJ1ZmZlcjogRWUsCiAgICAgICAgICAgIHNraW5uaW5nOiBWLmlzU2tpbm5lZE1lc2ggPT09ICEwLAogICAgICAgICAgICBtb3JwaFRhcmdldHM6IFEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB2b2lkIDAsCiAgICAgICAgICAgIG1vcnBoTm9ybWFsczogUS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB2b2lkIDAsCiAgICAgICAgICAgIG1vcnBoQ29sb3JzOiBRLm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdm9pZCAwLAogICAgICAgICAgICBtb3JwaFRhcmdldHNDb3VudDogTGUsCiAgICAgICAgICAgIG1vcnBoVGV4dHVyZVN0cmlkZTogR2UsCiAgICAgICAgICAgIG51bURpckxpZ2h0czogZi5kaXJlY3Rpb25hbC5sZW5ndGgsCiAgICAgICAgICAgIG51bVBvaW50TGlnaHRzOiBmLnBvaW50Lmxlbmd0aCwKICAgICAgICAgICAgbnVtU3BvdExpZ2h0czogZi5zcG90Lmxlbmd0aCwKICAgICAgICAgICAgbnVtU3BvdExpZ2h0TWFwczogZi5zcG90TGlnaHRNYXAubGVuZ3RoLAogICAgICAgICAgICBudW1SZWN0QXJlYUxpZ2h0czogZi5yZWN0QXJlYS5sZW5ndGgsCiAgICAgICAgICAgIG51bUhlbWlMaWdodHM6IGYuaGVtaS5sZW5ndGgsCiAgICAgICAgICAgIG51bURpckxpZ2h0U2hhZG93czogZi5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsCiAgICAgICAgICAgIG51bVBvaW50TGlnaHRTaGFkb3dzOiBmLnBvaW50U2hhZG93TWFwLmxlbmd0aCwKICAgICAgICAgICAgbnVtU3BvdExpZ2h0U2hhZG93czogZi5zcG90U2hhZG93TWFwLmxlbmd0aCwKICAgICAgICAgICAgbnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOiBmLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcywKICAgICAgICAgICAgbnVtTGlnaHRQcm9iZXM6IGYubnVtTGlnaHRQcm9iZXMsCiAgICAgICAgICAgIG51bUNsaXBwaW5nUGxhbmVzOiBoLm51bVBsYW5lcywKICAgICAgICAgICAgbnVtQ2xpcEludGVyc2VjdGlvbjogaC5udW1JbnRlcnNlY3Rpb24sCiAgICAgICAgICAgIGRpdGhlcmluZzogcC5kaXRoZXJpbmcsCiAgICAgICAgICAgIHNoYWRvd01hcEVuYWJsZWQ6IGUuc2hhZG93TWFwLmVuYWJsZWQgJiYgQS5sZW5ndGggPiAwLAogICAgICAgICAgICBzaGFkb3dNYXBUeXBlOiBlLnNoYWRvd01hcC50eXBlLAogICAgICAgICAgICB0b25lTWFwcGluZzogUWUsCiAgICAgICAgICAgIGRlY29kZVZpZGVvVGV4dHVyZTogamUgJiYgcC5tYXAuaXNWaWRlb1RleHR1cmUgPT09ICEwICYmIFR0LmdldFRyYW5zZmVyKHAubWFwLmNvbG9yU3BhY2UpID09PSBGbiwKICAgICAgICAgICAgZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmU6IFhlICYmIHAuZW1pc3NpdmVNYXAuaXNWaWRlb1RleHR1cmUgPT09ICEwICYmIFR0LmdldFRyYW5zZmVyKHAuZW1pc3NpdmVNYXAuY29sb3JTcGFjZSkgPT09IEZuLAogICAgICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IHAucHJlbXVsdGlwbGllZEFscGhhLAogICAgICAgICAgICBkb3VibGVTaWRlZDogcC5zaWRlID09PSBZZCwKICAgICAgICAgICAgZmxpcFNpZGVkOiBwLnNpZGUgPT09IEFsLAogICAgICAgICAgICB1c2VEZXB0aFBhY2tpbmc6IHAuZGVwdGhQYWNraW5nID49IDAsCiAgICAgICAgICAgIGRlcHRoUGFja2luZzogcC5kZXB0aFBhY2tpbmcgfHwgMCwKICAgICAgICAgICAgaW5kZXgwQXR0cmlidXRlTmFtZTogcC5pbmRleDBBdHRyaWJ1dGVOYW1lLAogICAgICAgICAgICBleHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlOiBDZSAmJiBwLmV4dGVuc2lvbnMuY2xpcEN1bGxEaXN0YW5jZSA9PT0gITAgJiYgaS5oYXMoIldFQkdMX2NsaXBfY3VsbF9kaXN0YW5jZSIpLAogICAgICAgICAgICBleHRlbnNpb25NdWx0aURyYXc6IChDZSAmJiBwLmV4dGVuc2lvbnMubXVsdGlEcmF3ID09PSAhMCB8fCBUZSkgJiYgaS5oYXMoIldFQkdMX211bHRpX2RyYXciKSwKICAgICAgICAgICAgcmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6IGkuaGFzKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSwKICAgICAgICAgICAgY3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBwLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gYXQudmVydGV4VXYxcyA9IFQuaGFzKDEpLCBhdC52ZXJ0ZXhVdjJzID0gVC5oYXMoMiksIGF0LnZlcnRleFV2M3MgPSBULmhhcygzKSwgVC5jbGVhcigpLCBhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHIocCkgewogICAgICAgIGxldCBmID0gW107CiAgICAgICAgaWYgKHAuc2hhZGVySUQgPyBmLnB1c2gocC5zaGFkZXJJRCkgOiAoZi5wdXNoKHAuY3VzdG9tVmVydGV4U2hhZGVySUQpLCBmLnB1c2gocC5jdXN0b21GcmFnbWVudFNoYWRlcklEKSksIHAuZGVmaW5lcyAhPT0gdm9pZCAwKSBmb3IobGV0IEEgaW4gcC5kZWZpbmVzKWYucHVzaChBKSwgZi5wdXNoKHAuZGVmaW5lc1tBXSk7CiAgICAgICAgcmV0dXJuIHAuaXNSYXdTaGFkZXJNYXRlcmlhbCA9PT0gITEgJiYgKHcoZiwgcCksIE0oZiwgcCksIGYucHVzaChlLm91dHB1dENvbG9yU3BhY2UpKSwgZi5wdXNoKHAuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSwgZi5qb2luKCk7CiAgICB9CiAgICBmdW5jdGlvbiB3KHAsIGYpIHsKICAgICAgICBwLnB1c2goZi5wcmVjaXNpb24pLCBwLnB1c2goZi5vdXRwdXRDb2xvclNwYWNlKSwgcC5wdXNoKGYuZW52TWFwTW9kZSksIHAucHVzaChmLmVudk1hcEN1YmVVVkhlaWdodCksIHAucHVzaChmLm1hcFV2KSwgcC5wdXNoKGYuYWxwaGFNYXBVdiksIHAucHVzaChmLmxpZ2h0TWFwVXYpLCBwLnB1c2goZi5hb01hcFV2KSwgcC5wdXNoKGYuYnVtcE1hcFV2KSwgcC5wdXNoKGYubm9ybWFsTWFwVXYpLCBwLnB1c2goZi5kaXNwbGFjZW1lbnRNYXBVdiksIHAucHVzaChmLmVtaXNzaXZlTWFwVXYpLCBwLnB1c2goZi5tZXRhbG5lc3NNYXBVdiksIHAucHVzaChmLnJvdWdobmVzc01hcFV2KSwgcC5wdXNoKGYuYW5pc290cm9weU1hcFV2KSwgcC5wdXNoKGYuY2xlYXJjb2F0TWFwVXYpLCBwLnB1c2goZi5jbGVhcmNvYXROb3JtYWxNYXBVdiksIHAucHVzaChmLmNsZWFyY29hdFJvdWdobmVzc01hcFV2KSwgcC5wdXNoKGYuaXJpZGVzY2VuY2VNYXBVdiksIHAucHVzaChmLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYpLCBwLnB1c2goZi5zaGVlbkNvbG9yTWFwVXYpLCBwLnB1c2goZi5zaGVlblJvdWdobmVzc01hcFV2KSwgcC5wdXNoKGYuc3BlY3VsYXJNYXBVdiksIHAucHVzaChmLnNwZWN1bGFyQ29sb3JNYXBVdiksIHAucHVzaChmLnNwZWN1bGFySW50ZW5zaXR5TWFwVXYpLCBwLnB1c2goZi50cmFuc21pc3Npb25NYXBVdiksIHAucHVzaChmLnRoaWNrbmVzc01hcFV2KSwgcC5wdXNoKGYuY29tYmluZSksIHAucHVzaChmLmZvZ0V4cDIpLCBwLnB1c2goZi5zaXplQXR0ZW51YXRpb24pLCBwLnB1c2goZi5tb3JwaFRhcmdldHNDb3VudCksIHAucHVzaChmLm1vcnBoQXR0cmlidXRlQ291bnQpLCBwLnB1c2goZi5udW1EaXJMaWdodHMpLCBwLnB1c2goZi5udW1Qb2ludExpZ2h0cyksIHAucHVzaChmLm51bVNwb3RMaWdodHMpLCBwLnB1c2goZi5udW1TcG90TGlnaHRNYXBzKSwgcC5wdXNoKGYubnVtSGVtaUxpZ2h0cyksIHAucHVzaChmLm51bVJlY3RBcmVhTGlnaHRzKSwgcC5wdXNoKGYubnVtRGlyTGlnaHRTaGFkb3dzKSwgcC5wdXNoKGYubnVtUG9pbnRMaWdodFNoYWRvd3MpLCBwLnB1c2goZi5udW1TcG90TGlnaHRTaGFkb3dzKSwgcC5wdXNoKGYubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKSwgcC5wdXNoKGYubnVtTGlnaHRQcm9iZXMpLCBwLnB1c2goZi5zaGFkb3dNYXBUeXBlKSwgcC5wdXNoKGYudG9uZU1hcHBpbmcpLCBwLnB1c2goZi5udW1DbGlwcGluZ1BsYW5lcyksIHAucHVzaChmLm51bUNsaXBJbnRlcnNlY3Rpb24pLCBwLnB1c2goZi5kZXB0aFBhY2tpbmcpOwogICAgfQogICAgZnVuY3Rpb24gTShwLCBmKSB7CiAgICAgICAgZC5kaXNhYmxlQWxsKCksIGYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyAmJiBkLmVuYWJsZSgwKSwgZi5pbnN0YW5jaW5nICYmIGQuZW5hYmxlKDEpLCBmLmluc3RhbmNpbmdDb2xvciAmJiBkLmVuYWJsZSgyKSwgZi5pbnN0YW5jaW5nTW9ycGggJiYgZC5lbmFibGUoMyksIGYubWF0Y2FwICYmIGQuZW5hYmxlKDQpLCBmLmVudk1hcCAmJiBkLmVuYWJsZSg1KSwgZi5ub3JtYWxNYXBPYmplY3RTcGFjZSAmJiBkLmVuYWJsZSg2KSwgZi5ub3JtYWxNYXBUYW5nZW50U3BhY2UgJiYgZC5lbmFibGUoNyksIGYuY2xlYXJjb2F0ICYmIGQuZW5hYmxlKDgpLCBmLmlyaWRlc2NlbmNlICYmIGQuZW5hYmxlKDkpLCBmLmFscGhhVGVzdCAmJiBkLmVuYWJsZSgxMCksIGYudmVydGV4Q29sb3JzICYmIGQuZW5hYmxlKDExKSwgZi52ZXJ0ZXhBbHBoYXMgJiYgZC5lbmFibGUoMTIpLCBmLnZlcnRleFV2MXMgJiYgZC5lbmFibGUoMTMpLCBmLnZlcnRleFV2MnMgJiYgZC5lbmFibGUoMTQpLCBmLnZlcnRleFV2M3MgJiYgZC5lbmFibGUoMTUpLCBmLnZlcnRleFRhbmdlbnRzICYmIGQuZW5hYmxlKDE2KSwgZi5hbmlzb3Ryb3B5ICYmIGQuZW5hYmxlKDE3KSwgZi5hbHBoYUhhc2ggJiYgZC5lbmFibGUoMTgpLCBmLmJhdGNoaW5nICYmIGQuZW5hYmxlKDE5KSwgZi5kaXNwZXJzaW9uICYmIGQuZW5hYmxlKDIwKSwgZi5iYXRjaGluZ0NvbG9yICYmIGQuZW5hYmxlKDIxKSwgcC5wdXNoKGQubWFzayksIGQuZGlzYWJsZUFsbCgpLCBmLmZvZyAmJiBkLmVuYWJsZSgwKSwgZi51c2VGb2cgJiYgZC5lbmFibGUoMSksIGYuZmxhdFNoYWRpbmcgJiYgZC5lbmFibGUoMiksIGYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiBkLmVuYWJsZSgzKSwgZi5yZXZlcnNlRGVwdGhCdWZmZXIgJiYgZC5lbmFibGUoNCksIGYuc2tpbm5pbmcgJiYgZC5lbmFibGUoNSksIGYubW9ycGhUYXJnZXRzICYmIGQuZW5hYmxlKDYpLCBmLm1vcnBoTm9ybWFscyAmJiBkLmVuYWJsZSg3KSwgZi5tb3JwaENvbG9ycyAmJiBkLmVuYWJsZSg4KSwgZi5wcmVtdWx0aXBsaWVkQWxwaGEgJiYgZC5lbmFibGUoOSksIGYuc2hhZG93TWFwRW5hYmxlZCAmJiBkLmVuYWJsZSgxMCksIGYuZG91YmxlU2lkZWQgJiYgZC5lbmFibGUoMTEpLCBmLmZsaXBTaWRlZCAmJiBkLmVuYWJsZSgxMiksIGYudXNlRGVwdGhQYWNraW5nICYmIGQuZW5hYmxlKDEzKSwgZi5kaXRoZXJpbmcgJiYgZC5lbmFibGUoMTQpLCBmLnRyYW5zbWlzc2lvbiAmJiBkLmVuYWJsZSgxNSksIGYuc2hlZW4gJiYgZC5lbmFibGUoMTYpLCBmLm9wYXF1ZSAmJiBkLmVuYWJsZSgxNyksIGYucG9pbnRzVXZzICYmIGQuZW5hYmxlKDE4KSwgZi5kZWNvZGVWaWRlb1RleHR1cmUgJiYgZC5lbmFibGUoMTkpLCBmLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlICYmIGQuZW5hYmxlKDIwKSwgZi5hbHBoYVRvQ292ZXJhZ2UgJiYgZC5lbmFibGUoMjEpLCBwLnB1c2goZC5tYXNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIF8ocCkgewogICAgICAgIGxldCBmID0gT1twLnR5cGVdLCBBOwogICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgIGxldCBxID0gZ3QxW2ZdOwogICAgICAgICAgICBBID0ga2YuY2xvbmUocS51bmlmb3Jtcyk7CiAgICAgICAgfSBlbHNlIEEgPSBwLnVuaWZvcm1zOwogICAgICAgIHJldHVybiBBOwogICAgfQogICAgZnVuY3Rpb24gSChwLCBmKSB7CiAgICAgICAgbGV0IEE7CiAgICAgICAgZm9yKGxldCBxID0gMCwgViA9IEMubGVuZ3RoOyBxIDwgVjsgcSsrKXsKICAgICAgICAgICAgbGV0IFkgPSBDW3FdOwogICAgICAgICAgICBpZiAoWS5jYWNoZUtleSA9PT0gZikgewogICAgICAgICAgICAgICAgQSA9IFksICsrQS51c2VkVGltZXM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gQSA9PT0gdm9pZCAwICYmIChBID0gbmV3IF9mMShlLCBmLCBwLCBzKSwgQy5wdXNoKEEpKSwgQTsKICAgIH0KICAgIGZ1bmN0aW9uIFAocCkgewogICAgICAgIGlmICgtLXAudXNlZFRpbWVzID09PSAwKSB7CiAgICAgICAgICAgIGxldCBmID0gQy5pbmRleE9mKHApOwogICAgICAgICAgICBDW2ZdID0gQ1tDLmxlbmd0aCAtIDFdLCBDLnBvcCgpLCBwLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB5MShwKSB7CiAgICAgICAgSS5yZW1vdmUocCk7CiAgICB9CiAgICBmdW5jdGlvbiBCKCkgewogICAgICAgIEkuZGlzcG9zZSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRQYXJhbWV0ZXJzOiBsLAogICAgICAgIGdldFByb2dyYW1DYWNoZUtleTogciwKICAgICAgICBnZXRVbmlmb3JtczogXywKICAgICAgICBhY3F1aXJlUHJvZ3JhbTogSCwKICAgICAgICByZWxlYXNlUHJvZ3JhbTogUCwKICAgICAgICByZWxlYXNlU2hhZGVyQ2FjaGU6IHkxLAogICAgICAgIHByb2dyYW1zOiBDLAogICAgICAgIGRpc3Bvc2U6IEIKICAgIH07Cn0KZnVuY3Rpb24gU2YxKCkgewogICAgbGV0IGUgPSBuZXcgV2Vha01hcDsKICAgIGZ1bmN0aW9uIG4oaCkgewogICAgICAgIHJldHVybiBlLmhhcyhoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHQoaCkgewogICAgICAgIGxldCBkID0gZS5nZXQoaCk7CiAgICAgICAgcmV0dXJuIGQgPT09IHZvaWQgMCAmJiAoZCA9IHt9LCBlLnNldChoLCBkKSksIGQ7CiAgICB9CiAgICBmdW5jdGlvbiBpKGgpIHsKICAgICAgICBlLmRlbGV0ZShoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGMoaCwgZCwgSSkgewogICAgICAgIGUuZ2V0KGgpW2RdID0gSTsKICAgIH0KICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgZSA9IG5ldyBXZWFrTWFwOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBoYXM6IG4sCiAgICAgICAgZ2V0OiB0LAogICAgICAgIHJlbW92ZTogaSwKICAgICAgICB1cGRhdGU6IGMsCiAgICAgICAgZGlzcG9zZTogcwogICAgfTsKfQpmdW5jdGlvbiBFZjEoZSwgbikgewogICAgcmV0dXJuIGUuZ3JvdXBPcmRlciAhPT0gbi5ncm91cE9yZGVyID8gZS5ncm91cE9yZGVyIC0gbi5ncm91cE9yZGVyIDogZS5yZW5kZXJPcmRlciAhPT0gbi5yZW5kZXJPcmRlciA/IGUucmVuZGVyT3JkZXIgLSBuLnJlbmRlck9yZGVyIDogZS5tYXRlcmlhbC5pZCAhPT0gbi5tYXRlcmlhbC5pZCA/IGUubWF0ZXJpYWwuaWQgLSBuLm1hdGVyaWFsLmlkIDogZS56ICE9PSBuLnogPyBlLnogLSBuLnogOiBlLmlkIC0gbi5pZDsKfQpmdW5jdGlvbiBhcjEoZSwgbikgewogICAgcmV0dXJuIGUuZ3JvdXBPcmRlciAhPT0gbi5ncm91cE9yZGVyID8gZS5ncm91cE9yZGVyIC0gbi5ncm91cE9yZGVyIDogZS5yZW5kZXJPcmRlciAhPT0gbi5yZW5kZXJPcmRlciA/IGUucmVuZGVyT3JkZXIgLSBuLnJlbmRlck9yZGVyIDogZS56ICE9PSBuLnogPyBuLnogLSBlLnogOiBlLmlkIC0gbi5pZDsKfQpmdW5jdGlvbiBvcjEoKSB7CiAgICBsZXQgZSA9IFtdLCBuID0gMCwgdCA9IFtdLCBpID0gW10sIGMgPSBbXTsKICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgbiA9IDAsIHQubGVuZ3RoID0gMCwgaS5sZW5ndGggPSAwLCBjLmxlbmd0aCA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBoKFIsIFMsIHgxLCBPLCBMLCBsKSB7CiAgICAgICAgbGV0IHIgPSBlW25dOwogICAgICAgIHJldHVybiByID09PSB2b2lkIDAgPyAociA9IHsKICAgICAgICAgICAgaWQ6IFIuaWQsCiAgICAgICAgICAgIG9iamVjdDogUiwKICAgICAgICAgICAgZ2VvbWV0cnk6IFMsCiAgICAgICAgICAgIG1hdGVyaWFsOiB4MSwKICAgICAgICAgICAgZ3JvdXBPcmRlcjogTywKICAgICAgICAgICAgcmVuZGVyT3JkZXI6IFIucmVuZGVyT3JkZXIsCiAgICAgICAgICAgIHo6IEwsCiAgICAgICAgICAgIGdyb3VwOiBsCiAgICAgICAgfSwgZVtuXSA9IHIpIDogKHIuaWQgPSBSLmlkLCByLm9iamVjdCA9IFIsIHIuZ2VvbWV0cnkgPSBTLCByLm1hdGVyaWFsID0geDEsIHIuZ3JvdXBPcmRlciA9IE8sIHIucmVuZGVyT3JkZXIgPSBSLnJlbmRlck9yZGVyLCByLnogPSBMLCByLmdyb3VwID0gbCksIG4rKywgcjsKICAgIH0KICAgIGZ1bmN0aW9uIGQoUiwgUywgeDEsIE8sIEwsIGwpIHsKICAgICAgICBsZXQgciA9IGgoUiwgUywgeDEsIE8sIEwsIGwpOwogICAgICAgIHgxLnRyYW5zbWlzc2lvbiA+IDAgPyBpLnB1c2gocikgOiB4MS50cmFuc3BhcmVudCA9PT0gITAgPyBjLnB1c2gocikgOiB0LnB1c2gocik7CiAgICB9CiAgICBmdW5jdGlvbiBJKFIsIFMsIHgxLCBPLCBMLCBsKSB7CiAgICAgICAgbGV0IHIgPSBoKFIsIFMsIHgxLCBPLCBMLCBsKTsKICAgICAgICB4MS50cmFuc21pc3Npb24gPiAwID8gaS51bnNoaWZ0KHIpIDogeDEudHJhbnNwYXJlbnQgPT09ICEwID8gYy51bnNoaWZ0KHIpIDogdC51bnNoaWZ0KHIpOwogICAgfQogICAgZnVuY3Rpb24gVChSLCBTKSB7CiAgICAgICAgdC5sZW5ndGggPiAxICYmIHQuc29ydChSIHx8IEVmMSksIGkubGVuZ3RoID4gMSAmJiBpLnNvcnQoUyB8fCBhcjEpLCBjLmxlbmd0aCA+IDEgJiYgYy5zb3J0KFMgfHwgYXIxKTsKICAgIH0KICAgIGZ1bmN0aW9uIEMoKSB7CiAgICAgICAgZm9yKGxldCBSID0gbiwgUyA9IGUubGVuZ3RoOyBSIDwgUzsgUisrKXsKICAgICAgICAgICAgbGV0IHgxID0gZVtSXTsKICAgICAgICAgICAgaWYgKHgxLmlkID09PSBudWxsKSBicmVhazsKICAgICAgICAgICAgeDEuaWQgPSBudWxsLCB4MS5vYmplY3QgPSBudWxsLCB4MS5nZW9tZXRyeSA9IG51bGwsIHgxLm1hdGVyaWFsID0gbnVsbCwgeDEuZ3JvdXAgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgb3BhcXVlOiB0LAogICAgICAgIHRyYW5zbWlzc2l2ZTogaSwKICAgICAgICB0cmFuc3BhcmVudDogYywKICAgICAgICBpbml0OiBzLAogICAgICAgIHB1c2g6IGQsCiAgICAgICAgdW5zaGlmdDogSSwKICAgICAgICBmaW5pc2g6IEMsCiAgICAgICAgc29ydDogVAogICAgfTsKfQpmdW5jdGlvbiBNZjEoKSB7CiAgICBsZXQgZSA9IG5ldyBXZWFrTWFwOwogICAgZnVuY3Rpb24gbihpLCBjKSB7CiAgICAgICAgbGV0IHMgPSBlLmdldChpKSwgaDsKICAgICAgICByZXR1cm4gcyA9PT0gdm9pZCAwID8gKGggPSBuZXcgb3IxLCBlLnNldChpLCBbCiAgICAgICAgICAgIGgKICAgICAgICBdKSkgOiBjID49IHMubGVuZ3RoID8gKGggPSBuZXcgb3IxLCBzLnB1c2goaCkpIDogaCA9IHNbY10sIGg7CiAgICB9CiAgICBmdW5jdGlvbiB0KCkgewogICAgICAgIGUgPSBuZXcgV2Vha01hcDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgZ2V0OiBuLAogICAgICAgIGRpc3Bvc2U6IHQKICAgIH07Cn0KZnVuY3Rpb24gVGYxKCkgewogICAgbGV0IGUgPSB7fTsKICAgIHJldHVybiB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIGlmIChlW24uaWRdICE9PSB2b2lkIDApIHJldHVybiBlW24uaWRdOwogICAgICAgICAgICBsZXQgdDsKICAgICAgICAgICAgc3dpdGNoKG4udHlwZSl7CiAgICAgICAgICAgICAgICBjYXNlICJEaXJlY3Rpb25hbExpZ2h0IjoKICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IG5ldyB3LAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogbmV3IFAKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiU3BvdExpZ2h0IjoKICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IHcsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogbmV3IHcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBuZXcgUCwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmVDb3M6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHBlbnVtYnJhQ29zOiAwLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNheTogMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IHcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBuZXcgUCwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2F5OiAwCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIkhlbWlzcGhlcmVMaWdodCI6CiAgICAgICAgICAgICAgICAgICAgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBuZXcgdywKICAgICAgICAgICAgICAgICAgICAgICAgc2t5Q29sb3I6IG5ldyBQLAogICAgICAgICAgICAgICAgICAgICAgICBncm91bmRDb2xvcjogbmV3IFAKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiUmVjdEFyZWFMaWdodCI6CiAgICAgICAgICAgICAgICAgICAgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IG5ldyBQLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IHcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZXaWR0aDogbmV3IHcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZIZWlnaHQ6IG5ldyB3CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZVtuLmlkXSA9IHQsIHQ7CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiB4ZjEoKSB7CiAgICBsZXQgZSA9IHt9OwogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgaWYgKGVbbi5pZF0gIT09IHZvaWQgMCkgcmV0dXJuIGVbbi5pZF07CiAgICAgICAgICAgIGxldCB0OwogICAgICAgICAgICBzd2l0Y2gobi50eXBlKXsKICAgICAgICAgICAgICAgIGNhc2UgIkRpcmVjdGlvbmFsTGlnaHQiOgogICAgICAgICAgICAgICAgICAgIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0ludGVuc2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93QmlhczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Tm9ybWFsQmlhczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dNYXBTaXplOiBuZXcgVAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJTcG90TGlnaHQiOgogICAgICAgICAgICAgICAgICAgIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0ludGVuc2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93QmlhczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93Tm9ybWFsQmlhczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93UmFkaXVzOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dNYXBTaXplOiBuZXcgVAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dJbnRlbnNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0JpYXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd05vcm1hbEJpYXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hhZG93TWFwU2l6ZTogbmV3IFQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYU5lYXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0NhbWVyYUZhcjogMWUzCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZVtuLmlkXSA9IHQsIHQ7CiAgICAgICAgfQogICAgfTsKfQp2YXIgQWYxID0gMDsKZnVuY3Rpb24gUmYxKGUsIG4pIHsKICAgIHJldHVybiAobi5jYXN0U2hhZG93ID8gMiA6IDApIC0gKGUuY2FzdFNoYWRvdyA/IDIgOiAwKSArIChuLm1hcCA/IDEgOiAwKSAtIChlLm1hcCA/IDEgOiAwKTsKfQpmdW5jdGlvbiBDZjEoZSkgewogICAgbGV0IG4gPSBuZXcgVGYxLCB0ID0geGYxKCksIGkgPSB7CiAgICAgICAgdmVyc2lvbjogMCwKICAgICAgICBoYXNoOiB7CiAgICAgICAgICAgIGRpcmVjdGlvbmFsTGVuZ3RoOiAtMSwKICAgICAgICAgICAgcG9pbnRMZW5ndGg6IC0xLAogICAgICAgICAgICBzcG90TGVuZ3RoOiAtMSwKICAgICAgICAgICAgcmVjdEFyZWFMZW5ndGg6IC0xLAogICAgICAgICAgICBoZW1pTGVuZ3RoOiAtMSwKICAgICAgICAgICAgbnVtRGlyZWN0aW9uYWxTaGFkb3dzOiAtMSwKICAgICAgICAgICAgbnVtUG9pbnRTaGFkb3dzOiAtMSwKICAgICAgICAgICAgbnVtU3BvdFNoYWRvd3M6IC0xLAogICAgICAgICAgICBudW1TcG90TWFwczogLTEsCiAgICAgICAgICAgIG51bUxpZ2h0UHJvYmVzOiAtMQogICAgICAgIH0sCiAgICAgICAgYW1iaWVudDogWwogICAgICAgICAgICAwLAogICAgICAgICAgICAwLAogICAgICAgICAgICAwCiAgICAgICAgXSwKICAgICAgICBwcm9iZTogW10sCiAgICAgICAgZGlyZWN0aW9uYWw6IFtdLAogICAgICAgIGRpcmVjdGlvbmFsU2hhZG93OiBbXSwKICAgICAgICBkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sCiAgICAgICAgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLAogICAgICAgIHNwb3Q6IFtdLAogICAgICAgIHNwb3RMaWdodE1hcDogW10sCiAgICAgICAgc3BvdFNoYWRvdzogW10sCiAgICAgICAgc3BvdFNoYWRvd01hcDogW10sCiAgICAgICAgc3BvdExpZ2h0TWF0cml4OiBbXSwKICAgICAgICByZWN0QXJlYTogW10sCiAgICAgICAgcmVjdEFyZWFMVEMxOiBudWxsLAogICAgICAgIHJlY3RBcmVhTFRDMjogbnVsbCwKICAgICAgICBwb2ludDogW10sCiAgICAgICAgcG9pbnRTaGFkb3c6IFtdLAogICAgICAgIHBvaW50U2hhZG93TWFwOiBbXSwKICAgICAgICBwb2ludFNoYWRvd01hdHJpeDogW10sCiAgICAgICAgaGVtaTogW10sCiAgICAgICAgbnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOiAwLAogICAgICAgIG51bUxpZ2h0UHJvYmVzOiAwCiAgICB9OwogICAgZm9yKGxldCBUID0gMDsgVCA8IDk7IFQrKylpLnByb2JlLnB1c2gobmV3IHcpOwogICAgbGV0IGMgPSBuZXcgdywgcyA9IG5ldyBELCBoID0gbmV3IEQ7CiAgICBmdW5jdGlvbiBkKFQpIHsKICAgICAgICBsZXQgQyA9IDAsIFIgPSAwLCBTID0gMDsKICAgICAgICBmb3IobGV0IHAgPSAwOyBwIDwgOTsgcCsrKWkucHJvYmVbcF0uc2V0KDAsIDAsIDApOwogICAgICAgIGxldCB4MSA9IDAsIE8gPSAwLCBMID0gMCwgbCA9IDAsIHIgPSAwLCB3ID0gMCwgTSA9IDAsIF8gPSAwLCBIID0gMCwgUCA9IDAsIHkxID0gMDsKICAgICAgICBULnNvcnQoUmYxKTsKICAgICAgICBmb3IobGV0IHAgPSAwLCBmID0gVC5sZW5ndGg7IHAgPCBmOyBwKyspewogICAgICAgICAgICBsZXQgQSA9IFRbcF0sIHEgPSBBLmNvbG9yLCBWID0gQS5pbnRlbnNpdHksIFkgPSBBLmRpc3RhbmNlLCBRID0gQS5zaGFkb3cgJiYgQS5zaGFkb3cubWFwID8gQS5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsOwogICAgICAgICAgICBpZiAoQS5pc0FtYmllbnRMaWdodCkgQyArPSBxLnIgKiBWLCBSICs9IHEuZyAqIFYsIFMgKz0gcS5iICogVjsKICAgICAgICAgICAgZWxzZSBpZiAoQS5pc0xpZ2h0UHJvYmUpIHsKICAgICAgICAgICAgICAgIGZvcihsZXQgeiA9IDA7IHogPCA5OyB6KyspaS5wcm9iZVt6XS5hZGRTY2FsZWRWZWN0b3IoQS5zaC5jb2VmZmljaWVudHNbel0sIFYpOwogICAgICAgICAgICAgICAgeTErKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChBLmlzRGlyZWN0aW9uYWxMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IHogPSBuLmdldChBKTsKICAgICAgICAgICAgICAgIGlmICh6LmNvbG9yLmNvcHkoQS5jb2xvcikubXVsdGlwbHlTY2FsYXIoQS5pbnRlbnNpdHkpLCBBLmNhc3RTaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IEEuc2hhZG93LCBGID0gdC5nZXQoQSk7CiAgICAgICAgICAgICAgICAgICAgRi5zaGFkb3dJbnRlbnNpdHkgPSBqLmludGVuc2l0eSwgRi5zaGFkb3dCaWFzID0gai5iaWFzLCBGLnNoYWRvd05vcm1hbEJpYXMgPSBqLm5vcm1hbEJpYXMsIEYuc2hhZG93UmFkaXVzID0gai5yYWRpdXMsIEYuc2hhZG93TWFwU2l6ZSA9IGoubWFwU2l6ZSwgaS5kaXJlY3Rpb25hbFNoYWRvd1t4MV0gPSBGLCBpLmRpcmVjdGlvbmFsU2hhZG93TWFwW3gxXSA9IFEsIGkuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbeDFdID0gQS5zaGFkb3cubWF0cml4LCB3Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpLmRpcmVjdGlvbmFsW3gxXSA9IHosIHgxKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQS5pc1Nwb3RMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IHogPSBuLmdldChBKTsKICAgICAgICAgICAgICAgIHoucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKEEubWF0cml4V29ybGQpLCB6LmNvbG9yLmNvcHkocSkubXVsdGlwbHlTY2FsYXIoViksIHouZGlzdGFuY2UgPSBZLCB6LmNvbmVDb3MgPSBNYXRoLmNvcyhBLmFuZ2xlKSwgei5wZW51bWJyYUNvcyA9IE1hdGguY29zKEEuYW5nbGUgKiAoMSAtIEEucGVudW1icmEpKSwgei5kZWNheSA9IEEuZGVjYXksIGkuc3BvdFtMXSA9IHo7CiAgICAgICAgICAgICAgICBsZXQgaiA9IEEuc2hhZG93OwogICAgICAgICAgICAgICAgaWYgKEEubWFwICYmIChpLnNwb3RMaWdodE1hcFtIXSA9IEEubWFwLCBIKyssIGoudXBkYXRlTWF0cmljZXMoQSksIEEuY2FzdFNoYWRvdyAmJiBQKyspLCBpLnNwb3RMaWdodE1hdHJpeFtMXSA9IGoubWF0cml4LCBBLmNhc3RTaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgRiA9IHQuZ2V0KEEpOwogICAgICAgICAgICAgICAgICAgIEYuc2hhZG93SW50ZW5zaXR5ID0gai5pbnRlbnNpdHksIEYuc2hhZG93QmlhcyA9IGouYmlhcywgRi5zaGFkb3dOb3JtYWxCaWFzID0gai5ub3JtYWxCaWFzLCBGLnNoYWRvd1JhZGl1cyA9IGoucmFkaXVzLCBGLnNoYWRvd01hcFNpemUgPSBqLm1hcFNpemUsIGkuc3BvdFNoYWRvd1tMXSA9IEYsIGkuc3BvdFNoYWRvd01hcFtMXSA9IFEsIF8rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEwrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChBLmlzUmVjdEFyZWFMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IHogPSBuLmdldChBKTsKICAgICAgICAgICAgICAgIHouY29sb3IuY29weShxKS5tdWx0aXBseVNjYWxhcihWKSwgei5oYWxmV2lkdGguc2V0KEEud2lkdGggKiAuNSwgMCwgMCksIHouaGFsZkhlaWdodC5zZXQoMCwgQS5oZWlnaHQgKiAuNSwgMCksIGkucmVjdEFyZWFbbF0gPSB6LCBsKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQS5pc1BvaW50TGlnaHQpIHsKICAgICAgICAgICAgICAgIGxldCB6ID0gbi5nZXQoQSk7CiAgICAgICAgICAgICAgICBpZiAoei5jb2xvci5jb3B5KEEuY29sb3IpLm11bHRpcGx5U2NhbGFyKEEuaW50ZW5zaXR5KSwgei5kaXN0YW5jZSA9IEEuZGlzdGFuY2UsIHouZGVjYXkgPSBBLmRlY2F5LCBBLmNhc3RTaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IEEuc2hhZG93LCBGID0gdC5nZXQoQSk7CiAgICAgICAgICAgICAgICAgICAgRi5zaGFkb3dJbnRlbnNpdHkgPSBqLmludGVuc2l0eSwgRi5zaGFkb3dCaWFzID0gai5iaWFzLCBGLnNoYWRvd05vcm1hbEJpYXMgPSBqLm5vcm1hbEJpYXMsIEYuc2hhZG93UmFkaXVzID0gai5yYWRpdXMsIEYuc2hhZG93TWFwU2l6ZSA9IGoubWFwU2l6ZSwgRi5zaGFkb3dDYW1lcmFOZWFyID0gai5jYW1lcmEubmVhciwgRi5zaGFkb3dDYW1lcmFGYXIgPSBqLmNhbWVyYS5mYXIsIGkucG9pbnRTaGFkb3dbT10gPSBGLCBpLnBvaW50U2hhZG93TWFwW09dID0gUSwgaS5wb2ludFNoYWRvd01hdHJpeFtPXSA9IEEuc2hhZG93Lm1hdHJpeCwgTSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaS5wb2ludFtPXSA9IHosIE8rKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChBLmlzSGVtaXNwaGVyZUxpZ2h0KSB7CiAgICAgICAgICAgICAgICBsZXQgeiA9IG4uZ2V0KEEpOwogICAgICAgICAgICAgICAgei5za3lDb2xvci5jb3B5KEEuY29sb3IpLm11bHRpcGx5U2NhbGFyKFYpLCB6Lmdyb3VuZENvbG9yLmNvcHkoQS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoViksIGkuaGVtaVtyXSA9IHosIHIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsID4gMCAmJiAoZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpID09PSAhMCA/IChpLnJlY3RBcmVhTFRDMSA9IGVlMS5MVENfRkxPQVRfMSwgaS5yZWN0QXJlYUxUQzIgPSBlZTEuTFRDX0ZMT0FUXzIpIDogKGkucmVjdEFyZWFMVEMxID0gZWUxLkxUQ19IQUxGXzEsIGkucmVjdEFyZWFMVEMyID0gZWUxLkxUQ19IQUxGXzIpKSwgaS5hbWJpZW50WzBdID0gQywgaS5hbWJpZW50WzFdID0gUiwgaS5hbWJpZW50WzJdID0gUzsKICAgICAgICBsZXQgQiA9IGkuaGFzaDsKICAgICAgICAoQi5kaXJlY3Rpb25hbExlbmd0aCAhPT0geDEgfHwgQi5wb2ludExlbmd0aCAhPT0gTyB8fCBCLnNwb3RMZW5ndGggIT09IEwgfHwgQi5yZWN0QXJlYUxlbmd0aCAhPT0gbCB8fCBCLmhlbWlMZW5ndGggIT09IHIgfHwgQi5udW1EaXJlY3Rpb25hbFNoYWRvd3MgIT09IHcgfHwgQi5udW1Qb2ludFNoYWRvd3MgIT09IE0gfHwgQi5udW1TcG90U2hhZG93cyAhPT0gXyB8fCBCLm51bVNwb3RNYXBzICE9PSBIIHx8IEIubnVtTGlnaHRQcm9iZXMgIT09IHkxKSAmJiAoaS5kaXJlY3Rpb25hbC5sZW5ndGggPSB4MSwgaS5zcG90Lmxlbmd0aCA9IEwsIGkucmVjdEFyZWEubGVuZ3RoID0gbCwgaS5wb2ludC5sZW5ndGggPSBPLCBpLmhlbWkubGVuZ3RoID0gciwgaS5kaXJlY3Rpb25hbFNoYWRvdy5sZW5ndGggPSB3LCBpLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCA9IHcsIGkucG9pbnRTaGFkb3cubGVuZ3RoID0gTSwgaS5wb2ludFNoYWRvd01hcC5sZW5ndGggPSBNLCBpLnNwb3RTaGFkb3cubGVuZ3RoID0gXywgaS5zcG90U2hhZG93TWFwLmxlbmd0aCA9IF8sIGkuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoID0gdywgaS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBNLCBpLnNwb3RMaWdodE1hdHJpeC5sZW5ndGggPSBfICsgSCAtIFAsIGkuc3BvdExpZ2h0TWFwLmxlbmd0aCA9IEgsIGkubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzID0gUCwgaS5udW1MaWdodFByb2JlcyA9IHkxLCBCLmRpcmVjdGlvbmFsTGVuZ3RoID0geDEsIEIucG9pbnRMZW5ndGggPSBPLCBCLnNwb3RMZW5ndGggPSBMLCBCLnJlY3RBcmVhTGVuZ3RoID0gbCwgQi5oZW1pTGVuZ3RoID0gciwgQi5udW1EaXJlY3Rpb25hbFNoYWRvd3MgPSB3LCBCLm51bVBvaW50U2hhZG93cyA9IE0sIEIubnVtU3BvdFNoYWRvd3MgPSBfLCBCLm51bVNwb3RNYXBzID0gSCwgQi5udW1MaWdodFByb2JlcyA9IHkxLCBpLnZlcnNpb24gPSBBZjErKyk7CiAgICB9CiAgICBmdW5jdGlvbiBJKFQsIEMpIHsKICAgICAgICBsZXQgUiA9IDAsIFMgPSAwLCB4MSA9IDAsIE8gPSAwLCBMID0gMCwgbCA9IEMubWF0cml4V29ybGRJbnZlcnNlOwogICAgICAgIGZvcihsZXQgciA9IDAsIHcgPSBULmxlbmd0aDsgciA8IHc7IHIrKyl7CiAgICAgICAgICAgIGxldCBNID0gVFtyXTsKICAgICAgICAgICAgaWYgKE0uaXNEaXJlY3Rpb25hbExpZ2h0KSB7CiAgICAgICAgICAgICAgICBsZXQgXyA9IGkuZGlyZWN0aW9uYWxbUl07CiAgICAgICAgICAgICAgICBfLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oTS5tYXRyaXhXb3JsZCksIGMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKE0udGFyZ2V0Lm1hdHJpeFdvcmxkKSwgXy5kaXJlY3Rpb24uc3ViKGMpLCBfLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24obCksIFIrKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChNLmlzU3BvdExpZ2h0KSB7CiAgICAgICAgICAgICAgICBsZXQgXyA9IGkuc3BvdFt4MV07CiAgICAgICAgICAgICAgICBfLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihNLm1hdHJpeFdvcmxkKSwgXy5wb3NpdGlvbi5hcHBseU1hdHJpeDQobCksIF8uZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihNLm1hdHJpeFdvcmxkKSwgYy5zZXRGcm9tTWF0cml4UG9zaXRpb24oTS50YXJnZXQubWF0cml4V29ybGQpLCBfLmRpcmVjdGlvbi5zdWIoYyksIF8uZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihsKSwgeDErKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChNLmlzUmVjdEFyZWFMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IF8gPSBpLnJlY3RBcmVhW09dOwogICAgICAgICAgICAgICAgXy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oTS5tYXRyaXhXb3JsZCksIF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KGwpLCBoLmlkZW50aXR5KCksIHMuY29weShNLm1hdHJpeFdvcmxkKSwgcy5wcmVtdWx0aXBseShsKSwgaC5leHRyYWN0Um90YXRpb24ocyksIF8uaGFsZldpZHRoLnNldChNLndpZHRoICogLjUsIDAsIDApLCBfLmhhbGZIZWlnaHQuc2V0KDAsIE0uaGVpZ2h0ICogLjUsIDApLCBfLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQoaCksIF8uaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoaCksIE8rKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChNLmlzUG9pbnRMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IF8gPSBpLnBvaW50W1NdOwogICAgICAgICAgICAgICAgXy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oTS5tYXRyaXhXb3JsZCksIF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KGwpLCBTKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoTS5pc0hlbWlzcGhlcmVMaWdodCkgewogICAgICAgICAgICAgICAgbGV0IF8gPSBpLmhlbWlbTF07CiAgICAgICAgICAgICAgICBfLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oTS5tYXRyaXhXb3JsZCksIF8uZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihsKSwgTCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzZXR1cDogZCwKICAgICAgICBzZXR1cFZpZXc6IEksCiAgICAgICAgc3RhdGU6IGkKICAgIH07Cn0KZnVuY3Rpb24gc3IxKGUpIHsKICAgIGxldCBuID0gbmV3IENmMShlKSwgdCA9IFtdLCBpID0gW107CiAgICBmdW5jdGlvbiBjKEMpIHsKICAgICAgICBULmNhbWVyYSA9IEMsIHQubGVuZ3RoID0gMCwgaS5sZW5ndGggPSAwOwogICAgfQogICAgZnVuY3Rpb24gcyhDKSB7CiAgICAgICAgdC5wdXNoKEMpOwogICAgfQogICAgZnVuY3Rpb24gaChDKSB7CiAgICAgICAgaS5wdXNoKEMpOwogICAgfQogICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICBuLnNldHVwKHQpOwogICAgfQogICAgZnVuY3Rpb24gSShDKSB7CiAgICAgICAgbi5zZXR1cFZpZXcodCwgQyk7CiAgICB9CiAgICBsZXQgVCA9IHsKICAgICAgICBsaWdodHNBcnJheTogdCwKICAgICAgICBzaGFkb3dzQXJyYXk6IGksCiAgICAgICAgY2FtZXJhOiBudWxsLAogICAgICAgIGxpZ2h0czogbiwKICAgICAgICB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQ6IHt9CiAgICB9OwogICAgcmV0dXJuIHsKICAgICAgICBpbml0OiBjLAogICAgICAgIHN0YXRlOiBULAogICAgICAgIHNldHVwTGlnaHRzOiBkLAogICAgICAgIHNldHVwTGlnaHRzVmlldzogSSwKICAgICAgICBwdXNoTGlnaHQ6IHMsCiAgICAgICAgcHVzaFNoYWRvdzogaAogICAgfTsKfQpmdW5jdGlvbiBiZjEoZSkgewogICAgbGV0IG4gPSBuZXcgV2Vha01hcDsKICAgIGZ1bmN0aW9uIHQoYywgcyA9IDApIHsKICAgICAgICBsZXQgaCA9IG4uZ2V0KGMpLCBkOwogICAgICAgIHJldHVybiBoID09PSB2b2lkIDAgPyAoZCA9IG5ldyBzcjEoZSksIG4uc2V0KGMsIFsKICAgICAgICAgICAgZAogICAgICAgIF0pKSA6IHMgPj0gaC5sZW5ndGggPyAoZCA9IG5ldyBzcjEoZSksIGgucHVzaChkKSkgOiBkID0gaFtzXSwgZDsKICAgIH0KICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgbiA9IG5ldyBXZWFrTWFwOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6IHQsCiAgICAgICAgZGlzcG9zZTogaQogICAgfTsKfQp2YXIgUGYxID0gYHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCwgTGYgPSBgdW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7CnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKI2luY2x1ZGUgPHBhY2tpbmc+CnZvaWQgbWFpbigpIHsKCWNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTsKCWZsb2F0IG1lYW4gPSAwLjA7CglmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7CglmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7CglmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDsKCWZvciAoIGZsb2F0IGkgPSAwLjA7IGkgPCBzYW1wbGVzOyBpICsrICkgewoJCWZsb2F0IHV2T2Zmc2V0ID0gdXZTdGFydCArIGkgKiB1dlN0cmlkZTsKCQkjaWZkZWYgSE9SSVpPTlRBTF9QQVNTCgkJCXZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkaXN0cmlidXRpb24ueDsKCQkJc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54OwoJCSNlbHNlCgkJCWZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkZXB0aDsKCQkJc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7CgkJI2VuZGlmCgl9CgltZWFuID0gbWVhbiAvIHNhbXBsZXM7CglzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzOwoJZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApOwp9YDsKZnVuY3Rpb24gVWYoZSwgbiwgdCkgewogICAgbGV0IGkgPSBuZXcgc24sIGMgPSBuZXcgVCwgcyA9IG5ldyBULCBoID0gbmV3IG90LCBkID0gbmV3IGxvKHsKICAgICAgICBkZXB0aFBhY2tpbmc6IFdwCiAgICB9KSwgSSA9IG5ldyBjbywgVDEgPSB7fSwgQyA9IHQubWF4VGV4dHVyZVNpemUsIFIgPSB7CiAgICAgICAgW2RyXTogQWwsCiAgICAgICAgW0FsXTogZHIsCiAgICAgICAgW1lkXTogWWQKICAgIH0sIFMgPSBuZXcgcWkoewogICAgICAgIGRlZmluZXM6IHsKICAgICAgICAgICAgVlNNX1NBTVBMRVM6IDgKICAgICAgICB9LAogICAgICAgIHVuaWZvcm1zOiB7CiAgICAgICAgICAgIHNoYWRvd19wYXNzOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbAogICAgICAgICAgICB9LAogICAgICAgICAgICByZXNvbHV0aW9uOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IFQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmFkaXVzOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogNAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IFBmMSwKICAgICAgICBmcmFnbWVudFNoYWRlcjogTGYKICAgIH0pLCB4MSA9IFMuY2xvbmUoKTsKICAgIHgxLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTID0gMTsKICAgIGxldCBPID0gbmV3IEw7CiAgICBPLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgWihuZXcgRmxvYXQzMkFycmF5KFsKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAuNSwKICAgICAgICAzLAogICAgICAgIC0xLAogICAgICAgIC41LAogICAgICAgIC0xLAogICAgICAgIDMsCiAgICAgICAgLjUKICAgIF0pLCAzKSk7CiAgICBsZXQgTDEgPSBuZXcgQ3QoTywgUyksIGwgPSB0aGlzOwogICAgdGhpcy5lbmFibGVkID0gITEsIHRoaXMuYXV0b1VwZGF0ZSA9ICEwLCB0aGlzLm5lZWRzVXBkYXRlID0gITEsIHRoaXMudHlwZSA9IFhkOwogICAgbGV0IHIgPSB0aGlzLnR5cGU7CiAgICB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKFAsIHkxLCBCKSB7CiAgICAgICAgaWYgKGwuZW5hYmxlZCA9PT0gITEgfHwgbC5hdXRvVXBkYXRlID09PSAhMSAmJiBsLm5lZWRzVXBkYXRlID09PSAhMSB8fCBQLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwogICAgICAgIGxldCBwID0gZS5nZXRSZW5kZXJUYXJnZXQoKSwgZiA9IGUuZ2V0QWN0aXZlQ3ViZUZhY2UoKSwgQSA9IGUuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSwgcSA9IGUuc3RhdGU7CiAgICAgICAgcS5zZXRCbGVuZGluZyhVbCksIHEuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLCAxLCAxLCAxKSwgcS5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLCBxLnNldFNjaXNzb3JUZXN0KCExKTsKICAgICAgICBsZXQgViA9IHIgIT09IFpkICYmIHRoaXMudHlwZSA9PT0gWmQsIFkgPSByID09PSBaZCAmJiB0aGlzLnR5cGUgIT09IFpkOwogICAgICAgIGZvcihsZXQgUSA9IDAsIHogPSBQLmxlbmd0aDsgUSA8IHo7IFErKyl7CiAgICAgICAgICAgIGxldCBqID0gUFtRXSwgRiA9IGouc2hhZG93OwogICAgICAgICAgICBpZiAoRiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMU2hhZG93TWFwOiIsIGosICJoYXMgbm8gc2hhZG93LiIpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEYuYXV0b1VwZGF0ZSA9PT0gITEgJiYgRi5uZWVkc1VwZGF0ZSA9PT0gITEpIGNvbnRpbnVlOwogICAgICAgICAgICBjLmNvcHkoRi5tYXBTaXplKTsKICAgICAgICAgICAgbGV0IG1lID0gRi5nZXRGcmFtZUV4dGVudHMoKTsKICAgICAgICAgICAgaWYgKGMubXVsdGlwbHkobWUpLCBzLmNvcHkoRi5tYXBTaXplKSwgKGMueCA+IEMgfHwgYy55ID4gQykgJiYgKGMueCA+IEMgJiYgKHMueCA9IE1hdGguZmxvb3IoQyAvIG1lLngpLCBjLnggPSBzLnggKiBtZS54LCBGLm1hcFNpemUueCA9IHMueCksIGMueSA+IEMgJiYgKHMueSA9IE1hdGguZmxvb3IoQyAvIG1lLnkpLCBjLnkgPSBzLnkgKiBtZS55LCBGLm1hcFNpemUueSA9IHMueSkpLCBGLm1hcCA9PT0gbnVsbCB8fCBWID09PSAhMCB8fCBZID09PSAhMCkgewogICAgICAgICAgICAgICAgbGV0IExlID0gdGhpcy50eXBlICE9PSBaZCA/IHsKICAgICAgICAgICAgICAgICAgICBtaW5GaWx0ZXI6IFV0LAogICAgICAgICAgICAgICAgICAgIG1hZ0ZpbHRlcjogVXQKICAgICAgICAgICAgICAgIH0gOiB7fTsKICAgICAgICAgICAgICAgIEYubWFwICE9PSBudWxsICYmIEYubWFwLmRpc3Bvc2UoKSwgRi5tYXAgPSBuZXcgSGkoYy54LCBjLnksIExlKSwgRi5tYXAudGV4dHVyZS5uYW1lID0gai5uYW1lICsgIi5zaGFkb3dNYXAiLCBGLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZS5zZXRSZW5kZXJUYXJnZXQoRi5tYXApLCBlLmNsZWFyKCk7CiAgICAgICAgICAgIGxldCBNZSA9IEYuZ2V0Vmlld3BvcnRDb3VudCgpOwogICAgICAgICAgICBmb3IobGV0IExlID0gMDsgTGUgPCBNZTsgTGUrKyl7CiAgICAgICAgICAgICAgICBsZXQgR2UgPSBGLmdldFZpZXdwb3J0KExlKTsKICAgICAgICAgICAgICAgIGguc2V0KHMueCAqIEdlLngsIHMueSAqIEdlLnksIHMueCAqIEdlLnosIHMueSAqIEdlLncpLCBxLnZpZXdwb3J0KGgpLCBGLnVwZGF0ZU1hdHJpY2VzKGosIExlKSwgaSA9IEYuZ2V0RnJ1c3R1bSgpLCBfKHkxLCBCLCBGLmNhbWVyYSwgaiwgdGhpcy50eXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBGLmlzUG9pbnRMaWdodFNoYWRvdyAhPT0gITAgJiYgdGhpcy50eXBlID09PSBaZCAmJiB3KEYsIEIpLCBGLm5lZWRzVXBkYXRlID0gITE7CiAgICAgICAgfQogICAgICAgIHIgPSB0aGlzLnR5cGUsIGwubmVlZHNVcGRhdGUgPSAhMSwgZS5zZXRSZW5kZXJUYXJnZXQocCwgZiwgQSk7CiAgICB9OwogICAgZnVuY3Rpb24gdyhQLCB5MSkgewogICAgICAgIGxldCBCID0gbi51cGRhdGUoTDEpOwogICAgICAgIFMuZGVmaW5lcy5WU01fU0FNUExFUyAhPT0gUC5ibHVyU2FtcGxlcyAmJiAoUy5kZWZpbmVzLlZTTV9TQU1QTEVTID0gUC5ibHVyU2FtcGxlcywgeDEuZGVmaW5lcy5WU01fU0FNUExFUyA9IFAuYmx1clNhbXBsZXMsIFMubmVlZHNVcGRhdGUgPSAhMCwgeDEubmVlZHNVcGRhdGUgPSAhMCksIFAubWFwUGFzcyA9PT0gbnVsbCAmJiAoUC5tYXBQYXNzID0gbmV3IEhpKGMueCwgYy55KSksIFMudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBQLm1hcC50ZXh0dXJlLCBTLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBQLm1hcFNpemUsIFMudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gUC5yYWRpdXMsIGUuc2V0UmVuZGVyVGFyZ2V0KFAubWFwUGFzcyksIGUuY2xlYXIoKSwgZS5yZW5kZXJCdWZmZXJEaXJlY3QoeTEsIG51bGwsIEIsIFMsIEwxLCBudWxsKSwgeDEudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBQLm1hcFBhc3MudGV4dHVyZSwgeDEudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZSA9IFAubWFwU2l6ZSwgeDEudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gUC5yYWRpdXMsIGUuc2V0UmVuZGVyVGFyZ2V0KFAubWFwKSwgZS5jbGVhcigpLCBlLnJlbmRlckJ1ZmZlckRpcmVjdCh5MSwgbnVsbCwgQiwgeDEsIEwxLCBudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIE0oUCwgeTEsIEIsIHApIHsKICAgICAgICBsZXQgZiA9IG51bGwsIEEgPSBCLmlzUG9pbnRMaWdodCA9PT0gITAgPyBQLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwgOiBQLmN1c3RvbURlcHRoTWF0ZXJpYWw7CiAgICAgICAgaWYgKEEgIT09IHZvaWQgMCkgZiA9IEE7CiAgICAgICAgZWxzZSBpZiAoZiA9IEIuaXNQb2ludExpZ2h0ID09PSAhMCA/IEkgOiBkLCBlLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmIHkxLmNsaXBTaGFkb3dzID09PSAhMCAmJiBBcnJheS5pc0FycmF5KHkxLmNsaXBwaW5nUGxhbmVzKSAmJiB5MS5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgfHwgeTEuZGlzcGxhY2VtZW50TWFwICYmIHkxLmRpc3BsYWNlbWVudFNjYWxlICE9PSAwIHx8IHkxLmFscGhhTWFwICYmIHkxLmFscGhhVGVzdCA+IDAgfHwgeTEubWFwICYmIHkxLmFscGhhVGVzdCA+IDApIHsKICAgICAgICAgICAgbGV0IHEgPSBmLnV1aWQsIFYgPSB5MS51dWlkLCBZID0gVDFbcV07CiAgICAgICAgICAgIFkgPT09IHZvaWQgMCAmJiAoWSA9IHt9LCBUMVtxXSA9IFkpOwogICAgICAgICAgICBsZXQgUSA9IFlbVl07CiAgICAgICAgICAgIFEgPT09IHZvaWQgMCAmJiAoUSA9IGYuY2xvbmUoKSwgWVtWXSA9IFEsIHkxLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBIKSksIGYgPSBROwogICAgICAgIH0KICAgICAgICBpZiAoZi52aXNpYmxlID0geTEudmlzaWJsZSwgZi53aXJlZnJhbWUgPSB5MS53aXJlZnJhbWUsIHAgPT09IFpkID8gZi5zaWRlID0geTEuc2hhZG93U2lkZSAhPT0gbnVsbCA/IHkxLnNoYWRvd1NpZGUgOiB5MS5zaWRlIDogZi5zaWRlID0geTEuc2hhZG93U2lkZSAhPT0gbnVsbCA/IHkxLnNoYWRvd1NpZGUgOiBSW3kxLnNpZGVdLCBmLmFscGhhTWFwID0geTEuYWxwaGFNYXAsIGYuYWxwaGFUZXN0ID0geTEuYWxwaGFUZXN0LCBmLm1hcCA9IHkxLm1hcCwgZi5jbGlwU2hhZG93cyA9IHkxLmNsaXBTaGFkb3dzLCBmLmNsaXBwaW5nUGxhbmVzID0geTEuY2xpcHBpbmdQbGFuZXMsIGYuY2xpcEludGVyc2VjdGlvbiA9IHkxLmNsaXBJbnRlcnNlY3Rpb24sIGYuZGlzcGxhY2VtZW50TWFwID0geTEuZGlzcGxhY2VtZW50TWFwLCBmLmRpc3BsYWNlbWVudFNjYWxlID0geTEuZGlzcGxhY2VtZW50U2NhbGUsIGYuZGlzcGxhY2VtZW50QmlhcyA9IHkxLmRpc3BsYWNlbWVudEJpYXMsIGYud2lyZWZyYW1lTGluZXdpZHRoID0geTEud2lyZWZyYW1lTGluZXdpZHRoLCBmLmxpbmV3aWR0aCA9IHkxLmxpbmV3aWR0aCwgQi5pc1BvaW50TGlnaHQgPT09ICEwICYmIGYuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9PT0gITApIHsKICAgICAgICAgICAgbGV0IHEgPSBlLnByb3BlcnRpZXMuZ2V0KGYpOwogICAgICAgICAgICBxLmxpZ2h0ID0gQjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICBmdW5jdGlvbiBfKFAsIHkxLCBCLCBwLCBmKSB7CiAgICAgICAgaWYgKFAudmlzaWJsZSA9PT0gITEpIHJldHVybjsKICAgICAgICBpZiAoUC5sYXllcnMudGVzdCh5MS5sYXllcnMpICYmIChQLmlzTWVzaCB8fCBQLmlzTGluZSB8fCBQLmlzUG9pbnRzKSAmJiAoUC5jYXN0U2hhZG93IHx8IFAucmVjZWl2ZVNoYWRvdyAmJiBmID09PSBaZCkgJiYgKCFQLmZydXN0dW1DdWxsZWQgfHwgaS5pbnRlcnNlY3RzT2JqZWN0KFApKSkgewogICAgICAgICAgICBQLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKEIubWF0cml4V29ybGRJbnZlcnNlLCBQLm1hdHJpeFdvcmxkKTsKICAgICAgICAgICAgbGV0IFYgPSBuLnVwZGF0ZShQKSwgWSA9IFAubWF0ZXJpYWw7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KFkpKSB7CiAgICAgICAgICAgICAgICBsZXQgUSA9IFYuZ3JvdXBzOwogICAgICAgICAgICAgICAgZm9yKGxldCB6ID0gMCwgaiA9IFEubGVuZ3RoOyB6IDwgajsgeisrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgRiA9IFFbel0sIG1lID0gWVtGLm1hdGVyaWFsSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGlmIChtZSAmJiBtZS52aXNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBNZSA9IE0oUCwgbWUsIHAsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICBQLm9uQmVmb3JlU2hhZG93KGUsIFAsIHkxLCBCLCBWLCBNZSwgRiksIGUucmVuZGVyQnVmZmVyRGlyZWN0KEIsIG51bGwsIFYsIE1lLCBQLCBGKSwgUC5vbkFmdGVyU2hhZG93KGUsIFAsIHkxLCBCLCBWLCBNZSwgRik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKFkudmlzaWJsZSkgewogICAgICAgICAgICAgICAgbGV0IFEgPSBNKFAsIFksIHAsIGYpOwogICAgICAgICAgICAgICAgUC5vbkJlZm9yZVNoYWRvdyhlLCBQLCB5MSwgQiwgViwgUSwgbnVsbCksIGUucmVuZGVyQnVmZmVyRGlyZWN0KEIsIG51bGwsIFYsIFEsIFAsIG51bGwpLCBQLm9uQWZ0ZXJTaGFkb3coZSwgUCwgeTEsIEIsIFYsIFEsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBxID0gUC5jaGlsZHJlbjsKICAgICAgICBmb3IobGV0IFYgPSAwLCBZID0gcS5sZW5ndGg7IFYgPCBZOyBWKyspXyhxW1ZdLCB5MSwgQiwgcCwgZik7CiAgICB9CiAgICBmdW5jdGlvbiBIKFApIHsKICAgICAgICBQLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgSCk7CiAgICAgICAgZm9yKGxldCBCIGluIFQxKXsKICAgICAgICAgICAgbGV0IHAgPSBUMVtCXSwgZiA9IFAudGFyZ2V0LnV1aWQ7CiAgICAgICAgICAgIGYgaW4gcCAmJiAocFtmXS5kaXNwb3NlKCksIGRlbGV0ZSBwW2ZdKTsKICAgICAgICB9CiAgICB9Cn0KdmFyIERmID0gewogICAgW2dwXTogeHAsCiAgICBbYnBdOiBfcCwKICAgIFt3cF06IHZwLAogICAgW3JhXTogTXAsCiAgICBbeHBdOiBncCwKICAgIFtfcF06IGJwLAogICAgW3ZwXTogd3AsCiAgICBbTXBdOiByYQp9OwpmdW5jdGlvbiB3ZjEoZSwgbikgewogICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICBsZXQgdiA9ICExLCB0ZSA9IG5ldyBvdCwgTiA9IG51bGwsIFggPSBuZXcgb3QoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2V0TWFzazogZnVuY3Rpb24ob2UpIHsKICAgICAgICAgICAgICAgIE4gIT09IG9lICYmICF2ICYmIChlLmNvbG9yTWFzayhvZSwgb2UsIG9lLCBvZSksIE4gPSBvZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldExvY2tlZDogZnVuY3Rpb24ob2UpIHsKICAgICAgICAgICAgICAgIHYgPSBvZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0Q2xlYXI6IGZ1bmN0aW9uKG9lLCBhZSwgQ2UsIFFlLCBhdCkgewogICAgICAgICAgICAgICAgYXQgPT09ICEwICYmIChvZSAqPSBRZSwgYWUgKj0gUWUsIENlICo9IFFlKSwgdGUuc2V0KG9lLCBhZSwgQ2UsIFFlKSwgWC5lcXVhbHModGUpID09PSAhMSAmJiAoZS5jbGVhckNvbG9yKG9lLCBhZSwgQ2UsIFFlKSwgWC5jb3B5KHRlKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHYgPSAhMSwgTiA9IG51bGwsIFguc2V0KC0xLCAwLCAwLCAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBpKCkgewogICAgICAgIGxldCB2ID0gITEsIHRlID0gITEsIE4gPSBudWxsLCBYID0gbnVsbCwgb2UgPSBudWxsOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNldFJldmVyc2VkOiBmdW5jdGlvbihhZSkgewogICAgICAgICAgICAgICAgaWYgKHRlICE9PSBhZSkgewogICAgICAgICAgICAgICAgICAgIGxldCBDZSA9IG4uZ2V0KCJFWFRfY2xpcF9jb250cm9sIik7CiAgICAgICAgICAgICAgICAgICAgdGUgPyBDZS5jbGlwQ29udHJvbEVYVChDZS5MT1dFUl9MRUZUX0VYVCwgQ2UuWkVST19UT19PTkVfRVhUKSA6IENlLmNsaXBDb250cm9sRVhUKENlLkxPV0VSX0xFRlRfRVhULCBDZS5ORUdBVElWRV9PTkVfVE9fT05FX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IFFlID0gb2U7CiAgICAgICAgICAgICAgICAgICAgb2UgPSBudWxsLCB0aGlzLnNldENsZWFyKFFlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlID0gYWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldFJldmVyc2VkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0VGVzdDogZnVuY3Rpb24oYWUpIHsKICAgICAgICAgICAgICAgIGFlID8gaWUoZS5ERVBUSF9URVNUKSA6IEVlKGUuREVQVEhfVEVTVCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldE1hc2s6IGZ1bmN0aW9uKGFlKSB7CiAgICAgICAgICAgICAgICBOICE9PSBhZSAmJiAhdiAmJiAoZS5kZXB0aE1hc2soYWUpLCBOID0gYWUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXRGdW5jOiBmdW5jdGlvbihhZSkgewogICAgICAgICAgICAgICAgaWYgKHRlICYmIChhZSA9IERmW2FlXSksIFggIT09IGFlKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGFlKXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBncDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGVwdGhGdW5jKGUuTkVWRVIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRlcHRoRnVuYyhlLkFMV0FZUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBicDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGVwdGhGdW5jKGUuTEVTUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSByYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGVwdGhGdW5jKGUuTEVRVUFMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHdwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kZXB0aEZ1bmMoZS5FUVVBTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGVwdGhGdW5jKGUuR0VRVUFMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIF9wOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kZXB0aEZ1bmMoZS5HUkVBVEVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHZwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kZXB0aEZ1bmMoZS5OT1RFUVVBTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZGVwdGhGdW5jKGUuTEVRVUFMKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWCA9IGFlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXRMb2NrZWQ6IGZ1bmN0aW9uKGFlKSB7CiAgICAgICAgICAgICAgICB2ID0gYWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldENsZWFyOiBmdW5jdGlvbihhZSkgewogICAgICAgICAgICAgICAgb2UgIT09IGFlICYmICh0ZSAmJiAoYWUgPSAxIC0gYWUpLCBlLmNsZWFyRGVwdGgoYWUpLCBvZSA9IGFlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdiA9ICExLCBOID0gbnVsbCwgWCA9IG51bGwsIG9lID0gbnVsbCwgdGUgPSAhMTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjKCkgewogICAgICAgIGxldCB2ID0gITEsIHRlID0gbnVsbCwgTiA9IG51bGwsIFggPSBudWxsLCBvZSA9IG51bGwsIGFlID0gbnVsbCwgQ2UgPSBudWxsLCBRZSA9IG51bGwsIGF0ID0gbnVsbDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzZXRUZXN0OiBmdW5jdGlvbihrZSkgewogICAgICAgICAgICAgICAgdiB8fCAoa2UgPyBpZShlLlNURU5DSUxfVEVTVCkgOiBFZShlLlNURU5DSUxfVEVTVCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXRNYXNrOiBmdW5jdGlvbihrZSkgewogICAgICAgICAgICAgICAgdGUgIT09IGtlICYmICF2ICYmIChlLnN0ZW5jaWxNYXNrKGtlKSwgdGUgPSBrZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldEZ1bmM6IGZ1bmN0aW9uKGtlLCBfdCwgU3QpIHsKICAgICAgICAgICAgICAgIChOICE9PSBrZSB8fCBYICE9PSBfdCB8fCBvZSAhPT0gU3QpICYmIChlLnN0ZW5jaWxGdW5jKGtlLCBfdCwgU3QpLCBOID0ga2UsIFggPSBfdCwgb2UgPSBTdCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldE9wOiBmdW5jdGlvbihrZSwgX3QsIFN0KSB7CiAgICAgICAgICAgICAgICAoYWUgIT09IGtlIHx8IENlICE9PSBfdCB8fCBRZSAhPT0gU3QpICYmIChlLnN0ZW5jaWxPcChrZSwgX3QsIFN0KSwgYWUgPSBrZSwgQ2UgPSBfdCwgUWUgPSBTdCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldExvY2tlZDogZnVuY3Rpb24oa2UpIHsKICAgICAgICAgICAgICAgIHYgPSBrZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0Q2xlYXI6IGZ1bmN0aW9uKGtlKSB7CiAgICAgICAgICAgICAgICBhdCAhPT0ga2UgJiYgKGUuY2xlYXJTdGVuY2lsKGtlKSwgYXQgPSBrZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHYgPSAhMSwgdGUgPSBudWxsLCBOID0gbnVsbCwgWCA9IG51bGwsIG9lID0gbnVsbCwgYWUgPSBudWxsLCBDZSA9IG51bGwsIFFlID0gbnVsbCwgYXQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGxldCBzID0gbmV3IHQsIGggPSBuZXcgaSwgZCA9IG5ldyBjLCBJID0gbmV3IFdlYWtNYXAsIFQgPSBuZXcgV2Vha01hcCwgQyA9IHt9LCBSID0ge30sIFMgPSBuZXcgV2Vha01hcCwgeDEgPSBbXSwgTyA9IG51bGwsIEwgPSAhMSwgbCA9IG51bGwsIHIgPSBudWxsLCB3ID0gbnVsbCwgTSA9IG51bGwsIF8gPSBudWxsLCBIID0gbnVsbCwgUDEgPSBudWxsLCB5MSA9IG5ldyBQKDAsIDAsIDApLCBCID0gMCwgcCA9ICExLCBmID0gbnVsbCwgQSA9IG51bGwsIHEgPSBudWxsLCBWID0gbnVsbCwgWSA9IG51bGwsIFEgPSBlLmdldFBhcmFtZXRlcihlLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKSwgeiA9ICExLCBqID0gMCwgRiA9IGUuZ2V0UGFyYW1ldGVyKGUuVkVSU0lPTik7CiAgICBGLmluZGV4T2YoIldlYkdMIikgIT09IC0xID8gKGogPSBwYXJzZUZsb2F0KC9eV2ViR0wgKFxkKS8uZXhlYyhGKVsxXSksIHogPSBqID49IDEpIDogRi5pbmRleE9mKCJPcGVuR0wgRVMiKSAhPT0gLTEgJiYgKGogPSBwYXJzZUZsb2F0KC9eT3BlbkdMIEVTIChcZCkvLmV4ZWMoRilbMV0pLCB6ID0gaiA+PSAyKTsKICAgIGxldCBtZSA9IG51bGwsIE1lID0ge30sIExlID0gZS5nZXRQYXJhbWV0ZXIoZS5TQ0lTU09SX0JPWCksIEdlID0gZS5nZXRQYXJhbWV0ZXIoZS5WSUVXUE9SVCksIFplID0gbmV3IG90KCkuZnJvbUFycmF5KExlKSwgayA9IG5ldyBvdCgpLmZyb21BcnJheShHZSk7CiAgICBmdW5jdGlvbiBKKHYsIHRlLCBOLCBYKSB7CiAgICAgICAgbGV0IG9lID0gbmV3IFVpbnQ4QXJyYXkoNCksIGFlID0gZS5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZS5iaW5kVGV4dHVyZSh2LCBhZSksIGUudGV4UGFyYW1ldGVyaSh2LCBlLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZS5ORUFSRVNUKSwgZS50ZXhQYXJhbWV0ZXJpKHYsIGUuVEVYVFVSRV9NQUdfRklMVEVSLCBlLk5FQVJFU1QpOwogICAgICAgIGZvcihsZXQgQ2UgPSAwOyBDZSA8IE47IENlKyspdiA9PT0gZS5URVhUVVJFXzNEIHx8IHYgPT09IGUuVEVYVFVSRV8yRF9BUlJBWSA/IGUudGV4SW1hZ2UzRCh0ZSwgMCwgZS5SR0JBLCAxLCAxLCBYLCAwLCBlLlJHQkEsIGUuVU5TSUdORURfQllURSwgb2UpIDogZS50ZXhJbWFnZTJEKHRlICsgQ2UsIDAsIGUuUkdCQSwgMSwgMSwgMCwgZS5SR0JBLCBlLlVOU0lHTkVEX0JZVEUsIG9lKTsKICAgICAgICByZXR1cm4gYWU7CiAgICB9CiAgICBsZXQgdWUgPSB7fTsKICAgIHVlW2UuVEVYVFVSRV8yRF0gPSBKKGUuVEVYVFVSRV8yRCwgZS5URVhUVVJFXzJELCAxKSwgdWVbZS5URVhUVVJFX0NVQkVfTUFQXSA9IEooZS5URVhUVVJFX0NVQkVfTUFQLCBlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiksIHVlW2UuVEVYVFVSRV8yRF9BUlJBWV0gPSBKKGUuVEVYVFVSRV8yRF9BUlJBWSwgZS5URVhUVVJFXzJEX0FSUkFZLCAxLCAxKSwgdWVbZS5URVhUVVJFXzNEXSA9IEooZS5URVhUVVJFXzNELCBlLlRFWFRVUkVfM0QsIDEsIDEpLCBzLnNldENsZWFyKDAsIDAsIDAsIDEpLCBoLnNldENsZWFyKDEpLCBkLnNldENsZWFyKDApLCBpZShlLkRFUFRIX1RFU1QpLCBoLnNldEZ1bmMocmEpLCBEZSghMSksIHdlKFdkKSwgaWUoZS5DVUxMX0ZBQ0UpLCBtKFVsKTsKICAgIGZ1bmN0aW9uIGllKHYpIHsKICAgICAgICBDW3ZdICE9PSAhMCAmJiAoZS5lbmFibGUodiksIENbdl0gPSAhMCk7CiAgICB9CiAgICBmdW5jdGlvbiBFZSh2KSB7CiAgICAgICAgQ1t2XSAhPT0gITEgJiYgKGUuZGlzYWJsZSh2KSwgQ1t2XSA9ICExKTsKICAgIH0KICAgIGZ1bmN0aW9uIEJlKHYsIHRlKSB7CiAgICAgICAgcmV0dXJuIFJbdl0gIT09IHRlID8gKGUuYmluZEZyYW1lYnVmZmVyKHYsIHRlKSwgUlt2XSA9IHRlLCB2ID09PSBlLkRSQVdfRlJBTUVCVUZGRVIgJiYgKFJbZS5GUkFNRUJVRkZFUl0gPSB0ZSksIHYgPT09IGUuRlJBTUVCVUZGRVIgJiYgKFJbZS5EUkFXX0ZSQU1FQlVGRkVSXSA9IHRlKSwgITApIDogITE7CiAgICB9CiAgICBmdW5jdGlvbiBUZSh2LCB0ZSkgewogICAgICAgIGxldCBOID0geDEsIFggPSAhMTsKICAgICAgICBpZiAodikgewogICAgICAgICAgICBOID0gUy5nZXQodGUpLCBOID09PSB2b2lkIDAgJiYgKE4gPSBbXSwgUy5zZXQodGUsIE4pKTsKICAgICAgICAgICAgbGV0IG9lID0gdi50ZXh0dXJlczsKICAgICAgICAgICAgaWYgKE4ubGVuZ3RoICE9PSBvZS5sZW5ndGggfHwgTlswXSAhPT0gZS5DT0xPUl9BVFRBQ0hNRU5UMCkgewogICAgICAgICAgICAgICAgZm9yKGxldCBhZSA9IDAsIENlID0gb2UubGVuZ3RoOyBhZSA8IENlOyBhZSsrKU5bYWVdID0gZS5DT0xPUl9BVFRBQ0hNRU5UMCArIGFlOwogICAgICAgICAgICAgICAgTi5sZW5ndGggPSBvZS5sZW5ndGgsIFggPSAhMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBOWzBdICE9PSBlLkJBQ0sgJiYgKE5bMF0gPSBlLkJBQ0ssIFggPSAhMCk7CiAgICAgICAgWCAmJiBlLmRyYXdCdWZmZXJzKE4pOwogICAgfQogICAgZnVuY3Rpb24gamUodikgewogICAgICAgIHJldHVybiBPICE9PSB2ID8gKGUudXNlUHJvZ3JhbSh2KSwgTyA9IHYsICEwKSA6ICExOwogICAgfQogICAgbGV0ICRlID0gewogICAgICAgIFtpYV06IGUuRlVOQ19BREQsCiAgICAgICAgW3RwXTogZS5GVU5DX1NVQlRSQUNULAogICAgICAgIFtlcF06IGUuRlVOQ19SRVZFUlNFX1NVQlRSQUNUCiAgICB9OwogICAgJGVbaXBdID0gZS5NSU4sICRlW3NwXSA9IGUuTUFYOwogICAgbGV0IFVlID0gewogICAgICAgIFtucF06IGUuWkVSTywKICAgICAgICBbcnBdOiBlLk9ORSwKICAgICAgICBbb3BdOiBlLlNSQ19DT0xPUiwKICAgICAgICBbc2FdOiBlLlNSQ19BTFBIQSwKICAgICAgICBbZHBdOiBlLlNSQ19BTFBIQV9TQVRVUkFURSwKICAgICAgICBbY3BdOiBlLkRTVF9DT0xPUiwKICAgICAgICBbaHBdOiBlLkRTVF9BTFBIQSwKICAgICAgICBbYXBdOiBlLk9ORV9NSU5VU19TUkNfQ09MT1IsCiAgICAgICAgW25hXTogZS5PTkVfTUlOVVNfU1JDX0FMUEhBLAogICAgICAgIFt1cF06IGUuT05FX01JTlVTX0RTVF9DT0xPUiwKICAgICAgICBbbHBdOiBlLk9ORV9NSU5VU19EU1RfQUxQSEEsCiAgICAgICAgW3BwXTogZS5DT05TVEFOVF9DT0xPUiwKICAgICAgICBbZnBdOiBlLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUiwKICAgICAgICBbbXBdOiBlLkNPTlNUQU5UX0FMUEhBLAogICAgICAgIFt5cF06IGUuT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBCiAgICB9OwogICAgZnVuY3Rpb24gbSh2LCB0ZSwgTiwgWCwgb2UsIGFlLCBDZSwgUWUsIGF0LCBrZSkgewogICAgICAgIGlmICh2ID09PSBVbCkgewogICAgICAgICAgICBMID09PSAhMCAmJiAoRWUoZS5CTEVORCksIEwgPSAhMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKEwgPT09ICExICYmIChpZShlLkJMRU5EKSwgTCA9ICEwKSwgdiAhPT0gS2QpIHsKICAgICAgICAgICAgaWYgKHYgIT09IGwgfHwga2UgIT09IHApIHsKICAgICAgICAgICAgICAgIGlmICgociAhPT0gaWEgfHwgXyAhPT0gaWEpICYmIChlLmJsZW5kRXF1YXRpb24oZS5GVU5DX0FERCksIHIgPSBpYSwgXyA9IGlhKSwga2UpIHN3aXRjaCh2KXsKICAgICAgICAgICAgICAgICAgICBjYXNlIGVhOgogICAgICAgICAgICAgICAgICAgICAgICBlLmJsZW5kRnVuY1NlcGFyYXRlKGUuT05FLCBlLk9ORV9NSU5VU19TUkNfQUxQSEEsIGUuT05FLCBlLk9ORV9NSU5VU19TUkNfQUxQSEEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICRkOgogICAgICAgICAgICAgICAgICAgICAgICBlLmJsZW5kRnVuYyhlLk9ORSwgZS5PTkUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFFkOgogICAgICAgICAgICAgICAgICAgICAgICBlLmJsZW5kRnVuY1NlcGFyYXRlKGUuWkVSTywgZS5PTkVfTUlOVVNfU1JDX0NPTE9SLCBlLlpFUk8sIGUuT05FKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBqZDoKICAgICAgICAgICAgICAgICAgICAgICAgZS5ibGVuZEZ1bmNTZXBhcmF0ZShlLlpFUk8sIGUuU1JDX0NPTE9SLCBlLlpFUk8sIGUuU1JDX0FMUEhBKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIiwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBzd2l0Y2godil7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBlYToKICAgICAgICAgICAgICAgICAgICAgICAgZS5ibGVuZEZ1bmNTZXBhcmF0ZShlLlNSQ19BTFBIQSwgZS5PTkVfTUlOVVNfU1JDX0FMUEhBLCBlLk9ORSwgZS5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAkZDoKICAgICAgICAgICAgICAgICAgICAgICAgZS5ibGVuZEZ1bmMoZS5TUkNfQUxQSEEsIGUuT05FKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBRZDoKICAgICAgICAgICAgICAgICAgICAgICAgZS5ibGVuZEZ1bmNTZXBhcmF0ZShlLlpFUk8sIGUuT05FX01JTlVTX1NSQ19DT0xPUiwgZS5aRVJPLCBlLk9ORSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgamQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGUuYmxlbmRGdW5jKGUuWkVSTywgZS5TUkNfQ09MT1IpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLCB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3ID0gbnVsbCwgTSA9IG51bGwsIEggPSBudWxsLCBQMSA9IG51bGwsIHkxLnNldCgwLCAwLCAwKSwgQiA9IDAsIGwgPSB2LCBwID0ga2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvZSA9IG9lIHx8IHRlLCBhZSA9IGFlIHx8IE4sIENlID0gQ2UgfHwgWCwgKHRlICE9PSByIHx8IG9lICE9PSBfKSAmJiAoZS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoJGVbdGVdLCAkZVtvZV0pLCByID0gdGUsIF8gPSBvZSksIChOICE9PSB3IHx8IFggIT09IE0gfHwgYWUgIT09IEggfHwgQ2UgIT09IFAxKSAmJiAoZS5ibGVuZEZ1bmNTZXBhcmF0ZShVZVtOXSwgVWVbWF0sIFVlW2FlXSwgVWVbQ2VdKSwgdyA9IE4sIE0gPSBYLCBIID0gYWUsIFAxID0gQ2UpLCAoUWUuZXF1YWxzKHkxKSA9PT0gITEgfHwgYXQgIT09IEIpICYmIChlLmJsZW5kQ29sb3IoUWUuciwgUWUuZywgUWUuYiwgYXQpLCB5MS5jb3B5KFFlKSwgQiA9IGF0KSwgbCA9IHYsIHAgPSAhMTsKICAgIH0KICAgIGZ1bmN0aW9uIHV0KHYsIHRlKSB7CiAgICAgICAgdi5zaWRlID09PSBZZCA/IEVlKGUuQ1VMTF9GQUNFKSA6IGllKGUuQ1VMTF9GQUNFKTsKICAgICAgICBsZXQgTiA9IHYuc2lkZSA9PT0gQWw7CiAgICAgICAgdGUgJiYgKE4gPSAhTiksIERlKE4pLCB2LmJsZW5kaW5nID09PSBlYSAmJiB2LnRyYW5zcGFyZW50ID09PSAhMSA/IG0oVWwpIDogbSh2LmJsZW5kaW5nLCB2LmJsZW5kRXF1YXRpb24sIHYuYmxlbmRTcmMsIHYuYmxlbmREc3QsIHYuYmxlbmRFcXVhdGlvbkFscGhhLCB2LmJsZW5kU3JjQWxwaGEsIHYuYmxlbmREc3RBbHBoYSwgdi5ibGVuZENvbG9yLCB2LmJsZW5kQWxwaGEsIHYucHJlbXVsdGlwbGllZEFscGhhKSwgaC5zZXRGdW5jKHYuZGVwdGhGdW5jKSwgaC5zZXRUZXN0KHYuZGVwdGhUZXN0KSwgaC5zZXRNYXNrKHYuZGVwdGhXcml0ZSksIHMuc2V0TWFzayh2LmNvbG9yV3JpdGUpOwogICAgICAgIGxldCBYID0gdi5zdGVuY2lsV3JpdGU7CiAgICAgICAgZC5zZXRUZXN0KFgpLCBYICYmIChkLnNldE1hc2sodi5zdGVuY2lsV3JpdGVNYXNrKSwgZC5zZXRGdW5jKHYuc3RlbmNpbEZ1bmMsIHYuc3RlbmNpbFJlZiwgdi5zdGVuY2lsRnVuY01hc2spLCBkLnNldE9wKHYuc3RlbmNpbEZhaWwsIHYuc3RlbmNpbFpGYWlsLCB2LnN0ZW5jaWxaUGFzcykpLCBYZSh2LnBvbHlnb25PZmZzZXQsIHYucG9seWdvbk9mZnNldEZhY3Rvciwgdi5wb2x5Z29uT2Zmc2V0VW5pdHMpLCB2LmFscGhhVG9Db3ZlcmFnZSA9PT0gITAgPyBpZShlLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSkgOiBFZShlLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk7CiAgICB9CiAgICBmdW5jdGlvbiBEZSh2KSB7CiAgICAgICAgZiAhPT0gdiAmJiAodiA/IGUuZnJvbnRGYWNlKGUuQ1cpIDogZS5mcm9udEZhY2UoZS5DQ1cpLCBmID0gdik7CiAgICB9CiAgICBmdW5jdGlvbiB3ZSh2KSB7CiAgICAgICAgdiAhPT0gVWQgPyAoaWUoZS5DVUxMX0ZBQ0UpLCB2ICE9PSBBICYmICh2ID09PSBXZCA/IGUuY3VsbEZhY2UoZS5CQUNLKSA6IHYgPT09IEhkID8gZS5jdWxsRmFjZShlLkZST05UKSA6IGUuY3VsbEZhY2UoZS5GUk9OVF9BTkRfQkFDSykpKSA6IEVlKGUuQ1VMTF9GQUNFKSwgQSA9IHY7CiAgICB9CiAgICBmdW5jdGlvbiBfZSh2KSB7CiAgICAgICAgdiAhPT0gcSAmJiAoeiAmJiBlLmxpbmVXaWR0aCh2KSwgcSA9IHYpOwogICAgfQogICAgZnVuY3Rpb24gWGUodiwgdGUsIE4pIHsKICAgICAgICB2ID8gKGllKGUuUE9MWUdPTl9PRkZTRVRfRklMTCksIChWICE9PSB0ZSB8fCBZICE9PSBOKSAmJiAoZS5wb2x5Z29uT2Zmc2V0KHRlLCBOKSwgViA9IHRlLCBZID0gTikpIDogRWUoZS5QT0xZR09OX09GRlNFVF9GSUxMKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhlKHYpIHsKICAgICAgICB2ID8gaWUoZS5TQ0lTU09SX1RFU1QpIDogRWUoZS5TQ0lTU09SX1RFU1QpOwogICAgfQogICAgZnVuY3Rpb24gdSh2KSB7CiAgICAgICAgdiA9PT0gdm9pZCAwICYmICh2ID0gZS5URVhUVVJFMCArIFEgLSAxKSwgbWUgIT09IHYgJiYgKGUuYWN0aXZlVGV4dHVyZSh2KSwgbWUgPSB2KTsKICAgIH0KICAgIGZ1bmN0aW9uIGEodiwgdGUsIE4pIHsKICAgICAgICBOID09PSB2b2lkIDAgJiYgKG1lID09PSBudWxsID8gTiA9IGUuVEVYVFVSRTAgKyBRIC0gMSA6IE4gPSBtZSk7CiAgICAgICAgbGV0IFggPSBNZVtOXTsKICAgICAgICBYID09PSB2b2lkIDAgJiYgKFggPSB7CiAgICAgICAgICAgIHR5cGU6IHZvaWQgMCwKICAgICAgICAgICAgdGV4dHVyZTogdm9pZCAwCiAgICAgICAgfSwgTWVbTl0gPSBYKSwgKFgudHlwZSAhPT0gdiB8fCBYLnRleHR1cmUgIT09IHRlKSAmJiAobWUgIT09IE4gJiYgKGUuYWN0aXZlVGV4dHVyZShOKSwgbWUgPSBOKSwgZS5iaW5kVGV4dHVyZSh2LCB0ZSB8fCB1ZVt2XSksIFgudHlwZSA9IHYsIFgudGV4dHVyZSA9IHRlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgbGV0IHYgPSBNZVttZV07CiAgICAgICAgdiAhPT0gdm9pZCAwICYmIHYudHlwZSAhPT0gdm9pZCAwICYmIChlLmJpbmRUZXh0dXJlKHYudHlwZSwgbnVsbCksIHYudHlwZSA9IHZvaWQgMCwgdi50ZXh0dXJlID0gdm9pZCAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIFcoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZS5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseShlLCBhcmd1bWVudHMpOwogICAgICAgIH0gY2F0Y2ggKHYpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCB2KTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBLKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUuY29tcHJlc3NlZFRleEltYWdlM0QuYXBwbHkoZSwgYXJndW1lbnRzKTsKICAgICAgICB9IGNhdGNoICh2KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iiwgdik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gRygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBlLnRleFN1YkltYWdlMkQuYXBwbHkoZSwgYXJndW1lbnRzKTsKICAgICAgICB9IGNhdGNoICh2KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iiwgdik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcGUoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZS50ZXhTdWJJbWFnZTNELmFwcGx5KGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSBjYXRjaCAodikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsIHYpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHJlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUuY29tcHJlc3NlZFRleFN1YkltYWdlMkQuYXBwbHkoZSwgYXJndW1lbnRzKTsKICAgICAgICB9IGNhdGNoICh2KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iiwgdik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY2UoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRC5hcHBseShlLCBhcmd1bWVudHMpOwogICAgICAgIH0gY2F0Y2ggKHYpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCB2KTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB5ZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBlLnRleFN0b3JhZ2UyRC5hcHBseShlLCBhcmd1bWVudHMpOwogICAgICAgIH0gY2F0Y2ggKHYpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCB2KTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBaKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUudGV4U3RvcmFnZTNELmFwcGx5KGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSBjYXRjaCAodikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsIHYpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGxlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUudGV4SW1hZ2UyRC5hcHBseShlLCBhcmd1bWVudHMpOwogICAgICAgIH0gY2F0Y2ggKHYpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCB2KTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBTZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBlLnRleEltYWdlM0QuYXBwbHkoZSwgYXJndW1lbnRzKTsKICAgICAgICB9IGNhdGNoICh2KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iiwgdik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24geGUodikgewogICAgICAgIFplLmVxdWFscyh2KSA9PT0gITEgJiYgKGUuc2Npc3Nvcih2LngsIHYueSwgdi56LCB2LncpLCBaZS5jb3B5KHYpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZlKHYpIHsKICAgICAgICBrLmVxdWFscyh2KSA9PT0gITEgJiYgKGUudmlld3BvcnQodi54LCB2LnksIHYueiwgdi53KSwgay5jb3B5KHYpKTsKICAgIH0KICAgIGZ1bmN0aW9uIEllKHYsIHRlKSB7CiAgICAgICAgbGV0IE4gPSBULmdldCh0ZSk7CiAgICAgICAgTiA9PT0gdm9pZCAwICYmIChOID0gbmV3IFdlYWtNYXAsIFQuc2V0KHRlLCBOKSk7CiAgICAgICAgbGV0IFggPSBOLmdldCh2KTsKICAgICAgICBYID09PSB2b2lkIDAgJiYgKFggPSBlLmdldFVuaWZvcm1CbG9ja0luZGV4KHRlLCB2Lm5hbWUpLCBOLnNldCh2LCBYKSk7CiAgICB9CiAgICBmdW5jdGlvbiBiZSh2LCB0ZSkgewogICAgICAgIGxldCBYID0gVC5nZXQodGUpLmdldCh2KTsKICAgICAgICBJLmdldCh0ZSkgIT09IFggJiYgKGUudW5pZm9ybUJsb2NrQmluZGluZyh0ZSwgWCwgdi5fX2JpbmRpbmdQb2ludEluZGV4KSwgSS5zZXQodGUsIFgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHplKCkgewogICAgICAgIGUuZGlzYWJsZShlLkJMRU5EKSwgZS5kaXNhYmxlKGUuQ1VMTF9GQUNFKSwgZS5kaXNhYmxlKGUuREVQVEhfVEVTVCksIGUuZGlzYWJsZShlLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLCBlLmRpc2FibGUoZS5TQ0lTU09SX1RFU1QpLCBlLmRpc2FibGUoZS5TVEVOQ0lMX1RFU1QpLCBlLmRpc2FibGUoZS5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLCBlLmJsZW5kRXF1YXRpb24oZS5GVU5DX0FERCksIGUuYmxlbmRGdW5jKGUuT05FLCBlLlpFUk8pLCBlLmJsZW5kRnVuY1NlcGFyYXRlKGUuT05FLCBlLlpFUk8sIGUuT05FLCBlLlpFUk8pLCBlLmJsZW5kQ29sb3IoMCwgMCwgMCwgMCksIGUuY29sb3JNYXNrKCEwLCAhMCwgITAsICEwKSwgZS5jbGVhckNvbG9yKDAsIDAsIDAsIDApLCBlLmRlcHRoTWFzayghMCksIGUuZGVwdGhGdW5jKGUuTEVTUyksIGguc2V0UmV2ZXJzZWQoITEpLCBlLmNsZWFyRGVwdGgoMSksIGUuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksIGUuc3RlbmNpbEZ1bmMoZS5BTFdBWVMsIDAsIDQyOTQ5NjcyOTUpLCBlLnN0ZW5jaWxPcChlLktFRVAsIGUuS0VFUCwgZS5LRUVQKSwgZS5jbGVhclN0ZW5jaWwoMCksIGUuY3VsbEZhY2UoZS5CQUNLKSwgZS5mcm9udEZhY2UoZS5DQ1cpLCBlLnBvbHlnb25PZmZzZXQoMCwgMCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUiwgbnVsbCksIGUuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCksIGUuYmluZEZyYW1lYnVmZmVyKGUuUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCksIGUudXNlUHJvZ3JhbShudWxsKSwgZS5saW5lV2lkdGgoMSksIGUuc2Npc3NvcigwLCAwLCBlLmNhbnZhcy53aWR0aCwgZS5jYW52YXMuaGVpZ2h0KSwgZS52aWV3cG9ydCgwLCAwLCBlLmNhbnZhcy53aWR0aCwgZS5jYW52YXMuaGVpZ2h0KSwgQyA9IHt9LCBtZSA9IG51bGwsIE1lID0ge30sIFIgPSB7fSwgUyA9IG5ldyBXZWFrTWFwLCB4MSA9IFtdLCBPID0gbnVsbCwgTCA9ICExLCBsID0gbnVsbCwgciA9IG51bGwsIHcgPSBudWxsLCBNID0gbnVsbCwgXyA9IG51bGwsIEggPSBudWxsLCBQMSA9IG51bGwsIHkxID0gbmV3IFAoMCwgMCwgMCksIEIgPSAwLCBwID0gITEsIGYgPSBudWxsLCBBID0gbnVsbCwgcSA9IG51bGwsIFYgPSBudWxsLCBZID0gbnVsbCwgWmUuc2V0KDAsIDAsIGUuY2FudmFzLndpZHRoLCBlLmNhbnZhcy5oZWlnaHQpLCBrLnNldCgwLCAwLCBlLmNhbnZhcy53aWR0aCwgZS5jYW52YXMuaGVpZ2h0KSwgcy5yZXNldCgpLCBoLnJlc2V0KCksIGQucmVzZXQoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgYnVmZmVyczogewogICAgICAgICAgICBjb2xvcjogcywKICAgICAgICAgICAgZGVwdGg6IGgsCiAgICAgICAgICAgIHN0ZW5jaWw6IGQKICAgICAgICB9LAogICAgICAgIGVuYWJsZTogaWUsCiAgICAgICAgZGlzYWJsZTogRWUsCiAgICAgICAgYmluZEZyYW1lYnVmZmVyOiBCZSwKICAgICAgICBkcmF3QnVmZmVyczogVGUsCiAgICAgICAgdXNlUHJvZ3JhbTogamUsCiAgICAgICAgc2V0QmxlbmRpbmc6IG0sCiAgICAgICAgc2V0TWF0ZXJpYWw6IHV0LAogICAgICAgIHNldEZsaXBTaWRlZDogRGUsCiAgICAgICAgc2V0Q3VsbEZhY2U6IHdlLAogICAgICAgIHNldExpbmVXaWR0aDogX2UsCiAgICAgICAgc2V0UG9seWdvbk9mZnNldDogWGUsCiAgICAgICAgc2V0U2Npc3NvclRlc3Q6IGhlLAogICAgICAgIGFjdGl2ZVRleHR1cmU6IHUsCiAgICAgICAgYmluZFRleHR1cmU6IGEsCiAgICAgICAgdW5iaW5kVGV4dHVyZTogYiwKICAgICAgICBjb21wcmVzc2VkVGV4SW1hZ2UyRDogVywKICAgICAgICBjb21wcmVzc2VkVGV4SW1hZ2UzRDogSywKICAgICAgICB0ZXhJbWFnZTJEOiBsZSwKICAgICAgICB0ZXhJbWFnZTNEOiBTZSwKICAgICAgICB1cGRhdGVVQk9NYXBwaW5nOiBJZSwKICAgICAgICB1bmlmb3JtQmxvY2tCaW5kaW5nOiBiZSwKICAgICAgICB0ZXhTdG9yYWdlMkQ6IHllLAogICAgICAgIHRleFN0b3JhZ2UzRDogWiwKICAgICAgICB0ZXhTdWJJbWFnZTJEOiBHLAogICAgICAgIHRleFN1YkltYWdlM0Q6IHBlLAogICAgICAgIGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEOiByZSwKICAgICAgICBjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRDogY2UsCiAgICAgICAgc2Npc3NvcjogeGUsCiAgICAgICAgdmlld3BvcnQ6IGZlLAogICAgICAgIHJlc2V0OiB6ZQogICAgfTsKfQpmdW5jdGlvbiBJZjEoZSwgbiwgdCwgaSwgYywgcywgaCkgewogICAgbGV0IGQgPSBuLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIikgPyBuLmdldCgiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIikgOiBudWxsLCBJID0gdHlwZW9mIG5hdmlnYXRvciA+ICJ1IiA/ICExIDogL09jdWx1c0Jyb3dzZXIvZy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLCBUMSA9IG5ldyBULCBDID0gbmV3IFdlYWtNYXAsIFIsIFMgPSBuZXcgV2Vha01hcCwgeDEgPSAhMTsKICAgIHRyeSB7CiAgICAgICAgeDEgPSB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzIDwgInUiICYmIG5ldyBPZmZzY3JlZW5DYW52YXMoMSwgMSkuZ2V0Q29udGV4dCgiMmQiKSAhPT0gbnVsbDsKICAgIH0gY2F0Y2ggIHt9CiAgICBmdW5jdGlvbiBPKHUsIGEpIHsKICAgICAgICByZXR1cm4geDEgPyBuZXcgT2Zmc2NyZWVuQ2FudmFzKHUsIGEpIDogWXMoImNhbnZhcyIpOwogICAgfQogICAgZnVuY3Rpb24gTCh1LCBhLCBiKSB7CiAgICAgICAgbGV0IFcgPSAxLCBLID0gaGUodSk7CiAgICAgICAgaWYgKChLLndpZHRoID4gYiB8fCBLLmhlaWdodCA+IGIpICYmIChXID0gYiAvIE1hdGgubWF4KEsud2lkdGgsIEsuaGVpZ2h0KSksIFcgPCAxKSBpZiAodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgPCAidSIgJiYgdSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IDwgInUiICYmIHUgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0eXBlb2YgSW1hZ2VCaXRtYXAgPCAidSIgJiYgdSBpbnN0YW5jZW9mIEltYWdlQml0bWFwIHx8IHR5cGVvZiBWaWRlb0ZyYW1lIDwgInUiICYmIHUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lKSB7CiAgICAgICAgICAgIGxldCBHID0gTWF0aC5mbG9vcihXICogSy53aWR0aCksIHBlID0gTWF0aC5mbG9vcihXICogSy5oZWlnaHQpOwogICAgICAgICAgICBSID09PSB2b2lkIDAgJiYgKFIgPSBPKEcsIHBlKSk7CiAgICAgICAgICAgIGxldCByZSA9IGEgPyBPKEcsIHBlKSA6IFI7CiAgICAgICAgICAgIHJldHVybiByZS53aWR0aCA9IEcsIHJlLmhlaWdodCA9IHBlLCByZS5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZSh1LCAwLCAwLCBHLCBwZSksIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIgKyBLLndpZHRoICsgIngiICsgSy5oZWlnaHQgKyAiKSB0byAoIiArIEcgKyAieCIgKyBwZSArICIpLiIpLCByZTsKICAgICAgICB9IGVsc2UgcmV0dXJuICJkYXRhIiBpbiB1ICYmIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIiArIEsud2lkdGggKyAieCIgKyBLLmhlaWdodCArICIpLiIpLCB1OwogICAgICAgIHJldHVybiB1OwogICAgfQogICAgZnVuY3Rpb24gbCh1KSB7CiAgICAgICAgcmV0dXJuIHUuZ2VuZXJhdGVNaXBtYXBzOwogICAgfQogICAgZnVuY3Rpb24gcih1KSB7CiAgICAgICAgZS5nZW5lcmF0ZU1pcG1hcCh1KTsKICAgIH0KICAgIGZ1bmN0aW9uIHcodSkgewogICAgICAgIHJldHVybiB1LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID8gZS5URVhUVVJFX0NVQkVfTUFQIDogdS5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgPyBlLlRFWFRVUkVfM0QgOiB1LmlzV2ViR0xBcnJheVJlbmRlclRhcmdldCB8fCB1LmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA/IGUuVEVYVFVSRV8yRF9BUlJBWSA6IGUuVEVYVFVSRV8yRDsKICAgIH0KICAgIGZ1bmN0aW9uIE0odSwgYSwgYiwgVywgSyA9ICExKSB7CiAgICAgICAgaWYgKHUgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGVbdV0gIT09IHZvaWQgMCkgcmV0dXJuIGVbdV07CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCAnIiArIHUgKyAiJyIpOwogICAgICAgIH0KICAgICAgICBsZXQgRyA9IGE7CiAgICAgICAgaWYgKGEgPT09IGUuUkVEICYmIChiID09PSBlLkZMT0FUICYmIChHID0gZS5SMzJGKSwgYiA9PT0gZS5IQUxGX0ZMT0FUICYmIChHID0gZS5SMTZGKSwgYiA9PT0gZS5VTlNJR05FRF9CWVRFICYmIChHID0gZS5SOCkpLCBhID09PSBlLlJFRF9JTlRFR0VSICYmIChiID09PSBlLlVOU0lHTkVEX0JZVEUgJiYgKEcgPSBlLlI4VUkpLCBiID09PSBlLlVOU0lHTkVEX1NIT1JUICYmIChHID0gZS5SMTZVSSksIGIgPT09IGUuVU5TSUdORURfSU5UICYmIChHID0gZS5SMzJVSSksIGIgPT09IGUuQllURSAmJiAoRyA9IGUuUjhJKSwgYiA9PT0gZS5TSE9SVCAmJiAoRyA9IGUuUjE2SSksIGIgPT09IGUuSU5UICYmIChHID0gZS5SMzJJKSksIGEgPT09IGUuUkcgJiYgKGIgPT09IGUuRkxPQVQgJiYgKEcgPSBlLlJHMzJGKSwgYiA9PT0gZS5IQUxGX0ZMT0FUICYmIChHID0gZS5SRzE2RiksIGIgPT09IGUuVU5TSUdORURfQllURSAmJiAoRyA9IGUuUkc4KSksIGEgPT09IGUuUkdfSU5URUdFUiAmJiAoYiA9PT0gZS5VTlNJR05FRF9CWVRFICYmIChHID0gZS5SRzhVSSksIGIgPT09IGUuVU5TSUdORURfU0hPUlQgJiYgKEcgPSBlLlJHMTZVSSksIGIgPT09IGUuVU5TSUdORURfSU5UICYmIChHID0gZS5SRzMyVUkpLCBiID09PSBlLkJZVEUgJiYgKEcgPSBlLlJHOEkpLCBiID09PSBlLlNIT1JUICYmIChHID0gZS5SRzE2SSksIGIgPT09IGUuSU5UICYmIChHID0gZS5SRzMySSkpLCBhID09PSBlLlJHQl9JTlRFR0VSICYmIChiID09PSBlLlVOU0lHTkVEX0JZVEUgJiYgKEcgPSBlLlJHQjhVSSksIGIgPT09IGUuVU5TSUdORURfU0hPUlQgJiYgKEcgPSBlLlJHQjE2VUkpLCBiID09PSBlLlVOU0lHTkVEX0lOVCAmJiAoRyA9IGUuUkdCMzJVSSksIGIgPT09IGUuQllURSAmJiAoRyA9IGUuUkdCOEkpLCBiID09PSBlLlNIT1JUICYmIChHID0gZS5SR0IxNkkpLCBiID09PSBlLklOVCAmJiAoRyA9IGUuUkdCMzJJKSksIGEgPT09IGUuUkdCQV9JTlRFR0VSICYmIChiID09PSBlLlVOU0lHTkVEX0JZVEUgJiYgKEcgPSBlLlJHQkE4VUkpLCBiID09PSBlLlVOU0lHTkVEX1NIT1JUICYmIChHID0gZS5SR0JBMTZVSSksIGIgPT09IGUuVU5TSUdORURfSU5UICYmIChHID0gZS5SR0JBMzJVSSksIGIgPT09IGUuQllURSAmJiAoRyA9IGUuUkdCQThJKSwgYiA9PT0gZS5TSE9SVCAmJiAoRyA9IGUuUkdCQTE2SSksIGIgPT09IGUuSU5UICYmIChHID0gZS5SR0JBMzJJKSksIGEgPT09IGUuUkdCICYmIGIgPT09IGUuVU5TSUdORURfSU5UXzVfOV85XzlfUkVWICYmIChHID0gZS5SR0I5X0U1KSwgYSA9PT0gZS5SR0JBKSB7CiAgICAgICAgICAgIGxldCBwZSA9IEsgPyBsYSA6IFR0LmdldFRyYW5zZmVyKFcpOwogICAgICAgICAgICBiID09PSBlLkZMT0FUICYmIChHID0gZS5SR0JBMzJGKSwgYiA9PT0gZS5IQUxGX0ZMT0FUICYmIChHID0gZS5SR0JBMTZGKSwgYiA9PT0gZS5VTlNJR05FRF9CWVRFICYmIChHID0gcGUgPT09IEZuID8gZS5TUkdCOF9BTFBIQTggOiBlLlJHQkE4KSwgYiA9PT0gZS5VTlNJR05FRF9TSE9SVF80XzRfNF80ICYmIChHID0gZS5SR0JBNCksIGIgPT09IGUuVU5TSUdORURfU0hPUlRfNV81XzVfMSAmJiAoRyA9IGUuUkdCNV9BMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoRyA9PT0gZS5SMTZGIHx8IEcgPT09IGUuUjMyRiB8fCBHID09PSBlLlJHMTZGIHx8IEcgPT09IGUuUkczMkYgfHwgRyA9PT0gZS5SR0JBMTZGIHx8IEcgPT09IGUuUkdCQTMyRikgJiYgbi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSwgRzsKICAgIH0KICAgIGZ1bmN0aW9uIF8odSwgYSkgewogICAgICAgIGxldCBiOwogICAgICAgIHJldHVybiB1ID8gYSA9PT0gbnVsbCB8fCBhID09PSBXbyB8fCBhID09PSBzYyA/IGIgPSBlLkRFUFRIMjRfU1RFTkNJTDggOiBhID09PSBwaSA/IGIgPSBlLkRFUFRIMzJGX1NURU5DSUw4IDogYSA9PT0gamwgJiYgKGIgPSBlLkRFUFRIMjRfU1RFTkNJTDgsIGNvbnNvbGUud2FybigiRGVwdGhUZXh0dXJlOiAxNiBiaXQgZGVwdGggYXR0YWNobWVudCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RlbmNpbC4gVXNpbmcgMjQtYml0IGF0dGFjaG1lbnQuIikpIDogYSA9PT0gbnVsbCB8fCBhID09PSBXbyB8fCBhID09PSBzYyA/IGIgPSBlLkRFUFRIX0NPTVBPTkVOVDI0IDogYSA9PT0gcGkgPyBiID0gZS5ERVBUSF9DT01QT05FTlQzMkYgOiBhID09PSBqbCAmJiAoYiA9IGUuREVQVEhfQ09NUE9ORU5UMTYpLCBiOwogICAgfQogICAgZnVuY3Rpb24gSCh1LCBhKSB7CiAgICAgICAgcmV0dXJuIGwodSkgPT09ICEwIHx8IHUuaXNGcmFtZWJ1ZmZlclRleHR1cmUgJiYgdS5taW5GaWx0ZXIgIT09IFV0ICYmIHUubWluRmlsdGVyICE9PSBFdCA/IE1hdGgubG9nMihNYXRoLm1heChhLndpZHRoLCBhLmhlaWdodCkpICsgMSA6IHUubWlwbWFwcyAhPT0gdm9pZCAwICYmIHUubWlwbWFwcy5sZW5ndGggPiAwID8gdS5taXBtYXBzLmxlbmd0aCA6IHUuaXNDb21wcmVzc2VkVGV4dHVyZSAmJiBBcnJheS5pc0FycmF5KHUuaW1hZ2UpID8gYS5taXBtYXBzLmxlbmd0aCA6IDE7CiAgICB9CiAgICBmdW5jdGlvbiBQKHUpIHsKICAgICAgICBsZXQgYSA9IHUudGFyZ2V0OwogICAgICAgIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIFApLCBCKGEpLCBhLmlzVmlkZW9UZXh0dXJlICYmIEMuZGVsZXRlKGEpOwogICAgfQogICAgZnVuY3Rpb24geTEodSkgewogICAgICAgIGxldCBhID0gdS50YXJnZXQ7CiAgICAgICAgYS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgeTEpLCBmKGEpOwogICAgfQogICAgZnVuY3Rpb24gQih1KSB7CiAgICAgICAgbGV0IGEgPSBpLmdldCh1KTsKICAgICAgICBpZiAoYS5fX3dlYmdsSW5pdCA9PT0gdm9pZCAwKSByZXR1cm47CiAgICAgICAgbGV0IGIgPSB1LnNvdXJjZSwgVyA9IFMuZ2V0KGIpOwogICAgICAgIGlmIChXKSB7CiAgICAgICAgICAgIGxldCBLID0gV1thLl9fY2FjaGVLZXldOwogICAgICAgICAgICBLLnVzZWRUaW1lcy0tLCBLLnVzZWRUaW1lcyA9PT0gMCAmJiBwKHUpLCBPYmplY3Qua2V5cyhXKS5sZW5ndGggPT09IDAgJiYgUy5kZWxldGUoYik7CiAgICAgICAgfQogICAgICAgIGkucmVtb3ZlKHUpOwogICAgfQogICAgZnVuY3Rpb24gcCh1KSB7CiAgICAgICAgbGV0IGEgPSBpLmdldCh1KTsKICAgICAgICBlLmRlbGV0ZVRleHR1cmUoYS5fX3dlYmdsVGV4dHVyZSk7CiAgICAgICAgbGV0IGIgPSB1LnNvdXJjZSwgVyA9IFMuZ2V0KGIpOwogICAgICAgIGRlbGV0ZSBXW2EuX19jYWNoZUtleV0sIGgubWVtb3J5LnRleHR1cmVzLS07CiAgICB9CiAgICBmdW5jdGlvbiBmKHUpIHsKICAgICAgICBsZXQgYSA9IGkuZ2V0KHUpOwogICAgICAgIGlmICh1LmRlcHRoVGV4dHVyZSAmJiAodS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpLCBpLnJlbW92ZSh1LmRlcHRoVGV4dHVyZSkpLCB1LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KSBmb3IobGV0IFcgPSAwOyBXIDwgNjsgVysrKXsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYS5fX3dlYmdsRnJhbWVidWZmZXJbV10pKSBmb3IobGV0IEsgPSAwOyBLIDwgYS5fX3dlYmdsRnJhbWVidWZmZXJbV10ubGVuZ3RoOyBLKyspZS5kZWxldGVGcmFtZWJ1ZmZlcihhLl9fd2ViZ2xGcmFtZWJ1ZmZlcltXXVtLXSk7CiAgICAgICAgICAgIGVsc2UgZS5kZWxldGVGcmFtZWJ1ZmZlcihhLl9fd2ViZ2xGcmFtZWJ1ZmZlcltXXSk7CiAgICAgICAgICAgIGEuX193ZWJnbERlcHRoYnVmZmVyICYmIGUuZGVsZXRlUmVuZGVyYnVmZmVyKGEuX193ZWJnbERlcHRoYnVmZmVyW1ddKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEuX193ZWJnbEZyYW1lYnVmZmVyKSkgZm9yKGxldCBXID0gMDsgVyA8IGEuX193ZWJnbEZyYW1lYnVmZmVyLmxlbmd0aDsgVysrKWUuZGVsZXRlRnJhbWVidWZmZXIoYS5fX3dlYmdsRnJhbWVidWZmZXJbV10pOwogICAgICAgICAgICBlbHNlIGUuZGVsZXRlRnJhbWVidWZmZXIoYS5fX3dlYmdsRnJhbWVidWZmZXIpOwogICAgICAgICAgICBpZiAoYS5fX3dlYmdsRGVwdGhidWZmZXIgJiYgZS5kZWxldGVSZW5kZXJidWZmZXIoYS5fX3dlYmdsRGVwdGhidWZmZXIpLCBhLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciAmJiBlLmRlbGV0ZUZyYW1lYnVmZmVyKGEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSwgYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpIGZvcihsZXQgVyA9IDA7IFcgPCBhLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlci5sZW5ndGg7IFcrKylhLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltXXSAmJiBlLmRlbGV0ZVJlbmRlcmJ1ZmZlcihhLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltXXSk7CiAgICAgICAgICAgIGEuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyICYmIGUuZGVsZXRlUmVuZGVyYnVmZmVyKGEuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyKTsKICAgICAgICB9CiAgICAgICAgbGV0IGIgPSB1LnRleHR1cmVzOwogICAgICAgIGZvcihsZXQgVyA9IDAsIEsgPSBiLmxlbmd0aDsgVyA8IEs7IFcrKyl7CiAgICAgICAgICAgIGxldCBHID0gaS5nZXQoYltXXSk7CiAgICAgICAgICAgIEcuX193ZWJnbFRleHR1cmUgJiYgKGUuZGVsZXRlVGV4dHVyZShHLl9fd2ViZ2xUZXh0dXJlKSwgaC5tZW1vcnkudGV4dHVyZXMtLSksIGkucmVtb3ZlKGJbV10pOwogICAgICAgIH0KICAgICAgICBpLnJlbW92ZSh1KTsKICAgIH0KICAgIGxldCBBID0gMDsKICAgIGZ1bmN0aW9uIHEoKSB7CiAgICAgICAgQSA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBWKCkgewogICAgICAgIGxldCB1ID0gQTsKICAgICAgICByZXR1cm4gdSA+PSBjLm1heFRleHR1cmVzICYmIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiICsgdSArICIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIgKyBjLm1heFRleHR1cmVzKSwgQSArPSAxLCB1OwogICAgfQogICAgZnVuY3Rpb24gWSh1KSB7CiAgICAgICAgbGV0IGEgPSBbXTsKICAgICAgICByZXR1cm4gYS5wdXNoKHUud3JhcFMpLCBhLnB1c2godS53cmFwVCksIGEucHVzaCh1LndyYXBSIHx8IDApLCBhLnB1c2godS5tYWdGaWx0ZXIpLCBhLnB1c2godS5taW5GaWx0ZXIpLCBhLnB1c2godS5hbmlzb3Ryb3B5KSwgYS5wdXNoKHUuaW50ZXJuYWxGb3JtYXQpLCBhLnB1c2godS5mb3JtYXQpLCBhLnB1c2godS50eXBlKSwgYS5wdXNoKHUuZ2VuZXJhdGVNaXBtYXBzKSwgYS5wdXNoKHUucHJlbXVsdGlwbHlBbHBoYSksIGEucHVzaCh1LmZsaXBZKSwgYS5wdXNoKHUudW5wYWNrQWxpZ25tZW50KSwgYS5wdXNoKHUuY29sb3JTcGFjZSksIGEuam9pbigpOwogICAgfQogICAgZnVuY3Rpb24gUSh1LCBhKSB7CiAgICAgICAgbGV0IGIgPSBpLmdldCh1KTsKICAgICAgICBpZiAodS5pc1ZpZGVvVGV4dHVyZSAmJiBfZSh1KSwgdS5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09ICExICYmIHUudmVyc2lvbiA+IDAgJiYgYi5fX3ZlcnNpb24gIT09IHUudmVyc2lvbikgewogICAgICAgICAgICBsZXQgVyA9IHUuaW1hZ2U7CiAgICAgICAgICAgIGlmIChXID09PSBudWxsKSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IG5vIGltYWdlIGRhdGEgZm91bmQuIik7CiAgICAgICAgICAgIGVsc2UgaWYgKFcuY29tcGxldGUgPT09ICExKSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUiKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBrKGIsIHUsIGEpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHQuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCBiLl9fd2ViZ2xUZXh0dXJlLCBlLlRFWFRVUkUwICsgYSk7CiAgICB9CiAgICBmdW5jdGlvbiB6KHUsIGEpIHsKICAgICAgICBsZXQgYiA9IGkuZ2V0KHUpOwogICAgICAgIGlmICh1LnZlcnNpb24gPiAwICYmIGIuX192ZXJzaW9uICE9PSB1LnZlcnNpb24pIHsKICAgICAgICAgICAgayhiLCB1LCBhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0LmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRF9BUlJBWSwgYi5fX3dlYmdsVGV4dHVyZSwgZS5URVhUVVJFMCArIGEpOwogICAgfQogICAgZnVuY3Rpb24gaih1LCBhKSB7CiAgICAgICAgbGV0IGIgPSBpLmdldCh1KTsKICAgICAgICBpZiAodS52ZXJzaW9uID4gMCAmJiBiLl9fdmVyc2lvbiAhPT0gdS52ZXJzaW9uKSB7CiAgICAgICAgICAgIGsoYiwgdSwgYSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdC5iaW5kVGV4dHVyZShlLlRFWFRVUkVfM0QsIGIuX193ZWJnbFRleHR1cmUsIGUuVEVYVFVSRTAgKyBhKTsKICAgIH0KICAgIGZ1bmN0aW9uIEYodSwgYSkgewogICAgICAgIGxldCBiID0gaS5nZXQodSk7CiAgICAgICAgaWYgKHUudmVyc2lvbiA+IDAgJiYgYi5fX3ZlcnNpb24gIT09IHUudmVyc2lvbikgewogICAgICAgICAgICBKKGIsIHUsIGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHQuYmluZFRleHR1cmUoZS5URVhUVVJFX0NVQkVfTUFQLCBiLl9fd2ViZ2xUZXh0dXJlLCBlLlRFWFRVUkUwICsgYSk7CiAgICB9CiAgICBsZXQgbWUgPSB7CiAgICAgICAgW3ByXTogZS5SRVBFQVQsCiAgICAgICAgW0h0XTogZS5DTEFNUF9UT19FREdFLAogICAgICAgIFtmcl06IGUuTUlSUk9SRURfUkVQRUFUCiAgICB9LCBNZSA9IHsKICAgICAgICBbVXRdOiBlLk5FQVJFU1QsCiAgICAgICAgW0psXTogZS5ORUFSRVNUX01JUE1BUF9ORUFSRVNULAogICAgICAgIFtabF06IGUuTkVBUkVTVF9NSVBNQVBfTElORUFSLAogICAgICAgIFtFdF06IGUuTElORUFSLAogICAgICAgIFtZbF06IGUuTElORUFSX01JUE1BUF9ORUFSRVNULAogICAgICAgIFt2bl06IGUuTElORUFSX01JUE1BUF9MSU5FQVIKICAgIH0sIExlID0gewogICAgICAgIFthZl06IGUuTkVWRVIsCiAgICAgICAgW2ZmXTogZS5BTFdBWVMsCiAgICAgICAgW2hmXTogZS5MRVNTLAogICAgICAgIFtjZl06IGUuTEVRVUFMLAogICAgICAgIFtsZl06IGUuRVFVQUwsCiAgICAgICAgW3BmXTogZS5HRVFVQUwsCiAgICAgICAgW3VmXTogZS5HUkVBVEVSLAogICAgICAgIFtkZl06IGUuTk9URVFVQUwKICAgIH07CiAgICBmdW5jdGlvbiBHZSh1LCBhKSB7CiAgICAgICAgaWYgKGEudHlwZSA9PT0gcGkgJiYgbi5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpID09PSAhMSAmJiAoYS5tYWdGaWx0ZXIgPT09IEV0IHx8IGEubWFnRmlsdGVyID09PSBZbCB8fCBhLm1hZ0ZpbHRlciA9PT0gWmwgfHwgYS5tYWdGaWx0ZXIgPT09IHZuIHx8IGEubWluRmlsdGVyID09PSBFdCB8fCBhLm1pbkZpbHRlciA9PT0gWWwgfHwgYS5taW5GaWx0ZXIgPT09IFpsIHx8IGEubWluRmlsdGVyID09PSB2bikgJiYgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIGxpbmVhciBmaWx0ZXJpbmcgd2l0aCBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcy4gT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIiksIGUudGV4UGFyYW1ldGVyaSh1LCBlLlRFWFRVUkVfV1JBUF9TLCBtZVthLndyYXBTXSksIGUudGV4UGFyYW1ldGVyaSh1LCBlLlRFWFRVUkVfV1JBUF9ULCBtZVthLndyYXBUXSksICh1ID09PSBlLlRFWFRVUkVfM0QgfHwgdSA9PT0gZS5URVhUVVJFXzJEX0FSUkFZKSAmJiBlLnRleFBhcmFtZXRlcmkodSwgZS5URVhUVVJFX1dSQVBfUiwgbWVbYS53cmFwUl0pLCBlLnRleFBhcmFtZXRlcmkodSwgZS5URVhUVVJFX01BR19GSUxURVIsIE1lW2EubWFnRmlsdGVyXSksIGUudGV4UGFyYW1ldGVyaSh1LCBlLlRFWFRVUkVfTUlOX0ZJTFRFUiwgTWVbYS5taW5GaWx0ZXJdKSwgYS5jb21wYXJlRnVuY3Rpb24gJiYgKGUudGV4UGFyYW1ldGVyaSh1LCBlLlRFWFRVUkVfQ09NUEFSRV9NT0RFLCBlLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpLCBlLnRleFBhcmFtZXRlcmkodSwgZS5URVhUVVJFX0NPTVBBUkVfRlVOQywgTGVbYS5jb21wYXJlRnVuY3Rpb25dKSksIG4uaGFzKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSA9PT0gITApIHsKICAgICAgICAgICAgaWYgKGEubWFnRmlsdGVyID09PSBVdCB8fCBhLm1pbkZpbHRlciAhPT0gWmwgJiYgYS5taW5GaWx0ZXIgIT09IHZuIHx8IGEudHlwZSA9PT0gcGkgJiYgbi5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpID09PSAhMSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoYS5hbmlzb3Ryb3B5ID4gMSB8fCBpLmdldChhKS5fX2N1cnJlbnRBbmlzb3Ryb3B5KSB7CiAgICAgICAgICAgICAgICBsZXQgYiA9IG4uZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTsKICAgICAgICAgICAgICAgIGUudGV4UGFyYW1ldGVyZih1LCBiLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbihhLmFuaXNvdHJvcHksIGMuZ2V0TWF4QW5pc290cm9weSgpKSksIGkuZ2V0KGEpLl9fY3VycmVudEFuaXNvdHJvcHkgPSBhLmFuaXNvdHJvcHk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBaZSh1LCBhKSB7CiAgICAgICAgbGV0IGIgPSAhMTsKICAgICAgICB1Ll9fd2ViZ2xJbml0ID09PSB2b2lkIDAgJiYgKHUuX193ZWJnbEluaXQgPSAhMCwgYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgUCkpOwogICAgICAgIGxldCBXID0gYS5zb3VyY2UsIEsgPSBTLmdldChXKTsKICAgICAgICBLID09PSB2b2lkIDAgJiYgKEsgPSB7fSwgUy5zZXQoVywgSykpOwogICAgICAgIGxldCBHID0gWShhKTsKICAgICAgICBpZiAoRyAhPT0gdS5fX2NhY2hlS2V5KSB7CiAgICAgICAgICAgIEtbR10gPT09IHZvaWQgMCAmJiAoS1tHXSA9IHsKICAgICAgICAgICAgICAgIHRleHR1cmU6IGUuY3JlYXRlVGV4dHVyZSgpLAogICAgICAgICAgICAgICAgdXNlZFRpbWVzOiAwCiAgICAgICAgICAgIH0sIGgubWVtb3J5LnRleHR1cmVzKyssIGIgPSAhMCksIEtbR10udXNlZFRpbWVzKys7CiAgICAgICAgICAgIGxldCBwZSA9IEtbdS5fX2NhY2hlS2V5XTsKICAgICAgICAgICAgcGUgIT09IHZvaWQgMCAmJiAoS1t1Ll9fY2FjaGVLZXldLnVzZWRUaW1lcy0tLCBwZS51c2VkVGltZXMgPT09IDAgJiYgcChhKSksIHUuX19jYWNoZUtleSA9IEcsIHUuX193ZWJnbFRleHR1cmUgPSBLW0ddLnRleHR1cmU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiOwogICAgfQogICAgZnVuY3Rpb24gayh1LCBhLCBiKSB7CiAgICAgICAgbGV0IFcgPSBlLlRFWFRVUkVfMkQ7CiAgICAgICAgKGEuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGEuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSAmJiAoVyA9IGUuVEVYVFVSRV8yRF9BUlJBWSksIGEuaXNEYXRhM0RUZXh0dXJlICYmIChXID0gZS5URVhUVVJFXzNEKTsKICAgICAgICBsZXQgSyA9IFplKHUsIGEpLCBHID0gYS5zb3VyY2U7CiAgICAgICAgdC5iaW5kVGV4dHVyZShXLCB1Ll9fd2ViZ2xUZXh0dXJlLCBlLlRFWFRVUkUwICsgYik7CiAgICAgICAgbGV0IHBlID0gaS5nZXQoRyk7CiAgICAgICAgaWYgKEcudmVyc2lvbiAhPT0gcGUuX192ZXJzaW9uIHx8IEsgPT09ICEwKSB7CiAgICAgICAgICAgIHQuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwICsgYik7CiAgICAgICAgICAgIGxldCByZSA9IFR0LmdldFByaW1hcmllcyhUdC53b3JraW5nQ29sb3JTcGFjZSksIGNlID0gYS5jb2xvclNwYWNlID09PSB6bCA/IG51bGwgOiBUdC5nZXRQcmltYXJpZXMoYS5jb2xvclNwYWNlKSwgeWUgPSBhLmNvbG9yU3BhY2UgPT09IHpsIHx8IHJlID09PSBjZSA/IGUuTk9ORSA6IGUuQlJPV1NFUl9ERUZBVUxUX1dFQkdMOwogICAgICAgICAgICBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgYS5mbGlwWSksIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGEucHJlbXVsdGlwbHlBbHBoYSksIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfQUxJR05NRU5ULCBhLnVucGFja0FsaWdubWVudCksIGUucGl4ZWxTdG9yZWkoZS5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLCB5ZSk7CiAgICAgICAgICAgIGxldCBaID0gTChhLmltYWdlLCAhMSwgYy5tYXhUZXh0dXJlU2l6ZSk7CiAgICAgICAgICAgIFogPSBYZShhLCBaKTsKICAgICAgICAgICAgbGV0IGxlID0gcy5jb252ZXJ0KGEuZm9ybWF0LCBhLmNvbG9yU3BhY2UpLCBTZSA9IHMuY29udmVydChhLnR5cGUpLCB4ZSA9IE0oYS5pbnRlcm5hbEZvcm1hdCwgbGUsIFNlLCBhLmNvbG9yU3BhY2UsIGEuaXNWaWRlb1RleHR1cmUpOwogICAgICAgICAgICBHZShXLCBhKTsKICAgICAgICAgICAgbGV0IGZlLCBJZSA9IGEubWlwbWFwcywgYmUgPSBhLmlzVmlkZW9UZXh0dXJlICE9PSAhMCwgemUgPSBwZS5fX3ZlcnNpb24gPT09IHZvaWQgMCB8fCBLID09PSAhMCwgdiA9IEcuZGF0YVJlYWR5LCB0ZSA9IEgoYSwgWik7CiAgICAgICAgICAgIGlmIChhLmlzRGVwdGhUZXh0dXJlKSB4ZSA9IF8oYS5mb3JtYXQgPT09IGFhLCBhLnR5cGUpLCB6ZSAmJiAoYmUgPyB0LnRleFN0b3JhZ2UyRChlLlRFWFRVUkVfMkQsIDEsIHhlLCBaLndpZHRoLCBaLmhlaWdodCkgOiB0LnRleEltYWdlMkQoZS5URVhUVVJFXzJELCAwLCB4ZSwgWi53aWR0aCwgWi5oZWlnaHQsIDAsIGxlLCBTZSwgbnVsbCkpOwogICAgICAgICAgICBlbHNlIGlmIChhLmlzRGF0YVRleHR1cmUpIGlmIChJZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBiZSAmJiB6ZSAmJiB0LnRleFN0b3JhZ2UyRChlLlRFWFRVUkVfMkQsIHRlLCB4ZSwgSWVbMF0ud2lkdGgsIEllWzBdLmhlaWdodCk7CiAgICAgICAgICAgICAgICBmb3IobGV0IE4gPSAwLCBYID0gSWUubGVuZ3RoOyBOIDwgWDsgTisrKWZlID0gSWVbTl0sIGJlID8gdiAmJiB0LnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELCBOLCAwLCAwLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCBsZSwgU2UsIGZlLmRhdGEpIDogdC50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwgTiwgeGUsIGZlLndpZHRoLCBmZS5oZWlnaHQsIDAsIGxlLCBTZSwgZmUuZGF0YSk7CiAgICAgICAgICAgICAgICBhLmdlbmVyYXRlTWlwbWFwcyA9ICExOwogICAgICAgICAgICB9IGVsc2UgYmUgPyAoemUgJiYgdC50ZXhTdG9yYWdlMkQoZS5URVhUVVJFXzJELCB0ZSwgeGUsIFoud2lkdGgsIFouaGVpZ2h0KSwgdiAmJiB0LnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELCAwLCAwLCAwLCBaLndpZHRoLCBaLmhlaWdodCwgbGUsIFNlLCBaLmRhdGEpKSA6IHQudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsIDAsIHhlLCBaLndpZHRoLCBaLmhlaWdodCwgMCwgbGUsIFNlLCBaLmRhdGEpOwogICAgICAgICAgICBlbHNlIGlmIChhLmlzQ29tcHJlc3NlZFRleHR1cmUpIGlmIChhLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkgewogICAgICAgICAgICAgICAgYmUgJiYgemUgJiYgdC50ZXhTdG9yYWdlM0QoZS5URVhUVVJFXzJEX0FSUkFZLCB0ZSwgeGUsIEllWzBdLndpZHRoLCBJZVswXS5oZWlnaHQsIFouZGVwdGgpOwogICAgICAgICAgICAgICAgZm9yKGxldCBOID0gMCwgWCA9IEllLmxlbmd0aDsgTiA8IFg7IE4rKylpZiAoZmUgPSBJZVtOXSwgYS5mb3JtYXQgIT09IExpKSBpZiAobGUgIT09IG51bGwpIGlmIChiZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2KSBpZiAoYS5sYXllclVwZGF0ZXMuc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9lID0gTmQoZmUud2lkdGgsIGZlLmhlaWdodCwgYS5mb3JtYXQsIGEudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFlIG9mIGEubGF5ZXJVcGRhdGVzKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDZSA9IGZlLmRhdGEuc3ViYXJyYXkoYWUgKiBvZSAvIGZlLmRhdGEuQllURVNfUEVSX0VMRU1FTlQsIChhZSArIDEpICogb2UgLyBmZS5kYXRhLkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoZS5URVhUVVJFXzJEX0FSUkFZLCBOLCAwLCAwLCBhZSwgZmUud2lkdGgsIGZlLmhlaWdodCwgMSwgbGUsIENlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhLmNsZWFyTGF5ZXJVcGRhdGVzKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHQuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoZS5URVhUVVJFXzJEX0FSUkFZLCBOLCAwLCAwLCAwLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCBaLmRlcHRoLCBsZSwgZmUuZGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgdC5jb21wcmVzc2VkVGV4SW1hZ2UzRChlLlRFWFRVUkVfMkRfQVJSQVksIE4sIHhlLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCBaLmRlcHRoLCAwLCBmZS5kYXRhLCAwLCAwKTsKICAgICAgICAgICAgICAgIGVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik7CiAgICAgICAgICAgICAgICBlbHNlIGJlID8gdiAmJiB0LnRleFN1YkltYWdlM0QoZS5URVhUVVJFXzJEX0FSUkFZLCBOLCAwLCAwLCAwLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCBaLmRlcHRoLCBsZSwgU2UsIGZlLmRhdGEpIDogdC50ZXhJbWFnZTNEKGUuVEVYVFVSRV8yRF9BUlJBWSwgTiwgeGUsIGZlLndpZHRoLCBmZS5oZWlnaHQsIFouZGVwdGgsIDAsIGxlLCBTZSwgZmUuZGF0YSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBiZSAmJiB6ZSAmJiB0LnRleFN0b3JhZ2UyRChlLlRFWFRVUkVfMkQsIHRlLCB4ZSwgSWVbMF0ud2lkdGgsIEllWzBdLmhlaWdodCk7CiAgICAgICAgICAgICAgICBmb3IobGV0IE4gPSAwLCBYID0gSWUubGVuZ3RoOyBOIDwgWDsgTisrKWZlID0gSWVbTl0sIGEuZm9ybWF0ICE9PSBMaSA/IGxlICE9PSBudWxsID8gYmUgPyB2ICYmIHQuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELCBOLCAwLCAwLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCBsZSwgZmUuZGF0YSkgOiB0LmNvbXByZXNzZWRUZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwgTiwgeGUsIGZlLndpZHRoLCBmZS5oZWlnaHQsIDAsIGZlLmRhdGEpIDogY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIikgOiBiZSA/IHYgJiYgdC50ZXhTdWJJbWFnZTJEKGUuVEVYVFVSRV8yRCwgTiwgMCwgMCwgZmUud2lkdGgsIGZlLmhlaWdodCwgbGUsIFNlLCBmZS5kYXRhKSA6IHQudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsIE4sIHhlLCBmZS53aWR0aCwgZmUuaGVpZ2h0LCAwLCBsZSwgU2UsIGZlLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGEuaXNEYXRhQXJyYXlUZXh0dXJlKSBpZiAoYmUpIHsKICAgICAgICAgICAgICAgIGlmICh6ZSAmJiB0LnRleFN0b3JhZ2UzRChlLlRFWFRVUkVfMkRfQVJSQVksIHRlLCB4ZSwgWi53aWR0aCwgWi5oZWlnaHQsIFouZGVwdGgpLCB2KSBpZiAoYS5sYXllclVwZGF0ZXMuc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBsZXQgTiA9IE5kKFoud2lkdGgsIFouaGVpZ2h0LCBhLmZvcm1hdCwgYS50eXBlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBYIG9mIGEubGF5ZXJVcGRhdGVzKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9lID0gWi5kYXRhLnN1YmFycmF5KFggKiBOIC8gWi5kYXRhLkJZVEVTX1BFUl9FTEVNRU5ULCAoWCArIDEpICogTiAvIFouZGF0YS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQudGV4U3ViSW1hZ2UzRChlLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIFgsIFoud2lkdGgsIFouaGVpZ2h0LCAxLCBsZSwgU2UsIG9lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5jbGVhckxheWVyVXBkYXRlcygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHQudGV4U3ViSW1hZ2UzRChlLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIDAsIFoud2lkdGgsIFouaGVpZ2h0LCBaLmRlcHRoLCBsZSwgU2UsIFouZGF0YSk7CiAgICAgICAgICAgIH0gZWxzZSB0LnRleEltYWdlM0QoZS5URVhUVVJFXzJEX0FSUkFZLCAwLCB4ZSwgWi53aWR0aCwgWi5oZWlnaHQsIFouZGVwdGgsIDAsIGxlLCBTZSwgWi5kYXRhKTsKICAgICAgICAgICAgZWxzZSBpZiAoYS5pc0RhdGEzRFRleHR1cmUpIGJlID8gKHplICYmIHQudGV4U3RvcmFnZTNEKGUuVEVYVFVSRV8zRCwgdGUsIHhlLCBaLndpZHRoLCBaLmhlaWdodCwgWi5kZXB0aCksIHYgJiYgdC50ZXhTdWJJbWFnZTNEKGUuVEVYVFVSRV8zRCwgMCwgMCwgMCwgMCwgWi53aWR0aCwgWi5oZWlnaHQsIFouZGVwdGgsIGxlLCBTZSwgWi5kYXRhKSkgOiB0LnRleEltYWdlM0QoZS5URVhUVVJFXzNELCAwLCB4ZSwgWi53aWR0aCwgWi5oZWlnaHQsIFouZGVwdGgsIDAsIGxlLCBTZSwgWi5kYXRhKTsKICAgICAgICAgICAgZWxzZSBpZiAoYS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSkgewogICAgICAgICAgICAgICAgaWYgKHplKSBpZiAoYmUpIHQudGV4U3RvcmFnZTJEKGUuVEVYVFVSRV8yRCwgdGUsIHhlLCBaLndpZHRoLCBaLmhlaWdodCk7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZXQgTiA9IFoud2lkdGgsIFggPSBaLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IG9lID0gMDsgb2UgPCB0ZTsgb2UrKyl0LnRleEltYWdlMkQoZS5URVhUVVJFXzJELCBvZSwgeGUsIE4sIFgsIDAsIGxlLCBTZSwgbnVsbCksIE4gPj49IDEsIFggPj49IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoSWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgaWYgKGJlICYmIHplKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IE4gPSBoZShJZVswXSk7CiAgICAgICAgICAgICAgICAgICAgdC50ZXhTdG9yYWdlMkQoZS5URVhUVVJFXzJELCB0ZSwgeGUsIE4ud2lkdGgsIE4uaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvcihsZXQgTiA9IDAsIFggPSBJZS5sZW5ndGg7IE4gPCBYOyBOKyspZmUgPSBJZVtOXSwgYmUgPyB2ICYmIHQudGV4U3ViSW1hZ2UyRChlLlRFWFRVUkVfMkQsIE4sIDAsIDAsIGxlLCBTZSwgZmUpIDogdC50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwgTiwgeGUsIGxlLCBTZSwgZmUpOwogICAgICAgICAgICAgICAgYS5nZW5lcmF0ZU1pcG1hcHMgPSAhMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChiZSkgewogICAgICAgICAgICAgICAgaWYgKHplKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IE4gPSBoZShaKTsKICAgICAgICAgICAgICAgICAgICB0LnRleFN0b3JhZ2UyRChlLlRFWFRVUkVfMkQsIHRlLCB4ZSwgTi53aWR0aCwgTi5oZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdiAmJiB0LnRleFN1YkltYWdlMkQoZS5URVhUVVJFXzJELCAwLCAwLCAwLCBsZSwgU2UsIFopOwogICAgICAgICAgICB9IGVsc2UgdC50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwgMCwgeGUsIGxlLCBTZSwgWik7CiAgICAgICAgICAgIGwoYSkgJiYgcihXKSwgcGUuX192ZXJzaW9uID0gRy52ZXJzaW9uLCBhLm9uVXBkYXRlICYmIGEub25VcGRhdGUoYSk7CiAgICAgICAgfQogICAgICAgIHUuX192ZXJzaW9uID0gYS52ZXJzaW9uOwogICAgfQogICAgZnVuY3Rpb24gSih1LCBhLCBiKSB7CiAgICAgICAgaWYgKGEuaW1hZ2UubGVuZ3RoICE9PSA2KSByZXR1cm47CiAgICAgICAgbGV0IFcgPSBaZSh1LCBhKSwgSyA9IGEuc291cmNlOwogICAgICAgIHQuYmluZFRleHR1cmUoZS5URVhUVVJFX0NVQkVfTUFQLCB1Ll9fd2ViZ2xUZXh0dXJlLCBlLlRFWFRVUkUwICsgYik7CiAgICAgICAgbGV0IEcgPSBpLmdldChLKTsKICAgICAgICBpZiAoSy52ZXJzaW9uICE9PSBHLl9fdmVyc2lvbiB8fCBXID09PSAhMCkgewogICAgICAgICAgICB0LmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCArIGIpOwogICAgICAgICAgICBsZXQgcGUgPSBUdC5nZXRQcmltYXJpZXMoVHQud29ya2luZ0NvbG9yU3BhY2UpLCByZSA9IGEuY29sb3JTcGFjZSA9PT0gemwgPyBudWxsIDogVHQuZ2V0UHJpbWFyaWVzKGEuY29sb3JTcGFjZSksIGNlID0gYS5jb2xvclNwYWNlID09PSB6bCB8fCBwZSA9PT0gcmUgPyBlLk5PTkUgOiBlLkJST1dTRVJfREVGQVVMVF9XRUJHTDsKICAgICAgICAgICAgZS5waXhlbFN0b3JlaShlLlVOUEFDS19GTElQX1lfV0VCR0wsIGEuZmxpcFkpLCBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBhLnByZW11bHRpcGx5QWxwaGEpLCBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX0FMSUdOTUVOVCwgYS51bnBhY2tBbGlnbm1lbnQpLCBlLnBpeGVsU3RvcmVpKGUuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCwgY2UpOwogICAgICAgICAgICBsZXQgeWUgPSBhLmlzQ29tcHJlc3NlZFRleHR1cmUgfHwgYS5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlLCBaID0gYS5pbWFnZVswXSAmJiBhLmltYWdlWzBdLmlzRGF0YVRleHR1cmUsIGxlID0gW107CiAgICAgICAgICAgIGZvcihsZXQgWCA9IDA7IFggPCA2OyBYKyspIXllICYmICFaID8gbGVbWF0gPSBMKGEuaW1hZ2VbWF0sICEwLCBjLm1heEN1YmVtYXBTaXplKSA6IGxlW1hdID0gWiA/IGEuaW1hZ2VbWF0uaW1hZ2UgOiBhLmltYWdlW1hdLCBsZVtYXSA9IFhlKGEsIGxlW1hdKTsKICAgICAgICAgICAgbGV0IFNlID0gbGVbMF0sIHhlID0gcy5jb252ZXJ0KGEuZm9ybWF0LCBhLmNvbG9yU3BhY2UpLCBmZSA9IHMuY29udmVydChhLnR5cGUpLCBJZSA9IE0oYS5pbnRlcm5hbEZvcm1hdCwgeGUsIGZlLCBhLmNvbG9yU3BhY2UpLCBiZSA9IGEuaXNWaWRlb1RleHR1cmUgIT09ICEwLCB6ZSA9IEcuX192ZXJzaW9uID09PSB2b2lkIDAgfHwgVyA9PT0gITAsIHYgPSBLLmRhdGFSZWFkeSwgdGUgPSBIKGEsIFNlKTsKICAgICAgICAgICAgR2UoZS5URVhUVVJFX0NVQkVfTUFQLCBhKTsKICAgICAgICAgICAgbGV0IE47CiAgICAgICAgICAgIGlmICh5ZSkgewogICAgICAgICAgICAgICAgYmUgJiYgemUgJiYgdC50ZXhTdG9yYWdlMkQoZS5URVhUVVJFX0NVQkVfTUFQLCB0ZSwgSWUsIFNlLndpZHRoLCBTZS5oZWlnaHQpOwogICAgICAgICAgICAgICAgZm9yKGxldCBYID0gMDsgWCA8IDY7IFgrKyl7CiAgICAgICAgICAgICAgICAgICAgTiA9IGxlW1hdLm1pcG1hcHM7CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBvZSA9IDA7IG9lIDwgTi5sZW5ndGg7IG9lKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWUgPSBOW29lXTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5mb3JtYXQgIT09IExpID8geGUgIT09IG51bGwgPyBiZSA/IHYgJiYgdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIFgsIG9lLCAwLCAwLCBhZS53aWR0aCwgYWUuaGVpZ2h0LCB4ZSwgYWUuZGF0YSkgOiB0LmNvbXByZXNzZWRUZXhJbWFnZTJEKGUuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgWCwgb2UsIEllLCBhZS53aWR0aCwgYWUuaGVpZ2h0LCAwLCBhZS5kYXRhKSA6IGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCkiKSA6IGJlID8gdiAmJiB0LnRleFN1YkltYWdlMkQoZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBYLCBvZSwgMCwgMCwgYWUud2lkdGgsIGFlLmhlaWdodCwgeGUsIGZlLCBhZS5kYXRhKSA6IHQudGV4SW1hZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIFgsIG9lLCBJZSwgYWUud2lkdGgsIGFlLmhlaWdodCwgMCwgeGUsIGZlLCBhZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoTiA9IGEubWlwbWFwcywgYmUgJiYgemUpIHsKICAgICAgICAgICAgICAgICAgICBOLmxlbmd0aCA+IDAgJiYgdGUrKzsKICAgICAgICAgICAgICAgICAgICBsZXQgWCA9IGhlKGxlWzBdKTsKICAgICAgICAgICAgICAgICAgICB0LnRleFN0b3JhZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVAsIHRlLCBJZSwgWC53aWR0aCwgWC5oZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yKGxldCBYID0gMDsgWCA8IDY7IFgrKylpZiAoWikgewogICAgICAgICAgICAgICAgICAgIGJlID8gdiAmJiB0LnRleFN1YkltYWdlMkQoZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBYLCAwLCAwLCAwLCBsZVtYXS53aWR0aCwgbGVbWF0uaGVpZ2h0LCB4ZSwgZmUsIGxlW1hdLmRhdGEpIDogdC50ZXhJbWFnZTJEKGUuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgWCwgMCwgSWUsIGxlW1hdLndpZHRoLCBsZVtYXS5oZWlnaHQsIDAsIHhlLCBmZSwgbGVbWF0uZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBvZSA9IDA7IG9lIDwgTi5sZW5ndGg7IG9lKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgQ2UgPSBOW29lXS5pbWFnZVtYXS5pbWFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgYmUgPyB2ICYmIHQudGV4U3ViSW1hZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIFgsIG9lICsgMSwgMCwgMCwgQ2Uud2lkdGgsIENlLmhlaWdodCwgeGUsIGZlLCBDZS5kYXRhKSA6IHQudGV4SW1hZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIFgsIG9lICsgMSwgSWUsIENlLndpZHRoLCBDZS5oZWlnaHQsIDAsIHhlLCBmZSwgQ2UuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBiZSA/IHYgJiYgdC50ZXhTdWJJbWFnZTJEKGUuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgWCwgMCwgMCwgMCwgeGUsIGZlLCBsZVtYXSkgOiB0LnRleEltYWdlMkQoZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBYLCAwLCBJZSwgeGUsIGZlLCBsZVtYXSk7CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBvZSA9IDA7IG9lIDwgTi5sZW5ndGg7IG9lKyspewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWUgPSBOW29lXTsKICAgICAgICAgICAgICAgICAgICAgICAgYmUgPyB2ICYmIHQudGV4U3ViSW1hZ2UyRChlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIFgsIG9lICsgMSwgMCwgMCwgeGUsIGZlLCBhZS5pbWFnZVtYXSkgOiB0LnRleEltYWdlMkQoZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBYLCBvZSArIDEsIEllLCB4ZSwgZmUsIGFlLmltYWdlW1hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbChhKSAmJiByKGUuVEVYVFVSRV9DVUJFX01BUCksIEcuX192ZXJzaW9uID0gSy52ZXJzaW9uLCBhLm9uVXBkYXRlICYmIGEub25VcGRhdGUoYSk7CiAgICAgICAgfQogICAgICAgIHUuX192ZXJzaW9uID0gYS52ZXJzaW9uOwogICAgfQogICAgZnVuY3Rpb24gdWUodSwgYSwgYiwgVywgSywgRykgewogICAgICAgIGxldCBwZSA9IHMuY29udmVydChiLmZvcm1hdCwgYi5jb2xvclNwYWNlKSwgcmUgPSBzLmNvbnZlcnQoYi50eXBlKSwgY2UgPSBNKGIuaW50ZXJuYWxGb3JtYXQsIHBlLCByZSwgYi5jb2xvclNwYWNlKSwgeWUgPSBpLmdldChhKSwgWiA9IGkuZ2V0KGIpOwogICAgICAgIGlmIChaLl9fcmVuZGVyVGFyZ2V0ID0gYSwgIXllLl9faGFzRXh0ZXJuYWxUZXh0dXJlcykgewogICAgICAgICAgICBsZXQgbGUgPSBNYXRoLm1heCgxLCBhLndpZHRoID4+IEcpLCBTZSA9IE1hdGgubWF4KDEsIGEuaGVpZ2h0ID4+IEcpOwogICAgICAgICAgICBLID09PSBlLlRFWFRVUkVfM0QgfHwgSyA9PT0gZS5URVhUVVJFXzJEX0FSUkFZID8gdC50ZXhJbWFnZTNEKEssIEcsIGNlLCBsZSwgU2UsIGEuZGVwdGgsIDAsIHBlLCByZSwgbnVsbCkgOiB0LnRleEltYWdlMkQoSywgRywgY2UsIGxlLCBTZSwgMCwgcGUsIHJlLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgdC5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUiwgdSksIHdlKGEpID8gZC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKGUuRlJBTUVCVUZGRVIsIFcsIEssIFouX193ZWJnbFRleHR1cmUsIDAsIERlKGEpKSA6IChLID09PSBlLlRFWFRVUkVfMkQgfHwgSyA+PSBlLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAmJiBLIDw9IGUuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aKSAmJiBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsIFcsIEssIFouX193ZWJnbFRleHR1cmUsIEcpLCB0LmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIGllKHUsIGEsIGIpIHsKICAgICAgICBpZiAoZS5iaW5kUmVuZGVyYnVmZmVyKGUuUkVOREVSQlVGRkVSLCB1KSwgYS5kZXB0aEJ1ZmZlcikgewogICAgICAgICAgICBsZXQgVyA9IGEuZGVwdGhUZXh0dXJlLCBLID0gVyAmJiBXLmlzRGVwdGhUZXh0dXJlID8gVy50eXBlIDogbnVsbCwgRyA9IF8oYS5zdGVuY2lsQnVmZmVyLCBLKSwgcGUgPSBhLnN0ZW5jaWxCdWZmZXIgPyBlLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IGUuREVQVEhfQVRUQUNITUVOVCwgcmUgPSBEZShhKTsKICAgICAgICAgICAgd2UoYSkgPyBkLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChlLlJFTkRFUkJVRkZFUiwgcmUsIEcsIGEud2lkdGgsIGEuaGVpZ2h0KSA6IGIgPyBlLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShlLlJFTkRFUkJVRkZFUiwgcmUsIEcsIGEud2lkdGgsIGEuaGVpZ2h0KSA6IGUucmVuZGVyYnVmZmVyU3RvcmFnZShlLlJFTkRFUkJVRkZFUiwgRywgYS53aWR0aCwgYS5oZWlnaHQpLCBlLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHBlLCBlLlJFTkRFUkJVRkZFUiwgdSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IFcgPSBhLnRleHR1cmVzOwogICAgICAgICAgICBmb3IobGV0IEsgPSAwOyBLIDwgVy5sZW5ndGg7IEsrKyl7CiAgICAgICAgICAgICAgICBsZXQgRyA9IFdbS10sIHBlID0gcy5jb252ZXJ0KEcuZm9ybWF0LCBHLmNvbG9yU3BhY2UpLCByZSA9IHMuY29udmVydChHLnR5cGUpLCBjZSA9IE0oRy5pbnRlcm5hbEZvcm1hdCwgcGUsIHJlLCBHLmNvbG9yU3BhY2UpLCB5ZSA9IERlKGEpOwogICAgICAgICAgICAgICAgYiAmJiB3ZShhKSA9PT0gITEgPyBlLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShlLlJFTkRFUkJVRkZFUiwgeWUsIGNlLCBhLndpZHRoLCBhLmhlaWdodCkgOiB3ZShhKSA/IGQucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKGUuUkVOREVSQlVGRkVSLCB5ZSwgY2UsIGEud2lkdGgsIGEuaGVpZ2h0KSA6IGUucmVuZGVyYnVmZmVyU3RvcmFnZShlLlJFTkRFUkJVRkZFUiwgY2UsIGEud2lkdGgsIGEuaGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlLmJpbmRSZW5kZXJidWZmZXIoZS5SRU5ERVJCVUZGRVIsIG51bGwpOwogICAgfQogICAgZnVuY3Rpb24gRWUodSwgYSkgewogICAgICAgIGlmIChhICYmIGEuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpIHRocm93IG5ldyBFcnJvcigiRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgIGlmICh0LmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLCB1KSwgIShhLmRlcHRoVGV4dHVyZSAmJiBhLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSkpIHRocm93IG5ldyBFcnJvcigicmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZSIpOwogICAgICAgIGxldCBXID0gaS5nZXQoYS5kZXB0aFRleHR1cmUpOwogICAgICAgIFcuX19yZW5kZXJUYXJnZXQgPSBhLCAoIVcuX193ZWJnbFRleHR1cmUgfHwgYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IGEud2lkdGggfHwgYS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSBhLmhlaWdodCkgJiYgKGEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gYS53aWR0aCwgYS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gYS5oZWlnaHQsIGEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gITApLCBRKGEuZGVwdGhUZXh0dXJlLCAwKTsKICAgICAgICBsZXQgSyA9IFcuX193ZWJnbFRleHR1cmUsIEcgPSBEZShhKTsKICAgICAgICBpZiAoYS5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBDbikgd2UoYSkgPyBkLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoZS5GUkFNRUJVRkZFUiwgZS5ERVBUSF9BVFRBQ0hNRU5ULCBlLlRFWFRVUkVfMkQsIEssIDAsIEcpIDogZS5mcmFtZWJ1ZmZlclRleHR1cmUyRChlLkZSQU1FQlVGRkVSLCBlLkRFUFRIX0FUVEFDSE1FTlQsIGUuVEVYVFVSRV8yRCwgSywgMCk7CiAgICAgICAgZWxzZSBpZiAoYS5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBhYSkgd2UoYSkgPyBkLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoZS5GUkFNRUJVRkZFUiwgZS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIGUuVEVYVFVSRV8yRCwgSywgMCwgRykgOiBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsIGUuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBlLlRFWFRVUkVfMkQsIEssIDApOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTsKICAgIH0KICAgIGZ1bmN0aW9uIEJlKHUpIHsKICAgICAgICBsZXQgYSA9IGkuZ2V0KHUpLCBiID0gdS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gITA7CiAgICAgICAgaWYgKGEuX19ib3VuZERlcHRoVGV4dHVyZSAhPT0gdS5kZXB0aFRleHR1cmUpIHsKICAgICAgICAgICAgbGV0IFcgPSB1LmRlcHRoVGV4dHVyZTsKICAgICAgICAgICAgaWYgKGEuX19kZXB0aERpc3Bvc2VDYWxsYmFjayAmJiBhLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2soKSwgVykgewogICAgICAgICAgICAgICAgbGV0IEsgPSAoKT0+ewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhLl9fYm91bmREZXB0aFRleHR1cmUsIGRlbGV0ZSBhLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2ssIFcucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIEspOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFcuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIEspLCBhLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2sgPSBLOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGEuX19ib3VuZERlcHRoVGV4dHVyZSA9IFc7CiAgICAgICAgfQogICAgICAgIGlmICh1LmRlcHRoVGV4dHVyZSAmJiAhYS5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyKSB7CiAgICAgICAgICAgIGlmIChiKSB0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7CiAgICAgICAgICAgIEVlKGEuX193ZWJnbEZyYW1lYnVmZmVyLCB1KTsKICAgICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICAgICAgYS5fX3dlYmdsRGVwdGhidWZmZXIgPSBbXTsKICAgICAgICAgICAgZm9yKGxldCBXID0gMDsgVyA8IDY7IFcrKylpZiAodC5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUiwgYS5fX3dlYmdsRnJhbWVidWZmZXJbV10pLCBhLl9fd2ViZ2xEZXB0aGJ1ZmZlcltXXSA9PT0gdm9pZCAwKSBhLl9fd2ViZ2xEZXB0aGJ1ZmZlcltXXSA9IGUuY3JlYXRlUmVuZGVyYnVmZmVyKCksIGllKGEuX193ZWJnbERlcHRoYnVmZmVyW1ddLCB1LCAhMSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IEsgPSB1LnN0ZW5jaWxCdWZmZXIgPyBlLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IGUuREVQVEhfQVRUQUNITUVOVCwgRyA9IGEuX193ZWJnbERlcHRoYnVmZmVyW1ddOwogICAgICAgICAgICAgICAgZS5iaW5kUmVuZGVyYnVmZmVyKGUuUkVOREVSQlVGRkVSLCBHKSwgZS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBLLCBlLlJFTkRFUkJVRkZFUiwgRyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIGEuX193ZWJnbEZyYW1lYnVmZmVyKSwgYS5fX3dlYmdsRGVwdGhidWZmZXIgPT09IHZvaWQgMCkgYS5fX3dlYmdsRGVwdGhidWZmZXIgPSBlLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLCBpZShhLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgdSwgITEpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgVyA9IHUuc3RlbmNpbEJ1ZmZlciA/IGUuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogZS5ERVBUSF9BVFRBQ0hNRU5ULCBLID0gYS5fX3dlYmdsRGVwdGhidWZmZXI7CiAgICAgICAgICAgIGUuYmluZFJlbmRlcmJ1ZmZlcihlLlJFTkRFUkJVRkZFUiwgSyksIGUuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUiwgVywgZS5SRU5ERVJCVUZGRVIsIEspOwogICAgICAgIH0KICAgICAgICB0LmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIFRlKHUsIGEsIGIpIHsKICAgICAgICBsZXQgVyA9IGkuZ2V0KHUpOwogICAgICAgIGEgIT09IHZvaWQgMCAmJiB1ZShXLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgdSwgdS50ZXh0dXJlLCBlLkNPTE9SX0FUVEFDSE1FTlQwLCBlLlRFWFRVUkVfMkQsIDApLCBiICE9PSB2b2lkIDAgJiYgQmUodSk7CiAgICB9CiAgICBmdW5jdGlvbiBqZSh1KSB7CiAgICAgICAgbGV0IGEgPSB1LnRleHR1cmUsIGIgPSBpLmdldCh1KSwgVyA9IGkuZ2V0KGEpOwogICAgICAgIHUuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIHkxKTsKICAgICAgICBsZXQgSyA9IHUudGV4dHVyZXMsIEcgPSB1LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID09PSAhMCwgcGUgPSBLLmxlbmd0aCA+IDE7CiAgICAgICAgaWYgKHBlIHx8IChXLl9fd2ViZ2xUZXh0dXJlID09PSB2b2lkIDAgJiYgKFcuX193ZWJnbFRleHR1cmUgPSBlLmNyZWF0ZVRleHR1cmUoKSksIFcuX192ZXJzaW9uID0gYS52ZXJzaW9uLCBoLm1lbW9yeS50ZXh0dXJlcysrKSwgRykgewogICAgICAgICAgICBiLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdOwogICAgICAgICAgICBmb3IobGV0IHJlID0gMDsgcmUgPCA2OyByZSsrKWlmIChhLm1pcG1hcHMgJiYgYS5taXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGIuX193ZWJnbEZyYW1lYnVmZmVyW3JlXSA9IFtdOwogICAgICAgICAgICAgICAgZm9yKGxldCBjZSA9IDA7IGNlIDwgYS5taXBtYXBzLmxlbmd0aDsgY2UrKyliLl9fd2ViZ2xGcmFtZWJ1ZmZlcltyZV1bY2VdID0gZS5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgICAgICB9IGVsc2UgYi5fX3dlYmdsRnJhbWVidWZmZXJbcmVdID0gZS5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhLm1pcG1hcHMgJiYgYS5taXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGIuX193ZWJnbEZyYW1lYnVmZmVyID0gW107CiAgICAgICAgICAgICAgICBmb3IobGV0IHJlID0gMDsgcmUgPCBhLm1pcG1hcHMubGVuZ3RoOyByZSsrKWIuX193ZWJnbEZyYW1lYnVmZmVyW3JlXSA9IGUuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICAgICAgfSBlbHNlIGIuX193ZWJnbEZyYW1lYnVmZmVyID0gZS5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgICAgICBpZiAocGUpIGZvcihsZXQgcmUgPSAwLCBjZSA9IEsubGVuZ3RoOyByZSA8IGNlOyByZSsrKXsKICAgICAgICAgICAgICAgIGxldCB5ZSA9IGkuZ2V0KEtbcmVdKTsKICAgICAgICAgICAgICAgIHllLl9fd2ViZ2xUZXh0dXJlID09PSB2b2lkIDAgJiYgKHllLl9fd2ViZ2xUZXh0dXJlID0gZS5jcmVhdGVUZXh0dXJlKCksIGgubWVtb3J5LnRleHR1cmVzKyspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1LnNhbXBsZXMgPiAwICYmIHdlKHUpID09PSAhMSkgewogICAgICAgICAgICAgICAgYi5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgPSBlLmNyZWF0ZUZyYW1lYnVmZmVyKCksIGIuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyID0gW10sIHQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIGIuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTsKICAgICAgICAgICAgICAgIGZvcihsZXQgcmUgPSAwOyByZSA8IEsubGVuZ3RoOyByZSsrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgY2UgPSBLW3JlXTsKICAgICAgICAgICAgICAgICAgICBiLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltyZV0gPSBlLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLCBlLmJpbmRSZW5kZXJidWZmZXIoZS5SRU5ERVJCVUZGRVIsIGIuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3JlXSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHllID0gcy5jb252ZXJ0KGNlLmZvcm1hdCwgY2UuY29sb3JTcGFjZSksIFogPSBzLmNvbnZlcnQoY2UudHlwZSksIGxlID0gTShjZS5pbnRlcm5hbEZvcm1hdCwgeWUsIFosIGNlLmNvbG9yU3BhY2UsIHUuaXNYUlJlbmRlclRhcmdldCA9PT0gITApLCBTZSA9IERlKHUpOwogICAgICAgICAgICAgICAgICAgIGUucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKGUuUkVOREVSQlVGRkVSLCBTZSwgbGUsIHUud2lkdGgsIHUuaGVpZ2h0KSwgZS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBlLkNPTE9SX0FUVEFDSE1FTlQwICsgcmUsIGUuUkVOREVSQlVGRkVSLCBiLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltyZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5iaW5kUmVuZGVyYnVmZmVyKGUuUkVOREVSQlVGRkVSLCBudWxsKSwgdS5kZXB0aEJ1ZmZlciAmJiAoYi5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgPSBlLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLCBpZShiLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciwgdSwgITApKSwgdC5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKEcpIHsKICAgICAgICAgICAgdC5iaW5kVGV4dHVyZShlLlRFWFRVUkVfQ1VCRV9NQVAsIFcuX193ZWJnbFRleHR1cmUpLCBHZShlLlRFWFRVUkVfQ1VCRV9NQVAsIGEpOwogICAgICAgICAgICBmb3IobGV0IHJlID0gMDsgcmUgPCA2OyByZSsrKWlmIChhLm1pcG1hcHMgJiYgYS5taXBtYXBzLmxlbmd0aCA+IDApIGZvcihsZXQgY2UgPSAwOyBjZSA8IGEubWlwbWFwcy5sZW5ndGg7IGNlKyspdWUoYi5fX3dlYmdsRnJhbWVidWZmZXJbcmVdW2NlXSwgdSwgYSwgZS5DT0xPUl9BVFRBQ0hNRU5UMCwgZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZSwgY2UpOwogICAgICAgICAgICBlbHNlIHVlKGIuX193ZWJnbEZyYW1lYnVmZmVyW3JlXSwgdSwgYSwgZS5DT0xPUl9BVFRBQ0hNRU5UMCwgZS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZSwgMCk7CiAgICAgICAgICAgIGwoYSkgJiYgcihlLlRFWFRVUkVfQ1VCRV9NQVApLCB0LnVuYmluZFRleHR1cmUoKTsKICAgICAgICB9IGVsc2UgaWYgKHBlKSB7CiAgICAgICAgICAgIGZvcihsZXQgcmUgPSAwLCBjZSA9IEsubGVuZ3RoOyByZSA8IGNlOyByZSsrKXsKICAgICAgICAgICAgICAgIGxldCB5ZSA9IEtbcmVdLCBaID0gaS5nZXQoeWUpOwogICAgICAgICAgICAgICAgdC5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIFouX193ZWJnbFRleHR1cmUpLCBHZShlLlRFWFRVUkVfMkQsIHllKSwgdWUoYi5fX3dlYmdsRnJhbWVidWZmZXIsIHUsIHllLCBlLkNPTE9SX0FUVEFDSE1FTlQwICsgcmUsIGUuVEVYVFVSRV8yRCwgMCksIGwoeWUpICYmIHIoZS5URVhUVVJFXzJEKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0LnVuYmluZFRleHR1cmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgcmUgPSBlLlRFWFRVUkVfMkQ7CiAgICAgICAgICAgIGlmICgodS5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgfHwgdS5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQpICYmIChyZSA9IHUuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0ID8gZS5URVhUVVJFXzNEIDogZS5URVhUVVJFXzJEX0FSUkFZKSwgdC5iaW5kVGV4dHVyZShyZSwgVy5fX3dlYmdsVGV4dHVyZSksIEdlKHJlLCBhKSwgYS5taXBtYXBzICYmIGEubWlwbWFwcy5sZW5ndGggPiAwKSBmb3IobGV0IGNlID0gMDsgY2UgPCBhLm1pcG1hcHMubGVuZ3RoOyBjZSsrKXVlKGIuX193ZWJnbEZyYW1lYnVmZmVyW2NlXSwgdSwgYSwgZS5DT0xPUl9BVFRBQ0hNRU5UMCwgcmUsIGNlKTsKICAgICAgICAgICAgZWxzZSB1ZShiLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgdSwgYSwgZS5DT0xPUl9BVFRBQ0hNRU5UMCwgcmUsIDApOwogICAgICAgICAgICBsKGEpICYmIHIocmUpLCB0LnVuYmluZFRleHR1cmUoKTsKICAgICAgICB9CiAgICAgICAgdS5kZXB0aEJ1ZmZlciAmJiBCZSh1KTsKICAgIH0KICAgIGZ1bmN0aW9uICRlKHUpIHsKICAgICAgICBsZXQgYSA9IHUudGV4dHVyZXM7CiAgICAgICAgZm9yKGxldCBiID0gMCwgVyA9IGEubGVuZ3RoOyBiIDwgVzsgYisrKXsKICAgICAgICAgICAgbGV0IEsgPSBhW2JdOwogICAgICAgICAgICBpZiAobChLKSkgewogICAgICAgICAgICAgICAgbGV0IEcgPSB3KHUpLCBwZSA9IGkuZ2V0KEspLl9fd2ViZ2xUZXh0dXJlOwogICAgICAgICAgICAgICAgdC5iaW5kVGV4dHVyZShHLCBwZSksIHIoRyksIHQudW5iaW5kVGV4dHVyZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbGV0IFVlID0gW10sIG0gPSBbXTsKICAgIGZ1bmN0aW9uIHV0KHUpIHsKICAgICAgICBpZiAodS5zYW1wbGVzID4gMCkgewogICAgICAgICAgICBpZiAod2UodSkgPT09ICExKSB7CiAgICAgICAgICAgICAgICBsZXQgYSA9IHUudGV4dHVyZXMsIGIgPSB1LndpZHRoLCBXID0gdS5oZWlnaHQsIEsgPSBlLkNPTE9SX0JVRkZFUl9CSVQsIEcgPSB1LnN0ZW5jaWxCdWZmZXIgPyBlLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IGUuREVQVEhfQVRUQUNITUVOVCwgcGUgPSBpLmdldCh1KSwgcmUgPSBhLmxlbmd0aCA+IDE7CiAgICAgICAgICAgICAgICBpZiAocmUpIGZvcihsZXQgY2UgPSAwOyBjZSA8IGEubGVuZ3RoOyBjZSsrKXQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHBlLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksIGUuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUiwgZS5DT0xPUl9BVFRBQ0hNRU5UMCArIGNlLCBlLlJFTkRFUkJVRkZFUiwgbnVsbCksIHQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHBlLl9fd2ViZ2xGcmFtZWJ1ZmZlciksIGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5EUkFXX0ZSQU1FQlVGRkVSLCBlLkNPTE9SX0FUVEFDSE1FTlQwICsgY2UsIGUuVEVYVFVSRV8yRCwgbnVsbCwgMCk7CiAgICAgICAgICAgICAgICB0LmJpbmRGcmFtZWJ1ZmZlcihlLlJFQURfRlJBTUVCVUZGRVIsIHBlLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksIHQuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUiwgcGUuX193ZWJnbEZyYW1lYnVmZmVyKTsKICAgICAgICAgICAgICAgIGZvcihsZXQgY2UgPSAwOyBjZSA8IGEubGVuZ3RoOyBjZSsrKXsKICAgICAgICAgICAgICAgICAgICBpZiAodS5yZXNvbHZlRGVwdGhCdWZmZXIgJiYgKHUuZGVwdGhCdWZmZXIgJiYgKEsgfD0gZS5ERVBUSF9CVUZGRVJfQklUKSwgdS5zdGVuY2lsQnVmZmVyICYmIHUucmVzb2x2ZVN0ZW5jaWxCdWZmZXIgJiYgKEsgfD0gZS5TVEVOQ0lMX0JVRkZFUl9CSVQpKSwgcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihlLlJFQURfRlJBTUVCVUZGRVIsIGUuQ09MT1JfQVRUQUNITUVOVDAsIGUuUkVOREVSQlVGRkVSLCBwZS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbY2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHllID0gaS5nZXQoYVtjZV0pLl9fd2ViZ2xUZXh0dXJlOwogICAgICAgICAgICAgICAgICAgICAgICBlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRFJBV19GUkFNRUJVRkZFUiwgZS5DT0xPUl9BVFRBQ0hNRU5UMCwgZS5URVhUVVJFXzJELCB5ZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUuYmxpdEZyYW1lYnVmZmVyKDAsIDAsIGIsIFcsIDAsIDAsIGIsIFcsIEssIGUuTkVBUkVTVCksIEkgPT09ICEwICYmIChVZS5sZW5ndGggPSAwLCBtLmxlbmd0aCA9IDAsIFVlLnB1c2goZS5DT0xPUl9BVFRBQ0hNRU5UMCArIGNlKSwgdS5kZXB0aEJ1ZmZlciAmJiB1LnJlc29sdmVEZXB0aEJ1ZmZlciA9PT0gITEgJiYgKFVlLnB1c2goRyksIG0ucHVzaChHKSwgZS5pbnZhbGlkYXRlRnJhbWVidWZmZXIoZS5EUkFXX0ZSQU1FQlVGRkVSLCBtKSksIGUuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKGUuUkVBRF9GUkFNRUJVRkZFUiwgVWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0LmJpbmRGcmFtZWJ1ZmZlcihlLlJFQURfRlJBTUVCVUZGRVIsIG51bGwpLCB0LmJpbmRGcmFtZWJ1ZmZlcihlLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpLCByZSkgZm9yKGxldCBjZSA9IDA7IGNlIDwgYS5sZW5ndGg7IGNlKyspewogICAgICAgICAgICAgICAgICAgIHQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHBlLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksIGUuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZS5GUkFNRUJVRkZFUiwgZS5DT0xPUl9BVFRBQ0hNRU5UMCArIGNlLCBlLlJFTkRFUkJVRkZFUiwgcGUuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2NlXSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHllID0gaS5nZXQoYVtjZV0pLl9fd2ViZ2xUZXh0dXJlOwogICAgICAgICAgICAgICAgICAgIHQuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsIHBlLl9fd2ViZ2xGcmFtZWJ1ZmZlciksIGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5EUkFXX0ZSQU1FQlVGRkVSLCBlLkNPTE9SX0FUVEFDSE1FTlQwICsgY2UsIGUuVEVYVFVSRV8yRCwgeWUsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5iaW5kRnJhbWVidWZmZXIoZS5EUkFXX0ZSQU1FQlVGRkVSLCBwZS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHUuZGVwdGhCdWZmZXIgJiYgdS5yZXNvbHZlRGVwdGhCdWZmZXIgPT09ICExICYmIEkpIHsKICAgICAgICAgICAgICAgIGxldCBhID0gdS5zdGVuY2lsQnVmZmVyID8gZS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBlLkRFUFRIX0FUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICBlLmludmFsaWRhdGVGcmFtZWJ1ZmZlcihlLkRSQVdfRlJBTUVCVUZGRVIsIFsKICAgICAgICAgICAgICAgICAgICBhCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIERlKHUpIHsKICAgICAgICByZXR1cm4gTWF0aC5taW4oYy5tYXhTYW1wbGVzLCB1LnNhbXBsZXMpOwogICAgfQogICAgZnVuY3Rpb24gd2UodSkgewogICAgICAgIGxldCBhID0gaS5nZXQodSk7CiAgICAgICAgcmV0dXJuIHUuc2FtcGxlcyA+IDAgJiYgbi5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpID09PSAhMCAmJiBhLl9fdXNlUmVuZGVyVG9UZXh0dXJlICE9PSAhMTsKICAgIH0KICAgIGZ1bmN0aW9uIF9lKHUpIHsKICAgICAgICBsZXQgYSA9IGgucmVuZGVyLmZyYW1lOwogICAgICAgIEMuZ2V0KHUpICE9PSBhICYmIChDLnNldCh1LCBhKSwgdS51cGRhdGUoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBYZSh1LCBhKSB7CiAgICAgICAgbGV0IGIgPSB1LmNvbG9yU3BhY2UsIFcgPSB1LmZvcm1hdCwgSyA9IHUudHlwZTsKICAgICAgICByZXR1cm4gdS5pc0NvbXByZXNzZWRUZXh0dXJlID09PSAhMCB8fCB1LmlzVmlkZW9UZXh0dXJlID09PSAhMCB8fCBiICE9PSBoYSAmJiBiICE9PSB6bCAmJiAoVHQuZ2V0VHJhbnNmZXIoYikgPT09IEZuID8gKFcgIT09IExpIHx8IEsgIT09IFNsKSAmJiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpIDogY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xUZXh0dXJlczogVW5zdXBwb3J0ZWQgdGV4dHVyZSBjb2xvciBzcGFjZToiLCBiKSksIGE7CiAgICB9CiAgICBmdW5jdGlvbiBoZSh1KSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IDwgInUiICYmIHUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ID8gKFQxLndpZHRoID0gdS5uYXR1cmFsV2lkdGggfHwgdS53aWR0aCwgVDEuaGVpZ2h0ID0gdS5uYXR1cmFsSGVpZ2h0IHx8IHUuaGVpZ2h0KSA6IHR5cGVvZiBWaWRlb0ZyYW1lIDwgInUiICYmIHUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lID8gKFQxLndpZHRoID0gdS5kaXNwbGF5V2lkdGgsIFQxLmhlaWdodCA9IHUuZGlzcGxheUhlaWdodCkgOiAoVDEud2lkdGggPSB1LndpZHRoLCBUMS5oZWlnaHQgPSB1LmhlaWdodCksIFQxOwogICAgfQogICAgdGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0ID0gViwgdGhpcy5yZXNldFRleHR1cmVVbml0cyA9IHEsIHRoaXMuc2V0VGV4dHVyZTJEID0gUSwgdGhpcy5zZXRUZXh0dXJlMkRBcnJheSA9IHosIHRoaXMuc2V0VGV4dHVyZTNEID0gaiwgdGhpcy5zZXRUZXh0dXJlQ3ViZSA9IEYsIHRoaXMucmViaW5kVGV4dHVyZXMgPSBUZSwgdGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IGplLCB0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9ICRlLCB0aGlzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID0gdXQsIHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciA9IEJlLCB0aGlzLnNldHVwRnJhbWVCdWZmZXJUZXh0dXJlID0gdWUsIHRoaXMudXNlTXVsdGlzYW1wbGVkUlRUID0gd2U7Cn0KZnVuY3Rpb24geWYxKGUsIG4pIHsKICAgIGZ1bmN0aW9uIHQoaSwgYyA9IHpsKSB7CiAgICAgICAgbGV0IHMsIGggPSBUdC5nZXRUcmFuc2ZlcihjKTsKICAgICAgICBpZiAoaSA9PT0gU2wpIHJldHVybiBlLlVOU0lHTkVEX0JZVEU7CiAgICAgICAgaWYgKGkgPT09IGVjKSByZXR1cm4gZS5VTlNJR05FRF9TSE9SVF80XzRfNF80OwogICAgICAgIGlmIChpID09PSBpYykgcmV0dXJuIGUuVU5TSUdORURfU0hPUlRfNV81XzVfMTsKICAgICAgICBpZiAoaSA9PT0gbmMpIHJldHVybiBlLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjsKICAgICAgICBpZiAoaSA9PT0gJGwpIHJldHVybiBlLkJZVEU7CiAgICAgICAgaWYgKGkgPT09IFFsKSByZXR1cm4gZS5TSE9SVDsKICAgICAgICBpZiAoaSA9PT0gamwpIHJldHVybiBlLlVOU0lHTkVEX1NIT1JUOwogICAgICAgIGlmIChpID09PSBLbCkgcmV0dXJuIGUuSU5UOwogICAgICAgIGlmIChpID09PSBXbykgcmV0dXJuIGUuVU5TSUdORURfSU5UOwogICAgICAgIGlmIChpID09PSBwaSkgcmV0dXJuIGUuRkxPQVQ7CiAgICAgICAgaWYgKGkgPT09IHRjKSByZXR1cm4gZS5IQUxGX0ZMT0FUOwogICAgICAgIGlmIChpID09PSByYykgcmV0dXJuIGUuQUxQSEE7CiAgICAgICAgaWYgKGkgPT09IG9jKSByZXR1cm4gZS5SR0I7CiAgICAgICAgaWYgKGkgPT09IExpKSByZXR1cm4gZS5SR0JBOwogICAgICAgIGlmIChpID09PSBhYykgcmV0dXJuIGUuTFVNSU5BTkNFOwogICAgICAgIGlmIChpID09PSBoYykgcmV0dXJuIGUuTFVNSU5BTkNFX0FMUEhBOwogICAgICAgIGlmIChpID09PSBDbikgcmV0dXJuIGUuREVQVEhfQ09NUE9ORU5UOwogICAgICAgIGlmIChpID09PSBhYSkgcmV0dXJuIGUuREVQVEhfU1RFTkNJTDsKICAgICAgICBpZiAoaSA9PT0gVGwpIHJldHVybiBlLlJFRDsKICAgICAgICBpZiAoaSA9PT0gSWwpIHJldHVybiBlLlJFRF9JTlRFR0VSOwogICAgICAgIGlmIChpID09PSBsYykgcmV0dXJuIGUuUkc7CiAgICAgICAgaWYgKGkgPT09IGNjKSByZXR1cm4gZS5SR19JTlRFR0VSOwogICAgICAgIGlmIChpID09PSB1YykgcmV0dXJuIGUuUkdCQV9JTlRFR0VSOwogICAgICAgIGlmIChpID09PSBkYyB8fCBpID09PSBwYyB8fCBpID09PSBmYyB8fCBpID09PSBtYykgaWYgKGggPT09IEZuKSBpZiAocyA9IG4uZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIiksIHMgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGkgPT09IGRjKSByZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IHBjKSByZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQxX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IGZjKSByZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IG1jKSByZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVDsKICAgICAgICB9IGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgZWxzZSBpZiAocyA9IG4uZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLCBzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChpID09PSBkYykgcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IHBjKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IGZjKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IG1jKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDsKICAgICAgICB9IGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKGkgPT09IHljIHx8IGkgPT09IGdjIHx8IGkgPT09IHhjIHx8IGkgPT09IGJjKSBpZiAocyA9IG4uZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKSwgcyAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoaSA9PT0geWMpIHJldHVybiBzLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7CiAgICAgICAgICAgIGlmIChpID09PSBnYykgcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRzsKICAgICAgICAgICAgaWYgKGkgPT09IHhjKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzsKICAgICAgICAgICAgaWYgKGkgPT09IGJjKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzsKICAgICAgICB9IGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKGkgPT09IHdjIHx8IGkgPT09IE1jIHx8IGkgPT09IF9jKSBpZiAocyA9IG4uZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksIHMgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGkgPT09IHdjIHx8IGkgPT09IE1jKSByZXR1cm4gaCA9PT0gRm4gPyBzLkNPTVBSRVNTRURfU1JHQjhfRVRDMiA6IHMuQ09NUFJFU1NFRF9SR0I4X0VUQzI7CiAgICAgICAgICAgIGlmIChpID09PSBfYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQyA6IHMuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzsKICAgICAgICB9IGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKGkgPT09IHZjIHx8IGkgPT09IEFjIHx8IGkgPT09IFNjIHx8IGkgPT09IFRjIHx8IGkgPT09IEljIHx8IGkgPT09IENjIHx8IGkgPT09IHpjIHx8IGkgPT09IEZjIHx8IGkgPT09IEJjIHx8IGkgPT09IEVjIHx8IGkgPT09IFJjIHx8IGkgPT09IGtjIHx8IGkgPT09IFBjIHx8IGkgPT09IE9jKSBpZiAocyA9IG4uZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLCBzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChpID09PSB2YykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBBYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NF9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NF9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBTYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NV9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBUYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4NV9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4NV9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBJYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nl9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBDYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4NV9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSB6YykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4Nl9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4Nl9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBGYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4OF9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4OF9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBCYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSIDogcy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUjsKICAgICAgICAgICAgaWYgKGkgPT09IEVjKSByZXR1cm4gaCA9PT0gRm4gPyBzLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSOwogICAgICAgICAgICBpZiAoaSA9PT0gUmMpIHJldHVybiBoID09PSBGbiA/IHMuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg4X0tIUiA6IHMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4OF9LSFI7CiAgICAgICAgICAgIGlmIChpID09PSBrYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0tIUiA6IHMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSOwogICAgICAgICAgICBpZiAoaSA9PT0gUGMpIHJldHVybiBoID09PSBGbiA/IHMuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFIgOiBzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEwX0tIUjsKICAgICAgICAgICAgaWYgKGkgPT09IE9jKSByZXR1cm4gaCA9PT0gRm4gPyBzLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfS0hSIDogcy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMl9LSFI7CiAgICAgICAgfSBlbHNlIHJldHVybiBudWxsOwogICAgICAgIGlmIChpID09PSBOYyB8fCBpID09PSBWYyB8fCBpID09PSBEYykgaWYgKHMgPSBuLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLCBzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChpID09PSBOYykgcmV0dXJuIGggPT09IEZuID8gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQgOiBzLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVDsKICAgICAgICAgICAgaWYgKGkgPT09IFZjKSByZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9CUFRDX1NJR05FRF9GTE9BVF9FWFQ7CiAgICAgICAgICAgIGlmIChpID09PSBEYykgcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfQlBUQ19VTlNJR05FRF9GTE9BVF9FWFQ7CiAgICAgICAgfSBlbHNlIHJldHVybiBudWxsOwogICAgICAgIGlmIChpID09PSBMYyB8fCBpID09PSBVYyB8fCBpID09PSBXYyB8fCBpID09PSBIYykgaWYgKHMgPSBuLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyIpLCBzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChpID09PSBOYykgcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUOwogICAgICAgICAgICBpZiAoaSA9PT0gVWMpIHJldHVybiBzLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7CiAgICAgICAgICAgIGlmIChpID09PSBXYykgcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUOwogICAgICAgICAgICBpZiAoaSA9PT0gSGMpIHJldHVybiBzLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7CiAgICAgICAgfSBlbHNlIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBpID09PSBzYyA/IGUuVU5TSUdORURfSU5UXzI0XzggOiBlW2ldICE9PSB2b2lkIDAgPyBlW2ldIDogbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgY29udmVydDogdAogICAgfTsKfQp2YXIgTmYgPSBgCnZvaWQgbWFpbigpIHsKCglnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTsKCn1gLCBPZjEgPSBgCnVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgZGVwdGhDb2xvcjsKdW5pZm9ybSBmbG9hdCBkZXB0aFdpZHRoOwp1bmlmb3JtIGZsb2F0IGRlcHRoSGVpZ2h0OwoKdm9pZCBtYWluKCkgewoKCXZlYzIgY29vcmQgPSB2ZWMyKCBnbF9GcmFnQ29vcmQueCAvIGRlcHRoV2lkdGgsIGdsX0ZyYWdDb29yZC55IC8gZGVwdGhIZWlnaHQgKTsKCglpZiAoIGNvb3JkLnggPj0gMS4wICkgewoKCQlnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54IC0gMS4wLCBjb29yZC55LCAxICkgKS5yOwoKCX0gZWxzZSB7CgoJCWdsX0ZyYWdEZXB0aCA9IHRleHR1cmUoIGRlcHRoQ29sb3IsIHZlYzMoIGNvb3JkLngsIGNvb3JkLnksIDAgKSApLnI7CgoJfQoKfWAsICRuMSA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbCwgdGhpcy5tZXNoID0gbnVsbCwgdGhpcy5kZXB0aE5lYXIgPSAwLCB0aGlzLmRlcHRoRmFyID0gMDsKICAgIH0KICAgIGluaXQobiwgdCwgaSkgewogICAgICAgIGlmICh0aGlzLnRleHR1cmUgPT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IGMgPSBuZXcgbHQsIHMgPSBuLnByb3BlcnRpZXMuZ2V0KGMpOwogICAgICAgICAgICBzLl9fd2ViZ2xUZXh0dXJlID0gdC50ZXh0dXJlLCAodC5kZXB0aE5lYXIgIT09IGkuZGVwdGhOZWFyIHx8IHQuZGVwdGhGYXIgIT09IGkuZGVwdGhGYXIpICYmICh0aGlzLmRlcHRoTmVhciA9IHQuZGVwdGhOZWFyLCB0aGlzLmRlcHRoRmFyID0gdC5kZXB0aEZhciksIHRoaXMudGV4dHVyZSA9IGM7CiAgICAgICAgfQogICAgfQogICAgZ2V0TWVzaChuKSB7CiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSAhPT0gbnVsbCAmJiB0aGlzLm1lc2ggPT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IHQgPSBuLmNhbWVyYXNbMF0udmlld3BvcnQsIGkgPSBuZXcgcWkoewogICAgICAgICAgICAgICAgdmVydGV4U2hhZGVyOiBOZiwKICAgICAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBPZjEsCiAgICAgICAgICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICAgICAgICAgIGRlcHRoQ29sb3I6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudGV4dHVyZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZGVwdGhXaWR0aDogewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC56CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZXB0aEhlaWdodDogewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC53CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5tZXNoID0gbmV3IEN0KG5ldyBacigyMCwgMjApLCBpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubWVzaDsKICAgIH0KICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGwsIHRoaXMubWVzaCA9IG51bGw7CiAgICB9CiAgICBnZXREZXB0aFRleHR1cmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZTsKICAgIH0KfSwgWm4xID0gY2xhc3MgZXh0ZW5kcyBxdCB7CiAgICBjb25zdHJ1Y3RvcihuLCB0KXsKICAgICAgICBzdXBlcigpOwogICAgICAgIGxldCBpID0gdGhpcywgYyA9IG51bGwsIHMgPSAxLCBoID0gbnVsbCwgZCA9ICJsb2NhbC1mbG9vciIsIEkgPSAxLCBUMSA9IG51bGwsIEMgPSBudWxsLCBSID0gbnVsbCwgUyA9IG51bGwsIHgxID0gbnVsbCwgTyA9IG51bGwsIEwgPSBuZXcgJG4xLCBsID0gdC5nZXRDb250ZXh0QXR0cmlidXRlcygpLCByID0gbnVsbCwgdzEgPSBudWxsLCBNID0gW10sIF8gPSBbXSwgSCA9IG5ldyBULCBQID0gbnVsbCwgeTEgPSBuZXcgdnQ7CiAgICAgICAgeTEudmlld3BvcnQgPSBuZXcgb3Q7CiAgICAgICAgbGV0IEIgPSBuZXcgdnQ7CiAgICAgICAgQi52aWV3cG9ydCA9IG5ldyBvdDsKICAgICAgICBsZXQgcCA9IFsKICAgICAgICAgICAgeTEsCiAgICAgICAgICAgIEIKICAgICAgICBdLCBmID0gbmV3IEJoLCBBID0gbnVsbCwgcSA9IG51bGw7CiAgICAgICAgdGhpcy5jYW1lcmFBdXRvVXBkYXRlID0gITAsIHRoaXMuZW5hYmxlZCA9ICExLCB0aGlzLmlzUHJlc2VudGluZyA9ICExLCB0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbihrKSB7CiAgICAgICAgICAgIGxldCBKID0gTVtrXTsKICAgICAgICAgICAgcmV0dXJuIEogPT09IHZvaWQgMCAmJiAoSiA9IG5ldyBWYSwgTVtrXSA9IEopLCBKLmdldFRhcmdldFJheVNwYWNlKCk7CiAgICAgICAgfSwgdGhpcy5nZXRDb250cm9sbGVyR3JpcCA9IGZ1bmN0aW9uKGspIHsKICAgICAgICAgICAgbGV0IEogPSBNW2tdOwogICAgICAgICAgICByZXR1cm4gSiA9PT0gdm9pZCAwICYmIChKID0gbmV3IFZhLCBNW2tdID0gSiksIEouZ2V0R3JpcFNwYWNlKCk7CiAgICAgICAgfSwgdGhpcy5nZXRIYW5kID0gZnVuY3Rpb24oaykgewogICAgICAgICAgICBsZXQgSiA9IE1ba107CiAgICAgICAgICAgIHJldHVybiBKID09PSB2b2lkIDAgJiYgKEogPSBuZXcgVmEsIE1ba10gPSBKKSwgSi5nZXRIYW5kU3BhY2UoKTsKICAgICAgICB9OwogICAgICAgIGZ1bmN0aW9uIFYoaykgewogICAgICAgICAgICBsZXQgSiA9IF8uaW5kZXhPZihrLmlucHV0U291cmNlKTsKICAgICAgICAgICAgaWYgKEogPT09IC0xKSByZXR1cm47CiAgICAgICAgICAgIGxldCB1ZSA9IE1bSl07CiAgICAgICAgICAgIHVlICE9PSB2b2lkIDAgJiYgKHVlLnVwZGF0ZShrLmlucHV0U291cmNlLCBrLmZyYW1lLCBUMSB8fCBoKSwgdWUuZGlzcGF0Y2hFdmVudCh7CiAgICAgICAgICAgICAgICB0eXBlOiBrLnR5cGUsCiAgICAgICAgICAgICAgICBkYXRhOiBrLmlucHV0U291cmNlCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gWSgpIHsKICAgICAgICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3QiLCBWKSwgYy5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsIFYpLCBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsIFYpLCBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemUiLCBWKSwgYy5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLCBWKSwgYy5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIiwgViksIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIiwgWSksIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIiwgUSk7CiAgICAgICAgICAgIGZvcihsZXQgayA9IDA7IGsgPCBNLmxlbmd0aDsgaysrKXsKICAgICAgICAgICAgICAgIGxldCBKID0gX1trXTsKICAgICAgICAgICAgICAgIEogIT09IG51bGwgJiYgKF9ba10gPSBudWxsLCBNW2tdLmRpc2Nvbm5lY3QoSikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEEgPSBudWxsLCBxID0gbnVsbCwgTC5yZXNldCgpLCBuLnNldFJlbmRlclRhcmdldChyKSwgeDEgPSBudWxsLCBTID0gbnVsbCwgUiA9IG51bGwsIGMgPSBudWxsLCB3MSA9IG51bGwsIFplLnN0b3AoKSwgaS5pc1ByZXNlbnRpbmcgPSAhMSwgbi5zZXRQaXhlbFJhdGlvKFApLCBuLnNldFNpemUoSC53aWR0aCwgSC5oZWlnaHQsICExKSwgaS5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzZXNzaW9uZW5kIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZnVuY3Rpb24oaykgewogICAgICAgICAgICBzID0gaywgaS5pc1ByZXNlbnRpbmcgPT09ICEwICYmIGNvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNjYWxlIHdoaWxlIHByZXNlbnRpbmcuIik7CiAgICAgICAgfSwgdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbihrKSB7CiAgICAgICAgICAgIGQgPSBrLCBpLmlzUHJlc2VudGluZyA9PT0gITAgJiYgY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKTsKICAgICAgICB9LCB0aGlzLmdldFJlZmVyZW5jZVNwYWNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBUMSB8fCBoOwogICAgICAgIH0sIHRoaXMuc2V0UmVmZXJlbmNlU3BhY2UgPSBmdW5jdGlvbihrKSB7CiAgICAgICAgICAgIFQxID0gazsKICAgICAgICB9LCB0aGlzLmdldEJhc2VMYXllciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gUyAhPT0gbnVsbCA/IFMgOiB4MTsKICAgICAgICB9LCB0aGlzLmdldEJpbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFI7CiAgICAgICAgfSwgdGhpcy5nZXRGcmFtZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTzsKICAgICAgICB9LCB0aGlzLmdldFNlc3Npb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgfSwgdGhpcy5zZXRTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24oaykgewogICAgICAgICAgICBpZiAoYyA9IGssIGMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChyID0gbi5nZXRSZW5kZXJUYXJnZXQoKSwgYy5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLCBWKSwgYy5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsIFYpLCBjLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsIFYpLCBjLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLCBWKSwgYy5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLCBWKSwgYy5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIiwgViksIGMuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIiwgWSksIGMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIiwgUSksIGwueHJDb21wYXRpYmxlICE9PSAhMCAmJiBhd2FpdCB0Lm1ha2VYUkNvbXBhdGlibGUoKSwgUCA9IG4uZ2V0UGl4ZWxSYXRpbygpLCBuLmdldFNpemUoSCksIHR5cGVvZiBYUldlYkdMQmluZGluZyA8ICJ1IiAmJiAiY3JlYXRlUHJvamVjdGlvbkxheWVyIiBpbiBYUldlYkdMQmluZGluZy5wcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdWUgPSBudWxsLCBpZSA9IG51bGwsIEVlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBsLmRlcHRoICYmIChFZSA9IGwuc3RlbmNpbCA/IHQuREVQVEgyNF9TVEVOQ0lMOCA6IHQuREVQVEhfQ09NUE9ORU5UMjQsIHVlID0gbC5zdGVuY2lsID8gYWEgOiBDbiwgaWUgPSBsLnN0ZW5jaWwgPyBzYyA6IFdvKTsKICAgICAgICAgICAgICAgICAgICBsZXQgQmUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0OiB0LlJHQkE4LAogICAgICAgICAgICAgICAgICAgICAgICBkZXB0aEZvcm1hdDogRWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yOiBzCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBSID0gbmV3IFhSV2ViR0xCaW5kaW5nKGMsIHQpLCBTID0gUi5jcmVhdGVQcm9qZWN0aW9uTGF5ZXIoQmUpLCBjLnVwZGF0ZVJlbmRlclN0YXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9KSwgbi5zZXRQaXhlbFJhdGlvKDEpLCBuLnNldFNpemUoUy50ZXh0dXJlV2lkdGgsIFMudGV4dHVyZUhlaWdodCwgITEpLCB3MSA9IG5ldyBIaShTLnRleHR1cmVXaWR0aCwgUy50ZXh0dXJlSGVpZ2h0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogTGksCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNsLAogICAgICAgICAgICAgICAgICAgICAgICBkZXB0aFRleHR1cmU6IG5ldyBoaChTLnRleHR1cmVXaWR0aCwgUy50ZXh0dXJlSGVpZ2h0LCBpZSwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgdWUpLAogICAgICAgICAgICAgICAgICAgICAgICBzdGVuY2lsQnVmZmVyOiBsLnN0ZW5jaWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2U6IG4ub3V0cHV0Q29sb3JTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlczogbC5hbnRpYWxpYXMgPyA0IDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURlcHRoQnVmZmVyOiBTLmlnbm9yZURlcHRoVmFsdWVzID09PSAhMQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFudGlhbGlhczogbC5hbnRpYWxpYXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGwuZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5jaWw6IGwuc3RlbmNpbCwKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogcwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgeDEgPSBuZXcgWFJXZWJHTExheWVyKGMsIHQsIHVlKSwgYy51cGRhdGVSZW5kZXJTdGF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VMYXllcjogeDEKICAgICAgICAgICAgICAgICAgICB9KSwgbi5zZXRQaXhlbFJhdGlvKDEpLCBuLnNldFNpemUoeDEuZnJhbWVidWZmZXJXaWR0aCwgeDEuZnJhbWVidWZmZXJIZWlnaHQsICExKSwgdzEgPSBuZXcgSGkoeDEuZnJhbWVidWZmZXJXaWR0aCwgeDEuZnJhbWVidWZmZXJIZWlnaHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBMaSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2wsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2U6IG4ub3V0cHV0Q29sb3JTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RlbmNpbEJ1ZmZlcjogbC5zdGVuY2lsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3MS5pc1hSUmVuZGVyVGFyZ2V0ID0gITAsIHRoaXMuc2V0Rm92ZWF0aW9uKEkpLCBUMSA9IG51bGwsIGggPSBhd2FpdCBjLnJlcXVlc3RSZWZlcmVuY2VTcGFjZShkKSwgWmUuc2V0Q29udGV4dChjKSwgWmUuc3RhcnQoKSwgaS5pc1ByZXNlbnRpbmcgPSAhMCwgaS5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAic2Vzc2lvbnN0YXJ0IgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzLmdldEVudmlyb25tZW50QmxlbmRNb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChjICE9PSBudWxsKSByZXR1cm4gYy5lbnZpcm9ubWVudEJsZW5kTW9kZTsKICAgICAgICB9LCB0aGlzLmdldERlcHRoVGV4dHVyZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTC5nZXREZXB0aFRleHR1cmUoKTsKICAgICAgICB9OwogICAgICAgIGZ1bmN0aW9uIFEoaykgewogICAgICAgICAgICBmb3IobGV0IEogPSAwOyBKIDwgay5yZW1vdmVkLmxlbmd0aDsgSisrKXsKICAgICAgICAgICAgICAgIGxldCB1ZSA9IGsucmVtb3ZlZFtKXSwgaWUgPSBfLmluZGV4T2YodWUpOwogICAgICAgICAgICAgICAgaWUgPj0gMCAmJiAoX1tpZV0gPSBudWxsLCBNW2llXS5kaXNjb25uZWN0KHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCBKID0gMDsgSiA8IGsuYWRkZWQubGVuZ3RoOyBKKyspewogICAgICAgICAgICAgICAgbGV0IHVlID0gay5hZGRlZFtKXSwgaWUgPSBfLmluZGV4T2YodWUpOwogICAgICAgICAgICAgICAgaWYgKGllID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgQmUgPSAwOyBCZSA8IE0ubGVuZ3RoOyBCZSsrKWlmIChCZSA+PSBfLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBfLnB1c2godWUpLCBpZSA9IEJlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9bQmVdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9bQmVdID0gdWUsIGllID0gQmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaWUgPT09IC0xKSBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBFZSA9IE1baWVdOwogICAgICAgICAgICAgICAgRWUgJiYgRWUuY29ubmVjdCh1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHogPSBuZXcgdywgaiA9IG5ldyB3OwogICAgICAgIGZ1bmN0aW9uIEYoaywgSiwgdWUpIHsKICAgICAgICAgICAgei5zZXRGcm9tTWF0cml4UG9zaXRpb24oSi5tYXRyaXhXb3JsZCksIGouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHVlLm1hdHJpeFdvcmxkKTsKICAgICAgICAgICAgbGV0IGllID0gei5kaXN0YW5jZVRvKGopLCBFZSA9IEoucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cywgQmUgPSB1ZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLCBUZSA9IEVlWzE0XSAvIChFZVsxMF0gLSAxKSwgamUgPSBFZVsxNF0gLyAoRWVbMTBdICsgMSksICRlID0gKEVlWzldICsgMSkgLyBFZVs1XSwgVWUgPSAoRWVbOV0gLSAxKSAvIEVlWzVdLCBtID0gKEVlWzhdIC0gMSkgLyBFZVswXSwgdXQgPSAoQmVbOF0gKyAxKSAvIEJlWzBdLCBEZSA9IFRlICogbSwgd2UgPSBUZSAqIHV0LCBfZSA9IGllIC8gKC1tICsgdXQpLCBYZSA9IF9lICogLW07CiAgICAgICAgICAgIGlmIChKLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrLnBvc2l0aW9uLCBrLnF1YXRlcm5pb24sIGsuc2NhbGUpLCBrLnRyYW5zbGF0ZVgoWGUpLCBrLnRyYW5zbGF0ZVooX2UpLCBrLm1hdHJpeFdvcmxkLmNvbXBvc2Uoay5wb3NpdGlvbiwgay5xdWF0ZXJuaW9uLCBrLnNjYWxlKSwgay5tYXRyaXhXb3JsZEludmVyc2UuY29weShrLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSwgRWVbMTBdID09PSAtMSkgay5wcm9qZWN0aW9uTWF0cml4LmNvcHkoSi5wcm9qZWN0aW9uTWF0cml4KSwgay5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KEoucHJvamVjdGlvbk1hdHJpeEludmVyc2UpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxldCBoZSA9IFRlICsgX2UsIHUgPSBqZSArIF9lLCBhID0gRGUgLSBYZSwgYiA9IHdlICsgKGllIC0gWGUpLCBXID0gJGUgKiBqZSAvIHUgKiBoZSwgSyA9IFVlICogamUgLyB1ICogaGU7CiAgICAgICAgICAgICAgICBrLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKGEsIGIsIFcsIEssIGhlLCB1KSwgay5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KGsucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbWUoaywgSikgewogICAgICAgICAgICBKID09PSBudWxsID8gay5tYXRyaXhXb3JsZC5jb3B5KGsubWF0cml4KSA6IGsubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhKLm1hdHJpeFdvcmxkLCBrLm1hdHJpeCksIGsubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoay5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMudXBkYXRlQ2FtZXJhID0gZnVuY3Rpb24oaykgewogICAgICAgICAgICBpZiAoYyA9PT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgSiA9IGsubmVhciwgdWUgPSBrLmZhcjsKICAgICAgICAgICAgTC50ZXh0dXJlICE9PSBudWxsICYmIChMLmRlcHRoTmVhciA+IDAgJiYgKEogPSBMLmRlcHRoTmVhciksIEwuZGVwdGhGYXIgPiAwICYmICh1ZSA9IEwuZGVwdGhGYXIpKSwgZi5uZWFyID0gQi5uZWFyID0geTEubmVhciA9IEosIGYuZmFyID0gQi5mYXIgPSB5MS5mYXIgPSB1ZSwgKEEgIT09IGYubmVhciB8fCBxICE9PSBmLmZhcikgJiYgKGMudXBkYXRlUmVuZGVyU3RhdGUoewogICAgICAgICAgICAgICAgZGVwdGhOZWFyOiBmLm5lYXIsCiAgICAgICAgICAgICAgICBkZXB0aEZhcjogZi5mYXIKICAgICAgICAgICAgfSksIEEgPSBmLm5lYXIsIHEgPSBmLmZhciksIHkxLmxheWVycy5tYXNrID0gay5sYXllcnMubWFzayB8IDIsIEIubGF5ZXJzLm1hc2sgPSBrLmxheWVycy5tYXNrIHwgNCwgZi5sYXllcnMubWFzayA9IHkxLmxheWVycy5tYXNrIHwgQi5sYXllcnMubWFzazsKICAgICAgICAgICAgbGV0IGllID0gay5wYXJlbnQsIEVlID0gZi5jYW1lcmFzOwogICAgICAgICAgICBtZShmLCBpZSk7CiAgICAgICAgICAgIGZvcihsZXQgQmUgPSAwOyBCZSA8IEVlLmxlbmd0aDsgQmUrKyltZShFZVtCZV0sIGllKTsKICAgICAgICAgICAgRWUubGVuZ3RoID09PSAyID8gRihmLCB5MSwgQikgOiBmLnByb2plY3Rpb25NYXRyaXguY29weSh5MS5wcm9qZWN0aW9uTWF0cml4KSwgTWUoaywgZiwgaWUpOwogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gTWUoaywgSiwgdWUpIHsKICAgICAgICAgICAgdWUgPT09IG51bGwgPyBrLm1hdHJpeC5jb3B5KEoubWF0cml4V29ybGQpIDogKGsubWF0cml4LmNvcHkodWUubWF0cml4V29ybGQpLCBrLm1hdHJpeC5pbnZlcnQoKSwgay5tYXRyaXgubXVsdGlwbHkoSi5tYXRyaXhXb3JsZCkpLCBrLm1hdHJpeC5kZWNvbXBvc2Uoay5wb3NpdGlvbiwgay5xdWF0ZXJuaW9uLCBrLnNjYWxlKSwgay51cGRhdGVNYXRyaXhXb3JsZCghMCksIGsucHJvamVjdGlvbk1hdHJpeC5jb3B5KEoucHJvamVjdGlvbk1hdHJpeCksIGsucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShKLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSwgay5pc1BlcnNwZWN0aXZlQ2FtZXJhICYmIChrLmZvdiA9IFVpICogMiAqIE1hdGguYXRhbigxIC8gay5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzVdKSwgay56b29tID0gMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgIH0sIHRoaXMuZ2V0Rm92ZWF0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghKFMgPT09IG51bGwgJiYgeDEgPT09IG51bGwpKSByZXR1cm4gSTsKICAgICAgICB9LCB0aGlzLnNldEZvdmVhdGlvbiA9IGZ1bmN0aW9uKGspIHsKICAgICAgICAgICAgSSA9IGssIFMgIT09IG51bGwgJiYgKFMuZml4ZWRGb3ZlYXRpb24gPSBrKSwgeDEgIT09IG51bGwgJiYgeDEuZml4ZWRGb3ZlYXRpb24gIT09IHZvaWQgMCAmJiAoeDEuZml4ZWRGb3ZlYXRpb24gPSBrKTsKICAgICAgICB9LCB0aGlzLmhhc0RlcHRoU2Vuc2luZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTC50ZXh0dXJlICE9PSBudWxsOwogICAgICAgIH0sIHRoaXMuZ2V0RGVwdGhTZW5zaW5nTWVzaCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gTC5nZXRNZXNoKGYpOwogICAgICAgIH07CiAgICAgICAgbGV0IExlID0gbnVsbDsKICAgICAgICBmdW5jdGlvbiBHZShrLCBKKSB7CiAgICAgICAgICAgIGlmIChDID0gSi5nZXRWaWV3ZXJQb3NlKFQxIHx8IGgpLCBPID0gSiwgQyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGV0IHVlID0gQy52aWV3czsKICAgICAgICAgICAgICAgIHgxICE9PSBudWxsICYmIChuLnNldFJlbmRlclRhcmdldEZyYW1lYnVmZmVyKHcxLCB4MS5mcmFtZWJ1ZmZlciksIG4uc2V0UmVuZGVyVGFyZ2V0KHcxKSk7CiAgICAgICAgICAgICAgICBsZXQgaWUgPSAhMTsKICAgICAgICAgICAgICAgIHVlLmxlbmd0aCAhPT0gZi5jYW1lcmFzLmxlbmd0aCAmJiAoZi5jYW1lcmFzLmxlbmd0aCA9IDAsIGllID0gITApOwogICAgICAgICAgICAgICAgZm9yKGxldCBUZSA9IDA7IFRlIDwgdWUubGVuZ3RoOyBUZSsrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgamUgPSB1ZVtUZV0sICRlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoeDEgIT09IG51bGwpICRlID0geDEuZ2V0Vmlld3BvcnQoamUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IFIuZ2V0Vmlld1N1YkltYWdlKFMsIGplKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGUgPSBtLnZpZXdwb3J0LCBUZSA9PT0gMCAmJiAobi5zZXRSZW5kZXJUYXJnZXRUZXh0dXJlcyh3MSwgbS5jb2xvclRleHR1cmUsIFMuaWdub3JlRGVwdGhWYWx1ZXMgPyB2b2lkIDAgOiBtLmRlcHRoU3RlbmNpbFRleHR1cmUpLCBuLnNldFJlbmRlclRhcmdldCh3MSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgVWUgPSBwW1RlXTsKICAgICAgICAgICAgICAgICAgICBVZSA9PT0gdm9pZCAwICYmIChVZSA9IG5ldyB2dCwgVWUubGF5ZXJzLmVuYWJsZShUZSksIFVlLnZpZXdwb3J0ID0gbmV3IG90LCBwW1RlXSA9IFVlKSwgVWUubWF0cml4LmZyb21BcnJheShqZS50cmFuc2Zvcm0ubWF0cml4KSwgVWUubWF0cml4LmRlY29tcG9zZShVZS5wb3NpdGlvbiwgVWUucXVhdGVybmlvbiwgVWUuc2NhbGUpLCBVZS5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShqZS5wcm9qZWN0aW9uTWF0cml4KSwgVWUucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShVZS5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKSwgVWUudmlld3BvcnQuc2V0KCRlLngsICRlLnksICRlLndpZHRoLCAkZS5oZWlnaHQpLCBUZSA9PT0gMCAmJiAoZi5tYXRyaXguY29weShVZS5tYXRyaXgpLCBmLm1hdHJpeC5kZWNvbXBvc2UoZi5wb3NpdGlvbiwgZi5xdWF0ZXJuaW9uLCBmLnNjYWxlKSksIGllID09PSAhMCAmJiBmLmNhbWVyYXMucHVzaChVZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgRWUgPSBjLmVuYWJsZWRGZWF0dXJlczsKICAgICAgICAgICAgICAgIGlmIChFZSAmJiBFZS5pbmNsdWRlcygiZGVwdGgtc2Vuc2luZyIpICYmIGMuZGVwdGhVc2FnZSA9PSAiZ3B1LW9wdGltaXplZCIgJiYgUikgewogICAgICAgICAgICAgICAgICAgIGxldCBUZSA9IFIuZ2V0RGVwdGhJbmZvcm1hdGlvbih1ZVswXSk7CiAgICAgICAgICAgICAgICAgICAgVGUgJiYgVGUuaXNWYWxpZCAmJiBUZS50ZXh0dXJlICYmIEwuaW5pdChuLCBUZSwgYy5yZW5kZXJTdGF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGxldCB1ZSA9IDA7IHVlIDwgTS5sZW5ndGg7IHVlKyspewogICAgICAgICAgICAgICAgbGV0IGllID0gX1t1ZV0sIEVlID0gTVt1ZV07CiAgICAgICAgICAgICAgICBpZSAhPT0gbnVsbCAmJiBFZSAhPT0gdm9pZCAwICYmIEVlLnVwZGF0ZShpZSwgSiwgVDEgfHwgaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTGUgJiYgTGUoaywgSiksIEouZGV0ZWN0ZWRQbGFuZXMgJiYgaS5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgICAgIHR5cGU6ICJwbGFuZXNkZXRlY3RlZCIsCiAgICAgICAgICAgICAgICBkYXRhOiBKCiAgICAgICAgICAgIH0pLCBPID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IFplID0gbmV3IGJyMTsKICAgICAgICBaZS5zZXRBbmltYXRpb25Mb29wKEdlKSwgdGhpcy5zZXRBbmltYXRpb25Mb29wID0gZnVuY3Rpb24oaykgewogICAgICAgICAgICBMZSA9IGs7CiAgICAgICAgfSwgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24oKSB7fTsKICAgIH0KfSwgUHQgPSBuZXcgWHQsIEZmMSA9IG5ldyBEOwpmdW5jdGlvbiBCZjEoZSwgbikgewogICAgZnVuY3Rpb24gdChsLCByKSB7CiAgICAgICAgbC5tYXRyaXhBdXRvVXBkYXRlID09PSAhMCAmJiBsLnVwZGF0ZU1hdHJpeCgpLCByLnZhbHVlLmNvcHkobC5tYXRyaXgpOwogICAgfQogICAgZnVuY3Rpb24gaShsLCByKSB7CiAgICAgICAgci5jb2xvci5nZXRSR0IobC5mb2dDb2xvci52YWx1ZSwgUmYoZSkpLCByLmlzRm9nID8gKGwuZm9nTmVhci52YWx1ZSA9IHIubmVhciwgbC5mb2dGYXIudmFsdWUgPSByLmZhcikgOiByLmlzRm9nRXhwMiAmJiAobC5mb2dEZW5zaXR5LnZhbHVlID0gci5kZW5zaXR5KTsKICAgIH0KICAgIGZ1bmN0aW9uIGMobCwgciwgdywgTSwgXykgewogICAgICAgIHIuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fCByLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA/IHMobCwgcikgOiByLmlzTWVzaFRvb25NYXRlcmlhbCA/IChzKGwsIHIpLCBSKGwsIHIpKSA6IHIuaXNNZXNoUGhvbmdNYXRlcmlhbCA/IChzKGwsIHIpLCBDKGwsIHIpKSA6IHIuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IChzKGwsIHIpLCBTKGwsIHIpLCByLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgJiYgeDEobCwgciwgXykpIDogci5pc01lc2hNYXRjYXBNYXRlcmlhbCA/IChzKGwsIHIpLCBPKGwsIHIpKSA6IHIuaXNNZXNoRGVwdGhNYXRlcmlhbCA/IHMobCwgcikgOiByLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPyAocyhsLCByKSwgTChsLCByKSkgOiByLmlzTWVzaE5vcm1hbE1hdGVyaWFsID8gcyhsLCByKSA6IHIuaXNMaW5lQmFzaWNNYXRlcmlhbCA/IChoKGwsIHIpLCByLmlzTGluZURhc2hlZE1hdGVyaWFsICYmIGQobCwgcikpIDogci5pc1BvaW50c01hdGVyaWFsID8gSShsLCByLCB3LCBNKSA6IHIuaXNTcHJpdGVNYXRlcmlhbCA/IFQobCwgcikgOiByLmlzU2hhZG93TWF0ZXJpYWwgPyAobC5jb2xvci52YWx1ZS5jb3B5KHIuY29sb3IpLCBsLm9wYWNpdHkudmFsdWUgPSByLm9wYWNpdHkpIDogci5pc1NoYWRlck1hdGVyaWFsICYmIChyLnVuaWZvcm1zTmVlZFVwZGF0ZSA9ICExKTsKICAgIH0KICAgIGZ1bmN0aW9uIHMobCwgcikgewogICAgICAgIGwub3BhY2l0eS52YWx1ZSA9IHIub3BhY2l0eSwgci5jb2xvciAmJiBsLmRpZmZ1c2UudmFsdWUuY29weShyLmNvbG9yKSwgci5lbWlzc2l2ZSAmJiBsLmVtaXNzaXZlLnZhbHVlLmNvcHkoci5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIoci5lbWlzc2l2ZUludGVuc2l0eSksIHIubWFwICYmIChsLm1hcC52YWx1ZSA9IHIubWFwLCB0KHIubWFwLCBsLm1hcFRyYW5zZm9ybSkpLCByLmFscGhhTWFwICYmIChsLmFscGhhTWFwLnZhbHVlID0gci5hbHBoYU1hcCwgdChyLmFscGhhTWFwLCBsLmFscGhhTWFwVHJhbnNmb3JtKSksIHIuYnVtcE1hcCAmJiAobC5idW1wTWFwLnZhbHVlID0gci5idW1wTWFwLCB0KHIuYnVtcE1hcCwgbC5idW1wTWFwVHJhbnNmb3JtKSwgbC5idW1wU2NhbGUudmFsdWUgPSByLmJ1bXBTY2FsZSwgci5zaWRlID09PSBBbCAmJiAobC5idW1wU2NhbGUudmFsdWUgKj0gLTEpKSwgci5ub3JtYWxNYXAgJiYgKGwubm9ybWFsTWFwLnZhbHVlID0gci5ub3JtYWxNYXAsIHQoci5ub3JtYWxNYXAsIGwubm9ybWFsTWFwVHJhbnNmb3JtKSwgbC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KHIubm9ybWFsU2NhbGUpLCByLnNpZGUgPT09IEFsICYmIGwubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLCByLmRpc3BsYWNlbWVudE1hcCAmJiAobC5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSByLmRpc3BsYWNlbWVudE1hcCwgdChyLmRpc3BsYWNlbWVudE1hcCwgbC5kaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0pLCBsLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gci5kaXNwbGFjZW1lbnRTY2FsZSwgbC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gci5kaXNwbGFjZW1lbnRCaWFzKSwgci5lbWlzc2l2ZU1hcCAmJiAobC5lbWlzc2l2ZU1hcC52YWx1ZSA9IHIuZW1pc3NpdmVNYXAsIHQoci5lbWlzc2l2ZU1hcCwgbC5lbWlzc2l2ZU1hcFRyYW5zZm9ybSkpLCByLnNwZWN1bGFyTWFwICYmIChsLnNwZWN1bGFyTWFwLnZhbHVlID0gci5zcGVjdWxhck1hcCwgdChyLnNwZWN1bGFyTWFwLCBsLnNwZWN1bGFyTWFwVHJhbnNmb3JtKSksIHIuYWxwaGFUZXN0ID4gMCAmJiAobC5hbHBoYVRlc3QudmFsdWUgPSByLmFscGhhVGVzdCk7CiAgICAgICAgbGV0IHcgPSBuLmdldChyKSwgTSA9IHcuZW52TWFwLCBfID0gdy5lbnZNYXBSb3RhdGlvbjsKICAgICAgICBNICYmIChsLmVudk1hcC52YWx1ZSA9IE0sIFB0LmNvcHkoXyksIFB0LnggKj0gLTEsIFB0LnkgKj0gLTEsIFB0LnogKj0gLTEsIE0uaXNDdWJlVGV4dHVyZSAmJiBNLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gITEgJiYgKFB0LnkgKj0gLTEsIFB0LnogKj0gLTEpLCBsLmVudk1hcFJvdGF0aW9uLnZhbHVlLnNldEZyb21NYXRyaXg0KEZmMS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoUHQpKSwgbC5mbGlwRW52TWFwLnZhbHVlID0gTS5pc0N1YmVUZXh0dXJlICYmIE0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSAhMSA/IC0xIDogMSwgbC5yZWZsZWN0aXZpdHkudmFsdWUgPSByLnJlZmxlY3Rpdml0eSwgbC5pb3IudmFsdWUgPSByLmlvciwgbC5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSByLnJlZnJhY3Rpb25SYXRpbyksIHIubGlnaHRNYXAgJiYgKGwubGlnaHRNYXAudmFsdWUgPSByLmxpZ2h0TWFwLCBsLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlID0gci5saWdodE1hcEludGVuc2l0eSwgdChyLmxpZ2h0TWFwLCBsLmxpZ2h0TWFwVHJhbnNmb3JtKSksIHIuYW9NYXAgJiYgKGwuYW9NYXAudmFsdWUgPSByLmFvTWFwLCBsLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gci5hb01hcEludGVuc2l0eSwgdChyLmFvTWFwLCBsLmFvTWFwVHJhbnNmb3JtKSk7CiAgICB9CiAgICBmdW5jdGlvbiBoKGwsIHIpIHsKICAgICAgICBsLmRpZmZ1c2UudmFsdWUuY29weShyLmNvbG9yKSwgbC5vcGFjaXR5LnZhbHVlID0gci5vcGFjaXR5LCByLm1hcCAmJiAobC5tYXAudmFsdWUgPSByLm1hcCwgdChyLm1hcCwgbC5tYXBUcmFuc2Zvcm0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIGQobCwgcikgewogICAgICAgIGwuZGFzaFNpemUudmFsdWUgPSByLmRhc2hTaXplLCBsLnRvdGFsU2l6ZS52YWx1ZSA9IHIuZGFzaFNpemUgKyByLmdhcFNpemUsIGwuc2NhbGUudmFsdWUgPSByLnNjYWxlOwogICAgfQogICAgZnVuY3Rpb24gSShsLCByLCB3LCBNKSB7CiAgICAgICAgbC5kaWZmdXNlLnZhbHVlLmNvcHkoci5jb2xvciksIGwub3BhY2l0eS52YWx1ZSA9IHIub3BhY2l0eSwgbC5zaXplLnZhbHVlID0gci5zaXplICogdywgbC5zY2FsZS52YWx1ZSA9IE0gKiAuNSwgci5tYXAgJiYgKGwubWFwLnZhbHVlID0gci5tYXAsIHQoci5tYXAsIGwudXZUcmFuc2Zvcm0pKSwgci5hbHBoYU1hcCAmJiAobC5hbHBoYU1hcC52YWx1ZSA9IHIuYWxwaGFNYXAsIHQoci5hbHBoYU1hcCwgbC5hbHBoYU1hcFRyYW5zZm9ybSkpLCByLmFscGhhVGVzdCA+IDAgJiYgKGwuYWxwaGFUZXN0LnZhbHVlID0gci5hbHBoYVRlc3QpOwogICAgfQogICAgZnVuY3Rpb24gVChsLCByKSB7CiAgICAgICAgbC5kaWZmdXNlLnZhbHVlLmNvcHkoci5jb2xvciksIGwub3BhY2l0eS52YWx1ZSA9IHIub3BhY2l0eSwgbC5yb3RhdGlvbi52YWx1ZSA9IHIucm90YXRpb24sIHIubWFwICYmIChsLm1hcC52YWx1ZSA9IHIubWFwLCB0KHIubWFwLCBsLm1hcFRyYW5zZm9ybSkpLCByLmFscGhhTWFwICYmIChsLmFscGhhTWFwLnZhbHVlID0gci5hbHBoYU1hcCwgdChyLmFscGhhTWFwLCBsLmFscGhhTWFwVHJhbnNmb3JtKSksIHIuYWxwaGFUZXN0ID4gMCAmJiAobC5hbHBoYVRlc3QudmFsdWUgPSByLmFscGhhVGVzdCk7CiAgICB9CiAgICBmdW5jdGlvbiBDKGwsIHIpIHsKICAgICAgICBsLnNwZWN1bGFyLnZhbHVlLmNvcHkoci5zcGVjdWxhciksIGwuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoci5zaGluaW5lc3MsIDFlLTQpOwogICAgfQogICAgZnVuY3Rpb24gUihsLCByKSB7CiAgICAgICAgci5ncmFkaWVudE1hcCAmJiAobC5ncmFkaWVudE1hcC52YWx1ZSA9IHIuZ3JhZGllbnRNYXApOwogICAgfQogICAgZnVuY3Rpb24gUyhsLCByKSB7CiAgICAgICAgbC5tZXRhbG5lc3MudmFsdWUgPSByLm1ldGFsbmVzcywgci5tZXRhbG5lc3NNYXAgJiYgKGwubWV0YWxuZXNzTWFwLnZhbHVlID0gci5tZXRhbG5lc3NNYXAsIHQoci5tZXRhbG5lc3NNYXAsIGwubWV0YWxuZXNzTWFwVHJhbnNmb3JtKSksIGwucm91Z2huZXNzLnZhbHVlID0gci5yb3VnaG5lc3MsIHIucm91Z2huZXNzTWFwICYmIChsLnJvdWdobmVzc01hcC52YWx1ZSA9IHIucm91Z2huZXNzTWFwLCB0KHIucm91Z2huZXNzTWFwLCBsLnJvdWdobmVzc01hcFRyYW5zZm9ybSkpLCByLmVudk1hcCAmJiAobC5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSByLmVudk1hcEludGVuc2l0eSk7CiAgICB9CiAgICBmdW5jdGlvbiB4MShsLCByLCB3KSB7CiAgICAgICAgbC5pb3IudmFsdWUgPSByLmlvciwgci5zaGVlbiA+IDAgJiYgKGwuc2hlZW5Db2xvci52YWx1ZS5jb3B5KHIuc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIoci5zaGVlbiksIGwuc2hlZW5Sb3VnaG5lc3MudmFsdWUgPSByLnNoZWVuUm91Z2huZXNzLCByLnNoZWVuQ29sb3JNYXAgJiYgKGwuc2hlZW5Db2xvck1hcC52YWx1ZSA9IHIuc2hlZW5Db2xvck1hcCwgdChyLnNoZWVuQ29sb3JNYXAsIGwuc2hlZW5Db2xvck1hcFRyYW5zZm9ybSkpLCByLnNoZWVuUm91Z2huZXNzTWFwICYmIChsLnNoZWVuUm91Z2huZXNzTWFwLnZhbHVlID0gci5zaGVlblJvdWdobmVzc01hcCwgdChyLnNoZWVuUm91Z2huZXNzTWFwLCBsLnNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtKSkpLCByLmNsZWFyY29hdCA+IDAgJiYgKGwuY2xlYXJjb2F0LnZhbHVlID0gci5jbGVhcmNvYXQsIGwuY2xlYXJjb2F0Um91Z2huZXNzLnZhbHVlID0gci5jbGVhcmNvYXRSb3VnaG5lc3MsIHIuY2xlYXJjb2F0TWFwICYmIChsLmNsZWFyY29hdE1hcC52YWx1ZSA9IHIuY2xlYXJjb2F0TWFwLCB0KHIuY2xlYXJjb2F0TWFwLCBsLmNsZWFyY29hdE1hcFRyYW5zZm9ybSkpLCByLmNsZWFyY29hdFJvdWdobmVzc01hcCAmJiAobC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudmFsdWUgPSByLmNsZWFyY29hdFJvdWdobmVzc01hcCwgdChyLmNsZWFyY29hdFJvdWdobmVzc01hcCwgbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm0pKSwgci5jbGVhcmNvYXROb3JtYWxNYXAgJiYgKGwuY2xlYXJjb2F0Tm9ybWFsTWFwLnZhbHVlID0gci5jbGVhcmNvYXROb3JtYWxNYXAsIHQoci5jbGVhcmNvYXROb3JtYWxNYXAsIGwuY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtKSwgbC5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KHIuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLCByLnNpZGUgPT09IEFsICYmIGwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpKSwgci5kaXNwZXJzaW9uID4gMCAmJiAobC5kaXNwZXJzaW9uLnZhbHVlID0gci5kaXNwZXJzaW9uKSwgci5pcmlkZXNjZW5jZSA+IDAgJiYgKGwuaXJpZGVzY2VuY2UudmFsdWUgPSByLmlyaWRlc2NlbmNlLCBsLmlyaWRlc2NlbmNlSU9SLnZhbHVlID0gci5pcmlkZXNjZW5jZUlPUiwgbC5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0udmFsdWUgPSByLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMF0sIGwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLnZhbHVlID0gci5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWzFdLCByLmlyaWRlc2NlbmNlTWFwICYmIChsLmlyaWRlc2NlbmNlTWFwLnZhbHVlID0gci5pcmlkZXNjZW5jZU1hcCwgdChyLmlyaWRlc2NlbmNlTWFwLCBsLmlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtKSksIHIuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgJiYgKGwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudmFsdWUgPSByLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLCB0KHIuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIGwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0pKSksIHIudHJhbnNtaXNzaW9uID4gMCAmJiAobC50cmFuc21pc3Npb24udmFsdWUgPSByLnRyYW5zbWlzc2lvbiwgbC50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlID0gdy50ZXh0dXJlLCBsLnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldCh3LndpZHRoLCB3LmhlaWdodCksIHIudHJhbnNtaXNzaW9uTWFwICYmIChsLnRyYW5zbWlzc2lvbk1hcC52YWx1ZSA9IHIudHJhbnNtaXNzaW9uTWFwLCB0KHIudHJhbnNtaXNzaW9uTWFwLCBsLnRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSkpLCBsLnRoaWNrbmVzcy52YWx1ZSA9IHIudGhpY2tuZXNzLCByLnRoaWNrbmVzc01hcCAmJiAobC50aGlja25lc3NNYXAudmFsdWUgPSByLnRoaWNrbmVzc01hcCwgdChyLnRoaWNrbmVzc01hcCwgbC50aGlja25lc3NNYXBUcmFuc2Zvcm0pKSwgbC5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlID0gci5hdHRlbnVhdGlvbkRpc3RhbmNlLCBsLmF0dGVudWF0aW9uQ29sb3IudmFsdWUuY29weShyLmF0dGVudWF0aW9uQ29sb3IpKSwgci5hbmlzb3Ryb3B5ID4gMCAmJiAobC5hbmlzb3Ryb3B5VmVjdG9yLnZhbHVlLnNldChyLmFuaXNvdHJvcHkgKiBNYXRoLmNvcyhyLmFuaXNvdHJvcHlSb3RhdGlvbiksIHIuYW5pc290cm9weSAqIE1hdGguc2luKHIuYW5pc290cm9weVJvdGF0aW9uKSksIHIuYW5pc290cm9weU1hcCAmJiAobC5hbmlzb3Ryb3B5TWFwLnZhbHVlID0gci5hbmlzb3Ryb3B5TWFwLCB0KHIuYW5pc290cm9weU1hcCwgbC5hbmlzb3Ryb3B5TWFwVHJhbnNmb3JtKSkpLCBsLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlID0gci5zcGVjdWxhckludGVuc2l0eSwgbC5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkoci5zcGVjdWxhckNvbG9yKSwgci5zcGVjdWxhckNvbG9yTWFwICYmIChsLnNwZWN1bGFyQ29sb3JNYXAudmFsdWUgPSByLnNwZWN1bGFyQ29sb3JNYXAsIHQoci5zcGVjdWxhckNvbG9yTWFwLCBsLnNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm0pKSwgci5zcGVjdWxhckludGVuc2l0eU1hcCAmJiAobC5zcGVjdWxhckludGVuc2l0eU1hcC52YWx1ZSA9IHIuc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHQoci5zcGVjdWxhckludGVuc2l0eU1hcCwgbC5zcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSkpOwogICAgfQogICAgZnVuY3Rpb24gTyhsLCByKSB7CiAgICAgICAgci5tYXRjYXAgJiYgKGwubWF0Y2FwLnZhbHVlID0gci5tYXRjYXApOwogICAgfQogICAgZnVuY3Rpb24gTChsLCByKSB7CiAgICAgICAgbGV0IHcgPSBuLmdldChyKS5saWdodDsKICAgICAgICBsLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbih3Lm1hdHJpeFdvcmxkKSwgbC5uZWFyRGlzdGFuY2UudmFsdWUgPSB3LnNoYWRvdy5jYW1lcmEubmVhciwgbC5mYXJEaXN0YW5jZS52YWx1ZSA9IHcuc2hhZG93LmNhbWVyYS5mYXI7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHJlZnJlc2hGb2dVbmlmb3JtczogaSwKICAgICAgICByZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczogYwogICAgfTsKfQpmdW5jdGlvbiBHZihlLCBuLCB0LCBpKSB7CiAgICBsZXQgYyA9IHt9LCBzID0ge30sIGggPSBbXSwgZCA9IGUuZ2V0UGFyYW1ldGVyKGUuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTKTsKICAgIGZ1bmN0aW9uIEkodywgTSkgewogICAgICAgIGxldCBfID0gTS5wcm9ncmFtOwogICAgICAgIGkudW5pZm9ybUJsb2NrQmluZGluZyh3LCBfKTsKICAgIH0KICAgIGZ1bmN0aW9uIFQodywgTSkgewogICAgICAgIGxldCBfID0gY1t3LmlkXTsKICAgICAgICBfID09PSB2b2lkIDAgJiYgKE8odyksIF8gPSBDKHcpLCBjW3cuaWRdID0gXywgdy5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgbCkpOwogICAgICAgIGxldCBIID0gTS5wcm9ncmFtOwogICAgICAgIGkudXBkYXRlVUJPTWFwcGluZyh3LCBIKTsKICAgICAgICBsZXQgUCA9IG4ucmVuZGVyLmZyYW1lOwogICAgICAgIHNbdy5pZF0gIT09IFAgJiYgKFModyksIHNbdy5pZF0gPSBQKTsKICAgIH0KICAgIGZ1bmN0aW9uIEModykgewogICAgICAgIGxldCBNID0gUigpOwogICAgICAgIHcuX19iaW5kaW5nUG9pbnRJbmRleCA9IE07CiAgICAgICAgbGV0IF8gPSBlLmNyZWF0ZUJ1ZmZlcigpLCBIID0gdy5fX3NpemUsIFAgPSB3LnVzYWdlOwogICAgICAgIHJldHVybiBlLmJpbmRCdWZmZXIoZS5VTklGT1JNX0JVRkZFUiwgXyksIGUuYnVmZmVyRGF0YShlLlVOSUZPUk1fQlVGRkVSLCBILCBQKSwgZS5iaW5kQnVmZmVyKGUuVU5JRk9STV9CVUZGRVIsIG51bGwpLCBlLmJpbmRCdWZmZXJCYXNlKGUuVU5JRk9STV9CVUZGRVIsIE0sIF8pLCBfOwogICAgfQogICAgZnVuY3Rpb24gUigpIHsKICAgICAgICBmb3IobGV0IHcgPSAwOyB3IDwgZDsgdysrKWlmIChoLmluZGV4T2YodykgPT09IC0xKSByZXR1cm4gaC5wdXNoKHcpLCB3OwogICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXNseSB1c2FibGUgdW5pZm9ybXMgZ3JvdXBzIHJlYWNoZWQuIiksIDA7CiAgICB9CiAgICBmdW5jdGlvbiBTKHcpIHsKICAgICAgICBsZXQgTSA9IGNbdy5pZF0sIF8gPSB3LnVuaWZvcm1zLCBIID0gdy5fX2NhY2hlOwogICAgICAgIGUuYmluZEJ1ZmZlcihlLlVOSUZPUk1fQlVGRkVSLCBNKTsKICAgICAgICBmb3IobGV0IFAgPSAwLCB5MSA9IF8ubGVuZ3RoOyBQIDwgeTE7IFArKyl7CiAgICAgICAgICAgIGxldCBCID0gQXJyYXkuaXNBcnJheShfW1BdKSA/IF9bUF0gOiBbCiAgICAgICAgICAgICAgICBfW1BdCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZvcihsZXQgcCA9IDAsIGYgPSBCLmxlbmd0aDsgcCA8IGY7IHArKyl7CiAgICAgICAgICAgICAgICBsZXQgQSA9IEJbcF07CiAgICAgICAgICAgICAgICBpZiAoeDEoQSwgUCwgcCwgSCkgPT09ICEwKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHEgPSBBLl9fb2Zmc2V0LCBWID0gQXJyYXkuaXNBcnJheShBLnZhbHVlKSA/IEEudmFsdWUgOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIEEudmFsdWUKICAgICAgICAgICAgICAgICAgICBdLCBZID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IFEgPSAwOyBRIDwgVi5sZW5ndGg7IFErKyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6ID0gVltRXSwgaiA9IEwoeik7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB6ID09ICJudW1iZXIiIHx8IHR5cGVvZiB6ID09ICJib29sZWFuIiA/IChBLl9fZGF0YVswXSA9IHosIGUuYnVmZmVyU3ViRGF0YShlLlVOSUZPUk1fQlVGRkVSLCBxICsgWSwgQS5fX2RhdGEpKSA6IHouaXNNYXRyaXgzID8gKEEuX19kYXRhWzBdID0gei5lbGVtZW50c1swXSwgQS5fX2RhdGFbMV0gPSB6LmVsZW1lbnRzWzFdLCBBLl9fZGF0YVsyXSA9IHouZWxlbWVudHNbMl0sIEEuX19kYXRhWzNdID0gMCwgQS5fX2RhdGFbNF0gPSB6LmVsZW1lbnRzWzNdLCBBLl9fZGF0YVs1XSA9IHouZWxlbWVudHNbNF0sIEEuX19kYXRhWzZdID0gei5lbGVtZW50c1s1XSwgQS5fX2RhdGFbN10gPSAwLCBBLl9fZGF0YVs4XSA9IHouZWxlbWVudHNbNl0sIEEuX19kYXRhWzldID0gei5lbGVtZW50c1s3XSwgQS5fX2RhdGFbMTBdID0gei5lbGVtZW50c1s4XSwgQS5fX2RhdGFbMTFdID0gMCkgOiAoei50b0FycmF5KEEuX19kYXRhLCBZKSwgWSArPSBqLnN0b3JhZ2UgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlLmJ1ZmZlclN1YkRhdGEoZS5VTklGT1JNX0JVRkZFUiwgcSwgQS5fX2RhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGUuYmluZEJ1ZmZlcihlLlVOSUZPUk1fQlVGRkVSLCBudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIHgxKHcsIE0sIF8sIEgpIHsKICAgICAgICBsZXQgUCA9IHcudmFsdWUsIHkxID0gTSArICJfIiArIF87CiAgICAgICAgaWYgKEhbeTFdID09PSB2b2lkIDApIHJldHVybiB0eXBlb2YgUCA9PSAibnVtYmVyIiB8fCB0eXBlb2YgUCA9PSAiYm9vbGVhbiIgPyBIW3kxXSA9IFAgOiBIW3kxXSA9IFAuY2xvbmUoKSwgITA7CiAgICAgICAgewogICAgICAgICAgICBsZXQgQiA9IEhbeTFdOwogICAgICAgICAgICBpZiAodHlwZW9mIFAgPT0gIm51bWJlciIgfHwgdHlwZW9mIFAgPT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgICAgICBpZiAoQiAhPT0gUCkgcmV0dXJuIEhbeTFdID0gUCwgITA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQi5lcXVhbHMoUCkgPT09ICExKSByZXR1cm4gQi5jb3B5KFApLCAhMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICExOwogICAgfQogICAgZnVuY3Rpb24gTyh3KSB7CiAgICAgICAgbGV0IE0gPSB3LnVuaWZvcm1zLCBfID0gMCwgSCA9IDE2OwogICAgICAgIGZvcihsZXQgeTEgPSAwLCBCID0gTS5sZW5ndGg7IHkxIDwgQjsgeTErKyl7CiAgICAgICAgICAgIGxldCBwID0gQXJyYXkuaXNBcnJheShNW3kxXSkgPyBNW3kxXSA6IFsKICAgICAgICAgICAgICAgIE1beTFdCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZvcihsZXQgZiA9IDAsIEEgPSBwLmxlbmd0aDsgZiA8IEE7IGYrKyl7CiAgICAgICAgICAgICAgICBsZXQgcSA9IHBbZl0sIFYgPSBBcnJheS5pc0FycmF5KHEudmFsdWUpID8gcS52YWx1ZSA6IFsKICAgICAgICAgICAgICAgICAgICBxLnZhbHVlCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgZm9yKGxldCBZID0gMCwgUSA9IFYubGVuZ3RoOyBZIDwgUTsgWSsrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgeiA9IFZbWV0sIGogPSBMKHopLCBGID0gXyAlIEgsIG1lID0gRiAlIGouYm91bmRhcnksIE1lID0gRiArIG1lOwogICAgICAgICAgICAgICAgICAgIF8gKz0gbWUsIE1lICE9PSAwICYmIEggLSBNZSA8IGouc3RvcmFnZSAmJiAoXyArPSBIIC0gTWUpLCBxLl9fZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoai5zdG9yYWdlIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKSwgcS5fX29mZnNldCA9IF8sIF8gKz0gai5zdG9yYWdlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBQID0gXyAlIEg7CiAgICAgICAgcmV0dXJuIFAgPiAwICYmIChfICs9IEggLSBQKSwgdy5fX3NpemUgPSBfLCB3Ll9fY2FjaGUgPSB7fSwgdGhpczsKICAgIH0KICAgIGZ1bmN0aW9uIEwodykgewogICAgICAgIGxldCBNID0gewogICAgICAgICAgICBib3VuZGFyeTogMCwKICAgICAgICAgICAgc3RvcmFnZTogMAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3ID09ICJudW1iZXIiIHx8IHR5cGVvZiB3ID09ICJib29sZWFuIiA/IChNLmJvdW5kYXJ5ID0gNCwgTS5zdG9yYWdlID0gNCkgOiB3LmlzVmVjdG9yMiA/IChNLmJvdW5kYXJ5ID0gOCwgTS5zdG9yYWdlID0gOCkgOiB3LmlzVmVjdG9yMyB8fCB3LmlzQ29sb3IgPyAoTS5ib3VuZGFyeSA9IDE2LCBNLnN0b3JhZ2UgPSAxMikgOiB3LmlzVmVjdG9yNCA/IChNLmJvdW5kYXJ5ID0gMTYsIE0uc3RvcmFnZSA9IDE2KSA6IHcuaXNNYXRyaXgzID8gKE0uYm91bmRhcnkgPSA0OCwgTS5zdG9yYWdlID0gNDgpIDogdy5pc01hdHJpeDQgPyAoTS5ib3VuZGFyeSA9IDY0LCBNLnN0b3JhZ2UgPSA2NCkgOiB3LmlzVGV4dHVyZSA/IGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBzYW1wbGVycyBjYW4gbm90IGJlIHBhcnQgb2YgYW4gdW5pZm9ybXMgZ3JvdXAuIikgOiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHVuaWZvcm0gdmFsdWUgdHlwZS4iLCB3KSwgTTsKICAgIH0KICAgIGZ1bmN0aW9uIGwodykgewogICAgICAgIGxldCBNID0gdy50YXJnZXQ7CiAgICAgICAgTS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgbCk7CiAgICAgICAgbGV0IF8gPSBoLmluZGV4T2YoTS5fX2JpbmRpbmdQb2ludEluZGV4KTsKICAgICAgICBoLnNwbGljZShfLCAxKSwgZS5kZWxldGVCdWZmZXIoY1tNLmlkXSksIGRlbGV0ZSBjW00uaWRdLCBkZWxldGUgc1tNLmlkXTsKICAgIH0KICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgZm9yKGxldCB3IGluIGMpZS5kZWxldGVCdWZmZXIoY1t3XSk7CiAgICAgICAgaCA9IFtdLCBjID0ge30sIHMgPSB7fTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgYmluZDogSSwKICAgICAgICB1cGRhdGU6IFQsCiAgICAgICAgZGlzcG9zZTogcgogICAgfTsKfQp2YXIgY3IxID0gY2xhc3MgewogICAgY29uc3RydWN0b3IobiA9IHt9KXsKICAgICAgICBsZXQgeyBjYW52YXM6IHQgPSBJZigpICwgY29udGV4dDogaSA9IG51bGwgLCBkZXB0aDogYyA9ICEwICwgc3RlbmNpbDogcyA9ICExICwgYWxwaGE6IGggPSAhMSAsIGFudGlhbGlhczogZCA9ICExICwgcHJlbXVsdGlwbGllZEFscGhhOiBJID0gITAgLCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IFQgPSAhMSAsIHBvd2VyUHJlZmVyZW5jZTogQyA9ICJkZWZhdWx0IiAsIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IFIgPSAhMSAsIHJldmVyc2VEZXB0aEJ1ZmZlcjogUyA9ICExICB9ID0gbjsKICAgICAgICB0aGlzLmlzV2ViR0xSZW5kZXJlciA9ICEwOwogICAgICAgIGxldCB4MTsKICAgICAgICBpZiAoaSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCA8ICJ1IiAmJiBpIGluc3RhbmNlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMIDEgaXMgbm90IHN1cHBvcnRlZCBzaW5jZSByMTYzLiIpOwogICAgICAgICAgICB4MSA9IGkuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTsKICAgICAgICB9IGVsc2UgeDEgPSBoOwogICAgICAgIGxldCBPID0gbmV3IFVpbnQzMkFycmF5KDQpLCBMID0gbmV3IEludDMyQXJyYXkoNCksIGwgPSBudWxsLCByID0gbnVsbCwgdzEgPSBbXSwgTSA9IFtdOwogICAgICAgIHRoaXMuZG9tRWxlbWVudCA9IHQsIHRoaXMuZGVidWcgPSB7CiAgICAgICAgICAgIGNoZWNrU2hhZGVyRXJyb3JzOiAhMCwKICAgICAgICAgICAgb25TaGFkZXJFcnJvcjogbnVsbAogICAgICAgIH0sIHRoaXMuYXV0b0NsZWFyID0gITAsIHRoaXMuYXV0b0NsZWFyQ29sb3IgPSAhMCwgdGhpcy5hdXRvQ2xlYXJEZXB0aCA9ICEwLCB0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSAhMCwgdGhpcy5zb3J0T2JqZWN0cyA9ICEwLCB0aGlzLmNsaXBwaW5nUGxhbmVzID0gW10sIHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSAhMSwgdGhpcy5fb3V0cHV0Q29sb3JTcGFjZSA9IEJ0LCB0aGlzLnRvbmVNYXBwaW5nID0gVHAsIHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDE7CiAgICAgICAgbGV0IF8gPSB0aGlzLCBIID0gITEsIFAxID0gMCwgeTEgPSAwLCBCID0gbnVsbCwgcCA9IC0xLCBmID0gbnVsbCwgQSA9IG5ldyBvdCwgcSA9IG5ldyBvdCwgViA9IG51bGwsIFkgPSBuZXcgUCgwKSwgUSA9IDAsIHogPSB0LndpZHRoLCBqID0gdC5oZWlnaHQsIEYgPSAxLCBtZSA9IG51bGwsIE1lID0gbnVsbCwgTGUgPSBuZXcgb3QoMCwgMCwgeiwgaiksIEdlID0gbmV3IG90KDAsIDAsIHosIGopLCBaZSA9ICExLCBrID0gbmV3IHNuLCBKID0gITEsIHVlID0gITE7CiAgICAgICAgdGhpcy50cmFuc21pc3Npb25SZXNvbHV0aW9uU2NhbGUgPSAxOwogICAgICAgIGxldCBpZSA9IG5ldyBELCBFZSA9IG5ldyBELCBCZSA9IG5ldyB3LCBUZSA9IG5ldyBvdCwgamUgPSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IG51bGwsCiAgICAgICAgICAgIGZvZzogbnVsbCwKICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG51bGwsCiAgICAgICAgICAgIG92ZXJyaWRlTWF0ZXJpYWw6IG51bGwsCiAgICAgICAgICAgIGlzU2NlbmU6ICEwCiAgICAgICAgfSwgJGUgPSAhMTsKICAgICAgICBmdW5jdGlvbiBVZSgpIHsKICAgICAgICAgICAgcmV0dXJuIEIgPT09IG51bGwgPyBGIDogMTsKICAgICAgICB9CiAgICAgICAgbGV0IG0gPSBpOwogICAgICAgIGZ1bmN0aW9uIHV0KG8sIGcpIHsKICAgICAgICAgICAgcmV0dXJuIHQuZ2V0Q29udGV4dChvLCBnKTsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGV0IG8gPSB7CiAgICAgICAgICAgICAgICBhbHBoYTogITAsCiAgICAgICAgICAgICAgICBkZXB0aDogYywKICAgICAgICAgICAgICAgIHN0ZW5jaWw6IHMsCiAgICAgICAgICAgICAgICBhbnRpYWxpYXM6IGQsCiAgICAgICAgICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IEksCiAgICAgICAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IFQsCiAgICAgICAgICAgICAgICBwb3dlclByZWZlcmVuY2U6IEMsCiAgICAgICAgICAgICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBSCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICgic2V0QXR0cmlidXRlIiBpbiB0ICYmIHQuc2V0QXR0cmlidXRlKCJkYXRhLWVuZ2luZSIsIGB0aHJlZS5qcyByJHt2bH1gKSwgdC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IiwgWCwgITEpLCB0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIiwgb2UsICExKSwgdC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIiwgYWUsICExKSwgbSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGV0IGcgPSAid2ViZ2wyIjsKICAgICAgICAgICAgICAgIGlmIChtID0gdXQoZywgbyksIG0gPT09IG51bGwpIHRocm93IHV0KGcpID8gbmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpIDogbmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICB0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiICsgby5tZXNzYWdlKSwgbzsKICAgICAgICB9CiAgICAgICAgbGV0IERlLCB3ZSwgX2UsIFhlLCBoZSwgdSwgYSwgYiwgVywgSywgRywgcGUsIHJlLCBjZSwgeWUsIFosIGxlLCBTZSwgeGUsIGZlLCBJZSwgYmUsIHplLCB2OwogICAgICAgIGZ1bmN0aW9uIHRlKCkgewogICAgICAgICAgICBEZSA9IG5ldyBubDEobSksIERlLmluaXQoKSwgYmUgPSBuZXcgeWYxKG0sIERlKSwgd2UgPSBuZXcgWmMxKG0sIERlLCBuLCBiZSksIF9lID0gbmV3IHdmMShtLCBEZSksIHdlLnJldmVyc2VEZXB0aEJ1ZmZlciAmJiBTICYmIF9lLmJ1ZmZlcnMuZGVwdGguc2V0UmV2ZXJzZWQoITApLCBYZSA9IG5ldyBhbDEobSksIGhlID0gbmV3IFNmMSwgdSA9IG5ldyBJZjEobSwgRGUsIF9lLCBoZSwgd2UsIGJlLCBYZSksIGEgPSBuZXcgSmMxKF8pLCBiID0gbmV3IHRsMShfKSwgVyA9IG5ldyB1bzEobSksIHplID0gbmV3IEtjMShtLCBXKSwgSyA9IG5ldyBpbDEobSwgVywgWGUsIHplKSwgRyA9IG5ldyBzbDEobSwgSywgVywgWGUpLCB4ZSA9IG5ldyBvbDEobSwgd2UsIHUpLCBaID0gbmV3IFFjMShoZSksIHBlID0gbmV3IGdmMShfLCBhLCBiLCBEZSwgd2UsIHplLCBaKSwgcmUgPSBuZXcgQmYxKF8sIGhlKSwgY2UgPSBuZXcgTWYxLCB5ZSA9IG5ldyBiZjEoRGUpLCBTZSA9IG5ldyBxYzEoXywgYSwgYiwgX2UsIEcsIHgxLCBJKSwgbGUgPSBuZXcgVWYoXywgRywgd2UpLCB2ID0gbmV3IEdmKG0sIFhlLCB3ZSwgX2UpLCBmZSA9IG5ldyAkYzEobSwgRGUsIFhlKSwgSWUgPSBuZXcgcmwxKG0sIERlLCBYZSksIFhlLnByb2dyYW1zID0gcGUucHJvZ3JhbXMsIF8uY2FwYWJpbGl0aWVzID0gd2UsIF8uZXh0ZW5zaW9ucyA9IERlLCBfLnByb3BlcnRpZXMgPSBoZSwgXy5yZW5kZXJMaXN0cyA9IGNlLCBfLnNoYWRvd01hcCA9IGxlLCBfLnN0YXRlID0gX2UsIF8uaW5mbyA9IFhlOwogICAgICAgIH0KICAgICAgICB0ZSgpOwogICAgICAgIGxldCBOID0gbmV3IFpuMShfLCBtKTsKICAgICAgICB0aGlzLnhyID0gTiwgdGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBtOwogICAgICAgIH0sIHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIG0uZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKICAgICAgICB9LCB0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbGV0IG8gPSBEZS5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpOwogICAgICAgICAgICBvICYmIG8ubG9zZUNvbnRleHQoKTsKICAgICAgICB9LCB0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbGV0IG8gPSBEZS5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpOwogICAgICAgICAgICBvICYmIG8ucmVzdG9yZUNvbnRleHQoKTsKICAgICAgICB9LCB0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIEY7CiAgICAgICAgfSwgdGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24obykgewogICAgICAgICAgICBvICE9PSB2b2lkIDAgJiYgKEYgPSBvLCB0aGlzLnNldFNpemUoeiwgaiwgITEpKTsKICAgICAgICB9LCB0aGlzLmdldFNpemUgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgICAgIHJldHVybiBvLnNldCh6LCBqKTsKICAgICAgICB9LCB0aGlzLnNldFNpemUgPSBmdW5jdGlvbihvLCBnLCBVID0gITApIHsKICAgICAgICAgICAgaWYgKE4uaXNQcmVzZW50aW5nKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHogPSBvLCBqID0gZywgdC53aWR0aCA9IE1hdGguZmxvb3IobyAqIEYpLCB0LmhlaWdodCA9IE1hdGguZmxvb3IoZyAqIEYpLCBVID09PSAhMCAmJiAodC5zdHlsZS53aWR0aCA9IG8gKyAicHgiLCB0LnN0eWxlLmhlaWdodCA9IGcgKyAicHgiKSwgdGhpcy5zZXRWaWV3cG9ydCgwLCAwLCBvLCBnKTsKICAgICAgICB9LCB0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24obykgewogICAgICAgICAgICByZXR1cm4gby5zZXQoeiAqIEYsIGogKiBGKS5mbG9vcigpOwogICAgICAgIH0sIHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbihvLCBnLCBVKSB7CiAgICAgICAgICAgIHogPSBvLCBqID0gZywgRiA9IFUsIHQud2lkdGggPSBNYXRoLmZsb29yKG8gKiBVKSwgdC5oZWlnaHQgPSBNYXRoLmZsb29yKGcgKiBVKSwgdGhpcy5zZXRWaWV3cG9ydCgwLCAwLCBvLCBnKTsKICAgICAgICB9LCB0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgcmV0dXJuIG8uY29weShBKTsKICAgICAgICB9LCB0aGlzLmdldFZpZXdwb3J0ID0gZnVuY3Rpb24obykgewogICAgICAgICAgICByZXR1cm4gby5jb3B5KExlKTsKICAgICAgICB9LCB0aGlzLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24obywgZywgVSwgRCkgewogICAgICAgICAgICBvLmlzVmVjdG9yNCA/IExlLnNldChvLngsIG8ueSwgby56LCBvLncpIDogTGUuc2V0KG8sIGcsIFUsIEQpLCBfZS52aWV3cG9ydChBLmNvcHkoTGUpLm11bHRpcGx5U2NhbGFyKEYpLnJvdW5kKCkpOwogICAgICAgIH0sIHRoaXMuZ2V0U2Npc3NvciA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgcmV0dXJuIG8uY29weShHZSk7CiAgICAgICAgfSwgdGhpcy5zZXRTY2lzc29yID0gZnVuY3Rpb24obywgZywgVSwgRCkgewogICAgICAgICAgICBvLmlzVmVjdG9yNCA/IEdlLnNldChvLngsIG8ueSwgby56LCBvLncpIDogR2Uuc2V0KG8sIGcsIFUsIEQpLCBfZS5zY2lzc29yKHEuY29weShHZSkubXVsdGlwbHlTY2FsYXIoRikucm91bmQoKSk7CiAgICAgICAgfSwgdGhpcy5nZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gWmU7CiAgICAgICAgfSwgdGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgX2Uuc2V0U2Npc3NvclRlc3QoWmUgPSBvKTsKICAgICAgICB9LCB0aGlzLnNldE9wYXF1ZVNvcnQgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgICAgIG1lID0gbzsKICAgICAgICB9LCB0aGlzLnNldFRyYW5zcGFyZW50U29ydCA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgTWUgPSBvOwogICAgICAgIH0sIHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgcmV0dXJuIG8uY29weShTZS5nZXRDbGVhckNvbG9yKCkpOwogICAgICAgIH0sIHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBTZS5zZXRDbGVhckNvbG9yLmFwcGx5KFNlLCBhcmd1bWVudHMpOwogICAgICAgIH0sIHRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gU2UuZ2V0Q2xlYXJBbHBoYSgpOwogICAgICAgIH0sIHRoaXMuc2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBTZS5zZXRDbGVhckFscGhhLmFwcGx5KFNlLCBhcmd1bWVudHMpOwogICAgICAgIH0sIHRoaXMuY2xlYXIgPSBmdW5jdGlvbihvID0gITAsIGcgPSAhMCwgVSA9ICEwKSB7CiAgICAgICAgICAgIGxldCBEID0gMDsKICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICAgIGxldCBFID0gITE7CiAgICAgICAgICAgICAgICBpZiAoQiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGxldCAkID0gQi50ZXh0dXJlLmZvcm1hdDsKICAgICAgICAgICAgICAgICAgICBFID0gJCA9PT0gdWMgfHwgJCA9PT0gY2MgfHwgJCA9PT0gSWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoRSkgewogICAgICAgICAgICAgICAgICAgIGxldCAkID0gQi50ZXh0dXJlLnR5cGUsIG5lID0gJCA9PT0gU2wgfHwgJCA9PT0gV28gfHwgJCA9PT0gamwgfHwgJCA9PT0gc2MgfHwgJCA9PT0gZWMgfHwgJCA9PT0gaWMsIHNlID0gU2UuZ2V0Q2xlYXJDb2xvcigpLCBkZSA9IFNlLmdldENsZWFyQWxwaGEoKSwgQWUgPSBzZS5yLCBSZSA9IHNlLmcsIHZlID0gc2UuYjsKICAgICAgICAgICAgICAgICAgICBuZSA/IChPWzBdID0gQWUsIE9bMV0gPSBSZSwgT1syXSA9IHZlLCBPWzNdID0gZGUsIG0uY2xlYXJCdWZmZXJ1aXYobS5DT0xPUiwgMCwgTykpIDogKExbMF0gPSBBZSwgTFsxXSA9IFJlLCBMWzJdID0gdmUsIExbM10gPSBkZSwgbS5jbGVhckJ1ZmZlcml2KG0uQ09MT1IsIDAsIEwpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBEIHw9IG0uQ09MT1JfQlVGRkVSX0JJVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnICYmIChEIHw9IG0uREVQVEhfQlVGRkVSX0JJVCksIFUgJiYgKEQgfD0gbS5TVEVOQ0lMX0JVRkZFUl9CSVQsIHRoaXMuc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE1hc2soNDI5NDk2NzI5NSkpLCBtLmNsZWFyKEQpOwogICAgICAgIH0sIHRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmNsZWFyKCEwLCAhMSwgITEpOwogICAgICAgIH0sIHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmNsZWFyKCExLCAhMCwgITEpOwogICAgICAgIH0sIHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuY2xlYXIoITEsICExLCAhMCk7CiAgICAgICAgfSwgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsIFgsICExKSwgdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsIG9lLCAhMSksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciIsIGFlLCAhMSksIFNlLmRpc3Bvc2UoKSwgY2UuZGlzcG9zZSgpLCB5ZS5kaXNwb3NlKCksIGhlLmRpc3Bvc2UoKSwgYS5kaXNwb3NlKCksIGIuZGlzcG9zZSgpLCBHLmRpc3Bvc2UoKSwgemUuZGlzcG9zZSgpLCB2LmRpc3Bvc2UoKSwgcGUuZGlzcG9zZSgpLCBOLmRpc3Bvc2UoKSwgTi5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLCBqbiksIE4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmVuZCIsIGVpKSwgUnQuc3RvcCgpOwogICAgICAgIH07CiAgICAgICAgZnVuY3Rpb24gWChvKSB7CiAgICAgICAgICAgIG8ucHJldmVudERlZmF1bHQoKSwgY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSwgSCA9ICEwOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvZSgpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksIEggPSAhMTsKICAgICAgICAgICAgbGV0IG8gPSBYZS5hdXRvUmVzZXQsIGcgPSBsZS5lbmFibGVkLCBVID0gbGUuYXV0b1VwZGF0ZSwgRCA9IGxlLm5lZWRzVXBkYXRlLCBFID0gbGUudHlwZTsKICAgICAgICAgICAgdGUoKSwgWGUuYXV0b1Jlc2V0ID0gbywgbGUuZW5hYmxlZCA9IGcsIGxlLmF1dG9VcGRhdGUgPSBVLCBsZS5uZWVkc1VwZGF0ZSA9IEQsIGxlLnR5cGUgPSBFOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhZShvKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IEEgV2ViR0wgY29udGV4dCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29uOiAiLCBvLnN0YXR1c01lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBDZShvKSB7CiAgICAgICAgICAgIGxldCBnID0gby50YXJnZXQ7CiAgICAgICAgICAgIGcucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIENlKSwgUWUoZyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIFFlKG8pIHsKICAgICAgICAgICAgYXQobyksIGhlLnJlbW92ZShvKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYXQobykgewogICAgICAgICAgICBsZXQgZyA9IGhlLmdldChvKS5wcm9ncmFtczsKICAgICAgICAgICAgZyAhPT0gdm9pZCAwICYmIChnLmZvckVhY2goZnVuY3Rpb24oVSkgewogICAgICAgICAgICAgICAgcGUucmVsZWFzZVByb2dyYW0oVSk7CiAgICAgICAgICAgIH0pLCBvLmlzU2hhZGVyTWF0ZXJpYWwgJiYgcGUucmVsZWFzZVNoYWRlckNhY2hlKG8pKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbihvLCBnLCBVLCBELCBFLCAkKSB7CiAgICAgICAgICAgIGcgPT09IG51bGwgJiYgKGcgPSBqZSk7CiAgICAgICAgICAgIGxldCBuZSA9IEUuaXNNZXNoICYmIEUubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSA8IDAsIHNlID0gd3IobywgZywgVSwgRCwgRSk7CiAgICAgICAgICAgIF9lLnNldE1hdGVyaWFsKEQsIG5lKTsKICAgICAgICAgICAgbGV0IGRlID0gVS5pbmRleCwgQWUgPSAxOwogICAgICAgICAgICBpZiAoRC53aXJlZnJhbWUgPT09ICEwKSB7CiAgICAgICAgICAgICAgICBpZiAoZGUgPSBLLmdldFdpcmVmcmFtZUF0dHJpYnV0ZShVKSwgZGUgPT09IHZvaWQgMCkgcmV0dXJuOwogICAgICAgICAgICAgICAgQWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBSZSA9IFUuZHJhd1JhbmdlLCB2ZSA9IFUuYXR0cmlidXRlcy5wb3NpdGlvbiwgTmUgPSBSZS5zdGFydCAqIEFlLCBIZSA9IChSZS5zdGFydCArIFJlLmNvdW50KSAqIEFlOwogICAgICAgICAgICAkICE9PSBudWxsICYmIChOZSA9IE1hdGgubWF4KE5lLCAkLnN0YXJ0ICogQWUpLCBIZSA9IE1hdGgubWluKEhlLCAoJC5zdGFydCArICQuY291bnQpICogQWUpKSwgZGUgIT09IG51bGwgPyAoTmUgPSBNYXRoLm1heChOZSwgMCksIEhlID0gTWF0aC5taW4oSGUsIGRlLmNvdW50KSkgOiB2ZSAhPSBudWxsICYmIChOZSA9IE1hdGgubWF4KE5lLCAwKSwgSGUgPSBNYXRoLm1pbihIZSwgdmUuY291bnQpKTsKICAgICAgICAgICAgbGV0IGV0ID0gSGUgLSBOZTsKICAgICAgICAgICAgaWYgKGV0IDwgMCB8fCBldCA9PT0gMSAvIDApIHJldHVybjsKICAgICAgICAgICAgemUuc2V0dXAoRSwgRCwgc2UsIFUsIGRlKTsKICAgICAgICAgICAgbGV0IEplLCBPZSA9IGZlOwogICAgICAgICAgICBpZiAoZGUgIT09IG51bGwgJiYgKEplID0gVy5nZXQoZGUpLCBPZSA9IEllLCBPZS5zZXRJbmRleChKZSkpLCBFLmlzTWVzaCkgRC53aXJlZnJhbWUgPT09ICEwID8gKF9lLnNldExpbmVXaWR0aChELndpcmVmcmFtZUxpbmV3aWR0aCAqIFVlKCkpLCBPZS5zZXRNb2RlKG0uTElORVMpKSA6IE9lLnNldE1vZGUobS5UUklBTkdMRVMpOwogICAgICAgICAgICBlbHNlIGlmIChFLmlzTGluZSkgewogICAgICAgICAgICAgICAgbGV0IGdlID0gRC5saW5ld2lkdGg7CiAgICAgICAgICAgICAgICBnZSA9PT0gdm9pZCAwICYmIChnZSA9IDEpLCBfZS5zZXRMaW5lV2lkdGgoZ2UgKiBVZSgpKSwgRS5pc0xpbmVTZWdtZW50cyA/IE9lLnNldE1vZGUobS5MSU5FUykgOiBFLmlzTGluZUxvb3AgPyBPZS5zZXRNb2RlKG0uTElORV9MT09QKSA6IE9lLnNldE1vZGUobS5MSU5FX1NUUklQKTsKICAgICAgICAgICAgfSBlbHNlIEUuaXNQb2ludHMgPyBPZS5zZXRNb2RlKG0uUE9JTlRTKSA6IEUuaXNTcHJpdGUgJiYgT2Uuc2V0TW9kZShtLlRSSUFOR0xFUyk7CiAgICAgICAgICAgIGlmIChFLmlzQmF0Y2hlZE1lc2gpIGlmIChFLl9tdWx0aURyYXdJbnN0YW5jZXMgIT09IG51bGwpIE9lLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcyhFLl9tdWx0aURyYXdTdGFydHMsIEUuX211bHRpRHJhd0NvdW50cywgRS5fbXVsdGlEcmF3Q291bnQsIEUuX211bHRpRHJhd0luc3RhbmNlcyk7CiAgICAgICAgICAgIGVsc2UgaWYgKERlLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpKSBPZS5yZW5kZXJNdWx0aURyYXcoRS5fbXVsdGlEcmF3U3RhcnRzLCBFLl9tdWx0aURyYXdDb3VudHMsIEUuX211bHRpRHJhd0NvdW50KTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsZXQgZ2UgPSBFLl9tdWx0aURyYXdTdGFydHMsIHJ0ID0gRS5fbXVsdGlEcmF3Q291bnRzLCBWZSA9IEUuX211bHRpRHJhd0NvdW50LCB2dCA9IGRlID8gVy5nZXQoZGUpLmJ5dGVzUGVyRWxlbWVudCA6IDEsIE50ID0gaGUuZ2V0KEQpLmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7CiAgICAgICAgICAgICAgICBmb3IobGV0IGR0ID0gMDsgZHQgPCBWZTsgZHQrKylOdC5zZXRWYWx1ZShtLCAiX2dsX0RyYXdJRCIsIGR0KSwgT2UucmVuZGVyKGdlW2R0XSAvIHZ0LCBydFtkdF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEUuaXNJbnN0YW5jZWRNZXNoKSBPZS5yZW5kZXJJbnN0YW5jZXMoTmUsIGV0LCBFLmNvdW50KTsKICAgICAgICAgICAgZWxzZSBpZiAoVS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KSB7CiAgICAgICAgICAgICAgICBsZXQgZ2UgPSBVLl9tYXhJbnN0YW5jZUNvdW50ICE9PSB2b2lkIDAgPyBVLl9tYXhJbnN0YW5jZUNvdW50IDogMSAvIDAsIHJ0ID0gTWF0aC5taW4oVS5pbnN0YW5jZUNvdW50LCBnZSk7CiAgICAgICAgICAgICAgICBPZS5yZW5kZXJJbnN0YW5jZXMoTmUsIGV0LCBydCk7CiAgICAgICAgICAgIH0gZWxzZSBPZS5yZW5kZXIoTmUsIGV0KTsKICAgICAgICB9OwogICAgICAgIGZ1bmN0aW9uIGtlKG8sIGcsIFUpIHsKICAgICAgICAgICAgby50cmFuc3BhcmVudCA9PT0gITAgJiYgby5zaWRlID09PSBZZCAmJiBvLmZvcmNlU2luZ2xlUGFzcyA9PT0gITEgPyAoby5zaWRlID0gQWwsIG8ubmVlZHNVcGRhdGUgPSAhMCwgbm4obywgZywgVSksIG8uc2lkZSA9IGRyLCBvLm5lZWRzVXBkYXRlID0gITAsIG5uKG8sIGcsIFUpLCBvLnNpZGUgPSBZZCkgOiBubihvLCBnLCBVKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jb21waWxlID0gZnVuY3Rpb24obywgZywgVSA9IG51bGwpIHsKICAgICAgICAgICAgVSA9PT0gbnVsbCAmJiAoVSA9IG8pLCByID0geWUuZ2V0KFUpLCByLmluaXQoZyksIE0ucHVzaChyKSwgVS50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oRSkgewogICAgICAgICAgICAgICAgRS5pc0xpZ2h0ICYmIEUubGF5ZXJzLnRlc3QoZy5sYXllcnMpICYmIChyLnB1c2hMaWdodChFKSwgRS5jYXN0U2hhZG93ICYmIHIucHVzaFNoYWRvdyhFKSk7CiAgICAgICAgICAgIH0pLCBvICE9PSBVICYmIG8udHJhdmVyc2VWaXNpYmxlKGZ1bmN0aW9uKEUpIHsKICAgICAgICAgICAgICAgIEUuaXNMaWdodCAmJiBFLmxheWVycy50ZXN0KGcubGF5ZXJzKSAmJiAoci5wdXNoTGlnaHQoRSksIEUuY2FzdFNoYWRvdyAmJiByLnB1c2hTaGFkb3coRSkpOwogICAgICAgICAgICB9KSwgci5zZXR1cExpZ2h0cygpOwogICAgICAgICAgICBsZXQgRCA9IG5ldyBTZXQ7CiAgICAgICAgICAgIHJldHVybiBvLnRyYXZlcnNlKGZ1bmN0aW9uKEUpIHsKICAgICAgICAgICAgICAgIGlmICghKEUuaXNNZXNoIHx8IEUuaXNQb2ludHMgfHwgRS5pc0xpbmUgfHwgRS5pc1Nwcml0ZSkpIHJldHVybjsKICAgICAgICAgICAgICAgIGxldCAkID0gRS5tYXRlcmlhbDsKICAgICAgICAgICAgICAgIGlmICgkKSBpZiAoQXJyYXkuaXNBcnJheSgkKSkgZm9yKGxldCBuZSA9IDA7IG5lIDwgJC5sZW5ndGg7IG5lKyspewogICAgICAgICAgICAgICAgICAgIGxldCBzZSA9ICRbbmVdOwogICAgICAgICAgICAgICAgICAgIGtlKHNlLCBVLCBFKSwgRC5hZGQoc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBrZSgkLCBVLCBFKSwgRC5hZGQoJCk7CiAgICAgICAgICAgIH0pLCBNLnBvcCgpLCByID0gbnVsbCwgRDsKICAgICAgICB9LCB0aGlzLmNvbXBpbGVBc3luYyA9IGZ1bmN0aW9uKG8sIGcsIFUgPSBudWxsKSB7CiAgICAgICAgICAgIGxldCBEID0gdGhpcy5jb21waWxlKG8sIGcsIFUpOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKEUpPT57CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAkKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChELmZvckVhY2goZnVuY3Rpb24obmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGUuZ2V0KG5lKS5jdXJyZW50UHJvZ3JhbS5pc1JlYWR5KCkgJiYgRC5kZWxldGUobmUpOwogICAgICAgICAgICAgICAgICAgIH0pLCBELnNpemUgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgRShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCQsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIERlLmdldCgiS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIikgIT09IG51bGwgPyAkKCkgOiBzZXRUaW1lb3V0KCQsIDEwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBsZXQgX3QgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIFN0KG8pIHsKICAgICAgICAgICAgX3QgJiYgX3Qobyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGpuKCkgewogICAgICAgICAgICBSdC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGVpKCkgewogICAgICAgICAgICBSdC5zdGFydCgpOwogICAgICAgIH0KICAgICAgICBsZXQgUnQgPSBuZXcgYnIxOwogICAgICAgIFJ0LnNldEFuaW1hdGlvbkxvb3AoU3QpLCB0eXBlb2Ygc2VsZiA8ICJ1IiAmJiBSdC5zZXRDb250ZXh0KHNlbGYpLCB0aGlzLnNldEFuaW1hdGlvbkxvb3AgPSBmdW5jdGlvbihvKSB7CiAgICAgICAgICAgIF90ID0gbywgTi5zZXRBbmltYXRpb25Mb29wKG8pLCBvID09PSBudWxsID8gUnQuc3RvcCgpIDogUnQuc3RhcnQoKTsKICAgICAgICB9LCBOLmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsIGpuKSwgTi5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIiwgZWkpLCB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKG8sIGcpIHsKICAgICAgICAgICAgaWYgKGcgIT09IHZvaWQgMCAmJiBnLmlzQ2FtZXJhICE9PSAhMCkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChIID09PSAhMCkgcmV0dXJuOwogICAgICAgICAgICBpZiAoby5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09ICEwICYmIG8udXBkYXRlTWF0cml4V29ybGQoKSwgZy5wYXJlbnQgPT09IG51bGwgJiYgZy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09ICEwICYmIGcudXBkYXRlTWF0cml4V29ybGQoKSwgTi5lbmFibGVkID09PSAhMCAmJiBOLmlzUHJlc2VudGluZyA9PT0gITAgJiYgKE4uY2FtZXJhQXV0b1VwZGF0ZSA9PT0gITAgJiYgTi51cGRhdGVDYW1lcmEoZyksIGcgPSBOLmdldENhbWVyYSgpKSwgby5pc1NjZW5lID09PSAhMCAmJiBvLm9uQmVmb3JlUmVuZGVyKF8sIG8sIGcsIEIpLCByID0geWUuZ2V0KG8sIE0ubGVuZ3RoKSwgci5pbml0KGcpLCBNLnB1c2gociksIEVlLm11bHRpcGx5TWF0cmljZXMoZy5wcm9qZWN0aW9uTWF0cml4LCBnLm1hdHJpeFdvcmxkSW52ZXJzZSksIGsuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoRWUpLCB1ZSA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQsIEogPSBaLmluaXQodGhpcy5jbGlwcGluZ1BsYW5lcywgdWUpLCBsID0gY2UuZ2V0KG8sIHcxLmxlbmd0aCksIGwuaW5pdCgpLCB3MS5wdXNoKGwpLCBOLmVuYWJsZWQgPT09ICEwICYmIE4uaXNQcmVzZW50aW5nID09PSAhMCkgewogICAgICAgICAgICAgICAgbGV0ICQgPSBfLnhyLmdldERlcHRoU2Vuc2luZ01lc2goKTsKICAgICAgICAgICAgICAgICQgIT09IG51bGwgJiYgU24oJCwgZywgLTEgLyAwLCBfLnNvcnRPYmplY3RzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTbihvLCBnLCAwLCBfLnNvcnRPYmplY3RzKSwgbC5maW5pc2goKSwgXy5zb3J0T2JqZWN0cyA9PT0gITAgJiYgbC5zb3J0KG1lLCBNZSksICRlID0gTi5lbmFibGVkID09PSAhMSB8fCBOLmlzUHJlc2VudGluZyA9PT0gITEgfHwgTi5oYXNEZXB0aFNlbnNpbmcoKSA9PT0gITEsICRlICYmIFNlLmFkZFRvUmVuZGVyTGlzdChsLCBvKSwgdGhpcy5pbmZvLnJlbmRlci5mcmFtZSsrLCBKID09PSAhMCAmJiBaLmJlZ2luU2hhZG93cygpOwogICAgICAgICAgICBsZXQgVSA9IHIuc3RhdGUuc2hhZG93c0FycmF5OwogICAgICAgICAgICBsZS5yZW5kZXIoVSwgbywgZyksIEogPT09ICEwICYmIFouZW5kU2hhZG93cygpLCB0aGlzLmluZm8uYXV0b1Jlc2V0ID09PSAhMCAmJiB0aGlzLmluZm8ucmVzZXQoKTsKICAgICAgICAgICAgbGV0IEQgPSBsLm9wYXF1ZSwgRSA9IGwudHJhbnNtaXNzaXZlOwogICAgICAgICAgICBpZiAoci5zZXR1cExpZ2h0cygpLCBnLmlzQXJyYXlDYW1lcmEpIHsKICAgICAgICAgICAgICAgIGxldCAkID0gZy5jYW1lcmFzOwogICAgICAgICAgICAgICAgaWYgKEUubGVuZ3RoID4gMCkgZm9yKGxldCBuZSA9IDAsIHNlID0gJC5sZW5ndGg7IG5lIDwgc2U7IG5lKyspewogICAgICAgICAgICAgICAgICAgIGxldCBkZSA9ICRbbmVdOwogICAgICAgICAgICAgICAgICAgIG5pKEQsIEUsIG8sIGRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRlICYmIFNlLnJlbmRlcihvKTsKICAgICAgICAgICAgICAgIGZvcihsZXQgbmUgPSAwLCBzZSA9ICQubGVuZ3RoOyBuZSA8IHNlOyBuZSsrKXsKICAgICAgICAgICAgICAgICAgICBsZXQgZGUgPSAkW25lXTsKICAgICAgICAgICAgICAgICAgICB0aShsLCBvLCBkZSwgZGUudmlld3BvcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgRS5sZW5ndGggPiAwICYmIG5pKEQsIEUsIG8sIGcpLCAkZSAmJiBTZS5yZW5kZXIobyksIHRpKGwsIG8sIGcpOwogICAgICAgICAgICBCICE9PSBudWxsICYmIHkxID09PSAwICYmICh1LnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KEIpLCB1LnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChCKSksIG8uaXNTY2VuZSA9PT0gITAgJiYgby5vbkFmdGVyUmVuZGVyKF8sIG8sIGcpLCB6ZS5yZXNldERlZmF1bHRTdGF0ZSgpLCBwID0gLTEsIGYgPSBudWxsLCBNLnBvcCgpLCBNLmxlbmd0aCA+IDAgPyAociA9IE1bTS5sZW5ndGggLSAxXSwgSiA9PT0gITAgJiYgWi5zZXRHbG9iYWxTdGF0ZShfLmNsaXBwaW5nUGxhbmVzLCByLnN0YXRlLmNhbWVyYSkpIDogciA9IG51bGwsIHcxLnBvcCgpLCB3MS5sZW5ndGggPiAwID8gbCA9IHcxW3cxLmxlbmd0aCAtIDFdIDogbCA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBTbihvLCBnLCBVLCBEKSB7CiAgICAgICAgICAgIGlmIChvLnZpc2libGUgPT09ICExKSByZXR1cm47CiAgICAgICAgICAgIGlmIChvLmxheWVycy50ZXN0KGcubGF5ZXJzKSkgewogICAgICAgICAgICAgICAgaWYgKG8uaXNHcm91cCkgVSA9IG8ucmVuZGVyT3JkZXI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvLmlzTE9EKSBvLmF1dG9VcGRhdGUgPT09ICEwICYmIG8udXBkYXRlKGcpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoby5pc0xpZ2h0KSByLnB1c2hMaWdodChvKSwgby5jYXN0U2hhZG93ICYmIHIucHVzaFNoYWRvdyhvKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKG8uaXNTcHJpdGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW8uZnJ1c3R1bUN1bGxlZCB8fCBrLmludGVyc2VjdHNTcHJpdGUobykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRCAmJiBUZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oby5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lID0gRy51cGRhdGUobyksIHNlID0gby5tYXRlcmlhbDsKICAgICAgICAgICAgICAgICAgICAgICAgc2UudmlzaWJsZSAmJiBsLnB1c2gobywgbmUsIHNlLCBVLCBUZS56LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChvLmlzTWVzaCB8fCBvLmlzTGluZSB8fCBvLmlzUG9pbnRzKSAmJiAoIW8uZnJ1c3R1bUN1bGxlZCB8fCBrLmludGVyc2VjdHNPYmplY3QobykpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IG5lID0gRy51cGRhdGUobyksIHNlID0gby5tYXRlcmlhbDsKICAgICAgICAgICAgICAgICAgICBpZiAoRCAmJiAoby5ib3VuZGluZ1NwaGVyZSAhPT0gdm9pZCAwID8gKG8uYm91bmRpbmdTcGhlcmUgPT09IG51bGwgJiYgby5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSwgVGUuY29weShvLmJvdW5kaW5nU3BoZXJlLmNlbnRlcikpIDogKG5lLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmIG5lLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLCBUZS5jb3B5KG5lLmJvdW5kaW5nU3BoZXJlLmNlbnRlcikpLCBUZS5hcHBseU1hdHJpeDQoby5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEVlKSksIEFycmF5LmlzQXJyYXkoc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZSA9IG5lLmdyb3VwczsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBBZSA9IDAsIFJlID0gZGUubGVuZ3RoOyBBZSA8IFJlOyBBZSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2ZSA9IGRlW0FlXSwgTmUgPSBzZVt2ZS5tYXRlcmlhbEluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lICYmIE5lLnZpc2libGUgJiYgbC5wdXNoKG8sIG5lLCBOZSwgVSwgVGUueiwgdmUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHNlLnZpc2libGUgJiYgbC5wdXNoKG8sIG5lLCBzZSwgVSwgVGUueiwgbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0ICQgPSBvLmNoaWxkcmVuOwogICAgICAgICAgICBmb3IobGV0IG5lID0gMCwgc2UgPSAkLmxlbmd0aDsgbmUgPCBzZTsgbmUrKylTbigkW25lXSwgZywgVSwgRCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHRpKG8sIGcsIFUsIEQpIHsKICAgICAgICAgICAgbGV0IEUgPSBvLm9wYXF1ZSwgJCA9IG8udHJhbnNtaXNzaXZlLCBuZSA9IG8udHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIHIuc2V0dXBMaWdodHNWaWV3KFUpLCBKID09PSAhMCAmJiBaLnNldEdsb2JhbFN0YXRlKF8uY2xpcHBpbmdQbGFuZXMsIFUpLCBEICYmIF9lLnZpZXdwb3J0KEEuY29weShEKSksIEUubGVuZ3RoID4gMCAmJiB0bihFLCBnLCBVKSwgJC5sZW5ndGggPiAwICYmIHRuKCQsIGcsIFUpLCBuZS5sZW5ndGggPiAwICYmIHRuKG5lLCBnLCBVKSwgX2UuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSwgX2UuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSwgX2UuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSwgX2Uuc2V0UG9seWdvbk9mZnNldCghMSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG5pKG8sIGcsIFUsIEQpIHsKICAgICAgICAgICAgaWYgKChVLmlzU2NlbmUgPT09ICEwID8gVS5vdmVycmlkZU1hdGVyaWFsIDogbnVsbCkgIT09IG51bGwpIHJldHVybjsKICAgICAgICAgICAgci5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbRC5pZF0gPT09IHZvaWQgMCAmJiAoci5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbRC5pZF0gPSBuZXcgSGkoMSwgMSwgewogICAgICAgICAgICAgICAgZ2VuZXJhdGVNaXBtYXBzOiAhMCwKICAgICAgICAgICAgICAgIHR5cGU6IERlLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikgfHwgRGUuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IikgPyB0YyA6IFNsLAogICAgICAgICAgICAgICAgbWluRmlsdGVyOiB2biwKICAgICAgICAgICAgICAgIHNhbXBsZXM6IDQsCiAgICAgICAgICAgICAgICBzdGVuY2lsQnVmZmVyOiBzLAogICAgICAgICAgICAgICAgcmVzb2x2ZURlcHRoQnVmZmVyOiAhMSwKICAgICAgICAgICAgICAgIHJlc29sdmVTdGVuY2lsQnVmZmVyOiAhMSwKICAgICAgICAgICAgICAgIGNvbG9yU3BhY2U6IFR0LndvcmtpbmdDb2xvclNwYWNlCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgbGV0ICQgPSByLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtELmlkXSwgbmUgPSBELnZpZXdwb3J0IHx8IEE7CiAgICAgICAgICAgICQuc2V0U2l6ZShuZS56ICogXy50cmFuc21pc3Npb25SZXNvbHV0aW9uU2NhbGUsIG5lLncgKiBfLnRyYW5zbWlzc2lvblJlc29sdXRpb25TY2FsZSk7CiAgICAgICAgICAgIGxldCBzZSA9IF8uZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgICAgICAgICAgIF8uc2V0UmVuZGVyVGFyZ2V0KCQpLCBfLmdldENsZWFyQ29sb3IoWSksIFEgPSBfLmdldENsZWFyQWxwaGEoKSwgUSA8IDEgJiYgXy5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LCAuNSksIF8uY2xlYXIoKSwgJGUgJiYgU2UucmVuZGVyKFUpOwogICAgICAgICAgICBsZXQgZGUgPSBfLnRvbmVNYXBwaW5nOwogICAgICAgICAgICBfLnRvbmVNYXBwaW5nID0gVHA7CiAgICAgICAgICAgIGxldCBBZSA9IEQudmlld3BvcnQ7CiAgICAgICAgICAgIGlmIChELnZpZXdwb3J0ICE9PSB2b2lkIDAgJiYgKEQudmlld3BvcnQgPSB2b2lkIDApLCByLnNldHVwTGlnaHRzVmlldyhEKSwgSiA9PT0gITAgJiYgWi5zZXRHbG9iYWxTdGF0ZShfLmNsaXBwaW5nUGxhbmVzLCBEKSwgdG4obywgVSwgRCksIHUudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoJCksIHUudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCQpLCBEZS5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpID09PSAhMSkgewogICAgICAgICAgICAgICAgbGV0IFJlID0gITE7CiAgICAgICAgICAgICAgICBmb3IobGV0IHZlID0gMCwgTmUgPSBnLmxlbmd0aDsgdmUgPCBOZTsgdmUrKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IEhlID0gZ1t2ZV0sIGV0ID0gSGUub2JqZWN0LCBKZSA9IEhlLmdlb21ldHJ5LCBPZSA9IEhlLm1hdGVyaWFsLCBnZSA9IEhlLmdyb3VwOwogICAgICAgICAgICAgICAgICAgIGlmIChPZS5zaWRlID09PSBZZCAmJiBldC5sYXllcnMudGVzdChELmxheWVycykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ0ID0gT2Uuc2lkZTsKICAgICAgICAgICAgICAgICAgICAgICAgT2Uuc2lkZSA9IEFsLCBPZS5uZWVkc1VwZGF0ZSA9ICEwLCBpaShldCwgVSwgRCwgSmUsIE9lLCBnZSksIE9lLnNpZGUgPSBydCwgT2UubmVlZHNVcGRhdGUgPSAhMCwgUmUgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBSZSA9PT0gITAgJiYgKHUudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoJCksIHUudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfLnNldFJlbmRlclRhcmdldChzZSksIF8uc2V0Q2xlYXJDb2xvcihZLCBRKSwgQWUgIT09IHZvaWQgMCAmJiAoRC52aWV3cG9ydCA9IEFlKSwgXy50b25lTWFwcGluZyA9IGRlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB0bihvLCBnLCBVKSB7CiAgICAgICAgICAgIGxldCBEID0gZy5pc1NjZW5lID09PSAhMCA/IGcub3ZlcnJpZGVNYXRlcmlhbCA6IG51bGw7CiAgICAgICAgICAgIGZvcihsZXQgRSA9IDAsICQgPSBvLmxlbmd0aDsgRSA8ICQ7IEUrKyl7CiAgICAgICAgICAgICAgICBsZXQgbmUgPSBvW0VdLCBzZSA9IG5lLm9iamVjdCwgZGUgPSBuZS5nZW9tZXRyeSwgQWUgPSBEID09PSBudWxsID8gbmUubWF0ZXJpYWwgOiBELCBSZSA9IG5lLmdyb3VwOwogICAgICAgICAgICAgICAgc2UubGF5ZXJzLnRlc3QoVS5sYXllcnMpICYmIGlpKHNlLCBnLCBVLCBkZSwgQWUsIFJlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpaShvLCBnLCBVLCBELCBFLCAkKSB7CiAgICAgICAgICAgIG8ub25CZWZvcmVSZW5kZXIoXywgZywgVSwgRCwgRSwgJCksIG8ubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVS5tYXRyaXhXb3JsZEludmVyc2UsIG8ubWF0cml4V29ybGQpLCBvLm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoby5tb2RlbFZpZXdNYXRyaXgpLCBFLm9uQmVmb3JlUmVuZGVyKF8sIGcsIFUsIEQsIG8sICQpLCBFLnRyYW5zcGFyZW50ID09PSAhMCAmJiBFLnNpZGUgPT09IFlkICYmIEUuZm9yY2VTaW5nbGVQYXNzID09PSAhMSA/IChFLnNpZGUgPSBBbCwgRS5uZWVkc1VwZGF0ZSA9ICEwLCBfLnJlbmRlckJ1ZmZlckRpcmVjdChVLCBnLCBELCBFLCBvLCAkKSwgRS5zaWRlID0gZHIsIEUubmVlZHNVcGRhdGUgPSAhMCwgXy5yZW5kZXJCdWZmZXJEaXJlY3QoVSwgZywgRCwgRSwgbywgJCksIEUuc2lkZSA9IFlkKSA6IF8ucmVuZGVyQnVmZmVyRGlyZWN0KFUsIGcsIEQsIEUsIG8sICQpLCBvLm9uQWZ0ZXJSZW5kZXIoXywgZywgVSwgRCwgRSwgJCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG5uKG8sIGcsIFUpIHsKICAgICAgICAgICAgZy5pc1NjZW5lICE9PSAhMCAmJiAoZyA9IGplKTsKICAgICAgICAgICAgbGV0IEQgPSBoZS5nZXQobyksIEUgPSByLnN0YXRlLmxpZ2h0cywgJCA9IHIuc3RhdGUuc2hhZG93c0FycmF5LCBuZSA9IEUuc3RhdGUudmVyc2lvbiwgc2UgPSBwZS5nZXRQYXJhbWV0ZXJzKG8sIEUuc3RhdGUsICQsIGcsIFUpLCBkZSA9IHBlLmdldFByb2dyYW1DYWNoZUtleShzZSksIEFlID0gRC5wcm9ncmFtczsKICAgICAgICAgICAgRC5lbnZpcm9ubWVudCA9IG8uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IGcuZW52aXJvbm1lbnQgOiBudWxsLCBELmZvZyA9IGcuZm9nLCBELmVudk1hcCA9IChvLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBiIDogYSkuZ2V0KG8uZW52TWFwIHx8IEQuZW52aXJvbm1lbnQpLCBELmVudk1hcFJvdGF0aW9uID0gRC5lbnZpcm9ubWVudCAhPT0gbnVsbCAmJiBvLmVudk1hcCA9PT0gbnVsbCA/IGcuZW52aXJvbm1lbnRSb3RhdGlvbiA6IG8uZW52TWFwUm90YXRpb24sIEFlID09PSB2b2lkIDAgJiYgKG8uYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIENlKSwgQWUgPSBuZXcgTWFwLCBELnByb2dyYW1zID0gQWUpOwogICAgICAgICAgICBsZXQgUmUgPSBBZS5nZXQoZGUpOwogICAgICAgICAgICBpZiAoUmUgIT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgaWYgKEQuY3VycmVudFByb2dyYW0gPT09IFJlICYmIEQubGlnaHRzU3RhdGVWZXJzaW9uID09PSBuZSkgcmV0dXJuIGFpKG8sIHNlKSwgUmU7CiAgICAgICAgICAgIH0gZWxzZSBzZS51bmlmb3JtcyA9IHBlLmdldFVuaWZvcm1zKG8pLCBvLm9uQmVmb3JlQ29tcGlsZShzZSwgXyksIFJlID0gcGUuYWNxdWlyZVByb2dyYW0oc2UsIGRlKSwgQWUuc2V0KGRlLCBSZSksIEQudW5pZm9ybXMgPSBzZS51bmlmb3JtczsKICAgICAgICAgICAgbGV0IHZlID0gRC51bmlmb3JtczsKICAgICAgICAgICAgcmV0dXJuICghby5pc1NoYWRlck1hdGVyaWFsICYmICFvLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHwgby5jbGlwcGluZyA9PT0gITApICYmICh2ZS5jbGlwcGluZ1BsYW5lcyA9IFoudW5pZm9ybSksIGFpKG8sIHNlKSwgRC5uZWVkc0xpZ2h0cyA9IHlyKG8pLCBELmxpZ2h0c1N0YXRlVmVyc2lvbiA9IG5lLCBELm5lZWRzTGlnaHRzICYmICh2ZS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZSA9IEUuc3RhdGUuYW1iaWVudCwgdmUubGlnaHRQcm9iZS52YWx1ZSA9IEUuc3RhdGUucHJvYmUsIHZlLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gRS5zdGF0ZS5kaXJlY3Rpb25hbCwgdmUuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MudmFsdWUgPSBFLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93LCB2ZS5zcG90TGlnaHRzLnZhbHVlID0gRS5zdGF0ZS5zcG90LCB2ZS5zcG90TGlnaHRTaGFkb3dzLnZhbHVlID0gRS5zdGF0ZS5zcG90U2hhZG93LCB2ZS5yZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IEUuc3RhdGUucmVjdEFyZWEsIHZlLmx0Y18xLnZhbHVlID0gRS5zdGF0ZS5yZWN0QXJlYUxUQzEsIHZlLmx0Y18yLnZhbHVlID0gRS5zdGF0ZS5yZWN0QXJlYUxUQzIsIHZlLnBvaW50TGlnaHRzLnZhbHVlID0gRS5zdGF0ZS5wb2ludCwgdmUucG9pbnRMaWdodFNoYWRvd3MudmFsdWUgPSBFLnN0YXRlLnBvaW50U2hhZG93LCB2ZS5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlID0gRS5zdGF0ZS5oZW1pLCB2ZS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IEUuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsIHZlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gRS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwgdmUuc3BvdFNoYWRvd01hcC52YWx1ZSA9IEUuc3RhdGUuc3BvdFNoYWRvd01hcCwgdmUuc3BvdExpZ2h0TWF0cml4LnZhbHVlID0gRS5zdGF0ZS5zcG90TGlnaHRNYXRyaXgsIHZlLnNwb3RMaWdodE1hcC52YWx1ZSA9IEUuc3RhdGUuc3BvdExpZ2h0TWFwLCB2ZS5wb2ludFNoYWRvd01hcC52YWx1ZSA9IEUuc3RhdGUucG9pbnRTaGFkb3dNYXAsIHZlLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gRS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCksIEQuY3VycmVudFByb2dyYW0gPSBSZSwgRC51bmlmb3Jtc0xpc3QgPSBudWxsLCBSZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcmkobykgewogICAgICAgICAgICBpZiAoby51bmlmb3Jtc0xpc3QgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGxldCBnID0gby5jdXJyZW50UHJvZ3JhbS5nZXRVbmlmb3JtcygpOwogICAgICAgICAgICAgICAgby51bmlmb3Jtc0xpc3QgPSBWdDEuc2VxV2l0aFZhbHVlKGcuc2VxLCBvLnVuaWZvcm1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gby51bmlmb3Jtc0xpc3Q7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFpKG8sIGcpIHsKICAgICAgICAgICAgbGV0IFUgPSBoZS5nZXQobyk7CiAgICAgICAgICAgIFUub3V0cHV0Q29sb3JTcGFjZSA9IGcub3V0cHV0Q29sb3JTcGFjZSwgVS5iYXRjaGluZyA9IGcuYmF0Y2hpbmcsIFUuYmF0Y2hpbmdDb2xvciA9IGcuYmF0Y2hpbmdDb2xvciwgVS5pbnN0YW5jaW5nID0gZy5pbnN0YW5jaW5nLCBVLmluc3RhbmNpbmdDb2xvciA9IGcuaW5zdGFuY2luZ0NvbG9yLCBVLmluc3RhbmNpbmdNb3JwaCA9IGcuaW5zdGFuY2luZ01vcnBoLCBVLnNraW5uaW5nID0gZy5za2lubmluZywgVS5tb3JwaFRhcmdldHMgPSBnLm1vcnBoVGFyZ2V0cywgVS5tb3JwaE5vcm1hbHMgPSBnLm1vcnBoTm9ybWFscywgVS5tb3JwaENvbG9ycyA9IGcubW9ycGhDb2xvcnMsIFUubW9ycGhUYXJnZXRzQ291bnQgPSBnLm1vcnBoVGFyZ2V0c0NvdW50LCBVLm51bUNsaXBwaW5nUGxhbmVzID0gZy5udW1DbGlwcGluZ1BsYW5lcywgVS5udW1JbnRlcnNlY3Rpb24gPSBnLm51bUNsaXBJbnRlcnNlY3Rpb24sIFUudmVydGV4QWxwaGFzID0gZy52ZXJ0ZXhBbHBoYXMsIFUudmVydGV4VGFuZ2VudHMgPSBnLnZlcnRleFRhbmdlbnRzLCBVLnRvbmVNYXBwaW5nID0gZy50b25lTWFwcGluZzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gd3IobywgZywgVSwgRCwgRSkgewogICAgICAgICAgICBnLmlzU2NlbmUgIT09ICEwICYmIChnID0gamUpLCB1LnJlc2V0VGV4dHVyZVVuaXRzKCk7CiAgICAgICAgICAgIGxldCAkID0gZy5mb2csIG5lID0gRC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gZy5lbnZpcm9ubWVudCA6IG51bGwsIHNlID0gQiA9PT0gbnVsbCA/IF8ub3V0cHV0Q29sb3JTcGFjZSA6IEIuaXNYUlJlbmRlclRhcmdldCA9PT0gITAgPyBCLnRleHR1cmUuY29sb3JTcGFjZSA6IGhhLCBkZSA9IChELmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBiIDogYSkuZ2V0KEQuZW52TWFwIHx8IG5lKSwgQWUgPSBELnZlcnRleENvbG9ycyA9PT0gITAgJiYgISFVLmF0dHJpYnV0ZXMuY29sb3IgJiYgVS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplID09PSA0LCBSZSA9ICEhVS5hdHRyaWJ1dGVzLnRhbmdlbnQgJiYgKCEhRC5ub3JtYWxNYXAgfHwgRC5hbmlzb3Ryb3B5ID4gMCksIHZlID0gISFVLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiwgTmUgPSAhIVUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCwgSGUgPSAhIVUubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLCBldCA9IFRwOwogICAgICAgICAgICBELnRvbmVNYXBwZWQgJiYgKEIgPT09IG51bGwgfHwgQi5pc1hSUmVuZGVyVGFyZ2V0ID09PSAhMCkgJiYgKGV0ID0gXy50b25lTWFwcGluZyk7CiAgICAgICAgICAgIGxldCBKZSA9IFUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IFUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBVLm1vcnBoQXR0cmlidXRlcy5jb2xvciwgT2UgPSBKZSAhPT0gdm9pZCAwID8gSmUubGVuZ3RoIDogMCwgZ2UgPSBoZS5nZXQoRCksIHJ0ID0gci5zdGF0ZS5saWdodHM7CiAgICAgICAgICAgIGlmIChKID09PSAhMCAmJiAodWUgPT09ICEwIHx8IG8gIT09IGYpKSB7CiAgICAgICAgICAgICAgICBsZXQgb3QgPSBvID09PSBmICYmIEQuaWQgPT09IHA7CiAgICAgICAgICAgICAgICBaLnNldFN0YXRlKEQsIG8sIG90KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgVmUgPSAhMTsKICAgICAgICAgICAgRC52ZXJzaW9uID09PSBnZS5fX3ZlcnNpb24gPyAoZ2UubmVlZHNMaWdodHMgJiYgZ2UubGlnaHRzU3RhdGVWZXJzaW9uICE9PSBydC5zdGF0ZS52ZXJzaW9uIHx8IGdlLm91dHB1dENvbG9yU3BhY2UgIT09IHNlIHx8IEUuaXNCYXRjaGVkTWVzaCAmJiBnZS5iYXRjaGluZyA9PT0gITEgfHwgIUUuaXNCYXRjaGVkTWVzaCAmJiBnZS5iYXRjaGluZyA9PT0gITAgfHwgRS5pc0JhdGNoZWRNZXNoICYmIGdlLmJhdGNoaW5nQ29sb3IgPT09ICEwICYmIEUuY29sb3JUZXh0dXJlID09PSBudWxsIHx8IEUuaXNCYXRjaGVkTWVzaCAmJiBnZS5iYXRjaGluZ0NvbG9yID09PSAhMSAmJiBFLmNvbG9yVGV4dHVyZSAhPT0gbnVsbCB8fCBFLmlzSW5zdGFuY2VkTWVzaCAmJiBnZS5pbnN0YW5jaW5nID09PSAhMSB8fCAhRS5pc0luc3RhbmNlZE1lc2ggJiYgZ2UuaW5zdGFuY2luZyA9PT0gITAgfHwgRS5pc1NraW5uZWRNZXNoICYmIGdlLnNraW5uaW5nID09PSAhMSB8fCAhRS5pc1NraW5uZWRNZXNoICYmIGdlLnNraW5uaW5nID09PSAhMCB8fCBFLmlzSW5zdGFuY2VkTWVzaCAmJiBnZS5pbnN0YW5jaW5nQ29sb3IgPT09ICEwICYmIEUuaW5zdGFuY2VDb2xvciA9PT0gbnVsbCB8fCBFLmlzSW5zdGFuY2VkTWVzaCAmJiBnZS5pbnN0YW5jaW5nQ29sb3IgPT09ICExICYmIEUuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCB8fCBFLmlzSW5zdGFuY2VkTWVzaCAmJiBnZS5pbnN0YW5jaW5nTW9ycGggPT09ICEwICYmIEUubW9ycGhUZXh0dXJlID09PSBudWxsIHx8IEUuaXNJbnN0YW5jZWRNZXNoICYmIGdlLmluc3RhbmNpbmdNb3JwaCA9PT0gITEgJiYgRS5tb3JwaFRleHR1cmUgIT09IG51bGwgfHwgZ2UuZW52TWFwICE9PSBkZSB8fCBELmZvZyA9PT0gITAgJiYgZ2UuZm9nICE9PSAkIHx8IGdlLm51bUNsaXBwaW5nUGxhbmVzICE9PSB2b2lkIDAgJiYgKGdlLm51bUNsaXBwaW5nUGxhbmVzICE9PSBaLm51bVBsYW5lcyB8fCBnZS5udW1JbnRlcnNlY3Rpb24gIT09IFoubnVtSW50ZXJzZWN0aW9uKSB8fCBnZS52ZXJ0ZXhBbHBoYXMgIT09IEFlIHx8IGdlLnZlcnRleFRhbmdlbnRzICE9PSBSZSB8fCBnZS5tb3JwaFRhcmdldHMgIT09IHZlIHx8IGdlLm1vcnBoTm9ybWFscyAhPT0gTmUgfHwgZ2UubW9ycGhDb2xvcnMgIT09IEhlIHx8IGdlLnRvbmVNYXBwaW5nICE9PSBldCB8fCBnZS5tb3JwaFRhcmdldHNDb3VudCAhPT0gT2UpICYmIChWZSA9ICEwKSA6IChWZSA9ICEwLCBnZS5fX3ZlcnNpb24gPSBELnZlcnNpb24pOwogICAgICAgICAgICBsZXQgdnQgPSBnZS5jdXJyZW50UHJvZ3JhbTsKICAgICAgICAgICAgVmUgPT09ICEwICYmICh2dCA9IG5uKEQsIGcsIEUpKTsKICAgICAgICAgICAgbGV0IE50ID0gITEsIGR0ID0gITEsIFl0ID0gITEsIHFlID0gdnQuZ2V0VW5pZm9ybXMoKSwgcHQgPSBnZS51bmlmb3JtczsKICAgICAgICAgICAgaWYgKF9lLnVzZVByb2dyYW0odnQucHJvZ3JhbSkgJiYgKE50ID0gITAsIGR0ID0gITAsIFl0ID0gITApLCBELmlkICE9PSBwICYmIChwID0gRC5pZCwgZHQgPSAhMCksIE50IHx8IGYgIT09IG8pIHsKICAgICAgICAgICAgICAgIF9lLmJ1ZmZlcnMuZGVwdGguZ2V0UmV2ZXJzZWQoKSA/IChpZS5jb3B5KG8ucHJvamVjdGlvbk1hdHJpeCksIEZmKGllKSwgQmYoaWUpLCBxZS5zZXRWYWx1ZShtLCAicHJvamVjdGlvbk1hdHJpeCIsIGllKSkgOiBxZS5zZXRWYWx1ZShtLCAicHJvamVjdGlvbk1hdHJpeCIsIG8ucHJvamVjdGlvbk1hdHJpeCksIHFlLnNldFZhbHVlKG0sICJ2aWV3TWF0cml4Iiwgby5tYXRyaXhXb3JsZEludmVyc2UpOwogICAgICAgICAgICAgICAgbGV0IHN0ID0gcWUubWFwLmNhbWVyYVBvc2l0aW9uOwogICAgICAgICAgICAgICAgc3QgIT09IHZvaWQgMCAmJiBzdC5zZXRWYWx1ZShtLCBCZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oby5tYXRyaXhXb3JsZCkpLCB3ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHFlLnNldFZhbHVlKG0sICJsb2dEZXB0aEJ1ZkZDIiwgMiAvIChNYXRoLmxvZyhvLmZhciArIDEpIC8gTWF0aC5MTjIpKSwgKEQuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fCBELmlzTWVzaFRvb25NYXRlcmlhbCB8fCBELmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fCBELmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHwgRC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8IEQuaXNTaGFkZXJNYXRlcmlhbCkgJiYgcWUuc2V0VmFsdWUobSwgImlzT3J0aG9ncmFwaGljIiwgby5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9PT0gITApLCBmICE9PSBvICYmIChmID0gbywgZHQgPSAhMCwgWXQgPSAhMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEUuaXNTa2lubmVkTWVzaCkgewogICAgICAgICAgICAgICAgcWUuc2V0T3B0aW9uYWwobSwgRSwgImJpbmRNYXRyaXgiKSwgcWUuc2V0T3B0aW9uYWwobSwgRSwgImJpbmRNYXRyaXhJbnZlcnNlIik7CiAgICAgICAgICAgICAgICBsZXQgb3QgPSBFLnNrZWxldG9uOwogICAgICAgICAgICAgICAgb3QgJiYgKG90LmJvbmVUZXh0dXJlID09PSBudWxsICYmIG90LmNvbXB1dGVCb25lVGV4dHVyZSgpLCBxZS5zZXRWYWx1ZShtLCAiYm9uZVRleHR1cmUiLCBvdC5ib25lVGV4dHVyZSwgdSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEUuaXNCYXRjaGVkTWVzaCAmJiAocWUuc2V0T3B0aW9uYWwobSwgRSwgImJhdGNoaW5nVGV4dHVyZSIpLCBxZS5zZXRWYWx1ZShtLCAiYmF0Y2hpbmdUZXh0dXJlIiwgRS5fbWF0cmljZXNUZXh0dXJlLCB1KSwgcWUuc2V0T3B0aW9uYWwobSwgRSwgImJhdGNoaW5nSWRUZXh0dXJlIiksIHFlLnNldFZhbHVlKG0sICJiYXRjaGluZ0lkVGV4dHVyZSIsIEUuX2luZGlyZWN0VGV4dHVyZSwgdSksIHFlLnNldE9wdGlvbmFsKG0sIEUsICJiYXRjaGluZ0NvbG9yVGV4dHVyZSIpLCBFLl9jb2xvcnNUZXh0dXJlICE9PSBudWxsICYmIHFlLnNldFZhbHVlKG0sICJiYXRjaGluZ0NvbG9yVGV4dHVyZSIsIEUuX2NvbG9yc1RleHR1cmUsIHUpKTsKICAgICAgICAgICAgbGV0IGh0ID0gVS5tb3JwaEF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGlmICgoaHQucG9zaXRpb24gIT09IHZvaWQgMCB8fCBodC5ub3JtYWwgIT09IHZvaWQgMCB8fCBodC5jb2xvciAhPT0gdm9pZCAwKSAmJiB4ZS51cGRhdGUoRSwgVSwgdnQpLCAoZHQgfHwgZ2UucmVjZWl2ZVNoYWRvdyAhPT0gRS5yZWNlaXZlU2hhZG93KSAmJiAoZ2UucmVjZWl2ZVNoYWRvdyA9IEUucmVjZWl2ZVNoYWRvdywgcWUuc2V0VmFsdWUobSwgInJlY2VpdmVTaGFkb3ciLCBFLnJlY2VpdmVTaGFkb3cpKSwgRC5pc01lc2hHb3VyYXVkTWF0ZXJpYWwgJiYgRC5lbnZNYXAgIT09IG51bGwgJiYgKHB0LmVudk1hcC52YWx1ZSA9IGRlLCBwdC5mbGlwRW52TWFwLnZhbHVlID0gZGUuaXNDdWJlVGV4dHVyZSAmJiBkZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09ICExID8gLTEgOiAxKSwgRC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICYmIEQuZW52TWFwID09PSBudWxsICYmIGcuZW52aXJvbm1lbnQgIT09IG51bGwgJiYgKHB0LmVudk1hcEludGVuc2l0eS52YWx1ZSA9IGcuZW52aXJvbm1lbnRJbnRlbnNpdHkpLCBkdCAmJiAocWUuc2V0VmFsdWUobSwgInRvbmVNYXBwaW5nRXhwb3N1cmUiLCBfLnRvbmVNYXBwaW5nRXhwb3N1cmUpLCBnZS5uZWVkc0xpZ2h0cyAmJiBJcihwdCwgWXQpLCAkICYmIEQuZm9nID09PSAhMCAmJiByZS5yZWZyZXNoRm9nVW5pZm9ybXMocHQsICQpLCByZS5yZWZyZXNoTWF0ZXJpYWxVbmlmb3JtcyhwdCwgRCwgRiwgaiwgci5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbby5pZF0pLCBWdDEudXBsb2FkKG0sIHJpKGdlKSwgcHQsIHUpKSwgRC5pc1NoYWRlck1hdGVyaWFsICYmIEQudW5pZm9ybXNOZWVkVXBkYXRlID09PSAhMCAmJiAoVnQxLnVwbG9hZChtLCByaShnZSksIHB0LCB1KSwgRC51bmlmb3Jtc05lZWRVcGRhdGUgPSAhMSksIEQuaXNTcHJpdGVNYXRlcmlhbCAmJiBxZS5zZXRWYWx1ZShtLCAiY2VudGVyIiwgRS5jZW50ZXIpLCBxZS5zZXRWYWx1ZShtLCAibW9kZWxWaWV3TWF0cml4IiwgRS5tb2RlbFZpZXdNYXRyaXgpLCBxZS5zZXRWYWx1ZShtLCAibm9ybWFsTWF0cml4IiwgRS5ub3JtYWxNYXRyaXgpLCBxZS5zZXRWYWx1ZShtLCAibW9kZWxNYXRyaXgiLCBFLm1hdHJpeFdvcmxkKSwgRC5pc1NoYWRlck1hdGVyaWFsIHx8IEQuaXNSYXdTaGFkZXJNYXRlcmlhbCkgewogICAgICAgICAgICAgICAgbGV0IG90ID0gRC51bmlmb3Jtc0dyb3VwczsKICAgICAgICAgICAgICAgIGZvcihsZXQgc3QgPSAwLCBFbiA9IG90Lmxlbmd0aDsgc3QgPCBFbjsgc3QrKyl7CiAgICAgICAgICAgICAgICAgICAgbGV0IEN0ID0gb3Rbc3RdOwogICAgICAgICAgICAgICAgICAgIHYudXBkYXRlKEN0LCB2dCksIHYuYmluZChDdCwgdnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2dDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gSXIobywgZykgewogICAgICAgICAgICBvLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gZywgby5saWdodFByb2JlLm5lZWRzVXBkYXRlID0gZywgby5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IGcsIG8uZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSBnLCBvLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gZywgby5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IGcsIG8uc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IGcsIG8uc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IGcsIG8ucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSBnLCBvLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSBnOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB5cihvKSB7CiAgICAgICAgICAgIHJldHVybiBvLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fCBvLmlzTWVzaFRvb25NYXRlcmlhbCB8fCBvLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwgby5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8IG8uaXNTaGFkb3dNYXRlcmlhbCB8fCBvLmlzU2hhZGVyTWF0ZXJpYWwgJiYgby5saWdodHMgPT09ICEwOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldEFjdGl2ZUN1YmVGYWNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBQMTsKICAgICAgICB9LCB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB5MTsKICAgICAgICB9LCB0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQjsKICAgICAgICB9LCB0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzID0gZnVuY3Rpb24obywgZywgVSkgewogICAgICAgICAgICBoZS5nZXQoby50ZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSA9IGcsIGhlLmdldChvLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUgPSBVOwogICAgICAgICAgICBsZXQgRCA9IGhlLmdldChvKTsKICAgICAgICAgICAgRC5fX2hhc0V4dGVybmFsVGV4dHVyZXMgPSAhMCwgRC5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gVSA9PT0gdm9pZCAwLCBELl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgfHwgRGUuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKSA9PT0gITAgJiYgKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogUmVuZGVyLXRvLXRleHR1cmUgZXh0ZW5zaW9uIHdhcyBkaXNhYmxlZCBiZWNhdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgd2FzIHByb3ZpZGVkIiksIEQuX191c2VSZW5kZXJUb1RleHR1cmUgPSAhMSk7CiAgICAgICAgfSwgdGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlciA9IGZ1bmN0aW9uKG8sIGcpIHsKICAgICAgICAgICAgbGV0IFUgPSBoZS5nZXQobyk7CiAgICAgICAgICAgIFUuX193ZWJnbEZyYW1lYnVmZmVyID0gZywgVS5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlciA9IGcgPT09IHZvaWQgMDsKICAgICAgICB9OwogICAgICAgIGxldCBOciA9IG0uY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICB0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uKG8sIGcgPSAwLCBVID0gMCkgewogICAgICAgICAgICBCID0gbywgUDEgPSBnLCB5MSA9IFU7CiAgICAgICAgICAgIGxldCBEID0gITAsIEUgPSBudWxsLCAkID0gITEsIG5lID0gITE7CiAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICBsZXQgZGUgPSBoZS5nZXQobyk7CiAgICAgICAgICAgICAgICBpZiAoZGUuX191c2VEZWZhdWx0RnJhbWVidWZmZXIgIT09IHZvaWQgMCkgX2UuYmluZEZyYW1lYnVmZmVyKG0uRlJBTUVCVUZGRVIsIG51bGwpLCBEID0gITE7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHZvaWQgMCkgdS5zZXR1cFJlbmRlclRhcmdldChvKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlLl9faGFzRXh0ZXJuYWxUZXh0dXJlcykgdS5yZWJpbmRUZXh0dXJlcyhvLCBoZS5nZXQoby50ZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSwgaGUuZ2V0KG8uZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvLmRlcHRoQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHZlID0gby5kZXB0aFRleHR1cmU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlLl9fYm91bmREZXB0aFRleHR1cmUgIT09IHZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZSAhPT0gbnVsbCAmJiBoZS5oYXModmUpICYmIChvLndpZHRoICE9PSB2ZS5pbWFnZS53aWR0aCB8fCBvLmhlaWdodCAhPT0gdmUuaW1hZ2UuaGVpZ2h0KSkgdGhyb3cgbmV3IEVycm9yKCJXZWJHTFJlbmRlclRhcmdldDogQXR0YWNoZWQgRGVwdGhUZXh0dXJlIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvcnJlY3Qgc2l6ZS4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgdS5zZXR1cERlcHRoUmVuZGVyYnVmZmVyKG8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBBZSA9IG8udGV4dHVyZTsKICAgICAgICAgICAgICAgIChBZS5pc0RhdGEzRFRleHR1cmUgfHwgQWUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IEFlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkgJiYgKG5lID0gITApOwogICAgICAgICAgICAgICAgbGV0IFJlID0gaGUuZ2V0KG8pLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKICAgICAgICAgICAgICAgIG8uaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPyAoQXJyYXkuaXNBcnJheShSZVtnXSkgPyBFID0gUmVbZ11bVV0gOiBFID0gUmVbZ10sICQgPSAhMCkgOiBvLnNhbXBsZXMgPiAwICYmIHUudXNlTXVsdGlzYW1wbGVkUlRUKG8pID09PSAhMSA/IEUgPSBoZS5nZXQobykuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyIDogQXJyYXkuaXNBcnJheShSZSkgPyBFID0gUmVbVV0gOiBFID0gUmUsIEEuY29weShvLnZpZXdwb3J0KSwgcS5jb3B5KG8uc2Npc3NvciksIFYgPSBvLnNjaXNzb3JUZXN0OwogICAgICAgICAgICB9IGVsc2UgQS5jb3B5KExlKS5tdWx0aXBseVNjYWxhcihGKS5mbG9vcigpLCBxLmNvcHkoR2UpLm11bHRpcGx5U2NhbGFyKEYpLmZsb29yKCksIFYgPSBaZTsKICAgICAgICAgICAgaWYgKFUgIT09IDAgJiYgKEUgPSBOciksIF9lLmJpbmRGcmFtZWJ1ZmZlcihtLkZSQU1FQlVGRkVSLCBFKSAmJiBEICYmIF9lLmRyYXdCdWZmZXJzKG8sIEUpLCBfZS52aWV3cG9ydChBKSwgX2Uuc2Npc3NvcihxKSwgX2Uuc2V0U2Npc3NvclRlc3QoViksICQpIHsKICAgICAgICAgICAgICAgIGxldCBkZSA9IGhlLmdldChvLnRleHR1cmUpOwogICAgICAgICAgICAgICAgbS5mcmFtZWJ1ZmZlclRleHR1cmUyRChtLkZSQU1FQlVGRkVSLCBtLkNPTE9SX0FUVEFDSE1FTlQwLCBtLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGcsIGRlLl9fd2ViZ2xUZXh0dXJlLCBVKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChuZSkgewogICAgICAgICAgICAgICAgbGV0IGRlID0gaGUuZ2V0KG8udGV4dHVyZSksIEFlID0gZzsKICAgICAgICAgICAgICAgIG0uZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIobS5GUkFNRUJVRkZFUiwgbS5DT0xPUl9BVFRBQ0hNRU5UMCwgZGUuX193ZWJnbFRleHR1cmUsIFUsIEFlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvICE9PSBudWxsICYmIFUgIT09IDApIHsKICAgICAgICAgICAgICAgIGxldCBkZSA9IGhlLmdldChvLnRleHR1cmUpOwogICAgICAgICAgICAgICAgbS5mcmFtZWJ1ZmZlclRleHR1cmUyRChtLkZSQU1FQlVGRkVSLCBtLkNPTE9SX0FUVEFDSE1FTlQwLCBtLlRFWFRVUkVfMkQsIGRlLl9fd2ViZ2xUZXh0dXJlLCBVKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwID0gLTE7CiAgICAgICAgfSwgdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24obywgZywgVSwgRCwgRSwgJCwgbmUpIHsKICAgICAgICAgICAgaWYgKCEobyAmJiBvLmlzV2ViR0xSZW5kZXJUYXJnZXQpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHNlID0gaGUuZ2V0KG8pLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKICAgICAgICAgICAgaWYgKG8uaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgJiYgbmUgIT09IHZvaWQgMCAmJiAoc2UgPSBzZVtuZV0pLCBzZSkgewogICAgICAgICAgICAgICAgX2UuYmluZEZyYW1lYnVmZmVyKG0uRlJBTUVCVUZGRVIsIHNlKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRlID0gby50ZXh0dXJlLCBBZSA9IGRlLmZvcm1hdCwgUmUgPSBkZS50eXBlOwogICAgICAgICAgICAgICAgICAgIGlmICghd2UudGV4dHVyZUZvcm1hdFJlYWRhYmxlKEFlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdlLnRleHR1cmVUeXBlUmVhZGFibGUoUmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnID49IDAgJiYgZyA8PSBvLndpZHRoIC0gRCAmJiBVID49IDAgJiYgVSA8PSBvLmhlaWdodCAtIEUgJiYgbS5yZWFkUGl4ZWxzKGcsIFUsIEQsIEUsIGJlLmNvbnZlcnQoQWUpLCBiZS5jb252ZXJ0KFJlKSwgJCk7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHl7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRlID0gQiAhPT0gbnVsbCA/IGhlLmdldChCKS5fX3dlYmdsRnJhbWVidWZmZXIgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIF9lLmJpbmRGcmFtZWJ1ZmZlcihtLkZSQU1FQlVGRkVSLCBkZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYyA9IGFzeW5jIGZ1bmN0aW9uKG8sIGcsIFUsIEQsIEUsICQsIG5lKSB7CiAgICAgICAgICAgIGlmICghKG8gJiYgby5pc1dlYkdMUmVuZGVyVGFyZ2V0KSkgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7CiAgICAgICAgICAgIGxldCBzZSA9IGhlLmdldChvKS5fX3dlYmdsRnJhbWVidWZmZXI7CiAgICAgICAgICAgIGlmIChvLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICYmIG5lICE9PSB2b2lkIDAgJiYgKHNlID0gc2VbbmVdKSwgc2UpIHsKICAgICAgICAgICAgICAgIGxldCBkZSA9IG8udGV4dHVyZSwgQWUgPSBkZS5mb3JtYXQsIFJlID0gZGUudHlwZTsKICAgICAgICAgICAgICAgIGlmICghd2UudGV4dHVyZUZvcm1hdFJlYWRhYmxlKEFlKSkgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpOwogICAgICAgICAgICAgICAgaWYgKCF3ZS50ZXh0dXJlVHlwZVJlYWRhYmxlKFJlKSkgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTsKICAgICAgICAgICAgICAgIGlmIChnID49IDAgJiYgZyA8PSBvLndpZHRoIC0gRCAmJiBVID49IDAgJiYgVSA8PSBvLmhlaWdodCAtIEUpIHsKICAgICAgICAgICAgICAgICAgICBfZS5iaW5kRnJhbWVidWZmZXIobS5GUkFNRUJVRkZFUiwgc2UpOwogICAgICAgICAgICAgICAgICAgIGxldCB2ZSA9IG0uY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgbS5iaW5kQnVmZmVyKG0uUElYRUxfUEFDS19CVUZGRVIsIHZlKSwgbS5idWZmZXJEYXRhKG0uUElYRUxfUEFDS19CVUZGRVIsICQuYnl0ZUxlbmd0aCwgbS5TVFJFQU1fUkVBRCksIG0ucmVhZFBpeGVscyhnLCBVLCBELCBFLCBiZS5jb252ZXJ0KEFlKSwgYmUuY29udmVydChSZSksIDApOwogICAgICAgICAgICAgICAgICAgIGxldCBOZSA9IEIgIT09IG51bGwgPyBoZS5nZXQoQikuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICBfZS5iaW5kRnJhbWVidWZmZXIobS5GUkFNRUJVRkZFUiwgTmUpOwogICAgICAgICAgICAgICAgICAgIGxldCBIZSA9IG0uZmVuY2VTeW5jKG0uU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmZsdXNoKCksIGF3YWl0IHpmKG0sIEhlLCA0KSwgbS5iaW5kQnVmZmVyKG0uUElYRUxfUEFDS19CVUZGRVIsIHZlKSwgbS5nZXRCdWZmZXJTdWJEYXRhKG0uUElYRUxfUEFDS19CVUZGRVIsIDAsICQpLCBtLmRlbGV0ZUJ1ZmZlcih2ZSksIG0uZGVsZXRlU3luYyhIZSksICQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVxdWVzdGVkIHJlYWQgYm91bmRzIGFyZSBvdXQgb2YgcmFuZ2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSA9IGZ1bmN0aW9uKG8sIGcgPSBudWxsLCBVID0gMCkgewogICAgICAgICAgICBvLmlzVGV4dHVyZSAhPT0gITAgJiYgKENmKCJXZWJHTFJlbmRlcmVyOiBjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkLiIpLCBnID0gYXJndW1lbnRzWzBdIHx8IG51bGwsIG8gPSBhcmd1bWVudHNbMV0pOwogICAgICAgICAgICBsZXQgRCA9IE1hdGgucG93KDIsIC1VKSwgRSA9IE1hdGguZmxvb3Ioby5pbWFnZS53aWR0aCAqIEQpLCAkID0gTWF0aC5mbG9vcihvLmltYWdlLmhlaWdodCAqIEQpLCBuZSA9IGcgIT09IG51bGwgPyBnLnggOiAwLCBzZSA9IGcgIT09IG51bGwgPyBnLnkgOiAwOwogICAgICAgICAgICB1LnNldFRleHR1cmUyRChvLCAwKSwgbS5jb3B5VGV4U3ViSW1hZ2UyRChtLlRFWFRVUkVfMkQsIFUsIDAsIDAsIG5lLCBzZSwgRSwgJCksIF9lLnVuYmluZFRleHR1cmUoKTsKICAgICAgICB9OwogICAgICAgIGxldCBPciA9IG0uY3JlYXRlRnJhbWVidWZmZXIoKSwgRnIgPSBtLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZSA9IGZ1bmN0aW9uKG8sIGcsIFUgPSBudWxsLCBEID0gbnVsbCwgRSA9IDAsICQgPSBudWxsKSB7CiAgICAgICAgICAgIG8uaXNUZXh0dXJlICE9PSAhMCAmJiAoQ2YoIldlYkdMUmVuZGVyZXI6IGNvcHlUZXh0dXJlVG9UZXh0dXJlIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZC4iKSwgRCA9IGFyZ3VtZW50c1swXSB8fCBudWxsLCBvID0gYXJndW1lbnRzWzFdLCBnID0gYXJndW1lbnRzWzJdLCAkID0gYXJndW1lbnRzWzNdIHx8IDAsIFUgPSBudWxsKSwgJCA9PT0gbnVsbCAmJiAoRSAhPT0gMCA/IChDZigiV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkIHRvIHN1cHBvcnQgc3JjIGFuZCBkc3QgbWlwbWFwIGxldmVscy4iKSwgJCA9IEUsIEUgPSAwKSA6ICQgPSAwKTsKICAgICAgICAgICAgbGV0IG5lLCBzZSwgZGUsIEFlLCBSZSwgdmUsIE5lLCBIZSwgZXQsIEplID0gby5pc0NvbXByZXNzZWRUZXh0dXJlID8gby5taXBtYXBzWyRdIDogby5pbWFnZTsKICAgICAgICAgICAgaWYgKFUgIT09IG51bGwpIG5lID0gVS5tYXgueCAtIFUubWluLngsIHNlID0gVS5tYXgueSAtIFUubWluLnksIGRlID0gVS5pc0JveDMgPyBVLm1heC56IC0gVS5taW4ueiA6IDEsIEFlID0gVS5taW4ueCwgUmUgPSBVLm1pbi55LCB2ZSA9IFUuaXNCb3gzID8gVS5taW4ueiA6IDA7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IGh0ID0gTWF0aC5wb3coMiwgLUUpOwogICAgICAgICAgICAgICAgbmUgPSBNYXRoLmZsb29yKEplLndpZHRoICogaHQpLCBzZSA9IE1hdGguZmxvb3IoSmUuaGVpZ2h0ICogaHQpLCBvLmlzRGF0YUFycmF5VGV4dHVyZSA/IGRlID0gSmUuZGVwdGggOiBvLmlzRGF0YTNEVGV4dHVyZSA/IGRlID0gTWF0aC5mbG9vcihKZS5kZXB0aCAqIGh0KSA6IGRlID0gMSwgQWUgPSAwLCBSZSA9IDAsIHZlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBEICE9PSBudWxsID8gKE5lID0gRC54LCBIZSA9IEQueSwgZXQgPSBELnopIDogKE5lID0gMCwgSGUgPSAwLCBldCA9IDApOwogICAgICAgICAgICBsZXQgT2UgPSBiZS5jb252ZXJ0KGcuZm9ybWF0KSwgZ2UgPSBiZS5jb252ZXJ0KGcudHlwZSksIHJ0OwogICAgICAgICAgICBnLmlzRGF0YTNEVGV4dHVyZSA/ICh1LnNldFRleHR1cmUzRChnLCAwKSwgcnQgPSBtLlRFWFRVUkVfM0QpIDogZy5pc0RhdGFBcnJheVRleHR1cmUgfHwgZy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPyAodS5zZXRUZXh0dXJlMkRBcnJheShnLCAwKSwgcnQgPSBtLlRFWFRVUkVfMkRfQVJSQVkpIDogKHUuc2V0VGV4dHVyZTJEKGcsIDApLCBydCA9IG0uVEVYVFVSRV8yRCksIG0ucGl4ZWxTdG9yZWkobS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCBnLmZsaXBZKSwgbS5waXhlbFN0b3JlaShtLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgZy5wcmVtdWx0aXBseUFscGhhKSwgbS5waXhlbFN0b3JlaShtLlVOUEFDS19BTElHTk1FTlQsIGcudW5wYWNrQWxpZ25tZW50KTsKICAgICAgICAgICAgbGV0IFZlID0gbS5nZXRQYXJhbWV0ZXIobS5VTlBBQ0tfUk9XX0xFTkdUSCksIHZ0ID0gbS5nZXRQYXJhbWV0ZXIobS5VTlBBQ0tfSU1BR0VfSEVJR0hUKSwgTnQgPSBtLmdldFBhcmFtZXRlcihtLlVOUEFDS19TS0lQX1BJWEVMUyksIGR0ID0gbS5nZXRQYXJhbWV0ZXIobS5VTlBBQ0tfU0tJUF9ST1dTKSwgWXQgPSBtLmdldFBhcmFtZXRlcihtLlVOUEFDS19TS0lQX0lNQUdFUyk7CiAgICAgICAgICAgIG0ucGl4ZWxTdG9yZWkobS5VTlBBQ0tfUk9XX0xFTkdUSCwgSmUud2lkdGgpLCBtLnBpeGVsU3RvcmVpKG0uVU5QQUNLX0lNQUdFX0hFSUdIVCwgSmUuaGVpZ2h0KSwgbS5waXhlbFN0b3JlaShtLlVOUEFDS19TS0lQX1BJWEVMUywgQWUpLCBtLnBpeGVsU3RvcmVpKG0uVU5QQUNLX1NLSVBfUk9XUywgUmUpLCBtLnBpeGVsU3RvcmVpKG0uVU5QQUNLX1NLSVBfSU1BR0VTLCB2ZSk7CiAgICAgICAgICAgIGxldCBxZSA9IG8uaXNEYXRhQXJyYXlUZXh0dXJlIHx8IG8uaXNEYXRhM0RUZXh0dXJlLCBwdCA9IGcuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGcuaXNEYXRhM0RUZXh0dXJlOwogICAgICAgICAgICBpZiAoby5pc0RlcHRoVGV4dHVyZSkgewogICAgICAgICAgICAgICAgbGV0IGh0ID0gaGUuZ2V0KG8pLCBvdCA9IGhlLmdldChnKSwgc3QgPSBoZS5nZXQoaHQuX19yZW5kZXJUYXJnZXQpLCBFbiA9IGhlLmdldChvdC5fX3JlbmRlclRhcmdldCk7CiAgICAgICAgICAgICAgICBfZS5iaW5kRnJhbWVidWZmZXIobS5SRUFEX0ZSQU1FQlVGRkVSLCBzdC5fX3dlYmdsRnJhbWVidWZmZXIpLCBfZS5iaW5kRnJhbWVidWZmZXIobS5EUkFXX0ZSQU1FQlVGRkVSLCBFbi5fX3dlYmdsRnJhbWVidWZmZXIpOwogICAgICAgICAgICAgICAgZm9yKGxldCBDdCA9IDA7IEN0IDwgZGU7IEN0KyspcWUgJiYgKG0uZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIobS5SRUFEX0ZSQU1FQlVGRkVSLCBtLkNPTE9SX0FUVEFDSE1FTlQwLCBoZS5nZXQobykuX193ZWJnbFRleHR1cmUsIEUsIHZlICsgQ3QpLCBtLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKG0uRFJBV19GUkFNRUJVRkZFUiwgbS5DT0xPUl9BVFRBQ0hNRU5UMCwgaGUuZ2V0KGcpLl9fd2ViZ2xUZXh0dXJlLCAkLCBldCArIEN0KSksIG0uYmxpdEZyYW1lYnVmZmVyKEFlLCBSZSwgbmUsIHNlLCBOZSwgSGUsIG5lLCBzZSwgbS5ERVBUSF9CVUZGRVJfQklULCBtLk5FQVJFU1QpOwogICAgICAgICAgICAgICAgX2UuYmluZEZyYW1lYnVmZmVyKG0uUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCksIF9lLmJpbmRGcmFtZWJ1ZmZlcihtLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICB9IGVsc2UgaWYgKEUgIT09IDAgfHwgby5pc1JlbmRlclRhcmdldFRleHR1cmUgfHwgaGUuaGFzKG8pKSB7CiAgICAgICAgICAgICAgICBsZXQgaHQgPSBoZS5nZXQobyksIG90ID0gaGUuZ2V0KGcpOwogICAgICAgICAgICAgICAgX2UuYmluZEZyYW1lYnVmZmVyKG0uUkVBRF9GUkFNRUJVRkZFUiwgT3IpLCBfZS5iaW5kRnJhbWVidWZmZXIobS5EUkFXX0ZSQU1FQlVGRkVSLCBGcik7CiAgICAgICAgICAgICAgICBmb3IobGV0IHN0ID0gMDsgc3QgPCBkZTsgc3QrKylxZSA/IG0uZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIobS5SRUFEX0ZSQU1FQlVGRkVSLCBtLkNPTE9SX0FUVEFDSE1FTlQwLCBodC5fX3dlYmdsVGV4dHVyZSwgRSwgdmUgKyBzdCkgOiBtLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG0uUkVBRF9GUkFNRUJVRkZFUiwgbS5DT0xPUl9BVFRBQ0hNRU5UMCwgbS5URVhUVVJFXzJELCBodC5fX3dlYmdsVGV4dHVyZSwgRSksIHB0ID8gbS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihtLkRSQVdfRlJBTUVCVUZGRVIsIG0uQ09MT1JfQVRUQUNITUVOVDAsIG90Ll9fd2ViZ2xUZXh0dXJlLCAkLCBldCArIHN0KSA6IG0uZnJhbWVidWZmZXJUZXh0dXJlMkQobS5EUkFXX0ZSQU1FQlVGRkVSLCBtLkNPTE9SX0FUVEFDSE1FTlQwLCBtLlRFWFRVUkVfMkQsIG90Ll9fd2ViZ2xUZXh0dXJlLCAkKSwgRSAhPT0gMCA/IG0uYmxpdEZyYW1lYnVmZmVyKEFlLCBSZSwgbmUsIHNlLCBOZSwgSGUsIG5lLCBzZSwgbS5DT0xPUl9CVUZGRVJfQklULCBtLk5FQVJFU1QpIDogcHQgPyBtLmNvcHlUZXhTdWJJbWFnZTNEKHJ0LCAkLCBOZSwgSGUsIGV0ICsgc3QsIEFlLCBSZSwgbmUsIHNlKSA6IG0uY29weVRleFN1YkltYWdlMkQocnQsICQsIE5lLCBIZSwgQWUsIFJlLCBuZSwgc2UpOwogICAgICAgICAgICAgICAgX2UuYmluZEZyYW1lYnVmZmVyKG0uUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCksIF9lLmJpbmRGcmFtZWJ1ZmZlcihtLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICB9IGVsc2UgcHQgPyBvLmlzRGF0YVRleHR1cmUgfHwgby5pc0RhdGEzRFRleHR1cmUgPyBtLnRleFN1YkltYWdlM0QocnQsICQsIE5lLCBIZSwgZXQsIG5lLCBzZSwgZGUsIE9lLCBnZSwgSmUuZGF0YSkgOiBnLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA/IG0uY29tcHJlc3NlZFRleFN1YkltYWdlM0QocnQsICQsIE5lLCBIZSwgZXQsIG5lLCBzZSwgZGUsIE9lLCBKZS5kYXRhKSA6IG0udGV4U3ViSW1hZ2UzRChydCwgJCwgTmUsIEhlLCBldCwgbmUsIHNlLCBkZSwgT2UsIGdlLCBKZSkgOiBvLmlzRGF0YVRleHR1cmUgPyBtLnRleFN1YkltYWdlMkQobS5URVhUVVJFXzJELCAkLCBOZSwgSGUsIG5lLCBzZSwgT2UsIGdlLCBKZS5kYXRhKSA6IG8uaXNDb21wcmVzc2VkVGV4dHVyZSA/IG0uY29tcHJlc3NlZFRleFN1YkltYWdlMkQobS5URVhUVVJFXzJELCAkLCBOZSwgSGUsIEplLndpZHRoLCBKZS5oZWlnaHQsIE9lLCBKZS5kYXRhKSA6IG0udGV4U3ViSW1hZ2UyRChtLlRFWFRVUkVfMkQsICQsIE5lLCBIZSwgbmUsIHNlLCBPZSwgZ2UsIEplKTsKICAgICAgICAgICAgbS5waXhlbFN0b3JlaShtLlVOUEFDS19ST1dfTEVOR1RILCBWZSksIG0ucGl4ZWxTdG9yZWkobS5VTlBBQ0tfSU1BR0VfSEVJR0hULCB2dCksIG0ucGl4ZWxTdG9yZWkobS5VTlBBQ0tfU0tJUF9QSVhFTFMsIE50KSwgbS5waXhlbFN0b3JlaShtLlVOUEFDS19TS0lQX1JPV1MsIGR0KSwgbS5waXhlbFN0b3JlaShtLlVOUEFDS19TS0lQX0lNQUdFUywgWXQpLCAkID09PSAwICYmIGcuZ2VuZXJhdGVNaXBtYXBzICYmIG0uZ2VuZXJhdGVNaXBtYXAocnQpLCBfZS51bmJpbmRUZXh0dXJlKCk7CiAgICAgICAgfSwgdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEID0gZnVuY3Rpb24obywgZywgVSA9IG51bGwsIEQgPSBudWxsLCBFID0gMCkgewogICAgICAgICAgICByZXR1cm4gby5pc1RleHR1cmUgIT09ICEwICYmIChDZigiV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUzRCBmdW5jdGlvbiBzaWduYXR1cmUgaGFzIGNoYW5nZWQuIiksIFUgPSBhcmd1bWVudHNbMF0gfHwgbnVsbCwgRCA9IGFyZ3VtZW50c1sxXSB8fCBudWxsLCBvID0gYXJndW1lbnRzWzJdLCBnID0gYXJndW1lbnRzWzNdLCBFID0gYXJndW1lbnRzWzRdIHx8IDApLCBDZignV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUzRCBmdW5jdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgImNvcHlUZXh0dXJlVG9UZXh0dXJlIiBpbnN0ZWFkLicpLCB0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlKG8sIGcsIFUsIEQsIEUpOwogICAgICAgIH0sIHRoaXMuaW5pdFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgaGUuZ2V0KG8pLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdm9pZCAwICYmIHUuc2V0dXBSZW5kZXJUYXJnZXQobyk7CiAgICAgICAgfSwgdGhpcy5pbml0VGV4dHVyZSA9IGZ1bmN0aW9uKG8pIHsKICAgICAgICAgICAgby5pc0N1YmVUZXh0dXJlID8gdS5zZXRUZXh0dXJlQ3ViZShvLCAwKSA6IG8uaXNEYXRhM0RUZXh0dXJlID8gdS5zZXRUZXh0dXJlM0QobywgMCkgOiBvLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBvLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA/IHUuc2V0VGV4dHVyZTJEQXJyYXkobywgMCkgOiB1LnNldFRleHR1cmUyRChvLCAwKSwgX2UudW5iaW5kVGV4dHVyZSgpOwogICAgICAgIH0sIHRoaXMucmVzZXRTdGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBQMSA9IDAsIHkxID0gMCwgQiA9IG51bGwsIF9lLnJlc2V0KCksIHplLnJlc2V0KCk7CiAgICAgICAgfSwgdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyA8ICJ1IiAmJiBfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLCB7CiAgICAgICAgICAgIGRldGFpbDogdGhpcwogICAgICAgIH0pKTsKICAgIH0KICAgIGdldCBjb29yZGluYXRlU3lzdGVtKCkgewogICAgICAgIHJldHVybiBvZTsKICAgIH0KICAgIGdldCBvdXRwdXRDb2xvclNwYWNlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9vdXRwdXRDb2xvclNwYWNlOwogICAgfQogICAgc2V0IG91dHB1dENvbG9yU3BhY2UobikgewogICAgICAgIHRoaXMuX291dHB1dENvbG9yU3BhY2UgPSBuOwogICAgICAgIGxldCB0ID0gdGhpcy5nZXRDb250ZXh0KCk7CiAgICAgICAgdC5kcmF3aW5nQnVmZmVyQ29sb3JzcGFjZSA9IFR0Ll9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZShuKSwgdC51bnBhY2tDb2xvclNwYWNlID0gVHQuX2dldFVucGFja0NvbG9yU3BhY2UoKTsKICAgIH0KfTsKY29uc3QgbW9kID0gewogICAgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOiBGcCwKICAgIEFkZEVxdWF0aW9uOiBpYSwKICAgIEFkZE9wZXJhdGlvbjogU3AsCiAgICBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTogQ2wsCiAgICBBZGRpdGl2ZUJsZW5kaW5nOiAkZCwKICAgIEFnWFRvbmVNYXBwaW5nOiBFcCwKICAgIEFscGhhRm9ybWF0OiByYywKICAgIEFsd2F5c0NvbXBhcmU6IGZmLAogICAgQWx3YXlzRGVwdGg6IHhwLAogICAgQWx3YXlzU3RlbmNpbEZ1bmM6IGNhLAogICAgQW1iaWVudExpZ2h0OiBUbywKICAgIEFuaW1hdGlvbkFjdGlvbjogTm8sCiAgICBBbmltYXRpb25DbGlwOiB3aSwKICAgIEFuaW1hdGlvbkxvYWRlcjogbWgsCiAgICBBbmltYXRpb25NaXhlcjogRGgsCiAgICBBbmltYXRpb25PYmplY3RHcm91cDogVmgsCiAgICBBbmltYXRpb25VdGlsczogUGYsCiAgICBBcmNDdXJ2ZToga3IsCiAgICBBcnJheUNhbWVyYTogQmgsCiAgICBBcnJvd0hlbHBlcjogYmwsCiAgICBBdHRhY2hlZEJpbmRNb2RlOiBvYSwKICAgIEF1ZGlvOiBrbywKICAgIEF1ZGlvQW5hbHlzZXI6IE5oLAogICAgQXVkaW9Db250ZXh0OiBfbiwKICAgIEF1ZGlvTGlzdGVuZXI6IGtoLAogICAgQXVkaW9Mb2FkZXI6IEloLAogICAgQXhlc0hlbHBlcjogd2wsCiAgICBCYWNrU2lkZTogQWwsCiAgICBCYXNpY0RlcHRoUGFja2luZzogSmMsCiAgICBCYXNpY1NoYWRvd01hcDogR2QsCiAgICBCYXRjaGVkTWVzaDogenIsCiAgICBCb25lOiBlbiwKICAgIEJvb2xlYW5LZXlmcmFtZVRyYWNrOiB2ZSwKICAgIEJveDI6IEtoLAogICAgQm94MzogZnQsCiAgICBCb3gzSGVscGVyOiB5bCwKICAgIEJveEdlb21ldHJ5OiBLcywKICAgIEJveEhlbHBlcjogbWwsCiAgICBCdWZmZXJBdHRyaWJ1dGU6IFosCiAgICBCdWZmZXJHZW9tZXRyeTogTCwKICAgIEJ1ZmZlckdlb21ldHJ5TG9hZGVyOiBFbywKICAgIEJ5dGVUeXBlOiAkbCwKICAgIENhY2hlOiB3ZSwKICAgIENhbWVyYTogR2ksCiAgICBDYW1lcmFIZWxwZXI6IGZsLAogICAgQ2FudmFzVGV4dHVyZTogYWgsCiAgICBDYXBzdWxlR2VvbWV0cnk6IERyLAogICAgQ2F0bXVsbFJvbUN1cnZlMzogUHIsCiAgICBDaW5lb25Ub25lTWFwcGluZzogenAsCiAgICBDaXJjbGVHZW9tZXRyeTogTHIsCiAgICBDbGFtcFRvRWRnZVdyYXBwaW5nOiBIdCwKICAgIENsb2NrOiBSbywKICAgIENvbG9yOiBQLAogICAgQ29sb3JLZXlmcmFtZVRyYWNrOiB4biwKICAgIENvbG9yTWFuYWdlbWVudDogVHQsCiAgICBDb21wcmVzc2VkQXJyYXlUZXh0dXJlOiByaCwKICAgIENvbXByZXNzZWRDdWJlVGV4dHVyZTogb2gsCiAgICBDb21wcmVzc2VkVGV4dHVyZTogWmksCiAgICBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcjogeWgsCiAgICBDb25lR2VvbWV0cnk6IFVyLAogICAgQ29uc3RhbnRBbHBoYUZhY3RvcjogbXAsCiAgICBDb25zdGFudENvbG9yRmFjdG9yOiBwcCwKICAgIENvbnRyb2xzOiBfbCwKICAgIEN1YmVDYW1lcmE6IGJyLAogICAgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBVbywKICAgIEN1YmVSZWZyYWN0aW9uTWFwcGluZzogSGwsCiAgICBDdWJlVGV4dHVyZTogWGksCiAgICBDdWJlVGV4dHVyZUxvYWRlcjogZ2gsCiAgICBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogWGwsCiAgICBDdWJpY0JlemllckN1cnZlOiBhbiwKICAgIEN1YmljQmV6aWVyQ3VydmUzOiBPciwKICAgIEN1YmljSW50ZXJwb2xhbnQ6IG1vLAogICAgQ3VsbEZhY2VCYWNrOiBXZCwKICAgIEN1bGxGYWNlRnJvbnQ6IEhkLAogICAgQ3VsbEZhY2VGcm9udEJhY2s6IHFkLAogICAgQ3VsbEZhY2VOb25lOiBVZCwKICAgIEN1cnZlOiBSdCwKICAgIEN1cnZlUGF0aDogVnIsCiAgICBDdXN0b21CbGVuZGluZzogS2QsCiAgICBDdXN0b21Ub25lTWFwcGluZzogQnAsCiAgICBDeWxpbmRlckdlb21ldHJ5OiAkaSwKICAgIEN5bGluZHJpY2FsOiAkaCwKICAgIERhdGEzRFRleHR1cmU6IFFzLAogICAgRGF0YUFycmF5VGV4dHVyZTogJHMsCiAgICBEYXRhVGV4dHVyZTogTHQsCiAgICBEYXRhVGV4dHVyZUxvYWRlcjogeGgsCiAgICBEYXRhVXRpbHM6IEVmLAogICAgRGVjcmVtZW50U3RlbmNpbE9wOiBZcCwKICAgIERlY3JlbWVudFdyYXBTdGVuY2lsT3A6IFFwLAogICAgRGVmYXVsdExvYWRpbmdNYW5hZ2VyOiBiZCwKICAgIERlcHRoRm9ybWF0OiBDbiwKICAgIERlcHRoU3RlbmNpbEZvcm1hdDogYWEsCiAgICBEZXB0aFRleHR1cmU6IGhoLAogICAgRGV0YWNoZWRCaW5kTW9kZTogV2wsCiAgICBEaXJlY3Rpb25hbExpZ2h0OiBTbywKICAgIERpcmVjdGlvbmFsTGlnaHRIZWxwZXI6IHBsLAogICAgRGlzY3JldGVJbnRlcnBvbGFudDogeW8sCiAgICBEb2RlY2FoZWRyb25HZW9tZXRyeTogV3IsCiAgICBEb3VibGVTaWRlOiBZZCwKICAgIERzdEFscGhhRmFjdG9yOiBocCwKICAgIERzdENvbG9yRmFjdG9yOiBjcCwKICAgIER5bmFtaWNDb3B5VXNhZ2U6IE1mLAogICAgRHluYW1pY0RyYXdVc2FnZTogbWYsCiAgICBEeW5hbWljUmVhZFVzYWdlOiB4ZiwKICAgIEVkZ2VzR2VvbWV0cnk6IEhyLAogICAgRWxsaXBzZUN1cnZlOiBZaSwKICAgIEVxdWFsQ29tcGFyZTogbGYsCiAgICBFcXVhbERlcHRoOiB3cCwKICAgIEVxdWFsU3RlbmNpbEZ1bmM6IGVmLAogICAgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IHFsLAogICAgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEdsLAogICAgRXVsZXI6IFh0LAogICAgRXZlbnREaXNwYXRjaGVyOiBxdCwKICAgIEV4dHJ1ZGVHZW9tZXRyeTogWHIsCiAgICBGaWxlTG9hZGVyOiBKdCwKICAgIEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6IEJhLAogICAgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTogRSwKICAgIEZsb2F0VHlwZTogcGksCiAgICBGb2c6IE1yLAogICAgRm9nRXhwMjogd3IsCiAgICBGcmFtZWJ1ZmZlclRleHR1cmU6IG5oLAogICAgRnJvbnRTaWRlOiBkciwKICAgIEZydXN0dW06IHNuLAogICAgR0xCdWZmZXJBdHRyaWJ1dGU6IEdoLAogICAgR0xTTDE6IHZmLAogICAgR0xTTDM6IEFmLAogICAgR3JlYXRlckNvbXBhcmU6IHVmLAogICAgR3JlYXRlckRlcHRoOiBfcCwKICAgIEdyZWF0ZXJFcXVhbENvbXBhcmU6IHBmLAogICAgR3JlYXRlckVxdWFsRGVwdGg6IE1wLAogICAgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6IG9mLAogICAgR3JlYXRlclN0ZW5jaWxGdW5jOiBuZiwKICAgIEdyaWRIZWxwZXI6IGxsLAogICAgR3JvdXA6IE5lLAogICAgSGFsZkZsb2F0VHlwZTogdGMsCiAgICBIZW1pc3BoZXJlTGlnaHQ6IGJvLAogICAgSGVtaXNwaGVyZUxpZ2h0SGVscGVyOiBobCwKICAgIEljb3NhaGVkcm9uR2VvbWV0cnk6IEpyLAogICAgSW1hZ2VCaXRtYXBMb2FkZXI6IFRoLAogICAgSW1hZ2VMb2FkZXI6IE1pLAogICAgSW1hZ2VVdGlsczogeXIsCiAgICBJbmNyZW1lbnRTdGVuY2lsT3A6IFpwLAogICAgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDogJHAsCiAgICBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IFVlLAogICAgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6IEJvLAogICAgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHFoLAogICAgSW5zdGFuY2VkTWVzaDogSXIsCiAgICBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTogemEsCiAgICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTogRmEsCiAgICBJbnQ4QnVmZmVyQXR0cmlidXRlOiBUYSwKICAgIEludFR5cGU6IEtsLAogICAgSW50ZXJsZWF2ZWRCdWZmZXI6IEppLAogICAgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IGZpLAogICAgSW50ZXJwb2xhbnQ6IHlpLAogICAgSW50ZXJwb2xhdGVEaXNjcmV0ZTogR3MsCiAgICBJbnRlcnBvbGF0ZUxpbmVhcjogbXIsCiAgICBJbnRlcnBvbGF0ZVNtb290aDogem4sCiAgICBJbnZlcnRTdGVuY2lsT3A6IGpwLAogICAgS2VlcFN0ZW5jaWxPcDogcWUsCiAgICBLZXlmcmFtZVRyYWNrOiBrdCwKICAgIExPRDogQXIsCiAgICBMYXRoZUdlb21ldHJ5OiBwbiwKICAgIExheWVyczoganMsCiAgICBMZXNzQ29tcGFyZTogaGYsCiAgICBMZXNzRGVwdGg6IGJwLAogICAgTGVzc0VxdWFsQ29tcGFyZTogY2YsCiAgICBMZXNzRXF1YWxEZXB0aDogcmEsCiAgICBMZXNzRXF1YWxTdGVuY2lsRnVuYzogc2YsCiAgICBMZXNzU3RlbmNpbEZ1bmM6IHRmLAogICAgTGlnaHQ6IGNlLAogICAgTGlnaHRQcm9iZTogem8sCiAgICBMaW5lOiBsZSwKICAgIExpbmUzOiBlbCwKICAgIExpbmVCYXNpY01hdGVyaWFsOiBtdCwKICAgIExpbmVDdXJ2ZTogaG4sCiAgICBMaW5lQ3VydmUzOiBOciwKICAgIExpbmVEYXNoZWRNYXRlcmlhbDogcG8sCiAgICBMaW5lTG9vcDogRnIsCiAgICBMaW5lU2VnbWVudHM6IFd0LAogICAgTGluZWFyRmlsdGVyOiBFdCwKICAgIExpbmVhckludGVycG9sYW50OiBnbiwKICAgIExpbmVhck1pcE1hcExpbmVhckZpbHRlcjogTnAsCiAgICBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBPcCwKICAgIExpbmVhck1pcG1hcExpbmVhckZpbHRlcjogdm4sCiAgICBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOiBZbCwKICAgIExpbmVhclNSR0JDb2xvclNwYWNlOiBoYSwKICAgIExpbmVhclRvbmVNYXBwaW5nOiBJcCwKICAgIExpbmVhclRyYW5zZmVyOiBsYSwKICAgIExvYWRlcjogd3QsCiAgICBMb2FkZXJVdGlsczogTW4sCiAgICBMb2FkaW5nTWFuYWdlcjogYm4sCiAgICBMb29wT25jZTogcWMsCiAgICBMb29wUGluZ1Bvbmc6IFhjLAogICAgTG9vcFJlcGVhdDogR2MsCiAgICBMdW1pbmFuY2VBbHBoYUZvcm1hdDogaGMsCiAgICBMdW1pbmFuY2VGb3JtYXQ6IGFjLAogICAgTU9VU0U6IERkLAogICAgTWF0ZXJpYWw6IGN0LAogICAgTWF0ZXJpYWxMb2FkZXI6IEZvLAogICAgTWF0aFV0aWxzOiBUZiwKICAgIE1hdHJpeDI6IFFoLAogICAgTWF0cml4MzogR3QsCiAgICBNYXRyaXg0OiBELAogICAgTWF4RXF1YXRpb246IHNwLAogICAgTWVzaDogQ3QsCiAgICBNZXNoQmFzaWNNYXRlcmlhbDogX2UsCiAgICBNZXNoRGVwdGhNYXRlcmlhbDogbG8sCiAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbDogY28sCiAgICBNZXNoTGFtYmVydE1hdGVyaWFsOiBobywKICAgIE1lc2hNYXRjYXBNYXRlcmlhbDogdW8sCiAgICBNZXNoTm9ybWFsTWF0ZXJpYWw6IGFvLAogICAgTWVzaFBob25nTWF0ZXJpYWw6IHJvLAogICAgTWVzaFBoeXNpY2FsTWF0ZXJpYWw6IG5vLAogICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWw6IHluLAogICAgTWVzaFRvb25NYXRlcmlhbDogb28sCiAgICBNaW5FcXVhdGlvbjogaXAsCiAgICBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBmciwKICAgIE1peE9wZXJhdGlvbjogQXAsCiAgICBNdWx0aXBseUJsZW5kaW5nOiBqZCwKICAgIE11bHRpcGx5T3BlcmF0aW9uOiBEbywKICAgIE5lYXJlc3RGaWx0ZXI6IFV0LAogICAgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjogUHAsCiAgICBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjoga3AsCiAgICBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiBabCwKICAgIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiBKbCwKICAgIE5ldXRyYWxUb25lTWFwcGluZzogUnAsCiAgICBOZXZlckNvbXBhcmU6IGFmLAogICAgTmV2ZXJEZXB0aDogZ3AsCiAgICBOZXZlclN0ZW5jaWxGdW5jOiBLcCwKICAgIE5vQmxlbmRpbmc6IFVsLAogICAgTm9Db2xvclNwYWNlOiB6bCwKICAgIE5vVG9uZU1hcHBpbmc6IFRwLAogICAgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOiBIbywKICAgIE5vcm1hbEJsZW5kaW5nOiBlYSwKICAgIE5vdEVxdWFsQ29tcGFyZTogZGYsCiAgICBOb3RFcXVhbERlcHRoOiB2cCwKICAgIE5vdEVxdWFsU3RlbmNpbEZ1bmM6IHJmLAogICAgTnVtYmVyS2V5ZnJhbWVUcmFjazogZ2ksCiAgICBPYmplY3QzRDogRywKICAgIE9iamVjdExvYWRlcjogdmgsCiAgICBPYmplY3RTcGFjZU5vcm1hbE1hcDogR3AsCiAgICBPY3RhaGVkcm9uR2VvbWV0cnk6IGZuLAogICAgT25lRmFjdG9yOiBycCwKICAgIE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvcjogeXAsCiAgICBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3I6IGZwLAogICAgT25lTWludXNEc3RBbHBoYUZhY3RvcjogbHAsCiAgICBPbmVNaW51c0RzdENvbG9yRmFjdG9yOiB1cCwKICAgIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I6IG5hLAogICAgT25lTWludXNTcmNDb2xvckZhY3RvcjogYXAsCiAgICBPcnRob2dyYXBoaWNDYW1lcmE6IHduLAogICAgUENGU2hhZG93TWFwOiBYZCwKICAgIFBDRlNvZnRTaGFkb3dNYXA6IEpkLAogICAgUE1SRU1HZW5lcmF0b3I6IGhuMSwKICAgIFBhdGg6IG1pLAogICAgUGVyc3BlY3RpdmVDYW1lcmE6IHZ0LAogICAgUGxhbmU6IHhlLAogICAgUGxhbmVHZW9tZXRyeTogWnIsCiAgICBQbGFuZUhlbHBlcjogZ2wsCiAgICBQb2ludExpZ2h0OiB2bywKICAgIFBvaW50TGlnaHRIZWxwZXI6IHJsLAogICAgUG9pbnRzOiBFciwKICAgIFBvaW50c01hdGVyaWFsOiBvbiwKICAgIFBvbGFyR3JpZEhlbHBlcjogY2wsCiAgICBQb2x5aGVkcm9uR2VvbWV0cnk6IFdlLAogICAgUG9zaXRpb25hbEF1ZGlvOiBPaCwKICAgIFByb3BlcnR5QmluZGluZzogSiwKICAgIFByb3BlcnR5TWl4ZXI6IFBvLAogICAgUXVhZHJhdGljQmV6aWVyQ3VydmU6IGxuLAogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUzOiBjbiwKICAgIFF1YXRlcm5pb246IGJ0LAogICAgUXVhdGVybmlvbktleWZyYW1lVHJhY2s6IHhpLAogICAgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50OiBnbywKICAgIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6IFdjLAogICAgUkVEX1JHVEMxX0Zvcm1hdDogTGMsCiAgICBSRVZJU0lPTjogdmwsCiAgICBSR0JBRGVwdGhQYWNraW5nOiBXcCwKICAgIFJHQkFGb3JtYXQ6IExpLAogICAgUkdCQUludGVnZXJGb3JtYXQ6IHVjLAogICAgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdDoga2MsCiAgICBSR0JBX0FTVENfMTB4NV9Gb3JtYXQ6IEJjLAogICAgUkdCQV9BU1RDXzEweDZfRm9ybWF0OiBFYywKICAgIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdDogUmMsCiAgICBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0OiBQYywKICAgIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ6IE9jLAogICAgUkdCQV9BU1RDXzR4NF9Gb3JtYXQ6IHZjLAogICAgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6IEFjLAogICAgUkdCQV9BU1RDXzV4NV9Gb3JtYXQ6IFNjLAogICAgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQ6IFRjLAogICAgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6IEljLAogICAgUkdCQV9BU1RDXzh4NV9Gb3JtYXQ6IENjLAogICAgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQ6IHpjLAogICAgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6IEZjLAogICAgUkdCQV9CUFRDX0Zvcm1hdDogTmMsCiAgICBSR0JBX0VUQzJfRUFDX0Zvcm1hdDogX2MsCiAgICBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6IGJjLAogICAgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0OiB4YywKICAgIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdDogcGMsCiAgICBSR0JBX1MzVENfRFhUM19Gb3JtYXQ6IGZjLAogICAgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OiBtYywKICAgIFJHQkRlcHRoUGFja2luZzogSHAsCiAgICBSR0JGb3JtYXQ6IG9jLAogICAgUkdCSW50ZWdlckZvcm1hdDogVnAsCiAgICBSR0JfQlBUQ19TSUdORURfRm9ybWF0OiBWYywKICAgIFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdDogRGMsCiAgICBSR0JfRVRDMV9Gb3JtYXQ6IHdjLAogICAgUkdCX0VUQzJfRm9ybWF0OiBNYywKICAgIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OiBnYywKICAgIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OiB5YywKICAgIFJHQl9TM1RDX0RYVDFfRm9ybWF0OiBkYywKICAgIFJHRGVwdGhQYWNraW5nOiBxcCwKICAgIFJHRm9ybWF0OiBsYywKICAgIFJHSW50ZWdlckZvcm1hdDogY2MsCiAgICBSYXdTaGFkZXJNYXRlcmlhbDogc28sCiAgICBSYXk6IExlLAogICAgUmF5Y2FzdGVyOiBKaCwKICAgIFJlY3RBcmVhTGlnaHQ6IElvLAogICAgUmVkRm9ybWF0OiBUbCwKICAgIFJlZEludGVnZXJGb3JtYXQ6IElsLAogICAgUmVpbmhhcmRUb25lTWFwcGluZzogQ3AsCiAgICBSZW5kZXJUYXJnZXQ6IFdpLAogICAgUmVuZGVyVGFyZ2V0M0Q6IExoLAogICAgUmVuZGVyVGFyZ2V0QXJyYXk6IFVoLAogICAgUmVwZWF0V3JhcHBpbmc6IHByLAogICAgUmVwbGFjZVN0ZW5jaWxPcDogSnAsCiAgICBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjogZXAsCiAgICBSaW5nR2VvbWV0cnk6IFlyLAogICAgU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6IEhjLAogICAgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQ6IFVjLAogICAgU1JHQkNvbG9yU3BhY2U6IEJ0LAogICAgU1JHQlRyYW5zZmVyOiBGbiwKICAgIFNjZW5lOiBfciwKICAgIFNoYWRlckNodW5rOiBQZTEsCiAgICBTaGFkZXJMaWI6IGd0MSwKICAgIFNoYWRlck1hdGVyaWFsOiBxaSwKICAgIFNoYWRvd01hdGVyaWFsOiBpbywKICAgIFNoYXBlOiBNZSwKICAgIFNoYXBlR2VvbWV0cnk6ICRyLAogICAgU2hhcGVQYXRoOiBNbCwKICAgIFNoYXBlVXRpbHM6IGhlLAogICAgU2hvcnRUeXBlOiBRbCwKICAgIFNrZWxldG9uOiBUciwKICAgIFNrZWxldG9uSGVscGVyOiBubCwKICAgIFNraW5uZWRNZXNoOiBTciwKICAgIFNvdXJjZTogYmUsCiAgICBTcGhlcmU6IGh0LAogICAgU3BoZXJlR2VvbWV0cnk6IG1uLAogICAgU3BoZXJpY2FsOiBZaCwKICAgIFNwaGVyaWNhbEhhcm1vbmljczM6IENvLAogICAgU3BsaW5lQ3VydmU6IHVuLAogICAgU3BvdExpZ2h0OiBNbywKICAgIFNwb3RMaWdodEhlbHBlcjogc2wsCiAgICBTcHJpdGU6IHZyLAogICAgU3ByaXRlTWF0ZXJpYWw6IHRuLAogICAgU3JjQWxwaGFGYWN0b3I6IHNhLAogICAgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjogZHAsCiAgICBTcmNDb2xvckZhY3Rvcjogb3AsCiAgICBTdGF0aWNDb3B5VXNhZ2U6IHdmLAogICAgU3RhdGljRHJhd1VzYWdlOiBKcywKICAgIFN0YXRpY1JlYWRVc2FnZTogZ2YsCiAgICBTdGVyZW9DYW1lcmE6IEZoLAogICAgU3RyZWFtQ29weVVzYWdlOiBfZiwKICAgIFN0cmVhbURyYXdVc2FnZTogeWYsCiAgICBTdHJlYW1SZWFkVXNhZ2U6IGJmLAogICAgU3RyaW5nS2V5ZnJhbWVUcmFjazogQWUsCiAgICBTdWJ0cmFjdEVxdWF0aW9uOiB0cCwKICAgIFN1YnRyYWN0aXZlQmxlbmRpbmc6IFFkLAogICAgVE9VQ0g6IExkLAogICAgVGFuZ2VudFNwYWNlTm9ybWFsTWFwOiBfaSwKICAgIFRldHJhaGVkcm9uR2VvbWV0cnk6IFFyLAogICAgVGV4dHVyZTogbHQsCiAgICBUZXh0dXJlTG9hZGVyOiBiaCwKICAgIFRleHR1cmVVdGlsczogT2YsCiAgICBUaW1lc3RhbXBRdWVyeTogU2YsCiAgICBUb3J1c0dlb21ldHJ5OiBqciwKICAgIFRvcnVzS25vdEdlb21ldHJ5OiBLciwKICAgIFRyaWFuZ2xlOiBuZSwKICAgIFRyaWFuZ2xlRmFuRHJhd01vZGU6IFVwLAogICAgVHJpYW5nbGVTdHJpcERyYXdNb2RlOiBMcCwKICAgIFRyaWFuZ2xlc0RyYXdNb2RlOiBEcCwKICAgIFR1YmVHZW9tZXRyeTogdG8sCiAgICBVVk1hcHBpbmc6IExvLAogICAgVWludDE2QnVmZmVyQXR0cmlidXRlOiBnciwKICAgIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTogeHIsCiAgICBVaW50OEJ1ZmZlckF0dHJpYnV0ZTogSWEsCiAgICBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU6IENhLAogICAgVW5pZm9ybTogV2gsCiAgICBVbmlmb3Jtc0dyb3VwOiBIaCwKICAgIFVuaWZvcm1zTGliOiBlZTEsCiAgICBVbmlmb3Jtc1V0aWxzOiBrZiwKICAgIFVuc2lnbmVkQnl0ZVR5cGU6IFNsLAogICAgVW5zaWduZWRJbnQyNDhUeXBlOiBzYywKICAgIFVuc2lnbmVkSW50NTk5OVR5cGU6IG5jLAogICAgVW5zaWduZWRJbnRUeXBlOiBXbywKICAgIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZTogZWMsCiAgICBVbnNpZ25lZFNob3J0NTU1MVR5cGU6IGljLAogICAgVW5zaWduZWRTaG9ydFR5cGU6IGpsLAogICAgVlNNU2hhZG93TWFwOiBaZCwKICAgIFZlY3RvcjI6IFQsCiAgICBWZWN0b3IzOiB3LAogICAgVmVjdG9yNDogb3QsCiAgICBWZWN0b3JLZXlmcmFtZVRyYWNrOiBiaSwKICAgIFZpZGVvRnJhbWVUZXh0dXJlOiBzaCwKICAgIFZpZGVvVGV4dHVyZTogUnIsCiAgICBXZWJHTDNEUmVuZGVyVGFyZ2V0OiB5YSwKICAgIFdlYkdMQXJyYXlSZW5kZXJUYXJnZXQ6IG1hLAogICAgV2ViR0xDb29yZGluYXRlU3lzdGVtOiBvZSwKICAgIFdlYkdMQ3ViZVJlbmRlclRhcmdldDogTmEsCiAgICBXZWJHTFJlbmRlclRhcmdldDogSGksCiAgICBXZWJHTFJlbmRlcmVyOiBjcjEsCiAgICBXZWJHTFV0aWxzOiB5ZjEsCiAgICBXZWJHUFVDb29yZGluYXRlU3lzdGVtOiBacywKICAgIFdlYlhSQ29udHJvbGxlcjogVmEsCiAgICBXaXJlZnJhbWVHZW9tZXRyeTogZW8sCiAgICBXcmFwQXJvdW5kRW5kaW5nOiBYcywKICAgIFplcm9DdXJ2YXR1cmVFbmRpbmc6IGhpLAogICAgWmVyb0ZhY3RvcjogbnAsCiAgICBaZXJvU2xvcGVFbmRpbmc6IGxpLAogICAgWmVyb1N0ZW5jaWxPcDogWHAsCiAgICBjcmVhdGVDYW52YXNFbGVtZW50OiBJZgp9OwpmdW5jdGlvbiBnZXRXZWJHTEVycm9yTWVzc2FnZSgpIHsKICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoMSk7Cn0KZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKHZlcnNpb24pIHsKICAgIHZhciBuYW1lcyA9IHsKICAgICAgICAxOiAiV2ViR0wiLAogICAgICAgIDI6ICJXZWJHTCAyIgogICAgfTsKICAgIHZhciBjb250ZXh0cyA9IHsKICAgICAgICAxOiB3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0LAogICAgICAgIDI6IHdpbmRvdy5XZWJHTDJSZW5kZXJpbmdDb250ZXh0CiAgICB9OwogICAgdmFyIG1lc3NhZ2UgPSAnWW91ciAkMCBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj0iaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uIiBzdHlsZT0iY29sb3I6IzAwMCI+JDE8L2E+JzsKICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBlbGVtZW50LmlkID0gIndlYmdsbWVzc2FnZSI7CiAgICBlbGVtZW50LnN0eWxlLmZvbnRGYW1pbHkgPSAibW9ub3NwYWNlIjsKICAgIGVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAiMTNweCI7CiAgICBlbGVtZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAibm9ybWFsIjsKICAgIGVsZW1lbnQuc3R5bGUudGV4dEFsaWduID0gImNlbnRlciI7CiAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAiI2ZmZiI7CiAgICBlbGVtZW50LnN0eWxlLmNvbG9yID0gIiMwMDAiOwogICAgZWxlbWVudC5zdHlsZS5wYWRkaW5nID0gIjEuNWVtIjsKICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAiNDAwcHgiOwogICAgZWxlbWVudC5zdHlsZS5tYXJnaW4gPSAiNWVtIGF1dG8gMCI7CiAgICBpZiAoY29udGV4dHNbdmVyc2lvbl0pIHsKICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCIkMCIsICJncmFwaGljcyBjYXJkIik7CiAgICB9IGVsc2UgewogICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoIiQwIiwgImJyb3dzZXIiKTsKICAgIH0KICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoIiQxIiwgbmFtZXNbdmVyc2lvbl0pOwogICAgZWxlbWVudC5pbm5lckhUTUwgPSBtZXNzYWdlOwogICAgcmV0dXJuIGVsZW1lbnQ7Cn0KZnVuY3Rpb24gdXZfdG9fcGl4ZWxfYm91bmRzKHV2LCB0ZXhfd2lkdGgsIHRleF9oZWlnaHQpIHsKICAgIGNvbnN0IHRleF9zaXplID0gbmV3IFQodGV4X3dpZHRoLCB0ZXhfaGVpZ2h0KTsKICAgIGNvbnN0IHV2X2xlZnRfYm90dG9tID0gbmV3IFQodXYueCwgdXYueSk7CiAgICBjb25zdCB1dl9yaWdodF90b3AgPSBuZXcgVCh1di56LCB1di53KTsKICAgIGNvbnN0IHB4X2xlZnRfYm90dG9tID0gdXZfbGVmdF9ib3R0b20uY2xvbmUoKS5tdWx0aXBseSh0ZXhfc2l6ZSkuZmxvb3IoKTsKICAgIGNvbnN0IHB4X3JpZ2h0X3RvcCA9IHV2X3JpZ2h0X3RvcC5jbG9uZSgpLm11bHRpcGx5KHRleF9zaXplKS5jZWlsKCk7CiAgICBjb25zdCB3eCA9IE1hdGguYWJzKHB4X3JpZ2h0X3RvcC54IC0gcHhfbGVmdF9ib3R0b20ueCk7CiAgICBjb25zdCB3eSA9IE1hdGguYWJzKHB4X3JpZ2h0X3RvcC55IC0gcHhfbGVmdF9ib3R0b20ueSk7CiAgICByZXR1cm4gWwogICAgICAgIHB4X2xlZnRfYm90dG9tLAogICAgICAgIG5ldyBUKHd4LCB3eSkKICAgIF07Cn0KZnVuY3Rpb24gaXNfdGhyZWVfZml4ZWRfYXJyYXkodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIG1vZC5WZWN0b3IyIHx8IHZhbHVlIGluc3RhbmNlb2YgbW9kLlZlY3RvcjMgfHwgdmFsdWUgaW5zdGFuY2VvZiBtb2QuVmVjdG9yNCB8fCB2YWx1ZSBpbnN0YW5jZW9mIG1vZC5NYXRyaXg0Owp9CmZ1bmN0aW9uIHRvX3RocmVlX3ZlY3RvcihkYXRhKSB7CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gMikgewogICAgICAgIHJldHVybiBuZXcgbW9kLlZlY3RvcjIoKS5mcm9tQXJyYXkoZGF0YSk7CiAgICB9CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gMykgewogICAgICAgIHJldHVybiBuZXcgbW9kLlZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YSk7CiAgICB9CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gNCkgewogICAgICAgIHJldHVybiBuZXcgbW9kLlZlY3RvcjQoKS5mcm9tQXJyYXkoZGF0YSk7CiAgICB9CiAgICBpZiAoZGF0YS5sZW5ndGggPT0gMTYpIHsKICAgICAgICBjb25zdCBtYXQgPSBuZXcgbW9kLk1hdHJpeDQoKTsKICAgICAgICBtYXQuZnJvbUFycmF5KGRhdGEpOwogICAgICAgIHJldHVybiBtYXQ7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiB0eXBlZGFycmF5X3RvX3ZlY3R5cGUodHlwZWRBcnJheSwgbmRpbSkgewogICAgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHsKICAgICAgICBpZiAobmRpbSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gInZlYyIgKyBuZGltOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkpIHsKICAgICAgICBpZiAobmRpbSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gImludCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICJpdmVjIiArIG5kaW07CiAgICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHsKICAgICAgICBpZiAobmRpbSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gInVpbnQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAidXZlYyIgKyBuZGltOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CmZ1bmN0aW9uIGF0dHJpYnV0ZV90eXBlKGF0dHJpYnV0ZSkgewogICAgaWYgKGF0dHJpYnV0ZSkgewogICAgICAgIHJldHVybiB0eXBlZGFycmF5X3RvX3ZlY3R5cGUoYXR0cmlidXRlLmFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KZnVuY3Rpb24gdW5pZm9ybV90eXBlKG9iaikgewogICAgaWYgKG9iaiBpbnN0YW5jZW9mIG1vZC5Vbmlmb3JtKSB7CiAgICAgICAgcmV0dXJuIHVuaWZvcm1fdHlwZShvYmoudmFsdWUpOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAibnVtYmVyIikgewogICAgICAgIHJldHVybiAiZmxvYXQiOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAiYm9vbGVhbiIpIHsKICAgICAgICByZXR1cm4gImJvb2wiOwogICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBtb2QuVmVjdG9yMikgewogICAgICAgIHJldHVybiAidmVjMiI7CiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIG1vZC5WZWN0b3IzKSB7CiAgICAgICAgcmV0dXJuICJ2ZWMzIjsKICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgbW9kLlZlY3RvcjQpIHsKICAgICAgICByZXR1cm4gInZlYzQiOwogICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBtb2QuQ29sb3IpIHsKICAgICAgICByZXR1cm4gInZlYzQiOwogICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBtb2QuTWF0cml4MykgewogICAgICAgIHJldHVybiAibWF0MyI7CiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIG1vZC5NYXRyaXg0KSB7CiAgICAgICAgcmV0dXJuICJtYXQ0IjsKICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgbW9kLlRleHR1cmUpIHsKICAgICAgICByZXR1cm4gInNhbXBsZXIyRCI7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiaW52YWxpZCI7CiAgICB9Cn0KZnVuY3Rpb24gdW5pZm9ybXNfdG9fdHlwZV9kZWNsYXJhdGlvbih1bmlmb3JtX2RpY3QpIHsKICAgIGxldCByZXN1bHQgPSAiIjsKICAgIGZvcihjb25zdCBuYW1lIGluIHVuaWZvcm1fZGljdCl7CiAgICAgICAgY29uc3QgdW5pZm9ybSA9IHVuaWZvcm1fZGljdFtuYW1lXTsKICAgICAgICBjb25zdCB0eXBlID0gdW5pZm9ybV90eXBlKHVuaWZvcm0pOwogICAgICAgIGlmICh0eXBlICE9ICJpbnZhbGlkIikgcmVzdWx0ICs9IGB1bmlmb3JtICR7dHlwZX0gJHtuYW1lfTtcbmA7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGF0dHJpYnV0ZXNfdG9fdHlwZV9kZWNsYXJhdGlvbihhdHRyaWJ1dGVzX2RpY3QpIHsKICAgIGxldCByZXN1bHQgPSAiIjsKICAgIGZvcihjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXNfZGljdCl7CiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc19kaWN0W25hbWVdOwogICAgICAgIGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGVfdHlwZShhdHRyaWJ1dGUpOwogICAgICAgIHJlc3VsdCArPSBgaW4gJHt0eXBlfSAke25hbWV9O1xuYDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gdXBkYXRlX3VuaWZvcm0odW5pZm9ybSwgbmV3X3ZhbHVlKSB7CiAgICBpZiAodW5pZm9ybS52YWx1ZS5pc1RleHR1cmUpIHsKICAgICAgICBjb25zdCBpbV9kYXRhID0gdW5pZm9ybS52YWx1ZS5pbWFnZTsKICAgICAgICBjb25zdCBbc2l6ZSwgdGV4X2RhdGFdID0gbmV3X3ZhbHVlOwogICAgICAgIGlmICh0ZXhfZGF0YS5sZW5ndGggPT0gaW1fZGF0YS5kYXRhLmxlbmd0aCkgewogICAgICAgICAgICBpbV9kYXRhLmRhdGEuc2V0KHRleF9kYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBvbGRfdGV4dHVyZSA9IHVuaWZvcm0udmFsdWU7CiAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSByZV9jcmVhdGVfdGV4dHVyZShvbGRfdGV4dHVyZSwgdGV4X2RhdGEsIHNpemUpOwogICAgICAgICAgICBvbGRfdGV4dHVyZS5kaXNwb3NlKCk7CiAgICAgICAgfQogICAgICAgIHVuaWZvcm0udmFsdWUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNfdGhyZWVfZml4ZWRfYXJyYXkodW5pZm9ybS52YWx1ZSkpIHsKICAgICAgICAgICAgdW5pZm9ybS52YWx1ZS5mcm9tQXJyYXkobmV3X3ZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gbmV3X3ZhbHVlOwogICAgICAgIH0KICAgIH0KfQpmdW5jdGlvbiByZV9jcmVhdGVfYnVmZmVyKGJ1ZmZlciwgaXNfc2VnbWVudHMpIHsKICAgIGlmIChidWZmZXIgaW5zdGFuY2VvZiBtb2QuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpIHsKICAgICAgICByZXR1cm4gbmV3IG1vZC5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZShidWZmZXIuZGF0YSwgYnVmZmVyLml0ZW1TaXplLCBidWZmZXIub2Zmc2V0KTsKICAgIH0KICAgIGxldCB7IG5ld19kYXRhICB9ID0gYnVmZmVyOwogICAgaWYgKCFuZXdfZGF0YSkgewogICAgICAgIG5ld19kYXRhID0gYnVmZmVyLmFycmF5OwogICAgfQogICAgbGV0IG5ld19idWZmZXI7CiAgICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgbW9kLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKSB7CiAgICAgICAgbmV3X2J1ZmZlciA9IG5ldyBtb2QuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIobmV3X2RhdGEsIGJ1ZmZlci5zdHJpZGUsIGJ1ZmZlci5tZXNoUGVyQXR0cmlidXRlKTsKICAgICAgICBuZXdfYnVmZmVyLmNvdW50ID0gTWF0aC5tYXgoMCwgaXNfc2VnbWVudHMgPyBNYXRoLmZsb29yKG5ld19idWZmZXIuY291bnQgLSAxKSA6IG5ld19idWZmZXIuY291bnQgLSAzKTsKICAgIH0gZWxzZSBpZiAoYnVmZmVyIGluc3RhbmNlb2YgbW9kLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgIG5ld19idWZmZXIgPSBuZXcgbW9kLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZShuZXdfZGF0YSwgYnVmZmVyLml0ZW1TaXplLCBidWZmZXIubm9ybWFsaXplZCwgYnVmZmVyLm1lc2hQZXJBdHRyaWJ1dGUpOwogICAgfSBlbHNlIGlmIChidWZmZXIgaW5zdGFuY2VvZiBtb2QuQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgbmV3X2J1ZmZlciA9IG5ldyBtb2QuQnVmZmVyQXR0cmlidXRlKG5ld19kYXRhLCBidWZmZXIuaXRlbVNpemUsIGJ1ZmZlci5ub3JtYWxpemVkKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBidWZmZXIgdHlwZS4gTXVzdCBiZSBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUsIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwgb3IgVEhSRUUuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIuIik7CiAgICB9CiAgICBpZiAoYnVmZmVyLnVzYWdlKSB7CiAgICAgICAgbmV3X2J1ZmZlci51c2FnZSA9IGJ1ZmZlci51c2FnZTsKICAgIH0KICAgIGlmIChidWZmZXIudXBkYXRlUmFuZ2UpIHsKICAgICAgICBuZXdfYnVmZmVyLnVwZGF0ZVJhbmdlID0gewogICAgICAgICAgICBvZmZzZXQ6IGJ1ZmZlci51cGRhdGVSYW5nZS5vZmZzZXQsCiAgICAgICAgICAgIGNvdW50OiBidWZmZXIudXBkYXRlUmFuZ2UuY291bnQKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIG5ld19idWZmZXI7Cn0KZnVuY3Rpb24gcmVfY3JlYXRlX2dlb21ldHJ5KGdlb21ldHJ5LCBpc19zZWdtZW50cykgewogICAgbGV0IG5ld19nZW9tZXRyeTsKICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIG1vZC5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSkgewogICAgICAgIG5ld19nZW9tZXRyeSA9IG5ldyBtb2QuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgbmV3X2dlb21ldHJ5ID0gbmV3IG1vZC5CdWZmZXJHZW9tZXRyeSgpOwogICAgfQogICAgbmV3X2dlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IG1vZC5TcGhlcmUoKTsKICAgIG5ld19nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgPSAxMDAwMDAwMDAwMDAwMDsKICAgIG5ld19nZW9tZXRyeS5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7CiAgICBjb25zdCBpbnRlcmxlYXZlZF9hdHRyaWJ1dGVzID0gbmV3IE1hcCgpOwogICAgbGV0IGluc3RhbmNlX2NvdW50ID0gZ2VvbWV0cnkuaW5zdGFuY2VDb3VudDsKICAgIGZvciAoY29uc3QgW25hbWUsIGF0dHJpYnV0ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2VvbWV0cnkuYXR0cmlidXRlcykpewogICAgICAgIGxldCBuZXdfYXR0cmlidXRlOwogICAgICAgIGlmIChhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICBjb25zdCBvbGRfYnVmZmVyID0gYXR0cmlidXRlLmRhdGE7CiAgICAgICAgICAgIGxldCBuZXdfYnVmZmVyOwogICAgICAgICAgICBpZiAoIWludGVybGVhdmVkX2F0dHJpYnV0ZXMuaGFzKG9sZF9idWZmZXIpKSB7CiAgICAgICAgICAgICAgICBuZXdfYnVmZmVyID0gcmVfY3JlYXRlX2J1ZmZlcihvbGRfYnVmZmVyLCBpc19zZWdtZW50cyk7CiAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZF9hdHRyaWJ1dGVzLnNldChvbGRfYnVmZmVyLCBuZXdfYnVmZmVyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld19idWZmZXIgPSBpbnRlcmxlYXZlZF9hdHRyaWJ1dGVzLmdldChvbGRfYnVmZmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdHRyaWJ1dGUuZGF0YSA9IG5ld19idWZmZXI7CiAgICAgICAgICAgIG5ld19hdHRyaWJ1dGUgPSByZV9jcmVhdGVfYnVmZmVyKGF0dHJpYnV0ZSwgaXNfc2VnbWVudHMpOwogICAgICAgICAgICBpbnN0YW5jZV9jb3VudCA9IG5ld19hdHRyaWJ1dGUuY291bnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3X2F0dHJpYnV0ZSA9IHJlX2NyZWF0ZV9idWZmZXIoYXR0cmlidXRlLCBpc19zZWdtZW50cyk7CiAgICAgICAgfQogICAgICAgIG5ld19nZW9tZXRyeS5zZXRBdHRyaWJ1dGUobmFtZSwgbmV3X2F0dHJpYnV0ZSk7CiAgICAgICAgaWYgKG5ld19hdHRyaWJ1dGUgaW5zdGFuY2VvZiBtb2QuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgICAgIGluc3RhbmNlX2NvdW50ID0gbmV3X2F0dHJpYnV0ZS5jb3VudDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZ2VvbWV0cnkuaW50ZXJsZWF2ZWRfYXR0cmlidXRlcykgewogICAgICAgIG5ld19nZW9tZXRyeS5pbnRlcmxlYXZlZF9hdHRyaWJ1dGVzID0ge307CiAgICAgICAgT2JqZWN0LmtleXMoZ2VvbWV0cnkuaW50ZXJsZWF2ZWRfYXR0cmlidXRlcykuZm9yRWFjaCgobmFtZSk9PnsKICAgICAgICAgICAgY29uc3Qgb2xkID0gZ2VvbWV0cnkuaW50ZXJsZWF2ZWRfYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICAgICAgbmV3X2dlb21ldHJ5LmludGVybGVhdmVkX2F0dHJpYnV0ZXNbbmFtZV0gPSBpbnRlcmxlYXZlZF9hdHRyaWJ1dGVzLmdldChvbGQpOwogICAgICAgIH0pOwogICAgfQogICAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgbW9kLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KSB7CiAgICAgICAgZ2VvbWV0cnkuaW5zdGFuY2VDb3VudCA9IGluc3RhbmNlX2NvdW50OwogICAgfQogICAgaWYgKGdlb21ldHJ5LmluZGV4KSB7CiAgICAgICAgbmV3X2dlb21ldHJ5LmluZGV4ID0gcmVfY3JlYXRlX2J1ZmZlcihnZW9tZXRyeS5pbmRleCwgaXNfc2VnbWVudHMpOwogICAgfQogICAgcmV0dXJuIG5ld19nZW9tZXRyeTsKfQpmdW5jdGlvbiBmaW5kX2ludGVybGVhdmVkX2F0dHJpYnV0ZShnZW9tZXRyeSwgYnVmZmVyKSB7CiAgICBmb3IgKGNvbnN0IFtuYW1lLCBhdHRyaWJ1dGVdIG9mIE9iamVjdC5lbnRyaWVzKGdlb21ldHJ5LmF0dHJpYnV0ZXMpKXsKICAgICAgICBpZiAoYXR0cmlidXRlLmRhdGEgPT09IGJ1ZmZlcikgewogICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNvbnZlcnRfUkdCX3RvX1JHQkEocmdiQXJyYXkpIHsKICAgIGNvbnN0IGxlbmd0aCA9IHJnYkFycmF5Lmxlbmd0aDsKICAgIGNvbnN0IHJnYmFBcnJheSA9IG5ldyByZ2JBcnJheS5jb25zdHJ1Y3RvcihsZW5ndGggLyAzICogNCk7CiAgICBjb25zdCBhID0gcmdiQXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gMjU1IDogMS4wOwogICAgZm9yKGxldCBpID0gMCwgaiA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMywgaiArPSA0KXsKICAgICAgICByZ2JhQXJyYXlbal0gPSByZ2JBcnJheVtpXTsKICAgICAgICByZ2JhQXJyYXlbaiArIDFdID0gcmdiQXJyYXlbaSArIDFdOwogICAgICAgIHJnYmFBcnJheVtqICsgMl0gPSByZ2JBcnJheVtpICsgMl07CiAgICAgICAgcmdiYUFycmF5W2ogKyAzXSA9IGE7CiAgICB9CiAgICByZXR1cm4gcmdiYUFycmF5Owp9CmZ1bmN0aW9uIGNyZWF0ZV90ZXh0dXJlX2Zyb21fZGF0YShkYXRhKSB7CiAgICBsZXQgYnVmZmVyID0gZGF0YS5kYXRhOwogICAgaWYgKGRhdGEuc2l6ZS5sZW5ndGggPT0gMykgewogICAgICAgIGNvbnN0IHRleCA9IG5ldyBtb2QuRGF0YTNEVGV4dHVyZShidWZmZXIsIGRhdGEuc2l6ZVswXSwgZGF0YS5zaXplWzFdLCBkYXRhLnNpemVbMl0pOwogICAgICAgIHRleC5mb3JtYXQgPSBtb2RbZGF0YS50aHJlZV9mb3JtYXRdOwogICAgICAgIHRleC50eXBlID0gbW9kW2RhdGEudGhyZWVfdHlwZV07CiAgICAgICAgcmV0dXJuIHRleDsKICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGZvcm1hdCA9IG1vZFtkYXRhLnRocmVlX2Zvcm1hdF07CiAgICAgICAgaWYgKGRhdGEudGhyZWVfZm9ybWF0ID09ICJSR0JGb3JtYXQiKSB7CiAgICAgICAgICAgIGJ1ZmZlciA9IGNvbnZlcnRfUkdCX3RvX1JHQkEoYnVmZmVyKTsKICAgICAgICAgICAgZm9ybWF0ID0gbW9kLlJHQkFGb3JtYXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgbW9kLkRhdGFUZXh0dXJlKGJ1ZmZlciwgZGF0YS5zaXplWzBdLCBkYXRhLnNpemVbMV0sIGZvcm1hdCwgbW9kW2RhdGEudGhyZWVfdHlwZV0pOwogICAgfQp9CmNsYXNzIFRleHR1cmVBdGxhcyB7CiAgICBjb25zdHJ1Y3Rvcih3aWR0aCwgcGl4X3Blcl9nbHlwaCwgZ2x5cGhfcGFkZGluZyl7CiAgICAgICAgdGhpcy5waXhfcGVyX2dseXBoID0gcGl4X3Blcl9nbHlwaDsKICAgICAgICB0aGlzLmdseXBoX3BhZGRpbmcgPSBnbHlwaF9wYWRkaW5nOwogICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgICAgICB0aGlzLmhlaWdodCA9IHdpZHRoOwogICAgICAgIHRoaXMuZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiB3aWR0aCk7CiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IDAuMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5nbHlwaF9kYXRhID0gbmV3IE1hcCgpOwogICAgICAgIHRoaXMudGV4dHVyZXMgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBpbnNlcnRfZ2x5cGgoaGFzaCwgZ2x5cGhfZGF0YSwgdXZfcG9zLCB3aWR0aCwgbWluaW11bSkgewogICAgICAgIHRoaXMuZ2x5cGhfZGF0YS5zZXQoaGFzaCwgWwogICAgICAgICAgICB1dl9wb3MsCiAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICBtaW5pbXVtCiAgICAgICAgXSk7CiAgICAgICAgY29uc3QgW3B4X3N0YXJ0LCBweF93aWR0aF0gPSB1dl90b19waXhlbF9ib3VuZHModXZfcG9zLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CiAgICAgICAgZm9yKGxldCBjb2wgPSAwOyBjb2wgPCBweF93aWR0aC55OyBjb2wrKyl7CiAgICAgICAgICAgIGZvcihsZXQgcm93ID0gMDsgcm93IDwgcHhfd2lkdGgueDsgcm93KyspewogICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhfaW5kZXggPSBjb2wgKiBweF93aWR0aC54ICsgcm93OwogICAgICAgICAgICAgICAgY29uc3QgYXRsYXNfaW5kZXggPSAocHhfc3RhcnQueSArIGNvbCkgKiB0aGlzLmhlaWdodCArIChweF9zdGFydC54ICsgcm93KTsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YVthdGxhc19pbmRleF0gPSBnbHlwaF9kYXRhLmFycmF5W2dseXBoX2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGluc2VydF9nbHlwaHMoZ2x5cGhfZGF0YSkgewogICAgICAgIGxldCB3cml0dGVuID0gZmFsc2U7CiAgICAgICAgT2JqZWN0LmtleXMoZ2x5cGhfZGF0YSkuZm9yRWFjaCgoaGFzaCk9PnsKICAgICAgICAgICAgaWYgKHRoaXMuZ2x5cGhfZGF0YS5oYXMoaGFzaCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBbdXYsIHNkZiwgd2lkdGgsIG1pbmltdW1dID0gZ2x5cGhfZGF0YVtoYXNoXTsKICAgICAgICAgICAgdGhpcy5pbnNlcnRfZ2x5cGgoaGFzaCwgc2RmLCB0b190aHJlZV92ZWN0b3IodXYpLCB0b190aHJlZV92ZWN0b3Iod2lkdGgpLCB0b190aHJlZV92ZWN0b3IobWluaW11bSkpOwogICAgICAgICAgICB3cml0dGVuID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0pOwogICAgICAgIGlmICh3cml0dGVuKSB7CiAgICAgICAgICAgIHRoaXMudXBsb2FkX3RleF9kYXRhKCk7CiAgICAgICAgfQogICAgfQogICAgZ2V0X2dseXBoX2RhdGEoaGFzaCwgc2NhbGUpIHsKICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nbHlwaF9kYXRhLmdldChoYXNoLnRvU3RyaW5nKCkpOwogICAgICAgIGlmICghZGF0YSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYEdseXBoIHdpdGggaGFzaCAke2hhc2h9IG5vdCBmb3VuZCBpbiB0aGUgYXRsYXMuYCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBbdXZfb2Zmc2V0X3dpZHRoLCB3aWR0aCwgbWluaV0gPSBkYXRhOwogICAgICAgIGNvbnN0IHdfc2NhbGVkID0gd2lkdGguY2xvbmUoKS5tdWx0aXBseShzY2FsZSk7CiAgICAgICAgY29uc3QgbWluaV9zY2FsZWQgPSBtaW5pLmNsb25lKCkubXVsdGlwbHkoc2NhbGUpOwogICAgICAgIGNvbnN0IHBhZCA9IHRoaXMuZ2x5cGhfcGFkZGluZyAvIHRoaXMucGl4X3Blcl9nbHlwaDsKICAgICAgICBjb25zdCBzY2FsZWRfcGFkID0gc2NhbGUuY2xvbmUoKS5tdWx0aXBseVNjYWxhcigyICogcGFkKTsKICAgICAgICBjb25zdCBzY2FsZXMgPSB3X3NjYWxlZC5jbG9uZSgpLmFkZChzY2FsZWRfcGFkKTsKICAgICAgICBjb25zdCBxdWFkX29mZnNldHMgPSBtaW5pX3NjYWxlZC5jbG9uZSgpLnN1YihzY2FsZS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHBhZCkpOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHV2X29mZnNldF93aWR0aCwKICAgICAgICAgICAgc2NhbGVzLAogICAgICAgICAgICBxdWFkX29mZnNldHMKICAgICAgICBdOwogICAgfQogICAgZ2V0X3RleHR1cmUocmVuZGVyZXIpIHsKICAgICAgICBpZiAodGhpcy50ZXh0dXJlcy5oYXMocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzLmdldChyZW5kZXJlcik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgTHQodGhpcy5kYXRhLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgVGwsIHBpKTsKICAgICAgICB0ZXh0dXJlLm1hZ0ZpbHRlciA9IFV0OwogICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gVXQ7CiAgICAgICAgdGV4dHVyZS53cmFwUyA9IEh0OwogICAgICAgIHRleHR1cmUud3JhcFQgPSBIdDsKICAgICAgICB0aGlzLnRleHR1cmVzLnNldChyZW5kZXJlciwgdGV4dHVyZSk7CiAgICAgICAgcmV0dXJuIHRleHR1cmU7CiAgICB9CiAgICB1cGxvYWRfdGV4X2RhdGEoKSB7CiAgICAgICAgZm9yIChjb25zdCBbcmVuZGVyZXIsIHRleHR1cmVdIG9mIHRoaXMudGV4dHVyZXMuZW50cmllcygpKXsKICAgICAgICAgICAgaWYgKCF0ZXh0dXJlLmltYWdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVzLmRlbGV0ZShyZW5kZXJlcik7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0dXJlLmltYWdlLmRhdGEuc2V0KHRoaXMuZGF0YSk7CiAgICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIH0KICAgIH0KfQpjb25zdCBURVhUVVJFX0FUTEFTID0gW107CmZ1bmN0aW9uIGdldF90ZXh0dXJlX2F0bGFzKCkgewogICAgaWYgKFRFWFRVUkVfQVRMQVMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgY29uc3QgYXRsYXMgPSBuZXcgVGV4dHVyZUF0bGFzKDIwNDgsIDY0LCAxMik7CiAgICAgICAgVEVYVFVSRV9BVExBUy5wdXNoKGF0bGFzKTsKICAgIH0KICAgIHJldHVybiBURVhUVVJFX0FUTEFTWzBdOwp9CmZ1bmN0aW9uIGNyZWF0ZV90ZXh0dXJlKHNjZW5lLCBkYXRhKSB7CiAgICBjb25zdCBidWZmZXIgPSBkYXRhLmRhdGE7CiAgICBpZiAoYnVmZmVyID09PSAidGV4dHVyZV9hdGxhcyIpIHsKICAgICAgICBjb25zdCB7IHRleHR1cmVfYXRsYXMgLCByZW5kZXJlciAgfSA9IHNjZW5lLnNjcmVlbjsKICAgICAgICBpZiAoIXRleHR1cmVfYXRsYXMpIHsKICAgICAgICAgICAgY29uc3QgYXRsYXMgPSBnZXRfdGV4dHVyZV9hdGxhcygpOwogICAgICAgICAgICBzY2VuZS5zY3JlZW4udGV4dHVyZV9hdGxhcyA9IGF0bGFzLmdldF90ZXh0dXJlKHJlbmRlcmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNjZW5lLnNjcmVlbi50ZXh0dXJlX2F0bGFzOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gY3JlYXRlX3RleHR1cmVfZnJvbV9kYXRhKGRhdGEpOwogICAgfQp9CmZ1bmN0aW9uIHJlX2NyZWF0ZV90ZXh0dXJlKG9sZF90ZXh0dXJlLCBidWZmZXIsIHNpemUpIHsKICAgIGxldCB0ZXg7CiAgICBpZiAoc2l6ZS5sZW5ndGggPT0gMykgewogICAgICAgIHRleCA9IG5ldyBtb2QuRGF0YTNEVGV4dHVyZShidWZmZXIsIHNpemVbMF0sIHNpemVbMV0sIHNpemVbMl0pOwogICAgICAgIHRleC5mb3JtYXQgPSBvbGRfdGV4dHVyZS5mb3JtYXQ7CiAgICAgICAgdGV4LnR5cGUgPSBvbGRfdGV4dHVyZS50eXBlOwogICAgfSBlbHNlIHsKICAgICAgICB0ZXggPSBuZXcgbW9kLkRhdGFUZXh0dXJlKGJ1ZmZlciwgc2l6ZVswXSwgc2l6ZVsxXSA/IHNpemVbMV0gOiAxLCBvbGRfdGV4dHVyZS5mb3JtYXQsIG9sZF90ZXh0dXJlLnR5cGUpOwogICAgfQogICAgdGV4Lm1pbkZpbHRlciA9IG9sZF90ZXh0dXJlLm1pbkZpbHRlcjsKICAgIHRleC5tYWdGaWx0ZXIgPSBvbGRfdGV4dHVyZS5tYWdGaWx0ZXI7CiAgICB0ZXguYW5pc290cm9weSA9IG9sZF90ZXh0dXJlLmFuaXNvdHJvcHk7CiAgICB0ZXgud3JhcFMgPSBvbGRfdGV4dHVyZS53cmFwUzsKICAgIGlmIChzaXplLmxlbmd0aCA+IDEpIHsKICAgICAgICB0ZXgud3JhcFQgPSBvbGRfdGV4dHVyZS53cmFwVDsKICAgIH0KICAgIGlmIChzaXplLmxlbmd0aCA+IDIpIHsKICAgICAgICB0ZXgud3JhcFIgPSBvbGRfdGV4dHVyZS53cmFwUjsKICAgIH0KICAgIHJldHVybiB0ZXg7Cn0KZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKGJ1ZmZlcikgewogICAgY29uc3QganNidWZmID0gbmV3IG1vZC5CdWZmZXJBdHRyaWJ1dGUoYnVmZmVyLmZsYXQsIGJ1ZmZlci50eXBlX2xlbmd0aCk7CiAgICBqc2J1ZmYuc2V0VXNhZ2UobW9kLkR5bmFtaWNEcmF3VXNhZ2UpOwogICAgcmV0dXJuIGpzYnVmZjsKfQpmdW5jdGlvbiBJbnN0YW5jZUJ1ZmZlckF0dHJpYnV0ZShidWZmZXIpIHsKICAgIGNvbnN0IGpzYnVmZiA9IG5ldyBtb2QuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKGJ1ZmZlci5mbGF0LCBidWZmZXIudHlwZV9sZW5ndGgpOwogICAganNidWZmLnNldFVzYWdlKG1vZC5EeW5hbWljRHJhd1VzYWdlKTsKICAgIHJldHVybiBqc2J1ZmY7Cn0KZnVuY3Rpb24gYXR0YWNoX2dlb21ldHJ5KGJ1ZmZlcl9nZW9tZXRyeSwgdmVydGV4YXJyYXlzLCBmYWNlcykgewogICAgZm9yKGNvbnN0IG5hbWUgaW4gdmVydGV4YXJyYXlzKXsKICAgICAgICBjb25zdCBidWZmID0gdmVydGV4YXJyYXlzW25hbWVdOwogICAgICAgIGxldCBidWZmZXI7CiAgICAgICAgaWYgKGJ1ZmYudG9fdXBkYXRlKSB7CiAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBtb2QuQnVmZmVyQXR0cmlidXRlKGJ1ZmYudG9fdXBkYXRlLCBidWZmLml0ZW1TaXplKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBidWZmZXIgPSBCdWZmZXJBdHRyaWJ1dGUoYnVmZik7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlcl9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUobmFtZSwgYnVmZmVyKTsKICAgIH0KICAgIGJ1ZmZlcl9nZW9tZXRyeS5zZXRJbmRleChmYWNlcyk7CiAgICBidWZmZXJfZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgbW9kLlNwaGVyZSgpOwogICAgYnVmZmVyX2dlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IDEwMDAwMDAwMDAwMDAwOwogICAgYnVmZmVyX2dlb21ldHJ5LmZydXN0dW1DdWxsZWQgPSBmYWxzZTsKICAgIHJldHVybiBidWZmZXJfZ2VvbWV0cnk7Cn0KZnVuY3Rpb24gYXR0YWNoX2luc3RhbmNlZF9nZW9tZXRyeShidWZmZXJfZ2VvbWV0cnksIGluc3RhbmNlX2F0dHJpYnV0ZXMpIHsKICAgIGZvcihjb25zdCBuYW1lIGluIGluc3RhbmNlX2F0dHJpYnV0ZXMpewogICAgICAgIGNvbnN0IGJ1ZmZlciA9IEluc3RhbmNlQnVmZmVyQXR0cmlidXRlKGluc3RhbmNlX2F0dHJpYnV0ZXNbbmFtZV0pOwogICAgICAgIGJ1ZmZlcl9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUobmFtZSwgYnVmZmVyKTsKICAgIH0KfQpmdW5jdGlvbiBjcmVhdGVfbWF0ZXJpYWwocGxvdCkgewogICAgY29uc3QgaXNfdm9sdW1lID0gImlzb3ZhbHVlIiBpbiBwbG90LmRlc2VyaWFsaXplZF91bmlmb3JtczsKICAgIHJldHVybiBuZXcgbW9kLlJhd1NoYWRlck1hdGVyaWFsKHsKICAgICAgICB1bmlmb3JtczogcGxvdC5kZXNlcmlhbGl6ZWRfdW5pZm9ybXMsCiAgICAgICAgdmVydGV4U2hhZGVyOiBwbG90LnBsb3RfZGF0YS52ZXJ0ZXhfc291cmNlLAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBwbG90LnBsb3RfZGF0YS5mcmFnbWVudF9zb3VyY2UsCiAgICAgICAgc2lkZTogaXNfdm9sdW1lID8gbW9kLkJhY2tTaWRlIDogbW9kLkRvdWJsZVNpZGUsCiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsCiAgICAgICAgZ2xzbFZlcnNpb246IG1vZC5HTFNMMywKICAgICAgICBkZXB0aFRlc3Q6ICFwbG90LnBsb3RfZGF0YS5vdmVyZHJhdywKICAgICAgICBkZXB0aFdyaXRlOiAhcGxvdC5wbG90X2RhdGEudHJhbnNwYXJlbmN5CiAgICB9KTsKfQpmdW5jdGlvbiBjcmVhdGVfbWVzaChwbG90KSB7CiAgICBjb25zdCBidWZmZXJfZ2VvbWV0cnkgPSBuZXcgbW9kLkJ1ZmZlckdlb21ldHJ5KCk7CiAgICBjb25zdCB7IHBsb3RfZGF0YSAgfSA9IHBsb3Q7CiAgICBjb25zdCBmYWNlcyA9IG5ldyBtb2QuQnVmZmVyQXR0cmlidXRlKHBsb3RfZGF0YS5mYWNlcywgMSk7CiAgICBhdHRhY2hfZ2VvbWV0cnkoYnVmZmVyX2dlb21ldHJ5LCBwbG90X2RhdGEudmVydGV4YXJyYXlzLCBmYWNlcyk7CiAgICBjb25zdCBtYXRlcmlhbCA9IGNyZWF0ZV9tYXRlcmlhbChwbG90KTsKICAgIGNvbnN0IG1lc2ggPSBuZXcgbW9kLk1lc2goYnVmZmVyX2dlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICByZXR1cm4gbWVzaDsKfQpmdW5jdGlvbiBjcmVhdGVfaW5zdGFuY2VkX21lc2gocGxvdCkgewogICAgY29uc3QgeyBwbG90X2RhdGEgIH0gPSBwbG90OwogICAgY29uc3QgYnVmZmVyX2dlb21ldHJ5ID0gbmV3IG1vZC5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpOwogICAgY29uc3QgZmFjZXMgPSBuZXcgbW9kLkJ1ZmZlckF0dHJpYnV0ZShwbG90X2RhdGEuZmFjZXMsIDEpOwogICAgYXR0YWNoX2dlb21ldHJ5KGJ1ZmZlcl9nZW9tZXRyeSwgcGxvdF9kYXRhLnZlcnRleGFycmF5cywgZmFjZXMpOwogICAgYXR0YWNoX2luc3RhbmNlZF9nZW9tZXRyeShidWZmZXJfZ2VvbWV0cnksIHBsb3RfZGF0YS5pbnN0YW5jZV9hdHRyaWJ1dGVzKTsKICAgIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlX21hdGVyaWFsKHBsb3QpOwogICAgY29uc3QgbWVzaCA9IG5ldyBtb2QuTWVzaChidWZmZXJfZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgIHJldHVybiBtZXNoOwp9CmNvbnN0IF9jaGFuZ2VFdmVudCA9IHsKICAgIHR5cGU6ICJjaGFuZ2UiCn07CmNvbnN0IF9zdGFydEV2ZW50ID0gewogICAgdHlwZTogInN0YXJ0Igp9Owpjb25zdCBfZW5kRXZlbnQgPSB7CiAgICB0eXBlOiAiZW5kIgp9Owpjb25zdCBfcmF5ID0gbmV3IExlKCk7CmNvbnN0IF9wbGFuZSA9IG5ldyB4ZSgpOwpjb25zdCBUSUxUX0xJTUlUID0gTWF0aC5jb3MoNzAgKiBUZi5ERUcyUkFEKTsKY2xhc3MgT3JiaXRDb250cm9scyBleHRlbmRzIHF0IHsKICAgIGNvbnN0cnVjdG9yKG9iamVjdCwgZG9tRWxlbWVudCwgYWxsb3dfdXBkYXRlLCBpc19pbl9zY2VuZSl7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKICAgICAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50OwogICAgICAgIHRoaXMuZG9tRWxlbWVudC5zdHlsZS50b3VjaEFjdGlvbiA9ICJub25lIjsKICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOwogICAgICAgIHRoaXMudGFyZ2V0ID0gbmV3IHcoKTsKICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyB3KCk7CiAgICAgICAgdGhpcy5taW5EaXN0YW5jZSA9IDA7CiAgICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IEluZmluaXR5OwogICAgICAgIHRoaXMubWluWm9vbSA9IDA7CiAgICAgICAgdGhpcy5tYXhab29tID0gSW5maW5pdHk7CiAgICAgICAgdGhpcy5taW5UYXJnZXRSYWRpdXMgPSAwOwogICAgICAgIHRoaXMubWF4VGFyZ2V0UmFkaXVzID0gSW5maW5pdHk7CiAgICAgICAgdGhpcy5taW5Qb2xhckFuZ2xlID0gMDsKICAgICAgICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOwogICAgICAgIHRoaXMubWluQXppbXV0aEFuZ2xlID0gLUluZmluaXR5OwogICAgICAgIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7CiAgICAgICAgdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5kYW1waW5nRmFjdG9yID0gMC4wNTsKICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSB0cnVlOwogICAgICAgIHRoaXMuem9vbVNwZWVkID0gMS4wOwogICAgICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTsKICAgICAgICB0aGlzLnJvdGF0ZVNwZWVkID0gMS4wOwogICAgICAgIHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTsKICAgICAgICB0aGlzLnBhblNwZWVkID0gMS4wOwogICAgICAgIHRoaXMuc2NyZWVuU3BhY2VQYW5uaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmtleVBhblNwZWVkID0gNy4wOwogICAgICAgIHRoaXMuem9vbVRvQ3Vyc29yID0gZmFsc2U7CiAgICAgICAgdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7CiAgICAgICAgdGhpcy5hdXRvUm90YXRlU3BlZWQgPSAyLjA7CiAgICAgICAgdGhpcy5rZXlzID0gewogICAgICAgICAgICBMRUZUOiAiQXJyb3dMZWZ0IiwKICAgICAgICAgICAgVVA6ICJBcnJvd1VwIiwKICAgICAgICAgICAgUklHSFQ6ICJBcnJvd1JpZ2h0IiwKICAgICAgICAgICAgQk9UVE9NOiAiQXJyb3dEb3duIgogICAgICAgIH07CiAgICAgICAgdGhpcy5tb3VzZUJ1dHRvbnMgPSB7CiAgICAgICAgICAgIExFRlQ6IERkLlJPVEFURSwKICAgICAgICAgICAgTUlERExFOiBEZC5ET0xMWSwKICAgICAgICAgICAgUklHSFQ6IERkLlBBTgogICAgICAgIH07CiAgICAgICAgdGhpcy50b3VjaGVzID0gewogICAgICAgICAgICBPTkU6IExkLlJPVEFURSwKICAgICAgICAgICAgVFdPOiBMZC5ET0xMWV9QQU4KICAgICAgICB9OwogICAgICAgIHRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7CiAgICAgICAgdGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpOwogICAgICAgIHRoaXMuem9vbTAgPSB0aGlzLm9iamVjdC56b29tOwogICAgICAgIHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHMgPSBudWxsOwogICAgICAgIHRoaXMuZ2V0UG9sYXJBbmdsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc3BoZXJpY2FsLnBoaTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0QXppbXV0aGFsQW5nbGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHNwaGVyaWNhbC50aGV0YTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0LnBvc2l0aW9uLmRpc3RhbmNlVG8odGhpcy50YXJnZXQpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5saXN0ZW5Ub0tleUV2ZW50cyA9IGZ1bmN0aW9uKGRvbUVsZW1lbnQpIHsKICAgICAgICAgICAgZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgb25LZXlEb3duKTsKICAgICAgICAgICAgdGhpcy5fZG9tRWxlbWVudEtleUV2ZW50cyA9IGRvbUVsZW1lbnQ7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnN0b3BMaXN0ZW5Ub0tleUV2ZW50cyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50S2V5RXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleURvd24pOwogICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50S2V5RXZlbnRzID0gbnVsbDsKICAgICAgICB9OwogICAgICAgIHRoaXMuc2F2ZVN0YXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNjb3BlLnRhcmdldDAuY29weShzY29wZS50YXJnZXQpOwogICAgICAgICAgICBzY29wZS5wb3NpdGlvbjAuY29weShzY29wZS5vYmplY3QucG9zaXRpb24pOwogICAgICAgICAgICBzY29wZS56b29tMCA9IHNjb3BlLm9iamVjdC56b29tOwogICAgICAgIH07CiAgICAgICAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzY29wZS50YXJnZXQuY29weShzY29wZS50YXJnZXQwKTsKICAgICAgICAgICAgc2NvcGUub2JqZWN0LnBvc2l0aW9uLmNvcHkoc2NvcGUucG9zaXRpb24wKTsKICAgICAgICAgICAgc2NvcGUub2JqZWN0Lnpvb20gPSBzY29wZS56b29tMDsKICAgICAgICAgICAgc2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgICAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudChfY2hhbmdlRXZlbnQpOwogICAgICAgICAgICBzY29wZS51cGRhdGUoKTsKICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FOwogICAgICAgIH07CiAgICAgICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbmV3IHcoKTsKICAgICAgICAgICAgY29uc3QgcXVhdCA9IG5ldyBidCgpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyB3KDAsIDEsIDApKTsKICAgICAgICAgICAgY29uc3QgcXVhdEludmVyc2UgPSBxdWF0LmNsb25lKCkuaW52ZXJ0KCk7CiAgICAgICAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IG5ldyB3KCk7CiAgICAgICAgICAgIGNvbnN0IGxhc3RRdWF0ZXJuaW9uID0gbmV3IGJ0KCk7CiAgICAgICAgICAgIGNvbnN0IGxhc3RUYXJnZXRQb3NpdGlvbiA9IG5ldyB3KCk7CiAgICAgICAgICAgIGNvbnN0IHR3b1BJID0gMiAqIE1hdGguUEk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB1cGRhdGUoZGVsdGFUaW1lID0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCFhbGxvd191cGRhdGUoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gc2NvcGUub2JqZWN0LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1YihzY29wZS50YXJnZXQpOwogICAgICAgICAgICAgICAgb2Zmc2V0LmFwcGx5UXVhdGVybmlvbihxdWF0KTsKICAgICAgICAgICAgICAgIHNwaGVyaWNhbC5zZXRGcm9tVmVjdG9yMyhvZmZzZXQpOwogICAgICAgICAgICAgICAgaWYgKHNjb3BlLmF1dG9Sb3RhdGUgJiYgc3RhdGUgPT09IFNUQVRFLk5PTkUpIHsKICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KGdldEF1dG9Sb3RhdGlvbkFuZ2xlKGRlbHRhVGltZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZURhbXBpbmcpIHsKICAgICAgICAgICAgICAgICAgICBzcGhlcmljYWwudGhldGEgKz0gc3BoZXJpY2FsRGVsdGEudGhldGEgKiBzY29wZS5kYW1waW5nRmFjdG9yOwogICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpICogc2NvcGUuZGFtcGluZ0ZhY3RvcjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhOwogICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG1pbiA9IHNjb3BlLm1pbkF6aW11dGhBbmdsZTsKICAgICAgICAgICAgICAgIGxldCBtYXggPSBzY29wZS5tYXhBemltdXRoQW5nbGU7CiAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUobWluKSAmJiBpc0Zpbml0ZShtYXgpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA8IC1NYXRoLlBJKSBtaW4gKz0gdHdvUEk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWluID4gTWF0aC5QSSkgbWluIC09IHR3b1BJOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCAtTWF0aC5QSSkgbWF4ICs9IHR3b1BJOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heCA+IE1hdGguUEkpIG1heCAtPSB0d29QSTsKICAgICAgICAgICAgICAgICAgICBpZiAobWluIDw9IG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICBzcGhlcmljYWwudGhldGEgPSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgc3BoZXJpY2FsLnRoZXRhKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsLnRoZXRhID0gc3BoZXJpY2FsLnRoZXRhID4gKG1pbiArIG1heCkgLyAyID8gTWF0aC5tYXgobWluLCBzcGhlcmljYWwudGhldGEpIDogTWF0aC5taW4obWF4LCBzcGhlcmljYWwudGhldGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNwaGVyaWNhbC5waGkgPSBNYXRoLm1heChzY29wZS5taW5Qb2xhckFuZ2xlLCBNYXRoLm1pbihzY29wZS5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7CiAgICAgICAgICAgICAgICBzcGhlcmljYWwubWFrZVNhZmUoKTsKICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVEYW1waW5nID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihwYW5PZmZzZXQsIHNjb3BlLmRhbXBpbmdGYWN0b3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY29wZS50YXJnZXQuYWRkKHBhbk9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzY29wZS50YXJnZXQuc3ViKHNjb3BlLmN1cnNvcik7CiAgICAgICAgICAgICAgICBzY29wZS50YXJnZXQuY2xhbXBMZW5ndGgoc2NvcGUubWluVGFyZ2V0UmFkaXVzLCBzY29wZS5tYXhUYXJnZXRSYWRpdXMpOwogICAgICAgICAgICAgICAgc2NvcGUudGFyZ2V0LmFkZChzY29wZS5jdXJzb3IpOwogICAgICAgICAgICAgICAgaWYgKHNjb3BlLnpvb21Ub0N1cnNvciAmJiBwZXJmb3JtQ3Vyc29yWm9vbSB8fCBzY29wZS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmEpIHsKICAgICAgICAgICAgICAgICAgICBzcGhlcmljYWwucmFkaXVzID0gY2xhbXBEaXN0YW5jZShzcGhlcmljYWwucmFkaXVzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyA9IGNsYW1wRGlzdGFuY2Uoc3BoZXJpY2FsLnJhZGl1cyAqIHNjYWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9mZnNldC5zZXRGcm9tU3BoZXJpY2FsKHNwaGVyaWNhbCk7CiAgICAgICAgICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTsKICAgICAgICAgICAgICAgIHBvc2l0aW9uLmNvcHkoc2NvcGUudGFyZ2V0KS5hZGQob2Zmc2V0KTsKICAgICAgICAgICAgICAgIHNjb3BlLm9iamVjdC5sb29rQXQoc2NvcGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVEYW1waW5nID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsRGVsdGEudGhldGEgKj0gMSAtIHNjb3BlLmRhbXBpbmdGYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpICo9IDEgLSBzY29wZS5kYW1waW5nRmFjdG9yOwogICAgICAgICAgICAgICAgICAgIHBhbk9mZnNldC5tdWx0aXBseVNjYWxhcigxIC0gc2NvcGUuZGFtcGluZ0ZhY3Rvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbERlbHRhLnNldCgwLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBwYW5PZmZzZXQuc2V0KDAsIDAsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuem9vbVRvQ3Vyc29yICYmIHBlcmZvcm1DdXJzb3Jab29tKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1JhZGl1cyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSYWRpdXMgPSBvZmZzZXQubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JhZGl1cyA9IGNsYW1wRGlzdGFuY2UocHJldlJhZGl1cyAqIHNjYWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaXVzRGVsdGEgPSBwcmV2UmFkaXVzIC0gbmV3UmFkaXVzOwogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5vYmplY3QucG9zaXRpb24uYWRkU2NhbGVkVmVjdG9yKGRvbGx5RGlyZWN0aW9uLCByYWRpdXNEZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlQmVmb3JlID0gbmV3IHcobW91c2UueCwgbW91c2UueSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQmVmb3JlLnVucHJvamVjdChzY29wZS5vYmplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5vYmplY3Quem9vbSA9IE1hdGgubWF4KHNjb3BlLm1pblpvb20sIE1hdGgubWluKHNjb3BlLm1heFpvb20sIHNjb3BlLm9iamVjdC56b29tIC8gc2NhbGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb3VzZUFmdGVyID0gbmV3IHcobW91c2UueCwgbW91c2UueSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQWZ0ZXIudW5wcm9qZWN0KHNjb3BlLm9iamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm9iamVjdC5wb3NpdGlvbi5zdWIobW91c2VBZnRlcikuYWRkKG1vdXNlQmVmb3JlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JhZGl1cyA9IG9mZnNldC5sZW5ndGgoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHpvb20gdG8gY3Vyc29yIGRpc2FibGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgICBzY29wZS56b29tVG9DdXJzb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JhZGl1cyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY3JlZW5TcGFjZVBhbm5pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnRhcmdldC5zZXQoMCwgMCwgLTEpLnRyYW5zZm9ybURpcmVjdGlvbihzY29wZS5vYmplY3QubWF0cml4KS5tdWx0aXBseVNjYWxhcihuZXdSYWRpdXMpLmFkZChzY29wZS5vYmplY3QucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JheS5vcmlnaW4uY29weShzY29wZS5vYmplY3QucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JheS5kaXJlY3Rpb24uc2V0KDAsIDAsIC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oc2NvcGUub2JqZWN0Lm1hdHJpeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2NvcGUub2JqZWN0LnVwLmRvdChfcmF5LmRpcmVjdGlvbikpIDwgVElMVF9MSU1JVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5sb29rQXQoc2NvcGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHNjb3BlLm9iamVjdC51cCwgc2NvcGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF5LmludGVyc2VjdFBsYW5lKF9wbGFuZSwgc2NvcGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUub2JqZWN0Lnpvb20gPSBNYXRoLm1heChzY29wZS5taW5ab29tLCBNYXRoLm1pbihzY29wZS5tYXhab29tLCBzY29wZS5vYmplY3Quem9vbSAvIHNjYWxlKSk7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgICAgICAgICAgICAgICAgICB6b29tQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzY2FsZSA9IDE7CiAgICAgICAgICAgICAgICBwZXJmb3JtQ3Vyc29yWm9vbSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHpvb21DaGFuZ2VkIHx8IGxhc3RQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZChzY29wZS5vYmplY3QucG9zaXRpb24pID4gRVBTIHx8IDggKiAoMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdChzY29wZS5vYmplY3QucXVhdGVybmlvbikpID4gRVBTIHx8IGxhc3RUYXJnZXRQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZChzY29wZS50YXJnZXQpID4gMCkgewogICAgICAgICAgICAgICAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoX2NoYW5nZUV2ZW50KTsKICAgICAgICAgICAgICAgICAgICBsYXN0UG9zaXRpb24uY29weShzY29wZS5vYmplY3QucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgIGxhc3RRdWF0ZXJuaW9uLmNvcHkoc2NvcGUub2JqZWN0LnF1YXRlcm5pb24pOwogICAgICAgICAgICAgICAgICAgIGxhc3RUYXJnZXRQb3NpdGlvbi5jb3B5KHNjb3BlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfTsKICAgICAgICB9KCk7CiAgICAgICAgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBvbkNvbnRleHRNZW51KTsKICAgICAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9uUG9pbnRlckRvd24pOwogICAgICAgICAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLCBvblBvaW50ZXJVcCk7CiAgICAgICAgICAgIHNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLCBvbk1vdXNlV2hlZWwpOwogICAgICAgICAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25Qb2ludGVyTW92ZSk7CiAgICAgICAgICAgIHNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25Qb2ludGVyVXApOwogICAgICAgICAgICBpZiAoc2NvcGUuX2RvbUVsZW1lbnRLZXlFdmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHNjb3BlLl9kb21FbGVtZW50S2V5RXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBvbktleURvd24pOwogICAgICAgICAgICAgICAgc2NvcGUuX2RvbUVsZW1lbnRLZXlFdmVudHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgICAgY29uc3QgU1RBVEUgPSB7CiAgICAgICAgICAgIE5PTkU6IC0xLAogICAgICAgICAgICBST1RBVEU6IDAsCiAgICAgICAgICAgIERPTExZOiAxLAogICAgICAgICAgICBQQU46IDIsCiAgICAgICAgICAgIFRPVUNIX1JPVEFURTogMywKICAgICAgICAgICAgVE9VQ0hfUEFOOiA0LAogICAgICAgICAgICBUT1VDSF9ET0xMWV9QQU46IDUsCiAgICAgICAgICAgIFRPVUNIX0RPTExZX1JPVEFURTogNgogICAgICAgIH07CiAgICAgICAgbGV0IHN0YXRlID0gU1RBVEUuTk9ORTsKICAgICAgICBjb25zdCBFUFMgPSAwLjAwMDAwMTsKICAgICAgICBjb25zdCBzcGhlcmljYWwgPSBuZXcgWWgoKTsKICAgICAgICBjb25zdCBzcGhlcmljYWxEZWx0YSA9IG5ldyBZaCgpOwogICAgICAgIGxldCBzY2FsZSA9IDE7CiAgICAgICAgY29uc3QgcGFuT2Zmc2V0ID0gbmV3IHcoKTsKICAgICAgICBjb25zdCByb3RhdGVTdGFydCA9IG5ldyBUKCk7CiAgICAgICAgY29uc3Qgcm90YXRlRW5kID0gbmV3IFQoKTsKICAgICAgICBjb25zdCByb3RhdGVEZWx0YSA9IG5ldyBUKCk7CiAgICAgICAgY29uc3QgcGFuU3RhcnQgPSBuZXcgVCgpOwogICAgICAgIGNvbnN0IHBhbkVuZCA9IG5ldyBUKCk7CiAgICAgICAgY29uc3QgcGFuRGVsdGEgPSBuZXcgVCgpOwogICAgICAgIGNvbnN0IGRvbGx5U3RhcnQgPSBuZXcgVCgpOwogICAgICAgIGNvbnN0IGRvbGx5RW5kID0gbmV3IFQoKTsKICAgICAgICBjb25zdCBkb2xseURlbHRhID0gbmV3IFQoKTsKICAgICAgICBjb25zdCBkb2xseURpcmVjdGlvbiA9IG5ldyB3KCk7CiAgICAgICAgY29uc3QgbW91c2UgPSBuZXcgVCgpOwogICAgICAgIGxldCBwZXJmb3JtQ3Vyc29yWm9vbSA9IGZhbHNlOwogICAgICAgIGNvbnN0IHBvaW50ZXJzID0gW107CiAgICAgICAgY29uc3QgcG9pbnRlclBvc2l0aW9ucyA9IHt9OwogICAgICAgIGZ1bmN0aW9uIGdldEF1dG9Sb3RhdGlvbkFuZ2xlKGRlbHRhVGltZSkgewogICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAqIHNjb3BlLmF1dG9Sb3RhdGVTcGVlZCAqIGRlbHRhVGltZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAyICogTWF0aC5QSSAvIDYwIC8gNjAgKiBzY29wZS5hdXRvUm90YXRlU3BlZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0Wm9vbVNjYWxlKCkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5wb3coMC45NSwgc2NvcGUuem9vbVNwZWVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcm90YXRlTGVmdChhbmdsZSkgewogICAgICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcm90YXRlVXAoYW5nbGUpIHsKICAgICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpIC09IGFuZ2xlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYW5MZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgdygpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFuTGVmdChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7CiAgICAgICAgICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsKICAgICAgICAgICAgICAgIHYubXVsdGlwbHlTY2FsYXIoLWRpc3RhbmNlKTsKICAgICAgICAgICAgICAgIHBhbk9mZnNldC5hZGQodik7CiAgICAgICAgICAgIH07CiAgICAgICAgfSgpOwogICAgICAgIGNvbnN0IHBhblVwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBuZXcgdygpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFuVXAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkgewogICAgICAgICAgICAgICAgaWYgKHNjb3BlLnNjcmVlblNwYWNlUGFubmluZyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsKICAgICAgICAgICAgICAgICAgICB2LmNyb3NzVmVjdG9ycyhzY29wZS5vYmplY3QudXAsIHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdi5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7CiAgICAgICAgICAgICAgICBwYW5PZmZzZXQuYWRkKHYpOwogICAgICAgICAgICB9OwogICAgICAgIH0oKTsKICAgICAgICBjb25zdCBwYW4gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbmV3IHcoKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhbihkZWx0YVgsIGRlbHRhWSkgewogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQ7CiAgICAgICAgICAgICAgICBpZiAoc2NvcGUub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHNjb3BlLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldERpc3RhbmNlID0gb2Zmc2V0Lmxlbmd0aCgpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldERpc3RhbmNlICo9IE1hdGgudGFuKHNjb3BlLm9iamVjdC5mb3YgLyAyICogTWF0aC5QSSAvIDE4MC4wKTsKICAgICAgICAgICAgICAgICAgICBwYW5MZWZ0KDIgKiBkZWx0YVggKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4KTsKICAgICAgICAgICAgICAgICAgICBwYW5VcCgyICogZGVsdGFZICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYSkgewogICAgICAgICAgICAgICAgICAgIHBhbkxlZnQoZGVsdGFYICogKHNjb3BlLm9iamVjdC5yaWdodCAtIHNjb3BlLm9iamVjdC5sZWZ0KSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRXaWR0aCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7CiAgICAgICAgICAgICAgICAgICAgcGFuVXAoZGVsdGFZICogKHNjb3BlLm9iamVjdC50b3AgLSBzY29wZS5vYmplY3QuYm90dG9tKSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKTsKICAgICAgICAgICAgICAgICAgICBzY29wZS5lbmFibGVQYW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9KCk7CiAgICAgICAgZnVuY3Rpb24gZG9sbHlPdXQoZG9sbHlTY2FsZSkgewogICAgICAgICAgICBpZiAoc2NvcGUub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEgfHwgc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICBzY2FsZSAvPSBkb2xseVNjYWxlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpOwogICAgICAgICAgICAgICAgc2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRvbGx5SW4oZG9sbHlTY2FsZSkgewogICAgICAgICAgICBpZiAoc2NvcGUub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEgfHwgc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICBzY2FsZSAqPSBkb2xseVNjYWxlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpOwogICAgICAgICAgICAgICAgc2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZU1vdXNlUGFyYW1ldGVycyhldmVudCkgewogICAgICAgICAgICBpZiAoIXNjb3BlLnpvb21Ub0N1cnNvcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBlcmZvcm1DdXJzb3Jab29tID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgcmVjdCA9IHNjb3BlLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIGNvbnN0IHgxID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDsKICAgICAgICAgICAgY29uc3QgeTEgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7CiAgICAgICAgICAgIGNvbnN0IHcgPSByZWN0LndpZHRoOwogICAgICAgICAgICBjb25zdCBoID0gcmVjdC5oZWlnaHQ7CiAgICAgICAgICAgIG1vdXNlLnggPSB4MSAvIHcgKiAyIC0gMTsKICAgICAgICAgICAgbW91c2UueSA9IC0oeTEgLyBoKSAqIDIgKyAxOwogICAgICAgICAgICBkb2xseURpcmVjdGlvbi5zZXQobW91c2UueCwgbW91c2UueSwgMSkudW5wcm9qZWN0KHNjb3BlLm9iamVjdCkuc3ViKHNjb3BlLm9iamVjdC5wb3NpdGlvbikubm9ybWFsaXplKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsYW1wRGlzdGFuY2UoZGlzdCkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoc2NvcGUubWluRGlzdGFuY2UsIE1hdGgubWluKHNjb3BlLm1heERpc3RhbmNlLCBkaXN0KSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCkgewogICAgICAgICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bkRvbGx5KGV2ZW50KSB7CiAgICAgICAgICAgIHVwZGF0ZU1vdXNlUGFyYW1ldGVycyhldmVudCk7CiAgICAgICAgICAgIGRvbGx5U3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpIHsKICAgICAgICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpIHsKICAgICAgICAgICAgcm90YXRlRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTsKICAgICAgICAgICAgcm90YXRlRGVsdGEuc3ViVmVjdG9ycyhyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KS5tdWx0aXBseVNjYWxhcihzY29wZS5yb3RhdGVTcGVlZCk7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50OwogICAgICAgICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgcm90YXRlVXAoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7CiAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCkgewogICAgICAgICAgICBkb2xseUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7CiAgICAgICAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7CiAgICAgICAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKSB7CiAgICAgICAgICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMCkgewogICAgICAgICAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9sbHlTdGFydC5jb3B5KGRvbGx5RW5kKTsKICAgICAgICAgICAgc2NvcGUudXBkYXRlKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCkgewogICAgICAgICAgICBwYW5FbmQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpOwogICAgICAgICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpLm11bHRpcGx5U2NhbGFyKHNjb3BlLnBhblNwZWVkKTsKICAgICAgICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpOwogICAgICAgICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7CiAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVdoZWVsKGV2ZW50KSB7CiAgICAgICAgICAgIHVwZGF0ZU1vdXNlUGFyYW1ldGVycyhldmVudCk7CiAgICAgICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7CiAgICAgICAgICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7CiAgICAgICAgICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2NvcGUudXBkYXRlKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHsKICAgICAgICAgICAgbGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgICAgIHN3aXRjaChldmVudC5jb2RlKXsKICAgICAgICAgICAgICAgIGNhc2Ugc2NvcGUua2V5cy5VUDoKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogc2NvcGUucm90YXRlU3BlZWQgLyBzY29wZS5kb21FbGVtZW50LmNsaWVudEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFuKDAsIHNjb3BlLmtleVBhblNwZWVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBzY29wZS5rZXlzLkJPVFRPTToKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVVwKC0yICogTWF0aC5QSSAqIHNjb3BlLnJvdGF0ZVNwZWVkIC8gc2NvcGUuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhbigwLCAtc2NvcGUua2V5UGFuU3BlZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIHNjb3BlLmtleXMuTEVGVDoKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiBzY29wZS5yb3RhdGVTcGVlZCAvIHNjb3BlLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwYW4oc2NvcGUua2V5UGFuU3BlZWQsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIHNjb3BlLmtleXMuUklHSFQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSkgewogICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KC0yICogTWF0aC5QSSAqIHNjb3BlLnJvdGF0ZVNwZWVkIC8gc2NvcGUuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhbigtc2NvcGUua2V5UGFuU3BlZWQsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgc2NvcGUudXBkYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSgpIHsKICAgICAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcm90YXRlU3RhcnQuc2V0KHBvaW50ZXJzWzBdLnBhZ2VYLCBwb2ludGVyc1swXS5wYWdlWSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCB4MSA9IDAuNSAqIChwb2ludGVyc1swXS5wYWdlWCArIHBvaW50ZXJzWzFdLnBhZ2VYKTsKICAgICAgICAgICAgICAgIGNvbnN0IHkxID0gMC41ICogKHBvaW50ZXJzWzBdLnBhZ2VZICsgcG9pbnRlcnNbMV0ucGFnZVkpOwogICAgICAgICAgICAgICAgcm90YXRlU3RhcnQuc2V0KHgxLCB5MSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFBhbigpIHsKICAgICAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcGFuU3RhcnQuc2V0KHBvaW50ZXJzWzBdLnBhZ2VYLCBwb2ludGVyc1swXS5wYWdlWSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCB4MSA9IDAuNSAqIChwb2ludGVyc1swXS5wYWdlWCArIHBvaW50ZXJzWzFdLnBhZ2VYKTsKICAgICAgICAgICAgICAgIGNvbnN0IHkxID0gMC41ICogKHBvaW50ZXJzWzBdLnBhZ2VZICsgcG9pbnRlcnNbMV0ucGFnZVkpOwogICAgICAgICAgICAgICAgcGFuU3RhcnQuc2V0KHgxLCB5MSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydERvbGx5KCkgewogICAgICAgICAgICBjb25zdCBkeCA9IHBvaW50ZXJzWzBdLnBhZ2VYIC0gcG9pbnRlcnNbMV0ucGFnZVg7CiAgICAgICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlcnNbMF0ucGFnZVkgLSBwb2ludGVyc1sxXS5wYWdlWTsKICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICAgICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnREb2xseVBhbigpIHsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20pIGhhbmRsZVRvdWNoU3RhcnREb2xseSgpOwogICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUGFuKSBoYW5kbGVUb3VjaFN0YXJ0UGFuKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnREb2xseVJvdGF0ZSgpIHsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20pIGhhbmRsZVRvdWNoU3RhcnREb2xseSgpOwogICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUm90YXRlKSBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZShldmVudCkgewogICAgICAgICAgICBpZiAocG9pbnRlcnMubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0U2Vjb25kUG9pbnRlclBvc2l0aW9uKGV2ZW50KTsKICAgICAgICAgICAgICAgIGNvbnN0IHgxID0gMC41ICogKGV2ZW50LnBhZ2VYICsgcG9zaXRpb24ueCk7CiAgICAgICAgICAgICAgICBjb25zdCB5MSA9IDAuNSAqIChldmVudC5wYWdlWSArIHBvc2l0aW9uLnkpOwogICAgICAgICAgICAgICAgcm90YXRlRW5kLnNldCh4MSwgeTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCkubXVsdGlwbHlTY2FsYXIoc2NvcGUucm90YXRlU3BlZWQpOwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudDsKICAgICAgICAgICAgcm90YXRlTGVmdCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudEhlaWdodCk7CiAgICAgICAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgcm90YXRlU3RhcnQuY29weShyb3RhdGVFbmQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVQYW4oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgcGFuRW5kLnNldChldmVudC5wYWdlWCwgZXZlbnQucGFnZVkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRTZWNvbmRQb2ludGVyUG9zaXRpb24oZXZlbnQpOwogICAgICAgICAgICAgICAgY29uc3QgeDEgPSAwLjUgKiAoZXZlbnQucGFnZVggKyBwb3NpdGlvbi54KTsKICAgICAgICAgICAgICAgIGNvbnN0IHkxID0gMC41ICogKGV2ZW50LnBhZ2VZICsgcG9zaXRpb24ueSk7CiAgICAgICAgICAgICAgICBwYW5FbmQuc2V0KHgxLCB5MSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KS5tdWx0aXBseVNjYWxhcihzY29wZS5wYW5TcGVlZCk7CiAgICAgICAgICAgIHBhbihwYW5EZWx0YS54LCBwYW5EZWx0YS55KTsKICAgICAgICAgICAgcGFuU3RhcnQuY29weShwYW5FbmQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCkgewogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlY29uZFBvaW50ZXJQb3NpdGlvbihldmVudCk7CiAgICAgICAgICAgIGNvbnN0IGR4ID0gZXZlbnQucGFnZVggLSBwb3NpdGlvbi54OwogICAgICAgICAgICBjb25zdCBkeSA9IGV2ZW50LnBhZ2VZIC0gcG9zaXRpb24ueTsKICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICAgICAgICBkb2xseUVuZC5zZXQoMCwgZGlzdGFuY2UpOwogICAgICAgICAgICBkb2xseURlbHRhLnNldCgwLCBNYXRoLnBvdyhkb2xseUVuZC55IC8gZG9sbHlTdGFydC55LCBzY29wZS56b29tU3BlZWQpKTsKICAgICAgICAgICAgZG9sbHlPdXQoZG9sbHlEZWx0YS55KTsKICAgICAgICAgICAgZG9sbHlTdGFydC5jb3B5KGRvbGx5RW5kKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlRG9sbHlQYW4oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20pIGhhbmRsZVRvdWNoTW92ZURvbGx5KGV2ZW50KTsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVBhbikgaGFuZGxlVG91Y2hNb3ZlUGFuKGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlRG9sbHlSb3RhdGUoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20pIGhhbmRsZVRvdWNoTW92ZURvbGx5KGV2ZW50KTsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVJvdGF0ZSkgaGFuZGxlVG91Y2hNb3ZlUm90YXRlKGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25Qb2ludGVyRG93bihldmVudCkgewogICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpOwogICAgICAgICAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uUG9pbnRlck1vdmUpOwogICAgICAgICAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBvblBvaW50ZXJVcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWRkUG9pbnRlcihldmVudCk7CiAgICAgICAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gInRvdWNoIikgewogICAgICAgICAgICAgICAgb25Ub3VjaFN0YXJ0KGV2ZW50KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9uTW91c2VEb3duKGV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblBvaW50ZXJNb3ZlKGV2ZW50KSB7CiAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoIWlzX2luX3NjZW5lKGV2ZW50KSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICJ0b3VjaCIpIHsKICAgICAgICAgICAgICAgIG9uVG91Y2hNb3ZlKGV2ZW50KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9uTW91c2VNb3ZlKGV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblBvaW50ZXJVcChldmVudCkgewogICAgICAgICAgICByZW1vdmVQb2ludGVyKGV2ZW50KTsKICAgICAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTsKICAgICAgICAgICAgICAgIHNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblBvaW50ZXJNb3ZlKTsKICAgICAgICAgICAgICAgIHNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgb25Qb2ludGVyVXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoX2VuZEV2ZW50KTsKICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkgewogICAgICAgICAgICBsZXQgbW91c2VBY3Rpb247CiAgICAgICAgICAgIHN3aXRjaChldmVudC5idXR0b24pewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIG1vdXNlQWN0aW9uID0gc2NvcGUubW91c2VCdXR0b25zLkxFRlQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgbW91c2VBY3Rpb24gPSBzY29wZS5tb3VzZUJ1dHRvbnMuTUlERExFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIG1vdXNlQWN0aW9uID0gc2NvcGUubW91c2VCdXR0b25zLlJJR0hUOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBtb3VzZUFjdGlvbiA9IC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN3aXRjaChtb3VzZUFjdGlvbil7CiAgICAgICAgICAgICAgICBjYXNlIERkLkRPTExZOgogICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93bkRvbGx5KGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLkRPTExZOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBEZC5ST1RBVEU6CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlBBTjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZURvd25Sb3RhdGUoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIERkLlBBTjoKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuUk9UQVRFOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93blBhbihldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuUEFOOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSkgewogICAgICAgICAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudChfc3RhcnRFdmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHsKICAgICAgICAgICAgc3dpdGNoKHN0YXRlKXsKICAgICAgICAgICAgICAgIGNhc2UgU1RBVEUuUk9UQVRFOgogICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW91c2VNb3ZlUm90YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgU1RBVEUuRE9MTFk6CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTW91c2VNb3ZlRG9sbHkoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTVEFURS5QQU46CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZU1vdmVQYW4oZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uTW91c2VXaGVlbChldmVudCkgewogICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgc3RhdGUgIT09IFNUQVRFLk5PTkUgfHwgIWlzX2luX3NjZW5lKGV2ZW50KSkgcmV0dXJuOwogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBzY29wZS5kaXNwYXRjaEV2ZW50KF9zdGFydEV2ZW50KTsKICAgICAgICAgICAgaGFuZGxlTW91c2VXaGVlbChldmVudCk7CiAgICAgICAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoX2VuZEV2ZW50KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7CiAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVkID09PSBmYWxzZSB8fCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgIGhhbmRsZUtleURvd24oZXZlbnQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZXZlbnQpIHsKICAgICAgICAgICAgdHJhY2tQb2ludGVyKGV2ZW50KTsKICAgICAgICAgICAgc3dpdGNoKHBvaW50ZXJzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHNjb3BlLnRvdWNoZXMuT05FKXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMZC5ST1RBVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ST1RBVEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMZC5QQU46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2hTdGFydFBhbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHNjb3BlLnRvdWNoZXMuVFdPKXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMZC5ET0xMWV9QQU46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgJiYgc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2hTdGFydERvbGx5UGFuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX0RPTExZX1BBTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExkLkRPTExZX1JPVEFURToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5lbmFibGVab29tID09PSBmYWxzZSAmJiBzY29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0RG9sbHlSb3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfRE9MTFlfUk9UQVRFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5OT05FKSB7CiAgICAgICAgICAgICAgICBzY29wZS5kaXNwYXRjaEV2ZW50KF9zdGFydEV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblRvdWNoTW92ZShldmVudCkgewogICAgICAgICAgICB0cmFja1BvaW50ZXIoZXZlbnQpOwogICAgICAgICAgICBzd2l0Y2goc3RhdGUpewogICAgICAgICAgICAgICAgY2FzZSBTVEFURS5UT1VDSF9ST1RBVEU6CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTVEFURS5UT1VDSF9QQU46CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVQYW4oZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIHNjb3BlLnVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTVEFURS5UT1VDSF9ET0xMWV9QQU46CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlICYmIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseVBhbihldmVudCk7CiAgICAgICAgICAgICAgICAgICAgc2NvcGUudXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNUQVRFLlRPVUNIX0RPTExZX1JPVEFURToKICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgJiYgc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZURvbGx5Um90YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICBzY29wZS51cGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZFBvaW50ZXIoZXZlbnQpIHsKICAgICAgICAgICAgcG9pbnRlcnMucHVzaChldmVudCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZXZlbnQpIHsKICAgICAgICAgICAgZGVsZXRlIHBvaW50ZXJQb3NpdGlvbnNbZXZlbnQucG9pbnRlcklkXTsKICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHBvaW50ZXJzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIGlmIChwb2ludGVyc1tpXS5wb2ludGVySWQgPT0gZXZlbnQucG9pbnRlcklkKSB7CiAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB0cmFja1BvaW50ZXIoZXZlbnQpIHsKICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gcG9pbnRlclBvc2l0aW9uc1tldmVudC5wb2ludGVySWRdOwogICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgVCgpOwogICAgICAgICAgICAgICAgcG9pbnRlclBvc2l0aW9uc1tldmVudC5wb2ludGVySWRdID0gcG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zaXRpb24uc2V0KGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldFNlY29uZFBvaW50ZXJQb3NpdGlvbihldmVudCkgewogICAgICAgICAgICBjb25zdCBwb2ludGVyID0gZXZlbnQucG9pbnRlcklkID09PSBwb2ludGVyc1swXS5wb2ludGVySWQgPyBwb2ludGVyc1sxXSA6IHBvaW50ZXJzWzBdOwogICAgICAgICAgICByZXR1cm4gcG9pbnRlclBvc2l0aW9uc1twb2ludGVyLnBvaW50ZXJJZF07CiAgICAgICAgfQogICAgICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCBvbkNvbnRleHRNZW51KTsKICAgICAgICBzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgb25Qb2ludGVyRG93bik7CiAgICAgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgb25Qb2ludGVyVXApOwogICAgICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCBvbk1vdXNlV2hlZWwsIHsKICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UKICAgICAgICB9KTsKICAgICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQp9CmZ1bmN0aW9uIGV2ZW50czJ1bml0bGVzcyhzY3JlZW4sIGV2ZW50KSB7CiAgICBjb25zdCB7IGNhbnZhcyAsIHdpbnNjYWxlICwgcmVuZGVyZXIgIH0gPSBzY3JlZW47CiAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgeDEgPSAoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyB3aW5zY2FsZTsKICAgIGNvbnN0IHkxID0gKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgLyB3aW5zY2FsZTsKICAgIHJldHVybiBbCiAgICAgICAgeDEsCiAgICAgICAgcmVuZGVyZXIuX2hlaWdodCAtIHkxCiAgICBdOwp9CmZ1bmN0aW9uIElkZW50aXR5NHg0KCkgewogICAgcmV0dXJuIG5ldyBEKCk7Cn0KZnVuY3Rpb24gaW5fc2NlbmUoc2NlbmUsIG1vdXNlX2V2ZW50KSB7CiAgICBjb25zdCBbeDEsIHkxXSA9IGV2ZW50czJ1bml0bGVzcyhzY2VuZS5zY3JlZW4sIG1vdXNlX2V2ZW50KTsKICAgIGNvbnN0IFtzeCwgc3ksIHN3LCBzaF0gPSBzY2VuZS52aWV3cG9ydC52YWx1ZTsKICAgIHJldHVybiB4MSA+PSBzeCAmJiB4MSA8IHN4ICsgc3cgJiYgeTEgPj0gc3kgJiYgeTEgPCBzeSArIHNoOwp9CmZ1bmN0aW9uIGF0dGFjaF8zZF9jYW1lcmEoY2FudmFzLCBtYWtpZV9jYW1lcmEsIGNhbTNkLCBsaWdodF9kaXIsIHNjZW5lKSB7CiAgICBpZiAoY2FtM2QgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IFt3MSwgaF0gPSBtYWtpZV9jYW1lcmEucmVzb2x1dGlvbi52YWx1ZTsKICAgIGNvbnN0IGNhbWVyYSA9IG5ldyB2dChjYW0zZC5mb3YudmFsdWUsIHcxIC8gaCwgMC4wMSwgMTAwLjApOwogICAgY29uc3QgY2VudGVyID0gbmV3IHcoLi4uY2FtM2QubG9va2F0LnZhbHVlKTsKICAgIGNhbWVyYS51cCA9IG5ldyB3KDAsIDAsIDEpOwogICAgY2FtZXJhLnBvc2l0aW9uLnNldCguLi5jYW0zZC5leWVwb3NpdGlvbi52YWx1ZSk7CiAgICBjYW1lcmEubG9va0F0KGNlbnRlcik7CiAgICBjb25zdCB1c2Vfb3JiaXRfY2FtID0gKCk9PiEoQm9uaXRvLmNhbl9zZW5kX3RvX2p1bGlhICYmIEJvbml0by5jYW5fc2VuZF90b19qdWxpYSgpKTsKICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHMoY2FtZXJhLCBjYW52YXMsIHVzZV9vcmJpdF9jYW0sIChlKT0+aW5fc2NlbmUoc2NlbmUsIGUpKTsKICAgIGNvbnRyb2xzLnRhcmdldCA9IGNlbnRlci5jbG9uZSgpOwogICAgY29udHJvbHMudGFyZ2V0MCA9IGNlbnRlci5jbG9uZSgpOwogICAgc2NlbmUub3JiaXRjb250cm9scyA9IGNvbnRyb2xzOwogICAgY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGUpPT57CiAgICAgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gY2FtM2QucmVzb2x1dGlvbi52YWx1ZTsKICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbjsKICAgICAgICBjb25zdCBsb29rYXQgPSBjb250cm9scy50YXJnZXQ7CiAgICAgICAgY29uc3QgW3gxLCB5MSwgel0gPSBwb3NpdGlvbjsKICAgICAgICBjb25zdCBkaXN0ID0gcG9zaXRpb24uZGlzdGFuY2VUbyhsb29rYXQpOwogICAgICAgIGNhbWVyYS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDsKICAgICAgICBjYW1lcmEubmVhciA9IGRpc3QgKiAwLjE7CiAgICAgICAgY2FtZXJhLmZhciA9IGRpc3QgKiA1OwogICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAgICAgY2FtZXJhLnVwZGF0ZVdvcmxkTWF0cml4KCk7CiAgICAgICAgY29uc3QgdmlldyA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7CiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4OwogICAgICAgIG1ha2llX2NhbWVyYS51cGRhdGVfbWF0cmljZXModmlldy5lbGVtZW50cywgcHJvamVjdGlvbi5lbGVtZW50cywgWwogICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgaGVpZ2h0CiAgICAgICAgXSwgWwogICAgICAgICAgICB4MSwKICAgICAgICAgICAgeTEsCiAgICAgICAgICAgIHoKICAgICAgICBdKTsKICAgICAgICBtYWtpZV9jYW1lcmEudXBkYXRlX2xpZ2h0X2RpcihsaWdodF9kaXIudmFsdWUpOwogICAgfSk7Cn0KZnVuY3Rpb24gbXVsKGEsIGIpIHsKICAgIHJldHVybiBiLmNsb25lKCkubXVsdGlwbHkoYSk7Cn0KZnVuY3Rpb24gb3J0aG9ncmFwaGljcHJvamVjdGlvbihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpuZWFyLCB6ZmFyKSB7CiAgICByZXR1cm4gWwogICAgICAgIDIgLyAocmlnaHQgLSBsZWZ0KSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDIgLyAodG9wIC0gYm90dG9tKSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIC0yIC8gKHpmYXIgLSB6bmVhciksCiAgICAgICAgMCwKICAgICAgICAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KSwKICAgICAgICAtKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKSwKICAgICAgICAtKHpmYXIgKyB6bmVhcikgLyAoemZhciAtIHpuZWFyKSwKICAgICAgICAxCiAgICBdOwp9CmZ1bmN0aW9uIHBpeGVsX3NwYWNlX2ludmVyc2UodywgaCwgbmVhcikgewogICAgcmV0dXJuIFsKICAgICAgICAwLjUgKiB3LAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMC41ICogaCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIG5lYXIsCiAgICAgICAgMCwKICAgICAgICAwLjUgKiB3LAogICAgICAgIDAuNSAqIGgsCiAgICAgICAgMCwKICAgICAgICAxCiAgICBdOwp9CmZ1bmN0aW9uIHJlbGF0aXZlX3NwYWNlKCkgewogICAgY29uc3QgcmVsYXRpdmUgPSBJZGVudGl0eTR4NCgpOwogICAgcmVsYXRpdmUuZnJvbUFycmF5KFsKICAgICAgICAyLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMiwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAwLAogICAgICAgIDEKICAgIF0pOwogICAgcmV0dXJuIHJlbGF0aXZlOwp9CmNsYXNzIE1ha2llQ2FtZXJhIHsKICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgdGhpcy52aWV3ID0gbmV3IFdoKElkZW50aXR5NHg0KCkpOwogICAgICAgIHRoaXMucHJvamVjdGlvbiA9IG5ldyBXaChJZGVudGl0eTR4NCgpKTsKICAgICAgICB0aGlzLnByb2plY3Rpb252aWV3ID0gbmV3IFdoKElkZW50aXR5NHg0KCkpOwogICAgICAgIHRoaXMucGl4ZWxfc3BhY2UgPSBuZXcgV2goSWRlbnRpdHk0eDQoKSk7CiAgICAgICAgdGhpcy5waXhlbF9zcGFjZV9pbnZlcnNlID0gbmV3IFdoKElkZW50aXR5NHg0KCkpOwogICAgICAgIHRoaXMucHJvamVjdGlvbnZpZXdfaW52ZXJzZSA9IG5ldyBXaChJZGVudGl0eTR4NCgpKTsKICAgICAgICB0aGlzLnJlbGF0aXZlX3NwYWNlID0gbmV3IFdoKHJlbGF0aXZlX3NwYWNlKCkpOwogICAgICAgIHRoaXMucmVsYXRpdmVfaW52ZXJzZSA9IG5ldyBXaChyZWxhdGl2ZV9zcGFjZSgpLmludmVydCgpKTsKICAgICAgICB0aGlzLmNsaXBfc3BhY2UgPSBuZXcgV2goSWRlbnRpdHk0eDQoKSk7CiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gbmV3IFdoKG5ldyBUKCkpOwogICAgICAgIHRoaXMuZXllcG9zaXRpb24gPSBuZXcgV2gobmV3IHcoKSk7CiAgICAgICAgdGhpcy5wcmVwcm9qZWN0aW9ucyA9IHt9OwogICAgICAgIHRoaXMub3JpZ2luYWxfbGlnaHRfZGlyZWN0aW9uID0gWwogICAgICAgICAgICAtMSwKICAgICAgICAgICAgLTEsCiAgICAgICAgICAgIC0xCiAgICAgICAgXTsKICAgICAgICB0aGlzLmxpZ2h0X2RpcmVjdGlvbiA9IG5ldyBXaChuZXcgdygtMSwgLTEsIC0xKS5ub3JtYWxpemUoKSk7CiAgICAgICAgdGhpcy5vbl91cGRhdGUgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBjYWxjdWxhdGVfbWF0cmljZXMoKSB7CiAgICAgICAgY29uc3QgW3csIGhdID0gdGhpcy5yZXNvbHV0aW9uLnZhbHVlOwogICAgICAgIGNvbnN0IG5lYXJjbGlwID0gLTEwXzAwMDsKICAgICAgICB0aGlzLnBpeGVsX3NwYWNlLnZhbHVlLmZyb21BcnJheShvcnRob2dyYXBoaWNwcm9qZWN0aW9uKDAsIHcsIDAsIGgsIG5lYXJjbGlwLCAxMF8wMDApKTsKICAgICAgICB0aGlzLnBpeGVsX3NwYWNlX2ludmVyc2UudmFsdWUuZnJvbUFycmF5KHBpeGVsX3NwYWNlX2ludmVyc2UodywgaCwgbmVhcmNsaXApKTsKICAgICAgICBjb25zdCBwcm9qX3ZpZXcgPSBtdWwodGhpcy52aWV3LnZhbHVlLCB0aGlzLnByb2plY3Rpb24udmFsdWUpOwogICAgICAgIHRoaXMucHJvamVjdGlvbnZpZXcudmFsdWUgPSBwcm9qX3ZpZXc7CiAgICAgICAgdGhpcy5wcm9qZWN0aW9udmlld19pbnZlcnNlLnZhbHVlID0gcHJval92aWV3LmNsb25lKCkuaW52ZXJ0KCk7CiAgICAgICAgT2JqZWN0LmtleXModGhpcy5wcmVwcm9qZWN0aW9ucykuZm9yRWFjaCgoa2V5KT0+ewogICAgICAgICAgICBjb25zdCBbc3BhY2UsIG1hcmtlcnNwYWNlXSA9IGtleS5zcGxpdCgiLCIpOwogICAgICAgICAgICB0aGlzLnByZXByb2plY3Rpb25zW2tleV0udmFsdWUgPSB0aGlzLmNhbGN1bGF0ZV9wcmVwcm9qZWN0aW9uX21hdHJpeChzcGFjZSwgbWFya2Vyc3BhY2UpOwogICAgICAgIH0pOwogICAgfQogICAgdXBkYXRlX21hdHJpY2VzKHZpZXcsIHByb2plY3Rpb24sIHJlc29sdXRpb24sIGV5ZXBvcykgewogICAgICAgIHRoaXMudmlldy52YWx1ZS5mcm9tQXJyYXkodmlldyk7CiAgICAgICAgdGhpcy5wcm9qZWN0aW9uLnZhbHVlLmZyb21BcnJheShwcm9qZWN0aW9uKTsKICAgICAgICB0aGlzLnJlc29sdXRpb24udmFsdWUuZnJvbUFycmF5KHJlc29sdXRpb24pOwogICAgICAgIHRoaXMuZXllcG9zaXRpb24udmFsdWUuZnJvbUFycmF5KGV5ZXBvcyk7CiAgICAgICAgdGhpcy5jYWxjdWxhdGVfbWF0cmljZXMoKTsKICAgICAgICB0aGlzLnJlY2FsY3VsYXRlX2xpZ2h0X2RpcigpOwogICAgICAgIGZvciAoY29uc3QgZnVuYyBvZiB0aGlzLm9uX3VwZGF0ZS52YWx1ZXMoKSl7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBmdW5jKHRoaXMpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkdXJpbmcgY2FtZXJhIHVwZGF0ZSBjYWxsYmFjazoiLCBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJlY2FsY3VsYXRlX2xpZ2h0X2RpcigpIHsKICAgICAgICBjb25zdCBsaWdodF9kaXIgPSB0aGlzLm9yaWdpbmFsX2xpZ2h0X2RpcmVjdGlvbjsKICAgICAgICB0aGlzLnVwZGF0ZV9saWdodF9kaXIobGlnaHRfZGlyKTsKICAgIH0KICAgIHVwZGF0ZV9saWdodF9kaXIobGlnaHRfZGlyKSB7CiAgICAgICAgdGhpcy5vcmlnaW5hbF9saWdodF9kaXJlY3Rpb24gPSBsaWdodF9kaXI7CiAgICAgICAgY29uc3QgVCA9IG5ldyBHdCgpLnNldEZyb21NYXRyaXg0KHRoaXMudmlldy52YWx1ZSkuaW52ZXJ0KCk7CiAgICAgICAgY29uc3QgbmV3X2RpciA9IG5ldyB3KCkuZnJvbUFycmF5KGxpZ2h0X2Rpcik7CiAgICAgICAgbmV3X2Rpci5hcHBseU1hdHJpeDMoVCkubm9ybWFsaXplKCk7CiAgICAgICAgdGhpcy5saWdodF9kaXJlY3Rpb24udmFsdWUgPSBuZXdfZGlyOwogICAgfQogICAgY2xpcF90b19zcGFjZShzcGFjZSkgewogICAgICAgIGlmIChzcGFjZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb252aWV3X2ludmVyc2UudmFsdWU7CiAgICAgICAgfSBlbHNlIGlmIChzcGFjZSA9PT0gInBpeGVsIikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5waXhlbF9zcGFjZV9pbnZlcnNlLnZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAoc3BhY2UgPT09ICJyZWxhdGl2ZSIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpdmVfaW52ZXJzZS52YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKHNwYWNlID09PSAiY2xpcCIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpcF9zcGFjZS52YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwYWNlICR7c3BhY2V9IG5vdCByZWNvZ25pemVkYCk7CiAgICAgICAgfQogICAgfQogICAgc3BhY2VfdG9fY2xpcChzcGFjZSkgewogICAgICAgIGlmIChzcGFjZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb252aWV3LnZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAoc3BhY2UgPT09ICJwaXhlbCIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl4ZWxfc3BhY2UudmFsdWU7CiAgICAgICAgfSBlbHNlIGlmIChzcGFjZSA9PT0gInJlbGF0aXZlIikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZV9zcGFjZS52YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKHNwYWNlID09PSAiY2xpcCIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpcF9zcGFjZS52YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwYWNlICR7c3BhY2V9IG5vdCByZWNvZ25pemVkYCk7CiAgICAgICAgfQogICAgfQogICAgY2FsY3VsYXRlX3ByZXByb2plY3Rpb25fbWF0cml4KHNwYWNlLCBtYXJrZXJzcGFjZSkgewogICAgICAgIGNvbnN0IGNwID0gdGhpcy5jbGlwX3RvX3NwYWNlKG1hcmtlcnNwYWNlKTsKICAgICAgICBjb25zdCBzYyA9IHRoaXMuc3BhY2VfdG9fY2xpcChzcGFjZSk7CiAgICAgICAgcmV0dXJuIG11bChzYywgY3ApOwogICAgfQogICAgcHJlcHJvamVjdGlvbl9tYXRyaXgoc3BhY2UsIG1hcmtlcnNwYWNlKSB7CiAgICAgICAgY29uc3Qga2V5ID0gWwogICAgICAgICAgICBzcGFjZSwKICAgICAgICAgICAgbWFya2Vyc3BhY2UKICAgICAgICBdOwogICAgICAgIGNvbnN0IG1hdHJpeF91bmlmb3JtID0gdGhpcy5wcmVwcm9qZWN0aW9uc1trZXldOwogICAgICAgIGlmIChtYXRyaXhfdW5pZm9ybSkgewogICAgICAgICAgICByZXR1cm4gbWF0cml4X3VuaWZvcm07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5jYWxjdWxhdGVfcHJlcHJvamVjdGlvbl9tYXRyaXgoc3BhY2UsIG1hcmtlcnNwYWNlKTsKICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IG5ldyBXaChtYXRyaXgpOwogICAgICAgICAgICB0aGlzLnByZXByb2plY3Rpb25zW2tleV0gPSB1bmlmb3JtOwogICAgICAgICAgICByZXR1cm4gdW5pZm9ybTsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gY3JlYXRlX3Bsb3Qoc2NlbmUsIGRhdGEpIHsKICAgIGNvbnN0IFBsb3RDbGFzcyA9IG1vZDFbZGF0YS5wbG90X3R5cGVdOwogICAgaWYgKHR5cGVvZiBQbG90Q2xhc3MgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGxvdCB0eXBlOiAke2RhdGEucGxvdF90eXBlfWApOwogICAgfQogICAgcmV0dXJuIG5ldyBQbG90Q2xhc3Moc2NlbmUsIGRhdGEpOwp9CmZ1bmN0aW9uIGNvbm5lY3RfcGxvdChzY2VuZSwgcGxvdCkgewogICAgY29uc3QgY2FtID0gc2NlbmUud2dsX2NhbWVyYTsKICAgIGNvbnN0IGlkZW50aXR5ID0gbmV3IFdoKG5ldyBEKCkpOwogICAgY29uc3QgdW5pZm9ybXMgPSBwbG90Lm1lc2ggPyBwbG90Lm1lc2gubWF0ZXJpYWwudW5pZm9ybXMgOiBwbG90LnBsb3RfZGF0YS51bmlmb3JtczsKICAgIGNvbnN0IHNwYWNlID0gcGxvdC5wbG90X2RhdGEuY2FtX3NwYWNlOwogICAgaWYgKHNwYWNlID09ICJkYXRhIikgewogICAgICAgIHVuaWZvcm1zLnZpZXcgPSBjYW0udmlldzsKICAgICAgICB1bmlmb3Jtcy5wcm9qZWN0aW9uID0gY2FtLnByb2plY3Rpb247CiAgICAgICAgdW5pZm9ybXMucHJvamVjdGlvbnZpZXcgPSBjYW0ucHJvamVjdGlvbnZpZXc7CiAgICAgICAgdW5pZm9ybXMuZXllcG9zaXRpb24gPSBjYW0uZXllcG9zaXRpb247CiAgICB9IGVsc2UgaWYgKHNwYWNlID09ICJwaXhlbCIpIHsKICAgICAgICB1bmlmb3Jtcy52aWV3ID0gaWRlbnRpdHk7CiAgICAgICAgdW5pZm9ybXMucHJvamVjdGlvbiA9IGNhbS5waXhlbF9zcGFjZTsKICAgICAgICB1bmlmb3Jtcy5wcm9qZWN0aW9udmlldyA9IGNhbS5waXhlbF9zcGFjZTsKICAgIH0gZWxzZSBpZiAoc3BhY2UgPT0gInJlbGF0aXZlIikgewogICAgICAgIHVuaWZvcm1zLnZpZXcgPSBpZGVudGl0eTsKICAgICAgICB1bmlmb3Jtcy5wcm9qZWN0aW9uID0gY2FtLnJlbGF0aXZlX3NwYWNlOwogICAgICAgIHVuaWZvcm1zLnByb2plY3Rpb252aWV3ID0gY2FtLnJlbGF0aXZlX3NwYWNlOwogICAgfSBlbHNlIGlmIChzcGFjZSA9PSAiY2xpcCIpIHsKICAgICAgICB1bmlmb3Jtcy52aWV3ID0gaWRlbnRpdHk7CiAgICAgICAgdW5pZm9ybXMucHJvamVjdGlvbiA9IGlkZW50aXR5OwogICAgICAgIHVuaWZvcm1zLnByb2plY3Rpb252aWV3ID0gaWRlbnRpdHk7CiAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgU3BhY2UgJHtzcGFjZX0gbm90IHN1cHBvcnRlZCFgKTsKICAgIH0KICAgIGNvbnN0IHsgcHhfcGVyX3VuaXQgIH0gPSBzY2VuZS5zY3JlZW47CiAgICB1bmlmb3Jtcy5yZXNvbHV0aW9uID0gY2FtLnJlc29sdXRpb247CiAgICB1bmlmb3Jtcy5weF9wZXJfdW5pdCA9IG5ldyBXaChweF9wZXJfdW5pdCk7CiAgICBpZiAocGxvdC5wbG90X2RhdGEudW5pZm9ybXMucHJlcHJvamVjdGlvbikgewogICAgICAgIGNvbnN0IHsgc3BhY2UgLCBtYXJrZXJzcGFjZSAgfSA9IHBsb3QucGxvdF9kYXRhOwogICAgICAgIHVuaWZvcm1zLnByZXByb2plY3Rpb24gPSBjYW0ucHJlcHJvamVjdGlvbl9tYXRyaXgoc3BhY2UsIG1hcmtlcnNwYWNlKTsKICAgIH0KICAgIHVuaWZvcm1zLmxpZ2h0X2RpcmVjdGlvbiA9IHNjZW5lLmxpZ2h0X2RpcmVjdGlvbjsKICAgIHVuaWZvcm1zLmFtYmllbnQgPSBzY2VuZS5hbWJpZW50OwogICAgdW5pZm9ybXMubGlnaHRfY29sb3IgPSBzY2VuZS5saWdodF9jb2xvcjsKfQpmdW5jdGlvbiBmaWx0ZXJfYnlfa2V5KGRpY3QsIGtleXMsIGRlZmF1bHRfdmFsdWUgPSBmYWxzZSkgewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICBrZXlzLmZvckVhY2goKGtleSk9PnsKICAgICAgICBjb25zdCB2YWwgPSBkaWN0W2tleV07CiAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZmF1bHRfdmFsdWU7CiAgICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CmNvbnN0IHNjZW5lX2NhY2hlID0ge307CmNvbnN0IHBsb3RfY2FjaGUgPSB7fTsKZnVuY3Rpb24gYWRkX3Bsb3Qoc2NlbmUsIHBsb3RfZGF0YSkgewogICAgY29uc3QgcCA9IGNyZWF0ZV9wbG90KHNjZW5lLCBwbG90X2RhdGEpOwogICAgcGxvdF9jYWNoZVtwLnV1aWRdID0gcC5tZXNoOwogICAgc2NlbmUuYWRkKHAubWVzaCk7CiAgICBjb25zdCBuZXh0X2luc2VydCA9IG5ldyBTZXQoT05fTkVYVF9JTlNFUlQpOwogICAgbmV4dF9pbnNlcnQuZm9yRWFjaCgoZik9PmYoKSk7Cn0KZnVuY3Rpb24gYWRkX3NjZW5lKHNjZW5lX2lkLCB0aHJlZV9zY2VuZSkgewogICAgc2NlbmVfY2FjaGVbc2NlbmVfaWRdID0gdGhyZWVfc2NlbmU7Cn0KZnVuY3Rpb24gZmluZF9zY2VuZShzY2VuZV9pZCkgewogICAgcmV0dXJuIHNjZW5lX2NhY2hlW3NjZW5lX2lkXTsKfQpmdW5jdGlvbiBkZWxldGVfc2NlbmUoc2NlbmVfaWQpIHsKICAgIGNvbnN0IHNjZW5lID0gc2NlbmVfY2FjaGVbc2NlbmVfaWRdOwogICAgaWYgKCFzY2VuZSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGRlbGV0ZV90aHJlZV9zY2VuZShzY2VuZSk7CiAgICB3aGlsZShzY2VuZS5jaGlsZHJlbi5sZW5ndGggPiAwKXsKICAgICAgICBzY2VuZS5yZW1vdmUoc2NlbmUuY2hpbGRyZW5bMF0pOwogICAgfQogICAgZGVsZXRlIHNjZW5lX2NhY2hlW3NjZW5lX2lkXTsKfQpmdW5jdGlvbiBmaW5kX3Bsb3RzKHBsb3RfdXVpZHMpIHsKICAgIGNvbnN0IHBsb3RzID0gW107CiAgICBwbG90X3V1aWRzLmZvckVhY2goKGlkKT0+ewogICAgICAgIGNvbnN0IHBsb3QgPSBwbG90X2NhY2hlW2lkXTsKICAgICAgICBpZiAocGxvdCkgewogICAgICAgICAgICBwbG90cy5wdXNoKHBsb3QpOwogICAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHBsb3RzOwp9CmZ1bmN0aW9uIGRlbGV0ZV9zY2VuZXMoc2NlbmVfdXVpZHMsIHBsb3RfdXVpZHMpIHsKICAgIHBsb3RfdXVpZHMuZm9yRWFjaCgocGxvdF9pZCk9PnsKICAgICAgICBjb25zdCBwbG90ID0gcGxvdF9jYWNoZVtwbG90X2lkXTsKICAgICAgICBpZiAocGxvdCkgewogICAgICAgICAgICBkZWxldGVfcGxvdChwbG90KTsKICAgICAgICB9CiAgICB9KTsKICAgIHNjZW5lX3V1aWRzLmZvckVhY2goKHNjZW5lX2lkKT0+ewogICAgICAgIGRlbGV0ZV9zY2VuZShzY2VuZV9pZCk7CiAgICB9KTsKfQpmdW5jdGlvbiBpbnNlcnRfcGxvdChzY2VuZV9pZCwgcGxvdF9kYXRhKSB7CiAgICBjb25zdCBzY2VuZSA9IGZpbmRfc2NlbmUoc2NlbmVfaWQpOwogICAgcGxvdF9kYXRhLmZvckVhY2goKHBsb3QpPT57CiAgICAgICAgYWRkX3Bsb3Qoc2NlbmUsIHBsb3QpOwogICAgfSk7Cn0KZnVuY3Rpb24gZGVsZXRlX3Bsb3RzKHBsb3RfdXVpZHMpIHsKICAgIGNvbnN0IHBsb3RzID0gZmluZF9wbG90cyhwbG90X3V1aWRzKTsKICAgIHBsb3RzLmZvckVhY2goZGVsZXRlX3Bsb3QpOwp9CmZ1bmN0aW9uIGNvbnZlcnRfdGV4dHVyZShzY2VuZSwgZGF0YSkgewogICAgY29uc3QgdGV4ID0gY3JlYXRlX3RleHR1cmUoc2NlbmUsIGRhdGEpOwogICAgdGV4Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIHRleC5nZW5lcmF0ZU1pcG1hcHMgPSBkYXRhLm1pcG1hcDsKICAgIHRleC5taW5GaWx0ZXIgPSBtb2RbZGF0YS5taW5GaWx0ZXJdOwogICAgdGV4Lm1hZ0ZpbHRlciA9IG1vZFtkYXRhLm1hZ0ZpbHRlcl07CiAgICB0ZXguYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTsKICAgIHRleC53cmFwUyA9IG1vZFtkYXRhLndyYXBTXTsKICAgIGlmIChkYXRhLnNpemUubGVuZ3RoID4gMSkgewogICAgICAgIHRleC53cmFwVCA9IG1vZFtkYXRhLndyYXBUXTsKICAgIH0KICAgIGlmIChkYXRhLnNpemUubGVuZ3RoID4gMikgewogICAgICAgIHRleC53cmFwUiA9IG1vZFtkYXRhLndyYXBSXTsKICAgIH0KICAgIHJldHVybiB0ZXg7Cn0KZnVuY3Rpb24gaXNfdHlwZWRfYXJyYXkoZGF0YSkgewogICAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgZGF0YSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHwgZGF0YSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5Owp9CmZ1bmN0aW9uIHRvX3VuaWZvcm0oc2NlbmUsIGRhdGEpIHsKICAgIGlmIChkYXRhLnR5cGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChkYXRhLnR5cGUgPT0gIlNhbXBsZXIiKSB7CiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0X3RleHR1cmUoc2NlbmUsIGRhdGEpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUgJHtkYXRhLnR5cGV9IG5vdCBrbm93bmApOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7CiAgICAgICAgaWYgKCFkYXRhLmV2ZXJ5KCh4MSk9PnR5cGVvZiB4MSA9PT0gIm51bWJlciIpKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9fdGhyZWVfdmVjdG9yKGRhdGEpOwogICAgfQogICAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gZGVzZXJpYWxpemVfdW5pZm9ybXMoc2NlbmUsIGRhdGEpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgZm9yKGNvbnN0IG5hbWUgaW4gZGF0YSl7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW25hbWVdOwogICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIG1vZC5Vbmlmb3JtKSB7CiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHNlciA9IHRvX3VuaWZvcm0oc2NlbmUsIHZhbHVlKTsKICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gbmV3IG1vZC5Vbmlmb3JtKHNlcik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQpjb25zdCBPTl9ORVhUX0lOU0VSVCA9IG5ldyBTZXQoKTsKZnVuY3Rpb24gb25fbmV4dF9pbnNlcnQoZikgewogICAgT05fTkVYVF9JTlNFUlQuYWRkKGYpOwp9CmZ1bmN0aW9uIGFkZF9nbHlwaHNfZnJvbV9wbG90cyhzY2VuZV9kYXRhKSB7CiAgICBjb25zdCBhdGxhcyA9IGdldF90ZXh0dXJlX2F0bGFzKCk7CiAgICBzY2VuZV9kYXRhLnBsb3RzLmZvckVhY2goKHBsb3RfZGF0YSk9PnsKICAgICAgICBpZiAocGxvdF9kYXRhLmdseXBoX2RhdGEpIHsKICAgICAgICAgICAgY29uc3QgZ2x5cGhfZGF0YSA9IHBsb3RfZGF0YS5nbHlwaF9kYXRhOwogICAgICAgICAgICBjb25zdCB7IGF0bGFzX3VwZGF0ZXMgIH0gPSBnbHlwaF9kYXRhOwogICAgICAgICAgICBpZiAoYXRsYXNfdXBkYXRlcykgewogICAgICAgICAgICAgICAgYXRsYXMuaW5zZXJ0X2dseXBocyhhdGxhc191cGRhdGVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgc2NlbmVfZGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCk9PnsKICAgICAgICBhZGRfZ2x5cGhzX2Zyb21fcGxvdHMoY2hpbGQpOwogICAgfSk7Cn0KZnVuY3Rpb24gZGVzZXJpYWxpemVfc2NlbmUoZGF0YSwgc2NyZWVuKSB7CiAgICBhZGRfZ2x5cGhzX2Zyb21fcGxvdHMoZGF0YSk7CiAgICByZXR1cm4gZGVzZXJpYWxpemVfc2NlbmVfcmVjdXJzaXZlKGRhdGEsIHNjcmVlbik7Cn0KZnVuY3Rpb24gZGVzZXJpYWxpemVfc2NlbmVfcmVjdXJzaXZlKGRhdGEsIHNjcmVlbikgewogICAgY29uc3Qgc2NlbmUgPSBuZXcgbW9kLlNjZW5lKCk7CiAgICBzY2VuZS5zY3JlZW4gPSBzY3JlZW47CiAgICBjb25zdCB7IGNhbnZhcyAgfSA9IHNjcmVlbjsKICAgIGFkZF9zY2VuZShkYXRhLnV1aWQsIHNjZW5lKTsKICAgIHNjZW5lLnNjZW5lX3V1aWQgPSBkYXRhLnV1aWQ7CiAgICBzY2VuZS5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7CiAgICBzY2VuZS52aWV3cG9ydCA9IGRhdGEudmlld3BvcnQ7CiAgICBzY2VuZS5iYWNrZ3JvdW5kY29sb3IgPSBkYXRhLmJhY2tncm91bmRjb2xvcjsKICAgIHNjZW5lLmJhY2tncm91bmRjb2xvcl9hbHBoYSA9IGRhdGEuYmFja2dyb3VuZGNvbG9yX2FscGhhOwogICAgc2NlbmUuY2xlYXJzY2VuZSA9IGRhdGEuY2xlYXJzY2VuZTsKICAgIHNjZW5lLnZpc2libGUgPSBkYXRhLnZpc2libGU7CiAgICBjb25zdCBjYW1lcmEgPSBuZXcgTWFraWVDYW1lcmEoKTsKICAgIHNjZW5lLndnbF9jYW1lcmEgPSBjYW1lcmE7CiAgICBmdW5jdGlvbiB1cGRhdGVfY2FtKGNhbWVyYV9tYXRyaWNlcywgZm9yY2UpIHsKICAgICAgICBpZiAoIWZvcmNlKSB7CiAgICAgICAgICAgIGlmICghKEJvbml0by5jYW5fc2VuZF90b19qdWxpYSAmJiBCb25pdG8uY2FuX3NlbmRfdG9fanVsaWEoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBbdmlldywgcHJvamVjdGlvbiwgcmVzb2x1dGlvbiwgZXllcG9zXSA9IGNhbWVyYV9tYXRyaWNlczsKICAgICAgICBjYW1lcmEudXBkYXRlX21hdHJpY2VzKHZpZXcsIHByb2plY3Rpb24sIHJlc29sdXRpb24sIGV5ZXBvcyk7CiAgICB9CiAgICBpZiAoZGF0YS5jYW0zZF9zdGF0ZSkgewogICAgICAgIGF0dGFjaF8zZF9jYW1lcmEoY2FudmFzLCBjYW1lcmEsIGRhdGEuY2FtM2Rfc3RhdGUsIGRhdGEubGlnaHRfZGlyZWN0aW9uLCBzY2VuZSk7CiAgICB9CiAgICB1cGRhdGVfY2FtKGRhdGEuY2FtZXJhLnZhbHVlLCB0cnVlKTsKICAgIGRhdGEuY2FtZXJhLm9uKHVwZGF0ZV9jYW0pOwogICAgaWYgKGRhdGEuY2FtZXJhX3JlbGF0aXZlX2xpZ2h0LnZhbHVlKSB7CiAgICAgICAgY2FtZXJhLnVwZGF0ZV9saWdodF9kaXIoZGF0YS5saWdodF9kaXJlY3Rpb24udmFsdWUpOwogICAgICAgIHNjZW5lLmxpZ2h0X2RpcmVjdGlvbiA9IGNhbWVyYS5saWdodF9kaXJlY3Rpb247CiAgICAgICAgZGF0YS5saWdodF9kaXJlY3Rpb24ub24oKHZhbHVlKT0+ewogICAgICAgICAgICBjYW1lcmEudXBkYXRlX2xpZ2h0X2Rpcih2YWx1ZSk7CiAgICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpZ2h0X2RpciA9IG5ldyBtb2QuVmVjdG9yMygpLmZyb21BcnJheShkYXRhLmxpZ2h0X2RpcmVjdGlvbi52YWx1ZSk7CiAgICAgICAgc2NlbmUubGlnaHRfZGlyZWN0aW9uID0gbmV3IG1vZC5Vbmlmb3JtKGxpZ2h0X2Rpcik7CiAgICAgICAgZGF0YS5saWdodF9kaXJlY3Rpb24ub24oKHZhbHVlKT0+ewogICAgICAgICAgICBzY2VuZS5saWdodF9kaXJlY3Rpb24udmFsdWUuZnJvbUFycmF5KHZhbHVlKTsKICAgICAgICB9KTsKICAgIH0KICAgIGNvbnN0IGFtYmllbnQgPSBuZXcgbW9kLlZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5hbWJpZW50LnZhbHVlKTsKICAgIHNjZW5lLmFtYmllbnQgPSBuZXcgbW9kLlVuaWZvcm0oYW1iaWVudCk7CiAgICBkYXRhLmFtYmllbnQub24oKHZhbHVlKT0+ewogICAgICAgIHNjZW5lLmFtYmllbnQudmFsdWUuZnJvbUFycmF5KHZhbHVlKTsKICAgIH0pOwogICAgY29uc3QgbGlnaHRfY29sb3IgPSBuZXcgbW9kLlZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5saWdodF9jb2xvci52YWx1ZSk7CiAgICBzY2VuZS5saWdodF9jb2xvciA9IG5ldyBtb2QuVW5pZm9ybShsaWdodF9jb2xvcik7CiAgICBkYXRhLmxpZ2h0X2NvbG9yLm9uKCh2YWx1ZSk9PnsKICAgICAgICBzY2VuZS5saWdodF9jb2xvci52YWx1ZS5mcm9tQXJyYXkodmFsdWUpOwogICAgfSk7CiAgICBkYXRhLnBsb3RzLmZvckVhY2goKHBsb3RfZGF0YSk9PnsKICAgICAgICBhZGRfcGxvdChzY2VuZSwgcGxvdF9kYXRhKTsKICAgIH0pOwogICAgc2NlbmUuc2NlbmVfY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuLm1hcCgoY2hpbGQpPT57CiAgICAgICAgY29uc3QgY2hpbGRzY2VuZSA9IGRlc2VyaWFsaXplX3NjZW5lX3JlY3Vyc2l2ZShjaGlsZCwgc2NyZWVuKTsKICAgICAgICByZXR1cm4gY2hpbGRzY2VuZTsKICAgIH0pOwogICAgcmV0dXJuIHNjZW5lOwp9CmZ1bmN0aW9uIGRlbGV0ZV9wbG90KHBsb3QpIHsKICAgIHBsb3QucGxvdF9vYmplY3QuZGlzcG9zZSgpOwp9CmZ1bmN0aW9uIGRlbGV0ZV90aHJlZV9zY2VuZShzY2VuZSkgewogICAgZGVsZXRlIHNjZW5lX2NhY2hlW3NjZW5lLnNjZW5lX3V1aWRdOwogICAgc2NlbmUuc2NlbmVfY2hpbGRyZW4uZm9yRWFjaChkZWxldGVfdGhyZWVfc2NlbmUpOwogICAgd2hpbGUoc2NlbmUuY2hpbGRyZW4ubGVuZ3RoID4gMCl7CiAgICAgICAgZGVsZXRlX3Bsb3Qoc2NlbmUuY2hpbGRyZW5bMF0pOwogICAgfQp9CmZ1bmN0aW9uIGV4cGFuZF9jb21wcmVzc2VkKG5ld19kYXRhKSB7CiAgICBpZiAobmV3X2RhdGEgJiYgdHlwZW9mIG5ld19kYXRhID09PSAib2JqZWN0IiAmJiAidmFsdWUiIGluIG5ld19kYXRhICYmICJsZW5ndGgiIGluIG5ld19kYXRhKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXdfZGF0YS52YWx1ZTsKICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgY29uc3QgZWxlbWVudF9zaXplID0gdmFsdWUubGVuZ3RoOwogICAgICAgICAgICBjb25zdCB0b3RhbF9zaXplID0gbmV3X2RhdGEubGVuZ3RoICogZWxlbWVudF9zaXplOwogICAgICAgICAgICBjb25zdCBleHBhbmRlZF9hcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxfc2l6ZSk7CiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBuZXdfZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBleHBhbmRlZF9hcnJheS5zZXQodmFsdWUsIGkgKiBlbGVtZW50X3NpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBleHBhbmRlZF9hcnJheTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShuZXdfZGF0YS5sZW5ndGgpLmZpbGwodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdfZGF0YTsKfQpjbGFzcyBQbG90IHsKICAgIG1lc2ggPSB1bmRlZmluZWQ7CiAgICBwYXJlbnQgPSB1bmRlZmluZWQ7CiAgICB1dWlkID0gIiI7CiAgICBuYW1lID0gIiI7CiAgICBpc19pbnN0YW5jZWQgPSBmYWxzZTsKICAgIGdlb21ldHJ5X25lZWRzX3JlY3JlYXRpb24gPSBmYWxzZTsKICAgIHBsb3RfZGF0YSA9IHt9OwogICAgZGVzZXJpYWxpemVkX3VuaWZvcm1zID0ge307CiAgICB0eXBlID0gIiI7CiAgICBjb25zdHJ1Y3RvcihzY2VuZSwgZGF0YSl7CiAgICAgICAgdGhpcy5wbG90X2RhdGEgPSBkYXRhOwogICAgICAgIGNvbm5lY3RfcGxvdChzY2VuZSwgdGhpcyk7CiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZWRfdW5pZm9ybXMgPSBkZXNlcmlhbGl6ZV91bmlmb3JtcyhzY2VuZSwgZGF0YS51bmlmb3Jtcyk7CiAgICAgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lOwogICAgICAgIHRoaXMudXVpZCA9IGRhdGEudXVpZDsKICAgICAgICB0aGlzLnBhcmVudCA9IHNjZW5lOwogICAgICAgIGRhdGEudXBkYXRlci5vbigoZGF0YSk9PnsKICAgICAgICAgICAgdGhpcy51cGRhdGUoZGF0YSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBpbml0X21lc2goKSB7CiAgICAgICAgdGhpcy5tZXNoLnBsb3RfdXVpZCA9IHRoaXMucGxvdF9kYXRhLnV1aWQ7CiAgICAgICAgdGhpcy5tZXNoLmZydXN0dW1DdWxsZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLm1lc2gubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICAgIHRoaXMubWVzaC5yZW5kZXJPcmRlciA9IHRoaXMucGxvdF9kYXRhLnp2YWx1ZTsKICAgICAgICB0aGlzLm1lc2gucGxvdF9vYmplY3QgPSB0aGlzOwogICAgICAgIHRoaXMubWVzaC52aXNpYmxlID0gdGhpcy5wbG90X2RhdGEudmlzaWJsZTsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgZGVsZXRlIHBsb3RfY2FjaGVbdGhpcy51dWlkXTsKICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmUodGhpcy5tZXNoKTsKICAgICAgICB0aGlzLm1lc2guZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgICAgIHRoaXMubWVzaC5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICAgICAgdGhpcy5tZXNoID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuaXNfaW5zdGFuY2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5nZW9tZXRyeV9uZWVkc19yZWNyZWF0aW9uID0gZmFsc2U7CiAgICAgICAgdGhpcy5wbG90X2RhdGEgPSB7fTsKICAgIH0KICAgIG1vdmVfdG8oc2NlbmUpIHsKICAgICAgICBpZiAoc2NlbmUgPT09IHRoaXMucGFyZW50KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMubWVzaCk7CiAgICAgICAgY29ubmVjdF9wbG90KHNjZW5lLCB0aGlzKTsKICAgICAgICBzY2VuZS5hZGQodGhpcy5tZXNoKTsKICAgICAgICB0aGlzLnBhcmVudCA9IHNjZW5lOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHVwZGF0ZShkYXRhKSB7CiAgICAgICAgY29uc3QgeyBtZXNoICB9ID0gdGhpczsKICAgICAgICBpZiAoIW1lc2gpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIHBsb3QgJHt0aGlzLm5hbWV9ICgke3RoaXMudXVpZH0pIHdpdGggZGF0YTpgKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyBnZW9tZXRyeSAgfSA9IG1lc2g7CiAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzICwgaW50ZXJsZWF2ZWRfYXR0cmlidXRlcyAgfSA9IGdlb21ldHJ5OwogICAgICAgIGNvbnN0IHsgdW5pZm9ybXMgIH0gPSBtZXNoLm1hdGVyaWFsOwogICAgICAgIGRhdGEuZm9yRWFjaCgoW2tleSwgdmFsdWVdKT0+ewogICAgICAgICAgICBpZiAoa2V5IGluIHVuaWZvcm1zKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV91bmlmb3JtKGtleSwgdmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBhdHRyaWJ1dGVzIHx8IGludGVybGVhdmVkX2F0dHJpYnV0ZXMgJiYga2V5IGluIGludGVybGVhdmVkX2F0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX2J1ZmZlcihrZXksIHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICJmYWNlcyIpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX2ZhY2VzKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICJ2aXNpYmxlIikgewogICAgICAgICAgICAgICAgdGhpcy5tZXNoLnZpc2libGUgPSB2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBrZXkgJHtrZXl9IGluIFBsb3Q6ICR7dGhpcy5uYW1lfWApOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5hcHBseV91cGRhdGVzKCk7CiAgICB9CiAgICB1cGRhdGVfdW5pZm9ybShuYW1lLCBuZXdfZGF0YSkgewogICAgICAgIGNvbnN0IHVuaWZvcm0gPSB0aGlzLm1lc2gubWF0ZXJpYWwudW5pZm9ybXNbbmFtZV07CiAgICAgICAgaWYgKCF1bmlmb3JtKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pZm9ybSAke25hbWV9IGRvZXNuJ3QgZXhpc3QgaW4gUGxvdDogJHt0aGlzLm5hbWV9YCk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZV91bmlmb3JtKHVuaWZvcm0sIG5ld19kYXRhKTsKICAgIH0KICAgIHVwZGF0ZV9idWZmZXIobmFtZSwgaW5wdXRfZGF0YSkgewogICAgICAgIGNvbnN0IG5ld19kYXRhID0gZXhwYW5kX2NvbXByZXNzZWQoaW5wdXRfZGF0YSk7CiAgICAgICAgY29uc3QgeyBnZW9tZXRyeSAgfSA9IHRoaXMubWVzaDsKICAgICAgICBsZXQgYnVmZmVyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICAgICBidWZmZXIgPSBnZW9tZXRyeS5pbnRlcmxlYXZlZF9hdHRyaWJ1dGVzW25hbWVdOwogICAgICAgICAgICBpZiAoIWJ1ZmZlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWZmZXIgJHtuYW1lfSBkb2Vzbid0IGV4aXN0IGluIFBsb3Q6ICR7dGhpcy5uYW1lfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9sZF9sZW5ndGggPSBidWZmZXIuYXJyYXkubGVuZ3RoOwogICAgICAgIGNvbnN0IGlzX2ludGVybGVhdmVkID0gYnVmZmVyIGluc3RhbmNlb2YgcWg7CiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gaXNfaW50ZXJsZWF2ZWQgPyBmaW5kX2ludGVybGVhdmVkX2F0dHJpYnV0ZShnZW9tZXRyeSwgYnVmZmVyKSA6IGJ1ZmZlcjsKICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGdlb21ldHJ5LmludGVybGVhdmVkX2F0dHJpYnV0ZXMpOwogICAgICAgICAgICBjb25zb2xlLmxvZyhnZW9tZXRyeS5hdHRyaWJ1dGVzKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbmV3X2NvdW50ID0gbmV3X2RhdGEubGVuZ3RoIC8gYXR0cmlidXRlLml0ZW1TaXplOwogICAgICAgIGlmIChuZXdfZGF0YS5sZW5ndGggPD0gb2xkX2xlbmd0aCkgewogICAgICAgICAgICBidWZmZXIuc2V0KG5ld19kYXRhKTsKICAgICAgICAgICAgYnVmZmVyLmNvdW50ID0gbmV3X2NvdW50OwogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIExpbmVzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpc19zZWdtZW50cyA9IHRoaXMuaXNfc2VnbWVudHMgPT09IHRydWU7CiAgICAgICAgICAgICAgICBjb25zdCBza2lwcGVkID0gbmV3X2NvdW50IC8gKGJ1ZmZlci5zdHJpZGUgLyBhdHRyaWJ1dGUuaXRlbVNpemUpOwogICAgICAgICAgICAgICAgYnVmZmVyLmNvdW50ID0gTWF0aC5tYXgoMCwgaXNfc2VnbWVudHMgPyBNYXRoLmZsb29yKHNraXBwZWQgLSAxKSA6IHNraXBwZWQgLSAzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWZmZXIubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlci5uZXdfZGF0YSA9IG5ld19kYXRhOwogICAgICAgICAgICB0aGlzLmdlb21ldHJ5X25lZWRzX3JlY3JlYXRpb24gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc19pbnN0YW5jZWQpIHsKICAgICAgICAgICAgdGhpcy5tZXNoLmdlb21ldHJ5Lmluc3RhbmNlQ291bnQgPSBhdHRyaWJ1dGUuY291bnQ7CiAgICAgICAgfQogICAgfQogICAgYXBwbHlfdXBkYXRlcygpIHsKICAgICAgICBpZiAodGhpcy5nZW9tZXRyeV9uZWVkc19yZWNyZWF0aW9uKSB7CiAgICAgICAgICAgIGNvbnN0IHsgZ2VvbWV0cnkgIH0gPSB0aGlzLm1lc2g7CiAgICAgICAgICAgIGNvbnN0IG5ld19nZW9tZXRyeSA9IHJlX2NyZWF0ZV9nZW9tZXRyeShnZW9tZXRyeSwgdGhpcy5pc19zZWdtZW50cyA9PT0gdHJ1ZSk7CiAgICAgICAgICAgIGdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgICAgICAgdGhpcy5tZXNoLmdlb21ldHJ5ID0gbmV3X2dlb21ldHJ5OwogICAgICAgICAgICB0aGlzLm1lc2gubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmdlb21ldHJ5X25lZWRzX3JlY3JlYXRpb24gPSBmYWxzZTsKICAgIH0KICAgIHVwZGF0ZV9mYWNlcyhmYWNlX2RhdGEpIHsKICAgICAgICB0aGlzLm1lc2guZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFooZmFjZV9kYXRhLCAxKSk7CiAgICB9Cn0KZnVuY3Rpb24gbGluZXNfdmVydGV4X3NoYWRlcih1bmlmb3JtcywgYXR0cmlidXRlcywgaXNfbGluZXNlZ21lbnRzKSB7CiAgICBjb25zdCBhdHRyaWJ1dGVfZGVjbCA9IGF0dHJpYnV0ZXNfdG9fdHlwZV9kZWNsYXJhdGlvbihhdHRyaWJ1dGVzKTsKICAgIGNvbnN0IHVuaWZvcm1fZGVjbCA9IHVuaWZvcm1zX3RvX3R5cGVfZGVjbGFyYXRpb24odW5pZm9ybXMpOwogICAgY29uc3QgY29sb3IgPSBhdHRyaWJ1dGVfdHlwZShhdHRyaWJ1dGVzLmxpbmVfY29sb3Jfc3RhcnQpIHx8IHVuaWZvcm1fdHlwZSh1bmlmb3Jtcy5saW5lX2NvbG9yX3N0YXJ0KTsKICAgIGlmIChpc19saW5lc2VnbWVudHMpIHsKICAgICAgICByZXR1cm4gYHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGludDsKICAgICAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDsKICAgICAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIzRDsKCiAgICAgICAgICAgICR7YXR0cmlidXRlX2RlY2x9CgogICAgICAgICAgICBvdXQgdmVjMyBmX3F1YWRfc2RmOwogICAgICAgICAgICBvdXQgdmVjMiBmX3RydW5jYXRpb247ICAgICAgICAgICAgICAvLyBpbnZhbGlkIC8gbm90IG5lZWRlZAogICAgICAgICAgICBvdXQgZmxvYXQgZl9saW5lc3RhcnQ7ICAgICAgICAgICAgICAvLyBjb25zdGFudAogICAgICAgICAgICBvdXQgZmxvYXQgZl9saW5lbGVuZ3RoOwoKICAgICAgICAgICAgZmxhdCBvdXQgdmVjMiBmX2V4dHJ1c2lvbjsgICAgICAgICAgLy8gaW52YWxpZCAvIG5vdCBuZWVkZWQKICAgICAgICAgICAgZmxhdCBvdXQgZmxvYXQgZl9saW5ld2lkdGg7CiAgICAgICAgICAgIGZsYXQgb3V0IHZlYzQgZl9wYXR0ZXJuX292ZXJ3cml0ZTsgIC8vIGludmFsaWQgLyBub3QgbmVlZGVkCiAgICAgICAgICAgIGZsYXQgb3V0IHVpbnQgZl9pbnN0YW5jZV9pZDsKICAgICAgICAgICAgZmxhdCBvdXQgJHtjb2xvcn0gZl9jb2xvcjE7CiAgICAgICAgICAgIGZsYXQgb3V0ICR7Y29sb3J9IGZfY29sb3IyOwogICAgICAgICAgICBmbGF0IG91dCBmbG9hdCBmX2FscGhhX3dlaWdodDsKICAgICAgICAgICAgZmxhdCBvdXQgZmxvYXQgZl9jdW11bGF0aXZlX2xlbmd0aDsKICAgICAgICAgICAgZmxhdCBvdXQgaXZlYzIgZl9jYXBtb2RlOwogICAgICAgICAgICBmbGF0IG91dCB2ZWM0IGZfbGluZXBvaW50czsgICAgICAgICAvLyBpbnZhbGlkIC8gbm90IG5lZWRlZAogICAgICAgICAgICBmbGF0IG91dCB2ZWM0IGZfbWl0ZXJfdmVjczsgICAgICAgICAvLyBpbnZhbGlkIC8gbm90IG5lZWRlZAoKICAgICAgICAgICAgJHt1bmlmb3JtX2RlY2x9CiAgICAgICAgICAgIHVuaWZvcm0gdmVjNCB1bmlmb3JtX2NsaXBfcGxhbmVzWzhdOwoKICAgICAgICAgICAgLy8gQ29uc3RhbnRzCiAgICAgICAgICAgIGNvbnN0IGZsb2F0IEFBX1JBRElVUyA9IDAuODsKICAgICAgICAgICAgY29uc3QgZmxvYXQgQUFfVEhJQ0tORVNTID0gMi4wICogQUFfUkFESVVTOwoKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLyBHZW9tZXRyeS9Qb3NpdGlvbiBVdGlscwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZlYzQgY2xpcF9zcGFjZSh2ZWMzIHBvaW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdGlvbnZpZXcgKiBtb2RlbF9mMzJjICogdmVjNChwb2ludCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmVjNCBjbGlwX3NwYWNlKHZlYzIgcG9pbnQpIHsgcmV0dXJuIGNsaXBfc3BhY2UodmVjMyhwb2ludCwgMCkpOyB9CgogICAgICAgICAgICB2ZWMzIHNjcmVlbl9zcGFjZSh2ZWM0IHZlcnRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZlYzMoCiAgICAgICAgICAgICAgICAgICAgKDAuNSAqIHZlcnRleC54eSAvIHZlcnRleC53ICsgMC41KSAqIHB4X3Blcl91bml0ICogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgueiAvIHZlcnRleC53ICsgZGVwdGhfc2hpZnQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZlYzIgbm9ybWFsX3ZlY3RvcihpbiB2ZWMyIHYpIHsgcmV0dXJuIHZlYzIoLXYueSwgdi54KTsgfQogICAgICAgICAgICB2ZWMyIG5vcm1hbF92ZWN0b3IoaW4gdmVjMyB2KSB7IHJldHVybiB2ZWMyKC12LnksIHYueCk7IH0KCiAgICAgICAgICAgIHZvaWQgcHJvY2Vzc19jbGlwX3BsYW5lcyhpbm91dCB2ZWM0IHAxLCBpbm91dCB2ZWM0IHAyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmbG9hdCBkMSwgZDI7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludCh1bmlmb3JtX251bV9jbGlwX3BsYW5lcyk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8vIGRpc3RhbmNlIGZyb20gY2xpcCBwbGFuZXMgd2l0aCBuZWdhdGl2ZSBjbGlwcGVkCiAgICAgICAgICAgICAgICAgICAgZDEgPSBkb3QocDEueHl6LCB1bmlmb3JtX2NsaXBfcGxhbmVzW2ldLnh5eikgLSB1bmlmb3JtX2NsaXBfcGxhbmVzW2ldLncgKiBwMS53OwogICAgICAgICAgICAgICAgICAgIGQyID0gZG90KHAyLnh5eiwgdW5pZm9ybV9jbGlwX3BsYW5lc1tpXS54eXopIC0gdW5pZm9ybV9jbGlwX3BsYW5lc1tpXS53ICogcDIudzsKCiAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlIC0gY2xpcCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgMC4wICYmIGQyIDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gcDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIG9uZSBvdXRzaWRlIC0gc2hvcnRlbiBzZWdtZW50CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAwLjApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2x2ZSAwID0gbSAqIHQgKyBiID0gKGQyIC0gZDEpICogdCArIGQxIHdpdGggdCBpbiAoMCwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgcDEgICAgICAgPSBwMSAgICAgICAtIGQxICogKHAyIC0gcDEpICAgICAgICAgICAgIC8gKGQyIC0gZDEpOwogICAgICAgICAgICAgICAgICAgICAgICBmX2NvbG9yMSA9IGZfY29sb3IxIC0gZDEgKiAoZl9jb2xvcjIgLSBmX2NvbG9yMSkgLyAoZDIgLSBkMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQyIDwgMC4wKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcDIgICAgICAgPSBwMiAgICAgICAtIGQyICogKHAxIC0gcDIpICAgICAgICAgICAgIC8gKGQxIC0gZDIpOwogICAgICAgICAgICAgICAgICAgICAgICBmX2NvbG9yMiA9IGZfY29sb3IyIC0gZDIgKiAoZl9jb2xvcjEgLSBmX2NvbG9yMikgLyAoZDEgLSBkMik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLyBNYWluCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCiAgICAgICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5kID0gcG9zaXRpb24ueCA9PSAxLjA7CgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBsaW5lIGdlb21ldHJ5IChwb3NpdGlvbiwgZGlyZWN0aW9ucykKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gcHhfcGVyX3VuaXQgKiAoaXNfZW5kID8gdW5pZm9ybV9saW5ld2lkdGhfZW5kIDogdW5pZm9ybV9saW5ld2lkdGhfc3RhcnQpOwogICAgICAgICAgICAgICAgZmxvYXQgaGFsZndpZHRoID0gMC41ICogbWF4KEFBX1JBRElVUywgd2lkdGgpOwoKICAgICAgICAgICAgICAgIC8vIGNvbG9yIGF0IGxpbmUgc3RhcnQvZW5kIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICAgICBmX2NvbG9yMSA9IGxpbmVfY29sb3Jfc3RhcnQ7CiAgICAgICAgICAgICAgICBmX2NvbG9yMiA9IGxpbmVfY29sb3JfZW5kOwoKICAgICAgICAgICAgICAgIC8vIHJlc3RyaWN0IHRvIHZpc2libGUgYXJlYSAoc2VlIG90aGVyIHNoYWRlcikKICAgICAgICAgICAgICAgIHZlYzMgcDEsIHAyOwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZlYzQgX3AxID0gY2xpcF9zcGFjZShwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyY19zdGFydCksIF9wMiA9IGNsaXBfc3BhY2UocG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmNfZW5kKTsKCiAgICAgICAgICAgICAgICAgICAgdmVjNCB2MSA9IF9wMiAtIF9wMTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKF9wMS53IDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9wMSA9IF9wMSArICgtX3AxLncgLSBfcDEueikgLyAodjEueiArIHYxLncpICogdjE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfY29sb3IxID0gZl9jb2xvcjEgKyAoLV9wMS53IC0gX3AxLnopIC8gKHYxLnogKyB2MS53KSAqIChmX2NvbG9yMiAtIGZfY29sb3IxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKF9wMi53IDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9wMiA9IF9wMiArICgtX3AyLncgLSBfcDIueikgLyAodjEueiArIHYxLncpICogdjE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfY29sb3IyID0gZl9jb2xvcjIgKyAoLV9wMi53IC0gX3AyLnopIC8gKHYxLnogKyB2MS53KSAqIChmX2NvbG9yMiAtIGZfY29sb3IxKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFNob3J0ZW4gc2VnbWVudHMgdG8gZml0IGNsaXAgcGxhbmVzCiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIHNlZ21lbnRzIGFyZSBmdWxseSBjbGlwcGVkCiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jbGlwX3BsYW5lcyhfcDEsIF9wMik7CgogICAgICAgICAgICAgICAgICAgIHAxID0gc2NyZWVuX3NwYWNlKF9wMSk7CiAgICAgICAgICAgICAgICAgICAgcDIgPSBzY3JlZW5fc3BhY2UoX3AyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBsaW5lIHZlY3RvciAoeHktbm9ybWFsaXplZCB2ZWN0b3JzIGluIGxpbmUgZGlyZWN0aW9uKQogICAgICAgICAgICAgICAgLy8gTmVlZCB6IGNvbXBvbmVudCBmb3IgY29ycmVjdCBkZXB0aCBvcmRlcgogICAgICAgICAgICAgICAgdmVjMyB2MSA9IHAyIC0gcDE7CiAgICAgICAgICAgICAgICBmbG9hdCBzZWdtZW50X2xlbmd0aCA9IGxlbmd0aCh2MSk7CiAgICAgICAgICAgICAgICB2MSAvPSBzZWdtZW50X2xlbmd0aDsKCiAgICAgICAgICAgICAgICAvLyBsaW5lIG5vcm1hbCAoaS5lLiBpbiB1bmlmb3JtX2xpbmV3aWR0aCBkaXJlY3Rpb24pCiAgICAgICAgICAgICAgICB2ZWMyIG4xID0gbm9ybWFsX3ZlY3Rvcih2MSk7CgoKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLyBTdGF0aWMgdmVydGV4IGRhdGEKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgICAgIC8vIGludmFsaWQgLSBubyBqb2ludHMgcmVxdWlyaW5nIHVuaWZvcm1fcGF0dGVybiBhZGp1c3RtZW50cwogICAgICAgICAgICAgICAgZl9wYXR0ZXJuX292ZXJ3cml0ZSA9IHZlYzQoLTFlMTIsIDEuMCwgMWUxMiwgMS4wKTsKCiAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIC0gbm8gam9pbnRzIHJlcXVpcmluZyBsaW5lIHNkZnMgdG8gYmUgZXh0cnVkZWQKICAgICAgICAgICAgICAgIGZfZXh0cnVzaW9uID0gdmVjMigwLjApOwoKICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gY29tcHV0ZSB3aWR0aCBzZGYKICAgICAgICAgICAgICAgIGZfbGluZXdpZHRoID0gaGFsZndpZHRoOwoKICAgICAgICAgICAgICAgIGZfaW5zdGFuY2VfaWQgPSBsaW5laW5kZXhfc3RhcnQgKyB1aW50KDEpOyAvLyBOT1RFOiB0aGlzIGlzIGNvcnJlY3QsIG5vIG5lZWQgdG8gbXVsdGlwbGUgYnkgMgoKICAgICAgICAgICAgICAgIC8vIHdlIHJlc3RhcnQgcGF0dGVybnMgZm9yIGVhY2ggc2VnbWVudAogICAgICAgICAgICAgICAgZl9jdW11bGF0aXZlX2xlbmd0aCA9IDAuMDsKCiAgICAgICAgICAgICAgICAvLyBubyBqb2ludHMgbWVhbnMgdGhlc2Ugc2hvdWxkIGJlIHNldCB0byBhICJuZXZlciBkaXNjYXJkIiBzdGF0ZQogICAgICAgICAgICAgICAgZl9saW5lcG9pbnRzID0gdmVjNCgtMWUxMik7CiAgICAgICAgICAgICAgICBmX21pdGVyX3ZlY3MgPSB2ZWM0KC0xKTsKCgogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIC8vIFZhcnlpbmcgdmVydGV4IGRhdGEKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAgICAgLy8gbGluZWNhcHMKICAgICAgICAgICAgICAgIGZfY2FwbW9kZSA9IGl2ZWMyKGxpbmVjYXApOwoKICAgICAgICAgICAgICAgIC8vIFZlcnRleCBwb3NpdGlvbiAocGFkZGVkIGZvciBqb2ludCAmIGFudGktYWxpYXNpbmcpCiAgICAgICAgICAgICAgICBmbG9hdCB2X29mZnNldCA9IHBvc2l0aW9uLnggKiAoMC41ICogc2VnbWVudF9sZW5ndGggKyBoYWxmd2lkdGggKyBBQV9USElDS05FU1MpOwogICAgICAgICAgICAgICAgZmxvYXQgbl9vZmZzZXQgPSAoaGFsZndpZHRoICsgQUFfVEhJQ0tORVNTKSAqIHBvc2l0aW9uLnk7CiAgICAgICAgICAgICAgICB2ZWMzIHBvaW50ID0gMC41ICogKHAxICsgcDIpICsgdl9vZmZzZXQgKiB2MSArIG5fb2Zmc2V0ICogdmVjMyhuMSwgMCk7CgogICAgICAgICAgICAgICAgLy8gU0RGJ3MKICAgICAgICAgICAgICAgIHZlYzIgVlAxID0gcG9pbnQueHkgLSBwMS54eTsKICAgICAgICAgICAgICAgIHZlYzIgVlAyID0gcG9pbnQueHkgLSBwMi54eTsKCiAgICAgICAgICAgICAgICAvLyBzZGYgb2YgdGhpcyBzZWdtZW50CiAgICAgICAgICAgICAgICBmX3F1YWRfc2RmLnggPSBkb3QoVlAxLCAtdjEueHkpOwogICAgICAgICAgICAgICAgZl9xdWFkX3NkZi55ID0gZG90KFZQMiwgIHYxLnh5KTsKICAgICAgICAgICAgICAgIGZfcXVhZF9zZGYueiA9IGRvdChWUDEsICBuMSk7CgogICAgICAgICAgICAgICAgLy8gaW52YWxpZCAtIG5vIGpvaW50IHRvIHRydW5jYXRlCiAgICAgICAgICAgICAgICBmX3RydW5jYXRpb24gPSB2ZWMyKC0xZTEyKTsKCiAgICAgICAgICAgICAgICAvLyBzaW1wbGlmaWVkIC0gbm8gZXh0cnVzaW9uIG9yIGpvaW50cyBtZWFucyB3ZSBqdXN0IGhhdmU6CiAgICAgICAgICAgICAgICBmX2xpbmVzdGFydCA9IDAuMDsKICAgICAgICAgICAgICAgIGZfbGluZWxlbmd0aCA9IHNlZ21lbnRfbGVuZ3RoOwoKICAgICAgICAgICAgICAgIC8vIGZvciB0aGluIGxpbmVzCiAgICAgICAgICAgICAgICBmX2FscGhhX3dlaWdodCA9IG1pbigxLjAsIHdpZHRoIC8gQUFfUkFESVVTKTsKCiAgICAgICAgICAgICAgICAvLyBjbGlwIHNwYWNlIHBvc2l0aW9uCiAgICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMi4wICogcG9pbnQueHkgLyAocHhfcGVyX3VuaXQgKiByZXNvbHV0aW9uKSAtIDEuMCwgcG9pbnQueiwgMS4wKTsKICAgICAgICAgICAgfQogICAgICAgIGA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgICAgICBwcmVjaXNpb24gaGlnaHAgaW50OwogICAgICAgICAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjJEOwogICAgICAgICAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjNEOwoKICAgICAgICAgICAgJHthdHRyaWJ1dGVfZGVjbH0KCiAgICAgICAgICAgIG91dCB2ZWMzIGZfcXVhZF9zZGY7CiAgICAgICAgICAgIG91dCB2ZWMyIGZfdHJ1bmNhdGlvbjsKICAgICAgICAgICAgb3V0IGZsb2F0IGZfbGluZXN0YXJ0OwogICAgICAgICAgICBvdXQgZmxvYXQgZl9saW5lbGVuZ3RoOwoKICAgICAgICAgICAgZmxhdCBvdXQgdmVjMiBmX2V4dHJ1c2lvbjsKICAgICAgICAgICAgZmxhdCBvdXQgZmxvYXQgZl9saW5ld2lkdGg7CiAgICAgICAgICAgIGZsYXQgb3V0IHZlYzQgZl9wYXR0ZXJuX292ZXJ3cml0ZTsKICAgICAgICAgICAgZmxhdCBvdXQgdWludCBmX2luc3RhbmNlX2lkOwogICAgICAgICAgICBmbGF0IG91dCAke2NvbG9yfSBmX2NvbG9yMTsKICAgICAgICAgICAgZmxhdCBvdXQgJHtjb2xvcn0gZl9jb2xvcjI7CiAgICAgICAgICAgIGZsYXQgb3V0IGZsb2F0IGZfYWxwaGFfd2VpZ2h0OwogICAgICAgICAgICBmbGF0IG91dCBmbG9hdCBmX2N1bXVsYXRpdmVfbGVuZ3RoOwogICAgICAgICAgICBmbGF0IG91dCBpdmVjMiBmX2NhcG1vZGU7CiAgICAgICAgICAgIGZsYXQgb3V0IHZlYzQgZl9saW5lcG9pbnRzOwogICAgICAgICAgICBmbGF0IG91dCB2ZWM0IGZfbWl0ZXJfdmVjczsKCiAgICAgICAgICAgICR7dW5pZm9ybV9kZWNsfQogICAgICAgICAgICB1bmlmb3JtIHZlYzQgdW5pZm9ybV9jbGlwX3BsYW5lc1s4XTsKCiAgICAgICAgICAgIC8vIENvbnN0YW50cwogICAgICAgICAgICBjb25zdCBmbG9hdCBBQV9SQURJVVMgPSAwLjg7CiAgICAgICAgICAgIGNvbnN0IGZsb2F0IEFBX1RISUNLTkVTUyA9IDIuMCAqIEFBX1JBRElVUzsKICAgICAgICAgICAgY29uc3QgaW50IEJVVFQgICA9IDA7CiAgICAgICAgICAgIGNvbnN0IGludCBTUVVBUkUgPSAxOwogICAgICAgICAgICBjb25zdCBpbnQgUk9VTkQgID0gMjsKICAgICAgICAgICAgY29uc3QgaW50IE1JVEVSICA9IDA7CiAgICAgICAgICAgIGNvbnN0IGludCBCRVZFTCAgPSAzOwoKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLyBQYXR0ZXJuIGhhbmRsaW5nCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCiAgICAgICAgICAgIHZlYzIgcHJvY2Vzc19wYXR0ZXJuKGJvb2wgdW5pZm9ybV9wYXR0ZXJuLCBib29sWzRdIGlzdmFsaWQsIHZlYzIgZXh0cnVzaW9uLCBmbG9hdCBzZWdtZW50X2xlbmd0aCwgZmxvYXQgaGFsZndpZHRoKSB7CiAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWRqdXN0IHN0dWZmCiAgICAgICAgICAgICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlID0gdmVjNCgtMWUxMiwgMS4wLCAxZTEyLCAxLjApOwogICAgICAgICAgICAgICAgcmV0dXJuIHZlYzIoMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZlYzIgcHJvY2Vzc19wYXR0ZXJuKHNhbXBsZXIyRCB1bmlmb3JtX3BhdHRlcm4sIGJvb2xbNF0gaXN2YWxpZCwgdmVjMiBleHRydXNpb24sIGZsb2F0IHNlZ21lbnRfbGVuZ3RoLCBmbG9hdCBoYWxmd2lkdGgpIHsKICAgICAgICAgICAgICAgIC8vIHNhbXBsZXM6CiAgICAgICAgICAgICAgICAvLyAgIC1leHQxICBwMSBleHQxICAgIC1leHQyIHAyIGV4dDIKICAgICAgICAgICAgICAgIC8vICAgICAgMSAgIDIgICAzICAgICAgICA0ICAgNSAgIDYKICAgICAgICAgICAgICAgIC8vIHByZXYgfCBqb2ludCB8ICB0aGlzICB8IGpvaW50IHwgbmV4dAoKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbm8gb3ZlcndyaXRlCiAgICAgICAgICAgICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlLnggPSAtMWUxMjsKICAgICAgICAgICAgICAgIGZfcGF0dGVybl9vdmVyd3JpdGUueiA9ICsxZTEyOwogICAgICAgICAgICAgICAgdmVjMiBhZGp1c3QgPSB2ZWMyKDApOwogICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSAyLjAgKiBoYWxmd2lkdGg7CiAgICAgICAgICAgICAgICBmbG9hdCB1dl9zY2FsZSA9IDEuMCAvICh3aWR0aCAqIHVuaWZvcm1fcGF0dGVybl9sZW5ndGgpOwogICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwgY2VudGVyLCByaWdodDsKCiAgICAgICAgICAgICAgICBpZiAoaXN2YWxpZFswXSkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IG9mZnNldCA9IGFicyhleHRydXNpb25bMF0pOwogICAgICAgICAgICAgICAgICAgIGxlZnQgICA9IHdpZHRoICogdGV4dHVyZSh1bmlmb3JtX3BhdHRlcm4sIHZlYzIodXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0IC0gb2Zmc2V0KSwgMC4wKSkueDsKICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSB3aWR0aCAqIHRleHR1cmUodW5pZm9ybV9wYXR0ZXJuLCB2ZWMyKHV2X3NjYWxlICogKHB4X3Blcl91bml0ICogbGFzdGxlbl9zdGFydCAgICAgICAgICksIDAuMCkpLng7CiAgICAgICAgICAgICAgICAgICAgcmlnaHQgID0gd2lkdGggKiB0ZXh0dXJlKHVuaWZvcm1fcGF0dGVybiwgdmVjMih1dl9zY2FsZSAqIChweF9wZXJfdW5pdCAqIGxhc3RsZW5fc3RhcnQgKyBvZmZzZXQpLCAwLjApKS54OwoKICAgICAgICAgICAgICAgICAgICAvLyBjYXNlczoKICAgICAgICAgICAgICAgICAgICAvLyArKy0sICstLSwgKy0rID0+IGVsb25nYXRlIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgIC8vIC0rKywgLS0rICAgICAgPT4gc2hyaW5rIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICAvLyArKyssIC0tLSwgLSstID0+IGZyZWV6ZSBhcm91bmQgam9pbnQKCiAgICAgICAgICAgICAgICAgICAgaWYgKChsZWZ0ID4gMC4wICYmIGNlbnRlciA+IDAuMCAmJiByaWdodCA+IDAuMCkgfHwgKGxlZnQgPCAwLjAgJiYgcmlnaHQgPCAwLjApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQvZnJlZXplCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSB1bnRpbCBvbmUgQUEgZ2FwIHBhc3QgdGhlIGNvcm5lci9qb2ludAogICAgICAgICAgICAgICAgICAgICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlLnggPSB1dl9zY2FsZSAqIChweF9wZXJfdW5pdCAqIGxhc3RsZW5fc3RhcnQgKyBhYnMoZXh0cnVzaW9uWzBdKSArIEFBX1JBRElVUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBzaWduIG9mIHRoZSBjZW50ZXIgdG8gZGVjaWRlIGJldHdlZW4gZHJhd2luZyBvciBub3QgZHJhd2luZwogICAgICAgICAgICAgICAgICAgICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlLnkgPSBzaWduKGNlbnRlcik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0ID4gMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsb25nYXRlIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QueCA9IC0xLjA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyaWdodCA+IDAuMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGVuIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0LnggPSAxLjA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCAtIHNlZSBhYm92ZQogICAgICAgICAgICAgICAgICAgICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlLnggPSB1dl9zY2FsZSAqIChweF9wZXJfdW5pdCAqIGxhc3RsZW5fc3RhcnQgKyBhYnMoZXh0cnVzaW9uWzBdKSArIEFBX1JBRElVUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfcGF0dGVybl9vdmVyd3JpdGUueSA9IHNpZ24oY2VudGVyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSAvLyBlbHNlIHRoZXJlIGlzIG5vIGxlZnQgc2VnbWVudCwgbm8gbGVmdCBqb2luLCBzbyBubyBvdmVyd3JpdGUKCiAgICAgICAgICAgICAgICBpZiAoaXN2YWxpZFszXSkgewogICAgICAgICAgICAgICAgICAgIGZsb2F0IG9mZnNldCA9IGFicyhleHRydXNpb25bMV0pOwogICAgICAgICAgICAgICAgICAgIGxlZnQgICA9IHdpZHRoICogdGV4dHVyZSh1bmlmb3JtX3BhdHRlcm4sIHZlYzIodXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0ICsgc2VnbWVudF9sZW5ndGggLSBvZmZzZXQpLCAwLjApKS54OwogICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IHdpZHRoICogdGV4dHVyZSh1bmlmb3JtX3BhdHRlcm4sIHZlYzIodXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0ICsgc2VnbWVudF9sZW5ndGggICAgICAgICApLCAwLjApKS54OwogICAgICAgICAgICAgICAgICAgIHJpZ2h0ICA9IHdpZHRoICogdGV4dHVyZSh1bmlmb3JtX3BhdHRlcm4sIHZlYzIodXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0ICsgc2VnbWVudF9sZW5ndGggKyBvZmZzZXQpLCAwLjApKS54OwoKICAgICAgICAgICAgICAgICAgICBpZiAoKGxlZnQgPiAwLjAgJiYgY2VudGVyID4gMC4wICYmIHJpZ2h0ID4gMC4wKSB8fCAobGVmdCA8IDAuMCAmJiByaWdodCA8IDAuMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdC9mcmVlemUKICAgICAgICAgICAgICAgICAgICAgICAgZl9wYXR0ZXJuX292ZXJ3cml0ZS56ID0gdXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0ICsgc2VnbWVudF9sZW5ndGggLSBhYnMoZXh0cnVzaW9uWzFdKSAtIEFBX1JBRElVUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfcGF0dGVybl9vdmVyd3JpdGUudyA9IHNpZ24oY2VudGVyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnQgPiAwLjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hyaW5rIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QueSA9IC0xLjA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyaWdodCA+IDAuMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlbG9uZ2F0ZSBmb3J3YXJkCiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC55ID0gMS4wOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgLSBzZWUgYWJvdmUKICAgICAgICAgICAgICAgICAgICAgICAgZl9wYXR0ZXJuX292ZXJ3cml0ZS56ID0gdXZfc2NhbGUgKiAocHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0ICsgc2VnbWVudF9sZW5ndGggLSBhYnMoZXh0cnVzaW9uWzFdKSAtIEFBX1JBRElVUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfcGF0dGVybl9vdmVyd3JpdGUudyA9IHNpZ24oY2VudGVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdDsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLyBHZW9tZXRyeS9Qb3NpdGlvbiBVdGlscwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZlYzQgY2xpcF9zcGFjZSh2ZWMzIHBvaW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdGlvbnZpZXcgKiBtb2RlbF9mMzJjICogdmVjNChwb2ludCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmVjNCBjbGlwX3NwYWNlKHZlYzIgcG9pbnQpIHsgcmV0dXJuIGNsaXBfc3BhY2UodmVjMyhwb2ludCwgMCkpOyB9CgogICAgICAgICAgICB2ZWMzIHNjcmVlbl9zcGFjZSh2ZWM0IHZlcnRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZlYzMoCiAgICAgICAgICAgICAgICAgICAgKDAuNSAqIHZlcnRleC54eSAvIHZlcnRleC53ICsgMC41KSAqIHB4X3Blcl91bml0ICogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgueiAvIHZlcnRleC53ICsgZGVwdGhfc2hpZnQKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZlYzIgbm9ybWFsX3ZlY3RvcihpbiB2ZWMyIHYpIHsgcmV0dXJuIHZlYzIoLXYueSwgdi54KTsgfQogICAgICAgICAgICB2ZWMyIG5vcm1hbF92ZWN0b3IoaW4gdmVjMyB2KSB7IHJldHVybiB2ZWMyKC12LnksIHYueCk7IH0KICAgICAgICAgICAgZmxvYXQgc2lnbl9ub196ZXJvKGZsb2F0IHZhbHVlKSB7IHJldHVybiB2YWx1ZSA+PSAwLjAgPyAxLjAgOiAtMS4wOyB9CgogICAgICAgICAgICB2b2lkIHByb2Nlc3NfY2xpcF9wbGFuZXMoaW5vdXQgdmVjNCBwMSwgaW5vdXQgdmVjNCBwMiwgaW5vdXQgYm9vbFs0XSBpc3ZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmbG9hdCBkMSwgZDI7CiAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW50KHVuaWZvcm1fbnVtX2NsaXBfcGxhbmVzKTsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIGRpc3RhbmNlIGZyb20gY2xpcCBwbGFuZXMgd2l0aCBuZWdhdGl2ZSBjbGlwcGVkCiAgICAgICAgICAgICAgICAgICAgZDEgPSBkb3QocDEueHl6LCB1bmlmb3JtX2NsaXBfcGxhbmVzW2ldLnh5eikgLSB1bmlmb3JtX2NsaXBfcGxhbmVzW2ldLncgKiBwMS53OwogICAgICAgICAgICAgICAgICAgIGQyID0gZG90KHAyLnh5eiwgdW5pZm9ybV9jbGlwX3BsYW5lc1tpXS54eXopIC0gdW5pZm9ybV9jbGlwX3BsYW5lc1tpXS53ICogcDIudzsKCiAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlIC0gY2xpcCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgMC4wICYmIGQyIDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gcDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzdmFsaWRbMV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaXN2YWxpZFsyXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgLy8gb25lIG91dHNpZGUgLSBzaG9ydGVuIHNlZ21lbnQKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQxIDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbHZlIDAgPSBtICogdCArIGIgPSAoZDIgLSBkMSkgKiB0ICsgZDEgd2l0aCB0IGluICgwLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBwMSAgICAgICA9IHAxICAgICAgIC0gZDEgKiAocDIgLSBwMSkgICAgICAgICAgICAgLyAoZDIgLSBkMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZfY29sb3IxID0gZl9jb2xvcjEgLSBkMSAqIChmX2NvbG9yMiAtIGZfY29sb3IxKSAvIChkMiAtIGQxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaXN2YWxpZFswXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZDIgPCAwLjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcDIgICAgICAgPSBwMiAgICAgICAtIGQyICogKHAxIC0gcDIpICAgICAgICAgICAgIC8gKGQxIC0gZDIpOwogICAgICAgICAgICAgICAgICAgICAgICBmX2NvbG9yMiA9IGZfY29sb3IyIC0gZDIgKiAoZl9jb2xvcjEgLSBmX2NvbG9yMikgLyAoZDEgLSBkMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzdmFsaWRbM10gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8gTWFpbgogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5kID0gcG9zaXRpb24ueCA9PSAxLjA7CgoKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGluZSBnZW9tZXRyeSAocG9zaXRpb24sIGRpcmVjdGlvbnMpCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCiAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IHB4X3Blcl91bml0ICogKGlzX2VuZCA/IHVuaWZvcm1fbGluZXdpZHRoX2VuZCA6IHVuaWZvcm1fbGluZXdpZHRoX3N0YXJ0KTsKICAgICAgICAgICAgICAgIGZsb2F0IGhhbGZ3aWR0aCA9IDAuNSAqIG1heChBQV9SQURJVVMsIHdpZHRoKTsKCiAgICAgICAgICAgICAgICBib29sWzRdIGlzdmFsaWQgPSBib29sWzRdKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwoKICAgICAgICAgICAgICAgIC8vIGNvbG9yIGF0IHN0YXJ0L2VuZCBvZiBzZWdtZW50CiAgICAgICAgICAgICAgICBmX2NvbG9yMSA9IGxpbmVfY29sb3Jfc3RhcnQ7CiAgICAgICAgICAgICAgICBmX2NvbG9yMiA9IGxpbmVfY29sb3JfZW5kOwoKICAgICAgICAgICAgICAgIC8vIFRvIGFwcGx5IHBpeGVsIHNwYWNlIGxpbmV3aWR0aHMgd2UgdHJhbnNmb3JtIGxpbmUgdmVydGljZXMgdG8gcGl4ZWwgc3BhY2UKICAgICAgICAgICAgICAgIC8vIGhlcmUuIFRoaXMgaXMgZGFuZ2Vyb3VzIHdpdGggcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBhcyBwLnh5eiAvIHAudyBzZW5kcwogICAgICAgICAgICAgICAgLy8gcG9pbnRzIGZyb20gYmVoaW5kIHRoZSBjYW1lcmEgdG8gYmV5b25kIGZhciAoY2xpcCB6ID4gMSksIGNhdXNpbmcgbGluZXMKICAgICAgICAgICAgICAgIC8vIHRvIGludmVydC4gVG8gYXZvaWQgdGhpcyB3ZSB0cmFuc2xhdGUgcG9pbnRzIGFsb25nIHRoZSBsaW5lIGRpcmVjdGlvbiwKICAgICAgICAgICAgICAgIC8vIG1vdmluZyB0aGVtIHRvIHRoZSBlZGdlIG9mIHRoZSB2aXNpYmxlIGFyZWEuCiAgICAgICAgICAgICAgICB2ZWMzIHAwLCBwMSwgcDIsIHAzOwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbiBjbGlwIHNwYWNlCiAgICAgICAgICAgICAgICAgICAgdmVjNCBjbGlwX3AwID0gY2xpcF9zcGFjZShwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyY19wcmV2KTsKICAgICAgICAgICAgICAgICAgICB2ZWM0IGNsaXBfcDEgPSBjbGlwX3NwYWNlKHBvc2l0aW9uc190cmFuc2Zvcm1lZF9mMzJjX3N0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB2ZWM0IGNsaXBfcDIgPSBjbGlwX3NwYWNlKHBvc2l0aW9uc190cmFuc2Zvcm1lZF9mMzJjX2VuZCk7CiAgICAgICAgICAgICAgICAgICAgdmVjNCBjbGlwX3AzID0gY2xpcF9zcGFjZShwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyY19uZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgdmVjNCB2MSA9IGNsaXBfcDIgLSBjbGlwX3AxOwoKICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIG91ciBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCBjbGlwLncgPSAtdmlldy56IHdpdGgKICAgICAgICAgICAgICAgICAgICAvLyBjbGlwLncgPCAwLjAgYmVpbmcgYmVoaW5kIHRoZSBjYW1lcmEuCiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBzaWducyBpbiB0aGUgcHJvamVjdGlvbm1hdHJpeCBjaGFuZ2UsIHRoaXMgbWF5IGJlY29tZSB3cm9uZy4KICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9wMS53IDwgMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5lIGNvbm5lY3RzIG91dHNpZGUgdGhlIHZpc2libGUgYXJlYSBzbyB3ZSBtYXkgY29uc2lkZXIgaXQgZGlzY29ubmVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgIGlzdmFsaWRbMF0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjbGlwIHBvc2l0aW9uIGlzIHZpc2libGUgaWYgLXcgPD0geiA8PSB3LiBUbyBtb3ZlIHRoZSBsaW5lIGFsb25nCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5lIGRpcmVjdGlvbiB2IHRvIHRoZSBzdGFydCBvZiB0aGUgdmlzaWJsZSBhcmVhLCB3ZSBzb2x2ZToKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBwLnogKyB0ICogdi56ID0gKy0ocC53ICsgdCAqIHYudykKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgKC0pIGdpdmVzIHVzIHRoZSByZXN1bHQgZm9yIHRoZSBuZWFyIGNsaXBwaW5nIHBsYW5lIGFzIHAuegogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcC53IHNoYXJlIHRoZSBzYW1lIHNpZ24gYW5kIHAuei9wLncgPSAtMS4wIGlzIHRoZSBuZWFyIHBsYW5lLgogICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3AxID0gY2xpcF9wMSArICgtY2xpcF9wMS53IC0gY2xpcF9wMS56KSAvICh2MS56ICsgdjEudykgKiB2MTsKICAgICAgICAgICAgICAgICAgICAgICAgZl9jb2xvcjEgPSBmX2NvbG9yMSArICgtY2xpcF9wMS53IC0gY2xpcF9wMS56KSAvICh2MS56ICsgdjEudykgKiAoZl9jb2xvcjIgLSBmX2NvbG9yMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3AyLncgPCAwLjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXN2YWxpZFszXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3AyID0gY2xpcF9wMiArICgtY2xpcF9wMi53IC0gY2xpcF9wMi56KSAvICh2MS56ICsgdjEudykgKiB2MTsKICAgICAgICAgICAgICAgICAgICAgICAgZl9jb2xvcjIgPSBmX2NvbG9yMiArICgtY2xpcF9wMi53IC0gY2xpcF9wMi56KSAvICh2MS56ICsgdjEudykgKiAoZl9jb2xvcjIgLSBmX2NvbG9yMSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGVuIHNlZ21lbnRzIHRvIGZpdCBjbGlwIHBsYW5lcwogICAgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBzZWdtZW50cyBhcmUgZnVsbHkgY2xpcHBlZAogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY2xpcF9wbGFuZXMoY2xpcF9wMSwgY2xpcF9wMiwgaXN2YWxpZCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBjbGlwIC0+IHNjcmVlbiBzcGFjZSwgYXBwbHlpbmcgeHl6IC8gdyBub3JtYWxpemF0aW9uICh3aGljaAogICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdyBzYXZlIGFzIGFsbCB2ZXJ0aWNlcyBhcmUgaW4gZnJvbnQgb2YgdGhlIGNhbWVyYSkKICAgICAgICAgICAgICAgICAgICBwMCA9IHNjcmVlbl9zcGFjZShjbGlwX3AwKTsgLy8gc3RhcnQgb2YgcHJldmlvdXMgc2VnbWVudAogICAgICAgICAgICAgICAgICAgIHAxID0gc2NyZWVuX3NwYWNlKGNsaXBfcDEpOyAvLyBlbmQgb2YgcHJldmlvdXMgc2VnbWVudCwgc3RhcnQgb2YgY3VycmVudCBzZWdtZW50CiAgICAgICAgICAgICAgICAgICAgcDIgPSBzY3JlZW5fc3BhY2UoY2xpcF9wMik7IC8vIGVuZCBvZiBjdXJyZW50IHNlZ21lbnQsIHN0YXJ0IG9mIG5leHQgc2VnbWVudAogICAgICAgICAgICAgICAgICAgIHAzID0gc2NyZWVuX3NwYWNlKGNsaXBfcDMpOyAvLyBlbmQgb2YgbmV4dCBzZWdtZW50CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZG9lc24ndCB3b3JrIGNvcnJlY3RseSB3aXRoIGxpbmVwb2ludF94Li4uCiAgICAgICAgICAgICAgICBpc3ZhbGlkWzBdID0gcDAgIT0gcDE7CiAgICAgICAgICAgICAgICBpc3ZhbGlkWzNdID0gcDIgIT0gcDM7CgogICAgICAgICAgICAgICAgLy8gbGluZSB2ZWN0b3JzICh4eS1ub3JtYWxpemVkIHZlY3RvcnMgaW4gbGluZSBkaXJlY3Rpb24pCiAgICAgICAgICAgICAgICAvLyBOZWVkIHogY29tcG9uZW50IGhlcmUgZm9yIGNvcnJlY3QgZGVwdGggb3JkZXIKICAgICAgICAgICAgICAgIHZlYzMgdjEgPSBwMiAtIHAxOwogICAgICAgICAgICAgICAgZmxvYXQgc2VnbWVudF9sZW5ndGggPSBsZW5ndGgodjEpOwogICAgICAgICAgICAgICAgdjEgLz0gc2VnbWVudF9sZW5ndGg7CgogICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgeiBjb21wb25lbnQgZm9yIHRoZXNlCiAgICAgICAgICAgICAgICB2ZWMyIHYwID0gdjEueHksIHYyID0gdjEueHk7CiAgICAgICAgICAgICAgICBib29sWzJdIHNraXBfam9pbnQ7CiAgICAgICAgICAgICAgICBpZiAoaXN2YWxpZFswXSkKICAgICAgICAgICAgICAgICAgICB2MCA9IG5vcm1hbGl6ZShwMS54eSAtIHAwLnh5KTsKICAgICAgICAgICAgICAgIGlmIChpc3ZhbGlkWzNdKQogICAgICAgICAgICAgICAgICAgIHYyID0gbm9ybWFsaXplKHAzLnh5IC0gcDIueHkpOwoKICAgICAgICAgICAgICAgIC8vIGxpbmUgbm9ybWFscyAoaS5lLiBpbiB1bmlmb3JtX2xpbmV3aWR0aCBkaXJlY3Rpb24pCiAgICAgICAgICAgICAgICB2ZWMyIG4wID0gbm9ybWFsX3ZlY3Rvcih2MCk7CiAgICAgICAgICAgICAgICB2ZWMyIG4xID0gbm9ybWFsX3ZlY3Rvcih2MSk7CiAgICAgICAgICAgICAgICB2ZWMyIG4yID0gbm9ybWFsX3ZlY3Rvcih2Mik7CgoKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgam9pbnQgZ2VvbWV0cnkKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgICAgIC8vIGpvaW50IGluZm9ybWF0aW9uCgogICAgICAgICAgICAgICAgLy8gTWl0ZXIgbm9ybWFscyAobm9ybWFsIG9mIHRydW5jYXRlZCBlZGdlIC8gdmVjdG9yIHRvIHNoYXJwIGNvcm5lcikKICAgICAgICAgICAgICAgIC8vIE5vdGU6IG4wICsgbjEgPSB2ZWMoMCkgZm9yIGEgMTgwwrAgY2hhbmdlIGluIGRpcmVjdGlvbi4gKy0odjAgLSB2MSkgaXMgdGhlCiAgICAgICAgICAgICAgICAvLyAgICAgICBzYW1lIGRpcmVjdGlvbiwgYnV0IGJlY29tZXMgdmVjKDApIGF0IDDCsCwgc28gd2UgY2FuIHVzZSBpdCBpbnN0ZWFkCiAgICAgICAgICAgICAgICB2ZWMyIG1pdGVyID0gdmVjMihkb3QodjAsIHYxLnh5KSwgZG90KHYxLnh5LCB2MikpOwogICAgICAgICAgICAgICAgdmVjMiBtaXRlcl9uMSA9IG1pdGVyLnggPCAtMC4wID8KICAgICAgICAgICAgICAgICAgICBzaWduX25vX3plcm8oZG90KHYwLnh5LCBuMSkpICogbm9ybWFsaXplKHYwLnh5IC0gdjEueHkpIDogbm9ybWFsaXplKG4wICsgbjEpOwogICAgICAgICAgICAgICAgdmVjMiBtaXRlcl9uMiA9IG1pdGVyLnkgPCAtMC4wID8KICAgICAgICAgICAgICAgICAgICBzaWduX25vX3plcm8oZG90KHYxLnh5LCBuMikpICogbm9ybWFsaXplKHYxLnh5IC0gdjIueHkpIDogbm9ybWFsaXplKG4xICsgbjIpOwoKICAgICAgICAgICAgICAgIC8vIEFyZSB3ZSB0cnVuY2F0aW5nIHRoZSBqb2ludCBiYXNlZCBvbiBtaXRlciBsaW1pdCBvciBqb2luc3R5bGU/CiAgICAgICAgICAgICAgICAvLyBiZXZlbCAvIGFsd2F5cyB0cnVuY2F0ZSBkb2Vzbid0IHdvcmsgd2l0aCB2MSA9PSB2MiAodjApIHNvIHdlIHVzZSBhbGxvdwogICAgICAgICAgICAgICAgLy8gbWl0ZXIgam9pbnRzIGEgd2hlbiB2MSDiiYggdjIgKHYwKQogICAgICAgICAgICAgICAgYm9vbFsyXSBpc190cnVuY2F0ZWQgPSBib29sWzJdKAogICAgICAgICAgICAgICAgICAgIChpbnQoam9pbnN0eWxlKSA9PSBCRVZFTCkgPyBtaXRlci54IDwgMC45OSA6IG1pdGVyLnggPCBtaXRlcl9saW1pdCwKICAgICAgICAgICAgICAgICAgICAoaW50KGpvaW5zdHlsZSkgPT0gQkVWRUwpID8gbWl0ZXIueSA8IDAuOTkgOiBtaXRlci55IDwgbWl0ZXJfbGltaXQKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgLy8gbWl0ZXIgdmVjdG9ycyAobGluZSB2ZWN0b3IgbWF0Y2hpbmcgbWl0ZXIgbm9ybWFsKQogICAgICAgICAgICAgICAgdmVjMiBtaXRlcl92MSA9IC1ub3JtYWxfdmVjdG9yKG1pdGVyX24xKTsKICAgICAgICAgICAgICAgIHZlYzIgbWl0ZXJfdjIgPSAtbm9ybWFsX3ZlY3RvcihtaXRlcl9uMik7CgogICAgICAgICAgICAgICAgLy8gZGlzdGFuY2UgYmV0d2VlbiBwMS8yIGFuZCByZXNwZWN0aXZlIHNoYXJwIGNvcm5lcgogICAgICAgICAgICAgICAgZmxvYXQgbWl0ZXJfb2Zmc2V0MSA9IGRvdChtaXRlcl9uMSwgbjEpOyAvLyA9IGRvdChtaXRlcl92MSwgdjEpCiAgICAgICAgICAgICAgICBmbG9hdCBtaXRlcl9vZmZzZXQyID0gZG90KG1pdGVyX24yLCBuMSk7IC8vID0gZG90KG1pdGVyX3YyLCB2MSkKCiAgICAgICAgICAgICAgICAvLyBIb3cgZmFyIHRoZSBsaW5lIG5lZWRzIHRvIGV4dGVuZCB0byBhY2NvbW9kYXRlIHRoZSBqb2ludC4KICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBjYWxjdWxhdGVkIGFzIHByZWZhY3RvcnMgdG8gdjEgc28gdGhhdCB0aGUgbGluZSBxdWFkCiAgICAgICAgICAgICAgICAvLyBpcyBnaXZlbiBieToKICAgICAgICAgICAgICAgIC8vICAgICAgcDEgKyB3ICogZXh0cnVzaW9uWzBdICogdjEgIC0tLS0tICBwMiArIHcgKiBleHRydXNpb25bMV0gKiB2MQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgIC8vICAgICAgcDEgKyB3ICogZXh0cnVzaW9uWzBdICogdjEgIC0tLS0tICBwMiArIHcgKiBleHRydXNpb25bMV0gKiB2MQogICAgICAgICAgICAgICAgLy8gd2l0aCB3ID0gaGFsZndpZHRoIGZvciBkcmF3biBjb3JuZXJzIGFuZCB3ID0gaGFsZndpZHRoICsgQUFfVEhJQ0tORVNTCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGNvcm5lcnMgb2YgcXVhZC4gVGhlIHNpZ24gZGlmZmVyZW5jZSBkdWUgdG8gbWl0ZXIgam9pbnRzCiAgICAgICAgICAgICAgICAvLyBpcyBpbmNsdWRlZCBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJ0ZXggcG9zaXRpb24gKHBvc2l0aW9uLnkpLgogICAgICAgICAgICAgICAgLy8gKHRydW5jYXRlZCBtaXRlciBqb2ludHMgZG8gbm90IGRpZmZlciBoZXJlKQogICAgICAgICAgICAgICAgdmVjMiBleHRydXNpb247CgogICAgICAgICAgICAgICAgaWYgKGlzX3RydW5jYXRlZFswXSkgewogICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZXh0ZW5kIHNlZ21lbnQgdG8gaW5jbHVkZSBwcmV2aW91cyBzZWdtZW50cyBjb3JuZXJzIGZvciB0cnVuY2F0ZWQgam9pbgogICAgICAgICAgICAgICAgICAgIGV4dHJ1c2lvblswXSA9IC1hYnMobWl0ZXJfb2Zmc2V0MSAvIGRvdChtaXRlcl92MSwgbjEpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2hhbGxvdy9zcGlrZSBqb2luIG5lZWRzIHRvIGluY2x1ZGUgcG9pbnQgd2hlcmUgbWl0ZXIgbm9ybWFsIG1lZXRzIG91dGVyIGxpbmUgZWRnZQogICAgICAgICAgICAgICAgICAgIGV4dHJ1c2lvblswXSA9IHBvc2l0aW9uLnkgKiBkb3QobWl0ZXJfbjEsIHYxLnh5KSAvIG1pdGVyX29mZnNldDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGlzX3RydW5jYXRlZFsxXSkgewogICAgICAgICAgICAgICAgICAgIGV4dHJ1c2lvblsxXSA9IGFicyhtaXRlcl9vZmZzZXQyIC8gZG90KG1pdGVyX24yLCB2MS54eSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBleHRydXNpb25bMV0gPSBwb3NpdGlvbi55ICogZG90KG1pdGVyX24yLCB2MS54eSkgLyBtaXRlcl9vZmZzZXQyOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAgICAgLy8gSm9pbnQgYWRqdXN0bWVudHMKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgICAgICAgICAgICAgIC8vIE1pdGVyIGpvaW50cyBjYW4gY2F1c2UgdmVydGljZXMgdG8gbW92ZSBwYXN0IGVhY2ggb3RoZXIsIGUuZy4KICAgICAgICAgICAgICAgIC8vICBfX19fX19fCiAgICAgICAgICAgICAgICAvLyAgJy4gICAuJwogICAgICAgICAgICAgICAgLy8gICAgIHgKICAgICAgICAgICAgICAgIC8vICAgJy0tLScKICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGRyYXdpbmcgdGhlICJpbnZlcnRlZCIgc2VjdGlvbiB3ZSBtb3ZlIHRoZSByZWxldmFudAogICAgICAgICAgICAgICAgLy8gdmVydGljZXMgdG8gdGhlIGNyb3NzaW5nIHBvaW50ICh4KSB1c2luZyB0aGlzIHNjYWxpbmcgZmFjdG9yLgogICAgICAgICAgICAgICAgLy8gVE9ETzogc2tpcHBpbmcgdGhpcyBmb3IgbGluZXN0YXJ0L2VuZCBhdm9pZCByb3VuZCBhbmQgc3F1YXJlCiAgICAgICAgICAgICAgICAvLyAgICAgICBiZWluZyBjdXQgb2ZmIGJ1dCBjYXVzZXMgb3ZlcmxhcC4uLgogICAgICAgICAgICAgICAgZmxvYXQgc2hhcGVfZmFjdG9yID0gMS4wOwogICAgICAgICAgICAgICAgaWYgKChpc3ZhbGlkWzBdICYmIGlzdmFsaWRbM10pIHx8IChpbnQobGluZWNhcCkgPT0gQlVUVCkpCiAgICAgICAgICAgICAgICAgICAgc2hhcGVfZmFjdG9yID0gc2VnbWVudF9sZW5ndGggLyBtYXgoc2VnbWVudF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIChoYWxmd2lkdGggKyBBQV9USElDS05FU1MpICogKGV4dHJ1c2lvblswXSAtIGV4dHJ1c2lvblsxXSkpOwoKICAgICAgICAgICAgICAgIC8vIElmIGEgdW5pZm9ybV9wYXR0ZXJuIHN0YXJ0cyBvciBzdG9wcyBkcmF3aW5nIGluIGEgam9pbnQgaXQgd2lsbCBnZXQKICAgICAgICAgICAgICAgIC8vIGZyYWN0dXJlZCBhY3Jvc3MgdGhlIGpvaW50LiBUbyBhdm9pZCB0aGlzIHdlIGVpdGhlcjoKICAgICAgICAgICAgICAgIC8vIC0gYWRqdXN0IHRoZSBpbnZvbHZlZCBsaW5lIHNlZ21lbnRzIHNvIHRoYXQgdGhlIHBhdHRlcm5zIGVuZHMKICAgICAgICAgICAgICAgIC8vICAgb24gc3RyYWlnaHQgbGluZSBxdWFkIChhZGp1c3RtZW50IGJlY29tZXMgKzEuMCBvciAtMS4wKQogICAgICAgICAgICAgICAgLy8gLSBvciBhZGp1c3QgdGhlIHVuaWZvcm1fcGF0dGVybiB0byBzdGFydC9zdG9wIG91dHNpZGUgb2YgdGhlIGpvaW50CiAgICAgICAgICAgICAgICAvLyAgIChmX3BhdHRlcm5fb3ZlcndyaXRlIGlzIHNldCwgYWRqdXN0bWVudCBpcyAwLjApCiAgICAgICAgICAgICAgICB2ZWMyIGFkanVzdG1lbnQgPSBwcm9jZXNzX3BhdHRlcm4oCiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybV9wYXR0ZXJuLCBpc3ZhbGlkLCBoYWxmd2lkdGggKiBleHRydXNpb24sIHNlZ21lbnRfbGVuZ3RoLCBoYWxmd2lkdGgKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgLy8gSWYgYWRqdXN0bWVudCAhPSAwLjAgd2UgcmVwbGFjZSBhIGpvaW50IGJ5IGFuIGV4dHJ1ZGVkIGxpbmUsCiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBzaHJpbmsgdGhlIGxpbmUgZm9yIHRoZSBqb2ludCB0byBmaXQuCiAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudFswXSAhPSAwLjAgfHwgYWRqdXN0bWVudFsxXSAhPSAwLjApCiAgICAgICAgICAgICAgICAgICAgc2hhcGVfZmFjdG9yID0gMS4wOwoKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAvLyBTdGF0aWMgdmVydGV4IGRhdGEKICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAgICAgICAgICAgLy8gRm9yIHRydW5jYXRlZCBtaXRlciBqb2ludHMgd2UgZGlzY2FyZCBvdmVybGFwcGluZyBzZWN0aW9ucyBvZiB0aGUgdHdvCiAgICAgICAgICAgICAgICAvLyBpbnZvbHZlZCBsaW5lIHNlZ21lbnRzLiBUbyBpZGVudGlmeSB3aGljaCBzZWN0aW9ucyBvdmVybGFwIHdlIGNhbGN1bGF0ZQogICAgICAgICAgICAgICAgLy8gdGhlIHNpZ25lZCBkaXN0YW5jZSBpbiArLSBtaXRlciB2ZWN0b3IgZGlyZWN0aW9uIGZyb20gdGhlIHNoYXJlZCBsaW5lCiAgICAgICAgICAgICAgICAvLyBwb2ludCBpbiBmcmFnbWVudCBzaGFkZXIuIFdlIHBhc3MgdGhlIG5lY2Vzc2FyeSBkYXRhIGhlcmUuIElmIHdlIGRvIG5vdAogICAgICAgICAgICAgICAgLy8gaGF2ZSBhIHRydW5jYXRlZCBqb2ludCB3ZSBhZGp1c3QgdGhlIGRhdGEgaGVyZSB0byBuZXZlciBkaXNjYXJkLgogICAgICAgICAgICAgICAgLy8gV2h5IG5vdCBjYWxjdWxhdGUgdGhlIHNkZiBoZXJlPwogICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FsY3VsYXRlIHRoZSBzZGYgaGVyZSBhbmQgcGFzcyBpdCBhcyBhbiBpbnRlcnBvbGF0ZWQgdmVydGV4IG91dHB1dAogICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlcyB3ZSBnZXQgYmV0d2VlbiB0aGUgdHdvIGxpbmUgc2VnbWVudHMgd2lsbCBkaWZmZXIgc2luY2UgdGhlCiAgICAgICAgICAgICAgICAvLyB0aGUgdmVydGljZXMgZWFjaCBzZWdtZW50IGludGVycG9sYXRlcyBmcm9tIGRpZmZlci4gVGhpcyBjYXVzZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGNoZWNrIHRvIHJhcmVseSBiZSB0cnVlIG9yIGZhbHNlIGZvciBib3RoIHNlZ21lbnRzLCByZXN1bHRpbmcgaW4KICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZWQgb3IgbWlzc2luZyBwaXhlbC9mcmFnbWVudCBkcmF3LgogICAgICAgICAgICAgICAgLy8gUGFzc2luZyB0aGUgbGluZSBwb2ludCBhbmQgbWl0ZXIgdmVjdG9yIGluc3RlYWQgc2hvdWxkIGZpeCB0aGlzIGlzc3VlLAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBib3RoIG9mIHRoZXNlIHZhbHVlcyBjb21lIGZyb20gdGhlIHNhbWUgY2FsY3VsYXRpb24gYmV0d2VlbiB0aGUKICAgICAgICAgICAgICAgIC8vIHR3byBzZWdtZW50cy4gSS5lLiAocHJldmlvdXMgc2VnbWVudCkucDIgPT0gKG5leHQgc2VnbWVudCkucDEgYW5kCiAgICAgICAgICAgICAgICAvLyAocHJldmlvdXMgc2VnbWVudCkubWl0ZXJfdjIgPT0gKG5leHQgc2VnbWVudCkubWl0ZXJfdjEgc2hvdWxkIGJlIHRoZSBjYXNlLgogICAgICAgICAgICAgICAgaWYgKGlzdmFsaWRbMF0gJiYgaXNfdHJ1bmNhdGVkWzBdICYmIChhZGp1c3RtZW50WzBdID09IDAuMCkpIHsKICAgICAgICAgICAgICAgICAgICBmX2xpbmVwb2ludHMueHkgPSBwMS54eSArIHB4X3Blcl91bml0ICogc2NlbmVfb3JpZ2luOyAgIC8vIEZyYWdDb29yZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cKICAgICAgICAgICAgICAgICAgICBmX21pdGVyX3ZlY3MueHkgPSAtbWl0ZXJfdjEueHk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwMS9wMiBpcyByZWxhdGl2ZSB0byB0aGUgc2NlbmUgb3JpZ2luCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZfbGluZXBvaW50cy54eSA9IHZlYzIoLTFlMTIpOyAgICAgICAgICAvLyBGcmFnQ29vcmQgPiAwCiAgICAgICAgICAgICAgICAgICAgZl9taXRlcl92ZWNzLnh5ID0gbm9ybWFsaXplKHZlYzIoLTEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc3ZhbGlkWzNdICYmIGlzX3RydW5jYXRlZFsxXSAmJiAoYWRqdXN0bWVudFsxXSA9PSAwLjApKSB7CiAgICAgICAgICAgICAgICAgICAgZl9saW5lcG9pbnRzLnp3ID0gcDIueHkgKyBweF9wZXJfdW5pdCAqIHNjZW5lX29yaWdpbjsKICAgICAgICAgICAgICAgICAgICBmX21pdGVyX3ZlY3MuencgPSBtaXRlcl92Mi54eTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZl9saW5lcG9pbnRzLnp3ID0gdmVjMigtMWUxMik7CiAgICAgICAgICAgICAgICAgICAgZl9taXRlcl92ZWNzLnp3ID0gbm9ybWFsaXplKHZlYzIoLTEpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBVc2VkIHRvIGVsb25nYXRlIHNkZiB0byBpbmNsdWRlIGpvaW50cwogICAgICAgICAgICAgICAgLy8gaWYgc3RhcnQvZW5kICAgICAgICAgbm8gZWxvbmdhdGlvbgogICAgICAgICAgICAgICAgLy8gaWYgam9pbnQgc2tpcHBlZCAgICAgZWxvbmdhdGUgdG8gbmV3IGxlbmd0aAogICAgICAgICAgICAgICAgLy8gaWYgbm9ybWFsIGpvaW50ICAgICAgZWxvbmdhdGUgYSBsb3QgdG8gbGV0IHNoYXBlL3RydW5jYXRpb24gaGFuZGxlIGpvaW50CiAgICAgICAgICAgICAgICBmX2V4dHJ1c2lvbiA9IHZlYzIoCiAgICAgICAgICAgICAgICAgICAgIWlzdmFsaWRbMF0gPyAwLjAgOiAoYWRqdXN0bWVudFswXSA9PSAwLjAgPyAxZTEyIDogaGFsZndpZHRoICogYWJzKGV4dHJ1c2lvblswXSkpLAogICAgICAgICAgICAgICAgICAgICFpc3ZhbGlkWzNdID8gMC4wIDogKGFkanVzdG1lbnRbMV0gPT0gMC4wID8gMWUxMiA6IGhhbGZ3aWR0aCAqIGFicyhleHRydXNpb25bMV0pKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIGNvbXB1dGUgd2lkdGggc2RmCiAgICAgICAgICAgICAgICBmX2xpbmV3aWR0aCA9IGhhbGZ3aWR0aDsKCiAgICAgICAgICAgICAgICBmX2luc3RhbmNlX2lkID0gbGluZWluZGV4X3N0YXJ0ICsgdWludCgxKTsKCiAgICAgICAgICAgICAgICBmX2N1bXVsYXRpdmVfbGVuZ3RoID0gcHhfcGVyX3VuaXQgKiBsYXN0bGVuX3N0YXJ0OwoKICAgICAgICAgICAgICAgIC8vIGxpbmVjYXAgKyBqb2luc3R5bGUKICAgICAgICAgICAgICAgIGZfY2FwbW9kZSA9IGl2ZWMyKAogICAgICAgICAgICAgICAgICAgIGlzdmFsaWRbMF0gPyBqb2luc3R5bGUgOiBsaW5lY2FwLAogICAgICAgICAgICAgICAgICAgIGlzdmFsaWRbM10gPyBqb2luc3R5bGUgOiBsaW5lY2FwCiAgICAgICAgICAgICAgICApOwoKCiAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAgICAgLy8gVmFyeWluZyB2ZXJ0ZXggZGF0YQogICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgICAgICAgICAgICB2ZWMzIG9mZnNldDsKICAgICAgICAgICAgICAgIGludCB4ID0gaW50KGlzX2VuZCk7CiAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudFt4XSA9PSAwLjApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfdHJ1bmNhdGVkW3hdIHx8ICFpc3ZhbGlkWzMgKiB4XSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgb3ZlcmxhcCBpbiBmcmFnbWVudCBzaGFkZXIgdmlhIFNERiBjb21wYXJpc29uCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNoYXBlX2ZhY3RvciAqICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnggKiAoaGFsZndpZHRoICogbWF4KDEuMCwgYWJzKGV4dHJ1c2lvblt4XSkpICsgQUFfVEhJQ0tORVNTKSAqIHYxICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMocG9zaXRpb24ueSAqIChoYWxmd2lkdGggKyBBQV9USElDS05FU1MpICogbjEsIDApCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG92ZXJsYXAgYnkgYWRqdXN0aW5nIGdlb21ldHJ5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGluY2x1ZGUgeiBpbiBtaXRlcl9uPwogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBwb3NpdGlvbi55ICogc2hhcGVfZmFjdG9yICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYWxmd2lkdGggKyBBQV9USElDS05FU1MpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0WzJdKG1pdGVyX29mZnNldDEsIG1pdGVyX29mZnNldDIpW3hdICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzModmVjMlsyXShtaXRlcl9uMSwgbWl0ZXJfbjIpW3hdLCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgam9pbnQgZm9yIGNsZWFuZXIgdW5pZm9ybV9wYXR0ZXJuIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0KICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0bWVudFt4XSAqIChoYWxmd2lkdGggKiBhYnMoZXh0cnVzaW9uW3hdKSArIEFBX1RISUNLTkVTUykgKiB2MSArCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMocG9zaXRpb24ueSAqIChoYWxmd2lkdGggKyBBQV9USElDS05FU1MpICogbjEsIDApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFZlcnRleCBwb3NpdGlvbiAocGFkZGVkIGZvciBqb2ludCAmIGFudGktYWxpYXNpbmcpCiAgICAgICAgICAgICAgICB2ZWMzIHBvaW50ID0gdmVjM1syXShwMSwgcDIpW3hdICsgb2Zmc2V0OwoKICAgICAgICAgICAgICAgIC8vIFNERidzCiAgICAgICAgICAgICAgICB2ZWMyIFZQMSA9IHBvaW50Lnh5IC0gcDEueHk7CiAgICAgICAgICAgICAgICB2ZWMyIFZQMiA9IHBvaW50Lnh5IC0gcDIueHk7CgogICAgICAgICAgICAgICAgLy8gc2RmIG9mIHRoaXMgc2VnbWVudAogICAgICAgICAgICAgICAgZl9xdWFkX3NkZi54ID0gZG90KFZQMSwgLXYxLnh5KTsKICAgICAgICAgICAgICAgIGZfcXVhZF9zZGYueSA9IGRvdChWUDIsICB2MS54eSk7CiAgICAgICAgICAgICAgICBmX3F1YWRfc2RmLnogPSBkb3QoVlAxLCAgbjEpOwoKICAgICAgICAgICAgICAgIC8vIHNkZiBmb3IgY3JlYXRpbmcgYSBmbGF0IGNhcCBvbiB0cnVuY2F0ZWQgam9pbnRzCiAgICAgICAgICAgICAgICAvLyAoc2lnbihkb3QoLi4uKSkgZGV0ZWN0cyBpZiBsaW5lIGJlbmRzIGxlZnQgb3IgcmlnaHQpCiAgICAgICAgICAgICAgICBmX3RydW5jYXRpb24ueCA9ICFpc190cnVuY2F0ZWRbMF0gPyAtMS4wIDoKICAgICAgICAgICAgICAgICAgICBkb3QoVlAxLCBzaWduKGRvdChtaXRlcl9uMSwgLXYxLnh5KSkgKiBtaXRlcl9uMSkgLSBoYWxmd2lkdGggKiBhYnMobWl0ZXJfb2Zmc2V0MSkKICAgICAgICAgICAgICAgICAgICAtIGFicyhhZGp1c3RtZW50WzBdKSAqIDFlMTI7CiAgICAgICAgICAgICAgICBmX3RydW5jYXRpb24ueSA9ICFpc190cnVuY2F0ZWRbMV0gPyAtMS4wIDoKICAgICAgICAgICAgICAgICAgICBkb3QoVlAyLCBzaWduKGRvdChtaXRlcl9uMiwgK3YxLnh5KSkgKiBtaXRlcl9uMikgLSBoYWxmd2lkdGggKiBhYnMobWl0ZXJfb2Zmc2V0MikKICAgICAgICAgICAgICAgICAgICAtIGFicyhhZGp1c3RtZW50WzFdKSAqIDFlMTI7CgogICAgICAgICAgICAgICAgLy8gQ29sb3JzIHNob3VsZCBiZSBzYW1wbGVkIGJhc2VkIG9uIHRoZSBub3JtYWxpemVkIGRpc3RhbmNlIGZyb20gdGhlCiAgICAgICAgICAgICAgICAvLyBleHRydWRlZCBlZGdlICh2YXJpZXMgd2l0aCBvZmZzZXQgaW4gbiBkaXJlY3Rpb24pCiAgICAgICAgICAgICAgICAvLyAtIGNvcnJlY3RpbmcgZm9yIHRoaXMgd2l0aCBwZXItdmVydGV4IGNvbG9ycyByZXN1bHRzIHZpc2libGUgZmFjZSBib3JkZXIKICAgICAgICAgICAgICAgIC8vIC0gY2FsY3VsYXRpbmcgbm9ybWFsaXplZCBkaXN0YW5jZSBoZXJlIHdpbGwgY2F1c2UgZGl2IDAvbmVnYXRpdmUKICAgICAgICAgICAgICAgIC8vICAgaXNzdWVzIGFzIChsaW5lbGVuZ3RoICstIChleHRydXNpb25bMF0gKyBleHRydXNpb25bMV0pKSA8PSAwIGlzIHBvc3NpYmxlCiAgICAgICAgICAgICAgICAvLyBTbyBkZWZlciBjb2xvciBpbnRlcnBvbGF0aW9uIHRvIGZyYWdtZW50IHNoYWRlcgogICAgICAgICAgICAgICAgZl9saW5lc3RhcnQgPSBzaGFwZV9mYWN0b3IgKiBoYWxmd2lkdGggKiBleHRydXNpb25bMF07CiAgICAgICAgICAgICAgICBmX2xpbmVsZW5ndGggPSBtYXgoMS4wLCBzZWdtZW50X2xlbmd0aCAtIHNoYXBlX2ZhY3RvciAqIGhhbGZ3aWR0aCAqIChleHRydXNpb25bMF0gLSBleHRydXNpb25bMV0pKTsKCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpbiBsaW5lcwogICAgICAgICAgICAgICAgZl9hbHBoYV93ZWlnaHQgPSBtaW4oMS4wLCB3aWR0aCAvIEFBX1JBRElVUyk7CgogICAgICAgICAgICAgICAgLy8gY2xpcCBzcGFjZSBwb3NpdGlvbgogICAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDIuMCAqIHBvaW50Lnh5IC8gKHB4X3Blcl91bml0ICogcmVzb2x1dGlvbikgLSAxLjAsIHBvaW50LnosIDEuMCk7CiAgICAgICAgICAgIH0KICAgICAgICBgOwogICAgfQp9CmZ1bmN0aW9uIGxpbmVzX2ZyYWdtZW50X3NoYWRlcih1bmlmb3JtcywgYXR0cmlidXRlcykgewogICAgY29uc3QgY29sb3JfdW5pZm9ybXMgPSBmaWx0ZXJfYnlfa2V5KHVuaWZvcm1zLCBbCiAgICAgICAgInBpY2tpbmciLAogICAgICAgICJ1bmlmb3JtX3BhdHRlcm4iLAogICAgICAgICJ1bmlmb3JtX3BhdHRlcm5fbGVuZ3RoIiwKICAgICAgICAidW5pZm9ybV9jb2xvcnJhbmdlIiwKICAgICAgICAidW5pZm9ybV9jb2xvcm1hcCIsCiAgICAgICAgIm5hbl9jb2xvciIsCiAgICAgICAgImhpZ2hjbGlwX2NvbG9yIiwKICAgICAgICAibG93Y2xpcF9jb2xvciIKICAgIF0pOwogICAgY29uc3QgdW5pZm9ybV9kZWNsID0gdW5pZm9ybXNfdG9fdHlwZV9kZWNsYXJhdGlvbihjb2xvcl91bmlmb3Jtcyk7CiAgICBjb25zdCBjb2xvciA9IGF0dHJpYnV0ZV90eXBlKGF0dHJpYnV0ZXMubGluZV9jb2xvcl9zdGFydCkgfHwgdW5pZm9ybV90eXBlKHVuaWZvcm1zLmxpbmVfY29sb3Jfc3RhcnQpOwogICAgcmV0dXJuIGAKICAgIC8vIHVuY29tbWVudCBmb3IgZGVidWcgcmVuZGVyaW5nCiAgICAvLyAjZGVmaW5lIERFQlVHCgogICAgcHJlY2lzaW9uIGhpZ2hwIGludDsKICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgIHByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7CiAgICBwcmVjaXNpb24gaGlnaHAgc2FtcGxlcjNEOwoKICAgIGluIGhpZ2hwIHZlYzMgZl9xdWFkX3NkZjsKICAgIGluIHZlYzIgZl90cnVuY2F0aW9uOwogICAgaW4gZmxvYXQgZl9saW5lc3RhcnQ7CiAgICBpbiBmbG9hdCBmX2xpbmVsZW5ndGg7CgogICAgZmxhdCBpbiBmbG9hdCBmX2xpbmV3aWR0aDsKICAgIGZsYXQgaW4gdmVjNCBmX3BhdHRlcm5fb3ZlcndyaXRlOwogICAgZmxhdCBpbiB2ZWMyIGZfZXh0cnVzaW9uOwogICAgZmxhdCBpbiAke2NvbG9yfSBmX2NvbG9yMTsKICAgIGZsYXQgaW4gJHtjb2xvcn0gZl9jb2xvcjI7CiAgICBmbGF0IGluIGZsb2F0IGZfYWxwaGFfd2VpZ2h0OwogICAgZmxhdCBpbiB1aW50IGZfaW5zdGFuY2VfaWQ7CiAgICBmbGF0IGluIGZsb2F0IGZfY3VtdWxhdGl2ZV9sZW5ndGg7CiAgICBmbGF0IGluIGl2ZWMyIGZfY2FwbW9kZTsKICAgIGZsYXQgaW4gdmVjNCBmX2xpbmVwb2ludHM7CiAgICBmbGF0IGluIHZlYzQgZl9taXRlcl92ZWNzOwoKICAgIHVuaWZvcm0gdWludCBvYmplY3RfaWQ7CiAgICAke3VuaWZvcm1fZGVjbH0KCiAgICBvdXQgdmVjNCBmcmFnbWVudF9jb2xvcjsKCiAgICAvLyBIYWxmIHdpZHRoIG9mIGFudGlhbGlhc2luZyBzbW9vdGhzdGVwCiAgICBjb25zdCBmbG9hdCBBQV9SQURJVVMgPSAwLjg7CiAgICAvLyBzcGFjZSBhbGxvY2F0ZWQgZm9yIEFBCiAgICBjb25zdCBmbG9hdCBBQV9USElDS05FU1MgPSAyLjAgKiBBQV9SQURJVVM7CiAgICBjb25zdCBpbnQgQlVUVCAgID0gMDsKICAgIGNvbnN0IGludCBTUVVBUkUgPSAxOwogICAgY29uc3QgaW50IFJPVU5EICA9IDI7CiAgICBjb25zdCBpbnQgTUlURVIgID0gMDsKICAgIGNvbnN0IGludCBCRVZFTCAgPSAzOwoKICAgIGZsb2F0IGFhc3RlcChmbG9hdCB0aHJlc2hvbGQsIGZsb2F0IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHNtb290aHN0ZXAodGhyZXNob2xkLUFBX1JBRElVUywgdGhyZXNob2xkK0FBX1JBRElVUywgdmFsdWUpOwogICAgfQoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vIENvbG9yIGhhbmRsaW5nCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgogICAgdmVjNCBnZXRfY29sb3JfZnJvbV9jbWFwKGZsb2F0IHZhbHVlLCBzYW1wbGVyMkQgY29sb3JtYXAsIHZlYzIgY29sb3JyYW5nZSkgewogICAgICAgIGZsb2F0IGNtaW4gPSBjb2xvcnJhbmdlLng7CiAgICAgICAgZmxvYXQgY21heCA9IGNvbG9ycmFuZ2UueTsKICAgICAgICBpZiAodmFsdWUgPD0gY21heCAmJiB2YWx1ZSA+PSBjbWluKSB7CiAgICAgICAgICAgIC8vIGluIHZhbHVlIHJhbmdlLCBjb250aW51ZSEKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgY21pbikgewogICAgICAgICAgICByZXR1cm4gbG93Y2xpcF9jb2xvcjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gY21heCkgewogICAgICAgICAgICByZXR1cm4gaGlnaGNsaXBfY29sb3I7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gaXNuYW4gQ0FOIGJlIGJyb2tlbiAob2YgY291cnNlKSAtLi0KICAgICAgICAgICAgLy8gc28gaWYgb3V0c2lkZSB2YWx1ZSByYW5nZSBhbmQgbm90IHNtYWxsZXIvYmlnZ2VyIG1pbi9tYXggd2UgYXNzdW1lIE5hTgogICAgICAgICAgICByZXR1cm4gbmFuX2NvbG9yOwogICAgICAgIH0KICAgICAgICBmbG9hdCBpMDEgPSBjbGFtcCgodmFsdWUgLSBjbWluKSAvIChjbWF4IC0gY21pbiksIDAuMCwgMS4wKTsKICAgICAgICAvLyAxLzAgY29ycmVzcG9uZHMgdG8gdGhlIGNvcm5lciBvZiB0aGUgY29sb3JtYXAsIHNvIHRvIHByb3Blcmx5IGludGVycG9sYXRlCiAgICAgICAgLy8gYmV0d2VlbiB0aGUgY29sb3JzLCB3ZSBuZWVkIHRvIHNjYWxlIGl0LCBzbyB0aGF0IHRoZSBlbmRzIGFyZSBhdCAxIC0gKHN0ZXBzaXplLzIpIGFuZCAwKyhzdGVwc2l6ZS8yKS4KICAgICAgICBmbG9hdCBzdGVwc2l6ZSA9IDEuMCAvIGZsb2F0KHRleHR1cmVTaXplKGNvbG9ybWFwLCAwKSk7CiAgICAgICAgaTAxID0gKDEuMCAtIHN0ZXBzaXplKSAqIGkwMSArIDAuNSAqIHN0ZXBzaXplOwogICAgICAgIHJldHVybiB0ZXh0dXJlKGNvbG9ybWFwLCB2ZWMyKGkwMSwgMC4wKSk7CiAgICB9CgogICAgdmVjNCBnZXRfY29sb3IoZmxvYXQgY29sb3IsIHNhbXBsZXIyRCBjb2xvcm1hcCwgdmVjMiBjb2xvcnJhbmdlKSB7CiAgICAgICAgcmV0dXJuIGdldF9jb2xvcl9mcm9tX2NtYXAoY29sb3IsIGNvbG9ybWFwLCBjb2xvcnJhbmdlKTsKICAgIH0KCiAgICB2ZWM0IGdldF9jb2xvcih2ZWM0IGNvbG9yLCBib29sIGNvbG9ybWFwLCBib29sIGNvbG9ycmFuZ2UpIHsKICAgICAgICByZXR1cm4gY29sb3I7CiAgICB9CiAgICB2ZWM0IGdldF9jb2xvcih2ZWMzIGNvbG9yLCBib29sIGNvbG9ybWFwLCBib29sIGNvbG9ycmFuZ2UpIHsKICAgICAgICByZXR1cm4gdmVjNChjb2xvciwgMS4wKTsKICAgIH0KCgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyBQYXR0ZXJuIHNhbXBsaW5nCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgogICAgZmxvYXQgZ2V0X3BhdHRlcm5fc2RmKHNhbXBsZXIyRCB1bmlmb3JtX3BhdHRlcm4sIHZlYzIgdXYpewoKICAgICAgICAvLyBmX3BhdHRlcm5fb3ZlcndyaXRlLngKICAgICAgICAvLyAgICAgIHYgICAgICAgICAgIGpvaW50CiAgICAgICAgLy8gICAgLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vICAgICAgfCAgICAgICAgICB8CiAgICAgICAgLy8gICAgLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGpvaW50ICAgICAgICAgICBeCiAgICAgICAgLy8gICAgICBmX3BhdHRlcm5fb3ZlcndyaXRlLnoKCiAgICAgICAgZmxvYXQgdyA9IDIuMCAqIGZfbGluZXdpZHRoOwogICAgICAgIGlmICh1di54IDw9IGZfcGF0dGVybl9vdmVyd3JpdGUueCkgewogICAgICAgICAgICAvLyBvdmVyd3JpdGUgZm9yIHVuaWZvcm1fcGF0dGVybiB3aXRoICJPTiIgdG8gdGhlIHJpZ2h0IChwb3NpdGl2ZSB1di54KQogICAgICAgICAgICBmbG9hdCBzZGZfb3ZlcndyaXRlID0gdyAqIHVuaWZvcm1fcGF0dGVybl9sZW5ndGggKiAoZl9wYXR0ZXJuX292ZXJ3cml0ZS54IC0gdXYueCk7CiAgICAgICAgICAgIC8vIHVuaWZvcm1fcGF0dGVybiB2YWx1ZSB3aGVyZSB3ZSBzdGFydCBvdmVyd3JpdGluZwogICAgICAgICAgICBmbG9hdCBlZGdlX3NhbXBsZSA9IHcgKiB0ZXh0dXJlKHVuaWZvcm1fcGF0dGVybiwgdmVjMihmX3BhdHRlcm5fb3ZlcndyaXRlLngsIDAuNSkpLng7CiAgICAgICAgICAgIC8vIG9mZnNldCBmb3Igb3ZlcndyaXRlIHRvIHNtb290aGx5IGNvbm5lY3QgYmV0d2VlbiBzYW1wbGluZyBhbmQgZWRnZQogICAgICAgICAgICBmbG9hdCBzZGZfb2Zmc2V0ID0gbWF4KGZfcGF0dGVybl9vdmVyd3JpdGUueSAqIGVkZ2Vfc2FtcGxlLCAtQUFfUkFESVVTKTsKICAgICAgICAgICAgLy8gYWRkIG9mZnNldCBhbmQgYXBwbHkgZGlyZWN0aW9uICgiT04iIHRvIGxlZnQgb3IgcmlnaHQpIHRvIG92ZXJ3cml0ZQogICAgICAgICAgICByZXR1cm4gZl9wYXR0ZXJuX292ZXJ3cml0ZS55ICogKHNkZl9vdmVyd3JpdGUgKyBzZGZfb2Zmc2V0KTsKICAgICAgICB9IGVsc2UgaWYgKHV2LnggPj0gZl9wYXR0ZXJuX292ZXJ3cml0ZS56KSB7CiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgKG90aGVyIHRoYW4gbWlycm9yaW5nIG92ZXJ3cml0ZSBkaXJlY3Rpb24pCiAgICAgICAgICAgIGZsb2F0IHNkZl9vdmVyd3JpdGUgPSB3ICogdW5pZm9ybV9wYXR0ZXJuX2xlbmd0aCAqICh1di54IC0gZl9wYXR0ZXJuX292ZXJ3cml0ZS56KTsKICAgICAgICAgICAgZmxvYXQgZWRnZV9zYW1wbGUgPSB3ICogdGV4dHVyZSh1bmlmb3JtX3BhdHRlcm4sIHZlYzIoZl9wYXR0ZXJuX292ZXJ3cml0ZS56LCAwLjUpKS54OwogICAgICAgICAgICBmbG9hdCBzZGZfb2Zmc2V0ID0gbWF4KGZfcGF0dGVybl9vdmVyd3JpdGUudyAqIGVkZ2Vfc2FtcGxlLCAtQUFfUkFESVVTKTsKICAgICAgICAgICAgcmV0dXJuIGZfcGF0dGVybl9vdmVyd3JpdGUudyAqIChzZGZfb3ZlcndyaXRlICsgc2RmX29mZnNldCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIC8vIGluIGFsbG93ZWQgcmFuZ2UKICAgICAgICAgICAgcmV0dXJuIHcgKiB0ZXh0dXJlKHVuaWZvcm1fcGF0dGVybiwgdXYpLng7CiAgICB9CgogICAgZmxvYXQgZ2V0X3BhdHRlcm5fc2RmKGJvb2wgXywgdmVjMiB1dil7CiAgICAgICAgcmV0dXJuIC0xMC4wOwogICAgfQoKICAgIHZlYzIgZW5jb2RlX3VpbnRfdG9fZmxvYXQodWludCB2YWx1ZSkgewogICAgICAgIGZsb2F0IGxvd2VyID0gZmxvYXQodmFsdWUgJiAweEZGRkZ1KSAvIDY1NTM1LjA7CiAgICAgICAgZmxvYXQgdXBwZXIgPSBmbG9hdCh2YWx1ZSA+PiAxNnUpIC8gNjU1MzUuMDsKICAgICAgICByZXR1cm4gdmVjMihsb3dlciwgdXBwZXIpOwogICAgfQoKICAgIHZlYzQgcGFja19pbnQodWludCBpZCwgdWludCBpbmRleCkgewogICAgICAgIHZlYzQgdW5wYWNrOwogICAgICAgIHVucGFjay5yZyA9IGVuY29kZV91aW50X3RvX2Zsb2F0KGlkKTsKICAgICAgICB1bnBhY2suYmEgPSBlbmNvZGVfdWludF90b19mbG9hdChpbmRleCk7CiAgICAgICAgcmV0dXJuIHVucGFjazsKICAgIH0KCgogICAgdm9pZCBtYWluKCl7CiAgICAgICAgdmVjNCBjb2xvcjsKCiAgICAgICAgLy8gZl9xdWFkX3NkZi54IGlzIHRoZSBkaXN0YW5jZSBmcm9tIHAxLCBuZWdhdGl2ZSBpbiB2MSBkaXJlY3Rpb24uCiAgICAgICAgdmVjMiB1diA9IHZlYzIoCiAgICAgICAgICAgIChmX2N1bXVsYXRpdmVfbGVuZ3RoIC0gZl9xdWFkX3NkZi54KSAvICgyLjAgKiBmX2xpbmV3aWR0aCAqIHVuaWZvcm1fcGF0dGVybl9sZW5ndGgpLAogICAgICAgICAgICAwLjUgKyAwLjUgKiBmX3F1YWRfc2RmLnogLyBmX2xpbmV3aWR0aAogICAgICAgICk7CgogICAgI2lmbmRlZiBERUJVRwogICAgICAgIC8vIGRpc2NhcmQgZnJhZ21lbnRzIHRoYXQgYXJlIG90aGVyIHNpZGUgb2YgdGhlIHRydW5jYXRlZCBqb2ludAogICAgICAgIGZsb2F0IGRpc2NhcmRfc2RmMSA9IGRvdChnbF9GcmFnQ29vcmQueHkgLSBmX2xpbmVwb2ludHMueHksIGZfbWl0ZXJfdmVjcy54eSk7CiAgICAgICAgZmxvYXQgZGlzY2FyZF9zZGYyID0gZG90KGdsX0ZyYWdDb29yZC54eSAtIGZfbGluZXBvaW50cy56dywgZl9taXRlcl92ZWNzLnp3KTsKICAgICAgICBpZiAoKGZfcXVhZF9zZGYueCA+IDAuMCAmJiBkaXNjYXJkX3NkZjEgPiAwLjApIHx8CiAgICAgICAgICAgIChmX3F1YWRfc2RmLnkgPiAwLjAgJiYgZGlzY2FyZF9zZGYyID49IDAuMCkpCiAgICAgICAgICAgIGRpc2NhcmQ7CgogICAgICAgIGZsb2F0IHNkZjsKCiAgICAgICAgLy8gZl9xdWFkX3NkZi54IGluY2x1ZGVzIGV2ZXJ5dGhpbmcgZnJvbSBwMSBpbiBwMi1wMSBkaXJlY3Rpb24sIGkuZS4gPgogICAgICAgIC8vIGZfcXVhZF9zZGYueSBpbmNsdWRlcyBldmVyeXRoaW5nIGZyb20gcDIgaW4gcDEtcDIgZGlyZWN0aW9uLCBpLmUuIDwKICAgICAgICAvLyA8ICAgPCB8ID4gICAgPCA+ICAgIDwgfCA+ICAgPgogICAgICAgIC8vIDwgICA8IDEtPi0tLS08LT4tLS0tPC0yID4gICA+CiAgICAgICAgLy8gPCAgIDwgfCA+ICAgIDwgPiAgICA8IHwgPiAgID4KICAgICAgICBpZiAoZl9jYXBtb2RlLnggPT0gUk9VTkQpIHsKICAgICAgICAgICAgLy8gaW4gY2lyY2xlKHAxLCBoYWxmd2lkdGgpIHx8IGlzIGJleW9uZCBwMSBpbiBwMi1wMSBkaXJlY3Rpb24KICAgICAgICAgICAgc2RmID0gbWluKHNxcnQoZl9xdWFkX3NkZi54ICogZl9xdWFkX3NkZi54ICsgZl9xdWFkX3NkZi56ICogZl9xdWFkX3NkZi56KSAtIGZfbGluZXdpZHRoLCBmX3F1YWRfc2RmLngpOwogICAgICAgIH0gZWxzZSBpZiAoZl9jYXBtb2RlLnggPT0gU1FVQVJFKSB7CiAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gcDItcDEgZGlyZWN0aW9uIHNoaWZ0ZWQgYnkgaGFsZndpZHRoIGluIHAxLXAyIGRpcmVjdGlvbiAoaS5lLiBpbmNsdWRlIG1vcmUpCiAgICAgICAgICAgIHNkZiA9IGZfcXVhZF9zZGYueCAtIGZfbGluZXdpZHRoOwogICAgICAgIH0gZWxzZSB7IC8vIG1pdGVyIG9yIGJldmVsIGpvaW50IG9yIDpidXR0IGNhcAogICAgICAgICAgICAvLyB2YXJpYWJsZSBzaGlmdCBpbiAtKHAyLXAxKSBkaXJlY3Rpb24gdG8gbWFrZSBzcGFjZSBmb3Igam9pbnRzCiAgICAgICAgICAgIHNkZiA9IGZfcXVhZF9zZGYueCAtIGZfZXh0cnVzaW9uLng7CiAgICAgICAgICAgIC8vIGRvIHRydW5jYXRlIGpvaW50cwogICAgICAgICAgICBzZGYgPSBtYXgoc2RmLCBmX3RydW5jYXRpb24ueCk7CiAgICAgICAgfQoKICAgICAgICAvLyBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgcDIKICAgICAgICBpZiAoZl9jYXBtb2RlLnkgPT0gUk9VTkQpIHsKICAgICAgICAgICAgc2RmID0gbWF4KHNkZiwKICAgICAgICAgICAgICAgIG1pbihzcXJ0KGZfcXVhZF9zZGYueSAqIGZfcXVhZF9zZGYueSArIGZfcXVhZF9zZGYueiAqIGZfcXVhZF9zZGYueikgLSBmX2xpbmV3aWR0aCwgZl9xdWFkX3NkZi55KQogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAoZl9jYXBtb2RlLnkgPT0gU1FVQVJFKSB7CiAgICAgICAgICAgIHNkZiA9IG1heChzZGYsIGZfcXVhZF9zZGYueSAtIGZfbGluZXdpZHRoKTsKICAgICAgICB9IGVsc2UgeyAvLyBtaXRlciBvciBiZXZlbCBqb2ludCBvciA6YnV0dCBjYXAKICAgICAgICAgICAgc2RmID0gbWF4KHNkZiwgZl9xdWFkX3NkZi55IC0gZl9leHRydXNpb24ueSk7CiAgICAgICAgICAgIHNkZiA9IG1heChzZGYsIGZfdHJ1bmNhdGlvbi55KTsKICAgICAgICB9CgogICAgICAgIC8vIGRpc3RhbmNlIGluIHVuaWZvcm1fbGluZXdpZHRoIGRpcmVjdGlvbgogICAgICAgIC8vIGZfcXVhZF9zZGYueiBpcyAwIGFsb25nIHRoZSBsaW5lIGNvbm5lY3RpbmcgcDEgYW5kIHAyIGFuZCBpbmNyZWFzZXMgYWxvbmcgbGluZS1ub3JtYWwgZGlyZWN0aW9uCiAgICAgICAgLy8gIF4gIHwgIF4gICAgICBeICB8IF4KICAgICAgICAvLyAgICAgMS0tLS0tLS0tLS0tLTIKICAgICAgICAvLyAgXiAgfCAgXiAgICAgIF4gIHwgXgogICAgICAgIHNkZiA9IG1heChzZGYsIGFicyhmX3F1YWRfc2RmLnopIC0gZl9saW5ld2lkdGgpOwoKICAgICAgICAvLyBpbm5lciB0cnVuY2F0aW9uIChBQSBmb3Igb3ZlcmxhcHBpbmcgcGFydHMpCiAgICAgICAgLy8gbWluKGEsIGIpIGtlZXBzIHdoYXQgaXMgaW5zaWRlIGEgYW5kIGIKICAgICAgICAvLyB3aGVyZSBhIGlzIHRoZSBzbW9vdGhseSBjdXQgb2YgcGFydCBqdXN0IGJlZm9yZSBkaXNjYXJkIHRyaWdnZXJzIChpLmUuIHZpc2libGUpCiAgICAgICAgLy8gYW5kIGIgaXMgdGhlIChzbW9vdGhseSkgY3V0IG9mIHBhcnQgd2hlcmUgdGhlIGRpc2NhcmQgdHJpZ2dlcnMKICAgICAgICAvLyAxMDAuMHggc2RmIG1ha2VzIHRoZSBzZGYgbXVjaCBtb3JlIHNoYXJwbHksIGF2b2lkaW5nIG92ZXJkcmF3IGluIHRoZSBjZW50ZXIKICAgICAgICBzZGYgPSBtYXgoc2RmLCBtaW4oZl9xdWFkX3NkZi54ICsgMS4wLCAxMDAuMCAqIGRpc2NhcmRfc2RmMSAtIDEuMCkpOwogICAgICAgIHNkZiA9IG1heChzZGYsIG1pbihmX3F1YWRfc2RmLnkgKyAxLjAsIDEwMC4wICogZGlzY2FyZF9zZGYyIC0gMS4wKSk7CgogICAgICAgIC8vIHVuaWZvcm1fcGF0dGVybiBhcHBsaWNhdGlvbgogICAgICAgIHNkZiA9IG1heChzZGYsIGdldF9wYXR0ZXJuX3NkZih1bmlmb3JtX3BhdHRlcm4sIHV2KSk7CgogICAgICAgIC8vIGRyYXcKCiAgICAgICAgLy8gIHYtIGVkZ2UKICAgICAgICAvLyAgIC4tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyAgICAnLgogICAgICAgIC8vICAgICAgcDEgICAgICB2MQogICAgICAgIC8vICAgICAgICAnLiAgIC0tLT4KICAgICAgICAvLyAgICAgICAgICAnLS0tLS0tLS0tLQogICAgICAgIC8vIC1mX3F1YWRfc2RmLnggaXMgdGhlIGRpc3RhbmNlIGZyb20gcDEsIHBvc2l0aXZlIGluIHYxIGRpcmVjdGlvbgogICAgICAgIC8vIGZfbGluZXN0YXJ0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHAxIGFuZCB0aGUgbGVmdCBlZGdlIGFsb25nIHYxIGRpcmVjdGlvbgogICAgICAgIC8vIGZfc3RhcnRfbGVuZ3RoLnkgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGVkZ2VzIG9mIHRoaXMgc2VnbWVudCwgaW4gdjEgZGlyZWN0aW9uCiAgICAgICAgLy8gc28gdGhpcyBpcyAwIGF0IHRoZSBsZWZ0IGVkZ2UgYW5kIDEgYXQgdGhlIHJpZ2h0IGVkZ2UgKHdpdGggZXh0cnVzaW9uIGNvbnNpZGVyZWQpCiAgICAgICAgZmxvYXQgZmFjdG9yID0gKC1mX3F1YWRfc2RmLnggLSBmX2xpbmVzdGFydCkgLyBmX2xpbmVsZW5ndGg7CiAgICAgICAgY29sb3IgPSBnZXRfY29sb3IoZl9jb2xvcjEgKyBmYWN0b3IgKiAoZl9jb2xvcjIgLSBmX2NvbG9yMSksIHVuaWZvcm1fY29sb3JtYXAsIHVuaWZvcm1fY29sb3JyYW5nZSk7CgogICAgICAgIGNvbG9yLmEgKj0gYWFzdGVwKDAuMCwgLXNkZikgKiBmX2FscGhhX3dlaWdodDsKICAgICNlbmRpZgoKICAgICNpZmRlZiBERUJVRwogICAgICAgIC8vIGJhc2UgY29sb3IKICAgICAgICBjb2xvciA9IHZlYzQoMC41LCAwLjUsIDAuNSwgMC4yKTsKICAgICAgICBjb2xvci5yZ2IgKz0gKDIuMCAqIG1vZChmbG9hdChmX2luc3RhbmNlX2lkKSwgMi4wKSAtIDEuMCkgKiAwLjE7CgogICAgICAgIC8vIHNob3cgY29sb3IgaW50ZXJwb2xhdGlvbiBhcyBicmlnaHRuZXNzIGdyYWRpZW50CiAgICAgICAgLy8gZmxvYXQgZmFjdG9yID0gKC1mX3F1YWRfc2RmLnggLSBmX2xpbmVzdGFydCkgLyBmX2xpbmVsZW5ndGg7CiAgICAgICAgLy8gY29sb3IucmdiICs9ICgyLjAgKiBmYWN0b3IgLSAxLjApICogMC4yOwoKICAgICAgICAvLyBtYXJrICJvdXRzaWRlIiBkZWZpbmUgYnkgcXVhZF9zZGYgaW4gYmxhY2sKICAgICAgICBmbG9hdCBzZGYgPSBtYXgoZl9xdWFkX3NkZi54IC0gZl9leHRydXNpb24ueCwgZl9xdWFkX3NkZi55IC0gZl9leHRydXNpb24ueSk7CiAgICAgICAgc2RmID0gbWF4KHNkZiwgYWJzKGZfcXVhZF9zZGYueikgLSBmX2xpbmV3aWR0aCk7CiAgICAgICAgY29sb3IucmdiIC09IHZlYzMoMC40KSAqIHN0ZXAoMC4wLCBzZGYpOwoKICAgICAgICAvLyBNYXJrIGRpc2NhcmRlZCBzcGFjZSBpbiByZWQvYmx1ZQogICAgICAgIGZsb2F0IGRpc2NhcmRfc2RmMSA9IGRvdChnbF9GcmFnQ29vcmQueHkgLSBmX2xpbmVwb2ludHMueHksIGZfbWl0ZXJfdmVjcy54eSk7CiAgICAgICAgZmxvYXQgZGlzY2FyZF9zZGYyID0gZG90KGdsX0ZyYWdDb29yZC54eSAtIGZfbGluZXBvaW50cy56dywgZl9taXRlcl92ZWNzLnp3KTsKICAgICAgICBpZiAoZl9xdWFkX3NkZi54ID4gMC4wICYmIGRpc2NhcmRfc2RmMSA+IDAuMCkKICAgICAgICAgICAgY29sb3IuciArPSAwLjU7CiAgICAgICAgaWYgKGZfcXVhZF9zZGYueSA+IDAuMCAmJiBkaXNjYXJkX3NkZjIgPj0gMC4wKQogICAgICAgICAgICBjb2xvci5iICs9IDAuNTsKCiAgICAgICAgLy8gcmVtYWluaW5nIG92ZXJsYXAgYXMgc29mdGVyIHJlZC9ibHVlCiAgICAgICAgaWYgKGRpc2NhcmRfc2RmMSAtIDEuMCA+IDAuMCkKICAgICAgICAgICAgY29sb3IuciArPSAwLjI7CiAgICAgICAgICAgIGNvbG9yLnIgKz0gMC4yOwogICAgICAgIGlmIChkaXNjYXJkX3NkZjIgLSAxLjAgPiAwLjApCiAgICAgICAgICAgIGNvbG9yLmIgKz0gMC4yOwoKICAgICAgICAvLyBNYXJrIHJlZ2lvbnMgZXhjbHVkZWQgdmlhIHRydW5jYXRpb24gaW4gZ3JlZW4KICAgICAgICBjb2xvci5nICs9IDAuNSAqIHN0ZXAoMC4wLCBtYXgoZl90cnVuY2F0aW9uLngsIGZfdHJ1bmNhdGlvbi55KSk7CgogICAgICAgIC8vIGFuZCBpbm5lciB0cnVuY2F0aW9uIGFzIHNvZnRlciBncmVlbgogICAgICAgIGlmIChtaW4oZl9xdWFkX3NkZi54ICsgMS4wLCAxMDAuMCAqIGRpc2NhcmRfc2RmMSAtIDEuMCkgPiAwLjApCiAgICAgICAgICAgIGNvbG9yLmcgKz0gMC4yOwogICAgICAgIGlmIChtaW4oZl9xdWFkX3NkZi55ICsgMS4wLCAxMDAuMCAqIGRpc2NhcmRfc2RmMiAtIDEuMCkgPiAwLjApCiAgICAgICAgICAgIGNvbG9yLmcgKz0gMC4yOwoKICAgICAgICAvLyBtYXJrIHVuaWZvcm1fcGF0dGVybiBpbiB3aGl0ZQogICAgICAgIGNvbG9yLnJnYiArPSB2ZWMzKDAuMykgKiBzdGVwKDAuMCwgZ2V0X3BhdHRlcm5fc2RmKHVuaWZvcm1fcGF0dGVybiwgdXYpKTsKICAgICNlbmRpZgoKICAgICAgICBpZiAoY29sb3IuYSA8PSAwLjApCiAgICAgICAgICAgIGRpc2NhcmQ7CgogICAgICAgIGlmIChwaWNraW5nKSB7CiAgICAgICAgICAgIGlmIChjb2xvci5hID4gMC4xKSB7CiAgICAgICAgICAgICAgICBmcmFnbWVudF9jb2xvciA9IHBhY2tfaW50KG9iamVjdF9pZCwgZl9pbnN0YW5jZV9pZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmcmFnbWVudF9jb2xvciA9IHZlYzQoY29sb3IucmdiLCBjb2xvci5hKTsKICAgIH0KICAgIGA7Cn0KZnVuY3Rpb24gY3JlYXRlX2xpbmVfbWF0ZXJpYWwodW5pZm9ybXNfZGVzLCBhdHRyaWJ1dGVzLCBpc19saW5lc2VnbWVudHMpIHsKICAgIGNvbnN0IG1hdCA9IG5ldyBUSFJFRS5SYXdTaGFkZXJNYXRlcmlhbCh7CiAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1zX2RlcywKICAgICAgICBnbHNsVmVyc2lvbjogVEhSRUUuR0xTTDMsCiAgICAgICAgdmVydGV4U2hhZGVyOiBsaW5lc192ZXJ0ZXhfc2hhZGVyKHVuaWZvcm1zX2RlcywgYXR0cmlidXRlcywgaXNfbGluZXNlZ21lbnRzKSwKICAgICAgICBmcmFnbWVudFNoYWRlcjogbGluZXNfZnJhZ21lbnRfc2hhZGVyKHVuaWZvcm1zX2RlcywgYXR0cmlidXRlcyksCiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsCiAgICAgICAgYmxlbmRpbmc6IFRIUkVFLkN1c3RvbUJsZW5kaW5nLAogICAgICAgIGJsZW5kU3JjOiBUSFJFRS5TcmNBbHBoYUZhY3RvciwKICAgICAgICBibGVuZERzdDogVEhSRUUuT25lTWludXNTcmNBbHBoYUZhY3RvciwKICAgICAgICBibGVuZFNyY0FscGhhOiBUSFJFRS5aZXJvRmFjdG9yLAogICAgICAgIGJsZW5kRHN0QWxwaGE6IFRIUkVFLk9uZUZhY3RvciwKICAgICAgICBibGVuZEVxdWF0aW9uOiBUSFJFRS5BZGRFcXVhdGlvbgogICAgfSk7CiAgICBtYXQudW5pZm9ybXMub2JqZWN0X2lkID0gewogICAgICAgIHZhbHVlOiAxCiAgICB9OwogICAgcmV0dXJuIG1hdDsKfQpmdW5jdGlvbiBhdHRhY2hfaW50ZXJsZWF2ZWRfbGluZV9idWZmZXIoYXR0cl9uYW1lLCBnZW9tZXRyeSwgZGF0YSwgbmRpbSwgaXNfc2VnbWVudHMsIGlzX3Bvc2l0aW9uKSB7CiAgICBjb25zdCBza2lwX2VsZW1zID0gaXNfc2VnbWVudHMgPyAyICogbmRpbSA6IG5kaW07CiAgICBjb25zdCBidWZmZXIgPSBuZXcgVEhSRUUuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoZGF0YSwgc2tpcF9lbGVtcywgMSk7CiAgICBidWZmZXIuY291bnQgPSBNYXRoLm1heCgwLCBpc19zZWdtZW50cyA/IE1hdGguZmxvb3IoYnVmZmVyLmNvdW50IC0gMSkgOiBidWZmZXIuY291bnQgLSAzKTsKICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZShhdHRyX25hbWUgKyAiX3N0YXJ0IiwgbmV3IFRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKGJ1ZmZlciwgbmRpbSwgbmRpbSkpOwogICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKGF0dHJfbmFtZSArICJfZW5kIiwgbmV3IFRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKGJ1ZmZlciwgbmRpbSwgMiAqIG5kaW0pKTsKICAgIGlmIChpc19wb3NpdGlvbikgewogICAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZShhdHRyX25hbWUgKyAiX3ByZXYiLCBuZXcgVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoYnVmZmVyLCBuZGltLCAwKSk7CiAgICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKGF0dHJfbmFtZSArICJfbmV4dCIsIG5ldyBUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZShidWZmZXIsIG5kaW0sIDMgKiBuZGltKSk7CiAgICB9CiAgICBnZW9tZXRyeS5pbnRlcmxlYXZlZF9hdHRyaWJ1dGVzW2F0dHJfbmFtZV0gPSBidWZmZXI7CiAgICByZXR1cm4gYnVmZmVyOwp9CmZ1bmN0aW9uIGNyZWF0ZV9saW5lX2luc3RhbmNlX2dlb21ldHJ5KCkgewogICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKTsKICAgIGdlb21ldHJ5LmludGVybGVhdmVkX2F0dHJpYnV0ZXMgPSB7fTsKICAgIGNvbnN0IGluc3RhbmNlX3Bvc2l0aW9ucyA9IFsKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIC0xLAogICAgICAgIDEsCiAgICAgICAgMSwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgLTEsCiAgICAgICAgMQogICAgXTsKICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShpbnN0YW5jZV9wb3NpdGlvbnMsIDIpKTsKICAgIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFRIUkVFLlNwaGVyZSgpOwogICAgZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gMTAwMDAwMDAwMDAwMDA7CiAgICBnZW9tZXRyeS5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7CiAgICByZXR1cm4gZ2VvbWV0cnk7Cn0KZnVuY3Rpb24gY3JlYXRlX2xpbmVfYnVmZmVyKGdlb21ldHJ5LCBidWZmZXJzLCBuYW1lLCBhdHRyLCBpc19zZWdtZW50cywgaXNfcG9zaXRpb24pIHsKICAgIGNvbnN0IGZsYXRfYnVmZmVyID0gYXR0ci5mbGF0OwogICAgY29uc3QgbmRpbXMgPSBhdHRyLnR5cGVfbGVuZ3RoOwogICAgY29uc3QgbGluZWJ1ZmZlciA9IGF0dGFjaF9pbnRlcmxlYXZlZF9saW5lX2J1ZmZlcihuYW1lLCBnZW9tZXRyeSwgZmxhdF9idWZmZXIsIG5kaW1zLCBpc19zZWdtZW50cywgaXNfcG9zaXRpb24pOwogICAgYnVmZmVyc1tuYW1lXSA9IGxpbmVidWZmZXI7CiAgICByZXR1cm4gZmxhdF9idWZmZXI7Cn0KZnVuY3Rpb24gY3JlYXRlX2xpbmVfYnVmZmVycyhnZW9tZXRyeSwgYnVmZmVycywgYXR0cmlidXRlcywgaXNfc2VnbWVudHMpIHsKICAgIGZvcihsZXQgbmFtZSBpbiBhdHRyaWJ1dGVzKXsKICAgICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBjcmVhdGVfbGluZV9idWZmZXIoZ2VvbWV0cnksIGJ1ZmZlcnMsIG5hbWUsIGF0dHIsIGlzX3NlZ21lbnRzLCBuYW1lID09ICJwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYyIpOwogICAgfQp9CmZ1bmN0aW9uIGdldF9wb2ludHNfdmlldyhwb2ludHMsIGluZGljZXMsIG5kaW0pIHsKICAgIGxldCB2aWV3ID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzLmxlbmd0aCAqIG5kaW0pOwogICAgZm9yKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspewogICAgICAgIGxldCBpbmRleCA9IGluZGljZXNbaV07CiAgICAgICAgZm9yKGxldCBqID0gMDsgaiA8IG5kaW07IGorKyl7CiAgICAgICAgICAgIHZpZXdbaSAqIG5kaW0gKyBqXSA9IHBvaW50c1tpbmRleCAqIG5kaW0gKyBqXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmlldzsKfQpmdW5jdGlvbiBwYWNrX2FycmF5KGFycmF5LCBkYXRhLCB0eXBlX2xlbmd0aCA9IDApIHsKICAgIGlmIChhcnJheS5mbGF0KSB7CiAgICAgICAgY29uc3QgdGwgPSB0eXBlX2xlbmd0aCA9PT0gMCA/IGFycmF5LnR5cGVfbGVuZ3RoIDogdHlwZV9sZW5ndGg7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZmxhdDogZGF0YSwKICAgICAgICAgICAgdHlwZV9sZW5ndGg6IHRsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIHVucGFja19hcnJheShhcnJheSkgewogICAgaWYgKGFycmF5LmZsYXQpIHsKICAgICAgICByZXR1cm4gYXJyYXkuZmxhdDsKICAgIH0KICAgIHJldHVybiBhcnJheTsKfQpmdW5jdGlvbiBjb21wdXRlX2xhc3RsZW4ocG9pbnRzLCBwb2ludF9uZGltLCBwdm0sIHJlcywgaXNfbGluZXNfd2l0aF9saW5lc3R5bGUpIHsKICAgIGlmICghaXNfbGluZXNfd2l0aF9saW5lc3R5bGUpIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHBvaW50cy5sZW5ndGggLyBwb2ludF9uZGltKS5maWxsKDApOwogICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDApOwogICAgY29uc3QgbnVtX3BvaW50cyA9IHBvaW50cy5sZW5ndGggLyBwb2ludF9uZGltOwogICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1fcG9pbnRzKTsKICAgIGNvbnN0IHNjYWxlID0gbmV3IFRIUkVFLlZlY3RvcjIoMC41ICogcmVzLngsIDAuNSAqIHJlcy55KTsKICAgIGNvbnN0IHNlY29uZF9wb2ludF9pZHggPSAxICogcG9pbnRfbmRpbTsKICAgIGxldCBjbGlwID0gbmV3IFRIUkVFLlZlY3RvcjQocG9pbnRzW3NlY29uZF9wb2ludF9pZHhdLCBwb2ludHNbc2Vjb25kX3BvaW50X2lkeCArIDFdLCBwb2ludF9uZGltID09PSAzID8gcG9pbnRzW3NlY29uZF9wb2ludF9pZHggKyAyXSA6IDAsIDEpLmFwcGx5TWF0cml4NChwdm0pOwogICAgbGV0IHByZXYgPSBuZXcgVEhSRUUuVmVjdG9yMihjbGlwLngsIGNsaXAueSkubXVsdGlwbHkoc2NhbGUpLmRpdmlkZVNjYWxhcihjbGlwLncpOwogICAgb3V0cHV0WzBdID0gMC4wOwogICAgb3V0cHV0WzFdID0gMC4wOwogICAgb3V0cHV0W291dHB1dC5sZW5ndGggLSAxXSA9IDAuMDsKICAgIGxldCBwb2ludF9pID0gMjsKICAgIHdoaWxlKHBvaW50X2kgPCBudW1fcG9pbnRzKXsKICAgICAgICBjb25zdCBhcnJheV9pZHggPSBwb2ludF9pICogcG9pbnRfbmRpbTsKICAgICAgICBjb25zdCB4MSA9IHBvaW50c1thcnJheV9pZHhdOwogICAgICAgIGNvbnN0IHkxID0gcG9pbnRzW2FycmF5X2lkeCArIDFdOwogICAgICAgIGNvbnN0IHogPSBwb2ludF9uZGltID09PSAzID8gcG9pbnRzW2FycmF5X2lkeCArIDJdIDogMDsKICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHgxKSAmJiBOdW1iZXIuaXNGaW5pdGUoeTEpICYmIChwb2ludF9uZGltID09PSAyIHx8IE51bWJlci5pc0Zpbml0ZSh6KSkpIHsKICAgICAgICAgICAgY2xpcCA9IG5ldyBUSFJFRS5WZWN0b3I0KHgxLCB5MSwgeiwgMSkuYXBwbHlNYXRyaXg0KHB2bSk7CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgVEhSRUUuVmVjdG9yMihjbGlwLngsIGNsaXAueSkubXVsdGlwbHkoc2NhbGUpLmRpdmlkZVNjYWxhcihjbGlwLncpOwogICAgICAgICAgICBjb25zdCBsZW5ndGggPSBjdXJyZW50LmRpc3RhbmNlVG8ocHJldik7CiAgICAgICAgICAgIG91dHB1dFtwb2ludF9pXSA9IG91dHB1dFtwb2ludF9pIC0gMV0gKyBsZW5ndGg7CiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50OwogICAgICAgICAgICBwb2ludF9pICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3V0cHV0W3BvaW50X2ldID0gMC4wOwogICAgICAgICAgICBvdXRwdXRbcG9pbnRfaSArIDFdID0gMC4wOwogICAgICAgICAgICBpZiAocG9pbnRfaSArIDIgPCBudW1fcG9pbnRzKSB7CiAgICAgICAgICAgICAgICBvdXRwdXRbTWF0aC5taW4ob3V0cHV0Lmxlbmd0aCAtIDEsIHBvaW50X2kgKyAyKV0gPSAwLjA7CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0X3BvaW50X2lkeCA9IChwb2ludF9pICsgMikgKiBwb2ludF9uZGltOwogICAgICAgICAgICAgICAgY2xpcCA9IG5ldyBUSFJFRS5WZWN0b3I0KHBvaW50c1tuZXh0X3BvaW50X2lkeF0sIHBvaW50c1tuZXh0X3BvaW50X2lkeCArIDFdLCBwb2ludF9uZGltID09PSAzID8gcG9pbnRzW25leHRfcG9pbnRfaWR4ICsgMl0gOiAwLCAxKS5hcHBseU1hdHJpeDQocHZtKTsKICAgICAgICAgICAgICAgIHByZXYgPSBuZXcgVEhSRUUuVmVjdG9yMihjbGlwLngsIGNsaXAueSkubXVsdGlwbHkoc2NhbGUpLmRpdmlkZVNjYWxhcihjbGlwLncpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvaW50X2kgKz0gMzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0cHV0Owp9CmZ1bmN0aW9uIGdldF9wcm9qZWN0aW9udmlldyhjYW0sIHBsb3QpIHsKICAgIGNvbnN0IHNwYWNlID0gcGxvdC5wbG90X2RhdGEuY2FtX3NwYWNlOwogICAgY29uc3QgaWRlbnRpdHkgPSBuZXcgVEhSRUUuVW5pZm9ybShuZXcgVEhSRUUuTWF0cml4NCgpKTsKICAgIGlmIChzcGFjZSA9PSAiZGF0YSIpIHsKICAgICAgICByZXR1cm4gY2FtLnByb2plY3Rpb252aWV3OwogICAgfSBlbHNlIGlmIChzcGFjZSA9PSAicGl4ZWwiKSB7CiAgICAgICAgcmV0dXJuIGNhbS5waXhlbF9zcGFjZTsKICAgIH0gZWxzZSBpZiAoc3BhY2UgPT0gInJlbGF0aXZlIikgewogICAgICAgIHJldHVybiBjYW0ucmVsYXRpdmVfc3BhY2U7CiAgICB9IGVsc2UgaWYgKHNwYWNlID09ICJjbGlwIikgewogICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGFjZSAke3NwYWNlfSBub3Qgc3VwcG9ydGVkIWApOwogICAgfQp9CmZ1bmN0aW9uIGdldF9sYXN0X2xlbihwbG90LCBwb2ludHMpIHsKICAgIGNvbnN0IGNhbSA9IHBsb3Quc2NlbmUud2dsX2NhbWVyYTsKICAgIGNvbnN0IGlzX2xpbmVzX3dpdGhfbGluZXN0eWxlID0gIXBsb3QuaXNfc2VnbWVudHMgJiYgcGxvdC5wbG90X2RhdGEucGF0dGVybiAhPSBmYWxzZTsKICAgIGNvbnN0IHB2bSA9IGdldF9wcm9qZWN0aW9udmlldyhjYW0sIHBsb3QpOwogICAgY29uc3QgcmVzID0gY2FtLnJlc29sdXRpb247CiAgICBjb25zdCBwb2ludF9uZGltID0gcGxvdC5uZGltc1sicG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMiXSB8fCAyOwogICAgY29uc3Qgc3BhY2UgPSBwbG90LnBsb3RfZGF0YS5jYW1fc3BhY2U7CiAgICBjb25zdCBzdGF0aWNfc3BhY2UgPSBzcGFjZSA9PT0gImNsaXAiIHx8IHNwYWNlID09PSAicmVsYXRpdmUiOwogICAgaWYgKCFjYW0ub25fdXBkYXRlLmhhcyhwbG90LnV1aWQpICYmICFzdGF0aWNfc3BhY2UpIHsKICAgICAgICBjYW0ub25fdXBkYXRlW3Bsb3QudXVpZF0gPSAoeDEpPT57CiAgICAgICAgICAgIGNvbnN0IGdlb20gPSBwbG90Lm1lc2guZ2VvbWV0cnk7CiAgICAgICAgICAgIGNvbnN0IGlhID0gZ2VvbS5pbnRlcmxlYXZlZF9hdHRyaWJ1dGVzOwogICAgICAgICAgICBjb25zdCBuZXdfcG9pbnRzID0gaWEucG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMuYXJyYXk7CiAgICAgICAgICAgIGNvbXB1dGVfbGFzdGxlbihuZXdfcG9pbnRzLCBwb2ludF9uZGltLCBwdm0udmFsdWUsIHJlcy52YWx1ZSwgaXNfbGluZXNfd2l0aF9saW5lc3R5bGUpOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gY29tcHV0ZV9sYXN0bGVuKHBvaW50cywgcG9pbnRfbmRpbSwgcHZtLnZhbHVlLCByZXMudmFsdWUsIGlzX2xpbmVzX3dpdGhfbGluZXN0eWxlKTsKfQpmdW5jdGlvbiBhZGRfbGluZV9hdHRyaWJ1dGVzKHBsb3QsIGF0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IG5ld19kYXRhID0ge307CiAgICBsZXQgeyBsaW5laW5kZXggIH0gPSBwbG90OwogICAgaWYgKGF0dHJpYnV0ZXMucG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMpIHsKICAgICAgICBjb25zdCB7IHBvc2l0aW9uc190cmFuc2Zvcm1lZF9mMzJjICB9ID0gYXR0cmlidXRlczsKICAgICAgICBjb25zdCB2YWwgPSB1bnBhY2tfYXJyYXkocG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMpOwogICAgICAgIGlmIChwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYy50eXBlX2xlbmd0aCkgewogICAgICAgICAgICBwbG90Lm5kaW1zWyJwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYyJdID0gcG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMudHlwZV9sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGxpbmVpbmRleCA9IG5hbl9mcmVlX3BvaW50c19pbmRpY2VzKHZhbCwgcGxvdC5uZGltc1sicG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMiXSk7CiAgICAgICAgcGxvdC5saW5laW5kZXggPSBsaW5laW5kZXg7CiAgICAgICAgY29uc3QgcG9pbnRzID0gZ2V0X3BvaW50c192aWV3KHZhbCwgbGluZWluZGV4LCBwbG90Lm5kaW1zWyJwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYyJdKTsKICAgICAgICBuZXdfZGF0YVsicG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMiXSA9IHBhY2tfYXJyYXkocG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmMsIHBvaW50cyk7CiAgICAgICAgbmV3X2RhdGFbImxpbmVpbmRleCJdID0gcGFja19hcnJheShwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYywgbGluZWluZGV4LCAxKTsKICAgICAgICBuZXdfZGF0YVsibGFzdGxlbiJdID0gcGFja19hcnJheShwb3NpdGlvbnNfdHJhbnNmb3JtZWRfZjMyYywgZ2V0X2xhc3RfbGVuKHBsb3QsIHBvaW50cyksIDEpOwogICAgfQogICAgZnVuY3Rpb24gaXNfdW5pZm9ybShrZXkpIHsKICAgICAgICByZXR1cm4ga2V5IGluIHBsb3QuZGVzZXJpYWxpemVkX3VuaWZvcm1zOwogICAgfQogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpewogICAgICAgIGNvbnN0IHZhbCA9IHVucGFja19hcnJheSh2YWx1ZSk7CiAgICAgICAgaWYgKGtleSA9PT0gInBvc2l0aW9uc190cmFuc2Zvcm1lZF9mMzJjIikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChrZXkgPT09ICJsaW5lX2NvbG9yIiB8fCBrZXkgPT09ICJ1bmlmb3JtX2xpbmV3aWR0aCIpICYmIGlzX3VuaWZvcm0oa2V5KSkgewogICAgICAgICAgICBuZXdfZGF0YVtrZXkgKyAiX3N0YXJ0Il0gPSB2YWx1ZTsKICAgICAgICAgICAgbmV3X2RhdGFba2V5ICsgIl9lbmQiXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAoaXNfdHlwZWRfYXJyYXkodmFsKSAmJiAoa2V5ID09PSAibGluZV9jb2xvciIgfHwga2V5ID09PSAidW5pZm9ybV9saW5ld2lkdGgiKSkgewogICAgICAgICAgICBpZiAodmFsdWUudHlwZV9sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHBsb3QubmRpbXNba2V5XSA9IHZhbHVlLnR5cGVfbGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld19kYXRhW2tleV0gPSBwYWNrX2FycmF5KHZhbHVlLCBnZXRfcG9pbnRzX3ZpZXcodmFsLCBsaW5laW5kZXgsIHBsb3QubmRpbXNba2V5XSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld19kYXRhW2tleV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3X2RhdGE7Cn0KZnVuY3Rpb24gY3JlYXRlX2xpbmUocGxvdF9vYmplY3QpIHsKICAgIGNvbnN0IGdlb21ldHJ5ID0gY3JlYXRlX2xpbmVfaW5zdGFuY2VfZ2VvbWV0cnkoKTsKICAgIGNvbnN0IGJ1ZmZlcnMgPSB7fTsKICAgIGNvbnN0IHsgcGxvdF9kYXRhICB9ID0gcGxvdF9vYmplY3Q7CiAgICBjcmVhdGVfbGluZV9idWZmZXJzKGdlb21ldHJ5LCBidWZmZXJzLCBhZGRfbGluZV9hdHRyaWJ1dGVzKHBsb3Rfb2JqZWN0LCBwbG90X2RhdGEuYXR0cmlidXRlcyksIHBsb3Rfb2JqZWN0LmlzX3NlZ21lbnRzKTsKICAgIGNvbnN0IG1hdGVyaWFsID0gY3JlYXRlX2xpbmVfbWF0ZXJpYWwoYWRkX2xpbmVfYXR0cmlidXRlcyhwbG90X29iamVjdCwgcGxvdF9vYmplY3QuZGVzZXJpYWxpemVkX3VuaWZvcm1zKSwgZ2VvbWV0cnkuYXR0cmlidXRlcywgcGxvdF9vYmplY3QuaXNfc2VnbWVudHMpOwogICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0gIXBsb3RfZGF0YS5vdmVyZHJhdzsKICAgIG1hdGVyaWFsLmRlcHRoV3JpdGUgPSAhcGxvdF9kYXRhLnRyYW5zcGFyZW5jeTsKICAgIG1hdGVyaWFsLnVuaWZvcm1zLmlzX2xpbmVzZWdtZW50cyA9IHsKICAgICAgICB2YWx1ZTogcGxvdF9vYmplY3QuaXNfc2VnbWVudHMKICAgIH07CiAgICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgIG1lc2guZ2VvbWV0cnkuaW5zdGFuY2VDb3VudCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb25zX3RyYW5zZm9ybWVkX2YzMmNfc3RhcnQuY291bnQ7CiAgICByZXR1cm4gbWVzaDsKfQpjbGFzcyBMaW5lcyBleHRlbmRzIFBsb3QgewogICAgY29uc3RydWN0b3Ioc2NlbmUsIGRhdGEpewogICAgICAgIHN1cGVyKHNjZW5lLCBkYXRhKTsKICAgICAgICBpZiAoZGF0YS5wbG90X3R5cGUgIT09ICJMaW5lcyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5lcyBjbGFzcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggcGxvdF90eXBlICdMaW5lcycgZm91bmQgJHtkYXRhLnBsb3RfdHlwZX1gKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc19zZWdtZW50cyA9IGRhdGEuaXNfc2VnbWVudHMgPT09IHRydWU7CiAgICAgICAgdGhpcy5pc19pbnN0YW5jZWQgPSB0cnVlOwogICAgICAgIHRoaXMubmRpbXMgPSB7fTsKICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7CiAgICAgICAgdGhpcy5tZXNoID0gY3JlYXRlX2xpbmUodGhpcyk7CiAgICAgICAgdGhpcy5pbml0X21lc2goKTsKICAgIH0KICAgIHVwZGF0ZShkYXRhX2tleV92YWx1ZV9hcnJheSkgewogICAgICAgIGNvbnN0IGRpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoZGF0YV9rZXlfdmFsdWVfYXJyYXkubWFwKChbaywgdl0pPT5bCiAgICAgICAgICAgICAgICBrLAogICAgICAgICAgICAgICAgZXhwYW5kX2NvbXByZXNzZWQodikKICAgICAgICAgICAgXSkpOwogICAgICAgIGNvbnN0IGxpbmVfYXR0ciA9IE9iamVjdC5lbnRyaWVzKGFkZF9saW5lX2F0dHJpYnV0ZXModGhpcywgZGljdCkpOwogICAgICAgIHN1cGVyLnVwZGF0ZShsaW5lX2F0dHIpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgICB0aGlzLnNjZW5lLndnbF9jYW1lcmEub25fdXBkYXRlLmRlbGV0ZSh0aGlzLnV1aWQpOwogICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKICAgIH0KfQpjbGFzcyBNZXNoIGV4dGVuZHMgUGxvdCB7CiAgICBjb25zdHJ1Y3RvcihzY2VuZSwgZGF0YSl7CiAgICAgICAgc3VwZXIoc2NlbmUsIGRhdGEpOwogICAgICAgIGlmICgiaW5zdGFuY2VfYXR0cmlidXRlcyIgaW4gZGF0YSkgewogICAgICAgICAgICB0aGlzLmlzX2luc3RhbmNlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMubWVzaCA9IGNyZWF0ZV9pbnN0YW5jZWRfbWVzaCh0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLm1lc2ggPSBjcmVhdGVfbWVzaCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbml0X21lc2goKTsKICAgIH0KfQpmdW5jdGlvbiBicm9hZGNhc3RfZ2V0aW5kZXgoYSwgeDEsIGkpIHsKICAgIGlmIChhLmxlbmd0aCA9PSB4MS5sZW5ndGggLyAyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUKHgxW2kgKiAyXSwgeDFbaSAqIDIgKyAxXSk7CiAgICB9IGVsc2UgaWYgKHgxLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUKHgxWzBdLCB4MVsxXSk7CiAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0X2dldGluZGV4OiB4IGhhcyBsZW5ndGggJHt4MS5sZW5ndGh9LCBidXQgYSBoYXMgbGVuZ3RoICR7YS5sZW5ndGh9YCk7CiAgICB9Cn0KZnVuY3Rpb24gcGVyX2dseXBoX2RhdGEoZ2x5cGhfaGFzaGVzLCBzY2FsZXMpIHsKICAgIGNvbnN0IGF0bGFzID0gZ2V0X3RleHR1cmVfYXRsYXMoKTsKICAgIGNvbnN0IHV2X29mZnNldF93aWR0aCA9IG5ldyBGbG9hdDMyQXJyYXkoZ2x5cGhfaGFzaGVzLmxlbmd0aCAqIDQpOwogICAgY29uc3QgbWFya2Vyc2l6ZSA9IG5ldyBGbG9hdDMyQXJyYXkoZ2x5cGhfaGFzaGVzLmxlbmd0aCAqIDIpOwogICAgY29uc3QgcXVhZF9vZmZzZXRzID0gbmV3IEZsb2F0MzJBcnJheShnbHlwaF9oYXNoZXMubGVuZ3RoICogMik7CiAgICBmb3IobGV0IGkgPSAwOyBpIDwgZ2x5cGhfaGFzaGVzLmxlbmd0aDsgaSsrKXsKICAgICAgICBjb25zdCBoYXNoID0gZ2x5cGhfaGFzaGVzW2ldOwogICAgICAgIGNvbnN0IGRhdGEgPSBhdGxhcy5nZXRfZ2x5cGhfZGF0YShoYXNoLCBicm9hZGNhc3RfZ2V0aW5kZXgoZ2x5cGhfaGFzaGVzLCBzY2FsZXMsIGkpKTsKICAgICAgICBjb25zdCBbdXYsIGNfd2lkdGgsIHFfb2Zmc2V0XSA9IGRhdGEgPz8gWwogICAgICAgICAgICBuZXcgb3QoMCwgMCwgMCwgMCksCiAgICAgICAgICAgIG5ldyBUKDAsIDApLAogICAgICAgICAgICBuZXcgVCgwLCAwKQogICAgICAgIF07CiAgICAgICAgdXZfb2Zmc2V0X3dpZHRoLnNldCh1di50b0FycmF5KCksIGkgKiA0KTsKICAgICAgICBtYXJrZXJzaXplLnNldChjX3dpZHRoLnRvQXJyYXkoKSwgaSAqIDIpOwogICAgICAgIHF1YWRfb2Zmc2V0cy5zZXQocV9vZmZzZXQudG9BcnJheSgpLCBpICogMik7CiAgICB9CiAgICByZXR1cm4gWwogICAgICAgIHV2X29mZnNldF93aWR0aCwKICAgICAgICBtYXJrZXJzaXplLAogICAgICAgIHF1YWRfb2Zmc2V0cwogICAgXTsKfQpmdW5jdGlvbiBnZXRfZ2x5cGhfZGF0YV9hdHRyaWJ1dGVzKGF0bGFzLCBnbHlwaF9kYXRhKSB7CiAgICBpZiAoZ2x5cGhfZGF0YSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHt9OwogICAgfQogICAgY29uc3QgeyBnbHlwaF9oYXNoZXMgLCBhdGxhc191cGRhdGVzICwgc2NhbGVzICB9ID0gZ2x5cGhfZGF0YTsKICAgIGF0bGFzLmluc2VydF9nbHlwaHMoYXRsYXNfdXBkYXRlcyk7CiAgICBpZiAoZ2x5cGhfaGFzaGVzKSB7CiAgICAgICAgY29uc3QgW3NkZl91diwgcXVhZF9zY2FsZSwgcXVhZF9vZmZzZXRdID0gcGVyX2dseXBoX2RhdGEoZ2x5cGhfaGFzaGVzLCBzY2FsZXMpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNkZl91diwKICAgICAgICAgICAgcXVhZF9zY2FsZSwKICAgICAgICAgICAgcXVhZF9vZmZzZXQKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHt9Owp9CmNsYXNzIFNjYXR0ZXIgZXh0ZW5kcyBQbG90IHsKICAgIGNvbnN0cnVjdG9yKHNjZW5lLCBkYXRhKXsKICAgICAgICBjb25zdCBhdGxhcyA9IGdldF90ZXh0dXJlX2F0bGFzKCk7CiAgICAgICAgY29uc3QgbGVuZ3RocyA9IHsKICAgICAgICAgICAgc2RmX3V2OiA0CiAgICAgICAgfTsKICAgICAgICBpZiAoImdseXBoX2RhdGEiIGluIGRhdGEpIHsKICAgICAgICAgICAgY29uc3QgZ2RhdGEgPSBnZXRfZ2x5cGhfZGF0YV9hdHRyaWJ1dGVzKGF0bGFzLCBkYXRhLmdseXBoX2RhdGEpOwogICAgICAgICAgICBkZWxldGUgZGF0YS5nbHlwaF9kYXRhOwogICAgICAgICAgICBmb3IoY29uc3QgbmFtZSBpbiBnZGF0YSl7CiAgICAgICAgICAgICAgICBjb25zdCBidWZmID0gZ2RhdGFbbmFtZV07CiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBsZW5ndGhzW25hbWVdIHx8IDI7CiAgICAgICAgICAgICAgICBkYXRhLmluc3RhbmNlX2F0dHJpYnV0ZXNbbmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgZmxhdDogYnVmZiwKICAgICAgICAgICAgICAgICAgICB0eXBlX2xlbmd0aDogbGVuCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cGVyKHNjZW5lLCBkYXRhKTsKICAgICAgICB0aGlzLmlzX2luc3RhbmNlZCA9IHRydWU7CiAgICAgICAgdGhpcy5hdGxhcyA9IGF0bGFzOwogICAgICAgIHRoaXMubWVzaCA9IGNyZWF0ZV9pbnN0YW5jZWRfbWVzaCh0aGlzKTsKICAgICAgICB0aGlzLmluaXRfbWVzaCgpOwogICAgfQogICAgdXBkYXRlKGRhdGFfa2V5X3ZhbHVlX2FycmF5KSB7CiAgICAgICAgY29uc3QgZGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhkYXRhX2tleV92YWx1ZV9hcnJheSk7CiAgICAgICAgaWYgKCJnbHlwaF9kYXRhIiBpbiBkaWN0KSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRfZ2x5cGhfZGF0YV9hdHRyaWJ1dGVzKHRoaXMuYXRsYXMsIGRpY3QuZ2x5cGhfZGF0YSk7CiAgICAgICAgICAgIGRlbGV0ZSBkaWN0LmdseXBoX2RhdGE7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKXsKICAgICAgICAgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cGVyLnVwZGF0ZShPYmplY3QuZW50cmllcyhkaWN0KSk7CiAgICB9Cn0KZnVuY3Rpb24gbmFuX2ZyZWVfcG9pbnRzX2luZGljZXMocG9pbnRzLCBuZGltKSB7CiAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICBjb25zdCBucG9pbnRzID0gcG9pbnRzLmxlbmd0aCAvIG5kaW07CiAgICBsZXQgd2FzX25hbiA9IHRydWU7CiAgICBsZXQgbG9vcF9zdGFydF9pZHggPSAtMTsKICAgIGZvcihsZXQgaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspewogICAgICAgIGNvbnN0IHAgPSBnZXRfcG9pbnQocG9pbnRzLCBpLCBuZGltKTsKICAgICAgICBpZiAocG9pbnRfaXNuYW4ocCkpIHsKICAgICAgICAgICAgaWYgKCF3YXNfbmFuKSB7CiAgICAgICAgICAgICAgICBpZiAobG9vcF9zdGFydF9pZHggIT09IC0xICYmIGxvb3Bfc3RhcnRfaWR4ICsgMiA8IGluZGljZXMubGVuZ3RoICYmIHBvaW50c19hcHByb3hfZXF1YWwoZ2V0X3BvaW50KHBvaW50cywgaW5kaWNlc1tsb29wX3N0YXJ0X2lkeF0sIG5kaW0pLCBnZXRfcG9pbnQocG9pbnRzLCBpIC0gMSwgbmRpbSkpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGluZGljZXNbbG9vcF9zdGFydF9pZHggKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tsb29wX3N0YXJ0X2lkeCAtIDFdID0gaSAtIDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGluZGljZXMucHVzaChpIC0gMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9vcF9zdGFydF9pZHggPSAtMTsKICAgICAgICAgICAgd2FzX25hbiA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHdhc19uYW4pIHsKICAgICAgICAgICAgICAgIGluZGljZXMucHVzaChpKTsKICAgICAgICAgICAgICAgIGxvb3Bfc3RhcnRfaWR4ID0gaW5kaWNlcy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2FzX25hbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpbmRpY2VzLnB1c2goaSk7CiAgICB9CiAgICBpZiAoIXdhc19uYW4pIHsKICAgICAgICBpZiAobG9vcF9zdGFydF9pZHggIT09IC0xICYmIGxvb3Bfc3RhcnRfaWR4ICsgMiA8IGluZGljZXMubGVuZ3RoICYmIHBvaW50c19hcHByb3hfZXF1YWwoZ2V0X3BvaW50KHBvaW50cywgaW5kaWNlc1tsb29wX3N0YXJ0X2lkeF0sIG5kaW0pLCBnZXRfcG9pbnQocG9pbnRzLCBucG9pbnRzIC0gMSwgbmRpbSkpKSB7CiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRpY2VzW2xvb3Bfc3RhcnRfaWR4ICsgMV0pOwogICAgICAgICAgICBpbmRpY2VzW2xvb3Bfc3RhcnRfaWR4IC0gMV0gPSBucG9pbnRzIC0gMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRpY2VzLnB1c2gobnBvaW50cyAtIDEpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoaW5kaWNlcyk7Cn0KZnVuY3Rpb24gZ2V0X3BvaW50KHBvaW50cywgaW5kZXgsIG5kaW0pIHsKICAgIHJldHVybiBwb2ludHMuc2xpY2UoaW5kZXggKiBuZGltLCAoaW5kZXggKyAxKSAqIG5kaW0pOwp9CmZ1bmN0aW9uIHBvaW50X2lzbmFuKHApIHsKICAgIHJldHVybiBwLnNvbWUoKHApPT5pc05hTihwKSk7Cn0KZnVuY3Rpb24gcG9pbnRzX2FwcHJveF9lcXVhbChwMSwgcDIpIHsKICAgIHJldHVybiBwMS5ldmVyeSgocCwgaSk9PmFwcHJveF9lcXVhbChwLCBwMltpXSkpOwp9CmZ1bmN0aW9uIGFwcHJveF9lcXVhbChhLCBiKSB7CiAgICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDwgTnVtYmVyLkVQU0lMT047Cn0KY29uc3QgbW9kMSA9IHsKICAgIGV4cGFuZF9jb21wcmVzc2VkOiBleHBhbmRfY29tcHJlc3NlZCwKICAgIFBsb3Q6IFBsb3QsCiAgICBMaW5lczogTGluZXMsCiAgICBNZXNoOiBNZXNoLAogICAgU2NhdHRlcjogU2NhdHRlcgp9Owp3aW5kb3cuVEhSRUUgPSBtb2Q7CmNvbnN0IG9yZGVyZWRFeGVjdXRvciA9IHsKICAgIHRhc2tzOiBuZXcgTWFwKCksCiAgICBuZXh0RXhwZWN0ZWQ6IDEsCiAgICBpbnNlcnQgKGYsIG9yZGVyKSB7CiAgICAgICAgaWYgKHRoaXMudGFza3MuaGFzKG9yZGVyKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSB0YXNrIGZvciBvcmRlciAke29yZGVyfWApOwogICAgICAgIH0KICAgICAgICB0aGlzLnRhc2tzLnNldChvcmRlciwgZik7CiAgICAgICAgdGhpcy5mbHVzaCgpOwogICAgfSwKICAgIGZsdXNoICgpIHsKICAgICAgICB3aGlsZSh0aGlzLnRhc2tzLmhhcyh0aGlzLm5leHRFeHBlY3RlZCkpewogICAgICAgICAgICBjb25zdCBmID0gdGhpcy50YXNrcy5nZXQodGhpcy5uZXh0RXhwZWN0ZWQpOwogICAgICAgICAgICBmKCk7CiAgICAgICAgICAgIHRoaXMudGFza3MuZGVsZXRlKHRoaXMubmV4dEV4cGVjdGVkKTsKICAgICAgICAgICAgdGhpcy5uZXh0RXhwZWN0ZWQgKz0gMTsKICAgICAgICB9CiAgICB9Cn07CmZ1bmN0aW9uIGV4ZWN1dGVfaW5fb3JkZXIob3JkZXIsIGYpIHsKICAgIGlmIChvcmRlciA8IDEgfHwgIU51bWJlci5pc0ludGVnZXIob3JkZXIpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyOiAke29yZGVyfWApOwogICAgfQogICAgb3JkZXJlZEV4ZWN1dG9yLmluc2VydChmLCBvcmRlcik7Cn0KZnVuY3Rpb24gZGlzcG9zZV9zY3JlZW4oc2NyZWVuKSB7CiAgICBpZiAoT2JqZWN0LmtleXMoc2NyZWVuKS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB7IHJlbmRlcmVyICwgcGlja2luZ190YXJnZXQgLCByb290X3NjZW5lICwgY29tbSAgfSA9IHNjcmVlbjsKICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICB3aW5kb3dfb3BlbjogZmFsc2UKICAgIH0pOwogICAgaWYgKHJlbmRlcmVyKSB7CiAgICAgICAgY29uc3QgY2FudmFzID0gcmVuZGVyZXIuZG9tRWxlbWVudDsKICAgICAgICBpZiAoY2FudmFzLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2FudmFzKTsKICAgICAgICB9CiAgICAgICAgcmVuZGVyZXIuc3RhdGUucmVzZXQoKTsKICAgICAgICByZW5kZXJlci5mb3JjZUNvbnRleHRMb3NzKCk7CiAgICAgICAgcmVuZGVyZXIuZGlzcG9zZSgpOwogICAgfQogICAgaWYgKHNjcmVlbi50ZXh0dXJlX2F0bGFzKSB7CiAgICAgICAgc2NyZWVuLnRleHR1cmVfYXRsYXMuZGlzcG9zZSgpOwogICAgICAgIHNjcmVlbi50ZXh0dXJlX2F0bGFzLmltYWdlID0gbnVsbDsKICAgICAgICBzY3JlZW4udGV4dHVyZV9hdGxhcyA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGlmIChyb290X3NjZW5lKSB7CiAgICAgICAgZGVsZXRlX3RocmVlX3NjZW5lKHJvb3Rfc2NlbmUpOwogICAgfQogICAgaWYgKHBpY2tpbmdfdGFyZ2V0KSB7CiAgICAgICAgcGlja2luZ190YXJnZXQuZGlzcG9zZSgpOwogICAgfQogICAgaWYgKHNjcmVlbi5yZXNpemVPYnNlcnZlcikgewogICAgICAgIHNjcmVlbi5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgc2NyZWVuLnJlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkOwogICAgfQogICAgT2JqZWN0LmtleXMoc2NyZWVuKS5mb3JFYWNoKChrZXkpPT5kZWxldGUgc2NyZWVuW2tleV0pOwogICAgcmV0dXJuOwp9CmZ1bmN0aW9uIGNoZWNrX3NjcmVlbihzY3JlZW4pIHsKICAgIGlmICghc2NyZWVuIHx8ICFzY3JlZW4ucmVuZGVyZXIpIHsKICAgICAgICBkaXNwb3NlX3NjcmVlbihzY3JlZW4pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IHNjcmVlbi5yZW5kZXJlci5kb21FbGVtZW50OwogICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGNhbnZhcykpIHsKICAgICAgICBjb25zb2xlLmxvZygicmVtb3ZpbmcgV0dMIGNvbnRleHQsIGNhbnZhcyBpcyBub3QgaW4gdGhlIERPTSBhbnltb3JlISIpOwogICAgICAgIGRpc3Bvc2Vfc2NyZWVuKHNjcmVlbik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gcmVuZGVyX3NjZW5lKHNjZW5lLCBwaWNraW5nID0gZmFsc2UpIHsKICAgIGNvbnN0IHsgcmVuZGVyZXIgLCBjYW1lcmEgLCBweF9wZXJfdW5pdCAgfSA9IHNjZW5lLnNjcmVlbjsKICAgIGlmICghY2hlY2tfc2NyZWVuKHNjZW5lLnNjcmVlbikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoIXNjZW5lLnZpc2libGUudmFsdWUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJlbmRlcmVyLmF1dG9DbGVhciA9IHNjZW5lLmNsZWFyc2NlbmUudmFsdWU7CiAgICBjb25zdCBhcmVhID0gc2NlbmUudmlld3BvcnQudmFsdWU7CiAgICBpZiAoYXJlYSkgewogICAgICAgIGNvbnN0IFt4MSwgeTEsIHcsIGhdID0gYXJlYS5tYXAoKHgxKT0+eDEgKiBweF9wZXJfdW5pdCk7CiAgICAgICAgcmVuZGVyZXIuc2V0Vmlld3BvcnQoeDEsIHkxLCB3LCBoKTsKICAgICAgICByZW5kZXJlci5zZXRTY2lzc29yKHgxLCB5MSwgdywgaCk7CiAgICAgICAgcmVuZGVyZXIuc2V0U2Npc3NvclRlc3QodHJ1ZSk7CiAgICAgICAgaWYgKHBpY2tpbmcpIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0Q2xlYXJBbHBoYSgwKTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihuZXcgbW9kLkNvbG9yKDApLCAwLjApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGFscGhhID0gc2NlbmUuYmFja2dyb3VuZGNvbG9yX2FscGhhLnZhbHVlOwogICAgICAgICAgICByZW5kZXJlci5zZXRDbGVhckNvbG9yKHNjZW5lLmJhY2tncm91bmRjb2xvci52YWx1ZSwgYWxwaGEpOwogICAgICAgIH0KICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7CiAgICB9CiAgICByZXR1cm4gc2NlbmUuc2NlbmVfY2hpbGRyZW4uZXZlcnkoKHgxKT0+cmVuZGVyX3NjZW5lKHgxLCBwaWNraW5nKSk7Cn0KZnVuY3Rpb24gc3RhcnRfcmVuZGVybG9vcCh0aHJlZV9zY2VuZSkgewogICAgY29uc3QgeyBmcHMgIH0gPSB0aHJlZV9zY2VuZS5zY3JlZW47CiAgICBjb25zdCB0aW1lX3Blcl9mcmFtZSA9IDEgLyBmcHMgKiAxMDAwOwogICAgbGV0IGxhc3RfdGltZV9zdGFtcCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgZnVuY3Rpb24gcmVuZGVybG9vcCh0aW1lc3RhbXApIHsKICAgICAgICBpZiAoIWNoZWNrX3NjcmVlbih0aHJlZV9zY2VuZS5zY3JlZW4pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRpbWVzdGFtcCAtIGxhc3RfdGltZV9zdGFtcCA+IHRpbWVfcGVyX2ZyYW1lKSB7CiAgICAgICAgICAgIGNvbnN0IGFsbF9yZW5kZXJlZCA9IHJlbmRlcl9zY2VuZSh0aHJlZV9zY2VuZSk7CiAgICAgICAgICAgIGlmICghYWxsX3JlbmRlcmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdF90aW1lX3N0YW1wID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJsb29wKTsKICAgIH0KICAgIGZ1bmN0aW9uIF9jaGVja19zY3JlZW4oKSB7CiAgICAgICAgaWYgKCFjaGVja19zY3JlZW4odGhyZWVfc2NlbmUuc2NyZWVuKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoX2NoZWNrX3NjcmVlbiwgMTAwMCk7CiAgICB9CiAgICByZW5kZXJfc2NlbmUodGhyZWVfc2NlbmUpOwogICAgX2NoZWNrX3NjcmVlbigpOwogICAgcmVuZGVybG9vcCgpOwp9CmZ1bmN0aW9uIGdldF9lbGVtZW50X3NpemUoZWxlbWVudCkgewogICAgaWYgKCFlbGVtZW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFbGVtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkIik7CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpOwogICAgY29uc3QgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSB8fCAwOwogICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nUmlnaHQpIHx8IDA7CiAgICBjb25zdCBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSB8fCAwOwogICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDsKICAgIGxldCB3aWR0aCwgaGVpZ2h0OwogICAgaWYgKGVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHsKICAgICAgICBjb25zdCBtYXJnaW5MZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5tYXJnaW5MZWZ0KSB8fCAwOwogICAgICAgIGNvbnN0IG1hcmdpblJpZ2h0ID0gcGFyc2VGbG9hdChzdHlsZS5tYXJnaW5SaWdodCkgfHwgMDsKICAgICAgICBjb25zdCBtYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KHN0eWxlLm1hcmdpblRvcCkgfHwgMDsKICAgICAgICBjb25zdCBtYXJnaW5Cb3R0b20gPSBwYXJzZUZsb2F0KHN0eWxlLm1hcmdpbkJvdHRvbSkgfHwgMDsKICAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQgLSBtYXJnaW5MZWZ0IC0gbWFyZ2luUmlnaHQ7CiAgICAgICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b20gLSBtYXJnaW5Ub3AgLSBtYXJnaW5Cb3R0b207CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207CiAgICB9CiAgICByZXR1cm4gWwogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgXTsKfQpmdW5jdGlvbiBnZXRfcmVzaXplX2VsZW1lbnQoY2FudmFzLCByZXNpemVfdG8pIHsKICAgIGlmICghcmVzaXplX3RvKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocmVzaXplX3RvID09ICJib2R5IikgewogICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5OwogICAgfSBlbHNlIGlmIChyZXNpemVfdG8gPT0gInBhcmVudCIgfHwgQXJyYXkuaXNBcnJheShyZXNpemVfdG8pICYmIHJlc2l6ZV90by5sZW5ndGggPT0gMikgewogICAgICAgIGNvbnN0IHdyYXBwZXIgPSBjYW52YXMucGFyZW50RWxlbWVudDsKICAgICAgICBpZiAoIXdyYXBwZXIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiQ2FudmFzIGhhcyBubyBwYXJlbnQgd3JhcHBlciIpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVhbF9wYXJlbnQgPSB3cmFwcGVyLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgaWYgKCFyZWFsX3BhcmVudCkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJDYW52YXMgd3JhcHBlciBoYXMgbm8gcGFyZW50Iik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVhbF9wYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBjb252ZXJ0X3RvX21ha2llX3NpemUoZWxlbWVudF93aWR0aCwgZWxlbWVudF9oZWlnaHQsIGZpeGVkX3dpZHRoLCBmaXhlZF9oZWlnaHQsIHJlc2l6ZV90bywgd2luc2NhbGUpIHsKICAgIGxldCBtYWtpZV93aWR0aCA9IGZpeGVkX3dpZHRoOwogICAgbGV0IG1ha2llX2hlaWdodCA9IGZpeGVkX2hlaWdodDsKICAgIGlmIChyZXNpemVfdG8gPT0gImJvZHkiIHx8IHJlc2l6ZV90byA9PSAicGFyZW50IikgewogICAgICAgIG1ha2llX3dpZHRoID0gZWxlbWVudF93aWR0aDsKICAgICAgICBtYWtpZV9oZWlnaHQgPSBlbGVtZW50X2hlaWdodDsKICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNpemVfdG8pICYmIHJlc2l6ZV90by5sZW5ndGggPT0gMikgewogICAgICAgIGNvbnN0IFt3aWR0aF9tb2RlLCBoZWlnaHRfbW9kZV0gPSByZXNpemVfdG87CiAgICAgICAgbWFraWVfd2lkdGggPSB3aWR0aF9tb2RlID09ICJwYXJlbnQiID8gZWxlbWVudF93aWR0aCA6IGZpeGVkX3dpZHRoOwogICAgICAgIG1ha2llX2hlaWdodCA9IGhlaWdodF9tb2RlID09ICJwYXJlbnQiID8gZWxlbWVudF9oZWlnaHQgOiBmaXhlZF9oZWlnaHQ7CiAgICB9CiAgICByZXR1cm4gWwogICAgICAgIG1ha2llX3dpZHRoIC8gd2luc2NhbGUsCiAgICAgICAgbWFraWVfaGVpZ2h0IC8gd2luc2NhbGUKICAgIF07Cn0KZnVuY3Rpb24gZ2V0X3BhcmVudF9zaXplKGNhbnZhcykgewogICAgY29uc3Qgd3JhcHBlciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50OwogICAgaWYgKCF3cmFwcGVyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiQ2FudmFzIGhhcyBubyBwYXJlbnQgd3JhcHBlciAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4hIik7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgY2FudmFzLndpZHRoLAogICAgICAgICAgICBjYW52YXMuaGVpZ2h0CiAgICAgICAgXTsKICAgIH0KICAgIGNvbnN0IHJlYWxfcGFyZW50ID0gd3JhcHBlci5wYXJlbnRFbGVtZW50OwogICAgaWYgKCFyZWFsX3BhcmVudCkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkNhbnZhcyB3cmFwcGVyIGhhcyBubyBwYXJlbnQgLSB0aGlzIHNob3VsZCBub3QgaGFwcGVuISIpOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGNhbnZhcy53aWR0aCwKICAgICAgICAgICAgY2FudmFzLmhlaWdodAogICAgICAgIF07CiAgICB9CiAgICByZXR1cm4gZ2V0X2VsZW1lbnRfc2l6ZShyZWFsX3BhcmVudCk7Cn0KZnVuY3Rpb24gd2dsZXJyb3IoZ2wsIGVycm9yKSB7CiAgICBzd2l0Y2goZXJyb3IpewogICAgICAgIGNhc2UgZ2wuTk9fRVJST1I6CiAgICAgICAgICAgIHJldHVybiAiTm8gZXJyb3IiOwogICAgICAgIGNhc2UgZ2wuSU5WQUxJRF9FTlVNOgogICAgICAgICAgICByZXR1cm4gIkludmFsaWQgZW51bSI7CiAgICAgICAgY2FzZSBnbC5JTlZBTElEX1ZBTFVFOgogICAgICAgICAgICByZXR1cm4gIkludmFsaWQgdmFsdWUiOwogICAgICAgIGNhc2UgZ2wuSU5WQUxJRF9PUEVSQVRJT046CiAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBvcGVyYXRpb24iOwogICAgICAgIGNhc2UgZ2wuT1VUX09GX01FTU9SWToKICAgICAgICAgICAgcmV0dXJuICJPdXQgb2YgbWVtb3J5IjsKICAgICAgICBjYXNlIGdsLkNPTlRFWFRfTE9TVF9XRUJHTDoKICAgICAgICAgICAgcmV0dXJuICJDb250ZXh0IGxvc3QiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7CiAgICB9Cn0KZnVuY3Rpb24gZ2V0U2hhZGVyRXJyb3JzKGdsLCBzaGFkZXIsIHR5cGUpIHsKICAgIGNvbnN0IHN0YXR1cyA9IGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKTsKICAgIGNvbnN0IGVycm9ycyA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKS50cmltKCk7CiAgICBpZiAoc3RhdHVzICYmIGVycm9ycyA9PT0gIiIpIHJldHVybiAiIjsKICAgIGNvbnN0IGVycm9yTWF0Y2hlcyA9IC9FUlJPUjogMDooXGQrKS8uZXhlYyhlcnJvcnMpOwogICAgaWYgKGVycm9yTWF0Y2hlcykgewogICAgICAgIGNvbnN0IGVycm9yTGluZSA9IHBhcnNlSW50KGVycm9yTWF0Y2hlc1sxXSk7CiAgICAgICAgcmV0dXJuIHR5cGUudG9VcHBlckNhc2UoKSArICJcblxuIiArIGVycm9ycyArICJcblxuIiArICJJbiBsaW5lOiAiICsgZXJyb3JMaW5lICsgIlxuXG4iICsgIlNvdXJjZTpcbiIgKyBnbC5nZXRTaGFkZXJTb3VyY2Uoc2hhZGVyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGVycm9yczsKICAgIH0KfQpmdW5jdGlvbiBvbl9zaGFkZXJfZXJyb3IoZ2wsIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyLCBnbEZyYWdtZW50U2hhZGVyKSB7CiAgICBjb25zdCBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkudHJpbSgpOwogICAgY29uc3QgdmVydGV4RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKGdsLCBnbFZlcnRleFNoYWRlciwgInZlcnRleCIpOwogICAgY29uc3QgZnJhZ21lbnRFcnJvcnMgPSBnZXRTaGFkZXJFcnJvcnMoZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICJmcmFnbWVudCIpOwogICAgY29uc3QgdmVydGV4TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhnbFZlcnRleFNoYWRlcikudHJpbSgpOwogICAgY29uc3QgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKGdsRnJhZ21lbnRTaGFkZXIpLnRyaW0oKTsKICAgIGNvbnN0IGVyciA9ICJUSFJFRS5XZWJHTFByb2dyYW06IFNoYWRlciBFcnJvciAiICsgd2dsZXJyb3IoZ2wsIGdsLmdldEVycm9yKCkpICsgIiAtICIgKyAiVkFMSURBVEVfU1RBVFVTICIgKyBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUykgKyAiXG5cbiIgKyAiUHJvZ3JhbSBJbmZvIExvZzpcbiIgKyBwcm9ncmFtTG9nICsgIlxuIiArIHZlcnRleEVycm9ycyArICJcbiIgKyBmcmFnbWVudEVycm9ycyArICJcbiIgKyAiRnJhZ21lbnQgbG9nOlxuIiArIGZyYWdtZW50TG9nICsgIlZlcnRleCBsb2c6XG4iICsgdmVydGV4TG9nOwogICAgQm9uaXRvLkNvbm5lY3Rpb24uc2VuZF93YXJuaW5nKGVycik7Cn0KZnVuY3Rpb24gYWRkX2NhbnZhc19ldmVudHMoc2NyZWVuLCBjb21tLCByZXNpemVfdG8pIHsKICAgIGNvbnN0IHsgY2FudmFzICwgd2luc2NhbGUgIH0gPSBzY3JlZW47CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsIChldmVudCk9PnsKICAgICAgICBkaXNwb3NlX3NjcmVlbihzY3JlZW4pOwogICAgfSk7CiAgICBmdW5jdGlvbiBtb3VzZV9jYWxsYmFjayhldmVudCkgewogICAgICAgIGNvbnN0IFt4MSwgeTFdID0gZXZlbnRzMnVuaXRsZXNzKHNjcmVlbiwgZXZlbnQpOwogICAgICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICAgICAgbW91c2Vwb3NpdGlvbjogWwogICAgICAgICAgICAgICAgeDEsCiAgICAgICAgICAgICAgICB5MQogICAgICAgICAgICBdCiAgICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBub3RpZnlfbW91c2VfdGhyb3R0bGVkID0gQm9uaXRvLnRocm90dGxlX2Z1bmN0aW9uKG1vdXNlX2NhbGxiYWNrLCA0MCk7CiAgICBmdW5jdGlvbiBtb3VzZW1vdmUoZXZlbnQpIHsKICAgICAgICBub3RpZnlfbW91c2VfdGhyb3R0bGVkKGV2ZW50KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgbW91c2Vtb3ZlKTsKICAgIGZ1bmN0aW9uIG1vdXNlZG93bihldmVudCkgewogICAgICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICAgICAgbW91c2Vkb3duOiBldmVudC5idXR0b25zCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIG1vdXNlZG93bik7CiAgICBmdW5jdGlvbiBtb3VzZXVwKGV2ZW50KSB7CiAgICAgICAgY29tbS5ub3RpZnkoewogICAgICAgICAgICBtb3VzZXVwOiBldmVudC5idXR0b25zCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBtb3VzZXVwKTsKICAgIGZ1bmN0aW9uIHdoZWVsKGV2ZW50KSB7CiAgICAgICAgY29tbS5ub3RpZnkoewogICAgICAgICAgICBzY3JvbGw6IFsKICAgICAgICAgICAgICAgIGV2ZW50LmRlbHRhWCwKICAgICAgICAgICAgICAgIC1ldmVudC5kZWx0YVkKICAgICAgICAgICAgXQogICAgICAgIH0pOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIiwgd2hlZWwpOwogICAgZnVuY3Rpb24ga2V5ZG93bihldmVudCkgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29tbS5ub3RpZnkoewogICAgICAgICAgICBrZXlkb3duOiBbCiAgICAgICAgICAgICAgICBldmVudC5jb2RlLAogICAgICAgICAgICAgICAgZXZlbnQua2V5CiAgICAgICAgICAgIF0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGtleWRvd24pOwogICAgZnVuY3Rpb24ga2V5dXAoZXZlbnQpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICAgICAga2V5dXA6IGV2ZW50LmNvZGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCBrZXl1cCk7CiAgICBmdW5jdGlvbiBjb250ZXh0bWVudShldmVudCkgewogICAgICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICAgICAga2V5dXA6ICJkZWxldGVfa2V5cyIKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZSk9PmUucHJldmVudERlZmF1bHQoKSk7CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLCBjb250ZXh0bWVudSk7CiAgICBpZiAocmVzaXplX3RvKSB7CiAgICAgICAgY29uc3QgcmVzaXplX2VsZW1lbnQgPSBnZXRfcmVzaXplX2VsZW1lbnQoY2FudmFzLCByZXNpemVfdG8pOwogICAgICAgIGlmIChyZXNpemVfZWxlbWVudCkgewogICAgICAgICAgICBmdW5jdGlvbiByZXNpemVfY2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbZWxlbWVudF93aWR0aCwgZWxlbWVudF9oZWlnaHRdID0gZ2V0X2VsZW1lbnRfc2l6ZShyZXNpemVfZWxlbWVudCk7CiAgICAgICAgICAgICAgICBjb25zdCBbZl93aWR0aCwgZl9oZWlnaHRdID0gWwogICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yZW5kZXJlci5fd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgc2NyZWVuLnJlbmRlcmVyLl9oZWlnaHQKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBjb252ZXJ0X3RvX21ha2llX3NpemUoZWxlbWVudF93aWR0aCwgZWxlbWVudF9oZWlnaHQsIGZfd2lkdGgsIGZfaGVpZ2h0LCByZXNpemVfdG8sIHdpbnNjYWxlKTsKICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHdpZHRoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbW0ubm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzaXplX2NhbGxiYWNrX3Rocm90dGxlZCA9IEJvbml0by50aHJvdHRsZV9mdW5jdGlvbihyZXNpemVfY2FsbGJhY2ssIDEwMCk7CiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKT0+ewogICAgICAgICAgICAgICAgcmVzaXplX2NhbGxiYWNrX3Rocm90dGxlZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyZXNpemVfZWxlbWVudCk7CiAgICAgICAgICAgIHNjcmVlbi5yZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiQ291bGQgbm90IGZpbmQgZWxlbWVudCB0byBvYnNlcnZlIGZvciByZXNpemVfdG86IiwgcmVzaXplX3RvKTsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gdGhyZWVqc19tb2R1bGUoY2FudmFzKSB7CiAgICBsZXQgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiLCB7CiAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlCiAgICB9KTsKICAgIGlmICghY29udGV4dCkgewogICAgICAgIGNvbnNvbGUud2FybigiV2ViR0wgMi4wIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlciwgZmFsbGluZyBiYWNrIHRvIFdlYkdMIDEuMCAoVm9sdW1lIHBsb3RzIHdpbGwgbm90IHdvcmspIik7CiAgICAgICAgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbCIsIHsKICAgICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlCiAgICAgICAgfSk7CiAgICB9CiAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZW5kZXJlciA9IG5ldyBtb2QuV2ViR0xSZW5kZXJlcih7CiAgICAgICAgYW50aWFsaWFzOiB0cnVlLAogICAgICAgIGNhbnZhczogY2FudmFzLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgcG93ZXJQcmVmZXJlbmNlOiAiaGlnaC1wZXJmb3JtYW5jZSIsCiAgICAgICAgcHJlY2lzaW9uOiAiaGlnaHAiLAogICAgICAgIGFscGhhOiB0cnVlLAogICAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWUKICAgIH0pOwogICAgcmVuZGVyZXIuZGVidWcub25TaGFkZXJFcnJvciA9IG9uX3NoYWRlcl9lcnJvcjsKICAgIHJlbmRlcmVyLnNldENsZWFyQ29sb3IoIiNmZmZmZmYiKTsKICAgIHJldHVybiByZW5kZXJlcjsKfQpmdW5jdGlvbiBzZXRfcmVuZGVyX3NpemUoc2NyZWVuLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCB7IHJlbmRlcmVyICwgY2FudmFzICwgc2NhbGVmYWN0b3IgLCB3aW5zY2FsZSAsIHB4X3Blcl91bml0ICB9ID0gc2NyZWVuOwogICAgY29uc3QgW3N3aWR0aCwgc2hlaWdodF0gPSBbCiAgICAgICAgd2luc2NhbGUgKiB3aWR0aCwKICAgICAgICB3aW5zY2FsZSAqIGhlaWdodAogICAgXTsKICAgIGNvbnN0IHJlYWxfcGl4ZWxfd2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiBweF9wZXJfdW5pdCk7CiAgICBjb25zdCByZWFsX3BpeGVsX2hlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgKiBweF9wZXJfdW5pdCk7CiAgICByZW5kZXJlci5fd2lkdGggPSB3aWR0aDsKICAgIHJlbmRlcmVyLl9oZWlnaHQgPSBoZWlnaHQ7CiAgICBjYW52YXMud2lkdGggPSByZWFsX3BpeGVsX3dpZHRoOwogICAgY2FudmFzLmhlaWdodCA9IHJlYWxfcGl4ZWxfaGVpZ2h0OwogICAgY2FudmFzLnN0eWxlLndpZHRoID0gc3dpZHRoICsgInB4IjsKICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBzaGVpZ2h0ICsgInB4IjsKICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KDAsIDAsIHJlYWxfcGl4ZWxfd2lkdGgsIHJlYWxfcGl4ZWxfaGVpZ2h0KTsKICAgIGFkZF9waWNraW5nX3RhcmdldChzY3JlZW4pOwogICAgcmV0dXJuOwp9CmZ1bmN0aW9uIGluaXRpYWxpemVfY2FudmFzX3NpemUoY2FudmFzLCByZXNpemVfdG8sIHdpZHRoLCBoZWlnaHQsIHB4X3Blcl91bml0LCBzY2FsZWZhY3RvcikgewogICAgaWYgKCFzY2FsZWZhY3RvcikgewogICAgICAgIHNjYWxlZmFjdG9yID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wOwogICAgfQogICAgaWYgKCFweF9wZXJfdW5pdCkgewogICAgICAgIHB4X3Blcl91bml0ID0gc2NhbGVmYWN0b3I7CiAgICB9CiAgICBjb25zdCBwaXhlbF9yYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEuMDsKICAgIGNvbnN0IHdpbnNjYWxlID0gc2NhbGVmYWN0b3IgLyBwaXhlbF9yYXRpbzsKICAgIGxldCBpbml0aWFsX3dpZHRoID0gd2lkdGg7CiAgICBsZXQgaW5pdGlhbF9oZWlnaHQgPSBoZWlnaHQ7CiAgICBpZiAocmVzaXplX3RvKSB7CiAgICAgICAgY29uc3QgcmVzaXplX2VsZW1lbnQgPSBnZXRfcmVzaXplX2VsZW1lbnQoY2FudmFzLCByZXNpemVfdG8pOwogICAgICAgIGlmIChyZXNpemVfZWxlbWVudCkgewogICAgICAgICAgICBjb25zdCBbZWxlbWVudF93aWR0aCwgZWxlbWVudF9oZWlnaHRdID0gZ2V0X2VsZW1lbnRfc2l6ZShyZXNpemVfZWxlbWVudCk7CiAgICAgICAgICAgIFtpbml0aWFsX3dpZHRoLCBpbml0aWFsX2hlaWdodF0gPSBjb252ZXJ0X3RvX21ha2llX3NpemUoZWxlbWVudF93aWR0aCwgZWxlbWVudF9oZWlnaHQsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZV90bywgMS4wKTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBzd2lkdGggPSB3aW5zY2FsZSAqIGluaXRpYWxfd2lkdGg7CiAgICBjb25zdCBzaGVpZ2h0ID0gd2luc2NhbGUgKiBpbml0aWFsX2hlaWdodDsKICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHN3aWR0aCArICJweCI7CiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2hlaWdodCArICJweCI7CiAgICByZXR1cm4gWwogICAgICAgIGluaXRpYWxfd2lkdGgsCiAgICAgICAgaW5pdGlhbF9oZWlnaHQKICAgIF07Cn0KZnVuY3Rpb24gc2V0dXBfc2NlbmVfaW5pdCh3cmFwcGVyLCBjYW52YXMsIHdpZHRoLCBoZWlnaHQsIHJlc2l6ZV90bywgcHhfcGVyX3VuaXQsIHNjYWxlZmFjdG9yLCByZWFsX3NpemUsIGNhbnZhc193aWR0aCwgc2NlbmVfc2VyaWFsaXplZCwgY29tbSwgZnJhbWVyYXRlLCBkb25lX2luaXQpIHsKICAgIGNvbnN0IHNwaW5uZXIgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy53Z2xtYWtpZS1zcGlubmVyJyk7CiAgICB0cnkgewogICAgICAgIGxldCBmaW5hbF93aWR0aCA9IHdpZHRoOwogICAgICAgIGxldCBmaW5hbF9oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgaWYgKHJlc2l6ZV90bykgewogICAgICAgICAgICBjb25zdCBzaXplcyA9IGluaXRpYWxpemVfY2FudmFzX3NpemUoY2FudmFzLCByZXNpemVfdG8sIHdpZHRoLCBoZWlnaHQsIHB4X3Blcl91bml0LCBzY2FsZWZhY3Rvcik7CiAgICAgICAgICAgIGZpbmFsX3dpZHRoID0gc2l6ZXNbMF07CiAgICAgICAgICAgIGZpbmFsX2hlaWdodCA9IHNpemVzWzFdOwogICAgICAgIH0KICAgICAgICByZWFsX3NpemUubm90aWZ5KFsKICAgICAgICAgICAgZmluYWxfd2lkdGgsCiAgICAgICAgICAgIGZpbmFsX2hlaWdodAogICAgICAgIF0pOwogICAgICAgIGNvbnN0IGluaXRfc2NlbmUgPSAoc2NlbmVfZGF0YSk9PnsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNyZWF0ZV9zY2VuZSh3cmFwcGVyLCBjYW52YXMsIGNhbnZhc193aWR0aCwgc2NlbmVfZGF0YSwgY29tbSwgZmluYWxfd2lkdGgsIGZpbmFsX2hlaWdodCwgZnJhbWVyYXRlLCByZXNpemVfdG8sIHB4X3Blcl91bml0LCBzY2FsZWZhY3Rvcik7CiAgICAgICAgICAgICAgICBkb25lX2luaXQubm90aWZ5KHRydWUpOwogICAgICAgICAgICAgICAgc3Bpbm5lcj8ucmVtb3ZlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIEJvbml0by5Db25uZWN0aW9uLnNlbmRfZXJyb3IoImVycm9yIGluaXRpYWxpemluZyBzY2VuZSIsIGUpOwogICAgICAgICAgICAgICAgZG9uZV9pbml0Lm5vdGlmeShlKTsKICAgICAgICAgICAgICAgIHNwaW5uZXI/LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIGlmIChzY2VuZV9zZXJpYWxpemVkLnZhbHVlKSB7CiAgICAgICAgICAgIGluaXRfc2NlbmUoc2NlbmVfc2VyaWFsaXplZC52YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2NlbmVfc2VyaWFsaXplZC5vbihpbml0X3NjZW5lKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgQm9uaXRvLkNvbm5lY3Rpb24uc2VuZF9lcnJvcigiZXJyb3Igc2V0dGluZyB1cCBzY2VuZSIsIGUpOwogICAgICAgIGRvbmVfaW5pdC5ub3RpZnkoZSk7CiAgICAgICAgc3Bpbm5lcj8ucmVtb3ZlKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CmZ1bmN0aW9uIGFkZF9waWNraW5nX3RhcmdldChzY3JlZW4pIHsKICAgIGNvbnN0IHsgcGlja2luZ190YXJnZXQgLCBjYW52YXMgIH0gPSBzY3JlZW47CiAgICBjb25zdCBbdywgaF0gPSBbCiAgICAgICAgY2FudmFzLndpZHRoLAogICAgICAgIGNhbnZhcy5oZWlnaHQKICAgIF07CiAgICBpZiAocGlja2luZ190YXJnZXQpIHsKICAgICAgICBpZiAocGlja2luZ190YXJnZXQud2lkdGggPT0gdyAmJiBwaWNraW5nX3RhcmdldC5oZWlnaHQgPT0gaCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGlja2luZ190YXJnZXQuZGlzcG9zZSgpOwogICAgICAgIH0KICAgIH0KICAgIHNjcmVlbi5waWNraW5nX3RhcmdldCA9IG5ldyBtb2QuV2ViR0xSZW5kZXJUYXJnZXQodywgaCwgewogICAgICAgIHR5cGU6IG1vZC5GbG9hdFR5cGUsCiAgICAgICAgbWluRmlsdGVyOiBtb2QuTmVhcmVzdEZpbHRlciwKICAgICAgICBtYWdGaWx0ZXI6IG1vZC5OZWFyZXN0RmlsdGVyCiAgICB9KTsKICAgIHJldHVybjsKfQpmdW5jdGlvbiBjcmVhdGVfc2NlbmUod3JhcHBlciwgY2FudmFzLCBjYW52YXNfd2lkdGgsIHNjZW5lcywgY29tbSwgd2lkdGgsIGhlaWdodCwgZnBzLCByZXNpemVfdG8sIHB4X3Blcl91bml0LCBzY2FsZWZhY3RvcikgewogICAgaWYgKCFzY2FsZWZhY3RvcikgewogICAgICAgIHNjYWxlZmFjdG9yID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wOwogICAgfQogICAgaWYgKCFweF9wZXJfdW5pdCkgewogICAgICAgIHB4X3Blcl91bml0ID0gc2NhbGVmYWN0b3I7CiAgICB9CiAgICBjb25zdCByZW5kZXJlciA9IHRocmVlanNfbW9kdWxlKGNhbnZhcyk7CiAgICBpZiAoIXJlbmRlcmVyKSB7CiAgICAgICAgY29uc3Qgd2FybmluZyA9IGdldFdlYkdMRXJyb3JNZXNzYWdlKCk7CiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh3YXJuaW5nKTsKICAgIH0KICAgIGNvbnN0IGNhbWVyYSA9IG5ldyBtb2QuUGVyc3BlY3RpdmVDYW1lcmEoNDUsIDEsIDAsIDEwMCk7CiAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgY29uc3QgcGl4ZWxfcmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLjA7CiAgICBjb25zdCB3aW5zY2FsZSA9IHNjYWxlZmFjdG9yIC8gcGl4ZWxfcmF0aW87CiAgICBjb25zdCBzY3JlZW4gPSB7CiAgICAgICAgcmVuZGVyZXIsCiAgICAgICAgY2FtZXJhLAogICAgICAgIGZwcywKICAgICAgICBjYW52YXMsCiAgICAgICAgcHhfcGVyX3VuaXQsCiAgICAgICAgc2NhbGVmYWN0b3IsCiAgICAgICAgd2luc2NhbGUsCiAgICAgICAgY29tbSwKICAgICAgICB0ZXh0dXJlX2F0bGFzOiB1bmRlZmluZWQKICAgIH07CiAgICBjYW52YXMud2dsbWFraWVfc2NyZWVuID0gc2NyZWVuOwogICAgYWRkX2NhbnZhc19ldmVudHMoc2NyZWVuLCBjb21tLCByZXNpemVfdG8pOwogICAgc2V0X3JlbmRlcl9zaXplKHNjcmVlbiwgd2lkdGgsIGhlaWdodCk7CiAgICBjb25zdCB0aHJlZV9zY2VuZSA9IGRlc2VyaWFsaXplX3NjZW5lKHNjZW5lcywgc2NyZWVuKTsKICAgIGNvbnNvbGUubG9nKHRocmVlX3NjZW5lKTsKICAgIHNjcmVlbi5yb290X3NjZW5lID0gdGhyZWVfc2NlbmU7CiAgICBzdGFydF9yZW5kZXJsb29wKHRocmVlX3NjZW5lKTsKICAgIGNhbnZhc193aWR0aC5vbigod19oKT0+ewogICAgICAgIHNldF9yZW5kZXJfc2l6ZShzY3JlZW4sIC4uLndfaCk7CiAgICB9KTsKICAgIGNvbnN0IGdsID0gcmVuZGVyZXIuZ2V0Q29udGV4dCgpOwogICAgY29uc3QgZXJyID0gZ2wuZ2V0RXJyb3IoKTsKICAgIGlmIChlcnIgIT0gZ2wuTk9fRVJST1IpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYkdMIGVycm9yOiAiICsgd2dsZXJyb3IoZ2wsIGVycikpOwogICAgfQogICAgcmV0dXJuIHJlbmRlcmVyOwp9CmZ1bmN0aW9uIHNldF9waWNraW5nX3VuaWZvcm1zKHNjZW5lLCBsYXN0X2lkLCBwaWNraW5nLCBwaWNrZWRfcGxvdHMsIHBsb3RzLCBpZF90b19wbG90KSB7CiAgICBzY2VuZS5jaGlsZHJlbi5mb3JFYWNoKChwbG90LCBpbmRleCk9PnsKICAgICAgICBjb25zdCB7IG1hdGVyaWFsICB9ID0gcGxvdDsKICAgICAgICBjb25zdCB7IHVuaWZvcm1zICB9ID0gbWF0ZXJpYWw7CiAgICAgICAgaWYgKHBpY2tpbmcpIHsKICAgICAgICAgICAgdW5pZm9ybXMub2JqZWN0X2lkLnZhbHVlID0gbGFzdF9pZCArIGluZGV4OwogICAgICAgICAgICB1bmlmb3Jtcy5waWNraW5nLnZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgbWF0ZXJpYWwuYmxlbmRpbmcgPSBtb2QuTm9CbGVuZGluZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmlmb3Jtcy5waWNraW5nLnZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIG1hdGVyaWFsLmJsZW5kaW5nID0gbW9kLk5vcm1hbEJsZW5kaW5nOwogICAgICAgICAgICBjb25zdCBpZCA9IHVuaWZvcm1zLm9iamVjdF9pZC52YWx1ZTsKICAgICAgICAgICAgaWYgKGlkIGluIHBpY2tlZF9wbG90cykgewogICAgICAgICAgICAgICAgcGlja2VkX3Bsb3RzW2lkXS5mb3JFYWNoKChpbmRleCk9PnsKICAgICAgICAgICAgICAgICAgICBwbG90cy5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgcGxvdCwKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWRfdG9fcGxvdFtpZF0gPSBwbG90OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CiAgICBsZXQgbmV4dF9pZCA9IGxhc3RfaWQgKyBzY2VuZS5jaGlsZHJlbi5sZW5ndGg7CiAgICBzY2VuZS5zY2VuZV9jaGlsZHJlbi5mb3JFYWNoKChzY2VuZSk9PnsKICAgICAgICBuZXh0X2lkID0gc2V0X3BpY2tpbmdfdW5pZm9ybXMoc2NlbmUsIG5leHRfaWQsIHBpY2tpbmcsIHBpY2tlZF9wbG90cywgcGxvdHMsIGlkX3RvX3Bsb3QpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dF9pZDsKfQpmdW5jdGlvbiBkZWNvZGVfZmxvYXRfdG9fdWludChyLCBnKSB7CiAgICBjb25zdCBsb3dlciA9IE1hdGgucm91bmQociAqIDY1NTM1KTsKICAgIGNvbnN0IHVwcGVyID0gTWF0aC5yb3VuZChnICogNjU1MzUpOwogICAgcmV0dXJuIHVwcGVyIDw8IDE2IHwgbG93ZXI7Cn0KZnVuY3Rpb24gcmVhZF9waXhlbHMocmVuZGVyZXIsIHBpY2tpbmdfdGFyZ2V0LCB4MSwgeTEsIHcsIGgpIHsKICAgIGNvbnN0IG5ieXRlcyA9IHcgKiBoICogNDsKICAgIGNvbnN0IHBpeGVsX2J5dGVzID0gbmV3IEZsb2F0MzJBcnJheShuYnl0ZXMpOwogICAgcmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVscyhwaWNraW5nX3RhcmdldCwgeDEsIHkxLCB3LCBoLCBwaXhlbF9ieXRlcyk7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwaXhlbF9ieXRlcy5sZW5ndGg7IGkgKz0gNCl7CiAgICAgICAgY29uc3QgciA9IHBpeGVsX2J5dGVzW2ldOwogICAgICAgIGNvbnN0IGcgPSBwaXhlbF9ieXRlc1tpICsgMV07CiAgICAgICAgY29uc3QgYiA9IHBpeGVsX2J5dGVzW2kgKyAyXTsKICAgICAgICBjb25zdCBhID0gcGl4ZWxfYnl0ZXNbaSArIDNdOwogICAgICAgIGNvbnN0IGlkID0gZGVjb2RlX2Zsb2F0X3RvX3VpbnQociwgZyk7CiAgICAgICAgY29uc3QgaW5kZXggPSBkZWNvZGVfZmxvYXRfdG9fdWludChiLCBhKTsKICAgICAgICByZXN1bHQucHVzaChbCiAgICAgICAgICAgIGlkLAogICAgICAgICAgICBpbmRleAogICAgICAgIF0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBwaWNrX25hdGl2ZShzY2VuZSwgX3gsIF95LCBfdywgX2gsIGFwcGx5X3BwdSA9IHRydWUpIHsKICAgIGNvbnN0IHsgcmVuZGVyZXIgLCBwaWNraW5nX3RhcmdldCAsIHB4X3Blcl91bml0ICB9ID0gc2NlbmUuc2NyZWVuOwogICAgaWYgKGFwcGx5X3BwdSkgewogICAgICAgIFtfeCwgX3ksIF93LCBfaF0gPSBbCiAgICAgICAgICAgIF94LAogICAgICAgICAgICBfeSwKICAgICAgICAgICAgX3csCiAgICAgICAgICAgIF9oCiAgICAgICAgXS5tYXAoKHgxKT0+TWF0aC5yb3VuZCh4MSAqIHB4X3Blcl91bml0KSk7CiAgICB9CiAgICBjb25zdCBbeDEsIHkxLCB3LCBoXSA9IFsKICAgICAgICBfeCwKICAgICAgICBfeSwKICAgICAgICBfdywKICAgICAgICBfaAogICAgXTsKICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChwaWNraW5nX3RhcmdldCk7CiAgICBzZXRfcGlja2luZ191bmlmb3JtcyhzY2VuZSwgMSwgdHJ1ZSk7CiAgICBjb25zdCByZW5kZXJlZCA9IHJlbmRlcl9zY2VuZShzY2VuZSwgdHJ1ZSk7CiAgICBpZiAoIXJlbmRlcmVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG51bGwpOwogICAgY29uc3QgcGlja2VkX3Bsb3RzX2FycmF5ID0gcmVhZF9waXhlbHMocmVuZGVyZXIsIHBpY2tpbmdfdGFyZ2V0LCB4MSwgeTEsIHcsIGgpOwogICAgY29uc3QgcGlja2VkX3Bsb3RzID0ge307CiAgICBwaWNrZWRfcGxvdHNfYXJyYXkuZm9yRWFjaCgoW2lkLCBpbmRleF0pPT57CiAgICAgICAgaWYgKCFwaWNrZWRfcGxvdHNbaWRdKSB7CiAgICAgICAgICAgIHBpY2tlZF9wbG90c1tpZF0gPSBbXTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwaWNrZWRfcGxvdHNbaWRdLmluY2x1ZGVzKGluZGV4KSkgewogICAgICAgICAgICBwaWNrZWRfcGxvdHNbaWRdLnB1c2goaW5kZXgpOwogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgcGxvdHMgPSBbXTsKICAgIGNvbnN0IGlkX3RvX3Bsb3QgPSB7fTsKICAgIHNldF9waWNraW5nX3VuaWZvcm1zKHNjZW5lLCAwLCBmYWxzZSwgcGlja2VkX3Bsb3RzLCBwbG90cywgaWRfdG9fcGxvdCk7CiAgICBjb25zdCBwaWNrZWRfcGxvdHNfbWF0cml4ID0gcGlja2VkX3Bsb3RzX2FycmF5Lm1hcCgoW2lkLCBpbmRleF0pPT57CiAgICAgICAgY29uc3QgcCA9IGlkX3RvX3Bsb3RbaWRdOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHAgPyBwLnBsb3RfdXVpZCA6IG51bGwsCiAgICAgICAgICAgIGluZGV4CiAgICAgICAgXTsKICAgIH0pOwogICAgY29uc3QgcGxvdF9tYXRyaXggPSB7CiAgICAgICAgZGF0YTogcGlja2VkX3Bsb3RzX21hdHJpeCwKICAgICAgICBzaXplOiBbCiAgICAgICAgICAgIHcsCiAgICAgICAgICAgIGgKICAgICAgICBdCiAgICB9OwogICAgcmV0dXJuIFsKICAgICAgICBwbG90X21hdHJpeCwKICAgICAgICBwbG90cwogICAgXTsKfQpmdW5jdGlvbiBnZXRfcGlja2luZ19idWZmZXIoc2NlbmUpIHsKICAgIGNvbnN0IHsgcmVuZGVyZXIgLCBwaWNraW5nX3RhcmdldCAgfSA9IHNjZW5lLnNjcmVlbjsKICAgIGNvbnN0IFt3LCBoXSA9IFsKICAgICAgICBwaWNraW5nX3RhcmdldC53aWR0aCwKICAgICAgICBwaWNraW5nX3RhcmdldC5oZWlnaHQKICAgIF07CiAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQocGlja2luZ190YXJnZXQpOwogICAgc2V0X3BpY2tpbmdfdW5pZm9ybXMoc2NlbmUsIDEsIHRydWUpOwogICAgY29uc3QgcmVuZGVyZWQgPSByZW5kZXJfc2NlbmUoc2NlbmUsIHRydWUpOwogICAgaWYgKCFyZW5kZXJlZCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChudWxsKTsKICAgIGNvbnN0IHBpY2tlZF9wbG90c19hcnJheSA9IHJlYWRfcGl4ZWxzKHJlbmRlcmVyLCBwaWNraW5nX3RhcmdldCwgeCwgeSwgdywgaCk7CiAgICByZXR1cm4gewogICAgICAgIHBpY2tlZF9wbG90c19hcnJheSwKICAgICAgICB3LAogICAgICAgIGgKICAgIH07Cn0KZnVuY3Rpb24gcGlja19jbG9zZXN0KHNjZW5lLCB4eSwgcmFuZ2UpIHsKICAgIGNvbnN0IHsgY2FudmFzICwgcHhfcGVyX3VuaXQgLCByZW5kZXJlciAgfSA9IHNjZW5lLnNjcmVlbjsKICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IFsKICAgICAgICByZW5kZXJlci5fd2lkdGgsCiAgICAgICAgcmVuZGVyZXIuX2hlaWdodAogICAgXTsKICAgIGlmICghKDEuMCA8PSB4eVswXSA8PSB3aWR0aCAmJiAxLjAgPD0geHlbMV0gPD0gaGVpZ2h0KSkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIDAKICAgICAgICBdOwogICAgfQogICAgY29uc3QgeDAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHB4X3Blcl91bml0ICogKHh5WzBdIC0gcmFuZ2UpKSk7CiAgICBjb25zdCB5MCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocHhfcGVyX3VuaXQgKiAoeHlbMV0gLSByYW5nZSkpKTsKICAgIGNvbnN0IHgxID0gTWF0aC5taW4oY2FudmFzLndpZHRoLCBNYXRoLmNlaWwocHhfcGVyX3VuaXQgKiAoeHlbMF0gKyByYW5nZSkpKTsKICAgIGNvbnN0IHkxID0gTWF0aC5taW4oY2FudmFzLmhlaWdodCwgTWF0aC5jZWlsKHB4X3Blcl91bml0ICogKHh5WzFdICsgcmFuZ2UpKSk7CiAgICBjb25zdCBkeCA9IHgxIC0geDA7CiAgICBjb25zdCBkeSA9IHkxIC0geTA7CiAgICBjb25zdCBbcGxvdF9kYXRhLCBfXSA9IHBpY2tfbmF0aXZlKHNjZW5lLCB4MCwgeTAsIGR4LCBkeSwgZmFsc2UpOwogICAgY29uc3QgcGxvdF9tYXRyaXggPSBwbG90X2RhdGEuZGF0YTsKICAgIGxldCBtaW5fZGlzdCA9IHB4X3Blcl91bml0ICogcHhfcGVyX3VuaXQgKiByYW5nZSAqIHJhbmdlOwogICAgbGV0IHNlbGVjdGlvbiA9IFsKICAgICAgICBudWxsLAogICAgICAgIDAKICAgIF07CiAgICBjb25zdCB4MiA9IHh5WzBdICogcHhfcGVyX3VuaXQgKyAxIC0geDA7CiAgICBjb25zdCB5MiA9IHh5WzFdICogcHhfcGVyX3VuaXQgKyAxIC0geTA7CiAgICBsZXQgcGluZGV4ID0gMDsKICAgIGZvcihsZXQgaSA9IDE7IGkgPD0gZHg7IGkrKyl7CiAgICAgICAgZm9yKGxldCBqID0gMTsgaiA8PSBkeTsgaisrKXsKICAgICAgICAgICAgY29uc3QgZCA9IE1hdGgucG93KHgyIC0gaSwgMikgKyBNYXRoLnBvdyh5MiAtIGosIDIpOwogICAgICAgICAgICBjb25zdCBbcGxvdF91dWlkLCBpbmRleF0gPSBwbG90X21hdHJpeFtwaW5kZXhdOwogICAgICAgICAgICBwaW5kZXggPSBwaW5kZXggKyAxOwogICAgICAgICAgICBpZiAoZCA8IG1pbl9kaXN0ICYmIHBsb3RfdXVpZCkgewogICAgICAgICAgICAgICAgbWluX2Rpc3QgPSBkOwogICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gWwogICAgICAgICAgICAgICAgICAgIHBsb3RfdXVpZCwKICAgICAgICAgICAgICAgICAgICBpbmRleAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWxlY3Rpb247Cn0KZnVuY3Rpb24gcGlja19zb3J0ZWQoc2NlbmUsIHh5LCByYW5nZSkgewogICAgY29uc3QgeyBjYW52YXMgLCBweF9wZXJfdW5pdCAsIHJlbmRlcmVyICB9ID0gc2NlbmUuc2NyZWVuOwogICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gWwogICAgICAgIHJlbmRlcmVyLl93aWR0aCwKICAgICAgICByZW5kZXJlci5faGVpZ2h0CiAgICBdOwogICAgaWYgKCEoMS4wIDw9IHh5WzBdIDw9IHdpZHRoICYmIDEuMCA8PSB4eVsxXSA8PSBoZWlnaHQpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB4MCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocHhfcGVyX3VuaXQgKiAoeHlbMF0gLSByYW5nZSkpKTsKICAgIGNvbnN0IHkwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihweF9wZXJfdW5pdCAqICh4eVsxXSAtIHJhbmdlKSkpOwogICAgY29uc3QgeDEgPSBNYXRoLm1pbihjYW52YXMud2lkdGgsIE1hdGguY2VpbChweF9wZXJfdW5pdCAqICh4eVswXSArIHJhbmdlKSkpOwogICAgY29uc3QgeTEgPSBNYXRoLm1pbihjYW52YXMuaGVpZ2h0LCBNYXRoLmNlaWwocHhfcGVyX3VuaXQgKiAoeHlbMV0gKyByYW5nZSkpKTsKICAgIGNvbnN0IGR4ID0geDEgLSB4MDsKICAgIGNvbnN0IGR5ID0geTEgLSB5MDsKICAgIGNvbnN0IHBpY2tlZCA9IHBpY2tfbmF0aXZlKHNjZW5lLCB4MCwgeTAsIGR4LCBkeSwgZmFsc2UpOwogICAgaWYgKCFwaWNrZWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IFtwbG90X2RhdGEsIHNlbGVjdGVkXSA9IHBpY2tlZDsKICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcGxvdF9tYXRyaXggPSBwbG90X2RhdGEuZGF0YTsKICAgIGNvbnN0IGRpc3RhbmNlcyA9IHNlbGVjdGVkLm1hcCgoeDEpPT4xZTMwKTsKICAgIGNvbnN0IHgyID0geHlbMF0gKiBweF9wZXJfdW5pdCArIDEgLSB4MDsKICAgIGNvbnN0IHkyID0geHlbMV0gKiBweF9wZXJfdW5pdCArIDEgLSB5MDsKICAgIGxldCBwaW5kZXggPSAwOwogICAgZm9yKGxldCBpID0gMTsgaSA8PSBkeDsgaSsrKXsKICAgICAgICBmb3IobGV0IGogPSAxOyBqIDw9IGR5OyBqKyspewogICAgICAgICAgICBjb25zdCBkID0gTWF0aC5wb3coeDIgLSBpLCAyKSArIE1hdGgucG93KHkyIC0gaiwgMik7CiAgICAgICAgICAgIGNvbnN0IFtwbG90X3V1aWQsIGluZGV4XSA9IHBsb3RfbWF0cml4W3BpbmRleF07CiAgICAgICAgICAgIHBpbmRleCA9IHBpbmRleCArIDE7CiAgICAgICAgICAgIGNvbnN0IHBsb3RfaW5kZXggPSBzZWxlY3RlZC5maW5kSW5kZXgoKHgxKT0+eDFbMF0ucGxvdF91dWlkID09IHBsb3RfdXVpZCAmJiB4MVsxXSA9PSBpbmRleCk7CiAgICAgICAgICAgIGlmIChwbG90X2luZGV4ID49IDAgJiYgZCA8IGRpc3RhbmNlc1twbG90X2luZGV4XSkgewogICAgICAgICAgICAgICAgZGlzdGFuY2VzW3Bsb3RfaW5kZXhdID0gZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNvcnRlZF9pbmRpY2VzID0gQXJyYXkuZnJvbShBcnJheShkaXN0YW5jZXMubGVuZ3RoKS5rZXlzKCkpLnNvcnQoKGEsIGIpPT5kaXN0YW5jZXNbYV0gPCBkaXN0YW5jZXNbYl0gPyAtMSA6IGRpc3RhbmNlc1tiXSA8IGRpc3RhbmNlc1thXSB8IDApOwogICAgcmV0dXJuIHNvcnRlZF9pbmRpY2VzLm1hcCgoaWR4KT0+ewogICAgICAgIGNvbnN0IFtwbG90LCBpbmRleF0gPSBzZWxlY3RlZFtpZHhdOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHBsb3QucGxvdF91dWlkLAogICAgICAgICAgICBpbmRleAogICAgICAgIF07CiAgICB9KTsKfQpmdW5jdGlvbiBwaWNrX25hdGl2ZV91dWlkKHNjZW5lLCB4MSwgeTEsIHcsIGgpIHsKICAgIGNvbnN0IHBpY2tlZCA9IHBpY2tfbmF0aXZlKHNjZW5lLCB4MSwgeTEsIHcsIGgpOwogICAgaWYgKCFwaWNrZWQpIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICBjb25zdCBbXywgcGlja2VkX3Bsb3RzXSA9IHBpY2tlZDsKICAgIHJldHVybiBwaWNrZWRfcGxvdHMubWFwKChbcCwgaW5kZXhdKT0+WwogICAgICAgICAgICBwLnBsb3RfdXVpZCwKICAgICAgICAgICAgaW5kZXgKICAgICAgICBdKTsKfQpmdW5jdGlvbiBwaWNrX25hdGl2ZV9tYXRyaXgoc2NlbmUsIHgxLCB5MSwgdywgaCkgewogICAgY29uc3QgcGlja2VkID0gcGlja19uYXRpdmUoc2NlbmUsIHgxLCB5MSwgdywgaCk7CiAgICBpZiAoIXBpY2tlZCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGRhdGE6IFtdLAogICAgICAgICAgICBzaXplOiBbCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgMAogICAgICAgICAgICBdCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBwaWNrZWRbMF07Cn0KZnVuY3Rpb24gcmVnaXN0ZXJfcG9wdXAocG9wdXAsIHNjZW5lLCBwbG90c190b19waWNrLCBjYWxsYmFjaykgewogICAgaWYgKCFzY2VuZSB8fCAhc2NlbmUuc2NyZWVuKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeyBjYW52YXMgIH0gPSBzY2VuZS5zY3JlZW47CiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwgKGV2ZW50KT0+ewogICAgICAgIGNvbnN0IFt4MSwgeTFdID0gZXZlbnRzMnVuaXRsZXNzKHNjZW5lLnNjcmVlbiwgZXZlbnQpOwogICAgICAgIGNvbnN0IHBpY2tlZCA9IHBpY2tfbmF0aXZlKHNjZW5lLCB4MSwgeTEsIDEsIDEpOwogICAgICAgIGlmICghcGlja2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgW18sIHBpY2tzXSA9IHBpY2tlZDsKICAgICAgICBpZiAocGlja3MubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgY29uc3QgW3Bsb3QsIGluZGV4XSA9IHBpY2tzWzBdOwogICAgICAgICAgICBpZiAocGxvdHNfdG9fcGljay5oYXMocGxvdC5wbG90X3V1aWQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayhwbG90LCBpbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoIXBvcHVwLmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKSB7CiAgICAgICAgICAgICAgICAgICAgcG9wdXAuY2xhc3NMaXN0LmFkZCgic2hvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGV2ZW50LnBhZ2VYICsgInB4IjsKICAgICAgICAgICAgICAgIHBvcHVwLnN0eWxlLnRvcCA9IGV2ZW50LnBhZ2VZICsgInB4IjsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAic3RyaW5nIiB8fCByZXN1bHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBwb3B1cC5pbm5lclRleHQgPSByZXN1bHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBvcHVwLmlubmVySFRNTCA9IHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBvcHVwLmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKTsKICAgICAgICB9CiAgICB9KTsKICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIChldmVudCk9PnsKICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAiRXNjYXBlIikgewogICAgICAgICAgICBwb3B1cC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7CiAgICAgICAgfQogICAgfSk7Cn0Kd2luZG93LldHTCA9IHsKICAgIGRlc2VyaWFsaXplX3NjZW5lLAogICAgdGhyZWVqc19tb2R1bGUsCiAgICBzdGFydF9yZW5kZXJsb29wLAogICAgZGVsZXRlX3Bsb3RzLAogICAgaW5zZXJ0X3Bsb3QsCiAgICBmaW5kX3Bsb3RzLAogICAgZGVsZXRlX3NjZW5lLAogICAgZmluZF9zY2VuZSwKICAgIHNjZW5lX2NhY2hlLAogICAgcGxvdF9jYWNoZSwKICAgIGRpc3Bvc2Vfc2NyZWVuLAogICAgZGVsZXRlX3NjZW5lcywKICAgIGNyZWF0ZV9zY2VuZSwKICAgIGV2ZW50czJ1bml0bGVzcywKICAgIG9uX25leHRfaW5zZXJ0LAogICAgcmVnaXN0ZXJfcG9wdXAsCiAgICByZW5kZXJfc2NlbmUsCiAgICBnZXRfdGV4dHVyZV9hdGxhcywKICAgIGdldF9wYXJlbnRfc2l6ZSwKICAgIGdldF9lbGVtZW50X3NpemUsCiAgICBnZXRfcmVzaXplX2VsZW1lbnQsCiAgICBjb252ZXJ0X3RvX21ha2llX3NpemUsCiAgICBpbml0aWFsaXplX2NhbnZhc19zaXplLAogICAgc2V0dXBfc2NlbmVfaW5pdCwKICAgIGV4ZWN1dGVfaW5fb3JkZXIKfTsKZXhwb3J0IHsgZGVzZXJpYWxpemVfc2NlbmUgYXMgZGVzZXJpYWxpemVfc2NlbmUsIHRocmVlanNfbW9kdWxlIGFzIHRocmVlanNfbW9kdWxlLCBzdGFydF9yZW5kZXJsb29wIGFzIHN0YXJ0X3JlbmRlcmxvb3AsIGRlbGV0ZV9wbG90cyBhcyBkZWxldGVfcGxvdHMsIGluc2VydF9wbG90IGFzIGluc2VydF9wbG90LCBmaW5kX3Bsb3RzIGFzIGZpbmRfcGxvdHMsIGRlbGV0ZV9zY2VuZSBhcyBkZWxldGVfc2NlbmUsIGZpbmRfc2NlbmUgYXMgZmluZF9zY2VuZSwgc2NlbmVfY2FjaGUgYXMgc2NlbmVfY2FjaGUsIHBsb3RfY2FjaGUgYXMgcGxvdF9jYWNoZSwgZGVsZXRlX3NjZW5lcyBhcyBkZWxldGVfc2NlbmVzLCBjcmVhdGVfc2NlbmUgYXMgY3JlYXRlX3NjZW5lLCBldmVudHMydW5pdGxlc3MgYXMgZXZlbnRzMnVuaXRsZXNzLCBvbl9uZXh0X2luc2VydCBhcyBvbl9uZXh0X2luc2VydCwgZ2V0X3RleHR1cmVfYXRsYXMgYXMgZ2V0X3RleHR1cmVfYXRsYXMsIGdldF9wYXJlbnRfc2l6ZSBhcyBnZXRfcGFyZW50X3NpemUsIGdldF9lbGVtZW50X3NpemUgYXMgZ2V0X2VsZW1lbnRfc2l6ZSwgZ2V0X3Jlc2l6ZV9lbGVtZW50IGFzIGdldF9yZXNpemVfZWxlbWVudCwgY29udmVydF90b19tYWtpZV9zaXplIGFzIGNvbnZlcnRfdG9fbWFraWVfc2l6ZSB9OwpleHBvcnQgeyBleGVjdXRlX2luX29yZGVyIGFzIGV4ZWN1dGVfaW5fb3JkZXIgfTsKZXhwb3J0IHsgZGlzcG9zZV9zY3JlZW4gYXMgZGlzcG9zZV9zY3JlZW4gfTsKZXhwb3J0IHsgcmVuZGVyX3NjZW5lIGFzIHJlbmRlcl9zY2VuZSB9OwpleHBvcnQgeyB3Z2xlcnJvciBhcyB3Z2xlcnJvciB9OwpleHBvcnQgeyBpbml0aWFsaXplX2NhbnZhc19zaXplIGFzIGluaXRpYWxpemVfY2FudmFzX3NpemUgfTsKZXhwb3J0IHsgc2V0dXBfc2NlbmVfaW5pdCBhcyBzZXR1cF9zY2VuZV9pbml0IH07CmV4cG9ydCB7IHBpY2tfbmF0aXZlIGFzIHBpY2tfbmF0aXZlIH07CmV4cG9ydCB7IGdldF9waWNraW5nX2J1ZmZlciBhcyBnZXRfcGlja2luZ19idWZmZXIgfTsKZXhwb3J0IHsgcGlja19jbG9zZXN0IGFzIHBpY2tfY2xvc2VzdCB9OwpleHBvcnQgeyBwaWNrX3NvcnRlZCBhcyBwaWNrX3NvcnRlZCB9OwpleHBvcnQgeyBwaWNrX25hdGl2ZV91dWlkIGFzIHBpY2tfbmF0aXZlX3V1aWQgfTsKZXhwb3J0IHsgcGlja19uYXRpdmVfbWF0cml4IGFzIHBpY2tfbmF0aXZlX21hdHJpeCB9OwpleHBvcnQgeyByZWdpc3Rlcl9wb3B1cCBhcyByZWdpc3Rlcl9wb3B1cCB9OwoK');
</script></div><div><script src="data:application/javascript;base64,Qm9uaXRvLmluaXRfc2Vzc2lvbigiODdhMTBiYTItYzg3Zi00YTFkLWI2MzUtMzY5NDViZWQ4NGEwIiwgQm9uaXRvLmZldGNoX2JpbmFyeSgnZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LHlRQUZyc2xybE5ra09EZGhNVEJpWVRJdFl6ZzNaaTAwWVRGa0xXSTJNelV0TXpZNU5EVmlaV1E0TkdFd28zTjFZc2N4RXNjdWFwUFpKRGczWVRFd1ltRXlMV000TjJZdE5HRXhaQzFpTmpNMUxUTTJPVFExWW1Wa09EUmhNS056ZFdMVUVwREpBQVd1WkJLUnlRQUZybDFybE5ra09EZGhNVEJpWVRJdFl6ZzNaaTAwWVRGa0xXSTJNelV0TXpZNU5EVmlaV1E0TkdFd28zTjFZc2tBQmFvQ0Vza0FCYW44YXBQWkpEZzNZVEV3WW1FeUxXTTROMll0TkdFeFpDMWlOak0xTFRNMk9UUTFZbVZrT0RSaE1LTnpkV0xKQUFXcHl4TGNBRTNIQjJXU3BERTFPREhEeHdWbGtxSTJPTVBIcG1XU3BERTFPRGFVeDBBWEFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVA4ZEFGK2MrT3pzQUFBQUFBQUFBQUFBQUFBQUFBQUFBNXo2N093QUFBQUFBQUFBQUFBQUFBQUFBQUFBWHQ5RzRBQUFBQUFBQWdMOEFBSUMvQUFBQWdBQUFnRC9YRndBQUwwUUFBSzlEeHd3WEFBQ0FQd0FBZ0Q4QUFJQS94eFZsa3FReE5UZ3l4d3dYWm1ibVBtWm01ajVtWnVZK3h3dGxrcVF4TlRnMXlqK0FBQURIR0dXU3BERTFNalBZRlFBQUFBQUFBQUFBdkFJQUFGNEJBQURIRldXU3BERTFPRFBIREJjQUFBQS9BQUFBUHdBQUFEL0hCMldTcERFMU5EVER4d2Rsa3FReE5UVXdrTWNIWlpLa01UVTFNWkRIQjJXU3BERTFOVEtReHdkbGtxUXhOVFV6a01jSFpaS2tNVFUxTkpESEIyV1NwREUxTlRXUXh3ZGxrcVF4TlRVMmtNY0haWktrTVRVMU41REhCMldTcERFMU5UaVF4d2Rsa3FReE5UVTVrTWNIWlpLa01UVTJNSkRIQjJXU3BERTFOakdReHdkbGtxUXhOVFl5a01jSFpaS2tNVFUyTTVESEIyV1NwREUxTmpTUXh3ZGxrcVF4TlRZMWtNY0haWktrTVRVMk5wREhCMldTcERFMU5qZVF4d2Rsa3FReE5UWTRrTWNIWlpLa01UVTJPWkRIQjJXU3BERTFOekNReHdkbGtxUXhOVGN4a01jSFpaS2tNVFUzTXBESEIyV1NwREUxTnpPUXh3ZGxrcVF4TlRjMGtNY0haWktrTVRVM05aREhCMldTcERFMU56YVF4d2Rsa3FReE5UYzNrTWNIWlpLa01UVTNPSkRIQjJXU3BERTFOem1ReHdabGtxTXlOam5EeDZabGtxUXhOVFE1bE1kQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEL0hRQmZuUGpzN0FBQUFBQUFBQUFBQUFBQUFBQUFBQU9jK3V6c0FBQUFBQUFBQUFBQUFBQUFBQUFBQUY3ZlJ1QUFBQUFBQUFJQy9BQUNBdndBQUFJQUFBSUEvMXhjQUFDOUVBQUN2UThjTUZ3QUFnRDhBQUlBL0FBQ0FQOGNWWlpLa01UVTBOY2NNRjJabTVqNW1adVkrWm1ibVBzY0xaWktrTVRVME9Nby9nQUFBeHhobGtxUXhOVEkwMkJVQUFBQUFBQUFBQUx3Q0FBQmVBUUFBeHhWbGtxUXhOVFEyeHd3WEFBQUFQd0FBQUQ4QUFBQS94d2Rsa3FReE5UTTJ3OGNIWlpLa01UVTBNcERIQm1XU296UTNPTVBIcG1XU3BERTFOREdVeDBBWEFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVA4ZEFGNllvbEQ0QUFBQUFBQUFBQUFBQUFBQUFBQUFBcGJwb1B3QUFBQUFBQUFBQUFBQUFBQUFBQUFBWHQ5RzRBQUFBQUM2NmFMOEFBQUNBQUFBQWdBQUFnRC9YRndDQUdFUUFnSWxEeHd3WEFBQ0FQd0FBZ0Q4QUFJQS94eFZsa3FReE5UTTN4d3dYWm1ibVBtWm01ajVtWnVZK3h3dGxrcVF4TlRRd3lqK0FBQURIR0dXU3BERTFNalhZRlVvQUFBQTdBQUFBWWdJQUFCTUJBQURIRldXU3BERTFNempIREJjQUFBQS9BQUFBUHdBQUFEL0hCMldTcERFMU1qakR4d2Rsa3FReE5UTTBrTWNIWlpLa01UUXdPY1BIcG1XU3BERTFNek9VeDBBWEFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVA4ZEFGd0FBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRC9YRndDQUdFUUFnSWxEeHd3WEFBQ0FQd0FBZ0Q4QUFJQS94eFZsa3FReE5USTV4d3dYWm1ibVBtWm01ajVtWnVZK3h3dGxrcVF4TlRNeXlqK0FBQURIR0dXU3BERTFNamJZRlVvQUFBQTdBQUFBWWdJQUFCTUJBQURIRldXU3BERTFNekRIREJjQUFBQS9BQUFBUHdBQUFEL0hEbVdTcERFMU16R25JMFpHUmtaR1JzY0haWktrTVRReE1NTEhGV1dTcERFMU1qZkhEQmNINGVtK0pCc2h2eFAwSUwvSERtV1NwREUxTXptbkkwWkdSa1pHUnNjR1paS2pORGM1d3NjVlpaS2tNVFV6TmNjTUZ3Zmg2YjRrR3lHL0UvUWd2OGNPWlpLa01UVTBONmNqUmtaR1JrWkd4d1psa3FNeU56REN4eFZsa3FReE5UUXp4d3dYQitIcHZpUWJJYjhUOUNDL3h3NWxrcVF4TlRnMHB5TkdSa1pHUmtiSEJtV1NvekUzTk1QSEZXV1NwREUxT0RESERCY0g0ZW0rSkJzaHZ4UDBJTC9KQUFXak4yV1NwREUxTWpHT3AyRnRZbWxsYm5USEJXaWtNVFU0TXFWd2JHOTBjNUN2WW1GamEyZHliM1Z1WkdOdmJHOXl4d1ZvcERFMU9EUzFZMkZ0WlhKaFgzSmxiR0YwYVhabFgyeHBaMmgweHdWb3BERTFPREdvWTJocGJHUnlaVzZSanFkaGJXSnBaVzUweHdWb3BERTFORFdsY0d4dmRIUGNBQjZQckhSeVlXNXpjR0Z5Wlc1amVjS2xjM0JoWTJXa1pHRjBZYXgyWlhKMFpYaGhjbkpoZVhPQnVuQnZjMmwwYVc5dWMxOTBjbUZ1YzJadmNtMWxaRjltTXpKamdxdDBlWEJsWDJ4bGJtZDBhQUtrWm14aGRNY2dGd0FBbEVJQUFHeENBQUFyUkFBQWJFSUFBQ3RFQUFDblF3QUFsRUlBQUtkRHBucDJZV3gxWmNyQ3lBQUFwRzVoYldXNGJXVnphQzB5TkRJMk1URTJOVGN3TURnMk16STNNelUwcVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0Fadm1sdWRHVnljRzlzWVhSbFgybHVYMlp5WVdkdFpXNTBYM05vWVdSbGNzT3BZbUZqYTJ4cFoyaDB5Z0FBQUFDeWRXNXBabTl5YlY5amIyeHZjbkpoYm1kbHdxZGthV1ptZFhObHh3d1hBQUNBUHdBQWdEOEFBSUEvcVc1aGJsOWpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUtwdGIyUmxiRjltTXpKangwQVhBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQU1qQ0FBQ0FQNmR3WVhSMFpYSnV3cWR6YUdGa2FXNW53cTFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3FITndaV04xYkdGeXh3d1h6Y3hNUHMzTVREN056RXcrdFZCSlEwdEpUa2RmU1U1RVJWaGZSbEpQVFY5VlZzT3dkVzVwWm05eWJWOWpiMnh2Y20xaGNNS25ibTl5YldGc2M4Y01Gd0FBQUFBQUFBQUFBQUFBQUtkd2FXTnJhVzVud3JCM1oyeGZkWFpmZEhKaGJuTm1iM0p0eHlRWEFBQUFBQUFBZ0Q4QUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUlBL3QzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtsdlltcGxZM1JmYVdRQXJYVnVhV1p2Y20xZlkyOXNiM0xZRndBQWdEOEFBSUEvQUFDQVB3QUFnRCtzZG1WeWRHVjRYMk52Ykc5eXdxdGtaWEIwYUY5emFHbG1kTW9BQUFBQXNuZHZjbXhrWDI1dmNtMWhiRzFoZEhKcGVNY2tGd0FBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNjVvYVdkb1kyeHBjRjlqYjJ4dmN0Z1hnRVYrUCtqNVp6LzFZeE0rQUFDQVA3TjFibWxtYjNKdFgyTnNhWEJmY0d4aGJtVnp4NEFYQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM2cGMyaHBibWx1WlhOenlrSUFBQUN5ZEdWNGRIVnlaV052YjNKa2FXNWhkR1Z6MXhjQUFBQUFBQUFBQUtkMmFYTnBZbXhsdzZodmRtVnlaSEpoZDhLbFptRmpaWFBIR0JZQUFBQUFBUUFBQUFJQUFBQUFBQUFBQWdBQUFBTUFBQUNrZFhWcFpMTXlOREkyTVRFMk5UY3dNRGcyTXpJM016VTByWFpsY25SbGVGOXpiM1Z5WTJYYUZwOEtjSEpsWTJsemFXOXVJR2hwWjJod0lHbHVkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR1pzYjJGME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pKRU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pORU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2FYTmhiWEJzWlhJeVJEc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHbHpZVzF3YkdWeU0wUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQjFjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdkWE5oYlhCc1pYSXpSRHNLTHk4Z2RtVnlkR1Y0SUdsdWNIVjBjem9nQ21sdUlIWmxZeklnY0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU03Q25abFl6SWdaMlYwWDNCdmMybDBhVzl1YzE5MGNtRnVjMlp2Y20xbFpGOW1NekpqS0NsN2NtVjBkWEp1SUhCdmMybDBhVzl1YzE5MGNtRnVjMlp2Y20xbFpGOW1NekpqTzMwS0NpOHZJRlZ1YVdadmNtMXpPaUFLZFc1cFptOXliU0JpYjI5c0lIVnVhV1p2Y20xZlkyOXNiM0p0WVhBN0NtSnZiMndnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0p0WVhBb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjbTFoY0R0OUNuVnVhV1p2Y20wZ2RXbHVkQ0J2WW1wbFkzUmZhV1E3Q25WcGJuUWdaMlYwWDI5aWFtVmpkRjlwWkNncGUzSmxkSFZ5YmlCdlltcGxZM1JmYVdRN2ZRcDFibWxtYjNKdElHMWhkRFFnYlc5a1pXeGZaak15WXpzS2JXRjBOQ0JuWlhSZmJXOWtaV3hmWmpNeVl5Z3BlM0psZEhWeWJpQnRiMlJsYkY5bU16SmpPMzBLZFc1cFptOXliU0IyWldNeklITndaV04xYkdGeU93cDJaV016SUdkbGRGOXpjR1ZqZFd4aGNpZ3BlM0psZEhWeWJpQnpjR1ZqZFd4aGNqdDlDblZ1YVdadmNtMGdkbVZqTXlCdWIzSnRZV3h6T3dwMlpXTXpJR2RsZEY5dWIzSnRZV3h6S0NsN2NtVjBkWEp1SUc1dmNtMWhiSE03ZlFwMWJtbG1iM0p0SUdKdmIyd2djR2xqYTJsdVp6c0tZbTl2YkNCblpYUmZjR2xqYTJsdVp5Z3BlM0psZEhWeWJpQndhV05yYVc1bk8zMEtkVzVwWm05eWJTQmliMjlzSUhCaGRIUmxjbTQ3Q21KdmIyd2daMlYwWDNCaGRIUmxjbTRvS1h0eVpYUjFjbTRnY0dGMGRHVnlianQ5Q25WdWFXWnZjbTBnWW05dmJDQnBiblJsY25CdmJHRjBaVjlwYmw5bWNtRm5iV1Z1ZEY5emFHRmtaWEk3Q21KdmIyd2daMlYwWDJsdWRHVnljRzlzWVhSbFgybHVYMlp5WVdkdFpXNTBYM05vWVdSbGNpZ3BlM0psZEhWeWJpQnBiblJsY25CdmJHRjBaVjlwYmw5bWNtRm5iV1Z1ZEY5emFHRmtaWEk3ZlFwMWJtbG1iM0p0SUdKdmIyd2dkbVZ5ZEdWNFgyTnZiRzl5T3dwaWIyOXNJR2RsZEY5MlpYSjBaWGhmWTI5c2IzSW9LWHR5WlhSMWNtNGdkbVZ5ZEdWNFgyTnZiRzl5TzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JpWVdOcmJHbG5hSFE3Q21ac2IyRjBJR2RsZEY5aVlXTnJiR2xuYUhRb0tYdHlaWFIxY200Z1ltRmphMnhwWjJoME8zMEtkVzVwWm05eWJTQmliMjlzSUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlRzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbkpoYm1kbEtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUdDlDblZ1YVdadmNtMGdZbTl2YkNCUVNVTkxTVTVIWDBsT1JFVllYMFpTVDAxZlZWWTdDbUp2YjJ3Z1oyVjBYMUJKUTB0SlRrZGZTVTVFUlZoZlJsSlBUVjlWVmlncGUzSmxkSFZ5YmlCUVNVTkxTVTVIWDBsT1JFVllYMFpTVDAxZlZWWTdmUXAxYm1sbWIzSnRJSFpsWXpRZ2JtRnVYMk52Ykc5eU93cDJaV00wSUdkbGRGOXVZVzVmWTI5c2IzSW9LWHR5WlhSMWNtNGdibUZ1WDJOdmJHOXlPMzBLZFc1cFptOXliU0JtYkc5aGRDQnphR2x1YVc1bGMzTTdDbVpzYjJGMElHZGxkRjl6YUdsdWFXNWxjM01vS1h0eVpYUjFjbTRnYzJocGJtbHVaWE56TzMwS2RXNXBabTl5YlNCMlpXTXlJSFJsZUhSMWNtVmpiMjl5WkdsdVlYUmxjenNLZG1Wak1pQm5aWFJmZEdWNGRIVnlaV052YjNKa2FXNWhkR1Z6S0NsN2NtVjBkWEp1SUhSbGVIUjFjbVZqYjI5eVpHbHVZWFJsY3p0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWkdWd2RHaGZjMmhwWm5RN0NtWnNiMkYwSUdkbGRGOWtaWEIwYUY5emFHbG1kQ2dwZTNKbGRIVnliaUJrWlhCMGFGOXphR2xtZER0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JzYjNkamJHbHdYMk52Ykc5eU93cDJaV00wSUdkbGRGOXNiM2RqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUd4dmQyTnNhWEJmWTI5c2IzSTdmUXAxYm1sbWIzSnRJRzFoZERNZ2QyOXliR1JmYm05eWJXRnNiV0YwY21sNE93cHRZWFF6SUdkbGRGOTNiM0pzWkY5dWIzSnRZV3h0WVhSeWFYZ29LWHR5WlhSMWNtNGdkMjl5YkdSZmJtOXliV0ZzYldGMGNtbDRPMzBLZFc1cFptOXliU0IyWldNMElIVnVhV1p2Y20xZlkyOXNiM0k3Q25abFl6UWdaMlYwWDNWdWFXWnZjbTFmWTI5c2IzSW9LWHR5WlhSMWNtNGdkVzVwWm05eWJWOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JvYVdkb1kyeHBjRjlqYjJ4dmNqc0tkbVZqTkNCblpYUmZhR2xuYUdOc2FYQmZZMjlzYjNJb0tYdHlaWFIxY200Z2FHbG5hR05zYVhCZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdKdmIyd2djMmhoWkdsdVp6c0tZbTl2YkNCblpYUmZjMmhoWkdsdVp5Z3BlM0psZEhWeWJpQnphR0ZrYVc1bk8zMEtkVzVwWm05eWJTQjJaV016SUdScFptWjFjMlU3Q25abFl6TWdaMlYwWDJScFptWjFjMlVvS1h0eVpYUjFjbTRnWkdsbVpuVnpaVHQ5Q25WdWFXWnZjbTBnYldGME15QjNaMnhmZFhaZmRISmhibk5tYjNKdE93cHRZWFF6SUdkbGRGOTNaMnhmZFhaZmRISmhibk5tYjNKdEtDbDdjbVYwZFhKdUlIZG5iRjkxZGw5MGNtRnVjMlp2Y20wN2ZRb0tDZ3B3Y21WamFYTnBiMjRnYUdsbmFIQWdabXh2WVhRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCcGJuUTdDZ3B2ZFhRZ2RtVmpNaUJtY21GblgzVjJPd3B2ZFhRZ2RtVmpNeUJ2WDI1dmNtMWhiRHNLYjNWMElIWmxZek1nYjE5allXMWthWEk3Q2dwdmRYUWdkbVZqTkNCbWNtRm5YMk52Ykc5eU93cHZkWFFnWm14dllYUWdiMTlqYkdsd1gyUnBjM1JoYm1ObFd6aGRPd29LZFc1cFptOXliU0J0WVhRMElIQnliMnBsWTNScGIyNDdDblZ1YVdadmNtMGdiV0YwTkNCMmFXVjNPd3AxYm1sbWIzSnRJSFpsWXpNZ1pYbGxjRzl6YVhScGIyNDdDblZ1YVdadmNtMGdhVzUwSUhWdWFXWnZjbTFmYm5WdFgyTnNhWEJmY0d4aGJtVnpPd3AxYm1sbWIzSnRJSFpsWXpRZ2RXNXBabTl5YlY5amJHbHdYM0JzWVc1bGMxczRYVHNLQ25abFl6TWdkRzkyWldNektIWmxZeklnZGlsN2NtVjBkWEp1SUhabFl6TW9kaXdnTUM0d0tUdDlDblpsWXpNZ2RHOTJaV016S0habFl6TWdkaWw3Y21WMGRYSnVJSFk3ZlFwMlpXTTBJSFJ2ZG1Wak5DaG1iRzloZENCMktYdHlaWFIxY200Z2RtVmpOQ2gyTENBd0xqQXNJREF1TUN3Z01DNHdLVHQ5Q25abFl6UWdkRzkyWldNMEtIWmxZek1nZGlsN2NtVjBkWEp1SUhabFl6UW9kaXdnTVM0d0tUdDlDblpsWXpRZ2RHOTJaV00wS0habFl6UWdkaWw3Y21WMGRYSnVJSFk3ZlFvS2RtVmpOQ0JuWlhSZlkyOXNiM0pmWm5KdmJWOWpiV0Z3S0dac2IyRjBJSFpoYkhWbExDQnpZVzF3YkdWeU1rUWdZMjlzYjNKZmJXRndMQ0IyWldNeUlHTnZiRzl5Y21GdVoyVXBJSHNLSUNBZ0lHWnNiMkYwSUdOdGFXNGdQU0JqYjJ4dmNuSmhibWRsTG5nN0NpQWdJQ0JtYkc5aGRDQmpiV0Y0SUQwZ1kyOXNiM0p5WVc1blpTNTVPd29nSUNBZ2FXWWdLSFpoYkhWbElEdzlJR050WVhnZ0ppWWdkbUZzZFdVZ1BqMGdZMjFwYmlrZ2V3b2dJQ0FnSUNBZ0lDOHZJR2x1SUhaaGJIVmxJSEpoYm1kbExDQmpiMjUwYVc1MVpTRUtJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RtRnNkV1VnUENCamJXbHVLU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJR2RsZEY5c2IzZGpiR2x3WDJOdmJHOXlLQ2s3Q2lBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFpoYkhWbElENGdZMjFoZUNrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCblpYUmZhR2xuYUdOc2FYQmZZMjlzYjNJb0tUc0tJQ0FnSUgwZ1pXeHpaU0I3Q2lBZ0lDQWdJQ0FnTHk4Z2FYTnVZVzRnYVhNZ1luSnZhMlZ1SUNodlppQmpiM1Z5YzJVcElDMHVMUW9nSUNBZ0lDQWdJQzh2SUhOdklHbG1JRzkxZEhOcFpHVWdkbUZzZFdVZ2NtRnVaMlVnWVc1a0lHNXZkQ0J6YldGc2JHVnlMMkpwWjJkbGNpQnRhVzR2YldGNElIZGxJR0Z6YzNWdFpTQk9ZVTRLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdaMlYwWDI1aGJsOWpiMnh2Y2lncE93b2dJQ0FnZlFvZ0lDQWdabXh2WVhRZ2FUQXhJRDBnWTJ4aGJYQW9LSFpoYkhWbElDMGdZMjFwYmlrZ0x5QW9ZMjFoZUNBdElHTnRhVzRwTENBd0xqQXNJREV1TUNrN0NpQWdJQ0F2THlBeEx6QWdZMjl5Y21WemNHOXVaSE1nZEc4Z2RHaGxJR052Y201bGNpQnZaaUIwYUdVZ1kyOXNiM0p0WVhBc0lITnZJSFJ2SUhCeWIzQmxjbXg1SUdsdWRHVnljRzlzWVhSbENpQWdJQ0F2THlCaVpYUjNaV1Z1SUhSb1pTQmpiMnh2Y25Nc0lIZGxJRzVsWldRZ2RHOGdjMk5oYkdVZ2FYUXNJSE52SUhSb1lYUWdkR2hsSUdWdVpITWdZWEpsSUdGMElERWdMU0FvYzNSbGNITnBlbVV2TWlrZ1lXNWtJREFyS0hOMFpYQnphWHBsTHpJcExnb2dJQ0FnWm14dllYUWdjM1JsY0hOcGVtVWdQU0F4TGpBZ0x5Qm1iRzloZENoMFpYaDBkWEpsVTJsNlpTaGpiMnh2Y2w5dFlYQXNJREFwS1RzS0lDQWdJR2t3TVNBOUlDZ3hMakFnTFNCemRHVndjMmw2WlNrZ0tpQnBNREVnS3lBd0xqVWdLaUJ6ZEdWd2MybDZaVHNLSUNBZ0lISmxkSFZ5YmlCMFpYaDBkWEpsS0dOdmJHOXlYMjFoY0N3Z2RtVmpNaWhwTURFc0lEQXVNQ2twT3dwOUNncDJaV00wSUdkbGRGOWpiMnh2Y2loMlpXTXpJR052Ykc5eUxDQmliMjlzSUdOdmJHOXljbUZ1WjJVc0lHSnZiMndnWTI5c2IzSnRZWEFwZXdvZ0lDQWdjbVYwZFhKdUlIWmxZelFvWTI5c2IzSXNJREV1TUNrN0NuMEtkbVZqTkNCblpYUmZZMjlzYjNJb2RtVmpOQ0JqYjJ4dmNpd2dZbTl2YkNCamIyeHZjbkpoYm1kbExDQmliMjlzSUdOdmJHOXliV0Z3S1hzS0lDQWdJSEpsZEhWeWJpQmpiMnh2Y2pzS2ZRcDJaV00wSUdkbGRGOWpiMnh2Y2loaWIyOXNJR052Ykc5eUxDQmliMjlzSUdOdmJHOXljbUZ1WjJVc0lHSnZiMndnWTI5c2IzSnRZWEFwZXdvZ0lDQWdMeThnWTI5c2IzSWdjMkZ0Y0d4cGJtY2dhR0Z3Y0dWdWN5QnBiaUJtY21GbmJXVnVkQ0J6YUdGa1pYSUtJQ0FnSUhKbGRIVnliaUIyWldNMEtEQXVNQ3dnTUM0d0xDQXdMakFzSURBdU1DazdDbjBLZG1Wak5DQm5aWFJmWTI5c2IzSW9ZbTl2YkNCMllXeDFaU3dnZG1Wak1pQmpiMnh2Y25KaGJtZGxMQ0J6WVcxd2JHVnlNa1FnWTI5c2IzSnRZWEFwZXdvZ0lDQWdMeThnWTI5c2IzSWdjMkZ0Y0d4cGJtY2dhR0Z3Y0dWdWN5QnBiaUJtY21GbmJXVnVkQ0J6YUdGa1pYSUtJQ0FnSUhKbGRIVnliaUIyWldNMEtEQXVNQ3dnTUM0d0xDQXdMakFzSURBdU1DazdDbjBLZG1Wak5DQm5aWFJmWTI5c2IzSW9abXh2WVhRZ2RtRnNkV1VzSUhabFl6SWdZMjlzYjNKeVlXNW5aU3dnYzJGdGNHeGxjakpFSUdOdmJHOXliV0Z3S1hzS0lDQWdJR2xtSUNoblpYUmZhVzUwWlhKd2IyeGhkR1ZmYVc1ZlpuSmhaMjFsYm5SZmMyaGhaR1Z5S0NrcElIc0tJQ0FnSUNBZ0lDQnlaWFIxY200Z2RtVmpOQ2gyWVd4MVpTd2dNQzR3TENBd0xqQXNJREF1TUNrN0NpQWdJQ0I5SUdWc2MyVWdld29nSUNBZ0lDQWdJSEpsZEhWeWJpQm5aWFJmWTI5c2IzSmZabkp2YlY5amJXRndLSFpoYkhWbExDQmpiMnh2Y20xaGNDd2dZMjlzYjNKeVlXNW5aU2s3Q2lBZ0lDQjlDbjBLQ25admFXUWdjSEp2WTJWemMxOWpiR2x3WDNCc1lXNWxjeWgyWldNeklIZHZjbXhrWDNCdmN5a2dld29nSUNBZ1ptOXlJQ2hwYm5RZ2FTQTlJREE3SUdrZ1BDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzZ2FTc3JLUW9nSUNBZ0lDQWdJRzlmWTJ4cGNGOWthWE4wWVc1alpWdHBYU0E5SUdSdmRDaDNiM0pzWkY5d2IzTXNJSFZ1YVdadmNtMWZZMnhwY0Y5d2JHRnVaWE5iYVYwdWVIbDZLU0F0SUhWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhOYmFWMHVkenNLZlFvS0x5OGdWRTlFVHpvZ1pXNWhZbXhsQ2k4dklIWmxZeklnWVhCd2JIbGZkWFpmZEhKaGJuTm1iM0p0S0U1dmRHaHBibWNnZERFc0lIWmxZeklnZFhZcGV5QnlaWFIxY200Z2RYWTdJSDBLZG1Wak1pQmhjSEJzZVY5MWRsOTBjbUZ1YzJadmNtMG9iV0YwTXlCMGNtRnVjMlp2Y20wc0lIWmxZeklnZFhZcGV5QnlaWFIxY200Z0tIUnlZVzV6Wm05eWJTQXFJSFpsWXpNb2RYWXNJREVwS1M1NGVUc2dmUW9LZG05cFpDQnlaVzVrWlhJb2RtVmpOQ0J3YjNOcGRHbHZibDkzYjNKc1pDd2dkbVZqTXlCdWIzSnRZV3dzSUcxaGREUWdkbWxsZHl3Z2JXRjBOQ0J3Y205cVpXTjBhVzl1S1FwN0NpQWdJQ0F2THlCdWIzSnRZV3dnYVc0Z2QyOXliR1FnYzNCaFkyVUtJQ0FnSUc5ZmJtOXliV0ZzSUQwZ1oyVjBYM2R2Y214a1gyNXZjbTFoYkcxaGRISnBlQ2dwSUNvZ2JtOXliV0ZzT3dvZ0lDQWdMeThnY0c5emFYUnBiMjRnYVc0Z1kyeHBjQ0J6Y0dGalpTQW9keThnWkdWd2RHZ3BDaUFnSUNCd2NtOWpaWE56WDJOc2FYQmZjR3hoYm1WektIQnZjMmwwYVc5dVgzZHZjbXhrTG5oNWVpazdDaUFnSUNCbmJGOVFiM05wZEdsdmJpQTlJSEJ5YjJwbFkzUnBiMjRnS2lCMmFXVjNJQ29nY0c5emFYUnBiMjVmZDI5eWJHUTdJQzh2SUZSUFJFOGdZMjl1YzJsa1pYSWdkWE5wYm1jZ2NISnZhbVZqZEdsdmJuWnBaWGNnWkdseVpXTjBiSGtLSUNBZ0lHZHNYMUJ2YzJsMGFXOXVMbm9nS3owZ1oyeGZVRzl6YVhScGIyNHVkeUFxSUdkbGRGOWtaWEIwYUY5emFHbG1kQ2dwT3dvZ0lDQWdMeThnWkdseVpXTjBhVzl1SUhSdklHTmhiV1Z5WVFvZ0lDQWdiMTlqWVcxa2FYSWdQU0J3YjNOcGRHbHZibDkzYjNKc1pDNTRlWG9nTHlCd2IzTnBkR2x2Ymw5M2IzSnNaQzUzSUMwZ1pYbGxjRzl6YVhScGIyNDdDbjBLQ21ac1lYUWdiM1YwSUhWcGJuUWdabkpoWjE5cGJuTjBZVzVqWlY5cFpEc0tDblp2YVdRZ2JXRnBiaWdwZXdvZ0lDQWdMeThnWjJWMFh5b2daMlYwY3lCMGFHVWdaMnh2WW1Gc0lHbHVjSFYwY3lBb2RXNXBabTl5YlN3Z2MyRnRjR3hsY2l3Z2NHOXphWFJwYjI0Z1lYSnlZWGtwQ2lBZ0lDQXZMeUIwYUc5elpTQm1kVzVqZEdsdmJuTWdkMmxzYkNCblpYUWdhVzV6WlhKMFpXUWdZbmtnZEdobElITm9ZV1JsY2lCamNtVmhkR2x2YmlCd2FYQmxiR2x1WlFvZ0lDQWdkbVZqTXlCMlpYSjBaWGhmY0c5emFYUnBiMjRnUFNCMGIzWmxZek1vWjJWMFgzQnZjMmwwYVc5dWMxOTBjbUZ1YzJadmNtMWxaRjltTXpKaktDa3BPd29nSUNBZ2FXWWdLR2x6Ym1GdUtIWmxjblJsZUY5d2IzTnBkR2x2Ymk1NktTa2dld29nSUNBZ0lDQWdJSFpsY25SbGVGOXdiM05wZEdsdmJpNTZJRDBnTUM0d093b2dJQ0FnZlFvZ0lDQWdkbVZqTkNCd2IzTnBkR2x2Ymw5M2IzSnNaQ0E5SUcxdlpHVnNYMll6TW1NZ0tpQjJaV00wS0habGNuUmxlRjl3YjNOcGRHbHZiaXdnTVNrN0Nnb2dJQ0FnY21WdVpHVnlLSEJ2YzJsMGFXOXVYM2R2Y214a0xDQm5aWFJmYm05eWJXRnNjeWdwTENCMmFXVjNMQ0J3Y205cVpXTjBhVzl1S1RzS0lDQWdJR1p5WVdkZmRYWWdQU0JoY0hCc2VWOTFkbDkwY21GdWMyWnZjbTBvWjJWMFgzZG5iRjkxZGw5MGNtRnVjMlp2Y20wb0tTd2daMlYwWDNSbGVIUjFjbVZqYjI5eVpHbHVZWFJsY3lncEtUc0tJQ0FnSUdaeVlXZGZZMjlzYjNJZ1BTQm5aWFJmWTI5c2IzSW9aMlYwWDNabGNuUmxlRjlqYjJ4dmNpZ3BMQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbkpoYm1kbEtDa3NJSFZ1YVdadmNtMWZZMjlzYjNKdFlYQXBPd29LSUNBZ0lHWnlZV2RmYVc1emRHRnVZMlZmYVdRZ1BTQjFhVzUwS0dkc1gxWmxjblJsZUVsRUtUc0tmUW9LcjJaeVlXZHRaVzUwWDNOdmRYSmpaZG9mRUFwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVc1ME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ1pteHZZWFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVhOaGJYQnNaWEl6UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUhWellXMXdiR1Z5TWtRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCMWMyRnRjR3hsY2pORU93b0tiM1YwSUhabFl6UWdabkpoWjIxbGJuUmZZMjlzYjNJN0Nnb3ZMeUJWYm1sbWIzSnRjem9nQ25WdWFXWnZjbTBnWW05dmJDQjFibWxtYjNKdFgyTnZiRzl5YldGd093cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5YldGd0tDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p0WVhBN2ZRcDFibWxtYjNKdElIVnBiblFnYjJKcVpXTjBYMmxrT3dwMWFXNTBJR2RsZEY5dlltcGxZM1JmYVdRb0tYdHlaWFIxY200Z2IySnFaV04wWDJsa08zMEtkVzVwWm05eWJTQnRZWFEwSUcxdlpHVnNYMll6TW1NN0NtMWhkRFFnWjJWMFgyMXZaR1ZzWDJZek1tTW9LWHR5WlhSMWNtNGdiVzlrWld4ZlpqTXlZenQ5Q25WdWFXWnZjbTBnZG1Wak15QnpjR1ZqZFd4aGNqc0tkbVZqTXlCblpYUmZjM0JsWTNWc1lYSW9LWHR5WlhSMWNtNGdjM0JsWTNWc1lYSTdmUXAxYm1sbWIzSnRJSFpsWXpNZ2JtOXliV0ZzY3pzS2RtVmpNeUJuWlhSZmJtOXliV0ZzY3lncGUzSmxkSFZ5YmlCdWIzSnRZV3h6TzMwS2RXNXBabTl5YlNCaWIyOXNJSEJwWTJ0cGJtYzdDbUp2YjJ3Z1oyVjBYM0JwWTJ0cGJtY29LWHR5WlhSMWNtNGdjR2xqYTJsdVp6dDlDblZ1YVdadmNtMGdZbTl2YkNCd1lYUjBaWEp1T3dwaWIyOXNJR2RsZEY5d1lYUjBaWEp1S0NsN2NtVjBkWEp1SUhCaGRIUmxjbTQ3ZlFwMWJtbG1iM0p0SUdKdmIyd2dhVzUwWlhKd2IyeGhkR1ZmYVc1ZlpuSmhaMjFsYm5SZmMyaGhaR1Z5T3dwaWIyOXNJR2RsZEY5cGJuUmxjbkJ2YkdGMFpWOXBibDltY21GbmJXVnVkRjl6YUdGa1pYSW9LWHR5WlhSMWNtNGdhVzUwWlhKd2IyeGhkR1ZmYVc1ZlpuSmhaMjFsYm5SZmMyaGhaR1Z5TzMwS2RXNXBabTl5YlNCaWIyOXNJSFpsY25SbGVGOWpiMnh2Y2pzS1ltOXZiQ0JuWlhSZmRtVnlkR1Y0WDJOdmJHOXlLQ2w3Y21WMGRYSnVJSFpsY25SbGVGOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWW1GamEyeHBaMmgwT3dwbWJHOWhkQ0JuWlhSZlltRmphMnhwWjJoMEtDbDdjbVYwZFhKdUlHSmhZMnRzYVdkb2REdDlDblZ1YVdadmNtMGdZbTl2YkNCMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJVN0NtSnZiMndnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpTZ3BlM0psZEhWeWJpQjFibWxtYjNKdFgyTnZiRzl5Y21GdVoyVTdmUXAxYm1sbWIzSnRJR0p2YjJ3Z1VFbERTMGxPUjE5SlRrUkZXRjlHVWs5TlgxVldPd3BpYjI5c0lHZGxkRjlRU1VOTFNVNUhYMGxPUkVWWVgwWlNUMDFmVlZZb0tYdHlaWFIxY200Z1VFbERTMGxPUjE5SlRrUkZXRjlHVWs5TlgxVldPMzBLZFc1cFptOXliU0IyWldNMElHNWhibDlqYjJ4dmNqc0tkbVZqTkNCblpYUmZibUZ1WDJOdmJHOXlLQ2w3Y21WMGRYSnVJRzVoYmw5amIyeHZjanQ5Q25WdWFXWnZjbTBnWm14dllYUWdjMmhwYm1sdVpYTnpPd3BtYkc5aGRDQm5aWFJmYzJocGJtbHVaWE56S0NsN2NtVjBkWEp1SUhOb2FXNXBibVZ6Y3p0OUNuVnVhV1p2Y20wZ2RtVmpNaUIwWlhoMGRYSmxZMjl2Y21ScGJtRjBaWE03Q25abFl6SWdaMlYwWDNSbGVIUjFjbVZqYjI5eVpHbHVZWFJsY3lncGUzSmxkSFZ5YmlCMFpYaDBkWEpsWTI5dmNtUnBibUYwWlhNN2ZRcDFibWxtYjNKdElHWnNiMkYwSUdSbGNIUm9YM05vYVdaME93cG1iRzloZENCblpYUmZaR1Z3ZEdoZmMyaHBablFvS1h0eVpYUjFjbTRnWkdWd2RHaGZjMmhwWm5RN2ZRcDFibWxtYjNKdElIWmxZelFnYkc5M1kyeHBjRjlqYjJ4dmNqc0tkbVZqTkNCblpYUmZiRzkzWTJ4cGNGOWpiMnh2Y2lncGUzSmxkSFZ5YmlCc2IzZGpiR2x3WDJOdmJHOXlPMzBLZFc1cFptOXliU0J0WVhReklIZHZjbXhrWDI1dmNtMWhiRzFoZEhKcGVEc0tiV0YwTXlCblpYUmZkMjl5YkdSZmJtOXliV0ZzYldGMGNtbDRLQ2w3Y21WMGRYSnVJSGR2Y214a1gyNXZjbTFoYkcxaGRISnBlRHQ5Q25WdWFXWnZjbTBnZG1Wak5DQjFibWxtYjNKdFgyTnZiRzl5T3dwMlpXTTBJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXlLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnYUdsbmFHTnNhWEJmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMmhwWjJoamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHaHBaMmhqYkdsd1gyTnZiRzl5TzMwS2RXNXBabTl5YlNCaWIyOXNJSE5vWVdScGJtYzdDbUp2YjJ3Z1oyVjBYM05vWVdScGJtY29LWHR5WlhSMWNtNGdjMmhoWkdsdVp6dDlDblZ1YVdadmNtMGdkbVZqTXlCa2FXWm1kWE5sT3dwMlpXTXpJR2RsZEY5a2FXWm1kWE5sS0NsN2NtVjBkWEp1SUdScFptWjFjMlU3ZlFwMWJtbG1iM0p0SUcxaGRETWdkMmRzWDNWMlgzUnlZVzV6Wm05eWJUc0tiV0YwTXlCblpYUmZkMmRzWDNWMlgzUnlZVzV6Wm05eWJTZ3BlM0psZEhWeWJpQjNaMnhmZFhaZmRISmhibk5tYjNKdE8zMEtDbkJ5WldOcGMybHZiaUJvYVdkb2NDQm1iRzloZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tDbWx1SUhabFl6SWdabkpoWjE5MWRqc0thVzRnZG1Wak5DQm1jbUZuWDJOdmJHOXlPd29LYVc0Z2RtVmpNeUJ2WDI1dmNtMWhiRHNLYVc0Z2RtVmpNeUJ2WDJOaGJXUnBjanNLYVc0Z1pteHZZWFFnYjE5amJHbHdYMlJwYzNSaGJtTmxXemhkT3dwbWJHRjBJR2x1SUhWcGJuUWdabkpoWjE5cGJuTjBZVzVqWlY5cFpEc0tDblZ1YVdadmNtMGdhVzUwSUhWdWFXWnZjbTFmYm5WdFgyTnNhWEJmY0d4aGJtVnpPd3AxYm1sbWIzSnRJSFpsWXpNZ2JHbG5hSFJmWTI5c2IzSTdDblZ1YVdadmNtMGdkbVZqTXlCaGJXSnBaVzUwT3dwMWJtbG1iM0p0SUhabFl6TWdiR2xuYUhSZlpHbHlaV04wYVc5dU93b0tMeThnVTIxdmIzUm9aWE1nYjNWMElHVmtaMlVnWVhKdmRXNWtJREFnYkdsbmFIUWdhVzUwWlc1emFYUjVMQ0J6WldVZ1IweE5ZV3RwWlFwbWJHOWhkQ0J6Ylc5dmRHaGZlbVZ5YjE5dFlYZ29abXh2WVhRZ2VDa2dld29nSUNBZ1kyOXVjM1FnWm14dllYUWdZeUE5SURBdU1EQXpPVEEyTWpVc0lIaHpkMkZ3SUQwZ01DNDJOREEyTnpBM01USXdNVFV5TnpVNUxDQjVjM2RoY0NBOUlEQXVNakExTURnek9ETTVNREF4T1RBNU5UVTdDaUFnSUNCamIyNXpkQ0JtYkc5aGRDQnphR2xtZENBOUlERXVNQ0FySUhoemQyRndJQzBnZVhOM1lYQTdDaUFnSUNCbWJHOWhkQ0J3YjNjNElEMGdlQ0FySUhOb2FXWjBPd29nSUNBZ2NHOTNPQ0E5SUhCdmR6Z2dLaUJ3YjNjNE95QndiM2M0SUQwZ2NHOTNPQ0FxSUhCdmR6ZzdJSEJ2ZHpnZ1BTQndiM2M0SUNvZ2NHOTNPRHNLSUNBZ0lISmxkSFZ5YmlCNElEd2dlWE4zWVhBZ1B5QmpJQ29nY0c5M09DQTZJSGc3Q24wS0NuWmxZek1nWW14cGJtNXdhRzl1WnloMlpXTXpJRTRzSUhabFl6TWdWaXdnZG1Wak15Qk1MQ0IyWldNeklHTnZiRzl5S1hzS0lDQWdJR1pzYjJGMElHSmhZMnRzYVdkb2RDQTlJR2RsZEY5aVlXTnJiR2xuYUhRb0tUc0tJQ0FnSUdac2IyRjBJR1JwWm1aZlkyOWxabVlnUFNCemJXOXZkR2hmZW1WeWIxOXRZWGdvWkc5MEtFd3NJQzFPS1NrZ0t3b2dJQ0FnSUNBZ0lHSmhZMnRzYVdkb2RDQXFJSE50YjI5MGFGOTZaWEp2WDIxaGVDaGtiM1FvVEN3Z1Rpa3BPd29LSUNBZ0lDOHZJSE53WldOMWJHRnlJR052WldabWFXTnBaVzUwQ2lBZ0lDQjJaV016SUVnZ1BTQnViM0p0WVd4cGVtVW9UQ0FySUZZcE93b0tJQ0FnSUdac2IyRjBJSE53WldOZlkyOWxabVlnUFNCd2IzY29iV0Y0S0dSdmRDaElMQ0F0VGlrc0lEQXVNQ2tzSUdkbGRGOXphR2x1YVc1bGMzTW9LU2tnS3dvZ0lDQWdJQ0FnSUdKaFkydHNhV2RvZENBcUlIQnZkeWh0WVhnb1pHOTBLRWdzSUU0cExDQXdMakFwTENCblpYUmZjMmhwYm1sdVpYTnpLQ2twT3dvZ0lDQWdhV1lnS0dScFptWmZZMjlsWm1ZZ1BEMGdNQzR3S1FvZ0lDQWdJQ0FnSUhOd1pXTmZZMjlsWm1ZZ1BTQXdMakE3Q2dvZ0lDQWdMeThnWm1sdVlXd2diR2xuYUhScGJtY2diVzlrWld3S0lDQWdJSEpsZEhWeWJpQnNhV2RvZEY5amIyeHZjaUFxSUhabFl6TW9DaUFnSUNBZ0lDQWdaMlYwWDJScFptWjFjMlVvS1NBcUlHUnBabVpmWTI5bFptWWdLaUJqYjJ4dmNpQXJDaUFnSUNBZ0lDQWdaMlYwWDNOd1pXTjFiR0Z5S0NrZ0tpQnpjR1ZqWDJOdlpXWm1DaUFnSUNBcE93cDlDZ3AyWldNMElHZGxkRjlqYjJ4dmNpaDJaV016SUdOdmJHOXlMQ0IyWldNeUlIVjJMQ0JpYjI5c0lHTnZiRzl5Y21GdVoyVXNJR0p2YjJ3Z1kyOXNiM0p0WVhBcGV3b2dJQ0FnY21WMGRYSnVJSFpsWXpRb1kyOXNiM0lzSURFdU1DazdDbjBLQ25abFl6UWdaMlYwWDJOdmJHOXlLSFpsWXpRZ1kyOXNiM0lzSUhabFl6SWdkWFlzSUdKdmIyd2dZMjlzYjNKeVlXNW5aU3dnWW05dmJDQmpiMnh2Y20xaGNDbDdDaUFnSUNCeVpYUjFjbTRnWTI5c2IzSTdDbjBLQ25abFl6UWdaMlYwWDJOdmJHOXlLR0p2YjJ3Z1kyOXNiM0lzSUhabFl6SWdkWFlzSUdKdmIyd2dZMjlzYjNKeVlXNW5aU3dnWW05dmJDQmpiMnh2Y20xaGNDbDdDaUFnSUNCeVpYUjFjbTRnWm5KaFoxOWpiMnh2Y2pzZ0lDOHZJR052Ykc5eUlHNXZkQ0JwYmlCMWJtbG1iM0p0Q24wS0NuWmxZeklnWVhCd2JIbGZkWFpmZEhKaGJuTm1iM0p0S0cxaGRETWdkSEpoYm5ObWIzSnRMQ0IyWldNeUlIVjJLWHNnY21WMGRYSnVJQ2gwY21GdWMyWnZjbTBnS2lCMlpXTXpLSFYyTENBeEtTa3VlSGs3SUgwS2RtVmpNaUJoY0hCc2VWOTFkbDkwY21GdWMyWnZjbTBvYzJGdGNHeGxjakpFSUhSeVlXNXpabTl5YlhNc0lIWmxZeklnZFhZcGV3b2dJQ0FnTHk4Z1kyRnVKM1FnYUdGMlpTQnRZWFJ5YVdObGN5QnBiaUJoSUhSbGVIUjFjbVVnYzI4Z2QyVWdhR0YyWlNBemVDQjJaV015SUdsdWMzUmxZV1FLSUNBZ0lHMWhkRE1nZEhKaGJuTm1iM0p0T3dvZ0lDQWdkSEpoYm5ObWIzSnRXekJkSUQwZ2RtVmpNeWgwWlhobGJFWmxkR05vS0hSeVlXNXpabTl5YlhNc0lHbDJaV015S0RNZ0tpQnBiblFvWm5KaFoxOXBibk4wWVc1alpWOXBaQ2tnS3lBd0xDQXdLU3dnTUNrdWVIa3NJREFwT3dvZ0lDQWdkSEpoYm5ObWIzSnRXekZkSUQwZ2RtVmpNeWgwWlhobGJFWmxkR05vS0hSeVlXNXpabTl5YlhNc0lHbDJaV015S0RNZ0tpQnBiblFvWm5KaFoxOXBibk4wWVc1alpWOXBaQ2tnS3lBeExDQXdLU3dnTUNrdWVIa3NJREFwT3dvZ0lDQWdkSEpoYm5ObWIzSnRXekpkSUQwZ2RtVmpNeWgwWlhobGJFWmxkR05vS0hSeVlXNXpabTl5YlhNc0lHbDJaV015S0RNZ0tpQnBiblFvWm5KaFoxOXBibk4wWVc1alpWOXBaQ2tnS3lBeUxDQXdLU3dnTUNrdWVIa3NJREFwT3dvZ0lDQWdjbVYwZFhKdUlDaDBjbUZ1YzJadmNtMGdLaUIyWldNektIVjJMQ0F4S1NrdWVIazdDbjBLQ25abFl6UWdaMlYwWDJOdmJHOXlLSE5oYlhCc1pYSXlSQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpd2dZbTl2YkNCamIyeHZjbkpoYm1kbExDQmliMjlzSUdOdmJHOXliV0Z3S1hzS0lDQWdJR2xtSUNoblpYUmZjR0YwZEdWeWJpZ3BLU0I3Q2lBZ0lDQWdJQ0FnZG1Wak1pQndiM01nUFNCaGNIQnNlVjkxZGw5MGNtRnVjMlp2Y20wb2QyZHNYM1YyWDNSeVlXNXpabTl5YlN3Z1oyeGZSbkpoWjBOdmIzSmtMbmg1S1RzS0lDQWdJQ0FnSUNBdkx5QjJaV015SUhCdmN5QTlJSFpsWXpJb1oyeGZSbkpoWjBOdmIzSmtMbmg1S1NBdklIWmxZeklvZEdWNGRIVnlaVk5wZW1Vb1kyOXNiM0lzSURBcEtUc0tJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHVjRkSFZ5WlNoamIyeHZjaXdnY0c5ektUc0tJQ0FnSUgwZ1pXeHpaU0I3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJSFJsZUhSMWNtVW9ZMjlzYjNJc0lIVjJLVHNLSUNBZ0lIMEtmUW9LZG1Wak5DQm5aWFJmWTI5c2IzSmZabkp2YlY5amJXRndLR1pzYjJGMElIWmhiSFZsTENCellXMXdiR1Z5TWtRZ1kyOXNiM0pmYldGd0xDQjJaV015SUdOdmJHOXljbUZ1WjJVcElIc0tJQ0FnSUdac2IyRjBJR050YVc0Z1BTQmpiMnh2Y25KaGJtZGxMbmc3Q2lBZ0lDQm1iRzloZENCamJXRjRJRDBnWTI5c2IzSnlZVzVuWlM1NU93b2dJQ0FnYVdZZ0tIWmhiSFZsSUR3OUlHTnRZWGdnSmlZZ2RtRnNkV1VnUGowZ1kyMXBiaWtnZXdvZ0lDQWdJQ0FnSUM4dklHbHVJSFpoYkhWbElISmhibWRsTENCamIyNTBhVzUxWlNFS0lDQWdJSDBnWld4elpTQnBaaUFvZG1Gc2RXVWdQQ0JqYldsdUtTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlHZGxkRjlzYjNkamJHbHdYMk52Ykc5eUtDazdDaUFnSUNCOUlHVnNjMlVnYVdZZ0tIWmhiSFZsSUQ0Z1kyMWhlQ2tnZXdvZ0lDQWdJQ0FnSUhKbGRIVnliaUJuWlhSZmFHbG5hR05zYVhCZlkyOXNiM0lvS1RzS0lDQWdJSDBnWld4elpTQjdDaUFnSUNBZ0lDQWdMeThnYVhOdVlXNGdhWE1nWW5KdmEyVnVJQ2h2WmlCamIzVnljMlVwSUMwdUxRb2dJQ0FnSUNBZ0lDOHZJSE52SUdsbUlHOTFkSE5wWkdVZ2RtRnNkV1VnY21GdVoyVWdZVzVrSUc1dmRDQnpiV0ZzYkdWeUwySnBaMmRsY2lCdGFXNHZiV0Y0SUhkbElHRnpjM1Z0WlNCT1lVNEtJQ0FnSUNBZ0lDQnlaWFIxY200Z1oyVjBYMjVoYmw5amIyeHZjaWdwT3dvZ0lDQWdmUW9nSUNBZ1pteHZZWFFnYVRBeElEMGdZMnhoYlhBb0tIWmhiSFZsSUMwZ1kyMXBiaWtnTHlBb1kyMWhlQ0F0SUdOdGFXNHBMQ0F3TGpBc0lERXVNQ2s3Q2lBZ0lDQXZMeUF4THpBZ1kyOXljbVZ6Y0c5dVpITWdkRzhnZEdobElHTnZjbTVsY2lCdlppQjBhR1VnWTI5c2IzSnRZWEFzSUhOdklIUnZJSEJ5YjNCbGNteDVJR2x1ZEdWeWNHOXNZWFJsQ2lBZ0lDQXZMeUJpWlhSM1pXVnVJSFJvWlNCamIyeHZjbk1zSUhkbElHNWxaV1FnZEc4Z2MyTmhiR1VnYVhRc0lITnZJSFJvWVhRZ2RHaGxJR1Z1WkhNZ1lYSmxJR0YwSURFZ0xTQW9jM1JsY0hOcGVtVXZNaWtnWVc1a0lEQXJLSE4wWlhCemFYcGxMeklwTGdvZ0lDQWdabXh2WVhRZ2MzUmxjSE5wZW1VZ1BTQXhMakFnTHlCbWJHOWhkQ2gwWlhoMGRYSmxVMmw2WlNoamIyeHZjbDl0WVhBc0lEQXBLVHNLSUNBZ0lHa3dNU0E5SUNneExqQWdMU0J6ZEdWd2MybDZaU2tnS2lCcE1ERWdLeUF3TGpVZ0tpQnpkR1Z3YzJsNlpUc0tJQ0FnSUhKbGRIVnliaUIwWlhoMGRYSmxLR052Ykc5eVgyMWhjQ3dnZG1Wak1paHBNREVzSURBdU1Da3BPd3A5Q2dwMlpXTTBJR2RsZEY5amIyeHZjaWhpYjI5c0lHTnZiRzl5TENCMlpXTXlJSFYyTENCMlpXTXlJR052Ykc5eWNtRnVaMlVzSUhOaGJYQnNaWEl5UkNCamIyeHZjbTFoY0NsN0NpQWdJQ0JwWmlBb1oyVjBYMmx1ZEdWeWNHOXNZWFJsWDJsdVgyWnlZV2R0Wlc1MFgzTm9ZV1JsY2lncEtTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlHZGxkRjlqYjJ4dmNsOW1jbTl0WDJOdFlYQW9abkpoWjE5amIyeHZjaTU0TENCamIyeHZjbTFoY0N3Z1kyOXNiM0p5WVc1blpTazdDaUFnSUNCOUlHVnNjMlVnZXdvZ0lDQWdJQ0FnSUhKbGRIVnliaUJtY21GblgyTnZiRzl5T3dvZ0lDQWdmUXA5Q25abFl6UWdaMlYwWDJOdmJHOXlLR1pzYjJGMElIWmhiSFZsTENCMlpXTXlJSFYyTENCMlpXTXlJR052Ykc5eWNtRnVaMlVzSUhOaGJYQnNaWEl5UkNCamIyeHZjbTFoY0NrZ2V3b2dJQ0FnY21WMGRYSnVJR2RsZEY5amIyeHZjbDltY205dFgyTnRZWEFvZG1Gc2RXVXNJR052Ykc5eWJXRndMQ0JqYjJ4dmNuSmhibWRsS1RzS2ZRcDJaV00wSUdkbGRGOWpiMnh2Y2loellXMXdiR1Z5TWtRZ2RtRnNkV1Z6TENCMlpXTXlJSFYyTENCMlpXTXlJR052Ykc5eWNtRnVaMlVzSUhOaGJYQnNaWEl5UkNCamIyeHZjbTFoY0NsN0NpQWdJQ0JtYkc5aGRDQjJZV3gxWlNBOUlIUmxlSFIxY21Vb2RtRnNkV1Z6TENCMWRpa3VlRHNLSUNBZ0lISmxkSFZ5YmlCblpYUmZZMjlzYjNKZlpuSnZiVjlqYldGd0tIWmhiSFZsTENCamIyeHZjbTFoY0N3Z1kyOXNiM0p5WVc1blpTazdDbjBLQ25abFl6UWdaMlYwWDJOdmJHOXlLSE5oYlhCc1pYSXlSQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpd2dZbTl2YkNCamIyeHZjbkpoYm1kbExDQnpZVzF3YkdWeU1rUWdZMjlzYjNKdFlYQXBld29nSUNBZ2NtVjBkWEp1SUhSbGVIUjFjbVVvWTI5c2IzSXNJSFYyS1RzS2ZRb0tkbVZqTWlCbGJtTnZaR1ZmZFdsdWRGOTBiMTltYkc5aGRDaDFhVzUwSUhaaGJIVmxLU0I3Q2lBZ0lDQm1iRzloZENCc2IzZGxjaUE5SUdac2IyRjBLSFpoYkhWbElDWWdNSGhHUmtaR2RTa2dMeUEyTlRVek5TNHdPd29nSUNBZ1pteHZZWFFnZFhCd1pYSWdQU0JtYkc5aGRDaDJZV3gxWlNBK1BpQXhOblVwSUM4Z05qVTFNelV1TURzS0lDQWdJSEpsZEhWeWJpQjJaV015S0d4dmQyVnlMQ0IxY0hCbGNpazdDbjBLQ25abFl6UWdjR0ZqYTE5cGJuUW9kV2x1ZENCcFpDd2dkV2x1ZENCcGJtUmxlQ2tnZXdvZ0lDQWdkbVZqTkNCMWJuQmhZMnM3Q2lBZ0lDQjFibkJoWTJzdWNtY2dQU0JsYm1OdlpHVmZkV2x1ZEY5MGIxOW1iRzloZENocFpDazdDaUFnSUNCMWJuQmhZMnN1WW1FZ1BTQmxibU52WkdWZmRXbHVkRjkwYjE5bWJHOWhkQ2hwYm1SbGVDazdDaUFnSUNCeVpYUjFjbTRnZFc1d1lXTnJPd3A5Q2dvdkx5Qm1iM0lnY0dsamEybHVaeUJwYm1ScFkyVnpJR2x1SUdsdFlXZGxMQ0JvWldGMGJXRndMQ0J6ZFhKbVlXTmxDblZwYm5RZ2NHbGphMmx1WjE5cGJtUmxlRjltY205dFgzVjJLSE5oYlhCc1pYSXlSQ0JwYldjc0lIWmxZeklnZFhZcElIc0tJQ0FnSUdsMlpXTXlJSE5wZW1VZ1BTQjBaWGgwZFhKbFUybDZaU2hwYldjc0lEQXBPd29nSUNBZ2FYWmxZeklnYW14ZmFXUjRJRDBnWTJ4aGJYQW9hWFpsWXpJb2RYWWdLaUIyWldNeUtITnBlbVVwS1N3Z2FYWmxZeklvTUNrc0lITnBlbVV0TVNrN0NpQWdJQ0IxYVc1MElHbGtlQ0E5SUhWcGJuUW9hbXhmYVdSNExuZ2dLeUJxYkY5cFpIZ3VlU0FxSUhOcGVtVXVlQ2s3Q2lBZ0lDQnlaWFIxY200Z2FXUjRPd3A5Q2dvdkx5QlVhR1Z6WlNCemFHOTFiR1FnYm05MElHZGxkQ0JvYVhRS2RXbHVkQ0J3YVdOcmFXNW5YMmx1WkdWNFgyWnliMjFmZFhZb1pteHZZWFFnYVcxbkxDQjJaV015SUhWMktTQjdJSEpsZEhWeWJpQm1jbUZuWDJsdWMzUmhibU5sWDJsa095QjlDblZwYm5RZ2NHbGphMmx1WjE5cGJtUmxlRjltY205dFgzVjJLR0p2YjJ3Z2FXMW5MQ0IyWldNeUlIVjJLU0I3Q2lBZ0lDQnlaWFIxY200Z1puSmhaMTlwYm5OMFlXNWpaVjlwWkRzS2ZRcDFhVzUwSUhCcFkydHBibWRmYVc1a1pYaGZabkp2YlY5MWRpaDJaV016SUdsdFp5d2dkbVZqTWlCMWRpa2dleUJ5WlhSMWNtNGdabkpoWjE5cGJuTjBZVzVqWlY5cFpEc2dmUXAxYVc1MElIQnBZMnRwYm1kZmFXNWtaWGhmWm5KdmJWOTFkaWgyWldNMElHbHRaeXdnZG1Wak1pQjFkaWtnZXlCeVpYUjFjbTRnWm5KaFoxOXBibk4wWVc1alpWOXBaRHNnZlFvS2RtOXBaQ0J0WVdsdUtDa0tld29nSUNBZ1ptOXlJQ2hwYm5RZ2FTQTlJREE3SUdrZ1BDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzZ2FTc3JLU0I3Q2lBZ0lDQWdJQ0FnYVdZZ0tHOWZZMnhwY0Y5a2FYTjBZVzVqWlZ0cFhTQThJREF1TUNrZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0JrYVhOallYSmtPd29nSUNBZ0lDQWdJSDBLSUNBZ0lIMEtDaUFnSUNCMlpXTTBJSEpsWVd4ZlkyOXNiM0lnUFNCblpYUmZZMjlzYjNJb2RXNXBabTl5YlY5amIyeHZjaXdnWm5KaFoxOTFkaXdnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpTZ3BMQ0IxYm1sbWIzSnRYMk52Ykc5eWJXRndLVHNLSUNBZ0lIWmxZek1nYzJoaFpHVmtYMk52Ykc5eUlEMGdjbVZoYkY5amIyeHZjaTV5WjJJN0Nnb2dJQ0FnYVdZb1oyVjBYM05vWVdScGJtY29LU2w3Q2lBZ0lDQWdJQ0FnZG1Wak15Qk1JRDBnYkdsbmFIUmZaR2x5WldOMGFXOXVPd29nSUNBZ0lDQWdJSFpsWXpNZ1RpQTlJRzV2Y20xaGJHbDZaU2h2WDI1dmNtMWhiQ2s3Q2lBZ0lDQWdJQ0FnZG1Wak15QnNhV2RvZENBOUlHSnNhVzV1Y0dodmJtY29UaXdnYm05eWJXRnNhWHBsS0c5ZlkyRnRaR2x5S1N3Z1RDd2djbVZoYkY5amIyeHZjaTV5WjJJcE93b2dJQ0FnSUNBZ0lITm9ZV1JsWkY5amIyeHZjaUE5SUdGdFltbGxiblFnS2lCeVpXRnNYMk52Ykc5eUxuSm5ZaUFySUd4cFoyaDBPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaHdhV05yYVc1bklDWW1JQ2h5WldGc1gyTnZiRzl5TG1FZ1BpQXdMakVwS1NCN0NpQWdJQ0FnSUNBZ2FXWWdLRkJKUTB0SlRrZGZTVTVFUlZoZlJsSlBUVjlWVmlrZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0JtY21GbmJXVnVkRjlqYjJ4dmNpQTlJSEJoWTJ0ZmFXNTBLRzlpYW1WamRGOXBaQ3dnY0dsamEybHVaMTlwYm1SbGVGOW1jbTl0WDNWMktIVnVhV1p2Y20xZlkyOXNiM0lzSUdaeVlXZGZkWFlwS1RzS0lDQWdJQ0FnSUNCOUlHVnNjMlVnZXdvZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRGOWpiMnh2Y2lBOUlIQmhZMnRmYVc1MEtHOWlhbVZqZEY5cFpDd2dabkpoWjE5cGJuTjBZVzVqWlY5cFpDazdDaUFnSUNBZ0lDQWdmUW9nSUNBZ0lDQWdJSEpsZEhWeWJqc0tJQ0FnSUgwS0NpQWdJQ0JwWmlBb2NtVmhiRjlqYjJ4dmNpNWhJRHc5SURBdU1DbDdDaUFnSUNBZ0lDQWdaR2x6WTJGeVpEc0tJQ0FnSUgwS0lDQWdJR1p5WVdkdFpXNTBYMk52Ykc5eUlEMGdkbVZqTkNoemFHRmtaV1JmWTI5c2IzSXNJSEpsWVd4ZlkyOXNiM0l1WVNrN0NuMEtxWEJzYjNSZmRIbHdaYVJOWlhOb3AzVndaR0YwWlhMSEJXaWtNVFUxTUl5c2RISmhibk53WVhKbGJtTjV3cVo2ZG1Gc2RXWEt3c2dBQUtSdVlXMWx1R3hwYm1WekxUY3hOemsyTkRRMU1qSXpORGsyTkRJNE1LbGpZVzFmYzNCaFkyV2taR0YwWWFoMWJtbG1iM0p0Yzk0QUVxdHRhWFJsY2w5c2FXMXBkTXEvQUFBQXNuVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpjS3BibUZ1WDJOdmJHOXkyQmNBQUFBQUFBQUFBQUFBQUFBQUFBQUFxbTF2WkdWc1gyWXpNbVBIUUJjQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUF5TUlBQUlBL3RuVnVhV1p2Y20xZmNHRjBkR1Z5Ymw5c1pXNW5kR2pLUDRBQUFLeHpZMlZ1WlY5dmNtbG5hVzdYRndBQUFBQUFBQUFBcld4dmQyTnNhWEJmWTI5c2IzTFlGOEMwaUQ0VHRwODdGYW1vUGdBQWdEK3dkVzVwWm05eWJWOWpiMnh2Y20xaGNNS25jR2xqYTJsdVo4S3hkVzVwWm05eWJWOXNhVzVsZDJsa2RHaktBQUFBQUxkMWJtbG1iM0p0WDI1MWJWOWpiR2x3WDNCc1lXNWxjd0NuYkdsdVpXTmhjQUNxYkdsdVpWOWpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUt0a1pYQjBhRjl6YUdsbWRNcTNKOFdzcVdwdmFXNXpkSGxzWlFDdmRXNXBabTl5YlY5d1lYUjBaWEp1d3JOMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weng0QVhBQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczZ1YUdsbmFHTnNhWEJmWTI5c2IzTFlGNEJGZmovbytXYy85V01UUGdBQWdEK25kbWx6YVdKc1pjT29iM1psY21SeVlYZkNxMmx6WDNObFoyMWxiblJ6d3FwaGRIUnlhV0oxZEdWemdicHdiM05wZEdsdmJuTmZkSEpoYm5ObWIzSnRaV1JmWmpNeVk0S3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhLQmNBQUpSQ0FBQnNRZ0FBSzBRQUFHeENBQUFyUkFBQXAwTUFBSlJDQUFDblF3QUFsRUlBQUd4Q3BIVjFhV1N5TnpFM09UWTBORFV5TWpNME9UWTBNamd3cVhCc2IzUmZkSGx3WmFWTWFXNWxjNmQxY0dSaGRHVnl4d1ZvcERFMU5UR01ySFJ5WVc1emNHRnlaVzVqZWNLbWVuWmhiSFZseXNFZ0FBQ2tibUZ0WmRraGJHbHVaWE5sWjIxbGJuUnpMVEV4TkRRMU16a3dNVFkzTnpFeU5qTXpNRE00cVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0FRc25WdWFXWnZjbTFmWTI5c2IzSnlZVzVuWmNLcGJtRnVYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUFBQUFBQXFtMXZaR1ZzWDJZek1tUEhRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUlNRUFBSUEvdG5WdWFXWnZjbTFmY0dGMGRHVnlibDlzWlc1bmRHaktQNEFBQUt4elkyVnVaVjl2Y21sbmFXN1hGd0FBQUFBQUFBQUFyV3h2ZDJOc2FYQmZZMjlzYjNMWUY4QzBpRDRUdHA4N0ZhbW9QZ0FBZ0Qrd2RXNXBabTl5YlY5amIyeHZjbTFoY01LbmNHbGphMmx1WjhLeGRXNXBabTl5YlY5c2FXNWxkMmxrZEdqS1A0QUFBTGQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3FiR2x1WlY5amIyeHZjdGdYQUFBQUFBQUFBQUFBQUFBQWo4TDFQYXRrWlhCMGFGOXphR2xtZE1vQUFBQUFyM1Z1YVdadmNtMWZjR0YwZEdWeWJzS3VhR2xuYUdOc2FYQmZZMjlzYjNMWUY0QkZmai9vK1djLzlXTVRQZ0FBZ0QremRXNXBabTl5YlY5amJHbHdYM0JzWVc1bGM4ZUFGd0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPcDNacGMybGliR1hEcUc5MlpYSmtjbUYzd3F0cGMxOXpaV2R0Wlc1MGM4T3FZWFIwY21saWRYUmxjNEc2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweDNBWFhYVExRZ0FBYkVKZGRNdENBQUNuUTJYOFBVTUFBR3hDWmZ3OVF3QUFwME5PSDR0REFBQnNRazRmaTBNQUFLZERha0MzUXdBQWJFSnFRTGREQUFDblE0Vmg0ME1BQUd4Q2hXSGpRd0FBcDBOUXdRZEVBQUJzUWxEQkIwUUFBS2REM3RFZFJBQUFiRUxlMFIxRUFBQ25RNlIxZFdsa3RERXhORFExTXprd01UWTNOekV5TmpNek1ETTRxWEJzYjNSZmRIbHdaYVZNYVc1bGM2ZDFjR1JoZEdWeXh3Vm9wREUxTlRLTXJIUnlZVzV6Y0dGeVpXNWplY0ttZW5aaGJIVmx5c0VnQUFDa2JtRnRaZGtnYkdsdVpYTmxaMjFsYm5SekxUWXhOamd3TXpRNE1EUXpPREkzT1RFek5UU3BZMkZ0WDNOd1lXTmxwR1JoZEdHb2RXNXBabTl5YlhQZUFCQ3lkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWx1WVc1ZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFBQUNxYlc5a1pXeGZaak15WThkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFnd1FBQWdEKzJkVzVwWm05eWJWOXdZWFIwWlhKdVgyeGxibWQwYU1vL2dBQUFySE5qWlc1bFgyOXlhV2RwYnRjWEFBQUFBQUFBQUFDdGJHOTNZMnhwY0Y5amIyeHZjdGdYd0xTSVBoTzJuenNWcWFnK0FBQ0FQN0IxYm1sbWIzSnRYMk52Ykc5eWJXRnd3cWR3YVdOcmFXNW53ckYxYm1sbWIzSnRYMnhwYm1WM2FXUjBhTW8vZ0FBQXQzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtkc2FXNWxZMkZ3QUtwc2FXNWxYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUROekV3OXEyUmxjSFJvWDNOb2FXWjB5Z0FBQUFDdmRXNXBabTl5YlY5d1lYUjBaWEp1d3E1b2FXZG9ZMnhwY0Y5amIyeHZjdGdYZ0VWK1ArajVaei8xWXhNK0FBQ0FQN04xYm1sbWIzSnRYMk5zYVhCZmNHeGhibVZ6eDRBWEFBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNm5kbWx6YVdKc1pjS29iM1psY21SeVlYZkNxMmx6WDNObFoyMWxiblJ6dzZwaGRIUnlhV0oxZEdWemdicHdiM05wZEdsdmJuTmZkSEpoYm5ObWIzSnRaV1JmWmpNeVk0S3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhBQmVrZFhWcFpMTTJNVFk0TURNME9EQTBNemd5TnpreE16VTBxWEJzYjNSZmRIbHdaYVZNYVc1bGM2ZDFjR1JoZEdWeXh3Vm9wREUxTlRPTXJIUnlZVzV6Y0dGeVpXNWplY0ttZW5aaGJIVmx5c0VnQUFDa2JtRnRaZGtoYkdsdVpYTmxaMjFsYm5SekxURXlORGd6T0RRMk5qUTNOek0yTkRNMk56TXdxV05oYlY5emNHRmpaYVJrWVhSaHFIVnVhV1p2Y20xejNnQVFzblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBSU1FQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEt4ZFc1cFptOXliVjlzYVc1bGQybGtkR2pLUDRBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDbmJHbHVaV05oY0FDcWJHbHVaVjlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBajhMMVBhdGtaWEIwYUY5emFHbG1kTW9BQUFBQXIzVnVhV1p2Y20xZmNHRjBkR1Z5YnNLdWFHbG5hR05zYVhCZlkyOXNiM0xZRjRCRmZqL28rV2MvOVdNVFBnQUFnRCt6ZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzhlQUZ3QUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09wM1pwYzJsaWJHWERxRzkyWlhKa2NtRjN3cXRwYzE5elpXZHRaVzUwYzhPcVlYUjBjbWxpZFhSbGM0RzZjRzl6YVhScGIyNXpYM1J5WVc1elptOXliV1ZrWDJZek1tT0NxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4MUFYQUFDVVFvSC9qa0lBQUN0RWdmK09RZ0FBbEVMZy93VkRBQUFyUk9EL0JVTUFBSlJDQUlCRVF3QUFLMFFBZ0VSREFBQ1VRaENBZ1VNQUFDdEVFSUNCUXdBQWxFSWd3S0JEQUFBclJDREFvRU9rZFhWcFpMUXhNalE0TXpnME5qWTBOemN6TmpRek5qY3pNS2x3Ykc5MFgzUjVjR1dsVEdsdVpYT25kWEJrWVhSbGNzY0ZhS1F4TlRVMGpLeDBjbUZ1YzNCaGNtVnVZM25DcG5wMllXeDFaY3JCSUFBQXBHNWhiV1haSUd4cGJtVnpaV2R0Wlc1MGN5MDRPRFkwTnpVeU1qTXpOVGM1TURjd05UYzFxV05oYlY5emNHRmpaYVJrWVhSaHFIVnVhV1p2Y20xejNnQVFzblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBSU1FQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEt4ZFc1cFptOXliVjlzYVc1bGQybGtkR2pLUDRBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDbmJHbHVaV05oY0FDcWJHbHVaVjlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBemN4TVBhdGtaWEIwYUY5emFHbG1kTW9BQUFBQXIzVnVhV1p2Y20xZmNHRjBkR1Z5YnNLdWFHbG5hR05zYVhCZlkyOXNiM0xZRjRCRmZqL28rV2MvOVdNVFBnQUFnRCt6ZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzhlQUZ3QUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09wM1pwYzJsaWJHWENxRzkyWlhKa2NtRjN3cXRwYzE5elpXZHRaVzUwYzhPcVlYUjBjbWxpZFhSbGM0RzZjRzl6YVhScGIyNXpYM1J5WVc1elptOXliV1ZrWDJZek1tT0NxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4d0FYcEhWMWFXU3pPRGcyTkRjMU1qSXpNelUzT1RBM01EVTNOYWx3Ykc5MFgzUjVjR1dsVEdsdVpYT25kWEJrWVhSbGNzY0ZhS1F4TlRVMWpLeDBjbUZ1YzNCaGNtVnVZM25DcG5wMllXeDFaY3BCSUFBQXBHNWhiV1haSUd4cGJtVnpaV2R0Wlc1MGN5MDJORE0xTURVek1EZzROemMyTkRJek16UXdxV05oYlY5emNHRmpaYVJrWVhSaHFIVnVhV1p2Y20xejNnQVFzblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBSUVFQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEt4ZFc1cFptOXliVjlzYVc1bGQybGtkR2pLUDRBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDbmJHbHVaV05oY0FDcWJHbHVaVjlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFDQVA2dGtaWEIwYUY5emFHbG1kTW9BQUFBQXIzVnVhV1p2Y20xZmNHRjBkR1Z5YnNLdWFHbG5hR05zYVhCZlkyOXNiM0xZRjRCRmZqL28rV2MvOVdNVFBnQUFnRCt6ZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzhlQUZ3QUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09wM1pwYzJsaWJHWERxRzkyWlhKa2NtRjN3cXRwYzE5elpXZHRaVzUwYzhPcVlYUjBjbWxpZFhSbGM0RzZjRzl6YVhScGIyNXpYM1J5WVc1elptOXliV1ZrWDJZek1tT0NxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4M0FYWFhUTFFnQUFha0pkZE10Q0FBQldRbVg4UFVNQUFHcENaZnc5UXdBQVZrSk9INHREQUFCcVFrNGZpME1BQUZaQ2FrQzNRd0FBYWtKcVFMZERBQUJXUW9WaDQwTUFBR3BDaFdIalF3QUFWa0pRd1FkRUFBQnFRbERCQjBRQUFGWkMzdEVkUkFBQWFrTGUwUjFFQUFCV1FxUjFkV2xrc3pZME16VXdOVE13T0RnM056WTBNak16TkRDcGNHeHZkRjkwZVhCbHBVeHBibVZ6cDNWd1pHRjBaWExIQldpa01UVTFOb3lzZEhKaGJuTndZWEpsYm1ONXdxWjZkbUZzZFdYS1FTQUFBS1J1WVcxbDJTQnNhVzVsYzJWbmJXVnVkSE10TXpZMk1qZ3hNVEExTVRrME1UVTVOalV3TmFsallXMWZjM0JoWTJXa1pHRjBZYWgxYm1sbWIzSnRjOTRBRUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXNWhibDlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFLcHRiMlJsYkY5bU16Smp4MEFYQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFDQkJBQUNBUDdaMWJtbG1iM0p0WDNCaGRIUmxjbTVmYkdWdVozUm95aitBQUFDc2MyTmxibVZmYjNKcFoybHUxeGNBQUFBQUFBQUFBSzFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3NIVnVhV1p2Y20xZlkyOXNiM0p0WVhEQ3AzQnBZMnRwYm1mQ3NYVnVhV1p2Y20xZmJHbHVaWGRwWkhSb3lqK0FBQUMzZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFwMnhwYm1WallYQUFxbXhwYm1WZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFnRCtyWkdWd2RHaGZjMmhwWm5US0FBQUFBSzkxYm1sbWIzSnRYM0JoZEhSbGNtN0NybWhwWjJoamJHbHdYMk52Ykc5eTJCZUFSWDQvNlBsblAvVmpFejRBQUlBL3MzVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYUEhnQmNBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1enFkMmFYTnBZbXhsd3FodmRtVnlaSEpoZDhLcmFYTmZjMlZuYldWdWRIUERxbUYwZEhKcFluVjBaWE9CdW5CdmMybDBhVzl1YzE5MGNtRnVjMlp2Y20xbFpGOW1NekpqZ3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE1jQUY2UjFkV2xrc3pNMk5qSTRNVEV3TlRFNU5ERTFPVFkxTURXcGNHeHZkRjkwZVhCbHBVeHBibVZ6cDNWd1pHRjBaWExIQldpa01UVTFOOTRBRXF4MGNtRnVjM0JoY21WdVkzbkNwWE53WVdObHBHUmhkR0dzZG1WeWRHVjRZWEp5WVhsemdxSjFkb0tyZEhsd1pWOXNaVzVuZEdnQ3BHWnNZWFRISUJjQUFBQUFBQUNBUHdBQWdEOEFBSUEvQUFDQVB3QUFBQUFBQUFBQUFBQUFBS2h3YjNOcGRHbHZib0tyZEhsd1pWOXNaVzVuZEdnQ3BHWnNZWFRISUJjQUFBQy9BQUFBdndBQUFEOEFBQUMvQUFBQVB3QUFBRDhBQUFDL0FBQUFQNlo2ZG1Gc2RXWEtBQUFBQUtSdVlXMWx1WFJsZUhRdE1USTBNekUzTmpNMU9EWTJNamcxTlRBNU56ZXBZMkZ0WDNOd1lXTmxwR1JoZEdHb2RXNXBabTl5YlhQZUFCbXJjSGhmY0dWeVgzVnVhWFRLQUFBQUFLbG5iRzkzWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ3lkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWxpYVd4c1ltOWhjbVRDclhCeVpYQnliMnBsWTNScGIyN0hRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvcVc1aGJsOWpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUsxa2FYTjBZVzVqWldacFpXeGtpcWx0YVc1R2FXeDBaWEtzVEdsdVpXRnlSbWxzZEdWeXFtRnVhWE52ZEhKdmNIbktRWUFBQUtsdFlXZEdhV3gwWlhLc1RHbHVaV0Z5Um1sc2RHVnlwWGR5WVhCVHJsSmxjR1ZoZEZkeVlYQndhVzVucEdSaGRHR3RkR1Y0ZEhWeVpWOWhkR3hoYzZ4MGFISmxaVjltYjNKdFlYU3BVbVZrUm05eWJXRjBwSE5wZW1XU3pRZ0F6UWdBcFhkeVlYQlVybEpsY0dWaGRGZHlZWEJ3YVc1bnBIUjVjR1duVTJGdGNHeGxjcXAwYUhKbFpWOTBlWEJscVVac2IyRjBWSGx3WmFwdGIyUmxiRjltTXpKangwQVhBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQN0poZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVhLUlFBQUFMQnpaR1pmYldGeWEyVnlYM05vWVhCbEE2ZHdZWFIwWlhKdXdxdHpkSEp2YTJWM2FXUjBhTW9BQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtwWjJ4dmQzZHBaSFJveWdBQUFBQ25jR2xqYTJsdVo4S3FjbVZ6YjJ4MWRHbHZidGNYQUFBQUFBQUFBQUMzZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFxVzlpYW1WamRGOXBaQUN0ZFc1cFptOXliVjlqYjJ4dmNzS3dkSEpoYm5ObWIzSnRYMjFoY210bGNzS3JaR1Z3ZEdoZmMyaHBablRLQUFBQUFLcG1NekpqWDNOallXeGx4d3dYQUFDQVB3QUFnRDhBQUlBL3JtaHBaMmhqYkdsd1gyTnZiRzl5MkJlQVJYNC82UGxuUC9WakV6NEFBSUEvczNWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhQSGdCY0FBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6cWQyYVhOcFlteGx3NnR0WVhKclpYSnpjR0ZqWmFSa1lYUmhxRzkyWlhKa2NtRjN3cXBuYkhsd2FGOWtZWFJoZzZ4bmJIbHdhRjlvWVhOb1pYUFdGanpkb3VPbWMyTmhiR1Z6MXhjQUFHQkJBQUJnUWExaGRHeGhjMTkxY0dSaGRHVnpnYW96T0RFNU1UQXhOVEF3bE5nWEFDQzRQZ0NBM0QwQVlNVStBTUFLUHNndy8yT1MxeFkyQUFBQU9nQUFBTWd3OEJjQTRJZEJBQ0NDUVFCZ2VVRUE0RzVCQUVCbFFRQkFYRUVBQUZSQkFNQk1RUUNBUmtFQWdFRkJBS0E5UVFBQU8wRUF3RGxCQUtBNVFRQ2dPVUVBb0RsQkFLQTVRUUNnT1VFQW9EbEJBQ0E2UVFEZ08wRUFBRDlCQUdCRFFRRGdTRUVBZ0U5QkFDQlhRUURBWDBFQTRGMUJBS0JWUVFBZ1RrRUF3RWRCQUdCQ1FRQkFQa0VBWUR0QkFPQTVRUUNnT1VFQW9EbEJBS0E1UVFDZ09VRUFvRGxCQUtBNVFRQWdPa0VBNER0QkFBQS9RUUJnUTBFQTRFaEJBSUJQUVFBZ1YwRUF3RjlCQUFCcFFRQUFjMEVBb0gxQkFHQ0VRUUJBaWtFQWdJSkJBQ0I1UVFDZ2JVRUF3R0pCQUlCWVFRRGdUa0VBSUVaQkFHQStRUUNnTjBFQUlESkJBQUF1UVFBZ0swRUF3Q2xCQUtBcFFRQ2dLVUVBb0NsQkFLQXBRUUNnS1VFQW9DbEJBQ0FxUVFBZ0xFRUFnQzlCQUVBMFFRQkFPa0VBWUVGQkFJQkpRUUNnVWtFQXdGQkJBT0JIUVFEZ1AwRUE0RGhCQUNBelFRQ2dMa0VBb0N0QkFPQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUFvQ2xCQUtBcFFRQWdLa0VBSUN4QkFJQXZRUUJBTkVFQVFEcEJBR0JCUVFDQVNVRUFvRkpCQUlCY1FRQUFaMEVBSUhKQkFPQjlRUUFBaFVFQUFIdEJBSUJ1UVFDQVlrRUFBRmRCQUNCTVFRQUFRa0VBb0RoQkFFQXdRUUFBS1VFQUFDTkJBR0FlUVFCQUcwRUF3QmxCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUNnR1VFQW9CbEJBRUFhUVFCZ0hFRUFJQ0JCQUVBbFFRREFLMEVBZ0ROQkFFQThRUUFBUmtFQUFFUkJBSUE2UVFEZ01VRUFZQ3BCQUNBa1FRQkFIMEVBd0J0QkFBQWFRUUNnR1VFQW9CbEJBS0FaUVFDZ0dVRUFvQmxCQUtBWlFRQkFHa0VBWUJ4QkFDQWdRUUJBSlVFQXdDdEJBSUF6UVFCQVBFRUFBRVpCQUdCUVFRQ0FXMEVBUUdkQkFHQnpRUUFBZ0VFQWdIRkJBSUJrUVFBQVdFRUE0RXRCQUdCQVFRQ2dOVUVBb0N0QkFJQWlRUUNnR2tFQUFCUkJBT0FPUVFDQUMwRUE0QWxCQUtBSlFRQ2dDVUVBb0FsQkFLQUpRUUNnQ1VFQW9BbEJBRUFLUVFDZ0RFRUF3QkJCQUlBV1FRQ2dIVUVBQUNaQkFJQXZRUURnT1VFQW9EZEJBSUF0UVFCQUpFRUFJQnhCQUVBVlFRRGdEMEVBQUF4QkFBQUtRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFvQWxCQUtBSlFRQkFDa0VBb0F4QkFNQVFRUUNBRmtFQW9CMUJBQUFtUVFDQUwwRUE0RGxCQU9CRVFRQ2dVRUVBQUYxQkFLQnBRUURBZGtFQXdHaEJBRUJiUVFBZ1RrRUFnRUZCQUVBMVFRREFLVUVBQUI5QkFFQVZRUUNnREVFQVFBVkJBRUQvUUFDQTkwQUF3UE5BQUVEelFBQkE4MEFBUVBOQUFFRHpRQUJBODBBQVFQTkFBTUQwUUFBZytrQUFvQUZCQUFBSVFRRGdEMEVBQUJsQkFFQWpRUUJBTGtFQUFDeEJBQ0FoUVFBZ0YwRUFRQTVCQUtBR1FRQ2dBRUVBd1BoQUFDRDBRQUJBODBBQVFQTkFBRUR6UUFCQTgwQUFRUE5BQUVEelFBREE5RUFBSVBwQUFLQUJRUUFBQ0VFQTRBOUJBQUFaUVFCQUkwRUFRQzVCQUNBNlFRQ0FSa0VBWUZOQkFLQmdRUUJBYmtFQXdHQkJBTUJTUVFBZ1JVRUE0RGRCQUFBclFRREFIa0VBSUJOQkFJQUlRUUFBL2tBQXdPMUFBT0RnUUFBZzJFQUF3Tk5BQUVEVFFBQkEwMEFBUU5OQUFFRFRRQUJBMDBBQVFOTkFBQURWUUFBZzIwQUFvT1ZBQU9EelFBQ2dBa0VBb0F4QkFLQVhRUUFnSTBFQXdDQkJBR0FWUVFDZ0NrRUF3QUJCQU1Ed1FBQWc0MEFBZ05sQUFFRFVRQUJBMDBBQVFOTkFBRURUUUFCQTAwQUFRTk5BQUVEVFFBQUExVUFBSU50QUFLRGxRQURnODBBQW9BSkJBS0FNUVFEQUYwRUFnQ05CQUFBd1FRQWdQVUVBb0VwQkFHQllRUUNBWmtFQXdGbEJBRUJMUVFBQVBVRUFJQzlCQUtBaFFRQ0FGRUVBSUFoQkFDRDVRQUFnNUVBQTRORkFBQ0REUUFEZ3VFQUE0TE5BQUVDelFBQkFzMEFBUUxOQUFFQ3pRQUJBczBBQVFMTkFBRUMxUUFDQXZFQUFnTWhBQU1EWVFBQkE3RUFBQUFGQkFLQU1RUURnR0VFQUFCWkJBQ0FLUVFDQS9VQUFJT2hBQUVEVlFBREF4VUFBb0xwQUFJQzBRQUJBczBBQVFMTkFBRUN6UUFCQXMwQUFRTE5BQUVDelFBQkF0VUFBZ0x4QUFJRElRQURBMkVBQVFPeEFBQ0FCUVFBQURVRUF3QmxCQUFBblFRQ2dORUVBd0VKQkFBQlJRUUNnWDBFQW9GTkJBTUJFUVFBQU5rRUFnQ2RCQUVBWlFRQ0FDMEVBWVB4QUFDRGpRQURneTBBQVFMZEFBRUNtUUFBZ21rQUFBSlJBQUVDVFFBQkFrMEFBUUpOQUFFQ1RRQUJBazBBQVFKTkFBS0NWUUFCZ25rQUFvS3hBQUNDL1FBREExRUFBUU94QUFLQUNRUUNnRDBFQVlBeEJBQUQvUUFBQTUwQUFRTkJBQUNDN1FBQmdxVUFBSUp4QUFNQ1VRQUJBazBBQVFKTkFBRUNUUUFCQWswQUFRSk5BQUVDVFFBQ2dsVUFBWUo1QUFLQ3NRQUFndjBBQUFOVkFBQUR0UUFCZ0EwRUFBQkZCQUFBZlFRQkFMVUVBNER0QkFNQktRUUNnV1VFQW9FNUJBR0EvUVFBZ01FRUFJQ0ZCQUVBU1FRREFBMEVBSU90QUFPRFBRQUFndGtBQXdKNUFBTUNLUUFEZ2QwQUFnR2hBQUdCbVFBQmdaa0FBWUdaQUFHQm1RQUJnWmtBQWdHWkFBTUJzUUFBZ2dVQUFRSkpBQUlDblFBQWd2MEFBd05oQUFFRHpRQURBQmtFQVlBTkJBRURzUUFBZzBrQUF3TGxBQUFDalFBQmdqa0FBd0h4QUFFQnFRQUJnWmtBQVlHWkFBR0JtUUFCZ1prQUFZR1pBQUlCbVFBREFiRUFBSUlGQUFFQ1NRQURBcDBBQVFNQkFBS0RhUUFCZzlrQUFnQWxCQUVBWVFRQWdKMEVBUURaQkFJQkZRUURBVkVFQXdFcEJBQ0E3UVFDZ0swRUFJQnhCQU1BTVFRQWcrMEFBUU4xQUFBREFRQURBbzBBQVFJbEFBQ0JqUUFEZ1BVQUFZQ2xBQUdBbVFBQmdKa0FBWUNaQUFHQW1RQUJnSmtBQWdDWkFBQUF2UUFCQVMwQUFvSFJBQUVDU1FBQkFyRUFBNE1aQUFJRGhRQURBKzBBQUFQVkFBR0RhUUFEQXYwQUFZS1ZBQUtDTVFBREFhMEFBUUVSQUFNQXJRQUJnSmtBQVlDWkFBR0FtUUFCZ0prQUFZQ1pBQUlBbVFBQUFMMEFBUUV0QUFFQjFRQUNnazBBQTRLNUFBS0RMUUFBZzZVQUFvQU5CQU9BU1FRQkFJa0VBd0RGQkFHQkJRUUFBVVVFQUlFaEJBRUE0UVFCZ0tFRUFvQmhCQU9BSVFRQ0E4a0FBUU5OQUFJQzBRQUFnbGtBQUlIRkFBSUE1UUFCQUNVQUFRTlkvQU1ETVB3REF6RDhBd013L0FNRE1Qd0RBekQ4QUlNMC9BT0RuUHdCZ0drQUFJRXRBQUFDQVFBQ2dta0FBSUxWQUFNRFBRQUFBNmtBQVFPTkFBS0RJUUFBZ3JrQUFnSk5BQU9CeFFBQUFQMEFBZ0JGQUFNRGRQd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQUNETlB3RGc1ejhBUUJ0QUFDQlBRQUJBaEVBQUlLSkFBTURBUUFEQTMwQUFBUDlBQUNBUFFRQUFIMEVBd0M1QkFLQStRUUNBVGtFQW9FWkJBTUEyUVFEQUprRUF3QlpCQU9BR1FRREE3VUFBNE0xQUFDQ3VRQUJnamtBQXdGMUFBR0FmUUFCZ3hqOEF3RVkvQUtBWlB3Q2dHVDhBb0JrL0FLQVpQd0NnR1Q4QXdCcy9BQ0NCUHdEZzVEOEFZQ2RBQUlCY1FBRGdpRUFBWUtOQUFBQytRQUJBMkVBQWdORkFBQUMzUUFCZ25FQUF3SUZBQUdCT1FBQkFHVUFBb01vL0FBQmdQd0NnR1Q4QW9Cay9BS0FaUHdDZ0dUOEFvQmsvQU1BYlB3QWdoVDhBb1BVL0FDQTRRQURnZGtBQUFKdEFBTUM2UUFDZzJrQUFnUHBBQUVBTlFRQWdIVUVBSUMxQkFDQTlRUUFnVFVFQWdFWkJBSUEyUVFDQUprRUFnQlpCQUlBR1FRQUE3VUFBSU0xQUFDQ3RRQUJBalVBQW9GcEFBQ0FiUUFCZ3VEOEFvUDQrQU1DanZnQkFGYjhBb0JtL0FLQVp2d0NnR2I4QUlPYStBS0RRUGdDQW5qOEFBQVJBQUNBNVFBQkFia0FBd0pGQUFFQ3NRQUNneGtBQXdMOUFBRUNsUUFDZ2lrQUFJR0JBQU9BcVFBREE2ejhBd0lJL0FNQXBQZ0RBRGI4QW9CbS9BS0FadndDZ0diOEFZQWkvQUVDNHZRQ0FYVDhBWU9vL0FJQTBRQUFnZEVBQUFKcEFBT0M1UUFEZzJVQUE0UGxBQU9BTVFRRGdIRUVBNEN4QkFPQThRUURnVEVFQVlFZEJBSUEzUVFDZ0owRUF3QmRCQU9BSFFRQWc4RUFBb05CQUFFQ3hRQUJBa2tBQWdHZEFBS0FzUUFEQTZ6OEF3SU0vQUFCY1BnQmdNYjhBSUt5L0FLREx2d0RneXI4QW9JbS9BTUJndmdBZ01qOEFvTUUvQU1BVlFBREFTa0FBQUlCQUFLQ2FRQURndEVBQUlLNUFBSUNUUUFEQWNVQUFvRHhBQUlBSFFBQ0FwVDhBQVBJK0FBRHl2Z0Jnbzc4QXdNeS9BT0RHdndDQWxiOEFvTkMrQUlBR1B3QWdwejhBd0FsQUFNQkRRQUNnZjBBQW9KNUFBTUM5UUFBZzNVQUF3UHhBQUNBT1FRQUFIa0VBNEMxQkFPQTlRUURBVFVFQWdFbEJBT0E1UVFBZ0trRUFnQnBCQUFBTFFRQkE5MEFBd05oQUFNQzZRQUNnblVBQTRJRkFBR0JPUUFDZ0drQUFvTTgvQUtCTlB3QUF4cjBBSUhlL0FDRGt2d0RnRU1BQXdNKy9BS0JOdndBQXhqMEFJSGMvQU9Ea1B3QmdKMEFBZ0Z4QUFPQ0lRQUFnbzBBQVlKeEFBTUNCUUFCZ1RrQUFRQmxBQUtESVB3Q0FRRDhBd0NtK0FNQ0N2d0RBNjc4QVlBdkFBRUM3dndEZ0w3OEF3R0ErQUtDSlB3RGc4ajhBZ0N4QUFLQmdRQUJnakVBQUlLbEFBTURHUUFEZzVFQUF3QUZCQUVBUlFRREFJRUVBWURCQkFDQkFRUURnVDBFQUFFMUJBSUE5UVFBZ0xrRUFBQjlCQU9BUFFRQWdBVUVBSU9WQUFDREpRQUFncmtBQW9KTkFBQUIwUUFBZ1FFQUFJQXRBQUtDc1B3QkFCejhBb05DK0FJQ2V2d0NnQThBQWdBbkFBS0NzdndCQUI3OEFvTkErQUlDZVB3QUFCRUFBSURsQUFFQnVRQUJna1VBQW9JcEFBQ0JnUUFEZ0trQUF3T3MvQU1DQ1B3REFLVDRBZ0VDL0FLREl2d0FBRDhBQXdOMi9BQUJxdndCQXo3d0FBRmMvQUFEUVB3REFIRUFBNEZGQUFPQ0NRQUNBbkVBQW9MZEFBT0RUUUFDZzhFQUFBQWRCQU9BVlFRQUFKVUVBUURSQkFLQkRRUUFnVTBFQWdGRkJBSUJDUVFDQU0wRUF3Q1JCQUdBV1FRQkFDRUVBSVBWQUFHRGFRQUJBd0VBQW9LWkFBR0NNUUFDZ1kwQUFnQzVBQUFEelB3Q2dpVDhBd0dBK0FDQXl2d0Nnd2I4QUlCREFBQUR6dndDZ2liOEF3R0MrQUNBeVB3Q2d3VDhBd0JWQUFNQktRQUJBZjBBQXdIRkFBS0E4UUFDQUIwQUFnS1UvQUFEeVBnQUE4cjRBZ0tXL0FJQUZ3QURnL0w4QW9KZS9BTUN5dmdBQUZUOEFnTE0vQUNBT1FBREFRRUFBUUhWQUFFQ1ZRQUNncjBBQUlNbEFBSURqUUFBQS8wQUF3QTFCQUNBY1FRQ2dLa0VBZ0RsQkFJQklRUUNnVjBFQUlGZEJBSUJJUVFBZ09rRUFBQ3hCQUNBZVFRREFFRUVBWUFOQkFBRHRRQUJBMDBBQXdMaEFBQ0NlUUFDQWcwQUE0RkZBQU1BY1FBREF6ejhBb0UwL0FBREd2UUNBZGI4QXdONi9BQ0FSd0FEQXo3OEFvRTIvQUFER1BRQWdkejhBNE9RL0FHQW5RQURBVzBBQVlFNUFBRUFaUUFDZ3lEOEFnRUEvQU1BcHZnREFncjhBd091L0FDQUt3QUNBczc4QTRCZS9BTUNZUGdDQWtEOEE0UGsvQUFBeVFBQUFaMEFBSUkxQUFBQ25RQUNnd1VBQUlOeEFBT0QxUUFEZ0IwRUFZQlZCQUVBalFRQ0FNVUVBNEQ5QkFHQk9RUUFnWFVFQTRGMUJBS0JQUVFEQVFVRUFRRFJCQU9BbVFRREFHVUVBNEF4QkFLRC9RQUFnNVVBQWdNcEFBT0N2UUFCQWxVQUFRSFZBQUNCQVFBQWdDMEFBd0t3L0FJQVBQd0RBc3I0QW9KZS9BRUFBd0FBZ0NjQUFvS3kvQUVBSHZ3Q2cwRDRBZ0o0L0FBQUVRQUJnT0VBQTRDcEFBTURyUHdEQWdqOEF3Q2srQUlCQXZ3Q2d5TDhBZ0EzQUFLRFd2d0NBVzc4QVFNODhBQUJxUHdBQTJqOEFZQ0JBQUlCVlFBQkFoVUFBNEo5QUFPQzVRQUNBMDBBQUFPNUFBRUFFUVFCZ0VVRUFJQjVCQUdBclFRQUFPVUVBQUVkQkFFQlZRUUNnWTBFQWdHVkJBTUJYUVFCZ1NrRUFJRDFCQUFBd1FRQkFJMEVBQUJaQkFNQUlRUURnOWtBQVFOeEFBS0RCUUFBQXAwQUFZSXhBQUtCalFBQUFMMEFBNFBnL0FJQ1FQd0FnbGo0QVlDVy9BS0M2dndDZ0RjQUFBUE8vQUtDSnZ3REFZTDRBSURJL0FLREJQd0FBRlVBQWdBZEFBSUNsUHdBQThqNEFBUEsrQUlDbHZ3QUFCY0FBSVBPL0FNQ092d0FnbHI0QVlDVS9BS0M2UHdBZ0VrQUFJRVpBQUNCNVFBQUFsMEFBb0xGQUFFRE1RQUNnNWtBQUlBQkJBQ0FOUVFDQUdrRUFvQ2RCQUlBMFFRQ0FRVUVBQUU5QkFNQmNRUURBYWtFQTRHMUJBS0JnUVFCZ1UwRUFnRVpCQUlBNVFRQkFMRUVBNEI1QkFLQVJRUUJBQkVFQUFPNUFBR0RUUUFEQXVFQUFJSjVBQUNDRVFBQWdWVUFBWUNCQUFLRFdQd0NBV3o4QVFNKzhBQUJxdndEQTNiOEFJQkhBQU1EUHZ3Q2dUYjhBQU1ZOUFDQjNQd0NBNHo4QW9NZy9BSUJBUHdEQUtiNEF3SUsvQU1EcnZ3QmdCOEFBb0t5L0FFQUh2d0JneWo0QUFKZy9BSUFBUUFDQU5VQUFvR3BBQUtDUFFBQWdxVUFBWU1OQUFBRGVRQUNnK0VBQW9BbEJBSUFXUVFCZ0kwRUFvREJCQUFBK1FRRGdTa0VBd0ZkQkFBQmxRUUNnY2tFQXdIWkJBS0JwUVFEZ1hFRUF3RTlCQUdCQ1FRQWdOVUVBd0NkQkFJQWFRUUFnRFVFQXdQOUFBQ0RsUUFDZ3lrQUE0TEJBQUFDWFFBRGdlRUFBd0VOQUFLQU9RQUNBc3o4QUFCVS9BTUN5dmdDZ2w3OEFBUDIvQUtBSXdBQ2dyTDhBUUFlL0FLRFFQZ0FBblQ4QXdJSS9BTUFwUGdDQVFMOEFvTWkvQUVBS3dBQmd5cjhBSUUyL0FBREdQUUFnZHo4QVlPUS9BTUFrUUFBQVdVQUFJSWRBQUtDaFFBQkF2RUFBQU5aQUFNRHZRQUFnQlVFQWdCSkJBTUFmUVFEZ0xFRUFvRGxCQU9CR1FRQWdWRUVBUUdGQkFDQnVRUUJBZTBFQUFJQkJBQ0J6UVFEZ1pVRUFvRmhCQUVCTFFRQUFQa0VBb0RCQkFHQWpRUUFBRmtFQXdBaEJBRUQzUUFDZzNVQUFZTU5BQU1Db1FBQWdqa0FBSUdkQUFBQXlRQURnK1Q4QWdKQS9BTUNZUGdEZ0Y3OEFnTE8vQU1BS3dBQUE4NzhBb0ltL0FNQmd2Z0FBTHo4QUFQSStBQUR5dmdDQXBiOEFZQVRBQU1EcnZ3REFncjhBd0NtK0FJQTRQd0Nnd1Q4QXdCVkFBTUJLUUFBZ2ZrQUE0SmhBQUdDelFBQUF6a0FBb09oQUFHQUJRUUFnRGtFQVlCdEJBS0FvUVFBQU5rRUFJRU5CQUFCUVFRQUFYVUVBWUdwQkFLQjNRUUJBZ2tFQW9JUkJBQ0I4UVFEQWJrRUFnR0ZCQUNCVVFRRGdSa0VBZ0RsQkFFQXNRUURnSGtFQUFCSkJBQ0FGUVFEQTcwQUFJTlZBQUlDNlFBRGduMEFBUUlWQUFJQlZRQUJnSUVBQUFOby9BQUJxUHdCQXp6d0FnRnUvQUtEV3Z3Q0FEOEFBd00rL0FLQk52d0JncmowQXdDbStBTUNDdndCZzY3OEFvQVBBQUlDbHZ3QUE4cjRBQVBJK0FJQ2xQd0NnQmtBQVFEbEFBRUJ1UUFEQWtVQUF3S3RBQUdERlFBREEzMEFBWVBwQUFJQUtRUURBRjBFQWdDUkJBSUF4UVFEZ1BrRUFJRXhCQUlCWlFRQmdaa0VBWUhOQkFFQ0FRUURnaGtFQUlJbEJBSUNDUVFDZ2QwRUFZR3BCQUFCZFFRREFUMEVBWUVKQkFFQTFRUUJnS0VFQVlCdEJBQUFPUVFEQUFFRUE0T1pBQUVETVFBQ2dzVUFBQUpkQUFDQjVRQUFnUmtBQUlCSkFBS0M2UHdCZ0pUOEFJSmErQUlDUXZ3Q0ErYjhBb0FqQUFNQ3N2d0RBR2I4QTRFTy9BS0RJdndCZ0NNQUFvTUcvQUlBNHZ3REFLVDRBd0lJL0FNRHJQd0RnS2tBQWdGOUFBRUNKUUFCZ28wQUFBTDVBQUlEWVFBQWc4a0FBSUFaQkFHQVRRUUNnSUVFQUFDNUJBT0E2UVFEZ1IwRUFBRlZCQUdCaVFRQ2diMEVBd0h4QkFPQ0VRUUJnaTBFQW9JMUJBT0NHUVFCQWdFRUFRSE5CQU9CbFFRQ2dXRUVBb0V0QkFNQStRUUNBTVVFQVFDUkJBT0FXUVFDZ0NVRUFvUGhBQUFEZVFBQmd3MEFBSUtsQUFLQ1BRQUNnYWtBQWdEVkFBSUFBUUFDZ2x6OEF3TEkrQUFBVnZ3Q0FzNzhBWUFyQUFJRCt2d0RndmI4QVlNYS9BR0FFd0FCZzVMOEFJSGUvQUFER3ZRQWdUVDhBWU1vL0FFQVpRQUJnVGtBQXdJRkFBRUNjUUFBQXRrQUE0TTlBQUdEcVFBQ0FBa0VBWUE5QkFFQWNRUUNBS1VFQTREWkJBQ0JFUVFCQVVVRUFJRjVCQUVCclFRQ0FlRUVBNElKQkFJQ0pRUUFBa0VFQUFKSkJBR0NMUVFEQWhFRUFJSHhCQU9CdVFRQUFZa0VBQUZWQkFNQkhRUUJnT2tFQUlDMUJBTUFmUVFDQUVrRUFJQVZCQU1EdlFBQUExa0FBUUx4QUFLQ2hRQUFnaDBBQUFGbEFBT0FqUUFEQTNUOEFBR28vQUVEUFBBQUFWNzhBQU5DL0FPQVd3QUJnSE1BQXdCckFBQUFBd0FBQW1MOEFZTXErQUVBSFB3Q2dyRDhBSUF0QUFHQStRQURnY1VBQWdKTkFBQ0N1UUFDZ3lFQUF3T0pBQUdEOFFBQmdDMEVBd0JoQkFNQWxRUUNnTWtFQXdEOUJBQUJOUVFCZ1drRUFvR2RCQUlCMFFRREFnRUVBWUlkQkFBQ09RUUNnbEVFQWdKWkJBTUNQUVFBZ2lVRUFvSUpCQUdCNFFRQkFhMEVBNEYxQkFLQlFRUUJBUTBFQUFEWkJBS0FvUVFCZ0cwRUFJQTVCQUdBQlFRQ2c2RUFBQU01QUFHQ3pRQURBbUVBQVlIeEFBRUJIUUFBZ0VrQUFRTHMvQU9BdlB3REFZTDRBZ0l1L0FFRCt2d0FnTjhBQVlCL0FBS0RGdndDQUo3OEFJSlkrQU1DT1B3QkE4ejhBZ0M1QUFLQmpRQURnaTBBQVlLVkFBTUMvUUFCZzJrQUFBUFZBQU1BSFFRQ0FGRUVBb0NGQkFPQXVRUUFnUEVFQUFFbEJBQUJXUVFCQVkwRUFnSEJCQU9COVFRQ0FoVUVBNEl0QkFJQ1NRUUFnbVVFQVlKbEJBT0NTUVFCQWpFRUF3SVZCQUVCK1FRQUFjVUVBQUdSQkFNQldRUUNBU1VFQVFEeEJBRUF2UVFBZ0lrRUFBQlZCQU9BSFFRQUE5VUFBd05wQUFNREFRQUJBcGtBQXdJdEFBRUJpUUFBZ0xVQUFvUFkvQUFDT1B3Q2diRDRBb0UrL0FBRG52d0RnTU1BQUlCckFBQ0MxdndBZzI3NEFZQXcvQUNDdlB3QkFERUFBNEVCQUFBQjJRQUNnbFVBQUFMQkFBQ0RLUUFEQTVFQUFZUDlBQUFBTlFRQkFHa0VBWUNkQkFJQTBRUURnUVVFQUlFOUJBRUJjUVFDQWFVRUF3SFpCQUFDQ1FRREFpRUVBUUk5QkFPQ1ZRUUNBbkVFQW9KVkJBQ0NQUVFDZ2lFRUFBSUpCQU1CMlFRQ0FhVUVBUUZ4QkFHQlBRUUJnUWtFQUlEVkJBT0FuUVFBQUcwRUFBQTVCQU1BQVFRRGc1a0FBUU14QUFDQ3lRQUNnbUVBQVlIeEFBRUJIUUFBZ0VrQUFRTHMvQU9BdlB3REFZTDRBZ0l1L0FFRCt2d0FBT01BQUlDZkFBQ0RldndBQWFyOEFRTSs4QUlCYlB3Q2cxajhBWUNCQUFJQlZRQUJBaFVBQTRKOUFBSUM2UUFBZzFVQUF3TzlBQUNBRlFRQ0FFa0VBd0I5QkFDQXRRUUJnT2tFQXdFZEJBQUJWUVFCZ1lrRUFvRzlCQUFCOVFRQWdoVUVBd0l0QkFJQ1NRUUFnbVVFQUlKRkJBSUNLUVFEZ2cwRUE0SHBCQU9CdFFRQ2dZRUVBUUZOQkFBQkdRUUFBT1VFQUlDeEJBT0FlUVFDZ0VVRUFnQVJCQUlEdlFBQWcxVUFBZ0xwQUFPQ2ZRQUNBaFVBQUFGaEFBT0FqUUFEQTNUOEFBR28vQUVEUFBBQUFWNzhBQU5DL0FDQVZ3QUFBRzhBQWdDREFBSUFRd0FDZ3VyOEFZQ1cvQUNDV1BnQ0FrRDhBNFBrL0FBQXlRQUFnWjBBQUlJNUFBTUNvUUFCZ3cwQUFBTjVBQUtENFFBQ2dDVUVBNEJaQkFFQWtRUUNBTVVFQTRENUJBQ0JNUVFDQVdVRUF3R1pCQUNCMFFRREFnRUVBWUlkQkFBQ09RUUNnbEVFQW9JeEJBQUNHUVFEQWZrRUFnSEZCQUlCa1FRQ2dWMEVBWUVwQkFDQTlRUURBTDBFQW9DSkJBT0FWUVFEQUNFRUE0UFpBQUdEY1FBREF3a0FBd0toQUFDQ09RQUFnWjBBQUFESkFBS0Q5UHdDZ2x6OEF3TEkrQUFBVnZ3Q0FzNzhBQUFqQUFHRHV2d0RBdUw4QW9ORy9BS0FPd0FCZ0FNQUFvSmUvQU1DeXZnQUFGVDhBZ0xNL0FLQU9RQURBUTBBQTRIaEFBQUNYUUFDZ3NVQUFRTXhBQU9EbVFBREFBRUVBQUE1QkFHQWJRUUNnS0VFQUFEWkJBRUJEUVFDZ1VFRUE0RjFCQUVCclFRQ0FlRUVBNElKQkFLQ0pRUUJBa0VFQUFJaEJBSUNCUVFEZ2RVRUFnR2hCQUVCYlFRQWdUa0VBWUVGQkFFQTBRUURnSmtFQW9CbEJBR0FNUVFEZy9rQUFBT1ZBQUlES1FBRGdyMEFBQUpaQUFNQjRRQURBUTBBQW9BNUFBSUN6UHdEZ0Z6OEF3SmkrQUlDUXZ3REErTDhBd1A2L0FBQ1l2d0RnQmI4QVFHQy9BS0RXdndCZ0U4QUF3TjIvQUFCcXZ3QkF6N3dBZ0ZzL0FLRFdQd0JnSUVBQWdGVkFBRUNGUUFEZ24wQUFnTHBBQUNEVlFBREE3MEFBSUFWQkFJQVNRUURBSDBFQUlDMUJBR0E2UVFEQVIwRUFBRlZCQUdCaVFRQ2diMEVBQUgxQkFDQ0ZRUURBaTBFQVlJTkJBS0I1UVFEQWJFRUFvRjlCQUdCU1FRQUFSVUVBNERkQkFBQXJRUUFBSGtFQXdCQkJBR0FEUVFCQTdFQUFJTkpBQUlDNFFBQWdua0FBZ0lOQUFLQlNRQURnSDBBQW9OWS9BSUJiUHdCQXo3d0FBR3EvQUFEYXZ3QmdDY0FBb0xxL0FHQWx2d0RnYlQ0QUlKYStBQ0NWdndDQUFNQUFBQS9BQUtDNnZ3QmdKYjhBSUpZK0FJQ1FQd0RnK1Q4QUFESkFBQ0JuUUFBZ2prQUF3S2hBQUdERFFBQUEza0FBb1BoQUFLQUpRUURnRmtFQVFDUkJBSUF4UVFEZ1BrRUFJRXhCQUlCWlFRREFaa0VBSUhSQkFNQ0FRUUJnaDBFQTRIMUJBSUJ3UVFCZ1kwRUFnRlpCQUlCSlFRQWdQRUVBNEM1QkFLQWhRUUNBRkVFQXdBZEJBQUQxUUFCZzJrQUF3TDlBQUdDbFFBRGdpMEFBb0dOQUFJQXVRQUJBOHo4QXdJNC9BQ0NXUGdCZ0piOEFvTHEvQUlBS3dBREEzYjhBQUdxL0FFRFB2QURnUmo4QUlKWStBR0FsdndDZ3VyOEFBQS9BQUlBQXdBQ2dsNzhBd0xLK0FBQVZQd0NBc3o4QW9BNUFBTUJEUUFEZ2VFQUFBSmRBQUtDeFFBQkF6RUFBNE9aQUFNQUFRUUFBRGtFQVlCdEJBS0FvUVFBQU5rRUFRRU5CQUtCUVFRRGdYVUVBUUd0QkFJQjRRUURnZ2tFQUFIVkJBS0JuUVFCZ1drRUFJRTFCQUFCQVFRQkFNMEVBQUNaQkFNQVlRUUJnQzBFQVlQeEFBTURpUUFDZ3lFQUFJSzVBQUlDVFFBRGdjVUFBWUQ1QUFDQUxRQUNnckQ4QVFBYy9BR0RLdmdBQW1MOEFZUCsvQUdEL3Z3Q2dsNzhBd0xLK0FBQVZQd0FncUQ4QWdGcy9BRURQdkFBQWFyOEF3TjIvQU1BVXdBREEzYjhBQUdxL0FFRFB2QUNBV3o4QW9OWS9BR0FnUUFDQVZVQUFRSVZBQU9DZlFBQ0F1a0FBSU5WQUFNRHZRQUFnQlVFQWdCSkJBTUFmUVFBZ0xVRUFZRHBCQU1CSFFRQUFWVUVBWUdKQkFLQnZRUUFBZlVFQW9HdEJBTUJlUVFDQVVVRUFJRVJCQU9BMlFRREFLVUVBNEJ4QkFNQVBRUUNBQWtFQVlPcEFBT0RQUUFBQXRrQUFRSnhBQU1DQlFBQmdUa0FBUUJsQUFHREtQd0FnVFQ4QUFNYTlBQ0IzdndCZzVMOEF3QXJBQUtDNnZ3QmdKYjhBSUpZK0FJQ1FQd0RBN2o4QWdMTS9BQUFWUHdEQXNyNEFvSmUvQUlBQXdBQUFEOEFBb0xxL0FHQWx2d0FnbGo0QWdKQS9BT0Q1UHdBQU1rQUFJR2RBQUNDT1FBREFxRUFBWU1OQUFBRGVRQUNnK0VBQW9BbEJBT0FXUVFCQUpFRUFnREZCQU9BK1FRQWdURUVBZ0ZsQkFNQm1RUUFnZEVFQVlHSkJBRUJWUVFCZ1NFRUFRRHRCQUFBdVFRQ2dJRUVBWUJOQkFJQUdRUUFnODBBQW9OaEFBQUMrUUFCZ28wQUFRSWxBQUlCZlFBRGdLa0FBd09zL0FNQ0NQd0RBS1Q0QWdEaS9BS0RCdndBQURjQUF3TjIvQUFCcXZ3QkF6N3dBZ0ZzL0FLRFdQd0RBR2tBQTRQay9BSUNRUHdBZ2xqNEFZQ1cvQUNDN3Z3QUFFY0FBZ0FEQUFLQ1h2d0RBc3I0QUFCVS9BSUN6UHdDZ0RrQUF3RU5BQU9CNFFBQUFsMEFBb0xGQUFFRE1RQURnNWtBQXdBQkJBQUFPUVFCZ0cwRUFvQ2hCQUFBMlFRQkFRMEVBb0ZCQkFPQmRRUUNBYTBFQUFGcEJBRUJNUVFEZ1BrRUFBREpCQUNBbFFRREFGMEVBZ0FwQkFHRDZRQUFnNEVBQW9NWkFBRUNzUUFEQWtVQUFRRzVBQUVBNVFBQ2dCa0FBZ0tVL0FBRHlQZ0FBOHI0QWdLVy9BQUFGd0FEZy83OEFvSmUvQU1DeXZnQUFGVDhBZ0xNL0FLQU9RQUFnUGtBQVlDQkFBS0RXUHdDQVd6OEFRRis5QU9CMnZ3RGc1TDhBZ0JiQUFNRGR2d0FBYXI4QVFNKzhBSUJiUHdDZzFqOEFZQ0JBQUlCVlFBQkFoVUFBNEo5QUFJQzZRQUFnMVVBQXdPOUFBQ0FGUVFDQUVrRUF3QjlCQUNBdFFRQmdPa0VBNEVkQkFLQlZRUUNnWTBFQVlGSkJBRUJFUVFCQU5rRUF3Q2hCQUtBYlFRREFEa0VBb0FGQkFLRG9RQUFBemtBQWdMTkFBT0NaUUFEZ2YwQUF3RXBBQU1BVlFBQ2d3VDhBZ0RnL0FNQXB2Z0RBZ3I4QXdPdS9BS0FNd0FDZ3VyOEFZQ1cvQUNDV1BnQ0FrRDhBNFBrL0FBQXlRQUNBWVVBQXdFTkFBQ0FPUUFBQXJqOEFRQWMvQUtEUXZnQ0FucjhBQUFUQUFLQVB3QUNndXI4QVlDVy9BQ0NXUGdDQWtEOEE0UGsvQUFBeVFBQWdaMEFBSUk1QUFNQ29RQUJndzBBQUFONUFBS0Q0UUFDZ0NVRUE0QlpCQUVBa1FRRGdNVUVBNEQ5QkFDQk9RUUNBWEVFQTRFdEJBQ0E5UVFDZ0xrRUFnQ0JCQUtBU1FRQkFCVUVBNFBCQUFPRFdRQUJBdkVBQW9LRkFBQ0NIUUFCZ1drQUFRQ2RBQU9Ea1B3QWdkejhBQU1ZOUFDQk52d0JneXI4QUFBL0FBTURkdndBQWFyOEFRTSs4QUlCYlB3Q2cxajhBWUNCQUFJQlZRQUJnZ2tBQVFHVkFBSUF1UUFBQTh6OEFvSWsvQU1CZ1BnQWdNcjhBb01HL0FBQVN3QUNBQU1BQW9KZS9BTUN5dmdBQUZUOEFnTE0vQUtBT1FBREFRMEFBNEhoQUFBQ1hRQUNnc1VBQVFNeEFBT0RtUUFEQUFFRUFRQTVCQUNBY1FRQmdLa0VBb0RoQkFFQkhRUUFBVmtFQVlFWkJBRUEzUVFCQUtFRUFZQmxCQU9BS1FRQmcrVUFBSU41QUFBREVRQUJncWtBQUFKQkFBS0JxUUFDQU5VQUFJQUZBQU9DZFB3Q2cwRDRBUUFlL0FLQ3N2d0FnQ2NBQUlBREFBS0NYdndEQXNyNEFBQlUvQUlDelB3Q2dEa0FBd0VOQUFPQjRRQUNBazBBQWdJTkFBT0JSUUFEQUhFQUF3TTgvQUtCTlB3QUF4cjBBSUhlL0FPRGt2d0NnRnNBQXdOMi9BQUJxdndCQXo3d0FnRnMvQUtEV1B3QmdJRUFBZ0ZWQUFFQ0ZRQURnbjBBQWdMcEFBRURWUUFEQThFQUFnQVpCQU9BVVFRQ0FJMEVBWURKQkFHQkJRUUNBVUVFQUlFSkJBS0F5UVFBZ0kwRUE0Qk5CQUtBRVFRQ0E2MEFBUU01QUFBQ3lRQUJBbDBBQW9IdEFBRUJIUUFBZ0VrQUFvTG8vQUdBbFB3QmdncjRBb0ltL0FBRHp2d0NnRGNBQW9McS9BR0FsdndBZ2xqNEFnSkEvQU9ENVB3QUFNa0FBSUdkQUFDQ09RQUJBcFVBQVFKVkFBRUIxUUFBZ1FFQUFJQXRBQUtDc1B3QkFCejhBb05DK0FHQ2h2d0FnQjhBQVFCREFBS0M2dndCZ0piOEFJSlkrQUlDUVB3RGcrVDhBQURKQUFDQm5RQUFnamtBQVlLbEFBSURGUUFCZzRrQUFvUDlBQU1BT1FRQUFIa0VBUUMxQkFLQThRUUFnVEVFQUFEOUJBRUF2UVFDQUgwRUF3QTlCQUNBQVFRQkE0VUFBZ01KQUFFQ2tRQURnaGtBQXdGVkFBSUFpUUFEQTNUOEFBR28vQUVEUFBBQ0FXNzhBd05DL0FLQUZ3QUNBM2I4QUFHcS9BRURQdkFDQVd6OEFvTlkvQUdBZ1FBQ0FWVUFBUUlWQUFPQ2ZRQUFBdDBBQUFLZEFBR0NNUUFDZ1kwQUFnQzVBQUFEelB3Q2dpRDhBb0M0K0FJQkF2d0NneUw4QUlBbkFBQUR4dndDZ2w3OEF3TEsrQUFBVlB3Q0FzejhBb0E1QUFDQkVRQUFnZkVBQTRKcEFBSUM0UUFEQTFrQUFnUFZBQUVBS1FRRGdHVUVBZ0NsQkFFQTVRUUFBU1VFQVFEMUJBR0F0UVFCZ0hVRUFnQTFCQUNEN1FBQkEyMEFBb0x0QUFBQ2NRQUJBZVVBQVFEdEFBTUQrUHdBQWt6OEF3TEkrQUdBUHZ3QWdpcjhBb0ptL0FLQ1p2d0JBaXI4QXdMSytBQUFWUHdDQXN6OEFvQTVBQU1CRFFBRGdlRUFBQUpkQUFLQ3hRQURBeUVBQXdMaEFBQ0NlUUFDQWcwQUF3RkZBQU9BYVFBQ2d5RDhBZ0VBL0FNQXB2Z0JnZXI4QW9KbS9BS0NadndBQWxiOEE0RksvQUVEUHZBQ0FXejhBZ05vL0FFQW5RQUNBWTBBQW9KQkFBQUN3UUFDQXowQUFJTzlBQUdBSFFRQmdGMEVBUUNkQkFDQTNRUUFnUjBFQTREeEJBT0FzUVFEZ0hFRUE0QXhCQU1ENVFBREEyVUFBd0xsQUFNQ1pRQUNnYzBBQXdETkFBQ0RvUHdBQVZUOEE0Q005QUFEenZRREE5YjBBd1BXOUFNRDF2UUFBODcwQUlKcytBSUNRUHdEZytUOEFBREpBQUNCblFBQWdqa0FBd0toQUFHRERRQUJnMmtBQWdNcEFBT0N2UUFDZ2xFQUFJSEpBQUtBOFFBQ0FCMEFBZ0tVL0FBRHpQZ0FBMmIwQXdQVzlBTUQxdlFEQTliMEF3UFc5QUVDYnZRQ2cvVDRBQUxjL0FLQWFRQUJnV2tBQUlJMUFBQUN0UUFBQXpVQUFBTzFBQUlBR1FRQ0FGa0VBZ0NaQkFJQTJRUUNBUmtFQWdEMUJBS0F0UVFDZ0hVRUF3QTFCQU1EN1FBQWczRUFBZ0x4QUFDQ2RRQUFnZkVBQUlEOUFBQUFGUUFEZ3B6OEFnSUEvQUFDQVB3QUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4QW9JNC9BQURiUHdCZ0lFQUFnRlZBQUVDRlFBRGduMEFBZ0xwQUFDRFZRQUFnN0VBQTROdEFBRURBUUFCQXBVQUFvSXBBQUNCZ1FBRGdLa0FBWU80L0FJQ1pQd0FBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFBSUEvQUFDQVB3Q2dqajhBSU44L0FHQW5RQUNBWTBBQW9KQkFBQUN3UUFDQXowQUFJTzlBQUdBSFFRQmdGMEVBUUNkQkFDQTNRUUFnUjBFQWdEOUJBTUF2UVFBZ0lFRUFnQkJCQU9BQVFRQUE0MEFBZ01SQUFLQ21RQURBaVVBQUFGMUFBQ0F0UUFBQUMwQUFJQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQXdBTkFBRUFkUUFDZ1IwQUFJSGxBQUFDWFFBQ2dzVUFBUU14QUFPRG1RQUJnL1VBQVFPeEFBSURSUUFBQXQwQUFZSnhBQU1DQlFBQUFVVUFBNENSQUFPQUdRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBREFBMEFBUUIxQUFNQklRQUFnZlVBQTRKcEFBSUM0UUFEQTFrQUFnUFZBQUVBS1FRRGdHVUVBZ0NsQkFFQTVRUUFBU1VFQTRFSkJBR0F6UVFBQUpFRUE0QlJCQU1BRlFRQUE3a0FBSU5GQUFHQzFRQUJBbTBBQW9JTkFBS0JnUUFDQVIwQUFJRUJBQUFCQVFBQUFRRUFBQUVCQUFBQkFRQUFBUUVBQWdFSkFBS0JVUUFDQWRrQUFBSkZBQUVDcFFBQmd3MEFBQU41QUFLRDRRQUNBQjBFQTRQMUFBRURqUUFDZ3lFQUFZSzVBQUtDVlFBREFma0FBWUZwQUFLQkVRQUFBUUVBQUFFQkFBQUJBUUFBQVFFQUFBRUJBQUFCQVFBQ0FRa0FBb0ZSQUFJQjJRQUJna1VBQW9LcEFBT0RGUUFCZzRrQUFvUDlBQU1BT1FRQUFIa0VBUUMxQkFLQThRUUFnVEVFQVlFZEJBR0E0UVFCZ0tVRUF3QnBCQUdBTVFRQ2cvRUFBb09GQUFDRElRQURBc0VBQWdKeEFBS0NNUUFEZ2drQUFBSUJBQUFDQVFBQUFnRUFBQUlCQUFBQ0FRQUFBZ0VBQUFJRkFBT0NIUUFDQWxVQUFRS2hBQUVDK1FBQWcxa0FBd085QUFDQUZRUUJnRUVFQTRBZEJBQ0QxUUFBZzIwQUE0TUpBQUdDc1FBRGdtRUFBSUlwQUFNQ0JRQUFBZ0VBQUFJQkFBQUNBUUFBQWdFQUFBSUJBQUFDQVFBQUFnVUFBNElkQUFJQ1ZRQUJBcUVBQWdMNUFBRURYUUFDZzhVQUFvQVpCQU9BVVFRQ0FJMEVBWURKQkFHQkJRUUNBVUVFQUlFMUJBSUErUVFBZ01FRUFBQ0pCQUVBVVFRQWdCMEVBUVBWQUFBRGVRQUFneVVBQW9MZEFBRUNxUUFCQW9rQUFBS0JBQUFDZ1FBQUFvRUFBQUtCQUFBQ2dRQUFBb0VBQXdLQkFBR0NtUUFEQXNVQUF3TUZBQUdEVlFBQmc2MEFBZ0FGQkFDQU9RUUJBR1VFQXdCQkJBQUFFUVFBQThFQUFvTmxBQUdERlFBQ2d0RUFBUUtoQUFHQ2hRQUFBb0VBQUFLQkFBQUNnUUFBQW9FQUFBS0JBQUFDZ1FBREFvRUFBWUtaQUFNQ3hRQURBd1VBQVlOVkFBS0RyUUFBQUFrRUFBQTlCQUlBY1FRQmdLa0VBb0RoQkFFQkhRUUFBVmtFQTRGTkJBTUJGUVFEZ04wRUFnQ3BCQUlBZFFRQWdFVUVBb0FWQkFBRDJRQUNBNDBBQUlOUkFBS0RJUUFEZ3dVQUFBTUJBQUFEQVFBQUF3RUFBQU1CQUFBREFRQUFBd0VBQW9NQkFBR0RGUUFBQXowQUE0TnhBQUVEdVFBQkFBVUVBWUF4QkFDQVlRUUNBSWtFQWdCcEJBS0FPUVFCZ0EwRUFJUEpBQUNEZ1FBQ0EwVUFBNE1aQUFDREJRQUFBd0VBQUFNQkFBQURBUUFBQXdFQUFBTUJBQUFEQVFBQ2d3RUFBWU1WQUFBRFBRQURnM0VBQVFPNUFBRUFCUVFCZ0RFRUFnQmhCQUVBbFFRQ0FNa0VBSUVCQkFDQk9RUUNBWEVFQW9GdEJBQUJPUVFEQVFFRUFBRFJCQU1BblFRQkFIRUVBZ0JGQkFPQUhRUUFBLzBBQVlQRkFBSURuUUFDZzRVQUFBT0JBQUFEZ1FBQUE0RUFBQU9CQUFBRGdRQUFBNEVBQWdPQkFBS0RrUUFBQTdVQUFRUGxBQUdBRVFRQ0FEVUVBNEJkQkFBQWpRUURBTEVFQVFDVkJBQUFhUVFDQUQwRUFJQVpCQUFEOFFBQWc3MEFBQU9aQUFBRGhRQUFBNEVBQUFPQkFBQURnUUFBQTRFQUFBT0JBQUFEZ1FBQ0E0RUFBb09SQUFBRHRRQUJBK1VBQVlBUkJBSUFOUVFEZ0YwRUFBQ05CQUFBdlFRQ2dPMEVBb0VoQkFDQldRUURnWTBFQUlHUkJBQ0JYUVFDQVNrRUFZRDVCQU9BeVFRQUFLRUVBSUI1QkFHQVZRUURBRFVFQXdBZEJBRUFEUVFEQUFFRUFBQUJCQUFBQVFRQUFBRUVBQUFCQkFBQUFRUUFBQUVFQVFBQkJBQUFDUVFEQUJVRUFJQXRCQUNBU1FRQ0FHa0VBQUNSQkFHQXVRUURBTjBFQW9EQkJBQUFtUVFCQUhFRUF3Qk5CQUdBTVFRQ2dCa0VBb0FKQkFJQUFRUUFBQUVFQUFBQkJBQUFBUVFBQUFFRUFBQUJCQUFBQVFRQkFBRUVBQUFKQkFNQUZRUUFnQzBFQUlCSkJBSUFhUVFBQUpFRUFZQzVCQUtBNVFRQ0FSVUVBQUZKQkFPQmVRUUFnYkVFQWdHMUJBQUJoUVFBQVZVRUFnRWxCQUtBK1FRQ0FORUVBWUN0QkFFQWpRUUJnSEVFQTRCWkJBT0FTUVFDZ0VFRUFBQkJCQUFBUVFRQUFFRUVBQUJCQkFBQVFRUUFBRUVFQVFCQkJBTUFSUVFBZ0ZVRUFBQnBCQUdBZ1FRQUFLRUVBd0RCQkFJQTZRUUJBUTBFQWdEeEJBS0F5UVFDZ0tVRUF3Q0ZCQUNBYlFRQUFGa0VBWUJKQkFHQVFRUUFBRUVFQUFCQkJBQUFRUVFBQUVFRUFBQkJCQUFBUVFRQkFFRUVBd0JGQkFDQVZRUUFBR2tFQVlDQkJBQUFvUVFEQU1FRUFnRHBCQUFCRlFRQkFVRUVBSUZ4QkFHQm9RUUJBZFVFQWdIZEJBSUJyUVFBZ1lFRUFJRlZCQUFCTFFRQ0FRVUVBQURsQkFJQXhRUUJBSzBFQVFDWkJBS0FpUVFDZ0lFRUFBQ0JCQUFBZ1FRQUFJRUVBQUNCQkFBQWdRUUFBSUVFQVFDQkJBS0FoUVFDZ0pFRUFBQ2xCQU9BdVFRRGdOVUVBQUQ1QkFDQkhRUUJnVDBFQUFFbEJBTUEvUVFCZ04wRUFJREJCQUNBcVFRQmdKVUVBSUNKQkFHQWdRUUFBSUVFQUFDQkJBQUFnUVFBQUlFRUFBQ0JCQUFBZ1FRQkFJRUVBb0NGQkFLQWtRUUFBS1VFQTRDNUJBT0ExUVFBQVBrRUFJRWRCQUFCUlFRQ2dXMEVBNEdaQkFLQnlRUURnZmtFQUlJRkJBTUIyUVFEQWEwRUFZR0ZCQU1CWFFRQUFUMEVBQUVkQkFDQkFRUUJBT2tFQW9EVkJBR0F5UVFDQU1FRUFBREJCQUFBd1FRQUFNRUVBQURCQkFBQXdRUUFBTUVFQUlEQkJBSUF4UVFCQU5FRUFRRGhCQUtBOVFRQWdSRUVBb0V0QkFDQlVRUURnVzBFQUFGWkJBRUJOUVFDQVJVRUE0RDVCQUVBNVFRRGdORUVBNERGQkFHQXdRUUFBTUVFQUFEQkJBQUF3UVFBQU1FRUFBREJCQUFBd1FRQWdNRUVBZ0RGQkFFQTBRUUJBT0VFQW9EMUJBQ0JFUVFDZ1MwRUFJRlJCQUlCZFFRQ0FaMEVBUUhKQkFJQjlRUUNnaEVFQW9JWkJBQ0NCUVFEZ2QwRUFJRzVCQUFCbFFRREFYRUVBUUZWQkFPQk9RUUNBU1VFQVFFVkJBRUJDUVFDQVFFRUFBRUJCQUFCQVFRQUFRRUVBQUVCQkFBQkFRUUFBUUVFQUlFQkJBR0JCUVFEZ1EwRUFvRWRCQUlCTVFRQ2dVa0VBb0ZsQkFLQmhRUURnYUVFQVlHTkJBQ0JiUVFEZ1UwRUFvRTFCQUlCSVFRQ0FSRUVBd0VGQkFFQkFRUUFBUUVFQUFFQkJBQUJBUVFBQVFFRUFBRUJCQUFCQVFRQWdRRUVBWUVGQkFPQkRRUUNnUjBFQWdFeEJBS0JTUVFDZ1dVRUFvR0ZCQUdCcVFRRGdjMEVBSUg1QkFHQ0VRUUFnaWtIWEY5VjQ2VDdkSkFZLzF4ZVdRNHM4QUFBQUFLVm1ZV05sYzhjWUZnQUFBQUFCQUFBQUFnQUFBQUFBQUFBQ0FBQUFBd0FBQUtSMWRXbGt0REV5TkRNeE56WXpOVGcyTmpJNE5UVXdPVGMzclhabGNuUmxlRjl6YjNWeVkyWGFKbG9LY0hKbFkybHphVzl1SUdocFoyaHdJR2x1ZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqTkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl6UkRzS0x5OGdkbVZ5ZEdWNElHbHVjSFYwY3pvZ0NtbHVJSFpsWXpJZ2NHOXphWFJwYjI0N0NuWmxZeklnWjJWMFgzQnZjMmwwYVc5dUtDbDdjbVYwZFhKdUlIQnZjMmwwYVc5dU8zMEthVzRnZG1Wak1pQjFkanNLZG1Wak1pQm5aWFJmZFhZb0tYdHlaWFIxY200Z2RYWTdmUW9LTHk4Z1ZXNXBabTl5YlhNNklBcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNtMWhjRHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNtMWhjQ2dwZTNKbGRIVnliaUIxYm1sbWIzSnRYMk52Ykc5eWJXRndPMzBLZFc1cFptOXliU0IxYVc1MElHOWlhbVZqZEY5cFpEc0tkV2x1ZENCblpYUmZiMkpxWldOMFgybGtLQ2w3Y21WMGRYSnVJRzlpYW1WamRGOXBaRHQ5Q25WdWFXWnZjbTBnYldGME5DQnRiMlJsYkY5bU16SmpPd3B0WVhRMElHZGxkRjl0YjJSbGJGOW1NekpqS0NsN2NtVjBkWEp1SUcxdlpHVnNYMll6TW1NN2ZRcDFibWxtYjNKdElHbHVkQ0J6WkdaZmJXRnlhMlZ5WDNOb1lYQmxPd3BwYm5RZ1oyVjBYM05rWmw5dFlYSnJaWEpmYzJoaGNHVW9LWHR5WlhSMWNtNGdjMlJtWDIxaGNtdGxjbDl6YUdGd1pUdDlDblZ1YVdadmNtMGdabXh2WVhRZ1oyeHZkM2RwWkhSb093cG1iRzloZENCblpYUmZaMnh2ZDNkcFpIUm9LQ2w3Y21WMGRYSnVJR2RzYjNkM2FXUjBhRHQ5Q25WdWFXWnZjbTBnWm14dllYUWdZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxPd3BtYkc5aGRDQm5aWFJmWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsS0NsN2NtVjBkWEp1SUdGMGJHRnpYM1JsZUhSMWNtVmZjMmw2WlR0OUNuVnVhV1p2Y20wZ1ltOXZiQ0J3WVhSMFpYSnVPd3BpYjI5c0lHZGxkRjl3WVhSMFpYSnVLQ2w3Y21WMGRYSnVJSEJoZEhSbGNtNDdmUXAxYm1sbWIzSnRJR0p2YjJ3Z2NHbGphMmx1WnpzS1ltOXZiQ0JuWlhSZmNHbGphMmx1WnlncGUzSmxkSFZ5YmlCd2FXTnJhVzVuTzMwS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aVHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsS0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnY0hoZmNHVnlYM1Z1YVhRN0NtWnNiMkYwSUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwZTNKbGRIVnliaUJ3ZUY5d1pYSmZkVzVwZER0OUNuVnVhV1p2Y20wZ2MyRnRjR3hsY2pKRUlHUnBjM1JoYm1ObFptbGxiR1E3Q25WdWFXWnZjbTBnZG1Wak5DQnVZVzVmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMjVoYmw5amIyeHZjaWdwZTNKbGRIVnliaUJ1WVc1ZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdac2IyRjBJSE4wY205clpYZHBaSFJvT3dwbWJHOWhkQ0JuWlhSZmMzUnliMnRsZDJsa2RHZ29LWHR5WlhSMWNtNGdjM1J5YjJ0bGQybGtkR2c3ZlFwMWJtbG1iM0p0SUhabFl6TWdaak15WTE5elkyRnNaVHNLZG1Wak15Qm5aWFJmWmpNeVkxOXpZMkZzWlNncGUzSmxkSFZ5YmlCbU16SmpYM05qWVd4bE8zMEtkVzVwWm05eWJTQjJaV015SUhKbGMyOXNkWFJwYjI0N0NuWmxZeklnWjJWMFgzSmxjMjlzZFhScGIyNG9LWHR5WlhSMWNtNGdjbVZ6YjJ4MWRHbHZianQ5Q25WdWFXWnZjbTBnWm14dllYUWdaR1Z3ZEdoZmMyaHBablE3Q21ac2IyRjBJR2RsZEY5a1pYQjBhRjl6YUdsbWRDZ3BlM0psZEhWeWJpQmtaWEIwYUY5emFHbG1kRHQ5Q25WdWFXWnZjbTBnZG1Wak5DQnNiM2RqYkdsd1gyTnZiRzl5T3dwMlpXTTBJR2RsZEY5c2IzZGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR3h2ZDJOc2FYQmZZMjlzYjNJN2ZRcDFibWxtYjNKdElHSnZiMndnWW1sc2JHSnZZWEprT3dwaWIyOXNJR2RsZEY5aWFXeHNZbTloY21Rb0tYdHlaWFIxY200Z1ltbHNiR0p2WVhKa08zMEtkVzVwWm05eWJTQnRZWFEwSUhCeVpYQnliMnBsWTNScGIyNDdDbTFoZERRZ1oyVjBYM0J5WlhCeWIycGxZM1JwYjI0b0tYdHlaWFIxY200Z2NISmxjSEp2YW1WamRHbHZianQ5Q25WdWFXWnZjbTBnWW05dmJDQjFibWxtYjNKdFgyTnZiRzl5T3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXlLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnYUdsbmFHTnNhWEJmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMmhwWjJoamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHaHBaMmhqYkdsd1gyTnZiRzl5TzMwS2RXNXBabTl5YlNCMlpXTTBJR2RzYjNkamIyeHZjanNLZG1Wak5DQm5aWFJmWjJ4dmQyTnZiRzl5S0NsN2NtVjBkWEp1SUdkc2IzZGpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IwY21GdWMyWnZjbTFmYldGeWEyVnlPd3BpYjI5c0lHZGxkRjkwY21GdWMyWnZjbTFmYldGeWEyVnlLQ2w3Y21WMGRYSnVJSFJ5WVc1elptOXliVjl0WVhKclpYSTdmUW9LQ2dvS0x5OGdVR1Z5SUdsdWMzUmhibU5sSUdGMGRISnBZblYwWlhNNklBcHBiaUIyWldNMElITmtabDkxZGpzS2RtVmpOQ0JuWlhSZmMyUm1YM1YyS0NsN2NtVjBkWEp1SUhOa1psOTFkanQ5Q21sdUlIWmxZelFnZG1WeWRHVjRYMk52Ykc5eU93cDJaV00wSUdkbGRGOTJaWEowWlhoZlkyOXNiM0lvS1h0eVpYUjFjbTRnZG1WeWRHVjRYMk52Ykc5eU8zMEthVzRnZG1Wak1pQnhkV0ZrWDI5bVpuTmxkRHNLZG1Wak1pQm5aWFJmY1hWaFpGOXZabVp6WlhRb0tYdHlaWFIxY200Z2NYVmhaRjl2Wm1aelpYUTdmUXBwYmlCMlpXTXlJSEYxWVdSZmMyTmhiR1U3Q25abFl6SWdaMlYwWDNGMVlXUmZjMk5oYkdVb0tYdHlaWFIxY200Z2NYVmhaRjl6WTJGc1pUdDlDbWx1SUhabFl6UWdZMjl1ZG1WeWRHVmtYM04wY205clpXTnZiRzl5T3dwMlpXTTBJR2RsZEY5amIyNTJaWEowWldSZmMzUnliMnRsWTI5c2IzSW9LWHR5WlhSMWNtNGdZMjl1ZG1WeWRHVmtYM04wY205clpXTnZiRzl5TzMwS2FXNGdkbVZqTWlCM1oyeGZjRzl6YVhScGIyNXpPd3AyWldNeUlHZGxkRjkzWjJ4ZmNHOXphWFJwYjI1ektDbDdjbVYwZFhKdUlIZG5iRjl3YjNOcGRHbHZibk03ZlFwcGJpQjJaV00wSUdOdmJuWmxjblJsWkY5eWIzUmhkR2x2YmpzS2RtVmpOQ0JuWlhSZlkyOXVkbVZ5ZEdWa1gzSnZkR0YwYVc5dUtDbDdjbVYwZFhKdUlHTnZiblpsY25SbFpGOXliM1JoZEdsdmJqdDlDbWx1SUhabFl6TWdiV0Z5YTJWeVgyOW1abk5sZERzS2RtVmpNeUJuWlhSZmJXRnlhMlZ5WDI5bVpuTmxkQ2dwZTNKbGRIVnliaUJ0WVhKclpYSmZiMlptYzJWME8zMEtDbkJ5WldOcGMybHZiaUJvYVdkb2NDQm1iRzloZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tDblZ1YVdadmNtMGdiV0YwTkNCd2NtOXFaV04wYVc5dU93cDFibWxtYjNKdElHMWhkRFFnZG1sbGR6c0tkVzVwWm05eWJTQnBiblFnZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTTdDblZ1YVdadmNtMGdkbVZqTkNCMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weld6aGRPd29LZFc1cFptOXliU0JtYkc5aGRDQmhkR3hoYzE5MFpYaGZaR2x0T3dvS2IzVjBJSFpsWXpRZ1puSmhaMTlqYjJ4dmNqc0tiM1YwSUhabFl6SWdabkpoWjE5MWRqc0tiM1YwSUdac2IyRjBJR1p5WVdkZmRYWnpZMkZzWlRzS2IzVjBJR1pzYjJGMElHWnlZV2RmWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlRzS2IzVjBJSFpsWXpRZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZzdDbTkxZENCbWJHOWhkQ0J2WDJOc2FYQmZaR2x6ZEdGdVkyVmJPRjA3Q21ac1lYUWdiM1YwSUhabFl6UWdabkpoWjE5emRISnZhMlZqYjJ4dmNqc0tDbVpzWVhRZ2IzVjBJSFZwYm5RZ1puSmhaMTlwYm5OMFlXNWpaVjlwWkRzS1pteGhkQ0J2ZFhRZ2RtVmpNaUJtWDNOd2NtbDBaVjl6WTJGc1pUc0tDaU5rWldacGJtVWdRVTVVU1VGTVNVRlRYMUpCUkVsVlV5QXdMamdLQ2dwdFlYUTBJSEZ0WVhRb2RtVmpOQ0J4ZFdGMEtYc0tJQ0FnSUdac2IyRjBJRzUxYlNBOUlIRjFZWFF1ZUNBcUlESXVNRHNLSUNBZ0lHWnNiMkYwSUc1MWJUSWdQU0J4ZFdGMExua2dLaUF5TGpBN0NpQWdJQ0JtYkc5aGRDQnVkVzB6SUQwZ2NYVmhkQzU2SUNvZ01pNHdPd29nSUNBZ1pteHZZWFFnYm5WdE5DQTlJSEYxWVhRdWVDQXFJRzUxYlRzS0lDQWdJR1pzYjJGMElHNTFiVFVnUFNCeGRXRjBMbmtnS2lCdWRXMHlPd29nSUNBZ1pteHZZWFFnYm5WdE5pQTlJSEYxWVhRdWVpQXFJRzUxYlRNN0NpQWdJQ0JtYkc5aGRDQnVkVzAzSUQwZ2NYVmhkQzU0SUNvZ2JuVnRNanNLSUNBZ0lHWnNiMkYwSUc1MWJUZ2dQU0J4ZFdGMExuZ2dLaUJ1ZFcwek93b2dJQ0FnWm14dllYUWdiblZ0T1NBOUlIRjFZWFF1ZVNBcUlHNTFiVE03Q2lBZ0lDQm1iRzloZENCdWRXMHhNQ0E5SUhGMVlYUXVkeUFxSUc1MWJUc0tJQ0FnSUdac2IyRjBJRzUxYlRFeElEMGdjWFZoZEM1M0lDb2diblZ0TWpzS0lDQWdJR1pzYjJGMElHNTFiVEV5SUQwZ2NYVmhkQzUzSUNvZ2JuVnRNenNLSUNBZ0lISmxkSFZ5YmlCdFlYUTBLQW9nSUNBZ0lDQWdJQ2d4TGpBZ0xTQW9iblZ0TlNBcklHNTFiVFlwS1N3Z0tHNTFiVGNnS3lCdWRXMHhNaWtzSUNBZ0lDQWdJQ0FvYm5WdE9DQXRJRzUxYlRFeEtTd2dJQ0FnSUNBZ0lEQXVNQ3dLSUNBZ0lDQWdJQ0FvYm5WdE55QXRJRzUxYlRFeUtTd2dJQ0FnSUNBZ0lDZ3hMakFnTFNBb2JuVnROQ0FySUc1MWJUWXBLU3dnS0c1MWJUa2dLeUJ1ZFcweE1Da3NJQ0FnSUNBZ0lDQXdMakFzQ2lBZ0lDQWdJQ0FnS0c1MWJUZ2dLeUJ1ZFcweE1Ta3NJQ0FnSUNBZ0lDQW9iblZ0T1NBdElHNTFiVEV3S1N3Z0lDQWdJQ0FnSUNneExqQWdMU0FvYm5WdE5DQXJJRzUxYlRVcEtTd2dNQzR3TEFvZ0lDQWdJQ0FnSURBdU1Dd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBd0xqQXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJREV1TUFvZ0lDQWdLVHNLZlFvS1pteHZZWFFnWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlNncGV3b2dJQ0FnTHk4Z1IyeDVjR2dnWkdsemRHRnVZMlVnWm1sbGJHUWdkVzVwZEhNZ1lYSmxJR2x1SUhCcGVHVnNjenNnWTI5dWRtVnlkQ0IwYnlCa2FXMWxibk5wYjI1c1pYTnpDaUFnSUNBdkx5QjRMV052YjNKa2FXNWhkR1VnYjJZZ2RHVjRkSFZ5WlNCcGJuTjBaV0ZrSUdadmNpQmpiMjV6YVhOMFpXNWplU0IzYVhSb0lIQnliMmR5WVcxdFlYUnBZeUIxZGdvZ0lDQWdMeThnWkdsemRHRnVZMlVnWm1sbGJHUnpJR2x1SUdaeVlXZHRaVzUwSUhOb1lXUmxjaTRnVTJWbElHRnNjMjhnWTI5dGJXVnVkSE1nWW1Wc2IzY3VDaUFnSUNCMlpXTTBJSFYyWDNKbFkzUWdQU0JuWlhSZmMyUm1YM1YyS0NrN0NpQWdJQ0JtYkc5aGRDQndhWGh6YVhwbFgzZ2dQU0FvZFhaZmNtVmpkQzU2SUMwZ2RYWmZjbVZqZEM1NEtTQXFJR2RsZEY5aGRHeGhjMTkwWlhoMGRYSmxYM05wZW1Vb0tUc0tJQ0FnSUhKbGRIVnliaUF0TVM0d0wzQnBlSE5wZW1WZmVEc0tmUW9LZG1Wak15QjBiM1psWXpNb2RtVmpNaUIyS1h0eVpYUjFjbTRnZG1Wak15aDJMQ0F3TGpBcE8zMEtkbVZqTXlCMGIzWmxZek1vZG1Wak15QjJLWHR5WlhSMWNtNGdkanQ5Q2dwMlpXTTBJSFJ2ZG1Wak5DaDJaV016SUhZcGUzSmxkSFZ5YmlCMlpXTTBLSFlzSURFdU1DazdmUXAyWldNMElIUnZkbVZqTkNoMlpXTTBJSFlwZTNKbGRIVnliaUIyTzMwS2RtVmpOQ0IwYjNabFl6UW9ZbTl2YkNCMktTQjdDaUFnSUNCeVpYUjFjbTRnZG1Wak5DZ3dMakFwT3dwOUNncHRZWFF5SUdScFlXZHRLSFpsWXpJZ2RpbDdDaUFnSUNCeVpYUjFjbTRnYldGME1paDJMbmdzSURBdU1Dd2dNQzR3TENCMkxua3BPd3A5Q2dwbWJHOWhkQ0JmWkdWMFpYSnRhVzVoYm5Rb2JXRjBNaUJ0S1NCN0NpQWdjbVYwZFhKdUlHMWJNRjFiTUYwZ0tpQnRXekZkV3pGZElDMGdiVnN3WFZzeFhTQXFJRzFiTVYxYk1GMDdDbjBLQ25admFXUWdjSEp2WTJWemMxOWpiR2x3WDNCc1lXNWxjeWgyWldNeklIZHZjbXhrWDNCdmN5a2dld29nSUNBZ1ptOXlJQ2hwYm5RZ2FTQTlJREE3SUdrZ1BDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzZ2FTc3JLUW9nSUNBZ0lDQWdJRzlmWTJ4cGNGOWthWE4wWVc1alpWdHBYU0E5SUdSdmRDaDNiM0pzWkY5d2IzTXNJSFZ1YVdadmNtMWZZMnhwY0Y5d2JHRnVaWE5iYVYwdWVIbDZLU0F0SUhWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhOYmFWMHVkenNLZlFvS2RtOXBaQ0J0WVdsdUtDbDdDaUFnSUNBdkx5Qm5aWFJmY0c5ektDa2djbVYwZFhKdWN5QjBhR1VnY0c5emFYUnBiMjRnYjJZZ2RHaGxJSE5qWVhSMFpYSWdiV0Z5YTJWeUNpQWdJQ0F2THlCblpYUmZjRzl6YVhScGIyNG9LU0J5WlhSMWNtNXpJSFJvWlNBb2NtVnNZWFJwZG1VcElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCamRYSnlaVzUwSUhGMVlXUWdkbVZ5ZEdWNENnb2dJQ0FnZG1Wak15Qm1NekpqWDNOallXeGxJRDBnWjJWMFgyWXpNbU5mYzJOaGJHVW9LVHNLSUNBZ0lIWmxZeklnYlhNZ1BTQm1NekpqWDNOallXeGxMbmg1SUNvZ1oyVjBYM0YxWVdSZmMyTmhiR1VvS1RzS0lDQWdJSFpsWXpJZ2NYVmhaRjl2Wm1aelpYUWdQU0JtTXpKalgzTmpZV3hsTG5oNUlDb2daMlYwWDNGMVlXUmZiMlptYzJWMEtDazdDaUFnSUNCMlpXTXpJRzFoY210bGNsOXZabVp6WlhRZ1BTQm1NekpqWDNOallXeGxJQ29nZEc5MlpXTXpLR2RsZEY5dFlYSnJaWEpmYjJabWMyVjBLQ2twT3dvS0lDQWdJSFpsWXpJZ1ltSnZlRjl5WVdScGRYTWdQU0F3TGpVZ0tpQnRjenNLSUNBZ0lIWmxZeklnYzNCeWFYUmxYMkppYjNoZlkyVnVkSEpsSUQwZ2NYVmhaRjl2Wm1aelpYUWdLeUJpWW05NFgzSmhaR2wxY3pzS0lDQWdJR1pmYzNCeWFYUmxYM05qWVd4bElEMGdiWE03Q2lBZ0lDQnRZWFEwSUhCMmFXVjNJRDBnY0hKdmFtVmpkR2x2YmlBcUlIWnBaWGM3Q2lBZ0lDQnRZWFEwSUhSeVlXNXpJRDBnWjJWMFgzUnlZVzV6Wm05eWJWOXRZWEpyWlhJb0tTQS9JRzF2WkdWc1gyWXpNbU1nT2lCdFlYUTBLREV1TUNrN0Nnb2dJQ0FnZG1Wak5DQndiM05wZEdsdmJsOTNiM0pzWkNBOUlHMXZaR1ZzWDJZek1tTWdLaUIyWldNMEtIUnZkbVZqTXloblpYUmZkMmRzWDNCdmMybDBhVzl1Y3lncEtTd2dNU2s3Q2lBZ0lDQndjbTlqWlhOelgyTnNhWEJmY0d4aGJtVnpLSEJ2YzJsMGFXOXVYM2R2Y214a0xuaDVlaWs3Q2dvZ0lDQWdMeThnUTI5dGNIVjBaU0JqWlc1MGNtVWdiMllnWW1sc2JHSnZZWEprSUdsdUlHTnNhWEJ3YVc1bklHTnZiM0prYVc1aGRHVnpDaUFnSUNBdkx5QkJiSGRoZVhNZ2RISmhibk5tYjNKdElIUmxlSFF2YzJOaGRIUmxjaUJ3YjNOcGRHbHZiaUJoY21kMWJXVnVkQW9nSUNBZ2RtVmpOQ0JrWVhSaFgzQnZhVzUwSUQwZ1oyVjBYM0J5WlhCeWIycGxZM1JwYjI0b0tTQXFJSEJ2YzJsMGFXOXVYM2R2Y214a093b2dJQ0FnTHk4Z2JXRjVZbVVnZEhKaGJuTm1iM0p0SUcxaGNtdGxjbDl2Wm1aelpYUWdLeUJuYkhsd2FDQnZabVp6WlhSekNpQWdJQ0JrWVhSaFgzQnZhVzUwSUQwZ2RtVmpOQ2hrWVhSaFgzQnZhVzUwTG5oNWVpQXZJR1JoZEdGZmNHOXBiblF1ZHlBcklHMWhkRE1vZEhKaGJuTXBJQ29nYldGeWEyVnlYMjltWm5ObGRDd2dNU2s3Q2lBZ0lDQmtZWFJoWDNCdmFXNTBJRDBnY0hacFpYY2dLaUJrWVhSaFgzQnZhVzUwT3dvS0lDQWdJQzh2SUVOdmJYQjFkR1VnZEhKaGJuTm1iM0p0SUdadmNpQjBhR1VnYjJabWMyVjBJSFpsWTNSdmNuTWdabkp2YlNCMGFHVWdZMlZ1ZEhKaGJDQndiMmx1ZEFvZ0lDQWdkSEpoYm5NZ1BTQW9aMlYwWDJKcGJHeGliMkZ5WkNncElEOGdjSEp2YW1WamRHbHZiaUE2SUhCMmFXVjNLU0FxSUhGdFlYUW9aMlYwWDJOdmJuWmxjblJsWkY5eWIzUmhkR2x2YmlncEtTQXFJSFJ5WVc1ek93b2dJQ0FnZG1Wak5DQnpjSEpwZEdWZlkyVnVkR1Z5SUQwZ2RISmhibk1nS2lCMlpXTTBLSE53Y21sMFpWOWlZbTk0WDJObGJuUnlaU3dnTUN3Z01DazdDZ29nSUNBZ2RtVmpOQ0IyWTJ4cGNDQTlJR1JoZEdGZmNHOXBiblFnS3lCemNISnBkR1ZmWTJWdWRHVnlPd29LSUNBZ0lDOHZJRVY0ZEhKaElHSjFabVpsY21sdVp5QnBjeUJ5WlhGMWFYSmxaQ0JoY205MWJtUWdjM0J5YVhSbGN5QjNhR2xqYUNCaGNtVWdZVzUwYVdGc2FXRnpaV1FnYzI4Z2RHaGhkQW9nSUNBZ0x5OGdkR2hsSUdGdWRHbGhiR2xoY3lCaWJIVnlJR1J2WlhOdUozUWdaMlYwSUdOMWRDQnZabVlnS0hObFpTQWpNVFVwTGlCVWFHbHpJR0pzZFhJZ1ptRnNiSE1nZEc4S0lDQWdJQzh2SUhwbGNtOGdZWFFnWVNCeVlXUnBkWE1nYjJZZ1FVNVVTVUZNU1VGVFgxSkJSRWxWVXlCd2FYaGxiSE1nYVc0Z2RHaGxJSFpwWlhkd2IzSjBJR052YjNKa2FXNWhkR1Z6Q2lBZ0lDQXZMeUJoYm1RZ2QyVWdkMkZ1ZENCMGJ5QmlkV1ptWlhJZ2RHaGxJSFpsY25ScFkyVnpJR2x1SUhSb1pTQXFjMjkxY21ObEtpQnpjSEpwZEdVZ1kyOXZjbVJwYm1GMFpRb2dJQ0FnTHk4Z2MzbHpkR1Z0SUhOdklIUm9ZWFFnZDJVZ1oyVjBJSFJvYVhNZ1lXMXZkVzUwSUdsdUlIUm9aU0J2ZFhSd2RYUWdZMjl2Y21ScGJtRjBaWE11Q2lBZ0lDQXZMd29nSUNBZ0x5OGdTR1Z5WlNCM1pTQmpZV3hqZFd4aGRHVWdkR2hsSUdSbGNtbDJZWFJwZG1VZ2IyWWdkR2hsSUcxaGNIQnBibWNnWm5KdmJTQnpjSEpwZEdVZ2VIa0tJQ0FnSUM4dklHTnZiM0prYVc1aGRHVnpJQ2hrWldacGJtVmtJR0o1SUdCMGNtRnVjMkFwSUdsdWRHOGdkR2hsSUhacFpYZHdiM0owSUhCcGVHVnNJR052YjNKa2FXNWhkR1Z6TGdvZ0lDQWdMeThnVkdobElHUmxjbWwyWVhScGRtVWdibVZsWkhNZ2RHOGdhVzVqYkhWa1pTQjBhR1VnY0hKdmNHVnlJSFJsY20wZ1ptOXlJSFJvWlNCd1pYSnpjR1ZqZEdsMlpRb2dJQ0FnTHk4Z1pHbDJhV1JsSUdsdWRHOGdUa1JETENCbGRtRnNkV0YwWldRZ1lYUWdkR2hsSUdObGJuUnlaU0J3YjJsdWRDQmdkbU5zYVhCZ0xnb2dJQ0FnYldGME5DQmtYMjVrWTE5a1gyTnNhWEFnUFNCdFlYUTBLQW9nSUNBZ0lDQWdJREV1TUM5MlkyeHBjQzUzTENBd0xqQXNJQ0FnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSURBdU1Dd0tJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnTVM0d0wzWmpiR2x3TG5jc0lEQXVNQ3dnSUNBZ0lDQWdJQ0F3TGpBc0NpQWdJQ0FnSUNBZ01DNHdMQ0FnSUNBZ0lDQWdJREF1TUN3Z0lDQWdJQ0FnSUNBeExqQXZkbU5zYVhBdWR5d2dNQzR3TEFvZ0lDQWdJQ0FnSUMxMlkyeHBjQzU0ZVhvdktIWmpiR2x3TG5jcWRtTnNhWEF1ZHlrc0lDQWdJQ0FnSUNBZ0lEQXVNQW9nSUNBZ0tUc0tJQ0FnSUcxaGRESWdaSGg1ZGw5a2VIbHpJRDBnWkdsaFoyMG9NQzQxSUNvZ2NIaGZjR1Z5WDNWdWFYUWdLaUJuWlhSZmNtVnpiMngxZEdsdmJpZ3BLU0FxSUcxaGRESW9aRjl1WkdOZlpGOWpiR2x3S25SeVlXNXpLVHNLSUNBZ0lDOHZJRTV2ZHl3Z2IzVnlJR0oxWm1abGNpQnphWHBsSUdseklHVjRjSEpsYzNObFpDQnBiaUIyYVdWM2NHOXlkQ0J3YVhobGJITWdZblYwSUhkbElHZGxkQ0JpWVdOcklIUnZDaUFnSUNBdkx5QjBhR1VnYzNCeWFYUmxJR052YjNKa2FXNWhkR1VnYzNsemRHVnRJSFZ6YVc1bklIUm9aU0J6WTJGc1pTQm1ZV04wYjNJZ2IyWWdkR2hsQ2lBZ0lDQXZMeUIwY21GdWMyWnZjbTFoZEdsdmJpQW9abTl5SUdsemIzUnliM0JwWXlCMGNtRnVjMlp2Y20xaGRHbHZibk1wTGlCR2IzSWdZVzVwYzI5MGNtOXdhV01LSUNBZ0lDOHZJSFJ5WVc1elptOXliV0YwYVc5dWN5d2dkR2hsSUdkbGIyMWxkSEpwWXlCdFpXRnVJRzltSUhSb1pTQjBkMjhnY0hKcGJtTnBjR3hsSUhOallXeGxJR1poWTNSdmNuTUtJQ0FnSUM4dklHbHpJR0VnY21WaGMyOXVZV0pzWlNCamIyMXdjbTl0YVhObE9nb2dJQ0FnWm14dllYUWdkbWxsZDNCdmNuUmZabkp2YlY5emNISnBkR1ZmYzJOaGJHVWdQU0J6Y1hKMEtHRmljeWhmWkdWMFpYSnRhVzVoYm5Rb1pIaDVkbDlrZUhsektTa3BPd29LSUNBZ0lDOHZJRWx1SUhSb1pTQm1jbUZuYldWdWRDQnphR0ZrWlhJZ2QyVWdkMkZ1ZENCdmRYSWdjMmxuYm1Wa0lHUnBjM1JoYm1ObElHbHVJSFpwWlhkd2IzSjBJQ2h3YVhobGJDa0tJQ0FnSUM4dklHTnZiM0prY3lCbWIzSWdaR2x5WldOMElIVnpaU0JwYmlCaGJuUnBZV3hwWVhOcGJtY2djM1JsY0NCbWRXNWpkR2x2Ym5NdUlGZGxJSFJvWlhKbFptOXlaU0J1WldWa0NpQWdJQ0F2THlCaElITmpZV3hwYm1jZ1ptRmpkRzl5SUhOcGJXbHNZWElnZEc4Z2RtbGxkM0J2Y25SZlpuSnZiVjl6Y0hKcGRHVmZjMk5oYkdVc0lHSjFkQ0JwYm1Oc2RXUnBibWNLSUNBZ0lDOHZJSFJvWlNCMWRpMCtjM0J5YVhSbElHTnZiM0prYVc1aGRHVWdjM2x6ZEdWdElITmpZV3hwYm1jZ1ptRmpkRzl5SUdGeklIZGxiR3d1SUNCWFpTQmphRzl2YzJVZ2RHOEtJQ0FnSUM4dklIVnpaU0IwYUdVZ1ltOTFibVJwYm1jZ1ltOTRJQ3A0S2lCM2FXUjBhQ0JtYjNJZ2RHaHBjeTRnVkdocGN5QmpiMjFsY3lCM2FYUm9JSE52YldVS0lDQWdJQzh2SUdOdmJuTnBjM1JsYm1ONUlHTnZibVJwZEdsdmJuTTZDaUFnSUNBdkx5QXFJRVp2Y2lCd2NtOWpaV1IxY21Gc0lHUnBjM1JoYm1ObElHWnBaV3hrY3l3Z2QyVWdibVZsWkNCMGFHVWdjM0J5YVhSbElHSnZkVzVrYVc1bklHSnZlQ0IwYnlCaVpRb2dJQ0FnTHk4Z0lDQnpjWFZoY21VdUlDaEpaaUJ1YjNRc0lIUm9aU0IxZGlCamIyOXlaR2x1WVhSbGN5QjNhV3hzSUdKbElHRnVhWE52ZEhKdmNHbGpZV3hzZVNCelkyRnNaV1FnWVc1a0NpQWdJQ0F2THlBZ0lHRnVlU0JqWVd4amRXeGhkR2x2YmlCaVlYTmxaQ0J2YmlCMGFHVnRJSGRwYkd3Z2JtOTBJR0psSUdFZ1pHbHpkR0Z1WTJVZ1puVnVZM1JwYjI0dUtRb2dJQ0FnTHk4Z0tpQkdiM0lnYzJGdGNHeGxaQ0JrYVhOMFlXNWpaU0JtYVdWc1pITXNJSGRsSUc1bFpXUWdkRzhnWTI5dWMybHpkR1Z1ZEd4NUlHTm9iMjl6WlNCMGFHVWdLbmdxQ2lBZ0lDQXZMeUFnSUdadmNpQjBhR1VnYzJOaGJHbHVaeUJwYmlCblpYUmZaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaU2dwTGdvZ0lDQWdabXh2WVhRZ2MzQnlhWFJsWDJaeWIyMWZkVjl6WTJGc1pTQTlJRzFwYmloaFluTW9iWE11ZUNrc0lHRmljeWh0Y3k1NUtTazdDaUFnSUNCbWNtRm5YM1YyYzJOaGJHVWdQU0IyYVdWM2NHOXlkRjltY205dFgzTndjbWwwWlY5elkyRnNaU0FxSUhOd2NtbDBaVjltY205dFgzVmZjMk5oYkdVN0NpQWdJQ0JtY21GblgyUnBjM1JoYm1ObFptbGxiR1JmYzJOaGJHVWdQU0JrYVhOMFlXNWpaV1pwWld4a1gzTmpZV3hsS0NrN0Nnb2dJQ0FnTHk4Z1lXUmtJSEJoWkdScGJtY2dabTl5SUVGQkxDQnpkSEp2YTJVZ1lXNWtJR2RzYjNjZ0tHNXZiaUJ1WVhScGRtVWdaR2x6ZEdGdVkyVm1hV1ZzWkhNZ1pHOXVKM1FnYm1WbFpBb2dJQ0FnTHk4Z1FVRWdjR0ZrWkdsdVp5QmlkWFFnUTBsU1EweEZJR1YwWXlCa2J5a0tJQ0FnSUdac2IyRjBJSEJ3ZFNBOUlHZGxkRjl3ZUY5d1pYSmZkVzVwZENncE93b2dJQ0FnWm14dllYUWdZbUp2ZUY5aWRXWWdQU0FvQ2lBZ0lDQWdJQ0FnUVU1VVNVRk1TVUZUWDFKQlJFbFZVeUFySUcxaGVDZ3dMakFzSUdkbGRGOXpkSEp2YTJWM2FXUjBhQ2dwSUNvZ2NIQjFLU0FySUcxaGVDZ3dMakFzSUdkbGRGOW5iRzkzZDJsa2RHZ29LU0FxSUhCd2RTa0tJQ0FnSUNrZ0x5QjJhV1YzY0c5eWRGOW1jbTl0WDNOd2NtbDBaVjl6WTJGc1pUc0tJQ0FnSUM4dklFMTFiSFJwY0d4NUlIUm9aU0JpZFdabVpYSWdZbmtnYzJsbmJpaGlZbTk0WDNKaFpHbDFjeWtnYzI4Z2RHaGhkQ0J0WVhKclpYSnphWHBsSUQwOUlEQWdZMnhsWVc1c2VRb2dJQ0FnTHk4Z1kyOXNiR0Z3YzJWeklIUm9aU0J3WVdSa1pXUWdZbUp2ZUNCMGJ5QjZaWEp2SUNnd0trbHVaaUE5UFNCT1lVNGdjSEp2Y0dGbllYUmxjeUIwYnlCbmJGOVFiM05wZEdsdmJnb2dJQ0FnTHk4Z1lXNWtJR2RsZEhNZ1kzVnNiR1ZrS1M0Z1YybDBhRzkxZENCMGFHbHpMQ0J0WVhKclpYSnphWHBsSUQwOUlEQWdkMjkxYkdRZ2NISnZaSFZqWlNCMmFYTnBZbXhsSUVGQkNpQWdJQ0F2THlCd1lXUmthVzVuTENCdFlYUmphR2x1WnlCSFRFMWhhMmxsSjNNZ1oyVnZiV1YwY25rZ2MyaGhaR1Z5SUdKbGFHRjJhVzl5TGdvZ0lDQWdkbVZqTWlCd1lXUmtaV1JmWW1KdmVGOXphWHBsSUQwZ1ltSnZlRjl5WVdScGRYTWdLeUJ6YVdkdUtHSmliM2hmY21Ga2FYVnpLU0FxSUdKaWIzaGZZblZtT3dvZ0lDQWdkbVZqTWlCMWRsOXdZV1JmYzJOaGJHVWdQU0J3WVdSa1pXUmZZbUp2ZUY5emFYcGxJQzhnWW1KdmVGOXlZV1JwZFhNN0Nnb2dJQ0FnWm5KaFoxOWpiMnh2Y2lBOUlIUnZkbVZqTkNoblpYUmZkbVZ5ZEdWNFgyTnZiRzl5S0NrcE93b2dJQ0FnWm5KaFoxOXpkSEp2YTJWamIyeHZjaUE5SUhSdmRtVmpOQ2huWlhSZlkyOXVkbVZ5ZEdWa1gzTjBjbTlyWldOdmJHOXlLQ2twT3dvZ0lDQWdabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2dnUFNCblpYUmZjMlJtWDNWMktDazdDaUFnSUNBdkx5Qm5aWFJmZFhZb0tTQnlaWFIxY201eklDZ3dMQ0F3S1N3Z0tERXNJREFwTENBb01Dd2dNU2tnYjNJZ0tERXNJREVwQ2lBZ0lDQXZMeUIwYnlCaFkyTnZiVzlrWVhSbElITjBjbTlyWlNCaGJtUWdaMnh2ZDNkcFpIUm9JSGRsSUc1bFpXUWdkRzhnWlhoMGNuVmtaU0IxZGlkeklHOTFkSGRoY21SeklHWnliMjBnS0RBdU5Td2dNQzQxS1FvZ0lDQWdabkpoWjE5MWRpQTlJSFpsWXpJb01DNDFLU0FySUNoblpYUmZkWFlvS1NBdElIWmxZeklvTUM0MUtTa2dLaUIxZGw5d1lXUmZjMk5oYkdVN0Nnb2dJQ0FnTHk4Z2MyTnlaV1Z1SUhOd1lXTmxJR052YjNKa2FXNWhkR1Z6SUc5bUlIUm9aU0J3YjNOcGRHbHZiZ29nSUNBZ2RtVmpOQ0J4ZFdGa1gzWmxjblJsZUNBOUlDaDBjbUZ1Y3lBcUlIWmxZelFvTWk0d0lDb2djR0ZrWkdWa1gySmliM2hmYzJsNlpTQXFJR2RsZEY5d2IzTnBkR2x2YmlncExDQXdMakFzSURBdU1Da3BPd29nSUNBZ1oyeGZVRzl6YVhScGIyNGdQU0IyWTJ4cGNDQXJJSEYxWVdSZmRtVnlkR1Y0T3dvZ0lDQWdaMnhmVUc5emFYUnBiMjR1ZWlBclBTQm5iRjlRYjNOcGRHbHZiaTUzSUNvZ1oyVjBYMlJsY0hSb1gzTm9hV1owS0NrN0Nnb2dJQ0FnWm5KaFoxOXBibk4wWVc1alpWOXBaQ0E5SUhWcGJuUW9aMnhmU1c1emRHRnVZMlZKUkNrN0NuMEtDcTltY21GbmJXVnVkRjl6YjNWeVkyWGFKUjRLY0hKbFkybHphVzl1SUdocFoyaHdJR2x1ZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqTkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl6UkRzS0NtOTFkQ0IyWldNMElHWnlZV2R0Wlc1MFgyTnZiRzl5T3dvS0x5OGdWVzVwWm05eWJYTTZJQXAxYm1sbWIzSnRJR0p2YjJ3Z2RXNXBabTl5YlY5amIyeHZjbTFoY0RzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbTFoY0NncGUzSmxkSFZ5YmlCMWJtbG1iM0p0WDJOdmJHOXliV0Z3TzMwS2RXNXBabTl5YlNCMWFXNTBJRzlpYW1WamRGOXBaRHNLZFdsdWRDQm5aWFJmYjJKcVpXTjBYMmxrS0NsN2NtVjBkWEp1SUc5aWFtVmpkRjlwWkR0OUNuVnVhV1p2Y20wZ2JXRjBOQ0J0YjJSbGJGOW1NekpqT3dwdFlYUTBJR2RsZEY5dGIyUmxiRjltTXpKaktDbDdjbVYwZFhKdUlHMXZaR1ZzWDJZek1tTTdmUXAxYm1sbWIzSnRJR2x1ZENCelpHWmZiV0Z5YTJWeVgzTm9ZWEJsT3dwcGJuUWdaMlYwWDNOa1psOXRZWEpyWlhKZmMyaGhjR1VvS1h0eVpYUjFjbTRnYzJSbVgyMWhjbXRsY2w5emFHRndaVHQ5Q25WdWFXWnZjbTBnWm14dllYUWdaMnh2ZDNkcFpIUm9Pd3BtYkc5aGRDQm5aWFJmWjJ4dmQzZHBaSFJvS0NsN2NtVjBkWEp1SUdkc2IzZDNhV1IwYUR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsT3dwbWJHOWhkQ0JuWlhSZllYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbEtDbDdjbVYwZFhKdUlHRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpUdDlDblZ1YVdadmNtMGdZbTl2YkNCd1lYUjBaWEp1T3dwaWIyOXNJR2RsZEY5d1lYUjBaWEp1S0NsN2NtVjBkWEp1SUhCaGRIUmxjbTQ3ZlFwMWJtbG1iM0p0SUdKdmIyd2djR2xqYTJsdVp6c0tZbTl2YkNCblpYUmZjR2xqYTJsdVp5Z3BlM0psZEhWeWJpQndhV05yYVc1bk8zMEtkVzVwWm05eWJTQmliMjlzSUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlRzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbkpoYm1kbEtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUdDlDblZ1YVdadmNtMGdabXh2WVhRZ2NIaGZjR1Z5WDNWdWFYUTdDbVpzYjJGMElHZGxkRjl3ZUY5d1pYSmZkVzVwZENncGUzSmxkSFZ5YmlCd2VGOXdaWEpmZFc1cGREdDlDblZ1YVdadmNtMGdjMkZ0Y0d4bGNqSkVJR1JwYzNSaGJtTmxabWxsYkdRN0NuVnVhV1p2Y20wZ2RtVmpOQ0J1WVc1ZlkyOXNiM0k3Q25abFl6UWdaMlYwWDI1aGJsOWpiMnh2Y2lncGUzSmxkSFZ5YmlCdVlXNWZZMjlzYjNJN2ZRcDFibWxtYjNKdElHWnNiMkYwSUhOMGNtOXJaWGRwWkhSb093cG1iRzloZENCblpYUmZjM1J5YjJ0bGQybGtkR2dvS1h0eVpYUjFjbTRnYzNSeWIydGxkMmxrZEdnN2ZRcDFibWxtYjNKdElIWmxZek1nWmpNeVkxOXpZMkZzWlRzS2RtVmpNeUJuWlhSZlpqTXlZMTl6WTJGc1pTZ3BlM0psZEhWeWJpQm1NekpqWDNOallXeGxPMzBLZFc1cFptOXliU0IyWldNeUlISmxjMjlzZFhScGIyNDdDblpsWXpJZ1oyVjBYM0psYzI5c2RYUnBiMjRvS1h0eVpYUjFjbTRnY21WemIyeDFkR2x2Ymp0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWkdWd2RHaGZjMmhwWm5RN0NtWnNiMkYwSUdkbGRGOWtaWEIwYUY5emFHbG1kQ2dwZTNKbGRIVnliaUJrWlhCMGFGOXphR2xtZER0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JzYjNkamJHbHdYMk52Ykc5eU93cDJaV00wSUdkbGRGOXNiM2RqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUd4dmQyTnNhWEJmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR0p2YjJ3Z1ltbHNiR0p2WVhKa093cGliMjlzSUdkbGRGOWlhV3hzWW05aGNtUW9LWHR5WlhSMWNtNGdZbWxzYkdKdllYSmtPMzBLZFc1cFptOXliU0J0WVhRMElIQnlaWEJ5YjJwbFkzUnBiMjQ3Q20xaGREUWdaMlYwWDNCeVpYQnliMnBsWTNScGIyNG9LWHR5WlhSMWNtNGdjSEpsY0hKdmFtVmpkR2x2Ymp0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IxYm1sbWIzSnRYMk52Ykc5eU93cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5S0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSTdmUXAxYm1sbWIzSnRJSFpsWXpRZ2FHbG5hR05zYVhCZlkyOXNiM0k3Q25abFl6UWdaMlYwWDJocFoyaGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR2hwWjJoamJHbHdYMk52Ykc5eU8zMEtkVzVwWm05eWJTQjJaV00wSUdkc2IzZGpiMnh2Y2pzS2RtVmpOQ0JuWlhSZloyeHZkMk52Ykc5eUtDbDdjbVYwZFhKdUlHZHNiM2RqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCMGNtRnVjMlp2Y20xZmJXRnlhMlZ5T3dwaWIyOXNJR2RsZEY5MGNtRnVjMlp2Y20xZmJXRnlhMlZ5S0NsN2NtVjBkWEp1SUhSeVlXNXpabTl5YlY5dFlYSnJaWEk3ZlFvS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhVzUwT3dvS2FXNGdkbVZqTkNCbWNtRm5YMk52Ykc5eU93cHBiaUIyWldNeUlHWnlZV2RmZFhZN0Nnb2paR1ZtYVc1bElFTkpVa05NUlNBZ0lDQWdJQ0FnSUNBZ0lEQUtJMlJsWm1sdVpTQlNSVU5VUVU1SFRFVWdJQ0FnSUNBZ0lDQXhDaU5rWldacGJtVWdVazlWVGtSRlJGOVNSVU5VUVU1SFRFVWdNZ29qWkdWbWFXNWxJRVJKVTFSQlRrTkZSa2xGVEVRZ0lDQWdJRE1LSTJSbFptbHVaU0JVVWtsQlRrZE1SU0FnSUNBZ0lDQWdJQ0EwQ2dvalpHVm1hVzVsSUUxZlUxRlNWRjh5SUNBZ0lDQWdJQ0FnSURFdU5ERTBNakV6TlFvS0NpOHZJRWhoYkdZZ2QybGtkR2dnYjJZZ1lXNTBhV0ZzYVdGemFXNW5JSE50YjI5MGFITjBaWEFLSTJSbFptbHVaU0JCVGxSSlFVeEpRVk5mVWtGRVNWVlRJREF1TnpBM01UQTJOemd4TVRnMk5UUTNOZ29LYVc0Z1pteHZZWFFnWm5KaFoxOTFkbk5qWVd4bE93cHBiaUJtYkc5aGRDQm1jbUZuWDJScGMzUmhibU5sWm1sbGJHUmZjMk5oYkdVN0NtbHVJSFpsWXpRZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZzdDbVpzWVhRZ2FXNGdkV2x1ZENCbWNtRm5YMmx1YzNSaGJtTmxYMmxrT3dwcGJpQm1iRzloZENCdlgyTnNhWEJmWkdsemRHRnVZMlZiT0YwN0NtWnNZWFFnYVc0Z2RtVmpNaUJtWDNOd2NtbDBaVjl6WTJGc1pUc0tabXhoZENCcGJpQjJaV00wSUdaeVlXZGZjM1J5YjJ0bFkyOXNiM0k3Q2dwMWJtbG1iM0p0SUdsdWRDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzS0NpOHZJRlJvWlhObElIWmxjbk5wYjI1eklHOW1JR0ZoYzNSbGNDQmhjM04xYldVZ2RHaGhkQ0JnWkdsemRHQWdhWE1nWVNCemFXZHVaV1FnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjRLTHk4Z2QyaHBZMmdnYUdGeklHSmxaVzRnYzJOaGJHVmtJSFJ2SUdKbElHbHVJSFZ1YVhSeklHOW1JSEJwZUdWc2N5NEtabXh2WVhRZ1lXRnpkR1Z3S0dac2IyRjBJSFJvY21WemFHOXNaREVzSUdac2IyRjBJR1JwYzNRc0lHWnNiMkYwSUdGaEtTQjdDaUFnSUNCeVpYUjFjbTRnYzIxdmIzUm9jM1JsY0NoMGFISmxjMmh2YkdReElDMGdZV0VzSUhSb2NtVnphRzlzWkRFZ0t5QmhZU3dnWkdsemRDazdDbjBLQ21ac2IyRjBJR0ZoYzNSbGNDaG1iRzloZENCMGFISmxjMmh2YkdReExDQm1iRzloZENCMGFISmxjMmh2YkdReUxDQm1iRzloZENCa2FYTjBMQ0JtYkc5aGRDQmhZU2tnZXdvZ0lDQWdjbVYwZFhKdUlITnRiMjkwYUhOMFpYQW9kR2h5WlhOb2IyeGtNU0F0SUdGaExDQjBhSEpsYzJodmJHUXhJQ3NnWVdFc0lHUnBjM1FwSUMwS0lDQWdJQ0FnSUNBZ0lDQnpiVzl2ZEdoemRHVndLSFJvY21WemFHOXNaRElnTFNCaFlTd2dkR2h5WlhOb2IyeGtNaUFySUdGaExDQmthWE4wS1RzS2ZRb0tMeThnVUhKdlkyVmtkWEpoYkNCemFXZHVaV1FnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjV6SUc5dUlIUm9aU0IxZGlCamIyOXlaR2x1WVhSbElIQmhkR05vSUZzd0xERmRlRnN3TERGZENpOHZJRTV2ZEdVZ2RHaGhkQ0JtYjNJZ1lXNTBhV0ZzYVdGemFXNW5JSFJ2SUhkdmNtc2djSEp2Y0dWeWJIa2dkR2hsYzJVZ2MyaHZkV3hrSUdKbElDcHpZMkZzWlNCd2NtVnpaWEoyYVc1bktnb3ZMeUFvU1dZZ2VXOTFJRzExYzNRZ2NtVnpZMkZzWlNCMWRpd2diV0ZyWlNCemRYSmxJSFJ2SUhCMWRDQjBhR1VnYzJOaGJHVWdabUZqZEc5eUlHSmhZMnNnYVc0Z2JHRjBaWEl1S1FwbWJHOWhkQ0IwY21saGJtZHNaU2gyWldNeUlGQXBld29nSUNBZ1VDQXRQU0IyWldNeUtEQXVOU2s3Q2lBZ0lDQm1iRzloZENCNElEMGdUVjlUVVZKVVh6SWdLaUFvVUM1NElDMGdVQzU1S1RzS0lDQWdJR1pzYjJGMElIa2dQU0JOWDFOUlVsUmZNaUFxSUNoUUxuZ2dLeUJRTG5rcE93b2dJQ0FnWm14dllYUWdjakVnUFNCdFlYZ29ZV0p6S0hncExDQmhZbk1vZVNrcElDMGdNUzR3THlneUxqQXFUVjlUVVZKVVh6SXBPd29nSUNBZ1pteHZZWFFnY2pJZ1BTQlFMbms3Q2lBZ0lDQnlaWFIxY200Z0xXMWhlQ2h5TVN4eU1pazdDbjBLQ21ac2IyRjBJR05wY21Oc1pTaDJaV015SUhWMktYc0tJQ0FnSUhKbGRIVnliaUF3TGpVdGJHVnVaM1JvS0hWMkxYWmxZeklvTUM0MUtTazdDbjBLQ21ac2IyRjBJSEpsWTNSaGJtZHNaU2gyWldNeUlIVjJLU0I3Q2lBZ0lDQjJaV015SUhNZ1BTQm1YM053Y21sMFpWOXpZMkZzWlNBdklHMXBiaWhtWDNOd2NtbDBaVjl6WTJGc1pTNTRMQ0JtWDNOd2NtbDBaVjl6WTJGc1pTNTVLVHNLSUNBZ0lIWmxZeklnWkNBOUlITWdLaUJ0WVhnb0xYVjJMQ0IxZGlBdElIWmxZeklvTVNrcE93b2dJQ0FnY21WMGRYSnVJQzBvS0d4bGJtZDBhQ2h0WVhnb2RtVmpNaWd3TGpBcExDQmtLU2tnS3lCdGFXNG9NQzR3TENCdFlYZ29aQzU0TENCa0xua3BLU2twT3dwOUNncG1iRzloZENCeWIzVnVaR1ZrWDNKbFkzUmhibWRzWlNoMlpXTXlJSFYyTENCMlpXTXlJSFJzTENCMlpXTXlJR0p5S1hzS0lDQWdJSFpsWXpJZ1pDQTlJRzFoZUNoMGJDMTFkaXdnZFhZdFluSXBPd29nSUNBZ2NtVjBkWEp1SUMwb0tHeGxibWQwYUNodFlYZ29kbVZqTWlnd0xqQXBMQ0JrS1NrZ0t5QnRhVzRvTUM0d0xDQnRZWGdvWkM1NExDQmtMbmtwS1NrdGRHd3VlQ2s3Q24wS0NuWmxZelFnWm1sc2JDaDJaV00wSUdacGJHeGpiMnh2Y2l3Z2RtVmpOQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpa2dld29nSUNBZ2NtVjBkWEp1SUdOdmJHOXlPd3A5Q25abFl6UWdabWxzYkNoMlpXTTBJR1pwYkd4amIyeHZjaXdnWm14dllYUWdZMjlzYjNJc0lIWmxZeklnZFhZcElIc0tJQ0FnSUhKbGRIVnliaUJtYVd4c1kyOXNiM0k3Q24wS2RtVmpOQ0JtYVd4c0tIWmxZelFnWm1sc2JHTnZiRzl5TENCaWIyOXNJR2x0WVdkbExDQjJaV015SUhWMktTQjdJSEpsZEhWeWJpQm1hV3hzWTI5c2IzSTdJSDBLZG1Wak5DQm1hV3hzS0habFl6UWdZeXdnYzJGdGNHeGxjakpFSUdsdFlXZGxMQ0IyWldNeUlIVjJLU0I3SUhKbGRIVnliaUIwWlhoMGRYSmxLR2x0WVdkbExDQjFkaTU1ZUNrN0lIMEtDblp2YVdRZ2MzUnliMnRsS0habFl6UWdjM1J5YjJ0bFkyOXNiM0lzSUdac2IyRjBJSE5wWjI1bFpGOWthWE4wWVc1alpTd2dabXh2WVhRZ2QybGtkR2dzSUdsdWIzVjBJSFpsWXpRZ1kyOXNiM0lzSUdac2IyRjBJR0ZoWDNKaFpHbDFjeWw3Q2lBZ0lDQnBaaUFvZDJsa2RHZ2dJVDBnTUM0d0tYc0tJQ0FnSUNBZ0lDQm1iRzloZENCMElEMGdZV0Z6ZEdWd0tHMXBiaWgzYVdSMGFDd2dNQzR3S1N3Z2JXRjRLSGRwWkhSb0xDQXdMakFwTENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdGaFgzSmhaR2wxY3lrN0NpQWdJQ0FnSUNBZ2RtVmpOQ0JpWjE5amIyeHZjaUE5SUcxcGVDaGpiMnh2Y2l3Z2RtVmpOQ2h6ZEhKdmEyVmpiMnh2Y2k1eVoySXNJREFwTENCbWJHOWhkQ2h6YVdkdVpXUmZaR2x6ZEdGdVkyVWdQQ0F3TGpVZ0tpQjNhV1IwYUNrcE93b2dJQ0FnSUNBZ0lHTnZiRzl5SUQwZ2JXbDRLR0puWDJOdmJHOXlMQ0J6ZEhKdmEyVmpiMnh2Y2l3Z2RDazdDaUFnSUNCOUNuMEtDblp2YVdRZ1oyeHZkeWgyWldNMElHZHNiM2RqYjJ4dmNpd2dabXh2WVhRZ2MybG5ibVZrWDJScGMzUmhibU5sTENCbWJHOWhkQ0JwYm5OcFpHVXNJR2x1YjNWMElIWmxZelFnWTI5c2IzSXBld29nSUNBZ1pteHZZWFFnWjJ4dmQxOTNhV1IwYUNBOUlHZGxkRjluYkc5M2QybGtkR2dvS1NBcUlHZGxkRjl3ZUY5d1pYSmZkVzVwZENncE93b2dJQ0FnWm14dllYUWdjM1J5YjJ0bFgzZHBaSFJvSUQwZ1oyVjBYM04wY205clpYZHBaSFJvS0NrZ0tpQm5aWFJmY0hoZmNHVnlYM1Z1YVhRb0tUc0tJQ0FnSUdsbUlDaG5iRzkzWDNkcFpIUm9JRDRnTUM0d0tYc0tJQ0FnSUNBZ0lDQm1iRzloZENCdmRYUnphV1JsSUQwZ0tHRmljeWh6YVdkdVpXUmZaR2x6ZEdGdVkyVXBJQzBnYzNSeWIydGxYM2RwWkhSb0tTQXZJR2RzYjNkZmQybGtkR2c3Q2lBZ0lDQWdJQ0FnWm14dllYUWdZV3h3YUdFZ1BTQXhMakFnTFNCdmRYUnphV1JsT3dvZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnYldsNEtIWmxZelFvWjJ4dmQyTnZiRzl5TG5Kbllpd2daMnh2ZDJOdmJHOXlMbUVxWVd4d2FHRXBMQ0JqYjJ4dmNpd2dhVzV6YVdSbEtUc0tJQ0FnSUgwS2ZRb0tabXh2WVhRZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9jMkZ0Y0d4bGNqSkVJR1JwYzNSaGJtTmxabWxsYkdRc0lIWmxZeklnZFhZcGV3b2dJQ0FnTHk4Z1IyeDVjR2dnWkdsemRHRnVZMlVnWm1sbGJHUWdkVzVwZEhNZ1lYSmxJR2x1SUhCcGVHVnNjeTRnUTI5dWRtVnlkQ0IwYnlCellXMWxJR1JwYzNSaGJtTmxDaUFnSUNBdkx5QnpZMkZzYVc1bklHRnpJR1pmZFhZdWVDQm1iM0lnWTI5dWMybHpkR1Z1WTNrZ2QybDBhQ0IwYUdVZ2NISnZZMlZrZFhKaGJDQnphV2R1WldSZlpHbHpkR0Z1WTJVS0lDQWdJQzh2SUdOaGJHTjFiR0YwYVc5dWN5NEtJQ0FnSUhKbGRIVnliaUJtY21GblgyUnBjM1JoYm1ObFptbGxiR1JmYzJOaGJHVWdLaUIwWlhoMGRYSmxLR1JwYzNSaGJtTmxabWxsYkdRc0lIVjJLUzV5T3dwOUNncG1iRzloZENCelkyRnNaV1JmWkdsemRHRnVZMlZtYVdWc1pDaGliMjlzSUdScGMzUmhibU5sWm1sbGJHUXNJSFpsWXpJZ2RYWXBld29nSUNBZ2NtVjBkWEp1SURBdU1Ec0tmUW9LTHk4Z1IybDJaVzRnWVNCbWNtRm5iV1Z1ZENCa1pYSnBkbUYwYVhabElHOW1JR1pmZFhZZ0tHa3VaUzRnWkVaa2VDaG1YM1YyS1NCdmNpQmtSbVI1S0daZmRYWXBLU3dnWTJGc1kzVnNZWFJsQ2k4dklIUm9aU0JoYzNOdlkybGhkR1ZrSUNoemNYVmhjbVZrS1NCamFHRnVaMlVnYVc0Z2RHaGxJR1JwYzNSaGJtTmxabWxsYkdRdUlGUm9hWE1nYVhNZ1pXWm1aV04wYVhabGJIa2dkR2hsQ2k4dklDaHpjWFZoY21Wa0tTQndZWEowYVdGc0lHUmxjbWwyWVhScGRtVWdiMllnZEdobElHUnBjM1JoYm1ObFptbGxiR1FnZDJsMGFDQnlaWE53WldOMElIUnZJR1p5WVdkdFpXNTBDaTh2SUNod2FYaGxiQ2tnWTI5dmNtUnBibUYwWlhNS1pteHZZWFFnYzNGMVlYSmxaRjl3WVhKMGFXRnNYMlJsY21sMllYUmxLR1pzYjJGMElHTmxiblJsY2l3Z2RtVmpNaUJrWmw5MWRpa2dld29nSUNBZ2RtVmpNaUIxZGpFZ1BTQnRhWGdvWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdndWVIa3NJR1p5WVdkZmRYWmZiMlptYzJWMFgzZHBaSFJvTG5wM0xDQmpiR0Z0Y0NobWNtRm5YM1YySUNzZ01DNDFJQ29nWkdaZmRYWXNJREF1TUN3Z01TNHdLU2s3Q2lBZ0lDQjJaV015SUhWMk1DQTlJRzFwZUNobWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFDNTRlU3dnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdndWVuY3NJR05zWVcxd0tHWnlZV2RmZFhZZ0xTQXdMalVnS2lCa1psOTFkaXdnTUM0d0xDQXhMakFwS1RzS0lDQWdJQzh2SUVsMElHTmhiaUJvWVhCd1pXNGdkR2hoZENCdmRYSWdabkpoWjIxbGJuUWdhWE1nWTJ4dmMyVWdkRzhnWVNCdFlYaHBiWFZ0SUdsdUlIUm9aU0JrYVhOMFlXNWpaV1pwWld4a0NpQWdJQ0F2THlCMFpYaDBkWEpsTGlCSmJpQjBhR2x6SUdOaGMyVWdkR2hsSUdSbGNtbDJZWFJsSUdKaGMyVmtJRzl1SUdFZ2NHOXBiblFnZEc4Z2RHaGxJR3hsWm5RZ1lXNWtJSEpwWjJoMENpQWdJQ0F2THlCallXNGdZbVVnWTJ4dmMyVWdkRzhnTUNCM2FHVnVJR2wwSUhOb2IzVnNaRzRuZENCaVpTNGdWRzhnWVhadmFXUWdkR2hwY3lCM1pTQmpZV3hqZFd4aGRHVWdZUW9nSUNBZ0x5OGdaR1Z5YVhaaGRHbDJaU0IwYnlCbGFYUm9aWElnYzJsa1pTQmhibVFnZEdGclpTQjBhR1VnYzNSeWIyNW5aWElnYjI1bExnb2dJQ0FnWm14dllYUWdaR1l4SUQwZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9aR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RYWXhLU0F0SUdObGJuUmxjanNLSUNBZ0lHWnNiMkYwSUdSbU1pQTlJR05sYm5SbGNpQXRJSE5qWVd4bFpGOWthWE4wWVc1alpXWnBaV3hrS0dScGMzUmhibU5sWm1sbGJHUXNJSFYyTUNrN0NpQWdJQ0J5WlhSMWNtNGdNaTR3SUNvZ2JXRjRLR1JtTVNBcUlHUm1NU3dnWkdZeUlDb2daR1l5S1RzS2ZRb0tMeThnUTJGc1kzVnNZWFJsSUhSb1pTQmhiblJwTFdGc2FXRnphVzVuSUhKaFpHbDFjeUJpWVhObFpDQnZiaUJvYjNjZ2JYVmphQ0IwYUdVZ1pHbHpkR0Z1WTJVZ1ptbGxiR1FnWTJoaGJtZGxjd292THlCeVpXeGhkR2wyWlNCMGJ5QnVaV2xuYUdKdmNtbHVaeUJ6WVcxd2JHVnpMaUJKWmlCMGFHVWdaSEpoZDI0Z2NYVmhaQ0J6WVcxd2JHVnpJSFJvWlNCa2FYTjBZVzVqWlNCbWFXVnNaQW92THlCM2FYUm9JSE52YldVZ1pHbHpkRzl5ZEdsdmJpd2dhWFFnZDJsc2JDQmlaU0J3YVdOclpXUWdkWEFnYUdWeVpTQmhibVFnWTI5dGNHVnVjMkYwWldRZ2FXNGdZMmhoYm1kbGN5QjBid292THlCMGFHVWdZVzUwYVMxaGJHbGhjMmx1WnlCeVlXUnBkWE11Q21ac2IyRjBJR0Z6Y0dWamRGOWpiM0p5WldOMFpXUmZiRzlqWVd4ZllXRmZjbUZrYVhWektHWnNiMkYwSUhOcFoyNWxaRjlrYVhOMFlXNWpaU2tnZXdvZ0lDQWdjbVYwZFhKdUlHWnlZV2RmZFhaelkyRnNaU0FxSUVGT1ZFbEJURWxCVTE5U1FVUkpWVk1nS2lCTlgxTlJVbFJmTWlBcUlITnhjblFvQ2lBZ0lDQWdJQ0FnYzNGMVlYSmxaRjl3WVhKMGFXRnNYMlJsY21sMllYUmxLSE5wWjI1bFpGOWthWE4wWVc1alpTd2daRVprZUNobWNtRm5YM1YyS1NrZ0t3b2dJQ0FnSUNBZ0lITnhkV0Z5WldSZmNHRnlkR2xoYkY5a1pYSnBkbUYwWlNoemFXZHVaV1JmWkdsemRHRnVZMlVzSUdSR1pIa29abkpoWjE5MWRpa3BDaUFnSUNBcE93cDlDZ3AyWldNeUlHVnVZMjlrWlY5MWFXNTBYM1J2WDJac2IyRjBLSFZwYm5RZ2RtRnNkV1VwSUhzS0lDQWdJR1pzYjJGMElHeHZkMlZ5SUQwZ1pteHZZWFFvZG1Gc2RXVWdKaUF3ZUVaR1JrWjFLU0F2SURZMU5UTTFMakE3Q2lBZ0lDQm1iRzloZENCMWNIQmxjaUE5SUdac2IyRjBLSFpoYkhWbElENCtJREUyZFNrZ0x5QTJOVFV6TlM0d093b2dJQ0FnY21WMGRYSnVJSFpsWXpJb2JHOTNaWElzSUhWd2NHVnlLVHNLZlFvS2RtVmpOQ0J3WVdOclgybHVkQ2gxYVc1MElHbGtMQ0IxYVc1MElHbHVaR1Y0S1NCN0NpQWdJQ0IyWldNMElIVnVjR0ZqYXpzS0lDQWdJSFZ1Y0dGamF5NXlaeUE5SUdWdVkyOWtaVjkxYVc1MFgzUnZYMlpzYjJGMEtHbGtLVHNLSUNBZ0lIVnVjR0ZqYXk1aVlTQTlJR1Z1WTI5a1pWOTFhVzUwWDNSdlgyWnNiMkYwS0dsdVpHVjRLVHNLSUNBZ0lISmxkSFZ5YmlCMWJuQmhZMnM3Q24wS0NuWnZhV1FnYldGcGJpZ3BJSHNLSUNBZ0lHWnZjaUFvYVc1MElHa2dQU0F3T3lCcElEd2dkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNN0lHa3JLeWtLSUNBZ0lDQWdJQ0JwWmlBb2IxOWpiR2x3WDJScGMzUmhibU5sVzJsZElEd2dNQzR3S1FvZ0lDQWdJQ0FnSUNBZ0lDQmthWE5qWVhKa093b0tJQ0FnSUdac2IyRjBJSE5wWjI1bFpGOWthWE4wWVc1alpTQTlJREF1TURzS0NpQWdJQ0IyWldNMElIVjJYMjltWmlBOUlHWnlZV2RmZFhaZmIyWm1jMlYwWDNkcFpIUm9Pd29nSUNBZ2RtVmpNaUIwWlhoZmRYWWdQU0J0YVhnb2RYWmZiMlptTG5oNUxDQjFkbDl2Wm1ZdWVuY3NJR05zWVcxd0tHWnlZV2RmZFhZc0lEQXVNQ3dnTVM0d0tTazdDaUFnSUNCbWJHOWhkQ0JoWVY5eVlXUnBkWE1nUFNCQlRsUkpRVXhKUVZOZlVrRkVTVlZUT3dvS0lDQWdJR2x1ZENCemFHRndaU0E5SUdkbGRGOXpaR1pmYldGeWEyVnlYM05vWVhCbEtDazdDaUFnSUNCcFppaHphR0Z3WlNBOVBTQkRTVkpEVEVVcENpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ1kybHlZMnhsS0daeVlXZGZkWFlwT3dvZ0lDQWdaV3h6WlNCcFppaHphR0Z3WlNBOVBTQkVTVk5VUVU1RFJVWkpSVXhFS1NCN0NpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9aR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RHVjRYM1YyS1RzS0lDQWdJQ0FnSUNCaFlWOXlZV1JwZFhNZ1BTQmhjM0JsWTNSZlkyOXljbVZqZEdWa1gyeHZZMkZzWDJGaFgzSmhaR2wxY3loemFXZHVaV1JmWkdsemRHRnVZMlVwT3dvZ0lDQWdJQ0FnSUdsbUlDaG5aWFJmYzNSeWIydGxkMmxrZEdnb0tTQStJREF1TUNCOGZDQm5aWFJmWjJ4dmQzZHBaSFJvS0NrZ1BpQXdMakFwSUhzS0lDQWdJQ0FnSUNBZ0lDQWdMeThnUTI5dGNHVnVjMkYwWlNCbWIzSWdkR2hsSUdOc1lXMXdhVzVuSUc5bUlIUmxlRjkxZGlCaWVTQmhiaUJoY0hCeWIzaHBiV0YwWlFvZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJsZUhSbGJuTnBiMjRnYjJZZ2RHaGxJSE5wWjI1bFpDQmthWE4wWVc1alpTQnZkWFJ6YVdSbElIUm9aU0IyWVd4cFpDQjBaWGgwZFhKbENpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhKbFoybHZiaTRLSUNBZ0lDQWdJQ0FnSUNBZ2RtVmpNaUJpZFdaMWRpQTlJR1p5WVdkZmRYWWdMU0JqYkdGdGNDaG1jbUZuWDNWMkxDQXdMakFzSURFdU1DazdDaUFnSUNBZ0lDQWdJQ0FnSUhOcFoyNWxaRjlrYVhOMFlXNWpaU0F0UFNCc1pXNW5kR2dvWW5WbWRYWXBPd29nSUNBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCcFppaHphR0Z3WlNBOVBTQlNUMVZPUkVWRVgxSkZRMVJCVGtkTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQnliM1Z1WkdWa1gzSmxZM1JoYm1kc1pTaG1jbUZuWDNWMkxDQjJaV015S0RBdU1pa3NJSFpsWXpJb01DNDRLU2s3Q2lBZ0lDQmxiSE5sSUdsbUtITm9ZWEJsSUQwOUlGSkZRMVJCVGtkTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQnlaV04wWVc1bmJHVW9abkpoWjE5MWRpazdJQzh2SUhKbFkzUmhibWRzWlNobVgzVjJLVHNLSUNBZ0lHVnNjMlVnYVdZb2MyaGhjR1VnUFQwZ1ZGSkpRVTVIVEVVcENpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ2RISnBZVzVuYkdVb1puSmhaMTkxZGlrN0Nnb2dJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJQ285SUdaeVlXZGZkWFp6WTJGc1pUc0tDZ29nSUNBZ1pteHZZWFFnYzNSeWIydGxYM2RwWkhSb0lEMGdaMlYwWDNOMGNtOXJaWGRwWkhSb0tDa2dLaUJuWlhSZmNIaGZjR1Z5WDNWdWFYUW9LVHNLSUNBZ0lHWnNiMkYwSUdsdWMybGtaVjl6ZEdGeWRDQTlJRzFoZUNndGMzUnliMnRsWDNkcFpIUm9MQ0F3TGpBcE93b2dJQ0FnWm14dllYUWdhVzV6YVdSbElEMGdZV0Z6ZEdWd0tHbHVjMmxrWlY5emRHRnlkQ3dnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JoWVY5eVlXUnBkWE1wT3dvS0lDQWdJSFpsWXpRZ1ptbHVZV3hmWTI5c2IzSWdQU0JtYVd4c0tHWnlZV2RmWTI5c2IzSXNJSFZ1YVdadmNtMWZZMjlzYjNJc0lHWnlZV2RmZFhZcE93b2dJQ0FnWm1sdVlXeGZZMjlzYjNJdVlTQTlJR1pwYm1Gc1gyTnZiRzl5TG1FZ0tpQnBibk5wWkdVN0Nnb2dJQ0FnYzNSeWIydGxLR1p5WVdkZmMzUnliMnRsWTI5c2IzSXNJSE5wWjI1bFpGOWthWE4wWVc1alpTd2dMWE4wY205clpWOTNhV1IwYUN3Z1ptbHVZV3hmWTI5c2IzSXNJR0ZoWDNKaFpHbDFjeWs3Q2lBZ0lDQm5iRzkzS0dkbGRGOW5iRzkzWTI5c2IzSW9LU3dnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JoWVhOMFpYQW9MWE4wY205clpWOTNhV1IwYUN3Z2MybG5ibVZrWDJScGMzUmhibU5sTENCaFlWOXlZV1JwZFhNcExDQm1hVzVoYkY5amIyeHZjaWs3Q2dvZ0lDQWdMeThnWkdWaWRXY2dMU0J6YUc5M0lHSmhZMnRuY205MWJtUUtJQ0FnSUM4dklHWnBibUZzWDJOdmJHOXlMbUVnUFNCamJHRnRjQ2htYVc1aGJGOWpiMnh2Y2k1aExDQXdMakFzSURFdU1DazdDaUFnSUNBdkx5Qm1hVzVoYkY5amIyeHZjaUE5SUhabFl6UW9DaUFnSUNBdkx5QWdJQ0FnZG1Wak15Z3hMREFzTUNrZ0tpQW9NUzR3SUMwZ1ptbHVZV3hmWTI5c2IzSXVZU2tnS3lCbWFXNWhiRjlqYjJ4dmNpNXlaMklnS2lCbWFXNWhiRjlqYjJ4dmNpNWhMQW9nSUNBZ0x5OGdJQ0FnSURBdU5DQXJJREF1TmlBcUlHWnBibUZzWDJOdmJHOXlMbUVLSUNBZ0lDOHZJQ2s3Q2dvZ0lDQWdhV1lnS0hCcFkydHBibWNwSUhzS0lDQWdJQ0FnSUNCcFppQW9abWx1WVd4ZlkyOXNiM0l1WVNBK0lEQXVNU2tnZXdvZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRGOWpiMnh2Y2lBOUlIQmhZMnRmYVc1MEtHOWlhbVZqZEY5cFpDd2dabkpoWjE5cGJuTjBZVzVqWlY5cFpDazdDaUFnSUNBZ0lDQWdmU0JsYkhObElIc0tJQ0FnSUNBZ0lDQWdJQ0FnWkdselkyRnlaRHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnY21WMGRYSnVPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaG1hVzVoYkY5amIyeHZjaTVoSUR3OUlEQXVNQ2w3Q2lBZ0lDQWdJQ0FnWkdselkyRnlaRHNLSUNBZ0lIMEtJQ0FnSUdaeVlXZHRaVzUwWDJOdmJHOXlJRDBnWm1sdVlXeGZZMjlzYjNJN0NuMEtxWEJzYjNSZmRIbHdaYWRUWTJGMGRHVnlwM1Z3WkdGMFpYTEhCV2lrTVRVMU9MTnBibk4wWVc1alpWOWhkSFJ5YVdKMWRHVnppTEpqYjI1MlpYSjBaV1JmY205MFlYUnBiMjZDcTNSNWNHVmZiR1Z1WjNSb0JLUm1iR0YwMkJjQUFBQUFBQUFBQUFBQUFBQUFBSUEvcW5GMVlXUmZjMk5oYkdXQ3EzUjVjR1ZmYkdWdVozUm9BcVJtYkdGMHh3QVhyVzFoY210bGNsOXZabVp6WlhTQ3EzUjVjR1ZmYkdWdVozUm9BNlJtYkdGMHh3d1hBQUJnd01VZ1ZNRUFBQUFBdFdOdmJuWmxjblJsWkY5emRISnZhMlZqYjJ4dmNvS3JkSGx3WlY5c1pXNW5kR2dFcEdac1lYVFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ21jMlJtWDNWMmdxdDBlWEJsWDJ4bGJtZDBhQVNrWm14aGRNY0FGNjEzWjJ4ZmNHOXphWFJwYjI1emdxdDBlWEJsWDJ4bGJtZDBhQUtrWm14aGROY1hBSUM5UXgrRi9VR3NkbVZ5ZEdWNFgyTnZiRzl5Z3F0MGVYQmxYMnhsYm1kMGFBU2tabXhoZE5nWEFBQUFBQUFBQUFBQUFBQUFBQUNBUDZ0eGRXRmtYMjltWm5ObGRJS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhBQmVNckhSeVlXNXpjR0Z5Wlc1amVjS21lblpoYkhWbHlnQUFBQUNrYm1GdFpka2hiR2x1WlhObFoyMWxiblJ6TFRFME9EWXpNall5TWpZME16ZzVNRFEwT1RBMXFXTmhiVjl6Y0dGalphUmtZWFJocUhWdWFXWnZjbTF6anJKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXNWhibDlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFLcHRiMlJsYkY5bU16Smp4MEFYQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUDdaMWJtbG1iM0p0WDNCaGRIUmxjbTVmYkdWdVozUm95aitBQUFDc2MyTmxibVZmYjNKcFoybHUxeGNBQUFBQUFBQUFBSzFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3NIVnVhV1p2Y20xZlkyOXNiM0p0WVhEQ3AzQnBZMnRwYm1mQ3QzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtkc2FXNWxZMkZ3QUt0a1pYQjBhRjl6YUdsbWRNb0FBQUFBcjNWdWFXWnZjbTFmY0dGMGRHVnlic0t1YUdsbmFHTnNhWEJmWTI5c2IzTFlGNEJGZmovbytXYy85V01UUGdBQWdEK3pkVzVwWm05eWJWOWpiR2x3WDNCc1lXNWxjOGVBRndBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T3AzWnBjMmxpYkdYRHFHOTJaWEprY21GM3dxdHBjMTl6WldkdFpXNTBjOE9xWVhSMGNtbGlkWFJsYzRPeGRXNXBabTl5YlY5c2FXNWxkMmxrZEdpQ3EzUjVjR1ZmYkdWdVozUm9BYVJtYkdGMHh3QVhxbXhwYm1WZlkyOXNiM0tDcTNSNWNHVmZiR1Z1WjNSb0JLUm1iR0YweHdBWHVuQnZjMmwwYVc5dWMxOTBjbUZ1YzJadmNtMWxaRjltTXpKamdxdDBlWEJsWDJ4bGJtZDBhQU9rWm14aGRNY0FGNlIxZFdsa3RERTBPRFl6TWpZeU1qWTBNemc1TURRME9UQTFxWEJzYjNSZmRIbHdaYVZNYVc1bGM2ZDFjR1JoZEdWeXh3Vm9wREUxTlRtTXJIUnlZVzV6Y0dGeVpXNWplY0ttZW5aaGJIVmx5a0dnQUFDa2JtRnRaZGtnYkdsdVpYTmxaMjFsYm5SekxUSXhPREE1TkRjMk1qYzVPREUxT0RJeU1US3BZMkZ0WDNOd1lXTmxwR1JoZEdHb2RXNXBabTl5YlhQZUFCQ3lkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWx1WVc1ZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFBQUNxYlc5a1pXeGZaak15WThkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNnUVFBQWdEKzJkVzVwWm05eWJWOXdZWFIwWlhKdVgyeGxibWQwYU1vL2dBQUFySE5qWlc1bFgyOXlhV2RwYnRjWEFBQUFBQUFBQUFDdGJHOTNZMnhwY0Y5amIyeHZjdGdYd0xTSVBoTzJuenNWcWFnK0FBQ0FQN0IxYm1sbWIzSnRYMk52Ykc5eWJXRnd3cWR3YVdOcmFXNW53ckYxYm1sbWIzSnRYMnhwYm1WM2FXUjBhTW8vZ0FBQXQzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtkc2FXNWxZMkZ3QUtwc2FXNWxYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUFBQUlBL3EyUmxjSFJvWDNOb2FXWjB5Z0FBQUFDdmRXNXBabTl5YlY5d1lYUjBaWEp1d3E1b2FXZG9ZMnhwY0Y5amIyeHZjdGdYZ0VWK1ArajVaei8xWXhNK0FBQ0FQN04xYm1sbWIzSnRYMk5zYVhCZmNHeGhibVZ6eDRBWEFBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNm5kbWx6YVdKc1pjT29iM1psY21SeVlYZkNxMmx6WDNObFoyMWxiblJ6dzZwaGRIUnlhV0oxZEdWemdicHdiM05wZEdsdmJuTmZkSEpoYm5ObWIzSnRaV1JmWmpNeVk0S3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVFlGd0FBazBJQUFHeENBQ0FyUkFBQWJFS2tkWFZwWkxNeU1UZ3dPVFEzTmpJM09UZ3hOVGd5TWpFeXFYQnNiM1JmZEhsd1phVk1hVzVsYzZkMWNHUmhkR1Z5eHdWb3BERTFOakRlQUJLc2RISmhibk53WVhKbGJtTjV3cVZ6Y0dGalphUmtZWFJockhabGNuUmxlR0Z5Y21GNWM0S2lkWGFDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHlBWEFBQUFBQUFBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFBQUFBQUFBQUFBQUFBQUNvY0c5emFYUnBiMjZDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHlBWEFBQUF2d0FBQUw4QUFBQS9BQUFBdndBQUFEOEFBQUEvQUFBQXZ3QUFBRCttZW5aaGJIVmx5Z0FBQUFDa2JtRnRaYmgwWlhoMExUYzVPRE13TkRJMU56RTFNREUyTmpRNU9UYXBZMkZ0WDNOd1lXTmxwR1JoZEdHb2RXNXBabTl5YlhQZUFCbXJjSGhmY0dWeVgzVnVhWFRLQUFBQUFLbG5iRzkzWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ3lkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWxpYVd4c1ltOWhjbVRDclhCeVpYQnliMnBsWTNScGIyN0hRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvcVc1aGJsOWpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUsxa2FYTjBZVzVqWldacFpXeGtpcWx0YVc1R2FXeDBaWEtzVEdsdVpXRnlSbWxzZEdWeXFtRnVhWE52ZEhKdmNIbktRWUFBQUtsdFlXZEdhV3gwWlhLc1RHbHVaV0Z5Um1sc2RHVnlwWGR5WVhCVHJsSmxjR1ZoZEZkeVlYQndhVzVucEdSaGRHR3RkR1Y0ZEhWeVpWOWhkR3hoYzZ4MGFISmxaVjltYjNKdFlYU3BVbVZrUm05eWJXRjBwSE5wZW1XU3pRZ0F6UWdBcFhkeVlYQlVybEpsY0dWaGRGZHlZWEJ3YVc1bnBIUjVjR1duVTJGdGNHeGxjcXAwYUhKbFpWOTBlWEJscVVac2IyRjBWSGx3WmFwdGIyUmxiRjltTXpKangwQVhBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQN0poZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVhLUlFBQUFMQnpaR1pmYldGeWEyVnlYM05vWVhCbEE2ZHdZWFIwWlhKdXdxdHpkSEp2YTJWM2FXUjBhTW9BQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtwWjJ4dmQzZHBaSFJveWdBQUFBQ25jR2xqYTJsdVo4S3FjbVZ6YjJ4MWRHbHZidGNYQUFBQUFBQUFBQUMzZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFxVzlpYW1WamRGOXBaQUN0ZFc1cFptOXliVjlqYjJ4dmNzS3dkSEpoYm5ObWIzSnRYMjFoY210bGNzS3JaR1Z3ZEdoZmMyaHBablRLQUFBQUFLcG1NekpqWDNOallXeGx4d3dYQUFDQVB3QUFnRDhBQUlBL3JtaHBaMmhqYkdsd1gyTnZiRzl5MkJlQVJYNC82UGxuUC9WakV6NEFBSUEvczNWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhQSGdCY0FBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6cWQyYVhOcFlteGx3NnR0WVhKclpYSnpjR0ZqWmFSa1lYUmhxRzkyWlhKa2NtRjN3cXBuYkhsd2FGOWtZWFJoZzZ4bmJIbHdhRjlvWVhOb1pYUEhIQlpoOWRlenBUbUM1eG1DVHRRdG9DbFBrUnZsZkZYWHNDanBiSHdicG5OallXeGxjOGM0RndBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFBQmdRUUFBWUVFQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQnJXRjBiR0Z6WDNWd1pHRjBaWE9IcWpJd09UVXpPRGsxT0RXVTJCY0FJSjQrQU1BUlBnRGdxejRBUURRK3lEMVBZNUxYRmpnQUFBQkdBQUFBeUQxQUZ3REFBMElBZ0FCQ0FLRDZRUUFnOUVFQXdPMUJBRURuUVFEQTRFRUFRTnBCQU1EVFFRQWd6VUVBd01aQkFHREFRUURndVVFQVlMTkJBT0NzUVFCZ3BrRUFBS0JCQU1DWlFRQ0FrMEVBZ0kxQkFNQ0hRUUFnZ2tFQVlIbEJBT0J1UVFCQVpVRUFRRnhCQUFCVVFRREFURUVBZ0VaQkFJQkJRUUNnUFVFQUFEdEJBTUE1UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBNERsQkFHQTdRUUJBUGtFQVlFSkJBTUJIUVFBZ1RrRUFvRlZCQU9CZFFRQWdaMEVBQUhGQkFJQjdRUUJBZzBFQUFJbEJBQUNQUVFCQWxVRUFnSnRCQUFDaVFRQ2dxRUVBWUs5QkFJQUJRZ0NBL0VFQTRQVkJBR0R2UVFBQTZVRUFvT0pCQUNEY1FRQ0ExVUVBQU05QkFLRElRUUFBd2tFQWdMdEJBQ0MxUVFEQXJrRUFRS2hCQUtDaFFRQkFtMEVBNEpSQkFJQ09RUUJBaUVFQVFJSkJBT0I0UVFDZ2JVRUF3R0pCQUlCWVFRRGdUa0VBSUVaQkFHQStRUUNnTjBFQUlESkJBQUF1UVFBZ0swRUF3Q2xCQUtBcFFRQ2dLVUVBb0NsQkFLQXBRUURnS1VFQW9DdEJBS0F1UVFBZ00wRUE0RGhCQU9BL1FRRGdSMEVBd0ZCQkFJQmFRUURnWkVFQTRHOUJBSUI3UVFEQWcwRUFBSXBCQUdDUVFRRGdsa0VBb0oxQkFHQ2tRUUJBcTBFQVFQNUJBTUQzUVFCQThVRUF3T3BCQUVEa1FRREEzVUVBWU5kQkFPRFFRUUJneWtFQTRNTkJBR0M5UVFEZ3RrRUFZTEJCQU9DcFFRQ0FvMEVBSUoxQkFJQ1dRUUFBa0VFQW9JbEJBRUNEUVFBQWVrRUE0RzFCQUVCaVFRQUFWMEVBSUV4QkFBQkNRUUNnT0VFQVFEQkJBQUFwUVFBQUkwRUFZQjVCQUVBYlFRREFHVUVBb0JsQkFLQVpRUUNnR1VFQW9CbEJBQUFhUVFEQUcwRUFRQjlCQUNBa1FRQmdLa0VBNERGQkFJQTZRUUFBUkVFQVFFNUJBRUJaUVFEZ1pFRUFBSEZCQUlCOVFRQkFoVUVBd0l0QkFJQ1NRUUJnbVVFQVlLQkJBSUNuUVFDZytVRUFJUE5CQUtEc1FRQWc1a0VBb045QkFDRFpRUUNnMGtFQUlNeEJBTURGUVFCQXYwRUF3TGhCQUVDeVFRREFxMEVBSUtWQkFNQ2VRUUJnbUVFQTRKRkJBR0NMUVFEZ2hFRUE0SHhCQUFCd1FRQ0FZMEVBUUZkQkFLQkxRUUJnUUVFQW9EVkJBS0FyUVFDQUlrRUFvQnBCQUFBVVFRRGdEa0VBZ0F0QkFPQUpRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFBQXBCQUFBTVFRRGdEMEVBUUJWQkFDQWNRUUJBSkVFQWdDMUJBS0EzUVFDZ1FrRUFRRTVCQUlCYVFRQWdaMEVBSUhSQkFNQ0FRUUNnaDBFQWdJNUJBS0NWUVFEQW5FRUFBS1JCQU9EMFFRQmc3a0VBQU9oQkFJRGhRUURnMmtFQWdOUkJBT0ROUVFCZ3gwRUFBTUZCQUtDNlFRQWd0RUVBZ0sxQkFBQ25RUUNnb0VFQUFKcEJBSUNUUVFBZ2pVRUF3SVpCQUVDQVFRQmdjMEVBZ0daQkFLQlpRUUFBVFVFQXdFQkJBQUExUVFEQUtVRUFBQjlCQUVBVlFRQ2dERUVBUUFWQkFFRC9RQUNBOTBBQXdQTkFBRUR6UUFCQTgwQUFRUE5BQUVEelFBQWc5RUFBd1BoQUFLQUFRUUNnQmtFQVFBNUJBQ0FYUVFBZ0lVRUFBQ3hCQUtBM1FRQUFSRUVBd0ZCQkFPQmRRUUNBYTBFQVlIbEJBTUNEUVFEZ2lrRUFJSkpCQUdDWlFRREFvRUVBSVBCQkFLRHBRUUJBNDBFQXdOeEJBR0RXUVFEQXowRUFRTWxCQU1EQ1FRQkF2RUVBd0xWQkFHQ3ZRUUFBcVVFQVlLSkJBT0NiUVFCZ2xVRUE0STVCQUdDSVFRQUFna0VBSUhkQkFFQnFRUUFBWFVFQUFGQkJBRUJEUVFDQU5rRUFJQ3BCQUdBZVFRQWdFMEVBZ0FoQkFBRCtRQURBN1VBQTRPQkFBQ0RZUUFEQTAwQUFRTk5BQUVEVFFBQkEwMEFBUU5OQUFFRFVRQUNBMlVBQUlPTkFBTUR3UUFEQUFFRUFvQXBCQUdBVlFRQWdJVUVBZ0MxQkFJQTZRUURnUjBFQW9GVkJBS0JqUVFEZ2NVRUFRSUJCQUlDSFFRRGdqa0VBWUpaQkFPQ2RRUUNBNjBFQUFPVkJBSURlUVFBQTJFRUFvTkZCQUNETFFRQ2d4RUVBSUw1QkFLQzNRUUFnc1VFQW9LcEJBQ0NrUVFEQW5VRUFRSmRCQU1DUVFRQkFpa0VBd0lOQkFHQjZRUUNBYlVFQXdHQkJBT0JUUVFEZ1JrRUFvRGxCQU9Bc1FRQUFJRUVBb0JOQkFNQUhRUUFnK1VBQUlPUkFBT0RSUUFBZ3cwQUE0TGhBQU9DelFBQkFzMEFBUUxOQUFFQ3pRQUJBczBBQWdMUkFBS0M2UUFEQXhVQUFRTlZBQUNEb1FBQ2cvVUFBb0FwQkFDQVhRUUJBSkVFQTRERkJBT0EvUVFBZ1RrRUFvRnhCQUdCclFRQkFla0VBb0lSQkFDQ01RUURBazBFQVlKdEJBT0RtUVFCZzRFRUE0TmxCQUVEVFFRRGd6RUVBWU1aQkFBREFRUUNBdVVFQUFMTkJBSUNzUVFBQXBrRUFZSjlCQUFDWlFRQ2dra0VBSUl4QkFLQ0ZRUUFnZmtFQVFIRkJBQ0JrUVFBZ1YwRUFRRXBCQUlBOVFRQ2dNRUVBWUNOQkFJQVdRUUNnQ1VFQUlQcEFBR0RpUUFEZ3kwQUFRTGRBQUVDbVFBQWdta0FBQUpSQUFFQ1RRQUJBazBBQVFKTkFBRUNUUUFEQWxFQUFJSnhBQUdDcFFBQWd1MEFBWU5CQUFDRG9RQURBQUVFQVFBNUJBQ0FjUVFCZ0trRUE0RGhCQU1CSFFRQ2dWa0VBd0dWQkFBQjFRUUFnZ2tFQTRJbEJBSUNSUVFCQW1VRUFRT0pCQU1EYlFRQWcxVUVBd001QkFDRElRUUNnd1VFQVFMdEJBT0MwUVFCZ3JrRUF3S2RCQUVDaFFRRGdta0VBUUpSQkFNQ05RUUJnaDBFQUFJRkJBQUIxUVFEQVowRUE0RnBCQU9CTlFRREFRRUVBNEROQkFDQW5RUUJBR2tFQUlBMUJBQ0FBUVFDZzVrQUFJTTFBQUNDMVFBQ2dua0FBd0lwQUFPQjNRQUNBYUVBQVlHWkFBR0JtUUFCZ1prQUFZR1pBQUVCcVFBREFmRUFBWUk1QUFDQ2pRQUFndTBBQVFOVkFBTUR3UUFDZ0JrRUFRQlZCQUNBa1FRQWdNMEVBWUVKQkFNQlJRUUFnWVVFQW9IQkJBQ0NBUVFEZ2gwRUF3STlCQUtDWFFRQ0EzVUVBQU5kQkFJRFFRUUFBeWtFQWdNTkJBQUM5UVFDQXRrRUFBTEJCQUtDcFFRQkFvMEVBb0p4QkFDQ1dRUUNnajBFQUlJbEJBS0NDUVFCZ2VFRUFnR3RCQU1CZVFRQ0FVVUVBZ0VSQkFLQTNRUUNBS2tFQWdCMUJBTUFRUVFEZ0EwRUE0TzFBQUlEVFFBRGd1VUFBUUtCQUFPQ0hRQUFBWTBBQTREMUFBR0FwUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBd0N0QUFFQkVRQUFBYkVBQVlJNUFBR0NwUUFEQXhVQUFJT05BQUtBQVFRRGdEMEVBUUI5QkFLQXVRUUJBUGtFQTRFMUJBS0JkUVFCZ2JVRUFJSDFCQUlDR1FRQmdqa0VBUUpaQkFNRFlRUUJBMGtFQTRNdEJBR0RGUVFEZ3ZrRUFZTGhCQU9DeFFRQmdxMEVBNEtSQkFHQ2VRUUFBbUVFQWdKRkJBQUNMUVFDQWhFRUFBSHhCQU9CdVFRQUFZa0VBSUZWQkFHQklRUUJBTzBFQUlDNUJBR0FoUVFCQUZFRUFJQWRCQUtEMFFBQUEyMEFBWU1GQUFBQ25RQUFnalVBQUlHZEFBSUExUUFBZ0NVQUFRTlkvQU1ETVB3REF6RDhBd013L0FNRE1Qd0RBM1Q4QUFCSkFBRUJFUUFEQWZFQUFJSnhBQUtDNlFBQ0EyVUFBd1BoQUFBQU1RUURBRzBFQW9DdEJBR0E3UVFCQVMwRUFJRnRCQUFCclFRQUFlMEVBWUlWQkFHQ05RUUJnbFVFQUlOUkJBSUROUVFBQXgwRUFvTUJCQUVDNlFRREFzMEVBSUsxQkFNQ21RUUJBb0VFQW9KbEJBRUNUUVFEZ2pFRUFZSVpCQUtCL1FRQ2dja0VBd0dWQkFLQllRUUNnUzBFQXdENUJBQUF5UVFBZ0pVRUE0QmRCQUFBTFFRQWcvRUFBb09GQUFPREhRQUJBcmtBQTRKUkFBRUIxUUFEQVFFQUFJQTVBQUFDM1B3Q0FSRDhBb0JrL0FLQVpQd0NnR1Q4QW9Cay9BQ0JsUHdEQTNUOEF3Q3RBQUVCcVFBREFsRUFBZ0xSQUFFRFVRQUFnOUVBQUFBcEJBQUFhUVFEZ0tVRUE0RGxCQU9CSlFRRGdXVUVBNEdsQkFPQjVRUURnaEVFQTRJeEJBT0NVUVFCZ3owRUFBTWxCQUdEQ1FRRGd1MEVBZ0xWQkFBQ3ZRUUNncUVFQUFLSkJBSUNiUVFBZ2xVRUFnSTVCQUFDSVFRQ2dnVUVBWUhaQkFHQnBRUUJBWEVFQVlFOUJBR0JDUVFCQU5VRUFZQ2hCQUtBYlFRREFEa0VBb0FGQkFDRHBRQUNBejBBQUlMVkFBQ0NiUUFDZ2dVQUFRRkJBQU1BY1FBQUEwRDhBQUZjL0FFRFB2QUNnRnI4QW9CbS9BS0FadndCQTRiNEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFLQlpRUUNnYVVFQW9IbEJBTUNFUVFEQWpFRUF3SlJCQU1ES1FRQkF4RUVBd0wxQkFFQzNRUURBc0VFQVFLcEJBT0NqUVFCZ25VRUE0SlpCQUdDUVFRRGdpVUVBWUlOQkFLQjVRUURnYkVFQUFHQkJBQ0JUUVFBQVJrRUFBRGxCQUNBc1FRRGdIa0VBQUJKQkFFQUZRUURnOEVBQTROWkFBSUM4UUFEZ29rQUE0SWhBQU9CY1FBQWdLa0FBQU80L0FJQ0pQd0RBWUQ0QTRDKy9BR0MwdndEQXpMOEFZTGkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUUNnU1VFQW9GbEJBS0JwUVFDZ2VVRUF3SVJCQU1DTVFRREFsRUVBSU1aQkFLQy9RUUFndVVFQW9MSkJBQ0NzUVFDZ3BVRUFBSjlCQUtDWVFRQkFra0VBd0l0QkFFQ0ZRUUNBZlVFQWdIQkJBR0JqUVFDQVZrRUFvRWxCQU9BOFFRREFMMEVBb0NKQkFPQVZRUURBQ0VFQVFQZEFBS0RkUUFBQXhFQUFZS3BBQUFDUVFBQkFiRUFBQURsQUFDQUVRQUNnb2o4QUFQTStBR0RhdmdDQW5yOEE0QVBBQUNBYndBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFDZ1dVRUFvR2xCQUtCNVFRREFoRUVBd0l4QkFNQ1VRUUJBd1VFQTRMcEJBSUMwUVFBQXJrRUFZS2RCQUFDaFFRQ0Fta0VBNEpOQkFJQ05RUUFBaDBFQW9JQkJBQ0IwUVFBZ1owRUFRRnBCQUNCTlFRQUFRRUVBUUROQkFJQW1RUUNBR1VFQVlBeEJBT0QrUUFBQTVVQUFvTXBBQU9Dd1FBQkFsMEFBb0h0QUFFQkhRQURnRWtBQUlNRS9BQ0F5UHdBQVhMNEF3SU8vQUtEcHZ3Q0FKOEFBSUNiQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUtCWlFRQ2dhVUVBb0hsQkFNQ0VRUURBakVFQXdKUkJBS0M4UVFBZ3RrRUF3SzlCQUVDcFFRRGdva0VBUUp4QkFNQ1ZRUUJBajBFQXdJaEJBRUNDUVFEQWQwRUE0R3BCQU9CZFFRREFVRUVBNEVOQkFPQTJRUURBS1VFQTRCeEJBQ0FRUVFCQUEwRUFRT3hBQUNEU1FBQ0F1RUFBSUo1QUFDQ0VRQUJBVlVBQWdDSkFBTURkUHdCQWFqOEFJSW85QUtCTnZ3Q2d6NzhBb0JyQUFNQkl3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBb0ZsQkFLQnBRUUNnZVVFQXdJUkJBTUNNUVFEQWxFRUFBTGhCQUlDeFFRQUFxMEVBZ0tSQkFDQ2VRUUNnbDBFQUlKRkJBS0NLUVFBZ2hFRUFRSHRCQUNCdVFRQmdZVUVBZ0ZSQkFLQkhRUUNBT2tFQWdDMUJBS0FnUVFCZ0UwRUFnQVpCQUdEelFBRGcyVUFBd0w5QUFHQ2xRQURnaTBBQW9HTkFBQUF2UUFEZytEOEFBSk0vQU1DeVBnQUFGYjhBQUxLL0FHQUx3QUFnUU1BQXdGM0FBR0Ftd0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUNnV1VFQW9HbEJBS0I1UVFEQWhFRUF3SXhCQU1DVVFRQmdzMEVBNEt4QkFHQ21RUURBbjBFQVFKbEJBT0NTUVFDQWpFRUFBSVpCQU9CK1FRQUFja0VBQUdWQkFNQlhRUURnU2tFQUlENUJBR0F4UVFCQUpFRUFJQmRCQUdBS1FRQmcra0FBSU9CQUFLREdRQUFBclVBQVlKTkFBT0J4UUFCZ1BrQUFJQXRBQU1Dc1B3Q0FEejhBd0xLK0FBQ1R2d0RnK2I4QW9EREFBR0Jad0FEQVlzQUFZQ2JBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUVEelFBQ2dDVUVBb0JsQkFLQXBRUUNnT1VFQW9FbEJBS0JaUVFDZ2FVRUFvSGxCQU1DRVFRREFqRUVBd0pSQkFNQ3VRUUJBcUVFQW9LRkJBRUNiUVFDZ2xFRUFJSTVCQU1DSFFRQkFnVUVBd0hWQkFLQm9RUUNnVzBFQXdFNUJBSUJCUVFDQU5FRUF3Q2RCQUFBYlFRQUFEa0VBd0FCQkFPRG5RQUFBemtBQWdMTkFBT0NaUUFCQWdFQUF3RTFBQUVBWlFBQmd5ajhBSUUwL0FBREd2UUNBZGI4QXdONi9BR0FVd0FBZ0c4QUFvQ3pBQUtCTHdBQmdKc0FBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFvRmxCQUtCcFFRQ2dlVUVBd0lSQkFNQ01RUURBbEVFQTRLbEJBSUNqUVFBZ25VRUFnSlpCQUFDUVFRQ0FpVUVBQUlOQkFBQjVRUUJBYkVFQVlGOUJBR0JTUVFCQVJVRUFZRGhCQUdBclFRQWdIa0VBWUJGQkFJQUVRUUNBNzBBQUlOVkFBQ0M3UUFDQW9VQUFJSWRBQUdCYVFBQmdKMEFBb09rL0FNQ0NQd0RBS1Q0QWdEaS9BS0RCdndDQUJNQUFvTkcvQU1DNHZ3REE3cjhBNENmQUFHQW13QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQ2dXVUVBb0dsQkFLQjVRUURBaEVFQXdJeEJBTUNVUVFBZ3BVRUF3SjVCQUdDWVFRRGdrVUVBWUl0QkFPQ0VRUURBZkVFQW9HOUJBS0JpUVFEZ1ZVRUFBRWxCQUNBOFFRRGdMa0VBQUNKQkFDQVZRUURnQjBFQTRQVkFBR0RjUUFEQXdrQUF3S2hBQUdDT1FBREFhVUFBZ0RWQUFDQUJRQURnblQ4QVlObytBQUR6dmdDQXBiOEFZUCsvQU9EUHZ3REFXNzhBUUFtL0FBQ212d0JBRU1BQVlDVEFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFLQlpRUUNnYVVFQW9IbEJBTUNFUVFEQWpFRUF3SlJCQUtDZ1FRQUFta0VBZ0pOQkFDQ05RUURBaGtFQVFJQkJBR0J6UVFCZ1prRUFnRmxCQUVCTVFRQmdQMEVBb0RKQkFNQWxRUURBR0VFQW9BdEJBS0Q5UUFCQTQwQUFJTWxBQUtDdlFBQUFsa0FBd0hoQUFNQkRRQUNnRUVBQW9Mby9BR0FsUHdCZ2dyNEFnSW0vQUlEcnZ3QUE2TDhBd0lPL0FBQmN2Z0RnQjc0QW9KbS9BTUFNd0FEZ0k4QUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUUNnU1VFQW9GbEJBS0JwUVFDZ2VVRUF3SVJCQU1DTVFRREFsRUVBNEp0QkFHQ1ZRUURnamtFQVlJaEJBQUNDUVFBZ2QwRUFRR3BCQUFCZFFRQUFVRUVBSUVOQkFBQTJRUUFBS1VFQVFCeEJBR0FQUVFDQUFrRUFnT3BBQU9EUVFBRGd0a0FBZ0p4QUFPQ0NRQUNnVWtBQTRCOUFBS0RXUHdDQVh6OEFRTTg4QUlCYnZ3QmcxYjhBQVAyL0FJQ2V2d0JnMnI0QW9OdytBTUQxdlFDZ21iOEF3QXpBQU9BandBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFDZ1dVRUFvR2xCQUtCNVFRREFoRUVBd0l4QkFNQ1VRUUJBbDBFQXdKQkJBRUNLUVFEQWcwRUFZSHBCQUlCdFFRREFZRUVBNEZOQkFPQkdRUUNnT1VFQTRDeEJBTUFmUVFDZ0VrRUE0QVZCQUNEeVFBQ0EyRUFBSUw1QUFDQ2tRQUNBaWtBQUlHQkFBSUFzUUFCQTh6OEF3STQvQUNDV1BnQmdKYjhBWUxhL0FHQUJ3QUJBdTc4QTRDKy9BTUJnUGdEQVRqOEF3UFc5QUtDWnZ3REFETUFBNENQQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUtCWlFRQ2dhVUVBb0hsQkFNQ0VRUURBakVFQXdKUkJBS0NTUVFBZ2pFRUFvSVZCQUNCK1FRQkFjVUVBSUdSQkFDQlhRUUJBU2tFQWdEMUJBS0F3UVFCZ0kwRUFnQlpCQUtBSlFRQ2crRUFBNE41QUFFREZRQURBcTBBQXdKRkFBTUJ1UUFBQVBFQUFnQWRBQUFDblB3Q0FCajhBWU1xK0FBQ1l2d0NBK2I4QUFOcS9BQUJxdndCQXo3d0FBRmMvQUNCNVB3REE5YjBBb0ptL0FNQU13QURnSThBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBb0ZsQkFLQnBRUUNnZVVFQXdJUkJBTUNNUVFEQWxFRUF3STFCQUdDSFFRQUFnVUVBQUhWQkFNQm5RUURnV2tFQTRFMUJBTUJBUVFEZ00wRUFJQ2RCQUVBYVFRQWdEVUVBSUFCQkFLRG1RQUJBekVBQUlMSkFBS0NZUUFBZ2ZrQUF3RXBBQU1BVlFBQUF4ajhBZ0VBL0FNQXB2Z0NBZnI4QWdPTy9BQUQwdndDQWtMOEF3SmkrQU9BWFB3Q2dyejhBQUlBL0FNRDF2UUNnbWI4QXdBekFBT0Fqd0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUNnV1VFQW9HbEJBS0I1UVFEQWhFRUF3SXhCQU1DVVFRQWdpVUVBb0lKQkFHQjRRUUNBYTBFQXdGNUJBSUJSUVFDQVJFRUFvRGRCQUlBcVFRQ0FIVUVBd0JCQkFPQURRUURnN1VBQWdOTkFBT0M1UUFEZ24wQUFnSVZBQUFCWVFBREFKRUFBWU9RL0FDQjNQd0JnOFQwQW9FRy9BS0RJdndBZ0FzQUF3S3kvQUlBUHZ3REFzajRBb0pjL0FHRGhQd0FBZ0Q4QXdQVzlBS0NadndEQURNQUE0Q1BBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUVEelFBQ2dDVUVBb0JsQkFLQXBRUUNnT1VFQW9FbEJBS0JaUVFDZ2FVRUFvSGxCQU1DRVFRQ2dqRUVBUUpOQkFJQ0VRUUFBZkVFQTRHNUJBQUJpUVFBZ1ZVRUFZRWhCQUVBN1FRQWdMa0VBWUNGQkFFQVVRUUFnQjBFQW9QUkFBQURiUUFCZ3dVQUFBS2RBQUNDTlFBQUFaMEFBQURKQUFLRDlQd0FBbUQ4QVlNbytBRUFIdndDQXJMOEE0QURBQUdES3Z3QWdUYjhBQU1ZOUFJQjFQd0RBM2o4QUlQcy9BQUNBUHdEQTliMEFvSm0vQU1BTXdBRGdJOEFBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFvRmxCQUtCcFFRQWdlVUVBQUlOQkFFQ0lRUUNBalVFQW9IOUJBS0J5UVFEQVpVRUFvRmhCQUtCTFFRREFQa0VBQURKQkFDQWxRUURnRjBFQUFBdEJBQ0Q4UUFDZzRVQUE0TWRBQUVDdVFBRGdsRUFBUUhWQUFNQkFRQUFnRGtBQWdMTS9BT0FYUHdEQW1MNEF3STYvQUVEd3Z3Qmc2TDhBd0lLL0FNQXB2Z0NBT0Q4QW9NRS9BQ0FVUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFPQWp3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQkFXVUVBSUdaQkFBQndRUUFBZWtFQVFJSkJBTUNIUVFCZ2RrRUFZR2xCQUVCY1FRQmdUMEVBWUVKQkFFQTFRUUJnS0VFQW9CdEJBTUFPUVFDZ0FVRUFJT2xBQUlEUFFBQWd0VUFBSUp0QUFLQ0JRQUJBVUVBQXdCeEFBQURRUHdBQVZ6OEFRTSs4QUFCcXZ3QUEycjhBd1A2L0FJQ2V2d0JnMnI0QUFQTStBSUNsUHdDZ0JrQUF3QzFBQUFBQVFBQUFnRDhBd1BXOUFLQ1p2d0RBRE1BQTRDUEFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ0FPVUVBSUVkQkFLQlFRUUNnV1VFQWdHTkJBT0J0UVFBQWVVRUFRSUpCQUFCdFFRQUFZRUVBSUZOQkFBQkdRUUFBT1VFQUlDeEJBT0FlUVFBQUVrRUFRQVZCQU9Ed1FBRGcxa0FBZ0x4QUFPQ2lRQURnaUVBQTRGeEFBQ0FxUUFBQTdqOEFnSWsvQU1CZ1BnRGdMNzhBUUx1L0FDQUR3QUJBdTc4QTRDKy9BTUJnUGdDQWlUOEFBTzQvQU9BcVFBRGdQRUFBQUFCQUFBQ0FQd0RBOWIwQW9KbS9BTUFNd0FEZ0k4QUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NoQkFNQXlRUUNnT2tFQVlFTkJBQUJOUVFCQVYwRUFZR0pCQU9CdFFRQUFla0VBSUdSQkFNQldRUUNnU1VFQTREeEJBTUF2UVFDZ0lrRUE0QlZCQU1BSVFRQkE5MEFBb04xQUFBREVRQUJncWtBQUFKQkFBRUJzUUFBQU9VQUFJQVJBQUtDaVB3QUE4ejRBWU5xK0FJQ2V2d0RnL3I4QUFOcS9BQUJxdndCQXo3d0FBRmMvQUFEUVB3REFIRUFBWUU5QUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQU9BandBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBZ0FsQkFJQVdRUUNnSFVFQXdDUkJBQ0F0UVFDQU5rRUF3RUJCQU1CTFFRQkFWMEVBZ0dOQkFBQndRUUNnVzBFQUFFNUJBS0JBUVFCZ00wRUFnQ1pCQUlBWlFRQmdERUVBNFA1QUFBRGxRQUNneWtBQTRMQkFBRUNYUUFDZ2UwQUFRRWRBQU9BU1FBQWd3VDhBSURJL0FBQmN2Z0RBZzc4QVlPaS9BT0QwdndDQWtMOEF3SmkrQU9BWFB3Q0FzejhBSUE1QUFNQkFRQUJnYTBBQUFFQkFBQUFBUUFBQWdEOEF3UFc5QUtDWnZ3REFETUFBNENQQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFLRHlRQUNBQTBFQXdBaEJBQ0FQUVFBQUYwRUFJQ0JCQUNBcVFRQWdOVUVBd0VCQkFBQk5RUUNnV1VFQXdHWkJBT0JUUVFEQVJVRUE0RGRCQUlBcVFRQWdIVUVBSUJCQkFFQURRUUJBN0VBQUlOSkFBSUM0UUFBZ25rQUFJSVJBQUVCVlFBQ0FJa0FBd04wL0FFQnFQd0FnaWowQW9FMi9BS0RQdndEQUFzQUF3S3kvQUlBUHZ3REFzajRBb0pjL0FLRDlQd0FBTWtBQUFHZEFBR0I3UUFBQVFFQUFBQUJBQUFDQVB3REE5YjBBb0ptL0FNQU13QURnSThBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMGtBQUlPSkFBQ0RwUUFEZzgwQUFJQUZCQU1BSlFRQ2dFMEVBZ0I1QkFDQXFRUUNBTmtFQVlFTkJBS0JRUVFCZ1hrRUFJRTFCQUlBK1FRQWdNRUVBQUNKQkFFQVVRUUFBQjBFQWdQTkFBT0RaUUFEQXYwQUFZS1ZBQU9DTFFBQ2dZMEFBQUM5QUFPRDRQd0FBa3o4QXdMSStBQUFWdndBQXNyOEFvQUxBQUdES3Z3QWdUYjhBQU1ZOUFJQjFQd0RBM2o4QTRDTkFBQUJZUUFCQWhVQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBT0Fqd0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQUlMSkFBT0MvUUFEZ3drQUFvTXBBQU9EV1FBRGc1a0FBSVBwQUFPQUhRUUNnRTBFQUlDQkJBQ0F0UVFDZ09rRUFnRWhCQU1CV1FRQmdSMEVBWURoQkFHQXBRUURBR2tFQVlBeEJBS0Q4UUFDQTRVQUFBTWRBQUFDdFFBQmdrMEFBNEhGQUFHQStRQUFnQzBBQXdLdy9BSUFQUHdEQXNyNEFBSk8vQU9EMXZ3REE2TDhBd0lLL0FNQXB2Z0NBT0Q4QW9NRS9BSUFWUUFDQVNFQUFZSHhBQUVDVFFBQUFnRUFBQUVCQUFBQUFRQUFBZ0Q4QXdQVzlBS0NadndEQURNQUE0Q1BBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBQ0NTUUFEQW4wQUFJS0JBQUdDalFBQ2dyRUFBd0xwQUFDRE5RQUNBNGtBQUlQcEFBTUFKUVFBQUYwRUF3Q1JCQUFBelFRQmdRVUVBQUZCQkFPQkNRUUJnTTBFQUFDUkJBT0FVUVFEQUJVRUFBTzVBQUNEUlFBQmd0VUFBb0pwQUFFQ0FRQURBVFVBQVFCbEFBR0RLUHdBZ1RUOEFBTWE5QUlCMXZ3REEzcjhBb1B1L0FPQ2R2d0JnMnI0QUFQTStBSUNsUHdDZ0JrQUFRRGxBQUNCb1FBQ2dmVUFBQUlCQUFNQjFRQUFBUUVBQUFBQkFBQUNBUHdEQTliMEFvSm0vQU1BTXdBRGdJOEFBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1pFQUFnSDlBQUFDQVFBQWdnRUFBUUlSQUFHQ1BRQUJBb0VBQVFMVkFBQ0ROUUFEZzVrQUFJQUZCQUNBUFFRQ2dIVUVBWUN4QkFHQTdRUUJnU2tFQWdEOUJBTUF2UVFBZ0lFRUFnQkJCQU9BQVFRQUE0MEFBZ01SQUFLQ21RQURBaVVBQWdGeEFBSUFuUUFDZzZUOEF3SUkvQU1BcFBnQ0FPTDhBb01HL0FDQUV3QUNndXI4QVlDVy9BR0NDUGdDQWlUOEFBTzQvQU9BbFFBQmdQVUFBQUVCQUFBQkFRQUFBUUVBQUFFQkFBTUExUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFPQWp3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1JBQUlBL1FBQUFRRUFBQUVCQUFHQkFRQUJBUzBBQWdHZEFBQ0NJUUFCQW9FQUF3THBBQU9EV1FBRGc4MEFBd0FoQkFPQVhRUUFnSjBFQWdEWkJBQUJHUVFDQVBVRUFvQzFCQUtBZFFRREFEVUVBd1B0QUFDRGNRQUNBdkVBQUlKMUFBQ0I4UUFBZ1AwQUFBQVZBQUlDZVB3QmcyajRBQVBPK0FJQ2x2d0JnQWNBQW9OYS9BSUJmdndCQXo3d0FnRnMvQUNETFB3Q2crVDhBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUlEclB3QUFnRDhBd1BXOUFLQ1p2d0RBRE1BQTRDUEFBTURNdndDZ0diOEFvQmsvQU1ESVB3QUEvejhBQUFCQUFBQUFRQUFBQUVBQW9BQkFBRUFRUUFEZ05VQUFnR2RBQUdDUFFBQ2dyRUFBb01wQUFDRHBRQUFBQkVFQW9CTkJBRUFqUVFBQU0wRUF3RUpCQU9BOFFRRGdMRUVBNEJ4QkFPQU1RUUNnK1VBQXdObEFBTUM1UUFEQW1VQUFnSE5BQUtBelFBRGc1ejhBb0ZNL0FNQkl2Z0NBaWI4QUFPNi9BSUQ3dndDQWtMOEFJSmErQU9BVFB3Q0FjRDhBQUlBL0FBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFBSUEvQUFDQVB3QUFnRDhBQUlBL0FBQlhQd0RBOWIwQW9KbS9BTUFNd0FEZ0k4QUF3TXkvQUtBWnZ3QmdFVDhBQUg0L0FBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdDZ2dqOEFvTGcvQUVBUVFBQkFTMEFBUUlSQUFHQ2pRQURnd2tBQWdPSkFBQ0FCUVFBQUVVRUE0Q0JCQU1Bd1FRREFRRUVBd0R4QkFNQXNRUURBSEVFQXdBeEJBS0Q1UUFDZzJVQUFvTGxBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVlMaStBS0N5dndEQUVzQUFvT3EvQUNCZ3Z3Q0FVNzRBd1BXOUFNRDF2UURBOWIwQXdQVzlBTUQxdlFEQTliMEF3UFc5QU1EMXZRREE5YjBBd1BXOUFNRDF2UURBOWIwQXdQVzlBR0M2dmdDZ243OEFZQTdBQUVBbHdBQkEwYjhBQURHL0FDQUR2Z0RBOWIwQXdQVzlBTUQxdlFEQTliMEF3UFc5QUdEUVBRQ2dnajhBb0FCQUFHQkFRQUFnZ0VBQUlLQkFBQ0RBUUFBZzRFQUFBQUJCQUFBUVFRQUFJRUVBQURCQkFBQkFRUURBUEVFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUFBWXdBQ2dDOEFBSUx5L0FBQ2F2d0NnbWI4QW9KbS9BS0NadndDZ21iOEFvSm0vQUtDWnZ3Q2dtYjhBb0ptL0FLQ1p2d0NnbWI4QW9KbS9BS0NadndDZ21iOEFvSisvQUVEY3Z3QmdJY0FBd0RYQUFFQUJ3QUNBcjc4QW9KbS9BS0NadndDZ21iOEFvSm0vQUtDWnZ3QWdoYjhBd1BXOUFBQ0FQd0FBQUVBQUFFQkFBQUNBUUFBQW9FQUFBTUJBQUFEZ1FBQUFBRUVBQUJCQkFBQWdRUUFBTUVFQUFFQkJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFPQXd3QURBRnNBQTRBekFBTUFNd0FEQURNQUF3QXpBQU1BTXdBREFETUFBd0F6QUFNQU13QURBRE1BQXdBekFBTUFNd0FEQURNQUF3QXpBQU1BTXdBQmdEc0FBWUNIQUFBQkl3QUNnV01BQUFDL0FBQ0FUd0FEQURNQUF3QXpBQU1BTXdBREFETUFBZ0FMQUFLQ1p2d0RBOWIwQUFJQS9BQUFBUUFBQVFFQUFBSUJBQUFDZ1FBQUF3RUFBQU9CQUFBQUFRUUFBRUVFQUFDQkJBQUF3UVFBQVFFRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0NnQjhBQXdBekFBTUFNd0FEQURNQUF3QXpBQU1BTXdBREFETUFBd0F6QUFNQU13QURBRE1BQXdBekFBTUFNd0FEQURNQUF3QXpBQU1BTXdBREFETUFBd0F6QUFHQU93QUJnSWNBQUFFakFBS0JZd0FBQUw4QUFJQlBBQU1BTXdBREFETUFBd0F6QUFNQU13QUNBQXNBQW9KbS9BTUQxdlFBQWdEOEFBQUJBQUFCQVFBQUFnRUFBQUtCQUFBREFRQUFBNEVBQUFBQkJBQUFRUVFBQUlFRUFBREJCQUFCQVFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QVlJKy9BS0NadndDZ21iOEFvSm0vQUtDWnZ3Q2dtYjhBb0ptL0FLQ1p2d0NnbWI4QW9KbS9BS0NadndDZ21iOEFvSm0vQUtDWnZ3Q2dtYjhBb0ptL0FLQ1p2d0NnbWI4QW9KKy9BRURjdndCZ0ljQUF3RFhBQUVBQndBQ0FyNzhBb0ptL0FLQ1p2d0NnbWI4QW9KbS9BS0NadndBZ2hiOEF3UFc5QUFDQVB3QUFBRUFBQUVCQUFBQ0FRQUFBb0VBQUFNQkFBQURnUUFBQUFFRUFBQkJCQUFBZ1FRQUFNRUVBQUVCQkFPQThRUURnTEVFQTRCeEJBT0FNUVFDZytVQUF3TmxBQU1DNVFBREFtVUFBZ0hOQUFLQXpRQURnNXo4QW9GTS9BT0F3dkFEQTliMEF3UFc5QU1EMXZRREE5YjBBd1BXOUFNRDF2UURBOWIwQXdQVzlBTUQxdlFEQTliMEF3UFc5QU1EMXZRREE5YjBBd1BXOUFNRDF2UURBOWIwQXdQVzlBTUQxdlFCZ3VyNEFvSisvQUdBT3dBQkFKY0FBUU5HL0FBQXh2d0FnQTc0QXdQVzlBTUQxdlFEQTliMEF3UFc5QU1EMXZRQmcwRDBBb0lJL0FLQUFRQUJnUUVBQUlJQkFBQ0NnUUFBZ3dFQUFJT0JBQUFBQVFRQUFFRUVBQUNCQkFBQXdRUUFBUUVFQWdEMUJBS0F0UVFDZ0hVRUF3QTFCQU1EN1FBQWczRUFBZ0x4QUFDQ2RRQUFnZkVBQUlEOUFBQUFGUUFEZ3B6OEFnSUEvQUFDQVB3QUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFBSUEvQUFDQVB3QUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFBRmMvQU1EMXZRQ2dtYjhBd0F6QUFPQWp3QURBekw4QW9CbS9BR0FSUHdBQWZqOEFBSUEvQUFDQVB3QUFnRDhBQUlBL0FLQ0NQd0NndUQ4QVFCQkFBRUJMUUFCQWhFQUFZS05BQU9EQ1FBQ0E0a0FBSUFGQkFBQVJRUURnSUVFQXdEQkJBTUJBUVFDQVAwRUF3QzlCQUNBZ1FRQ0FFRUVBNEFCQkFBRGpRQUNBeEVBQW9LWkFBTUNKUUFBQVhVQUFJQzFBQUFBTFFBQWdBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUlEclB3QUFnRDhBd1BXOUFLQ1p2d0RBRE1BQTRDUEFBTURNdndDZ0diOEFvQmsvQU1ESVB3QUEvejhBQUFCQUFBQUFRQUFBQUVBQW9BQkFBRUFRUUFEZ05VQUFnR2RBQUdDUFFBQ2dyRUFBb01wQUFDRHBRQUFBQkVFQW9CTkJBRUFqUVFBQU0wRUF3RUpCQU9CQ1FRQmdNMEVBQUNSQkFPQVVRUURBQlVFQUFPNUFBQ0RSUUFCZ3RVQUFRSnRBQUtDRFFBQ2dZRUFBZ0VkQUFDQkFRQUFBUUVBQUFFQkFBQUJBUUFBQVFFQUFBRUJBQUFCQVFBQUFRRUFBQUVCQUFBQkFRQUFBUUVBQUFFQkFBQUJBUUFBQVFFQUFBRUJBQUFCQVFBREFOVUFBQUFCQUFBQ0FQd0RBOWIwQW9KbS9BTUFNd0FEZ0k4QUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQWtRQUNBUDBBQUFFQkFBQUJBUUFCZ1FFQUFRRXRBQUlCblFBQWdpRUFBUUtCQUFNQzZRQURnMWtBQTRQTkFBTUFJUVFEZ0YwRUFJQ2RCQUlBMlFRQUFSa0VBWUVkQkFHQTRRUUJnS1VFQXdCcEJBR0FNUVFDZy9FQUFvT0ZBQUNESVFBREFzRUFBZ0p4QUFLQ01RQURnZ2tBQUFJQkFBQUNBUUFBQWdFQUFBSUJBQUFDQVFBQUFnRUFBQUlCQUFBQ0FRQUFBZ0VBQUFJQkFBQUNBUUFBQWdFQUFBSUJBQUFDQVFBQUFnRUFBd0hWQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQU9BandBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JrUUFDQWYwQUFBSUJBQUNDQVFBQkFoRUFBWUk5QUFFQ2dRQUJBdFVBQUlNMUFBT0RtUUFBZ0FVRUFJQTlCQUtBZFFRQmdMRUVBWUR0QkFHQktRUUFnVFVFQWdENUJBQ0F3UVFBQUlrRUFRQlJCQUNBSFFRQkE5VUFBQU41QUFDREpRQUNndDBBQVFLcEFBRUNpUUFBQW9FQUFBS0JBQUFDZ1FBQUFvRUFBQUtCQUFBQ2dRQUFBb0VBQUFLQkFBQUNnUUFBQW9FQUFBS0JBQUFDZ1FBQUFvRUFBQUtCQUFPQ2FRQUFBZ0VBQUFFQkFBQUFBUUFBQWdEOEF3UFc5QUtDWnZ3REFETUFBNENQQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUNDU1FBREFuMEFBSUtCQUFHQ2pRQUNnckVBQXdMcEFBQ0ROUUFDQTRrQUFJUHBBQU1BSlFRQUFGMEVBd0NSQkFBQXpRUUJnUVVFQUFGQkJBT0JUUVFEQVJVRUE0RGRCQUlBcVFRQ0FIVUVBSUJGQkFLQUZRUUFBOWtBQWdPTkFBQ0RVUUFDZ3lFQUE0TUZBQUFEQVFBQUF3RUFBQU1CQUFBREFRQUFBd0VBQUFNQkFBQURBUUFBQXdFQUFBTUJBQUFEQVFBQUF3RUFBQU1CQUFBREFRQURndWtBQUFLQkFBQUNBUUFBQVFFQUFBQUJBQUFDQVB3REE5YjBBb0ptL0FNQU13QURnSThBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFDQ3lRQURndjBBQTRNSkFBS0RLUUFEZzFrQUE0T1pBQUNENlFBRGdCMEVBb0JOQkFDQWdRUUFnTFVFQW9EcEJBSUJJUVFEQVZrRUFvRnRCQUFCT1FRREFRRUVBQURSQkFNQW5RUUJBSEVFQWdCRkJBT0FIUVFBQS8wQUFZUEZBQUlEblFBQ2c0VUFBQU9CQUFBRGdRQUFBNEVBQUFPQkFBQURnUUFBQTRFQUFBT0JBQUFEZ1FBQUE0RUFBQU9CQUFBRGdRQUFBNEVBQTROcEFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBT0Fqd0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURTUUFBZzRrQUFJT2xBQU9EelFBQWdBVUVBd0FsQkFLQVRRUUNBSGtFQUlDcEJBSUEyUVFCZ1EwRUFvRkJCQUdCZVFRQWdaRUVBSUZkQkFJQktRUUJnUGtFQTRESkJBQUFvUVFBZ0hrRUFZQlZCQU1BTlFRREFCMEVBUUFOQkFNQUFRUUFBQUVFQUFBQkJBQUFBUVFBQUFFRUFBQUJCQUFBQVFRQUFBRUVBQUFCQkFBQUFRUUFBQUVFQUFBQkJBT0Q2UUFBQTRFQUFBTUJBQUFDZ1FBQUFnRUFBQUVCQUFBQUFRQUFBZ0Q4QXdQVzlBS0NadndEQURNQUE0Q0xBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUtEeVFBQ0FBMEVBd0FoQkFDQVBRUUFBRjBFQUlDQkJBQ0FxUVFBZ05VRUF3RUJCQUFCTlFRQ2dXVUVBd0daQkFJQnRRUUFBWVVFQUFGVkJBSUJKUVFDZ1BrRUFnRFJCQUdBclFRQkFJMEVBWUJ4QkFPQVdRUURnRWtFQW9CQkJBQUFRUVFBQUVFRUFBQkJCQUFBUVFRQUFFRUVBQUJCQkFBQVFRUUFBRUVFQUFCQkJBQUFRUVFDQURVRUFBQUJCQUFEZ1FBQUF3RUFBQUtCQUFBQ0FRQUFBUUVBQUFBQkFBQUNBUHdEQTliMEFvSm0vQU1EMXZ3QUEvNzhBd01pL0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFJQUpRUUNBRmtFQW9CMUJBTUFrUVFBZ0xVRUFnRFpCQU1CQVFRREFTMEVBUUZkQkFJQmpRUUFBY0VFQWdIZEJBSUJyUVFBZ1lFRUFJRlZCQUFCTFFRQ0FRVUVBQURsQkFJQXhRUUJBSzBFQVFDWkJBS0FpUVFDZ0lFRUFBQ0JCQUFBZ1FRQUFJRUVBQUNCQkFBQWdRUUFBSUVFQUFDQkJBQUFnUVFBQUlFRUFnQjFCQUFBUVFRQUFBRUVBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ0FhNzhBQUlDL0FBQ0F2d0FBZnI4QVlCRy9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tFRUF3REpCQUtBNlFRQmdRMEVBQUUxQkFFQlhRUUJnWWtFQTRHMUJBQUI2UVFBZ2dVRUF3SFpCQU1CclFRQmdZVUVBd0ZkQkFBQlBRUUFBUjBFQUlFQkJBRUE2UVFDZ05VRUFZREpCQUlBd1FRQUFNRUVBQURCQkFBQXdRUUFBTUVFQUFEQkJBQUF3UVFBQU1FRUFBREJCQUlBdFFRQWdJRUVBSUJCQkFDQUFRUUJBNEVBQVFNQkFBR0NnUUFDQWdFQUFRRUZBQU1BQlFBQWdoejhBQUlFK0FNRDFQUURBOVQwQXdQVTlBTUQxUFFBZ0F6NEFBREUvQUVEUlB3REFKMEFBWUdkQUFLQ1RRQUNBczBBQWdOTkFBR0R6UUFEQUNVRUF3QmxCQUtBcFFRQ2dPVUVBSUVkQkFLQlFRUUNnV1VFQWdHTkJBT0J0UVFBQWVVRUFRSUpCQUtDR1FRQWdnVUVBNEhkQkFDQnVRUUFBWlVFQXdGeEJBRUJWUVFEZ1RrRUFnRWxCQUVCRlFRQkFRa0VBZ0VCQkFBQkFRUUFBUUVFQUFFQkJBQUJBUVFBQVFFRUFBRUJCQUFCQVFRQUFQa0VBSURGQkFFQWhRUUJnRVVFQWdBRkJBSURqUUFBQXhFQUF3S1JBQUFDR1FBQ2dUMEFBWUJaQUFFRExQd0RBbXo4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q0FyejhBUUFGQUFDQTRRQUNBYzBBQVlKaEFBSUMzUUFEZzFrQUFZUFpBQUFBTFFRRGdHa0VBd0NwQkFLQTZRUUNnU2tFQUlGcEJBR0JtUVFBQWNFRUFBSHBCQUVDQ1FRREFoMEVBZ0l4QkFFQ0hRUUJBZ2tFQVFIdEJBS0J5UVFEQWFrRUF3R05CQU1CZFFRREFXRUVBNEZSQkFBQlNRUUNBVUVFQUFGQkJBQUJRUVFBQVVFRUFBRkJCQUFCUVFRQUFVRUVBNEU1QkFFQkRRUUNBTTBFQTRDTkJBRUFVUVFEZ0JFRUFBT3RBQU1ETVFBQUFyMEFBWUpKQUFNQnVRQUFnUDBBQXdCdEFBR0FOUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFDQVRRQUFBTDBBQXdGcEFBRUNIUUFCZ28wQUF3TUJBQU1EZVFBQmcvVUFBSUE1QkFLQWRRUUJBTFVFQUFEMUJBTUJNUVFDQVhFRUFRR3hCQUFCN1FRQkFnMEVBUUloQkFJQ05RUUNBa2tFQWdJMUJBTUNJUVFCQWhFRUFRSUJCQUNCNVFRQ0Fja0VBNEd4QkFDQm9RUUNBWkVFQTRHRkJBR0JnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFLQmZRUUJBVmtFQXdFWkJBR0EzUVFBQUtFRUE0QmhCQU9BSlFRQ0E5a0FBd05sQUFDQytRQUFncEVBQW9JeEFBRUJ5UUFCZ1YwQUFRRTFBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQUlGRkFBTUJsUUFCQWhFQUFZSnBBQUlDelFBQ2d6a0FBNE9wQUFBQUVRUURnRWtFQUFDSkJBRUF4UVFDZ1FFRUFBRkJCQUtCZlFRQkFiMEVBNEg1QkFFQ0hRUUFnamtFQWdKTkJBTUNZUVFEZ2swRUFZSTlCQUNDTFFRQkFoMEVBd0lOQkFLQ0FRUUFBZkVFQW9IZEJBQ0IwUVFEQWNVRUFZSEJCQUFCd1FRQUFjRUVBQUhCQkFBQndRUUFBY0VFQWdHbEJBS0JhUVFDQVMwRUFnRHhCQUtBdFFRQUFIMEVBb0JCQkFNQUNRUUNBNmtBQUlORkFBT0M1UUFCZ3BVQUFJSlZBQUlDS1FBQ0Foa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFBZ2lFQUFJSkJBQUdDZVFBQkFzVUFBZ01kQUFDRGdRQUNBK2tBQUFBdEJBRUFaUVFEQUowRUFnRFpCQUlCRlFRQ0FWRUVBd0dOQkFDQnpRUUJBZ1VFQUFJbEJBTUNRUVFCZ21FRUFBSjlCQUlDYVFRQWdsa0VBSUpKQkFHQ09RUUFnaTBFQUlJaEJBS0NGUVFDZ2cwRUFBSUpCQU9DQVFRQWdnRUVBQUlCQkFBQ0FRUUFBZ0VFQUFJQkJBTUI4UVFBQWIwRUFJR0JCQUVCUlFRREFRa0VBWURSQkFHQW1RUURBR0VFQW9BdEJBRUQrUUFBQTUwQUFJTkpBQUdEQVFBQ0Fza0FBd0tsQUFJQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQU1DblFBQmdya0FBUUxwQUFLREtRQUJnM2tBQXdQUkFBSUFHUVFCZ0UwRUE0Q0JCQU1BdVFRQUFQVUVBZ0V0QkFDQmFRUUFBYVVFQUFIaEJBS0NEUVFBZ2kwRUE0SkpCQUlDYVFRQ2dwVUVBSUtGQkFBQ2RRUUFnbVVFQW9KVkJBSUNTUVFEQWowRUFZSTFCQUdDTFFRRGdpVUVBd0loQkFDQ0lRUUFBaUVFQUFJaEJBQUNJUVFDQWgwRUE0SUZCQUFCMVFRQ0Faa0VBSUZoQkFDQktRUUJBUEVFQTRDNUJBQUFpUVFDZ0ZVRUFJQXBCQUFEL1FBQkE3RUFBb054QUFLRFFRQUFneVVBQWdNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBZ01kQUFDRE5RQUJnMTBBQW9PVkFBRUQzUUFEQUJVRUFBQkZCQUFBZFFRREFLVUVBNERaQkFJQkVRUUNBVWtFQXdHQkJBRUJ2UVFEZ2ZVRUFZSVpCQU1DTlFRQkFsVUVBNEp4QkFFQ3NRUUFBcUVFQUFLUkJBRUNnUVFBQW5VRUFBSnBCQUVDWFFRQUFsVUVBUUpOQkFNQ1JRUURBa0VFQUlKQkJBQUNRUVFBQWtFRUFBSkJCQUdDTVFRQWdoVUVBNEh0QkFPQnRRUUFBWUVFQVlGSkJBRUJGUVFDQU9FRUFRQ3hCQU1BZ1FRQUFGa0VBWUF4QkFPQURRUURBK1VBQVFPOUFBTURvUUFDQTVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNTBBQVFPeEFBQ0QxUUFEZ0FFRUF3QWhCQUFBU1FRQmdIRUVBb0NkQkFJQXpRUUFBUUVFQUlFMUJBSUJhUVFCQWFFRUFRSFpCQUVDQ1FRQ0FpVUVBd0pCQkFDQ1lRUUNnbjBFQUFMTkJBT0N1UVFBQXEwRUFnS2RCQUdDa1FRQ0FvVUVBQUo5QkFNQ2NRUUFBbTBFQW9KbEJBTUNZUVFBZ21FRUFBSmhCQUFDWVFRQmdsa0VBNEk5QkFNQ0lRUURnZ1VFQUFIWkJBS0JvUVFDZ1cwRUFBRTlCQU9CQ1FRQmdOMEVBb0N4QkFLQWlRUURBR1VFQUFCSkJBTUFMUVFBZ0IwRUFRQVJCQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBS0FEUVFEQUJVRUF3QWxCQUdBUFFRQ0FGa0VBQUI5QkFJQW9RUUFBTTBFQUlENUJBQUJLUVFDQVZrRUFZR05CQUtCd1FRQWdma0VBQUlaQkFBQ05RUUFnbEVFQVlKdEJBS0NpUVFEQXVVRUE0TFZCQUVDeVFRRGdya0VBd0t0QkFBQ3BRUUNncGtFQWdLUkJBT0NpUVFDZ29VRUFvS0JCQUNDZ1FRQUFvRUVBb0o5QkFLQ2FRUUNnazBFQXdJeEJBQUNHUVFEZ2ZrRUFBSEpCQUlCbFFRQ0FXVUVBQUU1QkFDQkRRUUFBT1VFQXdDOUJBS0FuUVFDZ0lFRUE0QnBCQU1BV1FRQWdGRUVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFvQk5CQUlBVlFRQUFHVUVBSUI1QkFLQWtRUUJnTEVFQVFEVkJBQUEvUVFDQVNVRUF3RlJCQUtCZ1FRRGdiRUVBb0hsQkFHQ0RRUUFnaWtFQTRKQkJBT0NYUVFEZ25rRUFBS1pCQU1EQVFRRGd2RUVBWUxsQkFDQzJRUUJBczBFQW9MQkJBRUN1UVFCZ3JFRUF3S3BCQUlDcFFRQ2dxRUVBSUtoQkFBQ29RUUJncFVFQW9KNUJBT0NYUVFBZ2tVRUFvSXBCQUVDRVFRQUFmRUVBSUhCQkFLQmtRUURBV1VFQWdFOUJBQUJHUVFCZ1BVRUF3RFZCQUdBdlFRQWdLa0VBWUNaQkFBQWtRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQ0FJMEVBUUNWQkFJQW9RUUFnTFVFQUlETkJBRUE2UVFDQVFrRUFvRXRCQUlCVlFRQWdZRUVBWUd0QkFFQjNRUURBZ1VFQUFJaEJBSUNPUVFBZ2xVRUE0SnRCQU1DaVFRREFxVUVBd01kQkFDREVRUUNnd0VFQW9MMUJBTUM2UVFCQXVFRUFBTFpCQUNDMFFRQ2dza0VBWUxGQkFLQ3dRUUFnc0VFQVFLOUJBS0NwUVFEZ29rRUFRSnhCQU1DVlFRQ0FqMEVBUUlsQkFHQ0RRUUJBZTBFQVFIQkJBT0JsUVFCQVhFRUFZRk5CQUdCTFFRQkFSRUVBWUQ1QkFLQTVRUUFnTmtFQUFEUkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFJQXpRUUFnTlVFQUFEaEJBRUE4UVFEQVFVRUFZRWhCQUFCUVFRQ2dXRUVBQUdKQkFDQnNRUURBZGtFQUFJRkJBT0NHUVFBQWpVRUFRSk5CQUtDWlFRQkFvRUVBNEtaQkFNQ3RRUURnemtFQVFNdEJBQURJUVFBQXhVRUFRTUpCQU9DL1FRREF2VUVBQUx4QkFJQzZRUUJndVVFQW9MaEJBQ0M0UVFDZ3RFRUFBSzVCQUdDblFRQUFvVUVBd0pwQkFLQ1VRUUNnamtFQTRJaEJBR0NEUVFCZ2ZFRUFvSEpCQUlCcFFRQWdZVUVBb0ZsQkFBQlRRUUNBVFVFQUlFbEJBT0JGUVFEZ1EwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQWdFTkJBT0JFUVFDZ1IwRUFvRXRCQUtCUVFRRGdWa0VBQUY1QkFBQm1RUURnYmtFQVlIaEJBR0NCUVFEQWhrRUFZSXhCQUNDU1FRQkFtRUVBZ0o1QkFPQ2tRUUJncTBFQUFMSkIxeGR0NS9zK0JvRTFQOWNYUW1EbFBBQUFBQUNxTVRNeU9ERXlPREEwTlpUWUZ3Q0EvajBBb0xRK0FFQWFQZ0FneGo3SVBSTmprdGNXTndBQUFFY0FBQURJUFFRWEFNQ3lRUUFnclVFQWdLZEJBTUNoUVFCQW5FRUFBSmRCQUFDU1FRQWdqVUVBWUloQkFPQ0RRUUJBZjBFQWdIZEJBR0J2UVFEZ1owRUFRR0ZCQUdCYlFRQ2dWVUVBZ0ZCQkFLQkxRUUNBUjBFQTRFTkJBTUJBUVFBZ1BrRUFZRHhCQUdBNlFRQ2dPVUVBb0RsQkFLQTVRUUNnT1VFQTREbEJBR0E3UVFDQVBVRUFnRDlCQUtCQ1FRQUFSa0VBNEVsQkFJQk9RUUNBVTBFQW9GaEJBR0JlUVFBQVpVRUFJR3hCQUdCelFRQmdlMEVBNElGQkFBQ0dRUUNnaWtFQWdJOUJBSUNVUVFDQW1VRUFvSjVCQUNDa1FRREFxVUVBWUs5QkFDQzFRUUFnclVFQWdLZEJBTUNoUVFBZ25FRUFnSlpCQUFDUlFRREFpMEVBd0laQkFBQ0NRUUJnZWtFQWdIRkJBSUJwUVFDZ1lVRUFvRmxCQUtCU1FRQ0FURUVBZ0VaQkFFQkJRUUJBUEVFQUFEaEJBRUEwUVFBQU1VRUFRQzVCQUlBc1FRQmdLa0VBb0NsQkFLQXBRUUNnS1VFQW9DbEJBT0FwUVFDZ0swRUFvQzFCQU1BdlFRRGdNa0VBWURaQkFHQTZRUUJBUDBFQVlFUkJBSUJKUVFDZ1QwRUFvRlpCQU9CZFFRQ0FaVUVBd0cxQkFBQjJRUURnZmtFQVFJUkJBRUNKUVFCQWprRUFZSk5CQU1DWVFRQmdua0VBQUtSQkFNQ3BRUUNncjBFQXdLZEJBT0NoUVFBZ25FRUFnSlpCQU9DUVFRQWdpMEVBd0lWQkFJQ0FRUUFnZDBFQWdHMUJBQ0JrUVFDZ1cwRUF3Rk5CQUtCTFFRQWdSRUVBb0QxQkFLQTNRUUFnTWtFQUlDMUJBSUFvUVFDZ0pFRUFZQ0ZCQUlBZVFRQ2dIRUVBZ0JwQkFLQVpRUUNnR1VFQW9CbEJBS0FaUVFBQUdrRUF3QnRCQUtBZFFRQWdJRUVBUUNOQkFPQW1RUUFnSzBFQUlEQkJBQ0ExUVFDZ09rRUFRRUZCQUdCSVFRQ2dUMEVBd0ZkQkFBQmdRUUNnYUVFQUFISkJBQUI4UVFBQWcwRUFJSWhCQUlDTlFRQWdrMEVBd0poQkFJQ2VRUUJncEVFQWdLcEJBSUNpUVFCZ25FRUFnSlpCQU9DUVFRQWdpMEVBZ0lWQkFNQi9RUURBZEVFQVlHcEJBTUJnUVFBZ1YwRUFBRTVCQU1CRlFRRGdQVUVBNERWQkFPQXVRUURnS0VFQUFDTkJBT0FkUVFBQUdVRUFJQlZCQUtBUlFRQ2dEa0VBd0F4QkFLQUtRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFBQXBCQUFBTVFRREFEVUVBWUJCQkFLQVRRUUJnRjBFQTRCdEJBT0FnUVFBQUprRUFBQ3hCQU9BeVFRQWdPa0VBd0VGQkFBQktRUUJnVWtFQW9GdEJBSUJsUVFDQWIwRUFvSGxCQUNDQ1FRREFoMEVBWUkxQkFDQ1RRUUFnbVVFQVFKOUJBSUNsUVFDQW5VRUFRSmRCQUNDUlFRQkFpMEVBZ0lWQkFNQi9RUUJnZEVFQUlHbEJBRUJlUVFBQVZFRUFRRXBCQU1CQVFRRGdOMEVBQURCQkFBQW9RUUJnSUVFQUFCcEJBQUFVUVFEQURrRUF3QWxCQUlBRlFRQUFBa0VBd1AxQUFPRDVRQUNBOVVBQVFQTkFBRUR6UUFCQTgwQUFRUE5BQUNEMFFBQmcrRUFBd1B0QUFNQUFRUUFBQkVFQTRBZEJBTUFNUVFEQUVVRUFBQmRCQUlBZFFRQ2dKRUVBQUN4QkFDQTBRUUJBUEVFQVFFVkJBQUJQUVFBQVdVRUFBR05CQU1CdFFRRGdlRUVBSUlKQkFPQ0hRUURBalVFQUFKUkJBRUNhUVFDQW9FRUF3SmhCQUVDU1FRQUFqRUVBNElWQkFPQi9RUUJnZEVFQUlHbEJBTUJkUVFDQVVrRUFvRWRCQUlBOVFRRGdNMEVBZ0NwQkFBQWlRUUJBR2tFQUlCSkJBQ0FMUVFCQUJVRUFJUDlBQUFEMVFBQUE3RUFBb09SQUFHRGVRQUFnMmtBQXdOVkFBRURUUUFCQTAwQUFRTk5BQUVEVFFBQkExRUFBd05oQUFDRGNRQUFnNGtBQUFPbEFBQ0R4UUFBQSswQUFvQUpCQUVBSVFRQWdEMEVBUUJaQkFDQWVRUUJnSmtFQTRDNUJBSUE0UVFDQVFrRUFnRXhCQUNCWFFRQkFZa0VBb0cxQkFDQjVRUUNBZ2tFQXdJaEJBQUNQUVFCQWxVRUFnSnRCQUVDVVFRQ2dqVUVBSUlkQkFNQ0FRUUFnZFVFQVFHbEJBTUJkUVFDQVVrRUFJRWRCQU9BN1FRQWdNVUVBSUNkQkFJQWRRUUJBRkVFQVFBeEJBR0FFUVFCQStVQUF3T3hBQU9EZ1FBQ2cxa0FBSU0xQUFHREZRQUFBdjBBQVFMcEFBRUMyUUFCZ3MwQUFRTE5BQUVDelFBQkFzMEFBZ0xSQUFDQzVRQUNBdkVBQXdNSkFBT0RKUUFDZzBrQUFvTnhBQU9EbVFBQmc4MEFBNEFCQkFFQUlRUUNBRUVFQXdCaEJBQUFpUVFBQUxFRUFBRFpCQUlCQVFRQ2dTMEVBQUZkQkFJQmlRUUNBYmtFQUFIdEJBTUNEUVFBQWlrRUFZSkJCQU9DV1FRREFqMEVBSUlsQkFJQ0NRUURBZDBFQUFHdEJBSUJlUVFDZ1VrRUFJRWRCQU9BN1FRQ0FNRUVBUUNWQkFJQWFRUURBRUVFQUlBZEJBS0Q4UUFCQTdVQUE0TnhBQUFEUFFBQWd3MEFBUUxoQUFHQ3VRQUJBcGtBQXdKOUFBR0NhUUFEZ2xrQUFZSk5BQUVDVFFBQkFrMEFBUUpOQUFNQ1VRQUJnbVVBQUlKMUFBR0NqUUFBQXEwQUFRTFJBQUdDK1FBQWd5VUFBd05aQUFDRGxRQUFBOVVBQXdBSkJBS0FMUVFDZ0ZVRUFnQjlCQU9BcFFRQUFOVUVBWUVCQkFPQkxRUUFBV0VFQWdHUkJBQUJ4UVFDQWZVRUFRSVZCQU1DTFFRQ0Fra0VBWUl0QkFNQ0VRUUFnZkVFQXdHNUJBSUJoUVFDQVZFRUFBRWhCQUFBOFFRQ0FNRUVBUUNWQkFPQVpRUUNnRGtFQUFBUkJBS0QwUUFDZzRVQUFJTkZBQUlEQlFBREFzVUFBZ0tWQUFBQ2FRQURBajBBQVFJZEFBR0NBUUFCQWRVQUE0RzVBQU1CbVFBQmdaa0FBWUdaQUFHQm1RQUJBYWtBQVlITkFBTUI3UUFCQWhFQUFJSXhBQU9DVlFBQUFvRUFBNEt0QUFDQzZRQUFneVVBQW9ObEFBSURxUUFBZy9rQUFBQWxCQUVBVFFRQmdIa0VBd0NsQkFFQTFRUUNBUVVFQUFFNUJBSUJhUVFBZ1owRUFJSFJCQU1DQVFRQ2doMEVBZ0k1QkFFQ0hRUUNBZ0VFQVFITkJBT0JsUVFDZ1dFRUFRRXRCQUNBK1FRQ0FNVUVBWUNWQkFPQVpRUUNBRGtFQVFBTkJBQUR3UUFBZzIwQUE0TWRBQUdDMVFBRGdwVUFBZ0pWQUFPQ0hRQURnZDBBQUFHTkFBSUJRUUFCQVFrQUE0RFZBQUdBd1FBRGdKa0FBWUNaQUFHQW1RQUJnSmtBQXdDdEFBS0F6UUFCQVBVQUFZRXBBQU9CYVFBQWdiMEFBNElGQUFDQ1BRQUNnblVBQTRLMUFBQ0MrUUFBZzBVQUFRT1ZBQUdENVFBREFCMEVBSUJOQkFNQWVRUUFBSzBFQWdEZEJBQUJFUVFEQVVFRUE0RjFCQUlCclFRQkFlVUVBZ0lOQkFHQ0tRUUJBZzBFQW9IaEJBQUJyUVFCQVhVRUF3RTlCQUdCQ1FRQWdOVUVBNENkQkFBQWJRUURBRGtFQVFBTkJBT0R2UUFCQTJVQUE0TUpBQUVDdVFBQWdtMEFBb0lsQUFPQjBRQUNnVkVBQTREeEFBR0FtUUFBQUUwQUF3QU5BQU1EdVB3REE0ejhBWU00L0FNRE1Qd0RBekQ4QXdNdy9BQ0RiUHdEZzV6OEFBUDQvQUlBTVFBQkFIa0FBZ0RKQUFPQklRQUFnWlVBQTRJRkFBRUNTUUFBZ3BFQUFZTGhBQUVETVFBQkE0a0FBQVBsQUFDQUlRUUNBRkVFQUFDRkJBSUF0UVFDQU9rRUE0RWRCQUlCVlFRQkFZMEVBQUhGQkFPQitRUUNBaGtFQXdINUJBS0J3UVFEQVlrRUFBRlZCQUVCSFFRQ2dPVUVBUUN4QkFPQWVRUUNnRVVFQWdBUkJBR0R3UUFCQTJVQUFvTUpBQUFDc1FBQ2dsVUFBb0lGQUFBQmRRQUFBUFVBQTRCeEFBTUFCUUFBZzFEOEFvS3MvQUFDTVB3QWdaejhBZ0V3L0FJQWlQd0NnR1Q4QW9Cay9BS0FaUHdEZ1FEOEFvRk0vQUVDQ1B3REFuajhBd01NL0FBRHNQd0JnRDBBQVlDeEFBSUJOUUFEQWJrQUFvSXRBQUVDZlFBQUF0VUFBd010QUFDRGpRQUJBL0VBQWdBcEJBQ0FYUVFCQUpFRUE0REZCQUtBL1FRQkFUVUVBSUZ0QkFFQnBRUUNnZDBFQUFJTkJBQUI0UVFCZ2FVRUFBRnRCQU9CTVFRQUFQMEVBWURGQkFLQWpRUUFBRmtFQXdBaEJBT0QyUUFCZzNFQUFRTU5BQUFDc1FBQmdsVUFBZ0gxQUFBQlJRQUFnS2tBQXdBUkFBTUROUHdCQWpqOEFBRDAvQUNETlBnQkFtajBBZ0IyK0FBQzJ2Z0FBOGI0QW9CbS9BS0FadndBZ0ViOEFZTGkrQUtCOHZnQ2d4THdBb0h3K0FBQWFQd0NBYXo4QWdLdy9BTURyUHdCQUZrQUFvRDFBQUtCa1FBRGdoMEFBZ0o1QUFDQzJRQUJnejBBQUlPaEFBTUFBUVFCQURrRUFBQnhCQUtBcFFRQmdOMEVBZ0VWQkFNQlRRUUFnWWtFQWdIQkJBT0IrUVFEZ2NVRUFBR05CQUVCVVFRQ2dSVUVBUURkQkFDQXBRUUJnRzBFQXdBMUJBT0QvUUFBZzVVQUFnTXBBQU9DdlFBQkFsa0FBZ0gxQUFFQlFRQUFBSTBBQVlPNC9BS0NpUHdDZ09qOEF3R0ErQUtDSnZnQWdLcjhBZ0hLL0FDQ1d2d0NBcnI4QVlMaS9BS0RNdndEQXpMOEFZTUsvQUNDenZ3Q2duNzhBZ0lhL0FLQkh2d0RBN3I0QVFGKzlBR0R6UGdBQWZqOEE0TWMvQUdBTFFBQWdOVUFBZ0dKQUFFQ0pRQUNBb2tBQUlMdEFBRURWUUFDZzhFQUFBQVpCQU1BVFFRREFJVUVBQURCQkFHQStRUUNnVEVFQUlGdEJBS0JwUVFCZ2VFRUFBR3hCQUNCZFFRQkFUa0VBWUQ5QkFJQXdRUURnSVVFQWdCTkJBSUFGUVFDQTcwQUFJTlJBQU1DNFFBQWdua0FBZ0lOQUFNQlNRQUFnSTBBQXdPcy9BR0NSUHdBQTh6NEFBRnkrQUtBNnZ3RGdtTDhBNE1xL0FJRHp2d0FnQ01BQWdBL0FBR0FRd0FDZ0ZzQUFBQmZBQUFBVHdBQmdFTUFBSUF6QUFDQUF3QUFBM0w4QVFMTy9BTUI5dndCZzg3NEFZUEU5QUNCTlB3Q2d0VDhBSUFoQUFDQTVRQUJBYTBBQVlJNUFBRUNwUUFEZ3hFQUFJT0JBQUFEOFFBQkFERUVBb0JwQkFPQW9RUUJnTjBFQUFFWkJBTUJVUVFEQVkwRUE0SEpCQU1CbVFRQ2dWMEVBZ0VoQkFJQTVRUUNnS2tFQXdCdEJBT0FNUVFCQS9FQUFnTjlBQUtERFFBQmdxRUFBd0l4QUFLQmpRQUNBTGtBQVFQTS9BS0NSUHdBZzFUNEFJTlMrQU1DRHZ3Q2d6YjhBZ0FUQUFLQVd3QUJnRWNBQUFQeS9BQ0RndndBZ3piOEF3TXkvQU1ETXZ3REF6TDhBQU5hL0FPRDB2d0FnRGNBQTRCakFBRUFUd0FEQTY3OEFBS3UvQUtBNXZ3QWdpcjBBb0RrL0FDREJQd0JnRVVBQVFFUkFBR0I3UUFEZ21FQUFnTFJBQUFEUlFBQ2c3VUFBSUFWQkFLQVRRUUJBSWtFQVFERkJBRUJBUVFDQVQwRUFvRjVCQU9CdFFRQ2dZVUVBZ0ZKQkFHQkRRUUFnTkVFQUFDVkJBT0FWUVFBQUIwRUFRUEJBQUtEU1FBRGd0RUFBQUpoQUFPQjRRQUNBUWtBQVlBdEFBS0NzUHdCQUJ6OEFZTXErQUdDUnZ3QWc2YjhBb0JmQUFFQVd3QURBNjc4QVFMTy9BQ0NFdndCZ1NyOEF3QnUvQUtBWnZ3Q2dHYjhBb0JtL0FLQTJ2d0RBZHI4QXdLUy9BR0RhdndCZ0RzQUF3Q0hBQU9BSHdBRGd3TDhBSUUyL0FDQ0tQUURBWHo4QUlOby9BTUFqUUFCQVdrQUFnSWxBQUFDbVFBREF3a0FBd045QUFHRDlRQURBRFVFQTRCeEJBQUFzUVFCQU8wRUFZRXBCQUtCWlFRQUFhVUVBd0Z4QkFJQk5RUUJBUGtFQUlDOUJBT0FmUVFEQUVFRUFnQUZCQU1Ea1FBREF4a0FBQUtsQUFJQ0xRQUJnVzBBQVlDRkFBR0RXUHdBZ1VqOEFBTWE5QUNCM3Z3Qmc1TDhBQUI3QUFLQVF3QUNneXI4QXdJSy9BR0Q4dmdCZ2NyMEE0SlkrQU1BRVB3Q2dHVDhBb0JrL0FHQVhQd0FndVQ0QUFPczhBQUMzdmdDQVc3OEFBTGUvQU9BSHdBQkFLTUFBUUF2QUFBQzF2d0NBSXI4QUlMQStBR0NZUHdEZ0EwQUFJRDFBQUdCMlFBQmdtRUFBWUxaQUFLRFVRQUFBODBBQW9BaEJBT0FYUVFBZ0owRUFnRFpCQUFCR1FRQ0FWVUVBQUdWQkFLQllRUUFBU1VFQW9EbEJBQ0FxUVFEZ0drRUFvQXRCQUFENVFBQ2cya0FBWUx4QUFBQ2VRQUJnZjBBQXdFTkFBT0FJUUFDZ216OEFvSnMrQUlBbnZ3RGd3TDhBUUJYQUFBQVl3QUNneXI4QTRGcS9BTUFwdmdBQThqNEFJR3MvQU1DalB3QkF2VDhBd013L0FNRE1Qd0FneHo4QUlLby9BQUNFUHdDQUlqOEFRTTg4QUdBM3Z3Q2d0YjhBWUF2QUFDQXF3QURBL0w4QWdKQy9BQ0NFdmdDZ09qOEFZTTgvQU1BaVFBRGdYa0FBNEkxQUFDQ3NRQUNBeWtBQUlPbEFBQUFFUVFDQUUwRUFBQ05CQUlBeVFRQWdRa0VBd0ZGQkFHQmhRUURnVkVFQVFFVkJBS0ExUVFBZ0prRUFvQlpCQUNBSFFRQkE3MEFBb05CQUFDQ3lRQURnazBBQUFHdEFBSUF1UUFEQTR6OEFvRmsvQU9BWXZnREFqTDhBQVA2L0FFQWl3QURBNjc4QXdJSy9BTUFwdmdBZ05UOEFnS1UvQUlEblB3Q2dEVUFBd0J4QUFFQW1RQUJnSmtBQW9DRkFBQUFTUUFBZytqOEFvTG8vQUtCYVB3QWdpajBBb0UyL0FNRFF2d0NnSDhBQUlCL0FBS0RPdndDZ05iOEE0S0krQUNDa1B3QUFEa0FBQUV0QUFFQ0VRQUFnbzBBQUlNSkFBRURoUUFBZ0FFRUF3QTlCQUlBZlFRQkFMMEVBQUQ5QkFPQk9RUUNnWGtFQW9GRkJBQUJDUVFCQU1rRUFvQ0pCQU9BU1FRQkFBMEVBWU9kQUFHRElRQUJncVVBQVlJcEFBRUJYUUFCQUdrQUFBTHcvQU9BR1B3RGdCcjhBQUx5L0FNQVl3QUJBRXNBQUFLNi9BR0R6dmdBQThqNEFnS1UvQU9BRVFBRGdLa0FBb0VoQUFFQmJRQUNnWlVBQVlHWkFBQUJnUUFEQVRrQUFRRFZBQUFBUVFBQWd3VDhBSURJL0FDQ0V2Z0RBbGI4QUlBVEFBR0F0d0FBQS9MOEFBSVMvQUtERXZBQ0FmejhBQVBvL0FBQTdRQUJBZVVBQUFKeEFBS0M3UUFBZzIwQUF3UHBBQUNBTlFRRGdIRUVBb0N4QkFHQThRUUFnVEVFQUFGeEJBT0JPUVFBQVAwRUFRQzlCQUlBZlFRREFEMEVBSUFCQkFPRGdRQUNBd1VBQVFLSkFBT0NDUUFCZ1IwQUFZQWxBQU9DWFB3QUFTajRBQUZtL0FNRGp2d0NBSk1BQUFQeS9BQUNFdndBQTY3d0FvSFUvQUNEclB3RGdLa0FBSUYxQUFBQ0JRQURBakVBQVlKSkFBRUNUUUFBQWowQUFRSVZBQUFCcFFBQUFPVUFBUUFOQUFNQ1ZQd0FnY0Q0QW9FZS9BR0RjdndCQUtNQUF3QS9BQUtDa3Z3RGdscjRBNEUwL0FBRGtQd0JnTUVBQUFHOUFBT0NXUUFCQXRrQUF3TlZBQUlEMVFBQ2dDa0VBZ0JwQkFHQXFRUUJnT2tFQVFFcEJBRUJhUVFCQVRVRUFRRDFCQUdBdFFRQmdIVUVBZ0ExQkFDRDdRQUJBMjBBQW9MdEFBQUNjUUFCQWVVQUF3RHBBQUFENVB3QkFlejhBb0pDOUFBQ012d0JnQThBQVlDUEFBQ0RXdndBQU9MOEE0S0krQUNDa1B3QUFEa0FBQUVwQUFHQ0JRQUFBbTBBQUlLdEFBQUN5UUFBZ3MwQUE0SzFBQU1DZ1FBQ2dpRUFBSUZsQUFBQWVRQUNnd2o4QVFCTS9BTUFFdndCQXZiOEF3QnpBQUFBYndBQmd1TDhBQVBHK0FJQWlQd0Jnemo4QTRDWkFBTUJtUUFCZ2swQUFZTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFDZ1dVRUFRRXRCQUdBN1FRQ2dLMEVBd0J0QkFBQU1RUUJBK0VBQW9OaEFBQUM1UUFCZ21VQUFJSE5BQUVBelFBREE1ajhBUUU0L0FPQ1d2Z0NncEw4QVFCREFBRUFjd0FCQXZiOEF3QVMvQUlBWlB3Qmd4ejhBZ0NGQUFNQmVRQURnalVBQTRLdEFBR0RHUUFDQTBVQUE0TkpBQUVETFFBQmdzMEFBSUpWQUFJQnNRQUFnTGtBQTROOC9BQUJKUHdCZ3VMNEFRTE8vQUtBWndBQmdKY0FBb015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFvRmxCQU9CSlFRRGdPVUVBNENsQkFBQWFRUUFBQ2tFQUlQUkFBRURVUUFDQXRFQUF3SlJBQUVCcVFBREFLMEFBSU5zL0FPQkFQd0JndUw0QVFMTy9BS0FId0FDZ0I4QUF3TEcvQUdDNHZnQUFTVDhBNE44L0FDQXVRQUNnYkVBQW9KVkFBQUMxUUFDQTBrQUFRTjVBQUNEZFFBQWcxRUFBWUxsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUVDenZ3Q2dHY0FBWUNiQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUtCWlFRQ2dTVUVBb0RsQkFLQXBRUUNnR1VFQW9BbEJBRUR6UUFCQTAwQUFRTE5BQUVDVFFBQmdaa0FBWUNaQUFNRE1Qd0NnR1Q4QUFBKy9BRUNSdndDZ21iOEFvSm0vQU9DR3Z3QmdTNzRBNEZ3L0FHRHFQd0NBTkVBQUlIUkFBQUNhUUFCZ3VFQUF3TUZBQUFEQVFBQ2d2a0FBb0xsQUFJQ3dRQUNnbUVBQVFISkFBQUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFPQWp3QURBeXI4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQ2dXVUVBb0VsQkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUdDelFBQmdrMEFBd0daQUFPQW1RQUJnemo4QUFDTS9BRUMwdlFEQTliMEF3UFc5QU1EMXZRREE5YjBBWU5BOUFLQ0NQd0JBQUVBQUFEOUFBTUI5UUFBQW5FQUFJS1pBQUVDaVFBQUFvRUFBQUo5QUFDQ2FRQUNBazBBQWdJaEFBSUJqUUFEZ0owQUF3TlUvQUtBMlB3Qmd4TDRBb0xPL0FNQVp3QURnRjhBQW9MTy9BSURZdmdCZ0xEOEFRTkUvQU1BblFBQmdaMEFBb0pOQUFJQ3pRQUNBMDBBQVlQTkFBTUFKUVFEQUdVRUFvQ2xCQUtBNVFRQ2dTVUVBb0ZsQkFFQktRUUJnT2tFQVlDcEJBSUFhUVFDZ0NrRUFnUFZBQU1EVlFBQkF0a0FBNEpaQUFNQnZRQUJBTTBBQVFQUS9BS0NaUHdBQWdEOEFBSUEvQUFDQVB3QUFnRDhBQUlBL0FLQ0NQd0NndUQ4QVFCQkFBRUJMUUFDQWdrQUFBSWxBQUdDR1FBRGdna0FBQUlCQUFPQitRQUFnZFVBQVFHbEFBTUJXUUFBZ08wQUFvQTFBQUlDc1B3REE1VDRBUUNDL0FNREl2d0JnSHNBQUlBYkFBR0NUdndBQVA3NEE0RncvQUFEcVB3QkFNMEFBd0hGQUFDQ1lRQUNBdDBBQTROWkFBR0QyUUFBQUMwRUE0QnBCQU1BcVFRQ2dPa0VBb0VwQkFJQmFRUUFnVEVFQVlEeEJBS0FzUVFBQUhVRUFZQTFCQUtEN1FBRGczRUFBZ0w1QUFNQ2dRQUFnaEVBQXdGSkFBT0FrUUFEZ0JrQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUNnQUVBQVFCQkFBT0ExUUFCQVpVQUE0R3BBQU9CVFFBRGdURUFBSUVkQUFDQkFRQUNnUDBBQTREVkFBSUFyUUFCQUdrQUF3QU5BQUlERlB3Q2dWajhBUUYrOUFDQit2d0FnOGI4QUlCdkFBT0RadndCZ1VMOEFBRDgrQUdDVFB3QkFCa0FBb0VKQUFLQi9RQUNnbmtBQXdMMUFBQ0RkUUFDQS9FQUE0QTFCQUtBZFFRQkFMVUVBQUQxQkFNQk1RUUNBWEVFQVFFOUJBTUEvUVFCZ01FRUFBQ0ZCQU1BUlFRREFBa0VBSU9oQUFJRExRQUFBc0VBQVFKWkFBTUIrUUFCZ1drQUFvRVJBQUFCQVFBQUFRRUFBQUVCQUFBQkFRQUFBUUVBQVlFQkFBRUJMUUFDQVprQUFvR0pBQU9BMlFBRGdGa0FBNEF4QUFNQUlRQUFnQUVBQUFBQkFBTUR1UHdBZzJ6OEF3THMvQUlDU1B3QWdPajhBb0xVOUFHQTN2d0RBdTc4QVFBL0FBSUQ4dndDZ2w3OEFJTEMrQU1Ba1B3Qmd3ejhBZ0J0QUFBQlhRQURBaVVBQUlLaEFBR0RHUUFEZzVFQUF3QUZCQUVBUlFRREFJRUVBWURCQkFDQkFRUURBVDBFQWdGOUJBS0JUUVFCZ1JFRUFZRFZCQUlBbVFRRGdGMEVBZ0FsQkFDRDNRQUJnM0VBQVFNTkFBSUNzUUFEZ21FQUFJSXBBQU1DQlFBQUFnRUFBQUlCQUFBQ0FRQUFBZ0VBQUFJQkFBQ0NBUUFBZ2hFQUFnSHhBQU1CRFFBQ2dDMEFBSUx3L0FBQ2FQd0RBbFQ4QWdJQS9BQUNBUHdBZ1p6OEE0RUEvQU1BRVB3QUFQejRBSUlTK0FDQkN2d0NBdGI4QVlBTEFBS0QzdndDQW83OEFvQkcvQU1DWVBnQ0FrRDhBQVAwL0FHQTNRQUNBY0VBQUlKVkFBSUN5UUFDZzBFQUE0TzVBQUtBR1FRREFGVUVBQUNWQkFFQTBRUUNnUTBFQUlGTkJBTUJpUVFBQVdVRUFJRXBCQUtBN1FRQkFMVUVBUUI5QkFLQVJRUUNBQkVFQVlQQkFBS0RaUUFCZ3hVQUFvTFJBQUVDb1FBQmdvVUFBQUtCQUFBQ2dRQUFBb0VBQUFLQkFBQUNnUUFBZ29FQUFvSmRBQUNCMFFBQ0FORUFBWU9vL0FLQmVQd0RBTWo0QUFQTTlBS0NRdlFEQTliMEE0QjYrQUFDMnZnQkFFNzhBQUZtL0FLQ1d2d0FBenI4QUlPKy9BRURWdndDQWtMOEE0QTYvQUtDQ1BnRGdmajhBNE5vL0FHQWdRQURBVlVBQW9JWkFBRUNqUUFEQXYwQUFnTnhBQU1ENVFBREFDMEVBNEJwQkFBQXFRUUJBT1VFQVlFaEJBS0JYUVFEZ1prRUFZRjlCQUFCUlFRQUFRMEVBUURWQkFPQW5RUUFBRzBFQXdBNUJBR0FEUVFBZzhrQUFJT0JBQUlEUlFBRGd4a0FBSU1GQUFBREFRQUFBd0VBQUFNQkFBQURBUUFBQXdFQUFBTGRBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVFMUytBTUIzdndBQWpMOEFvSm0vQUFDYXZ3Q0FycjhBd01LL0FNRGp2d0JBQk1BQVlPcS9BS0NZdndCZ1I3OEFJSmErQU1DeVBnRGdmajhBb05rL0FBQWFRQUNnUjBBQUlIbEFBQUNYUUFBQXNrQUFJTTVBQU1EcVFBQ2dBMEVBd0JGQkFDQWdRUURBTGtFQVlEMUJBRUJNUVFBQVcwRUFvR2xCQUtCbVFRRGdXRUVBUUV0QkFDQStRUUNBTVVFQVlDVkJBQUFhUVFDQUQwRUFJQVpCQUFEOFFBQWc3MEFBQU9aQUFBRGhRQUFBNEVBQUFPQkFBQURnUUFBQTRFQUFBTmRBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdBZ3NyOEFJQUhBQUVBS3dBQUFETUFBd0JQQUFFQWR3QUJBTE1BQTRCbkFBTUM0dndEZ0JiOEFRTFU5QUdBR1B3QkFnVDhBSU1VL0FJQUpRQUFBTWtBQXdGNUFBQ0NHUUFCQW5VQUF3TFJBQUNETlFBRGc1a0FBd0FCQkFFQU9RUUFnSEVFQVlDcEJBS0E0UVFEZ1JrRUFRRlZCQU1CalFRQ2diRUVBb0Y5QkFBQlRRUURnUmtFQVFEdEJBQ0F3UVFEQUpVRUFRQnhCQU1BVFFRQmdERUVBb0FaQkFLQUNRUUNBQUVFQUFBQkJBQUFBUVFBQUFFRUFBUGRBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFJSysvQUdEbHZ3REE1cjhBd1BpL0FDQUF3QURnQ01BQXdCWEFBS0FYd0FDZzBiOEFRSEMvQUlBTnZ3RGdHTDRBQUxrK0FBQnFQd0JBdXo4QTRBZEFBQ0ExUUFCZ1lrQUE0SWRBQUVDZ1FBQ0F1a0FBUU5WQUFNRHdRQUNBQmtFQTRCUkJBQ0FqUVFDQU1VRUFJRUJCQU9CT1FRREFYVUVBUUdWQkFJQllRUUFnVEVFQVlFQkJBRUExUVFBQUswRUFvQ0ZCQUVBWlFRQkFFa0VBd0F4QkFPQUlRUUNnQmtFQTRBVkJBTUFGUVFEQUJVRUFnQVZCQUdENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEE0S2UrQU1CS3Z3REFUTDhBUUU2L0FDQjZ2d0NBZ0w4QUlKYS9BRUN3dndBZzJiOEFJUGUvQUVEcHZ3Qmd2TDhBWUlxL0FBQVZ2d0JBenp3QVlEYy9BSUMxUHdEZ0IwQUFnRFZBQUdCblFBQWdqa0FBWUtsQUFJREZRQUFnNGtBQXdQNUFBTUFOUVFCZ0hFRUFRQ3RCQUVBNlFRQmdTVUVBb0ZoQkFFQmNRUURnVGtFQUFFSkJBS0ExUVFEQUtVRUF3QjVCQUlBVVFRQ0FDMEVBd0FOQkFDRDdRQUNBOGtBQXdPMUFBTURzUUFEQTdFQUF3T3hBQU1Ec1FBREE2MEFBd05sQUFFQzZRQUJnbWtBQVFIVkFBT0ExUUFEZzdqOEFnSEEvQUdERVBnQmd1RDRBWUxnK0FPQ1dQZ0RBOVQwQW9KQTlBSUFkdmdBZzFyNEFZRWUvQUdDWXZ3Q0EzYjhBSUFmQUFPRDR2d0NBczc4QW9GYS9BS0MxdlFCZ056OEFBTGMvQUtBT1FBQWdSRUFBQUh4QUFLQ2FRQUJBdDBBQUFOUkFBR0R4UUFDZ0IwRUF3QlpCQUFBbVFRQWdOVUVBWUVSQkFLQlRRUUFBVkVFQUlFWkJBS0E0UVFDZ0swRUFBQjlCQUNBVFFRQWdDRUVBWVB4QUFDRHJRQUJBM1VBQVFOTkFBT0ROUUFEQXpFQUF3TXhBQU1ETVFBREF6RUFBd014QUFDRE1RQUFndmtBQVFLQkFBT0NCUUFBZ1NVQUFBQk5BQUtEUlB3Q2dzejhBUUxNL0FFQ3pQd0NncEQ4QW9Kay9BQUNNUHdBZ1p6OEFvQ00vQUNCd1BnREFzcjRBUUdxL0FLREh2d0RnRGNBQVlBM0FBS0RIdndDZ1dyOEFRTSs4QUlCYlB3QmcyajhBUUNaQUFHQmZRQUNnakVBQVFLcEFBSURJUUFEQTVrQUFvQUpCQU1BUlFRQUFJVUVBWURCQkFNQS9RUUJBVDBFQXdFeEJBR0ErUVFCQU1FRUFnQ0pCQUVBVlFRQ0FDRUVBSVBsQUFDRGpRQURnejBBQUFNQkFBSUMwUUFBZ3JrQUF3S3hBQU1Dc1FBREFyRUFBd0t4QUFNQ3NRQURnckVBQXdLOUFBS0NwUUFBZ2tFQUF3R3hBQU9CQVFBRGdJa0FBd0JsQUFLQVpRQUNnR1VBQVFCQkFBTUFNUUFEQUEwQUFZTzQvQUlERlB3Q0FrRDhBQUJVL0FLQzF2UURBWDc4QVlOVy9BT0Fad0FBQUVNQUFvTHEvQUlBaXZ3QkF0ajRBUUtFL0FPQUtRQUNnUmtBQW9JRkFBQUNnUUFCZ3ZrQUE0TnhBQUtEN1FBQkFEVUVBNEJ4QkFHQXNRUURnTzBFQWdFdEJBSUJHUVFDZ04wRUFBQ2xCQUtBYVFRQ2dERUVBQVA1QUFDRGtRQURneTBBQUlMWkFBTUNqUUFBZ2xrQUFZSTVBQU1DTVFBREFqRUFBd0l4QUFNQ01RQURBakVBQUFJMUFBS0NRUUFEZ21rQUFJSjlBQUVDTlFBRGdka0FBUUdCQUFLQlpRQUNnV1VBQUFGbEFBRUJQUUFCZ1RFQUFRRUpBQUFBMFFBQkFIVUFBNFBrL0FFQ3hQd0JnSlQ4QVlJSytBSUNMdndCZy9MOEFZQ2ZBQUVEOHZ3QkFpYjhBd05pOUFPQm5Qd0FBN0Q4QWdESkFBTUJ2UUFEQWxrQUF3TFZBQU1EVVFBRGc4MEFBZ0FsQkFFQVpRUURnS0VFQXdEaEJBSUJJUVFDQVFVRUFJREpCQUFBalFRQUFGRUVBUUFWQkFNRHRRQURnMFVBQVFMZEFBTUNlUUFCQWlVQUFJSEZBQU1CZFFBQ2dXVUFBb0ZsQUFLQlpRQUNnV1VBQW9GbEFBQUJhUUFDQVkwQUFJSDFBQUdDUlFBQWdvRUFBWUpoQUFHQ1BRQURnakVBQXdJeEFBQ0NNUUFCQWgwQUF3SVZBQUdDQVFBQWdjRUFBSUZWQUFJQXdRQUFnQVVBQWdKMC9BRUMyUGdBZ0s3OEFnTXUvQUlBaHdBQkFGc0FBZ0xPL0FNRHV2Z0JBSUQ4QXdNZy9BQ0FpUUFCQVlFQUFZSTlBQU9DdVFBQ2d6a0FBWU81QUFBQUhRUURnRmtFQXdDWkJBSUEyUVFCZ1JrRUFvRDFCQUFBdVFRQmdIa0VBNEE1QkFFRC9RQURnNEVBQUlNTkFBRUNtUUFEQWlrQUFJR05BQUlBNVFBQmdIMEFBb0JsQUFLQVpRQUNnR1VBQW9CbEFBS0FaUUFBZ0drQUFZQ2RBQU1CSVFBQWdkVUFBb0pOQUFDQ3JRQURBcmtBQTRLeEFBTUNzUUFDZ3EwQUFJS2RBQUdDbFFBQ2duMEFBZ0pWQUFLQ0VRQUJBV2tBQXdDUkFBT0RUUHdBQU9EOEE0S0srQUFDbHZ3QkFFTUFBQUNiQUFNRFZ2d0NnTnI4QVlNUStBSUN6UHdBQUdVQUF3RmRBQUVDTFFBREFxa0FBUU1wQUFNRHBRQUNnQkVFQWdCUkJBR0FrUVFCQU5FRUFRRVJCQUFBN1FRQWdLMEVBUUJ0QkFJQUxRUUNBOTBBQUlOaEFBT0M0UUFBZ21rQUE0SGRBQU9BOVFBQkFDVUFBWU1ZL0FFQ3pQd0JBc3o4QVFMTS9BRUN6UHdCQXN6OEFJTFUvQUNEZlB3QUFHMEFBSUU5QUFFQ0VRQUFnb2tBQVFMOUFBRURNUUFEQXpFQUFRTXRBQUFESFFBRGd4RUFBb0w1QUFPQ3dRQUNnbUVBQUlIZEFBQ0E2UUFBQStUOEFRSHMvQUtDUXZRQUFqTDhBd0FQQUFHQXF3QURnNTc4QW9GTy9BS0I4UGdDZ256OEFZQTVBQU9CTlFBRGdoa0FBd0taQUFNREdRQUNnNWtBQVFBTkJBRUFUUVFCQUkwRUFRRE5CQUVCRFFRREFPVUVBd0NsQkFNQVpRUURnQ1VFQXdQTkFBTURUUUFEZ3MwQUFBSlJBQUlCb1FBQmdLVUFBUU5ZL0FNQkdQd0JndUQ0QVlMZytBR0M0UGdCZ3VENEFZTGcrQUNEYlBnQkFoRDhBb1BVL0FDQTRRQURnZGtBQUFKdEFBTUM2UUFBZzJrQUF3T3RBQU1EcVFBRGc1a0FBWU9SQUFPRGFRQUJBd1VBQVFLSkFBT0NDUUFBZ1IwQUF3QWhBQU1DVlB3QUE4ejBBQUlDL0FBQUF3QURnTHNBQW9QeS9BQUIvdndEQTlUMEFvSmsvQU1BTVFBREFURUFBWUlaQUFHQ21RQUJneGtBQVlPWkFBRUFEUVFCQUUwRUFRQ05CQUVBelFRQkFRMEVBd0RsQkFNQXBRUURBR1VFQTRBbEJBTUR6UUFEQTAwQUE0TE5BQUFDVVFBQ0FhRUFBWUNsQUFBRFdQd0NnTmo4QTRMRytBTUJLdndEQVRMOEF3RXkvQU1CS3Z3RGdwTDRBd0V3L0FHRG1Qd0FBTTBBQVFISkFBTUNZUUFCQXVFQUE0TmRBQUFEM1FBRGdBMEVBQUFOQkFBRC9RQURBNUVBQVlNVkFBT0NsUUFCQWhrQUF3RXhBQU1BTVFBQ2dtVDhBd1BVOUFBQ0F2d0FBQU1BQWdEREFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFCQUEwRUFRQk5CQUVBalFRQkFNMEVBUUVOQkFBQTdRUUFnSzBFQVFCdEJBSUFMUVFCZzkwQUE0TmRBQUVDNFFBREFtRUFBUUhKQUFBQXpRQUJnNWo4QXdFdy9BQUN0dmdEQXBiOEFvT0svQUdEbHZ3Q0FyNzhBWU1TK0FLQTJQd0FBMWo4QVFDbEFBTUJuUUFBQWswQUE0TEZBQUlEUVFBQ2c3VUFBQVB0QUFJRDhRQUNnOVVBQXdONUFBQ0RBUUFBQW9VQUFvSUZBQUtCRVFBQmdCa0FBSUpFL0FPRGNQUUFBZ0w4QUFBREFBTUFxd0FEQTdyOEFJR2UvQU9BZVBnQUFtajhBNEF4QUFPQk1RQUJnaGtBQVlLWkFBR0RHUUFCZzVrQUFRQU5CQUVBVFFRQkFJMEVBUUROQkFFQkRRUUFBUFVFQUlDMUJBQ0FkUVFCQURVRUFnUHBBQUtEYVFBREF1a0FBQUp0QUFPQjJRQUFnT0VBQTRQTS9BR0J4UHdDQS9MMEF3SlcvQUVBSXdBRGdITUFBWU1lL0FJQVp2d0RBQkQ4QXdMcy9BRUFhUUFEZ1ZrQUF3SWxBQU9DblFBQkF4RUFBSU5aQUFFRGJRQURnM0VBQXdOZEFBQURNUUFDZ3RFQUFJSmhBQUdCMFFBREFOMEFBNFBNL0FHQnhQd0JnNXIwQUlKRy9BR0FHd0FBZ0tjQUF3T08vQUlCTXZ3QUF0ajRBZ0s0L0FFQVZRQUNnVTBBQUlJbEFBS0NvUUFCQXlFQUFBT2hBQU9BRFFRRGdFMEVBd0NOQkFNQXpRUUNnUTBFQW9ENUJBTUF1UVFBQUgwRUFJQTlCQU9EK1FBQmczMEFBNEw5QUFHQ2dRQURnZ0VBQWdFSkFBTUFEUUFBQWpEOEFRSm85QUlCeXZ3QWc5TDhBb0NQQUFNRGp2d0FBV2I4QUFEOCtBR0NUUHdBZ0JrQUFvRUZBQUVCN1FBQmdtRUFBQUsxQUFDQzNRQUNndTBBQVlMMUFBSUM0UUFBQXNFQUE0SjlBQU1DSVFBQmdXMEFBWUNKQUFBRFBQd0FnTkQ4QUlMbStBQ0NxdndEZ0VzQUE0Q0RBQU1ESXZ3QkFJTDhBQVBFK0FHQzRQd0FnRzBBQW9GcEFBRUNOUUFBQXJVQUF3TXhBQUlEc1FBQWdCa0VBNEJWQkFNQWxRUUNBTlVFQVlFVkJBQ0JCUVFCZ01VRUFvQ0ZCQU1BUlFRQUFBa0VBb09SQUFHREZRQUJBcGtBQVFJZEFBSUJRUUFEZ0VrQUFJS28vQUNDNVBnQ2dOcjhBd05PL0FLQWh3QUJBQnNBQVlKTy9BQUEvdmdCZ1VEOEE0TmsvQU1BalFBQ2dWMEFBZ0lGQUFNQ1BRQURnbDBBQUFKeEFBQ0NlUUFBZ21VQUF3SkZBQU9DRlFBQ2daa0FBNERoQUFBQUVRQUJnblQ4QUlLSStBS0ExdndBZ3o3OEFBQ0hBQUFBT3dBQWdwTDhBNEtLK0FBQTRQd0RnMVQ4QVFDaEFBQ0JtUUFBZ2trQUFRTEZBQUtEUVFBQWc4RUFBNEFkQkFNQVhRUUNnSjBFQWdEZEJBR0JIUVFEZ1EwRUFRRFJCQUtBa1FRQWdGVUVBZ0FWQkFBRHNRQUFBelVBQUFLNUFBQUNQUUFBZ1lFQUFvQ0pBQUlETFB3QWdLajhBSU0yK0FLQ3J2d0FnRXNBQW9CckFBR0REdndEQUpMOEFJTEErQUtDWFB3Q0EvRDhBQUNwQUFLQk1RQUNnWWtBQTRIQkFBQ0I1UUFCZ2ZVQUFRSE5BQUNCbVFBQkFVa0FBSURSQUFDQU9RQUFnd1Q4QUlESS9BTUJndmdDQWk3OEFRUDYvQUlBbXdBQmc4TDhBQUhhL0FBRHJQQUFBaEQ4QUFQdy9BS0E2UUFBZ2QwQUFJSnBBQU9DNFFBRGcxMEFBNFBaQUFBQUxRUUNBR2tFQUlDcEJBT0E1UVFDQVNVRUFnRWRCQUFBNFFRQ0FLRUVBNEJoQkFHQUpRUURnODBBQUFOVkFBR0MyUUFEZ2wwQUFRSE5BQUlBMlFBQkE5RDhBd0hZL0FLREV2QURnZmI4QUFQRy9BQ0Fsd0FBQS9iOEFnSkMvQU1DWXZnQ2dFVDhBQUtJL0FNRHJQd0FnRWtBQUlDVkFBQ0F5UUFDZ09rQUFvRDVBQUVBMFFBQkFLRUFBUUJaQUFFRDhQd0JndGo4QW9GWS9BQ0NLUFFDZ1RiOEF3TSsvQUdBYndBQmdGTUFBNExlL0FFQU12d0NnNlQ0QUFLNC9BRUFTUUFEQVRrQUF3SVZBQUFDa1FBQmd3a0FBd09CQUFFRC9RQURnRGtFQVlCNUJBT0F0UVFCZ1BVRUE0RXhCQUdCTFFRRGdPMEVBWUN4QkFBQWRRUURBRFVFQUFQMUFBTURlUUFCZ3dFQUFBS0pBQUtDRFFBQUFTMEFBd0E5QUFJQ3NQd0NnNlQ0QVFBeS9BSUMzdndBQUVzQUFvQjNBQU9EYXZ3RGdmcjhBb0lLK0FBRHlQZ0NBZlQ4QW9Lcy9BRURQUHdCQTVqOEF3UGcvQUVEL1B3Qmc2ajhBd05VL0FJQ3pQd0JBaVQ4QWdDSS9BRURQdkFCZ043OEFvTFcvQUdBTHdBQUFJTUFBWU9TL0FPQjJ2d0JBWDcwQW9HYy9BS0RsUHdEZ0swQUFZR1ZBQUNDUVFBQWdya0FBZ014QUFPRHFRQUNnQkVFQXdCTkJBQUFqUVFBZ01rRUFnRUZCQU9CUVFRQ0FUMEVBUUVCQkFDQXhRUUFBSWtFQXdCSkJBS0FEUVFEQTZFQUFnTXBBQUtDc1FBQkFqMEFBSUdWQUFPQXJRQUNnNVQ4QW9HYy9BRURQdkFBQWFyOEFBTnEvQUdBZHdBQkFHY0FBb05tL0FNQ0R2d0JnODc0QW9NUThBQ0ROUGdCZ0xEOEFRRTQvQUNCNlB3QUFnRDhBNEZ3L0FLQTJQd0RBN2o0QXdOZzlBRUMydmdDQVg3OEFRTHUvQU9BSHdBRGdJTUFBZ1B5L0FBQ1l2d0JneXI0QVFBYy9BQUN1UHdCZ0QwQUFnRWhBQU9DQVFBQ0FuVUFBSUxwQUFHRFhRQUFnOVVBQW9BbEJBT0FZUVFBQUtFRUFJRGRCQUdCR1FRQ0FWVUVBZ0ZSQkFHQkZRUUFnTmtFQUFDZEJBT0FYUVFEQUNFRUE0UE5BQU1EV1FBQWd1a0FBZ0oxQUFPQ0FRQUNBU0VBQXdBOUFBSUN6UHdEZ0Z6OEF3SmkrQUlDT3Z3Qmc2NzhBSUJ2QUFPQVl3QURBNjc4QWdLeS9BTUIydndCZ0xMOEFnTmkrQU9DV3ZnREE5YjBBd1BXOUFHQkx2Z0JneEw0QVFDQy9BT0JudndCQW9iOEFZTnEvQUtBUHdBRGdHY0FBUVBPL0FHQ2p2d0NnRWI4QXdKZytBTUNPUHdCQTh6OEFnQzVBQUdCbFFBQWdqMEFBd0t0QUFHRElRQUFBNVVBQTRBQkJBR0FQUVFBZ0hrRUFJQzFCQUVBOFFRQmdTMEVBb0ZwQkFLQlpRUUJnU2tFQVlEdEJBR0FzUVFDZ0hVRUFJQTlCQU9BQVFRQUE1VUFBWU1oQUFNQ3JRQUJBajBBQVFHZEFBQUF5UUFDZy9UOEFBSmcvQUNEVlBnQWcxYjRBZ0ltL0FHRFZ2d0RnRGNBQTRCekFBT0FPd0FCQTlMOEFRTSsvQUNDMXZ3Q2dwTDhBb0ptL0FLQ1p2d0RBbTc4QVFMSy9BTURJdndBQTdMOEFnQXJBQU9BWXdBQkFEY0FBb05hL0FNQ092d0NBQnI4QW9JSStBT0IrUHdEZzJqOEE0QjlBQUtCU1FBQ0FnMEFBWUo1QUFDQzZRQURBMWtBQVlQTkFBQUFJUVFCQUZrRUFvQ1JCQUNBelFRREFRVUVBb0ZCQkFNQmZRUURnWGtFQUFGQkJBR0JCUVFEZ01rRUFvQ1JCQUVBV1FRQUFDRUVBWVBOQUFNRFdRQURBdWtBQTRKOUFBSUNGUUFBQVdFQUE0Q1JBQU1EclB3QmdrVDhBWU5zK0FHQ0N2Z0NBVzc4QWdLeS9BS0RpdndBQUNNQUFnQlRBQUlBV3dBQ0FGTUFBd0EzQUFNQU13QUNnRE1BQUFBdkFBT0FSd0FDQUU4QUFBQkhBQUdBRHdBQWczYjhBZ0t5L0FJQmJ2d0FnbHI0QVlNbytBRUNBUHdDZzJUOEFBQnBBQUtCSFFBQUFlVUFBQUpaQUFPQ3ZRQUNBeWtBQW9PVkFBT0FBUVFBZ0QwRUFZQjFCQU1BclFRQUFPa0VBWUVoQkFPQldRUUNBWlVFQUlHVkJBTUJXUVFCZ1NFRUFBRHBCQU1BclFRQmdIVUVBSUE5QkFDQUJRUURnNWtBQVFNeEFBQ0N5UUFDZ21FQUF3SDVBQUVCUVFBQUFJMEFBSU93L0FPQ2RQd0JnSlQ4QVFGODlBS0RwdmdDZ1diOEE0SmUvQUFDM3Z3QWcwYjhBQU9hL0FNRHV2d0FBQU1BQVFQKy9BR0RxdndEQTQ3OEFZTXkvQUVDd3Z3Q0FqTDhBZ0ZDL0FNRGx2Z0JBWHowQVlDVS9BQUNZUHdCZzVEOEFJQnBBQUVCSFFBQ0FkRUFBQUpGQUFFQ3BRQURBd2tBQVlOeEFBT0QyUUFEQUNFRUFnQlpCQUtBa1FRRGdNa0VBUUVGQkFJQlBRUURnWFVFQUlHeEJBQ0JzUVFEZ1hVRUFnRTlCQUVCQlFRRGdNa0VBd0NSQkFBQVhRUUNnQ1VFQW9QaEFBT0RlUUFCQXhVQUFZS3hBQUdDVlFBQ0FmVUFBWUZCQUFHQW5RQUFnQVVBQUlMcy9BQ0IrUHdDQURUOEE0QmcrQUFCS3ZnQUE4YjRBWUN5L0FNQk12d0FnWjc4QUFJQy9BQUNBdndEZ1hMOEFnRXkvQUlBaXZ3QWcxcjRBd05pOUFBQktQZ0FBR2o4QUlINC9BQ0M3UHdDQUFFQUF3Q1JBQUFCTFFBQ2dkRUFBNEpCQUFJQ25RQUJBdmtBQUlOWkFBSUR2UUFDQUJFRUFvQkZCQU9BZVFRQmdMRUVBUURwQkFHQklRUUNnVmtFQUFHVkJBRUJ6UVFCQWMwRUFBR1ZCQU1CV1FRQ0FTRUVBb0RwQkFDQXRRUURBSDBFQW9CSkJBT0FGUVFBZzhrQUFvTmxBQUtEQ1FBQUFyRUFBWUpWQUFFQ0FRQUJnV2tBQWdEVkFBQ0FWUUFBQThUOEFZTHcvQUtDTlB3Q0FYRDhBZ0NJL0FJRFlQZ0FBdGo0QTRCNCtBTUQxUFFEQTlUMEFZRXMrQUdDNFBnQUE4VDRBWUN3L0FFQm9Qd0RnbHo4QW9NRS9BQ0R4UHdBZ0ZVQUFnRFZBQUFCWlFBQWdma0FBUUpKQUFJQ25RQUFndmtBQXdOUkFBR0RyUUFDQUFVRUFJQTVCQUFBYlFRRGdKMEVBSURWQkFHQkNRUUFBVUVFQUFGNUJBQ0JzUVFDQWVrRUFnSHBCQUVCc1FRQmdYa0VBb0ZCQkFFQkRRUUFBTmtFQUFDbEJBRUFjUVFDQUQwRUFZQU5CQU9EdlFBQkEyVUFBb01KQUFDQ3RRQURnbVVBQUlJZEFBS0JyUUFCQVRrQUF3REZBQUlBWlFBQmdBMEFBb09jL0FHRE1Qd0FndFQ4QWdLNC9BQUNhUHdDZ21UOEFvSmsvQU1DYlB3REFzVDhBWUxnL0FDRFJQd0JnN2o4QVlBbEFBSUFiUUFBZ00wQUFRRTVBQUtCclFBQWdoMEFBNEpoQUFNQ3JRQUFndjBBQXdOUkFBR0RyUUFBQUFVRUFZQXhCQUNBWVFRQ0FKRUVBWURGQkFDQStRUUJBUzBFQW9GaEJBQUJtUVFEQWMwRUE0SUJCQUFDQlFRQkFkRUVBd0daQkFJQlpRUUJBVEVFQVlEOUJBS0F5UVFBQUprRUFBQnBCQUlBT1FRQkFBMEVBNE85QUFDRGFRQUNneGtBQWdMTkFBTUNoUUFBQWtrQUF3SU5BQUFCc1FBQmdWRUFBQUVGQUFJQXhRQUJBSkVBQUlCcEFBRUFWUUFEZ0RFQUF3QXhBQU1BTVFBQmdEVUFBWUJkQUFDQWJRQURBSmtBQW9EUkFBSUJHUUFCZ1YwQUFvRzVBQU1DRFFBQUFra0FBd0tGQUFHQ3pRQUJneFVBQWdOaEFBRURzUUFBQUFVRUFRQXhCQUtBWFFRQUFJMEVBb0M1QkFBQTdRUURBUjBFQWdGUkJBSUJoUVFEQWJrRUFJSHhCQU9DRVFRQWdoVUVBQUgxQkFLQnZRUUNnWWtFQTRGVkJBQUJKUVFDQVBFRUFvREJCQUVBbFFRRGdHVUVBb0E1QkFLQURRUUJnODBBQUlPQkFBQURPUUFCQXZVQUFvSzVBQUdDZ1FBREFrMEFBNElkQUFBQi9RQUNnYjBBQXdHSkFBQUJhUUFDZ1UwQUE0RXhBQU1CTVFBREFURUFBUUUxQUFPQlZRQUNnV2tBQVFHVkFBS0J5UUFDZ2dVQUFZSXBBQU9DVVFBREFvRUFBb0s1QUFFQzlRQUFBemtBQXdOOUFBQ0R5UUFDZ0FrRUFvQXhCQUtBWFFRRGdJa0VBUUM1QkFLQTVRUUJBUlVFQWdGRkJBQ0JlUVFEZ2FrRUF3SGRCQUlDQ1FRQWdpVUVBb0lsQkFBQ0RRUUFBZVVFQVFHeEJBSUJmUVFBZ1UwRUFRRWRCQU9BN1FRQ0FNRUVBUUNWQkFFQWFRUUFnRUVFQWdBWkJBR0Q2UUFEZzZFQUFvTmxBQUVETFFBQkF2VUFBWUxGQUFHQ21RQUNBbmtBQTRKWkFBS0NRUUFBQWpVQUFJSWxBQUdDR1FBQmdoa0FBWUlaQUFJQ0dRQUJBaWtBQVFJMUFBT0NSUUFCZ21FQUFRS0JBQUdDcFFBQ0Fza0FBWUw1QUFFRExRQUNnMlVBQTRPaEFBR0Q2UUFBZ0JrRUFZQTlCQUFBWlFRQkFJMEVBUUM1QkFJQTVRUURnUkVFQVFGQkJBT0JiUVFBQWFFRUFnSFJCQUtDQVFRQWdoMEVBb0kxQkFDQ09RUURBaDBFQVFJRkJBT0IxUVFDZ2FVRUE0RjFCQUlCU1FRQWdSMEVBNER0QkFNQXdRUUNBSmtFQTRCeEJBR0FUUVFDQUNrRUFZQUpCQUNEMlFBRGc1MEFBNE5wQUFBRFBRQUJBeFVBQWdMMUFBRUMyUUFBQXNFQUE0S3hBQUtDb1FBQmdwa0FBWUtaQUFHQ21RQUNBcGtBQXdLbEFBQ0N0UUFCQXNVQUFnTGRBQUNDL1FBQWd5RUFBb05CQUFDRGNRQUFnNkVBQUlQWkFBR0FDUVFDQUNrRUFZQk5CQUVBY1FRRGdKVUVBZ0M5QkFPQTVRUURnUkVFQUlGQkJBSUJiUVFEZ1prRUFZSEpCQUlCK1FRQ0FoVUVBNEl0QkFFQ1NRUURna2tFQWdJeEJBRUNHUVFBZ2dFRUFnSFJCQUNCcFFRREFYVUVBZ0ZKQkFHQkhRUUFBUFVFQVFETkJBTUFwUVFDZ0lFRUFJQmhCQUlBUVFRQmdDVUVBWUFKQkFLRDRRQUFBN1VBQVFPUkFBSURjUUFDZzFVQUFnTTlBQUtETVFBQkF5RUFBWU1aQUFHREdRQUJneGtBQWdNWkFBQ0RKUUFBZ3pVQUFvTkJBQU9EV1FBQWcza0FBd09aQUFFRHZRQURBK1VBQXdBSkJBR0FKUVFDQUVFRUFJQmhCQUtBZ1FRQ0FLVUVBb0RKQkFFQThRUUFBUmtFQVlGQkJBSUJiUVFEQVprRUFJSEpCQUlCOVFRQ0FoRUVBZ0lwQkFNQ1FRUUFBbDBFQXdKZEJBSUNSUVFCZ2kwRUFnSVZCQU1CL1FRQmdkRUVBSUdsQkFBQmVRUUNBVTBFQW9FbEJBQUJBUVFEZ05rRUFJQzVCQUNBbVFRRGdIa0VBd0JkQkFDQVJRUUFnQzBFQXdBVkJBS0FCUVFDZyswQUFBUFZBQUNEdlFBQmc3RUFBQU9oQUFHRG1RQUJnNWtBQVlPWkFBSURtUUFEQTZFQUE0T3hBQUNEd1FBQkE5a0FBSVAxQUFLQUNRUUFnQjBFQXdBdEJBS0FSUVFEZ0YwRUE0QjVCQUNBbVFRQWdMa0VBNERaQkFNQS9RUUFBU1VFQW9GSkJBSUJjUVFBQVowRUFJSEpCQUdCOVFRQmdoRUVBQUlwQkFPQ1BRUURBbFVFQUFKeEJBTUNjUVFEQWxrRUE0SkJCQUNDTFFRQ0FoVUVBd0g5QkFLQjBRUUFBYWtFQUFHQkJBSUJXUVFBZ1RVRUFJRVJCQU1BN1FRQmdORUVBSUMxQkFDQW1RUURnSDBFQUFCcEJBQ0FWUVFCQUVVRUFZQTFCQUNBS1FRQmdCMEVBQUFaQkFPQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQVJCQUdBR1FRRGdCMEVBd0FwQkFDQU9RUUFBRWtFQWdCWkJBT0FhUVFDQUlFRUFnQ1pCQUNBdFFRQmdORUVBd0R0QkFDQkVRUUFBVFVFQUFGWkJBR0JmUVFBQWFVRUFBSE5CQUtCOVFRQmdoRUVBQUlwQkFLQ1BRUUJnbFVFQUlKdEJBQ0NoUVFBQW9rRUFJSnhCQUlDV1FRRGdrRUVBSUl0QkFLQ0ZRUUJBZ0VFQWdIWkJBT0JzUVFCZ1kwRUFZRnBCQU1CUlFRRGdTVUVBb0VKQkFJQTdRUURBTkVFQXdDNUJBQUFwUVFDZ0pFRUF3Q0JCQUFBZFFRRGdHVUVBWUJkQkFPQVZRUURnRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUNBVVFRQkFGa0VBd0JkQkFJQWFRUUNnSFVFQWdDRkJBT0FsUVFBZ0trRUFZQzlCQUVBMVFRQ2dPMEVBb0VKQkFPQkpRUURBVVVFQVlGcEJBRUJqUVFCQWJFRUF3SFZCQUlCL1FRREFoRUVBSUlwQkFNQ1BRUUJnbFVFQUFKdEJBS0NnUVFCZ3BrRUFnS2RCQU1DaFFRQWduRUVBZ0paQkFPQ1FRUUNBaTBFQWdJWkJBS0NCUVFDZ2VVRUFnSEJCQU1CblFRQ0FYMEVBSUZoQkFBQlJRUURnU1VFQWdFTkJBS0E5UVFCQU9FRUFJRFJCQUVBd1FRQ2dMRUVBZ0NsQkFFQW5RUURBSlVFQXdDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQUFKRUVBSUNaQkFLQW5RUUFnS2tFQVFDMUJBQUF4UVFCQU5VRUFvRGxCQUdBK1FRQWdSRUVBSUVwQkFBQlJRUUFnV0VFQWdGOUJBTUJuUVFDQWNFRUFZSGxCQUVDQlFRQWdoa0VBQUl0QkFBQ1FRUUJnbFVFQUFKdEJBS0NnUVFCZ3BrRUFBS3hCQUNDdFFRQ0FwMEVBd0tGQkFFQ2NRUURnbGtFQXdKRkJBT0NNUVFBQWlFRUFZSU5CQU9COVFRQmdkVUVBb0cxQkFHQm1RUUJBWDBFQWdGaEJBR0JTUVFDQVRFRUFvRWRCQUtCRFFRREFQMEVBWUR4QkFFQTVRUUFnTjBFQWdEVkJBTUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBQURSQkFBQTJRUUNBTjBFQTREbEJBQUE5UVFDQVFFRUFnRVJCQUFCSlFRQ0FUVUVBQUZOQkFBQlpRUUJnWDBFQVlHWkJBS0J0UVFCZ2RVRUE0SDFCQUdDRFFRRGdoMEVBZ0l4QkFFQ1JRUUJBbGtFQVlKdEJBTUNnUVFCZ3BrRUFBS3hCQUtDeFFRREFza0VBSUsxQkFJQ25RUUFnb2tFQUFKMUJBQUNZUVFCQWswRUFnSTVCQUFDS1FRQ2doVUVBb0lGQkFPQjdRUURBZEVFQW9HMUJBRUJuUVFCQVlVRUFvRnRCQUFCWFFRQWdVMEVBUUU5QkFBQk1RUUFBU1VFQUlFZEJBR0JGUVFDZ1EwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFPQkRRUURBUlVFQVlFZEJBSUJKUVFDZ1RFRUFBRkJCQUFCVVFRQmdXRUVBd0Z4QkFPQmhRUURBWjBFQTRHMUJBTUIwUVFEZ2UwRUFvSUZCQUtDRlFRQUFpa0VBZ0k1QkFBQ1RRUURBbDBFQWdKeEJBSUNoUVFDZ3BrRUFBS3hCQUtDeFFRQkF0MEhYRnlHdzhqNFFXRGsvMXhkdkVnTTlnTUoxdktvek5UWXhPVEUwT1RBMWxOZ1hBSUQrUFFBZ296NEFRQm8rQUdDMFBzZzhOMk9TMXhZM0FBQUFSZ0FBQU1nOEtCY0FJTFpCQUlDd1FRRGdxa0VBUUtWQkFLQ2ZRUUJBbWtFQVFKVkJBR0NRUVFDQWkwRUE0SVpCQUlDQ1FRQ0FmRUVBd0hSQkFLQnRRUUJnWmtFQW9GOUJBSUJaUVFDZ1UwRUFvRTVCQUtCS1FRREFSa0VBUUVOQkFDQkFRUURnUFVFQVFEeEJBR0E2UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBSURwQkFPQTdRUURnUFVFQUlFQkJBS0JEUVFDQVIwRUFvRXRCQUlCUVFRQ0FWVUVBd0ZwQkFPQmdRUURnWjBFQUFHOUJBRUIyUVFBZ2ZrRUFZSU5CQU1DSFFRQkFqRUVBQUpGQkFBQ1dRUUFBbTBFQUFLQkJBR0NsUVFEZ3FrRUFnTEJCQUtDd1FRRGdxa0VBSUtWQkFJQ2ZRUURnbVVFQVlKUkJBQUNQUVFBQWlrRUFJSVZCQUdDQVFRQ2dkMEVBNEc1QkFLQm1RUUJBWDBFQUlGaEJBQUJSUVFDZ1NrRUF3RVJCQUdBL1FRQWdPMEVBUURkQkFJQXpRUUJnTUVFQTRDMUJBR0FzUVFCZ0trRUFvQ2xCQUtBcFFRQ2dLVUVBb0NsQkFDQXFRUUFBTEVFQTRDMUJBR0F3UVFBZ05FRUFBRGhCQUVBOFFRQkFRVUVBWUVaQkFPQkxRUUJnVWtFQWdGbEJBTUJnUVFCQWFFRUFvSEJCQUdCNVFRQWdnVUVBd0lWQkFNQ0tRUURBajBFQXdKUkJBQUNhUVFDQW4wRUFJS1ZCQU9DcVFRQkFxMEVBWUtWQkFJQ2ZRUURnbVVFQVFKUkJBS0NPUVFBQWlVRUF3SU5CQUlCOVFRRGdjMEVBWUdwQkFJQmhRUURnV0VFQUFGRkJBTUJKUVFDZ1FrRUE0RHRCQU9BMVFRQWdNRUVBb0N0QkFLQW5RUURnSTBFQXdDQkJBQUFlUVFDZ0hFRUFnQnBCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUJBR2tFQVFCeEJBQUFlUVFEQUlFRUFvQ1JCQUlBb1FRQWdMVUVBSURKQkFFQTNRUUFnUFVFQUlFUkJBRUJMUVFDQVVrRUFnRnBCQUVCalFRQWdiRUVBUUhWQkFPQitRUUNBaEVFQWdJbEJBTUNPUVFCQWxFRUE0SmxCQUlDZlFRQkFwVUVBSUtaQkFBQ2dRUUFBbWtFQVFKUkJBSUNPUVFEZ2lFRUFRSU5CQUlCN1FRQUFjVUVBSUdkQkFJQmRRUUFnVkVFQVFFdEJBQUJEUVFDQU8wRUFZRFJCQUVBdFFRQUFKMEVBSUNGQkFDQWNRUUFnR0VFQVFCUkJBQUFSUVFBZ0RrRUF3QXhCQUtBS1FRQ2dDVUVBb0FsQkFLQUpRUUNnQ1VFQVFBcEJBR0FNUVFBZ0RrRUFRQkZCQUNBVlFRQUFHVUVBNEIxQkFBQWpRUUJBS0VFQW9DNUJBTUExUVFEZ1BFRUFnRVJCQUFCTlFRRGdWVUVBNEY1QkFHQm9RUUNBY2tFQVlIeEJBR0NEUVFEZ2lFRUFnSTVCQUVDVVFRQUFta0VBNEo5QkFFQ2hRUUFBbTBFQXdKUkJBTUNPUVFEZ2lFRUFRSU5CQUNCN1FRRGdiMEVBNEdSQkFJQmFRUURBVUVFQUlFZEJBQUErUVFCQU5VRUFRQzFCQUFBbVFRRGdIa0VBUUJoQkFFQVNRUURBREVFQW9BaEJBTUFFUVFCZ0FVRUF3UHhBQUtENVFBQ0E5VUFBUVBOQUFFRHpRQUJBODBBQVFQTkFBTUQwUUFBZytVQUF3UHhBQUtBQlFRQ0FCVUVBd0FsQkFNQU9RUURBRTBFQVlCbEJBRUFnUVFDQUowRUF3QzVCQU9BMlFRREFQMEVBb0VoQkFBQlNRUUFBWEVFQTRHVkJBRUJ3UVFCQWUwRUFRSU5CQU9DSVFRQ2dqa0VBb0pSQkFNQ2FRUUNBbkVFQUlKWkJBTUNQUVFDQWlVRUFZSU5CQUVCN1FRRGdiMEVBZ0dSQkFFQlpRUUJBVGtFQUFFUkJBRUE2UVFEQU1FRUF3Q2RCQUVBZlFRREFGMEVBZ0JCQkFJQUpRUUJnQTBFQUlQdEFBRUR5UUFDQTZrQUFZT05BQUNEZFFBREEyVUFBd05WQUFFRFRRQUJBMDBBQVFOTkFBRURUUUFBQTFVQUFnTmxBQUNEZFFBQkE1RUFBQU94QUFBRDFRQUFnLzBBQW9BUkJBT0FLUVFBQUVrRUFJQmxCQU9BZ1FRQ0FLVUVBWURKQkFLQTdRUUNBUlVFQWdFOUJBTUJaUVFDZ1pFRUE0RzlCQUNCN1FRQmdnMEVBUUlsQkFJQ1BRUURBbFVFQXdKZEJBRUNSUVFEZ2lrRUFnSVJCQUdCOFFRQkFjRUVBb0dSQkFFQlpRUURnVFVFQW9FSkJBS0EzUVFDQUxVRUE0Q05CQUlBYVFRQ2dFVUVBZ0FsQkFFQUNRUUJBOWtBQUlPbEFBRURkUUFCQTAwQUFnTXRBQUFERVFBREF2VUFBNExsQUFFQzJRQUJnczBBQVFMTkFBRUN6UUFCQXMwQUFRTFZBQU1DNVFBREF2VUFBUU1WQUFDRE5RQUNnMWtBQXdPQkFBSURyUUFBQStVQUFvQU5CQUFBTFFRQmdFMEVBUUJ4QkFFQWxRUUFBTDBFQUFEbEJBQ0JEUVFBQVRrRUFRRmxCQUlCa1FRQWdjRUVBQUh4QkFFQ0VRUUNBaWtFQXdKQkJBR0NUUVFEQWpFRUFJSVpCQUdCL1FRQ2dja0VBNEdWQkFNQlpRUUFBVGtFQW9FSkJBRUEzUVFBQUxFRUFJQ0ZCQUNBWFFRQ0FEVUVBUUFSQkFDRDNRQURnNTBBQWdObEFBS0RMUUFDZ3YwQUFnTFJBQUlDc1FBREFwRUFBWUo1QUFBQ2FRQURnbGtBQVlKTkFBRUNUUUFCQWswQUFRSk5BQUtDVlFBQUFta0FBb0o1QUFFQ21RQUJncmtBQVFMaEFBR0RDUUFCQXprQUFZTnhBQU1EcVFBQ0Era0FBQUFaQkFBQVBRUUNBR0VFQWdDSkJBS0FzUVFCZ04wRUFvRUpCQU9CTlFRQ0FXVUVBZ0dWQkFBQnlRUUNBZmtFQWdJVkJBT0NMUVFBQWowRUFRSWhCQUtDQlFRQUFka0VBQUdsQkFFQmNRUUNBVDBFQUlFTkJBR0EzUVFBQUxFRUFvQ0JCQUdBVlFRQ2dDa0VBd0FCQkFFRHVRQUJBM0VBQWdNdEFBQUM5UUFDZ3JrQUFBS0pBQUNDV1FBQmdqVUFBd0lWQUFFQitRQUFnZEVBQTRHNUFBTUJtUUFCZ1prQUFZR1pBQUlCbVFBQ2diRUFBSUhSQUFBQi9RQUJBaDBBQXdJOUFBT0NaUUFCQXBFQUFnTEZBQU1DL1FBQ2d6a0FBd045QUFJRHhRQUFBQWtFQUlBeEJBQUFXUVFEQUlFRUFBQ3hCQUVBM1FRRGdRa0VBQUU5QkFJQmJRUUFBYUVFQWdIUkJBTUNBUVFCZ2gwRUFBSXRCQUFDRVFRQmdla0VBQUcxQkFNQmZRUUNnVWtFQTRFVkJBQUE1UVFDZ0xFRUF3Q0JCQUdBVlFRQUFDa0VBZ1AxQUFDRG9RQURBMUVBQW9NRkFBQUN3UUFCZ29FQUFBSkpBQUVDRVFBRGdjRUFBNEZ4QUFHQk5RQURBUDBBQWdEUkFBR0F3UUFEZ0prQUFZQ1pBQUdBbVFBQ0FKa0FBSUM1QUFJQTBRQUFBUVVBQWdGQkFBQUJqUUFBZ2QwQUF3SVpBQU9DVVFBQkFvMEFBWUxOQUFDREZRQUJBMTBBQVFPdEFBQUQvUUFBZ0NrRUFZQlZCQUtBZ1FRQkFMRUVBZ0RoQkFBQkZRUUNBVVVFQUlGNUJBRUJyUVFDQWVFRUFBSU5CQUVDSFFRQWdnRUVBSUhKQkFHQmtRUURnVmtFQWdFbEJBRUE4UVFCZ0wwRUFvQ0pCQUFBV1FRQWdDa0VBZ1AxQUFPRG1RQUJBMEVBQUlMdEFBQUNvUUFCQWxVQUFJSVJBQU9CcVFBQkFUa0FBNERWQUFFQWZRQURBRDBBQVlBRkFBR0RxUHdEQTR6OEFZTTQvQU1ETVB3REF6RDhBSU0wL0FPRGZQd0JnNmo4QVlBTkFBQUFUUUFCZ0prQUFvRHBBQUFCVVFBQ0FjRUFBUUlkQUFNQ1lRQUNncWtBQVlMNUFBQ0RTUUFBQTUwQUFnUDFBQUFBS1FRQ2dGVUVBQUNKQkFJQXVRUUFBTzBFQTRFZEJBQUJWUVFCZ1lrRUE0RzlCQUtCOVFRQ2dnMEVBQUhsQkFNQnFRUUNBWEVFQWdFNUJBTUJBUVFCQU0wRUFBQ1pCQUFBWlFRQkFERUVBQVA5QUFBRG5RQUJBMEVBQW9MbEFBQUNqUUFCZ2prQUFZSFpBQU9CUlFBQ2dNVUFBQUJWQUFPRDBQd0NneFQ4QW9LUS9BT0NHUHdEZ1hEOEFnRXcvQUlBaVB3Q2dHVDhBb0JrL0FNQWJQd0FBU1Q4QTRGdy9BQUNNUHdDZ3F6OEE0Tk0vQUVEK1B3REFHa0FBZ0RkQUFBQlpRQUJnZkVBQVlKRkFBRUNsUUFEQXVVQUFRTkJBQU9EbVFBQkEva0FBZ0F0QkFBQVlRUUNBSkVFQWdERkJBT0ErUVFCQVRFRUFBRnBCQUFCb1FRQWdka0VBSUlCQkFPQnhRUUNBWTBFQVFGVkJBT0JHUVFEQU9FRUF3Q3BCQUNBZFFRRGdEMEVBb0FKQkFNRHJRQUFnMGtBQXdMbEFBQUNqUUFCZ2pFQUF3R3RBQUlCRFFBQWdIVUFBb1BNL0FPQzNQd0RBZmo4QW9DTS9BT0NXUGdDZ3hEd0FZRXUrQUdDNHZnQUE4YjRBb0JtL0FLQVp2d0RBQkw4QVlMaStBQUJLdmdCQW1qMEFJTTArQUFBNFB3QmdpajhBWU1NL0FLQUFRQURnSTBBQXdFaEFBRUJ4UUFDZ2pFQUFBS05BQUtDNVFBQWcwVUFBUU9wQUFJQUJRUUFnRGtFQVlCdEJBS0FvUVFCQU5rRUFRRVJCQUdCU1FRREFZRUVBQUc5QkFFQjVRUURBYWtFQVlGeEJBQ0JPUVFEQVAwRUFnREZCQUNBalFRQUFGVUVBSUFkQkFFRHpRQURBMkVBQUFMOUFBR0NsUUFDZ2pFQUFZR3RBQUNBK1FBQ0FFVUFBWU5VL0FLQ0pQd0RBREQ4QVFGODlBQ0ROdmdBZ1FyOEFnSCsvQU9DYXZ3REFzYjhBWUxpL0FLRE12d0RBekw4QVFMMi9BTUN4dndEZ2w3OEFnSEsvQUNBcXZ3QWdvcjRBNEJnK0FJQW5Qd0NnbHo4QXdONC9BQ0FZUUFBQVAwQUFZR3RBQUdDTVFBQWdwRUFBWUwxQUFDRFdRQURBNzBBQUlBVkJBS0FTUVFDQUlFRUFvQzVCQU9BOFFRQkFTMEVBZ0ZsQkFPQm5RUUFnYzBFQVFHUkJBSUJWUVFBQVIwRUFvRGhCQUVBcVFRQUFIRUVBd0ExQkFNRCtRQUNBNGtBQUFNZEFBRUNzUUFBZ2trQUFZSEZBQUFBL1FBQUFFVUFBb01jL0FNQmZQd0JnZ2o0QW9OQytBS0JudndBZ3FyOEFJTmkvQUFENnZ3QmdDc0FBUUJEQUFHQVF3QUNnRnNBQUFCZkFBS0FSd0FEZ0VjQUF3QWpBQUlEenZ3Q0F5NzhBZ0tDL0FPQlF2d0FnbHI0QXdMSStBT0I4UHdDZ3lqOEFBQkZBQUdBK1FBREFia0FBb0pCQUFFQ3BRQUJndzBBQUFONUFBR0Q1UUFEZ0NrRUFJQmxCQUlBblFRREFOVUVBSUVSQkFHQlNRUURnWUVFQUlHMUJBRUJlUVFDQVQwRUFvRUJCQU1BeFFRQkFJMEVBNEJSQkFJQUdRUUNBOEVBQTROTkFBRUMzUUFBQW0wQUFBSUJBQUNCTFFBQmdHRUFBb01vL0FPQmFQd0NndFQwQVlDVy9BT0NkdndDZzQ3OEE0QTdBQUVBYXdBQWdEc0FBQVBxL0FHRGJ2d0RBekw4QXdNeS9BTURNdndCZ3pyOEFJT1cvQUFBQ3dBQWdFOEFBd0JuQUFLQUp3QUJnMXI4QWdKQy9BT0FPdndEQUtUNEE0Rm8vQUNESVB3Q2dGVUFBUUVkQUFDQjVRQUFBbDBBQUFMSkFBQ0RPUUFEQTZrQUFvQU5CQUFBU1FRQkFJRUVBb0M1QkFDQTlRUURnUzBFQXdGcEJBTUJuUVFDZ1dFRUFnRWxCQUtBNlFRREFLMEVBQUIxQkFDQU9RUUFBLzBBQUlPSkFBSURGUUFEZ3FFQUFRSXhBQUlCZlFBREFKMEFBNE9RL0FJQitQd0RBS1Q0QVFEYS9BT0MwdndBZ0FjQUFvQi9BQUVBU3dBQ2c1YjhBZ0t5L0FJQi92d0JBUXI4QW9CbS9BS0FadndDZ0diOEFnQ0svQUVCVHZ3QUFqTDhBSUxpL0FBRHh2d0FnRjhBQVFCekFBTUQ0dndBQXA3OEFRRGEvQUdEeFBRQ0FkVDhBNE5vL0FHQWdRQURBVlVBQW9JWkFBRUNqUUFEQXYwQUFZTnhBQUFENVFBRGdDa0VBWUJsQkFFQW9RUUFnTjBFQUFFWkJBTUJVUVFCZ1kwRUFBRlJCQUlCRVFRQkFOVUVBQUNaQkFBQVhRUUFnQ0VFQW9QSkFBT0RVUUFDQXQwQUFvSnBBQUFCOFFBREFRa0FBb0FsQUFJQ2hQd0NnMEQ0QWdBYS9BQUNudndCZ0JzQUFBQ2JBQUNBSXdBQWd3YjhBNEd1L0FLRHB2Z0JBbmp3QTRKWStBQ0FSUHdDZ0dUOEFvQmsvQUFEeFBnQWdlejRBd05pOUFFQU12d0RnZ3I4QW9NcS9BT0FRd0FDQUpjQUFJQWJBQUtDc3Z3QmdFcjhBd0pnK0FJQ1FQd0FBL1Q4QVlEZEFBSUJ3UUFEZ2xFQUFnTEZBQUVET1FBQ0E2MEFBb0FSQkFJQVRRUUJBSWtFQVFERkJBR0JBUVFDQVQwRUE0RjVCQUlCUFFRQkFRRUVBNERCQkFJQWhRUUFBRWtFQW9BSkJBT0RtUUFBQXlVQUFnS3RBQU1DTlFBQkFZRUFBUUNaQUFDRGFQd0RnVUQ4QTRCaStBS0NJdndEZzhyOEFvQ1hBQUNBT3dBQUF0NzhBb0RtL0FDQ0t2UUJBREQ4QTRIMC9BS0NrUHdCZ3dqOEF3TXcvQUtETVB3QkF1RDhBd0pzL0FBQmtQd0JBNkQ0QXdDbStBT0JhdndDZ3g3OEFBQkhBQU9BbXdBQ0EvTDhBb0plL0FDQ3d2Z0RBSkQ4QVlNTS9BTUFhUUFBQVZFQUF3SVpBQUVDa1FBQUF3a0FBb045QUFHRDlRQURBRFVFQUFCMUJBR0FzUVFEZ08wRUFZRXRCQUNCYlFRQ0FTMEVBNER0QkFHQXNRUUFBSFVFQXdBMUJBTUQ4UUFBQTNrQUFJTDlBQUVDZ1FBRGdnVUFBb0VoQUFLQU5RQURBcEQ4QUFMYytBTUFrdndCZ3c3OEFZQnJBQUdBZndBQUEwYjhBQUZlL0FFRFBQQURnVEQ4QUFMSS9BQUR4UHdDZ0QwQUFJQjlBQUdBbVFBQmdKVUFBWUJwQUFDQUtRQUNnNVQ4QWdLVS9BRUEyUHdDZ3RiMEE0RnEvQUtES3Z3RGdHTUFBNENIQUFPRFp2d0RnVUw4QTRCZytBR0NLUHdCQS9qOEFnRHBBQU1CMVFBQmdtRUFBWUxaQUFBRFZRQURnODBBQVlBbEJBT0FZUVFDQUtFRUFBRGhCQUtCSFFRRGdWMEVBUUVoQkFLQTRRUURnS0VFQVFCbEJBSUFKUVFEZzgwQUFBTlZBQUdDMlFBRGdsMEFBWUhKQUFLQTBRQUJnN2o4QXdHcy9BR0J5dlFBZ2hMOEFRUHEvQU1BcXdBRGdBOEFBd0pXL0FDQ0V2Z0RnTHo4QUlMcy9BTUFLUUFDZ01FQUFJRXhBQU9CY1FBQmdaa0FBUUdSQUFNQllRQUJnUmtBQWdDcEFBR0FHUUFDQXRUOEFRRFkvQU1BcHZnRGdncjhBQVBHL0FLQXB3QUNnQ2NBQWdLQy9BQ0NpdmdDZ05UOEFJTTgvQU9BaVFBQWdZRUFBQUk5QUFBQ3VRQUFnelVBQVFPeEFBTUFGUVFCZ0ZVRUFJQ1ZCQU1BMFFRQ0FSRUVBSUZWQkFHQkZRUUNBTlVFQXdDVkJBQUFXUVFCZ0JrRUFZTzFBQUNET1FBREFya0FBWUk5QUFFQmdRQUNnSWtBQWdNcy9BQ0FxUHdBZzFyNEFBTEMvQUFBVXdBQkFJY0FBWU0rL0FLQTZ2d0FnaEQ0QXdKVS9BQUFEUUFCZ05rQUE0R05BQUlDRFFBQmdqVUFBQUpOQUFLQ1JRQUJnaTBBQWdJQkFBSUJmUUFBZ05VQUFZQVpBQUlDbFB3QkE2RDRBUUF5L0FDQzR2d0RBRnNBQXdDSEFBQURQdndBZ05MOEFJTGsrQUNDcVB3RGdFa0FBSUZGQUFPQ0hRQUJBcDBBQWdNWkFBT0RsUUFDZ0FrRUFZQkpCQUNBaVFRRGdNVUVBd0VGQkFJQlNRUURBUWtFQUFETkJBQ0FqUVFCZ0UwRUFvQU5CQU1EblFBQkF5RUFBb0toQUFDQ0pRQUNnVTBBQVlCVkFBT0N1UHdBQXdqNEFvRGEvQU1EVHZ3Q2dJOEFBQUE3QUFDQ2t2d0Rnb3I0QW9EVS9BS0RPUHdDQUlFQUFnRmxBQU1DSFFBQ0Fua0FBWUt4QUFLQ3lRQUFBc1VBQUFLcEFBQ0NjUUFEQWgwQUFnRjlBQUlBcVFBQ2c1VDhBQUdRL0FNRFl2UUFBakw4QUFBTEFBS0Fyd0FEZzg3OEFZSEcvQUdEbVBRQWdrVDhBWUFaQUFLQkVRQURBZ1VBQVlLRkFBQ0RCUUFBQTRVQUFnQUJCQUdBUVFRQmdJRUVBWURCQkFFQkFRUUNnVUVFQW9FQkJBTUF3UVFEZ0lFRUFBQkZCQUNBQlFRQ0E0a0FBNE1KQUFHQ2pRQUFBaEVBQVlFbEFBQUFMUUFBZ21UOEE0QjQrQUNCbnZ3REE3cjhBb0NqQUFBRDZ2d0NBZjc4QW9NUThBQUNFUHdBQS9EOEFZRHBBQUtCMVFBREFsMEFBd0xOQUFPREpRQUJBMGtBQWdOQkFBSURIUUFEQXRFQUFJSnhBQUlDQVFBQmdSa0FBSUFwQUFNQ2JQd0FnZXo0QW9GTy9BR0RudndDZ0tzQUFZQWJBQUNDUnZ3RGczTDBBQUlBL0FBQUFRQUFBUUVBQUFJQkFBQUNnUUFEQXYwQUFnTjlBQUVEL1FBQ0FEMEVBWUI5QkFDQXZRUUFBUDBFQWdFNUJBS0ErUVFEQUxrRUFBQjlCQUNBUFFRQ2cva0FBQU45QUFHQy9RQURBbjBBQUlJQkFBR0JBUUFDZ0FFQUFvSUkvQUtERXZBRGdocjhBd0FIQUFLQW13QUFnNEw4QVlFcS9BT0NXUGdDZ3BEOEF3QTlBQUdCTlFBQ0FoVUFBQUtSQUFBRENRQUFBMzBBQVlQRkFBTUR2UUFDQTRVQUFnTWRBQU9DcFFBQWdpMEFBQUZoQUFHQVpRQUFBdFQ4QWdOZytBR0FzdndCQTBiOEFBQ1hBQU1BTXdBQ2dtYjhBd1BXOUFDQjZQd0RBK0Q4QW9EcEFBQ0I1UUFBQW5FQUFvTHRBQUVEYlFBQWcrMEFBZ0ExQkFHQWRRUUJnTFVFQVFEMUJBQ0JOUVFBZ1BVRUFJQzFCQUNBZFFRQkFEVUVBZ1BwQUFLRGFRQURBdWtBQUFKdEFBT0IyUUFBZ09FQUE0UE0vQUdCeFB3QmcvNzBBb0ptL0FDQUh3QUJnRk1BQUlNMi9BTUFidndEQUJEOEFRTDAvQU1BY1FBQkFXMEFBNEl4QUFFQ3NRQUNBeTBBQVlPcEFBQUFFUVFEZ0EwRUFBTzFBQUlETlFBREFyVUFBNEkxQUFJQmNRQURBSFVBQWdNQS9BQ0FSUHdDZ0diOEF3TXkvQU9BandBRGdETUFBQUpxL0FNQWp2Z0JnWGo4QW9Pby9BS0EwUUFCQWRFQUFBSnBBQU9DNVFBRGcyVUFBNFBsQUFPQU1RUURnSEVFQTRDeEJBT0E4UVFEQVRFRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBQUsyK0FBQ1h2d0JBczc4QVFMTy9BT0NudndBZ0ViOEFvQmsvQU1ETVB3QkFKa0FBb0dWQUFHQ1NRQUFBc2tBQWdORkFBQUR4UUFCZ0JFRUFJUHBBQUtEaFFBQUF4a0FBZ0toQUFBQ0tRQURnVlVBQVlCZEFBTUN4UHdCZ3VENEE0RUMvQUNEYnZ3RGdKOEFBUUF6QUFLQ1p2d0RBOWIwQUFJQS9BRUQvUHdDZ1BrQUFZSDFBQUNDZVFBQ2d2VUFBSU4xQUFNRDhRQUFnRGtFQUFCNUJBT0F0UVFEZ1BVRUF3RXhCQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBREE1ajhBUUU0L0FLQW92Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEFvQ2krQUVCQ1B3QmcyejhBd0N0QUFFQnFRQURBbEVBQWdMUkFBRURVUUFBQTgwQUFBUFZBQUVEaVFBQWd6VUFBSUxWQUFPQ2FRQUNnZlVBQWdFTkFBQUFJUUFEZ2x6OEFBRW8rQU9CY3Z3Qmc2cjhBNENuQUFHQUJ3QURnaHI4QW9NUzhBS0NDUHdDZ0FFQUFZRUJBQUNDQVFBQWdvRUFBSU1CQUFDRGdRQUFBQUVFQUFCQkJBT0FmUVFEZ0wwRUF3RDlCQUVCTlFRQkFQVUVBWUMxQkFHQWRRUUNBRFVFQUlQdEFBRURiUUFDZ3UwQUFBSnhBQUVCNVFBQkFPMEFBd1A0L0FFQ1ZQd0JBVGo4QXdFdy9BTUJNUHdEQVREOEF3RXcvQUVCT1B3QkFsVDhBd1A0L0FFQTdRQURnZUVBQVlKdEFBR0M2UUFDQTJVQUFRT2hBQUtEWlFBQ2d5RUFBWUxWQUFHQ2dRQUJBaUVBQVFGNUFBS0FuUUFEQTREOEFvRmsvQU9BWXZnQ2dqYjhBWUFQQUFPQW53QUNBNTc4QWdGeS9BR0JMUGdEZ21qOEFZQXRBQU1CSlFBQWdoRUFBWUtOQUFPRENRQUNBNGtBQUlBRkJBQUFSUVFEZ0lFRUF3REJCQU1CQVFRRGdUa0VBQUQ5QkFFQXZRUUNBSDBFQXdBOUJBQ0FBUVFCQTRVQUFnTUpBQUVDa1FBRGdoa0FBd0ZWQUFPQWpRQURBL2o4QXdPWS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3REE1ajhBd1A0L0FPQWpRQURBVlVBQTRJWkFBRUNrUUFDQXdrQUFBTmhBQUNET1FBQWd2a0FBNEsxQUFFQ2NRQUJnaUVBQXdHZEFBTUEyUUFCQUJrQUFZS0UvQUtEUVBnRGdEYjhBWUx5L0FDQVp3QUFnR2NBQVlMeS9BSUFOdndEZzlENEFBTGMvQU1BWVFBREFWa0FBZ0lwQUFNQ3BRQUFBeVVBQVlPaEFBT0FEUVFDQUUwRUFRQ05CQUFBelFRREFRa0VBd0ZGQkFDQkNRUUNnTWtFQUlDTkJBT0FUUVFDZ0JFRUFnT3RBQUVET1FBQUFza0FBWUpkQUFDQitRQURBVlVBQVFEdEFBRUF6UUFCQU0wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQTdRQURBVlVBQUlINUFBR0NYUUFBQXNrQUFnTWhBQUlEQlFBQ0FzVUFBNEtKQUFFQ1NRQURBZ1VBQWdGOUFBTUEyUUFCQUQwQUFRTHMvQUVBMlB3Q2dMcjRBb0lpL0FLRHp2d0FnSmNBQVlQeS9BR0NLdndEZ0dMNEFvRmsvQUtEaVB3QWdMRUFBZ0dkQUFFQ1NRQUFnc1VBQUlOQkFBQ0R2UUFBZ0IwRUF3QlpCQUdBbVFRQUFOa0VBd0VWQkFLQlZRUUJnUmtFQVFEZEJBRUFvUVFCZ0dVRUE0QXBCQUdENVFBQWcza0FBSU1SQUFFQ3NRQUJnbDBBQTRJWkFBRUI1UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBZVVBQTRJWkFBR0NYUUFCQXJFQUFnTDFBQUdDMVFBRGdwVUFBZ0pWQUFLQ0dRQUFnYmtBQWdFMUFBT0FxUUFCZ0JrQUFRTHMvQUdCYVB3QkF6endBb0ZhL0FLREt2d0NnR2NBQVFCWEFBT0RBdndEQUpMOEFRTFkrQUNDaFB3Q2dDVUFBd0VOQUFDQi9RQUJBblVBQXdMcEFBTURZUUFCQTkwQUFBQXRCQUlBYVFRQUFLa0VBZ0RsQkFDQkpRUURBV2tFQTRFdEJBQ0E5UVFDZ0xrRUFnQ0JCQUtBU1FRQkFCVUVBSVBGQUFHRFpRQUFneEVBQUFMSkFBRUNrUUFBQW5FQUFvSmxBQUtDWlFBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQUFKeEFBRUNrUUFCZ3NVQUFZTFpBQUdDcFFBQWdta0FBb0lsQUFPQjBRQUFnVkVBQUlEZEFBRUFXUUFEQTZ6OEFnS1UvQUVBMlB3QkF6endBWURlL0FBQzN2d0FBRHNBQUFCN0FBR0RrdndBZ2Q3OEFBTWE5QUNCU1B3QWcyajhBUUNaQUFHQmZRQUJBakVBQUlLbEFBS0RHUUFCZzVFQUFBQUZCQU9BUFFRQUFIMEVBSUM1QkFJQTlRUUFBVFVFQTRHQkJBR0JTUVFCQVJFRUFRRFpCQU1Bb1FRQ2dHMEVBSUE5QkFHQURRUUFnOFVBQUlONUFBRURPUUFDQXdrQUFvTHRBQUtDNVFBQ2d1VUFBb0xsQUFLQzVRQUNndVVBQW9MbEFBR0M2UUFBQXVFQUF3SzFBQUtDZFFBQUFqa0FBQUh4QUFJQmNRQUFBUFVBQTRCeEFBR0Q4UHdEZ3dEOEFBSDQvQUFEeVBnREFLYjRBb0ZhL0FBQzN2d0RnQjhBQVlCN0FBQ0R6dndDZ2tiOEFZTXErQUVBSFB3Q2dyRDhBWUF0QUFPQkNRQUFBZkVBQW9KcEFBRUMzUUFEZzAwQUFvUEJBQUFBSFFRRGdGVUVBb0NSQkFJQXpRUUNBUWtFQWdGRkJBQUJvUVFBQVdrRUFRRXhCQU9BK1FRQUFNa0VBb0NWQkFPQVpRUUFnRDBFQVFBVkJBR0Q1UUFDQTYwQUFRT0ZBQUVEYlFBQ2cyVUFBb05sQUFLRFpRQURBMTBBQXdOQkFBR0RFUUFCZ3MwQUF3S0ZBQUFDU1FBRGdnVUFBQUdWQUFDQkVRQURnSlVBQXdBUkFBTUROUHdDQWl6OEF3Q1EvQUFER1BRQmc4NzRBd0lLL0FLREt2d0NnRGNBQUFCdkFBQ0RzdndEQW5iOEFnQWEvQUdES1BnQ2drVDhBUVBNL0FJQXVRQUNnWTBBQXdJeEFBT0NvUUFDQXhVQUFJT0pBQU1EK1FBREFEVUVBSUJ4QkFLQXFRUUNBT1VFQVlFaEJBQ0JYUVFEZ2IwRUFZR0pCQUVCVlFRQ0FTRUVBUUR4QkFJQXdRUUNnSlVFQW9CdEJBS0FTUVFEZ0NrRUFvQVJCQUNBQVFRQWcrMEFBUVBoQUFBRHdRQUFnNFVBQVFNNUFBRUM4UUFDQXFrQUF3SmhBQUNDSFFBQ2dhMEFBZ0UxQUFHQXNRQUFnRGtBQVlOby9BQ0NlUHdDZ09qOEF3R0ErQUVDMnZnQWdVcjhBSUt1L0FNRHJ2d0JBRmNBQVlCUEFBTURldndBQWtiOEFZTnUrQUFDRlBnQkFnRDhBWU9RL0FBQWpRQURBVWtBQWdJTkFBQ0NlUUFEQXVFQUFJTlJBQUlEd1FBQ0FCa0VBNEJSQkFDQWpRUUNBTVVFQTREOUJBR0JPUVFBZ1hVRUFvSGhCQUtCclFRQUFYMEVBd0ZKQkFDQkhRUUJBUEVFQUFESkJBTUFvUVFDQUlFRUFZQmxCQU1BU1FRREFDMEVBQUFOQkFDRHhRQUJBM1VBQUlNaEFBTUMwUUFEQW9VQUFBSkJBQUdCOFFBQUFXVUFBZ0RWQUFDQVZRQURBNno4QWdLdy9BSUJiUHdCQXRqNEF3R0MrQUtBNnZ3QWducjhBSU5xL0FNQUt3QUFnRjhBQVFBUEFBS0RCdndDQWRiOEF3TEsrQUNEVlBnQ0FpVDhBd05rL0FDQWFRQUFBUzBBQUFIMUFBRUNXUUFEZ3IwQUFnTXBBQUNEbFFBRGcvMEFBNEExQkFBQWNRUUJBS2tFQW9EaEJBT0JHUVFCQVZVRUFvR05CQUFDQlFRQ0FkVUVBWUdsQkFNQmRRUUJBVWtFQVFFZEJBR0E4UVFDQU1VRUFJQ1pCQUVBYVFRQ2dEa0VBUUFOQkFPRHZRQUJnMlVBQUlNUkFBRUN3UUFCQW0wQUFBSWhBQUtCcVFBQkFSMEFBNENOQUFJQUFRQUFndXo4QXdIMC9BR0R6UGdCQVg3MEFnQ0svQUlDTHZ3REF6YjhBd0FUQUFNQVh3QUFnQ2NBQVlOYS9BTUNWdndBZ01yOEFBTWE5QUlBUFB3QmdrejhBWU9zL0FDQWRRQUJBUjBBQW9IUkFBRUNTUUFCZ3EwQUFRTU5BQUdEY1FBRGc5a0FBd0FoQkFBQVdRUUNnSTBFQW9ERkJBTUEvUVFBZ1RrRUFZRnhCQU1CcVFRQUFnMEVBb0hoQkFBQnJRUUJBWFVFQXdFOUJBS0JDUVFEZ05VRUFBQ2xCQUlBY1FRQUFFRUVBb0FOQkFPRHZRQUJBMlVBQW9NSkFBQ0NzUUFCQWwwQUFRSU5BQU9CY1FBQ2dOa0FBSUJKQUFNRGRQd0NnbHo4QVlDVS9BRUJmUFFCZzg3NEF3SDIvQUNDN3Z3QkEvTDhBUUJUQUFBQU93QUNnNDc4QWdLRy9BT0JRdndBZ2xyNEFJSVErQUtCTlB3REFyRDhBNFBnL0FJQWpRQUNBVDBBQWdIWkFBT0NRUUFDQXAwQUFJTDlBQUVEWVFBQmc4RUFBZ0FSQkFLQVJRUURnSGtFQVFDeEJBS0E1UVFCQVIwRUFZRlZCQUlCalFRRGdjVUVBd0g1QkFLQndRUURBWWtFQUFGVkJBRUJIUVFDZ09VRUFRQ3hCQUdBZlFRQ2dFa0VBQUFaQkFFRHpRQUFnMmtBQW9NSkFBQUNzUUFCZ2xVQUF3SDFBQUVCVlFBQkFMRUFBNEFOQUFFQzdQd0FBYWo4QXdMSStBQ0NXdmdDQVc3OEFnS3kvQU1EcnZ3Q0FFTUFBQUJIQUFNRG12d0NBckw4QW9HZS9BS0RRdmdEZ0dENEFnQ2MvQUNDVlB3REEwRDhBSUF0QUFBQXZRQUJBVlVBQXdIMUFBSUNVUUFCQXFFQUFJTDVBQU1EVVFBQkE3RUFBZ0FKQkFNQU9RUUFBRzBFQTRDZEJBQ0ExUVFCZ1FrRUF3RTlCQUVCZFFRQUFhMEVBSUhsQkFLQjNRUUJBYVVFQUFGdEJBT0JNUVFBQVAwRUFZREZCQUtBalFRQUFGa0VBQUFsQkFJRDRRQUFnMzBBQVlNWkFBQ0N0UUFCZ2xVQUFnSDFBQUVCUVFBQ0FJMEFBd1BnL0FDQ2tQd0RnTHo4QVFNODhBQUFWdndDQWtMOEFvTmEvQUFBTXdBQUFFTUFBQVBHL0FPQzN2d0RnZHI4QW9PbStBRUJmUFFEQUREOEFvSWcvQUdERFB3Q2dBRUFBZ0NCQUFDQkFRQUNnWTBBQUlJUkFBRUNYUUFBZ3JFQUFZTUZBQUdEVlFBQmc2MEFBQUFGQkFLQU1RUUFBR1VFQVlDVkJBSUF4UVFBZ1BrRUFRRXRCQUtCWVFRRGdaVUVBUUhOQkFJQ0FRUUNBY0VFQUlHSkJBTUJUUVFDQVJVRUFRRGRCQUNBcFFRQmdHMEVBd0ExQkFPRC9RQUJnNVVBQXdNdEFBQ0N5UUFDQW1VQUFRSUJBQUdCUVFBQUFJMEFBd09zL0FHQ1RQd0RnRGo4QUFGeStBQUJYdndDQXM3OEE0UG0vQUFBVHdBQ0FBTUFBNE1DL0FHQit2d0JBREw4QVFGKzlBTUFHUHdBZ2ZqOEE0TGMvQUtEelB3Q2dHa0FBZ0RkQUFHQllRQURBZGtBQVlJeEFBQ0NlUUFEZ3NFQUFJTVJBQUVEWlFBQWc3a0FBUUFGQkFFQU1RUUNnRjBFQVFDTkJBR0F2UVFBZ08wRUFJRVpCQUlCUlFRQUFYVUVBb0doQkFJQjBRUUJBZ0VFQW9HbEJBQ0JiUVFDZ1RFRUFZRDVCQUFBd1FRREFJVUVBZ0JOQkFJQUZRUUNBNzBBQUlOUkFBT0M0UUFBQW4wQUFZSVZBQUVCWlFBQmdKMEFBSU93L0FHQ1JQd0FnMVQ0QXdMSytBT0IrdndEZ3o3OEFJQXpBQUNBUHdBREEzYjhBb0plL0FJQW52d0FBeHIwQW9PaytBS0JuUHdBQXJqOEFRUEEvQUFBVlFBQ2dNVUFBd0ZGQUFJQndRQUJBaDBBQW9KZEFBQ0NuUUFEQXVFQUFvTXBBQUtEZFFBQWc4VUFBUUFOQkFDQU5RUUNnRlVFQVlCMUJBSUFrUVFBQUxFRUFRRFJCQUlBOVFRQ2dSMEVBZ0ZKQkFBQmVRUUFBYWtFQWdIWkJBTUJqUVFEQVZFRUFBRVpCQUdBM1FRRGdLRUVBb0JwQkFFQU1RUURnKzBBQVlOOUFBS0REUUFCZ3FFQUF3SXhBQUlCa1FBQ2dNVUFBNFA0L0FPQ2RQd0JnMno0QUlOVytBQUNSdndEQTNyOEFnQkxBQUFBR3dBQWd3YjhBUUdxL0FNQ3l2Z0FnbGo0QUlGSS9BQ0NyUHdDZzVUOEFZQTlBQUlBdVFBQkFUa0FBNEdwQUFDQ0VRQUNnbEVBQVFLTkFBRUN6UUFEZ3drQUFZTk5BQUNEbFFBQ2c5a0FBSUFKQkFPQUZRUURnQjBFQUFBdEJBT0FQUVFCZ0ZrRUFJQjVCQUNBblFRQWdNVUVBNER0QkFHQkhRUUNBVTBFQUFHQkJBQUJ0UVFDZ1hrRUFnRTlCQUVCQVFRQkFNVUVBUUNKQkFLQVRRUUFnQlVFQW9PMUFBQURSUUFCZ3RFQUFBSmhBQU9CNFFBQ0FRa0FBb0F0QUFBQ3lQd0RnRno4QUFJVytBSUNKdndCZzY3OEFnQmZBQU1EOXZ3QUFwNzhBZ0RpL0FDQ0t2UUFBRlQ4QWdKQS9BR0RXUHdCZ0MwQUE0Q3RBQUlCSVFBQmdaVUFBSUlOQUFBQ1NRQUJnb0VBQTRLOUFBTUMvUUFDZ3prQUF3TnhBQUFEbVFBREE2MEFBd094QUFNRHNRQUFBN1VBQUlQQkFBRUQzUUFBZ0FVRUFRQWhCQU1BUVFRQ0FHa0VBUUNWQkFNQXdRUUFBUFVFQW9FbEJBT0JXUVFCZ1pFRUFvRmxCQUdCS1FRQkFPMEVBQUN4QkFPQWNRUURBRFVFQVlQMUFBTURmUUFEQXdrQUFBS1pBQUlDSlFBQ2dXVUFBUUNGQUFHRFdQd0FnVWo4QUlJcTlBRUJxdndEQTJMOEFBQlhBQU1EOXZ3Q0FvNzhBb0JHL0FNQXBQZ0FnVFQ4QUFMSS9BT0Q1UHdCZ0lFQUFnRUpBQUVCalFBRGdnRUFBSUk5QUFHQ2VRQUNncmtBQVFMdEFBSURFUUFEZ3lrQUF3TXhBQU1ETVFBREF6RUFBd014QUFNRE1RQURBekVBQUlNMUFBS0RRUUFEQTJFQUFJT1ZBQUNEMVFBQUFCRUVBb0E1QkFFQWFRUUNBSmtFQVlETkJBTUJBUVFDQVRrRUFnRnhCQUlCVVFRQmdSVUVBSURaQkFBQW5RUURnRjBFQW9BaEJBQUR6UUFDZzFFQUFZTFpBQUdDWVFBQmdka0FBSUQxQUFPQURRQURBbFQ4QUlKWStBSUFudndCZ3dMOEFZQkRBQUVBR3dBQUFwNzhBb0JHL0FLQ0NQZ0RnZkQ4QVlNby9BR0FMUUFDZ01VQUFnRlZBQU9CNFFBREFqRUFBZ0p0QUFLQ2tRQUJncWtBQXdLeEFBTUNzUUFEQXJFQUF3S3hBQU1Dc1FBREFyRUFBd0t4QUFNQ3NRQURBckVBQXdLeEFBQ0N0UUFCQXNVQUF3THBBQUNESlFBQWcyMEFBSVBCQUFLQURRUUFnRUVFQUlCMUJBTUFxUVFEQU9FRUFBRWRCQUlCVlFRQUFVRUVBb0VCQkFFQXhRUUFBSWtFQXdCSkJBS0FEUVFEQTZFQUFnTXBBQUNDc1FBRGdqVUFBNEY1QUFNQWlRQUJneno4QW9Eby9BQ0NFdmdBZ2xiOEFvQURBQUVBV3dBQUF4TDhBZ0RpL0FNQXBQZ0RnZkQ4QW9Oay9BQ0FZUUFCZ1BrQUFJR1JBQUNDQlFBQ0FpVUFBd0l4QUFNQ01RQURBakVBQXdJeEFBTUNNUUFEQWpFQUF3SXhBQU1DTVFBREFqRUFBd0l4QUFNQ01RQURBakVBQXdJeEFBTUNNUUFCQWpVQUFRSkpBQUtDZFFBQmdya0FBNE1KQUFDRGFRQUNBODBBQUlBZEJBQUFWUVFCQUkwRUF3REZCQUtCQVFRQ0FUMEVBb0V4QkFBQTlRUUJBTFVFQW9CMUJBQ0FPUVFCZy9VQUF3TjVBQUdEQVFBQUFva0FBb0lOQUFNQktRQUFBRGtBQUlLUS9BT0NpUGdDZ05iOEFvTTYvQUtBYXdBQmcvTDhBWUlxL0FPQVl2Z0FBVEQ4QVlNby9BQ0FZUUFDZ1FFQUFZRlJBQUtCWlFBQ2dXVUFBb0ZsQUFLQlpRQUNnV1VBQW9GbEFBS0JaUUFDZ1dVQUFvRmxBQUtCWlFBQ2dXVUFBb0ZsQUFLQlpRQUNnV1VBQW9GbEFBS0JaUUFDZ1dVQUFvRnBBQUlCblFBRGdnVUFBb0pWQUFDQ3RRQUFBeDBBQWdPSkFBQUQvUUFBZ0RrRUFBQjFCQUNBc1FRQmdPMEVBd0VwQkFJQkpRUURnT1VFQUlDcEJBSUFhUVFEQUNrRUFRUFpBQU9EV1FBQ0F0MEFBWUpoQUFHQnpRQUNBTmtBQVFQUS9BTUIyUHdBQTY3d0FBSVMvQUFEOHZ3REFITUFBZ011L0FDQXJ2d0JBdGo0QUlLRS9BQ0FEUUFDZ0YwQUFvQmxBQUtBWlFBQ2dHVUFBb0JsQUFLQVpRQUNnR1VBQW9CbEFBS0FaUUFDZ0dVQUFvQmxBQUtBWlFBQ2dHVUFBb0JsQUFLQVpRQUNnR1VBQW9CbEFBS0FaUUFDZ0dVQUFvQmxBQUNBYlFBQ2dMRUFBSUZGQUFHQ0FRQUFBbTBBQWdMZEFBQURWUUFBQTgwQUF3QWhCQUVBWVFRREFKMEVBWURkQkFBQkhRUUJnUmtFQW9EWkJBQUFuUVFCZ0YwRUFvQWRCQU9EdlFBQ0EwRUFBUUxGQUFPQ1JRQUJBWlVBQXdDWkFBQ0RSUHdCZ0xEOEFJTTIrQUtDcnZ3QkFFc0FBd0JMQUFDQ3F2d0FndWI0QWdEUS9BQ0NvUHdCQXN6OEFRTE0vQUVDelB3QkFzejhBUUxNL0FFQ3pQd0JBc3o4QVFMTS9BRUN6UHdCQXN6OEFRTE0vQUVDelB3QkFzejhBUUxNL0FFQ3pQd0JBc3o4QVFMTS9BRUN6UHdCQXN6OEFRTE0vQUVDelB3Qmd1RDhBd080L0FPQW5RQUJBWUVBQUFJNUFBS0NzUUFDZ3kwQUE0T3BBQUNBRlFRQUFGVUVBd0NSQkFLQTBRUUNBUkVFQXdFTkJBQUEwUVFCQUpFRUFnQlJCQUtBRVFRREE2VUFBUU1wQUFBQ3JRQUNnaTBBQXdGaEFBR0FhUUFCQXVEOEFBUEUrQUlBaXZ3Qmd6TDhBWUNMQUFPQU13QUFBbXI4QWdEZStBQUN0UGdCZ3VENEFZTGcrQUdDNFBnQmd1RDRBWUxnK0FHQzRQZ0JndUQ0QVlMZytBR0M0UGdCZ3VENEFZTGcrQUdDNFBnQmd1RDRBWUxnK0FHQzRQZ0JndUQ0QVlMZytBR0M0UGdCZ3VENEFZTGcrQUdDNFBnQmd1RDRBUUFNL0FBQ21Qd0JBRUVBQVFFOUFBRUNIUUFBZ3AwQUFBTWRBQU9EbVFBQmdBMEVBWUJOQkFHQWpRUUJnTTBFQVlFTkJBR0JCUVFDQU1VRUFvQ0ZCQU1BUlFRQUFBa0VBb09SQUFDREZRQUNncFVBQVFJWkFBSUJOUUFCZ0RrQUFvSjgvQUtCOFBnQkFVNzhBSU9XL0FPQXR3QURnRnNBQUlMeS9BS0JldndEQVRMOEF3RXkvQU1CTXZ3REFUTDhBd0V5L0FNQk12d0RBVEw4QXdFeS9BTUJNdndEQVRMOEF3RXkvQU1CTXZ3REFUTDhBd0V5L0FNQk12d0RBVEw4QXdFeS9BTUJNdndEQVRMOEF3RXkvQU1CTXZ3REFUTDhBWURpL0FNRDFQUUNnbVQ4QXdBeEFBTUJNUUFCZ2hrQUFZS1pBQUdER1FBQmc1a0FBUUFOQkFFQVRRUUJBSTBFQVFETkJBRUJEUVFEZ1AwRUFBREJCQUNBZ1FRQWdFRUVBUUFCQkFJRGdRQUNnd0VBQXdLQkFBQUNCUUFDQVFrQUF3QU5BQUFDTVB3Q2drRDBBSUlDL0FBRDl2d0JnUE1BQTREYkFBS0FMd0FCZzZyOEFZT2EvQUdEbXZ3Qmc1cjhBWU9hL0FHRG12d0JnNXI4QVlPYS9BR0RtdndCZzVyOEFZT2EvQUdEbXZ3Qmc1cjhBWU9hL0FHRG12d0JnNXI4QVlPYS9BR0RtdndCZzVyOEFZT2EvQUdEbXZ3Qmc1cjhBSU55L0FBQ0F2d0RBOVQwQW9Kay9BTUFNUUFEQVRFQUFZSVpBQUdDbVFBQmd4a0FBWU9aQUFFQURRUUJBRTBFQVFDTkJBRUF6UVFCQVEwRUE0RDFCQU9BdFFRQUFIa0VBSUE1QkFNRDhRQUFnM1VBQW9MMUFBQ0NlUUFCZ2ZVQUFvRDVBQUVEL1B3QUFnRDhBQVBPOUFNQ1Z2d0RBQ01BQW9EZkFBTUE5d0FDQU1zQUF3Q25BQUFBcHdBQUFLY0FBQUNuQUFBQXB3QUFBS2NBQUFDbkFBQUFwd0FBQUtjQUFBQ25BQUFBcHdBQUFLY0FBQUNuQUFBQXB3QUFBS2NBQUFDbkFBQUFwd0FBQUtjQUFBQ25BQUFBcHdBQUFLY0FBNENmQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQUJBQTBFQVFCTkJBRUFqUVFCQU0wRUFRRU5CQU9BOFFRRGdMRUVBNEJ4QkFPQU1RUURnK1VBQTRObEFBT0M1UUFBQW1rQUFJSFJBQUlBMFFBQmc2ajhBNEZ3L0FHQkx2Z0NBbTc4QXdQVy9BQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUNBNjc4QUFJQy9BTUQxUFFDZ21UOEF3QXhBQU1CTVFBQmdoa0FBWUtaQUFHREdRQUJnNWtBQVFBTkJBRUFUUVFCQUkwRUFRRE5CQUVCRFFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JBdEw0QTRIYS9BQUNBdndBQWdMOEFBSUMvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndBQWdMOEFBSUMvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndBQWdMOEFBSUMvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUJYdndEQTlUMEFvSmsvQU1BTVFBREFURUFBWUlaQUFHQ21RQUJneGtBQVlPWkFBRUFEUVFCQUUwRUFRQ05CQUVBelFRQkFRMEVBNER4QkFPQXNRUURnSEVFQTRBeEJBT0Q1UUFEZzJVQUE0TGxBQUFDYVFBQWdkRUFBZ0RSQUFHRHFQd0NnWGo4QXdESStBTUQxUFFEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQTlUMEFZTG8rQUtDZlB3QmdEa0FBNEUxQUFPQ0dRQURBcGtBQXdNWkFBS0RtUUFCQUEwRUFRQk5CQUVBalFRQkFNMEVBUUVOQkFPQTlRUURnTFVFQUFCNUJBQ0FPUVFEQS9FQUFJTjFBQU1DOVFBQ2dua0FBb0g5QUFNQkRRQUNnQzBBQUlMdy9BQUNhUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDZlB3QkEzRDhBWUNGQUFJQmJRQUFnakVBQUFLdEFBRURLUUFEQTZVQUFvQVJCQUlBVVFRQmdKRUVBUURSQkFFQkVRUUFnUUVFQVlEQkJBTUFnUVFCQUVVRUF3QUZCQU9Ea1FBREF4a0FBUUtsQUFNQ01RQUNnWkVBQTREWkFBT0FXUUFEZ0RFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBQmdEa0FBWUNGQUFBQklRQUJBZVVBQUFKaEFBT0MwUUFEQTBrQUFJUEZBQU9BSFFRQmdGMEVBQUNkQkFLQTJRUUJnUmtFQW9FTkJBRUEwUVFBQUpVRUE0QlZCQUFBSFFRQ2c4RUFBSU5SQUFPQzRRQUJBbjBBQVlJaEFBS0JyUUFEZ1UwQUE0RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBNEUxQUFJQmJRQUJBZVVBQUlKRkFBRUNwUUFDZ3cwQUFnTjlBQUVEOFFBRGdERUVBNEJ0QkFDQXJRUUJnT2tFQTRFbEJBSUJJUVFDQU9VRUFvQ3BCQUNBY1FRRGdEVUVBNFA5QUFHRGxRQUJBekVBQWdMVkFBTUNoUUFDQWtrQUFJSWxBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFPQ0dRQUFnakVBQUFKaEFBRUNwUUFCQXZrQUFJTlpBQU1EdlFBQ0FCVUVBZ0JOQkFPQWhRUUNBTUVFQWdEOUJBSUJPUVFCZ1RrRUE0RDlCQUtBeFFRQ2dJMEVBQUJaQkFBQUpRUUJnK1VBQW9PSkFBRURPUUFCQXZVQUFZTEJBQUtDb1FBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQURBcGtBQUFLdEFBT0MwUUFDZ3cwQUFJTlpBQUlEclFBQ0FBVUVBSUE1QkFHQWJRUUFnS1VFQVFEZEJBS0JGUVFCQVZFRUFZRlZCQUVCSFFRQ2dPVUVBUUN4QkFJQWZRUUJBRTBFQTRBZEJBQ0Q3UUFEZzZFQUE0TmxBQU1ET1FBQkF5RUFBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQXdNWkFBRURLUUFEQTBrQUFnTjlBQU1EdlFBQ0FBVUVBWUF4QkFDQVlRUUNBSkVFQW9ERkJBQUEvUVFEZ1RFRUFBRnRCQUVCZFFRREFUMEVBb0VKQkFBQTJRUURnS1VFQWdCNUJBQUFVUVFDQUNrRUFZQUpCQUdEM1FBQ2c3VUFBQU9oQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBS0RtUUFEQTZVQUFJUEZBQUVEOFFBQ0FCVUVBSUE1QkFDQVlRUUFBSTBFQW9DNUJBQUE3UVFEZ1IwRUFJRlZCQU1CaVFRQUFaa0VBQUZsQkFJQk1RUUNBUUVFQUlEVkJBSUFxUVFEQUlFRUFJQmhCQUtBUVFRREFDa0VBWUFaQkFPQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFvQVJCQU9BSFFRRGdERUVBZ0JOQkFHQWJRUUNBSkVFQW9DNUJBS0E1UVFCQVJVRUFnRkZCQUNCZVFRQkFhMEVBZ0c5QkFBQmpRUUFnVjBFQXdFdEJBQUJCUVFBZ04wRUFJQzVCQUNBbVFRQmdIMEVBNEJsQkFBQVdRUURnRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUlBVVFRQmdGMEVBNEJ0QkFPQWhRUUFnS1VFQW9ERkJBQUE3UVFCQVJVRUFRRkJCQU9CYlFRQUFhRUVBZ0hSQkFLQjVRUURBYlVFQVlHSkJBS0JYUVFDQVRVRUFRRVJCQU1BN1FRQmdORUVBUUM1QkFFQXBRUURBSlVFQXdDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQmdKRUVBQUNkQkFDQXJRUUNBTUVFQVFEZEJBQUEvUVFEZ1IwRUFnRkZCQU9CYlFRRGdaa0VBWUhKQkFJQitRUUFnZ2tFQUFIbEJBQ0J1UVFBQVpFRUFZRnBCQU1CUlFRRGdTVUVBQUVOQkFFQTlRUURBT0VFQWdEVkJBTUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUURSQkFLQTJRUUJnT2tFQWdEOUJBS0JGUVFEZ1RFRUFJRlZCQUNCZVFRQUFhRUVBWUhKQkFJQjlRUUNBaEVFQXdJZEJBR0NDUVFCZ2VrRUF3SEJCQU1CblFRQ0FYMEVBSUZoQkFPQlJRUUNBVEVFQVlFaEJBR0JGUVFDZ1EwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkVRUUJnUmtFQTRFbEJBSUJPUVFCQVZFRUFBRnRCQU1CaVFRQkFhMEVBZ0hSQkFJQitRUUNBaEVFQUFJcEIxeGRZT2ZRK0JvRTFQOWNYbGtNTFBRQUFBQUNxTXpnNE5EQTNNVE16TTVUWUZ3Q3dlVDhBZ053OUFKQitQd0RBRUQ3SUs4OWprdGNXS0FBQUFFWUFBQURJSzhBWEFPQzlRUUFndWtFQWdMWkJBRUN6UVFCQXNFRUFnSzFCQUtDb1FRQUFva0VBZ0p0QkFFQ1ZRUUFBajBFQUFJbEJBRUNEUVFDQWUwRUFBSEZCQUNCblFRRGdYVUVBb0ZWQkFDQk9RUURBUjBFQVlFSkJBRUErUVFCZ08wRUE0RGxCQUtBNVFRQ2dPVUVBb0RsQkFLQTVRUUFnT2tFQTREdEJBQUEvUVFCZ1EwRUE0RWhCQUlCUFFRQWdWMEVBd0Y5QkFBQnBRUUFBYzBFQW9IMUJBR0NFUVFBQXQwRUFBTE5CQUdDdlFRRGdxMEVBd0toQkFBQ21RUUJBbzBFQW9KMUJBT0NXUVFCZ2tFRUFBSXBCQU1DRFFRQ0FlMEVBNEc5QkFPQmtRUUNBV2tFQXdGQkJBT0JIUVFEZ1AwRUE0RGhCQUNBelFRQ2dMa0VBb0N0QkFPQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUFJQ3BCQUNBc1FRQ0FMMEVBUURSQkFFQTZRUUJnUVVFQWdFbEJBS0JTUVFDQVhFRUFBR2RCQUNCeVFRRGdmVUVBUUxCQkFDQ3NRUUJBcUVFQW9LUkJBR0NoUVFDQW5rRUE0SnRCQU9DWVFRQ0Fra0VBd0l0QkFFQ0ZRUUNBZlVFQUFIRkJBT0JrUVFCQVdVRUFRRTVCQUFCRVFRQ0FPa0VBNERGQkFHQXFRUUFnSkVFQVFCOUJBTUFiUVFBQUdrRUFvQmxCQUtBWlFRQ2dHVUVBb0JsQkFFQWFRUUJnSEVFQUlDQkJBRUFsUVFEQUswRUFnRE5CQUVBOFFRQUFSa0VBWUZCQkFJQmJRUUJBWjBFQVlITkJBSUNwUVFCQXBVRUFJS0ZCQUdDZFFRQUFta0VBQUpkQkFFQ1VRUUFBa2tFQVFJNUJBS0NIUVFEQWdFRUFJSFJCQUNCblFRQ0FXa0VBUUU1QkFLQkNRUUNnTjBFQWdDMUJBRUFrUVFBZ0hFRUFRQlZCQU9BUFFRQUFERUVBQUFwQkFLQUpRUUNnQ1VFQW9BbEJBS0FKUVFCQUNrRUFvQXhCQU1BUVFRQ0FGa0VBb0IxQkFBQW1RUUNBTDBFQTREbEJBT0JFUVFDZ1VFRUFBRjFCQUtCcFFRQUFvMEVBZ0o1QkFFQ2FRUUJnbGtFQXdKSkJBSUNQUVFEQWpFRUFRSXBCQUNDSVFRQ2dnMEVBWUhsQkFJQnJRUURnWFVFQXdGQkJBQUJFUVFDZ04wRUFBQ3hCQUNBaFFRQWdGMEVBUUE1QkFLQUdRUUNnQUVFQXdQaEFBQ0QwUUFCQTgwQUFRUE5BQUVEelFBQkE4MEFBd1BSQUFDRDZRQUNnQVVFQUFBaEJBT0FQUVFBQUdVRUFRQ05CQUVBdVFRQWdPa0VBZ0VaQkFHQlRRUUNnWUVFQWdKeEJBTUNYUVFCZ2swRUFRSTlCQUlDTFFRQWdpRUVBSUlWQkFLQ0NRUUNBZ0VFQUFIMUJBT0J4UVFDZ1kwRUFvRlZCQU9CSFFRQ0FPa0VBZ0MxQkFDQWhRUUJnRlVFQW9BcEJBTUFBUVFEQThFQUFJT05BQUlEWlFBQkExRUFBUU5OQUFFRFRRQUJBMDBBQVFOTkFBQURWUUFBZzIwQUFvT1ZBQU9EelFBQ2dBa0VBb0F4QkFNQVhRUUNBSTBFQUFEQkJBQ0E5UVFDZ1NrRUFZRmhCQUVDV1FRQkFrVUVBd0l4QkFHQ0lRUUNBaEVFQTRJQkJBR0I3UVFBQWRrRUFZSEZCQU9CdFFRQkFhVUVBb0Z4QkFDQk9RUURnUDBFQTRERkJBRUFrUVFBZ0YwRUFvQXBCQUtEOVFBQWc2RUFBUU5WQUFNREZRQUNndWtBQWdMUkFBRUN6UUFCQXMwQUFRTE5BQUVDelFBQkF0VUFBZ0x4QUFJRElRQURBMkVBQVFPeEFBQ0FCUVFBQURVRUF3QmxCQUFBblFRQ2dORUVBd0VKQkFBQlJRUUFBa0VFQUFJdEJBQ0NHUVFDZ2dVRUE0SHBCQUdCelFRQ2diRUVBd0daQkFBQmlRUUJBWGtFQUlGdEJBSUJWUVFEQVIwRUE0RGhCQUdBcVFRQWdIRUVBUUE1QkFNQUFRUUFnNkVBQVlOQkFBQ0M3UUFCZ3FVQUFJSnhBQU1DVVFBQkFrMEFBUUpOQUFFQ1RRQUJBazBBQW9KVkFBR0NlUUFDZ3JFQUFJTDlBQUFEVlFBQUE3VUFBWUFOQkFBQVJRUUFBSDBFQVFDMUJBT0E3UVFEQVNrRUFJSXBCQU1DRVFRQ0FmMEVBQUhaQkFDQnRRUUFnWlVFQUFGNUJBTUJYUVFDZ1VrRUFvRTVCQUdCTFFRQ0FTRUVBd0VGQkFDQXpRUUFnSkVFQVFCVkJBS0FHUVFEQThFQUFRTlZBQUNDN1FBQWdvMEFBWUk1QUFNQjhRQUJBYWtBQVlHWkFBR0JtUUFCZ1prQUFnR1pBQU1Cc1FBQWdnVUFBUUpKQUFNQ25RQUJBd0VBQW9OcEFBR0QyUUFDQUNVRUFRQmhCQUNBblFRQkFOa0VBZ0VWQkFHQ0VRUUNnZlVFQUFITkJBQUJwUVFEQVgwRUFJRmRCQUlCUFFRRGdTRUVBWUVOQkFBQS9RUURBTzBFQXdEaEJBR0EyUVFEZ0xVRUE0QjVCQU1BUFFRQ2dBRUVBSU9OQUFNREZRQUJncVVBQVlJNUFBQUJzUUFCQVJFQUF3Q3RBQUdBbVFBQmdKa0FBWUNaQUFJQW1RQUFBTDBBQVFFdEFBRUIxUUFDZ2swQUE0SzVBQUtETFFBQWc2VUFBb0FOQkFPQVNRUUJBSWtFQXdERkJBR0JCUVFEZ2ZVRUFJSEpCQUFCblFRQ0FYRUVBb0ZKQkFJQkpRUUJnUVVFQVFEcEJBRUEwUVFDQUwwRUFBQ3hCQU9Bb1FRREFKa0VBQUNSQkFHQWFRUUFBQzBFQVFQZEFBS0RZUUFCQXVrQUFJSnhBQU1COFFBQkFSRUFBQUJKQUFNRGRQd0RBekQ4QXdNdy9BTURNUHdBZ3pUOEE0T2MvQUVBYlFBQWdUMEFBUUlSQUFDQ2lRQURBd0VBQXdOOUFBQUQvUUFBZ0QwRUFBQjlCQU1BdVFRQ2dQa0VBWUhOQkFFQm5RUUNBVzBFQVlGQkJBQUJHUVFCQVBFRUFnRE5CQU1BclFRQkFKVUVBSUNCQkFHQWNRUUJBR1VFQTRCWkJBSUFVUVFBZ0VVRUFZQVpCQU1EdVFBQUEwRUFBSUxGQUFFQ1NRQUFnWjBBQVlDcEFBR0RkUHdBZ1pUOEFvQmsvQUtBWlB3Q2dHVDhBd0JzL0FDQ0ZQd0NnOVQ4QUlEaEFBT0IyUUFBQW0wQUF3THBBQUtEYVFBQ0Era0FBUUExQkFDQWRRUUFnTFVFQUlEMUJBS0JwUVFBQVhVRUFvRkJCQU9CRVFRRGdPVUVBZ0M5QkFBQW1RUUNnSFVFQWdCWkJBTUFRUVFDZ0RFRUFnQWxCQUFBSFFRQ2dCRUVBQUFKQkFFRDdRQUFnNDBBQWdNVkFBT0NuUUFEQWlVQUFZRlpBQU1BWVFBQUF0ejhBQVBFK0FJRHd2Z0NnR2I4QW9CbS9BR0NQdmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRQ2dZRUVBWUZOQkFJQkdRUUFnT2tFQVFDNUJBRUFqUVFBQUdVRUE0QTlCQUFBSVFRQ2dBVUVBSVBwQUFLRHpRQUJnN2tBQXdPbEFBS0RrUUFBQTNrQUFvTkpBQUtDNVFBQUFuRUFBb0h4QUFLQkJRQUFnQmtBQVlKTS9BQUEvUGdDQVhMOEE0TVMvQUFDcHZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQVlGaEJBS0JLUVFBZ1BVRUFBREJCQUlBalFRREFGMEVBb0F4QkFLQUNRUURnODBBQW9PVkFBQ0RiUUFCZzFFQUFvTTVBQUVES1FBQWd4VUFBQUw5QUFFQzJRQUNncDBBQXdJNUFBTUJrUUFBQUtrQUFJTjAvQUlCUVB3QUFQNzRBWUpPL0FPRDl2d0JBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUFCUlFRREFRa0VBb0RSQkFBQW5RUURBR1VFQUFBMUJBQ0FCUVFCQTdFQUF3TmhBQUlESVFBQ0F2RUFBQUxWQUFPQ3VRQURBcWtBQW9LVkFBTUNmUUFEZ2wwQUE0SXhBQUdCMlFBREFSVUFBWUE5QUFJQ3NQd0RBNVQ0QUFCcS9BS0RCdndBZ0M4QUFRTE8vQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUURBU2tFQTREdEJBRUF0UVFBQUgwRUFBQkZCQUdBRFFRQUE3VUFBQU5WQUFDQy9RQUNnckVBQVlKNUFBS0NWUUFCZ2owQUFRSXRBQUVDR1FBQmdnRUFBWUhKQUFPQmVRQUNnUTBBQVlCMUFBQURhUHdBQVpqOEFRRis5QUNCK3Z3QWc4YjhBWUJUQUFFQ3p2d0JndUw0QXdFdy9BR0RtUHdCQU0wQUFRSE5BQUtDWlFBQ2d1VUFBb05sQUFLRDVRQURBREVFQXdCeEJBTUFzUVFEQVBFRUFnRVZCQUVBMlFRQWdKMEVBUUJoQkFJQUpRUUJnOWtBQW9OcEFBRURBUUFEQXAwQUFRSkpBQUNDQlFBREFiRUFBSUdCQUFNQlhRQUNBVFVBQVFFSkFBS0EwUUFDQUlrQUFZQXhBQUtEV1B3REFpejhBd0pnK0FPQVh2d0FBdUw4QUFCWEFBRUFad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFHQkJRUURBTVVFQVFDSkJBT0FTUVFDZ0EwRUFJT2xBQUtETFFBRGdya0FBb0pOQUFFQjFRQUJBUzBBQUFDOUFBTUFoUUFBQUdVQUFZQTVBQU1BRFFBQmc3ajhBZ01zL0FDQ2tQd0NBV3o4QUlKWStBQ0RWdmdBQW1MOEFvUDIvQU1Bd3dBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFDZ1BrRUF3QzVCQUFBZlFRQWdEMEVBQVA5QUFNRGZRQURBd0VBQUlLSkFBRUNFUUFBZ1QwQUFRQnRBQU9EblB3Qmd4ejhBZ0xNL0FLQ2ZQd0FBakQ4QUlHYy9BQ0FxUHdEZ29qNEFZSEs5QUdBbHZ3QUFtTDhBd091L0FPQWt3QUFBU3NBQW9CbkFBRUN6dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBSUQxQkFDQXRRUUFnSFVFQVFBMUJBSUQ2UUFDZzJrQUF3THBBQUFDYlFBRGdka0FBSURoQUFLRDFQd0FnaFQ4QWdCay9BR0RFUGdDZ2ZENEFvSkE5QUlBZHZnQWcxcjRBQURpL0FDQ0V2d0FndTc4QWdBREFBT0Frd0FCQVVNQUFnRmZBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDUHZnQ2dOcjhBb0ZPL0FDQ0F2d0FnbHI4QVFMQy9BT0RUdndBQS9MOEFJQlhBQU1BMHdBQUFVY0FBUUczQUFJQlp3QUNnR2NBQVFMTy9BR0M0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QW9LMi9BS0RtdndEQStMOEFvQVRBQUVBTndBRGdGc0FBWUIvQUFLQWt3QUJnSnNBQVlDbkFBT0E5d0FEZ1Q4QUFvQm5BQUVDenZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUFDcHZ3REF6TDhBd015L0FNRE12d0RBekw4QXdNeS9BTURNdndEQXpMOEF3TXkvQUVEV3Z3QkFDY0FBUURiQUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FHQ1B2Z0NnR2I4QW9CbS9BS0FadndDZ0diOEFvQm0vQUtBWnZ3Q2dHYjhBb0JtL0FLQVp2d0RBUnI4QVlNYS9BR0Fmd0FDZ0djQUFRTE8vQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUUFnUFVFQUlDMUJBQ0FkUVFCQURVRUFnUHBBQUtEYVFBREF1a0FBQUp0QUFPQjJRQUFnT0VBQW9QVS9BQ0NGUHdEQUd6OEFvQmsvQUtBWlB3Q2dHVDhBb0JrL0FLQVpQd0NnR1Q4QW9Cay9BS0FaUHdBZ0JUOEFZTGkrQUVDenZ3Q2dHY0FBb0JuQUFFQ3p2d0JndUw0QXdFdy9BR0RtUHdCQU0wQUFRSE5BQUtDWlFBQ2d1VUFBb05sQUFLRDVRQURBREVFQXdCeEJBTUFzUVFEQVBFRUFvRDVCQU1BdVFRQUFIMEVBSUE5QkFBRC9RQURBMzBBQXdNQkFBQ0NpUUFCQWhFQUFJRTlBQUVBYlFBRGc1ejhBSU0wL0FNRE1Qd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQU1ETVB3Q0F3ajhBd0V3L0FHQzR2Z0JBczc4QW9CbkFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFHQkJRUURBTVVFQVFDSkJBT0FTUVFDZ0EwRUFJT2xBQUtETFFBRGdya0FBb0pOQUFFQjFRQUJBUzBBQUFDOUFBSUFtUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBWUNaQUFHQW1RQUJBSVVBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUtBWndBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFDQVJVRUFRRFpCQUNBblFRQkFHRUVBZ0FsQkFHRDJRQUNnMmtBQVFNQkFBTUNuUUFCQWtrQUFJSUZBQU1Cc1FBQ0Faa0FBWUdaQUFHQm1RQUJnWmtBQVlHWkFBR0JtUUFCQVlVQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0NnR2NBQW9CbkFBRUN6dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBd0VwQkFPQTdRUUJBTFVFQUFCOUJBQUFSUVFCZ0EwRUFBTzFBQUFEVlFBQWd2MEFBb0t4QUFHQ2VRQUNnbFVBQVFKTkFBRUNUUUFCQWswQUFRSk5BQUVDVFFBQ2drRUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdCQXM3OEFvQm5BQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBQUJSUVFEQVFrRUFvRFJCQUFBblFRREFHVUVBQUExQkFDQUJRUUJBN0VBQXdOaEFBSURJUUFDQXZFQUFRTFZBQUVDelFBQkFzMEFBUUxOQUFFQ3pRQUNnc0VBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUNnR2NBQVFMTy9BR0M0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRQmdXRUVBb0VwQkFDQTlRUUFBTUVFQWdDTkJBTUFYUVFDZ0RFRUFvQUpCQU9EelFBQ2c1VUFBSU50QUFBRFZRQUJBMDBBQVFOTkFBRURUUUFDZzBFQUFvTGxBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVlMaStBRUN6dndDZ0djQUFvQm5BQUVDenZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQW9HQkJBR0JUUVFDQVJrRUFJRHBCQUVBdVFRQkFJMEVBQUJsQkFPQVBRUUFBQ0VFQW9BRkJBQ0Q2UUFEQTlFQUFRUE5BQUVEelFBQ2c4RUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtCcFFRQUFYVUVBb0ZCQkFPQkVRUURnT1VFQWdDOUJBQUFtUVFDZ0hVRUFnQlpCQU1BUVFRQ2dERUVBUUFwQkFLQUpRUUJnQ0VFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QVFMTy9BS0Fad0FDZ0djQUFRTE8vQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUUJnYzBFQVFHZEJBSUJiUVFCZ1VFRUFBRVpCQUVBOFFRQ0FNMEVBd0N0QkFFQWxRUUFnSUVFQVlCeEJBRUFhUVFCZ0dFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUVDenZ3Q2dHY0FBb0JuQUFFQ3p2d0JndUw0QXdFdy9BR0RtUHdCQU0wQUFRSE5BQUtDWlFBQ2d1VUFBb05sQUFLRDVRQURBREVFQXdCeEJBTUFzUVFEQVBFRUE0SDFCQUNCeVFRQUFaMEVBZ0Z4QkFLQlNRUUNBU1VFQVlFRkJBRUE2UVFCQU5FRUFnQzlCQUNBc1FRREFLRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FHQzR2Z0JBczc4QW9CbkFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFHQ0VRUUNnZlVFQUFITkJBQUJwUVFEQVgwRUFJRmRCQUlCUFFRRGdTRUVBWUVOQkFBQS9RUURnT1VFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUtBWndBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFBZ2lrRUF3SVJCQUlCL1FRQUFka0VBSUcxQkFDQmxRUUFBWGtFQXdGZEJBS0JTUVFCQVMwRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0NnR2NBQW9CbkFBRUN6dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBQUpCQkFBQ0xRUUFnaGtFQW9JRkJBT0I2UVFCZ2MwRUFvR3hCQUlCbVFRQkFYRUVBd0V4QkFNQThRUURBTEVFQXdCeEJBTUFNUVFDZytVQUFvTmxBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdCQXM3OEFvQm5BQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBRUNXUVFCQWtVRUF3SXhCQUdDSVFRQ0FoRUVBNElCQkFPQjVRUURBYkVFQXdGeEJBTUJNUVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUNnR2NBQVFMTy9BR0M0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRQ0FuRUVBd0pkQkFHQ1RRUUJBajBFQVlJdEJBQUNHUVFEQWZFRUF3R3hCQU1CY1FRREFURUVBd0R4QkFNQXNRUURBSEVFQXdBeEJBS0Q1UUFDZzJVQUFvTGxBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVlMaStBRUN6dndDZ0djQUFvQm5BQUVDenZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQUFLTkJBSUNlUVFCQW1rRUFZSlZCQUdDT1FRQmdoa0VBd0h4QkFNQnNRUURBWEVFQXdFeEJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUlDcFFRREFwRUVBUUo1QkFHQ1dRUUJnamtFQVlJWkJBTUI4UVFEQWJFRUF3RnhCQU1CTVFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QVFMTy9BS0Fad0FDZ0djQUFRTE8vQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUUFncmtFQVlLWkJBR0NlUVFCZ2xrRUFZSTVCQUdDR1FRREFmRUVBd0d4QkFNQmNRUURBVEVFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUVDenZ3Q2dHY0FBb0JuQUFFQ3p2d0JndUw0QXdFdy9BR0RtUHdCQU0wQUFRSE5BQUtDWlFBQ2d1VUFBb05sQUFLRDVRQURBREVFQXdCeEJBTUFzUVFEQVBFRUFZSzVCQUdDbVFRQmdua0VBWUpaQkFHQ09RUUJnaGtFQXdIeEJBTUJzUVFEQVhFRUF3RXhCQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FHQzR2Z0JBczc4QW9CbkFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFHQ3VRUUJncGtFQVlKNUJBR0NXUVFCZ2prRUFZSVpCQU1COFFRREFiRUVBd0Z4QkFNQk1RUURBUEVFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUtBWndBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFCZ3JrRUFZS1pCQUdDZVFRQmdsa0VBWUk1QkFHQ0dRUURBZkVFQXdHeEJBTUJjUVFEQVRFRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0NnR2NBQW9CbkFBRUN6dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBWUs1QkFHQ21RUUJnbmtFQVlKWkJBR0NPUVFCZ2hrRUF3SHhCQU1Cc1FRREFYRUVBd0V4QkFNQThRUURBTEVFQXdCeEJBTUFNUVFDZytVQUFvTmxBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdCQXM3OEFvQm5BQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBR0N1UVFCZ3BrRUFZSjVCQUdDV1FRQmdqa0VBWUlaQkFNQjhRUURBYkVFQXdGeEJBTUJNUVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUNnR2NBQVFMTy9BR0M0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRQmdya0VBWUtaQkFHQ2VRUUJnbGtFQVlJNUJBR0NHUVFEQWZFRUF3R3hCQU1CY1FRREFURUVBd0R4QkFNQXNRUURBSEVFQXdBeEJBS0Q1UUFDZzJVQUFvTGxBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVlMaStBRUN6dndDZ0djQUFvQm5BQUVDenZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQVlLNUJBR0NtUVFCZ25rRUFZSlpCQUdDT1FRQmdoa0VBd0h4QkFNQnNRUURBWEVFQXdFeEJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUdDdVFRQmdwa0VBWUo1QkFHQ1dRUUJnamtFQVlJWkJBTUI4UVFEQWJFRUF3RnhCQU1CTVFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QVFMTy9BS0Fad0FDZ0djQUFRTE8vQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUUJncmtFQVlLWkJBR0NlUVFCZ2xrRUFZSTVCQUdDR1FRREFmRUVBd0d4QkFNQmNRUURBVEVFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUVDenZ3Q2dHY0FBb0JuQUFFQ3p2d0JndUw0QXdFdy9BR0RtUHdCQU0wQUFRSE5BQUtDWlFBQ2d1VUFBb05sQUFLRDVRQURBREVFQXdCeEJBTUFzUVFEQVBFRUFZSzVCQUdDbVFRQmdua0VBWUpaQkFHQ09RUUJnaGtFQXdIeEJBTUJzUVFEQVhFRUF3RXhCQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FHQzR2Z0JBczc4QW9CbkFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFHQ3VRUUJncGtFQVlKNUJBR0NXUVFCZ2prRUFZSVpCQU1COFFRREFiRUVBd0Z4QkFNQk1RUURBUEVFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUNBWndBQWdHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFCZ3JrRUFZS1pCQUdDZVFRQmdsa0VBWUk1QkFHQ0dRUURBZkVFQXdHeEJBTUJjUVFEQVRFRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FDQ3l2d0RnKzc4QTRQdS9BQ0N5dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBWUs1QkFHQ21RUUJnbmtFQVlKWkJBR0NPUVFCZ2hrRUF3SHhCQU1Cc1FRREFYRUVBd0V4QkFNQThRUURBTEVFQXdCeEJBTUFNUVFDZytVQUFvTmxBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BRUMwdmdEQWQ3OEFBSUMvQUFDQXZ3REFkNzhBUUxTK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBR0N1UVFCZ3BrRUFZSjVCQUdDV1FRQmdqa0VBWUlaQkFPQjhRUURnYkVFQTRGeEJBT0JNUVFEZ1BFRUE0Q3hCQU9BY1FRRGdERUVBNFBsQUFPRFpRQURndVVBQUFKcEFBQ0IwUUFDQU5FQUFZT28vQUtCZVB3REFNajRBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUF5UGdDZ1hqOEFZT28vQUlBMFFBQWdkRUFBQUpwQUFPQzVRQURnMlVBQTRQbEFBT0FNUVFEZ0hFRUE0Q3hCQU9BOFFRQ2dya0VBd0taQkFNQ2VRUURBbGtFQXdJNUJBTUNHUVFDZ2ZVRUFvRzFCQUtCZFFRREFUVUVBNEQxQkFPQXRRUUFBSGtFQUlBNUJBTUQ4UUFBZzNVQUF3TDFBQUtDZVFBQ2dmMEFBd0VOQUFLQUxRQUFndkQ4QUFKby9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3QUFtajhBSUx3L0FLQUxRQURBUTBBQW9IOUFBS0NlUUFEQXZVQUFJTjFBQU1EOFFBQWdEa0VBQUI1QkFPQXRRUURnUFVFQVFLOUJBR0NuUVFCZ24wRUFnSmRCQUlDUFFRQ2doMEVBUUg5QkFJQnZRUUNnWDBFQTRFOUJBQ0JBUVFCZ01FRUF3Q0JCQUVBUlFRREFBVUVBNE9SQUFNREdRQUJBcVVBQXdJeEFBS0JrUUFEZ05rQUE0QlpBQU9BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQTRBeEFBT0FXUUFEZ05rQUFvR1JBQU1DTVFBQkFxVUFBd01aQUFPRGtRQURBQVVFQVFCRkJBTUFnUVFCZ01FRUFJRUJCQUVDd1FRQmdxRUVBZ0tCQkFLQ1lRUURBa0VFQTRJaEJBQUNCUVFCZ2NrRUF3R0pCQUNCVFFRQ2dRMEVBUURSQkFBQWxRUURnRlVFQUFBZEJBS0R3UUFBZzFFQUE0TGhBQUVDZlFBQmdpRUFBb0d0QUFPQlRRQURnVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU9CTVFBRGdVMEFBb0d0QUFHQ0lRQUJBbjBBQTRMaEFBQ0RVUUFDZzhFQUFBQWRCQU9BVlFRQUFKVUVBUURSQkFLQkRRUUNnc1VFQXdLbEJBQUNpUVFBZ21rRUFZSkpCQUlDS1FRREFna0VBUUhaQkFPQm1RUUNnVjBFQWdFaEJBSUE1UVFDZ0trRUFJQnhCQU9BTlFRRGcvMEFBWU9WQUFFRE1RQUNBdFVBQXdLRkFBSUNTUUFBZ2lVQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQUlJbEFBSUNTUUFEQW9VQUFnTFZBQUVETVFBQmc1VUFBNFA5QUFPQU5RUUFnSEVFQW9DcEJBSUE1UVFDQVNFRUFRTE5CQUlDclFRREFvMEVBSUp4QkFHQ1VRUURBakVFQUlJVkJBQUI3UVFBQWJFRUFJRjFCQUdCT1FRRGdQMEVBb0RGQkFLQWpRUUFBRmtFQUFBbEJBR0Q1UUFDZzRrQUFRTTVBQUVDOVFBQmdzRUFBb0toQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUtDb1FBQmdzRUFBUUwxQUFFRE9RQUNnNGtBQVlQbEFBQUFKUVFBQUZrRUFvQ05CQUtBeFFRRGdQMEVBWUU1QkFHQzFRUUNnclVFQUFLWkJBR0NlUVFEQWxrRUFRSTlCQU1DSFFRQmdnRUVBSUhKQkFLQmpRUUJnVlVFQVFFZEJBS0E1UVFCQUxFRUFnQjlCQUVBVFFRRGdCMEVBSVB0QUFPRG9RQURnMlVBQXdNNUFBRURJUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJBeUVBQXdNNUFBT0RaUUFEZzZFQUFJUHRBQU9BSFFRQkFFMEVBZ0I5QkFFQXNRUUNnT1VFQVFFZEJBR0JWUVFDZ3QwRUFJTEJCQUtDb1FRQWdvVUVBb0psQkFFQ1NRUURnaWtFQW9JTkJBQ0I1UVFBQWEwRUFRRjFCQU1CUFFRQ2dRa0VBQURaQkFPQXBRUUNBSGtFQUFCUkJBSUFLUVFCZ0FrRUFZUGRBQUtEdFFBQUE2RUFBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFBT2hBQUtEdFFBQmc5MEFBWUFKQkFJQUtRUUFBRkVFQWdCNUJBT0FwUVFBQU5rRUFvRUpCQU1CUFFRQkFYVUVBWUxwQkFPQ3lRUUNBcTBFQUlLUkJBTUNjUVFDZ2xVRUFZSTVCQUdDSFFRQ0FnRUVBUUhOQkFBQm1RUUFBV1VFQWdFeEJBSUJBUVFBZ05VRUFnQ3BCQU1BZ1FRQWdHRUVBb0JCQkFNQUtRUUJnQmtFQTRBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFPQURRUUJnQmtFQXdBcEJBS0FRUVFBZ0dFRUF3Q0JCQUlBcVFRQWdOVUVBZ0VCQkFJQk1RUUFBV1VFQUFHWkJBRUM5UVFBQXRrRUFvSzVCQUlDblFRQkFvRUVBUUpsQkFFQ1NRUUJnaTBFQXdJUkJBRUI4UVFDQWIwRUFBR05CQUNCWFFRREFTMEVBQUVGQkFDQTNRUUFnTGtFQUlDWkJBR0FmUVFEZ0dVRUFBQlpCQU9BVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFEZ0UwRUFBQlpCQU9BWlFRQmdIMEVBSUNaQkFDQXVRUUFnTjBFQUFFRkJBTUJMUVFBZ1YwRUFBR05CQUlCdlFRQ0F3RUVBWUxsQkFFQ3lRUUFncTBFQUlLUkJBRUNkUVFDQWxrRUE0STlCQUVDSlFRQUFnMEVBb0hsQkFNQnRRUUJnWWtFQW9GZEJBSUJOUVFCQVJFRUF3RHRCQUdBMFFRQkFMa0VBUUNsQkFNQWxRUURBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBd0NOQkFNQWxRUUJBS1VFQVFDNUJBR0EwUVFEQU8wRUFRRVJCQUlCTlFRQ2dWMEVBWUdKQkFNQnRRUUNnZVVFQUlNUkJBQUM5UVFBQXRrRUFJSzlCQUVDb1FRQ0FvVUVBQUp0QkFJQ1VRUUJBamtFQUlJaEJBQ0NDUVFBQWVVRUFJRzVCQUFCa1FRQmdXa0VBd0ZGQkFPQkpRUUFBUTBFQVFEMUJBTUE0UVFDQU5VRUF3RE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBTUF6UVFDQU5VRUF3RGhCQUVBOVFRQUFRMEVBNEVsQkFNQlJRUUJnV2tFQUFHUkJBQ0J1UVFBQWVVRUFJSUpCQU9ESFFRRGd3RUVBSUxwQkFFQ3pRUUNnckVFQUlLWkJBTUNmUVFDQW1VRUFZSk5CQUlDTlFRREFoMEVBWUlKQkFHQjZRUURBY0VFQXdHZEJBSUJmUVFBZ1dFRUE0RkZCQUlCTVFRQmdTRUVBWUVWQkFLQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQ2dRMEVBWUVWQkFHQklRUUNBVEVFQTRGRkJBQ0JZUVFDQVgwRUF3R2RCQU1Cd1FRQmdla0VBWUlKQkFNQ0hRZGNYU09GNlBnYUJOVC9YRjJEbDBEMEFBQUFBcVRZNE1qWTNPREV3TVpUWUZ3Q0EvajBBWU1ZK0FFQWFQZ0NnMXo3SVBEZGprdGNXTndBQUFFWUFBQURJUENnWEFLQ2hRUUJBbTBFQUFKVkJBT0NPUVFBQWlVRUFRSU5CQU1CN1FRQmdjVUVBd0dkQkFPQmVRUURnVmtFQW9FOUJBSUJKUVFDQVJFRUF3RUJCQUNBK1FRQUFQVUVBd0R4QkFNQThRUURBUEVFQXdEeEJBTUE4UVFEQVBFRUF3RHhCQU1BOFFRREFQRUVBd0R4QkFNQThRUURBUEVFQXdEeEJBTUE4UVFEQVBFRUF3RHhCQU1BOFFRREFQRUVBd0R4QkFNQThRUURBUEVFQXdEeEJBTUE4UVFBQVBVRUFJRDVCQU1CQVFRQ0FSRUVBZ0VsQkFLQlBRUURnVmtFQTRGNUJBTUJuUVFCZ2NVRUF3SHRCQUVDRFFRQUFpVUVBNEk1QkFBQ1ZRUUFnblVFQWdKWkJBQUNRUVFEQWlVRUFvSU5CQUVCN1FRRGdiMEVBSUdWQkFBQmJRUUNBVVVFQTRFaEJBRUJCUVFDZ09rRUFRRFZCQUNBeFFRQkFMa0VBQUMxQkFNQXNRUURBTEVFQXdDeEJBTUFzUVFEQUxFRUF3Q3hCQU1Bc1FRREFMRUVBd0N4QkFNQXNRUURBTEVFQXdDeEJBTUFzUVFEQUxFRUF3Q3hCQU1Bc1FRREFMRUVBd0N4QkFNQXNRUURBTEVFQXdDeEJBTUFzUVFEQUxFRUFBQzFCQUVBdVFRQWdNVUVBUURWQkFLQTZRUUJBUVVFQTRFaEJBSUJSUVFBQVcwRUFJR1ZCQU9CdlFRQkFlMEVBb0lOQkFNQ0pRUUFBa0VFQTRKaEJBQUNTUVFCZ2kwRUE0SVJCQU9COFFRQ2djRUVBb0dSQkFHQlpRUUNnVGtFQWdFUkJBR0E3UVFBZ00wRUFBQ3hCQUFBbVFRQ0FJVUVBZ0I1QkFBQWRRUURBSEVFQXdCeEJBTUFjUVFEQUhFRUF3QnhCQU1BY1FRREFIRUVBd0J4QkFNQWNRUURBSEVFQXdCeEJBTUFjUVFEQUhFRUF3QnhCQU1BY1FRREFIRUVBd0J4QkFNQWNRUURBSEVFQXdCeEJBTUFjUVFEQUhFRUF3QnhCQUFBZFFRQ0FIa0VBZ0NGQkFBQW1RUUFBTEVFQUlETkJBR0E3UVFDQVJFRUFvRTVCQUdCWlFRQ2daRUVBb0hCQkFPQjhRUURnaEVFQVlJdEJBT0NVUVFEZ2pVRUFBSWRCQUVDQVFRQmdjMEVBZ0daQkFBQmFRUUFnVGtFQXdFSkJBQUE0UVFBZ0xrRUFRQ1ZCQUlBZFFRQUFGMEVBQUJKQkFLQU9RUUFBRFVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQU1BTVFRREFERUVBd0F4QkFNQU1RUURBREVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQU1BTVFRREFERUVBd0F4QkFNQU1RUURBREVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQU1BTVFRQUFEVUVBb0E1QkFBQVNRUUFBRjBFQWdCMUJBRUFsUVFBZ0xrRUFBRGhCQU1CQ1FRQWdUa0VBQUZwQkFJQm1RUUJnYzBFQVFJQkJBQUNIUVFCQWtVRUFJSXBCQUFDRFFRQWdlRUVBWUdwQkFBQmRRUUFBVUVFQWdFTkJBSUEzUVFBZ0xFRUFnQ0ZCQU9BWFFRQmdEMEVBUUFoQkFLQUNRUURBL1VBQUlQcEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ2crVUFBb1BsQUFLRDVRQUNnK1VBQW9QbEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ2crVUFBb1BsQUFLRDVRQUNnK1VBQW9QbEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ2crVUFBSVBwQUFNRDlRQUNnQWtFQVFBaEJBR0FQUVFEZ0YwRUFnQ0ZCQUNBc1FRQ0FOMEVBZ0VOQkFBQlFRUUFBWFVFQVlHcEJBQ0I0UVFBQWcwRUFBSTVCQU1DR1FRRGdma0VBZ0hCQkFHQmlRUUJnVkVFQTRFWkJBS0E1UVFBQUxVRUE0Q0JCQUlBVlFRQUFDMEVBb0FGQkFJRHpRQURnNWtBQVlONUFBQ0RhUUFDZzJVQUFvTmxBQUtEWlFBQ2cyVUFBb05sQUFLRFpRQUNnMlVBQW9ObEFBS0RaUUFDZzJVQUFvTmxBQUtEWlFBQ2cyVUFBb05sQUFLRFpRQUNnMlVBQW9ObEFBS0RaUUFDZzJVQUFvTmxBQUtEWlFBQ2cyVUFBb05sQUFDRGFRQUJnM2tBQTRPWkFBSUR6UUFDZ0FVRUFBQXRCQUlBVlFRRGdJRUVBQUMxQkFLQTVRUURnUmtFQVlGUkJBR0JpUVFDQWNFRUE0SDVCQUNDTFFRQ2dnMEVBWUhoQkFLQnBRUUFnVzBFQXdFeEJBS0ErUVFEQU1FRUFZQ05CQUlBV1FRQkFDa0VBd1AxQUFDRHBRQUJnMTBBQUlNbEFBQ0MvUUFCQXVrQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzVRQUNndVVBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzVRQUNndVVBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzVRQUJBdWtBQUlMOUFBQ0RKUUFCZzEwQUFJT2xBQU1EOVFBQkFDa0VBZ0JaQkFHQWpRUURBTUVFQW9ENUJBTUJNUVFBZ1cwRUFvR2xCQUdCNFFRREFpRUVBSUlGQkFPQnlRUURBWTBFQXdGUkJBQUJHUVFCZ04wRUE0Q2hCQU9BYVFRQkFEVUVBSUFCQkFHRG5RQUNnMEVBQWdMeEFBQUNzUUFCQW9FQUFZSnBBQUtDWlFBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFDZ21VQUFvSmxBQUtDWlFBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFDZ21VQUFvSmxBQUtDWlFBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQVlKcEFBRUNnUUFBQXJFQUFnTHhBQUtEUVFBQmc1MEFBSUFCQkFFQU5RUURnR2tFQTRDaEJBR0EzUVFBQVJrRUF3RlJCQU1CalFRRGdja0VBd0laQkFPQjlRUUJnYmtFQTRGNUJBSUJQUVFCZ1FFRUFRREZCQUVBaVFRQ2dFMEVBSUFWQkFHRHVRQUNBMDBBQVFMcEFBR0NqUUFBZ2tFQUE0SUZBQUVCMVFBQkFjMEFBUUhOQUFFQnpRQUJBYzBBQVFITkFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBYzBBQVFITkFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBYzBBQVFITkFBRUIxUUFEZ2dVQUFJSkJBQUdDalFBQkF1a0FBZ05OQUFHRHVRQUFnQlVFQW9CTkJBRUFpUVFCQU1VRUFZRUJCQUlCUFFRRGdYa0VBWUc1QkFDQ0ZRUUNBZWtFQXdHcEJBQ0JiUVFDQVMwRUE0RHRCQUdBc1FRQUFIVUVBd0ExQkFHRDlRQURBMzBBQTRNSkFBQ0NuUUFCQWpVQUF3R3hBQUNCSlFBRGdOVUFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFEZ05VQUFJRWxBQU1Cc1FBQkFqVUFBSUtkQUFPRENRQURBMzBBQVlQMUFBTUFOUVFBQUhVRUFZQ3hCQU9BN1FRQ0FTMEVBSUZ0QkFNQnFRUUNBZzBFQVlIZEJBS0JuUVFEZ1YwRUFRRWhCQUtBNFFRRGdLRUVBUUJsQkFJQUpRUURnODBBQUFOVkFBR0MyUUFCZ21FQUE0SFpBQU9CQVFBQUFFMEFBNE80L0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3Qmc1ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3Qmc1ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEE0TzQvQUFBVFFBRGdRRUFBNEhaQUFHQ1lRQUJndGtBQUFOVkFBT0R6UUFDQUNVRUFRQmxCQU9Bb1FRREFPRUVBZ0VoQkFHQllRUUJBYUVFQVlJSkJBT0IwUVFBZ1pVRUFRRlZCQUdCRlFRQ0FOVUVBd0NWQkFBQVdRUUJnQmtFQVlPMUFBQ0RPUUFEQXJrQUFZSTlBQUVCZ1FBRGdJa0FBb05FL0FJQndQd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEF3RXcvQU1CTVB3REFURDhBd0V3L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEF3RXcvQU1CTVB3REFURDhBd0V3L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEF3RXcvQUlCd1B3Q2cwVDhBNENKQUFFQmdRQUJnajBBQTRLNUFBS0RPUUFCZzdrQUFJQWRCQUFBWFFRQUFKMEVBNERaQkFPQkdRUURnVmtFQXdHWkJBRUNCUVFDZ2NrRUF3R0pCQUFCVFFRQWdRMEVBWUROQkFJQWpRUURBRTBFQTRBTkJBQURvUUFCQXlFQUFvS2hBQUNDSlFBQ2dVMEFBWUJWQUFPQ3VQd0FBd2o0QTRLZStBR0M0dmdCZ3VMNEFZTGkrQUdDNHZnQmd1TDRBWUxpK0FHQzR2Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEFZTGkrQUdDNHZnQmd1TDRBWUxpK0FHQzR2Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEFZTGkrQU9DbnZnQmd4RDRBb0xNL0FNQVpRQUNnV1VBQTRJeEFBT0NzUUFEZ3pFQUE0T3hBQUdBR1FRQmdGa0VBWUNaQkFHQTJRUUJnUmtFQVlGWkJBR0JtUVFBZ2dFRUFZSEJCQUtCZ1FRREFVRUVBNEVCQkFDQXhRUUJBSVVFQVlCRkJBSUFCUVFDQTQwQUFBTVJBQUlDa1FBQUFoVUFBUUV0QUFHQU1RQUFBbWo4QTRCNCtBT0JrdndEQXNiOEFRTE8vQUVDenZ3QkFzNzhBUUxPL0FFQ3p2d0JBczc4QVFMTy9BRUN6dndCQXM3OEFRTE8vQUVDenZ3QkFzNzhBUUxPL0FFQ3p2d0JBczc4QVFMTy9BRUN6dndCQXM3OEFRTE8vQUNDdnZ3REFTcjhBWUxnK0FFQ3pQd0NnR1VBQW9GbEFBTUNNUUFEQXJFQUF3TXhBQU1Ec1FBQmdCa0VBWUJaQkFHQW1RUUJnTmtFQVlFWkJBR0JXUVFCZ1prRUFBSDVCQUNCdVFRQkFYa0VBZ0U1QkFLQStRUURBTGtFQUFCOUJBQ0FQUVFEQS9rQUFJTjlBQUtDL1FBQUFvRUFBWUlCQUFFQkJRQURBQVVBQTRJWS9BS0RFUEFDZ2dyOEFRUDIvQUNBWndBQ2dHY0FBb0JuQUFLQVp3QUNnR2NBQW9CbkFBS0Fad0FDZ0djQUFvQm5BQUtBWndBQ2dHY0FBb0JuQUFLQVp3QUNnR2NBQW9CbkFBS0Fad0FDZ0djQUFvQm5BQUlBWHdBQmc1YjhBd0V5L0FHQzRQZ0JBc3o4QW9CbEFBS0JaUUFEQWpFQUF3S3hBQU1ETVFBREE3RUFBWUFaQkFHQVdRUUJnSmtFQVlEWkJBR0JHUVFCZ1ZrRUFZR1pCQUtCN1FRRGdhMEVBQUZ4QkFDQk1RUUJnUEVFQW9DeEJBTUFjUVFBQURVRUFRUHBBQUlEYVFBREF1a0FBQUp0QUFPQjJRQUFnT0VBQTRQTS9BR0J4UHdCZy83MEF3SmkvQU9BS3dBQ0FPY0FBNENiQUFDQWF3QUNnR2NBQW9CbkFBS0Fad0FDZ0djQUFvQm5BQUtBWndBQ2dHY0FBb0JuQUFLQVp3QUNnR2NBQW9CbkFBS0Fad0FDZ0djQUFvQm5BQUtBWndBQ0FGOEFBWU9XL0FNQk12d0JndUQ0QVFMTS9BS0FaUUFDZ1dVQUF3SXhBQU1Dc1FBREF6RUFBd094QUFHQUdRUUJnRmtFQVlDWkJBR0EyUVFCZ1JrRUFZRlpCQUdCbVFRQmdlVUVBb0dsQkFNQlpRUUFBU2tFQUlEcEJBR0FxUVFDQUdrRUFvQXBCQUlEMVFBREExVUFBUUxaQUFPQ1dRQURnYmtBQVlEQkFBTURqUHdDQVREOEFBSzIrQU1DcHZ3REFFc0FBb0J6QUFDRGZ2d0FndGI4QVFMTy9BRUN6dndCQXM3OEFRTE8vQUVDenZ3QkFzNzhBUUxPL0FFQ3p2d0JBczc4QVFMTy9BRUN6dndCQXM3OEFRTE8vQUVDenZ3QkFzNzhBUUxPL0FDQ3Z2d0RBU3I4QVlMZytBRUN6UHdDZ0dVQUFvRmxBQU1DTVFBREFyRUFBd014QUFNRHNRQUJnQmtFQVlCWkJBR0FtUVFCZ05rRUFZRVpCQUdCV1FRQmdaa0VBUUhkQkFHQm5RUUNBVjBFQXdFZEJBT0EzUVFBQUtFRUFJQmhCQUdBSVFRQWc4VUFBb05GQUFBQ3lRQUNBa2tBQUFHWkFBTUFtUUFCZ3pqOEFnQ0kvQUFEeHZnQmd1TDhBZ0JmQUFFRCt2d0NBaTc4QWdOMitBR0M0dmdCZ3VMNEFZTGkrQUdDNHZnQmd1TDRBWUxpK0FHQzR2Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEFZTGkrQUdDNHZnQmd1TDRBWUxpK0FHQzR2Z0JndUw0QTRLZStBR0RFUGdDZ3N6OEF3QmxBQUtCWlFBRGdqRUFBNEt4QUFPRE1RQURnN0VBQVlBWkJBR0FXUVFCZ0prRUFZRFpCQUdCR1FRQmdWa0VBWUdaQkFPQjBRUUFnWlVFQVFGVkJBR0JGUVFDQU5VRUF3Q1ZCQUFBV1FRQWdCa0VBd094QUFDRE5RQUJnclVBQW9JMUFBT0JiUUFEQUhFQUFRTDAvQU1BRVB3REFHNzhBNE15L0FJQWJ3QUJBNXI4QVFFNi9BQ0NTUGdEQVNqOEF3RXcvQU1CTVB3REFURDhBd0V3L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEF3RXcvQU1CTVB3REFURDhBd0V3L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdDQWNEOEFvTkUvQU9BaVFBQkFZRUFBWUk5QUFPQ3VRQUNnemtBQVlPNUFBQ0FIUVFBQUYwRUFBQ2RCQU9BMlFRRGdSa0VBNEZaQkFNQm1RUUNnY2tFQXdHSkJBQUJUUVFBZ1EwRUFZRE5CQUlBalFRREFFMEVBNEFOQkFBRG9RQUJBeUVBQW9LaEFBQ0NKUUFDZ1UwQUFRQlZBQUlDdVB3QUF0ajRBQUVtL0FPRGZ2d0FnRzhBQVFORy9BR0FzdndDQTJENEFBTEUvQUtEbFB3Qmc1ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3Qmc1ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEE0TzQvQUFBVFFBRGdRRUFBNEhaQUFHQ1lRQUJndGtBQUFOVkFBT0R6UUFDQUNVRUFRQmxCQU9Bb1FRREFPRUVBZ0VoQkFHQllRUUJBYUVFQVlIQkJBS0JnUVFEQVVFRUE0RUJCQUNBeFFRQkFJVUVBWUJGQkFJQUJRUUNBNDBBQUFNUkFBSUNrUUFBQWhVQUFRRXRBQUdBTVFBQUFtajhBNEI0K0FDQm52d0RBN3I4QVFCZkFBRUM5dndEQUJMOEF3QnMvQUFETFB3QkFJRUFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFRRE5BQU9BMVFBQWdTVUFBd0d4QUFFQ05RQUFncDBBQTRNSkFBTURmUUFCZy9VQUF3QTFCQUFBZFFRQmdMRUVBNER0QkFJQkxRUUFnVzBFQXdHcEJBQ0J1UVFCQVhrRUFnRTVCQUtBK1FRREFMa0VBQUI5QkFDQVBRUURBL2tBQUlOOUFBS0MvUUFBQW9FQUFZSUJBQUVCQlFBREFBVUFBNElZL0FLREVQQUNnZ3I4QW9BREFBTUFUd0FDQXJyOEFBTGErQUFCSlB3RGczejhBSUM1QUFFQm1RQUJBYzBBQVFITkFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBYzBBQVFITkFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFkVUFBNElGQUFDQ1FRQUJnbzBBQVFMcEFBSURUUUFCZzdrQUFJQVZCQUtBVFFRQkFJa0VBUURGQkFHQkFRUUNBVDBFQTRGNUJBR0J1UVFEZ2EwRUFBRnhCQUNCTVFRQmdQRUVBb0N4QkFNQWNRUUFBRFVFQVFQcEFBSURhUUFEQXVrQUFBSnRBQU9CMlFBQWdPRUFBNFBNL0FHQnhQd0JnLzcwQXdKaS9BT0FLd0FCZ0RNQUFBSnEvQU9BZXZnQWdaejhBd080L0FPQTFRQURBZEVBQVFJcEFBRUNLUUFCQWlrQUFRSXBBQUVDS1FBQ0Fpa0FBUUkxQUFHQ1FRQUFBbEVBQUFKZEFBQ0NaUUFDZ21VQUFvSmxBQUtDWlFBQ2dtVUFBWUpwQUFFQ2dRQUFBckVBQWdMeEFBS0RRUUFCZzUwQUFJQUJCQUVBTlFRRGdHa0VBNENoQkFHQTNRUUFBUmtFQXdGUkJBTUJqUVFEZ2NrRUFvR2xCQU1CWlFRQUFTa0VBSURwQkFHQXFRUUNBR2tFQW9BcEJBSUQxUUFEQTFVQUFRTFpBQU9DV1FBRGdia0FBWURCQUFNRGpQd0NBVEQ4QUFLMitBTUNwdndEZ0VjQUF3QUhBQU9DR3Z3Q2d4THdBb0lJL0FLQUFRQURBUDBBQVFHSkFBS0JhUUFDZ1dVQUFvRmxBQUtCWlFBQ2dXVUFBb0ZwQUFLQmtRQUNnYjBBQUFIOUFBTUNIUUFDQWtrQUFZSjlBQUtDcFFBQkFzMEFBWUxoQUFFQzZRQUFndjBBQUlNbEFBR0RYUUFBZzZVQUF3UDFBQUVBS1FRQ0FGa0VBWUNOQkFNQXdRUUNnUGtFQXdFeEJBQ0JiUVFDZ2FVRUFZSGhCQUdCblFRQ0FWMEVBd0VkQkFPQTNRUUFBS0VFQUlCaEJBR0FJUVFBZzhVQUFvTkZBQUFDeVFBQ0Fra0FBQUdaQUFNQW1RQUJnemo4QWdDSS9BQUR4dmdCZ3VMOEFJQmJBQU1EdXZ3QWdaNzhBNEI0K0FDQ1pQd0RnQ2tBQTRDOUFBTUFtUUFBZ0cwQUFvQmxBQUtBWlFBQ2dHVUFBb0JsQUFDQWJRQURnSlVBQWdERkFBQUJCUUFEQVVrQUE0R3BBQU9DQlFBQWdrRUFBUUtCQUFBQ3dRQUJnd2tBQWdOSkFBR0RpUUFCQThrQUFvQUZCQUFBTFFRQ0FGVUVBNENCQkFBQXRRUUNnT1VFQTRFWkJBR0JVUVFCZ1lrRUFnSEJCQU9CK1FRQWdaVUVBUUZWQkFHQkZRUUNBTlVFQXdDVkJBQUFXUVFBZ0JrRUF3T3hBQUNETlFBQmdyVUFBb0kxQUFPQmJRQURBSEVBQVFMMC9BTUFFUHdEQUc3OEE0TXkvQUFBYXdBRGczNzhBQUVtL0FBQzJQZ0NBcmo4QUFBSkFBR0R1UHdBZzBUOEFZTGcvQUVDelB3QkFzejhBUUxNL0FFQ3pQd0JndUQ4QVFNNC9BS0RuUHdCZ0EwQUF3QlpBQUFBeFFBQWdTVUFBNEdsQUFDQ0VRQUFBbGtBQVFLbEFBRUMrUUFEQTFFQUFZT3RBQUFBQlFRQkFERUVBNEJkQkFPQWpRUUJnTUVFQUlEMUJBQUJLUVFCZ1YwRUF3R1JCQUdCeVFRQWdnRUVBd0dKQkFBQlRRUUFnUTBFQVlETkJBSUFqUVFEQUUwRUE0QU5CQUFEb1FBQkF5RUFBb0toQUFDQ0pRQUNnVTBBQVFCVkFBSUN1UHdBQXRqNEFBRW0vQU9EZnZ3QUFHY0FBQU11L0FNQWJ2d0RBQkQ4QUlLby9BTUNiUHdCQWFEOEFZQ3cvQUFEeFBnQmd1RDRBWUxnK0FHQzRQZ0JndUQ0QUFQRStBSUFpUHdDQVhEOEFnSXcvQUNDNFB3REE2ejhBSUJKQUFLQXhRQUNnVWtBQUFIbEFBQUNSUUFDQXAwQUFJTDVBQU1EVVFBQmc2MEFBUUFGQkFJQU5RUUJnR2tFQUlDZEJBRUEwUVFDQVFVRUFBRTlCQU1CY1FRREFha0VBQUhsQkFLQmdRUURBVUVFQTRFQkJBQ0F4UVFCQUlVRUFZQkZCQUlBQlFRQ0E0MEFBQU1SQUFJQ2tRQUFBaFVBQVFFdEFBR0FNUUFBQW1qOEE0QjQrQUNCbnZ3REE3cjhBZ0JYQUFDQzF2d0NBMkw0QVFDRS9BT0E1UHdDZ2lUNEF3Tmk5QUNEV3ZnQ0FJcjhBZ0V5L0FNQk12d0RBVEw4QWdFeS9BSUFpdndBQThiNEFBRXErQU1EWVBRQkFERDhBZ0c4L0FJQzNQd0FBOUQ4QTRCOUFBS0JIUUFDQWRFQUE0SkJBQUlDblFBQWd2a0FBWU5WQUFFRHVRQURnQTBFQXdCQkJBQUFlUVFCZ0swRUFBRGxCQUFCSFFRQkFWVUVBZ0dOQkFPQnhRUUJBWGtFQWdFNUJBS0ErUVFEQUxrRUFBQjlCQUNBUFFRREEva0FBSU45QUFLQy9RQUFBb0VBQVlJQkFBRUJCUUFEQUFVQUE0SVkvQUtERVBBQ2dncjhBb0FEQUFNQVB3QUNncEw4QTRKYStBR0NZUGdBZ2hMNEFvRHEvQUFDTXZ3QkFzTDhBWU15L0FNRGp2d0JnNXI4QVlPYS9BTURqdndCQXpyOEFBTGUvQU9DWHZ3QUFaTDhBZ1BLK0FFRFBQQURBREQ4QXdJNC9BT0RhUHdBQUdrQUFRRWRBQUlCMFFBRGdrRUFBUUtoQUFJREJRQUFBMjBBQUlQVkFBT0FIUVFCZ0ZVRUFRQ05CQUlBeFFRREFQMEVBSUU1QkFHQmNRUURBYWtFQUFGeEJBQ0JNUVFCZ1BFRUFvQ3hCQU1BY1FRQUFEVUVBUVBwQUFJRGFRQURBdWtBQUFKdEFBT0IyUUFBZ09FQUE0UE0vQUdCeFB3QmcvNzBBd0ppL0FPQUt3QUJnRHNBQW9KKy9BQURLdmdBQUZiOEFnSkMvQU1ET3Z3QkEvNzhBZ0FuQUFNQU93QUNBRThBQWdCVEFBSUFVd0FDZ0ZjQUFRQm5BQUdBV3dBQmdDY0FBb09XL0FDQ3Z2d0NnWjc4QVlNcStBTUNZUGdEZ2ZqOEFvTmsvQUFBYVFBQkFSMEFBZ0haQUFPQ1VRQUJncmtBQW9NaEFBSURqUUFBQS8wQUF3QTFCQUFBY1FRQkFLa0VBb0RoQkFBQkhRUUNBVlVFQVFHUkJBTUJaUVFBQVNrRUFJRHBCQUdBcVFRQ0FHa0VBb0FwQkFJRDFRQURBMVVBQVFMWkFBT0NXUUFEZ2JrQUFZREJBQU1EalB3Q0FURDhBQUsyK0FNQ3B2d0RBRXNBQUlDSEFBRURjdndBQW9MOEFRTGkvQUlEeHZ3Qmc5NzhBSU5hL0FFQzl2d0JBczc4QVFMTy9BRUN6dndCQXM3OEFRTDIvQUdEY3Z3QUFBc0FBUUJuQUFBQWl3QURBRDhBQVFPTy9BQUNZdndDZ0ViOEFvSUkrQU9CK1B3REEyVDhBSUIxQUFFQlFRQURBZ1VBQVlKeEFBS0MzUUFEZzAwQUFnUEJBQUlBR1FRRGdGRUVBUUNOQkFNQXhRUUNnUUVFQWdFOUJBRUJlUVFDQVYwRUF3RWRCQU9BM1FRQUFLRUVBSUJoQkFHQUlRUUFnOFVBQW9ORkFBQUN5UUFDQWtrQUFBR1pBQU1BbVFBQmd6ajhBZ0NJL0FBRHh2Z0JndUw4QUlCdkFBS0JCd0FCZ0ljQUF3QW5BQUNEMnZ3Qmd3NzhBWUlxL0FBQTR2d0RBQkw4QVlMaStBR0M0dmdCZ3VMNEFZTGkrQU1BRXZ3Q2dSNzhBSUkyL0FHRER2d0FBL2I4QXdCL0FBTUFod0FDQS9MOEFnS08vQUtBUnZ3QUFoVDRBZ0lrL0FBRHVQd0RnS2tBQW9HQkFBR0NNUUFEZ3FFQUFnTVZBQUNEaVFBQUEvMEFBSUE1QkFBQWRRUURBSzBFQW9EcEJBSUJKUVFDZ1dFRUFRRlZCQUdCRlFRQ0FOVUVBd0NWQkFBQVdRUUFnQmtFQXdPeEFBQ0ROUUFCZ3JVQUFvSTFBQU9CYlFBREFIRUFBUUwwL0FNQUVQd0RBRzc4QTRNeS9BSUFsd0FBQVNzQUFBQ1BBQUNEc3Z3RGduYjhBZ0NlL0FPQVl2Z0Fnb2o0QWdCay9BQUJKUHdEQVREOEF3RXcvQUFCSlB3QkFFejhBSUhzK0FPQVl2Z0RBSkw4QUFKTy9BTURldndDZ0djQUFBQ2ZBQU1EOXZ3RGduYjhBWU5xK0FBRHpQZ0NncFQ4QXdBbEFBTUJDUUFBQWZFQUFvSnBBQUlDM1FBRGcxRUFBb1BKQUFDQUlRUUFBRjBFQUFDWkJBQ0ExUVFCZ1JFRUFvRk5CQUFCVFFRQWdRMEVBWUROQkFJQWpRUURBRTBFQTRBTkJBQURvUUFCQXlFQUFvS2hBQUNDSlFBQ2dVMEFBUUJWQUFJQ3VQd0FBdGo0QUFFbS9BT0RmdndCQUhzQUF3QjdBQU1EcnZ3QmdrYjhBWU51K0FHQ0NQZ0RnVUQ4QWdLQS9BR0RIUHdEZzN6OEFZT1kvQUdEbVB3RGczejhBb01JL0FLQ2JQd0RnVUQ4QUlMQStBTUN5dmdEZ2ZyOEF3Tm0vQU1BY3dBQkFKY0FBb09tL0FNQ0N2d0FnRkw0QTRGQS9BQ0RhUHdCQUprQUFRR0JBQU1DTlFBQ0FxMEFBQU1sQUFPRG1RQUNnQWtFQXdCRkJBQUFoUVFCZ01FRUF3RDlCQUVCUFFRRGdVRUVBQUVGQkFDQXhRUUJBSVVFQVlCRkJBSUFCUVFDQTQwQUFBTVJBQUlDa1FBQUFoVUFBUUV0QUFHQU1RQUFBbWo4QTRCNCtBQ0JsdndBQXc3OEF3TXkvQUNETHZ3QmdrYjhBSU5XK0FDRFZQZ0NBaVQ4QUlOVS9BS0FKUUFDQUlVQUFJQzVBQUVBelFBQkFNMEFBSUM1QUFFQWVRQURnQ0VBQTROay9BQUNUUHdEZ0RqOEFBSVcrQUlDSnZ3QUE3cjhBQUNuQUFBQVp3QUJBdzc4QXdDUy9BQUMzUGdEQXBEOEFvQTFBQUtCSVFBRGdnVUFBQUtCQUFHQytRQURnM0VBQW9QdEFBRUFOUVFEZ0hFRUFZQ3hCQU9BN1FRQmdTMEVBSUZCQkFDQkFRUUFnTUVFQUlDQkJBQ0FRUVFBZ0FFRUFRT0JBQUdEQVFBQmdvRUFBZ0lCQUFFQkJRQURnQVVBQWdJYy9BTUNPUFFCZ0ViOEFvQm0vQUtBWnZ3Q2dHYjhBZ01hK0FDRFZQZ0Jna1Q4QVlPcy9BQ0FkUUFBQVFrQUFBRjVBQUtCc1FBQkFjMEFBUUhOQUFJQnNRQURnV2tBQXdFSkFBR0FpUUFEQStEOEE0SjAvQUdEYVBnQmc5TDRBZ0t5L0FHQVB3QUJBTDhBQVFQcS9BQ0NFdndCZ2NyMEFnR3MvQUFEc1B3Q0FNa0FBd0c5QUFNQ1dRQURBdFVBQXdOUkFBT0R6UUFCZ0NVRUE0QmhCQUlBb1FRQUFPRUVBb0VkQkFJQlFRUUNBUUVFQWdEQkJBS0FnUVFDZ0VFRUF3QUJCQUtEaFFBRGd3VUFBUUtKQUFPQ0NRQUNBUjBBQUFBdEFBRUNuUHdCQU1EOEFvQmsvQUtBWlB3Q2dHVDhBb0JrL0FBQWpQd0Nna1Q4QXdPcy9BQUFqUUFDQVQwQUFZSFpBQUVDTVFBQ2dsVUFBb0psQUFLQ1pRQUFnbFVBQWdJdEFBS0I2UUFEZ1ZFQUFZQ2RBQUlEcFB3REFmVDhBUUY4OUFLQm52d0NnNWI4QVFDbkFBS0FVd0FCQXM3OEF3TzYrQUVBZ1B3REF5RDhBSUNKQUFDQmdRQUFBajBBQUFLNUFBQ0ROUUFCQTdFQUF3QVZCQUlBVlFRQkFKVUVBSURWQkFPQkVRUUFBVWtFQVFFSkJBR0F5UVFDZ0lrRUE0QkpCQUVBRFFRQ0E1MEFBb01oQUFFQ3FRQUNnakVBQW9HQkFBQUF0UUFCQUFVQUFRTkUvQU1ETVB3REF6RDhBd013L0FNRE1Qd0Jnemo4QVFQUS9BQ0FqUUFCQVVFQUFnSDFBQUlDVVFBQ2dwMEFBd0xSQUFHQzVRQUJndVVBQUFMUkFBS0NvUUFBQWwwQUFRSUJBQU9CTVFBQUFGVUFBNExjL0FFQU1Qd0NBOHI0QWdMTy9BR0FXd0FEQUpzQUF3TlcvQUtBMnZ3QWd1VDRBSUtvL0FPQVNRQUFnVVVBQUlJaEFBTUNuUUFDQXgwQUFRT2RBQUlBRFFRQkFFMEVBSUNOQkFPQXlRUURBUWtFQXdGTkJBTUJFUVFDZ05VRUFRQ1pCQU9BV1FRREFCMEVBWVBGQUFDRFVRQUNndDBBQWdKeEFBS0NEUUFEQVdrQUFJRGhBQU1BblFBQmdKa0FBWUNaQUFHQW1RQUJnSmtBQTRDWkFBRUF6UUFEQVVrQUFnSDFBQUdDVlFBQUFyRUFBWU1GQUFLRFNRQUJBMlVBQVFObEFBR0RTUUFDZ3cwQUF3S3hBQU9DUlFBRGdha0FBQURGQUFNRHJQd0RBWmo4QWdCSytBS0NSdndDQUJzQUFJQzdBQU9EenZ3QmdjYjhBWVA4OUFNQ1lQd0RnQ2tBQVlFbEFBQUNFUUFCZ28wQUE0TUpBQUlEaVFBQWdBVUVBQUJGQkFPQWdRUURBTUVFQXdFQkJBQ0JPUVFEZ1AwRUE0REZCQUVBa1FRRGdGa0VBd0FsQkFLRDVRQUJBNEVBQTRNZEFBS0N3UUFCZ21rQUFRSWRBQUlCelFBQmdaMEFBWUdaQUFHQm1RQUJnWmtBQVlHWkFBTUJtUUFEQWIwQUFJSVJBQUVDV1FBQUFyRUFBb01KQUFFRFpRQUFBN2tBQTRQaEFBT0Q0UUFCZzcwQUE0TmhBQU9DOFFBQmduMEFBQUlGQUFFQkVRQUJnQmtBQUlKRS9BR0RtUFFCZ2NiOEE0UE8vQUtBc3dBREFBY0FBNElhL0FLREV2QUNnZ2o4QW9BQkFBR0JBUUFBZ2dFQUFJS0JBQUNEQVFBQWc0RUFBQUFCQkFBQVFRUUFBSUVFQUFEQkJBQUJBUVFEQVIwRUE0RGhCQUdBcVFRQWdIRUVBUUE1QkFNQUFRUUFnNkVBQVlOQkFBQ0M3UUFCZ3FVQUFBSnhBQU1DU1FBREFqVUFBb0l0QUFJQ0xRQUNBaTBBQWdJdEFBSUNMUUFDZ2pFQUFnSkpBQUlDZVFBRGdya0FBSU1OQUFFRFpRQURnNzBBQVFBTkJBT0FMUVFEZ0MwRUE0QUZCQUtEbFFBQ0F4a0FBUUtkQUFPQ0hRQUFnVVVBQXdCSkFBTUNwUHdBQXJUNEF3RXkvQUdEbXZ3Q0FMY0FBUUF6QUFLQ1p2d0RBOWIwQUFJQS9BQUFBUUFBQVFFQUFBSUJBQUFDZ1FBQUF3RUFBQU9CQUFBQUFRUUFBRUVFQUFDQkJBQUF3UVFBQVFFRUFZRUpCQUNBelFRQWdKRUVBUUJWQkFLQUdRUURBOEVBQVFOVkFBQ0M3UUFBZ28wQUFZSTVBQU1COFFBQkFha0FBWUdaQUFHQm1RQUJnWmtBQVlHWkFBR0JtUUFDQVprQUF3R3hBQUNDQlFBQkFra0FBd0tkQUFFREFRQUNnMmtBQVlQWkFBQ0FKUVFCZ0ZrRUFJQlZCQUtBRlFRQ2c2MEFBQU14QUFFQ3NRQUNnakVBQW9GbEFBS0FaUUFCQXN6OEFZTGcrQU1CTXZ3Qmc1cjhBSUM3QUFNQU13QUNnbWI4QXdQVzlBQUNBUHdBQUFFQUFBRUJBQUFDQVFBQUFvRUFBQU1CQUFBRGdRQUFBQUVFQUFCQkJBQUFnUVFBQU1FRUFBRUJCQUVBK1FRQ2dMa0VBUUI5QkFPQVBRUUNnQUVFQUlPTkFBTURGUUFCZ3FVQUFZSTVBQUFCc1FBQkFSRUFBd0N0QUFHQW1RQUJnSmtBQVlDWkFBR0FtUUFCZ0prQUFnQ1pBQUFBdlFBQkFTMEFBUUhWQUFLQ1RRQURncmtBQW9NdEFBQ0RwUUFDZ0EwRUE0QkpCQUNBV1FRQmdCa0VBd094QUFNRE1RQURBckVBQXdJeEFBS0JaUUFDZ0dVQUFRTE0vQUdDNFBnREFUTDhBWU9hL0FBQXV3QURBRE1BQW9KbS9BTUQxdlFBQWdEOEFBQUJBQUFCQVFBQUFnRUFBQUtCQUFBREFRQUFBNEVBQUFBQkJBQUFRUVFBQUlFRUFBREJCQUFCQVFRQmdPMEVBb0N0QkFNQWJRUUFBREVFQXdQaEFBSURaUUFDZ3VrQUFJSnhBQU1COFFBQkFSRUFBQUJKQUFNRGRQd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQUNETlB3RGc1ejhBUUJ0QUFDQlBRQUJBaEVBQUlLSkFBTURBUUFDZzMwQUFBUDVBQUVBTlFRREFEMEVBWUFSQkFLRHBRQUJBeWtBQXdLcEFBRUNMUUFEQVYwQUE0QmhBQUNDelB3Qmd1RDRBd0V5L0FHRG12d0FnS3NBQXdBUEFBQUNNdndDZ2tMMEFnSUEvQUNBQVFBQWdRRUFBQUlCQUFBQ2dRQUFBd0VBQUFPQkFBQUFBUVFBQUVFRUFBQ0JCQUFBd1FRQUFRRUVBNERsQkFPQXBRUUFBR2tFQUFBcEJBQ0QwUUFCQTFFQUFnTFJBQU1DVVFBQkFha0FBd0N0QUFNRGRQd0FnWlQ4QW9Cay9BS0FaUHdDZ0dUOEFvQmsvQUtBWlB3REFHejhBSUlVL0FLRDFQd0RnTjBBQW9IVkFBR0NaUUFCQXQwQUF3TlJBQUFEeFFBRGdBRUVBd0FCQkFBRDVRQUJnNEVBQXdNSkFBR0NrUUFCZ2hVQUFRRXhBQU9BTlFBQ2duejhBb0h3K0FLQlR2d0RnNTc4QVlDZkFBTUQ0dndBZ2VyOEFBUE05QU1DVlB3REFDRUFBSUVkQUFPQ0NRQUJBb2tBQTRNRkFBS0RoUUFEQUFFRUFvQkJCQUtBZ1FRQ0FNRUVBZ0VCQkFNQTVRUURBS1VFQXdCbEJBT0FKUVFEQTgwQUF3Tk5BQU9DelFBQUFsRUFBZ0doQUFHQXBRQUFBMWo4QW9EWS9BRUNNdmdEQUY3OEFvQm0vQUtBWnZ3Q2dHYjhBWUp1K0FLQTJQd0RBMHo4QVFDVkFBQ0JnUUFDZ2pVQUFJS3BBQUFERlFBREEya0FBZ09KQUFLRGhRQUJBM0VBQW9NMUFBSUMxUUFDZ21VQUF3SGRBQUFBOFFBREEvejhBZ0lZL0FLREVQQUJBZ3I4QUFQNi9BS0Fqd0FCZzI3OEFRRUsvQU9DV1BnQ2dwRDhBUUJCQUFFQlBRQUJBaDBBQUlLZEFBTURHUUFCZzVrQUFBQU5CQU9BU1FRQ2dJa0VBWURKQkFFQkNRUUFBTzBFQUlDdEJBRUFiUVFDQUMwRUFnUGRBQUNEWVFBRGd1RUFBNEpsQUFLQjFRQURnTjBBQUlQUS9BSUJ5UHdCQW1yMEE0SWUvQUdESHZ3REF6TDhBb0xxL0FDQXJ2d0FBdHo0QXdLUS9BS0FOUUFEQVJrQUFZSHhBQUlDWVFBQmdyMEFBWUwxQUFPRENRQURnd1VBQVlMMUFBRUN6UUFBQW9VQUFRSWxBQUVCZVFBQkFKVUFBQU5RL0FBQTlQd0JnaXI0QXdKNi9BSUFNd0FCQUdjQUF3THUvQU1BRXZ3QkFFejhBd01JL0FFQWZRQURnWEVBQVlJMUFBSUNzUUFDZ3kwQUE0T3BBQUNBRlFRQUFGVUVBd0NSQkFLQTBRUUNBUkVFQW9EMUJBQUF1UVFCZ0hrRUE0QTVCQUtEK1FBQ2czMEFBb01CQUFLQ2hRQUNnZ2tBQWdFZEFBQ0FLUUFEQW16OEFJSHMrQU1CUHZ3QUE0TDhBSUJ2QUFFRDZ2d0FnaEw4QVlISzlBQUJtUHdEQTNUOEE0Q05BQUtCWFFBQ2dna0FBWUpSQUFFQ2VRQUJnbzBBQVFLSkFBQ0NlUUFEZ2xVQUF3SWRBQUFCcFFBQWdPVUFBZ0FaQUFBQ2hQd0JBdGo0QUlDdS9BT0RLdndBQUhjQUFJQWJBQUdDVHZ3QUFQNzRBQUZrL0FNRGpQd0RnTGtBQWdHeEFBQ0NWUUFCQXRFQUFRTk5BQUVEeVFBQ2dDRUVBSUJoQkFNQW5RUUJnTjBFQUFFZEJBRUJCUVFEQU1VRUFRQ0pCQU1BU1FRQkFBMEVBZ09kQUFLRElRQUFncWtBQW9JdEFBTUJaUUFBQUhFQUF3TDAvQUlBTlB3Q0E4cjRBUUxPL0FFQVV3QUNnRk1BQUFMaS9BQUFWdndEQXNqNEFvSmMvQUlEOFB3Q2dLMEFBd0ZGQUFHQnVRQURBZlVBQUFJUkFBT0NDUUFDQWZVQUE0RzVBQUFCWlFBQ2dOa0FBQUJCQUFDREJQd0NBT0Q4QW9DNitBR0NLdndCZy9MOEFZQjdBQUNEYXZ3QmdVTDhBQUQ4K0FHQ1RQd0JBQmtBQW9FSkFBR0IvUUFBQW5rQUFZTHhBQUNEYlFBQUEra0FBZ0F4QkFBQWNRUUNnSzBFQUlEdEJBS0JLUVFBZ1JVRUFvRFZCQUVBbVFRRGdGa0VBb0FkQkFJRHdRQUNnMFVBQXdMSkFBQUNVUUFBQWJFQUFBREZBQU1EclB3Q0FhejhBUUYrOUFDQit2d0FBOGI4QUlDUEFBT0Q1dndDQWtMOEF3SmkrQUtBUlB3QmdvejhBNFBJL0FLQWFRQUNBTVVBQUFEOUFBR0JKUUFBZ1IwQUFvRDVBQUlBeFFBQWdIa0FBQUFOQUFFQzdQd0NnV2o4QUlJbzlBQ0JOdndDQXlyOEF3QmZBQUdBSHdBQUFvYjhBUUxhK0FNQWtQd0Jnd3o4QWdCdEFBQUJYUUFEQWlVQUFJS2hBQUdER1FBREE1RUFBZ0FGQkFNQVFRUUFnSUVFQWdDOUJBQUEvUVFDQVRrRUFZRWxCQUNBNlFRREFLa0VBUUJ0QkFPQUxRUUFnK1VBQTROcEFBRUM5UUFDZ24wQUE0SUZBQU9CSVFBQmdEMEFBZ0t3L0FLRHBQZ0JBREw4QWdMZS9BQUFTd0FDZ0hjQUE0TnEvQU9CK3Z3Q2dncjRBZ0FZL0FLQ0lQd0Nnd1Q4QW9PYy9BRUFBUUFEZ0NrQUF3QWhBQUlEL1B3Q2c1ejhBd01NL0FNQ1ZQd0RnTHo4QVFNODhBR0EzdndDZ3RiOEE0QXJBQUlBVndBQ2d5TDhBZ0VDL0FLQXVQZ0JnaWo4QVlQdy9BR0EzUUFDQWNFQUFJSlZBQUlDeVFBQ2cwRUFBNE81QUFLQUdRUURBRlVFQUFDVkJBQ0EwUVFCZ1EwRUFvRkpCQU1CTlFRQmdQa0VBSUM5QkFBQWdRUUFBRVVFQVFBSkJBTURtUUFBZ3lVQUE0S3RBQUNDUFFBQWdaVUFBNEN0QUFLRGxQd0NnWno4QVFNKzhBQUJxdndBQTJyOEFZQjNBQUVBWndBQ2cyYjhBUUlDL0FLRFF2Z0RnR0Q0QUFCby9BSUJjUHdDZ2dqOEF3SmcvQU1DVlB3Q0FnRDhBZ0Z3L0FBQWFQd0FnY0Q0QUlJUytBQUJYdndBQXQ3OEFvQWZBQUtBWXdBRGcycjhBNEh5L0FNQXB2Z0NBUUQ4QW9NZy9BQUFiUUFBQVZFQUFvSVpBQUVDalFBREF2MEFBZ054QUFNRDVRQURBQzBFQTRCcEJBQUFxUVFCQU9VRUFZRWhCQUtCWFFRQ2dVa0VBb0VOQkFNQTBRUURnSlVFQUFCZEJBRUFJUVFCZzgwQUF3TlpBQUNDNlFBQ0FuVUFBNElCQUFJQklRQURBRDBBQWdMTS9BT0FYUHdEQW1MNEFnSTYvQU1EcnZ3QmdIY0FBWUJqQUFPRGt2d0NBb2I4QUlGRy9BQUR4dmdCZ1M3NEFvTVM4QU1EMVBRQUE4ejBBb0pDOUFHQkx2Z0FBOGI0QW9FZS9BTUNWdndBQTBiOEF3QXpBQUlBVHdBREEzcjhBSUk2L0FNQ1l2Z0NnRVQ4QUFLYy9BSUFIUUFDZ1BFQUFJSEpBQUFDVlFBQ0FzVUFBSU01QUFNRHFRQUNnQTBFQUFCSkJBS0FnUVFCZ0wwRUFZRDVCQUlCTlFRQ2dYRUVBWUZoQkFJQkpRUUNnT2tFQUFDeEJBSUFkUVFBZ0QwRUE0QUJCQUFEbFFBQmd5RUFBd0t0QUFFQ1BRQUJBWjBBQUFESkFBS0Q5UHdBQW1EOEFJTlUrQUNEVnZnQ0FqcjhBQU5xL0FJQVJ3QUFnSGNBQW9BbkFBQ0RkdndBQXQ3OEF3SnUvQU9DR3Z3QUFnTDhBQUlDL0FBQ012d0RBbTc4QUFMZS9BQURjdndEZ0E4QUE0QlBBQUtBSXdBQmd5cjhBNEh5L0FNQ3l2Z0FnMVQ0QUFKZy9BSUQ4UHdBQUxVQUFJR0JBQUtDS1FBQkFwVUFBWU1CQUFJRGNRQUFBK1VBQTRBcEJBQ0FaUVFDQUowRUF3RFZCQUVCRVFRQUFVMEVBNEdGQkFHQmVRUUNnVDBFQVFFRkJBT0F5UVFDZ0pFRUFRQlpCQUFBSVFRQmc4MEFBd05aQUFNQzZRQURnbjBBQWdJVkFBQUJZUUFEZ0pFQUF3T3MvQUdDUlB3QWcxVDRBd0ppK0FBQnF2d0NBdDc4QVlQQy9BR0FOd0FDQUZzQUE0QkxBQUVBTXdBREFBY0FBQUFEQUFBQUF3QURBQThBQVlBekFBQ0FSd0FBZ0ZNQUFJQWpBQUNEYXZ3QWdvYjhBQUV5L0FNQXB2Z0RnRGo4QVlKTS9BTURyUHdEZ0pFQUFvRmRBQUtDRFFBQ0FuRUFBQUxkQUFJRFJRQUJBN0VBQTRBTkJBQUFTUVFCQUlFRUFvQzVCQU9BOFFRQkFTMEVBb0ZsQkFBQm9RUUFBWlVFQW9GWkJBR0JJUVFBQU9rRUF3Q3RCQUdBZFFRQWdEMEVBSUFGQkFPRG1RQUJBekVBQUlMSkFBS0NZUUFEQWZrQUFRRkJBQUFBalFBREE2ejhBQUpnL0FPQVhQd0JBejd3QVFBeS9BQUIydndBZ3BMOEF3TWkvQUNEbHZ3Q2cvTDhBd0FIQUFFQU13QUJBRE1BQXdBSEFBTUQ0dndCZzI3OEFRTUsvQUtDYnZ3RGdVTDhBUUxhK0FPQVlQZ0NBT0Q4QUFLYy9BTUQ0UHdDQUkwQUFRRkJBQU1CK1FBQ0FtRUFBd0xCQUFDREpRQUJBNDBBQTRQMUFBRUFNUVFEQUdVRUFvQ2RCQU1BMVFRQWdSRUVBWUZKQkFNQmdRUUFBYjBFQUlHeEJBT0JkUVFDQVQwRUFRRUZCQU9BeVFRREFKRUVBQUJkQkFLQUpRUUNnK0VBQTRONUFBRURGUUFCZ3JFQUFZSlZBQUlCOVFBQkFVRUFBNENSQUFLRDlQd0NBc3o4QW9HYy9BS0RwUGdBQTZ6d0E0S0srQUVBZ3Z3QkFVNzhBQUgrL0FPQ0d2d0NnbWI4QW9KbS9BT0NHdndBZ2VyOEFRRUsvQUNBUnZ3QWdlNzRBNEJnK0FNQWtQd0JnaWo4QUFNUS9BS0FHUUFBQUxVQUFRRlZBQU1COVFBQmdsVUFBWUt4QUFFREZRQURnM1VBQUFQWkFBT0FIUVFBZ0ZVRUFnQ0pCQU1BdlFRQmdQVUVBWUV0QkFJQlpRUURnWjBFQUlIWkJBRUJ6UVFBQVpVRUF3RlpCQUlCSVFRQ2dPa0VBSUMxQkFNQWZRUUNnRWtFQTRBVkJBQ0R5UUFDZzJVQUFvTUpBQUFDc1FBQmdsVUFBd0g1QUFBQllRQUFBTWtBQXdBOUFBS0RsUHdBQXJqOEFBSVEvQUFBNFB3QUE4VDRBb0h3K0FNRDFQUUNneEx3QXdQVzlBTUQxdlFDZ3hMd0F3UFU5QU9DV1BnQWdFVDhBb0VjL0FDQ05Qd0Jnd3o4QVlQdy9BTUFhUUFDQU9VQUFvRjlBQUlDRFFBQkFsMEFBSUt4QUFLRENRQUNnMlVBQUlQSkFBSUFGUVFDQUVVRUFJQjVCQUdBclFRQ2dPRUVBQUVaQkFHQlRRUUFnWVVFQUlHOUJBR0I5UVFDQWVrRUFRR3hCQUdCZVFRQ2dVRUVBUUVOQkFBQTJRUUFBS1VFQVFCeEJBSUFQUVFCZ0EwRUE0TzlBQUVEWlFBQ2d3a0FBWUt4QUFLQ1lRQUNBaFVBQVFHZEFBSUJJUUFEZ0swQUFRQkpBQUFEOFB3RGcxVDhBUUxnL0FLQ2ZQd0RBbUQ4QW9JSS9BQUNBUHdBQWdEOEFvSUkvQU1DWVB3Q2dwRDhBWU1JL0FHRGNQd0FBQWtBQXdCcEFBR0EzUUFBQVZFQUF3SEJBQUVDSlFBQmduRUFBWUxCQUFDREVRQUJnMlVBQTRPOUFBR0FEUVFDQUQwRUFBQnhCQUFBb1FRQ0FORUVBZ0VGQkFPQk9RUUFnWEVFQWdHbEJBQUIzUVFCZ2drRUFBSUZCQUVCMFFRREFaa0VBZ0ZsQkFFQk1RUUJnUDBFQW9ESkJBQUFtUVFBQUdrRUFnQTVCQUVBRFFRRGc3MEFBb05sQUFFREZRQUFnc2tBQTRKOUFBRUNQUUFEZ2dFQUFZR1ZBQU1CT1FBQ2dPa0FBUUNoQUFHQWFRQUJnRGtBQTRBcEFBS0FBUUFBQUFFQUFBQUJBQUtBQVFBRGdDa0FBUUJCQUFDQWZRQURBSzBBQW9ENUFBSUJVUUFDQWNFQUFvSVpBQU9DVVFBREFvMEFBQUxaQUFDREpRQUJnM1VBQUlQRkFBRUFEUVFDQURrRUFBQnBCQUFBbVFRQ0FNa0VBb0Q1QkFBQkxRUURBVjBFQUFHVkJBR0J5UVFDZ2YwRUFnSVpCQUNDRlFRQUFmVUVBb0c5QkFLQmlRUURnVlVFQUFFbEJBSUE4UVFDZ01FRUFRQ1ZCQU9BWlFRQ0FEa0VBWUFOQkFDRHlRQURnM2tBQVFNeEFBTUM2UUFEQXEwQUFnSjFBQUNDUVFBREFoVUFBSUhkQUFDQm1RQURBV0VBQTRFMUFBR0JKUUFCZ1FFQUFBRUJBQUFCQVFBQmdRRUFBWUVsQUFFQlBRQURnWEVBQVFHcEFBRUI3UUFEZ2gwQUE0SlJBQUVDalFBQ0FzVUFBNEw5QUFPRFBRQURBNGtBQUFQWkFBQ0FGUVFBZ0QwRUE0QmxCQUVBbFFRQ2dNRUVBZ0R4QkFBQkpRUUFnVlVFQVlHRkJBQ0J1UVFCQWUwRUFRSVJCQU9DS1FRQ2dpVUVBQUlOQkFBQjVRUUJBYkVFQWdGOUJBQ0JUUVFCQVIwRUE0RHRCQUlBd1FRQkFKVUVBQUJwQkFJQVBRUURnQlVFQW9QaEFBT0RtUUFEQTFrQUFZTWhBQUNDNlFBQWdya0FBQUtSQUFDQ2FRQUFna2tBQW9JdEFBT0NHUUFBQWhFQUFJSUJBQUFDQVFBQUFnRUFBSUlCQUFBQ0VRQUJBaDBBQVlJMUFBR0NVUUFBQW5FQUFBS1pBQUtDeFFBREF2MEFBSU01QUFHRGNRQUFnNjBBQVlQeEFBTUFIUVFDQUVVRUFnQnRCQUtBbFFRQ0FNRUVBNER0QkFFQkhRUUFnVTBFQVlGOUJBTUJyUVFEZ2QwRUFRSUpCQU1DSVFRQmdqMEVBSUk1QkFNQ0hRUUJBZ1VFQTRIVkJBS0JwUVFEZ1hVRUFnRkpCQUNCSFFRRGdPMEVBb0RCQkFBQW1RUUJBSEVFQW9CSkJBS0FKUVFBZ0FVRUFZUE5BQUFEbFFBQmcxMEFBZ014QUFHRENRQURndUVBQVFMRkFBQUNyUUFEQXBrQUFZS05BQUNDZ1FBQUFvRUFBQUtCQUFDQ2dRQUJnbzBBQUlLZEFBSUNzUUFEQXMwQUFvTHBBQUdERVFBQUF6MEFBWU54QUFNRHFRQUFBK1VBQXdBTkJBSUFMUVFDQUZFRUFJQjVCQUFBb1FRQUFNa0VBUUR4QkFDQkhRUUNBVWtFQTRGMUJBS0JwUVFEZ2RVRUFJSUZCQUVDSFFRQ0FqVUVBNEpOQkFPQ1NRUUNBakVFQVFJWkJBQ0NBUVFDQWRFRUFJR2xCQU1CZFFRQ0FVa0VBUUVkQkFJQThRUUNnTWtFQUFDbEJBTUFmUVFBQUYwRUFJQTlCQUFBSVFRRGdBRUVBSVBWQUFPRHFRQURBNEVBQTROZEFBSURRUUFCQXlrQUFvTVpBQU9EQ1FBQWd3RUFBQU1CQUFBREFRQUFnd0VBQTRNSkFBQURIUUFDZ3kwQUFJTk5BQUlEWlFBREE0a0FBQU8xQUFDRDVRQUNnQTBFQTRBcEJBQUFTUVFCQUdVRUFvQ0ZCQUFBclFRQ0FORUVBZ0Q1QkFJQklRUURBVWtFQXdGMUJBQ0JwUVFDQWRFRUFJSUJCQUVDR1FRQmdqRUVBZ0pKQkFNQ1lRUURBbDBFQWdKRkJBR0NMUVFDQWhVRUF3SDlCQUdCMFFRQWdhVUVBNEYxQkFDQlRRUUFBU1VFQVlEOUJBQUEyUVFBZ0xVRUF3Q1JCQUdBZFFRQkFGa0VBWUE5QkFLQUpRUUNnQkVFQVFQOUFBT0QyUUFEZzcwQUF3T2xBQUlEbVFBQ0E0a0FBSU9CQUFBRGdRQUFBNEVBQUlPQkFBSURpUUFEQTVrQUE0T3BBQUVEeVFBREErRUFBb0FCQkFLQUZRUUFnQzBFQUFCSkJBQ0FaUVFCQUlFRUFnQ2RCQUNBdlFRRGdOMEVBWUVGQkFBQkxRUUFBVlVFQUFGOUJBR0JwUVFCZ2RFRUF3SDlCQUlDRlFRQmdpMEVBZ0pGQkFLQ1hRUURBblVFQXdKeEJBTUNXUVFEZ2tFRUFJSXRCQUlDRlFRREFmMEVBZ0hSQkFLQnBRUUNBWDBFQTRGVkJBRUJNUVFCQVEwRUFvRHBCQU9BeVFRREFLMEVBb0NSQkFDQWVRUURnR0VFQXdCTkJBT0FPUVFBQUMwRUFvQWRCQUtBRVFRQWdBMEVBSUFGQkFBQUFRUUFBQUVFQUFBQkJBQUFBUVFBZ0FVRUFRQU5CQUNBRlFRQ2dDRUVBQUF4QkFPQVBRUURBRkVFQUFCcEJBR0FnUVFDQUowRUFvQzVCQU1BMVFRQUFQVUVBSUVWQkFDQk9RUURBVjBFQVlHRkJBSUJyUVFDQWRVRUFBSUJCQUlDRlFRQWdpMEVBNEpCQkFNQ1dRUURBbkVFQTRLSkJBQUNpUVFBZ25FRUFnSlpCQU9DUVFRQWdpMEVBZ0lWQkFDQ0FRUURnZFVFQVFHeEJBS0JpUVFDQVdVRUFvRkJCQUlCSVFRQkFRVUVBQURwQkFDQXpRUUFnTFVFQUFDaEJBQUFqUVFCZ0hrRUFnQnBCQUdBWFFRQ0FGRUVBQUJOQkFBQVJRUUFBRUVFQUFCQkJBQUFRUVFBQUVFRUFBQkZCQUNBVFFRQUFGVUVBSUJoQkFNQWJRUUJBSDBFQUFDUkJBQUFwUVFEZ0xrRUF3RFZCQU9BOFFRQWdSRUVBUUV0QkFNQlNRUUJBVzBFQWdHUkJBQ0J1UVFEZ2QwRUFBSUZCQUFDR1FRQkFpMEVBNEpCQkFJQ1dRUUFnbkVFQUFLSkJBQUNvUVFDQXAwRUF3S0ZCQUNDY1FRQ0Fsa0VBNEpCQkFHQ0xRUUJBaGtFQVFJRkJBQUI1UVFDZ2IwRUF3R1pCQUdCZVFRREFWa0VBZ0U5QkFHQklRUURBUVVFQVFEeEJBQ0EzUVFBZ01rRUE0QzFCQUNBcVFRQUFKMEVBWUNSQkFPQWlRUURnSUVFQUFDQkJBQUFnUVFBQUlFRUFBQ0JCQU9BZ1FRQUFJMEVBd0NSQkFNQW5RUUJnSzBFQW9DNUJBQ0F6UVFCQU9FRUFvRDFCQUNCRVFRQkFTMEVBWUZKQkFJQlpRUURBWUVFQXdHaEJBSUJ4UVFEZ2VrRUFRSUpCQUVDSFFRQkFqRUVBUUpGQkFLQ1dRUUFnbkVFQXdLRkJBSUNuUVFCQXJVRUFJSzFCQUlDblFRREFvVUVBSUp4QkFNQ1dRUUNBa1VFQWdJeEJBTUNIUVFBQWcwRUFBSDFCQUVCMFFRQkFiRUVBQUdWQkFPQmRRUURnVmtFQW9GQkJBR0JMUVFCZ1JrRUFnRUZCQUdBOVFRRGdPVUVBb0RaQkFFQTBRUURBTWtFQXdEQkJBQUF3UVFBQU1FRUFBREJCQUFBd1FRREFNRUVBNERKQkFLQTBRUUJnTjBFQUFEdEJBRUErUVFCZ1FrRUFZRWRCQUlCTVFRQ2dVa0VBZ0ZsQkFNQmdRUURnWjBFQUFHOUJBSUIyUVFEQWZrRUE0SU5CQUtDSVFRQ0FqVUVBZ0pKQkFJQ1hRUUNBbkVFQTRLRkJBSUNuUVFBZ3JVRUF3TEpCQU1DeVFRQWdyVUVBZ0tkQkFBQ2lRUURBbkVFQXdKZEJBT0NTUVFBZ2prRUFvSWxCQUNDRlFRQUFnVUVBZ0hwQkFFQnpRUUFnYkVFQWdHVkJBTUJmUVFDZ1drRUFnRlZCQU9CUVFRRGdURUVBZ0VsQkFHQkdRUUJBUkVFQW9FSkJBTUJBUVFBQVFFRUFBRUJCQUFCQVFRQUFRRUVBd0VCQkFLQkNRUUNBUkVFQUFFZEJBS0JLUVFEZ1RVRUF3RkZCQUlCV1FRQ2dXMEVBUUdGQkFPQm5RUUFBYjBFQUlIWkJBRUI5UVFCQWdrRUFRSVpCQUlDS1FRQWdqMEVBNEpOQkFNQ1lRUURBblVFQXdLSkJBT0NuUVFCQXJVRUF3TEpCQUdDNFFkY1hhcnowUGdhQk5UL1hGeWxjRHoyQXduVzhxak13TVRjeU56UTNNakdVMkJjQWdQNDlBR0NSUGdEQUdUNEE0S0kreUR2M1k1TFhGallBQUFCSEFBQUF5RHZvRndCZ3QwRUFvTEZCQUFDc1FRQmdwa0VBd0tCQkFHQ2JRUUJBbGtFQVFKRkJBRUNNUVFCZ2gwRUFBSU5CQUtCOVFRQmdkVUVBb0cxQkFHQm1RUUJBWDBFQWdGaEJBS0JTUVFEQVRVRUFZRWxCQUVCRlFRQUFRa0VBQUQ5QkFPQThRUUNnT2tFQW9EbEJBS0E1UVFDZ09VRUFvRGxCQUtBNlFRREFQRUVBb0Q1QkFHQkJRUUFnUlVFQUFFbEJBSUJOUVFDZ1VrRUFnRmhCQUVCZlFRQmdaa0VBb0cxQkFBQjFRUUFnZlVFQTRJSkJBR0NIUVFBZ2pFRUFBSkZCQUFDV1FRQkFtMEVBb0tCQkFHQ21RUUFBckVFQW9MRkJBRUMzUVFBZ3NrRUFJS3hCQUdDbVFRQ2dvRUVBQUp0QkFHQ1ZRUUFBa0VFQUFJdEJBQUNHUVFBQWdVRUFvSGhCQU9CdlFRQ2daMEVBZ0Y5QkFDQllRUUFBVVVFQTRFbEJBS0JEUVFCZ1BrRUFJRHBCQUtBMVFRQkFNa0VBUUM5QkFBQXRRUURBS2tFQW9DbEJBS0FwUVFDZ0tVRUFvQ2xCQU1BcVFRRGdMRUVBd0M1QkFNQXhRUUNnTlVFQW9EbEJBRUErUVFDZ1EwRUE0RWxCQUFCUlFRQWdXRUVBUUY5QkFDQm5RUUNnYjBFQW9IaEJBQUNCUVFEQWhVRUF3SXBCQU9DUFFRQmdsVUVBQUp0QkFLQ2dRUUJncGtFQUFLeEJBT0N4UVFEZ3JFRUF3S1pCQU9DZ1FRQUFtMEVBWUpWQkFNQ1BRUUFnaWtFQXdJUkJBR0IvUVFDQWRVRUFvR3RCQUdCaVFRRGdXVUVBd0ZGQkFPQkpRUUNnUWtFQWdEdEJBTUEwUVFBZ0wwRUF3Q3BCQUVBbVFRQ2dJa0VBZ0I5QkFFQWRRUURnR2tFQXdCbEJBS0FaUVFDZ0dVRUF3QmxCQU9BYVFRQUFIVUVBQUI5QkFFQWlRUUFnSmtFQUlDcEJBQ0F2UVFEQU5FRUFnRHRCQUtCQ1FRREFTVUVBUUZGQkFJQlpRUUJnWWtFQW9HdEJBQ0IxUVFEZ2ZrRUFvSVJCQUNDS1FRQ2dqMEVBWUpWQkFBQ2JRUUNnb0VFQWdLWkJBSUNzUVFBQXFFRUFvS0ZCQUlDYlFRQ0FsVUVBd0k5QkFBQ0tRUUJnaEVFQW9IMUJBQUJ6UVFBQWFVRUFBRjlCQUVCVlFRQkFURUVBQUVSQkFNQTdRUUJnTkVFQUlDMUJBQ0FtUVFBQUlFRUFRQnRCQU9BV1FRRGdFa0VBd0E5QkFHQU5RUUFBQzBFQXdBbEJBS0FKUVFDZ0NVRUF3QWxCQUFBTFFRQWdEVUVBSUE5QkFNQVNRUUNnRmtFQTRCcEJBQUFnUVFBZ0prRUFJQzFCQUdBMFFRQ0FPMEVBWUVOQkFDQk1RUUJBVlVFQXdGNUJBR0JvUVFDZ2NrRUFnSDFCQUdDRVFRQUFpa0VBb0k5QkFHQ1ZRUUJBbTBFQVFLRkJBR0NuUVFBQW8wRUF3SnhCQUlDV1FRQkFrRUVBUUlwQkFHQ0VRUUJnZlVFQUlISkJBQUJuUVFDQVhFRUFnRkpCQUlCSVFRRGdQa0VBUURaQkFBQXVRUUFnSmtFQTRCNUJBTUFYUVFBZ0VVRUE0QXRCQUtBSFFRQkFBMEVBSUFCQkFBRDdRQUJnOWtBQVlQTkFBRUR6UUFCQTgwQUFZUE5BQUdEMlFBQ0Era0FBQVA5QUFFQURRUUFnQjBFQW9BdEJBQ0FSUVFEQUYwRUE0QjVCQUFBbVFRQ0FMVUVBQURaQkFPQStRUUJnU0VFQUFGSkJBQ0JjUVFEZ1prRUFJSEpCQUdCOVFRQmdoRUVBSUlwQkFPQ1BRUUFBbGtFQVFKeEJBS0NpUVFBZ25rRUF3SmRCQUlDUlFRQkFpMEVBQUlWQkFPQjlRUUFnY2tFQXdHWkJBSUJiUVFCZ1VFRUFBRVpCQUFBOFFRQUFNa0VBd0NoQkFHQWdRUUFnR0VFQWdCQkJBR0FKUVFCZ0FrRUFJUGxBQUlEd1FBQ0E1MEFBNE9CQUFFRGJRQURnMWtBQWdOTkFBRURUUUFCQTAwQUFnTk5BQU9EV1FBQ2cya0FBd045QUFHRG5RQUJBNzBBQUFQbEFBR0FDUVFCZ0NVRUFnQkJCQU1BWFFRRGdIMEVBb0NoQkFBQXlRUUNnTzBFQWdFVkJBRUJRUVFDQVcwRUF3R1pCQUNCeVFRQ0FmVUVBb0lSQkFNQ0tRUUFBa1VFQVlKZEJBQUNlUVFDQW1VRUFBSk5CQUlDTVFRQkFoa0VBQUlCQkFHQnpRUUJBWjBFQWdGdEJBQ0JRUVFEZ1JFRUE0RGxCQUlBdlFRQ0FKVUVBb0J0QkFLQVNRUUJnQ2tFQVlBSkJBQ0QyUUFEZzUwQUE0TnBBQUtEUlFBQ2d5RUFBZ01GQUFLQzdRQUJndDBBQWdMTkFBRUN6UUFCQXMwQUFnTE5BQUdDM1FBREF1a0FBb01CQUFHRElRQUNnMEVBQTROcEFBT0RuUUFBZzlrQUFRQUpCQU9BSlFRQ0FFa0VBb0J0QkFDQWxRUUFBTDBFQW9EbEJBT0JFUVFBZ1VFRUFnRnRCQU9CbVFRQ2dja0VBNEg1QkFNQ0ZRUUJBakVFQTRKSkJBRUNaUVFBZ2xVRUFnSTVCQU9DSFFRQkFnVUVBNEhWQkFJQnBRUUFBWFVFQW9GQkJBT0JFUVFDQU9VRUFRQzVCQUVBalFRQUFHVUVBQUE5QkFFQUZRUUJnK1VBQTRPaEFBS0RaUUFCQXkwQUFRTDFBQU1DeVFBQWdxa0FBUUtKQUFBQ2NRQURnbDBBQW9KTkFBRUNUUUFCQWswQUFvSk5BQU9DWFFBQUFtMEFBb0tGQUFHQ3BRQUFnc2tBQVFMMUFBRURMUUFDQTJVQUFJT2hBQUtENFFBQkFCVUVBd0E1QkFJQVlRUUFBSTBFQVFDNUJBSUE1UVFEZ1JFRUFRRkJCQUNCY1FRQmdhRUVBUUhWQkFDQ0JRUUNnaDBFQUlJNUJBS0NVUVFEQWtFRUFBSXBCQUdDRFFRQmdlVUVBUUd4QkFJQmZRUUFBVTBFQWdFWkJBQ0E2UVFCQUxrRUE0Q0pCQUtBWFFRQ2dERUVBb0FKQkFDRHhRQUFnM2tBQW9NMUFBRUM5UUFDZ3JrQUFZS0JBQUFDVVFBQ2dpMEFBNElKQUFFQjVRQURnY0VBQVlHZEFBR0JtUUFCZ1prQUFZR2RBQU9Cd1FBRGdka0FBb0lKQUFHQ0tRQURnazBBQVlLQkFBS0N1UUFBQXZVQUFZTXhBQUFEZVFBRGc4RUFBQUFKQkFHQU1RUUNnRjBFQTRDSkJBRUF1UVFDZ09VRUFnRVZCQUFCU1FRRGdYa0VBQUd4QkFBQjVRUUFBZzBFQW9JbEJBR0NRUVFDQWpFRUFvSVZCQU9COVFRQ0FjRUVBUUdOQkFBQldRUUFBU1VFQWdEeEJBQUF3UVFDQUkwRUFvQmRCQUVBTVFRQUFBVUVBUU94QUFHRFlRQUFneEVBQUFMSkFBS0NoUUFBQWtrQUF3SU5BQUFCc1FBREFXVUFBZ0VkQUFNQTZRQUFnTWtBQXdDZEFBR0FtUUFCZ0prQUF3Q2RBQUFBeVFBQWdPRUFBWUVkQUFFQlhRQUFBYkVBQXdJTkFBQUNTUUFDZ29FQUFvTEZBQUFERVFBQkExMEFBb090QUFBQUJRUUJBREVFQW9CZEJBQUFqUVFBQUwwRUFvRHRCQUtCSVFRREFWVUVBb0dKQkFLQnZRUUFnZlVFQVlJVkJBR0NNUVFEQWlFRUFvSUZCQUdCMVFRREFaMEVBWUZwQkFBQk5RUURBUDBFQW9ESkJBQUFtUVFDZ0dVRUFBQTFCQUNBQlFRQmc2MEFBd05SQUFDQy9RQUNBcTBBQVlKZEFBR0NHUUFDZ2EwQUFRRTVBQU1BeFFBQUFIRUFBSUFwQUFBRDVQd0JBNWo4QVFORS9BTURNUHdEQXpEOEFRTkUvQUFEbVB3QWc5RDhBWUFsQUFFQWFRQURBTVVBQVFFNUFBT0JxUUFCZ2hVQUFRSmRBQUlDcVFBQ0F2a0FBd05SQUFHRHJRQUFBQVVFQVlBeEJBSUFZUVFCQUpVRUFZREpCQUdBL1FRQkFURUVBZ0ZsQkFDQm5RUUFBZFVFQWdJRkJBR0NJUVFBZ2hVRUE0SHRCQUtCdFFRQ0FYMEVBd0ZGQkFDQkVRUURnTmtFQWdDbEJBRUFjUVFDQUQwRUFJQU5CQUFEdFFBRGcxRUFBSUw1QUFJQ25RQUJBa2tBQVFIMUFBTUJWUUFCZ05VQUFJQlZBQUFEeFB3REF2VDhBd0pzL0FFQjdQd0JBVGo4QVlDdy9BS0FaUHdDZ0dUOEFZQ3cvQU1CTVB3Q0FjajhBNEpjL0FHQzhQd0FBOFQ4QUFCVkFBS0F5UUFDQVZVQUFvSHRBQUdDUlFBQ0FwMEFBSUw1QUFNRFVRQUNnNjBBQUFBSkJBQUFQUVFBZ0hFRUFBQ2xCQUFBMlFRQmdRMEVBUUZGQkFFQmZRUUFnYlVFQTRIcEJBSUNFUVFDQWdVRUF3SFJCQUdCbVFRQWdXRUVBNEVsQkFNQTdRUUFnTGtFQW9DQkJBR0FUUVFBZ0JrRUFJUEpBQUVEWlFBQWd3RUFBd0tkQUFPQ1FRQUNnZEVBQUFFdEFBR0FqUUFEQS9EOEFJTHMvQUNCK1B3Q0FEVDhBSUhzK0FLQ1F2UURnbHI0QWdOaStBS0FadndDZ0diOEFnTmkrQUFDdHZnQkFtcjBBQUVvK0FJQU5Qd0FnZmo4QUFMZy9BT0Q1UHdDQUlrQUF3RWhBQUlCMFFBRGdrRUFBZ0tkQUFJQytRQUJBMTBBQWdQRkFBT0FGUVFDZ0VrRUE0QjlCQUlBdFFRQ0FPMEVBZ0VsQkFDQlhRUUFnWlVFQVlITkJBT0NBUVFEZ2UwRUFvRzFCQUVCZlFRQUFVVUVBb0VKQkFHQTBRUUFnSmtFQUlCaEJBSUFLUVFCZytrQUF3TjlBQUdERlFBQmdyRUFBWUpOQUFDQjFRQUJBUjBBQUlCcEFBR0RrUHdCZ2t6OEFnQ0kvQUVCZlBRQ2c2YjRBd0UrL0FLQ0x2d0NncEw4QUlMVy9BTURLdndEQXlyOEFJTFcvQU1DcHZ3QUFqTDhBQUZtL0FLRHB2Z0JBWHowQUFCVS9BQUNUUHdEQTNqOEFBQnBBQUVCSFFBQ0FkRUFBWUpGQUFLQ3FRQUFneFVBQTRONUFBTUQ0UUFEZ0NVRUF3QmRCQU1BbFFRQ0FNMEVBWUVGQkFJQlBRUUFBWGtFQW9HeEJBR0I3UVFEQWRFRUFZR1pCQUNCWVFRREFTVUVBZ0R0QkFDQXRRUURnSGtFQWdCQkJBR0FDUVFEZzZFQUFBTTVBQUdDelFBRGdtRUFBb0g1QUFLQk5RQUFBRzBBQW9Oay9BRUNBUHdCZ3lqNEFJTEMrQUlCYnZ3Q0FyTDhBUU9DL0FBQUN3QURBRGNBQUFCSEFBS0FWd0FDZ0ZjQUFBQkhBQU1BUHdBQmdBOEFBb09LL0FJQ3N2d0FBWnI4QXdMSytBTUN5UGdEZ2ZqOEFvTmsvQUFBYVFBREFTRUFBWUh4QUFLQ1lRQUFnc2tBQVlNeEFBQ0RvUUFBZ0FrRUE0QTlCQUtBZFFRREFLMEVBUURwQkFPQklRUURBVjBFQVlHWkJBTUIwUVFCZ2JrRUFvRjlCQUFCUlFRQ2dRa0VBWURSQkFBQW1RUURBRjBFQVlBbEJBQ0QyUUFDZzJVQUFRTDFBQU1DaFFBQWdoMEFBQUZsQUFPQWtRQUFnNlQ4QXdJTS9BS0NDUGdDQUJyOEFRSkcvQUNEYXZ3QkFEY0FBZ0JuQUFFQUt3QURnN3I4QUFOYS9BTURNdndEQXpMOEFBTmEvQU9EdXZ3Q0FDc0FBb0JuQUFHQU93QURBM2I4QUFKTy9BT0FPdndDZ2dqNEE0SDQvQU1EZVB3RGdJMEFBQUZoQUFJQ0ZRQUNnb0VBQTRMeEFBSURZUUFEZzgwQUFBQWhCQUlBV1FRQkFKVUVBQURSQkFLQkNRUUFBVVVFQW9GOUJBR0J1UVFEQWFFRUFvRmxCQU1CS1FRRGdPMEVBUUMxQkFPQWVRUUNBRUVFQVFBSkJBT0RuUUFCQXkwQUFvSzVBQUFDU1FBQ2dhMEFBZ0RWQUFJQUFRQUFBbUQ4QUlOUStBQUR6dmdEZ29iOEFRUE8vQUVBYndBQ2dEOEFBWU5xL0FFQ2h2d0JBYUw4QW9EYS9BS0FadndDZ0diOEFvRGEvQUVCb3Z3QkFvYjhBWU5xL0FPQVB3QUNnRzhBQXdQaS9BSUNqdndEZ0RyOEF3TEkrQUtDWFB3Q2cvVDhBb0RKQUFPQnFRQUJna1VBQW9LeEFBSURJUUFDZzVVQUFvQUZCQUdBUVFRRGdIa0VBUUMxQkFPQTdRUURBU2tFQW9GbEJBTUJvUVFEQVkwRUFnRlJCQUdCRlFRQkFOa0VBSUNkQkFFQVlRUUNBQ1VFQVFQWkFBSURaUUFBQXZVQUFZS0JBQU1DRFFBQkFUa0FBSUJWQUFDQzdQd0JnSlQ4QUlKYStBSUNPdndCZzdyOEE0Qi9BQU9BSHdBQkF1NzhBZ0YrL0FFQzJ2Z0RBMkQwQUFNSStBR0FYUHdCZ0Z6OEFBTUkrQU1EWVBRQkF0cjRBZ0YrL0FFQzd2d0RnQjhBQVlDSEFBTUQ0dndDQWtMOEF3SmkrQU9BWFB3QUF1RDhBb0JSQUFPQktRQUFnZ1VBQVlKNUFBQUM4UUFCZzJVQUFRUFpBQUlBSlFRQkFHRUVBSUNkQkFFQTJRUUJnUlVFQWdGUkJBTUJqUVFDZ1hrRUFnRTlCQUVCQVFRQWdNVUVBQUNKQkFNQVNRUUNnQTBFQUlPbEFBS0RMUUFDZ3JrQUFBSkpBQU9CcVFBQ2dNVUFBQVBFL0FDQitQd0JBWHowQWdGdS9BS0RXdndBZ0hNQUFBQTdBQUFDM3Z3QmdONzhBUU0rOEFJQWlQd0JBaVQ4QTRLNC9BQ0RIUHdBZ3h6OEE0SzQvQUVDSlB3Q0FJajhBUU0rOEFHQTN2d0FBdDc4QUlBN0FBSUFjd0FBQTJyOEFBR2EvQUVCZlBRRGdkajhBNE9jL0FLQXVRQURnYVVBQUFKSkFBS0N1UUFDZ3kwQUFJT2xBQUtBRFFRREFFa0VBQUNKQkFDQXhRUUJBUUVFQWdFOUJBS0JlUVFBZ1drRUF3RXBCQUdBN1FRQWdMRUVBNEJ4QkFNQU5RUUFBL1VBQXdONUFBR0RBUUFBZ29rQUFRSVJBQUVCT1FBQUFGVUFBNExjL0FFQU1Qd0NnNmI0QWdLeS9BQ0FPd0FDQUhNQUFBTkcvQUFCWHZ3QkF6endBWUZZL0FHQzJQd0JBL0Q4QVFCVkFBS0FoUUFDZ0lVQUFRQlZBQUVEOFB3Qmd0ajhBWUZZL0FFRFBQQUFBVjc4QUFORy9BQUFkd0FCZ0Q4QUF3SzIvQUVBQXZ3REFCVDhBZ0xjL0FBQVZRQUJBVGtBQVFJUkFBQ0NpUUFCZ3dFQUF3TjVBQUFEOVFBREFEVUVBNEJ4QkFDQXNRUUJnTzBFQXdFcEJBQ0JhUVFCQVZrRUF3RVpCQUVBM1FRQ2dKMEVBUUJoQkFNQUlRUUFBODBBQW9OUkFBRUMyUUFEZ2wwQUFRSE5BQUlBMlFBRGc5RDhBd0g0L0FFQmZQUUNnWjc4QW9PVy9BT0Fod0FBQS9iOEFnSkMvQUNDRXZnRGdMejhBUUxzL0FHQU5RQUFnTkVBQUFGSkFBQ0JnUUFBZ1lFQUFBRkpBQUNBMFFBQmdEVUFBUUxzL0FPQXZQd0FnaEw0QWdKQy9BQUQ5dndDQUlzQUFnT2EvQUtCbnZ3QkFYejBBd0g0L0FPRDBQd0NBTmtBQVFITkFBT0NYUUFCQXRrQUFvTlJBQUFEelFBREFDRUVBUUJoQkFLQW5RUUJBTjBFQXdFWkJBRUJXUVFCZ1VrRUE0RUpCQUdBelFRREFJMEVBUUJSQkFNQUVRUUNBNmtBQWdNdEFBS0NzUUFEZ2pVQUE0RjVBQUlBaVFBQ0F5ejhBSUNvL0FDRE52Z0FncXI4QVFBL0FBR0Fjd0FDQXhiOEF3Q1MvQUNDd1BnQmdtRDhBQUFOQUFLQTJRQURBWlVBQTRJVkFBR0NQUUFCZ2owQUE0SVZBQU1CbFFBQ2dOa0FBQUFOQUFHQ1lQd0Fnc0Q0QUlDdS9BT0RLdndBZ0hzQUFRQS9BQUNDcXZ3QWd6YjRBSUNvL0FJRExQd0NBSWtBQTRGNUFBT0NOUUFDZ3JFQUFnTXRBQUlEcVFBREFCRUVBUUJSQkFNQWpRUUJnTTBFQTRFSkJBR0JTUVFDZ1RrRUFBRDlCQUlBdlFRRGdIMEVBWUJCQkFPQUFRUURBNGtBQXdNTkFBTUNrUUFEQWhVQUFZRTFBQU1BUFFBQUFwVDhBNEtJK0FBQTR2d0RnMDc4QW9DSEFBR0FHd0FDZ2xyOEFJSEMrQUdCSFB3REEyRDhBd0NOQUFDQmFRQURBaDBBQW9KOUFBSUN1UUFDQXJrQUFvSjlBQU1DSFFBQWdXa0FBNENKQUFNRFRQd0FBUFQ4QW9JbStBS0NidndEZ0NNQUFBQ0xBQU9EVHZ3QUFPTDhBNEtJK0FBQ2xQd0RBRDBBQVlFMUFBTUNGUUFEQXBFQUF3TU5BQU1EaVFBRGdBRUVBWUJCQkFPQWZRUUNBTDBFQUFEOUJBS0JPUVFCZ1MwRUF3RHRCQUFBc1FRQmdIRUVBb0F4QkFDRDZRQUFBMjBBQUFMeEFBQUNkUUFBQWZFQUE0RDFBQUNBQVFBQ0FoajhBb01ROEFJQi92d0FBK3I4QUlDYkFBS0RudndDQVhMOEFBRDgrQUlDU1B3QUFCRUFBQUQ5QUFNQjVRQURBbUVBQUFMUkFBQ0RMUUFBZ3kwQUFBTFJBQUdDWVFBQ0FkMEFBNER4QUFNQUJRQUFnalQ4QTRCZytBQ0JkdndDZzU3OEFJQ2JBQUFENnZ3Q0FmNzhBb01ROEFJQ0dQd0FnQUVBQTREMUFBQUI4UUFBQW5VQUFBTHhBQUFEYlFBQWcra0FBb0F4QkFHQWNRUUFnTEVFQTREdEJBS0JMUVFCQVNFRUFvRGhCQU9Bb1FRQkFHVUVBZ0FsQkFLRHpRQUJnMUVBQUFMVkFBS0NWUUFEQWJFQUFnQzVBQUdEaFB3REFUejhBb0h5K0FNQ2V2d0NBRE1BQUlDREFBTURJdndCQUlMOEFBUEUrQUFDM1B3REFHRUFBUUZaQUFDQ0pRQUNncGtBQXdNTkFBT0RmUUFDZzMwQUFBTU5BQUlDbFFBRGdoMEFBQUZSQUFBQVlRQUFBdHo4QUFQRStBRUFndndEQXlMOEFJQ0RBQUlBTXdBREFucjhBb0h5K0FNQlBQd0JnNFQ4QWdDNUFBTUJzUUFDZ2xVQUFRTFZBQU9EVVFBQmc5RUFBQUFwQkFNQVpRUUNBS1VFQVFEbEJBT0JJUVFCZ1JVRUFnRFZCQU1BbFFRQUFGa0VBWUFaQkFHRHRRQUFnemtBQXdLNUFBR0NQUUFBZ1lFQUF3Q0ZBQUdESFB3Q0FHVDhBd0FTL0FDQzl2d0NnRzhBQTRCTEFBQ0NxdndBZ3ViNEFvRFkvQU1EVlB3QkFLRUFBSUdaQUFDQ1NRQUFnc1VBQXdNOUFBTUR0UUFEQTdFQUF3TTVBQUtDd1FBQWdra0FBSUdaQUFFQW9RQURBMVQ4QW9EWS9BQ0M1dmdBZ3FyOEE0QkxBQUtBYndBQWd2YjhBd0FTL0FNQWJQd0FBeXo4QTRDTkFBSUJpUUFDZ2tFQUFBTEJBQUdEUFFBQ2c3a0FBQUFkQkFNQVdRUUJnSmtFQUlEWkJBT0JGUVFDQVEwRUFvRE5CQU1BalFRRGdFMEVBNEFOQkFBRG9RQUJBeUVBQW9LaEFBQ0NKUUFDZ1UwQUFZQlZBQU9DdVB3QUF3ajRBb0RhL0FBRFd2d0JnSk1BQVlBYkFBQ0NSdndCZzVyMEFZSEUvQU9EelB3RGdOMEFBb0hWQUFPQ1pRQURndUVBQTROZEFBT0QyUUFEZzlrQUE0TmRBQU9DNFFBRGdtVUFBb0hWQUFPQTNRQURnOHo4QVlIRS9BR0RtdlFBZ2tiOEFZQWJBQUVBandBQkEwYjhBWUN5L0FJRFlQZ0Nnc3o4QTRCZEFBRUJXUUFCZ2lrQUF3S2xBQUNESlFBREE2RUFBUUFSQkFDQVVRUUFBSkVFQUFEUkJBT0JEUVFCZ1FVRUFnREZCQUtBaFFRREFFVUVBQUFKQkFJRGtRQURneEVBQVlLVkFBTUNGUUFCZ1RFQUE0QXhBQUFDYVB3RGdIajRBSUdlL0FNRHV2d0NBS2NBQW9QeS9BQUIvdndEZzNEMEFJSkUvQUdBR1FBQ2dSRUFBb0lGQUFBQ2hRQUJBd0VBQWdOOUFBS0QrUUFDZy9rQUFnTjlBQUVEQVFBQUFvVUFBb0lGQUFLQkVRQUJnQmtBQUlKRS9BT0RjUFFBQWY3OEFvUHkvQUNBb3dBQUE2cjhBNEZ5L0FHQkxQZ0RBbXo4QVlBMUFBRUJOUUFCZ2hrQUFJS1pBQU1ERlFBQmc1VUFBZ0FKQkFFQVNRUUFnSWtFQTRERkJBTUJCUVFBZ1FFRUFJREJCQUVBZ1FRQkFFRUVBUUFCQkFJRGdRQUNnd0VBQXdLQkFBQUNCUUFDQVFrQUF3QU5BQUFDTVB3Q2drRDBBZ0lDL0FDQUF3QUJBS2NBQTRPZS9BS0JUdndDZ2ZENEFvSjgvQUdBT1FBRGdUVUFBb0laQUFHQ21RQURneFVBQWdPVkFBSUFDUVFDQUFrRUFnT1ZBQU9ERlFBQmdwa0FBb0laQUFPQk5RQUJnRGtBQW9KOC9BS0I4UGdDZ1U3OEE0T2UvQU9Bb3dBQkEvNzhBQUlDL0FPRGNQUUFna1Q4QVlBWkFBS0JFUUFEQWdVQUFZS0ZBQUNEQlFBQUE0VUFBZ0FCQkFHQVFRUUJnSUVFQVlEQkJBRUJBUVFDZ1BrRUF3QzVCQU9BZVFRQWdEMEVBb1A1QUFBRGZRQUJBdjBBQW9KOUFBTUIvUUFBQVFFQUFBQUJBQUFDQVB3QUE4NzBBd0pXL0FNQUl3QUFBS3NBQXdPTy9BSUJNdndCZ3VENEFJTE0vQU9BWVFBREFWMEFBUUl0QUFNQ3FRQUJBeWtBQXdPbEFBS0FFUVFDZ0JFRUF3T2xBQUVES1FBREFxa0FBUUl0QUFNQlhRQURnR0VBQUlMTS9BR0M0UGdDQVRMOEF3T08vQUNBcHdBQmdCc0FBSUpHL0FPRGN2UUFBZ0Q4QUFBQkFBQUJBUUFBQWdFQUFBS0JBQUFEQVFBRGczMEFBd1A5QUFNQVBRUUNnSDBFQWdDOUJBR0EvUVFBZ1BVRUFJQzFCQUNBZFFRQkFEVUVBZ1BwQUFLRGFRQURBdWtBQUFKdEFBT0IyUUFBZ09FQUE0UE0vQUdCeFB3QmcvNzBBb0ptL0FNQU13QUJBSk1BQVlNNi9BSUFpdndBQThUNEFZTGcvQUNBYlFBQ2dXa0FBUUkxQUFDQ3RRQUFnelVBQUFPMUFBSUFHUVFDQUJrRUFBTzFBQUNETlFBQWdyVUFBUUkxQUFLQmFRQUFnRzBBQVlMZy9BQUR4UGdDQUlyOEFZTTYvQUVBa3dBREFETUFBb0ptL0FNRDF2UUFBZno4QW9Qdy9BT0E4UUFDQWUwQUFJSjFBQUlDOFFBQWczRUFBd1B0QUFNQU5RUUNnSFVFQW9DMUJBSUE5UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3QUFyYjRBd0ttL0FNQVN3QURnSk1BQXdNeS9BS0FadndDZ0dUOEFvTXcvQUdBbFFBQkFaRUFBb0pGQUFBQ3hRQUNBMEVBQUlQQkFBT0FIUVFEZ0IwRUFJUEJBQUlEUVFBQUFzVUFBb0pGQUFFQmtRQUJnSlVBQW9Ndy9BS0FaUHdDZ0diOEF3TXkvQUNBa3dBQmdEc0FBb0orL0FLQjh2Z0NnVXo4QTRPYy9BS0F6UUFDQWMwQUF3SmxBQU1DNVFBREEyVUFBb1BsQUFPQU1RUURnSEVFQTRDeEJBT0E4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUNBbXdBRGdHTUFBSUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUdBbXdBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUdBbXdBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUdBbXdBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUdBbXdBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QUJnSnNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQUdBbXdBQ2dHY0FBUUxPL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBd0xHL0FHQVh3QURBSmNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFDQ3pRQURnMGtBQW9QSkFBQ0FKUVFBZ0NVRUFvUEpBQU9EU1FBQWdzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQU1BbHdBQmdGOEFBd0xHL0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEZ1BFRUE0Q3hCQU9BY1FRRGdERUVBNFBsQUFPRFpRQURndVVBQUFKcEFBQ0IwUUFDQU5FQUFZT28vQU9CY1B3QmdTNzRBd0p1L0FHQU53QURnSThBQXdNeS9BS0FadndCZ0Z6OEFJTWMvQUtBaFFBQWdZRUFBWUk5QUFPQ3VRQUNnemtBQVlPNUFBQ0FIUVFBZ0IwRUFZTzVBQUtET1FBRGdya0FBWUk5QUFDQmdRQUNnSVVBQUlNYy9BR0FYUHdDZ0diOEF3TXkvQU9BandBQmdEY0FBd0p1L0FHQkx2Z0RnWEQ4QVlPby9BSUEwUUFBZ2RFQUFBSnBBQU9DNVFBRGcyVUFBNFBsQUFPQU1RUURnSEVFQTRDeEJBT0E4UVFEZ1BVRUE0QzFCQUFBZVFRQWdEa0VBd1B4QUFDRGRRQUNndlVBQUlKNUFBR0I5UUFDZ1BrQUFRUDgvQUFDQVB3REE5YjBBd0ppL0FPQUt3QUNnSmNBQUFOYS9BS0EydndCZ3hENEFvTE0vQU1BWlFBQ2dXVUFBNEl4QUFNQ3NRQUNBekVBQVFPeEFBQUFHUVFBQUJrRUFRT3hBQUlETVFBREFyRUFBNEl4QUFLQlpRQURBR1VBQW9MTS9BR0RFUGdDZ05yOEFBTmEvQUFBbXdBQkFETUFBb0ptL0FNRDF2UUFBZ0Q4QVFQOC9BS0ErUUFCZ2ZVQUFJSjVBQUtDOVFBQWczVUFBd1B4QUFDQU9RUUFBSGtFQTRDMUJBT0E5UVFEQVAwRUE0QzlCQUFBZ1FRQUFFRUVBSUFCQkFFRGdRQUJBd0VBQVlLQkFBSUNBUUFCQVFVQUF3QUZBQU9DR1B3Q2d4RHdBb0lLL0FLQUF3QUFnS2NBQVlPYS9BTUJNdndBQXRqNEFnSzQvQUVBVlFBQ2dVMEFBSUlsQUFLQ29RQUJBeUVBQUFPaEFBT0FEUVFEZ0EwRUFBT2hBQUVESVFBQ2dxRUFBSUlsQUFLQlRRQUJBRlVBQWdLNC9BQUMyUGdEQVRMOEFZT2EvQUlBcHdBREFBY0FBNElhL0FLREV2QUNnZ2o4QW9BQkFBR0JBUUFBZ2dFQUFJS0JBQUNEQVFBQWc0RUFBQUFCQkFBQVFRUURnSDBFQTRDOUJBTUEvUVFBQVFVRUFJREZCQUVBaFFRQmdFVUVBZ0FGQkFJRGpRQUFBeEVBQWdLUkFBQUNGUUFBZ1MwQUFRQXhBQUtDWlB3QmcvejBBWUhHL0FPRHp2d0JnSjhBQXdPNi9BQ0JudndEZ0hqNEFBSm8vQUdBTVFBQkFTMEFBQUlWQUFJQ2tRQUFBeEVBQVlPTkFBR0FCUVFCZ0FVRUFZT05BQUFERVFBQ0FwRUFBQUlWQUFFQkxRQUJnREVBQUFKby9BT0FlUGdBZ1o3OEF3TzYvQUlBb3dBREErTDhBSUhxL0FNRDFQUURBbUQ4QTRBcEFBR0JKUUFBQWhFQUFZS05BQU9EQ1FBQ0E0a0FBSUFGQkFBQVJRUURnSUVFQXdEQkJBTUJBUVFBZ1EwRUFRRE5CQUdBalFRQ0FFMEVBb0FOQkFHRG5RQUNBeDBBQXdLZEFBQ0NJUUFBZ1VVQUF3QkpBQU1DcFB3QUFyVDRBQUVtL0FPRGZ2d0JBSnNBQW9BREFBS0NDdndDZ3hEd0E0SVkvQUdBQlFBREFQMEFBUUg1QUFHQ2VRQUNBdlVBQWdOeEFBS0Q3UUFDQS9FQUFJTjFBQU1DOVFBQmdua0FBUUg1QUFNQS9RQUJnQVVBQTRJWS9BS0RFUEFDZ2dyOEFvQURBQUdBbXdBQWc0TDhBWUVxL0FPQ1dQZ0NncEQ4QVFCQkFBRUJQUUFCQWgwQUFJS2RBQUFESFFBREE1a0FBUUFOQkFDQVRRUUFBSTBFQTRESkJBS0JDUVFEZ1JFRUFJRFZCQUVBbFFRQ0FGVUVBd0FWQkFBRHNRQUNBekVBQUFLMUFBSUNOUUFEZ1cwQUF3QnhBQUVDOVB3REFCRDhBZ0JtL0FHREh2d0RBSDhBQVlBdkFBT0NhdndCZ1M3NEFnRncvQUtEblB3Q0FNVUFBb0c5QUFNQ1dRQURBdFVBQXdOUkFBTUR6UUFEZzlFQUFJTlpBQUVDM1FBQWdtRUFBd0hGQUFFQXpRQUFBNmo4QTRGdy9BR0JMdmdEZ21yOEFZQXZBQUlBaHdBQUF5NzhBd0J1L0FNQUVQd0JBdlQ4QXdCeEFBRUJiUUFEZ2pFQUFRS3hBQUlETFFBRGc2a0FBSUFWQkFBQVZRUURBSkVFQW9EUkJBSUJFUVFDQVIwRUF3RGRCQU9BblFRQWdHRUVBWUFoQkFDRHhRQURnMFVBQWdMSkFBQ0NUUUFEQVowQUFRQ2xBQUFEV1B3Q2dOajhBSUxtK0FDQ3F2d0RnRXNBQW9CakFBQUMzdndBQThiNEFRQ0EvQU1ESVB3QWdJa0FBSUdCQUFBQ1BRQUNBclVBQVlNdEFBQ0RwUUFCQTZrQUFZTXhBQUNDdVFBREFqMEFBb0dKQUFDQWxRQUJBeno4QVlDdy9BSURZdmdDZ3M3OEF3QmZBQUFBVHdBQ2dxNzhBSU0yK0FHQXNQd0JBMFQ4QW9DZEFBS0JtUUFEQWtrQUFRTEpBQU1EUlFBQWc4VUFBUUFoQkFBQVlRUUNnSjBFQVFEZEJBQUJIUVFBZ1NrRUFnRHBCQU1BcVFRQWdHMEVBWUF0QkFJRDNRQUFnMkVBQTRMaEFBT0NaUUFDZ2RVQUE0RGRBQUNEMFB3Q0FjajhBUUpxOUFBQ012d0JnQThBQW9DTEFBTURWdndDZ05yOEFJTGsrQUNDcVB3QUFFa0FBZ0UxQUFFQ0VRQUFBb2tBQVlMOUFBS0RhUUFCQTIwQUF3TDlBQUFDalFBQ0FoVUFBd0U1QUFFQVNRQUNncXo4QUlNMCtBR0FzdndCQXo3OEFZQ0RBQUdBRHdBQUFqTDhBUUpxOUFJQnlQd0NBOHo4QWdEWkFBR0J6UUFCZ21FQUFnTGRBQU9EV1FBQmc5a0FBQUF0QkFNQWFRUUNBS2tFQVlEcEJBQ0JLUVFCQVRVRUFvRDFCQUFBdVFRQmdIa0VBNEE1QkFLRCtRQUNnMzBBQW9NQkFBS0NoUUFDZ2drQUFZRWRBQUdBSlFBRGdsejhBQUVvK0FBQlp2d0RBNDc4QVlDUEFBT0QwdndEQWRyOEFvTVE4QUlCK1B3RGc5RDhBNERWQUFHQndRQUFnbEVBQVFLNUFBRUREUUFEQXdrQUFZSzlBQUtDVVFBQ0FjRUFBWURkQUFFRDZQd0FBaEQ4QUFPczhBTUIydndCQTlMOEF3Q0xBQU1EanZ3QUFXYjhBQUVvK0FPQ1hQd0JnQ1VBQVlFZEFBS0NDUUFDQW9VQUFRTUJBQU1EZVFBQmcvVUFBSUE1QkFLQWRRUUJBTFVFQUFEMUJBTUJNUVFEQVVFRUFRRUZCQU1BeFFRQkFJa0VBd0JKQkFFQURRUUJnNTBBQVlNaEFBR0NwUUFCZ2lrQUFRRmRBQUVBYVFBQUF2RDhBNEFZL0FNQUZ2d0RBdDc4QUlCYkFBTUFQd0FBZ3FyOEFJTTIrQUtBalB3Qmd3ejhBb0JwQUFDQlFRQUNnZ1VBQUFKbEFBRUNsUUFCZ3BFQUFZSmhBQUtDQ1FBREFVVUFBb0JwQUFHRERQd0RBSkQ4QUFMZStBTUNrdndBQURzQUFJQmJBQU1DM3Z3REFCYjhBNEFZL0FBQzhQd0JBR2tBQVFGZEFBR0NLUUFCZ3FVQUFZTWhBQUdEblFBQkFBMEVBb0JKQkFPQWhRUUJBTVVFQW9FQkJBQUJRUVFDZ1ZFRUFJRVZCQUtBMVFRQWdKa0VBb0JaQkFDQUhRUUJBNzBBQW9OQkFBQ0N5UUFEZ2swQUFBR3RBQUtBdVFBQ2c1ajhBQUdRL0FNRFl2UUJBaWI4QVlQeS9BT0Fld0FCQTJyOEE0RkMvQU9BWVBnQ0FpRDhBQU80L0FBQXFRQURnV0VBQVlIdEFBTUNGUUFBQWhVQUFvSGxBQUtCWFFBQ2dLMEFBNFBJL0FLQ0lQd0RnR0Q0QTRGQy9BQ0RhdndBZ0hzQUFZUHkvQUVDSnZ3REEyTDBBQUdRL0FLRG1Qd0NnTGtBQUFHdEFBT0NUUUFBZ3NrQUFvTkJBQUVEdlFBQWdCMEVBb0JaQkFDQW1RUUNnTlVFQUlFVkJBSUJVUVFDZ1dFRUFBRWxCQUtBNVFRQWdLa0VBNEJwQkFLQUxRUUFBK1VBQW9OcEFBR0M4UUFCZ25rQUF3SUJBQUdCR1FBRGdDa0FBUUtFL0FFQzJQZ0RBSkw4QVlNTy9BR0FZd0FDZ0NjQUFnS0cvQUdEYXZnQUE4ejRBQUtJL0FNRDlQd0RBSlVBQUlFQkFBR0JNUUFBZ1MwQUF3RDFBQU1BalFBQ0EvRDhBWUtNL0FJQUdQd0NnMEw0QWdLRy9BS0FKd0FEZ0ZzQUFRTU8vQU1Ba3Z3QkF0ajRBUUtFL0FPQUtRQUJnUmtBQXdJQkFBR0NlUUFCZ3ZFQUFvTnBBQUFENVFBQ2dDMEVBNEJwQkFDQXFRUUNnT1VFQUFFbEJBS0JZUVFEQVhFRUFnRTFCQUVBK1FRQWdMMEVBNEI5QkFNQVFRUUNnQVVFQWdPVkFBQURJUUFCQXFrQUFvSXhBQUdCZlFBQkFKa0FBSU5vL0FPQlFQd0RnR0w0QW9JaS9BQUR6dndBQUhNQUFvT20vQU1DRHZ3Q2dncjRBb0JFL0FJQ2RQd0FnMmo4QVlBTkFBTUFNUUFCQURFQUFJQUJBQU1EWVB3Q2dsejhBb0JFL0FLQ0N2Z0JBZ0w4QTRPUy9BQUFid0FCQThMOEE0SUsvQUNBVXZnRGdVRDhBSU5vL0FFQW1RQUJnWDBBQW9JeEFBRUNxUUFBQXlFQUFnT1ZBQUtBQlFRREFFRUVBNEI5QkFDQXZRUUJBUGtFQWdFMUJBTUJjUVFDZ1lVRUFnRkpCQUdCRFFRQkFORUVBUUNWQkFHQVdRUUNnQjBFQVlQRkFBQURVUUFCQXQwQUFvSnBBQUFCOFFBREFRa0FBb0FsQUFJQ2hQd0NnMEQ0QVFBZS9BSUNzdndDZ0I4QUFJQmJBQUtEWnZ3RGdmcjhBQUlXK0FFQzJQZ0JnVUQ4QUFJdy9BS0NaUHdDZ21UOEFnSVkvQUdCSFB3QWdzRDRBd0ppK0FPQit2d0NnMmI4QUlCWEFBRUFHd0FBQXA3OEFJQWEvQUVEb1BnQ2dwVDhBd0FsQUFNQkNRQUFBZkVBQW9KcEFBRUMzUUFBQTFFQUFZUEZBQUtBSFFRQmdGa0VBUUNWQkFFQTBRUUJnUTBFQWdGSkJBS0JoUVFEQVprRUF3RmRCQU9CSVFRQWdPa0VBUUN0QkFHQWNRUURBRFVFQXdQNUFBQ0RpUUFDQXhVQUE0S2hBQUVDTVFBQ0FYMEFBd0NkQUFPRGtQd0FnZHo4QVlQRTlBR0EzdndBZ3U3OEFRQXJBQU9BVXdBREEyYjhBZ0l1L0FNQWt2d0FBU3I0QW9KQTlBTUQxUFFEQTlUMEFvTVE4QUtCOHZnREFKTDhBZ0pDL0FPRGF2d0RnRk1BQWdBZkFBSUMxdndCQU5yOEF3Q2srQUlCK1B3REE1ajhBZ0NwQUFLQmdRQUJnakVBQTRLaEFBSURGUUFBZzRrQUF3UDVBQU1BTlFRQmdIRUVBUUN0QkFDQTZRUURnU0VFQXdGZEJBTUJtUVFDQWJFRUF3RjFCQU9CT1FRQWdRRUVBZ0RGQkFDQWpRUURnRkVFQWdBWkJBSUR3UUFEZzAwQUFRTGRBQUFDYlFBQUFnRUFBd0VwQUFNQVZRQUFneUQ4QW9GWS9BRURQdkFEZ1RMOEFvTFcvQU9BQ3dBQmdFY0FBWVB5L0FHRER2d0RnbDc4QWdJQy9BQUNBdndBQWdMOEFvSUsvQU1DZXZ3Q0F4YjhBd1B5L0FNQVJ3QUNBQU1BQTRMUy9BR0EzdndDZ3RUMEE0Rm8vQUtES1B3QmdHRUFBUUV0QUFPQ0FRQUJBbkVBQW9MZEFBT0RUUUFDQThFQUFnQVpCQU9BVVFRQWdJMEVBZ0RGQkFDQkFRUURnVGtFQXdGMUJBSUJzUVFDQWNrRUF3R05CQUVCVlFRRGdSa0VBb0RoQkFFQXFRUUFBSEVFQXdBMUJBTUQrUUFDQTRrQUFBTWRBQUVDc1FBREFrVUFBd0c1QUFFQStRQUFnRGtBQUFMYy9BS0E1UHdBZ2lqMEE0QysvQUdDWXZ3RGcyYjhBUUFYQUFHQUx3QUNnQmNBQUlBREFBQUFBd0FBQUFNQUFnQURBQUFBSXdBREFETUFBSUFQQUFFRFZ2d0FnbGI4QVlDVy9BS0MxUFFEZ1dqOEFvTWMvQUFBUlFBQUFQMEFBWUhGQUFDQ1NRQUNnckVBQUlNaEFBR0RqUUFBQS8wQUF3QTFCQUFBY1FRQkFLa0VBb0RoQkFPQkdRUUJBVlVFQXdHTkJBSUJ5UVFBZ2VVRUF3R3BCQUdCY1FRQWdUa0VBd0Q5QkFJQXhRUUFnSTBFQUFCVkJBQ0FIUVFCQTgwQUFvTmhBQUNDK1FBQWdwRUFBUUl4QUFDQm5RQUNBTlVBQUlBaEFBQ0RCUHdCQVd6OEFJSVErQUNDd3ZnQmdVTDhBWUpPL0FNQzd2d0FBMXI4QXdPYS9BTUQ0dndEQStMOEF3T2EvQUFEV3Z3REF1NzhBZ0pLL0FHQkh2d0FnbHI0QUlKWStBTUJmUHdDZ3h6OEFBQkZBQUNBK1FBQmdhMEFBb0l4QUFHQ2xRQUFBdjBBQXdOaEFBT0R6UUFDZ0IwRUFZQlZCQUVBalFRQ0FNVUVBd0Q5QkFDQk9RUUJnWEVFQXdHcEJBQ0I1UVFBZ2dFRUE0SEZCQUlCalFRQkFWVUVBNEVaQkFNQTRRUURBS2tFQUlCMUJBT0FQUVFDQUFrRUFnT3BBQUNEUlFBQkF1VUFBUUtCQUFPQ0hRQUNBWWtBQUlEbEFBT0FRUUFBQTBUOEFnSkEvQU1Ba1B3QUFQejRBQUQrK0FNQUV2d0NnTnI4QVFFNi9BQ0I2dndBZ2VyOEFRRTYvQUtBMnZ3REFCTDhBQUQrK0FDQndQZ0NBSno4QUlKVS9BS0RXUHdDQUVVQUFJRDVBQUdCclFBQmdqRUFBQUtOQUFNQzVRQUFnMGtBQXdPdEFBS0FDUVFEZ0QwRUFvQjFCQUdBclFRQUFPVUVBQUVkQkFFQlZRUUNBWTBFQTRIRkJBQ0NBUVFDZ2cwRUFBSGxCQU1CcVFRQ0FYRUVBZ0U1QkFNQkFRUUJBTTBFQUFDWkJBTUFZUVFDZ0MwRUFRUDVBQUNEbVFBQWd6VUFBSUxWQUFJQ2VRQUJBaVVBQUFHdEFBT0JBUUFDZ0gwQUFBUDAvQUdERFB3QmdrejhBQUZrL0FJQVpQd0JneEQ0QTRKWStBTUQxUFFEQTlUMEE0SlkrQUdERVBnQ0FHVDhBQUZrL0FLQ1dQd0NBeFQ4QW9BQkFBRUFoUUFEQVEwQUF3R3RBQUdDTVFBQUFvMEFBb0xsQUFFRFFRQUFBNTBBQUFQOUFBRUFNUVFBQUdVRUFBQ1pCQUlBelFRQkFRVUVBQUU5QkFNQmNRUURBYWtFQUFIbEJBS0NEUVFCQWgwRUFJSUJCQUNCeVFRQmdaRUVBNEZaQkFJQkpRUUFnUEVFQTRDNUJBQUFpUVFDZ0ZVRUFnQWxCQUNENlFBQmc0a0FBd010QUFDQzJRQUJnb2tBQVFJMUFBS0IyUUFEQVZVQUFZRGRBQUlBYlFBQkFCa0FBd09NL0FHREhQd0Nnc3o4QW9LUS9BS0NaUHdDZ21UOEFvS1EvQUtDelB3Qmd4ejhBd09NL0FHQUdRQUFnSGtBQWdEZEFBR0JZUUFBQWVVQUFZSTVBQUFDalFBQ2d1VUFBUU5CQUFPRG1RQUNBL1VBQUlBcEJBQUFXUVFDZ0lrRUFZQzlCQUVBOFFRQ0FTVUVBSUZkQkFPQmtRUUNnY2tFQVFJQkJBRUNIUVFBQWkwRUFBSVJCQUdCNlFRQUFiVUVBb0Y5QkFHQlNRUUJBUlVFQWdEaEJBRUFzUVFBQUlFRUFvQk5CQU1BSFFRQUErVUFBSU9OQUFFRFBRQUJBdWtBQUlLZEFBT0NXUUFDZ2hrQUFnSEJBQUFCWFFBQ2dRa0FBNEM1QUFNQWhRQUNnR1VBQVFCQkFBTUFNUUFEQURFQUFRQkJBQUtBWlFBREFJVUFBNEM1QUFLQkNRQUJBV1VBQUFIRkFBRUNIUUFEZ2wwQUF3S2hBQUNDN1FBQkEwRUFBNE9aQUFJRDlRQUFBQ2tFQVlCVkJBTUFnUVFDZ0xFRUFBRGxCQU9CRlFRQ2dVa0VBd0Y5QkFDQnRRUURnZWtFQVFJUkJBQ0NMUVFBQWowRUFRSWhCQUtDQlFRRGdkVUVBb0doQkFLQmJRUUFBVDBFQXdFSkJBSUEyUVFBZ0trRUFZQjVCQUNBVFFRQWdDRUVBSVB4QUFHRG5RQUNBMDBBQW9NSkFBQUN5UUFCQW8wQUFJSlZBQU1DSlFBQmdmMEFBd0d4QUFDQmdRQUFnV1VBQVFFOUFBTUJNUUFEQVRFQUFRRTlBQUNCWlFBQWdZRUFBd0d4QUFHQi9RQUFnaWtBQUFKWkFBRUNqUUFCQXMwQUFvTU5BQUNEVlFBQWc2RUFBZ1AxQUFBQUtRUUJnRlVFQW9DQkJBQUFzUVFCZ04wRUFJRU5CQUlCUFFRQkFYRUVBQUdsQkFBQjJRUUNnZ1VFQVlJaEJBRUNQUVFCZ2swRUFvSXhCQUFDR1FRRGdma0VBQUhKQkFJQmxRUUJnV1VFQUFFMUJBTUJBUVFBQU5VRUF3Q2xCQU1BZVFRQ0FGRUVBUUFwQkFDQUFRUUJnN2tBQUFONUFBQ0RPUUFEQXYwQUFnTEpBQUNDb1FBQUFua0FBb0pWQUFHQ1BRQUFnakVBQVFJZEFBR0NHUUFCZ2hrQUFRSWRBQUNDTVFBQmdqMEFBb0pWQUFBQ2VRQUFncUVBQXdMTkFBQURBUUFDZ3prQUFJTjlBQU1EdlFBREFBRUVBb0FwQkFHQVZRUUNnSUVFQUFDeEJBRUEzUVFDZ1FrRUFBRTVCQU1CWlFRRGdaVUVBb0hKQkFHQi9RUUFnaGtFQXdJeEJBR0NUUVFEQWwwRUFJSkZCQUtDS1FRQkFoRUVBQUh4QkFPQnZRUUNBWTBFQVFGZEJBS0JMUVFCZ1FFRUFRRFZCQUFBclFRREFJRUVBZ0JaQkFFQU5RUUFBQlVFQVlQbEFBTURxUUFDQTNFQUFvTkJBQUdER1FBQmd2RUFBQUxWQUFPQ3VRQUNncTBBQUlLZEFBR0NtUUFCZ3BrQUFJS2RBQUtDclFBRGdya0FBQUxWQUFHQzhRQUJneGtBQVlORkFBRURkUUFEQTZrQUFnUHBBQUlBRlFRQUFEa0VBSUJkQkFDQWhRUUFBTEVFQVFEZEJBS0JDUVFEZ1RVRUFRRmxCQUtCa1FRQkFjRUVBWUh4QkFJQ0VRUURnaWtFQVFKRkJBTUNYUVFCQW5FRUF3SlZCQUlDUFFRQkFpVUVBSUlOQkFBQjZRUURnYlVFQVFHSkJBQUJYUVFEZ1MwRUFnRUZCQUdBM1FRQUFMVUVBWUNOQkFPQWFRUUNnRWtFQTRBcEJBS0FEUVFEQStVQUE0TzVBQU1Ea1FBQWcyMEFBWU5SQUFLRE9RQUJBeTBBQUFNZEFBR0RHUUFCZ3hrQUFBTWRBQUVETFFBQ2d6a0FBWU5SQUFDRGJRQURBNUVBQUlPOUFBQUQ3UUFEQUEwRUFBQXRCQUVBVFFRQmdHMEVBUUNSQkFJQXRRUUNnTjBFQW9FSkJBT0JOUVFCQVdVRUFnR1JCQU9CdlFRQkFlMEVBWUlOQkFJQ0pRUURBajBFQUlKWkJBSUNjUVFBQW9VRUF3SnBCQUtDVVFRQmdqa0VBUUloQkFFQ0NRUURnZUVFQW9HMUJBSUJpUVFBQVdFRUE0RTFCQUlCRFFRQ2dPVUVBd0RCQkFLQW9RUUNBSUVFQUlCbEJBQUFTUVFEQUMwRUFvQVpCQUlBQlFRQWcra0FBb1BOQUFHRHVRQURBNmtBQTRPWkFBR0RtUUFCZzVrQUE0T1pBQU1EcVFBQmc3a0FBb1BOQUFDRDZRQUNBQVVFQW9BWkJBR0FNUVFCQUVrRUFJQmxCQU9BZ1FRQWdLVUVBZ0RGQkFJQTZRUUFBUkVFQVFFNUJBRUJaUVFDQVpFRUE0RzlCQUNCN1FRQkFnMEVBNEloQkFNQ09RUURBbEVFQUFKdEJBRUNoUVFBQXBrRUE0SjlCQUtDWlFRQ0FrMEVBZ0kxQkFNQ0hRUUFnZ2tFQUlIbEJBSUJ1UVFCZ1pFRUFBRnBCQUFCUVFRRGdSa0VBZ0Q1QkFFQTJRUUNnTGtFQWdDZEJBS0FnUVFEZ0drRUF3QlZCQU1BUVFRQ2dERUVBZ0FsQkFDQUhRUUFnQlVFQVlBTkJBRUFEUVFCQUEwRUFZQU5CQUNBRlFRQWdCMEVBZ0FsQkFLQU1RUURBRUVFQXdCVkJBQ0FiUVFBZ0lVRUFnQ2RCQU1BdVFRRGdOa0VBQUQ5QkFNQkhRUURBVUVFQWdGcEJBT0JrUVFEZ2IwRUFJSHRCQUVDRFFRRGdpRUVBZ0k1QkFFQ1VRUUFBbWtFQUFLQkJBQ0NtUVFBZ3EwRUFBS1ZCQU1DZVFRRGdtRUVBSUpOQkFHQ05RUURnaDBFQWdJSkJBT0I2UVFDZ2NFRUFnR1pCQUFCZFFRQmdWRUVBUUV4QkFFQkVRUURnUEVFQXdEVkJBR0F2UVFBQUtrRUFBQ1ZCQUNBZ1FRQmdIRUVBUUJsQkFBQVhRUUFBRlVFQVlCTkJBRUFUUVFCQUUwRUFZQk5CQUFBVlFRQUFGMEVBUUJsQkFHQWNRUUFnSUVFQUFDVkJBQ0FxUVFBQU1FRUFBRFpCQU9BOFFRQ0FSRUVBd0V4QkFDQlZRUURnWFVFQUlHZEJBQUJ4UVFDQWUwRUFRSU5CQU9DSVFRQ0Fqa0VBUUpSQkFPQ1pRUUNBbjBFQVlLVkJBRUNyUVFCQXNFRUFJS3BCQUNDa1FRQmdua0VBd0poQkFDQ1RRUURBalVFQXdJaEJBS0NEUVFEZ2ZFRUFZSE5CQUdCcVFRQWdZa0VBQUZwQkFHQlNRUUJBUzBFQVFFUkJBR0ErUVFCQU9VRUFJRFJCQUlBdlFRQUFMRUVBNENoQkFPQW1RUURBSkVFQVlDTkJBRUFqUVFCQUkwRUFZQ05CQU1Ba1FRRGdKa0VBNENoQkFBQXNRUUNBTDBFQUlEUkJBRUE1UVFEQVBrRUF3RVJCQUVCTFFRQ0FVa0VBZ0ZwQkFNQmlRUUJBYTBFQUlIUkJBSUI5UVFEQWcwRUFBSWxCQUtDT1FRQkFsRUVBNEpsQkFJQ2ZRUUFncFVFQTRLcEJBS0N3UVFCZ3RVRUFnSzlCQU1DcFFRQUFwRUVBZ0o1QkFDQ1pRUUFBbEVFQTRJNUJBTUNKUVFEZ2hFRUFRSUJCQUNCNFFRRGdiMEVBQUdoQkFNQmdRUUNnV1VFQUFGTkJBSUJOUVFCZ1NFRUFZRU5CQUFBL1FRREFPMEVBd0RoQkFNQTJRUUNnTkVFQVlETkJBRUF6UVFCQU0wRUFZRE5CQUtBMFFRREFOa0VBd0RoQkFNQTdRUUFBUDBFQVlFTkJBR0JJUVFDZ1RVRUFvRk5CQU1CWlFRREFZRUVBUUdoQkFJQndRUUNnZUVFQXdJQkJBRUNGUVFBQWlrRUFBSTlCQUdDVVFRRGdtVUVBZ0o5QkFDQ2xRUURncWtFQWdMQkJBQ0MyUVFEQXVrRUFBTFZCQUdDdlFRREFxVUVBWUtSQkFFQ2ZRUUFnbWtFQUFKVkJBQUNRUVFCZ2kwRUFBSWRCQU9DQ1FRQ2dmVUVBSUhaQkFBQnZRUUFBYUVFQTRHRkJBS0JjUVFDZ1YwRUFvRkpCQUtCT1FRQmdTMEVBZ0VoQkFLQkdRUUNBUkVFQVlFTkJBRUJEUVFCQVEwRUFZRU5CQUlCRVFRQ2dSa0VBZ0VoQkFHQkxRUUNnVGtFQW9GSkJBS0JYUVFDZ1hFRUFnR0pCQUdCb1FRQUFiMEVBUUhaQkFDQitRUUJBZzBFQVlJZEJBTUNMUVFCZ2tFRUFRSlZCQUVDYVFRQ2duMEVBUUtWQkFPQ3FRUUNBc0VFQUlMWkJBTUM3UWRjWGFKSHRQaEJZT1QvWEY4VWdNRDJBd25XOHFUUTJNVEV6T1RFM041VFlGd0NBL2owQTROYytBRUFhUGdCZzZUN0lQUk5qa3RjV053QUFBRWNBQUFESVBRUVhBQUM5UVFCQXQwRUFvTEZCQUFDc1FRQmdwa0VBNEtCQkFJQ2JRUUNBbGtFQWdKRkJBSUNNUVFEZ2gwRUFnSU5CQU1CK1FRQ0Fka0VBQUc5QkFPQm5RUURBWUVFQUlGcEJBSUJVUVFDQVQwRUFZRXBCQUFCR1FRQ2dRa0VBZ0Q5QkFHQTlRUUFBTzBFQXdEbEJBS0E1UVFDZ09VRUFvRGxCQUNBNlFRRGdPMEVBSUQ1QkFNQkFRUURnUTBFQW9FZEJBR0JNUVFDQVVVRUFJRmRCQU9CZFFRQUFaVUVBSUd4QkFHQnpRUUJnZTBFQUFJSkJBSUNHUVFCQWkwRUFBSkJCQUFDVlFRQWdta0VBb0o5QkFDQ2xRUURncWtFQWdMQkJBRUMyUVFDQXQwRUFvTEZCQUFDc1FRQmdwa0VBb0tCQkFBQ2JRUUNBbFVFQVFKQkJBRUNMUVFCQWhrRUFRSUZCQUdCNVFRQUFjVUVBd0doQkFNQmdRUUNBV1VFQVlGSkJBSUJMUVFDQVJVRUFRRUJCQUVBN1FRQ0FOa0VBNERKQkFNQXZRUUNBTFVFQUlDdEJBTUFwUVFDZ0tVRUFvQ2xCQUtBcFFRQWdLa0VBSUN4QkFFQXVRUUFBTVVFQVFEUkJBRUE0UVFCQVBVRUFnRUpCQUlCSVFRQ0FUMEVBb0ZaQkFPQmRRUUNBWlVFQTRHMUJBTUIyUVFBQWdFRUE0SVJCQU1DSlFRRGdqa0VBUUpSQkFPQ1pRUUNBbjBFQVFLVkJBQUNyUVFEZ3NFRUFRTEpCQUVDc1FRQmdwa0VBb0tCQkFBQ2JRUUJnbFVFQXdJOUJBRUNLUVFBQWhVRUFBSUJCQU9CMVFRQkFiRUVBWUdOQkFBQmJRUURBVWtFQVFFdEJBQ0JFUVFBQVBVRUFnRFpCQUNBeFFRQUFMRUVBSUNkQkFFQWpRUUFnSUVFQW9CMUJBRUFiUVFEQUdVRUFvQmxCQUtBWlFRQ2dHVUVBUUJwQkFFQWNRUUNBSGtFQVlDRkJBS0FrUVFBQUtVRUFJQzVCQUlBelFRQWdPa0VBUUVGQkFHQklRUUNnVDBFQXdGZEJBS0JnUVFDZ2FVRUFRSE5CQU9COFFRQ2dnMEVBQUlsQkFJQ09RUUJBbEVFQTRKbEJBS0NmUVFDZ3BVRUF3S3RCQUNDdFFRQUFwMEVBNEtCQkFBQ2JRUUJnbFVFQW9JOUJBQUNLUVFCZ2hFRUE0SDFCQUdCelFRQ0FhVUVBZ0Y5QkFBQldRUUJBVFVFQUlFVkJBQUE5UVFEQU5VRUFvQzVCQU1BblFRQUFJa0VBNEJ4QkFPQVhRUUNnRTBFQVlCQkJBTUFOUVFDQUMwRUE0QWxCQUtBSlFRQ2dDVUVBb0FsQkFFQUtRUUNBREVFQW9BNUJBS0FSUVFBZ0ZVRUE0QmxCQU9BZVFRREFKRUVBd0N0QkFPQXlRUUFnT2tFQXdFRkJBR0JLUVFCZ1UwRUE0RnhCQUlCbVFRQ2djRUVBUUh0QkFFQ0RRUURnaUVFQW9JNUJBR0NVUVFCQW1rRUFnS0JCQU1DbVFRQmdxRUVBQUtKQkFNQ2JRUUNnbFVFQXdJOUJBQUNLUVFCZ2hFRUFZSDFCQUNCeVFRQkFaMEVBQUYxQkFBQlRRUUFBU1VFQXdEOUJBR0EzUVFBZ0wwRUFnQ2RCQUVBZ1FRQWdHVUVBNEJKQkFNQU5RUUNnQ0VFQUFBUkJBTUFBUVFEQSswQUFZUGRBQU1EelFBQkE4MEFBUVBOQUFFRHpRQURBOUVBQVlQbEFBTUQ5UUFBQUFrRUF3QVZCQUtBS1FRRGdEMEVBUUJaQkFHQWRRUUNnSkVFQUFDeEJBRUEwUVFBZ1BVRUFnRVpCQUFCUVFRQUFXa0VBb0dSQkFPQnZRUUFnZTBFQVFJTkJBQUNKUVFBQWowRUFRSlZCQUlDYlFRQ2dvVUVBZ0tOQkFDQ2RRUURBbGtFQWdKQkJBR0NLUVFCZ2hFRUFZSDFCQUNCeVFRREFaa0VBZ0Z0QkFLQlFRUUNBUmtFQWdEeEJBS0F5UVFDZ0tVRUFnQ0ZCQUVBWlFRQUFFa0VBNEFwQkFBQUVRUUFBL1VBQUFQTkFBQ0RwUUFBZzRrQUFJTnhBQU9EWFFBREEwMEFBUU5OQUFFRFRRQUJBMDBBQUFOVkFBTURaUUFCZzNrQUFvT1JBQU9Ec1FBQUE5MEFBSUFGQkFBQUlRUUFnRDBFQVFCWkJBQ0FlUVFEZ0prRUFBREJCQUtBNVFRQ0FRMEVBSUU1QkFFQlpRUUNBWkVFQTRHOUJBSUI3UVFEQWcwRUFBSXBCQUVDUVFRQ0Fsa0VBNEp4QkFNQ2VRUUJnbUVFQUFKSkJBSUNMUVFCQWhVRUFJSDVCQUVCeVFRREFaa0VBZ0Z0QkFDQlFRUURnUkVFQUlEcEJBQUF3UVFBQUprRUFRQnhCQU1BVFFRQ0FDMEVBd0FOQkFBRDVRQURnNmtBQXdONUFBS0RVUUFDQXlrQUF3TUpBQUlDOFFBQmd1RUFBNExOQUFFQ3pRQUJBczBBQVFMTkFBRUMxUUFBZ3VrQUFBTDlBQUdERlFBQ0F6a0FBd05oQUFDRGxRQUJnODBBQTRBQkJBRUFJUVFEQUVFRUF3QmxCQUVBalFRQUFMVUVBZ0RkQkFLQkNRUURnVFVFQVFGbEJBT0JrUVFBQWNVRUFnSDFCQUFDRlFRQkFpMEVBb0pGQkFFQ1lRUUFBbWtFQWdKTkJBQ0NOUVFEQWhrRUFZSUJCQU9CelFRQ0FaMEVBb0Z0QkFDQlFRUURnUkVFQWdEbEJBRUF1UVFDQUkwRUFvQmxCQUlBUFFRQWdCa0VBb1B0QUFDRHJRQUJnM0VBQUlNNUFBTURBUUFCQXRrQUFJS3hBQUdDalFBQWduVUFBNEpoQUFBQ1VRQUJBazBBQVFKTkFBRUNUUUFDZ2xVQUFZSnBBQU1DZlFBQmdwa0FBUUxCQUFNQzZRQUJneUVBQXdOWkFBQ0RsUUFBZzlVQUFZQU5CQU9BTVFRQ0FGa0VBNENCQkFBQXNRUUJBTjBFQW9FSkJBRUJPUVFDQVdrRUFBR2RCQUdCelFRQUFnRUVBZ0laQkFDQ05RUURBazBFQW9KVkJBT0NPUVFCZ2lFRUFBSUpCQUNCM1FRQkFha0VBZ0YxQkFBQlJRUUFBUlVFQWdEbEJBRUF1UVFEZ0lrRUFvQmRCQUFBTlFRQWdBMEVBSVBKQUFDRGdRQURBejBBQTRMOUFBSUN4UUFCZ28wQUE0SmRBQU9DTlFBQkFoRUFBd0h0QUFLQnlRQUNBYUVBQVlHWkFBR0JtUUFDQVprQUFvR3hBQUVCMVFBQmdnRUFBd0lkQUFPQ1JRQUNnblVBQXdLdEFBQ0M2UUFBZ3lVQUFZTnBBQUFEdFFBQWdBRUVBUUFwQkFHQVZRUUNnSUVFQUFDeEJBS0EzUVFBQVJFRUFnRkJCQUFCZFFRQ2dhVUVBd0haQkFBQ0NRUURBaUVFQWdJOUJBSUNSUVFDZ2lrRUE0SU5CQUdCNlFRQ0FiVUVBd0dCQkFPQlRRUUFnUjBFQWdEcEJBR0F1UVFEZ0lrRUFvQmRCQUVBTVFRQWdBVUVBQU8xQUFFRFpRQUJneFVBQVlMUkFBTUNqUUFEZ2xFQUFvSVpBQUdCelFBRGdYa0FBQUV0QUFFQTlRQUNBTTBBQVlDbEFBR0FtUUFCZ0prQUFnQ1pBQUNBdVFBRGdOVUFBUUVKQUFNQlNRQUJnWjBBQTRJQkFBQ0NQUUFDZ25VQUFJSzVBQUVEQVFBQmcwMEFBWU9kQUFJRDlRQUFBQ2tFQVlCVkJBQ0FoUVFDQUxVRUFBRHBCQUlCR1FRQmdVMEVBb0dCQkFPQnRRUUJnZTBFQW9JUkJBS0NMUVFDZ2pVRUFvSVpCQUVCL1FRQ0FjVUVBSUdSQkFDQlhRUUJBU2tFQWdEMUJBTUF3UVFBQUpFRUE0QmRCQUVBTVFRQUFBVUVBWU90QUFPRFVRQUFnd0VBQVlLeEFBT0NZUUFDZ2lFQUF3SEJBQUFCVVFBQUFPRUFBZ0NKQUFBQU9RQUFBL2o4QTRPYy9BQURXUHdEQXpEOEF3TXcvQUNETlB3RGczejhBd080L0FNQURRQUJBRmtBQVFDeEFBSUJJUUFBZ1pVQUE0SUZBQUtDVFFBREFwa0FBUUxwQUFFRFFRQURnNWtBQWdQMUFBS0FLUVFBQUYwRUFnQ05CQUFBd1FRQWdQVUVBWUVwQkFNQlhRUUNBWlVFQVlITkJBTUNBUVFBQWlFRUFnSWxCQUtDQ1FRQ0FkMEVBZ0dsQkFLQmJRUUFBVGtFQXdFQkJBT0F6UVFBZ0owRUFZQnBCQUlBTlFRQkFBVUVBWU90QUFNRFVRQUFndmtBQXdLZEFBR0NUUUFDZ2ZrQUFJRnBBQUVBNVFBREFHa0FBWVB3L0FJRExQd0FncEQ4QVFJSS9BS0JUUHdDZ05qOEFvQmsvQUtBWlB3REFHejhBQUVrL0FDQm5Qd0NBakQ4QWdMTS9BS0RsUHdCZ0QwQUFZQ3hBQUdCT1FBQUFkRUFBUUkxQUFBQ2pRQUNndVVBQVFOQkFBQ0RvUUFDZ0FFRUFBQTFCQU1BWlFRRGdKa0VBUURSQkFNQkJRUUNnVDBFQTRGMUJBQ0JzUVFDQWVrRUFZSVJCQU9DRlFRQmdmVUVBWUc5QkFLQmhRUURBVTBFQXdFVkJBT0EzUVFDQUtrRUFnQjFCQU1BUVFRRGdBMEVBUU81QUFHRFZRQUFndmtBQWdLZEFBT0NRUUFBZ2RVQUFvRTFBQU9Ba1FBQkFBMEFBQU1RL0FHQ0tQd0FnS3o4QTRLSStBS0RFdkFDZ2ZMNEFZTVMrQUdBWHZ3Q2dHYjhBd0FTL0FBQzJ2Z0NBSGI0QXdOZzlBSUR5UGdDZ1p6OEFnS3cvQU1EclB3Q2dHa0FBd0VCQUFHQnJRQUJnakVBQUFLTkFBQ0M3UUFCZzFFQUFBTzFBQUdBRFFRREFFRUVBSUI1QkFBQXNRUUFnT2tFQVlFaEJBS0JXUVFBQVpVRUFRSE5CQU1DQVFRQkFna0VBSUhaQkFPQm5RUUNnV1VFQW9FdEJBT0E5UVFBQU1FRUFBQ0pCQUVBVVFRQWdCMEVBb1BSQUFBRGJRQUNBd1VBQVFLaEFBT0NRUUFDQWRFQUFRRWRBQUFBYlFBQWc2VDhBb0pnL0FDQXlQd0RnR0Q0QVFMYStBQUE0dndBQWhMOEFvSisvQUlDenZ3QWd4NzhBd015L0FFQzl2d0NBcnI4QUlKYS9BT0JudndCQURMOEFRRis5QUdEelBnREFnejhBNE04L0FBQVJRQUFnUGtBQXdHdEFBR0NPUUFCZ3AwQUFRTUJBQUdEYVFBQWc5VUFBUUFoQkFFQVdRUUNnSkVFQTRESkJBRUJCUVFDQVQwRUE0RjFCQUNCc1FRQ2dla0VBNEgxQkFFQnZRUURBWUVFQVlGSkJBQ0JFUVFEZ05VRUFBQ2hCQUVBYVFRQkFERUVBb1B4QUFLRGhRQURneDBBQVFLNUFBT0NVUUFDQWRrQUFRRWRBQUFBYVFBQ2cyVDhBd0lNL0FDRFVQZ0FnaEw0QWdFeS9BQ0NodndEZzA3OEFBUHkvQU9BTHdBQmdFTUFBWUJUQUFBQVh3QURBRXNBQXdCSEFBT0FJd0FEQTY3OEE0TGUvQU1COXZ3QUE4cjRBQUZ3K0FFQmJQd0NneHo4QWdCRkFBR0JEUUFEZ2RFQUFvSk5BQUNDdVFBQWd5VUFBSU9WQUFPQUFRUUFnRDBFQVlCMUJBTUFyUVFBQU9rRUFZRWhCQU9CV1FRQ0FaVUVBUUhSQkFLQjNRUURnYUVFQUlGcEJBSUJMUVFBQVBVRUFvQzVCQUVBZ1FRQWdFa0VBWUFSQkFFRHRRQUFnMFVBQVlMVkFBQ0NiUUFDZ2dVQUFRRkJBQUNBZFFBREEyVDhBNEg0L0FLQ0NQZ0FBODc0QWdJNi9BTURRdndDQUNNQUFvQlBBQUNBSndBRGc3cjhBQU5hL0FNRE12d0RBekw4QUFOYS9BT0R1dndEQUNzQUE0QnZBQUtBVHdBREE2NzhBb0tLL0FPQXZ2d0NndFQwQXdGOC9BRURWUHdBQUcwQUFZRTVBQU9DQlFBQ2duVUFBSUxwQUFNRFdRQUJnODBBQUFBaEJBRUFXUVFDZ0pFRUFJRE5CQU1CQlFRQ2dVRUVBd0Y5QkFPQnVRUUJBY1VFQWdHSkJBT0JUUVFCQVJVRUFnRFpCQU1BblFRQWdHVUVBNEFwQkFDRDVRQURnM0VBQWdNRkFBT0NsUUFDZ2lVQUFBRjFBQUNBcVFBQUE3ajhBZ0lrL0FBQ0ZQZ0NnRWI4QUFLSy9BR0R1dndDQUZjQUE0QWJBQU1ET3Z3REFtNzhBUUdpL0FLQTJ2d0NnR2I4QW9CbS9BS0EydndCQWFMOEFRS0cvQUNEYXZ3Q0FDOEFBSUNEQUFPQUR3QURndEw4QVlDVy9BT0IvUGdEQWd6OEF3T3MvQUdBc1FBQWdaVUFBSUk5QUFNQ3JRQUJneUVBQUFPVkFBT0FBUVFCZ0QwRUFJQjVCQUNBdFFRQkFQRUVBWUV0QkFLQmFRUURBYVVFQXdHdEJBS0JjUVFDZ1RVRUE0RDVCQUNBd1FRQ2dJVUVBNEJKQkFBQUVRUURnNmtBQUlNNUFBSUN4UUFDQWxVQUE0SFJBQUFBOVFBREFCRUFBb0tJL0FBRHpQZ0JnMnI0QTRKMi9BTUQ5dndDQUY4QUFZTzYvQUlDbHZ3QUFRYjhBb0ltK0FNRFlQUUFBd2o0QVlCYy9BR0FYUHdBQXdqNEF3Tmc5QUVDMnZnQWdVcjhBb0xXL0FPQUh3QURBSmNBQUlBSEFBQUNpdndBQThyNEFZUE0rQUlDc1B3QmdEMEFBZ0VoQUFPQ0FRQUNBblVBQUlMcEFBR0RYUUFBZzlVQUFvQWxCQU9BWVFRQUFLRUVBSURkQkFHQkdRUUNnVlVFQUlHVkJBQUJtUVFBZ1YwRUFRRWhCQUVBNVFRQWdLa0VBSUJ0QkFHQU1RUURBKzBBQWdONUFBTURBUUFCZ28wQUFvSVpBQUNCVVFBRGdIRUFBd00wL0FLQTZQd0FBWEw0QXdJTy9BS0RwdndDQUdNQUFJT3kvQUdDUnZ3QUE4NzRBd0NrK0FDQTZQd0FBakQ4QTRLNC9BQ0RIUHdBZ3h6OEE0SzQvQUVDSlB3REFKRDhBSUlvOUFHQTN2d0NBdGI4QUlBbkFBS0Fpd0FEQTY3OEF3SDIvQUVCZnZRQ2daejhBb09VL0FPQXJRQUJnWlVBQUlKQkFBQ0N1UUFDQXpFQUE0T3BBQUtBRVFRRGdFMEVBSUNOQkFLQXlRUUFnUWtFQW9GRkJBQ0JoUVFEQVlFRUFnRkZCQUlCQ1FRQ0FNMEVBb0NSQkFNQVZRUUNnQmtFQUlPOUFBSURSUUFCZ3RFQUFRSmRBQUVCelFBQUFPRUFBWVB3L0FJQ0xQd0RBWUQ0QW9EcS9BS0ROdndEQUZjQUFJQUhBQU9DZHZ3QmcyNzRBSU5RK0FNQ0NQd0NneUQ4QXdBRkFBRUFWUUFDZ0lVQUFvQ0ZBQUVBVlFBQmcvRDhBWU1BL0FPQmFQd0NndFQwQW9FRy9BS0RJdndBZ0dzQUE0QlRBQU9DM3Z3QkFETDhBb09rK0FBQ3VQd0JBRWtBQXdFNUFBTUNGUUFBQXBFQUFnTUpBQUVEaFFBQWdBRUVBb0E5QkFDQWZRUUNnTGtFQVFENUJBT0JOUVFDZ1hVRUFZRnhCQUFCTlFRQ0FQVUVBSUM1QkFBQWZRUURnRDBFQUFBRkJBR0RrUUFCZ3hrQUFJS2hBQUNDS1FBRGdXVUFBUUNCQUFPREtQd0FnS3o4QVFMYStBQ0NldndEQUJNQUF3QkxBQUNDN3Z3QmdKYjhBWUlJK0FJQ0pQd0RBNkQ4QVFCbEFBS0E3UUFDZ1VrQUFJR0JBQUNCZ1FBQUFVa0FBQURkQUFPQVFRQUNBeFQ4QWdFQS9BS0F1dmdCZ2lyOEFZUHkvQUNBbHdBQmc4TDhBQUhhL0FBRHJQQUFBaEQ4QUFQdy9BRUE3UUFEZ2VFQUFZSnRBQUdDNlFBQ0EyVUFBd1BoQUFBQU1RUURBRzBFQVlDdEJBQ0E3UVFEQVNrRUFnRnBCQU9CWFFRQ0FTRUVBUURsQkFPQXBRUUNBR2tFQUFBdEJBRUQzUUFEQTJFQUF3THBBQUVDZFFBQWdmMEFBb0VKQUFHQUdRQUNnbGo4QUlJUStBQUE5dndBQTFMOEFZQnZBQUFEeHZ3QWdmcjhBUUYrOUFJQmJQd0JnMVQ4QUlCMUFBT0JNUUFEQWNVQUFvSWRBQUdDUFFBQmdqMEFBZ0laQUFNQnFRQURBTzBBQVlBZEFBQUNoUHdCQXRqNEF3Q1MvQUlERnZ3REFFc0FBNEFiQUFNQ2p2d0RnbHI0QVFFSS9BR0RiUHdEQUswQUFRR3BBQUdDVVFBREFzMEFBSU5OQUFHRHlRQURnQ0VFQW9CaEJBR0FvUVFCQU9FRUFJRWhCQUFCWVFRRGdVMEVBWUVSQkFPQTBRUUJnSlVFQUFCWkJBS0FHUVFEQTdrQUFBTkJBQUNDeFFBQkFra0FBZ0dkQUFDQXNRQUNnNGo4QUFGay9BQUEvdmdDQWtyOEF3QVBBQUdBVXdBQWd1TDhBUUF5L0FLRHBQZ0NBckQ4QUlBNUFBR0JEUUFCZ2RrQUF3SkpBQUlDa1FBREFya0FBb0s1QUFNQ2hRQUJnaWtBQTRGNUFBRUFtUUFBQTJUOEFZRWMvQUtCOHZnQUFsYjhBUUxPL0FFQ3p2d0Nnb3I4QUlCRy9BQ0FSUHdCZ3dqOEFRQjlBQU1CZFFBQmdqa0FBSUs1QUFPRE5RQURBN1VBQTRBWkJBTUFXUVFEQUprRUF3RFpCQUtCR1FRQ2dWa0VBWUZCQkFNQkFRUUFnTVVFQWdDRkJBQUFTUVFCZ0FrRUE0T1ZBQU9ER1FBQkFxRUFBd0lsQUFHQldRQURBR0VBQUFMYy9BT0QwUGdDQURiOEFZTHkvQUlBWHdBQUFBc0FBQUl5L0FNRFl2UUFBWkQ4QW9PVS9BT0FyUUFBQVpVQUFBSTVBQUNDblFBQUF0VUFBb0xoQUFJQzRRQUJnc1VBQWdKcEFBR0I2UUFEQVBVQUFJQUJBQUtDR1B3REFvRDBBd0xhK0FHQzR2Z0JndUw0QVlMaStBRUNldmdCZ3hENEFvTE0vQU1BWlFBQ2dXVUFBNEl4QUFPQ3NRQURnekVBQTRPeEFBR0FHUVFCZ0ZrRUFZQ1pCQUdBMlFRQmdSa0VBWUZaQkFFQk5RUUNnUFVFQTRDMUJBRUFlUVFDQURrRUF3UDFBQUdEZVFBQWd2MEFBQUtCQUFBQ0JRQUJBUkVBQXdBWkFBR0NUUHdBQVB6NEFnRnkvQUlEbnZ3Q2dIY0FBQU55L0FLQkh2d0FnZXo0QXdKcy9BQ0FLUUFCZ1JrQUFvSUJBQUFDWlFBQUFuVUFBd0psQUFLQ1pRQUNnbVVBQW9KbEFBRUNZUUFEQWhVQUFvRTlBQUNBVlFBRGd1ejhBb0Y0L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEFnSEEvQUtEUlB3RGdJa0FBUUdCQUFHQ1BRQURncmtBQW9NNUFBR0R1UUFBZ0IwRUFBQmRCQUFBblFRRGdOa0VBNEVaQkFPQldRUUFnU2tFQWdEcEJBTUFxUVFBZ0cwRUFZQXRCQUlEM1FBQWcyRUFBd0xoQUFHQ1pRQUJBZEVBQXdEVkFBTUR1UHdBZ1p6OEFnQksrQUtDUnZ3QUFCc0FBQUJmQUFBQzN2d0FBOGI0QUFCby9BTUREUHdCQUhrQUE0RnBBQUtDRVFBRGdna0FBZ0h0QUFJQnpRQUJBYzBBQVFITkFBRUJ6UUFCQWRVQUFZSDFBQUFCb1FBRGdOa0FBb0F0QUFHRHFQd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQU9EdVB3QUFFMEFBNEVCQUFPQjJRQUJnbUVBQVlMWkFBQURWUUFEZzgwQUFnQWxCQUVBWlFRRGdLRUVBd0RoQkFJQklRUUJnV0VFQWdFZEJBTUEzUVFEZ0owRUFJQmhCQUdBSVFRQWc4VUFBNE5GQUFJQ3lRQUFnazBBQXdHZEFBRUFwUUFBQTFqOEFvRFkvQUFEQ3ZnRGdycjhBd0JUQUFHQUx3QURnbXI4QVlFdStBSUJjUHdDZzV6OEFnREZBQU1CZlFBQkFWMEFBWUVkQUFPQThRQUNnTTBBQVFETkFBRUF6UUFCQU0wQUE0RFZBQUNCQVFBQmdTa0FBWUZCQUFFQkNRQUNBTkVBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUVBelFBRGdOVUFBSUVsQUFNQnNRQUJBalVBQUlLZEFBT0RDUUFEQTMwQUFZUDFBQU1BTlFRQUFIVUVBWUN4QkFPQTdRUUNBUzBFQUlGdEJBT0JFUVFBZ05VRUFRQ1ZCQUlBVlFRREFCVUVBQU94QUFJRE1RQUFBclVBQWdJMUFBT0JiUUFEQUhFQUFRTDAvQU1BRVB3Q0FHYjhBWU1lL0FHQWR3QUJBQU1BQW9JSy9BS0RFUEFEZ2hqOEFZQUZBQUFBMlFBQ2dMa0FBUUJwQUFHQUpRQUFBL1Q4QTRPYy9BR0RtUHdCZzVqOEFZT1kvQU1EdVB3Q2dBRUFBZ0F4QUFFQWVRQUNBTWtBQWdFZEFBQ0JjUUFDQWFrQUFnSEpBQUVCelFBQkFjMEFBUUhWQUFPQ0JRQUFna0VBQVlLTkFBRUM2UUFDQTAwQUFZTzVBQUNBRlFRQ2dFMEVBUUNKQkFFQXhRUUJnUUVFQWdFOUJBT0JlUVFEQVFrRUE0REpCQUNBalFRQkFFMEVBZ0FOQkFFRG5RQUNBeDBBQXdLZEFBQ0NJUUFBZ1VVQUF3QkpBQU1DcFB3QUFyVDRBQUVtL0FPRGZ2d0NnSWNBQVlPcS9BT0JjdndCZ1N6NEF3SnMvQU1BSlFBQUFDMEFBb09ZL0FBQzhQd0RnbHo4QUlJQS9BS0JUUHdEQVREOEF3RXcvQU1CTVB3QWdaejhBb0lJL0FNQ2VQd0RBd3o4QUFPdy9BR0FQUUFEZ0swQUE0RXBBQUVCdVFBREFoMEFBSUpSQUFBQ2FRQUJBb0VBQUFLeEFBSUM4UUFDZzBFQUFZT2RBQUNBQVFRQkFEVUVBNEJwQkFPQW9RUUJnTjBFQUFFWkJBTUJVUVFEQVkwRUF3RUJCQU1Bd1FRRGdJRUVBQUJGQkFDQUJRUUNBNGtBQTRNSkFBR0NqUUFBQWhFQUFZRWxBQU9BS1FBREFtRDhBWVA4OUFHQnh2d0RnODc4QVFDUEFBT0RmdndBQVNiOEFZTGcrQU1DeFB3REE0ajhBd0tVL0FBQmtQd0RnQmo4QUFFbytBS0NRdlFDZ2ZMNEFZTGkrQUdDNHZnQUF0cjRBNEI2K0FLREV2QUNnZkQ0QUFCby9BSUJyUHdDQXJEOEF3T1kvQU1BVlFBQkFPVUFBZ0dGQUFFQ0VRQURnbVVBQUlLOUFBRURDUUFCZzFVQUF3T2hBQU1EOVFBQkFDa0VBZ0JaQkFHQWpRUURBTUVFQW9ENUJBTUJNUVFBZ1cwRUFvR2xCQU1BL1FRRGdMMEVBNEI5QkFBQVFRUUFBQUVFQUlPQkFBQ0RBUUFBZ29FQUFJSUJBQUdCQVFBQ2dBRUFBb0lJL0FLREV2QURnaHI4QXdBSEFBS0Fod0FBZ3piOEF3QnUvQU1BRVB3QUFwVDhBSUhjL0FFRG9QZ0FnejcwQXdBVy9BQUJadndBQWpMOEFvSisvQUNDenZ3QkFzNzhBZ0s2L0FBQ2F2d0NBaHI4QW9FZS9BTUR1dmdCQVg3MEFvT2srQUNCM1B3Q2d3VDhBNEFkQUFBQXZRQUJnV1VBQVlJTkFBRUNiUUFDQXRFQUFJTTFBQU9EbVFBREFBRUVBNEExQkFBQWJRUUNBS0VFQVFEWkJBQ0JFUVFCQVVrRUFZR0JCQU1CdVFRRGdQVUVBNEMxQkFBQWVRUUFnRGtFQXdQeEFBQ0RkUUFDZ3ZVQUFJSjVBQUdCOVFBQ2dQa0FBUVA4L0FBQ0FQd0RBOWIwQW9KbS9BRUFNd0FDZ0k4QUF3TXkvQUtBWnZ3QUFHRDhBNEVBL0FHRHhQUURBQnI4QTRJRy9BTUMzdndEQTQ3OEFBQVBBQUtBTHdBQUFGTUFBZ0JUQUFHQVJ3QUFnRE1BQUlBREFBQURjdndCQXM3OEFJSDYvQU1BR3Z3QUF4ajBBb0RrL0FLQ3NQd0RnL1Q4QVFDeEFBT0JjUUFDZ2gwQUFRS0JBQUlDNlFBQWcxVUFBd085QUFJQUZRUUNBRTBFQXdDRkJBQUF3UVFCZ1BrRUF3RXhCQUdCYlFRQWdha0VBNER4QkFPQXNRUURnSEVFQTRBeEJBT0Q1UUFEZzJVQUE0TGxBQUFDYVFBQWdkRUFBZ0RSQUFHRHFQd0RnWEQ4QVlFdStBTUNidndCZ0RjQUE0Q1BBQU1ETXZ3Q2dHYjhBSU40K0FLQzF2UUNnUWI4QWdLeS9BSUR1dndEZ0JzQUFnQVRBQU9EenZ3Qmc1cjhBWU9hL0FHRG12d0JnNnI4QVlBSEFBT0FRd0FEZ0dzQUFRQlBBQUVEd3Z3Q2dyTDhBSUUyL0FHRHh2UUJnRWo4QUlLUS9BT0FEUUFCZ05VQUFZR2RBQUNDT1FBREFxRUFBb01OQUFHRGZRQURnKzBBQVFBeEJBS0FhUVFBQUtVRUFvRGRCQUlCR1FRQmdWVUVBUUdSQkFNQThRUURBTEVFQXdCeEJBTUFNUVFDZytVQUFvTmxBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdEQXNiOEFZQmZBQU1BbHdBREF6TDhBb0JtL0FPQ3h2QUNnVnI4QWdNVy9BR0Q2dndEQTVMOEFnTE8vQUtDUnZ3QmdjYjhBd0V5L0FNQk12d0RBVEw4QTRGeS9BT0NHdndBQXJyOEFJTjIvQUVBTHdBREFIOEFBSUF2QUFPREh2d0NBZGI4QUFGeStBT0F2UHdBQXR6OEFvQTVBQU1CRFFBQUFlVUFBQUpoQUFHQzBRQUFBMFVBQW9PMUFBRUFGUVFBQUZFRUE0Q0pCQU1BeFFRQ2dRRUVBZ0U5QkFLQmVRUURBUEVFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCZ3VMNEFRTE8vQUtBWndBRGdLc0FBd04yL0FDQmx2d0NBUkw4QUFMZS9BSUR0dndDQXM3OEFvR2UvQUlEeXZnQ0FFcjRBWU9ZOUFBQ3RQZ0JndUQ0QVlMZytBR0JMUGdBQTY3d0F3T1crQUVCU3Z3REFyTDhBNFAyL0FNQWt3QUFnRmNBQTRNKy9BQ0JidndCQXo3d0FnRnMvQUtEV1B3QkFJVUFBb0ZsQUFJQ0pRQUFncGtBQUlNTkFBT0RnUUFDQS9rQUFJQTVCQUFBZFFRQWdMRUVBUUR0QkFHQktRUUNnV1VFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUVDenZ3Q2dHY0FBQUQ3QUFBQVN3QURBM2I4QVlOVy9BS0RkdndBQW1MOEE0QmUvQUVEUFBBQkFERDhBd0dZL0FDQ1JQd0RBcVQ4QVFMTS9BTUN4UHdEZ21qOEFBSFkvQUFBYVB3QUF4ajBBWUJLL0FJQ2p2d0RBL2I4QWdDWEFBQ0FRd0FDZ3VyOEFZQ1cvQUNDV1BnREFsVDhBNEFOQUFFQTlRQURnZDBBQW9KbEFBRUMzUUFBQTFVQUFBUE5BQUtBSVFRRGdGMEVBSUNkQkFJQTJRUUFBUmtFQWdGVkJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBb0JuQUFBQlR3QUNBUThBQUFDTEFBS0QzdndCZ2s3OEFJTlcrQU1DWVBnQUFhajhBZ0xjL0FNRHJQd0JnQmtBQXdCSkFBS0FaUUFCZ0YwQUFZQXRBQUlEd1B3QWd2ejhBZ0hVL0FLQ0NQZ0NnRWI4QUlLUy9BQ0FFd0FCQUtNQUFnQURBQUNDVnZ3QWdoTDRBQUQwL0FBRFVQd0JBSlVBQUlHQkFBT0NOUUFBZ3JFQUFnTXBBQUNEcFFBQUFCRUVBZ0JOQkFBQWpRUUNBTWtFQUlFSkJBS0JSUVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FLQVp3QURBVjhBQWdFakFBTUFQd0FDQXM3OEFBQlcvQU1DeVBnQWdqajhBQU5vL0FDQVNRQUFBTVVBQVFFUkFBQ0JSUUFDZ1dVQUE0RlZBQUlCSlFBQUFNMEFBZ0JWQUFLRFpQd0RnZmo4QUFGdytBQ0F5dndBQXhMOEFnQnJBQUdBZndBRGd5cjhBSUN1L0FBQzNQZ0RBcEQ4QUFBNUFBQUJMUUFCQWhFQUFJS05BQUNEQ1FBQkE0VUFBSUFCQkFLQVBRUUFnSDBFQW9DNUJBRUErUVFEZ1RVRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0NnR2NBQVFGREFBRUFzd0FDZzViOEFvR2UvQUVEUFBBQUFhajhBd04wL0FPQWVRQUFnUmtBQTRHbEFBQUNCUUFEZ2gwQUFvSXhBQUVDS1FBQUFnMEFBZ0d4QUFBQkhRQUNnR1VBQW9NOC9BSUJNUHdEZ0dMNEFJSTIvQU1BQndBRGdLc0FBUVBxL0FBQ0V2d0NneEx3QWdIOC9BQUQ2UHdBQU8wQUE0SGhBQUdDYlFBQmd1a0FBZ05sQUFNRDRRQUFBREVFQXdCdEJBS0FyUVFCZ08wRUFJRXRCQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FHQzR2Z0Fnczc4QTRCakFBR0JHd0FCZ0ZzQUFnTE8vQUlEeXZnQkFERDhBZ0xjL0FDQVNRQUJBUjBBQW9IZEFBS0NQUUFCZ24wQUFRS2RBQUVDc1FBREFxVUFBb0tCQUFHQ1FRQUJnYzBBQUlFQkFBS0FJUUFDZ216OEFvSWsrQUFBOXZ3QUExcjhBNENYQUFNQVB3QUNncEw4QTRKYStBRUJDUHdCZzJ6OEF3Q3RBQUVCcVFBREFsRUFBUUxSQUFPRFRRQUJnODBBQWdBbEJBQ0FaUVFEZ0tFRUF3RGhCQUlCSVFRRGdQRUVBNEN4QkFPQWNRUURnREVFQW9QbEFBTURaUUFEQXVVQUF3SmxBQUlCelFBQ2dNMEFBNE9jL0FLQlRQd0NnZkw0QW9KKy9BR0FPd0FCQU9jQUFnQWJBQUtDUnZ3Q0FFcjRBd0dZL0FNRHJQd0FBTVVBQTRHbEFBT0NQUUFDQXFFQUE0THRBQUlER1FBQUF6RUFBd01oQUFLQzhRQUJncGtBQUFJdEFBR0JiUUFEZ0gwQUFJTWcvQUVBZ1B3QUE4YjRBUUxpL0FHQWF3QUFBSDhBQVlNSy9BQ0FSdndCZ0Z6OEFJTWMvQUtBaFFBQWdZRUFBWUk5QUFPQ3VRQUNnemtBQVlPNUFBQ0FIUVFBQUYwRUFBQ2RCQU9BMlFRRGdSa0VBZ0QxQkFLQXRRUUNnSFVFQXdBMUJBTUQ3UUFBZzNFQUFnTHhBQUNDZFFBQ0FlMEFBNER4QUFLRDhQd0FBZno4QXdQVzlBS0NadndCQURNQUFRRExBQU1ENHZ3QWdlcjhBNE53OUFDQ1JQd0JnQmtBQVFFUkFBQUNCUUFCZ24wQUFBTHhBQUNEVlFBQ0E1VUFBWU90QUFPRG1RQURBMFVBQW9MUkFBR0NXUUFBZ2IwQUF3REJBQUNEbFB3QkFVejhBb0h5K0FLQ2Z2d0JnRHNBQWdDYkFBQURXdndDZ05yOEFZTVErQUtDelB3REFHVUFBb0ZsQUFPQ01RQURnckVBQTRNeEFBT0RzUUFCZ0JrRUFZQlpCQUdBbVFRQmdOa0VBWUVaQkFHQS9RUUNBTDBFQXdCOUJBTUFQUVFEZy8wQUFBT0JBQUNEQVFBQWdvRUFBSUlCQUFHQkFRQUNnQUVBQW9JSS9BS0RFdkFEZ2hyOEF3QUhBQUlBcHdBREE1cjhBUUU2L0FPQ1dQZ0NncEQ4QVFCQkFBRUJQUUFBZ2gwQUF3S1pBQUVER1FBQkE1VUFBUUFCQkFFQUZRUUNBK2tBQTROdEFBSUM4UUFBZ25VQUFnSHRBQU9BOFFBQ2cvRDhBQUg4L0FNRDF2UUNnbWI4QXdBekFBQUF1d0FCZzVyOEF3RXkvQUdDNFBnQkFzejhBb0JsQUFLQlpRQURBakVBQXdLeEFBTURNUUFEQTdFQUFZQVpCQUdBV1FRQmdKa0VBWURaQkFHQkdRUURBUUVFQXdEQkJBT0FnUVFBQUVVRUFJQUZCQUlEaVFBRGd3a0FBWUtOQUFBQ0VRQUJnU1VBQTRBcEFBTUNZUHdEQTlUMEFJSHEvQU1ENHZ3QUFKOEFBWU9hL0FNQk12d0JndUQ0QVFMTS9BSUFaUUFCZ1dFQUFZSXRBQUtDcVFBRGd5VUFBWU9sQUFJQUVRUURBRFVFQXdQOUFBT0RmUUFBQXdFQUFBS0JBQUFDQVFBQUFRRUFBQUFCQUFBQ0FQd0RBOWIwQW9KbS9BTUFNd0FBZ0xzQUFZT2EvQU1CTXZ3Qmd1RDRBUUxNL0FLQVpRQUNnV1VBQXdJeEFBTUNzUUFEQXpFQUF3T3hBQUdBR1FRQmdGa0VBWUNaQkFHQTJRUUJnUmtFQW9FSkJBT0F5UVFBQUkwRUFJQk5CQUVBRFFRREE1a0FBQU1kQUFDQ25RQUJBaDBBQVFFOUFBRUFRUUFDZ3BEOEE0SlkrQUdCS3Z3QWc0TDhBSUNIQUFNRG12d0JBVHI4QTRKWStBS0NrUHdCQUVFQUFRRTlBQUNDSFFBREFwa0FBUU1aQUFJRGxRQURnQVVFQXdBcEJBQUQ5UUFEZzNVQUFnTDVBQUFDZlFBRGdma0FBb0Q5QUFBQUFRQUFBZ0Q4QXdQVzlBS0NadndEQURNQUE0Q3ZBQU1EanZ3Q0FUTDhBWUxnK0FFQ3pQd0NnR1VBQW9GbEFBTUNNUUFEQXJFQUF3TXhBQU1Ec1FBQmdCa0VBWUJaQkFHQW1RUUJnTmtFQVlFWkJBSUJFUVFDZ05FRUF3Q1JCQUFBVlFRQWdCVUVBNE9wQUFJRExRQUJBckVBQTRJeEFBRUJiUUFEQUhFQUFRTDAvQU1BRVB3Q0FHYjhBWU1lL0FBQWN3QURBK0w4QUlIcS9BT0RjUFFBZ2tUOEFZQVpBQUVCRVFBQUFnVUFBWUo5QUFBQzlRQUNBMlVBQUFQSkFBRUQ3UUFEZzdrQUFRTlJBQUtDMlFBQkFtRUFBb0hKQUFLQTBRQUJnN2o4QUlHYy9BT0FldmdBQW1yOEE0QXpBQUVBa3dBQmd6cjhBZ0NLL0FBRHhQZ0JndUQ4QUlCdEFBS0JhUUFCQWpVQUFJSzFBQUNETlFBQUE3VUFBZ0FaQkFJQVdRUUNBSmtFQWdEWkJBSUJHUVFBQVIwRUFRRGRCQUtBblFRQUFHRUVBUUFoQkFDRHhRQURnMFVBQWdMSkFBQ0NUUUFEQVowQUFRQ2xBQUFEV1B3Q2dOajhBSUxtK0FDQ3F2d0JnRWNBQWdBYkFBS0NSdndDQUVyNEF3R1kvQU1EclB3QUFNVUFBUUd0QUFDQ1NRQURBclVBQUFNWkFBQURXUUFEQTIwQUFRTlZBQUdEQ1FBQUFxVUFBQUkxQUFPQmZRQUFBSkVBQUlNOC9BR0FzUHdBZzFyNEFRTEMvQU1BVndBREFHOEFBSUwyL0FNQUV2d0RBR3o4QTRNdy9BSUFsUUFCZ1pFQUFvSkZBQUFDeFFBQ0EwRUFBSVBCQUFPQUhRUURBRjBFQW9DZEJBSUEzUVFCZ1IwRUFJRXBCQUlBNlFRREFLa0VBSUJ0QkFHQUxRUUNBOTBBQUlOaEFBT0M0UUFEZ21VQUFvSFZBQU9BM1FBRGc5RDhBd0hZL0FBRHJ2QUNBaHI4QXdQKy9BQUFVd0FDQXM3OEFnUEsrQUlBTlB3Qmd1ajhBb0JWQUFJQk5RQUNBZ1VBQVlKbEFBSUNyUUFEZ3QwQUFRTHhBQUVDM1FBQkFxa0FBWUpWQUFHQjZRQUFBUkVBQVlBeEFBTUNrUHdBQXR6NEFZQzIvQUVEUHZ3Q2dJc0FBZ0F6QUFNQ2V2d0NnZkw0QXdFOC9BR0RoUHdDQUxrQUF3R3hBQUtDVlFBQkF0VUFBQU5WQUFNRDBRQUJBQ2tFQUFCcEJBT0FwUVFEQU9VRUFnRWxCQUVCTlFRQ2dQVUVBQUM1QkFHQWVRUURnRGtFQW9QNUFBS0RmUUFEQXdFQUFJS0pBQUtDRFFBQWdTa0FBZ0F4QUFNQ2VQd0JnaWo0QUFEMi9BQ0RVdndDZ0djQUFvT0svQU1CYXZ3QUF4ajBBQUg0L0FNRHJQd0FBS2tBQUFGbEFBS0IvUUFEZ2prQUE0SmhBQU1DY1FBQWdtRUFBd0k1QUFHQjdRQUJnVUVBQUFDSkFBQ0RhUHdDQVd6OEFZSEs5QUNDRXZ3QkErcjhBSUNiQUFJRHd2d0FBZHI4QUFPczhBSUNHUHdBZ0FFQUE0RDFBQUFCOFFBQUFuVUFBQUx4QUFBRGJRQUFnK2tBQW9BeEJBR0FjUVFBZ0xFRUE0RHRCQU1CTFFRREFVRUVBUUVGQkFNQXhRUUJBSWtFQTRCSkJBS0FEUVFDZzZFQUE0TWxBQUFDclFBQWdqRUFBZ0Z0QUFHQWdRQURneWo4QUlDby9BQ0ROdmdBZ3FyOEFnQTdBQUFBTHdBQWdxNzhBWVBPK0FBRHlQZ0FBb2o4QXdQMC9BRUFuUUFCZ1NFQUF3R0pBQUVCelFBQUFlMEFBd0hGQUFHQmlRQURnUmtBQUFDSkFBQ0RzUHdCQWtUOEFJTEErQUlBaXZ3QWd1NzhBd0JUQUFPQVp3QUNnd2I4QUFCcS9BTURsUGdBQXJqOEFRQkpBQU1CT1FBRGdoVUFBd0tSQUFNRERRQURBNGtBQTRBQkJBR0FRUVFEZ0gwRUFnQzlCQUFBL1FRQ2dUa0VBd0ZSQkFJQkZRUUFnTmtFQXdDWkJBR0FYUVFEZ0IwRUFJUEZBQU1EU1FBRGd0RUFBUUpkQUFDQnpRQUNBTmtBQTRQUS9BTUIrUHdCQVh6MEFvR2UvQUtEbHZ3QmdITUFBd091L0FNQ0R2d0NnZ3I0QW9CRS9BT0NkUHdDZzR6OEFRQTlBQUdBbVFBQkFORUFBSUQxQUFFQXpRQUFnSlVBQVFBOUFBTURkUHdBQWtUOEF3T00rQUdES3ZnQmdrNzhBd1B5L0FBQWt3QUNnODc4QW9JaS9BT0FZdmdBZ1VUOEFJTjAvQUFBcVFBQWdaVUFBSUpCQUFDQ3VRQUNBekVBQUFPdEFBT0FFUVFCQUZFRUF3Q05CQUdBelFRRGdRa0VBWUZKQkFFQlpRUURnU1VFQVlEcEJBQ0FyUVFEZ0cwRUE0QXhCQUNEOFFBQ0Eza0FBWU1CQUFDQ2lRQUJBaEVBQVFFNUFBQUFWUUFEZ3R6OEFRQXcvQUVEb3ZnQ0FwYjhBZ0FmQUFLQVh3QUNnMmI4QTRINi9BQUNGdmdDZzBENEFvR2MvQUNDcVB3REEwejhBWU9vL0FJRCtQd0FBNmo4QVFNOC9BQ0NxUHdBQVpqOEF3TEkrQUNEVXZnQ0FoTDhBWU9TL0FFQWV3QUJnQzhBQUFMSy9BTUFNdndDZzBENEFnS0UvQUtBSlFBRGdRa0FBd0h4QUFBQ2NRQURBdVVBQVFOZEFBQ0QxUUFDZ0NVRUE0QmhCQUFBb1FRQmdOMEVBd0VaQkFFQldRUUNnWFVFQWdFNUJBSUEvUVFDQU1FRUF3Q0ZCQU1BU1FRQ2dBMEVBSU9sQUFLRExRQUNncmtBQUFKSkFBT0JxUUFDZ01VQUFBUEUvQU9DQ1B3REFLVDRBZ0VDL0FBREd2d0NBRk1BQVFCakFBTURadndDZ2liOEF3QXkvQUVCZnZRQWd6VDRBb0RZL0FPQmNQd0FBZ0Q4QTRGdy9BR0FzUHdBZ3pUNEFRRis5QUFBVnZ3QmdrNzhBSU9tL0FDQVl3QUFnRWNBQVlNZS9BQ0JOdndBZ2lqMEE0R3MvQUtEalB3REFKMEFBZ0Y5QUFFQ01RQURncUVBQXdNVkFBQ0RqUUFDQUFFRUFRQTlCQUNBZVFRQWdMVUVBUUR4QkFHQkxRUUNnV2tFQUFHTkJBQ0JVUVFCQVJVRUFRRFpCQUNBblFRQkFHRUVBZ0FsQkFFRDJRQUNBMlVBQUFMMUFBR0NnUUFEQWcwQUFJRTlBQUVBWlFBQ2d5RDhBb0VFL0FHRHh2UUNBZGI4QW9ObS9BSUFVd0FCZ0djQUFvUE8vQU9DM3Z3REFmcjhBSUNxL0FHREV2Z0JnUzc0QXdQVzlBR0JMdmdDQTJMNEFZQ3kvQU1CK3Z3QUF1TDhBNFBtL0FPQWJ3QURnRGNBQUlNaS9BQUJqdndDZ3RiMEFvRGsvQUNEQlB3QUFFMEFBd0VoQUFNQi9RQUFBbTBBQVFMZEFBT0RUUUFDQThFQUFvQVpCQUVBVlFRQWdKRUVBQUROQkFNQkJRUUNnVUVFQXdGOUJBTUJvUVFDZ1dVRUF3RXBCQU9BN1FRQkFMVUVBNEI1QkFJQVFRUUJBQWtFQTRPZEFBRURMUUFEZ3JrQUFnSk5BQU1CeFFBQ2dQRUFBd0FoQUFLQ3NQd0JnRWo4QW9JSytBSUIxdndBQXhyOEFZQWZBQUNBY3dBQ2dFOEFBNFBTL0FJREx2d0JBc3I4QXdKdS9BS0NadndEQW03OEFvTE8vQUVEUHZ3RGc5TDhBZ0JMQUFFQVl3QURBL0w4QVlMYS9BS0JXdndCZzhiMEFvQmcvQU9DeFB3QWdDRUFBSURsQUFFQnNRQUFna0VBQW9LdEFBT0RHUUFDQTRrQUF3UDVBQU1BTlFRQUFIRUVBWUNwQkFPQTRRUURBUjBFQW9GWkJBR0JsUVFCZ2JrRUFvRjlCQUFCUlFRQ2dRa0VBWURSQkFBQW1RUURBRjBFQVlBbEJBR0QyUUFDZzJrQUF3TDlBQUVDbFFBQ2dpa0FBSUdKQUFBQXZRQURnL1Q4QWdLTS9BR0FTUHdCZzhiMEFnRUMvQUFDaHZ3QWcycjhBSUFiQUFJQVV3QUFnRmNBQWdCTEFBT0FMd0FEQURNQUFZQXZBQUNBU3dBRGdFOEFBUUEvQUFBRDh2d0NnenI4QWdKQy9BSUFpdndCQXp6d0FZRGMvQUtDc1B3QUEvejhBb0RGQUFHQmlRQUJBaVVBQTRLSkFBSUM4UUFCZzEwQUE0UEpBQUNBSFFRQUFGVUVBSUNOQkFJQXhRUURBUDBFQUlFNUJBS0JjUVFCZ2EwRUF3SFJCQUdCbVFRQWdXRUVBd0VsQkFJQTdRUUFnTFVFQTRCNUJBQUFSUVFCZ0EwRUFJT3hBQUlEUlFBQkF0MEFBd0oxQUFFQ0VRQUJnV1VBQUlDeEFBT0Q5UHdDZ3JEOEFvRUUvQUtBdVBnQkF0cjRBWUZDL0FHQ1R2d0FBdDc4QUlORy9BQURtdndEZzg3OEFBQURBQU1EdXZ3REE0NzhBd01pL0FDQ3F2d0FBaEw4QW9EVy9BQ0NFdmdBZ3NENEFnRjgvQUVDN1B3Q2dCMEFBQUM5QUFLQlpRQUJnaFVBQVFKNUFBQ0MyUUFDZ3owQUFJT2xBQUtBQlFRQmdEMEVBSUIxQkFNQXFRUURBT0VFQTRFWkJBRUJWUVFDQVkwRUE0SEZCQU9CN1FRQ2diVUVBUUY5QkFBQlJRUURBUWtFQW9EUkJBQUFuUVFDZ0dVRUFRQXhCQUFEK1FBQUE1RUFBZ01wQUFFQ3hRQURnbVVBQVFJTkFBR0JaUUFBQUwwQUF3QWhBQUtESVB3QmdpajhBd0NRL0FBQS9QZ0FBUDc0QUFQRytBR0FzdndEQVRMOEFZSEcvQUFDQXZ3QWdaNzhBZ0V5L0FFQWd2d0FndWI0QUFPdThBT0NpUGdDZ09qOEFZSmcvQUNEYVB3Q2dFRUFBd0RaQUFHQmhRQUJBaEVBQUFKcEFBQ0N5UUFCQXkwQUFJT05BQUdEOFFBQUFDMEVBNEJkQkFFQWxRUUFBTTBFQXdFQkJBSUJPUVFDQVhFRUF3R3BCQUFCNVFRQ0FnVUVBd0hSQkFJQm1RUUJnV0VFQW9FcEJBQ0E5UVFEQUwwRUFnQ0pCQUVBVlFRQmdDRUVBUVBkQUFHRGVRQUFneDBBQWdMQkFBT0NaUUFCQWhFQUFJR0pBQUtBOFFBQUFHMEFBWVB3L0FHRERQd0Jna3o4QWdGdy9BSUFpUHdDQTJENEFBSzArQUdEL1BRREE5VDBBNEI0K0FBQzJQZ0FBOFQ0QW9EWS9BTUIyUHdBZ3BEOEFZTTgvQU9BRFFBREFJMEFBUUVSQUFNQnBRQUJnaUVBQWdKMUFBRUN4UUFCQXgwQUFJTjlBQUNENFFBQWdDRUVBZ0JSQkFHQWhRUUFnTGtFQVlEdEJBT0JJUVFDZ1ZrRUFZR1JCQUNCeVFRQWdnRUVBSUlWQkFDQjhRUUJBYmtFQW9HQkJBRUJUUVFBQVJrRUFvRGhCQUtBclFRREFIa0VBQUJKQkFNQUZRUUJnOUVBQXdOMUFBQ0RIUUFCQXNVQUF3SjFBQUtDS1FBQWdja0FBQUZSQUFHQTNRQUNBRzBBQVFBWkFBS0RuUHdCZ3pEOEFJTFUvQU1DcFB3Q2dtVDhBb0prL0FBQ2FQd0NBcmo4QVlMZy9BTURWUHdEZzlEOEFBQTVBQU1BaVFBQWdQVUFBUUZwQUFHQjdRQUJnamtBQWdLRkFBSUMxUUFCQXlrQUFZTjVBQUlEMFFBQUFCa0VBZ0JKQkFNQWVRUUFBSzBFQXdEZEJBSUJFUVFDQVVVRUE0RjVCQUtCc1FRQmdla0VBQUlSQkFBQ0pRUUFnZ2tFQXdIWkJBSUJwUVFBZ1hFRUE0RTVCQUFCQ1FRQWdOVUVBZ0NoQkFHQWNRUURnRUVFQWdBVkJBR0QwUUFCZzNrQUFnTXBBQUVDM1FBQkFwVUFBQUpWQUFLQ0dRQUNBY0VBQUFGZEFBS0JDUUFDQU1VQUFRQ1JBQUNBYVFBREFFa0FBd0F4QUFNQU1RQURnREVBQVFCVkFBQ0FiUUFCQUtFQUE0RGRBQU1CS1FBRGdYa0FBWUhaQUFJQ0pRQURnbUVBQVFLbEFBQ0M3UUFCQXprQUFvT0pBQUNEM1FBREFCVUVBNEJCQkFLQWNRUUFBS1VFQVFEVkJBSUJCUVFBZ1RrRUE0RnBCQU1CblFRQUFkVUVBUUlGQkFDQ0lRUUFnalVFQWdJWkJBS0IvUVFCZ2NrRUFRR1ZCQUdCWVFRQ2dTMEVBQUQ5QkFBQXpRUUNBSjBFQUlCeEJBT0FRUVFEQUJVRUFRUGRBQUFEa1FBQ0EwVUFBWU1CQUFJQ3hRQUJBbzBBQUlKVkFBTUNKUUFDZ2YwQUFvRzlBQU1CaVFBQUFXa0FBSUZGQUFNQk1RQURBVEVBQTRFeEFBS0JUUUFDZ1drQUFJR1pBQUtCMVFBQ2dnMEFBNEkxQUFHQ1lRQUFBcGtBQWdMUkFBT0RFUUFCQTFVQUE0T2RBQUNEN1FBRGdCMEVBQUJKQkFHQWNRUUNBSjBFQUlETkJBSUEvUVFEQVMwRUFBRmhCQUlCa1FRQmdjVUVBSUg1QkFLQ0ZRUUJBakVFQW9KRkJBT0NLUVFCQWhFRUFnSHRCQU1CdVFRQUFZa0VBZ0ZWQkFJQkpRUUFnUGtFQXdESkJBSUFuUVFCZ0hFRUFBQkpCQUdBSVFRQUEva0FBUU94QUFJRGNRQUFnemtBQXdMOUFBSUN5UUFBZ3FFQUFvSjVBQU9DV1FBQ2drRUFBd0l4QUFDQ0lRQUJnaGtBQVlJWkFBR0NHUUFBZ2lVQUFRSTFBQUNDU1FBRGdtVUFBSUtKQUFDQ3NRQUJndGtBQXdNSkFBQURSUUFBZzRFQUFvUEJBQU1BQVFRQmdDa0VBQUJSQkFHQWVRUUNBS0VFQUFETkJBQ0ErUVFEQVNVRUFBRlpCQUdCaVFRQ0Fia0VBQUh0QkFPQ0RRUUJBaWtFQXdKQkJBQUNXUVFCZ2owRUFBSWxCQUtDQ1FRQmdlRUVBSUd4QkFDQmdRUURBVkVFQVlFbEJBQ0ErUVFBQU0wRUFnQ2hCQU1BZVFRQkFGVUVBUUF4QkFPQURRUUFBK1VBQXdPcEFBSURjUUFDZzBFQUFZTVpBQUlDOVFBQkF0a0FBQUxCQUFHQ3NRQURBcDBBQVlLWkFBR0NtUUFCZ3BrQUFvS2hBQUFDdFFBQkFzVUFBNExoQUFNREFRQUNBeWtBQW9OUkFBTURmUUFDZzdVQUFBUHhBQUFBR1FRQkFEa0VBSUJkQkFNQWdRUUNBS2tFQTREUkJBQUEvUVFDQVNVRUF3RlJCQUdCZ1FRQ0FiRUVBNEhoQkFJQ0NRUURBaUVFQUFJOUJBSUNWUVFDZ21rRUFJSlJCQU1DTlFRQ0FoMEVBWUlGQkFNQjJRUUJnYTBFQUFHQkJBTUJVUVFDQVNVRUFBRDlCQUNBMVFRQ2dLMEVBZ0NKQkFNQVpRUUFBRWtFQTRBcEJBS0FEUVFEQStVQUE0TzVBQU9Ea1FBQ0EzRUFBb05WQUFJRFBRQUFnekVBQWdNZEFBR0RHUUFCZ3hrQUFZTVpBQUVESVFBREF6RUFBb05CQUFPRFhRQUNnMzBBQXdPaEFBQUR6UUFCZy9VQUFJQVZCQUVBTVFRREFFMEVBQUJ4QkFFQWtRUUNBTFVFQUlEZEJBQUJCUVFCZ1MwRUFnRlZCQUNCZ1FRQmdhMEVBQUhkQkFJQ0JRUUNnaDBFQXdJMUJBQUNVUVFCQW1rRUFZSjlCQUFDWlFRREFra0VBb0l4QkFNQ0dRUUFBZ1VFQW9IWkJBR0JyUVFBZ1lFRUFnRlZCQUtCTFFRQUFRa0VBb0RoQkFNQXZRUUNnSjBFQVFDQkJBQ0FaUVFBQUVrRUF3QXRCQUtBR1FRREFBVUVBb1B0QUFBRDFRQUFnNzBBQW9PdEFBR0RuUUFCZzVrQUFZT1pBQUdEbVFBQUE2RUFBZ094QUFDRHdRQURnOWtBQW9QNUFBS0FEUVFDZ0NFRUF3QTFCQUtBVFFRQ2dHa0VBd0NGQkFLQXBRUURnTVVFQWdEcEJBT0JEUVFDQVRVRUFvRmRCQU9CaFFRQWdiRUVBd0haQkFBQ0JRUURBaGtFQXdJeEJBT0NTUVFBZ21VRUFRSjlCQUVDa1FRQUFua0VBNEpkQkFBQ1NRUUJBakVFQW9JWkJBQUNCUVFEQWRrRUFJR3hCQUFCaVFRQmdXRUVBNEU1QkFBQkdRUUJnUFVFQXdEVkJBS0F1UVFDQUowRUFvQ0JCQU9BYVFRREFGVUVBUUJGQkFHQU5RUUFnQ2tFQVlBZEJBS0FGUVFDZ0EwRUFRQU5CQUVBRFFRQkFBMEVBNEFOQkFDQUdRUURnQjBFQUFBdEJBT0FPUVFEZ0VrRUE0QmRCQU9BY1FRQkFJa0VBNENoQkFBQXdRUUJnTjBFQW9EOUJBT0JIUVFEQVVFRUFRRnBCQUFCa1FRQWdia0VBWUhoQkFHQ0JRUURBaGtFQVFJeEJBQ0NTUVFBQW1FRUFJSjVCQUdDa1FRQkFxVUVBSUtOQkFHQ2RRUUNnbDBFQUFKSkJBRUNNUVFEQWhrRUFZSUZCQUdCNFFRREFia0VBUUdWQkFDQmNRUUJnVTBFQVlFdEJBQ0JFUVFEZ1BFRUF3RFZCQUdBdlFRQUFLa0VBQUNWQkFNQWdRUUFBSFVFQTRCbEJBR0FYUVFDQUZVRUFvQk5CQUVBVFFRQkFFMEVBUUJOQkFPQVRRUURnRlVFQXdCZEJBSUFhUVFCZ0hrRUFRQ0pCQUFBblFRQUFMRUVBUURGQkFHQTNRUUJnUGtFQWdFVkJBRUJOUVFDQVZVRUE0RjFCQUNCblFRQ2djRUVBWUhwQkFHQ0NRUUNBaDBFQW9JeEJBQUNTUVFDZ2wwRUFZSjFCQUdDalFRQ0FxVUVBZ0s1QkFLQ29RUURnb2tFQVFKMUJBS0NYUVFBQWtrRUFvSXhCQUlDSFFRQ2dna0VBZ0h0QkFHQnlRUUNBYVVFQUlHRkJBSUJaUVFCZ1VrRUFRRXRCQUVCRVFRQmdQa0VBUURsQkFFQTBRUUJBTUVFQW9DeEJBSUFwUVFCQUowRUFRQ1ZCQUlBalFRQkFJMEVBUUNOQkFFQWpRUURBSTBFQXdDVkJBS0FuUVFBZ0trRUE0QzFCQU1BeFFRQkFOa0VBUUR0QkFFQkFRUUFBUmtFQW9FeEJBTUJUUVFBZ1cwRUFRR05CQUlCclFRQWdkRUVBZ0gxQkFJQ0RRUUNBaUVFQW9JMUJBTUNTUVFEZ2wwRUFZSjFCQU9DaVFRQ2dxRUVBb0s1QkFPQ3pRUUJBcmtFQW9LaEJBT0NpUVFCZ25VRUE0SmRCQU1DU1FRREFqVUVBQUlsQkFFQ0VRUUNnZjBFQUFIZEJBQ0J2UVFEZ1owRUF3R0JCQUtCWlFRQUFVMEVBZ0UxQkFHQklRUUNnUTBFQXdEOUJBR0E4UVFCQU9VRUFJRGRCQUNBMVFRQ0FNMEVBUUROQkFFQXpRUUJBTTBFQXdETkJBSUExUVFDQU4wRUE0RGxCQUdBOVFRQkFRVUVBZ0VWQkFHQktRUUNBVDBFQXdGUkJBQ0JiUVFBZ1lrRUFRR2xCQUFCeFFRQkFlVUVBd0lCQkFFQ0ZRUUFBaWtFQXdJNUJBTUNUUVFEZ21FRUFBSjVCQUNDalFRQ2dxRUVBUUs1QkFBQzBRUUNBdVVFQTRMTkJBRUN1UVFDZ3FFRUFJS05CQUFDZVFRQUFtVUVBSUpSQkFHQ1BRUURnaWtFQWdJWkJBR0NDUVFCZ2ZVRUFJSFpCQUFCdlFRQUFhRUVBNEdGQkFLQmNRUUNnVjBFQUlGTkJBRUJQUVFBQVRFRUFBRWxCQUFCSFFRRGdSRUVBZ0VOQkFFQkRRUUJBUTBFQVFFTkJBS0JEUVFCZ1JVRUFZRWRCQUlCSlFRRGdURUVBd0ZCQkFNQlVRUUNnV1VFQW9GNUJBTUJqUVFDZ2FVRUFnSEJCQUtCM1FRRGdma0VBZ0lOQkFLQ0hRUURBaTBFQVlKQkJBQ0NWUVFBQW1rRUFBSjlCQUNDa1FRQkFxVUVBZ0s1QkFPQ3pRUUNBdVVIWEY5ZWo4RDRRV0RrLzF4ZkZJREE5Z01KMXZLVm1ZV05sYzhjWUZnQUFBQUFCQUFBQUFnQUFBQUFBQUFBQ0FBQUFBd0FBQUtSMWRXbGtzemM1T0RNd05ESTFOekUxTURFMk5qUTVPVGF0ZG1WeWRHVjRYM052ZFhKalpkb21XZ3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhVzUwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnWm14dllYUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnpZVzF3YkdWeU1rUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnpZVzF3YkdWeU0wUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnBjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXpSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSFZ6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjak5FT3dvdkx5QjJaWEowWlhnZ2FXNXdkWFJ6T2lBS2FXNGdkbVZqTWlCd2IzTnBkR2x2YmpzS2RtVmpNaUJuWlhSZmNHOXphWFJwYjI0b0tYdHlaWFIxY200Z2NHOXphWFJwYjI0N2ZRcHBiaUIyWldNeUlIVjJPd3AyWldNeUlHZGxkRjkxZGlncGUzSmxkSFZ5YmlCMWRqdDlDZ292THlCVmJtbG1iM0p0Y3pvZ0NuVnVhV1p2Y20wZ1ltOXZiQ0IxYm1sbWIzSnRYMk52Ykc5eWJXRndPd3BpYjI5c0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eWJXRndLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNKdFlYQTdmUXAxYm1sbWIzSnRJSFZwYm5RZ2IySnFaV04wWDJsa093cDFhVzUwSUdkbGRGOXZZbXBsWTNSZmFXUW9LWHR5WlhSMWNtNGdiMkpxWldOMFgybGtPMzBLZFc1cFptOXliU0J0WVhRMElHMXZaR1ZzWDJZek1tTTdDbTFoZERRZ1oyVjBYMjF2WkdWc1gyWXpNbU1vS1h0eVpYUjFjbTRnYlc5a1pXeGZaak15WXp0OUNuVnVhV1p2Y20wZ2FXNTBJSE5rWmw5dFlYSnJaWEpmYzJoaGNHVTdDbWx1ZENCblpYUmZjMlJtWDIxaGNtdGxjbDl6YUdGd1pTZ3BlM0psZEhWeWJpQnpaR1pmYldGeWEyVnlYM05vWVhCbE8zMEtkVzVwWm05eWJTQm1iRzloZENCbmJHOTNkMmxrZEdnN0NtWnNiMkYwSUdkbGRGOW5iRzkzZDJsa2RHZ29LWHR5WlhSMWNtNGdaMnh2ZDNkcFpIUm9PMzBLZFc1cFptOXliU0JtYkc5aGRDQmhkR3hoYzE5MFpYaDBkWEpsWDNOcGVtVTdDbVpzYjJGMElHZGxkRjloZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVVvS1h0eVpYUjFjbTRnWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsTzMwS2RXNXBabTl5YlNCaWIyOXNJSEJoZEhSbGNtNDdDbUp2YjJ3Z1oyVjBYM0JoZEhSbGNtNG9LWHR5WlhSMWNtNGdjR0YwZEdWeWJqdDlDblZ1YVdadmNtMGdZbTl2YkNCd2FXTnJhVzVuT3dwaWIyOXNJR2RsZEY5d2FXTnJhVzVuS0NsN2NtVjBkWEp1SUhCcFkydHBibWM3ZlFwMWJtbG1iM0p0SUdKdmIyd2dkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGxPd3BpYjI5c0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eWNtRnVaMlVvS1h0eVpYUjFjbTRnZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsTzMwS2RXNXBabTl5YlNCbWJHOWhkQ0J3ZUY5d1pYSmZkVzVwZERzS1pteHZZWFFnWjJWMFgzQjRYM0JsY2w5MWJtbDBLQ2w3Y21WMGRYSnVJSEI0WDNCbGNsOTFibWwwTzMwS2RXNXBabTl5YlNCellXMXdiR1Z5TWtRZ1pHbHpkR0Z1WTJWbWFXVnNaRHNLZFc1cFptOXliU0IyWldNMElHNWhibDlqYjJ4dmNqc0tkbVZqTkNCblpYUmZibUZ1WDJOdmJHOXlLQ2w3Y21WMGRYSnVJRzVoYmw5amIyeHZjanQ5Q25WdWFXWnZjbTBnWm14dllYUWdjM1J5YjJ0bGQybGtkR2c3Q21ac2IyRjBJR2RsZEY5emRISnZhMlYzYVdSMGFDZ3BlM0psZEhWeWJpQnpkSEp2YTJWM2FXUjBhRHQ5Q25WdWFXWnZjbTBnZG1Wak15Qm1NekpqWDNOallXeGxPd3AyWldNeklHZGxkRjltTXpKalgzTmpZV3hsS0NsN2NtVjBkWEp1SUdZek1tTmZjMk5oYkdVN2ZRcDFibWxtYjNKdElIWmxZeklnY21WemIyeDFkR2x2YmpzS2RtVmpNaUJuWlhSZmNtVnpiMngxZEdsdmJpZ3BlM0psZEhWeWJpQnlaWE52YkhWMGFXOXVPMzBLZFc1cFptOXliU0JtYkc5aGRDQmtaWEIwYUY5emFHbG1kRHNLWm14dllYUWdaMlYwWDJSbGNIUm9YM05vYVdaMEtDbDdjbVYwZFhKdUlHUmxjSFJvWDNOb2FXWjBPMzBLZFc1cFptOXliU0IyWldNMElHeHZkMk5zYVhCZlkyOXNiM0k3Q25abFl6UWdaMlYwWDJ4dmQyTnNhWEJmWTI5c2IzSW9LWHR5WlhSMWNtNGdiRzkzWTJ4cGNGOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1ltOXZiQ0JpYVd4c1ltOWhjbVE3Q21KdmIyd2daMlYwWDJKcGJHeGliMkZ5WkNncGUzSmxkSFZ5YmlCaWFXeHNZbTloY21RN2ZRcDFibWxtYjNKdElHMWhkRFFnY0hKbGNISnZhbVZqZEdsdmJqc0tiV0YwTkNCblpYUmZjSEpsY0hKdmFtVmpkR2x2YmlncGUzSmxkSFZ5YmlCd2NtVndjbTlxWldOMGFXOXVPMzBLZFc1cFptOXliU0JpYjI5c0lIVnVhV1p2Y20xZlkyOXNiM0k3Q21KdmIyd2daMlYwWDNWdWFXWnZjbTFmWTI5c2IzSW9LWHR5WlhSMWNtNGdkVzVwWm05eWJWOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JvYVdkb1kyeHBjRjlqYjJ4dmNqc0tkbVZqTkNCblpYUmZhR2xuYUdOc2FYQmZZMjlzYjNJb0tYdHlaWFIxY200Z2FHbG5hR05zYVhCZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUhabFl6UWdaMnh2ZDJOdmJHOXlPd3AyWldNMElHZGxkRjluYkc5M1kyOXNiM0lvS1h0eVpYUjFjbTRnWjJ4dmQyTnZiRzl5TzMwS2RXNXBabTl5YlNCaWIyOXNJSFJ5WVc1elptOXliVjl0WVhKclpYSTdDbUp2YjJ3Z1oyVjBYM1J5WVc1elptOXliVjl0WVhKclpYSW9LWHR5WlhSMWNtNGdkSEpoYm5ObWIzSnRYMjFoY210bGNqdDlDZ29LQ2dvdkx5QlFaWElnYVc1emRHRnVZMlVnWVhSMGNtbGlkWFJsY3pvZ0NtbHVJSFpsWXpRZ2MyUm1YM1YyT3dwMlpXTTBJR2RsZEY5elpHWmZkWFlvS1h0eVpYUjFjbTRnYzJSbVgzVjJPMzBLYVc0Z2RtVmpOQ0IyWlhKMFpYaGZZMjlzYjNJN0NuWmxZelFnWjJWMFgzWmxjblJsZUY5amIyeHZjaWdwZTNKbGRIVnliaUIyWlhKMFpYaGZZMjlzYjNJN2ZRcHBiaUIyWldNeUlIRjFZV1JmYjJabWMyVjBPd3AyWldNeUlHZGxkRjl4ZFdGa1gyOW1abk5sZENncGUzSmxkSFZ5YmlCeGRXRmtYMjltWm5ObGREdDlDbWx1SUhabFl6SWdjWFZoWkY5elkyRnNaVHNLZG1Wak1pQm5aWFJmY1hWaFpGOXpZMkZzWlNncGUzSmxkSFZ5YmlCeGRXRmtYM05qWVd4bE8zMEthVzRnZG1Wak5DQmpiMjUyWlhKMFpXUmZjM1J5YjJ0bFkyOXNiM0k3Q25abFl6UWdaMlYwWDJOdmJuWmxjblJsWkY5emRISnZhMlZqYjJ4dmNpZ3BlM0psZEhWeWJpQmpiMjUyWlhKMFpXUmZjM1J5YjJ0bFkyOXNiM0k3ZlFwcGJpQjJaV015SUhkbmJGOXdiM05wZEdsdmJuTTdDblpsWXpJZ1oyVjBYM2RuYkY5d2IzTnBkR2x2Ym5Nb0tYdHlaWFIxY200Z2QyZHNYM0J2YzJsMGFXOXVjenQ5Q21sdUlIWmxZelFnWTI5dWRtVnlkR1ZrWDNKdmRHRjBhVzl1T3dwMlpXTTBJR2RsZEY5amIyNTJaWEowWldSZmNtOTBZWFJwYjI0b0tYdHlaWFIxY200Z1kyOXVkbVZ5ZEdWa1gzSnZkR0YwYVc5dU8zMEthVzRnZG1Wak15QnRZWEpyWlhKZmIyWm1jMlYwT3dwMlpXTXpJR2RsZEY5dFlYSnJaWEpmYjJabWMyVjBLQ2w3Y21WMGRYSnVJRzFoY210bGNsOXZabVp6WlhRN2ZRb0tjSEpsWTJsemFXOXVJR2hwWjJod0lHWnNiMkYwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVc1ME93b0tkVzVwWm05eWJTQnRZWFEwSUhCeWIycGxZM1JwYjI0N0NuVnVhV1p2Y20wZ2JXRjBOQ0IyYVdWM093cDFibWxtYjNKdElHbHVkQ0IxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN6c0tkVzVwWm05eWJTQjJaV00wSUhWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhOYk9GMDdDZ3AxYm1sbWIzSnRJR1pzYjJGMElHRjBiR0Z6WDNSbGVGOWthVzA3Q2dwdmRYUWdkbVZqTkNCbWNtRm5YMk52Ykc5eU93cHZkWFFnZG1Wak1pQm1jbUZuWDNWMk93cHZkWFFnWm14dllYUWdabkpoWjE5MWRuTmpZV3hsT3dwdmRYUWdabXh2WVhRZ1puSmhaMTlrYVhOMFlXNWpaV1pwWld4a1gzTmpZV3hsT3dwdmRYUWdkbVZqTkNCbWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFEc0tiM1YwSUdac2IyRjBJRzlmWTJ4cGNGOWthWE4wWVc1alpWczRYVHNLWm14aGRDQnZkWFFnZG1Wak5DQm1jbUZuWDNOMGNtOXJaV052Ykc5eU93b0tabXhoZENCdmRYUWdkV2x1ZENCbWNtRm5YMmx1YzNSaGJtTmxYMmxrT3dwbWJHRjBJRzkxZENCMlpXTXlJR1pmYzNCeWFYUmxYM05qWVd4bE93b0tJMlJsWm1sdVpTQkJUbFJKUVV4SlFWTmZVa0ZFU1ZWVElEQXVPQW9LQ20xaGREUWdjVzFoZENoMlpXTTBJSEYxWVhRcGV3b2dJQ0FnWm14dllYUWdiblZ0SUQwZ2NYVmhkQzU0SUNvZ01pNHdPd29nSUNBZ1pteHZZWFFnYm5WdE1pQTlJSEYxWVhRdWVTQXFJREl1TURzS0lDQWdJR1pzYjJGMElHNTFiVE1nUFNCeGRXRjBMbm9nS2lBeUxqQTdDaUFnSUNCbWJHOWhkQ0J1ZFcwMElEMGdjWFZoZEM1NElDb2diblZ0T3dvZ0lDQWdabXh2WVhRZ2JuVnROU0E5SUhGMVlYUXVlU0FxSUc1MWJUSTdDaUFnSUNCbWJHOWhkQ0J1ZFcwMklEMGdjWFZoZEM1NklDb2diblZ0TXpzS0lDQWdJR1pzYjJGMElHNTFiVGNnUFNCeGRXRjBMbmdnS2lCdWRXMHlPd29nSUNBZ1pteHZZWFFnYm5WdE9DQTlJSEYxWVhRdWVDQXFJRzUxYlRNN0NpQWdJQ0JtYkc5aGRDQnVkVzA1SUQwZ2NYVmhkQzU1SUNvZ2JuVnRNenNLSUNBZ0lHWnNiMkYwSUc1MWJURXdJRDBnY1hWaGRDNTNJQ29nYm5WdE93b2dJQ0FnWm14dllYUWdiblZ0TVRFZ1BTQnhkV0YwTG5jZ0tpQnVkVzB5T3dvZ0lDQWdabXh2WVhRZ2JuVnRNVElnUFNCeGRXRjBMbmNnS2lCdWRXMHpPd29nSUNBZ2NtVjBkWEp1SUcxaGREUW9DaUFnSUNBZ0lDQWdLREV1TUNBdElDaHVkVzAxSUNzZ2JuVnROaWtwTENBb2JuVnROeUFySUc1MWJURXlLU3dnSUNBZ0lDQWdJQ2h1ZFcwNElDMGdiblZ0TVRFcExDQWdJQ0FnSUNBZ01DNHdMQW9nSUNBZ0lDQWdJQ2h1ZFcwM0lDMGdiblZ0TVRJcExDQWdJQ0FnSUNBZ0tERXVNQ0F0SUNodWRXMDBJQ3NnYm5WdE5pa3BMQ0FvYm5WdE9TQXJJRzUxYlRFd0tTd2dJQ0FnSUNBZ0lEQXVNQ3dLSUNBZ0lDQWdJQ0FvYm5WdE9DQXJJRzUxYlRFeEtTd2dJQ0FnSUNBZ0lDaHVkVzA1SUMwZ2JuVnRNVEFwTENBZ0lDQWdJQ0FnS0RFdU1DQXRJQ2h1ZFcwMElDc2diblZ0TlNrcExDQXdMakFzQ2lBZ0lDQWdJQ0FnTUM0d0xDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSURBdU1Dd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdNUzR3Q2lBZ0lDQXBPd3A5Q2dwbWJHOWhkQ0JrYVhOMFlXNWpaV1pwWld4a1gzTmpZV3hsS0NsN0NpQWdJQ0F2THlCSGJIbHdhQ0JrYVhOMFlXNWpaU0JtYVdWc1pDQjFibWwwY3lCaGNtVWdhVzRnY0dsNFpXeHpPeUJqYjI1MlpYSjBJSFJ2SUdScGJXVnVjMmx2Ym14bGMzTUtJQ0FnSUM4dklIZ3RZMjl2Y21ScGJtRjBaU0J2WmlCMFpYaDBkWEpsSUdsdWMzUmxZV1FnWm05eUlHTnZibk5wYzNSbGJtTjVJSGRwZEdnZ2NISnZaM0poYlcxaGRHbGpJSFYyQ2lBZ0lDQXZMeUJrYVhOMFlXNWpaU0JtYVdWc1pITWdhVzRnWm5KaFoyMWxiblFnYzJoaFpHVnlMaUJUWldVZ1lXeHpieUJqYjIxdFpXNTBjeUJpWld4dmR5NEtJQ0FnSUhabFl6UWdkWFpmY21WamRDQTlJR2RsZEY5elpHWmZkWFlvS1RzS0lDQWdJR1pzYjJGMElIQnBlSE5wZW1WZmVDQTlJQ2gxZGw5eVpXTjBMbm9nTFNCMWRsOXlaV04wTG5ncElDb2daMlYwWDJGMGJHRnpYM1JsZUhSMWNtVmZjMmw2WlNncE93b2dJQ0FnY21WMGRYSnVJQzB4TGpBdmNHbDRjMmw2WlY5NE93cDlDZ3AyWldNeklIUnZkbVZqTXloMlpXTXlJSFlwZTNKbGRIVnliaUIyWldNektIWXNJREF1TUNrN2ZRcDJaV016SUhSdmRtVmpNeWgyWldNeklIWXBlM0psZEhWeWJpQjJPMzBLQ25abFl6UWdkRzkyWldNMEtIWmxZek1nZGlsN2NtVjBkWEp1SUhabFl6UW9kaXdnTVM0d0tUdDlDblpsWXpRZ2RHOTJaV00wS0habFl6UWdkaWw3Y21WMGRYSnVJSFk3ZlFwMlpXTTBJSFJ2ZG1Wak5DaGliMjlzSUhZcElIc0tJQ0FnSUhKbGRIVnliaUIyWldNMEtEQXVNQ2s3Q24wS0NtMWhkRElnWkdsaFoyMG9kbVZqTWlCMktYc0tJQ0FnSUhKbGRIVnliaUJ0WVhReUtIWXVlQ3dnTUM0d0xDQXdMakFzSUhZdWVTazdDbjBLQ21ac2IyRjBJRjlrWlhSbGNtMXBibUZ1ZENodFlYUXlJRzBwSUhzS0lDQnlaWFIxY200Z2JWc3dYVnN3WFNBcUlHMWJNVjFiTVYwZ0xTQnRXekJkV3pGZElDb2diVnN4WFZzd1hUc0tmUW9LZG05cFpDQndjbTlqWlhOelgyTnNhWEJmY0d4aGJtVnpLSFpsWXpNZ2QyOXliR1JmY0c5ektTQjdDaUFnSUNCbWIzSWdLR2x1ZENCcElEMGdNRHNnYVNBOElIVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6T3lCcEt5c3BDaUFnSUNBZ0lDQWdiMTlqYkdsd1gyUnBjM1JoYm1ObFcybGRJRDBnWkc5MEtIZHZjbXhrWDNCdmN5d2dkVzVwWm05eWJWOWpiR2x3WDNCc1lXNWxjMXRwWFM1NGVYb3BJQzBnZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzF0cFhTNTNPd3A5Q2dwMmIybGtJRzFoYVc0b0tYc0tJQ0FnSUM4dklHZGxkRjl3YjNNb0tTQnlaWFIxY201eklIUm9aU0J3YjNOcGRHbHZiaUJ2WmlCMGFHVWdjMk5oZEhSbGNpQnRZWEpyWlhJS0lDQWdJQzh2SUdkbGRGOXdiM05wZEdsdmJpZ3BJSEpsZEhWeWJuTWdkR2hsSUNoeVpXeGhkR2wyWlNrZ2NHOXphWFJwYjI0Z2IyWWdkR2hsSUdOMWNuSmxiblFnY1hWaFpDQjJaWEowWlhnS0NpQWdJQ0IyWldNeklHWXpNbU5mYzJOaGJHVWdQU0JuWlhSZlpqTXlZMTl6WTJGc1pTZ3BPd29nSUNBZ2RtVmpNaUJ0Y3lBOUlHWXpNbU5mYzJOaGJHVXVlSGtnS2lCblpYUmZjWFZoWkY5elkyRnNaU2dwT3dvZ0lDQWdkbVZqTWlCeGRXRmtYMjltWm5ObGRDQTlJR1l6TW1OZmMyTmhiR1V1ZUhrZ0tpQm5aWFJmY1hWaFpGOXZabVp6WlhRb0tUc0tJQ0FnSUhabFl6TWdiV0Z5YTJWeVgyOW1abk5sZENBOUlHWXpNbU5mYzJOaGJHVWdLaUIwYjNabFl6TW9aMlYwWDIxaGNtdGxjbDl2Wm1aelpYUW9LU2s3Q2dvZ0lDQWdkbVZqTWlCaVltOTRYM0poWkdsMWN5QTlJREF1TlNBcUlHMXpPd29nSUNBZ2RtVmpNaUJ6Y0hKcGRHVmZZbUp2ZUY5alpXNTBjbVVnUFNCeGRXRmtYMjltWm5ObGRDQXJJR0ppYjNoZmNtRmthWFZ6T3dvZ0lDQWdabDl6Y0hKcGRHVmZjMk5oYkdVZ1BTQnRjenNLSUNBZ0lHMWhkRFFnY0hacFpYY2dQU0J3Y205cVpXTjBhVzl1SUNvZ2RtbGxkenNLSUNBZ0lHMWhkRFFnZEhKaGJuTWdQU0JuWlhSZmRISmhibk5tYjNKdFgyMWhjbXRsY2lncElEOGdiVzlrWld4ZlpqTXlZeUE2SUcxaGREUW9NUzR3S1RzS0NpQWdJQ0IyWldNMElIQnZjMmwwYVc5dVgzZHZjbXhrSUQwZ2JXOWtaV3hmWmpNeVl5QXFJSFpsWXpRb2RHOTJaV016S0dkbGRGOTNaMnhmY0c5emFYUnBiMjV6S0NrcExDQXhLVHNLSUNBZ0lIQnliMk5sYzNOZlkyeHBjRjl3YkdGdVpYTW9jRzl6YVhScGIyNWZkMjl5YkdRdWVIbDZLVHNLQ2lBZ0lDQXZMeUJEYjIxd2RYUmxJR05sYm5SeVpTQnZaaUJpYVd4c1ltOWhjbVFnYVc0Z1kyeHBjSEJwYm1jZ1kyOXZjbVJwYm1GMFpYTUtJQ0FnSUM4dklFRnNkMkY1Y3lCMGNtRnVjMlp2Y20wZ2RHVjRkQzl6WTJGMGRHVnlJSEJ2YzJsMGFXOXVJR0Z5WjNWdFpXNTBDaUFnSUNCMlpXTTBJR1JoZEdGZmNHOXBiblFnUFNCblpYUmZjSEpsY0hKdmFtVmpkR2x2YmlncElDb2djRzl6YVhScGIyNWZkMjl5YkdRN0NpQWdJQ0F2THlCdFlYbGlaU0IwY21GdWMyWnZjbTBnYldGeWEyVnlYMjltWm5ObGRDQXJJR2RzZVhCb0lHOW1abk5sZEhNS0lDQWdJR1JoZEdGZmNHOXBiblFnUFNCMlpXTTBLR1JoZEdGZmNHOXBiblF1ZUhsNklDOGdaR0YwWVY5d2IybHVkQzUzSUNzZ2JXRjBNeWgwY21GdWN5a2dLaUJ0WVhKclpYSmZiMlptYzJWMExDQXhLVHNLSUNBZ0lHUmhkR0ZmY0c5cGJuUWdQU0J3ZG1sbGR5QXFJR1JoZEdGZmNHOXBiblE3Q2dvZ0lDQWdMeThnUTI5dGNIVjBaU0IwY21GdWMyWnZjbTBnWm05eUlIUm9aU0J2Wm1aelpYUWdkbVZqZEc5eWN5Qm1jbTl0SUhSb1pTQmpaVzUwY21Gc0lIQnZhVzUwQ2lBZ0lDQjBjbUZ1Y3lBOUlDaG5aWFJmWW1sc2JHSnZZWEprS0NrZ1B5QndjbTlxWldOMGFXOXVJRG9nY0hacFpYY3BJQ29nY1cxaGRDaG5aWFJmWTI5dWRtVnlkR1ZrWDNKdmRHRjBhVzl1S0NrcElDb2dkSEpoYm5NN0NpQWdJQ0IyWldNMElITndjbWwwWlY5alpXNTBaWElnUFNCMGNtRnVjeUFxSUhabFl6UW9jM0J5YVhSbFgySmliM2hmWTJWdWRISmxMQ0F3TENBd0tUc0tDaUFnSUNCMlpXTTBJSFpqYkdsd0lEMGdaR0YwWVY5d2IybHVkQ0FySUhOd2NtbDBaVjlqWlc1MFpYSTdDZ29nSUNBZ0x5OGdSWGgwY21FZ1luVm1abVZ5YVc1bklHbHpJSEpsY1hWcGNtVmtJR0Z5YjNWdVpDQnpjSEpwZEdWeklIZG9hV05vSUdGeVpTQmhiblJwWVd4cFlYTmxaQ0J6YnlCMGFHRjBDaUFnSUNBdkx5QjBhR1VnWVc1MGFXRnNhV0Z6SUdKc2RYSWdaRzlsYzI0bmRDQm5aWFFnWTNWMElHOW1aaUFvYzJWbElDTXhOU2t1SUZSb2FYTWdZbXgxY2lCbVlXeHNjeUIwYndvZ0lDQWdMeThnZW1WeWJ5QmhkQ0JoSUhKaFpHbDFjeUJ2WmlCQlRsUkpRVXhKUVZOZlVrRkVTVlZUSUhCcGVHVnNjeUJwYmlCMGFHVWdkbWxsZDNCdmNuUWdZMjl2Y21ScGJtRjBaWE1LSUNBZ0lDOHZJR0Z1WkNCM1pTQjNZVzUwSUhSdklHSjFabVpsY2lCMGFHVWdkbVZ5ZEdsalpYTWdhVzRnZEdobElDcHpiM1Z5WTJVcUlITndjbWwwWlNCamIyOXlaR2x1WVhSbENpQWdJQ0F2THlCemVYTjBaVzBnYzI4Z2RHaGhkQ0IzWlNCblpYUWdkR2hwY3lCaGJXOTFiblFnYVc0Z2RHaGxJRzkxZEhCMWRDQmpiMjl5WkdsdVlYUmxjeTRLSUNBZ0lDOHZDaUFnSUNBdkx5QklaWEpsSUhkbElHTmhiR04xYkdGMFpTQjBhR1VnWkdWeWFYWmhkR2wyWlNCdlppQjBhR1VnYldGd2NHbHVaeUJtY205dElITndjbWwwWlNCNGVRb2dJQ0FnTHk4Z1kyOXZjbVJwYm1GMFpYTWdLR1JsWm1sdVpXUWdZbmtnWUhSeVlXNXpZQ2tnYVc1MGJ5QjBhR1VnZG1sbGQzQnZjblFnY0dsNFpXd2dZMjl2Y21ScGJtRjBaWE11Q2lBZ0lDQXZMeUJVYUdVZ1pHVnlhWFpoZEdsMlpTQnVaV1ZrY3lCMGJ5QnBibU5zZFdSbElIUm9aU0J3Y205d1pYSWdkR1Z5YlNCbWIzSWdkR2hsSUhCbGNuTndaV04wYVhabENpQWdJQ0F2THlCa2FYWnBaR1VnYVc1MGJ5Qk9SRU1zSUdWMllXeDFZWFJsWkNCaGRDQjBhR1VnWTJWdWRISmxJSEJ2YVc1MElHQjJZMnhwY0dBdUNpQWdJQ0J0WVhRMElHUmZibVJqWDJSZlkyeHBjQ0E5SUcxaGREUW9DaUFnSUNBZ0lDQWdNUzR3TDNaamJHbHdMbmNzSURBdU1Dd2dJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnTUM0d0xBb2dJQ0FnSUNBZ0lEQXVNQ3dnSUNBZ0lDQWdJQ0F4TGpBdmRtTnNhWEF1ZHl3Z01DNHdMQ0FnSUNBZ0lDQWdJREF1TUN3S0lDQWdJQ0FnSUNBd0xqQXNJQ0FnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSURFdU1DOTJZMnhwY0M1M0xDQXdMakFzQ2lBZ0lDQWdJQ0FnTFhaamJHbHdMbmg1ZWk4b2RtTnNhWEF1ZHlwMlkyeHBjQzUzS1N3Z0lDQWdJQ0FnSUNBZ01DNHdDaUFnSUNBcE93b2dJQ0FnYldGME1pQmtlSGwyWDJSNGVYTWdQU0JrYVdGbmJTZ3dMalVnS2lCd2VGOXdaWEpmZFc1cGRDQXFJR2RsZEY5eVpYTnZiSFYwYVc5dUtDa3BJQ29nYldGME1paGtYMjVrWTE5a1gyTnNhWEFxZEhKaGJuTXBPd29nSUNBZ0x5OGdUbTkzTENCdmRYSWdZblZtWm1WeUlITnBlbVVnYVhNZ1pYaHdjbVZ6YzJWa0lHbHVJSFpwWlhkd2IzSjBJSEJwZUdWc2N5QmlkWFFnZDJVZ1oyVjBJR0poWTJzZ2RHOEtJQ0FnSUM4dklIUm9aU0J6Y0hKcGRHVWdZMjl2Y21ScGJtRjBaU0J6ZVhOMFpXMGdkWE5wYm1jZ2RHaGxJSE5qWVd4bElHWmhZM1J2Y2lCdlppQjBhR1VLSUNBZ0lDOHZJSFJ5WVc1elptOXliV0YwYVc5dUlDaG1iM0lnYVhOdmRISnZjR2xqSUhSeVlXNXpabTl5YldGMGFXOXVjeWt1SUVadmNpQmhibWx6YjNSeWIzQnBZd29nSUNBZ0x5OGdkSEpoYm5ObWIzSnRZWFJwYjI1ekxDQjBhR1VnWjJWdmJXVjBjbWxqSUcxbFlXNGdiMllnZEdobElIUjNieUJ3Y21sdVkybHdiR1VnYzJOaGJHVWdabUZqZEc5eWN3b2dJQ0FnTHk4Z2FYTWdZU0J5WldGemIyNWhZbXhsSUdOdmJYQnliMjFwYzJVNkNpQWdJQ0JtYkc5aGRDQjJhV1YzY0c5eWRGOW1jbTl0WDNOd2NtbDBaVjl6WTJGc1pTQTlJSE54Y25Rb1lXSnpLRjlrWlhSbGNtMXBibUZ1ZENoa2VIbDJYMlI0ZVhNcEtTazdDZ29nSUNBZ0x5OGdTVzRnZEdobElHWnlZV2R0Wlc1MElITm9ZV1JsY2lCM1pTQjNZVzUwSUc5MWNpQnphV2R1WldRZ1pHbHpkR0Z1WTJVZ2FXNGdkbWxsZDNCdmNuUWdLSEJwZUdWc0tRb2dJQ0FnTHk4Z1kyOXZjbVJ6SUdadmNpQmthWEpsWTNRZ2RYTmxJR2x1SUdGdWRHbGhiR2xoYzJsdVp5QnpkR1Z3SUdaMWJtTjBhVzl1Y3k0Z1YyVWdkR2hsY21WbWIzSmxJRzVsWldRS0lDQWdJQzh2SUdFZ2MyTmhiR2x1WnlCbVlXTjBiM0lnYzJsdGFXeGhjaUIwYnlCMmFXVjNjRzl5ZEY5bWNtOXRYM053Y21sMFpWOXpZMkZzWlN3Z1luVjBJR2x1WTJ4MVpHbHVad29nSUNBZ0x5OGdkR2hsSUhWMkxUNXpjSEpwZEdVZ1kyOXZjbVJwYm1GMFpTQnplWE4wWlcwZ2MyTmhiR2x1WnlCbVlXTjBiM0lnWVhNZ2QyVnNiQzRnSUZkbElHTm9iMjl6WlNCMGJ3b2dJQ0FnTHk4Z2RYTmxJSFJvWlNCaWIzVnVaR2x1WnlCaWIzZ2dLbmdxSUhkcFpIUm9JR1p2Y2lCMGFHbHpMaUJVYUdseklHTnZiV1Z6SUhkcGRHZ2djMjl0WlFvZ0lDQWdMeThnWTI5dWMybHpkR1Z1WTNrZ1kyOXVaR2wwYVc5dWN6b0tJQ0FnSUM4dklDb2dSbTl5SUhCeWIyTmxaSFZ5WVd3Z1pHbHpkR0Z1WTJVZ1ptbGxiR1J6TENCM1pTQnVaV1ZrSUhSb1pTQnpjSEpwZEdVZ1ltOTFibVJwYm1jZ1ltOTRJSFJ2SUdKbENpQWdJQ0F2THlBZ0lITnhkV0Z5WlM0Z0tFbG1JRzV2ZEN3Z2RHaGxJSFYySUdOdmIzSmthVzVoZEdWeklIZHBiR3dnWW1VZ1lXNXBjMjkwY205d2FXTmhiR3g1SUhOallXeGxaQ0JoYm1RS0lDQWdJQzh2SUNBZ1lXNTVJR05oYkdOMWJHRjBhVzl1SUdKaGMyVmtJRzl1SUhSb1pXMGdkMmxzYkNCdWIzUWdZbVVnWVNCa2FYTjBZVzVqWlNCbWRXNWpkR2x2Ymk0cENpQWdJQ0F2THlBcUlFWnZjaUJ6WVcxd2JHVmtJR1JwYzNSaGJtTmxJR1pwWld4a2N5d2dkMlVnYm1WbFpDQjBieUJqYjI1emFYTjBaVzUwYkhrZ1kyaHZiM05sSUhSb1pTQXFlQ29LSUNBZ0lDOHZJQ0FnWm05eUlIUm9aU0J6WTJGc2FXNW5JR2x1SUdkbGRGOWthWE4wWVc1alpXWnBaV3hrWDNOallXeGxLQ2t1Q2lBZ0lDQm1iRzloZENCemNISnBkR1ZmWm5KdmJWOTFYM05qWVd4bElEMGdiV2x1S0dGaWN5aHRjeTU0S1N3Z1lXSnpLRzF6TG5rcEtUc0tJQ0FnSUdaeVlXZGZkWFp6WTJGc1pTQTlJSFpwWlhkd2IzSjBYMlp5YjIxZmMzQnlhWFJsWDNOallXeGxJQ29nYzNCeWFYUmxYMlp5YjIxZmRWOXpZMkZzWlRzS0lDQWdJR1p5WVdkZlpHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pTQTlJR1JwYzNSaGJtTmxabWxsYkdSZmMyTmhiR1VvS1RzS0NpQWdJQ0F2THlCaFpHUWdjR0ZrWkdsdVp5Qm1iM0lnUVVFc0lITjBjbTlyWlNCaGJtUWdaMnh2ZHlBb2JtOXVJRzVoZEdsMlpTQmthWE4wWVc1alpXWnBaV3hrY3lCa2IyNG5kQ0J1WldWa0NpQWdJQ0F2THlCQlFTQndZV1JrYVc1bklHSjFkQ0JEU1ZKRFRFVWdaWFJqSUdSdktRb2dJQ0FnWm14dllYUWdjSEIxSUQwZ1oyVjBYM0I0WDNCbGNsOTFibWwwS0NrN0NpQWdJQ0JtYkc5aGRDQmlZbTk0WDJKMVppQTlJQ2dLSUNBZ0lDQWdJQ0JCVGxSSlFVeEpRVk5mVWtGRVNWVlRJQ3NnYldGNEtEQXVNQ3dnWjJWMFgzTjBjbTlyWlhkcFpIUm9LQ2tnS2lCd2NIVXBJQ3NnYldGNEtEQXVNQ3dnWjJWMFgyZHNiM2QzYVdSMGFDZ3BJQ29nY0hCMUtRb2dJQ0FnS1NBdklIWnBaWGR3YjNKMFgyWnliMjFmYzNCeWFYUmxYM05qWVd4bE93b2dJQ0FnTHk4Z1RYVnNkR2x3YkhrZ2RHaGxJR0oxWm1abGNpQmllU0J6YVdkdUtHSmliM2hmY21Ga2FYVnpLU0J6YnlCMGFHRjBJRzFoY210bGNuTnBlbVVnUFQwZ01DQmpiR1ZoYm14NUNpQWdJQ0F2THlCamIyeHNZWEJ6WlhNZ2RHaGxJSEJoWkdSbFpDQmlZbTk0SUhSdklIcGxjbThnS0RBcVNXNW1JRDA5SUU1aFRpQndjbTl3WVdkaGRHVnpJSFJ2SUdkc1gxQnZjMmwwYVc5dUNpQWdJQ0F2THlCaGJtUWdaMlYwY3lCamRXeHNaV1FwTGlCWGFYUm9iM1YwSUhSb2FYTXNJRzFoY210bGNuTnBlbVVnUFQwZ01DQjNiM1ZzWkNCd2NtOWtkV05sSUhacGMybGliR1VnUVVFS0lDQWdJQzh2SUhCaFpHUnBibWNzSUcxaGRHTm9hVzVuSUVkTVRXRnJhV1VuY3lCblpXOXRaWFJ5ZVNCemFHRmtaWElnWW1Wb1lYWnBiM0l1Q2lBZ0lDQjJaV015SUhCaFpHUmxaRjlpWW05NFgzTnBlbVVnUFNCaVltOTRYM0poWkdsMWN5QXJJSE5wWjI0b1ltSnZlRjl5WVdScGRYTXBJQ29nWW1KdmVGOWlkV1k3Q2lBZ0lDQjJaV015SUhWMlgzQmhaRjl6WTJGc1pTQTlJSEJoWkdSbFpGOWlZbTk0WDNOcGVtVWdMeUJpWW05NFgzSmhaR2wxY3pzS0NpQWdJQ0JtY21GblgyTnZiRzl5SUQwZ2RHOTJaV00wS0dkbGRGOTJaWEowWlhoZlkyOXNiM0lvS1NrN0NpQWdJQ0JtY21GblgzTjBjbTlyWldOdmJHOXlJRDBnZEc5MlpXTTBLR2RsZEY5amIyNTJaWEowWldSZmMzUnliMnRsWTI5c2IzSW9LU2s3Q2lBZ0lDQm1jbUZuWDNWMlgyOW1abk5sZEY5M2FXUjBhQ0E5SUdkbGRGOXpaR1pmZFhZb0tUc0tJQ0FnSUM4dklHZGxkRjkxZGlncElISmxkSFZ5Ym5NZ0tEQXNJREFwTENBb01Td2dNQ2tzSUNnd0xDQXhLU0J2Y2lBb01Td2dNU2tLSUNBZ0lDOHZJSFJ2SUdGalkyOXRiMlJoZEdVZ2MzUnliMnRsSUdGdVpDQm5iRzkzZDJsa2RHZ2dkMlVnYm1WbFpDQjBieUJsZUhSeWRXUmxJSFYySjNNZ2IzVjBkMkZ5WkhNZ1puSnZiU0FvTUM0MUxDQXdMalVwQ2lBZ0lDQm1jbUZuWDNWMklEMGdkbVZqTWlnd0xqVXBJQ3NnS0dkbGRGOTFkaWdwSUMwZ2RtVmpNaWd3TGpVcEtTQXFJSFYyWDNCaFpGOXpZMkZzWlRzS0NpQWdJQ0F2THlCelkzSmxaVzRnYzNCaFkyVWdZMjl2Y21ScGJtRjBaWE1nYjJZZ2RHaGxJSEJ2YzJsMGFXOXVDaUFnSUNCMlpXTTBJSEYxWVdSZmRtVnlkR1Y0SUQwZ0tIUnlZVzV6SUNvZ2RtVmpOQ2d5TGpBZ0tpQndZV1JrWldSZlltSnZlRjl6YVhwbElDb2daMlYwWDNCdmMybDBhVzl1S0Nrc0lEQXVNQ3dnTUM0d0tTazdDaUFnSUNCbmJGOVFiM05wZEdsdmJpQTlJSFpqYkdsd0lDc2djWFZoWkY5MlpYSjBaWGc3Q2lBZ0lDQm5iRjlRYjNOcGRHbHZiaTU2SUNzOUlHZHNYMUJ2YzJsMGFXOXVMbmNnS2lCblpYUmZaR1Z3ZEdoZmMyaHBablFvS1RzS0NpQWdJQ0JtY21GblgybHVjM1JoYm1ObFgybGtJRDBnZFdsdWRDaG5iRjlKYm5OMFlXNWpaVWxFS1RzS2ZRb0tyMlp5WVdkdFpXNTBYM052ZFhKalpkb2xIZ3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhVzUwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnWm14dllYUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnpZVzF3YkdWeU1rUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnpZVzF3YkdWeU0wUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnBjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXpSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSFZ6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjak5FT3dvS2IzVjBJSFpsWXpRZ1puSmhaMjFsYm5SZlkyOXNiM0k3Q2dvdkx5QlZibWxtYjNKdGN6b2dDblZ1YVdadmNtMGdZbTl2YkNCMWJtbG1iM0p0WDJOdmJHOXliV0Z3T3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXliV0Z3S0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSnRZWEE3ZlFwMWJtbG1iM0p0SUhWcGJuUWdiMkpxWldOMFgybGtPd3AxYVc1MElHZGxkRjl2WW1wbFkzUmZhV1FvS1h0eVpYUjFjbTRnYjJKcVpXTjBYMmxrTzMwS2RXNXBabTl5YlNCdFlYUTBJRzF2WkdWc1gyWXpNbU03Q20xaGREUWdaMlYwWDIxdlpHVnNYMll6TW1Nb0tYdHlaWFIxY200Z2JXOWtaV3hmWmpNeVl6dDlDblZ1YVdadmNtMGdhVzUwSUhOa1psOXRZWEpyWlhKZmMyaGhjR1U3Q21sdWRDQm5aWFJmYzJSbVgyMWhjbXRsY2w5emFHRndaU2dwZTNKbGRIVnliaUJ6WkdaZmJXRnlhMlZ5WDNOb1lYQmxPMzBLZFc1cFptOXliU0JtYkc5aGRDQm5iRzkzZDJsa2RHZzdDbVpzYjJGMElHZGxkRjluYkc5M2QybGtkR2dvS1h0eVpYUjFjbTRnWjJ4dmQzZHBaSFJvTzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JoZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVU3Q21ac2IyRjBJR2RsZEY5aGRHeGhjMTkwWlhoMGRYSmxYM05wZW1Vb0tYdHlaWFIxY200Z1lYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbE8zMEtkVzVwWm05eWJTQmliMjlzSUhCaGRIUmxjbTQ3Q21KdmIyd2daMlYwWDNCaGRIUmxjbTRvS1h0eVpYUjFjbTRnY0dGMGRHVnlianQ5Q25WdWFXWnZjbTBnWW05dmJDQndhV05yYVc1bk93cGliMjlzSUdkbGRGOXdhV05yYVc1bktDbDdjbVYwZFhKdUlIQnBZMnRwYm1jN2ZRcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsT3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJVb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjbkpoYm1kbE8zMEtkVzVwWm05eWJTQm1iRzloZENCd2VGOXdaWEpmZFc1cGREc0tabXh2WVhRZ1oyVjBYM0I0WDNCbGNsOTFibWwwS0NsN2NtVjBkWEp1SUhCNFgzQmxjbDkxYm1sME8zMEtkVzVwWm05eWJTQnpZVzF3YkdWeU1rUWdaR2x6ZEdGdVkyVm1hV1ZzWkRzS2RXNXBabTl5YlNCMlpXTTBJRzVoYmw5amIyeHZjanNLZG1Wak5DQm5aWFJmYm1GdVgyTnZiRzl5S0NsN2NtVjBkWEp1SUc1aGJsOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1pteHZZWFFnYzNSeWIydGxkMmxrZEdnN0NtWnNiMkYwSUdkbGRGOXpkSEp2YTJWM2FXUjBhQ2dwZTNKbGRIVnliaUJ6ZEhKdmEyVjNhV1IwYUR0OUNuVnVhV1p2Y20wZ2RtVmpNeUJtTXpKalgzTmpZV3hsT3dwMlpXTXpJR2RsZEY5bU16SmpYM05qWVd4bEtDbDdjbVYwZFhKdUlHWXpNbU5mYzJOaGJHVTdmUXAxYm1sbWIzSnRJSFpsWXpJZ2NtVnpiMngxZEdsdmJqc0tkbVZqTWlCblpYUmZjbVZ6YjJ4MWRHbHZiaWdwZTNKbGRIVnliaUJ5WlhOdmJIVjBhVzl1TzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JrWlhCMGFGOXphR2xtZERzS1pteHZZWFFnWjJWMFgyUmxjSFJvWDNOb2FXWjBLQ2w3Y21WMGRYSnVJR1JsY0hSb1gzTm9hV1owTzMwS2RXNXBabTl5YlNCMlpXTTBJR3h2ZDJOc2FYQmZZMjlzYjNJN0NuWmxZelFnWjJWMFgyeHZkMk5zYVhCZlkyOXNiM0lvS1h0eVpYUjFjbTRnYkc5M1kyeHBjRjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCaWFXeHNZbTloY21RN0NtSnZiMndnWjJWMFgySnBiR3hpYjJGeVpDZ3BlM0psZEhWeWJpQmlhV3hzWW05aGNtUTdmUXAxYm1sbWIzSnRJRzFoZERRZ2NISmxjSEp2YW1WamRHbHZianNLYldGME5DQm5aWFJmY0hKbGNISnZhbVZqZEdsdmJpZ3BlM0psZEhWeWJpQndjbVZ3Y205cVpXTjBhVzl1TzMwS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNJN0NtSnZiMndnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0lvS1h0eVpYUjFjbTRnZFc1cFptOXliVjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdkbVZqTkNCb2FXZG9ZMnhwY0Y5amIyeHZjanNLZG1Wak5DQm5aWFJmYUdsbmFHTnNhWEJmWTI5c2IzSW9LWHR5WlhSMWNtNGdhR2xuYUdOc2FYQmZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnWjJ4dmQyTnZiRzl5T3dwMlpXTTBJR2RsZEY5bmJHOTNZMjlzYjNJb0tYdHlaWFIxY200Z1oyeHZkMk52Ykc5eU8zMEtkVzVwWm05eWJTQmliMjlzSUhSeVlXNXpabTl5YlY5dFlYSnJaWEk3Q21KdmIyd2daMlYwWDNSeVlXNXpabTl5YlY5dFlYSnJaWElvS1h0eVpYUjFjbTRnZEhKaGJuTm1iM0p0WDIxaGNtdGxjanQ5Q2dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnWm14dllYUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnBiblE3Q2dwcGJpQjJaV00wSUdaeVlXZGZZMjlzYjNJN0NtbHVJSFpsWXpJZ1puSmhaMTkxZGpzS0NpTmtaV1pwYm1VZ1EwbFNRMHhGSUNBZ0lDQWdJQ0FnSUNBZ01Bb2paR1ZtYVc1bElGSkZRMVJCVGtkTVJTQWdJQ0FnSUNBZ0lERUtJMlJsWm1sdVpTQlNUMVZPUkVWRVgxSkZRMVJCVGtkTVJTQXlDaU5rWldacGJtVWdSRWxUVkVGT1EwVkdTVVZNUkNBZ0lDQWdNd29qWkdWbWFXNWxJRlJTU1VGT1IweEZJQ0FnSUNBZ0lDQWdJRFFLQ2lOa1pXWnBibVVnVFY5VFVWSlVYeklnSUNBZ0lDQWdJQ0FnTVM0ME1UUXlNVE0xQ2dvS0x5OGdTR0ZzWmlCM2FXUjBhQ0J2WmlCaGJuUnBZV3hwWVhOcGJtY2djMjF2YjNSb2MzUmxjQW9qWkdWbWFXNWxJRUZPVkVsQlRFbEJVMTlTUVVSSlZWTWdNQzQzTURjeE1EWTNPREV4T0RZMU5EYzJDZ3BwYmlCbWJHOWhkQ0JtY21GblgzVjJjMk5oYkdVN0NtbHVJR1pzYjJGMElHWnlZV2RmWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlRzS2FXNGdkbVZqTkNCbWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFEc0tabXhoZENCcGJpQjFhVzUwSUdaeVlXZGZhVzV6ZEdGdVkyVmZhV1E3Q21sdUlHWnNiMkYwSUc5ZlkyeHBjRjlrYVhOMFlXNWpaVnM0WFRzS1pteGhkQ0JwYmlCMlpXTXlJR1pmYzNCeWFYUmxYM05qWVd4bE93cG1iR0YwSUdsdUlIWmxZelFnWm5KaFoxOXpkSEp2YTJWamIyeHZjanNLQ25WdWFXWnZjbTBnYVc1MElIVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6T3dvS0x5OGdWR2hsYzJVZ2RtVnljMmx2Ym5NZ2IyWWdZV0Z6ZEdWd0lHRnpjM1Z0WlNCMGFHRjBJR0JrYVhOMFlDQnBjeUJoSUhOcFoyNWxaQ0JrYVhOMFlXNWpaU0JtZFc1amRHbHZiZ292THlCM2FHbGphQ0JvWVhNZ1ltVmxiaUJ6WTJGc1pXUWdkRzhnWW1VZ2FXNGdkVzVwZEhNZ2IyWWdjR2w0Wld4ekxncG1iRzloZENCaFlYTjBaWEFvWm14dllYUWdkR2h5WlhOb2IyeGtNU3dnWm14dllYUWdaR2x6ZEN3Z1pteHZZWFFnWVdFcElIc0tJQ0FnSUhKbGRIVnliaUJ6Ylc5dmRHaHpkR1Z3S0hSb2NtVnphRzlzWkRFZ0xTQmhZU3dnZEdoeVpYTm9iMnhrTVNBcklHRmhMQ0JrYVhOMEtUc0tmUW9LWm14dllYUWdZV0Z6ZEdWd0tHWnNiMkYwSUhSb2NtVnphRzlzWkRFc0lHWnNiMkYwSUhSb2NtVnphRzlzWkRJc0lHWnNiMkYwSUdScGMzUXNJR1pzYjJGMElHRmhLU0I3Q2lBZ0lDQnlaWFIxY200Z2MyMXZiM1JvYzNSbGNDaDBhSEpsYzJodmJHUXhJQzBnWVdFc0lIUm9jbVZ6YUc5c1pERWdLeUJoWVN3Z1pHbHpkQ2tnTFFvZ0lDQWdJQ0FnSUNBZ0lITnRiMjkwYUhOMFpYQW9kR2h5WlhOb2IyeGtNaUF0SUdGaExDQjBhSEpsYzJodmJHUXlJQ3NnWVdFc0lHUnBjM1FwT3dwOUNnb3ZMeUJRY205alpXUjFjbUZzSUhOcFoyNWxaQ0JrYVhOMFlXNWpaU0JtZFc1amRHbHZibk1nYjI0Z2RHaGxJSFYySUdOdmIzSmthVzVoZEdVZ2NHRjBZMmdnV3pBc01WMTRXekFzTVYwS0x5OGdUbTkwWlNCMGFHRjBJR1p2Y2lCaGJuUnBZV3hwWVhOcGJtY2dkRzhnZDI5eWF5QndjbTl3WlhKc2VTQjBhR1Z6WlNCemFHOTFiR1FnWW1VZ0tuTmpZV3hsSUhCeVpYTmxjblpwYm1jcUNpOHZJQ2hKWmlCNWIzVWdiWFZ6ZENCeVpYTmpZV3hsSUhWMkxDQnRZV3RsSUhOMWNtVWdkRzhnY0hWMElIUm9aU0J6WTJGc1pTQm1ZV04wYjNJZ1ltRmpheUJwYmlCc1lYUmxjaTRwQ21ac2IyRjBJSFJ5YVdGdVoyeGxLSFpsWXpJZ1VDbDdDaUFnSUNCUUlDMDlJSFpsWXpJb01DNDFLVHNLSUNBZ0lHWnNiMkYwSUhnZ1BTQk5YMU5SVWxSZk1pQXFJQ2hRTG5nZ0xTQlFMbmtwT3dvZ0lDQWdabXh2WVhRZ2VTQTlJRTFmVTFGU1ZGOHlJQ29nS0ZBdWVDQXJJRkF1ZVNrN0NpQWdJQ0JtYkc5aGRDQnlNU0E5SUcxaGVDaGhZbk1vZUNrc0lHRmljeWg1S1NrZ0xTQXhMakF2S0RJdU1DcE5YMU5SVWxSZk1pazdDaUFnSUNCbWJHOWhkQ0J5TWlBOUlGQXVlVHNLSUNBZ0lISmxkSFZ5YmlBdGJXRjRLSEl4TEhJeUtUc0tmUW9LWm14dllYUWdZMmx5WTJ4bEtIWmxZeklnZFhZcGV3b2dJQ0FnY21WMGRYSnVJREF1TlMxc1pXNW5kR2dvZFhZdGRtVmpNaWd3TGpVcEtUc0tmUW9LWm14dllYUWdjbVZqZEdGdVoyeGxLSFpsWXpJZ2RYWXBJSHNLSUNBZ0lIWmxZeklnY3lBOUlHWmZjM0J5YVhSbFgzTmpZV3hsSUM4Z2JXbHVLR1pmYzNCeWFYUmxYM05qWVd4bExuZ3NJR1pmYzNCeWFYUmxYM05qWVd4bExua3BPd29nSUNBZ2RtVmpNaUJrSUQwZ2N5QXFJRzFoZUNndGRYWXNJSFYySUMwZ2RtVmpNaWd4S1NrN0NpQWdJQ0J5WlhSMWNtNGdMU2dvYkdWdVozUm9LRzFoZUNoMlpXTXlLREF1TUNrc0lHUXBLU0FySUcxcGJpZ3dMakFzSUcxaGVDaGtMbmdzSUdRdWVTa3BLU2s3Q24wS0NtWnNiMkYwSUhKdmRXNWtaV1JmY21WamRHRnVaMnhsS0habFl6SWdkWFlzSUhabFl6SWdkR3dzSUhabFl6SWdZbklwZXdvZ0lDQWdkbVZqTWlCa0lEMGdiV0Y0S0hSc0xYVjJMQ0IxZGkxaWNpazdDaUFnSUNCeVpYUjFjbTRnTFNnb2JHVnVaM1JvS0cxaGVDaDJaV015S0RBdU1Da3NJR1FwS1NBcklHMXBiaWd3TGpBc0lHMWhlQ2hrTG5nc0lHUXVlU2twS1MxMGJDNTRLVHNLZlFvS2RtVmpOQ0JtYVd4c0tIWmxZelFnWm1sc2JHTnZiRzl5TENCMlpXTTBJR052Ykc5eUxDQjJaV015SUhWMktTQjdDaUFnSUNCeVpYUjFjbTRnWTI5c2IzSTdDbjBLZG1Wak5DQm1hV3hzS0habFl6UWdabWxzYkdOdmJHOXlMQ0JtYkc5aGRDQmpiMnh2Y2l3Z2RtVmpNaUIxZGlrZ2V3b2dJQ0FnY21WMGRYSnVJR1pwYkd4amIyeHZjanNLZlFwMlpXTTBJR1pwYkd3b2RtVmpOQ0JtYVd4c1kyOXNiM0lzSUdKdmIyd2dhVzFoWjJVc0lIWmxZeklnZFhZcElIc2djbVYwZFhKdUlHWnBiR3hqYjJ4dmNqc2dmUXAyWldNMElHWnBiR3dvZG1Wak5DQmpMQ0J6WVcxd2JHVnlNa1FnYVcxaFoyVXNJSFpsWXpJZ2RYWXBJSHNnY21WMGRYSnVJSFJsZUhSMWNtVW9hVzFoWjJVc0lIVjJMbmw0S1RzZ2ZRb0tkbTlwWkNCemRISnZhMlVvZG1Wak5DQnpkSEp2YTJWamIyeHZjaXdnWm14dllYUWdjMmxuYm1Wa1gyUnBjM1JoYm1ObExDQm1iRzloZENCM2FXUjBhQ3dnYVc1dmRYUWdkbVZqTkNCamIyeHZjaXdnWm14dllYUWdZV0ZmY21Ga2FYVnpLWHNLSUNBZ0lHbG1JQ2gzYVdSMGFDQWhQU0F3TGpBcGV3b2dJQ0FnSUNBZ0lHWnNiMkYwSUhRZ1BTQmhZWE4wWlhBb2JXbHVLSGRwWkhSb0xDQXdMakFwTENCdFlYZ29kMmxrZEdnc0lEQXVNQ2tzSUhOcFoyNWxaRjlrYVhOMFlXNWpaU3dnWVdGZmNtRmthWFZ6S1RzS0lDQWdJQ0FnSUNCMlpXTTBJR0puWDJOdmJHOXlJRDBnYldsNEtHTnZiRzl5TENCMlpXTTBLSE4wY205clpXTnZiRzl5TG5Kbllpd2dNQ2tzSUdac2IyRjBLSE5wWjI1bFpGOWthWE4wWVc1alpTQThJREF1TlNBcUlIZHBaSFJvS1NrN0NpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCdGFYZ29ZbWRmWTI5c2IzSXNJSE4wY205clpXTnZiRzl5TENCMEtUc0tJQ0FnSUgwS2ZRb0tkbTlwWkNCbmJHOTNLSFpsWXpRZ1oyeHZkMk52Ykc5eUxDQm1iRzloZENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdac2IyRjBJR2x1YzJsa1pTd2dhVzV2ZFhRZ2RtVmpOQ0JqYjJ4dmNpbDdDaUFnSUNCbWJHOWhkQ0JuYkc5M1gzZHBaSFJvSUQwZ1oyVjBYMmRzYjNkM2FXUjBhQ2dwSUNvZ1oyVjBYM0I0WDNCbGNsOTFibWwwS0NrN0NpQWdJQ0JtYkc5aGRDQnpkSEp2YTJWZmQybGtkR2dnUFNCblpYUmZjM1J5YjJ0bGQybGtkR2dvS1NBcUlHZGxkRjl3ZUY5d1pYSmZkVzVwZENncE93b2dJQ0FnYVdZZ0tHZHNiM2RmZDJsa2RHZ2dQaUF3TGpBcGV3b2dJQ0FnSUNBZ0lHWnNiMkYwSUc5MWRITnBaR1VnUFNBb1lXSnpLSE5wWjI1bFpGOWthWE4wWVc1alpTa2dMU0J6ZEhKdmEyVmZkMmxrZEdncElDOGdaMnh2ZDE5M2FXUjBhRHNLSUNBZ0lDQWdJQ0JtYkc5aGRDQmhiSEJvWVNBOUlERXVNQ0F0SUc5MWRITnBaR1U3Q2lBZ0lDQWdJQ0FnWTI5c2IzSWdQU0J0YVhnb2RtVmpOQ2huYkc5M1kyOXNiM0l1Y21kaUxDQm5iRzkzWTI5c2IzSXVZU3BoYkhCb1lTa3NJR052Ykc5eUxDQnBibk5wWkdVcE93b2dJQ0FnZlFwOUNncG1iRzloZENCelkyRnNaV1JmWkdsemRHRnVZMlZtYVdWc1pDaHpZVzF3YkdWeU1rUWdaR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RtVmpNaUIxZGlsN0NpQWdJQ0F2THlCSGJIbHdhQ0JrYVhOMFlXNWpaU0JtYVdWc1pDQjFibWwwY3lCaGNtVWdhVzRnY0dsNFpXeHpMaUJEYjI1MlpYSjBJSFJ2SUhOaGJXVWdaR2x6ZEdGdVkyVUtJQ0FnSUM4dklITmpZV3hwYm1jZ1lYTWdabDkxZGk1NElHWnZjaUJqYjI1emFYTjBaVzVqZVNCM2FYUm9JSFJvWlNCd2NtOWpaV1IxY21Gc0lITnBaMjVsWkY5a2FYTjBZVzVqWlFvZ0lDQWdMeThnWTJGc1kzVnNZWFJwYjI1ekxnb2dJQ0FnY21WMGRYSnVJR1p5WVdkZlpHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pTQXFJSFJsZUhSMWNtVW9aR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RYWXBMbkk3Q24wS0NtWnNiMkYwSUhOallXeGxaRjlrYVhOMFlXNWpaV1pwWld4a0tHSnZiMndnWkdsemRHRnVZMlZtYVdWc1pDd2dkbVZqTWlCMWRpbDdDaUFnSUNCeVpYUjFjbTRnTUM0d093cDlDZ292THlCSGFYWmxiaUJoSUdaeVlXZHRaVzUwSUdSbGNtbDJZWFJwZG1VZ2IyWWdabDkxZGlBb2FTNWxMaUJrUm1SNEtHWmZkWFlwSUc5eUlHUkdaSGtvWmw5MWRpa3BMQ0JqWVd4amRXeGhkR1VLTHk4Z2RHaGxJR0Z6YzI5amFXRjBaV1FnS0hOeGRXRnlaV1FwSUdOb1lXNW5aU0JwYmlCMGFHVWdaR2x6ZEdGdVkyVm1hV1ZzWkM0Z1ZHaHBjeUJwY3lCbFptWmxZM1JwZG1Wc2VTQjBhR1VLTHk4Z0tITnhkV0Z5WldRcElIQmhjblJwWVd3Z1pHVnlhWFpoZEdsMlpTQnZaaUIwYUdVZ1pHbHpkR0Z1WTJWbWFXVnNaQ0IzYVhSb0lISmxjM0JsWTNRZ2RHOGdabkpoWjIxbGJuUUtMeThnS0hCcGVHVnNLU0JqYjI5eVpHbHVZWFJsY3dwbWJHOWhkQ0J6Y1hWaGNtVmtYM0JoY25ScFlXeGZaR1Z5YVhaaGRHVW9abXh2WVhRZ1kyVnVkR1Z5TENCMlpXTXlJR1JtWDNWMktTQjdDaUFnSUNCMlpXTXlJSFYyTVNBOUlHMXBlQ2htY21GblgzVjJYMjltWm5ObGRGOTNhV1IwYUM1NGVTd2dabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2d1ZW5jc0lHTnNZVzF3S0daeVlXZGZkWFlnS3lBd0xqVWdLaUJrWmw5MWRpd2dNQzR3TENBeExqQXBLVHNLSUNBZ0lIWmxZeklnZFhZd0lEMGdiV2w0S0daeVlXZGZkWFpmYjJabWMyVjBYM2RwWkhSb0xuaDVMQ0JtY21GblgzVjJYMjltWm5ObGRGOTNhV1IwYUM1NmR5d2dZMnhoYlhBb1puSmhaMTkxZGlBdElEQXVOU0FxSUdSbVgzVjJMQ0F3TGpBc0lERXVNQ2twT3dvZ0lDQWdMeThnU1hRZ1kyRnVJR2hoY0hCbGJpQjBhR0YwSUc5MWNpQm1jbUZuYldWdWRDQnBjeUJqYkc5elpTQjBieUJoSUcxaGVHbHRkVzBnYVc0Z2RHaGxJR1JwYzNSaGJtTmxabWxsYkdRS0lDQWdJQzh2SUhSbGVIUjFjbVV1SUVsdUlIUm9hWE1nWTJGelpTQjBhR1VnWkdWeWFYWmhkR1VnWW1GelpXUWdiMjRnWVNCd2IybHVkQ0IwYnlCMGFHVWdiR1ZtZENCaGJtUWdjbWxuYUhRS0lDQWdJQzh2SUdOaGJpQmlaU0JqYkc5elpTQjBieUF3SUhkb1pXNGdhWFFnYzJodmRXeGtiaWQwSUdKbExpQlVieUJoZG05cFpDQjBhR2x6SUhkbElHTmhiR04xYkdGMFpTQmhDaUFnSUNBdkx5QmtaWEpwZG1GMGFYWmxJSFJ2SUdWcGRHaGxjaUJ6YVdSbElHRnVaQ0IwWVd0bElIUm9aU0J6ZEhKdmJtZGxjaUJ2Ym1VdUNpQWdJQ0JtYkc5aGRDQmtaakVnUFNCelkyRnNaV1JmWkdsemRHRnVZMlZtYVdWc1pDaGthWE4wWVc1alpXWnBaV3hrTENCMWRqRXBJQzBnWTJWdWRHVnlPd29nSUNBZ1pteHZZWFFnWkdZeUlEMGdZMlZ1ZEdWeUlDMGdjMk5oYkdWa1gyUnBjM1JoYm1ObFptbGxiR1FvWkdsemRHRnVZMlZtYVdWc1pDd2dkWFl3S1RzS0lDQWdJSEpsZEhWeWJpQXlMakFnS2lCdFlYZ29aR1l4SUNvZ1pHWXhMQ0JrWmpJZ0tpQmtaaklwT3dwOUNnb3ZMeUJEWVd4amRXeGhkR1VnZEdobElHRnVkR2t0WVd4cFlYTnBibWNnY21Ga2FYVnpJR0poYzJWa0lHOXVJR2h2ZHlCdGRXTm9JSFJvWlNCa2FYTjBZVzVqWlNCbWFXVnNaQ0JqYUdGdVoyVnpDaTh2SUhKbGJHRjBhWFpsSUhSdklHNWxhV2RvWW05eWFXNW5JSE5oYlhCc1pYTXVJRWxtSUhSb1pTQmtjbUYzYmlCeGRXRmtJSE5oYlhCc1pYTWdkR2hsSUdScGMzUmhibU5sSUdacFpXeGtDaTh2SUhkcGRHZ2djMjl0WlNCa2FYTjBiM0owYVc5dUxDQnBkQ0IzYVd4c0lHSmxJSEJwWTJ0bFpDQjFjQ0JvWlhKbElHRnVaQ0JqYjIxd1pXNXpZWFJsWkNCcGJpQmphR0Z1WjJWeklIUnZDaTh2SUhSb1pTQmhiblJwTFdGc2FXRnphVzVuSUhKaFpHbDFjeTRLWm14dllYUWdZWE53WldOMFgyTnZjbkpsWTNSbFpGOXNiMk5oYkY5aFlWOXlZV1JwZFhNb1pteHZZWFFnYzJsbmJtVmtYMlJwYzNSaGJtTmxLU0I3Q2lBZ0lDQnlaWFIxY200Z1puSmhaMTkxZG5OallXeGxJQ29nUVU1VVNVRk1TVUZUWDFKQlJFbFZVeUFxSUUxZlUxRlNWRjh5SUNvZ2MzRnlkQ2dLSUNBZ0lDQWdJQ0J6Y1hWaGNtVmtYM0JoY25ScFlXeGZaR1Z5YVhaaGRHVW9jMmxuYm1Wa1gyUnBjM1JoYm1ObExDQmtSbVI0S0daeVlXZGZkWFlwS1NBckNpQWdJQ0FnSUNBZ2MzRjFZWEpsWkY5d1lYSjBhV0ZzWDJSbGNtbDJZWFJsS0hOcFoyNWxaRjlrYVhOMFlXNWpaU3dnWkVaa2VTaG1jbUZuWDNWMktTa0tJQ0FnSUNrN0NuMEtDblpsWXpJZ1pXNWpiMlJsWDNWcGJuUmZkRzlmWm14dllYUW9kV2x1ZENCMllXeDFaU2tnZXdvZ0lDQWdabXh2WVhRZ2JHOTNaWElnUFNCbWJHOWhkQ2gyWVd4MVpTQW1JREI0UmtaR1JuVXBJQzhnTmpVMU16VXVNRHNLSUNBZ0lHWnNiMkYwSUhWd2NHVnlJRDBnWm14dllYUW9kbUZzZFdVZ1BqNGdNVFoxS1NBdklEWTFOVE0xTGpBN0NpQWdJQ0J5WlhSMWNtNGdkbVZqTWloc2IzZGxjaXdnZFhCd1pYSXBPd3A5Q2dwMlpXTTBJSEJoWTJ0ZmFXNTBLSFZwYm5RZ2FXUXNJSFZwYm5RZ2FXNWtaWGdwSUhzS0lDQWdJSFpsWXpRZ2RXNXdZV05yT3dvZ0lDQWdkVzV3WVdOckxuSm5JRDBnWlc1amIyUmxYM1ZwYm5SZmRHOWZabXh2WVhRb2FXUXBPd29nSUNBZ2RXNXdZV05yTG1KaElEMGdaVzVqYjJSbFgzVnBiblJmZEc5ZlpteHZZWFFvYVc1a1pYZ3BPd29nSUNBZ2NtVjBkWEp1SUhWdWNHRmphenNLZlFvS2RtOXBaQ0J0WVdsdUtDa2dld29nSUNBZ1ptOXlJQ2hwYm5RZ2FTQTlJREE3SUdrZ1BDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzZ2FTc3JLUW9nSUNBZ0lDQWdJR2xtSUNodlgyTnNhWEJmWkdsemRHRnVZMlZiYVYwZ1BDQXdMakFwQ2lBZ0lDQWdJQ0FnSUNBZ0lHUnBjMk5oY21RN0Nnb2dJQ0FnWm14dllYUWdjMmxuYm1Wa1gyUnBjM1JoYm1ObElEMGdNQzR3T3dvS0lDQWdJSFpsWXpRZ2RYWmZiMlptSUQwZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZzdDaUFnSUNCMlpXTXlJSFJsZUY5MWRpQTlJRzFwZUNoMWRsOXZabVl1ZUhrc0lIVjJYMjltWmk1NmR5d2dZMnhoYlhBb1puSmhaMTkxZGl3Z01DNHdMQ0F4TGpBcEtUc0tJQ0FnSUdac2IyRjBJR0ZoWDNKaFpHbDFjeUE5SUVGT1ZFbEJURWxCVTE5U1FVUkpWVk03Q2dvZ0lDQWdhVzUwSUhOb1lYQmxJRDBnWjJWMFgzTmtabDl0WVhKclpYSmZjMmhoY0dVb0tUc0tJQ0FnSUdsbUtITm9ZWEJsSUQwOUlFTkpVa05NUlNrS0lDQWdJQ0FnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnUFNCamFYSmpiR1VvWm5KaFoxOTFkaWs3Q2lBZ0lDQmxiSE5sSUdsbUtITm9ZWEJsSUQwOUlFUkpVMVJCVGtORlJrbEZURVFwSUhzS0lDQWdJQ0FnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnUFNCelkyRnNaV1JmWkdsemRHRnVZMlZtYVdWc1pDaGthWE4wWVc1alpXWnBaV3hrTENCMFpYaGZkWFlwT3dvZ0lDQWdJQ0FnSUdGaFgzSmhaR2wxY3lBOUlHRnpjR1ZqZEY5amIzSnlaV04wWldSZmJHOWpZV3hmWVdGZmNtRmthWFZ6S0hOcFoyNWxaRjlrYVhOMFlXNWpaU2s3Q2lBZ0lDQWdJQ0FnYVdZZ0tHZGxkRjl6ZEhKdmEyVjNhV1IwYUNncElENGdNQzR3SUh4OElHZGxkRjluYkc5M2QybGtkR2dvS1NBK0lEQXVNQ2tnZXdvZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJEYjIxd1pXNXpZWFJsSUdadmNpQjBhR1VnWTJ4aGJYQnBibWNnYjJZZ2RHVjRYM1YySUdKNUlHRnVJR0Z3Y0hKdmVHbHRZWFJsQ2lBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1Y0ZEdWdWMybHZiaUJ2WmlCMGFHVWdjMmxuYm1Wa0lHUnBjM1JoYm1ObElHOTFkSE5wWkdVZ2RHaGxJSFpoYkdsa0lIUmxlSFIxY21VS0lDQWdJQ0FnSUNBZ0lDQWdMeThnY21WbmFXOXVMZ29nSUNBZ0lDQWdJQ0FnSUNCMlpXTXlJR0oxWm5WMklEMGdabkpoWjE5MWRpQXRJR05zWVcxd0tHWnlZV2RmZFhZc0lEQXVNQ3dnTVM0d0tUc0tJQ0FnSUNBZ0lDQWdJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJQzA5SUd4bGJtZDBhQ2hpZFdaMWRpazdDaUFnSUNBZ0lDQWdmUW9nSUNBZ2ZTQmxiSE5sSUdsbUtITm9ZWEJsSUQwOUlGSlBWVTVFUlVSZlVrVkRWRUZPUjB4RktRb2dJQ0FnSUNBZ0lITnBaMjVsWkY5a2FYTjBZVzVqWlNBOUlISnZkVzVrWldSZmNtVmpkR0Z1WjJ4bEtHWnlZV2RmZFhZc0lIWmxZeklvTUM0eUtTd2dkbVZqTWlnd0xqZ3BLVHNLSUNBZ0lHVnNjMlVnYVdZb2MyaGhjR1VnUFQwZ1VrVkRWRUZPUjB4RktRb2dJQ0FnSUNBZ0lITnBaMjVsWkY5a2FYTjBZVzVqWlNBOUlISmxZM1JoYm1kc1pTaG1jbUZuWDNWMktUc2dMeThnY21WamRHRnVaMnhsS0daZmRYWXBPd29nSUNBZ1pXeHpaU0JwWmloemFHRndaU0E5UFNCVVVrbEJUa2RNUlNrS0lDQWdJQ0FnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnUFNCMGNtbGhibWRzWlNobWNtRm5YM1YyS1RzS0NpQWdJQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVWdLajBnWm5KaFoxOTFkbk5qWVd4bE93b0tDaUFnSUNCbWJHOWhkQ0J6ZEhKdmEyVmZkMmxrZEdnZ1BTQm5aWFJmYzNSeWIydGxkMmxrZEdnb0tTQXFJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BPd29nSUNBZ1pteHZZWFFnYVc1emFXUmxYM04wWVhKMElEMGdiV0Y0S0MxemRISnZhMlZmZDJsa2RHZ3NJREF1TUNrN0NpQWdJQ0JtYkc5aGRDQnBibk5wWkdVZ1BTQmhZWE4wWlhBb2FXNXphV1JsWDNOMFlYSjBMQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVXNJR0ZoWDNKaFpHbDFjeWs3Q2dvZ0lDQWdkbVZqTkNCbWFXNWhiRjlqYjJ4dmNpQTlJR1pwYkd3b1puSmhaMTlqYjJ4dmNpd2dkVzVwWm05eWJWOWpiMnh2Y2l3Z1puSmhaMTkxZGlrN0NpQWdJQ0JtYVc1aGJGOWpiMnh2Y2k1aElEMGdabWx1WVd4ZlkyOXNiM0l1WVNBcUlHbHVjMmxrWlRzS0NpQWdJQ0J6ZEhKdmEyVW9abkpoWjE5emRISnZhMlZqYjJ4dmNpd2djMmxuYm1Wa1gyUnBjM1JoYm1ObExDQXRjM1J5YjJ0bFgzZHBaSFJvTENCbWFXNWhiRjlqYjJ4dmNpd2dZV0ZmY21Ga2FYVnpLVHNLSUNBZ0lHZHNiM2NvWjJWMFgyZHNiM2RqYjJ4dmNpZ3BMQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVXNJR0ZoYzNSbGNDZ3RjM1J5YjJ0bFgzZHBaSFJvTENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdGaFgzSmhaR2wxY3lrc0lHWnBibUZzWDJOdmJHOXlLVHNLQ2lBZ0lDQXZMeUJrWldKMVp5QXRJSE5vYjNjZ1ltRmphMmR5YjNWdVpBb2dJQ0FnTHk4Z1ptbHVZV3hmWTI5c2IzSXVZU0E5SUdOc1lXMXdLR1pwYm1Gc1gyTnZiRzl5TG1Fc0lEQXVNQ3dnTVM0d0tUc0tJQ0FnSUM4dklHWnBibUZzWDJOdmJHOXlJRDBnZG1Wak5DZ0tJQ0FnSUM4dklDQWdJQ0IyWldNektERXNNQ3d3S1NBcUlDZ3hMakFnTFNCbWFXNWhiRjlqYjJ4dmNpNWhLU0FySUdacGJtRnNYMk52Ykc5eUxuSm5ZaUFxSUdacGJtRnNYMk52Ykc5eUxtRXNDaUFnSUNBdkx5QWdJQ0FnTUM0MElDc2dNQzQySUNvZ1ptbHVZV3hmWTI5c2IzSXVZUW9nSUNBZ0x5OGdLVHNLQ2lBZ0lDQnBaaUFvY0dsamEybHVaeWtnZXdvZ0lDQWdJQ0FnSUdsbUlDaG1hVzVoYkY5amIyeHZjaTVoSUQ0Z01DNHhLU0I3Q2lBZ0lDQWdJQ0FnSUNBZ0lHWnlZV2R0Wlc1MFgyTnZiRzl5SUQwZ2NHRmphMTlwYm5Rb2IySnFaV04wWDJsa0xDQm1jbUZuWDJsdWMzUmhibU5sWDJsa0tUc0tJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0JrYVhOallYSmtPd29nSUNBZ0lDQWdJSDBLSUNBZ0lDQWdJQ0J5WlhSMWNtNDdDaUFnSUNCOUNnb2dJQ0FnYVdZZ0tHWnBibUZzWDJOdmJHOXlMbUVnUEQwZ01DNHdLWHNLSUNBZ0lDQWdJQ0JrYVhOallYSmtPd29nSUNBZ2ZRb2dJQ0FnWm5KaFoyMWxiblJmWTI5c2IzSWdQU0JtYVc1aGJGOWpiMnh2Y2pzS2ZRcXBjR3h2ZEY5MGVYQmxwMU5qWVhSMFpYS25kWEJrWVhSbGNzY0ZhS1F4TlRZeHMybHVjM1JoYm1ObFgyRjBkSEpwWW5WMFpYT0lzbU52Ym5abGNuUmxaRjl5YjNSaGRHbHZib0tyZEhsd1pWOXNaVzVuZEdnRXBHWnNZWFRIY0JjQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9xbkYxWVdSZmMyTmhiR1dDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHdBWHJXMWhjbXRsY2w5dlptWnpaWFNDcTNSNWNHVmZiR1Z1WjNSb0E2Um1iR0YweDFRWGh4WjV3TVVnVk1FQUFBQUFoeFo1d01VZ1ZNRUFBQUFBaHhaNXdNVWdWTUVBQUFBQWh4WjV3TVVnVk1FQUFBQUFoeFo1d01VZ1ZNRUFBQUFBaHhaNXdNVWdWTUVBQUFBQWh4WjV3TVVnVk1FQUFBQUF0V052Ym5abGNuUmxaRjl6ZEhKdmEyVmpiMnh2Y29LcmRIbHdaVjlzWlc1bmRHZ0VwR1pzWVhUSGNCY0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBcG5Oa1psOTFkb0tyZEhsd1pWOXNaVzVuZEdnRXBHWnNZWFRIQUJldGQyZHNYM0J2YzJsMGFXOXVjNEtyZEhsd1pWOXNaVzVuZEdnQ3BHWnNZWFRIT0JkZGRNdENBQUJNUW1YOFBVTUFBRXhDVGgrTFF3QUFURUpxUUxkREFBQk1Rb1ZoNDBNQUFFeENVTUVIUkFBQVRFTGUwUjFFQUFCTVFxeDJaWEowWlhoZlkyOXNiM0tDcTNSNWNHVmZiR1Z1WjNSb0JLUm1iR0YweDNBWEFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNnR4ZFdGa1gyOW1abk5sZElLcmRIbHdaVjlzWlc1bmRHZ0NwR1pzWVhUSEFCZU1ySFJ5WVc1emNHRnlaVzVqZWNLbWVuWmhiSFZseWdBQUFBQ2tibUZ0WmRrZ2JHbHVaWE5sWjIxbGJuUnpMVFkxTlRVMk1qVTNNVFl6TWpjd05qQXdNVGlwWTJGdFgzTndZV05scEdSaGRHR29kVzVwWm05eWJYT09zblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEszZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFwMnhwYm1WallYQUFxMlJsY0hSb1gzTm9hV1oweWdBQUFBQ3ZkVzVwWm05eWJWOXdZWFIwWlhKdXdxNW9hV2RvWTJ4cGNGOWpiMnh2Y3RnWGdFVitQK2o1WnovMVl4TStBQUNBUDdOMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weng0QVhBQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczZuZG1semFXSnNaY09vYjNabGNtUnlZWGZDcTJselgzTmxaMjFsYm5Senc2cGhkSFJ5YVdKMWRHVnpnN0YxYm1sbWIzSnRYMnhwYm1WM2FXUjBhSUtyZEhsd1pWOXNaVzVuZEdnQnBHWnNZWFRIQUJlcWJHbHVaVjlqYjJ4dmNvS3JkSGx3WlY5c1pXNW5kR2dFcEdac1lYVEhBQmU2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0E2Um1iR0YweHdBWHBIVjFhV1N6TmpVMU5UWXlOVGN4TmpNeU56QTJNREF4T0tsd2JHOTBYM1I1Y0dXbFRHbHVaWE9uZFhCa1lYUmxjc2NGYUtReE5UWXlqS3gwY21GdWMzQmhjbVZ1WTNuQ3BucDJZV3gxWmNwQklBQUFwRzVoYldXL2JHbHVaWE5sWjIxbGJuUnpMVE01TURZeU1qUTRNVGsxTkRZME1qSXpNNmxqWVcxZmMzQmhZMldrWkdGMFlhaDFibWxtYjNKdGM5NEFFTEoxYm1sbWIzSnRYMk52Ykc5eWNtRnVaMlhDcVc1aGJsOWpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUtwdGIyUmxiRjltTXpKangwQVhBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUNCQkFBQ0FQN1oxYm1sbWIzSnRYM0JoZEhSbGNtNWZiR1Z1WjNSb3lqK0FBQUNzYzJObGJtVmZiM0pwWjJsdTF4Y0FBQUFBQUFBQUFLMXNiM2RqYkdsd1gyTnZiRzl5MkJmQXRJZytFN2FmT3hXcHFENEFBSUEvc0hWdWFXWnZjbTFmWTI5c2IzSnRZWERDcDNCcFkydHBibWZDc1hWdWFXWnZjbTFmYkdsdVpYZHBaSFJveWorQUFBQzNkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNQXAyeHBibVZqWVhBQXFteHBibVZmWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQWdEK3JaR1Z3ZEdoZmMyaHBablRLQUFBQUFLOTFibWxtYjNKdFgzQmhkSFJsY203Q3JtaHBaMmhqYkdsd1gyTnZiRzl5MkJlQVJYNC82UGxuUC9WakV6NEFBSUEvczNWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhQSGdCY0FBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6cWQyYVhOcFlteGx3Nmh2ZG1WeVpISmhkOEtyYVhOZmMyVm5iV1Z1ZEhQRHFtRjBkSEpwWW5WMFpYT0J1bkJ2YzJsMGFXOXVjMTkwY21GdWMyWnZjbTFsWkY5bU16SmpncXQwZVhCbFgyeGxibWQwYUFLa1pteGhkTWRRRndBQWswS0IvNDVDQUFDSlFvSC9qa0lBQUpOQzRQOEZRd0FBaVVMZy93VkRBQUNUUWdDQVJFTUFBSWxDQUlCRVF3QUFrMElRZ0lGREFBQ0pRaENBZ1VNQUFKTkNJTUNnUXdBQWlVSWd3S0JEcEhWMWFXU3lNemt3TmpJeU5EZ3hPVFUwTmpReU1qTXpxWEJzYjNSZmRIbHdaYVZNYVc1bGM2ZDFjR1JoZEdWeXh3Vm9wREUxTmpPTXJIUnlZVzV6Y0dGeVpXNWplY0ttZW5aaGJIVmx5a0VnQUFDa2JtRnRaZGtoYkdsdVpYTmxaMjFsYm5SekxURXhOalkwTmpNM05UUTFNVEk1TVRBMU9UUXlxV05oYlY5emNHRmpaYVJrWVhSaHFIVnVhV1p2Y20xejNnQVFzblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBSUVFQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEt4ZFc1cFptOXliVjlzYVc1bGQybGtkR2pLUDRBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDbmJHbHVaV05oY0FDcWJHbHVaVjlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFDQVA2dGtaWEIwYUY5emFHbG1kTW9BQUFBQXIzVnVhV1p2Y20xZmNHRjBkR1Z5YnNLdWFHbG5hR05zYVhCZlkyOXNiM0xZRjRCRmZqL28rV2MvOVdNVFBnQUFnRCt6ZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzhlQUZ3QUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09wM1pwYzJsaWJHWENxRzkyWlhKa2NtRjN3cXRwYzE5elpXZHRaVzUwYzhPcVlYUjBjbWxpZFhSbGM0RzZjRzl6YVhScGIyNXpYM1J5WVc1elptOXliV1ZrWDJZek1tT0NxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4d0FYcEhWMWFXUzBNVEUyTmpRMk16YzFORFV4TWpreE1EVTVOREtwY0d4dmRGOTBlWEJscFV4cGJtVnpwM1Z3WkdGMFpYTEhCV2lrTVRVMk5ONEFFcXgwY21GdWMzQmhjbVZ1WTNuQ3BYTndZV05scEdSaGRHR3NkbVZ5ZEdWNFlYSnlZWGx6Z3FKMWRvS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhJQmNBQUFBQUFBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQUFBQUFBQUFBQUFBQUFLaHdiM05wZEdsdmJvS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhJQmNBQUFDL0FBQUF2d0FBQUQ4QUFBQy9BQUFBUHdBQUFEOEFBQUMvQUFBQVA2WjZkbUZzZFdYS0FBQUFBS1J1WVcxbHVIUmxlSFF0TXpNME56UTJPREE0TURFNE1qZ3pPRE15TktsallXMWZjM0JoWTJXa1pHRjBZYWgxYm1sbWIzSnRjOTRBR2F0d2VGOXdaWEpmZFc1cGRNb0FBQUFBcVdkc2IzZGpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXSnBiR3hpYjJGeVpNS3RjSEpsY0hKdmFtVmpkR2x2YnNkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEK3BibUZ1WDJOdmJHOXkyQmNBQUFBQUFBQUFBQUFBQUFBQUFBQUFyV1JwYzNSaGJtTmxabWxsYkdTS3FXMXBia1pwYkhSbGNxeE1hVzVsWVhKR2FXeDBaWEtxWVc1cGMyOTBjbTl3ZWNwQmdBQUFxVzFoWjBacGJIUmxjcXhNYVc1bFlYSkdhV3gwWlhLbGQzSmhjRk91VW1Wd1pXRjBWM0poY0hCcGJtZWtaR0YwWWExMFpYaDBkWEpsWDJGMGJHRnpySFJvY21WbFgyWnZjbTFoZEtsU1pXUkdiM0p0WVhTa2MybDZaWkxOQ0FETkNBQ2xkM0poY0ZTdVVtVndaV0YwVjNKaGNIQnBibWVrZEhsd1phZFRZVzF3YkdWeXFuUm9jbVZsWDNSNWNHV3BSbXh2WVhSVWVYQmxxbTF2WkdWc1gyWXpNbVBIUUJjQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL3NtRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpjcEZBQUFBc0hOa1psOXRZWEpyWlhKZmMyaGhjR1VEcDNCaGRIUmxjbTdDcTNOMGNtOXJaWGRwWkhSb3lnQUFBQUN0Ykc5M1kyeHBjRjlqYjJ4dmN0Z1h3TFNJUGhPMm56c1ZxYWcrQUFDQVA3QjFibWxtYjNKdFgyTnZiRzl5YldGd3dxbG5iRzkzZDJsa2RHaktBQUFBQUtkd2FXTnJhVzVud3FweVpYTnZiSFYwYVc5dTF4Y0FBQUFBQUFBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDcGIySnFaV04wWDJsa0FLMTFibWxtYjNKdFgyTnZiRzl5d3JCMGNtRnVjMlp2Y20xZmJXRnlhMlZ5d3F0a1pYQjBhRjl6YUdsbWRNb0FBQUFBcW1Zek1tTmZjMk5oYkdYSERCY0FBSUEvQUFDQVB3QUFnRCt1YUdsbmFHTnNhWEJmWTI5c2IzTFlGNEJGZmovbytXYy85V01UUGdBQWdEK3pkVzVwWm05eWJWOWpiR2x3WDNCc1lXNWxjOGVBRndBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T3AzWnBjMmxpYkdYRHEyMWhjbXRsY25Od1lXTmxwR1JoZEdHb2IzWmxjbVJ5WVhmQ3FtZHNlWEJvWDJSaGRHR0RyR2RzZVhCb1gyaGhjMmhsYzhjWUZtRWoxWVFyTVFpRloyVDJlYU4rb1JvODNhTGpaN0wwVHFaelkyRnNaWFBITUJjQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFBQmdRUUFBWUVFQUFHQkJBQUJnUVFBQVlFR3RZWFJzWVhOZmRYQmtZWFJsYzRXcU1qQTBOakU1TURZNU5aVFlGd0NBdHowQUVISS9BSURwUFFCUWVUL0lMeE5qa3RjV013QUFBRHNBQUFESUx3UVhBQ0NLUVFEQWhFRUFnSDlCQUFCMlFRQWdiVUVBSUdWQkFBQmVRUURBVjBFQW9GSkJBS0JPUVFEQVMwRUFBRXBCQUtCSlFRQ2dTVUVBb0VsQkFLQkpRUUNnU1VFQTRFbEJBRUJMUVFEQVRVRUFZRXRCQU1CR1FRQkFRMEVBb0VCQkFDQStRUUFBUFVFQXdEeEJBTUE4UVFEQVBFRUF3RHhCQU9BOFFRQ0FQVUVBZ0Q5QkFLQkNRUUFBUmtFQTRFbEJBSUJPUVFDZ1UwRUF3RmxCQU1CZ1FRRGdaMEVBQUc5QkFJQjJRUURBZmtFQTRJTkJBS0NJUVFDQWpVRUFnSkpCQU1DWFFRQkFuVUVBNEtKQkFHQ0VRUUNnZlVFQUFITkJBQUJwUVFEQVgwRUFJRmRCQUlCUFFRRGdTRUVBWUVOQkFBQS9RUURnTzBFQUlEcEJBS0E1UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBNERsQkFHQTdRUUFnUGtFQVFEeEJBR0EzUVFDQU0wRUE0REJCQUVBdVFRQUFMVUVBd0N4QkFNQXNRUURBTEVFQXdDeEJBT0FzUVFDZ0xVRUF3QzlCQU9BeVFRQmdOa0VBWURwQkFFQS9RUURBUkVFQVFFdEJBR0JTUVFDQVdVRUF3R0JCQU1Cb1FRQ0FjVUVBNEhwQkFFQ0NRUUJBaDBFQWdJeEJBQUNTUVFDZ2wwRUFRSjFCQUtCOVFRQWdja0VBQUdkQkFJQmNRUUNnVWtFQWdFbEJBR0JCUVFCQU9rRUFRRFJCQUlBdlFRQWdMRUVBSUNwQkFLQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUE0Q2xCQUtBclFRQ2dMa0VBSUMxQkFBQW9RUURnSTBFQUlDRkJBSUFlUVFBQUhVRUF3QnhCQU1BY1FRREFIRUVBd0J4QkFPQWNRUUNnSFVFQUlDQkJBRUFqUVFEZ0prRUFJQ3RCQUNBd1FRQUFOa0VBNER4QkFDQkVRUUJBUzBFQXdGSkJBRUJiUVFDQVpFRUFJRzVCQU9CM1FRQWdnVUVBb0laQkFFQ01RUUFBa2tFQW9KZEJBQUJ6UVFBQVowRUFnRnRCQUdCUVFRQUFSa0VBUUR4QkFJQXpRUURBSzBFQVFDVkJBQ0FnUVFCZ0hFRUFRQnBCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUNnR1VFQUFCcEJBTUFiUVFCQUgwRUE0QjFCQU9BWVFRQkFGRUVBUUJGQkFLQU9RUUFBRFVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQU9BTVFRREFEVUVBWUJCQkFLQVRRUUJnRjBFQTRCdEJBQ0FoUVFDQUowRUFvQzVCQU1BMVFRQUFQVUVBSUVWQkFDQk9RUURBVjBFQVlHRkJBTUJyUVFDZ2RrRUFBSUZCQUtDR1FRQmdqRUVBSUpKQkFBQnBRUUNBWEVFQVlGQkJBT0JFUVFEZ09VRUFnQzlCQUFBbVFRQ2dIVUVBZ0JaQkFNQVFRUUNnREVFQVFBcEJBS0FKUVFDZ0NVRUFvQWxCQUtBSlFRQ2dDVUVBQUFwQkFBQU1RUURnRDBFQXdBNUJBS0FKUVFEZ0JFRUFnQUZCQU1EOVFBQWcra0FBb1BsQUFLRDVRQUNnK1VBQW9QbEFBS0Q1UUFEQSswQUF3QUJCQUFBRVFRRGdCMEVBd0F4QkFFQVNRUUFnR1VFQVFDQkJBSUFuUVFBZ0wwRUE0RGRCQUdCQlFRQUFTMEVBSUZWQkFBQmdRUUJnYTBFQW9IWkJBQUNCUVFEZ2hrRUFBSTFCQU1CZlFRQ2dVa0VBQUVaQkFPQTVRUUJBTGtFQVFDTkJBQUFaUVFEZ0QwRUFBQWhCQUtBQlFRQWcra0FBd1BSQUFFRHpRQUJBODBBQVFQTkFBRUR6UUFCQTgwQUFJUFJBQU1ENFFBQ2dBRUVBSVA5QUFBRDFRQUFBNjBBQWdPTkFBRURlUUFBZzJrQUFvTmxBQUtEWlFBQ2cyVUFBb05sQUFNRFpRQUFnM0VBQUlPSkFBQURwUUFBZzhVQUFJUHRBQU1BRFFRRGdDa0VBQUJKQkFFQVpRUUNnSVVFQUFDdEJBSUEwUVFDZ1BrRUFnRWxCQU1CVVFRQUFZRUVBWUd0QkFFQjNRUURBZ1VFQUFJaEJBQ0JYUVFDQVNVRUFRRHhCQUlBdlFRQkFJMEVBb0JkQkFLQU1RUUNnQWtFQTRQTkFBS0RsUUFBZzIwQUFBTlZBQUVEVFFBQkEwMEFBUU5OQUFFRFRRQUJBMDBBQVFOUkFBSURaUUFBZzQwQUE0T0JBQUtEV1FBQ0F6RUFBQU1SQUFPQytRQUJBdWtBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQU1DNVFBQ0F2RUFBd01KQUFPREpRQUNnMGtBQVFOMUFBTURxUUFBQStVQUF3QU5CQUlBTFFRQ0FGRUVBSUI1QkFBQW9RUURnTWtFQUlENUJBR0JKUVFEQVZFRUFvR0JCQU9Cc1FRQ2dlVUVBWUlOQkFJQlBRUUJnUVVFQWdETkJBQUFtUVFBQUdVRUFvQXhCQUFBQlFRQkE3RUFBd05oQUFJRElRQUNBdkVBQVFMVkFBRUN6UUFCQXMwQUFRTE5BQUVDelFBQkFzMEFBZ0xSQUFLQzZRQURBeFVBQUlNTkFBRUM0UUFBZ3JrQUF3S1JBQUdDZlFBQmdta0FBb0psQUFLQ1pRQUNnbVVBQW9KbEFBTUNaUUFBZ25VQUFZS05BQUFDclFBQkF0RUFBQU1CQUFDRE9RQUJnM0VBQUlPdEFBR0Q4UUFEQUIwRUFnQkZCQUVBY1FRQ0FKMEVBd0RKQkFDQStRUUFBU2tFQWdGWkJBR0JqUVFDQWNFRUE0SDFCQU9CSVFRQkFPa0VBd0N0QkFLQWRRUURnRDBFQW9BSkJBRURzUUFEQTFFQUFJTDlBQUtDc1FBQmdua0FBb0pWQUFFQ1RRQUJBazBBQVFKTkFBRUNUUUFCQWswQUF3SlJBQUNDY1FBQWdxVUFBSUtaQUFBQ2FRQURBajBBQTRJVkFBTUIvUUFCQWRVQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFJQnpRQURBZTBBQVFJUkFBQ0NNUUFBZ2xrQUFRS05BQUlDeFFBRGd2MEFBNE05QUFNRGlRQUFBOWtBQW9BVkJBT0FRUVFBZ0hFRUFvQ2RCQUlBelFRQUFRRUVBSUUxQkFHQmFRUUNnWjBFQUFIVkJBR0JEUVFCQU5FRUFRQ1ZCQUlBV1FRQUFDRUVBNFBOQUFNRFlRQUFndjBBQWdLZEFBRUNTUUFBZ2dVQUF3R3hBQUlCbVFBQmdaa0FBWUdaQUFHQm1RQUJnWmtBQVFHcEFBTUI4UUFDZ2pVQUFnSWxBQU9CM1FBQUFZMEFBd0U1QUFPQkFRQURnTlVBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUtBelFBQkFQVUFBWUVwQUFPQmFRQUFBY1VBQW9JWkFBT0NVUUFEQW8wQUFBTFpBQUNESlFBQUEza0FBWVBSQUFJQUZRUUFBRVVFQUFCMUJBTUFwUVFEZ05rRUFJRVJCQUlCUlFRRGdYa0VBb0d4QkFBQS9RUUNBTDBFQUlDQkJBTUFRUVFDZ0FVRUFvT1ZBQUlESVFBQ2dyRUFBUUpKQUFLQjBRQUJBUzBBQUFDOUFBSUFtUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBd0N0QUFFQkVRQUNnYUVBQVFGcEFBRUE5UUFCZ0prQUFRQkpBQU1BQlFBREE3ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BT0RuUHdBQS9qOEFnQXhBQUVBZVFBQmdOMEFBQUZSQUFNQndRQUJBaVVBQVlKeEFBTUN3UUFBZ3gwQUF3TjFBQU1EMFFBQ0FCa0VBWUJOQkFLQWdRUUFBTGtFQVlEdEJBT0JJUVFEZ1ZrRUFBR1ZCQU9BN1FRQWdMRUVBWUJ4QkFLQU1RUUFnK2tBQUlOdEFBSUM4UUFCZ25rQUFJSUZBQUVCTFFBQmdHa0FBNE9jL0FDRE5Qd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TjAvQUFBU1FBQmdPa0FBNENOQUFPQURRQUFnMUQ4QW9Lcy9BT0NHUHdBZ1p6OEF3RXcvQU1CTVB3REFURDhBd0V3L0FLQlRQd0JBZ2o4QXdKNC9BSURGUHdCZy9EOEF3QnBBQUlBNVFBQ2dYMEFBb0lOQUFPQ1pRQUNBc0VBQWdNZEFBQ0RnUUFCZytrQUFnQXBCQU1BWFFRQkFKVUVBSUROQkFFQkJRUUNBVDBFQUFGNUJBQ0E2UVFBZ0trRUFRQnBCQUVBS1FRREE5RUFBQU5WQUFFQzFRQUNnbFVBQXdHeEFBQUF2UUFEZzV6OEFJSUUvQU1BYlB3Q2dHVDhBb0JrL0FLQVpQd0NnR1Q4QUlHVS9BTURkUHdCZ0QwQUF3TjAvQUdDWVB3QUFQVDhBSU0wK0FBRHJQQURnSHI0QUFMYStBR0M0dmdCZ3VMNEFZTGkrQUtCOHZnQ2d4THdBb0h3K0FNQWtQd0JnaWo4QUFNUS9BS0FHUUFBQUxVQUFZRmxBQUVDRFFBQmdta0FBZ0xOQUFBRE9RQUNnNkVBQW9BRkJBR0FQUVFDQUhVRUF3Q3RCQUVBNlFRRGdTRUVBd0ZkQkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBZ0daQUFJQW1RQUFnelQ4QXdCcy9BQURXdmdDZ0diOEFvQm0vQUtBWnZ3QkE0YjRBb0JrL0FBRElQd0NBeFQ4QVFHby9BTUN5UGdBZ2hMNEFJQ3EvQU1CMnZ3QWdtYjhBZ0s2L0FFQ3p2d0JBczc4QUlMTy9BS0NmdndDQWhyOEFZRWUvQUVDMnZnRGdHRDRBZ0RnL0FBQ25Qd0RBL1Q4QUlDeEFBTUJhUUFBZ2gwQUFvS0ZBQUVDOFFBQmcxMEFBWVBOQUFBQUlRUUNBRmtFQVFDVkJBQ0EwUVFBQVEwRUE0RkZCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0JndUw4QXdNeS9BR0M0dndDZ0diOEFvQmsvQUlDalB3Q2dRVDhBb0xVOUFBQVZ2d0NBa0w4QTRNcS9BRUR3dndDZ0FjQUF3QWZBQUVBS3dBREFETUFBUUJIQUFDQU53QUFnQU1BQUFObS9BQ0NodndBQVRMOEF3Q20rQUtBUlB3Q0FvejhBSUFGQUFJQTFRQUNnYWtBQUlKQkFBT0NyUUFDQXlFQUFvT1ZBQUtBQlFRQ0FFRUVBWUI5QkFFQXVRUUJBUFVFQWdFeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBZ0JUQUFNRE12d0NnR2I4QW9Cay9BQ0JMUHdBZ2lyMEFvRUcvQU9DeHZ3Q0E1TDhBUU9HL0FHREh2d0Nnczc4QVFMTy9BRUN6dndCZ3dyOEFZTnkvQUNBRXdBQkFITUFBSUNIQUFHQUp3QUJneXI4QTRIeS9BT0IvdmdCZ0pUOEFvTG8vQUNBU1FBRGdTRUFBQUlGQUFHQ2VRQUFndkVBQXdObEFBR0QzUUFEQUNrRUE0QmxCQUVBcFFRREFPRUVBUUVoQkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFBQmZBQU1ETXZ3Q2dHYjhBQUFBL0FLQzFQUUNnT2I4QUFMdS9BSURKdndDZ2xyOEFBRm0vQUlBWnZ3Qmd4TDRBWUxpK0FHQzR2Z0FnRWI4QW9FZS9BTUNWdndBQTBiOEFJQTdBQUtBcXdBQWdHTUFBUU5XL0FJQmJ2d0JBenp3QW9Hcy9BS0RtUHdDZ0xrQUE0R2xBQUlDU1FBQmdzRUFBd001QUFLRHRRQUJnQmtFQTRCVkJBR0FsUVFEZ05FRUFnRVJCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QUFCZkFBTURNdndDZ0diOEE0RUErQU9BWHZ3Q0FyTDhBZ0txL0FLQk52d0FnaEw0QUFEOCtBTUFFUHdDZ05qOEF3RXcvQU9CQVB3QWdFVDhBSUhBK0FDQ0V2Z0FBVjc4QUlMZS9BR0FMd0FEZ01jQUFvQTdBQUFDenZ3REFCYjhBd0FVL0FNQzNQd0RnRmtBQTRGTkFBTUNJUUFEQXAwQUE0TVpBQUFEbVFBQ2dBa0VBWUJKQkFDQWlRUURnTVVFQXdFRkJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUJmQUFHRE92d0FBSTc4QTRMYStBQUNXdndEZ243OEFZQksvQUFER1BRQWdNajhBZ0pJL0FNQzdQd0FBMWo4QVlPWS9BQ0RiUHdCQXdqOEF3SlUvQU9BdlB3QkFoanNBSUUyL0FHREt2d0JBR2NBQWdDckFBS0RtdndEZ1lyOEFnQkkrQUtDUlB3Q0FCa0FBb0VSQUFNQ0JRQUJnb1VBQTRNQkFBSURnUUFBQUFFRUF3QTlCQUlBZlFRQkFMMEVBQUQ5QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEF3QnpBQUVEMHZ3Q2dtYjhBb0k2L0FNQ292d0JnSmI4QTRIOCtBSUIxUHdDZ3dUOEFBQU5BQUVBYVFBQkFLVUFBQUROQUFNQXJRQUFBSGtBQUFBTkFBT0MzUHdDQU9EOEF3Q20rQU9DQ3Z3QkE4YjhBSUN2QUFHQUd3QUFna2I4QTROeTlBQ0I2UHdEQStEOEFvRHBBQUNCNVFBQUFuRUFBb0x0QUFFRGJRQUFnKzBBQWdBMUJBR0FkUVFCZ0xVRUFRRDFCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDWEFBT0Frd0FBZ0JjQUFvTkMvQUlCYnZ3QkF6endBZ0Y4L0FFRFZQd0NBRlVBQUlEbEFBTUJXUUFEQVowQUFJSEpBQUVCcVFBQUFXVUFBZ0RWQUFLQUdRQUNBcFQ4QVlPUStBQUFhdndEZ3c3OEFnQjdBQUVBUXdBQ2dwTDhBNEphK0FFQk9Qd0RBNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBWUNiQUFLQkJ3QURnQ3NBQVFLRy9BRUMydmdDQUlqOEFvTG8vQUtBUVFBQWdRMEFBQUc1QUFFQ0lRQUFBazBBQVlKaEFBR0NVUUFCZ2gwQUFZRjlBQUtBb1FBQUEyejhBUUVJL0FPQ1d2Z0NncEw4QVFCREFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFZQ2JBQUNBeXdBQUE3TDhBNEdlL0FNRFlQUUJBaVQ4QVFQdy9BR0ExUUFEQWFVQUFJSTVBQUdDalFBRGdzVUFBb0xkQUFPQ3hRQUJnbWtBQXdIaEFBS0E2UUFEQStEOEFJSG8vQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVlDYkFBRUFmd0FEZ3c3OEFBQnEvQU1EdVBnQ0FzejhBUUJaQUFFQlNRQUJBaGtBQWdLRkFBT0M2UUFBQXowQUFBTlZBQU1DL1FBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBWUNUQUFFQVF3QUNncEw4QTRKYStBRUJDUHdBQTJ6OEFZQ3BBQUNCblFBRGdrVUFBSUxCQUFDRE5RQUFnNTBBQTROOUFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEE0Q0xBQU1BSXdBREFsYjhBQVBPOUFDQjZQd0RBK0Q4QW9EcEFBT0I0UUFCZ20wQUFJTHBBQUtEWVFBQUE4MEFBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQ0FBd0FDQWdMOEFvSkE5QUFDTVB3REFBMEFBZ0VKQUFBQ0JRQURBb0VBQVlNQkFBQ0RnUUFBZytFQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUFZRXhBQU1DRlFBQmdwVUFBNE1SQUFHRGtRQUFBK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QVFDSEFBQUFBd0FBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEF3QXpBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3REF6TDhBUUNIQUFBQUF3QUFBZ0w4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUNnbWI4QXdBekFBS0Fad0FCQXM3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUVDelFBQkFrMEFBWUdaQUFHQW1RQURBekQ4QW9Cay9BS0FadndEQXpMOEFRQ0hBQUFBQXdBQUFnTDhBd1BVOUFLQ1pQd0RBREVBQXdFeEFBR0NHUUFCZ3BrQUFZTVpBQUdEbVFBRGcra0FBQU9CQUFBREFRQUFBb0VBQUFJQkFBQUJBUUFBQUFFQUFBSUEvQU1EMXZRQ2dtYjhBd0F6QUFLQVp3QUJBczc4QVlMaStBTUJNUHdCZzVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBeTc4QXdBckFBTUQxdndBQWdMOEF3UFU5QUtDWlB3REFERUFBd0V4QUFHQ0dRQUJncGtBQVlNWkFBR0RtUUFEZytrQUFBT0JBQUFEQVFBQUFvRUFBQUlCQUFBQkFRQUFBQUVBQUFJQS9BTUQxdlFDZ21iOEFnQUxBQUtBSHdBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUlBWHZ3Q0FsYjhBb0ptL0FLQ1p2d0NBYTc4QXdQVTlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQURnK2tBQUFPQkFBQURBUUFBQW9FQUFBSUJBQUFCQVFBQUFBRUFBQUlBL0FNRDF2UUFnaGI4QW9KbS9BS0NadndCZ2o3OEFZTGkrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFLQTVRUUNnS1VFQW9CbEJBS0FKUVFCQTgwQUFRTk5BQUdDelFBQmdrMEFBd0daQUFPQW1RQUJnemo4QUFDTS9BRUMwdlFEQTliMEF3UFc5QU1EMXZRREE5YjBBQUlFK0FNQ2JQd0JnRFVBQVFFMUFBSUNHUUFDQXBrQUFnTVpBQUlEbVFBQUErMEFBSU9CQUFDREFRQUFnb0VBQUlJQkFBR0JBUUFDZ0FFQUFvSUkvQUdEUVBRREE5YjBBd1BXOUFNRDF2UURBOWIwQTREQzhBS0JUUHdEZzV6OEFvRE5BQUlCelFBREFtVUFBd0xsQUFNRFpRQUNnK1VBQTRBeEJBT0FjUVFEZ0xFRUE0RHhCQUdBNlFRQmdLa0VBZ0JwQkFLQUtRUUNBOVVBQXdOVkFBRUMyUUFEZ2xrQUF3RzlBQUVBelFBQkE5RDhBb0prL0FBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQWdEOEFJSWMvQUVETFB3REFHMEFBWUZkQUFJQ0tRQURBcVVBQUlNbEFBTURvUUFBZy9VQUFnT0pBQU9EQ1FBQmdvMEFBUUlSQUFFQkxRQUJBRUVBQW9MZy9BS0NDUHdBQWdEOEFBSUEvQUFDQVB3QUFnRDhBZ0lBL0FPQ25Qd0FBQlVBQUlEOUFBQ0I4UUFBZ25VQUFnTHhBQUNEY1FBREErMEFBd0ExQkFLQWRRUUNnTFVFQWdEMUJBR0E4UVFDZ0xFRUFBQjFCQUdBTlFRQ2crMEFBNE54QUFJQytRQURBb0VBQUlJUkFBTUJTUUFEZ0pFQUE0QVpBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQXdBRkFBR0FXUUFBZ1AwQUFRSEpBQUNDVlFBQ0Fza0FBb05CQUFFRHZRQUNBQVVFQUlPbEFBS0RLUUFDZ3JFQUFZSTlBQUlCblFBRGdOVUFBUUJCQUFLQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFJQUJBQUFBTFFBQWdMVUFBQUYxQUFNQ0pRQUNncGtBQWdNUkFBQURqUUFEZ0FFRUFnQkJCQUNBZ1FRREFMMEVBZ0Q5QkFNQS9RUUJnTUVFQUFDRkJBTUFSUVFEQUFrRUFJT2hBQUlETFFBQUFzRUFBUUpaQUFNQitRQUJnV2tBQW9FUkFBQUJBUUFBQVFFQUFBRUJBQUFCQVFBQUFRRUFBUUVGQUFLQlBRQURBYmtBQW9JeEFBR0NsUUFCZ3dFQUFvTnhBQU1ENVFBQmdCa0VBNFBOQUFPRFdRQURBdWtBQVFLQkFBQ0NJUUFDQVowQUFRRXRBQUdCQVFBQUFRRUFBQUVCQUFBQkFRQUFBUUVBQUlFQkFBSUJIUUFDZ1lFQUFvSU5BQUVDYlFBQmd0VUFBSU5GQUFBRHVRQURBQlVFQTRCUkJBQUFrUVFCZ00wRUE0RUpCQUdCRVFRQmdOVUVBZ0NaQkFPQVhRUUNBQ1VFQUlQZEFBR0RjUUFCQXcwQUFnS3hBQU9DWVFBQWdpa0FBd0lGQUFBQ0FRQUFBZ0VBQUFJQkFBQUNBUUFBQWdFQUFnSUJBQUFDR1FBQmdra0FBSUtSQUFPQzVRQUFnMGtBQVFPeEFBT0FEUVFEZ0RFRUFJQUZCQU9EbVFBQWd6VUFBUUxWQUFFQ2dRQUJnajBBQVFJUkFBQ0NBUUFBQWdFQUFBSUJBQUFDQVFBQUFnRUFBQUlCQUFPQ0NRQUNnakVBQWdKeEFBTUN3UUFBZ3lFQUFvT0ZBQUtEOFFBQmdERUVBd0JwQkFHQXBRUUJnT0VFQVlFZEJBQ0JLUVFDZ08wRUFRQzFCQUVBZlFRQ2dFVUVBZ0FSQkFHRHdRQUNnMlVBQVlNVkFBS0MwUUFCQXFFQUFZS0ZBQUFDZ1FBQUFvRUFBQUtCQUFBQ2dRQUFBb0VBQVlLQkFBTUNrUUFBQXIwQUFJTDVBQUNEUlFBQUE1MEFBQVA5QUFHQU1RUURnRkVFQXdBbEJBQ0Q2UUFDQTRrQUFJTTFBQU1DNlFBQ2dyRUFBWUtOQUFDQ2dRQUFBb0VBQUFLQkFBQUNnUUFBQW9FQUFBS0JBQUVDaVFBQkFxa0FBb0xkQUFDREpRQUFBM2tBQVFQVkFBQ0FIUVFCQUZFRUFBQ0pCQUNBd1FRQ0FQa0VBSUUxQkFBQlJRUUFBUTBFQVFEVkJBT0FuUVFBQUcwRUF3QTVCQUdBRFFRQWc4a0FBSU9CQUFJRFJRQURneGtBQUlNRkFBQURBUUFBQXdFQUFBTUJBQUFEQVFBQUF3RUFBUU1CQUFBREVRQURBekVBQXdObEFBSURxUUFCQS9rQUFJQXBCQUFBV1FRQUFIa0VBb0JOQkFPQUhRUUFnK2tBQTRPWkFBT0RXUUFDZ3lrQUE0TUpBQUNEQVFBQUF3RUFBQU1CQUFBREFRQUFBd0VBQUFNQkFBT0RCUUFDZ3lFQUFJTlJBQUlEalFBQUE5a0FBb0FWQkFDQVJRUUNBSFVFQWdDcEJBT0EzUVFEQVJVRUE0Rk5CQU9CWVFRQkFTMEVBSUQ1QkFJQXhRUUJnSlVFQUFCcEJBSUFQUVFBZ0JrRUFBUHhBQUNEdlFBQUE1a0FBQU9GQUFBRGdRQUFBNEVBQUFPQkFBQURnUUFBQTRFQUFRT0JBQUlEalFBQUE2MEFBZ1BaQUFNQUNRUUNnQzBFQW9CVkJBTUFnUVFCQUtFRUFnQjVCQUtBVFFRREFDVUVBSUFGQkFPRHpRQUFnNlVBQWdPSkFBQ0RnUUFBQTRFQUFBT0JBQUFEZ1FBQUE0RUFBQU9CQUFLRGhRQUNBNTBBQVlQRkFBQUQvUUFEZ0IwRUFnQkZCQUVBY1FRREFKMEVBQURSQkFNQkFRUUFBVGtFQW9GdEJBSUJoUVFDQVZFRUFBRWhCQUFBOFFRQ2dNRUVBQUNaQkFFQWNRUURBRTBFQVlBeEJBS0FHUVFDZ0FrRUFnQUJCQUFBQVFRQUFBRUVBQUFCQkFBQUFRUUFBQUVFQUlBQkJBSUFCUVFEZ0JFRUE0QWxCQUtBUVFRREFHRUVBQUNKQkFFQXNRUUJBTTBFQUlDcEJBQ0FnUVFBQUYwRUFJQTlCQU1BSVFRQUFCRUVBSUFGQkFBQUFRUUFBQUVFQUFBQkJBQUFBUVFBQUFFRUFBQUJCQU1BQVFRQkFBMEVBd0FkQkFNQU5RUUJnRlVFQUlCNUJBQUFvUVFEZ01rRUFZRDVCQUlCS1FRQWdWMEVBSUdSQkFBQnJRUUNBWGtFQW9GSkJBRUJIUVFDQVBFRUFvREpCQUtBcFFRREFJVUVBSUJ0QkFBQVdRUUJnRWtFQVlCQkJBQUFRUVFBQUVFRUFBQkJCQUFBUVFRQUFFRUVBSUJCQkFHQVJRUUJBRkVFQTRCaEJBQUFmUVFCZ0prRUE0QzVCQUlBNFFRQUFQMEVBZ0RaQkFDQXRRUURBSkVFQW9CMUJBT0FYUVFDZ0UwRUFBQkZCQUFBUVFRQUFFRUVBQUJCQkFBQVFRUUFBRUVFQUFCQkJBS0FRUVFEZ0VrRUE0QlpCQUdBY1FRQkFJMEVBWUN0QkFJQTBRUUNnUGtFQWdFbEJBQUJWUVFBQVlVRUFnRzFCQUNCMVFRQkFhVUVBNEYxQkFDQlRRUUFBU1VFQXdEOUJBR0EzUVFBZ01FRUFJQ3BCQUdBbFFRQWdJa0VBWUNCQkFBQWdRUUFBSUVFQUFDQkJBQUFnUVFBQUlFRUFJQ0JCQUVBaFFRRGdJMEVBQUNoQkFLQXRRUUJnTkVFQVFEeEJBRUJGUVFCZ1MwRUFZRU5CQUtBNlFRQUFNMEVBWUN4QkFDQW5RUUJBSTBFQTRDQkJBQUFnUVFBQUlFRUFBQ0JCQUFBZ1FRQUFJRUVBQUNCQkFLQWdRUUNnSWtFQVFDWkJBRUFyUVFDQU1VRUFBRGxCQUlCQlFRQUFTMEVBSUZWQkFDQmdRUUNBYTBFQWdIZEJBT0IvUVFDQWRFRUFvR2xCQUlCZlFRQUFWa0VBUUUxQkFJQkZRUURnUGtFQVFEbEJBT0EwUVFEZ01VRUFZREJCQUFBd1FRQUFNRUVBQURCQkFBQXdRUUFBTUVFQUlEQkJBQ0F4UVFDQU0wRUFZRGRCQUlBOFFRREFRa0VBSUVwQkFHQlNRUUFnV0VFQW9GQkJBSUJJUVFCZ1FVRUFZRHRCQUlBMlFRQUFNMEVBd0RCQkFBQXdRUUFBTUVFQUFEQkJBQUF3UVFBQU1FRUFBREJCQUlBd1FRQmdNa0VBb0RWQkFFQTZRUUFnUUVFQUFFZEJBQUJQUVFEQVYwRUFZR0ZCQU1CclFRREFka0VBSUlGQkFJQ0ZRUUFnZ0VFQTRIVkJBRUJzUVFCZ1kwRUFJRnRCQU9CVFFRQ2dUVUVBZ0VoQkFJQkVRUURBUVVFQVFFQkJBQUJBUVFBQVFFRUFBRUJCQUFCQVFRQUFRRUVBSUVCQkFBQkJRUUJBUTBFQXdFWkJBSUJMUVFCQVVVRUFJRmhCQUFCZ1FRQmdaVUVBWUY1QkFNQldRUUFBVUVFQVlFcEJBQUJHUVFEQVFrRUF3RUJCQUFCQVFRQUFRRUVBQUVCQkFBQkFRUUFBUUVFQUFFQkJBSUJBUVFCQVFrRUFRRVZCQUlCSlFRRGdUa0VBUUZWQkFNQmNRUUFBWlVFQUlHNUJBT0IzUVFBZ2dVRUFvSVpCMXhjR2dkVSs1L3NKUDljWEtWeVBQUUFBQUFDcE5EUTJOemt4TXpNeGxOZ1hBSUQrUFFDUUdEOEFRQkkrQUJBalA4Z3oyMk9TMXhZbkFBQUFWUUFBQU1nenpCY0E0TVZCQUVDL1FRQ2d1RUVBQUxKQkFHQ3JRUURncEVFQWdKNUJBRUNZUVFBZ2trRUFZSXhCQUtDR1FRQWdnVUVBZ0hkQkFJQnRRUUFnWkVFQW9GdEJBT0JUUVFBZ1RVRUFZRWRCQU9CQ1FRQ0FQMEVBZ0QxQkFPQThRUURBUEVFQXdEeEJBTUE4UVFBZ1BVRUFvRDVCQUdCQlFRQ0FSVUVBd0VwQkFBQlJRUUJnV0VFQW9HQkJBS0JwUVFCZ2MwRUE0SDFCQUdDRVFRQWdpa0VBZ01GQkFPQzZRUUFndEVFQWdLMUJBT0NtUVFCQW9FRUFvSmxCQUVDVFFRQUFqVUVBNElaQkFBQ0JRUUNnZGtFQWdHdEJBQUJoUVFBZ1YwRUFBRTVCQU1CRlFRQ0FQa0VBWURoQkFHQXpRUURBTDBFQW9DMUJBT0FzUVFEQUxFRUF3Q3hCQU1Bc1FRQWdMVUVBd0M1QkFNQXhRUUJBTmtFQTREdEJBTUJDUVFDZ1NrRUFZRk5CQUFCZFFRQkFaMEVBSUhKQkFLQjlRUURBaEVFQUFMMUJBR0MyUVFEQXIwRUFJS2xCQUdDaVFRREFtMEVBSUpWQkFJQ09RUUFBaUVFQXdJRkJBRUIzUVFCZ2EwRUFBR0JCQUFCVlFRQ0FTa0VBd0VCQkFPQTNRUUFnTUVFQVlDbEJBQUFrUVFBZ0lFRUFvQjFCQU9BY1FRREFIRUVBd0J4QkFNQWNRUUFnSFVFQUFCOUJBRUFpUVFBZ0owRUFRQzFCQUtBMFFRQWdQVUVBZ0VaQkFLQlFRUUNBVzBFQUFHZEJBQUJ6UVFDQWYwRUFvTGhCQUFDeVFRQkFxMEVBb0tSQkFBQ2VRUUJnbDBFQW9KQkJBQUNLUVFCZ2cwRUFvSGxCQU9Cc1FRQ2dZRUVBd0ZSQkFHQkpRUUJnUGtFQUFEUkJBSUFxUVFBQUlrRUF3QnBCQU9BVVFRQ0FFRUVBd0ExQkFPQU1RUURBREVFQXdBeEJBTUFNUVFCQURVRUFJQTlCQU9BU1FRQkFHRUVBQUI5QkFBQW5RUUFBTUVFQUlEcEJBT0JFUVFCZ1VFRUFnRnhCQUFCcFFRQUFka0VBUUxSQkFJQ3RRUURncGtFQVFLQkJBSUNaUVFEZ2trRUFRSXhCQUtDRlFRRGdmVUVBZ0hCQkFHQmpRUUNBVmtFQUFFcEJBQ0ErUVFEQU1rRUF3Q2RCQUlBZFFRQkFGRUVBWUF4QkFNQUZRUURnQUVFQXdQdEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ0Era0FBQVA5QUFLQURRUUNBQ1VFQUFCRkJBTUFaUVFDQUkwRUFRQzVCQU9BNVFRQUFSa0VBb0ZKQkFNQmZRUUFnYlVFQVFMQkJBR0NwUVFDQW9rRUF3SnRCQUNDVlFRQ0Fqa0VBd0lkQkFDQ0JRUUFBZFVFQW9HZEJBR0JhUVFBZ1RVRUFBRUJCQUlBelFRQ2dKMEVBSUJ4QkFDQVJRUUFnQjBFQW9QeEFBQUR1UUFBQTQwQUFJTnhBQU1EWlFBQ2cyVUFBb05sQUFLRFpRQUNnMmtBQXdOOUFBQ0RwUUFCZzlrQUFZQU5CQUFBTlFRREFGMEVBUUNOQkFJQXZRUUJBUEVFQWdFbEJBQ0JYUVFBZ1pVRUFJS3hCQUVDbFFRQmdua0VBZ0pkQkFNQ1FRUUFBaWtFQVlJTkJBR0I1UVFBZ2JFRUF3RjVCQUlCUlFRQWdSRUVBNERaQkFNQXBRUUFBSFVFQUFCRkJBSUFGUVFCQTlVQUFvT0ZBQUNEUlFBQ0F4RUFBZ0x4QUFNQzVRQUNndVVBQW9MbEFBS0M1UUFEQXVrQUF3TUJBQUtETFFBQ2cya0FBQU8xQUFDQUJRUUNnREVFQUFCbEJBQUFtUVFDQU0wRUFZRUZCQUlCUFFRQUFYa0VBUUtoQkFDQ2hRUUJBbWtFQVlKTkJBSUNNUVFDZ2hVRUE0SDFCQUlCd1FRQkFZMEVBNEZWQkFLQklRUUJBTzBFQUFDNUJBS0FnUVFCZ0UwRUFnQVpCQU1EMFFBREEzVUFBSU1oQUFHQzFRQUNncGtBQUlKMUFBTUNaUUFDZ21VQUFvSmxBQUtDWlFBQUFtMEFBSUtKQUFPQ3VRQUJBd0VBQUFOVkFBRURzUUFDZ0FrRUE0QTlCQUtBZFFRREFLMEVBUURwQkFPQklRUURBVjBFQW9LUkJBR0NkUVFCZ2xrRUFRSTlCQUdDSVFRQ0FnVUVBWUhWQkFNQm5RUUJnV2tFQUFFMUJBTUEvUVFCZ01rRUFJQ1ZCQU1BWFFRQ0FDa0VBWVBwQUFDRGdRQUNBeDBBQWdMQkFBRUNiUUFEQWlVQUFJSHhBQUlCelFBQkFjMEFBUUhOQUFFQnpRQURnZGtBQVFJUkFBS0NUUUFEQXAwQUFJTDlBQU1EWVFBRGc4MEFBQUFoQkFJQVdRUUJBSlVFQVFEUkJBR0JEUVFDZ1VrRUFBS0ZCQU9DWlFRREFra0VBZ0l0QkFJQ0VRUURnZWtFQUlHMUJBSUJmUVFEQVVVRUFJRVJCQU9BMlFRQ0FLVUVBUUJ4QkFPQU9RUUNnQVVFQW9PaEFBQURPUUFDQXMwQUFZSnBBQUdDRFFBQUFYVUFBSUQ5QUFLQXpRQUJBTTBBQVFETkFBRUF6UUFBZ09FQUFJRTlBQUVCMVFBQkFra0FBb0t4QUFJRElRQUNnNVVBQW9BRkJBTUFRUVFBZ0lFRUFnQzlCQUFBL1FRQ2dUa0VBWUoxQkFFQ1dRUUFnajBFQUFJaEJBTUNBUVFCQWMwRUFJR1ZCQUNCWFFRQ0FTVUVBd0R0QkFDQXVRUUNnSUVFQVlCTkJBQUFHUVFDQThVQUE0TlpBQUVDOFFBQ2dvVUFBSUlkQUFNQmFRQUJBTEVBQUFBVkFBT0RuUHdCZzVqOEFZT1kvQUdEbVB3Q2c5VDhBUUJ0QUFFQkxRQUFnZ1VBQVlKNUFBSUM4UUFBZzIwQUFJUHBBQUtBTVFRQmdIRUVBSUN4QkFPQTdRUURBUzBFQTRKbEJBTUNTUVFDQWkwRUFZSVJCQUlCNlFRQWdiRUVBNEYxQkFJQlBRUUJnUVVFQWdETkJBT0FsUVFBZ0dFRUFnQXBCQUdENlFBREEzMEFBSU1WQUFJQ3FRQUFBa0VBQW9HcEFBSUExUUFBZ0FVQUFJS1EvQUtCVFB3REFURDhBd0V3L0FNQk1Qd0FnaFQ4QTRPYy9BQUF2UUFEQWJFQUFvSlZBQUVDMVFBQUExVUFBd1BSQUFFQUtRUUJBR2tFQUlDcEJBQ0E2UVFBQVNrRUFRSlpCQUNDUFFRQUFpRUVBd0lCQkFFQnpRUUFBWlVFQW9GWkJBR0JJUVFBQU9rRUF3Q3RCQUtBZFFRRGdEMEVBUUFKQkFPRG9RQUFBemtBQVlMTkFBTUNZUUFCZ2ZFQUFRRWRBQUNBU1FBQ2d1ajhBWUNVL0FLQSt2Z0JndUw0QTRMUytBS0NydlFCZ01qOEFvTkUvQU9BblFBQ0FaMEFBb0pOQUFJQ3pRQUNBMDBBQWdQTkFBTUFKUVFEQUdVRUF3Q2xCQUtBNVFRQ2dTVUVBd0pKQkFJQ0xRUUJnaEVFQWdIcEJBQ0JzUVFEZ1hVRUFnRTlCQUVCQlFRRGdNa0VBb0NSQkFFQVdRUUFBQ0VFQTRQTkFBSURZUUFBZ3ZVQUF3S0ZBQUNDSFFBQUFXVUFBNENOQUFNRGRQd0FBYWo4QVFNODhBSUJidndBZ243OEE0Q1cvQUNDV1BnQWdsVDhBb0FCQUFDQTRRQUNBYzBBQVlKaEFBSUMzUUFEZzFrQUFZUFpBQUFBTFFRRGdHa0VBd0NwQkFLQTZRUUNnU2tFQUlJOUJBQUNJUVFEQWdFRUFRSE5CQUFCbFFRQ2dWa0VBWUVoQkFBQTZRUURBSzBFQVlCMUJBQ0FQUVFEZ0FFRUFBT1ZBQUlESVFBQ2dyRUFBWUpGQUFLQnJRQUNBTlVBQWdBQkFBS0NYUHdEQXNqNEFBQlcvQUtDcnZ3Q2dpTDhBNEJpK0FPQlFQd0JnMWo4QVFDRkFBR0JZUUFCQWgwQUFZS05BQU1EQVFBREEza0FBWVAxQUFDQU9RUUNnSFVFQVFDMUJBQUE5UVFEQVRFRUF3SXRCQUlDRVFRQ0Fla0VBSUd4QkFPQmRRUUNBVDBFQVFFRkJBT0F5UVFDZ0pFRUFRQlpCQUFBSVFRQmc4MEFBd05aQUFDQzZRQUNBblVBQUFJRkFBT0JLUUFDZ0ZFQUFJTHMvQUdBbFB3QWdscjRBZ0pDL0FDQ3h2d0RBREw4QW9OQStBSUNoUHdDZ0NVQUFZRUpBQU9CNFFBRGdsMEFBUUxOQUFLRE9RQURnNmtBQUFBUkJBT0FTUVFBQUlrRUFRREZCQUtCQVFRQUFVRUVBb0loQkFFQ0JRUURBYzBFQUlHVkJBTUJXUVFCZ1NFRUFBRHBCQU1BclFRQmdIVUVBSUE5QkFPQUFRUUFBNVVBQVlNaEFBTUNyUUFBZ2owQUFJR1ZBQU9BclFBREE1ajhBNEhZL0FFQmZQUUNBVzc4QUlNUy9BQ0IrdndCQVg3MEFvR2MvQUtEalB3REFKMEFBZ0Y5QUFFQ01RQUJncUVBQW9NTkFBQ0RmUUFDQStrQUFBQXRCQUVBWlFRREFKMEVBZ0RaQkFJQkZRUUNBVkVFQVlJVkJBQ0I4UVFDQWJVRUE0RjVCQUFCUVFRQmdRVUVBNERKQkFLQWtRUUJBRmtFQUFBaEJBR0R6UUFEQTFrQUFJTHBBQUlDZFFBRGdnRUFBZ0VoQUFHQVBRQUNBckQ4QW9PaytBTUFHdndBQXJyOEFnTHEvQUlBTnZ3Q2c2VDRBZ0t3L0FHQVBRQUJnU0VBQXdIOUFBQUNiUUFCQXQwQUF3Tk5BQUlEdlFBQ0FCVUVBUUJOQkFPQWdRUURBTGtFQUFEMUJBSUJMUVFBZ1drRUFnSUpCQUNCMlFRQkFaMEVBZ0ZoQkFPQkpRUUFnTzBFQVlDeEJBS0FkUVFBZ0QwRUE0QUJCQUFEbFFBQmd5RUFBd0t0QUFDQ1BRQUFnWlVBQTRDdEFBS0RsUHdDZ1p6OEFRRis5QUNCK3Z3Q2cxNzhBWUlxL0FPQVl2Z0NnV1Q4QW9PSS9BTUFyUUFBZ1pVQUFJSTlBQUlDclFBRGd4a0FBZ09KQUFNRCtRQUNnRFVFQVlCdEJBQ0FwUVFEZ05rRUFnRVJCQUlCU1FRREFZRUVBSUg5QkFDQndRUUJBWVVFQVlGSkJBSUJEUVFEQU5FRUFJQ1pCQUlBWFFRREFDRUVBNFBOQUFNRFdRQUFndWtBQWdKMUFBT0NBUUFDQVNFQUFZQTlBQUlDc1B3Q2c2VDRBUUF5L0FPQzN2d0NneUw4QUlDdS9BRUMyUGdBZ29UOEFvQWxBQU1CRFFBQWdmMEFBSUoxQUFDQzZRQURBMWtBQXdQSkFBQ0FIUVFBQUZVRUFJQ05CQUVBeFFRQUFQMEVBd0V4QkFJQmFRUUJBYUVFQUFIcEJBTUJxUVFDZ1cwRUFnRXhCQUtBOVFRREFMa0VBNEI5QkFDQVJRUUJnQWtFQXdPZEFBRURLUUFDZ3JFQUFRSTlBQUNCbFFBRGdLMEFBb09VL0FLQm5Qd0JBWDcwQUlINi9BTURldndDZ2xyOEFJSVMrQUFBOVB3QUExRDhBUUNWQUFHQmZRQUJBakVBQUlLbEFBS0RHUUFCZzVFQUF3QUJCQUNBUFFRQUFIVUVBd0NwQkFNQTRRUURnUmtFQUFGVkJBTUJpUVFDQWNFRUE0SFJCQU1CbFFRQ0FWa0VBWUVkQkFFQTRRUUFBS1VFQUFCcEJBQ0FMUVFDZytFQUE0TnBBQUVDOVFBQkFvRUFBSUlOQUFBQkxRQURBRDBBQWdLdy9BS0RwUGdCQURMOEE0TGUvQU1EY3Z3QUFXYjhBQUQ4K0FJQ1NQd0RBQTBBQVFEMUFBT0IzUUFDZ21VQUFBTGRBQU9EVFFBQ2c4RUFBQUFkQkFNQVZRUUNBSkVFQTRESkJBS0JBUVFDQVRrRUFnRnhCQUtCcVFRQ2dlRUVBNEc5QkFLQmdRUUNBVVVFQVFFSkJBQ0F6UVFBQUpFRUF3QlJCQUtBRlFRQUE3VUFBQU05QUFHQ3hRQURBazBBQUFHeEFBTUF4UUFCZzhEOEFBSFkvQUtERXZBRGdmYjhBZ09pL0FJQ3p2d0NBOHI0QWdBMC9BR0M4UHdCQUdrQUF3RlpBQUFDSlFBQWdwa0FBSU1OQUFPRGdRQUJnL2tBQW9BMUJBQ0FjUVFDZ0trRUFnRGxCQUNCSVFRQ0FWa0VBWUdSQkFDQnlRUUFnZ0VFQXdHcEJBS0JiUVFCZ1RFRUFRRDFCQUNBdVFRRGdIa0VBd0E5QkFJQUFRUURBNGtBQVlNUkFBQUNtUUFEZ2gwQUFZRlJBQUlBWlFBQmd2RDhBZ0EwL0FLRHB2Z0FBcnI4QVlQTy9BQUNNdndEQTJMMEE0R2MvQU1EclB3QUFNVUFBQUd4QUFPQ1RRQUFnc2tBQUlOQkFBSUR0UUFCQUJVRUFBQlJCQU9BaVFRQmdNVUVBNEQ5QkFHQk9RUUFnWFVFQTRHdEJBQ0I2UVFBQWhFRUF3R1ZCQUlCV1FRQmdSMEVBUURoQkFBQXBRUURnR1VFQW9BcEJBQUQzUUFDZzJFQUFRTHBBQUFDY1FBQkFlMEFBb0Q1QUFBQUNRQUFnalQ4QTRCZytBS0JadndBQTRyOEFvTnUvQUtCSHZ3QWdlejRBd0pzL0FDQUtRQUNnUmtBQW9JRkFBS0NmUUFCQXZVQUE0TnBBQUFENVFBQ2dDMEVBWUJwQkFBQXBRUUNnTjBFQWdFWkJBQ0JWUVFDZ1kwRUFJSEpCQUdDQVFRREFoMEVBSUdGQkFNQlJRUUJnUWtFQUlETkJBQUFrUVFEQUZFRUFvQVZCQU9Ec1FBQ0F6a0FBUUxCQUFPQ1JRQUFnWjBBQVlDcEFBQURjUHdDZ1J6OEFJSHUrQUtDYnZ3RGcvcjhBZ0xPL0FNRHV2Z0FBR2o4QXdNTS9BRUFlUUFEZ1drQUF3SXRBQUNDcVFBQ0F5RUFBb09aQUFFQUNRUUFBRVVFQUFDQkJBQ0F2UVFBQVBrRUF3RXhCQUdCYlFRQWdha0VBNEhoQkFLQ0RRUURnaWtFQXdGeEJBR0JOUVFBQVBrRUFvQzVCQUVBZlFRRGdEMEVBb0FCQkFNRGlRQUJneEVBQUFLWkFBTUNIUUFEQVVrQUFRQlpBQUlDelB3REE3ajRBQUJxL0FNRER2d0FBL2I4QWdJeS9BTURZdlFEZ1p6OEFBT3cvQUlBeVFBQWdiMEFBNEpWQUFFQzBRQUNnMGtBQTRQQkFBS0FIUVFEQUZrRUE0Q1ZCQU1BMFFRQ2dRMEVBb0ZKQkFLQmhRUUJnY0VFQUlIOUJBT0NHUVFCQWprRUFvRmhCQUFCSlFRQ2dPVUVBSUNwQkFPQWFRUUNnQzBFQVlQaEFBSURaUUFDZ3VrQUFBSnhBQUVCN1FBQ2dQa0FBQUFKQUFBQ01Qd0RBMkQwQTRHZS9BS0RydndDZzU3OEFnRnkvQUFCS1BnRGdsejhBWUFsQUFJQkdRQUNnZ1VBQUFLQkFBR0MrUUFDZzNFQUFBUHRBQU1BTVFRRGdHMEVBQUN0QkFFQTZRUUJnU1VFQVlGaEJBRUJuUVFBZ2RrRUFvSUpCQUFDS1FRQmdrVUVBb0ZSQkFDQkZRUUNnTlVFQUlDWkJBS0FXUVFBZ0IwRUFRTzlBQUtEUVFBQWdza0FBZ0pOQUFFQnBRQUNnSzBBQVlOdy9BS0JIUHdBZ2U3NEF3SnUvQUNBRXdBREF5TDhBUUNDL0FBRHhQZ0FBdHo4QXdCaEFBTUJXUUFCZ2lrQUFZS2xBQUNESVFBREE1a0FBb0FKQkFNQVJRUURnSUVFQUlEQkJBRUEvUVFDQVRrRUFvRjFCQU1Cc1FRRGdlMEVBWUlWQkFPQ01RUUJnbEVFQUFGRkJBR0JCUVFEQU1VRUFRQ0pCQU1BU1FRQkFBMEVBWU9kQUFHRElRQUJncVVBQVlJcEFBRUJYUUFCQUdrQUF3THMvQU1BRVB3QkFFNzhBb01LL0FJQUl3QUFncXI4QUlMbStBS0EyUHdEQTFUOEFRQ2hBQUNCbVFBQWdra0FBSUxGQUFDRFFRQUFnNzBBQUlBZEJBSUFXUVFEZ0pVRUFJRFZCQUdCRVFRQ0FVMEVBd0dKQkFPQnhRUUNBZ0VFQUlJaEJBTUNQUVFCQWwwRUE0RTFCQUVBK1FRQ0FMa0VBNEI1QkFDQVBRUUFBLzBBQXdOOUFBS0RBUUFDZ29VQUFvSUpBQUdCSFFBQmdDVUFBNEpjL0FBQktQZ0FBV2I4QXdPTy9BR0FDd0FBQWpMOEFRSnE5QUlCeVB3QWc5RDhBNERkQUFLQjFRQURnbVVBQTRMaEFBT0RYUUFEZzlrQUFBQXRCQUlBYVFRQUFLa0VBZ0RsQkFBQkpRUUJnV0VFQXdHZEJBT0IyUVFBQWcwRUFvSXBCQUVDU1FRRGdtVUVBd0VwQkFDQTdRUUJnSzBFQXdCdEJBQUFNUVFEQStFQUFZTmxBQUFDNlFBQ2dta0FBd0haQUFDQTRRQUFnOUQ4QWdISS9BRUNhdlFBQWpMOEE0QUxBQU1EdXZ3QWdaNzhBZ0IwK0FDQ1dQd0RnQ0VBQUlFZEFBS0NDUUFDZ29VQUFvTUJBQUtEZlFBQ2cva0FBNEE1QkFHQWVRUURnTFVFQVlEMUJBT0JNUVFDQVhFRUFBR3hCQUlCN1FRQ0FoVUVBSUkxQkFNQ1VRUUJnbkVFQW9FZEJBQUE0UVFCQUtFRUFvQmhCQU9BSVFRQmc4a0FBSU5OQUFNQ3pRQUJnbEVBQVFHcEFBTUFyUUFBZzJ6OEE0RUEvQUFDdHZnREFxYjhBWUF6QUFBRFd2d0NnTnI4QUFNSStBT0N1UHdCZ0ZVQUFvRk5BQUNDSlFBQ0FxRUFBd01kQUFDRG5RQUFnQTBFQXdCSkJBRUFpUVFEQU1VRUFRRUZCQU1CUVFRQmdZRUVBNEc5QkFHQi9RUUNBaDBFQVFJOUJBQUNYUVFEQW5rRUE0RVJCQUNBMVFRQkFKVUVBZ0JWQkFNQUZRUUFnN0VBQXdNeEFBSUN0UUFBZ2prQUFvRjFBQUVBZlFBQmd3ajhBSUJFL0FDQVJ2d0Jnd3I4QWdBL0FBR0RDdndBZ0ViOEFZQmMvQUNESFB3Q2dJVUFBSUdCQUFHQ1BRQURBcmtBQUlNNUFBR0R0UUFCZ0JrRUFBQlpCQU1BbFFRQmdOVUVBSUVWQkFLQlVRUUJBWkVFQXdITkJBS0NCUVFCZ2lVRUFJSkZCQU9DWVFRQ2dvRUVBd0VKQkFPQXlRUUFnSTBFQVFCTkJBSUFEUVFCQTUwQUFnTWRBQU1DblFBQWdpRUFBSUZGQUFNQVNRQURBcVQ4QUFLMCtBT0JBdndBZzI3OEFJQkhBQUNDenZ3Qmd1TDRBNEVBL0FDRGJQd0RBSzBBQVFHcEFBTUNVUUFCQXRFQUE0Tk5BQUdEelFBQ0FDVUVBSUJsQkFPQW9RUUNnT0VFQVFFaEJBT0JYUVFDZ1owRUFRSGRCQUlDRFFRQkFpMEVBSUpOQkFPQ2FRUUNnb2tFQW9FQkJBTUF3UVFEZ0lFRUFBQkZCQUNBQlFRQ0E0a0FBNE1KQUFHQ2pRQUFBaEVBQVlFbEFBT0FLUUFEQW1EOEFZUDg5QUdCeHZ3RGc4NzhBd0F6QUFLQ2Z2d0NnZkw0QW9GTS9BT0RuUHdDZ00wQUFZSE5BQUdDWlFBQWd1VUFBd05oQUFHRDRRQUFBREVFQXdCdEJBS0FyUVFCZ08wRUFJRXRCQU9CYVFRREFha0VBZ0hwQkFDQ0ZRUURnakVFQXdKUkJBS0NjUVFCZ3BFRUFvRDVCQU1BdVFRQUFIMEVBSUE5QkFLRCtRQUFBMzBBQVlMOUFBTUNmUUFBZ2dFQUFZRUJBQUtBQVFBQ2dnajhBb01TOEFPQ0d2d0RBQWNBQXdBakFBTUNWdndBQTg3MEFBSDgvQUtEOFB3RGdQRUFBZ0h0QUFDQ2RRQUNBdkVBQUlOeEFBTUQ3UUFEQURVRUFvQjFCQUtBdFFRQ0FQVUVBWUUxQkFFQmRRUUFnYlVFQUFIMUJBR0NHUVFCZ2prRUFRSlpCQUNDZVFRQUFwa0VBSUQxQkFDQXRRUUFnSFVFQVFBMUJBSUQ2UUFDZzJrQUF3THBBQUFDYlFBRGdka0FBSURoQUFPRHpQd0JnY1Q4QVlQKzlBS0NadndCQURNQUFJQURBQUlDQXZ3Q2drRDBBQUl3L0FNQURRQUNBUWtBQUFJRkFBTUNnUUFDZ3dFQUFnT0JBQUNBQVFRQUFFRUVBNEI5QkFLQXZRUUNBUDBFQVlFOUJBQ0JmUVFBQWIwRUE0SDVCQUdDSFFRQmdqMEVBUUpkQkFFQ2ZRUUFncDBFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFBSzIrQU1DcHZ3REFFY0FBQUFEQUFBQ0F2d0RBOVQwQW9Kay9BTUFNUUFCZ1RFQUF3SVZBQUdDbFFBRGd4RUFBWU9SQUFBQUNRUURBRVVFQW9DRkJBSUF4UVFCZ1FVRUFRRkZCQUNCaFFRQWdjVUVBZ0lCQkFHQ0lRUUJna0VFQVFKaEJBRUNnUVFBZ3FFRUFZRHRCQUtBclFRREFHMEVBQUF4QkFFRDRRQUNnMkVBQUFMbEFBRUNaUUFBZ2MwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FFQ3p2d0FnRnNBQXdQaS9BQ0I2dndEQTlUMEFvSmsvQU1BTVFBREFURUFBWUlaQUFHQ21RQUJneGtBQVlPWkFBRUFEUVFCQUUwRUFRQ05CQUNBelFRQWdRMEVBQUZOQkFPQmlRUURnY2tFQVlJRkJBR0NKUVFCQWtVRUFRSmxCQUNDaFFRQWdxVUVBNERsQkFPQXBRUUFBR2tFQUFBcEJBQ0QwUUFCQTFFQUFnTFJBQU1DVVFBQkFha0FBd0N0QUFDRGJQd0RnUUQ4QVlMaStBRUN6dndDQUZNQUF3T2EvQUVCT3Z3RGdsajRBb0tRL0FFQVFRQUJBVDBBQVFJZEFBQ0NuUUFBQXgwQUE0T1pBQUdBRFFRQmdFMEVBWUNOQkFHQXpRUUJnUTBFQVlGTkJBR0JqUVFCZ2MwRUFvSUZCQUtDSlFRQ2drVUVBb0psQkFLQ2hRUUNncVVFQW9EbEJBS0FwUVFDZ0dVRUFvQWxCQUVEelFBQkEwMEFBUUxOQUFFQ1RRQUJnWmtBQVlDWkFBTURNUHdDZ0dUOEFJQkcvQUdEQ3Z3QWdHTUFBWU9hL0FNQk12d0JndUQ0QVFMTS9BS0FaUUFBQVdVQUFJSXhBQUtDclFBQkF5MEFBd09wQUFDQUZRUUFBRlVFQXdDUkJBS0EwUVFDQVJFRUFZRlJCQUdCa1FRQkFkRUVBSUlKQkFDQ0tRUUFBa2tFQUFKcEJBQUNpUVFBQXFrRUFvRGxCQUtBcFFRQ2dHVUVBb0FsQkFFRHpRQUJBMDBBQVFMTkFBRUNUUUFCZ1prQUFZQ1pBQU1ETVB3Q2dHVDhBb0JtL0FNREt2d0RBR3NBQVlPYS9BTUJNdndCZ3VENEFRTE0vQUtBWlFBQ2dXVUFBd0l4QUFNQ3NRQURBekVBQW9PeEFBRUFHUVFBZ0ZrRUFBQ1pCQU1BMVFRQ2dSVUVBZ0ZWQkFFQmxRUUFnZFVFQWdJSkJBSUNLUVFCZ2trRUFZSnBCQUdDaVFRQkFxa0VBb0RsQkFLQXBRUURBR1VFQXdBbEJBR0R6UUFDQTAwQUFnTE5BQUtDVFFBQmdaMEFBd0NkQUFFRFJQd0JnTEQ4QWdOaStBQ0MxdndEZ0ZNQUFZT2EvQU1CTXZ3Qmd1RDRBd0xFL0FHQVhRQURnVlVBQVFJcEFBTUNwUUFBZ3lVQUF3T2hBQUVBRVFRQWdGRUVBQUNSQkFBQTBRUURnUTBFQTRGTkJBTUJqUVFEQWMwRUE0SUZCQU9DSlFRRGdrVUVBNEpsQkFPQ2hRUURBcVVFQW9EcEJBTUFxUVFEZ0drRUFBQXRCQUdEMlFBRGcxa0FBWUxkQUFPQ1hRQURnY0VBQUFESkFBQURtUHdEQVREOEFZTGkrQUVDenZ3REFGTUFBWU9xL0FPQmN2d0JnU3o0QXdKcy9BR0FOUUFCQVRVQUFnSVpBQUlDbVFBQ0F4a0FBZ09aQUFFQURRUUJBRTBFQVFDTkJBRUF6UVFCQVEwRUFRRk5CQUVCalFRQkFjMEVBb0lGQkFJQ0pRUUNBa1VFQWdKbEJBSUNoUVFCZ3FVRUFnRHhCQUtBc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQUdEbVB3REFURDhBWUxpK0FNQ3h2d0FnRmNBQVFQKy9BQUNBdndEQTlUMEFvSmsvQU1BTVFBREFURUFBWUlaQUFHQ21RQUFneGtBQTRPVkFBTUFDUVFDZ0VrRUFnQ0pCQUdBeVFRQkFRa0VBQUZKQkFPQmhRUURBY1VFQTRJQkJBTUNJUVFEQWtFRUF3SmhCQUtDZ1FRQ2dxRUVBNER4QkFPQXNRUURnSEVFQTRBeEJBT0Q1UUFEZzJVQUE0TGxBQUFDYVFBQWdkRUFBZ0RSQUFHRHFQd0RnWEQ4QVlFdStBTUNidndCQURjQUFBQURBQUFDQXZ3QUE4ejBBd0pVL0FNQUlRQUFnUjBBQTRJSkFBRUNpUUFEZ3dVQUFvT0ZBQU1BQVFRQ2dFRUVBb0NCQkFJQXdRUUNBUUVFQVlGQkJBRUJnUVFCQWNFRUFBSUJCQUFDSVFRRGdqMEVBNEpkQkFNQ2ZRUURBcDBFQTREMUJBT0F0UVFBQUhrRUFJQTVCQU1EOFFBQWczVUFBb0wxQUFDQ2VRQUJnZlVBQW9ENUFBRUQvUHdBQWdEOEFBUE85QU1DVnZ3REFDTUFBd0FQQUFBQ012d0Nna0wwQWdJQS9BQ0FBUUFBZ1FFQUE0SDlBQUtDZlFBQmd2MEFBQU45QUFLRCtRQUFnRDBFQTRCNUJBTUF1UVFDZ1BrRUFnRTVCQUVCZVFRQWdia0VBQUg1QkFPQ0dRUURnamtFQXdKWkJBS0NlUVFDQXBrRUE0RDlCQUFBd1FRQWdJRUVBSUJCQkFFQUFRUUNBNEVBQW9NQkFBTUNnUUFBQWdVQUFnRUpBQU1BRFFBQUFqRDhBb0pBOUFDQ0F2d0FBL2I4QVFBekFBS0NadndCZy83MEFZSEUvQU9EelB3QWdPRUFBNEhaQUFBQ2JRQURBdWtBQWdOcEFBRUQ2UUFBQURVRUF3QnhCQUtBc1FRQmdQRUVBSUV4QkFBQmNRUURBYTBFQWdIdEJBS0NGUVFDQWpVRUFZSlZCQUVDZFFRQWdwVUVBWUVGQkFJQXhRUUNnSVVFQXdCRkJBQUFDUVFDZzVFQUFJTVZBQUtDbFFBQkFoa0FBZ0UxQUFHQU9RQUNnbno4QW9IdytBS0JUdndCZzU3OEFBQS9BQU1DcHZ3QUFyYjRBZ0V3L0FNRGpQd0JnTUVBQTRHNUFBT0NXUUFCQXRrQUF3TlZBQUdEMVFBQ0FDa0VBUUJwQkFBQXFRUURBT1VFQWdFbEJBRUJaUVFEZ2FFRUFnSGhCQUNDRVFRQUFqRUVBNEpOQkFLQ2JRUUNBbzBFQXdFTkJBQUEwUVFCQUpFRUFnQlJCQUtBRVFRREE2VUFBUU1wQUFPQ3FRQUJnaTBBQUlGaEFBR0FaUUFBQXRUOEFnTmcrQUdBc3Z3QWcwYjhBb0JEQUFHQzR2d0FBOGI0QWdDSS9BRURPUHdEZ0pVQUFvR1JBQU1DUlFBQWdzVUFBZ05CQUFPRHZRQUNnQjBFQVlCZEJBQUFuUVFDZ05rRUFZRVpCQUFCV1FRREFaVUVBWUhWQkFJQ0NRUUJnaWtFQVFKSkJBQUNhUVFEQW9VRUFZRVpCQUtBMlFRRGdKa0VBSUJkQkFHQUhRUUFnNzBBQWdNOUFBQUN3UUFDZ2tFQUF3R0pBQUVBa1FBQmd6RDhBZ0NJL0FBRHh2Z0FBdDc4QUlBL0FBRURPdndDQUlyOEFBUEUrQUVDNFB3QmdHa0FBd0ZoQUFLQ0xRQUFBcTBBQVFNcEFBS0RwUUFDQUJFRUFJQlJCQU9BalFRQ0FNMEVBUUVOQkFPQlNRUUNBWWtFQUlISkJBT0NBUVFDQWlFRUFRSkJCQU9DWFFRQ2duMEVBQUVsQkFFQTVRUUNBS1VFQTRCbEJBQ0FLUVFBQTlVQUFvTlZBQUVDMlFBRGdsa0FBb0c5QUFJQXhRQUNnNXo4QWdGdy9BQUJLdmdEZ2w3OEFRQWZBQUNEbHZ3QkFVNzhBb0h3K0FLQ2ZQd0RnRFVBQVFFeEFBR0NGUUFEQXBFQUFBTVJBQUdEalFBQmdBVUVBQUJGQkFLQWdRUUJBTUVFQXdEOUJBQ0JQUVFDQVhrRUE0RzFCQUVCOVFRQmdoa0VBQUk1QkFNQ1ZRUUJnblVFQUFFeEJBR0E4UVFDZ0xFRUFBQjFCQUdBTlFRQ2crMEFBZ054QUFJQzlRQUNBbmtBQUFIOUFBQUJCUUFCZ0EwQUFBSXcvQUVDYVBRQ0FjcjhBSVBTL0FPRDl2d0JBZ3I4QW9NUThBT0NHUHdCZ0FVQUF3RDlBQUVCK1FBQmdua0FBZ0wxQUFJRGNRQUNnKzBBQVFBMUJBTUFjUVFBQUxFRUFZRHRCQU1CS1FRQWdXa0VBZ0dsQkFPQjRRUUFnaEVFQXdJdEJBSUNUUVFCQW0wRUFRRTlCQU1BL1FRQkFNRUVBd0NCQkFFQVJRUUNnQVVFQVFPUkFBRURGUUFCQXBrQUFRSWRBQUlCUVFBRGdFa0FBSUtvL0FDQzVQZ0NnTnI4QXdOTy9BR0FHd0FEZ21yOEFZRXUrQUlCY1B3Q2c1ejhBZ0RGQUFLQnZRQURBbGtBQXdMVkFBR0RVUUFBQTgwQUF3QWhCQUVBWVFRQ2dKMEVBQURkQkFHQkdRUUNnVlVFQUlHVkJBSUIwUVFBQWdrRUFvSWxCQUVDUlFRREFtRUVBSUZOQkFLQkRRUUFnTkVFQW9DUkJBQ0FWUVFDQUJVRUFBT3hBQUFETlFBQUFya0FBQUk5QUFDQmdRQUNnSWtBQWdNcy9BQ0FxUHdBZzFyNEFRTEMvQUlBSHdBQUF0NzhBQVBHK0FFQWdQd0RBeUQ4QTRDRkFBT0JlUUFEZ2pVQUFvS3hBQUlETFFBQmc2a0FBZ0FSQkFPQVRRUUFnSTBFQW9ESkJBQUJDUVFCZ1VVRUFvR0JCQU9CdlFRRGdma0VBNElaQkFHQ09RUURBbFVFQUFGZEJBSUJIUVFBQU9FRUFnQ2hCQU9BWVFRQmdDVUVBNFBOQUFBRFZRQUJndGtBQTRKZEFBR0J5UUFDZ05FQUFZTzQvQUVCb1B3REEyTDBBQUl5L0FJRC92d0RnMWI4QUFEaS9BT0NpUGdBQXBUOEF3QTlBQUdCTlFBQ0FoVUFBQUtSQUFJRENRQUJBNFVBQUlBQkJBSUFQUVFEZ0hrRUFJQzVCQUVBOVFRQmdURUVBUUZ0QkFDQnFRUUFBZVVFQUFJUkJBR0NMUVFEQWtrRUE0RnBCQUdCTFFRRGdPMEVBWUN4QkFBQWRRUURBRFVFQXdQeEFBQURlUUFBZ3YwQUFRS0JBQUtDQlFBQ2dSa0FBSUFwQUFNQ2JQd0FnZXo0QW9FZS9BQURjdndCZzk3OEFnSCsvQUtERVBBQUFoRDhBQVB3L0FFQTdRQURnZUVBQVlKdEFBQ0M2UUFDZzJFQUFBUGRBQUtBS1FRRGdHVUVBNENoQkFLQTNRUUNBUmtFQVlGVkJBRUJrUVFBZ2MwRUFBSUZCQUdDSVFRREFqMEVBNEY1QkFJQlBRUUJBUUVFQTREQkJBSUFoUVFBQUVrRUFvQUpCQU1EbVFBQ0F5RUFBSUtwQUFNQ0xRQURnV2tBQVFCNUFBTUREUHdBQUdqOEF3T1crQUFDdXZ3REFBTUFBd0tPL0FPQ1d2Z0JBUWo4QUFOcy9BR0FxUUFBZ1owQUE0SkZBQUVDd1FBQ0F6a0FBb094QUFFQUZRUUFBRkVFQTRDSkJBTUF4UVFDZ1FFRUFnRTlCQUVCZVFRQWdiVUVBNEh0QkFFQ0ZRUUNnakVFQVlHTkJBQUJVUVFDQVJFRUFRRFZCQUFBbVFRREFGa0VBb0FkQkFPRHdRQUNnMGtBQVFMUkFBT0NWUUFBZ2IwQUFJRE5BQUlEd1B3QUFkajhBQU91OEFBQ0V2d0RnODc4QTRNTy9BQUFhdndEQTdqNEFnTE0vQUVBV1FBREFVa0FBd0lkQUFJQ2xRQUFndzBBQTRPQkFBSUQrUUFBZ0RrRUFBQjFCQU1BclFRQ2dPa0VBZ0VsQkFDQllRUURBWmtFQWdIVkJBQ0NDUVFCZ2lVRUF3R2RCQUtCWVFRQmdTVUVBUURwQkFBQXJRUURnRzBFQXdBeEJBQUQ3UUFDZzNFQUFnTDVBQU1DZ1FBQWdnMEFBd0VwQUFBQU9RQURBcEQ4QUFMYytBQ0FydndEZ3lyOEFnT2kvQU9CbnZ3REEyRDBBQUl3L0FNQUJRQURnUEVBQTRIZEFBS0NaUUFCQXQwQUE0TlJBQUtEeVFBQWdDRUVBQUJkQkFNQWxRUUJnTkVFQUFFTkJBTUJSUVFDQVlFRUFBRzlCQUVCOVFRREFoVUVBd0d4QkFLQmRRUUNBVGtFQVFEOUJBQ0F3UVFEZ0lFRUF3QkZCQU1BQ1FRQUE2RUFBUU1wQUFDQ3NRQURnalVBQUlHQkFBRUFsUUFBQTFEOEFBRDAvQUNDRXZnREFsYjhBSU8rL0FNQ2J2d0NnaWI0QUFEMC9BQURVUHdCQUpVQUFJR0JBQU1DTlFBQ0FxMEFBQU1sQUFNRG1RQUFnQWtFQW9CQkJBR0FmUVFBZ0xrRUF3RHhCQUVCTFFRQ0FXVUVBNEdkQkFDQjJRUUFnZ2tFQTRIRkJBTUJpUVFDQVUwRUFZRVJCQUdBMVFRQ0FKa0VBb0JkQkFLQUlRUUFBODBBQUFOVkFBRUMzUUFDZ21VQUE0SGRBQUVBOVFBRGdBMEFBd0pVL0FDQndQZ0JnUjc4QUlOZS9BTURLdndBZ0s3OEFBTGMrQU1Da1B3Q2dEVUFBb0VoQUFPQ0JRQUNnbjBBQTRMeEFBT0RaUUFCZzkwQUFnQXBCQUNBWlFRQ0FKMEVBd0RWQkFDQkVRUUJnVWtFQWdHQkJBRUJ1UVFBZ2ZFRUFBSGRCQU9CblFRQUFXVUVBSUVwQkFDQTdRUUFnTEVFQUFCMUJBQ0FPUVFDQS9rQUE0T0JBQUNERFFBQWdwa0FBZ0lsQUFDQlpRQUFnSGtBQWdNVS9BTUFrUHdCQXRyNEFJS0cvQU9EbXZ3QWdoTDhBWUhLOUFJQnJQd0RBNno4QUFERkFBT0JxUUFDQWtrQUFJTEJBQU1ETlFBREE2a0FBb0FOQkFBQVNRUUJBSUVFQW9DNUJBTUE4UVFDQVNrRUFZRmhCQUdCbVFRQkFkRUVBb0h4QkFLQnRRUUNnWGtFQWdFOUJBS0JBUVFEQU1VRUE0Q0pCQUFBVVFRQkFCVUVBb08xQUFPRFFRQURBczBBQUFKWkFBQUJ4UUFCZ04wQUFZUHcvQUdDS1B3RGdHRDRBNEZDL0FLRFZ2d0JBczc4QWdQSytBRUFNUHdBZ3VEOEF3QlpBQUVCU1FBQ0Foa0FBUUtOQUFNQy9RQUJnM0VBQUFQbEFBT0FLUVFBQUdVRUE0Q1pCQUtBMFFRQ2dRa0VBb0ZCQkFHQmVRUUJBYkVFQUlJRkJBQ0J6UVFCQVpFRUFZRlZCQUlCR1FRQ2dOMEVBQUNsQkFLQWFRUUFnREVFQUFQdEFBRURkUUFBQXdFQUFRS05BQUtDR1FBQUFWRUFBd0JwQUFHRERQd0RBSkQ4QVFMYStBQUNodndCZzJMOEFBR1MvQU1EWVBRQkFpVDhBWVB3L0FHQTNRQUNBY0VBQTRKUkFBSUN4UUFBZ3prQUFvT3BBQUVBRFFRQUFFVUVBNEI1QkFPQXNRUUNnT2tFQWdFaEJBTUJXUVFBQVpVRUFBSVJCQUFCNVFRQWdha0VBWUZ0QkFNQk1RUUJnUGtFQTRDOUJBQ0FoUVFCQUVrRUF3QU5CQU1EcVFBQWd6a0FBZ0xGQUFPQ1VRQUNBY0VBQVlEZEFBR0Q4UHdCZ2lqOEFvQzQrQUFCQnZ3REF4NzhBUUtHL0FFQzJ2Z0RBSkQ4QVlNTS9BTUFhUUFBQVZFQUFvSVpBQUVDalFBQmd2MEFBb05wQUFHRDJRQUJBQ1VFQUFCZEJBTUFrUVFEZ01rRUFRRUZCQUlCUFFRQUFYa0VBNElaQkFDQi9RUUNBY0VFQUlHSkJBSUJUUVFEQVJFRUFBRFpCQUlBblFRQWdHVUVBNEFwQkFBRDVRQUJnM0VBQXdMOUFBRUNqUUFDZ2hrQUFBRlJBQUFBYlFBQ2d5RDhBSURvL0FNQmd2Z0NBaTc4QVFNbS9BT0JRdndEZ0dENEFZSW8vQUdEOFB3QmdOMEFBUUhCQUFJQ1RRQURncmtBQUlNdEFBTURtUUFBZ0FVRUFJQTlCQUdBZFFRREFLMEVBUURwQkFPQklRUURBVjBFQUlJcEJBT0NDUVFCQWQwRUFZR2hCQU1CWlFRQkFTMEVBNER4QkFLQXVRUUJBSUVFQUFCSkJBS0FEUVFEQTZrQUFJTTVBQUlDeFFBQUFsVUFBSUhKQUFBQThRQURBQkVBQUlKNC9BQUM1UGdBQUZiOEF3TFMvQU1DZ3Z3QkF0cjRBd0NRL0FFRERQd0FBR1VBQUlFOUFBTUNEUUFDZ24wQUF3THBBQU1EV1FBQmc4MEFBQUFoQkFJQVdRUUJBSlVFQVFEUkJBR0JEUVFDZ1VrRUFZSTFCQUFDR1FRQ0FmVUVBQUc5QkFNQmdRUUJnVWtFQUlFUkJBTUExUVFDQUowRUFJQmxCQU9BS1FRQUErVUFBZ054QUFHREFRQUFBcFVBQW9JbEFBSUJjUUFBQUprQUFBTjQvQUFCbVB3QkF6N3dBQUdxL0FPQzl2d0RnVUw4QUlCUStBT0NDUHdBQThUOEFBREZBQUVCblFBQkFqMEFBd0t0QUFJRElRQUNnNVVBQW9BRkJBTUFRUVFBZ0lFRUFnQzlCQUFBL1FRQ2dUa0VBb0pCQkFHQ0pRUUJBZ2tFQUlIWkJBT0JuUVFDQVdVRUFRRXRCQU9BOFFRQ2dMa0VBUUNCQkFBQVNRUURnQTBFQVFPeEFBT0RRUUFCZ3RVQUFJSnBBQUNCOVFBRGdSa0FBd0E5QUFJQ3pQd0FBRlQ4QXdMSytBSUNTdndEQW9iOEFRT2krQUVBTVB3QmdzejhBd0E5QUFJQklRQUFBZ1VBQVlKNUFBSUM4UUFBZzIwQUFJUHBBQUtBTVFRQmdIRUVBSUN4QkFPQTdRUURBUzBFQUlKUkJBQUNOUVFEQWhVRUFRSDFCQUFCdlFRREFZRUVBWUZKQkFDQkVRUURBTlVFQW9DZEJBTUFaUVFBZ0RFRUFvUHhBQUdEaFFBRGd4VUFBZ0twQUFDQ1BRQUJBWjBBQUFESkFBT0Q1UHdBQWt6OEF3TEkrQUVBUHZ3REFmTDhBNEVDL0FLREV2QUNnWno4QW9PWS9BQUF2UUFEQWJFQUFvSlZBQUVDMVFBQUExVUFBd1BSQUFFQUtRUUJBR2tFQUlDcEJBQ0E2UVFBQVNrRUF3SmRCQUlDUVFRQmdpVUVBUUlKQkFDQjJRUURnWjBFQWdGbEJBR0JMUVFCZ1BVRUF3QzlCQUFBaVFRQkFGRUVBb0FaQkFLRHhRQUJnMWtBQXdMcEFBT0NmUUFCQWhVQUFnRlZBQUlBaVFBREEzajhBZ0hVL0FDQjlQZ0RBOVQwQXdQVTlBS0FiUGdBZ016OEFvTkUvQU9BblFBQ0FaMEFBb0pOQUFJQ3pRQUNBMDBBQWdQTkFBTUFKUVFEQUdVRUF3Q2xCQUtBNVFRQ2dTVUVBUUp0QkFDQ1VRUUFBalVFQXdJVkJBR0I5UVFBZ2IwRUFJR0ZCQUdCVFFRQ2dSVUVBNERkQkFFQXFRUUNBSEVFQTRBNUJBQUFCUVFEZzVrQUFRTXhBQUtDeFFBQkFsMEFBb0h0QUFJQklRQUNnRlVBQVFNcy9BTUNiUHdDZ21UOEFvSmsvQUtDWlB3Q0FyejhBUUFGQUFDQTRRQUNBYzBBQVlKaEFBSUMzUUFEZzFrQUFZUFpBQUFBTFFRRGdHa0VBd0NwQkFLQTZRUUNnU2tFQTRKNUJBTUNYUVFDQWtFRUFZSWxCQUdDQ1FRQUFkMEVBWUdsQkFLQmJRUURnVFVFQUlFQkJBSUF5UVFEQUpFRUFBQmRCQUtBSlFRQ2crRUFBQU41QUFBREVRQUNBcWtBQUFKRkFBTUJ1UUFBZ1AwQUF3QnRBQUdBTlFBREFERUFBd0F4QUFNQU1RQUFnRTBBQUFDOUFBTUJhUUFCQWgwQUFZS05BQU1EQVFBREEza0FBWVAxQUFDQU9RUUNnSFVFQVFDMUJBQUE5UVFEQVRFRUFZS0pCQUdDYlFRQkFsRUVBWUkxQkFJQ0dRUUJBZjBFQWdIRkJBT0JqUVFBZ1ZrRUFZRWhCQUtBNlFRQWdMVUVBd0I5QkFJQVNRUUJBQlVFQTRQQkFBRURYUUFEQXZVQUFJS1JBQUtDTVFBQkFja0FBWUZkQUFFQk5RQURBVEVBQXdFeEFBTUJNUUFBZ1VVQUF3R1ZBQUVDRVFBQmdta0FBZ0xOQUFLRE9RQURnNmtBQUFBUkJBT0FTUVFBQUlrRUFRREZCQUtCQVFRQUFVRUVBSUtaQkFDQ2ZRUUJnbUVFQWdKRkJBS0NLUVFEQWcwRUF3SGxCQUFCc1FRQmdYa0VBb0ZCQkFFQkRRUUFBTmtFQW9DaEJBS0FiUVFEQURrRUFBQUpCQUdEcVFBQWcwVUFBNExsQUFHQ2xRQUFnbFVBQWdJcEFBSUNHUUFCZ2hrQUFZSVpBQUdDR1FBQWdpRUFBSUpCQUFHQ2VRQUJBc1VBQWdNZEFBQ0RnUUFDQStrQUFBQXRCQUVBWlFRREFKMEVBZ0RaQkFJQkZRUUNBVkVFQUlLcEJBRUNqUVFCZ25FRUFvSlZCQU1DT1FRRGdoMEVBQUlGQkFFQjBRUURBWmtFQWdGbEJBQ0JNUVFEZ1BrRUFBREpCQUNBbFFRQmdHRUVBb0F0QkFFRCtRQUFBNTBBQUlOSkFBR0RBUUFDQXNrQUF3S2xBQUlDbVFBQmdwa0FBWUtaQUFHQ21RQURBcDBBQVlLNUFBRUM2UUFDZ3lrQUFZTjVBQU1EMFFBQ0FCa0VBWUJOQkFPQWdRUURBTGtFQUFEMUJBSUJMUVFBZ1drRUFRSzVCQUdDblFRQ0FvRUVBb0psQkFPQ1NRUUFBakVFQUlJVkJBQUI5UVFDZ2IwRUFZR0pCQUVCVlFRQmdTRUVBb0R0QkFNQXVRUUFBSWtFQW9CVkJBQ0FLUVFBQS8wQUFRT3hBQUtEY1FBQ2cwRUFBSU1sQUFJREdRQUJneGtBQVlNWkFBR0RHUUFDQXgwQUFJTTFBQUdEWFFBQ2c1VUFBUVBkQUFNQUZRUUFBRVVFQUFCMUJBTUFwUVFEZ05rRUFnRVJCQUlCU1FRREFZRUVBWUxKQkFJQ3JRUUNncEVFQXdKMUJBQUNYUVFCQWtFRUFvSWxCQU9DQ1FRQ2dlRUVBb0d0QkFNQmVRUUFBVWtFQUlFVkJBSUE0UVFCQUxFRUF3Q0JCQUFBV1FRQmdERUVBNEFOQkFNRDVRQUJBNzBBQXdPaEFBSURtUUFCZzVrQUFZT1pBQUdEbVFBQmc1MEFBUU94QUFDRDFRQURnQUVFQXdBaEJBQUFTUVFCZ0hFRUFvQ2RCQUlBelFRQUFRRUVBSUUxQkFJQmFRUUJBYUVFQWdMWkJBS0N2UVFEQXFFRUFBS0pCQUdDYlFRQ2dsRUVBQUk1QkFHQ0hRUUFBZ1VFQUlIVkJBR0JvUVFDZ1cwRUFBRTlCQU9CQ1FRQmdOMEVBb0N4QkFLQWlRUURBR1VFQUFCSkJBTUFMUVFBZ0IwRUFRQVJCQUVBRFFRQkFBMEVBUUFOQkFFQURRUUNnQTBFQXdBVkJBTUFKUVFCZ0QwRUFnQlpCQUFBZlFRQ0FLRUVBQUROQkFDQStRUUFBU2tFQWdGWkJBR0JqUVFDZ2NFRUFvTHBCQU1DelFRQWdyVUVBWUtaQkFNQ2ZRUUFnbVVFQW9KSkJBQ0NNUVFEQWhVRUF3SDVCQUFCeVFRQ0FaVUVBZ0ZsQkFBQk9RUUFnUTBFQUFEbEJBTUF2UVFDZ0owRUFvQ0JCQU9BYVFRREFGa0VBSUJSQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFDZ0UwRUFnQlZCQUFBWlFRQWdIa0VBb0NSQkFHQXNRUUJBTlVFQUFEOUJBSUJKUVFEQVZFRUFvR0JCQU9Cc1FRQ2dlVUVBNEw1QkFDQzRRUUNBc1VFQTRLcEJBRUNrUVFEQW5VRUFZSmRCQUFDUlFRQ2dpa0VBUUlSQkFBQjhRUUFnY0VFQW9HUkJBTUJaUVFDQVQwRUFBRVpCQUdBOVFRREFOVUVBWUM5QkFDQXFRUUJnSmtFQUFDUkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQ0FJMEVBUUNWQkFJQW9RUUFnTFVFQUlETkJBRUE2UVFDQVFrRUFvRXRCQUlCVlFRQWdZRUVBWUd0QkFFQjNRUURBZ1VFQVFNTkJBS0M4UVFBQXRrRUFZSzlCQUFDcFFRQ2dva0VBSUp4QkFNQ1ZRUUNBajBFQVFJbEJBR0NEUVFCQWUwRUFRSEJCQU9CbFFRQkFYRUVBWUZOQkFHQkxRUUJBUkVFQVlENUJBS0E1UVFBZ05rRUFBRFJCQUVBelFRQkFNMEVBUUROQkFFQXpRUUNBTTBFQUlEVkJBQUE0UVFCQVBFRUF3RUZCQUdCSVFRQUFVRUVBb0ZoQkFBQmlRUUFnYkVFQXdIWkJBQUNCUVFEZ2hrRUF3TWRCQUNEQlFRQ2d1a0VBSUxSQkFNQ3RRUUJncDBFQUFLRkJBTUNhUVFDZ2xFRUFvSTVCQU9DSVFRQmdnMEVBWUh4QkFLQnlRUUNBYVVFQUlHRkJBS0JaUVFBQVUwRUFnRTFCQUNCSlFRRGdSVUVBNEVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFDQVEwRUE0RVJCQUtCSFFRQ2dTMEVBb0ZCQkFPQldRUUFBWGtFQUFHWkJBT0J1UVFCZ2VFRUFZSUZCQU1DR1FRQmdqRUhYRjJRN1h6NWc1WEEvMXhjR2daVTlpQlpadnFveU1qTXhPVEEyTmpBemxOZ1hBSUMzUFFDUVRqOEFnTlU5QURCWFA4Z2g5Mk9TMXhZZkFBQUFSZ0FBQU1naDZCY0FZSVJCQU9COVFRQmdjMEVBb0dsQkFLQmdRUUJnV0VFQUFGRkJBTUJLUVFDQVJVRUFZRUZCQUtBK1FRQWdQVUVBd0R4QkFNQThRUURBUEVFQXdEeEJBTUE4UVFEQVBFRUE0RHhCQUlBOVFRQ0FQMEVBNEVKQkFHQkhRUUFnVFVFQTRGTkJBS0JiUVFBZ1pFRUFnRzFCQUlCM1FRQWdnVUVBb0laQkFLQjlRUUFnY2tFQVFHZEJBQUJkUVFCZ1UwRUFvRXBCQU1CQ1FRRGdPMEVBUURaQkFNQXhRUURBTGtFQUlDMUJBTUFzUVFEQUxFRUF3Q3hCQU1Bc1FRREFMRUVBd0N4QkFPQXNRUUNnTFVFQXdDOUJBR0F6UVFCZ09FRUFnRDVCQU1CRlFRQUFUa0VBSUZkQkFBQmhRUUNBYTBFQXdIWkJBQ0NCUVFBQWMwRUFBR2RCQUlCYlFRQ2dVRUVBZ0VaQkFDQTlRUUNnTkVFQVFDMUJBQ0FuUVFCQUlrRUFBQjlCQUNBZFFRREFIRUVBd0J4QkFNQWNRUURBSEVFQXdCeEJBTUFjUVFEZ0hFRUFvQjFCQUNBZ1FRQUFKRUVBWUNsQkFDQXdRUURnTjBFQXdFQkJBSUJLUVFBQVZVRUFJR0JCQU1CclFRRGdkMEVBQUdsQkFJQmNRUUJnVUVFQTRFUkJBQ0E2UVFBQU1FRUFBQ2RCQUFBZlFRQkFHRUVBNEJKQkFDQVBRUUJBRFVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQU1BTVFRREFERUVBNEF4QkFNQU5RUUNBRUVFQTRCUkJBTUFhUVFBQUlrRUFnQ3BCQUFBMFFRQmdQa0VBZ0VsQkFDQlZRUUJnWVVFQUlHNUJBTUJmUVFDZ1VrRUFBRVpCQU9BNVFRQkFMa0VBZ0NOQkFNQVpRUUFBRVVFQWdBbEJBS0FEUVFBQS8wQUFnUHBBQUtENVFBQ2crVUFBb1BsQUFLRDVRQUNnK1VBQW9QbEFBS0Q1UUFEQSswQUE0QUJCQU1BRlFRQmdERUVBUUJSQkFJQWRRUURBSjBFQTRESkJBS0ErUVFBQVMwRUF3RmRCQUFCbFFRQWdWMEVBZ0VsQkFFQThRUUNBTDBFQVFDTkJBTUFYUVFBQURVRUFZQU5CQUdEMlFBQWc2VUFBd045QUFLRGFRQUNnMlVBQW9ObEFBS0RaUUFDZzJVQUFvTmxBQUtEWlFBREEyVUFBSU54QUFBRGpRQUFBN2tBQW9QeEFBQ0FIUVFBZ0VVRUFRQnhCQUFBb1FRQ0FORUVBZ0VGQkFBQlBRUURBWEVFQWdFOUJBR0JCUVFDQU0wRUFBQ1pCQUFBWlFRQ2dERUVBSUFGQkFBRHRRQUNnMmtBQW9NdEFBTURBUUFEQXVrQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzVRQUNndVVBQXdMbEFBSUM4UUFDQXhFQUFJTkZBQUtEaFFBQkE5VUFBb0FWQkFJQVJRUUFnSGtFQVlDdEJBQUE1UVFBQVIwRUFRRlZCQU9CSVFRQkFPa0VBd0N0QkFLQWRRUURnRDBFQW9BSkJBRURzUUFBQTFVQUFRTUJBQU9DdVFBQWdva0FBQUp0QUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFDZ21VQUFvSmxBQU1DWlFBQWduVUFBb0taQUFHQzFRQUFneUVBQUFONUFBQUQyUUFEZ0IwRUFZQlZCQUVBalFRQ0FNVUVBSUVCQkFPQk9RUUJnUTBFQVFEUkJBRUFsUVFDQUZrRUFBQWhCQU9EelFBREEyRUFBSUw5QUFNQ25RQUNnazBBQVFJUkFBT0IyUUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUNBYzBBQUlIeEFBTUNKUUFCQW0wQUF3TEJBQUNESlFBQ0E0MEFBQVA5QUFNQU5RUUJnSEVFQVFDdEJBRUE2UVFDQVNVRUFBRDlCQUlBdlFRQWdJRUVBd0JCQkFLQUJRUUNnNVVBQWdNaEFBS0NzUUFCQWtrQUFRSFZBQUNCUFFBQWdPRUFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFvRE5BQUNBL1FBQUFYVUFBb0lOQUFJQ2NRQUNndDBBQUlOUkFBR0R4UUFEQUIwRUE0QlpCQUVBbVFRQ2dOVUVBUUVWQkFPQTdRUUFnTEVFQVlCeEJBS0FNUVFBZytrQUFJTnRBQUlDOFFBQmdua0FBSUlGQUFFQkxRQUJBRzBBQW9QVS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3Qmc1ajhBWU9ZL0FPRG5Qd0FBQlVBQUlDMUFBS0JnUUFDZ2pFQUFRS3BBQUtESVFBQ0E1MEFBUUFOQkFPQVNRUUNnSWtFQVlESkJBRUJDUVFBZ09rRUFJQ3BCQUVBYVFRQkFDa0VBd1BSQUFBRFZRQUJBdFVBQW9KVkFBTUJzUUFBQUwwQUE0T2MvQUNDRlB3REFURDhBd0V3L0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdDZ1V6OEE0S2MvQUFBTFFBQ0FSMEFBNElKQUFFQ2lRQURnd1VBQW9PRkFBTUFBUVFDZ0VFRUFvQ0JCQUlBd1FRQ0FRRUVBb0RsQkFLQXBRUUNnR1VFQW9BbEJBRUR6UUFCQTAwQUFRTE5BQUVDVFFBQ0Faa0FBZ0NaQUFDRE5Qd0RBR3o4QVlJKytBR0M0dmdCZ3VMNEFZTGkrQUdDNHZnQmd1TDRBNERDOEFJQ0FQd0FnQUVBQUlFQkFBQUNBUUFBQW9FQUFBTUJBQUFEZ1FBQUFBRUVBQUJCQkFBQWdRUUFBTUVFQUFFQkJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUtBWnZ3QUFxYjhBUUxPL0FFQ3p2d0JBczc4QVlJKy9BTUQxdlFBQWdEOEFBQUJBQUFCQVFBQUFnRUFBQUtCQUFBREFRQUFBNEVBQUFBQkJBQUFRUVFBQUlFRUFBREJCQUFCQVFRQ2dPVUVBb0NsQkFLQVpRUUNnQ1VFQVFQTkFBRURUUUFCQXMwQUFRSk5BQUdCbVFBQmdKa0FBd013L0FLQVpQd0NnR2I4QXdNeS9BSUFVd0FDZ0djQUFvQWZBQUtDWnZ3REE5YjBBQUlBL0FBQUFRQUFBUUVBQUFJQkFBQUNnUUFBQXdFQUFBT0JBQUFBQVFRQUFFRUVBQUNCQkFBQXdRUUFBUUVFQW9EbEJBS0FwUVFDZ0dVRUFvQWxCQUVEelFBQkEwMEFBUUxOQUFFQ1RRQUJnWmtBQVlDWkFBTURNUHdDZ0dUOEFvQm0vQU1ETXZ3QmdKc0FBZ0VMQUFNQU13QUNnbWI4QXdQVzlBQUNBUHdBQUFFQUFBRUJBQUFDQVFBQUFvRUFBQU1CQUFBRGdRQUFBQUVFQUFCQkJBQUFnUVFBQU1FRUFBRUJCQUtBNVFRQ2dLVUVBb0JsQkFLQUpRUUJBODBBQVFOTkFBRUN6UUFCQWswQUFZR1pBQUdBbVFBREF6RDhBb0JrL0FLQVp2d0RBekw4QWdCVEFBS0Fad0FDZ0I4QUFvSm0vQU1EMXZRQUFnRDhBQUFCQUFBQkFRQUFBZ0VBQUFLQkFBQURBUUFBQTRFQUFBQUJCQUFBUVFRQUFJRUVBQURCQkFBQkFRUUNnT1VFQW9DbEJBS0FaUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEFBS20vQUVDenZ3QkFzNzhBUUxPL0FHQ1B2d0RBOWIwQUFJQS9BQUFBUUFBQVFFQUFBSUJBQUFDZ1FBQUF3RUFBQU9CQUFBQUFRUUFBRUVFQUFDQkJBQUF3UVFBQVFFRUFvRGxCQUtBcFFRQ2dHVUVBb0FsQkFFRHpRQUJBMDBBQVFMTkFBRUNUUUFDQVprQUFnQ1pBQUNETlB3REFHejhBWUkrK0FHQzR2Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEE0REM4QUlDQVB3QWdBRUFBSUVCQUFBQ0FRQUFBb0VBQUFNQkFBQURnUUFBQUFFRUFBQkJCQUFBZ1FRQUFNRUVBQUVCQkFDQTZRUUFnS2tFQVFCcEJBRUFLUVFEQTlFQUFBTlZBQUVDMVFBQ2dsVUFBd0d4QUFBQXZRQURnNXo4QUlJVS9BTUJNUHdEQVREOEF3RXcvQU1CTVB3REFURDhBd0V3L0FLQlRQd0RncHo4QUFBdEFBSUJIUUFEZ2drQUFRS0pBQU9EQlFBQ2c0VUFBd0FCQkFLQVFRUUNnSUVFQWdEQkJBSUJBUVFEZ08wRUFJQ3hCQUdBY1FRQ2dERUVBSVBwQUFDRGJRQUNBdkVBQVlKNUFBQ0NCUUFCQVMwQUFRQnRBQUtEMVB3Qmc1ajhBWU9ZL0FHRG1Qd0JnNWo4QVlPWS9BR0RtUHdEZzV6OEFBQVZBQUNBdFFBQ2dZRUFBb0l4QUFFQ3FRQUNneUVBQWdPZEFBRUFEUVFEZ0VrRUFvQ0pCQUdBeVFRQkFRa0VBQUQ5QkFJQXZRUUFnSUVFQXdCQkJBS0FCUVFDZzVVQUFnTWhBQUtDc1FBREFrVUFBQUhKQUFDQkhRQURBSmtBQWdCWkFBSUFVUUFDQUZFQUFnQlJBQUlBVVFBQ0FGRUFBWUJoQUFDQXVRQUFBVkVBQW9JRkFBT0NiUUFDQXQwQUFJTlJBQUdEeFFBREFCMEVBNEJaQkFFQW1RUUNnTlVFQVFFVkJBQ0JEUVFDZ00wRUFRQ1JCQU1BVVFRQmdCVUVBNE90QUFDRE5RQUJncmtBQUlKQkFBTUJsUUFBQUwwQUFBUDgvQU9DOVB3QkFzejhBUUxNL0FFQ3pQd0JBc3o4QVFMTS9BR0RHUHdCQUNVQUE0RDFBQU9CM1FBQWdta0FBNExoQUFDRFlRQUJBOTBBQUlBdEJBTUFhUVFCQUtrRUF3RGxCQUVCSlFRQ0FRMEVBZ0ROQkFJQWpRUUNnRTBFQW9BTkJBR0RuUUFDQXgwQUF3S2RBQUNDSVFBQWdVVUFBSUJOQUFJQ3ZQd0RBR1Q4QVlMZytBR0M0UGdCZ3VENEFZTGcrQUdDNFBnREFSajhBUU5ZL0FHQXBRQUNBYUVBQUFKUkFBT0N6UUFEQTAwQUF3UE5BQU9BSlFRREFHVUVBd0NsQkFNQTVRUURBU1VFQVFFTkJBRUF6UVFCQUkwRUFRQk5CQUVBRFFRQmc1a0FBWU1aQUFHQ21RQUJnaGtBQXdFeEFBTUFNUUFDZ21UOEFZUDg5QUFBNHZ3REFUTDhBd0V5L0FNQk12d0FnQmI4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUVCRFFRQkFNMEVBUUNOQkFFQVRRUUJBQTBFQVlPWkFBR0RHUUFCZ3BrQUFZSVpBQU1CTVFBREFERUFBb0prL0FNRDFQUUFBZ0w4QUlOeS9BR0RtdndDQXdyOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUJBUTBFQVFETkJBRUFqUVFCQUUwRUFRQU5CQUdEbVFBQmd4a0FBWUtaQUFHQ0dRQURBVEVBQXdBeEFBS0NaUHdEQTlUMEFBSUMvQUFBQXdBREFIc0FBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFRRU5CQUVBelFRQkFJMEVBUUJOQkFFQURRUUJnNWtBQVlNWkFBR0NtUUFCZ2hrQUF3RXhBQU1BTVFBQ2dtVDhBd1BVOUFBQ0F2d0FBQU1BQVFDSEFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFFQkRRUUJBTTBFQVFDTkJBRUFUUVFCQUEwRUFZT1pBQUdER1FBQmdwa0FBWUlaQUFNQk1RQURBREVBQW9Kay9BTUQxUFFBQWdMOEFBQURBQUVBaHdBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFCQVEwRUFRRE5CQUVBalFRQkFFMEVBUUFOQkFHRG1RQUJneGtBQVlLWkFBR0NHUUFEQVRFQUF3QXhBQUtDWlB3REE5VDBBQUlDL0FBQUF3QUJBSWNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBUUVOQkFFQXpRUUJBSTBFQVFCTkJBRUFEUVFCZzVrQUFZTVpBQUdDbVFBQmdoa0FBd0V4QUFNQU1RQUNnbVQ4QXdQVTlBQUNBdndBQUFNQUFRQ0hBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUVEelFBQ2dDVUVBb0JsQkFLQXBRUUNnT1VFQW9FbEJBRUJEUVFCQU0wRUFRQ05CQUVBVFFRQkFBMEVBWU9aQUFHREdRQUJncGtBQVlJWkFBTUJNUUFEQURFQUFvSmsvQU1EMVBRQUFnTDhBQUFEQUFFQWh3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQkFRMEVBUUROQkFFQWpRUUJBRTBFQVFBTkJBR0RtUUFCZ3hrQUFZS1pBQUdDR1FBREFURUFBd0F4QUFLQ1pQd0RBOVQwQUFJQy9BQUFBd0FCQUljQUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUUNnU1VFQVFFTkJBRUF6UVFCQUkwRUFRQk5CQUVBRFFRQmc1a0FBWU1aQUFHQ21RQUJnaGtBQXdFeEFBTUFNUUFDZ21UOEF3UFU5QUFDQXZ3QUFBTUFBUUNIQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUVCRFFRQkFNMEVBUUNOQkFFQVRRUUJBQTBFQVlPWkFBR0RHUUFCZ3BrQUFZSVpBQU1CTVFBREFERUFBb0prL0FNRDFQUUFBZ0w4QUFBREFBRUFod0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUJBUTBFQVFETkJBRUFqUVFCQUUwRUFRQU5CQUdEbVFBQmd4a0FBWUtaQUFHQ0dRQURBVEVBQXdBeEFBS0NaUHdEQTlUMEFBSUMvQUFBQXdBQkFJY0FBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFRRU5CQUVBelFRQkFJMEVBUUJOQkFFQURRUUJnNWtBQVlNWkFBR0NtUUFCZ2hrQUF3RXhBQU1BTVFBQ2dtVDhBd1BVOUFBQ0F2d0FBQU1BQVFDSEFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFFQkRRUUJBTTBFQVFDTkJBRUFUUVFCQUEwRUFZT1pBQUdER1FBQmdwa0FBWUlaQUFNQk1RQURBREVBQW9Kay9BTUQxUFFBQWdMOEFBQURBQUVBaHdBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFCQVEwRUFRRE5CQUVBalFRQkFFMEVBUUFOQkFHRG1RQUJneGtBQVlLWkFBR0NHUUFEQVRFQUF3QXhBQUtDWlB3REE5VDBBQUlDL0FBQUF3QUJBSWNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBUUVOQkFFQXpRUUJBSTBFQVFCTkJBRUFEUVFCZzVrQUFZTVpBQUdDbVFBQmdoa0FBd0V4QUFNQU1RQUNnbVQ4QXdQVTlBQUNBdndBQUFNQUFRQ0hBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUVEelFBQ2dDVUVBb0JsQkFLQXBRUUNnT1VFQW9FbEJBRUJEUVFCQU0wRUFRQ05CQUVBVFFRQkFBMEVBWU9aQUFHREdRQUJncGtBQVlJWkFBTUJNUUFEQURFQUFvSmsvQU1EMVBRQUFnTDhBQUFEQUFFQWh3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQkFRMEVBUUROQkFFQWpRUUJBRTBFQVFBTkJBR0RtUUFCZ3hrQUFZS1pBQUdDR1FBREFURUFBd0F4QUFLQ1pQd0RBOVQwQUFJQy9BQUFBd0FCQUljQUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUUNnU1VFQVFFTkJBRUF6UVFCQUkwRUFRQk5CQUVBRFFRQmc1a0FBWU1aQUFHQ21RQUJnaGtBQXdFeEFBTUFNUUFDZ21UOEF3UFU5QUFDQXZ3QUFBTUFBUUNIQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUVCRFFRQkFNMEVBUUNOQkFFQVRRUUJBQTBFQVlPWkFBR0RHUUFCZ3BrQUFZSVpBQU1CTVFBREFERUFBb0prL0FNRDFQUUFBZ0w4QUFBREFBRUFod0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUJBUTBFQVFETkJBRUFqUVFCQUUwRUFRQU5CQUdEbVFBQmd4a0FBWUtaQUFHQ0dRQURBVEVBQXdBeEFBS0NaUHdEQTlUMEFBSUMvQUFBQXdBQkFJY0FBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFRRU5CQUVBelFRQkFJMEVBUUJOQkFFQURRUUJnNWtBQVlNWkFBR0NtUUFCZ2hrQUF3RXhBQU1BTVFBQ2dtVDhBd1BVOUFBQ0F2d0FBQU1BQVFDSEFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFFQkRRUUJBTTBFQVFDTkJBRUFUUVFCQUEwRUFZT1pBQUdER1FBQmdwa0FBWUlaQUFNQk1RQURBREVBQW9Kay9BTUQxUFFBQWdMOEFBQURBQUVBaHdBREF6TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFCQVEwRUFRRE5CQUVBalFRQkFFMEVBUUFOQkFHRG1RQUJneGtBQVlLWkFBR0NHUUFEQVRFQUF3QXhBQUtDWlB3REE5VDBBQUlDL0FBQUF3QUJBSWNBQXdNeS9BS0FadndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBUUVOQkFFQXpRUUJBSTBFQVFCTkJBRUFEUVFCZzVrQUFZTVpBQUdDbVFBQmdoa0FBd0V4QUFNQU1RQUNnbVQ4QXdQVTlBQUNBdndBQUFNQUFRQ0hBQU1ETXZ3Q2dHYjhBb0JrL0FNRE1Qd0JnSmtBQVlHWkFBRUNUUUFCQXMwQUFRTk5BQUVEelFBQ2dDVUVBb0JsQkFLQXBRUUNnT1VFQW9FbEJBRUJEUVFCQU0wRUFRQ05CQUVBVFFRQkFBMEVBWU9aQUFHREdRQUJncGtBQVlJWkFBTUJNUUFEQURFQUFvSmsvQU1EMVBRQUFnTDhBQUFEQUFFQWh3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUtCSlFRQkFRMEVBUUROQkFFQWpRUUJBRTBFQVFBTkJBR0RtUUFCZ3hrQUFZS1pBQUdDR1FBREFURUFBd0F4QUFLQ1pQd0RBOVQwQUFJQy9BQUFBd0FCQUljQUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUUNnU1VFQVFFTkJBRUF6UVFCQUkwRUFRQk5CQUVBRFFRQmc1a0FBWU1aQUFHQ21RQUJnaGtBQXdFeEFBTUFNUUFDZ21UOEF3UFU5QUFDQXZ3QUFBTUFBUUNIQUFNRE12d0NnR2I4QW9Cay9BTURNUHdCZ0prQUFZR1pBQUVDVFFBQkFzMEFBUU5OQUFFRHpRQUNnQ1VFQW9CbEJBS0FwUVFDZ09VRUFvRWxCQUVCRFFRQkFNMEVBUUNOQkFFQVRRUUJBQTBFQVlPWkFBR0RHUUFCZ3BrQUFZSVpBQU1CTVFBREFERUFBb0prL0FNRDFQUUFBZ0w4QUFBREFBRUFod0FEQXpMOEFvQm0vQUtBWlB3REF6RDhBWUNaQUFHQm1RQUJBazBBQVFMTkFBRURUUUFCQTgwQUFvQWxCQUtBWlFRQ2dLVUVBb0RsQkFLQkpRUUJBUTBFQVFETkJBRUFqUVFCQUUwRUFRQU5CQUdEbVFBQmd4a0FBWUtaQUFHQ0dRQURBVEVBQXdBeEFBS0NaUHdEQTlUMEFBSUMvQUFBQXdBQkFJY0FBd015L0FLQVp2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFDZ1NVRUFRRU5CQUVBelFRQkFJMEVBUUJOQkFFQURRUUJnNWtBQVlNWkFBR0NtUUFCZ2hrQUF3RXhBQU1BTVFBQ2dtVDhBd1BVOUFBQ0F2d0FBQU1BQXdDREFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBb0VsQkFFQkRRUUJBTTBFQVFDTkJBRUFUUVFCQUEwRUFZT1pBQUdER1FBQmdwa0FBWUlaQUFNQk1RQURBREVBQW9Kay9BTUQxUFFBQWdMOEFnT3UvQUFEL3Z3REF5TDhBb0JtL0FLQVpQd0RBekQ4QVlDWkFBR0JtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBS0JKUVFCQVEwRUFRRE5CQUVBalFRQkFFMEVBUUFOQkFHRG1RQUJneGtBQVlLWkFBR0NHUUFEQVRFQUF3QXhBQUtDWlB3REE5VDBBQUZlL0FBQ0F2d0FBZ0w4QUFINi9BR0FSdndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBUUVOQkFFQXpRUUJBSTBFQVFCTkJBRUFEUVFDZzVrQUF3TVpBQU1DbVFBRGdoa0FBNEUxQUFHQU9RQUNnbno4QVlMbytBTUQxUFFEQTlUMEF3UFU5QU1EMVBRQWdBejRBQURFL0FFRFJQd0RBSjBBQVlHZEFBS0NUUUFDQXMwQUFnTk5BQUdEelFBREFDVUVBd0JsQkFLQXBRUUNnT1VFQW9FbEJBRUJFUVFCQU5FRUFZQ1JCQUlBVVFRQ2dCRUVBd09sQUFFREtRQUFBcTBBQUlJeEFBSUJiUUFCZ0lVQUFRTncvQUtDZlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BSUN2UHdCQUFVQUFJRGhBQUlCelFBQmdtRUFBZ0xkQUFPRFdRQUJnOWtBQUFBdEJBT0FhUVFEQUtrRUFvRHBCQUtCS1FRQmdSa0VBb0RaQkFBQW5RUUJnRjBFQTRBZEJBQ0R4UUFEQTBrQUE0TFJBQUFDWVFBQkFlVUFBQUVoQUFHQWhRQUJnRGtBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBQWdFMEFBQUM5QUFNQmFRQUJBaDBBQVlLTkFBTURBUUFEQTNrQUFZUDFBQUNBT1FRQ2dIVUVBUUMxQkFBQTlRUURBVEVFQTRFbEJBR0E2UVFBZ0swRUE0QnRCQU9BTVFRQkEvRUFBZ045QUFLRERRQUJBcVVBQUlKRkFBRUI1UUFDQVcwQUE0RTFBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQUlGRkFBTUJsUUFCQWhFQUFZSnBBQUlDelFBQ2d6a0FBNE9wQUFBQUVRUURnRWtFQUFDSkJBRUF4UVFDZ1FFRUFBRkJCQUlCT1FRQ0FQMEVBZ0RCQkFPQWhRUUNBRTBFQWdBVkJBTUR2UUFBZzFrQUFRTDVBQUVDcFFBQUFtRUFBSUl4QUFPQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUNDSVFBQWdrRUFBWUo1QUFFQ3hRQUNBeDBBQUlPQkFBSUQ2UUFBQUMwRUFRQmxCQU1BblFRQ0FOa0VBZ0VWQkFJQlVRUUJBVkVFQW9FVkJBRUEzUVFBZ0tVRUFZQnRCQUNBT1FRQ0FBVUVBZ090QUFDRFdRQUNndzBBQTRMUkFBQUNyUUFEQXBrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQURBcDBBQVlLNUFBRUM2UUFDZ3lrQUFZTjVBQU1EMFFBQ0FCa0VBWUJOQkFPQWdRUURBTGtFQUFEMUJBSUJMUVFBZ1drRUFBRnRCQU9CTVFRQUFQMEVBb0RGQkFJQWtRUUFnR0VFQVlBeEJBSUFCUVFEQTcwQUFnTjlBQU1EU1FBQkF5a0FBd01aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFnTWRBQUNETlFBQmcxMEFBb09WQUFFRDNRQURBQlVFQUFCRkJBQUFkUVFEQUtVRUE0RFpCQUlCRVFRQ0FVa0VBd0dCQkFNQmlRUUFnVlVFQTRFZEJBQUE3UVFDZ0xrRUFBQ05CQUNBWVFRQWdEa0VBZ0FWQkFFRDhRQUFnOFVBQXdPbEFBS0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG5RQUJBN0VBQUlQVkFBT0FBUVFEQUNFRUFBQkpCQUdBY1FRQ2dKMEVBZ0ROQkFBQkFRUUFnVFVFQWdGcEJBRUJvUVFCQWEwRUFJRjVCQUlCUlFRQkFSVUVBb0RsQkFLQXVRUUNBSkVFQVlCdEJBSUFUUVFEZ0RFRUE0QWRCQUtBRVFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFDZ0EwRUF3QVZCQU1BSlFRQmdEMEVBZ0JaQkFBQWZRUUNBS0VFQUFETkJBQ0ErUVFBQVNrRUFnRlpCQUdCalFRQ2djRUVBZ0hSQkFBQm9RUURnVzBFQVFGQkJBRUJGUVFBQU8wRUFvREZCQUNBcFFRRGdJVUVBNEJ0QkFHQVhRUUNBRkVFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBb0JOQkFJQVZRUUFBR1VFQUlCNUJBS0FrUVFCZ0xFRUFRRFZCQUFBL1FRQ0FTVUVBd0ZSQkFLQmdRUURnYkVFQW9IbEJBSUIrUVFCZ2NrRUE0R1pCQU9CYlFRQ0FVVUVBNEVkQkFBQS9RUUJBTjBFQWdEQkJBQ0FyUVFBQUowRUFZQ1JCQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBSUFqUVFCQUpVRUFnQ2hCQUNBdFFRQWdNMEVBUURwQkFJQkNRUUNnUzBFQWdGVkJBQ0JnUVFCZ2EwRUFRSGRCQU1DQlFRQ0FoRUVBZ0gxQkFHQnlRUUFBYUVFQUlGNUJBQ0JWUVFEZ1RFRUFvRVZCQUlBL1FRQmdPa0VBb0RaQkFFQTBRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQ0FNMEVBSURWQkFBQTRRUUJBUEVFQXdFRkJBR0JJUVFBQVVFRUFvRmhCQUFCaVFRQWdiRUVBd0haQkFBQ0JRUURnaGtFQUFJcEJBSUNFUVFDQWZrRUFnSFJCQUVCclFRREFZa0VBQUZ0QkFFQlVRUUNBVGtFQTRFbEJBR0JHUVFCQVJFRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQWdFTkJBT0JFUVFDZ1IwRUFvRXRCQUtCUVFRRGdWa0VBQUY1QkFBQm1RUURnYmtFQVlIaEJBR0NCUVFEQWhrRUFZSXhCMXhmMC9kUTk5UDAwUDljWGo4SjFQUUFBQUFDcU1UTXlORFkxT1RNd001VFlGd0NBL2owQU1DTS9BTUFSUGdDd0xUL0lNb2Rqa3RjV0pnQUFBRlVBQUFESU1uZ1hBSUNGUVFBQWdFRUFnSFZCQUtCclFRQmdZa0VBQUZwQkFHQlNRUURnUzBFQVlFWkJBQ0JDUVFBQVAwRUFRRDFCQU1BOFFRREFQRUVBd0R4QkFPQThRUUNBUFVFQWdEOUJBT0JDUVFCZ1IwRUFJRTFCQU9CVFFRQ2dXMEVBSUdSQkFJQnRRUUNBZDBFQUlJRkJBS0NHUVFCZ2pFRUFJSkpCQUVDWVFRQ0Fua0VBNEtSQkFFQ3JRUUNnc1VFQVFMaEJBT0MrUVFDQXhVRUFBSUJCQUdCMFFRQmdhVUVBQUY5QkFFQlZRUUJBVEVFQVFFUkJBQ0E5UVFCQU4wRUFvREpCQUVBdlFRQmdMVUVBd0N4QkFNQXNRUURBTEVFQTRDeEJBS0F0UVFEQUwwRUFZRE5CQUdBNFFRQ0FQa0VBd0VWQkFBQk9RUUFnVjBFQUFHRkJBSUJyUVFDZ2RrRUFBSUZCQU9DR1FRQUFqVUVBUUpOQkFLQ1pRUUFBb0VFQWdLWkJBQ0N0UVFEQXMwRUFZTHBCQUFEQlFRQ0FkVUVBWUdsQkFNQmRRUURBVWtFQWdFaEJBT0ErUVFCQU5rRUFvQzVCQUVBb1FRQWdJMEVBZ0I5QkFHQWRRUURBSEVFQXdCeEJBTUFjUVFEZ0hFRUFvQjFCQUNBZ1FRQUFKRUVBWUNsQkFDQXdRUURnTjBFQXdFQkJBSUJLUVFBQVZVRUFBR0JCQUdCclFRQkFkMEVBd0lGQkFBQ0lRUUJnamtFQTRKUkJBR0NiUVFBQW9rRUFvS2hCQUVDdlFRQUF0a0VBb0x4QkFLQnJRUUFBWDBFQXdGSkJBQ0JIUVFCQVBFRUFBREpCQU1Bb1FRQ0FJRUVBWUJsQkFPQVRRUURBRDBFQWdBMUJBTUFNUVFEQURFRUF3QXhCQU9BTVFRREFEVUVBZ0JCQkFPQVVRUURBR2tFQUFDSkJBSUFxUVFBQU5FRUFZRDVCQUdCSlFRREFWRUVBb0dCQkFPQnNRUUNnZVVFQVFJTkJBS0NKUVFCQWtFRUE0SlpCQUlDZFFRQkFwRUVBNEtwQkFJQ3hRUUJBdUVFQVlHSkJBRUJWUVFDQVNFRUFRRHhCQUlBd1FRQ2dKVUVBb0J0QkFLQVNRUURnQ2tFQW9BUkJBQ0FBUVFBZyswQUFvUGxBQUtENVFBQ2crVUFBb1BsQUFNRDdRQURnQUVFQXdBVkJBR0FNUVFCQUZFRUFnQjFCQU1BblFRREFNa0VBSUQ1QkFBQktRUUNBVmtFQVFHTkJBQUJ3UVFBQWZVRUFJSVZCQU1DTFFRQ0Fra0VBSUpsQkFNQ2ZRUUJncGtFQUlLMUJBQUMwUVFBQVdrRUFRRXhCQU9BK1FRQUFNa0VBb0NWQkFPQVpRUUFnRDBFQVFBVkJBR0Q1UUFDQTYwQUFRT0ZBQUVEYlFBQ2cyVUFBb05sQUFLRFpRQURBMlVBQUlOeEFBQURqUUFBQTdrQUFvUHhBQUNBSFFRQWdFVUVBSUJ4QkFLQW5RUUNBTTBFQUFFQkJBT0JNUVFDZ1dVRUF3R1pCQUNCMFFRREFnRUVBWUlkQkFBQ09RUUNnbEVFQVlKdEJBQ0NpUVFBQXFVRUE0SzlCQUdCU1FRQkFSRUVBUURaQkFNQW9RUUNnRzBFQUlBOUJBR0FEUVFBZzhVQUFJTjVBQUVET1FBQ0F3a0FBb0x0QUFLQzVRQUNndVVBQW9MbEFBTUM1UUFDQXZFQUFnTVJBQUNEUlFBQ2c0VUFBUVBWQUFJQUZRUUFBRVVFQUFCMUJBS0FwUVFDQU5rRUFZRU5CQUtCUVFRRGdYVUVBUUd0QkFJQjRRUURnZ2tFQW9JbEJBR0NRUVFCQWwwRUFJSjVCQUFDbFFRRGdxMEVBNEV0QkFDQTlRUUNnTGtFQWdDQkJBS0FTUVFCQUJVRUFJUEZBQUdEWlFBQWd4RUFBQUxKQUFFQ2tRQUFBbkVBQW9KbEFBS0NaUUFDZ21VQUF3SmxBQUNDZFFBQ2dwa0FBWUxWQUFDRElRQURBM1VBQXdQUkFBSUFHUVFCQUUwRUFBQ0JCQUNBdFFRQmdPa0VBd0VkQkFBQlZRUUJnWWtFQW9HOUJBQ0I5UVFCZ2hVRUFRSXhCQUNDVFFRQUFta0VBQUtGQkFBQ29RUUJnUmtFQVFEZEJBRUFvUVFCZ0dVRUE0QXBCQUdENVFBQWcza0FBSU1SQUFFQ3NRQUJnbDBBQTRJWkFBRUI1UUFCQWMwQUFRSE5BQUVCelFBQ0FjMEFBSUh4QUFNQ0pRQUJBbTBBQWdMQkFBSURIUUFBZzRFQUF3UGxBQU1BSlFRRGdGa0VBUUNSQkFJQXhRUURnUGtFQUlFeEJBSUJaUVFBZ1owRUE0SFJCQUVDQlFRQWdpRUVBSUk5QkFDQ1dRUUFBblVFQUFLUkJBQ0JDUVFDZ01rRUFJQ05CQU9BVFFRQ2dCRUVBZ090QUFFRE9RQUFBc2tBQVlKZEFBQ0IrUUFEQVZVQUFRRHRBQUVBelFBQkFNMEFBUUROQUFLQXpRQUFnUDBBQUFGMUFBR0NEUUFCZ21rQUFZTE5BQUFETlFBRGc1a0FBd0FCQkFBQU9RUUJnRzBFQW9DaEJBQUEyUVFCZ1EwRUFJRkZCQU9CZVFRQ2diRUVBb0hwQkFFQ0VRUUFnaTBFQUlKSkJBQ0NaUVFCQW9FRUFBRDlCQUVBdlFRQ0FIMEVBd0E5QkFDQUFRUUJBNFVBQWdNSkFBRUNrUUFEZ2hrQUF3RlZBQU9BalFBREEvajhBd09ZL0FHRG1Qd0JnNWo4QTRPYy9BQUFGUUFCQUxFQUF3RnBBQU1DR1FBQkFvRUFBZ0xwQUFDRFZRQURBNzBBQUlBVkJBSUFTUVFEZ0gwRUFnQzFCQUVBN1FRRGdTRUVBNEZaQkFPQmtRUUNnY2tFQVFJQkJBRUNIUVFCZ2prRUFnSlZCQU1DY1FRQkFQVUVBWUMxQkFHQWRRUUNBRFVFQUlQdEFBRURiUUFDZ3UwQUFBSnhBQUVCNVFBQkFPMEFBd1A0L0FFQ1ZQd0JBVGo4QXdFdy9BTUJNUHdDZ1V6OEFJS1EvQUNBQlFBQkFORUFBWUdkQUFDQ09RQURBcUVBQVlNTkFBQURlUUFDZytFQUE0QWxCQUtBWFFRQkFKVUVBSUROQkFDQkJRUUFBVDBFQXdGeEJBTUJxUVFBQWVVRUFvSU5CQU9DS1FRQUFra0VBSUpsQkFPQThRUURnTEVFQTRCeEJBT0FNUVFEQStVQUF3TmxBQU1DNVFBREFtVUFBb0hOQUFNQXpRQUFnNkQ4QUFGVS9BQ0NFdlFEZ3NiNEFZTGkrQUtBK3ZnQmdKVDhBWUxZL0FLQU9RQURBUTBBQTRIaEFBQUNYUUFDZ3NVQUFZTXhBQU9EblFBQ2dBVUVBWUE5QkFHQWRRUUJBSzBFQUFEbEJBQUJIUVFCQVZVRUFnR05CQU9CeFFRQWdnRUVBUUlkQkFHQ09RUUNBbFVFQWdEMUJBS0F0UVFDZ0hVRUF3QTFCQU1EN1FBQWczRUFBZ0x4QUFDQ2RRQUFnZkVBQUlEOUFBQ0FFUUFCZ21EOEFJTEErQUFBanZ3RGduYjhBZ0YrL0FFRFB2QUNBV3o4QW9OWS9BR0FnUUFDQVZVQUFZSVZBQUtDZ1FBQWd2RUFBWU5kQUFHRHpRQUNnQjBFQVlCVkJBRUFqUVFDQU1VRUF3RDlCQUNCT1FRQmdYRUVBd0dwQkFBQjVRUUNnZzBFQTRJcEJBQUNTUVFDQVAwRUF3QzlCQUNBZ1FRQ0FFRUVBNEFCQkFBRGpRQUNBeEVBQW9LWkFBSUNKUUFCQVdrQUF3Q05BQU9EWlB3QWdVajhBQU1hOUFHQit2d0FBc2I4QVlDVy9BQ0NXUGdDQWtEOEE0UGsvQUtBeVFBRGdhVUFBSUpCQUFPQ3JRQUFBeUVBQVlPTkFBQUQvUUFEQURVRUFBQnhCQUVBcVFRQ2dPRUVBNEVaQkFFQlZRUUNBWTBFQTRIRkJBQ0NBUVFCZ2gwRUFvSTVCQU9CQ1FRQmdNMEVBQUNSQkFPQVVRUURBQlVFQUFPNUFBQURSUUFDQXRFQUE0SmhBQUdCN1FBRGdRa0FBWUF0QUFDQ3JQd0NnNlQ0QVFBeS9BQ0N5dndDZ2w3OEF3TEsrQUFBVlB3Q0F0ejhBSUJKQUFPQklRQURBZ0VBQVFKeEFBS0MzUUFEZzAwQUFnUEJBQUlBR1FRRGdGRUVBSUNOQkFJQXhRUURBUDBFQUlFNUJBSUJjUVFBQWEwRUFvSGxCQUVDRVFRQ0FpMEVBWUVkQkFHQTRRUUJnS1VFQXdCcEJBRUFNUVFBQS9FQUFJT0JBQU9ERVFBRGdxRUFBd0l4QUFFQmpRQURnSzBBQW9PVS9BS0JuUHdCQVg3MEFJSDYvQUdESXZ3QUFacjhBUU04OEFLQnJQd0NnNVQ4QWdDcEFBS0JnUUFCZ2pFQUE0S2hBQUlERlFBQWc0a0FBd1A1QUFNQU5RUUFBSEVFQVFDcEJBS0E0UVFCQVIwRUFBRlpCQU1Ca1FRQkFjMEVBNElCQkFDQ0lRUUFnVFVFQWdENUJBQUF3UVFEQUlVRUF3Qk5CQUFBR1FRQmc4RUFBSU5SQUFNQzRRQUJBblVBQTRJQkFBSUJJUUFCZ0QwQUFnS3cvQUtEcFBnQkFETDhBSUxhL0FJQ3l2d0JBREw4QVFPZytBS0NsUHdEQUNVQUF3RUpBQUFCOFFBQ2dta0FBUUxkQUFPRFRRQUNBOEVBQWdBWkJBT0FVUVFDQUkwRUFZREpCQUFCQlFRQ0FUMEVBQUY1QkFLQnNRUUJnZTBFQUlJVkJBT0JUUVFDQVJVRUFZRGRCQUtBcFFRRGdHMEVBNEExQkFPRC9RQUNBNUVBQVlNaEFBTUNyUUFBZ2owQUFJR1ZBQU9BclFBQ2c1VDhBb0djL0FHQnl2UUFnaEw4QUFOZS9BT0NDdndBZ0ZMNEE0RkEvQUNEYVB3QkFKa0FBWUY5QUFFQ01RQURncUVBQWdNVkFBR0RpUUFDZy8wQUFvQTVCQUdBZFFRREFLMEVBUURwQkFPQklRUURBVjBFQW9HWkJBSUIxUVFBZ2drRUFJRnRCQUVCTlFRQ0FQMEVBZ0RGQkFLQWpRUURnRlVFQUFBaEJBR0R6UUFEQTFrQUFJTHBBQUlDZFFBRGdnRUFBWUVoQUFLQU5RQURBcEQ4QUFMYytBTUFrdndCZ3hMOEF3TUsvQU1Ba3Z3QkF0ajRBSUtFL0FLQUpRQURBUWtBQUFIeEFBT0NhUUFDQXVFQUFJTlpBQUVEelFBQUFDRUVBZ0JaQkFFQWxRUUFnTkVFQUFFTkJBTUJSUVFDZ1lFRUFnRzlCQUdCK1FRQkFZMEVBUUZWQkFFQkhRUUNBT1VFQW9DdEJBR0FkUVFBZ0QwRUE0QUJCQUFEbFFBQmd5RUFBWUt0QUFNQ05RQUJBWUVBQVFDWkFBQURaUHdCZ1J6OEFJSEMrQU1DVnZ3Qmc0NzhBWUlxL0FPQVl2Z0RnVUQ4QVFOby9BRUFuUUFEQVlrQUE0STVBQU1DclFBQ0F5RUFBb09WQUFLQUJRUUNBRUVFQVlCOUJBQ0F1UVFBQVBVRUE0RXRCQU1CYVFRRGdhVUVBQUhsQkFBQnJRUUJBWFVFQVlFOUJBRUJCUVFEZ01rRUFvQ1JCQUVBV1FRRGdCMEVBb1BKQUFPRFVRQUNBdDBBQWdKcEFBSUI2UUFBQVAwQUFJQVJBQU1DVlB3QWdjRDRBb0VlL0FDRFp2d0Jndzc4QW9DTy9BQ0ROUGdBZ3FqOEFRQTlBQUlCSVFBQUFnVUFBWUo1QUFDQzhRQURBMlVBQVlQZEFBSUFLUVFCZ0dVRUFRQ2hCQUVBM1FRQmdSa0VBZ0ZWQkFNQmtRUURnYzBFQUlITkJBQUJsUVFDZ1ZrRUFZRWhCQUFBNlFRQ2dLMEVBNEJ4QkFDQU9RUUFBLzBBQTRPRkFBR0RFUUFDZ3BrQUFnSWxBQUNCWlFBQWdIa0FBd01NL0FBQWFQd0RBNWI0QUFLNi9BR0RwdndEQWZyOEFRRis5QUtCblB3Q2c1ajhBb0M1QUFPQnBRQUNBa2tBQUlMQkFBT0ROUUFDQTYwQUFvQVJCQU1BVFFRQUFJMEVBSURKQkFFQkJRUUNBVUVFQW9GOUJBT0J1UVFDQWVrRUFJR3hCQU9CZFFRQkFUMEVBb0VCQkFNQXhRUUJBSTBFQW9CUkJBTUFGUVFBQTdrQUFBTkZBQU1DelFBRGdsVUFBSUc5QUFDQXpRQUNBOEQ4QUFIWS9BQURydkFBQWhMOEE0TysvQUlDM3Z3REFCYjhBd0FVL0FNQzNQd0RBRmtBQVFGSkFBS0NHUUFCQXBFQUFZTUpBQU1EZ1FBQWcvMEFBd0E1QkFPQWRRUUFnTFVFQVFEeEJBR0JMUVFDZ1drRUF3R2xCQU1DQVFRQUFjMEVBUUdSQkFJQlZRUURnUmtFQVFEaEJBR0FwUVFEQUdrRUFJQXhCQU9ENlFBQ2czRUFBZ0w1QUFNQ2dRQUFnZzBBQXdFcEFBQUFPUUFBZ3BEOEE0S0krQUFBNHZ3RGcwNzhBQU9XL0FBQmt2d0RBMkQwQVFJay9BRUQrUHdDZ09rQUFJSGRBQU9DWlFBQkF1RUFBb05aQUFBRDFRQUNnQ1VFQTRCaEJBQUFvUVFBZ04wRUFZRVpCQUlCVlFRREFaRUVBQUlSQkFFQjVRUUNnYWtFQTRGdEJBQ0JOUVFDQVBrRUF3QzlCQU9BZ1FRREFFVUVBd0FKQkFBRG9RQUJBeWtBQUlLeEFBT0NOUUFEZ1hrQUFnQ0pBQUlETFB3QWdLajhBSU0yK0FLQ3J2d0RBL3I4QWdLQy9BQ0NpdmdBQU9EOEE0Tk0vQUdBbVFBQUFZMEFBd0k5QUFDQ3VRQUNBekVBQTRPcEFBS0FFUVFEQUUwRUFBQ05CQUNBeVFRQ0FRVUVBNEZCQkFFQmdRUUFnaDBFQWdIOUJBTUJ3UVFBZ1lrRUFZRk5CQUdCRVFRQmdOVUVBZ0NaQkFLQVhRUUNnQ0VFQUFQTkFBS0RVUUFCQXRrQUE0SmRBQUVCelFBQ0FOa0FBZ1BNL0FJQnlQd0JBbXIwQW9JdS9BQ0Q5dndDQXk3OEFJQ3EvQUNETlBnQ2dxejhBUUJKQUFNQk9RQURBaFVBQUFLUkFBR0RDUUFEQTRFQUFRUDlBQU9BT1FRQmdIa0VBd0MxQkFDQTlRUUNBVEVFQTRGdEJBRUNLUVFEZ2drRUE0SFpCQU9CblFRQUFXVUVBSUVwQkFDQTdRUUFBTEVFQTRCeEJBTUFOUVFBQS9VQUF3TjVBQUVEQVFBQ0FvVUFBb0lKQUFJQkhRQUFnQ2tBQXdKcy9BQ0I3UGdEQVQ3OEFZT0cvQUFEenZ3REFkcjhBQU9zOEFBQ0VQd0FBL0Q4QW9EcEFBQ0IzUUFBZ21rQUE0TGhBQU9EWFFBQ2c5a0FBb0FwQkFPQVpRUUJBS1VFQXdEaEJBRUJJUVFEQVYwRUFRSTFCQU1DRlFRQ2dmRUVBb0cxQkFLQmVRUUNBVDBFQVFFQkJBQ0F4UVFEZ0lVRUFvQkpCQUVBRFFRQ0E1MEFBb01oQUFDQ3FRQUNnaTBBQXdGbEFBQUFjUUFBZ3ZUOEF3QVEvQUVBVHZ3REF3cjhBNEFYQUFDQ2t2d0Rnb3I0QUFEZy9BT0RWUHdCQUtFQUFJR1pBQU1DUlFBQkFzRUFBd001QUFLRHRRQUJnQmtFQTRCVkJBR0FsUVFEZ05FRUFZRVJCQU9CVFFRQWdrRUVBb0loQkFBQ0JRUURnY2tFQXdHTkJBSUJVUVFBZ1JVRUFvRFZCQUVBbVFRRGdGa0VBb0FkQkFJRHdRQUNnMFVBQXdMSkFBS0NUUUFCQWFVQUFnQ3RBQUdEYlB3QkFRajhBNEphK0FLQ2t2d0FBQ01BQXdNaS9BRUFndndEQTdqNEFnTE0vQUdBV1FBRGdVMEFBd0loQUFNQ25RQURneGtBQTRPVkFBR0FDUVFBQUVrRUFnQ0ZCQUNBeFFRREFRRUVBWUZCQkFNQ1NRUUFnaTBFQWdJTkJBS0IzUVFBZ2FFRUF3RmhCQUdCSlFRQWdPa0VBd0NwQkFFQWJRUURBQzBFQWdQaEFBSURaUUFCZ3VrQUFZSnRBQU9CNFFBQUFPMEFBQVBvL0FJQi9Qd0NneEx3QTRJYS9BTUFBd0FEZzY3OEF3R2EvQUlBU1BnQ2drVDhBZ0FaQUFFQkVRQUFBZ1VBQUFLQkFBQ0MvUUFCZzNrQUF3UDFBQUlBT1FRQkFIa0VBNEMxQkFLQTlRUUJBVFVFQUFKVkJBR0NOUVFDZ2hVRUFBSHhCQUtCc1FRQkFYVUVBd0UxQkFDQStRUUNnTGtFQUlCOUJBS0FQUVFBZ0FFRUFRT0ZBQUNEQ1FBQWdvMEFBSUlSQUFNQkpRQUJnQzBBQTRKby9BR0JMUGdEZ1hMOEFBT3EvQUVBRndBQ2drYjhBZ0JLK0FDQm5Qd0RBN2o4QXdEVkFBRUIwUUFCZ21VQUF3TGhBQUNEWVFBQ0E5MEFBWUF0QkFDQWJRUURBS2tFQWdEcEJBQ0JLUVFCQWwwRUFvSTlCQU9DSFFRQWdnRUVBb0hCQkFDQmhRUUNnVVVFQUlFSkJBSUF5UVFBQUkwRUFnQk5CQU9BRFFRQmc2RUFBQU1sQUFNQ3BRQUJnaWtBQVFGWkFBT0FYUUFDZ3N6OEFnTmcrQUdBc3Z3QkEwYjhBZ0EzQUFPQ3V2d0FBd3I0QW9EWS9BQURXUHdCQUtVQUF3R2RBQUNDVFFBQ0Fza0FBNE5GQUFDRHhRQUJBQ0VFQUFCaEJBS0FuUVFCQU4wRUFBRWRCQUVDWlFRQ0FrVUVBd0lsQkFBQ0NRUUNBZEVFQUFHVkJBR0JWUVFEQVJVRUFBRFpCQUdBbVFRREFGa0VBQUFkQkFLRHVRQUJnejBBQUFMQkFBS0NRUUFDQVlrQUE0Q05BQUFETFB3REFHejhBd0FTL0FFQzl2d0NBRDhBQVlNZS9BSUFadndEQUJEOEFRTDAvQU1BY1FBQkFXMEFBNEl4QUFFQ3NRQUNBeTBBQTRPcEFBQ0FGUVFBQUZVRUF3Q1JCQUlBMFFRQmdSRUVBUUp0QkFJQ1RRUUNnaTBFQXdJTkJBT0IzUVFCQWFFRUFvRmhCQU9CSVFRQkFPVUVBZ0NsQkFNQVpRUUFBQ2tFQVlQUkFBT0RVUUFCQXRVQUFvSlZBQUtCc1FBQWdMa0FBNE44L0FBQkpQd0FBdHI0QWdLNi9BSUFQd0FBZzRMOEFZRXEvQU9DV1BnQ2dwRDhBUUJCQUFFQlBRQUFnaDBBQXdLWkFBRURHUUFEQTVVQUFvQUpCQUdBU1FRQWdJa0VBNERGQkFNQkJRUURnbkVFQUlKVkJBRUNOUVFCZ2hVRUFBSHRCQUVCclFRQ0FXMEVBb0V0QkFPQTdRUUFnTEVFQVFCeEJBSUFNUVFCZytVQUF3TmxBQUNDNlFBQmdta0FBUUhWQUFPQTFRQURBN2o4QUlHYy9BT0FldmdBQW1yOEFBQXpBQU1ENHZ3QWdlcjhBNE53OUFDQ1JQd0JnQmtBQW9FUkFBTUNCUUFCZ29VQUFJTUZBQUFEaFFBQmdBRUVBWUJCQkFFQWdRUUFnTUVFQTREOUJBR0NlUVFDQWxrRUFvSTVCQUtDR1FRQ0FmVUVBd0cxQkFPQmRRUUFBVGtFQUlENUJBRUF1UVFDQUhrRUFvQTVCQU1EOVFBQWcza0FBb0w1QUFBQ2ZRQUFBZjBBQXdEOUFBQ0FBUUFDQWdEOEFvSkM5QUFDTXZ3REFBOEFBWUFiQUFDQ1J2d0RnM0wwQUFJQS9BRUQvUHdDZ1BrQUFZSDFBQUNDZVFBQ2d2VUFBSU4xQUFNRDhRQUFnRGtFQUFCNUJBT0F0UVFEZ1BVRUFvSjlCQUtDWFFRREFqMEVBd0lkQkFNQi9RUURnYjBFQUFHQkJBRUJRUVFCZ1FFRUFnREJCQUlBZ1FRQ2dFRUVBd0FCQkFLRGhRQURnd1VBQVFLSkFBT0NDUUFBZ1IwQUF3QWhBQU1DVlB3QUE4ejBBQUlDL0FBQUF3QUJBRGNBQXdKdS9BR0JMdmdEZ1hEOEFZT28vQUlBMFFBQWdkRUFBQUpwQUFPQzVRQURnMlVBQTRQbEFBT0FNUVFEZ0hFRUE0Q3hCQU1BOFFRQ2dvRUVBb0poQkFNQ1FRUURBaUVFQTRJQkJBTUJ4UVFEZ1lVRUFBRkpCQUVCQ1FRQmdNa0VBZ0NKQkFLQVNRUURBQWtFQTRPVkFBQ0RHUUFCZ3BrQUFZSVpBQU1CTVFBREFERUFBb0prL0FNRDFQUUFnZXI4QXdQaS9BR0FVd0FEQXNiOEFZTGkrQU1CTVB3Qmc1ajhBQUROQUFFQnlRQURBbUVBQVFMaEFBT0RYUUFCZzkwQUFnQXRCQUVBYlFRQWdLMEVBQUR0QkFJQ2hRUUNBbVVFQW9KRkJBS0NKUVFDZ2dVRUFRSE5CQUdCalFRQmdVMEVBWUVOQkFHQXpRUUJnSTBFQVlCTkJBR0FEUVFEZzVrQUFBTWRBQUNDblFBQkFoMEFBUUU5QUFFQVFRQUNncEQ4QTRKWStBRUJPdndEQTVyOEFvQlRBQUtDenZ3Qmd4TDRBb0RZL0FBRFdQd0JnS1VBQWdHaEFBQUNVUUFEZ3MwQUF3Tk5BQU1EelFBRGdDVUVBd0JsQkFNQXBRUURBT1VFQUFLSkJBQUNhUVFBQWtrRUFJSXBCQUNDQ1FRQkFkRUVBWUdSQkFHQlVRUUNBUkVFQW9EUkJBTUFrUVFBQUZVRUFJQVZCQU1EcVFBQkF5MEFBb0t0QUFDQ01RQUFBV1VBQW9CbEFBRUN6UHdCZ3VENEF3RXkvQUdEbXZ3Q0FHY0FBSU1lL0FHQVh2d0NnR1Q4QXdNdy9BR0FtUUFCZ1prQUFRSk5BQUVDelFBQkEwMEFBUVBOQUFLQUpRUUNnR1VFQW9DbEJBS0E1UVFEQW9rRUF3SnBCQU9DU1FRRGdpa0VBQUlOQkFBQjJRUUFnWmtFQUlGWkJBRUJHUVFCZ05rRUFZQ1pCQUdBV1FRQmdCa0VBd094QUFNRE1RQURBckVBQXdJeEFBS0JaUUFDZ0dVQUFRTE0vQUdDNFBnREFUTDhBWU9hL0FDQWN3QURBekw4QW9CbS9BS0FaUHdEQXpEOEFZQ1pBQUdCbVFBQkFrMEFBUUxOQUFFRFRRQUJBODBBQW9BbEJBS0FaUVFDZ0tVRUFvRGxCQUNDalFRQWdtMEVBSUpOQkFFQ0xRUUJBZzBFQVlIWkJBR0JtUVFCZ1ZrRUFZRVpCQUdBMlFRQmdKa0VBWUJaQkFHQUdRUURBN0VBQXdNeEFBTUNzUUFEQWpFQUFvRmxBQUtBWlFBQkFzejhBWUxnK0FNQk12d0JnNXI4QUlCekFBTURNdndDZ0diOEFvQmsvQU1ETVB3QmdKa0FBWUdaQUFFQ1RRQUJBczBBQVFOTkFBRUR6UUFDZ0NVRUFvQmxCQUtBcFFRQ2dPVUVBWUtKQkFJQ2FRUUNBa2tFQWdJcEJBS0NDUVFCZ2RVRUFnR1ZCQUtCVlFRREFSVUVBNERWQkFBQW1RUUFnRmtFQVFBWkJBS0RzUUFEQXpFQUF3S3hBQU1DTVFBQ2dXVUFBb0JsQUFFQ3pQd0JndUQ0QXdFeS9BR0RtdndBZ0hNQUF3TXkvQUtBWnZ3Q2dHVDhBd013L0FHQW1RQUJnWmtBQVFKTkFBRUN6UUFCQTAwQUFRUE5BQUtBSlFRQ2dHVUVBb0NsQkFLQTVRUURnb1VFQTRKbEJBT0NSUVFEZ2lVRUE0SUZCQU1CelFRREFZMEVBNEZOQkFPQkRRUUFBTkVFQUFDUkJBQ0FVUVFCQUJFRUF3T2hBQUNESlFBREFxVUFBUUlwQUFPQlZRQUJnRjBBQXdMRS9BR0M0UGdEQVRMOEFZT2EvQUlBV3dBQkF2YjhBd0FTL0FNQWJQd0FnelQ4QWdDWkFBSUJtUUFCQWswQUFRTE5BQUVEVFFBQkE4MEFBb0FsQkFLQVpRUUNnS1VFQW9EbEJBQ0NoUVFCQW1VRUFRSkZCQUdDSlFRQmdnVUVBNEhKQkFBQmpRUUFBVTBFQUlFTkJBQ0F6UVFCQUkwRUFRQk5CQUVBRFFRQ0E1a0FBZ01aQUFJQ21RQUNBaGtBQVFFMUFBR0FOUUFEQW16OEFZRXMrQU9CY3Z3Qmc2cjhBd0JUQUFFQ3p2d0JndUw0QUFFay9BT0RmUHdBZ0xrQUFvR3hBQUtDVlFBQkF0VUFBQU5WQUFNRDBRQUJBQ2tFQVFCcEJBQ0FxUVFBZ09rRUFRS0JCQUVDWVFRQmdrRUVBWUloQkFJQ0FRUUFnY1VFQUlHRkJBRUJSUVFCZ1FVRUFnREZCQUtBaFFRREFFVUVBQUFKQkFHRGtRQURneEVBQVlLVkFBTUNGUUFCZ1RFQUF3QXhBQUtDWlB3REE5VDBBQUlDL0FFRC92d0NBRWNBQXdLbS9BQUN0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFHQzVRQUJBMlVBQTRQaEFBRUFNUVFBZ0hFRUFBQ3hCQU9BN1FRQWduMEVBUUpkQkFFQ1BRUUJnaDBFQTRINUJBQUJ2UVFBZ1gwRUFZRTlCQUlBL1FRQ2dMMEVBNEI5QkFBQVFRUUFnQUVFQWdPQkFBS0RBUUFEQW9FQUFBSUZBQUlCQ1FBREFBMEFBQUl3L0FLQ1FQUUNBZ0w4QUlBREFBRUFNd0FDZ21iOEFZUCs5QUdCeFB3RGc4ejhBSURoQUFPQjJRQUFBbTBBQXdMcEFBS0RhUUFDQStrQUFRQTFCQUNBZFFRQWdMVUVBSUQxQkFPQ2RRUUFBbGtFQUlJNUJBQ0NHUVFDZ2ZFRUF3R3hCQUFCZFFRQWdUVUVBWUQxQkFJQXRRUUNnSFVFQXdBMUJBTUQ3UUFBZzNFQUFnTHhBQUNDZFFBQ0FlMEFBNER4QUFLRDhQd0FBZno4QUFQTzlBTUNWdndEQUNNQUF3QUhBQU9DR3Z3Q2d4THdBb0lJL0FLQUFRQUJnUUVBQUlJQkFBTUNmUUFCZ3YwQUFBTjlBQUtEK1FBQWdEMEVBQUI5QkFNQXVRUUNnUGtFQVFKeEJBSUNVUVFDZ2pFRUF3SVJCQU9CNVFRQWdha0VBWUZwQkFLQktRUURnT2tFQUlDdEJBRUFiUVFDQUMwRUFZUGRBQU9EWFFBQmd1RUFBNEpoQUFLQnlRQUNBTTBBQTRPYy9BS0JUUHdDZ2ZMNEFvSisvQUVBTXdBREE3cjhBSUdlL0FPQWVQZ0FnbVQ4QUFBdEFBR0JKUUFBQWhFQUFZS05BQU9EQ1FBQ0E0a0FBSUFGQkFBQVJRUURnSUVFQXdEQkJBS0JBUVFDQW1rRUF3SkpCQU9DS1FRQWdnMEVBb0haQkFBQm5RUUJBVjBFQW9FZEJBQUE0UVFCQUtFRUFvQmhCQU9BSVFRQkE4a0FBd05KQUFFQ3pRQURBazBBQWdHaEFBR0FwUUFBQTFqOEFvRFkvQUdERXZnQ0FzNzhBWUJEQUFBRFd2d0NnTnI4QUFNSStBT0N1UHdCZ0ZVQUFvRk5BQUNDSlFBQ2dxRUFBUU1oQUFNRG5RQUNnQTBFQVlCTkJBQ0FqUVFBQU0wRUF3RUpCQUlDWVFRREFrRUVBQUlsQkFFQ0JRUUFBYzBFQWdHTkJBT0JUUVFCZ1JFRUF3RFJCQUNBbFFRQmdGVUVBd0FWQkFDRHNRQURBekVBQWdLMUFBQ0NPUUFDZ1hVQUFRQjlBQUdEQ1B3QWdFVDhBWUJlL0FDREh2d0FnRDhBQUlMMi9BTUFFdndDQUdUOEFZTWMvQU1BaFFBQWdZRUFBWUk5QUFNQ3VRQUFnemtBQVlPMUFBR0FHUVFBQUZrRUF3Q1ZCQUlBMVFRQmdSVUVBUUpaQkFLQ09RUUFBaDBFQW9INUJBQ0J2UVFDQVgwRUFBRkJCQUlCQVFRQUFNVUVBZ0NGQkFBQVNRUUJnQWtFQXdPVkFBSURHUUFCQXAwQUE0SWRBQUNCUlFBREFFa0FBd0trL0FBQ3RQZ0RnUUw4QUlOdS9BS0FJd0FEQW5yOEFvSHkrQU1CUFB3Qmc0VDhBZ0M1QUFNQnNRQUNnbFVBQUFMVkFBR0RVUUFDZzgwQUFnQWxCQUVBWlFRRGdLRUVBb0RoQkFFQklRUURnazBFQVFJeEJBS0NFUVFBQWVrRUF3R3BCQUlCYlFRQWdURUVBb0R4QkFDQXRRUUNnSFVFQUlBNUJBQ0Q5UUFBZzNrQUFJTDlBQUFDZ1FBQUFnVUFBUUVSQUFHQUdRQUFna1Q4QVlPWTlBR0J4dndEZzg3OEE0UG0vQUlCL3Z3Q2d4RHdBZ0lZL0FDQUFRQURnUFVBQUFIeEFBQUNkUUFBQXZFQUFBTnRBQUNENlFBQ2dERUVBWUJ4QkFBQXNRUURBTzBFQVlFdEJBS0NSUVFBQWlrRUFZSUpCQUdCMVFRRGdaVUVBb0ZaQkFHQkhRUUJBT0VFQUFDbEJBS0FaUVFCQUNrRUFZUFZBQUdEV1FBQmd0MEFBWUpoQUFLQnlRQUNnTkVBQVlPNC9BQ0JuUHdDQUVyNEFvSkcvQUtBRHdBQUEyNzhBUUVLL0FPQ1dQZ0NncEQ4QXdBOUFBR0JOUUFEQWhVQUF3S1JBQU1ERFFBREE0a0FBNEFCQkFHQVFRUURnSDBFQWdDOUJBQUEvUVFDZ1RrRUF3STVCQUVDSFFRQ0FmMEVBb0hCQkFLQmhRUUJBVWtFQTRFSkJBR0F6UVFBQUpFRUF3QlJCQUtBRlFRRGc3RUFBUU01QUFJQ3ZRQUNna0VBQUlHTkFBQ0FsUUFCQXp6OEFZQ3cvQUNEV3ZnQkFzTDhBZ0FmQUFBQzN2d0FBOGI0QUFCby9BT0REUHdCQUgwQUE0RnhBQUdDTlFBQ0FyRUFBZ010QUFJRHFRQURBQkVFQVFCUkJBTUFqUVFCZ00wRUE0RUpCQUdCU1FRQUFqRUVBZ0lSQkFBQjZRUURnYWtFQTRGdEJBQ0JOUVFBZ1BrRUFJQzlCQU1BZlFRQmdFRUVBNEFCQkFBRGpRQUNBeEVBQUFLWkFBTUNIUUFEQVVrQUFvQlZBQUVDd1B3QWcxajRBWUN5L0FFRFB2d0JBQXNBQVlKTy9BQUEvdmdDQVhEOEFvT2MvQUlBeFFBRGdia0FBNEpWQUFJQzBRQUJBMDBBQVFQSkFBS0FJUVFBZ0dFRUFvQ2RCQUVBM1FRREFSa0VBUUZaQkFBQ0pRUUNnZ1VFQVFIUkJBR0JsUVFDQVZrRUFZRWRCQUdBNFFRQmdLVUVBb0JwQkFLQUxRUUFBK1VBQWdOcEFBT0M3UUFBQW5VQUFJSHhBQU1BK1FBQUFBa0FBQUl3L0FNRFlQUUJBYUw4QVFPMi9BS0RpdndBQVdiOEFBRDgrQUdDVFB3QkFCa0FBb0VKQUFLQi9RQUNnbmtBQWdMMUFBR0RjUUFBQSswQUF3QXhCQUNBY1FRQ2dLMEVBSUR0QkFLQktRUUFnV2tFQXdJVkJBQ0I5UVFCZ2JrRUFnRjlCQUtCUVFRREFRVUVBNERKQkFPQWpRUURnRkVFQXdBVkJBT0R0UUFCQTBFQUFJTEpBQU9DVFFBQUFhMEFBSUM1QUFHRGhQd0RBVHo4QUlIdStBTUNidndCQUFNQUFnTE8vQUlEeXZnQ0FEVDhBWUx3L0FFQWFRQURnVmtBQXdJbEFBQ0NvUUFCZ3hrQUE0T1JBQU1BQlFRQkFFVUVBb0NCQkFBQXdRUUJnUDBFQW9FNUJBQUJlUVFCZ2drRUFJSFpCQU9CblFRQmdXVUVBb0VwQkFPQTdRUUFBTFVFQUlCNUJBRUFQUVFCZ0FFRUF3T0pBQUlERVFBQ2dwa0FBSUlsQUFNQldRQUJBR2tBQUFMdy9BT0FHUHdEZ0JyOEFZTDIvQUdEMXZ3QkFpYjhBd05pOUFPQm5Qd0RBNno4QUFERkFBQUJzUUFEZ2swQUFJTEpBQUlEUVFBRGc3a0FBb0FaQkFNQVZRUUFBSlVFQVFEUkJBS0JEUVFBZ1UwRUFnR0pCQUdCK1FRQ0FiMEVBNEdCQkFHQlNRUUFnUkVFQW9EVkJBQUFuUVFCQUdFRUFZQWxCQUFEMVFBQkExMEFBd0xsQUFPQ2JRQUJBZTBBQUFEOUFBQUFFUUFDQWtqOEFBRDgrQUFCWnZ3REE0YjhBSU0rL0FLQTF2d0Fnb2o0QWdLQS9BT0FLUUFDZ1JrQUFvSUZBQUtDZlFBQkF2VUFBNE5wQUFBRDVRQUNnQzBFQTRCcEJBQUFxUVFCQU9VRUFZRWhCQUtCWFFRRGdaa0VBQUhkQkFDQnBRUUNnV2tFQTRFdEJBQ0E5UVFDZ0xrRUFRQ0JCQUFBU1FRQmdBMEVBSU9sQUFJRExRQURnclVBQUlKQkFBQ0JsUUFBQUtrQUFBTncvQUtCSFB3QWdjTDRBb0phL0FJRHh2d0NBb0w4QUlLSytBS0ExUHdBZ3p6OEFvQ0pBQUNCZVFBQ2dqRUFBUUtwQUFJRElRQUNnNWtBQVFBSkJBQUFSUVFBQUlFRUFJQzlCQUVBK1FRQ0FUVUVBb0Z4QkFNQnJRUUFnYjBFQUlHRkJBR0JUUVFCZ1JVRUFBRGRCQUVBb1FRQmdHVUVBNEFwQkFBRDVRQUJnM0VBQWdMOUFBQUNpUUFCQWhFQUFnRTFBQUVBU1FBQUFyajhBd09VK0FBQWF2d0RBdzc4QVFOaS9BT0JRdndEZ0dENEFZSW8vQUVEK1B3Q0FPa0FBd0hWQUFHQ1lRQUFndGtBQXdOTkFBR0R4UUFDZ0IwRUF3QlpCQU9BbFFRREFORUVBb0VOQkFLQlNRUURBWVVFQTRIQkJBS0JuUVFDQVdVRUFZRXRCQUdBOVFRQ2dMMEVBd0NGQkFFQVRRUUNnQkVFQWdPdEFBRURPUUFDQXNVQUE0SlJBQUdCd1FBRGdOVUFBNFBRL0FJQitQd0NneER3QUFIYS9BR0RrdndBZ3FyOEFJTTIrQUtBalB3Qmd3ejhBd0JwQUFBQlVRQURBaGtBQVFLUkFBQURDUUFDZzMwQUFZUDFBQUlBTlFRQmdIRUVBUUN0QkFFQTZRUUJnU1VFQVlGaEJBRUJuUVFBZ2RrRUFnRjlCQUtCUlFRRGdRMEVBd0RWQkFLQW5RUURBR1VFQUFBeEJBT0Q3UUFCQTMwQUFBTUpBQUVDa1FBREFoa0FBQUZSQUFNQWFRQUJnd3o4QW9DTS9BQ0ROdmdBZ3FyOEFBTnUvQUtCbnZ3QkFYejBBd0g0L0FPRDBQd0RnTlVBQVlIQkFBT0NVUUFDQXNVQUFRTTVBQUlEclFBQ2dCRUVBZ0JOQkFFQWlRUUFnTVVFQUFFQkJBT0JPUVFEQVhVRUE0R3hCQU9CN1FRQWdWMEVBZ0VsQkFNQTdRUUFBTGtFQVFDQkJBQUFTUVFEZ0EwRUFRT3hBQU1EUVFBQmd0RUFBd0pkQUFLQjFRQUNBT2tBQVFQNC9BR0NLUHdEZ0dENEE0RkMvQUNEUnZ3Q0FvYjhBb05DK0FNQU1Qd0RndHo4QUFCVkFBRUJPUUFCQWhFQUFBS0pBQUlDL1FBQmczRUFBQVBsQUFPQUtRUUJnR1VFQVFDaEJBQ0EzUVFBQVJrRUF3RlJCQUtCalFRQ0Fja0VBb0lCQkFJQlBRUUJnUVVFQWdETkJBT0FsUVFBZ0dFRUFZQXBCQUFENVFBQ0EzRUFBWU1CQUFBQ2xRQUJnaVVBQW9GbEFBSUFnUUFDZ3pqOEFvRFUvQUNDaXZnQ0FvTDhBSU02L0FPQlF2d0RnR0Q0QW9JZy9BS0R6UHdDZ01VQUE0R3BBQUFDU1FBQ2dya0FBb010QUFDRHBRQUJnQTBFQUFCSkJBRUFnUVFDZ0xrRUFJRDFCQU9CTFFRREFXa0VBb0dsQkFHQjRRUUNnZzBFQTRFaEJBRUE2UVFEQUswRUFvQjFCQU9BUFFRQkFBa0VBNE9oQUFLRE5RQUNBc1VBQUFKVkFBQ0J5UUFBQVBFQUE0QU5BQU1DVlB3QWdoRDRBb0RxL0FJREV2d0FnbGI4QUlKYStBSUFuUHdCZ3d6OEFvQnBBQU1CUlFBQWdoRUFBWUtCQUFBQzlRQUNBMlVBQVFQWkFBSUFKUVFCQUdFRUFBQ2RCQUtBMVFRQWdSRUVBWUZKQkFPQmdRUUNBYjBFQVlINUJBS0NHUVFCZ1EwRUFRRFJCQUVBbFFRQ0FGa0VBQUFoQkFPRHpRQUNBMkVBQUlMMUFBS0NoUUFCZ2hrQUFBRlJBQUFBYlFBQ2d5RDhBSURvL0FDQ0V2Z0RBbGI4QW9MVy9BR0FsdndBZ2xqNEFJSlUvQUtBQVFBQ0FOMEFBZ0hCQUFLQ1VRQURncjBBQWdNdEFBT0RuUUFCQUFrRUFnQkJCQU9BZVFRQkFMVUVBNER0QkFLQktRUUJnV1VFQTRHZEJBQ0IyUVFCZ2drRUFvSWxCQUFBL1FRQ0FMMEVBSUNCQkFNQVFRUUNnQVVFQW9PVkFBSURJUUFDZ3JFQUFZSkZBQUtCclFBQmdOVUFBUVB3L0FHQ0tQd0NnTGo0QUFFRy9BSUMzdndBQWFyOEFRTSs4QUlCYlB3Q2cxajhBUUNGQUFHQllRQUJBaDBBQVFLTkFBTUMvUUFEZzIwQUFJUGRBQUlBSlFRREFGMEVBQUNaQkFHQTBRUUNnUWtFQUFGRkJBS0JmUVFCZ2JrRUFJSDFCQU1DRlFRQUFqVUVBNER0QkFDQXNRUUJnSEVFQW9BeEJBQ0Q2UUFBZzIwQUFnTHhBQUdDZVFBQWdnVUFBNEVwQUFLQVVRQUFndXo4QWdDSS9BRUMydmdBZ25yOEE0SmEvQU1DeXZnQUFGVDhBZ0xNL0FLQU9RQURBUTBBQUFIbEFBT0NYUUFCQXMwQUFvTTVBQU1EcVFBQ2dBMEVBZ0JGQkFFQWZRUUJBTFVFQWdEdEJBTUJKUVFBZ1dFRUFZR1pCQU1CMFFRQ2dnVUVBQUlsQkFHQ1FRUUFnT2tFQUlDcEJBRUFhUVFCQUNrRUF3UFJBQUFEVlFBQkF0VUFBb0pWQUFNQnNRQUFBTDBBQTRPYy9BT0IyUHdCQVh6MEE0RGEvQUlCN3Z3QmdGcjhBd0pnK0FJQ1FQd0RnK1Q4QUFESkFBQ0JuUUFBZ2prQUF3S2hBQUtERFFBQWczMEFBZ1BwQUFBQUxRUUFnR1VFQVlDZEJBQ0ExUVFBQVEwRUFBRkZCQUVCZlFRQ2diVUVBNEh0QkFDQ0ZRUUJBakVFQWdKTkJBS0E1UVFEQUtVRUF3QmxCQU1BSlFRQ0E4MEFBZ05OQUFJQ3pRQUNnazBBQWdHZEFBT0FuUUFDZzBUOEFJRE0vQUlBZ1BnREE5VDBBd1BVOUFDQmhQZ0JBYWo4QUFOby9BR0FnUUFDQVZVQUFRSVZBQU9DZlFBQ0F1a0FBSU5WQUFNRHZRQUNBQlVFQVFCTkJBT0FnUVFEQUxrRUE0RHhCQUFCTFFRRGdXRUVBb0daQkFNQjBRUUNBZ1VFQW9JaEJBT0NQUVFBQWwwRUFvRHBCQU1BcVFRRGdHa0VBQUF0QkFHRDJRQURnMWtBQWdMZEFBR0NZUUFDQWMwQUFJRGhBQUVBQlFBQ0FyejhBb0prL0FLQ1pQd0NnbVQ4QXdKcy9BS0RLUHdBQUUwQUFJRVpBQUNCNVFBQUFsMEFBb0xGQUFFRE1RQURnNWtBQXdBQkJBQUFPUVFCZ0cwRUFJQ2xCQU9BMlFRQ0FSRUVBZ0ZKQkFLQmdRUURBYmtFQWdIeEJBRUNGUVFCQWpFRUFZSk5CQUlDYVFRQUFQVUVBUUMxQkFLQWRRUUFnRGtFQVlQMUFBTURlUUFEQXdFQUFZS05BQUVDSFFBREFXa0FBQUM5QUFDQVRRQURBREVBQXdBeEFBTUFNUUFCZ0RVQUF3QnRBQUFBL1FBQ2diRUFBd0k5QUFDQ3BRQUJndzBBQUFONUFBS0Q0UUFDZ0NVRUE0QlpCQUVBa1FRQ0FNVUVBQUQ5QkFNQk1RUUNBV2tFQVFHaEJBRUIyUVFCQWdrRUFRSWxCQUNDUVFRQWdsMEVBSUo1QkFLQkFRUUJBTVVFQUFDSkJBT0FTUVFBQUJFRUE0T3BBQUtET1FBQ0FzMEFBWUpwQUFFQ0VRQURBWlVBQUlGRkFBTUJNUUFEQVRFQUF3RXhBQUVCTlFBQmdWMEFBUUhKQUFLQ01RQUJnbzBBQVlMeEFBQURXUUFEQTcwQUFJQVZCQUlBU1FRREFIMEVBSUMxQkFHQTZRUURBUjBFQUlGVkJBTUJpUVFDQWNFRUFJSDVCQUFDR1FRQUFqVUVBSUpSQkFBQ2JRUUFBb2tFQWdFVkJBSUEyUVFEQUowRUFRQmxCQUFBTFFRQ0Era0FBSU9CQUFJREhRQUJBc1VBQVlKNUFBQ0NRUUFBZ2lFQUFZSVpBQUdDR1FBQmdoa0FBZ0laQUFJQ0tRQUFnbFVBQVlLVkFBTUM1UUFDQTBFQUFJT2xBQUdBQlFRQWdEa0VBWUJ0QkFLQW9RUUFBTmtFQVFFTkJBS0JRUVFEZ1hVRUFRR3RCQUtCNFFRQkFnMEVBQUlwQkFPQ1FRUURnbDBFQTRKNUJBQUNtUVFDQVMwRUFBRDFCQU1BdVFRRGdJRUVBWUJOQkFJQUdRUURBOUVBQVlONUFBS0RLUUFCQXVrQUFZSzVBQU1DblFBQmdwa0FBWUtaQUFHQ21RQUNBcGtBQXdLbEFBSUN5UUFCZ3dFQUFJTkpBQUFEblFBREEvVUFBQUF0QkFNQVhRUUNBSkVFQWdERkJBT0ErUVFBZ1RFRUFnRmxCQU1CbVFRQWdkRUVBd0lCQkFHQ0hRUUFnamtFQUFKVkJBT0NiUVFEQW9rRUF3S2xCQUlCU1FRQ0FSRUVBNERaQkFNQXBRUUFBSFVFQUFCRkJBTUFGUVFCQTkwQUFvT1ZBQUdEWFFBQWd6VUFBZ01kQUFHREdRQUJneGtBQVlNWkFBSURHUUFBZ3lVQUFvTkJBQUtEY1FBQkE3RUFBQVA5QUFDQUtRUUNBRlVFQWdDRkJBQ0F1UVFEZ09rRUE0RWRCQUFCVlFRQmdZa0VBb0c5QkFBQjlRUUFnaFVFQXdJdEJBSUNTUVFBZ21VRUFBS0JCQU9DbVFRREFyVUVBZ0ZwQkFDQk5RUUFBUUVFQWdETkJBS0FuUVFCZ0hFRUFBQkpCQU1BSVFRRGdBRUVBSVBWQUFFRHNRQUJnNTBBQVlPWkFBR0RtUUFCZzVrQUFnT1pBQU1Eb1FBQkE3MEFBd1BsQUFPQURRUUJnREVFQUFCWkJBTUFnUVFBZ0xFRUFBRGhCQUlCRVFRQmdVVUVBSUY1QkFFQnJRUUNBZUVFQTRJSkJBS0NKUVFCQWtFRUE0SlpCQUlDZFFRQkFwRUVBQUt0QkFPQ3hRUUJnWTBFQWdGWkJBQUJLUVFBZ1BrRUFBRE5CQUlBb1FRQUFIMEVBZ0JaQkFHQVBRUURBQ1VFQXdBVkJBS0FEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFSQkFDQUhRUURBQzBFQUFCSkJBTUFaUVFDZ0lrRUFvQ3hCQUdBM1FRREFRa0VBb0U1QkFBQmJRUURBWjBFQWdIUkJBTUNBUVFCZ2gwRUFBSTVCQUtDVVFRQmdtMEVBQUtKQkFLQ29RUUJBcjBFQUFMWkJBT0JzUVFDZ1lFRUF3RlJCQUlCSlFRQUFQMEVBUURWQkFHQXNRUUNnSkVFQUlCNUJBQUFaUVFDQUZVRUFvQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUFnRkVFQXdCWkJBT0FhUVFDZ0lFRUFvQ2RCQU1BdlFRQUFPVUVBSUVOQkFBQk9RUUJnV1VFQUlHVkJBR0J4UVFBZ2ZrRUFnSVZCQU9DTFFRQ0Fra0VBSUpsQkFNQ2ZRUUJncGtFQUlLMUJBTUN6UVFCZ3VrRUFRSGRCQUdCclFRQWdZRUVBZ0ZWQkFLQkxRUUNBUWtFQVFEcEJBQ0F6UVFBZ0xVRUFnQ2hCQUVBbFFRQ0FJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBQUFrUVFCZ0prRUFJQ3BCQUdBdlFRREFOVUVBWUQxQkFBQkdRUUNBVDBFQXdGbEJBS0JrUVFEZ2IwRUF3SHRCQUFDRVFRQkFpa0VBb0pCQkFBQ1hRUUNnblVFQVFLUkJBT0NxUVFDQXNVRUFJTGhCQU9DK1FRQUFnVUVBd0haQkFDQnNRUUFBWWtFQW9GaEJBQUJRUVFCZ1NFRUF3RUZCQUVBOFFRQUFPRUVBSURWQkFJQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFBRFJCQUNBMlFRQ2dPVUVBWUQ1QkFFQkVRUUJnUzBFQVlGTkJBRUJjUVFEZ1pVRUFRSEJCQUVCN1FRQkFnMEVBSUlsQkFFQ1BRUUNBbFVFQTRKdEJBRUNpUVFEQXFFRUFRSzlCQUFDMlFRQ2d2RUVBUU1OQkFNQ0dRUUJnZ1VFQVlIaEJBT0J1UVFBQVprRUFBRjVCQU9CV1FRQ2dVRUVBb0V0QkFLQkhRUURnUkVFQWdFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRRGdRMEVBNEVWQkFDQkpRUUNBVFVFQUFGTkJBS0JaUVFBZ1lVRUFnR2xCQUtCeVFRQmdmRUVBWUlOQkFPQ0lRUUNnamtFQWdKUkJBSUNhUVFEQW9FRUFBS2RCQUlDdFFRRGdzMEVBWUxwQkFBREJRUURBeDBIWEYyUTdYejVnNVhBLzF4ZmpwUnM5aUJaWnZxb3lNakk0TlRZd056TTNsTmdYQUVCK1BnQ0EzRDBBNElzK0FNQUxQc2d3ejJPUzF4WTBBQUFBUEFBQUFNZ3d3QmNBQUt4QkFHQ21RUURBb0VFQVlKdEJBRUNXUVFCQWtVRUFnSXhCQU9DSFFRQmdnMEVBSUg1QkFFQjJRUUFBYjBFQTRHZEJBT0JnUVFEQVdrRUFnRlZCQUlCUVFRQ2dTMEVBb0VkQkFJQkVRUUJnUVVFQW9ENUJBQ0E5UVFEQVBFRUF3RHhCQU1BOFFRREFQRUVBd0R4QkFNQThRUUJBUFVFQUFEOUJBQUJDUVFCQVJVRUFBRWxCQUFCTlFRQ0FVVUVBb0ZaQkFLQmNRUUNBWTBFQXdHcEJBT0J4UVFEQWVVRUFJSUZCQUtDRlFRQUFpa0VBd0k1QkFNQ1RRUUFBbVVFQVlKNUJBQUNrUVFEQXFVRUFZSzlCQUdDbVFRQ2dvRUVBQUp0QkFHQ1ZRUUFBa0VFQUFJdEJBQ0NHUVFCQWdVRUFZSGxCQUtCd1FRQkFhRUVBd0dCQkFJQlpRUUJnVWtFQTRFdEJBR0JHUVFCQVFVRUFRRHhCQUFBNFFRREFORUVBb0RGQkFNQXVRUUFnTFVFQXdDeEJBTUFzUVFEQUxFRUF3Q3hCQU1Bc1FRREFMRUVBWUMxQkFFQXZRUUJBTWtFQW9EVkJBSUE1UVFDQVBVRUFRRUpCQU1CSFFRQWdUa0VBUUZWQkFHQmNRUURnWTBFQUlHeEJBQUIxUVFEZ2ZVRUFnSU5CQUlDSVFRQ2dqVUVBSUpOQkFNQ1lRUUJnbmtFQUlLUkJBT0NwUVFEQW9FRUFBSnRCQUdDVlFRREFqMEVBSUlwQkFNQ0VRUUNBZjBFQXdIVkJBRUJzUVFCQVkwRUFnRnBCQUlCU1FRQkFTMEVBSUVSQkFDQTlRUUJBTjBFQUlESkJBQ0F0UVFDQUtFRUFJQ1ZCQUFBaVFRQUFIMEVBSUIxQkFNQWNRUURBSEVFQXdCeEJBTUFjUVFEQUhFRUF3QnhCQUdBZFFRQ0FIMEVBb0NKQkFDQW1RUUFBS2tFQUlDNUJBQ0F6UVFEZ09FRUF3RDlCQU9CR1FRQWdUa0VBSUZaQkFNQmVRUUNnWjBFQXdIQkJBR0I2UVFCZ2drRUF3SWRCQUdDTlFRQWdrMEVBd0poQkFJQ2VRUUNBcEVFQVlKdEJBR0NWUVFEQWowRUFBSXBCQUdDRVFRQ2dmVUVBQUhOQkFBQnBRUUJnWDBFQUFGWkJBQUJOUVFDQVJFRUE0RHhCQU1BMVFRQ2dMa0VBUUNoQkFBQWpRUURnSFVFQUFCbEJBR0FWUVFCQUVrRUFJQTlCQUVBTlFRREFERUVBd0F4QkFNQU1RUURBREVFQXdBeEJBTUFNUVFDQURVRUF3QTlCQU9BU1FRQ2dGa0VBZ0JwQkFPQWVRUUFnSkVFQVlDcEJBSUF4UVFDZ09FRUFJRUJCQUtCSVFRQ0FVVUVBWUZwQkFBQmtRUUFnYmtFQUFIbEJBQ0NDUVFEQWgwRUFnSTFCQUVDVFFRQkFtVUVBZ0o5QkFFQ1dRUUFBa0VFQUlJcEJBR0NFUVFCZ2ZVRUFJSEpCQUFCblFRQ0FYRUVBb0ZKQkFBQkpRUURBUDBFQTREWkJBTUF1UVFDQUowRUFRQ0JCQUdBWlFRREFFMEVBd0E1QkFNQUpRUURBQlVFQW9BSkJBQUQvUUFDQStrQUFvUGxBQUtENVFBQ2crVUFBb1BsQUFLRDVRQUNnK1VBQUlQdEFBQ0FBUVFCQUEwRUFJQWRCQUFBTFFRREFEMEVBUUJWQkFBQWNRUUFnSTBFQVlDcEJBSUF5UVFCQU8wRUFJRVJCQUlCTlFRQ2dWMEVBWUdKQkFLQnRRUURnZUVFQUlJSkJBQUNJUVFBQWprRUFRSlJCQUtDYVFRQkFrVUVBQUl0QkFNQ0VRUUNnZlVFQUlISkJBTUJtUVFDQVcwRUFZRkJCQUFCR1FRQkFQRUVBb0RKQkFJQXBRUURnSUVFQUlCbEJBQUFTUVFEZ0NrRUFvQVJCQUNEL1FBQUE5VUFBUU94QUFPRGxRQUNnMzBBQW9OcEFBS0RaUUFDZzJVQUFvTmxBQUtEWlFBQ2cyVUFBb05sQUFFRGJRQURnNEVBQVlPZEFBQ0R2UUFCQTkwQUFvQUJCQUtBR1FRREFEVUVBNEJSQkFJQWNRUUFnSlVFQUFDNUJBQ0EzUVFBQVFVRUF3RXRCQUFCWFFRQkFZa0VBb0cxQkFHQjVRUURBZ2tFQUFJbEJBR0NQUVFBQWxrRUF3SXhCQUNDR1FRQ0FmMEVBQUhOQkFBQm5RUUNBVzBFQUlGQkJBT0JFUVFEZ09VRUFnQzlCQU9BbFFRQkFIRUVBWUJOQkFBQUxRUUNnQTBFQUFQbEFBSURyUUFEQTRFQUFvTlpBQUNETlFBQ0F4a0FBUU1CQUFNQzZRQUNndVVBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQUtDNVFBQ2d1MEFBZ01GQUFHRElRQUFnMEVBQW9OaEFBQ0RqUUFDQThFQUF3UDVBQUtBR1FRQUFEMEVBd0JkQkFNQWdRUUNBS2tFQUlEVkJBR0JBUVFDZ1MwRUFBRmRCQU1CaVFRRGdia0VBZ0h0QkFFQ0VRUURnaWtFQW9KRkJBRUNJUVFDZ2dVRUFBSFpCQUFCcFFRQ0FYRUVBWUZCQkFPQkVRUUNBT1VFQVFDNUJBRUFqUVFBQUdVRUFZQTlCQUNBR1FRQ0Era0FBd09wQUFHRGNRQUJBemtBQVlNSkFBRUM0UUFCZ3JrQUFRS2RBQUFDaFFBQUFtMEFBb0psQUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFDZ21VQUFBSnhBQUVDaVFBQmdxVUFBSUxGQUFFQzZRQURBeFVBQTROTkFBQ0RpUUFDZzhVQUFvQUZCQUlBS1FRQUFGRUVBZ0I1QkFNQXBRUUFBTlVFQVlFQkJBQ0JNUVFDQVdFRUFRR1ZCQUdCeVFRQ2dmMEVBZ0laQkFDQ05RUURnZzBFQVFIcEJBQUJ0UVFEQVgwRUFvRkpCQUFCR1FRRGdPVUVBUUM1QkFPQWlRUUNnRjBFQW9BeEJBS0FDUVFBZzhrQUF3TjlBQUtET1FBREF2MEFBZ0xGQUFFQ2tRQURnbVVBQXdJOUFBT0NIUUFDZ2dVQUE0SFpBQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBYzBBQVFITkFBRUI1UUFEZ2drQUFZSXBBQUVDU1FBQWduRUFBNEtoQUFFQzNRQURneFVBQTROWkFBS0RvUUFBZyswQUE0QWRCQUNBVFFRQmdIa0VBd0NsQkFLQTFRUUFBUWtFQTRFNUJBQ0JjUVFDQWFVRUF3SFpCQUNDQ1FRQUFpVUVBUUg5QkFJQnhRUUFnWkVFQXdGWkJBSUJKUVFCQVBFRUFnQzlCQUVBalFRQ2dGMEVBUUF4QkFBQUJRUUJBN0VBQWdOaEFBR0RGUUFCZ3MwQUFRS05BQU9DVVFBREFoa0FBSUhkQUFBQmpRQUFnVVVBQW9FUkFBQ0E0UUFCQU0wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQXpRQURBT2tBQVlFZEFBTUJXUUFBZ1owQUF3SHhBQUVDTVFBQ2dta0FBb0twQUFFQzhRQUJBemtBQW9PSkFBT0Q0UUFEQUIwRUFJQk5CQUFBZlFRQ2dLMEVBb0RoQkFBQkdRUUJBVTBFQW9HQkJBRUJ1UVFBZ2ZFRUFJSVZCQUtCM1FRQ0FhVUVBb0Z0QkFBQk9RUUNnUUVFQVFETkJBQUFtUVFBQUdVRUFvQXhCQUFBQlFRQmc2MEFBd05SQUFDQy9RQURBcTBBQTRKaEFBRUNIUUFDQWNFQUFBRlJBQUtBNlFBQmdKa0FBQUJOQUFHQUdRQURnOHo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQUdEbVB3REE1ajhBQVBrL0FHQUpRQURBR0VBQVlDcEFBT0JDUUFCZ1gwQUFJSDFBQUFDUVFBREFvVUFBZ0xWQUFLRExRQUJBNGtBQUlQbEFBSUFJUVFCQUZVRUFnQ0pCQU1BdlFRQWdQVUVBb0VwQkFHQllRUUNBWmtFQXdIUkJBSUNCUVFCZ2NFRUFJR0pCQU9CVFFRREFSVUVBNERkQkFJQXFRUUFnSFVFQTRBOUJBS0FDUVFCQTdFQUF3TlJBQUNDK1FBQ0FwMEFBUUpKQUFDQitRQUFBV1VBQWdEZEFBTUFhUUFCQS9qOEE0Tk0vQUtDclB3QWdrVDhBWUhFL0FNQk1Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEFRRTQvQUVCN1B3RGdsejhBQUxjL0FDRGRQd0NnQ1VBQVFDWkFBRUJIUUFDZ2FrQUFZSWhBQUdDZVFBQUF0VUFBNE10QUFDRGtRQUFBL2tBQVFBeEJBS0FaUVFBQUowRUFvRFJCQU1CQ1FRQUFVVUVBUUY5QkFLQnRRUUFnZkVFQVlHbEJBQUJiUVFDZ1RFRUFZRDVCQUNBd1FRQUFJa0VBUUJSQkFBQUhRUUJBODBBQXdOaEFBQ0MvUUFDQXAwQUE0SkJBQUtCMFFBQUFTMEFBd0NSQUFLQUFRQUJnd3o4QVlJby9BQUE0UHdBZ3pUNEFZT1k5QUdEbXZRQUFyYjRBWUxpK0FHQzR2Z0JndUw0QVlMaStBT0NXdmdDZ2tMMEFBRW8rQUFEeFBnQWdVVDhBSUtFL0FBRGVQd0FnRWtBQXdEWkFBR0JpUUFEQWgwQUFvSjVBQUVDM1FBQ0EwVUFBSU94QUFHQURRUUFBRVVFQTRCNUJBQ0F0UVFDQU8wRUE0RWxCQUlCWVFRQkFaMEVBSUhaQkFBQmpRUUJBVkVFQW9FVkJBRUEzUVFEZ0tFRUFvQnBCQUVBTVFRQ2cvRUFBZ09GQUFPREdRQUJBckVBQVFKSkFBS0IwUUFCQVIwQUFJQnBBQUdEa1B3QUFtRDhBZ0NjL0FPQVlQZ0Fnb3I0QUlDcS9BR0J4dndBZ2tiOEF3S20vQUVDenZ3QkFzNzhBUUxPL0FFQ3p2d0NncEw4QUFJeS9BSUJjdndBQUdyOEE0QmkrQUFDNVBnQUFhajhBUUxzL0FPQUhRQUFnTlVBQUFHTkFBS0NLUUFCQXBVQUF3TDlBQUtEYVFBQmc5a0FBWUFsQkFNQVhRUUFnSmtFQXdEUkJBSUJEUVFCZ1VrRUFRR0ZCQUNCd1FRQ2dYVUVBZ0U1QkFJQS9RUUNBTUVFQTRDRkJBR0FUUVFBZ0JVRUFvTzFBQUNEUlFBQmd0VUFBb0pwQUFBQ0FRQUFnUzBBQUlCcEFBS0RaUHdCQWdEOEFZTW8rQUNDV3ZnRGdVTDhBZ0tDL0FJREx2d0JBODc4QXdBWEFBT0FPd0FBQUVNQUFZQS9BQUdBUHdBQ2dFc0FBd0EzQUFHQUR3QUNnNTc4QW9NRy9BR0NLdndBQUZiOEFRTTg4QUdBM1B3Q0F0VDhBSUFsQUFLQThRQURBY1VBQWdKTkFBT0N1UUFCQXkwQUE0T2RBQUdBQ1FRQWdFVUVBNEI5QkFNQXVRUUNnUFVFQWdFeEJBS0JiUVFEZ2FrRUFvRmhCQUdCSlFRQkFPa0VBQUN0QkFPQWJRUURnREVFQVFQeEFBR0RmUUFDZ3drQUFBS1pBQUtDSlFBQ0FYRUFBWUNkQUFPRGtQd0JBZ0Q4QW9JSStBSUFHdndEQWpyOEFZTmEvQUNBSndBRGdGTUFBSUF6QUFBRDZ2d0JBNXI4QVFORy9BTURNdndBZ3piOEE0TisvQU9EdXZ3REFDY0FBb0JqQUFLQVh3QUJnK2I4QWdMTy9BS0JXdndDZ3RiMEFvRUUvQUtESVB3QkFHVUFBSUU5QUFNQ0RRQUJnb0VBQVFMMUFBT0RhUUFDZytFQUFJQXRCQUFBYVFRQUFLVUVBUURoQkFLQkhRUUFBVjBFQWdHWkJBQUJVUVFDQVJFRUFRRFZCQUFBbVFRREFGa0VBb0FkQkFPRHdRQURBMGtBQTRMUkFBTUNYUUFCQWRrQUFJRDFBQU1BRVFBQ0FuajhBb05BK0FJQUd2d0JBbzc4QVFQTy9BSUFad0FBQUM4QUFJTnEvQU1Da3Z3Q0FmNzhBUUU2L0FHQXN2d0NnR2I4QXdCdS9BQUJKdndCQWFMOEF3SnUvQU1ET3Z3QWdDY0FBd0NUQUFDQU93QUNBeGI4QWdFQy9BTUFwUGdEZ2dqOEFBUEUvQU1BeFFBQUFiRUFBd0pOQUFHQ3hRQUFBejBBQUFPMUFBTUFGUVFBZ0ZVRUFvQ1JCQUNBMFFRQ2dRMEVBSUZOQkFNQmlRUUJnVUVFQXdFQkJBQ0F4UVFDQUlVRUFBQkpCQUtBQ1FRREE1a0FBZ01oQUFDQ3FRQURBaTBBQWdGdEFBS0FnUUFEQXpqOEFvRG8vQU1CZ3ZnQ2dpYjhBNFBLL0FLQWd3QURnQjhBQW9MVy9BQ0JTdndBQXQ3NEFvTVE4QU9DV1BnQ0EyRDRBb0JrL0FNQUVQd0FBdGo0QXdOZzlBS0NKdmdBZ1FyOEFnTFcvQU9BSHdBREFLY0FBZ0FmQUFJQ2x2d0JBNkw0QWdBMC9BR0M4UHdDQUdVQUFZRlJBQU9DSFFBQmdwa0FBUU1WQUFFRGtRQUNnQVVFQVFCRkJBTUFnUVFCZ01FRUFJRUJCQU9CUFFRQ2dYMEVBd0UxQkFBQStRUUJBTGtFQWdCNUJBS0FPUVFEQS9VQUFZTjVBQUNDL1FBQkFvRUFBb0lGQUFLQkdRQUFnQ2tBQXdKcy9BS0NKUGdDZ09yOEF3TTIvQUNBYXdBQ2dDOEFBb0xXL0FHQTN2d0FnaWowQXdDUS9BQUNFUHdDZ3BEOEFJTFUvQU1ES1B3QkF2VDhBZ0s0L0FBQ01Qd0FnT2o4QW9MVTlBR0EzdndBQXQ3OEF3QS9BQUNBbXdBQ2c0cjhBb0ZtL0FPQVlQZ0NnalQ4QVlBTkFBQUJCUUFBQWYwQUFvSjVBQU1DOVFBQWczVUFBd1B4QUFDQU9RUUFBSGtFQXdDMUJBSUE5UVFCQVRVRUFBRjFCQUVCTFFRQmdPMEVBb0N0QkFNQWJRUUFBREVFQW9QaEFBQ0RaUUFDZ3VVQUFJSnBBQUNCMVFBRGdOVUFBNE80L0FFQm9Qd0RBMkwwQUFJeS9BTUFCd0FEQUlNQUFRTnEvQUNCU3Z3QWdpajBBNEZvL0FHREFQd0JBK2o4QXdBOUFBQ0FhUUFEQUkwQUF3QnhBQUNBVlFBREFBVUFBZ01VL0FLQmFQd0JBenp3QW9HZS9BS0RtdndDZ0pzQUFBQWpBQU9DWHZ3QUFTcjRBNEZ3L0FHRHFQd0JBTkVBQVFITkFBQ0NaUUFDQXVFQUFBTmhBQUlEM1FBQ0FDMEVBUUJ0QkFDQXJRUUFBTzBFQTRFcEJBTUJhUVFEZ1NVRUE0RGxCQU9BcFFRQUFHa0VBQUFwQkFDRDBRQUJBMUVBQWdMUkFBTUNVUUFCQWFrQUF3Q3RBQUNEYlB3RGdRRDhBQUxhK0FJQ3V2d0FnRmNBQUFCUEFBS0NydndBZ3piNEFvQ00vQUdEQVB3RGdFRUFBQURkQUFHQk5RQUJnV1VBQXdHRkFBT0JiUUFDQVVrQUF3RHBBQUNBUVFBQWd0ejhBd0FVL0FPQUd2d0NBdTc4QTRQMi9BTUQ1dndBQXNiOEFZTVMrQUtBMlB3QUExajhBWUNsQUFJQm9RQUFBbEVBQTRMTkFBTURUUUFEQTgwQUE0QWxCQU1BWlFRREFLVUVBd0RsQkFNQkpRUURBV1VFQW9FbEJBS0E1UVFDZ0tVRUFvQmxCQUtBSlFRQkE4MEFBUU5OQUFFQ3pRQUJBazBBQVlHWkFBR0FtUUFEQXpEOEFvQmsvQUNBUnZ3Qmd3cjhBUUI3QUFNQU13QUNnbWI4QVlQKzlBR0J4UHdCQTh6OEFnRFZBQUFCcVFBQ2doRUFBQUl4QUFBQ1FRQUNnalVBQVlJZEFBTUJuUUFDQUxrQUF3T00vQUFCWlB3QmdTNzRBWUc2L0FBQ0F2d0FBZ0w4QUFIdS9BQ0FQdndDZ0dUOEF3TXcvQUdBbVFBQmdaa0FBUUpOQUFFQ3pRQUJBMDBBQVFQTkFBS0FKUVFDZ0dVRUFvQ2xCQUtBNVFRQ2dTVUVBb0ZsQkFLQkpRUUNnT1VFQW9DbEJBS0FaUVFDZ0NVRUFRUE5BQUVEVFFBQkFzMEFBUUpOQUFHQm1RQUJnSmtBQXdNdy9BS0FaUHdDZ0diOEF3TXkvQU1BandBREFETUFBb0ptL0FHRC92UUJnY1Q4QUlQTS9BRUF5UUFCQVhrQUF3SGRBQU9DRlFBQUFqMEFBUUpaQUFLQ1dRQUFBZmtBQXdEOUFBR0FCUUFBZ2h6OEFBSUUrQU1EMVBRREE5VDBBd1BVOUFNRDFQUUFnQXo0QUFERS9BRURSUHdEQUowQUFZR2RBQUtDVFFBQ0FzMEFBZ05OQUFHRHpRQURBQ1VFQXdCbEJBS0FwUVFDZ09VRUFvRWxCQUtCWlFRQ2dTVUVBb0RsQkFLQXBRUUNnR1VFQW9BbEJBRUR6UUFCQTAwQUFRTE5BQUVDVFFBQ0Faa0FBZ0NaQUFDRE5Qd0RBR3o4QXdBUy9BRUM5dndCZ0hNQUFBQlBBQUtDcnZ3QWd6YjRBWUNFL0FPQzBQd0JBQmtBQVFDVkFBQUE4UUFEQVRrQUFJR0JBQUVCdlFBQUFmRUFBQUg5QUFLQlBRQUJnRmtBQVFNcy9BTUNiUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FJQ3ZQd0JBQVVBQUlEaEFBSUJ6UUFCZ21FQUFnTGRBQU9EV1FBQmc5a0FBQUF0QkFPQWFRUURBS2tFQW9EcEJBS0JLUVFDQVdrRUFBRXBCQUNBNlFRQWdLa0VBUUJwQkFFQUtRUURBOUVBQUFOVkFBRUMxUUFDZ2xVQUFvR3hBQUNBdVFBRGczejhBQUVrL0FBQ3R2Z0RBcWI4QUFCTEFBRUFsd0FDQTJyOEF3RisvQUtDMXZRQkFOajhBQUtFL0FBRFVQd0RBL3o4QUFCSkFBQ0FpUUFEQU1FQUE0RDFBQUdCTlFBQUFWa0FBQUQ1QUFNQWJRQUJnRFVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBQWdFMEFBQUM5QUFNQmFRQUJBaDBBQVlLTkFBTURBUUFEQTNrQUFZUDFBQUNBT1FRQ2dIVUVBUUMxQkFBQTlRUURBVEVFQWdGeEJBTUJMUVFEZ08wRUFJQ3hCQUdBY1FRQ2dERUVBb1BsQUFDRGFRQUNndWtBQUFKdEFBT0IyUUFBZ09FQUE0UFEvQU1CMlB3QUE2N3dBQUlTL0FDRDZ2d0RBSzhBQWdCSEFBS0RIdndEZ1dyOEFvQzYrQUVDMlBnQUFQVDhBZ0lZL0FDQ3FQd0RBeUQ4QUlPVS9BQ0FBUUFEQUQwQUFRQjlBQUlBdVFBQmdPRUFBWUQ1QUFJQkdRQUJBUzBBQXdFeEFBTUJNUUFEQVRFQUFJRkZBQU1CbFFBQkFoRUFBWUpwQUFJQ3pRQUNnemtBQTRPcEFBQUFFUVFEZ0VrRUFBQ0pCQUVBeFFRQ2dRRUVBQUZCQkFLQmZRUUJnVGtFQWdENUJBTUF1UVFBQUgwRUFJQTlCQUFEL1FBREEzMEFBd01CQUFDQ2lRQUNnZzBBQXdFcEFBQUFPUUFEQXBEOEFBTGMrQUlBaXZ3Qmd0cjhBSUE3QUFNQXN3QUFBRWNBQW9NcS9BR0NLdndBZ0s3OEFZSXErQUFEclBBQWd1VDRBUUNBL0FFQlRQd0NBaGo4QW9LUS9BTURDUHdCZzRUOEFJQUJBQUVBU1FBQmdKa0FBb0RwQUFPQlRRQUFnYkVBQTRIMUFBSUNHUUFBZ2tFQUFZSjVBQUVDeFFBQ0F4MEFBSU9CQUFJRDZRQUFBQzBFQVFCbEJBTUFuUVFDQU5rRUFnRVZCQUlCVVFRREFZMEVBQUZGQkFHQkJRUURBTVVFQVFDSkJBT0FTUVFDZ0EwRUF3T2hBQUlES1FBQWdyRUFBNEkxQUFFQmdRQUJBSmtBQVlOby9BSUJmUHdCQXp6d0FvRmEvQUNEQnZ3Q0FCc0FBd0NEQUFLQVl3QUJnL0w4QTRNcS9BTUNldndEQWRyOEFvRGEvQUFEeHZnQ2dmTDRBb01ROEFPQ1dQZ0JBRXo4QXdFOC9BSUNHUHdDZ3F6OEE0Tk0vQUVEK1B3REFHa0FBWURkQUFNQlZRQUNnZTBBQVlKRkFBQ0NuUUFEQXZFQUFBTk5BQUlEcVFBRGdBVUVBSUE5QkFJQWNRUUJBS2tFQVlEaEJBTUJHUVFBZ1ZVRUFvR05CQU1CVVFRQ0FSVUVBUURaQkFBQW5RUURnRjBFQW9BaEJBQUR6UUFBQTFVQUFnTGRBQUtDYVFBQUFmRUFBUUVSQUFLQVFRQUJBdXo4QVlEYy9BQ0NLdlFDQU9MOEFBS0cvQUNEYXZ3RGdDTUFBZ0JyQUFBQWF3QUJnRE1BQTRQUy9BTURWdndCQXVMOEF3SjYvQUlCL3Z3QkFRcjhBd0FTL0FLQjh2Z0FBNnp3QUlNMCtBQUE0UHdCZ2lqOEFZTU0vQUFEOVB3Q0FJa0FBd0VoQUFJQjBRQURna0VBQWdLZEFBQ0MvUUFEQTJFQUFRUE5BQUNBSFFRQUFGVUVBSUNOQkFJQXhRUURnUDBFQVlFNUJBQ0JkUVFEQVdFRUFBRXBCQUNBN1FRQWdMRUVBQUIxQkFDQU9RUUFBLzBBQUlPSkFBSURGUUFCZ3FVQUFZSTVBQU1CcFFBREFOa0FBNEFkQUFLQzFQd0FnVFQ4QW9DNCtBRUMydmdEZ1VMOEFvSnUvQU9ES3Z3Q0E4NzhBSUFyQUFFQVh3QUJnR3NBQXdCYkFBSUFNd0FBQStyOEFZTnUvQUNDOXZ3REFucjhBd0hhL0FDQXF2d0Fnb3I0QTRCZytBTUFrUHdBQWt6OEF3TjQvQUFBYVFBQkFSMEFBb0hSQUFFQ1NRQUJBckVBQUFNZEFBSURpUUFEQS9rQUF3QTFCQUNBY1FRQ2dLa0VBZ0RsQkFJQklRUUNnVjBFQTRGTkJBTUJGUVFEZ04wRUFnQ3BCQUdBZFFRQmdFRUVBd0FOQkFBRHVRQUNBMUVBQUlMdEFBSUNoUUFCZ2lFQUFZR0pBQUNBMVFBQmdDMEFBZ01vL0FHQ0tQd0RBSkQ4QTRCZytBS0NKdmdBZ0tyOEFnSEsvQU1DYnZ3QWd2YjhBWU51L0FBRDZ2d0NBRE1BQUFCakFBT0Fhd0FCQUY4QUFnQXpBQUVEMHZ3Q0F5NzhBZ0tDL0FPQlF2d0Fnc0w0QXdMSStBT0IrUHdDZzJUOEFJQnBBQUNCTFFBQUFnRUFBQUp0QUFFQzNRQURnMDBBQW9QQkFBQUFIUVFEZ0ZVRUFBQ1ZCQUNBMFFRQmdRMEVBZ0ZKQkFDQk5RUUNBUGtFQUlEQkJBQUFpUVFCQUZFRUFJQWRCQUVEMVFBQUEza0FBSU1sQUFLQzNRQUFncUVBQVlKbEFBSUNIUUFDZ1pFQUFZRDVBQUFBYlFBQmcvRDhBWU1NL0FDQ05Qd0FBUFQ4QUlNMCtBRUNhUFFBZ2U3NEF3QVMvQUVCQ3Z3Q0FmNzhBd0o2L0FDQzl2d0FBMXI4QTRQUy9BT0FOd0FCQUc4QUF3QnZBQUtBSndBRGcyYjhBQUpPL0FPQU92d0NnZ2o0QVFJQS9BT0RrUHdEQUowQUFnRjlBQUVDTVFBQWdxVUFBd01aQUFNRGtRQUNBQVVFQXdCQkJBT0FmUVFBZ0wwRUFZRDVCQU1CTlFRQmdSMEVBWURoQkFHQXBRUURBR2tFQVlBeEJBS0Q4UUFDZzRVQUFJTWhBQU1Dd1FBQ0FuRUFBb0l4QUFPQ0NRQUFBZ0VBQXdIcEFBR0JwUUFEQVVrQUFZRGRBQU1BYVFBREFBVUFBSU5RL0FLQ3JQd0NnaXo4QXdFOC9BRUFUUHdEZ2xqNEFvTVE4QUtCOHZnREFCTDhBb0RhL0FNQjJ2d0FncEw4QWdNdS9BQUQ5dndBZ0hjQUFnQi9BQU1ENHZ3QmdvNzhBZ0FhL0FLRFFQZ0NBb1Q4QW9BbEFBTUJEUUFCZ2YwQUFBSjVBQUdDOFFBQ2cya0FBSVBsQUFPQUxRUUJBRzBFQTRDcEJBSUE2UVFBZ1NrRUE0RUpCQUdBelFRQUFKRUVBNEJSQkFNQUZRUUFBN2tBQUlORkFBR0MxUUFCQW0wQUFvSU5BQUtCZ1FBQ0FSMEFBSUVCQUFBQkFRQUFBUUVBQUFFQkFBR0EvUUFCQU9VQUFRREpBQUFBbVFBQUFFMEFBQUFKQUFHRGhQd0RBd2o4QW9LUS9BSUNHUHdEQVR6OEFnQmsvQUNDNVBnQUE2endBNEtLK0FDQXJ2d0NBa0w4QTROcS9BSUFad0FDZ0pzQUE0UEsvQUtDSXZ3RGdHTDRBb0ZrL0FNRGpQd0NBTGtBQUFHdEFBQUNVUUFEQXNrQUE0TkZBQUNEeFFBQmdDRUVBSUJoQkFPQW5RUURBTjBFQWdFZEJBSUEvUVFEQUwwRUFJQ0JCQUlBUVFRRGdBRUVBQU9OQUFJREVRQUNncGtBQXdJbEFBQUJkUUFBZ0xVQUFBQXRBQUNBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUlBQkFBQUFMUUFDZ0xFQUFBRWhBQU1BK1FBQ0FMa0FBUUI5QUFNQVBRQUFnQUVBQVlPRS9BR0RIUHdBZ3FqOEFBSVEvQUFBNFB3QWdzRDRBd0ppK0FPQit2d0RnMnI4QUlDREFBRUFad0FBQXZMOEE0QWEvQU9BR1B3Q0F2VDhBd0J4QUFPQmJRQUNBalVBQUFLMUFBSURNUUFBQTdFQUF3QVZCQUlBVlFRQkFKVUVBSURWQkFPQkVRUUNBUFVFQW9DMUJBS0FkUVFEQURVRUF3UHRBQUNEY1FBQ0F2RUFBSUoxQUFDQjhRQUFnUDBBQUFBVkFBT0NuUHdDQWdEOEFBSUEvQUFDQVB3QUFnRDhBQUlBL0FJQ0FQd0RncHo4QUFBVkFBQUEvUUFEZ2JrQUFnR3hBQU9CY1FBQmdUVUFBNEQxQUFJQXVRQURBSVVBQUFCSkFBQUQ4UHdDZzB6OEFvSmMvQUtBUlB3REFtTDRBb0phL0FHQUd3QURnSnNBQTROKy9BQUJKdndBQXJUNEF3S2svQU1BU1FBQWdVVUFBSUloQUFNQ25RQUNBeDBBQVlPZEFBS0FEUVFDZ0UwRUFnQ05CQUlBelFRQ0FRMEVBNER4QkFPQXNRUURnSEVFQTRBeEJBS0Q1UUFEQTJVQUF3TGxBQU1DWlFBQ0FjMEFBb0ROQUFPRG5Qd0NnVXo4QTREQzhBTUQxdlFEQTliMEF3UFc5QU1EMXZRRGdNTHdBb0VjL0FHRGNQd0NnSzBBQVFHbEFBQUNPUUFCZ2pVQUF3SVZBQUFCOFFBREFiRUFBQUdCQUFNQk9RQUNnT2tBQTRDSkFBT0Q2UHdEZ2tUOEFBRDgrQU9CY3Z3Qmc2cjhBd0NiQUFPRHp2d0JnY2I4QVlQODlBS0NaUHdEQURFQUF3RXhBQUdDR1FBQmdwa0FBWU1aQUFHRG1RQUJBQTBFQVFCTkJBRUFqUVFCQU0wRUFRRU5CQU1BOFFRREFMRUVBd0J4QkFNQU1RUUNnK1VBQW9ObEFBS0M1UUFDZ21VQUFRSE5BQUVBelFBQmc1ajhBd0V3L0FBQ3R2Z0NnaWI4QW9KbS9BS0NadndDQWxiOEFBQk8vQU1BRVB3QWd2VDhBd0J0QUFBQllRQUFBaVVBQW9KcEFBS0NiUUFBZ21VQUE0Sk5BQUtDTlFBRGdoRUFBZ0hSQUFNQlBRQUNBRmtBQXdMRS9BR0M0UGdEQVRMOEFZT2EvQU9BbndBQ2cvTDhBQUgrL0FNRDFQUUNnbVQ4QXdBeEFBTUJNUUFCZ2hrQUFZS1pBQUdER1FBQmc1a0FBUUFOQkFFQVRRUUJBSTBFQVFETkJBRUJEUVFBZ1BVRUFJQzFCQUNBZFFRQkFEVUVBZ1BwQUFLRGFRQURBdWtBQUFKdEFBT0IyUUFBZ09FQUE0UE0vQUdCeFB3Q0EvTDBBd0pXL0FHRCt2d0JnRE1BQVlOKy9BTUJQdndBZ2NENEF3SlUvQU9BRFFBQWdPMEFBUUdaQUFJQjdRQURnZ2tBQVlJWkFBRUNHUUFEQWdVQUFJSGRBQUNCaFFBREFQRUFBb0FoQUFLQ2JQd0FnZXo0QW9GTy9BT0RudndDZ0k4QUFZT2UvQUtCVHZ3Q2dmRDRBb0o4L0FHQU9RQURnVFVBQTRJWkFBTUNtUUFEQXhrQUFvT1pBQUVBRFFRQkFFMEVBUUNOQkFFQXpRUUJBUTBFQW9ENUJBTUF1UVFBQUgwRUFJQTlCQU9EK1FBQmczMEFBNEw5QUFHQ2dRQURnZ0VBQWdFSkFBTUFEUUFBQWpEOEFRSm85QUlCeXZ3Q0E4NzhBNENyQUFDQUV3QURBbGI4QUlJUytBQ0E2UHdDQXhUOEFJQTVBQUlBdFFBRGdQRUFBSUVkQUFNQk1RQURBVEVBQW9FUkFBQUE2UUFCQUprQUFBQXRBQUNESFB3QUFURDhBNEJpK0FDQ052d0FBQXNBQXdCM0FBSURMdndBZ0tyOEFnTmcrQUFDMVB3QmdHVUFBSUZoQUFHQ0xRQURncWtBQVFNcEFBTURwUUFDZ0JFRUFnQlJCQUdBa1FRQkFORUVBUUVSQkFDQkJRUUJnTVVFQW9DRkJBTUFSUVFBQUFrRUFvT1JBQUdERlFBQkFwa0FBUUlkQUFJQlFRQUFBRTBBQW9Lcy9BQ0ROUGdBZ0tyOEFnTXUvQU9BaHdBQkFJTUFBd002L0FDQkN2d0NndFQwQW9GWS9BQUN6UHdCZzRUOEFBUDAvQU1BSVFBREFERUFBd0F4QUFHQUdRQURBK0Q4QTROTS9BTUNvUHdBZ1RUOEFvTFU5QUtBNXZ3QUF4TDhBb0JqQUFHQU13QUFncEw4QTRLSytBQUE0UHdEZzB6OEFZQ1pBQUlCalFBQ2drRUFBQUxCQUFJRFBRQUFnNzBBQVlBZEJBQ0FYUVFEZ0prRUFvRFpCQUdCR1FRRGdRMEVBUURSQkFLQWtRUUFnRlVFQWdBVkJBQURzUUFBZ3pVQUFZSzVBQU1DUFFBQUFZMEFBWUNaQUFPRFRQd0FBT0Q4QUlLSytBRUNndndCZ0I4QUE0QzNBQUNBSndBQ0F0YjhBWURlL0FFRFB2QURBQlQ4QXdFOC9BQ0NBUHdEQWxUOEFvSmsvQUtDWlB3QWdrVDhBSUhvL0FBQTRQd0FnelQ0QUFNYTlBS0E1dndDQXRiOEFJQWpBQUlBYXdBQ2cxcjhBZ0Z1L0FHQnlQUUFnaEQ4QUFQdy9BS0E2UUFBZ2QwQUE0SmxBQUVDNFFBREExa0FBZ1BWQUFFQUtRUURnR1VFQWdDbEJBRUE1UVFBQVNVRUFnRWRCQUFBNFFRQ0FLRUVBQUJsQkFNQUpRUUFBOVVBQW9OWkFBRUM0UUFEZ21VQUFJSGRBQUtBNlFBQkEvajhBWUlvL0FLQXVQZ0NBUUw4QUFNYS9BRUFWd0FCZ0s4QUE0QWZBQUVDN3Z3Q2dhNzhBNEFhL0FLQjh2Z0Nna0wwQUFQTTlBTUQxUFFEQTlUMEE0Tnc5QU9EY3ZRRGdvcjRBSUNxL0FBQi92d0Nnd2I4QXdBZkFBQUFid0FEQTY3OEFnSTYvQUNDV3ZnQmdKVDhBSUxzL0FDQVZRQUNnVDBBQXdJVkFBQUNrUUFCZ3drQUF3T0JBQUNEL1FBREFEa0VBNEIxQkFFQXRRUUNnUEVFQUlFeEJBS0JMUVFCQVBFRUFJQzFCQU9BZFFRREFEa0VBSVA5QUFNRGdRQUJnd2tBQVFLUkFBTUNHUUFBQVZFQUFBQnRBQUtESVB3Q2dRVDhBWVBHOUFJQjF2d0Rnejc4QUlBN0FBT0Frd0FEQUVjQUFvT2EvQUdDOXZ3Q2duNzhBQUl5L0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndBZ2tiOEFBS1cvQUlETHZ3RGc5TDhBWUJIQUFJQVB3QURBM2I4QUFKRy9BQ0RWdmdBZzFUNEFBSmcvQUlBQVFBQ0FOVUFBb0d0QUFBQ1NRQUFBcjBBQXdNeEFBT0RxUUFDZ0JFRUF3Qk5CQUFBalFRQWdNa0VBUUVGQkFJQlFRUUNBVUVFQVFFRkJBQ0F5UVFBQUkwRUF3Qk5CQUtBRVFRQ0E2MEFBUU01QUFJQ3hRQUFBbFVBQUlISkFBS0E4UUFEQUNFQUFvS3cvQUdBU1B3QUFYTDRBQUZlL0FHQ3p2d0JnOEw4QXdBM0FBQ0FZd0FBZ0ZjQUFRQTNBQU1BRHdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQW9BWEFBQUFNd0FCQUVjQUFvQXZBQU1EcnZ3Q0F0NzhBQUdxL0FNQ3l2Z0FnMVQ0QVlKRS9BTURyUHdEZ0pFQUFBRmxBQUNDSFFBREFvVUFBUUwxQUFLRFpRQUNBOWtBQTRBbEJBT0FZUVFBQUtFRUFJRGRCQUdCR1FRQ0FWVUVBZ0ZWQkFHQkdRUUJBTjBFQVFDaEJBR0FaUVFEZ0NrRUFBUGxBQUlEY1FBQmd3RUFBUUtWQUFLQ0tRQUFnWWtBQUFDOUFBT0Q5UHdBZ3BEOEE0QzgvQUVEUFBBQkFETDhBQUhhL0FDQ2t2d0RBeUw4QUFPUy9BTUQ0dndDZ0FNQUE0QXJBQU1BTXdBREFDTUFBSUFEQUFPRHp2d0RnMzc4QXdNSy9BTUNqdndDQWE3OEFRQXkvQUVEUHZBQUFGVDhBWUpNL0FNRHJQd0FBSTBBQVFGQkFBTUIrUUFEZ21FQUFZTE5BQUFET1FBRGc2RUFBWUFKQkFJQVFRUUFBSDBFQW9DMUJBSUE4UVFDQVMwRUFvRnBCQU1CYVFRRGdTMEVBSUQxQkFLQXVRUUJBSUVFQUFCSkJBT0FEUVFCQTdFQUFnTkZBQUVDM1FBREFuVUFBUUlSQUFHQlpRQUJBTEVBQTRBTkFBRUM3UHdDZ2F6OEFvT2srQUFEclBBRGdvcjRBUUNDL0FPQk52d0FnZXI4QW9JSy9BTUNZdndDZ21iOEF3SlcvQUlDQXZ3QmdjYjhBQUVtL0FFQVR2d0RnbHI0QVlISTlBSUR5UGdDZ1p6OEFnTE0vQU9ENVB3Q0FJMEFBUUZCQUFJQjlRQUJnbFVBQVlLeEFBR0RGUUFEQTMwQUFZUHBBQUlBS1FRQWdHRUVBSUNaQkFHQTBRUURBUWtFQVFGRkJBQ0JnUVFEZ1lFRUFZRkpCQUNCRVFRREFOVUVBb0NkQkFNQVpRUUJBREVFQUFQNUFBQURrUUFDQXlrQUFRTEZBQU9DWlFBQmdnMEFBNEZ4QUFLQTJRQUFnRWtBQW9PVS9BQUN1UHdBQWhEOEFBRGcvQUFEeFBnRGdsajRBd1BVOUFLREVQQURBOWIwQXdQVzlBQUR6dlFDZ2tEMEFZUDg5QUFDdFBnREFCRDhBUUVJL0FDQ0VQd0JBc3o4QW9PVS9BTUFQUUFBQU1rQUFnRlZBQU1COVFBQmdsVUFBQUt4QUFLRENRQUNnMlVBQUlQSkFBQ0FHUVFCZ0UwRUFvQ0JCQUNBdVFRREFPMEVBNEVsQkFDQllRUUNBWmtFQTRHZEJBSUJaUVFCZ1MwRUFZRDFCQU1BdlFRQ0FJa0VBUUJWQkFHQUlRUUJBOTBBQVlONUFBQ0RIUUFDQXNFQUFRSnRBQUFDSVFBQ2dha0FBNEVoQUFPQXJRQUJBRWtBQUFQdy9BT0RWUHdCZ3VEOEFvS1EvQUtDWlB3RGdoajhBQUlBL0FBQ0FQd0FBZ0Q4QUFJdy9BS0NaUHdEQXFUOEFRTDAvQUdEYlB3QUEvRDhBb0JSQUFFQXNRQUNBU0VBQVFHZEFBRUNGUUFCZ2wwQUFJS3hBQUtEQ1FBQkEyVUFBNE85QUFHQURRUUNBRDBFQVFCeEJBSUFwUVFEZ05rRUFJRVJCQU1CUlFRQ0FYMEVBb0cxQkFDQnZRUUFnWVVFQVlGTkJBQUJHUVFDZ09FRUFvQ3RCQU1BZVFRQUFFa0VBd0FWQkFHRDBRQURBM1VBQUlNaEFBTUMwUUFEQW9VQUFJSkJBQU9DQVFBQmdaVUFBd0U1QUFLQTZRQUJBS0VBQUFCdEFBRUFRUUFCQURFQUF3QUZBQUFBQVFBQUFBRUFBQUFCQUFNQURRQURBREVBQXdCSkFBTUFjUUFDQUswQUFRRHRBQUtCUFFBQmdaMEFBNElCQUFFQ1BRQURnbjBBQW9MRkFBQ0RFUUFCZzJVQUE0TzlBQUVBRFFRQ0FEa0VBQUJwQkFBQW1RUUNnTWtFQXdEOUJBQUJOUVFCZ1drRUF3R2RCQUdCMVFRQUFkMEVBZ0dsQkFDQmNRUURnVGtFQUFFSkJBQ0ExUVFDQUtFRUFZQnhCQU9BUVFRQ0FCVUVBUVBWQUFJRGhRQUJBemtBQVFMeEFBT0NyUUFDQW5VQUFJSkJBQU1DRlFBQWdkMEFBSUdaQUFBQmFRQUJBVDBBQUlFdEFBRUJCUUFBQVFFQUFBRUJBQUFCQVFBQ0FRa0FBWUV4QUFDQlJRQURnVzBBQVFHbEFBT0I0UUFEQWhVQUFZSkZBQUtDZFFBREFxMEFBd0xwQUFFRE1RQUFBM2tBQUlQRkFBRUFEUVFDQURrRUE0QmxCQUVBbFFRQ2dNRUVBZ0R4QkFBQkpRUUFBVmtFQVFHTkJBSUJ3UVFEZ2ZVRUFvSDlCQUdCeVFRQkFaVUVBWUZoQkFLQkxRUUFBUDBFQUFETkJBSUFuUVFBZ0hFRUFJQkZCQUNBSFFRQUErMEFBb09oQUFHRFhRQUJneUVBQUlMcEFBQ0N1UUFBQXBFQUFJSnBBQUNDU1FBQ0FqRUFBUUlkQUFBQ0ZRQUNBZ0VBQUFJQkFBQUNBUUFBQWdFQUFBSUZBQU1DRlFBQWdpRUFBZ0kxQUFLQ1RRQUJnbTBBQUFLUkFBQUN2UUFEQXVrQUFZTWhBQU1EV1FBRGc1a0FBb1BoQUFFQUZRUUFnRDBFQTRCbEJBRUFsUVFDQU1FRUE0RHRCQUVCSFFRQWdVMEVBZ0Y5QkFFQnNRUUJnZVVFQVlJTkJBRUNFUVFDQWUwRUF3RzVCQUFCaVFRQ0FWVUVBZ0VsQkFDQStRUURBTWtFQXdDZEJBSUFkUVFEZ0UwRUFnQXBCQUtBQlFRQmc4MEFBQU9WQUFHRFhRQUNBekVBQVlNSkFBT0M0UUFCQXNVQUFBS3hBQUNDblFBQ0FwRUFBWUtCQUFBQ2dRQUFBb0VBQUFLQkFBTUNnUUFCZ3BVQUF3S2RBQUFDdFFBREFza0FBWUxwQUFJRENRQURBekVBQWdOaEFBQ0RsUUFCZzgwQUFJQUZCQUtBSlFRQ0FFa0VBb0J0QkFLQWxRUUNBTUVFQTREdEJBQ0JIUVFDQVVrRUE0RjFCQUtCcFFRRGdkVUVBUUlGQkFPQ0hRUUFBaVVFQW9JSkJBR0I0UVFBZ2JFRUFJR0JCQU1CVVFRQmdTVUVBWUQ1QkFBQTBRUUJBS2tFQXdDQkJBTUFYUVFCZ0QwRUFBQWhCQU9BQVFRQWc5VUFBNE9wQUFNRGdRQURnMTBBQW9OQkFBR0RMUUFBQXgwQUFBTVJBQUVEQVFBQUF3RUFBQU1CQUFBREFRQUNnd0VBQTRNUkFBSURIUUFDQXpFQUE0TkZBQUlEWlFBQkE0VUFBNE9wQUFFRDJRQUFnQVVFQUFBaEJBQ0FQUVFBQUYwRUF3QjlCQUtBb1FRQUFNa0VBUUR4QkFDQkhRUUNBVWtFQXdGMUJBQ0JwUVFDQWRFRUFJSUJCQUVDR1FRQ0FqRUVBd0kxQkFJQ0hRUUJnZ1VFQXdIWkJBR0JyUVFBQVlFRUFBRlZCQUlCS1FRREFRRUVBSURkQkFBQXVRUUJBSlVFQWdCMUJBRUFXUVFCZ0QwRUFvQWxCQUtBRVFRQkEvMEFBNFBaQUFDRHdRQURnNmtBQTRPWkFBSURqUUFCQTRFQUFBT0JBQUFEZ1FBQUE0RUFBZ09CQUFHRGtRQUJnNTBBQUFPeEFBQ0R4UUFDQStFQUFJQUJCQUtBRVFRRGdDVUVBNEE5QkFFQVdRUUJnSFVFQXdDUkJBQ0F0UVFBQU5rRUE0RDVCQUlCSVFRREFVa0VBd0YxQkFDQnBRUUJnZEVFQXdIOUJBSUNGUVFCZ2kwRUFnSkZCQU1DU1FRQ2dqRUVBd0laQkFBQ0JRUUNnZGtFQWdHdEJBQUJoUVFBZ1YwRUFnRTFCQUNCRVFRQmdPMEVBSUROQkFNQXJRUUNnSkVFQUlCNUJBT0FZUVFEQUUwRUE0QTVCQUFBTFFRRGdCMEVBSUFWQkFHQURRUUNBQVVFQUlBQkJBQUFBUVFBQUFFRUFBQUJCQUVBQVFRQUFBa0VBb0FOQkFNQUZRUUJnQ0VFQXdBdEJBS0FQUVFEZ0UwRUE0QmhCQU1BZVFRREFKRUVBd0N0QkFPQXlRUUNnT2tFQVFFTkJBQ0JNUVFCQVZVRUFBRjlCQUdCcFFRQmdkRUVBd0g5QkFJQ0ZRUUFnaTBFQTRKQkJBTUNXUVFEZ2wwRUFBSkpCQUVDTVFRQ2doa0VBSUlGQkFJQjNRUUNBYlVFQTRHTkJBR0JhUVFDQVVVRUE0RWhCQUVCQlFRQUFPa0VBSUROQkFDQXRRUUFBS0VFQUFDTkJBR0FlUVFDQUdrRUFvQmRCQUFBVlFRQmdFMEVBWUJGQkFDQVFRUUFBRUVFQUFCQkJBQUFRUVFCQUVFRUF3QkZCQUtBVFFRQ0FGVUVBSUJoQkFFQWJRUUFnSDBFQUlDTkJBQUFvUVFDZ0xVRUFnRE5CQUNBNlFRQkFRVUVBZ0VoQkFLQlFRUUNBV1VFQVlHSkJBS0JyUVFDQWRVRUFBSUJCQUlDRlFRQWdpMEVBNEpCQkFJQ1dRUUFnbkVFQVlKMUJBS0NYUVFBQWtrRUFZSXhCQUFDSFFRQUFna0VBUUhwQkFNQndRUUNnWjBFQTRGNUJBT0JXUVFDQVQwRUFZRWhCQU1CQlFRQkFQRUVBSURkQkFDQXlRUURnTFVFQUlDcEJBR0FuUVFEQUpFRUFRQ05CQUVBaFFRQWdJRUVBQUNCQkFBQWdRUUFBSUVFQVFDQkJBS0FoUVFDQUkwRUFRQ1ZCQU9BblFRRGdLa0VBb0M1QkFLQXlRUUFnTjBFQWdEeEJBR0JDUVFDQVNFRUFnRTlCQU1CV1FRQmdYa0VBd0daQkFLQnZRUUNnZUVFQUFJRkJBQUNHUVFCQWkwRUE0SkJCQUlDV1FRQWduRUVBd0tGQkFPQ2lRUUJBblVFQXdKZEJBR0NTUVFCQWpVRUFZSWhCQUlDRFFRRGdmVUVBQUhWQkFLQnNRUUFBWlVFQTRGMUJBT0JXUVFDZ1VFRUFZRXRCQUdCR1FRQ0FRVUVBWUQxQkFPQTVRUUFnTjBFQW9EUkJBQ0F6UVFBZ01VRUFJREJCQUFBd1FRQUFNRUVBQURCQkFDQXdRUUNBTVVFQWdETkJBQ0ExUVFEQU4wRUFnRHBCQUNBK1FRQWdRa0VBWUVaQkFJQkxRUUJBVVVFQUlGZEJBT0JkUVFBQVpVRUFRR3hCQUVCMFFRQUFmVUVBNElKQkFHQ0hRUUJBakVFQVFKRkJBS0NXUVFBZ25FRUF3S0ZCQUlDblFRQ2dxRUVBQUtOQkFLQ2RRUUNBbUVFQWdKTkJBTUNPUVFBQWlrRUFvSVZCQUVDQlFRQ2dla0VBUUhOQkFDQnNRUUNBWlVFQXdGOUJBS0JhUVFDQVZVRUE0RkJCQU9CTVFRQ0FTVUVBQUVkQkFJQkVRUUFBUTBFQUFFRkJBQ0JBUVFBQVFFRUFBRUJCQUFCQVFRQWdRRUVBWUVGQkFHQkRRUURnUkVFQWdFZEJBQ0JLUVFEQVRVRUFvRkZCQUtCVlFRQ2dXa0VBSUdCQkFBQm1RUUJBYkVFQVFITkJBSUI2UVFBQWdVRUFJSVZCQUtDSlFRQUFqa0VBb0pKQkFJQ1hRUUNBbkVFQTRLRkJBSUNuUVFBZ3JVSFhGNXFaMlQ3eTBnMC8xeGVXUXdzOXdNSjF2S1ZtWVdObGM4Y1lGZ0FBQUFBQkFBQUFBZ0FBQUFBQUFBQUNBQUFBQXdBQUFLUjFkV2xrc3pNek5EYzBOamd3T0RBeE9ESTRNemd6TWpTdGRtVnlkR1Y0WDNOdmRYSmpaZG9tV2dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVc1ME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ1pteHZZWFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVhOaGJYQnNaWEl6UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUhWellXMXdiR1Z5TWtRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCMWMyRnRjR3hsY2pORU93b3ZMeUIyWlhKMFpYZ2dhVzV3ZFhSek9pQUthVzRnZG1Wak1pQndiM05wZEdsdmJqc0tkbVZqTWlCblpYUmZjRzl6YVhScGIyNG9LWHR5WlhSMWNtNGdjRzl6YVhScGIyNDdmUXBwYmlCMlpXTXlJSFYyT3dwMlpXTXlJR2RsZEY5MWRpZ3BlM0psZEhWeWJpQjFkanQ5Q2dvdkx5QlZibWxtYjNKdGN6b2dDblZ1YVdadmNtMGdZbTl2YkNCMWJtbG1iM0p0WDJOdmJHOXliV0Z3T3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXliV0Z3S0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSnRZWEE3ZlFwMWJtbG1iM0p0SUhWcGJuUWdiMkpxWldOMFgybGtPd3AxYVc1MElHZGxkRjl2WW1wbFkzUmZhV1FvS1h0eVpYUjFjbTRnYjJKcVpXTjBYMmxrTzMwS2RXNXBabTl5YlNCdFlYUTBJRzF2WkdWc1gyWXpNbU03Q20xaGREUWdaMlYwWDIxdlpHVnNYMll6TW1Nb0tYdHlaWFIxY200Z2JXOWtaV3hmWmpNeVl6dDlDblZ1YVdadmNtMGdhVzUwSUhOa1psOXRZWEpyWlhKZmMyaGhjR1U3Q21sdWRDQm5aWFJmYzJSbVgyMWhjbXRsY2w5emFHRndaU2dwZTNKbGRIVnliaUJ6WkdaZmJXRnlhMlZ5WDNOb1lYQmxPMzBLZFc1cFptOXliU0JtYkc5aGRDQm5iRzkzZDJsa2RHZzdDbVpzYjJGMElHZGxkRjluYkc5M2QybGtkR2dvS1h0eVpYUjFjbTRnWjJ4dmQzZHBaSFJvTzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JoZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVU3Q21ac2IyRjBJR2RsZEY5aGRHeGhjMTkwWlhoMGRYSmxYM05wZW1Vb0tYdHlaWFIxY200Z1lYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbE8zMEtkVzVwWm05eWJTQmliMjlzSUhCaGRIUmxjbTQ3Q21KdmIyd2daMlYwWDNCaGRIUmxjbTRvS1h0eVpYUjFjbTRnY0dGMGRHVnlianQ5Q25WdWFXWnZjbTBnWW05dmJDQndhV05yYVc1bk93cGliMjlzSUdkbGRGOXdhV05yYVc1bktDbDdjbVYwZFhKdUlIQnBZMnRwYm1jN2ZRcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsT3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJVb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjbkpoYm1kbE8zMEtkVzVwWm05eWJTQm1iRzloZENCd2VGOXdaWEpmZFc1cGREc0tabXh2WVhRZ1oyVjBYM0I0WDNCbGNsOTFibWwwS0NsN2NtVjBkWEp1SUhCNFgzQmxjbDkxYm1sME8zMEtkVzVwWm05eWJTQnpZVzF3YkdWeU1rUWdaR2x6ZEdGdVkyVm1hV1ZzWkRzS2RXNXBabTl5YlNCMlpXTTBJRzVoYmw5amIyeHZjanNLZG1Wak5DQm5aWFJmYm1GdVgyTnZiRzl5S0NsN2NtVjBkWEp1SUc1aGJsOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1pteHZZWFFnYzNSeWIydGxkMmxrZEdnN0NtWnNiMkYwSUdkbGRGOXpkSEp2YTJWM2FXUjBhQ2dwZTNKbGRIVnliaUJ6ZEhKdmEyVjNhV1IwYUR0OUNuVnVhV1p2Y20wZ2RtVmpNeUJtTXpKalgzTmpZV3hsT3dwMlpXTXpJR2RsZEY5bU16SmpYM05qWVd4bEtDbDdjbVYwZFhKdUlHWXpNbU5mYzJOaGJHVTdmUXAxYm1sbWIzSnRJSFpsWXpJZ2NtVnpiMngxZEdsdmJqc0tkbVZqTWlCblpYUmZjbVZ6YjJ4MWRHbHZiaWdwZTNKbGRIVnliaUJ5WlhOdmJIVjBhVzl1TzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JrWlhCMGFGOXphR2xtZERzS1pteHZZWFFnWjJWMFgyUmxjSFJvWDNOb2FXWjBLQ2w3Y21WMGRYSnVJR1JsY0hSb1gzTm9hV1owTzMwS2RXNXBabTl5YlNCMlpXTTBJR3h2ZDJOc2FYQmZZMjlzYjNJN0NuWmxZelFnWjJWMFgyeHZkMk5zYVhCZlkyOXNiM0lvS1h0eVpYUjFjbTRnYkc5M1kyeHBjRjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCaWFXeHNZbTloY21RN0NtSnZiMndnWjJWMFgySnBiR3hpYjJGeVpDZ3BlM0psZEhWeWJpQmlhV3hzWW05aGNtUTdmUXAxYm1sbWIzSnRJRzFoZERRZ2NISmxjSEp2YW1WamRHbHZianNLYldGME5DQm5aWFJmY0hKbGNISnZhbVZqZEdsdmJpZ3BlM0psZEhWeWJpQndjbVZ3Y205cVpXTjBhVzl1TzMwS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNJN0NtSnZiMndnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0lvS1h0eVpYUjFjbTRnZFc1cFptOXliVjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdkbVZqTkNCb2FXZG9ZMnhwY0Y5amIyeHZjanNLZG1Wak5DQm5aWFJmYUdsbmFHTnNhWEJmWTI5c2IzSW9LWHR5WlhSMWNtNGdhR2xuYUdOc2FYQmZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnWjJ4dmQyTnZiRzl5T3dwMlpXTTBJR2RsZEY5bmJHOTNZMjlzYjNJb0tYdHlaWFIxY200Z1oyeHZkMk52Ykc5eU8zMEtkVzVwWm05eWJTQmliMjlzSUhSeVlXNXpabTl5YlY5dFlYSnJaWEk3Q21KdmIyd2daMlYwWDNSeVlXNXpabTl5YlY5dFlYSnJaWElvS1h0eVpYUjFjbTRnZEhKaGJuTm1iM0p0WDIxaGNtdGxjanQ5Q2dvS0Nnb3ZMeUJRWlhJZ2FXNXpkR0Z1WTJVZ1lYUjBjbWxpZFhSbGN6b2dDbWx1SUhabFl6UWdjMlJtWDNWMk93cDJaV00wSUdkbGRGOXpaR1pmZFhZb0tYdHlaWFIxY200Z2MyUm1YM1YyTzMwS2FXNGdkbVZqTkNCMlpYSjBaWGhmWTI5c2IzSTdDblpsWXpRZ1oyVjBYM1psY25SbGVGOWpiMnh2Y2lncGUzSmxkSFZ5YmlCMlpYSjBaWGhmWTI5c2IzSTdmUXBwYmlCMlpXTXlJSEYxWVdSZmIyWm1jMlYwT3dwMlpXTXlJR2RsZEY5eGRXRmtYMjltWm5ObGRDZ3BlM0psZEhWeWJpQnhkV0ZrWDI5bVpuTmxkRHQ5Q21sdUlIWmxZeklnY1hWaFpGOXpZMkZzWlRzS2RtVmpNaUJuWlhSZmNYVmhaRjl6WTJGc1pTZ3BlM0psZEhWeWJpQnhkV0ZrWDNOallXeGxPMzBLYVc0Z2RtVmpOQ0JqYjI1MlpYSjBaV1JmYzNSeWIydGxZMjlzYjNJN0NuWmxZelFnWjJWMFgyTnZiblpsY25SbFpGOXpkSEp2YTJWamIyeHZjaWdwZTNKbGRIVnliaUJqYjI1MlpYSjBaV1JmYzNSeWIydGxZMjlzYjNJN2ZRcHBiaUIyWldNeUlIZG5iRjl3YjNOcGRHbHZibk03Q25abFl6SWdaMlYwWDNkbmJGOXdiM05wZEdsdmJuTW9LWHR5WlhSMWNtNGdkMmRzWDNCdmMybDBhVzl1Y3p0OUNtbHVJSFpsWXpRZ1kyOXVkbVZ5ZEdWa1gzSnZkR0YwYVc5dU93cDJaV00wSUdkbGRGOWpiMjUyWlhKMFpXUmZjbTkwWVhScGIyNG9LWHR5WlhSMWNtNGdZMjl1ZG1WeWRHVmtYM0p2ZEdGMGFXOXVPMzBLYVc0Z2RtVmpNeUJ0WVhKclpYSmZiMlptYzJWME93cDJaV016SUdkbGRGOXRZWEpyWlhKZmIyWm1jMlYwS0NsN2NtVjBkWEp1SUcxaGNtdGxjbDl2Wm1aelpYUTdmUW9LY0hKbFkybHphVzl1SUdocFoyaHdJR1pzYjJGME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2FXNTBPd29LZFc1cFptOXliU0J0WVhRMElIQnliMnBsWTNScGIyNDdDblZ1YVdadmNtMGdiV0YwTkNCMmFXVjNPd3AxYm1sbWIzSnRJR2x1ZENCMWJtbG1iM0p0WDI1MWJWOWpiR2x3WDNCc1lXNWxjenNLZFc1cFptOXliU0IyWldNMElIVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYTmJPRjA3Q2dwMWJtbG1iM0p0SUdac2IyRjBJR0YwYkdGelgzUmxlRjlrYVcwN0NncHZkWFFnZG1Wak5DQm1jbUZuWDJOdmJHOXlPd3B2ZFhRZ2RtVmpNaUJtY21GblgzVjJPd3B2ZFhRZ1pteHZZWFFnWm5KaFoxOTFkbk5qWVd4bE93cHZkWFFnWm14dllYUWdabkpoWjE5a2FYTjBZVzVqWldacFpXeGtYM05qWVd4bE93cHZkWFFnZG1Wak5DQm1jbUZuWDNWMlgyOW1abk5sZEY5M2FXUjBhRHNLYjNWMElHWnNiMkYwSUc5ZlkyeHBjRjlrYVhOMFlXNWpaVnM0WFRzS1pteGhkQ0J2ZFhRZ2RtVmpOQ0JtY21GblgzTjBjbTlyWldOdmJHOXlPd29LWm14aGRDQnZkWFFnZFdsdWRDQm1jbUZuWDJsdWMzUmhibU5sWDJsa093cG1iR0YwSUc5MWRDQjJaV015SUdaZmMzQnlhWFJsWDNOallXeGxPd29LSTJSbFptbHVaU0JCVGxSSlFVeEpRVk5mVWtGRVNWVlRJREF1T0FvS0NtMWhkRFFnY1cxaGRDaDJaV00wSUhGMVlYUXBld29nSUNBZ1pteHZZWFFnYm5WdElEMGdjWFZoZEM1NElDb2dNaTR3T3dvZ0lDQWdabXh2WVhRZ2JuVnRNaUE5SUhGMVlYUXVlU0FxSURJdU1Ec0tJQ0FnSUdac2IyRjBJRzUxYlRNZ1BTQnhkV0YwTG5vZ0tpQXlMakE3Q2lBZ0lDQm1iRzloZENCdWRXMDBJRDBnY1hWaGRDNTRJQ29nYm5WdE93b2dJQ0FnWm14dllYUWdiblZ0TlNBOUlIRjFZWFF1ZVNBcUlHNTFiVEk3Q2lBZ0lDQm1iRzloZENCdWRXMDJJRDBnY1hWaGRDNTZJQ29nYm5WdE16c0tJQ0FnSUdac2IyRjBJRzUxYlRjZ1BTQnhkV0YwTG5nZ0tpQnVkVzB5T3dvZ0lDQWdabXh2WVhRZ2JuVnRPQ0E5SUhGMVlYUXVlQ0FxSUc1MWJUTTdDaUFnSUNCbWJHOWhkQ0J1ZFcwNUlEMGdjWFZoZEM1NUlDb2diblZ0TXpzS0lDQWdJR1pzYjJGMElHNTFiVEV3SUQwZ2NYVmhkQzUzSUNvZ2JuVnRPd29nSUNBZ1pteHZZWFFnYm5WdE1URWdQU0J4ZFdGMExuY2dLaUJ1ZFcweU93b2dJQ0FnWm14dllYUWdiblZ0TVRJZ1BTQnhkV0YwTG5jZ0tpQnVkVzB6T3dvZ0lDQWdjbVYwZFhKdUlHMWhkRFFvQ2lBZ0lDQWdJQ0FnS0RFdU1DQXRJQ2h1ZFcwMUlDc2diblZ0TmlrcExDQW9iblZ0TnlBcklHNTFiVEV5S1N3Z0lDQWdJQ0FnSUNodWRXMDRJQzBnYm5WdE1URXBMQ0FnSUNBZ0lDQWdNQzR3TEFvZ0lDQWdJQ0FnSUNodWRXMDNJQzBnYm5WdE1USXBMQ0FnSUNBZ0lDQWdLREV1TUNBdElDaHVkVzAwSUNzZ2JuVnROaWtwTENBb2JuVnRPU0FySUc1MWJURXdLU3dnSUNBZ0lDQWdJREF1TUN3S0lDQWdJQ0FnSUNBb2JuVnRPQ0FySUc1MWJURXhLU3dnSUNBZ0lDQWdJQ2h1ZFcwNUlDMGdiblZ0TVRBcExDQWdJQ0FnSUNBZ0tERXVNQ0F0SUNodWRXMDBJQ3NnYm5WdE5Ta3BMQ0F3TGpBc0NpQWdJQ0FnSUNBZ01DNHdMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F3TGpBc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEQXVNQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTVM0d0NpQWdJQ0FwT3dwOUNncG1iRzloZENCa2FYTjBZVzVqWldacFpXeGtYM05qWVd4bEtDbDdDaUFnSUNBdkx5QkhiSGx3YUNCa2FYTjBZVzVqWlNCbWFXVnNaQ0IxYm1sMGN5QmhjbVVnYVc0Z2NHbDRaV3h6T3lCamIyNTJaWEowSUhSdklHUnBiV1Z1YzJsdmJteGxjM01LSUNBZ0lDOHZJSGd0WTI5dmNtUnBibUYwWlNCdlppQjBaWGgwZFhKbElHbHVjM1JsWVdRZ1ptOXlJR052Ym5OcGMzUmxibU41SUhkcGRHZ2djSEp2WjNKaGJXMWhkR2xqSUhWMkNpQWdJQ0F2THlCa2FYTjBZVzVqWlNCbWFXVnNaSE1nYVc0Z1puSmhaMjFsYm5RZ2MyaGhaR1Z5TGlCVFpXVWdZV3h6YnlCamIyMXRaVzUwY3lCaVpXeHZkeTRLSUNBZ0lIWmxZelFnZFhaZmNtVmpkQ0E5SUdkbGRGOXpaR1pmZFhZb0tUc0tJQ0FnSUdac2IyRjBJSEJwZUhOcGVtVmZlQ0E5SUNoMWRsOXlaV04wTG5vZ0xTQjFkbDl5WldOMExuZ3BJQ29nWjJWMFgyRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpTZ3BPd29nSUNBZ2NtVjBkWEp1SUMweExqQXZjR2w0YzJsNlpWOTRPd3A5Q2dwMlpXTXpJSFJ2ZG1Wak15aDJaV015SUhZcGUzSmxkSFZ5YmlCMlpXTXpLSFlzSURBdU1DazdmUXAyWldNeklIUnZkbVZqTXloMlpXTXpJSFlwZTNKbGRIVnliaUIyTzMwS0NuWmxZelFnZEc5MlpXTTBLSFpsWXpNZ2RpbDdjbVYwZFhKdUlIWmxZelFvZGl3Z01TNHdLVHQ5Q25abFl6UWdkRzkyWldNMEtIWmxZelFnZGlsN2NtVjBkWEp1SUhZN2ZRcDJaV00wSUhSdmRtVmpOQ2hpYjI5c0lIWXBJSHNLSUNBZ0lISmxkSFZ5YmlCMlpXTTBLREF1TUNrN0NuMEtDbTFoZERJZ1pHbGhaMjBvZG1Wak1pQjJLWHNLSUNBZ0lISmxkSFZ5YmlCdFlYUXlLSFl1ZUN3Z01DNHdMQ0F3TGpBc0lIWXVlU2s3Q24wS0NtWnNiMkYwSUY5a1pYUmxjbTFwYm1GdWRDaHRZWFF5SUcwcElIc0tJQ0J5WlhSMWNtNGdiVnN3WFZzd1hTQXFJRzFiTVYxYk1WMGdMU0J0V3pCZFd6RmRJQ29nYlZzeFhWc3dYVHNLZlFvS2RtOXBaQ0J3Y205alpYTnpYMk5zYVhCZmNHeGhibVZ6S0habFl6TWdkMjl5YkdSZmNHOXpLU0I3Q2lBZ0lDQm1iM0lnS0dsdWRDQnBJRDBnTURzZ2FTQThJSFZ1YVdadmNtMWZiblZ0WDJOc2FYQmZjR3hoYm1Wek95QnBLeXNwQ2lBZ0lDQWdJQ0FnYjE5amJHbHdYMlJwYzNSaGJtTmxXMmxkSUQwZ1pHOTBLSGR2Y214a1gzQnZjeXdnZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzF0cFhTNTRlWG9wSUMwZ2RXNXBabTl5YlY5amJHbHdYM0JzWVc1bGMxdHBYUzUzT3dwOUNncDJiMmxrSUcxaGFXNG9LWHNLSUNBZ0lDOHZJR2RsZEY5d2IzTW9LU0J5WlhSMWNtNXpJSFJvWlNCd2IzTnBkR2x2YmlCdlppQjBhR1VnYzJOaGRIUmxjaUJ0WVhKclpYSUtJQ0FnSUM4dklHZGxkRjl3YjNOcGRHbHZiaWdwSUhKbGRIVnlibk1nZEdobElDaHlaV3hoZEdsMlpTa2djRzl6YVhScGIyNGdiMllnZEdobElHTjFjbkpsYm5RZ2NYVmhaQ0IyWlhKMFpYZ0tDaUFnSUNCMlpXTXpJR1l6TW1OZmMyTmhiR1VnUFNCblpYUmZaak15WTE5elkyRnNaU2dwT3dvZ0lDQWdkbVZqTWlCdGN5QTlJR1l6TW1OZmMyTmhiR1V1ZUhrZ0tpQm5aWFJmY1hWaFpGOXpZMkZzWlNncE93b2dJQ0FnZG1Wak1pQnhkV0ZrWDI5bVpuTmxkQ0E5SUdZek1tTmZjMk5oYkdVdWVIa2dLaUJuWlhSZmNYVmhaRjl2Wm1aelpYUW9LVHNLSUNBZ0lIWmxZek1nYldGeWEyVnlYMjltWm5ObGRDQTlJR1l6TW1OZmMyTmhiR1VnS2lCMGIzWmxZek1vWjJWMFgyMWhjbXRsY2w5dlptWnpaWFFvS1NrN0Nnb2dJQ0FnZG1Wak1pQmlZbTk0WDNKaFpHbDFjeUE5SURBdU5TQXFJRzF6T3dvZ0lDQWdkbVZqTWlCemNISnBkR1ZmWW1KdmVGOWpaVzUwY21VZ1BTQnhkV0ZrWDI5bVpuTmxkQ0FySUdKaWIzaGZjbUZrYVhWek93b2dJQ0FnWmw5emNISnBkR1ZmYzJOaGJHVWdQU0J0Y3pzS0lDQWdJRzFoZERRZ2NIWnBaWGNnUFNCd2NtOXFaV04wYVc5dUlDb2dkbWxsZHpzS0lDQWdJRzFoZERRZ2RISmhibk1nUFNCblpYUmZkSEpoYm5ObWIzSnRYMjFoY210bGNpZ3BJRDhnYlc5a1pXeGZaak15WXlBNklHMWhkRFFvTVM0d0tUc0tDaUFnSUNCMlpXTTBJSEJ2YzJsMGFXOXVYM2R2Y214a0lEMGdiVzlrWld4ZlpqTXlZeUFxSUhabFl6UW9kRzkyWldNektHZGxkRjkzWjJ4ZmNHOXphWFJwYjI1ektDa3BMQ0F4S1RzS0lDQWdJSEJ5YjJObGMzTmZZMnhwY0Y5d2JHRnVaWE1vY0c5emFYUnBiMjVmZDI5eWJHUXVlSGw2S1RzS0NpQWdJQ0F2THlCRGIyMXdkWFJsSUdObGJuUnlaU0J2WmlCaWFXeHNZbTloY21RZ2FXNGdZMnhwY0hCcGJtY2dZMjl2Y21ScGJtRjBaWE1LSUNBZ0lDOHZJRUZzZDJGNWN5QjBjbUZ1YzJadmNtMGdkR1Y0ZEM5elkyRjBkR1Z5SUhCdmMybDBhVzl1SUdGeVozVnRaVzUwQ2lBZ0lDQjJaV00wSUdSaGRHRmZjRzlwYm5RZ1BTQm5aWFJmY0hKbGNISnZhbVZqZEdsdmJpZ3BJQ29nY0c5emFYUnBiMjVmZDI5eWJHUTdDaUFnSUNBdkx5QnRZWGxpWlNCMGNtRnVjMlp2Y20wZ2JXRnlhMlZ5WDI5bVpuTmxkQ0FySUdkc2VYQm9JRzltWm5ObGRITUtJQ0FnSUdSaGRHRmZjRzlwYm5RZ1BTQjJaV00wS0dSaGRHRmZjRzlwYm5RdWVIbDZJQzhnWkdGMFlWOXdiMmx1ZEM1M0lDc2diV0YwTXloMGNtRnVjeWtnS2lCdFlYSnJaWEpmYjJabWMyVjBMQ0F4S1RzS0lDQWdJR1JoZEdGZmNHOXBiblFnUFNCd2RtbGxkeUFxSUdSaGRHRmZjRzlwYm5RN0Nnb2dJQ0FnTHk4Z1EyOXRjSFYwWlNCMGNtRnVjMlp2Y20wZ1ptOXlJSFJvWlNCdlptWnpaWFFnZG1WamRHOXljeUJtY205dElIUm9aU0JqWlc1MGNtRnNJSEJ2YVc1MENpQWdJQ0IwY21GdWN5QTlJQ2huWlhSZlltbHNiR0p2WVhKa0tDa2dQeUJ3Y205cVpXTjBhVzl1SURvZ2NIWnBaWGNwSUNvZ2NXMWhkQ2huWlhSZlkyOXVkbVZ5ZEdWa1gzSnZkR0YwYVc5dUtDa3BJQ29nZEhKaGJuTTdDaUFnSUNCMlpXTTBJSE53Y21sMFpWOWpaVzUwWlhJZ1BTQjBjbUZ1Y3lBcUlIWmxZelFvYzNCeWFYUmxYMkppYjNoZlkyVnVkSEpsTENBd0xDQXdLVHNLQ2lBZ0lDQjJaV00wSUhaamJHbHdJRDBnWkdGMFlWOXdiMmx1ZENBcklITndjbWwwWlY5alpXNTBaWEk3Q2dvZ0lDQWdMeThnUlhoMGNtRWdZblZtWm1WeWFXNW5JR2x6SUhKbGNYVnBjbVZrSUdGeWIzVnVaQ0J6Y0hKcGRHVnpJSGRvYVdOb0lHRnlaU0JoYm5ScFlXeHBZWE5sWkNCemJ5QjBhR0YwQ2lBZ0lDQXZMeUIwYUdVZ1lXNTBhV0ZzYVdGeklHSnNkWElnWkc5bGMyNG5kQ0JuWlhRZ1kzVjBJRzltWmlBb2MyVmxJQ014TlNrdUlGUm9hWE1nWW14MWNpQm1ZV3hzY3lCMGJ3b2dJQ0FnTHk4Z2VtVnlieUJoZENCaElISmhaR2wxY3lCdlppQkJUbFJKUVV4SlFWTmZVa0ZFU1ZWVElIQnBlR1ZzY3lCcGJpQjBhR1VnZG1sbGQzQnZjblFnWTI5dmNtUnBibUYwWlhNS0lDQWdJQzh2SUdGdVpDQjNaU0IzWVc1MElIUnZJR0oxWm1abGNpQjBhR1VnZG1WeWRHbGpaWE1nYVc0Z2RHaGxJQ3B6YjNWeVkyVXFJSE53Y21sMFpTQmpiMjl5WkdsdVlYUmxDaUFnSUNBdkx5QnplWE4wWlcwZ2MyOGdkR2hoZENCM1pTQm5aWFFnZEdocGN5QmhiVzkxYm5RZ2FXNGdkR2hsSUc5MWRIQjFkQ0JqYjI5eVpHbHVZWFJsY3k0S0lDQWdJQzh2Q2lBZ0lDQXZMeUJJWlhKbElIZGxJR05oYkdOMWJHRjBaU0IwYUdVZ1pHVnlhWFpoZEdsMlpTQnZaaUIwYUdVZ2JXRndjR2x1WnlCbWNtOXRJSE53Y21sMFpTQjRlUW9nSUNBZ0x5OGdZMjl2Y21ScGJtRjBaWE1nS0dSbFptbHVaV1FnWW5rZ1lIUnlZVzV6WUNrZ2FXNTBieUIwYUdVZ2RtbGxkM0J2Y25RZ2NHbDRaV3dnWTI5dmNtUnBibUYwWlhNdUNpQWdJQ0F2THlCVWFHVWdaR1Z5YVhaaGRHbDJaU0J1WldWa2N5QjBieUJwYm1Oc2RXUmxJSFJvWlNCd2NtOXdaWElnZEdWeWJTQm1iM0lnZEdobElIQmxjbk53WldOMGFYWmxDaUFnSUNBdkx5QmthWFpwWkdVZ2FXNTBieUJPUkVNc0lHVjJZV3gxWVhSbFpDQmhkQ0IwYUdVZ1kyVnVkSEpsSUhCdmFXNTBJR0IyWTJ4cGNHQXVDaUFnSUNCdFlYUTBJR1JmYm1SalgyUmZZMnhwY0NBOUlHMWhkRFFvQ2lBZ0lDQWdJQ0FnTVM0d0wzWmpiR2x3TG5jc0lEQXVNQ3dnSUNBZ0lDQWdJQ0F3TGpBc0lDQWdJQ0FnSUNBZ01DNHdMQW9nSUNBZ0lDQWdJREF1TUN3Z0lDQWdJQ0FnSUNBeExqQXZkbU5zYVhBdWR5d2dNQzR3TENBZ0lDQWdJQ0FnSURBdU1Dd0tJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnTUM0d0xDQWdJQ0FnSUNBZ0lERXVNQzkyWTJ4cGNDNTNMQ0F3TGpBc0NpQWdJQ0FnSUNBZ0xYWmpiR2x3TG5oNWVpOG9kbU5zYVhBdWR5cDJZMnhwY0M1M0tTd2dJQ0FnSUNBZ0lDQWdNQzR3Q2lBZ0lDQXBPd29nSUNBZ2JXRjBNaUJrZUhsMlgyUjRlWE1nUFNCa2FXRm5iU2d3TGpVZ0tpQndlRjl3WlhKZmRXNXBkQ0FxSUdkbGRGOXlaWE52YkhWMGFXOXVLQ2twSUNvZ2JXRjBNaWhrWDI1a1kxOWtYMk5zYVhBcWRISmhibk1wT3dvZ0lDQWdMeThnVG05M0xDQnZkWElnWW5WbVptVnlJSE5wZW1VZ2FYTWdaWGh3Y21WemMyVmtJR2x1SUhacFpYZHdiM0owSUhCcGVHVnNjeUJpZFhRZ2QyVWdaMlYwSUdKaFkyc2dkRzhLSUNBZ0lDOHZJSFJvWlNCemNISnBkR1VnWTI5dmNtUnBibUYwWlNCemVYTjBaVzBnZFhOcGJtY2dkR2hsSUhOallXeGxJR1poWTNSdmNpQnZaaUIwYUdVS0lDQWdJQzh2SUhSeVlXNXpabTl5YldGMGFXOXVJQ2htYjNJZ2FYTnZkSEp2Y0dsaklIUnlZVzV6Wm05eWJXRjBhVzl1Y3lrdUlFWnZjaUJoYm1semIzUnliM0JwWXdvZ0lDQWdMeThnZEhKaGJuTm1iM0p0WVhScGIyNXpMQ0IwYUdVZ1oyVnZiV1YwY21saklHMWxZVzRnYjJZZ2RHaGxJSFIzYnlCd2NtbHVZMmx3YkdVZ2MyTmhiR1VnWm1GamRHOXljd29nSUNBZ0x5OGdhWE1nWVNCeVpXRnpiMjVoWW14bElHTnZiWEJ5YjIxcGMyVTZDaUFnSUNCbWJHOWhkQ0IyYVdWM2NHOXlkRjltY205dFgzTndjbWwwWlY5elkyRnNaU0E5SUhOeGNuUW9ZV0p6S0Y5a1pYUmxjbTFwYm1GdWRDaGtlSGwyWDJSNGVYTXBLU2s3Q2dvZ0lDQWdMeThnU1c0Z2RHaGxJR1p5WVdkdFpXNTBJSE5vWVdSbGNpQjNaU0IzWVc1MElHOTFjaUJ6YVdkdVpXUWdaR2x6ZEdGdVkyVWdhVzRnZG1sbGQzQnZjblFnS0hCcGVHVnNLUW9nSUNBZ0x5OGdZMjl2Y21SeklHWnZjaUJrYVhKbFkzUWdkWE5sSUdsdUlHRnVkR2xoYkdsaGMybHVaeUJ6ZEdWd0lHWjFibU4wYVc5dWN5NGdWMlVnZEdobGNtVm1iM0psSUc1bFpXUUtJQ0FnSUM4dklHRWdjMk5oYkdsdVp5Qm1ZV04wYjNJZ2MybHRhV3hoY2lCMGJ5QjJhV1YzY0c5eWRGOW1jbTl0WDNOd2NtbDBaVjl6WTJGc1pTd2dZblYwSUdsdVkyeDFaR2x1WndvZ0lDQWdMeThnZEdobElIVjJMVDV6Y0hKcGRHVWdZMjl2Y21ScGJtRjBaU0J6ZVhOMFpXMGdjMk5oYkdsdVp5Qm1ZV04wYjNJZ1lYTWdkMlZzYkM0Z0lGZGxJR05vYjI5elpTQjBid29nSUNBZ0x5OGdkWE5sSUhSb1pTQmliM1Z1WkdsdVp5QmliM2dnS25ncUlIZHBaSFJvSUdadmNpQjBhR2x6TGlCVWFHbHpJR052YldWeklIZHBkR2dnYzI5dFpRb2dJQ0FnTHk4Z1kyOXVjMmx6ZEdWdVkza2dZMjl1WkdsMGFXOXVjem9LSUNBZ0lDOHZJQ29nUm05eUlIQnliMk5sWkhWeVlXd2daR2x6ZEdGdVkyVWdabWxsYkdSekxDQjNaU0J1WldWa0lIUm9aU0J6Y0hKcGRHVWdZbTkxYm1ScGJtY2dZbTk0SUhSdklHSmxDaUFnSUNBdkx5QWdJSE54ZFdGeVpTNGdLRWxtSUc1dmRDd2dkR2hsSUhWMklHTnZiM0prYVc1aGRHVnpJSGRwYkd3Z1ltVWdZVzVwYzI5MGNtOXdhV05oYkd4NUlITmpZV3hsWkNCaGJtUUtJQ0FnSUM4dklDQWdZVzU1SUdOaGJHTjFiR0YwYVc5dUlHSmhjMlZrSUc5dUlIUm9aVzBnZDJsc2JDQnViM1FnWW1VZ1lTQmthWE4wWVc1alpTQm1kVzVqZEdsdmJpNHBDaUFnSUNBdkx5QXFJRVp2Y2lCellXMXdiR1ZrSUdScGMzUmhibU5sSUdacFpXeGtjeXdnZDJVZ2JtVmxaQ0IwYnlCamIyNXphWE4wWlc1MGJIa2dZMmh2YjNObElIUm9aU0FxZUNvS0lDQWdJQzh2SUNBZ1ptOXlJSFJvWlNCelkyRnNhVzVuSUdsdUlHZGxkRjlrYVhOMFlXNWpaV1pwWld4a1gzTmpZV3hsS0NrdUNpQWdJQ0JtYkc5aGRDQnpjSEpwZEdWZlpuSnZiVjkxWDNOallXeGxJRDBnYldsdUtHRmljeWh0Y3k1NEtTd2dZV0p6S0cxekxua3BLVHNLSUNBZ0lHWnlZV2RmZFhaelkyRnNaU0E5SUhacFpYZHdiM0owWDJaeWIyMWZjM0J5YVhSbFgzTmpZV3hsSUNvZ2MzQnlhWFJsWDJaeWIyMWZkVjl6WTJGc1pUc0tJQ0FnSUdaeVlXZGZaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaU0E5SUdScGMzUmhibU5sWm1sbGJHUmZjMk5oYkdVb0tUc0tDaUFnSUNBdkx5QmhaR1FnY0dGa1pHbHVaeUJtYjNJZ1FVRXNJSE4wY205clpTQmhibVFnWjJ4dmR5QW9ibTl1SUc1aGRHbDJaU0JrYVhOMFlXNWpaV1pwWld4a2N5QmtiMjRuZENCdVpXVmtDaUFnSUNBdkx5QkJRU0J3WVdSa2FXNW5JR0oxZENCRFNWSkRURVVnWlhSaklHUnZLUW9nSUNBZ1pteHZZWFFnY0hCMUlEMGdaMlYwWDNCNFgzQmxjbDkxYm1sMEtDazdDaUFnSUNCbWJHOWhkQ0JpWW05NFgySjFaaUE5SUNnS0lDQWdJQ0FnSUNCQlRsUkpRVXhKUVZOZlVrRkVTVlZUSUNzZ2JXRjRLREF1TUN3Z1oyVjBYM04wY205clpYZHBaSFJvS0NrZ0tpQndjSFVwSUNzZ2JXRjRLREF1TUN3Z1oyVjBYMmRzYjNkM2FXUjBhQ2dwSUNvZ2NIQjFLUW9nSUNBZ0tTQXZJSFpwWlhkd2IzSjBYMlp5YjIxZmMzQnlhWFJsWDNOallXeGxPd29nSUNBZ0x5OGdUWFZzZEdsd2JIa2dkR2hsSUdKMVptWmxjaUJpZVNCemFXZHVLR0ppYjNoZmNtRmthWFZ6S1NCemJ5QjBhR0YwSUcxaGNtdGxjbk5wZW1VZ1BUMGdNQ0JqYkdWaGJteDVDaUFnSUNBdkx5QmpiMnhzWVhCelpYTWdkR2hsSUhCaFpHUmxaQ0JpWW05NElIUnZJSHBsY204Z0tEQXFTVzVtSUQwOUlFNWhUaUJ3Y205d1lXZGhkR1Z6SUhSdklHZHNYMUJ2YzJsMGFXOXVDaUFnSUNBdkx5QmhibVFnWjJWMGN5QmpkV3hzWldRcExpQlhhWFJvYjNWMElIUm9hWE1zSUcxaGNtdGxjbk5wZW1VZ1BUMGdNQ0IzYjNWc1pDQndjbTlrZFdObElIWnBjMmxpYkdVZ1FVRUtJQ0FnSUM4dklIQmhaR1JwYm1jc0lHMWhkR05vYVc1bklFZE1UV0ZyYVdVbmN5Qm5aVzl0WlhSeWVTQnphR0ZrWlhJZ1ltVm9ZWFpwYjNJdUNpQWdJQ0IyWldNeUlIQmhaR1JsWkY5aVltOTRYM05wZW1VZ1BTQmlZbTk0WDNKaFpHbDFjeUFySUhOcFoyNG9ZbUp2ZUY5eVlXUnBkWE1wSUNvZ1ltSnZlRjlpZFdZN0NpQWdJQ0IyWldNeUlIVjJYM0JoWkY5elkyRnNaU0E5SUhCaFpHUmxaRjlpWW05NFgzTnBlbVVnTHlCaVltOTRYM0poWkdsMWN6c0tDaUFnSUNCbWNtRm5YMk52Ykc5eUlEMGdkRzkyWldNMEtHZGxkRjkyWlhKMFpYaGZZMjlzYjNJb0tTazdDaUFnSUNCbWNtRm5YM04wY205clpXTnZiRzl5SUQwZ2RHOTJaV00wS0dkbGRGOWpiMjUyWlhKMFpXUmZjM1J5YjJ0bFkyOXNiM0lvS1NrN0NpQWdJQ0JtY21GblgzVjJYMjltWm5ObGRGOTNhV1IwYUNBOUlHZGxkRjl6WkdaZmRYWW9LVHNLSUNBZ0lDOHZJR2RsZEY5MWRpZ3BJSEpsZEhWeWJuTWdLREFzSURBcExDQW9NU3dnTUNrc0lDZ3dMQ0F4S1NCdmNpQW9NU3dnTVNrS0lDQWdJQzh2SUhSdklHRmpZMjl0YjJSaGRHVWdjM1J5YjJ0bElHRnVaQ0JuYkc5M2QybGtkR2dnZDJVZ2JtVmxaQ0IwYnlCbGVIUnlkV1JsSUhWMkozTWdiM1YwZDJGeVpITWdabkp2YlNBb01DNDFMQ0F3TGpVcENpQWdJQ0JtY21GblgzVjJJRDBnZG1Wak1pZ3dMalVwSUNzZ0tHZGxkRjkxZGlncElDMGdkbVZqTWlnd0xqVXBLU0FxSUhWMlgzQmhaRjl6WTJGc1pUc0tDaUFnSUNBdkx5QnpZM0psWlc0Z2MzQmhZMlVnWTI5dmNtUnBibUYwWlhNZ2IyWWdkR2hsSUhCdmMybDBhVzl1Q2lBZ0lDQjJaV00wSUhGMVlXUmZkbVZ5ZEdWNElEMGdLSFJ5WVc1eklDb2dkbVZqTkNneUxqQWdLaUJ3WVdSa1pXUmZZbUp2ZUY5emFYcGxJQ29nWjJWMFgzQnZjMmwwYVc5dUtDa3NJREF1TUN3Z01DNHdLU2s3Q2lBZ0lDQm5iRjlRYjNOcGRHbHZiaUE5SUhaamJHbHdJQ3NnY1hWaFpGOTJaWEowWlhnN0NpQWdJQ0JuYkY5UWIzTnBkR2x2Ymk1NklDczlJR2RzWDFCdmMybDBhVzl1TG5jZ0tpQm5aWFJmWkdWd2RHaGZjMmhwWm5Rb0tUc0tDaUFnSUNCbWNtRm5YMmx1YzNSaGJtTmxYMmxrSUQwZ2RXbHVkQ2huYkY5SmJuTjBZVzVqWlVsRUtUc0tmUW9LcjJaeVlXZHRaVzUwWDNOdmRYSmpaZG9sSGdwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVc1ME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ1pteHZZWFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0J6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVhOaGJYQnNaWEl6UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUhWellXMXdiR1Z5TWtRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCMWMyRnRjR3hsY2pORU93b0tiM1YwSUhabFl6UWdabkpoWjIxbGJuUmZZMjlzYjNJN0Nnb3ZMeUJWYm1sbWIzSnRjem9nQ25WdWFXWnZjbTBnWW05dmJDQjFibWxtYjNKdFgyTnZiRzl5YldGd093cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5YldGd0tDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p0WVhBN2ZRcDFibWxtYjNKdElIVnBiblFnYjJKcVpXTjBYMmxrT3dwMWFXNTBJR2RsZEY5dlltcGxZM1JmYVdRb0tYdHlaWFIxY200Z2IySnFaV04wWDJsa08zMEtkVzVwWm05eWJTQnRZWFEwSUcxdlpHVnNYMll6TW1NN0NtMWhkRFFnWjJWMFgyMXZaR1ZzWDJZek1tTW9LWHR5WlhSMWNtNGdiVzlrWld4ZlpqTXlZenQ5Q25WdWFXWnZjbTBnYVc1MElITmtabDl0WVhKclpYSmZjMmhoY0dVN0NtbHVkQ0JuWlhSZmMyUm1YMjFoY210bGNsOXphR0Z3WlNncGUzSmxkSFZ5YmlCelpHWmZiV0Z5YTJWeVgzTm9ZWEJsTzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JuYkc5M2QybGtkR2c3Q21ac2IyRjBJR2RsZEY5bmJHOTNkMmxrZEdnb0tYdHlaWFIxY200Z1oyeHZkM2RwWkhSb08zMEtkVzVwWm05eWJTQm1iRzloZENCaGRHeGhjMTkwWlhoMGRYSmxYM05wZW1VN0NtWnNiMkYwSUdkbGRGOWhkR3hoYzE5MFpYaDBkWEpsWDNOcGVtVW9LWHR5WlhSMWNtNGdZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxPMzBLZFc1cFptOXliU0JpYjI5c0lIQmhkSFJsY200N0NtSnZiMndnWjJWMFgzQmhkSFJsY200b0tYdHlaWFIxY200Z2NHRjBkR1Z5Ymp0OUNuVnVhV1p2Y20wZ1ltOXZiQ0J3YVdOcmFXNW5Pd3BpYjI5c0lHZGxkRjl3YVdOcmFXNW5LQ2w3Y21WMGRYSnVJSEJwWTJ0cGJtYzdmUXAxYm1sbWIzSnRJR0p2YjJ3Z2RXNXBabTl5YlY5amIyeHZjbkpoYm1kbE93cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5Y21GdVoyVW9LWHR5WlhSMWNtNGdkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGxPMzBLZFc1cFptOXliU0JtYkc5aGRDQndlRjl3WlhKZmRXNXBkRHNLWm14dllYUWdaMlYwWDNCNFgzQmxjbDkxYm1sMEtDbDdjbVYwZFhKdUlIQjRYM0JsY2w5MWJtbDBPMzBLZFc1cFptOXliU0J6WVcxd2JHVnlNa1FnWkdsemRHRnVZMlZtYVdWc1pEc0tkVzVwWm05eWJTQjJaV00wSUc1aGJsOWpiMnh2Y2pzS2RtVmpOQ0JuWlhSZmJtRnVYMk52Ykc5eUtDbDdjbVYwZFhKdUlHNWhibDlqYjJ4dmNqdDlDblZ1YVdadmNtMGdabXh2WVhRZ2MzUnliMnRsZDJsa2RHZzdDbVpzYjJGMElHZGxkRjl6ZEhKdmEyVjNhV1IwYUNncGUzSmxkSFZ5YmlCemRISnZhMlYzYVdSMGFEdDlDblZ1YVdadmNtMGdkbVZqTXlCbU16SmpYM05qWVd4bE93cDJaV016SUdkbGRGOW1NekpqWDNOallXeGxLQ2w3Y21WMGRYSnVJR1l6TW1OZmMyTmhiR1U3ZlFwMWJtbG1iM0p0SUhabFl6SWdjbVZ6YjJ4MWRHbHZianNLZG1Wak1pQm5aWFJmY21WemIyeDFkR2x2YmlncGUzSmxkSFZ5YmlCeVpYTnZiSFYwYVc5dU8zMEtkVzVwWm05eWJTQm1iRzloZENCa1pYQjBhRjl6YUdsbWREc0tabXh2WVhRZ1oyVjBYMlJsY0hSb1gzTm9hV1owS0NsN2NtVjBkWEp1SUdSbGNIUm9YM05vYVdaME8zMEtkVzVwWm05eWJTQjJaV00wSUd4dmQyTnNhWEJmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMnh2ZDJOc2FYQmZZMjlzYjNJb0tYdHlaWFIxY200Z2JHOTNZMnhwY0Y5amIyeHZjanQ5Q25WdWFXWnZjbTBnWW05dmJDQmlhV3hzWW05aGNtUTdDbUp2YjJ3Z1oyVjBYMkpwYkd4aWIyRnlaQ2dwZTNKbGRIVnliaUJpYVd4c1ltOWhjbVE3ZlFwMWJtbG1iM0p0SUcxaGREUWdjSEpsY0hKdmFtVmpkR2x2YmpzS2JXRjBOQ0JuWlhSZmNISmxjSEp2YW1WamRHbHZiaWdwZTNKbGRIVnliaUJ3Y21Wd2NtOXFaV04wYVc5dU8zMEtkVzVwWm05eWJTQmliMjlzSUhWdWFXWnZjbTFmWTI5c2IzSTdDbUp2YjJ3Z1oyVjBYM1Z1YVdadmNtMWZZMjlzYjNJb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjanQ5Q25WdWFXWnZjbTBnZG1Wak5DQm9hV2RvWTJ4cGNGOWpiMnh2Y2pzS2RtVmpOQ0JuWlhSZmFHbG5hR05zYVhCZlkyOXNiM0lvS1h0eVpYUjFjbTRnYUdsbmFHTnNhWEJmWTI5c2IzSTdmUXAxYm1sbWIzSnRJSFpsWXpRZ1oyeHZkMk52Ykc5eU93cDJaV00wSUdkbGRGOW5iRzkzWTI5c2IzSW9LWHR5WlhSMWNtNGdaMnh2ZDJOdmJHOXlPMzBLZFc1cFptOXliU0JpYjI5c0lIUnlZVzV6Wm05eWJWOXRZWEpyWlhJN0NtSnZiMndnWjJWMFgzUnlZVzV6Wm05eWJWOXRZWEpyWlhJb0tYdHlaWFIxY200Z2RISmhibk5tYjNKdFgyMWhjbXRsY2p0OUNncHdjbVZqYVhOcGIyNGdhR2xuYUhBZ1pteHZZWFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYm5RN0NncHBiaUIyWldNMElHWnlZV2RmWTI5c2IzSTdDbWx1SUhabFl6SWdabkpoWjE5MWRqc0tDaU5rWldacGJtVWdRMGxTUTB4RklDQWdJQ0FnSUNBZ0lDQWdNQW9qWkdWbWFXNWxJRkpGUTFSQlRrZE1SU0FnSUNBZ0lDQWdJREVLSTJSbFptbHVaU0JTVDFWT1JFVkVYMUpGUTFSQlRrZE1SU0F5Q2lOa1pXWnBibVVnUkVsVFZFRk9RMFZHU1VWTVJDQWdJQ0FnTXdvalpHVm1hVzVsSUZSU1NVRk9SMHhGSUNBZ0lDQWdJQ0FnSURRS0NpTmtaV1pwYm1VZ1RWOVRVVkpVWHpJZ0lDQWdJQ0FnSUNBZ01TNDBNVFF5TVRNMUNnb0tMeThnU0dGc1ppQjNhV1IwYUNCdlppQmhiblJwWVd4cFlYTnBibWNnYzIxdmIzUm9jM1JsY0FvalpHVm1hVzVsSUVGT1ZFbEJURWxCVTE5U1FVUkpWVk1nTUM0M01EY3hNRFkzT0RFeE9EWTFORGMyQ2dwcGJpQm1iRzloZENCbWNtRm5YM1YyYzJOaGJHVTdDbWx1SUdac2IyRjBJR1p5WVdkZlpHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pUc0thVzRnZG1Wak5DQm1jbUZuWDNWMlgyOW1abk5sZEY5M2FXUjBhRHNLWm14aGRDQnBiaUIxYVc1MElHWnlZV2RmYVc1emRHRnVZMlZmYVdRN0NtbHVJR1pzYjJGMElHOWZZMnhwY0Y5a2FYTjBZVzVqWlZzNFhUc0tabXhoZENCcGJpQjJaV015SUdaZmMzQnlhWFJsWDNOallXeGxPd3BtYkdGMElHbHVJSFpsWXpRZ1puSmhaMTl6ZEhKdmEyVmpiMnh2Y2pzS0NuVnVhV1p2Y20wZ2FXNTBJSFZ1YVdadmNtMWZiblZ0WDJOc2FYQmZjR3hoYm1Wek93b0tMeThnVkdobGMyVWdkbVZ5YzJsdmJuTWdiMllnWVdGemRHVndJR0Z6YzNWdFpTQjBhR0YwSUdCa2FYTjBZQ0JwY3lCaElITnBaMjVsWkNCa2FYTjBZVzVqWlNCbWRXNWpkR2x2Ymdvdkx5QjNhR2xqYUNCb1lYTWdZbVZsYmlCelkyRnNaV1FnZEc4Z1ltVWdhVzRnZFc1cGRITWdiMllnY0dsNFpXeHpMZ3BtYkc5aGRDQmhZWE4wWlhBb1pteHZZWFFnZEdoeVpYTm9iMnhrTVN3Z1pteHZZWFFnWkdsemRDd2dabXh2WVhRZ1lXRXBJSHNLSUNBZ0lISmxkSFZ5YmlCemJXOXZkR2h6ZEdWd0tIUm9jbVZ6YUc5c1pERWdMU0JoWVN3Z2RHaHlaWE5vYjJ4a01TQXJJR0ZoTENCa2FYTjBLVHNLZlFvS1pteHZZWFFnWVdGemRHVndLR1pzYjJGMElIUm9jbVZ6YUc5c1pERXNJR1pzYjJGMElIUm9jbVZ6YUc5c1pESXNJR1pzYjJGMElHUnBjM1FzSUdac2IyRjBJR0ZoS1NCN0NpQWdJQ0J5WlhSMWNtNGdjMjF2YjNSb2MzUmxjQ2gwYUhKbGMyaHZiR1F4SUMwZ1lXRXNJSFJvY21WemFHOXNaREVnS3lCaFlTd2daR2x6ZENrZ0xRb2dJQ0FnSUNBZ0lDQWdJSE50YjI5MGFITjBaWEFvZEdoeVpYTm9iMnhrTWlBdElHRmhMQ0IwYUhKbGMyaHZiR1F5SUNzZ1lXRXNJR1JwYzNRcE93cDlDZ292THlCUWNtOWpaV1IxY21Gc0lITnBaMjVsWkNCa2FYTjBZVzVqWlNCbWRXNWpkR2x2Ym5NZ2IyNGdkR2hsSUhWMklHTnZiM0prYVc1aGRHVWdjR0YwWTJnZ1d6QXNNVjE0V3pBc01WMEtMeThnVG05MFpTQjBhR0YwSUdadmNpQmhiblJwWVd4cFlYTnBibWNnZEc4Z2QyOXlheUJ3Y205d1pYSnNlU0IwYUdWelpTQnphRzkxYkdRZ1ltVWdLbk5qWVd4bElIQnlaWE5sY25acGJtY3FDaTh2SUNoSlppQjViM1VnYlhWemRDQnlaWE5qWVd4bElIVjJMQ0J0WVd0bElITjFjbVVnZEc4Z2NIVjBJSFJvWlNCelkyRnNaU0JtWVdOMGIzSWdZbUZqYXlCcGJpQnNZWFJsY2k0cENtWnNiMkYwSUhSeWFXRnVaMnhsS0habFl6SWdVQ2w3Q2lBZ0lDQlFJQzA5SUhabFl6SW9NQzQxS1RzS0lDQWdJR1pzYjJGMElIZ2dQU0JOWDFOUlVsUmZNaUFxSUNoUUxuZ2dMU0JRTG5rcE93b2dJQ0FnWm14dllYUWdlU0E5SUUxZlUxRlNWRjh5SUNvZ0tGQXVlQ0FySUZBdWVTazdDaUFnSUNCbWJHOWhkQ0J5TVNBOUlHMWhlQ2hoWW5Nb2VDa3NJR0ZpY3loNUtTa2dMU0F4TGpBdktESXVNQ3BOWDFOUlVsUmZNaWs3Q2lBZ0lDQm1iRzloZENCeU1pQTlJRkF1ZVRzS0lDQWdJSEpsZEhWeWJpQXRiV0Y0S0hJeExISXlLVHNLZlFvS1pteHZZWFFnWTJseVkyeGxLSFpsWXpJZ2RYWXBld29nSUNBZ2NtVjBkWEp1SURBdU5TMXNaVzVuZEdnb2RYWXRkbVZqTWlnd0xqVXBLVHNLZlFvS1pteHZZWFFnY21WamRHRnVaMnhsS0habFl6SWdkWFlwSUhzS0lDQWdJSFpsWXpJZ2N5QTlJR1pmYzNCeWFYUmxYM05qWVd4bElDOGdiV2x1S0daZmMzQnlhWFJsWDNOallXeGxMbmdzSUdaZmMzQnlhWFJsWDNOallXeGxMbmtwT3dvZ0lDQWdkbVZqTWlCa0lEMGdjeUFxSUcxaGVDZ3RkWFlzSUhWMklDMGdkbVZqTWlneEtTazdDaUFnSUNCeVpYUjFjbTRnTFNnb2JHVnVaM1JvS0cxaGVDaDJaV015S0RBdU1Da3NJR1FwS1NBcklHMXBiaWd3TGpBc0lHMWhlQ2hrTG5nc0lHUXVlU2twS1NrN0NuMEtDbVpzYjJGMElISnZkVzVrWldSZmNtVmpkR0Z1WjJ4bEtIWmxZeklnZFhZc0lIWmxZeklnZEd3c0lIWmxZeklnWW5JcGV3b2dJQ0FnZG1Wak1pQmtJRDBnYldGNEtIUnNMWFYyTENCMWRpMWljaWs3Q2lBZ0lDQnlaWFIxY200Z0xTZ29iR1Z1WjNSb0tHMWhlQ2gyWldNeUtEQXVNQ2tzSUdRcEtTQXJJRzFwYmlnd0xqQXNJRzFoZUNoa0xuZ3NJR1F1ZVNrcEtTMTBiQzU0S1RzS2ZRb0tkbVZqTkNCbWFXeHNLSFpsWXpRZ1ptbHNiR052Ykc5eUxDQjJaV00wSUdOdmJHOXlMQ0IyWldNeUlIVjJLU0I3Q2lBZ0lDQnlaWFIxY200Z1kyOXNiM0k3Q24wS2RtVmpOQ0JtYVd4c0tIWmxZelFnWm1sc2JHTnZiRzl5TENCbWJHOWhkQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpa2dld29nSUNBZ2NtVjBkWEp1SUdacGJHeGpiMnh2Y2pzS2ZRcDJaV00wSUdacGJHd29kbVZqTkNCbWFXeHNZMjlzYjNJc0lHSnZiMndnYVcxaFoyVXNJSFpsWXpJZ2RYWXBJSHNnY21WMGRYSnVJR1pwYkd4amIyeHZjanNnZlFwMlpXTTBJR1pwYkd3b2RtVmpOQ0JqTENCellXMXdiR1Z5TWtRZ2FXMWhaMlVzSUhabFl6SWdkWFlwSUhzZ2NtVjBkWEp1SUhSbGVIUjFjbVVvYVcxaFoyVXNJSFYyTG5sNEtUc2dmUW9LZG05cFpDQnpkSEp2YTJVb2RtVmpOQ0J6ZEhKdmEyVmpiMnh2Y2l3Z1pteHZZWFFnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JtYkc5aGRDQjNhV1IwYUN3Z2FXNXZkWFFnZG1Wak5DQmpiMnh2Y2l3Z1pteHZZWFFnWVdGZmNtRmthWFZ6S1hzS0lDQWdJR2xtSUNoM2FXUjBhQ0FoUFNBd0xqQXBld29nSUNBZ0lDQWdJR1pzYjJGMElIUWdQU0JoWVhOMFpYQW9iV2x1S0hkcFpIUm9MQ0F3TGpBcExDQnRZWGdvZDJsa2RHZ3NJREF1TUNrc0lITnBaMjVsWkY5a2FYTjBZVzVqWlN3Z1lXRmZjbUZrYVhWektUc0tJQ0FnSUNBZ0lDQjJaV00wSUdKblgyTnZiRzl5SUQwZ2JXbDRLR052Ykc5eUxDQjJaV00wS0hOMGNtOXJaV052Ykc5eUxuSm5ZaXdnTUNrc0lHWnNiMkYwS0hOcFoyNWxaRjlrYVhOMFlXNWpaU0E4SURBdU5TQXFJSGRwWkhSb0tTazdDaUFnSUNBZ0lDQWdZMjlzYjNJZ1BTQnRhWGdvWW1kZlkyOXNiM0lzSUhOMGNtOXJaV052Ykc5eUxDQjBLVHNLSUNBZ0lIMEtmUW9LZG05cFpDQm5iRzkzS0habFl6UWdaMnh2ZDJOdmJHOXlMQ0JtYkc5aGRDQnphV2R1WldSZlpHbHpkR0Z1WTJVc0lHWnNiMkYwSUdsdWMybGtaU3dnYVc1dmRYUWdkbVZqTkNCamIyeHZjaWw3Q2lBZ0lDQm1iRzloZENCbmJHOTNYM2RwWkhSb0lEMGdaMlYwWDJkc2IzZDNhV1IwYUNncElDb2daMlYwWDNCNFgzQmxjbDkxYm1sMEtDazdDaUFnSUNCbWJHOWhkQ0J6ZEhKdmEyVmZkMmxrZEdnZ1BTQm5aWFJmYzNSeWIydGxkMmxrZEdnb0tTQXFJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BPd29nSUNBZ2FXWWdLR2RzYjNkZmQybGtkR2dnUGlBd0xqQXBld29nSUNBZ0lDQWdJR1pzYjJGMElHOTFkSE5wWkdVZ1BTQW9ZV0p6S0hOcFoyNWxaRjlrYVhOMFlXNWpaU2tnTFNCemRISnZhMlZmZDJsa2RHZ3BJQzhnWjJ4dmQxOTNhV1IwYURzS0lDQWdJQ0FnSUNCbWJHOWhkQ0JoYkhCb1lTQTlJREV1TUNBdElHOTFkSE5wWkdVN0NpQWdJQ0FnSUNBZ1kyOXNiM0lnUFNCdGFYZ29kbVZqTkNobmJHOTNZMjlzYjNJdWNtZGlMQ0JuYkc5M1kyOXNiM0l1WVNwaGJIQm9ZU2tzSUdOdmJHOXlMQ0JwYm5OcFpHVXBPd29nSUNBZ2ZRcDlDZ3BtYkc5aGRDQnpZMkZzWldSZlpHbHpkR0Z1WTJWbWFXVnNaQ2h6WVcxd2JHVnlNa1FnWkdsemRHRnVZMlZtYVdWc1pDd2dkbVZqTWlCMWRpbDdDaUFnSUNBdkx5QkhiSGx3YUNCa2FYTjBZVzVqWlNCbWFXVnNaQ0IxYm1sMGN5QmhjbVVnYVc0Z2NHbDRaV3h6TGlCRGIyNTJaWEowSUhSdklITmhiV1VnWkdsemRHRnVZMlVLSUNBZ0lDOHZJSE5qWVd4cGJtY2dZWE1nWmw5MWRpNTRJR1p2Y2lCamIyNXphWE4wWlc1amVTQjNhWFJvSUhSb1pTQndjbTlqWldSMWNtRnNJSE5wWjI1bFpGOWthWE4wWVc1alpRb2dJQ0FnTHk4Z1kyRnNZM1ZzWVhScGIyNXpMZ29nSUNBZ2NtVjBkWEp1SUdaeVlXZGZaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaU0FxSUhSbGVIUjFjbVVvWkdsemRHRnVZMlZtYVdWc1pDd2dkWFlwTG5JN0NuMEtDbVpzYjJGMElITmpZV3hsWkY5a2FYTjBZVzVqWldacFpXeGtLR0p2YjJ3Z1pHbHpkR0Z1WTJWbWFXVnNaQ3dnZG1Wak1pQjFkaWw3Q2lBZ0lDQnlaWFIxY200Z01DNHdPd3A5Q2dvdkx5QkhhWFpsYmlCaElHWnlZV2R0Wlc1MElHUmxjbWwyWVhScGRtVWdiMllnWmw5MWRpQW9hUzVsTGlCa1JtUjRLR1pmZFhZcElHOXlJR1JHWkhrb1psOTFkaWtwTENCallXeGpkV3hoZEdVS0x5OGdkR2hsSUdGemMyOWphV0YwWldRZ0tITnhkV0Z5WldRcElHTm9ZVzVuWlNCcGJpQjBhR1VnWkdsemRHRnVZMlZtYVdWc1pDNGdWR2hwY3lCcGN5QmxabVpsWTNScGRtVnNlU0IwYUdVS0x5OGdLSE54ZFdGeVpXUXBJSEJoY25ScFlXd2daR1Z5YVhaaGRHbDJaU0J2WmlCMGFHVWdaR2x6ZEdGdVkyVm1hV1ZzWkNCM2FYUm9JSEpsYzNCbFkzUWdkRzhnWm5KaFoyMWxiblFLTHk4Z0tIQnBlR1ZzS1NCamIyOXlaR2x1WVhSbGN3cG1iRzloZENCemNYVmhjbVZrWDNCaGNuUnBZV3hmWkdWeWFYWmhkR1VvWm14dllYUWdZMlZ1ZEdWeUxDQjJaV015SUdSbVgzVjJLU0I3Q2lBZ0lDQjJaV015SUhWMk1TQTlJRzFwZUNobWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFDNTRlU3dnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdndWVuY3NJR05zWVcxd0tHWnlZV2RmZFhZZ0t5QXdMalVnS2lCa1psOTFkaXdnTUM0d0xDQXhMakFwS1RzS0lDQWdJSFpsWXpJZ2RYWXdJRDBnYldsNEtHWnlZV2RmZFhaZmIyWm1jMlYwWDNkcFpIUm9Mbmg1TENCbWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFDNTZkeXdnWTJ4aGJYQW9abkpoWjE5MWRpQXRJREF1TlNBcUlHUm1YM1YyTENBd0xqQXNJREV1TUNrcE93b2dJQ0FnTHk4Z1NYUWdZMkZ1SUdoaGNIQmxiaUIwYUdGMElHOTFjaUJtY21GbmJXVnVkQ0JwY3lCamJHOXpaU0IwYnlCaElHMWhlR2x0ZFcwZ2FXNGdkR2hsSUdScGMzUmhibU5sWm1sbGJHUUtJQ0FnSUM4dklIUmxlSFIxY21VdUlFbHVJSFJvYVhNZ1kyRnpaU0IwYUdVZ1pHVnlhWFpoZEdVZ1ltRnpaV1FnYjI0Z1lTQndiMmx1ZENCMGJ5QjBhR1VnYkdWbWRDQmhibVFnY21sbmFIUUtJQ0FnSUM4dklHTmhiaUJpWlNCamJHOXpaU0IwYnlBd0lIZG9aVzRnYVhRZ2MyaHZkV3hrYmlkMElHSmxMaUJVYnlCaGRtOXBaQ0IwYUdseklIZGxJR05oYkdOMWJHRjBaU0JoQ2lBZ0lDQXZMeUJrWlhKcGRtRjBhWFpsSUhSdklHVnBkR2hsY2lCemFXUmxJR0Z1WkNCMFlXdGxJSFJvWlNCemRISnZibWRsY2lCdmJtVXVDaUFnSUNCbWJHOWhkQ0JrWmpFZ1BTQnpZMkZzWldSZlpHbHpkR0Z1WTJWbWFXVnNaQ2hrYVhOMFlXNWpaV1pwWld4a0xDQjFkakVwSUMwZ1kyVnVkR1Z5T3dvZ0lDQWdabXh2WVhRZ1pHWXlJRDBnWTJWdWRHVnlJQzBnYzJOaGJHVmtYMlJwYzNSaGJtTmxabWxsYkdRb1pHbHpkR0Z1WTJWbWFXVnNaQ3dnZFhZd0tUc0tJQ0FnSUhKbGRIVnliaUF5TGpBZ0tpQnRZWGdvWkdZeElDb2daR1l4TENCa1pqSWdLaUJrWmpJcE93cDlDZ292THlCRFlXeGpkV3hoZEdVZ2RHaGxJR0Z1ZEdrdFlXeHBZWE5wYm1jZ2NtRmthWFZ6SUdKaGMyVmtJRzl1SUdodmR5QnRkV05vSUhSb1pTQmthWE4wWVc1alpTQm1hV1ZzWkNCamFHRnVaMlZ6Q2k4dklISmxiR0YwYVhabElIUnZJRzVsYVdkb1ltOXlhVzVuSUhOaGJYQnNaWE11SUVsbUlIUm9aU0JrY21GM2JpQnhkV0ZrSUhOaGJYQnNaWE1nZEdobElHUnBjM1JoYm1ObElHWnBaV3hrQ2k4dklIZHBkR2dnYzI5dFpTQmthWE4wYjNKMGFXOXVMQ0JwZENCM2FXeHNJR0psSUhCcFkydGxaQ0IxY0NCb1pYSmxJR0Z1WkNCamIyMXdaVzV6WVhSbFpDQnBiaUJqYUdGdVoyVnpJSFJ2Q2k4dklIUm9aU0JoYm5ScExXRnNhV0Z6YVc1bklISmhaR2wxY3k0S1pteHZZWFFnWVhOd1pXTjBYMk52Y25KbFkzUmxaRjlzYjJOaGJGOWhZVjl5WVdScGRYTW9abXh2WVhRZ2MybG5ibVZrWDJScGMzUmhibU5sS1NCN0NpQWdJQ0J5WlhSMWNtNGdabkpoWjE5MWRuTmpZV3hsSUNvZ1FVNVVTVUZNU1VGVFgxSkJSRWxWVXlBcUlFMWZVMUZTVkY4eUlDb2djM0Z5ZENnS0lDQWdJQ0FnSUNCemNYVmhjbVZrWDNCaGNuUnBZV3hmWkdWeWFYWmhkR1VvYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JrUm1SNEtHWnlZV2RmZFhZcEtTQXJDaUFnSUNBZ0lDQWdjM0YxWVhKbFpGOXdZWEowYVdGc1gyUmxjbWwyWVhSbEtITnBaMjVsWkY5a2FYTjBZVzVqWlN3Z1pFWmtlU2htY21GblgzVjJLU2tLSUNBZ0lDazdDbjBLQ25abFl6SWdaVzVqYjJSbFgzVnBiblJmZEc5ZlpteHZZWFFvZFdsdWRDQjJZV3gxWlNrZ2V3b2dJQ0FnWm14dllYUWdiRzkzWlhJZ1BTQm1iRzloZENoMllXeDFaU0FtSURCNFJrWkdSblVwSUM4Z05qVTFNelV1TURzS0lDQWdJR1pzYjJGMElIVndjR1Z5SUQwZ1pteHZZWFFvZG1Gc2RXVWdQajRnTVRaMUtTQXZJRFkxTlRNMUxqQTdDaUFnSUNCeVpYUjFjbTRnZG1Wak1paHNiM2RsY2l3Z2RYQndaWElwT3dwOUNncDJaV00wSUhCaFkydGZhVzUwS0hWcGJuUWdhV1FzSUhWcGJuUWdhVzVrWlhncElIc0tJQ0FnSUhabFl6UWdkVzV3WVdOck93b2dJQ0FnZFc1d1lXTnJMbkpuSUQwZ1pXNWpiMlJsWDNWcGJuUmZkRzlmWm14dllYUW9hV1FwT3dvZ0lDQWdkVzV3WVdOckxtSmhJRDBnWlc1amIyUmxYM1ZwYm5SZmRHOWZabXh2WVhRb2FXNWtaWGdwT3dvZ0lDQWdjbVYwZFhKdUlIVnVjR0ZqYXpzS2ZRb0tkbTlwWkNCdFlXbHVLQ2tnZXdvZ0lDQWdabTl5SUNocGJuUWdhU0E5SURBN0lHa2dQQ0IxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN6c2dhU3NyS1FvZ0lDQWdJQ0FnSUdsbUlDaHZYMk5zYVhCZlpHbHpkR0Z1WTJWYmFWMGdQQ0F3TGpBcENpQWdJQ0FnSUNBZ0lDQWdJR1JwYzJOaGNtUTdDZ29nSUNBZ1pteHZZWFFnYzJsbmJtVmtYMlJwYzNSaGJtTmxJRDBnTUM0d093b0tJQ0FnSUhabFl6UWdkWFpmYjJabUlEMGdabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2c3Q2lBZ0lDQjJaV015SUhSbGVGOTFkaUE5SUcxcGVDaDFkbDl2Wm1ZdWVIa3NJSFYyWDI5bVppNTZkeXdnWTJ4aGJYQW9abkpoWjE5MWRpd2dNQzR3TENBeExqQXBLVHNLSUNBZ0lHWnNiMkYwSUdGaFgzSmhaR2wxY3lBOUlFRk9WRWxCVEVsQlUxOVNRVVJKVlZNN0Nnb2dJQ0FnYVc1MElITm9ZWEJsSUQwZ1oyVjBYM05rWmw5dFlYSnJaWEpmYzJoaGNHVW9LVHNLSUNBZ0lHbG1LSE5vWVhCbElEMDlJRU5KVWtOTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQmphWEpqYkdVb1puSmhaMTkxZGlrN0NpQWdJQ0JsYkhObElHbG1LSE5vWVhCbElEMDlJRVJKVTFSQlRrTkZSa2xGVEVRcElIc0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQnpZMkZzWldSZlpHbHpkR0Z1WTJWbWFXVnNaQ2hrYVhOMFlXNWpaV1pwWld4a0xDQjBaWGhmZFhZcE93b2dJQ0FnSUNBZ0lHRmhYM0poWkdsMWN5QTlJR0Z6Y0dWamRGOWpiM0p5WldOMFpXUmZiRzlqWVd4ZllXRmZjbUZrYVhWektITnBaMjVsWkY5a2FYTjBZVzVqWlNrN0NpQWdJQ0FnSUNBZ2FXWWdLR2RsZEY5emRISnZhMlYzYVdSMGFDZ3BJRDRnTUM0d0lIeDhJR2RsZEY5bmJHOTNkMmxrZEdnb0tTQStJREF1TUNrZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0F2THlCRGIyMXdaVzV6WVhSbElHWnZjaUIwYUdVZ1kyeGhiWEJwYm1jZ2IyWWdkR1Y0WDNWMklHSjVJR0Z1SUdGd2NISnZlR2x0WVhSbENpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWNGRHVnVjMmx2YmlCdlppQjBhR1VnYzJsbmJtVmtJR1JwYzNSaGJtTmxJRzkxZEhOcFpHVWdkR2hsSUhaaGJHbGtJSFJsZUhSMWNtVUtJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NtVm5hVzl1TGdvZ0lDQWdJQ0FnSUNBZ0lDQjJaV015SUdKMVpuVjJJRDBnWm5KaFoxOTFkaUF0SUdOc1lXMXdLR1p5WVdkZmRYWXNJREF1TUN3Z01TNHdLVHNLSUNBZ0lDQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUMwOUlHeGxibWQwYUNoaWRXWjFkaWs3Q2lBZ0lDQWdJQ0FnZlFvZ0lDQWdmU0JsYkhObElHbG1LSE5vWVhCbElEMDlJRkpQVlU1RVJVUmZVa1ZEVkVGT1IweEZLUW9nSUNBZ0lDQWdJSE5wWjI1bFpGOWthWE4wWVc1alpTQTlJSEp2ZFc1a1pXUmZjbVZqZEdGdVoyeGxLR1p5WVdkZmRYWXNJSFpsWXpJb01DNHlLU3dnZG1Wak1pZ3dMamdwS1RzS0lDQWdJR1ZzYzJVZ2FXWW9jMmhoY0dVZ1BUMGdVa1ZEVkVGT1IweEZLUW9nSUNBZ0lDQWdJSE5wWjI1bFpGOWthWE4wWVc1alpTQTlJSEpsWTNSaGJtZHNaU2htY21GblgzVjJLVHNnTHk4Z2NtVmpkR0Z1WjJ4bEtHWmZkWFlwT3dvZ0lDQWdaV3h6WlNCcFppaHphR0Z3WlNBOVBTQlVVa2xCVGtkTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQjBjbWxoYm1kc1pTaG1jbUZuWDNWMktUc0tDaUFnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnS2owZ1puSmhaMTkxZG5OallXeGxPd29LQ2lBZ0lDQm1iRzloZENCemRISnZhMlZmZDJsa2RHZ2dQU0JuWlhSZmMzUnliMnRsZDJsa2RHZ29LU0FxSUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwT3dvZ0lDQWdabXh2WVhRZ2FXNXphV1JsWDNOMFlYSjBJRDBnYldGNEtDMXpkSEp2YTJWZmQybGtkR2dzSURBdU1DazdDaUFnSUNCbWJHOWhkQ0JwYm5OcFpHVWdQU0JoWVhOMFpYQW9hVzV6YVdSbFgzTjBZWEowTENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdGaFgzSmhaR2wxY3lrN0Nnb2dJQ0FnZG1Wak5DQm1hVzVoYkY5amIyeHZjaUE5SUdacGJHd29abkpoWjE5amIyeHZjaXdnZFc1cFptOXliVjlqYjJ4dmNpd2dabkpoWjE5MWRpazdDaUFnSUNCbWFXNWhiRjlqYjJ4dmNpNWhJRDBnWm1sdVlXeGZZMjlzYjNJdVlTQXFJR2x1YzJsa1pUc0tDaUFnSUNCemRISnZhMlVvWm5KaFoxOXpkSEp2YTJWamIyeHZjaXdnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0F0YzNSeWIydGxYM2RwWkhSb0xDQm1hVzVoYkY5amIyeHZjaXdnWVdGZmNtRmthWFZ6S1RzS0lDQWdJR2RzYjNjb1oyVjBYMmRzYjNkamIyeHZjaWdwTENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdGaGMzUmxjQ2d0YzNSeWIydGxYM2RwWkhSb0xDQnphV2R1WldSZlpHbHpkR0Z1WTJVc0lHRmhYM0poWkdsMWN5a3NJR1pwYm1Gc1gyTnZiRzl5S1RzS0NpQWdJQ0F2THlCa1pXSjFaeUF0SUhOb2IzY2dZbUZqYTJkeWIzVnVaQW9nSUNBZ0x5OGdabWx1WVd4ZlkyOXNiM0l1WVNBOUlHTnNZVzF3S0dacGJtRnNYMk52Ykc5eUxtRXNJREF1TUN3Z01TNHdLVHNLSUNBZ0lDOHZJR1pwYm1Gc1gyTnZiRzl5SUQwZ2RtVmpOQ2dLSUNBZ0lDOHZJQ0FnSUNCMlpXTXpLREVzTUN3d0tTQXFJQ2d4TGpBZ0xTQm1hVzVoYkY5amIyeHZjaTVoS1NBcklHWnBibUZzWDJOdmJHOXlMbkpuWWlBcUlHWnBibUZzWDJOdmJHOXlMbUVzQ2lBZ0lDQXZMeUFnSUNBZ01DNDBJQ3NnTUM0MklDb2dabWx1WVd4ZlkyOXNiM0l1WVFvZ0lDQWdMeThnS1RzS0NpQWdJQ0JwWmlBb2NHbGphMmx1WnlrZ2V3b2dJQ0FnSUNBZ0lHbG1JQ2htYVc1aGJGOWpiMnh2Y2k1aElENGdNQzR4S1NCN0NpQWdJQ0FnSUNBZ0lDQWdJR1p5WVdkdFpXNTBYMk52Ykc5eUlEMGdjR0ZqYTE5cGJuUW9iMkpxWldOMFgybGtMQ0JtY21GblgybHVjM1JoYm1ObFgybGtLVHNLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdld29nSUNBZ0lDQWdJQ0FnSUNCa2FYTmpZWEprT3dvZ0lDQWdJQ0FnSUgwS0lDQWdJQ0FnSUNCeVpYUjFjbTQ3Q2lBZ0lDQjlDZ29nSUNBZ2FXWWdLR1pwYm1Gc1gyTnZiRzl5TG1FZ1BEMGdNQzR3S1hzS0lDQWdJQ0FnSUNCa2FYTmpZWEprT3dvZ0lDQWdmUW9nSUNBZ1puSmhaMjFsYm5SZlkyOXNiM0lnUFNCbWFXNWhiRjlqYjJ4dmNqc0tmUXFwY0d4dmRGOTBlWEJscDFOallYUjBaWEtuZFhCa1lYUmxjc2NGYUtReE5UWTFzMmx1YzNSaGJtTmxYMkYwZEhKcFluVjBaWE9Jc21OdmJuWmxjblJsWkY5eWIzUmhkR2x2Ym9LcmRIbHdaVjlzWlc1bmRHZ0VwR1pzWVhUSFlCY0FBQUFBQUFBQUFQTUVOVC96QkRVL0FBQUFBQUFBQUFEekJEVS84d1ExUHdBQUFBQUFBQUFBOHdRMVAvTUVOVDhBQUFBQUFBQUFBUE1FTlQvekJEVS9BQUFBQUFBQUFBRHpCRFUvOHdRMVB3QUFBQUFBQUFBQTh3UTFQL01FTlQrcWNYVmhaRjl6WTJGc1pZS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhBQmV0YldGeWEyVnlYMjltWm5ObGRJS3JkSGx3WlY5c1pXNW5kR2dEcEdac1lYVEhTQmY3VTBQQUx0Mkl3UUFBQUFENlUwUEFYYm9od1FBQUFBRDVVMFBBLy8vZndBQUFBQUQzVTBQQVFyUklQd0FBQUFEMlUwUEFvMFd1UUFBQUFBRDBVMFBBMFNKSFFRQUFBQUMxWTI5dWRtVnlkR1ZrWDNOMGNtOXJaV052Ykc5eWdxdDBlWEJsWDJ4bGJtZDBhQVNrWm14aGRNZGdGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLWnpaR1pmZFhhQ3EzUjVjR1ZmYkdWdVozUm9CS1JtYkdGMHh3QVhyWGRuYkY5d2IzTnBkR2x2Ym5PQ3EzUjVjR1ZmYkdWdVozUm9BcVJtYkdGMHh6QVhlT242UVFDQVJFTjQ2ZnBCQUlCRVEzanAra0VBZ0VSRGVPbjZRUUNBUkVONDZmcEJBSUJFUTNqcCtrRUFnRVJEckhabGNuUmxlRjlqYjJ4dmNvS3JkSGx3WlY5c1pXNW5kR2dFcEdac1lYVEhZQmNBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQWdEK3JjWFZoWkY5dlptWnpaWFNDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHdBWGpLeDBjbUZ1YzNCaGNtVnVZM25DcG5wMllXeDFaY29BQUFBQXBHNWhiV1haSVd4cGJtVnpaV2R0Wlc1MGN5MHhNamcyTVRJd05UY3lNVEk0TXpNMk16VTBONmxqWVcxZmMzQmhZMldrWkdGMFlhaDFibWxtYjNKdGM0NnlkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWx1WVc1ZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFBQUNxYlc5a1pXeGZaak15WThkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEKzJkVzVwWm05eWJWOXdZWFIwWlhKdVgyeGxibWQwYU1vL2dBQUFySE5qWlc1bFgyOXlhV2RwYnRjWEFBQUFBQUFBQUFDdGJHOTNZMnhwY0Y5amIyeHZjdGdYd0xTSVBoTzJuenNWcWFnK0FBQ0FQN0IxYm1sbWIzSnRYMk52Ykc5eWJXRnd3cWR3YVdOcmFXNW53cmQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3JaR1Z3ZEdoZmMyaHBablRLQUFBQUFLOTFibWxtYjNKdFgzQmhkSFJsY203Q3JtaHBaMmhqYkdsd1gyTnZiRzl5MkJlQVJYNC82UGxuUC9WakV6NEFBSUEvczNWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhQSGdCY0FBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6cWQyYVhOcFlteGx3Nmh2ZG1WeVpISmhkOEtyYVhOZmMyVm5iV1Z1ZEhQRHFtRjBkSEpwWW5WMFpYT0RzWFZ1YVdadmNtMWZiR2x1WlhkcFpIUm9ncXQwZVhCbFgyeGxibWQwYUFHa1pteGhkTWNBRjZwc2FXNWxYMk52Ykc5eWdxdDBlWEJsWDJ4bGJtZDBhQVNrWm14aGRNY0FGN3B3YjNOcGRHbHZibk5mZEhKaGJuTm1iM0p0WldSZlpqTXlZNEtyZEhsd1pWOXNaVzVuZEdnRHBHWnNZWFRIQUJla2RYVnBaTFF4TWpnMk1USXdOVGN5TVRJNE16TTJNelUwTjZsd2JHOTBYM1I1Y0dXbFRHbHVaWE9uZFhCa1lYUmxjc2NGYUtReE5UWTJqS3gwY21GdWMzQmhjbVZ1WTNuQ3BucDJZV3gxWmNwQm9BQUFwRzVoYldYWklXeHBibVZ6WldkdFpXNTBjeTB4TXpjM01qQTVOekl3TlRZeU56Z3lOek13TktsallXMWZjM0JoWTJXa1pHRjBZYWgxYm1sbWIzSnRjOTRBRUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXNWhibDlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFLcHRiMlJsYkY5bU16Smp4MEFYQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFLQkJBQUNBUDdaMWJtbG1iM0p0WDNCaGRIUmxjbTVmYkdWdVozUm95aitBQUFDc2MyTmxibVZmYjNKcFoybHUxeGNBQUFBQUFBQUFBSzFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3NIVnVhV1p2Y20xZlkyOXNiM0p0WVhEQ3AzQnBZMnRwYm1mQ3NYVnVhV1p2Y20xZmJHbHVaWGRwWkhSb3lqK0FBQUMzZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFwMnhwYm1WallYQUFxbXhwYm1WZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFnRCtyWkdWd2RHaGZjMmhwWm5US0FBQUFBSzkxYm1sbWIzSnRYM0JoZEhSbGNtN0NybWhwWjJoamJHbHdYMk52Ykc5eTJCZUFSWDQvNlBsblAvVmpFejRBQUlBL3MzVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYUEhnQmNBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1enFkMmFYTnBZbXhsdzZodmRtVnlaSEpoZDhLcmFYTmZjMlZuYldWdWRIUERxbUYwZEhKcFluVjBaWE9CdW5CdmMybDBhVzl1YzE5MGNtRnVjMlp2Y20xbFpGOW1NekpqZ3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE5nWEFBQ1VRZ0FBYWtJQUFKUkNBRUNuUTZSMWRXbGt0REV6TnpjeU1EazNNakExTmpJM09ESTNNekEwcVhCc2IzUmZkSGx3WmFWTWFXNWxjNmQxY0dSaGRHVnl4d1ZvcERFMU5qZmVBQktzZEhKaGJuTndZWEpsYm1ONXdxVnpjR0ZqWmFSa1lYUmhySFpsY25SbGVHRnljbUY1YzRLaWRYYUNxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4eUFYQUFBQUFBQUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4QUFBQUFBQUFBQUFBQUFBQ29jRzl6YVhScGIyNkNxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4eUFYQUFBQXZ3QUFBTDhBQUFBL0FBQUF2d0FBQUQ4QUFBQS9BQUFBdndBQUFEK21lblpoYkhWbHlnQUFBQUNrYm1GdFpiaDBaWGgwTFRFeU1UWTVOVE0yTkRJNU5qWXlOVGN4TWpXcFkyRnRYM053WVdObHBHUmhkR0dvZFc1cFptOXliWFBlQUJtcmNIaGZjR1Z5WDNWdWFYVEtBQUFBQUtsbmJHOTNZMjlzYjNMWUZ3QUFBQUFBQUFBQUFBQUFBQUFBQUFDeWRXNXBabTl5YlY5amIyeHZjbkpoYm1kbHdxbGlhV3hzWW05aGNtVENyWEJ5WlhCeWIycGxZM1JwYjI3SFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9xVzVoYmw5amIyeHZjdGdYQUFBQUFBQUFBQUFBQUFBQUFBQUFBSzFrYVhOMFlXNWpaV1pwWld4a2lxbHRhVzVHYVd4MFpYS3NUR2x1WldGeVJtbHNkR1Z5cW1GdWFYTnZkSEp2Y0huS1FZQUFBS2x0WVdkR2FXeDBaWEtzVEdsdVpXRnlSbWxzZEdWeXBYZHlZWEJUcmxKbGNHVmhkRmR5WVhCd2FXNW5wR1JoZEdHdGRHVjRkSFZ5WlY5aGRHeGhjNngwYUhKbFpWOW1iM0p0WVhTcFVtVmtSbTl5YldGMHBITnBlbVdTelFnQXpRZ0FwWGR5WVhCVXJsSmxjR1ZoZEZkeVlYQndhVzVucEhSNWNHV25VMkZ0Y0d4bGNxcDBhSEpsWlY5MGVYQmxxVVpzYjJGMFZIbHdaYXB0YjJSbGJGOW1NekpqeDBBWEFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVA3SmhkR3hoYzE5MFpYaDBkWEpsWDNOcGVtWEtSUUFBQUxCelpHWmZiV0Z5YTJWeVgzTm9ZWEJsQTZkd1lYUjBaWEp1d3F0emRISnZhMlYzYVdSMGFNb0FBQUFBcld4dmQyTnNhWEJmWTI5c2IzTFlGOEMwaUQ0VHRwODdGYW1vUGdBQWdEK3dkVzVwWm05eWJWOWpiMnh2Y20xaGNNS3BaMnh2ZDNkcFpIUm95Z0FBQUFDbmNHbGphMmx1WjhLcWNtVnpiMngxZEdsdmJ0Y1hBQUFBQUFBQUFBQzNkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNQXFXOWlhbVZqZEY5cFpBQ3RkVzVwWm05eWJWOWpiMnh2Y3NLd2RISmhibk5tYjNKdFgyMWhjbXRsY3NLclpHVndkR2hmYzJocFpuVEtBQUFBQUtwbU16SmpYM05qWVd4bHh3d1hBQUNBUHdBQWdEOEFBSUEvcm1ocFoyaGpiR2x3WDJOdmJHOXkyQmVBUlg0LzZQbG5QL1ZqRXo0QUFJQS9zM1Z1YVdadmNtMWZZMnhwY0Y5d2JHRnVaWFBIZ0JjQUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpxZDJhWE5wWW14bHc2dHRZWEpyWlhKemNHRmpaYVJrWVhSaHFHOTJaWEprY21GM3dxcG5iSGx3YUY5a1lYUmhnNnhuYkhsd2FGOW9ZWE5vWlhQSFJCWWhNbnhqcFRtQzV5dm5DckpoOWRleklUSjhZMkgxMTdNcjV3cXlWZGV3S0dIMTE3TXI1d3F5WWZYWHMySDExN01yNXdxeVZkZXdLS1U1Z3VjcjV3cXlZZlhYczZaelkyRnNaWFBIaUJjQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFBQmdRUUFBWUVFQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFBQmdRUUFBWUVFQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQkFBQmdRUUFBWUVFQUFHQkJBQUJnUVFBQVlFRUFBR0JCQUFCZ1FRQUFZRUVBQUdCQnJXRjBiR0Z6WDNWd1pHRjBaWE9DcWpFMk5qa3dPRE0yT0RHVTJCY0FnUDQ5QU5BdFB3QkFHVDRBVURFL3lCZ1RZNUxYRmpVQUFBQWRBQUFBeUJnRUZ3QmdoRUVBb0gxQkFBQnpRUUFBYVVFQXdGOUJBQ0JYUVFDQVQwRUE0RWhCQUdCRFFRQUFQMEVBNER0QkFDQTZRUUNnT1VFQW9EbEJBS0E1UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBb0RsQkFLQTVRUUNnT1VFQW9EbEJBS0E1UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBb0RsQkFLQTVRUUNnT1VFQW9EbEJBS0E1UVFDZ09VRUFvRGxCQUtBNVFRQ2dPVUVBb0RsQkFLQTVRUUNnT1VFQW9EbEJBQ0E2UVFEZ08wRUFBRDlCQUdCRFFRRGdTRUVBZ0U5QkFDQlhRUURBWDBFQUFHbEJBQUJ6UVFDZ2ZVRUFZSVJCQU9COVFRQWdja0VBQUdkQkFJQmNRUUNnVWtFQWdFbEJBR0JCUVFCQU9rRUFRRFJCQUlBdlFRQWdMRUVBSUNwQkFLQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUFvQ2xCQUtBcFFRQ2dLVUVBb0NsQkFLQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUFvQ2xCQUtBcFFRQ2dLVUVBb0NsQkFLQXBRUUNnS1VFQW9DbEJBS0FwUVFDZ0tVRUFvQ2xCQUtBcFFRQ2dLVUVBb0NsQkFLQXBRUUNnS1VFQUlDcEJBQ0FzUVFDQUwwRUFRRFJCQUVBNlFRQmdRVUVBZ0VsQkFLQlNRUUNBWEVFQUFHZEJBQ0J5UVFEZ2ZVRUFZSE5CQUVCblFRQ0FXMEVBWUZCQkFBQkdRUUJBUEVFQWdETkJBTUFyUVFCQUpVRUFJQ0JCQUdBY1FRQkFHa0VBb0JsQkFLQVpRUUNnR1VFQW9CbEJBS0FaUVFDZ0dVRUFvQmxCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUNnR1VFQW9CbEJBS0FaUVFDZ0dVRUFvQmxCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUNnR1VFQW9CbEJBS0FaUVFDZ0dVRUFvQmxCQUtBWlFRQ2dHVUVBb0JsQkFLQVpRUUJBR2tFQVlCeEJBQ0FnUVFCQUpVRUF3Q3RCQUlBelFRQkFQRUVBQUVaQkFHQlFRUUNBVzBFQVFHZEJBR0J6UVFDZ2FVRUFBRjFCQUtCUVFRRGdSRUVBNERsQkFJQXZRUUFBSmtFQW9CMUJBSUFXUVFEQUVFRUFvQXhCQUVBS1FRQ2dDVUVBb0FsQkFLQUpRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFvQWxCQUtBSlFRQ2dDVUVBb0FsQkFLQUpRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFvQWxCQUtBSlFRQ2dDVUVBb0FsQkFLQUpRUUNnQ1VFQW9BbEJBS0FKUVFDZ0NVRUFvQWxCQUtBSlFRQ2dDVUVBb0FsQkFFQUtRUUNnREVFQXdCQkJBSUFXUVFDZ0hVRUFBQ1pCQUlBdlFRRGdPVUVBNEVSQkFLQlFRUUFBWFVFQW9HbEJBS0JnUVFCZ1UwRUFnRVpCQUNBNlFRQkFMa0VBUUNOQkFBQVpRUURnRDBFQUFBaEJBS0FCUVFBZytrQUF3UFJBQUVEelFBQkE4MEFBUVBOQUFFRHpRQUJBODBBQVFQTkFBRUR6UUFCQTgwQUFRUE5BQUVEelFBQkE4MEFBUVBOQUFFRHpRQUJBODBBQVFQTkFBRUR6UUFCQTgwQUFRUE5BQUVEelFBQkE4MEFBUVBOQUFFRHpRQUJBODBBQVFQTkFBRUR6UUFCQTgwQUFRUE5BQUVEelFBQkE4MEFBd1BSQUFDRDZRQUNnQVVFQUFBaEJBT0FQUVFBQUdVRUFRQ05CQUVBdVFRQWdPa0VBZ0VaQkFHQlRRUUNnWUVFQVlGaEJBS0JLUVFBZ1BVRUFBREJCQUlBalFRREFGMEVBb0F4QkFLQUNRUURnODBBQW9PVkFBQ0RiUUFBQTFVQUFRTk5BQUVEVFFBQkEwMEFBUU5OQUFFRFRRQUJBMDBBQVFOTkFBRURUUUFCQTAwQUFRTk5BQUVEVFFBQkEwMEFBUU5OQUFFRFRRQUJBMDBBQVFOTkFBRURUUUFCQTAwQUFRTk5BQUVEVFFBQkEwMEFBUU5OQUFFRFRRQUJBMDBBQVFOTkFBRURUUUFCQTAwQUFRTk5BQUVEVFFBQUExVUFBSU50QUFLRGxRQURnODBBQW9BSkJBS0FNUVFEQUYwRUFnQ05CQUFBd1FRQWdQVUVBb0VwQkFHQllRUUFBVVVFQXdFSkJBS0EwUVFBQUowRUF3QmxCQUFBTlFRQWdBVUVBUU94QUFNRFlRQUNBeUVBQWdMeEFBRUMxUUFCQXMwQUFRTE5BQUVDelFBQkFzMEFBUUxOQUFFQ3pRQUJBczBBQVFMTkFBRUN6UUFCQXMwQUFRTE5BQUVDelFBQkFzMEFBUUxOQUFFQ3pRQUJBczBBQVFMTkFBRUN6UUFCQXMwQUFRTE5BQUVDelFBQkFzMEFBUUxOQUFFQ3pRQUJBczBBQVFMTkFBRUN6UUFCQXMwQUFRTE5BQUVDMVFBQ0F2RUFBZ01oQUFNRFlRQUJBN0VBQUlBRkJBQUFOUVFEQUdVRUFBQ2RCQUtBMFFRREFRa0VBQUZGQkFNQktRUURnTzBFQVFDMUJBQUFmUVFBQUVVRUFZQU5CQUFEdFFBQUExVUFBSUw5QUFLQ3NRQUJnbmtBQW9KVkFBRUNUUUFCQWswQUFRSk5BQUVDVFFBQkFrMEFBUUpOQUFFQ1RRQUJBazBBQVFKTkFBRUNUUUFCQWswQUFRSk5BQUVDVFFBQkFrMEFBUUpOQUFFQ1RRQUJBazBBQVFKTkFBRUNUUUFCQWswQUFRSk5BQUVDVFFBQkFrMEFBUUpOQUFFQ1RRQUJBazBBQVFKTkFBRUNUUUFCQWswQUFvSlZBQUdDZVFBQ2dyRUFBSUw5QUFBRFZRQUFBN1VBQVlBTkJBQUFSUVFBQUgwRUFRQzFCQU9BN1FRREFTa0VBZ0VWQkFFQTJRUUFnSjBFQVFCaEJBSUFKUVFCZzlrQUFvTnBBQUVEQVFBREFwMEFBUUpKQUFDQ0JRQURBYkVBQWdHWkFBR0JtUUFCZ1prQUFZR1pBQUdCbVFBQmdaa0FBWUdaQUFHQm1RQUJnWmtBQVlHWkFBR0JtUUFCZ1prQUFZR1pBQUdCbVFBQmdaa0FBWUdaQUFHQm1RQUJnWmtBQVlHWkFBR0JtUUFCZ1prQUFZR1pBQUdCbVFBQmdaa0FBWUdaQUFHQm1RQUJnWmtBQVlHWkFBSUJtUUFEQWJFQUFJSUZBQUVDU1FBREFwMEFBUU1CQUFLRGFRQUJnOWtBQWdBbEJBRUFZUVFBZ0owRUFRRFpCQUlCRlFRQmdRVUVBd0RGQkFFQWlRUURnRWtFQW9BTkJBQ0RwUUFDZ3kwQUE0SzVBQUtDVFFBQkFkVUFBUUV0QUFBQXZRQUNBSmtBQVlDWkFBR0FtUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBWUNaQUFHQW1RQUJnSmtBQVlDWkFBR0FtUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBWUNaQUFHQW1RQUJnSmtBQVlDWkFBR0FtUUFCZ0prQUFZQ1pBQUdBbVFBQmdKa0FBWUNaQUFHQW1RQUJnSmtBQWdDWkFBQUF2UUFCQVMwQUFRSFZBQUtDVFFBRGdya0FBb010QUFDRHBRQUNnQTBFQTRCSkJBRUFpUVFEQU1VRUFZRUZCQUtBK1FRREFMa0VBQUI5QkFDQVBRUUFBLzBBQXdOOUFBTURBUUFBZ29rQUFRSVJBQUNCUFFBQkFHMEFBNE9jL0FDRE5Qd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQU1ETVB3REF6RDhBd013L0FNRE1Qd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQU1ETVB3REF6RDhBd013L0FNRE1Qd0RBekQ4QXdNdy9BTURNUHdEQXpEOEF3TXcvQU1ETVB3REF6RDhBd013L0FNRE1Qd0FnelQ4QTRPYy9BRUFiUUFBZ1QwQUFRSVJBQUNDaVFBREF3RUFBd045QUFBRC9RQUFnRDBFQUFCOUJBTUF1UVFDZ1BrRUFJRDFCQUNBdFFRQWdIVUVBUUExQkFJRDZRQUNnMmtBQXdMcEFBQUNiUUFEZ2RrQUFJRGhBQUtEMVB3QWdoVDhBd0JzL0FLQVpQd0NnR1Q4QW9Cay9BS0FaUHdDZ0dUOEFvQmsvQUtBWlB3Q2dHVDhBb0JrL0FLQVpQd0NnR1Q4QW9Cay9BS0FaUHdDZ0dUOEFvQmsvQUtBWlB3Q2dHVDhBb0JrL0FLQVpQd0NnR1Q4QW9Cay9BS0FaUHdDZ0dUOEFvQmsvQUtBWlB3Q2dHVDhBb0JrL0FNQWJQd0FnaFQ4QW9QVS9BQ0E0UUFEZ2RrQUFBSnRBQU1DNlFBQ2cya0FBZ1BwQUFFQU5RUUFnSFVFQUlDMUJBQ0E5UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3QmdqNzRBb0JtL0FLQVp2d0NnR2I4QW9CbS9BS0FadndDZ0diOEFvQm0vQUtBWnZ3Q2dHYjhBb0JtL0FLQVp2d0NnR2I4QW9CbS9BS0FadndDZ0diOEFvQm0vQUtBWnZ3Q2dHYjhBb0JtL0FLQVp2d0NnR2I4QW9CbS9BS0FadndDZ0diOEFvQm0vQUtBWnZ3Q2dHYjhBWUkrK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQUFxYjhBd015L0FNRE12d0RBekw4QXdNeS9BTURNdndEQXpMOEF3TXkvQU1ETXZ3REF6TDhBd015L0FNRE12d0RBekw4QXdNeS9BTURNdndEQXpMOEF3TXkvQU1ETXZ3REF6TDhBd015L0FNRE12d0RBekw4QXdNeS9BTURNdndEQXpMOEF3TXkvQUFDcHZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBR0RtUHdEQVREOEFZTGkrQUNDeXZ3RGcrTDhBNFBxL0FPRDZ2d0RnK3I4QTRQcS9BT0Q2dndEZytyOEE0UHEvQU9ENnZ3RGcrcjhBNFBxL0FPRDZ2d0RnK3I4QTRQcS9BT0Q2dndEZytyOEE0UHEvQU9ENnZ3RGcrcjhBNFBxL0FPRDZ2d0RnK3I4QTRQcS9BT0Q2dndEZytMOEFJTEsvQUdDNHZnREFURDhBWU9ZL0FFQXpRQUJBYzBBQW9KbEFBS0M1UUFDZzJVQUFvUGxBQU1BTVFRREFIRUVBd0N4QkFNQThRUURBUEVFQXdDeEJBTUFjUVFEQURFRUFvUGxBQUtEWlFBQ2d1VUFBb0psQUFFQnpRQUJBTTBBQVlPWS9BTUJNUHdCQXRMNEF3SGUvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndBQWdMOEFBSUMvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndBQWdMOEFBSUMvQUFDQXZ3QUFnTDhBQUlDL0FBQ0F2d0FBZ0w4QUFJQy9BQUNBdndEQWQ3OEFRTFMrQU1CTVB3Qmc1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFPQThRUURnTEVFQTRCeEJBT0FNUVFEZytVQUE0TmxBQU9DNVFBQUFta0FBSUhSQUFJQTBRQUJnNmo4QW9GNC9BTUF5UGdEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQTlUMEF3UFU5QU1EMVBRREE5VDBBd1BVOUFNRDFQUURBOVQwQXdQVTlBTUQxUFFEQU1qNEFvRjQvQUdEcVB3Q0FORUFBSUhSQUFBQ2FRQURndVVBQTRObEFBT0Q1UUFEZ0RFRUE0QnhCQU9Bc1FRRGdQRUVBNEQxQkFPQXRRUUFBSGtFQUlBNUJBTUQ4UUFBZzNVQUF3TDFBQUtDZVFBQ2dmMEFBd0VOQUFLQUxRQUFndkQ4QUFKby9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BS0NaUHdDZ21UOEFvSmsvQUtDWlB3Q2dtVDhBb0prL0FLQ1pQd0NnbVQ4QW9Kay9BQUNhUHdBZ3ZEOEFvQXRBQU1CRFFBQ2dmMEFBb0o1QUFNQzlRQUFnM1VBQXdQeEFBQ0FPUVFBQUhrRUE0QzFCQU9BOVFRQWdRRUVBWURCQkFNQWdRUUJBRVVFQXdBRkJBT0RrUUFEQXhrQUFRS2xBQU1DTVFBQ2daRUFBNERaQUFPQVdRQURnREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQXdBeEFBTUFNUUFEQURFQUF3QXhBQU1BTVFBREFERUFBd0F4QUFNQU1RQURBREVBQTRBeEFBT0FXUUFEZ05rQUFvR1JBQU1DTVFBQkFxVUFBd01aQUFPRGtRQURBQVVFQVFCRkJBTUFnUVFCZ01FRUFJRUJCQUtCRFFRQkFORUVBQUNWQkFPQVZRUUFBQjBFQW9QQkFBQ0RVUUFEZ3VFQUFRSjlBQUdDSVFBQ2dhMEFBNEZOQUFPQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURBVEVBQXdFeEFBTUJNUUFEQVRFQUF3RXhBQU1CTVFBREFURUFBd0V4QUFNQk1RQURnVEVBQTRGTkFBS0JyUUFCZ2lFQUFRSjlBQU9DNFFBQWcxRUFBb1BCQUFBQUhRUURnRlVFQUFDVkJBRUEwUVFDZ1EwRUFnRWhCQUlBNVFRQ2dLa0VBSUJ4QkFPQU5RUURnLzBBQVlPVkFBRURNUUFDQXRVQUF3S0ZBQUlDU1FBQWdpVUFBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUJnaGtBQVlJWkFBR0NHUUFCZ2hrQUFZSVpBQUdDR1FBQmdoa0FBWUlaQUFHQ0dRQUFnaVVBQWdKSkFBTUNoUUFDQXRVQUFRTXhBQUdEbFFBRGcvMEFBNEExQkFDQWNRUUNnS2tFQWdEbEJBSUJJUVFCZ1RrRUE0RDlCQUtBeFFRQ2dJMEVBQUJaQkFBQUpRUUJnK1VBQW9PSkFBRURPUUFCQXZVQUFZTEJBQUtDb1FBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFHQ21RQUJncGtBQVlLWkFBR0NtUUFCZ3BrQUFZS1pBQUdDbVFBQmdwa0FBWUtaQUFLQ29RQUJnc0VBQVFMMUFBRURPUUFDZzRrQUFZUGxBQUFBSlFRQUFGa0VBb0NOQkFLQXhRUURnUDBFQVlFNUJBR0JWUVFCQVIwRUFvRGxCQUVBc1FRQ0FIMEVBUUJOQkFPQUhRUUFnKzBBQTRPaEFBT0RaUUFEQXprQUFRTWhBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBWU1aQUFHREdRQUJneGtBQVlNWkFBR0RHUUFCZ3hrQUFZTVpBQUdER1FBQmd4a0FBUU1oQUFNRE9RQURnMlVBQTRPaEFBQ0Q3UUFEZ0IwRUFRQk5CQUlBZlFRQkFMRUVBb0RsQkFFQkhRUUJnVlVFQVFGMUJBTUJQUVFDZ1FrRUFBRFpCQU9BcFFRQ0FIa0VBQUJSQkFJQUtRUUJnQWtFQVlQZEFBS0R0UUFBQTZFQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQmc1a0FBWU9aQUFHRG1RQUJnNWtBQVlPWkFBR0RtUUFCZzVrQUFZT1pBQUdEbVFBQUE2RUFBb08xQUFHRDNRQUJnQWtFQWdBcEJBQUFVUVFDQUhrRUE0Q2xCQUFBMlFRQ2dRa0VBd0U5QkFFQmRRUUFBWmtFQUFGbEJBSUJNUVFDQVFFRUFJRFZCQUlBcVFRREFJRUVBSUJoQkFLQVFRUURBQ2tFQVlBWkJBT0FEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQUVBRFFRQkFBMEVBUUFOQkFFQURRUUJBQTBFQVFBTkJBRUFEUVFCQUEwRUFRQU5CQU9BRFFRQmdCa0VBd0FwQkFLQVFRUUFnR0VFQXdDQkJBSUFxUVFBZ05VRUFnRUJCQUlCTVFRQUFXVUVBQUdaQkFJQnZRUUFBWTBFQUlGZEJBTUJMUVFBQVFVRUFJRGRCQUNBdVFRQWdKa0VBWUI5QkFPQVpRUUFBRmtFQTRCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUFRQk5CQUVBVFFRQkFFMEVBUUJOQkFFQVRRUUJBRTBFQVFCTkJBRUFUUVFCQUUwRUE0Qk5CQUFBV1FRRGdHVUVBWUI5QkFDQW1RUUFnTGtFQUlEZEJBQUJCUVFEQVMwRUFJRmRCQUFCalFRQ0FiMEVBb0hsQkFNQnRRUUJnWWtFQW9GZEJBSUJOUVFCQVJFRUF3RHRCQUdBMFFRQkFMa0VBUUNsQkFNQWxRUURBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFCQUkwRUFRQ05CQUVBalFRQkFJMEVBUUNOQkFFQWpRUUJBSTBFQVFDTkJBRUFqUVFEQUkwRUF3Q1ZCQUVBcFFRQkFMa0VBWURSQkFNQTdRUUJBUkVFQWdFMUJBS0JYUVFCZ1lrRUF3RzFCQUtCNVFRQWdna0VBQUhsQkFDQnVRUUFBWkVFQVlGcEJBTUJSUVFEZ1NVRUFBRU5CQUVBOVFRREFPRUVBZ0RWQkFNQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBRUF6UVFCQU0wRUFRRE5CQUVBelFRQkFNMEVBUUROQkFFQXpRUUJBTTBFQVFETkJBTUF6UVFDQU5VRUF3RGhCQUVBOVFRQUFRMEVBNEVsQkFNQlJRUUJnV2tFQUFHUkJBQ0J1UVFBQWVVRUFJSUpCQU1DSFFRQmdna0VBWUhwQkFNQndRUURBWjBFQWdGOUJBQ0JZUVFEZ1VVRUFnRXhCQUdCSVFRQmdSVUVBb0VOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQVFFTkJBRUJEUVFCQVEwRUFRRU5CQUVCRFFRQkFRMEVBUUVOQkFFQkRRUUJBUTBFQW9FTkJBR0JGUVFCZ1NFRUFnRXhCQU9CUlFRQWdXRUVBZ0Y5QkFNQm5RUURBY0VFQVlIcEJBR0NDUVFEQWgwSFhGMEpnNVQ2V1E0czkxeGVXUTRzOUd5OWRQcW95T1RnM01EVTRPVGczbE5nWEFJQzNQUUJ3ZVQ4QWdOVTlBREI5UDhnUEUyT1MxeFlmQUFBQUh3QUFBTWdQQkJjQWdJVkJBQUNBUVFDQWRVRUFvR3RCQUdCaVFRQUFXa0VBWUZKQkFPQkxRUUJnUmtFQUlFSkJBQUEvUVFCQVBVRUF3RHhCQU1BOFFRREFQRUVBd0R4QkFNQThRUURBUEVFQXdEeEJBRUE5UVFBQVAwRUFJRUpCQUdCR1FRRGdTMEVBWUZKQkFBQmFRUUJnWWtFQW9HdEJBSUIxUVFBQWdFRUFnSVZCQUFDQVFRQmdkRUVBWUdsQkFBQmZRUUJBVlVFQVFFeEJBRUJFUVFBZ1BVRUFRRGRCQUtBeVFRQkFMMEVBWUMxQkFNQXNRUURBTEVFQXdDeEJBTUFzUVFEQUxFRUF3Q3hCQU1Bc1FRQmdMVUVBUUM5QkFLQXlRUUJBTjBFQUlEMUJBRUJFUVFCQVRFRUFRRlZCQUFCZlFRQmdhVUVBWUhSQkFBQ0FRUUNBZFVFQVlHbEJBTUJkUVFEQVVrRUFnRWhCQU9BK1FRQkFOa0VBb0M1QkFFQW9RUUFnSTBFQWdCOUJBR0FkUVFEQUhFRUF3QnhCQU1BY1FRREFIRUVBd0J4QkFNQWNRUURBSEVFQVlCMUJBSUFmUVFBZ0kwRUFRQ2hCQUtBdVFRQkFOa0VBNEQ1QkFJQklRUURBVWtFQXdGMUJBR0JwUVFDQWRVRUFvR3RCQUFCZlFRREFVa0VBSUVkQkFFQThRUUFBTWtFQXdDaEJBSUFnUVFCZ0dVRUE0Qk5CQU1BUFFRQ0FEVUVBd0F4QkFNQU1RUURBREVFQXdBeEJBTUFNUVFEQURFRUF3QXhCQUlBTlFRREFEMEVBNEJOQkFHQVpRUUNBSUVFQXdDaEJBQUF5UVFCQVBFRUFJRWRCQU1CU1FRQUFYMEVBb0d0QkFHQmlRUUJBVlVFQWdFaEJBRUE4UVFDQU1FRUFvQ1ZCQUtBYlFRQ2dFa0VBNEFwQkFLQUVRUUFnQUVFQUlQdEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ2crVUFBb1BsQUFLRDVRQUFnKzBBQUlBQkJBS0FFUVFEZ0NrRUFvQkpCQUtBYlFRQ2dKVUVBZ0RCQkFFQThRUUNBU0VFQVFGVkJBR0JpUVFBQVdrRUFRRXhCQU9BK1FRQUFNa0VBb0NWQkFPQVpRUUFnRDBFQVFBVkJBR0Q1UUFDQTYwQUFRT0ZBQUVEYlFBQ2cyVUFBb05sQUFLRFpRQUNnMlVBQW9ObEFBS0RaUUFDZzJVQUFRTnRBQUVEaFFBQ0E2MEFBWVBsQUFFQUZRUUFnRDBFQTRCbEJBS0FsUVFBQU1rRUE0RDVCQUVCTVFRQUFXa0VBWUZKQkFFQkVRUUJBTmtFQXdDaEJBS0FiUVFBZ0QwRUFZQU5CQUNEeFFBQWcza0FBUU01QUFJRENRQUNndTBBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzdRQUNBd2tBQVFNNUFBQ0RlUUFBZzhVQUFZQU5CQUNBUFFRQ2dHMEVBd0NoQkFFQTJRUUJBUkVFQVlGSkJBT0JMUVFBZ1BVRUFvQzVCQUlBZ1FRQ2dFa0VBUUFWQkFDRHhRQUJnMlVBQUlNUkFBQUN5UUFCQXBFQUFBSnhBQUtDWlFBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFBQW5FQUFRS1JBQUFDeVFBQWd4RUFBWU5sQUFDRHhRQUJBQlVFQW9CSkJBSUFnUVFDZ0xrRUFJRDFCQU9CTFFRQmdSa0VBUURkQkFFQW9RUUJnR1VFQTRBcEJBR0Q1UUFBZzNrQUFJTVJBQUVDc1FBQmdsMEFBNElaQUFFQjVRQUJBYzBBQVFITkFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhsQUFPQ0dRQUJnbDBBQVFLeEFBQ0RFUUFBZzNrQUFZUGxBQU9BS1FRQmdHVUVBUUNoQkFFQTNRUUJnUmtFQUlFSkJBS0F5UVFBZ0kwRUE0Qk5CQUtBRVFRQ0E2MEFBUU01QUFBQ3lRQUJnbDBBQUlINUFBTUJWUUFCQU8wQUFRRE5BQUVBelFBQkFNMEFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUE3UUFEQVZVQUFJSDVBQUdDWFFBQUFza0FBUU01QUFJRHJRQUNnQkVFQTRCTkJBQ0FqUVFDZ01rRUFJRUpCQUFBL1FRQkFMMEVBZ0I5QkFNQVBRUUFnQUVFQVFPRkFBSURDUUFCQXBFQUE0SVpBQU1CVlFBRGdJMEFBd1A0L0FNRG1Qd0JnNWo4QVlPWS9BR0RtUHdCZzVqOEFZT1kvQU1EbVB3REEvajhBNENOQUFNQlZRQURnaGtBQVFLUkFBSURDUUFCQTRVQUFJQUJCQU1BUFFRQ0FIMEVBUUM5QkFBQS9RUUJBUFVFQVlDMUJBR0FkUVFDQURVRUFJUHRBQUVEYlFBQ2d1MEFBQUp4QUFFQjVRQUJBTzBBQXdQNC9BRUNWUHdCQVRqOEF3RXcvQU1CTVB3REFURDhBd0V3L0FNQk1Qd0JBVGo4QVFKVS9BTUQrUHdCQU8wQUFRSGxBQUFDY1FBQ2d1MEFBUU50QUFDRDdRQUNBRFVFQVlCMUJBR0F0UVFCQVBVRUF3RHhCQU1Bc1FRREFIRUVBd0F4QkFLRDVRQUNnMlVBQW9MbEFBS0NaUUFCQWMwQUFRRE5BQU1EbVB3QkFUajhBb0NpK0FHQzR2Z0JndUw0QVlMaStBR0M0dmdCZ3VMNEFvQ2krQUVCT1B3REE1ajhBUUROQUFFQnpRQUNnbVVBQW9MbEFBS0RaUUFDZytVQUF3QXhCQU1BY1FRREFMRUVBd0R4QkFNQThRUURBTEVFQXdCeEJBTUFNUVFDZytVQUFvTmxBQUtDNVFBQ2dtVUFBUUhOQUFFQXpRQUJnNWo4QXdFdy9BR0M0dmdEQW5yOEFRTE8vQUVDenZ3QkFzNzhBd0o2L0FHQzR2Z0RBVEQ4QVlPWS9BRUF6UUFCQWMwQUFvSmxBQUtDNVFBQ2cyVUFBb1BsQUFNQU1RUURBSEVFQXdDeEJBTUE4UVFEQVBFRUF3Q3hCQU1BY1FRREFERUVBb1BsQUFLRFpRQUNndVVBQW9KbEFBRUJ6UUFCQU0wQUFZT1kvQU1CTVB3Qmd1TDRBUUxPL0FHQVB3QUNnR2NBQVlBL0FBRUN6dndCZ3VMNEF3RXcvQUdEbVB3QkFNMEFBUUhOQUFLQ1pRQUNndVVBQW9ObEFBS0Q1UUFEQURFRUF3QnhCQU1Bc1FRREFQRUVBd0R4QkFNQXNRUURBSEVFQXdBeEJBS0Q1UUFDZzJVQUFvTGxBQUtDWlFBQkFjMEFBUUROQUFHRG1Qd0RBVEQ4QVlMaStBRUN6dndDZ0djQUFJRVhBQUtBWndBQkFzNzhBWUxpK0FNQk1Qd0JnNWo4QVFETkFBRUJ6UUFDZ21VQUFvTGxBQUtEWlFBQ2crVUFBd0F4QkFNQWNRUURBTEVFQXdEeEJBTUE4UVFEQUxFRUF3QnhCQU1BTVFRQ2crVUFBb05sQUFLQzVRQUNnbVVBQVFITkFBRUF6UUFCZzVqOEF3RXcvQUdDNHZnQkFzNzhBWUEvQUFLQVp3QUJnRDhBQVFMTy9BR0M0dmdEQVREOEFZT1kvQUVBelFBQkFjMEFBb0psQUFLQzVRQUNnMlVBQW9QbEFBTUFNUVFEQUhFRUF3Q3hCQU1BOFFRREFQRUVBd0N4QkFNQWNRUURBREVFQW9QbEFBS0RaUUFDZ3VVQUFvSmxBQUVCelFBQkFNMEFBWU9ZL0FNQk1Qd0JndUw0QXdKNi9BRUN6dndCQXM3OEFRTE8vQU1DZXZ3Qmd1TDRBd0V3L0FHRG1Qd0JBTTBBQVFITkFBS0NaUUFDZ3VVQUFvTmxBQUtENVFBREFERUVBd0J4QkFNQXNRUURBUEVFQXdEeEJBTUFzUVFEQUhFRUF3QXhCQUtENVFBQ2cyVUFBb0xsQUFLQ1pRQUJBYzBBQVFETkFBTURtUHdCQVRqOEFvQ2krQUdDNHZnQmd1TDRBWUxpK0FHQzR2Z0JndUw0QW9DaStBRUJPUHdEQTVqOEFRRE5BQUVCelFBQ2dtVUFBb0xsQUFLRFpRQUNnK1VBQXdBeEJBTUFjUVFEQUxFRUF3RHhCQUVBOVFRQmdMVUVBWUIxQkFJQU5RUUFnKzBBQVFOdEFBS0M3UUFBQW5FQUFRSGxBQUVBN1FBREEvajhBUUpVL0FFQk9Qd0RBVEQ4QXdFdy9BTUJNUHdEQVREOEF3RXcvQUVCT1B3QkFsVDhBd1A0L0FFQTdRQUJBZVVBQUFKeEFBS0M3UUFCQTIwQUFJUHRBQUlBTlFRQmdIVUVBWUMxQkFFQTlRUUFBUDBFQVFDOUJBSUFmUVFEQUQwRUFJQUJCQUVEaFFBQ0F3a0FBUUtSQUFPQ0dRQURBVlVBQTRDTkFBTUQrUHdEQTVqOEFZT1kvQUdEbVB3Qmc1ajhBWU9ZL0FHRG1Qd0RBNWo4QXdQNC9BT0FqUUFEQVZVQUE0SVpBQUVDa1FBQ0F3a0FBUU9GQUFDQUFRUURBRDBFQWdCOUJBRUF2UVFBQVAwRUFJRUpCQUtBeVFRQWdJMEVBNEJOQkFLQUVRUUNBNjBBQVFNNUFBQUN5UUFCZ2wwQUFJSDVBQU1CVlFBQkFPMEFBUUROQUFFQXpRQUJBTTBBQVFETkFBRUF6UUFCQU0wQUFRRE5BQUVBN1FBREFWVUFBSUg1QUFHQ1hRQUFBc2tBQVFNNUFBSURyUUFDZ0JFRUE0Qk5CQUNBalFRQ2dNa0VBSUVKQkFHQkdRUUJBTjBFQVFDaEJBR0FaUVFEZ0NrRUFZUGxBQUNEZVFBQWd4RUFBUUt4QUFHQ1hRQURnaGtBQVFIbEFBRUJ6UUFCQWMwQUFRSE5BQUVCelFBQkFjMEFBUUhOQUFFQnpRQUJBZVVBQTRJWkFBR0NYUUFCQXJFQUFJTVJBQUNEZVFBQmcrVUFBNEFwQkFHQVpRUUJBS0VFQVFEZEJBR0JHUVFEZ1MwRUFJRDFCQUtBdVFRQ0FJRUVBb0JKQkFFQUZRUUFnOFVBQVlObEFBQ0RFUUFBQXNrQUFRS1JBQUFDY1FBQ2dtVUFBb0psQUFLQ1pRQUNnbVVBQW9KbEFBS0NaUUFDZ21VQUFBSnhBQUVDa1FBQUFza0FBSU1SQUFHRFpRQUFnOFVBQVFBVkJBS0FTUVFDQUlFRUFvQzVCQUNBOVFRRGdTMEVBWUZKQkFFQkVRUUJBTmtFQXdDaEJBS0FiUVFBZ0QwRUFZQU5CQUNEeFFBQWcza0FBUU01QUFJRENRQUNndTBBQW9MbEFBS0M1UUFDZ3VVQUFvTGxBQUtDNVFBQ2d1VUFBb0xsQUFLQzdRQUNBd2tBQVFNNUFBQ0RlUUFBZzhVQUFZQU5CQUNBUFFRQ2dHMEVBd0NoQkFFQTJRUUJBUkVFQVlGSkJBQUJhUVFCQVRFRUE0RDVCQUFBeVFRQ2dKVUVBNEJsQkFDQVBRUUJBQlVFQVlQbEFBSURyUUFCQTRVQUFRTnRBQUtEWlFBQ2cyVUFBb05sQUFLRFpRQUNnMlVBQW9ObEFBS0RaUUFCQTIwQUFRT0ZBQUlEclFBQmcrVUFBUUFWQkFDQVBRUURnR1VFQW9DVkJBQUF5UVFEZ1BrRUFRRXhCQUFCYVFRQmdZa0VBUUZWQkFJQklRUUJBUEVFQWdEQkJBS0FsUVFDZ0cwRUFvQkpCQU9BS1FRQ2dCRUVBSUFCQkFDRDdRQUNnK1VBQW9QbEFBS0Q1UUFDZytVQUFvUGxBQUtENVFBQ2crVUFBSVB0QUFDQUFRUUNnQkVFQTRBcEJBS0FTUVFDZ0cwRUFvQ1ZCQUlBd1FRQkFQRUVBZ0VoQkFFQlZRUUJnWWtFQW9HdEJBQUJmUVFEQVVrRUFJRWRCQUVBOFFRQUFNa0VBd0NoQkFJQWdRUUJnR1VFQTRCTkJBTUFQUVFDQURVRUF3QXhCQU1BTVFRREFERUVBd0F4QkFNQU1RUURBREVFQXdBeEJBSUFOUVFEQUQwRUE0Qk5CQUdBWlFRQ0FJRUVBd0NoQkFBQXlRUUJBUEVFQUlFZEJBTUJTUVFBQVgwRUFvR3RCQUlCMVFRQmdhVUVBd0YxQkFNQlNRUUNBU0VFQTRENUJBRUEyUVFDZ0xrRUFRQ2hCQUNBalFRQ0FIMEVBWUIxQkFNQWNRUURBSEVFQXdCeEJBTUFjUVFEQUhFRUF3QnhCQU1BY1FRQmdIVUVBZ0I5QkFDQWpRUUJBS0VFQW9DNUJBRUEyUVFEZ1BrRUFnRWhCQU1CU1FRREFYVUVBWUdsQkFJQjFRUUFBZ0VFQVlIUkJBR0JwUVFBQVgwRUFRRlZCQUVCTVFRQkFSRUVBSUQxQkFFQTNRUUNnTWtFQVFDOUJBR0F0UVFEQUxFRUF3Q3hCQU1Bc1FRREFMRUVBd0N4QkFNQXNRUURBTEVFQVlDMUJBRUF2UVFDZ01rRUFRRGRCQUNBOVFRQkFSRUVBUUV4QkFFQlZRUUFBWDBFQVlHbEJBR0IwUVFBQWdFRUFnSVZCQUFDQVFRQ0FkVUVBb0d0QkFHQmlRUUFBV2tFQVlGSkJBT0JMUVFCZ1JrRUFJRUpCQUFBL1FRQkFQVUVBd0R4QkFNQThRUURBUEVFQXdEeEJBTUE4UVFEQVBFRUF3RHhCQUVBOVFRQUFQMEVBSUVKQkFHQkdRUURnUzBFQVlGSkJBQUJhUVFCZ1lrRUFvR3RCQUlCMVFRQUFnRUVBZ0lWQjF4ZjAvZFE5OVAzVVBkY1hEaTJ5UFFBQUFBQ2xabUZqWlhQSEdCWUFBQUFBQVFBQUFBSUFBQUFBQUFBQUFnQUFBQU1BQUFDa2RYVnBaTE14TWpFMk9UVXpOalF5T1RZMk1qVTNNVEkxclhabGNuUmxlRjl6YjNWeVkyWGFKbG9LY0hKbFkybHphVzl1SUdocFoyaHdJR2x1ZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqTkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl6UkRzS0x5OGdkbVZ5ZEdWNElHbHVjSFYwY3pvZ0NtbHVJSFpsWXpJZ2NHOXphWFJwYjI0N0NuWmxZeklnWjJWMFgzQnZjMmwwYVc5dUtDbDdjbVYwZFhKdUlIQnZjMmwwYVc5dU8zMEthVzRnZG1Wak1pQjFkanNLZG1Wak1pQm5aWFJmZFhZb0tYdHlaWFIxY200Z2RYWTdmUW9LTHk4Z1ZXNXBabTl5YlhNNklBcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNtMWhjRHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNtMWhjQ2dwZTNKbGRIVnliaUIxYm1sbWIzSnRYMk52Ykc5eWJXRndPMzBLZFc1cFptOXliU0IxYVc1MElHOWlhbVZqZEY5cFpEc0tkV2x1ZENCblpYUmZiMkpxWldOMFgybGtLQ2w3Y21WMGRYSnVJRzlpYW1WamRGOXBaRHQ5Q25WdWFXWnZjbTBnYldGME5DQnRiMlJsYkY5bU16SmpPd3B0WVhRMElHZGxkRjl0YjJSbGJGOW1NekpqS0NsN2NtVjBkWEp1SUcxdlpHVnNYMll6TW1NN2ZRcDFibWxtYjNKdElHbHVkQ0J6WkdaZmJXRnlhMlZ5WDNOb1lYQmxPd3BwYm5RZ1oyVjBYM05rWmw5dFlYSnJaWEpmYzJoaGNHVW9LWHR5WlhSMWNtNGdjMlJtWDIxaGNtdGxjbDl6YUdGd1pUdDlDblZ1YVdadmNtMGdabXh2WVhRZ1oyeHZkM2RwWkhSb093cG1iRzloZENCblpYUmZaMnh2ZDNkcFpIUm9LQ2w3Y21WMGRYSnVJR2RzYjNkM2FXUjBhRHQ5Q25WdWFXWnZjbTBnWm14dllYUWdZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxPd3BtYkc5aGRDQm5aWFJmWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsS0NsN2NtVjBkWEp1SUdGMGJHRnpYM1JsZUhSMWNtVmZjMmw2WlR0OUNuVnVhV1p2Y20wZ1ltOXZiQ0J3WVhSMFpYSnVPd3BpYjI5c0lHZGxkRjl3WVhSMFpYSnVLQ2w3Y21WMGRYSnVJSEJoZEhSbGNtNDdmUXAxYm1sbWIzSnRJR0p2YjJ3Z2NHbGphMmx1WnpzS1ltOXZiQ0JuWlhSZmNHbGphMmx1WnlncGUzSmxkSFZ5YmlCd2FXTnJhVzVuTzMwS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aVHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsS0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnY0hoZmNHVnlYM1Z1YVhRN0NtWnNiMkYwSUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwZTNKbGRIVnliaUJ3ZUY5d1pYSmZkVzVwZER0OUNuVnVhV1p2Y20wZ2MyRnRjR3hsY2pKRUlHUnBjM1JoYm1ObFptbGxiR1E3Q25WdWFXWnZjbTBnZG1Wak5DQnVZVzVmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMjVoYmw5amIyeHZjaWdwZTNKbGRIVnliaUJ1WVc1ZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdac2IyRjBJSE4wY205clpYZHBaSFJvT3dwbWJHOWhkQ0JuWlhSZmMzUnliMnRsZDJsa2RHZ29LWHR5WlhSMWNtNGdjM1J5YjJ0bGQybGtkR2c3ZlFwMWJtbG1iM0p0SUhabFl6TWdaak15WTE5elkyRnNaVHNLZG1Wak15Qm5aWFJmWmpNeVkxOXpZMkZzWlNncGUzSmxkSFZ5YmlCbU16SmpYM05qWVd4bE8zMEtkVzVwWm05eWJTQjJaV015SUhKbGMyOXNkWFJwYjI0N0NuWmxZeklnWjJWMFgzSmxjMjlzZFhScGIyNG9LWHR5WlhSMWNtNGdjbVZ6YjJ4MWRHbHZianQ5Q25WdWFXWnZjbTBnWm14dllYUWdaR1Z3ZEdoZmMyaHBablE3Q21ac2IyRjBJR2RsZEY5a1pYQjBhRjl6YUdsbWRDZ3BlM0psZEhWeWJpQmtaWEIwYUY5emFHbG1kRHQ5Q25WdWFXWnZjbTBnZG1Wak5DQnNiM2RqYkdsd1gyTnZiRzl5T3dwMlpXTTBJR2RsZEY5c2IzZGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR3h2ZDJOc2FYQmZZMjlzYjNJN2ZRcDFibWxtYjNKdElHSnZiMndnWW1sc2JHSnZZWEprT3dwaWIyOXNJR2RsZEY5aWFXeHNZbTloY21Rb0tYdHlaWFIxY200Z1ltbHNiR0p2WVhKa08zMEtkVzVwWm05eWJTQnRZWFEwSUhCeVpYQnliMnBsWTNScGIyNDdDbTFoZERRZ1oyVjBYM0J5WlhCeWIycGxZM1JwYjI0b0tYdHlaWFIxY200Z2NISmxjSEp2YW1WamRHbHZianQ5Q25WdWFXWnZjbTBnWW05dmJDQjFibWxtYjNKdFgyTnZiRzl5T3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXlLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnYUdsbmFHTnNhWEJmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMmhwWjJoamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHaHBaMmhqYkdsd1gyTnZiRzl5TzMwS2RXNXBabTl5YlNCMlpXTTBJR2RzYjNkamIyeHZjanNLZG1Wak5DQm5aWFJmWjJ4dmQyTnZiRzl5S0NsN2NtVjBkWEp1SUdkc2IzZGpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IwY21GdWMyWnZjbTFmYldGeWEyVnlPd3BpYjI5c0lHZGxkRjkwY21GdWMyWnZjbTFmYldGeWEyVnlLQ2w3Y21WMGRYSnVJSFJ5WVc1elptOXliVjl0WVhKclpYSTdmUW9LQ2dvS0x5OGdVR1Z5SUdsdWMzUmhibU5sSUdGMGRISnBZblYwWlhNNklBcHBiaUIyWldNMElITmtabDkxZGpzS2RtVmpOQ0JuWlhSZmMyUm1YM1YyS0NsN2NtVjBkWEp1SUhOa1psOTFkanQ5Q21sdUlIWmxZelFnZG1WeWRHVjRYMk52Ykc5eU93cDJaV00wSUdkbGRGOTJaWEowWlhoZlkyOXNiM0lvS1h0eVpYUjFjbTRnZG1WeWRHVjRYMk52Ykc5eU8zMEthVzRnZG1Wak1pQnhkV0ZrWDI5bVpuTmxkRHNLZG1Wak1pQm5aWFJmY1hWaFpGOXZabVp6WlhRb0tYdHlaWFIxY200Z2NYVmhaRjl2Wm1aelpYUTdmUXBwYmlCMlpXTXlJSEYxWVdSZmMyTmhiR1U3Q25abFl6SWdaMlYwWDNGMVlXUmZjMk5oYkdVb0tYdHlaWFIxY200Z2NYVmhaRjl6WTJGc1pUdDlDbWx1SUhabFl6UWdZMjl1ZG1WeWRHVmtYM04wY205clpXTnZiRzl5T3dwMlpXTTBJR2RsZEY5amIyNTJaWEowWldSZmMzUnliMnRsWTI5c2IzSW9LWHR5WlhSMWNtNGdZMjl1ZG1WeWRHVmtYM04wY205clpXTnZiRzl5TzMwS2FXNGdkbVZqTWlCM1oyeGZjRzl6YVhScGIyNXpPd3AyWldNeUlHZGxkRjkzWjJ4ZmNHOXphWFJwYjI1ektDbDdjbVYwZFhKdUlIZG5iRjl3YjNOcGRHbHZibk03ZlFwcGJpQjJaV00wSUdOdmJuWmxjblJsWkY5eWIzUmhkR2x2YmpzS2RtVmpOQ0JuWlhSZlkyOXVkbVZ5ZEdWa1gzSnZkR0YwYVc5dUtDbDdjbVYwZFhKdUlHTnZiblpsY25SbFpGOXliM1JoZEdsdmJqdDlDbWx1SUhabFl6TWdiV0Z5YTJWeVgyOW1abk5sZERzS2RtVmpNeUJuWlhSZmJXRnlhMlZ5WDI5bVpuTmxkQ2dwZTNKbGRIVnliaUJ0WVhKclpYSmZiMlptYzJWME8zMEtDbkJ5WldOcGMybHZiaUJvYVdkb2NDQm1iRzloZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tDblZ1YVdadmNtMGdiV0YwTkNCd2NtOXFaV04wYVc5dU93cDFibWxtYjNKdElHMWhkRFFnZG1sbGR6c0tkVzVwWm05eWJTQnBiblFnZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTTdDblZ1YVdadmNtMGdkbVZqTkNCMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weld6aGRPd29LZFc1cFptOXliU0JtYkc5aGRDQmhkR3hoYzE5MFpYaGZaR2x0T3dvS2IzVjBJSFpsWXpRZ1puSmhaMTlqYjJ4dmNqc0tiM1YwSUhabFl6SWdabkpoWjE5MWRqc0tiM1YwSUdac2IyRjBJR1p5WVdkZmRYWnpZMkZzWlRzS2IzVjBJR1pzYjJGMElHWnlZV2RmWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlRzS2IzVjBJSFpsWXpRZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZzdDbTkxZENCbWJHOWhkQ0J2WDJOc2FYQmZaR2x6ZEdGdVkyVmJPRjA3Q21ac1lYUWdiM1YwSUhabFl6UWdabkpoWjE5emRISnZhMlZqYjJ4dmNqc0tDbVpzWVhRZ2IzVjBJSFZwYm5RZ1puSmhaMTlwYm5OMFlXNWpaVjlwWkRzS1pteGhkQ0J2ZFhRZ2RtVmpNaUJtWDNOd2NtbDBaVjl6WTJGc1pUc0tDaU5rWldacGJtVWdRVTVVU1VGTVNVRlRYMUpCUkVsVlV5QXdMamdLQ2dwdFlYUTBJSEZ0WVhRb2RtVmpOQ0J4ZFdGMEtYc0tJQ0FnSUdac2IyRjBJRzUxYlNBOUlIRjFZWFF1ZUNBcUlESXVNRHNLSUNBZ0lHWnNiMkYwSUc1MWJUSWdQU0J4ZFdGMExua2dLaUF5TGpBN0NpQWdJQ0JtYkc5aGRDQnVkVzB6SUQwZ2NYVmhkQzU2SUNvZ01pNHdPd29nSUNBZ1pteHZZWFFnYm5WdE5DQTlJSEYxWVhRdWVDQXFJRzUxYlRzS0lDQWdJR1pzYjJGMElHNTFiVFVnUFNCeGRXRjBMbmtnS2lCdWRXMHlPd29nSUNBZ1pteHZZWFFnYm5WdE5pQTlJSEYxWVhRdWVpQXFJRzUxYlRNN0NpQWdJQ0JtYkc5aGRDQnVkVzAzSUQwZ2NYVmhkQzU0SUNvZ2JuVnRNanNLSUNBZ0lHWnNiMkYwSUc1MWJUZ2dQU0J4ZFdGMExuZ2dLaUJ1ZFcwek93b2dJQ0FnWm14dllYUWdiblZ0T1NBOUlIRjFZWFF1ZVNBcUlHNTFiVE03Q2lBZ0lDQm1iRzloZENCdWRXMHhNQ0E5SUhGMVlYUXVkeUFxSUc1MWJUc0tJQ0FnSUdac2IyRjBJRzUxYlRFeElEMGdjWFZoZEM1M0lDb2diblZ0TWpzS0lDQWdJR1pzYjJGMElHNTFiVEV5SUQwZ2NYVmhkQzUzSUNvZ2JuVnRNenNLSUNBZ0lISmxkSFZ5YmlCdFlYUTBLQW9nSUNBZ0lDQWdJQ2d4TGpBZ0xTQW9iblZ0TlNBcklHNTFiVFlwS1N3Z0tHNTFiVGNnS3lCdWRXMHhNaWtzSUNBZ0lDQWdJQ0FvYm5WdE9DQXRJRzUxYlRFeEtTd2dJQ0FnSUNBZ0lEQXVNQ3dLSUNBZ0lDQWdJQ0FvYm5WdE55QXRJRzUxYlRFeUtTd2dJQ0FnSUNBZ0lDZ3hMakFnTFNBb2JuVnROQ0FySUc1MWJUWXBLU3dnS0c1MWJUa2dLeUJ1ZFcweE1Da3NJQ0FnSUNBZ0lDQXdMakFzQ2lBZ0lDQWdJQ0FnS0c1MWJUZ2dLeUJ1ZFcweE1Ta3NJQ0FnSUNBZ0lDQW9iblZ0T1NBdElHNTFiVEV3S1N3Z0lDQWdJQ0FnSUNneExqQWdMU0FvYm5WdE5DQXJJRzUxYlRVcEtTd2dNQzR3TEFvZ0lDQWdJQ0FnSURBdU1Dd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBd0xqQXNJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJREV1TUFvZ0lDQWdLVHNLZlFvS1pteHZZWFFnWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlNncGV3b2dJQ0FnTHk4Z1IyeDVjR2dnWkdsemRHRnVZMlVnWm1sbGJHUWdkVzVwZEhNZ1lYSmxJR2x1SUhCcGVHVnNjenNnWTI5dWRtVnlkQ0IwYnlCa2FXMWxibk5wYjI1c1pYTnpDaUFnSUNBdkx5QjRMV052YjNKa2FXNWhkR1VnYjJZZ2RHVjRkSFZ5WlNCcGJuTjBaV0ZrSUdadmNpQmpiMjV6YVhOMFpXNWplU0IzYVhSb0lIQnliMmR5WVcxdFlYUnBZeUIxZGdvZ0lDQWdMeThnWkdsemRHRnVZMlVnWm1sbGJHUnpJR2x1SUdaeVlXZHRaVzUwSUhOb1lXUmxjaTRnVTJWbElHRnNjMjhnWTI5dGJXVnVkSE1nWW1Wc2IzY3VDaUFnSUNCMlpXTTBJSFYyWDNKbFkzUWdQU0JuWlhSZmMyUm1YM1YyS0NrN0NpQWdJQ0JtYkc5aGRDQndhWGh6YVhwbFgzZ2dQU0FvZFhaZmNtVmpkQzU2SUMwZ2RYWmZjbVZqZEM1NEtTQXFJR2RsZEY5aGRHeGhjMTkwWlhoMGRYSmxYM05wZW1Vb0tUc0tJQ0FnSUhKbGRIVnliaUF0TVM0d0wzQnBlSE5wZW1WZmVEc0tmUW9LZG1Wak15QjBiM1psWXpNb2RtVmpNaUIyS1h0eVpYUjFjbTRnZG1Wak15aDJMQ0F3TGpBcE8zMEtkbVZqTXlCMGIzWmxZek1vZG1Wak15QjJLWHR5WlhSMWNtNGdkanQ5Q2dwMlpXTTBJSFJ2ZG1Wak5DaDJaV016SUhZcGUzSmxkSFZ5YmlCMlpXTTBLSFlzSURFdU1DazdmUXAyWldNMElIUnZkbVZqTkNoMlpXTTBJSFlwZTNKbGRIVnliaUIyTzMwS2RtVmpOQ0IwYjNabFl6UW9ZbTl2YkNCMktTQjdDaUFnSUNCeVpYUjFjbTRnZG1Wak5DZ3dMakFwT3dwOUNncHRZWFF5SUdScFlXZHRLSFpsWXpJZ2RpbDdDaUFnSUNCeVpYUjFjbTRnYldGME1paDJMbmdzSURBdU1Dd2dNQzR3TENCMkxua3BPd3A5Q2dwbWJHOWhkQ0JmWkdWMFpYSnRhVzVoYm5Rb2JXRjBNaUJ0S1NCN0NpQWdjbVYwZFhKdUlHMWJNRjFiTUYwZ0tpQnRXekZkV3pGZElDMGdiVnN3WFZzeFhTQXFJRzFiTVYxYk1GMDdDbjBLQ25admFXUWdjSEp2WTJWemMxOWpiR2x3WDNCc1lXNWxjeWgyWldNeklIZHZjbXhrWDNCdmN5a2dld29nSUNBZ1ptOXlJQ2hwYm5RZ2FTQTlJREE3SUdrZ1BDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzZ2FTc3JLUW9nSUNBZ0lDQWdJRzlmWTJ4cGNGOWthWE4wWVc1alpWdHBYU0E5SUdSdmRDaDNiM0pzWkY5d2IzTXNJSFZ1YVdadmNtMWZZMnhwY0Y5d2JHRnVaWE5iYVYwdWVIbDZLU0F0SUhWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhOYmFWMHVkenNLZlFvS2RtOXBaQ0J0WVdsdUtDbDdDaUFnSUNBdkx5Qm5aWFJmY0c5ektDa2djbVYwZFhKdWN5QjBhR1VnY0c5emFYUnBiMjRnYjJZZ2RHaGxJSE5qWVhSMFpYSWdiV0Z5YTJWeUNpQWdJQ0F2THlCblpYUmZjRzl6YVhScGIyNG9LU0J5WlhSMWNtNXpJSFJvWlNBb2NtVnNZWFJwZG1VcElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCamRYSnlaVzUwSUhGMVlXUWdkbVZ5ZEdWNENnb2dJQ0FnZG1Wak15Qm1NekpqWDNOallXeGxJRDBnWjJWMFgyWXpNbU5mYzJOaGJHVW9LVHNLSUNBZ0lIWmxZeklnYlhNZ1BTQm1NekpqWDNOallXeGxMbmg1SUNvZ1oyVjBYM0YxWVdSZmMyTmhiR1VvS1RzS0lDQWdJSFpsWXpJZ2NYVmhaRjl2Wm1aelpYUWdQU0JtTXpKalgzTmpZV3hsTG5oNUlDb2daMlYwWDNGMVlXUmZiMlptYzJWMEtDazdDaUFnSUNCMlpXTXpJRzFoY210bGNsOXZabVp6WlhRZ1BTQm1NekpqWDNOallXeGxJQ29nZEc5MlpXTXpLR2RsZEY5dFlYSnJaWEpmYjJabWMyVjBLQ2twT3dvS0lDQWdJSFpsWXpJZ1ltSnZlRjl5WVdScGRYTWdQU0F3TGpVZ0tpQnRjenNLSUNBZ0lIWmxZeklnYzNCeWFYUmxYMkppYjNoZlkyVnVkSEpsSUQwZ2NYVmhaRjl2Wm1aelpYUWdLeUJpWW05NFgzSmhaR2wxY3pzS0lDQWdJR1pmYzNCeWFYUmxYM05qWVd4bElEMGdiWE03Q2lBZ0lDQnRZWFEwSUhCMmFXVjNJRDBnY0hKdmFtVmpkR2x2YmlBcUlIWnBaWGM3Q2lBZ0lDQnRZWFEwSUhSeVlXNXpJRDBnWjJWMFgzUnlZVzV6Wm05eWJWOXRZWEpyWlhJb0tTQS9JRzF2WkdWc1gyWXpNbU1nT2lCdFlYUTBLREV1TUNrN0Nnb2dJQ0FnZG1Wak5DQndiM05wZEdsdmJsOTNiM0pzWkNBOUlHMXZaR1ZzWDJZek1tTWdLaUIyWldNMEtIUnZkbVZqTXloblpYUmZkMmRzWDNCdmMybDBhVzl1Y3lncEtTd2dNU2s3Q2lBZ0lDQndjbTlqWlhOelgyTnNhWEJmY0d4aGJtVnpLSEJ2YzJsMGFXOXVYM2R2Y214a0xuaDVlaWs3Q2dvZ0lDQWdMeThnUTI5dGNIVjBaU0JqWlc1MGNtVWdiMllnWW1sc2JHSnZZWEprSUdsdUlHTnNhWEJ3YVc1bklHTnZiM0prYVc1aGRHVnpDaUFnSUNBdkx5QkJiSGRoZVhNZ2RISmhibk5tYjNKdElIUmxlSFF2YzJOaGRIUmxjaUJ3YjNOcGRHbHZiaUJoY21kMWJXVnVkQW9nSUNBZ2RtVmpOQ0JrWVhSaFgzQnZhVzUwSUQwZ1oyVjBYM0J5WlhCeWIycGxZM1JwYjI0b0tTQXFJSEJ2YzJsMGFXOXVYM2R2Y214a093b2dJQ0FnTHk4Z2JXRjVZbVVnZEhKaGJuTm1iM0p0SUcxaGNtdGxjbDl2Wm1aelpYUWdLeUJuYkhsd2FDQnZabVp6WlhSekNpQWdJQ0JrWVhSaFgzQnZhVzUwSUQwZ2RtVmpOQ2hrWVhSaFgzQnZhVzUwTG5oNWVpQXZJR1JoZEdGZmNHOXBiblF1ZHlBcklHMWhkRE1vZEhKaGJuTXBJQ29nYldGeWEyVnlYMjltWm5ObGRDd2dNU2s3Q2lBZ0lDQmtZWFJoWDNCdmFXNTBJRDBnY0hacFpYY2dLaUJrWVhSaFgzQnZhVzUwT3dvS0lDQWdJQzh2SUVOdmJYQjFkR1VnZEhKaGJuTm1iM0p0SUdadmNpQjBhR1VnYjJabWMyVjBJSFpsWTNSdmNuTWdabkp2YlNCMGFHVWdZMlZ1ZEhKaGJDQndiMmx1ZEFvZ0lDQWdkSEpoYm5NZ1BTQW9aMlYwWDJKcGJHeGliMkZ5WkNncElEOGdjSEp2YW1WamRHbHZiaUE2SUhCMmFXVjNLU0FxSUhGdFlYUW9aMlYwWDJOdmJuWmxjblJsWkY5eWIzUmhkR2x2YmlncEtTQXFJSFJ5WVc1ek93b2dJQ0FnZG1Wak5DQnpjSEpwZEdWZlkyVnVkR1Z5SUQwZ2RISmhibk1nS2lCMlpXTTBLSE53Y21sMFpWOWlZbTk0WDJObGJuUnlaU3dnTUN3Z01DazdDZ29nSUNBZ2RtVmpOQ0IyWTJ4cGNDQTlJR1JoZEdGZmNHOXBiblFnS3lCemNISnBkR1ZmWTJWdWRHVnlPd29LSUNBZ0lDOHZJRVY0ZEhKaElHSjFabVpsY21sdVp5QnBjeUJ5WlhGMWFYSmxaQ0JoY205MWJtUWdjM0J5YVhSbGN5QjNhR2xqYUNCaGNtVWdZVzUwYVdGc2FXRnpaV1FnYzI4Z2RHaGhkQW9nSUNBZ0x5OGdkR2hsSUdGdWRHbGhiR2xoY3lCaWJIVnlJR1J2WlhOdUozUWdaMlYwSUdOMWRDQnZabVlnS0hObFpTQWpNVFVwTGlCVWFHbHpJR0pzZFhJZ1ptRnNiSE1nZEc4S0lDQWdJQzh2SUhwbGNtOGdZWFFnWVNCeVlXUnBkWE1nYjJZZ1FVNVVTVUZNU1VGVFgxSkJSRWxWVXlCd2FYaGxiSE1nYVc0Z2RHaGxJSFpwWlhkd2IzSjBJR052YjNKa2FXNWhkR1Z6Q2lBZ0lDQXZMeUJoYm1RZ2QyVWdkMkZ1ZENCMGJ5QmlkV1ptWlhJZ2RHaGxJSFpsY25ScFkyVnpJR2x1SUhSb1pTQXFjMjkxY21ObEtpQnpjSEpwZEdVZ1kyOXZjbVJwYm1GMFpRb2dJQ0FnTHk4Z2MzbHpkR1Z0SUhOdklIUm9ZWFFnZDJVZ1oyVjBJSFJvYVhNZ1lXMXZkVzUwSUdsdUlIUm9aU0J2ZFhSd2RYUWdZMjl2Y21ScGJtRjBaWE11Q2lBZ0lDQXZMd29nSUNBZ0x5OGdTR1Z5WlNCM1pTQmpZV3hqZFd4aGRHVWdkR2hsSUdSbGNtbDJZWFJwZG1VZ2IyWWdkR2hsSUcxaGNIQnBibWNnWm5KdmJTQnpjSEpwZEdVZ2VIa0tJQ0FnSUM4dklHTnZiM0prYVc1aGRHVnpJQ2hrWldacGJtVmtJR0o1SUdCMGNtRnVjMkFwSUdsdWRHOGdkR2hsSUhacFpYZHdiM0owSUhCcGVHVnNJR052YjNKa2FXNWhkR1Z6TGdvZ0lDQWdMeThnVkdobElHUmxjbWwyWVhScGRtVWdibVZsWkhNZ2RHOGdhVzVqYkhWa1pTQjBhR1VnY0hKdmNHVnlJSFJsY20wZ1ptOXlJSFJvWlNCd1pYSnpjR1ZqZEdsMlpRb2dJQ0FnTHk4Z1pHbDJhV1JsSUdsdWRHOGdUa1JETENCbGRtRnNkV0YwWldRZ1lYUWdkR2hsSUdObGJuUnlaU0J3YjJsdWRDQmdkbU5zYVhCZ0xnb2dJQ0FnYldGME5DQmtYMjVrWTE5a1gyTnNhWEFnUFNCdFlYUTBLQW9nSUNBZ0lDQWdJREV1TUM5MlkyeHBjQzUzTENBd0xqQXNJQ0FnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSURBdU1Dd0tJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnTVM0d0wzWmpiR2x3TG5jc0lEQXVNQ3dnSUNBZ0lDQWdJQ0F3TGpBc0NpQWdJQ0FnSUNBZ01DNHdMQ0FnSUNBZ0lDQWdJREF1TUN3Z0lDQWdJQ0FnSUNBeExqQXZkbU5zYVhBdWR5d2dNQzR3TEFvZ0lDQWdJQ0FnSUMxMlkyeHBjQzU0ZVhvdktIWmpiR2x3TG5jcWRtTnNhWEF1ZHlrc0lDQWdJQ0FnSUNBZ0lEQXVNQW9nSUNBZ0tUc0tJQ0FnSUcxaGRESWdaSGg1ZGw5a2VIbHpJRDBnWkdsaFoyMG9NQzQxSUNvZ2NIaGZjR1Z5WDNWdWFYUWdLaUJuWlhSZmNtVnpiMngxZEdsdmJpZ3BLU0FxSUcxaGRESW9aRjl1WkdOZlpGOWpiR2x3S25SeVlXNXpLVHNLSUNBZ0lDOHZJRTV2ZHl3Z2IzVnlJR0oxWm1abGNpQnphWHBsSUdseklHVjRjSEpsYzNObFpDQnBiaUIyYVdWM2NHOXlkQ0J3YVhobGJITWdZblYwSUhkbElHZGxkQ0JpWVdOcklIUnZDaUFnSUNBdkx5QjBhR1VnYzNCeWFYUmxJR052YjNKa2FXNWhkR1VnYzNsemRHVnRJSFZ6YVc1bklIUm9aU0J6WTJGc1pTQm1ZV04wYjNJZ2IyWWdkR2hsQ2lBZ0lDQXZMeUIwY21GdWMyWnZjbTFoZEdsdmJpQW9abTl5SUdsemIzUnliM0JwWXlCMGNtRnVjMlp2Y20xaGRHbHZibk1wTGlCR2IzSWdZVzVwYzI5MGNtOXdhV01LSUNBZ0lDOHZJSFJ5WVc1elptOXliV0YwYVc5dWN5d2dkR2hsSUdkbGIyMWxkSEpwWXlCdFpXRnVJRzltSUhSb1pTQjBkMjhnY0hKcGJtTnBjR3hsSUhOallXeGxJR1poWTNSdmNuTUtJQ0FnSUM4dklHbHpJR0VnY21WaGMyOXVZV0pzWlNCamIyMXdjbTl0YVhObE9nb2dJQ0FnWm14dllYUWdkbWxsZDNCdmNuUmZabkp2YlY5emNISnBkR1ZmYzJOaGJHVWdQU0J6Y1hKMEtHRmljeWhmWkdWMFpYSnRhVzVoYm5Rb1pIaDVkbDlrZUhsektTa3BPd29LSUNBZ0lDOHZJRWx1SUhSb1pTQm1jbUZuYldWdWRDQnphR0ZrWlhJZ2QyVWdkMkZ1ZENCdmRYSWdjMmxuYm1Wa0lHUnBjM1JoYm1ObElHbHVJSFpwWlhkd2IzSjBJQ2h3YVhobGJDa0tJQ0FnSUM4dklHTnZiM0prY3lCbWIzSWdaR2x5WldOMElIVnpaU0JwYmlCaGJuUnBZV3hwWVhOcGJtY2djM1JsY0NCbWRXNWpkR2x2Ym5NdUlGZGxJSFJvWlhKbFptOXlaU0J1WldWa0NpQWdJQ0F2THlCaElITmpZV3hwYm1jZ1ptRmpkRzl5SUhOcGJXbHNZWElnZEc4Z2RtbGxkM0J2Y25SZlpuSnZiVjl6Y0hKcGRHVmZjMk5oYkdVc0lHSjFkQ0JwYm1Oc2RXUnBibWNLSUNBZ0lDOHZJSFJvWlNCMWRpMCtjM0J5YVhSbElHTnZiM0prYVc1aGRHVWdjM2x6ZEdWdElITmpZV3hwYm1jZ1ptRmpkRzl5SUdGeklIZGxiR3d1SUNCWFpTQmphRzl2YzJVZ2RHOEtJQ0FnSUM4dklIVnpaU0IwYUdVZ1ltOTFibVJwYm1jZ1ltOTRJQ3A0S2lCM2FXUjBhQ0JtYjNJZ2RHaHBjeTRnVkdocGN5QmpiMjFsY3lCM2FYUm9JSE52YldVS0lDQWdJQzh2SUdOdmJuTnBjM1JsYm1ONUlHTnZibVJwZEdsdmJuTTZDaUFnSUNBdkx5QXFJRVp2Y2lCd2NtOWpaV1IxY21Gc0lHUnBjM1JoYm1ObElHWnBaV3hrY3l3Z2QyVWdibVZsWkNCMGFHVWdjM0J5YVhSbElHSnZkVzVrYVc1bklHSnZlQ0IwYnlCaVpRb2dJQ0FnTHk4Z0lDQnpjWFZoY21VdUlDaEpaaUJ1YjNRc0lIUm9aU0IxZGlCamIyOXlaR2x1WVhSbGN5QjNhV3hzSUdKbElHRnVhWE52ZEhKdmNHbGpZV3hzZVNCelkyRnNaV1FnWVc1a0NpQWdJQ0F2THlBZ0lHRnVlU0JqWVd4amRXeGhkR2x2YmlCaVlYTmxaQ0J2YmlCMGFHVnRJSGRwYkd3Z2JtOTBJR0psSUdFZ1pHbHpkR0Z1WTJVZ1puVnVZM1JwYjI0dUtRb2dJQ0FnTHk4Z0tpQkdiM0lnYzJGdGNHeGxaQ0JrYVhOMFlXNWpaU0JtYVdWc1pITXNJSGRsSUc1bFpXUWdkRzhnWTI5dWMybHpkR1Z1ZEd4NUlHTm9iMjl6WlNCMGFHVWdLbmdxQ2lBZ0lDQXZMeUFnSUdadmNpQjBhR1VnYzJOaGJHbHVaeUJwYmlCblpYUmZaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaU2dwTGdvZ0lDQWdabXh2WVhRZ2MzQnlhWFJsWDJaeWIyMWZkVjl6WTJGc1pTQTlJRzFwYmloaFluTW9iWE11ZUNrc0lHRmljeWh0Y3k1NUtTazdDaUFnSUNCbWNtRm5YM1YyYzJOaGJHVWdQU0IyYVdWM2NHOXlkRjltY205dFgzTndjbWwwWlY5elkyRnNaU0FxSUhOd2NtbDBaVjltY205dFgzVmZjMk5oYkdVN0NpQWdJQ0JtY21GblgyUnBjM1JoYm1ObFptbGxiR1JmYzJOaGJHVWdQU0JrYVhOMFlXNWpaV1pwWld4a1gzTmpZV3hsS0NrN0Nnb2dJQ0FnTHk4Z1lXUmtJSEJoWkdScGJtY2dabTl5SUVGQkxDQnpkSEp2YTJVZ1lXNWtJR2RzYjNjZ0tHNXZiaUJ1WVhScGRtVWdaR2x6ZEdGdVkyVm1hV1ZzWkhNZ1pHOXVKM1FnYm1WbFpBb2dJQ0FnTHk4Z1FVRWdjR0ZrWkdsdVp5QmlkWFFnUTBsU1EweEZJR1YwWXlCa2J5a0tJQ0FnSUdac2IyRjBJSEJ3ZFNBOUlHZGxkRjl3ZUY5d1pYSmZkVzVwZENncE93b2dJQ0FnWm14dllYUWdZbUp2ZUY5aWRXWWdQU0FvQ2lBZ0lDQWdJQ0FnUVU1VVNVRk1TVUZUWDFKQlJFbFZVeUFySUcxaGVDZ3dMakFzSUdkbGRGOXpkSEp2YTJWM2FXUjBhQ2dwSUNvZ2NIQjFLU0FySUcxaGVDZ3dMakFzSUdkbGRGOW5iRzkzZDJsa2RHZ29LU0FxSUhCd2RTa0tJQ0FnSUNrZ0x5QjJhV1YzY0c5eWRGOW1jbTl0WDNOd2NtbDBaVjl6WTJGc1pUc0tJQ0FnSUM4dklFMTFiSFJwY0d4NUlIUm9aU0JpZFdabVpYSWdZbmtnYzJsbmJpaGlZbTk0WDNKaFpHbDFjeWtnYzI4Z2RHaGhkQ0J0WVhKclpYSnphWHBsSUQwOUlEQWdZMnhsWVc1c2VRb2dJQ0FnTHk4Z1kyOXNiR0Z3YzJWeklIUm9aU0J3WVdSa1pXUWdZbUp2ZUNCMGJ5QjZaWEp2SUNnd0trbHVaaUE5UFNCT1lVNGdjSEp2Y0dGbllYUmxjeUIwYnlCbmJGOVFiM05wZEdsdmJnb2dJQ0FnTHk4Z1lXNWtJR2RsZEhNZ1kzVnNiR1ZrS1M0Z1YybDBhRzkxZENCMGFHbHpMQ0J0WVhKclpYSnphWHBsSUQwOUlEQWdkMjkxYkdRZ2NISnZaSFZqWlNCMmFYTnBZbXhsSUVGQkNpQWdJQ0F2THlCd1lXUmthVzVuTENCdFlYUmphR2x1WnlCSFRFMWhhMmxsSjNNZ1oyVnZiV1YwY25rZ2MyaGhaR1Z5SUdKbGFHRjJhVzl5TGdvZ0lDQWdkbVZqTWlCd1lXUmtaV1JmWW1KdmVGOXphWHBsSUQwZ1ltSnZlRjl5WVdScGRYTWdLeUJ6YVdkdUtHSmliM2hmY21Ga2FYVnpLU0FxSUdKaWIzaGZZblZtT3dvZ0lDQWdkbVZqTWlCMWRsOXdZV1JmYzJOaGJHVWdQU0J3WVdSa1pXUmZZbUp2ZUY5emFYcGxJQzhnWW1KdmVGOXlZV1JwZFhNN0Nnb2dJQ0FnWm5KaFoxOWpiMnh2Y2lBOUlIUnZkbVZqTkNoblpYUmZkbVZ5ZEdWNFgyTnZiRzl5S0NrcE93b2dJQ0FnWm5KaFoxOXpkSEp2YTJWamIyeHZjaUE5SUhSdmRtVmpOQ2huWlhSZlkyOXVkbVZ5ZEdWa1gzTjBjbTlyWldOdmJHOXlLQ2twT3dvZ0lDQWdabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2dnUFNCblpYUmZjMlJtWDNWMktDazdDaUFnSUNBdkx5Qm5aWFJmZFhZb0tTQnlaWFIxY201eklDZ3dMQ0F3S1N3Z0tERXNJREFwTENBb01Dd2dNU2tnYjNJZ0tERXNJREVwQ2lBZ0lDQXZMeUIwYnlCaFkyTnZiVzlrWVhSbElITjBjbTlyWlNCaGJtUWdaMnh2ZDNkcFpIUm9JSGRsSUc1bFpXUWdkRzhnWlhoMGNuVmtaU0IxZGlkeklHOTFkSGRoY21SeklHWnliMjBnS0RBdU5Td2dNQzQxS1FvZ0lDQWdabkpoWjE5MWRpQTlJSFpsWXpJb01DNDFLU0FySUNoblpYUmZkWFlvS1NBdElIWmxZeklvTUM0MUtTa2dLaUIxZGw5d1lXUmZjMk5oYkdVN0Nnb2dJQ0FnTHk4Z2MyTnlaV1Z1SUhOd1lXTmxJR052YjNKa2FXNWhkR1Z6SUc5bUlIUm9aU0J3YjNOcGRHbHZiZ29nSUNBZ2RtVmpOQ0J4ZFdGa1gzWmxjblJsZUNBOUlDaDBjbUZ1Y3lBcUlIWmxZelFvTWk0d0lDb2djR0ZrWkdWa1gySmliM2hmYzJsNlpTQXFJR2RsZEY5d2IzTnBkR2x2YmlncExDQXdMakFzSURBdU1Da3BPd29nSUNBZ1oyeGZVRzl6YVhScGIyNGdQU0IyWTJ4cGNDQXJJSEYxWVdSZmRtVnlkR1Y0T3dvZ0lDQWdaMnhmVUc5emFYUnBiMjR1ZWlBclBTQm5iRjlRYjNOcGRHbHZiaTUzSUNvZ1oyVjBYMlJsY0hSb1gzTm9hV1owS0NrN0Nnb2dJQ0FnWm5KaFoxOXBibk4wWVc1alpWOXBaQ0E5SUhWcGJuUW9aMnhmU1c1emRHRnVZMlZKUkNrN0NuMEtDcTltY21GbmJXVnVkRjl6YjNWeVkyWGFKUjRLY0hKbFkybHphVzl1SUdocFoyaHdJR2x1ZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdjMkZ0Y0d4bGNqTkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhWE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNMFE3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0IxYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl6UkRzS0NtOTFkQ0IyWldNMElHWnlZV2R0Wlc1MFgyTnZiRzl5T3dvS0x5OGdWVzVwWm05eWJYTTZJQXAxYm1sbWIzSnRJR0p2YjJ3Z2RXNXBabTl5YlY5amIyeHZjbTFoY0RzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbTFoY0NncGUzSmxkSFZ5YmlCMWJtbG1iM0p0WDJOdmJHOXliV0Z3TzMwS2RXNXBabTl5YlNCMWFXNTBJRzlpYW1WamRGOXBaRHNLZFdsdWRDQm5aWFJmYjJKcVpXTjBYMmxrS0NsN2NtVjBkWEp1SUc5aWFtVmpkRjlwWkR0OUNuVnVhV1p2Y20wZ2JXRjBOQ0J0YjJSbGJGOW1NekpqT3dwdFlYUTBJR2RsZEY5dGIyUmxiRjltTXpKaktDbDdjbVYwZFhKdUlHMXZaR1ZzWDJZek1tTTdmUXAxYm1sbWIzSnRJR2x1ZENCelpHWmZiV0Z5YTJWeVgzTm9ZWEJsT3dwcGJuUWdaMlYwWDNOa1psOXRZWEpyWlhKZmMyaGhjR1VvS1h0eVpYUjFjbTRnYzJSbVgyMWhjbXRsY2w5emFHRndaVHQ5Q25WdWFXWnZjbTBnWm14dllYUWdaMnh2ZDNkcFpIUm9Pd3BtYkc5aGRDQm5aWFJmWjJ4dmQzZHBaSFJvS0NsN2NtVjBkWEp1SUdkc2IzZDNhV1IwYUR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsT3dwbWJHOWhkQ0JuWlhSZllYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbEtDbDdjbVYwZFhKdUlHRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpUdDlDblZ1YVdadmNtMGdZbTl2YkNCd1lYUjBaWEp1T3dwaWIyOXNJR2RsZEY5d1lYUjBaWEp1S0NsN2NtVjBkWEp1SUhCaGRIUmxjbTQ3ZlFwMWJtbG1iM0p0SUdKdmIyd2djR2xqYTJsdVp6c0tZbTl2YkNCblpYUmZjR2xqYTJsdVp5Z3BlM0psZEhWeWJpQndhV05yYVc1bk8zMEtkVzVwWm05eWJTQmliMjlzSUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlRzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbkpoYm1kbEtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUdDlDblZ1YVdadmNtMGdabXh2WVhRZ2NIaGZjR1Z5WDNWdWFYUTdDbVpzYjJGMElHZGxkRjl3ZUY5d1pYSmZkVzVwZENncGUzSmxkSFZ5YmlCd2VGOXdaWEpmZFc1cGREdDlDblZ1YVdadmNtMGdjMkZ0Y0d4bGNqSkVJR1JwYzNSaGJtTmxabWxsYkdRN0NuVnVhV1p2Y20wZ2RtVmpOQ0J1WVc1ZlkyOXNiM0k3Q25abFl6UWdaMlYwWDI1aGJsOWpiMnh2Y2lncGUzSmxkSFZ5YmlCdVlXNWZZMjlzYjNJN2ZRcDFibWxtYjNKdElHWnNiMkYwSUhOMGNtOXJaWGRwWkhSb093cG1iRzloZENCblpYUmZjM1J5YjJ0bGQybGtkR2dvS1h0eVpYUjFjbTRnYzNSeWIydGxkMmxrZEdnN2ZRcDFibWxtYjNKdElIWmxZek1nWmpNeVkxOXpZMkZzWlRzS2RtVmpNeUJuWlhSZlpqTXlZMTl6WTJGc1pTZ3BlM0psZEhWeWJpQm1NekpqWDNOallXeGxPMzBLZFc1cFptOXliU0IyWldNeUlISmxjMjlzZFhScGIyNDdDblpsWXpJZ1oyVjBYM0psYzI5c2RYUnBiMjRvS1h0eVpYUjFjbTRnY21WemIyeDFkR2x2Ymp0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWkdWd2RHaGZjMmhwWm5RN0NtWnNiMkYwSUdkbGRGOWtaWEIwYUY5emFHbG1kQ2dwZTNKbGRIVnliaUJrWlhCMGFGOXphR2xtZER0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JzYjNkamJHbHdYMk52Ykc5eU93cDJaV00wSUdkbGRGOXNiM2RqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUd4dmQyTnNhWEJmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR0p2YjJ3Z1ltbHNiR0p2WVhKa093cGliMjlzSUdkbGRGOWlhV3hzWW05aGNtUW9LWHR5WlhSMWNtNGdZbWxzYkdKdllYSmtPMzBLZFc1cFptOXliU0J0WVhRMElIQnlaWEJ5YjJwbFkzUnBiMjQ3Q20xaGREUWdaMlYwWDNCeVpYQnliMnBsWTNScGIyNG9LWHR5WlhSMWNtNGdjSEpsY0hKdmFtVmpkR2x2Ymp0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IxYm1sbWIzSnRYMk52Ykc5eU93cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5S0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSTdmUXAxYm1sbWIzSnRJSFpsWXpRZ2FHbG5hR05zYVhCZlkyOXNiM0k3Q25abFl6UWdaMlYwWDJocFoyaGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR2hwWjJoamJHbHdYMk52Ykc5eU8zMEtkVzVwWm05eWJTQjJaV00wSUdkc2IzZGpiMnh2Y2pzS2RtVmpOQ0JuWlhSZloyeHZkMk52Ykc5eUtDbDdjbVYwZFhKdUlHZHNiM2RqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCMGNtRnVjMlp2Y20xZmJXRnlhMlZ5T3dwaWIyOXNJR2RsZEY5MGNtRnVjMlp2Y20xZmJXRnlhMlZ5S0NsN2NtVjBkWEp1SUhSeVlXNXpabTl5YlY5dFlYSnJaWEk3ZlFvS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdac2IyRjBPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdhVzUwT3dvS2FXNGdkbVZqTkNCbWNtRm5YMk52Ykc5eU93cHBiaUIyWldNeUlHWnlZV2RmZFhZN0Nnb2paR1ZtYVc1bElFTkpVa05NUlNBZ0lDQWdJQ0FnSUNBZ0lEQUtJMlJsWm1sdVpTQlNSVU5VUVU1SFRFVWdJQ0FnSUNBZ0lDQXhDaU5rWldacGJtVWdVazlWVGtSRlJGOVNSVU5VUVU1SFRFVWdNZ29qWkdWbWFXNWxJRVJKVTFSQlRrTkZSa2xGVEVRZ0lDQWdJRE1LSTJSbFptbHVaU0JVVWtsQlRrZE1SU0FnSUNBZ0lDQWdJQ0EwQ2dvalpHVm1hVzVsSUUxZlUxRlNWRjh5SUNBZ0lDQWdJQ0FnSURFdU5ERTBNakV6TlFvS0NpOHZJRWhoYkdZZ2QybGtkR2dnYjJZZ1lXNTBhV0ZzYVdGemFXNW5JSE50YjI5MGFITjBaWEFLSTJSbFptbHVaU0JCVGxSSlFVeEpRVk5mVWtGRVNWVlRJREF1TnpBM01UQTJOemd4TVRnMk5UUTNOZ29LYVc0Z1pteHZZWFFnWm5KaFoxOTFkbk5qWVd4bE93cHBiaUJtYkc5aGRDQm1jbUZuWDJScGMzUmhibU5sWm1sbGJHUmZjMk5oYkdVN0NtbHVJSFpsWXpRZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZzdDbVpzWVhRZ2FXNGdkV2x1ZENCbWNtRm5YMmx1YzNSaGJtTmxYMmxrT3dwcGJpQm1iRzloZENCdlgyTnNhWEJmWkdsemRHRnVZMlZiT0YwN0NtWnNZWFFnYVc0Z2RtVmpNaUJtWDNOd2NtbDBaVjl6WTJGc1pUc0tabXhoZENCcGJpQjJaV00wSUdaeVlXZGZjM1J5YjJ0bFkyOXNiM0k3Q2dwMWJtbG1iM0p0SUdsdWRDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzS0NpOHZJRlJvWlhObElIWmxjbk5wYjI1eklHOW1JR0ZoYzNSbGNDQmhjM04xYldVZ2RHaGhkQ0JnWkdsemRHQWdhWE1nWVNCemFXZHVaV1FnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjRLTHk4Z2QyaHBZMmdnYUdGeklHSmxaVzRnYzJOaGJHVmtJSFJ2SUdKbElHbHVJSFZ1YVhSeklHOW1JSEJwZUdWc2N5NEtabXh2WVhRZ1lXRnpkR1Z3S0dac2IyRjBJSFJvY21WemFHOXNaREVzSUdac2IyRjBJR1JwYzNRc0lHWnNiMkYwSUdGaEtTQjdDaUFnSUNCeVpYUjFjbTRnYzIxdmIzUm9jM1JsY0NoMGFISmxjMmh2YkdReElDMGdZV0VzSUhSb2NtVnphRzlzWkRFZ0t5QmhZU3dnWkdsemRDazdDbjBLQ21ac2IyRjBJR0ZoYzNSbGNDaG1iRzloZENCMGFISmxjMmh2YkdReExDQm1iRzloZENCMGFISmxjMmh2YkdReUxDQm1iRzloZENCa2FYTjBMQ0JtYkc5aGRDQmhZU2tnZXdvZ0lDQWdjbVYwZFhKdUlITnRiMjkwYUhOMFpYQW9kR2h5WlhOb2IyeGtNU0F0SUdGaExDQjBhSEpsYzJodmJHUXhJQ3NnWVdFc0lHUnBjM1FwSUMwS0lDQWdJQ0FnSUNBZ0lDQnpiVzl2ZEdoemRHVndLSFJvY21WemFHOXNaRElnTFNCaFlTd2dkR2h5WlhOb2IyeGtNaUFySUdGaExDQmthWE4wS1RzS2ZRb0tMeThnVUhKdlkyVmtkWEpoYkNCemFXZHVaV1FnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjV6SUc5dUlIUm9aU0IxZGlCamIyOXlaR2x1WVhSbElIQmhkR05vSUZzd0xERmRlRnN3TERGZENpOHZJRTV2ZEdVZ2RHaGhkQ0JtYjNJZ1lXNTBhV0ZzYVdGemFXNW5JSFJ2SUhkdmNtc2djSEp2Y0dWeWJIa2dkR2hsYzJVZ2MyaHZkV3hrSUdKbElDcHpZMkZzWlNCd2NtVnpaWEoyYVc1bktnb3ZMeUFvU1dZZ2VXOTFJRzExYzNRZ2NtVnpZMkZzWlNCMWRpd2diV0ZyWlNCemRYSmxJSFJ2SUhCMWRDQjBhR1VnYzJOaGJHVWdabUZqZEc5eUlHSmhZMnNnYVc0Z2JHRjBaWEl1S1FwbWJHOWhkQ0IwY21saGJtZHNaU2gyWldNeUlGQXBld29nSUNBZ1VDQXRQU0IyWldNeUtEQXVOU2s3Q2lBZ0lDQm1iRzloZENCNElEMGdUVjlUVVZKVVh6SWdLaUFvVUM1NElDMGdVQzU1S1RzS0lDQWdJR1pzYjJGMElIa2dQU0JOWDFOUlVsUmZNaUFxSUNoUUxuZ2dLeUJRTG5rcE93b2dJQ0FnWm14dllYUWdjakVnUFNCdFlYZ29ZV0p6S0hncExDQmhZbk1vZVNrcElDMGdNUzR3THlneUxqQXFUVjlUVVZKVVh6SXBPd29nSUNBZ1pteHZZWFFnY2pJZ1BTQlFMbms3Q2lBZ0lDQnlaWFIxY200Z0xXMWhlQ2h5TVN4eU1pazdDbjBLQ21ac2IyRjBJR05wY21Oc1pTaDJaV015SUhWMktYc0tJQ0FnSUhKbGRIVnliaUF3TGpVdGJHVnVaM1JvS0hWMkxYWmxZeklvTUM0MUtTazdDbjBLQ21ac2IyRjBJSEpsWTNSaGJtZHNaU2gyWldNeUlIVjJLU0I3Q2lBZ0lDQjJaV015SUhNZ1BTQm1YM053Y21sMFpWOXpZMkZzWlNBdklHMXBiaWhtWDNOd2NtbDBaVjl6WTJGc1pTNTRMQ0JtWDNOd2NtbDBaVjl6WTJGc1pTNTVLVHNLSUNBZ0lIWmxZeklnWkNBOUlITWdLaUJ0WVhnb0xYVjJMQ0IxZGlBdElIWmxZeklvTVNrcE93b2dJQ0FnY21WMGRYSnVJQzBvS0d4bGJtZDBhQ2h0WVhnb2RtVmpNaWd3TGpBcExDQmtLU2tnS3lCdGFXNG9NQzR3TENCdFlYZ29aQzU0TENCa0xua3BLU2twT3dwOUNncG1iRzloZENCeWIzVnVaR1ZrWDNKbFkzUmhibWRzWlNoMlpXTXlJSFYyTENCMlpXTXlJSFJzTENCMlpXTXlJR0p5S1hzS0lDQWdJSFpsWXpJZ1pDQTlJRzFoZUNoMGJDMTFkaXdnZFhZdFluSXBPd29nSUNBZ2NtVjBkWEp1SUMwb0tHeGxibWQwYUNodFlYZ29kbVZqTWlnd0xqQXBMQ0JrS1NrZ0t5QnRhVzRvTUM0d0xDQnRZWGdvWkM1NExDQmtMbmtwS1NrdGRHd3VlQ2s3Q24wS0NuWmxZelFnWm1sc2JDaDJaV00wSUdacGJHeGpiMnh2Y2l3Z2RtVmpOQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpa2dld29nSUNBZ2NtVjBkWEp1SUdOdmJHOXlPd3A5Q25abFl6UWdabWxzYkNoMlpXTTBJR1pwYkd4amIyeHZjaXdnWm14dllYUWdZMjlzYjNJc0lIWmxZeklnZFhZcElIc0tJQ0FnSUhKbGRIVnliaUJtYVd4c1kyOXNiM0k3Q24wS2RtVmpOQ0JtYVd4c0tIWmxZelFnWm1sc2JHTnZiRzl5TENCaWIyOXNJR2x0WVdkbExDQjJaV015SUhWMktTQjdJSEpsZEhWeWJpQm1hV3hzWTI5c2IzSTdJSDBLZG1Wak5DQm1hV3hzS0habFl6UWdZeXdnYzJGdGNHeGxjakpFSUdsdFlXZGxMQ0IyWldNeUlIVjJLU0I3SUhKbGRIVnliaUIwWlhoMGRYSmxLR2x0WVdkbExDQjFkaTU1ZUNrN0lIMEtDblp2YVdRZ2MzUnliMnRsS0habFl6UWdjM1J5YjJ0bFkyOXNiM0lzSUdac2IyRjBJSE5wWjI1bFpGOWthWE4wWVc1alpTd2dabXh2WVhRZ2QybGtkR2dzSUdsdWIzVjBJSFpsWXpRZ1kyOXNiM0lzSUdac2IyRjBJR0ZoWDNKaFpHbDFjeWw3Q2lBZ0lDQnBaaUFvZDJsa2RHZ2dJVDBnTUM0d0tYc0tJQ0FnSUNBZ0lDQm1iRzloZENCMElEMGdZV0Z6ZEdWd0tHMXBiaWgzYVdSMGFDd2dNQzR3S1N3Z2JXRjRLSGRwWkhSb0xDQXdMakFwTENCemFXZHVaV1JmWkdsemRHRnVZMlVzSUdGaFgzSmhaR2wxY3lrN0NpQWdJQ0FnSUNBZ2RtVmpOQ0JpWjE5amIyeHZjaUE5SUcxcGVDaGpiMnh2Y2l3Z2RtVmpOQ2h6ZEhKdmEyVmpiMnh2Y2k1eVoySXNJREFwTENCbWJHOWhkQ2h6YVdkdVpXUmZaR2x6ZEdGdVkyVWdQQ0F3TGpVZ0tpQjNhV1IwYUNrcE93b2dJQ0FnSUNBZ0lHTnZiRzl5SUQwZ2JXbDRLR0puWDJOdmJHOXlMQ0J6ZEhKdmEyVmpiMnh2Y2l3Z2RDazdDaUFnSUNCOUNuMEtDblp2YVdRZ1oyeHZkeWgyWldNMElHZHNiM2RqYjJ4dmNpd2dabXh2WVhRZ2MybG5ibVZrWDJScGMzUmhibU5sTENCbWJHOWhkQ0JwYm5OcFpHVXNJR2x1YjNWMElIWmxZelFnWTI5c2IzSXBld29nSUNBZ1pteHZZWFFnWjJ4dmQxOTNhV1IwYUNBOUlHZGxkRjluYkc5M2QybGtkR2dvS1NBcUlHZGxkRjl3ZUY5d1pYSmZkVzVwZENncE93b2dJQ0FnWm14dllYUWdjM1J5YjJ0bFgzZHBaSFJvSUQwZ1oyVjBYM04wY205clpYZHBaSFJvS0NrZ0tpQm5aWFJmY0hoZmNHVnlYM1Z1YVhRb0tUc0tJQ0FnSUdsbUlDaG5iRzkzWDNkcFpIUm9JRDRnTUM0d0tYc0tJQ0FnSUNBZ0lDQm1iRzloZENCdmRYUnphV1JsSUQwZ0tHRmljeWh6YVdkdVpXUmZaR2x6ZEdGdVkyVXBJQzBnYzNSeWIydGxYM2RwWkhSb0tTQXZJR2RzYjNkZmQybGtkR2c3Q2lBZ0lDQWdJQ0FnWm14dllYUWdZV3h3YUdFZ1BTQXhMakFnTFNCdmRYUnphV1JsT3dvZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnYldsNEtIWmxZelFvWjJ4dmQyTnZiRzl5TG5Kbllpd2daMnh2ZDJOdmJHOXlMbUVxWVd4d2FHRXBMQ0JqYjJ4dmNpd2dhVzV6YVdSbEtUc0tJQ0FnSUgwS2ZRb0tabXh2WVhRZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9jMkZ0Y0d4bGNqSkVJR1JwYzNSaGJtTmxabWxsYkdRc0lIWmxZeklnZFhZcGV3b2dJQ0FnTHk4Z1IyeDVjR2dnWkdsemRHRnVZMlVnWm1sbGJHUWdkVzVwZEhNZ1lYSmxJR2x1SUhCcGVHVnNjeTRnUTI5dWRtVnlkQ0IwYnlCellXMWxJR1JwYzNSaGJtTmxDaUFnSUNBdkx5QnpZMkZzYVc1bklHRnpJR1pmZFhZdWVDQm1iM0lnWTI5dWMybHpkR1Z1WTNrZ2QybDBhQ0IwYUdVZ2NISnZZMlZrZFhKaGJDQnphV2R1WldSZlpHbHpkR0Z1WTJVS0lDQWdJQzh2SUdOaGJHTjFiR0YwYVc5dWN5NEtJQ0FnSUhKbGRIVnliaUJtY21GblgyUnBjM1JoYm1ObFptbGxiR1JmYzJOaGJHVWdLaUIwWlhoMGRYSmxLR1JwYzNSaGJtTmxabWxsYkdRc0lIVjJLUzV5T3dwOUNncG1iRzloZENCelkyRnNaV1JmWkdsemRHRnVZMlZtYVdWc1pDaGliMjlzSUdScGMzUmhibU5sWm1sbGJHUXNJSFpsWXpJZ2RYWXBld29nSUNBZ2NtVjBkWEp1SURBdU1Ec0tmUW9LTHk4Z1IybDJaVzRnWVNCbWNtRm5iV1Z1ZENCa1pYSnBkbUYwYVhabElHOW1JR1pmZFhZZ0tHa3VaUzRnWkVaa2VDaG1YM1YyS1NCdmNpQmtSbVI1S0daZmRYWXBLU3dnWTJGc1kzVnNZWFJsQ2k4dklIUm9aU0JoYzNOdlkybGhkR1ZrSUNoemNYVmhjbVZrS1NCamFHRnVaMlVnYVc0Z2RHaGxJR1JwYzNSaGJtTmxabWxsYkdRdUlGUm9hWE1nYVhNZ1pXWm1aV04wYVhabGJIa2dkR2hsQ2k4dklDaHpjWFZoY21Wa0tTQndZWEowYVdGc0lHUmxjbWwyWVhScGRtVWdiMllnZEdobElHUnBjM1JoYm1ObFptbGxiR1FnZDJsMGFDQnlaWE53WldOMElIUnZJR1p5WVdkdFpXNTBDaTh2SUNod2FYaGxiQ2tnWTI5dmNtUnBibUYwWlhNS1pteHZZWFFnYzNGMVlYSmxaRjl3WVhKMGFXRnNYMlJsY21sMllYUmxLR1pzYjJGMElHTmxiblJsY2l3Z2RtVmpNaUJrWmw5MWRpa2dld29nSUNBZ2RtVmpNaUIxZGpFZ1BTQnRhWGdvWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdndWVIa3NJR1p5WVdkZmRYWmZiMlptYzJWMFgzZHBaSFJvTG5wM0xDQmpiR0Z0Y0NobWNtRm5YM1YySUNzZ01DNDFJQ29nWkdaZmRYWXNJREF1TUN3Z01TNHdLU2s3Q2lBZ0lDQjJaV015SUhWMk1DQTlJRzFwZUNobWNtRm5YM1YyWDI5bVpuTmxkRjkzYVdSMGFDNTRlU3dnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdndWVuY3NJR05zWVcxd0tHWnlZV2RmZFhZZ0xTQXdMalVnS2lCa1psOTFkaXdnTUM0d0xDQXhMakFwS1RzS0lDQWdJQzh2SUVsMElHTmhiaUJvWVhCd1pXNGdkR2hoZENCdmRYSWdabkpoWjIxbGJuUWdhWE1nWTJ4dmMyVWdkRzhnWVNCdFlYaHBiWFZ0SUdsdUlIUm9aU0JrYVhOMFlXNWpaV1pwWld4a0NpQWdJQ0F2THlCMFpYaDBkWEpsTGlCSmJpQjBhR2x6SUdOaGMyVWdkR2hsSUdSbGNtbDJZWFJsSUdKaGMyVmtJRzl1SUdFZ2NHOXBiblFnZEc4Z2RHaGxJR3hsWm5RZ1lXNWtJSEpwWjJoMENpQWdJQ0F2THlCallXNGdZbVVnWTJ4dmMyVWdkRzhnTUNCM2FHVnVJR2wwSUhOb2IzVnNaRzRuZENCaVpTNGdWRzhnWVhadmFXUWdkR2hwY3lCM1pTQmpZV3hqZFd4aGRHVWdZUW9nSUNBZ0x5OGdaR1Z5YVhaaGRHbDJaU0IwYnlCbGFYUm9aWElnYzJsa1pTQmhibVFnZEdGclpTQjBhR1VnYzNSeWIyNW5aWElnYjI1bExnb2dJQ0FnWm14dllYUWdaR1l4SUQwZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9aR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RYWXhLU0F0SUdObGJuUmxjanNLSUNBZ0lHWnNiMkYwSUdSbU1pQTlJR05sYm5SbGNpQXRJSE5qWVd4bFpGOWthWE4wWVc1alpXWnBaV3hrS0dScGMzUmhibU5sWm1sbGJHUXNJSFYyTUNrN0NpQWdJQ0J5WlhSMWNtNGdNaTR3SUNvZ2JXRjRLR1JtTVNBcUlHUm1NU3dnWkdZeUlDb2daR1l5S1RzS2ZRb0tMeThnUTJGc1kzVnNZWFJsSUhSb1pTQmhiblJwTFdGc2FXRnphVzVuSUhKaFpHbDFjeUJpWVhObFpDQnZiaUJvYjNjZ2JYVmphQ0IwYUdVZ1pHbHpkR0Z1WTJVZ1ptbGxiR1FnWTJoaGJtZGxjd292THlCeVpXeGhkR2wyWlNCMGJ5QnVaV2xuYUdKdmNtbHVaeUJ6WVcxd2JHVnpMaUJKWmlCMGFHVWdaSEpoZDI0Z2NYVmhaQ0J6WVcxd2JHVnpJSFJvWlNCa2FYTjBZVzVqWlNCbWFXVnNaQW92THlCM2FYUm9JSE52YldVZ1pHbHpkRzl5ZEdsdmJpd2dhWFFnZDJsc2JDQmlaU0J3YVdOclpXUWdkWEFnYUdWeVpTQmhibVFnWTI5dGNHVnVjMkYwWldRZ2FXNGdZMmhoYm1kbGN5QjBid292THlCMGFHVWdZVzUwYVMxaGJHbGhjMmx1WnlCeVlXUnBkWE11Q21ac2IyRjBJR0Z6Y0dWamRGOWpiM0p5WldOMFpXUmZiRzlqWVd4ZllXRmZjbUZrYVhWektHWnNiMkYwSUhOcFoyNWxaRjlrYVhOMFlXNWpaU2tnZXdvZ0lDQWdjbVYwZFhKdUlHWnlZV2RmZFhaelkyRnNaU0FxSUVGT1ZFbEJURWxCVTE5U1FVUkpWVk1nS2lCTlgxTlJVbFJmTWlBcUlITnhjblFvQ2lBZ0lDQWdJQ0FnYzNGMVlYSmxaRjl3WVhKMGFXRnNYMlJsY21sMllYUmxLSE5wWjI1bFpGOWthWE4wWVc1alpTd2daRVprZUNobWNtRm5YM1YyS1NrZ0t3b2dJQ0FnSUNBZ0lITnhkV0Z5WldSZmNHRnlkR2xoYkY5a1pYSnBkbUYwWlNoemFXZHVaV1JmWkdsemRHRnVZMlVzSUdSR1pIa29abkpoWjE5MWRpa3BDaUFnSUNBcE93cDlDZ3AyWldNeUlHVnVZMjlrWlY5MWFXNTBYM1J2WDJac2IyRjBLSFZwYm5RZ2RtRnNkV1VwSUhzS0lDQWdJR1pzYjJGMElHeHZkMlZ5SUQwZ1pteHZZWFFvZG1Gc2RXVWdKaUF3ZUVaR1JrWjFLU0F2SURZMU5UTTFMakE3Q2lBZ0lDQm1iRzloZENCMWNIQmxjaUE5SUdac2IyRjBLSFpoYkhWbElENCtJREUyZFNrZ0x5QTJOVFV6TlM0d093b2dJQ0FnY21WMGRYSnVJSFpsWXpJb2JHOTNaWElzSUhWd2NHVnlLVHNLZlFvS2RtVmpOQ0J3WVdOclgybHVkQ2gxYVc1MElHbGtMQ0IxYVc1MElHbHVaR1Y0S1NCN0NpQWdJQ0IyWldNMElIVnVjR0ZqYXpzS0lDQWdJSFZ1Y0dGamF5NXlaeUE5SUdWdVkyOWtaVjkxYVc1MFgzUnZYMlpzYjJGMEtHbGtLVHNLSUNBZ0lIVnVjR0ZqYXk1aVlTQTlJR1Z1WTI5a1pWOTFhVzUwWDNSdlgyWnNiMkYwS0dsdVpHVjRLVHNLSUNBZ0lISmxkSFZ5YmlCMWJuQmhZMnM3Q24wS0NuWnZhV1FnYldGcGJpZ3BJSHNLSUNBZ0lHWnZjaUFvYVc1MElHa2dQU0F3T3lCcElEd2dkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNN0lHa3JLeWtLSUNBZ0lDQWdJQ0JwWmlBb2IxOWpiR2x3WDJScGMzUmhibU5sVzJsZElEd2dNQzR3S1FvZ0lDQWdJQ0FnSUNBZ0lDQmthWE5qWVhKa093b0tJQ0FnSUdac2IyRjBJSE5wWjI1bFpGOWthWE4wWVc1alpTQTlJREF1TURzS0NpQWdJQ0IyWldNMElIVjJYMjltWmlBOUlHWnlZV2RmZFhaZmIyWm1jMlYwWDNkcFpIUm9Pd29nSUNBZ2RtVmpNaUIwWlhoZmRYWWdQU0J0YVhnb2RYWmZiMlptTG5oNUxDQjFkbDl2Wm1ZdWVuY3NJR05zWVcxd0tHWnlZV2RmZFhZc0lEQXVNQ3dnTVM0d0tTazdDaUFnSUNCbWJHOWhkQ0JoWVY5eVlXUnBkWE1nUFNCQlRsUkpRVXhKUVZOZlVrRkVTVlZUT3dvS0lDQWdJR2x1ZENCemFHRndaU0E5SUdkbGRGOXpaR1pmYldGeWEyVnlYM05vWVhCbEtDazdDaUFnSUNCcFppaHphR0Z3WlNBOVBTQkRTVkpEVEVVcENpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ1kybHlZMnhsS0daeVlXZGZkWFlwT3dvZ0lDQWdaV3h6WlNCcFppaHphR0Z3WlNBOVBTQkVTVk5VUVU1RFJVWkpSVXhFS1NCN0NpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ2MyTmhiR1ZrWDJScGMzUmhibU5sWm1sbGJHUW9aR2x6ZEdGdVkyVm1hV1ZzWkN3Z2RHVjRYM1YyS1RzS0lDQWdJQ0FnSUNCaFlWOXlZV1JwZFhNZ1BTQmhjM0JsWTNSZlkyOXljbVZqZEdWa1gyeHZZMkZzWDJGaFgzSmhaR2wxY3loemFXZHVaV1JmWkdsemRHRnVZMlVwT3dvZ0lDQWdJQ0FnSUdsbUlDaG5aWFJmYzNSeWIydGxkMmxrZEdnb0tTQStJREF1TUNCOGZDQm5aWFJmWjJ4dmQzZHBaSFJvS0NrZ1BpQXdMakFwSUhzS0lDQWdJQ0FnSUNBZ0lDQWdMeThnUTI5dGNHVnVjMkYwWlNCbWIzSWdkR2hsSUdOc1lXMXdhVzVuSUc5bUlIUmxlRjkxZGlCaWVTQmhiaUJoY0hCeWIzaHBiV0YwWlFvZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJsZUhSbGJuTnBiMjRnYjJZZ2RHaGxJSE5wWjI1bFpDQmthWE4wWVc1alpTQnZkWFJ6YVdSbElIUm9aU0IyWVd4cFpDQjBaWGgwZFhKbENpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhKbFoybHZiaTRLSUNBZ0lDQWdJQ0FnSUNBZ2RtVmpNaUJpZFdaMWRpQTlJR1p5WVdkZmRYWWdMU0JqYkdGdGNDaG1jbUZuWDNWMkxDQXdMakFzSURFdU1DazdDaUFnSUNBZ0lDQWdJQ0FnSUhOcFoyNWxaRjlrYVhOMFlXNWpaU0F0UFNCc1pXNW5kR2dvWW5WbWRYWXBPd29nSUNBZ0lDQWdJSDBLSUNBZ0lIMGdaV3h6WlNCcFppaHphR0Z3WlNBOVBTQlNUMVZPUkVWRVgxSkZRMVJCVGtkTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQnliM1Z1WkdWa1gzSmxZM1JoYm1kc1pTaG1jbUZuWDNWMkxDQjJaV015S0RBdU1pa3NJSFpsWXpJb01DNDRLU2s3Q2lBZ0lDQmxiSE5sSUdsbUtITm9ZWEJsSUQwOUlGSkZRMVJCVGtkTVJTa0tJQ0FnSUNBZ0lDQnphV2R1WldSZlpHbHpkR0Z1WTJVZ1BTQnlaV04wWVc1bmJHVW9abkpoWjE5MWRpazdJQzh2SUhKbFkzUmhibWRzWlNobVgzVjJLVHNLSUNBZ0lHVnNjMlVnYVdZb2MyaGhjR1VnUFQwZ1ZGSkpRVTVIVEVVcENpQWdJQ0FnSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUQwZ2RISnBZVzVuYkdVb1puSmhaMTkxZGlrN0Nnb2dJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJQ285SUdaeVlXZGZkWFp6WTJGc1pUc0tDZ29nSUNBZ1pteHZZWFFnYzNSeWIydGxYM2RwWkhSb0lEMGdaMlYwWDNOMGNtOXJaWGRwWkhSb0tDa2dLaUJuWlhSZmNIaGZjR1Z5WDNWdWFYUW9LVHNLSUNBZ0lHWnNiMkYwSUdsdWMybGtaVjl6ZEdGeWRDQTlJRzFoZUNndGMzUnliMnRsWDNkcFpIUm9MQ0F3TGpBcE93b2dJQ0FnWm14dllYUWdhVzV6YVdSbElEMGdZV0Z6ZEdWd0tHbHVjMmxrWlY5emRHRnlkQ3dnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JoWVY5eVlXUnBkWE1wT3dvS0lDQWdJSFpsWXpRZ1ptbHVZV3hmWTI5c2IzSWdQU0JtYVd4c0tHWnlZV2RmWTI5c2IzSXNJSFZ1YVdadmNtMWZZMjlzYjNJc0lHWnlZV2RmZFhZcE93b2dJQ0FnWm1sdVlXeGZZMjlzYjNJdVlTQTlJR1pwYm1Gc1gyTnZiRzl5TG1FZ0tpQnBibk5wWkdVN0Nnb2dJQ0FnYzNSeWIydGxLR1p5WVdkZmMzUnliMnRsWTI5c2IzSXNJSE5wWjI1bFpGOWthWE4wWVc1alpTd2dMWE4wY205clpWOTNhV1IwYUN3Z1ptbHVZV3hmWTI5c2IzSXNJR0ZoWDNKaFpHbDFjeWs3Q2lBZ0lDQm5iRzkzS0dkbGRGOW5iRzkzWTI5c2IzSW9LU3dnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JoWVhOMFpYQW9MWE4wY205clpWOTNhV1IwYUN3Z2MybG5ibVZrWDJScGMzUmhibU5sTENCaFlWOXlZV1JwZFhNcExDQm1hVzVoYkY5amIyeHZjaWs3Q2dvZ0lDQWdMeThnWkdWaWRXY2dMU0J6YUc5M0lHSmhZMnRuY205MWJtUUtJQ0FnSUM4dklHWnBibUZzWDJOdmJHOXlMbUVnUFNCamJHRnRjQ2htYVc1aGJGOWpiMnh2Y2k1aExDQXdMakFzSURFdU1DazdDaUFnSUNBdkx5Qm1hVzVoYkY5amIyeHZjaUE5SUhabFl6UW9DaUFnSUNBdkx5QWdJQ0FnZG1Wak15Z3hMREFzTUNrZ0tpQW9NUzR3SUMwZ1ptbHVZV3hmWTI5c2IzSXVZU2tnS3lCbWFXNWhiRjlqYjJ4dmNpNXlaMklnS2lCbWFXNWhiRjlqYjJ4dmNpNWhMQW9nSUNBZ0x5OGdJQ0FnSURBdU5DQXJJREF1TmlBcUlHWnBibUZzWDJOdmJHOXlMbUVLSUNBZ0lDOHZJQ2s3Q2dvZ0lDQWdhV1lnS0hCcFkydHBibWNwSUhzS0lDQWdJQ0FnSUNCcFppQW9abWx1WVd4ZlkyOXNiM0l1WVNBK0lEQXVNU2tnZXdvZ0lDQWdJQ0FnSUNBZ0lDQm1jbUZuYldWdWRGOWpiMnh2Y2lBOUlIQmhZMnRmYVc1MEtHOWlhbVZqZEY5cFpDd2dabkpoWjE5cGJuTjBZVzVqWlY5cFpDazdDaUFnSUNBZ0lDQWdmU0JsYkhObElIc0tJQ0FnSUNBZ0lDQWdJQ0FnWkdselkyRnlaRHNLSUNBZ0lDQWdJQ0I5Q2lBZ0lDQWdJQ0FnY21WMGRYSnVPd29nSUNBZ2ZRb0tJQ0FnSUdsbUlDaG1hVzVoYkY5amIyeHZjaTVoSUR3OUlEQXVNQ2w3Q2lBZ0lDQWdJQ0FnWkdselkyRnlaRHNLSUNBZ0lIMEtJQ0FnSUdaeVlXZHRaVzUwWDJOdmJHOXlJRDBnWm1sdVlXeGZZMjlzYjNJN0NuMEtxWEJzYjNSZmRIbHdaYWRUWTJGMGRHVnlwM1Z3WkdGMFpYTEhCV2lrTVRVMk9MTnBibk4wWVc1alpWOWhkSFJ5YVdKMWRHVnppTEpqYjI1MlpYSjBaV1JmY205MFlYUnBiMjZDcTNSNWNHVmZiR1Z1WjNSb0JLUm1iR0YweUFFUUZ3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9xbkYxWVdSZmMyTmhiR1dDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHdBWHJXMWhjbXRsY2w5dlptWnpaWFNDcTNSNWNHVmZiR1Z1WjNSb0E2Um1iR0YweDh3WGh4YmR3Y2RMbzhBQUFBQUFGSzZid2NkTG84QUFBQUFBNXRBNndjZExvOEFBQUFBQWlCYjV3TWRMbzhBQUFBQUFoeGJkd2NkTG84QUFBQUFBRks2YndjZExvOEFBQUFBQTV0QTZ3Y2RMbzhBQUFBQUFpQmI1d01kTG84QUFBQUFBRks2YndjZExvOEFBQUFBQTVOQTZ3Y2RMbzhBQUFBQUFoaGI1d01kTG84QUFBQUFBRks2YndjZExvOEFBQUFBQTVOQTZ3Y2RMbzhBQUFBQUFoaGI1d01kTG84QUFBQUFBRks2YndjZExvOEFBQUFBQTVOQTZ3Y2RMbzhBQUFBQUFoaGI1d01kTG84QUFBQUFBdFdOdmJuWmxjblJsWkY5emRISnZhMlZqYjJ4dmNvS3JkSGx3WlY5c1pXNW5kR2dFcEdac1lYVElBUkFYQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDbWMyUm1YM1YyZ3F0MGVYQmxYMnhsYm1kMGFBU2tabXhoZE1jQUY2MTNaMnhmY0c5emFYUnBiMjV6Z3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE1lSUZ3QUFnRUtCLzQ1Q0FBQ0FRb0gvamtJQUFJQkNnZitPUWdBQWdFS0IvNDVDQUFDQVF1RC9CVU1BQUlCQzRQOEZRd0FBZ0VMZy93VkRBQUNBUXVEL0JVTUFBSUJDQUlCRVF3QUFnRUlBZ0VSREFBQ0FRZ0NBUkVNQUFJQkNFSUNCUXdBQWdFSVFnSUZEQUFDQVFoQ0FnVU1BQUlCQ0lNQ2dRd0FBZ0VJZ3dLQkRBQUNBUWlEQW9FT3NkbVZ5ZEdWNFgyTnZiRzl5Z3F0MGVYQmxYMnhsYm1kMGFBU2tabXhoZE1nQkVCY0FBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNnR4ZFdGa1gyOW1abk5sZElLcmRIbHdaVjlzWlc1bmRHZ0NwR1pzWVhUSEFCZU1ySFJ5WVc1emNHRnlaVzVqZWNLbWVuWmhiSFZseWdBQUFBQ2tibUZ0WmRrZ2JHbHVaWE5sWjIxbGJuUnpMVGs1TVRRek5EVXpPVEUxT1RRMU1qYzBOakdwWTJGdFgzTndZV05scEdSaGRHR29kVzVwWm05eWJYT09zblZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aY0twYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS90blZ1YVdadmNtMWZjR0YwZEdWeWJsOXNaVzVuZEdqS1A0QUFBS3h6WTJWdVpWOXZjbWxuYVc3WEZ3QUFBQUFBQUFBQXJXeHZkMk5zYVhCZlkyOXNiM0xZRjhDMGlENFR0cDg3RmFtb1BnQUFnRCt3ZFc1cFptOXliVjlqYjJ4dmNtMWhjTUtuY0dsamEybHVaOEszZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFwMnhwYm1WallYQUFxMlJsY0hSb1gzTm9hV1oweWdBQUFBQ3ZkVzVwWm05eWJWOXdZWFIwWlhKdXdxNW9hV2RvWTJ4cGNGOWpiMnh2Y3RnWGdFVitQK2o1WnovMVl4TStBQUNBUDdOMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weng0QVhBQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczZuZG1semFXSnNaY09vYjNabGNtUnlZWGZDcTJselgzTmxaMjFsYm5Senc2cGhkSFJ5YVdKMWRHVnpnN0YxYm1sbWIzSnRYMnhwYm1WM2FXUjBhSUtyZEhsd1pWOXNaVzVuZEdnQnBHWnNZWFRIQUJlcWJHbHVaVjlqYjJ4dmNvS3JkSGx3WlY5c1pXNW5kR2dFcEdac1lYVEhBQmU2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0E2Um1iR0YweHdBWHBIVjFhV1N6T1RreE5ETTBOVE01TVRVNU5EVXlOelEyTWFsd2JHOTBYM1I1Y0dXbFRHbHVaWE9uZFhCa1lYUmxjc2NGYUtReE5UWTVqS3gwY21GdWMzQmhjbVZ1WTNuQ3BucDJZV3gxWmNwQklBQUFwRzVoYldYWklHeHBibVZ6WldkdFpXNTBjeTA1TWpnek1UVTNORFUwT0RRM05UUXdNekl5cVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0FRc25WdWFXWnZjbTFmWTI5c2IzSnlZVzVuWmNLcGJtRnVYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUFBQUFBQXFtMXZaR1ZzWDJZek1tUEhRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUlFRUFBSUEvdG5WdWFXWnZjbTFmY0dGMGRHVnlibDlzWlc1bmRHaktQNEFBQUt4elkyVnVaVjl2Y21sbmFXN1hGd0FBQUFBQUFBQUFyV3h2ZDJOc2FYQmZZMjlzYjNMWUY4QzBpRDRUdHA4N0ZhbW9QZ0FBZ0Qrd2RXNXBabTl5YlY5amIyeHZjbTFoY01LbmNHbGphMmx1WjhLeGRXNXBabTl5YlY5c2FXNWxkMmxrZEdqS1A0QUFBTGQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3FiR2x1WlY5amIyeHZjdGdYQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNnRrWlhCMGFGOXphR2xtZE1vQUFBQUFyM1Z1YVdadmNtMWZjR0YwZEdWeWJzS3VhR2xuYUdOc2FYQmZZMjlzYjNMWUY0QkZmai9vK1djLzlXTVRQZ0FBZ0QremRXNXBabTl5YlY5amJHbHdYM0JzWVc1bGM4ZUFGd0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPcDNacGMybGliR1hDcUc5MlpYSmtjbUYzd3F0cGMxOXpaV2R0Wlc1MGM4T3FZWFIwY21saWRYUmxjNEc2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweDNBWFhYVExRZ0JBcDBOZGRNdENBTUNwUTJYOFBVTUFRS2REWmZ3OVF3REFxVU5PSDR0REFFQ25RMDRmaTBNQXdLbERha0MzUXdCQXAwTnFRTGREQU1DcFE0Vmg0ME1BUUtkRGhXSGpRd0RBcVVOUXdRZEVBRUNuUTFEQkIwUUF3S2xEM3RFZFJBQkFwMFBlMFIxRUFNQ3BRNlIxZFdsa3N6a3lPRE14TlRjME5UUTRORGMxTkRBek1qS3BjR3h2ZEY5MGVYQmxwVXhwYm1WenAzVndaR0YwWlhMSEJXaWtNVFUzTUl5c2RISmhibk53WVhKbGJtTjV3cVo2ZG1Gc2RXWEtRU0FBQUtSdVlXMWx2MnhwYm1WelpXZHRaVzUwY3kweU9ESTNNVE0yTXpZeE5UZzJNelUxTnplcFkyRnRYM053WVdObHBHUmhkR0dvZFc1cFptOXliWFBlQUJDeWRXNXBabTl5YlY5amIyeHZjbkpoYm1kbHdxbHVZVzVmWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ3FiVzlrWld4ZlpqTXlZOGRBRndBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQWdRUUFBZ0QrMmRXNXBabTl5YlY5d1lYUjBaWEp1WDJ4bGJtZDBhTW8vZ0FBQXJITmpaVzVsWDI5eWFXZHBidGNYQUFBQUFBQUFBQUN0Ykc5M1kyeHBjRjlqYjJ4dmN0Z1h3TFNJUGhPMm56c1ZxYWcrQUFDQVA3QjFibWxtYjNKdFgyTnZiRzl5YldGd3dxZHdhV05yYVc1bndyRjFibWxtYjNKdFgyeHBibVYzYVdSMGFNby9nQUFBdDNWdWFXWnZjbTFmYm5WdFgyTnNhWEJmY0d4aGJtVnpBS2RzYVc1bFkyRndBS3BzYVc1bFgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBSUEvcTJSbGNIUm9YM05vYVdaMHlnQUFBQUN2ZFc1cFptOXliVjl3WVhSMFpYSnV3cTVvYVdkb1kyeHBjRjlqYjJ4dmN0Z1hnRVYrUCtqNVp6LzFZeE0rQUFDQVA3TjFibWxtYjNKdFgyTnNhWEJmY0d4aGJtVnp4NEFYQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM2bmRtbHphV0pzWmNLb2IzWmxjbVJ5WVhmQ3EybHpYM05sWjIxbGJuUnp3NnBoZEhSeWFXSjFkR1Z6Z2Jwd2IzTnBkR2x2Ym5OZmRISmhibk5tYjNKdFpXUmZaak15WTRLcmRIbHdaVjlzWlc1bmRHZ0NwR1pzWVhUSFVCY0FJQ3RFZ2YrT1FnQmdMRVNCLzQ1Q0FDQXJST0QvQlVNQVlDeEU0UDhGUXdBZ0swUUFnRVJEQUdBc1JBQ0FSRU1BSUN0RUVJQ0JRd0JnTEVRUWdJRkRBQ0FyUkNEQW9FTUFZQ3hFSU1DZ1E2UjFkV2xrc2pJNE1qY3hNell6TmpFMU9EWXpOVFUzTjZsd2JHOTBYM1I1Y0dXbFRHbHVaWE9uZFhCa1lYUmxjc2NGYUtReE5UY3hqS3gwY21GdWMzQmhjbVZ1WTNuQ3BucDJZV3gxWmNwQklBQUFwRzVoYldYWklHeHBibVZ6WldkdFpXNTBjeTAxTXprM05ETTFNVFkwTlRBeU1qRTVPVGd6cVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0FRc25WdWFXWnZjbTFmWTI5c2IzSnlZVzVuWmNLcGJtRnVYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUFBQUFBQXFtMXZaR1ZzWDJZek1tUEhRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUlFRUFBSUEvdG5WdWFXWnZjbTFmY0dGMGRHVnlibDlzWlc1bmRHaktQNEFBQUt4elkyVnVaVjl2Y21sbmFXN1hGd0FBQUFBQUFBQUFyV3h2ZDJOc2FYQmZZMjlzYjNMWUY4QzBpRDRUdHA4N0ZhbW9QZ0FBZ0Qrd2RXNXBabTl5YlY5amIyeHZjbTFoY01LbmNHbGphMmx1WjhLeGRXNXBabTl5YlY5c2FXNWxkMmxrZEdqS1A0QUFBTGQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3FiR2x1WlY5amIyeHZjdGdYQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNnRrWlhCMGFGOXphR2xtZE1vQUFBQUFyM1Z1YVdadmNtMWZjR0YwZEdWeWJzS3VhR2xuYUdOc2FYQmZZMjlzYjNMWUY0QkZmai9vK1djLzlXTVRQZ0FBZ0QremRXNXBabTl5YlY5amJHbHdYM0JzWVc1bGM4ZUFGd0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPcDNacGMybGliR1hDcUc5MlpYSmtjbUYzd3F0cGMxOXpaV2R0Wlc1MGM4T3FZWFIwY21saWRYUmxjNEc2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHdBWHBIVjFhV1N6TlRNNU56UXpOVEUyTkRVd01qSXhPVGs0TTZsd2JHOTBYM1I1Y0dXbFRHbHVaWE9uZFhCa1lYUmxjc2NGYUtReE5UY3lqS3gwY21GdWMzQmhjbVZ1WTNuQ3BucDJZV3gxWmNwQklBQUFwRzVoYldYWklXeHBibVZ6WldkdFpXNTBjeTB4TkRJME16UXhNakE1TURZek5qTXlNemsyTUtsallXMWZjM0JoWTJXa1pHRjBZYWgxYm1sbWIzSnRjOTRBRUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXNWhibDlqYjJ4dmN0Z1hBQUFBQUFBQUFBQUFBQUFBQUFBQUFLcHRiMlJsYkY5bU16Smp4MEFYQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFDQkJBQUNBUDdaMWJtbG1iM0p0WDNCaGRIUmxjbTVmYkdWdVozUm95aitBQUFDc2MyTmxibVZmYjNKcFoybHUxeGNBQUFBQUFBQUFBSzFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3NIVnVhV1p2Y20xZlkyOXNiM0p0WVhEQ3AzQnBZMnRwYm1mQ3NYVnVhV1p2Y20xZmJHbHVaWGRwWkhSb3lqK0FBQUMzZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTUFwMnhwYm1WallYQUFxbXhwYm1WZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFnRCtyWkdWd2RHaGZjMmhwWm5US0FBQUFBSzkxYm1sbWIzSnRYM0JoZEhSbGNtN0NybWhwWjJoamJHbHdYMk52Ykc5eTJCZUFSWDQvNlBsblAvVmpFejRBQUlBL3MzVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYUEhnQmNBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1enFkMmFYTnBZbXhsd3FodmRtVnlaSEpoZDhLcmFYTmZjMlZuYldWdWRIUERxbUYwZEhKcFluVjBaWE9CdW5CdmMybDBhVzl1YzE5MGNtRnVjMlp2Y20xbFpGOW1NekpqZ3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE1jQUY2UjFkV2xrdERFME1qUXpOREV5TURrd05qTTJNekl6T1RZd3FYQnNiM1JmZEhsd1phVk1hVzVsYzZkMWNHUmhkR1Z5eHdWb3BERTFOek9NckhSeVlXNXpjR0Z5Wlc1amVjS21lblpoYkhWbHlrR2dBQUNrYm1GdFpka2diR2x1WlhObFoyMWxiblJ6TFRjM01UQTFPRGN6TVRFME9ESTJPRFl5TXpPcFkyRnRYM053WVdObHBHUmhkR0dvZFc1cFptOXliWFBlQUJDeWRXNXBabTl5YlY5amIyeHZjbkpoYm1kbHdxbHVZVzVmWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ3FiVzlrWld4ZlpqTXlZOGRBRndBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQ2dRUUFBZ0QrMmRXNXBabTl5YlY5d1lYUjBaWEp1WDJ4bGJtZDBhTW8vZ0FBQXJITmpaVzVsWDI5eWFXZHBidGNYQUFBQUFBQUFBQUN0Ykc5M1kyeHBjRjlqYjJ4dmN0Z1h3TFNJUGhPMm56c1ZxYWcrQUFDQVA3QjFibWxtYjNKdFgyTnZiRzl5YldGd3dxZHdhV05yYVc1bndyRjFibWxtYjNKdFgyeHBibVYzYVdSMGFNby9nQUFBdDNWdWFXWnZjbTFmYm5WdFgyTnNhWEJmY0d4aGJtVnpBS2RzYVc1bFkyRndBS3BzYVc1bFgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBSUEvcTJSbGNIUm9YM05vYVdaMHlnQUFBQUN2ZFc1cFptOXliVjl3WVhSMFpYSnV3cTVvYVdkb1kyeHBjRjlqYjJ4dmN0Z1hnRVYrUCtqNVp6LzFZeE0rQUFDQVA3TjFibWxtYjNKdFgyTnNhWEJmY0d4aGJtVnp4NEFYQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM2bmRtbHphV0pzWmNPb2IzWmxjbVJ5WVhmQ3EybHpYM05sWjIxbGJuUnp3NnBoZEhSeWFXSjFkR1Z6Z2Jwd2IzTnBkR2x2Ym5OZmRISmhibk5tYjNKdFpXUmZaak15WTRLcmRIbHdaVjlzWlc1bmRHZ0NwR1pzWVhUWUZ3QUFrMElBQUtkREFDQXJSQUFBcDBPa2RYVnBaTE0zTnpFd05UZzNNekV4TkRneU5qZzJNak16cVhCc2IzUmZkSGx3WmFWTWFXNWxjNmQxY0dSaGRHVnl4d1ZvcERFMU56U01ySFJ5WVc1emNHRnlaVzVqZWNLbWVuWmhiSFZseWtHZ0FBQ2tibUZ0WmRraGJHbHVaWE5sWjIxbGJuUnpMVEV4TlRVMk5qUTVNVEl3TURNeE5USTJNREl4cVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0FRc25WdWFXWnZjbTFmWTI5c2IzSnlZVzVuWmNLcGJtRnVYMk52Ykc5eTJCY0FBQUFBQUFBQUFBQUFBQUFBQUFBQXFtMXZaR1ZzWDJZek1tUEhRQmNBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQW9FRUFBSUEvdG5WdWFXWnZjbTFmY0dGMGRHVnlibDlzWlc1bmRHaktQNEFBQUt4elkyVnVaVjl2Y21sbmFXN1hGd0FBQUFBQUFBQUFyV3h2ZDJOc2FYQmZZMjlzYjNMWUY4QzBpRDRUdHA4N0ZhbW9QZ0FBZ0Qrd2RXNXBabTl5YlY5amIyeHZjbTFoY01LbmNHbGphMmx1WjhLeGRXNXBabTl5YlY5c2FXNWxkMmxrZEdqS1A0QUFBTGQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3FiR2x1WlY5amIyeHZjdGdYQUFBQUFBQUFBQUFBQUFBQUFBQ0FQNnRrWlhCMGFGOXphR2xtZE1vQUFBQUFyM1Z1YVdadmNtMWZjR0YwZEdWeWJzS3VhR2xuYUdOc2FYQmZZMjlzYjNMWUY0QkZmai9vK1djLzlXTVRQZ0FBZ0QremRXNXBabTl5YlY5amJHbHdYM0JzWVc1bGM4ZUFGd0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPcDNacGMybGliR1hEcUc5MlpYSmtjbUYzd3F0cGMxOXpaV2R0Wlc1MGM4T3FZWFIwY21saWRYUmxjNEc2Y0c5emFYUnBiMjV6WDNSeVlXNXpabTl5YldWa1gyWXpNbU9DcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YwMkJjQUFDdEVBQUJxUWdBQUswUUFRS2REcEhWMWFXUzBNVEUxTlRZMk5Ea3hNakF3TXpFMU1qWXdNakdwY0d4dmRGOTBlWEJscFV4cGJtVnpwM1Z3WkdGMFpYTEhCV2lrTVRVM05kNEFFcXgwY21GdWMzQmhjbVZ1WTNuQ3BYTndZV05scEdSaGRHR3NkbVZ5ZEdWNFlYSnlZWGx6Z3FKMWRvS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhJQmNBQUFBQUFBQ0FQd0FBZ0Q4QUFJQS9BQUNBUHdBQUFBQUFBQUFBQUFBQUFLaHdiM05wZEdsdmJvS3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhJQmNBQUFDL0FBQUF2d0FBQUQ4QUFBQy9BQUFBUHdBQUFEOEFBQUMvQUFBQVA2WjZkbUZzZFdYS0FBQUFBS1J1WVcxbHVIUmxlSFF0TmpFeU5ETXhNVFl6TXpJMk5EWTFOREU1TWFsallXMWZjM0JoWTJXa1pHRjBZYWgxYm1sbWIzSnRjOTRBR2F0d2VGOXdaWEpmZFc1cGRNb0FBQUFBcVdkc2IzZGpiMnh2Y3RnWEFBQUFBQUFBQUFBQUFBQUFBQUFBQUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3FXSnBiR3hpYjJGeVpNS3RjSEpsY0hKdmFtVmpkR2x2YnNkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEK3BibUZ1WDJOdmJHOXkyQmNBQUFBQUFBQUFBQUFBQUFBQUFBQUFyV1JwYzNSaGJtTmxabWxsYkdTS3FXMXBia1pwYkhSbGNxeE1hVzVsWVhKR2FXeDBaWEtxWVc1cGMyOTBjbTl3ZWNwQmdBQUFxVzFoWjBacGJIUmxjcXhNYVc1bFlYSkdhV3gwWlhLbGQzSmhjRk91VW1Wd1pXRjBWM0poY0hCcGJtZWtaR0YwWWExMFpYaDBkWEpsWDJGMGJHRnpySFJvY21WbFgyWnZjbTFoZEtsU1pXUkdiM0p0WVhTa2MybDZaWkxOQ0FETkNBQ2xkM0poY0ZTdVVtVndaV0YwVjNKaGNIQnBibWVrZEhsd1phZFRZVzF3YkdWeXFuUm9jbVZsWDNSNWNHV3BSbXh2WVhSVWVYQmxxbTF2WkdWc1gyWXpNbVBIUUJjQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL3NtRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpjcEZBQUFBc0hOa1psOXRZWEpyWlhKZmMyaGhjR1VEcDNCaGRIUmxjbTdDcTNOMGNtOXJaWGRwWkhSb3lnQUFBQUN0Ykc5M1kyeHBjRjlqYjJ4dmN0Z1h3TFNJUGhPMm56c1ZxYWcrQUFDQVA3QjFibWxtYjNKdFgyTnZiRzl5YldGd3dxbG5iRzkzZDJsa2RHaktBQUFBQUtkd2FXTnJhVzVud3FweVpYTnZiSFYwYVc5dTF4Y0FBQUFBQUFBQUFMZDFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3dDcGIySnFaV04wWDJsa0FLMTFibWxtYjNKdFgyTnZiRzl5d3JCMGNtRnVjMlp2Y20xZmJXRnlhMlZ5d3F0a1pYQjBhRjl6YUdsbWRNb0FBQUFBcW1Zek1tTmZjMk5oYkdYSERCY0FBSUEvQUFDQVB3QUFnRCt1YUdsbmFHTnNhWEJmWTI5c2IzTFlGNEJGZmovbytXYy85V01UUGdBQWdEK3pkVzVwWm05eWJWOWpiR2x3WDNCc1lXNWxjOGVBRndBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T3AzWnBjMmxpYkdYRHEyMWhjbXRsY25Od1lXTmxwR1JoZEdHb2IzWmxjbVJ5WVhmQ3FtZHNlWEJvWDJSaGRHR0RyR2RzZVhCb1gyaGhjMmhsYzhjQUZxWnpZMkZzWlhQSEFCZXRZWFJzWVhOZmRYQmtZWFJsYzRDbFptRmpaWFBIR0JZQUFBQUFBUUFBQUFJQUFBQUFBQUFBQWdBQUFBTUFBQUNrZFhWcFpMTTJNVEkwTXpFeE5qTXpNalkwTmpVME1Ua3hyWFpsY25SbGVGOXpiM1Z5WTJYYUpsb0tjSEpsWTJsemFXOXVJR2hwWjJod0lHbHVkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR1pzYjJGME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pKRU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pORU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2FYTmhiWEJzWlhJeVJEc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHbHpZVzF3YkdWeU0wUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQjFjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdkWE5oYlhCc1pYSXpSRHNLTHk4Z2RtVnlkR1Y0SUdsdWNIVjBjem9nQ21sdUlIWmxZeklnY0c5emFYUnBiMjQ3Q25abFl6SWdaMlYwWDNCdmMybDBhVzl1S0NsN2NtVjBkWEp1SUhCdmMybDBhVzl1TzMwS2FXNGdkbVZqTWlCMWRqc0tkbVZqTWlCblpYUmZkWFlvS1h0eVpYUjFjbTRnZFhZN2ZRb0tMeThnVlc1cFptOXliWE02SUFwMWJtbG1iM0p0SUdKdmIyd2dkVzVwWm05eWJWOWpiMnh2Y20xaGNEc0tZbTl2YkNCblpYUmZkVzVwWm05eWJWOWpiMnh2Y20xaGNDZ3BlM0psZEhWeWJpQjFibWxtYjNKdFgyTnZiRzl5YldGd08zMEtkVzVwWm05eWJTQjFhVzUwSUc5aWFtVmpkRjlwWkRzS2RXbHVkQ0JuWlhSZmIySnFaV04wWDJsa0tDbDdjbVYwZFhKdUlHOWlhbVZqZEY5cFpEdDlDblZ1YVdadmNtMGdiV0YwTkNCdGIyUmxiRjltTXpKak93cHRZWFEwSUdkbGRGOXRiMlJsYkY5bU16SmpLQ2w3Y21WMGRYSnVJRzF2WkdWc1gyWXpNbU03ZlFwMWJtbG1iM0p0SUdsdWRDQnpaR1pmYldGeWEyVnlYM05vWVhCbE93cHBiblFnWjJWMFgzTmtabDl0WVhKclpYSmZjMmhoY0dVb0tYdHlaWFIxY200Z2MyUm1YMjFoY210bGNsOXphR0Z3WlR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWjJ4dmQzZHBaSFJvT3dwbWJHOWhkQ0JuWlhSZloyeHZkM2RwWkhSb0tDbDdjbVYwZFhKdUlHZHNiM2QzYVdSMGFEdDlDblZ1YVdadmNtMGdabXh2WVhRZ1lYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbE93cG1iRzloZENCblpYUmZZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxLQ2w3Y21WMGRYSnVJR0YwYkdGelgzUmxlSFIxY21WZmMybDZaVHQ5Q25WdWFXWnZjbTBnWW05dmJDQndZWFIwWlhKdU93cGliMjlzSUdkbGRGOXdZWFIwWlhKdUtDbDdjbVYwZFhKdUlIQmhkSFJsY200N2ZRcDFibWxtYjNKdElHSnZiMndnY0dsamEybHVaenNLWW05dmJDQm5aWFJmY0dsamEybHVaeWdwZTNKbGRIVnliaUJ3YVdOcmFXNW5PMzBLZFc1cFptOXliU0JpYjI5c0lIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUc0tZbTl2YkNCblpYUmZkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGxLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aVHQ5Q25WdWFXWnZjbTBnWm14dllYUWdjSGhmY0dWeVgzVnVhWFE3Q21ac2IyRjBJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BlM0psZEhWeWJpQndlRjl3WlhKZmRXNXBkRHQ5Q25WdWFXWnZjbTBnYzJGdGNHeGxjakpFSUdScGMzUmhibU5sWm1sbGJHUTdDblZ1YVdadmNtMGdkbVZqTkNCdVlXNWZZMjlzYjNJN0NuWmxZelFnWjJWMFgyNWhibDlqYjJ4dmNpZ3BlM0psZEhWeWJpQnVZVzVmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR1pzYjJGMElITjBjbTlyWlhkcFpIUm9Pd3BtYkc5aGRDQm5aWFJmYzNSeWIydGxkMmxrZEdnb0tYdHlaWFIxY200Z2MzUnliMnRsZDJsa2RHZzdmUXAxYm1sbWIzSnRJSFpsWXpNZ1pqTXlZMTl6WTJGc1pUc0tkbVZqTXlCblpYUmZaak15WTE5elkyRnNaU2dwZTNKbGRIVnliaUJtTXpKalgzTmpZV3hsTzMwS2RXNXBabTl5YlNCMlpXTXlJSEpsYzI5c2RYUnBiMjQ3Q25abFl6SWdaMlYwWDNKbGMyOXNkWFJwYjI0b0tYdHlaWFIxY200Z2NtVnpiMngxZEdsdmJqdDlDblZ1YVdadmNtMGdabXh2WVhRZ1pHVndkR2hmYzJocFpuUTdDbVpzYjJGMElHZGxkRjlrWlhCMGFGOXphR2xtZENncGUzSmxkSFZ5YmlCa1pYQjBhRjl6YUdsbWREdDlDblZ1YVdadmNtMGdkbVZqTkNCc2IzZGpiR2x3WDJOdmJHOXlPd3AyWldNMElHZGxkRjlzYjNkamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHeHZkMk5zYVhCZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdKdmIyd2dZbWxzYkdKdllYSmtPd3BpYjI5c0lHZGxkRjlpYVd4c1ltOWhjbVFvS1h0eVpYUjFjbTRnWW1sc2JHSnZZWEprTzMwS2RXNXBabTl5YlNCdFlYUTBJSEJ5WlhCeWIycGxZM1JwYjI0N0NtMWhkRFFnWjJWMFgzQnlaWEJ5YjJwbFkzUnBiMjRvS1h0eVpYUjFjbTRnY0hKbGNISnZhbVZqZEdsdmJqdDlDblZ1YVdadmNtMGdZbTl2YkNCMWJtbG1iM0p0WDJOdmJHOXlPd3BpYjI5c0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eUtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUhabFl6UWdhR2xuYUdOc2FYQmZZMjlzYjNJN0NuWmxZelFnWjJWMFgyaHBaMmhqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUdocFoyaGpiR2x3WDJOdmJHOXlPMzBLZFc1cFptOXliU0IyWldNMElHZHNiM2RqYjJ4dmNqc0tkbVZqTkNCblpYUmZaMnh2ZDJOdmJHOXlLQ2w3Y21WMGRYSnVJR2RzYjNkamIyeHZjanQ5Q25WdWFXWnZjbTBnWW05dmJDQjBjbUZ1YzJadmNtMWZiV0Z5YTJWeU93cGliMjlzSUdkbGRGOTBjbUZ1YzJadmNtMWZiV0Z5YTJWeUtDbDdjbVYwZFhKdUlIUnlZVzV6Wm05eWJWOXRZWEpyWlhJN2ZRb0tDZ29LTHk4Z1VHVnlJR2x1YzNSaGJtTmxJR0YwZEhKcFluVjBaWE02SUFwcGJpQjJaV00wSUhOa1psOTFkanNLZG1Wak5DQm5aWFJmYzJSbVgzVjJLQ2w3Y21WMGRYSnVJSE5rWmw5MWRqdDlDbWx1SUhabFl6UWdkbVZ5ZEdWNFgyTnZiRzl5T3dwMlpXTTBJR2RsZEY5MlpYSjBaWGhmWTI5c2IzSW9LWHR5WlhSMWNtNGdkbVZ5ZEdWNFgyTnZiRzl5TzMwS2FXNGdkbVZqTWlCeGRXRmtYMjltWm5ObGREc0tkbVZqTWlCblpYUmZjWFZoWkY5dlptWnpaWFFvS1h0eVpYUjFjbTRnY1hWaFpGOXZabVp6WlhRN2ZRcHBiaUIyWldNeUlIRjFZV1JmYzJOaGJHVTdDblpsWXpJZ1oyVjBYM0YxWVdSZmMyTmhiR1VvS1h0eVpYUjFjbTRnY1hWaFpGOXpZMkZzWlR0OUNtbHVJSFpsWXpRZ1kyOXVkbVZ5ZEdWa1gzTjBjbTlyWldOdmJHOXlPd3AyWldNMElHZGxkRjlqYjI1MlpYSjBaV1JmYzNSeWIydGxZMjlzYjNJb0tYdHlaWFIxY200Z1kyOXVkbVZ5ZEdWa1gzTjBjbTlyWldOdmJHOXlPMzBLYVc0Z2RtVmpNaUIzWjJ4ZmNHOXphWFJwYjI1ek93cDJaV015SUdkbGRGOTNaMnhmY0c5emFYUnBiMjV6S0NsN2NtVjBkWEp1SUhkbmJGOXdiM05wZEdsdmJuTTdmUXBwYmlCMlpXTTBJR052Ym5abGNuUmxaRjl5YjNSaGRHbHZianNLZG1Wak5DQm5aWFJmWTI5dWRtVnlkR1ZrWDNKdmRHRjBhVzl1S0NsN2NtVjBkWEp1SUdOdmJuWmxjblJsWkY5eWIzUmhkR2x2Ymp0OUNtbHVJSFpsWXpNZ2JXRnlhMlZ5WDI5bVpuTmxkRHNLZG1Wak15Qm5aWFJmYldGeWEyVnlYMjltWm5ObGRDZ3BlM0psZEhWeWJpQnRZWEpyWlhKZmIyWm1jMlYwTzMwS0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCbWJHOWhkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x1ZERzS0NuVnVhV1p2Y20wZ2JXRjBOQ0J3Y205cVpXTjBhVzl1T3dwMWJtbG1iM0p0SUcxaGREUWdkbWxsZHpzS2RXNXBabTl5YlNCcGJuUWdkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNN0NuVnVhV1p2Y20wZ2RtVmpOQ0IxYm1sbWIzSnRYMk5zYVhCZmNHeGhibVZ6V3poZE93b0tkVzVwWm05eWJTQm1iRzloZENCaGRHeGhjMTkwWlhoZlpHbHRPd29LYjNWMElIWmxZelFnWm5KaFoxOWpiMnh2Y2pzS2IzVjBJSFpsWXpJZ1puSmhaMTkxZGpzS2IzVjBJR1pzYjJGMElHWnlZV2RmZFhaelkyRnNaVHNLYjNWMElHWnNiMkYwSUdaeVlXZGZaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaVHNLYjNWMElIWmxZelFnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdnN0NtOTFkQ0JtYkc5aGRDQnZYMk5zYVhCZlpHbHpkR0Z1WTJWYk9GMDdDbVpzWVhRZ2IzVjBJSFpsWXpRZ1puSmhaMTl6ZEhKdmEyVmpiMnh2Y2pzS0NtWnNZWFFnYjNWMElIVnBiblFnWm5KaFoxOXBibk4wWVc1alpWOXBaRHNLWm14aGRDQnZkWFFnZG1Wak1pQm1YM053Y21sMFpWOXpZMkZzWlRzS0NpTmtaV1pwYm1VZ1FVNVVTVUZNU1VGVFgxSkJSRWxWVXlBd0xqZ0tDZ3B0WVhRMElIRnRZWFFvZG1Wak5DQnhkV0YwS1hzS0lDQWdJR1pzYjJGMElHNTFiU0E5SUhGMVlYUXVlQ0FxSURJdU1Ec0tJQ0FnSUdac2IyRjBJRzUxYlRJZ1BTQnhkV0YwTG5rZ0tpQXlMakE3Q2lBZ0lDQm1iRzloZENCdWRXMHpJRDBnY1hWaGRDNTZJQ29nTWk0d093b2dJQ0FnWm14dllYUWdiblZ0TkNBOUlIRjFZWFF1ZUNBcUlHNTFiVHNLSUNBZ0lHWnNiMkYwSUc1MWJUVWdQU0J4ZFdGMExua2dLaUJ1ZFcweU93b2dJQ0FnWm14dllYUWdiblZ0TmlBOUlIRjFZWFF1ZWlBcUlHNTFiVE03Q2lBZ0lDQm1iRzloZENCdWRXMDNJRDBnY1hWaGRDNTRJQ29nYm5WdE1qc0tJQ0FnSUdac2IyRjBJRzUxYlRnZ1BTQnhkV0YwTG5nZ0tpQnVkVzB6T3dvZ0lDQWdabXh2WVhRZ2JuVnRPU0E5SUhGMVlYUXVlU0FxSUc1MWJUTTdDaUFnSUNCbWJHOWhkQ0J1ZFcweE1DQTlJSEYxWVhRdWR5QXFJRzUxYlRzS0lDQWdJR1pzYjJGMElHNTFiVEV4SUQwZ2NYVmhkQzUzSUNvZ2JuVnRNanNLSUNBZ0lHWnNiMkYwSUc1MWJURXlJRDBnY1hWaGRDNTNJQ29nYm5WdE16c0tJQ0FnSUhKbGRIVnliaUJ0WVhRMEtBb2dJQ0FnSUNBZ0lDZ3hMakFnTFNBb2JuVnROU0FySUc1MWJUWXBLU3dnS0c1MWJUY2dLeUJ1ZFcweE1pa3NJQ0FnSUNBZ0lDQW9iblZ0T0NBdElHNTFiVEV4S1N3Z0lDQWdJQ0FnSURBdU1Dd0tJQ0FnSUNBZ0lDQW9iblZ0TnlBdElHNTFiVEV5S1N3Z0lDQWdJQ0FnSUNneExqQWdMU0FvYm5WdE5DQXJJRzUxYlRZcEtTd2dLRzUxYlRrZ0t5QnVkVzB4TUNrc0lDQWdJQ0FnSUNBd0xqQXNDaUFnSUNBZ0lDQWdLRzUxYlRnZ0t5QnVkVzB4TVNrc0lDQWdJQ0FnSUNBb2JuVnRPU0F0SUc1MWJURXdLU3dnSUNBZ0lDQWdJQ2d4TGpBZ0xTQW9iblZ0TkNBcklHNTFiVFVwS1N3Z01DNHdMQW9nSUNBZ0lDQWdJREF1TUN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ01DNHdMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F3TGpBc0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lERXVNQW9nSUNBZ0tUc0tmUW9LWm14dllYUWdaR2x6ZEdGdVkyVm1hV1ZzWkY5elkyRnNaU2dwZXdvZ0lDQWdMeThnUjJ4NWNHZ2daR2x6ZEdGdVkyVWdabWxsYkdRZ2RXNXBkSE1nWVhKbElHbHVJSEJwZUdWc2N6c2dZMjl1ZG1WeWRDQjBieUJrYVcxbGJuTnBiMjVzWlhOekNpQWdJQ0F2THlCNExXTnZiM0prYVc1aGRHVWdiMllnZEdWNGRIVnlaU0JwYm5OMFpXRmtJR1p2Y2lCamIyNXphWE4wWlc1amVTQjNhWFJvSUhCeWIyZHlZVzF0WVhScFl5QjFkZ29nSUNBZ0x5OGdaR2x6ZEdGdVkyVWdabWxsYkdSeklHbHVJR1p5WVdkdFpXNTBJSE5vWVdSbGNpNGdVMlZsSUdGc2MyOGdZMjl0YldWdWRITWdZbVZzYjNjdUNpQWdJQ0IyWldNMElIVjJYM0psWTNRZ1BTQm5aWFJmYzJSbVgzVjJLQ2s3Q2lBZ0lDQm1iRzloZENCd2FYaHphWHBsWDNnZ1BTQW9kWFpmY21WamRDNTZJQzBnZFhaZmNtVmpkQzU0S1NBcUlHZGxkRjloZEd4aGMxOTBaWGgwZFhKbFgzTnBlbVVvS1RzS0lDQWdJSEpsZEhWeWJpQXRNUzR3TDNCcGVITnBlbVZmZURzS2ZRb0tkbVZqTXlCMGIzWmxZek1vZG1Wak1pQjJLWHR5WlhSMWNtNGdkbVZqTXloMkxDQXdMakFwTzMwS2RtVmpNeUIwYjNabFl6TW9kbVZqTXlCMktYdHlaWFIxY200Z2RqdDlDZ3AyWldNMElIUnZkbVZqTkNoMlpXTXpJSFlwZTNKbGRIVnliaUIyWldNMEtIWXNJREV1TUNrN2ZRcDJaV00wSUhSdmRtVmpOQ2gyWldNMElIWXBlM0psZEhWeWJpQjJPMzBLZG1Wak5DQjBiM1psWXpRb1ltOXZiQ0IyS1NCN0NpQWdJQ0J5WlhSMWNtNGdkbVZqTkNnd0xqQXBPd3A5Q2dwdFlYUXlJR1JwWVdkdEtIWmxZeklnZGlsN0NpQWdJQ0J5WlhSMWNtNGdiV0YwTWloMkxuZ3NJREF1TUN3Z01DNHdMQ0IyTG5rcE93cDlDZ3BtYkc5aGRDQmZaR1YwWlhKdGFXNWhiblFvYldGME1pQnRLU0I3Q2lBZ2NtVjBkWEp1SUcxYk1GMWJNRjBnS2lCdFd6RmRXekZkSUMwZ2JWc3dYVnN4WFNBcUlHMWJNVjFiTUYwN0NuMEtDblp2YVdRZ2NISnZZMlZ6YzE5amJHbHdYM0JzWVc1bGN5aDJaV016SUhkdmNteGtYM0J2Y3lrZ2V3b2dJQ0FnWm05eUlDaHBiblFnYVNBOUlEQTdJR2tnUENCMWJtbG1iM0p0WDI1MWJWOWpiR2x3WDNCc1lXNWxjenNnYVNzcktRb2dJQ0FnSUNBZ0lHOWZZMnhwY0Y5a2FYTjBZVzVqWlZ0cFhTQTlJR1J2ZENoM2IzSnNaRjl3YjNNc0lIVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYTmJhVjB1ZUhsNktTQXRJSFZ1YVdadmNtMWZZMnhwY0Y5d2JHRnVaWE5iYVYwdWR6c0tmUW9LZG05cFpDQnRZV2x1S0NsN0NpQWdJQ0F2THlCblpYUmZjRzl6S0NrZ2NtVjBkWEp1Y3lCMGFHVWdjRzl6YVhScGIyNGdiMllnZEdobElITmpZWFIwWlhJZ2JXRnlhMlZ5Q2lBZ0lDQXZMeUJuWlhSZmNHOXphWFJwYjI0b0tTQnlaWFIxY201eklIUm9aU0FvY21Wc1lYUnBkbVVwSUhCdmMybDBhVzl1SUc5bUlIUm9aU0JqZFhKeVpXNTBJSEYxWVdRZ2RtVnlkR1Y0Q2dvZ0lDQWdkbVZqTXlCbU16SmpYM05qWVd4bElEMGdaMlYwWDJZek1tTmZjMk5oYkdVb0tUc0tJQ0FnSUhabFl6SWdiWE1nUFNCbU16SmpYM05qWVd4bExuaDVJQ29nWjJWMFgzRjFZV1JmYzJOaGJHVW9LVHNLSUNBZ0lIWmxZeklnY1hWaFpGOXZabVp6WlhRZ1BTQm1NekpqWDNOallXeGxMbmg1SUNvZ1oyVjBYM0YxWVdSZmIyWm1jMlYwS0NrN0NpQWdJQ0IyWldNeklHMWhjbXRsY2w5dlptWnpaWFFnUFNCbU16SmpYM05qWVd4bElDb2dkRzkyWldNektHZGxkRjl0WVhKclpYSmZiMlptYzJWMEtDa3BPd29LSUNBZ0lIWmxZeklnWW1KdmVGOXlZV1JwZFhNZ1BTQXdMalVnS2lCdGN6c0tJQ0FnSUhabFl6SWdjM0J5YVhSbFgySmliM2hmWTJWdWRISmxJRDBnY1hWaFpGOXZabVp6WlhRZ0t5QmlZbTk0WDNKaFpHbDFjenNLSUNBZ0lHWmZjM0J5YVhSbFgzTmpZV3hsSUQwZ2JYTTdDaUFnSUNCdFlYUTBJSEIyYVdWM0lEMGdjSEp2YW1WamRHbHZiaUFxSUhacFpYYzdDaUFnSUNCdFlYUTBJSFJ5WVc1eklEMGdaMlYwWDNSeVlXNXpabTl5YlY5dFlYSnJaWElvS1NBL0lHMXZaR1ZzWDJZek1tTWdPaUJ0WVhRMEtERXVNQ2s3Q2dvZ0lDQWdkbVZqTkNCd2IzTnBkR2x2Ymw5M2IzSnNaQ0E5SUcxdlpHVnNYMll6TW1NZ0tpQjJaV00wS0hSdmRtVmpNeWhuWlhSZmQyZHNYM0J2YzJsMGFXOXVjeWdwS1N3Z01TazdDaUFnSUNCd2NtOWpaWE56WDJOc2FYQmZjR3hoYm1WektIQnZjMmwwYVc5dVgzZHZjbXhrTG5oNWVpazdDZ29nSUNBZ0x5OGdRMjl0Y0hWMFpTQmpaVzUwY21VZ2IyWWdZbWxzYkdKdllYSmtJR2x1SUdOc2FYQndhVzVuSUdOdmIzSmthVzVoZEdWekNpQWdJQ0F2THlCQmJIZGhlWE1nZEhKaGJuTm1iM0p0SUhSbGVIUXZjMk5oZEhSbGNpQndiM05wZEdsdmJpQmhjbWQxYldWdWRBb2dJQ0FnZG1Wak5DQmtZWFJoWDNCdmFXNTBJRDBnWjJWMFgzQnlaWEJ5YjJwbFkzUnBiMjRvS1NBcUlIQnZjMmwwYVc5dVgzZHZjbXhrT3dvZ0lDQWdMeThnYldGNVltVWdkSEpoYm5ObWIzSnRJRzFoY210bGNsOXZabVp6WlhRZ0t5Qm5iSGx3YUNCdlptWnpaWFJ6Q2lBZ0lDQmtZWFJoWDNCdmFXNTBJRDBnZG1Wak5DaGtZWFJoWDNCdmFXNTBMbmg1ZWlBdklHUmhkR0ZmY0c5cGJuUXVkeUFySUcxaGRETW9kSEpoYm5NcElDb2diV0Z5YTJWeVgyOW1abk5sZEN3Z01TazdDaUFnSUNCa1lYUmhYM0J2YVc1MElEMGdjSFpwWlhjZ0tpQmtZWFJoWDNCdmFXNTBPd29LSUNBZ0lDOHZJRU52YlhCMWRHVWdkSEpoYm5ObWIzSnRJR1p2Y2lCMGFHVWdiMlptYzJWMElIWmxZM1J2Y25NZ1puSnZiU0IwYUdVZ1kyVnVkSEpoYkNCd2IybHVkQW9nSUNBZ2RISmhibk1nUFNBb1oyVjBYMkpwYkd4aWIyRnlaQ2dwSUQ4Z2NISnZhbVZqZEdsdmJpQTZJSEIyYVdWM0tTQXFJSEZ0WVhRb1oyVjBYMk52Ym5abGNuUmxaRjl5YjNSaGRHbHZiaWdwS1NBcUlIUnlZVzV6T3dvZ0lDQWdkbVZqTkNCemNISnBkR1ZmWTJWdWRHVnlJRDBnZEhKaGJuTWdLaUIyWldNMEtITndjbWwwWlY5aVltOTRYMk5sYm5SeVpTd2dNQ3dnTUNrN0Nnb2dJQ0FnZG1Wak5DQjJZMnhwY0NBOUlHUmhkR0ZmY0c5cGJuUWdLeUJ6Y0hKcGRHVmZZMlZ1ZEdWeU93b0tJQ0FnSUM4dklFVjRkSEpoSUdKMVptWmxjbWx1WnlCcGN5QnlaWEYxYVhKbFpDQmhjbTkxYm1RZ2MzQnlhWFJsY3lCM2FHbGphQ0JoY21VZ1lXNTBhV0ZzYVdGelpXUWdjMjhnZEdoaGRBb2dJQ0FnTHk4Z2RHaGxJR0Z1ZEdsaGJHbGhjeUJpYkhWeUlHUnZaWE51SjNRZ1oyVjBJR04xZENCdlptWWdLSE5sWlNBak1UVXBMaUJVYUdseklHSnNkWElnWm1Gc2JITWdkRzhLSUNBZ0lDOHZJSHBsY204Z1lYUWdZU0J5WVdScGRYTWdiMllnUVU1VVNVRk1TVUZUWDFKQlJFbFZVeUJ3YVhobGJITWdhVzRnZEdobElIWnBaWGR3YjNKMElHTnZiM0prYVc1aGRHVnpDaUFnSUNBdkx5QmhibVFnZDJVZ2QyRnVkQ0IwYnlCaWRXWm1aWElnZEdobElIWmxjblJwWTJWeklHbHVJSFJvWlNBcWMyOTFjbU5sS2lCemNISnBkR1VnWTI5dmNtUnBibUYwWlFvZ0lDQWdMeThnYzNsemRHVnRJSE52SUhSb1lYUWdkMlVnWjJWMElIUm9hWE1nWVcxdmRXNTBJR2x1SUhSb1pTQnZkWFJ3ZFhRZ1kyOXZjbVJwYm1GMFpYTXVDaUFnSUNBdkx3b2dJQ0FnTHk4Z1NHVnlaU0IzWlNCallXeGpkV3hoZEdVZ2RHaGxJR1JsY21sMllYUnBkbVVnYjJZZ2RHaGxJRzFoY0hCcGJtY2dabkp2YlNCemNISnBkR1VnZUhrS0lDQWdJQzh2SUdOdmIzSmthVzVoZEdWeklDaGtaV1pwYm1Wa0lHSjVJR0IwY21GdWMyQXBJR2x1ZEc4Z2RHaGxJSFpwWlhkd2IzSjBJSEJwZUdWc0lHTnZiM0prYVc1aGRHVnpMZ29nSUNBZ0x5OGdWR2hsSUdSbGNtbDJZWFJwZG1VZ2JtVmxaSE1nZEc4Z2FXNWpiSFZrWlNCMGFHVWdjSEp2Y0dWeUlIUmxjbTBnWm05eUlIUm9aU0J3WlhKemNHVmpkR2wyWlFvZ0lDQWdMeThnWkdsMmFXUmxJR2x1ZEc4Z1RrUkRMQ0JsZG1Gc2RXRjBaV1FnWVhRZ2RHaGxJR05sYm5SeVpTQndiMmx1ZENCZ2RtTnNhWEJnTGdvZ0lDQWdiV0YwTkNCa1gyNWtZMTlrWDJOc2FYQWdQU0J0WVhRMEtBb2dJQ0FnSUNBZ0lERXVNQzkyWTJ4cGNDNTNMQ0F3TGpBc0lDQWdJQ0FnSUNBZ01DNHdMQ0FnSUNBZ0lDQWdJREF1TUN3S0lDQWdJQ0FnSUNBd0xqQXNJQ0FnSUNBZ0lDQWdNUzR3TDNaamJHbHdMbmNzSURBdU1Dd2dJQ0FnSUNBZ0lDQXdMakFzQ2lBZ0lDQWdJQ0FnTUM0d0xDQWdJQ0FnSUNBZ0lEQXVNQ3dnSUNBZ0lDQWdJQ0F4TGpBdmRtTnNhWEF1ZHl3Z01DNHdMQW9nSUNBZ0lDQWdJQzEyWTJ4cGNDNTRlWG92S0haamJHbHdMbmNxZG1Oc2FYQXVkeWtzSUNBZ0lDQWdJQ0FnSURBdU1Bb2dJQ0FnS1RzS0lDQWdJRzFoZERJZ1pIaDVkbDlrZUhseklEMGdaR2xoWjIwb01DNDFJQ29nY0hoZmNHVnlYM1Z1YVhRZ0tpQm5aWFJmY21WemIyeDFkR2x2YmlncEtTQXFJRzFoZERJb1pGOXVaR05mWkY5amJHbHdLblJ5WVc1ektUc0tJQ0FnSUM4dklFNXZkeXdnYjNWeUlHSjFabVpsY2lCemFYcGxJR2x6SUdWNGNISmxjM05sWkNCcGJpQjJhV1YzY0c5eWRDQndhWGhsYkhNZ1luVjBJSGRsSUdkbGRDQmlZV05ySUhSdkNpQWdJQ0F2THlCMGFHVWdjM0J5YVhSbElHTnZiM0prYVc1aGRHVWdjM2x6ZEdWdElIVnphVzVuSUhSb1pTQnpZMkZzWlNCbVlXTjBiM0lnYjJZZ2RHaGxDaUFnSUNBdkx5QjBjbUZ1YzJadmNtMWhkR2x2YmlBb1ptOXlJR2x6YjNSeWIzQnBZeUIwY21GdWMyWnZjbTFoZEdsdmJuTXBMaUJHYjNJZ1lXNXBjMjkwY205d2FXTUtJQ0FnSUM4dklIUnlZVzV6Wm05eWJXRjBhVzl1Y3l3Z2RHaGxJR2RsYjIxbGRISnBZeUJ0WldGdUlHOW1JSFJvWlNCMGQyOGdjSEpwYm1OcGNHeGxJSE5qWVd4bElHWmhZM1J2Y25NS0lDQWdJQzh2SUdseklHRWdjbVZoYzI5dVlXSnNaU0JqYjIxd2NtOXRhWE5sT2dvZ0lDQWdabXh2WVhRZ2RtbGxkM0J2Y25SZlpuSnZiVjl6Y0hKcGRHVmZjMk5oYkdVZ1BTQnpjWEowS0dGaWN5aGZaR1YwWlhKdGFXNWhiblFvWkhoNWRsOWtlSGx6S1NrcE93b0tJQ0FnSUM4dklFbHVJSFJvWlNCbWNtRm5iV1Z1ZENCemFHRmtaWElnZDJVZ2QyRnVkQ0J2ZFhJZ2MybG5ibVZrSUdScGMzUmhibU5sSUdsdUlIWnBaWGR3YjNKMElDaHdhWGhsYkNrS0lDQWdJQzh2SUdOdmIzSmtjeUJtYjNJZ1pHbHlaV04wSUhWelpTQnBiaUJoYm5ScFlXeHBZWE5wYm1jZ2MzUmxjQ0JtZFc1amRHbHZibk11SUZkbElIUm9aWEpsWm05eVpTQnVaV1ZrQ2lBZ0lDQXZMeUJoSUhOallXeHBibWNnWm1GamRHOXlJSE5wYldsc1lYSWdkRzhnZG1sbGQzQnZjblJmWm5KdmJWOXpjSEpwZEdWZmMyTmhiR1VzSUdKMWRDQnBibU5zZFdScGJtY0tJQ0FnSUM4dklIUm9aU0IxZGkwK2MzQnlhWFJsSUdOdmIzSmthVzVoZEdVZ2MzbHpkR1Z0SUhOallXeHBibWNnWm1GamRHOXlJR0Z6SUhkbGJHd3VJQ0JYWlNCamFHOXZjMlVnZEc4S0lDQWdJQzh2SUhWelpTQjBhR1VnWW05MWJtUnBibWNnWW05NElDcDRLaUIzYVdSMGFDQm1iM0lnZEdocGN5NGdWR2hwY3lCamIyMWxjeUIzYVhSb0lITnZiV1VLSUNBZ0lDOHZJR052Ym5OcGMzUmxibU41SUdOdmJtUnBkR2x2Ym5NNkNpQWdJQ0F2THlBcUlFWnZjaUJ3Y205alpXUjFjbUZzSUdScGMzUmhibU5sSUdacFpXeGtjeXdnZDJVZ2JtVmxaQ0IwYUdVZ2MzQnlhWFJsSUdKdmRXNWthVzVuSUdKdmVDQjBieUJpWlFvZ0lDQWdMeThnSUNCemNYVmhjbVV1SUNoSlppQnViM1FzSUhSb1pTQjFkaUJqYjI5eVpHbHVZWFJsY3lCM2FXeHNJR0psSUdGdWFYTnZkSEp2Y0dsallXeHNlU0J6WTJGc1pXUWdZVzVrQ2lBZ0lDQXZMeUFnSUdGdWVTQmpZV3hqZFd4aGRHbHZiaUJpWVhObFpDQnZiaUIwYUdWdElIZHBiR3dnYm05MElHSmxJR0VnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjR1S1FvZ0lDQWdMeThnS2lCR2IzSWdjMkZ0Y0d4bFpDQmthWE4wWVc1alpTQm1hV1ZzWkhNc0lIZGxJRzVsWldRZ2RHOGdZMjl1YzJsemRHVnVkR3g1SUdOb2IyOXpaU0IwYUdVZ0tuZ3FDaUFnSUNBdkx5QWdJR1p2Y2lCMGFHVWdjMk5oYkdsdVp5QnBiaUJuWlhSZlpHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pTZ3BMZ29nSUNBZ1pteHZZWFFnYzNCeWFYUmxYMlp5YjIxZmRWOXpZMkZzWlNBOUlHMXBiaWhoWW5Nb2JYTXVlQ2tzSUdGaWN5aHRjeTU1S1NrN0NpQWdJQ0JtY21GblgzVjJjMk5oYkdVZ1BTQjJhV1YzY0c5eWRGOW1jbTl0WDNOd2NtbDBaVjl6WTJGc1pTQXFJSE53Y21sMFpWOW1jbTl0WDNWZmMyTmhiR1U3Q2lBZ0lDQm1jbUZuWDJScGMzUmhibU5sWm1sbGJHUmZjMk5oYkdVZ1BTQmthWE4wWVc1alpXWnBaV3hrWDNOallXeGxLQ2s3Q2dvZ0lDQWdMeThnWVdSa0lIQmhaR1JwYm1jZ1ptOXlJRUZCTENCemRISnZhMlVnWVc1a0lHZHNiM2NnS0c1dmJpQnVZWFJwZG1VZ1pHbHpkR0Z1WTJWbWFXVnNaSE1nWkc5dUozUWdibVZsWkFvZ0lDQWdMeThnUVVFZ2NHRmtaR2x1WnlCaWRYUWdRMGxTUTB4RklHVjBZeUJrYnlrS0lDQWdJR1pzYjJGMElIQndkU0E5SUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwT3dvZ0lDQWdabXh2WVhRZ1ltSnZlRjlpZFdZZ1BTQW9DaUFnSUNBZ0lDQWdRVTVVU1VGTVNVRlRYMUpCUkVsVlV5QXJJRzFoZUNnd0xqQXNJR2RsZEY5emRISnZhMlYzYVdSMGFDZ3BJQ29nY0hCMUtTQXJJRzFoZUNnd0xqQXNJR2RsZEY5bmJHOTNkMmxrZEdnb0tTQXFJSEJ3ZFNrS0lDQWdJQ2tnTHlCMmFXVjNjRzl5ZEY5bWNtOXRYM053Y21sMFpWOXpZMkZzWlRzS0lDQWdJQzh2SUUxMWJIUnBjR3g1SUhSb1pTQmlkV1ptWlhJZ1lua2djMmxuYmloaVltOTRYM0poWkdsMWN5a2djMjhnZEdoaGRDQnRZWEpyWlhKemFYcGxJRDA5SURBZ1kyeGxZVzVzZVFvZ0lDQWdMeThnWTI5c2JHRndjMlZ6SUhSb1pTQndZV1JrWldRZ1ltSnZlQ0IwYnlCNlpYSnZJQ2d3S2tsdVppQTlQU0JPWVU0Z2NISnZjR0ZuWVhSbGN5QjBieUJuYkY5UWIzTnBkR2x2YmdvZ0lDQWdMeThnWVc1a0lHZGxkSE1nWTNWc2JHVmtLUzRnVjJsMGFHOTFkQ0IwYUdsekxDQnRZWEpyWlhKemFYcGxJRDA5SURBZ2QyOTFiR1FnY0hKdlpIVmpaU0IyYVhOcFlteGxJRUZCQ2lBZ0lDQXZMeUJ3WVdSa2FXNW5MQ0J0WVhSamFHbHVaeUJIVEUxaGEybGxKM01nWjJWdmJXVjBjbmtnYzJoaFpHVnlJR0psYUdGMmFXOXlMZ29nSUNBZ2RtVmpNaUJ3WVdSa1pXUmZZbUp2ZUY5emFYcGxJRDBnWW1KdmVGOXlZV1JwZFhNZ0t5QnphV2R1S0dKaWIzaGZjbUZrYVhWektTQXFJR0ppYjNoZlluVm1Pd29nSUNBZ2RtVmpNaUIxZGw5d1lXUmZjMk5oYkdVZ1BTQndZV1JrWldSZlltSnZlRjl6YVhwbElDOGdZbUp2ZUY5eVlXUnBkWE03Q2dvZ0lDQWdabkpoWjE5amIyeHZjaUE5SUhSdmRtVmpOQ2huWlhSZmRtVnlkR1Y0WDJOdmJHOXlLQ2twT3dvZ0lDQWdabkpoWjE5emRISnZhMlZqYjJ4dmNpQTlJSFJ2ZG1Wak5DaG5aWFJmWTI5dWRtVnlkR1ZrWDNOMGNtOXJaV052Ykc5eUtDa3BPd29nSUNBZ1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZ2dQU0JuWlhSZmMyUm1YM1YyS0NrN0NpQWdJQ0F2THlCblpYUmZkWFlvS1NCeVpYUjFjbTV6SUNnd0xDQXdLU3dnS0RFc0lEQXBMQ0FvTUN3Z01Ta2diM0lnS0RFc0lERXBDaUFnSUNBdkx5QjBieUJoWTJOdmJXOWtZWFJsSUhOMGNtOXJaU0JoYm1RZ1oyeHZkM2RwWkhSb0lIZGxJRzVsWldRZ2RHOGdaWGgwY25Wa1pTQjFkaWR6SUc5MWRIZGhjbVJ6SUdaeWIyMGdLREF1TlN3Z01DNDFLUW9nSUNBZ1puSmhaMTkxZGlBOUlIWmxZeklvTUM0MUtTQXJJQ2huWlhSZmRYWW9LU0F0SUhabFl6SW9NQzQxS1NrZ0tpQjFkbDl3WVdSZmMyTmhiR1U3Q2dvZ0lDQWdMeThnYzJOeVpXVnVJSE53WVdObElHTnZiM0prYVc1aGRHVnpJRzltSUhSb1pTQndiM05wZEdsdmJnb2dJQ0FnZG1Wak5DQnhkV0ZrWDNabGNuUmxlQ0E5SUNoMGNtRnVjeUFxSUhabFl6UW9NaTR3SUNvZ2NHRmtaR1ZrWDJKaWIzaGZjMmw2WlNBcUlHZGxkRjl3YjNOcGRHbHZiaWdwTENBd0xqQXNJREF1TUNrcE93b2dJQ0FnWjJ4ZlVHOXphWFJwYjI0Z1BTQjJZMnhwY0NBcklIRjFZV1JmZG1WeWRHVjRPd29nSUNBZ1oyeGZVRzl6YVhScGIyNHVlaUFyUFNCbmJGOVFiM05wZEdsdmJpNTNJQ29nWjJWMFgyUmxjSFJvWDNOb2FXWjBLQ2s3Q2dvZ0lDQWdabkpoWjE5cGJuTjBZVzVqWlY5cFpDQTlJSFZwYm5Rb1oyeGZTVzV6ZEdGdVkyVkpSQ2s3Q24wS0NxOW1jbUZuYldWdWRGOXpiM1Z5WTJYYUpSNEtjSEpsWTJsemFXOXVJR2hwWjJod0lHbHVkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR1pzYjJGME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pKRU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2MyRnRjR3hsY2pORU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2FYTmhiWEJzWlhJeVJEc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHbHpZVzF3YkdWeU0wUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQjFjMkZ0Y0d4bGNqSkVPd3B3Y21WamFYTnBiMjRnYUdsbmFIQWdkWE5oYlhCc1pYSXpSRHNLQ205MWRDQjJaV00wSUdaeVlXZHRaVzUwWDJOdmJHOXlPd29LTHk4Z1ZXNXBabTl5YlhNNklBcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNtMWhjRHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNtMWhjQ2dwZTNKbGRIVnliaUIxYm1sbWIzSnRYMk52Ykc5eWJXRndPMzBLZFc1cFptOXliU0IxYVc1MElHOWlhbVZqZEY5cFpEc0tkV2x1ZENCblpYUmZiMkpxWldOMFgybGtLQ2w3Y21WMGRYSnVJRzlpYW1WamRGOXBaRHQ5Q25WdWFXWnZjbTBnYldGME5DQnRiMlJsYkY5bU16SmpPd3B0WVhRMElHZGxkRjl0YjJSbGJGOW1NekpqS0NsN2NtVjBkWEp1SUcxdlpHVnNYMll6TW1NN2ZRcDFibWxtYjNKdElHbHVkQ0J6WkdaZmJXRnlhMlZ5WDNOb1lYQmxPd3BwYm5RZ1oyVjBYM05rWmw5dFlYSnJaWEpmYzJoaGNHVW9LWHR5WlhSMWNtNGdjMlJtWDIxaGNtdGxjbDl6YUdGd1pUdDlDblZ1YVdadmNtMGdabXh2WVhRZ1oyeHZkM2RwWkhSb093cG1iRzloZENCblpYUmZaMnh2ZDNkcFpIUm9LQ2w3Y21WMGRYSnVJR2RzYjNkM2FXUjBhRHQ5Q25WdWFXWnZjbTBnWm14dllYUWdZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxPd3BtYkc5aGRDQm5aWFJmWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsS0NsN2NtVjBkWEp1SUdGMGJHRnpYM1JsZUhSMWNtVmZjMmw2WlR0OUNuVnVhV1p2Y20wZ1ltOXZiQ0J3WVhSMFpYSnVPd3BpYjI5c0lHZGxkRjl3WVhSMFpYSnVLQ2w3Y21WMGRYSnVJSEJoZEhSbGNtNDdmUXAxYm1sbWIzSnRJR0p2YjJ3Z2NHbGphMmx1WnpzS1ltOXZiQ0JuWlhSZmNHbGphMmx1WnlncGUzSmxkSFZ5YmlCd2FXTnJhVzVuTzMwS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aVHNLWW05dmJDQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsS0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnY0hoZmNHVnlYM1Z1YVhRN0NtWnNiMkYwSUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwZTNKbGRIVnliaUJ3ZUY5d1pYSmZkVzVwZER0OUNuVnVhV1p2Y20wZ2MyRnRjR3hsY2pKRUlHUnBjM1JoYm1ObFptbGxiR1E3Q25WdWFXWnZjbTBnZG1Wak5DQnVZVzVmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMjVoYmw5amIyeHZjaWdwZTNKbGRIVnliaUJ1WVc1ZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdac2IyRjBJSE4wY205clpYZHBaSFJvT3dwbWJHOWhkQ0JuWlhSZmMzUnliMnRsZDJsa2RHZ29LWHR5WlhSMWNtNGdjM1J5YjJ0bGQybGtkR2c3ZlFwMWJtbG1iM0p0SUhabFl6TWdaak15WTE5elkyRnNaVHNLZG1Wak15Qm5aWFJmWmpNeVkxOXpZMkZzWlNncGUzSmxkSFZ5YmlCbU16SmpYM05qWVd4bE8zMEtkVzVwWm05eWJTQjJaV015SUhKbGMyOXNkWFJwYjI0N0NuWmxZeklnWjJWMFgzSmxjMjlzZFhScGIyNG9LWHR5WlhSMWNtNGdjbVZ6YjJ4MWRHbHZianQ5Q25WdWFXWnZjbTBnWm14dllYUWdaR1Z3ZEdoZmMyaHBablE3Q21ac2IyRjBJR2RsZEY5a1pYQjBhRjl6YUdsbWRDZ3BlM0psZEhWeWJpQmtaWEIwYUY5emFHbG1kRHQ5Q25WdWFXWnZjbTBnZG1Wak5DQnNiM2RqYkdsd1gyTnZiRzl5T3dwMlpXTTBJR2RsZEY5c2IzZGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR3h2ZDJOc2FYQmZZMjlzYjNJN2ZRcDFibWxtYjNKdElHSnZiMndnWW1sc2JHSnZZWEprT3dwaWIyOXNJR2RsZEY5aWFXeHNZbTloY21Rb0tYdHlaWFIxY200Z1ltbHNiR0p2WVhKa08zMEtkVzVwWm05eWJTQnRZWFEwSUhCeVpYQnliMnBsWTNScGIyNDdDbTFoZERRZ1oyVjBYM0J5WlhCeWIycGxZM1JwYjI0b0tYdHlaWFIxY200Z2NISmxjSEp2YW1WamRHbHZianQ5Q25WdWFXWnZjbTBnWW05dmJDQjFibWxtYjNKdFgyTnZiRzl5T3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXlLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNJN2ZRcDFibWxtYjNKdElIWmxZelFnYUdsbmFHTnNhWEJmWTI5c2IzSTdDblpsWXpRZ1oyVjBYMmhwWjJoamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHaHBaMmhqYkdsd1gyTnZiRzl5TzMwS2RXNXBabTl5YlNCMlpXTTBJR2RzYjNkamIyeHZjanNLZG1Wak5DQm5aWFJmWjJ4dmQyTnZiRzl5S0NsN2NtVjBkWEp1SUdkc2IzZGpiMnh2Y2p0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IwY21GdWMyWnZjbTFmYldGeWEyVnlPd3BpYjI5c0lHZGxkRjkwY21GdWMyWnZjbTFmYldGeWEyVnlLQ2w3Y21WMGRYSnVJSFJ5WVc1elptOXliVjl0WVhKclpYSTdmUW9LY0hKbFkybHphVzl1SUdocFoyaHdJR1pzYjJGME93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2FXNTBPd29LYVc0Z2RtVmpOQ0JtY21GblgyTnZiRzl5T3dwcGJpQjJaV015SUdaeVlXZGZkWFk3Q2dvalpHVm1hVzVsSUVOSlVrTk1SU0FnSUNBZ0lDQWdJQ0FnSURBS0kyUmxabWx1WlNCU1JVTlVRVTVIVEVVZ0lDQWdJQ0FnSUNBeENpTmtaV1pwYm1VZ1VrOVZUa1JGUkY5U1JVTlVRVTVIVEVVZ01nb2paR1ZtYVc1bElFUkpVMVJCVGtORlJrbEZURVFnSUNBZ0lETUtJMlJsWm1sdVpTQlVVa2xCVGtkTVJTQWdJQ0FnSUNBZ0lDQTBDZ29qWkdWbWFXNWxJRTFmVTFGU1ZGOHlJQ0FnSUNBZ0lDQWdJREV1TkRFME1qRXpOUW9LQ2k4dklFaGhiR1lnZDJsa2RHZ2diMllnWVc1MGFXRnNhV0Z6YVc1bklITnRiMjkwYUhOMFpYQUtJMlJsWm1sdVpTQkJUbFJKUVV4SlFWTmZVa0ZFU1ZWVElEQXVOekEzTVRBMk56Z3hNVGcyTlRRM05nb0thVzRnWm14dllYUWdabkpoWjE5MWRuTmpZV3hsT3dwcGJpQm1iRzloZENCbWNtRm5YMlJwYzNSaGJtTmxabWxsYkdSZmMyTmhiR1U3Q21sdUlIWmxZelFnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdnN0NtWnNZWFFnYVc0Z2RXbHVkQ0JtY21GblgybHVjM1JoYm1ObFgybGtPd3BwYmlCbWJHOWhkQ0J2WDJOc2FYQmZaR2x6ZEdGdVkyVmJPRjA3Q21ac1lYUWdhVzRnZG1Wak1pQm1YM053Y21sMFpWOXpZMkZzWlRzS1pteGhkQ0JwYmlCMlpXTTBJR1p5WVdkZmMzUnliMnRsWTI5c2IzSTdDZ3AxYm1sbWIzSnRJR2x1ZENCMWJtbG1iM0p0WDI1MWJWOWpiR2x3WDNCc1lXNWxjenNLQ2k4dklGUm9aWE5sSUhabGNuTnBiMjV6SUc5bUlHRmhjM1JsY0NCaGMzTjFiV1VnZEdoaGRDQmdaR2x6ZEdBZ2FYTWdZU0J6YVdkdVpXUWdaR2x6ZEdGdVkyVWdablZ1WTNScGIyNEtMeThnZDJocFkyZ2dhR0Z6SUdKbFpXNGdjMk5oYkdWa0lIUnZJR0psSUdsdUlIVnVhWFJ6SUc5bUlIQnBlR1ZzY3k0S1pteHZZWFFnWVdGemRHVndLR1pzYjJGMElIUm9jbVZ6YUc5c1pERXNJR1pzYjJGMElHUnBjM1FzSUdac2IyRjBJR0ZoS1NCN0NpQWdJQ0J5WlhSMWNtNGdjMjF2YjNSb2MzUmxjQ2gwYUhKbGMyaHZiR1F4SUMwZ1lXRXNJSFJvY21WemFHOXNaREVnS3lCaFlTd2daR2x6ZENrN0NuMEtDbVpzYjJGMElHRmhjM1JsY0NobWJHOWhkQ0IwYUhKbGMyaHZiR1F4TENCbWJHOWhkQ0IwYUhKbGMyaHZiR1F5TENCbWJHOWhkQ0JrYVhOMExDQm1iRzloZENCaFlTa2dld29nSUNBZ2NtVjBkWEp1SUhOdGIyOTBhSE4wWlhBb2RHaHlaWE5vYjJ4a01TQXRJR0ZoTENCMGFISmxjMmh2YkdReElDc2dZV0VzSUdScGMzUXBJQzBLSUNBZ0lDQWdJQ0FnSUNCemJXOXZkR2h6ZEdWd0tIUm9jbVZ6YUc5c1pESWdMU0JoWVN3Z2RHaHlaWE5vYjJ4a01pQXJJR0ZoTENCa2FYTjBLVHNLZlFvS0x5OGdVSEp2WTJWa2RYSmhiQ0J6YVdkdVpXUWdaR2x6ZEdGdVkyVWdablZ1WTNScGIyNXpJRzl1SUhSb1pTQjFkaUJqYjI5eVpHbHVZWFJsSUhCaGRHTm9JRnN3TERGZGVGc3dMREZkQ2k4dklFNXZkR1VnZEdoaGRDQm1iM0lnWVc1MGFXRnNhV0Z6YVc1bklIUnZJSGR2Y21zZ2NISnZjR1Z5YkhrZ2RHaGxjMlVnYzJodmRXeGtJR0psSUNwelkyRnNaU0J3Y21WelpYSjJhVzVuS2dvdkx5QW9TV1lnZVc5MUlHMTFjM1FnY21WelkyRnNaU0IxZGl3Z2JXRnJaU0J6ZFhKbElIUnZJSEIxZENCMGFHVWdjMk5oYkdVZ1ptRmpkRzl5SUdKaFkyc2dhVzRnYkdGMFpYSXVLUXBtYkc5aGRDQjBjbWxoYm1kc1pTaDJaV015SUZBcGV3b2dJQ0FnVUNBdFBTQjJaV015S0RBdU5TazdDaUFnSUNCbWJHOWhkQ0I0SUQwZ1RWOVRVVkpVWHpJZ0tpQW9VQzU0SUMwZ1VDNTVLVHNLSUNBZ0lHWnNiMkYwSUhrZ1BTQk5YMU5SVWxSZk1pQXFJQ2hRTG5nZ0t5QlFMbmtwT3dvZ0lDQWdabXh2WVhRZ2NqRWdQU0J0WVhnb1lXSnpLSGdwTENCaFluTW9lU2twSUMwZ01TNHdMeWd5TGpBcVRWOVRVVkpVWHpJcE93b2dJQ0FnWm14dllYUWdjaklnUFNCUUxuazdDaUFnSUNCeVpYUjFjbTRnTFcxaGVDaHlNU3h5TWlrN0NuMEtDbVpzYjJGMElHTnBjbU5zWlNoMlpXTXlJSFYyS1hzS0lDQWdJSEpsZEhWeWJpQXdMalV0YkdWdVozUm9LSFYyTFhabFl6SW9NQzQxS1NrN0NuMEtDbVpzYjJGMElISmxZM1JoYm1kc1pTaDJaV015SUhWMktTQjdDaUFnSUNCMlpXTXlJSE1nUFNCbVgzTndjbWwwWlY5elkyRnNaU0F2SUcxcGJpaG1YM053Y21sMFpWOXpZMkZzWlM1NExDQm1YM053Y21sMFpWOXpZMkZzWlM1NUtUc0tJQ0FnSUhabFl6SWdaQ0E5SUhNZ0tpQnRZWGdvTFhWMkxDQjFkaUF0SUhabFl6SW9NU2twT3dvZ0lDQWdjbVYwZFhKdUlDMG9LR3hsYm1kMGFDaHRZWGdvZG1Wak1pZ3dMakFwTENCa0tTa2dLeUJ0YVc0b01DNHdMQ0J0WVhnb1pDNTRMQ0JrTG5rcEtTa3BPd3A5Q2dwbWJHOWhkQ0J5YjNWdVpHVmtYM0psWTNSaGJtZHNaU2gyWldNeUlIVjJMQ0IyWldNeUlIUnNMQ0IyWldNeUlHSnlLWHNLSUNBZ0lIWmxZeklnWkNBOUlHMWhlQ2gwYkMxMWRpd2dkWFl0WW5JcE93b2dJQ0FnY21WMGRYSnVJQzBvS0d4bGJtZDBhQ2h0WVhnb2RtVmpNaWd3TGpBcExDQmtLU2tnS3lCdGFXNG9NQzR3TENCdFlYZ29aQzU0TENCa0xua3BLU2t0ZEd3dWVDazdDbjBLQ25abFl6UWdabWxzYkNoMlpXTTBJR1pwYkd4amIyeHZjaXdnZG1Wak5DQmpiMnh2Y2l3Z2RtVmpNaUIxZGlrZ2V3b2dJQ0FnY21WMGRYSnVJR052Ykc5eU93cDlDblpsWXpRZ1ptbHNiQ2gyWldNMElHWnBiR3hqYjJ4dmNpd2dabXh2WVhRZ1kyOXNiM0lzSUhabFl6SWdkWFlwSUhzS0lDQWdJSEpsZEhWeWJpQm1hV3hzWTI5c2IzSTdDbjBLZG1Wak5DQm1hV3hzS0habFl6UWdabWxzYkdOdmJHOXlMQ0JpYjI5c0lHbHRZV2RsTENCMlpXTXlJSFYyS1NCN0lISmxkSFZ5YmlCbWFXeHNZMjlzYjNJN0lIMEtkbVZqTkNCbWFXeHNLSFpsWXpRZ1l5d2djMkZ0Y0d4bGNqSkVJR2x0WVdkbExDQjJaV015SUhWMktTQjdJSEpsZEhWeWJpQjBaWGgwZFhKbEtHbHRZV2RsTENCMWRpNTVlQ2s3SUgwS0NuWnZhV1FnYzNSeWIydGxLSFpsWXpRZ2MzUnliMnRsWTI5c2IzSXNJR1pzYjJGMElITnBaMjVsWkY5a2FYTjBZVzVqWlN3Z1pteHZZWFFnZDJsa2RHZ3NJR2x1YjNWMElIWmxZelFnWTI5c2IzSXNJR1pzYjJGMElHRmhYM0poWkdsMWN5bDdDaUFnSUNCcFppQW9kMmxrZEdnZ0lUMGdNQzR3S1hzS0lDQWdJQ0FnSUNCbWJHOWhkQ0IwSUQwZ1lXRnpkR1Z3S0cxcGJpaDNhV1IwYUN3Z01DNHdLU3dnYldGNEtIZHBaSFJvTENBd0xqQXBMQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVXNJR0ZoWDNKaFpHbDFjeWs3Q2lBZ0lDQWdJQ0FnZG1Wak5DQmlaMTlqYjJ4dmNpQTlJRzFwZUNoamIyeHZjaXdnZG1Wak5DaHpkSEp2YTJWamIyeHZjaTV5WjJJc0lEQXBMQ0JtYkc5aGRDaHphV2R1WldSZlpHbHpkR0Z1WTJVZ1BDQXdMalVnS2lCM2FXUjBhQ2twT3dvZ0lDQWdJQ0FnSUdOdmJHOXlJRDBnYldsNEtHSm5YMk52Ykc5eUxDQnpkSEp2YTJWamIyeHZjaXdnZENrN0NpQWdJQ0I5Q24wS0NuWnZhV1FnWjJ4dmR5aDJaV00wSUdkc2IzZGpiMnh2Y2l3Z1pteHZZWFFnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JtYkc5aGRDQnBibk5wWkdVc0lHbHViM1YwSUhabFl6UWdZMjlzYjNJcGV3b2dJQ0FnWm14dllYUWdaMnh2ZDE5M2FXUjBhQ0E5SUdkbGRGOW5iRzkzZDJsa2RHZ29LU0FxSUdkbGRGOXdlRjl3WlhKZmRXNXBkQ2dwT3dvZ0lDQWdabXh2WVhRZ2MzUnliMnRsWDNkcFpIUm9JRDBnWjJWMFgzTjBjbTlyWlhkcFpIUm9LQ2tnS2lCblpYUmZjSGhmY0dWeVgzVnVhWFFvS1RzS0lDQWdJR2xtSUNobmJHOTNYM2RwWkhSb0lENGdNQzR3S1hzS0lDQWdJQ0FnSUNCbWJHOWhkQ0J2ZFhSemFXUmxJRDBnS0dGaWN5aHphV2R1WldSZlpHbHpkR0Z1WTJVcElDMGdjM1J5YjJ0bFgzZHBaSFJvS1NBdklHZHNiM2RmZDJsa2RHZzdDaUFnSUNBZ0lDQWdabXh2WVhRZ1lXeHdhR0VnUFNBeExqQWdMU0J2ZFhSemFXUmxPd29nSUNBZ0lDQWdJR052Ykc5eUlEMGdiV2w0S0habFl6UW9aMnh2ZDJOdmJHOXlMbkpuWWl3Z1oyeHZkMk52Ykc5eUxtRXFZV3h3YUdFcExDQmpiMnh2Y2l3Z2FXNXphV1JsS1RzS0lDQWdJSDBLZlFvS1pteHZZWFFnYzJOaGJHVmtYMlJwYzNSaGJtTmxabWxsYkdRb2MyRnRjR3hsY2pKRUlHUnBjM1JoYm1ObFptbGxiR1FzSUhabFl6SWdkWFlwZXdvZ0lDQWdMeThnUjJ4NWNHZ2daR2x6ZEdGdVkyVWdabWxsYkdRZ2RXNXBkSE1nWVhKbElHbHVJSEJwZUdWc2N5NGdRMjl1ZG1WeWRDQjBieUJ6WVcxbElHUnBjM1JoYm1ObENpQWdJQ0F2THlCelkyRnNhVzVuSUdGeklHWmZkWFl1ZUNCbWIzSWdZMjl1YzJsemRHVnVZM2tnZDJsMGFDQjBhR1VnY0hKdlkyVmtkWEpoYkNCemFXZHVaV1JmWkdsemRHRnVZMlVLSUNBZ0lDOHZJR05oYkdOMWJHRjBhVzl1Y3k0S0lDQWdJSEpsZEhWeWJpQm1jbUZuWDJScGMzUmhibU5sWm1sbGJHUmZjMk5oYkdVZ0tpQjBaWGgwZFhKbEtHUnBjM1JoYm1ObFptbGxiR1FzSUhWMktTNXlPd3A5Q2dwbWJHOWhkQ0J6WTJGc1pXUmZaR2x6ZEdGdVkyVm1hV1ZzWkNoaWIyOXNJR1JwYzNSaGJtTmxabWxsYkdRc0lIWmxZeklnZFhZcGV3b2dJQ0FnY21WMGRYSnVJREF1TURzS2ZRb0tMeThnUjJsMlpXNGdZU0JtY21GbmJXVnVkQ0JrWlhKcGRtRjBhWFpsSUc5bUlHWmZkWFlnS0drdVpTNGdaRVprZUNobVgzVjJLU0J2Y2lCa1JtUjVLR1pmZFhZcEtTd2dZMkZzWTNWc1lYUmxDaTh2SUhSb1pTQmhjM052WTJsaGRHVmtJQ2h6Y1hWaGNtVmtLU0JqYUdGdVoyVWdhVzRnZEdobElHUnBjM1JoYm1ObFptbGxiR1F1SUZSb2FYTWdhWE1nWldabVpXTjBhWFpsYkhrZ2RHaGxDaTh2SUNoemNYVmhjbVZrS1NCd1lYSjBhV0ZzSUdSbGNtbDJZWFJwZG1VZ2IyWWdkR2hsSUdScGMzUmhibU5sWm1sbGJHUWdkMmwwYUNCeVpYTndaV04wSUhSdklHWnlZV2R0Wlc1MENpOHZJQ2h3YVhobGJDa2dZMjl2Y21ScGJtRjBaWE1LWm14dllYUWdjM0YxWVhKbFpGOXdZWEowYVdGc1gyUmxjbWwyWVhSbEtHWnNiMkYwSUdObGJuUmxjaXdnZG1Wak1pQmtabDkxZGlrZ2V3b2dJQ0FnZG1Wak1pQjFkakVnUFNCdGFYZ29abkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2d1ZUhrc0lHWnlZV2RmZFhaZmIyWm1jMlYwWDNkcFpIUm9MbnAzTENCamJHRnRjQ2htY21GblgzVjJJQ3NnTUM0MUlDb2daR1pmZFhZc0lEQXVNQ3dnTVM0d0tTazdDaUFnSUNCMlpXTXlJSFYyTUNBOUlHMXBlQ2htY21GblgzVjJYMjltWm5ObGRGOTNhV1IwYUM1NGVTd2dabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2d1ZW5jc0lHTnNZVzF3S0daeVlXZGZkWFlnTFNBd0xqVWdLaUJrWmw5MWRpd2dNQzR3TENBeExqQXBLVHNLSUNBZ0lDOHZJRWwwSUdOaGJpQm9ZWEJ3Wlc0Z2RHaGhkQ0J2ZFhJZ1puSmhaMjFsYm5RZ2FYTWdZMnh2YzJVZ2RHOGdZU0J0WVhocGJYVnRJR2x1SUhSb1pTQmthWE4wWVc1alpXWnBaV3hrQ2lBZ0lDQXZMeUIwWlhoMGRYSmxMaUJKYmlCMGFHbHpJR05oYzJVZ2RHaGxJR1JsY21sMllYUmxJR0poYzJWa0lHOXVJR0VnY0c5cGJuUWdkRzhnZEdobElHeGxablFnWVc1a0lISnBaMmgwQ2lBZ0lDQXZMeUJqWVc0Z1ltVWdZMnh2YzJVZ2RHOGdNQ0IzYUdWdUlHbDBJSE5vYjNWc1pHNG5kQ0JpWlM0Z1ZHOGdZWFp2YVdRZ2RHaHBjeUIzWlNCallXeGpkV3hoZEdVZ1lRb2dJQ0FnTHk4Z1pHVnlhWFpoZEdsMlpTQjBieUJsYVhSb1pYSWdjMmxrWlNCaGJtUWdkR0ZyWlNCMGFHVWdjM1J5YjI1blpYSWdiMjVsTGdvZ0lDQWdabXh2WVhRZ1pHWXhJRDBnYzJOaGJHVmtYMlJwYzNSaGJtTmxabWxsYkdRb1pHbHpkR0Z1WTJWbWFXVnNaQ3dnZFhZeEtTQXRJR05sYm5SbGNqc0tJQ0FnSUdac2IyRjBJR1JtTWlBOUlHTmxiblJsY2lBdElITmpZV3hsWkY5a2FYTjBZVzVqWldacFpXeGtLR1JwYzNSaGJtTmxabWxsYkdRc0lIVjJNQ2s3Q2lBZ0lDQnlaWFIxY200Z01pNHdJQ29nYldGNEtHUm1NU0FxSUdSbU1Td2daR1l5SUNvZ1pHWXlLVHNLZlFvS0x5OGdRMkZzWTNWc1lYUmxJSFJvWlNCaGJuUnBMV0ZzYVdGemFXNW5JSEpoWkdsMWN5QmlZWE5sWkNCdmJpQm9iM2NnYlhWamFDQjBhR1VnWkdsemRHRnVZMlVnWm1sbGJHUWdZMmhoYm1kbGN3b3ZMeUJ5Wld4aGRHbDJaU0IwYnlCdVpXbG5hR0p2Y21sdVp5QnpZVzF3YkdWekxpQkpaaUIwYUdVZ1pISmhkMjRnY1hWaFpDQnpZVzF3YkdWeklIUm9aU0JrYVhOMFlXNWpaU0JtYVdWc1pBb3ZMeUIzYVhSb0lITnZiV1VnWkdsemRHOXlkR2x2Yml3Z2FYUWdkMmxzYkNCaVpTQndhV05yWldRZ2RYQWdhR1Z5WlNCaGJtUWdZMjl0Y0dWdWMyRjBaV1FnYVc0Z1kyaGhibWRsY3lCMGJ3b3ZMeUIwYUdVZ1lXNTBhUzFoYkdsaGMybHVaeUJ5WVdScGRYTXVDbVpzYjJGMElHRnpjR1ZqZEY5amIzSnlaV04wWldSZmJHOWpZV3hmWVdGZmNtRmthWFZ6S0dac2IyRjBJSE5wWjI1bFpGOWthWE4wWVc1alpTa2dld29nSUNBZ2NtVjBkWEp1SUdaeVlXZGZkWFp6WTJGc1pTQXFJRUZPVkVsQlRFbEJVMTlTUVVSSlZWTWdLaUJOWDFOUlVsUmZNaUFxSUhOeGNuUW9DaUFnSUNBZ0lDQWdjM0YxWVhKbFpGOXdZWEowYVdGc1gyUmxjbWwyWVhSbEtITnBaMjVsWkY5a2FYTjBZVzVqWlN3Z1pFWmtlQ2htY21GblgzVjJLU2tnS3dvZ0lDQWdJQ0FnSUhOeGRXRnlaV1JmY0dGeWRHbGhiRjlrWlhKcGRtRjBaU2h6YVdkdVpXUmZaR2x6ZEdGdVkyVXNJR1JHWkhrb1puSmhaMTkxZGlrcENpQWdJQ0FwT3dwOUNncDJaV015SUdWdVkyOWtaVjkxYVc1MFgzUnZYMlpzYjJGMEtIVnBiblFnZG1Gc2RXVXBJSHNLSUNBZ0lHWnNiMkYwSUd4dmQyVnlJRDBnWm14dllYUW9kbUZzZFdVZ0ppQXdlRVpHUmtaMUtTQXZJRFkxTlRNMUxqQTdDaUFnSUNCbWJHOWhkQ0IxY0hCbGNpQTlJR1pzYjJGMEtIWmhiSFZsSUQ0K0lERTJkU2tnTHlBMk5UVXpOUzR3T3dvZ0lDQWdjbVYwZFhKdUlIWmxZeklvYkc5M1pYSXNJSFZ3Y0dWeUtUc0tmUW9LZG1Wak5DQndZV05yWDJsdWRDaDFhVzUwSUdsa0xDQjFhVzUwSUdsdVpHVjRLU0I3Q2lBZ0lDQjJaV00wSUhWdWNHRmphenNLSUNBZ0lIVnVjR0ZqYXk1eVp5QTlJR1Z1WTI5a1pWOTFhVzUwWDNSdlgyWnNiMkYwS0dsa0tUc0tJQ0FnSUhWdWNHRmpheTVpWVNBOUlHVnVZMjlrWlY5MWFXNTBYM1J2WDJac2IyRjBLR2x1WkdWNEtUc0tJQ0FnSUhKbGRIVnliaUIxYm5CaFkyczdDbjBLQ25admFXUWdiV0ZwYmlncElIc0tJQ0FnSUdadmNpQW9hVzUwSUdrZ1BTQXdPeUJwSUR3Z2RXNXBabTl5YlY5dWRXMWZZMnhwY0Y5d2JHRnVaWE03SUdrckt5a0tJQ0FnSUNBZ0lDQnBaaUFvYjE5amJHbHdYMlJwYzNSaGJtTmxXMmxkSUR3Z01DNHdLUW9nSUNBZ0lDQWdJQ0FnSUNCa2FYTmpZWEprT3dvS0lDQWdJR1pzYjJGMElITnBaMjVsWkY5a2FYTjBZVzVqWlNBOUlEQXVNRHNLQ2lBZ0lDQjJaV00wSUhWMlgyOW1aaUE5SUdaeVlXZGZkWFpmYjJabWMyVjBYM2RwWkhSb093b2dJQ0FnZG1Wak1pQjBaWGhmZFhZZ1BTQnRhWGdvZFhaZmIyWm1Mbmg1TENCMWRsOXZabVl1ZW5jc0lHTnNZVzF3S0daeVlXZGZkWFlzSURBdU1Dd2dNUzR3S1NrN0NpQWdJQ0JtYkc5aGRDQmhZVjl5WVdScGRYTWdQU0JCVGxSSlFVeEpRVk5mVWtGRVNWVlRPd29LSUNBZ0lHbHVkQ0J6YUdGd1pTQTlJR2RsZEY5elpHWmZiV0Z5YTJWeVgzTm9ZWEJsS0NrN0NpQWdJQ0JwWmloemFHRndaU0E5UFNCRFNWSkRURVVwQ2lBZ0lDQWdJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJRDBnWTJseVkyeGxLR1p5WVdkZmRYWXBPd29nSUNBZ1pXeHpaU0JwWmloemFHRndaU0E5UFNCRVNWTlVRVTVEUlVaSlJVeEVLU0I3Q2lBZ0lDQWdJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJRDBnYzJOaGJHVmtYMlJwYzNSaGJtTmxabWxsYkdRb1pHbHpkR0Z1WTJWbWFXVnNaQ3dnZEdWNFgzVjJLVHNLSUNBZ0lDQWdJQ0JoWVY5eVlXUnBkWE1nUFNCaGMzQmxZM1JmWTI5eWNtVmpkR1ZrWDJ4dlkyRnNYMkZoWDNKaFpHbDFjeWh6YVdkdVpXUmZaR2x6ZEdGdVkyVXBPd29nSUNBZ0lDQWdJR2xtSUNoblpYUmZjM1J5YjJ0bGQybGtkR2dvS1NBK0lEQXVNQ0I4ZkNCblpYUmZaMnh2ZDNkcFpIUm9LQ2tnUGlBd0xqQXBJSHNLSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdRMjl0Y0dWdWMyRjBaU0JtYjNJZ2RHaGxJR05zWVcxd2FXNW5JRzltSUhSbGVGOTFkaUJpZVNCaGJpQmhjSEJ5YjNocGJXRjBaUW9nSUNBZ0lDQWdJQ0FnSUNBdkx5QmxlSFJsYm5OcGIyNGdiMllnZEdobElITnBaMjVsWkNCa2FYTjBZVzVqWlNCdmRYUnphV1JsSUhSb1pTQjJZV3hwWkNCMFpYaDBkWEpsQ2lBZ0lDQWdJQ0FnSUNBZ0lDOHZJSEpsWjJsdmJpNEtJQ0FnSUNBZ0lDQWdJQ0FnZG1Wak1pQmlkV1oxZGlBOUlHWnlZV2RmZFhZZ0xTQmpiR0Z0Y0NobWNtRm5YM1YyTENBd0xqQXNJREV1TUNrN0NpQWdJQ0FnSUNBZ0lDQWdJSE5wWjI1bFpGOWthWE4wWVc1alpTQXRQU0JzWlc1bmRHZ29ZblZtZFhZcE93b2dJQ0FnSUNBZ0lIMEtJQ0FnSUgwZ1pXeHpaU0JwWmloemFHRndaU0E5UFNCU1QxVk9SRVZFWDFKRlExUkJUa2RNUlNrS0lDQWdJQ0FnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnUFNCeWIzVnVaR1ZrWDNKbFkzUmhibWRzWlNobWNtRm5YM1YyTENCMlpXTXlLREF1TWlrc0lIWmxZeklvTUM0NEtTazdDaUFnSUNCbGJITmxJR2xtS0hOb1lYQmxJRDA5SUZKRlExUkJUa2RNUlNrS0lDQWdJQ0FnSUNCemFXZHVaV1JmWkdsemRHRnVZMlVnUFNCeVpXTjBZVzVuYkdVb1puSmhaMTkxZGlrN0lDOHZJSEpsWTNSaGJtZHNaU2htWDNWMktUc0tJQ0FnSUdWc2MyVWdhV1lvYzJoaGNHVWdQVDBnVkZKSlFVNUhURVVwQ2lBZ0lDQWdJQ0FnYzJsbmJtVmtYMlJwYzNSaGJtTmxJRDBnZEhKcFlXNW5iR1VvWm5KaFoxOTFkaWs3Q2dvZ0lDQWdjMmxuYm1Wa1gyUnBjM1JoYm1ObElDbzlJR1p5WVdkZmRYWnpZMkZzWlRzS0Nnb2dJQ0FnWm14dllYUWdjM1J5YjJ0bFgzZHBaSFJvSUQwZ1oyVjBYM04wY205clpYZHBaSFJvS0NrZ0tpQm5aWFJmY0hoZmNHVnlYM1Z1YVhRb0tUc0tJQ0FnSUdac2IyRjBJR2x1YzJsa1pWOXpkR0Z5ZENBOUlHMWhlQ2d0YzNSeWIydGxYM2RwWkhSb0xDQXdMakFwT3dvZ0lDQWdabXh2WVhRZ2FXNXphV1JsSUQwZ1lXRnpkR1Z3S0dsdWMybGtaVjl6ZEdGeWRDd2djMmxuYm1Wa1gyUnBjM1JoYm1ObExDQmhZVjl5WVdScGRYTXBPd29LSUNBZ0lIWmxZelFnWm1sdVlXeGZZMjlzYjNJZ1BTQm1hV3hzS0daeVlXZGZZMjlzYjNJc0lIVnVhV1p2Y20xZlkyOXNiM0lzSUdaeVlXZGZkWFlwT3dvZ0lDQWdabWx1WVd4ZlkyOXNiM0l1WVNBOUlHWnBibUZzWDJOdmJHOXlMbUVnS2lCcGJuTnBaR1U3Q2dvZ0lDQWdjM1J5YjJ0bEtHWnlZV2RmYzNSeWIydGxZMjlzYjNJc0lITnBaMjVsWkY5a2FYTjBZVzVqWlN3Z0xYTjBjbTlyWlY5M2FXUjBhQ3dnWm1sdVlXeGZZMjlzYjNJc0lHRmhYM0poWkdsMWN5azdDaUFnSUNCbmJHOTNLR2RsZEY5bmJHOTNZMjlzYjNJb0tTd2djMmxuYm1Wa1gyUnBjM1JoYm1ObExDQmhZWE4wWlhBb0xYTjBjbTlyWlY5M2FXUjBhQ3dnYzJsbmJtVmtYMlJwYzNSaGJtTmxMQ0JoWVY5eVlXUnBkWE1wTENCbWFXNWhiRjlqYjJ4dmNpazdDZ29nSUNBZ0x5OGdaR1ZpZFdjZ0xTQnphRzkzSUdKaFkydG5jbTkxYm1RS0lDQWdJQzh2SUdacGJtRnNYMk52Ykc5eUxtRWdQU0JqYkdGdGNDaG1hVzVoYkY5amIyeHZjaTVoTENBd0xqQXNJREV1TUNrN0NpQWdJQ0F2THlCbWFXNWhiRjlqYjJ4dmNpQTlJSFpsWXpRb0NpQWdJQ0F2THlBZ0lDQWdkbVZqTXlneExEQXNNQ2tnS2lBb01TNHdJQzBnWm1sdVlXeGZZMjlzYjNJdVlTa2dLeUJtYVc1aGJGOWpiMnh2Y2k1eVoySWdLaUJtYVc1aGJGOWpiMnh2Y2k1aExBb2dJQ0FnTHk4Z0lDQWdJREF1TkNBcklEQXVOaUFxSUdacGJtRnNYMk52Ykc5eUxtRUtJQ0FnSUM4dklDazdDZ29nSUNBZ2FXWWdLSEJwWTJ0cGJtY3BJSHNLSUNBZ0lDQWdJQ0JwWmlBb1ptbHVZV3hmWTI5c2IzSXVZU0ErSURBdU1Ta2dld29nSUNBZ0lDQWdJQ0FnSUNCbWNtRm5iV1Z1ZEY5amIyeHZjaUE5SUhCaFkydGZhVzUwS0c5aWFtVmpkRjlwWkN3Z1puSmhaMTlwYm5OMFlXNWpaVjlwWkNrN0NpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzS0lDQWdJQ0FnSUNBZ0lDQWdaR2x6WTJGeVpEc0tJQ0FnSUNBZ0lDQjlDaUFnSUNBZ0lDQWdjbVYwZFhKdU93b2dJQ0FnZlFvS0lDQWdJR2xtSUNobWFXNWhiRjlqYjJ4dmNpNWhJRHc5SURBdU1DbDdDaUFnSUNBZ0lDQWdaR2x6WTJGeVpEc0tJQ0FnSUgwS0lDQWdJR1p5WVdkdFpXNTBYMk52Ykc5eUlEMGdabWx1WVd4ZlkyOXNiM0k3Q24wS3FYQnNiM1JmZEhsd1phZFRZMkYwZEdWeXAzVndaR0YwWlhMSEJXaWtNVFUzTnJOcGJuTjBZVzVqWlY5aGRIUnlhV0oxZEdWemlMSmpiMjUyWlhKMFpXUmZjbTkwWVhScGIyNkNxM1I1Y0dWZmJHVnVaM1JvQktSbWJHRjB4d0FYcW5GMVlXUmZjMk5oYkdXQ3EzUjVjR1ZmYkdWdVozUm9BcVJtYkdGMHh3QVhyVzFoY210bGNsOXZabVp6WlhTQ3EzUjVjR1ZmYkdWdVozUm9BNlJtYkdGMHh3QVh0V052Ym5abGNuUmxaRjl6ZEhKdmEyVmpiMnh2Y29LcmRIbHdaVjlzWlc1bmRHZ0VwR1pzWVhUSEFCZW1jMlJtWDNWMmdxdDBlWEJsWDJ4bGJtZDBhQVNrWm14aGRNY0FGNjEzWjJ4ZmNHOXphWFJwYjI1emdxdDBlWEJsWDJ4bGJtZDBhQUtrWm14aGRNY0FGNngyWlhKMFpYaGZZMjlzYjNLQ3EzUjVjR1ZmYkdWdVozUm9CS1JtYkdGMHh3QVhxM0YxWVdSZmIyWm1jMlYwZ3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE1jQUY0eXNkSEpoYm5Od1lYSmxibU41d3FaNmRtRnNkV1hLQUFBQUFLUnVZVzFsMlNCc2FXNWxjMlZuYldWdWRITXRPRFEzT1RZd01UYzJORFV6TlRNd016azJPYWxqWVcxZmMzQmhZMldrWkdGMFlhaDFibWxtYjNKdGM0NnlkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWx1WVc1ZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFBQUNxYlc5a1pXeGZaak15WThkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEKzJkVzVwWm05eWJWOXdZWFIwWlhKdVgyeGxibWQwYU1vL2dBQUFySE5qWlc1bFgyOXlhV2RwYnRjWEFBQUFBQUFBQUFDdGJHOTNZMnhwY0Y5amIyeHZjdGdYd0xTSVBoTzJuenNWcWFnK0FBQ0FQN0IxYm1sbWIzSnRYMk52Ykc5eWJXRnd3cWR3YVdOcmFXNW53cmQxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN3Q25iR2x1WldOaGNBQ3JaR1Z3ZEdoZmMyaHBablRLQUFBQUFLOTFibWxtYjNKdFgzQmhkSFJsY203Q3JtaHBaMmhqYkdsd1gyTnZiRzl5MkJlQVJYNC82UGxuUC9WakV6NEFBSUEvczNWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhQSGdCY0FBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6cWQyYVhOcFlteGx3Nmh2ZG1WeVpISmhkOEtyYVhOZmMyVm5iV1Z1ZEhQRHFtRjBkSEpwWW5WMFpYT0RzWFZ1YVdadmNtMWZiR2x1WlhkcFpIUm9ncXQwZVhCbFgyeGxibWQwYUFHa1pteGhkTWNBRjZwc2FXNWxYMk52Ykc5eWdxdDBlWEJsWDJ4bGJtZDBhQVNrWm14aGRNY0FGN3B3YjNOcGRHbHZibk5mZEhKaGJuTm1iM0p0WldSZlpqTXlZNEtyZEhsd1pWOXNaVzVuZEdnRHBHWnNZWFRIQUJla2RYVnBaTE00TkRjNU5qQXhOelkwTlRNMU16QXpPVFk1cVhCc2IzUmZkSGx3WmFWTWFXNWxjNmQxY0dSaGRHVnl4d1ZvcERFMU56ZmVBQktzZEhKaGJuTndZWEpsYm1ONXdxVnpjR0ZqWmFSa1lYUmhySFpsY25SbGVHRnljbUY1YzRLaWRYYUNxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4eUFYQUFBQUFBQUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4QUFBQUFBQUFBQUFBQUFBQ29jRzl6YVhScGIyNkNxM1I1Y0dWZmJHVnVaM1JvQXFSbWJHRjB4eUFYQUFBQXZ3QUFBTDhBQUFBL0FBQUF2d0FBQUQ4QUFBQS9BQUFBdndBQUFEK21lblpoYkhWbHlnQUFBQUNrYm1GdFpiWjBaWGgwTFRJMU5EWXdOalk0TlRVNU9ETTRPVEl4cVdOaGJWOXpjR0ZqWmFSa1lYUmhxSFZ1YVdadmNtMXozZ0FacTNCNFgzQmxjbDkxYm1sMHlnQUFBQUNwWjJ4dmQyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBc25WdWFXWnZjbTFmWTI5c2IzSnlZVzVuWmNLcFltbHNiR0p2WVhKa3dxMXdjbVZ3Y205cVpXTjBhVzl1eDBBWEFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVA2bHVZVzVmWTI5c2IzTFlGd0FBQUFBQUFBQUFBQUFBQUFBQUFBQ3RaR2x6ZEdGdVkyVm1hV1ZzWklxcGJXbHVSbWxzZEdWeXJFeHBibVZoY2tacGJIUmxjcXBoYm1semIzUnliM0I1eWtHQUFBQ3BiV0ZuUm1sc2RHVnlyRXhwYm1WaGNrWnBiSFJsY3FWM2NtRndVNjVTWlhCbFlYUlhjbUZ3Y0dsdVo2UmtZWFJoclhSbGVIUjFjbVZmWVhSc1lYT3NkR2h5WldWZlptOXliV0YwcVZKbFpFWnZjbTFoZEtSemFYcGxrczBJQU0wSUFLVjNjbUZ3Vks1U1pYQmxZWFJYY21Gd2NHbHVaNlIwZVhCbHAxTmhiWEJzWlhLcWRHaHlaV1ZmZEhsd1phbEdiRzloZEZSNWNHV3FiVzlrWld4ZlpqTXlZOGRBRndBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0QreVlYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbHlrVUFBQUN3YzJSbVgyMWhjbXRsY2w5emFHRndaUU9uY0dGMGRHVnlic0tyYzNSeWIydGxkMmxrZEdqS0FBQUFBSzFzYjNkamJHbHdYMk52Ykc5eTJCZkF0SWcrRTdhZk94V3BxRDRBQUlBL3NIVnVhV1p2Y20xZlkyOXNiM0p0WVhEQ3FXZHNiM2QzYVdSMGFNb0FBQUFBcDNCcFkydHBibWZDcW5KbGMyOXNkWFJwYjI3WEZ3QUFBQUFBQUFBQXQzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtsdlltcGxZM1JmYVdRQXJYVnVhV1p2Y20xZlkyOXNiM0xDc0hSeVlXNXpabTl5YlY5dFlYSnJaWExDcTJSbGNIUm9YM05vYVdaMHlnQUFBQUNxWmpNeVkxOXpZMkZzWmNjTUZ3QUFnRDhBQUlBL0FBQ0FQNjVvYVdkb1kyeHBjRjlqYjJ4dmN0Z1hnRVYrUCtqNVp6LzFZeE0rQUFDQVA3TjFibWxtYjNKdFgyTnNhWEJmY0d4aGJtVnp4NEFYQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM2bmRtbHphV0pzWmNPcmJXRnlhMlZ5YzNCaFkyV2taR0YwWWFodmRtVnlaSEpoZDhLcVoyeDVjR2hmWkdGMFlZT3NaMng1Y0doZmFHRnphR1Z6eHdBV3BuTmpZV3hsYzhjQUY2MWhkR3hoYzE5MWNHUmhkR1Z6Z0tWbVlXTmxjOGNZRmdBQUFBQUJBQUFBQWdBQUFBQUFBQUFDQUFBQUF3QUFBS1IxZFdsa3NUSTFORFl3TmpZNE5UVTVPRE00T1RJeHJYWmxjblJsZUY5emIzVnlZMlhhSmxvS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHWnNiMkYwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYzJGdGNHeGxjak5FT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVhOaGJYQnNaWEl5UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsellXMXdiR1Z5TTBRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCMWMyRnRjR3hsY2pKRU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2RYTmhiWEJzWlhJelJEc0tMeThnZG1WeWRHVjRJR2x1Y0hWMGN6b2dDbWx1SUhabFl6SWdjRzl6YVhScGIyNDdDblpsWXpJZ1oyVjBYM0J2YzJsMGFXOXVLQ2w3Y21WMGRYSnVJSEJ2YzJsMGFXOXVPMzBLYVc0Z2RtVmpNaUIxZGpzS2RtVmpNaUJuWlhSZmRYWW9LWHR5WlhSMWNtNGdkWFk3ZlFvS0x5OGdWVzVwWm05eWJYTTZJQXAxYm1sbWIzSnRJR0p2YjJ3Z2RXNXBabTl5YlY5amIyeHZjbTFoY0RzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbTFoY0NncGUzSmxkSFZ5YmlCMWJtbG1iM0p0WDJOdmJHOXliV0Z3TzMwS2RXNXBabTl5YlNCMWFXNTBJRzlpYW1WamRGOXBaRHNLZFdsdWRDQm5aWFJmYjJKcVpXTjBYMmxrS0NsN2NtVjBkWEp1SUc5aWFtVmpkRjlwWkR0OUNuVnVhV1p2Y20wZ2JXRjBOQ0J0YjJSbGJGOW1NekpqT3dwdFlYUTBJR2RsZEY5dGIyUmxiRjltTXpKaktDbDdjbVYwZFhKdUlHMXZaR1ZzWDJZek1tTTdmUXAxYm1sbWIzSnRJR2x1ZENCelpHWmZiV0Z5YTJWeVgzTm9ZWEJsT3dwcGJuUWdaMlYwWDNOa1psOXRZWEpyWlhKZmMyaGhjR1VvS1h0eVpYUjFjbTRnYzJSbVgyMWhjbXRsY2w5emFHRndaVHQ5Q25WdWFXWnZjbTBnWm14dllYUWdaMnh2ZDNkcFpIUm9Pd3BtYkc5aGRDQm5aWFJmWjJ4dmQzZHBaSFJvS0NsN2NtVjBkWEp1SUdkc2IzZDNhV1IwYUR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWVhSc1lYTmZkR1Y0ZEhWeVpWOXphWHBsT3dwbWJHOWhkQ0JuWlhSZllYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbEtDbDdjbVYwZFhKdUlHRjBiR0Z6WDNSbGVIUjFjbVZmYzJsNlpUdDlDblZ1YVdadmNtMGdZbTl2YkNCd1lYUjBaWEp1T3dwaWIyOXNJR2RsZEY5d1lYUjBaWEp1S0NsN2NtVjBkWEp1SUhCaGRIUmxjbTQ3ZlFwMWJtbG1iM0p0SUdKdmIyd2djR2xqYTJsdVp6c0tZbTl2YkNCblpYUmZjR2xqYTJsdVp5Z3BlM0psZEhWeWJpQndhV05yYVc1bk8zMEtkVzVwWm05eWJTQmliMjlzSUhWdWFXWnZjbTFmWTI5c2IzSnlZVzVuWlRzS1ltOXZiQ0JuWlhSZmRXNXBabTl5YlY5amIyeHZjbkpoYm1kbEtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUdDlDblZ1YVdadmNtMGdabXh2WVhRZ2NIaGZjR1Z5WDNWdWFYUTdDbVpzYjJGMElHZGxkRjl3ZUY5d1pYSmZkVzVwZENncGUzSmxkSFZ5YmlCd2VGOXdaWEpmZFc1cGREdDlDblZ1YVdadmNtMGdjMkZ0Y0d4bGNqSkVJR1JwYzNSaGJtTmxabWxsYkdRN0NuVnVhV1p2Y20wZ2RtVmpOQ0J1WVc1ZlkyOXNiM0k3Q25abFl6UWdaMlYwWDI1aGJsOWpiMnh2Y2lncGUzSmxkSFZ5YmlCdVlXNWZZMjlzYjNJN2ZRcDFibWxtYjNKdElHWnNiMkYwSUhOMGNtOXJaWGRwWkhSb093cG1iRzloZENCblpYUmZjM1J5YjJ0bGQybGtkR2dvS1h0eVpYUjFjbTRnYzNSeWIydGxkMmxrZEdnN2ZRcDFibWxtYjNKdElIWmxZek1nWmpNeVkxOXpZMkZzWlRzS2RtVmpNeUJuWlhSZlpqTXlZMTl6WTJGc1pTZ3BlM0psZEhWeWJpQm1NekpqWDNOallXeGxPMzBLZFc1cFptOXliU0IyWldNeUlISmxjMjlzZFhScGIyNDdDblpsWXpJZ1oyVjBYM0psYzI5c2RYUnBiMjRvS1h0eVpYUjFjbTRnY21WemIyeDFkR2x2Ymp0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWkdWd2RHaGZjMmhwWm5RN0NtWnNiMkYwSUdkbGRGOWtaWEIwYUY5emFHbG1kQ2dwZTNKbGRIVnliaUJrWlhCMGFGOXphR2xtZER0OUNuVnVhV1p2Y20wZ2RtVmpOQ0JzYjNkamJHbHdYMk52Ykc5eU93cDJaV00wSUdkbGRGOXNiM2RqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUd4dmQyTnNhWEJmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR0p2YjJ3Z1ltbHNiR0p2WVhKa093cGliMjlzSUdkbGRGOWlhV3hzWW05aGNtUW9LWHR5WlhSMWNtNGdZbWxzYkdKdllYSmtPMzBLZFc1cFptOXliU0J0WVhRMElIQnlaWEJ5YjJwbFkzUnBiMjQ3Q20xaGREUWdaMlYwWDNCeVpYQnliMnBsWTNScGIyNG9LWHR5WlhSMWNtNGdjSEpsY0hKdmFtVmpkR2x2Ymp0OUNuVnVhV1p2Y20wZ1ltOXZiQ0IxYm1sbWIzSnRYMk52Ykc5eU93cGliMjlzSUdkbGRGOTFibWxtYjNKdFgyTnZiRzl5S0NsN2NtVjBkWEp1SUhWdWFXWnZjbTFmWTI5c2IzSTdmUXAxYm1sbWIzSnRJSFpsWXpRZ2FHbG5hR05zYVhCZlkyOXNiM0k3Q25abFl6UWdaMlYwWDJocFoyaGpiR2x3WDJOdmJHOXlLQ2w3Y21WMGRYSnVJR2hwWjJoamJHbHdYMk52Ykc5eU8zMEtkVzVwWm05eWJTQjJaV00wSUdkc2IzZGpiMnh2Y2pzS2RtVmpOQ0JuWlhSZloyeHZkMk52Ykc5eUtDbDdjbVYwZFhKdUlHZHNiM2RqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCMGNtRnVjMlp2Y20xZmJXRnlhMlZ5T3dwaWIyOXNJR2RsZEY5MGNtRnVjMlp2Y20xZmJXRnlhMlZ5S0NsN2NtVjBkWEp1SUhSeVlXNXpabTl5YlY5dFlYSnJaWEk3ZlFvS0Nnb0tMeThnVUdWeUlHbHVjM1JoYm1ObElHRjBkSEpwWW5WMFpYTTZJQXBwYmlCMlpXTTBJSE5rWmw5MWRqc0tkbVZqTkNCblpYUmZjMlJtWDNWMktDbDdjbVYwZFhKdUlITmtabDkxZGp0OUNtbHVJSFpsWXpRZ2RtVnlkR1Y0WDJOdmJHOXlPd3AyWldNMElHZGxkRjkyWlhKMFpYaGZZMjlzYjNJb0tYdHlaWFIxY200Z2RtVnlkR1Y0WDJOdmJHOXlPMzBLYVc0Z2RtVmpNaUJ4ZFdGa1gyOW1abk5sZERzS2RtVmpNaUJuWlhSZmNYVmhaRjl2Wm1aelpYUW9LWHR5WlhSMWNtNGdjWFZoWkY5dlptWnpaWFE3ZlFwcGJpQjJaV015SUhGMVlXUmZjMk5oYkdVN0NuWmxZeklnWjJWMFgzRjFZV1JmYzJOaGJHVW9LWHR5WlhSMWNtNGdjWFZoWkY5elkyRnNaVHQ5Q21sdUlIWmxZelFnWTI5dWRtVnlkR1ZrWDNOMGNtOXJaV052Ykc5eU93cDJaV00wSUdkbGRGOWpiMjUyWlhKMFpXUmZjM1J5YjJ0bFkyOXNiM0lvS1h0eVpYUjFjbTRnWTI5dWRtVnlkR1ZrWDNOMGNtOXJaV052Ykc5eU8zMEthVzRnZG1Wak1pQjNaMnhmY0c5emFYUnBiMjV6T3dwMlpXTXlJR2RsZEY5M1oyeGZjRzl6YVhScGIyNXpLQ2w3Y21WMGRYSnVJSGRuYkY5d2IzTnBkR2x2Ym5NN2ZRcHBiaUIyWldNMElHTnZiblpsY25SbFpGOXliM1JoZEdsdmJqc0tkbVZqTkNCblpYUmZZMjl1ZG1WeWRHVmtYM0p2ZEdGMGFXOXVLQ2w3Y21WMGRYSnVJR052Ym5abGNuUmxaRjl5YjNSaGRHbHZianQ5Q21sdUlIWmxZek1nYldGeWEyVnlYMjltWm5ObGREc0tkbVZqTXlCblpYUmZiV0Z5YTJWeVgyOW1abk5sZENncGUzSmxkSFZ5YmlCdFlYSnJaWEpmYjJabWMyVjBPMzBLQ25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JtYkc5aGREc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHbHVkRHNLQ25WdWFXWnZjbTBnYldGME5DQndjbTlxWldOMGFXOXVPd3AxYm1sbWIzSnRJRzFoZERRZ2RtbGxkenNLZFc1cFptOXliU0JwYm5RZ2RXNXBabTl5YlY5dWRXMWZZMnhwY0Y5d2JHRnVaWE03Q25WdWFXWnZjbTBnZG1Wak5DQjFibWxtYjNKdFgyTnNhWEJmY0d4aGJtVnpXemhkT3dvS2RXNXBabTl5YlNCbWJHOWhkQ0JoZEd4aGMxOTBaWGhmWkdsdE93b0tiM1YwSUhabFl6UWdabkpoWjE5amIyeHZjanNLYjNWMElIWmxZeklnWm5KaFoxOTFkanNLYjNWMElHWnNiMkYwSUdaeVlXZGZkWFp6WTJGc1pUc0tiM1YwSUdac2IyRjBJR1p5WVdkZlpHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pUc0tiM1YwSUhabFl6UWdabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2c3Q205MWRDQm1iRzloZENCdlgyTnNhWEJmWkdsemRHRnVZMlZiT0YwN0NtWnNZWFFnYjNWMElIWmxZelFnWm5KaFoxOXpkSEp2YTJWamIyeHZjanNLQ21ac1lYUWdiM1YwSUhWcGJuUWdabkpoWjE5cGJuTjBZVzVqWlY5cFpEc0tabXhoZENCdmRYUWdkbVZqTWlCbVgzTndjbWwwWlY5elkyRnNaVHNLQ2lOa1pXWnBibVVnUVU1VVNVRk1TVUZUWDFKQlJFbFZVeUF3TGpnS0NncHRZWFEwSUhGdFlYUW9kbVZqTkNCeGRXRjBLWHNLSUNBZ0lHWnNiMkYwSUc1MWJTQTlJSEYxWVhRdWVDQXFJREl1TURzS0lDQWdJR1pzYjJGMElHNTFiVElnUFNCeGRXRjBMbmtnS2lBeUxqQTdDaUFnSUNCbWJHOWhkQ0J1ZFcweklEMGdjWFZoZEM1NklDb2dNaTR3T3dvZ0lDQWdabXh2WVhRZ2JuVnROQ0E5SUhGMVlYUXVlQ0FxSUc1MWJUc0tJQ0FnSUdac2IyRjBJRzUxYlRVZ1BTQnhkV0YwTG5rZ0tpQnVkVzB5T3dvZ0lDQWdabXh2WVhRZ2JuVnROaUE5SUhGMVlYUXVlaUFxSUc1MWJUTTdDaUFnSUNCbWJHOWhkQ0J1ZFcwM0lEMGdjWFZoZEM1NElDb2diblZ0TWpzS0lDQWdJR1pzYjJGMElHNTFiVGdnUFNCeGRXRjBMbmdnS2lCdWRXMHpPd29nSUNBZ1pteHZZWFFnYm5WdE9TQTlJSEYxWVhRdWVTQXFJRzUxYlRNN0NpQWdJQ0JtYkc5aGRDQnVkVzB4TUNBOUlIRjFZWFF1ZHlBcUlHNTFiVHNLSUNBZ0lHWnNiMkYwSUc1MWJURXhJRDBnY1hWaGRDNTNJQ29nYm5WdE1qc0tJQ0FnSUdac2IyRjBJRzUxYlRFeUlEMGdjWFZoZEM1M0lDb2diblZ0TXpzS0lDQWdJSEpsZEhWeWJpQnRZWFEwS0FvZ0lDQWdJQ0FnSUNneExqQWdMU0FvYm5WdE5TQXJJRzUxYlRZcEtTd2dLRzUxYlRjZ0t5QnVkVzB4TWlrc0lDQWdJQ0FnSUNBb2JuVnRPQ0F0SUc1MWJURXhLU3dnSUNBZ0lDQWdJREF1TUN3S0lDQWdJQ0FnSUNBb2JuVnROeUF0SUc1MWJURXlLU3dnSUNBZ0lDQWdJQ2d4TGpBZ0xTQW9iblZ0TkNBcklHNTFiVFlwS1N3Z0tHNTFiVGtnS3lCdWRXMHhNQ2tzSUNBZ0lDQWdJQ0F3TGpBc0NpQWdJQ0FnSUNBZ0tHNTFiVGdnS3lCdWRXMHhNU2tzSUNBZ0lDQWdJQ0FvYm5WdE9TQXRJRzUxYlRFd0tTd2dJQ0FnSUNBZ0lDZ3hMakFnTFNBb2JuVnROQ0FySUc1MWJUVXBLU3dnTUM0d0xBb2dJQ0FnSUNBZ0lEQXVNQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTUM0d0xDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXdMakFzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSURFdU1Bb2dJQ0FnS1RzS2ZRb0tabXh2WVhRZ1pHbHpkR0Z1WTJWbWFXVnNaRjl6WTJGc1pTZ3Bld29nSUNBZ0x5OGdSMng1Y0dnZ1pHbHpkR0Z1WTJVZ1ptbGxiR1FnZFc1cGRITWdZWEpsSUdsdUlIQnBlR1ZzY3pzZ1kyOXVkbVZ5ZENCMGJ5QmthVzFsYm5OcGIyNXNaWE56Q2lBZ0lDQXZMeUI0TFdOdmIzSmthVzVoZEdVZ2IyWWdkR1Y0ZEhWeVpTQnBibk4wWldGa0lHWnZjaUJqYjI1emFYTjBaVzVqZVNCM2FYUm9JSEJ5YjJkeVlXMXRZWFJwWXlCMWRnb2dJQ0FnTHk4Z1pHbHpkR0Z1WTJVZ1ptbGxiR1J6SUdsdUlHWnlZV2R0Wlc1MElITm9ZV1JsY2k0Z1UyVmxJR0ZzYzI4Z1kyOXRiV1Z1ZEhNZ1ltVnNiM2N1Q2lBZ0lDQjJaV00wSUhWMlgzSmxZM1FnUFNCblpYUmZjMlJtWDNWMktDazdDaUFnSUNCbWJHOWhkQ0J3YVhoemFYcGxYM2dnUFNBb2RYWmZjbVZqZEM1NklDMGdkWFpmY21WamRDNTRLU0FxSUdkbGRGOWhkR3hoYzE5MFpYaDBkWEpsWDNOcGVtVW9LVHNLSUNBZ0lISmxkSFZ5YmlBdE1TNHdMM0JwZUhOcGVtVmZlRHNLZlFvS2RtVmpNeUIwYjNabFl6TW9kbVZqTWlCMktYdHlaWFIxY200Z2RtVmpNeWgyTENBd0xqQXBPMzBLZG1Wak15QjBiM1psWXpNb2RtVmpNeUIyS1h0eVpYUjFjbTRnZGp0OUNncDJaV00wSUhSdmRtVmpOQ2gyWldNeklIWXBlM0psZEhWeWJpQjJaV00wS0hZc0lERXVNQ2s3ZlFwMlpXTTBJSFJ2ZG1Wak5DaDJaV00wSUhZcGUzSmxkSFZ5YmlCMk8zMEtkbVZqTkNCMGIzWmxZelFvWW05dmJDQjJLU0I3Q2lBZ0lDQnlaWFIxY200Z2RtVmpOQ2d3TGpBcE93cDlDZ3B0WVhReUlHUnBZV2R0S0habFl6SWdkaWw3Q2lBZ0lDQnlaWFIxY200Z2JXRjBNaWgyTG5nc0lEQXVNQ3dnTUM0d0xDQjJMbmtwT3dwOUNncG1iRzloZENCZlpHVjBaWEp0YVc1aGJuUW9iV0YwTWlCdEtTQjdDaUFnY21WMGRYSnVJRzFiTUYxYk1GMGdLaUJ0V3pGZFd6RmRJQzBnYlZzd1hWc3hYU0FxSUcxYk1WMWJNRjA3Q24wS0NuWnZhV1FnY0hKdlkyVnpjMTlqYkdsd1gzQnNZVzVsY3loMlpXTXpJSGR2Y214a1gzQnZjeWtnZXdvZ0lDQWdabTl5SUNocGJuUWdhU0E5SURBN0lHa2dQQ0IxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN6c2dhU3NyS1FvZ0lDQWdJQ0FnSUc5ZlkyeHBjRjlrYVhOMFlXNWpaVnRwWFNBOUlHUnZkQ2gzYjNKc1pGOXdiM01zSUhWdWFXWnZjbTFmWTJ4cGNGOXdiR0Z1WlhOYmFWMHVlSGw2S1NBdElIVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYTmJhVjB1ZHpzS2ZRb0tkbTlwWkNCdFlXbHVLQ2w3Q2lBZ0lDQXZMeUJuWlhSZmNHOXpLQ2tnY21WMGRYSnVjeUIwYUdVZ2NHOXphWFJwYjI0Z2IyWWdkR2hsSUhOallYUjBaWElnYldGeWEyVnlDaUFnSUNBdkx5Qm5aWFJmY0c5emFYUnBiMjRvS1NCeVpYUjFjbTV6SUhSb1pTQW9jbVZzWVhScGRtVXBJSEJ2YzJsMGFXOXVJRzltSUhSb1pTQmpkWEp5Wlc1MElIRjFZV1FnZG1WeWRHVjRDZ29nSUNBZ2RtVmpNeUJtTXpKalgzTmpZV3hsSUQwZ1oyVjBYMll6TW1OZmMyTmhiR1VvS1RzS0lDQWdJSFpsWXpJZ2JYTWdQU0JtTXpKalgzTmpZV3hsTG5oNUlDb2daMlYwWDNGMVlXUmZjMk5oYkdVb0tUc0tJQ0FnSUhabFl6SWdjWFZoWkY5dlptWnpaWFFnUFNCbU16SmpYM05qWVd4bExuaDVJQ29nWjJWMFgzRjFZV1JmYjJabWMyVjBLQ2s3Q2lBZ0lDQjJaV016SUcxaGNtdGxjbDl2Wm1aelpYUWdQU0JtTXpKalgzTmpZV3hsSUNvZ2RHOTJaV016S0dkbGRGOXRZWEpyWlhKZmIyWm1jMlYwS0NrcE93b0tJQ0FnSUhabFl6SWdZbUp2ZUY5eVlXUnBkWE1nUFNBd0xqVWdLaUJ0Y3pzS0lDQWdJSFpsWXpJZ2MzQnlhWFJsWDJKaWIzaGZZMlZ1ZEhKbElEMGdjWFZoWkY5dlptWnpaWFFnS3lCaVltOTRYM0poWkdsMWN6c0tJQ0FnSUdaZmMzQnlhWFJsWDNOallXeGxJRDBnYlhNN0NpQWdJQ0J0WVhRMElIQjJhV1YzSUQwZ2NISnZhbVZqZEdsdmJpQXFJSFpwWlhjN0NpQWdJQ0J0WVhRMElIUnlZVzV6SUQwZ1oyVjBYM1J5WVc1elptOXliVjl0WVhKclpYSW9LU0EvSUcxdlpHVnNYMll6TW1NZ09pQnRZWFEwS0RFdU1DazdDZ29nSUNBZ2RtVmpOQ0J3YjNOcGRHbHZibDkzYjNKc1pDQTlJRzF2WkdWc1gyWXpNbU1nS2lCMlpXTTBLSFJ2ZG1Wak15aG5aWFJmZDJkc1gzQnZjMmwwYVc5dWN5Z3BLU3dnTVNrN0NpQWdJQ0J3Y205alpYTnpYMk5zYVhCZmNHeGhibVZ6S0hCdmMybDBhVzl1WDNkdmNteGtMbmg1ZWlrN0Nnb2dJQ0FnTHk4Z1EyOXRjSFYwWlNCalpXNTBjbVVnYjJZZ1ltbHNiR0p2WVhKa0lHbHVJR05zYVhCd2FXNW5JR052YjNKa2FXNWhkR1Z6Q2lBZ0lDQXZMeUJCYkhkaGVYTWdkSEpoYm5ObWIzSnRJSFJsZUhRdmMyTmhkSFJsY2lCd2IzTnBkR2x2YmlCaGNtZDFiV1Z1ZEFvZ0lDQWdkbVZqTkNCa1lYUmhYM0J2YVc1MElEMGdaMlYwWDNCeVpYQnliMnBsWTNScGIyNG9LU0FxSUhCdmMybDBhVzl1WDNkdmNteGtPd29nSUNBZ0x5OGdiV0Y1WW1VZ2RISmhibk5tYjNKdElHMWhjbXRsY2w5dlptWnpaWFFnS3lCbmJIbHdhQ0J2Wm1aelpYUnpDaUFnSUNCa1lYUmhYM0J2YVc1MElEMGdkbVZqTkNoa1lYUmhYM0J2YVc1MExuaDVlaUF2SUdSaGRHRmZjRzlwYm5RdWR5QXJJRzFoZERNb2RISmhibk1wSUNvZ2JXRnlhMlZ5WDI5bVpuTmxkQ3dnTVNrN0NpQWdJQ0JrWVhSaFgzQnZhVzUwSUQwZ2NIWnBaWGNnS2lCa1lYUmhYM0J2YVc1ME93b0tJQ0FnSUM4dklFTnZiWEIxZEdVZ2RISmhibk5tYjNKdElHWnZjaUIwYUdVZ2IyWm1jMlYwSUhabFkzUnZjbk1nWm5KdmJTQjBhR1VnWTJWdWRISmhiQ0J3YjJsdWRBb2dJQ0FnZEhKaGJuTWdQU0FvWjJWMFgySnBiR3hpYjJGeVpDZ3BJRDhnY0hKdmFtVmpkR2x2YmlBNklIQjJhV1YzS1NBcUlIRnRZWFFvWjJWMFgyTnZiblpsY25SbFpGOXliM1JoZEdsdmJpZ3BLU0FxSUhSeVlXNXpPd29nSUNBZ2RtVmpOQ0J6Y0hKcGRHVmZZMlZ1ZEdWeUlEMGdkSEpoYm5NZ0tpQjJaV00wS0hOd2NtbDBaVjlpWW05NFgyTmxiblJ5WlN3Z01Dd2dNQ2s3Q2dvZ0lDQWdkbVZqTkNCMlkyeHBjQ0E5SUdSaGRHRmZjRzlwYm5RZ0t5QnpjSEpwZEdWZlkyVnVkR1Z5T3dvS0lDQWdJQzh2SUVWNGRISmhJR0oxWm1abGNtbHVaeUJwY3lCeVpYRjFhWEpsWkNCaGNtOTFibVFnYzNCeWFYUmxjeUIzYUdsamFDQmhjbVVnWVc1MGFXRnNhV0Z6WldRZ2MyOGdkR2hoZEFvZ0lDQWdMeThnZEdobElHRnVkR2xoYkdsaGN5QmliSFZ5SUdSdlpYTnVKM1FnWjJWMElHTjFkQ0J2Wm1ZZ0tITmxaU0FqTVRVcExpQlVhR2x6SUdKc2RYSWdabUZzYkhNZ2RHOEtJQ0FnSUM4dklIcGxjbThnWVhRZ1lTQnlZV1JwZFhNZ2IyWWdRVTVVU1VGTVNVRlRYMUpCUkVsVlV5QndhWGhsYkhNZ2FXNGdkR2hsSUhacFpYZHdiM0owSUdOdmIzSmthVzVoZEdWekNpQWdJQ0F2THlCaGJtUWdkMlVnZDJGdWRDQjBieUJpZFdabVpYSWdkR2hsSUhabGNuUnBZMlZ6SUdsdUlIUm9aU0FxYzI5MWNtTmxLaUJ6Y0hKcGRHVWdZMjl2Y21ScGJtRjBaUW9nSUNBZ0x5OGdjM2x6ZEdWdElITnZJSFJvWVhRZ2QyVWdaMlYwSUhSb2FYTWdZVzF2ZFc1MElHbHVJSFJvWlNCdmRYUndkWFFnWTI5dmNtUnBibUYwWlhNdUNpQWdJQ0F2THdvZ0lDQWdMeThnU0dWeVpTQjNaU0JqWVd4amRXeGhkR1VnZEdobElHUmxjbWwyWVhScGRtVWdiMllnZEdobElHMWhjSEJwYm1jZ1puSnZiU0J6Y0hKcGRHVWdlSGtLSUNBZ0lDOHZJR052YjNKa2FXNWhkR1Z6SUNoa1pXWnBibVZrSUdKNUlHQjBjbUZ1YzJBcElHbHVkRzhnZEdobElIWnBaWGR3YjNKMElIQnBlR1ZzSUdOdmIzSmthVzVoZEdWekxnb2dJQ0FnTHk4Z1ZHaGxJR1JsY21sMllYUnBkbVVnYm1WbFpITWdkRzhnYVc1amJIVmtaU0IwYUdVZ2NISnZjR1Z5SUhSbGNtMGdabTl5SUhSb1pTQndaWEp6Y0dWamRHbDJaUW9nSUNBZ0x5OGdaR2wyYVdSbElHbHVkRzhnVGtSRExDQmxkbUZzZFdGMFpXUWdZWFFnZEdobElHTmxiblJ5WlNCd2IybHVkQ0JnZG1Oc2FYQmdMZ29nSUNBZ2JXRjBOQ0JrWDI1a1kxOWtYMk5zYVhBZ1BTQnRZWFEwS0FvZ0lDQWdJQ0FnSURFdU1DOTJZMnhwY0M1M0xDQXdMakFzSUNBZ0lDQWdJQ0FnTUM0d0xDQWdJQ0FnSUNBZ0lEQXVNQ3dLSUNBZ0lDQWdJQ0F3TGpBc0lDQWdJQ0FnSUNBZ01TNHdMM1pqYkdsd0xuY3NJREF1TUN3Z0lDQWdJQ0FnSUNBd0xqQXNDaUFnSUNBZ0lDQWdNQzR3TENBZ0lDQWdJQ0FnSURBdU1Dd2dJQ0FnSUNBZ0lDQXhMakF2ZG1Oc2FYQXVkeXdnTUM0d0xBb2dJQ0FnSUNBZ0lDMTJZMnhwY0M1NGVYb3ZLSFpqYkdsd0xuY3FkbU5zYVhBdWR5a3NJQ0FnSUNBZ0lDQWdJREF1TUFvZ0lDQWdLVHNLSUNBZ0lHMWhkRElnWkhoNWRsOWtlSGx6SUQwZ1pHbGhaMjBvTUM0MUlDb2djSGhmY0dWeVgzVnVhWFFnS2lCblpYUmZjbVZ6YjJ4MWRHbHZiaWdwS1NBcUlHMWhkRElvWkY5dVpHTmZaRjlqYkdsd0tuUnlZVzV6S1RzS0lDQWdJQzh2SUU1dmR5d2diM1Z5SUdKMVptWmxjaUJ6YVhwbElHbHpJR1Y0Y0hKbGMzTmxaQ0JwYmlCMmFXVjNjRzl5ZENCd2FYaGxiSE1nWW5WMElIZGxJR2RsZENCaVlXTnJJSFJ2Q2lBZ0lDQXZMeUIwYUdVZ2MzQnlhWFJsSUdOdmIzSmthVzVoZEdVZ2MzbHpkR1Z0SUhWemFXNW5JSFJvWlNCelkyRnNaU0JtWVdOMGIzSWdiMllnZEdobENpQWdJQ0F2THlCMGNtRnVjMlp2Y20xaGRHbHZiaUFvWm05eUlHbHpiM1J5YjNCcFl5QjBjbUZ1YzJadmNtMWhkR2x2Ym5NcExpQkdiM0lnWVc1cGMyOTBjbTl3YVdNS0lDQWdJQzh2SUhSeVlXNXpabTl5YldGMGFXOXVjeXdnZEdobElHZGxiMjFsZEhKcFl5QnRaV0Z1SUc5bUlIUm9aU0IwZDI4Z2NISnBibU5wY0d4bElITmpZV3hsSUdaaFkzUnZjbk1LSUNBZ0lDOHZJR2x6SUdFZ2NtVmhjMjl1WVdKc1pTQmpiMjF3Y205dGFYTmxPZ29nSUNBZ1pteHZZWFFnZG1sbGQzQnZjblJmWm5KdmJWOXpjSEpwZEdWZmMyTmhiR1VnUFNCemNYSjBLR0ZpY3loZlpHVjBaWEp0YVc1aGJuUW9aSGg1ZGw5a2VIbHpLU2twT3dvS0lDQWdJQzh2SUVsdUlIUm9aU0JtY21GbmJXVnVkQ0J6YUdGa1pYSWdkMlVnZDJGdWRDQnZkWElnYzJsbmJtVmtJR1JwYzNSaGJtTmxJR2x1SUhacFpYZHdiM0owSUNod2FYaGxiQ2tLSUNBZ0lDOHZJR052YjNKa2N5Qm1iM0lnWkdseVpXTjBJSFZ6WlNCcGJpQmhiblJwWVd4cFlYTnBibWNnYzNSbGNDQm1kVzVqZEdsdmJuTXVJRmRsSUhSb1pYSmxabTl5WlNCdVpXVmtDaUFnSUNBdkx5QmhJSE5qWVd4cGJtY2dabUZqZEc5eUlITnBiV2xzWVhJZ2RHOGdkbWxsZDNCdmNuUmZabkp2YlY5emNISnBkR1ZmYzJOaGJHVXNJR0oxZENCcGJtTnNkV1JwYm1jS0lDQWdJQzh2SUhSb1pTQjFkaTArYzNCeWFYUmxJR052YjNKa2FXNWhkR1VnYzNsemRHVnRJSE5qWVd4cGJtY2dabUZqZEc5eUlHRnpJSGRsYkd3dUlDQlhaU0JqYUc5dmMyVWdkRzhLSUNBZ0lDOHZJSFZ6WlNCMGFHVWdZbTkxYm1ScGJtY2dZbTk0SUNwNEtpQjNhV1IwYUNCbWIzSWdkR2hwY3k0Z1ZHaHBjeUJqYjIxbGN5QjNhWFJvSUhOdmJXVUtJQ0FnSUM4dklHTnZibk5wYzNSbGJtTjVJR052Ym1ScGRHbHZibk02Q2lBZ0lDQXZMeUFxSUVadmNpQndjbTlqWldSMWNtRnNJR1JwYzNSaGJtTmxJR1pwWld4a2N5d2dkMlVnYm1WbFpDQjBhR1VnYzNCeWFYUmxJR0p2ZFc1a2FXNW5JR0p2ZUNCMGJ5QmlaUW9nSUNBZ0x5OGdJQ0J6Y1hWaGNtVXVJQ2hKWmlCdWIzUXNJSFJvWlNCMWRpQmpiMjl5WkdsdVlYUmxjeUIzYVd4c0lHSmxJR0Z1YVhOdmRISnZjR2xqWVd4c2VTQnpZMkZzWldRZ1lXNWtDaUFnSUNBdkx5QWdJR0Z1ZVNCallXeGpkV3hoZEdsdmJpQmlZWE5sWkNCdmJpQjBhR1Z0SUhkcGJHd2dibTkwSUdKbElHRWdaR2x6ZEdGdVkyVWdablZ1WTNScGIyNHVLUW9nSUNBZ0x5OGdLaUJHYjNJZ2MyRnRjR3hsWkNCa2FYTjBZVzVqWlNCbWFXVnNaSE1zSUhkbElHNWxaV1FnZEc4Z1kyOXVjMmx6ZEdWdWRHeDVJR05vYjI5elpTQjBhR1VnS25ncUNpQWdJQ0F2THlBZ0lHWnZjaUIwYUdVZ2MyTmhiR2x1WnlCcGJpQm5aWFJmWkdsemRHRnVZMlZtYVdWc1pGOXpZMkZzWlNncExnb2dJQ0FnWm14dllYUWdjM0J5YVhSbFgyWnliMjFmZFY5elkyRnNaU0E5SUcxcGJpaGhZbk1vYlhNdWVDa3NJR0ZpY3lodGN5NTVLU2s3Q2lBZ0lDQm1jbUZuWDNWMmMyTmhiR1VnUFNCMmFXVjNjRzl5ZEY5bWNtOXRYM053Y21sMFpWOXpZMkZzWlNBcUlITndjbWwwWlY5bWNtOXRYM1ZmYzJOaGJHVTdDaUFnSUNCbWNtRm5YMlJwYzNSaGJtTmxabWxsYkdSZmMyTmhiR1VnUFNCa2FYTjBZVzVqWldacFpXeGtYM05qWVd4bEtDazdDZ29nSUNBZ0x5OGdZV1JrSUhCaFpHUnBibWNnWm05eUlFRkJMQ0J6ZEhKdmEyVWdZVzVrSUdkc2IzY2dLRzV2YmlCdVlYUnBkbVVnWkdsemRHRnVZMlZtYVdWc1pITWdaRzl1SjNRZ2JtVmxaQW9nSUNBZ0x5OGdRVUVnY0dGa1pHbHVaeUJpZFhRZ1EwbFNRMHhGSUdWMFl5QmtieWtLSUNBZ0lHWnNiMkYwSUhCd2RTQTlJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BPd29nSUNBZ1pteHZZWFFnWW1KdmVGOWlkV1lnUFNBb0NpQWdJQ0FnSUNBZ1FVNVVTVUZNU1VGVFgxSkJSRWxWVXlBcklHMWhlQ2d3TGpBc0lHZGxkRjl6ZEhKdmEyVjNhV1IwYUNncElDb2djSEIxS1NBcklHMWhlQ2d3TGpBc0lHZGxkRjluYkc5M2QybGtkR2dvS1NBcUlIQndkU2tLSUNBZ0lDa2dMeUIyYVdWM2NHOXlkRjltY205dFgzTndjbWwwWlY5elkyRnNaVHNLSUNBZ0lDOHZJRTExYkhScGNHeDVJSFJvWlNCaWRXWm1aWElnWW5rZ2MybG5iaWhpWW05NFgzSmhaR2wxY3lrZ2MyOGdkR2hoZENCdFlYSnJaWEp6YVhwbElEMDlJREFnWTJ4bFlXNXNlUW9nSUNBZ0x5OGdZMjlzYkdGd2MyVnpJSFJvWlNCd1lXUmtaV1FnWW1KdmVDQjBieUI2WlhKdklDZ3dLa2x1WmlBOVBTQk9ZVTRnY0hKdmNHRm5ZWFJsY3lCMGJ5Qm5iRjlRYjNOcGRHbHZiZ29nSUNBZ0x5OGdZVzVrSUdkbGRITWdZM1ZzYkdWa0tTNGdWMmwwYUc5MWRDQjBhR2x6TENCdFlYSnJaWEp6YVhwbElEMDlJREFnZDI5MWJHUWdjSEp2WkhWalpTQjJhWE5wWW14bElFRkJDaUFnSUNBdkx5QndZV1JrYVc1bkxDQnRZWFJqYUdsdVp5QkhURTFoYTJsbEozTWdaMlZ2YldWMGNua2djMmhoWkdWeUlHSmxhR0YyYVc5eUxnb2dJQ0FnZG1Wak1pQndZV1JrWldSZlltSnZlRjl6YVhwbElEMGdZbUp2ZUY5eVlXUnBkWE1nS3lCemFXZHVLR0ppYjNoZmNtRmthWFZ6S1NBcUlHSmliM2hmWW5WbU93b2dJQ0FnZG1Wak1pQjFkbDl3WVdSZmMyTmhiR1VnUFNCd1lXUmtaV1JmWW1KdmVGOXphWHBsSUM4Z1ltSnZlRjl5WVdScGRYTTdDZ29nSUNBZ1puSmhaMTlqYjJ4dmNpQTlJSFJ2ZG1Wak5DaG5aWFJmZG1WeWRHVjRYMk52Ykc5eUtDa3BPd29nSUNBZ1puSmhaMTl6ZEhKdmEyVmpiMnh2Y2lBOUlIUnZkbVZqTkNoblpYUmZZMjl1ZG1WeWRHVmtYM04wY205clpXTnZiRzl5S0NrcE93b2dJQ0FnWm5KaFoxOTFkbDl2Wm1aelpYUmZkMmxrZEdnZ1BTQm5aWFJmYzJSbVgzVjJLQ2s3Q2lBZ0lDQXZMeUJuWlhSZmRYWW9LU0J5WlhSMWNtNXpJQ2d3TENBd0tTd2dLREVzSURBcExDQW9NQ3dnTVNrZ2IzSWdLREVzSURFcENpQWdJQ0F2THlCMGJ5QmhZMk52Ylc5a1lYUmxJSE4wY205clpTQmhibVFnWjJ4dmQzZHBaSFJvSUhkbElHNWxaV1FnZEc4Z1pYaDBjblZrWlNCMWRpZHpJRzkxZEhkaGNtUnpJR1p5YjIwZ0tEQXVOU3dnTUM0MUtRb2dJQ0FnWm5KaFoxOTFkaUE5SUhabFl6SW9NQzQxS1NBcklDaG5aWFJmZFhZb0tTQXRJSFpsWXpJb01DNDFLU2tnS2lCMWRsOXdZV1JmYzJOaGJHVTdDZ29nSUNBZ0x5OGdjMk55WldWdUlITndZV05sSUdOdmIzSmthVzVoZEdWeklHOW1JSFJvWlNCd2IzTnBkR2x2YmdvZ0lDQWdkbVZqTkNCeGRXRmtYM1psY25SbGVDQTlJQ2gwY21GdWN5QXFJSFpsWXpRb01pNHdJQ29nY0dGa1pHVmtYMkppYjNoZmMybDZaU0FxSUdkbGRGOXdiM05wZEdsdmJpZ3BMQ0F3TGpBc0lEQXVNQ2twT3dvZ0lDQWdaMnhmVUc5emFYUnBiMjRnUFNCMlkyeHBjQ0FySUhGMVlXUmZkbVZ5ZEdWNE93b2dJQ0FnWjJ4ZlVHOXphWFJwYjI0dWVpQXJQU0JuYkY5UWIzTnBkR2x2Ymk1M0lDb2daMlYwWDJSbGNIUm9YM05vYVdaMEtDazdDZ29nSUNBZ1puSmhaMTlwYm5OMFlXNWpaVjlwWkNBOUlIVnBiblFvWjJ4ZlNXNXpkR0Z1WTJWSlJDazdDbjBLQ3E5bWNtRm5iV1Z1ZEY5emIzVnlZMlhhSlI0S2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tjSEpsWTJsemFXOXVJR2hwWjJod0lHWnNiMkYwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYzJGdGNHeGxjakpFT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYzJGdGNHeGxjak5FT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVhOaGJYQnNaWEl5UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsellXMXdiR1Z5TTBRN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCMWMyRnRjR3hsY2pKRU93cHdjbVZqYVhOcGIyNGdhR2xuYUhBZ2RYTmhiWEJzWlhJelJEc0tDbTkxZENCMlpXTTBJR1p5WVdkdFpXNTBYMk52Ykc5eU93b0tMeThnVlc1cFptOXliWE02SUFwMWJtbG1iM0p0SUdKdmIyd2dkVzVwWm05eWJWOWpiMnh2Y20xaGNEc0tZbTl2YkNCblpYUmZkVzVwWm05eWJWOWpiMnh2Y20xaGNDZ3BlM0psZEhWeWJpQjFibWxtYjNKdFgyTnZiRzl5YldGd08zMEtkVzVwWm05eWJTQjFhVzUwSUc5aWFtVmpkRjlwWkRzS2RXbHVkQ0JuWlhSZmIySnFaV04wWDJsa0tDbDdjbVYwZFhKdUlHOWlhbVZqZEY5cFpEdDlDblZ1YVdadmNtMGdiV0YwTkNCdGIyUmxiRjltTXpKak93cHRZWFEwSUdkbGRGOXRiMlJsYkY5bU16SmpLQ2w3Y21WMGRYSnVJRzF2WkdWc1gyWXpNbU03ZlFwMWJtbG1iM0p0SUdsdWRDQnpaR1pmYldGeWEyVnlYM05vWVhCbE93cHBiblFnWjJWMFgzTmtabDl0WVhKclpYSmZjMmhoY0dVb0tYdHlaWFIxY200Z2MyUm1YMjFoY210bGNsOXphR0Z3WlR0OUNuVnVhV1p2Y20wZ1pteHZZWFFnWjJ4dmQzZHBaSFJvT3dwbWJHOWhkQ0JuWlhSZloyeHZkM2RwWkhSb0tDbDdjbVYwZFhKdUlHZHNiM2QzYVdSMGFEdDlDblZ1YVdadmNtMGdabXh2WVhRZ1lYUnNZWE5mZEdWNGRIVnlaVjl6YVhwbE93cG1iRzloZENCblpYUmZZWFJzWVhOZmRHVjRkSFZ5WlY5emFYcGxLQ2w3Y21WMGRYSnVJR0YwYkdGelgzUmxlSFIxY21WZmMybDZaVHQ5Q25WdWFXWnZjbTBnWW05dmJDQndZWFIwWlhKdU93cGliMjlzSUdkbGRGOXdZWFIwWlhKdUtDbDdjbVYwZFhKdUlIQmhkSFJsY200N2ZRcDFibWxtYjNKdElHSnZiMndnY0dsamEybHVaenNLWW05dmJDQm5aWFJmY0dsamEybHVaeWdwZTNKbGRIVnliaUJ3YVdOcmFXNW5PMzBLZFc1cFptOXliU0JpYjI5c0lIVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpUc0tZbTl2YkNCblpYUmZkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGxLQ2w3Y21WMGRYSnVJSFZ1YVdadmNtMWZZMjlzYjNKeVlXNW5aVHQ5Q25WdWFXWnZjbTBnWm14dllYUWdjSGhmY0dWeVgzVnVhWFE3Q21ac2IyRjBJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BlM0psZEhWeWJpQndlRjl3WlhKZmRXNXBkRHQ5Q25WdWFXWnZjbTBnYzJGdGNHeGxjakpFSUdScGMzUmhibU5sWm1sbGJHUTdDblZ1YVdadmNtMGdkbVZqTkNCdVlXNWZZMjlzYjNJN0NuWmxZelFnWjJWMFgyNWhibDlqYjJ4dmNpZ3BlM0psZEhWeWJpQnVZVzVmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR1pzYjJGMElITjBjbTlyWlhkcFpIUm9Pd3BtYkc5aGRDQm5aWFJmYzNSeWIydGxkMmxrZEdnb0tYdHlaWFIxY200Z2MzUnliMnRsZDJsa2RHZzdmUXAxYm1sbWIzSnRJSFpsWXpNZ1pqTXlZMTl6WTJGc1pUc0tkbVZqTXlCblpYUmZaak15WTE5elkyRnNaU2dwZTNKbGRIVnliaUJtTXpKalgzTmpZV3hsTzMwS2RXNXBabTl5YlNCMlpXTXlJSEpsYzI5c2RYUnBiMjQ3Q25abFl6SWdaMlYwWDNKbGMyOXNkWFJwYjI0b0tYdHlaWFIxY200Z2NtVnpiMngxZEdsdmJqdDlDblZ1YVdadmNtMGdabXh2WVhRZ1pHVndkR2hmYzJocFpuUTdDbVpzYjJGMElHZGxkRjlrWlhCMGFGOXphR2xtZENncGUzSmxkSFZ5YmlCa1pYQjBhRjl6YUdsbWREdDlDblZ1YVdadmNtMGdkbVZqTkNCc2IzZGpiR2x3WDJOdmJHOXlPd3AyWldNMElHZGxkRjlzYjNkamJHbHdYMk52Ykc5eUtDbDdjbVYwZFhKdUlHeHZkMk5zYVhCZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdKdmIyd2dZbWxzYkdKdllYSmtPd3BpYjI5c0lHZGxkRjlpYVd4c1ltOWhjbVFvS1h0eVpYUjFjbTRnWW1sc2JHSnZZWEprTzMwS2RXNXBabTl5YlNCdFlYUTBJSEJ5WlhCeWIycGxZM1JwYjI0N0NtMWhkRFFnWjJWMFgzQnlaWEJ5YjJwbFkzUnBiMjRvS1h0eVpYUjFjbTRnY0hKbGNISnZhbVZqZEdsdmJqdDlDblZ1YVdadmNtMGdZbTl2YkNCMWJtbG1iM0p0WDJOdmJHOXlPd3BpYjI5c0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eUtDbDdjbVYwZFhKdUlIVnVhV1p2Y20xZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUhabFl6UWdhR2xuYUdOc2FYQmZZMjlzYjNJN0NuWmxZelFnWjJWMFgyaHBaMmhqYkdsd1gyTnZiRzl5S0NsN2NtVjBkWEp1SUdocFoyaGpiR2x3WDJOdmJHOXlPMzBLZFc1cFptOXliU0IyWldNMElHZHNiM2RqYjJ4dmNqc0tkbVZqTkNCblpYUmZaMnh2ZDJOdmJHOXlLQ2w3Y21WMGRYSnVJR2RzYjNkamIyeHZjanQ5Q25WdWFXWnZjbTBnWW05dmJDQjBjbUZ1YzJadmNtMWZiV0Z5YTJWeU93cGliMjlzSUdkbGRGOTBjbUZ1YzJadmNtMWZiV0Z5YTJWeUtDbDdjbVYwZFhKdUlIUnlZVzV6Wm05eWJWOXRZWEpyWlhJN2ZRb0tjSEpsWTJsemFXOXVJR2hwWjJod0lHWnNiMkYwT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnYVc1ME93b0thVzRnZG1Wak5DQm1jbUZuWDJOdmJHOXlPd3BwYmlCMlpXTXlJR1p5WVdkZmRYWTdDZ29qWkdWbWFXNWxJRU5KVWtOTVJTQWdJQ0FnSUNBZ0lDQWdJREFLSTJSbFptbHVaU0JTUlVOVVFVNUhURVVnSUNBZ0lDQWdJQ0F4Q2lOa1pXWnBibVVnVWs5VlRrUkZSRjlTUlVOVVFVNUhURVVnTWdvalpHVm1hVzVsSUVSSlUxUkJUa05GUmtsRlRFUWdJQ0FnSURNS0kyUmxabWx1WlNCVVVrbEJUa2RNUlNBZ0lDQWdJQ0FnSUNBMENnb2paR1ZtYVc1bElFMWZVMUZTVkY4eUlDQWdJQ0FnSUNBZ0lERXVOREUwTWpFek5Rb0tDaTh2SUVoaGJHWWdkMmxrZEdnZ2IyWWdZVzUwYVdGc2FXRnphVzVuSUhOdGIyOTBhSE4wWlhBS0kyUmxabWx1WlNCQlRsUkpRVXhKUVZOZlVrRkVTVlZUSURBdU56QTNNVEEyTnpneE1UZzJOVFEzTmdvS2FXNGdabXh2WVhRZ1puSmhaMTkxZG5OallXeGxPd3BwYmlCbWJHOWhkQ0JtY21GblgyUnBjM1JoYm1ObFptbGxiR1JmYzJOaGJHVTdDbWx1SUhabFl6UWdabkpoWjE5MWRsOXZabVp6WlhSZmQybGtkR2c3Q21ac1lYUWdhVzRnZFdsdWRDQm1jbUZuWDJsdWMzUmhibU5sWDJsa093cHBiaUJtYkc5aGRDQnZYMk5zYVhCZlpHbHpkR0Z1WTJWYk9GMDdDbVpzWVhRZ2FXNGdkbVZqTWlCbVgzTndjbWwwWlY5elkyRnNaVHNLWm14aGRDQnBiaUIyWldNMElHWnlZV2RmYzNSeWIydGxZMjlzYjNJN0NncDFibWxtYjNKdElHbHVkQ0IxYm1sbWIzSnRYMjUxYlY5amJHbHdYM0JzWVc1bGN6c0tDaTh2SUZSb1pYTmxJSFpsY25OcGIyNXpJRzltSUdGaGMzUmxjQ0JoYzNOMWJXVWdkR2hoZENCZ1pHbHpkR0FnYVhNZ1lTQnphV2R1WldRZ1pHbHpkR0Z1WTJVZ1puVnVZM1JwYjI0S0x5OGdkMmhwWTJnZ2FHRnpJR0psWlc0Z2MyTmhiR1ZrSUhSdklHSmxJR2x1SUhWdWFYUnpJRzltSUhCcGVHVnNjeTRLWm14dllYUWdZV0Z6ZEdWd0tHWnNiMkYwSUhSb2NtVnphRzlzWkRFc0lHWnNiMkYwSUdScGMzUXNJR1pzYjJGMElHRmhLU0I3Q2lBZ0lDQnlaWFIxY200Z2MyMXZiM1JvYzNSbGNDaDBhSEpsYzJodmJHUXhJQzBnWVdFc0lIUm9jbVZ6YUc5c1pERWdLeUJoWVN3Z1pHbHpkQ2s3Q24wS0NtWnNiMkYwSUdGaGMzUmxjQ2htYkc5aGRDQjBhSEpsYzJodmJHUXhMQ0JtYkc5aGRDQjBhSEpsYzJodmJHUXlMQ0JtYkc5aGRDQmthWE4wTENCbWJHOWhkQ0JoWVNrZ2V3b2dJQ0FnY21WMGRYSnVJSE50YjI5MGFITjBaWEFvZEdoeVpYTm9iMnhrTVNBdElHRmhMQ0IwYUhKbGMyaHZiR1F4SUNzZ1lXRXNJR1JwYzNRcElDMEtJQ0FnSUNBZ0lDQWdJQ0J6Ylc5dmRHaHpkR1Z3S0hSb2NtVnphRzlzWkRJZ0xTQmhZU3dnZEdoeVpYTm9iMnhrTWlBcklHRmhMQ0JrYVhOMEtUc0tmUW9LTHk4Z1VISnZZMlZrZFhKaGJDQnphV2R1WldRZ1pHbHpkR0Z1WTJVZ1puVnVZM1JwYjI1eklHOXVJSFJvWlNCMWRpQmpiMjl5WkdsdVlYUmxJSEJoZEdOb0lGc3dMREZkZUZzd0xERmRDaTh2SUU1dmRHVWdkR2hoZENCbWIzSWdZVzUwYVdGc2FXRnphVzVuSUhSdklIZHZjbXNnY0hKdmNHVnliSGtnZEdobGMyVWdjMmh2ZFd4a0lHSmxJQ3B6WTJGc1pTQndjbVZ6WlhKMmFXNW5LZ292THlBb1NXWWdlVzkxSUcxMWMzUWdjbVZ6WTJGc1pTQjFkaXdnYldGclpTQnpkWEpsSUhSdklIQjFkQ0IwYUdVZ2MyTmhiR1VnWm1GamRHOXlJR0poWTJzZ2FXNGdiR0YwWlhJdUtRcG1iRzloZENCMGNtbGhibWRzWlNoMlpXTXlJRkFwZXdvZ0lDQWdVQ0F0UFNCMlpXTXlLREF1TlNrN0NpQWdJQ0JtYkc5aGRDQjRJRDBnVFY5VFVWSlVYeklnS2lBb1VDNTRJQzBnVUM1NUtUc0tJQ0FnSUdac2IyRjBJSGtnUFNCTlgxTlJVbFJmTWlBcUlDaFFMbmdnS3lCUUxua3BPd29nSUNBZ1pteHZZWFFnY2pFZ1BTQnRZWGdvWVdKektIZ3BMQ0JoWW5Nb2VTa3BJQzBnTVM0d0x5Z3lMakFxVFY5VFVWSlVYeklwT3dvZ0lDQWdabXh2WVhRZ2NqSWdQU0JRTG5rN0NpQWdJQ0J5WlhSMWNtNGdMVzFoZUNoeU1TeHlNaWs3Q24wS0NtWnNiMkYwSUdOcGNtTnNaU2gyWldNeUlIVjJLWHNLSUNBZ0lISmxkSFZ5YmlBd0xqVXRiR1Z1WjNSb0tIVjJMWFpsWXpJb01DNDFLU2s3Q24wS0NtWnNiMkYwSUhKbFkzUmhibWRzWlNoMlpXTXlJSFYyS1NCN0NpQWdJQ0IyWldNeUlITWdQU0JtWDNOd2NtbDBaVjl6WTJGc1pTQXZJRzFwYmlobVgzTndjbWwwWlY5elkyRnNaUzU0TENCbVgzTndjbWwwWlY5elkyRnNaUzU1S1RzS0lDQWdJSFpsWXpJZ1pDQTlJSE1nS2lCdFlYZ29MWFYyTENCMWRpQXRJSFpsWXpJb01Ta3BPd29nSUNBZ2NtVjBkWEp1SUMwb0tHeGxibWQwYUNodFlYZ29kbVZqTWlnd0xqQXBMQ0JrS1NrZ0t5QnRhVzRvTUM0d0xDQnRZWGdvWkM1NExDQmtMbmtwS1NrcE93cDlDZ3BtYkc5aGRDQnliM1Z1WkdWa1gzSmxZM1JoYm1kc1pTaDJaV015SUhWMkxDQjJaV015SUhSc0xDQjJaV015SUdKeUtYc0tJQ0FnSUhabFl6SWdaQ0E5SUcxaGVDaDBiQzExZGl3Z2RYWXRZbklwT3dvZ0lDQWdjbVYwZFhKdUlDMG9LR3hsYm1kMGFDaHRZWGdvZG1Wak1pZ3dMakFwTENCa0tTa2dLeUJ0YVc0b01DNHdMQ0J0WVhnb1pDNTRMQ0JrTG5rcEtTa3RkR3d1ZUNrN0NuMEtDblpsWXpRZ1ptbHNiQ2gyWldNMElHWnBiR3hqYjJ4dmNpd2dkbVZqTkNCamIyeHZjaXdnZG1Wak1pQjFkaWtnZXdvZ0lDQWdjbVYwZFhKdUlHTnZiRzl5T3dwOUNuWmxZelFnWm1sc2JDaDJaV00wSUdacGJHeGpiMnh2Y2l3Z1pteHZZWFFnWTI5c2IzSXNJSFpsWXpJZ2RYWXBJSHNLSUNBZ0lISmxkSFZ5YmlCbWFXeHNZMjlzYjNJN0NuMEtkbVZqTkNCbWFXeHNLSFpsWXpRZ1ptbHNiR052Ykc5eUxDQmliMjlzSUdsdFlXZGxMQ0IyWldNeUlIVjJLU0I3SUhKbGRIVnliaUJtYVd4c1kyOXNiM0k3SUgwS2RtVmpOQ0JtYVd4c0tIWmxZelFnWXl3Z2MyRnRjR3hsY2pKRUlHbHRZV2RsTENCMlpXTXlJSFYyS1NCN0lISmxkSFZ5YmlCMFpYaDBkWEpsS0dsdFlXZGxMQ0IxZGk1NWVDazdJSDBLQ25admFXUWdjM1J5YjJ0bEtIWmxZelFnYzNSeWIydGxZMjlzYjNJc0lHWnNiMkYwSUhOcFoyNWxaRjlrYVhOMFlXNWpaU3dnWm14dllYUWdkMmxrZEdnc0lHbHViM1YwSUhabFl6UWdZMjlzYjNJc0lHWnNiMkYwSUdGaFgzSmhaR2wxY3lsN0NpQWdJQ0JwWmlBb2QybGtkR2dnSVQwZ01DNHdLWHNLSUNBZ0lDQWdJQ0JtYkc5aGRDQjBJRDBnWVdGemRHVndLRzFwYmloM2FXUjBhQ3dnTUM0d0tTd2diV0Y0S0hkcFpIUm9MQ0F3TGpBcExDQnphV2R1WldSZlpHbHpkR0Z1WTJVc0lHRmhYM0poWkdsMWN5azdDaUFnSUNBZ0lDQWdkbVZqTkNCaVoxOWpiMnh2Y2lBOUlHMXBlQ2hqYjJ4dmNpd2dkbVZqTkNoemRISnZhMlZqYjJ4dmNpNXlaMklzSURBcExDQm1iRzloZENoemFXZHVaV1JmWkdsemRHRnVZMlVnUENBd0xqVWdLaUIzYVdSMGFDa3BPd29nSUNBZ0lDQWdJR052Ykc5eUlEMGdiV2w0S0dKblgyTnZiRzl5TENCemRISnZhMlZqYjJ4dmNpd2dkQ2s3Q2lBZ0lDQjlDbjBLQ25admFXUWdaMnh2ZHloMlpXTTBJR2RzYjNkamIyeHZjaXdnWm14dllYUWdjMmxuYm1Wa1gyUnBjM1JoYm1ObExDQm1iRzloZENCcGJuTnBaR1VzSUdsdWIzVjBJSFpsWXpRZ1kyOXNiM0lwZXdvZ0lDQWdabXh2WVhRZ1oyeHZkMTkzYVdSMGFDQTlJR2RsZEY5bmJHOTNkMmxrZEdnb0tTQXFJR2RsZEY5d2VGOXdaWEpmZFc1cGRDZ3BPd29nSUNBZ1pteHZZWFFnYzNSeWIydGxYM2RwWkhSb0lEMGdaMlYwWDNOMGNtOXJaWGRwWkhSb0tDa2dLaUJuWlhSZmNIaGZjR1Z5WDNWdWFYUW9LVHNLSUNBZ0lHbG1JQ2huYkc5M1gzZHBaSFJvSUQ0Z01DNHdLWHNLSUNBZ0lDQWdJQ0JtYkc5aGRDQnZkWFJ6YVdSbElEMGdLR0ZpY3loemFXZHVaV1JmWkdsemRHRnVZMlVwSUMwZ2MzUnliMnRsWDNkcFpIUm9LU0F2SUdkc2IzZGZkMmxrZEdnN0NpQWdJQ0FnSUNBZ1pteHZZWFFnWVd4d2FHRWdQU0F4TGpBZ0xTQnZkWFJ6YVdSbE93b2dJQ0FnSUNBZ0lHTnZiRzl5SUQwZ2JXbDRLSFpsWXpRb1oyeHZkMk52Ykc5eUxuSm5ZaXdnWjJ4dmQyTnZiRzl5TG1FcVlXeHdhR0VwTENCamIyeHZjaXdnYVc1emFXUmxLVHNLSUNBZ0lIMEtmUW9LWm14dllYUWdjMk5oYkdWa1gyUnBjM1JoYm1ObFptbGxiR1FvYzJGdGNHeGxjakpFSUdScGMzUmhibU5sWm1sbGJHUXNJSFpsWXpJZ2RYWXBld29nSUNBZ0x5OGdSMng1Y0dnZ1pHbHpkR0Z1WTJVZ1ptbGxiR1FnZFc1cGRITWdZWEpsSUdsdUlIQnBlR1ZzY3k0Z1EyOXVkbVZ5ZENCMGJ5QnpZVzFsSUdScGMzUmhibU5sQ2lBZ0lDQXZMeUJ6WTJGc2FXNW5JR0Z6SUdaZmRYWXVlQ0JtYjNJZ1kyOXVjMmx6ZEdWdVkza2dkMmwwYUNCMGFHVWdjSEp2WTJWa2RYSmhiQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVUtJQ0FnSUM4dklHTmhiR04xYkdGMGFXOXVjeTRLSUNBZ0lISmxkSFZ5YmlCbWNtRm5YMlJwYzNSaGJtTmxabWxsYkdSZmMyTmhiR1VnS2lCMFpYaDBkWEpsS0dScGMzUmhibU5sWm1sbGJHUXNJSFYyS1M1eU93cDlDZ3BtYkc5aGRDQnpZMkZzWldSZlpHbHpkR0Z1WTJWbWFXVnNaQ2hpYjI5c0lHUnBjM1JoYm1ObFptbGxiR1FzSUhabFl6SWdkWFlwZXdvZ0lDQWdjbVYwZFhKdUlEQXVNRHNLZlFvS0x5OGdSMmwyWlc0Z1lTQm1jbUZuYldWdWRDQmtaWEpwZG1GMGFYWmxJRzltSUdaZmRYWWdLR2t1WlM0Z1pFWmtlQ2htWDNWMktTQnZjaUJrUm1SNUtHWmZkWFlwS1N3Z1kyRnNZM1ZzWVhSbENpOHZJSFJvWlNCaGMzTnZZMmxoZEdWa0lDaHpjWFZoY21Wa0tTQmphR0Z1WjJVZ2FXNGdkR2hsSUdScGMzUmhibU5sWm1sbGJHUXVJRlJvYVhNZ2FYTWdaV1ptWldOMGFYWmxiSGtnZEdobENpOHZJQ2h6Y1hWaGNtVmtLU0J3WVhKMGFXRnNJR1JsY21sMllYUnBkbVVnYjJZZ2RHaGxJR1JwYzNSaGJtTmxabWxsYkdRZ2QybDBhQ0J5WlhOd1pXTjBJSFJ2SUdaeVlXZHRaVzUwQ2k4dklDaHdhWGhsYkNrZ1kyOXZjbVJwYm1GMFpYTUtabXh2WVhRZ2MzRjFZWEpsWkY5d1lYSjBhV0ZzWDJSbGNtbDJZWFJsS0dac2IyRjBJR05sYm5SbGNpd2dkbVZqTWlCa1psOTFkaWtnZXdvZ0lDQWdkbVZqTWlCMWRqRWdQU0J0YVhnb1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZ3VlSGtzSUdaeVlXZGZkWFpmYjJabWMyVjBYM2RwWkhSb0xucDNMQ0JqYkdGdGNDaG1jbUZuWDNWMklDc2dNQzQxSUNvZ1pHWmZkWFlzSURBdU1Dd2dNUzR3S1NrN0NpQWdJQ0IyWldNeUlIVjJNQ0E5SUcxcGVDaG1jbUZuWDNWMlgyOW1abk5sZEY5M2FXUjBhQzU0ZVN3Z1puSmhaMTkxZGw5dlptWnpaWFJmZDJsa2RHZ3VlbmNzSUdOc1lXMXdLR1p5WVdkZmRYWWdMU0F3TGpVZ0tpQmtabDkxZGl3Z01DNHdMQ0F4TGpBcEtUc0tJQ0FnSUM4dklFbDBJR05oYmlCb1lYQndaVzRnZEdoaGRDQnZkWElnWm5KaFoyMWxiblFnYVhNZ1kyeHZjMlVnZEc4Z1lTQnRZWGhwYlhWdElHbHVJSFJvWlNCa2FYTjBZVzVqWldacFpXeGtDaUFnSUNBdkx5QjBaWGgwZFhKbExpQkpiaUIwYUdseklHTmhjMlVnZEdobElHUmxjbWwyWVhSbElHSmhjMlZrSUc5dUlHRWdjRzlwYm5RZ2RHOGdkR2hsSUd4bFpuUWdZVzVrSUhKcFoyaDBDaUFnSUNBdkx5QmpZVzRnWW1VZ1kyeHZjMlVnZEc4Z01DQjNhR1Z1SUdsMElITm9iM1ZzWkc0bmRDQmlaUzRnVkc4Z1lYWnZhV1FnZEdocGN5QjNaU0JqWVd4amRXeGhkR1VnWVFvZ0lDQWdMeThnWkdWeWFYWmhkR2wyWlNCMGJ5QmxhWFJvWlhJZ2MybGtaU0JoYm1RZ2RHRnJaU0IwYUdVZ2MzUnliMjVuWlhJZ2IyNWxMZ29nSUNBZ1pteHZZWFFnWkdZeElEMGdjMk5oYkdWa1gyUnBjM1JoYm1ObFptbGxiR1FvWkdsemRHRnVZMlZtYVdWc1pDd2dkWFl4S1NBdElHTmxiblJsY2pzS0lDQWdJR1pzYjJGMElHUm1NaUE5SUdObGJuUmxjaUF0SUhOallXeGxaRjlrYVhOMFlXNWpaV1pwWld4a0tHUnBjM1JoYm1ObFptbGxiR1FzSUhWMk1DazdDaUFnSUNCeVpYUjFjbTRnTWk0d0lDb2diV0Y0S0dSbU1TQXFJR1JtTVN3Z1pHWXlJQ29nWkdZeUtUc0tmUW9LTHk4Z1EyRnNZM1ZzWVhSbElIUm9aU0JoYm5ScExXRnNhV0Z6YVc1bklISmhaR2wxY3lCaVlYTmxaQ0J2YmlCb2IzY2diWFZqYUNCMGFHVWdaR2x6ZEdGdVkyVWdabWxsYkdRZ1kyaGhibWRsY3dvdkx5QnlaV3hoZEdsMlpTQjBieUJ1WldsbmFHSnZjbWx1WnlCellXMXdiR1Z6TGlCSlppQjBhR1VnWkhKaGQyNGdjWFZoWkNCellXMXdiR1Z6SUhSb1pTQmthWE4wWVc1alpTQm1hV1ZzWkFvdkx5QjNhWFJvSUhOdmJXVWdaR2x6ZEc5eWRHbHZiaXdnYVhRZ2QybHNiQ0JpWlNCd2FXTnJaV1FnZFhBZ2FHVnlaU0JoYm1RZ1kyOXRjR1Z1YzJGMFpXUWdhVzRnWTJoaGJtZGxjeUIwYndvdkx5QjBhR1VnWVc1MGFTMWhiR2xoYzJsdVp5QnlZV1JwZFhNdUNtWnNiMkYwSUdGemNHVmpkRjlqYjNKeVpXTjBaV1JmYkc5allXeGZZV0ZmY21Ga2FYVnpLR1pzYjJGMElITnBaMjVsWkY5a2FYTjBZVzVqWlNrZ2V3b2dJQ0FnY21WMGRYSnVJR1p5WVdkZmRYWnpZMkZzWlNBcUlFRk9WRWxCVEVsQlUxOVNRVVJKVlZNZ0tpQk5YMU5SVWxSZk1pQXFJSE54Y25Rb0NpQWdJQ0FnSUNBZ2MzRjFZWEpsWkY5d1lYSjBhV0ZzWDJSbGNtbDJZWFJsS0hOcFoyNWxaRjlrYVhOMFlXNWpaU3dnWkVaa2VDaG1jbUZuWDNWMktTa2dLd29nSUNBZ0lDQWdJSE54ZFdGeVpXUmZjR0Z5ZEdsaGJGOWtaWEpwZG1GMFpTaHphV2R1WldSZlpHbHpkR0Z1WTJVc0lHUkdaSGtvWm5KaFoxOTFkaWtwQ2lBZ0lDQXBPd3A5Q2dwMlpXTXlJR1Z1WTI5a1pWOTFhVzUwWDNSdlgyWnNiMkYwS0hWcGJuUWdkbUZzZFdVcElIc0tJQ0FnSUdac2IyRjBJR3h2ZDJWeUlEMGdabXh2WVhRb2RtRnNkV1VnSmlBd2VFWkdSa1oxS1NBdklEWTFOVE0xTGpBN0NpQWdJQ0JtYkc5aGRDQjFjSEJsY2lBOUlHWnNiMkYwS0haaGJIVmxJRDQrSURFMmRTa2dMeUEyTlRVek5TNHdPd29nSUNBZ2NtVjBkWEp1SUhabFl6SW9iRzkzWlhJc0lIVndjR1Z5S1RzS2ZRb0tkbVZqTkNCd1lXTnJYMmx1ZENoMWFXNTBJR2xrTENCMWFXNTBJR2x1WkdWNEtTQjdDaUFnSUNCMlpXTTBJSFZ1Y0dGamF6c0tJQ0FnSUhWdWNHRmpheTV5WnlBOUlHVnVZMjlrWlY5MWFXNTBYM1J2WDJac2IyRjBLR2xrS1RzS0lDQWdJSFZ1Y0dGamF5NWlZU0E5SUdWdVkyOWtaVjkxYVc1MFgzUnZYMlpzYjJGMEtHbHVaR1Y0S1RzS0lDQWdJSEpsZEhWeWJpQjFibkJoWTJzN0NuMEtDblp2YVdRZ2JXRnBiaWdwSUhzS0lDQWdJR1p2Y2lBb2FXNTBJR2tnUFNBd095QnBJRHdnZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTTdJR2tyS3lrS0lDQWdJQ0FnSUNCcFppQW9iMTlqYkdsd1gyUnBjM1JoYm1ObFcybGRJRHdnTUM0d0tRb2dJQ0FnSUNBZ0lDQWdJQ0JrYVhOallYSmtPd29LSUNBZ0lHWnNiMkYwSUhOcFoyNWxaRjlrYVhOMFlXNWpaU0E5SURBdU1Ec0tDaUFnSUNCMlpXTTBJSFYyWDI5bVppQTlJR1p5WVdkZmRYWmZiMlptYzJWMFgzZHBaSFJvT3dvZ0lDQWdkbVZqTWlCMFpYaGZkWFlnUFNCdGFYZ29kWFpmYjJabUxuaDVMQ0IxZGw5dlptWXVlbmNzSUdOc1lXMXdLR1p5WVdkZmRYWXNJREF1TUN3Z01TNHdLU2s3Q2lBZ0lDQm1iRzloZENCaFlWOXlZV1JwZFhNZ1BTQkJUbFJKUVV4SlFWTmZVa0ZFU1ZWVE93b0tJQ0FnSUdsdWRDQnphR0Z3WlNBOUlHZGxkRjl6WkdaZmJXRnlhMlZ5WDNOb1lYQmxLQ2s3Q2lBZ0lDQnBaaWh6YUdGd1pTQTlQU0JEU1ZKRFRFVXBDaUFnSUNBZ0lDQWdjMmxuYm1Wa1gyUnBjM1JoYm1ObElEMGdZMmx5WTJ4bEtHWnlZV2RmZFhZcE93b2dJQ0FnWld4elpTQnBaaWh6YUdGd1pTQTlQU0JFU1ZOVVFVNURSVVpKUlV4RUtTQjdDaUFnSUNBZ0lDQWdjMmxuYm1Wa1gyUnBjM1JoYm1ObElEMGdjMk5oYkdWa1gyUnBjM1JoYm1ObFptbGxiR1FvWkdsemRHRnVZMlZtYVdWc1pDd2dkR1Y0WDNWMktUc0tJQ0FnSUNBZ0lDQmhZVjl5WVdScGRYTWdQU0JoYzNCbFkzUmZZMjl5Y21WamRHVmtYMnh2WTJGc1gyRmhYM0poWkdsMWN5aHphV2R1WldSZlpHbHpkR0Z1WTJVcE93b2dJQ0FnSUNBZ0lHbG1JQ2huWlhSZmMzUnliMnRsZDJsa2RHZ29LU0ErSURBdU1DQjhmQ0JuWlhSZloyeHZkM2RwWkhSb0tDa2dQaUF3TGpBcElIc0tJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1EyOXRjR1Z1YzJGMFpTQm1iM0lnZEdobElHTnNZVzF3YVc1bklHOW1JSFJsZUY5MWRpQmllU0JoYmlCaGNIQnliM2hwYldGMFpRb2dJQ0FnSUNBZ0lDQWdJQ0F2THlCbGVIUmxibk5wYjI0Z2IyWWdkR2hsSUhOcFoyNWxaQ0JrYVhOMFlXNWpaU0J2ZFhSemFXUmxJSFJvWlNCMllXeHBaQ0IwWlhoMGRYSmxDaUFnSUNBZ0lDQWdJQ0FnSUM4dklISmxaMmx2Ymk0S0lDQWdJQ0FnSUNBZ0lDQWdkbVZqTWlCaWRXWjFkaUE5SUdaeVlXZGZkWFlnTFNCamJHRnRjQ2htY21GblgzVjJMQ0F3TGpBc0lERXVNQ2s3Q2lBZ0lDQWdJQ0FnSUNBZ0lITnBaMjVsWkY5a2FYTjBZVzVqWlNBdFBTQnNaVzVuZEdnb1luVm1kWFlwT3dvZ0lDQWdJQ0FnSUgwS0lDQWdJSDBnWld4elpTQnBaaWh6YUdGd1pTQTlQU0JTVDFWT1JFVkVYMUpGUTFSQlRrZE1SU2tLSUNBZ0lDQWdJQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVWdQU0J5YjNWdVpHVmtYM0psWTNSaGJtZHNaU2htY21GblgzVjJMQ0IyWldNeUtEQXVNaWtzSUhabFl6SW9NQzQ0S1NrN0NpQWdJQ0JsYkhObElHbG1LSE5vWVhCbElEMDlJRkpGUTFSQlRrZE1SU2tLSUNBZ0lDQWdJQ0J6YVdkdVpXUmZaR2x6ZEdGdVkyVWdQU0J5WldOMFlXNW5iR1VvWm5KaFoxOTFkaWs3SUM4dklISmxZM1JoYm1kc1pTaG1YM1YyS1RzS0lDQWdJR1ZzYzJVZ2FXWW9jMmhoY0dVZ1BUMGdWRkpKUVU1SFRFVXBDaUFnSUNBZ0lDQWdjMmxuYm1Wa1gyUnBjM1JoYm1ObElEMGdkSEpwWVc1bmJHVW9abkpoWjE5MWRpazdDZ29nSUNBZ2MybG5ibVZrWDJScGMzUmhibU5sSUNvOUlHWnlZV2RmZFhaelkyRnNaVHNLQ2dvZ0lDQWdabXh2WVhRZ2MzUnliMnRsWDNkcFpIUm9JRDBnWjJWMFgzTjBjbTlyWlhkcFpIUm9LQ2tnS2lCblpYUmZjSGhmY0dWeVgzVnVhWFFvS1RzS0lDQWdJR1pzYjJGMElHbHVjMmxrWlY5emRHRnlkQ0E5SUcxaGVDZ3RjM1J5YjJ0bFgzZHBaSFJvTENBd0xqQXBPd29nSUNBZ1pteHZZWFFnYVc1emFXUmxJRDBnWVdGemRHVndLR2x1YzJsa1pWOXpkR0Z5ZEN3Z2MybG5ibVZrWDJScGMzUmhibU5sTENCaFlWOXlZV1JwZFhNcE93b0tJQ0FnSUhabFl6UWdabWx1WVd4ZlkyOXNiM0lnUFNCbWFXeHNLR1p5WVdkZlkyOXNiM0lzSUhWdWFXWnZjbTFmWTI5c2IzSXNJR1p5WVdkZmRYWXBPd29nSUNBZ1ptbHVZV3hmWTI5c2IzSXVZU0E5SUdacGJtRnNYMk52Ykc5eUxtRWdLaUJwYm5OcFpHVTdDZ29nSUNBZ2MzUnliMnRsS0daeVlXZGZjM1J5YjJ0bFkyOXNiM0lzSUhOcFoyNWxaRjlrYVhOMFlXNWpaU3dnTFhOMGNtOXJaVjkzYVdSMGFDd2dabWx1WVd4ZlkyOXNiM0lzSUdGaFgzSmhaR2wxY3lrN0NpQWdJQ0JuYkc5M0tHZGxkRjluYkc5M1kyOXNiM0lvS1N3Z2MybG5ibVZrWDJScGMzUmhibU5sTENCaFlYTjBaWEFvTFhOMGNtOXJaVjkzYVdSMGFDd2djMmxuYm1Wa1gyUnBjM1JoYm1ObExDQmhZVjl5WVdScGRYTXBMQ0JtYVc1aGJGOWpiMnh2Y2lrN0Nnb2dJQ0FnTHk4Z1pHVmlkV2NnTFNCemFHOTNJR0poWTJ0bmNtOTFibVFLSUNBZ0lDOHZJR1pwYm1Gc1gyTnZiRzl5TG1FZ1BTQmpiR0Z0Y0NobWFXNWhiRjlqYjJ4dmNpNWhMQ0F3TGpBc0lERXVNQ2s3Q2lBZ0lDQXZMeUJtYVc1aGJGOWpiMnh2Y2lBOUlIWmxZelFvQ2lBZ0lDQXZMeUFnSUNBZ2RtVmpNeWd4TERBc01Da2dLaUFvTVM0d0lDMGdabWx1WVd4ZlkyOXNiM0l1WVNrZ0t5Qm1hVzVoYkY5amIyeHZjaTV5WjJJZ0tpQm1hVzVoYkY5amIyeHZjaTVoTEFvZ0lDQWdMeThnSUNBZ0lEQXVOQ0FySURBdU5pQXFJR1pwYm1Gc1gyTnZiRzl5TG1FS0lDQWdJQzh2SUNrN0Nnb2dJQ0FnYVdZZ0tIQnBZMnRwYm1jcElIc0tJQ0FnSUNBZ0lDQnBaaUFvWm1sdVlXeGZZMjlzYjNJdVlTQStJREF1TVNrZ2V3b2dJQ0FnSUNBZ0lDQWdJQ0JtY21GbmJXVnVkRjlqYjJ4dmNpQTlJSEJoWTJ0ZmFXNTBLRzlpYW1WamRGOXBaQ3dnWm5KaFoxOXBibk4wWVc1alpWOXBaQ2s3Q2lBZ0lDQWdJQ0FnZlNCbGJITmxJSHNLSUNBZ0lDQWdJQ0FnSUNBZ1pHbHpZMkZ5WkRzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ2NtVjBkWEp1T3dvZ0lDQWdmUW9LSUNBZ0lHbG1JQ2htYVc1aGJGOWpiMnh2Y2k1aElEdzlJREF1TUNsN0NpQWdJQ0FnSUNBZ1pHbHpZMkZ5WkRzS0lDQWdJSDBLSUNBZ0lHWnlZV2R0Wlc1MFgyTnZiRzl5SUQwZ1ptbHVZV3hmWTI5c2IzSTdDbjBLcVhCc2IzUmZkSGx3WmFkVFkyRjBkR1Z5cDNWd1pHRjBaWExIQldpa01UVTNPTE5wYm5OMFlXNWpaVjloZEhSeWFXSjFkR1Z6aUxKamIyNTJaWEowWldSZmNtOTBZWFJwYjI2Q3EzUjVjR1ZmYkdWdVozUm9CS1JtYkdGMHh3QVhxbkYxWVdSZmMyTmhiR1dDcTNSNWNHVmZiR1Z1WjNSb0FxUm1iR0YweHdBWHJXMWhjbXRsY2w5dlptWnpaWFNDcTNSNWNHVmZiR1Z1WjNSb0E2Um1iR0YweHdBWHRXTnZiblpsY25SbFpGOXpkSEp2YTJWamIyeHZjb0tyZEhsd1pWOXNaVzVuZEdnRXBHWnNZWFRIQUJlbWMyUm1YM1YyZ3F0MGVYQmxYMnhsYm1kMGFBU2tabXhoZE1jQUY2MTNaMnhmY0c5emFYUnBiMjV6Z3F0MGVYQmxYMnhsYm1kMGFBS2tabXhoZE1jQUY2eDJaWEowWlhoZlkyOXNiM0tDcTNSNWNHVmZiR1Z1WjNSb0JLUm1iR0YweHdBWHEzRjFZV1JmYjJabWMyVjBncXQwZVhCbFgyeGxibWQwYUFLa1pteGhkTWNBRjR5c2RISmhibk53WVhKbGJtTjV3cVo2ZG1Gc2RXWEtBQUFBQUtSdVlXMWwyU0ZzYVc1bGMyVm5iV1Z1ZEhNdE1UZ3lNakF5TmpjMU5ERTROemczTVRnNU1EQ3BZMkZ0WDNOd1lXTmxwR1JoZEdHb2RXNXBabTl5YlhPT3NuVnVhV1p2Y20xZlkyOXNiM0p5WVc1blpjS3BibUZ1WDJOdmJHOXkyQmNBQUFBQUFBQUFBQUFBQUFBQUFBQUFxbTF2WkdWc1gyWXpNbVBIUUJjQUFJQS9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL3RuVnVhV1p2Y20xZmNHRjBkR1Z5Ymw5c1pXNW5kR2pLUDRBQUFLeHpZMlZ1WlY5dmNtbG5hVzdYRndBQUFBQUFBQUFBcld4dmQyTnNhWEJmWTI5c2IzTFlGOEMwaUQ0VHRwODdGYW1vUGdBQWdEK3dkVzVwWm05eWJWOWpiMnh2Y20xaGNNS25jR2xqYTJsdVo4SzNkVzVwWm05eWJWOXVkVzFmWTJ4cGNGOXdiR0Z1WlhNQXAyeHBibVZqWVhBQXEyUmxjSFJvWDNOb2FXWjB5Z0FBQUFDdmRXNXBabTl5YlY5d1lYUjBaWEp1d3E1b2FXZG9ZMnhwY0Y5amIyeHZjdGdYZ0VWK1ArajVaei8xWXhNK0FBQ0FQN04xYm1sbWIzSnRYMk5zYVhCZmNHeGhibVZ6eDRBWEFBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNm5kbWx6YVdKc1pjT29iM1psY21SeVlYZkNxMmx6WDNObFoyMWxiblJ6dzZwaGRIUnlhV0oxZEdWemc3RjFibWxtYjNKdFgyeHBibVYzYVdSMGFJS3JkSGx3WlY5c1pXNW5kR2dCcEdac1lYVEhBQmVxYkdsdVpWOWpiMnh2Y29LcmRIbHdaVjlzWlc1bmRHZ0VwR1pzWVhUSEFCZTZjRzl6YVhScGIyNXpYM1J5WVc1elptOXliV1ZrWDJZek1tT0NxM1I1Y0dWZmJHVnVaM1JvQTZSbWJHRjB4d0FYcEhWMWFXUzBNVGd5TWpBeU5qYzFOREU0TnpnM01UZzVNRENwY0d4dmRGOTBlWEJscFV4cGJtVnpwM1Z3WkdGMFpYTEhCV2lrTVRVM09hOWlZV05yWjNKdmRXNWtZMjlzYjNMSEJXaWtNVFUwTjdWallXMWxjbUZmY21Wc1lYUnBkbVZmYkdsbmFIVEhCV2lrTVRVME5LaGphR2xzWkhKbGJwR09wMkZ0WW1sbGJuVEhCV2lrTVRVek42VndiRzkwYzVHTXJIUnlZVzV6Y0dGeVpXNWplY0ttZW5aaGJIVmx5Z0FBQUFDa2JtRnRaYmxzYVc1bGN5MDJPREV6T0RFNU9EVXpNekV5TURJeE5UZ3pxV05oYlY5emNHRmpaYVJrWVhSaHFIVnVhV1p2Y20xejNnQVNxMjFwZEdWeVgyeHBiV2wweXI4QUFBQ3lkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGx3cWx1WVc1ZlkyOXNiM0xZRndBQUFBQUFBQUFBQUFBQUFBQUFBQUNxYlc5a1pXeGZaak15WThkQUZ3QUFnRDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdEKzJkVzVwWm05eWJWOXdZWFIwWlhKdVgyeGxibWQwYU1vL2dBQUFySE5qWlc1bFgyOXlhV2RwYnRjWEFBQ1VRZ0FBYkVLdGJHOTNZMnhwY0Y5amIyeHZjdGdYd0xTSVBoTzJuenNWcWFnK0FBQ0FQN0IxYm1sbWIzSnRYMk52Ykc5eWJXRnd3cWR3YVdOcmFXNW53ckYxYm1sbWIzSnRYMnhwYm1WM2FXUjBhTXBBQUFBQXQzVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6QUtkc2FXNWxZMkZ3QUtwc2FXNWxYMk52Ykc5eTJCZU5qSXcrZzRJQ1A3VzBORDhBQUlBL3EyUmxjSFJvWDNOb2FXWjB5Z0FBQUFDcGFtOXBibk4wZVd4bEFLOTFibWxtYjNKdFgzQmhkSFJsY203Q3MzVnVhV1p2Y20xZlkyeHBjRjl3YkdGdVpYUEhnQmNBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNEFBQUFBQUFBQUFBQUFBQUFvYTI3T0FBQUFBQUFBQUFBQUFBQUFLR3R1enE1b2FXZG9ZMnhwY0Y5amIyeHZjdGdYZ0VWK1ArajVaei8xWXhNK0FBQ0FQNmQyYVhOcFlteGx3Nmh2ZG1WeVpISmhkOEtyYVhOZmMyVm5iV1Z1ZEhQQ3FtRjBkSEpwWW5WMFpYT0J1bkJ2YzJsMGFXOXVjMTkwY21GdWMyWnZjbTFsWkY5bU16SmpncXQwZVhCbFgyeGxibWQwYUFLa1pteGhkTWdNZ0JjQUFBQUFBQUFBQUl3QWdUd3YvNEE4akFBQlBSZjdBRDNTZ0VFOVptNUJQWXdBZ1QyMzZvQTlyMENoUFF3V29UM1NnTUU5SnpmQlBmWEE0VDM5UytFOWpBQUJQa1NwQUQ2ZUlCRStYYVFRUHE5QUlUNUpsaUErd1dBeFBnSitNRDdTZ0VFK2lGcEFQdVNnVVQ3WEtsQSs5Y0JoUHZEdFh6NEg0WEUrMGFKdlBvd0FnVDU4U0g4K2xSQ0pQdmx1aHo2ZUlKRStHekdQUHFjd21UNG02cFkrcjBDaFBwMlpuajY0VUtrK0FqK21Qc0Znc1Q3YTJhMCt5bkM1UHFocHRUN1NnTUUrOHUyOFB0dVF5VDQrWnNRKzVLRFJQaExTeXo3dHNOays5VERUUHZYQTRUNXhndG8rL3REcFBnM0c0VDRINGZFK1Zmdm9QaER4K1Q3U0lmQStqQUFCUHhFNTl6NlJDQVUvbmtEK1BwVVFDVDhFbkFJL21SZ05QMjRQQmorZUlCRS9WWG9KUDZJb0ZUK0MzQXcvcHpBWlA3NDFFRCtyT0IwLzA0VVRQNjlBSVQrS3pCWS90RWdsUDY0SkdqKzRVQ2svQ3owZFA3eFlMVDl0WmlBL3dXQXhQNkNGSXovRmFEVS9jcG9tUDhwd09UK3dwQ2svem5nOVB5bWtMRC9TZ0VFL3JaZ3ZQOWVJUlQ4TGdqSS8yNUJKUHhSZ05UL2dtRTAvbWpJNFArU2dVVDl1K1RvLzZLaFZQMk8wUFQvdHNGay9UbU5BUC9HNFhUOENCa00vOWNCaFAxU2NSVC82eUdVL0hDWklQLzdRYVQ4dW8wby9BOWx0UDJRVFRUOEg0WEUvbFhaUFB3dnBkVCthekZFL0VQRjVQMDRWVkQ4VStYMC9pMUJXUDR3QWdUOHRmbGcvamdTRFB4R2VXaitSQ0lVL0ZMQmNQNU1NaHo4VnRGNC9sUkNKUC9PcFlEK1hGSXMvanBGaVA1a1lqVC9HYW1RL25CeVBQMzgxWmorZUlKRS9tdkZuUDZBa2t6LzhubWsvb2lpVlA0azlheitrTEpjL0tNMXNQNmN3bVQrK1RXNC9xVFNiUHpPL2J6K3JPSjAvY1NGeFA2MDhuejlmZEhJL3IwQ2hQK3EzY3oreVJLTS8rK3QwUDdSSXBUK0JFSFkvdGt5blAyY2xkeis0VUtrL25pcDRQN3BVcXo4VElIay92Rml0UDdjRmVqKy9YSzgvZmR0NlA4RmdzVDlXb1hzL3cyU3pQelZYZkQvRmFMVS9FUDE4UDhkc3R6L2JrbjAveW5DNVA0MFlmai9NZExzL0hvNStQODU0dlQrSDgzNC8wSHkvUDhCSWZ6L1NnTUUveEkxL1A5V0V3eitQd244LzE0akZQeDduZnovWmpNYy9idnQvUDl1UXlUOSsvMzgvM1pUTFAwN3pmei9nbU0wLzN0Wi9QK0tjeno4eHFuOC81S0RSUDBsdGZ6L21wTk0vS1NCL1AraW8xVC9Zd240LzY2elhQMXRWZmovdHNOay91TmQ5UCsrMDJ6LzRTWDAvOGJqZFB5U3NmRC96dk44L1JmNTdQL1hBNFQ5b1FIcy8rTVRqUDVkeWVqLzZ5T1UvNEpSNVAvek01ejlScDNnLy90RHBQL3FwZHo4QTFlcy82WngyUHdQWjdUOHhnSFUvQmQzdlArTlRkRDhINGZFL0VoaHpQd25sOHovVHpIRS9DK24xUHpweWNEOE83ZmMvWGdodlB4RHgrVDlWajIwL0V2WDdQemdIYkQ4VStmMC9IM0JxUHhiOS96OGt5bWcvakFBQlFHSVZaeitOQWdKQTlGRmxQNDRFQTBENGYyTS9rQVlFUUl1ZllUK1JDQVZBeTdCZlA1SUtCa0RYczEwL2t3d0hRTkdvV3orVURnaEEyWTlaUDVVUUNVQVNhVmMvbGhJS1FKMDBWVCtYRkF0QW9QSlNQNWdXREVBL28xQS9tUmdOUUo5R1RqK2JHZzVBNTl4TFA1d2NEMEErWmtrL25SNFFRTXppUmorZUlCRkF1bEpFUDU4aUVrQXh0a0Uvb0NRVFFGd05QeitoSmhSQVoxZzhQNklvRlVCOWx6ay9veW9XUU1yS05qK2tMQmRBZmZJelA2VXVHRURFRGpFL3B6QVpRTTBmTGorb01ocEF5Q1VyUDZrMEcwRG5JQ2cvcWpZY1FGZ1JKVCtyT0IxQVVQY2hQNnc2SGtELzBoNC9yVHdmUUpta0d6K3VQaUJBVW13WVA2OUFJVUJkS2hVL3NFSWlRUEhlRVQreVJDTkFRb29PUDdOR0pFQ0dMQXMvdEVnbFFQWEZCeisxU2laQXhWWUVQN1pNSjBBdjN3QS90MDRvUU5XKytqNjRVQ2xBWUsvelBybFNLa0Iwa093K3VsUXJRSU5pNVQ2N1ZpeEFBaWJlUHJ4WUxVQm8yOVkrdmxvdVFDbUR6ejYvWEM5QXZoM0lQc0JlTUVDZnE4QSt3V0F4UUVVdHVUN0NZakpBS3FPeFBzTmtNMERIRGFvK3hHWTBRSnB0b2o3RmFEVkFITU9hUHNacU5rRE1EcE0reDJ3M1FDVlJpejdKYmpoQXA0cURQc3B3T1VDZGQzYyt5M0k2UURmS1p6N01kRHRBR2c1WVBzMTJQRUJHUkVnK3puZzlRTHh0T0Q3UGVqNUFmSXNvUHRCOFAwQ0puaGcrMFg1QVFPYW5DRDdTZ0VGQUxWSHhQZFNDUWtBN1E5RTkxWVJEUUFFb3NUM1doa1JBaUFHUlBkZUlSVUMwbzJFOTJJcEdRQVkySVQzWmpFZEFOM3pCUE5xT1NFQTFBQUU4MjVCSlFEVUFBYnpja2twQU4zekJ2TjJVUzBBR05pRzkzcFpNUUxTalliM2dtRTFBaUFHUnZlR2FUa0FCS0xHOTRweFBRRHREMGIzam5sQkFMVkh4dmVTZ1VVRG1wd2krNWFKU1FJbWVHTDdtcEZOQWZJc292dWVtVkVDOGJUaSs2S2hWUUVaRVNMN3BxbFpBR2c1WXZ1dXNWMEEzeW1lKzdLNVlRSjEzZDc3dHNGbEFwNHFEdnU2eVdrQWxVWXUrNzdSYlFNd09rNzd3dGx4QUhNT2F2dkc0WFVDYWJhSys4cnBlUU1jTnFyN3p2RjlBS3FPeHZ2UytZRUJGTGJtKzljQmhRSityd0w3M3dtSkF2aDNJdnZqRVkwQXBnOCsrK2Naa1FHamIxcjc2eUdWQUFpYmV2dnZLWmtDRFl1VysvTXhuUUhTUTdMNzl6bWhBWUsvenZ2N1FhVURWdnZxKy85SnFRQy9mQUw4QTFXdEF4VllFdndMWGJFRDF4UWUvQTlsdFFJWXNDNzhFMjI1QVFvb092d1hkYjBEeDNoRy9CdDl3UUYwcUZiOEg0WEZBVW13WXZ3ampja0NacEJ1L0NlVnpRUC9TSHI4SzUzUkFVUGNodnd2cGRVQllFU1cvRE90MlFPY2dLTDhPN1hkQXlDVXJ2dy92ZUVETkh5Ni9FUEY1UU1RT01iOFI4M3BBZmZJenZ4TDFlMERLeWphL0UvZDhRSDJYT2I4VStYMUFaMWc4dnhYN2ZrQmNEVCsvRnYxL1FERzJRYitNZjRCQXVsSkV2NHdBZ1VETTRrYS9qWUdCUUQ1bVNiK05Bb0pBNTl4THY0NkRna0NmUms2L2pnU0RRRCtqVUwrUGhZTkFvUEpTdjVBR2hFQ2RORlcva0llRVFCSnBWNytSQ0lWQTJZOVp2NUdKaFVEUnFGdS9rZ3FHUU5lelhiK1NpNFpBeTdCZnY1TU1oMENMbjJHL2s0MkhRUGgvWTcrVURvaEE5RkZsdjVTUGlFQmlGV2UvbFJDSlFDVEthTCtXa1lsQUgzQnF2NVlTaWtBNEIyeS9sNU9LUUZXUGJiK1hGSXRBWGdodnY1aVZpMEE2Y25DL21CYU1RTlBNY2IrWmw0eEFFaGh6djVrWWpVRGpVM1MvbXBtTlFER0FkYitiR281QTZaeDJ2NXViamtENnFYZS9uQnlQUUZHbmVMK2NuWTlBNEpSNXY1MGVrRUNYY25xL25aK1FRR2hBZTcrZUlKRkFSZjU3djU2aGtVQWtySHkvbnlLU1FQaEpmYitmbzVKQXVOZDl2NkFrazBCYlZYNi9vYVdUUU5qQ2ZyK2hKcFJBS1NCL3Y2S25sRUJKYlgrL29paVZRREdxZjcranFaVkEzdFovdjZNcWxrQk84MysvcEt1V1FINy9mNytrTEpkQWJ2dC92Nld0bDBBZTUzKy9wUzZZUUkvQ2Y3K21yNWhBeEkxL3Y2Y3dtVURBU0grL3A3R1pRSWZ6ZnIrb01wcEFIbzUrdjZpem1rQ05HSDYvcVRTYlFOdVNmYitwdFp0QUVQMTh2Nm8ybkVBMVYzeS9xcmVjUUZhaGU3K3JPSjFBZmR0NnY2eTVuVUMzQlhxL3JEcWVRQk1nZWIrdHU1NUFuaXA0djYwOG4wQm5KWGUvcnIyZlFJRVFkcit1UHFCQSsrdDB2Nisvb0VEcXQzTy9yMENoUUY5MGNyK3d3YUZBY1NGeHY3QkNva0F6djIrL3NjT2lRTDVOYnIreVJLTkFLTTFzdjdMRm8wQ0pQV3UvczBha1FQeWVhYit6eDZSQW12Rm52N1JJcFVCL05XYS90TW1sUU1acVpMKzFTcVpBanBGaXY3WExwa0R6cVdDL3RreW5RQlcwWHIrMnphZEFGTEJjdjdkT3FFQVJubHEvdU0rb1FDMStXTCs0VUtsQWkxQld2N25ScVVCT0ZWUy91VktxUUpyTVViKzYwNnBBbFhaUHY3cFVxMEJrRTAyL3U5V3JRQzZqU3IrN1ZxeEFIQ1pJdjd6WHJFQlVuRVcvdkZpdFFBSUdRNys5MmExQVRtTkF2NzVhcmtCanREMi92dHV1UUc3NU9yKy9YSzlBbWpJNHY3L2RyMEFVWURXL3dGNndRQXVDTXIvQTM3QkFyWmd2djhGZ3NVQXBwQ3kvd2VHeFFMQ2tLYi9DWXJKQWNwb212OFBqc2tDZ2hTTy93MlN6UUcxbUlML0U1Yk5BQ3owZHY4Um10RUN1Q1JxL3hlZTBRSXJNRnIvRmFMVkEwNFVUdjhicHRVQytOUkMveG1xMlFJTGNETC9INjdaQVZYb0p2OGRzdDBCdUR3YS95TzIzUUFTY0FyL0picmhBbmtEK3ZzbnZ1RUFST2ZlK3luQzVRTkloOEw3SzhibEFWZnZvdnN0eXVrQU54dUcreS9PNlFIR0MycjdNZEx0QTlURFR2c3oxdTBBUzBzdSt6WGE4UUQ1bXhMN045N3hBOHUyOHZzNTR2VUNvYWJXK3ovbTlRTnJacmI3UGVyNUFBaittdnREN3ZrQ2RtWjYrMEh5L1FDYnFscjdSL2I5QUd6R1B2dEYrd0VENWJvZSswdi9BUUh4SWY3N1NnTUZBMGFKdnZ0TUJ3a0R3N1YrKzFJTENRTmNxVUw3VUE4TkFpRnBBdnRXRXcwQUNmakMrMVFYRVFFbVdJTDdXaHNSQVhhUVF2dFlIeFVCRXFRQysxNGpGUVAxTDRiM1hDY1pBSnpmQnZkaUt4a0FNRnFHOTJBdkhRTGZxZ0wzWmpNZEFabTVCdmRvTnlFQVgrd0M5Mm83SVFDLy9nTHpiRDhsQU1qR05wYVIxZFdsa3N6WTRNVE00TVRrNE5UTXpNVEl3TWpFMU9ET3BjR3h2ZEY5MGVYQmxwVXhwYm1WenAzVndaR0YwWlhMSEJXaWtNVFUwTXE5aVlXTnJaM0p2ZFc1a1kyOXNiM0xIQldpa01UVXpPYlZqWVcxbGNtRmZjbVZzWVhScGRtVmZiR2xuYUhUSEJXaWtNVFV6TnFoamFHbHNaSEpsYnBHT3AyRnRZbWxsYm5USEJXaWtNVFV5T2FWd2JHOTBjNUdQckhSeVlXNXpjR0Z5Wlc1amVjT2xjM0JoWTJXbGNHbDRaV3lzZG1WeWRHVjRZWEp5WVhsemdxZHViM0p0WVd4emdxdDBlWEJsWDJ4bGJtZDBhQU9rWm14aGRNZGdGd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVA3cHdiM05wZEdsdmJuTmZkSEpoYm5ObWIzSnRaV1JmWmpNeVk0S3JkSGx3WlY5c1pXNW5kR2dDcEdac1lYVEhRQmRLVDVuQmhmL3h3UkU0eVVPRi8vSEJFVGpKUTRYLzhVRktUNW5CaGYveFFRQUFBQUFBQUFBQUFBQjBRZ0FBQUFBQUFIUkNBQURjUVFBQUFBQUFBTnhCcG5wMllXeDFaY3BFZWdBQXBHNWhiV1c1YldWemFDMHhOamcxT1RNM05EUXpNREE0TVRRd05qQXpOS2xqWVcxZmMzQmhZMldsY0dsNFpXeW9kVzVwWm05eWJYUGVBQmkrYVc1MFpYSndiMnhoZEdWZmFXNWZabkpoWjIxbGJuUmZjMmhoWkdWeXc2bGlZV05yYkdsbmFIVEtBQUFBQUxKMWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJYQ3AyUnBabVoxYzJYSERCY0FBSUEvQUFDQVB3QUFnRCtwYm1GdVgyTnZiRzl5MkJjQUFBQUFBQUFBQUFBQUFBQUFBQUFBcW0xdlpHVnNYMll6TW1QSFFCY0FBSUEvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZWtRQUFJQS9wM0JoZEhSbGNtN0NwM05vWVdScGJtZkNyV3h2ZDJOc2FYQmZZMjlzYjNMWUY4QzBpRDRUdHA4N0ZhbW9QZ0FBZ0Qrb2MzQmxZM1ZzWVhMSERCZk56RXcremN4TVBzM01URDYxVUVsRFMwbE9SMTlKVGtSRldGOUdVazlOWDFWV3c3QjFibWxtYjNKdFgyTnZiRzl5YldGd3dyQjNaMnhmZFhaZmRISmhibk5tYjNKdHh5UVhBQUFBQUFBQWdEOEFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFJQS9wM0JwWTJ0cGJtZkN0M1Z1YVdadmNtMWZiblZ0WDJOc2FYQmZjR3hoYm1WekFLbHZZbXBsWTNSZmFXUUFyWFZ1YVdadmNtMWZZMjlzYjNMWUZ3QUFBQUFBQUFBQUFBQUFBTTNNVEQ2c2RtVnlkR1Y0WDJOdmJHOXl3cXRrWlhCMGFGOXphR2xtZE1vQUFBQUFzbmR2Y214a1gyNXZjbTFoYkcxaGRISnBlTWNrRndBQWdEOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFBQUFBQUNBUDY1b2FXZG9ZMnhwY0Y5amIyeHZjdGdYZ0VWK1ArajVaei8xWXhNK0FBQ0FQN04xYm1sbWIzSnRYMk5zYVhCZmNHeGhibVZ6eDRBWEFBQUFBQUFBQUFBQUFBQUFLR3R1emdBQUFBQUFBQUFBQUFBQUFDaHJiczRBQUFBQUFBQUFBQUFBQUFBb2EyN09BQUFBQUFBQUFBQUFBQUFBS0d0dXpnQUFBQUFBQUFBQUFBQUFBQ2hyYnM0QUFBQUFBQUFBQUFBQUFBQW9hMjdPQUFBQUFBQUFBQUFBQUFBQUtHdHV6Z0FBQUFBQUFBQUFBQUFBQUNocmJzNnBjMmhwYm1sdVpYTnp5a0lBQUFDeWRHVjRkSFZ5WldOdmIzSmthVzVoZEdWejF4Y0FBQUFBQUFBQUFLZDJhWE5wWW14bHdxaHZkbVZ5WkhKaGQ4T2xabUZqWlhQSFlCWUFBQUFBQVFBQUFBUUFBQUFFQUFBQUFRQUFBQVVBQUFBQkFBQUFBZ0FBQUFVQUFBQUZBQUFBQWdBQUFBWUFBQUFDQUFBQUF3QUFBQVlBQUFBR0FBQUFBd0FBQUFjQUFBQURBQUFBQUFBQUFBY0FBQUFIQUFBQUFBQUFBQVFBQUFDa2RYVnBaTFF4TmpnMU9UTTNORFF6TURBNE1UUXdOakF6TksxMlpYSjBaWGhmYzI5MWNtTmwyaGFhQ25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYm5RN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCbWJHOWhkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSE5oYlhCc1pYSXpSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYzJGdGNHeGxjak5FT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl5UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUhWellXMXdiR1Z5TTBRN0NpOHZJSFpsY25SbGVDQnBibkIxZEhNNklBcHBiaUIyWldNeklHNXZjbTFoYkhNN0NuWmxZek1nWjJWMFgyNXZjbTFoYkhNb0tYdHlaWFIxY200Z2JtOXliV0ZzY3p0OUNtbHVJSFpsWXpJZ2NHOXphWFJwYjI1elgzUnlZVzV6Wm05eWJXVmtYMll6TW1NN0NuWmxZeklnWjJWMFgzQnZjMmwwYVc5dWMxOTBjbUZ1YzJadmNtMWxaRjltTXpKaktDbDdjbVYwZFhKdUlIQnZjMmwwYVc5dWMxOTBjbUZ1YzJadmNtMWxaRjltTXpKak8zMEtDaTh2SUZWdWFXWnZjbTF6T2lBS2RXNXBabTl5YlNCaWIyOXNJSFZ1YVdadmNtMWZZMjlzYjNKdFlYQTdDbUp2YjJ3Z1oyVjBYM1Z1YVdadmNtMWZZMjlzYjNKdFlYQW9LWHR5WlhSMWNtNGdkVzVwWm05eWJWOWpiMnh2Y20xaGNEdDlDblZ1YVdadmNtMGdkV2x1ZENCdlltcGxZM1JmYVdRN0NuVnBiblFnWjJWMFgyOWlhbVZqZEY5cFpDZ3BlM0psZEhWeWJpQnZZbXBsWTNSZmFXUTdmUXAxYm1sbWIzSnRJRzFoZERRZ2JXOWtaV3hmWmpNeVl6c0tiV0YwTkNCblpYUmZiVzlrWld4ZlpqTXlZeWdwZTNKbGRIVnliaUJ0YjJSbGJGOW1NekpqTzMwS2RXNXBabTl5YlNCMlpXTXpJSE53WldOMWJHRnlPd3AyWldNeklHZGxkRjl6Y0dWamRXeGhjaWdwZTNKbGRIVnliaUJ6Y0dWamRXeGhjanQ5Q25WdWFXWnZjbTBnWW05dmJDQndhV05yYVc1bk93cGliMjlzSUdkbGRGOXdhV05yYVc1bktDbDdjbVYwZFhKdUlIQnBZMnRwYm1jN2ZRcDFibWxtYjNKdElHSnZiMndnY0dGMGRHVnlianNLWW05dmJDQm5aWFJmY0dGMGRHVnliaWdwZTNKbGRIVnliaUJ3WVhSMFpYSnVPMzBLZFc1cFptOXliU0JpYjI5c0lHbHVkR1Z5Y0c5c1lYUmxYMmx1WDJaeVlXZHRaVzUwWDNOb1lXUmxjanNLWW05dmJDQm5aWFJmYVc1MFpYSndiMnhoZEdWZmFXNWZabkpoWjIxbGJuUmZjMmhoWkdWeUtDbDdjbVYwZFhKdUlHbHVkR1Z5Y0c5c1lYUmxYMmx1WDJaeVlXZHRaVzUwWDNOb1lXUmxjanQ5Q25WdWFXWnZjbTBnWW05dmJDQjJaWEowWlhoZlkyOXNiM0k3Q21KdmIyd2daMlYwWDNabGNuUmxlRjlqYjJ4dmNpZ3BlM0psZEhWeWJpQjJaWEowWlhoZlkyOXNiM0k3ZlFwMWJtbG1iM0p0SUdac2IyRjBJR0poWTJ0c2FXZG9kRHNLWm14dllYUWdaMlYwWDJKaFkydHNhV2RvZENncGUzSmxkSFZ5YmlCaVlXTnJiR2xuYUhRN2ZRcDFibWxtYjNKdElHSnZiMndnZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsT3dwaWIyOXNJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJVb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjbkpoYm1kbE8zMEtkVzVwWm05eWJTQmliMjlzSUZCSlEwdEpUa2RmU1U1RVJWaGZSbEpQVFY5VlZqc0tZbTl2YkNCblpYUmZVRWxEUzBsT1IxOUpUa1JGV0Y5R1VrOU5YMVZXS0NsN2NtVjBkWEp1SUZCSlEwdEpUa2RmU1U1RVJWaGZSbEpQVFY5VlZqdDlDblZ1YVdadmNtMGdkbVZqTkNCdVlXNWZZMjlzYjNJN0NuWmxZelFnWjJWMFgyNWhibDlqYjJ4dmNpZ3BlM0psZEhWeWJpQnVZVzVmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR1pzYjJGMElITm9hVzVwYm1WemN6c0tabXh2WVhRZ1oyVjBYM05vYVc1cGJtVnpjeWdwZTNKbGRIVnliaUJ6YUdsdWFXNWxjM003ZlFwMWJtbG1iM0p0SUhabFl6SWdkR1Y0ZEhWeVpXTnZiM0prYVc1aGRHVnpPd3AyWldNeUlHZGxkRjkwWlhoMGRYSmxZMjl2Y21ScGJtRjBaWE1vS1h0eVpYUjFjbTRnZEdWNGRIVnlaV052YjNKa2FXNWhkR1Z6TzMwS2RXNXBabTl5YlNCbWJHOWhkQ0JrWlhCMGFGOXphR2xtZERzS1pteHZZWFFnWjJWMFgyUmxjSFJvWDNOb2FXWjBLQ2w3Y21WMGRYSnVJR1JsY0hSb1gzTm9hV1owTzMwS2RXNXBabTl5YlNCMlpXTTBJR3h2ZDJOc2FYQmZZMjlzYjNJN0NuWmxZelFnWjJWMFgyeHZkMk5zYVhCZlkyOXNiM0lvS1h0eVpYUjFjbTRnYkc5M1kyeHBjRjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdiV0YwTXlCM2IzSnNaRjl1YjNKdFlXeHRZWFJ5YVhnN0NtMWhkRE1nWjJWMFgzZHZjbXhrWDI1dmNtMWhiRzFoZEhKcGVDZ3BlM0psZEhWeWJpQjNiM0pzWkY5dWIzSnRZV3h0WVhSeWFYZzdmUXAxYm1sbWIzSnRJSFpsWXpRZ2RXNXBabTl5YlY5amIyeHZjanNLZG1Wak5DQm5aWFJmZFc1cFptOXliVjlqYjJ4dmNpZ3BlM0psZEhWeWJpQjFibWxtYjNKdFgyTnZiRzl5TzMwS2RXNXBabTl5YlNCMlpXTTBJR2hwWjJoamJHbHdYMk52Ykc5eU93cDJaV00wSUdkbGRGOW9hV2RvWTJ4cGNGOWpiMnh2Y2lncGUzSmxkSFZ5YmlCb2FXZG9ZMnhwY0Y5amIyeHZjanQ5Q25WdWFXWnZjbTBnWW05dmJDQnphR0ZrYVc1bk93cGliMjlzSUdkbGRGOXphR0ZrYVc1bktDbDdjbVYwZFhKdUlITm9ZV1JwYm1jN2ZRcDFibWxtYjNKdElIWmxZek1nWkdsbVpuVnpaVHNLZG1Wak15Qm5aWFJmWkdsbVpuVnpaU2dwZTNKbGRIVnliaUJrYVdabWRYTmxPMzBLZFc1cFptOXliU0J0WVhReklIZG5iRjkxZGw5MGNtRnVjMlp2Y20wN0NtMWhkRE1nWjJWMFgzZG5iRjkxZGw5MGNtRnVjMlp2Y20wb0tYdHlaWFIxY200Z2QyZHNYM1YyWDNSeVlXNXpabTl5YlR0OUNnb0tDbkJ5WldOcGMybHZiaUJvYVdkb2NDQm1iRzloZERzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUdsdWREc0tDbTkxZENCMlpXTXlJR1p5WVdkZmRYWTdDbTkxZENCMlpXTXpJRzlmYm05eWJXRnNPd3B2ZFhRZ2RtVmpNeUJ2WDJOaGJXUnBjanNLQ205MWRDQjJaV00wSUdaeVlXZGZZMjlzYjNJN0NtOTFkQ0JtYkc5aGRDQnZYMk5zYVhCZlpHbHpkR0Z1WTJWYk9GMDdDZ3AxYm1sbWIzSnRJRzFoZERRZ2NISnZhbVZqZEdsdmJqc0tkVzVwWm05eWJTQnRZWFEwSUhacFpYYzdDblZ1YVdadmNtMGdkbVZqTXlCbGVXVndiM05wZEdsdmJqc0tkVzVwWm05eWJTQnBiblFnZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTTdDblZ1YVdadmNtMGdkbVZqTkNCMWJtbG1iM0p0WDJOc2FYQmZjR3hoYm1Weld6aGRPd29LZG1Wak15QjBiM1psWXpNb2RtVmpNaUIyS1h0eVpYUjFjbTRnZG1Wak15aDJMQ0F3TGpBcE8zMEtkbVZqTXlCMGIzWmxZek1vZG1Wak15QjJLWHR5WlhSMWNtNGdkanQ5Q25abFl6UWdkRzkyWldNMEtHWnNiMkYwSUhZcGUzSmxkSFZ5YmlCMlpXTTBLSFlzSURBdU1Dd2dNQzR3TENBd0xqQXBPMzBLZG1Wak5DQjBiM1psWXpRb2RtVmpNeUIyS1h0eVpYUjFjbTRnZG1Wak5DaDJMQ0F4TGpBcE8zMEtkbVZqTkNCMGIzWmxZelFvZG1Wak5DQjJLWHR5WlhSMWNtNGdkanQ5Q2dwMlpXTTBJR2RsZEY5amIyeHZjbDltY205dFgyTnRZWEFvWm14dllYUWdkbUZzZFdVc0lITmhiWEJzWlhJeVJDQmpiMnh2Y2w5dFlYQXNJSFpsWXpJZ1kyOXNiM0p5WVc1blpTa2dld29nSUNBZ1pteHZZWFFnWTIxcGJpQTlJR052Ykc5eWNtRnVaMlV1ZURzS0lDQWdJR1pzYjJGMElHTnRZWGdnUFNCamIyeHZjbkpoYm1kbExuazdDaUFnSUNCcFppQW9kbUZzZFdVZ1BEMGdZMjFoZUNBbUppQjJZV3gxWlNBK1BTQmpiV2x1S1NCN0NpQWdJQ0FnSUNBZ0x5OGdhVzRnZG1Gc2RXVWdjbUZ1WjJVc0lHTnZiblJwYm5WbElRb2dJQ0FnZlNCbGJITmxJR2xtSUNoMllXeDFaU0E4SUdOdGFXNHBJSHNLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdaMlYwWDJ4dmQyTnNhWEJmWTI5c2IzSW9LVHNLSUNBZ0lIMGdaV3h6WlNCcFppQW9kbUZzZFdVZ1BpQmpiV0Y0S1NCN0NpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdkbGRGOW9hV2RvWTJ4cGNGOWpiMnh2Y2lncE93b2dJQ0FnZlNCbGJITmxJSHNLSUNBZ0lDQWdJQ0F2THlCcGMyNWhiaUJwY3lCaWNtOXJaVzRnS0c5bUlHTnZkWEp6WlNrZ0xTNHRDaUFnSUNBZ0lDQWdMeThnYzI4Z2FXWWdiM1YwYzJsa1pTQjJZV3gxWlNCeVlXNW5aU0JoYm1RZ2JtOTBJSE50WVd4c1pYSXZZbWxuWjJWeUlHMXBiaTl0WVhnZ2QyVWdZWE56ZFcxbElFNWhUZ29nSUNBZ0lDQWdJSEpsZEhWeWJpQm5aWFJmYm1GdVgyTnZiRzl5S0NrN0NpQWdJQ0I5Q2lBZ0lDQm1iRzloZENCcE1ERWdQU0JqYkdGdGNDZ29kbUZzZFdVZ0xTQmpiV2x1S1NBdklDaGpiV0Y0SUMwZ1kyMXBiaWtzSURBdU1Dd2dNUzR3S1RzS0lDQWdJQzh2SURFdk1DQmpiM0p5WlhOd2IyNWtjeUIwYnlCMGFHVWdZMjl5Ym1WeUlHOW1JSFJvWlNCamIyeHZjbTFoY0N3Z2MyOGdkRzhnY0hKdmNHVnliSGtnYVc1MFpYSndiMnhoZEdVS0lDQWdJQzh2SUdKbGRIZGxaVzRnZEdobElHTnZiRzl5Y3l3Z2QyVWdibVZsWkNCMGJ5QnpZMkZzWlNCcGRDd2djMjhnZEdoaGRDQjBhR1VnWlc1a2N5QmhjbVVnWVhRZ01TQXRJQ2h6ZEdWd2MybDZaUzh5S1NCaGJtUWdNQ3NvYzNSbGNITnBlbVV2TWlrdUNpQWdJQ0JtYkc5aGRDQnpkR1Z3YzJsNlpTQTlJREV1TUNBdklHWnNiMkYwS0hSbGVIUjFjbVZUYVhwbEtHTnZiRzl5WDIxaGNDd2dNQ2twT3dvZ0lDQWdhVEF4SUQwZ0tERXVNQ0F0SUhOMFpYQnphWHBsS1NBcUlHa3dNU0FySURBdU5TQXFJSE4wWlhCemFYcGxPd29nSUNBZ2NtVjBkWEp1SUhSbGVIUjFjbVVvWTI5c2IzSmZiV0Z3TENCMlpXTXlLR2t3TVN3Z01DNHdLU2s3Q24wS0NuWmxZelFnWjJWMFgyTnZiRzl5S0habFl6TWdZMjlzYjNJc0lHSnZiMndnWTI5c2IzSnlZVzVuWlN3Z1ltOXZiQ0JqYjJ4dmNtMWhjQ2w3Q2lBZ0lDQnlaWFIxY200Z2RtVmpOQ2hqYjJ4dmNpd2dNUzR3S1RzS2ZRcDJaV00wSUdkbGRGOWpiMnh2Y2loMlpXTTBJR052Ykc5eUxDQmliMjlzSUdOdmJHOXljbUZ1WjJVc0lHSnZiMndnWTI5c2IzSnRZWEFwZXdvZ0lDQWdjbVYwZFhKdUlHTnZiRzl5T3dwOUNuWmxZelFnWjJWMFgyTnZiRzl5S0dKdmIyd2dZMjlzYjNJc0lHSnZiMndnWTI5c2IzSnlZVzVuWlN3Z1ltOXZiQ0JqYjJ4dmNtMWhjQ2w3Q2lBZ0lDQXZMeUJqYjJ4dmNpQnpZVzF3YkdsdVp5Qm9ZWEJ3Wlc1eklHbHVJR1p5WVdkdFpXNTBJSE5vWVdSbGNnb2dJQ0FnY21WMGRYSnVJSFpsWXpRb01DNHdMQ0F3TGpBc0lEQXVNQ3dnTUM0d0tUc0tmUXAyWldNMElHZGxkRjlqYjJ4dmNpaGliMjlzSUhaaGJIVmxMQ0IyWldNeUlHTnZiRzl5Y21GdVoyVXNJSE5oYlhCc1pYSXlSQ0JqYjJ4dmNtMWhjQ2w3Q2lBZ0lDQXZMeUJqYjJ4dmNpQnpZVzF3YkdsdVp5Qm9ZWEJ3Wlc1eklHbHVJR1p5WVdkdFpXNTBJSE5vWVdSbGNnb2dJQ0FnY21WMGRYSnVJSFpsWXpRb01DNHdMQ0F3TGpBc0lEQXVNQ3dnTUM0d0tUc0tmUXAyWldNMElHZGxkRjlqYjJ4dmNpaG1iRzloZENCMllXeDFaU3dnZG1Wak1pQmpiMnh2Y25KaGJtZGxMQ0J6WVcxd2JHVnlNa1FnWTI5c2IzSnRZWEFwZXdvZ0lDQWdhV1lnS0dkbGRGOXBiblJsY25CdmJHRjBaVjlwYmw5bWNtRm5iV1Z1ZEY5emFHRmtaWElvS1NrZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMlpXTTBLSFpoYkhWbExDQXdMakFzSURBdU1Dd2dNQzR3S1RzS0lDQWdJSDBnWld4elpTQjdDaUFnSUNBZ0lDQWdjbVYwZFhKdUlHZGxkRjlqYjJ4dmNsOW1jbTl0WDJOdFlYQW9kbUZzZFdVc0lHTnZiRzl5YldGd0xDQmpiMnh2Y25KaGJtZGxLVHNLSUNBZ0lIMEtmUW9LZG05cFpDQndjbTlqWlhOelgyTnNhWEJmY0d4aGJtVnpLSFpsWXpNZ2QyOXliR1JmY0c5ektTQjdDaUFnSUNCbWIzSWdLR2x1ZENCcElEMGdNRHNnYVNBOElIVnVhV1p2Y20xZmJuVnRYMk5zYVhCZmNHeGhibVZ6T3lCcEt5c3BDaUFnSUNBZ0lDQWdiMTlqYkdsd1gyUnBjM1JoYm1ObFcybGRJRDBnWkc5MEtIZHZjbXhrWDNCdmN5d2dkVzVwWm05eWJWOWpiR2x3WDNCc1lXNWxjMXRwWFM1NGVYb3BJQzBnZFc1cFptOXliVjlqYkdsd1gzQnNZVzVsYzF0cFhTNTNPd3A5Q2dvdkx5QlVUMFJQT2lCbGJtRmliR1VLTHk4Z2RtVmpNaUJoY0hCc2VWOTFkbDkwY21GdWMyWnZjbTBvVG05MGFHbHVaeUIwTVN3Z2RtVmpNaUIxZGlsN0lISmxkSFZ5YmlCMWRqc2dmUXAyWldNeUlHRndjR3g1WDNWMlgzUnlZVzV6Wm05eWJTaHRZWFF6SUhSeVlXNXpabTl5YlN3Z2RtVmpNaUIxZGlsN0lISmxkSFZ5YmlBb2RISmhibk5tYjNKdElDb2dkbVZqTXloMWRpd2dNU2twTG5oNU95QjlDZ3AyYjJsa0lISmxibVJsY2loMlpXTTBJSEJ2YzJsMGFXOXVYM2R2Y214a0xDQjJaV016SUc1dmNtMWhiQ3dnYldGME5DQjJhV1YzTENCdFlYUTBJSEJ5YjJwbFkzUnBiMjRwQ25zS0lDQWdJQzh2SUc1dmNtMWhiQ0JwYmlCM2IzSnNaQ0J6Y0dGalpRb2dJQ0FnYjE5dWIzSnRZV3dnUFNCblpYUmZkMjl5YkdSZmJtOXliV0ZzYldGMGNtbDRLQ2tnS2lCdWIzSnRZV3c3Q2lBZ0lDQXZMeUJ3YjNOcGRHbHZiaUJwYmlCamJHbHdJSE53WVdObElDaDNMeUJrWlhCMGFDa0tJQ0FnSUhCeWIyTmxjM05mWTJ4cGNGOXdiR0Z1WlhNb2NHOXphWFJwYjI1ZmQyOXliR1F1ZUhsNktUc0tJQ0FnSUdkc1gxQnZjMmwwYVc5dUlEMGdjSEp2YW1WamRHbHZiaUFxSUhacFpYY2dLaUJ3YjNOcGRHbHZibDkzYjNKc1pEc2dMeThnVkU5RVR5QmpiMjV6YVdSbGNpQjFjMmx1WnlCd2NtOXFaV04wYVc5dWRtbGxkeUJrYVhKbFkzUnNlUW9nSUNBZ1oyeGZVRzl6YVhScGIyNHVlaUFyUFNCbmJGOVFiM05wZEdsdmJpNTNJQ29nWjJWMFgyUmxjSFJvWDNOb2FXWjBLQ2s3Q2lBZ0lDQXZMeUJrYVhKbFkzUnBiMjRnZEc4Z1kyRnRaWEpoQ2lBZ0lDQnZYMk5oYldScGNpQTlJSEJ2YzJsMGFXOXVYM2R2Y214a0xuaDVlaUF2SUhCdmMybDBhVzl1WDNkdmNteGtMbmNnTFNCbGVXVndiM05wZEdsdmJqc0tmUW9LWm14aGRDQnZkWFFnZFdsdWRDQm1jbUZuWDJsdWMzUmhibU5sWDJsa093b0tkbTlwWkNCdFlXbHVLQ2w3Q2lBZ0lDQXZMeUJuWlhSZktpQm5aWFJ6SUhSb1pTQm5iRzlpWVd3Z2FXNXdkWFJ6SUNoMWJtbG1iM0p0TENCellXMXdiR1Z5TENCd2IzTnBkR2x2YmlCaGNuSmhlU2tLSUNBZ0lDOHZJSFJvYjNObElHWjFibU4wYVc5dWN5QjNhV3hzSUdkbGRDQnBibk5sY25SbFpDQmllU0IwYUdVZ2MyaGhaR1Z5SUdOeVpXRjBhVzl1SUhCcGNHVnNhVzVsQ2lBZ0lDQjJaV016SUhabGNuUmxlRjl3YjNOcGRHbHZiaUE5SUhSdmRtVmpNeWhuWlhSZmNHOXphWFJwYjI1elgzUnlZVzV6Wm05eWJXVmtYMll6TW1Nb0tTazdDaUFnSUNCcFppQW9hWE51WVc0b2RtVnlkR1Y0WDNCdmMybDBhVzl1TG5vcEtTQjdDaUFnSUNBZ0lDQWdkbVZ5ZEdWNFgzQnZjMmwwYVc5dUxub2dQU0F3TGpBN0NpQWdJQ0I5Q2lBZ0lDQjJaV00wSUhCdmMybDBhVzl1WDNkdmNteGtJRDBnYlc5a1pXeGZaak15WXlBcUlIWmxZelFvZG1WeWRHVjRYM0J2YzJsMGFXOXVMQ0F4S1RzS0NpQWdJQ0J5Wlc1a1pYSW9jRzl6YVhScGIyNWZkMjl5YkdRc0lHZGxkRjl1YjNKdFlXeHpLQ2tzSUhacFpYY3NJSEJ5YjJwbFkzUnBiMjRwT3dvZ0lDQWdabkpoWjE5MWRpQTlJR0Z3Y0d4NVgzVjJYM1J5WVc1elptOXliU2huWlhSZmQyZHNYM1YyWDNSeVlXNXpabTl5YlNncExDQm5aWFJmZEdWNGRIVnlaV052YjNKa2FXNWhkR1Z6S0NrcE93b2dJQ0FnWm5KaFoxOWpiMnh2Y2lBOUlHZGxkRjlqYjJ4dmNpaG5aWFJmZG1WeWRHVjRYMk52Ykc5eUtDa3NJR2RsZEY5MWJtbG1iM0p0WDJOdmJHOXljbUZ1WjJVb0tTd2dkVzVwWm05eWJWOWpiMnh2Y20xaGNDazdDZ29nSUNBZ1puSmhaMTlwYm5OMFlXNWpaVjlwWkNBOUlIVnBiblFvWjJ4ZlZtVnlkR1Y0U1VRcE93cDlDZ3F2Wm5KaFoyMWxiblJmYzI5MWNtTmwyaDdXQ25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYm5RN0NuQnlaV05wYzJsdmJpQm9hV2RvY0NCbWJHOWhkRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSE5oYlhCc1pYSXlSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJSE5oYlhCc1pYSXpSRHNLY0hKbFkybHphVzl1SUdocFoyaHdJR2x6WVcxd2JHVnlNa1E3Q25CeVpXTnBjMmx2YmlCb2FXZG9jQ0JwYzJGdGNHeGxjak5FT3dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnZFhOaGJYQnNaWEl5UkRzS2NISmxZMmx6YVc5dUlHaHBaMmh3SUhWellXMXdiR1Z5TTBRN0NncHZkWFFnZG1Wak5DQm1jbUZuYldWdWRGOWpiMnh2Y2pzS0NpOHZJRlZ1YVdadmNtMXpPaUFLZFc1cFptOXliU0JpYjI5c0lIVnVhV1p2Y20xZlkyOXNiM0p0WVhBN0NtSnZiMndnWjJWMFgzVnVhV1p2Y20xZlkyOXNiM0p0WVhBb0tYdHlaWFIxY200Z2RXNXBabTl5YlY5amIyeHZjbTFoY0R0OUNuVnVhV1p2Y20wZ2RXbHVkQ0J2WW1wbFkzUmZhV1E3Q25WcGJuUWdaMlYwWDI5aWFtVmpkRjlwWkNncGUzSmxkSFZ5YmlCdlltcGxZM1JmYVdRN2ZRcDFibWxtYjNKdElHMWhkRFFnYlc5a1pXeGZaak15WXpzS2JXRjBOQ0JuWlhSZmJXOWtaV3hmWmpNeVl5Z3BlM0psZEhWeWJpQnRiMlJsYkY5bU16SmpPMzBLZFc1cFptOXliU0IyWldNeklITndaV04xYkdGeU93cDJaV016SUdkbGRGOXpjR1ZqZFd4aGNpZ3BlM0psZEhWeWJpQnpjR1ZqZFd4aGNqdDlDblZ1YVdadmNtMGdZbTl2YkNCd2FXTnJhVzVuT3dwaWIyOXNJR2RsZEY5d2FXTnJhVzVuS0NsN2NtVjBkWEp1SUhCcFkydHBibWM3ZlFwMWJtbG1iM0p0SUdKdmIyd2djR0YwZEdWeWJqc0tZbTl2YkNCblpYUmZjR0YwZEdWeWJpZ3BlM0psZEhWeWJpQndZWFIwWlhKdU8zMEtkVzVwWm05eWJTQmliMjlzSUdsdWRHVnljRzlzWVhSbFgybHVYMlp5WVdkdFpXNTBYM05vWVdSbGNqc0tZbTl2YkNCblpYUmZhVzUwWlhKd2IyeGhkR1ZmYVc1ZlpuSmhaMjFsYm5SZmMyaGhaR1Z5S0NsN2NtVjBkWEp1SUdsdWRHVnljRzlzWVhSbFgybHVYMlp5WVdkdFpXNTBYM05vWVdSbGNqdDlDblZ1YVdadmNtMGdZbTl2YkNCMlpYSjBaWGhmWTI5c2IzSTdDbUp2YjJ3Z1oyVjBYM1psY25SbGVGOWpiMnh2Y2lncGUzSmxkSFZ5YmlCMlpYSjBaWGhmWTI5c2IzSTdmUXAxYm1sbWIzSnRJR1pzYjJGMElHSmhZMnRzYVdkb2REc0tabXh2WVhRZ1oyVjBYMkpoWTJ0c2FXZG9kQ2dwZTNKbGRIVnliaUJpWVdOcmJHbG5hSFE3ZlFwMWJtbG1iM0p0SUdKdmIyd2dkVzVwWm05eWJWOWpiMnh2Y25KaGJtZGxPd3BpYjI5c0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eWNtRnVaMlVvS1h0eVpYUjFjbTRnZFc1cFptOXliVjlqYjJ4dmNuSmhibWRsTzMwS2RXNXBabTl5YlNCaWIyOXNJRkJKUTB0SlRrZGZTVTVFUlZoZlJsSlBUVjlWVmpzS1ltOXZiQ0JuWlhSZlVFbERTMGxPUjE5SlRrUkZXRjlHVWs5TlgxVldLQ2w3Y21WMGRYSnVJRkJKUTB0SlRrZGZTVTVFUlZoZlJsSlBUVjlWVmp0OUNuVnVhV1p2Y20wZ2RtVmpOQ0J1WVc1ZlkyOXNiM0k3Q25abFl6UWdaMlYwWDI1aGJsOWpiMnh2Y2lncGUzSmxkSFZ5YmlCdVlXNWZZMjlzYjNJN2ZRcDFibWxtYjNKdElHWnNiMkYwSUhOb2FXNXBibVZ6Y3pzS1pteHZZWFFnWjJWMFgzTm9hVzVwYm1WemN5Z3BlM0psZEhWeWJpQnphR2x1YVc1bGMzTTdmUXAxYm1sbWIzSnRJSFpsWXpJZ2RHVjRkSFZ5WldOdmIzSmthVzVoZEdWek93cDJaV015SUdkbGRGOTBaWGgwZFhKbFkyOXZjbVJwYm1GMFpYTW9LWHR5WlhSMWNtNGdkR1Y0ZEhWeVpXTnZiM0prYVc1aGRHVnpPMzBLZFc1cFptOXliU0JtYkc5aGRDQmtaWEIwYUY5emFHbG1kRHNLWm14dllYUWdaMlYwWDJSbGNIUm9YM05vYVdaMEtDbDdjbVYwZFhKdUlHUmxjSFJvWDNOb2FXWjBPMzBLZFc1cFptOXliU0IyWldNMElHeHZkMk5zYVhCZlkyOXNiM0k3Q25abFl6UWdaMlYwWDJ4dmQyTnNhWEJmWTI5c2IzSW9LWHR5WlhSMWNtNGdiRzkzWTJ4cGNGOWpiMnh2Y2p0OUNuVnVhV1p2Y20wZ2JXRjBNeUIzYjNKc1pGOXViM0p0WVd4dFlYUnlhWGc3Q20xaGRETWdaMlYwWDNkdmNteGtYMjV2Y20xaGJHMWhkSEpwZUNncGUzSmxkSFZ5YmlCM2IzSnNaRjl1YjNKdFlXeHRZWFJ5YVhnN2ZRcDFibWxtYjNKdElIWmxZelFnZFc1cFptOXliVjlqYjJ4dmNqc0tkbVZqTkNCblpYUmZkVzVwWm05eWJWOWpiMnh2Y2lncGUzSmxkSFZ5YmlCMWJtbG1iM0p0WDJOdmJHOXlPMzBLZFc1cFptOXliU0IyWldNMElHaHBaMmhqYkdsd1gyTnZiRzl5T3dwMlpXTTBJR2RsZEY5b2FXZG9ZMnhwY0Y5amIyeHZjaWdwZTNKbGRIVnliaUJvYVdkb1kyeHBjRjlqYjJ4dmNqdDlDblZ1YVdadmNtMGdZbTl2YkNCemFHRmthVzVuT3dwaWIyOXNJR2RsZEY5emFHRmthVzVuS0NsN2NtVjBkWEp1SUhOb1lXUnBibWM3ZlFwMWJtbG1iM0p0SUhabFl6TWdaR2xtWm5WelpUc0tkbVZqTXlCblpYUmZaR2xtWm5WelpTZ3BlM0psZEhWeWJpQmthV1ptZFhObE8zMEtkVzVwWm05eWJTQnRZWFF6SUhkbmJGOTFkbDkwY21GdWMyWnZjbTA3Q20xaGRETWdaMlYwWDNkbmJGOTFkbDkwY21GdWMyWnZjbTBvS1h0eVpYUjFjbTRnZDJkc1gzVjJYM1J5WVc1elptOXliVHQ5Q2dwd2NtVmphWE5wYjI0Z2FHbG5hSEFnWm14dllYUTdDbkJ5WldOcGMybHZiaUJvYVdkb2NDQnBiblE3Q2dwcGJpQjJaV015SUdaeVlXZGZkWFk3Q21sdUlIWmxZelFnWm5KaFoxOWpiMnh2Y2pzS0NtbHVJSFpsWXpNZ2IxOXViM0p0WVd3N0NtbHVJSFpsWXpNZ2IxOWpZVzFrYVhJN0NtbHVJR1pzYjJGMElHOWZZMnhwY0Y5a2FYTjBZVzVqWlZzNFhUc0tabXhoZENCcGJpQjFhVzUwSUdaeVlXZGZhVzV6ZEdGdVkyVmZhV1E3Q2dwMWJtbG1iM0p0SUdsdWRDQjFibWxtYjNKdFgyNTFiVjlqYkdsd1gzQnNZVzVsY3pzS2RXNXBabTl5YlNCMlpXTXpJR3hwWjJoMFgyTnZiRzl5T3dwMWJtbG1iM0p0SUhabFl6TWdZVzFpYVdWdWREc0tkVzVwWm05eWJTQjJaV016SUd4cFoyaDBYMlJwY21WamRHbHZianNLQ2k4dklGTnRiMjkwYUdWeklHOTFkQ0JsWkdkbElHRnliM1Z1WkNBd0lHeHBaMmgwSUdsdWRHVnVjMmwwZVN3Z2MyVmxJRWRNVFdGcmFXVUtabXh2WVhRZ2MyMXZiM1JvWDNwbGNtOWZiV0Y0S0dac2IyRjBJSGdwSUhzS0lDQWdJR052Ym5OMElHWnNiMkYwSUdNZ1BTQXdMakF3TXprd05qSTFMQ0I0YzNkaGNDQTlJREF1TmpRd05qY3dOekV5TURFMU1qYzFPU3dnZVhOM1lYQWdQU0F3TGpJd05UQTRNemd6T1RBd01Ua3dPVFUxT3dvZ0lDQWdZMjl1YzNRZ1pteHZZWFFnYzJocFpuUWdQU0F4TGpBZ0t5QjRjM2RoY0NBdElIbHpkMkZ3T3dvZ0lDQWdabXh2WVhRZ2NHOTNPQ0E5SUhnZ0t5QnphR2xtZERzS0lDQWdJSEJ2ZHpnZ1BTQndiM2M0SUNvZ2NHOTNPRHNnY0c5M09DQTlJSEJ2ZHpnZ0tpQndiM2M0T3lCd2IzYzRJRDBnY0c5M09DQXFJSEJ2ZHpnN0NpQWdJQ0J5WlhSMWNtNGdlQ0E4SUhsemQyRndJRDhnWXlBcUlIQnZkemdnT2lCNE93cDlDZ3AyWldNeklHSnNhVzV1Y0dodmJtY29kbVZqTXlCT0xDQjJaV016SUZZc0lIWmxZek1nVEN3Z2RtVmpNeUJqYjJ4dmNpbDdDaUFnSUNCbWJHOWhkQ0JpWVdOcmJHbG5hSFFnUFNCblpYUmZZbUZqYTJ4cFoyaDBLQ2s3Q2lBZ0lDQm1iRzloZENCa2FXWm1YMk52WldabUlEMGdjMjF2YjNSb1gzcGxjbTlmYldGNEtHUnZkQ2hNTENBdFRpa3BJQ3NLSUNBZ0lDQWdJQ0JpWVdOcmJHbG5hSFFnS2lCemJXOXZkR2hmZW1WeWIxOXRZWGdvWkc5MEtFd3NJRTRwS1RzS0NpQWdJQ0F2THlCemNHVmpkV3hoY2lCamIyVm1abWxqYVdWdWRBb2dJQ0FnZG1Wak15QklJRDBnYm05eWJXRnNhWHBsS0V3Z0t5QldLVHNLQ2lBZ0lDQm1iRzloZENCemNHVmpYMk52WldabUlEMGdjRzkzS0cxaGVDaGtiM1FvU0N3Z0xVNHBMQ0F3TGpBcExDQm5aWFJmYzJocGJtbHVaWE56S0NrcElDc0tJQ0FnSUNBZ0lDQmlZV05yYkdsbmFIUWdLaUJ3YjNjb2JXRjRLR1J2ZENoSUxDQk9LU3dnTUM0d0tTd2daMlYwWDNOb2FXNXBibVZ6Y3lncEtUc0tJQ0FnSUdsbUlDaGthV1ptWDJOdlpXWm1JRHc5SURBdU1Da0tJQ0FnSUNBZ0lDQnpjR1ZqWDJOdlpXWm1JRDBnTUM0d093b0tJQ0FnSUM4dklHWnBibUZzSUd4cFoyaDBhVzVuSUcxdlpHVnNDaUFnSUNCeVpYUjFjbTRnYkdsbmFIUmZZMjlzYjNJZ0tpQjJaV016S0FvZ0lDQWdJQ0FnSUdkbGRGOWthV1ptZFhObEtDa2dLaUJrYVdabVgyTnZaV1ptSUNvZ1kyOXNiM0lnS3dvZ0lDQWdJQ0FnSUdkbGRGOXpjR1ZqZFd4aGNpZ3BJQ29nYzNCbFkxOWpiMlZtWmdvZ0lDQWdLVHNLZlFvS2RtVmpOQ0JuWlhSZlkyOXNiM0lvZG1Wak15QmpiMnh2Y2l3Z2RtVmpNaUIxZGl3Z1ltOXZiQ0JqYjJ4dmNuSmhibWRsTENCaWIyOXNJR052Ykc5eWJXRndLWHNLSUNBZ0lISmxkSFZ5YmlCMlpXTTBLR052Ykc5eUxDQXhMakFwT3dwOUNncDJaV00wSUdkbGRGOWpiMnh2Y2loMlpXTTBJR052Ykc5eUxDQjJaV015SUhWMkxDQmliMjlzSUdOdmJHOXljbUZ1WjJVc0lHSnZiMndnWTI5c2IzSnRZWEFwZXdvZ0lDQWdjbVYwZFhKdUlHTnZiRzl5T3dwOUNncDJaV00wSUdkbGRGOWpiMnh2Y2loaWIyOXNJR052Ykc5eUxDQjJaV015SUhWMkxDQmliMjlzSUdOdmJHOXljbUZ1WjJVc0lHSnZiMndnWTI5c2IzSnRZWEFwZXdvZ0lDQWdjbVYwZFhKdUlHWnlZV2RmWTI5c2IzSTdJQ0F2THlCamIyeHZjaUJ1YjNRZ2FXNGdkVzVwWm05eWJRcDlDZ3AyWldNeUlHRndjR3g1WDNWMlgzUnlZVzV6Wm05eWJTaHRZWFF6SUhSeVlXNXpabTl5YlN3Z2RtVmpNaUIxZGlsN0lISmxkSFZ5YmlBb2RISmhibk5tYjNKdElDb2dkbVZqTXloMWRpd2dNU2twTG5oNU95QjlDblpsWXpJZ1lYQndiSGxmZFhaZmRISmhibk5tYjNKdEtITmhiWEJzWlhJeVJDQjBjbUZ1YzJadmNtMXpMQ0IyWldNeUlIVjJLWHNLSUNBZ0lDOHZJR05oYmlkMElHaGhkbVVnYldGMGNtbGpaWE1nYVc0Z1lTQjBaWGgwZFhKbElITnZJSGRsSUdoaGRtVWdNM2dnZG1Wak1pQnBibk4wWldGa0NpQWdJQ0J0WVhReklIUnlZVzV6Wm05eWJUc0tJQ0FnSUhSeVlXNXpabTl5YlZzd1hTQTlJSFpsWXpNb2RHVjRaV3hHWlhSamFDaDBjbUZ1YzJadmNtMXpMQ0JwZG1Wak1pZ3pJQ29nYVc1MEtHWnlZV2RmYVc1emRHRnVZMlZmYVdRcElDc2dNQ3dnTUNrc0lEQXBMbmg1TENBd0tUc0tJQ0FnSUhSeVlXNXpabTl5YlZzeFhTQTlJSFpsWXpNb2RHVjRaV3hHWlhSamFDaDBjbUZ1YzJadmNtMXpMQ0JwZG1Wak1pZ3pJQ29nYVc1MEtHWnlZV2RmYVc1emRHRnVZMlZmYVdRcElDc2dNU3dnTUNrc0lEQXBMbmg1TENBd0tUc0tJQ0FnSUhSeVlXNXpabTl5YlZzeVhTQTlJSFpsWXpNb2RHVjRaV3hHWlhSamFDaDBjbUZ1YzJadmNtMXpMQ0JwZG1Wak1pZ3pJQ29nYVc1MEtHWnlZV2RmYVc1emRHRnVZMlZmYVdRcElDc2dNaXdnTUNrc0lEQXBMbmg1TENBd0tUc0tJQ0FnSUhKbGRIVnliaUFvZEhKaGJuTm1iM0p0SUNvZ2RtVmpNeWgxZGl3Z01Ta3BMbmg1T3dwOUNncDJaV00wSUdkbGRGOWpiMnh2Y2loellXMXdiR1Z5TWtRZ1kyOXNiM0lzSUhabFl6SWdkWFlzSUdKdmIyd2dZMjlzYjNKeVlXNW5aU3dnWW05dmJDQmpiMnh2Y20xaGNDbDdDaUFnSUNCcFppQW9aMlYwWDNCaGRIUmxjbTRvS1NrZ2V3b2dJQ0FnSUNBZ0lIWmxZeklnY0c5eklEMGdZWEJ3YkhsZmRYWmZkSEpoYm5ObWIzSnRLSGRuYkY5MWRsOTBjbUZ1YzJadmNtMHNJR2RzWDBaeVlXZERiMjl5WkM1NGVTazdDaUFnSUNBZ0lDQWdMeThnZG1Wak1pQndiM01nUFNCMlpXTXlLR2RzWDBaeVlXZERiMjl5WkM1NGVTa2dMeUIyWldNeUtIUmxlSFIxY21WVGFYcGxLR052Ykc5eUxDQXdLU2s3Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJSFJsZUhSMWNtVW9ZMjlzYjNJc0lIQnZjeWs3Q2lBZ0lDQjlJR1ZzYzJVZ2V3b2dJQ0FnSUNBZ0lISmxkSFZ5YmlCMFpYaDBkWEpsS0dOdmJHOXlMQ0IxZGlrN0NpQWdJQ0I5Q24wS0NuWmxZelFnWjJWMFgyTnZiRzl5WDJaeWIyMWZZMjFoY0NobWJHOWhkQ0IyWVd4MVpTd2djMkZ0Y0d4bGNqSkVJR052Ykc5eVgyMWhjQ3dnZG1Wak1pQmpiMnh2Y25KaGJtZGxLU0I3Q2lBZ0lDQm1iRzloZENCamJXbHVJRDBnWTI5c2IzSnlZVzVuWlM1NE93b2dJQ0FnWm14dllYUWdZMjFoZUNBOUlHTnZiRzl5Y21GdVoyVXVlVHNLSUNBZ0lHbG1JQ2gyWVd4MVpTQThQU0JqYldGNElDWW1JSFpoYkhWbElENDlJR050YVc0cElIc0tJQ0FnSUNBZ0lDQXZMeUJwYmlCMllXeDFaU0J5WVc1blpTd2dZMjl1ZEdsdWRXVWhDaUFnSUNCOUlHVnNjMlVnYVdZZ0tIWmhiSFZsSUR3Z1kyMXBiaWtnZXdvZ0lDQWdJQ0FnSUhKbGRIVnliaUJuWlhSZmJHOTNZMnhwY0Y5amIyeHZjaWdwT3dvZ0lDQWdmU0JsYkhObElHbG1JQ2gyWVd4MVpTQStJR050WVhncElIc0tJQ0FnSUNBZ0lDQnlaWFIxY200Z1oyVjBYMmhwWjJoamJHbHdYMk52Ykc5eUtDazdDaUFnSUNCOUlHVnNjMlVnZXdvZ0lDQWdJQ0FnSUM4dklHbHpibUZ1SUdseklHSnliMnRsYmlBb2IyWWdZMjkxY25ObEtTQXRMaTBLSUNBZ0lDQWdJQ0F2THlCemJ5QnBaaUJ2ZFhSemFXUmxJSFpoYkhWbElISmhibWRsSUdGdVpDQnViM1FnYzIxaGJHeGxjaTlpYVdkblpYSWdiV2x1TDIxaGVDQjNaU0JoYzNOMWJXVWdUbUZPQ2lBZ0lDQWdJQ0FnY21WMGRYSnVJR2RsZEY5dVlXNWZZMjlzYjNJb0tUc0tJQ0FnSUgwS0lDQWdJR1pzYjJGMElHa3dNU0E5SUdOc1lXMXdLQ2gyWVd4MVpTQXRJR050YVc0cElDOGdLR050WVhnZ0xTQmpiV2x1S1N3Z01DNHdMQ0F4TGpBcE93b2dJQ0FnTHk4Z01TOHdJR052Y25KbGMzQnZibVJ6SUhSdklIUm9aU0JqYjNKdVpYSWdiMllnZEdobElHTnZiRzl5YldGd0xDQnpieUIwYnlCd2NtOXdaWEpzZVNCcGJuUmxjbkJ2YkdGMFpRb2dJQ0FnTHk4Z1ltVjBkMlZsYmlCMGFHVWdZMjlzYjNKekxDQjNaU0J1WldWa0lIUnZJSE5qWVd4bElHbDBMQ0J6YnlCMGFHRjBJSFJvWlNCbGJtUnpJR0Z5WlNCaGRDQXhJQzBnS0hOMFpYQnphWHBsTHpJcElHRnVaQ0F3S3loemRHVndjMmw2WlM4eUtTNEtJQ0FnSUdac2IyRjBJSE4wWlhCemFYcGxJRDBnTVM0d0lDOGdabXh2WVhRb2RHVjRkSFZ5WlZOcGVtVW9ZMjlzYjNKZmJXRndMQ0F3S1NrN0NpQWdJQ0JwTURFZ1BTQW9NUzR3SUMwZ2MzUmxjSE5wZW1VcElDb2dhVEF4SUNzZ01DNDFJQ29nYzNSbGNITnBlbVU3Q2lBZ0lDQnlaWFIxY200Z2RHVjRkSFZ5WlNoamIyeHZjbDl0WVhBc0lIWmxZeklvYVRBeExDQXdMakFwS1RzS2ZRb0tkbVZqTkNCblpYUmZZMjlzYjNJb1ltOXZiQ0JqYjJ4dmNpd2dkbVZqTWlCMWRpd2dkbVZqTWlCamIyeHZjbkpoYm1kbExDQnpZVzF3YkdWeU1rUWdZMjlzYjNKdFlYQXBld29nSUNBZ2FXWWdLR2RsZEY5cGJuUmxjbkJ2YkdGMFpWOXBibDltY21GbmJXVnVkRjl6YUdGa1pYSW9LU2tnZXdvZ0lDQWdJQ0FnSUhKbGRIVnliaUJuWlhSZlkyOXNiM0pmWm5KdmJWOWpiV0Z3S0daeVlXZGZZMjlzYjNJdWVDd2dZMjlzYjNKdFlYQXNJR052Ykc5eWNtRnVaMlVwT3dvZ0lDQWdmU0JsYkhObElIc0tJQ0FnSUNBZ0lDQnlaWFIxY200Z1puSmhaMTlqYjJ4dmNqc0tJQ0FnSUgwS2ZRcDJaV00wSUdkbGRGOWpiMnh2Y2lobWJHOWhkQ0IyWVd4MVpTd2dkbVZqTWlCMWRpd2dkbVZqTWlCamIyeHZjbkpoYm1kbExDQnpZVzF3YkdWeU1rUWdZMjlzYjNKdFlYQXBJSHNLSUNBZ0lISmxkSFZ5YmlCblpYUmZZMjlzYjNKZlpuSnZiVjlqYldGd0tIWmhiSFZsTENCamIyeHZjbTFoY0N3Z1kyOXNiM0p5WVc1blpTazdDbjBLZG1Wak5DQm5aWFJmWTI5c2IzSW9jMkZ0Y0d4bGNqSkVJSFpoYkhWbGN5d2dkbVZqTWlCMWRpd2dkbVZqTWlCamIyeHZjbkpoYm1kbExDQnpZVzF3YkdWeU1rUWdZMjlzYjNKdFlYQXBld29nSUNBZ1pteHZZWFFnZG1Gc2RXVWdQU0IwWlhoMGRYSmxLSFpoYkhWbGN5d2dkWFlwTG5nN0NpQWdJQ0J5WlhSMWNtNGdaMlYwWDJOdmJHOXlYMlp5YjIxZlkyMWhjQ2gyWVd4MVpTd2dZMjlzYjNKdFlYQXNJR052Ykc5eWNtRnVaMlVwT3dwOUNncDJaV00wSUdkbGRGOWpiMnh2Y2loellXMXdiR1Z5TWtRZ1kyOXNiM0lzSUhabFl6SWdkWFlzSUdKdmIyd2dZMjlzYjNKeVlXNW5aU3dnYzJGdGNHeGxjakpFSUdOdmJHOXliV0Z3S1hzS0lDQWdJSEpsZEhWeWJpQjBaWGgwZFhKbEtHTnZiRzl5TENCMWRpazdDbjBLQ25abFl6SWdaVzVqYjJSbFgzVnBiblJmZEc5ZlpteHZZWFFvZFdsdWRDQjJZV3gxWlNrZ2V3b2dJQ0FnWm14dllYUWdiRzkzWlhJZ1BTQm1iRzloZENoMllXeDFaU0FtSURCNFJrWkdSblVwSUM4Z05qVTFNelV1TURzS0lDQWdJR1pzYjJGMElIVndjR1Z5SUQwZ1pteHZZWFFvZG1Gc2RXVWdQajRnTVRaMUtTQXZJRFkxTlRNMUxqQTdDaUFnSUNCeVpYUjFjbTRnZG1Wak1paHNiM2RsY2l3Z2RYQndaWElwT3dwOUNncDJaV00wSUhCaFkydGZhVzUwS0hWcGJuUWdhV1FzSUhWcGJuUWdhVzVrWlhncElIc0tJQ0FnSUhabFl6UWdkVzV3WVdOck93b2dJQ0FnZFc1d1lXTnJMbkpuSUQwZ1pXNWpiMlJsWDNWcGJuUmZkRzlmWm14dllYUW9hV1FwT3dvZ0lDQWdkVzV3WVdOckxtSmhJRDBnWlc1amIyUmxYM1ZwYm5SZmRHOWZabXh2WVhRb2FXNWtaWGdwT3dvZ0lDQWdjbVYwZFhKdUlIVnVjR0ZqYXpzS2ZRb0tMeThnWm05eUlIQnBZMnRwYm1jZ2FXNWthV05sY3lCcGJpQnBiV0ZuWlN3Z2FHVmhkRzFoY0N3Z2MzVnlabUZqWlFwMWFXNTBJSEJwWTJ0cGJtZGZhVzVrWlhoZlpuSnZiVjkxZGloellXMXdiR1Z5TWtRZ2FXMW5MQ0IyWldNeUlIVjJLU0I3Q2lBZ0lDQnBkbVZqTWlCemFYcGxJRDBnZEdWNGRIVnlaVk5wZW1Vb2FXMW5MQ0F3S1RzS0lDQWdJR2wyWldNeUlHcHNYMmxrZUNBOUlHTnNZVzF3S0dsMlpXTXlLSFYySUNvZ2RtVmpNaWh6YVhwbEtTa3NJR2wyWldNeUtEQXBMQ0J6YVhwbExURXBPd29nSUNBZ2RXbHVkQ0JwWkhnZ1BTQjFhVzUwS0dwc1gybGtlQzU0SUNzZ2FteGZhV1I0TG5rZ0tpQnphWHBsTG5ncE93b2dJQ0FnY21WMGRYSnVJR2xrZURzS2ZRb0tMeThnVkdobGMyVWdjMmh2ZFd4a0lHNXZkQ0JuWlhRZ2FHbDBDblZwYm5RZ2NHbGphMmx1WjE5cGJtUmxlRjltY205dFgzVjJLR1pzYjJGMElHbHRaeXdnZG1Wak1pQjFkaWtnZXlCeVpYUjFjbTRnWm5KaFoxOXBibk4wWVc1alpWOXBaRHNnZlFwMWFXNTBJSEJwWTJ0cGJtZGZhVzVrWlhoZlpuSnZiVjkxZGloaWIyOXNJR2x0Wnl3Z2RtVmpNaUIxZGlrZ2V3b2dJQ0FnY21WMGRYSnVJR1p5WVdkZmFXNXpkR0Z1WTJWZmFXUTdDbjBLZFdsdWRDQndhV05yYVc1blgybHVaR1Y0WDJaeWIyMWZkWFlvZG1Wak15QnBiV2NzSUhabFl6SWdkWFlwSUhzZ2NtVjBkWEp1SUdaeVlXZGZhVzV6ZEdGdVkyVmZhV1E3SUgwS2RXbHVkQ0J3YVdOcmFXNW5YMmx1WkdWNFgyWnliMjFmZFhZb2RtVmpOQ0JwYldjc0lIWmxZeklnZFhZcElIc2djbVYwZFhKdUlHWnlZV2RmYVc1emRHRnVZMlZmYVdRN0lIMEtDblp2YVdRZ2JXRnBiaWdwQ25zS0lDQWdJR1p2Y2lBb2FXNTBJR2tnUFNBd095QnBJRHdnZFc1cFptOXliVjl1ZFcxZlkyeHBjRjl3YkdGdVpYTTdJR2tyS3lrZ2V3b2dJQ0FnSUNBZ0lHbG1JQ2h2WDJOc2FYQmZaR2x6ZEdGdVkyVmJhVjBnUENBd0xqQXBJSHNLSUNBZ0lDQWdJQ0FnSUNBZ1pHbHpZMkZ5WkRzS0lDQWdJQ0FnSUNCOUNpQWdJQ0I5Q2dvZ0lDQWdkbVZqTkNCeVpXRnNYMk52Ykc5eUlEMGdaMlYwWDJOdmJHOXlLSFZ1YVdadmNtMWZZMjlzYjNJc0lHWnlZV2RmZFhZc0lHZGxkRjkxYm1sbWIzSnRYMk52Ykc5eWNtRnVaMlVvS1N3Z2RXNXBabTl5YlY5amIyeHZjbTFoY0NrN0NpQWdJQ0IyWldNeklITm9ZV1JsWkY5amIyeHZjaUE5SUhKbFlXeGZZMjlzYjNJdWNtZGlPd29LSUNBZ0lHbG1LR2RsZEY5emFHRmthVzVuS0NrcGV3b2dJQ0FnSUNBZ0lIWmxZek1nVENBOUlHeHBaMmgwWDJScGNtVmpkR2x2YmpzS0lDQWdJQ0FnSUNCMlpXTXpJRTRnUFNCdWIzSnRZV3hwZW1Vb2IxOXViM0p0WVd3cE93b2dJQ0FnSUNBZ0lIWmxZek1nYkdsbmFIUWdQU0JpYkdsdWJuQm9iMjVuS0U0c0lHNXZjbTFoYkdsNlpTaHZYMk5oYldScGNpa3NJRXdzSUhKbFlXeGZZMjlzYjNJdWNtZGlLVHNLSUNBZ0lDQWdJQ0J6YUdGa1pXUmZZMjlzYjNJZ1BTQmhiV0pwWlc1MElDb2djbVZoYkY5amIyeHZjaTV5WjJJZ0t5QnNhV2RvZERzS0lDQWdJSDBLQ2lBZ0lDQnBaaUFvY0dsamEybHVaeUFtSmlBb2NtVmhiRjlqYjJ4dmNpNWhJRDRnTUM0eEtTa2dld29nSUNBZ0lDQWdJR2xtSUNoUVNVTkxTVTVIWDBsT1JFVllYMFpTVDAxZlZWWXBJSHNLSUNBZ0lDQWdJQ0FnSUNBZ1puSmhaMjFsYm5SZlkyOXNiM0lnUFNCd1lXTnJYMmx1ZENodlltcGxZM1JmYVdRc0lIQnBZMnRwYm1kZmFXNWtaWGhmWm5KdmJWOTFkaWgxYm1sbWIzSnRYMk52Ykc5eUxDQm1jbUZuWDNWMktTazdDaUFnSUNBZ0lDQWdmU0JsYkhObElIc0tJQ0FnSUNBZ0lDQWdJQ0FnWm5KaFoyMWxiblJmWTI5c2IzSWdQU0J3WVdOclgybHVkQ2h2WW1wbFkzUmZhV1FzSUdaeVlXZGZhVzV6ZEdGdVkyVmZhV1FwT3dvZ0lDQWdJQ0FnSUgwS0lDQWdJQ0FnSUNCeVpYUjFjbTQ3Q2lBZ0lDQjlDZ29nSUNBZ2FXWWdLSEpsWVd4ZlkyOXNiM0l1WVNBOFBTQXdMakFwZXdvZ0lDQWdJQ0FnSUdScGMyTmhjbVE3Q2lBZ0lDQjlDaUFnSUNCbWNtRm5iV1Z1ZEY5amIyeHZjaUE5SUhabFl6UW9jMmhoWkdWa1gyTnZiRzl5TENCeVpXRnNYMk52Ykc5eUxtRXBPd3A5Q3Fsd2JHOTBYM1I1Y0dXa1RXVnphS2QxY0dSaGRHVnl4d1ZvcERFMU16U3ZZbUZqYTJkeWIzVnVaR052Ykc5eXh3Vm9wREUxTXpHMVkyRnRaWEpoWDNKbGJHRjBhWFpsWDJ4cFoyaDB4d1ZvcERFMU1qaW9ZMmhwYkdSeVpXNlFwM1pwYzJsaWJHWEhCV2lrTVRRd09iVmlZV05yWjNKdmRXNWtZMjlzYjNKZllXeHdhR0hIQldpa01UVXpNcVpqWVcxbGNtSEhCV2lrTVRVek02OXNhV2RvZEY5a2FYSmxZM1JwYjI3SEJXaWtNVFV5TjZwamJHVmhjbk5qWlc1bHh3Vm9wREUwTVRDcmJHbG5hSFJmWTI5c2IzTEhCV2lrTVRVek1LUjFkV2xrc3pJNE5qY3lPRE01TlRrME5UVXhOakV3T0RDb2RtbGxkM0J2Y25USEJXaWtNVFV5TnF0allXMHpaRjl6ZEdGMFpjQ25kbWx6YVdKc1pkWm9velEzT0xWaVlXTnJaM0p2ZFc1a1kyOXNiM0pmWVd4d2FHSEhCV2lrTVRVME1LWmpZVzFsY21ISEJXaWtNVFUwTWE5c2FXZG9kRjlrYVhKbFkzUnBiMjdIQldpa01UVXpOYXBqYkdWaGNuTmpaVzVsMW1pak5EYzVxMnhwWjJoMFgyTnZiRzl5eHdWb3BERTFNemlrZFhWcFpMTXlNek0wTVRJMk16STVNakF5TURnNE5qazFxSFpwWlhkd2IzSjB4d1ZvcERFMU1qV3JZMkZ0TTJSZmMzUmhkR1hBcDNacGMybGliR1hXYUtNeU5qbTFZbUZqYTJkeWIzVnVaR052Ykc5eVgyRnNjR2hoeHdWb3BERTFORGltWTJGdFpYSmh4d1ZvcERFMU5EbXZiR2xuYUhSZlpHbHlaV04wYVc5dXh3Vm9wREUxTkRPcVkyeGxZWEp6WTJWdVpkWm9vekkzTUt0c2FXZG9kRjlqYjJ4dmNzY0ZhS1F4TlRRMnBIVjFhV1MwTVRReU5EVXdNVFl3TVRRMU9EYzJNREV5TURtb2RtbGxkM0J2Y25USEJXaWtNVFV5Tkt0allXMHpaRjl6ZEdGMFpjQ25kbWx6YVdKc1pjY0RhS0kyT0xWaVlXTnJaM0p2ZFc1a1kyOXNiM0pmWVd4d2FHSEhCV2lrTVRVNE5hWmpZVzFsY21ISEJXaWtNVFU0TnE5c2FXZG9kRjlrYVhKbFkzUnBiMjdIQldpa01UVTRNS3BqYkdWaGNuTmpaVzVsMW1pak1UYzBxMnhwWjJoMFgyTnZiRzl5eHdWb3BERTFPRE9rZFhWcFpMTTFNekkxTVRVNE16STBOemswTkRBNE9ESTRxSFpwWlhkd2IzSjB4d1ZvcERFMU1qT3JZMkZ0TTJSZmMzUmhkR1hBeHdkbGtxUXhOVGczZ01jSFpaS2tNVFV5TXNESEIyV1NwREUxTWpEQXh3MWxrcVF4TlRFNWtzMEN2TTBCWHNnRUpoS0NwM0JoZVd4dllXVElCQTVtazRhek5qa3dPREExTURNek1EVTNOemM1TkRnd05zY0ZhS1F4TlRJeHN6VTJOVFl5T0RVM05EZ3pNalF3T1RJeU9EUEhCV2lrTVRVeE9iTTRPRFEyTmprM09EWTFNRFkwTnpZek56VTV4d1ZvcERFMU1qS3pOekl4TkRVM056RTRORGt5TnpBNE56TXhNc0N6TmpFd05qa3pORE01T1RNNU1UYzVNekkzT01jRmFLUXhOVGczdERFME1EQTNOREF5TWpnMU9UWXhNamswTkRZd3h3Vm9wREUxTWpEYUF5WkNUMDVKVkU5ZlNVMVFUMUpVVTFzbk16WXpZVEV6TTJVMU9UZzBZamhtTXpVeU5XUmhOamsyT0dKbE1URm1PRFZqTkRVME4yRXdNQzFYUjB4TllXdHBaUzVxY3lkZExuUm9aVzRvVjBkTUlEMCtJSHNLSUNBZ0lGZEhUQzVsZUdWamRYUmxYMmx1WDI5eVpHVnlLREVzSUNncFBUNGdld29nSUNBZ0lDQWdJRmRIVEM1elpYUjFjRjl6WTJWdVpWOXBibWwwS0FvZ0lDQWdJQ0FnSUNBZ0lDQmtiMk4xYldWdWRDNXhkV1Z5ZVZObGJHVmpkRzl5S0NkYlpHRjBZUzFxYzJOaGJHd3RhV1E5SWpFaVhTY3BMQW9nSUNBZ0lDQWdJQ0FnSUNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlLQ2RiWkdGMFlTMXFjMk5oYkd3dGFXUTlJaklpWFNjcExBb2dJQ0FnSUNBZ0lDQWdJQ0EzTURBc0NpQWdJQ0FnSUNBZ0lDQWdJRE0xTUN3S0lDQWdJQ0FnSUNBZ0lDQWdYMTlzYjI5cmRYQmZhVzUwWlhKd2IyeGhkR1ZrS0NjM01qRTBOVGMzTVRnME9USTNNRGczTXpFeUp5a3NDaUFnSUNBZ0lDQWdJQ0FnSUY5ZmJHOXZhM1Z3WDJsdWRHVnljRzlzWVhSbFpDZ25Oekl4TkRVM056RTRORGt5TnpBNE56TXhNaWNwTEFvZ0lDQWdJQ0FnSUNBZ0lDQmZYMnh2YjJ0MWNGOXBiblJsY25CdmJHRjBaV1FvSnpjeU1UUTFOemN4T0RRNU1qY3dPRGN6TVRJbktTd0tJQ0FnSUNBZ0lDQWdJQ0FnWDE5c2IyOXJkWEJmYVc1MFpYSndiMnhoZEdWa0tDY3hOREF3TnpRd01qSTROVGsyTVRJNU5EUTJNQ2NwTEFvZ0lDQWdJQ0FnSUNBZ0lDQmZYMnh2YjJ0MWNGOXBiblJsY25CdmJHRjBaV1FvSnpVMk5UWXlPRFUzTkRnek1qUXdPVEl5T0RNbktTd0tJQ0FnSUNBZ0lDQWdJQ0FnWDE5c2IyOXJkWEJmYVc1MFpYSndiMnhoZEdWa0tDYzJPVEE0TURVd016TXdOVGMzTnprME9EQTJKeWtzQ2lBZ0lDQWdJQ0FnSUNBZ0lGOWZiRzl2YTNWd1gybHVkR1Z5Y0c5c1lYUmxaQ2duTmpFd05qa3pORE01T1RNNU1UYzVNekkzT0NjcExBb2dJQ0FnSUNBZ0lDQWdJQ0F6TUM0d0xBb2dJQ0FnSUNBZ0lDQWdJQ0JmWDJ4dmIydDFjRjlwYm5SbGNuQnZiR0YwWldRb0p6ZzRORFkyT1RjNE5qVXdOalEzTmpNM05Ua25LUW9nSUNBZ0lDQWdJQ2tLSUNBZ0lIMHBDbjBwQ3RrL0wyaHZiV1V2WkdGdVppOHVhblZzYVdFdmNHRmphMkZuWlhNdlYwZE1UV0ZyYVdVdlQwVkZVM0l2YzNKakwzUm9jbVZsWDNCc2IzUXVhbXc2TVRJNHFHMXpaMTkwZVhCbG9UST0nKSwgInN1YiIsIGZhbHNlKTsK" type="module"></script><div style="width: 100%; height: 100%; position: relative;" data-jscall-id="1"><canvas height="350px" data-jp-suppress-context-menu="" style="display: block" data-jscall-id="2" data-lm-suppress-shortcuts="true" width="700px" tabindex="0"></canvas><div class="wglmakie-spinner" data-jscall-id="3"></div></div></div></div></div>
<p>A sine wave, rendered with WGLMakie.</p>
</div>
</div>
</section>
<section id="and-python" class="level2">
<h2 class="anchored" data-anchor-id="and-python">And Python</h2>
<p>The Julia engine routes <code>{python}</code> cells through PythonCall.jl, which provisions its own Python via CondaPkg.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> sys</span>
<span id="cb2-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(sys.version)</span>
<span id="cb2-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> i <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span></code></pre></div></div>
<div id="6" class="cell" data-execution_count="1">
<div class="cell-output cell-output-stdout">
<pre><code>3.14.6 | packaged by conda-forge | (main, Jun 12 2026, 09:02:39) [GCC 14.3.0]</code></pre>
</div>
<div class="cell-output cell-output-display" data-execution_count="1">
<pre><code>Python: 285</code></pre>
</div>
</div>


</section>

 ]]></description>
  <category>meta</category>
  <guid>https://danfarmer.dev/posts/2026-06-14-hello-world/</guid>
  <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
