123

Pen Settings

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URL's added here will be added as <link>s in order, and before the CSS in the editor. If you link to another Pen, it will include the CSS from that Pen. If the preprocessor matches, it will attempt to combine them before processing.

+ add another resource

You're using npm packages, so we've auto-selected Babel for you here, which we require to process imports and make it all work. If you need to use a different JavaScript preprocessor, remove the packages in the npm tab.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Use npm Packages

We can make npm packages available for you to use in your JavaScript. We use webpack to prepare them and make them available to import. We'll also process your JavaScript with Babel.

⚠️ This feature can only be used by logged in users.

Code Indentation

     

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

HTML Settings

Here you can Sed posuere consectetur est at lobortis. Donec ullamcorper nulla non metus auctor fringilla. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

            
              <script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuNS4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbih0LG4peyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bihleHBvcnRzKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxuKTpuKHQuZDM9dC5kM3x8e30pfSkodGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gTnModChuKSxlKX19ZnVuY3Rpb24gZSh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49WXM/aSo9MTA6bz49QnM/aSo9NTpvPj1qcyYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHQubGVuZ3RofWZ1bmN0aW9uIGkodCxuLGUpe3ZhciByPXQoZSk7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShyKT9yOm4oZSkpKyIsMCkifWZ1bmN0aW9uIG8odCxuLGUpe3ZhciByPXQoZSk7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6bihlKSkrIikifWZ1bmN0aW9uIHUodCl7dmFyIG49dC5iYW5kd2lkdGgoKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpK259fWZ1bmN0aW9uIGEoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gYyh0LG4pe2Z1bmN0aW9uIGUoZSl7dmFyIHAsZD1udWxsPT1jP24udGlja3M/bi50aWNrcy5hcHBseShuLHIpOm4uZG9tYWluKCk6Yyx2PW51bGw9PXM/bi50aWNrRm9ybWF0P24udGlja0Zvcm1hdC5hcHBseShuLHIpOmZmOnMsXz1NYXRoLm1heChmLDApK2gseT10PT09bGZ8fHQ9PT1wZj9pOm8sZz1uLnJhbmdlKCksbT1nWzBdKy41LHg9Z1tnLmxlbmd0aC0xXSsuNSxiPShuLmJhbmR3aWR0aD91OmZmKShuLmNvcHkoKSksdz1lLnNlbGVjdGlvbj9lLnNlbGVjdGlvbigpOmUsTT13LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSxUPXcuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxuKS5vcmRlcigpLE49VC5leGl0KCksaz1ULmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksUz1ULnNlbGVjdCgibGluZSIpLEU9VC5zZWxlY3QoInRleHQiKSxBPXQ9PT1sZnx8dD09PWRmPy0xOjEsQz10PT09ZGZ8fHQ9PT1oZj8ocD0ieCIsInkiKToocD0ieSIsIngiKTtNPU0ubWVyZ2UoTS5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLFQ9VC5tZXJnZShrKSxTPVMubWVyZ2Uoay5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihwKyIyIixBKmYpLmF0dHIoQysiMSIsLjUpLmF0dHIoQysiMiIsLjUpKSxFPUUubWVyZ2Uoay5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIocCxBKl8pLmF0dHIoQywuNSkuYXR0cigiZHkiLHQ9PT1sZj8iMGVtIjp0PT09cGY/IjAuNzFlbSI6IjAuMzJlbSIpKSxlIT09dyYmKE09TS50cmFuc2l0aW9uKGUpLFQ9VC50cmFuc2l0aW9uKGUpLFM9Uy50cmFuc2l0aW9uKGUpLEU9RS50cmFuc2l0aW9uKGUpLE49Ti50cmFuc2l0aW9uKGUpLmF0dHIoIm9wYWNpdHkiLHZmKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiB5KGIsdGhpcy5wYXJlbnROb2RlLl9fYXhpc3x8Yix0KX0pLGsuYXR0cigib3BhY2l0eSIsdmYpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIHkodGhpcy5wYXJlbnROb2RlLl9fYXhpc3x8YixiLHQpfSkpLE4ucmVtb3ZlKCksTS5hdHRyKCJkIix0PT09ZGZ8fHQ9PWhmPyJNIitBKmwrIiwiK20rIkgwLjVWIit4KyJIIitBKmw6Ik0iK20rIiwiK0EqbCsiVjAuNUgiK3grIlYiK0EqbCksVC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiB5KGIsYix0KX0pLFMuYXR0cihwKyIyIixBKmYpLEUuYXR0cihwLEEqXykudGV4dCh2KSx3LmZpbHRlcihhKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09aGY/InN0YXJ0Ijp0PT09ZGY/ImVuZCI6Im1pZGRsZSIpLHcuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPWJ9KX12YXIgcj1bXSxjPW51bGwscz1udWxsLGY9NixsPTYsaD0zO3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiByPXNmLmNhbGwoYXJndW1lbnRzKSxlfSxlLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9bXTpzZi5jYWxsKHQpLGUpOnIuc2xpY2UoKX0sZS50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PXQ/bnVsbDpzZi5jYWxsKHQpLGUpOmMmJmMuc2xpY2UoKX0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsZSk6c30sZS50aWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1sPSt0LGUpOmZ9LGUudGlja1NpemVJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdCxlKTpmfSxlLnRpY2tTaXplT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsZSk6bH0sZS50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxlKTpofSxlfWZ1bmN0aW9uIHModCl7cmV0dXJuIGMobGYsdCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gYyhoZix0KX1mdW5jdGlvbiBsKHQpe3JldHVybiBjKHBmLHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIGMoZGYsdCl9ZnVuY3Rpb24gcCgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcil0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtyW3RdPVtdfXJldHVybiBuZXcgZChyKX1mdW5jdGlvbiBkKHQpe3RoaXMuXz10fWZ1bmN0aW9uIHYodCxuKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLHI9dC5pbmRleE9mKCIuIik7aWYocj49MCYmKGU9dC5zbGljZShyKzEpLHQ9dC5zbGljZSgwLHIpKSx0JiYhbi5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6ZX19KX1mdW5jdGlvbiBfKHQsbil7Zm9yKHZhciBlLHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYoKGU9dFtyXSkubmFtZT09PW4pcmV0dXJuIGUudmFsdWV9ZnVuY3Rpb24geSh0LG4sZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKHRbcl0ubmFtZT09PW4pe3Rbcl09X2YsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fWZ1bmN0aW9uIGcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5vd25lckRvY3VtZW50LGU9dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIGU9PT15ZiYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09eWY/bi5jcmVhdGVFbGVtZW50KHQpOm4uY3JlYXRlRWxlbWVudE5TKGUsdCl9fWZ1bmN0aW9uIG0odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24geCgpe3JldHVybiBuZXcgYn1mdW5jdGlvbiBiKCl7dGhpcy5fPSJAIisoKytiZikudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHcodCxuLGUpe3JldHVybiB0PU0odCxuLGUpLGZ1bmN0aW9uKG4pe3ZhciBlPW4ucmVsYXRlZFRhcmdldDtlJiYoZT09PXRoaXN8fDgmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLG4pfX1mdW5jdGlvbiBNKG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIFQodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgbj0iIixlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHt0eXBlOnQsbmFtZTpufX0pfWZ1bmN0aW9uIE4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5fX29uO2lmKG4pe2Zvcih2YXIgZSxyPTAsaT0tMSxvPW4ubGVuZ3RoO3I8bzsrK3IpZT1uW3JdLHQudHlwZSYmZS50eXBlIT09dC50eXBlfHxlLm5hbWUhPT10Lm5hbWU/blsrK2ldPWU6dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGUudHlwZSxlLmxpc3RlbmVyLGUuY2FwdHVyZSk7KytpP24ubGVuZ3RoPWk6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIGsodCxuLGUpe3ZhciByPWtmLmhhc093blByb3BlcnR5KHQudHlwZSk/dzpNO3JldHVybiBmdW5jdGlvbihpLG8sdSl7dmFyIGEsYz10aGlzLl9fb24scz1yKG4sbyx1KTtpZihjKWZvcih2YXIgZj0wLGw9Yy5sZW5ndGg7ZjxsOysrZilpZigoYT1jW2ZdKS50eXBlPT09dC50eXBlJiZhLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLnR5cGUsYS5saXN0ZW5lcixhLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihhLnR5cGUsYS5saXN0ZW5lcj1zLGEuY2FwdHVyZT1lKSx2b2lkKGEudmFsdWU9bik7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxzLGUpLGE9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOm4sbGlzdGVuZXI6cyxjYXB0dXJlOmV9LGM/Yy5wdXNoKGEpOnRoaXMuX19vbj1bYV19fWZ1bmN0aW9uIFMobixlLHIsaSl7dmFyIG89dC5ldmVudDtuLnNvdXJjZUV2ZW50PXQuZXZlbnQsdC5ldmVudD1uO3RyeXtyZXR1cm4gZS5hcHBseShyLGkpfWZpbmFsbHl7dC5ldmVudD1vfX1mdW5jdGlvbiBFKCl7fWZ1bmN0aW9uIEEoKXtyZXR1cm5bXX1mdW5jdGlvbiBDKHQsbil7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1ufWZ1bmN0aW9uIHoodCxuLGUscixpLG8pe2Zvcih2YXIgdSxhPTAsYz1uLmxlbmd0aCxzPW8ubGVuZ3RoO2E8czsrK2EpKHU9blthXSk/KHUuX19kYXRhX189b1thXSxyW2FdPXUpOmVbYV09bmV3IEModCxvW2FdKTtmb3IoO2E8YzsrK2EpKHU9blthXSkmJihpW2FdPXUpfWZ1bmN0aW9uIFAodCxuLGUscixpLG8sdSl7dmFyIGEsYyxzLGY9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGwpO2ZvcihhPTA7YTxsOysrYSkoYz1uW2FdKSYmKHBbYV09cz1JZit1LmNhbGwoYyxjLl9fZGF0YV9fLGEsbikscyBpbiBmP2lbYV09YzpmW3NdPWMpO2ZvcihhPTA7YTxoOysrYSlzPUlmK3UuY2FsbCh0LG9bYV0sYSxvKSwoYz1mW3NdKT8oclthXT1jLGMuX19kYXRhX189b1thXSxmW3NdPW51bGwpOmVbYV09bmV3IEModCxvW2FdKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJmZbcFthXV09PT1jJiYoaVthXT1jKX1mdW5jdGlvbiBSKHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIEwodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBVKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gRCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiBGKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIEkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gWSh0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4sZSl9fWZ1bmN0aW9uIEIodCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19ZnVuY3Rpb24gaih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gSCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19ZnVuY3Rpb24gWCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1lfX1mdW5jdGlvbiBWKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBXKHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3ICQodCl9ZnVuY3Rpb24gJCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9Vih0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIFoodCxuKXtmb3IodmFyIGU9Vyh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIEcodCxuKXtmb3IodmFyIGU9Vyh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUucmVtb3ZlKG5bcl0pfWZ1bmN0aW9uIEoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Wih0aGlzLHQpfX1mdW5jdGlvbiBRKHQpe3JldHVybiBmdW5jdGlvbigpe0codGhpcyx0KX19ZnVuY3Rpb24gSyh0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9aOkcpKHRoaXMsdCl9fWZ1bmN0aW9uIHR0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBudCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIGV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBydCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIG90KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gdXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gYXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBjdCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHN0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gZnQodCxuLGUpe3ZhciByPUtmKHQpLGk9ci5DdXN0b21FdmVudDtpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcyx0LG4pfX1mdW5jdGlvbiBodCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBwdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiBkdCgpe3JldHVybiBuZXcgcHQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxobCl9ZnVuY3Rpb24gdnQoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIF90KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1wbCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIix5bCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiB5dCh0LG4sZSxyLGksbyx1LGEsYyxzKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PXUsdGhpcy5keD1hLHRoaXMuZHk9Yyx0aGlzLl89c31mdW5jdGlvbiBndCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBtdCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24geHQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIGJ0KHQsbil7dmFyIGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfWZ1bmN0aW9uIHd0KCl7fWZ1bmN0aW9uIE10KHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1TbC5leGVjKHQpKT8obj1wYXJzZUludChuWzFdLDE2KSxuZXcgRXQobj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpKToobj1FbC5leGVjKHQpKT9UdChwYXJzZUludChuWzFdLDE2KSk6KG49QWwuZXhlYyh0KSk/bmV3IEV0KG5bMV0sblsyXSxuWzNdLDEpOihuPUNsLmV4ZWModCkpP25ldyBFdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCwxKToobj16bC5leGVjKHQpKT9OdChuWzFdLG5bMl0sblszXSxuWzRdKToobj1QbC5leGVjKHQpKT9OdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCxuWzRdKToobj1SbC5leGVjKHQpKT9BdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLDEpOihuPXFsLmV4ZWModCkpP0F0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsbls0XSk6TGwuaGFzT3duUHJvcGVydHkodCk/VHQoTGxbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBFdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFR0KHQpe3JldHVybiBuZXcgRXQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIE50KHQsbixlLHIpe3JldHVybiByPD0wJiYodD1uPWU9TmFOKSxuZXcgRXQodCxuLGUscil9ZnVuY3Rpb24ga3QodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB3dHx8KHQ9TXQodCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgRXQodC5yLHQuZyx0LmIsdC5vcGFjaXR5KSk6bmV3IEV0fWZ1bmN0aW9uIFN0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9rdCh0KTpuZXcgRXQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEV0KHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBBdCh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IFB0KHQsbixlLHIpfWZ1bmN0aW9uIEN0KHQpe2lmKHQgaW5zdGFuY2VvZiBQdClyZXR1cm4gbmV3IFB0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHd0fHwodD1NdCh0KSksIXQpcmV0dXJuIG5ldyBQdDtpZih0IGluc3RhbmNlb2YgUHQpcmV0dXJuIHQ7dD10LnJnYigpO3ZhciBuPXQuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSx1PU5hTixhPW8taSxjPShvK2kpLzI7cmV0dXJuIGE/KHU9bj09PW8/KGUtcikvYSs2KihlPHIpOmU9PT1vPyhyLW4pL2ErMjoobi1lKS9hKzQsYS89YzwuNT9vK2k6Mi1vLWksdSo9NjApOmE9Yz4wJiZjPDE/MDp1LG5ldyBQdCh1LGEsYyx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHp0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9DdCh0KTpuZXcgUHQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFB0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBSdCh0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9ZnVuY3Rpb24gcXQodCl7aWYodCBpbnN0YW5jZW9mIFV0KXJldHVybiBuZXcgVXQodC5sLHQuYSx0LmIsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YganQpe3ZhciBuPXQuaCpVbDtyZXR1cm4gbmV3IFV0KHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIEV0fHwodD1rdCh0KSk7dmFyIGU9SXQodC5yKSxyPUl0KHQuZyksaT1JdCh0LmIpLG89RHQoKC40MTI0NTY0KmUrLjM1NzU3NjEqcisuMTgwNDM3NSppKS9GbCksdT1EdCgoLjIxMjY3MjkqZSsuNzE1MTUyMipyKy4wNzIxNzUqaSkvSWwpLGE9RHQoKC4wMTkzMzM5KmUrLjExOTE5MipyKy45NTAzMDQxKmkpL1lsKTtyZXR1cm4gbmV3IFV0KDExNip1LTE2LDUwMCooby11KSwyMDAqKHUtYSksdC5vcGFjaXR5KX1mdW5jdGlvbiBMdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/cXQodCk6bmV3IFV0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBVdCh0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gRHQodCl7cmV0dXJuIHQ+WGw/TWF0aC5wb3codCwxLzMpOnQvSGwrQmx9ZnVuY3Rpb24gT3QodCl7cmV0dXJuIHQ+amw/dCp0KnQ6SGwqKHQtQmwpfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gSXQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gWXQodCl7aWYodCBpbnN0YW5jZW9mIGp0KXJldHVybiBuZXcganQodC5oLHQuYyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgVXR8fCh0PXF0KHQpKTt2YXIgbj1NYXRoLmF0YW4yKHQuYix0LmEpKkRsO3JldHVybiBuZXcganQobjwwP24rMzYwOm4sTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gQnQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1l0KHQpOm5ldyBqdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24ganQodCxuLGUscil7dGhpcy5oPSt0LHRoaXMuYz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIEh0KHQpe2lmKHQgaW5zdGFuY2VvZiBWdClyZXR1cm4gbmV3IFZ0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIEV0fHwodD1rdCh0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KEtsKnIrSmwqbi1RbCplKS8oS2wrSmwtUWwpLG89ci1pLHU9KEdsKihlLWkpLSRsKm8pL1psLGE9TWF0aC5zcXJ0KHUqdStvKm8pLyhHbCppKigxLWkpKSxjPWE/TWF0aC5hdGFuMih1LG8pKkRsLTEyMDpOYU47cmV0dXJuIG5ldyBWdChjPDA/YyszNjA6YyxhLGksdC5vcGFjaXR5KX1mdW5jdGlvbiBYdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SHQodCk6bmV3IFZ0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBWdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gV3QodCxuLGUscixpKXt2YXIgbz10KnQsdT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tdSkqbisoNC02Km8rMyp1KSplKygxKzMqdCszKm8tMyp1KSpyK3UqaSkvNn1mdW5jdGlvbiAkdCh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCtlKm59fWZ1bmN0aW9uIFp0KHQsbixlKXtyZXR1cm4gdD1NYXRoLnBvdyh0LGUpLG49TWF0aC5wb3cobixlKS10LGU9MS9lLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnBvdyh0K3IqbixlKX19ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/JHQodCxlPjE4MHx8ZTwtMTgwP2UtMzYwKk1hdGgucm91bmQoZS8zNjApOmUpOmNoKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gSnQodCl7cmV0dXJuIDE9PT0odD0rdCk/UXQ6ZnVuY3Rpb24obixlKXtyZXR1cm4gZS1uP1p0KG4sZSx0KTpjaChpc05hTihuKT9lOm4pfX1mdW5jdGlvbiBRdCh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT8kdCh0LGUpOmNoKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1TdChuW2VdKSxvW2VdPXIucnx8MCx1W2VdPXIuZ3x8MCxhW2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLHU9dCh1KSxhPXQoYSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz11KHQpLHIuYj1hKHQpLHIrIiJ9fX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbm4odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX1mdW5jdGlvbiBlbih0KXtyZXR1cm4ibm9uZSI9PT10P3doOih0aHx8KHRoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLG5oPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlaD1kb2N1bWVudC5kZWZhdWx0VmlldyksdGguc3R5bGUudHJhbnNmb3JtPXQsdD1laC5nZXRDb21wdXRlZFN0eWxlKG5oLmFwcGVuZENoaWxkKHRoKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxuaC5yZW1vdmVDaGlsZCh0aCksdD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIiksTWgoK3RbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX1mdW5jdGlvbiBybih0KXtyZXR1cm4gbnVsbD09dD93aDoocmh8fChyaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxyaC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9cmgudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/KHQ9dC5tYXRyaXgsTWgodC5hLHQuYix0LmMsdC5kLHQuZSx0LmYpKTp3aCl9ZnVuY3Rpb24gb24odCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9ZnVuY3Rpb24gbyh0LHIsaSxvLHUsYSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgYz11LnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO2EucHVzaCh7aTpjLTQseDpkaCh0LGkpfSx7aTpjLTIseDpkaChyLG8pfSl9ZWxzZShpfHxvKSYmdS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX1mdW5jdGlvbiB1KHQsbixlLG8pe3QhPT1uPyh0LW4+MTgwP24rPTM2MDpuLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6ZS5wdXNoKGkoZSkrInJvdGF0ZSgiLG51bGwsciktMix4OmRoKHQsbil9KSk6biYmZS5wdXNoKGkoZSkrInJvdGF0ZSgiK24rcil9ZnVuY3Rpb24gYSh0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6ZGgodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9ZnVuY3Rpb24gYyh0LG4sZSxyLG8sdSl7aWYodCE9PWV8fG4hPT1yKXt2YXIgYT1vLnB1c2goaShvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7dS5wdXNoKHtpOmEtNCx4OmRoKHQsZSl9LHtpOmEtMix4OmRoKG4scil9KX1lbHNlIDE9PT1lJiYxPT09cnx8by5wdXNoKGkobykrInNjYWxlKCIrZSsiLCIrcisiKSIpfXJldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPVtdLGk9W107cmV0dXJuIG49dChuKSxlPXQoZSksbyhuLnRyYW5zbGF0ZVgsbi50cmFuc2xhdGVZLGUudHJhbnNsYXRlWCxlLnRyYW5zbGF0ZVkscixpKSx1KG4ucm90YXRlLGUucm90YXRlLHIsaSksYShuLnNrZXdYLGUuc2tld1gscixpKSxjKG4uc2NhbGVYLG4uc2NhbGVZLGUuc2NhbGVYLGUuc2NhbGVZLHIsaSksbj1lPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEsbz1pLmxlbmd0aDsrK2U8bzspclsobj1pW2VdKS5pXT1uLngodCk7cmV0dXJuIHIuam9pbigiIil9fX1mdW5jdGlvbiB1bih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBhbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn1mdW5jdGlvbiBjbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9ZnVuY3Rpb24gc24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj16dChuKSkuaCwoZT16dChlKSkuaCksaT1RdChuLnMsZS5zKSxvPVF0KG4ubCxlLmwpLHU9UXQobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLnM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9dSh0KSxuKyIifX19ZnVuY3Rpb24gZm4odCxuKXt2YXIgZT1RdCgodD1MdCh0KSkubCwobj1MdChuKSkubCkscj1RdCh0LmEsbi5hKSxpPVF0KHQuYixuLmIpLG89UXQodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX1mdW5jdGlvbiBsbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUJ0KG4pKS5oLChlPUJ0KGUpKS5oKSxpPVF0KG4uYyxlLmMpLG89UXQobi5sLGUubCksdT1RdChuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiBobih0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1YdChuKSkuaCwocj1YdChyKSkuaCksbz1RdChuLnMsci5zKSx1PVF0KG4ubCxyLmwpLGE9UXQobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9dShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9YSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9ZnVuY3Rpb24gcG4oKXtyZXR1cm4gamh8fChWaChkbiksamg9WGgubm93KCkrSGgpfWZ1bmN0aW9uIGRuKCl7amg9MH1mdW5jdGlvbiB2bigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gX24odCxuLGUpe3ZhciByPW5ldyB2bjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIHluKCl7cG4oKSwrK09oO2Zvcih2YXIgdCxuPWloO247KSh0PWpoLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1PaH1mdW5jdGlvbiBnbigpe2poPShCaD1YaC5ub3coKSkrSGgsT2g9Rmg9MDt0cnl7eW4oKX1maW5hbGx5e09oPTAseG4oKSxqaD0wfX1mdW5jdGlvbiBtbigpe3ZhciB0PVhoLm5vdygpLG49dC1CaDtuPlloJiYoSGgtPW4sQmg9dCl9ZnVuY3Rpb24geG4oKXtmb3IodmFyIHQsbixlPWloLHI9MS8wO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjppaD1uKTtvaD10LGJuKHIpfWZ1bmN0aW9uIGJuKHQpe2lmKCFPaCl7RmgmJihGaD1jbGVhclRpbWVvdXQoRmgpKTt2YXIgbj10LWpoO24+MjQ/KHQ8MS8wJiYoRmg9c2V0VGltZW91dChnbixuKSksSWgmJihJaD1jbGVhckludGVydmFsKEloKSkpOihJaHx8KEJoPWpoLEloPXNldEludGVydmFsKG1uLFloKSksT2g9MSxWaChnbikpfX1mdW5jdGlvbiB3bih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSl8fGUuc3RhdGU+SmgpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIE1uKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKXx8ZS5zdGF0ZT5LaCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gVG4odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBObih0LG4sZSl7ZnVuY3Rpb24gcih0KXtlLnN0YXRlPVFoLGUudGltZXIucmVzdGFydChpLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZpKHQtZS5kZWxheSl9ZnVuY3Rpb24gaShyKXt2YXIgcyxmLGwsaDtpZihlLnN0YXRlIT09UWgpcmV0dXJuIHUoKTtmb3IocyBpbiBjKWlmKGg9Y1tzXSxoLm5hbWU9PT1lLm5hbWUpe2lmKGguc3RhdGU9PT10cClyZXR1cm4gV2goaSk7aC5zdGF0ZT09PW5wPyhoLnN0YXRlPXJwLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgY1tzXSk6K3M8biYmKGguc3RhdGU9cnAsaC50aW1lci5zdG9wKCksZGVsZXRlIGNbc10pfWlmKFdoKGZ1bmN0aW9uKCl7ZS5zdGF0ZT09PXRwJiYoZS5zdGF0ZT1ucCxlLnRpbWVyLnJlc3RhcnQobyxlLmRlbGF5LGUudGltZSksbyhyKSl9KSxlLnN0YXRlPUtoLGUub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGUuc3RhdGU9PT1LaCl7Zm9yKGUuc3RhdGU9dHAsYT1uZXcgQXJyYXkobD1lLnR3ZWVuLmxlbmd0aCkscz0wLGY9LTE7czxsOysrcykoaD1lLnR3ZWVuW3NdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCkpJiYoYVsrK2ZdPWgpO2EubGVuZ3RoPWYrMX19ZnVuY3Rpb24gbyhuKXtmb3IodmFyIHI9bjxlLmR1cmF0aW9uP2UuZWFzZS5jYWxsKG51bGwsbi9lLmR1cmF0aW9uKTooZS50aW1lci5yZXN0YXJ0KHUpLGUuc3RhdGU9ZXAsMSksaT0tMSxvPWEubGVuZ3RoOysraTxvOylhW2ldLmNhbGwobnVsbCxyKTtlLnN0YXRlPT09ZXAmJihlLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksdSgpKX1mdW5jdGlvbiB1KCl7ZS5zdGF0ZT1ycCxlLnRpbWVyLnN0b3AoKSxkZWxldGUgY1tuXTtmb3IodmFyIHIgaW4gYylyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufXZhciBhLGM9dC5fX3RyYW5zaXRpb247Y1tuXT1lLGUudGltZXI9X24ociwwLGUudGltZSl9ZnVuY3Rpb24ga24odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPU1uKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKXtyPWU9bztmb3IodmFyIHU9MCxhPXIubGVuZ3RoO3U8YTsrK3UpaWYoclt1XS5uYW1lPT09bil7cj1yLnNsaWNlKCksci5zcGxpY2UodSwxKTticmVha319aS50d2Vlbj1yfX1mdW5jdGlvbiBTbih0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89TW4odGhpcyx0KSx1PW8udHdlZW47aWYodSE9PXIpe2k9KHI9dSkuc2xpY2UoKTtmb3IodmFyIGE9e25hbWU6bix2YWx1ZTplfSxjPTAscz1pLmxlbmd0aDtjPHM7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109YTticmVha31jPT09cyYmaS5wdXNoKGEpfW8udHdlZW49aX19ZnVuY3Rpb24gRW4odCxuLGUpe3ZhciByPXQuX2lkO3JldHVybiB0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1Nbih0aGlzLHIpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW25dPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksZnVuY3Rpb24odCl7cmV0dXJuIFRuKHQscikudmFsdWVbbl19fWZ1bmN0aW9uIEFuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBDbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHpuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gUG4odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gUm4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7cmV0dXJuIG51bGw9PWE/dm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KToodT10aGlzLmdldEF0dHJpYnV0ZSh0KSx1PT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKSl9fWZ1bmN0aW9uIHFuKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHUsYT1lKHRoaXMpO3JldHVybiBudWxsPT1hP3ZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOih1PXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSx1PT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKSl9fWZ1bmN0aW9uIExuKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9ZnVuY3Rpb24gVW4odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZSh0LHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfWZ1bmN0aW9uIERuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7d24odGhpcyx0KS5kZWxheT0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIE9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXt3bih0aGlzLHQpLmRlbGF5PW59fWZ1bmN0aW9uIEZuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7TW4odGhpcyx0KS5kdXJhdGlvbj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEluKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtNbih0aGlzLHQpLmR1cmF0aW9uPW59fWZ1bmN0aW9uIFluKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe01uKHRoaXMsdCkuZWFzZT1ufX1mdW5jdGlvbiBCbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpe3ZhciBuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYodD10LnNsaWNlKDAsbikpLCF0fHwic3RhcnQiPT09dH0pfWZ1bmN0aW9uIGpuKHQsbixlKXt2YXIgcixpLG89Qm4obik/d246TW47cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHU9byh0aGlzLHQpLGE9dS5vbjthIT09ciYmKGk9KHI9YSkuY29weSgpKS5vbihuLGUpLHUub249aX19ZnVuY3Rpb24gSG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9fWZ1bmN0aW9uIFhuKHQsbil7dmFyIGUscixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUtmKHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKSx1PW8uZ2V0UHJvcGVydHlWYWx1ZSh0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLG8uZ2V0UHJvcGVydHlWYWx1ZSh0KSk7cmV0dXJuIHU9PT1hP251bGw6dT09PWUmJmE9PT1yP2k6aT1uKGU9dSxyPWEpfX1mdW5jdGlvbiBWbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBXbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1LZih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fWZ1bmN0aW9uICRuKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHU9S2YodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLGE9dS5nZXRQcm9wZXJ0eVZhbHVlKHQpLGM9ZSh0aGlzKTtyZXR1cm4gbnVsbD09YyYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksYz11LmdldFByb3BlcnR5VmFsdWUodCkpLGE9PT1jP251bGw6YT09PXImJmM9PT1pP286bz1uKHI9YSxpPWMpfX1mdW5jdGlvbiBabih0LG4sZSl7ZnVuY3Rpb24gcigpe3ZhciByPXRoaXMsaT1uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gaSYmZnVuY3Rpb24obil7ci5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkobiksZSl9fXJldHVybiByLl92YWx1ZT1uLHJ9ZnVuY3Rpb24gR24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBKbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBRbih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24gS24odCl7cmV0dXJuIGR0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiB0ZSgpe3JldHVybisra3B9ZnVuY3Rpb24gbmUodCl7cmV0dXJuK3R9ZnVuY3Rpb24gZWUodCl7cmV0dXJuIHQqdH1mdW5jdGlvbiByZSh0KXtyZXR1cm4gdCooMi10KX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBvZSh0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gdWUodCl7cmV0dXJuLS10KnQqdCsxfWZ1bmN0aW9uIGFlKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfWZ1bmN0aW9uIGNlKHQpe3JldHVybiAxLU1hdGguY29zKHQqUnApfWZ1bmN0aW9uIHNlKHQpe3JldHVybiBNYXRoLnNpbih0KlJwKX1mdW5jdGlvbiBmZSh0KXtyZXR1cm4oMS1NYXRoLmNvcyhQcCp0KSkvMn1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gTWF0aC5wb3coMiwxMCp0LTEwKX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIGRlKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9ZnVuY3Rpb24gX2UodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9ZnVuY3Rpb24geWUodCl7cmV0dXJuIDEtZ2UoMS10KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4odD0rdCk8cXA/anAqdCp0OnQ8VXA/anAqKHQtPUxwKSp0K0RwOnQ8RnA/anAqKHQtPU9wKSp0K0lwOmpwKih0LT1ZcCkqdCtCcH1mdW5jdGlvbiBtZSh0KXtyZXR1cm4oKHQqPTIpPD0xPzEtZ2UoMS10KTpnZSh0LTEpKzEpLzJ9ZnVuY3Rpb24geGUodCxuKXtmb3IodmFyIGU7IShlPXQuX190cmFuc2l0aW9uKXx8IShlPWVbbl0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gdGQudGltZT1wbigpLHRkO3JldHVybiBlfWZ1bmN0aW9uIGJlKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm57dHlwZTp0fX1mdW5jdGlvbiBNZSgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBUZSgpe3ZhciB0PXRoaXMub3duZXJTVkdFbGVtZW50fHx0aGlzO3JldHVybltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXX1mdW5jdGlvbiBOZSh0KXtmb3IoOyF0Ll9fYnJ1c2g7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdC5fX2JydXNofWZ1bmN0aW9uIGtlKHQpe3JldHVybiB0WzBdWzBdPT09dFsxXVswXXx8dFswXVsxXT09PXRbMV1bMV19ZnVuY3Rpb24gU2UodCl7dmFyIG49dC5fX2JydXNoO3JldHVybiBuP24uZGltLm91dHB1dChuLnNlbGVjdGlvbik6bnVsbH1mdW5jdGlvbiBFZSgpe3JldHVybiBDZShsZCl9ZnVuY3Rpb24gQWUoKXtyZXR1cm4gQ2UoaGQpfWZ1bmN0aW9uIENlKG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9dC5wcm9wZXJ0eSgiX19icnVzaCIsYSkuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW3dlKCJvdmVybGF5IildKTtlLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLGRkLm92ZXJsYXkpLm1lcmdlKGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1OZSh0aGlzKS5leHRlbnQ7cGwodGhpcykuYXR0cigieCIsdFswXVswXSkuYXR0cigieSIsdFswXVsxXSkuYXR0cigid2lkdGgiLHRbMV1bMF0tdFswXVswXSkuYXR0cigiaGVpZ2h0Iix0WzFdWzFdLXRbMF1bMV0pfSksdC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5kYXRhKFt3ZSgic2VsZWN0aW9uIildKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwic2VsZWN0aW9uIikuYXR0cigiY3Vyc29yIixkZC5zZWxlY3Rpb24pLmF0dHIoImZpbGwiLCIjNzc3IikuYXR0cigiZmlsbC1vcGFjaXR5IiwuMykuYXR0cigic3Ryb2tlIiwiI2ZmZiIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgaT10LnNlbGVjdEFsbCgiLmhhbmRsZSIpLmRhdGEobi5oYW5kbGVzLGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KTtpLmV4aXQoKS5yZW1vdmUoKSxpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKHQpe3JldHVybiJoYW5kbGUgaGFuZGxlLS0iK3QudHlwZX0pLmF0dHIoImN1cnNvciIsZnVuY3Rpb24odCl7cmV0dXJuIGRkW3QudHlwZV19KSx0LmVhY2gocikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCB0b3VjaHN0YXJ0LmJydXNoIix1KX1mdW5jdGlvbiByKCl7dmFyIHQ9cGwodGhpcyksbj1OZSh0aGlzKS5zZWxlY3Rpb247bj8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsblswXVswXSkuYXR0cigieSIsblswXVsxXSkuYXR0cigid2lkdGgiLG5bMV1bMF0tblswXVswXSkuYXR0cigiaGVpZ2h0IixuWzFdWzFdLW5bMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiJlIj09PXQudHlwZVt0LnR5cGUubGVuZ3RoLTFdP25bMV1bMF0taC8yOm5bMF1bMF0taC8yfSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP25bMV1bMV0taC8yOm5bMF1bMV0taC8yfSkuYXR0cigid2lkdGgiLGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP25bMV1bMF0tblswXVswXStoOmh9KS5hdHRyKCJoZWlnaHQiLGZ1bmN0aW9uKHQpe3JldHVybiJlIj09PXQudHlwZXx8InciPT09dC50eXBlP25bMV1bMV0tblswXVsxXStoOmh9KSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIGkodCxuKXtyZXR1cm4gdC5fX2JydXNoLmVtaXR0ZXJ8fG5ldyBvKHQsbil9ZnVuY3Rpb24gbyh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTB9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIGUoKXt2YXIgdD16ZihUKTshVXx8d3x8TXx8KE1hdGguYWJzKHRbMF0tT1swXSk+TWF0aC5hYnModFsxXS1PWzFdKT9NPSEwOnc9ITApLE89dCxiPSEwLHVkKCksbygpfWZ1bmN0aW9uIG8oKXt2YXIgdDtzd2l0Y2gobT1PWzBdLURbMF0seD1PWzFdLURbMV0sayl7Y2FzZSBjZDpjYXNlIGFkOlMmJihtPU1hdGgubWF4KFAtbCxNYXRoLm1pbihxLXYsbSkpLGg9bCttLF89dittKSxFJiYoeD1NYXRoLm1heChSLXAsTWF0aC5taW4oTC15LHgpKSxkPXAreCxnPXkreCk7YnJlYWs7Y2FzZSBzZDpTPDA/KG09TWF0aC5tYXgoUC1sLE1hdGgubWluKHEtbCxtKSksaD1sK20sXz12KTpTPjAmJihtPU1hdGgubWF4KFAtdixNYXRoLm1pbihxLXYsbSkpLGg9bCxfPXYrbSksRTwwPyh4PU1hdGgubWF4KFItcCxNYXRoLm1pbihMLXAseCkpLGQ9cCt4LGc9eSk6RT4wJiYoeD1NYXRoLm1heChSLXksTWF0aC5taW4oTC15LHgpKSxkPXAsZz15K3gpO2JyZWFrO2Nhc2UgZmQ6UyYmKGg9TWF0aC5tYXgoUCxNYXRoLm1pbihxLGwtbSpTKSksXz1NYXRoLm1heChQLE1hdGgubWluKHEsdittKlMpKSksRSYmKGQ9TWF0aC5tYXgoUixNYXRoLm1pbihMLHAteCpFKSksZz1NYXRoLm1heChSLE1hdGgubWluKEwseSt4KkUpKSl9XzxoJiYoUyo9LTEsdD1sLGw9dix2PXQsdD1oLGg9XyxfPXQsTiBpbiB2ZCYmWS5hdHRyKCJjdXJzb3IiLGRkW049dmRbTl1dKSksZzxkJiYoRSo9LTEsdD1wLHA9eSx5PXQsdD1kLGQ9ZyxnPXQsTiBpbiBfZCYmWS5hdHRyKCJjdXJzb3IiLGRkW049X2RbTl1dKSksQS5zZWxlY3Rpb24mJih6PUEuc2VsZWN0aW9uKSx3JiYoaD16WzBdWzBdLF89elsxXVswXSksTSYmKGQ9elswXVsxXSxnPXpbMV1bMV0pLHpbMF1bMF09PT1oJiZ6WzBdWzFdPT09ZCYmelsxXVswXT09PV8mJnpbMV1bMV09PT1nfHwoQS5zZWxlY3Rpb249W1toLGRdLFtfLGddXSxyLmNhbGwoVCksRi5icnVzaCgpKX1mdW5jdGlvbiB1KCl7aWYoYmUoKSx0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuO2MmJmNsZWFyVGltZW91dChjKSxjPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjPW51bGx9LDUwMCksSS5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixudWxsKX1lbHNlIF90KHQuZXZlbnQudmlldyxiKSxCLm9uKCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIixudWxsKTtJLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIiksWS5hdHRyKCJjdXJzb3IiLGRkLm92ZXJsYXkpLEEuc2VsZWN0aW9uJiYoej1BLnNlbGVjdGlvbiksa2UoeikmJihBLnNlbGVjdGlvbj1udWxsLHIuY2FsbChUKSksRi5lbmQoKX1mdW5jdGlvbiBhKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpVPVMmJkU7YnJlYWs7Y2FzZSAxODprPT09c2QmJihTJiYodj1fLW0qUyxsPWgrbSpTKSxFJiYoeT1nLXgqRSxwPWQreCpFKSxrPWZkLG8oKSk7YnJlYWs7Y2FzZSAzMjprIT09c2QmJmshPT1mZHx8KFM8MD92PV8tbTpTPjAmJihsPWgtbSksRTwwP3k9Zy14OkU+MCYmKHA9ZC14KSxrPWNkLFkuYXR0cigiY3Vyc29yIixkZC5zZWxlY3Rpb24pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dWQoKX1mdW5jdGlvbiBzKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpVJiYodz1NPVU9ITEsbygpKTticmVhaztjYXNlIDE4Oms9PT1mZCYmKFM8MD92PV86Uz4wJiYobD1oKSxFPDA/eT1nOkU+MCYmKHA9ZCksaz1zZCxvKCkpO2JyZWFrO2Nhc2UgMzI6az09PWNkJiYodC5ldmVudC5hbHRLZXk/KFMmJih2PV8tbSpTLGw9aCttKlMpLEUmJih5PWcteCpFLHA9ZCt4KkUpLGs9ZmQpOihTPDA/dj1fOlM+MCYmKGw9aCksRTwwP3k9ZzpFPjAmJihwPWQpLGs9c2QpLFkuYXR0cigiY3Vyc29yIixkZFtOXSksbygpKTticmVhaztkZWZhdWx0OnJldHVybn11ZCgpfWlmKHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg8dC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm4gdWQoKX1lbHNlIGlmKGMpcmV0dXJuO2lmKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbCxoLHAsZCx2LF8seSxnLG0seCxiLHcsTSxUPXRoaXMsTj10LmV2ZW50LnRhcmdldC5fX2RhdGFfXy50eXBlLGs9InNlbGVjdGlvbiI9PT0odC5ldmVudC5tZXRhS2V5P049Im92ZXJsYXkiOk4pP2FkOnQuZXZlbnQuYWx0S2V5P2ZkOnNkLFM9bj09PWhkP251bGw6eWRbTl0sRT1uPT09bGQ/bnVsbDpnZFtOXSxBPU5lKFQpLEM9QS5leHRlbnQsej1BLnNlbGVjdGlvbixQPUNbMF1bMF0sUj1DWzBdWzFdLHE9Q1sxXVswXSxMPUNbMV1bMV0sVT1TJiZFJiZ0LmV2ZW50LnNoaWZ0S2V5LEQ9emYoVCksTz1ELEY9aShULGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKTsib3ZlcmxheSI9PT1OP0Euc2VsZWN0aW9uPXo9W1tsPW49PT1oZD9QOkRbMF0scD1uPT09bGQ/UjpEWzFdXSxbdj1uPT09aGQ/cTpsLHk9bj09PWxkP0w6cF1dOihsPXpbMF1bMF0scD16WzBdWzFdLHY9elsxXVswXSx5PXpbMV1bMV0pLGg9bCxkPXAsXz12LGc9eTt2YXIgST1wbChUKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSxZPUkuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmF0dHIoImN1cnNvciIsZGRbTl0pO2lmKHQuZXZlbnQudG91Y2hlcylJLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGUsITApLm9uKCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsdSwhMCk7ZWxzZXt2YXIgQj1wbCh0LmV2ZW50LnZpZXcpLm9uKCJrZXlkb3duLmJydXNoIixhLCEwKS5vbigia2V5dXAuYnJ1c2giLHMsITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGUsITApLm9uKCJtb3VzZXVwLmJydXNoIix1LCEwKTtnbCh0LmV2ZW50LnZpZXcpfWJlKCksb3AoVCksci5jYWxsKFQpLEYuc3RhcnQoKX19ZnVuY3Rpb24gYSgpe3ZhciB0PXRoaXMuX19icnVzaHx8e3NlbGVjdGlvbjpudWxsfTtyZXR1cm4gdC5leHRlbnQ9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5kaW09bix0fXZhciBjLHM9VGUsZj1NZSxsPXAoZSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGg9NjtyZXR1cm4gZS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7aSh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7aSh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt1LnNlbGVjdGlvbj0xPT09dCYma2Uocyk/bnVsbDpmKHQpLHIuY2FsbChvKSxhLmJydXNoKCl9dmFyIG89dGhpcyx1PW8uX19icnVzaCxhPWkobyxhcmd1bWVudHMpLGM9dS5zZWxlY3Rpb24scz1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsdS5leHRlbnQpLGY9bWgoYyxzKTtyZXR1cm4gYyYmcz90OnQoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD10aGlzLG89YXJndW1lbnRzLHU9dC5fX2JydXNoLGE9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHQsbyk6ZSx1LmV4dGVudCksYz1pKHQsbykuYmVmb3Jlc3RhcnQoKTtvcCh0KSx1LnNlbGVjdGlvbj1udWxsPT1hfHxrZShhKT9udWxsOmEsci5jYWxsKHQpLGMuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LG8ucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuc3RhdGUuZW1pdHRlcj10aGlzLHRoaXMuc3RhcnRpbmc9ITApLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRpbmcmJih0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sYnJ1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtTKG5ldyBvZChlLHQsbi5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSxsLmFwcGx5LGwsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sZS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppZChbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSksZSk6c30sZS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppZCghIXQpLGUpOmZ9LGUuaGFuZGxlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxlKTpofSxlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9bC5vbi5hcHBseShsLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1sP2U6dH0sZX1mdW5jdGlvbiB6ZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gdChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSxlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSl9fWZ1bmN0aW9uIFBlKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gUmUoKXtyZXR1cm4gbmV3IFBlfWZ1bmN0aW9uIHFlKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBMZSh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIERlKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gRmUoKXt9ZnVuY3Rpb24gSWUodCxuKXt2YXIgZT1uZXcgRmU7aWYodCBpbnN0YW5jZW9mIEZlKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIHUgaW4gdCllLnNldCh1LHRbdV0pO3JldHVybiBlfWZ1bmN0aW9uIFllKCl7cmV0dXJue319ZnVuY3Rpb24gQmUodCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBqZSgpe3JldHVybiBJZSgpfWZ1bmN0aW9uIEhlKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIFhlKCl7fWZ1bmN0aW9uIFZlKHQsbil7dmFyIGU9bmV3IFhlO2lmKHQgaW5zdGFuY2VvZiBYZSl0LmVhY2goZnVuY3Rpb24odCl7ZS5hZGQodCl9KTtlbHNlIGlmKHQpe3ZhciByPS0xLGk9dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysrcjxpOyllLmFkZCh0W3JdKTtlbHNlIGZvcig7KytyPGk7KWUuYWRkKG4odFtyXSxyLHQpKX1yZXR1cm4gZX1mdW5jdGlvbiBXZSh0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyI6IGRbIituKyJdIn0pLmpvaW4oIiwiKSsifSIpfWZ1bmN0aW9uICRlKHQsbil7dmFyIGU9V2UodCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX1mdW5jdGlvbiBaZSh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLGU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIHIgaW4gdClyIGluIG58fGUucHVzaChuW3JdPXIpfSksZX1mdW5jdGlvbiBHZSh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHA9dC5fcm9vdCxkPXtkYXRhOnJ9LHY9dC5feDAsXz10Ll95MCx5PXQuX3gxLGc9dC5feTE7aWYoIXApcmV0dXJuIHQuX3Jvb3Q9ZCx0O2Zvcig7cC5sZW5ndGg7KWlmKChzPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChmPWU+PSh1PShfK2cpLzIpKT9fPXU6Zz11LGk9cCwhKHA9cFtsPWY8PDF8c10pKXJldHVybiBpW2xdPWQsdDtpZihhPSt0Ll94LmNhbGwobnVsbCxwLmRhdGEpLGM9K3QuX3kuY2FsbChudWxsLHAuZGF0YSksbj09PWEmJmU9PT1jKXJldHVybiBkLm5leHQ9cCxpP2lbbF09ZDp0Ll9yb290PWQsdDtkbyBpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKHM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKGY9ZT49KHU9KF8rZykvMikpP189dTpnPXU7d2hpbGUoKGw9Zjw8MXxzKT09PShoPShjPj11KTw8MXxhPj1vKSk7cmV0dXJuIGlbaF09cCxpW2xdPWQsdH1mdW5jdGlvbiBKZSh0KXt2YXIgbixlLHIsaSxvPXQubGVuZ3RoLHU9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLGM9MS8wLHM9MS8wLGY9LSgxLzApLGw9LSgxLzApO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwodVtlXT1yLGFbZV09aSxyPGMmJihjPXIpLHI+ZiYmKGY9ciksaTxzJiYocz1pKSxpPmwmJihsPWkpKTtmb3IoZjxjJiYoYz10aGlzLl94MCxmPXRoaXMuX3gxKSxsPHMmJihzPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoYyxzKS5jb3ZlcihmLGwpLGU9MDtlPG87KytlKUdlKHRoaXMsdVtlXSxhW2VdLHRbZV0pO3JldHVybiB0aGlzfWZ1bmN0aW9uIFFlKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBLZSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiB0cih0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBucih0LG4sZSl7dmFyIHI9bmV3IGVyKG51bGw9PW4/S2U6bixudWxsPT1lP3RyOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIGVyKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gcnIodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufWZ1bmN0aW9uIGlyKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBvcih0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gdXIodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gYXIodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gY3IodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBzcih0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIGZyKHQpe2lmKCEobj1Ddi5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBuLGU9blsxXXx8IiAiLHI9blsyXXx8Ij4iLGk9blszXXx8Ii0iLG89bls0XXx8IiIsdT0hIW5bNV0sYT1uWzZdJiYrbls2XSxjPSEhbls3XSxzPW5bOF0mJituWzhdLnNsaWNlKDEpLGY9bls5XXx8IiI7Im4iPT09Zj8oYz0hMCxmPSJnIik6QXZbZl18fChmPSIiKSwodXx8IjAiPT09ZSYmIj0iPT09cikmJih1PSEwLGU9IjAiLHI9Ij0iKSx0aGlzLmZpbGw9ZSx0aGlzLmFsaWduPXIsdGhpcy5zaWduPWksdGhpcy5zeW1ib2w9byx0aGlzLnplcm89dSx0aGlzLndpZHRoPWEsdGhpcy5jb21tYT1jLHRoaXMucHJlY2lzaW9uPXMsdGhpcy50eXBlPWZ9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIHR9ZnVuY3Rpb24gaHIobil7cmV0dXJuIFB2PXF2KG4pLAp0LmZvcm1hdD1Qdi5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9UHYuZm9ybWF0UHJlZml4LFB2fWZ1bmN0aW9uIHByKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGRyKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9ZnVuY3Rpb24gdnIodCl7cmV0dXJuIHQ+MT8wOnQ8LTE/bV86TWF0aC5hY29zKHQpfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0PjE/eF86dDwtMT8teF86TWF0aC5hc2luKHQpfWZ1bmN0aW9uIHlyKHQpe3JldHVybih0PVJfKHQvMikpKnR9ZnVuY3Rpb24gZ3IoKXt9ZnVuY3Rpb24gbXIodCxuKXt0JiZPXy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpJiZPX1t0LnR5cGVdKHQsbil9ZnVuY3Rpb24geHIodCxuLGUpe3ZhciByLGk9LTEsbz10Lmxlbmd0aC1lO2ZvcihuLmxpbmVTdGFydCgpOysraTxvOylyPXRbaV0sbi5wb2ludChyWzBdLHJbMV0sclsyXSk7bi5saW5lRW5kKCl9ZnVuY3Rpb24gYnIodCxuKXt2YXIgZT0tMSxyPXQubGVuZ3RoO2ZvcihuLnBvbHlnb25TdGFydCgpOysrZTxyOyl4cih0W2VdLG4sMSk7bi5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gd3IoKXtCXy5wb2ludD1Ucn1mdW5jdGlvbiBNcigpe05yKEZ2LEl2KX1mdW5jdGlvbiBUcih0LG4pe0JfLnBvaW50PU5yLEZ2PXQsSXY9bix0Kj1UXyxuKj1UXyxZdj10LEJ2PUVfKG49bi8yK2JfKSxqdj1SXyhuKX1mdW5jdGlvbiBOcih0LG4pe3QqPVRfLG4qPVRfLG49bi8yK2JfO3ZhciBlPXQtWXYscj1lPj0wPzE6LTEsaT1yKmUsbz1FXyhuKSx1PVJfKG4pLGE9anYqdSxjPUJ2Km8rYSpFXyhpKSxzPWEqcipSXyhpKTtJXy5hZGQoU18ocyxjKSksWXY9dCxCdj1vLGp2PXV9ZnVuY3Rpb24ga3IodCl7cmV0dXJuW1NfKHRbMV0sdFswXSksX3IodFsyXSldfWZ1bmN0aW9uIFNyKHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9RV8oZSk7cmV0dXJuW3IqRV8obikscipSXyhuKSxSXyhlKV19ZnVuY3Rpb24gRXIodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gQXIodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIENyKHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24genIodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIFByKHQpe3ZhciBuPUxfKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn1mdW5jdGlvbiBScih0LG4pe1F2LnB1c2goS3Y9W0h2PXQsVnY9dF0pLG48WHYmJihYdj1uKSxuPld2JiYoV3Y9bil9ZnVuY3Rpb24gcXIodCxuKXt2YXIgZT1TcihbdCpUXyxuKlRfXSk7aWYoSnYpe3ZhciByPUFyKEp2LGUpLGk9W3JbMV0sLXJbMF0sMF0sbz1BcihpLHIpO1ByKG8pLG89a3Iobyk7dmFyIHUsYT10LSR2LGM9YT4wPzE6LTEscz1vWzBdKk1fKmMsZj1OXyhhKT4xODA7Zl4oYyokdjxzJiZzPGMqdCk/KHU9b1sxXSpNXyx1Pld2JiYoV3Y9dSkpOihzPShzKzM2MCklMzYwLTE4MCxmXihjKiR2PHMmJnM8Yyp0KT8odT0tb1sxXSpNXyx1PFh2JiYoWHY9dSkpOihuPFh2JiYoWHY9biksbj5XdiYmKFd2PW4pKSksZj90PCR2P0lyKEh2LHQpPklyKEh2LFZ2KSYmKFZ2PXQpOklyKHQsVnYpPklyKEh2LFZ2KSYmKEh2PXQpOlZ2Pj1Idj8odDxIdiYmKEh2PXQpLHQ+VnYmJihWdj10KSk6dD4kdj9JcihIdix0KT5JcihIdixWdikmJihWdj10KTpJcih0LFZ2KT5JcihIdixWdikmJihIdj10KX1lbHNlIFJyKHQsbik7SnY9ZSwkdj10fWZ1bmN0aW9uIExyKCl7WF8ucG9pbnQ9cXJ9ZnVuY3Rpb24gVXIoKXtLdlswXT1IdixLdlsxXT1WdixYXy5wb2ludD1ScixKdj1udWxsfWZ1bmN0aW9uIERyKHQsbil7aWYoSnYpe3ZhciBlPXQtJHY7SF8uYWRkKE5fKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgWnY9dCxHdj1uO0JfLnBvaW50KHQsbikscXIodCxuKX1mdW5jdGlvbiBPcigpe0JfLmxpbmVTdGFydCgpfWZ1bmN0aW9uIEZyKCl7RHIoWnYsR3YpLEJfLmxpbmVFbmQoKSxOXyhIXyk+eV8mJihIdj0tKFZ2PTE4MCkpLEt2WzBdPUh2LEt2WzFdPVZ2LEp2PW51bGx9ZnVuY3Rpb24gSXIodCxuKXtyZXR1cm4obi09dCk8MD9uKzM2MDpufWZ1bmN0aW9uIFlyKHQsbil7cmV0dXJuIHRbMF0tblswXX1mdW5jdGlvbiBCcih0LG4pe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59ZnVuY3Rpb24ganIodCxuKXt0Kj1UXyxuKj1UXzt2YXIgZT1FXyhuKTtIcihlKkVfKHQpLGUqUl8odCksUl8obikpfWZ1bmN0aW9uIEhyKHQsbixlKXsrK3RfLGVfKz0odC1lXykvdF8scl8rPShuLXJfKS90XyxpXys9KGUtaV8pL3RffWZ1bmN0aW9uIFhyKCl7V18ucG9pbnQ9VnJ9ZnVuY3Rpb24gVnIodCxuKXt0Kj1UXyxuKj1UXzt2YXIgZT1FXyhuKTtwXz1lKkVfKHQpLGRfPWUqUl8odCksdl89Ul8obiksV18ucG9pbnQ9V3IsSHIocF8sZF8sdl8pfWZ1bmN0aW9uIFdyKHQsbil7dCo9VF8sbio9VF87dmFyIGU9RV8obikscj1lKkVfKHQpLGk9ZSpSXyh0KSxvPVJfKG4pLHU9U18oTF8oKHU9ZF8qby12XyppKSp1Kyh1PXZfKnItcF8qbykqdSsodT1wXyppLWRfKnIpKnUpLHBfKnIrZF8qaSt2XypvKTtuXys9dSxvXys9dSoocF8rKHBfPXIpKSx1Xys9dSooZF8rKGRfPWkpKSxhXys9dSoodl8rKHZfPW8pKSxIcihwXyxkXyx2Xyl9ZnVuY3Rpb24gJHIoKXtXXy5wb2ludD1qcn1mdW5jdGlvbiBacigpe1dfLnBvaW50PUpyfWZ1bmN0aW9uIEdyKCl7UXIobF8saF8pLFdfLnBvaW50PWpyfWZ1bmN0aW9uIEpyKHQsbil7bF89dCxoXz1uLHQqPVRfLG4qPVRfLFdfLnBvaW50PVFyO3ZhciBlPUVfKG4pO3BfPWUqRV8odCksZF89ZSpSXyh0KSx2Xz1SXyhuKSxIcihwXyxkXyx2Xyl9ZnVuY3Rpb24gUXIodCxuKXt0Kj1UXyxuKj1UXzt2YXIgZT1FXyhuKSxyPWUqRV8odCksaT1lKlJfKHQpLG89Ul8obiksdT1kXypvLXZfKmksYT12XypyLXBfKm8sYz1wXyppLWRfKnIscz1MXyh1KnUrYSphK2MqYyksZj1wXypyK2RfKmkrdl8qbyxsPXMmJi12cihmKS9zLGg9U18ocyxmKTtjXys9bCp1LHNfKz1sKmEsZl8rPWwqYyxuXys9aCxvXys9aCoocF8rKHBfPXIpKSx1Xys9aCooZF8rKGRfPWkpKSxhXys9aCoodl8rKHZfPW8pKSxIcihwXyxkXyx2Xyl9ZnVuY3Rpb24gS3IodCxuKXtyZXR1cm5bdD5tXz90LXdfOnQ8LW1fP3Qrd186dCxuXX1mdW5jdGlvbiB0aSh0LG4sZSl7cmV0dXJuKHQlPXdfKT9ufHxlP0dfKGVpKHQpLHJpKG4sZSkpOmVpKHQpOm58fGU/cmkobixlKTpLcn1mdW5jdGlvbiBuaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gbis9dCxbbj5tXz9uLXdfOm48LW1fP24rd186bixlXX19ZnVuY3Rpb24gZWkodCl7dmFyIG49bmkodCk7cmV0dXJuIG4uaW52ZXJ0PW5pKC10KSxufWZ1bmN0aW9uIHJpKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPUVfKG4pLGE9RV8odCkqZSxjPVJfKHQpKmUscz1SXyhuKSxmPXMqcithKmk7cmV0dXJuW1NfKGMqby1mKnUsYSpyLXMqaSksX3IoZipvK2MqdSldfXZhciByPUVfKHQpLGk9Ul8odCksbz1FXyhuKSx1PVJfKG4pO3JldHVybiBlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPUVfKG4pLGE9RV8odCkqZSxjPVJfKHQpKmUscz1SXyhuKSxmPXMqby1jKnU7cmV0dXJuW1NfKGMqbytzKnUsYSpyK2YqaSksX3IoZipyLWEqaSldfSxlfWZ1bmN0aW9uIGlpKHQsbixlLHIsaSxvKXtpZihlKXt2YXIgdT1FXyhuKSxhPVJfKG4pLGM9ciplO251bGw9PWk/KGk9bityKndfLG89bi1jLzIpOihpPW9pKHUsaSksbz1vaSh1LG8pLChyPjA/aTxvOmk+bykmJihpKz1yKndfKSk7Zm9yKHZhciBzLGY9aTtyPjA/Zj5vOmY8bztmLT1jKXM9a3IoW3UsLWEqRV8oZiksLWEqUl8oZildKSx0LnBvaW50KHNbMF0sc1sxXSl9fWZ1bmN0aW9uIG9pKHQsbil7bj1TcihuKSxuWzBdLT10LFByKG4pO3ZhciBlPXZyKC1uWzFdKTtyZXR1cm4oKC1uWzJdPDA/LWU6ZSkrd18teV8pJXdffWZ1bmN0aW9uIHVpKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gYWkodCl7aWYobj10Lmxlbmd0aCl7Zm9yKHZhciBuLGUscj0wLGk9dFswXTsrK3I8bjspaS5uPWU9dFtyXSxlLnA9aSxpPWU7aS5uPWU9dFswXSxlLnA9aX19ZnVuY3Rpb24gY2kodCxuLGUscil7ZnVuY3Rpb24gaShpLG8pe3JldHVybiB0PD1pJiZpPD1lJiZuPD1vJiZvPD1yfWZ1bmN0aW9uIG8oaSxvLGEscyl7dmFyIGY9MCxsPTA7aWYobnVsbD09aXx8KGY9dShpLGEpKSE9PShsPXUobyxhKSl8fGMoaSxvKTwwXmE+MCl7ZG8gcy5wb2ludCgwPT09Znx8Mz09PWY/dDplLGY+MT9yOm4pO3doaWxlKChmPShmK2ErNCklNCkhPT1sKX1lbHNlIHMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiB1KHIsaSl7cmV0dXJuIE5fKHJbMF0tdCk8eV8/aT4wPzA6MzpOXyhyWzBdLWUpPHlfP2k+MD8yOjE6Tl8oclsxXS1uKTx5Xz9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gYSh0LG4pe3JldHVybiBjKHQueCxuLngpfWZ1bmN0aW9uIGModCxuKXt2YXIgZT11KHQsMSkscj11KG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKHUpe2Z1bmN0aW9uIGModCxuKXtpKHQsbikmJmsucG9pbnQodCxuKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciBuPTAsZT0wLGk9Xy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sdSxhPV9bZV0sYz0xLHM9YS5sZW5ndGgsZj1hWzBdLGw9ZlswXSxoPWZbMV07YzxzOysrYylvPWwsdT1oLGY9YVtjXSxsPWZbMF0saD1mWzFdLHU8PXI/aD5yJiYobC1vKSooci11KT4oaC11KSoodC1vKSYmKytuOmg8PXImJihsLW8pKihyLXUpPChoLXUpKih0LW8pJiYtLW47cmV0dXJuIG59ZnVuY3Rpb24gZigpe2s9Uyx2PVtdLF89W10sTj0hMH1mdW5jdGlvbiBsKCl7dmFyIHQ9cygpLG49TiYmdCxlPSh2PUtzKHYpKS5sZW5ndGg7KG58fGUpJiYodS5wb2x5Z29uU3RhcnQoKSxuJiYodS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHUpLHUubGluZUVuZCgpKSxlJiZweSh2LGEsdCxvLHUpLHUucG9seWdvbkVuZCgpKSxrPXUsdj1fPXk9bnVsbH1mdW5jdGlvbiBoKCl7RS5wb2ludD1kLF8mJl8ucHVzaCh5PVtdKSxUPSEwLE09ITEsYj13PU5hTn1mdW5jdGlvbiBwKCl7diYmKGQoZyxtKSx4JiZNJiZTLnJlam9pbigpLHYucHVzaChTLnJlc3VsdCgpKSksRS5wb2ludD1jLE0mJmsubGluZUVuZCgpfWZ1bmN0aW9uIGQobyx1KXt2YXIgYT1pKG8sdSk7aWYoXyYmeS5wdXNoKFtvLHVdKSxUKWc9byxtPXUseD1hLFQ9ITEsYSYmKGsubGluZVN0YXJ0KCksay5wb2ludChvLHUpKTtlbHNlIGlmKGEmJk0pay5wb2ludChvLHUpO2Vsc2V7dmFyIGM9W2I9TWF0aC5tYXgodnksTWF0aC5taW4oZHksYikpLHc9TWF0aC5tYXgodnksTWF0aC5taW4oZHksdykpXSxzPVtvPU1hdGgubWF4KHZ5LE1hdGgubWluKGR5LG8pKSx1PU1hdGgubWF4KHZ5LE1hdGgubWluKGR5LHUpKV07bHkoYyxzLHQsbixlLHIpPyhNfHwoay5saW5lU3RhcnQoKSxrLnBvaW50KGNbMF0sY1sxXSkpLGsucG9pbnQoc1swXSxzWzFdKSxhfHxrLmxpbmVFbmQoKSxOPSExKTphJiYoay5saW5lU3RhcnQoKSxrLnBvaW50KG8sdSksTj0hMSl9Yj1vLHc9dSxNPWF9dmFyIHYsXyx5LGcsbSx4LGIsdyxNLFQsTixrPXUsUz1meSgpLEU9e3BvaW50OmMsbGluZVN0YXJ0OmgsbGluZUVuZDpwLHBvbHlnb25TdGFydDpmLHBvbHlnb25FbmQ6bH07cmV0dXJuIEV9fWZ1bmN0aW9uIHNpKCl7Z3kucG9pbnQ9bGksZ3kubGluZUVuZD1maX1mdW5jdGlvbiBmaSgpe2d5LnBvaW50PWd5LmxpbmVFbmQ9Z3J9ZnVuY3Rpb24gbGkodCxuKXt0Kj1UXyxuKj1UXyxKXz10LFFfPVJfKG4pLEtfPUVfKG4pLGd5LnBvaW50PWhpfWZ1bmN0aW9uIGhpKHQsbil7dCo9VF8sbio9VF87dmFyIGU9Ul8obikscj1FXyhuKSxpPU5fKHQtSl8pLG89RV8oaSksdT1SXyhpKSxhPXIqdSxjPUtfKmUtUV8qcipvLHM9UV8qZStLXypyKm87eXkuYWRkKFNfKExfKGEqYStjKmMpLHMpKSxKXz10LFFfPWUsS189cn1mdW5jdGlvbiBwaSh0LG4sZSl7dmFyIHI9SXModCxuLXlfLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIGRpKHQsbixlKXt2YXIgcj1Jcyh0LG4teV8sZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gdmkoKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bigpfX1mdW5jdGlvbiBuKCl7cmV0dXJuIElzKEFfKG8vXykqXyxpLF8pLm1hcChoKS5jb25jYXQoSXMoQV8ocy95KSp5LGMseSkubWFwKHApKS5jb25jYXQoSXMoQV8oci9kKSpkLGUsZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBOXyh0JV8pPnlffSkubWFwKGYpKS5jb25jYXQoSXMoQV8oYS92KSp2LHUsdikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBOXyh0JXkpPnlffSkubWFwKGwpKX12YXIgZSxyLGksbyx1LGEsYyxzLGYsbCxoLHAsZD0xMCx2PWQsXz05MCx5PTM2MCxnPTIuNTtyZXR1cm4gdC5saW5lcz1mdW5jdGlvbigpe3JldHVybiBuKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSx0Lm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2gobykuY29uY2F0KHAoYykuc2xpY2UoMSksaChpKS5yZXZlcnNlKCkuc2xpY2UoMSkscChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LHQuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuZXh0ZW50TWFqb3IobikuZXh0ZW50TWlub3Iobik6dC5leHRlbnRNaW5vcigpfSx0LmV4dGVudE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPStuWzBdWzBdLGk9K25bMV1bMF0scz0rblswXVsxXSxjPStuWzFdWzFdLG8+aSYmKG49byxvPWksaT1uKSxzPmMmJihuPXMscz1jLGM9biksdC5wcmVjaXNpb24oZykpOltbbyxzXSxbaSxjXV19LHQuZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K25bMF1bMF0sZT0rblsxXVswXSxhPStuWzBdWzFdLHU9K25bMV1bMV0scj5lJiYobj1yLHI9ZSxlPW4pLGE+dSYmKG49YSxhPXUsdT1uKSx0LnByZWNpc2lvbihnKSk6W1tyLGFdLFtlLHVdXX0sdC5zdGVwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Quc3RlcE1ham9yKG4pLnN0ZXBNaW5vcihuKTp0LnN0ZXBNaW5vcigpfSx0LnN0ZXBNYWpvcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rblswXSx5PStuWzFdLHQpOltfLHldfSx0LnN0ZXBNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rblswXSx2PStuWzFdLHQpOltkLHZdfSx0LnByZWNpc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rbixmPXBpKGEsdSw5MCksbD1kaShyLGUsZyksaD1waShzLGMsOTApLHA9ZGkobyxpLGcpLHQpOmd9LHQuZXh0ZW50TWFqb3IoW1stMTgwLC05MCt5X10sWzE4MCw5MC15X11dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLXlfXSxbMTgwLDgwK3lfXV0pfWZ1bmN0aW9uIF9pKCl7cmV0dXJuIHZpKCkoKX1mdW5jdGlvbiB5aSgpe1N5LnBvaW50PWdpfWZ1bmN0aW9uIGdpKHQsbil7U3kucG9pbnQ9bWksdHk9ZXk9dCxueT1yeT1ufWZ1bmN0aW9uIG1pKHQsbil7a3kuYWRkKHJ5KnQtZXkqbiksZXk9dCxyeT1ufWZ1bmN0aW9uIHhpKCl7bWkodHksbnkpfWZ1bmN0aW9uIGJpKHQsbil7dDxFeSYmKEV5PXQpLHQ+Q3kmJihDeT10KSxuPEF5JiYoQXk9biksbj56eSYmKHp5PW4pfWZ1bmN0aW9uIHdpKHQsbil7UnkrPXQscXkrPW4sKytMeX1mdW5jdGlvbiBNaSgpe0J5LnBvaW50PVRpfWZ1bmN0aW9uIFRpKHQsbil7QnkucG9pbnQ9Tmksd2kodXk9dCxheT1uKX1mdW5jdGlvbiBOaSh0LG4pe3ZhciBlPXQtdXkscj1uLWF5LGk9TF8oZSplK3Iqcik7VXkrPWkqKHV5K3QpLzIsRHkrPWkqKGF5K24pLzIsT3krPWksd2kodXk9dCxheT1uKX1mdW5jdGlvbiBraSgpe0J5LnBvaW50PXdpfWZ1bmN0aW9uIFNpKCl7QnkucG9pbnQ9QWl9ZnVuY3Rpb24gRWkoKXtDaShpeSxveSl9ZnVuY3Rpb24gQWkodCxuKXtCeS5wb2ludD1DaSx3aShpeT11eT10LG95PWF5PW4pfWZ1bmN0aW9uIENpKHQsbil7dmFyIGU9dC11eSxyPW4tYXksaT1MXyhlKmUrcipyKTtVeSs9aSoodXkrdCkvMixEeSs9aSooYXkrbikvMixPeSs9aSxpPWF5KnQtdXkqbixGeSs9aSoodXkrdCksSXkrPWkqKGF5K24pLFl5Kz0zKmksd2kodXk9dCxheT1uKX1mdW5jdGlvbiB6aSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gUGkoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24gUmkodCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gcWkodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gTGkodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0teF8teV86eF8tdFsxXSktKChuPW4ueClbMF08MD9uWzFdLXhfLXlfOnhfLW5bMV0pfWZ1bmN0aW9uIFVpKHQpe3ZhciBuLGU9TmFOLHI9TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLG49MX0scG9pbnQ6ZnVuY3Rpb24obyx1KXt2YXIgYT1vPjA/bV86LW1fLGM9Tl8oby1lKTtOXyhjLW1fKTx5Xz8odC5wb2ludChlLHI9KHIrdSkvMj4wP3hfOi14XyksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLHQucG9pbnQobyxyKSxuPTApOmkhPT1hJiZjPj1tXyYmKE5fKGUtaSk8eV8mJihlLT1pKnlfKSxOXyhvLWEpPHlfJiYoby09YSp5Xykscj1EaShlLHIsbyx1KSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksbj0wKSx0LnBvaW50KGU9byxyPXUpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fWZ1bmN0aW9uIERpKHQsbixlLHIpe3ZhciBpLG8sdT1SXyh0LWUpO3JldHVybiBOXyh1KT55Xz9rXygoUl8obikqKG89RV8ocikpKlJfKGUpLVJfKHIpKihpPUVfKG4pKSpSXyh0KSkvKGkqbyp1KSk6KG4rcikvMn1mdW5jdGlvbiBPaSh0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSp4XyxyLnBvaW50KC1tXyxpKSxyLnBvaW50KDAsaSksci5wb2ludChtXyxpKSxyLnBvaW50KG1fLDApLHIucG9pbnQobV8sLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtbV8sLWkpLHIucG9pbnQoLW1fLDApLHIucG9pbnQoLW1fLGkpO2Vsc2UgaWYoTl8odFswXS1uWzBdKT55Xyl7dmFyIG89dFswXTxuWzBdP21fOi1tXztpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX1mdW5jdGlvbiBGaSh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IElpO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBJaSgpe31mdW5jdGlvbiBZaSh0LG4sZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTt0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1vJiZ0LmNsaXBFeHRlbnQobnVsbCksRl8oZSx0LnN0cmVhbShQeSkpO3ZhciB1PVB5LnJlc3VsdCgpLGE9TWF0aC5taW4oci8odVsxXVswXS11WzBdWzBdKSxpLyh1WzFdWzFdLXVbMF1bMV0pKSxjPStuWzBdWzBdKyhyLWEqKHVbMV1bMF0rdVswXVswXSkpLzIscz0rblswXVsxXSsoaS1hKih1WzFdWzFdK3VbMF1bMV0pKS8yO3JldHVybiBudWxsIT1vJiZ0LmNsaXBFeHRlbnQobyksdC5zY2FsZSgxNTAqYSkudHJhbnNsYXRlKFtjLHNdKX1mdW5jdGlvbiBCaSh0LG4sZSl7cmV0dXJuIFlpKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIGppKHQpe3JldHVybiBGaSh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIEhpKHQsbil7ZnVuY3Rpb24gZShyLGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF8pe3ZhciB5PXMtcixnPWYtaSxtPXkqeStnKmc7aWYobT40Km4mJnYtLSl7dmFyIHg9dStoLGI9YStwLHc9YytkLE09TF8oeCp4K2IqYit3KncpLFQ9X3Iody89TSksTj1OXyhOXyh3KS0xKTx5X3x8Tl8oby1sKTx5Xz8obytsKS8yOlNfKGIseCksaz10KE4sVCksUz1rWzBdLEU9a1sxXSxBPVMtcixDPUUtaSx6PWcqQS15KkM7KHoqei9tPm58fE5fKCh5KkErZypDKS9tLS41KT4uM3x8dSpoK2EqcCtjKmQ8SnkpJiYoZShyLGksbyx1LGEsYyxTLEUsTix4Lz1NLGIvPU0sdyx2LF8pLF8ucG9pbnQoUyxFKSxlKFMsRSxOLHgsYix3LHMsZixsLGgscCxkLHYsXykpfX1yZXR1cm4gZnVuY3Rpb24obil7ZnVuY3Rpb24gcihlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBpKCl7eT1OYU4sdy5wb2ludD1vLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbyhyLGkpe3ZhciBvPVNyKFtyLGldKSx1PXQocixpKTtlKHksZyxfLG0seCxiLHk9dVswXSxnPXVbMV0sXz1yLG09b1swXSx4PW9bMV0sYj1vWzJdLEd5LG4pLG4ucG9pbnQoeSxnKX1mdW5jdGlvbiB1KCl7dy5wb2ludD1yLG4ubGluZUVuZCgpfWZ1bmN0aW9uIGEoKXtpKCksdy5wb2ludD1jLHcubGluZUVuZD1zfWZ1bmN0aW9uIGModCxuKXtvKGY9dCxuKSxsPXksaD1nLHA9bSxkPXgsdj1iLHcucG9pbnQ9b31mdW5jdGlvbiBzKCl7ZSh5LGcsXyxtLHgsYixsLGgsZixwLGQsdixHeSxuKSx3LmxpbmVFbmQ9dSx1KCl9dmFyIGYsbCxoLHAsZCx2LF8seSxnLG0seCxiLHc9e3BvaW50OnIsbGluZVN0YXJ0OmksbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdy5saW5lU3RhcnQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHcubGluZVN0YXJ0PWl9fTtyZXR1cm4gd319ZnVuY3Rpb24gWGkodCl7cmV0dXJuIFZpKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIFZpKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9Zih0WzBdKlRfLHRbMV0qVF8pLFt0WzBdKl8rYSxjLXRbMV0qX119ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD1mLmludmVydCgodFswXS1hKS9fLChjLXRbMV0pL18pLHQmJlt0WzBdKk1fLHRbMV0qTV9dfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gdD11KHQsbiksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBpKCl7Zj1HXyhzPXRpKGIsdyxNKSx1KTt2YXIgdD11KG0seCk7cmV0dXJuIGE9eS10WzBdKl8sYz1nK3RbMV0qXyxvKCl9ZnVuY3Rpb24gbygpe3JldHVybiBkPXY9bnVsbCxufXZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF89MTUwLHk9NDgwLGc9MjUwLG09MCx4PTAsYj0wLHc9MCxNPTAsVD1udWxsLE49V3ksaz1udWxsLFM9VHksRT0uNSxBPVF5KHIsRSk7cmV0dXJuIG4uc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBkJiZ2PT09dD9kOmQ9S3koTihzLEEoUyh2PXQpKSkpfSxuLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj0rdD8keShUPXQqVF8sNipUXyk6KFQ9bnVsbCxXeSksbygpKTpUKk1ffSxuLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9bnVsbD09dD8oaz1sPWg9cD1udWxsLFR5KTpjaShrPSt0WzBdWzBdLGw9K3RbMF1bMV0saD0rdFsxXVswXSxwPSt0WzFdWzFdKSxvKCkpOm51bGw9PWs/bnVsbDpbW2ssbF0sW2gscF1dfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPSt0LGkoKSk6X30sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3RbMF0sZz0rdFsxXSxpKCkpOlt5LGddfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10WzBdJTM2MCpUXyx4PXRbMV0lMzYwKlRfLGkoKSk6W20qTV8seCpNX119LG4ucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXRbMF0lMzYwKlRfLHc9dFsxXSUzNjAqVF8sTT10Lmxlbmd0aD4yP3RbMl0lMzYwKlRfOjAsaSgpKTpbYipNXyx3Kk1fLE0qTV9dfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1ReShyLEU9dCp0KSxvKCkpOkxfKEUpfSxuLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiBZaShuLHQsZSl9LG4uZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBCaShuLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbi5pbnZlcnQ9dS5pbnZlcnQmJmUsaSgpfX1mdW5jdGlvbiBXaSh0KXt2YXIgbj0wLGU9bV8vMyxyPVZpKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpUXyxlPXRbMV0qVF8pOltuKk1fLGUqTV9dfSxpfWZ1bmN0aW9uICRpKHQpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm5bdCplLFJfKG4pL2VdfXZhciBlPUVfKHQpO3JldHVybiBuLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0L2UsX3IobiplKV19LG59ZnVuY3Rpb24gWmkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9TF8oby0yKmkqUl8obikpL2k7cmV0dXJuW2UqUl8odCo9aSksdS1lKkVfKHQpXX12YXIgcj1SXyh0KSxpPShyK1JfKG4pKS8yO2lmKE5fKGkpPHlfKXJldHVybiAkaSh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PUxfKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltTXyh0LE5fKGUpKS9pKnFfKGUpLF9yKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gR2kodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPS0xOysraTxuOyl0W2ldLnBvaW50KGUscil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25FbmQoKX19fWZ1bmN0aW9uIEppKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUVfKG4pLGk9RV8oZSksbz10KHIqaSk7cmV0dXJuW28qaSpSXyhuKSxvKlJfKGUpXX19ZnVuY3Rpb24gUWkodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9TF8obipuK2UqZSksaT10KHIpLG89Ul8oaSksdT1FXyhpKTtyZXR1cm5bU18obipvLHIqdSksX3IociYmZSpvL3IpXX19ZnVuY3Rpb24gS2kodCxuKXtyZXR1cm5bdCx6XyhVXygoeF8rbikvMikpXX1mdW5jdGlvbiB0byh0KXt2YXIgbixlPVhpKHQpLHI9ZS5zY2FsZSxpPWUudHJhbnNsYXRlLG89ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4mJmUuY2xpcEV4dGVudChudWxsKSxlKTpyKCl9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLG4mJmUuY2xpcEV4dGVudChudWxsKSxlKTppKCl9LGUuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbj9udWxsOm8oKTtpZihuPW51bGw9PXQpe3ZhciB1PW1fKnIoKSxhPWkoKTt0PVtbYVswXS11LGFbMV0tdV0sW2FbMF0rdSxhWzFdK3VdXX1yZXR1cm4gbyh0KSxlfSxlLmNsaXBFeHRlbnQobnVsbCl9ZnVuY3Rpb24gbm8odCl7cmV0dXJuIFVfKCh4Xyt0KS8yKX1mdW5jdGlvbiBlbyh0LG4pe2Z1bmN0aW9uIGUodCxuKXtvPjA/bjwteF8reV8mJihuPS14Xyt5Xyk6bj54Xy15XyYmKG49eF8teV8pO3ZhciBlPW8vUF8obm8obiksaSk7cmV0dXJuW2UqUl8oaSp0KSxvLWUqRV8oaSp0KV19dmFyIHI9RV8odCksaT10PT09bj9SXyh0KTp6XyhyL0VfKG4pKS96XyhubyhuKS9ubyh0KSksbz1yKlBfKG5vKHQpLGkpL2k7cmV0dXJuIGk/KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uLHI9cV8oaSkqTF8odCp0K2UqZSk7cmV0dXJuW1NfKHQsTl8oZSkpL2kqcV8oZSksMiprXyhQXyhvL3IsMS9pKSkteF9dfSxlKTpLaX1mdW5jdGlvbiBybyh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIGlvKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPW8tbixyPWkqdDtyZXR1cm5bZSpSXyhyKSxvLWUqRV8ocildfXZhciByPUVfKHQpLGk9dD09PW4/Ul8odCk6KHItRV8obikpLyhuLXQpLG89ci9pK3Q7cmV0dXJuIE5fKGkpPHlfP3JvOihlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bU18odCxOXyhlKSkvaSpxXyhlKSxvLXFfKGkpKkxfKHQqdCtlKmUpXX0sZSl9ZnVuY3Rpb24gb28odCxuKXt2YXIgZT1FXyhuKSxyPUVfKHQpKmU7cmV0dXJuW2UqUl8odCkvcixSXyhuKS9yXX1mdW5jdGlvbiB1byh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/VHk6Rmkoe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIGFvKHQsbil7cmV0dXJuW0VfKG4pKlJfKHQpLFJfKG4pXX1mdW5jdGlvbiBjbyh0LG4pe3ZhciBlPUVfKG4pLHI9MStFXyh0KSplO3JldHVybltlKlJfKHQpL3IsUl8obikvcl19ZnVuY3Rpb24gc28odCxuKXtyZXR1cm5bel8oVV8oKHhfK24pLzIpKSwtdF19ZnVuY3Rpb24gZm8odCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHQucmVkdWNlKGhvLDApL3QubGVuZ3RofWZ1bmN0aW9uIGhvKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIHBvKHQpe3JldHVybiAxK3QucmVkdWNlKHZvLDApfWZ1bmN0aW9uIHZvKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiBfbyh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9ZnVuY3Rpb24geW8odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fWZ1bmN0aW9uIGdvKHQpe3ZhciBuPTAsZT10LmNoaWxkcmVuLHI9ZSYmZS5sZW5ndGg7aWYocilmb3IoOy0tcj49MDspbis9ZVtyXS52YWx1ZTtlbHNlIG49MTt0LnZhbHVlPW59ZnVuY3Rpb24gbW8odCxuKXtpZih0PT09bilyZXR1cm4gdDt2YXIgZT10LmFuY2VzdG9ycygpLHI9bi5hbmNlc3RvcnMoKSxpPW51bGw7Zm9yKHQ9ZS5wb3AoKSxuPXIucG9wKCk7dD09PW47KWk9dCx0PWUucG9wKCksbj1yLnBvcCgpO3JldHVybiBpfWZ1bmN0aW9uIHhvKHQsbil7dmFyIGUscixpLG8sdSxhPW5ldyBObyh0KSxjPSt0LnZhbHVlJiYoYS52YWx1ZT10LnZhbHVlKSxzPVthXTtmb3IobnVsbD09biYmKG49d28pO2U9cy5wb3AoKTspaWYoYyYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKHU9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheSh1KSxvPXUtMTtvPj0wOy0tbylzLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBObyhpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gYS5lYWNoQmVmb3JlKFRvKX1mdW5jdGlvbiBibygpe3JldHVybiB4byh0aGlzKS5lYWNoQmVmb3JlKE1vKX1mdW5jdGlvbiB3byh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBNbyh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gVG8odCl7dmFyIG49MDtkbyB0LmhlaWdodD1uO3doaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBObyh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiBrbyh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBTbyh0LG4pe3ZhciBlPW4ueC10Lngscj1uLnktdC55LGk9dC5yLW4ucjtyZXR1cm4gaSppKzFlLTY+ZSplK3Iqcn1mdW5jdGlvbiBFbyh0LG4pe3ZhciBlLHIsaSxvPW51bGwsdT10LmhlYWQ7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDE6ZT1BbyhuWzBdKTticmVhaztjYXNlIDI6ZT1DbyhuWzBdLG5bMV0pO2JyZWFrO2Nhc2UgMzplPXpvKG5bMF0sblsxXSxuWzJdKX1mb3IoO3U7KWk9dS5fLHI9dS5uZXh0LGUmJlNvKGUsaSk/bz11OihvPyh0LnRhaWw9byxvLm5leHQ9bnVsbCk6dC5oZWFkPXQudGFpbD1udWxsLG4ucHVzaChpKSxlPUVvKHQsbiksbi5wb3AoKSx0LmhlYWQ/KHUubmV4dD10LmhlYWQsdC5oZWFkPXUpOih1Lm5leHQ9bnVsbCx0LmhlYWQ9dC50YWlsPXUpLG89dC50YWlsLG8ubmV4dD1yKSx1PXI7cmV0dXJuIHQudGFpbD1vLGV9ZnVuY3Rpb24gQW8odCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX1mdW5jdGlvbiBDbyh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCx1PW4ueSxhPW4ucixjPW8tZSxzPXUtcixmPWEtaSxsPU1hdGguc3FydChjKmMrcypzKTtyZXR1cm57eDooZStvK2MvbCpmKS8yLHk6KHIrdStzL2wqZikvMixyOihsK2krYSkvMn19ZnVuY3Rpb24gem8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucix1PW4ueCxhPW4ueSxjPW4ucixzPWUueCxmPWUueSxsPWUucixoPTIqKHItdSkscD0yKihpLWEpLGQ9MiooYy1vKSx2PXIqcitpKmktbypvLXUqdS1hKmErYypjLF89Miooci1zKSx5PTIqKGktZiksZz0yKihsLW8pLG09cipyK2kqaS1vKm8tcypzLWYqZitsKmwseD1fKnAtaCp5LGI9KHAqbS15KnYpL3gtcix3PSh5KmQtcCpnKS94LE09KF8qdi1oKm0pL3gtaSxUPShoKmctXypkKS94LE49dyp3K1QqVC0xLGs9MiooYip3K00qVCtvKSxTPWIqYitNKk0tbypvLEU9KC1rLU1hdGguc3FydChrKmstNCpOKlMpKS8oMipOKTtyZXR1cm57eDpiK3cqRStyLHk6TStUKkUraSxyOkV9fWZ1bmN0aW9uIFBvKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz1uLnIrZS5yLHU9dC5yK2UucixhPW4ueC1yLGM9bi55LWkscz1hKmErYypjO2lmKHMpe3ZhciBmPS41KygodSo9dSktKG8qPW8pKS8oMipzKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoodStzKS0odS09cykqdS1vKm8pKS8oMipzKTtlLng9citmKmErbCpjLGUueT1pK2YqYy1sKmF9ZWxzZSBlLng9cit1LGUueT1pfWZ1bmN0aW9uIFJvKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnIrbi5yO3JldHVybiBpKmktMWUtNj5lKmUrcipyfWZ1bmN0aW9uIHFvKHQsbil7Zm9yKHZhciBlPXQuXy5yO3QhPT1uOyllKz0yKih0PXQubmV4dCkuXy5yO3JldHVybiBlLW4uXy5yfWZ1bmN0aW9uIExvKHQsbixlKXt2YXIgcj10LngtbixpPXQueS1lO3JldHVybiByKnIraSppfWZ1bmN0aW9uIFVvKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBEbyh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpO2lmKG49dFswXSxuLng9MCxuLnk9MCwhKGk+MSkpcmV0dXJuIG4ucjtpZihlPXRbMV0sbi54PS1lLnIsZS54PW4ucixlLnk9MCwhKGk+MikpcmV0dXJuIG4ucitlLnI7UG8oZSxuLHI9dFsyXSk7dmFyIG8sdSxhLGMscyxmLGwsaD1uLnIqbi5yLHA9ZS5yKmUucixkPXIucipyLnIsdj1oK3ArZCxfPWgqbi54K3AqZS54K2Qqci54LHk9aCpuLnkrcCplLnkrZCpyLnk7bj1uZXcgVW8obiksZT1uZXcgVW8oZSkscj1uZXcgVW8ociksbi5uZXh0PXIucHJldmlvdXM9ZSxlLm5leHQ9bi5wcmV2aW91cz1yLHIubmV4dD1lLnByZXZpb3VzPW47dDpmb3IoYT0zO2E8aTsrK2Epe1BvKG4uXyxlLl8scj10W2FdKSxyPW5ldyBVbyhyKSxjPWUubmV4dCxzPW4ucHJldmlvdXMsZj1lLl8ucixsPW4uXy5yO2RvIGlmKGY8PWwpe2lmKFJvKGMuXyxyLl8pKXtmK24uXy5yK2UuXy5yPnFvKGMsZSk/bj1jOmU9YyxuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS1hO2NvbnRpbnVlIHR9Zis9Yy5fLnIsYz1jLm5leHR9ZWxzZXtpZihSbyhzLl8sci5fKSl7cW8obixzKT5sK24uXy5yK2UuXy5yP249czplPXMsbi5uZXh0PWUsZS5wcmV2aW91cz1uLC0tYTtjb250aW51ZSB0fWwrPXMuXy5yLHM9cy5wcmV2aW91c313aGlsZShjIT09cy5uZXh0KTtmb3Ioci5wcmV2aW91cz1uLHIubmV4dD1lLG4ubmV4dD1lLnByZXZpb3VzPWU9cix2Kz1kPXIuXy5yKnIuXy5yLF8rPWQqci5fLngseSs9ZCpyLl8ueSxoPUxvKG4uXyxvPV8vdix1PXkvdik7KHI9ci5uZXh0KSE9PWU7KShkPUxvKHIuXyxvLHUpKTxoJiYobj1yLGg9ZCk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1BZyhuKSxhPTA7YTxpOysrYSluPXRbYV0sbi54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBPbyh0KXtyZXR1cm4gbnVsbD09dD9udWxsOkZvKHQpfWZ1bmN0aW9uIEZvKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBJbygpe3JldHVybiAwfWZ1bmN0aW9uIFlvKHQpe3JldHVybiBNYXRoLnNxcnQodC52YWx1ZSl9ZnVuY3Rpb24gQm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fChuLnI9TWF0aC5tYXgoMCwrdChuKXx8MCkpfX1mdW5jdGlvbiBqbyh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtpZihyPWUuY2hpbGRyZW4pe3ZhciByLGksbyx1PXIubGVuZ3RoLGE9dChlKSpufHwwO2lmKGEpZm9yKGk9MDtpPHU7KytpKXJbaV0ucis9YTtpZihvPURvKHIpLGEpZm9yKGk9MDtpPHU7KytpKXJbaV0uci09YTtlLnI9bythfX19ZnVuY3Rpb24gSG8odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW4ucGFyZW50O24ucio9dCxlJiYobi54PWUueCt0Km4ueCxuLnk9ZS55K3Qqbi55KX19ZnVuY3Rpb24gWG8odCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gVm8odCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gV28odCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gJG8odCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBabyh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIEdvKHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIEpvKHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspbj1pW29dLG4ueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfWZ1bmN0aW9uIFFvKHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIEtvKHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gdHUodCl7Zm9yKHZhciBuLGUscixpLG8sdT1uZXcgS28odCwwKSxhPVt1XTtuPWEucG9wKCk7KWlmKHI9bi5fLmNoaWxkcmVuKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShvPXIubGVuZ3RoKSxpPW8tMTtpPj0wOy0taSlhLnB1c2goZT1uLmNoaWxkcmVuW2ldPW5ldyBLbyhyW2ldLGkpKSxlLnBhcmVudD1uO3JldHVybih1LnBhcmVudD1uZXcgS28obnVsbCwwKSkuY2hpbGRyZW49W3VdLHV9ZnVuY3Rpb24gbnUodCxuLGUscixpLG8pe2Zvcih2YXIgdSxhLGMscyxmLGwsaCxwLGQsdixfLHk9W10sZz1uLmNoaWxkcmVuLG09MCx4PTAsYj1nLmxlbmd0aCx3PW4udmFsdWU7bTxiOyl7Yz1pLWUscz1vLXI7ZG8gZj1nW3grK10udmFsdWU7d2hpbGUoIWYmJng8Yik7Zm9yKGw9aD1mLHY9TWF0aC5tYXgocy9jLGMvcykvKHcqdCksXz1mKmYqdixkPU1hdGgubWF4KGgvXyxfL2wpO3g8YjsrK3gpe2lmKGYrPWE9Z1t4XS52YWx1ZSxhPGwmJihsPWEpLGE+aCYmKGg9YSksXz1mKmYqdixwPU1hdGgubWF4KGgvXyxfL2wpLHA+ZCl7Zi09YTticmVha31kPXB9eS5wdXNoKHU9e3ZhbHVlOmYsZGljZTpjPHMsY2hpbGRyZW46Zy5zbGljZShtLHgpfSksdS5kaWNlP3FnKHUsZSxyLGksdz9yKz1zKmYvdzpvKTpZZyh1LGUscix3P2UrPWMqZi93Omksbyksdy09ZixtPXh9cmV0dXJuIHl9ZnVuY3Rpb24gZXUodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gcnUodCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9WzAsMV0scj0yLGk9MjtpPG47KytpKXtmb3IoO3I+MSYmR2codFtlW3ItMl1dLHRbZVtyLTFdXSx0W2ldKTw9MDspLS1yO2VbcisrXT1pfXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gaXUodCl7aWYoISh0Pj0xKSl0aHJvdyBuZXcgRXJyb3I7dGhpcy5fc2l6ZT10LHRoaXMuX2NhbGw9dGhpcy5fZXJyb3I9bnVsbCx0aGlzLl90YXNrcz1bXSx0aGlzLl9kYXRhPVtdLHRoaXMuX3dhaXRpbmc9dGhpcy5fYWN0aXZlPXRoaXMuX2VuZGVkPXRoaXMuX3N0YXJ0PTB9ZnVuY3Rpb24gb3UodCl7aWYoIXQuX3N0YXJ0KXRyeXt1dSh0KX1jYXRjaChuKXtpZih0Ll90YXNrc1t0Ll9lbmRlZCt0Ll9hY3RpdmUtMV0pY3UodCxuKTtlbHNlIGlmKCF0Ll9kYXRhKXRocm93IG59fWZ1bmN0aW9uIHV1KHQpe2Zvcig7dC5fc3RhcnQ9dC5fd2FpdGluZyYmdC5fYWN0aXZlPHQuX3NpemU7KXt2YXIgbj10Ll9lbmRlZCt0Ll9hY3RpdmUsZT10Ll90YXNrc1tuXSxyPWUubGVuZ3RoLTEsaT1lW3JdO2Vbcl09YXUodCxuKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsZT1pLmFwcGx5KG51bGwsZSksdC5fdGFza3Nbbl0mJih0Ll90YXNrc1tuXT1lfHxubSl9fWZ1bmN0aW9uIGF1KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dC5fdGFza3Nbbl0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW25dPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1lP2N1KHQsZSk6KHQuX2RhdGFbbl09cix0Ll93YWl0aW5nP291KHQpOnN1KHQpKSkpfX1mdW5jdGlvbiBjdSh0LG4pe3ZhciBlLHI9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1uLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0tcj49MDspaWYoKGU9dC5fdGFza3Nbcl0pJiYodC5fdGFza3Nbcl09bnVsbCxlLmFib3J0KSl0cnl7ZS5hYm9ydCgpfWNhdGNoKHQpe310Ll9hY3RpdmU9TmFOLHN1KHQpfWZ1bmN0aW9uIHN1KHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBuPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixuKX19ZnVuY3Rpb24gZnUodCl7cmV0dXJuIG5ldyBpdShhcmd1bWVudHMubGVuZ3RoPyt0OjEvMCl9ZnVuY3Rpb24gbHUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dChudWxsPT1uP2U6bnVsbCl9fWZ1bmN0aW9uIGh1KHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcHUodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGR1KHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09eG0pcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPUllKCkscj1bXSxpPXhtO3JldHVybiB0PW51bGw9PXQ/W106bW0uY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT1JZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1tbS5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGR1KCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gdnUoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxsPXVbci0wXSxoPXVbMS1yXTtuPShoLWwpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksbCs9KGgtbC1uKih0LWMpKSpmLGU9biooMS1jKSxhJiYobD1NYXRoLnJvdW5kKGwpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9SXModCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBsK24qdH0pO3JldHVybiBvKHI/cC5yZXZlcnNlKCk6cCl9dmFyIG4sZSxyPWR1KCkudW5rbm93bih2b2lkIDApLGk9ci5kb21haW4sbz1yLnJhbmdlLHU9WzAsMV0sYT0hMSxjPTAscz0wLGY9LjU7cmV0dXJuIGRlbGV0ZSByLnVua25vd24sci5kb21haW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkobiksdCgpKTppKCl9LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9WytuWzBdLCtuWzFdXSx0KCkpOnUuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiB1PVsrblswXSwrblsxXV0sYT0hMCx0KCl9LHIuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuc3RlcD1mdW5jdGlvbigpe3JldHVybiBufSxyLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhbix0KCkpOmF9LHIucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1zPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdJbm5lcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Y30sci5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOnN9LHIuYWxpZ249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmZ9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB2dSgpLmRvbWFpbihpKCkpLnJhbmdlKHUpLnJvdW5kKGEpLnBhZGRpbmdJbm5lcihjKS5wYWRkaW5nT3V0ZXIocykuYWxpZ24oZil9LHQoKX1mdW5jdGlvbiBfdSh0KXt2YXIgbj10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiBfdShuKCkpfSx0fWZ1bmN0aW9uIHl1KCl7cmV0dXJuIF91KHZ1KCkucGFkZGluZ0lubmVyKDEpKX1mdW5jdGlvbiBndSh0LG4pe3JldHVybihuLT10PSt0KT9mdW5jdGlvbihlKXtyZXR1cm4oZS10KS9ufTpibShuKX1mdW5jdGlvbiBtdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1uPzA6dD49ZT8xOnIodCl9fX1mdW5jdGlvbiB4dSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX1mdW5jdGlvbiBidSh0LG4sZSxyKXt2YXIgaT10WzBdLG89dFsxXSx1PW5bMF0sYT1uWzFdO3JldHVybiBvPGk/KGk9ZShvLGkpLHU9cihhLHUpKTooaT1lKGksbyksdT1yKHUsYSkpLGZ1bmN0aW9uKHQpe3JldHVybiB1KGkodCkpfX1mdW5jdGlvbiB3dSh0LG4sZSxyKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxuLmxlbmd0aCktMSxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKSxhPS0xO2Zvcih0W2ldPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksbj1uLnNsaWNlKCkucmV2ZXJzZSgpKTsrK2E8aTspb1thXT1lKHRbYV0sdFthKzFdKSx1W2FdPXIoblthXSxuW2ErMV0pO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1Fcyh0LG4sMSxpKS0xO3JldHVybiB1W2VdKG9bZV0obikpfX1mdW5jdGlvbiBNdSh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBUdSh0LG4pe2Z1bmN0aW9uIGUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxjLmxlbmd0aCk+Mj93dTpidSxvPXU9bnVsbCxyfWZ1bmN0aW9uIHIobil7cmV0dXJuKG98fChvPWkoYSxjLGY/bXUodCk6dCxzKSkpKCtuKX12YXIgaSxvLHUsYT1NbSxjPU1tLHM9bWgsZj0hMTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHV8fCh1PWkoYyxhLGd1LGY/eHUobik6bikpKSgrdCl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWdtLmNhbGwodCx3bSksZSgpKTphLnNsaWNlKCl9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bW0uY2FsbCh0KSxlKCkpOmMuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBjPW1tLmNhbGwodCkscz14aCxlKCl9LHIuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGUoKSk6Zn0sci5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUoKSk6c30sZSgpfWZ1bmN0aW9uIE51KHQpe3ZhciBuPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBlPW4oKTtyZXR1cm4gSHMoZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBUbShuKCksdCxlKX0sdC5uaWNlPWZ1bmN0aW9uKHIpe3ZhciBpPW4oKSxvPWkubGVuZ3RoLTEsdT1udWxsPT1yPzEwOnIsYT1pWzBdLGM9aVtvXSxzPWUoYSxjLHUpO3JldHVybiBzJiYocz1lKE1hdGguZmxvb3IoYS9zKSpzLE1hdGguY2VpbChjL3MpKnMsdSksaVswXT1NYXRoLmZsb29yKGEvcykqcyxpW29dPU1hdGguY2VpbChjL3MpKnMsbihpKSksdH0sdH1mdW5jdGlvbiBrdSgpe3ZhciB0PVR1KGd1LGRoKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE11KHQsa3UoKSl9LE51KHQpfWZ1bmN0aW9uIFN1KCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4rdH12YXIgbj1bMCwxXTtyZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWdtLmNhbGwoZSx3bSksdCk6bi5zbGljZSgpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gU3UoKS5kb21haW4obil9LE51KHQpfWZ1bmN0aW9uIEV1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06Ym0obil9ZnVuY3Rpb24gQXUodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIEN1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiB6dSh0KXtyZXR1cm4gMTA9PT10P0N1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFB1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBSdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBxdSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz1QdShpKSx1PXp1KGkpLHIoKVswXTwwJiYobz1SdShvKSx1PVJ1KHUpKSxlfXZhciBlPVR1KEV1LEF1KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1QdSgxMCksdT16dSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKGg9YSxhPWMsYz1oKTt2YXIgcyxmLGwsaD1vKGEpLHA9byhjKSxkPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJnAtaDxkKXtpZihoPU1hdGgucm91bmQoaCktMSxwPU1hdGgucm91bmQocCkrMSxhPjApe2Zvcig7aDxwOysraClmb3IoZj0xLHM9dShoKTtmPGk7KytmKWlmKGw9cypmLCEobDxhKSl7aWYobD5jKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8cDsrK2gpZm9yKGY9aS0xLHM9dShoKTtmPj0xOy0tZilpZihsPXMqZiwhKGw8YSkpe2lmKGw+YylicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1IcyhoLHAsTWF0aC5taW4ocC1oLGQpKS5tYXAodSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgYT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC91KE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PWE/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKE5tKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBNdShlLHF1KCkuYmFzZShpKSl9LGV9ZnVuY3Rpb24gTHUodCxuKXtyZXR1cm4gdDwwPy1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfWZ1bmN0aW9uIFV1KCl7ZnVuY3Rpb24gdCh0LG4pe3JldHVybihuPUx1KG4sZSktKHQ9THUodCxlKSkpP2Z1bmN0aW9uKHIpe3JldHVybihMdShyLGUpLXQpL259OmJtKG4pfWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gbj1MdShuLGUpLSh0PUx1KHQsZSkpLGZ1bmN0aW9uKHIpe3JldHVybiBMdSh0K24qciwxL2UpfX12YXIgZT0xLHI9VHUodCxuKSxpPXIuZG9tYWluO3JldHVybiByLmV4cG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkoaSgpKSk6ZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE11KHIsVXUoKS5leHBvbmVudChlKSl9LE51KHIpfWZ1bmN0aW9uIER1KCl7cmV0dXJuIFV1KCkuZXhwb25lbnQoLjUpfWZ1bmN0aW9uIE91KCl7ZnVuY3Rpb24gdCgpe3ZhciB0PTAsbz1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoby0xKTsrK3Q8bzspaVt0LTFdPVdzKGUsdC9vKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltFcyhpLHQpXX12YXIgZT1bXSxyPVtdLGk9W107cmV0dXJuIG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP2lbbi0xXTplWzBdLG48aS5sZW5ndGg/aVtuXTplW2UubGVuZ3RoLTFdXX0sbi5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz1uLmxlbmd0aDtpPG87KytpKXI9bltpXSxudWxsPT1yfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQoTnMpLHQoKX0sbi5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tbS5jYWxsKG4pLHQoKSk6ci5zbGljZSgpfSxuLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBpLnNsaWNlKCl9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBPdSgpLmRvbWFpbihlKS5yYW5nZShyKX0sbn1mdW5jdGlvbiBGdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtFcyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1tbS5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEZ1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sTnUodCl9ZnVuY3Rpb24gSXUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbRXMobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW1tLmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bW0uY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBJdSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBZdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkbyB1LnB1c2gobmV3IERhdGUoK2UpKTt3aGlsZShuKGUsbyksdChlKSxlPHIpO3JldHVybiB1fSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gWXUoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIGttLnNldFRpbWUoK24pLFNtLnNldFRpbWUoK3IpLHQoa20pLHQoU20pLE1hdGguZmxvb3IoZShrbSxTbSkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT09MH0pOmk6bnVsbH0pLGl9ZnVuY3Rpb24gQnUodCl7cmV0dXJuIFl1KGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqem0pL3FtfSl9ZnVuY3Rpb24ganUodCl7cmV0dXJuIFl1KGZ1bmN0aW9uKG4pe24uc2V0VVRDRGF0ZShuLmdldFVUQ0RhdGUoKS0obi5nZXRVVENEYXkoKSs3LXQpJTcpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvcW19KX1mdW5jdGlvbiBIdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKTtyZXR1cm4gbi5zZXRGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCl9ZnVuY3Rpb24gWHUodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBuLnNldFVUQ0Z1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gVnUodCl7cmV0dXJue3k6dCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MH19ZnVuY3Rpb24gV3UodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcixpLG8sdT1bXSxhPS0xLGM9MCxzPXQubGVuZ3RoO2ZvcihlIGluc3RhbmNlb2YgRGF0ZXx8KGU9bmV3IERhdGUoK2UpKTsrK2E8czspMzc9PT10LmNoYXJDb2RlQXQoYSkmJih1LnB1c2godC5zbGljZShjLGEpKSxudWxsIT0oaT1QeFtyPXQuY2hhckF0KCsrYSldKT9yPXQuY2hhckF0KCsrYSk6aT0iZSI9PT1yPyIgIjoiMCIsKG89bltyXSkmJihyPW8oZSxpKSksdS5wdXNoKHIpLGM9YSsxKTtyZXR1cm4gdS5wdXNoKHQuc2xpY2UoYyxhKSksdS5qb2luKCIiKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgaT1WdSgxOTAwKSxvPXIoaSx0LGUrPSIiLDApO2lmKG8hPWUubGVuZ3RoKXJldHVybiBudWxsO2lmKCJwImluIGkmJihpLkg9aS5IJTEyKzEyKmkucCksIlciaW4gaXx8IlUiaW4gaSl7InciaW4gaXx8KGkudz0iVyJpbiBpPzE6MCk7dmFyIHU9IloiaW4gaT9YdShWdShpLnkpKS5nZXRVVENEYXkoKTpuKFZ1KGkueSkpLmdldERheSgpO2kubT0wLGkuZD0iVyJpbiBpPyhpLncrNiklNys3KmkuVy0odSs1KSU3Omkudys3KmkuVS0odSs2KSU3fXJldHVybiJaImluIGk/KGkuSCs9aS5aLzEwMHwwLGkuTSs9aS5aJTEwMCxYdShpKSk6bihpKX19ZnVuY3Rpb24gcih0LG4sZSxyKXtmb3IodmFyIGksbyx1PTAsYT1uLmxlbmd0aCxjPWUubGVuZ3RoO3U8YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoaT1uLmNoYXJDb2RlQXQodSsrKSwzNz09PWkpe2lmKGk9bi5jaGFyQXQodSsrKSxvPUJbaSBpbiBQeD9uLmNoYXJBdCh1KyspOmldLCFvfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIGkodCxuLGUpe3ZhciByPUMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXpbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1xLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1MW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdSh0LG4sZSl7dmFyIHI9UC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9UltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xOwp9ZnVuY3Rpb24gYSh0LG4sZSl7dmFyIHI9Ty5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09RltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGModCxuLGUpe3ZhciByPVUuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPURbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzKHQsbixlKXtyZXR1cm4gcih0LHcsbixlKX1mdW5jdGlvbiBmKHQsbixlKXtyZXR1cm4gcih0LE0sbixlKX1mdW5jdGlvbiBsKHQsbixlKXtyZXR1cm4gcih0LFQsbixlKX1mdW5jdGlvbiBoKHQpe3JldHVybiBTW3QuZ2V0RGF5KCldfWZ1bmN0aW9uIHAodCl7cmV0dXJuIGtbdC5nZXREYXkoKV19ZnVuY3Rpb24gZCh0KXtyZXR1cm4gQVt0LmdldE1vbnRoKCldfWZ1bmN0aW9uIHYodCl7cmV0dXJuIEVbdC5nZXRNb250aCgpXX1mdW5jdGlvbiBfKHQpe3JldHVybiBOWysodC5nZXRIb3VycygpPj0xMildfWZ1bmN0aW9uIHkodCl7cmV0dXJuIFNbdC5nZXRVVENEYXkoKV19ZnVuY3Rpb24gZyh0KXtyZXR1cm4ga1t0LmdldFVUQ0RheSgpXX1mdW5jdGlvbiBtKHQpe3JldHVybiBBW3QuZ2V0VVRDTW9udGgoKV19ZnVuY3Rpb24geCh0KXtyZXR1cm4gRVt0LmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIGIodCl7cmV0dXJuIE5bKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19dmFyIHc9dC5kYXRlVGltZSxNPXQuZGF0ZSxUPXQudGltZSxOPXQucGVyaW9kcyxrPXQuZGF5cyxTPXQuc2hvcnREYXlzLEU9dC5tb250aHMsQT10LnNob3J0TW9udGhzLEM9R3UoTiksej1KdShOKSxQPUd1KGspLFI9SnUoaykscT1HdShTKSxMPUp1KFMpLFU9R3UoRSksRD1KdShFKSxPPUd1KEEpLEY9SnUoQSksST17YTpoLEE6cCxiOmQsQjp2LGM6bnVsbCxkOmhhLGU6aGEsSDpwYSxJOmRhLGo6dmEsTDpfYSxtOnlhLE06Z2EscDpfLFM6bWEsVTp4YSx3OmJhLFc6d2EseDpudWxsLFg6bnVsbCx5Ok1hLFk6VGEsWjpOYSwiJSI6SWF9LFk9e2E6eSxBOmcsYjptLEI6eCxjOm51bGwsZDprYSxlOmthLEg6U2EsSTpFYSxqOkFhLEw6Q2EsbTp6YSxNOlBhLHA6YixTOlJhLFU6cWEsdzpMYSxXOlVhLHg6bnVsbCxYOm51bGwseTpEYSxZOk9hLFo6RmEsIiUiOklhfSxCPXthOm8sQTp1LGI6YSxCOmMsYzpzLGQ6b2EsZTpvYSxIOmFhLEk6YWEsajp1YSxMOmZhLG06aWEsTTpjYSxwOmksUzpzYSxVOkt1LHc6UXUsVzp0YSx4OmYsWDpsLHk6ZWEsWTpuYSxaOnJhLCIlIjpsYX07cmV0dXJuIEkueD1uKE0sSSksSS5YPW4oVCxJKSxJLmM9bih3LEkpLFkueD1uKE0sWSksWS5YPW4oVCxZKSxZLmM9bih3LFkpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixJKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQrPSIiLEh1KTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixZKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQsWHUpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX1mdW5jdGlvbiAkdSh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBadSh0KXtyZXR1cm4gdC5yZXBsYWNlKEx4LCJcXCQmIil9ZnVuY3Rpb24gR3UodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKFp1KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gSnUodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gUXUodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS3UodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0YSh0LG4sZSl7dmFyIHI9UnguZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5hKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaWEodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9hKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxhKHQsbixlKXt2YXIgcj1xeC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhhKHQsbil7cmV0dXJuICR1KHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gcGEodCxuKXtyZXR1cm4gJHUodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gZGEodCxuKXtyZXR1cm4gJHUodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIHZhKHQsbil7cmV0dXJuICR1KDErWW0uY291bnQob3godCksdCksbiwzKX1mdW5jdGlvbiBfYSh0LG4pe3JldHVybiAkdSh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24geWEodCxuKXtyZXR1cm4gJHUodC5nZXRNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBnYSh0LG4pe3JldHVybiAkdSh0LmdldE1pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIG1hKHQsbil7cmV0dXJuICR1KHQuZ2V0U2Vjb25kcygpLG4sMil9ZnVuY3Rpb24geGEodCxuKXtyZXR1cm4gJHUoam0uY291bnQob3godCksdCksbiwyKX1mdW5jdGlvbiBiYSh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiB3YSh0LG4pe3JldHVybiAkdShIbS5jb3VudChveCh0KSx0KSxuLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuICR1KHQuZ2V0RnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBUYSh0LG4pe3JldHVybiAkdSh0LmdldEZ1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gTmEodCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihuPjA/Ii0iOihuKj0tMSwiKyIpKSskdShuLzYwfDAsIjAiLDIpKyR1KG4lNjAsIjAiLDIpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDRGF0ZSgpLG4sMil9ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gJHUodC5nZXRVVENIb3VycygpLG4sMil9ZnVuY3Rpb24gRWEodCxuKXtyZXR1cm4gJHUodC5nZXRVVENIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIEFhKHQsbil7cmV0dXJuICR1KDErbHguY291bnQoQXgodCksdCksbiwzKX1mdW5jdGlvbiBDYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ01pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gJHUodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBQYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFJhKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gcWEodCxuKXtyZXR1cm4gJHUocHguY291bnQoQXgodCksdCksbiwyKX1mdW5jdGlvbiBMYSh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBVYSh0LG4pe3JldHVybiAkdShkeC5jb3VudChBeCh0KSx0KSxuLDIpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBPYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gRmEoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uIElhKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFlhKG4pe3JldHVybiBDeD1XdShuKSx0LnRpbWVGb3JtYXQ9Q3guZm9ybWF0LHQudGltZVBhcnNlPUN4LnBhcnNlLHQudXRjRm9ybWF0PUN4LnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPUN4LnV0Y1BhcnNlLEN4fWZ1bmN0aW9uIEJhKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gamEodCl7dmFyIG49bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKG4pP251bGw6bn1mdW5jdGlvbiBIYSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gVmEodCxuLHIsaSxvLHUsYSxjLHMpe2Z1bmN0aW9uIGYoZSl7cmV0dXJuKGEoZSk8ZT92OnUoZSk8ZT9fOm8oZSk8ZT95OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/bTp4OnQoZSk8ZT9iOncpKGUpfWZ1bmN0aW9uIGwobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIHU9TWF0aC5hYnMoaS1yKS9uLGE9a3MoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodChNLHUpO2E9PT1NLmxlbmd0aD8obz1lKHIvWHgsaS9YeCxuKSxuPXQpOmE/KGE9TVt1L01bYS0xXVsyXTxNW2FdWzJdL3U/YS0xOmFdLG89YVsxXSxuPWFbMF0pOihvPWUocixpLG4pLG49Yyl9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXZhciBoPVR1KGd1LGRoKSxwPWguaW52ZXJ0LGQ9aC5kb21haW4sdj1zKCIuJUwiKSxfPXMoIjolUyIpLHk9cygiJUk6JU0iKSxnPXMoIiVJICVwIiksbT1zKCIlYSAlZCIpLHg9cygiJWIgJWQiKSxiPXMoIiVCIiksdz1zKCIlWSIpLE09W1thLDEsRnhdLFthLDUsNSpGeF0sW2EsMTUsMTUqRnhdLFthLDMwLDMwKkZ4XSxbdSwxLEl4XSxbdSw1LDUqSXhdLFt1LDE1LDE1Kkl4XSxbdSwzMCwzMCpJeF0sW28sMSxZeF0sW28sMywzKll4XSxbbyw2LDYqWXhdLFtvLDEyLDEyKll4XSxbaSwxLEJ4XSxbaSwyLDIqQnhdLFtyLDEsanhdLFtuLDEsSHhdLFtuLDMsMypIeF0sW3QsMSxYeF1dO3JldHVybiBoLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUocCh0KSl9LGguZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2QoZ20uY2FsbCh0LFhhKSk6ZCgpLm1hcChIYSl9LGgudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWQoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLHU9bzxpO3JldHVybiB1JiYoZT1pLGk9byxvPWUpLGU9bCh0LGksbyxuKSxlPWU/ZS5yYW5nZShpLG8rMSk6W10sdT9lLnJldmVyc2UoKTplfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9mOnMobil9LGgubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWQoKTtyZXR1cm4odD1sKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9kKE5tKGUsdCkpOmh9LGguY29weT1mdW5jdGlvbigpe3JldHVybiBNdShoLFZhKHQsbixyLGksbyx1LGEsYyxzKSl9LGh9ZnVuY3Rpb24gV2EodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19ZnVuY3Rpb24gJGEodCl7ZnVuY3Rpb24gbihuKXt2YXIgbz0obi1lKS8oci1lKTtyZXR1cm4gdChpP01hdGgubWF4KDAsTWF0aC5taW4oMSxvKSk6byl9dmFyIGU9MCxyPTEsaT0hMTtyZXR1cm4gbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxuKTpbZSxyXX0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIXQsbik6aX0sbi5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gJGEodCkuZG9tYWluKFtlLHJdKS5jbGFtcChpKX0sTnUobil9ZnVuY3Rpb24gWmEodCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gR2EodCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gSmEodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBRYSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdD49MT9sYjp0PD0tMT8tbGI6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIG5jKHQsbixlLHIsaSxvLHUsYSl7dmFyIGM9ZS10LHM9ci1uLGY9dS1pLGw9YS1vLGg9KGYqKG4tbyktbCoodC1pKSkvKGwqYy1mKnMpO3JldHVyblt0K2gqYyxuK2gqc119ZnVuY3Rpb24gZWModCxuLGUscixpLG8sdSl7dmFyIGE9dC1lLGM9bi1yLHM9KHU/bzotbykvTWF0aC5zcXJ0KGEqYStjKmMpLGY9cypjLGw9LXMqYSxoPXQrZixwPW4rbCxkPWUrZix2PXIrbCxfPShoK2QpLzIseT0ocCt2KS8yLGc9ZC1oLG09di1wLHg9ZypnK20qbSxiPWktbyx3PWgqdi1kKnAsTT0obTwwPy0xOjEpKk1hdGguc3FydChNYXRoLm1heCgwLGIqYip4LXcqdykpLFQ9KHcqbS1nKk0pL3gsTj0oLXcqZy1tKk0pL3gsaz0odyptK2cqTSkveCxTPSgtdypnK20qTSkveCxFPVQtXyxBPU4teSxDPWstXyx6PVMteTtyZXR1cm4gRSpFK0EqQT5DKkMreip6JiYoVD1rLE49Uykse2N4OlQsY3k6Tix4MDE6LWYseTAxOi1sLHgxMTpUKihpL2ItMSkseTExOk4qKGkvYi0xKX19ZnVuY3Rpb24gcmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGljKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG9jKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHVjKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gYWModCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHVjKHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY2ModCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oYWModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc2ModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIGZjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBsYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gaGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHBjKHQsbil7dGhpcy5fYmFzaXM9bmV3IGZjKHQpLHRoaXMuX2JldGE9bn1mdW5jdGlvbiBkYyh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIHZjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBfYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24geWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIGdjKHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsdT10Ll95MjtpZih0Ll9sMDFfYT5zYil7dmFyIGE9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ociphLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSphLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+c2Ipe3ZhciBzPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qcyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2YsdT0odSpzK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvZn10Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sdSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gbWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiB4Yyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIGJjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gd2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE1jKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBUYyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksdT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLGE9KG8qaSt1KnIpLyhyK2kpO3JldHVybihNYyhvKStNYyh1KSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnModSksLjUqTWF0aC5hYnMoYSkpfHwwfWZ1bmN0aW9uIE5jKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBrYyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLHU9dC5feTEsYT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK2EsaSthKm4sby1hLHUtYSplLG8sdSl9ZnVuY3Rpb24gU2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVjKHQpe3RoaXMuX2NvbnRleHQ9bmV3IEFjKHQpfWZ1bmN0aW9uIEFjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gbmV3IFNjKHQpfWZ1bmN0aW9uIHpjKHQpe3JldHVybiBuZXcgRWModCl9ZnVuY3Rpb24gUGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFJjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gcWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIExjKHQpe3JldHVybiBuZXcgcWModCwwKX1mdW5jdGlvbiBVYyh0KXtyZXR1cm4gbmV3IHFjKHQsMSl9ZnVuY3Rpb24gRGModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiBPYyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gRmModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gSWModCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gWWMoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBCYyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIGpjKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBIYyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gWGModCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIFZjKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89bXcucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmJGMoaSx0LG4sZSksciYmJGMoaSxuLHQscikseXdbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobykseXdbbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBXYyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gJGModCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFpjKHQsbixlLHIsaSl7dmFyIG8sdT10WzBdLGE9dFsxXSxjPXVbMF0scz11WzFdLGY9YVswXSxsPWFbMV0saD0wLHA9MSxkPWYtYyx2PWwtcztpZihvPW4tYyxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZihkPjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPXItYyxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1pZihvPWUtcyx2fHwhKG8+MCkpe2lmKG8vPXYsdjwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZih2PjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPWktcyx2fHwhKG88MCkpe2lmKG8vPXYsdjwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZih2PjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1yZXR1cm4hKGg+MHx8cDwxKXx8KGg+MCYmKHRbMF09W2MraCpkLHMraCp2XSkscDwxJiYodFsxXT1bYytwKmQscytwKnZdKSwhMCl9fX19fWZ1bmN0aW9uIEdjKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLF89KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Xy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIEpjKHQsbixlLHIpe2Zvcih2YXIgaSxvPW13Lmxlbmd0aDtvLS07KUdjKGk9bXdbb10sdCxuLGUscikmJlpjKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPnd3fHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPnd3KXx8ZGVsZXRlIG13W29dfWZ1bmN0aW9uIFFjKHQpe3JldHVybiB5d1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19ZnVuY3Rpb24gS2ModCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiB0cyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gbnModCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWZ1bmN0aW9uIGVzKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPXl3Lmxlbmd0aDtpPG87KytpKWlmKCh0PXl3W2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09S2ModCxtd1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19ZnVuY3Rpb24gcnModCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF89eXcubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPF87KytpKWlmKG89eXdbaV0pe2Zvcih1PW8uc2l0ZSxjPW8uaGFsZmVkZ2VzLGE9Yy5sZW5ndGg7YS0tOyltd1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylwPW5zKG8sbXdbY1thXV0pLGQ9cFswXSx2PXBbMV0sZj10cyhvLG13W2NbKythJXNdXSksbD1mWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT53d3x8TWF0aC5hYnModi1oKT53dykmJihjLnNwbGljZShhLDAsbXcucHVzaChXYyh1LHAsTWF0aC5hYnMoZC10KTx3dyYmci12Pnd3P1t0LE1hdGguYWJzKGwtdCk8d3c/aDpyXTpNYXRoLmFicyh2LXIpPHd3JiZlLWQ+d3c/W01hdGguYWJzKGgtcik8d3c/bDplLHJdOk1hdGguYWJzKGQtZSk8d3cmJnYtbj53dz9bZSxNYXRoLmFicyhsLWUpPHd3P2g6bl06TWF0aC5hYnModi1uKTx3dyYmZC10Pnd3P1tNYXRoLmFicyhoLW4pPHd3P2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoeT0hMSl9aWYoeSl7dmFyIGcsbSx4LGI9MS8wO2ZvcihpPTAseT1udWxsO2k8XzsrK2kpKG89eXdbaV0pJiYodT1vLnNpdGUsZz11WzBdLXQsbT11WzFdLW4seD1nKmcrbSptLHg8YiYmKGI9eCx5PW8pKTtpZih5KXt2YXIgdz1bdCxuXSxNPVt0LHJdLFQ9W2Uscl0sTj1bZSxuXTt5LmhhbGZlZGdlcy5wdXNoKG13LnB1c2goV2ModT15LnNpdGUsdyxNKSktMSxtdy5wdXNoKFdjKHUsTSxUKSktMSxtdy5wdXNoKFdjKHUsVCxOKSktMSxtdy5wdXNoKFdjKHUsTix3KSktMSl9fWZvcihpPTA7aTxfOysraSkobz15d1tpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSB5d1tpXSl9ZnVuY3Rpb24gaXMoKXtCYyh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gb3ModCl7dmFyIG49dC5QLGU9dC5OO2lmKG4mJmUpe3ZhciByPW4uc2l0ZSxpPXQuc2l0ZSxvPWUuc2l0ZTtpZihyIT09byl7dmFyIHU9aVswXSxhPWlbMV0sYz1yWzBdLXUscz1yWzFdLWEsZj1vWzBdLXUsbD1vWzFdLWEsaD0yKihjKmwtcypmKTtpZighKGg+PS1Ndykpe3ZhciBwPWMqYytzKnMsZD1mKmYrbCpsLHY9KGwqcC1zKmQpL2gsXz0oYypkLWYqcCkvaCx5PXh3LnBvcCgpfHxuZXcgaXM7eS5hcmM9dCx5LnNpdGU9aSx5Lng9dit1LHkueT0oeS5jeT1fK2EpK01hdGguc3FydCh2KnYrXypfKSx0LmNpcmNsZT15O2Zvcih2YXIgZz1udWxsLG09Z3cuXzttOylpZih5Lnk8bS55fHx5Lnk9PT1tLnkmJnkueDw9bS54KXtpZighbS5MKXtnPW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe2c9bTticmVha31tPW0uUn1ndy5pbnNlcnQoZyx5KSxnfHwodnc9eSl9fX19ZnVuY3Rpb24gdXModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KHZ3PW4uTiksZ3cucmVtb3ZlKG4pLHh3LnB1c2gobiksQmMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gYXMoKXtCYyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gY3ModCl7dmFyIG49YncucG9wKCl8fG5ldyBhcztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBzcyh0KXt1cyh0KSxfdy5yZW1vdmUodCksYncucHVzaCh0KSxCYyh0KX1mdW5jdGlvbiBmcyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCx1PXQuTixhPVt0XTtzcyh0KTtmb3IodmFyIGM9bztjLmNpcmNsZSYmTWF0aC5hYnMoZS1jLmNpcmNsZS54KTx3dyYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8d3c7KW89Yy5QLGEudW5zaGlmdChjKSxzcyhjKSxjPW87YS51bnNoaWZ0KGMpLHVzKGMpO2Zvcih2YXIgcz11O3MuY2lyY2xlJiZNYXRoLmFicyhlLXMuY2lyY2xlLngpPHd3JiZNYXRoLmFicyhyLXMuY2lyY2xlLmN5KTx3dzspdT1zLk4sYS5wdXNoKHMpLHNzKHMpLHM9dTthLnB1c2gocyksdXMocyk7dmFyIGYsbD1hLmxlbmd0aDtmb3IoZj0xO2Y8bDsrK2Ypcz1hW2ZdLGM9YVtmLTFdLCRjKHMuZWRnZSxjLnNpdGUscy5zaXRlLGkpO2M9YVswXSxzPWFbbC0xXSxzLmVkZ2U9VmMoYy5zaXRlLHMuc2l0ZSxudWxsLGkpLG9zKGMpLG9zKHMpfWZ1bmN0aW9uIGxzKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sdT10WzFdLGE9X3cuXzthOylpZihyPWhzKGEsdSktbyxyPnd3KWE9YS5MO2Vsc2V7aWYoaT1vLXBzKGEsdSksIShpPnd3KSl7cj4td3c/KG49YS5QLGU9YSk6aT4td3c/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfVFjKHQpO3ZhciBjPWNzKHQpO2lmKF93Lmluc2VydChuLGMpLG58fGUpe2lmKG49PT1lKXJldHVybiB1cyhuKSxlPWNzKG4uc2l0ZSksX3cuaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1WYyhuLnNpdGUsYy5zaXRlKSxvcyhuKSx2b2lkIG9zKGUpO2lmKCFlKXJldHVybiB2b2lkKGMuZWRnZT1WYyhuLnNpdGUsYy5zaXRlKSk7dXMobiksdXMoZSk7dmFyIHM9bi5zaXRlLGY9c1swXSxsPXNbMV0saD10WzBdLWYscD10WzFdLWwsZD1lLnNpdGUsdj1kWzBdLWYsXz1kWzFdLWwseT0yKihoKl8tcCp2KSxnPWgqaCtwKnAsbT12KnYrXypfLHg9WyhfKmctcCptKS95K2YsKGgqbS12KmcpL3krbF07JGMoZS5lZGdlLHMsZCx4KSxjLmVkZ2U9VmMocyx0LG51bGwseCksZS5lZGdlPVZjKHQsZCxudWxsLHgpLG9zKG4pLG9zKGUpfX1mdW5jdGlvbiBocyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciB1PXQuUDtpZighdSlyZXR1cm4tKDEvMCk7ZT11LnNpdGU7dmFyIGE9ZVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gcHModCxuKXt2YXIgZT10Lk47aWYoZSlyZXR1cm4gaHMoZSxuKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1uP3JbMF06MS8wfWZ1bmN0aW9uIGRzKHQsbixlKXtyZXR1cm4odFswXS1lWzBdKSooblsxXS10WzFdKS0odFswXS1uWzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiB2cyh0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBfcyh0LG4pe3ZhciBlLHIsaSxvPXQuc29ydCh2cykucG9wKCk7Zm9yKG13PVtdLHl3PW5ldyBBcnJheSh0Lmxlbmd0aCksX3c9bmV3IFljLGd3PW5ldyBZYzs7KWlmKGk9dncsbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KGxzKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO2ZzKGkuYXJjKX1pZihlcygpLG4pe3ZhciB1PStuWzBdWzBdLGE9K25bMF1bMV0sYz0rblsxXVswXSxzPStuWzFdWzFdO0pjKHUsYSxjLHMpLHJzKHUsYSxjLHMpfXRoaXMuZWRnZXM9bXcsdGhpcy5jZWxscz15dyxfdz1ndz1tdz15dz1udWxsfWZ1bmN0aW9uIHlzKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gZ3ModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIG1zKHQpe3JldHVybiB0Ll9fem9vbXx8a3d9ZnVuY3Rpb24geHMoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGJzKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIHdzKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50PyhlPWUub3duZXJTVkdFbGVtZW50fHxlLHQ9ZS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIE1zKCl7cmV0dXJuIHRoaXMuX196b29tfHxrd312YXIgVHM9IjQuNS4wIixOcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sa3M9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSxTcz1rcyhOcyksRXM9U3MucmlnaHQsQXM9U3MubGVmdCxDcz1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0senM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10P05hTjordH0sUHM9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0wLHU9MCxhPS0xLGM9MDtpZihudWxsPT1uKWZvcig7KythPGk7KWlzTmFOKGU9enModFthXSkpfHwocj1lLW8sbys9ci8rK2MsdSs9ciooZS1vKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXpzKG4odFthXSxhLHQpKSl8fChyPWUtbyxvKz1yLysrYyx1Kz1yKihlLW8pKTtpZihjPjEpcmV0dXJuIHUvKGMtMSl9LFJzPWZ1bmN0aW9uKHQsbil7dmFyIGU9UHModCxuKTtyZXR1cm4gZT9NYXRoLnNxcnQoZSk6ZX0scXM9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz0tMSx1PXQubGVuZ3RoO2lmKG51bGw9PW4pe2Zvcig7KytvPHU7KWlmKG51bGwhPShyPXRbb10pJiZyPj1yKXtlPWk9cjticmVha31mb3IoOysrbzx1OyludWxsIT0ocj10W29dKSYmKGU+ciYmKGU9ciksaTxyJiYoaT1yKSl9ZWxzZXtmb3IoOysrbzx1OylpZihudWxsIT0ocj1uKHRbb10sbyx0KSkmJnI+PXIpe2U9aT1yO2JyZWFrfWZvcig7KytvPHU7KW51bGwhPShyPW4odFtvXSxvLHQpKSYmKGU+ciYmKGU9ciksaTxyJiYoaT1yKSl9cmV0dXJuW2UsaV19LExzPUFycmF5LnByb3RvdHlwZSxVcz1Mcy5zbGljZSxEcz1Mcy5tYXAsT3M9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxGcz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sSXM9ZnVuY3Rpb24odCxuLGUpe3Q9K3Qsbj0rbixlPShpPWFyZ3VtZW50cy5sZW5ndGgpPDI/KG49dCx0PTAsMSk6aTwzPzE6K2U7Zm9yKHZhciByPS0xLGk9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgobi10KS9lKSksbz1uZXcgQXJyYXkoaSk7KytyPGk7KW9bcl09dCtyKmU7cmV0dXJuIG99LFlzPU1hdGguc3FydCg1MCksQnM9TWF0aC5zcXJ0KDEwKSxqcz1NYXRoLnNxcnQoMiksSHM9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUodCxuLHIpO3JldHVybiBJcyhNYXRoLmNlaWwodC9pKSppLE1hdGguZmxvb3Iobi9pKSppK2kvMixpKX0sWHM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9LFZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxvLHU9dC5sZW5ndGgsYT1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWFbaV09bih0W2ldLGksdCk7dmFyIGM9ZShhKSxzPWNbMF0sZj1jWzFdLGw9cihhLHMsZik7QXJyYXkuaXNBcnJheShsKXx8KGw9SHMocyxmLGwpKTtmb3IodmFyIGg9bC5sZW5ndGg7bFswXTw9czspbC5zaGlmdCgpLC0taDtmb3IoO2xbaC0xXT49ZjspbC5wb3AoKSwtLWg7dmFyIHAsZD1uZXcgQXJyYXkoaCsxKTtmb3IoaT0wO2k8PWg7KytpKXA9ZFtpXT1bXSxwLngwPWk+MD9sW2ktMV06cyxwLngxPWk8aD9sW2ldOmY7Zm9yKGk9MDtpPHU7KytpKW89YVtpXSxzPD1vJiZvPD1mJiZkW0VzKGwsbywwLGgpXS5wdXNoKHRbaV0pO3JldHVybiBkfXZhciBuPUZzLGU9cXMscj1YcztyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOk9zKGUpLHQpOm59LHQuZG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246T3MoW25bMF0sblsxXV0pLHQpOmV9LHQudGhyZXNob2xkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOk9zKEFycmF5LmlzQXJyYXkobik/VXMuY2FsbChuKTpuKSx0KTpyfSx0fSxXcz1mdW5jdGlvbih0LG4sZSl7aWYobnVsbD09ZSYmKGU9enMpLHI9dC5sZW5ndGgpe2lmKChuPStuKTw9MHx8cjwyKXJldHVybitlKHRbMF0sMCx0KTtpZihuPj0xKXJldHVybitlKHRbci0xXSxyLTEsdCk7dmFyIHIsaT0oci0xKSpuLG89TWF0aC5mbG9vcihpKSx1PStlKHRbb10sbyx0KSxhPStlKHRbbysxXSxvKzEsdCk7cmV0dXJuIHUrKGEtdSkqKGktbyl9fSwkcz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9RHMuY2FsbCh0LHpzKS5zb3J0KE5zKSxNYXRoLmNlaWwoKGUtbikvKDIqKFdzKHQsLjc1KS1Xcyh0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LFpzPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqUnModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sR3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPmUmJihlPXIpfXJldHVybiBlfSxKcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTEsdT1pO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT16cyh0W29dKSk/LS11OnIrPWU7ZWxzZSBmb3IoOysrbzxpOylpc05hTihlPXpzKG4odFtvXSxvLHQpKSk/LS11OnIrPWU7aWYodSlyZXR1cm4gci91fSxRcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9W10saT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT16cyh0W29dKSl8fHIucHVzaChlKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKGU9enMobih0W29dLG8sdCkpKXx8ci5wdXNoKGUpO3JldHVybiBXcyhyLnNvcnQoTnMpLC41KX0sS3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsdT0wOysrbzxpOyl1Kz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkodSk7LS1pPj0wOylmb3Iocj10W2ldLG49ci5sZW5ndGg7LS1uPj0wOyllWy0tdV09cltuXTtyZXR1cm4gZX0sdGY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZlPnImJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZlPnImJihlPXIpfXJldHVybiBlfSxuZj1mdW5jdGlvbih0KXtmb3IodmFyIG49MCxlPXQubGVuZ3RoLTEscj10WzBdLGk9bmV3IEFycmF5KGU8MD8wOmUpO248ZTspaVtuXT1bcixyPXRbKytuXV07cmV0dXJuIGl9LGVmPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W25bZV1dO3JldHVybiByfSxyZj1mdW5jdGlvbih0LG4pe2lmKGU9dC5sZW5ndGgpe3ZhciBlLHIsaT0wLG89MCx1PXRbb107Zm9yKG58fChuPU5zKTsrK2k8ZTspKG4ocj10W2ldLHUpPDB8fDAhPT1uKHUsdSkpJiYodT1yLG89aSk7cmV0dXJuIDA9PT1uKHUsdSk/bzp2b2lkIDB9fSxvZj1mdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz0obnVsbD09ZT90Lmxlbmd0aDplKS0obj1udWxsPT1uPzA6K24pO287KWk9TWF0aC5yYW5kb20oKSpvLS18MCxyPXRbbytuXSx0W28rbl09dFtpK25dLHRbaStuXT1yO3JldHVybiB0fSx1Zj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bilmb3IoOysrbzxpOykoZT0rdFtvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KShlPStuKHRbb10sbyx0KSkmJihyKz1lKTtyZXR1cm4gcn0sYWY9ZnVuY3Rpb24odCl7aWYoIShvPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT10Zih0LHIpLGk9bmV3IEFycmF5KGUpOysrbjxlOylmb3IodmFyIG8sdT0tMSxhPWlbbl09bmV3IEFycmF5KG8pOysrdTxvOylhW3VdPXRbdV1bbl07cmV0dXJuIGl9LGNmPWZ1bmN0aW9uKCl7cmV0dXJuIGFmKGFyZ3VtZW50cyl9LHNmPUFycmF5LnByb3RvdHlwZS5zbGljZSxmZj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbGY9MSxoZj0yLHBmPTMsZGY9NCx2Zj0xZS02LF9mPXt2YWx1ZTpmdW5jdGlvbigpe319O2QucHJvdG90eXBlPXAucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscj10aGlzLl8saT12KHQrIiIsciksbz0tMSx1PWkubGVuZ3RoO3tpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPW4mJiJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtmb3IoOysrbzx1OylpZihlPSh0PWlbb10pLnR5cGUpcltlXT15KHJbZV0sdC5uYW1lLG4pO2Vsc2UgaWYobnVsbD09bilmb3IoZSBpbiByKXJbZV09eShyW2VdLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzx1OylpZigoZT0odD1pW29dKS50eXBlKSYmKGU9XyhyW2VdLHQubmFtZSkpKXJldHVybiBlfX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgZCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHI9dGhpcy5fW3RdLG89MCxlPXIubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIHlmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixnZj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6eWYseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxtZj1mdW5jdGlvbih0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxnZi5oYXNPd25Qcm9wZXJ0eShuKT97c3BhY2U6Z2Zbbl0sbG9jYWw6dH06dH0seGY9ZnVuY3Rpb24odCl7dmFyIG49bWYodCk7cmV0dXJuKG4ubG9jYWw/bTpnKShuKX0sYmY9MDtiLnByb3RvdHlwZT14LnByb3RvdHlwZT17Y29uc3RydWN0b3I6YixnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgd2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBNZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIU1mLm1hdGNoZXMpe3ZhciBUZj1NZi53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fE1mLm1zTWF0Y2hlc1NlbGVjdG9yfHxNZi5tb3pNYXRjaGVzU2VsZWN0b3J8fE1mLm9NYXRjaGVzU2VsZWN0b3I7d2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFRmLmNhbGwodGhpcyx0KX19fX12YXIgTmY9d2Ysa2Y9e307aWYodC5ldmVudD1udWxsLCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBTZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Im9ubW91c2VlbnRlciJpbiBTZnx8KGtmPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pfXZhciBFZj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPVQodCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP2s6TixudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxBZj1mdW5jdGlvbigpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9LENmPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFkscj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSksW3IueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19LHpmPWZ1bmN0aW9uKHQpe3ZhciBuPUFmKCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLENmKHQsbil9LFBmPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX0sUmY9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVBmKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHUsYT1uW2ldLGM9YS5sZW5ndGgscz1yW2ldPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikobz1hW2ZdKSYmKHU9dC5jYWxsKG8sby5fX2RhdGFfXyxmLGEpKSYmKCJfX2RhdGFfXyJpbiBvJiYodS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxzW2ZdPXUpO3JldHVybiBuZXcgcHQocix0aGlzLl9wYXJlbnRzKX0scWY9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/QTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxMZj1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cWYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciB1LGE9bltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiYoci5wdXNoKHQuY2FsbCh1LHUuX19kYXRhX18scyxhKSksaS5wdXNoKHUpKTtyZXR1cm4gbmV3IHB0KHIsaSl9LFVmPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1OZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgcHQocix0aGlzLl9wYXJlbnRzKX0sRGY9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9LE9mPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChEZiksdGhpcy5fcGFyZW50cyl9O0MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpDLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciBGZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LElmPSIkIixZZj1mdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/UDp6LHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9RmYodCkpO2Zvcih2YXIgbz1pLmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPW5ldyBBcnJheShvKSxzPTA7czxvOysrcyl7dmFyIGY9cltzXSxsPWlbc10saD1sLmxlbmd0aCxwPXQuY2FsbChmLGYmJmYuX19kYXRhX18scyxyKSxkPXAubGVuZ3RoLHY9YVtzXT1uZXcgQXJyYXkoZCksXz11W3NdPW5ldyBBcnJheShkKSx5PWNbc109bmV3IEFycmF5KGgpO2UoZixsLHYsXyx5LHAsbik7Zm9yKHZhciBnLG0seD0wLGI9MDt4PGQ7Kyt4KWlmKGc9dlt4XSl7Zm9yKHg+PWImJihiPXgrMSk7IShtPV9bYl0pJiYrK2I8ZDspO2cuX25leHQ9bXx8bnVsbH19cmV0dXJuIHU9bmV3IHB0KHUsciksdS5fZW50ZXI9YSx1Ll9leGl0PWMsdX0sQmY9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHB0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoRGYpLHRoaXMuX3BhcmVudHMpfSxqZj1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgcHQodSx0aGlzLl9wYXJlbnRzKX0sSGY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsdT1pW29dOy0tbz49MDspKHI9aVtvXSkmJih1JiZ1IT09ci5uZXh0U2libGluZyYmdS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLHUpLHU9cik7cmV0dXJuIHRoaXN9LFhmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9dHx8KHQ9Uik7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIHUsYT1lW29dLGM9YS5sZW5ndGgscz1pW29dPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikodT1hW2ZdKSYmKHNbZl09dSk7cy5zb3J0KG4pfXJldHVybiBuZXcgcHQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxWZj1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sV2Y9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLG49LTE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RbKytuXT10aGlzfSksdH0sJGY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIHU9cltpXTtpZih1KXJldHVybiB1fXJldHVybiBudWxsfSxaZj1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LEdmPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxKZj1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2UpZm9yKHZhciBpLG89bltlXSx1PTAsYT1vLmxlbmd0aDt1PGE7Kyt1KShpPW9bdV0pJiZ0LmNhbGwoaSxpLl9fZGF0YV9fLHUsbyk7cmV0dXJuIHRoaXN9LFFmPWZ1bmN0aW9uKHQsbil7dmFyIGU9bWYodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP0w6cToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP0Y6TzplLmxvY2FsP0Q6VSkoZSxuKSl9LEtmPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld30sdGw9ZnVuY3Rpb24odCxuLGUpe3ZhciByO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP0k6ImZ1bmN0aW9uIj09dHlwZW9mIG4/QjpZKSh0LG4sbnVsbD09ZT8iIjplKSk6S2Yocj10aGlzLm5vZGUoKSkuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCl9LG5sPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ajoiZnVuY3Rpb24iPT10eXBlb2Ygbj9YOkgpKHQsbikpOnRoaXMubm9kZSgpW3RdfTskLnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWVzLmluZGV4T2YodCk7bjwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgZWw9ZnVuY3Rpb24odCxuKXt2YXIgZT1WKHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPVcodGhpcy5ub2RlKCkpLGk9LTEsbz1lLmxlbmd0aDsrK2k8bzspaWYoIXIuY29udGFpbnMoZVtpXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/SzpuP0o6USkoZSxuKSl9LHJsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3R0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9ldDpudCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxpbD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9ydDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/b3Q6aXQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LG9sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh1dCl9LHVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChhdCl9LGFsPWZ1bmN0aW9uKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eGYodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGNsPWZ1bmN0aW9uKHQsbil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp4Zih0KSxyPW51bGw9PW4/Y3Q6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpQZihuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChzdCl9LGZsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sbGw9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9odDpsdCkodCxuKSl9LGhsPVtudWxsXTtwdC5wcm90b3R5cGU9ZHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdCxzZWxlY3Q6UmYsc2VsZWN0QWxsOkxmLGZpbHRlcjpVZixkYXRhOllmLGVudGVyOk9mLGV4aXQ6QmYsbWVyZ2U6amYsb3JkZXI6SGYsc29ydDpYZixjYWxsOlZmLG5vZGVzOldmLG5vZGU6JGYsc2l6ZTpaZixlbXB0eTpHZixlYWNoOkpmLGF0dHI6UWYsc3R5bGU6dGwscHJvcGVydHk6bmwsY2xhc3NlZDplbCx0ZXh0OnJsLGh0bWw6aWwscmFpc2U6b2wsbG93ZXI6dWwsYXBwZW5kOmFsLGluc2VydDpjbCxyZW1vdmU6c2wsZGF0dW06Zmwsb246RWYsZGlzcGF0Y2g6bGx9O3ZhciBwbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHB0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgcHQoW1t0XV0saGwpfSxkbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHB0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IHB0KFtudWxsPT10P1tdOnRdLGhsKX0sdmw9ZnVuY3Rpb24odCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPUFmKCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gQ2YodCxyKTtyZXR1cm4gbnVsbH0sX2w9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1BZigpLnRvdWNoZXMpO2Zvcih2YXIgZT0wLHI9bj9uLmxlbmd0aDowLGk9bmV3IEFycmF5KHIpO2U8cjsrK2UpaVtlXT1DZih0LG5bZV0pO3JldHVybiBpfSx5bD1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxnbD1mdW5jdGlvbih0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPXBsKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIseWwsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIseWwsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfSxtbD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O3l0LnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciB4bD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pLm9uKCJ0b3VjaG1vdmUuZHJhZyIsdSkub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsYSkuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKCl7aWYoIWYmJmwuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj1jKCJtb3VzZSIsaC5hcHBseSh0aGlzLGFyZ3VtZW50cyksemYsdGhpcyxhcmd1bWVudHMpO24mJihwbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsciwhMCkub24oIm1vdXNldXAuZHJhZyIsaSwhMCksZ2wodC5ldmVudC52aWV3KSx2dCgpLHM9ITEsbigic3RhcnQiKSl9fWZ1bmN0aW9uIHIoKXt5bCgpLHM9ITAsdi5tb3VzZSgiZHJhZyIpfWZ1bmN0aW9uIGkoKXtwbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLF90KHQuZXZlbnQudmlldyxzKSx5bCgpLHYubW91c2UoImVuZCIpfWZ1bmN0aW9uIG8oKXtpZihsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1oLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXIubGVuZ3RoO2ZvcihuPTA7bjxvOysrbikoZT1jKHJbbl0uaWRlbnRpZmllcixpLHZsLHRoaXMsYXJndW1lbnRzKSkmJih2dCgpLGUoInN0YXJ0IikpfX1mdW5jdGlvbiB1KCl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1yLmxlbmd0aDtmb3Iobj0wO248aTsrK24pKGU9dltyW25dLmlkZW50aWZpZXJdKSYmKHlsKCksZSgiZHJhZyIpKX1mdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1yLmxlbmd0aDtmb3IoZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sNTAwKSxuPTA7bjxpOysrbikoZT12W3Jbbl0uaWRlbnRpZmllcl0pJiYodnQoKSxlKCJlbmQiKSl9ZnVuY3Rpb24gYyhlLHIsaSxvLHUpe3ZhciBhLGMscyxmPWkocixlKSxsPV8uY29weSgpO2lmKFMobmV3IHl0KG4sImJlZm9yZXN0YXJ0IixhLGUseSxmWzBdLGZbMV0sMCwwLGwpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPSh0LmV2ZW50LnN1YmplY3Q9YT1kLmFwcGx5KG8sdSkpJiYoYz1hLngtZlswXXx8MCxzPWEueS1mWzFdfHwwLCEwKX0pKXJldHVybiBmdW5jdGlvbiB0KGgpe3ZhciBwLGQ9Zjtzd2l0Y2goaCl7Y2FzZSJzdGFydCI6dltlXT10LHA9eSsrO2JyZWFrO2Nhc2UiZW5kIjpkZWxldGUgdltlXSwtLXk7Y2FzZSJkcmFnIjpmPWkocixlKSxwPXl9UyhuZXcgeXQobixoLGEsZSxwLGZbMF0rYyxmWzFdK3MsZlswXS1kWzBdLGZbMV0tZFsxXSxsKSxsLmFwcGx5LGwsW2gsbyx1XSl9fXZhciBzLGYsbD1ndCxoPW10LGQ9eHQsdj17fSxfPXAoInN0YXJ0IiwiZHJhZyIsImVuZCIpLHk9MDtyZXR1cm4gbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptbCghIXQpLG4pOmx9LG4uY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bWwodCksbik6aH0sbi5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bWwodCksCm4pOmR9LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1fLm9uLmFwcGx5KF8sYXJndW1lbnRzKTtyZXR1cm4gdD09PV8/bjp0fSxufSxibD1mdW5jdGlvbih0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9LHdsPS43LE1sPTEvd2wsVGw9IlxccyooWystXT9cXGQrKVxccyoiLE5sPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLGtsPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixTbD0vXiMoWzAtOWEtZl17M30pJC8sRWw9L14jKFswLTlhLWZdezZ9KSQvLEFsPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tUbCxUbCxUbF0rIlxcKSQiKSxDbD1uZXcgUmVnRXhwKCJecmdiXFwoIitba2wsa2wsa2xdKyJcXCkkIiksemw9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tUbCxUbCxUbCxObF0rIlxcKSQiKSxQbD1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW2tsLGtsLGtsLE5sXSsiXFwpJCIpLFJsPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tObCxrbCxrbF0rIlxcKSQiKSxxbD1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW05sLGtsLGtsLE5sXSsiXFwpJCIpLExsPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2JsKHd0LE10LHtkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksYmwoRXQsU3QsYnQod3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/TWw6TWF0aC5wb3coTWwsdCksbmV3IEV0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P3dsOk1hdGgucG93KHdsLHQpLG5ldyBFdCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybiB0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSwoMT09PXQ/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKSxibChQdCx6dCxidCh3dCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NbDpNYXRoLnBvdyhNbCx0KSxuZXcgUHQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD93bDpNYXRoLnBvdyh3bCx0KSxuZXcgUHQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBFdChSdCh0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxSdCh0LGksciksUnQodDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX19KSk7dmFyIFVsPU1hdGguUEkvMTgwLERsPTE4MC9NYXRoLlBJLE9sPTE4LEZsPS45NTA0NyxJbD0xLFlsPTEuMDg4ODMsQmw9NC8yOSxqbD02LzI5LEhsPTMqamwqamwsWGw9amwqamwqamw7YmwoVXQsTHQsYnQod3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVXQodGhpcy5sK09sKihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVdCh0aGlzLmwtT2wqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiB0PUlsKk90KHQpLG49RmwqT3QobiksZT1ZbCpPdChlKSxuZXcgRXQoRnQoMy4yNDA0NTQyKm4tMS41MzcxMzg1KnQtLjQ5ODUzMTQqZSksRnQoLS45NjkyNjYqbisxLjg3NjAxMDgqdCsuMDQxNTU2KmUpLEZ0KC4wNTU2NDM0Km4tLjIwNDAyNTkqdCsxLjA1NzIyNTIqZSksdGhpcy5vcGFjaXR5KX19KSksYmwoanQsQnQsYnQod3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcganQodGhpcy5oLHRoaXMuYyx0aGlzLmwrT2wqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqdCh0aGlzLmgsdGhpcy5jLHRoaXMubC1PbCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBxdCh0aGlzKS5yZ2IoKX19KSk7dmFyIFZsPS0uMTQ4NjEsV2w9MS43ODI3NywkbD0tLjI5MjI3LFpsPS0uOTA2NDksR2w9MS45NzI5NCxKbD1HbCpabCxRbD1HbCpXbCxLbD1XbCokbC1abCpWbDtibChWdCxYdCxidCh3dCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NbDpNYXRoLnBvdyhNbCx0KSxuZXcgVnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD93bDpNYXRoLnBvdyh3bCx0KSxuZXcgVnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKlVsLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBFdCgyNTUqKG4rZSooVmwqcitXbCppKSksMjU1KihuK2UqKCRsKnIrWmwqaSkpLDI1NSoobitlKihHbCpyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIHRoLG5oLGVoLHJoLGloLG9oLHVoPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sdT1yPjA/dFtyLTFdOjIqaS1vLGE9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBXdCgoZS1yL24pKm4sdSxpLG8sYSl9fSxhaD1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLHU9dFsocisxKSVuXSxhPXRbKHIrMiklbl07cmV0dXJuIFd0KChlLXIvbikqbixpLG8sdSxhKX19LGNoPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sc2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9cigodD1TdCh0KSkuciwobj1TdChuKSkuciksaT1yKHQuZyxuLmcpLG89cih0LmIsbi5iKSx1PVF0KHQub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5yPWUobiksdC5nPWkobiksdC5iPW8obiksdC5vcGFjaXR5PXUobiksdCsiIn19dmFyIHI9SnQobik7cmV0dXJuIGUuZ2FtbWE9dCxlfSgxKSxmaD1LdCh1aCksbGg9S3QoYWgpLGhoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uP24ubGVuZ3RoOjAsaT10P01hdGgubWluKHIsdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPGk7KytlKW9bZV09bWgodFtlXSxuW2VdKTtmb3IoO2U8cjsrK2UpdVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZT0wO2U8aTsrK2UpdVtlXT1vW2VdKHQpO3JldHVybiB1fX0scGg9ZnVuY3Rpb24odCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKHIpe3JldHVybiBlLnNldFRpbWUodCtuKnIpLGV9fSxkaD1mdW5jdGlvbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIHQrbiplfX0sdmg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXt9LGk9e307bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPW1oKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19LF9oPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyx5aD1uZXcgUmVnRXhwKF9oLnNvdXJjZSwiZyIpLGdoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89X2gubGFzdEluZGV4PXloLmxhc3RJbmRleD0wLHU9LTEsYT1bXSxjPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT1faC5leGVjKHQpKSYmKHI9eWguZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSxhW3VdP2FbdV0rPWk6YVsrK3VdPWkpLChlPWVbMF0pPT09KHI9clswXSk/YVt1XT9hW3VdKz1yOmFbKyt1XT1yOihhWysrdV09bnVsbCxjLnB1c2goe2k6dSx4OmRoKGUscil9KSksbz15aC5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSxhLmxlbmd0aDwyP2NbMF0/bm4oY1swXS54KTp0bihuKToobj1jLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpYVsoZT1jW3JdKS5pXT1lLngodCk7cmV0dXJuIGEuam9pbigiIil9KX0sbWg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXR5cGVvZiBuO3JldHVybiBudWxsPT1ufHwiYm9vbGVhbiI9PT1yP2NoKG4pOigibnVtYmVyIj09PXI/ZGg6InN0cmluZyI9PT1yPyhlPU10KG4pKT8obj1lLHNoKTpnaDpuIGluc3RhbmNlb2YgTXQ/c2g6biBpbnN0YW5jZW9mIERhdGU/cGg6QXJyYXkuaXNBcnJheShuKT9oaDppc05hTihuKT92aDpkaCkodCxuKX0seGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQrbiplKX19LGJoPTE4MC9NYXRoLlBJLHdoPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9LE1oPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdSxhLGM7cmV0dXJuKHU9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPXUsbi89dSksKGM9dCplK24qcikmJihlLT10KmMsci09bipjKSwoYT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89YSxyLz1hLGMvPWEpLHQqcjxuKmUmJih0PS10LG49LW4sYz0tYyx1PS11KSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKmJoLHNrZXdYOk1hdGguYXRhbihjKSpiaCxzY2FsZVg6dSxzY2FsZVk6YX19LFRoPW9uKGVuLCJweCwgIiwicHgpIiwiZGVnKSIpLE5oPW9uKHJuLCIsICIsIikiLCIpIiksa2g9TWF0aC5TUVJUMixTaD0yLEVoPTQsQWg9MWUtMTIsQ2g9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sdT10WzJdLGE9blswXSxjPW5bMV0scz1uWzJdLGY9YS1pLGw9Yy1vLGg9ZipmK2wqbDtpZihoPEFoKXI9TWF0aC5sb2cocy91KS9raCxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqZixvK3QqbCx1Kk1hdGguZXhwKGtoKnQqcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxkPShzKnMtdSp1K0VoKmgpLygyKnUqU2gqcCksdj0ocypzLXUqdS1FaCpoKS8oMipzKlNoKnApLF89TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSx5PU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oeS1fKS9raCxlPWZ1bmN0aW9uKHQpe3ZhciBuPXQqcixlPXVuKF8pLGE9dS8oU2gqcCkqKGUqY24oa2gqbitfKS1hbihfKSk7cmV0dXJuW2krYSpmLG8rYSpsLHUqZS91bihraCpuK18pXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0semg9c24oR3QpLFBoPXNuKFF0KSxSaD1sbihHdCkscWg9bG4oUXQpLExoPWhuKEd0KSxVaD1obihRdCksRGg9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sT2g9MCxGaD0wLEloPTAsWWg9MWUzLEJoPTAsamg9MCxIaD0wLFhoPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLFZoPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/cmVxdWVzdEFuaW1hdGlvbkZyYW1lOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O3ZuLnByb3RvdHlwZT1fbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnZuLHJlc3RhcnQ6ZnVuY3Rpb24odCxuLGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7ZT0obnVsbD09ZT9wbigpOitlKSsobnVsbD09bj8wOituKSx0aGlzLl9uZXh0fHxvaD09PXRoaXN8fChvaD9vaC5fbmV4dD10aGlzOmloPXRoaXMsb2g9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9ZSxibigpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCxibigpKX19O3ZhciBXaD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IHZuO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9LCRoPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj1uZXcgdm4saT1uO3JldHVybiBudWxsPT1uPyhyLnJlc3RhcnQodCxuLGUpLHIpOihuPStuLGU9bnVsbD09ZT9wbigpOitlLHIucmVzdGFydChmdW5jdGlvbiBvKHUpe3UrPWksci5yZXN0YXJ0KG8saSs9bixlKSx0KHUpfSxuLGUpLHIpfSxaaD1wKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLEdoPVtdLEpoPTAsUWg9MSxLaD0yLHRwPTMsbnA9NCxlcD01LHJwPTYsaXA9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTtObih0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246WmgsdHdlZW46R2gsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6Smh9KX0sb3A9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbix1PSEwO2lmKG8pe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKGkgaW4gbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPktoJiZlLnN0YXRlPGVwLGUuc3RhdGU9cnAsZS50aW1lci5zdG9wKCksciYmZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGRlbGV0ZSBvW2ldKTp1PSExO3UmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19LHVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtvcCh0aGlzLHQpfSl9LGFwPWZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1Ubih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsdT1pLmxlbmd0aDtvPHU7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/a246U24pKGUsdCxuKSl9LGNwPWZ1bmN0aW9uKHQsbil7dmFyIGU7cmV0dXJuKCJudW1iZXIiPT10eXBlb2Ygbj9kaDpuIGluc3RhbmNlb2YgTXQ/c2g6KGU9TXQobikpPyhuPWUsc2gpOmdoKSh0LG4pfSxzcD1mdW5jdGlvbih0LG4pe3ZhciBlPW1mKHQpLHI9InRyYW5zZm9ybSI9PT1lP05oOmNwO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP3FuOlJuKShlLHIsRW4odGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/Q246QW4pKGUpOihlLmxvY2FsP1BuOnpuKShlLHIsbikpfSxmcD1mdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9bWYodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9MbjpVbikocixuKSl9LGxwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/RG46T24pKG4sdCkpOlRuKHRoaXMubm9kZSgpLG4pLmRlbGF5fSxocD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0ZuOkluKShuLHQpKTpUbih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0scHA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKFluKG4sdCkpOlRuKHRoaXMubm9kZSgpLG4pLmVhc2V9LGRwPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1OZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgUW4ocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSx2cD1mdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgUW4odSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxfcD1mdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VG4odGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGpuKGUsdCxuKSl9LHlwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLEhuKHRoaXMuX2lkKSl9LGdwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UGYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PTA7dTxpOysrdSlmb3IodmFyIGEsYyxzPXJbdV0sZj1zLmxlbmd0aCxsPW9bdV09bmV3IEFycmF5KGYpLGg9MDtoPGY7KytoKShhPXNbaF0pJiYoYz10LmNhbGwoYSxhLl9fZGF0YV9fLGgscykpJiYoIl9fZGF0YV9fImluIGEmJihjLl9fZGF0YV9fPWEuX19kYXRhX18pLGxbaF09YyxpcChsW2hdLG4sZSxoLGwsVG4oYSxlKSkpO3JldHVybiBuZXcgUW4obyx0aGlzLl9wYXJlbnRzLG4sZSl9LG1wPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cWYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLHU9W10sYT0wO2E8aTsrK2EpZm9yKHZhciBjLHM9clthXSxmPXMubGVuZ3RoLGw9MDtsPGY7KytsKWlmKGM9c1tsXSl7Zm9yKHZhciBoLHA9dC5jYWxsKGMsYy5fX2RhdGFfXyxsLHMpLGQ9VG4oYyxlKSx2PTAsXz1wLmxlbmd0aDt2PF87Kyt2KShoPXBbdl0pJiZpcChoLG4sZSx2LHAsZCk7by5wdXNoKHApLHUucHVzaChjKX1yZXR1cm4gbmV3IFFuKG8sdSxuLGUpfSx4cD1kdC5wcm90b3R5cGUuY29uc3RydWN0b3IsYnA9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHhwKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sd3A9ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP1RoOmNwO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LFhuKHQscikpLm9uKCJlbmQuc3R5bGUuIit0LFZuKHQpKTp0aGlzLnN0eWxlVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8kbih0LHIsRW4odGhpcywic3R5bGUuIit0LG4pKTpXbih0LHIsbiksZSl9LE1wPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLFpuKHQsbixudWxsPT1lPyIiOmUpKX0sVHA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P0puKEVuKHRoaXMsInRleHQiLHQpKTpHbihudWxsPT10PyIiOnQrIiIpKX0sTnA9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9dGUoKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcylpZih1PWFbc10pe3ZhciBmPVRuKHUsbik7aXAodSx0LGUscyxhLHt0aW1lOmYudGltZStmLmRlbGF5K2YuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpmLmR1cmF0aW9uLGVhc2U6Zi5lYXNlfSl9cmV0dXJuIG5ldyBRbihyLHRoaXMuX3BhcmVudHMsdCxlKX0sa3A9MCxTcD1kdC5wcm90b3R5cGU7UW4ucHJvdG90eXBlPUtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UW4sc2VsZWN0OmdwLHNlbGVjdEFsbDptcCxmaWx0ZXI6ZHAsbWVyZ2U6dnAsc2VsZWN0aW9uOmJwLHRyYW5zaXRpb246TnAsY2FsbDpTcC5jYWxsLG5vZGVzOlNwLm5vZGVzLG5vZGU6U3Aubm9kZSxzaXplOlNwLnNpemUsZW1wdHk6U3AuZW1wdHksZWFjaDpTcC5lYWNoLG9uOl9wLGF0dHI6c3AsYXR0clR3ZWVuOmZwLHN0eWxlOndwLHN0eWxlVHdlZW46TXAsdGV4dDpUcCxyZW1vdmU6eXAsdHdlZW46YXAsZGVsYXk6bHAsZHVyYXRpb246aHAsZWFzZTpwcH07dmFyIEVwPTMsQXA9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfShFcCksQ3A9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oRXApLHpwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KEVwKSxQcD1NYXRoLlBJLFJwPVBwLzIscXA9NC8xMSxMcD02LzExLFVwPTgvMTEsRHA9Ljc1LE9wPTkvMTEsRnA9MTAvMTEsSXA9LjkzNzUsWXA9MjEvMjIsQnA9NjMvNjQsanA9MS9xcC9xcCxIcD0xLjcwMTU4LFhwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oSHApLFZwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oSHApLFdwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfShIcCksJHA9MipNYXRoLlBJLFpwPTEsR3A9LjMsSnA9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4qTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChpLXQpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89JHApO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqJHApfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShacCxHcCksUXA9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K2kpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89JHApO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqJHApfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShacCxHcCksS3A9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvZSkpLzJ9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz0kcCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSokcCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KFpwLEdwKSx0ZD17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6YWV9LG5kPWZ1bmN0aW9uKHQpe3ZhciBuLGU7dCBpbnN0YW5jZW9mIFFuPyhuPXQuX2lkLHQ9dC5fbmFtZSk6KG49dGUoKSwoZT10ZCkudGltZT1wbigpLHQ9bnVsbD09dD9udWxsOnQrIiIpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIHUsYT1yW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpKHU9YVtzXSkmJmlwKHUsdCxuLHMsYSxlfHx4ZSh1LG4pKTtyZXR1cm4gbmV3IFFuKHIsdGhpcy5fcGFyZW50cyx0LG4pfTtkdC5wcm90b3R5cGUuaW50ZXJydXB0PXVwLGR0LnByb3RvdHlwZS50cmFuc2l0aW9uPW5kO3ZhciBlZD1bbnVsbF0scmQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5fX3RyYW5zaXRpb247aWYoaSl7bj1udWxsPT1uP251bGw6bisiIjtmb3IociBpbiBpKWlmKChlPWlbcl0pLnN0YXRlPlFoJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUW4oW1t0XV0sZWQsbiwrcil9cmV0dXJuIG51bGx9LGlkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sb2Q9ZnVuY3Rpb24odCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX0sdWQ9ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sYWQ9e25hbWU6ImRyYWcifSxjZD17bmFtZToic3BhY2UifSxzZD17bmFtZToiaGFuZGxlIn0sZmQ9e25hbWU6ImNlbnRlciJ9LGxkPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAod2UpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSxoZD17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKHdlKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0scGQ9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKHdlKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sZGQ9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LHZkPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxfZD17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0seWQ9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sZ2Q9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX0sbWQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ2UocGQpfSx4ZD1NYXRoLmNvcyxiZD1NYXRoLnNpbix3ZD1NYXRoLlBJLE1kPXdkLzIsVGQ9Mip3ZCxOZD1NYXRoLm1heCxrZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdSxhLGMscyxmLGw9dC5sZW5ndGgsaD1bXSxwPUlzKGwpLGQ9W10sdj1bXSxfPXYuZ3JvdXBzPW5ldyBBcnJheShsKSx5PW5ldyBBcnJheShsKmwpO2ZvcihvPTAscz0tMTsrK3M8bDspe2Zvcih1PTAsZj0tMTsrK2Y8bDspdSs9dFtzXVtmXTtoLnB1c2godSksZC5wdXNoKElzKGwpKSxvKz11fWZvcihlJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShoW3RdLGhbbl0pfSksciYmZC5mb3JFYWNoKGZ1bmN0aW9uKG4sZSl7bi5zb3J0KGZ1bmN0aW9uKG4saSl7cmV0dXJuIHIodFtlXVtuXSx0W2VdW2ldKX0pfSksbz1OZCgwLFRkLW4qbCkvbyxjPW8/bjpUZC9sLHU9MCxzPS0xOysrczxsOyl7Zm9yKGE9dSxmPS0xOysrZjxsOyl7dmFyIGc9cFtzXSxtPWRbZ11bZl0seD10W2ddW21dLGI9dSx3PXUrPXgqbzt5W20qbCtnXT17aW5kZXg6ZyxzdWJpbmRleDptLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTp3LHZhbHVlOnh9fV9bZ109e2luZGV4Omcsc3RhcnRBbmdsZTphLGVuZEFuZ2xlOnUsdmFsdWU6aFtnXX0sdSs9Y31mb3Iocz0tMTsrK3M8bDspZm9yKGY9cy0xOysrZjxsOyl7dmFyIE09eVtmKmwrc10sVD15W3MqbCtmXTsoTS52YWx1ZXx8VC52YWx1ZSkmJnYucHVzaChNLnZhbHVlPFQudmFsdWU/e3NvdXJjZTpULHRhcmdldDpNfTp7c291cmNlOk0sdGFyZ2V0OlR9KX1yZXR1cm4gaT92LnNvcnQoaSk6dn12YXIgbj0wLGU9bnVsbCxyPW51bGwsaT1udWxsO3JldHVybiB0LnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPU5kKDAsZSksdCk6bn0sdC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9bnVsbDooaT16ZShuKSkuXz1uLHQpOmkmJmkuX30sdH0sU2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLEVkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sQWQ9TWF0aC5QSSxDZD0yKkFkLHpkPTFlLTYsUGQ9Q2QtemQ7UGUucHJvdG90eXBlPVJlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UGUsbW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K24pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9IlEiKyArdCsiLCIrICtuKyIsIisodGhpcy5feDE9K2UpKyIsIisodGhpcy5feTE9K3IpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArbisiLCIrICtlKyIsIisgK3IrIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsbixlLHIsaSl7dD0rdCxuPStuLGU9K2Uscj0rcixpPStpO3ZhciBvPXRoaXMuX3gxLHU9dGhpcy5feTEsYT1lLXQsYz1yLW4scz1vLXQsZj11LW4sbD1zKnMrZipmO2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZSBpZihsPnpkKWlmKE1hdGguYWJzKGYqYS1jKnMpPnpkJiZpKXt2YXIgaD1lLW8scD1yLXUsZD1hKmErYypjLHY9aCpoK3AqcCxfPU1hdGguc3FydChkKSx5PU1hdGguc3FydChsKSxnPWkqTWF0aC50YW4oKEFkLU1hdGguYWNvcygoZCtsLXYpLygyKl8qeSkpKS8yKSxtPWcveSx4PWcvXztNYXRoLmFicyhtLTEpPnpkJiYodGhpcy5fKz0iTCIrKHQrbSpzKSsiLCIrKG4rbSpmKSksdGhpcy5fKz0iQSIraSsiLCIraSsiLDAsMCwiKyArKGYqaD5zKnApKyIsIisodGhpcy5feDE9dCt4KmEpKyIsIisodGhpcy5feTE9bit4KmMpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dD0rdCxuPStuLGU9K2U7dmFyIHU9ZSpNYXRoLmNvcyhyKSxhPWUqTWF0aC5zaW4ociksYz10K3Uscz1uK2EsZj0xXm8sbD1vP3ItaTppLXI7aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2UpO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitjKyIsIitzOihNYXRoLmFicyh0aGlzLl94MS1jKT56ZHx8TWF0aC5hYnModGhpcy5feTEtcyk+emQpJiYodGhpcy5fKz0iTCIrYysiLCIrcyksZSYmKGw+UGQ/dGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0LXUpKyIsIisobi1hKSsiQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0aGlzLl94MT1jKSsiLCIrKHRoaXMuX3kxPXMpOihsPDAmJihsPWwlQ2QrQ2QpLHRoaXMuXys9IkEiK2UrIiwiK2UrIiwwLCIrICsobD49QWQpKyIsIitmKyIsIisodGhpcy5feDE9dCtlKk1hdGguY29zKGkpKSsiLCIrKHRoaXMuX3kxPW4rZSpNYXRoLnNpbihpKSkpKX0scmVjdDpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pKyJoIisgK2UrInYiKyArcisiaCIrLWUrIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgUmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQsYT1TZC5jYWxsKGFyZ3VtZW50cyksYz1uLmFwcGx5KHRoaXMsYSkscz1lLmFwcGx5KHRoaXMsYSksZj0rci5hcHBseSh0aGlzLChhWzBdPWMsYSkpLGw9aS5hcHBseSh0aGlzLGEpLU1kLGg9by5hcHBseSh0aGlzLGEpLU1kLHA9Zip4ZChsKSxkPWYqYmQobCksdj0rci5hcHBseSh0aGlzLChhWzBdPXMsYSkpLF89aS5hcHBseSh0aGlzLGEpLU1kLHk9by5hcHBseSh0aGlzLGEpLU1kO2lmKHV8fCh1PXQ9UmUoKSksdS5tb3ZlVG8ocCxkKSx1LmFyYygwLDAsZixsLGgpLGw9PT1fJiZoPT09eXx8KHUucXVhZHJhdGljQ3VydmVUbygwLDAsdip4ZChfKSx2KmJkKF8pKSx1LmFyYygwLDAsdixfLHkpKSx1LnF1YWRyYXRpY0N1cnZlVG8oMCwwLHAsZCksdS5jbG9zZVBhdGgoKSx0KXJldHVybiB1PW51bGwsdCsiInx8bnVsbH12YXIgbj1xZSxlPUxlLHI9VWUsaT1EZSxvPU9lLHU9bnVsbDtyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpFZCgrbiksdCk6cn0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RWQoK24pLHQpOml9LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpFZCgrbiksdCk6b30sdC5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnRhcmdldD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT1uP251bGw6bix0KTp1fSx0fSxxZD0iJCI7RmUucHJvdG90eXBlPUllLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RmUsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBxZCt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1txZCt0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbcWQrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49cWQrdDtyZXR1cm4gbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09cWQmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PXFkJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1xZCYmdC5wdXNoKHRoaXNbbl0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PXFkJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpblswXT09PXFkJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PXFkKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1xZCYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgTGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4saSx1LGEpe2lmKGk+PW8ubGVuZ3RoKXJldHVybiBudWxsIT1yP3Iobik6bnVsbCE9ZT9uLnNvcnQoZSk6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPUllKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsWWUsQmUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLGplLEhlKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxqZSxIZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sVWQ9SWUucHJvdG90eXBlO1hlLnByb3RvdHlwZT1WZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhlLGhhczpVZC5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0Kz0iIix0aGlzW3FkK3RdPXQsdGhpc30scmVtb3ZlOlVkLnJlbW92ZSxjbGVhcjpVZC5jbGVhcix2YWx1ZXM6VWQua2V5cyxzaXplOlVkLnNpemUsZW1wdHk6VWQuZW1wdHksZWFjaDpVZC5lYWNofTt2YXIgRGQ9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSxPZD1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LEZkPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSxJZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7dmFyIHIsaSxvPWUodCxmdW5jdGlvbih0LGUpe3JldHVybiByP3IodCxlLTEpOihpPXQsdm9pZChyPW4/JGUodCxuKTpXZSh0KSkpfSk7cmV0dXJuIG8uY29sdW1ucz1pLG99ZnVuY3Rpb24gZSh0LG4pe2Z1bmN0aW9uIGUoKXtpZihmPj1zKXJldHVybiB1O2lmKGkpcmV0dXJuIGk9ITEsbzt2YXIgbixlPWY7aWYoMzQ9PT10LmNoYXJDb2RlQXQoZSkpe2Zvcih2YXIgcj1lO3IrKzxzOylpZigzND09PXQuY2hhckNvZGVBdChyKSl7aWYoMzQhPT10LmNoYXJDb2RlQXQocisxKSlicmVhazsrK3J9cmV0dXJuIGY9cisyLG49dC5jaGFyQ29kZUF0KHIrMSksMTM9PT1uPyhpPSEwLDEwPT09dC5jaGFyQ29kZUF0KHIrMikmJisrZik6MTA9PT1uJiYoaT0hMCksdC5zbGljZShlKzEscikucmVwbGFjZSgvIiIvZywnIicpfWZvcig7ZjxzOyl7dmFyIGE9MTtpZihuPXQuY2hhckNvZGVBdChmKyspLDEwPT09bilpPSEwO2Vsc2UgaWYoMTM9PT1uKWk9ITAsMTA9PT10LmNoYXJDb2RlQXQoZikmJigrK2YsKythKTtlbHNlIGlmKG4hPT1jKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKGUsZi1hKX1yZXR1cm4gdC5zbGljZShlKX1mb3IodmFyIHIsaSxvPXt9LHU9e30sYT1bXSxzPXQubGVuZ3RoLGY9MCxsPTA7KHI9ZSgpKSE9PXU7KXtmb3IodmFyIGg9W107ciE9PW8mJnIhPT11OyloLnB1c2gocikscj1lKCk7biYmbnVsbD09KGg9bihoLGwrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9ZnVuY3Rpb24gcihuLGUpe3JldHVybiBudWxsPT1lJiYoZT1aZShuKSksW2UubWFwKHUpLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUoblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5tYXAobykuam9pbigiXG4iKX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLm1hcCh1KS5qb2luKHQpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PXQ/IiI6YS50ZXN0KHQrPSIiKT8nIicrdC5yZXBsYWNlKC9cIi9nLCciIicpKyciJzp0fXZhciBhPW5ldyBSZWdFeHAoJ1siJyt0KyJcbl0iKSxjPXQuY2hhckNvZGVBdCgwKTtyZXR1cm57cGFyc2U6bixwYXJzZVJvd3M6ZSxmb3JtYXQ6cixmb3JtYXRSb3dzOml9fSxZZD1JZCgiLCIpLEJkPVlkLnBhcnNlLGpkPVlkLnBhcnNlUm93cyxIZD1ZZC5mb3JtYXQsWGQ9WWQuZm9ybWF0Um93cyxWZD1JZCgiXHQiKSxXZD1WZC5wYXJzZSwkZD1WZC5wYXJzZVJvd3MsWmQ9VmQuZm9ybWF0LEdkPVZkLmZvcm1hdFJvd3MsSmQ9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGUsaSxvPXIubGVuZ3RoLHU9MCxhPTA7Zm9yKGU9MDtlPG87KytlKWk9cltlXSx1Kz1pLngsYSs9aS55O2Zvcih1PXUvby10LGE9YS9vLW4sZT0wO2U8bzsrK2UpaT1yW2VdLGkueC09dSxpLnktPWF9dmFyIHI7cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLGUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXR9LGUueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKTp0fSxlLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsZSk6bn0sZX0sUWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxLZD1mdW5jdGlvbigpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX0sdHY9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBHZSh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxudj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciB1LGEsYz1pLWUscz10aGlzLl9yb290O3N3aXRjaChhPShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRvIHU9bmV3IEFycmF5KDQpLHVbYV09cyxzPXU7d2hpbGUoYyo9MixpPWUrYyxvPXIrYyx0Pml8fG4+byk7YnJlYWs7Y2FzZSAxOmRvIHU9bmV3IEFycmF5KDQpLHVbYV09cyxzPXU7d2hpbGUoYyo9MixlPWktYyxvPXIrYyxlPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRvIHU9bmV3IEFycmF5KDQpLHVbYV09cyxzPXU7d2hpbGUoYyo9MixpPWUrYyxyPW8tYyx0Pml8fHI+bik7YnJlYWs7Y2FzZSAzOmRvIHU9bmV3IEFycmF5KDQpLHVbYV09cyxzPXU7d2hpbGUoYyo9MixlPWktYyxyPW8tYyxlPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PXMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGV2PWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRvIHQucHVzaChuLmRhdGEpO3doaWxlKG49bi5uZXh0KX0pLHR9LHJ2PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxpdj1mdW5jdGlvbih0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX0sb3Y9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGEsYyxzLGY9dGhpcy5feDAsbD10aGlzLl95MCxoPXRoaXMuX3gxLHA9dGhpcy5feTEsZD1bXSx2PXRoaXMuX3Jvb3Q7Zm9yKHYmJmQucHVzaChuZXcgaXYodixmLGwsaCxwKSksbnVsbD09ZT9lPTEvMDooZj10LWUsbD1uLWUsaD10K2UscD1uK2UsZSo9ZSk7Yz1kLnBvcCgpOylpZighKCEodj1jLm5vZGUpfHwoaT1jLngwKT5ofHwobz1jLnkwKT5wfHwodT1jLngxKTxmfHwoYT1jLnkxKTxsKSlpZih2Lmxlbmd0aCl7dmFyIF89KGkrdSkvMix5PShvK2EpLzI7ZC5wdXNoKG5ldyBpdih2WzNdLF8seSx1LGEpLG5ldyBpdih2WzJdLGkseSxfLGEpLG5ldyBpdih2WzFdLF8sbyx1LHkpLG5ldyBpdih2WzBdLGksbyxfLHkpKSwocz0obj49eSk8PDF8dD49XykmJihjPWRbZC5sZW5ndGgtMV0sZFtkLmxlbmd0aC0xXT1kW2QubGVuZ3RoLTEtc10sZFtkLmxlbmd0aC0xLXNdPWMpfWVsc2V7dmFyIGc9dC0rdGhpcy5feC5jYWxsKG51bGwsdi5kYXRhKSxtPW4tK3RoaXMuX3kuY2FsbChudWxsLHYuZGF0YSkseD1nKmcrbSptO2lmKHg8ZSl7dmFyIGI9TWF0aC5zcXJ0KGU9eCk7Zj10LWIsbD1uLWIsaD10K2IscD1uK2Iscj12LmRhdGF9fXJldHVybiByfSx1dj1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKHU9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLHUsYSxjLHMsZixsLGgscD10aGlzLl9yb290LGQ9dGhpcy5feDAsdj10aGlzLl95MCxfPXRoaXMuX3gxLHk9dGhpcy5feTE7aWYoIXApcmV0dXJuIHRoaXM7aWYocC5sZW5ndGgpZm9yKDs7KXtpZigocz1vPj0oYT0oZCtfKS8yKSk/ZD1hOl89YSwoZj11Pj0oYz0odit5KS8yKSk/dj1jOnk9YyxuPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gdGhpcztpZighcC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtwLmRhdGEhPT10OylpZihyPXAsIShwPXAubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9cC5uZXh0KSYmZGVsZXRlIHAubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKHA9blswXXx8blsxXXx8blsyXXx8blszXSkmJnA9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFwLmxlbmd0aCYmKGU/ZVtoXT1wOnRoaXMuX3Jvb3Q9cCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sYXY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sY3Y9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkbysrdDt3aGlsZShuPW4ubmV4dCl9KSx0fSxzdj1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLHUsYT1bXSxjPXRoaXMuX3Jvb3Q7Zm9yKGMmJmEucHVzaChuZXcgaXYoYyx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249YS5wb3AoKTspaWYoIXQoYz1uLm5vZGUscj1uLngwLGk9bi55MCxvPW4ueDEsdT1uLnkxKSYmYy5sZW5ndGgpe3ZhciBzPShyK28pLzIsZj0oaSt1KS8yOyhlPWNbM10pJiZhLnB1c2gobmV3IGl2KGUscyxmLG8sdSkpLChlPWNbMl0pJiZhLnB1c2gobmV3IGl2KGUscixmLHMsdSkpLChlPWNbMV0pJiZhLnB1c2gobmV3IGl2KGUscyxpLG8sZikpLChlPWNbMF0pJiZhLnB1c2gobmV3IGl2KGUscixpLHMsZikpfXJldHVybiB0aGlzfSxmdj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgaXYodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sdT1uLngwLGE9bi55MCxjPW4ueDEscz1uLnkxLGY9KHUrYykvMixsPShhK3MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgaXYobyx1LGEsZixsKSksKG89aVsxXSkmJmUucHVzaChuZXcgaXYobyxmLGEsYyxsKSksKG89aVsyXSkmJmUucHVzaChuZXcgaXYobyx1LGwsZixzKSksKG89aVszXSkmJmUucHVzaChuZXcgaXYobyxmLGwsYyxzKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sbHY9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxodj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9LHB2PW5yLnByb3RvdHlwZT1lci5wcm90b3R5cGU7cHYuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgZXIodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PXJyKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09cnIobikpO3JldHVybiBlfSxwdi5hZGQ9dHYscHYuYWRkQWxsPUplLHB2LmNvdmVyPW52LHB2LmRhdGE9ZXYscHYuZXh0ZW50PXJ2LHB2LmZpbmQ9b3YscHYucmVtb3ZlPXV2LHB2LnJlbW92ZUFsbD1RZSxwdi5yb290PWF2LHB2LnNpemU9Y3YscHYudmlzaXQ9c3YscHYudmlzaXRBZnRlcj1mdixwdi54PWx2LHB2Lnk9aHY7dmFyIGR2LHZ2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtmdW5jdGlvbiB0KHQsbixlLHIsaSl7dmFyIG89dC5kYXRhLGE9dC5yLHA9bCthO3tpZighbylyZXR1cm4gbj5zK3B8fHI8cy1wfHxlPmYrcHx8aTxmLXA7aWYoby5pbmRleD5jLmluZGV4KXt2YXIgZD1zLW8ueC1vLnZ4LHY9Zi1vLnktby52eSxfPWQqZCt2KnY7XzxwKnAmJigwPT09ZCYmKGQ9S2QoKSxfKz1kKmQpLDA9PT12JiYodj1LZCgpLF8rPXYqdiksXz0ocC0oXz1NYXRoLnNxcnQoXykpKS9fKnUsYy52eCs9KGQqPV8pKihwPShhKj1hKS8oaCthKSksYy52eSs9KHYqPV8pKnAsby52eC09ZCoocD0xLXApLG8udnktPXYqcCl9fX1mb3IodmFyIG4scixjLHMsZixsLGgscD1pLmxlbmd0aCxkPTA7ZDxhOysrZClmb3Iocj1ucihpLGlyLG9yKS52aXNpdEFmdGVyKGUpLG49MDtuPHA7KytuKWM9aVtuXSxsPW9bYy5pbmRleF0saD1sKmwscz1jLngrYy52eCxmPWMueStjLnZ5LHIudmlzaXQodCl9ZnVuY3Rpb24gZSh0KXtpZih0LmRhdGEpcmV0dXJuIHQucj1vW3QuZGF0YS5pbmRleF07Zm9yKHZhciBuPXQucj0wO248NDsrK24pdFtuXSYmdFtuXS5yPnQuciYmKHQucj10W25dLnIpfWZ1bmN0aW9uIHIoKXtpZihpKXt2YXIgbixlLHI9aS5sZW5ndGg7Zm9yKG89bmV3IEFycmF5KHIpLG49MDtuPHI7KytuKWU9aVtuXSxvW2UuaW5kZXhdPSt0KGUsbixpKX19dmFyIGksbyx1PTEsYT0xO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RZChudWxsPT10PzE6K3QpKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LHIoKX0sbi5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LG4pOmF9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbik6dX0sbi5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpRZCgrZSkscigpLG4pOnR9LG59LF92PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIDEvTWF0aC5taW4oc1t0LnNvdXJjZS5pbmRleF0sc1t0LnRhcmdldC5pbmRleF0pfWZ1bmN0aW9uIGUobil7Zm9yKHZhciBlPTAscj10Lmxlbmd0aDtlPGQ7KytlKWZvcih2YXIgaSxvLGMscyxsLGgscCx2PTA7djxyOysrdilpPXRbdl0sbz1pLnNvdXJjZSxjPWkudGFyZ2V0LHM9Yy54K2Mudngtby54LW8udnh8fEtkKCksbD1jLnkrYy52eS1vLnktby52eXx8S2QoKSxoPU1hdGguc3FydChzKnMrbCpsKSxoPShoLWFbdl0pL2gqbip1W3ZdLHMqPWgsbCo9aCxjLnZ4LT1zKihwPWZbdl0pLGMudnktPWwqcCxvLnZ4Kz1zKihwPTEtcCksby52eSs9bCpwfWZ1bmN0aW9uIHIoKXtpZihjKXt2YXIgbixlLHI9Yy5sZW5ndGgsaD10Lmxlbmd0aCxwPUllKGMsbCk7Zm9yKG49MCxzPW5ldyBBcnJheShyKTtuPGg7KytuKWU9dFtuXSxlLmluZGV4PW4sIm9iamVjdCIhPXR5cGVvZiBlLnNvdXJjZSYmKGUuc291cmNlPWFyKHAsZS5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGUudGFyZ2V0JiYoZS50YXJnZXQ9YXIocCxlLnRhcmdldCkpLHNbZS5zb3VyY2UuaW5kZXhdPShzW2Uuc291cmNlLmluZGV4XXx8MCkrMSxzW2UudGFyZ2V0LmluZGV4XT0oc1tlLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKG49MCxmPW5ldyBBcnJheShoKTtuPGg7KytuKWU9dFtuXSxmW25dPXNbZS5zb3VyY2UuaW5kZXhdLyhzW2Uuc291cmNlLmluZGV4XStzW2UudGFyZ2V0LmluZGV4XSk7dT1uZXcgQXJyYXkoaCksaSgpLGE9bmV3IEFycmF5KGgpLG8oKX19ZnVuY3Rpb24gaSgpe2lmKGMpZm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXVbbl09K2godFtuXSxuLHQpfWZ1bmN0aW9uIG8oKXtpZihjKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbilhW25dPStwKHRbbl0sbix0KX12YXIgdSxhLGMscyxmLGw9dXIsaD1uLHA9UWQoMzApLGQ9MTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLGUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtjPXQscigpfSxlLmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4scigpLGUpOnR9LGUuaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxlKTpsfSxlLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3QsZSk6ZH0sZS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFkKCt0KSxpKCksZSk6aH0sZS5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFkKCt0KSxvKCksZSk6cH0sZX0seXY9MTAsZ3Y9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpLG12PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtlKCksZC5jYWxsKCJ0aWNrIixvKSx1PGEmJihoLnN0b3AoKSxkLmNhbGwoImVuZCIsbykpfWZ1bmN0aW9uIGUoKXt2YXIgbixlLHI9dC5sZW5ndGg7Zm9yKHUrPShzLXUpKmMsbC5lYWNoKGZ1bmN0aW9uKHQpe3QodSl9KSxuPTA7bjxyOysrbillPXRbbl0sbnVsbD09ZS5meD9lLngrPWUudngqPWY6KGUueD1lLmZ4LGUudng9MCksbnVsbD09ZS5meT9lLnkrPWUudnkqPWY6KGUueT1lLmZ5LGUudnk9MCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtpZihuPXRbZV0sbi5pbmRleD1lLGlzTmFOKG4ueCl8fGlzTmFOKG4ueSkpe3ZhciBpPXl2Kk1hdGguc3FydChlKSxvPWUqZ3Y7bi54PWkqTWF0aC5jb3Mobyksbi55PWkqTWF0aC5zaW4obyl9KGlzTmFOKG4udngpfHxpc05hTihuLnZ5KSkmJihuLnZ4PW4udnk9MCl9fWZ1bmN0aW9uIGkobil7cmV0dXJuIG4uaW5pdGlhbGl6ZSYmbi5pbml0aWFsaXplKHQpLG59dmFyIG8sdT0xLGE9LjAwMSxjPTEtTWF0aC5wb3coYSwxLzMwMCkscz0wLGY9LjYsbD1JZSgpLGg9X24obiksZD1wKCJ0aWNrIiwiZW5kIik7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxyKCksbz17dGljazplLHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5yZXN0YXJ0KG4pLG99LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gaC5zdG9wKCksb30sbm9kZXM6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixyKCksbC5lYWNoKGkpLG8pOnR9LGFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG8pOnV9LGFscGhhTWluOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LG8pOmF9LGFscGhhRGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3Qsbyk6K2N9LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKHQpewpyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCxvKTpzfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPTEtdCxvKToxLWZ9LGZvcmNlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09bj9sLnJlbW92ZSh0KTpsLnNldCh0LGkobikpLG8pOmwuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLHUsYSxjLHM9MCxmPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIscz0wO3M8ZjsrK3MpYT10W3NdLGk9bi1hLngsbz1lLWEueSx1PWkqaStvKm8sdTxyJiYoYz1hLHI9dSk7cmV0dXJuIGN9LG9uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oZC5vbih0LG4pLG8pOmQub24odCl9fX0seHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBuLGE9aS5sZW5ndGgsYz1ucihpLGNyLHNyKS52aXNpdEFmdGVyKGUpO2Zvcih1PXQsbj0wO248YTsrK24pbz1pW25dLGMudmlzaXQocil9ZnVuY3Rpb24gbigpe2lmKGkpe3ZhciB0LG4sZT1pLmxlbmd0aDtmb3IoYT1uZXcgQXJyYXkoZSksdD0wO3Q8ZTsrK3Qpbj1pW3RdLGFbbi5pbmRleF09K2Mobix0LGkpfX1mdW5jdGlvbiBlKHQpe3ZhciBuLGUscixpLG8sdT0wO2lmKHQubGVuZ3RoKXtmb3Iocj1pPW89MDtvPDQ7KytvKShuPXRbb10pJiYoZT1uLnZhbHVlKSYmKHUrPWUscis9ZSpuLngsaSs9ZSpuLnkpO3QueD1yL3UsdC55PWkvdX1lbHNle249dCxuLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2RvIHUrPWFbbi5kYXRhLmluZGV4XTt3aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIHIodCxuLGUscil7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGk9dC54LW8ueCxjPXQueS1vLnksaD1yLW4scD1pKmkrYypjO2lmKGgqaC9sPHApcmV0dXJuIHA8ZiYmKDA9PT1pJiYoaT1LZCgpLHArPWkqaSksMD09PWMmJihjPUtkKCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSxvLnZ4Kz1pKnQudmFsdWUqdS9wLG8udnkrPWMqdC52YWx1ZSp1L3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PWYpKXsodC5kYXRhIT09b3x8dC5uZXh0KSYmKDA9PT1pJiYoaT1LZCgpLHArPWkqaSksMD09PWMmJihjPUtkKCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSk7ZG8gdC5kYXRhIT09byYmKGg9YVt0LmRhdGEuaW5kZXhdKnUvcCxvLnZ4Kz1pKmgsby52eSs9YypoKTt3aGlsZSh0PXQubmV4dCl9fXZhciBpLG8sdSxhLGM9UWQoLTMwKSxzPTEsZj0xLzAsbD0uODE7cmV0dXJuIHQuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQsbigpfSx0LnN0cmVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UWQoK2UpLG4oKSx0KTpjfSx0LmRpc3RhbmNlTWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4qbix0KTpNYXRoLnNxcnQocyl9LHQuZGlzdGFuY2VNYXg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bipuLHQpOk1hdGguc3FydChmKX0sdC50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uKm4sdCk6TWF0aC5zcXJ0KGwpfSx0fSxidj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbixlPTAsdT1yLmxlbmd0aDtlPHU7KytlKW49cltlXSxuLnZ4Kz0ob1tlXS1uLngpKmlbZV0qdH1mdW5jdGlvbiBlKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24paVtuXT1pc05hTihvW25dPSt0KHJbbl0sbixyKSk/MDordShyW25dLG4scil9fXZhciByLGksbyx1PVFkKC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UWQobnVsbD09dD8wOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxlKCl9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRZCgrdCksZSgpLG4pOnV9LG4ueD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOlFkKCtyKSxlKCksbik6dH0sbn0sd3Y9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSluPXJbZV0sbi52eSs9KG9bZV0tbi55KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT1RZCguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFkKG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UWQoK3QpLGUoKSxuKTp1fSxuLnk9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpRZCgrciksZSgpLG4pOnR9LG59LE12PWZ1bmN0aW9uKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfSxUdj1mdW5jdGlvbih0KXtyZXR1cm4gdD1NdihNYXRoLmFicyh0KSksdD90WzFdOk5hTn0sTnY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz1bXSx1PTAsYT10WzBdLGM9MDtpPjAmJmE+MCYmKGMrYSsxPnImJihhPU1hdGgubWF4KDEsci1jKSksby5wdXNoKGUuc3Vic3RyaW5nKGktPWEsaSthKSksISgoYys9YSsxKT5yKSk7KWE9dFt1PSh1KzEpJXQubGVuZ3RoXTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihuKX19LGt2PWZ1bmN0aW9uKHQsbil7dD10LnRvUHJlY2lzaW9uKG4pO3Q6Zm9yKHZhciBlLHI9dC5sZW5ndGgsaT0xLG89LTE7aTxyOysraSlzd2l0Y2godFtpXSl7Y2FzZSIuIjpvPWU9aTticmVhaztjYXNlIjAiOjA9PT1vJiYobz1pKSxlPWk7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKGUrMSk6dH0sU3Y9ZnVuY3Rpb24odCxuKXt2YXIgZT1Ndih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdLG89aS0oZHY9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLHU9ci5sZW5ndGg7cmV0dXJuIG89PT11P3I6bz51P3IrbmV3IEFycmF5KG8tdSsxKS5qb2luKCIwIik6bz4wP3Iuc2xpY2UoMCxvKSsiLiIrci5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStNdih0LE1hdGgubWF4KDAsbitvLTEpKVswXX0sRXY9ZnVuY3Rpb24odCxuKXt2YXIgZT1Ndih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfSxBdj17IiI6a3YsIiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4gRXYoMTAwKnQsbil9LHI6RXYsczpTdixYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LEN2PS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pLHp2PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZnIodCl9O2ZyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpK3RoaXMudHlwZX07dmFyIFB2LFJ2PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXSxxdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Z1bmN0aW9uIG4odCl7dmFyIG4saSxjLGc9ZCxtPXY7aWYoImMiPT09cCltPV8odCkrbSx0PSIiO2Vsc2V7dD0rdDt2YXIgeD0odDwwfHwxL3Q8MCkmJih0Kj0tMSwhMCk7aWYodD1fKHQsaCkseClmb3Iobj0tMSxpPXQubGVuZ3RoLHg9ITE7KytuPGk7KWlmKGM9dC5jaGFyQ29kZUF0KG4pLDQ4PGMmJmM8NTh8fCJ4Ij09PXAmJjk2PGMmJmM8MTAzfHwiWCI9PT1wJiY2NDxjJiZjPDcxKXt4PSEwO2JyZWFrfWlmKGc9KHg/IigiPT09YT9hOiItIjoiLSI9PT1hfHwiKCI9PT1hPyIiOmEpK2csbT1tKygicyI9PT1wP1J2WzgrZHYvM106IiIpKyh4JiYiKCI9PT1hPyIpIjoiIikseSlmb3Iobj0tMSxpPXQubGVuZ3RoOysrbjxpOylpZihjPXQuY2hhckNvZGVBdChuKSw0OD5jfHxjPjU3KXttPSg0Nj09PWM/byt0LnNsaWNlKG4rMSk6dC5zbGljZShuKSkrbSx0PXQuc2xpY2UoMCxuKTticmVha319bCYmIXMmJih0PXIodCwxLzApKTt2YXIgYj1nLmxlbmd0aCt0Lmxlbmd0aCttLmxlbmd0aCx3PWI8Zj9uZXcgQXJyYXkoZi1iKzEpLmpvaW4oZSk6IiI7c3dpdGNoKGwmJnMmJih0PXIodyt0LHcubGVuZ3RoP2YtbS5sZW5ndGg6MS8wKSx3PSIiKSx1KXtjYXNlIjwiOnJldHVybiBnK3QrbSt3O2Nhc2UiPSI6cmV0dXJuIGcrdyt0K207Y2FzZSJeIjpyZXR1cm4gdy5zbGljZSgwLGI9dy5sZW5ndGg+PjEpK2crdCttK3cuc2xpY2UoYil9cmV0dXJuIHcrZyt0K219dD16dih0KTt2YXIgZT10LmZpbGwsdT10LmFsaWduLGE9dC5zaWduLGM9dC5zeW1ib2wscz10Lnplcm8sZj10LndpZHRoLGw9dC5jb21tYSxoPXQucHJlY2lzaW9uLHA9dC50eXBlLGQ9IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3QocCk/IjAiK3AudG9Mb3dlckNhc2UoKToiIix2PSIkIj09PWM/aVsxXTovWyVwXS8udGVzdChwKT8iJSI6IiIsXz1BdltwXSx5PSFwfHwvW2RlZmdwcnMlXS8udGVzdChwKTtyZXR1cm4gaD1udWxsPT1oP3A/NjoxMjovW2dwcnNdLy50ZXN0KHApP01hdGgubWF4KDEsTWF0aC5taW4oMjEsaCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsaCkpLG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbn1mdW5jdGlvbiBlKHQsZSl7dmFyIHI9bigodD16dih0KSx0LnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKFR2KGUpLzMpKSksbz1NYXRoLnBvdygxMCwtaSksdT1Sdls4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByKG8qdCkrdX19dmFyIHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/TnYodC5ncm91cGluZyx0LnRob3VzYW5kcyk6bHIsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsO3JldHVybntmb3JtYXQ6bixmb3JtYXRQcmVmaXg6ZX19O2hyKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pO3ZhciBMdj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCwtVHYoTWF0aC5hYnModCkpKX0sVXY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihUdihuKS8zKSkpLVR2KE1hdGguYWJzKHQpKSl9LER2PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsVHYobiktVHYodCkpKzF9LE92PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwcn07cHIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwcixyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe2RyKF9fLHQsdGhpcy50KSxkcih0aGlzLF9fLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1fXy50OnRoaXMucz1fXy50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBGdixJdixZdixCdixqdixIdixYdixWdixXdiwkdixadixHdixKdixRdixLdix0XyxuXyxlXyxyXyxpXyxvXyx1XyxhXyxjXyxzXyxmXyxsXyxoXyxwXyxkXyx2XyxfXz1uZXcgcHIseV89MWUtNixnXz0xZS0xMixtXz1NYXRoLlBJLHhfPW1fLzIsYl89bV8vNCx3Xz0yKm1fLE1fPTE4MC9tXyxUXz1tXy8xODAsTl89TWF0aC5hYnMsa189TWF0aC5hdGFuLFNfPU1hdGguYXRhbjIsRV89TWF0aC5jb3MsQV89TWF0aC5jZWlsLENfPU1hdGguZXhwLHpfPU1hdGgubG9nLFBfPU1hdGgucG93LFJfPU1hdGguc2luLHFfPU1hdGguc2lnbnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfSxMXz1NYXRoLnNxcnQsVV89TWF0aC50YW4sRF89e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXttcih0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspbXIoZVtyXS5nZW9tZXRyeSxuKX19LE9fPXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7eHIodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXhyKGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe2JyKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspYnIoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KW1yKGVbcl0sbil9fSxGXz1mdW5jdGlvbih0LG4pe3QmJkRfLmhhc093blByb3BlcnR5KHQudHlwZSk/RF9bdC50eXBlXSh0LG4pOm1yKHQsbil9LElfPU92KCksWV89T3YoKSxCXz17cG9pbnQ6Z3IsbGluZVN0YXJ0OmdyLGxpbmVFbmQ6Z3IscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SV8ucmVzZXQoKSxCXy5saW5lU3RhcnQ9d3IsQl8ubGluZUVuZD1Ncn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStJXztZXy5hZGQodDwwP3dfK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9Z3J9LHNwaGVyZTpmdW5jdGlvbigpe1lfLmFkZCh3Xyl9fSxqXz1mdW5jdGlvbih0KXtyZXR1cm4gWV8ucmVzZXQoKSxGXyh0LEJfKSwyKllffSxIXz1PdigpLFhfPXtwb2ludDpScixsaW5lU3RhcnQ6THIsbGluZUVuZDpVcixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtYXy5wb2ludD1EcixYXy5saW5lU3RhcnQ9T3IsWF8ubGluZUVuZD1GcixIXy5yZXNldCgpLEJfLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Ql8ucG9seWdvbkVuZCgpLFhfLnBvaW50PVJyLFhfLmxpbmVTdGFydD1McixYXy5saW5lRW5kPVVyLElfPDA/KEh2PS0oVnY9MTgwKSxYdj0tKFd2PTkwKSk6SF8+eV8/V3Y9OTA6SF88LXlfJiYoWHY9LTkwKSxLdlswXT1IdixLdlsxXT1Wdn19LFZfPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhO2lmKFd2PVZ2PS0oSHY9WHY9MS8wKSxRdj1bXSxGXyh0LFhfKSxlPVF2Lmxlbmd0aCl7Zm9yKFF2LnNvcnQoWXIpLG49MSxyPVF2WzBdLG89W3JdO248ZTsrK24paT1RdltuXSxCcihyLGlbMF0pfHxCcihyLGlbMV0pPyhJcihyWzBdLGlbMV0pPklyKHJbMF0sclsxXSkmJihyWzFdPWlbMV0pLElyKGlbMF0sclsxXSk+SXIoclswXSxyWzFdKSYmKHJbMF09aVswXSkpOm8ucHVzaChyPWkpO2Zvcih1PS0oMS8wKSxlPW8ubGVuZ3RoLTEsbj0wLHI9b1tlXTtuPD1lO3I9aSwrK24paT1vW25dLChhPUlyKHJbMV0saVswXSkpPnUmJih1PWEsSHY9aVswXSxWdj1yWzFdKX1yZXR1cm4gUXY9S3Y9bnVsbCxIdj09PTEvMHx8WHY9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbSHYsWHZdLFtWdixXdl1dfSxXXz17c3BoZXJlOmdyLHBvaW50OmpyLGxpbmVTdGFydDpYcixsaW5lRW5kOiRyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1dfLmxpbmVTdGFydD1acixXXy5saW5lRW5kPUdyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7V18ubGluZVN0YXJ0PVhyLFdfLmxpbmVFbmQ9JHJ9fSwkXz1mdW5jdGlvbih0KXt0Xz1uXz1lXz1yXz1pXz1vXz11Xz1hXz1jXz1zXz1mXz0wLEZfKHQsV18pO3ZhciBuPWNfLGU9c18scj1mXyxpPW4qbitlKmUrcipyO3JldHVybiBpPGdfJiYobj1vXyxlPXVfLHI9YV8sbl88eV8mJihuPWVfLGU9cl8scj1pXyksaT1uKm4rZSplK3IqcixpPGdfKT9bTmFOLE5hTl06W1NfKGUsbikqTV8sX3Ioci9MXyhpKSkqTV9dfSxaXz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LEdfPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPXQoZSxyKSxuKGVbMF0sZVsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZuLmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGU9bi5pbnZlcnQoZSxyKSxlJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX07S3IuaW52ZXJ0PUtyO3ZhciBKXyxRXyxLXyx0eSxueSxleSxyeSxpeSxveSx1eSxheSxjeT1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuPXQoblswXSpUXyxuWzFdKlRfKSxuWzBdKj1NXyxuWzFdKj1NXyxufXJldHVybiB0PXRpKHRbMF0qVF8sdFsxXSpUXyx0Lmxlbmd0aD4yP3RbMl0qVF86MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIG49dC5pbnZlcnQoblswXSpUXyxuWzFdKlRfKSxuWzBdKj1NXyxuWzFdKj1NXyxufSxufSxzeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxuKXtlLnB1c2godD1yKHQsbikpLHRbMF0qPU1fLHRbMV0qPU1ffWZ1bmN0aW9uIG4oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpKlRfLGM9dS5hcHBseSh0aGlzLGFyZ3VtZW50cykqVF87cmV0dXJuIGU9W10scj10aSgtdFswXSpUXywtdFsxXSpUXywwKS5pbnZlcnQsaWkoYSxuLGMsMSksdD17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2VdfSxlPXI9bnVsbCx0fXZhciBlLHIsaT1aXyhbMCwwXSksbz1aXyg5MCksdT1aXyg2KSxhPXtwb2ludDp0fTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpaXyhbK3RbMF0sK3RbMV1dKSxuKTppfSxuLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlpfKCt0KSxuKTpvfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlpfKCt0KSxuKTp1fSxufSxmeT1mdW5jdGlvbigpe3ZhciB0LG49W107cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sZSl7dC5wdXNoKFtuLGVdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5wdXNoKHQ9W10pfSxsaW5lRW5kOmdyLHJlam9pbjpmdW5jdGlvbigpe24ubGVuZ3RoPjEmJm4ucHVzaChuLnBvcCgpLmNvbmNhdChuLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9bjtyZXR1cm4gbj1bXSx0PW51bGwsZX19fSxseT1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYT10WzBdLGM9dFsxXSxzPW5bMF0sZj1uWzFdLGw9MCxoPTEscD1zLWEsZD1mLWM7aWYodT1lLWEscHx8ISh1PjApKXtpZih1Lz1wLHA8MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfWVsc2UgaWYocD4wKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9aWYodT1pLWEscHx8ISh1PDApKXtpZih1Lz1wLHA8MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWVsc2UgaWYocD4wKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9aWYodT1yLWMsZHx8ISh1PjApKXtpZih1Lz1kLGQ8MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfWVsc2UgaWYoZD4wKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9aWYodT1vLWMsZHx8ISh1PDApKXtpZih1Lz1kLGQ8MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWVsc2UgaWYoZD4wKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9cmV0dXJuIGw+MCYmKHRbMF09YStsKnAsdFsxXT1jK2wqZCksaDwxJiYoblswXT1hK2gqcCxuWzFdPWMraCpkKSwhMH19fX19LGh5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIE5fKHRbMF0tblswXSk8eV8mJk5fKHRbMV0tblsxXSk8eV99LHB5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sdSxhPVtdLGM9W107aWYodC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEoKG49dC5sZW5ndGgtMSk8PTApKXt2YXIgbixlLHI9dFswXSx1PXRbbl07aWYoaHkocix1KSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX1hLnB1c2goZT1uZXcgdWkocix0LG51bGwsITApKSxjLnB1c2goZS5vPW5ldyB1aShyLG51bGwsZSwhMSkpLGEucHVzaChlPW5ldyB1aSh1LHQsbnVsbCwhMSkpLGMucHVzaChlLm89bmV3IHVpKHUsbnVsbCxlLCEwKSl9fSksYS5sZW5ndGgpe2ZvcihjLnNvcnQobiksYWkoYSksYWkoYyksbz0wLHU9Yy5sZW5ndGg7bzx1OysrbyljW29dLmU9ZT0hZTtmb3IodmFyIHMsZixsPWFbMF07Oyl7Zm9yKHZhciBoPWwscD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtzPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKHApZm9yKG89MCx1PXMubGVuZ3RoO288dTsrK28paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihwKWZvcihzPWgucC56LG89cy5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9aD1oLm8scz1oLnoscD0hcH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fSxkeT0xZTksdnk9LWR5LF95PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9MCxpPTAsbz05NjAsdT01MDA7cmV0dXJuIGU9e3N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDp0PWNpKHIsaSxvLHUpKG49ZSl9LGV4dGVudDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rYVswXVswXSxpPSthWzBdWzFdLG89K2FbMV1bMF0sdT0rYVsxXVsxXSx0PW49bnVsbCxlKTpbW3IsaV0sW28sdV1dfX19LHl5PU92KCksZ3k9e3NwaGVyZTpncixwb2ludDpncixsaW5lU3RhcnQ6c2ksbGluZUVuZDpncixwb2x5Z29uU3RhcnQ6Z3IscG9seWdvbkVuZDpncn0sbXk9ZnVuY3Rpb24odCl7cmV0dXJuIHl5LnJlc2V0KCksRl8odCxneSksK3l5fSx4eT1bbnVsbCxudWxsXSxieT17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6eHl9LHd5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHh5WzBdPXQseHlbMV09bixteShieSl9LE15PWZ1bmN0aW9uKHQsbil7dmFyIGU9dFswXSpUXyxyPXRbMV0qVF8saT1uWzBdKlRfLG89blsxXSpUXyx1PUVfKHIpLGE9Ul8ociksYz1FXyhvKSxzPVJfKG8pLGY9dSpFXyhlKSxsPXUqUl8oZSksaD1jKkVfKGkpLHA9YypSXyhpKSxkPTIqX3IoTF8oeXIoby1yKSt1KmMqeXIoaS1lKSkpLHY9Ul8oZCksXz1kP2Z1bmN0aW9uKHQpe3ZhciBuPVJfKHQqPWQpL3YsZT1SXyhkLXQpL3Yscj1lKmYrbipoLGk9ZSpsK24qcCxvPWUqYStuKnM7cmV0dXJuW1NfKGkscikqTV8sU18obyxMXyhyKnIraSppKSkqTV9dfTpmdW5jdGlvbigpe3JldHVybltlKk1fLHIqTV9dfTtyZXR1cm4gXy5kaXN0YW5jZT1kLF99LFR5PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxOeT1PdigpLGt5PU92KCksU3k9e3BvaW50OmdyLGxpbmVTdGFydDpncixsaW5lRW5kOmdyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1N5LmxpbmVTdGFydD15aSxTeS5saW5lRW5kPXhpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U3kubGluZVN0YXJ0PVN5LmxpbmVFbmQ9U3kucG9pbnQ9Z3IsTnkuYWRkKE5fKGt5KSksa3kucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9TnkvMjtyZXR1cm4gTnkucmVzZXQoKSx0fX0sRXk9MS8wLEF5PUV5LEN5PS1FeSx6eT1DeSxQeT17cG9pbnQ6YmksbGluZVN0YXJ0OmdyLGxpbmVFbmQ6Z3IscG9seWdvblN0YXJ0OmdyLHBvbHlnb25FbmQ6Z3IscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9W1tFeSxBeV0sW0N5LHp5XV07cmV0dXJuIEN5PXp5PS0oQXk9RXk9MS8wKSx0fX0sUnk9MCxxeT0wLEx5PTAsVXk9MCxEeT0wLE95PTAsRnk9MCxJeT0wLFl5PTAsQnk9e3BvaW50OndpLGxpbmVTdGFydDpNaSxsaW5lRW5kOmtpLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0J5LmxpbmVTdGFydD1TaSxCeS5saW5lRW5kPUVpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7QnkucG9pbnQ9d2ksQnkubGluZVN0YXJ0PU1pLEJ5LmxpbmVFbmQ9a2l9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVl5P1tGeS9ZeSxJeS9ZeV06T3k/W1V5L095LER5L095XTpMeT9bUnkvTHkscXkvTHldOltOYU4sTmFOXTtyZXR1cm4gUnk9cXk9THk9VXk9RHk9T3k9Rnk9SXk9WXk9MCx0fX07emkucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsbiksdGhpcy5fY29udGV4dC5hcmModCxuLHRoaXMuX3JhZGl1cywwLHdfKX19LHJlc3VsdDpncn0sUGkucHJvdG90eXBlPXtfY2lyY2xlOlJpKDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NpcmNsZT1SaSh0KSx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9zdHJpbmcucHVzaCgiWiIpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fc3RyaW5nLnB1c2goIkwiLHQsIiwiLG4pO2JyZWFrO2RlZmF1bHQ6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4sdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9fX07dmFyIGp5PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksRl8odCxyKGkpKSksaS5yZXN1bHQoKX12YXIgcixpLG89NC41O3JldHVybiBlLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIEZfKHQscihTeSkpLFN5LnJlc3VsdCgpfSxlLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gRl8odCxyKFB5KSksUHkucmVzdWx0KCl9LGUuY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIEZfKHQscihCeSkpLEJ5LnJlc3VsdCgpfSxlLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj8odD1udWxsLFR5KToodD1uKS5zdHJlYW0sZSk6dH0sZS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KG49bnVsbCxuZXcgUGkpOm5ldyB6aShuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKG8pLGUpOm59LGUucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLGUpOm99LGUucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSxIeT1PdigpLFh5PWZ1bmN0aW9uKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1bUl8oZSksLUVfKGUpLDBdLG89MCx1PTA7SHkucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2E8YzsrK2EpaWYoZj0ocz10W2FdKS5sZW5ndGgpZm9yKHZhciBzLGYsbD1zW2YtMV0saD1sWzBdLHA9bFsxXS8yK2JfLGQ9Ul8ocCksdj1FXyhwKSxfPTA7XzxmOysrXyxoPWcsZD14LHY9YixsPXkpe3ZhciB5PXNbX10sZz15WzBdLG09eVsxXS8yK2JfLHg9Ul8obSksYj1FXyhtKSx3PWctaCxNPXc+PTA/MTotMSxUPU0qdyxOPVQ+bV8saz1kKng7aWYoSHkuYWRkKFNfKGsqTSpSXyhUKSx2KmIraypFXyhUKSkpLG8rPU4/dytNKndfOncsTl5oPj1lXmc+PWUpe3ZhciBTPUFyKFNyKGwpLFNyKHkpKTtQcihTKTt2YXIgRT1BcihpLFMpO1ByKEUpO3ZhciBBPShOXnc+PTA/LTE6MSkqX3IoRVsyXSk7KHI+QXx8cj09PUEmJihTWzBdfHxTWzFdKSkmJih1Kz1OXnc+PTA/MTotMSl9fXJldHVybihvPC15X3x8bzx5XyYmSHk8LXlfKV4xJnV9LFZ5PWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHUobixlKXt2YXIgcj1pKG4sZSk7dChuPXJbMF0sZT1yWzFdKSYmby5wb2ludChuLGUpfWZ1bmN0aW9uIGEodCxuKXt2YXIgZT1pKHQsbik7Xy5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXtiLnBvaW50PWEsXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7Yi5wb2ludD11LF8ubGluZUVuZCgpfWZ1bmN0aW9uIGYodCxuKXt2LnB1c2goW3Qsbl0pO3ZhciBlPWkodCxuKTttLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe20ubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7Zih2WzBdWzBdLHZbMF1bMV0pLG0ubGluZUVuZCgpO3ZhciB0LG4sZSxyLGk9bS5jbGVhbigpLHU9Zy5yZXN1bHQoKSxhPXUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxhKWlmKDEmaSl7aWYoZT11WzBdLChuPWUubGVuZ3RoLTEpPjApe2Zvcih4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KW8ucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYT4xJiYyJmkmJnUucHVzaCh1LnBvcCgpLmNvbmNhdCh1LnNoaWZ0KCkpKSxkLnB1c2godS5maWx0ZXIocWkpKX12YXIgcCxkLHYsXz1uKG8pLHk9aS5pbnZlcnQoclswXSxyWzFdKSxnPWZ5KCksbT1uKGcpLHg9ITEsYj17cG9pbnQ6dSxsaW5lU3RhcnQ6YyxsaW5lRW5kOnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD1mLGIubGluZVN0YXJ0PWwsYi5saW5lRW5kPWgsZD1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWMsYi5saW5lRW5kPXMsZD1LcyhkKTt2YXIgdD1YeShwLHkpO2QubGVuZ3RoPyh4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxweShkLExpLHQsZSxvKSk6dCYmKHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSkseCYmKG8ucG9seWdvbkVuZCgpLHg9ITEpLGQ9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O3JldHVybiBifX0sV3k9VnkoZnVuY3Rpb24oKXtyZXR1cm4hMH0sVWksT2ksWy1tXywteF9dKSwkeT1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyLGksbyl7aWkobyx0LG4saSxlLHIpfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gRV8odCkqRV8obik+YX1mdW5jdGlvbiBpKHQpe3ZhciBuLGUsaSxhLGY7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2E9aT0hMSxmPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIHAsZD1bbCxoXSx2PXIobCxoKSxfPWM/dj8wOnUobCxoKTp2P3UobCsobDwwP21fOi1tXyksaCk6MDtpZighbiYmKGE9aT12KSYmdC5saW5lU3RhcnQoKSx2IT09aSYmKHA9byhuLGQpLChoeShuLHApfHxoeShkLHApKSYmKGRbMF0rPXlfLGRbMV0rPXlfLHY9cihkWzBdLGRbMV0pKSksdiE9PWkpZj0wLHY/KHQubGluZVN0YXJ0KCkscD1vKGQsbiksdC5wb2ludChwWzBdLHBbMV0pKToocD1vKG4sZCksdC5wb2ludChwWzBdLHBbMV0pLHQubGluZUVuZCgpKSxuPXA7ZWxzZSBpZihzJiZuJiZjXnYpe3ZhciB5O18mZXx8ISh5PW8oZCxuLCEwKSl8fChmPTAsYz8odC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSksdC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh5WzBdWzBdLHlbMF1bMV0pKSl9IXZ8fG4mJmh5KG4sZCl8fHQucG9pbnQoZFswXSxkWzFdKSxuPWQsaT12LGU9X30sbGluZUVuZDpmdW5jdGlvbigpe2kmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gZnwoYSYmaSk8PDF9fX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1Tcih0KSxpPVNyKG4pLG89WzEsMCwwXSx1PUFyKHIsaSksYz1Fcih1LHUpLHM9dVswXSxmPWMtcypzO2lmKCFmKXJldHVybiFlJiZ0O3ZhciBsPWEqYy9mLGg9LWEqcy9mLHA9QXIobyx1KSxkPXpyKG8sbCksdj16cih1LGgpO0NyKGQsdik7dmFyIF89cCx5PUVyKGQsXyksZz1FcihfLF8pLG09eSp5LWcqKEVyKGQsZCktMSk7aWYoIShtPDApKXt2YXIgeD1MXyhtKSxiPXpyKF8sKC15LXgpL2cpO2lmKENyKGIsZCksYj1rcihiKSwhZSlyZXR1cm4gYjt2YXIgdyxNPXRbMF0sVD1uWzBdLE49dFsxXSxrPW5bMV07VDxNJiYodz1NLE09VCxUPXcpO3ZhciBTPVQtTSxFPU5fKFMtbV8pPHlfLEE9RXx8Uzx5XztpZighRSYmazxOJiYodz1OLE49ayxrPXcpLEE/RT9OK2s+MF5iWzFdPChOXyhiWzBdLU0pPHlfP046ayk6Tjw9YlsxXSYmYlsxXTw9azpTPm1fXihNPD1iWzBdJiZiWzBdPD1UKSl7dmFyIEM9enIoXywoLXkreCkvZyk7cmV0dXJuIENyKEMsZCksW2Isa3IoQyldfX19ZnVuY3Rpb24gdShuLGUpe3ZhciByPWM/dDptXy10LGk9MDtyZXR1cm4gbjwtcj9pfD0xOm4+ciYmKGl8PTIpLGU8LXI/aXw9NDplPnImJihpfD04KSxpfXZhciBhPUVfKHQpLGM9YT4wLHM9Tl8oYSk+eV87cmV0dXJuIFZ5KHIsaSxlLGM/WzAsLXRdOlstbV8sdC1tX10pfSxaeT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOkZpKHQpfX07SWkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpJaSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTt2YXIgR3k9MTYsSnk9RV8oMzAqVF8pLFF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuK24/SGkodCxuKTpqaSh0KX0sS3k9Rmkoe3BvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCpUXyxuKlRfKX19KSx0Zz1mdW5jdGlvbigpe3JldHVybiBXaShaaSkuc2NhbGUoMTU1LjQyNCkuY2VudGVyKFswLDMzLjY0NDJdKX0sbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGcoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX0sZWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBuPXRbMF0sZT10WzFdO3JldHVybiBhPW51bGwsaS5wb2ludChuLGUpLGF8fChvLnBvaW50KG4sZSksYSl8fCh1LnBvaW50KG4sZSksYSl9ZnVuY3Rpb24gbigpe3JldHVybiBlPXI9bnVsbCx0fXZhciBlLHIsaSxvLHUsYSxjPW5nKCkscz10ZygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj10ZygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxsPXtwb2ludDpmdW5jdGlvbih0LG4pe2E9W3Qsbl19fTtyZXR1cm4gdC5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIG49Yy5zY2FsZSgpLGU9Yy50cmFuc2xhdGUoKSxyPSh0WzBdLWVbMF0pL24saT0odFsxXS1lWzFdKS9uO3JldHVybihpPj0uMTImJmk8LjIzNCYmcj49LS40MjUmJnI8LS4yMTQ/czppPj0uMTY2JiZpPC4yMzQmJnI+PS0uMjE0JiZyPC0uMTE1P2Y6YykuaW52ZXJ0KHQpfSx0LnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gZSYmcj09PXQ/ZTplPUdpKFtjLnN0cmVhbShyPXQpLHMuc3RyZWFtKHQpLGYuc3RyZWFtKHQpXSl9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjLnByZWNpc2lvbih0KSxzLnByZWNpc2lvbih0KSxmLnByZWNpc2lvbih0KSxuKCkpOmMucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMuc2NhbGUobikscy5zY2FsZSguMzUqbiksZi5zY2FsZShuKSx0LnRyYW5zbGF0ZShjLnRyYW5zbGF0ZSgpKSk6Yy5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYy50cmFuc2xhdGUoKTt2YXIgZT1jLnNjYWxlKCkscj0rdFswXSxhPSt0WzFdO3JldHVybiBpPWMudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tyLS40NTUqZSxhLS4yMzgqZV0sW3IrLjQ1NSplLGErLjIzOCplXV0pLnN0cmVhbShsKSxvPXMudHJhbnNsYXRlKFtyLS4zMDcqZSxhKy4yMDEqZV0pLmNsaXBFeHRlbnQoW1tyLS40MjUqZSt5XyxhKy4xMiplK3lfXSxbci0uMjE0KmUteV8sYSsuMjM0KmUteV9dXSkuc3RyZWFtKGwpLHU9Zi50cmFuc2xhdGUoW3ItLjIwNSplLGErLjIxMiplXSkuY2xpcEV4dGVudChbW3ItLjIxNCplK3lfLGErLjE2NiplK3lfXSxbci0uMTE1KmUteV8sYSsuMjM0KmUteV9dXSkuc3RyZWFtKGwpLG4oKX0sdC5maXRFeHRlbnQ9ZnVuY3Rpb24obixlKXtyZXR1cm4gWWkodCxuLGUpfSx0LmZpdFNpemU9ZnVuY3Rpb24obixlKXtyZXR1cm4gQmkodCxuLGUpfSx0LnNjYWxlKDEwNzApfSxyZz1KaShmdW5jdGlvbih0KXtyZXR1cm4gTF8oMi8oMSt0KSl9KTtyZy5pbnZlcnQ9UWkoZnVuY3Rpb24odCl7cmV0dXJuIDIqX3IodC8yKX0pO3ZhciBpZz1mdW5jdGlvbigpe3JldHVybiBYaShyZykuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LG9nPUppKGZ1bmN0aW9uKHQpe3JldHVybih0PXZyKHQpKSYmdC9SXyh0KX0pO29nLmludmVydD1RaShmdW5jdGlvbih0KXtyZXR1cm4gdH0pO3ZhciB1Zz1mdW5jdGlvbigpe3JldHVybiBYaShvZykuc2NhbGUoNzkuNDE4OCkuY2xpcEFuZ2xlKDE3OS45OTkpfTtLaS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdCwyKmtfKENfKG4pKS14X119O3ZhciBhZz1mdW5jdGlvbigpe3JldHVybiB0byhLaSkuc2NhbGUoOTYxL3dfKX0sY2c9ZnVuY3Rpb24oKXtyZXR1cm4gV2koZW8pLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9O3JvLmludmVydD1ybzt2YXIgc2c9ZnVuY3Rpb24oKXtyZXR1cm4gWGkocm8pLnNjYWxlKDE1Mi42Myl9LGZnPWZ1bmN0aW9uKCl7cmV0dXJuIFdpKGlvKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfTtvby5pbnZlcnQ9UWkoa18pO3ZhciBsZz1mdW5jdGlvbigpe3JldHVybiBYaShvbykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0saGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIGk9bz1udWxsLHV9dmFyIG4sZSxyLGksbyx1LGE9MSxjPTAscz0wLGY9MSxsPTEsaD1UeSxwPW51bGwsZD1UeTtyZXR1cm4gdT17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBpJiZvPT09dD9pOmk9aChkKG89dCkpfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PWk/KHA9bj1lPXI9bnVsbCxUeSk6Y2kocD0raVswXVswXSxuPStpWzBdWzFdLGU9K2lbMV1bMF0scj0raVsxXVsxXSksdCgpKTpudWxsPT1wP251bGw6W1twLG5dLFtlLHJdXX0sc2NhbGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9dW8oKGE9K24pKmYsYSpsLGMscyksdCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9dW8oYSpmLGEqbCxjPStuWzBdLHM9K25bMV0pLHQoKSk6W2Msc119LHJlZmxlY3RYOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPXVvKGEqKGY9bj8tMToxKSxhKmwsYyxzKSx0KCkpOmY8MH0scmVmbGVjdFk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9dW8oYSpmLGEqKGw9bj8tMToxKSxjLHMpLHQoKSk6bDwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gWWkodSx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIEJpKHUsdCxuKX19fTthby5pbnZlcnQ9UWkoX3IpO3ZhciBwZz1mdW5jdGlvbigpe3JldHVybiBYaShhbykuc2NhbGUoMjQ5LjUpLmNsaXBBbmdsZSg5MCt5Xyl9O2NvLmludmVydD1RaShmdW5jdGlvbih0KXtyZXR1cm4gMiprXyh0KX0pO3ZhciBkZz1mdW5jdGlvbigpe3JldHVybiBYaShjbykuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX07c28uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuWy1uLDIqa18oQ18odCkpLXhfXX07dmFyIHZnPWZ1bmN0aW9uKCl7dmFyIHQ9dG8oc28pLG49dC5jZW50ZXIsZT10LnJvdGF0ZTtyZXR1cm4gdC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihbLXRbMV0sdFswXV0pOih0PW4oKSxbdFsxXSwtdFswXV0pfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6KHQ9ZSgpLFt0WzBdLHRbMV0sdFsyXS05MF0pfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sX2c9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHU9MDt0LmVhY2hBZnRlcihmdW5jdGlvbih0KXt2YXIgZT10LmNoaWxkcmVuO2U/KHQueD1sbyhlKSx0Lnk9cG8oZSkpOih0Lng9bz91Kz1uKHQsbyk6MCx0Lnk9MCxvPXQpfSk7dmFyIGE9X28odCksYz15byh0KSxzPWEueC1uKGEsYykvMixmPWMueCtuKGMsYSkvMjtyZXR1cm4gdC5lYWNoQWZ0ZXIoaT9mdW5jdGlvbihuKXtuLng9KG4ueC10LngpKmUsbi55PSh0Lnktbi55KSpyfTpmdW5jdGlvbihuKXtuLng9KG4ueC1zKS8oZi1zKSplLG4ueT0oMS0odC55P24ueS90Lnk6MSkpKnJ9KX12YXIgbj1mbyxlPTEscj0xLGk9ITE7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPStuWzBdLHI9K25bMV0sdCk6aT9udWxsOltlLHJdfSx0Lm5vZGVTaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K25bMF0scj0rblsxXSx0KTppP1tlLHJdOm51bGx9LHR9LHlnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGdvKX0sZ2c9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10aGlzLHU9W29dO2RvIGZvcihuPXUucmV2ZXJzZSgpLHU9W107bz1uLnBvcCgpOylpZih0KG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcil1LnB1c2goZVtyXSk7d2hpbGUodS5sZW5ndGgpO3JldHVybiB0aGlzfSxtZz1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXRoaXMsaT1bcl07cj1pLnBvcCgpOylpZih0KHIpLG49ci5jaGlsZHJlbilmb3IoZT1uLmxlbmd0aC0xO2U+PTA7LS1lKWkucHVzaChuW2VdKTtyZXR1cm4gdGhpc30seGc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXRoaXMsbz1baV0sdT1bXTtpPW8ucG9wKCk7KWlmKHUucHVzaChpKSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pO2Zvcig7aT11LnBvcCgpOyl0KGkpO3JldHVybiB0aGlzfSxiZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSx3Zz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pfSxNZz1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcyxlPW1vKG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LFRnPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsbj1bdF07dD10LnBhcmVudDspbi5wdXNoKHQpO3JldHVybiBufSxOZz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dC5wdXNoKG4pfSksdH0sa2c9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fHQucHVzaChuKX0pLHR9LFNnPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goZnVuY3Rpb24oZSl7ZSE9PXQmJm4ucHVzaCh7c291cmNlOmUucGFyZW50LHRhcmdldDplfSl9KSxufTtOby5wcm90b3R5cGU9eG8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpObyxjb3VudDp5ZyxlYWNoOmdnLGVhY2hBZnRlcjp4ZyxlYWNoQmVmb3JlOm1nLHN1bTpiZyxzb3J0OndnLHBhdGg6TWcsYW5jZXN0b3JzOlRnLGRlc2NlbmRhbnRzOk5nLGxlYXZlczprZyxsaW5rczpTZyxjb3B5OmJvfTt2YXIgRWc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9KHQ9dC5zbGljZSgpKS5sZW5ndGgscj1udWxsLGk9cjtlOyl7dmFyIG89bmV3IGtvKHRbZS0xXSk7aT1pP2kubmV4dD1vOnI9byx0W25dPXRbLS1lXX1yZXR1cm57aGVhZDpyLHRhaWw6aX19LEFnPWZ1bmN0aW9uKHQpe3JldHVybiBFbyhFZyh0KSxbXSl9LENnPWZ1bmN0aW9uKHQpe3JldHVybiBEbyh0KSx0fSx6Zz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LFBnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC54PWUvMix0Lnk9ci8yLG4/dC5lYWNoQmVmb3JlKEJvKG4pKS5lYWNoQWZ0ZXIoam8oaSwuNSkpLmVhY2hCZWZvcmUoSG8oMSkpOnQuZWFjaEJlZm9yZShCbyhZbykpLmVhY2hBZnRlcihqbyhJbywxKSkuZWFjaEFmdGVyKGpvKGksdC5yL01hdGgubWluKGUscikpKS5lYWNoQmVmb3JlKEhvKE1hdGgubWluKGUscikvKDIqdC5yKSkpLHR9dmFyIG49bnVsbCxlPTEscj0xLGk9SW87cmV0dXJuIHQucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPU9vKGUpLHQpOm59LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rblswXSxyPStuWzFdLHQpOltlLHJdfSx0LnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp6ZygrbiksdCk6aX0sdH0sUmc9ZnVuY3Rpb24odCl7dC54MD1NYXRoLnJvdW5kKHQueDApLHQueTA9TWF0aC5yb3VuZCh0LnkwKSx0LngxPU1hdGgucm91bmQodC54MSksdC55MT1NYXRoLnJvdW5kKHQueTEpfSxxZz1mdW5jdGlvbih0LG4sZSxyLGkpe2Zvcih2YXIgbyx1PXQuY2hpbGRyZW4sYT0tMSxjPXUubGVuZ3RoLHM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK2E8Yzspbz11W2FdLG8ueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpzfSxMZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHU9dC5oZWlnaHQrMTtyZXR1cm4gdC54MD10LnkwPWksdC54MT1lLHQueTE9ci91LHQuZWFjaEJlZm9yZShuKHIsdSkpLG8mJnQuZWFjaEJlZm9yZShSZyksdH1mdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJnFnKGUsZS54MCx0KihlLmRlcHRoKzEpL24sZS54MSx0KihlLmRlcHRoKzIpL24pO3ZhciByPWUueDAsbz1lLnkwLHU9ZS54MS1pLGE9ZS55MS1pO3U8ciYmKHI9dT0ocit1KS8yKSxhPG8mJihvPWE9KG8rYSkvMiksZS54MD1yLGUueTA9byxlLngxPXUsZS55MT1hfX12YXIgZT0xLHI9MSxpPTAsbz0hMTtyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0hIW4sdCk6b30sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rbix0KTppfSx0fSxVZz0iJCIsRGc9e2RlcHRoOi0xfSxPZz17fSxGZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHIsaSxvLHUsYSxjLHMsZj10Lmxlbmd0aCxsPW5ldyBBcnJheShmKSxoPXt9O2ZvcihpPTA7aTxmOysraSlyPXRbaV0sYT1sW2ldPW5ldyBObyhyKSxudWxsIT0oYz1uKHIsaSx0KSkmJihjKz0iIikmJihzPVVnKyhhLmlkPWMpLGhbc109cyBpbiBoP09nOmEpO2ZvcihpPTA7aTxmOysraSlpZihhPWxbaV0sYz1lKHRbaV0saSx0KSxudWxsIT1jJiYoYys9IiIpKXtpZih1PWhbVWcrY10sIXUpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2MpO2lmKHU9PT1PZyl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitjKTt1LmNoaWxkcmVuP3UuY2hpbGRyZW4ucHVzaChhKTp1LmNoaWxkcmVuPVthXSxhLnBhcmVudD11fWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1hfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PURnLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1mfSkuZWFjaEJlZm9yZShUbyksby5wYXJlbnQ9bnVsbCxmPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXZhciBuPVhvLGU9Vm87cmV0dXJuIHQuaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Rm8oZSksdCk6bn0sdC5wYXJlbnRJZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1GbyhuKSx0KTplfSx0fTtLby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShOby5wcm90b3R5cGUpO3ZhciBJZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHI9dHUodCk7aWYoci5lYWNoQWZ0ZXIobiksci5wYXJlbnQubT0tci56LHIuZWFjaEJlZm9yZShlKSxjKXQuZWFjaEJlZm9yZShpKTtlbHNle3ZhciBzPXQsZj10LGw9dDt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PHMueCYmKHM9dCksdC54PmYueCYmKGY9dCksdC5kZXB0aD5sLmRlcHRoJiYobD10KX0pO3ZhciBoPXM9PT1mPzE6byhzLGYpLzIscD1oLXMueCxkPXUvKGYueCtoK3ApLHY9YS8obC5kZXB0aHx8MSk7dC5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueD0odC54K3ApKmQsdC55PXQuZGVwdGgqdn0pfXJldHVybiB0fWZ1bmN0aW9uIG4odCl7dmFyIG49dC5jaGlsZHJlbixlPXQucGFyZW50LmNoaWxkcmVuLGk9dC5pP2VbdC5pLTFdOm51bGw7aWYobil7Sm8odCk7dmFyIHU9KG5bMF0ueituW24ubGVuZ3RoLTFdLnopLzI7aT8odC56PWkueitvKHQuXyxpLl8pLHQubT10LnotdSk6dC56PXV9ZWxzZSBpJiYodC56PWkueitvKHQuXyxpLl8pKTt0LnBhcmVudC5BPXIodCxpLHQucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIGUodCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIHIodCxuLGUpe2lmKG4pe2Zvcih2YXIgcixpPXQsdT10LGE9bixjPWkucGFyZW50LmNoaWxkcmVuWzBdLHM9aS5tLGY9dS5tLGw9YS5tLGg9Yy5tO2E9Wm8oYSksaT0kbyhpKSxhJiZpOyljPSRvKGMpLHU9Wm8odSksdS5hPXQscj1hLnorbC1pLnotcytvKGEuXyxpLl8pLHI+MCYmKEdvKFFvKGEsdCxlKSx0LHIpLHMrPXIsZis9ciksbCs9YS5tLHMrPWkubSxoKz1jLm0sZis9dS5tO2EmJiFabyh1KSYmKHUudD1hLHUubSs9bC1mKSxpJiYhJG8oYykmJihjLnQ9aSxjLm0rPXMtaCxlPXQpfXJldHVybiBlfWZ1bmN0aW9uIGkodCl7dC54Kj11LHQueT10LmRlcHRoKmF9dmFyIG89V28sdT0xLGE9MSxjPW51bGw7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0hMSx1PStuWzBdLGE9K25bMV0sdCk6Yz9udWxsOlt1LGFdfSx0Lm5vZGVTaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSEwLHU9K25bMF0sYT0rblsxXSx0KTpjP1t1LGFdOm51bGx9LHR9LFlnPWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoaS1lKS90LnZhbHVlOysrYTxjOylvPXVbYV0sby54MD1uLG8ueDE9cixvLnkwPWUsby55MT1lKz1vLnZhbHVlKnN9LEJnPSgxK01hdGguc3FydCg1KSkvMixqZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtudShuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQmcpLEhnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1pLHQueTE9byx0LmVhY2hCZWZvcmUobiksdT1bMF0sciYmdC5lYWNoQmVmb3JlKFJnKSx0fWZ1bmN0aW9uIG4odCl7dmFyIG49dVt0LmRlcHRoXSxyPXQueDArbixpPXQueTArbixvPXQueDEtbixoPXQueTEtbjtvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLHQueDA9cix0LnkwPWksdC54MT1vLHQueTE9aCx0LmNoaWxkcmVuJiYobj11W3QuZGVwdGgrMV09YSh0KS8yLHIrPWwodCktbixpKz1jKHQpLW4sby09cyh0KS1uLGgtPWYodCktbixvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLGUodCxyLGksbyxoKSl9dmFyIGU9amcscj0hMSxpPTEsbz0xLHU9WzBdLGE9SW8sYz1JbyxzPUlvLGY9SW8sbD1JbztyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIW4sdCk6cn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuWzBdLG89K25bMV0sdCk6W2ksb119LHQudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1GbyhuKSx0KTplfSx0LnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nSW5uZXIobikucGFkZGluZ091dGVyKG4pOnQucGFkZGluZ0lubmVyKCl9LHQucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246emcoK24pLHQpOmF9LHQucGFkZGluZ091dGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QucGFkZGluZ1RvcChuKS5wYWRkaW5nUmlnaHQobikucGFkZGluZ0JvdHRvbShuKS5wYWRkaW5nTGVmdChuKTp0LnBhZGRpbmdUb3AoKX0sdC5wYWRkaW5nVG9wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246emcoK24pLHQpOmN9LHQucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246emcoK24pLHQpOnN9LHQucGFkZGluZ0JvdHRvbT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnpnKCtuKSx0KTpmfSx0LnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246emcoK24pLHQpOmx9LHR9LFhnPWZ1bmN0aW9uKHQsbixlLHIsaSl7ZnVuY3Rpb24gbyh0LG4sZSxyLGksdSxhKXtpZih0Pj1uLTEpe3ZhciBzPWNbdF07cmV0dXJuIHMueDA9cixzLnkwPWkscy54MT11LHMueTE9YSx2b2lkIDB9Zm9yKHZhciBsPWZbdF0saD1lLzIrbCxwPXQrMSxkPW4tMTtwPGQ7KXt2YXIgdj1wK2Q+Pj4xO2Zbdl08aD9wPXYrMTpkPXZ9dmFyIF89ZltwXS1sLHk9ZS1fO2lmKGEtaT51LXIpe3ZhciBnPShpKnkrYSpfKS9lO28odCxwLF8scixpLHUsZyksbyhwLG4seSxyLGcsdSxhKX1lbHNle3ZhciBtPShyKnkrdSpfKS9lO28odCxwLF8scixpLG0sYSksbyhwLG4seSxtLGksdSxhKX19dmFyIHUsYSxjPXQuY2hpbGRyZW4scz1jLmxlbmd0aCxmPW5ldyBBcnJheShzKzEpO2ZvcihmWzBdPWE9dT0wO3U8czsrK3UpZlt1KzFdPWErPWNbdV0udmFsdWU7bygwLHMsdC52YWx1ZSxuLGUscixpKX0sVmc9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1lnOnFnKSh0LG4sZSxyLGkpfSxXZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtpZigodT10Ll9zcXVhcmlmeSkmJnUucmF0aW89PT1uKWZvcih2YXIgdSxhLGMscyxmLGw9LTEsaD11Lmxlbmd0aCxwPXQudmFsdWU7KytsPGg7KXtmb3IoYT11W2xdLGM9YS5jaGlsZHJlbixzPWEudmFsdWU9MCxmPWMubGVuZ3RoO3M8ZjsrK3MpYS52YWx1ZSs9Y1tzXS52YWx1ZTthLmRpY2U/cWcoYSxlLHIsaSxyKz0oby1yKSphLnZhbHVlL3ApOllnKGEsZSxyLGUrPShpLWUpKmEudmFsdWUvcCxvKSxwLT1hLnZhbHVlfWVsc2UgdC5fc3F1YXJpZnk9dT1udShuLHQsZSxyLGksbyksdS5yYXRpbz1ufXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KEJnKSwkZz1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLG89MDsrK2U8cjspbj1pLGk9dFtlXSxvKz1uWzFdKmlbMF0tblswXSppWzFdO3JldHVybiBvLzJ9LFpnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0sR2c9ZnVuY3Rpb24odCxuLGUpe3JldHVybihuWzBdLXRbMF0pKihlWzFdLXRbMV0pLShuWzFdLXRbMV0pKihlWzBdLXRbMF0pfSxKZz1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KGV1KSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1ydShyKSx1PXJ1KGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSxRZz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpbz10W2xdLGU9b1swXSxyPW9bMV0scj5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LEtnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPXRbaS0xXSx1PW9bMF0sYT1vWzFdLGM9MDsrK3I8aTspbj11LGU9YSxvPXRbcl0sdT1vWzBdLGE9b1sxXSxuLT11LGUtPWEsYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSx0bT1bXS5zbGljZSxubT17fTtpdS5wcm90b3R5cGU9ZnUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppdSxkZWZlcjpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8dGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3I7aWYobnVsbCE9dGhpcy5fZXJyb3IpcmV0dXJuIHRoaXM7dmFyIG49dG0uY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG4ucHVzaCh0KSwrK3RoaXMuX3dhaXRpbmcsdGhpcy5fdGFza3MucHVzaChuKSxvdSh0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9lcnJvciYmY3UodGhpcyxuZXcgRXJyb3IoImFib3J0IikpLHRoaXN9LGF3YWl0OmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihuLGUpe3QuYXBwbHkobnVsbCxbbl0uY29uY2F0KGUpKX0sc3UodGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLl9jYWxsPXQsc3UodGhpcyksdGhpc319O3ZhciBlbT1mdW5jdGlvbih0LG4pe3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbiwxPT09YXJndW1lbnRzLmxlbmd0aD8obj10LHQ9MCk6bi09dCxmdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpKm4rdH19LHJtPWZ1bmN0aW9uKHQsbil7dmFyIGUscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgaTtpZihudWxsIT1lKWk9ZSxlPW51bGw7ZWxzZSBkbyBlPTIqTWF0aC5yYW5kb20oKS0xLGk9MipNYXRoLnJhbmRvbSgpLTEscj1lKmUraSppO3doaWxlKCFyfHxyPjEpO3JldHVybiB0K24qaSpNYXRoLnNxcnQoLTIqTWF0aC5sb2cocikvcil9fSxpbT1mdW5jdGlvbigpe3ZhciB0PXJtLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19LG9tPWZ1bmN0aW9uKHQpewpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49MCxlPTA7ZTx0OysrZSluKz1NYXRoLnJhbmRvbSgpO3JldHVybiBufX0sdW09ZnVuY3Rpb24odCl7dmFyIG49b20odCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4oKS90fX0sYW09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtTWF0aC5yYW5kb20oKSkvdH19LGNtPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSh0KXt2YXIgbixlPXMuc3RhdHVzO2lmKCFlJiZodShzKXx8ZT49MjAwJiZlPDMwMHx8MzA0PT09ZSl7aWYobyl0cnl7bj1vLmNhbGwocixzKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBhLmNhbGwoImVycm9yIixyLHQpfWVsc2Ugbj1zO2EuY2FsbCgibG9hZCIscixuKX1lbHNlIGEuY2FsbCgiZXJyb3IiLHIsdCl9dmFyIHIsaSxvLHUsYT1wKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxjPUllKCkscz1uZXcgWE1MSHR0cFJlcXVlc3QsZj1udWxsLGw9bnVsbCxoPTA7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBYRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBzfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHQpfHwocz1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gcz9zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZTpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbih0KXtzLnJlYWR5U3RhdGU+MyYmZSh0KX0scy5vbnByb2dyZXNzPWZ1bmN0aW9uKHQpe2EuY2FsbCgicHJvZ3Jlc3MiLHIsdCl9LHI9e2hlYWRlcjpmdW5jdGlvbih0LG4pe3JldHVybiB0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9jLmdldCh0KToobnVsbD09bj9jLnJlbW92ZSh0KTpjLnNldCh0LG4rIiIpLHIpfSxtaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6dCsiIixyKTppfSxyZXNwb25zZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxyKTp1fSx0aW1lb3V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LHIpOmh9LHVzZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT9mOihmPW51bGw9PXQ/bnVsbDp0KyIiLHIpfSxwYXNzd29yZDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2w6KGw9bnVsbD09dD9udWxsOnQrIiIscil9LHJlc3BvbnNlOmZ1bmN0aW9uKHQpe3JldHVybiBvPXQscn0sZ2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiR0VUIix0LG4pfSxwb3N0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiUE9TVCIsdCxuKX0sc2VuZDpmdW5jdGlvbihuLGUsbyl7cmV0dXJuIHMub3BlbihuLHQsITAsZixsKSxudWxsPT1pfHxjLmhhcygiYWNjZXB0Iil8fGMuc2V0KCJhY2NlcHQiLGkrIiwqLyoiKSxzLnNldFJlcXVlc3RIZWFkZXImJmMuZWFjaChmdW5jdGlvbih0LG4pe3Muc2V0UmVxdWVzdEhlYWRlcihuLHQpfSksbnVsbCE9aSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoaSksbnVsbCE9dSYmKHMucmVzcG9uc2VUeXBlPXUpLGg+MCYmKHMudGltZW91dD1oKSxudWxsPT1vJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG89ZSxlPW51bGwpLG51bGwhPW8mJjE9PT1vLmxlbmd0aCYmKG89bHUobykpLG51bGwhPW8mJnIub24oImVycm9yIixvKS5vbigibG9hZCIsZnVuY3Rpb24odCl7byhudWxsLHQpfSksYS5jYWxsKCJiZWZvcmVzZW5kIixyLHMpLHMuc2VuZChudWxsPT1lP251bGw6ZSkscn0sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hYm9ydCgpLHJ9LG9uOmZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP3I6dH19LG51bGwhPW4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtyZXR1cm4gci5nZXQobil9cmV0dXJuIHJ9LHNtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIGk9Y20oZSkubWltZVR5cGUodCkucmVzcG9uc2Uobik7aWYobnVsbCE9cil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK3IpO3JldHVybiBpLmdldChyKX1yZXR1cm4gaX19LGZtPXNtKCJ0ZXh0L2h0bWwiLGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9KSxsbT1zbSgiYXBwbGljYXRpb24vanNvbiIsZnVuY3Rpb24odCl7cmV0dXJuIEpTT04ucGFyc2UodC5yZXNwb25zZVRleHQpfSksaG09c20oInRleHQvcGxhaW4iLGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlVGV4dH0pLHBtPXNtKCJhcHBsaWNhdGlvbi94bWwiLGZ1bmN0aW9uKHQpe3ZhciBuPXQucmVzcG9uc2VYTUw7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJwYXJzZSBlcnJvciIpO3JldHVybiBufSksZG09ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9cixyPW51bGwpO3ZhciBvPWNtKGUpLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKHB1KG4scj10KSk6cn0sby5yb3cociksaT9vLmdldChpKTpvfX0sdm09ZG0oInRleHQvY3N2IixCZCksX209ZG0oInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLFdkKSx5bT1BcnJheS5wcm90b3R5cGUsZ209eW0ubWFwLG1tPXltLnNsaWNlLHhtPXtuYW1lOiJpbXBsaWNpdCJ9LGJtPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sd209ZnVuY3Rpb24odCl7cmV0dXJuK3R9LE1tPVswLDFdLFRtPWZ1bmN0aW9uKG4scixpKXt2YXIgbyx1PW5bMF0sYT1uW24ubGVuZ3RoLTFdLGM9ZSh1LGEsbnVsbD09cj8xMDpyKTtzd2l0Y2goaT16dihudWxsPT1pPyIsZiI6aSksaS50eXBlKXtjYXNlInMiOnZhciBzPU1hdGgubWF4KE1hdGguYWJzKHUpLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89VXYoYyxzKSl8fChpLnByZWNpc2lvbj1vKSx0LmZvcm1hdFByZWZpeChpLHMpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihvPUR2KGMsTWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpKSl8fChpLnByZWNpc2lvbj1vLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89THYoYykpfHwoaS5wcmVjaXNpb249by0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQoaSl9LE5tPWZ1bmN0aW9uKHQsbil7dD10LnNsaWNlKCk7dmFyIGUscj0wLGk9dC5sZW5ndGgtMSxvPXRbcl0sdT10W2ldO3JldHVybiB1PG8mJihlPXIscj1pLGk9ZSxlPW8sbz11LHU9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKHUpLHR9LGttPW5ldyBEYXRlLFNtPW5ldyBEYXRlLEVtPVl1KGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7RW0uZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9ZdShmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpFbTpudWxsfTt2YXIgQW09RW0ucmFuZ2UsQ209MWUzLHptPTZlNCxQbT0zNmU1LFJtPTg2NGU1LHFtPTYwNDhlNSxMbT1ZdShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L0NtKSpDbSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qQ20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL0NtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSxVbT1MbS5yYW5nZSxEbT1ZdShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L3ptKSp6bSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qem0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3ptfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSxPbT1EbS5yYW5nZSxGbT1ZdShmdW5jdGlvbih0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCkqem0lUG07bjwwJiYobis9UG0pLHQuc2V0VGltZShNYXRoLmZsb29yKCgrdC1uKS9QbSkqUG0rbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qUG0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1BtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRIb3VycygpfSksSW09Rm0ucmFuZ2UsWW09WXUoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqem0pL1JtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pLEJtPVltLnJhbmdlLGptPUJ1KDApLEhtPUJ1KDEpLFhtPUJ1KDIpLFZtPUJ1KDMpLFdtPUJ1KDQpLCRtPUJ1KDUpLFptPUJ1KDYpLEdtPWptLnJhbmdlLEptPUhtLnJhbmdlLFFtPVhtLnJhbmdlLEttPVZtLnJhbmdlLHR4PVdtLnJhbmdlLG54PSRtLnJhbmdlLGV4PVptLnJhbmdlLHJ4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLGl4PXJ4LnJhbmdlLG94PVl1KGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7b3guZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9ZdShmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgdXg9b3gucmFuZ2UsYXg9WXUoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qem0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3ptfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxjeD1heC5yYW5nZSxzeD1ZdShmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlBtKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9QbX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLGZ4PXN4LnJhbmdlLGx4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1JtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGh4PWx4LnJhbmdlLHB4PWp1KDApLGR4PWp1KDEpLHZ4PWp1KDIpLF94PWp1KDMpLHl4PWp1KDQpLGd4PWp1KDUpLG14PWp1KDYpLHh4PXB4LnJhbmdlLGJ4PWR4LnJhbmdlLHd4PXZ4LnJhbmdlLE14PV94LnJhbmdlLFR4PXl4LnJhbmdlLE54PWd4LnJhbmdlLGt4PW14LnJhbmdlLFN4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLEV4PVN4LnJhbmdlLEF4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7QXguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9ZdShmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgQ3gseng9QXgucmFuZ2UsUHg9eyItIjoiIixfOiIgIiwwOiIwIn0sUng9L15ccypcZCsvLHF4PS9eJS8sTHg9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nO1lhKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIFV4PSIlWS0lbS0lZFQlSDolTTolUy4lTFoiLER4PURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP0JhOnQudXRjRm9ybWF0KFV4KSxPeD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2phOnQudXRjUGFyc2UoVXgpLEZ4PTFlMyxJeD02MCpGeCxZeD02MCpJeCxCeD0yNCpZeCxqeD03KkJ4LEh4PTMwKkJ4LFh4PTM2NSpCeCxWeD1mdW5jdGlvbigpe3JldHVybiBWYShveCxyeCxqbSxZbSxGbSxEbSxMbSxFbSx0LnRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sV3g9ZnVuY3Rpb24oKXtyZXR1cm4gVmEoQXgsU3gscHgsbHgsc3gsYXgsTG0sRW0sdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sJHg9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goLy57Nn0vZykubWFwKGZ1bmN0aW9uKHQpe3JldHVybiIjIit0fSl9LFp4PSR4KCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxHeD0keCgiMzkzYjc5NTI1NGEzNmI2ZWNmOWM5ZWRlNjM3OTM5OGNhMjUyYjVjZjZiY2VkYjljOGM2ZDMxYmQ5ZTM5ZTdiYTUyZTdjYjk0ODQzYzM5YWQ0OTRhZDY2MTZiZTc5NjljN2I0MTczYTU1MTk0Y2U2ZGJkZGU5ZWQ2IiksSng9JHgoIjMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOSIpLFF4PSR4KCIxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUiKSxLeD1VaChYdCgzMDAsLjUsMCksWHQoLTI0MCwuNSwxKSksdGI9VWgoWHQoLTEwMCwuNzUsLjM1KSxYdCg4MCwxLjUsLjgpKSxuYj1VaChYdCgyNjAsLjc1LC4zNSksWHQoODAsMS41LC44KSksZWI9WHQoKSxyYj1mdW5jdGlvbih0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIG49TWF0aC5hYnModC0uNSk7cmV0dXJuIGViLmg9MzYwKnQtMTAwLGViLnM9MS41LTEuNSpuLGViLmw9LjgtLjkqbixlYisiIn0saWI9V2EoJHgoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxvYj1XYSgkeCgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLHViPVdhKCR4KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksYWI9V2EoJHgoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKSxjYj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHNiPTFlLTEyLGZiPU1hdGguUEksbGI9ZmIvMixoYj0yKmZiLHBiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHMsZj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1sYixwPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWxiLGQ9TWF0aC5hYnMocC1oKSx2PXA+aDtpZihjfHwoYz10PVJlKCkpLGw8ZiYmKHM9bCxsPWYsZj1zKSxsPnNiKWlmKGQ+aGItc2IpYy5tb3ZlVG8obCpNYXRoLmNvcyhoKSxsKk1hdGguc2luKGgpKSxjLmFyYygwLDAsbCxoLHAsIXYpLGY+c2ImJihjLm1vdmVUbyhmKk1hdGguY29zKHApLGYqTWF0aC5zaW4ocCkpLGMuYXJjKDAsMCxmLHAsaCx2KSk7ZWxzZXt2YXIgXyx5LGc9aCxtPXAseD1oLGI9cCx3PWQsTT1kLFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+c2ImJihpPytpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpNYXRoLnNxcnQoZipmK2wqbCkpLGs9TWF0aC5taW4oTWF0aC5hYnMobC1mKS8yLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksUz1rLEU9aztpZihOPnNiKXt2YXIgQT10YyhOL2YqTWF0aC5zaW4oVCkpLEM9dGMoTi9sKk1hdGguc2luKFQpKTsody09MipBKT5zYj8oQSo9dj8xOi0xLHgrPUEsYi09QSk6KHc9MCx4PWI9KGgrcCkvMiksKE0tPTIqQyk+c2I/KEMqPXY/MTotMSxnKz1DLG0tPUMpOihNPTAsZz1tPShoK3ApLzIpfXZhciB6PWwqTWF0aC5jb3MoZyksUD1sKk1hdGguc2luKGcpLFI9ZipNYXRoLmNvcyhiKSxxPWYqTWF0aC5zaW4oYik7aWYoaz5zYil7dmFyIEw9bCpNYXRoLmNvcyhtKSxVPWwqTWF0aC5zaW4obSksRD1mKk1hdGguY29zKHgpLE89ZipNYXRoLnNpbih4KTtpZihkPGZiKXt2YXIgRj13PnNiP25jKHosUCxELE8sTCxVLFIscSk6W1IscV0sST16LUZbMF0sWT1QLUZbMV0sQj1MLUZbMF0saj1VLUZbMV0sSD0xL01hdGguc2luKE1hdGguYWNvcygoSSpCK1kqaikvKE1hdGguc3FydChJKkkrWSpZKSpNYXRoLnNxcnQoQipCK2oqaikpKS8yKSxYPU1hdGguc3FydChGWzBdKkZbMF0rRlsxXSpGWzFdKTtTPU1hdGgubWluKGssKGYtWCkvKEgtMSkpLEU9TWF0aC5taW4oaywobC1YKS8oSCsxKSl9fU0+c2I/RT5zYj8oXz1lYyhELE8seixQLGwsRSx2KSx5PWVjKEwsVSxSLHEsbCxFLHYpLGMubW92ZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksRTxrP2MuYXJjKF8uY3gsXy5jeSxFLE1hdGguYXRhbjIoXy55MDEsXy54MDEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KTooYy5hcmMoXy5jeCxfLmN5LEUsTWF0aC5hdGFuMihfLnkwMSxfLngwMSksTWF0aC5hdGFuMihfLnkxMSxfLngxMSksIXYpLGMuYXJjKDAsMCxsLE1hdGguYXRhbjIoXy5jeStfLnkxMSxfLmN4K18ueDExKSxNYXRoLmF0YW4yKHkuY3kreS55MTEseS5jeCt5LngxMSksIXYpLGMuYXJjKHkuY3gseS5jeSxFLE1hdGguYXRhbjIoeS55MTEseS54MTEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KSkpOihjLm1vdmVUbyh6LFApLGMuYXJjKDAsMCxsLGcsbSwhdikpOmMubW92ZVRvKHosUCksZj5zYiYmdz5zYj9TPnNiPyhfPWVjKFIscSxMLFUsZiwtUyx2KSx5PWVjKHosUCxELE8sZiwtUyx2KSxjLmxpbmVUbyhfLmN4K18ueDAxLF8uY3krXy55MDEpLFM8az9jLmFyYyhfLmN4LF8uY3ksUyxNYXRoLmF0YW4yKF8ueTAxLF8ueDAxKSxNYXRoLmF0YW4yKHkueTAxLHkueDAxKSwhdik6KGMuYXJjKF8uY3gsXy5jeSxTLE1hdGguYXRhbjIoXy55MDEsXy54MDEpLE1hdGguYXRhbjIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsZixNYXRoLmF0YW4yKF8uY3krXy55MTEsXy5jeCtfLngxMSksTWF0aC5hdGFuMih5LmN5K3kueTExLHkuY3greS54MTEpLHYpLGMuYXJjKHkuY3gseS5jeSxTLE1hdGguYXRhbjIoeS55MTEseS54MTEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KSkpOmMuYXJjKDAsMCxmLGIseCx2KTpjLmxpbmVUbyhSLHEpfWVsc2UgYy5tb3ZlVG8oMCwwKTtpZihjLmNsb3NlUGF0aCgpLHQpcmV0dXJuIGM9bnVsbCx0KyIifHxudWxsfXZhciBuPVphLGU9R2Escj1jYigwKSxpPW51bGwsbz1KYSx1PVFhLGE9S2EsYz1udWxsO3JldHVybiB0LmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQ9KCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHI9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLWZiLzI7cmV0dXJuW01hdGguY29zKHIpKnQsTWF0aC5zaW4ocikqdF19LHQuaW5uZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpjYigrZSksdCk6bn0sdC5vdXRlclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTplfSx0LmNvcm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTpyfSx0LnBhZFJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6aX0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOm99LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6dX0sdC5wYWRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTphfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bnVsbD09bj9udWxsOm4sdCk6Y30sdH07cmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIGRiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcmModCl9LHZiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgYSxjLHMsZj10Lmxlbmd0aCxsPSExO2ZvcihudWxsPT1pJiYodT1vKHM9UmUoKSkpLGE9MDthPD1mOysrYSkhKGE8ZiYmcihjPXRbYV0sYSx0KSk9PT1sJiYoKGw9IWwpP3UubGluZVN0YXJ0KCk6dS5saW5lRW5kKCkpLGwmJnUucG9pbnQoK24oYyxhLHQpLCtlKGMsYSx0KSk7aWYocylyZXR1cm4gdT1udWxsLHMrIiJ8fG51bGx9dmFyIG49aWMsZT1vYyxyPWNiKCEwKSxpPW51bGwsbz1kYix1PW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmNiKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6ZX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoISFuKSx0KTpyfSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sbnVsbCE9aSYmKHU9byhpKSksdCk6b30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9dT1udWxsOnU9byhpPW4pLHQpOml9LHR9LF9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixmLGwsaCxwLGQ9dC5sZW5ndGgsdj0hMSxfPW5ldyBBcnJheShkKSx5PW5ldyBBcnJheShkKTtmb3IobnVsbD09YSYmKHM9YyhwPVJlKCkpKSxuPTA7bjw9ZDsrK24pe2lmKCEobjxkJiZ1KGg9dFtuXSxuLHQpKT09PXYpaWYodj0hdilmPW4scy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksbD1uLTE7bD49ZjstLWwpcy5wb2ludChfW2xdLHlbbF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfXYmJihfW25dPStlKGgsbix0KSx5W25dPStpKGgsbix0KSxzLnBvaW50KHI/K3IoaCxuLHQpOl9bbl0sbz8rbyhoLG4sdCk6eVtuXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIG4oKXtyZXR1cm4gdmIoKS5kZWZpbmVkKHUpLmN1cnZlKGMpLmNvbnRleHQoYSl9dmFyIGU9aWMscj1udWxsLGk9Y2IoMCksbz1vYyx1PWNiKCEwKSxhPW51bGwsYz1kYixzPW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSxyPW51bGwsdCk6ZX0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksbz1udWxsLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6b30sdC5saW5lWDA9dC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShpKX0sdC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShvKX0sdC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngocikueShpKX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoISFuKSx0KTp1fSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sbnVsbCE9YSYmKHM9YyhhKSksdCk6Y30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2E9cz1udWxsOnM9YyhhPW4pLHQpOmF9LHR9LHliPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSxnYj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksXz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cykseT1NYXRoLm1pbihoYixNYXRoLm1heCgtaGIsby5hcHBseSh0aGlzLGFyZ3VtZW50cyktXykpLGc9TWF0aC5taW4oTWF0aC5hYnMoeSkvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT1nKih5PDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KHktaCptKS9wOjA7YTxoOysrYSxfPWYpYz1kW2FdLGw9dltjXSxmPV8rKGw+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpmLHBhZEFuZ2xlOmd9O3JldHVybiB2fXZhciBuPWdiLGU9eWIscj1udWxsLGk9Y2IoMCksbz1jYihoYiksdT1jYigwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmNiKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6dX0sdH0seGI9YWMoZGIpO3VjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGJiPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKHZiKCkuY3VydmUoeGIpKX0sd2I9ZnVuY3Rpb24oKXt2YXIgdD1fYigpLmN1cnZlKHhiKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjYyhyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gY2MoaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oYWModCkpOm4oKS5fY3VydmV9LHR9LE1iPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vZmIpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxoYil9fSxUYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSxOYj1NYXRoLnNxcnQoMS8zKSxrYj0yKk5iLFNiPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4va2IpLHI9ZSpOYjt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LEViPS44OTA4MTMwOTE1MjkyODUyLEFiPU1hdGguc2luKGZiLzEwKS9NYXRoLnNpbig3KmZiLzEwKSxDYj1NYXRoLnNpbihoYi8xMCkqQWIsemI9LU1hdGguY29zKGhiLzEwKSpBYixQYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuKkViKSxyPUNiKmUsaT16YiplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIHU9aGIqby81LGE9TWF0aC5jb3ModSksYz1NYXRoLnNpbih1KTt0LmxpbmVUbyhjKmUsLWEqZSksdC5saW5lVG8oYSpyLWMqaSxjKnIrYSppKX10LmNsb3NlUGF0aCgpfX0sUmI9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LHFiPU1hdGguc3FydCgzKSxMYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypxYikpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtcWIqZSwtZSksdC5saW5lVG8ocWIqZSwtZSksdC5jbG9zZVBhdGgoKX19LFViPS0uNSxEYj1NYXRoLnNxcnQoMykvMixPYj0xL01hdGguc3FydCgxMiksRmI9MyooT2IvMisxKSxJYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0ZiKSxyPWUvMixpPWUqT2Isbz1yLHU9ZSpPYitlLGE9LW8sYz11O3QubW92ZVRvKHIsaSksdC5saW5lVG8obyx1KSx0LmxpbmVUbyhhLGMpLHQubGluZVRvKFViKnItRGIqaSxEYipyK1ViKmkpLHQubGluZVRvKFViKm8tRGIqdSxEYipvK1ViKnUpLHQubGluZVRvKFViKmEtRGIqYyxEYiphK1ViKmMpLHQubGluZVRvKFViKnIrRGIqaSxVYippLURiKnIpLHQubGluZVRvKFViKm8rRGIqdSxVYip1LURiKm8pLHQubGluZVRvKFViKmErRGIqYyxVYipjLURiKmEpLHQuY2xvc2VQYXRoKCl9fSxZYj1bTWIsVGIsU2IsUmIsUGIsTGIsSWJdLEJiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0O2lmKHJ8fChyPXQ9UmUoKSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhyLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdClyZXR1cm4gcj1udWxsLHQrIiJ8fG51bGx9dmFyIG49Y2IoTWIpLGU9Y2IoNjQpLHI9bnVsbDtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y2IoZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6bix0KTpyfSx0fSxqYj1mdW5jdGlvbigpe307ZmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpzYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpzYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIEhiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZmModCl9O2xjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmpiLGFyZWFFbmQ6amIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gyKzIqdGhpcy5feDMpLzMsKHRoaXMuX3kyKzIqdGhpcy5feTMpLzMpLHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MysyKnRoaXMuX3gyKS8zLCh0aGlzLl95MysyKnRoaXMuX3kyKS8zKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDI9dCx0aGlzLl95Mj1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94ND10LHRoaXMuX3k0PW4sdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNiwodGhpcy5feTArNCp0aGlzLl95MStuKS82KTticmVhaztkZWZhdWx0OnNjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fTt2YXIgWGI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsYyh0KX07aGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpzYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIFZiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaGModCl9O3BjLnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aC0xO2lmKGU+MClmb3IodmFyIHIsaT10WzBdLG89blswXSx1PXRbZV0taSxhPW5bZV0tbyxjPS0xOysrYzw9ZTspcj1jL2UsdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2NdKygxLXRoaXMuX2JldGEpKihpK3IqdSksdGhpcy5fYmV0YSpuW2NdKygxLXRoaXMuX2JldGEpKihvK3IqYSkpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgV2I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxPT09bj9uZXcgZmModCk6bmV3IHBjKHQsbil9cmV0dXJuIGUuYmV0YT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC44NSk7dmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOmRjKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpkYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICRiPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IHZjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO19jLnByb3RvdHlwZT17YXJlYVN0YXJ0OmpiLGFyZWFFbmQ6amIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpkYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFpiPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IF9jKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO3ljLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmRjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR2I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgeWModCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7bWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpnYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBKYj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IG1jKHQsbik6bmV3IHZjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7eGMucHJvdG90eXBlPXthcmVhU3RhcnQ6amIsYXJlYUVuZDpqYixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpnYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBRYj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IHhjKHQsbik6bmV3IF9jKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7YmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTA7Cn0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6Z2ModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgS2I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBiYyh0LG4pOm5ldyB5Yyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO3djLnByb3RvdHlwZT17YXJlYVN0YXJ0OmpiLGFyZWFFbmQ6amIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX07dmFyIHR3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgd2ModCl9O1NjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzprYyh0aGlzLHRoaXMuX3QwLE5jKHRoaXMsdGhpcy5fdDApKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7dmFyIGU9TmFOO2lmKHQ9K3Qsbj0rbix0IT09dGhpcy5feDF8fG4hPT10aGlzLl95MSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MyxrYyh0aGlzLE5jKHRoaXMsZT1UYyh0aGlzLHQsbikpLGUpO2JyZWFrO2RlZmF1bHQ6a2ModGhpcyx0aGlzLl90MCxlPVRjKHRoaXMsdCxuKSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1uLHRoaXMuX3QwPWV9fX0sKEVjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFNjLnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsbil7U2MucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcyxuLHQpfSxBYy5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubW92ZVRvKG4sdCl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubGluZVRvKG4sdCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhuLHQscixlLG8saSl9fSxQYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoO2lmKGUpaWYodGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0WzBdLG5bMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHRbMF0sblswXSksMj09PWUpdGhpcy5fY29udGV4dC5saW5lVG8odFsxXSxuWzFdKTtlbHNlIGZvcih2YXIgcj1SYyh0KSxpPVJjKG4pLG89MCx1PTE7dTxlOysrbywrK3UpdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHJbMF1bb10saVswXVtvXSxyWzFdW29dLGlbMV1bb10sdFt1XSxuW3VdKTsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT1lKSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSx0aGlzLl94PXRoaXMuX3k9bnVsbH0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgbnc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBQYyh0KX07cWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX07dmFyIGV3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcWModCwuNSl9LHJ3PUFycmF5LnByb3RvdHlwZS5zbGljZSxpdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGk9MSxvPXRbblswXV0sdT1vLmxlbmd0aDtpPHI7KytpKXtlPW8sbz10W25baV1dO2Zvcih2YXIgYT0wO2E8dTsrK2Epb1thXVsxXSs9b1thXVswXT1pc05hTihlW2FdWzFdKT9lW2FdWzBdOmVbYV1bMV19fSxvdz1mdW5jdGlvbih0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1uZXcgQXJyYXkobik7LS1uPj0wOyllW25dPW47cmV0dXJuIGV9LHV3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1LGE9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYz10Lmxlbmd0aCxzPWEubGVuZ3RoLGY9bmV3IEFycmF5KHMpO2ZvcihvPTA7bzxzOysrbyl7Zm9yKHZhciBsLGg9YVtvXSxwPWZbb109bmV3IEFycmF5KGMpLGQ9MDtkPGM7KytkKXBbZF09bD1bMCwraSh0W2RdLGgsZCx0KV0sbC5kYXRhPXRbZF07cC5rZXk9aH1mb3Iobz0wLHU9ZShmKTtvPHM7KytvKWZbdVtvXV0uaW5kZXg9bztyZXR1cm4gcihmLHUpLGZ9dmFyIG49Y2IoW10pLGU9b3cscj1pdyxpPURjO3JldHVybiB0LmtleXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpjYihydy5jYWxsKGUpKSx0KTpufSx0LnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOml9LHQub3JkZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj9vdzoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKHJ3LmNhbGwobikpLHQpOmV9LHQub2Zmc2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/aXc6bix0KTpyfSx0fSxhdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PXRbMF0ubGVuZ3RoO288dTsrK28pe2ZvcihpPWU9MDtlPHI7KytlKWkrPXRbZV1bb11bMV18fDA7aWYoaSlmb3IoZT0wO2U8cjsrK2UpdFtlXVtvXVsxXS89aX1pdyh0LG4pfX0sY3c9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1pdyh0LG4pfX0sc3c9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PTE7dTxyOysrdSl7Zm9yKHZhciBhPTAsYz0wLHM9MDthPGk7KythKXtmb3IodmFyIGY9dFtuW2FdXSxsPWZbdV1bMV18fDAsaD1mW3UtMV1bMV18fDAscD0obC1oKS8yLGQ9MDtkPGE7KytkKXt2YXIgdj10W25bZF1dLF89dlt1XVsxXXx8MCx5PXZbdS0xXVsxXXx8MDtwKz1fLXl9Yys9bCxzKz1wKmx9ZVt1LTFdWzFdKz1lW3UtMV1bMF09byxjJiYoby09cy9jKX1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGl3KHQsbil9fSxmdz1mdW5jdGlvbih0KXt2YXIgbj10Lm1hcChPYyk7cmV0dXJuIG93KHQpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gblt0XS1uW2VdfSl9LGx3PWZ1bmN0aW9uKHQpe3JldHVybiBmdyh0KS5yZXZlcnNlKCl9LGh3PWZ1bmN0aW9uKHQpe3ZhciBuLGUscj10Lmxlbmd0aCxpPXQubWFwKE9jKSxvPW93KHQpLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gaVtuXS1pW3RdfSksdT0wLGE9MCxjPVtdLHM9W107Zm9yKG49MDtuPHI7KytuKWU9b1tuXSx1PGE/KHUrPWlbZV0sYy5wdXNoKGUpKTooYSs9aVtlXSxzLnB1c2goZSkpO3JldHVybiBzLnJldmVyc2UoKS5jb25jYXQoYyl9LHB3PWZ1bmN0aW9uKHQpe3JldHVybiBvdyh0KS5yZXZlcnNlKCl9LGR3PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX07WWMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpZYyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVhjKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KXI9ZS5VLGU9PT1yLkw/KGk9ci5SLGkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuUiYmKGpjKHRoaXMsZSksdD1lLGU9dC5VKSxlLkM9ITEsci5DPSEwLEhjKHRoaXMscikpKTooaT1yLkwsaSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoSGModGhpcyxlKSx0PWUsZT10LlUpLGUuQz0hMSxyLkM9ITAsamModGhpcyxyKSkpLGU9dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgbixlLHIsaT10LlUsbz10LkwsdT10LlI7aWYoZT1vP3U/WGModSk6bzp1LGk/aS5MPT09dD9pLkw9ZTppLlI9ZTp0aGlzLl89ZSxvJiZ1PyhyPWUuQyxlLkM9dC5DLGUuTD1vLG8uVT1lLGUhPT11PyhpPWUuVSxlLlU9dC5VLHQ9ZS5SLGkuTD10LGUuUj11LHUuVT1lKTooZS5VPWksaT1lLHQ9ZS5SKSk6KHI9dC5DLHQ9ZSksdCYmKHQuVT1pKSwhcil7aWYodCYmdC5DKXJldHVybiB2b2lkKHQuQz0hMSk7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZihuPWkuUixuLkMmJihuLkM9ITEsaS5DPSEwLGpjKHRoaXMsaSksbj1pLlIpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uUiYmbi5SLkN8fChuLkwuQz0hMSxuLkM9ITAsSGModGhpcyxuKSxuPWkuUiksbi5DPWkuQyxpLkM9bi5SLkM9ITEsamModGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZihuPWkuTCxuLkMmJihuLkM9ITEsaS5DPSEwLEhjKHRoaXMsaSksbj1pLkwpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uTCYmbi5MLkN8fChuLlIuQz0hMSxuLkM9ITAsamModGhpcyxuKSxuPWkuTCksbi5DPWkuQyxpLkM9bi5MLkM9ITEsSGModGhpcyxpKSx0PXRoaXMuXzticmVha31uLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciB2dyxfdyx5dyxndyxtdyx4dz1bXSxidz1bXSx3dz0xZS02LE13PTFlLTEyO19zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6X3MscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihuKXt2YXIgZT1uLmhhbGZlZGdlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRzKG4sdFtlXSl9KTtyZXR1cm4gZS5kYXRhPW4uc2l0ZS5kYXRhLGV9KX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sbj10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvPShpPWUuaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8sdSxhPWUuc2l0ZSxjPS0xLHM9bltpW28tMV1dLGY9cy5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdDsrK2M8bzspdT1mLHM9bltpW2NdXSxmPXMubGVmdD09PWE/cy5yaWdodDpzLmxlZnQsdSYmZiYmcjx1LmluZGV4JiZyPGYuaW5kZXgmJmRzKGEsdSxmKTwwJiZ0LnB1c2goW2EuZGF0YSx1LmRhdGEsZi5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyx1PW8uX2ZvdW5kfHwwLGE9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbdV0pOylpZigrK3U+PWEpcmV0dXJuIG51bGw7dmFyIGM9dC1pLnNpdGVbMF0scz1uLWkuc2l0ZVsxXSxmPWMqYytzKnM7ZG8gaT1vLmNlbGxzW3I9dV0sdT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSxhPXIubGVmdDtpZihhIT09aS5zaXRlJiZhfHwoYT1yLnJpZ2h0KSl7dmFyIGM9dC1hWzBdLHM9bi1hWzFdLGw9YypjK3MqcztsPGYmJihmPWwsdT1hLmluZGV4KX19KTt3aGlsZShudWxsIT09dSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8Zjw9ZSplP2kuc2l0ZTpudWxsfX07dmFyIFR3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gbmV3IF9zKHQubWFwKGZ1bmN0aW9uKHIsaSl7dmFyIG89W01hdGgucm91bmQobihyLGksdCkvd3cpKnd3LE1hdGgucm91bmQoZShyLGksdCkvd3cpKnd3XTtyZXR1cm4gby5pbmRleD1pLG8uZGF0YT1yLG99KSxyKX12YXIgbj1GYyxlPUljLHI9bnVsbDtyZXR1cm4gdC5wb2x5Z29ucz1mdW5jdGlvbihuKXtyZXR1cm4gdChuKS5wb2x5Z29ucygpfSx0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLmxpbmtzKCl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnRyaWFuZ2xlcygpfSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpkdygrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZHcoK24pLHQpOmV9LHQuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDpbWytuWzBdWzBdLCtuWzBdWzFdXSxbK25bMV1bMF0sK25bMV1bMV1dXSx0KTpyJiZbW3JbMF1bMF0sclswXVsxXV0sW3JbMV1bMF0sclsxXVsxXV1dfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbMCwwXSxbK25bMF0sK25bMV1dXSx0KTpyJiZbclsxXVswXS1yWzBdWzBdLHJbMV1bMV0tclswXVsxXV19LHR9LE53PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX07Z3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpncyxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgZ3ModGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBncyh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBrdz1uZXcgZ3MoMSwwLDApO21zLnByb3RvdHlwZT1ncy5wcm90b3R5cGU7dmFyIFN3PWZ1bmN0aW9uKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9LEV3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0Lm9uKCJ3aGVlbC56b29tIixzKS5vbigibW91c2Vkb3duLnpvb20iLGYpLm9uKCJkYmxjbGljay56b29tIixsKS5vbigidG91Y2hzdGFydC56b29tIixoKS5vbigidG91Y2htb3ZlLnpvb20iLGQpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLHYpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikucHJvcGVydHkoIl9fem9vbSIsTXMpfWZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gbj1NYXRoLm1heCh4LE1hdGgubWluKGIsbikpLG49PT10Lms/dDpuZXcgZ3Mobix0LngsdC55KX1mdW5jdGlvbiByKHQsbixlKXt2YXIgcj1uWzBdLWVbMF0qdC5rLGk9blsxXS1lWzFdKnQuaztyZXR1cm4gcj09PXQueCYmaT09PXQueT90Om5ldyBncyh0LmsscixpKX1mdW5jdGlvbiBpKHQsbil7dmFyIGU9dC5pbnZlcnRYKG5bMF1bMF0pLXcscj10LmludmVydFgoblsxXVswXSktTSxpPXQuaW52ZXJ0WShuWzBdWzFdKS1ULG89dC5pbnZlcnRZKG5bMV1bMV0pLU47cmV0dXJuIHQudHJhbnNsYXRlKHI+ZT8oZStyKS8yOk1hdGgubWluKDAsZSl8fE1hdGgubWF4KDAsciksbz5pPyhpK28pLzI6TWF0aC5taW4oMCxpKXx8TWF0aC5tYXgoMCxvKSl9ZnVuY3Rpb24gbyh0KXtyZXR1cm5bKCt0WzBdWzBdKyArdFsxXVswXSkvMiwoK3RbMF1bMV0rICt0WzFdWzFdKS8yXX1mdW5jdGlvbiB1KHQsbixlKXt0Lm9uKCJzdGFydC56b29tIixmdW5jdGlvbigpe2EodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCl9KS5vbigiaW50ZXJydXB0Lnpvb20gZW5kLnpvb20iLGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2Vlbigiem9vbSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLHI9YXJndW1lbnRzLGk9YSh0LHIpLHU9bS5hcHBseSh0LHIpLGM9ZXx8byh1KSxzPU1hdGgubWF4KHVbMV1bMF0tdVswXVswXSx1WzFdWzFdLXVbMF1bMV0pLGY9dC5fX3pvb20sbD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHQscik6bixoPUUoZi5pbnZlcnQoYykuY29uY2F0KHMvZi5rKSxsLmludmVydChjKS5jb25jYXQocy9sLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1sO2Vsc2V7dmFyIG49aCh0KSxlPXMvblsyXTt0PW5ldyBncyhlLGNbMF0tblswXSplLGNbMV0tblsxXSplKX1pLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiBhKHQsbil7Zm9yKHZhciBlLHI9MCxpPUEubGVuZ3RoO3I8aTsrK3IpaWYoKGU9QVtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBjKHQsbil9ZnVuY3Rpb24gYyh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1tLmFwcGx5KHQsbil9ZnVuY3Rpb24gcygpe2Z1bmN0aW9uIG4oKXtvLndoZWVsPW51bGwsby5lbmQoKX1pZihnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG89YSh0aGlzLGFyZ3VtZW50cyksdT10aGlzLl9fem9vbSxjPU1hdGgubWF4KHgsTWF0aC5taW4oYix1LmsqTWF0aC5wb3coMiwtdC5ldmVudC5kZWx0YVkqKHQuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKS81MDApKSkscz16Zih0aGlzKTtpZihvLndoZWVsKW8ubW91c2VbMF1bMF09PT1zWzBdJiZvLm1vdXNlWzBdWzFdPT09c1sxXXx8KG8ubW91c2VbMV09dS5pbnZlcnQoby5tb3VzZVswXT1zKSksY2xlYXJUaW1lb3V0KG8ud2hlZWwpO2Vsc2V7aWYodS5rPT09YylyZXR1cm47by5tb3VzZT1bcyx1LmludmVydChzKV0sb3AodGhpcyksby5zdGFydCgpfVN3KCksby53aGVlbD1zZXRUaW1lb3V0KG4sUCksby56b29tKCJtb3VzZSIsaShyKGUodSxjKSxvLm1vdXNlWzBdLG8ubW91c2VbMV0pLG8uZXh0ZW50KSl9fWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBuKCl7U3coKSxvLm1vdmVkPSEwLG8uem9vbSgibW91c2UiLGkocihvLnRoYXQuX196b29tLG8ubW91c2VbMF09emYoby50aGF0KSxvLm1vdXNlWzFdKSxvLmV4dGVudCkpfWZ1bmN0aW9uIGUoKXt1Lm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLG51bGwpLF90KHQuZXZlbnQudmlldyxvLm1vdmVkKSxTdygpLG8uZW5kKCl9aWYoIXkmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbz1hKHRoaXMsYXJndW1lbnRzKSx1PXBsKHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixuLCEwKS5vbigibW91c2V1cC56b29tIixlLCEwKSxjPXpmKHRoaXMpO2dsKHQuZXZlbnQudmlldykseHMoKSxvLm1vdXNlPVtjLHRoaXMuX196b29tLmludmVydChjKV0sb3AodGhpcyksby5zdGFydCgpfX1mdW5jdGlvbiBsKCl7aWYoZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPXRoaXMuX196b29tLGE9emYodGhpcyksYz1vLmludmVydChhKSxzPW8uayoodC5ldmVudC5zaGlmdEtleT8uNToyKSxmPWkocihlKG8scyksYSxjKSxtLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7U3coKSxrPjA/cGwodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGspLmNhbGwodSxmLGEpOnBsKHRoaXMpLmNhbGwobi50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIGgoKXtpZihnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4sZSxyLGksbz1hKHRoaXMsYXJndW1lbnRzKSx1PXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz11Lmxlbmd0aDtmb3IoeHMoKSxlPTA7ZTxjOysrZSlyPXVbZV0saT12bCh0aGlzLHUsci5pZGVudGlmaWVyKSxpPVtpLHRoaXMuX196b29tLmludmVydChpKSxyLmlkZW50aWZpZXJdLG8udG91Y2gwP28udG91Y2gxfHwoby50b3VjaDE9aSk6KG8udG91Y2gwPWksbj0hMCk7cmV0dXJuIF8mJihfPWNsZWFyVGltZW91dChfKSwhby50b3VjaDEpPyhvLmVuZCgpLGk9cGwodGhpcykub24oImRibGNsaWNrLnpvb20iKSx2b2lkKGkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk6dm9pZChuJiYoXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Xz1udWxsfSx6KSxvcCh0aGlzKSxvLnN0YXJ0KCkpKX19ZnVuY3Rpb24gZCgpe3ZhciBuLG8sdSxjLHM9YSh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGw9Zi5sZW5ndGg7Zm9yKFN3KCksXyYmKF89Y2xlYXJUaW1lb3V0KF8pKSxuPTA7bjxsOysrbilvPWZbbl0sdT12bCh0aGlzLGYsby5pZGVudGlmaWVyKSxzLnRvdWNoMCYmcy50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/cy50b3VjaDBbMF09dTpzLnRvdWNoMSYmcy50b3VjaDFbMl09PT1vLmlkZW50aWZpZXImJihzLnRvdWNoMVswXT11KTtpZihvPXMudGhhdC5fX3pvb20scy50b3VjaDEpe3ZhciBoPXMudG91Y2gwWzBdLHA9cy50b3VjaDBbMV0sZD1zLnRvdWNoMVswXSx2PXMudG91Y2gxWzFdLHk9KHk9ZFswXS1oWzBdKSp5Kyh5PWRbMV0taFsxXSkqeSxnPShnPXZbMF0tcFswXSkqZysoZz12WzFdLXBbMV0pKmc7bz1lKG8sTWF0aC5zcXJ0KHkvZykpLHU9WyhoWzBdK2RbMF0pLzIsKGhbMV0rZFsxXSkvMl0sYz1bKHBbMF0rdlswXSkvMiwocFsxXSt2WzFdKS8yXX1lbHNle2lmKCFzLnRvdWNoMClyZXR1cm47dT1zLnRvdWNoMFswXSxjPXMudG91Y2gwWzFdfXMuem9vbSgidG91Y2giLGkocihvLHUsYykscy5leHRlbnQpKX1mdW5jdGlvbiB2KCl7dmFyIG4sZSxyPWEodGhpcyxhcmd1bWVudHMpLGk9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2Zvcih4cygpLHkmJmNsZWFyVGltZW91dCh5KSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGx9LHopLG49MDtuPG87KytuKWU9aVtuXSxyLnRvdWNoMCYmci50b3VjaDBbMl09PT1lLmlkZW50aWZpZXI/ZGVsZXRlIHIudG91Y2gwOnIudG91Y2gxJiZyLnRvdWNoMVsyXT09PWUuaWRlbnRpZmllciYmZGVsZXRlIHIudG91Y2gxO3IudG91Y2gxJiYhci50b3VjaDAmJihyLnRvdWNoMD1yLnRvdWNoMSxkZWxldGUgci50b3VjaDEpLHIudG91Y2gwfHxyLmVuZCgpfXZhciBfLHksZz1icyxtPXdzLHg9MCxiPTEvMCx3PS1iLE09YixUPXcsTj1NLGs9MjUwLEU9Q2gsQT1bXSxDPXAoInN0YXJ0Iiwiem9vbSIsImVuZCIpLHo9NTAwLFA9MTUwO3JldHVybiBuLnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLE1zKSx0IT09ZT91KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0sbi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bi5zY2FsZVRvKHQsZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fem9vbS5rLG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gdCpufSl9LG4uc2NhbGVUbz1mdW5jdGlvbih0LHUpe24udHJhbnNmb3JtKHQsZnVuY3Rpb24oKXt2YXIgdD1tLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGE9byh0KSxjPW4uaW52ZXJ0KGEpLHM9ImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dTtyZXR1cm4gaShyKGUobixzKSxhLGMpLHQpfSl9LG4udHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLHIpe24udHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxtLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sYy5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT0rK3RoaXMuYWN0aXZlJiYodGhpcy5pbmRleD1BLnB1c2godGhpcyktMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LHpvb206ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5tb3VzZSYmIm1vdXNlIiE9PXQmJih0aGlzLm1vdXNlWzFdPW4uaW52ZXJ0KHRoaXMubW91c2VbMF0pKSx0aGlzLnRvdWNoMCYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMFsxXT1uLmludmVydCh0aGlzLnRvdWNoMFswXSkpLHRoaXMudG91Y2gxJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gxWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKSksdGhpcy50aGF0Ll9fem9vbT1uLHRoaXMuZW1pdCgiem9vbSIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT09LS10aGlzLmFjdGl2ZSYmKEEuc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe1MobmV3IHlzKG4sdCx0aGlzLnRoYXQuX196b29tKSxDLmFwcGx5LEMsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOdyghIXQpLG4pOmd9LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TncoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLG4pOm19LG4uc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9K3RbMF0sYj0rdFsxXSxuKTpbeCxiXX0sbi50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9K3RbMF1bMF0sTT0rdFsxXVswXSxUPSt0WzBdWzFdLE49K3RbMV1bMV0sbik6W1t3LFRdLFtNLE5dXX0sbi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz0rdCxuKTprfSxuLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPXQsbik6RX0sbi5vbj1mdW5jdGlvbigpe3ZhciB0PUMub24uYXBwbHkoQyxhcmd1bWVudHMpO3JldHVybiB0PT09Qz9uOnR9LG59O3QudmVyc2lvbj1Ucyx0LmJpc2VjdD1Fcyx0LmJpc2VjdFJpZ2h0PUVzLHQuYmlzZWN0TGVmdD1Bcyx0LmFzY2VuZGluZz1Ocyx0LmJpc2VjdG9yPWtzLHQuZGVzY2VuZGluZz1Dcyx0LmRldmlhdGlvbj1Scyx0LmV4dGVudD1xcyx0Lmhpc3RvZ3JhbT1Wcyx0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9JHMsdC50aHJlc2hvbGRTY290dD1acyx0LnRocmVzaG9sZFN0dXJnZXM9WHMsdC5tYXg9R3MsdC5tZWFuPUpzLHQubWVkaWFuPVFzLHQubWVyZ2U9S3MsdC5taW49dGYsdC5wYWlycz1uZix0LnBlcm11dGU9ZWYsdC5xdWFudGlsZT1Xcyx0LnJhbmdlPUlzLHQuc2Nhbj1yZix0LnNodWZmbGU9b2YsdC5zdW09dWYsdC50aWNrcz1Icyx0LnRpY2tTdGVwPWUsdC50cmFuc3Bvc2U9YWYsdC52YXJpYW5jZT1Qcyx0LnppcD1jZix0LmF4aXNUb3A9cyx0LmF4aXNSaWdodD1mLHQuYXhpc0JvdHRvbT1sLHQuYXhpc0xlZnQ9aCx0LmJydXNoPW1kLHQuYnJ1c2hYPUVlLHQuYnJ1c2hZPUFlLHQuYnJ1c2hTZWxlY3Rpb249U2UsdC5jaG9yZD1rZCx0LnJpYmJvbj1SZCx0Lm5lc3Q9TGQsdC5zZXQ9VmUsdC5tYXA9SWUsdC5rZXlzPURkLHQudmFsdWVzPU9kLHQuZW50cmllcz1GZCx0LmNvbG9yPU10LHQucmdiPVN0LHQuaHNsPXp0LHQubGFiPUx0LHQuaGNsPUJ0LHQuY3ViZWhlbGl4PVh0LHQuZGlzcGF0Y2g9cCx0LmRyYWc9eGwsdC5kcmFnRGlzYWJsZT1nbCx0LmRyYWdFbmFibGU9X3QsdC5kc3ZGb3JtYXQ9SWQsdC5jc3ZQYXJzZT1CZCx0LmNzdlBhcnNlUm93cz1qZCx0LmNzdkZvcm1hdD1IZCx0LmNzdkZvcm1hdFJvd3M9WGQsdC50c3ZQYXJzZT1XZCx0LnRzdlBhcnNlUm93cz0kZCx0LnRzdkZvcm1hdD1aZCx0LnRzdkZvcm1hdFJvd3M9R2QsdC5lYXNlTGluZWFyPW5lLHQuZWFzZVF1YWQ9aWUsdC5lYXNlUXVhZEluPWVlLHQuZWFzZVF1YWRPdXQ9cmUsdC5lYXNlUXVhZEluT3V0PWllLHQuZWFzZUN1YmljPWFlLHQuZWFzZUN1YmljSW49b2UsdC5lYXNlQ3ViaWNPdXQ9dWUsdC5lYXNlQ3ViaWNJbk91dD1hZSx0LmVhc2VQb2x5PXpwLHQuZWFzZVBvbHlJbj1BcCx0LmVhc2VQb2x5T3V0PUNwLHQuZWFzZVBvbHlJbk91dD16cCx0LmVhc2VTaW49ZmUsdC5lYXNlU2luSW49Y2UsdC5lYXNlU2luT3V0PXNlLHQuZWFzZVNpbkluT3V0PWZlLHQuZWFzZUV4cD1wZSx0LmVhc2VFeHBJbj1sZSx0LmVhc2VFeHBPdXQ9aGUsdC5lYXNlRXhwSW5PdXQ9cGUsdC5lYXNlQ2lyY2xlPV9lLHQuZWFzZUNpcmNsZUluPWRlLHQuZWFzZUNpcmNsZU91dD12ZSx0LmVhc2VDaXJjbGVJbk91dD1fZSx0LmVhc2VCb3VuY2U9Z2UsdC5lYXNlQm91bmNlSW49eWUsdC5lYXNlQm91bmNlT3V0PWdlLHQuZWFzZUJvdW5jZUluT3V0PW1lLHQuZWFzZUJhY2s9V3AsdC5lYXNlQmFja0luPVhwLHQuZWFzZUJhY2tPdXQ9VnAsdC5lYXNlQmFja0luT3V0PVdwLHQuZWFzZUVsYXN0aWM9UXAsdC5lYXNlRWxhc3RpY0luPUpwLHQuZWFzZUVsYXN0aWNPdXQ9UXAsdC5lYXNlRWxhc3RpY0luT3V0PUtwLHQuZm9yY2VDZW50ZXI9SmQsdC5mb3JjZUNvbGxpZGU9dnYsdC5mb3JjZUxpbms9X3YsdC5mb3JjZU1hbnlCb2R5PXh2LHQuZm9yY2VTaW11bGF0aW9uPW12LHQuZm9yY2VYPWJ2LHQuZm9yY2VZPXd2LHQuZm9ybWF0RGVmYXVsdExvY2FsZT1ocix0LmZvcm1hdExvY2FsZT1xdix0LmZvcm1hdFNwZWNpZmllcj16dix0LnByZWNpc2lvbkZpeGVkPUx2LHQucHJlY2lzaW9uUHJlZml4PVV2LHQucHJlY2lzaW9uUm91bmQ9RHYsdC5nZW9BcmVhPWpfLHQuZ2VvQm91bmRzPVZfLHQuZ2VvQ2VudHJvaWQ9JF8sdC5nZW9DaXJjbGU9c3ksdC5nZW9DbGlwRXh0ZW50PV95LHQuZ2VvRGlzdGFuY2U9d3ksdC5nZW9HcmF0aWN1bGU9dmksdC5nZW9HcmF0aWN1bGUxMD1faSx0Lmdlb0ludGVycG9sYXRlPU15LHQuZ2VvTGVuZ3RoPW15LHQuZ2VvUGF0aD1qeSx0Lmdlb0FsYmVycz1uZyx0Lmdlb0FsYmVyc1VzYT1lZyx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYT1pZyx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1yZyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PXVnLHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9b2csdC5nZW9Db25pY0NvbmZvcm1hbD1jZyx0Lmdlb0NvbmljQ29uZm9ybWFsUmF3PWVvLHQuZ2VvQ29uaWNFcXVhbEFyZWE9dGcsdC5nZW9Db25pY0VxdWFsQXJlYVJhdz1aaSx0Lmdlb0NvbmljRXF1aWRpc3RhbnQ9ZmcsdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PWlvLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPXNnLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyUmF3PXJvLHQuZ2VvR25vbW9uaWM9bGcsdC5nZW9Hbm9tb25pY1Jhdz1vbyx0Lmdlb0lkZW50aXR5PWhnLHQuZ2VvUHJvamVjdGlvbj1YaSx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVZpLHQuZ2VvTWVyY2F0b3I9YWcsdC5nZW9NZXJjYXRvclJhdz1LaSx0Lmdlb09ydGhvZ3JhcGhpYz1wZyx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1hbyx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZGcsdC5nZW9TdGVyZW9ncmFwaGljUmF3PWNvLHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yPXZnLHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PXNvLHQuZ2VvUm90YXRpb249Y3ksdC5nZW9TdHJlYW09Rl8sdC5nZW9UcmFuc2Zvcm09WnksdC5jbHVzdGVyPV9nLHQuaGllcmFyY2h5PXhvLHQucGFjaz1QZyx0LnBhY2tTaWJsaW5ncz1DZyx0LnBhY2tFbmNsb3NlPUFnLHQucGFydGl0aW9uPUxnLHQuc3RyYXRpZnk9RmcsdC50cmVlPUlnLHQudHJlZW1hcD1IZyx0LnRyZWVtYXBCaW5hcnk9WGcsdC50cmVlbWFwRGljZT1xZyx0LnRyZWVtYXBTbGljZT1ZZyx0LnRyZWVtYXBTbGljZURpY2U9VmcsdC50cmVlbWFwU3F1YXJpZnk9amcsdC50cmVlbWFwUmVzcXVhcmlmeT1XZyx0LmludGVycG9sYXRlPW1oLHQuaW50ZXJwb2xhdGVBcnJheT1oaCx0LmludGVycG9sYXRlQmFzaXM9dWgsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPWFoLHQuaW50ZXJwb2xhdGVEYXRlPXBoLHQuaW50ZXJwb2xhdGVOdW1iZXI9ZGgsdC5pbnRlcnBvbGF0ZU9iamVjdD12aCx0LmludGVycG9sYXRlUm91bmQ9eGgsdC5pbnRlcnBvbGF0ZVN0cmluZz1naCx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPVRoLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9TmgsdC5pbnRlcnBvbGF0ZVpvb209Q2gsdC5pbnRlcnBvbGF0ZVJnYj1zaCx0LmludGVycG9sYXRlUmdiQmFzaXM9ZmgsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWxoLHQuaW50ZXJwb2xhdGVIc2w9emgsdC5pbnRlcnBvbGF0ZUhzbExvbmc9UGgsdC5pbnRlcnBvbGF0ZUxhYj1mbix0LmludGVycG9sYXRlSGNsPVJoLHQuaW50ZXJwb2xhdGVIY2xMb25nPXFoLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9TGgsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9VWgsdC5xdWFudGl6ZT1EaCx0LnBhdGg9UmUsdC5wb2x5Z29uQXJlYT0kZyx0LnBvbHlnb25DZW50cm9pZD1aZyx0LnBvbHlnb25IdWxsPUpnLHQucG9seWdvbkNvbnRhaW5zPVFnLHQucG9seWdvbkxlbmd0aD1LZzt0LnF1YWR0cmVlPW5yO3QucXVldWU9ZnUsdC5yYW5kb21Vbmlmb3JtPWVtLHQucmFuZG9tTm9ybWFsPXJtLHQucmFuZG9tTG9nTm9ybWFsPWltLHQucmFuZG9tQmF0ZXM9dW0sdC5yYW5kb21JcndpbkhhbGw9b20sdC5yYW5kb21FeHBvbmVudGlhbD1hbSx0LnJlcXVlc3Q9Y20sdC5odG1sPWZtLHQuanNvbj1sbSx0LnRleHQ9aG0sdC54bWw9cG0sdC5jc3Y9dm0sdC50c3Y9X20sdC5zY2FsZUJhbmQ9dnUsdC5zY2FsZVBvaW50PXl1LHQuc2NhbGVJZGVudGl0eT1TdSx0LnNjYWxlTGluZWFyPWt1LHQuc2NhbGVMb2c9cXUsdC5zY2FsZU9yZGluYWw9ZHUsdC5zY2FsZUltcGxpY2l0PXhtLHQuc2NhbGVQb3c9VXUsdC5zY2FsZVNxcnQ9RHUsdC5zY2FsZVF1YW50aWxlPU91LHQuc2NhbGVRdWFudGl6ZT1GdSx0LnNjYWxlVGhyZXNob2xkPUl1LHQuc2NhbGVUaW1lPVZ4LHQuc2NhbGVVdGM9V3gsdC5zY2hlbWVDYXRlZ29yeTEwPVp4LHQuc2NoZW1lQ2F0ZWdvcnkyMGI9R3gsdC5zY2hlbWVDYXRlZ29yeTIwYz1KeCx0LnNjaGVtZUNhdGVnb3J5MjA9UXgsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9S3gsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9cmIsdC5pbnRlcnBvbGF0ZVdhcm09dGIsdC5pbnRlcnBvbGF0ZUNvb2w9bmIsdC5pbnRlcnBvbGF0ZVZpcmlkaXM9aWIsdC5pbnRlcnBvbGF0ZU1hZ21hPW9iLHQuaW50ZXJwb2xhdGVJbmZlcm5vPXViLHQuaW50ZXJwb2xhdGVQbGFzbWE9YWIsdC5zY2FsZVNlcXVlbnRpYWw9JGEsdC5jcmVhdG9yPXhmLHQubG9jYWw9eCx0Lm1hdGNoZXI9TmYsdC5tb3VzZT16Zix0Lm5hbWVzcGFjZT1tZix0Lm5hbWVzcGFjZXM9Z2YsdC5zZWxlY3Q9cGwsdC5zZWxlY3RBbGw9ZGwsdC5zZWxlY3Rpb249ZHQsdC5zZWxlY3Rvcj1QZix0LnNlbGVjdG9yQWxsPXFmLHQudG91Y2g9dmwsdC50b3VjaGVzPV9sLHQud2luZG93PUtmLHQuY3VzdG9tRXZlbnQ9Uyx0LmFyYz1wYix0LmFyZWE9X2IsdC5saW5lPXZiLHQucGllPW1iLHQucmFkaWFsQXJlYT13Yix0LnJhZGlhbExpbmU9YmIsdC5zeW1ib2w9QmIsdC5zeW1ib2xzPVliLHQuc3ltYm9sQ2lyY2xlPU1iLHQuc3ltYm9sQ3Jvc3M9VGIsdC5zeW1ib2xEaWFtb25kPVNiLHQuc3ltYm9sU3F1YXJlPVJiLHQuc3ltYm9sU3Rhcj1QYix0LnN5bWJvbFRyaWFuZ2xlPUxiLHQuc3ltYm9sV3llPUliLHQuY3VydmVCYXNpc0Nsb3NlZD1YYix0LmN1cnZlQmFzaXNPcGVuPVZiLHQuY3VydmVCYXNpcz1IYix0LmN1cnZlQnVuZGxlPVdiLHQuY3VydmVDYXJkaW5hbENsb3NlZD1aYix0LmN1cnZlQ2FyZGluYWxPcGVuPUdiLHQuY3VydmVDYXJkaW5hbD0kYix0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1RYix0LmN1cnZlQ2F0bXVsbFJvbU9wZW49S2IsdC5jdXJ2ZUNhdG11bGxSb209SmIsdC5jdXJ2ZUxpbmVhckNsb3NlZD10dyx0LmN1cnZlTGluZWFyPWRiLHQuY3VydmVNb25vdG9uZVg9Q2MsdC5jdXJ2ZU1vbm90b25lWT16Yyx0LmN1cnZlTmF0dXJhbD1udyx0LmN1cnZlU3RlcD1ldyx0LmN1cnZlU3RlcEFmdGVyPVVjLHQuY3VydmVTdGVwQmVmb3JlPUxjLHQuc3RhY2s9dXcsdC5zdGFja09mZnNldEV4cGFuZD1hdyx0LnN0YWNrT2Zmc2V0Tm9uZT1pdyx0LnN0YWNrT2Zmc2V0U2lsaG91ZXR0ZT1jdyx0LnN0YWNrT2Zmc2V0V2lnZ2xlPXN3LHQuc3RhY2tPcmRlckFzY2VuZGluZz1mdyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWx3LHQuc3RhY2tPcmRlckluc2lkZU91dD1odyx0LnN0YWNrT3JkZXJOb25lPW93LHQuc3RhY2tPcmRlclJldmVyc2U9cHcsdC50aW1lSW50ZXJ2YWw9WXUsdC50aW1lTWlsbGlzZWNvbmQ9RW0sdC50aW1lTWlsbGlzZWNvbmRzPUFtLHQudXRjTWlsbGlzZWNvbmQ9RW0sdC51dGNNaWxsaXNlY29uZHM9QW0sdC50aW1lU2Vjb25kPUxtLHQudGltZVNlY29uZHM9VW0sdC51dGNTZWNvbmQ9TG0sdC51dGNTZWNvbmRzPVVtLHQudGltZU1pbnV0ZT1EbSx0LnRpbWVNaW51dGVzPU9tLHQudGltZUhvdXI9Rm0sdC50aW1lSG91cnM9SW0sdC50aW1lRGF5PVltLHQudGltZURheXM9Qm0sdC50aW1lV2Vlaz1qbSx0LnRpbWVXZWVrcz1HbSx0LnRpbWVTdW5kYXk9am0sdC50aW1lU3VuZGF5cz1HbSx0LnRpbWVNb25kYXk9SG0sdC50aW1lTW9uZGF5cz1KbSx0LnRpbWVUdWVzZGF5PVhtLHQudGltZVR1ZXNkYXlzPVFtLHQudGltZVdlZG5lc2RheT1WbSx0LnRpbWVXZWRuZXNkYXlzPUttLHQudGltZVRodXJzZGF5PVdtLHQudGltZVRodXJzZGF5cz10eCx0LnRpbWVGcmlkYXk9JG0sdC50aW1lRnJpZGF5cz1ueCx0LnRpbWVTYXR1cmRheT1abSx0LnRpbWVTYXR1cmRheXM9ZXgsdC50aW1lTW9udGg9cngsdC50aW1lTW9udGhzPWl4LHQudGltZVllYXI9b3gsdC50aW1lWWVhcnM9dXgsdC51dGNNaW51dGU9YXgsdC51dGNNaW51dGVzPWN4LHQudXRjSG91cj1zeCx0LnV0Y0hvdXJzPWZ4LHQudXRjRGF5PWx4LHQudXRjRGF5cz1oeCx0LnV0Y1dlZWs9cHgsdC51dGNXZWVrcz14eCx0LnV0Y1N1bmRheT1weCx0LnV0Y1N1bmRheXM9eHgsdC51dGNNb25kYXk9ZHgsdC51dGNNb25kYXlzPWJ4LHQudXRjVHVlc2RheT12eCx0LnV0Y1R1ZXNkYXlzPXd4LHQudXRjV2VkbmVzZGF5PV94LHQudXRjV2VkbmVzZGF5cz1NeCx0LnV0Y1RodXJzZGF5PXl4LHQudXRjVGh1cnNkYXlzPVR4LHQudXRjRnJpZGF5PWd4LHQudXRjRnJpZGF5cz1OeCx0LnV0Y1NhdHVyZGF5PW14LHQudXRjU2F0dXJkYXlzPWt4LHQudXRjTW9udGg9U3gsdC51dGNNb250aHM9RXgsdC51dGNZZWFyPUF4LHQudXRjWWVhcnM9engsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1ZYSx0LnRpbWVGb3JtYXRMb2NhbGU9V3UsdC5pc29Gb3JtYXQ9RHgsdC5pc29QYXJzZT1PeCx0Lm5vdz1wbix0LnRpbWVyPV9uLHQudGltZXJGbHVzaD15bix0LnRpbWVvdXQ9V2gsdC5pbnRlcnZhbD0kaCx0LnRyYW5zaXRpb249S24sdC5hY3RpdmU9cmQsdC5pbnRlcnJ1cHQ9b3AsdC52b3Jvbm9pPVR3LHQuem9vbT1Fdyx0Lnpvb21UcmFuc2Zvcm09bXMsdC56b29tSWRlbnRpdHk9a3csT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogImZvcmNlTmV0d29yayIsCgogIHR5cGU6ICJvdXRwdXQiLAoKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewoKICAgIGQzLnNlbGVjdChlbCkuYXBwZW5kKCJzdmciKQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIHJldHVybiBkMy5mb3JjZVNpbXVsYXRpb24oKTsKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBmb3JjZSkgewoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIGZvcmNlLmZvcmNlKCJjZW50ZXIiLCBkMy5mb3JjZUNlbnRlcih3aWR0aCAvIDIsIGhlaWdodCAvIDIpKQogICAgICAgIC5yZXN0YXJ0KCk7CiAgfSwKCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBmb3JjZSkgewoKICAvLyBDb21wdXRlIHRoZSBub2RlIHJhZGl1cyAgdXNpbmcgdGhlIGphdmFzY3JpcHQgbWF0aCBleHByZXNzaW9uIHNwZWNpZmllZAogICAgZnVuY3Rpb24gbm9kZVNpemUoZCkgewogICAgICAgICAgICBpZihvcHRpb25zLm5vZGVzaXplKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChvcHRpb25zLnJhZGl1c0NhbGN1bGF0aW9uKTsKCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHJldHVybiA2fQoKICAgIH0KCgogICAgLy8gYWxpYXMgb3B0aW9ucwogICAgdmFyIG9wdGlvbnMgPSB4Lm9wdGlvbnM7CgogICAgLy8gY29udmVydCBsaW5rcyBhbmQgbm9kZXMgZGF0YSBmcmFtZXMgdG8gZDMgZnJpZW5kbHkgZm9ybWF0CiAgICB2YXIgbGlua3MgPSBIVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzKHgubGlua3MpOwogICAgdmFyIG5vZGVzID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyh4Lm5vZGVzKTsKCiAgICAvLyBjcmVhdGUgbGlua2VkQnlJbmRleCB0byBxdWlja2x5IHNlYXJjaCBmb3Igbm9kZSBuZWlnaGJvcnMKICAgIC8vIGFkYXB0ZWQgZnJvbTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODc4MDI3Ny80Mzg5NzYzCiAgICB2YXIgbGlua2VkQnlJbmRleCA9IHt9OwogICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgIGxpbmtlZEJ5SW5kZXhbZC5zb3VyY2UgKyAiLCIgKyBkLnRhcmdldF0gPSAxOwogICAgICBsaW5rZWRCeUluZGV4W2QudGFyZ2V0ICsgIiwiICsgZC5zb3VyY2VdID0gMTsKICAgIH0pOwogICAgZnVuY3Rpb24gbmVpZ2hib3JpbmcoYSwgYikgewogICAgICByZXR1cm4gbGlua2VkQnlJbmRleFthLmluZGV4ICsgIiwiICsgYi5pbmRleF07CiAgICB9CgogICAgLy8gZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0CiAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDsKICAgIHZhciBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7CgogICAgdmFyIGNvbG9yID0gZXZhbChvcHRpb25zLmNvbG91clNjYWxlKTsKCiAgICAvLyBzZXQgdGhpcyB1cCBldmVuIGlmIHpvb20gPSBGCiAgICB2YXIgem9vbSA9IGQzLnpvb20oKTsKCiAgICAvLyBjcmVhdGUgZDMgZm9yY2UgbGF5b3V0CiAgICBmb3JjZQogICAgICAubm9kZXMoZDMudmFsdWVzKG5vZGVzKSkKICAgICAgLmZvcmNlKCJsaW5rIiwgZDMuZm9yY2VMaW5rKGxpbmtzKS5kaXN0YW5jZShvcHRpb25zLmxpbmtEaXN0YW5jZSkpCiAgICAgIC5mb3JjZSgiY2VudGVyIiwgZDMuZm9yY2VDZW50ZXIod2lkdGggLyAyLCBoZWlnaHQgLyAyKSkKICAgICAgLmZvcmNlKCJjaGFyZ2UiLCBkMy5mb3JjZU1hbnlCb2R5KCkuc3RyZW5ndGgob3B0aW9ucy5jaGFyZ2UpKQogICAgICAub24oInRpY2siLCB0aWNrKTsKCiAgICBmb3JjZS5hbHBoYSgxKS5yZXN0YXJ0KCk7CgogICAgICB2YXIgZHJhZyA9IGQzLmRyYWcoKQogICAgICAgIC5vbigic3RhcnQiLCBkcmFnc3RhcnQpCiAgICAgICAgLm9uKCJkcmFnIiwgZHJhZ2dlZCkKICAgICAgICAub24oImVuZCIsIGRyYWdlbmRlZCkKICAgICAgZnVuY3Rpb24gZHJhZ3N0YXJ0KGQpIHsKICAgICAgICBpZiAoIWQzLmV2ZW50LmFjdGl2ZSkgZm9yY2UuYWxwaGFUYXJnZXQoMC4zKS5yZXN0YXJ0KCk7CiAgICAgICAgZC5meCA9IGQueDsKICAgICAgICBkLmZ5ID0gZC55OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRyYWdnZWQoZCkgewogICAgICAgIGQuZnggPSBkMy5ldmVudC54OwogICAgICAgIGQuZnkgPSBkMy5ldmVudC55OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRyYWdlbmRlZChkKSB7CiAgICAgICAgaWYgKCFkMy5ldmVudC5hY3RpdmUpIGZvcmNlLmFscGhhVGFyZ2V0KDApOwogICAgICAgIGQuZnggPSBudWxsOwogICAgICAgIGQuZnkgPSBudWxsOwogICAgICB9CgogICAgLy8gc2VsZWN0IHRoZSBzdmcgZWxlbWVudCBhbmQgcmVtb3ZlIGV4aXN0aW5nIGNoaWxkcmVuCiAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpOwogICAgc3ZnLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpOwogICAgLy8gYWRkIHR3byBnIGxheWVyczsgdGhlIGZpcnN0IHdpbGwgYmUgem9vbSB0YXJnZXQgaWYgem9vbSA9IFQKICAgIC8vICBmaW5lIHRvIGhhdmUgdHdvIGcgbGF5ZXJzIGV2ZW4gaWYgem9vbSA9IEYKICAgIHN2ZyA9IHN2ZwogICAgICAgIC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInpvb20tbGF5ZXIiKQogICAgICAgIC5hcHBlbmQoImciKQoKICAgIC8vIGFkZCB6b29taW5nIGlmIHJlcXVlc3RlZAogICAgaWYgKG9wdGlvbnMuem9vbSkgewogICAgICBmdW5jdGlvbiByZWRyYXcoKSB7CiAgICAgICAgZDMuc2VsZWN0KGVsKS5zZWxlY3QoIi56b29tLWxheWVyIikKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBkMy5ldmVudC50cmFuc2Zvcm0pOwogICAgICB9CiAgICAgIHpvb20ub24oInpvb20iLCByZWRyYXcpCgogICAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdCgic3ZnIikKICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAuY2FsbCh6b29tKTsKCiAgICB9IGVsc2UgewogICAgICB6b29tLm9uKCJ6b29tIiwgbnVsbCk7CiAgICB9CgogICAgLy8gZHJhdyBsaW5rcwogICAgdmFyIGxpbmsgPSBzdmcuc2VsZWN0QWxsKCIubGluayIpCiAgICAgIC5kYXRhKGxpbmtzKQogICAgICAuZW50ZXIoKS5hcHBlbmQoImxpbmUiKQogICAgICAuYXR0cigiY2xhc3MiLCAibGluayIpCiAgICAgIC5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jb2xvdXIgOyB9KQogICAgICAvLy5zdHlsZSgic3Ryb2tlIiwgb3B0aW9ucy5saW5rQ29sb3VyKQogICAgICAuc3R5bGUoIm9wYWNpdHkiLCBvcHRpb25zLm9wYWNpdHkpCiAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgZXZhbCgiKCIgKyBvcHRpb25zLmxpbmtXaWR0aCArICIpIikpCiAgICAgIC5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOwogICAgICB9KQogICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIG9wdGlvbnMub3BhY2l0eSk7CiAgICAgIH0pOwoKICAgIGlmIChvcHRpb25zLmFycm93cykgewogICAgICBsaW5rLnN0eWxlKCJtYXJrZXItZW5kIiwgIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJ1cmwoI2Fycm93LSIgKyBkLmNvbG91ciArICIpIjsgfSk7CgogICAgICB2YXIgbGlua0NvbG91cnNBcnIgPSBkMy5uZXN0KCkua2V5KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuY29sb3VyOyB9KS5lbnRyaWVzKGxpbmtzKTsKCiAgICAgIHN2Zy5hcHBlbmQoImRlZnMiKS5zZWxlY3RBbGwoIm1hcmtlciIpCiAgICAgICAgICAuZGF0YShsaW5rQ29sb3Vyc0FycikKICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgibWFya2VyIikKICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gImFycm93LSIgKyBkLmtleTsgfSkKICAgICAgICAgICAgLmF0dHIoInZpZXdCb3giLCAiMCwgLTUsIDEwLCAxMCIpCiAgICAgICAgICAgIC5hdHRyKCJyZWZYIiwgMCkKICAgICAgICAgICAgLmF0dHIoIm1hcmtlcldpZHRoIiwgNCkKICAgICAgICAgICAgLmF0dHIoIm1hcmtlckhlaWdodCIsIDQpCiAgICAgICAgICAgIC5hdHRyKCJvcmllbnQiLCAiYXV0byIpCiAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJjb250ZXh0LWZpbGwiKQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmtleTsgfSkKICAgICAgICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAgICAgLmFwcGVuZCgicGF0aCIpCiAgICAgICAgICAgIC5hdHRyKCJkIiwgIk0wLC01IEwxMCwwIEwwLDUiKTsKICAgIH0KCiAgICAvLyBkcmF3IG5vZGVzCiAgICB2YXIgbm9kZSA9IHN2Zy5zZWxlY3RBbGwoIi5ub2RlIikKICAgICAgLmRhdGEoZm9yY2Uubm9kZXMoKSkKICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikKICAgICAgLmF0dHIoImNsYXNzIiwgIm5vZGUiKQogICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjb2xvcihkLmdyb3VwKTsgfSkKICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAub24oIm1vdXNlb3ZlciIsIG1vdXNlb3ZlcikKICAgICAgLm9uKCJtb3VzZW91dCIsIG1vdXNlb3V0KQogICAgICAub24oImNsaWNrIiwgY2xpY2spCiAgICAgIC5jYWxsKGRyYWcpOwoKICAgIG5vZGUuYXBwZW5kKCJjaXJjbGUiKQogICAgICAuYXR0cigiciIsIGZ1bmN0aW9uKGQpe3JldHVybiBub2RlU2l6ZShkKTt9KQogICAgICAuc3R5bGUoInN0cm9rZSIsICIjZmZmIikKICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3B0aW9ucy5vcGFjaXR5KQogICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsICIxLjVweCIpOwoKICAgIG5vZGUuYXBwZW5kKCJzdmc6dGV4dCIpCiAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RldGV4dCIpCiAgICAgIC5hdHRyKCJkeCIsIDEyKQogICAgICAuYXR0cigiZHkiLCAiLjM1ZW0iKQogICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLm5hbWUgfSkKICAgICAgLnN0eWxlKCJmb250Iiwgb3B0aW9ucy5mb250U2l6ZSArICJweCAiICsgb3B0aW9ucy5mb250RmFtaWx5KQogICAgICAuc3R5bGUoIm9wYWNpdHkiLCBvcHRpb25zLm9wYWNpdHlOb0hvdmVyKQogICAgICAuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgIm5vbmUiKTsKCiAgICBmdW5jdGlvbiB0aWNrKCkgewogICAgICBub2RlLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICBpZihvcHRpb25zLmJvdW5kZWQpeyAvLyBhZGRzIGJvdW5kaW5nIGJveAogICAgICAgICAgICBkLnggPSBNYXRoLm1heChub2RlU2l6ZShkKSwgTWF0aC5taW4od2lkdGggLSBub2RlU2l6ZShkKSwgZC54KSk7CiAgICAgICAgICAgIGQueSA9IE1hdGgubWF4KG5vZGVTaXplKGQpLCBNYXRoLm1pbihoZWlnaHQgLSBub2RlU2l6ZShkKSwgZC55KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgZC54ICsgIiwiICsgZC55ICsgIikifSk7CgogICAgICBmdW5jdGlvbiBpZHgoZCwgdHlwZSkgewogICAgICAgIHZhciBsaW5rV2lkdGhGdW5jID0gZXZhbCgiKCIgKyBvcHRpb25zLmxpbmtXaWR0aCArICIpIik7CgkJCSAgdmFyIGEgPSBkLnRhcmdldC54IC0gZC5zb3VyY2UueDsKCQkJICB2YXIgYiA9IGQudGFyZ2V0LnkgLSBkLnNvdXJjZS55OwoJCQkgIHZhciBjID0gTWF0aC5zcXJ0KE1hdGgucG93KGEsIDIpICsgTWF0aC5wb3coYiwgMikpOwogIAkJCWlmICh0eXBlID09ICJ4MSIpIHJldHVybiAoZC5zb3VyY2UueCArICgobm9kZVNpemUoZC5zb3VyY2UpICogYSkgLyBjKSk7CiAgCQkJaWYgKHR5cGUgPT0gInkxIikgcmV0dXJuIChkLnNvdXJjZS55ICsgKChub2RlU2l6ZShkLnNvdXJjZSkgKiBiKSAvIGMpKTsKICAJCQlpZiAob3B0aW9ucy5hcnJvd3MpIHsKICAJCQkgIGlmICh0eXBlID09ICJ4MiIpIHJldHVybiAoZC50YXJnZXQueCAtICgoKCg1ICogbGlua1dpZHRoRnVuYyhkKSkgKyBub2RlU2l6ZShkLnRhcmdldCkpICogYSkgLyBjKSk7CiAgCQkJICBpZiAodHlwZSA9PSAieTIiKSByZXR1cm4gKGQudGFyZ2V0LnkgLSAoKCgoNSAqIGxpbmtXaWR0aEZ1bmMoZCkpICsgbm9kZVNpemUoZC50YXJnZXQpKSAqIGIpIC8gYykpOwogIAkJCX0gZWxzZSB7CiAgCQkJICBpZiAodHlwZSA9PSAieDIiKSByZXR1cm4gKGQudGFyZ2V0LnggLSAoKG5vZGVTaXplKGQudGFyZ2V0KSAqIGEpIC8gYykpOwogIAkJCSAgaWYgKHR5cGUgPT0gInkyIikgcmV0dXJuIChkLnRhcmdldC55IC0gKChub2RlU2l6ZShkLnRhcmdldCkgKiBiKSAvIGMpKTsKICAJCQl9CgkJICB9CgogICAgICBsaW5rCiAgICAgICAgLmF0dHIoIngxIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gaWR4KGQsICJ4MSIpOyB9KQogICAgICAgIC5hdHRyKCJ5MSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlkeChkLCAieTEiKTsgfSkKICAgICAgICAuYXR0cigieDIiLCBmdW5jdGlvbihkKSB7IHJldHVybiBpZHgoZCwgIngyIik7IH0pCiAgICAgICAgLmF0dHIoInkyIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gaWR4KGQsICJ5MiIpOyB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZW92ZXIoZCkgewogICAgICAvLyB1bmZvY3VzIG5vbi1jb25uZWN0ZWQgbGlua3MgYW5kIG5vZGVzCiAgICAgIC8vaWYgKG9wdGlvbnMuZm9jdXNPbkhvdmVyKSB7CiAgICAgICAgdmFyIHVuZm9jdXNEaXZpc29yID0gNDsKCiAgICAgICAgbGluay50cmFuc2l0aW9uKCkuZHVyYXRpb24oMjAwKQogICAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgZnVuY3Rpb24obCkgeyByZXR1cm4gZCAhPSBsLnNvdXJjZSAmJiBkICE9IGwudGFyZ2V0ID8gK29wdGlvbnMub3BhY2l0eSAvIHVuZm9jdXNEaXZpc29yIDogK29wdGlvbnMub3BhY2l0eSB9KTsKCiAgICAgICAgbm9kZS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMjAwKQogICAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgZnVuY3Rpb24obykgeyByZXR1cm4gZC5pbmRleCA9PSBvLmluZGV4IHx8IG5laWdoYm9yaW5nKGQsIG8pID8gK29wdGlvbnMub3BhY2l0eSA6ICtvcHRpb25zLm9wYWNpdHkgLyB1bmZvY3VzRGl2aXNvcjsgfSk7CiAgICAgIC8vfQoKICAgICAgZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgiY2lyY2xlIikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDc1MCkKICAgICAgICAuYXR0cigiciIsIGZ1bmN0aW9uKGQpe3JldHVybiBub2RlU2l6ZShkKSs1O30pOwogICAgICBkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDc1MCkKICAgICAgICAuYXR0cigieCIsIDEzKQogICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgIi41cHgiKQogICAgICAgIC5zdHlsZSgiZm9udCIsIG9wdGlvbnMuY2xpY2tUZXh0U2l6ZSArICJweCAiKQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlb3V0KCkgewogICAgICBub2RlLnN0eWxlKCJvcGFjaXR5IiwgK29wdGlvbnMub3BhY2l0eSk7CiAgICAgIGxpbmsuc3R5bGUoIm9wYWNpdHkiLCArb3B0aW9ucy5vcGFjaXR5KTsKCiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKQogICAgICAgIC5kdXJhdGlvbig3NTApCiAgICAgICAgLmF0dHIoInIiLCBmdW5jdGlvbihkKXtyZXR1cm4gbm9kZVNpemUoZCk7fSk7CiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInRleHQiKS50cmFuc2l0aW9uKCkKICAgICAgICAuZHVyYXRpb24oMTI1MCkKICAgICAgICAuYXR0cigieCIsIDApCiAgICAgICAgLnN0eWxlKCJmb250Iiwgb3B0aW9ucy5mb250U2l6ZSArICJweCAiKQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIG9wdGlvbnMub3BhY2l0eU5vSG92ZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaWNrKGQpIHsKICAgICAgcmV0dXJuIGV2YWwob3B0aW9ucy5jbGlja0FjdGlvbikKICAgIH0KCiAgICAvLyBhZGQgbGVnZW5kIG9wdGlvbgogICAgaWYob3B0aW9ucy5sZWdlbmQpewogICAgICAgIHZhciBsZWdlbmRSZWN0U2l6ZSA9IDE4OwogICAgICAgIHZhciBsZWdlbmRTcGFjaW5nID0gNDsKICAgICAgICB2YXIgbGVnZW5kID0gc3ZnLnNlbGVjdEFsbCgnLmxlZ2VuZCcpCiAgICAgICAgICAuZGF0YShjb2xvci5kb21haW4oKSkKICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsZWdlbmQnKQogICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgdmFyIGhlaWdodCA9IGxlZ2VuZFJlY3RTaXplICsgbGVnZW5kU3BhY2luZzsKICAgICAgICAgICAgdmFyIG9mZnNldCA9ICBoZWlnaHQgKiBjb2xvci5kb21haW4oKS5sZW5ndGggLyAyOwogICAgICAgICAgICB2YXIgaG9yeiA9IGxlZ2VuZFJlY3RTaXplOwogICAgICAgICAgICB2YXIgdmVydCA9IGkgKiBoZWlnaHQrNDsKICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGhvcnogKyAnLCcgKyB2ZXJ0ICsgJyknOwogICAgICAgICAgfSk7CgogICAgICAgIGxlZ2VuZC5hcHBlbmQoJ3JlY3QnKQogICAgICAgICAgLmF0dHIoJ3dpZHRoJywgbGVnZW5kUmVjdFNpemUpCiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgbGVnZW5kUmVjdFNpemUpCiAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjb2xvcikKICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgY29sb3IpOwoKICAgICAgICBsZWdlbmQuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgIC5hdHRyKCd4JywgbGVnZW5kUmVjdFNpemUgKyBsZWdlbmRTcGFjaW5nKQogICAgICAgICAgLmF0dHIoJ3knLCBsZWdlbmRSZWN0U2l6ZSAtIGxlZ2VuZFNwYWNpbmcpCiAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkOyB9KTsKICAgIH0KCiAgICAvLyBtYWtlIGZvbnQtZmFtaWx5IGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBlbGVtZW50cwogICAgZDMuc2VsZWN0KGVsKS5zZWxlY3RBbGwoJ3RleHQnKS5zdHlsZSgnZm9udC1mYW1pbHknLCBvcHRpb25zLmZvbnRGYW1pbHkpOwogIH0sCn0pOwo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-b0f32fb4aee0b8553583" class="forceNetwork html-widget" style="width:960px;height:500px;">

</div>
</div>
<script type="application/json" data-for="htmlwidget-b0f32fb4aee0b8553583">{"x":{"links":{"source":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170],"target":[97,97,25,25,160,160,25,25,25,25,25,97,97,97,25,97,109,109,160,160,109,97,25,25,25,25,97,97,109,109,109,97,97,25,25,97,25,25,25,25,25,25,25,97,25,25,25,160,97,97,97,97,25,25,25,97,97,97,97,25,160,160,109,109,25,25,25,109,160,97,97,160,25,97,97,25,25,97,97,25,25,160,25,97,160,25,25,25,97,25,97,97,97,25,97,97,25,25,25,160,160,160,97,25,109,97,97,97,97,25,160,160,97,97,25,109,109,25,109,25,25,97,25,160,97,97,97,25,160,160,160,97,160,160,25,25,25,25,109,25,97,97,160,160,160,109,109,25,97,97,97,97,25,97,160,160,160,160,25,97,25,109,97,97,97,97,25],"value":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"colour":["#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666"]},"nodes":{"name":[".net",".net developer","accountant","accounting","actuarial","actuary","administrative assistant","amazon","analyst","analytics","analytics manager","android developer","artificial intelligence","aws","bi developer","big data","bioinformatics","biology","biostatistician","biostatistics","biotech","blockchain","business analyst","business analytics","business intelligence","Business Intelligence","business intelligence analyst","c#","c++","chemical engineer","chemist","chemistry","computer science","computer vision","consultant","customer service","cyber security","data","data analysis","data analyst","data analyst entry level","data analyst intern","data analytics","data architect","data engineer","data entry","data intern","data management","data mining","data modeler","data science","data science entry level","data science intern","data visualization","database","database administrator","deep learning","developer","devops","devops engineer","digital marketing","economics","economist","electrical engineer","engineer","entry level","entry level analyst","entry level data analyst","environmental","epidemiology","etl","etl developer","finance","financial analyst","front end developer","full stack developer","full time","gis","google","hadoop","healthcare","healthcare data analyst","hedge fund","human resources","ibm","industrial engineer","information technology","intern","internship","ios developer","it","java","java developer","javascript","junior data analyst","machine learning","machine learning engineer","Machine Learning Engineer","manager","marketing","marketing analyst","math","mathematician","mathematics","matlab","mba","mechanical engineer","microsoft","natural language processing","Natural Scientist","network engineer","nlp","non profit","operations research","operations research analyst","oracle","oracle dba","part time","phd","physics","predictive analytics","process engineer","product manager","program manager","programmer","project manager","public health","python","python developer","qa","quality assurance","quant","quantitative","quantitative analyst","r","r programmer","r programming","remote","research","research analyst","research assistant","research scientist","sales","salesforce","sap","sas","sas data analyst","sas programmer","science","scientist","senior data analyst","software","software developer","software engineer","spark","sql","sql developer","statistical analyst","statistical programmer","statistician","Statistician","statistics","supply chain","systems engineer","tableau","teacher","tensorflow","usa","usa today","web developer","work from home"],"group":
[1,1,3,3,2,2,3,3,3,3,
 3,1,1,1,3,1,4,4,2,2,
 4,1,3,3,3,3,3,1,1,4,
 4,4,1,1,3,3,1,3,3,3,
 3,3,3,3,1,3,3,3,2,1,
 1,1,1,3,3,3,1,1,1,1,
 3,2,2,4,4,3,3,3,4,2,
 1,1,2,3,1,1,3,3,1,1,
 3,3,2,3,1,2,3,3,3,1,
 3,1,1,1,3,1,1,1,3,3,
 3,2,2,2,1,3,4,1,1,4,
 1,1,3,2,2,1,1,3,4,4,
 3,4,3,3,1,3,2,1,1,1,
 3,2,2,2,1,2,2,3,3,3,
 3,4,3,1,1,2,2,2,4,4,
 3,1,1,1,1,3,1,2,2,2,
 2,2,3,1,3,4,1,1,1,1,3],"nodesize":[8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]},"options":{"NodeID":"name","Group":"group","colourScale":"d3.scaleOrdinal(['#4C6576','#2488CF','#FD7F28','#329F34'])","fontSize":7,"fontFamily":"sans-serif","clickTextSize":17.5,"linkDistance":50,"linkWidth":"'0.75px'.toString()","charge":-3,"opacity":0.6,"zoom":true,"legend":false,"arrows":false,"nodesize":true,"radiusCalculation":"d.nodesize","bounded":true,"opacityNoHover":1,"clickAction":null}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-b0f32fb4aee0b8553583">{"viewer":{"width":450,"height":350,"padding":0,"fill":true},"browser":{"width":960,"height":500,"padding":0,"fill":true}}</script>
</body>
</html>
            
          
!
999px
🕑 One or more of the npm packages you are using needs to be built. You're the first person to ever need it! We're building it right now and your preview will start updating again when it's ready.

Console